Removed FILE* argument from preprocessor create() interface. The preprocessor now...
authorpaulbarker <paulbarker@localhost>
Thu, 30 Aug 2007 21:08:33 +0000 (21:08 -0000)
committerpaulbarker <paulbarker@localhost>
Thu, 30 Aug 2007 21:08:33 +0000 (21:08 -0000)
svn path=/branches/multiarch/; revision=1923

frontends/yasm/yasm.c
libyasm/preproc.h
modules/preprocs/cpp/cpp-preproc.c
modules/preprocs/nasm/nasm-preproc.c
modules/preprocs/raw/raw-preproc.c
modules/preprocs/yapp/yapp-preproc.c

index 4a8557219d6180488106c2c4188d3acb6adf6087..93976152687edc84a3b8f6dda8a6487fe5093e43 100644 (file)
@@ -220,7 +220,7 @@ typedef struct constcharparam {
 static constcharparam_head preproc_options;
 
 static int
-do_preproc_only(FILE *in)
+do_preproc_only()
 {
     yasm_linemap *linemap;
     char *preproc_buf = yasm_xmalloc(PREPROC_BUF_SIZE);
@@ -241,7 +241,7 @@ do_preproc_only(FILE *in)
         /* determine the object filename if not specified, but we need a
             file name for the makefile rule */
         if (generate_make_dependencies && !obj_filename) {
-            if (in == stdin)
+            if (in_filename == NULL)
                 /* Default to yasm.out if no obj filename specified */
                 obj_filename = yasm__xstrdup("yasm.out");
             else {
@@ -264,7 +264,7 @@ do_preproc_only(FILE *in)
     }
 
     /* Pre-process until done */
-    cur_preproc = yasm_preproc_create(cur_preproc_module, in, in_filename,
+    cur_preproc = yasm_preproc_create(cur_preproc_module, in_filename,
                                       linemap, errwarns);
 
     apply_preproc_builtins();
@@ -293,9 +293,6 @@ do_preproc_only(FILE *in)
             fwrite(preproc_buf, got, 1, out);
     }
 
-    if (in != stdin)
-        fclose(in);
-
     if (out != stdout)
         fclose(out);
 
@@ -321,7 +318,7 @@ do_preproc_only(FILE *in)
 }
 
 static int
-do_assemble(FILE *in)
+do_assemble()
 {
     yasm_object *object;
     const char *base_filename;
@@ -337,7 +334,7 @@ do_assemble(FILE *in)
 
     /* determine the object filename if not specified */
     if (!obj_filename) {
-        if (in == stdin)
+        if (in_filename == NULL)
             /* Default to yasm.out if no obj filename specified */
             obj_filename = yasm__xstrdup("yasm.out");
         else {
@@ -401,8 +398,6 @@ do_assemble(FILE *in)
         yasm_xfree(estr);
         yasm_xfree(xrefstr);
 
-        if (in != stdin)
-            fclose(in);
         cleanup(object);
         return EXIT_FAILURE;
     }
@@ -422,13 +417,11 @@ do_assemble(FILE *in)
         print_error(_("%s: `%s' is not a valid %s for %s `%s'"), _("FATAL"),
                     cur_preproc_module->keyword, _("preprocessor"),
                     _("parser"), cur_parser_module->keyword);
-        if (in != stdin)
-            fclose(in);
         cleanup(object);
         return EXIT_FAILURE;
     }
 
-    cur_preproc = yasm_preproc_create(cur_preproc_module, in, in_filename,
+    cur_preproc = yasm_preproc_create(cur_preproc_module, in_filename,
                                       linemap, errwarns);
 
     apply_preproc_builtins();
@@ -446,10 +439,6 @@ do_assemble(FILE *in)
     cur_parser_module->do_parse(object, cur_preproc, list_filename != NULL,
                                 linemap, errwarns);
 
-    /* Close input file */
-    if (in != stdin)
-        fclose(in);
-
     check_errors(errwarns, object, linemap);
 
     /* Finalize parse */
@@ -637,20 +626,6 @@ main(int argc, char *argv[])
     if (!in_filename) {
         print_error(_("No input files specified"));
         return EXIT_FAILURE;
-    } else if (strcmp(in_filename, "-") != 0) {
-        /* Open the input file (if not standard input) */
-        in = fopen(in_filename, "rt");
-        if (!in) {
-            print_error(_("%s: could not open file `%s'"), _("FATAL"),
-                        in_filename);
-            yasm_xfree(in_filename);
-            if (obj_filename)
-                yasm_xfree(obj_filename);
-            return EXIT_FAILURE;
-        }
-    } else {
-        /* Filename was "-", read stdin */
-        in = stdin;
     }
 
     /* handle preproc-only case here */
index f93a838ccc3aed103661c133c38e834cdc06cbfd..7a161af6244ae23ac73e4e26d54245b296e8a758 100644 (file)
@@ -56,15 +56,15 @@ typedef struct yasm_preproc_module {
      * Module-level implementation of yasm_preproc_create().
      * Call yasm_preproc_create() instead of calling this function.
      *
-     * \param f                 initial starting file
-     * \param in_filename       initial starting filename
+     * \param in_filename       initial starting filename, or NULL to read from
+     *                          stdin
      * \param lm                line mapping repository
      * \param errwarns          error/warnning set.
      * \return New preprocessor.
      *
      * \note Any preprocessor errors and warnings are stored into errwarns.
      */
-    /*@only@*/ yasm_preproc * (*create) (FILE *f, const char *in_filename,
+    /*@only@*/ yasm_preproc * (*create) (const char *in_filename,
                                          yasm_linemap *lm,
                                          yasm_errwarns *errwarns);
 
@@ -110,15 +110,14 @@ typedef struct yasm_preproc_module {
  * The preprocessor needs access to the object format module to find out
  * any output format specific macros.
  * \param module        preprocessor module
- * \param f             initial starting file
- * \param in_filename   initial starting file filename
+ * \param in_filename   initial starting filename, or NULL to read from stdin
  * \param lm            line mapping repository
  * \param errwarns      error/warning set
  * \return New preprocessor.
  * \note Errors/warnings are stored into errwarns.
  */
 /*@only@*/ yasm_preproc *yasm_preproc_create
-    (yasm_preproc_module *module, FILE *f, const char *in_filename,
+    (yasm_preproc_module *module, const char *in_filename,
      yasm_linemap *lm, yasm_errwarns *errwarns);
 
 /** Cleans up any allocated preproc memory.
@@ -176,8 +175,8 @@ void yasm_preproc_define_builtin(yasm_preproc *preproc,
 
 /* Inline macro implementations for preproc functions */
 
-#define yasm_preproc_create(module, f, in_filename, lm, ews) \
-    module->create(f, in_filename, lm, ews)
+#define yasm_preproc_create(module, in_filename, lm, ews) \
+    module->create(in_filename, lm, ews)
 
 #define yasm_preproc_destroy(preproc) \
     ((yasm_preproc_base *)preproc)->module->destroy(preproc)
index 10bbcf6ac5285715eb7faab3ad7801d41b64422e..794766b60f24038db6b39d1a62cf0a39dbbedfe7 100644 (file)
@@ -32,8 +32,6 @@
 /* TODO: Use autoconf to get the limit on the command line length. */
 #define CMDLINE_SIZE 32770
 
-extern int isatty(int);
-
 /* Pre-declare the preprocessor module object. */
 yasm_preproc_module yasm_cpp_LTX_preproc;
 
@@ -151,8 +149,7 @@ cpp_invoke(yasm_preproc_cpp *pp)
     Interface functions.
 *******************************************************************************/
 static yasm_preproc *
-cpp_preproc_create(FILE *f, const char *in, yasm_linemap *lm,
-                   yasm_errwarns *errwarns)
+cpp_preproc_create(const char *in, yasm_linemap *lm, yasm_errwarns *errwarns)
 {
     yasm_preproc_cpp *pp = yasm_xmalloc(sizeof(yasm_preproc_cpp));
 
@@ -165,17 +162,6 @@ cpp_preproc_create(FILE *f, const char *in, yasm_linemap *lm,
 
     TAILQ_INIT(&pp->cpp_args);
 
-    /* We can't handle reading from a tty yet. */
-    if (isatty(fileno(f)) > 0)
-        yasm__fatal("incapable of reading from a tty");
-
-    /*
-        We don't need the FILE* given by yasm since we will simply pass the
-        filename to cpp, but closing it causes a segfault.
-
-        TODO: Change the preprocessor interface, so no FILE* is given.
-    */
-
     return (yasm_preproc *)pp;
 }
 
index 967002671778538f9e5fa070d22222910c214c8f..22a4096ecb07d92091dfa984c58e505dd7f37388 100644 (file)
@@ -128,13 +128,22 @@ nasm_efunc(int severity, const char *fmt, ...)
 }
 
 static yasm_preproc *
-nasm_preproc_create(FILE *f, const char *in_filename, yasm_linemap *lm,
+nasm_preproc_create(const char *in_filename, yasm_linemap *lm,
                     yasm_errwarns *errwarns)
 {
+    FILE *f;
     yasm_preproc_nasm *preproc_nasm = yasm_xmalloc(sizeof(yasm_preproc_nasm));
 
     preproc_nasm->preproc.module = &yasm_nasm_LTX_preproc;
 
+    if (strcmp(in_filename, "-") != 0) {
+        f = fopen(in_filename, "r");
+        if (!f)
+            yasm__fatal("Could not open input file");
+    }
+    else
+        f = stdin;
+
     preproc_nasm->in = f;
     cur_lm = lm;
     cur_errwarns = errwarns;
index 4e80cfff77e7cfdf7c01620bb77e138dc199e24e..27880d3a6b1eb2420bf9bf6d3f4be5adaced67f1 100644 (file)
@@ -44,11 +44,20 @@ yasm_preproc_module yasm_raw_LTX_preproc;
 int isatty(int);
 
 static yasm_preproc *
-raw_preproc_create(FILE *f, const char *in_filename, yasm_linemap *lm,
+raw_preproc_create(const char *in_filename, yasm_linemap *lm,
                    yasm_errwarns *errwarns)
 {
+    FILE *f;
     yasm_preproc_raw *preproc_raw = yasm_xmalloc(sizeof(yasm_preproc_raw));
 
+    if (strcmp(in_filename, "-") != 0) {
+        f = fopen(in_filename, "r");
+        if (!f)
+            yasm__fatal("Could not open input file");
+    }
+    else
+        f = stdin;
+
     preproc_raw->preproc.module = &yasm_raw_LTX_preproc;
     preproc_raw->in = f;
     preproc_raw->cur_lm = lm;
index c77564423bae2c0c245044a23983f8a52d647616..ed16ad574303dbca53123d000edb3c60a0d15da7 100644 (file)
@@ -241,11 +241,20 @@ void
 expand_token_list(struct source_head *paramexp, struct source_head *to_head, source **to_tail);
 
 static yasm_preproc *
-yapp_preproc_create(FILE *f, const char *in_filename, yasm_linemap *lm,
+yapp_preproc_create(const char *in_filename, yasm_linemap *lm,
                     yasm_errwarns *errwarns)
 {
+    FILE *f;
     yasm_preproc_yapp *preproc_yapp = yasm_xmalloc(sizeof(yasm_preproc_yapp));
 
+    if (strcmp(in_filename, "-") != 0) {
+        f = fopen(in_filename, "r");
+        if (!f)
+            yasm__fatal("Could not open input file");
+    }
+    else
+        f = stdin;
+
     preproc_yapp->preproc.module = &yasm_yapp_LTX_preproc;
 
     yapp_preproc_linemap = lm;
@@ -468,7 +477,7 @@ append_to_return(struct source_head *to_head, source **to_tail)
             return 0;
         append_token(token, to_head, to_tail);
         token = yapp_preproc_lex();
-    } 
+    }
     return '\n';
 }