m4-discuss
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

Re: rfc: new __program__ macro


From: Eric Blake
Subject: Re: rfc: new __program__ macro
Date: Fri, 4 Aug 2006 17:18:29 +0000 (UTC)
User-agent: Loom/3.14 (http://gmane.org/)

Eric Blake <ebb9 <at> byu.net> writes:

Hi Gary,

> 
> > Man, I wish I could get glibc to provide a va_list variant of
> > error/error_at_line (I'm in the process of proposing that, trying to bring
> > gnulib and glibc back in sync and fix other bugs in the error.c module).
> > Without it, and due to the fact that error_print_progname takes no
> > arguments, I have to use the relatively gross hack of another global
> > variable that tells the callback whether it was invoked from error or
> > error_at_line.
> 
> I agree with you that the current glibc API doesn't fit our needs at 
> all, but I also don't think using a kludgy macro to paper over the 
> cracks is a good approach.  I see no problem with writing our own error 
> module with an API we like, and using that.  We can write it in such a 
> way as to not break the existing glibc API, and if gnulib or glibc take 
> the code (or an equivalent) in due course, then all well and good, but 
> even if they don't:  we still have a sensible API for our use. 
> 

If my proposed[1] gnulib module verror is accepted, then this patch would clean 
up m4 to avoid the hacks.  A subsequent mechanical cleanup could then avoid 
calling macros, if desired.  (Maybe it's just me, but M4ERROR(()) doesn't look 
as nice as m4_error().)

[1]http://www.nabble.com/new-module-proposal%3A-verror-tf2052120.html#a5653449

2006-08-04  Eric Blake  <address@hidden>

        * m4/gnulib-cache.m4: Augment with gnulib-tool --import verror.
        * src/m4.h (m4_error): New function.
        (M4ERROR, M4ERROR_AT_LINE): Reimplement without hacking around
        error module deficiencies.
        (reference_error): No longer needed.
        * src/m4.c (m4_error): Implement.
        (main): No longer need to install error callback.

Index: m4/gnulib-cache.m4
===================================================================
RCS file: /sources/m4/m4/m4/Attic/gnulib-cache.m4,v
retrieving revision 1.1.2.10
diff -u -r1.1.2.10 gnulib-cache.m4
--- m4/gnulib-cache.m4  30 Jul 2006 23:46:51 -0000      1.1.2.10
+++ m4/gnulib-cache.m4  4 Aug 2006 16:27:20 -0000
@@ -15,10 +15,10 @@
 
 
 # Specification in the form of a command-line invocation:
-#   gnulib-tool --import --dir=. --lib=libm4 --source-base=lib --m4-base=m4 --
doc-base=doc --aux-dir=. --macro-prefix=M4 alloca binary-io close-stream error 
fdl fopen-safer free gendocs getopt mkstemp obstack regex stdlib-safer strtol 
tmpfile-safer unlocked-io xalloc xvasprintf
+#   gnulib-tool --import --dir=. --lib=libm4 --source-base=lib --m4-base=m4 --
doc-base=doc --aux-dir=. --no-libtool --macro-prefix=M4 alloca binary-io close-
stream error fdl fopen-safer free gendocs getopt mkstemp obstack regex stdlib-
safer strtol tmpfile-safer unlocked-io verror xalloc xvasprintf
 
 # Specification in the form of a few gnulib-tool.m4 macro invocations:
-gl_MODULES([alloca binary-io close-stream error fdl fopen-safer free gendocs 
getopt mkstemp obstack regex stdlib-safer strtol tmpfile-safer unlocked-io 
xalloc xvasprintf])
+gl_MODULES([alloca binary-io close-stream error fdl fopen-safer free gendocs 
getopt mkstemp obstack regex stdlib-safer strtol tmpfile-safer unlocked-io 
verror xalloc xvasprintf])
 gl_AVOID([])
 gl_SOURCE_BASE([lib])
 gl_M4_BASE([m4])
Index: src/m4.c
===================================================================
RCS file: /sources/m4/m4/src/Attic/m4.c,v
retrieving revision 1.1.1.1.2.25
diff -u -r1.1.1.1.2.25 m4.c
--- src/m4.c    4 Aug 2006 13:19:41 -0000       1.1.1.1.2.25
+++ src/m4.c    4 Aug 2006 16:27:20 -0000
@@ -91,22 +91,16 @@
    argument.  */
 boolean suppress_line;
 
-/*---------------------------------------------------------------.
-| Callback used by error to print program name, source, and line |
-| reference.                                                    |
-`---------------------------------------------------------------*/
+/*-----------------------.
+| Wrapper around error.  |
+`-----------------------*/
 
 void
-reference_error (void)
+m4_error (int status, int errnum, const char *format, ...)
 {
-  /* error already flushed stdout before calling us.  */
-  if (suppress_line)
-    {
-      fprintf (stderr, "%s:", program_name);
-      suppress_line = FALSE;
-    }
-  else
-    fprintf (stderr, "%s:%s:%d: ", program_name, current_file, current_line);
+  va_list args;
+  va_start (args, format);
+  verror_at_line (status, errnum, current_file, current_line, format, args);
 }
 
 #ifdef USE_STACKOVF
@@ -278,7 +272,6 @@
   FILE *fp;
 
   program_name = argv[0];
-  error_print_progname = reference_error;
   retcode = EXIT_SUCCESS;
 
   include_init ();
Index: src/m4.h
===================================================================
RCS file: /sources/m4/m4/src/m4.h,v
retrieving revision 1.1.1.1.2.25
diff -u -r1.1.1.1.2.25 m4.h
--- src/m4.h    4 Aug 2006 13:19:41 -0000       1.1.1.1.2.25
+++ src/m4.h    4 Aug 2006 16:27:20 -0000
@@ -56,6 +56,7 @@
 #include "stdio--.h"
 #include "stdlib--.h"
 #include "unistd--.h"
+#include "verror.h"
 #include "xalloc.h"
 
 /* If FALSE is defined, we presume TRUE is defined too.  In this case,
@@ -123,33 +124,10 @@
 extern int retcode;
 extern const char *program_name;
 
-/* It would be so much nicer if the gnulib error module provided a
-   va_list version of error, so that we wouldn't need to use macros
-   and a global hook variable.  Oh well.  */
-#if 0
 void m4_error (int, int, const char *, ...) M4_GNUC_PRINTF(3, 4);
-/* Would be implemented as:
-void
-m4_error (int status, int errnum, const char *format, ...)
-{
-  va_list args;
-  va_start (args, format);
-  verror_at_line (status, errnum, current_file, current_line, format, args);
-}
-*/
-#endif
-
-#define M4ERROR(Arglist) (error Arglist)
-#define M4ERROR_AT_LINE(Arglist)               \
-  do                                           \
-    {                                          \
-      suppress_line = TRUE;                    \
-      (error_at_line Arglist);                 \
-    }                                          \
-  while (0)
 
-extern boolean suppress_line;
-void reference_error (void);
+#define M4ERROR(Arglist) (m4_error Arglist)
+#define M4ERROR_AT_LINE(Arglist) (error_at_line Arglist)
 
 #ifdef USE_STACKOVF
 void setup_stackovf_trap (char *const *, char *const *,







reply via email to

[Prev in Thread] Current Thread [Next in Thread]