X-Git-Url: https://pintos-os.org/cgi-bin/gitweb.cgi?a=blobdiff_plain;f=src%2Flibpspp%2Fstr.c;h=57386cbfc4f89e554a8a4a0e7d5e4303a022ccbf;hb=56e6166660c0f1388cad4cb4d3189e026bc84dd5;hp=5aa7e41594e9ab989ac7a77dcafe6d8802e49fa8;hpb=6e097c89af440da90b43ce90864394c4d0c843d5;p=pspp diff --git a/src/libpspp/str.c b/src/libpspp/str.c index 5aa7e41594..57386cbfc4 100644 --- a/src/libpspp/str.c +++ b/src/libpspp/str.c @@ -691,6 +691,14 @@ ss_last (struct substring ss) return ss.length > 0 ? (unsigned char) ss.string[ss.length - 1] : EOF; } +/* Returns true if SS starts with PREFIX, false otherwise. */ +bool +ss_starts_with (struct substring ss, struct substring prefix) +{ + return (ss.length >= prefix.length + && !memcmp (ss.string, prefix.string, prefix.length)); +} + /* Returns true if SS ends with SUFFIX, false otherwise. */ bool ss_ends_with (struct substring ss, struct substring suffix) @@ -733,6 +741,16 @@ ss_find_byte (struct substring ss, char c) return p != NULL ? p - ss.string : SIZE_MAX; } +/* Returns the offset in HAYSTACK of the first instance of NEEDLE, + or SIZE_MAX if NEEDLE does not occur in HAYSTACK. */ +size_t +ss_find_substring (struct substring haystack, struct substring needle) +{ + const char *p = memmem (haystack.string, haystack.length, + needle.string, needle.length); + return p != NULL ? p - haystack.string : SIZE_MAX; +} + /* Compares A and B and returns a strcmp()-type comparison result. */ int @@ -1522,25 +1540,22 @@ ds_put_c_format (struct string *st, const char *format, ...) va_end (args); } - -/* Formats FORMAT as a printf string, using fmt_func (a snprintf like function) - and appends the result to ST. */ -static void -ds_put_vformat_int (struct string *st, const char *format, va_list args_, - int (*fmt_func) (char *, size_t, const char *, va_list)) +/* Formats FORMAT as a printf string and appends the result to ST. */ +void +ds_put_vformat (struct string *st, const char *format, va_list args_) { int avail, needed; va_list args; va_copy (args, args_); avail = st->ss.string != NULL ? st->capacity - st->ss.length + 1 : 0; - needed = fmt_func (st->ss.string + st->ss.length, avail, format, args); + needed = vsnprintf (st->ss.string + st->ss.length, avail, format, args); va_end (args); if (needed >= avail) { va_copy (args, args_); - fmt_func (ds_put_uninit (st, needed), needed + 1, format, args); + vsnprintf (ds_put_uninit (st, needed), needed + 1, format, args); va_end (args); } else @@ -1553,34 +1568,27 @@ ds_put_vformat_int (struct string *st, const char *format, va_list args_, avail = st->capacity - st->ss.length + 1; va_copy (args, args_); - needed = fmt_func (ds_end (st), avail, format, args); + needed = vsnprintf (ds_end (st), avail, format, args); va_end (args); } st->ss.length += needed; } } - -static int -vasnwrapper (char *str, size_t size, const char *format, va_list ap) -{ - c_vasnprintf (str, &size, format, ap); - return size; -} - -/* Formats FORMAT as a printf string and appends the result to ST. */ -void -ds_put_vformat (struct string *st, const char *format, va_list args_) -{ - ds_put_vformat_int (st, format, args_, vsnprintf); -} - /* Formats FORMAT as a printf string, as if in the C locale, and appends the result to ST. */ void -ds_put_c_vformat (struct string *st, const char *format, va_list args_) +ds_put_c_vformat (struct string *st, const char *format, va_list args) { - ds_put_vformat_int (st, format, args_, vasnwrapper); + char buf[128]; + size_t len = sizeof buf; + char *output = c_vasnprintf (buf, &len, format, args); + if (output) + { + ds_put_cstr (st, output); + if (output != buf) + free (output); + } } /* Appends byte CH to ST. */