Lay-out changes and made IMPORTS more specific

This commit is contained in:
ceriel 1991-03-05 13:47:08 +00:00
parent ac83fe3815
commit 3a715f5479
16 changed files with 217 additions and 207 deletions

View file

@ -10,7 +10,7 @@ IMPLEMENTATION MODULE ArraySort;
Author: Ceriel J.H. Jacobs
Version: $Header$
*)
FROM SYSTEM IMPORT ADDRESS, BYTE; (* no generics in Modula-2, sorry *)
FROM SYSTEM IMPORT ADDRESS, BYTE; (* no generics in Modula-2, sorry *)
TYPE BytePtr = POINTER TO BYTE;
@ -153,4 +153,3 @@ IMPLEMENTATION MODULE ArraySort;
END threewayexchange;
END ArraySort.

View file

@ -14,7 +14,7 @@ IMPLEMENTATION MODULE CSP;
FROM random IMPORT Uniform;
FROM SYSTEM IMPORT BYTE, ADDRESS, NEWPROCESS, TRANSFER;
FROM Storage IMPORT Allocate, Deallocate;
IMPORT Traps;
FROM Traps IMPORT Message;
CONST WorkSpaceSize = 1000;
@ -212,7 +212,7 @@ IMPLEMENTATION MODULE CSP;
BEGIN
WITH ch^ DO
IF owner # NIL THEN
Traps.Message("Channel already has an owner");
Message("Channel already has an owner");
HALT
END;
owner := cp
@ -251,7 +251,7 @@ IMPLEMENTATION MODULE CSP;
BEGIN
WITH ch^ DO
IF cp # owner THEN
Traps.Message("Only owner of channel can receive from it");
Message("Only owner of channel can receive from it");
HALT
END;
IF Sending(ch) THEN

View file

@ -11,9 +11,11 @@ IMPLEMENTATION MODULE InOut ;
Version: $Header$
*)
IMPORT Streams;
IMPORT Conversions;
IMPORT Traps;
IMPORT Streams;
FROM Conversions IMPORT
ConvertCardinal, ConvertInteger,
ConvertOctal, ConvertHex;
FROM Traps IMPORT Message;
CONST TAB = 11C;
@ -190,7 +192,7 @@ IMPLEMENTATION MODULE InOut ;
IF (int > SAFELIMITDIV10) OR
( (int = SAFELIMITDIV10) AND
(chvalue > safedigit)) THEN
Traps.Message("integer too large");
Message("integer too large");
HALT;
ELSE
int := 10*int + VAL(INTEGER, chvalue);
@ -203,7 +205,7 @@ IMPLEMENTATION MODULE InOut ;
integ := int
END;
IF buf[index] > " " THEN
Traps.Message("illegal integer");
Message("illegal integer");
HALT;
END;
Done := TRUE;
@ -235,7 +237,7 @@ IMPLEMENTATION MODULE InOut ;
IF (int > SAFELIMITDIV10) OR
( (int = SAFELIMITDIV10) AND
(chvalue > safedigit)) THEN
Traps.Message("cardinal too large");
Message("cardinal too large");
HALT;
ELSE
int := 10*int + chvalue;
@ -243,7 +245,7 @@ IMPLEMENTATION MODULE InOut ;
END;
END;
IF buf[index] > " " THEN
Traps.Message("illegal cardinal");
Message("illegal cardinal");
HALT;
END;
card := int;
@ -318,7 +320,7 @@ IMPLEMENTATION MODULE InOut ;
VAR
buf : numbuf;
BEGIN
Conversions.ConvertCardinal(card, width, buf);
ConvertCardinal(card, width, buf);
WriteString(buf);
END WriteCard;
@ -326,7 +328,7 @@ IMPLEMENTATION MODULE InOut ;
VAR
buf : numbuf;
BEGIN
Conversions.ConvertInteger(int, width, buf);
ConvertInteger(int, width, buf);
WriteString(buf);
END WriteInt;
@ -334,7 +336,7 @@ IMPLEMENTATION MODULE InOut ;
VAR
buf : numbuf;
BEGIN
Conversions.ConvertHex(card, width, buf);
ConvertHex(card, width, buf);
WriteString(buf);
END WriteHex;
@ -347,7 +349,7 @@ IMPLEMENTATION MODULE InOut ;
VAR
buf : numbuf;
BEGIN
Conversions.ConvertOctal(card, width, buf);
ConvertOctal(card, width, buf);
WriteString(buf);
END WriteOct;

View file

