X-Git-Url: http://git.tuebingen.mpg.de/?p=paraslash.git;a=blobdiff_plain;f=string.c;h=78b862c933ced61396aadb6df04f43d8185eee21;hp=156404c48ccf7036db2b875c1f1c3832a2a6f123;hb=2349dbb8c69a97f271c8cb8440016ac5afc34dab;hpb=a4bfba86151b74bc2abb9d54d45d48db3c11496f diff --git a/string.c b/string.c index 156404c4..78b862c9 100644 --- a/string.c +++ b/string.c @@ -18,13 +18,16 @@ /** \file string.c memory allocation and string handling functions */ -#include /* gettimeofday */ #include "para.h" +#include "string.h" + +#include /* gettimeofday */ #include #include #include /* uname() */ +#include + #include "error.h" -#include "string.h" /** * paraslash's version of realloc() @@ -374,37 +377,40 @@ __must_check __malloc char *para_homedir(void) * This function modifies \a args by replacing each occurance of \a delim by * zero. A NULL-terminated array of pointers to char* is allocated dynamically * and these pointers are initialized to point to the broken-up substrings - * within \a args. A pointer to this array is returned via \a argv_ptr. + * within \a args. A pointer to this array is returned via \a argv_ptr. It's OK + * to call this function with \a args == NULL. * * \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 = strchr(p, delim))) { - p++; + while ((i = strcspn(p, delim)) && (p += i)) { + p += strspn(p, delim); n++; } - *argv_ptr = para_malloc((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 + 1] = NULL; + argv[n] = NULL; return n; }