ftepp_out(ftepp, "\n#pragma pop(line)\n", false);
}
+static bool ftepp_macro_expand(ftepp_t *ftepp, ppmacro *macro, macroparam *params, bool resetline);
static void ftepp_param_out(ftepp_t *ftepp, macroparam *param)
{
size_t i;
out = param->tokens[i];
if (out->token == TOKEN_EOL)
ftepp_out(ftepp, "\n", false);
- else
- ftepp_out(ftepp, out->value, false);
+ else {
+ ppmacro *find = ftepp_macro_find(ftepp, out->value);
+ if (OPTS_FLAG(FTEPP_INDIRECT_EXPANSION) && find && !find->has_params)
+ ftepp_macro_expand(ftepp, find, NULL, false);
+ else
+ ftepp_out(ftepp, out->value, false);
+ }
}
}
lex_file *inlex;
bool old_inmacro;
+ bool strip = false;
int nextok;
if (nextok == '#') {
/* raw concatenation */
++o;
+ strip = true;
break;
}
if ( (nextok == TOKEN_IDENT ||
macro_params_find(macro, macro->output[o+1]->value, &pi))
{
++o;
+
ftepp_stringify(ftepp, ¶ms[pi]);
break;
}
ftepp_out(ftepp, "\n", false);
break;
default:
- ftepp_out(ftepp, out->value, false);
+ buffer = out->value;
+ #define buffer_stripable(X) ((X) == ' ' || (X) == '\t')
+ if (vec_size(macro->output) > o + 1 && macro->output[o+1]->token == '#' && buffer_stripable(*buffer))
+ buffer++;
+ if (strip) {
+ while (buffer_stripable(*buffer)) buffer++;
+ strip = false;
+ }
+ ftepp_out(ftepp, buffer, false);
break;
}
}