From b7e0b693a65793a5aeee51cf9fa58638376c6f06 Mon Sep 17 00:00:00 2001 From: Michael Matz Date: Wed, 13 Jul 2016 15:37:36 +0200 Subject: [PATCH] tccpp: Implement __BASE_FILE__ macro Like __FILE__ but always refers to the command line file name also from inside headers. --- tccpp.c | 6 ++++++ tests/tcctest.c | 7 +++++++ tests/tcctest.h | 9 +++++++++ 3 files changed, 22 insertions(+) create mode 100644 tests/tcctest.h diff --git a/tccpp.c b/tccpp.c index 151bce6..1838a3a 100644 --- a/tccpp.c +++ b/tccpp.c @@ -3465,6 +3465,7 @@ ST_INLN void unget_tok(int last_tok) ST_FUNC void preprocess_start(TCCState *s1) { + char *buf; s1->include_stack_ptr = s1->include_stack; /* XXX: move that before to avoid having to initialize file->ifdef_stack_ptr ? */ @@ -3480,6 +3481,11 @@ ST_FUNC void preprocess_start(TCCState *s1) s1->dollars_in_identifiers ? IS_ID : 0; isidnum_table['.' - CH_EOF] = (parse_flags & PARSE_FLAG_ASM_FILE) ? IS_ID : 0; + buf = tcc_malloc(3 + strlen(file->filename)); + sprintf(buf, "\"%s\"", file->filename); + tcc_undefine_symbol(s1, "__BASE_FILE__"); + tcc_define_symbol(s1, "__BASE_FILE__", buf); + tcc_free(buf); if (s1->nb_cmd_include_files) { CString cstr; int i; diff --git a/tests/tcctest.c b/tests/tcctest.c index 10033a4..025d12d 100644 --- a/tests/tcctest.c +++ b/tests/tcctest.c @@ -59,6 +59,8 @@ #include "tcclib.h" +#include "tcctest.h" + void intdiv_test(); void string_test(); void expr_test(); @@ -389,6 +391,11 @@ comment /* And again when the name and parenthes are separated by a comment. */ TEST2 /* the comment */ (); + + printf("%s\n", get_basefile_from_header()); + printf("%s\n", __BASE_FILE__); + printf("%s\n", get_file_from_header()); + printf("%s\n", __FILE__); } diff --git a/tests/tcctest.h b/tests/tcctest.h new file mode 100644 index 0000000..b301c7c --- /dev/null +++ b/tests/tcctest.h @@ -0,0 +1,9 @@ +static inline const char *get_basefile_from_header(void) +{ + return __BASE_FILE__; +} + +static inline const char *get_file_from_header(void) +{ + return __FILE__; +}