[asterisk-commits] eliel: branch group/appdocsxml r151324 - /team/group/appdocsxml/main/pbx.c

SVN commits to the Asterisk project asterisk-commits at lists.digium.com
Mon Oct 20 18:13:35 CDT 2008


Author: eliel
Date: Mon Oct 20 18:13:34 2008
New Revision: 151324

URL: http://svn.digium.com/view/asterisk?view=rev&rev=151324
Log:
Fix some of the things pointed by russellb on the reviewboard.
 - Change #define with const vars (and add some comments).
 - Move the LIST to a RWLIST.
 - Move the alloca()ted strings to ast_malloc() and free them all when done.
 - Constant values inside a structure must be set as 'const'.

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=151324&r1=151323&r2=151324
==============================================================================
--- team/group/appdocsxml/main/pbx.c (original)
+++ team/group/appdocsxml/main/pbx.c Mon Oct 20 18:13:34 2008
@@ -824,18 +824,25 @@
 };
 
 #ifdef XML_DOCUMENTATION
-#define DEFAULT_DOCUMENTATION_LANGUAGE "en_US"
-#define XMLDOC_TEXT_COLUMNS 74
-#define XMLDOC_MAX_DIFF 5
+/*! \brief Default documentation language. */
+static const char default_documentation_language[] = "en_US";
+/*! \brief Number of columns to print when showing the XML documentation with a 
+ *         'core show application/function *' CLI command. Used in text wrapping.*/
+static const int xmldoc_text_columns = 74;
+/*! \brief This is a value that we will use to let the wrapping mechanism move the cursor
+ *         backward and forward xmldoc_max_diff positions before cutting the middle of a
+ *         word, trying to find a space or a \n. */
+static const int xmldoc_max_diff = 5;
 /*! \brief XML documentation language. */
 static char documentation_language[80];
-/*! \brief XML documentation tree. */
+/*! \brief XML documentation tree, here we will allocate the pointers to the
+ *         ast_xml_docs open. */
 struct documentation_tree {
 	char *filename;
 	ast_xml_doc *doc;
-	AST_LIST_ENTRY(documentation_tree) entry;
+	AST_RWLIST_ENTRY(documentation_tree) entry;
 };
-static AST_LIST_HEAD_STATIC(xmldoc_tree, documentation_tree);
+static AST_RWLIST_HEAD_STATIC(xmldoc_tree, documentation_tree);
 #endif
 
 static int pbx_builtin_answer(struct ast_channel *, void *);
@@ -3005,38 +3012,13 @@
 	if (!(acf = ast_custom_function_find(a->argv[3]))) {
 		ast_cli(a->fd, "No function by that name registered.\n");
 		return CLI_FAILURE;
-
-	}
-#ifndef XML_DOCUMENTATION
-	if (acf->synopsis)
-		synopsis_size = strlen(acf->synopsis) + 23;
-	else
-		synopsis_size = strlen("Not available") + 23;
-	synopsis = alloca(synopsis_size);
-
-	if (acf->desc)
-		description_size = strlen(acf->desc) + 23;
-	else
-		description_size = strlen("Not available") + 23;
-	description = alloca(description_size);
-
-	if (acf->arguments)
-		arguments_size = strlen(acf->arguments) + 23;
-	else
-		arguments_size = strlen("Not available") + 23;
-	arguments = alloca(arguments_size);
-
-	if (acf->seealso)
-		seealso_size = strlen(acf->seealso) + 23;
-	else
-		seealso_size = strlen("Not available") + 23;
-	seealso = alloca(seealso_size);	
-#endif
+	}
+
 	if (acf->syntax)
 		syntax_size = strlen(acf->syntax) + 23;
 	else
 		syntax_size = strlen("Not available") + 23;
-	syntax = alloca(syntax_size);
+	syntax = ast_malloc(syntax_size);
 
 	snprintf(info, 64 + AST_MAX_APP, "\n  -= Info about function '%s' =- \n\n", acf->name);
 	term_color(infotitle, info, COLOR_MAGENTA, 0, 64 + AST_MAX_APP + 22);
@@ -3045,37 +3027,51 @@
 	term_color(syntitle, "[Synopsis]\n", COLOR_MAGENTA, 0, 40);
 	term_color(destitle, "[Description]\n", COLOR_MAGENTA, 0, 40);
 	term_color(seealsotitle, "[See Also]\n", COLOR_MAGENTA, 0, 40);
