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

SVN commits to the Digium repositories svn-commits at lists.digium.com
Wed Aug 13 15:05:09 CDT 2008


Author: eliel
Date: Wed Aug 13 15:05:08 2008
New Revision: 137495

URL: http://svn.digium.com/view/asterisk?view=rev&rev=137495
Log:
Implement xmldoc_string_cleanup() to remove \\t && '' && \\r after a \\n.
And skip blanks at the beginning.


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=137495&r1=137494&r2=137495
==============================================================================
--- team/group/appdocsxml/main/pbx.c (original)
+++ team/group/appdocsxml/main/pbx.c Wed Aug 13 15:05:08 2008
@@ -2796,6 +2796,51 @@
 #ifdef XML_DOCUMENTATION
 
 /*! \internal
+ *  \brief Cleanup spaces and tabs after a \n.
+ *  \param text String to be cleaned up.
+ *  \retval NULL on error.
+ *  \retval A malloc'ed string with the output.
+ */
+static char *xmldoc_string_cleanup(const char *text)
+{
+	int retlen=0, c;
+	char *rettmp, *rettext, *tmp;
+
+	/* Alloc a buffer of at least the same size as 'text' */
+	if (!text || !(rettmp = calloc(1, strlen(text) + 1))) {
+		return NULL;
+	}
+
+	tmp = ast_skip_blanks(text);
+	while (*tmp) {
+		if (*tmp == '\n' || *tmp == '\r') {
+			tmp++;
+			c = 0;
+			while (*tmp == ' ' || *tmp == '\t' || *tmp == '\r' || *tmp == '\n') {
+				tmp++, c++;
+			}
+			if (c) {
+				rettmp[retlen++] = ' ';
+			}
+			continue;
+		} else {
+			rettmp[retlen++] = *tmp;
+		}
+		tmp++;
+	}
+
+	if (!(rettext = ast_malloc(retlen + 1))) {
+		ast_free(rettmp);
+		return NULL;
+	}
+
+	strcpy(rettext, rettmp);
+	ast_free(rettmp);
+
+	return rettext;
+}
+
+/*! \internal
  *  \brief Get the application/function node for 'name' application/function with language 'language'
  *         if we don't find any, get the first application with 'name' no matter which language with.
  *  \param doc XML documentation tree structure.
@@ -3081,6 +3126,7 @@
 static int xmldoc_parse_para(ast_xml_node *node, const char *tabs, const char *posttabs, int *len, char **buffer)
 {
 	ast_xml_text *tmptext;
+	char *cleantext;
 
 	if (!node || !node->AST_XML_CHILD) {
 		return 0;
@@ -3094,7 +3140,10 @@
 	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);
+		/* Strip \n etc. */
+		cleantext = xmldoc_string_cleanup(tmptext);
+		*len += sprintf(*buffer + *len, "%s%s%s", tabs, cleantext, posttabs);
+		ast_free(cleantext);
 		ast_xml_free_text(tmptext);
 	}
 
@@ -3213,7 +3262,7 @@
 static char *xmldoc_get_formatted(ast_xml_node *node, int raw_output)
 {
 	ast_xml_node *tmp;
-	char *ret = NULL;
+	char *ret = NULL, *notcleanret;
 	int len = 0;
 
 	if (!node || !node->AST_XML_CHILD) {
@@ -3221,7 +3270,9 @@
 	}
 
 	if (raw_output) {
-		ret = ast_xml_get_text(node);
+		notcleanret = ast_xml_get_text(node);
+		ret = xmldoc_string_cleanup(notcleanret);
+		ast_xml_free_text(notcleanret);
 	} else {
 		tmp = node->AST_XML_CHILD;
 		while (tmp) {




More information about the svn-commits mailing list