1 #ifndef RH_MEMORY_H
 2 #define RH_MEMORY_H
 3 
 4 #include <sys/types.h>
 5 #include "rh_memcpy_inline.h"
 6 #include "rh_memcmp_inline.h"
 7 #include "rh_memzero_inline.h"
 8 
 9 #define WORD                    size_t
10 #define BYTE                    unsigned char
11 
12 #define WORD_SIZE               sizeof(WORD)
13 
14 #ifndef PAGE_SIZE
15 # define PAGE_SIZE              4096
16 #endif
17 
18 #ifndef PAGE_ALIGN_THRESOLD
19 # define PAGE_ALIGN_THRESOLD    ((WORD_SIZE * 16)-1)
20 #endif
21 
22 #define PAGE_OFFSET(_s1)        ((WORD)(_s1) & (PAGE_SIZE-1))
23 #define WORD_OFFSET(_s1)        ((WORD)(_s1) & (WORD_SIZE-1))
24 
25 /* some macros to deal with void * pointers without using extra variables */
26 
27 #define BYTE_INC(_VAR,_INC)     _VAR = (void*) (((BYTE *)_VAR) + _INC)
28 #define WORD_INC(_VAR,_INC)     _VAR = (void*) (((WORD *)_VAR) + _INC)
29 
30 #define BYTE_AT(_s,_o)          (((BYTE *)(_s))[(_o)])
31 #define WORD_AT(_s,_o)          (((WORD *)(_s))[(_o)])
32 
33 /* return value like memcmp(): 0 if equal otherwise non 0 */
34 #define BYTE_CMP(_s1,_s2,_o)    (BYTE_AT(_s1,_o) != BYTE_AT(_s2,_o))
35 #define WORD_CMP(_s1,_s2,_o)    (WORD_AT(_s1,_o) != WORD_AT(_s2,_o))
36 
37 
38 #define BYTE_CPY(_dst,_src,_o)  (BYTE_AT(_dst,_o) = BYTE_AT(_src,_o))
39 #define WORD_CPY(_dst,_src,_o)  (WORD_AT(_dst,_o) = WORD_AT(_src,_o))
40 
41 #define WORD_XOR(_s1,_s2,_o)    (WORD_AT(_s1,_o) ^ WORD_AT(_s2,_o))
42 
43 #define BYTE_DIFF(_s1,_s2,_o)   (BYTE_AT(_s1,_o) - BYTE_AT(_s2,_o))
44 
45 #define BYTE_CASEDIFF(_s1,_s2,_o,_cs) \
46         ( (_cs)[BYTE_AT(_s1,_o)] - (_cs)[BYTE_AT(_s2,_o)] )
47 
48 #define BYTE_CASECMP(_s1,_s2,_o,_cs) \
49         ((_cs)[BYTE_AT(_s1,_o)] != (_cs)[BYTE_AT(_s2,_o)])
50 
51 #define BYTE_CASECMP2(_s1,_s2,_o,_cs) \
52         ( BYTE_CMP(_s1,_s2,_o) && BYTE_CASECMP(_s1,_s2,_o,_cs) )
53 
54 #define BYTE_CASECMP_EOF(_s1,_s2,_o,_cs) \
55         (!(_s1)[(_o)] || (BYTE_CASECMP2((_s1),(_s2),(_o),(_cs))))
56         
57 #ifdef HAVE_64BIT
58 # define WORD_CASECMP(_s1,_s2,_o,_cs)                                   \
59         ( BYTE_CASECMP2(&WORD_AT(_s1,_o), &WORD_AT(_s2,_o), 0, _cs) ||  \
60           BYTE_CASECMP2(&WORD_AT(_s2,_o), &WORD_AT(_s1,_o), 1, _cs) ||  \
61           BYTE_CASECMP2(&WORD_AT(_s1,_o), &WORD_AT(_s2,_o), 2, _cs) ||  \
62           BYTE_CASECMP2(&WORD_AT(_s2,_o), &WORD_AT(_s1,_o), 3, _cs) ||  \
63           BYTE_CASECMP2(&WORD_AT(_s1,_o), &WORD_AT(_s2,_o), 4, _cs) ||  \
64           BYTE_CASECMP2(&WORD_AT(_s2,_o), &WORD_AT(_s1,_o), 5, _cs) ||  \
65           BYTE_CASECMP2(&WORD_AT(_s1,_o), &WORD_AT(_s2,_o), 6, _cs) ||  \
66           BYTE_CASECMP2(&WORD_AT(_s2,_o), &WORD_AT(_s1,_o), 7, _cs) )
67 #else
68 # define WORD_CASECMP(_s1,_s2,_o,_cs)                                   \
69         ( BYTE_CASECMP2(&WORD_AT(_s1,_o), &WORD_AT(_s2,_o), 0, _cs) ||  \
70           BYTE_CASECMP2(&WORD_AT(_s2,_o), &WORD_AT(_s1,_o), 1, _cs) ||  \
71           BYTE_CASECMP2(&WORD_AT(_s1,_o), &WORD_AT(_s2,_o), 2, _cs) ||  \
72           BYTE_CASECMP2(&WORD_AT(_s2,_o), &WORD_AT(_s1,_o), 3, _cs) )
73 #endif
74 
75 #define MAGICBITS       0x7efefeffU
76 
77 #define WORD_EOF(_word)                                         \
78         (((((_word) + MAGICBITS) ^ ~(_word)) & ~MAGICBITS) )
79 
80 #define WORD_EOF_PTR(_word)                                     \
81         ((((*(_word) + MAGICBITS) ^ ~(*(_word)++)) & ~MAGICBITS) )
82 
83 #endif /* ! RH_MEMORY_H */


syntax highlighted by Code2HTML, v. 0.9.1