Remove "Written by Ben Pfaff <blp@gnu.org>" lines everywhere.
[pspp] / src / ui / terminal / msg-ui.c
index 3e354a7b372d7b5c5cd2b882be5e85780b8fdd91..1a2cd27f0d8cb12b41999342dc4cf8347d678057 100644 (file)
@@ -1,6 +1,5 @@
 /* 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 "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 "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);
+  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."));
@@ -68,7 +99,7 @@ check_msg_count (void)
       else
         return;
 
-      getl_abort_noninteractive (); 
+      getl_abort_noninteractive (ss); 
     }
 }
 
@@ -140,9 +171,8 @@ handle_msg (const struct msg *m)
 
   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);
 }