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