History

libtcc: cleanup -x<filetype> switch code

Abusing filename[0] as type is just too much of a hack. -- From 05364072042ff37904a7b0b14cdd85a1ea1ca11d

grischka committed 10 years ago

Commit 09a487e1 parent e6301134 files · +34 −39Browse files

Unified · Split

4 files
  1. libtcc.c +18 −21
  2. libtcc.h +4 −4
  3. tcc.c +7 −13
  4. tcc.h +5 −1
libtcc.c+18−21
@@ -1304,7 +1304,8 @@ ST_FUNC int tcc_add_file_internal(TCCState *s1, const char *filename, int flags, · 1303 unmodified lines
1304 parse_flags = 0;1304 parse_flags = 0;
1305#ifdef CONFIG_TCC_ASM1305#ifdef CONFIG_TCC_ASM
1306 /* if .S file, define __ASSEMBLER__ like gcc does */1306 /* if .S file, define __ASSEMBLER__ like gcc does */
1307 if ((filetype == TCC_FILETYPE_ASM) || (filetype == TCC_FILETYPE_ASM_PP)) {1307 if (filetype == TCC_FILETYPE_ASM
1308 || filetype == TCC_FILETYPE_ASM_PP) {
1308 tcc_define_symbol(s1, "__ASSEMBLER__", NULL);1309 tcc_define_symbol(s1, "__ASSEMBLER__", NULL);
1309 parse_flags = PARSE_FLAG_ASM_FILE;1310 parse_flags = PARSE_FLAG_ASM_FILE;
1310 }1311 }
@@ -2048,33 +2049,29 @@ static void parse_option_D(TCCState *s1, const char *optarg) · 737 unmodified lines
2048 2049
2049static void args_parser_add_file(TCCState *s, const char* filename, int filetype)2050static void args_parser_add_file(TCCState *s, const char* filename, int filetype)
2050{2051{
2051 int len = strlen(filename);2052 struct filespec *f = tcc_malloc(sizeof *f + strlen(filename));
2052 char *p = tcc_malloc(len + 2);2053
2053 if (filetype) {2054 if (filetype == 0) {
2054 *p = filetype;
2055 }
2056 else {
2057 /* use a file extension to detect a filetype */2055 /* use a file extension to detect a filetype */
2058 const char *ext = tcc_fileextension(filename);2056 const char *ext = tcc_fileextension(filename);
2059 if (ext[0]) {2057 if (ext[0]) {
2060 ext++;2058 ext++;
2061 if (!strcmp(ext, "S"))2059 if (!strcmp(ext, "S"))
2062 *p = TCC_FILETYPE_ASM_PP;2060 filetype = TCC_FILETYPE_ASM_PP;
2063 else2061 else if (!strcmp(ext, "s"))
2064 if (!strcmp(ext, "s"))2062 filetype = TCC_FILETYPE_ASM;
2065 *p = TCC_FILETYPE_ASM;2063 else if (!PATHCMP(ext, "c") || !PATHCMP(ext, "i"))
2064 filetype = TCC_FILETYPE_C;
2066 else2065 else
2067 if (!PATHCMP(ext, "c") || !PATHCMP(ext, "i"))2066 filetype = TCC_FILETYPE_BINARY;
2068 *p = TCC_FILETYPE_C;2067 } else {
2069 else2068 filetype = TCC_FILETYPE_C;
2070 *p = TCC_FILETYPE_BINARY;
2071 }
2072 else {
2073 *p = TCC_FILETYPE_C;
2074 }2069 }
2075 }2070 }
2076 strcpy(p+1, filename);2071
2077 dynarray_add((void ***)&s->files, &s->nb_files, p);2072 f->type = filetype;
2073 strcpy(f->name, filename);
2074 dynarray_add((void ***)&s->files, &s->nb_files, f);
2078}2075}
2079 2076
2080ST_FUNC int tcc_parse_args1(TCCState *s, int argc, char **argv)2077ST_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) · 77 unmodified lines
2158 tcc_set_lib_path(s, optarg);2155 tcc_set_lib_path(s, optarg);
2159 break;2156 break;
2160 case TCC_OPTION_l:2157 case TCC_OPTION_l:
2161 args_parser_add_file(s, r, TCC_FILETYPE_BINARY);2158 args_parser_add_file(s, optarg, 'l');
2162 s->nb_libraries++;2159 s->nb_libraries++;
2163 break;2160 break;
2164 case TCC_OPTION_pthread:2161 case TCC_OPTION_pthread:
libtcc.h+4−4
@@ -49,10 +49,10 @@ LIBTCCAPI void tcc_undefine_symbol(TCCState *s, const char *sym); · 48 unmodified lines
49 49
50/* add a file (C file, dll, object, library, ld script). Return -1 if error. */50/* add a file (C file, dll, object, library, ld script). Return -1 if error. */
51LIBTCCAPI int tcc_add_file(TCCState *s, const char *filename, int filetype);51LIBTCCAPI int tcc_add_file(TCCState *s, const char *filename, int filetype);
52#define TCC_FILETYPE_BINARY 152#define TCC_FILETYPE_BINARY 'b'
53#define TCC_FILETYPE_C 253#define TCC_FILETYPE_C 'c'
54#define TCC_FILETYPE_ASM 354#define TCC_FILETYPE_ASM 's'
55#define TCC_FILETYPE_ASM_PP 455#define TCC_FILETYPE_ASM_PP 'S'
56 56
57/* compile a string containing a C source. Return -1 if error. */57/* compile a string containing a C source. Return -1 if error. */
58LIBTCCAPI int tcc_compile_string(TCCState *s, const char *buf);58LIBTCCAPI int tcc_compile_string(TCCState *s, const char *buf);
tcc.c+7−13
@@ -307,23 +307,17 @@ int main(int argc, char **argv) · 306 unmodified lines
307 307
308 /* compile or add each files or library */308 /* compile or add each files or library */
309 for(i = ret = 0; i < s->nb_files && ret == 0; i++) {309 for(i = ret = 0; i < s->nb_files && ret == 0; i++) {
310 int filetype = *(unsigned char *)s->files[i];310 struct filespec *f = s->files[i];
311 const char *filename = s->files[i] + 1;311 if (f->type == 'l') {
312 if (filename[0] == '-' && filename[1] == 'l') {312 if (tcc_add_library_err(s, f->name) < 0)
313 if (tcc_add_library(s, filename + 2) < 0) {313 ret = 1;
314 /* don't fail on -lm as it's harmless to skip math lib */
315 if (strcmp(filename + 2, "m")) {
316 tcc_error_noabort("cannot find library 'lib%s'", filename + 2);
317 ret = 1;
318 }
319 }
320 } else {314 } else {
321 if (1 == s->verbose)315 if (1 == s->verbose)
322 printf("-> %s\n", filename);316 printf("-> %s\n", f->name);
323 if (tcc_add_file(s, filename, filetype) < 0)317 if (tcc_add_file(s, f->name, f->type) < 0)
324 ret = 1;318 ret = 1;
325 if (!first_file)319 if (!first_file)
326 first_file = filename;320 first_file = f->name;
327 }321 }
328 }322 }
329 323
tcc.h+5−1
@@ -850,7 +850,7 @@ struct TCCState { · 849 unmodified lines
850#endif850#endif
851 851
852 /* used by main and tcc_parse_args only */852 /* used by main and tcc_parse_args only */
853 char **files; /* files seen on command line */853 struct filespec **files; /* files seen on command line */
854 int nb_files; /* number thereof */854 int nb_files; /* number thereof */
855 int nb_libraries; /* number of libs thereof */855 int nb_libraries; /* number of libs thereof */
856 char *outfile; /* output filename */856 char *outfile; /* output filename */
@@ -863,6 +863,10 @@ struct TCCState { · 6 unmodified lines
863 ParseArgsState *parse_args_state;863 ParseArgsState *parse_args_state;
864};864};
865 865
866struct filespec {
867 char type, name[1];
868};
869
866/* The current value can be: */870/* The current value can be: */
867#define VT_VALMASK 0x003f /* mask for value location, register or: */871#define VT_VALMASK 0x003f /* mask for value location, register or: */
868#define VT_CONST 0x0030 /* constant in vc (must be first non register value) */872#define VT_CONST 0x0030 /* constant in vc (must be first non register value) */