X-Git-Url: https://pintos-os.org/cgi-bin/gitweb.cgi?a=blobdiff_plain;f=src%2Fui%2Fgui%2Foutput-viewer.c;h=2b0c4af8094dbdd1668d7c6254d3f2e7f018ef18;hb=a1efcf97ca2f75f4be6a0389ff2372c03ed2d4e1;hp=d3b78f1481e9b098935e28368fff0d6a02319aa4;hpb=646890cac8de355277617ea100898c7d858a92d2;p=pspp-builds.git diff --git a/src/ui/gui/output-viewer.c b/src/ui/gui/output-viewer.c index d3b78f14..2b0c4af8 100644 --- a/src/ui/gui/output-viewer.c +++ b/src/ui/gui/output-viewer.c @@ -16,6 +16,7 @@ #include #include +#include #include "window-manager.h" #include "output-viewer.h" #include "helper.h" @@ -28,6 +29,8 @@ #include #include +#include "xalloc.h" + struct output_viewer { struct editor_window parent; @@ -60,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; } @@ -179,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 ) @@ -191,38 +194,78 @@ reload_the_viewer (void) reload_viewer (the_output_viewer); } +#define OUTPUT_FILE_NAME "psppire.txt" 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_print ("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_print ("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), @@ -236,3 +279,16 @@ reload_viewer (struct output_viewer *ov) + +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; +}