From 523911c9b0e66e3f49e1ce3d43bb006117cbc25e Mon Sep 17 00:00:00 2001
From: "Kevin P. Fleming" <kpfleming@digium.com>
Date: Wed, 4 May 2005 03:43:10 +0000
Subject: [PATCH] re-implement ast_separate_app_args with clearer code and in a
 way that doesn't fail with certain combinations of array size and delimiter
 count add doxygen docs for ast_separate_app_args

git-svn-id: https://origsvn.digium.com/svn/asterisk/trunk@5566 65c4cc65-6c06-0410-ace0-fbb531ad65f3
---
 app.c                  | 29 +++++++++++++++++++++--------
 include/asterisk/app.h | 13 ++++++++++++-
 2 files changed, 33 insertions(+), 9 deletions(-)

diff --git a/app.c b/app.c
index bc16d6ee58..cfca2bd75e 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 b50dfe36b5..8d571e28eb 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 */
-- 
GitLab