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)
#include <stdlib.h>
#include <string.h>
#include <time.h>
+#include "timeval.h"
#include "util.h"
void
}
}
+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
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);