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

SVN commits to the Digium repositories svn-commits at lists.digium.com
Sun Aug 17 14:18:03 CDT 2008


Author: eliel
Date: Sun Aug 17 14:18:03 2008
New Revision: 138513

URL: http://svn.digium.com/view/asterisk?view=rev&rev=138513
Log:
Simplify string wrapping mechanism. We wrap the complete text to a specified
number of columns instead of wrapping every line making the code hard to modify if
we want to change tabs or spaces for formatting purposes.


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=138513&r1=138512&r2=138513
==============================================================================
--- team/group/appdocsxml/main/pbx.c (original)
+++ team/group/appdocsxml/main/pbx.c Sun Aug 17 14:18:03 2008
@@ -2796,22 +2796,16 @@
 }
 
 #ifdef XML_DOCUMENTATION
-/*! \brief Justify a text to a number of columns. 
- *  \param text Input text to be justified.
- *  \param columns Number of columns to preserve in the text.
- *  \param maxdiff Try to not cut a word when goinf down.
- *  \param postbr Put this chars after a \n.
- *  \param predatalen Length of the data already printed.
- *  \retval NULL on error.
- *  \retval The wrapped text.
+/*! \internal
+ *  \brief Calculate the space in bytes used by a format string
+ *  that will be passed to a sprintf function.
+ *  \param postbr The format string to use to calculate the length.
+ *  \retval The postbr length.
  */
