version 1.72, 2006/03/17 13:40:41 |
version 1.73, 2006/03/27 06:13:51 |
|
|
* Split a string <str> of <sep>-separated values and allocate |
* Split a string <str> of <sep>-separated values and allocate |
* an argument vector for the values found. |
* an argument vector for the values found. |
*/ |
*/ |
char ** |
struct cvs_argvector * |
cvs_strsplit(char *str, const char *sep) |
cvs_strsplit(char *str, const char *sep) |
{ |
{ |
char **argv, **nargv; |
struct cvs_argvector *av; |
|
char **nargv; |
char *cp, *p; |
char *cp, *p; |
int i = 0; |
int i = 0; |
|
|
cp = xstrdup(str); |
cp = xstrdup(str); |
argv = (char **)xmalloc((i+1) * sizeof(char *)); |
av = xmalloc(sizeof(struct cvs_argvector)); |
|
av->str = cp; |
|
av->argv = (char **)xmalloc((i+1) * sizeof(char *)); |
|
|
while ((p = strsep(&cp, sep)) != NULL) { |
while ((p = strsep(&cp, sep)) != NULL) { |
argv[i++] = p; |
av->argv[i++] = p; |
nargv = (char **)xrealloc((void *)argv, (i+1) * sizeof(char *)); |
nargv = (char **)xrealloc((void *)av->argv, |
argv = nargv; |
(i+1) * sizeof(char *)); |
|
av->argv = nargv; |
} |
} |
argv[i] = NULL; |
av->argv[i] = NULL; |
|
|
return (argv); |
return (av); |
|
} |
|
|
|
/* |
|
* cvs_argv_destroy() |
|
* |
|
* Free an argument vector previously allocated by cvs_strsplit(). |
|
*/ |
|
void |
|
cvs_argv_destroy(struct cvs_argvector *av) |
|
{ |
|
xfree(av->str); |
|
xfree(av->argv); |
|
xfree(av); |
} |
} |