X-Git-Url: http://mj.ucw.cz/gitweb/?a=blobdiff_plain;ds=sidebyside;f=lib%2Fmempool-str.c;h=176ff3e21e046169c1420ae8402910694544b9f9;hb=39d5e9acc6d93c07cbb408fe27144c8a485499ac;hp=065597d63e0596a837eb1d30c5f841eab2c95d98;hpb=2771551e0dbfc9517ca6fd68f0db362434ceddbb;p=libucw.git diff --git a/lib/mempool-str.c b/lib/mempool-str.c index 065597d6..176ff3e2 100644 --- a/lib/mempool-str.c +++ b/lib/mempool-str.c @@ -1,5 +1,5 @@ /* - * Sherlock Library -- Memory Pools (String Operations) + * UCW Library -- Memory Pools (String Operations) * * (c) 2004 Martin Mares * @@ -14,7 +14,7 @@ #include char * -mp_strdup(struct mempool *p, char *s) +mp_strdup(struct mempool *p, const char *s) { uns l = strlen(s) + 1; char *t = mp_alloc_fast_noalign(p, l); @@ -22,6 +22,14 @@ mp_strdup(struct mempool *p, char *s) return t; } +void * +mp_memdup(struct mempool *p, const void *s, uns len) +{ + void *t = mp_alloc_fast(p, len); + memcpy(t, s, len); + return t; +} + char * mp_multicat(struct mempool *p, ...) { @@ -29,24 +37,66 @@ 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 + +int main(void) +{ + struct mempool *p = mp_new(64); + 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; +} + +#endif