/* 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_set_error_file (const char *filename)
+{
+ error_file = filename;
+}
+
void
-msg_ui_init (void)
+msg_ui_init (struct source_stream *ss)
{
- msg_init (handle_msg, get_msg_location);
+ 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);
}
}
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);
}