Added nmem_text_node_cdata which takes xmlNode CDATA content and
[yaz-moved-to-github.git] / src / nmemsdup.c
1 /*
2  * Copyright (C) 1995-2006, Index Data ApS
3  * See the file LICENSE for details.
4  *
5  * $Id: nmemsdup.c,v 1.6 2006-05-02 20:47:45 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 #if HAVE_XML2
20 #include <libxml/tree.h>
21 #endif
22
23 char *nmem_strdup (NMEM mem, const char *src)
24 {
25     char *dst = (char *)nmem_malloc (mem, strlen(src)+1);
26     strcpy (dst, src);
27     return dst;
28 }
29
30 char *nmem_strdupn (NMEM mem, const char *src, size_t n)
31 {
32     char *dst = (char *)nmem_malloc (mem, n+1);
33     memcpy (dst, src, n);
34     dst[n] = '\0';
35     return dst;
36 }
37
38 int *nmem_intdup(NMEM mem, int v)
39 {
40     int *dst = (int*) nmem_malloc (mem, sizeof(int));
41     *dst = v;
42     return dst;
43 }
44
45 void nmem_strsplit_blank(NMEM nmem, const char *dstr, char ***darray, int *num)
46 {
47     nmem_strsplit(nmem, " ", dstr, darray, num);
48 }
49
50 void nmem_strsplit(NMEM nmem, const char *delim, const char *dstr,
51                    char ***darray, int *num)
52 {
53     const char *cp = dstr;
54     for (*num = 0; *cp; (*num)++)
55     {
56         while (*cp && strchr(delim, *cp))
57             cp++;
58         if (!*cp)
59             break;
60         while (*cp && !strchr(delim, *cp))
61             cp++;
62     }
63     if (!*num)
64         *darray = 0;
65     else
66     {
67         size_t i = 0;
68         *darray = nmem_malloc(nmem, *num * sizeof(**darray));
69         for (cp = dstr; *cp; )
70         {
71             const char *cp0;
72             while (*cp && strchr(delim, *cp))
73                 cp++;
74             if (!*cp)
75                 break;
76             cp0 = cp;
77             while (*cp && !strchr(delim, *cp))
78                 cp++;
79             (*darray)[i++] = nmem_strdupn(nmem, cp0, cp - cp0);
80         }
81     }
82 }
83
84 #if HAVE_XML2
85 char *nmem_text_node_cdata(const void *ptr_cdata, NMEM nmem)
86 {
87     char *cdata;
88     int len = 0;
89     const xmlNode *ptr;
90
91     for (ptr = (const xmlNode *) ptr_cdata; ptr; ptr = ptr->next)
92         if (ptr->type == XML_TEXT_NODE)
93             len += xmlStrlen(ptr->content);
94     cdata = (char *) nmem_malloc(nmem, len+1);
95     *cdata = '\0';
96     for (ptr = (const xmlNode *) ptr_cdata; ptr; ptr = ptr->next)
97         if (ptr->type == XML_TEXT_NODE)
98             strcat(cdata, (const char *) ptr->content);
99     return cdata;
100 }
101 #endif
102
103 /*
104  * Local variables:
105  * c-basic-offset: 4
106  * indent-tabs-mode: nil
107  * End:
108  * vim: shiftwidth=4 tabstop=8 expandtab
109  */
110