Open SCAP Library
|
00001 #ifndef SEXP_RAWPTR 00002 #define SEXP_RAWPTR 00003 00004 #include <stdint.h> 00005 00006 static inline void *SEXP_rawptr_mask(void *ptr, uintptr_t mask) 00007 { 00008 return (void *)((uintptr_t)(ptr) & mask); 00009 } 00010 00011 #define SEXP_rawptr_maskT(T, ptr, mask) ((T *)SEXP_rawptr_mask((void *)(ptr), mask)) 00012 00013 static inline void *SEXP_rawptr_merge(void *ptr, uintptr_t bits) 00014 { 00015 return (void *)(((uintptr_t)(ptr) | bits)); 00016 } 00017 00018 #define SEXP_rawptr_mergeT(T, ptr, bits) ((T *)SEXP_rawptr_merge((void *)(ptr), bits)) 00019 00020 static inline void *SEXP_rawptr_safemerge(void *ptr, uintptr_t bits, uintptr_t mask) 00021 { 00022 return (void *)(((uintptr_t)SEXP_rawptr_mask(ptr, mask))|(~mask & bits)); 00023 } 00024 00025 #define SEXP_rawptr_safemergeT(T, ptr, bits, mask) ((T *)SEXP_rawptr_safemerge((void *)(ptr), bits, mask)) 00026 00027 static inline bool SEXP_rawptr_bit(void *ptr, int n) 00028 { 00029 return (bool)(((uintptr_t)(ptr)) & (1 << n)); 00030 } 00031 00032 static inline uintptr_t SEXP_rawptr_bitmask(void *ptr, uintptr_t mask) 00033 { 00034 return ((uintptr_t)(ptr)) & mask; 00035 } 00036 00037 #endif /* SEXP_RAWPTR */