mirror of
https://github.com/vishapoberon/compiler.git
synced 2026-04-07 02:12:24 +00:00
Fix Platform initialisation, move common Arg handling code from Platfrom to Modules.
This commit is contained in:
parent
aed9134e99
commit
299b0636ad
9 changed files with 99 additions and 162 deletions
|
|
@ -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);
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue