For reasons I completely disagree with but "The Powers (of Anti-Usability) That Be" continue to decree despite my objections, I have a sorting routine which does basic strcmp() compares to sort by its name. It works great; it's hard to get that one wrong. However, at the 11th hour, it's been decided that entries which begin with a number should come AFTER entries which begin with a letter, contrary to the ASCII ordering. They cite the EBCDIC standard has numbers following letters so the prior assumption isn't a universal truth, and I have no power to win this argument... but I digress.
Therein lies my problem. I've replaced all appropriate references to strcmp with a new function call nonstd_strcmp, and now need to implement the modifications to accomplish the sort change. I've used a FreeBSD source as my base: http://freebsd.active-venture.com/FreeBSD-srctree/newsrc/libkern/strncmp.c.html
if (n == 0)
return (0);
do {
if (*s1 != *s2++)
return (*(const unsigned char *)s1 -
*(const unsigned char *)(s2 - 1));
if (*s1++ == 0)
break;
} while (--n != 0);
return (0);
I guess I might need to take some time away to really think about how it should be done, but I'm sure I'm not the only one who's experienced the brain-deadness of just-before-release spec changes.
What you need to do is create an ordering table for each character. This is also the easiest way to do case-insensitive comparisons as well.
if (order_table[*s1] != order_table[*s2++])
Be aware that characters might be signed, in which case the index to your table might go negative. This code is for signed chars only:
int raw_order_table[256];
int * order_table = raw_order_table + 128;
for (int i = -128; i < 128; ++i)
order_table[i] = (i >= '0' && i <= '9') ? i + 256 : toupper(i);
If your powers-that-be are like all the other powers-that-be that I've run into, you may want to make it an option (even if it's hidden):
Sort Order:
o Numbers after Letters
o Letters after Numbers
or even worse, they might figure out that they want Numbers to be sorted numerically (e.g. "A123" comes after "A15"), then it can be
o Numbers after Letters
o Letters after Numbers
o Smart Numbers after Letters
o Letters after Smart Numbers
This gets into diagnosing the real problem, not the symptom. I bet there's a slight chance they may change their mind at the 11th hour and 59th minute.
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With