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

Re: [PATCH 2/9] strbuf: add strbuf_tolower function

From
Jeff King <peff@peff.net>
Date
May 23, 2014, 20:03 UTC
Message-ID
<20140523200347.GC19088@sigill.intra.peff.net>
In-Reply-To
<xmqqppj5msob.fsf@gitster.dls.corp.google.com>
On Thu, May 22, 2014 at 02:04:20PM -0700, Junio C Hamano wrote:
Show 13 quoted lines
> Jeff King <peff@peff.net> writes:
> 
> >> > Yes, and that would be fine with me (I actually wrote strbuf_tolower for
> >> > my own use, and _then_ realized that we already had such a thing that
> >> > could be replaced).
> >> ...
> > ... I think
> > the bigger question is: is this refactor worth doing, since there is
> > only one caller?
> 
> If you wrote it for your own use and then realized that it is
> applicable to this codepath, wouldn't that say that there are
> multiple potential callers that would benefit from having it?

Sure, and that's why I posted it. But I know our standard for adding code is often a bit higher. We don't generally add code that has no callers. In this case, there is one caller, but it is still only theoretical that there will be another. I.e., for the same reason that I did not end up using it in my patch (namely, that we often want to downcase _and_ do other things while we traverse the string), other places may not.

That's why I asked: it is a judgement call on "does this seem like it is likely to be a useful thing in the future?". Probably, but I wouldn't be sad if people disagreed and we dropped it.

Anyway, here is an updated patch. It uses pointer arithmetic (though I am curious whether hand-optimizing "*p" is actually any faster than "sb->buf[i]" with modern compilers), but traverses past NULs. I also updated the commit message to reflect the discussion.

-- >8 --
Subject: strbuf: add strbuf_tolower function

This is a convenience wrapper to call tolower on each character of the string.

This makes config's lowercase() function obsolete, though note that because we have a strbuf, we are careful to operate over the whole strbuf, rather than assuming that a NUL is the end-of-string.

We could continue to offer a pure-string lowercase, but there would be no callers (in most pure-string cases, we actually duplicate and lowercase the duplicate, for which we have the xstrdup_tolower wrapper).

Signed-off-by: Jeff King <peff@peff.net>
---
 Documentation/technical/api-strbuf.txt | 4 ++++
 config.c                               | 8 +-------
 strbuf.c                               | 7 +++++++
 strbuf.h                               | 1 +
 4 files changed, 13 insertions(+), 7 deletions(-)
diff --git a/Documentation/technical/api-strbuf.txt b/Documentation/technical/api-strbuf.txt
index 3350d97..8480f89 100644
--- a/Documentation/technical/api-strbuf.txt
+++ b/Documentation/technical/api-strbuf.txt
@@ -125,6 +125,10 @@ Functions
 
 	Strip whitespace from the end of a string.
 
+`strbuf_tolower`::
+
+	Lowercase each character in the buffer using `tolower`.
+
 `strbuf_cmp`::
 
 	Compare two buffers. Returns an integer less than, equal to, or greater
diff --git a/config.c b/config.c
index a30cb5c..03ce5c6 100644
--- a/config.c
+++ b/config.c
@@ -147,12 +147,6 @@ int git_config_include(const char *var, const char *value, void *data)
 	return ret;
 }
 
