]> granicus.if.org Git - yasm/commitdiff
Properly handle fatal errors (like missing include file) from the real
authorPeter Johnson <peter@tortall.net>
Tue, 16 Dec 2003 03:54:15 +0000 (03:54 -0000)
committerPeter Johnson <peter@tortall.net>
Tue, 16 Dec 2003 03:54:15 +0000 (03:54 -0000)
NASM parser by changing the libyasm yasm_fatal() interface to use va_list
instead of ... variable arguments.  Add a yasm__fatal() function that takes
... and calls yasm_fatal().

Bugzilla bug #22
Reported by: mu@tortall.net

svn path=/trunk/yasm/; revision=1086

frontends/yasm/yasm.c
libyasm/errwarn.c
libyasm/errwarn.h
libyasm/xmalloc.c
modules/objfmts/coff/coff-objfmt.c
modules/preprocs/nasm/nasm-preproc.c
modules/preprocs/nasm/tests/Makefile.inc
modules/preprocs/nasm/tests/noinclude-err.asm [new file with mode: 0644]
modules/preprocs/nasm/tests/noinclude-err.errwarn [new file with mode: 0644]

index 22d791c5784f1474d8f7ca9b32fda9684686d8c4..91e6efd079c647b5e6d7d4b5148bbbd56fa2cdbc 100644 (file)
@@ -100,7 +100,7 @@ static void print_error(const char *fmt, ...);
 static /*@exits@*/ void handle_yasm_int_error(const char *file,
                                              unsigned int line,
                                              const char *message);
-static /*@exits@*/ void handle_yasm_fatal(const char *message, ...);
+static /*@exits@*/ void handle_yasm_fatal(const char *message, va_list va);
 static const char *handle_yasm_gettext(const char *msgid);
 static void print_yasm_error(const char *filename, unsigned long line,
                             const char *msg);
@@ -1002,13 +1002,10 @@ handle_yasm_int_error(const char *file, unsigned int line, const char *message)
 }
 
 static /*@exits@*/ void
-handle_yasm_fatal(const char *fmt, ...)
+handle_yasm_fatal(const char *fmt, va_list va)
 {
-    va_list va;
     fprintf(stderr, "yasm: %s: ", _("FATAL"));
-    va_start(va, fmt);
     vfprintf(stderr, gettext(fmt), va);
-    va_end(va);
     fputc('\n', stderr);
     exit(EXIT_FAILURE);
 }
index af07f2d01ecf0c89ddc2c2524143ea3167daf9f8..9d2c93829af52cbe0da8bb744b716ce0aed38301 100644 (file)
 /* Default handlers for replacable functions */
 static /*@exits@*/ void def_internal_error_
     (const char *file, unsigned int line, const char *message);
-static /*@exits@*/ void def_fatal(const char *message, ...);
+static /*@exits@*/ void def_fatal(const char *message, va_list va);
 static const char *def_gettext_hook(const char *msgid);
 
 /* Storage for errwarn's "extern" functions */
 /*@exits@*/ void (*yasm_internal_error_)
     (const char *file, unsigned int line, const char *message)
     = def_internal_error_;
-/*@exits@*/ void (*yasm_fatal) (const char *message, ...) = def_fatal;
+/*@exits@*/ void (*yasm_fatal) (const char *message, va_list va) = def_fatal;
 const char * (*yasm_gettext_hook) (const char *msgid) = def_gettext_hook;
 
 /* Enabled warnings.  See errwarn.h for a list. */
@@ -165,13 +165,10 @@ def_internal_error_(const char *file, unsigned int line, const char *message)
  * memory), so just exit immediately.
  */
 static void
-def_fatal(const char *fmt, ...)
+def_fatal(const char *fmt, va_list va)
 {
-    va_list va;
     fprintf(stderr, "%s: ", yasm_gettext_hook(N_("FATAL")));
-    va_start(va, fmt);
     vfprintf(stderr, yasm_gettext_hook(fmt), va);
-    va_end(va);
     fputc('\n', stderr);
     exit(EXIT_FAILURE);
 }
@@ -392,3 +389,13 @@ yasm_errwarn_output_all(yasm_linemap *lm, int warning_as_error,
            print_warning(filename, line, we->msg);
     }
 }
+
+void
+yasm__fatal(const char *message, ...)
+{
+    va_list va;
+    va_start(va, message);
+    yasm_fatal(message, va);
+    /*@notreached@*/
+    va_end(va);
+}
index 8d33c2537500d5bec431e1540f9a20bb99b42edf..67c6dfd5a82e072a500c4923eb27e57903f0231b 100644 (file)
@@ -71,9 +71,17 @@ extern /*@exits@*/ void (*yasm_internal_error_)
  * \warning This function must NOT return to calling code; exit or longjmp
  *          instead.
  * \param message   fatal error message
+ * \param va       va_list argument list for message
+ */
+extern /*@exits@*/ void (*yasm_fatal) (const char *message, va_list va);
+
+/** Reporting point of fatal errors, with variable arguments (internal only).
+ * \warning This function calls #yasm_fatal, and thus does not return to the
+ *          calling code.
+ * \param message   fatal error message
  * \param ...      argument list for message
  */
