- } else {
- /* parse+emit a line */
- while(pp_token.type != '\n') {
- if(pp_token.type == TP_EOF)
- goto end_of_main_loop;
- emit_pp_token();
- next_preprocessing_token();
+ continue;
+ } else if (pp_token.kind == TP_EOF) {
+ goto end_of_main_loop;
+ } else if (pp_token.kind == TP_IDENTIFIER) {
+ symbol_t *const symbol = pp_token.base.symbol;
+ pp_definition_t *const pp_definition = symbol->pp_definition;
+ if (pp_definition != NULL && !pp_definition->is_expanding) {
+ expansion_pos = pp_token.base.source_position;
+ if (pp_definition->has_parameters) {
+ source_position_t position = pp_token.base.source_position;
+ add_token_info_t old_info = info;
+ next_preprocessing_token();
+ add_token_info_t new_info = info;
+
+ /* no opening brace -> no expansion */
+ if (pp_token.kind == '(') {
+ eat_pp('(');
+
+ /* parse arguments (TODO) */
+ while (pp_token.kind != TP_EOF && pp_token.kind != ')')
+ next_preprocessing_token();
+ } else {
+ token_t next_token = pp_token;
+ /* restore identifier token */
+ pp_token.kind = TP_IDENTIFIER;
+ pp_token.base.symbol = symbol;
+ pp_token.base.source_position = position;
+ info = old_info;
+ emit_pp_token();
+
+ info = new_info;
+ pp_token = next_token;
+ continue;
+ }
+ info = old_info;
+ }
+ pp_definition->expand_pos = 0;
+ pp_definition->is_expanding = true;
+ current_expansion = pp_definition;
+ expand_next();
+ continue;