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