blob: bb143f18a028e7503c8d00fe65cffee3ac5ece05 [file] [log] [blame]
Tom Cherry67dee622017-07-27 12:54:48 -07001#include "tokenizer.h"
2
3namespace android {
4namespace init {
5
6int next_token(struct parse_state *state)
7{
8 char *x = state->ptr;
9 char *s;
10
11 if (state->nexttoken) {
12 int t = state->nexttoken;
13 state->nexttoken = 0;
14 return t;
15 }
16
17 for (;;) {
18 switch (*x) {
19 case 0:
20 state->ptr = x;
21 return T_EOF;
22 case '\n':
23 x++;
24 state->ptr = x;
25 return T_NEWLINE;
26 case ' ':
27 case '\t':
28 case '\r':
29 x++;
30 continue;
31 case '#':
32 while (*x && (*x != '\n')) x++;
33 if (*x == '\n') {
34 state->ptr = x+1;
35 return T_NEWLINE;
36 } else {
37 state->ptr = x;
38 return T_EOF;
39 }
40 default:
41 goto text;
42 }
43 }
44
45textdone:
46 state->ptr = x;
47 *s = 0;
48 return T_TEXT;
49text:
50 state->text = s = x;
51textresume:
52 for (;;) {
53 switch (*x) {
54 case 0:
55 goto textdone;
56 case ' ':
57 case '\t':
58 case '\r':
59 x++;
60 goto textdone;
61 case '\n':
62 state->nexttoken = T_NEWLINE;
63 x++;
64 goto textdone;
65 case '"':
66 x++;
67 for (;;) {
68 switch (*x) {
69 case 0:
70 /* unterminated quoted thing */
71 state->ptr = x;
72 return T_EOF;
73 case '"':
74 x++;
75 goto textresume;
76 default:
77 *s++ = *x++;
78 }
79 }
80 break;
81 case '\\':
82 x++;
83 switch (*x) {
84 case 0:
85 goto textdone;
86 case 'n':
87 *s++ = '\n';
liwugang332afef2018-06-25 16:04:33 +080088 x++;
Tom Cherry67dee622017-07-27 12:54:48 -070089 break;
90 case 'r':
91 *s++ = '\r';
liwugang332afef2018-06-25 16:04:33 +080092 x++;
Tom Cherry67dee622017-07-27 12:54:48 -070093 break;
94 case 't':
95 *s++ = '\t';
liwugang332afef2018-06-25 16:04:33 +080096 x++;
Tom Cherry67dee622017-07-27 12:54:48 -070097 break;
98 case '\\':
99 *s++ = '\\';
liwugang332afef2018-06-25 16:04:33 +0800100 x++;
Tom Cherry67dee622017-07-27 12:54:48 -0700101 break;
102 case '\r':
103 /* \ <cr> <lf> -> line continuation */
104 if (x[1] != '\n') {
105 x++;
106 continue;
107 }
liwugang332afef2018-06-25 16:04:33 +0800108 x++;
Tom Cherry67dee622017-07-27 12:54:48 -0700109 case '\n':
110 /* \ <lf> -> line continuation */
111 state->line++;
112 x++;
113 /* eat any extra whitespace */
114 while((*x == ' ') || (*x == '\t')) x++;
115 continue;
116 default:
117 /* unknown escape -- just copy */
118 *s++ = *x++;
119 }
120 continue;
121 default:
122 *s++ = *x++;
123 }
124 }
125 return T_EOF;
126}
127
128} // namespace init
129} // namespace android