-	term_color(syntax,
-		   acf->syntax ? acf->syntax : "Not available",
-		   COLOR_CYAN, 0, syntax_size);
+	term_color(syntax, acf->syntax ? acf->syntax : "Not available", COLOR_CYAN, 0, syntax_size);
 #ifdef XML_DOCUMENTATION
 	arguments = xmldoc_colorization(acf->arguments ? acf->arguments : "Not available", COLOR_CYAN, COLOR_BLACK);
 	synopsis = xmldoc_colorization(acf->synopsis ? acf->synopsis : "Not available", COLOR_CYAN, COLOR_BLACK);
 	description = xmldoc_colorization(acf->desc ? acf->desc : "Not available", COLOR_CYAN, COLOR_BLACK);
 	seealso = xmldoc_colorization(acf->seealso ? acf->seealso : "Not available", COLOR_CYAN, COLOR_BLACK);
 #else
-	term_color(arguments,
-		  acf->arguments ? acf->arguments : "Not available",
-		  COLOR_CYAN, 0, arguments_size);
-	term_color(synopsis,
-		  acf->synopsis ? acf->synopsis : "Not available",
-		  COLOR_CYAN, 0, synopsis_size);
-	term_color(description,
-		  acf->desc ? acf->desc : "Not available",
-		  COLOR_CYAN, 0, description_size);
-	term_color(seealso,
-		  acf->seealso ? acf->seealso : "Not available",
-		  COLOR_CYAN, 0, seealso_size);
+	if (acf->synopsis)
+		synopsis_size = strlen(acf->synopsis) + 23;
+	else
+		synopsis_size = strlen("Not available") + 23;
+	synopsis = ast_malloc(synopsis_size);
+
+	if (acf->desc)
+		description_size = strlen(acf->desc) + 23;
+	else
+		description_size = strlen("Not available") + 23;
+	description = ast_malloc(description_size);
+
+	if (acf->arguments)
+		arguments_size = strlen(acf->arguments) + 23;
+	else
+		arguments_size = strlen("Not available") + 23;
+	arguments = ast_malloc(arguments_size);
+
+	if (acf->seealso)
+		seealso_size = strlen(acf->seealso) + 23;
+	else
+		seealso_size = strlen("Not available") + 23;
+	seealso = ast_malloc(seealso_size);
+
+	term_color(arguments, acf->arguments ? acf->arguments : "Not available", COLOR_CYAN, 0, arguments_size);
+	term_color(synopsis, acf->synopsis ? acf->synopsis : "Not available", COLOR_CYAN, 0, synopsis_size);
+	term_color(description, acf->desc ? acf->desc : "Not available", COLOR_CYAN, 0, description_size);
+	term_color(seealso, acf->seealso ? acf->seealso : "Not available", COLOR_CYAN, 0, seealso_size);
 #endif
 
 	ast_cli(a->fd,"%s%s%s\n\n%s%s\n\n%s%s\n\n%s%s\n\n%s%s\n", infotitle, stxtitle, syntax, argtitle, arguments, 
 		syntitle, synopsis, destitle, description, seealsotitle, seealso);
-#ifdef XML_DOCUMENTATION
+
 	ast_free(arguments);
 	ast_free(synopsis);
 	ast_free(description);
 	ast_free(seealso);
-#endif
+	ast_free(syntax);
 
 	return CLI_SUCCESS;
 }
@@ -3125,12 +3121,12 @@
 
 #ifdef XML_DOCUMENTATION
 static const struct strcolorized_tags {
-	char *init;		/*!< Replace initial tag with this string. */
-	char *end;		/*!< Replace end tag with this string. */
-	int colorfg;		/*!< Foreground color. */
-	int colorbg;		/*!< Background color. */
-	char *inittag;		/*!< Initial tag description. */
-	char *endtag;		/*!< Ending tag description. */
+	const char *init;		/*!< Replace initial tag with this string. */
+	const char *end;		/*!< Replace end tag with this string. */
+	const int colorfg;		/*!< Foreground color. */
+	const int colorbg;		/*!< Background color. */
+	const char *inittag;		/*!< Initial tag description. */
+	const char *endtag;		/*!< Ending tag description. */
 } colorized_tags[] = {
 	{ "<", ">", COLOR_GREEN, COLOR_BLACK, "<replaceable>", "</replaceable>" },
 	{ "\'", "\'", COLOR_BLUE, COLOR_BLACK, "<literal>", "</literal>" },
@@ -3148,9 +3144,9 @@
 };
 
 static const struct strspecial_tags {
-	char *tagname;		/*!< Special tag name. */
-	char *init;		/*!< Print this at the beginning. */
-	char *end;		/*!< Print this at the end. */
+	const char *tagname;		/*!< Special tag name. */
+	const char *init;		/*!< Print this at the beginning. */
+	const char *end;		/*!< Print this at the end. */
 } special_tags[] = {
 	{ "note", "<note>NOTE:</note> ", "" },
 	{ "warning", "<warning>WARNING!!!:</warning> ", "" }
@@ -3399,7 +3395,7 @@
 
 	/* Wrap the text, notice that string wrap will avoid cutting an ESC sequence. */
 	if (colorized) {
-		wrapped = xmldoc_string_wrap(colorized, XMLDOC_TEXT_COLUMNS, XMLDOC_MAX_DIFF);
+		wrapped = xmldoc_string_wrap(colorized, xmldoc_text_columns, xmldoc_max_diff);
 		ast_free(colorized);
 	}
 
@@ -3460,7 +3456,7 @@
 	struct documentation_tree *doctree;
 	char *lang;
 
-	AST_LIST_LOCK(&xmldoc_tree);
+	AST_RWLIST_RDLOCK(&xmldoc_tree);
 	AST_LIST_TRAVERSE(&xmldoc_tree, doctree, entry) {
 		/* the core xml documents have priority over thirdparty document. */
 		node = ast_xml_get_root(doctree->doc);
@@ -3485,16 +3481,16 @@
 			node = ast_xml_get_root(doctree->doc);
 			if (node->AST_XML_CHILD) {
 				if ((node = ast_xml_find_element(node->AST_XML_CHILD, type, "name", name))) {
-					AST_LIST_UNLOCK(&xmldoc_tree);
+					AST_RWLIST_UNLOCK(&xmldoc_tree);
 					return node;
 				}
 			}
 		} else {
-			AST_LIST_UNLOCK(&xmldoc_tree);
+			AST_RWLIST_UNLOCK(&xmldoc_tree);
 			return node;
 		}
 	}
