master
h 228 lines 6.31 KB
Raw
1 // Copyright (C) Microsoft Corporation. All rights reserved.
2 #pragma once
3
4 // Lxcore type definitions.
5 typedef int LX_INT;
6 typedef unsigned long LX_UID_T;
7 typedef unsigned long LX_GID_T;
8 typedef unsigned long LX_MODE_T;
9
10 // Windows-like type definitions
11 typedef std::uint8_t UINT8;
12 typedef std::int8_t INT8;
13 typedef std::uint16_t UINT16;
14 typedef std::int16_t INT16;
15 typedef std::uint32_t UINT32;
16 typedef std::int32_t INT32;
17 typedef std::uint64_t UINT64;
18 typedef std::int64_t INT64;
19 typedef std::uintptr_t ULONG_PTR;
20 typedef unsigned char UCHAR;
21 typedef const char* PCSTR;
22
23 typedef struct _GUID
24 {
25 std::uint32_t Data1;
26 std::uint16_t Data2;
27 std::uint16_t Data3;
28 std::uint8_t Data4[8];
29
30 bool operator==(const _GUID& other) const
31 {
32 return memcmp(this, &other, sizeof(*this)) == 0;
33 }
34
35 bool operator!=(const _GUID& other) const
36 {
37 return !(*this == other);
38 }
39 } GUID;
40
41 static_assert(sizeof(GUID) == 16);
42
43 // Lxcore versions of error values.
44 // N.B. These are negative.
45 #define LX_EPERM (-EPERM)
46 #define LX_ENOENT (-ENOENT)
47 #define LX_ESRCH (-ESRCH)
48 #define LX_EINTR (-EINTR)
49 #define LX_EIO (-EIO)
50 #define LX_ENXIO (-ENXIO)
51 #define LX_ENOEXEC (-ENOEXEC)
52 #define LX_E2BIG (-E2BIG)
53 #define LX_EBADF (-EBADF)
54 #define LX_ECHILD (-ECHILD)
55 #define LX_EAGAIN (-EAGAIN)
56 #define LX_EWOULDBLOCK (-EWOULDBLOCK)
57 #define LX_ENOMEM (-ENOMEM)
58 #define LX_EACCES (-EACCES)
59 #define LX_EFAULT (-EFAULT)
60 #define LX_EBUSY (-EBUSY)
61 #define LX_EEXIST (-EEXIST)
62 #define LX_EXDEV (-EXDEV)
63 #define LX_ENODEV (-ENODEV)
64 #define LX_ENOTDIR (-ENOTDIR)
65 #define LX_EISDIR (-EISDIR)
66 #define LX_EINVAL (-EINVAL)
67 #define LX_ENFILE (-ENFILE)
68 #define LX_EMFILE (-EMFILE)
69 #define LX_ENOTTY (-ENOTTY)
70 #define LX_EFBIG (-EFBIG)
71 #define LX_ENOSPC (-ENOSPC)
72 #define LX_ESPIPE (-ESPIPE)
73 #define LX_EROFS (-EROFS)
74 #define LX_EMLINK (-EMLINK)
75 #define LX_EPIPE (-EPIPE)
76 #define LX_ERANGE (-ERANGE)
77 #define LX_EDEADLK (-EDEADLK)
78 #define LX_ENAMETOOLONG (-ENAMETOOLONG)
79 #define LX_ENOLCK (-ENOLCK)
80 #define LX_ENOSYS (-ENOSYS)
81 #define LX_ENOTEMPTY (-ENOTEMPTY)
82 #define LX_ELOOP (-ELOOP)
83 #define LX_EIDRM (-EIDRM)
84 #define LX_ENODATA (-ENODATA)
85 #define LX_ENOATTR (-ENOATTR)
86 #define LX_EPROTO (-EPROTO)
87 #define LX_EOVERFLOW (-EOVERFLOW)
88 #define LX_EUSERS (-EUSERS)
89 #define LX_ENOTSOCK (-ENOTSOCK)
90 #define LX_EDESTADDRREQ (-EDESTADDRREQ)
91 #define LX_EMSGSIZE (-EMSGSIZE)
92 #define LX_EPROTOTYPE (-EPROTOTYPE)
93 #define LX_ENOPROTOOPT (-ENOPROTOOPT)
94 #define LX_EPROTONOSUPPORT (-EPROTONOSUPPORT)
95 #define LX_ESOCKTNOSUPPORT (-ESOCKTNOSUPPORT)
96 #define LX_EOPNOTSUPP (-EOPNOTSUPP)
97 #define LX_ENOTSUP (-ENOTSUP)
98 #define LX_EAFNOSUPPORT (-EAFNOSUPPORT)
99 #define LX_EADDRINUSE (-EADDRINUSE)
100 #define LX_EADDRNOTAVAIL (-EADDRNOTAVAIL)
101 #define LX_ENETUNREACH (-ENETUNREACH)
102 #define LX_ECONNABORTED (-ECONNABORTED)
103 #define LX_ECONNRESET (-ECONNRESET)
104 #define LX_ENOBUFS (-ENOBUFS)
105 #define LX_EISCONN (-EISCONN)
106 #define LX_ENOTCONN (-ENOTCONN)
107 #define LX_ETIMEDOUT (-ETIMEDOUT)
108 #define LX_ECONNREFUSED (-ECONNREFUSED)
109 #define LX_EHOSTDOWN (-EHOSTDOWN)
110 #define LX_EHOSTUNREACH (-EHOSTUNREACH)
111 #define LX_EALREADY (-EALREADY)
112 #define LX_EINPROGRESS (-EINPROGRESS)
113 #define LX_ENOMEDIUM (-ENOMEDIUM)
114 #define LX_EMEDIUMTYPE (-EMEDIUMTYPE)
115 #define LX_ECANCELED (-ECANCELED)
116 #define LX_ENOKEY (-ENOKEY)
117
118 // Lxcore version of constants
119 #define LX_PATH_MAX (PATH_MAX)
120 #define LX_DT_DIR (DT_DIR)
121 #define LX_DT_LNK (DT_LNK)
122
123 // Other definitions available on NT.
124 extern "C++" {
125
126 template <size_t S>
127 struct _ENUM_FLAG_INTEGER_FOR_SIZE;
128
129 template <>
130 struct _ENUM_FLAG_INTEGER_FOR_SIZE<1>
131 {
132 typedef INT8 type;
133 };
134
135 template <>
136 struct _ENUM_FLAG_INTEGER_FOR_SIZE<2>
137 {
138 typedef INT16 type;
139 };
140
141 template <>
142 struct _ENUM_FLAG_INTEGER_FOR_SIZE<4>
143 {
144 typedef INT32 type;
145 };
146
147 template <>
148 struct _ENUM_FLAG_INTEGER_FOR_SIZE<8>
149 {
150 typedef INT64 type;
151 };
152
153 // used as an approximation of std::underlying_type<T>
154 template <class T>
155 struct _ENUM_FLAG_SIZED_INTEGER
156 {
157 typedef typename _ENUM_FLAG_INTEGER_FOR_SIZE<sizeof(T)>::type type;
158 };
159 }
160
161 #define _ENUM_FLAG_CONSTEXPR constexpr
162 #define DEFINE_ENUM_FLAG_OPERATORS(ENUMTYPE) \
163 extern "C++" { \
164 inline _ENUM_FLAG_CONSTEXPR ENUMTYPE operator|(ENUMTYPE a, ENUMTYPE b) throw() \
165 { \
166 return ENUMTYPE(((_ENUM_FLAG_SIZED_INTEGER<ENUMTYPE>::type)a) | ((_ENUM_FLAG_SIZED_INTEGER<ENUMTYPE>::type)b)); \
167 } \
168 inline ENUMTYPE& operator|=(ENUMTYPE& a, ENUMTYPE b) throw() \
169 { \
170 return (ENUMTYPE&)(((_ENUM_FLAG_SIZED_INTEGER<ENUMTYPE>::type&)a) |= ((_ENUM_FLAG_SIZED_INTEGER<ENUMTYPE>::type)b)); \
171 } \
172 inline _ENUM_FLAG_CONSTEXPR ENUMTYPE operator&(ENUMTYPE a, ENUMTYPE b) throw() \
173 { \
174 return ENUMTYPE(((_ENUM_FLAG_SIZED_INTEGER<ENUMTYPE>::type)a) & ((_ENUM_FLAG_SIZED_INTEGER<ENUMTYPE>::type)b)); \
175 } \
176 inline ENUMTYPE& operator&=(ENUMTYPE& a, ENUMTYPE b) throw() \
177 { \
178 return (ENUMTYPE&)(((_ENUM_FLAG_SIZED_INTEGER<ENUMTYPE>::type&)a) &= ((_ENUM_FLAG_SIZED_INTEGER<ENUMTYPE>::type)b)); \
179 } \
180 inline _ENUM_FLAG_CONSTEXPR ENUMTYPE operator~(ENUMTYPE a) throw() \
181 { \
182 return ENUMTYPE(~((_ENUM_FLAG_SIZED_INTEGER<ENUMTYPE>::type)a)); \
183 } \
184 inline _ENUM_FLAG_CONSTEXPR ENUMTYPE operator^(ENUMTYPE a, ENUMTYPE b) throw() \
185 { \
186 return ENUMTYPE(((_ENUM_FLAG_SIZED_INTEGER<ENUMTYPE>::type)a) ^ ((_ENUM_FLAG_SIZED_INTEGER<ENUMTYPE>::type)b)); \
187 } \
188 inline ENUMTYPE& operator^=(ENUMTYPE& a, ENUMTYPE b) throw() \
189 { \
190 return (ENUMTYPE&)(((_ENUM_FLAG_SIZED_INTEGER<ENUMTYPE>::type&)a) ^= ((_ENUM_FLAG_SIZED_INTEGER<ENUMTYPE>::type)b)); \
191 } \
192 }
193
194 typedef struct _LIST_ENTRY
195 {
196 struct _LIST_ENTRY* Flink;
197 struct _LIST_ENTRY* Blink;
198 } LIST_ENTRY, *PLIST_ENTRY;
199
200 inline void InitializeListHead(PLIST_ENTRY listHead)
201 {
202 listHead->Flink = listHead->Blink = listHead;
203 }
204
205 [[nodiscard]] inline bool IsListEmpty(const LIST_ENTRY* listHead)
206 {
207 return listHead->Flink == listHead;
208 }
209
210 inline void InsertTailList(PLIST_ENTRY listHead, PLIST_ENTRY entry)
211 {
212 PLIST_ENTRY blink = listHead->Blink;
213 entry->Flink = listHead;
214 entry->Blink = blink;
215 blink->Flink = entry;
216 listHead->Blink = entry;
217 }
218
219 inline bool RemoveEntryList(PLIST_ENTRY entry)
220 {
221 PLIST_ENTRY flink = entry->Flink;
222 PLIST_ENTRY blink = entry->Blink;
223 blink->Flink = flink;
224 flink->Blink = blink;
225 return flink == blink;
226 }
227
228 #define CONTAINING_RECORD(address, type, field) ((type*)((char*)(address) - (ULONG_PTR)(&((type*)0)->field)))