*
* \return The number of substrings found in \a args.
*/
-__must_check unsigned split_args(char *args, char ***argv_ptr, int delim)
+
+__must_check unsigned split_args(char *args, char ***argv_ptr, const char *delim)
{
char *p = args;
char **argv;
- ssize_t n = 0, i;
+ size_t n = 0, i, j;
- while (p && (p = strchr(p, delim))) {
- p++;
+ while ((i = strcspn(p, delim)) && (p += i)) {
+ p += strspn(p, delim);
n++;
}
- *argv_ptr = para_calloc((n + 3) * sizeof(char *));
+ *argv_ptr = para_malloc((n + 1) * sizeof(char *));
argv = *argv_ptr;
i = 0;
p = args;
-// printf("split_args: a:%s\n", p);
while (p) {
argv[i] = p;
- p = strchr(p, delim);
- if (p) {
-// printf("a:%s\n", p);
+ j = strcspn(p, delim);
+ if (!j)
+ break;
+ p += strcspn(p, delim);
+ if (*p) {
*p = '\0';
-// printf("b:\n");
p++;
- i++;
+ p += strspn(p, delim);
}
+ i++;
}
+ argv[n] = NULL;
return n;
}