Warning-fixed and ansified the Modula-2 library.

This commit is contained in:
David Given 2018-06-25 22:22:37 +02:00
parent f8ba7ef962
commit 7971bdba5a
27 changed files with 463 additions and 386 deletions

View file

@ -1,12 +1,17 @@
---
BasedOnStyle: WebKit
AllowShortLoopsOnASingleLine: 'false'
AlignAfterOpenBracket: AlwaysBreak
AllowShortFunctionsOnASingleLine: false
AllowShortLoopsOnASingleLine: false
AlwaysBreakAfterDefinitionReturnType: false
BasedOnStyle: WebKit
BinPackArguments: true
BinPackParameters: false
BreakBeforeBraces: Allman
ColumnLimit: 100
IndentCaseLabels: 'true'
PointerAlignment: Left
SortIncludes: false
TabWidth: '4'
UseTab: ForIndentation
SortIncludes: false
...

103
lang/m2/include/libm2.h Normal file
View file

@ -0,0 +1,103 @@
#ifndef LIBM2_H
#define LIBM2_H
#include <stdint.h>
struct array_descr
{
int lbound;
int n_elts_min_one;
unsigned size;
};
struct int_range_descr
{
int low, high;
};
struct uint_range_descr
{
unsigned int low, high;
};
struct long_range_descr
{
long low, high;
};
struct ulong_range_descr
{
unsigned long low, high;
};
struct stack_descr
{
char* addr;
int low;
unsigned int highminlow;
unsigned int size;
};
struct proc
{
unsigned size; /* size of saved stackframe(s) */
int (*proc)(void); /* address of coroutine procedure */
char* brk; /* stack break of this coroutine */
};
extern void (*handler)(int);
extern char** argv;
extern int argc;
extern char* MainLB;
extern double absd(double i);
extern int CallAtEnd(void (*p)(void));
extern int absi(int i);
extern int dvi(int j, int i);
extern int rmi(int j, int i);
extern int sigtrp(int trapno, int signo);
extern int stackprio(unsigned n);
extern int topsave(void* brkpos, struct proc* proc);
extern long absl(long i);
extern long dvil(long j, long i);
extern long rmil(long j, long i);
extern size_t new_stackptr(struct stack_descr* pdscr, int a);
extern unsigned int topsize(void* brkpos);
extern void SIG(void (*)(int));
extern void StringAssign(int dstsiz, int srcsiz, register char* dstaddr, register char* srcaddr);
extern void TRP(int trapno);
extern void _Arguments_(void);
extern void _SYSTEM__NEWPROCESS(int (*p)(void), struct proc* a, unsigned n, struct proc** p1);
extern void _SYSTEM__TRANSFER(struct proc** a, struct proc** b);
extern void _cleanup(void);
extern void adduchk(unsigned a, unsigned b);
extern void blockmove(size_t siz, char* dst, char* src);
extern void cap(unsigned u);
extern void catch (int trapno);
extern void copy_array(char* pp, int a);
extern void halt(void);
extern void init(void);
extern void killbss(void);
extern void load(size_t siz, register char* addr, int p);
extern void muluchk(unsigned a, unsigned b);
extern void rcka(struct array_descr* descr, int indx);
extern void rcki(struct int_range_descr* descr, int val);
extern void rckil(struct long_range_descr* descr, long val);
extern void rcku(struct uint_range_descr* descr, unsigned val);
extern void rckul(struct ulong_range_descr* descr, unsigned long val);
extern void store(size_t siz, register char* addr, int p);
extern void subuchk(unsigned a, unsigned b);
extern void topload(struct proc* proc);
extern void unstackprio(unsigned n);
/* PROCEDURE Argv(argnum: CARDINAL; VAR argument: ARRAY OF CHAR): CARDINAL; */
extern unsigned _Arguments__Argv(int n, char* argument, int l, unsigned int u, int s);
/* PROCEDURE GetEnv(name: ARRAY OF CHAR; VAR value: ARRAY OF CHAR): CARDINAL; */
extern unsigned _Arguments__GetEnv(
char* name, int nn, unsigned int nu, int ns, char* value, int l, unsigned int u, int s);
/* PROCEDURE Message(str: ARRAY OF CHAR); */
extern void _Traps__Message(char* str, int nn, unsigned int nu, int ns);
#endif

View file

