Merge commit 'origin/stable'
[pspp-builds.git] / src / data / file-name.c
index 86c8e17e467d45c3cf7edac34166b20357cba62f..601afd5579e04a2ffff00193166989aedcd8e3b5 100644 (file)
@@ -1,5 +1,5 @@
 /* PSPP - a program for statistical analysis.
-   Copyright (C) 1997-9, 2000, 2006, 2007 Free Software Foundation, Inc.
+   Copyright (C) 1997-9, 2000, 2006, 2007, 2009 Free Software Foundation, Inc.
 
    This program is free software: you can redistribute it and/or modify
    it under the terms of the GNU General Public License as published by
@@ -138,6 +138,7 @@ fn_search_path (const char *base_name, const char *path_)
       if (!ds_is_empty (&file) && !ISSLASH (ds_last (&file)))
        ds_put_char (&file, '/');
       ds_put_cstr (&file, base_name);
+      ds_relocate (&file);
 
       /* Check whether file exists. */
       if (fn_exists (ds_cstr (&file)))
@@ -447,8 +448,64 @@ fn_compare_file_identities (const struct file_identity *a,
 unsigned int
 fn_hash_identity (const struct file_identity *identity)
 {
-  unsigned int hash = identity->device ^ identity->inode;
+  unsigned int hash = hash_int (identity->device, identity->inode);
   if (identity->name != NULL)
-    hash ^= hsh_hash_string (identity->name);
+    hash = hash_string (identity->name, hash);
   return hash;
 }
+
+#ifdef WIN32
+
+/* Apparently windoze users like to see output dumped into their home directory,
+   not the current directory (!) */
+const char *
+default_output_path (void)
+{
+  static char *path = NULL;
+
+  if ( path == NULL)
+    {
+      /* Windows NT defines HOMEDRIVE and HOMEPATH.  But give preference
+        to HOME, because the user can change HOME.  */
+
+      const char *home_dir = getenv ("HOME");
+      int i;
+
+      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",
+                                 home_drive, home_path);
+       }
+
+      if (home_dir == NULL)
+       home_dir = "c:/users/default"; /* poor default */
+
+      path = xasprintf ("%s%c", home_dir, '/');
+
+
+      for(i = 0; i < strlen (path); i++)
+       if (path[i] == '\\') path[i] = '/';
+    }
+
+  return path;
+}
+
+#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
+