-#ifndef _
-# define _(String) String
-#endif
-
-#ifdef _LIBC
-/* In the GNU C library, there is a predefined variable for this. */
-
-# define program_name program_invocation_name
-# include <errno.h>
-
-/* In GNU libc we want do not want to use the common name `error' directly.
- Instead make it a weak alias. */
-# define error __error
-# define error_at_line __error_at_line
-
-# ifdef USE_IN_LIBIO
-# include <libio/iolibio.h>
-# define fflush(s) _IO_fflush (s)
-# endif
-
-#else /* not _LIBC */
-
-/* The calling program should define program_name and set it to the
- name of the executing program. */
-extern char *program_name;
-
-# if HAVE_STRERROR
-# ifndef HAVE_DECL_STRERROR
-"this configure-time declaration test was not run"
-# endif
-# if !HAVE_DECL_STRERROR && !defined strerror
-char *strerror PARAMS ((int));
-# endif
-# else
-static char *
-private_strerror (errnum)
- int errnum;
+/** Report an error message.
+ *
+ * \param loc the location, defaulting to the current file,
+ * or the program name.
+ * \param prefix put before the message (e.g., "warning").
+ * \param message the error message, a printf format string. Iff it
+ * ends with ": ", then no trailing newline is printed,
+ * and the caller should print the remaining
+ * newline-terminated message to stderr.
+ * \param args the arguments of the format string.
+ */
+static
+void
+error_message (location *loc,
+ const char *prefix,
+ const char *message, va_list args)