X-Git-Url: http://git.ozlabs.org/?p=ccan;a=blobdiff_plain;f=ccan%2Ftal%2Fstr%2Fstr.c;h=b00775ab70fc4d652e8739027dc99d813a28d2c9;hp=15aa0c046883633d956eb8abbf50c48e9e362c5e;hb=38ec541c4fd76d971a4959e31cd2a9ff113237ca;hpb=e7ae27d64226dda9865f1e4b5d9a55adcee04694 diff --git a/ccan/tal/str/str.c b/ccan/tal/str/str.c index 15aa0c04..b00775ab 100644 --- a/ccan/tal/str/str.c +++ b/ccan/tal/str/str.c @@ -11,42 +11,37 @@ #include #include #include -#include -#include -char *tal_strdup(const tal_t *ctx, const char *p) +char *tal_strdup_(const tal_t *ctx, const char *p, const char *label) { /* We have to let through NULL for take(). */ - return tal_dup_(ctx, p, 1, p ? strlen(p) + 1: 1, 0, false, - TAL_LABEL(char, "[]")); + return tal_dup_arr_label(ctx, char, p, p ? strlen(p) + 1: 1, 0, label); } -char *tal_strndup(const tal_t *ctx, const char *p, size_t n) +char *tal_strndup_(const tal_t *ctx, const char *p, size_t n, const char *label) { size_t len; char *ret; /* We have to let through NULL for take(). */ - if (likely(p)) { - len = strlen(p); - if (len > n) - len = n; - } else + if (likely(p)) + len = strnlen(p, n); + else len = n; - ret = tal_dup_(ctx, p, 1, len, 1, false, TAL_LABEL(char, "[]")); + ret = tal_dup_arr_label(ctx, char, p, len, 1, label); if (ret) ret[len] = '\0'; return ret; } -char *tal_fmt(const tal_t *ctx, const char *fmt, ...) +char *tal_fmt_(const tal_t *ctx, const char *label, const char *fmt, ...) { va_list ap; char *ret; va_start(ap, fmt); - ret = tal_vfmt(ctx, fmt, ap); + ret = tal_vfmt_(ctx, fmt, ap, label); va_end(ap); return ret; @@ -55,7 +50,7 @@ char *tal_fmt(const tal_t *ctx, const char *fmt, ...) static bool do_vfmt(char **buf, size_t off, const char *fmt, va_list ap) { /* A decent guess to start. */ - size_t max = strlen(fmt) * 2; + size_t max = strlen(fmt) * 2 + 1; bool ok; for (;;) { @@ -83,7 +78,7 @@ static bool do_vfmt(char **buf, size_t off, const char *fmt, va_list ap) return ok; } -char *tal_vfmt(const tal_t *ctx, const char *fmt, va_list ap) +char *tal_vfmt_(const tal_t *ctx, const char *fmt, va_list ap, const char *label) { char *buf; @@ -91,7 +86,7 @@ char *tal_vfmt(const tal_t *ctx, const char *fmt, va_list ap) return NULL; /* A decent guess to start. */ - buf = tal_arr(ctx, char, strlen(fmt) * 2); + buf = tal_arr_label(ctx, char, strlen(fmt) * 2, label); if (!do_vfmt(&buf, 0, fmt, ap)) buf = tal_free(buf); return buf; @@ -117,7 +112,8 @@ bool tal_append_fmt(char **baseptr, const char *fmt, ...) return ret; } -char *tal_strcat(const tal_t *ctx, const char *s1, const char *s2) +char *tal_strcat_(const tal_t *ctx, const char *s1, const char *s2, + const char *label) { size_t len1, len2; char *ret; @@ -131,9 +127,7 @@ char *tal_strcat(const tal_t *ctx, const char *s1, const char *s2) len1 = s1 ? strlen(s1) : 0; len2 = strlen(s2); - /* We use tal_dup_ here to avoid attaching a length property. */ - ret = tal_dup_(ctx, s1, 1, len1, len2 + 1, false, - TAL_LABEL(char, "[]")); + ret = tal_dup_arr_label(ctx, char, s1, len1, len2 + 1, label); if (likely(ret)) memcpy(ret + len1, s2, len2 + 1); @@ -142,8 +136,9 @@ char *tal_strcat(const tal_t *ctx, const char *s1, const char *s2) return ret; } -char **tal_strsplit(const tal_t *ctx, - const char *string, const char *delims, enum strsplit flags) +char **tal_strsplit_(const tal_t *ctx, + const char *string, const char *delims, enum strsplit flags, + const char *label) { char **parts, *str; size_t max = 64, num = 0; @@ -194,8 +189,9 @@ fail: return NULL; } -char *tal_strjoin(const tal_t *ctx, - char *strings[], const char *delim, enum strjoin flags) +char *tal_strjoin_(const tal_t *ctx, + char *strings[], const char *delim, enum strjoin flags, + const char *label) { unsigned int i; char *ret = NULL; @@ -208,7 +204,7 @@ char *tal_strjoin(const tal_t *ctx, goto fail; dlen = strlen(delim); - ret = tal_arr(ctx, char, dlen*2+1); + ret = tal_arr_label(ctx, char, dlen*2+1, label); if (!ret) goto fail; @@ -237,9 +233,32 @@ fail: goto out; } -bool tal_strreg(const tal_t *ctx, const char *string, const char *regex, ...) +static size_t count_open_braces(const char *string) { - size_t nmatch = 1 + strcount(regex, "("); +#if 1 + size_t num = 0, esc = 0; + + while (*string) { + if (*string == '\\') + esc++; + else { + /* An odd number of \ means it's escaped. */ + if (*string == '(' && (esc & 1) == 0) + num++; + esc = 0; + } + string++; + } + return num; +#else + return strcount(string, "("); +#endif +} + +bool tal_strreg_(const tal_t *ctx, const char *string, const char *label, + const char *regex, ...) +{ + size_t nmatch = 1 + count_open_braces(regex); regmatch_t matches[nmatch]; regex_t r; bool ret = false; @@ -267,10 +286,11 @@ bool tal_strreg(const tal_t *ctx, const char *string, const char *regex, ...) if (matches[i].rm_so == -1) *arg = NULL; else { - *arg = tal_strndup(ctx, - string + matches[i].rm_so, - matches[i].rm_eo - - matches[i].rm_so); + *arg = tal_strndup_(ctx, + string + matches[i].rm_so, + matches[i].rm_eo + - matches[i].rm_so, + label); /* FIXME: If we fail, we set some and leak! */ if (!*arg) { ret = false;