[svn-commits] eliel: branch group/appdocsxml r136951 - /team/group/appdocsxml/main/pbx.c

SVN commits to the Digium repositories svn-commits at lists.digium.com
Sat Aug 9 10:37:31 CDT 2008


Author: eliel
Date: Sat Aug  9 10:37:30 2008
New Revision: 136951

URL: http://svn.digium.com/view/asterisk?view=rev&rev=136951
Log:
Added the needed functions to parse <variablelist> elements inside any other element.
Notice that we need more work on output formatting.

Modified:
    team/group/appdocsxml/main/pbx.c

Modified: team/group/appdocsxml/main/pbx.c
URL: http://svn.digium.com/view/asterisk/team/group/appdocsxml/main/pbx.c?view=diff&rev=136951&r1=136950&r2=136951
==============================================================================
--- team/group/appdocsxml/main/pbx.c (original)
+++ team/group/appdocsxml/main/pbx.c Sat Aug  9 10:37:30 2008
@@ -2840,31 +2840,165 @@
 	return NULL;
 }
 
-/* \brief Return the string within a node formatted with <para> elements. 
- * \param node Parent node where content resides.
- * \retval NULL on error
- * \retval Node content on success.
+/*! \brief Parse a <para> element.
+ *  \param node The <para> element pointer.
+ *  \param tabs Added this string before the content of the <para> element.
+ *  \param posttabs Added this string after the content of the <para> element.
+ *  \param buffer This must be NULL or an ast_malloc'ed buffer. It will be used
+ *         to store the result (if already has something it will be appended to the current
+ *         string).
+ *  \retval 1 on succes.
+ *  \retval 0 on error.
+ */
+static int ast_xml_doc_parse_para(ast_xml_node *node, const char *tabs, const char *posttabs, int *len, char **buffer)
+{
+	ast_xml_text *tmptext;
+
+	if (!node || !node->AST_XML_CHILD) {
+		return 0;
+	}
+
+	if (strcasecmp((char *)node->AST_XML_NAME, "para")) {
+		return 0;
+	}
+
+	/* Get the text inside the <para> element and append it to buffer. */
+	tmptext = ast_xml_get_text(node);
+	if (tmptext) {
+		*buffer = ast_realloc(*buffer, *len + strlen(tmptext) + strlen(tabs) + strlen(posttabs) + 1);
+		*len += sprintf(*buffer + *len, "%s%s%s", tabs, tmptext, posttabs);
+		ast_xml_free_text(tmptext);
+	}
+
+	return 1;
+}
+
+/*! \brief Parse a <variable> node inside a <variablelist> node. 
+ *  \param node The variable node to parse.
+ *  \param tabs A string to be appended at the begining of the output that will be stored
+ *         in buffer.
+ *  \param len The current length of the buffer (if output is appended it will be modified).
+ *  \param buffer This must be NULL or an ast_malloc'ed buffer. It will be used
+ *  	   to store the result (if already has something it will be appended to the current
+ *  	   string).
+ */
+static void ast_xml_doc_parse_variable(ast_xml_node *node, const char *tabs, int *len, char **buffer)
+{
+	ast_xml_node *tmp;
+	ast_xml_attr *valname;
+	ast_xml_text *tmptext;
+
+	if (!node || !node->AST_XML_CHILD) {
+		return;
+	}	
+
+	tmp = node->AST_XML_CHILD;
+	while (tmp) {
+		/* XXX: increment by one tab the tabs? */
+		if (ast_xml_doc_parse_para(tmp, tabs, "\n", len, buffer)) {
+			tmp = tmp->AST_XML_NEXT;
+			continue;
+		}
+
+		if (!strcasecmp((char *)tmp->AST_XML_NAME, "value")) {
+			/* We do this first just to know if there is any comment inside <value>
+			and know how to print the name of the value. */
+			tmptext = ast_xml_get_text(tmp);
+
+			/* Parse each <value name='valuename'>desciption</value> */
+			valname = ast_xml_get_attribute(tmp, "name");
+			if (valname) {
+				*buffer = ast_realloc(*buffer, *len + strlen(valname) + strlen(tabs) + 3);
+				*len += sprintf(*buffer + *len, "\n%s%s%c", tabs, valname, (tmptext ? ':' : ' '));
+				ast_xml_free_attr(valname);
+			}
+			/* Check inside this node for any explanation about its meaning. */
+			if (tmptext) {
+				*buffer = ast_realloc(*buffer, *len + strlen(tmptext) + strlen(tabs) + 3);
+				*len += sprintf(*buffer + *len, "%s\t%s\n", tabs, tmptext);
+				ast_xml_free_text(tmptext);
+			}
+		}
+		tmp = tmp->AST_XML_NEXT;
+	}
+	
+}
+
+/*! \brief Parse a <variablelist> node and put all the output inside 'buffer'.
+ *  \param node The variablelist node pointer.
+ *  \param tabs A string to be appended at the begining of the output that will be stored
+ *         in buffer.
+ *  \param buffer This must be NULL, or a ast_malloc'ed buffer. It will be used
+ *  	   to store the result (if already has something it will be appended to the current
+ *  	   string).
+ *  \param len The current length of the buffer (if output is appended it will be modified). 
+ *  \retval 1 If a <variablelist> element is parsed.
+ *  \retval 0 On error.
+ */
+static int ast_xml_doc_parse_variablelist(ast_xml_node *node, const char *tabs, int *len, char **buffer)
+{
+	ast_xml_node *tmp;
+	ast_xml_attr *varname;
+
+	if (!node || !node->AST_XML_CHILD) {
+		return 0;
+	}
+
+	if (strcasecmp((char *)node->AST_XML_NAME, "variablelist")) {
+		return 0;	
+	}
+
+	tmp = node->AST_XML_CHILD;
+	while (tmp) {
+		/* We can have a <para> element inside the variable list ?? */
+		if ((ast_xml_doc_parse_para(tmp, "", "", len, buffer))) {
+			tmp = tmp->AST_XML_NEXT;
+			continue;
+		}
+
+		if (!strcasecmp((char *)tmp->AST_XML_NAME, "variable")) {
+			/* Store the variable name in buffer. */
+			varname = ast_xml_get_attribute(tmp, "name");
+			if (varname) {
+				*buffer = ast_realloc(*buffer, *len + strlen(varname) + strlen(tabs) + 4);
+				*len += sprintf(*buffer + *len, "%s\n%s: ", tabs, varname);
+				ast_xml_free_attr(varname);
+			}
+			/* Parse the <variable> possible values. */
+			ast_xml_doc_parse_variable(tmp, "\t\t", len, buffer);
+		}
+		tmp = tmp->AST_XML_NEXT;
+	}
+	return 1;
+}
+
+/*! \brief Return the string within a node formatted with 
+ * 	   <para> and <variablelist> elements. 
+ *  \param node Parent node where content resides.
+ *  \retval NULL on error
+ *  \retval Node content on success.
  */
 static char *ast_xml_doc_get_formatted(ast_xml_node *node)
 {
 	ast_xml_node *tmp;
-	char *ret = NULL, *tmptext;
+	char *ret = NULL;
 	int len = 0;
 
-	if (!node) {
+	if (!node || !node->AST_XML_CHILD) {
 		return NULL;
 	}
 
 	tmp = node->AST_XML_CHILD;
 	while (tmp) {
-		if (!strcasecmp((char *)tmp->AST_XML_NAME, "para")) {
-			tmptext = ast_xml_get_text(tmp);
-			if (tmptext) {
-				ret = ast_realloc(ret, len + strlen(tmptext) + 2);
-				len += sprintf(ret + len, "%s\n", tmptext);
-				ast_xml_free_text(tmptext);
-			}
-		}
+		/* if found, parse a <para> element. */
+		if (ast_xml_doc_parse_para(tmp, "", "\n", &len, &ret)) {
+			tmp = tmp->AST_XML_NEXT;
+			continue;
+		}
+		
+		/* if found, parse a <variablelist> element. */
+		ast_xml_doc_parse_variablelist(tmp, "\n", &len, &ret);
+		
 		tmp = tmp->AST_XML_NEXT;
 	}
 	




More information about the svn-commits mailing list