X-Git-Url: http://mj.ucw.cz/gitweb/?a=blobdiff_plain;f=lib%2Fmempool-str.c;h=62fb18baabed110e5adbba1f5fb7cf62dcdcb2bc;hb=22e2db8b109438537f95e5841aff836d3ce9977d;hp=0da43e16c2fa16c9ab078b2337f7c8769b0b73a8;hpb=2860df435bc0ec1601bf2e7eedacc63258b932aa;p=libucw.git diff --git a/lib/mempool-str.c b/lib/mempool-str.c index 0da43e16..62fb18ba 100644 --- a/lib/mempool-str.c +++ b/lib/mempool-str.c @@ -22,6 +22,14 @@ mp_strdup(struct mempool *p, char *s) return t; } +void * +mp_memdup(struct mempool *p, void *s, uns len) +{ + void *t = mp_alloc_fast(p, len); + memcpy(t, s, len); + return t; +} + char * mp_multicat(struct mempool *p, ...) { @@ -29,28 +37,52 @@ mp_multicat(struct mempool *p, ...) va_start(args, p); char *x, *y; uns cnt = 0; - a = args; + va_copy(a, args); while (x = va_arg(a, char *)) cnt++; uns *sizes = alloca(cnt * sizeof(uns)); uns len = 1; cnt = 0; - a = args; + va_end(a); + va_copy(a, args); while (x = va_arg(a, char *)) len += sizes[cnt++] = strlen(x); char *buf = mp_alloc_fast_noalign(p, len); y = buf; - a = args; + va_end(a); cnt = 0; - while (x = va_arg(a, char *)) + while (x = va_arg(args, char *)) { memcpy(y, x, sizes[cnt]); y += sizes[cnt++]; } *y = 0; + va_end(args); return buf; } +char * +mp_strjoin(struct mempool *p, char **a, uns n, uns sep) +{ + uns sizes[n]; + uns len = 1; + for (uns i=0; i @@ -61,6 +93,9 @@ int main(void) char *s = mp_strdup(p, "12345"); char *c = mp_multicat(p, "<<", s, ">>", NULL); puts(c); + char *a[] = { "bugs", "gnats", "insects" }; + puts(mp_strjoin(p, a, 3, '.')); + puts(mp_strjoin(p, a, 3, 0)); return 0; }