language-Modula2-0.1: examples/Modula-2_Libraries/C.-Lins_Modula-2_Software_Component_Library/Vol1/UTILS/INOUTUTI.MOD
IMPLEMENTATION MODULE InOutUtils;
(*=======================================================================
Version : 1.0 Sat, Mar 4, 1989 C. Lins
Compiler : JPI TopSpeed Modula-2
Code Size: R- bytes
Component Class: Tool
Component Form : Standard I/O Support Utility - InOut Utilities
REVISION HISTORY
v1.0 Sat, Mar 4, 1989 C. Lins
Initial JPI implementation.
INTRODUCTION
This module implements support routines for simplifying use of InOut.
LOCAL VARIABLES
* yesNoString Array of strings Yes and No indexed by a boolean.
Copyright (C) 1989 Charles A. Lins. All rights reserved.
=======================================================================*)
FROM IO IMPORT (*--Proc*) RdChar, WrChar, WrStr, WrLn,
WrCard, WrInt, WrLngInt,
WrLngCard, WrReal;
FROM ASCII IMPORT (*--Cons*) nul, cr, lf, bs, bel, del;
FROM CharUtils IMPORT (*--Proc*) MakeUppercase, Uppercase;
(*--------------------*)
PROCEDURE CarriageReturn;
BEGIN
WrChar(cr);
END CarriageReturn;
(*--------------------*)
PROCEDURE LineFeed;
BEGIN
WrChar(lf);
END LineFeed;
(*--------------------*)
PROCEDURE WriteNChars ( c: CHAR (*-- in *);
n: CARDINAL (*-- in *));
VAR i: CARDINAL;
BEGIN
FOR i:=1 TO n DO
WrChar(c);
END(*--for*);
END WriteNChars;
(*--------------------*)
PROCEDURE BackSpace ( n: CARDINAL (*-- in *));
BEGIN
WriteNChars(bs,n);
END BackSpace;
(*--------------------*)
PROCEDURE Erase ( n: CARDINAL (*-- in *));
BEGIN
WriteNChars(del,n);
END Erase;
(*--------------------*)
PROCEDURE Beep ( n: CARDINAL (*-- in *));
BEGIN
WriteNChars(bel,n);
END Beep;
(*--------------------*)
PROCEDURE WaitForUser;
VAR ch: CHAR;
BEGIN
WrStr("Press any key to continue...");
ch:=RdChar();
WrChar(ch);
WrLn;
IF Uppercase(ch) = 'A' THEN
HALT; (*-- Terminate program *)
END(*--if*);
END WaitForUser;
(*--------------------*)
PROCEDURE WriteBlanks ( n: CARDINAL (*-- in *));
BEGIN
WriteNChars(' ',n);
END WriteBlanks;
(*--------------------*)
PROCEDURE WriteBlankLines ( n: CARDINAL (*-- in *));
VAR i: CARDINAL;
BEGIN
FOR i:=1 TO n DO
WrLn;
END(*--for*);
END WriteBlankLines;
(*--------------------*)
PROCEDURE WriteLnString ( string : ARRAY OF CHAR (*-- in *));
BEGIN
WrStr(string);
WrLn;
END WriteLnString;
(*--------------------*)
PROCEDURE WriteLnsString ( string : ARRAY OF CHAR (*-- in *);
nLines : CARDINAL (*-- in *));
BEGIN
WrStr(string);
WriteBlankLines(nLines);
END WriteLnsString;
(*--------------------*)
VAR yesNoString: ARRAY BOOLEAN OF ARRAY [0..4] OF CHAR;
PROCEDURE WriteYesOrNo ( logical: BOOLEAN (*-- in *));
BEGIN
WrStr(yesNoString[logical]);
END WriteYesOrNo;
(*--------------------*)
PROCEDURE WriteLblBoolean ( s : ARRAY OF CHAR (*--in *);
b : BOOLEAN (*--in *));
BEGIN
WrStr(s);
WrStr(yesNoString[b]);
END WriteLblBoolean;
(*--------------------*)
PROCEDURE WriteLblCardinal ( s : ARRAY OF CHAR (*--in *);
c : CARDINAL (*--in *);
w : CARDINAL (*--in *));
BEGIN
WrStr(s);
WrCard(c, w);
END WriteLblCardinal;
(*--------------------*)
PROCEDURE WriteLblInteger ( s : ARRAY OF CHAR (*--in *);
n : INTEGER (*--in *);
w : CARDINAL (*--in *));
BEGIN
WrStr(s);
WrInt(n, w);
END WriteLblInteger;
(*--------------------*)
PROCEDURE WriteLblReal ( s : ARRAY OF CHAR (*--in *);
r : REAL (*--in *);
n : CARDINAL (*--in *);
d : CARDINAL (*--in *);
fixed : BOOLEAN (*--in *));
BEGIN
WrStr(s);
WrReal(r, n, d);
END WriteLblReal;
(*--------------------*)
PROCEDURE WriteLblLongCard( s : ARRAY OF CHAR (*--in *);
c : LONGCARD (*--in *);
w : CARDINAL (*--in *));
BEGIN
WrStr(s);
WrLngCard(c, w);
END WriteLblLongCard;
(*--------------------*)
PROCEDURE WriteLblLongInt ( s : ARRAY OF CHAR (*--in *);
n : LONGINT (*--in *);
w : CARDINAL (*--in *));
BEGIN
WrStr(s);
WrLngInt(n, w);
END WriteLblLongInt;
(*--------------------*)
PROCEDURE AnswerIsYesTo ( query : ARRAY OF CHAR (*-- in *))
: BOOLEAN (*-- out *);
VAR ch: CHAR;
BEGIN
WrStr(query);
WrStr(" [y/n]? ");
REPEAT
ch:=RdChar();
MakeUppercase(ch);
UNTIL (ch = "Y") OR (ch = "N");
RETURN ch = "Y";
END AnswerIsYesTo;
(*--------------------*)
PROCEDURE InputString (VAR string : ARRAY OF CHAR (*-- out *));
VAR currentChar : CHAR;
currentIndex: CARDINAL;
maximumIndex: CARDINAL;
BEGIN
currentIndex := 0;
maximumIndex := HIGH(string);
LOOP
currentChar:=RdChar();
WrChar(currentChar);
IF (currentChar = bs) THEN
IF (0 < currentIndex) THEN
DEC(currentIndex);
END (*--if*);
ELSIF (currentChar = lf) OR (currentChar = cr) THEN
EXIT (*--loop*);
ELSIF (currentIndex < maximumIndex) THEN
string[currentIndex] := currentChar;
INC(currentIndex);
END (*--if*);
END (*--loop*);
string[currentIndex] := nul;
END InputString;
(*--------------------*)
BEGIN (*~~~~~ Module Initializarion ~~~~~*)
yesNoString[FALSE]:="FALSE";
yesNoString[TRUE ]:="TRUE";
END InOutUtils.