On Mon, Mar 26, 2012 at 9:29 PM, Richard Gribble  wrote:
> Using rcs 5.8-1:
>
> Synopsis:
>    Given two mark symbols, abc (version 1.1) and abcd (version 1.2),
>    executing "co -rabc <file>" will check out version 1.2, when it
>    should check out version 1.1.
>
> I set the mark symbols as follows:
>    rcs -nabc:1.1 -nabcd:1.2 <file>
>
>
> I dug into it, and found the following (rcsrev.c):
>
> 01:  static char const *
> 02:  rev_from_symbol (struct cbuf const *id)
> 03:  /* Look up "id" in the list of symbolic names starting with pointer
> 04:     "GROK (symbols)", and return a pointer to the corresponding
> 05:     revision number.  Return NULL if not present.  */
> 06:  {
> 07:    for (struct link *ls = GROK (symbols); ls; ls = ls->next)
> 08:      {
> 09:        struct symdef const *d = ls->entry;
> 10:
> 11:        if (!strncmp (d->meaningful, id->string, id->size))
> 12:          return d->underlying;
> 13:      }
> 14:    return NULL;
> 15:  }
>
> Note that line 11 tests the name of the requested mark symbol
> (id->string) against each element of a linked-list (ls) containing all
> the mark symbols for the file.  The problem is that it will only test
> the first 'id->size' characters - so R25 (from the command line) matches
> R25a (from the list) because the first three characters match and it
> won't test any more than that (strncmp).
>
> I recommend modifying line 11 as follows:
>    if ((strlen(d->meaningful) == strlen(id->size)) && !strncmp
> (d->meaningful, id->string, id->size))

I think strlen(id->size) is overkill :)

If both strings (d->meaningful and id->string) are NULL-terminated ,
then a simple call to strlen would do the job:

if (!strcmp(d->meaningful, id->string))

It would do the right thing w.r.t. different lengths.

> Of course, since you now know that the two strings are the same size,
> you could use strcmp - but that assumes that the && short-circuits, and
> I don't know if that's guaranteed.

Yes, it required by the C standard.

Csaba
-- 
GCS a+ e++ d- C++ ULS$ L+$ !E- W++ P+++$ w++$ tv+ b++ DI D++ 5++
The Tao of math: The numbers you can count are not the real numbers.
Life is complex, with real and imaginary parts.
"Ok, it boots. Which means it must be bug-free and perfect. " -- Linus Torvalds
"People disagree with me. I just ignore them." -- Linus Torvalds

--
Problem reports:       http://cygwin.com/problems.html
FAQ:                   http://cygwin.com/faq/
Documentation:         http://cygwin.com/docs.html
Unsubscribe info:      http://cygwin.com/ml/#unsubscribe-simple

Reply via email to