Added (source) configurable default output directory.
authorJohn Darrington <john@darrington.wattle.id.au>
Sat, 18 Oct 2008 01:09:47 +0000 (09:09 +0800)
committerJohn Darrington <john@darrington.wattle.id.au>
Sat, 18 Oct 2008 01:09:47 +0000 (09:09 +0800)
Some systems expect files to be dumped in the home directory
instead of the current directory.  This change makes that
easier.

src/data/file-name.c
src/data/file-name.h
src/output/journal.c
src/ui/gui/output-viewer.c
src/ui/gui/output-viewer.h
src/ui/gui/psppire.c

index 86c8e17e467d45c3cf7edac34166b20357cba62f..14afd60e53be5f86e01963d6f0a9aa08927e5de3 100644 (file)
@@ -452,3 +452,45 @@ fn_hash_identity (const struct file_identity *identity)
     hash ^= hsh_hash_string (identity->name);
   return hash;
 }
+
+
+
+#ifdef WINDOWS32
+
+/* Apparently windoze users like to see output dumped into their home directory,
+   not the current directory (!) */
+const char *
+default_output_path (void)
+{
+  static const char *home_dir = NULL;
+
+  /* Windows NT defines HOMEDRIVE and HOMEPATH.  But give preference
+     to HOME, because the user can change HOME.  */
+  if (home_dir == NULL)
+    {
+      const char *home_drive = getenv ("HOMEDRIVE");
+      const char *home_path = getenv ("HOMEPATH");
+
+      if (home_drive != NULL && home_path != NULL)
+       home_dir = xasprintf ("%s%s%c",
+                             home_drive, home_path, DIRECTORY_SEPARATOR);
+      else
+       home_dir = "c:/users/default/"; /* poor default */
+    }
+  return home_dir;
+}
+
+#else
+
+/* ... whereas the rest of the world just likes it to be
+   put "here" for easy access. */
+const char *
+default_output_path (void)
+{
+  static char current_dir[]  = "";
+
+  return current_dir;
+}
+
+#endif
+
index b4231d2f87178b841f85cf62d69a76e15b871b5e..d34bd4196fea046db722197aa403db964a423deb 100644 (file)
@@ -52,4 +52,6 @@ int fn_compare_file_identities (const struct file_identity *,
                                 const struct file_identity *);
 unsigned int fn_hash_identity (const struct file_identity *);
 
+const char * default_output_path (void);
+
 #endif /* file-name.h */
index ef50285ea4ee1b8ba04624a37447daac433f16bb..67657f6247cc8ec731cf8154c4f45aa48d369003 100644 (file)
@@ -22,6 +22,7 @@
 #include <stdio.h>
 #include <stdlib.h>
 
+#include <data/file-name.h>
 #include <libpspp/str.h>
 
 #include "fwriteerror.h"
@@ -83,7 +84,10 @@ journal_write (bool prefix, const char *line)
   if (journal_file == NULL)
     {
       if (journal_file_name == NULL)
-        journal_file_name = xstrdup ("pspp.jnl");
+       {
+         const char *output_path = default_output_path ();
+         journal_file_name = xasprintf ("%s%s", output_path, "pspp.jnl");
+       }
       journal_file = fopen (journal_file_name, "w");
       if (journal_file == NULL)
         {
index bf647e9051199eda18135237e6f477aab4249814..c00e8c60dbe04ac74d0f3ee0369522dc7fb32c7d 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 )
@@ -248,10 +249,10 @@ reload_viewer (struct output_viewer *ov)
   {
     if ( ov->fp == NULL)
       {
-       ov->fp = fopen (OUTPUT_FILE_NAME, "r");
+       ov->fp = fopen (output_file_name (), "r");
        if ( ov->fp == NULL)
          {
-           g_print ("Cannot open %s\n", OUTPUT_FILE_NAME);
+           g_print ("Cannot open %s\n", output_file_name ());
            return;
          }
       }
@@ -276,4 +277,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;
+}
index b5c9ffcea77e4a62fc4c0e36158931a37ad29c5a..e5bf5c1cc34e821ca3dd4d416138a28e35d6c693 100644 (file)
@@ -33,7 +33,6 @@ void reload_viewer (struct output_viewer *);
 void reload_the_viewer (void);
 
 
-#define OUTPUT_FILE_NAME "psppire.txt"
-
+const char * output_file_name (void);
 
 #endif
index 239d153e4b0d5ca3454f2080f7c21946181cb2af..974d18b7e0d70f9cff244fbff3d5ee600ab126ba 100644 (file)
@@ -111,13 +111,25 @@ initialize (void)
 
   create_icon_factory ();
 
-  outp_configure_driver_line (
-    ss_cstr ("gui:ascii:screen:squeeze=on headers=off top-margin=0 "
-             "bottom-margin=0 paginate=off length=auto width=auto "
-            "emphasis=none "
-             "output-file=\"" OUTPUT_FILE_NAME "\" append=yes"));
+  {
+    const char *filename = output_file_name ();
+
+    struct string config_string;
+
+    ds_init_empty (&config_string);
+
+    ds_put_format (&config_string,
+                  "gui:ascii:screen:squeeze=on headers=off top-margin=0 "
+                  "bottom-margin=0 paginate=off length=auto width=auto "
+                  "emphasis=none "
+                  "output-file=\"%s\" append=yes", filename);
 
-  unlink (OUTPUT_FILE_NAME);
+    outp_configure_driver_line (ds_ss (&config_string));
+
+    unlink (filename);
+
+    ds_destroy (&config_string);
+  }
 
   journal_enable ();
   textdomain (PACKAGE);