This commit is contained in:
Mark Thom
2020-06-16 18:47:53 -06:00
3 changed files with 32 additions and 15 deletions

View File

@@ -1,6 +1,7 @@
:- module(charsio, [char_type/2,
chars_utf8bytes/2,
get_single_char/1,
read_line_to_chars/3,
read_term_from_chars/2,
write_term_to_chars/3]).
@@ -182,3 +183,14 @@ continuation(Code, Chars, Nb) --> [Byte],
% invalid continuation byte
% each remaining continuation byte (if any) will raise 0xFFFD too
continuation(_, ['\xFFFD\'|T], _) --> [_], decode_utf8(T).
read_line_to_chars(Stream, Cs0, Cs) :-
'$get_n_chars'(Stream, 1, Char), % this also works for binary streams
( Char == [] -> Cs0 = Cs
; Char = [C],
Cs0 = [C|Rest],
( C == '\n' -> Rest = Cs
; read_line_to_chars(Stream, Rest, Cs)
)
).

View File

@@ -375,20 +375,9 @@ format(Fs, Args) :-
format(Stream, Fs, Args) :-
phrase(format_(Fs, Args), Cs),
( stream_property(Stream, type(binary)) ->
% maplist(char_code, Cs, Bytes) is currently a lot slower
% than first converting Cs to an atom, and then to codes.
% In the future, we can ideally avoid creating an atom here,
% since an atom leaves traces in the system.
atom_chars(A, Cs),
atom_codes(A, Bytes),
( member(NonByte, Bytes), NonByte > 255 ->
char_code(Char, NonByte),
throw(error(representation_error(Char), format/3))
; true
),
% For binary streams, we use a specialised internal predicate
% that uses only a single "write" operation for efficiency.
'$put_bytes'(Stream, Bytes)
'$put_bytes'(Stream, Cs)
; maplist(put_char(Stream), Cs)
).
@@ -471,7 +460,7 @@ portray_clause(Term) :-
portray_clause(Stream, Term) :-
phrase(portray_clause_(Term), Ls),
maplist(put_char(Stream), Ls).
format(Stream, "~s", [Ls]).
portray_clause_(Term) -->
{ term_variables(Term, Vs),