From 7a7b8e4878bd5b698ecf04f5d9c6f2b1b9dc426d Mon Sep 17 00:00:00 2001 From: Ben Pfaff Date: Wed, 15 Oct 2008 14:34:14 -0700 Subject: [PATCH] New functions ds_put_uninit(), ds_put_char_multiple(). --- include/dynamic-string.h | 2 ++ lib/dynamic-string.c | 28 ++++++++++++++++++++++------ 2 files changed, 24 insertions(+), 6 deletions(-) diff --git a/include/dynamic-string.h b/include/dynamic-string.h index 7a25b0705..7bd58cba2 100644 --- a/include/dynamic-string.h +++ b/include/dynamic-string.h @@ -54,7 +54,9 @@ void ds_init(struct ds *); void ds_clear(struct ds *); void ds_truncate(struct ds *, size_t new_length); void ds_reserve(struct ds *, size_t min_length); +char *ds_put_uninit(struct ds *, size_t n); void ds_put_char(struct ds *, char); +void ds_put_char_multiple(struct ds *, char, size_t n); void ds_put_cstr(struct ds *, const char *); void ds_put_format(struct ds *, const char *, ...) PRINTF_FORMAT(2, 3); void ds_put_format_valist(struct ds *, const char *, va_list) diff --git a/lib/dynamic-string.c b/lib/dynamic-string.c index 3193d438f..f67a63f33 100644 --- a/lib/dynamic-string.c +++ b/lib/dynamic-string.c @@ -37,6 +37,7 @@ #include #include #include +#include "timeval.h" #include "util.h" void @@ -72,21 +73,32 @@ ds_reserve(struct ds *ds, size_t min_length) } } +char * +ds_put_uninit(struct ds *ds, size_t n) +{ + ds_reserve(ds, ds->length + n); + ds->length += n; + ds->string[ds->length] = '\0'; + return &ds->string[ds->length - n]; +} + void ds_put_char(struct ds *ds, char c) { - ds_reserve(ds, ds->length + 1); - ds->string[ds->length++] = c; - ds->string[ds->length] = '\0'; + *ds_put_uninit(ds, 1) = c; +} + +void +ds_put_char_multiple(struct ds *ds, char c, size_t n) +{ + memset(ds_put_uninit(ds, n), ' ', n); } void ds_put_cstr(struct ds *ds, const char *s) { size_t s_len = strlen(s); - ds_reserve(ds, ds->length + s_len); - memcpy(&ds->string[ds->length], s, s_len + 1); - ds->length += s_len; + memcpy(ds_put_uninit(ds, s_len), s, s_len); } void @@ -145,6 +157,10 @@ 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) { + if (!tm) { + time_t now = time_now(); + tm = localtime(&now); + } for (;;) { size_t avail = ds->string ? ds->allocated - ds->length + 1 : 0; size_t used = strftime(&ds->string[ds->length], avail, template, tm); -- 2.45.2