/* PSPP - computes sample statistics.
- Copyright (C) 1997-9, 2000 Free Software Foundation, Inc.
+ Copyright (C) 1997-9, 2000, 2006 Free Software Foundation, Inc.
Written by Ben Pfaff <blp@gnu.org>.
This program is free software; you can redistribute it and/or
#include <config.h>
#include "error.h"
#include "filename.h"
+#include <stdio.h>
#include <stdlib.h>
#include <ctype.h>
#include <errno.h>
#include "settings.h"
#include "str.h"
#include "version.h"
+#include "xreadlink.h"
+
+#include "gettext.h"
+#define _(msgid) gettext (msgid)
#include "debug-print.h"
#if HAVE_UNISTD_H
#include <unistd.h>
#endif
-#include "stat.h"
+#include <sys/stat.h>
+#include "stat-macros.h"
#endif
#ifdef __WIN32__
if (len == 1 && filename[0] == '/')
p = filename + 1;
else if (len && filename[len - 1] == DIR_SEPARATOR)
- p = mm_find_reverse (filename, len - 1, filename + len - 1, 1);
+ p = buf_find_reverse (filename, len - 1, filename + len - 1, 1);
else
p = strrchr (filename, DIR_SEPARATOR);
if (p == NULL)
abort ();
}
#endif
+
+/* Returns the extension part of FILENAME as a malloc()'d string.
+ If FILENAME does not have an extension, returns an empty
+ string. */
+char *
+fn_extension (const char *filename)
+{
+ const char *extension = strrchr (filename, '.');
+ if (extension == NULL)
+ extension = "";
+ return xstrdup (extension);
+}
\f
#if unix
/* Returns the current working directory, as a malloc()'d string.
#endif
}
-#ifdef unix
-/* Stolen from libc.info but heavily modified, this is a wrapper
- around readlink() that allows for arbitrary filename length. */
+/* Returns the symbolic link value for FILENAME as a dynamically
+ allocated buffer, or a null pointer on failure. */
char *
fn_readlink (const char *filename)
{
- int size = 128;
-
- for (;;)
- {
- char *buffer = xmalloc (size);
- int nchars = readlink (filename, buffer, size);
- if (nchars == -1)
- {
- free (buffer);
- return NULL;
- }
-
- if (nchars < size - 1)
- {
- buffer[nchars] = 0;
- return buffer;
- }
- free (buffer);
- size *= 2;
- }
-}
-#else /* Not UNIX. */
-char *
-fn_readlink (const char *filename)
-{
- return NULL;
+ return xreadlink (filename, 32);
}
-#endif /* Not UNIX. */
\f
/* Environment variables. */
#ifdef unix
if (fn[0] == '|')
{
- if (safer_mode())
+ if (get_safer_mode ())
return safety_violation (fn);
return popen (&fn[1], mode);
char *s;
FILE *f;
- if (safer_mode())
+ if (get_safer_mode ())
return safety_violation (fn);
s = local_alloc (strlen (fn));