Re: [PATCH 1/2] Introduce the function strip_path_suffix()
- From
Johannes Sixt <j6t@kdbg.org>
- Date
- Feb 18, 2009, 19:39 UTC
- Message-ID
- <499C63E7.5040306@kdbg.org>
- In-Reply-To
- <7b5ee74d497bbb7144b8683725cd83c8bbd33f9a.1234969572u.git.johannes.schindelin@gmx.de>
Johannes Schindelin schrieb:
Show 12 quoted lines
> The function strip_path_suffix() will try to split the given path into
> prefix/suffix. The suffix has to be passed to the function, and if the
> path matches, the prefix is set.
>
> Arbitrary runs of directory separators ("slashes") are assumed identical.
>
> Example:
>
> strip_path_suffix("C:\\msysgit/\\libexec\\git-core",
> "libexec///git-core", &prefix)
>
> will set prefix to "C:\\msysgit" and return 0.But you implemented it so that prefix is actually "C:\\msysgit/\\" (unless, of course, I'm reading the code wrong).
> +/* sets prefix if the suffix matches */ > +int strip_path_suffix(const char *path, const char *suffix, const char **prefix)
For a general purpose function, the API is very unnatural (and geared towards its only user in patch 2/2). I'd expect that the return value is the result or NULL on failure.
I would not raise this concern if this were a static function near its only call site.
Show 19 quoted lines
> +{
> + int path_len = strlen(path), suffix_len = strlen(suffix);
> +
> + while (suffix_len) {
> + if (!path_len)
> + return 1;
> +
> + if (is_dir_sep(path[path_len - 1])) {
> + if (!is_dir_sep(suffix[suffix_len - 1]))
> + return 1;
> + path_len = chomp_trailing_dir_sep(path, path_len);
> + suffix_len = chomp_trailing_dir_sep(suffix, suffix_len);
> + }
> + else if (path[--path_len] != suffix[--suffix_len])
> + return 1;
> + }
> +
> + if (path_len && !is_dir_sep(path[path_len - 1]))
> + return 1;Should strip_path_suffix("foo/bar", "foo/bar", &prefix) succeed and prefix be the empty string? This implementation says it should be so. That's just a question...
> + *prefix = xstrndup(path, chomp_trailing_dir_sep(path, path_len)); > + return 0; > +}
-- Hannes