/*-------------------------------------------------------------------------*/
/* GNU Prolog                                                              */
/*                                                                         */
/* Part  : Prolog buit-in predicates                                       */
/* File  : dec10io.pl                                                      */
/* Descr.: DEC-10 I/O compatibility library                                */
/* Author: Daniel Diaz                                                     */
/*                                                                         */
/* Copyright (C) 1999 Daniel Diaz                                          */
/*                                                                         */
/* GNU Prolog is free software; you can redistribute it and/or modify it   */
/* under the terms of the GNU General Public License as published by the   */
/* Free Software Foundation; either version 2, or any later version.       */
/*                                                                         */
/* GNU Prolog is distributed in the hope that it will be useful, but       */
/* WITHOUT ANY WARRANTY; without even the implied warranty of              */
/* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU        */
/* General Public License for more details.                                */
/*                                                                         */
/* You should have received a copy of the GNU General Public License along */
/* with this program; if not, write to the Free Software Foundation, Inc.  */
/* 59 Temple Place - Suite 330, Boston, MA 02111, USA.                     */
/*-------------------------------------------------------------------------*/

:- built_in.

'$use_dec10io'.



'$find_existing_stream'(user,       '$stream'(0),input).

'$find_existing_stream'(user_input, '$stream'(0),input).

'$find_existing_stream'(user,       '$stream'(1),output).

'$find_existing_stream'(user_output,'$stream'(1),output).

'$find_existing_stream'(File,Stream,Mode):-
	clause('$dec10_stream'(File,Stream,Mode),_),
	!,
	(current_stream(Stream),                    % test if it still exists
         stream_property(Stream,file_name(File)),   % (with correct name)
         stream_property(Stream,Mode)               % (and correct mode)
                -> true
                ;  retract('$dec10_stream'(File,Stream,Mode)), % no, retract
                   fail).                                      % and fail

'$find_existing_stream'(Stream,Stream,Mode):-
	 Stream='$stream'(S),                       % test if it is a stream
	 integer(S),
	 current_stream(Stream),
         stream_property(Stream,Mode).




see(File):-
	set_bip_name(see,1),
        nonvar(File),
	!,
        ('$find_existing_stream'(File,Stream,input)
               ;
 	 set_bip_name(see,1),
         '$open'(File,read,Stream,[]),
         assertz('$dec10_stream'(File,Stream,input))),
	!,
        set_input(Stream).

see(_):-
        '$pl_err_instantiation'.




seeing(File):-
	set_bip_name(seeing,1),
        current_input(Stream),
        '$find_existing_stream'(File,Stream,input),
	!.




seen:- 
	set_bip_name(seen,0),
        current_input(Stream),
	close(Stream),                      % before find_existing to retract
        ('$find_existing_stream'(_,Stream,input)
           ;
         true),
	!.



tell(File):-
	set_bip_name(tell,1),
        nonvar(File),
	!,
        ('$find_existing_stream'(File,Stream,output)
               ;
         set_bip_name(tell,1),
         '$open'(File,write,Stream,[]),
         assertz('$dec10_stream'(File,Stream,output))),
	!,
        set_output(Stream).

tell(_):-
        '$pl_err_instantiation'.




telling(File):-
	set_bip_name(telling,1),
        current_output(Stream),
        '$find_existing_stream'(File,Stream,output),
	!.




told:- 
	set_bip_name(told,0),
        current_output(Stream),
	close(Stream),                      % before find_existing to retract
        ('$find_existing_stream'(_,Stream,output)
           ;
         true),
	!.


append(File):-
	set_bip_name(append,1),
        nonvar(File),
	!,
        ('$find_existing_stream'(File,Stream,output)
               ;
	 set_bip_name(append,1),
         '$open'(File,append,Stream,[]),
         assertz('$dec10_stream'(File,Stream,output))),
	!,
        set_output(Stream).

append(_):-
        '$pl_err_instantiation'.




get0(X):-
	set_bip_name(get0,1),
	'$call_c_test'('Get_Code_1'(X)).



get(X):-
	set_bip_name(get,1),
	'$check_in_character_code'(X),
	'$call_c_test'('Get_Code_1'(X0)),
	(X0=<0'  -> get(X)
                 ;  X=X0).

put(X):-
	set_bip_name(put,1),
	'$call_c'('Put_Code_1'(X)).


skip(X):-
	set_bip_name(skip,1),
	'$check_in_character_code'(X),
	repeat,
	'$call_c_test'('Get_Code_1'(X0)),
	X0=X,
	!.




'$check_in_character_code'(X):-
	var(X),
	!.

'$check_in_character_code'(X):-
	integer(X),
	!,
        (X>= -1, X=<255 -> true
                        ; '$pl_err_representation'(in_character_code)).

'$check_in_character_code'(X):-
	'$pl_err_type'(integer,X).


tab(Exp):-
	set_bip_name(tab,1),
	'$arith_eval'(Exp,N),
	for(_,1,N),
	put_char(' '),
	fail.

tab(_).

	
