- ppmacro *macro;
- (void)ftepp_next(ftepp);
- if (!ftepp_skipspace(ftepp))
- return false;
-
- switch (ftepp->token) {
- case TOKEN_IDENT:
- case TOKEN_TYPENAME:
- case TOKEN_KEYWORD:
- macro = ppmacro_new(ftepp_ctx(ftepp), ftepp_tokval(ftepp));
- break;
- default:
- ftepp_error(ftepp, "expected macro name");
- return false;
- }
-
- (void)ftepp_next(ftepp);
- if (!ftepp_skipspace(ftepp))
- return false;
- if (ftepp->token != TOKEN_EOL) {
- ftepp_error(ftepp, "stray tokens after macro");
- return false;
- }
- vec_push(ftepp->macros, macro);
- return true;
+ ppmacro *macro;
+ (void)ftepp_next(ftepp);
+ if (!ftepp_skipspace(ftepp))
+ return false;
+
+ switch (ftepp->token) {
+ case TOKEN_IDENT:
+ case TOKEN_TYPENAME:
+ case TOKEN_KEYWORD:
+ macro = ppmacro_new(ftepp_ctx(ftepp), ftepp_tokval(ftepp));
+ break;
+ default:
+ ftepp_error(ftepp, "expected macro name");
+ return false;
+ }
+
+ (void)ftepp_next(ftepp);
+ if (!ftepp_skipspace(ftepp))
+ return false;
+ if (ftepp->token != TOKEN_EOL) {
+ ftepp_error(ftepp, "stray tokens after macro");
+ return false;
+ }
+ vec_push(ftepp->macros, macro);
+ return true;
- ppmacro *macro;
- while (ftepp->token != TOKEN_EOL) {
- switch (ftepp->token) {
- case TOKEN_IDENT:
- case TOKEN_TYPENAME:
- case TOKEN_KEYWORD:
- macro = ftepp_macro_find(ftepp, ftepp_tokval(ftepp));
- if (!macro || !vec_size(macro->output)) {
- *out = false;
- } else {
- /* This does not expand recursively! */
- switch (macro->output[0]->token) {
- case TOKEN_INTCONST:
- *out = !!(macro->output[0]->constval.f);
- break;
- case TOKEN_FLOATCONST:
- *out = !!(macro->output[0]->constval.f);
- break;
- default:
- *out = false;
- break;
- }
- }
- break;
- case TOKEN_STRINGCONST:
- *out = false;
- break;
- case TOKEN_INTCONST:
- *out = !!(ftepp->lex->tok.constval.i);
- break;
- case TOKEN_FLOATCONST:
- *out = !!(ftepp->lex->tok.constval.f);
- break;
-
- default:
- ftepp_error(ftepp, "junk in #if");
- return false;
- }
- }
- (void)ftepp_next(ftepp);
- return true;
+ ppmacro *macro;
+ while (ftepp->token != TOKEN_EOL) {
+ switch (ftepp->token) {
+ case TOKEN_IDENT:
+ case TOKEN_TYPENAME:
+ case TOKEN_KEYWORD:
+ macro = ftepp_macro_find(ftepp, ftepp_tokval(ftepp));
+ if (!macro || !vec_size(macro->output)) {
+ *out = false;
+ } else {
+ /* This does not expand recursively! */
+ switch (macro->output[0]->token) {
+ case TOKEN_INTCONST:
+ *out = !!(macro->output[0]->constval.f);
+ break;
+ case TOKEN_FLOATCONST:
+ *out = !!(macro->output[0]->constval.f);
+ break;
+ default:
+ *out = false;
+ break;
+ }
+ }
+ break;
+ case TOKEN_STRINGCONST:
+ *out = false;
+ break;
+ case TOKEN_INTCONST:
+ *out = !!(ftepp->lex->tok.constval.i);
+ break;
+ case TOKEN_FLOATCONST:
+ *out = !!(ftepp->lex->tok.constval.f);
+ break;
+
+ default:
+ ftepp_error(ftepp, "junk in #if");
+ return false;
+ }
+
+ ftepp_next(ftepp);
+ if (!ftepp_skipspace(ftepp))
+ return false;
+
+ switch (ftepp->token) {
+ }
+ }
+ (void)ftepp_next(ftepp);
+ return true;
- ppmacro *macro;
- memset(cond, 0, sizeof(*cond));
- (void)ftepp_next(ftepp);
- if (!ftepp_skipspace(ftepp))
- return false;
-
- switch (ftepp->token) {
- case TOKEN_IDENT:
- case TOKEN_TYPENAME:
- case TOKEN_KEYWORD:
- macro = ftepp_macro_find(ftepp, ftepp_tokval(ftepp));
- break;
- default:
- ftepp_error(ftepp, "expected macro name");
- return false;
- }
-
- (void)ftepp_next(ftepp);
- if (!ftepp_skipspace(ftepp))
- return false;
- if (ftepp->token != TOKEN_EOL) {
- ftepp_error(ftepp, "stray tokens after #ifdef");
- return false;
- }
- cond->on = !!macro;
- return true;
+ ppmacro *macro;
+ memset(cond, 0, sizeof(*cond));
+ (void)ftepp_next(ftepp);
+ if (!ftepp_skipspace(ftepp))
+ return false;
+
+ switch (ftepp->token) {
+ case TOKEN_IDENT:
+ case TOKEN_TYPENAME:
+ case TOKEN_KEYWORD:
+ macro = ftepp_macro_find(ftepp, ftepp_tokval(ftepp));
+ break;
+ default:
+ ftepp_error(ftepp, "expected macro name");
+ return false;
+ }
+
+ (void)ftepp_next(ftepp);
+ if (!ftepp_skipspace(ftepp))
+ return false;
+ if (ftepp->token != TOKEN_EOL) {
+ ftepp_error(ftepp, "stray tokens after #ifdef");
+ return false;
+ }
+ cond->on = !!macro;
+ return true;
- ppcondition cond;
- ppcondition *pc;
-
- lex_ctx ctx = ftepp_ctx(ftepp);
-
- if (!ftepp_skipspace(ftepp))
- return false;
-
- switch (ftepp->token) {
- case TOKEN_KEYWORD:
- case TOKEN_IDENT:
- case TOKEN_TYPENAME:
- if (!strcmp(ftepp_tokval(ftepp), "define")) {
- return ftepp_define(ftepp);
- }
- else if (!strcmp(ftepp_tokval(ftepp), "ifdef")) {
- if (!ftepp_ifdef(ftepp, &cond))
- return false;
- vec_push(ftepp->conditions, cond);
- return true;
- }
- else if (!strcmp(ftepp_tokval(ftepp), "ifndef")) {
- if (!ftepp_ifdef(ftepp, &cond))
- return false;
- cond.on = !cond.on;
- vec_push(ftepp->conditions, cond);
- return true;
- }
- else if (!strcmp(ftepp_tokval(ftepp), "elifdef")) {
- if (!ftepp_else_allowed(ftepp))
- return false;
- if (!ftepp_ifdef(ftepp, &cond))
- return false;
- pc = &vec_last(ftepp->conditions);
- pc->on = !pc->was_on && cond.on;
- pc->was_on = pc->was_on || pc->on;
- return true;
- }
- else if (!strcmp(ftepp_tokval(ftepp), "elifndef")) {
- if (!ftepp_else_allowed(ftepp))
- return false;
- if (!ftepp_ifdef(ftepp, &cond))
- return false;
- cond.on = !cond.on;
- pc = &vec_last(ftepp->conditions);
- pc->on = !pc->was_on && cond.on;
- pc->was_on = pc->was_on || pc->on;
- return true;
- }
- else if (!strcmp(ftepp_tokval(ftepp), "elif")) {
- if (!ftepp_else_allowed(ftepp))
- return false;
- if (!ftepp_if(ftepp, &cond))
- return false;
- pc = &vec_last(ftepp->conditions);
- pc->on = !pc->was_on && cond.on;
- pc->was_on = pc->was_on || pc->on;
- return true;
- }
- else if (!strcmp(ftepp_tokval(ftepp), "if")) {
- if (!ftepp_if(ftepp, &cond))
- return false;
- vec_push(ftepp->conditions, cond);
- return true;
- }
- else if (!strcmp(ftepp_tokval(ftepp), "else")) {
- if (!ftepp_else_allowed(ftepp))
- return false;
- pc = &vec_last(ftepp->conditions);
- pc->on = !pc->was_on;
- pc->had_else = true;
- return true;
- }
- else if (!strcmp(ftepp_tokval(ftepp), "endif")) {
- if (!vec_size(ftepp->conditions)) {
- ftepp_error(ftepp, "#endif without #if");
- return false;
- }
- vec_pop(ftepp->conditions);
- break;
- }
- else {
- ftepp_error(ftepp, "unrecognized preprocessor directive: `%s`", ftepp_tokval(ftepp));
- return false;
- }
- break;
- default:
- ftepp_error(ftepp, "unexpected preprocessor token: `%s`", ftepp_tokval(ftepp));
- return false;
- case TOKEN_EOL:
- ftepp_errorat(ftepp, ctx, "empty preprocessor directive");
- return false;
- case TOKEN_EOF:
- ftepp_error(ftepp, "missing newline at end of file", ftepp_tokval(ftepp));
- return false;
- }
- return true;
+ ppcondition cond;
+ ppcondition *pc;
+
+ lex_ctx ctx = ftepp_ctx(ftepp);
+
+ if (!ftepp_skipspace(ftepp))
+ return false;
+
+ switch (ftepp->token) {
+ case TOKEN_KEYWORD:
+ case TOKEN_IDENT:
+ case TOKEN_TYPENAME:
+ if (!strcmp(ftepp_tokval(ftepp), "define")) {
+ return ftepp_define(ftepp);
+ }
+ else if (!strcmp(ftepp_tokval(ftepp), "ifdef")) {
+ if (!ftepp_ifdef(ftepp, &cond))
+ return false;
+ vec_push(ftepp->conditions, cond);
+ return true;
+ }
+ else if (!strcmp(ftepp_tokval(ftepp), "ifndef")) {
+ if (!ftepp_ifdef(ftepp, &cond))
+ return false;
+ cond.on = !cond.on;
+ vec_push(ftepp->conditions, cond);
+ return true;
+ }
+ else if (!strcmp(ftepp_tokval(ftepp), "elifdef")) {
+ if (!ftepp_else_allowed(ftepp))
+ return false;
+ if (!ftepp_ifdef(ftepp, &cond))
+ return false;
+ pc = &vec_last(ftepp->conditions);
+ pc->on = !pc->was_on && cond.on;
+ pc->was_on = pc->was_on || pc->on;
+ return true;
+ }
+ else if (!strcmp(ftepp_tokval(ftepp), "elifndef")) {
+ if (!ftepp_else_allowed(ftepp))
+ return false;
+ if (!ftepp_ifdef(ftepp, &cond))
+ return false;
+ cond.on = !cond.on;
+ pc = &vec_last(ftepp->conditions);
+ pc->on = !pc->was_on && cond.on;
+ pc->was_on = pc->was_on || pc->on;
+ return true;
+ }
+ else if (!strcmp(ftepp_tokval(ftepp), "elif")) {
+ if (!ftepp_else_allowed(ftepp))
+ return false;
+ if (!ftepp_if(ftepp, &cond))
+ return false;
+ pc = &vec_last(ftepp->conditions);
+ pc->on = !pc->was_on && cond.on;
+ pc->was_on = pc->was_on || pc->on;
+ return true;
+ }
+ else if (!strcmp(ftepp_tokval(ftepp), "if")) {
+ if (!ftepp_if(ftepp, &cond))
+ return false;
+ vec_push(ftepp->conditions, cond);
+ return true;
+ }
+ else if (!strcmp(ftepp_tokval(ftepp), "else")) {
+ if (!ftepp_else_allowed(ftepp))
+ return false;
+ pc = &vec_last(ftepp->conditions);
+ pc->on = !pc->was_on;
+ pc->had_else = true;
+ return true;
+ }
+ else if (!strcmp(ftepp_tokval(ftepp), "endif")) {
+ if (!vec_size(ftepp->conditions)) {
+ ftepp_error(ftepp, "#endif without #if");
+ return false;
+ }
+ vec_pop(ftepp->conditions);
+ break;
+ }
+ else {
+ ftepp_error(ftepp, "unrecognized preprocessor directive: `%s`", ftepp_tokval(ftepp));
+ return false;
+ }
+ break;
+ default:
+ ftepp_error(ftepp, "unexpected preprocessor token: `%s`", ftepp_tokval(ftepp));
+ return false;
+ case TOKEN_EOL:
+ ftepp_errorat(ftepp, ctx, "empty preprocessor directive");
+ return false;
+ case TOKEN_EOF:
+ ftepp_error(ftepp, "missing newline at end of file", ftepp_tokval(ftepp));
+ return false;
+ }
+ return true;
- bool newline = true;
-
- ftepp->lex->flags.preprocessing = true;
-
- ftepp_next(ftepp);
- do
- {
- if (ftepp->token >= TOKEN_EOF)
- break;
-
- ftepp->newline = newline;
- newline = false;
-
- switch (ftepp->token) {
- case '#':
- if (!ftepp->newline) {
- ftepp_out(ftepp, ftepp_tokval(ftepp));
- ftepp_next(ftepp);
- break;
- }
- if (ftepp_next(ftepp) >= TOKEN_EOF) {
- ftepp_error(ftepp, "error in preprocessor directive");
- ftepp->token = TOKEN_ERROR;
- break;
- }
- if (!ftepp_hash(ftepp))
- ftepp->token = TOKEN_ERROR;
- break;
- case TOKEN_EOL:
- newline = true;
- ftepp_out(ftepp, "\n");
- ftepp_next(ftepp);
- break;
- default:
- ftepp_out(ftepp, ftepp_tokval(ftepp));
- ftepp_next(ftepp);
- break;
- }
- } while (!ftepp->errors && ftepp->token < TOKEN_EOF);
-
- ftepp_delete(ftepp);
- return (ftepp->token == TOKEN_EOF);
+ bool newline = true;
+
+ ftepp->lex->flags.preprocessing = true;
+
+ ftepp_next(ftepp);
+ do
+ {
+ if (ftepp->token >= TOKEN_EOF)
+ break;
+
+ ftepp->newline = newline;
+ newline = false;
+
+ switch (ftepp->token) {
+ case '#':
+ if (!ftepp->newline) {
+ ftepp_out(ftepp, ftepp_tokval(ftepp));
+ ftepp_next(ftepp);
+ break;
+ }
+ if (ftepp_next(ftepp) >= TOKEN_EOF) {
+ ftepp_error(ftepp, "error in preprocessor directive");
+ ftepp->token = TOKEN_ERROR;
+ break;
+ }
+ if (!ftepp_hash(ftepp))
+ ftepp->token = TOKEN_ERROR;
+ break;
+ case TOKEN_EOL:
+ newline = true;
+ ftepp_out(ftepp, "\n");
+ ftepp_next(ftepp);
+ break;
+ default:
+ ftepp_out(ftepp, ftepp_tokval(ftepp));
+ ftepp_next(ftepp);
+ break;
+ }
+ } while (!ftepp->errors && ftepp->token < TOKEN_EOF);
+
+ ftepp_delete(ftepp);
+ return (ftepp->token == TOKEN_EOF);