Fix up sys*stat
[akaros.git] / kern / src / ns / tokenize.c
1 // INFERNO
2 #include <vfs.h>
3 #include <kfs.h>
4 #include <slab.h>
5 #include <kmalloc.h>
6 #include <kref.h>
7 #include <string.h>
8 #include <stdio.h>
9 #include <assert.h>
10 #include <error.h>
11 #include <cpio.h>
12 #include <pmap.h>
13 #include <smp.h>
14 #include <ip.h>
15
16 static char qsep[] = " \t\r\n";
17
18 static char *qtoken(char *s)
19 {
20         int quoting;
21         char *t;
22
23         quoting = 0;
24         t = s;  /* s is output string, t is input string */
25         while (*t != '\0' && (quoting || /*utfrune */ strchr(qsep, *t) == NULL)) {
26                 if (*t != '\'') {
27                         *s++ = *t++;
28                         continue;
29                 }
30                 /* *t is a quote */
31                 if (!quoting) {
32                         quoting = 1;
33                         t++;
34                         continue;
35                 }
36                 /* quoting and we're on a quote */
37                 if (t[1] != '\'') {
38                         /* end of quoted section; absorb closing quote */
39                         t++;
40                         quoting = 0;
41                         continue;
42                 }
43                 /* doubled quote; fold one quote into two */
44                 t++;
45                 *s++ = *t++;
46         }
47         if (*s != '\0') {
48                 *s = '\0';
49                 if (t == s)
50                         t++;
51         }
52         return t;
53 }
54
55 int tokenize(char *s, char **args, int maxargs)
56 {
57         int nargs;
58
59         for (nargs = 0; nargs < maxargs; nargs++) {
60                 while (*s != '\0' && /*utfrune */ strchr(qsep, *s) != NULL)
61                         s++;
62                 if (*s == '\0')
63                         break;
64                 args[nargs] = s;
65                 s = qtoken(s);
66         }
67
68         return nargs;
69 }