xref: /aosp_15_r20/external/libxml2/include/private/dict.h (revision 7c5688314b92172186c154356a6374bf7684c3ca)
1*7c568831SAndroid Build Coastguard Worker #ifndef XML_DICT_H_PRIVATE__
2*7c568831SAndroid Build Coastguard Worker #define XML_DICT_H_PRIVATE__
3*7c568831SAndroid Build Coastguard Worker 
4*7c568831SAndroid Build Coastguard Worker #include <libxml/dict.h>
5*7c568831SAndroid Build Coastguard Worker 
6*7c568831SAndroid Build Coastguard Worker /*
7*7c568831SAndroid Build Coastguard Worker  * Values are ANDed with 0xFFFFFFFF to support platforms where
8*7c568831SAndroid Build Coastguard Worker  * unsigned is larger than 32 bits. With 32-bit unsigned values,
9*7c568831SAndroid Build Coastguard Worker  * modern compilers should optimize the operation away.
10*7c568831SAndroid Build Coastguard Worker  */
11*7c568831SAndroid Build Coastguard Worker 
12*7c568831SAndroid Build Coastguard Worker #define HASH_ROL(x,n) ((x) << (n) | ((x) & 0xFFFFFFFF) >> (32 - (n)))
13*7c568831SAndroid Build Coastguard Worker #define HASH_ROR(x,n) (((x) & 0xFFFFFFFF) >> (n) | (x) << (32 - (n)))
14*7c568831SAndroid Build Coastguard Worker 
15*7c568831SAndroid Build Coastguard Worker /*
16*7c568831SAndroid Build Coastguard Worker  * GoodOAAT: One of a smallest non-multiplicative One-At-a-Time functions
17*7c568831SAndroid Build Coastguard Worker  * that passes SMHasher.
18*7c568831SAndroid Build Coastguard Worker  *
19*7c568831SAndroid Build Coastguard Worker  * Author: Sokolov Yura aka funny-falcon
20*7c568831SAndroid Build Coastguard Worker  */
21*7c568831SAndroid Build Coastguard Worker 
22*7c568831SAndroid Build Coastguard Worker #define HASH_INIT(h1, h2, seed) \
23*7c568831SAndroid Build Coastguard Worker     do { \
24*7c568831SAndroid Build Coastguard Worker         h1 = seed ^ 0x3b00; \
25*7c568831SAndroid Build Coastguard Worker         h2 = HASH_ROL(seed, 15); \
26*7c568831SAndroid Build Coastguard Worker     } while (0)
27*7c568831SAndroid Build Coastguard Worker 
28*7c568831SAndroid Build Coastguard Worker #define HASH_UPDATE(h1, h2, ch) \
29*7c568831SAndroid Build Coastguard Worker     do { \
30*7c568831SAndroid Build Coastguard Worker         h1 += ch; \
31*7c568831SAndroid Build Coastguard Worker         h1 += h1 << 3; \
32*7c568831SAndroid Build Coastguard Worker         h2 += h1; \
33*7c568831SAndroid Build Coastguard Worker         h2 = HASH_ROL(h2, 7); \
34*7c568831SAndroid Build Coastguard Worker         h2 += h2 << 2; \
35*7c568831SAndroid Build Coastguard Worker     } while (0)
36*7c568831SAndroid Build Coastguard Worker 
37*7c568831SAndroid Build Coastguard Worker /* Result is in h2 */
38*7c568831SAndroid Build Coastguard Worker #define HASH_FINISH(h1, h2) \
39*7c568831SAndroid Build Coastguard Worker     do { \
40*7c568831SAndroid Build Coastguard Worker         h1 ^= h2; \
41*7c568831SAndroid Build Coastguard Worker         h1 += HASH_ROL(h2, 14); \
42*7c568831SAndroid Build Coastguard Worker         h2 ^= h1; h2 += HASH_ROR(h1, 6); \
43*7c568831SAndroid Build Coastguard Worker         h1 ^= h2; h1 += HASH_ROL(h2, 5); \
44*7c568831SAndroid Build Coastguard Worker         h2 ^= h1; h2 += HASH_ROR(h1, 8); \
45*7c568831SAndroid Build Coastguard Worker         h2 &= 0xFFFFFFFF; \
46*7c568831SAndroid Build Coastguard Worker     } while (0)
47*7c568831SAndroid Build Coastguard Worker 
48*7c568831SAndroid Build Coastguard Worker typedef struct {
49*7c568831SAndroid Build Coastguard Worker     unsigned hashValue;
50*7c568831SAndroid Build Coastguard Worker     const xmlChar *name;
51*7c568831SAndroid Build Coastguard Worker } xmlHashedString;
52*7c568831SAndroid Build Coastguard Worker 
53*7c568831SAndroid Build Coastguard Worker XML_HIDDEN void
54*7c568831SAndroid Build Coastguard Worker xmlInitDictInternal(void);
55*7c568831SAndroid Build Coastguard Worker XML_HIDDEN void
56*7c568831SAndroid Build Coastguard Worker xmlCleanupDictInternal(void);
57*7c568831SAndroid Build Coastguard Worker 
58*7c568831SAndroid Build Coastguard Worker XML_HIDDEN unsigned
59*7c568831SAndroid Build Coastguard Worker xmlDictComputeHash(const xmlDict *dict, const xmlChar *string);
60*7c568831SAndroid Build Coastguard Worker XML_HIDDEN unsigned
61*7c568831SAndroid Build Coastguard Worker xmlDictCombineHash(unsigned v1, unsigned v2);
62*7c568831SAndroid Build Coastguard Worker XML_HIDDEN xmlHashedString
63*7c568831SAndroid Build Coastguard Worker xmlDictLookupHashed(xmlDictPtr dict, const xmlChar *name, int len);
64*7c568831SAndroid Build Coastguard Worker 
65*7c568831SAndroid Build Coastguard Worker XML_HIDDEN void
66*7c568831SAndroid Build Coastguard Worker xmlInitRandom(void);
67*7c568831SAndroid Build Coastguard Worker XML_HIDDEN void
68*7c568831SAndroid Build Coastguard Worker xmlCleanupRandom(void);
69*7c568831SAndroid Build Coastguard Worker XML_HIDDEN unsigned
70*7c568831SAndroid Build Coastguard Worker xmlGlobalRandom(void);
71*7c568831SAndroid Build Coastguard Worker XML_HIDDEN unsigned
72*7c568831SAndroid Build Coastguard Worker xmlRandom(void);
73*7c568831SAndroid Build Coastguard Worker 
74*7c568831SAndroid Build Coastguard Worker #endif /* XML_DICT_H_PRIVATE__ */
75