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