diff options
author | markster <markster@f38db490-d61c-443f-a65b-d21fe96a405b> | 2005-08-06 16:52:56 +0000 |
---|---|---|
committer | markster <markster@f38db490-d61c-443f-a65b-d21fe96a405b> | 2005-08-06 16:52:56 +0000 |
commit | 74332ff7e3a9569ca73d0b1114b4802229ed70d5 (patch) | |
tree | 3db947a62e4d2267bc238b3f915bcb86b0fc3b99 /app.c | |
parent | 9a919db5e8b1c38611ea2fbe29f182df26ab4e3f (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-x | app.c | 33 |
1 files changed, 19 insertions, 14 deletions
@@ -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) |