xref: /aosp_15_r20/system/core/init/tokenizer.cpp (revision 00c7fec1bb09f3284aad6a6f96d2f63dfc3650ad)
1*00c7fec1SAndroid Build Coastguard Worker #include "tokenizer.h"
2*00c7fec1SAndroid Build Coastguard Worker 
3*00c7fec1SAndroid Build Coastguard Worker #include <android-base/macros.h>
4*00c7fec1SAndroid Build Coastguard Worker 
5*00c7fec1SAndroid Build Coastguard Worker namespace android {
6*00c7fec1SAndroid Build Coastguard Worker namespace init {
7*00c7fec1SAndroid Build Coastguard Worker 
next_token(struct parse_state * state)8*00c7fec1SAndroid Build Coastguard Worker int next_token(struct parse_state *state)
9*00c7fec1SAndroid Build Coastguard Worker {
10*00c7fec1SAndroid Build Coastguard Worker     char *x = state->ptr;
11*00c7fec1SAndroid Build Coastguard Worker     char *s;
12*00c7fec1SAndroid Build Coastguard Worker 
13*00c7fec1SAndroid Build Coastguard Worker     if (state->nexttoken) {
14*00c7fec1SAndroid Build Coastguard Worker         int t = state->nexttoken;
15*00c7fec1SAndroid Build Coastguard Worker         state->nexttoken = 0;
16*00c7fec1SAndroid Build Coastguard Worker         return t;
17*00c7fec1SAndroid Build Coastguard Worker     }
18*00c7fec1SAndroid Build Coastguard Worker 
19*00c7fec1SAndroid Build Coastguard Worker     for (;;) {
20*00c7fec1SAndroid Build Coastguard Worker         switch (*x) {
21*00c7fec1SAndroid Build Coastguard Worker         case 0:
22*00c7fec1SAndroid Build Coastguard Worker             state->ptr = x;
23*00c7fec1SAndroid Build Coastguard Worker             return T_EOF;
24*00c7fec1SAndroid Build Coastguard Worker         case '\n':
25*00c7fec1SAndroid Build Coastguard Worker             x++;
26*00c7fec1SAndroid Build Coastguard Worker             state->ptr = x;
27*00c7fec1SAndroid Build Coastguard Worker             return T_NEWLINE;
28*00c7fec1SAndroid Build Coastguard Worker         case ' ':
29*00c7fec1SAndroid Build Coastguard Worker         case '\t':
30*00c7fec1SAndroid Build Coastguard Worker         case '\r':
31*00c7fec1SAndroid Build Coastguard Worker             x++;
32*00c7fec1SAndroid Build Coastguard Worker             continue;
33*00c7fec1SAndroid Build Coastguard Worker         case '#':
34*00c7fec1SAndroid Build Coastguard Worker             while (*x && (*x != '\n')) x++;
35*00c7fec1SAndroid Build Coastguard Worker             if (*x == '\n') {
36*00c7fec1SAndroid Build Coastguard Worker                 state->ptr = x+1;
37*00c7fec1SAndroid Build Coastguard Worker                 return T_NEWLINE;
38*00c7fec1SAndroid Build Coastguard Worker             } else {
39*00c7fec1SAndroid Build Coastguard Worker                 state->ptr = x;
40*00c7fec1SAndroid Build Coastguard Worker                 return T_EOF;
41*00c7fec1SAndroid Build Coastguard Worker             }
42*00c7fec1SAndroid Build Coastguard Worker         default:
43*00c7fec1SAndroid Build Coastguard Worker             goto text;
44*00c7fec1SAndroid Build Coastguard Worker         }
45*00c7fec1SAndroid Build Coastguard Worker     }
46*00c7fec1SAndroid Build Coastguard Worker 
47*00c7fec1SAndroid Build Coastguard Worker textdone:
48*00c7fec1SAndroid Build Coastguard Worker     state->ptr = x;
49*00c7fec1SAndroid Build Coastguard Worker     *s = 0;
50*00c7fec1SAndroid Build Coastguard Worker     return T_TEXT;
51*00c7fec1SAndroid Build Coastguard Worker text:
52*00c7fec1SAndroid Build Coastguard Worker     state->text = s = x;
53*00c7fec1SAndroid Build Coastguard Worker textresume:
54*00c7fec1SAndroid Build Coastguard Worker     for (;;) {
55*00c7fec1SAndroid Build Coastguard Worker         switch (*x) {
56*00c7fec1SAndroid Build Coastguard Worker         case 0:
57*00c7fec1SAndroid Build Coastguard Worker             goto textdone;
58*00c7fec1SAndroid Build Coastguard Worker         case ' ':
59*00c7fec1SAndroid Build Coastguard Worker         case '\t':
60*00c7fec1SAndroid Build Coastguard Worker         case '\r':
61*00c7fec1SAndroid Build Coastguard Worker             x++;
62*00c7fec1SAndroid Build Coastguard Worker             goto textdone;
63*00c7fec1SAndroid Build Coastguard Worker         case '\n':
64*00c7fec1SAndroid Build Coastguard Worker             state->nexttoken = T_NEWLINE;
65*00c7fec1SAndroid Build Coastguard Worker             x++;
66*00c7fec1SAndroid Build Coastguard Worker             goto textdone;
67*00c7fec1SAndroid Build Coastguard Worker         case '"':
68*00c7fec1SAndroid Build Coastguard Worker             x++;
69*00c7fec1SAndroid Build Coastguard Worker             for (;;) {
70*00c7fec1SAndroid Build Coastguard Worker                 switch (*x) {
71*00c7fec1SAndroid Build Coastguard Worker                 case 0:
72*00c7fec1SAndroid Build Coastguard Worker                         /* unterminated quoted thing */
73*00c7fec1SAndroid Build Coastguard Worker                     state->ptr = x;
74*00c7fec1SAndroid Build Coastguard Worker                     return T_EOF;
75*00c7fec1SAndroid Build Coastguard Worker                 case '"':
76*00c7fec1SAndroid Build Coastguard Worker                     x++;
77*00c7fec1SAndroid Build Coastguard Worker                     goto textresume;
78*00c7fec1SAndroid Build Coastguard Worker                 default:
79*00c7fec1SAndroid Build Coastguard Worker                     *s++ = *x++;
80*00c7fec1SAndroid Build Coastguard Worker                 }
81*00c7fec1SAndroid Build Coastguard Worker             }
82*00c7fec1SAndroid Build Coastguard Worker             break;
83*00c7fec1SAndroid Build Coastguard Worker         case '\\':
84*00c7fec1SAndroid Build Coastguard Worker             x++;
85*00c7fec1SAndroid Build Coastguard Worker             switch (*x) {
86*00c7fec1SAndroid Build Coastguard Worker             case 0:
87*00c7fec1SAndroid Build Coastguard Worker                 goto textdone;
88*00c7fec1SAndroid Build Coastguard Worker             case 'n':
89*00c7fec1SAndroid Build Coastguard Worker                 *s++ = '\n';
90*00c7fec1SAndroid Build Coastguard Worker                 x++;
91*00c7fec1SAndroid Build Coastguard Worker                 break;
92*00c7fec1SAndroid Build Coastguard Worker             case 'r':
93*00c7fec1SAndroid Build Coastguard Worker                 *s++ = '\r';
94*00c7fec1SAndroid Build Coastguard Worker                 x++;
95*00c7fec1SAndroid Build Coastguard Worker                 break;
96*00c7fec1SAndroid Build Coastguard Worker             case 't':
97*00c7fec1SAndroid Build Coastguard Worker                 *s++ = '\t';
98*00c7fec1SAndroid Build Coastguard Worker                 x++;
99*00c7fec1SAndroid Build Coastguard Worker                 break;
100*00c7fec1SAndroid Build Coastguard Worker             case '\\':
101*00c7fec1SAndroid Build Coastguard Worker                 *s++ = '\\';
102*00c7fec1SAndroid Build Coastguard Worker                 x++;
103*00c7fec1SAndroid Build Coastguard Worker                 break;
104*00c7fec1SAndroid Build Coastguard Worker             case '\r':
105*00c7fec1SAndroid Build Coastguard Worker                     /* \ <cr> <lf> -> line continuation */
106*00c7fec1SAndroid Build Coastguard Worker                 if (x[1] != '\n') {
107*00c7fec1SAndroid Build Coastguard Worker                     x++;
108*00c7fec1SAndroid Build Coastguard Worker                     continue;
109*00c7fec1SAndroid Build Coastguard Worker                 }
110*00c7fec1SAndroid Build Coastguard Worker                 x++;
111*00c7fec1SAndroid Build Coastguard Worker                 FALLTHROUGH_INTENDED;
112*00c7fec1SAndroid Build Coastguard Worker             case '\n':
113*00c7fec1SAndroid Build Coastguard Worker                     /* \ <lf> -> line continuation */
114*00c7fec1SAndroid Build Coastguard Worker                 state->line++;
115*00c7fec1SAndroid Build Coastguard Worker                 x++;
116*00c7fec1SAndroid Build Coastguard Worker                     /* eat any extra whitespace */
117*00c7fec1SAndroid Build Coastguard Worker                 while((*x == ' ') || (*x == '\t')) x++;
118*00c7fec1SAndroid Build Coastguard Worker                 continue;
119*00c7fec1SAndroid Build Coastguard Worker             default:
120*00c7fec1SAndroid Build Coastguard Worker                     /* unknown escape -- just copy */
121*00c7fec1SAndroid Build Coastguard Worker                 *s++ = *x++;
122*00c7fec1SAndroid Build Coastguard Worker             }
123*00c7fec1SAndroid Build Coastguard Worker             continue;
124*00c7fec1SAndroid Build Coastguard Worker         default:
125*00c7fec1SAndroid Build Coastguard Worker             *s++ = *x++;
126*00c7fec1SAndroid Build Coastguard Worker         }
127*00c7fec1SAndroid Build Coastguard Worker     }
128*00c7fec1SAndroid Build Coastguard Worker     return T_EOF;
129*00c7fec1SAndroid Build Coastguard Worker }
130*00c7fec1SAndroid Build Coastguard Worker 
131*00c7fec1SAndroid Build Coastguard Worker }  // namespace init
132*00c7fec1SAndroid Build Coastguard Worker }  // namespace android
133