--- ../tcc-0.9.26/tcc.h 2013-02-15 14:24:00.000000000 +0000 +++ tcc.h 2015-04-13 15:15:07.421945189 +0100 @@ -528,6 +528,7 @@ /* C language options */ int char_is_unsigned; int leading_underscore; + int dollars_in_identifiers; /* allows '$' in indentifiers */ /* warning switches */ int warn_write_strings; @@ -1083,6 +1084,7 @@ returned at eof */ #define PARSE_FLAG_ASM_COMMENTS 0x0008 /* '#' can be used for line comment */ #define PARSE_FLAG_SPACES 0x0010 /* next() returns space tokens (for -E) */ +#define PARSE_FLAG_ASM 0x0020 /* currently parsing assembly */ ST_FUNC TokenSym *tok_alloc(const char *str, int len); ST_FUNC char *get_tok_str(int v, CValue *cv); --- ../tcc-0.9.26/libtcc.c 2013-02-15 14:24:00.000000000 +0000 +++ libtcc.c 2015-04-13 15:15:33.357944813 +0100 @@ -1423,6 +1423,7 @@ { offsetof(TCCState, char_is_unsigned), FD_INVERT, "signed-char" }, { offsetof(TCCState, nocommon), FD_INVERT, "common" }, { offsetof(TCCState, leading_underscore), 0, "leading-underscore" }, + { offsetof(TCCState, dollars_in_identifiers), 0, "dollars-in-identifiers" }, }; /* set/reset a flag */ --- ../tcc-0.9.26/tccpp.c 2013-02-15 14:24:00.000000000 +0000 +++ tccpp.c 2015-04-13 15:19:16.425941580 +0100 @@ -2178,7 +2178,12 @@ } } break; - + + /* allow $ in identifiers when not parsing asm */ + case '$': + if (!tcc_state->dollars_in_identifiers + || (parse_flags & PARSE_FLAG_ASM)) goto parse_simple; + case 'a': case 'b': case 'c': case 'd': case 'e': case 'f': case 'g': case 'h': case 'i': case 'j': case 'k': case 'l': @@ -2477,8 +2482,8 @@ case ':': case '?': case '~': - case '$': /* only used in assembler */ - case '@': /* dito */ + case '@': /* only used in assembler */ + parse_simple: tok = c; p++; break; @@ -3049,7 +3054,8 @@ /* init isid table */ for(i=CH_EOF;i<256;i++) - isidnum_table[i-CH_EOF] = isid(i) || isnum(i); + isidnum_table[i-CH_EOF] = isid(i) || isnum(i) || + (tcc_state->dollars_in_identifiers ? i == '$' : 0); /* add all tokens */ table_ident = NULL; --- ../tcc-0.9.26/tccasm.c 2013-02-15 14:24:00.000000000 +0000 +++ tccasm.c 2015-04-13 15:17:56.945942732 +0100 @@ -735,7 +735,7 @@ ch = file->buf_ptr[0]; tok_flags = TOK_FLAG_BOL | TOK_FLAG_BOF; - parse_flags = PARSE_FLAG_ASM_COMMENTS; + parse_flags = PARSE_FLAG_ASM_COMMENTS | PARSE_FLAG_ASM; if (do_preprocess) parse_flags |= PARSE_FLAG_PREPROCESS; next(); --- ../tcc-0.9.26/tcc-doc.texi 2013-02-15 14:24:00.000000000 +0000 +++ tcc-doc.texi 2015-04-10 16:53:14.697761387 +0100 @@ -590,6 +590,8 @@ @item @code{#pragma pack} is supported for win32 compatibility. address@hidden The dollar sign @code{$} is allowed in identifiers. + @end itemize @section TinyCC extensions --- ../tcc-0.9.26/tests/tests2/Makefile 2013-02-15 14:24:00.000000000 +0000 +++ ./tests/tests2/Makefile 2015-04-13 15:31:12.897931195 +0100 @@ -67,7 +67,8 @@ 51_static.test \ 52_unnamed_enum.test \ 54_goto.test \ - 55_lshift_type.test + 55_lshift_type.test \ + 56_dollars.test # 30_hanoi.test -- seg fault in the code, gcc as well # 34_array_assignment.test -- array assignment is not in C standard @@ -83,8 +84,10 @@ %.test: %.c %.expect @echo Test: $*... - @if [ "x`echo $* | grep args`" != "x" ]; \ + @if [ "x`echo $* | grep args`" != "x" ]; \ then $(TCC_RUN) $< - arg1 arg2 arg3 arg4 >$*.output; \ + elif [ "x`echo $* | grep dollars`" != "x" ]; \ + then $(TCC_RUN) -fdollars-in-identifiers $< >$*.output; \ else $(TCC_RUN) $< >$*.output; \ fi @if diff -bu $(<:.c=.expect) $*.output ; \ diff -urN ../tcc-0.9.26/tests/tests2/56_dollars.c ./tests/tests2/56_dollars.c --- ../tcc-0.9.26/tests/tests2/56_dollars.c 1970-01-01 01:00:00.000000000 +0100 +++ ./tests/tests2/56_dollars.c 2015-04-13 15:32:55.681929706 +0100 @@ -0,0 +1,42 @@ +#include + +#define $(x) x +#define $fred 10 +#define joe$ 20 +#define hen$y 30 + +#define $10(x) x*10 +#define _$10(x) x/10 + +int main() +{ + printf("fred=%d\n", $fred); + printf("joe=%d\n", joe$); + printf("henry=%d\n", hen$y); + + printf("fred2=%d\n", $($fred)); + printf("joe2=%d\n", $(joe$)); + printf("henry2=%d\n", $(hen$y)); + + printf("fred10=%d\n", $10($fred)); + printf("joe_10=%d\n", _$10(joe$)); + + int $ = 10; + int a100$ = 100; + int a$$ = 1000; + int a$c$b = 2121; + int $100 = 10000; + const char *$$$ = "money"; + + printf("local=%d\n", $); + printf("a100$=%d\n", a100$); + printf("a$$=%d\n", a$$); + printf("a$c$b=%d\n", a$c$b); + printf("$100=%d\n", $100); + printf("$$$=%s", $$$); + + return 0; +} + +/* vim: set expandtab ts=4 sw=3 sts=3 tw=80 :*/ + diff -urN ../tcc-0.9.26/tests/tests2/56_dollars.expect ./tests/tests2/56_dollars.expect --- ../tcc-0.9.26/tests/tests2/56_dollars.expect 1970-01-01 01:00:00.000000000 +0100 +++ ./tests/tests2/56_dollars.expect 2015-04-13 15:33:06.237929553 +0100 @@ -0,0 +1,14 @@ +fred=10 +joe=20 +henry=30 +fred2=10 +joe2=20 +henry2=30 +fred10=100 +joe_10=2 +local=10 +a100$=100 +a$$=1000 +a$c$b=2121 +$100=10000 +$$$=money