X-Git-Url: https://pintos-os.org/cgi-bin/gitweb.cgi?a=blobdiff_plain;f=src%2Flibpspp%2Fstr.c;h=655774d63d57c8e1b9b146b9d513edc8abe2a387;hb=74fc00cc0eb769ab61141d290490037ba040f63a;hp=c72f19969ec8f1090f958e39c36a276f6b5b1f8f;hpb=8444d8d47de5e5f8d076b6f43f73c2c29494031e;p=pspp-builds.git diff --git a/src/libpspp/str.c b/src/libpspp/str.c index c72f1996..655774d6 100644 --- a/src/libpspp/str.c +++ b/src/libpspp/str.c @@ -18,13 +18,16 @@ 02110-1301, USA. */ #include + #include "str.h" -#include "message.h" + #include #include #include -#include "alloc.h" -#include "message.h" + +#include +#include + #include "minmax.h" #include "size_max.h" @@ -233,6 +236,21 @@ str_lowercase (char *s) for (; *s != '\0'; s++) *s = tolower ((unsigned char) *s); } + +/* Formats FORMAT into DST, as with sprintf(), and returns the + address of the terminating null written to DST. */ +char * +spprintf (char *dst, const char *format, ...) +{ + va_list args; + int count; + + va_start (args, format); + count = vsprintf (dst, format, args); + va_end (args); + + return dst + count; +} /* Initializes ST with initial contents S. */ void @@ -244,13 +262,13 @@ ds_create (struct string *st, const char *s) strcpy (st->string, s); } -/* Initializes ST, making room for at least CAPACITY characters. */ +/* Initializes ST as an empty string. */ void -ds_init (struct string *st, size_t capacity) +ds_init (struct string *st) { st->length = 0; - st->capacity = MAX (8, capacity); - st->string = xmalloc (st->capacity + 1); + st->capacity = 0; + st->string = NULL; } /* Frees ST. */ @@ -282,7 +300,7 @@ ds_init_substring (struct string *dst, const struct string *src, size_t idx, size_t cnt) { assert (dst != src); - ds_init (dst, cnt); + ds_init (dst); ds_assign_substring (dst, src, idx, cnt); } @@ -681,6 +699,21 @@ ds_concat (struct string *st, const char *buf, size_t len) st->length += len; } +/* Returns ds_end(ST) and THEN increases the length by INCR. */ +char * +ds_append_uninit(struct string *st, size_t incr) +{ + char *end; + + ds_extend(st, ds_length(st) + incr); + + end = ds_end(st); + + st->length += incr; + + return end; +} + /* Formats FORMAT as a printf string and appends the result to ST. */ void ds_printf (struct string *st, const char *format, ...) @@ -699,12 +732,8 @@ ds_vprintf (struct string *st, const char *format, va_list args_) int avail, needed; va_list args; -#ifndef va_copy -#define va_copy(DST, SRC) (DST) = (SRC) -#endif - va_copy (args, args_); - avail = st->capacity - st->length + 1; + avail = st->string != NULL ? st->capacity - st->length + 1 : 0; needed = vsnprintf (st->string + st->length, avail, format, args); va_end (args);