Added a tokenizer util function.
authorFredrik Tolf <fredrik@dolda2000.com>
Wed, 17 Dec 2008 05:36:36 +0000 (06:36 +0100)
committerFredrik Tolf <fredrik@dolda2000.com>
Wed, 17 Dec 2008 05:36:36 +0000 (06:36 +0100)
lib/utils.c
lib/utils.h

index a5faaa6..3dda9e5 100644 (file)
@@ -18,6 +18,8 @@
 
 #include <stdlib.h>
 #include <stdio.h>
+#include <string.h>
+#include <ctype.h>
 
 #ifdef HAVE_CONFIG_H
 #include <config.h>
@@ -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);
+}
index 6b1df4e..2b9d1df 100644 (file)
@@ -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