-static char *xmldoc_string_wrap(const char *text, int columns, int maxdiff, const char *postbr, int predatalen)
-{
-	char *tmp, *ret, *t;
-	char *in = (char *)text;
-	int count = 1, tmplen = 0, i, postbrlen = 0, postbrreallen = 0;
-	int sep, needtobreak = 0, colmax;
-	
+static int xmldoc_postbrlen(const char *postbr)
+{
+	int postbrreallen = 0, i;
+
 	if (postbr) {
 		for (i = 0; i < strlen(postbr); i++) {
 			if (postbr[i] == '\t') {
@@ -2820,36 +2814,79 @@
 				postbrreallen++;
 			}
 		}
-		postbrlen = strlen(postbr);
-	}
-
+	}
+	return postbrreallen;
+}
+
+/*! \internal
+ *  \brief Setup postbr to be used while wrapping the text. 
+ *  Add to postbr array all the spaces and tabs at the beginning of the line.
+ *  \param postbr output array. 
+ *  \param len array length.
+ *  \param text Text with format string before the actual string.
+ */
+static void xmldoc_setpostbr(char *postbr, size_t len, const char *text)
+{
+	int c = 0, postbrlen = 0;
+	char *tmp = (char *)text;
+	
 	if (!text) {
+		return;
+	}
+
+	while (*tmp && (tmp[c] == '\t' || tmp[c] == ' ') && c < len) {
+		postbr[postbrlen++] = tmp[c++];
+	}
+	postbr[postbrlen] = '\0';
+}
+
+/*! \brief Justify a text to a number of columns. 
+ *  \param text Input text to be justified.
+ *  \param columns Number of columns to preserve in the text.
+ *  \param maxdiff Try to not cut a word when goinf down.
+ *  \retval NULL on error.
+ *  \retval The wrapped text.
+ */
+static char *xmldoc_string_wrap(char *text, int columns, int maxdiff)
+{
+	char *tmp, *ret, *t;
+	char *in = (char *)text;
+	int count = 1, tmplen = 0, i, postbrreallen = 0;
+	char postbr[160];
+	int sep, needtobreak = 0, colmax;
+	
+	if (!text || columns <= 0 || maxdiff < 0) {
 		return NULL;
 	}
 
 	/* XXX: We could calculate better how much space do we need. */
-	tmp = ast_calloc(1, strlen(text) * ((postbrreallen ? postbrreallen : 1) + 1));
+	tmp = ast_calloc(1, strlen(text) * 3);
 
 	if (!tmp) {
 		return NULL;
 	}
 
-	colmax = columns - postbrreallen - predatalen;
+	/* Check for blanks and tabs and put them in postbr. */
+	xmldoc_setpostbr(postbr, sizeof(postbr), text);	
+	postbrreallen = xmldoc_postbrlen(postbr);
+	colmax = columns - postbrreallen;
+	
 	while (*in) {
 		if (needtobreak || !(count % colmax)) {
 			if (*in == ' ') {
 				tmp[tmplen++] = '\n';
-				for (i = 0; i < postbrlen; i++) {
+				for (i = 0; i < strlen(postbr); i++) {
 					tmp[tmplen++] = postbr[i];
 				}
 				needtobreak = 0;
-			} else {
+			} else if (*in != '\n') {
 				needtobreak = 1;
 				t = in;
 				sep = maxdiff;
 				while (*t && sep > 0) {
+					t++;
 					/* Wait for the next space? */
-					if (*(++t) == ' ') {
+					if (*t == ' ') {
 						break;
 					}
 					sep--;
@@ -2859,7 +2896,8 @@
 					t = in;
 					sep = (maxdiff % tmplen);
 					while (sep > 0) {
-						if (*(--t) == ' ') {
+						t--;
+						if (*t == ' ') {
 							break;
 						}
 						sep--;
@@ -2872,7 +2910,7 @@
 					}
 					tmp[tmplen++] = '-';
 					tmp[tmplen++] = '\n';
-					for (i = 0; i < postbrlen; i++) {
+					for (i = 0; i < strlen(postbr); i++) {
 						tmp[tmplen++] = postbr[i];
 					}
 					needtobreak = 0;
@@ -2882,6 +2920,12 @@
 			while (*in == ' ') {
 				in++;
 			}	
+		}
+		if (*in == '\n') {
+			xmldoc_setpostbr(postbr, sizeof(postbr), in + 1);
+			postbrreallen = xmldoc_postbrlen(postbr);
+			colmax = columns - postbrreallen;
+			needtobreak = 0, count = 1;
 		}
 		tmp[tmplen++] = *in;
 		count++;
@@ -2988,17 +3032,20 @@
  *  \param reverse We are going backwards while generating the syntax?
  *  \param len Current length of 'syntax' buffer.
  *  \param syntax Output buffer for the concatenated values.
- *  \param fmt A format string that will be used in a sprintf call
- *  \param fmtrev A format string that will be used in a sprintf call when reverse=1
+ *  \param fmt A format string that will be used in a sprintf call.
+ *  \param fmtrev A format string that will be used in a sprintf call if reverse == 1.
  */
 static void xmldoc_reverse_helper(int reverse, int *len, char **syntax, const char *fmt, const char *fmtrev, ...)
 {
 	int totlen, tmpfmtlen;
-	char *tmpfmt = NULL, tmp;
+	char *tmpfmt, tmp;
 	va_list ap;
 
 	va_start(ap, fmtrev);
-	ast_vasprintf(&tmpfmt, (reverse ? fmtrev : fmt), ap);
+	if (ast_vasprintf(&tmpfmt, (reverse ? fmtrev : fmt), ap) < 0) {
+		va_end(ap);
+		return;
+	}
 	va_end(ap);
 
 	tmpfmtlen = strlen(tmpfmt);
@@ -3064,8 +3111,7 @@
 	if (!node || !node->AST_XML_CHILD) {
 		/* If the syntax field is not found, at least print the
 		   application/function name. */
-		syntax = ast_malloc(strlen(name) + 3);
-		sprintf(syntax, "%s()", name);
+		ast_asprintf(&syntax, "%s()", name);
 		return syntax;
 	}
 
@@ -3133,7 +3179,7 @@
 	}
 
 	/* init syntax string. */
-	xmldoc_reverse_helper(reverse, &len, &syntax, "%s(", ")", name);
+	xmldoc_reverse_helper(reverse, &len, &syntax, "%s(", "(", name);
 
 	while (node) {
 		if (strcasecmp((char *)node->AST_XML_NAME, "parameter")) {
@@ -3149,8 +3195,7 @@
 				ast_free(syntax);
 			}
 			/* to give up is ok? */
-			syntax = ast_malloc(strlen(name) + 3);
-			sprintf(syntax, "%s()", name);
+			ast_asprintf(&syntax, "%s()", name);
 			return syntax;
 		}
 
@@ -3224,7 +3269,7 @@
 static int xmldoc_parse_para(ast_xml_node *node, const char *tabs, const char *posttabs, int *len, char **buffer, int predatalen)
 {
 	ast_xml_text *tmptext;
-	char *cleantext, *wraptext;
+	char *cleantext;
 
 	if (!node || !node->AST_XML_CHILD) {
 		return 0;
@@ -3240,13 +3285,10 @@
 		/* Strip \n etc. */
 		cleantext = xmldoc_string_cleanup(tmptext);
 		ast_xml_free_text(tmptext);
-		/* wrapped text. */
-		wraptext = xmldoc_string_wrap(cleantext, XMLDOC_TEXT_COLUMNS, XMLDOC_MAX_DIFF, tabs, predatalen);
-		ast_free(cleantext);
-		if (wraptext) {
-			*buffer = ast_realloc(*buffer, *len + strlen(tabs) + strlen(wraptext) + strlen(posttabs) + 1);
-			*len += sprintf(*buffer + *len, "%s%s%s", tabs, wraptext, posttabs);
-			ast_free(wraptext);
+		if (cleantext) {
+			*buffer = ast_realloc(*buffer, *len + strlen(tabs) + strlen(cleantext) + strlen(posttabs) + 1);
+			*len += sprintf(*buffer + *len, "%s%s%s", tabs, cleantext, posttabs);
+			ast_free(cleantext);
 		}
 	}
 
@@ -3269,7 +3311,7 @@
 	ast_xml_node *tmp;
 	ast_xml_attr *valname;
 	ast_xml_text *tmptext;
-	char *wrap, *clean;
+	char *clean;
 
 	if (!node || !node->AST_XML_CHILD) {
 		return;
@@ -3299,15 +3341,10 @@
 				/* Cleanup text. */			
 				clean = xmldoc_string_cleanup(tmptext);
 				ast_xml_free_text(tmptext);
-				/* Wrap text (+5 for string formatting purposes: '\n: ') */
-				wrap = xmldoc_string_wrap(clean, XMLDOC_TEXT_COLUMNS, XMLDOC_MAX_DIFF, tabs, strlen(valname) + 5);
 				if (clean) {
+					*buffer = ast_realloc(*buffer, *len + strlen(clean) + 2);
+					*len += sprintf(*buffer + *len, " %s", clean);
 					ast_free(clean);
-				}
-				if (wrap) {
-					*buffer = ast_realloc(*buffer, *len + strlen(wrap) + 2);
-					*len += sprintf(*buffer + *len, " %s", wrap);
-					ast_free(wrap);
 				}
 			}
 		}
@@ -3377,7 +3414,7 @@
 static char *xmldoc_get_formatted(ast_xml_node *node, int raw_output, int raw_wrap)
 {
 	ast_xml_node *tmp;
-	char *ret = NULL, *notcleanret, *notwrapped;
+	char *ret = NULL, *notcleanret;
 	int len = 0;
 
 	if (!node || !node->AST_XML_CHILD) {
@@ -3386,14 +3423,8 @@
 
 	if (raw_output) {
 		notcleanret = ast_xml_get_text(node);
-		notwrapped = xmldoc_string_cleanup(notcleanret);
+		ret = xmldoc_string_cleanup(notcleanret);
 		ast_xml_free_text(notcleanret);
-		if (raw_wrap) {
-			ret = xmldoc_string_wrap(notwrapped, XMLDOC_TEXT_COLUMNS, XMLDOC_MAX_DIFF, "", 0);
-			ast_free(notwrapped);
-		} else {
-			ret = notwrapped;
-		}
 	} else {
 		tmp = node->AST_XML_CHILD;
 		while (tmp) {
@@ -3422,6 +3453,7 @@
 static char *xmldoc_get_field(const char *type, const char *name, const char *var, int raw)
 {
 	ast_xml_node *node;
+	char *formatted, *ret = NULL;
 
 	if (ast_strlen_zero(type) || ast_strlen_zero(name)) {
 		ast_log(LOG_WARNING, "Tried to look in XML tree with faulty values.\n");
@@ -3448,7 +3480,13 @@
 		return NULL;
 	}
 
-	return xmldoc_get_formatted(node, raw, raw);
+	formatted = xmldoc_get_formatted(node, raw, raw);
+	if (formatted) {
+		ret = xmldoc_string_wrap(formatted, XMLDOC_TEXT_COLUMNS, XMLDOC_MAX_DIFF);
+		ast_free(formatted);
+	}
+
+	return ret;
 }
 #endif /* XML_DOCUMENTATION */
 




More information about the svn-commits mailing list