@ -11,41 +11,41 @@ IMPLEMENTATION MODULE MathLib0;
Version: $Header$
*)
IMPORT Mathlib;
IMPORT Mathlib;
PROCEDURE cos(arg: REAL): REAL;
BEGIN
PROCEDURE cos(arg: REAL): REAL;
BEGIN
RETURN Mathlib.cos(arg);
END cos;
END cos;
PROCEDURE sin(arg: REAL): REAL;
BEGIN
PROCEDURE sin(arg: REAL): REAL;
BEGIN
RETURN Mathlib.sin(arg);
END sin;
END sin;
PROCEDURE arctan(arg: REAL): REAL;
BEGIN
PROCEDURE arctan(arg: REAL): REAL;
BEGIN
RETURN Mathlib.arctan(arg);
END arctan;
END arctan;
PROCEDURE sqrt(arg: REAL): REAL;
BEGIN
PROCEDURE sqrt(arg: REAL): REAL;
BEGIN
RETURN Mathlib.sqrt(arg);
END sqrt;
END sqrt;
PROCEDURE ln(arg: REAL): REAL;
BEGIN
PROCEDURE ln(arg: REAL): REAL;
BEGIN
RETURN Mathlib.ln(arg);
END ln;
END ln;
PROCEDURE exp(arg: REAL): REAL;
BEGIN
PROCEDURE exp(arg: REAL): REAL;
BEGIN
RETURN Mathlib.exp(arg);
END exp;
END exp;
PROCEDURE entier(x: REAL): INTEGER;
PROCEDURE entier(x: REAL): INTEGER;
VAR i: INTEGER;
BEGIN
BEGIN
IF x < 0.0 THEN
i := TRUNC(-x);
IF FLOAT(i) = -x THEN
@ -55,15 +55,15 @@ BEGIN
END;
END;
RETURN TRUNC(x);
END entier;
END entier;
PROCEDURE real(x: INTEGER): REAL;
BEGIN
PROCEDURE real(x: INTEGER): REAL;
BEGIN
IF x < 0 THEN
RETURN - FLOAT(-x);
END;
RETURN FLOAT(x);
END real;
END real;
BEGIN
END MathLib0.

View file

@ -11,8 +11,8 @@ IMPLEMENTATION MODULE Mathlib;
Version: $Header$
*)
FROM EM IMPORT FIF, FEF;
FROM Traps IMPORT Message;
FROM EM IMPORT FIF, FEF;
FROM Traps IMPORT Message;
CONST
OneRadianInDegrees = 57.295779513082320876798155D;

View file

