Changed prototype for nmem_text_node_cdata so that ptr is using
[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.9 2006-08-11 12:50:23 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 YAZ_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_strdup_null(NMEM mem, const char *src)
31 {
32     if (!src)
33         return 0;
34     else
35         return nmem_strdup(mem, src);
36 }
37
38 char *nmem_strdupn (NMEM mem, const char *src, size_t n)
39 {
40     char *dst = (char *)nmem_malloc (mem, n+1);
41     memcpy (dst, src, n);
42     dst[n] = '\0';
43     return dst;
44 }
45
46 int *nmem_intdup(NMEM mem, int v)
47 {
48     int *dst = (int*) nmem_malloc (mem, sizeof(int));
49     *dst = v;
50     return dst;
51 }
52
53 void nmem_strsplit_blank(NMEM nmem, const char *dstr, char ***darray, int *num)
54 {
55     nmem_strsplit(nmem, " ", dstr, darray, num);
56 }
57
58 void nmem_strsplit(NMEM nmem, const char *delim, const char *dstr,
59                    char ***darray, int *num)
60 {
61     const char *cp = dstr;
62     for (*num = 0; *cp; (*num)++)
63     {
64         while (*cp && strchr(delim, *cp))
65             cp++;
66         if (!*cp)
67             break;
68         while (*cp && !strchr(delim, *cp))
69             cp++;
70     }
71     if (!*num)
72         *darray = 0;
73     else
74     {
75         size_t i = 0;
76         *darray = nmem_malloc(nmem, *num * sizeof(**darray));
77         for (cp = dstr; *cp; )
78         {
79             const char *cp0;
80             while (*cp && strchr(delim, *cp))
81                 cp++;
82             if (!*cp)
83                 break;
84             cp0 = cp;
85             while (*cp && !strchr(delim, *cp))
86                 cp++;
87             (*darray)[i++] = nmem_strdupn(nmem, cp0, cp - cp0);
88         }
89     }
90 }
91
92 #if YAZ_HAVE_XML2
93 char *nmem_text_node_cdata(const xmlNode *ptr_cdata, NMEM nmem)
94 {
95     char *cdata;
96     int len = 0;
97     const xmlNode *ptr;
98
99     for (ptr = ptr_cdata; ptr; ptr = ptr->next)
100         if (ptr->type == XML_TEXT_NODE)
101             len += xmlStrlen(ptr->content);
102     cdata = (char *) nmem_malloc(nmem, len+1);
103     *cdata = '\0';
104     for (ptr = ptr_cdata; ptr; ptr = ptr->next)
105         if (ptr->type == XML_TEXT_NODE)
106             strcat(cdata, (const char *) ptr->content);
107     return cdata;
108 }
109 #endif
110
111 /*
112  * Local variables:
113  * c-basic-offset: 4
114  * indent-tabs-mode: nil
115  * End:
116  * vim: shiftwidth=4 tabstop=8 expandtab
117  */
118