*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;
}
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))
return -1;
}
- AST_STANDARD_APP_ARGS(args, data);
+ AST_STANDARD_RAW_ARGS(args, data);
n = atoi(args.n);
*buf = '\0';
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.
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)
\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'.
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;
}
} 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';
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)
{
char *s;