@ -11,14 +11,16 @@ IMPLEMENTATION MODULE PascalIO;
Version: $Header$
*)
IMPORT Conversions;
IMPORT Traps;
IMPORT RealConversions;
FROM Streams IMPORT Stream, StreamKind, StreamMode, StreamResult,
InputStream, OutputStream, OpenStream, CloseStream,
EndOfStream, Read, Write, StreamBuffering;
FROM Storage IMPORT Allocate;
FROM SYSTEM IMPORT ADR;
FROM Conversions IMPORT
ConvertInteger, ConvertCardinal;
FROM RealConversions IMPORT
LongRealToString, StringToLongReal;
FROM Traps IMPORT Message;
FROM Streams IMPORT Stream, StreamKind, StreamMode, StreamResult,
InputStream, OutputStream, OpenStream, CloseStream,
EndOfStream, Read, Write, StreamBuffering;
FROM Storage IMPORT Allocate;
FROM SYSTEM IMPORT ADR;
TYPE charset = SET OF CHAR;
btype = (Preading, Pwriting, free);
@ -46,7 +48,7 @@ IMPLEMENTATION MODULE PascalIO;
WITH InputText^ DO
OpenStream(stream, Filename, text, reading, result);
IF result # succeeded THEN
Traps.Message("could not open input file");
Message("could not open input file");
HALT;
END;
type := Preading;
@ -62,7 +64,7 @@ IMPLEMENTATION MODULE PascalIO;
WITH OutputText^ DO
OpenStream(stream, Filename, text, writing, result);
IF result # succeeded THEN
Traps.Message("could not open output file");
Message("could not open output file");
HALT;
END;
type := Pwriting;
@ -107,9 +109,9 @@ IMPLEMENTATION MODULE PascalIO;
PROCEDURE Error(tp: btype);
BEGIN
IF tp = Preading THEN
Traps.Message("input text expected");
Message("input text expected");
ELSE
Traps.Message("output text expected");
Message("output text expected");
END;
HALT;
END Error;
@ -118,7 +120,7 @@ IMPLEMENTATION MODULE PascalIO;
BEGIN
ch := NextChar(InputText);
IF InputText^.eof THEN
Traps.Message("unexpected EOF");
Message("unexpected EOF");
HALT;
END;
InputText^.done := FALSE;
@ -218,7 +220,7 @@ IMPLEMENTATION MODULE PascalIO;
IF (int < -SAFELIMITDIV10) OR
( (int = -SAFELIMITDIV10) AND
(chvalue > safedigit)) THEN
Traps.Message("integer too large");
Message("integer too large");
HALT;
ELSE
int := 10*int - VAL(INTEGER, chvalue);
@ -230,7 +232,7 @@ IMPLEMENTATION MODULE PascalIO;
int := -int
END;
ELSE
Traps.Message("integer expected");
Message("integer expected");
HALT;
END;
END ReadInteger;
@ -257,7 +259,7 @@ IMPLEMENTATION MODULE PascalIO;
IF (card > SAFELIMITDIV10) OR
( (card = SAFELIMITDIV10) AND
(chvalue > safedigit)) THEN
Traps.Message("cardinal too large");
Message("cardinal too large");
HALT;
ELSE
card := 10*card + chvalue;
@ -266,7 +268,7 @@ IMPLEMENTATION MODULE PascalIO;
END;
END;
ELSE
Traps.Message("cardinal expected");
Message("cardinal expected");
HALT;
END;
END ReadCardinal;
@ -335,10 +337,10 @@ IMPLEMENTATION MODULE PascalIO;
END;
IF ok THEN
buf[index] := 0C;
RealConversions.StringToLongReal(buf, real, ok);
StringToLongReal(buf, real, ok);
END;
IF NOT ok THEN
Traps.Message("Illegal real");
Message("Illegal real");
HALT;
END;
END ReadLongReal;
@ -347,7 +349,7 @@ IMPLEMENTATION MODULE PascalIO;
VAR
buf : numbuf;
BEGIN
Conversions.ConvertCardinal(card, 1, buf);
ConvertCardinal(card, 1, buf);
WriteString(OutputText, buf, width);
END WriteCardinal;
@ -355,7 +357,7 @@ IMPLEMENTATION MODULE PascalIO;
VAR
buf : numbuf;
BEGIN
Conversions.ConvertInteger(int, 1, buf);
ConvertInteger(int, 1, buf);
WriteString(OutputText, buf, width);
END WriteInteger;
@ -383,7 +385,7 @@ IMPLEMENTATION MODULE PascalIO;
width := SIZE(buf);
END;
IF nfrac > 0 THEN
RealConversions.LongRealToString(real, width, nfrac, buf, ok);
LongRealToString(real, width, nfrac, buf, ok);
ELSE
IF width < 9 THEN width := 9; END;
IF real < 0.0D THEN
@ -391,7 +393,7 @@ IMPLEMENTATION MODULE PascalIO;
ELSE
digits := 6 - INTEGER(width);
END;
RealConversions.LongRealToString(real, width, digits, buf, ok);
LongRealToString(real, width, digits, buf, ok);
END;
WriteString(OutputText, buf, 0);
END WriteLongReal;

View file

@ -6,11 +6,9 @@ IMPLEMENTATION MODULE Processes [1];
Version: $Header$
*)
FROM SYSTEM IMPORT ADDRESS, TSIZE, NEWPROCESS, TRANSFER;
FROM Storage IMPORT Allocate;
FROM Traps IMPORT Message;
FROM SYSTEM IMPORT ADDRESS, TSIZE, NEWPROCESS, TRANSFER;
FROM Storage IMPORT Allocate;
FROM Traps IMPORT Message;
TYPE SIGNAL = POINTER TO ProcessDescriptor;

View file

