rem: return memcmp(a.cc(), b.cc(), a.length());
add: return memcmp(a.c_str(), b.c_str(), a.length());
context: click_strcmp(PermString a, PermString b){    const char *ad = a.cc(), *ae = a.cc() + a.length();    const char *bd = b.cc(), *be = b.cc() + b.length();        while (ad < ae && bd < be) {	if (isdigit(*ad) && isdigit(*bd)) {	    // compare the two numbers, but don't treat them as numbers in	    // case of overflow	    // first, skip initial '0's	    const char *iad = ad, *ibd = bd;	    while (ad < ae && *ad == '0')		ad++;	    while (bd < be && *bd == '0')		bd++;	    int longer_zeros = (ad - iad) - (bd - ibd);	    // skip to end of number	    const char *nad = ad, *nbd = bd;	    while (ad < ae && isdigit(*ad))		ad++;	    while (bd < be && isdigit(*bd))		bd++;	    // longer number must be larger	    if ((ad - nad) != (bd - nbd))		return (ad - nad) - (bd - nbd);	    // otherwise, compare numbers with the same length	    for (; nad < ad && nbd < bd; nad++, nbd++)		if (*nad != *nbd)		    return *nad - *nbd;	    // finally, longer string of initial '0's wins	    if (longer_zeros != 0)		return longer_zeros;	} else if (isdigit(*ad))	    return (isalpha(*bd) ? -1 : 1);	else if (isdigit(*bd))	    return (isalpha(*ad) ? 1 : -1);	else {	    int d = tolower(*ad) - tolower(*bd);	    if (d != 0)		return d;	    ad++;	    bd++;	}    }    if ((ae - ad) != (be - bd))	return (ae - ad) - (be - bd);    else {	assert(a.length() == b.length());	return memcmp(a.cc(), b.cc(), a.length());    }}