diff options
author | Tom Cherry <tomcherry@google.com> | 2017-07-27 12:54:48 -0700 |
---|---|---|
committer | Tom Cherry <tomcherry@google.com> | 2017-07-27 13:23:32 -0700 |
commit | 67dee626e0185096bbaf73042f1a891ce436f714 (patch) | |
tree | 7d8dac0fe94f641494ea33e97ca00e0fb444795b /init/tokenizer.cpp | |
parent | 29b94116855b96e24beeb993396b251a1f85127a (diff) |
init: remove Parser singleton and related cleanup
* Remove the Parser singleton (Hooray!)
* Rename parser.* to tokenizer.* as this is actually a tokenizer
* Rename init_parser.* to parser.* as this is a generic parser
* Move contents of init_parser_test.cpp to service_test.cpp as this
actually is a test of the parsing in MakeExecOneshotService() and
nothing related to (init_)parser.cpp
Test: boot bullhead
Test: bool sailfish
Test: init unit tests
Change-Id: I4fe39e6483f58ebd3ce5ee715a45dbba0acf5d91
Diffstat (limited to 'init/tokenizer.cpp')
-rw-r--r-- | init/tokenizer.cpp | 124 |
1 files changed, 124 insertions, 0 deletions
diff --git a/init/tokenizer.cpp b/init/tokenizer.cpp new file mode 100644 index 000000000..f8d9b6be7 --- /dev/null +++ b/init/tokenizer.cpp @@ -0,0 +1,124 @@ +#include "tokenizer.h" + +namespace android { +namespace init { + +int next_token(struct parse_state *state) +{ + char *x = state->ptr; + char *s; + + if (state->nexttoken) { + int t = state->nexttoken; + state->nexttoken = 0; + return t; + } + + for (;;) { + switch (*x) { + case 0: + state->ptr = x; + return T_EOF; + case '\n': + x++; + state->ptr = x; + return T_NEWLINE; + case ' ': + case '\t': + case '\r': + x++; + continue; + case '#': + while (*x && (*x != '\n')) x++; + if (*x == '\n') { + state->ptr = x+1; + return T_NEWLINE; + } else { + state->ptr = x; + return T_EOF; + } + default: + goto text; + } + } + +textdone: + state->ptr = x; + *s = 0; + return T_TEXT; +text: + state->text = s = x; +textresume: + for (;;) { + switch (*x) { + case 0: + goto textdone; + case ' ': + case '\t': + case '\r': + x++; + goto textdone; + case '\n': + state->nexttoken = T_NEWLINE; + x++; + goto textdone; + case '"': + x++; + for (;;) { + switch (*x) { + case 0: + /* unterminated quoted thing */ + state->ptr = x; + return T_EOF; + case '"': + x++; + goto textresume; + default: + *s++ = *x++; + } + } + break; + case '\\': + x++; + switch (*x) { + case 0: + goto textdone; + case 'n': + *s++ = '\n'; + break; + case 'r': + *s++ = '\r'; + break; + case 't': + *s++ = '\t'; + break; + case '\\': + *s++ = '\\'; + break; + case '\r': + /* \ <cr> <lf> -> line continuation */ + if (x[1] != '\n') { + x++; + continue; + } + case '\n': + /* \ <lf> -> line continuation */ + state->line++; + x++; + /* eat any extra whitespace */ + while((*x == ' ') || (*x == '\t')) x++; + continue; + default: + /* unknown escape -- just copy */ + *s++ = *x++; + } + continue; + default: + *s++ = *x++; + } + } + return T_EOF; +} + +} // namespace init +} // namespace android |