From 4d9aaacc8547c5fad323c9d9a69dfcdcffa1b8b6 Mon Sep 17 00:00:00 2001 From: grischka Date: Mon, 31 Mar 2008 18:42:56 +0000 Subject: [PATCH] Accept standard input as an inputstream (Hanzac Chen) --- tcc-doc.texi | 16 ++++++++++++---- tcc.c | 17 +++++++++-------- 2 files changed, 21 insertions(+), 12 deletions(-) diff --git a/tcc-doc.texi b/tcc-doc.texi index 15fe604e..e2bf89be 100644 --- a/tcc-doc.texi +++ b/tcc-doc.texi @@ -94,9 +94,11 @@ the @code{main()} of a.c. @item @samp{tcc a.c -run b.c arg1} Compile @file{a.c} and @file{b.c}, link them together and execute them. arg1 is given -as first argument to the @code{main()} of the resulting program. Because -multiple C files are specified, @option{--} are necessary to clearly separate the -program arguments from the TCC options. +as first argument to the @code{main()} of the resulting program. +@ignore +Because multiple C files are specified, @option{--} are necessary to clearly +separate the program arguments from the TCC options. +@end ignore @item @samp{tcc -o myprog a.c b.c} Compile @file{a.c} and @file{b.c}, link them and generate the executable @file{myprog}. @@ -135,6 +137,13 @@ int main() return 0; @} @end example + +TCC can read C source code from @emph{standard input} when @option{-} is used in +place of @option{infile}. Example: + +@example +echo 'main(){puts("hello");}' | tcc -run - +@end example @c man end @section Option summary @@ -160,7 +169,6 @@ Set the path where the tcc internal libraries can be found (default is Output compilation statistics. @item -run source [args...] - Compile file @var{source} and run it with the command line arguments @var{args}. In order to be able to give more than one argument to a script, several TCC options can be given @emph{after} the diff --git a/tcc.c b/tcc.c index 64a8d51a..a57344c0 100644 --- a/tcc.c +++ b/tcc.c @@ -1956,14 +1956,13 @@ BufferedFile *tcc_open(TCCState *s1, const char *filename) int fd; BufferedFile *bf; - fd = open(filename, O_RDONLY | O_BINARY); + if (strcmp(filename, "-") == 0) + fd = 0, filename = "stdin"; + else + fd = open(filename, O_RDONLY | O_BINARY); if (fd < 0) return NULL; bf = tcc_malloc(sizeof(BufferedFile)); - if (!bf) { - close(fd); - return NULL; - } bf->fd = fd; bf->buf_ptr = bf->buffer; bf->buf_end = bf->buffer; @@ -10730,7 +10729,7 @@ int parse_args(TCCState *s, int argc, char **argv) break; } r = argv[optind++]; - if (r[0] != '-') { + if (r[0] != '-' || r[1] == '\0') { /* add a new file */ dynarray_add((void ***)&files, &nb_files, r); if (!multiple_files) { @@ -10982,7 +10981,9 @@ int main(int argc, char **argv) if (!outfile) { /* compute default outfile name */ char *ext; - pstrcpy(objfilename, sizeof(objfilename), tcc_basename(files[0])); + 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) @@ -11015,7 +11016,7 @@ int main(int argc, char **argv) if (tcc_add_file_internal(s, filename, AFF_PRINT_ERROR | AFF_PREPROCESS) < 0) ret = 1; - } else if (filename[0] == '-') { + } else if (filename[0] == '-' && filename[1]) { if (tcc_add_library(s, filename + 2) < 0) error("cannot find %s", filename); } else { -- 2.11.4.GIT