@ -11,10 +11,11 @@ IMPLEMENTATION MODULE RealInOut;
Version: $Header$
*)
IMPORT InOut;
IMPORT RealConversions;
IMPORT Traps;
FROM SYSTEM IMPORT WORD;
FROM InOut IMPORT ReadString, WriteString, WriteOct;
FROM Traps IMPORT Message;
FROM SYSTEM IMPORT WORD;
FROM RealConversions IMPORT
LongRealToString, StringToLongReal;
CONST MAXNDIG = 32;
MAXWIDTH = MAXNDIG+7;
@ -32,8 +33,8 @@ IMPLEMENTATION MODULE RealInOut;
BEGIN
IF ndigits > MAXWIDTH THEN ndigits := MAXWIDTH; END;
IF ndigits < 10 THEN ndigits := 10; END;
RealConversions.LongRealToString(arg, ndigits, -INTEGER(ndigits - 7), buf, ok);
InOut.WriteString(buf);
LongRealToString(arg, ndigits, -INTEGER(ndigits - 7), buf, ok);
WriteString(buf);
END WriteLongReal;
PROCEDURE WriteFixPt(arg: REAL; n, k: CARDINAL);
@ -47,8 +48,8 @@ IMPLEMENTATION MODULE RealInOut;
BEGIN
IF n > MAXWIDTH THEN n := MAXWIDTH END;
RealConversions.LongRealToString(arg, n, k, buf, ok);
InOut.WriteString(buf);
LongRealToString(arg, n, k, buf, ok);
WriteString(buf);
END WriteLongFixPt;
PROCEDURE ReadReal(VAR x: REAL);
@ -63,10 +64,10 @@ IMPLEMENTATION MODULE RealInOut;
ok: BOOLEAN;
BEGIN
InOut.ReadString(Buf);
RealConversions.StringToLongReal(Buf, x, ok);
ReadString(Buf);
StringToLongReal(Buf, x, ok);
IF NOT ok THEN
Traps.Message("real expected");
Message("real expected");
HALT;
END;
Done := TRUE;
@ -76,8 +77,8 @@ IMPLEMENTATION MODULE RealInOut;
VAR i: CARDINAL;
BEGIN
FOR i := 0 TO HIGH(x) DO
InOut.WriteOct(CARDINAL(x[i]), 0);
InOut.WriteString(" ");
WriteOct(CARDINAL(x[i]), 0);
WriteString(" ");
END;
END wroct;

View file

@ -13,10 +13,10 @@ IMPLEMENTATION MODULE Semaphores [1];
Quasi-concurrency implementation
*)
FROM SYSTEM IMPORT ADDRESS, NEWPROCESS, TRANSFER;
FROM Storage IMPORT Allocate;
FROM random IMPORT Uniform;
FROM Traps IMPORT Message;
FROM SYSTEM IMPORT ADDRESS, NEWPROCESS, TRANSFER;
FROM Storage IMPORT Allocate;
FROM random IMPORT Uniform;
FROM Traps IMPORT Message;
TYPE Sema = POINTER TO Semaphore;
Processes = POINTER TO Process;

View file

@ -15,9 +15,9 @@ IMPLEMENTATION MODULE Storage;
same size. Commonly used sizes have their own bucket. The larger ones
are put in a single list.
*)
FROM Unix IMPORT sbrk, ILLBREAK;
FROM SYSTEM IMPORT ADDRESS, ADR;
FROM Traps IMPORT Message;
FROM Unix IMPORT sbrk, ILLBREAK;
FROM SYSTEM IMPORT ADDRESS, ADR;
FROM Traps IMPORT Message;
CONST
NLISTS = 20;

View file