-extern /*@exits@*/ void (*yasm_fatal) (const char *message, ...);
+/*@exits@*/ void yasm__fatal(const char *message, ...);
 
 /** Log an error at a given line, displaying a different line.  va_list version
  * of yasm__error_at().
index 24e847772d646f8255ff74f3a8d30b6813226adc..a6ebeaa6f6cd914468bf9a66ad0c3ce510f28ff0 100644 (file)
@@ -26,7 +26,7 @@
  */
 #define YASM_LIB_INTERNAL
 #include "util.h"
-RCSID("$IdPath: yasm/libyasm/xmalloc.c,v 1.13 2003/03/15 05:07:48 peter Exp $");
+RCSID("$IdPath$");
 
 #include "coretype.h"
 #include "errwarn.h"
@@ -66,7 +66,7 @@ def_xmalloc(size_t size)
        size = 1;
     newmem = malloc(size);
     if (!newmem)
-       yasm_fatal(N_("out of memory"));
+       yasm__fatal(N_("out of memory"));
 
     return newmem;
 }
@@ -81,7 +81,7 @@ def_xcalloc(size_t nelem, size_t elsize)
 
     newmem = calloc(nelem, elsize);
     if (!newmem)
-       yasm_fatal(N_("out of memory"));
+       yasm__fatal(N_("out of memory"));
 
     return newmem;
 }
@@ -98,7 +98,7 @@ def_xrealloc(void *oldmem, size_t size)
     else
        newmem = realloc(oldmem, size);
     if (!newmem)
-       yasm_fatal(N_("out of memory"));
+       yasm__fatal(N_("out of memory"));
 
     return newmem;
 }
index 349eb5f44615ff1efc34385b457e583da5b48fe2..872a4abd9a62bf4c42d8ad9ef14880368f223836 100644 (file)
@@ -490,7 +490,7 @@ coff_objfmt_output_section(yasm_section *sect, /*@null@*/ void *d)
 
        pos = ftell(info->f);
        if (pos == -1) {
-           yasm_fatal(N_("could not get file position on output file"));
+           yasm__fatal(N_("could not get file position on output file"));
            /*@notreached@*/
            return 1;
        }
@@ -518,7 +518,7 @@ coff_objfmt_output_section(yasm_section *sect, /*@null@*/ void *d)
 
     pos = ftell(info->f);
     if (pos == -1) {
-       yasm_fatal(N_("could not get file position on output file"));
+       yasm__fatal(N_("could not get file position on output file"));
        /*@notreached@*/
        return 1;
     }
@@ -599,7 +599,7 @@ coff_objfmt_output(FILE *f, yasm_object *object, int all_syms)
 
     /* Allocate space for headers by seeking forward */
     if (fseek(f, (long)(20+40*(coff_objfmt_parse_scnum-1)), SEEK_SET) < 0) {
-       yasm_fatal(N_("could not seek on output file"));
+       yasm__fatal(N_("could not seek on output file"));
        /*@notreached@*/
        return;
     }
@@ -629,7 +629,7 @@ coff_objfmt_output(FILE *f, yasm_object *object, int all_syms)
     }
     pos = ftell(f);
     if (pos == -1) {
-       yasm_fatal(N_("could not get file position on output file"));
+       yasm__fatal(N_("could not get file position on output file"));
        /*@notreached@*/
        return;
     }
@@ -790,7 +790,7 @@ coff_objfmt_output(FILE *f, yasm_object *object, int all_syms)
 
     /* Write headers */
     if (fseek(f, 0, SEEK_SET) < 0) {
-       yasm_fatal(N_("could not seek on output file"));
+       yasm__fatal(N_("could not seek on output file"));
        /*@notreached@*/
        return;
     }
index 88a42750e811fe4eee8d8679a07519df730959f3..6bd93780bcfc27082ba09d2107087d600c281246 100644 (file)
@@ -100,7 +100,8 @@ nasm_efunc(int severity, const char *fmt, ...)
            yasm__error_va(yasm_linemap_get_current(cur_lm), fmt, va);
            break;
        case ERR_FATAL:
-           yasm_fatal(N_("unknown"));  /* FIXME */
+           yasm_fatal(fmt, va);
+           /*@notreached@*/
            break;
        case ERR_PANIC:
            yasm_internal_error(fmt);   /* FIXME */
index 16dad51d5907032383ada13a148475feb73965ac..57fc86a7014c501480d2b7f00eed2ca4a5a72cc4 100644 (file)
@@ -5,3 +5,5 @@ TESTS += modules/preprocs/nasm/tests/nasmpp_test.sh
 EXTRA_DIST += modules/preprocs/nasm/tests/nasmpp_test.sh
 EXTRA_DIST += modules/preprocs/nasm/tests/ifcritical-err.asm
 EXTRA_DIST += modules/preprocs/nasm/tests/ifcritical-err.errwarn
+EXTRA_DIST += modules/preprocs/nasm/tests/noinclude-err.asm
+EXTRA_DIST += modules/preprocs/nasm/tests/noinclude-err.errwarn
diff --git a/modules/preprocs/nasm/tests/noinclude-err.asm b/modules/preprocs/nasm/tests/noinclude-err.asm
new file mode 100644 (file)
index 0000000..0862539
--- /dev/null
@@ -0,0 +1 @@
+%include "doesnotexist.inc"
diff --git a/modules/preprocs/nasm/tests/noinclude-err.errwarn b/modules/preprocs/nasm/tests/noinclude-err.errwarn
new file mode 100644 (file)
index 0000000..68f7152
--- /dev/null
@@ -0,0 +1 @@
+yasm: FATAL: unable to open include file `doesnotexist.inc'