Cliff Woolley wrote:
On Sat, 17 Nov 2001, Brian Pane wrote:
This patch adds a cache to each element in an apr_table_t.
The cache consists of a 32-bit int containing the first 4 bytes
of the element's key, converted to uppercase.
How about something like this:
#ifndef EBCDIC
#define CASE_MASK 0xdfdfdfdf
#else
#define CASE_MASK 0x0 /* whatever this is supposed to be */
#endif
#define COMPUTE_KEY_PREFIX(key, prefix) \
{ \
if (key[0] && key[1] && key[2] && key[3]) { \
prefix = (*((int *)(key))) & CASE_MASK; \
} \
else { \
prefix = 0; \
} \
The only problem with this is that the bytes in the integer end up
"backwards" on little-endian machines. That means that, while you
can check for equality on the prefix, you can't do greater-than/less-than
comparisons.
I used the more complicated, shift-based approach because it
guarantees that greater-than/less-than comparisons on the prefix
will yield the same results as strcasecmp on the first 4 bytes.
This makes it possible to use the prefix in the comparator
function in the big qsort in apr_table_overlap, which does
a *lot* of strcasecmp calls otherwise.
--Brian