| OLD | NEW |
| 1 #include <stdint.h> | 1 #include <stdint.h> |
| 2 #include <string.h> | 2 #include <string.h> |
| 3 | 3 |
| 4 static inline uint32_t swapc(uint32_t x, int c) | 4 static inline uint32_t swapc(uint32_t x, int c) { |
| 5 { | 5 return c ? x >> 24 | ((x >> 8) & 0xff00) | ((x << 8) & 0xff0000) | x << 24 |
| 6 » return c ? x>>24 | ((x>>8)&0xff00) | ((x<<8)&0xff0000) | x<<24 : x; | 6 : x; |
| 7 } | 7 } |
| 8 | 8 |
| 9 const char *__mo_lookup(const void *p, size_t size, const char *s) | 9 const char* __mo_lookup(const void* p, size_t size, const char* s) { |
| 10 { | 10 const uint32_t* mo = p; |
| 11 » const uint32_t *mo = p; | 11 int sw = *mo - 0x950412de; |
| 12 » int sw = *mo - 0x950412de; | 12 uint32_t b = 0, n = swapc(mo[2], sw); |
| 13 » uint32_t b = 0, n = swapc(mo[2], sw); | 13 uint32_t o = swapc(mo[3], sw); |
| 14 » uint32_t o = swapc(mo[3], sw); | 14 uint32_t t = swapc(mo[4], sw); |
| 15 » uint32_t t = swapc(mo[4], sw); | 15 if (n >= size / 4 || o >= size - 4 * n || t >= size - 4 * n || ((o | t) % 4)) |
| 16 » if (n>=size/4 || o>=size-4*n || t>=size-4*n || ((o|t)%4)) | 16 return 0; |
| 17 » » return 0; | 17 o /= 4; |
| 18 » o/=4; | 18 t /= 4; |
| 19 » t/=4; | 19 for (;;) { |
| 20 » for (;;) { | 20 uint32_t ol = swapc(mo[o + 2 * (b + n / 2)], sw); |
| 21 » » uint32_t ol = swapc(mo[o+2*(b+n/2)], sw); | 21 uint32_t os = swapc(mo[o + 2 * (b + n / 2) + 1], sw); |
| 22 » » uint32_t os = swapc(mo[o+2*(b+n/2)+1], sw); | 22 if (os >= size || ol >= size - os || ((char*)p)[os + ol]) |
| 23 » » if (os >= size || ol >= size-os || ((char *)p)[os+ol]) | 23 return 0; |
| 24 » » » return 0; | 24 int sign = strcmp(s, (char*)p + os); |
| 25 » » int sign = strcmp(s, (char *)p + os); | 25 if (!sign) { |
| 26 » » if (!sign) { | 26 uint32_t tl = swapc(mo[t + 2 * (b + n / 2)], sw); |
| 27 » » » uint32_t tl = swapc(mo[t+2*(b+n/2)], sw); | 27 uint32_t ts = swapc(mo[t + 2 * (b + n / 2) + 1], sw); |
| 28 » » » uint32_t ts = swapc(mo[t+2*(b+n/2)+1], sw); | 28 if (ts >= size || tl >= size - ts || ((char*)p)[ts + tl]) |
| 29 » » » if (ts >= size || tl >= size-ts || ((char *)p)[ts+tl]) | 29 return 0; |
| 30 » » » » return 0; | 30 return (char*)p + ts; |
| 31 » » » return (char *)p + ts; | 31 } else if (n == 1) |
| 32 » » } | 32 return 0; |
| 33 » » else if (n == 1) return 0; | 33 else if (sign < 0) |
| 34 » » else if (sign < 0) | 34 n /= 2; |
| 35 » » » n /= 2; | 35 else { |
| 36 » » else { | 36 b += n / 2; |
| 37 » » » b += n/2; | 37 n -= n / 2; |
| 38 » » » n -= n/2; | 38 } |
| 39 » » } | 39 } |
| 40 » } | 40 return 0; |
| 41 » return 0; | |
| 42 } | 41 } |
| OLD | NEW |