]> git.saurik.com Git - apt.git/blob - triehash/tests/test-case-insensitive
Merge commit 'e2073b0276226b625897ef475f225bf8f508719e' as 'triehash'
[apt.git] / triehash / tests / test-case-insensitive
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