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 Workerint 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