mirror of
https://github.com/vishapoberon/compiler.git
synced 2026-04-06 20:22:24 +00:00
137 lines
3.9 KiB
Modula-2
137 lines
3.9 KiB
Modula-2
MODULE ulmSYSTEM;
|
|
IMPORT SYSTEM, Unix, Sys := ulmSys;
|
|
|
|
TYPE pchar = POINTER TO ARRAY 1 OF CHAR;
|
|
pstring = POINTER TO ARRAY 1024 OF CHAR;
|
|
pstatus = POINTER TO Unix.Status;
|
|
|
|
TYPE bytearray* = ARRAY SIZE(LONGINT) OF SYSTEM.BYTE; (* need this because voc does not convert implicitly LONGINT to ARRAY OF BYTE; -- noch *)
|
|
pbytearray* = POINTER TO bytearray;
|
|
TYPE longrealarray* = ARRAY SIZE(LONGREAL) OF SYSTEM.BYTE; (* need this because voc does not convert implicitly LONGINT to ARRAY OF BYTE; -- noch *)
|
|
plongrealarray* = POINTER TO bytearray;
|
|
|
|
PROCEDURE LongToByteArr* ( l : LONGINT; VAR bar : bytearray); (* noch *)
|
|
VAR b : SYSTEM.BYTE;
|
|
p : pbytearray;
|
|
i : LONGINT;
|
|
BEGIN
|
|
p := SYSTEM.VAL(pbytearray, SYSTEM.ADR(l));
|
|
FOR i := 0 TO SIZE(LONGINT) -1 DO
|
|
b := p^[i]; bar[i] := b;
|
|
END
|
|
END LongToByteArr;
|
|
|
|
PROCEDURE LRealToByteArr* ( l : LONGREAL; VAR lar : longrealarray); (* noch *)
|
|
VAR b : SYSTEM.BYTE;
|
|
p : plongrealarray;
|
|
i : LONGINT;
|
|
BEGIN
|
|
p := SYSTEM.VAL(plongrealarray, SYSTEM.ADR(l));
|
|
FOR i := 0 TO SIZE(LONGREAL) -1 DO
|
|
b := p^[i]; lar[i] := b;
|
|
END
|
|
END LRealToByteArr;
|
|
|
|
|
|
(*
|
|
PROCEDURE -Write(adr, n: LONGINT): LONGINT
|
|
"write(1/*stdout*/, adr, n)";
|
|
|
|
PROCEDURE -read(VAR ch: CHAR): LONGINT
|
|
"read(0/*stdin*/, ch, 1)";
|
|
*)
|
|
|
|
PROCEDURE TAS*(VAR flag:BOOLEAN): BOOLEAN; (* added for compatibility with ulmSYSTEM module; noch *)
|
|
VAR oldflag : BOOLEAN;
|
|
BEGIN
|
|
oldflag := flag;
|
|
flag := TRUE;
|
|
RETURN oldflag;
|
|
END TAS;
|
|
|
|
PROCEDURE UNIXCALL*(syscall: LONGINT; VAR d0, d1: LONGINT; (* in ulm version both LONGINT and INTEGER are 4 byte size *)
|
|
arg1, arg2, arg3: LONGINT) : BOOLEAN;
|
|
VAR
|
|
n : LONGINT;
|
|
ch : CHAR;
|
|
pch : pchar;
|
|
pstr : pstring;
|
|
pst : pstatus;
|
|
BEGIN
|
|
|
|
IF syscall = Sys.read THEN
|
|
d0 := Unix.Read(SHORT(arg1), arg2, arg3);
|
|
IF d0 >= 0 THEN RETURN TRUE ELSE RETURN FALSE END
|
|
(*NEW(pch);
|
|
pch := SYSTEM.VAL(pchar, arg2);
|
|
ch := pch^[0];
|
|
n := read(ch);
|
|
IF n # 1 THEN
|
|
ch := 0X;
|
|
RETURN FALSE
|
|
ELSE
|
|
pch^[0] := ch;
|
|
RETURN TRUE
|
|
END;
|
|
*)
|
|
ELSIF syscall = Sys.write THEN
|
|
d0 := Unix.Write(SHORT(arg1), arg2, arg3);
|
|
IF d0 >= 0 THEN RETURN TRUE ELSE RETURN FALSE END
|
|
(*NEW(pch);
|
|
pch := SYSTEM.VAL(pchar, arg2);
|
|
n := Write(SYSTEM.VAL(LONGINT, pch), 1);
|
|
IF n # 1 THEN RETURN FALSE ELSE RETURN TRUE END
|
|
*)
|
|
ELSIF syscall = Sys.open THEN
|
|
pstr := SYSTEM.VAL(pstring, arg1);
|
|
d0 := Unix.Open(pstr^, SHORT(arg3), arg2);
|
|
IF d0 >= 0 THEN RETURN TRUE ELSE RETURN FALSE END
|
|
ELSIF syscall = Sys.close THEN
|
|
d0 := Unix.Close(SHORT(arg1));
|
|
IF d0 = 0 THEN RETURN TRUE ELSE RETURN FALSE END
|
|
ELSIF syscall = Sys.lseek THEN
|
|
d0 := Unix.Lseek(SHORT(arg1), arg2, SHORT(arg3));
|
|
IF d0 >= 0 THEN RETURN TRUE ELSE RETURN FALSE END
|
|
ELSIF syscall = Sys.ioctl THEN
|
|
d0 := Unix.Ioctl(SHORT(arg1), SHORT(arg2), arg3);
|
|
RETURN d0 >= 0;
|
|
ELSIF syscall = Sys.fcntl THEN
|
|
d0 := Unix.Fcntl (SHORT(arg1), SHORT(arg2), arg3);
|
|
RETURN d0 >= 0;
|
|
ELSIF syscall = Sys.dup THEN
|
|
d0 := Unix.Dup(SHORT(arg1));
|
|
RETURN d0 > 0;
|
|
ELSIF syscall = Sys.pipe THEN
|
|
d0 := Unix.Pipe(arg1);
|
|
RETURN d0 >= 0;
|
|
ELSIF syscall = Sys.newstat THEN
|
|
pst := SYSTEM.VAL(pstatus, arg2);
|
|
pstr := SYSTEM.VAL(pstring, arg1);
|
|
d0 := Unix.Stat(pstr^, pst^);
|
|
RETURN d0 >= 0
|
|
ELSIF syscall = Sys.newfstat THEN
|
|
pst := SYSTEM.VAL(pstatus, arg2);
|
|
d0 := Unix.Fstat(SHORT(arg1), pst^);
|
|
RETURN d0 >= 0;
|
|
END
|
|
|
|
END UNIXCALL;
|
|
|
|
|
|
PROCEDURE UNIXFORK(VAR pid: LONGINT) : BOOLEAN;
|
|
BEGIN
|
|
|
|
END UNIXFORK;
|
|
|
|
PROCEDURE UNIXSIGNAL(signo: INTEGER; p: PROCEDURE;
|
|
VAR old: PROCEDURE; VAR error: INTEGER) : BOOLEAN;
|
|
BEGIN
|
|
|
|
END UNIXSIGNAL;
|
|
|
|
PROCEDURE WMOVE*(from, to, n : LONGINT);
|
|
VAR l : LONGINT;
|
|
BEGIN
|
|
SYSTEM.MOVE(from, to, n);
|
|
END WMOVE;
|
|
END ulmSYSTEM.
|