--*- Fonts: CPTFONTB -*-
-- $Header: /ct/interp/textiop.ada,v 1.17 84/09/27 22:12:11 alex Exp $
--
-- Specification of the Package Text_IO
--
  with IO_EXCEPTIONS;
  package TEXT_IO is

	type FILE_TYPE is limited private;

	type FILE_MODE is (IN_FILE,OUT_FILE);

	type COUNT is range 0 .. 132;

 	subtype POSITIVE_COUNT is COUNT range 1 .. COUNT'LAST;

        UNBOUNDED : constant COUNT := 0; -- LINE AND PAGE LENGTH

	subtype FIELD is INTEGER range 0 .. 32;			

	subtype NUMBER_BASE is INTEGER range 2 .. 16;

	type TYPE_SET is (LOWER_CASE, UPPER_CASE);

	-- FILE MANAGEMENT
	procedure CREATE (FILE : in out FILE_type;
			  MODE : in FILE_mode := OUT_FILE;
			  NAME : in STRING    := "";
			  FORM : in STRING    := "");
   	
	procedure OPEN  (FILE : in out FILE_TYPE;
			 MODE : in FILE_MODE := OUT_FILE;
			 NAME : in STRING    := "";
			 FORM : in STRING    := "") ;

	procedure CLOSE  (FILE : in out FILE_TYPE);	
	procedure DELETE (FILE : in out FILE_TYPE);
	procedure RESET  (FILE : in out FILE_TYPE; MODE : in FILE_MODE);
	procedure RESET  (file : in out FILE_TYPE);

	function MODE    (FILE : in FILE_TYPE) return FILE_MODE;
	function NAME    (FILE : in FILE_TYPE) return STRING;
	function FORM    (FILE : in FILE_TYPE) return STRING;
	function IS_OPEN (FILE : in FILE_TYPE) return BOOLEAN;

	-- Control of default input and output files

	procedure SET_INPUT (FILE : in FILE_TYPE);
	procedure SET_OUTPUT (FILE : in FILE_TYPE);

	function  STANDARD_INPUT return FILE_TYPE;
	function  STANDARD_OUTPUT return FILE_TYPE;

	function  CURRENT_INPUT return FILE_TYPE;
	function  CURRENT_OUTPUT return FILE_TYPE;

	-- Specification of line and page length

	procedure SET_LINE_LENGTH (FILE : in FILE_TYPE;
				   TO	: in COUNT);
	procedure SET_LINE_LENGTH (TO 	: in COUNT);

	procedure SET_PAGE_LENGTH (FILE : in FILE_TYPE;
				   TO	: in COUNT);
	procedure SET_PAGE_LENGTH (TO 	: in COUNT);

	function LINE_LENGTH	(FILE 	: in FILE_TYPE) return COUNT;
	function LINE_LENGTH	return COUNT;


 	function PAGE_LENGTH	(FILE 	: in FILE_TYPE) return COUNT;

	function PAGE_LENGTH	return COUNT;

	-- Column , Line and Page Control

	procedure NEW_LINE	(FILE 		: in FILE_TYPE;
				 SPACING	: POSITIVE_COUNT :=1 );
	procedure NEW_LINE	(SPACING	: POSITIVE_COUNT :=1);


	procedure SKIP_LINE	(FILE 		: in FILE_TYPE;
				 SPACING	: POSITIVE_COUNT :=1);
	procedure SKIP_LINE	(SPACING	: POSITIVE_COUNT :=1);

	function END_OF_LINE	(FILE 		: in FILE_TYPE) return BOOLEAN;
	function END_OF_LINE	return BOOLEAN;

	procedure NEW_PAGE	(FILE		: in FILE_TYPE);
	procedure NEW_PAGE;

	procedure SKIP_PAGE	(FILE		: in FILE_TYPE);
	procedure SKIP_PAGE;

	function END_OF_page	(FILE 		: in FILE_TYPE) return BOOLEAN;
	function END_OF_PAGE	return BOOLEAN;

	function END_OF_FILE	(FILE 		: in FILE_TYPE) return BOOLEAN;
	function END_OF_FILE	RETURN BOOLEAN;

	procedure SET_COL	(FILE 	: in FILE_TYPE;
				 TO	: POSITIVE_COUNT);
	procedure SET_COL	(TO	: POSITIVE_COUNT);

	procedure SET_LINE	(FILE 	: in FILE_TYPE;
				 TO	: POSITIVE_COUNT);
	procedure SET_LINE	(TO	: POSITIVE_COUNT);

	function COL		(FILE 	: in FILE_TYPE) RETURN POSITIVE_COUNT;
	function COL		RETURN POSITIVE_COUNT;

	function LINE		(FILE 	: IN FILE_TYPE) RETURN POSITIVE_COUNT;
	function LINE		RETURN POSITIVE_COUNT;

	function PAGE		(FILE 	: in FILE_TYPE) return POSITIVE_COUNT;
	function PAGE		return POSITIVE_COUNT;


	-- Character Input-Output

	procedure GET 	(FILE : in FILE_TYPE; ITEM : out CHARACTER);
	procedure GET 	(ITEM : out CHARACTER);			

	procedure PUT 	(FILE : in FILE_TYPE; ITEM : in CHARACTER);
	procedure PUT 	(ITEM : in CHARACTER);

	-- String Input-Output

	procedure GET 	(FILE : in FILE_TYPE; ITEM : out STRING);
	procedure GET 	(ITEM : out STRING);				

	procedure PUT 	(FILE : in FILE_TYPE; ITEM : in STRING);	
	procedure PUT 	(ITEM : in STRING);				

	procedure GET_line 	(FILE : in  FILE_TYPE;
				 ITEM : out STRING;
				 LAST : out NATURAL);  
	procedure GET_line 	(ITEM : out STRING;
			   	 LAST : out NATURAL);  
									
	procedure PUT_line 	(FILE : in FILE_TYPE;
				 ITEM : in STRING);			
	procedure PUT_line 	(ITEM : in STRING);			


	-- Generic package for Input-Output of Integer type

	generic 
		type NUM is range <>;
	package INTEGER_IO is 

   	   DEFAULT_WIDTH : FIELD := NUM'WIDTH;
	
	   DEFAULT_BASE  : NUMBER_BASE := 10;

	procedure GET 	(FILE	 : in FILE_TYPE;
			 ITEM	 : out NUM;
			 WIDTH 	 : in FIELD := 0);
	procedure GET	(ITEM  	 : out NUM;
			 WIDTH   : in FIELD := 0);		

	procedure PUT	(FILE	 : in FILE_TYPE;
			 ITEM	 : in NUM;
			 WIDTH	 : in FIELD := 0;
			 BASE 	 : in NUMber_BASE := DEFAULT_BASE);
	procedure PUT	(ITEM	 : in NUM;
			 WIDTH	 : in FIELD := 0;
			 BASE 	 : in NUMber_BASE := DEFAULT_BASE);

	procedure GET	(from 	 : in STRING;
			 ITEM	 : out NUM;
			 LAST	 : out POSITIVE);	
	procedure PUT	(TO 	 : out STRING;
			 ITEM    : in NUM;
			 BASE 	 : in NUMber_BASE := DEFAULT_BASE);
									
	end INTEGER_IO;

	-- Generic package for Input-Output  for Real Types

	generic 
		type NUMF is  digits <>;

	package FLOAT_IO is

		DEFAULT_FORE : constant := 2; 			--FIELD := 2;
		DEFAULT_AFT  : constant := 6; -- NUMF'DIGITS-1;	--FIELD 
		DEFAULT_EXP  : constant := 3; 			--FIELD


	procedure GET 	(FILE	 : in FILE_TYPE;
			 ITEM	 : out NUMF;
			 WIDTH 	 : in FIELD := 0);	
	procedure GET	(ITEM  	 : out NUMF;
			 WIDTH   : in FIELD := 0);

	procedure PUT	(FILE	 : in FILE_TYPE;
			 ITEM	 : in NUMF;
			 FORE	 : in FIELD := DEFAULT_FORE;
			 AFT 	 : in FIELD := DEFAULT_AFT;
			 EXP 	 : in FIELD := DEFAULT_EXP);
	procedure PUT	(ITEM	 : in NUMF;
			 FORE	 : in FIELD := DEFAULT_FORE;
			 AFT 	 : in FIELD := DEFAULT_AFT;
			 EXP 	 : in FIELD := DEFAULT_EXP);

	procedure GET	(from 	 : in STRING;
			 ITEM	 : out NUMF;
			 LAST	 : out POSITIVE);
	procedure PUT	(TO	 : out STRING;
			 ITEM 	 : in NUMF;
			 AFT 	 : in FIELD := DEFAULT_AFT;
			 EXP 	 : in FIELD := DEFAULT_EXP);

	end FLOAT_IO;

	
	generic 
		type NUMFI is private ; --digits <>;

	package FIXED_IO is

		DEFAULT_FORE : constant := 2; --NUMFI'FORE; --FIELD := NUMFI'FORE;
		DEFAULT_AFT  : constant := 6; --NUMFI'AFT; --FIELD := NUMFI'AFT;
		DEFAULT_EXP  : constant := 0; --FIELD


	procedure GET 	(FILE	 : in FILE_TYPE;
			 ITEM	 : out NUMFI;
			 WIDTH 	 : in FIELD := 0);	
	procedure GET	(ITEM  	 : out NUMFI;
			 WIDTH   : in FIELD := 0);

	procedure PUT	(FILE	 : in FILE_TYPE;
			 ITEM	 : in NUMFI;
			 FORE	 : in FIELD := DEFAULT_FORE;
			 AFT 	 : in FIELD := DEFAULT_AFT;
			 EXP 	 : in FIELD := DEFAULT_EXP);
	procedure PUT	(ITEM	 : in NUMFI;
			 FORE	 : in FIELD := DEFAULT_FORE;
			 AFT 	 : in FIELD := DEFAULT_AFT;
			 EXP 	 : in FIELD := DEFAULT_EXP);

	procedure GET	(from 	 : in STRING;
			 ITEM	 : out NUMFI;
			 LAST	 : out POSITIVE);
	procedure PUT	(TO	 : out STRING;
			 ITEM 	 : in NUMFI;
			 AFT 	 : in FIELD := DEFAULT_AFT;
			 EXP 	 : in FIELD := DEFAULT_EXP);

	end FIXED_IO;


	-- Generic package  for Input-Output of Enumeration Types
	generic
		type ENUM is private;

	package ENUMERATION_IO is 

	DEFAULT_WIDTH : constant := 0 ; -- FIELD := 0;
	DEFAULT_SETTING : TYPE_SET := UPPER_CASE;


	procedure GET	(FILE	 : in FILE_TYPE;
			 ITEM 	 : out ENUM);
	procedure GET	(ITEM	 : out ENUM);

	procedure PUT	(FILE	 : in FILE_TYPE;
			 ITEM	 : in ENUM;
			 WIDTH   : in FIELD := DEFAULT_WIDTH;
			 SET 	 : in TYPE_SET := UPPER_CASE); --DEFAULT_SETTING);
	procedure PUT	(ITEM	 : in ENUM;
			 WIDTH   : in FIELD := DEFAULT_WIDTH;
			 SET 	 : in TYPE_SET := UPPER_CASE); --DEFAULT_SETTING);

	procedure GET	(FROM 	 : in STRING;
			 ITEM	 : out ENUM;
			 LAST	 : out POSITIVE);
	procedure PUT	(TO 	 : out STRING;
			 ITEM	 : in ENUM;
			 SET	 : in TYPE_SET := UPPER_CASE); --DEFAULT_SETTING);

	end ENUMERATION_IO;

	-- Exceptions

    	     STATUS_ERROR : exception renames IO_EXCEPTIONS.STATUS_ERROR; 
	     MODE_ERROR   : exception renames IO_EXCEPTIONS.MODE_ERROR;
	     NAME_ERROR   : exception renames IO_EXCEPTIONS.NAME_ERROR;
   	     USE_ERROR    : exception renames IO_EXCEPTIONS.USE_ERROR;
  	     DEVICE_ERROR : exception renames IO_EXCEPTIONS.DEVICE_ERROR;
  	     END_ERROR    : exception renames IO_EXCEPTIONS.END_ERROR;
  	     DATA_ERROR   : exception renames IO_EXCEPTIONS.DATA_ERROR;


	private

             type FILE_TYPE is RECORD
                                 FILE_POS : COUNT := 0;
                               end RECORD;
   end TEXT_IO;

   package body TEXT_IO is
	
	function STANDARD_INPUT return FILE_TYPE is

		STD_IN : FILE_TYPE;
		begin
			STD_IN:= (FILE_POS => 1);
			return STD_IN;
		end STANDARD_INPUT;
	
	function STANDARD_OUTPUT return FILE_TYPE is

		STD_OUT : FILE_TYPE;
		begin
			STD_OUT:= (FILE_POS => 2);
			return STD_OUT;
		end STANDARD_OUTPUT;

   end TEXT_IO;
	