@ -6,11 +6,11 @@
/* Modula-2 runtime errors */
#define M2_TOOLARGE 64 /* stack of process too large */
#define M2_TOOMANY 65 /* too many nested traps & handlers */
#define M2_NORESULT 66 /* no RETURN from procedure function */
#define M2_UOVFL 67 /* cardinal overflow */
#define M2_FORCH 68 /* FOR-loop control variable changed */
#define M2_UUVFL 69 /* cardinal underflow */
#define M2_INTERNAL 70 /* internal error, should not happen */
#define M2_UNIXSIG 71 /* unix signal */
#define M2_TOOLARGE 64 /* stack of process too large */
#define M2_TOOMANY 65 /* too many nested traps & handlers */
#define M2_NORESULT 66 /* no RETURN from procedure function */
#define M2_UOVFL 67 /* cardinal overflow */
#define M2_FORCH 68 /* FOR-loop control variable changed */
#define M2_UUVFL 69 /* cardinal underflow */
#define M2_INTERNAL 70 /* internal error, should not happen */
#define M2_UNIXSIG 71 /* unix signal */

View file

@ -8,66 +8,65 @@
Author: Ceriel J.H. Jacobs
Version: $Id$
*/
#include "libm2.h"
extern char **argv, **environ;
extern int argc;
unsigned int _Arguments__Argc;
static char *
findname(s1, s2)
register char *s1, *s2;
static char* findname(char* s1, char* s2)
{
while (*s1 == *s2++) s1++;
if (*s1 == '\0' && *(s2-1) == '=') return s2;
while (*s1 == *s2++)
s1++;
if (*s1 == '\0' && *(s2 - 1) == '=')
return s2;
return 0;
}
static unsigned int
scopy(src, dst, max)
register char *src, *dst;
unsigned int max;
static unsigned int scopy(char* src, char* dst, unsigned int max)
{
register unsigned int i = 0;
while (*src && i <= max) {
while (*src && i <= max)
{
i++;
*dst++ = *src++;
}
if (i <= max) {
if (i <= max)
{
*dst = '\0';
return i+1;
return i + 1;
}
while (*src++) i++;
while (*src++)
i++;
return i + 1;
}
_Arguments_()
void _Arguments_(void)
{
_Arguments__Argc = argc;
}
unsigned
_Arguments__Argv(n, argument, l, u, s)
unsigned int u;
char *argument;
unsigned int _Arguments__Argv(int n, char* argument, int l, unsigned int u, int s)
{
if (n >= argc) return 0;
if (n >= argc)
return 0;
return scopy(argv[n], argument, u);
}
unsigned
_Arguments__GetEnv(name, nn, nu, ns, value, l, u, s)
char *name, *value;
unsigned int nu, u;
unsigned int _Arguments__GetEnv(
char* name, int nn, unsigned int nu, int ns, char* value, int l, unsigned int u, int s)
{
register char **p = environ;
register char *v = 0;
register char** p = environ;
register char* v = 0;
while (*p && !(v = findname(name, *p++))) {
while (*p && !(v = findname(name, *p++)))
{
/* nothing */
}
if (!v) return 0;
if (!v)
return 0;
return scopy(v, value, u);
}

View file

@ -10,49 +10,45 @@
*/
/*
An implementation of the Modula-2 NEWPROCESS and TRANSFER facilities
using the topsize, topsave, and topload facilities.
For each coroutine, a proc structure is built. For the main routine,
a static space is declared to save its stack. For the other coroutines,
the user specifies this space.
An implementation of the Modula-2 NEWPROCESS and TRANSFER facilities
using the topsize, topsave, and topload facilities.
For each coroutine, a proc structure is built. For the main routine,
a static space is declared to save its stack. For the other coroutines,
the user specifies this space.
*/
#include <unistd.h>
#include "libm2.h"
#include <m2_traps.h>
#define MAXMAIN 2048
#define MAXMAIN 2048
struct proc {
unsigned size; /* size of saved stackframe(s) */
int (*proc)(); /* address of coroutine procedure */
char *brk; /* stack break of this coroutine */
};
static struct proc mainproc[MAXMAIN / sizeof(struct proc) + 1];
extern unsigned topsize();
static struct proc* curproc = 0; /* current coroutine */
extern char* MainLB; /* stack break of main routine */
static struct proc mainproc[MAXMAIN/sizeof(struct proc) + 1];
static struct proc *curproc = 0;/* current coroutine */
extern char *MainLB; /* stack break of main routine */
_SYSTEM__NEWPROCESS(p, a, n, p1)
int (*p)(); /* coroutine procedure */
struct proc *a; /* pointer to area for saved stack-frame */
unsigned n; /* size of this area */
struct proc **p1; /* where to leave coroutine descriptor,
in this implementation the address of
the area for saved stack-frame(s) */
void _SYSTEM__NEWPROCESS(
int (*p)(void) /* coroutine procedure */,
struct proc* a /* pointer to area for saved stack-frame */,
unsigned int n /* size of this area */,
struct proc** p1 /* where to leave coroutine descriptor,
in this implementation the address of
the area for saved stack-frame(s) */
)
{
/* This procedure creates a new coroutine, but does not
transfer control to it. The routine "topsize" will compute the
stack break, which will be the local base of this routine.
Notice that we can do this because we do not need the stack
above this point for this coroutine. In Modula-2, coroutines
must be level 0 procedures without parameters.
transfer control to it. The routine "topsize" will compute the
stack break, which will be the local base of this routine.
Notice that we can do this because we do not need the stack
above this point for this coroutine. In Modula-2, coroutines
must be level 0 procedures without parameters.
*/
char *brk = 0;
char* brk = 0;
unsigned sz = topsize(&brk);
if (sz + sizeof(struct proc) > n) {
if (sz + sizeof(struct proc) > n)
{
/* not enough space */
TRP(M2_TOOLARGE);
}
@ -60,10 +56,11 @@ _SYSTEM__NEWPROCESS(p, a, n, p1)
a->proc = p;
a->brk = brk;
*p1 = a;
if (topsave(brk, a+1))
if (topsave(brk, a + 1))
/* stack frame saved; now just return */
;
else {
else
{
/* We get here through the first transfer to the coroutine
created above.
This also means that curproc is now set to this coroutine.
@ -76,16 +73,16 @@ _SYSTEM__NEWPROCESS(p, a, n, p1)
}
}
_SYSTEM__TRANSFER(a, b)
struct proc **a, **b;
void _SYSTEM__TRANSFER(struct proc** a, struct proc** b)
{
/* transfer from one coroutine to another, saving the current
descriptor in the space indicated by "a", and transfering to
the coroutine in descriptor "b".
descriptor in the space indicated by "a", and transfering to
the coroutine in descriptor "b".
*/
unsigned size;
if (! curproc) {
if (!curproc)
{
/* the current coroutine is the main process;
initialize a coroutine descriptor for it ...
*/
@ -93,21 +90,24 @@ _SYSTEM__TRANSFER(a, b)
mainproc[0].size = sizeof(mainproc);
curproc = &mainproc[0];
}
*a = curproc; /* save current descriptor in "a" */
if (*b == curproc) {
*a = curproc; /* save current descriptor in "a" */
if (*b == curproc)
{
/* transfer to itself is a no-op */
return;
}
size = topsize(&(curproc->brk));
if (size + sizeof(struct proc) > curproc->size) {
if (size + sizeof(struct proc) > curproc->size)
{
TRP(M2_TOOLARGE);
}
if (topsave(curproc->brk, curproc+1)) {
if (topsave(curproc->brk, curproc + 1))
{
/* stack top saved. Now restore context of target
coroutine
*/
curproc = *b;
topload(curproc+1);
topload(curproc + 1);
/* we never get here ... */
}
/* but we do get here, when a transfer is done to the coroutine in "a".

View file

@ -5,19 +5,22 @@
/*
Module: assign string to character array, with possible 0-byte
extension
extension
Author: Ceriel J.H. Jacobs
Version: $Id$
*/
StringAssign(dstsiz, srcsiz, dstaddr, srcaddr)
register char *dstaddr, *srcaddr;
#include "libm2.h"
void StringAssign(int dstsiz, int srcsiz, char* dstaddr, char* srcaddr)
{
while (srcsiz > 0) {
while (srcsiz > 0)
{
*dstaddr++ = *srcaddr++;
srcsiz--;
dstsiz--;
}
if (dstsiz > 0) {
if (dstsiz > 0)
{
*dstaddr = 0;
}
}

View file

@ -15,14 +15,14 @@ IMPLEMENTATION MODULE Terminal;
*)
FROM SYSTEM IMPORT ADR;
#ifdef __USG
FROM Unix IMPORT read, write, open, fcntl;
FROM Unix IMPORT read, write, fcntl;
#else
FROM Unix IMPORT read, write, open, ioctl;
FROM Unix IMPORT read, write, ioctl;
#endif
VAR fildes, fdout: INTEGER;
unreadch: CHAR;
unread: BOOLEAN;
tty: ARRAY[0..8] OF CHAR;
(* tty: ARRAY[0..8] OF CHAR; *)
PROCEDURE Read(VAR ch: CHAR);
BEGIN
@ -115,7 +115,7 @@ BEGIN
*)
(* dtrg: changed so that instead of opening /dev/tty, fd 0 is always used. *)
(* kernigh: sent output to fd 1 *)
tty := "stdio";
(* tty := "stdio"; *)
fildes := 0;
fdout := 1;
unread := FALSE;

View file

@ -8,10 +8,10 @@
Author: Ceriel J.H. Jacobs
Version: $Id$
*/
#include "libm2.h"
#ifndef NOFLOAT
double
absd(i)
double i;
double absd(double i)
{
return i >= 0 ? i : -i;
}

View file

@ -8,8 +8,9 @@
Author: Ceriel J.H. Jacobs
Version: $Id$
*/
#include "libm2.h"
absi(i)
int absi(int i)
{
return i >= 0 ? i : -i;
}

View file

@ -8,9 +8,9 @@
Author: Ceriel J.H. Jacobs
Version: $Id$
*/
long
absl(i)
long i;
#include "libm2.h"
long absl(long i)
{
return i >= 0 ? i : -i;
}

View file

@ -8,16 +8,11 @@
Author: Ceriel J.H. Jacobs
Version: $Id$
*/
#include <stdint.h>
#include "libm2.h"
#if _EM_WSIZE==_EM_PSIZE
typedef unsigned pcnt;
#else
typedef unsigned long pcnt;
#endif
blockmove(siz, dst, src)
pcnt siz;
register char *dst, *src;
void blockmove(size_t siz, char* dst, char* src)
{
while (siz--) *dst++ = *src++;
while (siz--)
*dst++ = *src++;
}

View file

@ -8,11 +8,12 @@
Author: Ceriel J.H. Jacobs
Version: $Id$
*/
#include "libm2.h"
cap(u)
unsigned u;
void cap(unsigned int u)
{
register unsigned *p = &u;
register unsigned* p = &u;
if (*p >= 'a' && *p <= 'z') *p += 'A'-'a';
if (*p >= 'a' && *p <= 'z')
*p += 'A' - 'a';
}

View file

@ -11,89 +11,96 @@
#include <em_abs.h>
#include <m2_traps.h>
#include <signal.h>
#include "libm2.h"
static struct errm {
int errno;
char *errmes;
} errors[] = {
{ EARRAY, "array bound error"},
{ ERANGE, "range bound error"},
{ ESET, "set bound error"},
{ EIOVFL, "integer overflow"},
{ EFOVFL, "real overflow"},
{ EFUNFL, "real underflow"},
{ EIDIVZ, "divide by 0"},
{ EFDIVZ, "divide by 0.0"},
{ EIUND, "undefined integer"},
{ EFUND, "undefined real"},
{ ECONV, "conversion error"},
{ ESTACK, "stack overflow"},
{ EHEAP, "heap overflow"},
{ EILLINS, "illegal instruction"},
{ EODDZ, "illegal size argument"},
{ ECASE, "case error"},
{ EMEMFLT, "addressing non existent memory"},
{ EBADPTR, "bad pointer used"},
{ EBADPC, "program counter out of range"},
{ EBADLAE, "bad argument of lae"},
{ EBADMON, "bad monitor call"},
{ EBADLIN, "argument if LIN too high"},
{ EBADGTO, "GTO descriptor error"},
{ M2_TOOLARGE, "stack size of process too large"},
{ M2_TOOMANY, "too many nested traps + handlers"},
{ M2_NORESULT, "no RETURN from function procedure"},
{ M2_UOVFL, "cardinal overflow"},
{ M2_FORCH, "(warning) FOR-loop control variable was changed in the body"},
{ M2_UUVFL, "cardinal underflow"},
{ M2_INTERNAL, "internal error; ask an expert for help"},
{ M2_UNIXSIG, "got a unix signal"},
{ -1, 0}
};
catch(trapno)
int trapno;
static struct errm
{
register struct errm *ep = &errors[0];
char *errmessage;
int errno;
char* errmes;
} errors[] = { { EARRAY, "array bound error" },
{ ERANGE, "range bound error" },
{ ESET, "set bound error" },
{ EIOVFL, "integer overflow" },
{ EFOVFL, "real overflow" },
{ EFUNFL, "real underflow" },
{ EIDIVZ, "divide by 0" },
{ EFDIVZ, "divide by 0.0" },
{ EIUND, "undefined integer" },
{ EFUND, "undefined real" },
{ ECONV, "conversion error" },
{ ESTACK, "stack overflow" },
{ EHEAP, "heap overflow" },
{ EILLINS, "illegal instruction" },
{ EODDZ, "illegal size argument" },
{ ECASE, "case error" },
{ EMEMFLT, "addressing non existent memory" },
{ EBADPTR, "bad pointer used" },
{ EBADPC, "program counter out of range" },
{ EBADLAE, "bad argument of lae" },
{ EBADMON, "bad monitor call" },
{ EBADLIN, "argument if LIN too high" },
{ EBADGTO, "GTO descriptor error" },
{ M2_TOOLARGE, "stack size of process too large" },
{ M2_TOOMANY, "too many nested traps + handlers" },
{ M2_NORESULT, "no RETURN from function procedure" },
{ M2_UOVFL, "cardinal overflow" },
{ M2_FORCH, "(warning) FOR-loop control variable was changed in the body" },
{ M2_UUVFL, "cardinal underflow" },
{ M2_INTERNAL, "internal error; ask an expert for help" },
{ M2_UNIXSIG, "got a unix signal" },
{ -1, 0 } };
void catch (int trapno)
{
register struct errm* ep = &errors[0];
char* errmessage;
char buf[20];
register char *p, *s;
while (ep->errno != trapno && ep->errmes != 0) ep++;
if (p = ep->errmes) {
while (*p) p++;
_Traps__Message(ep->errmes, 0, (int) (p - ep->errmes), 1);
while (ep->errno != trapno && ep->errmes != 0)
ep++;
if (p = ep->errmes)
{
while (*p)
p++;
_Traps__Message(ep->errmes, 0, (int)(p - ep->errmes), 1);
}
else {
else
{
int i = trapno;
static char q[] = "error number xxxxxxxxxxxxx";
p = &q[13];
s = buf;
if (i < 0) {
if (i < 0)
{
i = -i;
*p++ = '-';
}
do
*s++ = i % 10 + '0';
while (i /= 10);
while (s > buf) *p++ = *--s;
while (s > buf)
*p++ = *--s;
*p = 0;
_Traps__Message(q, 0, (int) (p - q), 1);
_Traps__Message(q, 0, (int)(p - q), 1);
}
#if !defined(__em24) && !defined(__em44) && !defined(__em22)
if (trapno == M2_UNIXSIG) {
if (trapno == M2_UNIXSIG)
{
extern int __signo;
signal(__signo, SIG_DFL);
_cleanup();
kill(getpid(), __signo);
_exit(trapno+1);
_exit(trapno + 1);
}
#endif
if (trapno != M2_FORCH) {
if (trapno != M2_FORCH)
{
_cleanup();
_exit(trapno+1);
_exit(trapno + 1);
}
SIG(catch);
}

View file

@ -8,6 +8,7 @@
Author: Ceriel J.H. Jacobs
Version: $Id$
*/
#include "libm2.h"
#include <m2_traps.h>
#ifndef EM_WSIZE
@ -15,58 +16,43 @@
#define EM_PSIZE _EM_PSIZE
#endif
#if EM_WSIZE==EM_PSIZE
typedef unsigned pcnt;
#else
typedef unsigned long pcnt;
#endif
static struct stack_descr* descrs[10];
static struct stack_descr** ppdescr = descrs;
struct descr {
char *addr;
int low;
unsigned int highminlow;
unsigned int size;
};
static struct descr *descrs[10];
static struct descr **ppdescr = descrs;
pcnt
new_stackptr(pdscr, a)
struct descr *pdscr;
size_t new_stackptr(struct stack_descr* pdescr, int a)
{
register struct descr *pdescr = pdscr;
pcnt size = (((pdescr->highminlow + 1) * pdescr->size +
(EM_WSIZE - 1)) & ~(EM_WSIZE - 1));
size_t size = (((pdescr->highminlow + 1) * pdescr->size + (EM_WSIZE - 1)) & ~(EM_WSIZE - 1));
if (ppdescr >= &descrs[10]) {
if (ppdescr >= &descrs[10])
{
/* to many nested traps + handlers ! */
TRP(M2_TOOMANY);
}
*ppdescr++ = pdescr;
if ((char *) &a - (char *) &pdscr > 0) {
if ((char*)&a - (char*)&pdescr > 0)
{
/* stack grows downwards */
return - size;
return -size;
}
return size;
}
copy_array(pp, a)
char *pp;
void copy_array(char* p, int a)
{
register char *p = pp;
register char *q;
register pcnt sz;
char* q;
size_t sz;
char dummy;
ppdescr--;
sz = ((*ppdescr)->highminlow + 1) * (*ppdescr)->size;
if ((char *) &a - (char *) &pp > 0) {
(*ppdescr)->addr = q = (char *) &a;
}
else (*ppdescr)->addr = q = (char *) &a -
((sz + (EM_WSIZE - 1)) & ~ (EM_WSIZE - 1));
while (sz--) *q++ = *p++;
if ((char*)&a - (char*)&p > 0)
{
(*ppdescr)->addr = q = (char*)&a;
}
else
(*ppdescr)->addr = q = (char*)&a - ((sz + (EM_WSIZE - 1)) & ~(EM_WSIZE - 1));
while (sz--)
*q++ = *p++;
}

View file

@ -8,45 +8,52 @@
Author: Ceriel J.H. Jacobs
Version: $Id$
Reason: We cannot use DVI and RMI, because DVI rounds towards 0
and Modula-2 requires truncation
and Modula-2 requires truncation
*/
#include "libm2.h"
#include <em_abs.h>
int
dvi(j,i)
int j,i;
int dvi(int j, int i)
{
if (j == 0) TRP(EIDIVZ);
if ((i < 0) != (j < 0)) {
if (i < 0) i = -i;
else j = -j;
return -((i+j-1)/j);
if (j == 0)
TRP(EIDIVZ);
if ((i < 0) != (j < 0))
{
if (i < 0)
i = -i;
else
j = -j;
return -((i + j - 1) / j);
}
else return i/j;
else
return i / j;
}
long
dvil(j,i)
long j,i;
long dvil(long j, long i)
{
if (j == 0) TRP(EIDIVZ);
if ((i < 0) != (j < 0)) {
if (i < 0) i = -i;
else j = -j;
return -((i+j-1)/j);
if (j == 0)
TRP(EIDIVZ);
if ((i < 0) != (j < 0))
{
if (i < 0)
i = -i;
else
j = -j;
return -((i + j - 1) / j);
}
else return i/j;
else
return i / j;
}
int
rmi(j,i)
int j,i;
int rmi(int j, int i)
{
int m;
if (j == 0) TRP(EIDIVZ);
if (i == 0) return 0;
if (j == 0)
TRP(EIDIVZ);
if (i == 0)
return 0;
m = i % j;
if (m != 0 && (i < 0) != (j < 0))
@ -54,14 +61,14 @@ rmi(j,i)
return m;
}
long
rmil(j,i)
long j,i;
long rmil(long j, long i)
{
long m;
if (j == 0) TRP(EIDIVZ);
if (i == 0) return 0L;
if (j == 0)
TRP(EIDIVZ);
if (i == 0)
return 0L;
m = i % j;
if (m != 0 && (i < 0) != (j < 0))

View file

@ -8,29 +8,32 @@
Author: Ceriel J.H. Jacobs
Version: $Id$
*/
#include <unistd.h>
#include "libm2.h"
#define MAXPROCS 32
static int callindex = 0;
static int (*proclist[MAXPROCS])();
static void (*proclist[MAXPROCS])(void);
_cleanup()
void _cleanup(void)
{
while (--callindex >= 0)
(*proclist[callindex])();
callindex = 0;
}
CallAtEnd(p)
int (*p)();
int CallAtEnd(void (*p)(void))
{
if (callindex >= MAXPROCS) {
if (callindex >= MAXPROCS)
{
return 0;
}
proclist[callindex++] = p;
return 1;
}
halt()
void halt(void)
{
_cleanup();
_exit(0);

View file

@ -12,6 +12,7 @@
#include <signal.h>
#include <em_abs.h>
#include <m2_traps.h>
#include "libm2.h"
static const char signals_list[] = {
#ifdef SIGHUP
@ -57,7 +58,8 @@ static const char signals_list[] = {
void init(void)
{
const char* p = signals_list;
do {
do
{
int i = *p++;
if (i == -1)
break;
@ -70,29 +72,28 @@ void init(void)
#endif
}
#if defined(__em22) || defined(__em24) || defined(__em44)
killbss()
void killbss(void)
{
}
#else
static int blablabla; /* We cannot use end, because then also
bss allocated for the systemcall lib
would be overwritten. Lets hope that
this helps ...
*/
static int blablabla; /* We cannot use end, because then also
bss allocated for the systemcall lib
would be overwritten. Lets hope that
this helps ...
*/
killbss()
void killbss(void)
{
extern char *bkillbss;
register char *p = (char *) &bkillbss;
extern char* bkillbss;
register char* p = (char*)&bkillbss;
while (p < (char *) &blablabla) *p++ = 0x66;
while (p < (char*)&blablabla)
*p++ = 0x66;
}
#endif
extern int catch();
int (*handler)() = catch;
char **argv = 0;
void (*handler)(int) = catch;
char** argv = 0;
int argc = 0;
char *MainLB = 0;
char* MainLB = 0;

View file

@ -9,6 +9,7 @@
Version: $Id$
*/
#include "libm2.h"
#include <m2_traps.h>
#ifndef EM_WSIZE
@ -16,30 +17,26 @@
#define EM_PSIZE _EM_PSIZE
#endif
#if EM_WSIZE==EM_PSIZE
typedef unsigned pcnt;
#else
typedef long pcnt;
#endif
load(siz, addr, p)
register char *addr;
register pcnt siz;
void load(size_t siz, char* addr, int p)
{
/* Make sure, that a value with a size that could have been
handled by the LOI instruction ends up at the same place,
where it would, were the LOI instruction used.
handled by the LOI instruction ends up at the same place,
where it would, were the LOI instruction used.
*/
register char *q = (char *) &p;
register char* q = (char*)&p;
char t[4];
if (siz < EM_WSIZE && EM_WSIZE % siz == 0) {
if (siz < EM_WSIZE && EM_WSIZE % siz == 0)
{
/* as long as EM_WSIZE <= 4 ... */
if (siz != 2) TRP(M2_INTERNAL); /* internal error */
if (siz != 2)
TRP(M2_INTERNAL); /* internal error */
q = &t[0];
}
while (siz--) *q++ = *addr++;
if (q - t == 2) {
*((unsigned *)(&p)) = *((unsigned short *) (&t[0]));
while (siz--)
*q++ = *addr++;
if (q - t == 2)
{
*((unsigned*)(&p)) = *((unsigned short*)(&t[0]));
}
}

View file

@ -8,18 +8,11 @@
* Version: $Id$
*/
#include "libm2.h"
#include <em_abs.h>
extern TRP();
struct array_descr {
int lbound;
int n_elts_min_one;
unsigned size;
};
rcka(descr, indx)
struct array_descr *descr;
void rcka(struct array_descr* descr, int indx)
{
if (indx < 0 || indx > descr->n_elts_min_one) TRP(EARRAY);
if (indx < 0 || indx > descr->n_elts_min_one)
TRP(EARRAY);
}

View file

@ -8,16 +8,11 @@
* Version: $Id$
*/
#include "libm2.h"
#include <em_abs.h>
extern TRP();
struct range_descr {
int low, high;
};
rcki(descr, val)
struct range_descr *descr;
void rcki(struct int_range_descr* descr, int val)
{
if (val < descr->low || val > descr->high) TRP(ERANGE);
if (val < descr->low || val > descr->high)
TRP(ERANGE);
}

View file

@ -8,17 +8,11 @@
* Version: $Id$
*/
#include "libm2.h"
#include <em_abs.h>
extern TRP();
struct range_descr {
long low, high;
};
rckil(descr, val)
struct range_descr *descr;
long val;
void rckil(struct long_range_descr* descr, long val)
{
if (val < descr->low || val > descr->high) TRP(ERANGE);
if (val < descr->low || val > descr->high)
TRP(ERANGE);
}

View file

@ -8,17 +8,11 @@
* Version: $Id$
*/
#include "libm2.h"
#include <em_abs.h>
extern TRP();
struct range_descr {
unsigned low, high;
};
rcku(descr, val)
struct range_descr *descr;
unsigned val;
void rcku(struct uint_range_descr* descr, unsigned int val)
{
if (val < descr->low || val > descr->high) TRP(ERANGE);
if (val < descr->low || val > descr->high)
TRP(ERANGE);
}

View file

@ -8,17 +8,11 @@
* Version: $Id$
*/
#include "libm2.h"
#include <em_abs.h>
extern TRP();
struct range_descr {
unsigned long low, high;
};
rckul(descr, val)
struct range_descr *descr;
unsigned long val;
void rckul(struct ulong_range_descr* descr, unsigned long val)
{
if (val < descr->low || val > descr->high) TRP(ERANGE);
if (val < descr->low || val > descr->high)
TRP(ERANGE);
}

View file

@ -5,53 +5,52 @@
/*
Module: Mapping of Unix signals to EM traps
(only when not using the MON instruction)
(only when not using the MON instruction)
Author: Ceriel J.H. Jacobs
Version: $Id$
*/
#if !defined(__em22) && !defined(__em24) && !defined(__em44)
#define EM_trap(n) TRP(n) /* define to whatever is needed to cause the trap */
#define EM_trap(n) TRP(n) /* define to whatever is needed to cause the trap */
#include "libm2.h"
#include <signal.h>
#include <errno.h>
int __signo;
static int __traps[] = {
-2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2,
-2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2,
-2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2,
-2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2,
-2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2,
};
static void
__ctchsig(signo)
static void __ctchsig(int signo)
{
signal(signo,__ctchsig);
signal(signo, __ctchsig);
#ifdef __BSD4_2
sigsetmask(sigblock(0) & ~(1<<(signo - 1)));
sigsetmask(sigblock(0) & ~(1 << (signo - 1)));
#endif
__signo = signo;
EM_trap(__traps[signo]);
}
int
sigtrp(trapno, signo)
int sigtrp(int trapno, int signo)
{
/* Let Unix signal signo cause EM trap trapno to occur.
If trapno = -2, restore default,
If trapno = -3, ignore.
Return old trapnumber.
Careful, this could be -2 or -3; But return value of -1
indicates failure, with error number in errno.
If trapno = -2, restore default,
If trapno = -3, ignore.
Return old trapnumber.
Careful, this could be -2 or -3; But return value of -1
indicates failure, with error number in errno.
*/
extern int errno;
void (*ctch)() = __ctchsig;
void (*oldctch)();
void (*ctch)(int) = __ctchsig;
void (*oldctch)(int);
int oldtrap;
if (signo <= 0 || signo >= sizeof(__traps)/sizeof(__traps[0])) {
if (signo <= 0 || signo >= sizeof(__traps) / sizeof(__traps[0]))
{
errno = EINVAL;
return -1;
}
@ -62,20 +61,23 @@ sigtrp(trapno, signo)
ctch = SIG_DFL;
else if (trapno >= 0 && trapno <= 252)
;
else {
else
{
errno = EINVAL;
return -1;
}
oldtrap = __traps[signo];
if ((oldctch = signal(signo, ctch)) == (void (*)())-1) /* errno set by signal */
if ((oldctch = signal(signo, ctch)) == (void (*)()) - 1) /* errno set by signal */
return -1;
else if (oldctch == SIG_IGN) {
else if (oldctch == SIG_IGN)
{
signal(signo, SIG_IGN);
}
else __traps[signo] = trapno;
else
__traps[signo] = trapno;
return oldtrap;
}

View file

@ -8,20 +8,20 @@
Author: Ceriel J.H. Jacobs
Version: $Id$
*/
#include "libm2.h"
static unsigned prio = 0;
stackprio(n)
unsigned n;
int stackprio(unsigned int n)
{
unsigned old = prio;
if (n > prio) prio = n;
if (n > prio)
prio = n;
return old;
}
unstackprio(n)
unsigned n;
void unstackprio(unsigned int n)
{
prio = n;
}

View file

@ -9,6 +9,7 @@
Version: $Id$
*/
#include "libm2.h"
#include <m2_traps.h>
#ifndef EM_WSIZE
@ -16,28 +17,23 @@
#define EM_PSIZE _EM_PSIZE
#endif
#if EM_WSIZE==EM_PSIZE
typedef unsigned pcnt;
#else
typedef long pcnt;
#endif
store(siz, addr, p)
register char *addr;
register pcnt siz;
void store(size_t siz, char* addr, int p)
{
/* Make sure, that a value with a size that could have been
handled by the LOI instruction is handled as if it was
loaded with the LOI instruction.
handled by the LOI instruction is handled as if it was
loaded with the LOI instruction.
*/
register char *q = (char *) &p;
register char* q = (char*)&p;
char t[4];
if (siz < EM_WSIZE && EM_WSIZE % siz == 0) {
if (siz < EM_WSIZE && EM_WSIZE % siz == 0)
{
/* as long as EM_WSIZE <= 4 ... */
if (siz != 2) TRP(M2_INTERNAL); /* internal error */
*((unsigned short *) (&t[0])) = *((unsigned *) q);
if (siz != 2)
TRP(M2_INTERNAL); /* internal error */
*((unsigned short*)(&t[0])) = *((unsigned*)q);
q = &t[0];
}
while (siz--) *addr++ = *q++;
while (siz--)
*addr++ = *q++;
}

View file

@ -15,51 +15,52 @@
#define EM_LSIZE _EM_LSIZE
#endif
#include "libm2.h"
#include <m2_traps.h>
#define MAXCARD ((unsigned)-1)
#define MAXCARD ((unsigned)-1)
#if EM_WSIZE < EM_LSIZE
#define MAXLONGCARD ((unsigned long) -1L)
#define MAXLONGCARD ((unsigned long)-1L)
#endif
adduchk(a,b)
unsigned a,b;
void adduchk(unsigned int a, unsigned int b)
{
if (MAXCARD - a < b) TRP(M2_UOVFL);
if (MAXCARD - a < b)
TRP(M2_UOVFL);
}
#if EM_WSIZE < EM_LSIZE
addulchk(a,b)
unsigned long a,b;
void addulchk(unsigned long a, unsigned long b)
{
if (MAXLONGCARD - a < b) TRP(M2_UOVFL);
if (MAXLONGCARD - a < b)
TRP(M2_UOVFL);
}
#endif
muluchk(a,b)
unsigned a,b;
void muluchk(unsigned int a, unsigned int b)
{
if (a != 0 && MAXCARD/a < b) TRP(M2_UOVFL);
if (a != 0 && MAXCARD / a < b)
TRP(M2_UOVFL);
}
#if EM_WSIZE < EM_LSIZE
mululchk(a,b)
unsigned long a,b;
void mululchk(unsigned long a, unsigned long b)
{
if (a != 0 && MAXLONGCARD/a < b) TRP(M2_UOVFL);
if (a != 0 && MAXLONGCARD / a < b)
TRP(M2_UOVFL);
}
#endif
subuchk(a,b)
unsigned a,b;
void subuchk(unsigned int a, unsigned int b)
{
if (b < a) TRP(M2_UUVFL);
if (b < a)
TRP(M2_UUVFL);
}
#if EM_WSIZE < EM_LSIZE
subulchk(a,b)
unsigned long a,b;
void subulchk(unsigned long a, unsigned long b)
{
if (b < a) TRP(M2_UUVFL);
if (b < a)
TRP(M2_UUVFL);
}
#endif