View source with formatted comments or as raw
    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(0, -),
   58    with_output_to_chars(0, -, ?),
   59    with_output_to_chars(0, -, -, ?).   60
   61:- predicate_options(read_term_from_chars/3, 3,
   62                     [pass_to(system:read_term/3, 3)]).   63
   64/** <module> I/O on Lists of Character Codes
   65
   66This module emulates the Quintus/SICStus  library charsio.pl for reading
   67and writing from/to lists of character   codes. Most of these predicates
   68are straight calls into similar SWI-Prolog primitives.  Some can even be
   69replaced by ISO standard predicates.
   70
   71@compat The naming of this library is not in line with the ISO standard.
   72We believe that the SWI-Prolog  native   predicates  form a more elegant
   73alternative for this library.
   74*/
   75
   76%!  format_to_chars(+Format, +Args, -Codes) is det.
   77%
   78%   Use format/2 to write to a list of character codes.
   79
   80format_to_chars(Format, Args, Codes) :-
   81    format(codes(Codes), Format, Args).
   82
   83%!  format_to_chars(+Format, +Args, -Codes, ?Tail) is det.
   84%
   85%   Use format/2 to write to a difference list of character codes.
   86
   87format_to_chars(Format, Args, Codes, Tail) :-
   88    format(codes(Codes, Tail), Format, Args).
   89
   90%!  write_to_chars(+Term, -Codes)
   91%
   92%   Write a term to a code  list.  True   when  Codes  is  a list of
   93%   character codes written by write/1 on Term.
   94
   95write_to_chars(Term, Codes) :-
   96    format(codes(Codes), '~w', [Term]).
   97
   98%!  write_to_chars(+Term, -Codes, ?Tail)
   99%
  100%   Write a term to a code list.  Codes\Tail is a difference list of
  101%   character codes produced by write/1 on Term.
  102
  103write_to_chars(Term, Codes, Tail) :-
  104    format(codes(Codes, Tail), '~w', [Term]).
  105
  106%!  atom_to_chars(+Atom, -Codes) is det.
  107%
  108%   Convert Atom into a list of character codes.
  109%
  110%   @deprecated     Use ISO atom_codes/2.
  111
  112atom_to_chars(Atom, Codes) :-
  113    atom_codes(Atom, Codes).
  114
  115%!  atom_to_chars(+Atom, -Codes, ?Tail) is det.
  116%
  117%   Convert Atom into a difference list of character codes.
  118
  119atom_to_chars(Atom, Codes, Tail) :-
  120    format(codes(Codes, Tail), '~a', [Atom]).
  121
  122%!  number_to_chars(+Number, -Codes) is det.
  123%
  124%   Convert Atom into a list of character codes.
  125%
  126%   @deprecated     Use ISO number_codes/2.
  127
  128number_to_chars(Number, Codes) :-
  129    number_codes(Number, Codes).
  130
  131%!  number_to_chars(+Number, -Codes, ?Tail) is det.
  132%
  133%   Convert Number into a difference list of character codes.
  134
  135number_to_chars(Number, Codes, Tail) :-
  136    must_be(number, Number),
  137    format(codes(Codes, Tail), '~w', [Number]).
  138
  139%!  read_from_chars(+Codes, -Term) is det.
  140%
  141%   Read Codes into Term.
  142%
  143%   @compat The SWI-Prolog version does not require Codes to end
  144%           in a full-stop.
  145
  146read_from_chars([], end_of_file) :- !.
  147read_from_chars(List, Term) :-
  148    atom_to_term(List, Term, _).
  149
  150%!  read_term_from_chars(+Codes, -Term, +Options) is det.
  151%
  152%   Read Codes into Term.  Options are processed by read_term/3.
  153%
  154%   @compat sicstus
  155
  156read_term_from_chars(Codes, Term, Options) :-
  157    read_term_from_atom(Codes, Term, Options).
  158
  159%!  open_chars_stream(+Codes, -Stream) is det.
  160%
  161%   Open Codes as an input stream.
  162%
  163%   @see open_string/2.
  164
  165open_chars_stream(Codes, Stream) :-
  166    open_string(Codes, Stream).
  167
  168%!  with_output_to_chars(:Goal, -Codes) is det.
  169%
  170%   Run Goal as with once/1.  Output written to =current_output=
  171%   is collected in Codes.
  172
  173with_output_to_chars(Goal, Codes) :-
  174    with_output_to(codes(Codes), Goal).
  175
  176%!  with_output_to_chars(:Goal, -Codes, ?Tail) is det.
  177%
  178%   Run Goal as with once/1.  Output written to =current_output=
  179%   is collected in Codes\Tail.
  180
  181with_output_to_chars(Goal, Codes, Tail) :-
  182    with_output_to(codes(Codes, Tail), Goal).
  183
  184%!  with_output_to_chars(:Goal, -Stream, -Codes, ?Tail) is det.
  185%
  186%   Same as with_output_to_chars/3 using  an   explicit  stream. The
  187%   difference list Codes\Tail contains  the   character  codes that
  188%   Goal has written to Stream.
  189
  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)