return ret;
}
-char *tal_asprintf(const tal_t *ctx, const char *fmt, ...)
+char *tal_fmt(const tal_t *ctx, const char *fmt, ...)
{
va_list ap;
char *ret;
va_start(ap, fmt);
- ret = tal_vasprintf(ctx, fmt, ap);
+ ret = tal_vfmt(ctx, fmt, ap);
va_end(ap);
return ret;
}
-char *tal_vasprintf(const tal_t *ctx, const char *fmt, va_list ap)
+char *tal_vfmt(const tal_t *ctx, const char *fmt, va_list ap)
{
size_t max;
char *buf;
return buf;
}
+char *tal_strcat(const tal_t *ctx, const char *s1, const char *s2)
+{
+ size_t len1, len2;
+ char *ret;
+
+ if (unlikely(!s2) && taken(s2)) {
+ if (taken(s1))
+ tal_free(s1);
+ return NULL;
+ }
+ /* We have to let through NULL for take(). */
+ 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, "[]"));
+ if (likely(ret))
+ memcpy(ret + len1, s2, len2 + 1);
+
+ if (taken(s2))
+ tal_free(s2);
+ return ret;
+}
+
char **tal_strsplit(const tal_t *ctx,
const char *string, const char *delims, enum strsplit flags)
{