[RTL] Fix GCC build.
[reactos.git] / sdk / include / host / typedefs.h
1 /*
2 * PROJECT: ReactOS Host Headers
3 * LICENSE: GPL-2.0+ (https://spdx.org/licenses/GPL-2.0+)
4 * PURPOSE: Type definitions and useful macros for host tools
5 * COPYRIGHT: Copyright 2007 Hervé Poussineau (hpoussin@reactos.org)
6 * Copyright 2007 Colin Finck (colin@reactos.org)
7 */
8
9 #ifndef _TYPEDEFS_HOST_H
10 #define _TYPEDEFS_HOST_H
11
12 #include <assert.h>
13 #include <stdlib.h>
14 #include <limits.h>
15 #include <stdint.h>
16
17 /* Function attributes for GCC */
18 #if !defined(_MSC_VER) && !defined(__fastcall)
19 #define __fastcall __attribute__((fastcall))
20 #endif
21 #if !defined(_MSC_VER) && !defined(__cdecl)
22 #define __cdecl __attribute__((cdecl))
23 #endif
24 #if !defined(_MSC_VER) && !defined(__stdcall)
25 #define __stdcall __attribute__((stdcall))
26 #endif
27
28 /* Basic definitions */
29 #define UNIMPLEMENTED { printf("%s unimplemented\n", __FUNCTION__); exit(1); }
30 #define ASSERT(x) assert(x)
31 #define ASSERTMSG(m, x) assert(x)
32 #define DPRINT if (0) printf
33 #define DPRINT1 printf
34
35 #define NTAPI
36 #define WINAPI
37
38 #define IN
39 #define OUT
40 #define OPTIONAL
41
42 #define FALSE 0
43 #define TRUE 1
44
45 #define ANYSIZE_ARRAY 1
46
47 /* Basic types
48 Emulate a LLP64 memory model using a LP64 compiler */
49 typedef void VOID, *PVOID, *LPVOID;
50 typedef char CHAR, CCHAR, *PCHAR, *PSTR, *LPSTR;
51 typedef const char *PCSTR, *LPCSTR;
52 typedef unsigned char UCHAR, *PUCHAR, BYTE, *LPBYTE, BOOLEAN, *PBOOLEAN;
53 typedef int16_t SHORT, *PSHORT;
54 typedef uint16_t USHORT, *PUSHORT, WORD, *PWORD, *LPWORD, WCHAR, *PWCHAR, *PWSTR, *LPWSTR, UINT16;
55 typedef const uint16_t *PCWSTR, *LPCWSTR;
56 typedef int32_t INT, LONG, *PLONG, *LPLONG, BOOL, WINBOOL;
57 typedef uint32_t UINT, *PUINT, *LPUINT, ULONG, *PULONG, DWORD, *PDWORD, *LPDWORD, UINT32;
58 #if defined(_LP64) || defined(_WIN64)
59 typedef int64_t LONG_PTR, *PLONG_PTR, INT_PTR, *PINT_PTR;
60 typedef uint64_t ULONG_PTR, DWORD_PTR, *PULONG_PTR, UINT_PTR, *PUINT_PTR;
61 #else
62 typedef int32_t LONG_PTR, *PLONG_PTR, INT_PTR, *PINT_PTR;
63 typedef uint32_t ULONG_PTR, DWORD_PTR, *PULONG_PTR, UINT_PTR, *PUINT_PTR;
64 #endif
65 typedef uint64_t ULONG64, DWORD64, *PDWORD64, UINT64, ULONGLONG;
66 typedef int64_t LONGLONG, LONG64;
67 typedef float FLOAT;
68 typedef double DOUBLE;
69
70 /* Derived types */
71 typedef PVOID HANDLE;
72 #ifndef _HAVE_HKEY
73 typedef HANDLE HKEY, *PHKEY;
74 #endif
75 typedef HANDLE HMODULE, HINSTANCE;
76 typedef INT NTSTATUS, POOL_TYPE;
77 typedef LONG HRESULT;
78 typedef ULONG_PTR SIZE_T, *PSIZE_T;
79 typedef WORD LANGID;
80
81 #define MAXUSHORT USHRT_MAX
82
83 /* Widely used structures */
84 #include <pshpack4.h>
85 #ifndef _HAVE_RTL_BITMAP
86 typedef struct _RTL_BITMAP
87 {
88 ULONG SizeOfBitMap;
89 PULONG Buffer;
90 } RTL_BITMAP, *PRTL_BITMAP;
91
92 typedef struct _RTL_BITMAP_RUN
93 {
94 ULONG StartingIndex;
95 ULONG NumberOfBits;
96 } RTL_BITMAP_RUN, *PRTL_BITMAP_RUN;
97 #endif
98
99 #ifndef _HAVE_LARGE_INTEGER
100 typedef union _LARGE_INTEGER
101 {
102 struct
103 {
104 ULONG LowPart;
105 LONG HighPart;
106 };
107 struct
108 {
109 ULONG LowPart;
110 LONG HighPart;
111 } u;
112 LONGLONG QuadPart;
113 } LARGE_INTEGER, *PLARGE_INTEGER;
114 #endif
115
116 #ifndef _HAVE_LIST_ENTRY
117 typedef struct _LIST_ENTRY
118 {
119 struct _LIST_ENTRY *Flink;
120 struct _LIST_ENTRY *Blink;
121 } LIST_ENTRY,*PLIST_ENTRY;
122 #endif
123
124 #ifndef _HAVE_ANSI_STRING
125 typedef struct _ANSI_STRING
126 {
127 USHORT Length;
128 USHORT MaximumLength;
129 PSTR Buffer;
130 } ANSI_STRING, *PANSI_STRING;
131
132 typedef struct _UNICODE_STRING
133 {
134 USHORT Length;
135 USHORT MaximumLength;
136 PWSTR Buffer;
137 } UNICODE_STRING, *PUNICODE_STRING;
138 #endif
139
140 #include <poppack.h>
141
142 #ifndef _HAVE_LIST_ENTRY
143 /* List Functions */
144 static __inline
145 VOID
146 InitializeListHead(
147 IN PLIST_ENTRY ListHead
148 )
149 {
150 ListHead->Flink = ListHead->Blink = ListHead;
151 }
152
153 static __inline
154 VOID
155 InsertHeadList(
156 IN PLIST_ENTRY ListHead,
157 IN PLIST_ENTRY Entry
158 )
159 {
160 PLIST_ENTRY OldFlink;
161 OldFlink = ListHead->Flink;
162 Entry->Flink = OldFlink;
163 Entry->Blink = ListHead;
164 OldFlink->Blink = Entry;
165 ListHead->Flink = Entry;
166 }
167
168 static __inline
169 VOID
170 InsertTailList(
171 IN PLIST_ENTRY ListHead,
172 IN PLIST_ENTRY Entry
173 )
174 {
175 PLIST_ENTRY OldBlink;
176 OldBlink = ListHead->Blink;
177 Entry->Flink = ListHead;
178 Entry->Blink = OldBlink;
179 OldBlink->Flink = Entry;
180 ListHead->Blink = Entry;
181 }
182
183 static __inline
184 BOOLEAN
185 IsListEmpty(
186 IN const LIST_ENTRY * ListHead
187 )
188 {
189 return (BOOLEAN)(ListHead->Flink == ListHead);
190 }
191
192 static __inline
193 BOOLEAN
194 RemoveEntryList(
195 IN PLIST_ENTRY Entry)
196 {
197 PLIST_ENTRY OldFlink;
198 PLIST_ENTRY OldBlink;
199
200 OldFlink = Entry->Flink;
201 OldBlink = Entry->Blink;
202 OldFlink->Blink = OldBlink;
203 OldBlink->Flink = OldFlink;
204 return (BOOLEAN)(OldFlink == OldBlink);
205 }
206
207 static __inline
208 PLIST_ENTRY
209 RemoveHeadList(
210 IN PLIST_ENTRY ListHead)
211 {
212 PLIST_ENTRY Flink;
213 PLIST_ENTRY Entry;
214
215 Entry = ListHead->Flink;
216 Flink = Entry->Flink;
217 ListHead->Flink = Flink;
218 Flink->Blink = ListHead;
219 return Entry;
220 }
221
222 static __inline
223 PLIST_ENTRY
224 RemoveTailList(
225 IN PLIST_ENTRY ListHead)
226 {
227 PLIST_ENTRY Blink;
228 PLIST_ENTRY Entry;
229
230 Entry = ListHead->Blink;
231 Blink = Entry->Blink;
232 ListHead->Blink = Blink;
233 Blink->Flink = ListHead;
234 return Entry;
235 }
236 #endif
237
238 #ifndef _HAVE_ANSI_STRING
239 typedef const UNICODE_STRING *PCUNICODE_STRING;
240 #endif
241
242 /* Widely used macros */
243 #define LOBYTE(w) ((BYTE)(w))
244 #define HIBYTE(w) ((BYTE)(((WORD)(w)>>8)&0xFF))
245 #define LOWORD(l) ((WORD)((DWORD_PTR)(l)))
246 #define HIWORD(l) ((WORD)(((DWORD_PTR)(l)>>16)&0xFFFF))
247 #define MAKEWORD(a,b) ((WORD)(((BYTE)(a))|(((WORD)((BYTE)(b)))<<8)))
248 #define MAKELONG(a,b) ((LONG)(((WORD)(a))|(((DWORD)((WORD)(b)))<<16)))
249
250 #define MAXULONG 0xFFFFFFFF
251
252 #define NT_SUCCESS(x) ((x)>=0)
253 #if !defined(__GNUC__)
254 #define FIELD_OFFSET(t,f) ((LONG)(LONG_PTR)&(((t*) 0)->f))
255 #else
256 #define FIELD_OFFSET(t,f) ((LONG)__builtin_offsetof(t,f))
257 #endif
258 #define RTL_CONSTANT_STRING(s) { sizeof(s)-sizeof((s)[0]), sizeof(s), s }
259 #define CONTAINING_RECORD(address, type, field) ((type *)(((ULONG_PTR)address) - (ULONG_PTR)(&(((type *)0)->field))))
260
261 #define RtlZeroMemory(Destination, Length) memset(Destination, 0, Length)
262 #define RtlCopyMemory(Destination, Source, Length) memcpy(Destination, Source, Length)
263 #define RtlMoveMemory(Destination, Source, Length) memmove(Destination, Source, Length)
264
265 #define MAKELANGID(p,s) ((((WORD)(s))<<10)|(WORD)(p))
266 #define PRIMARYLANGID(l) ((WORD)(l)&0x3ff)
267 #define SUBLANGID(l) ((WORD)(l)>>10)
268 #define SUBLANG_NEUTRAL 0x00
269
270 /* Prevent inclusion of some other headers */
271 #define __INTERNAL_DEBUG
272 #define RTL_H
273
274 #endif
275