Last change
on this file since 445 was 444, checked in by coas-nagasima, 4 years ago |
muslのソースコードを追加
|
-
Property svn:eol-style
set to
native
-
Property svn:mime-type
set to
text/x-csrc;charset=UTF-8
|
File size:
1010 bytes
|
Line | |
---|
1 | #include <stdint.h>
|
---|
2 | #include <string.h>
|
---|
3 |
|
---|
4 | static inline uint32_t swapc(uint32_t x, int c)
|
---|
5 | {
|
---|
6 | return c ? (x>>24) | (x>>8&0xff00) | (x<<8&0xff0000) | (x<<24) : x;
|
---|
7 | }
|
---|
8 |
|
---|
9 | const char *__mo_lookup(const void *p, size_t size, const char *s)
|
---|
10 | {
|
---|
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))
|
---|
17 | return 0;
|
---|
18 | o/=4;
|
---|
19 | t/=4;
|
---|
20 | for (;;) {
|
---|
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])
|
---|
24 | return 0;
|
---|
25 | int sign = strcmp(s, (char *)p + os);
|
---|
26 | if (!sign) {
|
---|
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])
|
---|
30 | return 0;
|
---|
31 | return (char *)p + ts;
|
---|
32 | }
|
---|
33 | else if (n == 1) return 0;
|
---|
34 | else if (sign < 0)
|
---|
35 | n /= 2;
|
---|
36 | else {
|
---|
37 | b += n/2;
|
---|
38 | n -= n/2;
|
---|
39 | }
|
---|
40 | }
|
---|
41 | return 0;
|
---|
42 | }
|
---|
Note:
See
TracBrowser
for help on using the repository browser.