aboutsummaryrefslogtreecommitdiff
path: root/libtcc.c
diff options
context:
space:
mode:
Diffstat (limited to 'libtcc.c')
-rw-r--r--libtcc.c278
1 files changed, 1 insertions, 277 deletions
diff --git a/libtcc.c b/libtcc.c
index 383e5a5..c9505d6 100644
--- a/libtcc.c
+++ b/libtcc.c
@@ -92,8 +92,6 @@ static int nb_sym_pools;
static SValue vstack[VSTACK_SIZE], *vtop;
/* some predefined types */
static CType char_pointer_type, func_old_type, int_type;
-/* true if isid(c) || isnum(c) */
-static unsigned char isidnum_table[256-CH_EOF];
/* display some information during compilation */
static int verbose = 0;
@@ -105,9 +103,6 @@ static int do_debug = 0;
static int do_bounds_check = 0;
/* display benchmark infos */
-#if !defined(LIBTCC)
-static int do_bench = 0;
-#endif
static int total_lines;
static int total_bytes;
@@ -251,34 +246,6 @@ static char *pstrcat(char *buf, int buf_size, const char *s)
return buf;
}
-#ifndef LIBTCC
-static int strstart(const char *str, const char *val, const char **ptr)
-{
- const char *p, *q;
- p = str;
- q = val;
- while (*q != '\0') {
- if (*p != *q)
- return 0;
- p++;
- q++;
- }
- if (ptr)
- *ptr = p;
- return 1;
-}
-#endif
-
-#ifdef _WIN32
-#define IS_PATHSEP(c) (c == '/' || c == '\\')
-#define IS_ABSPATH(p) (IS_PATHSEP(p[0]) || (p[0] && p[1] == ':' && IS_PATHSEP(p[2])))
-#define PATHCMP stricmp
-#else
-#define IS_PATHSEP(c) (c == '/')
-#define IS_ABSPATH(p) IS_PATHSEP(p[0])
-#define PATHCMP strcmp
-#endif
-
/* extract the basename of a file */
static char *tcc_basename(const char *name)
{
@@ -556,8 +523,6 @@ Section *find_section(TCCState *s1, const char *name)
return new_section(s1, name, SHT_PROGBITS, SHF_ALLOC);
}
-#define SECTION_ABS ((void *)1)
-
/* update sym->c so that it points to an external symbol in section
'section' with value 'value' */
static void put_extern_sym2(Sym *sym, Section *section,
@@ -809,66 +774,6 @@ static void test_lvalue(void)
expect("lvalue");
}
-/* allocate a new token */
-static TokenSym *tok_alloc_new(TokenSym **pts, const char *str, int len)
-{
- TokenSym *ts, **ptable;
- int i;
-
- if (tok_ident >= SYM_FIRST_ANOM)
- error("memory full");
-
- /* expand token table if needed */
- i = tok_ident - TOK_IDENT;
- if ((i % TOK_ALLOC_INCR) == 0) {
- ptable = tcc_realloc(table_ident, (i + TOK_ALLOC_INCR) * sizeof(TokenSym *));
- if (!ptable)
- error("memory full");
- table_ident = ptable;
- }
-
- ts = tcc_malloc(sizeof(TokenSym) + len);
- table_ident[i] = ts;
- ts->tok = tok_ident++;
- ts->sym_define = NULL;
- ts->sym_label = NULL;
- ts->sym_struct = NULL;
- ts->sym_identifier = NULL;
- ts->len = len;
- ts->hash_next = NULL;
- memcpy(ts->str, str, len);
- ts->str[len] = '\0';
- *pts = ts;
- return ts;
-}
-
-#define TOK_HASH_INIT 1
-#define TOK_HASH_FUNC(h, c) ((h) * 263 + (c))
-
-/* find a token and add it if not found */
-static TokenSym *tok_alloc(const char *str, int len)
-{
- TokenSym *ts, **pts;
- int i;
- unsigned int h;
-
- h = TOK_HASH_INIT;
- for(i=0;i<len;i++)
- h = TOK_HASH_FUNC(h, ((unsigned char *)str)[i]);
- h &= (TOK_HASH_SIZE - 1);
-
- pts = &hash_ident[h];
- for(;;) {
- ts = *pts;
- if (!ts)
- break;
- if (ts->len == len && !memcmp(ts->str, str, len))
- return ts;
- pts = &(ts->hash_next);
- }
- return tok_alloc_new(pts, str, len);
-}
-
/* CString handling */
static void cstr_realloc(CString *cstr, int new_size)
@@ -958,108 +863,6 @@ static void add_char(CString *cstr, int c)
}
}
-/* XXX: buffer overflow */
-/* XXX: float tokens */
-char *get_tok_str(int v, CValue *cv)
-{
- static char buf[STRING_MAX_SIZE + 1];
- static CString cstr_buf;
- CString *cstr;
- unsigned char *q;
- char *p;
- int i, len;
-
- /* 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;
-
- switch(v) {
- case TOK_CINT:
- case TOK_CUINT:
- /* XXX: not quite exact, but only useful for testing */
- sprintf(p, "%u", cv->ui);
- break;
- case TOK_CLLONG:
- case TOK_CULLONG:
- /* XXX: not quite exact, but only useful for testing */
- sprintf(p, "%Lu", cv->ull);
- break;
- case TOK_LCHAR:
- cstr_ccat(&cstr_buf, 'L');
- case TOK_CCHAR:
- cstr_ccat(&cstr_buf, '\'');
- add_char(&cstr_buf, cv->i);
- cstr_ccat(&cstr_buf, '\'');
- cstr_ccat(&cstr_buf, '\0');
- break;
- case TOK_PPNUM:
- cstr = cv->cstr;
- len = cstr->size - 1;
- for(i=0;i<len;i++)
- add_char(&cstr_buf, ((unsigned char *)cstr->data)[i]);
- cstr_ccat(&cstr_buf, '\0');
- break;
- case TOK_LSTR:
- cstr_ccat(&cstr_buf, 'L');
- case TOK_STR:
- cstr = cv->cstr;
- cstr_ccat(&cstr_buf, '\"');
- if (v == TOK_STR) {
- len = cstr->size - 1;
- for(i=0;i<len;i++)
- add_char(&cstr_buf, ((unsigned char *)cstr->data)[i]);
- } else {
- len = (cstr->size / sizeof(nwchar_t)) - 1;
- for(i=0;i<len;i++)
- add_char(&cstr_buf, ((nwchar_t *)cstr->data)[i]);
- }
- cstr_ccat(&cstr_buf, '\"');
- cstr_ccat(&cstr_buf, '\0');
- break;
- case TOK_LT:
- v = '<';
- goto addv;
- case TOK_GT:
- v = '>';
- goto addv;
- case TOK_DOTS:
- return strcpy(p, "...");
- case TOK_A_SHL:
- return strcpy(p, "<<=");
- case TOK_A_SAR:
- return strcpy(p, ">>=");
- default:
- if (v < TOK_IDENT) {
- /* search in two bytes table */
- q = tok_two_chars;
- while (*q) {
- if (q[2] == v) {
- *p++ = q[0];
- *p++ = q[1];
- *p = '\0';
- return buf;
- }
- q += 3;
- }
- addv:
- *p++ = v;
- *p = '\0';
- } else if (v < tok_ident) {
- return table_ident[v - TOK_IDENT]->str;
- } else if (v >= SYM_FIRST_ANOM) {
- /* special name for anonymous symbol */
- sprintf(p, "L.%u", v - SYM_FIRST_ANOM);
- } else {
- /* should never happen */
- return NULL;
- }
- break;
- }
- return cstr_buf.data;
-}
-
/* push, without hashing */
static Sym *sym_push2(Sym **ps, int v, int t, long c)
{
@@ -1220,21 +1023,6 @@ void tcc_close(BufferedFile *bf)
#include "tccpp.c"
#include "tccgen.c"
-/* better than nothing, but needs extension to handle '-E' option
- correctly too */
-static void preprocess_init(TCCState *s1)
-{
- s1->include_stack_ptr = s1->include_stack;
- /* XXX: move that before to avoid having to initialize
- file->ifdef_stack_ptr ? */
- s1->ifdef_stack_ptr = s1->ifdef_stack;
- file->ifdef_stack_ptr = s1->ifdef_stack_ptr;
-
- /* XXX: not ANSI compliant: bound checking says error */
- vtop = vstack - 1;
- s1->pack_stack[0] = 0;
- s1->pack_stack_ptr = s1->pack_stack;
-}
/* compile the C file opened in 'file'. Return non zero if errors. */
static int tcc_compile(TCCState *s1)
@@ -1342,48 +1130,6 @@ static int tcc_compile(TCCState *s1)
return s1->nb_errors != 0 ? -1 : 0;
}
-/* Preprocess the current file */
-static int tcc_preprocess(TCCState *s1)
-{
- Sym *define_start;
- BufferedFile *file_ref;
- int token_seen, line_ref;
-
- preprocess_init(s1);
- define_start = define_stack;
- ch = file->buf_ptr[0];
- tok_flags = TOK_FLAG_BOL | TOK_FLAG_BOF;
- parse_flags = PARSE_FLAG_ASM_COMMENTS | PARSE_FLAG_PREPROCESS |
- PARSE_FLAG_LINEFEED | PARSE_FLAG_SPACES;
- token_seen = 0;
- line_ref = 0;
- file_ref = NULL;
-
- for (;;) {
- next();
- if (tok == TOK_EOF) {
- break;
- } else if (tok == TOK_LINEFEED) {
- if (!token_seen)
- continue;
- ++line_ref;
- token_seen = 0;
- } else if (!token_seen) {
- int d = file->line_num - line_ref;
- if (file != file_ref || d < 0 || d >= 8)
- fprintf(s1->outfile, "# %d \"%s\"\n", file->line_num, file->filename);
- else
- while (d)
- fputs("\n", s1->outfile), --d;
- line_ref = (file_ref = file)->line_num;
- token_seen = 1;
- }
- fputs(get_tok_str(tok, &tokc), s1->outfile);
- }
- free_defines(define_start);
- return 0;
-}
-
#ifdef LIBTCC
int tcc_compile_string(TCCState *s, const char *str)
{
@@ -1909,10 +1655,7 @@ static void tcc_cleanup(void)
TCCState *tcc_new(void)
{
- const char *p, *r;
TCCState *s;
- TokenSym *ts;
- int i, c;
tcc_cleanup();
@@ -1922,26 +1665,7 @@ TCCState *tcc_new(void)
tcc_state = s;
s->output_type = TCC_OUTPUT_MEMORY;
- /* init isid table */
- for(i=CH_EOF;i<256;i++)
- isidnum_table[i-CH_EOF] = isid(i) || isnum(i);
-
- /* add all tokens */
- table_ident = NULL;
- memset(hash_ident, 0, TOK_HASH_SIZE * sizeof(TokenSym *));
-
- tok_ident = TOK_IDENT;
- p = tcc_keywords;
- while (*p) {
- r = p;
- for(;;) {
- c = *r++;
- if (c == '\0')
- break;
- }
- ts = tok_alloc(p, r - p - 1);
- p = r;
- }
+ preprocess_new();
/* we add dummy defines for some special macros to speed up tests
and to have working defined() */