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

Re: [PATCH 2/3] strbuf: add strbuf_percentquote_buf

From
Jeff King <peff@peff.net>
Date
Jan 13, 2010, 17:06 UTC
Message-ID
<20100113170636.GA21318@coredump.intra.peff.net>
In-Reply-To
<7viqb6trwu.fsf@alter.siamese.dyndns.org>
On Tue, Jan 12, 2010 at 10:55:45PM -0800, Junio C Hamano wrote:
Show 5 quoted lines
> > +void strbuf_percentquote_buf(struct strbuf *dest, struct strbuf *src)
> > +{
> 
> Just a style thing, but please call that "dst" to be consistent.  You are
> already dropping vowels from the other side to spell it "src".

I personally dislike that spelling, but it certainly is consistent with the rest of git, so OK.

Show 5 quoted lines
> I wondered if the function should be just 1-arg that always quotes
> in-place instead, but your [PATCH 3/3] wants to have an appending
> semantics from this function, so changing it to be a 1-arg "in-place
> quoter" will force the caller to run strbuf_addbuf() on the result, which
> is not nice.

Yep. An in-place version would be a bit more complicated to write, and would make the caller do extra work.

> Since tucking a p-quoted version of the same string to its original
> doesn't make sense at all, perhaps this should:
> 
>  (0) be renamed to have "append" somewhere in its name;

Yeah, I considered this. To follow the existing naming conventions, the name should indicate:

  1. it's a strbuf function
  2. it's appending (and the pattern is to use "add")
  3. it's appending a strbuf (and the pattern is to call this "buf")
  4. it's percent-quoting

So perhaps following the existing standards, it should be strbuf_addbuf_percentquote? Long, but I don't think there is any confusion about what it does (and leaves room for addstr_percentquote).

>  (1) mark the src side as const; and
Oops, good catch.
>  (2) perhaps have assert(dst != src).  The loop won't terminate when
>      called with src == dst, I think.

Oops again. I think it is sensible to protect against this. I thought about trying to make it magically work in-place, but I don't think there is a simple way to do so. And since I don't actually need to do that, I think leaving an assert in-place until somebody does need it and wants to write it is fine.

Show 15 quoted lines
> --- a/strbuf.h
> +++ b/strbuf.h
> @@ -105,7 +105,13 @@ static inline void strbuf_addstr(struct strbuf *sb, const char *s) {
>  	strbuf_add(sb, s, strlen(s));
>  }
>  static inline void strbuf_addbuf(struct strbuf *sb, const struct strbuf *sb2) {
> -	strbuf_add(sb, sb2->buf, sb2->len);
> +	char *buf = sb2->buf;
> +	int len = sb2->len;
> +	if (sb->buf == sb2->buf) {
> +		strbuf_grow(sb, len);
> +		buf = sb->buf;
> +	}
> +	strbuf_add(sb, buf, len);
>  }

Shouldn't this be "if (sb == sb2)"? Two strbufs in the initial state will point to the same strbuf_slopbuf, but obviously growing sb will not impact sb2. Though that would simply provoke a false positive, which I don't think has any negative consequences.

Also, since reallocating sb will reallocate sb2, can't you just write it safely like this:

  strbuf_grow(sb, sb2->len);
  strbuf_add(sb, sb2->buf, sb2->len);

The grow will not affect the length of sb2, so that doesn't need to be saved. And there is no point in deciding whether to point the buf you pass at sb->buf or sb2->buf. If they are the same, then the grow will have reallocated sb2 as well as sb, and they are identical. And if they are not, then sb2->buf is the right thing to pass.

-Peff
Previous: Junio C HamanoNext: Junio C Hamano
Message 26 of 54 in “edit Author/Date metadata as part of 'git commit' $EDITOR invocation?”
  1. Adam MegaczJan 3, 2010
  2. Sverre RabbelierJan 4, 2010
  3. Adam MegaczJan 4, 2010
  4. Sverre RabbelierJan 4, 2010
  5. David AguilarJan 5, 2010
  6. Nanako ShiraishiJan 5, 2010
  7. Junio C HamanoJan 6, 2010
  8. Adam MegaczJan 8, 2010
  9. Junio C HamanoJan 8, 2010
  10. 1/3 ident.c: remove unused variablesJunio C Hamano, Jan 8, 2010
  11. 2/3 ident.c: check explicit identity for name and email separatelyJunio C Hamano, Jan 8, 2010
  12. Santi BéjarJan 8, 2010
  13. 3/3 ident.c: treat $EMAIL as giving user.email identity explicitlyJunio C Hamano, Jan 8, 2010
  14. Display author and committer after "git commit"Adam Megacz, Jan 11, 2010
  15. Adam MegaczJan 11, 2010
  16. Junio C HamanoJan 11, 2010
  17. Adam MegaczJan 12, 2010
  18. Jeff KingJan 12, 2010
  19. Jeff KingJan 12, 2010
  20. Jeff KingJan 12, 2010
  21. 1/3 strbuf_expand: convert "%%" to "%"Jeff King, Jan 12, 2010
  22. 2/3 strbuf: add strbuf_percentquote_bufJeff King, Jan 12, 2010
  23. Johannes SchindelinJan 12, 2010
  24. Jeff KingJan 12, 2010
  25. Junio C HamanoJan 13, 2010
  26. Jeff KingJan 13, 2010
  27. Junio C HamanoJan 13, 2010
  28. Jeff KingJan 13, 2010
  29. 3/3 commit: show interesting ident information in summaryJeff King, Jan 12, 2010
  30. Junio C HamanoJan 13, 2010
  31. Jeff KingJan 13, 2010
  32. Junio C HamanoJan 13, 2010
  33. Jeff KingJan 13, 2010
  34. Jeff KingJan 13, 2010
  35. Junio C HamanoJan 13, 2010
  36. Jeff KingJan 13, 2010
  37. 1/3 strbuf_expand: convert "%%" to "%"Jeff King, Jan 13, 2010
  38. Chris JohnsenJan 14, 2010
  39. Jeff KingJan 14, 2010
  40. 2/3 strbuf: add strbuf_addbuf_percentquoteJeff King, Jan 13, 2010
  41. 3/3 commit: show interesting ident information in summaryJeff King, Jan 13, 2010
  42. Wincent ColaiutaJan 13, 2010
  43. Jeff KingJan 13, 2010
  44. Wincent ColaiutaJan 13, 2010
  45. Thomas RastJan 14, 2010
  46. Felipe ContrerasJan 14, 2010
  47. Junio C HamanoJan 14, 2010
  48. Felipe ContrerasJan 14, 2010
  49. Junio C HamanoJan 14, 2010
  50. Felipe ContrerasJan 15, 2010
  51. Adam MegaczJan 16, 2010
  52. Matthieu MoyJan 17, 2010
  53. Junio C HamanoJan 17, 2010
  54. Jeff KingJan 17, 2010

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.