]> wimlib.net Git - wimlib/blobdiff - src/paths.c
timestamp.c: correctly convert negative UNIX timestamps
[wimlib] / src / paths.c
index 675b9f2752a4e21746febd9a848821bcc37f875b..4b9db67f87ebed18b7404c5864cf676f4fb6c5a4 100644 (file)
@@ -5,32 +5,30 @@
 /*
  * 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.  */
@@ -74,13 +72,34 @@ path_stream_name(const tchar *path)
                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');
 }
 
 /*
@@ -94,7 +113,7 @@ canonicalize_fs_path(const tchar *fs_path)
  *
  * Examples (with WIM_PATH_SEPARATOR == '/'):
  *
- *             => /            [ either NULL or empty string ]
+ *             => /            [ either NULL or empty string ]
  * /           => /
  * \           => /
  * hello       => /hello
@@ -126,24 +145,7 @@ canonicalize_wim_path(const tchar *wim_path)
        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;
 }