X-Git-Url: https://wimlib.net/git/?a=blobdiff_plain;f=src%2Fpaths.c;h=4b9db67f87ebed18b7404c5864cf676f4fb6c5a4;hb=57fb030cb2f6744b65c8d0fea68df534728515f9;hp=675b9f2752a4e21746febd9a848821bcc37f875b;hpb=927b1829e714d177de9d38c2da7fcdc13be44ed0;p=wimlib diff --git a/src/paths.c b/src/paths.c index 675b9f27..4b9db67f 100644 --- a/src/paths.c +++ b/src/paths.c @@ -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 + #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. 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; }