diff --git a/libtcc.c b/libtcc.c index 5467298..ee149aa 100644 --- a/libtcc.c +++ b/libtcc.c @@ -1304,7 +1304,8 @@ ST_FUNC int tcc_add_file_internal(TCCState *s1, const char *filename, int flags, parse_flags = 0; #ifdef CONFIG_TCC_ASM /* if .S file, define __ASSEMBLER__ like gcc does */ - if ((filetype == TCC_FILETYPE_ASM) || (filetype == TCC_FILETYPE_ASM_PP)) { + if (filetype == TCC_FILETYPE_ASM + || filetype == TCC_FILETYPE_ASM_PP) { tcc_define_symbol(s1, "__ASSEMBLER__", NULL); parse_flags = PARSE_FLAG_ASM_FILE; } @@ -2048,33 +2049,29 @@ static void parse_option_D(TCCState *s1, const char *optarg) static void args_parser_add_file(TCCState *s, const char* filename, int filetype) { - int len = strlen(filename); - char *p = tcc_malloc(len + 2); - if (filetype) { - *p = filetype; - } - else { + struct filespec *f = tcc_malloc(sizeof *f + strlen(filename)); + + if (filetype == 0) { /* use a file extension to detect a filetype */ const char *ext = tcc_fileextension(filename); if (ext[0]) { ext++; if (!strcmp(ext, "S")) - *p = TCC_FILETYPE_ASM_PP; + filetype = TCC_FILETYPE_ASM_PP; + else if (!strcmp(ext, "s")) + filetype = TCC_FILETYPE_ASM; + else if (!PATHCMP(ext, "c") || !PATHCMP(ext, "i")) + filetype = TCC_FILETYPE_C; else - if (!strcmp(ext, "s")) - *p = TCC_FILETYPE_ASM; - else - if (!PATHCMP(ext, "c") || !PATHCMP(ext, "i")) - *p = TCC_FILETYPE_C; - else - *p = TCC_FILETYPE_BINARY; - } - else { - *p = TCC_FILETYPE_C; + filetype = TCC_FILETYPE_BINARY; + } else { + filetype = TCC_FILETYPE_C; } } - strcpy(p+1, filename); - dynarray_add((void ***)&s->files, &s->nb_files, p); + + f->type = filetype; + strcpy(f->name, filename); + dynarray_add((void ***)&s->files, &s->nb_files, f); } ST_FUNC int tcc_parse_args1(TCCState *s, int argc, char **argv) @@ -2158,7 +2155,7 @@ ST_FUNC int tcc_parse_args1(TCCState *s, int argc, char **argv) tcc_set_lib_path(s, optarg); break; case TCC_OPTION_l: - args_parser_add_file(s, r, TCC_FILETYPE_BINARY); + args_parser_add_file(s, optarg, 'l'); s->nb_libraries++; break; case TCC_OPTION_pthread: diff --git a/libtcc.h b/libtcc.h index 97b8587..ad081fc 100644 --- a/libtcc.h +++ b/libtcc.h @@ -49,10 +49,10 @@ LIBTCCAPI void tcc_undefine_symbol(TCCState *s, const char *sym); /* add a file (C file, dll, object, library, ld script). Return -1 if error. */ LIBTCCAPI int tcc_add_file(TCCState *s, const char *filename, int filetype); -#define TCC_FILETYPE_BINARY 1 -#define TCC_FILETYPE_C 2 -#define TCC_FILETYPE_ASM 3 -#define TCC_FILETYPE_ASM_PP 4 +#define TCC_FILETYPE_BINARY 'b' +#define TCC_FILETYPE_C 'c' +#define TCC_FILETYPE_ASM 's' +#define TCC_FILETYPE_ASM_PP 'S' /* compile a string containing a C source. Return -1 if error. */ LIBTCCAPI int tcc_compile_string(TCCState *s, const char *buf); diff --git a/tcc.c b/tcc.c index cf08614..0132a2e 100644 --- a/tcc.c +++ b/tcc.c @@ -307,23 +307,17 @@ int main(int argc, char **argv) /* compile or add each files or library */ for(i = ret = 0; i < s->nb_files && ret == 0; i++) { - int filetype = *(unsigned char *)s->files[i]; - const char *filename = s->files[i] + 1; - if (filename[0] == '-' && filename[1] == 'l') { - if (tcc_add_library(s, filename + 2) < 0) { - /* don't fail on -lm as it's harmless to skip math lib */ - if (strcmp(filename + 2, "m")) { - tcc_error_noabort("cannot find library 'lib%s'", filename + 2); - ret = 1; - } - } + struct filespec *f = s->files[i]; + if (f->type == 'l') { + if (tcc_add_library_err(s, f->name) < 0) + ret = 1; } else { if (1 == s->verbose) - printf("-> %s\n", filename); - if (tcc_add_file(s, filename, filetype) < 0) + printf("-> %s\n", f->name); + if (tcc_add_file(s, f->name, f->type) < 0) ret = 1; if (!first_file) - first_file = filename; + first_file = f->name; } } diff --git a/tcc.h b/tcc.h index cfff7cf..42088e1 100644 --- a/tcc.h +++ b/tcc.h @@ -850,7 +850,7 @@ struct TCCState { #endif /* used by main and tcc_parse_args only */ - char **files; /* files seen on command line */ + struct filespec **files; /* files seen on command line */ int nb_files; /* number thereof */ int nb_libraries; /* number of libs thereof */ char *outfile; /* output filename */ @@ -863,6 +863,10 @@ struct TCCState { ParseArgsState *parse_args_state; }; +struct filespec { + char type, name[1]; +}; + /* The current value can be: */ #define VT_VALMASK 0x003f /* mask for value location, register or: */ #define VT_CONST 0x0030 /* constant in vc (must be first non register value) */