1 #ifndef SYSTEM__h
2 #define SYSTEM__h
4 /*
6 the CPfront runtime system interface and macro library
7 based on SYSTEM.h by Josef Templ
8 bh 20.12.1999
10 */
15 #ifdef __GNUC__
16 # include <alloca.h>
17 #endif
18 #include <stdint.h>
19 #include <string.h>
21 /* extern char *memcpy(); */
23 #define export
24 #define import extern
26 /* basic types */
27 /*
28 typedef unsigned char BOOLEAN;
29 typedef unsigned char SHORTCHAR;
30 typedef unsigned short CHAR;
31 typedef signed char BYTE;
32 typedef short SHORTINT;
33 typedef int INTEGER;
34 */
35 #if !defined(_WIN64) && ((__SIZEOF_POINTER__ == 8) || defined (_LP64) || defined(__LP64__))
37 /* typedef unsigned long __U_LONGINT; */
38 #else
40 /* typedef unsigned long long __U_LONGINT; */
41 #endif
42 /*
43 typedef float SHORTREAL;
44 typedef double REAL;
45 typedef unsigned int SET;
46 typedef void ANYREC;
47 typedef void *ANYPTR;
48 typedef void *SYSTEM_PTR;
49 */
64 /* Unsigned variants are for use by shift and rotate macros */
72 /*
73 typedef unsigned char __U_SHORTCHAR;
74 typedef unsigned short __U_CHAR;
75 typedef unsigned char __U_BYTE;
76 typedef unsigned short __U_SHORTINT;
77 typedef unsigned int __U_INTEGER;
78 typedef unsigned int __U_SET;
79 */
86 /* constants */
87 #define __MAXEXT 15
88 #define NIL 0
90 #define __INF (*(REAL*)&SYSTEM_INF)
91 #define __INFS (*(SHORTREAL*)&SYSTEM_INFS)
93 #if defined _WIN32 || defined __CYGWIN__
94 # ifdef __GNUC__
95 # define __EXTERN __attribute__((dllimport))
96 # else
97 # define __EXTERN __declspec(dllimport)
98 # endif
99 #else
100 # if __GNUC__ >= 4 && !defined(__OS2__)
102 # else
103 # define __EXTERN
104 # endif
105 #endif
106 #define __CALLBACK __attribute__((__stdcall__))
109 /* simple open array types */
152 /* meta info */
158 INTEGER num;
163 SET opts;
164 INTEGER refcnt;
176 INTEGER size;
178 INTEGER id;
184 /* dynamic link */
193 /* runtime system routines */
207 extern void *SYSTEM_NEWARR4(INTEGER type, INTEGER n3, INTEGER n2, INTEGER n1, INTEGER n0, INTEGER n);
250 #define __INIT(argc, argv) SYSTEM_argCount = argc; SYSTEM_argVector = *(void**)&argv
251 #define __BEGREG(mod) if (mod.opts & 0x40000) return; mod.opts |= 0x40000;
252 #define __ENDREG
253 #define __REGMOD(mod) SYSTEM_REGMOD(&mod);
254 #define __BEGBODY(mod) if (mod.opts & 0x10000) return; mod.opts |= 0x10000;
255 #define __ENDBODY
256 #define __BEGCLOSE
257 #define __ENDCLOSE
258 #define __ENTER(name) SYSTEM_DLINK __dl = {SYSTEM_dlink, name}; SYSTEM_dlink = &__dl
259 #define __EXIT SYSTEM_dlink = __dl.next
261 /* SYSTEM ops */
262 #define __VAL(t, x) (*(t*)&(x))
263 #define __VALSR(x) SYSTEM_INT2SR(x)
264 #define __VALR(x) SYSTEM_LONG2R(x)
265 #define __VALI(x) SYSTEM_SR2INT(x)
266 #define __VALL(x) SYSTEM_R2LONG(x)
267 #define __GET(a, x, t) x= *(t*)(a)
268 #define __PUT(a, x, t) *(t*)(a)=(t)x
269 #define __LSHL(x, n, t) ((t)((__U_##t)(x)<<(n)))
270 #define __LSHR(x, n, t) ((t)((__U_##t)(x)>>(n)))
271 #define __LSH(x, n, t) ((n)>=0? __LSHL(x, n, t): __LSHR(x, -(n), t))
272 #define __ROTL(x, n, t) ((t)((__U_##t)(x)<<(n)|(__U_##t)(x)>>(8*sizeof(t)-(n))))
273 #define __ROTR(x, n, t) ((t)((__U_##t)(x)>>(n)|(__U_##t)(x)<<(8*sizeof(t)-(n))))
274 #define __ROT(x, n, t) ((n)>=0? __ROTL(x, n, t): __ROTR(x, -(n), t))
275 #define __BIT(x, n) (*(unsigned*)(x)>>(n)&1)
276 #define __MOVE(s, d, n) memcpy((char*)(d),(char*)(s),n)
278 /* std procs and operator mappings */
279 /*
280 #define __SHORT(x, y) ((int)((unsigned)(x)+(y)<(y)+(y)?(x):(__HALT(-8),0)))
281 #define __SHORTF(x, y) ((int)(__RF((x)+(y),(y)+(y))-(y)))
282 #define __CHR(x) ((CHAR)__R(x, 256))
283 #define __CHRF(x) ((CHAR)__RF(x, 256))
284 */
285 #define __DIV(x, y) ((x)>=0?(x)/(y):~(~(x)/(y)))
286 #define __DIVF(x, y) SYSTEM_DIV(x,y)
287 #define __DIVFL(x, y) SYSTEM_DIVL(x,y)
288 #define __MOD(x, y) ((x)>=0?(x)%(y):(y)+~(~(x)%(y)))
289 #define __MODF(x, y) SYSTEM_MOD(x,y)
290 #define __MODFL(x, y) SYSTEM_MODL(x,y)
291 #define __MIN(x, y) ((x)<(y)?(x):(y))
292 #define __MINF(x, y) SYSTEM_MIN(x,y)
293 #define __MINFL(x, y) SYSTEM_MINL(x,y)
294 #define __MINFF(x, y) SYSTEM_MINF(x,y)
295 #define __MINFD(x, y) SYSTEM_MIND(x,y)
296 #define __MAX(x, y) ((x)>(y)?(x):(y))
297 #define __MAXF(x, y) SYSTEM_MAX(x,y)
298 #define __MAXFL(x, y) SYSTEM_MAXL(x,y)
299 #define __MAXFF(x, y) SYSTEM_MAXF(x,y)
300 #define __MAXFD(x, y) SYSTEM_MAXD(x,y)
301 #define __NEW(t) (void*)Kernel_NewRec((INTEGER)t)
302 #define __NEWARR(t, n) (void*)SYSTEM_NEWARR(t, n)
303 #define __NEWARR0(t, n) (void*)Kernel_NewArr(t, n, 0)
304 #define __NEWARR1(t, n0, n) (void*)SYSTEM_NEWARR1(t, n0, n)
305 #define __NEWARR2(t, n1, n0, n) (void*)SYSTEM_NEWARR2(t, n1, n0, n)
306 #define __NEWARR3(t, n2, n1, n0, n) (void*)SYSTEM_NEWARR3(t, n2, n1, n0, n)
307 #define __NEWARR4(t, n3, n2, n1, n0, n) (void*)SYSTEM_NEWARR4(t, n3, n2, n1, n0, n)
308 #define __HALT(x) Kernel_Trap(x)
309 #define __ASSERT(cond, x) if (!(cond)) __HALT(x)
310 #define __ENTIER(x) SYSTEM_ENTIER(x)
311 #define __ENTIERL(x) SYSTEM_ENTIERL(x)
312 #define __ABS(x) (((x)<0)?-(x):(x))
313 #define __ABSF(x) SYSTEM_ABS(x)
314 #define __ABSFL(x) SYSTEM_ABSL(x)
315 #define __ABSFF(x) SYSTEM_ABSF(x)
316 #define __ABSFD(x) SYSTEM_ABSD(x)
317 #define __CAP(ch) ((CHAR)((ch)&0x5f))
318 #define __ODD(x) ((x)&1)
319 #define __IN(x, s) (((s)>>(x))&1)
320 #define __SETOF(x) ((SET)1<<(x))
321 #define __SETRNG(l, h) ((~(SET)0<<(l))&~(SET)0>>(8*sizeof(SET)-1-(h)))
322 #define __MASK(x, m) ((x)&~(m))
323 #define __LSTR(x) SYSTEM_LSTR(x)
344 #define __ASH(x, n, t) ((n)>=0?__ASHL(x,n,t):__ASHR(x,-(n),t))
345 #define __ASHL(x, n, t) ((t)(x)<<(n))
346 #define __ASHR(x, n, t) ((t)(x)>>(n))
347 #define __ASHF(x, n, t) SYSTEM_ASH(x, n)
348 #define __ASHFL(x, n, t) SYSTEM_ASHL(x, n)
349 #define __DUP(x, l) x=(void*)memcpy(alloca(l*sizeof(*x)),x,l*sizeof(*x))
350 #define __DUPARR(v) v=(void*)memcpy(v##__copy,v,sizeof(v##__copy))
352 #define __IS(tag, typ, level) ((tag->base[level])==(INTEGER)typ)
353 #define __TYPEOF(p) (*(((SYSTEM_TYPEDESC**)(p))-1))
354 #define __ISP(p, typ, level) __IS(__TYPEOF(p),typ,level)
356 /* runtime checks */
357 #define __X(i, ub) (((unsigned)(i)<(unsigned)(ub))?i:(__HALT(-7),0))
358 #define __XF(i, ub) SYSTEM_XCHK((INTEGER)(i), (INTEGER)(ub))
359 /*
360 #define __RETCHK __retchk: __HALT(-3)
361 */
362 #define __RETCHK __HALT(-3)
363 #define __CASECHK __HALT(-2)
364 #define __GUARDP(p, typ, level) ((typ*)(__ISP(p,typ,level)?p:(__HALT(-4),p)))
365 #define __GUARDR(r, typ, level) (*((typ*)(__IS(r##__typ,typ,level)?r:(__HALT(-4),r))))
366 #define __GUARDA(p, typ, level) ((struct typ*)(__IS(__TYPEOF(p),typ,level)?p:(__HALT(-4),p)))
367 #define __WITHCHK __HALT(-1)
369 /* Oberon-2 type bound procedures support */
370 #define __SEND(typ, num, funtyp, parlist) ((funtyp)(*((INTEGER*)typ-(num+1))))parlist
372 /* runtime system variables */
386 #endif