summaryrefslogtreecommitdiff
path: root/libguile/filesys.c
diff options
context:
space:
mode:
authorAndy Wingo <wingo@pobox.com>2009-06-19 14:26:47 +0200
committerAndy Wingo <wingo@pobox.com>2009-06-19 14:26:47 +0200
commit25b82b3485e9e44d8d6268d3774b0b81d0d501b2 (patch)
treef3378fd8b175d43240e6bff9f749826e4da87175 /libguile/filesys.c
parentffca4c2203d85bc4d9e348d77053d21112e665af (diff)
downloadguile-25b82b3485e9e44d8d6268d3774b0b81d0d501b2.tar.gz
new function: canonicalize-path. use when autocompiling
* libguile/filesys.h: * libguile/filesys.c (scm_canonicalize_path): New function, canonicalize-path. * module/system/base/compile.scm (compiled-file-name): Canonicalize the filename so that compiling e.g. ../foo.scm doesn't compile to ~/.guile-ccache/1.9/../foo.scm.
Diffstat (limited to 'libguile/filesys.c')
-rw-r--r--libguile/filesys.c22
1 files changed, 22 insertions, 0 deletions
diff --git a/libguile/filesys.c b/libguile/filesys.c
index b49d488f1..a2db6996f 100644
--- a/libguile/filesys.c
+++ b/libguile/filesys.c
@@ -30,6 +30,7 @@
#endif
#include <alloca.h>
+#include <canonicalize.h>
#include <stdio.h>
#include <errno.h>
@@ -1661,6 +1662,27 @@ SCM_DEFINE (scm_basename, "basename", 1, 1, 0,
}
#undef FUNC_NAME
+SCM_DEFINE (scm_canonicalize_path, "canonicalize-path", 1, 0, 0,
+ (SCM path),
+ "Return the canonical path of @var{path}. A canonical path has\n"
+ "no @code{.} or @code{..} components, nor any repeated path\n"
+ "separators (@code{/}) nor symlinks.\n\n"
+ "Raises an error if any component of @var{path} does not exist.")
+#define FUNC_NAME s_scm_canonicalize_path
+{ char *str, *canon;
+
+ SCM_VALIDATE_STRING (1, path);
+
+ str = scm_to_locale_string (path);
+ canon = canonicalize_file_name (str);
+ free (str);
+
+ if (canon)
+ return scm_take_locale_string (canon);
+ else
+ SCM_SYSERROR;
+}
+#undef FUNC_NAME