You should have received a copy of the GNU General Public License
along with this program; if not, write to the Free Software
- Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA
- 02111-1307, USA. */
+ Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
+ 02110-1301, USA. */
#include <config.h>
#include "error.h"
#include <stdlib.h>
#include "alloc.h"
#include "command.h"
-#include "getline.h"
+#include "getl.h"
+#include "glob.h"
+#include "lexer.h"
#include "main.h"
#include "output.h"
+#include "progname.h"
+#include "readln.h"
#include "settings.h"
#include "str.h"
#include "var.h"
#include "version.h"
+#include "gettext.h"
+#define _(msgid) gettext (msgid)
+#define N_(msgid) msgid
+
int err_error_count;
int err_warning_count;
int err_verbosity;
-/* File locator stack. */
-static const struct file_locator **file_loc;
-static int nfile_loc, mfile_loc;
\f
/* Fairly common public functions. */
void
tmsg (int class, const char *title, const char *format, ...)
{
- char buf[1024];
-
- /* Format the message into BUF. */
- {
- va_list args;
+ struct error e;
+ va_list args;
- va_start (args, format);
- vsnprintf (buf, 1024, format, args);
- va_end (args);
- }
-
- /* Output the message. */
- {
- struct error e;
+ e.class = class;
+ err_location (&e.where);
+ e.title = title;
- e.class = class;
- err_location (&e.where);
- e.title = title;
- e.text = buf;
- err_vmsg (&e);
- }
+ va_start (args, format);
+ err_vmsg (&e, format, args);
+ va_end (args);
}
/* Writes error message in CLASS, with text FORMAT, formatted with
void
msg (int class, const char *format, ...)
{
- struct string buf;
-
- ds_init (&buf, 1024);
+ struct error e;
+ va_list args;
- /* Format the message into BUF. */
- {
- va_list args;
+ e.class = class;
+ err_location (&e.where);
+ e.title = NULL;
- va_start (args, format);
- ds_vprintf (&buf, format, args);
- va_end (args);
- }
-
- /* Output the message. */
- {
- struct error e;
-
- e.class = class;
- err_location (&e.where);
- e.title = NULL;
- e.text = buf.string;
- err_vmsg (&e);
- }
-
- ds_destroy (&buf);
+ va_start (args, format);
+ err_vmsg (&e, format, args);
+ va_end (args);
}
/* Terminate due to fatal error in input. */
fflush (stdout);
fflush (stderr);
- fprintf (stderr, "%s: %s\n", pgmname,
+ fprintf (stderr, "%s: %s\n", program_name,
_("Terminating NOW due to a fatal error!"));
- err_hcf (0);
+ terminate (false);
}
/* Terminate unless we're interactive or will go interactive when the
void
err_cond_fail (void)
{
- if (getl_reading_script)
+ if (getl_reading_script ())
{
if (getl_interactive)
getl_close_all ();
}
}
\f
-/* File locator stack functions. */
-
-/* Pushes F onto the stack of file locations. */
-void
-err_push_file_locator (const struct file_locator *f)
-{
- if (nfile_loc >= mfile_loc)
- {
- if (mfile_loc == 0)
- mfile_loc = 8;
- else
- mfile_loc *= 2;
-
- file_loc = xrealloc (file_loc, mfile_loc * sizeof *file_loc);
- }
-
- file_loc[nfile_loc++] = f;
-}
-
-/* Pops F off the stack of file locations.
- Argument F is only used for verification that that is actually the
- item on top of the stack. */
-void
-err_pop_file_locator (const struct file_locator *f)
-{
- assert (nfile_loc >= 0 && file_loc[nfile_loc - 1] == f);
- nfile_loc--;
-}
-
-/* Puts the current file and line number in F, or NULL and -1 if
- none. */
-void
-err_location (struct file_locator *f)
-{
- if (nfile_loc)
- *f = *file_loc[nfile_loc - 1];
- else
- getl_location (&f->filename, &f->line_number);
-}
-\f
/* Obscure public functions. */
/* Writes a blank line to the error device(s).
#define EXIT_FAILURE 1
#endif
-static int terminating;
+static void puts_stdout (const char *s);
+static void dump_message (char *errbuf, unsigned indent,
+ void (*func) (const char *), unsigned width);
-/* Halt-catch-fire. SUCCESS should be nonzero if exiting successfully
- or zero if not. Despite the name, this is the usual way to finish,
- successfully or not. */
void
-err_hcf (int success)
+err_done (void)
{
- terminating = 1;
-
lex_done();
getl_uninitialize ();
-
- free(file_loc);
- outp_done ();
- done_glob();
-
-
- exit (success ? EXIT_SUCCESS : EXIT_FAILURE);
+ readln_uninitialize();
}
-static void puts_stdout (const char *s);
-static void dump_message (char *errbuf, unsigned indent,
- void (*func) (const char *), unsigned width);
-
void
-err_vmsg (const struct error *e)
+err_vmsg (const struct error *e, const char *format, va_list args)
{
/* Class flags. */
enum
class &= ERR_CLASS_MASK;
assert (class >= 0 && class < ERR_CLASS_COUNT);
- assert (e->text != NULL);
+ assert (format != NULL);
ds_init (&msg, 64);
if (e->where.filename && (error_classes[class].flags & ERR_WITH_FILE))
if (e->title)
ds_puts (&msg, e->title);
- ds_puts (&msg, e->text);
+ ds_vprintf (&msg, format, args);
/* FIXME: Check set_messages and set_errors to determine where to
send errors and messages.
ds_destroy (&msg);
- if (e->class == FE && !terminating)
- err_hcf (0);
+ if (e->class == FE)
+ terminate (0);
}
\f
/* Private functions. */
memset (buf, ' ', indent);
memcpy (&buf[indent], cp, cp2 - cp);
- if ( hard_break)
- {
- buf[indent + idx + cp2 - cp] = '\n';
- ++idx;
- }
buf[indent + idx + cp2 - cp] = '\0';
func (buf);
cp = cp2;
"default_config_path: %s\n"
"include_path: %s\n"
"groff_font_path: %s\n"
- "locale_dir: %s\n",
+ "locale_dir: %s\n"
+ "compiler version: %s\n"
+ ,
bare_version,
version,
default_config_path,
include_path,
groff_font_path,
- locale_dir);
+ locale_dir,
+#ifdef __VERSION__
+ __VERSION__
+#else
+ "Unknown"
+#endif
+ );
if ( msg )
fprintf(stderr,"Diagnosis: %s\n",msg);