Next: string.builder, Previous: stream, Up: Top [Contents]
%--------------------------------------------------% % vim: ft=mercury ts=4 sw=4 et %--------------------------------------------------% % Copyright (C) 2006-2007, 2011 The University of Melbourne. % Copyright (C) 2014-2024 The Mercury team. % This file is distributed under the terms specified in COPYING.LIB. %--------------------------------------------------% % % File: stream.string_writer.m. % Authors: trd, fjh, stayl % % Predicates to write to streams that accept strings. % %--------------------------------------------------% %--------------------------------------------------% :- module stream.string_writer. :- interface. :- import_module char. :- import_module deconstruct. :- import_module io. :- import_module list. :- import_module string. :- import_module string.builder. :- import_module univ. %--------------------------------------------------% :- pred put_int(Stream::in, int::in, State::di, State::uo) is det <= stream.writer(Stream, string, State). :- pred put_int8(Stream::in, int8::in, State::di, State::uo) is det <= stream.writer(Stream, string, State). :- pred put_int16(Stream::in, int16::in, State::di, State::uo) is det <= stream.writer(Stream, string, State). :- pred put_int32(Stream::in, int32::in, State::di, State::uo) is det <= stream.writer(Stream, string, State). :- pred put_int64(Stream::in, int64::in, State::di, State::uo) is det <= stream.writer(Stream, string, State). :- pred put_uint(Stream::in, uint::in, State::di, State::uo) is det <= stream.writer(Stream, string, State). :- pred put_uint8(Stream::in, uint8::in, State::di, State::uo) is det <= stream.writer(Stream, string, State). :- pred put_uint16(Stream::in, uint16::in, State::di, State::uo) is det <= stream.writer(Stream, string, State). :- pred put_uint32(Stream::in, uint32::in, State::di, State::uo) is det <= stream.writer(Stream, string, State). :- pred put_uint64(Stream::in, uint64::in, State::di, State::uo) is det <= stream.writer(Stream, string, State). :- pred put_float(Stream::in, float::in, State::di, State::uo) is det <= stream.writer(Stream, string, State). :- pred put_char(Stream::in, char::in, State::di, State::uo) is det <= stream.writer(Stream, string, State). % A version of io.format that works for arbitrary string writers. % :- pred format(Stream::in, string::in, list(poly_type)::in, State::di, State::uo) is det <= stream.writer(Stream, string, State). :- pred nl(Stream::in, State::di, State::uo) is det <= stream.writer(Stream, string, State). % print/4 writes its second argument to the string writer stream specified % in its first argument. In all cases, the argument to output can be of % any type. It is output in a format that is intended to be human readable. % % If the argument is just a single string or character, it will be printed % out exactly as is (unquoted). If the argument is of type integer (i.e. % an arbitrary precision integer), then its decimal representation will be % printed. If the argument is of type univ, then the value stored in the % the univ will be printed out, but not the type. If the argument is of % type date_time, it will be printed out in the same form as the string % returned by the function date_to_string/1. If the argument is of type % duration, it will be printed out in the same form as the string % returned by the function duration_to_string/1. % % print/5 is the same as print/4 except that it allows the caller to % specify how non-canonical types should be handled. print/4 implicitly % specifies `canonicalize' as the method for handling non-canonical types. % This means that for higher-order types, or types with user-defined % equality axioms, or types defined using the foreign language interface % (i.e. pragma foreign_type), the text output will only describe the type % that is being printed, not the value. % % print_cc/4 is the same as print/4 except that it specifies % `include_details_cc' rather than `canonicalize'. This means that it will % print the details of non-canonical types. However, it has determinism % `cc_multi'. % % Note that even if `include_details_cc' is specified, some implementations % may not be able to print all the details for higher-order types or types % defined using the foreign language interface. % :- pred print(Stream::in, T::in, State::di, State::uo) is det <= stream.writer(Stream, string, State). :- pred print_cc(Stream::in, T::in, State::di, State::uo) is cc_multi <= stream.writer(Stream, string, State). :- pred print(Stream, deconstruct.noncanon_handling, T, State, State) <= stream.writer(Stream, string, State). :- mode print(in, in(do_not_allow), in, di, uo) is det. :- mode print(in, in(canonicalize), in, di, uo) is det. :- mode print(in, in(include_details_cc), in, di, uo) is cc_multi. :- mode print(in, in, in, di, uo) is cc_multi. % write/4 writes its second argument to the string writer stream specified % in its first argument. In all cases, the argument to output may be of % any type. The argument is written in a format that is intended to be % valid Mercury syntax whenever possible. % % Strings and characters are always printed out in quotes, using backslash % escapes if necessary and backslash or octal escapes for all characters % for which char.is_control/1 is true. For higher-order types, or for types % defined using the foreign language interface (pragma foreign_type), the % text output will only describe the type that is being printed, not the % value, and the result may not be parsable by `read'. For the types % containing existential quantifiers, the type `type_desc' and closure % types, the result may not be parsable by `read', either. But in all % other cases the format used is standard Mercury syntax, and if you append % a period and newline (".\n"), then the results can be read in again using % `read'. % % write/5 is the same as write/4 except that it allows the caller to % specify how non-canonical types should be handled. write_cc/4 is the % same as write/4 except that it specifies `include_details_cc' rather than % `canonicalize'. % :- pred write(Stream::in, T::in, State::di, State::uo) is det <= stream.writer(Stream, string, State). :- pred write_cc(Stream::in, T::in, State::di, State::uo) is cc_multi <= stream.writer(Stream, string, State). :- pred write(Stream, deconstruct.noncanon_handling, T, State, State) <= stream.writer(Stream, string, State). :- mode write(in, in(do_not_allow), in, di, uo) is det. :- mode write(in, in(canonicalize), in, di, uo) is det. :- mode write(in, in(include_details_cc), in, di, uo) is cc_multi. :- mode write(in, in, in, di, uo) is cc_multi. %--------------------------------------------------% :- pragma type_spec_constrained_preds( [stream.writer(Stream, string, State)], apply_to_superclasses, [subst([Stream => io.text_output_stream, State = io.state]), subst([Stream => string.builder.handle, State = string.builder.state])]). %--------------------------------------------------% %--------------------------------------------------%
Next: string.builder, Previous: stream, Up: Top [Contents]