From: Fredrik Tolf Date: Wed, 17 Dec 2008 05:36:36 +0000 (+0100) Subject: Added a tokenizer util function. X-Git-Tag: 0.1~126 X-Git-Url: http://www.dolda2000.com/gitweb/?p=ashd.git;a=commitdiff_plain;h=f2b26d44416abd494ce430659cfbbf254d9c3c55 Added a tokenizer util function. --- diff --git a/lib/utils.c b/lib/utils.c index a5faaa6..3dda9e5 100644 --- a/lib/utils.c +++ b/lib/utils.c @@ -18,6 +18,8 @@ #include #include +#include +#include #ifdef HAVE_CONFIG_H #include @@ -103,3 +105,65 @@ off_t atoo(char *n) { return((off_t)strtoll(n, NULL, 10)); } + +char **tokenize(char *src) +{ + char **ret; + char *p, *p2, *n; + int s, q, cl; + + p = src; + s = 0; + ret = NULL; + while(1) { + while(isspace(*p)) + p++; + if(!*p) + break; + p2 = p; + q = 0; + while(1) { + if(q) { + if(*p == '\"') + q = 0; + else if(*p == '\\') + p++; + } else { + if(*p == '\"') + q = 1; + else if(isspace(*p) || !*p) + break; + else if(*p == '\\') + p++; + } + p++; + } + cl = p - p2; + n = memcpy(malloc(cl + 1), p2, cl); + n[cl] = 0; + for(p2 = n; *p2; cl--) { + if(*p2 == '\\') { + memmove(p2, p2 + 1, cl--); + p2++; + } else if(*p2 == '\"') { + memmove(p2, p2 + 1, cl); + } else { + p2++; + } + } + ret = realloc(ret, sizeof(char *) * (++s)); + ret[s - 1] = n; + } + ret = realloc(ret, sizeof(char *) * (++s)); + ret[s - 1] = NULL; + return(ret); +} + +void freeca(char **ca) +{ + char **c; + + for(c = ca; *c; c++) + free(*c); + free(ca); +} diff --git a/lib/utils.h b/lib/utils.h index 6b1df4e..2b9d1df 100644 --- a/lib/utils.h +++ b/lib/utils.h @@ -65,5 +65,7 @@ char *vsprintf2(char *format, va_list al); char *sprintf2(char *format, ...); char *sprintf3(char *format, ...); off_t atoo(char *n); +char **tokenize(char *src); +void freeca(char **ca); #endif