-static void lowercase(char *p)
-{
-	for (; *p; p++)
-		*p = tolower(*p);
-}
-
 void git_config_push_parameter(const char *text)
 {
 	struct strbuf env = STRBUF_INIT;
@@ -180,7 +174,7 @@ int git_config_parse_parameter(const char *text,
 		strbuf_list_free(pair);
 		return error("bogus config parameter: %s", text);
 	}
-	lowercase(pair[0]->buf);
+	strbuf_tolower(pair[0]);
 	if (fn(pair[0]->buf, pair[1] ? pair[1]->buf : NULL, data) < 0) {
 		strbuf_list_free(pair);
 		return -1;
diff --git a/strbuf.c b/strbuf.c
index 854c725..2d059b9 100644
--- a/strbuf.c
+++ b/strbuf.c
@@ -106,6 +106,13 @@ void strbuf_ltrim(struct strbuf *sb)
 	sb->buf[sb->len] = '\0';
 }
 
+void strbuf_tolower(struct strbuf *sb)
+{
+	char *p = sb->buf, *end = sb->buf + sb->len;
+	for (; p < end; p++)
+		*p = tolower(*p);
+}
+
 struct strbuf **strbuf_split_buf(const char *str, size_t slen,
 				 int terminator, int max)
 {
diff --git a/strbuf.h b/strbuf.h
index 4de7531..25328b9 100644
--- a/strbuf.h
+++ b/strbuf.h
@@ -45,6 +45,7 @@ static inline void strbuf_setlen(struct strbuf *sb, size_t len)
 extern void strbuf_trim(struct strbuf *);
 extern void strbuf_rtrim(struct strbuf *);
 extern void strbuf_ltrim(struct strbuf *);
+extern void strbuf_tolower(struct strbuf *sb);
 extern int strbuf_cmp(const struct strbuf *, const struct strbuf *);
 
 /*
-- 
2.0.0.rc1.436.g03cb729
Previous: Junio C HamanoNext: Kyle J. McKay
Message 9 of 42 in “handle alternate charsets for remote http errors”
  1. 0/9 handle alternate charsets for remote http errorsJeff King, May 21, 2014
  2. 1/9 test-lib: preserve GIT_CURL_VERBOSE from the environmentJeff King, May 21, 2014
  3. 2/9 strbuf: add strbuf_tolower functionJeff King, May 21, 2014
  4. Kyle J. McKayMay 22, 2014
  5. Jeff KingMay 22, 2014
  6. Junio C HamanoMay 22, 2014
  7. Jeff KingMay 22, 2014
  8. Junio C HamanoMay 22, 2014
  9. Jeff KingMay 23, 2014
  10. Kyle J. McKayMay 22, 2014
  11. Jeff KingMay 23, 2014
  12. Kyle J. McKayMay 23, 2014
  13. 3/9 daemon/config: factor out duplicate xstrdup_tolowerJeff King, May 21, 2014
  14. 4/9 http: normalize case of returned content-typeJeff King, May 21, 2014
  15. 5/9 t/lib-httpd: use write_script to copy CGI scriptsJeff King, May 21, 2014
  16. 6/9 t5550: test display of remote http error messagesJeff King, May 21, 2014
  17. 7/9 remote-curl: recognize text/plain with a charset parameterJeff King, May 21, 2014
  18. Kyle J. McKayMay 22, 2014
  19. Jeff KingMay 22, 2014
  20. Kyle J. McKayMay 22, 2014
  21. Jeff KingMay 22, 2014
  22. Peter KreftingMay 22, 2014
  23. Jeff KingMay 22, 2014
  24. Peter KreftingMay 22, 2014
  25. 8/9 strbuf: add strbuf_reencode helperJeff King, May 21, 2014
  26. 9/9 remote-curl: reencode http error messagesJeff King, May 21, 2014
  27. Kyle J. McKayMay 22, 2014
  28. Jeff KingMay 22, 2014
  29. Peter KreftingMay 22, 2014
  30. 0/9 handle alternate charsets for remote http errorsJeff King, May 22, 2014
  31. 1/8 test-lib: preserve GIT_CURL_VERBOSE from the environmentJeff King, May 22, 2014
  32. 2/8 t/lib-httpd: use write_script to copy CGI scriptsJeff King, May 22, 2014
  33. 3/8 t5550: test display of remote http error messagesJeff King, May 22, 2014
  34. 4/8 http: extract type/subtype portion of content-typeJeff King, May 22, 2014
  35. Kyle J. McKayMay 22, 2014
  36. Jeff KingMay 23, 2014
  37. Kyle J. McKayMay 23, 2014
  38. 5/8 http: optionally extract charset parameter from content-typeJeff King, May 22, 2014
  39. 6/8 strbuf: add strbuf_reencode helperJeff King, May 22, 2014
  40. 7/8 remote-curl: reencode http error messagesJeff King, May 22, 2014
  41. 8/8 http: default text charset to iso-8859-1Jeff King, May 22, 2014
  42. brian m. carlsonMay 23, 2014

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.