don't blow up if a jitterbuffer is not in use
[asterisk/asterisk.git] / mxml / mxml-attr.c
1 /*
2  * "$Id$"
3  *
4  * Attribute support code for Mini-XML, a small XML-like file parsing library.
5  *
6  * Copyright 2003-2005 by Michael Sweet.
7  *
8  * This program is free software; you can redistribute it and/or
9  * modify it under the terms of the GNU Library General Public
10  * License as published by the Free Software Foundation; either
11  * version 2, or (at your option) any later version.
12  *
13  * This program is distributed in the hope that it will be useful,
14  * but WITHOUT ANY WARRANTY; without even the implied warranty of
15  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
16  * GNU General Public License for more details.
17  *
18  * Contents:
19  *
20  *   mxmlElementGetAttr() - Get an attribute.
21  *   mxmlElementSetAttr() - Set an attribute.
22  */
23
24 /*
25  * Include necessary headers...
26  */
27
28 #include "config.h"
29 #include "mxml.h"
30
31
32 /*
33  * 'mxmlElementGetAttr()' - Get an attribute.
34  *
35  * This function returns NULL if the node is not an element or the
36  * named attribute does not exist.
37  */
38
39 const char *                            /* O - Attribute value or NULL */
40 mxmlElementGetAttr(mxml_node_t *node,   /* I - Element node */
41                    const char  *name)   /* I - Name of attribute */
42 {
43   int   i;                              /* Looping var */
44   mxml_attr_t   *attr;                  /* Cirrent attribute */
45
46
47 #ifdef DEBUG
48   fprintf(stderr, "mxmlElementGetAttr(node=%p, name=\"%s\")\n",
49           node, name ? name : "(null)");
50 #endif /* DEBUG */
51
52  /*
53   * Range check input...
54   */
55
56   if (!node || node->type != MXML_ELEMENT || !name)
57     return (NULL);
58
59  /*
60   * Look for the attribute...
61   */
62
63   for (i = node->value.element.num_attrs, attr = node->value.element.attrs;
64        i > 0;
65        i --, attr ++)
66     if (!strcmp(attr->name, name))
67       return (attr->value);
68
69  /*
70   * Didn't find attribute, so return NULL...
71   */
72
73   return (NULL);
74 }
75
76
77 /*
78  * 'mxmlElementSetAttr()' - Set an attribute.
79  *
80  * If the named attribute already exists, the value of the attribute
81  * is replaced by the new string value. The string value is copied
82  * into the element node. This function does nothing if the node is
83  * not an element.
84  */
85
86 void
87 mxmlElementSetAttr(mxml_node_t *node,   /* I - Element node */
88                    const char  *name,   /* I - Name of attribute */
89                    const char  *value)  /* I - Attribute value */
90 {
91   int           i;                      /* Looping var */
92   mxml_attr_t   *attr;                  /* New attribute */
93
94
95 #ifdef DEBUG
96   fprintf(stderr, "mxmlElementSetAttr(node=%p, name=\"%s\", value=\"%s\")\n",
97           node, name ? name : "(null)", value ? value : "(null)");
98 #endif /* DEBUG */
99
100  /*
101   * Range check input...
102   */
103
104   if (!node || node->type != MXML_ELEMENT || !name)
105     return;
106
107  /*
108   * Look for the attribute...
109   */
110
111   for (i = node->value.element.num_attrs, attr = node->value.element.attrs;
112        i > 0;
113        i --, attr ++)
114     if (!strcmp(attr->name, name))
115     {
116      /*
117       * Replace the attribute value and return...
118       */
119
120       if (attr->value)
121         free(attr->value);
122
123       if (value)
124       {
125         if ((attr->value = strdup(value)) == NULL)
126           mxml_error("Unable to allocate memory for attribute '%s' in element %s!",
127                      name, node->value.element.name);
128       }
129       else
130         attr->value = NULL;
131
132       return;
133     }
134
135  /*
136   * Attribute not found, so add a new one...
137   */
138
139   if (node->value.element.num_attrs == 0)
140     attr = malloc(sizeof(mxml_attr_t));
141   else
142     attr = realloc(node->value.element.attrs,
143                    (node->value.element.num_attrs + 1) * sizeof(mxml_attr_t));
144
145   if (!attr)
146   {
147     mxml_error("Unable to allocate memory for attribute '%s' in element %s!",
148                name, node->value.element.name);
149     return;
150   }
151
152   node->value.element.attrs = attr;
153   attr += node->value.element.num_attrs;
154
155   attr->name = strdup(name);
156   if (value)
157     attr->value = strdup(value);
158   else
159     attr->value = NULL;
160
161   if (!attr->name || (!attr->value && value))
162   {
163     if (attr->name)
164       free(attr->name);
165
166     if (attr->value)
167       free(attr->value);
168
169     mxml_error("Unable to allocate memory for attribute '%s' in element %s!",
170                name, node->value.element.name);
171
172     return;
173   }
174     
175   node->value.element.num_attrs ++;
176 }
177
178
179 /*
180  * End of "$Id$".
181  */