tccpp: convert TOK_GET macro into function

master
grischka 2010-01-14 20:58:03 +01:00
parent 280e20b1d3
commit 4e5170d4a5
3 changed files with 71 additions and 75 deletions

6
tcc.h
View File

@ -191,7 +191,7 @@ typedef union CValue {
unsigned long long ull;
struct CString *cstr;
void *ptr;
int tab[1];
int tab[2];
} CValue;
/* value on stack */
@ -334,7 +334,7 @@ typedef struct BufferedFile {
/* parsing state (used to save parser state to reparse part of the
source several times) */
typedef struct ParseState {
int *macro_ptr;
const int *macro_ptr;
int line_num;
int tok;
CValue tokc;
@ -920,7 +920,7 @@ ST_FUNC int ieee_finite(double d);
ST_DATA struct BufferedFile *file;
ST_DATA int ch, tok;
ST_DATA CValue tokc;
ST_DATA int *macro_ptr;
ST_DATA const int *macro_ptr;
ST_DATA int parse_flags;
ST_DATA int tok_flags;
ST_DATA CString tokcstr; /* current parsed string, if any */

View File

@ -738,7 +738,8 @@ ST_FUNC int tcc_assemble(TCCState *s1, int do_preprocess)
static void tcc_assemble_inline(TCCState *s1, char *str, int len)
{
BufferedFile *bf, *saved_file;
int saved_parse_flags, *saved_macro_ptr;
int saved_parse_flags;
const int *saved_macro_ptr;
bf = tcc_malloc(sizeof(BufferedFile));
memset(bf, 0, sizeof(BufferedFile));

137
tccpp.c
View File

@ -42,7 +42,7 @@ ST_DATA int parse_flags;
ST_DATA struct BufferedFile *file;
ST_DATA int ch, tok;
ST_DATA CValue tokc;
ST_DATA int *macro_ptr;
ST_DATA const int *macro_ptr;
ST_DATA CString tokcstr; /* current parsed string, if any */
/* display benchmark infos */
@ -54,7 +54,7 @@ ST_DATA TokenSym **table_ident;
/* ------------------------------------------------------------------------- */
static int *macro_ptr_allocated;
static int *unget_saved_macro_ptr;
static const int *unget_saved_macro_ptr;
static int unget_saved_buffer[TOK_MAX_SIZE + 1];
static int unget_buffer_enabled;
static TokenSym *hash_ident[TOK_HASH_SIZE];
@ -75,7 +75,7 @@ static const unsigned char tok_two_chars[] =
struct macro_level {
struct macro_level *prev;
int *p;
const int *p;
};
ST_FUNC void next_nomacro(void);
@ -940,61 +940,54 @@ ST_FUNC void tok_str_add_tok(TokenString *s)
tok_str_add2(s, tok, &tokc);
}
#if LDOUBLE_SIZE == 16
#define LDOUBLE_GET(p, cv) \
cv.tab[0] = p[0]; \
cv.tab[1] = p[1]; \
cv.tab[2] = p[2]; \
cv.tab[3] = p[3];
#elif LDOUBLE_SIZE == 12
#define LDOUBLE_GET(p, cv) \
cv.tab[0] = p[0]; \
cv.tab[1] = p[1]; \
cv.tab[2] = p[2];
#elif LDOUBLE_SIZE == 8
#define LDOUBLE_GET(p, cv) \
cv.tab[0] = p[0]; \
cv.tab[1] = p[1];
#else
#error add long double size support
#endif
/* get a token from an integer array and increment pointer
accordingly. we code it as a macro to avoid pointer aliasing. */
#define TOK_GET(t, p, cv) \
{ \
t = *p++; \
switch(t) { \
case TOK_CINT: \
case TOK_CUINT: \
case TOK_CCHAR: \
case TOK_LCHAR: \
case TOK_CFLOAT: \
case TOK_LINENUM: \
cv.tab[0] = *p++; \
break; \
case TOK_STR: \
case TOK_LSTR: \
case TOK_PPNUM: \
cv.cstr = (CString *)p; \
cv.cstr->data = (char *)p + sizeof(CString);\
p += (sizeof(CString) + cv.cstr->size + 3) >> 2;\
break; \
case TOK_CDOUBLE: \
case TOK_CLLONG: \
case TOK_CULLONG: \
cv.tab[0] = p[0]; \
cv.tab[1] = p[1]; \
p += 2; \
break; \
case TOK_CLDOUBLE: \
LDOUBLE_GET(p, cv); \
p += LDOUBLE_SIZE / 4; \
break; \
default: \
break; \
} \
static inline void TOK_GET(int *t, const int **pp, CValue *cv)
{
const int *p = *pp;
int n, *tab;
tab = cv->tab;
switch(*t = *p++) {
case TOK_CINT:
case TOK_CUINT:
case TOK_CCHAR:
case TOK_LCHAR:
case TOK_CFLOAT:
case TOK_LINENUM:
tab[0] = *p++;
break;
case TOK_STR:
case TOK_LSTR:
case TOK_PPNUM:
cv->cstr = (CString *)p;
cv->cstr->data = (char *)p + sizeof(CString);
p += (sizeof(CString) + cv->cstr->size + 3) >> 2;
break;
case TOK_CDOUBLE:
case TOK_CLLONG:
case TOK_CULLONG:
n = 2;
goto copy;
case TOK_CLDOUBLE:
#if LDOUBLE_SIZE == 16
n = 4;
#elif LDOUBLE_SIZE == 12
n = 3;
#elif LDOUBLE_SIZE == 8
n = 2;
#else
# error add long double size support
#endif
copy:
do
*tab++ = *p++;
while (--n);
break;
default:
break;
}
*pp = p;
}
static int macro_is_equal(const int *a, const int *b)
@ -1003,9 +996,9 @@ static int macro_is_equal(const int *a, const int *b)
CValue cv;
int t;
while (*a && *b) {
TOK_GET(t, a, cv);
TOK_GET(&t, &a, &cv);
pstrcpy(buf, sizeof buf, get_tok_str(t, &cv));
TOK_GET(t, b, cv);
TOK_GET(&t, &b, &cv);
if (strcmp(buf, get_tok_str(t, &cv)))
return 0;
}
@ -1163,7 +1156,7 @@ static void tok_print(int *str)
printf("<");
while (1) {
TOK_GET(t, str, cval);
TOK_GET(&t, &str, &cval);
if (!t)
break;
printf("%s", get_tok_str(t, &cval));
@ -2498,7 +2491,7 @@ static void next_nomacro_spc(void)
redo:
tok = *macro_ptr;
if (tok) {
TOK_GET(tok, macro_ptr, tokc);
TOK_GET(&tok, &macro_ptr, &tokc);
if (tok == TOK_LINENUM) {
file->line_num = tokc.i;
goto redo;
@ -2517,9 +2510,10 @@ ST_FUNC void next_nomacro(void)
}
/* substitute args in macro_str and return allocated string */
static int *macro_arg_subst(Sym **nested_list, int *macro_str, Sym *args)
static int *macro_arg_subst(Sym **nested_list, const int *macro_str, Sym *args)
{
int *st, last_tok, t, spc;
int last_tok, t, spc;
const int *st;
Sym *s;
CValue cval;
TokenString str;
@ -2528,12 +2522,12 @@ static int *macro_arg_subst(Sym **nested_list, int *macro_str, Sym *args)
tok_str_new(&str);
last_tok = 0;
while(1) {
TOK_GET(t, macro_str, cval);
TOK_GET(&t, &macro_str, &cval);
if (!t)
break;
if (t == '#') {
/* stringize */
TOK_GET(t, macro_str, cval);
TOK_GET(&t, &macro_str, &cval);
if (!t)
break;
s = sym_find2(args, t);
@ -2542,7 +2536,7 @@ static int *macro_arg_subst(Sym **nested_list, int *macro_str, Sym *args)
st = s->d;
spc = 0;
while (*st) {
TOK_GET(t, st, cval);
TOK_GET(&t, &st, &cval);
if (!check_space(t, &spc))
cstr_cat(&cstr, get_tok_str(t, &cval));
}
@ -2584,7 +2578,7 @@ static int *macro_arg_subst(Sym **nested_list, int *macro_str, Sym *args)
int t1;
add_var:
for(;;) {
TOK_GET(t1, st, cval);
TOK_GET(&t1, &st, &cval);
if (!t1)
break;
tok_str_add2(&str, t1, &cval);
@ -2621,7 +2615,8 @@ static int macro_subst_tok(TokenString *tok_str,
Sym **nested_list, Sym *s, struct macro_level **can_read_stream)
{
Sym *args, *sa, *sa1;
int mstr_allocated, parlevel, *mstr, t, t1, *p, spc;
int mstr_allocated, parlevel, *mstr, t, t1, spc;
const int *p;
TokenString str;
char *cstrval;
CValue cval;
@ -2785,7 +2780,7 @@ static inline int *macro_twosharps(const int *macro_str)
/* we search the first '##' */
for(ptr = macro_str;;) {
TOK_GET(t, ptr, cval);
TOK_GET(&t, &ptr, &cval);
if (t == TOK_TWOSHARPS)
break;
/* nothing more to do if end of string */
@ -2796,7 +2791,7 @@ static inline int *macro_twosharps(const int *macro_str)
/* we saw '##', so we need more processing to handle it */
tok_str_new(&macro_str1);
for(ptr = macro_str;;) {
TOK_GET(tok, ptr, tokc);
TOK_GET(&tok, &ptr, &tokc);
if (tok == 0)
break;
if (tok == TOK_TWOSHARPS)
@ -2804,7 +2799,7 @@ static inline int *macro_twosharps(const int *macro_str)
while (*ptr == TOK_TWOSHARPS) {
t = *++ptr;
if (t && t != TOK_TWOSHARPS) {
TOK_GET(t, ptr, cval);
TOK_GET(&t, &ptr, &cval);
/* We concatenate the two tokens */
cstr_new(&cstr);
@ -2859,7 +2854,7 @@ static void macro_subst(TokenString *tok_str, Sym **nested_list,
file stream due to a macro function call */
if (ptr == NULL)
break;
TOK_GET(t, ptr, cval);
TOK_GET(&t, &ptr, &cval);
if (t == 0)
break;
s = define_find(t);