#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)
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, "[]"));
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 (;;) {
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;