Happy new year
[yaz-moved-to-github.git] / src / nmemsdup.c
1 /* This file is part of the YAZ toolkit.
2  * Copyright (C) 1995-2009 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 int *nmem_intdup(NMEM mem, int v)
42 {
43     int *dst = (int*) nmem_malloc (mem, sizeof(int));
44     *dst = v;
45     return dst;
46 }
47
48 void nmem_strsplit_blank(NMEM nmem, const char *dstr, char ***darray, int *num)
49 {
50     nmem_strsplit(nmem, " ", dstr, darray, num);
51 }
52
53 void nmem_strsplit(NMEM nmem, const char *delim, const char *dstr,
54                    char ***darray, int *num)
55 {
56     const char *cp = dstr;
57     for (*num = 0; *cp; (*num)++)
58     {
59         while (*cp && strchr(delim, *cp))
60             cp++;
61         if (!*cp)
62             break;
63         while (*cp && !strchr(delim, *cp))
64             cp++;
65     }
66     if (!*num)
67         *darray = 0;
68     else
69     {
70         size_t i = 0;
71         *darray = (char **) nmem_malloc(nmem, *num * sizeof(**darray));
72         for (cp = dstr; *cp; )
73         {
74             const char *cp0;
75             while (*cp && strchr(delim, *cp))
76                 cp++;
77             if (!*cp)
78                 break;
79             cp0 = cp;
80             while (*cp && !strchr(delim, *cp))
81                 cp++;
82             (*darray)[i++] = nmem_strdupn(nmem, cp0, cp - cp0);
83         }
84     }
85 }
86
87 #if YAZ_HAVE_XML2
88 char *nmem_text_node_cdata(const xmlNode *ptr_cdata, NMEM nmem)
89 {
90     char *cdata;
91     int len = 0;
92     const xmlNode *ptr;
93
94     for (ptr = ptr_cdata; ptr; ptr = ptr->next)
95         if (ptr->type == XML_TEXT_NODE)
96             len += xmlStrlen(ptr->content);
97     cdata = (char *) nmem_malloc(nmem, len+1);
98     *cdata = '\0';
99     for (ptr = ptr_cdata; ptr; ptr = ptr->next)
100         if (ptr->type == XML_TEXT_NODE)
101             strcat(cdata, (const char *) ptr->content);
102     return cdata;
103 }
104 #endif
105
106 /*
107  * Local variables:
108  * c-basic-offset: 4
109  * indent-tabs-mode: nil
110  * End:
111  * vim: shiftwidth=4 tabstop=8 expandtab
112  */
113