* weird strncmp usage?
@ 2006-11-02 1:26 Han-Wen Nienhuys
2006-11-02 1:44 ` Andy Whitcroft
0 siblings, 1 reply; 7+ messages in thread
From: Han-Wen Nienhuys @ 2006-11-02 1:26 UTC (permalink / raw)
To: git
Hi,
the git source seems full of calls similar to
strncmp (x, "constant string", 15)
is there a reason not to use something like
int
strxmp (char const *x, char const *y)
{
return strncmp (x, y, strlen (y));
}
everywhere?
--
Han-Wen Nienhuys - hanwen@xs4all.nl - http://www.xs4all.nl/~hanwen
^ permalink raw reply [flat|nested] 7+ messages in thread
* Re: weird strncmp usage?
2006-11-02 1:26 weird strncmp usage? Han-Wen Nienhuys
@ 2006-11-02 1:44 ` Andy Whitcroft
2006-11-02 6:51 ` Jeff King
` (2 more replies)
0 siblings, 3 replies; 7+ messages in thread
From: Andy Whitcroft @ 2006-11-02 1:44 UTC (permalink / raw)
To: hanwen; +Cc: git
Han-Wen Nienhuys wrote:
>
> Hi,
>
> the git source seems full of calls similar to
>
> strncmp (x, "constant string", 15)
>
> is there a reason not to use something like
>
> int
> strxmp (char const *x, char const *y)
> {
> return strncmp (x, y, strlen (y));
> }
>
> everywhere?
If you are doing these a _lot_ then there is a significant additional
cost to using strlen on a constant string.
That said if you know its constant you can also use sizeof("foo") and
that is done at compile time. Something like:
#define strxcmp(x, y) strncmp((x), (y), sizeof((y))
-apw
^ permalink raw reply [flat|nested] 7+ messages in thread
* Re: weird strncmp usage?
2006-11-02 1:44 ` Andy Whitcroft
@ 2006-11-02 6:51 ` Jeff King
2006-11-02 9:15 ` Johannes Schindelin
2006-11-02 11:04 ` Petr Baudis
2006-11-03 21:05 ` Florian Weimer
2 siblings, 1 reply; 7+ messages in thread
From: Jeff King @ 2006-11-02 6:51 UTC (permalink / raw)
To: Andy Whitcroft; +Cc: hanwen, git
On Thu, Nov 02, 2006 at 01:44:36AM +0000, Andy Whitcroft wrote:
> That said if you know its constant you can also use sizeof("foo") and
> that is done at compile time. Something like:
>
> #define strxcmp(x, y) strncmp((x), (y), sizeof((y))
You would, of course, need to use sizeof(y)-1 to avoid comparing the NUL
termination. :)
This is a slightly dangerous macro, because it _only_ works for string
literals, but not pointers (which is fine in this case, but its
limitations need to be documented).
^ permalink raw reply [flat|nested] 7+ messages in thread
* Re: weird strncmp usage?
2006-11-02 6:51 ` Jeff King
@ 2006-11-02 9:15 ` Johannes Schindelin
2006-11-02 9:59 ` Han-Wen Nienhuys
0 siblings, 1 reply; 7+ messages in thread
From: Johannes Schindelin @ 2006-11-02 9:15 UTC (permalink / raw)
To: Jeff King; +Cc: Andy Whitcroft, hanwen, git
Hi,
On Thu, 2 Nov 2006, Jeff King wrote:
> On Thu, Nov 02, 2006 at 01:44:36AM +0000, Andy Whitcroft wrote:
>
> > That said if you know its constant you can also use sizeof("foo") and
> > that is done at compile time. Something like:
> >
> > #define strxcmp(x, y) strncmp((x), (y), sizeof((y))
>
> You would, of course, need to use sizeof(y)-1 to avoid comparing the NUL
> termination. :)
>
> This is a slightly dangerous macro, because it _only_ works for string
> literals, but not pointers (which is fine in this case, but its
> limitations need to be documented).
It would be even better to avoid these errors by doing something like
#define starts_with(x, y) !strncmp((x), #y, sizeof(#y) - 1)
which would be used like this:
if (starts_with(arg, --abbrev=))
However, in this case, you would need another macro, which automatically
extracts the argument, and soon you will end up with yet another getopt
package.
Ciao,
Dscho
^ permalink raw reply [flat|nested] 7+ messages in thread
* Re: weird strncmp usage?
2006-11-02 9:15 ` Johannes Schindelin
@ 2006-11-02 9:59 ` Han-Wen Nienhuys
0 siblings, 0 replies; 7+ messages in thread
From: Han-Wen Nienhuys @ 2006-11-02 9:59 UTC (permalink / raw)
To: Johannes Schindelin; +Cc: Andy Whitcroft, git
Johannes Schindelin escreveu:
> However, in this case, you would need another macro, which automatically
> extracts the argument, and soon you will end up with yet another getopt
> package.
It puzzles me that git doesn't use getopt. Git is rare in not accepting
--option arg
but only
--option=arg
Also, -abc doesn't seem to work for combining options.
--
^ permalink raw reply [flat|nested] 7+ messages in thread
* Re: weird strncmp usage?
2006-11-02 1:44 ` Andy Whitcroft
2006-11-02 6:51 ` Jeff King
@ 2006-11-02 11:04 ` Petr Baudis
2006-11-03 21:05 ` Florian Weimer
2 siblings, 0 replies; 7+ messages in thread
From: Petr Baudis @ 2006-11-02 11:04 UTC (permalink / raw)
To: Andy Whitcroft; +Cc: hanwen, git
Dear diary, on Thu, Nov 02, 2006 at 02:44:36AM CET, I got a letter
where Andy Whitcroft <apw@shadowen.org> said that...
> Han-Wen Nienhuys wrote:
> >
> > Hi,
> >
> > the git source seems full of calls similar to
> >
> > strncmp (x, "constant string", 15)
> >
> > is there a reason not to use something like
> >
> > int
> > strxmp (char const *x, char const *y)
> > {
> > return strncmp (x, y, strlen (y));
> > }
> >
> > everywhere?
>
> If you are doing these a _lot_ then there is a significant additional
> cost to using strlen on a constant string.
>
> That said if you know its constant you can also use sizeof("foo") and
> that is done at compile time. Something like:
>
> #define strxcmp(x, y) strncmp((x), (y), sizeof((y))
At least in the #define, reasonable compilers should optimize out
strlen("foo"). Hopefully as well if you would make strxmp() inlinable
though I'm not so sure there.
--
Petr "Pasky" Baudis
Stuff: http://pasky.or.cz/
#!/bin/perl -sp0777i<X+d*lMLa^*lN%0]dsXx++lMlN/dsM0<j]dsj
$/=unpack('H*',$_);$_=`echo 16dio\U$k"SK$/SM$n\EsN0p[lN*1
^ permalink raw reply [flat|nested] 7+ messages in thread
* Re: weird strncmp usage?
2006-11-02 1:44 ` Andy Whitcroft
2006-11-02 6:51 ` Jeff King
2006-11-02 11:04 ` Petr Baudis
@ 2006-11-03 21:05 ` Florian Weimer
2 siblings, 0 replies; 7+ messages in thread
From: Florian Weimer @ 2006-11-03 21:05 UTC (permalink / raw)
To: git
* Andy Whitcroft:
> If you are doing these a _lot_ then there is a significant additional
> cost to using strlen on a constant string.
strlen has been a GCC builtin for quite some time. If the wrapper
function is inlined, GCC will optimize it away. (It also turns the
^ permalink raw reply [flat|nested] 7+ messages in thread
end of thread, other threads:[~2006-11-03 21:05 UTC | newest]
Thread overview: 7+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2006-11-02 1:26 weird strncmp usage? Han-Wen Nienhuys
2006-11-02 1:44 ` Andy Whitcroft
2006-11-02 6:51 ` Jeff King
2006-11-02 9:15 ` Johannes Schindelin
2006-11-02 9:59 ` Han-Wen Nienhuys
2006-11-02 11:04 ` Petr Baudis
2006-11-03 21:05 ` Florian Weimer
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).