/* PSPP - computes sample statistics.
Copyright (C) 1997-9, 2000, 2006 Free Software Foundation, Inc.
- Written by Ben Pfaff <blp@gnu.org>.
This program is free software; you can redistribute it and/or
modify it under the terms of the GNU General Public License as
#include "msg-ui.h"
-#include "exit.h"
#include "linebreak.h"
-#include <language/line-buffer.h>
+#include <libpspp/msg-locator.h>
+#include <libpspp/getl.h>
#include <data/settings.h>
#include <libpspp/message.h>
+#include <libpspp/str.h>
+#include <errno.h>
+#include <stdio.h>
+#include <stdlib.h>
#include "gettext.h"
#define _(msgid) gettext (msgid)
/* Number of errors, warnings reported. */
static int error_count;
static int warning_count;
+static const char *error_file;
static void handle_msg (const struct msg *);
+static FILE *msg_file ;
+
void
-msg_ui_init (void)
+msg_ui_set_error_file (const char *filename)
{
- msg_init (handle_msg, get_msg_location);
+ error_file = filename;
}
void
-msg_ui_done (void)
+msg_ui_init (struct source_stream *ss)
{
- msg_done ();
+ msg_file = stdout;
+
+ if ( error_file )
+ {
+ msg_file = fopen (error_file, "a");
+ if ( NULL == msg_file )
+ {
+ int err = errno;
+ printf ( _("Cannot open %s (%s). "
+ "Writing errors to stdout instead.\n"),
+ error_file, strerror(err) );
+ msg_file = stdout;
+ }
+ }
+ msg_init (ss, handle_msg);
}
+void
+msg_ui_done (void)
+{
+ msg_done ();
+ msg_locator_done ();
+
+ if ( msg_file ) /* FIXME: do we really want to close stdout ?? */
+ fclose (msg_file);
+}
/* Checks whether we've had so many errors that it's time to quit
processing this syntax file. */
void
-check_msg_count (void)
+check_msg_count (struct source_stream *ss)
{
- if (!getl_is_interactive ())
+ if (!getl_is_interactive (ss))
{
if (get_errorbreak () && error_count)
msg (MN, _("Terminating execution of syntax file due to error."));
else
return;
- getl_abort_noninteractive ();
+ getl_abort_noninteractive (ss);
}
}
void
-reset_msg_count (void)
+reset_msg_count (void)
{
error_count = warning_count = 0;
}
bool
-any_errors (void)
+any_errors (void)
{
return error_count > 0;
}
static void
handle_msg (const struct msg *m)
{
- struct category
+ struct category
{
bool show_command_name; /* Show command name with error? */
bool show_file_location; /* Show syntax file location? */
};
- static const struct category categories[] =
+ static const struct category categories[] =
{
{false, false}, /* MSG_GENERAL. */
{true, true}, /* MSG_SYNTAX. */
{false, true}, /* MSG_DATA. */
};
- struct severity
+ struct severity
{
const char *name; /* How to identify this severity. */
int *count; /* Number of msgs with this severity so far. */
};
-
- static struct severity severities[] =
+
+ static struct severity severities[] =
{
{N_("error"), &error_count}, /* MSG_ERROR. */
{N_("warning"), &warning_count}, /* MSG_WARNING. */
if (severity->name != NULL)
ds_put_format (&string, "%s: ", gettext (severity->name));
-
+
if (severity->count != NULL)
++*severity->count;
-
+
if (category->show_command_name && msg_get_command_name () != NULL)
ds_put_format (&string, "%s: ", msg_get_command_name ());
ds_put_cstr (&string, m->text);
- /* FIXME: Check set_messages and set_errors to determine where to
- send errors and messages. */
- dump_message (ds_cstr (&string), get_viewwidth (), 8, stdout);
+ if (msg_file != stdout || get_error_routing_to_terminal ())
+ dump_message (ds_cstr (&string), get_viewwidth (), 8, msg_file);
ds_destroy (&string);
}
line_start = 0;
line_indent = 0;
for (i = 0; i < length; i++)
- switch (breaks[i])
+ switch (breaks[i])
{
case UC_BREAK_POSSIBLE:
/* Break before this character,