2001-04-09 20:54:03 +01:00
|
|
|
/*************************************************************************
|
|
|
|
* *
|
|
|
|
* YAP Prolog *
|
|
|
|
* *
|
|
|
|
* Yap Prolog was developed at NCCUP - Universidade do Porto *
|
|
|
|
* *
|
|
|
|
* Copyright L.Damas, V.S.Costa and Universidade do Porto 1985-1997 *
|
|
|
|
* *
|
|
|
|
**************************************************************************
|
|
|
|
* *
|
|
|
|
* File: yio.yap *
|
|
|
|
* Last rev: *
|
|
|
|
* mods: *
|
|
|
|
* comments: Input output predicates *
|
|
|
|
* *
|
|
|
|
*************************************************************************/
|
|
|
|
|
2001-09-21 18:08:36 +01:00
|
|
|
/* stream predicates */
|
|
|
|
|
2001-04-09 20:54:03 +01:00
|
|
|
/* check whether a list of options is valid */
|
|
|
|
'$check_io_opts'(V,G) :- var(V), !,
|
2002-09-09 18:40:12 +01:00
|
|
|
'$do_error'(instantiation_error,G).
|
2001-04-09 20:54:03 +01:00
|
|
|
'$check_io_opts'([],_) :- !.
|
|
|
|
'$check_io_opts'([H|_],G) :- var(H), !,
|
2002-09-09 18:40:12 +01:00
|
|
|
'$do_error'(instantiation_error,G).
|
2001-04-09 20:54:03 +01:00
|
|
|
'$check_io_opts'([Opt|T],G) :- !,
|
|
|
|
'$check_opt'(G,Opt,G),
|
|
|
|
'$check_io_opts'(T,G).
|
|
|
|
'$check_io_opts'(T,G) :-
|
2002-09-09 18:40:12 +01:00
|
|
|
'$do_error'(type_error(list,T),G).
|
2001-04-09 20:54:03 +01:00
|
|
|
|
2006-04-25 17:02:20 +01:00
|
|
|
'$check_opt'(read_term(_,_),Opt,G) :-
|
2001-04-09 20:54:03 +01:00
|
|
|
'$check_opt_read'(Opt, G).
|
2006-04-25 17:02:20 +01:00
|
|
|
'$check_opt'(stream_property(_,_),Opt,G) :-
|
2001-04-09 20:54:03 +01:00
|
|
|
'$check_opt_sp'(Opt, G).
|
|
|
|
|
|
|
|
'$check_opt_read'(variables(_), _) :- !.
|
|
|
|
'$check_opt_read'(variable_names(_), _) :- !.
|
|
|
|
'$check_opt_read'(singletons(_), _) :- !.
|
|
|
|
'$check_opt_read'(syntax_errors(T), G) :- !,
|
|
|
|
'$check_read_syntax_errors_arg'(T, G).
|
2005-10-21 17:09:03 +01:00
|
|
|
'$check_opt_read'(term_position(_), _) :- !.
|
2011-06-12 17:23:10 +01:00
|
|
|
'$check_opt_read'(term_position(_), _) :- !.
|
|
|
|
'$check_opt_read'(comments(_), _) :- !.
|
2011-06-14 09:03:44 +01:00
|
|
|
'$check_opt_read'(module(_), _) :- !.
|
2001-04-09 20:54:03 +01:00
|
|
|
'$check_opt_read'(A, G) :-
|
2002-09-09 18:40:12 +01:00
|
|
|
'$do_error'(domain_error(read_option,A),G).
|
2001-04-09 20:54:03 +01:00
|
|
|
|
|
|
|
'$check_opt_sp'(file_name(_), _) :- !.
|
|
|
|
'$check_opt_sp'(mode(_), _) :- !.
|
|
|
|
'$check_opt_sp'(input, _) :- !.
|
|
|
|
'$check_opt_sp'(output, _) :- !.
|
|
|
|
'$check_opt_sp'(alias(_), _) :- !.
|
|
|
|
'$check_opt_sp'(position(_), _) :- !.
|
|
|
|
'$check_opt_sp'(end_of_stream(_), _) :- !.
|
|
|
|
'$check_opt_sp'(eof_action(_), _) :- !.
|
|
|
|
'$check_opt_sp'(reposition(_), _) :- !.
|
|
|
|
'$check_opt_sp'(type(_), _) :- !.
|
2007-04-03 00:04:48 +01:00
|
|
|
'$check_opt_sp'(bom(_), _) :- !.
|
2007-04-03 16:03:11 +01:00
|
|
|
'$check_opt_sp'(encoding(_), _) :- !.
|
|
|
|
'$check_opt_sp'(representation_errors(_), _) :- !.
|
2001-04-09 20:54:03 +01:00
|
|
|
'$check_opt_sp'(A, G) :-
|
2002-09-09 18:40:12 +01:00
|
|
|
'$do_error'(domain_error(stream_property,A),G).
|
2001-04-09 20:54:03 +01:00
|
|
|
|
|
|
|
'$check_read_syntax_errors_arg'(X, G) :- var(X), !,
|
2002-09-09 18:40:12 +01:00
|
|
|
'$do_error'(instantiation_error,G).
|
2001-04-09 20:54:03 +01:00
|
|
|
'$check_read_syntax_errors_arg'(dec10,_) :- !.
|
|
|
|
'$check_read_syntax_errors_arg'(fail,_) :- !.
|
|
|
|
'$check_read_syntax_errors_arg'(error,_) :- !.
|
|
|
|
'$check_read_syntax_errors_arg'(quiet,_) :- !.
|
|
|
|
'$check_read_syntax_errors_arg'(X,G) :-
|
2002-09-09 18:40:12 +01:00
|
|
|
'$do_error'(domain_error(read_option,syntax_errors(X)),G).
|
2001-04-09 20:54:03 +01:00
|
|
|
|
2010-12-13 12:38:37 +00:00
|
|
|
'$check_boolean'(X, _, _, G) :- var(X), !,
|
2002-09-09 18:40:12 +01:00
|
|
|
'$do_error'(instantiation_error,G).
|
2010-12-13 12:38:37 +00:00
|
|
|
'$check_boolean'(true,_,_,_) :- !.
|
|
|
|
'$check_boolean'(false,_,_,_) :- !.
|
|
|
|
'$check_boolean'(X,B,T,G) :-
|
|
|
|
'$do_error'(domain_error(B,T),G).
|
2001-04-09 20:54:03 +01:00
|
|
|
|
2012-07-26 21:16:26 +01:00
|
|
|
socket(Domain, Sock) :-
|
|
|
|
(
|
|
|
|
'$undefined'(ip_socket(_,_),yap_sockets)
|
|
|
|
->
|
|
|
|
load_files(library(sockets), [silent(true),if(not_loaded)])
|
|
|
|
;
|
|
|
|
true
|
|
|
|
),
|
|
|
|
yap_sockets:ip_socket(Domain, Sock).
|
|
|
|
|
|
|
|
socket(Domain, Type, Protocol, Sock) :-
|
|
|
|
(
|
|
|
|
'$undefined'(ip_socket(_,_),yap_sockets)
|
|
|
|
->
|
|
|
|
load_files(library(sockets), [silent(true),if(not_loaded)])
|
|
|
|
;
|
|
|
|
true
|
|
|
|
),
|
|
|
|
yap_sockets:ip_socket(Domain, Type, Protocol, Sock).
|
|
|
|
|
2012-08-02 15:36:37 +01:00
|
|
|
socket_connect(Sock, Host, Read) :-
|
|
|
|
(
|
|
|
|
'$undefined'(ip_socket(_,_),yap_sockets)
|
|
|
|
->
|
|
|
|
load_files(library(sockets), [silent(true),if(not_loaded)])
|
|
|
|
;
|
|
|
|
true
|
|
|
|
),
|
|
|
|
yap_sockets:ip_socket(Domain, Type, Protocol, Sock).
|
|
|
|
|
2011-02-12 18:42:44 +00:00
|
|
|
open_pipe_streams(Read, Write) :-
|
|
|
|
(
|
|
|
|
'$undefined'(pipe(_,_),unix)
|
|
|
|
->
|
|
|
|
load_files(library(unix), [silent(true),if(not_loaded)])
|
|
|
|
;
|
|
|
|
true
|
|
|
|
),
|
2012-10-28 22:27:27 +00:00
|
|
|
unix:pipe(Read, Write),
|
|
|
|
yap_flag(encoding, X),
|
|
|
|
set_stream(Read, encoding(X) ),
|
|
|
|
set_stream(Write, encoding(X) ).
|
2001-05-21 21:00:05 +01:00
|
|
|
|
2011-03-26 15:17:17 +00:00
|
|
|
fileerrors :- '$swi_set_prolog_flag'(fileerrors, true).
|
|
|
|
|
|
|
|
nofileerrors :- '$swi_set_prolog_flag'(fileerrors, false).
|
2001-04-09 20:54:03 +01:00
|
|
|
|
2011-07-27 16:30:29 +01:00
|
|
|
exists(F) :-
|
|
|
|
absolute_file_name(F, _, [file_errors(fail),access(exist),expand(true)]).
|
2001-04-09 20:54:03 +01:00
|
|
|
|
|
|
|
/* Term IO */
|
|
|
|
|
2002-06-05 02:22:57 +01:00
|
|
|
read(T) :-
|
2013-11-20 22:30:49 +00:00
|
|
|
read_term(T, []).
|
2001-04-09 20:54:03 +01:00
|
|
|
|
|
|
|
read(Stream,T) :-
|
2013-11-20 22:30:49 +00:00
|
|
|
read_term(Stream, T, []).
|
|
|
|
|
2001-04-09 20:54:03 +01:00
|
|
|
|
|
|
|
/* meaning of flags for '$write' is
|
|
|
|
1 quote illegal atoms
|
|
|
|
2 ignore operator declarations
|
|
|
|
4 output '$VAR'(N) terms as A, B, C, ...
|
|
|
|
8 use portray(_)
|
|
|
|
|
2010-12-13 12:38:37 +00:00
|
|
|
flags are defined in yapio.h
|
|
|
|
*/
|
2001-09-21 18:08:36 +01:00
|
|
|
|
2011-02-14 20:40:10 +00:00
|
|
|
display(T) :-
|
|
|
|
current_output(Out),
|
|
|
|
write_term(Out, T, [ignore_ops(true)]).
|
2001-04-09 20:54:03 +01:00
|
|
|
|
2011-02-14 20:40:10 +00:00
|
|
|
display(Stream, T) :-
|
|
|
|
write_term(Term, T, [ignore_ops(true)]).
|
2001-04-09 20:54:03 +01:00
|
|
|
|
2008-08-10 16:44:12 +01:00
|
|
|
format(T) :-
|
|
|
|
format(T, []).
|
|
|
|
|
2011-02-14 20:47:34 +00:00
|
|
|
writeln(T) :-
|
|
|
|
write(T),
|
|
|
|
nl.
|
2008-08-10 16:44:12 +01:00
|
|
|
|
2001-04-09 20:54:03 +01:00
|
|
|
/* interface to user portray */
|
|
|
|
'$portray'(T) :-
|
2001-11-15 00:01:43 +00:00
|
|
|
\+ '$undefined'(portray(_),user),
|
2006-12-13 16:10:26 +00:00
|
|
|
'$system_catch'(call(portray(T)),user,Error,user:'$Error'(Error)), !,
|
2003-08-27 14:37:10 +01:00
|
|
|
set_value('$portray',true), fail.
|
|
|
|
'$portray'(_) :- set_value('$portray',false), fail.
|
2001-04-09 20:54:03 +01:00
|
|
|
|
|
|
|
/* character I/O */
|
|
|
|
|
2008-03-12 15:37:34 +00:00
|
|
|
ttyget(N) :- get(user_input,N).
|
2001-04-09 20:54:03 +01:00
|
|
|
|
2008-03-12 15:37:34 +00:00
|
|
|
ttyget0(N) :- get0(user_input,N).
|
2001-04-09 20:54:03 +01:00
|
|
|
|
|
|
|
ttyskip(N) :- N1 is N, '$skip'(user_input,N1).
|
|
|
|
|
2011-02-14 19:57:22 +00:00
|
|
|
ttyput(N) :- N1 is N, put(user_output,N1).
|
2001-04-09 20:54:03 +01:00
|
|
|
|
|
|
|
ttynl :- nl(user_output).
|
|
|
|
|
|
|
|
current_line_number(N) :-
|
2011-02-14 14:59:15 +00:00
|
|
|
current_input(Stream),
|
|
|
|
line_count(Stream, N).
|
2001-04-09 20:54:03 +01:00
|
|
|
|
2011-02-14 14:59:15 +00:00
|
|
|
current_line_number(Stream,N) :-
|
|
|
|
line_count(Stream, N).
|
2001-04-09 20:54:03 +01:00
|
|
|
|
2011-02-14 20:14:31 +00:00
|
|
|
stream_position(Stream, Position) :-
|
|
|
|
stream_property(Stream, position(Position)).
|
2012-08-02 15:36:37 +01:00
|
|
|
|
2011-02-14 20:14:31 +00:00
|
|
|
stream_position(Stream, Position, NewPosition) :-
|
|
|
|
stream_property(Stream, position(Position)),
|
|
|
|
set_stream_position(Stream, NewPosition).
|
2001-04-09 20:54:03 +01:00
|
|
|
|
2005-01-29 04:43:14 +00:00
|
|
|
at_end_of_line :-
|
|
|
|
current_input(S),
|
|
|
|
at_end_of_line(S).
|
|
|
|
|
|
|
|
at_end_of_line(S) :-
|
2011-02-14 22:55:59 +00:00
|
|
|
current_stream(S, end_of_stream(past)), !.
|
2005-01-29 04:43:14 +00:00
|
|
|
at_end_of_line(S) :-
|
2011-02-14 20:14:31 +00:00
|
|
|
peek(S,N), ( N = 10 -> true ; N = -1).
|
2005-01-29 04:43:14 +00:00
|
|
|
|
|
|
|
|
2001-04-09 20:54:03 +01:00
|
|
|
consult_depth(LV) :- '$show_consult_level'(LV).
|
|
|
|
|
|
|
|
current_char_conversion(X,Y) :-
|
|
|
|
var(X), !,
|
|
|
|
'$all_char_conversions'(List),
|
|
|
|
'$fetch_char_conversion'(List,X,Y).
|
|
|
|
current_char_conversion(X,Y) :-
|
|
|
|
'$current_char_conversion'(X,Y).
|
|
|
|
|
|
|
|
|
|
|
|
'$fetch_char_conversion'([X,Y|_],X,Y).
|
|
|
|
'$fetch_char_conversion'([_,_|List],X,Y) :-
|
|
|
|
'$fetch_char_conversion'(List,X,Y).
|
|
|
|
|
|
|
|
|
2012-08-02 15:36:37 +01:00
|
|
|
current_stream(File, Mode, Stream) :-
|
|
|
|
stream_property(Stream, mode(Mode)),
|
|
|
|
'$stream_name'(Stream, File).
|
|
|
|
|
|
|
|
'$stream_name'(Stream, File) :-
|
|
|
|
stream_property(Stream, file_name(File)), !.
|
|
|
|
'$stream_name'(Stream, file_no(File)) :-
|
|
|
|
stream_property(Stream, file_no(File)), !.
|
|
|
|
'$stream_name'(Stream, Stream).
|
2002-01-07 06:28:04 +00:00
|
|
|
|
2005-10-28 18:38:50 +01:00
|
|
|
'$extend_file_search_path'(P) :-
|
|
|
|
atom_codes(P,S),
|
|
|
|
'$env_separator'(ES),
|
2010-04-14 10:57:00 +01:00
|
|
|
'$split_for_path'(S,0'=,ES,Paths), %'
|
2005-10-28 18:38:50 +01:00
|
|
|
'$add_file_search_paths'(Paths).
|
|
|
|
|
|
|
|
'$split_for_path'([], _, _, []).
|
|
|
|
'$split_for_path'(S, S1, S2, [A1=A2|R]) :-
|
|
|
|
'$fetch_first_path'(S, S1, A1, SR1),
|
|
|
|
'$fetch_second_path'(SR1, S2, A2, SR),
|
|
|
|
'$split_for_path'(SR, S1, S2, R) .
|
|
|
|
|
|
|
|
'$fetch_first_path'([S1|SR],S1,[],SR) :- !.
|
|
|
|
'$fetch_first_path'([C|S],S1,[C|F],SR) :-
|
|
|
|
'$fetch_first_path'(S,S1,F,SR).
|
|
|
|
|
|
|
|
'$fetch_second_path'([],_,[],[]).
|
|
|
|
'$fetch_second_path'([S1|SR],S1,[],SR) :- !.
|
|
|
|
'$fetch_second_path'([C|S],S1,[C|A2],SR) :-
|
|
|
|
'$fetch_second_path'(S,S1,A2,SR).
|
|
|
|
|
|
|
|
'$add_file_search_paths'([]).
|
|
|
|
'$add_file_search_paths'([NS=DS|Paths]) :-
|
|
|
|
atom_codes(N,NS),
|
|
|
|
atom_codes(D,DS),
|
|
|
|
assert(user:file_search_path(N,D)),
|
|
|
|
'$add_file_search_paths'(Paths).
|
|
|
|
|
|
|
|
|
|
|
|
'$format@'(Goal,Out) :-
|
2011-02-12 18:42:44 +00:00
|
|
|
with_output_to(codes(Out), Goal).
|
2005-10-28 18:38:50 +01:00
|
|
|
|
2010-04-13 00:31:48 +01:00
|
|
|
sformat(String, Form, Args) :-
|
2011-02-12 18:42:44 +00:00
|
|
|
format(codes(String, []), Form, Args).
|
2005-10-28 18:38:50 +01:00
|
|
|
|
2005-12-05 17:16:12 +00:00
|
|
|
write_depth(T,L) :- write_depth(T,L,_).
|
2007-09-27 16:25:34 +01:00
|
|
|
|
2011-02-14 14:59:15 +00:00
|
|
|
%% stream_position_data(?Field, +Pos, ?Date)
|
|
|
|
%
|
|
|
|
% Extract values from stream position objects. '$stream_position' is
|
|
|
|
% of the format '$stream_position'(Byte, Char, Line, LinePos)
|
|
|
|
|
|
|
|
stream_position_data(Prop, Term, Value) :-
|
|
|
|
nonvar(Prop), !,
|
2011-02-14 22:13:45 +00:00
|
|
|
( '$stream_position_field'(Prop, Pos)
|
2011-02-14 14:59:15 +00:00
|
|
|
-> arg(Pos, Term, Value)
|
|
|
|
; throw(error(domain_error(stream_position_data, Prop)))
|
|
|
|
).
|
|
|
|
stream_position_data(Prop, Term, Value) :-
|
2011-02-14 22:13:45 +00:00
|
|
|
'$stream_position_field'(Prop, Pos),
|
2011-02-14 14:59:15 +00:00
|
|
|
arg(Pos, Term, Value).
|
|
|
|
|
2011-02-14 22:13:45 +00:00
|
|
|
'$stream_position_field'(char_count, 1).
|
|
|
|
'$stream_position_field'(line_count, 2).
|
|
|
|
'$stream_position_field'(line_position, 3).
|
|
|
|
'$stream_position_field'(byte_count, 4).
|
2008-02-12 17:03:59 +00:00
|
|
|
|
2008-02-23 01:32:31 +00:00
|
|
|
|
2008-03-12 15:37:34 +00:00
|
|
|
'$default_expand'(Expand) :-
|
2013-10-29 12:43:31 +00:00
|
|
|
get_value('$open_expands_filename',Expand).
|
2008-03-12 15:37:34 +00:00
|
|
|
|
|
|
|
'$set_default_expand'(true) :- !,
|
2013-10-29 12:43:31 +00:00
|
|
|
set_value('$open_expands_filename',true).
|
2008-03-12 15:37:34 +00:00
|
|
|
'$set_default_expand'(false) :- !,
|
2013-10-29 12:43:31 +00:00
|
|
|
set_value('$open_expands_filename',false).
|
2008-03-12 15:37:34 +00:00
|
|
|
'$set_default_expand'(V) :- !,
|
|
|
|
'$do_error'(domain_error(flag_value,V),yap_flag(open_expands_file_name,X)).
|
2009-07-01 18:11:33 +01:00
|
|
|
|
|
|
|
prolog_file_name(File, PrologFileName) :-
|
|
|
|
var(File), !,
|
|
|
|
'$do_error'(instantiation_error, prolog_file_name(File, PrologFileName)).
|
|
|
|
prolog_file_name(user, Out) :- !, Out = user.
|
|
|
|
prolog_file_name(File, PrologFileName) :-
|
|
|
|
atom(File), !,
|
2010-04-22 12:12:24 +01:00
|
|
|
operating_system_support:true_file_name(File, PrologFileName).
|
2009-07-01 18:11:33 +01:00
|
|
|
prolog_file_name(File, PrologFileName) :-
|
|
|
|
'$do_error'(type_error(atom,T), prolog_file_name(File, PrologFileName)).
|
2010-04-13 00:31:48 +01:00
|
|
|
|
2010-04-14 10:57:00 +01:00
|
|
|
|
|
|
|
'$codes_to_chars'(String0, String, String0) :- String0 == String, !.
|
|
|
|
'$codes_to_chars'(String0, [Code|String], [Char|Chars]) :-
|
|
|
|
atom_codes(Char, [Code]),
|
2010-08-04 13:04:17 +01:00
|
|
|
'$codes_to_chars'(String0, String, Chars).
|
|
|
|
|
2010-12-02 19:57:55 +00:00
|
|
|
|
2010-11-24 08:41:21 +00:00
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|