/** \file string.c memory allocation and string handling functions */
-#include <sys/time.h> /* gettimeofday */
#include "para.h"
+#include "string.h"
+
+#include <sys/time.h> /* gettimeofday */
#include <regex.h>
#include <pwd.h>
#include <sys/utsname.h> /* uname() */
+#include <string.h>
+
#include "error.h"
-#include "string.h"
/**
* paraslash's version of realloc()
*
* \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++;
+ p = args + strspn(args, delim);
+ for (;;) {
+ i = strcspn(p, delim);
+ if (!i)
+ break;
+ p += i;
n++;
+ p += strspn(p, delim);
}
- *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);
+ p = args + strspn(args, delim);
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;
}