Change g_print to g_warning
[pspp-builds.git] / src / ui / gui / output-viewer.c
index 0372e14cf9325df0a7a62604229b329784ca073a..641944d00445f34fc48bc70229141c6e1d45a6d9 100644 (file)
@@ -16,6 +16,7 @@
 
 #include <config.h>
 #include <gtk/gtk.h>
+#include <data/file-name.h>
 #include "window-manager.h"
 #include "output-viewer.h"
 #include "helper.h"
@@ -62,7 +63,7 @@ on_delete (GtkWidget *w, GdkEvent *event, gpointer user_data)
 
   the_output_viewer = NULL;
 
-  unlink (OUTPUT_FILE_NAME);
+  unlink (output_file_name ());
 
   return FALSE;
 }
@@ -181,7 +182,7 @@ reload_the_viewer (void)
   struct stat buf;
 
   /* If there is no output, then don't do anything */
-  if (0 != stat (OUTPUT_FILE_NAME, &buf))
+  if (0 != stat (output_file_name (), &buf))
     return ;
 
   if ( NULL == the_output_viewer )
@@ -194,37 +195,77 @@ reload_the_viewer (void)
 }
 
 
+
 void
 reload_viewer (struct output_viewer *ov)
 {
   GtkTextIter end_iter;
-  static char *line = NULL;
   GtkTextMark *mark ;
-  gboolean chars_inserted = FALSE;
 
+  static char *line = NULL;
 
-  if ( ov->fp == NULL)
-    {
-      ov->fp = fopen (OUTPUT_FILE_NAME, "r");
-      if ( ov->fp == NULL)
-       {
-         g_print ("Cannot open %s\n", OUTPUT_FILE_NAME);
-         return;
-       }
-    }
+  gboolean chars_inserted = FALSE;
+
+  gtk_text_buffer_get_end_iter (ov->buffer, &end_iter);
 
   line = xrealloc (line, sizeof (char) * (viewer_width + 1));
 
-  gtk_text_buffer_get_end_iter (ov->buffer, &end_iter);
 
   mark = gtk_text_buffer_create_mark (ov->buffer, NULL, &end_iter, TRUE);
 
-  /* Read in the next lot of text */
-  while (fgets (line, viewer_width + 1, ov->fp) != NULL)
-    {
-      chars_inserted = TRUE;
-      gtk_text_buffer_insert (ov->buffer, &end_iter, line, -1);
-    }
+#ifdef __CYGWIN__
+  /*
+    Apparently Windoze is not capabale of writing to a file whilst
+    another (or the same) process is reading from it.   Therefore, we
+    must close the file after reading it, and clear the entire buffer
+    before writing to it.
+    This will be slower for large buffers, but should work
+    (in so far as anything ever works on windows).
+  */
+  {
+    GtkTextIter start_iter;
+    FILE *fp = fopen (output_file_name (), "r");
+    if ( !fp)
+      {
+       g_warning ("Cannot open %s\n", output_file_name ());
+       return;
+      }
+
+    /* Delete all the entire buffer */
+    gtk_text_buffer_get_start_iter (ov->buffer, &start_iter);
+    gtk_text_buffer_delete (ov->buffer, &start_iter, &end_iter);
+
+
+    gtk_text_buffer_get_start_iter (ov->buffer, &start_iter);
+    /* Read in the next lot of text */
+    while (fgets (line, viewer_width + 1, fp) != NULL)
+      {
+       chars_inserted = TRUE;
+       gtk_text_buffer_insert (ov->buffer, &start_iter, line, -1);
+      }
+
+    fclose (fp);
+  }
+#else
+  {
+    if ( ov->fp == NULL)
+      {
+       ov->fp = fopen (output_file_name (), "r");
+       if ( ov->fp == NULL)
+         {
+           g_warning ("Cannot open %s\n", output_file_name ());
+           return;
+         }
+      }
+
+    /* Read in the next lot of text */
+    while (fgets (line, viewer_width + 1, ov->fp) != NULL)
+      {
+       chars_inserted = TRUE;
+       gtk_text_buffer_insert (ov->buffer, &end_iter, line, -1);
+      }
+  }
+#endif
 
   /* Scroll to where the start of this lot of text begins */
   gtk_text_view_scroll_to_mark (GTK_TEXT_VIEW (ov->textview),
@@ -237,4 +278,17 @@ reload_viewer (struct output_viewer *ov)
 }
 
 
+#define OUTPUT_FILE_NAME "psppire.txt"
 
+const char *
+output_file_name (void)
+{
+  const char *dir = default_output_path ();
+  static char *filename = NULL;
+
+  if ( NULL == filename )
+    filename = xasprintf ("%s%s", dir, OUTPUT_FILE_NAME);
+
+
+  return filename;
+}