-	AST_LIST_UNLOCK(&xmldoc_tree);
+	AST_RWLIST_UNLOCK(&xmldoc_tree);
 
 	return NULL;
 }
@@ -6310,7 +6306,7 @@
 	glob_t globbuf;
 
 	/* setup default XML documentation language */
-	snprintf(documentation_language, sizeof(documentation_language), DEFAULT_DOCUMENTATION_LANGUAGE);
+	snprintf(documentation_language, sizeof(documentation_language), default_documentation_language);
 
 	if (!(cfg = ast_config_load("asterisk.conf", cnfflags))) {
 		ast_log(LOG_ERROR, "No asterisk.conf? That cannot be good.\n");
@@ -6343,7 +6339,7 @@
 	}
 	ast_free(xmlpattern);
 
-	AST_LIST_LOCK(&xmldoc_tree);
+	AST_RWLIST_WRLOCK(&xmldoc_tree);
 	/* loop over expanded files */
 	for (i = 0; i < globbuf.gl_pathc; i++) {
 		tmpdoc = NULL;
@@ -6373,9 +6369,9 @@
 		}
 		doc_tree->doc = tmpdoc;
 		doc_tree->filename = ast_strdup(globbuf.gl_pathv[i]);
-		AST_LIST_INSERT_TAIL(&xmldoc_tree, doc_tree, entry);
-	}
-	AST_LIST_UNLOCK(&xmldoc_tree);
+		AST_RWLIST_INSERT_TAIL(&xmldoc_tree, doc_tree, entry);
+	}
+	AST_RWLIST_UNLOCK(&xmldoc_tree);
 
 	globfree(&globbuf);
 
@@ -6468,10 +6464,10 @@
 				char infotitle[64 + AST_MAX_APP + 22], syntitle[40], destitle[40], stxtitle[40], argtitle[40];
 				char seealsotitle[40];
 				char info[64 + AST_MAX_APP], *synopsis = NULL, *description = NULL, *syntax = NULL, *arguments = NULL;
-				char *seealso;
+				char *seealso = NULL;
 				int syntax_size;
 #ifndef XML_DOCUMENTATION
-				int synopsis_size, description_size, arguments_size, seealso_size; 
+				int synopsis_size, description_size, arguments_size, seealso_size;
 #endif
 
 				no_registered_app = 0;
@@ -6480,32 +6476,31 @@
 					synopsis_size = strlen(aa->synopsis) + 23;
 				else
 					synopsis_size = strlen("Not available") + 23;
-				synopsis = alloca(synopsis_size);
+				synopsis = ast_malloc(synopsis_size);
 
 				if (aa->description)
 					description_size = strlen(aa->description) + 23;
 				else
 					description_size = strlen("Not available") + 23;
-				description = alloca(description_size);
+				description = ast_malloc(description_size);
+
+				if (aa->arguments)
+					arguments_size = strlen(aa->arguments) + 23;
+				else
+					arguments_size = strlen("Not available") + 23;
+				arguments = ast_malloc(arguments_size);
+
+				if (aa->seealso)
+					seealso_size = strlen(aa->seealso) + 23;
+				else
+					seealso_size = strlen("Not available") + 23;
+				seealso = ast_malloc(seealso_size);
 #endif
 				if (aa->syntax)
 					syntax_size = strlen(aa->syntax) + 23;
 				else
 					syntax_size = strlen("Not available") + 23;
