1 /* lzo_ptr.h -- low-level pointer constructs 2 3 This file is part of the LZO real-time data compression library. 4 5 Copyright (C) 1996-2014 Markus Franz Xaver Johannes Oberhumer 6 All Rights Reserved. 7 8 The LZO library is free software; you can redistribute it and/or 9 modify it under the terms of the GNU General Public License as 10 published by the Free Software Foundation; either version 2 of 11 the License, or (at your option) any later version. 12 13 The LZO library is distributed in the hope that it will be useful, 14 but WITHOUT ANY WARRANTY; without even the implied warranty of 15 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 16 GNU General Public License for more details. 17 18 You should have received a copy of the GNU General Public License 19 along with the LZO library; see the file COPYING. 20 If not, write to the Free Software Foundation, Inc., 21 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. 22 23 Markus F.X.J. Oberhumer 24 <markus@oberhumer.com> 25 http://www.oberhumer.com/opensource/lzo/ 26 */ 27 28 29 /* WARNING: this file should *not* be used by applications. It is 30 part of the implementation of the library and is subject 31 to change. 32 */ 33 34 35 #ifndef __LZO_PTR_H 36 #define __LZO_PTR_H 1 37 38 #ifdef __cplusplus 39 extern "C" { 40 #endif 41 42 43 /*********************************************************************** 44 // 45 ************************************************************************/ 46 47 /* Always use the safe (=integral) version for pointer-comparisons. 48 * The compiler should optimize away the additional casts anyway. 49 * 50 * Note that this only works if the representation and ordering 51 * of the pointer and the integral is the same (at bit level). 52 */ 53 54 #if (LZO_ARCH_I086) 55 #error "LZO_ARCH_I086 is unsupported" 56 #elif (LZO_MM_PVP) 57 #error "LZO_MM_PVP is unsupported" 58 #else 59 #define PTR(a) ((lzo_uintptr_t) (a)) 60 #define PTR_LINEAR(a) PTR(a) 61 #define PTR_ALIGNED_4(a) ((PTR_LINEAR(a) & 3) == 0) 62 #define PTR_ALIGNED_8(a) ((PTR_LINEAR(a) & 7) == 0) 63 #define PTR_ALIGNED2_4(a,b) (((PTR_LINEAR(a) | PTR_LINEAR(b)) & 3) == 0) 64 #define PTR_ALIGNED2_8(a,b) (((PTR_LINEAR(a) | PTR_LINEAR(b)) & 7) == 0) 65 #endif 66 67 #define PTR_LT(a,b) (PTR(a) < PTR(b)) 68 #define PTR_GE(a,b) (PTR(a) >= PTR(b)) 69 #define PTR_DIFF(a,b) (PTR(a) - PTR(b)) 70 #define pd(a,b) ((lzo_uint) ((a)-(b))) 71 72 73 LZO_EXTERN(lzo_uintptr_t) 74 __lzo_ptr_linear(const lzo_voidp ptr); 75 76 77 typedef union 78 { 79 char a_char; 80 unsigned char a_uchar; 81 short a_short; 82 unsigned short a_ushort; 83 int a_int; 84 unsigned int a_uint; 85 long a_long; 86 unsigned long a_ulong; 87 lzo_int a_lzo_int; 88 lzo_uint a_lzo_uint; 89 lzo_xint a_lzo_xint; 90 lzo_int16_t a_lzo_int16_t; 91 lzo_uint16_t a_lzo_uint16_t; 92 lzo_int32_t a_lzo_int32_t; 93 lzo_uint32_t a_lzo_uint32_t; 94 #if defined(lzo_uint64_t) 95 lzo_int64_t a_lzo_int64_t; 96 lzo_uint64_t a_lzo_uint64_t; 97 #endif 98 size_t a_size_t; 99 ptrdiff_t a_ptrdiff_t; 100 lzo_uintptr_t a_lzo_uintptr_t; 101 void * a_void_p; 102 char * a_char_p; 103 unsigned char * a_uchar_p; 104 const void * a_c_void_p; 105 const char * a_c_char_p; 106 const unsigned char * a_c_uchar_p; 107 lzo_voidp a_lzo_voidp; 108 lzo_bytep a_lzo_bytep; 109 const lzo_voidp a_c_lzo_voidp; 110 const lzo_bytep a_c_lzo_bytep; 111 } 112 lzo_full_align_t; 113 114 115 116 #ifdef __cplusplus 117 } /* extern "C" */ 118 #endif 119 120 #endif /* already included */ 121 122 /* 123 vi:ts=4:et 124 */ 125 126