From 38fa886e18f4087042ad17deca97abe32daab54b Mon Sep 17 00:00:00 2001 From: ubu32 Date: Mon, 14 Feb 2011 12:14:31 -0800 Subject: [PATCH] more stream stuff. --- C/iopreds.c | 129 +--------------------------------------------------- pl/boot.yap | 11 +++++ pl/yio.yap | 83 +++------------------------------ 3 files changed, 19 insertions(+), 204 deletions(-) diff --git a/C/iopreds.c b/C/iopreds.c index f92d9aa7e..ad13ff4ad 100644 --- a/C/iopreds.c +++ b/C/iopreds.c @@ -113,8 +113,6 @@ STATIC_PROTO (Int p_past_eof, (void)); STATIC_PROTO (Int p_skip, (void)); STATIC_PROTO (Int p_write_depth, (void)); STATIC_PROTO (Int p_user_file_name, (void)); -STATIC_PROTO (Int p_show_stream_position, (void)); -STATIC_PROTO (Int p_set_stream_position, (void)); STATIC_PROTO (Int p_format, (void)); STATIC_PROTO (Int p_startline, (void)); STATIC_PROTO (Int p_change_type_of_char, (void)); @@ -2359,140 +2357,19 @@ p_user_file_name (void) return (Yap_unify_constant (ARG2, tout)); } + static Term StreamPosition(int sno) { - Term sargs[5]; - Int cpos; - cpos = Stream[sno].charcount; - if (Stream[sno].status & SWI_Stream_f) { - return Yap_get_stream_position(Stream[sno].u.swi_stream.swi_ptr); - } - if (Stream[sno].stream_getc == PlUnGetc) { - cpos--; - } - sargs[0] = MkIntegerTerm (cpos); - sargs[1] = MkIntegerTerm (StartLine = Stream[sno].linecount); - sargs[2] = MkIntegerTerm (Stream[sno].linepos); - sargs[3] = sargs[4] = MkIntTerm (0); - return Yap_MkApplTerm (FunctorStreamPos, 5, sargs); + return TermNil; } - Term Yap_StreamPosition(int sno) { return StreamPosition(sno); } -static Int -p_show_stream_position (void) -{ /* '$show_stream_position'(+Stream,Pos) */ - Term tout; - int sno = - CheckStream (ARG1, Input_Stream_f | Output_Stream_f | Append_Stream_f, "stream_position/2"); - if (sno < 0) - return (FALSE); - tout = StreamPosition(sno); - UNLOCK(Stream[sno].streamlock); - return Yap_unify (ARG2, tout); -} - -static Int -p_set_stream_position (void) -{ /* '$set_stream_position'(+Stream,Pos) */ - Term tin, tp; - Int char_pos; - int sno = CheckStream (ARG1, Input_Stream_f | Output_Stream_f | Append_Stream_f, "set_stream_position/2"); - if (sno < 0) { - return (FALSE); - } - tin = Deref (ARG2); - if (IsVarTerm (tin)) { - UNLOCK(Stream[sno].streamlock); - Yap_Error(INSTANTIATION_ERROR, tin, "set_stream_position/2"); - return (FALSE); - } else if (!(IsApplTerm (tin))) { - UNLOCK(Stream[sno].streamlock); - Yap_Error(DOMAIN_ERROR_STREAM_POSITION, tin, "set_stream_position/2"); - return (FALSE); - } - if (FunctorOfTerm (tin) == FunctorStreamPos) { - if (IsVarTerm (tp = ArgOfTerm (1, tin))) { - UNLOCK(Stream[sno].streamlock); - Yap_Error(INSTANTIATION_ERROR, tp, "set_stream_position/2"); - return (FALSE); - } else if (!IsIntTerm (tp)) { - UNLOCK(Stream[sno].streamlock); - Yap_Error(DOMAIN_ERROR_STREAM_POSITION, tin, "set_stream_position/2"); - return (FALSE); - } - if (!(Stream[sno].status & Seekable_Stream_f) ) { - UNLOCK(Stream[sno].streamlock); - Yap_Error(PERMISSION_ERROR_REPOSITION_STREAM, ARG1,"set_stream_position/2"); - return(FALSE); - } - char_pos = IntOfTerm (tp); - if (IsVarTerm (tp = ArgOfTerm (2, tin))) { - UNLOCK(Stream[sno].streamlock); - Yap_Error(INSTANTIATION_ERROR, tp, "set_stream_position/2"); - return (FALSE); - } else if (!IsIntTerm (tp)) { - UNLOCK(Stream[sno].streamlock); - Yap_Error(DOMAIN_ERROR_STREAM_POSITION, tin, "set_stream_position/2"); - return (FALSE); - } - Stream[sno].charcount = char_pos; - Stream[sno].linecount = IntOfTerm (tp); - if (IsVarTerm (tp = ArgOfTerm (3, tin))) { - UNLOCK(Stream[sno].streamlock); - Yap_Error(INSTANTIATION_ERROR, tp, "set_stream_position/2"); - return (FALSE); - } else if (!IsIntTerm (tp)) { - UNLOCK(Stream[sno].streamlock); - Yap_Error(DOMAIN_ERROR_STREAM_POSITION, tin, "set_stream_position/2"); - return (FALSE); - } - Stream[sno].linepos = IntOfTerm (tp); - if (YP_fseek (Stream[sno].u.file.file, (long) (char_pos), 0) == -1) { - UNLOCK(Stream[sno].streamlock); - Yap_Error(SYSTEM_ERROR, tp, - "fseek failed for set_stream_position/2"); - return(FALSE); - } - Stream[sno].stream_getc = PlGetc; - Stream[sno].stream_gets = PlGetsFunc(); - } else if (FunctorOfTerm (tin) == FunctorStreamEOS) { - if (IsVarTerm (tp = ArgOfTerm (1, tin))) { - UNLOCK(Stream[sno].streamlock); - Yap_Error(INSTANTIATION_ERROR, tp, "set_stream_position/2"); - return (FALSE); - } else if (tp != MkAtomTerm(AtomAt)) { - UNLOCK(Stream[sno].streamlock); - Yap_Error(DOMAIN_ERROR_STREAM_POSITION, tin, "set_stream_position/2"); - return (FALSE); - } - if (!(Stream[sno].status & Seekable_Stream_f) ) { - UNLOCK(Stream[sno].streamlock); - Yap_Error(PERMISSION_ERROR_REPOSITION_STREAM, ARG1,"set_stream_position/2"); - return(FALSE); - } - if (YP_fseek (Stream[sno].u.file.file, 0L, SEEK_END) == -1) { - UNLOCK(Stream[sno].streamlock); - Yap_Error(SYSTEM_ERROR, tp, - "fseek failed for set_stream_position/2"); - return(FALSE); - } - Stream[sno].stream_getc = PlGetc; - Stream[sno].stream_gets = PlGetsFunc(); - /* reset the counters */ - Stream[sno].linepos = 0; - Stream[sno].linecount = 1; - Stream[sno].charcount = 0; - } - UNLOCK(Stream[sno].streamlock); - return (TRUE); -} static Term read_line(int sno) @@ -4051,8 +3928,6 @@ Yap_InitIOPreds(void) Yap_InitCPred ("format", 2, p_format, SyncPredFlag); Yap_InitCPred ("format", 3, p_format2, SyncPredFlag); Yap_InitCPred ("$start_line", 1, p_startline, SafePredFlag|SyncPredFlag|HiddenPredFlag); - Yap_InitCPred ("$show_stream_position", 2, p_show_stream_position, SafePredFlag|SyncPredFlag|HiddenPredFlag); - Yap_InitCPred ("$set_stream_position", 2, p_set_stream_position, SafePredFlag|SyncPredFlag|HiddenPredFlag); Yap_InitCPred ("$user_file_name", 2, p_user_file_name, SafePredFlag|SyncPredFlag), Yap_InitCPred ("$past_eof", 1, p_past_eof, SafePredFlag|SyncPredFlag), Yap_InitCPred ("$has_bom", 1, p_has_bom, SafePredFlag); diff --git a/pl/boot.yap b/pl/boot.yap index cfe2db3b8..e286063d9 100755 --- a/pl/boot.yap +++ b/pl/boot.yap @@ -1403,6 +1403,10 @@ term_to_atom(Term, Atom) :- with_output_to(Output, G) :- swi_with_output_to(Output, G). +at_end_of_stream :- + swi_at_end_of_stream. +at_end_of_stream(Stream) :- + swi_at_end_of_stream(Stream). byte_count(Stream, Count) :- % format('~w~n',byte_count(Stream, Count)), swi_byte_count(Stream, Count). @@ -1426,6 +1430,9 @@ set_stream(Stream, Property) :- stream_property(Stream, Property) :- % format('~w~n',stream_property(Stream,Property)), swi_stream_property(Stream, Property). +set_stream_position(Stream, Position) :- +% format('~w~n',stream_property(Stream,Property)), + swi_set_stream_position(Stream, Position). prompt1(X) :- swi_prompt1(X). @@ -1499,3 +1506,7 @@ put_code(C) :- put_code(Stream, C) :- swi_put_code(Stream, C). +nl :- + swi_nl. +nl(Stream) :- + swi_nl(Stream). diff --git a/pl/yio.yap b/pl/yio.yap index e206d6594..30d0e68e5 100644 --- a/pl/yio.yap +++ b/pl/yio.yap @@ -268,11 +268,6 @@ read_term(Stream, T, Options) :- '$add_singleton_if_no_underscore'(Na,V2,NSs,[(Name=V2)|NSs]) :- atom_codes(Name, Na). -nl(Stream) :- put(Stream,10). - -nl :- current_output(Stream), put(Stream,10), fail. -nl. - /* meaning of flags for '$write' is 1 quote illegal atoms 2 ignore operator declarations @@ -444,77 +439,11 @@ current_line_number(N) :- current_line_number(Stream,N) :- line_count(Stream, N). -stream_position(user,N) :- !, - '$show_stream_position'(user_input,N). -stream_position(A,N) :- - atom(A), - '$current_stream'(_,_,S), '$user_file_name'(S,A), !, - '$show_stream_position'(S,N). -stream_position(S,N) :- - '$show_stream_position'(S,N). - -stream_position(user,N,M) :- !, - '$stream_position'(user_input,N,M). -stream_position(A,N,M) :- - atom(A), - '$current_stream'(_,_,S), '$user_file_name'(S,A), !, - '$stream_position'(S,N,M). -stream_position(S,N,M) :- - '$stream_position'(S,N,M). - -'$stream_position'(S,N,M) :- - var(M), !, - '$show_stream_position'(S,N), - M = N. -'$stream_position'(S,N,M) :- - '$show_stream_position'(S,N), - '$set_stream_position'(S,M). - - -set_stream_position(S,N) :- var(S), !, - '$do_error'(instantiation_error, set_stream_position(S, N)). -set_stream_position(user,N) :- !, - '$set_stream_position'(user_input,N). -set_stream_position(A,N) :- - atom(A), - '$current_stream'(_,_,S), '$user_file_name'(S,A), !, - '$set_stream_position'(S,N). -set_stream_position(S,N) :- - '$set_stream_position'(S,N). - -'$show_stream_eof'(Stream, past) :- - '$past_eof'(Stream), !. -'$show_stream_eof'(Stream, at) :- - '$peek'(Stream,N), N = -1, !. -'$show_stream_eof'(_, not). - -'$show_stream_eof_action'(Fl, error) :- - Fl /\ 0x0200 =:= 0x0200, !. -'$show_stream_eof_action'(Fl, reset) :- - Fl /\ 0x0400 =:= 0x0400, !. -'$show_stream_eof_action'(_, eof_code). - -'$show_stream_reposition'(Fl, true) :- - Fl /\ 0x2000 =:= 0x2000, !. -'$show_stream_reposition'(_, false). - -'$show_stream_bom'(Fl, true) :- - '$has_bom'(Fl), !. -'$show_stream_bom'(_, false). - -'$show_stream_type'(Fl, binary) :- - Fl /\ 0x0100 =:= 0x0100, !. -'$show_stream_type'(_, text). - -at_end_of_stream :- - current_input(S), - at_end_of_stream(S). - -at_end_of_stream(S) :- - '$past_eof'(S), !. -at_end_of_stream(S) :- - '$peek'(S,N), N = -1. - +stream_position(Stream, Position) :- + stream_property(Stream, position(Position)). +stream_position(Stream, Position, NewPosition) :- + stream_property(Stream, position(Position)), + set_stream_position(Stream, NewPosition). at_end_of_line :- current_input(S), @@ -523,7 +452,7 @@ at_end_of_line :- at_end_of_line(S) :- '$past_eof'(S), !. at_end_of_line(S) :- - '$peek'(S,N), ( N = 10 -> true ; N = -1). + peek(S,N), ( N = 10 -> true ; N = -1). consult_depth(LV) :- '$show_consult_level'(LV).