1/* Part of SWI-Prolog 2 3 Author: Jan Wielemaker 4 E-mail: J.Wielemaker@vu.nl 5 WWW: http://www.swi-prolog.org 6 Copyright (c) 2009-2015, University of Amsterdam 7 VU University Amsterdam 8 All rights reserved. 9 10 Redistribution and use in source and binary forms, with or without 11 modification, are permitted provided that the following conditions 12 are met: 13 14 1. Redistributions of source code must retain the above copyright 15 notice, this list of conditions and the following disclaimer. 16 17 2. Redistributions in binary form must reproduce the above copyright 18 notice, this list of conditions and the following disclaimer in 19 the documentation and/or other materials provided with the 20 distribution. 21 22 THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS 23 "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT 24 LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS 25 FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE 26 COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, 27 INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, 28 BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; 29 LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER 30 CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT 31 LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN 32 ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE 33 POSSIBILITY OF SUCH DAMAGE. 34*/ 35 36:- module(charsio, 37 [ format_to_chars/3, % +Format, +Args, -Codes 38 format_to_chars/4, % +Format, +Args, -Codes, ?Tail 39 write_to_chars/2, % +Term, -Codes 40 write_to_chars/3, % +Term, -Codes, ?Tail 41 atom_to_chars/2, % +Atom, -Codes 42 atom_to_chars/3, % +Atom, -Codes, ?Tail 43 number_to_chars/2, % +Number, -Codes 44 number_to_chars/3, % +Number, -Codes, ?Tail 45 % read predicates 46 read_from_chars/2, % +Codes, -Term 47 read_term_from_chars/3, % +Codes, -Term, +Options 48 open_chars_stream/2, % +Codes, -Stream 49 with_output_to_chars/2, % :Goal, -Codes 50 with_output_to_chars/3, % :Goal, -Codes, ?Tail 51 with_output_to_chars/4 % :Goal, -Stream, -Codes, ?Tail 52 ]). 53:- autoload(library(error),[must_be/2]). 54 55 56:- meta_predicate 57 with_output_to_chars( , ), 58 with_output_to_chars( , , ), 59 with_output_to_chars( , , , ). 60 61:- predicate_options(read_term_from_chars/3, 3, 62 [pass_to(system:read_term/3, 3)]).
80format_to_chars(Format, Args, Codes) :-
81 format(codes(Codes), Format, Args).
87format_to_chars(Format, Args, Codes, Tail) :-
88 format(codes(Codes, Tail), Format, Args).
95write_to_chars(Term, Codes) :-
96 format(codes(Codes), '~w', [Term]).
103write_to_chars(Term, Codes, Tail) :-
104 format(codes(Codes, Tail), '~w', [Term]).
112atom_to_chars(Atom, Codes) :-
113 atom_codes(Atom, Codes).
119atom_to_chars(Atom, Codes, Tail) :-
120 format(codes(Codes, Tail), '~a', [Atom]).
128number_to_chars(Number, Codes) :-
129 number_codes(Number, Codes).
135number_to_chars(Number, Codes, Tail) :-
136 must_be(number, Number),
137 format(codes(Codes, Tail), '~w', [Number]).
146read_from_chars([], end_of_file) :- !. 147read_from_chars(List, Term) :- 148 atom_to_term(List, Term, _).
156read_term_from_chars(Codes, Term, Options) :-
157 read_term_from_atom(Codes, Term, Options).
165open_chars_stream(Codes, Stream) :-
166 open_string(Codes, Stream).
current_output
is collected in Codes.
173with_output_to_chars(Goal, Codes) :-
174 with_output_to(codes(Codes), Goal).
current_output
is collected in Codes\Tail.
181with_output_to_chars(Goal, Codes, Tail) :-
182 with_output_to(codes(Codes, Tail), Goal).
190with_output_to_chars(Goal, Stream, Codes, Tail) :- 191 with_output_to(codes(Codes, Tail), with_stream(Stream, Goal)). 192 193with_stream(Stream, Goal) :- 194 current_output(Stream), 195 call(Goal)
I/O on Lists of Character Codes
This module emulates the Quintus/SICStus library
charsio.pl
for reading and writing from/to lists of character codes. Most of these predicates are straight calls into similar SWI-Prolog primitives. Some can even be replaced by ISO standard predicates.