mirror of
https://github.com/vishapoberon/compiler.git
synced 2026-04-06 01:42:24 +00:00
205 lines
4.8 KiB
Text
205 lines
4.8 KiB
Text
/*
|
|
* The body prefix file of the Ofront runtime system, Version 1.0
|
|
*
|
|
* Copyright (c) Software Templ, 1994, 1995
|
|
*
|
|
* Module SYSTEM is subject to change any time without prior notification.
|
|
* Software Templ disclaims all warranties with regard to module SYSTEM,
|
|
* in particular shall Software Templ not be liable for any damage resulting
|
|
* from inappropriate use or modification of module SYSTEM.
|
|
*
|
|
* Version 1.1 jt, 24.11.95 fixes for correct pointer arithmetic on Cray computers
|
|
* jt 31.1.2007 ANSI prototypes for malloc and exit in order to avoid cc warnings
|
|
*
|
|
*/
|
|
|
|
#include "SYSTEM.h"
|
|
#ifdef __STDC__
|
|
#include "stdarg.h"
|
|
#else
|
|
#include "varargs.h"
|
|
#endif
|
|
|
|
extern void *malloc(long size);
|
|
extern void exit(int status);
|
|
|
|
void (*SYSTEM_Halt)();
|
|
LONGINT SYSTEM_halt; /* x in HALT(x) */
|
|
LONGINT SYSTEM_assert; /* x in ASSERT(cond, x) */
|
|
LONGINT SYSTEM_argc;
|
|
LONGINT SYSTEM_argv;
|
|
LONGINT SYSTEM_lock;
|
|
BOOLEAN SYSTEM_interrupted;
|
|
static LONGINT SYSTEM_mainfrm; /* adr of main proc stack frame, used for stack collection */
|
|
|
|
#define Lock SYSTEM_lock++
|
|
#define Unlock SYSTEM_lock--; if (SYSTEM_interrupted && (SYSTEM_lock == 0)) __HALT(-9)
|
|
|
|
|
|
static void SYSTEM_InitHeap();
|
|
void *SYSTEM__init();
|
|
|
|
void SYSTEM_INIT(argc, argvadr)
|
|
int argc; long argvadr;
|
|
{
|
|
SYSTEM_mainfrm = argvadr;
|
|
SYSTEM_argc = argc;
|
|
SYSTEM_argv = *(long*)argvadr;
|
|
SYSTEM_InitHeap();
|
|
SYSTEM_halt = -128;
|
|
SYSTEM__init();
|
|
}
|
|
|
|
void SYSTEM_FINI()
|
|
{
|
|
SYSTEM_FINALL();
|
|
}
|
|
|
|
long SYSTEM_XCHK(i, ub) long i, ub; {return __X(i, ub);}
|
|
long SYSTEM_RCHK(i, ub) long i, ub; {return __R(i, ub);}
|
|
long SYSTEM_ASH(i, n) long i, n; {return __ASH(i, n);}
|
|
long SYSTEM_ABS(i) long i; {return __ABS(i);}
|
|
double SYSTEM_ABSD(i) double i; {return __ABS(i);}
|
|
|
|
void SYSTEM_INHERIT(t, t0)
|
|
long *t, *t0;
|
|
{
|
|
t -= __TPROC0OFF;
|
|
t0 -= __TPROC0OFF;
|
|
while (*t0 != __EOM) {*t = *t0; t--; t0--;}
|
|
}
|
|
|
|
void SYSTEM_ENUMP(adr, n, P)
|
|
long *adr;
|
|
long n;
|
|
void (*P)();
|
|
{
|
|
while (n > 0) {P(*adr); adr++; n--;}
|
|
}
|
|
|
|
void SYSTEM_ENUMR(adr, typ, size, n, P)
|
|
char *adr;
|
|
long *typ, size, n;
|
|
void (*P)();
|
|
{
|
|
long *t, off;
|
|
typ++;
|
|
while (n > 0) {
|
|
t = typ;
|
|
off = *t;
|
|
while (off >= 0) {P(*(long*)(adr+off)); t++; off = *t;}
|
|
adr += size; n--;
|
|
}
|
|
}
|
|
|
|
long SYSTEM_DIV(x, y)
|
|
unsigned long x, y;
|
|
{ if ((long) x >= 0) return (x / y);
|
|
else return -((y - 1 - x) / y);
|
|
}
|
|
|
|
long SYSTEM_MOD(x, y)
|
|
unsigned long x, y;
|
|
{ unsigned long m;
|
|
if ((long) x >= 0) return (x % y);
|
|
else { m = (-x) % y;
|
|
if (m != 0) return (y - m); else return 0;
|
|
}
|
|
}
|
|
|
|
long SYSTEM_ENTIER(x)
|
|
double x;
|
|
{
|
|
long y;
|
|
if (x >= 0)
|
|
return (long)x;
|
|
else {
|
|
y = (long)x;
|
|
if (y <= x) return y; else return y - 1;
|
|
}
|
|
}
|
|
|
|
void SYSTEM_HALT(n)
|
|
int n;
|
|
{
|
|
SYSTEM_halt = n;
|
|
if (SYSTEM_Halt!=0) SYSTEM_Halt(n);
|
|
exit(n);
|
|
}
|
|
|
|
#ifdef __STDC__
|
|
SYSTEM_PTR SYSTEM_NEWARR(long *typ, long elemsz, int elemalgn, int nofdim, int nofdyn, ...)
|
|
#else
|
|
SYSTEM_PTR SYSTEM_NEWARR(typ, elemsz, elemalgn, nofdim, nofdyn, va_alist)
|
|
long *typ, elemsz;
|
|
int elemalgn, nofdim, nofdyn;
|
|
va_dcl
|
|
#endif
|
|
{
|
|
long nofelems, size, dataoff, n, nptr, *x, *p, nofptrs, i, *ptab, off;
|
|
va_list ap;
|
|
#ifdef __STDC__
|
|
va_start(ap, nofdyn);
|
|
#else
|
|
va_start(ap);
|
|
#endif
|
|
nofelems = 1;
|
|
while (nofdim > 0) {
|
|
nofelems = nofelems * va_arg(ap, long); nofdim--;
|
|
if (nofelems <= 0) __HALT(-20);
|
|
}
|
|
va_end(ap);
|
|
dataoff = nofdyn * sizeof(long);
|
|
if (elemalgn > sizeof(long)) {
|
|
n = dataoff % elemalgn;
|
|
if (n != 0) dataoff += elemalgn - n;
|
|
}
|
|
size = dataoff + nofelems * elemsz;
|
|
Lock;
|
|
if (typ == NIL) {
|
|
/* element typ does not contain pointers */
|
|
x = SYSTEM_NEWBLK(size);
|
|
}
|
|
else if (typ == POINTER__typ) {
|
|
/* element type is a pointer */
|
|
x = SYSTEM_NEWBLK(size + nofelems * sizeof(long));
|
|
p = (long*)x[-1];
|
|
p[-nofelems] = *p; /* build new type desc in situ: 1. copy block size; 2. setup ptr tab; 3. set sentinel; 4. patch tag */
|
|
p -= nofelems - 1; n = 1; /* n =1 for skipping the size field */
|
|
while (n <= nofelems) {*p = n*sizeof(long); p++; n++;}
|
|
*p = - (nofelems + 1) * sizeof(long); /* sentinel */
|
|
x[-1] -= nofelems * sizeof(long);
|
|
}
|
|
else {
|
|
/* element type is a record that contains pointers */
|
|
ptab = typ + 1; nofptrs = 0;
|
|
while (ptab[nofptrs] >= 0) {nofptrs++;} /* number of pointers per element */
|
|
nptr = nofelems * nofptrs; /* total number of pointers */
|
|
x = SYSTEM_NEWBLK(size + nptr * sizeof(long));
|
|
p = (long*)x[- 1];
|
|
p[-nptr] = *p; /* build new type desc in situ; 1. copy block size; 2. setup ptr tab; 3. set sentinel; 4. patch tag */
|
|
p -= nptr - 1; n = 0; off = dataoff;
|
|
while (n < nofelems) {i = 0;
|
|
while (i < nofptrs) {*p = off + ptab[i]; p++; i++;}
|
|
off += elemsz; n++;
|
|
}
|
|
*p = - (nptr + 1) * sizeof(long); /* sentinel */
|
|
x[-1] -= nptr * sizeof(long);
|
|
}
|
|
if (nofdyn != 0) {
|
|
/* setup len vector for index checks */
|
|
#ifdef __STDC__
|
|
va_start(ap, nofdyn);
|
|
#else
|
|
va_start(ap);
|
|
#endif
|
|
p = x;
|
|
while (nofdyn > 0) {*p = va_arg(ap, long); p++, nofdyn--;}
|
|
va_end(ap);
|
|
}
|
|
Unlock;
|
|
return x;
|
|
}
|
|
|
|
/* ----------- end of SYSTEM.co ------------- */
|
|
|