[svn-commits] tilghman: trunk r210908 - in /trunk: apps/ include/asterisk/ main/

SVN commits to the Digium repositories svn-commits at lists.digium.com
Thu Aug 6 16:29:31 CDT 2009


Author: tilghman
Date: Thu Aug  6 16:29:26 2009
New Revision: 210908

URL: http://svn.asterisk.org/svn-view/asterisk?view=rev&rev=210908
Log:
Allow Gosub to recognize quote delimiters without consuming them.
(closes issue #15557)
 Reported by: rain
 Patches: 
       20090723__issue15557.diff.txt uploaded by tilghman (license 14)
 Tested by: rain
 
Review: https://reviewboard.asterisk.org/r/316/

Modified:
    trunk/apps/app_stack.c
    trunk/include/asterisk/app.h
    trunk/main/app.c

Modified: trunk/apps/app_stack.c
URL: http://svn.asterisk.org/svn-view/asterisk/trunk/apps/app_stack.c?view=diff&rev=210908&r1=210907&r2=210908
==============================================================================
--- trunk/apps/app_stack.c (original)
+++ trunk/apps/app_stack.c Thu Aug  6 16:29:26 2009
@@ -380,7 +380,7 @@
 			*endparen = '\0';
 		else
 			ast_log(LOG_WARNING, "Ouch.  No closing paren: '%s'?\n", (char *)data);
-		AST_STANDARD_APP_ARGS(args2, tmp);
+		AST_STANDARD_RAW_ARGS(args2, tmp);
 	} else
 		args2.argc = 0;
 
@@ -444,13 +444,13 @@
 	}
 
 	args = ast_strdupa(data);
-	AST_NONSTANDARD_APP_ARGS(cond, args, '?');
+	AST_NONSTANDARD_RAW_ARGS(cond, args, '?');
 	if (cond.argc != 2) {
 		ast_log(LOG_WARNING, "GosubIf requires an argument: GosubIf(cond?label1(args):label2(args)\n");
 		return 0;
 	}
 
-	AST_NONSTANDARD_APP_ARGS(label, cond.labels, ':');
+	AST_NONSTANDARD_RAW_ARGS(label, cond.labels, ':');
 
 	if (pbx_checkcondition(cond.ition)) {
 		if (!ast_strlen_zero(label.iftrue))
@@ -532,7 +532,7 @@
 		return -1;
 	}
 
-	AST_STANDARD_APP_ARGS(args, data);
+	AST_STANDARD_RAW_ARGS(args, data);
 	n = atoi(args.n);
 	*buf = '\0';
 

Modified: trunk/include/asterisk/app.h
URL: http://svn.asterisk.org/svn-view/asterisk/trunk/include/asterisk/app.h?view=diff&rev=210908&r1=210907&r2=210908
==============================================================================
--- trunk/include/asterisk/app.h (original)
+++ trunk/include/asterisk/app.h Thu Aug  6 16:29:26 2009
@@ -380,7 +380,9 @@
   the argc argument counter field.
  */
 #define AST_STANDARD_APP_ARGS(args, parse) \
-	args.argc = ast_app_separate_args(parse, ',', args.argv, ((sizeof(args) - offsetof(typeof(args), argv)) / sizeof(args.argv[0])))
+	args.argc = __ast_app_separate_args(parse, ',', 1, args.argv, ((sizeof(args) - offsetof(typeof(args), argv)) / sizeof(args.argv[0])))
+#define AST_STANDARD_RAW_ARGS(args, parse) \
+	args.argc = __ast_app_separate_args(parse, ',', 0, args.argv, ((sizeof(args) - offsetof(typeof(args), argv)) / sizeof(args.argv[0])))
 
 /*!
   \brief Performs the 'nonstandard' argument separation process for an application.
@@ -393,12 +395,15 @@
   the argc argument counter field.
  */
 #define AST_NONSTANDARD_APP_ARGS(args, parse, sep) \
-	args.argc = ast_app_separate_args(parse, sep, args.argv, ((sizeof(args) - offsetof(typeof(args), argv)) / sizeof(args.argv[0])))
+	args.argc = __ast_app_separate_args(parse, sep, 1, args.argv, ((sizeof(args) - offsetof(typeof(args), argv)) / sizeof(args.argv[0])))
+#define AST_NONSTANDARD_RAW_ARGS(args, parse, sep) \
+	args.argc = __ast_app_separate_args(parse, sep, 0, args.argv, ((sizeof(args) - offsetof(typeof(args), argv)) / sizeof(args.argv[0])))
 
 /*!
   \brief Separate a string into arguments in an array
   \param buf The string to be parsed (this must be a writable copy, as it will be modified)
   \param delim The character to be used to delimit arguments
+  \param remove_chars Remove backslashes and quote characters, while parsing
   \param array An array of 'char *' to be filled in with pointers to the found arguments
   \param arraylen The number of elements in the array (i.e. the number of arguments you will accept)
 
@@ -409,7 +414,8 @@
 
   \return The number of arguments found, or zero if the function arguments are not valid.
 */
-unsigned int ast_app_separate_args(char *buf, char delim, char **array, int arraylen);
+unsigned int __ast_app_separate_args(char *buf, char delim, int remove_chars, char **array, int arraylen);
+#define ast_app_separate_args(a,b,c,d)	__ast_app_separate_args(a,b,1,c,d)
 
 /*!
   \brief A structure to hold the description of an application 'option'.

Modified: trunk/main/app.c
URL: http://svn.asterisk.org/svn-view/asterisk/trunk/main/app.c?view=diff&rev=210908&r1=210907&r2=210908
==============================================================================
--- trunk/main/app.c (original)
+++ trunk/main/app.c Thu Aug  6 16:29:26 2009
@@ -1174,7 +1174,10 @@
 	return AST_RWLIST_UNLOCK(&groups);
 }
 
-unsigned int ast_app_separate_args(char *buf, char delim, char **array, int arraylen)
+#undef ast_app_separate_args
+unsigned int ast_app_separate_args(char *buf, char delim, char **array, int arraylen);
+
+unsigned int __ast_app_separate_args(char *buf, char delim, int remove_chars, char **array, int arraylen)
 {
 	int argc;
 	char *scan, *wasdelim = NULL;
@@ -1199,12 +1202,18 @@
 				}
 			} else if (*scan == '"' && delim != '"') {
 				quote = quote ? 0 : 1;
-				/* Remove quote character from argument */
-				memmove(scan, scan + 1, strlen(scan));
-				scan--;
+				if (remove_chars) {
+					/* Remove quote character from argument */
+					memmove(scan, scan + 1, strlen(scan));
+					scan--;
+				}
 			} else if (*scan == '\\') {
-				/* Literal character, don't parse */
-				memmove(scan, scan + 1, strlen(scan));
+				if (remove_chars) {
+					/* Literal character, don't parse */
+					memmove(scan, scan + 1, strlen(scan));
+				} else {
+					scan++;
+				}
 			} else if ((*scan == delim) && !paren && !quote) {
 				wasdelim = scan;
 				*scan++ = '\0';
@@ -1220,6 +1229,12 @@
 	}
 
 	return argc;
+}
+
+/* ABI compatible function */
+unsigned int ast_app_separate_args(char *buf, char delim, char **array, int arraylen)
+{
+	return __ast_app_separate_args(buf, delim, 1, array, arraylen);
 }
 
 static enum AST_LOCK_RESULT ast_lock_path_lockfile(const char *path)




More information about the svn-commits mailing list