aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorgrischka <grischka>2014-03-29 16:40:54 +0100
committergrischka <grischka>2014-03-29 19:37:26 +0100
commit0ac8aaab1bef770929e5592d02bc06d3a529952e (patch)
treed1595a16367c4a41786245b15b5b4630fbe92dd8
parent10750872419df9dc92421c4fd719f42e5561ee77 (diff)
downloadtinycc-0ac8aaab1bef770929e5592d02bc06d3a529952e.tar.gz
tinycc-0ac8aaab1bef770929e5592d02bc06d3a529952e.tar.bz2
tccpp: reorder some tokens
... and make future reordering possibly easier related to 9a6ee577f6165dccfde424732bfc6f16f1e2811b
-rw-r--r--tcc.h33
-rw-r--r--tccpp.c44
2 files changed, 56 insertions, 21 deletions
diff --git a/tcc.h b/tcc.h
index e83e6c0..f89b146 100644
--- a/tcc.h
+++ b/tcc.h
@@ -783,35 +783,38 @@ struct TCCState {
#define TOK_LAND 0xa0
#define TOK_LOR 0xa1
-
#define TOK_DEC 0xa2
#define TOK_MID 0xa3 /* inc/dec, to void constant */
#define TOK_INC 0xa4
#define TOK_UDIV 0xb0 /* unsigned division */
#define TOK_UMOD 0xb1 /* unsigned modulo */
#define TOK_PDIV 0xb2 /* fast division with undefined rounding for pointers */
-#define TOK_CINT 0xb3 /* number in tokc */
-#define TOK_CCHAR 0xb4 /* char constant in tokc */
-#define TOK_STR 0xb5 /* pointer to string in tokc */
-#define TOK_TWOSHARPS 0xb6 /* ## preprocessing token */
-#define TOK_LCHAR 0xb7
-#define TOK_LSTR 0xb8
-#define TOK_CFLOAT 0xb9 /* float constant */
-#define TOK_LINENUM 0xba /* line number info */
-#define TOK_CDOUBLE 0xc0 /* double constant */
-#define TOK_CLDOUBLE 0xc1 /* long double constant */
+
+/* tokens that carry values (in additional token string space / tokc) --> */
+#define TOK_CCHAR 0xb3 /* char constant in tokc */
+#define TOK_LCHAR 0xb4
+#define TOK_CINT 0xb5 /* number in tokc */
+#define TOK_CUINT 0xb6 /* unsigned int constant */
+#define TOK_CLLONG 0xb7 /* long long constant */
+#define TOK_CULLONG 0xb8 /* unsigned long long constant */
+#define TOK_STR 0xb9 /* pointer to string in tokc */
+#define TOK_LSTR 0xba
+#define TOK_CFLOAT 0xbb /* float constant */
+#define TOK_CDOUBLE 0xbc /* double constant */
+#define TOK_CLDOUBLE 0xbd /* long double constant */
+#define TOK_PPNUM 0xbe /* preprocessor number */
+#define TOK_LINENUM 0xbf /* line number info */
+/* <-- */
+
+#define TOK_TWOSHARPS 0xc0 /* ## preprocessing token */
#define TOK_UMULL 0xc2 /* unsigned 32x32 -> 64 mul */
#define TOK_ADDC1 0xc3 /* add with carry generation */
#define TOK_ADDC2 0xc4 /* add with carry use */
#define TOK_SUBC1 0xc5 /* add with carry generation */
#define TOK_SUBC2 0xc6 /* add with carry use */
-#define TOK_CUINT 0xc8 /* unsigned int constant */
-#define TOK_CLLONG 0xc9 /* long long constant */
-#define TOK_CULLONG 0xca /* unsigned long long constant */
#define TOK_ARROW 0xcb
#define TOK_DOTS 0xcc /* three dots */
#define TOK_SHR 0xcd /* unsigned shift right */
-#define TOK_PPNUM 0xce /* preprocessor number */
#define TOK_NOSUBST 0xcf /* means following token has already been pp'd */
#define TOK_SHL 0x01 /* shift left */
diff --git a/tccpp.c b/tccpp.c
index f4b7b1a..b2e389b 100644
--- a/tccpp.c
+++ b/tccpp.c
@@ -70,8 +70,33 @@ static const char tcc_keywords[] =
/* WARNING: the content of this string encodes token numbers */
static const unsigned char tok_two_chars[] =
+/* outdated -- gr
"<=\236>=\235!=\225&&\240||\241++\244--\242==\224<<\1>>\2+=\253"
"-=\255*=\252/=\257%=\245&=\246^=\336|=\374->\313..\250##\266";
+*/{
+ '<','=', TOK_LE,
+ '>','=', TOK_GE,
+ '!','=', TOK_NE,
+ '&','&', TOK_LAND,
+ '|','|', TOK_LOR,
+ '+','+', TOK_INC,
+ '-','-', TOK_DEC,
+ '=','=', TOK_EQ,
+ '<','<', TOK_SHL,
+ '>','>', TOK_SHR,
+ '+','=', TOK_A_ADD,
+ '-','=', TOK_A_SUB,
+ '*','=', TOK_A_MUL,
+ '/','=', TOK_A_DIV,
+ '%','=', TOK_A_MOD,
+ '&','=', TOK_A_AND,
+ '^','=', TOK_A_XOR,
+ '|','=', TOK_A_OR,
+ '-','>', TOK_ARROW,
+ '.','.', 0xa8, // C++ token ?
+ '#','#', TOK_TWOSHARPS,
+ 0
+};
struct macro_level {
struct macro_level *prev;
@@ -255,21 +280,19 @@ ST_FUNC char *get_tok_str(int v, CValue *cv)
static char buf[STRING_MAX_SIZE + 1];
static CString cstr_buf;
CString *cstr;
- CValue cval;
char *p;
int i, len;
- if (!cv) {
- cval.ull = 0;
- cv = &cval;
- }
-
/* NOTE: to go faster, we give a fixed buffer for small strings */
cstr_reset(&cstr_buf);
cstr_buf.data = buf;
cstr_buf.size_allocated = sizeof(buf);
p = buf;
+/* just an explanation, should never happen:
+ if (v <= TOK_LINENUM && v >= TOK_CINT && cv == NULL)
+ tcc_error("internal error: get_tok_str"); */
+
switch(v) {
case TOK_CINT:
case TOK_CUINT:
@@ -317,6 +340,15 @@ ST_FUNC char *get_tok_str(int v, CValue *cv)
cstr_ccat(&cstr_buf, '\"');
cstr_ccat(&cstr_buf, '\0');
break;
+
+ case TOK_CFLOAT:
+ case TOK_CDOUBLE:
+ case TOK_CLDOUBLE:
+ case TOK_LINENUM:
+ return NULL; /* should not happen */
+
+ /* above tokens have value, the ones below don't */
+
case TOK_LT:
v = '<';
goto addv;