DEFINITION MODULE InOut;
CONST EOL=0DI;
VAR Done:BOOLEAN;
TermCH:CHAR;
PROCEDURE OpenInput(defext:ARRAY OF CHAR);
PROCEDURE OpenOutput(defext:ARRAY OF CHAR);
PROCEDURE CloseOutput;
PROCEDURE CloseInput;
PROCEDURE Read(VAR ch:CHAR);
PROCEDURE ReadString(VAR s:ARRAY OF CHAR);
PROCEDURE ReadInt(VAR x:INTEGER);
PROCEDURE ReadCard(VAR x:CARDINAL);
PROCEDURE Write(ch:CHAR);
PROCEDURE WriteLn;
PROCEDURE WriteString(s:ARRAY OF CHAR);
PROCEDURE WriteInt(x:INTEGER; n:CARDINAL);
PROCEDURE WriteCard(x,n:CARDINAL);
PROCEDURE WriteOct(x,n:CARDINAL);
PROCEDURE WriteHex(x,n:CARDINAL);
(*PROCEDURE WriteBase(x,b,n:CARDINAL)*)
END InOut.
IMPLEMENTATION MODULE InOut;
FROM MAINREAD IMPORT SETMAINRD,MRDSTR;
FROM STDIO IMPORT WRSTRLEN,WRSTR,WRCHAR,WRLN,RDSTR,RDCHAR,RDITEM,
               STDIN,STDOUT,TERMCH;
FROM PLUS3IO IMPORT PLUS3IN,PLUS3OUT;
FROM STRINGS IMPORT APPEND,LENGTH;
FROM DRIVES IMPORT OPEN,CLOSE,EOF,Bch;
FROM NUMIO IMPORT WRCARD,WRINT,STRTOCARD,STRTOINT;

VAR plus3,fileout,filein:BOOLEAN;
    name:ARRAY [0..9] OF CHAR;
PROCEDURE setout;
BEGIN
IF fileout THEN 
  IF plus3 THEN PLUS3OUT(5)
   ELSE STDOUT(5) END;
 ELSE STDOUT(2) END
END setout;
 
PROCEDURE OpenInput(defext:ARRAY OF CHAR);
BEGIN
STDOUT(0FEH);
WRSTR('Input filename? ');MRDSTR(name);WRLN;
setout;
IF name[LENGTH(name)-1]='.' THEN APPEND(name,defext) END;
Bch:='R';OPEN(1,name,4);
filein:=TRUE;
IF plus3 THEN PLUS3IN(4)
  ELSE STDIN(4) END;
END OpenInput;
 
PROCEDURE OpenOutput(defext:ARRAY OF CHAR);
BEGIN
STDOUT(0FEH);
WRSTR('Output filename? ');MRDSTR(name);WRLN;
IF name[LENGTH(name)+1]='.' THEN APPEND(name,defext) END;
Bch:='W';OPEN(1,name,5);
fileout:=TRUE;
setout;
END OpenOutput;
 
PROCEDURE CloseOutput;
BEGIN
IF fileout THEN CLOSE(5) END;
fileout:=FALSE;
setout;
END CloseOutput;
 
PROCEDURE CloseInput;
BEGIN
IF filein THEN CLOSE(4) END;
filein:=FALSE;
SETMAINRD
END CloseInput;
 
PROCEDURE Read(VAR ch:CHAR);
BEGIN
IF filein AND EOF(4) THEN Done:=FALSE;ch:=0C;RETURN END;
ch:=RDCHAR();Done:=TRUE;
END Read;
 
PROCEDURE ReadString(VAR s:ARRAY OF CHAR);
BEGIN
IF filein AND EOF(4) THEN Done:=FALSE;RETURN END;
RDITEM(s);TermCH:=TERMCH;
END ReadString;
 
PROCEDURE ReadInt(VAR x:INTEGER);
VAR S:ARRAY [0..31] OF CHAR;
BEGIN
ReadString(S);
IF Done THEN x:=STRTOINT(S,Done) END;
END ReadInt;
 
PROCEDURE ReadCard(VAR x:CARDINAL);
VAR S:ARRAY [0..31] OF CHAR;
BEGIN
ReadString(S);
IF Done THEN x:=STRTOCARD(S,Done) END;
END ReadCard;
 
PROCEDURE Write(ch:CHAR);
BEGIN
WRCHAR(ch)
END Write;
 
PROCEDURE WriteLn;
BEGIN WRLN END WriteLn;
 
PROCEDURE WriteString(s:ARRAY OF CHAR);
BEGIN WRSTR(s) END WriteString;

PROCEDURE WriteInt(x:INTEGER; n:CARDINAL);
BEGIN WRINT(x,n) END WriteInt;
 
PROCEDURE WriteCard(x,n:CARDINAL);
BEGIN WRCARD(x,n) END WriteCard;

PROCEDURE WriteBase(x,b,n:CARDINAL);
VAR S:ARRAY [0..15] OF CHAR;
    i,j,d:CARDINAL;
BEGIN
i:=16;
REPEAT
  DEC(i);d:=x MOD b;
  IF d>=10 THEN INC(d,7) END;
  S[i]:=CHR(d+48);
  x:=x DIV 16
  UNTIL x=0;
IF i<>0 THEN
  FOR j:=0 TO 15-i DO
    S[j]:=S[j+i] END;
  S[16-i]:=CHR(0) END;
WRSTRLEN(S,n)
END WriteBase;

PROCEDURE WriteHex(x,n:CARDINAL);
BEGIN
WriteBase(x,16,n);
END WriteHex;

PROCEDURE WriteOct(x,n:CARDINAL);
BEGIN
WriteBase(x,8,n);
END WriteOct;
VAR [0BD9BH] DRVINF:SHORTCARD;
BEGIN
plus3:=DRVINF DIV 2=7;
filein:=FALSE;
fileout:=FALSE;
Done:=TRUE
END InOut.
