x86: Don't enter the monitor for invalid opcode
[akaros.git] / user / iplib / tokenize.c
1 /*
2  * This file is part of the UCB release of Plan 9. It is subject to the license
3  * terms in the LICENSE file found in the top-level directory of this
4  * distribution and at http://akaros.cs.berkeley.edu/files/Plan9License. No
5  * part of the UCB release of Plan 9, including this file, may be copied,
6  * modified, propagated, or distributed except according to the terms contained
7  * in the LICENSE file.
8  */
9 /*
10
11  * Copyright 2013 Google Inc.
12  * Copyright (c) 1989-2003 by Lucent Technologies, Bell Laboratories.
13  */
14
15 #include <string.h>
16 static char qsep[] = " \t\r\n";
17
18 int sep(char *s)
19 {
20         if (strchr(qsep, *s))
21                 return 1;
22         return 0;
23 }
24 /* s is output string, t is input string.
25  * warning: modifies data in place.
26  */
27 static char *qtoken(char *s, char *sep)
28 {
29         int quoting;
30         char *t;
31
32         quoting = 0;
33         t = s;
34         while (*t != '\0' && (quoting || (strchr(sep, *t) == NULL))) {
35                 if (*t != '\'') {
36                         *s++ = *t++;
37                         continue;
38                 }
39                 /* *t is a quote */
40                 if (!quoting) {
41                         quoting = 1;
42                         t++;
43                         continue;
44                 }
45                 /* quoting and we're on a quote */
46                 if (t[1] != '\'') {
47                         /* end of quoted section; absorb closing quote */
48                         t++;
49                         quoting = 0;
50                         continue;
51                 }
52                 /* doubled quote; fold one quote into two */
53                 t++;
54                 *s++ = *t++;
55         }
56         if (*s != '\0') {
57                 *s = '\0';
58                 if (t == s)
59                         t++;
60         }
61         return t;
62 }
63
64 static char *etoken(char *t, char *sep)
65 {
66         int quoting;
67
68         /* move to end of next token */
69         quoting = 0;
70         while (*t != '\0' && (quoting || (strchr(sep, *t) == NULL))) {
71                 if (*t != '\'') {
72                         t++;
73                         continue;
74                 }
75                 /* *t is a quote */
76                 if (!quoting) {
77                         quoting = 1;
78                         t++;
79                         continue;
80                 }
81                 /* quoting and we're on a quote */
82                 if (t[1] != '\'') {
83                         /* end of quoted section; absorb closing quote */
84                         t++;
85                         quoting = 0;
86                         continue;
87                 }
88                 /* doubled quote; fold one quote into two */
89                 t += 2;
90         }
91         return t;
92 }
93
94 int gettokens(char *s, char **args, int maxargs, char *sep)
95 {
96         int nargs;
97
98         for (nargs = 0; nargs < maxargs; nargs++) {
99                 while ((*s != '\0') && (strchr(sep, *s) != NULL))
100                         *s++ = '\0';
101                 if (*s == '\0')
102                         break;
103                 args[nargs] = s;
104                 s = etoken(s, sep);
105         }
106
107         return nargs;
108 }
109
110 int tokenize(char *s, char **args, int maxargs)
111 {
112         int nargs;
113
114         for (nargs = 0; nargs < maxargs; nargs++) {
115                 while ((*s != '\0') && sep(s))
116                         s++;
117                 if (*s == '\0')
118                         break;
119                 args[nargs] = s;
120                 s = qtoken(s, qsep);
121         }
122
123         return nargs;
124 }