static unsigned get8(const char *b0) { const unsigned char *b = (const void *)b0; return b[0]; } static unsigned get16(const char *b0) { const unsigned char *b = (const void *)b0; return (b[0]<<8) | b[1]; } static unsigned get32(const char *b0) { const unsigned char *b = (const void *)b0; return (b[0]<<24) | (b[1]<<16) | (b[2]<<8) | b[3]; } const char *lookup(const char *ld, int key) { unsigned shift, scale, len, val, x, k = key; do { k -= get32(ld); shift = ld[4]; scale = ld[5]; //if (shift > 31 || scale > 2) return 0; //len = (get16(ld+6)+1) << scale; len = get16(ld+6); x = (k>>shift) << scale; k &= (1U<= len) return 0; ld += 8; for (int i=val=0; i<(1U<