(* Version 1.10, Nov 1984 *) DEFINITION MODULE InOut; (* Standard high-level formatted input/output, allowing for redirection to/from files From the book 'Programming in Modula-2' by Prof. N. Wirth. *) FROM SYSTEM IMPORT WORD; FROM FileSystem IMPORT File; EXPORT QUALIFIED EOL, Done, in, out, termCH, OpenInput, OpenOutput, CloseInput, CloseOutput, Read, ReadString, ReadInt, ReadCard, ReadWrd, Write, WriteLn, WriteString, WriteInt, WriteCard, WriteOct, WriteHex, WriteWrd; CONST EOL = 36C; (*- end-of-line character *) VAR Done: BOOLEAN; (* - set by several procedures; TRUE if the operation was successful, FALSE otherwise. *) termCH: CHAR; (* - terminating character from ReadString, ReadInt, ReadCard. *) in, out: File; (* - The currently open input and output files. Use for exceptional cases only. *) PROCEDURE OpenInput(defext: ARRAY OF CHAR); (* - Accept a file name from the terminal and open it for input (file variable 'in'). in: defext default filetype or 'extension'. If the file name that is read ends with '.', then 'defext' is appended to the file name. If OpenInput succeeds, Done = TRUE and subsequent input is taken from the file until CloseInput is called. *) PROCEDURE OpenOutput(defext: ARRAY OF CHAR); (* - Accept a file name from the terminal and open it for output (file variable 'out'). in: defext default filetype or 'extension'. If the file name that is read ends with '.', then 'defext' is appended to the file name. If OpenOutput succeeds, Done = TRUE and subsequent output is written to the file until CloseOutput is called. *) PROCEDURE CloseInput; (* - Close current input file and revert to terminal for input. *) PROCEDURE CloseOutput; (* - Close current output file and revert to terminal for output. *) PROCEDURE Read(VAR ch: CHAR); (* - Read the next character from the current input. out: ch the character read; EOL for end-of-line Done = TRUE unless the input is at end of file. *) PROCEDURE ReadString(VAR s: ARRAY OF CHAR); (* - Read a string from the current input. out: s the string that was read, excluding the terminator character. Leading blanks are accepted and thrown away, then characters are read into 's' until a blank or control character is entered. ReadString truncates the input string if it is too long for 's'. The terminating character is left in 'termCH'. If input is from the terminal, BS and DEL are allowed for editing. *) PROCEDURE ReadInt(VAR x: INTEGER); (* - Read an INTEGER representation from the current input. out: x the value read. ReadInt is like ReadString, but the string is converted to an INTEGER value if possible, using the syntax: ["+"|"-"] digit { digit }. Done = TRUE if some conversion took place. *) PROCEDURE ReadCard(VAR x: CARDINAL); (* - Read an unsigned decimal number from the current input. out: x the value read. ReadCard is like ReadInt, but the syntax is: digit { digit }. *) PROCEDURE ReadWrd(VAR w: WORD); (* - Read a WORD value from the current input. out: w the value read. Done is TRUE if a WORD was read successfully. This procedure cannot be used when reading from the terminal. Note that the meaning of WORD is system dependent. *) PROCEDURE Write(ch: CHAR); (* - Write a character to the current output. in: ch character to write. *) PROCEDURE WriteLn; (* - Write an end-of-line sequence to the current output. *) PROCEDURE WriteString(s: ARRAY OF CHAR); (* - Write a string to the current output. in: s string to write. *) PROCEDURE WriteInt(x: INTEGER; n: CARDINAL); (* - Write an integer in right-justified decimal format. in: x value to be output, n minimum field width. The decimal representation of 'x' (including '-' if x is negative) is output, using at least n characters (but more if needed). Leading blanks are output if necessary. *) PROCEDURE WriteCard(x, n: CARDINAL); (* - Output a CARDINAL in decimal format. in: x value to be output, n minimum field width. The decimal representation of the value 'x' is output, using at least n characters (but more if needed). Leading blanks are output if necessary. *) PROCEDURE WriteOct(x, n: CARDINAL); (* - Output a CARDINAL in octal format. [see WriteCard above] *) PROCEDURE WriteHex(x, n: CARDINAL); (* - Output a CARDINAL in hexadecimal format. in: x value to be output, n minimum field width. Four uppercase hex digits are written, with leading blanks if n > 4. *) PROCEDURE WriteWrd(w: WORD); (* - Output a WORD in: w WORD value to be output. Note that the meaning of WORD is system dependent, and that a WORD cannot be written to the terminal. *) END InOut.