DEFINITION MODULE InOut;
(*
  Module:	Wirth's Input/Output module
  From:		"Programming in Modula-2", 3rd, corrected edition, by N. Wirth
  Version:	$Id$
*)

	CONST	EOL = 12C;

	VAR	Done : BOOLEAN;
		termCH : CHAR;

	PROCEDURE OpenInput(defext: ARRAY OF CHAR);
	(* Request a file name from the standard input stream and open
	   this file for reading.
	   If the filename ends with a '.', append the "defext" extension.
	   Done := "file was successfully opened".
	   If open, subsequent input is read from this file.
	*)

	PROCEDURE OpenOutput(defext : ARRAY OF CHAR);
	(* Request a file name from the standard input stream and open
	   this file for writing.
	   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);
	(* Like OpenInput, but filename given as parameter.
	   This procedure is not in Wirth's InOut.
	*)

	PROCEDURE OpenOutputFile(filename: ARRAY OF CHAR);
	(* Like OpenOutput, but filename given as parameter.
	   This procedure is not in Wirth's InOut.
	*)

	PROCEDURE CloseInput;
	(* Close input file. Subsequent input is read from the standard input
	   stream.
	*)

	PROCEDURE CloseOutput;
	(* Close output file. Subsequent output is written to the standard
	   output stream.
	*)

	PROCEDURE Read(VAR ch : CHAR);
	(* Read a character from the current input stream and leave it in "ch".
	   Done := NOT "end of file".
	*)

	PROCEDURE ReadString(VAR s : ARRAY OF CHAR);
	(* Read a string from the current input stream and leave it in "s".
	   A string is any sequence of characters not containing blanks or
	   control characters; leading blanks are ignored.
	   Input is terminated by any character <= " ".
	   This character is assigned to termCH.
	   DEL or BACKSPACE is used for backspacing when input from terminal.
	*)

	PROCEDURE ReadInt(VAR x : INTEGER);
	(* Read a string and convert it to INTEGER.
	   Syntax: integer = ['+'|'-'] digit {digit}.
	   Leading blanks are ignored.
	   Done := "integer was read".
	*)

	PROCEDURE ReadCard(VAR x : CARDINAL);
	(* Read a string and convert it to CARDINAL.
	   Syntax: cardinal = digit {digit}.
	   Leading blanks are ignored.
	   Done := "cardinal was read".
	*)

	PROCEDURE Write(ch : CHAR);
	(* Write character "ch" to the current output stream.
	*)

	PROCEDURE WriteLn;
	(* Terminate line.
	*)

	PROCEDURE WriteString(s : ARRAY OF CHAR);
	(* Write string "s" to the current output stream
	*)

	PROCEDURE WriteInt(x : INTEGER; n : CARDINAL);
	(* Write integer x with (at least) n characters on the current output
	   stream. If n is greater that the number of digits needed,
	   blanks are added preceding the number.
	*)

	PROCEDURE WriteCard(x, n : CARDINAL);
	(* Write cardinal x with (at least) n characters on the current output
	   stream. If n is greater that the number of digits needed,
	   blanks are added preceding the number.
	*)

	PROCEDURE WriteOct(x, n : CARDINAL);
	(* Write cardinal x as an octal number with (at least) n characters
	   on the current output stream.
	   If n is greater that the number of digits needed,
	   blanks are added preceding the number.
	*)

	PROCEDURE WriteHex(x, n : CARDINAL);
	(* Write cardinal x  as a hexadecimal number with (at least)
	   n characters on the current output stream.
	   If n is greater that the number of digits needed,
	   blanks are added preceding the number.
	*)

END InOut.