# include "config.h"
#endif
+#include "wimlib.h"
#include "wimlib/paths.h"
#include "wimlib/util.h"
#include <string.h>
/* 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)
{
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;
}
-/* 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, with backslashes translated into forward slashes; return
- * empty string for NULL input. */
+/* Duplicate a path; return empty string for NULL input. */
tchar *
canonicalize_fs_path(const tchar *fs_path)
{
- tchar *canonical_path;
-
if (!fs_path)
fs_path = T("");
- canonical_path = TSTRDUP(fs_path);
- zap_backslashes(canonical_path);
- return canonical_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)
{
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');