/* ucl_ptr.h -- low-level pointer constructs
This file is part of the UCL data compression library.
Copyright (C) 1996-2004 Markus Franz Xaver Johannes Oberhumer
All Rights Reserved.
The UCL library is free software; you can redistribute it and/or
modify it under the terms of the GNU General Public License as
published by the Free Software Foundation; either version 2 of
the License, or (at your option) any later version.
The UCL library is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
You should have received a copy of the GNU General Public License
along with the UCL library; see the file COPYING.
If not, write to the Free Software Foundation, Inc.,
59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
Markus F.X.J. Oberhumer
<markus@oberhumer.com>
http://www.oberhumer.com/opensource/ucl/
*/
/* WARNING: this file should *not* be used by applications. It is
part of the implementation of the library and is subject
to change.
*/
#ifndef __UCL_PTR_H
#define __UCL_PTR_H
#ifdef __cplusplus
extern "C" {
#endif
/***********************************************************************
// Integral types
************************************************************************/
#if !defined(ucl_uintptr_t)
# define ucl_uintptr_t acc_uintptr_t
#endif
/***********************************************************************
//
************************************************************************/
/* Always use the safe (=integral) version for pointer-comparisions.
* The compiler should optimize away the additional casts anyway.
*
* Note that this only works if the representation and ordering
* of the pointer and the integral is the same (at bit level).
*
* Most 16-bit compilers have their own view about pointers -
* fortunately they don't care about comparing pointers
* that are pointing to Nirvana.
*/
#if (ACC_OS_DOS16 || ACC_OS_OS216 || ACC_OS_WIN16)
#define PTR(a) ((ucl_bytep) (a))
/* only need the low bits of the pointer -> offset is ok */
#define PTR_ALIGNED_4(a) ((ACC_FP_OFF(a) & 3) == 0)
#define PTR_ALIGNED2_4(a,b) (((ACC_FP_OFF(a) | ACC_FP_OFF(b)) & 3) == 0)
#else
#define PTR(a) ((ucl_uintptr_t) (a))
#define PTR_LINEAR(a) PTR(a)
#define PTR_ALIGNED_4(a) ((PTR_LINEAR(a) & 3) == 0)
#define PTR_ALIGNED_8(a) ((PTR_LINEAR(a) & 7) == 0)
#define PTR_ALIGNED2_4(a,b) (((PTR_LINEAR(a) | PTR_LINEAR(b)) & 3) == 0)
#define PTR_ALIGNED2_8(a,b) (((PTR_LINEAR(a) | PTR_LINEAR(b)) & 7) == 0)
#endif
#define PTR_LT(a,b) (PTR(a) < PTR(b))
#define PTR_GE(a,b) (PTR(a) >= PTR(b))
UCL_EXTERN(ucl_uintptr_t)
__ucl_ptr_linear(const ucl_voidp ptr);
typedef union
{
char a_char;
unsigned char a_uchar;
short a_short;
unsigned short a_ushort;
int a_int;
unsigned int a_uint;
long a_long;
unsigned long a_ulong;
ucl_int a_ucl_int;
ucl_uint a_ucl_uint;
ucl_int32 a_ucl_int32;
ucl_uint32 a_ucl_uint32;
ptrdiff_t a_ptrdiff_t;
ucl_uintptr_t a_ucl_uintptr_t;
ucl_voidp a_ucl_voidp;
void * a_void_p;
ucl_bytep a_ucl_bytep;
ucl_bytepp a_ucl_bytepp;
ucl_uintp a_ucl_uintp;
ucl_uint * a_ucl_uint_p;
ucl_uint32p a_ucl_uint32p;
ucl_uint32 * a_ucl_uint32_p;
unsigned char * a_uchar_p;
char * a_char_p;
}
ucl_align_t;
#ifdef __cplusplus
} /* extern "C" */
#endif
#endif /* already included */
/*
vi:ts=4:et
*/