tcc: Refactor "compute default outfile name" into libtcc function

Since for upcoming -MD support default _compile_ output file be needed
even when preprocesssing (tcc -E), let's move this code out of one
particular condition block into a common function, so that we could use
it in deps generation code too.

v2:

- As suggested by grischka, moved into libtcc function instead of always
  computing near start of main()
- There is a FIXME about how to return result - I don't want to bother
  callers with allocating temp buffers, not I think it will be a good
  idea to hook default_target to TCCState. Clearly, I'm to used to
  things like std::string and python's str...
This commit is contained in:
Kirill Smelkov 2010-06-16 16:54:24 +04:00 committed by Kirill Smelkov
parent a919a373da
commit bdae4a59c3
2 changed files with 32 additions and 25 deletions

View File

@ -1557,3 +1557,31 @@ PUB_FUNC void set_num_callers(int n)
num_callers = n;
#endif
}
LIBTCCAPI const char *tcc_default_target(TCCState *s)
{
/* FIXME will break in multithreaded case */
static char outfile_default[1024];
char *ext;
const char *name =
strcmp(s->input_files[0], "-") == 0 ? "a"
: tcc_basename(s->input_files[0]);
pstrcpy(outfile_default, sizeof(outfile_default), name);
ext = tcc_fileextension(outfile_default);
#ifdef TCC_TARGET_PE
if (s->output_type == TCC_OUTPUT_DLL)
strcpy(ext, ".dll");
else
if (s->output_type == TCC_OUTPUT_EXE)
strcpy(ext, ".exe");
else
#endif
if (s->output_type == TCC_OUTPUT_OBJ && !s->reloc_output && *ext)
strcpy(ext, ".o");
else
pstrcpy(outfile_default, sizeof(outfile_default), "a.out");
return outfile_default;
}

29
tcc.c
View File

@ -393,7 +393,6 @@ int main(int argc, char **argv)
int i;
TCCState *s;
int nb_objfiles, ret, optind;
char objfilename[1024];
int64_t start_time = 0;
s = tcc_new();
@ -446,28 +445,6 @@ int main(int argc, char **argv)
if (!s->outfile)
error("could not open '%s'", outfile);
}
} else if (output_type != TCC_OUTPUT_MEMORY) {
if (!outfile) {
/* compute default outfile name */
char *ext;
const char *name =
strcmp(files[0], "-") == 0 ? "a" : tcc_basename(files[0]);
pstrcpy(objfilename, sizeof(objfilename), name);
ext = tcc_fileextension(objfilename);
#ifdef TCC_TARGET_PE
if (output_type == TCC_OUTPUT_DLL)
strcpy(ext, ".dll");
else
if (output_type == TCC_OUTPUT_EXE)
strcpy(ext, ".exe");
else
#endif
if (output_type == TCC_OUTPUT_OBJ && !reloc_output && *ext)
strcpy(ext, ".o");
else
pstrcpy(objfilename, sizeof(objfilename), "a.out");
outfile = objfilename;
}
}
if (do_bench) {
@ -507,8 +484,10 @@ int main(int argc, char **argv)
fclose(s->outfile);
} else if (s->output_type == TCC_OUTPUT_MEMORY)
ret = tcc_run(s, argc - optind, argv + optind);
else
ret = tcc_output_file(s, outfile) ? 1 : 0;
else {
ret = tcc_output_file(s, outfile ? outfile : tcc_default_target(s));
ret = ret ? 1 : 0;
}
}
tcc_delete(s);