X-Recipient: archive-cygwin AT delorie DOT com X-SWARE-Spam-Status: No, hits=-2.2 required=5.0 tests=AWL,BAYES_00,DKIM_SIGNED,DKIM_VALID,DKIM_VALID_AU,FREEMAIL_FROM,RCVD_IN_DNSWL_LOW,TW_YM X-Spam-Check-By: sourceware.org MIME-Version: 1.0 In-Reply-To: References: Date: Tue, 27 Mar 2012 09:37:54 +0200 Message-ID: Subject: Re: rcs 5.8-1 checks out wrong version of file when using similar mark symbols From: Csaba Raduly To: cygwin AT cygwin DOT com Content-Type: text/plain; charset=ISO-8859-1 Mailing-List: contact cygwin-help AT cygwin DOT com; run by ezmlm Precedence: bulk List-Id: List-Unsubscribe: List-Subscribe: List-Archive: List-Post: List-Help: , Sender: cygwin-owner AT cygwin DOT com Mail-Followup-To: cygwin AT cygwin DOT com Delivered-To: mailing list cygwin AT cygwin DOT com Content-Transfer-Encoding: 8bit X-MIME-Autoconverted: from quoted-printable to 8bit by delorie.com id q2R7cMUt010195 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 " 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 > > > 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