4 static inline uint32_t swapc(uint32_t x
, int c
)
6 return c
? x
>>24 | x
>>8&0xff00 | x
<<8&0xff0000 | x
<<24 : x
;
9 const char *__mo_lookup(const void *p
, size_t size
, const char *s
)
11 const uint32_t *mo
= p
;
12 int sw
= *mo
- 0x950412de;
13 uint32_t b
= 0, n
= swapc(mo
[2], sw
);
14 uint32_t o
= swapc(mo
[3], sw
);
15 uint32_t t
= swapc(mo
[4], sw
);
16 if (n
>=size
/4 || o
>=size
-4*n
|| t
>=size
-4*n
|| ((o
|t
)%4))
21 uint32_t ol
= swapc(mo
[o
+2*(b
+n
/2)], sw
);
22 uint32_t os
= swapc(mo
[o
+2*(b
+n
/2)+1], sw
);
23 if (os
>= size
|| ol
>= size
-os
|| ((char *)p
)[os
+ol
])
25 int sign
= strcmp(s
, (char *)p
+ os
);
27 uint32_t tl
= swapc(mo
[t
+2*(b
+n
/2)], sw
);
28 uint32_t ts
= swapc(mo
[t
+2*(b
+n
/2)+1], sw
);
29 if (ts
>= size
|| tl
>= size
-ts
|| ((char *)p
)[ts
+tl
])
31 return (char *)p
+ ts
;
33 else if (n
== 1) return 0;