From f2dc30c9120a3d624eacb8a66b276195faa2f66b Mon Sep 17 00:00:00 2001 From: ceriel Date: Wed, 3 Feb 1988 14:34:40 +0000 Subject: [PATCH] modified to use Streams module --- lang/m2/libm2/InOut.def | 1 + lang/m2/libm2/InOut.mod | 191 ++++++++++++---------------------------- 2 files changed, 59 insertions(+), 133 deletions(-) diff --git a/lang/m2/libm2/InOut.def b/lang/m2/libm2/InOut.def index e1da2167f..1179298be 100644 --- a/lang/m2/libm2/InOut.def +++ b/lang/m2/libm2/InOut.def @@ -19,6 +19,7 @@ DEFINITION MODULE InOut; If the filename ends with a '.', append the "defext" extension. Done := "file was successfully opened". If open, subsequent output is written to this file. + Files left open at program termination are automatically closed. *) PROCEDURE OpenInputFile(filename: ARRAY OF CHAR); diff --git a/lang/m2/libm2/InOut.mod b/lang/m2/libm2/InOut.mod index e2d80c225..ab7eebfe2 100644 --- a/lang/m2/libm2/InOut.mod +++ b/lang/m2/libm2/InOut.mod @@ -1,44 +1,30 @@ (*$R-*) IMPLEMENTATION MODULE InOut ; - IMPORT Unix; + IMPORT Streams; IMPORT Conversions; IMPORT Traps; FROM TTY IMPORT isatty; - FROM SYSTEM IMPORT ADR; - CONST BUFSIZ = 1024; (* Tunable *) - TAB = 11C; + CONST TAB = 11C; - TYPE IOBuf = RECORD - fildes: INTEGER; - cnt: INTEGER; - maxcnt: INTEGER; - bufferedcount: INTEGER; - buf: ARRAY [1..BUFSIZ] OF CHAR; - END; - numbuf = ARRAY[0..255] OF CHAR; + TYPE numbuf = ARRAY[0..255] OF CHAR; - VAR ibuf, obuf: IOBuf; - unread: BOOLEAN; + VAR unread: BOOLEAN; unreadch: CHAR; + CurrIn, CurrOut: Streams.Stream; + result: Streams.StreamResult; PROCEDURE Read(VAR c : CHAR); + BEGIN IF unread THEN unread := FALSE; c := unreadch; Done := TRUE; ELSE - WITH ibuf DO - IF cnt <= maxcnt THEN - c := buf[cnt]; - INC(cnt); - Done := TRUE; - ELSE - c := FillBuf(ibuf); - END; - END; + Streams.Read(CurrIn, c, result); + Done := result = Streams.succeeded; END; END Read; @@ -48,135 +34,87 @@ IMPLEMENTATION MODULE InOut ; unreadch := ch; END UnRead; - PROCEDURE FillBuf(VAR ib: IOBuf) : CHAR; - VAR c : CHAR; - BEGIN - WITH ib DO - maxcnt := Unix.read(fildes, ADR(buf), bufferedcount); - cnt := 2; - Done := maxcnt > 0; - IF NOT Done THEN - c := 0C; - ELSE - c := buf[1]; - END; - END; - RETURN c; - END FillBuf; - - PROCEDURE Flush(VAR ob: IOBuf); - VAR dummy: INTEGER; - BEGIN - WITH ob DO - dummy := Unix.write(fildes, ADR(buf), cnt); - cnt := 0; - END; - END Flush; - PROCEDURE Write(c: CHAR); BEGIN - WITH obuf DO - INC(cnt); - buf[cnt] := c; - IF cnt >= bufferedcount THEN - Flush(obuf); - END; - END; + Streams.Write(CurrOut, c, result); END Write; PROCEDURE OpenInput(defext: ARRAY OF CHAR); - VAR namebuf : ARRAY [1..256] OF CHAR; + VAR namebuf : ARRAY [1..128] OF CHAR; BEGIN - IF ibuf.fildes # 0 THEN - CloseInput; + IF CurrIn # Streams.InputStream THEN + Streams.CloseStream(CurrIn, result); END; MakeFileName("Name of input file: ", defext, namebuf); IF NOT Done THEN RETURN; END; - IF (namebuf[1] = '-') AND (namebuf[2] = 0C) THEN - ELSE - WITH ibuf DO - fildes := Unix.open(ADR(namebuf), 0); - Done := fildes >= 0; - maxcnt := 0; - cnt := 1; - END; - END; + openinput(namebuf); END OpenInput; PROCEDURE OpenInputFile(filename: ARRAY OF CHAR); BEGIN - IF ibuf.fildes # 0 THEN - CloseInput; + IF CurrIn # Streams.InputStream THEN + Streams.CloseStream(CurrIn, result); END; - IF (filename[0] = '-') AND (filename[1] = 0C) THEN + openinput(filename); + END OpenInputFile; + + PROCEDURE openinput(VAR namebuf: ARRAY OF CHAR); + BEGIN + IF (namebuf[0] = '-') AND (namebuf[1] = 0C) THEN + CurrIn := Streams.InputStream; + Done := TRUE; ELSE - WITH ibuf DO - fildes := Unix.open(ADR(filename), 0); - Done := fildes >= 0; - maxcnt := 0; - cnt := 1; - END; + Streams.OpenStream(CurrIn, namebuf, Streams.text, + Streams.reading, result); + Done := result = Streams.succeeded; END; - END OpenInputFile; + END openinput; PROCEDURE CloseInput; BEGIN - WITH ibuf DO - IF (fildes > 0) AND (Unix.close(fildes) < 0) THEN - ; - END; - fildes := 0; - maxcnt := 0; - cnt := 1; + IF CurrIn # Streams.InputStream THEN + Streams.CloseStream(CurrIn, result); END; + CurrIn := Streams.InputStream; END CloseInput; PROCEDURE OpenOutput(defext: ARRAY OF CHAR); - VAR namebuf : ARRAY [1..256] OF CHAR; + VAR namebuf : ARRAY [1..128] OF CHAR; BEGIN - IF obuf.fildes # 1 THEN - CloseOutput; + IF CurrOut # Streams.OutputStream THEN + Streams.CloseStream(CurrOut, result); END; MakeFileName("Name of output file: ", defext, namebuf); IF NOT Done THEN RETURN; END; - IF (namebuf[1] = '-') AND (namebuf[2] = 0C) THEN - ELSE - WITH obuf DO - fildes := Unix.creat(ADR(namebuf), 666B); - Done := fildes >= 0; - bufferedcount := BUFSIZ; - cnt := 0; - END; - END; + openoutput(namebuf); END OpenOutput; PROCEDURE OpenOutputFile(filename: ARRAY OF CHAR); BEGIN - IF obuf.fildes # 1 THEN - CloseOutput; + IF CurrOut # Streams.OutputStream THEN + Streams.CloseStream(CurrOut, result); END; - IF (filename[0] = '-') AND (filename[1] = 0C) THEN + openoutput(filename); + END OpenOutputFile; + + PROCEDURE openoutput(VAR namebuf: ARRAY OF CHAR); + BEGIN + IF (namebuf[1] = '-') AND (namebuf[2] = 0C) THEN + CurrOut := Streams.OutputStream; + Done := TRUE; ELSE - WITH obuf DO - fildes := Unix.creat(ADR(filename), 666B); - Done := fildes >= 0; - bufferedcount := BUFSIZ; - cnt := 0; - END; + Streams.OpenStream(CurrOut, namebuf, Streams.text, + Streams.writing, result); + Done := result = Streams.succeeded; END; - END OpenOutputFile; + END openoutput; PROCEDURE CloseOutput; BEGIN - Flush(obuf); - WITH obuf DO - IF (fildes # 1) AND (Unix.close(fildes) < 0) THEN - ; - END; - fildes := 1; - bufferedcount := 1; - cnt := 0; + IF CurrOut # Streams.OutputStream THEN + Streams.CloseStream(CurrOut, result); END; + CurrOut := Streams.OutputStream; END CloseOutput; PROCEDURE MakeFileName(prompt, defext : ARRAY OF CHAR; @@ -332,15 +270,14 @@ IMPLEMENTATION MODULE InOut ; END ReadString; PROCEDURE XReadString(VAR s : ARRAY OF CHAR); - VAR i : INTEGER; - j : CARDINAL; + VAR j : CARDINAL; ch : CHAR; BEGIN j := 0; LOOP - i := Unix.read(0, ADR(ch), 1); - IF i < 0 THEN + Streams.Read(Streams.InputStream, ch, result); + IF result # Streams.succeeded THEN EXIT; END; IF ch <= " " THEN @@ -360,14 +297,11 @@ IMPLEMENTATION MODULE InOut ; i := 0; LOOP IF (i <= HIGH(s)) AND (s[i] # 0C) THEN - INC(i); + Streams.Write(Streams.OutputStream, s[i], result); ELSE EXIT; END; END; - IF Unix.write(1, ADR(s), i) < 0 THEN - ; - END; END XWriteString; PROCEDURE WriteCard(card, width : CARDINAL); @@ -419,16 +353,7 @@ IMPLEMENTATION MODULE InOut ; END WriteString; BEGIN (* InOut initialization *) + CurrIn := Streams.InputStream; + CurrOut := Streams.OutputStream; unread := FALSE; - WITH ibuf DO - fildes := 0; - bufferedcount := BUFSIZ; - maxcnt := 0; - cnt := 1; - END; - WITH obuf DO - fildes := 1; - bufferedcount := 1; - cnt := 0; - END; END InOut. -- 2.34.1