X-Git-Url: https://wimlib.net/git/?a=blobdiff_plain;f=src%2Fpaths.c;h=9becb2128185d6dddc06c5251332c9ca4bf53bca;hb=a3c287beb780cb26efef17fca6d15331f285eb9c;hp=040ed697c083537730a7acb278ab7a15e91fb25b;hpb=ebe0206c700963ee0ace86cc55fca6570b03cac3;p=wimlib diff --git a/src/paths.c b/src/paths.c index 040ed697..9becb212 100644 --- a/src/paths.c +++ b/src/paths.c @@ -25,13 +25,15 @@ # include "config.h" #endif +#include "wimlib.h" #include "wimlib/paths.h" #include "wimlib/util.h" #include /* Like the basename() function, but does not modify @path; it just returns a - * pointer to it. */ + * pointer to it. This assumes the path separator is the + * OS_PREFERRED_PATH_SEPARATOR. */ const tchar * path_basename(const tchar *path) { @@ -48,12 +50,12 @@ path_basename_with_len(const tchar *path, size_t len) while (1) { if (p == path - 1) return T(""); - if (*p != T('/')) + if (*p != OS_PREFERRED_PATH_SEPARATOR) break; p--; } - while ((p != path - 1) && *p != T('/')) + while ((p != path - 1) && *p != OS_PREFERRED_PATH_SEPARATOR) p--; return p + 1; @@ -76,19 +78,6 @@ path_stream_name(const tchar *path) } -/* Translate backslashes to forward slashes in-place. */ -void -zap_backslashes(tchar *s) -{ - if (s) { - while (*s != T('\0')) { - if (*s == T('\\')) - *s = T('/'); - s++; - } - } -} - /* Duplicate a path; return empty string for NULL input. */ tchar * canonicalize_fs_path(const tchar *fs_path) @@ -98,8 +87,16 @@ canonicalize_fs_path(const tchar *fs_path) return TSTRDUP(fs_path); } -/* Duplicate a path, with backslashes translated into forward slashes; return - * empty string for NULL input; also strip leading and trailing slashes. */ +/* + * canonicalize_wim_path - Given a user-provided path to a file within a WIM + * image, translate it into a "canonical" path. + * + * To do this, we translate all supported path separators + * (is_any_path_separator()) into the WIM_PATH_SEPARATOR, and strip any leading + * and trailing slashes. The returned string is allocated. Note that there + * still may be consecutive path separators within the string. Furthermore, the + * string may be empty, which indicates the root dentry of the WIM image. + */ tchar * canonicalize_wim_path(const tchar *wim_path) { @@ -109,14 +106,16 @@ canonicalize_wim_path(const tchar *wim_path) if (wim_path == NULL) { wim_path = T(""); } else { - while (*wim_path == T('/') || *wim_path == T('\\')) + while (is_any_path_separator(*wim_path)) wim_path++; } canonical_path = TSTRDUP(wim_path); if (canonical_path) { - zap_backslashes(canonical_path); + for (p = canonical_path; *p; p++) + if (is_any_path_separator(*p)) + *p = WIM_PATH_SEPARATOR; for (p = tstrchr(canonical_path, T('\0')) - 1; - p >= canonical_path && *p == T('/'); + p >= canonical_path && *p == WIM_PATH_SEPARATOR; p--) { *p = T('\0');