]> mj.ucw.cz Git - libucw.git/blobdiff - lib/mempool-str.c
Try to merge recent changes in v3.9 to image branch...
[libucw.git] / lib / mempool-str.c
index 065597d63e0596a837eb1d30c5f841eab2c95d98..96bc07dadfeb91ea05a56dc7bf04e6b146b89fa9 100644 (file)
@@ -1,5 +1,5 @@
 /*
 /*
- *     Sherlock Library -- Memory Pools (String Operations)
+ *     UCW Library -- Memory Pools (String Operations)
  *
  *     (c) 2004 Martin Mares <mj@ucw.cz>
  *
  *
  *     (c) 2004 Martin Mares <mj@ucw.cz>
  *
@@ -22,6 +22,14 @@ mp_strdup(struct mempool *p, char *s)
   return t;
 }
 
   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, ...)
 {
 char *
 mp_multicat(struct mempool *p, ...)
 {
@@ -29,24 +37,41 @@ mp_multicat(struct mempool *p, ...)
   va_start(args, p);
   char *x, *y;
   uns cnt = 0;
   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;
   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;
   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;
   cnt = 0;
-  while (x = va_arg(a, char *))
+  while (x = va_arg(args, char *))
     {
       memcpy(y, x, sizes[cnt]);
       y += sizes[cnt++];
     }
   *y = 0;
     {
       memcpy(y, x, sizes[cnt]);
       y += sizes[cnt++];
     }
   *y = 0;
+  va_end(args);
   return buf;
 }
   return buf;
 }
+
+#ifdef TEST
+
+#include <stdio.h>
+
+int main(void)
+{
+  struct mempool *p = mp_new(64);
+  char *s = mp_strdup(p, "12345");
+  char *c = mp_multicat(p, "<<", s, ">>", NULL);
+  puts(c);
+  return 0;
+}
+
+#endif