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