git/list[1] front-page[2] threads[3] people[4] search[5] about
 

Re: [PATCH 03/10] Move builtin-remote's skip_prefix() to git-compat-util.h

From
Junio C Hamano <gitster@pobox.com>
Date
Jun 5, 2008, 22:38 UTC
Message-ID
<7vtzg7zew0.fsf@gitster.siamese.dyndns.org>
In-Reply-To
<5aca216074b88d68f97b8223ebf6272dfe6bddeb.1212698317.git.vmiklos@frugalware.org>
Miklos Vajna <vmiklos@frugalware.org> writes:
Show 31 quoted lines
> diff --git a/builtin-remote.c b/builtin-remote.c
> index c49f00f..9c25018 100644
> --- a/builtin-remote.c
> +++ b/builtin-remote.c
> @@ -29,12 +29,6 @@ static inline int postfixcmp(const char *string, const char *postfix)
>  	return strcmp(string + len1 - len2, postfix);
>  }
>  
> -static inline const char *skip_prefix(const char *name, const char *prefix)
> -{
> -	return !name ? "" :
> -		prefixcmp(name, prefix) ?  name : name + strlen(prefix);
> -}
> -
>  static int opt_parse_track(const struct option *opt, const char *arg, int not)
>  {
>  	struct path_list *list = opt->value;
> diff --git a/git-compat-util.h b/git-compat-util.h
> index 01c4045..af515d4 100644
> --- a/git-compat-util.h
> +++ b/git-compat-util.h
> @@ -127,6 +127,12 @@ extern void set_warn_routine(void (*routine)(const char *warn, va_list params));
>  
>  extern int prefixcmp(const char *str, const char *prefix);
>  
> +static inline const char *skip_prefix(const char *name, const char *prefix)
> +{
> +	return !name ? "" :
> +		prefixcmp(name, prefix) ?  name : name + strlen(prefix);
> +}
> +

Somehow you seemed to have picked the one whose semantics is defined much less clearly. For one thing, it takes more effort (and unnatural way to check) for the caller to detect the case where prefix did not match than the one that returns NULL. Worse, I think this one is less efficient, doing strlen(prefix) twice.

Show 23 quoted lines
> diff --git a/parse-options.c b/parse-options.c
> index acf3fe3..aa164d0 100644
> --- a/parse-options.c
> +++ b/parse-options.c
> @@ -22,12 +22,6 @@ static inline const char *get_arg(struct optparse_t *p)
>  	return *++p->argv;
>  }
>  
> -static inline const char *skip_prefix(const char *str, const char *prefix)
> -{
> -	size_t len = strlen(prefix);
> -	return strncmp(str, prefix, len) ? NULL : str + len;
> -}
> -
>  static int opterror(const struct option *opt, const char *reason, int flags)
>  {
>  	if (flags & OPT_SHORT)
> @@ -161,7 +155,7 @@ static int parse_long_opt(struct optparse_t *p, const char *arg,
>  
>  		rest = skip_prefix(arg, options->long_name);
>  		if (options->type == OPTION_ARGUMENT) {
> -			if (!rest)
> +			if (!strcmp(rest, arg))
Ugh.

At least please have the courtesy of not making it more expensive than the original unnecessarily. Isn't (rest == arg) enough here?

Still, I think the one from builtin-remote.c you used is a much worse implementation of the same thing between the two. It was Ok while it was a local scope hack only for builtin-remote.c's use, but a special calling convention like "if name is NULL return empty string" should not be promoted to public utility library status without defending why it is always a good idea to do so.

Previous: Miklos VajnaNext: Miklos Vajna
Message 44 of 45 in “Build in merge”
  1. 00/10 Build in mergeMiklos Vajna, Jun 5, 2008
  2. 01/10 Move split_cmdline() to alias.cMiklos Vajna, Jun 5, 2008
  3. 02/10 Move commit_list_count() to commit.cMiklos Vajna, Jun 5, 2008
  4. 03/10 Move builtin-remote's skip_prefix() to git-compat-util.hMiklos Vajna, Jun 5, 2008
  5. 04/10 Add new test to ensure git-merge handles pull.twohead and pull.octopusMiklos Vajna, Jun 5, 2008
  6. 05/10 parseopt: add a new PARSE_OPT_ARGV0_IS_AN_OPTION optionMiklos Vajna, Jun 5, 2008
  7. 06/10 Move read_cache_unmerged() to read-cache.cMiklos Vajna, Jun 5, 2008
  8. 07/10 git-fmt-merge-msg: make it useable from other builtinsMiklos Vajna, Jun 5, 2008
  9. 08/10 Introduce commit_list_append() in commit.cMiklos Vajna, Jun 5, 2008
  10. 09/10 Introduce get_octopus_merge_bases() in commit.cMiklos Vajna, Jun 5, 2008
  11. 10/10 Build in mergeMiklos Vajna, Jun 5, 2008
  12. Junio C HamanoJun 6, 2008
  13. Junio C HamanoJun 6, 2008
  14. Johannes SchindelinJun 6, 2008
  15. Johannes SchindelinJun 6, 2008
  16. Junio C HamanoJun 6, 2008
  17. Introduce get_octopus_merge_bases() in commit.cMiklos Vajna, Jun 7, 2008
  18. Johannes SchindelinJun 9, 2008
  19. Introduce get_octopus_merge_bases() in commit.cMiklos Vajna, Jun 9, 2008
  20. Junio C HamanoJun 9, 2008
  21. Johannes SchindelinJun 9, 2008
  22. Junio C HamanoJun 9, 2008
  23. Miklos VajnaJun 9, 2008
  24. Junio C HamanoJun 9, 2008
  25. Miklos VajnaJun 9, 2008
  26. Johannes SchindelinJun 9, 2008
  27. Junio C HamanoJun 9, 2008
  28. Miklos VajnaJun 10, 2008
  29. Johannes SchindelinJun 10, 2008
  30. Johannes SchindelinJun 6, 2008
  31. Miklos VajnaJun 7, 2008
  32. Junio C HamanoJun 5, 2008
  33. Miklos VajnaJun 6, 2008
  34. Junio C HamanoJun 7, 2008
  35. Miklos VajnaJun 7, 2008
  36. Junio C HamanoJun 5, 2008
  37. Miklos VajnaJun 7, 2008
  38. Andreas EricssonJun 9, 2008
  39. git-fmt-merge-msg: make it usable from other builtinsMiklos Vajna, Jun 9, 2008
  40. Junio C HamanoJun 5, 2008
  41. Move read_cache_unmerged() to read-cache.cMiklos Vajna, Jun 7, 2008
  42. Junio C HamanoJun 5, 2008
  43. Add new test to ensure git-merge handles pull.twohead and pull.octopusMiklos Vajna, Jun 7, 2008
  44. Junio C HamanoJun 5, 2008
  45. Move parse-options's skip_prefix() to git-compat-util.hMiklos Vajna, Jun 6, 2008

Read the whole thread, see it on lore, or plain text.

$ cat FOOTERMessages come from the public archive at lore.kernel.org/git, fetched every hour. The front page is chosen and written each morning by an AI editor and can be wrong; the threads themselves are the record. About and API. For agents: an MCP server at https://gitlist.dev/mcp, and any thread, story or person page as Markdown by adding .md to its URL (or sending Accept: text/markdown). Details in /llms.txt.