]> git.ozlabs.org Git - ccan/blobdiff - ccan/tal/str/str.c
take, tal, tal/path, tal/str, tal/talloc: annotate APIs with TAKES.
[ccan] / ccan / tal / str / str.c
index 15aa0c046883633d956eb8abbf50c48e9e362c5e..4b3b11aa603cf23733ec9aa24251e602c2c7723f 100644 (file)
@@ -11,8 +11,6 @@
 #include <unistd.h>
 #include <stdio.h>
 #include <ccan/str/str.h>
-#include <ccan/tal/tal.h>
-#include <ccan/take/take.h>
 
 char *tal_strdup(const tal_t *ctx, const char *p)
 {
@@ -27,11 +25,9 @@ char *tal_strndup(const tal_t *ctx, const char *p, size_t n)
        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, "[]"));
@@ -55,7 +51,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 (;;) {
@@ -237,9 +233,31 @@ fail:
        goto out;
 }
 
+static size_t count_open_braces(const char *string)
+{
+#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 *regex, ...)
 {
-       size_t nmatch = 1 + strcount(regex, "(");
+       size_t nmatch = 1 + count_open_braces(regex);
        regmatch_t matches[nmatch];
        regex_t r;
        bool ret = false;