/*
* Copyright (C) 2012, 2013 Eric Biggers
*
- * This file is part of wimlib, a library for working with WIM files.
+ * This file is free software; you can redistribute it and/or modify it under
+ * the terms of the GNU Lesser General Public License as published by the Free
+ * Software Foundation; either version 3 of the License, or (at your option) any
+ * later version.
*
- * wimlib is free software; you can redistribute it and/or modify it under the
- * terms of the GNU General Public License as published by the Free
- * Software Foundation; either version 3 of the License, or (at your option)
- * any later version.
- *
- * wimlib is distributed in the hope that it will be useful, but WITHOUT ANY
- * WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR
- * A PARTICULAR PURPOSE. See the GNU General Public License for more
+ * This file is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
+ * FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more
* details.
*
- * You should have received a copy of the GNU General Public License
- * along with wimlib; if not, see http://www.gnu.org/licenses/.
+ * You should have received a copy of the GNU Lesser General Public License
+ * along with this file; if not, see http://www.gnu.org/licenses/.
*/
#ifdef HAVE_CONFIG_H
# include "config.h"
#endif
+#include <string.h>
+
#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. This assumes the path separator is the
* OS_PREFERRED_PATH_SEPARATOR. */
return stream_name + 1;
}
-/* Duplicate a path; return empty string for NULL input. */
-tchar *
-canonicalize_fs_path(const tchar *fs_path)
+/* Collapse and translate path separators, and strip trailing slashes. Doesn't
+ * add or delete a leading slash.
+ *
+ * @in may alias @out.
+ */
+void
+do_canonicalize_path(const tchar *in, tchar *out)
{
- if (fs_path == NULL)
- fs_path = T("");
- return TSTRDUP(fs_path);
+ tchar *orig_out = out;
+
+ while (*in) {
+ if (is_any_path_separator(*in)) {
+ /* Collapse multiple path separators into one */
+ *out++ = WIM_PATH_SEPARATOR;
+ do {
+ in++;
+ } while (is_any_path_separator(*in));
+ } else {
+ /* Copy non-path-separator character */
+ *out++ = *in++;
+ }
+ }
+
+ /* Remove trailing slash if existent */
+ if (out - orig_out > 1 && *(out - 1) == WIM_PATH_SEPARATOR)
+ --out;
+
+ *out = T('\0');
}
/*
if (!is_any_path_separator(*in))
*out++ = WIM_PATH_SEPARATOR;
- while (*in) {
- if (is_any_path_separator(*in)) {
- /* Collapse multiple path separators into one */
- *out++ = WIM_PATH_SEPARATOR;
- do {
- in++;
- } while (is_any_path_separator(*in));
- } else {
- /* Copy non-path-separator character */
- *out++ = *in++;
- }
- }
-
- /* Remove trailing slash if existent */
- if (*(out - 1) == WIM_PATH_SEPARATOR && (out - 1) != result)
- --out;
-
- *out = T('\0');
+ do_canonicalize_path(in, out);
return result;
}