From 2667dfda01f5c247dc7619c9b627e979c265eacb Mon Sep 17 00:00:00 2001 From: Ben Pfaff Date: Tue, 19 Aug 2008 13:57:55 -0700 Subject: [PATCH] New functions ds_put_strftime(), ds_chomp(). --- include/compiler.h | 1 + include/dynamic-string.h | 5 +++++ lib/dynamic-string.c | 23 +++++++++++++++++++++++ 3 files changed, 29 insertions(+) diff --git a/include/compiler.h b/include/compiler.h index d3ea61719..2e185bfa8 100644 --- a/include/compiler.h +++ b/include/compiler.h @@ -38,6 +38,7 @@ #define UNUSED __attribute__((__unused__)) #define PACKED __attribute__((__packed__)) #define PRINTF_FORMAT(FMT, ARG1) __attribute__((__format__(printf, FMT, ARG1))) +#define STRFTIME_FORMAT(FMT) __attribute__((__format__(__strftime__, FMT, 0))) #define likely(x) __builtin_expect((x),1) #define unlikely(x) __builtin_expect((x),0) diff --git a/include/dynamic-string.h b/include/dynamic-string.h index 7c1b04668..7a25b0705 100644 --- a/include/dynamic-string.h +++ b/include/dynamic-string.h @@ -40,6 +40,8 @@ #include #include "compiler.h" +struct tm; + struct ds { char *string; /* Null-terminated string. */ size_t length; /* Bytes used, not including null terminator. */ @@ -58,11 +60,14 @@ void ds_put_format(struct ds *, const char *, ...) PRINTF_FORMAT(2, 3); void ds_put_format_valist(struct ds *, const char *, va_list) PRINTF_FORMAT(2, 0); void ds_put_printable(struct ds *, const char *, size_t); +void ds_put_strftime(struct ds *, const char *, const struct tm *) + STRFTIME_FORMAT(2); void ds_put_hex_dump(struct ds *ds, const void *buf_, size_t size, uintptr_t ofs, bool ascii); char *ds_cstr(struct ds *); void ds_destroy(struct ds *); int ds_last(const struct ds *); +void ds_chomp(struct ds *, int c); #endif /* dynamic-string.h */ diff --git a/lib/dynamic-string.c b/lib/dynamic-string.c index 4b836819f..3193d438f 100644 --- a/lib/dynamic-string.c +++ b/lib/dynamic-string.c @@ -36,6 +36,7 @@ #include #include #include +#include #include "util.h" void @@ -141,6 +142,20 @@ ds_put_printable(struct ds *ds, const char *s, size_t n) } } +void +ds_put_strftime(struct ds *ds, const char *template, const struct tm *tm) +{ + for (;;) { + size_t avail = ds->string ? ds->allocated - ds->length + 1 : 0; + size_t used = strftime(&ds->string[ds->length], avail, template, tm); + if (used) { + ds->length += used; + return; + } + ds_reserve(ds, ds->length + (avail < 32 ? 64 : 2 * avail)); + } +} + char * ds_cstr(struct ds *ds) { @@ -215,3 +230,11 @@ ds_last(const struct ds *ds) { return ds->length > 0 ? (unsigned char) ds->string[ds->length - 1] : EOF; } + +void +ds_chomp(struct ds *ds, int c) +{ + if (ds->length > 0 && ds->string[ds->length - 1] == (char) c) { + ds->string[--ds->length] = '\0'; + } +} -- 2.43.0