source: trunk/kStuff/kLdr/kLdrBase.h@ 3537

Last change on this file since 3537 was 3537, checked in by bird, 18 years ago

Moved k* into kStuff.

  • Property svn:keywords set to Id
File size: 6.6 KB
Line 
1/* $Id: kLdrBase.h 3537 2007-08-23 00:39:06Z bird $ */
2/** @file
3 *
4 * kLdr - The Dynamic Loader, Base Definitions and Typedefs.
5 *
6 * Copyright (c) 2006-2007 knut st. osmundsen <bird@anduin.net>
7 *
8 *
9 * This file is part of kLdr.
10 *
11 * kLdr is free software; you can redistribute it and/or modify
12 * it under the terms of the GNU General Public License as published by
13 * the Free Software Foundation; either version 2 of the License, or
14 * (at your option) any later version.
15 *
16 * kLdr is distributed in the hope that it will be useful,
17 * but WITHOUT ANY WARRANTY; without even the implied warranty of
18 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
19 * GNU General Public License for more details.
20 *
21 * You should have received a copy of the GNU General Public License
22 * along with kLdr; if not, write to the Free Software
23 * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
24 *
25 */
26
27#ifndef ___kLdrBase_h___
28#define ___kLdrBase_h___
29
30
31/** @defgroup grp_kLdrBase kLdrBase - Base Definitions And Typedefs
32 * @{ */
33
34/*
35 * kLdr depend on size_t, [u]intNN_t, [u]intptr_t and some related constants.
36 * If KLDR_ALREADY_INCLUDED_STD_TYPES or KCOMMON_ALREADY_INCLUDED_STD_TYPES
37 * is defined, these has already been defined.
38 */
39#if !defined(KLDR_ALREADY_INCLUDED_STD_TYPES) && !defined(KCOMMON_ALREADY_INCLUDED_STD_TYPES)
40# define KCOMMON_ALREADY_INCLUDED_STD_TYPES 1
41# include <sys/types.h>
42# include <stddef.h>
43# ifdef _MSC_VER
44 typedef signed char int8_t;
45 typedef unsigned char uint8_t;
46 typedef signed short int16_t;
47 typedef unsigned short uint16_t;
48 typedef signed int int32_t;
49 typedef unsigned int uint32_t;
50 typedef signed __int64 int64_t;
51 typedef unsigned __int64 uint64_t;
52 typedef int64_t intmax_t;
53 typedef uint64_t uintmax_t;
54# define UINT8_C(c) (c)
55# define UINT16_C(c) (c)
56# define UINT32_C(c) (c ## U)
57# define UINT64_C(c) (c ## ULL)
58# define INT8_C(c) (c)
59# define INT16_C(c) (c)
60# define INT32_C(c) (c)
61# define INT64_C(c) (c ## LL)
62# define INT8_MIN (INT8_C(-0x7f) - 1)
63# define INT16_MIN (INT16_C(-0x7fff) - 1)
64# define INT32_MIN (INT32_C(-0x7fffffff) - 1)
65# define INT64_MIN (INT64_C(-0x7fffffffffffffff) - 1)
66# define INT8_MAX INT8_C(0x7f)
67# define INT16_MAX INT16_C(0x7fff)
68# define INT32_MAX INT32_C(0x7fffffff)
69# define INT64_MAX INT64_C(0x7fffffffffffffff)
70# define UINT8_MAX UINT8_C(0xff)
71# define UINT16_MAX UINT16_C(0xffff)
72# define UINT32_MAX UINT32_C(0xffffffff)
73# define UINT64_MAX UINT64_C(0xffffffffffffffff)
74# else
75# include <stdint.h>
76# endif
77#endif /* !KLDR_ALREADY_INCLUDED_STD_TYPES && !KCOMMON_ALREADY_INCLUDED_STD_TYPES */
78
79/** Get the minimum of two values. */
80#define KLDR_MIN(a, b) ((a) <= (b) ? (a) : (b))
81/** Get the maximum of two values. */
82#define KLDR_MAX(a, b) ((a) >= (b) ? (a) : (b))
83/** Calculate the offset of a structure member. */
84#define KLDR_OFFSETOF(strct, memb) ( (size_t)( &((strct *)0)->memb ) )
85/** Align a size_t value. */
86#define KLDR_ALIGN_Z(val, align) ( ((val) + ((align) - 1)) & ~(size_t)((align) - 1) )
87/** Align a void * value. */
88#define KLDR_ALIGN_P(pv, align) ( (void *)( ((uintptr_t)(pv) + ((align) - 1)) & ~(uintptr_t)((align) - 1) ) )
89/** Align a size_t value. */
90#define KLDR_ALIGN_ADDR(val, align) ( ((val) + ((align) - 1)) & ~(KLDRADDR)((align) - 1) )
91/** Number of elements in an array. */
92#define KLDR_ELEMENTS(a) ( sizeof(a) / sizeof((a)[0]) )
93
94
95/** @def KLDR_LITTLE_ENDIAN
96 * The kLdr build is for a little endian target. */
97/** @def KLDR_BIG_ENDIAN
98 * The kLdr build is for a big endian target. */
99#if !defined(KLDR_LITTLE_ENDIAN) && !defined(KLDR_BIG_ENDIAN)
100# define KLDR_LITTLE_ENDIAN
101#endif
102#ifdef __DOXYGEN__
103# define KLDR_BIG_ENDIAN
104#endif
105
106
107/** @name Endian Conversion
108 * @{ */
109
110/** @def KLDR_E2E_U16
111 * Convert the endian of an unsigned 16-bit value. */
112# define KLDR_E2E_U16(u16) ( (uint16_t) (((u16) >> 8) | ((u16) << 8)) )
113/** @def KLDR_E2E_U32
114 * Convert the endian of an unsigned 32-bit value. */
115# define KLDR_E2E_U32(u32) ( ( ((u32) & UINT32_C(0xff000000)) >> 24 ) \
116 | ( ((u32) & UINT32_C(0x00ff0000)) >> 8 ) \
117 | ( ((u32) & UINT32_C(0x0000ff00)) << 8 ) \
118 | ( ((u32) & UINT32_C(0x000000ff)) << 24 ) \
119 )
120/** @def KLDR_E2E_U64
121 * Convert the endian of an unsigned 64-bit value. */
122# define KLDR_E2E_U64(u64) ( ( ((u64) & UINT64_C(0xff00000000000000)) >> 56 ) \
123 | ( ((u64) & UINT64_C(0x00ff000000000000)) >> 40 ) \
124 | ( ((u64) & UINT64_C(0x0000ff0000000000)) >> 24 ) \
125 | ( ((u64) & UINT64_C(0x000000ff00000000)) >> 8 ) \
126 | ( ((u64) & UINT64_C(0x00000000ff000000)) << 8 ) \
127 | ( ((u64) & UINT64_C(0x0000000000ff0000)) << 24 ) \
128 | ( ((u64) & UINT64_C(0x000000000000ff00)) << 40 ) \
129 | ( ((u64) & UINT64_C(0x00000000000000ff)) << 56 ) \
130 )
131
132/** @def KLDR_LE2H_U16
133 * Unsigned 16-bit little-endian to host endian. */
134/** @def KLDR_LE2H_U32
135 * Unsigned 32-bit little-endian to host endian. */
136/** @def KLDR_LE2H_U64
137 * Unsigned 64-bit little-endian to host endian. */
138/** @def KLDR_BE2H_U16
139 * Unsigned 16-bit big-endian to host endian. */
140/** @def KLDR_BE2H_U32
141 * Unsigned 32-bit big-endian to host endian. */
142/** @def KLDR_BE2H_U64
143 * Unsigned 64-bit big-endian to host endian. */
144#ifdef KLDR_LITTLE_ENDIAN
145# define KLDR_LE2H_U16(u16) ((uint16_t)(u16))
146# define KLDR_LE2H_U32(u32) ((uint32_t)(u32))
147# define KLDR_LE2H_U64(u64) ((uint32_t)(u32))
148# define KLDR_BE2H_U16(u16) KLDR_E2E_U16(u16)
149# define KLDR_BE2H_U32(u32) KLDR_E2E_U32(u32)
150# define KLDR_BE2H_U64(u64) KLDR_E2E_U64(u64)
151#elif defined(KLDR_BIG_ENDIAN)
152# define KLDR_LE2H_U16(u16) KLDR_E2E_U16(u16)
153# define KLDR_LE2H_U32(u32) KLDR_E2E_U32(u32)
154# define KLDR_LE2H_U32(u64) KLDR_E2E_U64(u64)
155# define KLDR_BE2H_U16(u16) ((uint16_t)(u16))
156# define KLDR_BE2H_U32(u32) ((uint32_t)(u32))
157# define KLDR_BE2H_U64(u64) ((uint32_t)(u32))
158#else
159# error "KLDR_BIG_ENDIAN or KLDR_LITTLE_ENDIAN is supposed to be defined."
160#endif
161
162/** @} */
163
164/** @} */
165
166#endif
167
Note: See TracBrowser for help on using the repository browser.