Add new function nmem_strsplitx.
[yaz-moved-to-github.git] / src / nmemsdup.c
1 /* This file is part of the YAZ toolkit.
2  * Copyright (C) 1995-2011 Index Data
3  * See the file LICENSE for details.
4  */
5
6 /**
7  * \file nmemsdup.c
8  * \brief Implements NMEM dup utilities
9  */
10
11 #if HAVE_CONFIG_H
12 #include <config.h>
13 #endif
14
15 #include <string.h>
16 #include <yaz/nmem_xml.h>
17
18 char *nmem_strdup (NMEM mem, const char *src)
19 {
20     char *dst = (char *)nmem_malloc (mem, strlen(src)+1);
21     strcpy (dst, src);
22     return dst;
23 }
24
25 char *nmem_strdup_null(NMEM mem, const char *src)
26 {
27     if (!src)
28         return 0;
29     else
30         return nmem_strdup(mem, src);
31 }
32
33 char *nmem_strdupn (NMEM mem, const char *src, size_t n)
34 {
35     char *dst = (char *)nmem_malloc (mem, n+1);
36     memcpy (dst, src, n);
37     dst[n] = '\0';
38     return dst;
39 }
40
41 nmem_int_t *nmem_intdup(NMEM mem, nmem_int_t v)
42 {
43     nmem_int_t *dst = (nmem_int_t*) nmem_malloc (mem, sizeof(*dst));
44     *dst = v;
45     return dst;
46 }
47
48 nmem_bool_t *nmem_booldup(NMEM mem, nmem_bool_t v)
49 {
50     nmem_bool_t *dst = (nmem_bool_t*) nmem_malloc (mem, sizeof(*dst));
51     *dst = v;
52     return dst;
53 }
54
55 void nmem_strsplit_blank(NMEM nmem, const char *dstr, char ***darray, int *num)
56 {
57     nmem_strsplit(nmem, " ", dstr, darray, num);
58 }
59
60
61 void nmem_strsplit(NMEM nmem, const char *delim, const char *dstr,
62                    char ***darray, int *num)
63 {
64     nmem_strsplitx(nmem, delim, dstr, darray, num, 1);
65 }
66
67 void nmem_strsplitx(NMEM nmem, const char *delim, const char *dstr,
68                     char ***darray, int *num, int collapse)
69 {
70     const char *cp = dstr;
71     *num = 0;
72
73     while (1)
74     {
75         if (collapse)
76         {
77             if (!*cp)
78                 break;
79             while (*cp && strchr(delim, *cp))
80                 cp++;
81             if (!*cp)
82                 break;
83             while (*cp && !strchr(delim, *cp))
84                 cp++;
85             (*num)++;
86         }
87         else
88         {
89             (*num)++;
90             while (*cp && !strchr(delim, *cp))
91                 cp++;
92             if (!*cp)
93                 break;
94             cp++;
95         }
96     }
97     if (!*num)
98         *darray = 0;
99     else
100     {
101         size_t i = 0;
102         *darray = (char **) nmem_malloc(nmem, *num * sizeof(**darray));
103         cp = dstr;
104         while (1)
105         {
106             const char *cp0;
107             if (collapse)
108             {
109                 if (!*cp)
110                     break;
111                 while (*cp && strchr(delim, *cp))
112                     cp++;
113                 if (!*cp)
114                     break;
115                 cp0 = cp;
116                 while (*cp && !strchr(delim, *cp))
117                     cp++;
118                 (*darray)[i++] = nmem_strdupn(nmem, cp0, cp - cp0);
119             }
120             else
121             {
122                 cp0 = cp;
123                 while (*cp && !strchr(delim, *cp))
124                     cp++;
125                 (*darray)[i++] = nmem_strdupn(nmem, cp0, cp - cp0);
126                 if (!*cp)
127                     break;
128                 cp++;
129             }
130         }
131     }
132 }
133
134 #if YAZ_HAVE_XML2
135 char *nmem_text_node_cdata(const xmlNode *ptr_cdata, NMEM nmem)
136 {
137     char *cdata;
138     int len = 0;
139     const xmlNode *ptr;
140
141     for (ptr = ptr_cdata; ptr; ptr = ptr->next)
142         if (ptr->type == XML_TEXT_NODE)
143             len += xmlStrlen(ptr->content);
144     cdata = (char *) nmem_malloc(nmem, len+1);
145     *cdata = '\0';
146     for (ptr = ptr_cdata; ptr; ptr = ptr->next)
147         if (ptr->type == XML_TEXT_NODE)
148             strcat(cdata, (const char *) ptr->content);
149     return cdata;
150 }
151 #endif
152
153 /*
154  * Local variables:
155  * c-basic-offset: 4
156  * c-file-style: "Stroustrup"
157  * indent-tabs-mode: nil
158  * End:
159  * vim: shiftwidth=4 tabstop=8 expandtab
160  */
161