Fix Platform initialisation, move common Arg handling code from Platfrom to Modules.

This commit is contained in:
David Brown 2016-12-01 18:08:08 +00:00
parent aed9134e99
commit 299b0636ad
9 changed files with 99 additions and 162 deletions

View file

@ -3,7 +3,7 @@ MODULE Modules; (* jt 6.1.96 *)
(* access to list of modules and commands, based on ETH Oberon *)
IMPORT SYSTEM, Heap, Platform;
IMPORT SYSTEM, Platform, Heap; (* Note, must import Platform before Heap *)
CONST
ModNameLen* = 20;
@ -35,6 +35,66 @@ MODULE Modules; (* jt 6.1.96 *)
resMsg*: ARRAY 256 OF CHAR;
imported*, importing*: ModuleName;
MainStackFrame-: SYSTEM.ADDRESS;
ArgCount-: INTEGER;
ArgVector-: SYSTEM.ADDRESS;
(* Program startup *)
PROCEDURE -ExternInitHeap "extern void Heap_InitHeap();";
PROCEDURE -InitHeap "Heap_InitHeap()";
PROCEDURE -ExternInitModulesInit "extern void *Modules__init(void);";
PROCEDURE -ModulesInit() "Modules__init()";
PROCEDURE Init*(argc: SYSTEM.INT32; argvadr: SYSTEM.ADDRESS);
(* This start code is called by the __INIT macro generated by the compiler
as the C main program. *)
TYPE ArgVecPtr = POINTER TO ARRAY 1 OF SYSTEM.ADDRESS;
VAR av: ArgVecPtr;
BEGIN
MainStackFrame := argvadr;
ArgCount := SYSTEM.VAL(INTEGER, argc);
av := SYSTEM.VAL(ArgVecPtr, argvadr);
ArgVector := av[0];
InitHeap; (* Initailse heap varaibles neded for compiler generated *__inits *)
ModulesInit(); (* Our own __init code will run the Platform and Heap __init code. *)
END Init;
PROCEDURE GetArg*(n: INTEGER; VAR val: ARRAY OF CHAR);
TYPE
ArgPtr = POINTER TO ARRAY 1024 OF CHAR;
ArgVec = POINTER TO ARRAY 1024 OF ArgPtr;
VAR av: ArgVec;
BEGIN
IF n < ArgCount THEN
av := SYSTEM.VAL(ArgVec, ArgVector);
COPY(av[n]^, val)
END
END GetArg;
PROCEDURE GetIntArg*(n: INTEGER; VAR val: LONGINT);
VAR s: ARRAY 64 OF CHAR; k, d, i: LONGINT;
BEGIN
s := ""; GetArg(n, s); i := 0;
IF s[0] = "-" THEN i := 1 END ;
k := 0; d := ORD(s[i]) - ORD("0");
WHILE (d >= 0 ) & (d <= 9) DO k := k*10 + d; INC(i); d := ORD(s[i]) - ORD("0") END ;
IF s[0] = "-" THEN k := -k; DEC(i) END ;
IF i > 0 THEN val := k END
END GetIntArg;
PROCEDURE ArgPos*(s: ARRAY OF CHAR): INTEGER;
VAR i: INTEGER; arg: ARRAY 256 OF CHAR;
BEGIN
i := 0; GetArg(i, arg);
WHILE (i < ArgCount) & (s # arg) DO INC(i); GetArg(i, arg) END ;
RETURN i
END ArgPos;
PROCEDURE Append(VAR a: ARRAY OF CHAR; b: ARRAY OF CHAR);
VAR i, j: INTEGER;
@ -95,7 +155,7 @@ MODULE Modules; (* jt 6.1.96 *)
PROCEDURE errch(c: CHAR); (* Here we favour simplicity over efficiency, so no buffering. *)
VAR e: Platform.ErrorCode;
BEGIN e := Platform.Write(1, SYSTEM.ADR(c), 1)
BEGIN e := Platform.Write(Platform.StdOut, SYSTEM.ADR(c), 1)
END errch;
PROCEDURE errstring(s: ARRAY OF CHAR);