aboutsummaryrefslogtreecommitdiffstats
path: root/app.c
diff options
context:
space:
mode:
authormarkster <markster@f38db490-d61c-443f-a65b-d21fe96a405b>2005-08-06 16:52:56 +0000
committermarkster <markster@f38db490-d61c-443f-a65b-d21fe96a405b>2005-08-06 16:52:56 +0000
commit74332ff7e3a9569ca73d0b1114b4802229ed70d5 (patch)
tree3db947a62e4d2267bc238b3f915bcb86b0fc3b99 /app.c
parent9a919db5e8b1c38611ea2fbe29f182df26ab4e3f (diff)
Properly handle | within ()'s when doing app arg parsing... (bug #4911)
git-svn-id: http://svn.digium.com/svn/asterisk/trunk@6294 f38db490-d61c-443f-a65b-d21fe96a405b
Diffstat (limited to 'app.c')
-rwxr-xr-xapp.c33
1 files changed, 19 insertions, 14 deletions
diff --git a/app.c b/app.c
index 866d5530e..e571694bd 100755
--- a/app.c
+++ b/app.c
@@ -1066,9 +1066,9 @@ int ast_app_group_match_get_count(char *groupmatch, char *category)
int ast_separate_app_args(char *buf, char delim, char **array, int arraylen)
{
- int x;
+ int argc;
char *scan;
- char delims[2];
+ int paren = 0;
if (!buf || !array || !arraylen)
return 0;
@@ -1076,21 +1076,26 @@ int ast_separate_app_args(char *buf, char delim, char **array, int arraylen)
memset(array, 0, arraylen * sizeof(*array));
scan = buf;
- delims[0] = delim;
- delims[1] = '\0';
- x = 0;
-
- while (x < arraylen - 1) {
- array[x] = strsep(&scan, delims);
- x++;
- if (!scan)
- break;
+
+ for (argc = 0; *scan && (argc < arraylen - 1); argc++) {
+ array[argc] = scan;
+ for (; *scan; scan++) {
+ if (*scan == '(')
+ paren++;
+ else if (*scan == ')') {
+ if (paren)
+ paren--;
+ } else if ((*scan == delim) && !paren) {
+ *scan++ = '\0';
+ break;
+ }
+ }
}
- if (scan)
- array[x++] = scan;
+ if (*scan)
+ array[argc++] = scan;
- return x;
+ return argc;
}
enum AST_LOCK_RESULT ast_lock_path(const char *path)