X-Git-Url: https://pintos-os.org/cgi-bin/gitweb.cgi?a=blobdiff_plain;f=src%2Fdata%2Ffile-name.c;h=184a79aa4f79ae1b7e1c40de95a414e0922655da;hb=14e92ae17ea68adfe8d703b740e20c7f368138fb;hp=a81ea9341ae8fab5a5e0eb4e4f3d196edf4e9901;hpb=d62bc5d865e472cd9c20ed54383f29c2a57344ec;p=pspp diff --git a/src/data/file-name.c b/src/data/file-name.c index a81ea9341a..184a79aa4f 100644 --- a/src/data/file-name.c +++ b/src/data/file-name.c @@ -31,11 +31,11 @@ #include "data/settings.h" #include "libpspp/hash-functions.h" #include "libpspp/message.h" +#include "libpspp/i18n.h" #include "libpspp/str.h" #include "libpspp/version.h" #include "gl/dirname.h" -#include "gl/dosname.h" #include "gl/intprops.h" #include "gl/minmax.h" #include "gl/relocatable.h" @@ -48,7 +48,32 @@ /* Functions for performing operations on file names. */ -/* Searches for a configuration file with name NAME in the directories given in + +/* Returns the extension part of FILE_NAME as a malloc()'d string. + If FILE_NAME does not have an extension, returns an empty + string. */ +char * +fn_extension (const struct file_handle *fh) +{ + const char *file_name = fh_get_file_name (fh); + + const char *extension = strrchr (file_name, '.'); + if (extension == NULL) + extension = ""; + return xstrdup (extension); +} + +/* Find out information about files. */ + +/* Returns true iff NAME specifies an absolute file name. */ +static bool +fn_is_absolute (const char *name) +{ + return IS_ABSOLUTE_FILE_NAME (name); +} + + +/* Searches for a file with name NAME in the directories given in PATH, which is terminated by a null pointer. Returns the full name of the first file found, which the caller is responsible for freeing with free(), or NULL if none is found. */ @@ -72,42 +97,25 @@ fn_search_path (const char *base_name, char **path) else file = xasprintf ("%s/%s", dir, base_name); - if (fn_exists (file)) - return file; + struct stat temp; + if (((stat (file, &temp) == 0) && (! S_ISDIR (temp.st_mode)))) + return file; + free (file); } return NULL; } -/* Returns the extension part of FILE_NAME as a malloc()'d string. - If FILE_NAME does not have an extension, returns an empty - string. */ -char * -fn_extension (const char *file_name) -{ - const char *extension = strrchr (file_name, '.'); - if (extension == NULL) - extension = ""; - return xstrdup (extension); -} - -/* Find out information about files. */ - -/* Returns true iff NAME specifies an absolute file name. */ -bool -fn_is_absolute (const char *name) -{ - return IS_ABSOLUTE_FILE_NAME (name); -} /* Returns true if file with name NAME exists, and that file is not a directory */ bool -fn_exists (const char *name) +fn_exists (const struct file_handle *fh) { + const char *name = fh_get_file_name (fh); struct stat temp; - if ( stat (name, &temp) != 0 ) + if (stat (name, &temp) != 0) return false; return ! S_ISDIR (temp.st_mode); @@ -133,8 +141,10 @@ safety_violation (const char *fn) NULL on failure. If NULL is returned then errno is set to a sensible value. */ FILE * -fn_open (const char *fn, const char *mode) +fn_open (const struct file_handle *fh, const char *mode) { + const char *fn = fh_get_file_name (fh); + assert (mode[0] == 'r' || mode[0] == 'w' || mode[0] == 'a'); if (mode[0] == 'r') @@ -178,15 +188,28 @@ fn_open (const char *fn, const char *mode) } else #endif + +#if WIN32 + { + wchar_t *ss = convert_to_filename_encoding (fn, strlen (fn), fh_get_file_name_encoding (fh)); + wchar_t *m = (wchar_t *) recode_string ("UTF-16LE", "ASCII", mode, strlen (mode)); + FILE *fp = _wfopen (ss, m); + free (m); + free (ss); + return fp; + } +#else return fopen (fn, mode); +#endif } /* Counterpart to fn_open that closes file F with name FN; returns 0 on success, EOF on failure. If EOF is returned, errno is set to a sensible value. */ int -fn_close (const char *fn, FILE *f) +fn_close (const struct file_handle *fh, FILE *f) { + const char *fn = fh_get_file_name (fh); if (fileno (f) == STDIN_FILENO || fileno (f) == STDOUT_FILENO || fileno (f) == STDERR_FILENO) @@ -212,11 +235,10 @@ default_output_path (void) { static char *path = NULL; - if ( 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;