diff --git a/app.c b/app.c index bc16d6ee589054f68911db1fb935cc3d5c678fec..cfca2bd75e0cf9506507bc3cf9d4cbf0de4454aa 100755 --- a/app.c +++ b/app.c @@ -1069,16 +1069,29 @@ 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 = 0; - memset(array, 0, arraylen * sizeof(char *)); - if (!buf) + int x; + char *scan; + char delims[2]; + + if (!buf || !array || !arraylen) return 0; - for (array[x] = buf ; x < arraylen && array[x]; x++) { - if ((array[x+1] = strchr(array[x], delim))) { - *array[x+1] = '\0'; - array[x+1]++; - } + + 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; } + + array[x++] = scan; + return x; } diff --git a/include/asterisk/app.h b/include/asterisk/app.h index b50dfe36b5f0f0d7f154b8d20ae3c913143d39b5..8d571e28eb29293b9fb93bacb84c5faf1c039e09 100755 --- a/include/asterisk/app.h +++ b/include/asterisk/app.h @@ -162,7 +162,18 @@ int ast_app_group_get_count(char *group, char *category); /*! Get the current channel count of all groups that match the specified pattern and category. */ int ast_app_group_match_get_count(char *groupmatch, char *category); -/*! Create an argc argv type structure for app args */ +/*! + \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 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) + + Note: if there are more arguments in the string than the array will hold, the last element of + the array will contain the remaining arguments, not separated. + + \return The number of arguments found, or zero if the function arguments are not valid. +*/ int ast_separate_app_args(char *buf, char delim, char **array, int arraylen); /*! Present a dialtone and collect a certain length extension. Returns 1 on valid extension entered, -1 on hangup, or 0 on invalid extension. Note that if 'collect' holds digits already, new digits will be appended, so be sure it's initialized properly */