[asterisk-commits] tilghman: branch 1.6.0 r210909 - in /branches/1.6.0: ./ apps/ include/asteris...

SVN commits to the Asterisk project asterisk-commits at lists.digium.com
Thu Aug 6 16:32:27 CDT 2009


Author: tilghman
Date: Thu Aug  6 16:32:23 2009
New Revision: 210909

URL: http://svn.asterisk.org/svn-view/asterisk?view=rev&rev=210909
Log:
Merged revisions 210908 via svnmerge from 
https://origsvn.digium.com/svn/asterisk/trunk

........
  r210908 | tilghman | 2009-08-06 16:29:26 -0500 (Thu, 06 Aug 2009) | 9 lines
  
  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:
    branches/1.6.0/   (props changed)
    branches/1.6.0/apps/app_stack.c
    branches/1.6.0/include/asterisk/app.h
    branches/1.6.0/main/app.c

Propchange: branches/1.6.0/
------------------------------------------------------------------------------
Binary property 'trunk-merged' - no diff available.

Modified: branches/1.6.0/apps/app_stack.c
URL: http://svn.asterisk.org/svn-view/asterisk/branches/1.6.0/apps/app_stack.c?view=diff&rev=210909&r1=210908&r2=210909
==============================================================================
--- branches/1.6.0/apps/app_stack.c (original)
+++ branches/1.6.0/apps/app_stack.c Thu Aug  6 16:32:23 2009
@@ -264,7 +264,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;
 
@@ -326,13 +326,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))

Modified: branches/1.6.0/include/asterisk/app.h
URL: http://svn.asterisk.org/svn-view/asterisk/branches/1.6.0/include/asterisk/app.h?view=diff&rev=210909&r1=210908&r2=210909
==============================================================================
--- branches/1.6.0/include/asterisk/app.h (original)
+++ branches/1.6.0/include/asterisk/app.h Thu Aug  6 16:32:23 2009
@@ -324,7 +324,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.
@@ -337,12 +339,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)
 
@@ -353,7 +358,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: branches/1.6.0/main/app.c
URL: http://svn.asterisk.org/svn-view/asterisk/branches/1.6.0/main/app.c?view=diff&rev=210909&r1=210908&r2=210909
==============================================================================
--- branches/1.6.0/main/app.c (original)
+++ branches/1.6.0/main/app.c Thu Aug  6 16:32:23 2009
@@ -1031,7 +1031,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;
@@ -1054,12 +1057,18 @@
 					paren--;
 			} 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';
@@ -1075,6 +1084,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 asterisk-commits mailing list