@ -14,8 +14,11 @@ IMPLEMENTATION MODULE Streams;
Implementation for Unix
*)
FROM SYSTEM IMPORT BYTE, ADR;
IMPORT StripUnix, Storage, Epilogue;
FROM SYSTEM IMPORT BYTE, ADR;
FROM Epilogue IMPORT CallAtEnd;
FROM Storage IMPORT Allocate, Available;
FROM StripUnix IMPORT
open, close, lseek, read, write, creat, ioctl;
CONST BUFSIZ = 1024; (* tunable *)
TYPE IOB = RECORD
@ -41,10 +44,10 @@ IMPLEMENTATION MODULE Streams;
stream := stream^.next;
END;
IF stream = NIL THEN
IF NOT Storage.Available(SIZE(IOB)) THEN
IF NOT Available(SIZE(IOB)) THEN
RETURN;
END;
Storage.Allocate(stream,SIZE(IOB));
Allocate(stream,SIZE(IOB));
stream^.next := head;
head := stream;
END;
@ -79,17 +82,17 @@ IMPLEMENTATION MODULE Streams;
buf[HIGH(filename)+2] := BYTE(0C);
END;
IF (mode = reading) THEN
fd := StripUnix.open(ADR(stream^.buf), 0);
fd := open(ADR(stream^.buf), 0);
ELSE
fd := -1;
IF (mode = appending) THEN
fd := StripUnix.open(ADR(stream^.buf), 1);
fd := open(ADR(stream^.buf), 1);
IF fd >= 0 THEN
IF (StripUnix.lseek(fd, 0D , 2) < 0D) THEN ; END;
IF (lseek(fd, 0D , 2) < 0D) THEN ; END;
END;
END;
IF fd < 0 THEN
fd := StripUnix.creat(ADR(stream^.buf), 666B);
fd := creat(ADR(stream^.buf), 666B);
END;
END;
IF fd < 0 THEN
@ -150,7 +153,7 @@ IMPLEMENTATION MODULE Streams;
IF (cnt > 0) THEN
cnt1 := cnt;
cnt := 0;
IF StripUnix.write(fildes, ADR(buf), cnt1) < 0 THEN END;
IF write(fildes, ADR(buf), cnt1) < 0 THEN END;
END;
END;
END FlushStream;
@ -162,7 +165,7 @@ IMPLEMENTATION MODULE Streams;
IF stream^.mode # reading THEN
FlushStream(stream, result);
END;
IF StripUnix.close(stream^.fildes) < 0 THEN ; END;
IF close(stream^.fildes) < 0 THEN ; END;
freestruct(stream);
ELSE
result := nostream;
@ -209,7 +212,7 @@ IMPLEMENTATION MODULE Streams;
IF stream = InputStream THEN
FlushLineBuffers();
END;
maxcnt := StripUnix.read(fildes, ADR(buf), bufferedcnt);
maxcnt := read(fildes, ADR(buf), bufferedcnt);
cnt := 1;
IF maxcnt <= 0 THEN
eof := TRUE;
@ -332,7 +335,7 @@ IMPLEMENTATION MODULE Streams;
RETURN;
END;
IF (s^.mode # reading) THEN FlushStream(s, result); END;
position := StripUnix.lseek(s^.fildes, 0D, 1);
position := lseek(s^.fildes, 0D, 1);
IF position < 0D THEN
result := illegaloperation;
RETURN;
@ -357,7 +360,7 @@ IMPLEMENTATION MODULE Streams;
s^.eof := FALSE;
END;
IF s^.mode = appending THEN
currpos := StripUnix.lseek(s^.fildes, 0D, 1);
currpos := lseek(s^.fildes, 0D, 1);
IF currpos < 0D THEN
result := illegaloperation;
RETURN;
@ -367,7 +370,7 @@ IMPLEMENTATION MODULE Streams;
result := illegaloperation;
RETURN;
END;
currpos := StripUnix.lseek(s^.fildes, position, 0);
currpos := lseek(s^.fildes, position, 0);
IF currpos < 0D THEN
result := illegaloperation;
RETURN;
@ -383,12 +386,12 @@ IMPLEMENTATION MODULE Streams;
RETURN FALSE;
END;
#ifdef __USG
RETURN StripUnix.ioctl(stream^.fildes, INTEGER(ORD('T') * 256 + 1), ADR(buf)) >= 0;
RETURN ioctl(stream^.fildes, INTEGER(ORD('T') * 256 + 1), ADR(buf)) >= 0;
#else
#ifdef __BSD4_2
RETURN StripUnix.ioctl(stream^.fildes, INTEGER(ORD('t') * 256 + 8 + 6*65536 + 40000000H), ADR(buf)) >= 0;
RETURN ioctl(stream^.fildes, INTEGER(ORD('t') * 256 + 8 + 6*65536 + 40000000H), ADR(buf)) >= 0;
#else
RETURN StripUnix.ioctl(stream^.fildes, INTEGER(ORD('t') * 256 + 8), ADR(buf)) >= 0;
RETURN ioctl(stream^.fildes, INTEGER(ORD('t') * 256 + 8), ADR(buf)) >= 0;
#endif
#endif
END isatty;
@ -440,7 +443,7 @@ IMPLEMENTATION MODULE Streams;
END;
END;
head := InputStream;
IF Epilogue.CallAtEnd(EndIt) THEN ; END;
IF CallAtEnd(EndIt) THEN ; END;
END InitStreams;
BEGIN

View file

@ -11,12 +11,12 @@ IMPLEMENTATION MODULE Strings;
Version: $Header$
*)
PROCEDURE Assign(source: ARRAY OF CHAR; VAR dest: ARRAY OF CHAR);
(* Assign string source to dest
*)
VAR i: CARDINAL;
PROCEDURE Assign(source: ARRAY OF CHAR; VAR dest: ARRAY OF CHAR);
(* Assign string source to dest
*)
VAR i: CARDINAL;
max: CARDINAL;
BEGIN
BEGIN
max := HIGH(source);
IF HIGH(dest) < max THEN max := HIGH(dest); END;
i := 0;
@ -25,15 +25,15 @@ BEGIN
INC(i);
END;
IF i < HIGH(dest) THEN dest[i] := 0C; END;
END Assign;
END Assign;
PROCEDURE Insert(substr: ARRAY OF CHAR; VAR str: ARRAY OF CHAR; inx: CARDINAL);
(* Insert the string substr into str, starting at str[inx].
If inx is equal to or greater than Length(str) then substr is appended
to the end of str.
*)
VAR sublen, length, i: CARDINAL;
BEGIN
PROCEDURE Insert(substr: ARRAY OF CHAR; VAR str: ARRAY OF CHAR; inx: CARDINAL);
(* Insert the string substr into str, starting at str[inx].
If inx is equal to or greater than Length(str) then substr is appended
to the end of str.
*)
VAR sublen, length, i: CARDINAL;
BEGIN
sublen := Length(substr);
IF sublen = 0 THEN RETURN; END;
length := Length(str);
@ -54,16 +54,16 @@ BEGIN
IF length + sublen <= HIGH(str) THEN
str[length + sublen] := 0C;
END;
END Insert;
END Insert;
PROCEDURE Delete(VAR str: ARRAY OF CHAR; inx, len: CARDINAL);
(* Delete len characters from str, starting at str[inx].
If inx >= Length(str) then nothing happens.
If there are not len characters to delete, characters to the end of the
string are deleted.
*)
VAR length: CARDINAL;
BEGIN
PROCEDURE Delete(VAR str: ARRAY OF CHAR; inx, len: CARDINAL);
(* Delete len characters from str, starting at str[inx].
If inx >= Length(str) then nothing happens.
If there are not len characters to delete, characters to the end of the
string are deleted.
*)
VAR length: CARDINAL;
BEGIN
IF len = 0 THEN RETURN; END;
length := Length(str);
IF inx >= length THEN RETURN; END;
@ -72,14 +72,14 @@ BEGIN
INC(inx);
END;
str[inx] := 0C;
END Delete;
END Delete;
PROCEDURE Pos(substr, str: ARRAY OF CHAR): CARDINAL;
(* Return the index into str of the first occurrence of substr.
Pos returns a value greater than HIGH(str) of no occurrence is found.
*)
VAR i, j, max, subl: CARDINAL;
BEGIN
PROCEDURE Pos(substr, str: ARRAY OF CHAR): CARDINAL;
(* Return the index into str of the first occurrence of substr.
Pos returns a value greater than HIGH(str) of no occurrence is found.
*)
VAR i, j, max, subl: CARDINAL;
BEGIN
max := Length(str);
subl := Length(substr);
IF subl > max THEN RETURN HIGH(str) + 1; END;
@ -93,15 +93,15 @@ BEGIN
IF j = subl THEN RETURN i; END;
END;
RETURN HIGH(str) + 1;
END Pos;
END Pos;
PROCEDURE Copy(str: ARRAY OF CHAR;
inx, len: CARDINAL;
VAR result: ARRAY OF CHAR);
(* Copy at most len characters from str into result, starting at str[inx].
*)
VAR i: CARDINAL;
BEGIN
PROCEDURE Copy(str: ARRAY OF CHAR;
inx, len: CARDINAL;
VAR result: ARRAY OF CHAR);
(* Copy at most len characters from str into result, starting at str[inx].
*)
VAR i: CARDINAL;
BEGIN
IF Length(str) <= inx THEN RETURN END;
i := 0;
LOOP
@ -112,13 +112,13 @@ BEGIN
INC(i); INC(inx); DEC(len);
END;
IF i <= HIGH(result) THEN result[i] := 0C; END;
END Copy;
END Copy;
PROCEDURE Concat(s1, s2: ARRAY OF CHAR; VAR result: ARRAY OF CHAR);
(* Concatenate two strings.
*)
VAR i, j: CARDINAL;
BEGIN
PROCEDURE Concat(s1, s2: ARRAY OF CHAR; VAR result: ARRAY OF CHAR);
(* Concatenate two strings.
*)
VAR i, j: CARDINAL;
BEGIN
i := 0;
WHILE (i <= HIGH(s1)) AND (s1[i] # 0C) DO
IF i > HIGH(result) THEN RETURN END;
@ -133,27 +133,27 @@ BEGIN
INC(j);
END;
IF i <= HIGH(result) THEN result[i] := 0C; END;
END Concat;
END Concat;
PROCEDURE Length(str: ARRAY OF CHAR): CARDINAL;
(* Return number of characters in str.
*)
VAR i: CARDINAL;
BEGIN
PROCEDURE Length(str: ARRAY OF CHAR): CARDINAL;
(* Return number of characters in str.
*)
VAR i: CARDINAL;
BEGIN
i := 0;
WHILE (i <= HIGH(str)) DO
IF str[i] = 0C THEN RETURN i; END;
INC(i);
END;
RETURN i;
END Length;
END Length;
PROCEDURE CompareStr(s1, s2: ARRAY OF CHAR): INTEGER;
(* Compare two strings, return -1 if s1 < s2, 0 if s1 = s2, and 1 if s1 > s2.
*)
VAR i: CARDINAL;
PROCEDURE CompareStr(s1, s2: ARRAY OF CHAR): INTEGER;
(* Compare two strings, return -1 if s1 < s2, 0 if s1 = s2, and 1 if s1 > s2.
*)
VAR i: CARDINAL;
max: CARDINAL;
BEGIN
BEGIN
max := HIGH(s1);
IF HIGH(s2) < max THEN max := HIGH(s2); END;
i := 0;
@ -166,6 +166,6 @@ BEGIN
IF (i <= HIGH(s1)) AND (s1[i] # 0C) THEN RETURN 1; END;
IF (i <= HIGH(s2)) AND (s2[i] # 0C) THEN RETURN -1; END;
RETURN 0;
END CompareStr;
END CompareStr;
END Strings.

View file

@ -13,9 +13,10 @@
IMPLEMENTATION MODULE Termcap;
IMPORT XXTermcap;
FROM SYSTEM IMPORT ADR, ADDRESS;
FROM Unix IMPORT gtty;
FROM Arguments IMPORT GetEnv;
FROM SYSTEM IMPORT ADR, ADDRESS;
FROM Unix IMPORT gtty;
FROM Arguments IMPORT
GetEnv;
TYPE STR = ARRAY[1..32] OF CHAR;
STRCAP = POINTER TO STR;

View file

@ -13,9 +13,12 @@ IMPLEMENTATION MODULE Terminal;
Implementation for Unix.
*)
IMPORT Unix;
FROM SYSTEM IMPORT ADR;
FROM SYSTEM IMPORT ADR;
#ifdef __USG
FROM Unix IMPORT read, write, open, fcntl;
#else
FROM Unix IMPORT read, write, open, ioctl;
#endif
VAR fildes: INTEGER;
unreadch: CHAR;
unread: BOOLEAN;
@ -27,7 +30,7 @@ IMPLEMENTATION MODULE Terminal;
ch := unreadch;
unread := FALSE
ELSE
IF Unix.read(fildes, ADR(ch), 1) < 0 THEN
IF read(fildes, ADR(ch), 1) < 0 THEN
;
END;
END;
@ -42,25 +45,25 @@ IMPLEMENTATION MODULE Terminal;
unread := FALSE
ELSE
#ifdef __USG
l := Unix.fcntl(fildes, (*FGETFL*) 3, 0);
IF Unix.fcntl(fildes,
l := fcntl(fildes, (*FGETFL*) 3, 0);
IF fcntl(fildes,
(* FSETFL *) 4,
l + (*ONDELAY*) 2) < 0 THEN
;
END;
IF Unix.read(fildes, ADR(ch), 1) = 0 THEN
IF read(fildes, ADR(ch), 1) = 0 THEN
ch := 0C;
ELSE
unreadch := ch;
END;
IF Unix.fcntl(fildes, (*FSETFL*)4, l) < 0 THEN
IF fcntl(fildes, (*FSETFL*)4, l) < 0 THEN
;
END;
#else
#ifdef __BSD4_2
IF Unix.ioctl(fildes, INTEGER(ORD('f')*256+127+4*65536+40000000H), ADR(l)) < 0 THEN
IF ioctl(fildes, INTEGER(ORD('f')*256+127+4*65536+40000000H), ADR(l)) < 0 THEN
#else
IF Unix.ioctl(fildes, INTEGER(ORD('f')*256+127), ADR(l)) < 0 THEN
IF ioctl(fildes, INTEGER(ORD('f')*256+127), ADR(l)) < 0 THEN
#endif
;
END;
@ -68,7 +71,7 @@ IMPLEMENTATION MODULE Terminal;
IF l = 0 THEN
ch := 0C;
ELSE
IF Unix.read(fildes, ADR(ch), 1) < 0 THEN
IF read(fildes, ADR(ch), 1) < 0 THEN
;
END;
unreadch := ch;
@ -84,7 +87,7 @@ IMPLEMENTATION MODULE Terminal;
PROCEDURE Write(ch: CHAR);
BEGIN
IF Unix.write(fildes, ADR(ch), 1) < 0 THEN
IF write(fildes, ADR(ch), 1) < 0 THEN
;
END;
END Write;
@ -106,6 +109,6 @@ IMPLEMENTATION MODULE Terminal;
BEGIN
tty := "/dev/tty";
fildes := Unix.open(ADR(tty), 2);
fildes := open(ADR(tty), 2);
unread := FALSE;
END Terminal.

View file

@ -11,17 +11,18 @@ IMPLEMENTATION MODULE Traps;
Version: $Header$
*)
IMPORT EM;
IMPORT Unix;
FROM SYSTEM IMPORT ADDRESS, ADR;
FROM Arguments IMPORT Argv;
FROM EM IMPORT SIG, LINO, FILN, TRP;
FROM Unix IMPORT write;
FROM SYSTEM IMPORT ADDRESS, ADR;
FROM Arguments IMPORT
Argv;
PROCEDURE InstallTrapHandler(t: TrapHandler): TrapHandler;
(* Install a new trap handler, and return the previous one.
Parameter of trap handler is the trap number.
*)
BEGIN
RETURN EM.SIG(t);
RETURN SIG(t);
END InstallTrapHandler;
PROCEDURE Message(str: ARRAY OF CHAR);
@ -34,7 +35,7 @@ IMPLEMENTATION MODULE Traps;
buf, buf2: ARRAY [0..255] OF CHAR;
i, j: CARDINAL;
BEGIN
p := EM.FILN();
p := FILN();
IF p # NIL THEN
i := 1;
buf[0] := '"';
@ -45,12 +46,12 @@ IMPLEMENTATION MODULE Traps;
END;
buf[i] := '"';
INC(i);
IF Unix.write(2, ADR(buf), i) < 0 THEN END;
IF write(2, ADR(buf), i) < 0 THEN END;
ELSE
l := Argv(0, buf);
IF Unix.write(2, ADR(buf), l-1) < 0 THEN END;
IF write(2, ADR(buf), l-1) < 0 THEN END;
END;
lino := EM.LINO();
lino := LINO();
i := 0;
IF lino # 0 THEN
i := 7;
@ -76,20 +77,20 @@ IMPLEMENTATION MODULE Traps;
END;
buf[i] := ':';
buf[i+1] := ' ';
IF Unix.write(2, ADR(buf), i+2) < 0 THEN END;
IF write(2, ADR(buf), i+2) < 0 THEN END;
i := 0;
WHILE (i <= HIGH(str)) AND (str[i] # 0C) DO
INC(i);
END;
IF Unix.write(2, ADR(str), i) < 0 THEN END;
IF write(2, ADR(str), i) < 0 THEN END;
buf[0] := 12C;
IF Unix.write(2, ADR(buf), 1) < 0 THEN END;
IF write(2, ADR(buf), 1) < 0 THEN END;
END Message;
PROCEDURE Trap(n: INTEGER);
(* cause trap number "n" to occur *)
BEGIN
EM.TRP(n);
TRP(n);
END Trap;
END Traps.

View file

@ -11,30 +11,30 @@ IMPLEMENTATION MODULE random;
Version: $Header$
*)
FROM Unix IMPORT getpid, time;
TYPE index = [1..55];
FROM Unix IMPORT getpid, time;
TYPE index = [1..55];
VAR X: ARRAY index OF CARDINAL;
VAR X: ARRAY index OF CARDINAL;
j, k: index;
tm: LONGINT;
PROCEDURE Random(): CARDINAL;
BEGIN
PROCEDURE Random(): CARDINAL;
BEGIN
IF k-1 <= 0 THEN k := 55; ELSE DEC(k) END;
IF j-1 <= 0 THEN j := 55; ELSE DEC(j) END;
X[k] := X[k] + X[j];
RETURN X[k]
END Random;
END Random;
PROCEDURE Uniform (lwb, upb: CARDINAL): CARDINAL;
BEGIN
PROCEDURE Uniform (lwb, upb: CARDINAL): CARDINAL;
BEGIN
IF upb <= lwb THEN RETURN lwb; END;
RETURN lwb + (Random() MOD (upb - lwb + 1));
END Uniform;
END Uniform;
PROCEDURE StartSeed(seed: CARDINAL);
VAR v: CARDINAL;
BEGIN
PROCEDURE StartSeed(seed: CARDINAL);
VAR v: CARDINAL;
BEGIN
FOR k := 1 TO 55 DO
seed := 1297 * seed + 123;
X[k] := seed;
@ -49,7 +49,7 @@ BEGIN
END;
k := 1;
j := 25;
END StartSeed;
END StartSeed;
BEGIN
tm := time(NIL);