↑ 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