]>
Commit | Line | Data |
---|---|---|
e2073b02 JAK |
1 | #!/bin/sh |
2 | . $(dirname $(readlink -f $0))/framework.sh | |
3 | ||
4 | WORDS="Halllo\nH-lllo\nHalll1" | |
5 | ||
6 | # Case-insensitive test | |
7 | testsuccessequal "#include \"/dev/null\" | |
8 | #ifdef __GNUC__ | |
9 | typedef uint16_t __attribute__((aligned (1))) triehash_uu16; | |
10 | typedef char static_assert16[__alignof__(triehash_uu16) == 1 ? 1 : -1]; | |
11 | typedef uint32_t __attribute__((aligned (1))) triehash_uu32; | |
12 | typedef char static_assert32[__alignof__(triehash_uu32) == 1 ? 1 : -1]; | |
13 | typedef uint64_t __attribute__((aligned (1))) triehash_uu64; | |
14 | typedef char static_assert64[__alignof__(triehash_uu64) == 1 ? 1 : -1]; | |
15 | #if __BYTE_ORDER__ == __ORDER_LITTLE_ENDIAN__ | |
16 | #define onechar(c, s, l) (((uint64_t)(c)) << (s)) | |
17 | #else | |
18 | #define onechar(c, s, l) (((uint64_t)(c)) << (l-8-s)) | |
19 | #endif | |
20 | #if (!defined(__ARM_ARCH) || defined(__ARM_FEATURE_UNALIGNED)) && !defined(TRIE_HASH_NO_MULTI_BYTE) | |
21 | #define TRIE_HASH_MULTI_BYTE | |
22 | #endif | |
23 | #endif /*GNUC */ | |
24 | #ifdef TRIE_HASH_MULTI_BYTE | |
25 | static enum PerfectKey PerfectHash6(const char *string) | |
26 | { | |
27 | switch(string[0] | 0x20) { | |
28 | case 0| onechar('h', 0, 8): | |
29 | switch(string[1]) { | |
30 | case 0| onechar('-', 0, 8): | |
31 | switch(*((triehash_uu32*) &string[2]) | 0x20202020) { | |
32 | case 0| onechar('l', 0, 32)| onechar('l', 8, 32)| onechar('l', 16, 32)| onechar('o', 24, 32): | |
33 | return H_lllo; | |
34 | } | |
35 | break; | |
36 | case 0| onechar('a', 0, 8): | |
37 | case 0| onechar('A', 0, 8): | |
38 | switch(*((triehash_uu16*) &string[2]) | 0x2020) { | |
39 | case 0| onechar('l', 0, 16)| onechar('l', 8, 16): | |
40 | switch(string[4] | 0x20) { | |
41 | case 0| onechar('l', 0, 8): | |
42 | switch(string[5]) { | |
43 | case 0| onechar('1', 0, 8): | |
44 | return Halll1; | |
45 | break; | |
46 | case 0| onechar('o', 0, 8): | |
47 | case 0| onechar('O', 0, 8): | |
48 | return Halllo; | |
49 | } | |
50 | } | |
51 | } | |
52 | } | |
53 | } | |
54 | return Unknown; | |
55 | } | |
56 | #else | |
57 | static enum PerfectKey PerfectHash6(const char *string) | |
58 | { | |
59 | switch(string[0] | 0x20) { | |
60 | case 'h': | |
61 | switch(string[1]) { | |
62 | case '-': | |
63 | switch(string[2] | 0x20) { | |
64 | case 'l': | |
65 | switch(string[3] | 0x20) { | |
66 | case 'l': | |
67 | switch(string[4] | 0x20) { | |
68 | case 'l': | |
69 | switch(string[5] | 0x20) { | |
70 | case 'o': | |
71 | return H_lllo; | |
72 | } | |
73 | } | |
74 | } | |
75 | } | |
76 | break; | |
77 | case 'a': | |
78 | case 'A': | |
79 | switch(string[2] | 0x20) { | |
80 | case 'l': | |
81 | switch(string[3] | 0x20) { | |
82 | case 'l': | |
83 | switch(string[4] | 0x20) { | |
84 | case 'l': | |
85 | switch(string[5]) { | |
86 | case '1': | |
87 | return Halll1; | |
88 | break; | |
89 | case 'o': | |
90 | case 'O': | |
91 | return Halllo; | |
92 | } | |
93 | } | |
94 | } | |
95 | } | |
96 | } | |
97 | } | |
98 | return Unknown; | |
99 | } | |
100 | #endif /* TRIE_HASH_MULTI_BYTE */ | |
101 | enum PerfectKey PerfectHash(const char *string, size_t length) | |
102 | { | |
103 | switch (length) { | |
104 | case 6: | |
105 | return PerfectHash6(string); | |
106 | default: | |
107 | return Unknown; | |
108 | } | |
109 | }" triehash --multi-byte=3210 --ignore-case -H /dev/null /dev/stdin |