aboutsummaryrefslogtreecommitdiff
path: root/tccpp.c
diff options
context:
space:
mode:
authorseyko <seyko2@gmail.com>2015-04-21 06:34:35 +0300
committerseyko <seyko2@gmail.com>2015-04-21 06:34:35 +0300
commit0c8447db7970813292a8be74ee50e49091be5d15 (patch)
treef1db257725c3ac9ddec1632473835a0e44d2d240 /tccpp.c
parent5e8fb713c49cfad17d5fb78fb353d88b1ab86eb8 (diff)
downloadtinycc-0c8447db7970813292a8be74ee50e49091be5d15.tar.gz
tinycc-0c8447db7970813292a8be74ee50e49091be5d15.tar.bz2
* and #pragma pop_macro("macro_name")
* give warning if pragma is unknown for tcc * don't free asm_label in sym_free(), it's a job of the asm_free_labels(). The above pragmas are used in the mingw headers. Thise pragmas are implemented in gcc-4.5+ and current clang.
Diffstat (limited to 'tccpp.c')
-rw-r--r--tccpp.c34
1 files changed, 34 insertions, 0 deletions
diff --git a/tccpp.c b/tccpp.c
index 42ebf48..4d9430d 100644
--- a/tccpp.c
+++ b/tccpp.c
@@ -222,6 +222,7 @@ static TokenSym *tok_alloc_new(TokenSym **pts, const char *str, int len)
table_ident[i] = ts;
ts->tok = tok_ident++;
ts->sym_define = NULL;
+ ts->sym_define_stack = NULL;
ts->sym_label = NULL;
ts->sym_struct = NULL;
ts->sym_identifier = NULL;
@@ -1446,6 +1447,39 @@ static void pragma_parse(TCCState *s1)
} else {
tcc_warning("#pragma comment(lib) is ignored");
}
+ } else if ((tok == TOK_push_macro) || (tok == TOK_pop_macro)) {
+ int push_macro = (tok == TOK_push_macro);
+ next();
+ skip('(');
+ if (tok != TOK_STR) {
+ expect("\"");
+ } else {
+ int len = strlen((char *)tokc.cstr->data);
+ tcc_open_bf(s1, "<push_pop_macro>", len);
+ memcpy(file->buffer, tokc.cstr->data, len);
+ ch = file->buf_ptr[0];
+ next_nomacro();
+ if (tok >= TOK_IDENT) {
+ Sym *s = table_ident[tok - TOK_IDENT]->sym_define;
+ Sym *ss = table_ident[tok - TOK_IDENT]->sym_define_stack;
+ if (push_macro) {
+ if (s) {
+ s->prev_tok = ss;
+ table_ident[tok - TOK_IDENT]->sym_define_stack = s;
+ }
+ } else {
+ if (ss) {
+ table_ident[tok - TOK_IDENT]->sym_define = ss;
+ table_ident[tok - TOK_IDENT]->sym_define_stack = ss->prev_tok;
+ }
+ }
+ }
+ tcc_close();
+ }
+ next();
+ skip(')');
+ } else {
+ tcc_warning("unknown #pragma %s", get_tok_str(tok, &tokc));
}
}