On Sun, 17 Feb 2013 13:39:44 -0500 Rich Felker wrote: > > Hey, sorry it's taken me so long to get to reading and reviewing this > well. Here are some comments, mostly stylistic, but one's about a > corner-case bug. See below. With that said, the algorithm looks right > to me, and I think we can commit soon. > > Rich All the comments seem like improvements to me. Attached is a revised version. > > + while (*l && *r && l[0]==r[0]){ > > I used to do a lot of while loops like this, but now I feel like it > makes it hard to follow the end-of-string logic -- a lot more code > runs after the null terminator is hit, and it's nontrivial to follow > through it all and make sure the right thing happens, as the > subsequent code after the loop is now handling two very-distinct > loop-exit conditions: > > 1. Loop exited due to mismatch. > 2. Loop exited due to hitting end-of-string with no mismatch. > > What about instead doing something like this: > > while (*l==*r) { > if (!*l) return 0; > /* ... */ > > That way, the "equal strings" case is trivially correct. It also might > generate better code. OK. > Note that I also made a couple stylistic changes here; unless you > object, I prefer *p to p[0] when p is just being used as a moving > pointer within a string, always accessed with offset 0. It's just more > concise/less cluttered and avoids suggesting it's used as a string in > itself. Also added a space before the open brace, for consistency with > style elsewhere. > > + if ((isdigit(l[0]) && isdigit(r[0]) ) && haszero) { > > + int lenl=0, lenr=0, firstl=l[0], firstr=r[0]; > > These variables have the wrong types. int is not sufficient to store a > character count in a string. You need size_t. > > > + while (isdigit(l++[0]) ) { > > + lenl++; > > + } > > + while (isdigit(r++[0]) ) { > > + lenr++; > > + } > > + if (lenl==lenr) { > > + return (firstl - firstr); > > + } else { > > + return (lenl - lenr); > > + } > > I see what's going on here, but I find saving the first mismatching > characters (btw, you could have just saved the difference) then > continuing to advance the l/r pointers a bit confusing at first. Why > not instead do: > > while (isdigit(l[lenl])) lenl++; That would be clearer and more efficient. -- Isaac Dunham