tokenize
authorRonald G. Minnich <rminnich@google.com>
Fri, 17 Jan 2014 21:34:11 +0000 (13:34 -0800)
committerRonald G. Minnich <rminnich@google.com>
Fri, 17 Jan 2014 21:34:11 +0000 (13:34 -0800)
Signed-off-by: Ronald G. Minnich <rminnich@google.com>
kern/src/ns/Kbuild
kern/src/ns/tokenize.c [new file with mode: 0644]

index e921d55..90ff868 100644 (file)
@@ -12,4 +12,5 @@ obj-y                                         += parse.o
 obj-y                                          += pgrp.o
 obj-y                                          += qio.o
 obj-y                                          += sysfile.o
+obj-y                                          += tokenize.o
 obj-y                                          += util.o
diff --git a/kern/src/ns/tokenize.c b/kern/src/ns/tokenize.c
new file mode 100644 (file)
index 0000000..070a6a8
--- /dev/null
@@ -0,0 +1,71 @@
+// INFERNO
+#include <vfs.h>
+#include <kfs.h>
+#include <slab.h>
+#include <kmalloc.h>
+#include <kref.h>
+#include <string.h>
+#include <stdio.h>
+#include <assert.h>
+#include <error.h>
+#include <cpio.h>
+#include <pmap.h>
+#include <smp.h>
+#include <ip.h>
+
+static char qsep[] = " \t\r\n";
+
+static char*
+qtoken(char *s)
+{
+       int quoting;
+       char *t;
+
+       quoting = 0;
+       t = s;  /* s is output string, t is input string */
+       while(*t!='\0' && (quoting || /*utfrune*/strchr(qsep, *t)==NULL)){
+               if(*t != '\''){
+                       *s++ = *t++;
+                       continue;
+               }
+               /* *t is a quote */
+               if(!quoting){
+                       quoting = 1;
+                       t++;
+                       continue;
+               }
+               /* quoting and we're on a quote */
+               if(t[1] != '\''){
+                       /* end of quoted section; absorb closing quote */
+                       t++;
+                       quoting = 0;
+                       continue;
+               }
+               /* doubled quote; fold one quote into two */
+               t++;
+               *s++ = *t++;
+       }
+       if(*s != '\0'){
+               *s = '\0';
+               if(t == s)
+                       t++;
+       }
+       return t;
+}
+
+int
+tokenize(char *s, char **args, int maxargs)
+{
+       int nargs;
+
+       for(nargs=0; nargs<maxargs; nargs++){
+               while(*s!='\0' && /*utfrune*/strchr(qsep, *s)!=NULL)
+                       s++;
+               if(*s == '\0')
+                       break;
+               args[nargs] = s;
+               s = qtoken(s);
+       }
+
+       return nargs;
+}