Added a syntax editor to the GUI.
[pspp-builds.git] / src / ui / terminal / msg-ui.c
index bcfe1ea6dcda81b54f9b49b9bc37162ded66a36e..6a67a6f1187f2bdcd209e3ad121ae1d980507c4a 100644 (file)
 #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, 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 ();
+  
+  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,7 +99,7 @@ check_msg_count (void)
       else
         return;
 
-      getl_abort_noninteractive (); 
+      getl_abort_noninteractive (ss); 
     }
 }
 
@@ -141,8 +171,8 @@ handle_msg (const struct msg *m)
 
   ds_put_cstr (&string, m->text);
 
-  if (get_error_routing_to_terminal ())
-    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);
 }