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

Re: [PATCH v2 1/3] add strnncmp() function

From
Jeremiah Mahler <jmmahler@gmail.com>
Date
Jun 17, 2014, 19:27 UTC
Message-ID
<20140617192727.GB23557@hudson.localdomain>
In-Reply-To
<xmqqd2e7mneh.fsf@gitster.dls.corp.google.com>
Junio,
On Tue, Jun 17, 2014 at 10:55:18AM -0700, Junio C Hamano wrote:
Show 60 quoted lines
> Jeremiah Mahler <jmmahler@gmail.com> writes:
> 
> > Add a strnncmp() function which behaves like strncmp() except it takes
> > the length of both strings instead of just one.  It behaves the same as
> > strncmp() up to the minimum common length between the strings.  When the
> > strings are identical up to this minimum common length, the length
> > difference is returned.
> >
> > Signed-off-by: Jeremiah Mahler <jmmahler@gmail.com>
> > ---
> >  strbuf.c | 9 +++++++++
> >  strbuf.h | 2 ++
> >  2 files changed, 11 insertions(+)
> >
> > diff --git a/strbuf.c b/strbuf.c
> > index ac62982..4eb7954 100644
> > --- a/strbuf.c
> > +++ b/strbuf.c
> > @@ -600,3 +600,12 @@ char *xstrdup_tolower(const char *string)
> >  	result[i] = '\0';
> >  	return result;
> >  }
> > +
> > +int strnncmp(const char *a, int len_a, const char *b, int len_b)
> > +{
> > +	int min_len = (len_a < len_b) ? len_a : len_b;
> > +	int cmp = strncmp(a, b, min_len);
> > +	if (cmp)
> > +		return cmp;
> > +	return (len_a - len_b);
> > +}
> 
> I am not sure if the interface into this function conceptually makes
> much sense.  strncmp(entry, string, 14) was invented as the way to
> see if a NUL terminated "string" matches with the contents in an
> array of char "entry" that is up to 14 bytes long, and because the
> "entry" was allowed to fill full 14-byte space without terminated
> with a NUL, the maximum possible length is specified separately, but
> a NUL termination in "entry", if exists, is still honored.  Is there
> any case where such a pair of "maximum N bytes but could be shorter"
> strings are compared, especially with different N's defined per
> string, in our codebase (or in other people's project for that
> matter)?
> 
> Further, I do think that the interface into this function and its
> implementation are inappropriate for implementing the name_compare()
> function in tree-walk.c and unpack-trees.c.  These functions are
> designed to take counted strings; in a tuple <a, a_len> they take,
> "a_len" is the only thing that determines the length of string "a".
> There is no room for a NUL termination inside "a" come into play to
> make "a" shorter than "a_len".
> 
> In other words, "Two NUL-terminated strings can be compared with
> strcmp(a, b), but we use counted strings in many places in our
> codebase, and compare_counted_strings(a, a_len, b, b_len) function
> would help us, so let's add one and use it in name_compare()" may
> make good sense, but if we were to do so, I do not think strncmp()
> would be involved in its implementation.
> 
> 

The concept of a counted string clears up some of the confusion I was having. Thanks for that explanation.

-- 
Jeremiah Mahler
jmmahler@gmail.com
http://github.com/jmahler
Previous: Junio C HamanoNext: Jeremiah Mahler
Message 8 of 15 in “add strnncmp() function”
  1. 0/3 add strnncmp() functionJeremiah Mahler, Jun 17, 2014
  2. 1/3 add strnncmp() functionJeremiah Mahler, Jun 17, 2014
  3. Torsten BögershausenJun 17, 2014
  4. Jeremiah MahlerJun 17, 2014
  5. Erik Faye-LundJun 17, 2014
  6. Jeremiah MahlerJun 17, 2014
  7. Junio C HamanoJun 17, 2014
  8. Jeremiah MahlerJun 17, 2014
  9. 2/3 tree-walk: simplify via strnncmp()Jeremiah Mahler, Jun 17, 2014
  10. 3/3 unpack-trees: simplify via strnncmp()Jeremiah Mahler, Jun 17, 2014
  11. Torsten BögershausenJun 17, 2014
  12. Jeremiah MahlerJun 17, 2014
  13. Jonathan NiederJun 17, 2014
  14. Jeremiah MahlerJun 17, 2014
  15. Ondřej BílkaJun 18, 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.