X-Git-Url: https://pintos-os.org/cgi-bin/gitweb.cgi?a=blobdiff_plain;ds=sidebyside;f=src%2Fui%2Fterminal%2Fmsg-ui.c;h=adb14b9bc09037b09c26ed6483ee553ebabc08cb;hb=8fa97cbb0299bddaa217bb23dcbac3e6f2503cd1;hp=9b71cb51eea1e69eb2c4670b91e171b3a765fcc1;hpb=618a58ebb4c59dff83374278e44b7375b3865935;p=pspp-builds.git diff --git a/src/ui/terminal/msg-ui.c b/src/ui/terminal/msg-ui.c index 9b71cb51..adb14b9b 100644 --- a/src/ui/terminal/msg-ui.c +++ b/src/ui/terminal/msg-ui.c @@ -1,6 +1,5 @@ /* PSPP - computes sample statistics. Copyright (C) 1997-9, 2000, 2006 Free Software Foundation, Inc. - Written by Ben Pfaff . This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as @@ -21,12 +20,16 @@ #include "msg-ui.h" -#include "exit.h" #include "linebreak.h" -#include +#include +#include #include #include +#include +#include +#include +#include #include "gettext.h" #define _(msgid) gettext (msgid) @@ -35,28 +38,54 @@ /* 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.")); @@ -69,18 +98,18 @@ check_msg_count (void) 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; } @@ -92,26 +121,26 @@ static void dump_line (int line_indent, const char *line, size_t length, 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. */ @@ -132,18 +161,17 @@ handle_msg (const struct msg *m) 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); } @@ -184,7 +212,7 @@ dump_message (char *msg, unsigned width, unsigned indent, FILE *stream) 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,