[Freeswitch-svn] [commit] r13255 - in freeswitch/trunk/src: . include

FreeSWITCH SVN mrene at freeswitch.org
Thu May 7 14:40:21 PDT 2009


Author: mrene
Date: Thu May  7 16:40:21 2009
New Revision: 13255

Log:
Add switch_xml_parse_str_dynamic and switch_xml_parse_str_dup

Modified:
   freeswitch/trunk/src/include/switch_xml.h
   freeswitch/trunk/src/switch_xml.c

Modified: freeswitch/trunk/src/include/switch_xml.h
==============================================================================
--- freeswitch/trunk/src/include/switch_xml.h	(original)
+++ freeswitch/trunk/src/include/switch_xml.h	Thu May  7 16:40:21 2009
@@ -98,6 +98,21 @@
 	uint32_t flags;
 };
 
+/*! 
+ * \brief Parses a string into a switch_xml_t, ensuring the memory will be freed with switch_xml_free
+ * \param s The string to parse
+ * \param dup true if you want the string to be strdup()'d automatically
+ * \return the switch_xml_t or NULL if an error occured
+ */ 
+SWITCH_DECLARE(switch_xml_t) switch_xml_parse_str_dynamic(char *s, switch_bool_t dup);
+
+/*! 
+ * \brief Parses a string into a switch_xml_t 
+ * \param s The string to parse
+ * \return the switch_xml_t or NULL if an error occured
+ */
+#define switch_xml_parse_str_dup(x)  switch_xml_parse_str_dynamic(x, SWITCH_TRUE)
+
 ///\brief Given a string of xml data and its length, parses it and creates an switch_xml
 ///\ structure. For efficiency, modifies the data by adding null terminators
 ///\ and decoding ampersand sequences. If you don't want this, copy the data and

Modified: freeswitch/trunk/src/switch_xml.c
==============================================================================
--- freeswitch/trunk/src/switch_xml.c	(original)
+++ freeswitch/trunk/src/switch_xml.c	Thu May  7 16:40:21 2009
@@ -902,6 +902,19 @@
 	free(attr);
 }
 
+SWITCH_DECLARE(switch_xml_t) switch_xml_parse_str_dynamic(char *s, switch_bool_t dup) 
+{
+	switch_xml_root_t root;
+	char *data = dup ? strdup(s) : s;
+	
+	if ((root = (switch_xml_root_t) switch_xml_parse_str(data, strlen(data)))) {
+		root->dynamic = 1; /* Make sure we free the memory is switch_xml_free() */
+		return &root->xml;
+	} else {
+		return NULL;
+	}
+}
+	
 /* parse the given xml string and return an switch_xml structure */
 SWITCH_DECLARE(switch_xml_t) switch_xml_parse_str(char *s, switch_size_t len)
 {
@@ -1552,14 +1565,9 @@
 
 		if ((conf = switch_xml_find_child(xml, "section", "name", section)) && (tag = switch_xml_find_child(conf, tag_name, key_name, key_value))) {
 			if (clone) {
-				char *x;
-				switch_xml_root_t xmlroot = NULL;
-				x = switch_xml_toxml(tag, SWITCH_FALSE);
+				char *x = switch_xml_toxml(tag, SWITCH_FALSE);
 				switch_assert(x);
-				xmlroot = (switch_xml_root_t)switch_xml_parse_str(x, strlen(x));
-				xmlroot->dynamic = 1;	/* free the memory in switch_xml_free */
-				*root = (switch_xml_t)xmlroot;
-				*node = *root;
+				*node = *root = switch_xml_parse_str_dynamic(x, SWITCH_FALSE); /* x will be free()'d in switch_xml_free() */
 				switch_xml_free(xml);
 			} else {
 				*node = tag;



More information about the Freeswitch-svn mailing list