-				syntax = alloca(syntax_size);
-#ifndef XML_DOCUMENTATION
-				if (aa->arguments)
-					arguments_size = strlen(aa->arguments) + 23;
-				else
-					arguments_size = strlen("Not available") + 23;
-				arguments = alloca(arguments_size);
-			
-				if (aa->seealso)
-					seealso_size = strlen(aa->seealso) + 23;
-				else
-					seealso_size = strlen("Not available") + 23;
-				seealso = alloca(seealso_size);
-#endif
+				syntax = ast_malloc(syntax_size);
 
 #ifdef XML_DOCUMENTATION
 				if (syntax) {
@@ -6520,37 +6515,20 @@
 					term_color(destitle, "[Description]\n", COLOR_MAGENTA, 0, 40);
 					term_color(seealsotitle, "[See Also]\n", COLOR_MAGENTA, 0, 40);
 #ifdef XML_DOCUMENTATION
-					description = xmldoc_colorization(aa->description ? aa->description : "Not available", COLOR_CYAN, COLOR_BLACK);
-					arguments = xmldoc_colorization(aa->arguments ? aa->arguments : "Not available", COLOR_CYAN, COLOR_BLACK);
-					synopsis = xmldoc_colorization(aa->synopsis ? aa->synopsis : "Not available", COLOR_CYAN, COLOR_BLACK);
-					seealso = xmldoc_colorization(aa->seealso ? aa->seealso : "Not available", COLOR_CYAN, COLOR_BLACK);
+					description = xmldoc_colorization(S_OR(aa->description, "Not available"), COLOR_CYAN, COLOR_BLACK);
+					arguments = xmldoc_colorization(S_OR(aa->arguments, "Not available"), COLOR_CYAN, COLOR_BLACK);
+					synopsis = xmldoc_colorization(S_OR(aa->synopsis, "Not available"), COLOR_CYAN, COLOR_BLACK);
+					seealso = xmldoc_colorization(S_OR(aa->seealso, "Not available"), COLOR_CYAN, COLOR_BLACK);
 #else
-					term_color(synopsis,
-									aa->synopsis ? aa->synopsis : "Not available",
-									COLOR_CYAN, 0, synopsis_size);
-
-					term_color(description,
-									aa->description ? aa->description : "Not available",
-									COLOR_CYAN, 0, description_size);
-					term_color(arguments,
-									aa->arguments ? aa->arguments : "Not available",
-									COLOR_CYAN, 0, arguments_size);
-					term_color(seealso,
-									aa->seealso ? aa->seealso : "Not available",
-									COLOR_CYAN, 0, seealso_size);
+					term_color(synopsis, S_OR(aa->synopsis, "Not available"), COLOR_CYAN, 0, synopsis_size);
+					term_color(description, S_OR(aa->description, "Not available"),	COLOR_CYAN, 0, description_size);
+					term_color(arguments, S_OR(aa->arguments, "Not available"), COLOR_CYAN, 0, arguments_size);
+					term_color(seealso, S_OR(aa->seealso, "Not available"), COLOR_CYAN, 0, seealso_size);
 #endif
-					term_color(syntax,
-									aa->syntax ? aa->syntax : "Not available",
-									COLOR_CYAN, 0, syntax_size);
+					term_color(syntax, S_OR(aa->syntax, "Not available"), COLOR_CYAN, 0, syntax_size);
 
 					ast_cli(a->fd,"%s%s%s\n\n%s%s\n\n%s%s\n\n%s%s\n\n%s%s\n", infotitle, stxtitle, syntax, argtitle, 
 						arguments, syntitle, synopsis, destitle, description, seealsotitle, seealso);
-#ifdef XML_DOCUMENTATION
-					ast_free(description);
-					ast_free(arguments);
-					ast_free(synopsis);
-					ast_free(seealso);
-#endif
 				} else {
 					/* ... one of our applications, show info ...*/
 					ast_cli(a->fd,"\n  -= Info about application '%s' =- \n\n"
@@ -6560,12 +6538,17 @@
 						"[Description]\n%s\n"
 						"[See Also]\n%s\n",
 						aa->name,
-						aa->syntax ? aa->syntax : "Not available",
-						aa->arguments ? aa->arguments : "Not available",
-						aa->synopsis ? aa->synopsis : "Not available",
-						aa->description ? aa->description : "Not available",
-						aa->seealso ? aa->seealso : "Not available");
+						S_OR(aa->syntax, "Not available"),
+						S_OR(aa->arguments, "Not available"),
+						S_OR(aa->synopsis, "Not available"),
+						S_OR(aa->description, "Not available"),
+						S_OR(aa->seealso, "Not available"));
 				}
+				ast_free(description);
+				ast_free(arguments);
+				ast_free(synopsis);
+				ast_free(seealso);
+				ast_free(syntax);
 			}
 		}
 	}




More information about the asterisk-commits mailing list