Added utilities nmem_strsplit and nmem_strsplit_blank which
[yaz-moved-to-github.git] / src / nmemsdup.c
1 /*
2  * Copyright (C) 1995-2005, Index Data ApS
3  * See the file LICENSE for details.
4  *
5  * $Id: nmemsdup.c,v 1.4 2005-05-02 19:14:33 adam Exp $
6  */
7
8 /**
9  * \file nmemsdup.c
10  * \brief Implements NMEM dup utilities
11  */
12
13 #if HAVE_CONFIG_H
14 #include <config.h>
15 #endif
16
17 #include <string.h>
18 #include <yaz/nmem.h>
19
20 char *nmem_strdup (NMEM mem, const char *src)
21 {
22     char *dst = (char *)nmem_malloc (mem, strlen(src)+1);
23     strcpy (dst, src);
24     return dst;
25 }
26
27 char *nmem_strdupn (NMEM mem, const char *src, size_t n)
28 {
29     char *dst = (char *)nmem_malloc (mem, n+1);
30     memcpy (dst, src, n);
31     dst[n] = '\0';
32     return dst;
33 }
34
35 int *nmem_intdup(NMEM mem, int v)
36 {
37     int *dst = (int*) nmem_malloc (mem, sizeof(int));
38     *dst = v;
39     return dst;
40 }
41
42 void nmem_strsplit_blank(NMEM nmem, const char *dstr, char ***darray, int *num)
43 {
44     nmem_strsplit(nmem, " ", dstr, darray, num);
45 }
46
47 void nmem_strsplit(NMEM nmem, const char *delim, const char *dstr,
48                    char ***darray, int *num)
49 {
50     const char *cp = dstr;
51     for (*num = 0; *cp; (*num)++)
52     {
53         while (*cp && strchr(delim, *cp))
54             cp++;
55         if (!*cp)
56             break;
57         while (*cp && !strchr(delim, *cp))
58             cp++;
59     }
60     if (!*num)
61         *darray = 0;
62     else
63     {
64         size_t i = 0;
65         *darray = nmem_malloc(nmem, *num * sizeof(**darray));
66         for (cp = dstr; *cp; )
67         {
68             const char *cp0;
69             while (*cp && strchr(delim, *cp))
70                 cp++;
71             if (!*cp)
72                 break;
73             cp0 = cp;
74             while (*cp && !strchr(delim, *cp))
75                 cp++;
76             (*darray)[i++] = nmem_strdupn(nmem, cp0, cp - cp0);
77         }
78     }
79 }
80