X-Git-Url: http://git.ozlabs.org/?p=ccan;a=blobdiff_plain;f=ccan%2Ftal%2Fstr%2Fstr.c;fp=ccan%2Ftal%2Fstr%2Fstr.c;h=b7df54c42af704eee6e1fbd9d941205ec54a2235;hp=cafb04bb50a7d2a78aea39113b1d32fec32334d8;hb=5582b011948769779b0d839d35873c2bc557f9cb;hpb=15ed4f453713f1a7bdeec22b53704819fa3d447f diff --git a/ccan/tal/str/str.c b/ccan/tal/str/str.c index cafb04bb..b7df54c4 100644 --- a/ccan/tal/str/str.c +++ b/ccan/tal/str/str.c @@ -9,10 +9,78 @@ #include #include #include +#include #include #include #include +char *tal_strdup(const tal_t *ctx, const char *p) +{ + /* We have to let through NULL for take(). */ + return tal_dup_(ctx, p, 1, p ? strlen(p) + 1: 1, 0, false, + TAL_LABEL(char, "[]")); +} + +char *tal_strndup(const tal_t *ctx, const char *p, size_t n) +{ + 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 + len = n; + + ret = tal_dup_(ctx, p, 1, len, 1, false, TAL_LABEL(char, "[]")); + if (ret) + ret[len] = '\0'; + return ret; +} + +char *tal_asprintf(const tal_t *ctx, const char *fmt, ...) +{ + va_list ap; + char *ret; + + va_start(ap, fmt); + ret = tal_vasprintf(ctx, fmt, ap); + va_end(ap); + + return ret; +} + +char *tal_vasprintf(const tal_t *ctx, const char *fmt, va_list ap) +{ + size_t max; + char *buf; + int ret; + + if (!fmt && taken(fmt)) + return NULL; + + /* A decent guess to start. */ + max = strlen(fmt) * 2; + buf = tal_arr(ctx, char, max); + while (buf) { + va_list ap2; + + va_copy(ap2, ap); + ret = vsnprintf(buf, max, fmt, ap2); + va_end(ap2); + + if (ret < max) + break; + if (!tal_resize(&buf, max *= 2)) + buf = tal_free(buf); + } + if (taken(fmt)) + tal_free(fmt); + return buf; +} + char **tal_strsplit(const tal_t *ctx, const char *string, const char *delims, enum strsplit flags) {