Fix leak for odr_print of ZOOM connection.
[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 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 void nmem_strsplit(NMEM nmem, const char *delim, const char *dstr,
61                    char ***darray, int *num)
62 {
63     const char *cp = dstr;
64     for (*num = 0; *cp; (*num)++)
65     {
66         while (*cp && strchr(delim, *cp))
67             cp++;
68         if (!*cp)
69             break;
70         while (*cp && !strchr(delim, *cp))
71             cp++;
72     }
73     if (!*num)
74         *darray = 0;
75     else
76     {
77         size_t i = 0;
78         *darray = (char **) nmem_malloc(nmem, *num * sizeof(**darray));
79         for (cp = dstr; *cp; )
80         {
81             const char *cp0;
82             while (*cp && strchr(delim, *cp))
83                 cp++;
84             if (!*cp)
85                 break;
86             cp0 = cp;
87             while (*cp && !strchr(delim, *cp))
88                 cp++;
89             (*darray)[i++] = nmem_strdupn(nmem, cp0, cp - cp0);
90         }
91     }
92 }
93
94 #if YAZ_HAVE_XML2
95 char *nmem_text_node_cdata(const xmlNode *ptr_cdata, NMEM nmem)
96 {
97     char *cdata;
98     int len = 0;
99     const xmlNode *ptr;
100
101     for (ptr = ptr_cdata; ptr; ptr = ptr->next)
102         if (ptr->type == XML_TEXT_NODE)
103             len += xmlStrlen(ptr->content);
104     cdata = (char *) nmem_malloc(nmem, len+1);
105     *cdata = '\0';
106     for (ptr = ptr_cdata; ptr; ptr = ptr->next)
107         if (ptr->type == XML_TEXT_NODE)
108             strcat(cdata, (const char *) ptr->content);
109     return cdata;
110 }
111 #endif
112
113 /*
114  * Local variables:
115  * c-basic-offset: 4
116  * c-file-style: "Stroustrup"
117  * indent-tabs-mode: nil
118  * End:
119  * vim: shiftwidth=4 tabstop=8 expandtab
120  */
121