Next: io.call_system, Previous: integer, Up: Top [Contents]
%--------------------------------------------------%
% vim: ft=mercury ts=4 sw=4 et
%--------------------------------------------------%
% Copyright (C) 1993-2012 The University of Melbourne.
% Copyright (C) 2013-2025 The Mercury team.
% This file is distributed under the terms specified in COPYING.LIB.
%--------------------------------------------------%
%
% File: io.m.
% Main author: fjh.
% Stability: high.
%
% This file encapsulates all the file I/O.
%
% We implement a purely logical I/O system using non-logical I/O primitives of
% the underlying system. We ensure referential transparency by passing around
% a ``state-of-the-world'' argument using unique modes. The compiler will check
% that the state of the world argument is properly single-threaded, and will
% also ensure that the program doesn't attempt to backtrack over any I/O.
%
% Attempting any operation on a stream which has already been closed results
% in undefined behaviour.
%
% In multithreaded programs, each thread in the program has its own set of
% "current" input and output streams. At the time it is created, a child
% thread inherits the current streams from its parent. Predicates that
% change which stream is current affect only the calling thread.
%
%--------------------------------------------------%
%--------------------------------------------------%
:- module io.
:- interface.
:- include_module call_system.
:- include_module environment.
:- include_module file.
:- import_module array.
:- import_module bitmap.
:- import_module bool.
:- import_module char.
:- import_module deconstruct.
:- import_module list.
:- import_module map.
:- import_module maybe.
:- import_module stream.
:- import_module string.
:- import_module time.
:- import_module univ.
%--------------------------------------------------%
%
% Exported types.
%
% The state of the universe.
%
:- type io.state.
% An alternative, more concise name for `io.state'.
%
:- type io == io.state.
% Opaque handles for text I/O streams.
%
:- type text_input_stream.
:- type text_output_stream.
% Alternative names for the above.
%
:- type input_stream == text_input_stream.
:- type output_stream == text_output_stream.
% Opaque handles for binary I/O streams.
%
:- type binary_input_stream.
:- type binary_output_stream.
% Various types used for the result from the access predicates.
%
:- type res
---> ok
; error(io.error).
:- type res(T)
---> ok(T)
; error(io.error).
% maybe_partial_res is used where it is possible to return a partial result
% when an error occurs.
%
:- type maybe_partial_res(T)
---> ok(T)
; error(T, io.error).
:- type maybe_partial_res_2(T1, T2)
---> ok2(T1, T2)
; error2(T1, T2, io.error).
:- inst maybe_partial_res(T) for maybe_partial_res/1
---> ok(T)
; error(T, ground).
:- type result
---> ok
; eof
; error(io.error).
:- type result(T)
---> ok(T)
; eof
; error(io.error).
% maybe_incomplete_result is returned when reading multibyte values from a
% binary stream. `incomplete(Bytes)' is returned when at least one byte of
% a value has already been read but there are insufficient bytes
% remaining the stream to complete the value. In that case, Bytes will
% contain the bytes that have already been read from the stream, in the
% order in which they were read.
%
:- type maybe_incomplete_result(T)
---> ok(T)
; eof
; incomplete(list(uint8))
; error(io.error).
:- type read_result(T)
---> ok(T)
; eof
; error(string, int). % error message, line number
% A value indicating an error.
% This may or may not have an associated io.system_error value.
%
:- type io.error.
% A system-dependent error value.
%
% For C backends, this is either an errno value (e.g. ENOENT)
% or a Windows system error code (e.g. ERROR_FILE_NOT_FOUND).
% A value of 0 represents success in both cases.
%
% For the Java and C# backends, this is an exception object or null,
% where null represents no error.
%
:- type system_error.
:- pragma foreign_type(c, system_error, "MR_Integer",
[can_pass_as_mercury_type]).
:- pragma foreign_type("C#", system_error, "System.Exception").
:- pragma foreign_type(java, system_error, "java.lang.Exception").
% whence denotes the base for a seek operation.
% set - seek relative to the start of the file
% cur - seek relative to the current position in the file
% end - seek relative to the end of the file.
%
:- type whence
---> set
; cur
; end.
%--------------------------------------------------%
%
% Opening and closing streams, both text and binary.
%
% Attempts to open a text file for input.
% Result is either 'ok(Stream)' or 'error(ErrorCode)'.
%
:- pred open_input(string::in, io.res(io.text_input_stream)::out,
io::di, io::uo) is det.
% Attempts to open a binary file for input.
% Result is either 'ok(Stream)' or 'error(ErrorCode)'.
%
:- pred open_binary_input(string::in,
io.res(io.binary_input_stream)::out, io::di, io::uo) is det.
%--------------------------------------------------%
% Attempts to open a text file for output.
% Result is either 'ok(Stream)' or 'error(ErrorCode)'.
%
:- pred open_output(string::in, io.res(io.text_output_stream)::out,
io::di, io::uo) is det.
% Attempts to open a file for binary output.
% Result is either 'ok(Stream)' or 'error(ErrorCode)'.
%
:- pred open_binary_output(string::in,
io.res(io.binary_output_stream)::out, io::di, io::uo) is det.
%--------------------------------------------------%
% Attempts to open a text file for appending.
% Result is either 'ok(Stream)' or 'error(ErrorCode)'.
%
:- pred open_append(string::in, io.res(io.text_output_stream)::out,
io::di, io::uo) is det.
% Attempts to open a file for binary appending.
% Result is either 'ok(Stream)' or 'error(ErrorCode)'.
%
:- pred open_binary_append(string::in,
io.res(io.binary_output_stream)::out, io::di, io::uo) is det.
%--------------------------------------------------%
% Closes an open text input stream.
% Throw an io.error exception if an I/O error occurs.
%
:- pred close_input(io.text_input_stream::in, io::di, io::uo) is det.
% Closes an open binary input stream. This will throw an io.error
% exception if an I/O error occurs.
%
:- pred close_binary_input(io.binary_input_stream::in,
io::di, io::uo) is det.
%--------------------------------------------------%
% Closes an open text output stream.
% This will throw an io.error exception if an I/O error occurs.
%
:- pred close_output(io.text_output_stream::in, io::di, io::uo) is det.
% Closes an open binary output stream.
% This will throw an io.error exception if an I/O error occurs.
%
:- pred close_binary_output(io.binary_output_stream::in,
io::di, io::uo) is det.
%--------------------------------------------------%
%
% Switching streams.
%
% set_input_stream(NewStream, OldStream, !IO):
% Changes the current input stream to NewStream.
% Returns the previous input stream as OldStream.
%
:- pred set_input_stream(io.text_input_stream::in,
io.text_input_stream::out, io::di, io::uo) is det.
% Changes the current input stream to the stream specified.
% Returns the previous stream.
%
:- pred set_binary_input_stream(io.binary_input_stream::in,
io.binary_input_stream::out, io::di, io::uo) is det.
%--------------------------------------------------%
% set_output_stream(NewStream, OldStream, !IO):
% Changes the current output stream to NewStream.
% Returns the previous output stream as OldStream.
%
:- pred set_output_stream(io.text_output_stream::in,
io.text_output_stream::out, io::di, io::uo) is det.
% Changes the current binary output stream to the stream specified.
% Returns the previous stream.
%
:- pred set_binary_output_stream(io.binary_output_stream::in,
io.binary_output_stream::out, io::di, io::uo) is det.
%--------------------------------------------------%
%
% Seeking on binary streams.
%
% Seek to an offset relative to Whence (documented above)
% on a specified binary input stream. Attempting to seek on a pipe
% or tty results in implementation dependent behaviour.
%
% A successful seek undoes any effects of putback_byte on the stream.
%
:- pred seek_binary_input(io.binary_input_stream::in, io.whence::in,
int::in, io::di, io::uo) is det.
% As above, but the offset is always a 64-bit value.
%
:- pred seek_binary_input64(io.binary_input_stream::in, io.whence::in,
int64::in, io::di, io::uo) is det.
%--------------------------------------------------%
% Seek to an offset relative to Whence (documented above)
% on a specified binary output stream. Attempting to seek on a pipe
% or tty results in implementation dependent behaviour.
%
:- pred seek_binary_output(io.binary_output_stream::in, io.whence::in,
int::in, io::di, io::uo) is det.
% As above, but the offset is always a 64-bit value.
%
:- pred seek_binary_output64(io.binary_output_stream::in, io.whence::in,
int64::in, io::di, io::uo) is det.
%--------------------------------------------------%
% Returns the offset (in bytes) into the specified binary input stream.
% Throws an exception if the offset is outside the range that can be
% represented by the int type. To avoid this possibility, you can use the
% 64-bit offset version of this predicate below.
%
:- pred binary_input_stream_offset(io.binary_input_stream::in, int::out,
io::di, io::uo) is det.
% As above, but the offset is always a 64-bit value.
%
:- pred binary_input_stream_offset64(io.binary_input_stream::in, int64::out,
io::di, io::uo) is det.
%--------------------------------------------------%
% Returns the offset (in bytes) into the specified binary output stream.
% Throws an exception if the offset is outside the range that can be
% represented by the int type. To avoid this possibility, you can use the
% 64-bit offset version of this predicate below.
%
:- pred binary_output_stream_offset(io.binary_output_stream::in, int::out,
io::di, io::uo) is det.
% As above, but the offset is always a 64-bit value.
%
:- pred binary_output_stream_offset64(io.binary_output_stream::in, int64::out,
io::di, io::uo) is det.
%--------------------------------------------------%
%
% Standard stream id predicates.
%
% Retrieves the standard input stream.
%
:- func stdin_stream = io.text_input_stream.
% Retrieves the standard input stream.
% Does not modify the I/O state.
%
:- pred stdin_stream(io.text_input_stream::out, io::di, io::uo) is det.
% Retrieves the standard binary input stream.
% Does not modify the I/O state.
%
:- pred stdin_binary_stream(io.binary_input_stream::out,
io::di, io::uo) is det.
%--------------------------------------------------%
% Retrieves the standard output stream.
%
:- func stdout_stream = io.text_output_stream.
% Retrieves the standard output stream.
% Does not modify the I/O state.
%
:- pred stdout_stream(io.text_output_stream::out, io::di, io::uo) is det.
% Retrieves the standard binary output stream.
% Does not modify the I/O state.
%
:- pred stdout_binary_stream(io.binary_output_stream::out,
io::di, io::uo) is det.
%--------------------------------------------------%
% Retrieves the standard error stream.
%
:- func stderr_stream = io.text_output_stream.
% Retrieves the standard error stream.
% Does not modify the I/O state.
%
:- pred stderr_stream(io.text_output_stream::out, io::di, io::uo) is det.
%--------------------------------------------------%
%
% Current stream id predicates.
%
% Retrieves the current input stream.
% Does not modify the I/O state.
%
:- pred input_stream(io.text_input_stream::out, io::di, io::uo) is det.
% Retrieves the current binary input stream.
% Does not modify the I/O state.
%
:- pred binary_input_stream(io.binary_input_stream::out,
io::di, io::uo) is det.
%--------------------------------------------------%
% Retrieves the current output stream.
% Does not modify the I/O state.
%
:- pred output_stream(io.text_output_stream::out, io::di, io::uo) is det.
% Retrieves the current binary output stream.
% Does not modify the I/O state.
%
:- pred binary_output_stream(io.binary_output_stream::out,
io::di, io::uo) is det.
%--------------------------------------------------%
%
% Getting and setting stream properties.
%
% Retrieves the human-readable name associated with the current input
% stream or the specified output stream. For file streams, this is
% the filename. For stdin, this is the string "<standard input>".
%
:- pred input_stream_name(string::out, io::di, io::uo) is det.
:- pred input_stream_name(io.text_input_stream::in, string::out,
io::di, io::uo) is det.
% Retrieves the human-readable name associated with the current binary
% input stream or the specified binary input stream. For file streams,
% this is the filename.
%
:- pred binary_input_stream_name(string::out, io::di, io::uo) is det.
:- pred binary_input_stream_name(io.binary_input_stream::in, string::out,
io::di, io::uo) is det.
% Retrieves the human-readable name associated with the current
% output stream or the specified output stream.
% For file streams, this is the filename.
% For stdout this is the string "<standard output>".
% For stderr this is the string "<standard error>".
%
:- pred output_stream_name(string::out, io::di, io::uo) is det.
:- pred output_stream_name(io.text_output_stream::in, string::out,
io::di, io::uo) is det.
% Retrieves the human-readable name associated with the current
% binary output stream or the specified binary output stream.
% For file streams, this is the filename.
%
:- pred binary_output_stream_name(string::out, io::di, io::uo) is det.
:- pred binary_output_stream_name(io.binary_output_stream::in,
string::out, io::di, io::uo) is det.
%--------------------------------------------------%
% Return the line number of the current input stream or the specified
% input stream. Lines are normally numbered starting at 1, but this
% can be overridden by calling set_line_number.
%
:- pred get_line_number(int::out, io::di, io::uo) is det.
:- pred get_line_number(io.text_input_stream::in, int::out, io::di, io::uo)
is det.
% Set the line number of the current input stream or the specified
% input stream.
%
:- pred set_line_number(int::in, io::di, io::uo) is det.
:- pred set_line_number(io.text_input_stream::in, int::in, io::di, io::uo)
is det.
% Return the line number of the current output stream or the
% specified output stream. Lines are normally numbered starting at 1,
% but this can be overridden by calling set_output_line_number.
%
:- pred get_output_line_number(int::out, io::di, io::uo) is det.
:- pred get_output_line_number(io.text_output_stream::in, int::out,
io::di, io::uo) is det.
% Set the line number of the current output stream.
%
:- pred set_output_line_number(int::in, io::di, io::uo) is det.
:- pred set_output_line_number(io.text_output_stream::in, int::in,
io::di, io::uo) is det.
%--------------------------------------------------%
%
% Reading values of primitive types.
%
% Read a character (code point) from the current input stream
% or from the specified stream.
%
:- pred read_char(io.result(char)::out, io::di, io::uo) is det.
:- pred read_char(io.text_input_stream::in, io.result(char)::out,
io::di, io::uo) is det.
% Reads a character (code point) from the specified stream.
% This interface avoids memory allocation when there is no error.
%
:- pred read_char_unboxed(io.text_input_stream::in, io.result::out, char::out,
io::di, io::uo) is det.
% Un-read a character (code point) from the current input stream
% or from the specified stream.
% You can put back as many characters as you like.
% You can even put back something that you didn't actually read.
%
% On some systems and backends, only one byte of pushback is guaranteed.
% putback_char will throw an io.error exception if the pushback buffer
% is full.
%
:- pred putback_char(char::in, io::di, io::uo) is det.
:- pred putback_char(io.text_input_stream::in, char::in, io::di, io::uo)
is det.
% Note that there are no read equivalents of write_int, write_intN,
% write_uint, write_uintN, or write_float. Mercury programs that want to read
% numbers must first read in strings, and try to convert the appropriate
% parts of those strings to numbers. This allows them to handle any errors
% in that conversion process in whatever way they like. Since there are many
% possible ways to handle conversion failures, it is not very likely that
% a programmer's chosen method would agree with the one used by a
% system-supplied predicate for reading in e.g. floats, if this module had one.
%--------------------------------------------------%
% Reads a single 8-bit byte from the current binary input stream
% or from the specified binary input stream.
%
:- pred read_byte(io.result(int)::out, io::di, io::uo) is det.
:- pred read_byte(io.binary_input_stream::in, io.result(int)::out,
io::di, io::uo) is det.
% Reads a single signed 8-bit integer from the current binary input
% stream or from the specified binary input stream.
%
:- pred read_binary_int8(io.result(int8)::out, io::di, io::uo) is det.
:- pred read_binary_int8(io.binary_input_stream::in, io.result(int8)::out,
io::di, io::uo) is det.
% Reads a single signed 8-bit integer from the specified binary input
% stream. This interface avoids memory allocation when there is no error.
%
:- pred read_binary_int8_unboxed(io.binary_input_stream::in, io.result::out,
int8::out, io::di, io::uo) is det.
% Reads a single unsigned 8-bit integer from the current binary input
% stream or from the specified binary input stream.
%
:- pred read_binary_uint8(io.result(uint8)::out, io::di, io::uo) is det.
:- pred read_binary_uint8(io.binary_input_stream::in, io.result(uint8)::out,
io::di, io::uo) is det.
% Reads a single unsigned 8-bit integer from the specified binary input
% stream. This interface avoids memory allocation when there is no error.
%
:- pred read_binary_uint8_unboxed(io.binary_input_stream::in, io.result::out,
uint8::out, io::di, io::uo) is det.
%--------------------------------------------------%
% Un-reads a byte from the current binary input stream or from the
% specified stream. The byte is taken from the bottom 8 bits of the
% specified int.
%
% You can put back as many bytes as you like.
% You can even put back something that you did not actually read.
%
% On some systems and backends, only one byte of pushback is guaranteed.
% putback_byte will throw an io.error exception if the pushback buffer
% is full.
%
% Pushing back a byte decrements the file position by one, except when
% the file position is already zero, in which case the new file position
% is unspecified.
%
:- pred putback_byte(int::in, io::di, io::uo) is det.
:- pred putback_byte(io.binary_input_stream::in, int::in, io::di, io::uo)
is det.
% Like putback_byte, but where the byte value un-read is the 8 bits of the
% int8 reinterpreted as a uint8.
%
:- pred putback_int8(int8::in, io::di, io::uo) is det.
:- pred putback_int8(io.binary_input_stream::in, int8::in, io::di, io::uo)
is det.
% Like putback_byte, but where the byte value un-read is the 8 bits of the
% uint8.
%
:- pred putback_uint8(uint8::in, io::di, io::uo) is det.
:- pred putback_uint8(io.binary_input_stream::in, uint8::in, io::di, io::uo)
is det.
%--------------------------------------------------%
% The following predicates read multibyte integer values, either from
% the current binary input stream, or from the specified binary
% input stream.
%
% The names of these predicates have the form:
%
% read_binary_<TYPE><SUFFIX>
%
% where <TYPE> is the name of one of the Mercury multibyte fixed size
% integer types. The optional <SUFFIX> specifies the order in which
% the bytes that make up the multibyte integer occur in input stream.
% The suffix may be one of:
%
% "_le": the bytes are in little endian byte order.
% "_be": the bytes are in big endian byte order.
% none: the bytes are in the byte order of the underlying platform.
:- pred read_binary_int16(maybe_incomplete_result(int16)::out,
io::di, io::uo) is det.
:- pred read_binary_int16(io.binary_input_stream::in,
maybe_incomplete_result(int16)::out, io::di, io::uo) is det.
:- pred read_binary_int16_le(maybe_incomplete_result(int16)::out,
io::di, io::uo) is det.
:- pred read_binary_int16_le(io.binary_input_stream::in,
maybe_incomplete_result(int16)::out, io::di, io::uo) is det.
:- pred read_binary_int16_be(maybe_incomplete_result(int16)::out,
io::di, io::uo) is det.
:- pred read_binary_int16_be(io.binary_input_stream::in,
maybe_incomplete_result(int16)::out, io::di, io::uo) is det.
:- pred read_binary_uint16(maybe_incomplete_result(uint16)::out,
io::di, io::uo) is det.
:- pred read_binary_uint16(io.binary_input_stream::in,
maybe_incomplete_result(uint16)::out, io::di, io::uo) is det.
:- pred read_binary_uint16_le(maybe_incomplete_result(uint16)::out,
io::di, io::uo) is det.
:- pred read_binary_uint16_le(io.binary_input_stream::in,
maybe_incomplete_result(uint16)::out, io::di, io::uo) is det.
:- pred read_binary_uint16_be(maybe_incomplete_result(uint16)::out,
io::di, io::uo) is det.
:- pred read_binary_uint16_be(io.binary_input_stream::in,
maybe_incomplete_result(uint16)::out, io::di, io::uo) is det.
:- pred read_binary_int32(maybe_incomplete_result(int32)::out,
io::di, io::uo) is det.
:- pred read_binary_int32(io.binary_input_stream::in,
maybe_incomplete_result(int32)::out, io::di, io::uo) is det.
:- pred read_binary_int32_le(maybe_incomplete_result(int32)::out,
io::di, io::uo) is det.
:- pred read_binary_int32_le(io.binary_input_stream::in,
maybe_incomplete_result(int32)::out, io::di, io::uo) is det.
:- pred read_binary_int32_be(maybe_incomplete_result(int32)::out,
io::di, io::uo) is det.
:- pred read_binary_int32_be(io.binary_input_stream::in,
maybe_incomplete_result(int32)::out, io::di, io::uo) is det.
:- pred read_binary_uint32(maybe_incomplete_result(uint32)::out,
io::di, io::uo) is det.
:- pred read_binary_uint32(io.binary_input_stream::in,
maybe_incomplete_result(uint32)::out, io::di, io::uo) is det.
:- pred read_binary_uint32_le(maybe_incomplete_result(uint32)::out,
io::di, io::uo) is det.
:- pred read_binary_uint32_le(io.binary_input_stream::in,
maybe_incomplete_result(uint32)::out, io::di, io::uo) is det.
:- pred read_binary_uint32_be(maybe_incomplete_result(uint32)::out,
io::di, io::uo) is det.
:- pred read_binary_uint32_be(io.binary_input_stream::in,
maybe_incomplete_result(uint32)::out, io::di, io::uo) is det.
:- pred read_binary_int64(maybe_incomplete_result(int64)::out,
io::di, io::uo) is det.
:- pred read_binary_int64(io.binary_input_stream::in,
maybe_incomplete_result(int64)::out, io::di, io::uo) is det.
:- pred read_binary_int64_le(maybe_incomplete_result(int64)::out,
io::di, io::uo) is det.
:- pred read_binary_int64_le(io.binary_input_stream::in,
maybe_incomplete_result(int64)::out, io::di, io::uo) is det.
:- pred read_binary_int64_be(maybe_incomplete_result(int64)::out,
io::di, io::uo) is det.
:- pred read_binary_int64_be(io.binary_input_stream::in,
maybe_incomplete_result(int64)::out, io::di, io::uo) is det.
:- pred read_binary_uint64(maybe_incomplete_result(uint64)::out,
io::di, io::uo) is det.
:- pred read_binary_uint64(io.binary_input_stream::in,
maybe_incomplete_result(uint64)::out, io::di, io::uo) is det.
:- pred read_binary_uint64_le(maybe_incomplete_result(uint64)::out,
io::di, io::uo) is det.
:- pred read_binary_uint64_le(io.binary_input_stream::in,
maybe_incomplete_result(uint64)::out, io::di, io::uo) is det.
:- pred read_binary_uint64_be(maybe_incomplete_result(uint64)::out,
io::di, io::uo) is det.
:- pred read_binary_uint64_be(io.binary_input_stream::in,
maybe_incomplete_result(uint64)::out, io::di, io::uo) is det.
%--------------------------------------------------%
%
% Writing values of primitive types.
%
% Writes a character to the current output stream
% or to the specified output stream.
%
:- pred write_char(char::in, io::di, io::uo) is det.
:- pred write_char(io.text_output_stream::in, char::in, io::di, io::uo)
is det.
% Writes a signed or unsigned integer to the current output stream
% or to the specified output stream.
%
:- pred write_int(int::in, io::di, io::uo) is det.
:- pred write_int(io.text_output_stream::in, int::in, io::di, io::uo) is det.
:- pred write_uint(uint::in, io::di, io::uo) is det.
:- pred write_uint(io.text_output_stream::in, uint::in, io::di, io::uo) is det.
% Write a signed or unsigned 8-bit integer to the current output stream
% or to the specified output stream.
%
:- pred write_int8(int8::in, io::di, io::uo) is det.
:- pred write_int8(io.text_output_stream::in, int8::in, io::di, io::uo) is det.
:- pred write_uint8(uint8::in, io::di, io::uo) is det.
:- pred write_uint8(io.text_output_stream::in, uint8::in, io::di, io::uo)
is det.
% Write a signed or unsigned 16-bit integer to the current output stream
% or to the specified output stream.
%
:- pred write_int16(int16::in, io::di, io::uo) is det.
:- pred write_int16(io.text_output_stream::in, int16::in, io::di, io::uo)
is det.
:- pred write_uint16(uint16::in, io::di, io::uo) is det.
:- pred write_uint16(io.text_output_stream::in, uint16::in, io::di, io::uo)
is det.
% Write a signed or unsigned 32-bit integer to the current output stream
% or to the specified output stream.
%
:- pred write_int32(int32::in, io::di, io::uo) is det.
:- pred write_int32(io.text_output_stream::in, int32::in, io::di, io::uo)
is det.
:- pred write_uint32(uint32::in, io::di, io::uo) is det.
:- pred write_uint32(io.text_output_stream::in, uint32::in, io::di, io::uo)
is det.
% Write a signed or unsigned 64-bit integer to the current output stream
% or to the specified output stream.
%
:- pred write_int64(int64::in, io::di, io::uo) is det.
:- pred write_int64(io.text_output_stream::in, int64::in, io::di, io::uo)
is det.
:- pred write_uint64(uint64::in, io::di, io::uo) is det.
:- pred write_uint64(io.text_output_stream::in, uint64::in, io::di, io::uo)
is det.
% Writes a floating point number to the current output stream
% or to the specified output stream.
%
:- pred write_float(float::in, io::di, io::uo) is det.
:- pred write_float(io.text_output_stream::in, float::in, io::di, io::uo)
is det.
% Writes a string to the current output stream or to the
% specified output stream.
%
:- pred write_string(string::in, io::di, io::uo) is det.
:- pred write_string(io.text_output_stream::in, string::in, io::di, io::uo)
is det.
% Writes a newline character to the current output stream
% or to the specified stream.
%
:- pred nl(io::di, io::uo) is det.
:- pred nl(io.text_output_stream::in, io::di, io::uo) is det.
%--------------------------------------------------%
% Writes a single byte to the current binary output stream
% or to the specified binary output stream. The byte is taken from
% the bottom 8 bits of the specified int.
%
:- pred write_byte(int::in, io::di, io::uo) is det.
:- pred write_byte(io.binary_output_stream::in, int::in, io::di, io::uo)
is det.
% Writes a signed or unsigned 8-bit integer to the current binary
% output stream or to the specified binary output stream.
%
:- pred write_binary_int8(int8::in, io::di, io::uo) is det.
:- pred write_binary_int8(io.binary_output_stream::in, int8::in,
io::di, io::uo) is det.
:- pred write_binary_uint8(uint8::in, io::di, io::uo) is det.
:- pred write_binary_uint8(io.binary_output_stream::in, uint8::in,
io::di, io::uo) is det.
%--------------------------------------------------%
% The following predicates write multibyte integer values, either to the
% current binary output stream, or to the specified binary output stream.
%
% These names of these predicates have the form:
%
% write_binary_<TYPE><SUFFIX>
%
% where <TYPE> is the name of one of the Mercury multibyte fixed size
% integer types. The optional <SUFFIX> specifies the order in which
% the bytes that make up the multibyte integer are written to the stream.
% The suffix may be one of:
%
% "_le": the bytes are in little endian byte order.
% "_be": the bytes are in big endian byte order.
% none: the bytes are in the byte order of the underlying platform.
:- pred write_binary_int16(int16::in, io::di, io::uo) is det.
:- pred write_binary_int16(io.binary_output_stream::in, int16::in,
io::di, io::uo) is det.
:- pred write_binary_uint16(uint16::in, io::di, io::uo) is det.
:- pred write_binary_uint16(io.binary_output_stream::in, uint16::in,
io::di, io::uo) is det.
:- pred write_binary_int16_le(int16::in, io::di, io::uo) is det.
:- pred write_binary_int16_le(io.binary_output_stream::in, int16::in,
io::di, io::uo) is det.
:- pred write_binary_uint16_le(uint16::in, io::di, io::uo) is det.
:- pred write_binary_uint16_le(io.binary_output_stream::in, uint16::in,
io::di, io::uo) is det.
:- pred write_binary_int16_be(int16::in, io::di, io::uo) is det.
:- pred write_binary_int16_be(io.binary_output_stream::in, int16::in,
io::di, io::uo) is det.
:- pred write_binary_uint16_be(uint16::in, io::di, io::uo) is det.
:- pred write_binary_uint16_be(io.binary_output_stream::in, uint16::in,
io::di, io::uo) is det.
:- pred write_binary_int32(int32::in, io::di, io::uo) is det.
:- pred write_binary_int32(io.binary_output_stream::in, int32::in,
io::di, io::uo) is det.
:- pred write_binary_uint32(uint32::in, io::di, io::uo) is det.
:- pred write_binary_uint32(io.binary_output_stream::in, uint32::in,
io::di, io::uo) is det.
:- pred write_binary_int32_le(int32::in, io::di, io::uo) is det.
:- pred write_binary_int32_le(io.binary_output_stream::in, int32::in,
io::di, io::uo) is det.
:- pred write_binary_uint32_le(uint32::in, io::di, io::uo) is det.
:- pred write_binary_uint32_le(io.binary_output_stream::in, uint32::in,
io::di, io::uo) is det.
:- pred write_binary_int32_be(int32::in, io::di, io::uo) is det.
:- pred write_binary_int32_be(io.binary_output_stream::in, int32::in,
io::di, io::uo) is det.
:- pred write_binary_uint32_be(uint32::in, io::di, io::uo) is det.
:- pred write_binary_uint32_be(io.binary_output_stream::in, uint32::in,
io::di, io::uo) is det.
:- pred write_binary_int64(int64::in, io::di, io::uo) is det.
:- pred write_binary_int64(io.binary_output_stream::in, int64::in,
io::di, io::uo) is det.
:- pred write_binary_uint64(uint64::in, io::di, io::uo) is det.
:- pred write_binary_uint64(io.binary_output_stream::in, uint64::in,
io::di, io::uo) is det.
:- pred write_binary_int64_le(int64::in, io::di, io::uo) is det.
:- pred write_binary_int64_le(io.binary_output_stream::in, int64::in,
io::di, io::uo) is det.
:- pred write_binary_uint64_le(uint64::in, io::di, io::uo) is det.
:- pred write_binary_uint64_le(io.binary_output_stream::in, uint64::in,
io::di, io::uo) is det.
:- pred write_binary_int64_be(int64::in, io::di, io::uo) is det.
:- pred write_binary_int64_be(io.binary_output_stream::in, int64::in,
io::di, io::uo) is det.
:- pred write_binary_uint64_be(uint64::in, io::di, io::uo) is det.
:- pred write_binary_uint64_be(io.binary_output_stream::in, uint64::in,
io::di, io::uo) is det.
%--------------------------------------------------%
% Write the UTF-8 encoding of a string to the current binary output stream
% or the specified binary output stream. If the given string is not
% well-formed, then the behaviour is implementation dependent.
%
:- pred write_binary_string_utf8(string::in, io::di, io::uo) is det.
:- pred write_binary_string_utf8(io.binary_output_stream::in, string::in,
io::di, io::uo) is det.
%--------------------------------------------------%
%
% Text input predicates.
%
% Read a whitespace delimited word from the current input stream
% or from the specified stream.
%
% See char.is_whitespace for the definition of whitespace characters
% used by this predicate.
%
:- pred read_word(io.result(list(char))::out, io::di, io::uo) is det.
:- pred read_word(io.text_input_stream::in, io.result(list(char))::out,
io::di, io::uo) is det.
% Read a line from the current input stream or from the specified
% stream, returning the result as a list of characters (code points).
%
% See the documentation for string.line for the definition of a line.
%
:- pred read_line(io.result(list(char))::out, io::di, io::uo) is det.
:- pred read_line(io.text_input_stream::in, io.result(list(char))::out,
io::di, io::uo) is det.
% Read a line from the current input stream or from the specified
% stream, returning the result as a string.
%
% See the documentation for string.line for the definition of a line.
%
% WARNING: the returned string is NOT guaranteed to be valid UTF-8
% or UTF-16.
%
:- pred read_line_as_string(io.result(string)::out, io::di, io::uo) is det.
:- pred read_line_as_string(io.text_input_stream::in, io.result(string)::out,
io::di, io::uo) is det.
% Discards all the whitespace characters satisfying char.is_whitespace
% from the current stream or from the specified stream.
%
:- pred ignore_whitespace(io.result::out, io::di, io::uo) is det.
:- pred ignore_whitespace(io.text_input_stream::in, io.result::out,
io::di, io::uo) is det.
%--------------------------------------------------%
%
% Bitmap input and output predicates.
%
% Fill a bitmap from the current binary input stream
% or from the specified binary input stream.
% Return the number of bytes read. On end-of-file, the number of
% bytes read will be less than the size of the bitmap, and
% the result will be `ok'.
% Throws an exception if the bitmap has a partial final byte.
%
:- pred read_bitmap(bitmap::bitmap_di, bitmap::bitmap_uo,
int::out, io.res::out, io::di, io::uo) is det.
:- pred read_bitmap(io.binary_input_stream::in,
bitmap::bitmap_di, bitmap::bitmap_uo,
int::out, io.res::out, io::di, io::uo) is det.
:- pragma obsolete(pred(read_bitmap/6), [bitmap.read_bitmap/6]).
:- pragma obsolete(pred(read_bitmap/7), [bitmap.read_bitmap/7]).
% read_bitmap(StartByte, NumBytes, !Bitmap, BytesRead, Result, !IO)
%
% Read NumBytes bytes into a bitmap starting at StartByte from the
% current binary input stream, or from the specified binary input stream.
% Return the number of bytes read. On end-of-file, the number of
% bytes read will be less than NumBytes, and the result will be `ok'.
%
:- pred read_bitmap(byte_index::in, num_bytes::in,
bitmap::bitmap_di, bitmap::bitmap_uo, num_bytes::out, io.res::out,
io::di, io::uo) is det.
:- pred read_bitmap(io.binary_input_stream::in, byte_index::in, num_bytes::in,
bitmap::bitmap_di, bitmap::bitmap_uo, num_bytes::out, io.res::out,
io::di, io::uo) is det.
:- pragma obsolete(pred(read_bitmap/8), [bitmap.read_bitmap_range/8]).
:- pragma obsolete(pred(read_bitmap/9), [bitmap.read_bitmap_range/9]).
%--------------------------------------------------%
% Write a bitmap to the current binary output stream
% or to the specified binary output stream. The bitmap must not contain
% a partial final byte.
%
:- pred write_bitmap(bitmap, io, io).
%:- mode write_bitmap(bitmap_ui, di, uo) is det.
:- mode write_bitmap(in, di, uo) is det.
:- pred write_bitmap(io.binary_output_stream, bitmap, io, io).
%:- mode write_bitmap(in, bitmap_ui, di, uo) is det.
:- mode write_bitmap(in, in, di, uo) is det.
:- pragma obsolete(pred(write_bitmap/3), [bitmap.write_bitmap/3]).
:- pragma obsolete(pred(write_bitmap/4), [bitmap.write_bitmap/4]).
% write_bitmap(BM, StartByte, NumBytes, !IO):
% write_bitmap(Stream, BM, StartByte, NumBytes, !IO):
%
% Write part of a bitmap to the current binary output stream
% or to the specified binary output stream.
%
:- pred write_bitmap(bitmap, int, int, io, io).
%:- mode write_bitmap(bitmap_ui, in, in, di, uo) is det.
:- mode write_bitmap(in, in, in, di, uo) is det.
:- pred write_bitmap(io.binary_output_stream, bitmap, int, int, io, io).
%:- mode write_bitmap(in, bitmap_ui, in, in, di, uo) is det.
:- mode write_bitmap(in, in, in, in, di, uo) is det.
:- pragma obsolete(pred(write_bitmap/5), [bitmap.write_bitmap_range/5]).
:- pragma obsolete(pred(write_bitmap/6), [bitmap.write_bitmap_range/6]).
%--------------------------------------------------%
%
% Reading values of arbitrary types.
%
% Read a ground term of any type, written using standard Mercury syntax,
% from the current stream or from the specified input stream.
% The type of the term read is determined by the context from which
% io.read is called.
%
% This predicate reads the input stream until reaching one of
% an end-of-term token, end-of-file, or I/O error.
%
% - If it finds no non-whitespace characters before the end-of-file,
% then it returns `eof'.
%
% - If it finds a sequence of tokens ending with an end-of-term token,
% which is a `.' followed by whitespace, then it leaves the trailing
% whitespace in the input stream, and decides what to do based on
% the contents of the token sequence before the end-of-term token.
%
% - If the tokens form a syntactically correct ground term of the
% expected type, then it returns `ok(Term)'.
%
% - If tokens do not form a syntactically correct term, or if the term
% they form is not ground, or if the term is not a valid term of the
% expected type, then it returns `error(Message, LineNumber)'.
%
% - If it encounters an I/O error, then it also returns
% `error(Message, LineNumber)'.
%
% See char.is_whitespace for the definition of whitespace characters
% used by this predicate.
%
:- pred read(io.read_result(T)::out, io::di, io::uo) is det.
:- pred read(io.text_input_stream::in, io.read_result(T)::out,
io::di, io::uo) is det.
% The type `posn' represents a position within a string.
%
:- type posn
---> posn(
% The first two fields are used only for computing
% term contexts, for use e.g. in error messages.
%
% Line numbers start at 1; offsets start at zero.
% So the usual posn at the start of a file is posn(1, 0, 0).
% You can write it yourself, or get it by calling init_posn.
posn_current_line_number :: int,
posn_offset_of_start_of_line :: int,
posn_current_offset :: int
).
:- func init_posn = posn.
% read_from_string(FileName, String, MaxPos, Result, Posn0, Posn):
%
% Does the same job as read/4, but reads from a string, not from a stream.
%
% FileName is the name of the source (for use in error messages).
% String is the string to be parsed.
% Posn0 is the position to start parsing from.
% Posn is the position one past where the term read in ends.
% MaxPos is the offset in the string which should be considered the
% end-of-stream -- this is the upper bound for Posn.
% (In the usual case, MaxPos is just the length of the String.)
% WARNING: if MaxPos > length of String, then the behaviour is UNDEFINED.
%
:- pred read_from_string(string::in, string::in, int::in, read_result(T)::out,
posn::in, posn::out) is det.
% Reads a binary representation of a term of type T from the current
% binary input stream or from the specified binary input stream.
%
% Note: if you attempt to read a binary representation written by
% a different program, or a different version of the same program,
% then the results are not guaranteed to be meaningful. Another caveat
% is that higher-order types cannot be read. (If you try, you will get
% a runtime error.)
%
% XXX Note also that in the current implementation, read_binary
% will not work on the Java back-end.
%
:- pred read_binary(io.result(T)::out, io::di, io::uo) is det.
:- pred read_binary(io.binary_input_stream::in, io.result(T)::out,
io::di, io::uo) is det.
%--------------------------------------------------%
%
% Writing values of arbitrary types.
%
% These will all throw an io.error exception if an I/O error occurs.
% print/3 writes its argument to the standard output stream.
% print/4 writes its second argument to the output 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/3 and
% print/4 implicitly specify `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/3 is the same as print/3 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(T::in, io::di, io::uo) is det.
:- pred print(io.text_output_stream::in, T::in, io::di, io::uo) is det.
:- pred print(io.text_output_stream, deconstruct.noncanon_handling, T, io, io).
:- 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.
:- pred print_cc(T::in, io::di, io::uo) is cc_multi.
% print_line calls print and then writes a newline character.
%
:- pred print_line(T::in, io::di, io::uo) is det.
:- pred print_line(io.text_output_stream::in, T::in, io::di, io::uo) is det.
:- pred print_line(io.text_output_stream, deconstruct.noncanon_handling,
T, io, io).
:- mode print_line(in, in(do_not_allow), in, di, uo) is det.
:- mode print_line(in, in(canonicalize), in, di, uo) is det.
:- mode print_line(in, in(include_details_cc), in, di, uo) is cc_multi.
:- mode print_line(in, in, in, di, uo) is cc_multi.
:- pred print_line_cc(T::in, io::di, io::uo) is cc_multi.
% write/3 writes its argument to the current output stream.
% write/4 writes its second argument to the output 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/3
% is the same as write/3 except that it specifies `include_details_cc'
% rather than `canonicalize'.
%
:- pred write(T::in, io::di, io::uo) is det.
:- pred write(io.text_output_stream::in, T::in, io::di, io::uo) is det.
:- pred write(io.text_output_stream, deconstruct.noncanon_handling, T, io, io).
:- 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.
:- pred write_cc(T::in, io::di, io::uo) is cc_multi.
:- pred write_cc(io.text_output_stream::in, T::in, io::di, io::uo) is cc_multi.
% write_line calls write and then writes a newline character.
%
:- pred write_line(T::in, io::di, io::uo) is det.
:- pred write_line(io.text_output_stream::in, T::in, io::di, io::uo) is det.
:- pred write_line(io.text_output_stream, deconstruct.noncanon_handling, T,
io, io).
:- mode write_line(in, in(do_not_allow), in, di, uo) is det.
:- mode write_line(in, in(canonicalize), in, di, uo) is det.
:- mode write_line(in, in(include_details_cc), in, di, uo) is cc_multi.
:- mode write_line(in, in, in, di, uo) is cc_multi.
:- pred write_line_cc(T::in, io::di, io::uo) is cc_multi.
:- pred write_line_cc(io.text_output_stream::in, T::in, io::di, io::uo)
is cc_multi.
% Writes a binary representation of a term to the current binary output
% stream or to the specified stream, in a format suitable for reading in
% again with read_binary.
%
:- pred write_binary(T::in, io::di, io::uo) is det.
:- pred write_binary(io.binary_output_stream::in, T::in, io::di, io::uo)
is det.
%--------------------------------------------------%
%
% Formatted output.
%
% Formats the specified arguments according to the format string,
% using string.format, and then writes the result to the current
% output stream or to the specified output stream.
% (See the documentation of string.format for details.)
%
:- pred format(string::in, list(poly_type)::in, io::di, io::uo) is det.
:- pred format(io.text_output_stream::in, string::in, list(poly_type)::in,
io::di, io::uo) is det.
%--------------------------------------------------%
%
% Writing out several values.
%
% Writes a list of strings to the current output stream
% or to the specified output stream.
%
:- pred write_strings(list(string)::in, io::di, io::uo) is det.
:- pred write_strings(io.text_output_stream::in, list(string)::in,
io::di, io::uo) is det.
% write_prefixed_lines(Prefix, Lines, !IO):
% write_prefixed_lines(Stream, Prefix, Lines, !IO):
%
% Write each line in Lines to the current output stream or to the
% specified output stream. Write Prefix before each line and write
% a newline after each line.
%
:- pred write_prefixed_lines(string::in, list(string)::in, io::di, io::uo)
is det.
:- pred write_prefixed_lines(io.text_output_stream::in, string::in,
list(string)::in, io::di, io::uo) is det.
% Writes the specified arguments to the current output stream
% or to the specified output stream.
%
:- pred write_many(list(poly_type)::in, io::di, io::uo) is det.
:- pred write_many(io.text_output_stream::in, list(poly_type)::in,
io::di, io::uo) is det.
% write_list(List, Separator, OutputPred, !IO):
% write_list(Stream, List, Separator, OutputPred, !IO):
%
% Applies OutputPred to each element of List, printing Separator
% (to the current output stream or to Stream) between each element.
%
:- pred write_list(list(T), string, pred(T, io, io), io, io).
:- mode write_list(in, in, in(pred(in, di, uo) is det), di, uo) is det.
:- mode write_list(in, in, in(pred(in, di, uo) is cc_multi), di, uo)
is cc_multi.
% write_list(Stream, List, Separator, OutputPred, !IO):
% Sets the current output stream to Stream, then applies OutputPred to
% each element of List, printing Separator between each element.
% The original output stream is restored whether returning normally
% or if an exception is thrown.
%
:- pred write_list(io.text_output_stream, list(T), string,
pred(T, io, io), io, io).
:- mode write_list(in, in, in, in(pred(in, di, uo) is det), di, uo) is det.
:- mode write_list(in, in, in, in(pred(in, di, uo) is cc_multi), di, uo)
is cc_multi.
% write_array(Array, Separator, OutputPred, !IO):
% Applies OutputPred to each element of Array, printing Separator
% to the current output stream between each element.
%
:- pred write_array(array(T), string, pred(T, io, io), io, io).
:- mode write_array(in, in, in(pred(in, di, uo) is det), di, uo) is det.
%:- mode write_array(array_ui, in, in(pred(in, di, uo) is det), di uo) is det.
:- mode write_array(in, in, in(pred(in, di, uo) is cc_multi), di, uo)
is cc_multi.
%:- mode write_array(array_ui, in, in(pred(in, di, uo) is cc_multi), di uo)
% is cc_multi.
% write_array(Stream, Array, Separator, OutputPred, !IO):
% Sets the current output stream to Stream, then applies OutputPred to
% each element of Array, printing Separator between each element.
% The original output stream is restored whether returning normally
% or if an exception is thrown.
%
:- pred write_array(io.text_output_stream, array(T), string, pred(T, io, io),
io, io).
:- mode write_array(in, in, in, in(pred(in, di, uo) is det), di, uo) is det.
%:- mode write_array(in, array_ui, in, in(pred(in, di, uo) is det), di uo)
% is det.
:- mode write_array(in, in, in, in(pred(in, di, uo) is cc_multi), di, uo)
is cc_multi.
%:- mode write_array(in, array_ui, in, in(pred(in, di, uo) is cc_multi), di uo)
% is cc_multi.
%--------------------------------------------------%
%
% Flushing output to the operating system.
%
% Flush the output buffer of the current output stream
% or to the specified output stream.
%
:- pred flush_output(io::di, io::uo) is det.
:- pred flush_output(io.text_output_stream::in, io::di, io::uo) is det.
% Flush the output buffer of the current binary output stream.
% or of the specified binary output stream.
%
:- pred flush_binary_output(io::di, io::uo) is det.
:- pred flush_binary_output(io.binary_output_stream::in,
io::di, io::uo) is det.
%--------------------------------------------------%
%
% Whole file input predicates.
%
% Open and read the named file, and if successful, return its contents
% as a string. If either the opening or the reading fails, return
% an error message describing the failure.
%
% With the first version, the returned string is NOT guaranteed
% to be valid UTF-8 (when targeting C) or UTF-16 (when target Java or C#).
% The version that has the _wf suffix DOES guarantee that the
% returned string is valid UTF-8 or UTF-16; if the contents of the file
% is not a well formed string, it will report an error.
%
:- pred read_named_file_as_string(string::in, io.res(string)::out,
io::di, io::uo) is det.
:- pred read_named_file_as_string_wf(string::in, io.res(string)::out,
io::di, io::uo) is det.
% Open and read the named file, and if successful, return its contents
% as a list of lines. If either the opening or the reading fails, return
% an error message describing the failure.
%
% This predicate views files as consisting of a sequence of lines,
% with each line consisting of a possibly empty sequence of non-newline
% characters, followed either by a newline character, or by the
% end of the file. The string returned for each line will not contain
% the newline character.
%
% With the first version, the returned string is NOT guaranteed
% to be valid UTF-8 (when targeting C) or UTF-16 (when target Java or C#).
% The version that has the _wf suffix DOES guarantee that the
% returned string is valid UTF-8 or UTF-16; if the contents of the file
% is not a well formed string, it will report an error.
%
:- pred read_named_file_as_lines(string::in, io.res(list(string))::out,
io::di, io::uo) is det.
:- pred read_named_file_as_lines_wf(string::in, io.res(list(string))::out,
io::di, io::uo) is det.
% Read all the characters (code points) from the current input stream
% or from the specified stream, until eof or error.
%
:- pred read_file(io.maybe_partial_res(list(char))::out,
io::di, io::uo) is det.
:- pred read_file(io.text_input_stream::in,
io.maybe_partial_res(list(char))::out, io::di, io::uo) is det.
% Read all the characters (code points) from the current input stream
% or from the specified stream, until eof or error. Returns the result
% as a string rather than as a list of char.
%
% Returns an error if the file contains a null character, because
% null characters are not allowed in Mercury strings.
%
% With the first two versions, the returned string is NOT guaranteed
% to be valid UTF-8 (when targeting C) or UTF-16 (when target Java or C#).
% The two versions that have the _wf suffix DO guarantee that the
% returned string is valid UTF-8 or UTF-16; if the contents of the file
% is not a well formed string, they will report an error.
%
:- pred read_file_as_string(io.maybe_partial_res(string)::out,
io::di, io::uo) is det.
:- pred read_file_as_string(io.text_input_stream::in,
io.maybe_partial_res(string)::out, io::di, io::uo) is det.
:- pred read_file_as_string_wf(io.maybe_partial_res(string)::out,
io::di, io::uo) is det.
:- pred read_file_as_string_wf(io.text_input_stream::in,
io.maybe_partial_res(string)::out, io::di, io::uo) is det.
% The same as read_file_as_string, but returns not only a string,
% but also the number of code units in that string.
%
% With the first two versions, the returned string is NOT guaranteed
% to be valid UTF-8 (when targeting C) or UTF-16 (when target Java or C#).
% The two versions that have the _wf suffix DO guarantee that the
% returned string is valid UTF-8 or UTF-16; if the contents of the file
% is not a well formed string, they will report an error.
%
:- pred read_file_as_string_and_num_code_units(
io.maybe_partial_res_2(string, int)::out, io::di, io::uo) is det.
:- pred read_file_as_string_and_num_code_units(io.text_input_stream::in,
io.maybe_partial_res_2(string, int)::out, io::di, io::uo) is det.
:- pred read_file_as_string_and_num_code_units_wf(
io.maybe_partial_res_2(string, int)::out, io::di, io::uo) is det.
:- pred read_file_as_string_and_num_code_units_wf(io.text_input_stream::in,
io.maybe_partial_res_2(string, int)::out, io::di, io::uo) is det.
% Reads all the bytes until eof or error from the current binary input
% stream or from the specified binary input stream.
%
:- pred read_binary_file(
io.result(list(int))::out, io::di, io::uo) is det.
:- pred read_binary_file(io.binary_input_stream::in,
io.result(list(int))::out, io::di, io::uo) is det.
% Reads all the bytes until eof or error from the current binary input
% stream or from the specified binary input stream into a bitmap.
%
:- pred read_binary_file_as_bitmap(
io.res(bitmap)::out, io::di, io::uo) is det.
:- pred read_binary_file_as_bitmap(io.binary_input_stream::in,
io.res(bitmap)::out, io::di, io::uo) is det.
%--------------------------------------------------%
%
% Processing the contents of a whole file.
%
% Applies the given closure to each character (code point) read from
% the input stream in turn, until eof or error.
%
:- pred input_stream_foldl(pred(char, T, T), T, io.maybe_partial_res(T),
io, io).
:- mode input_stream_foldl(in(pred(in, in, out) is det), in, out,
di, uo) is det.
:- mode input_stream_foldl(in(pred(in, in, out) is cc_multi), in, out,
di, uo) is cc_multi.
:- pragma obsolete(pred(input_stream_foldl/5), [stream.input_stream_fold/6]).
% Applies the given closure to each character (code point) read from the
% input stream in turn, until eof or error.
%
:- pred input_stream_foldl(io.text_input_stream, pred(char, T, T),
T, io.maybe_partial_res(T), io, io).
:- mode input_stream_foldl(in, in(pred(in, in, out) is det),
in, out, di, uo) is det.
:- mode input_stream_foldl(in, in(pred(in, in, out) is cc_multi),
in, out, di, uo) is cc_multi.
:- pragma obsolete(pred(input_stream_foldl/6), [stream.input_stream_fold/6]).
% Applies the given closure to each character (code point) read from
% the input stream in turn, until eof or error.
%
:- pred input_stream_foldl_io(pred(char, io, io), io.res, io, io).
:- mode input_stream_foldl_io(in(pred(in, di, uo) is det), out, di, uo)
is det.
:- mode input_stream_foldl_io(in(pred(in, di, uo) is cc_multi), out, di, uo)
is cc_multi.
:- pragma obsolete(pred(input_stream_foldl_io/4),
[stream.input_stream_fold_state/5]).
% Applies the given closure to each character (code point) read from the
% input stream in turn, until eof or error.
%
:- pred input_stream_foldl_io(io.text_input_stream, pred(char, io, io),
io.res, io, io).
:- mode input_stream_foldl_io(in, in(pred(in, di, uo) is det),
out, di, uo) is det.
:- mode input_stream_foldl_io(in, in(pred(in, di, uo) is cc_multi),
out, di, uo) is cc_multi.
:- pragma obsolete(pred(input_stream_foldl_io/5),
[stream.input_stream_fold_state/5]).
% Applies the given closure to each character (code point) read from
% the input stream in turn, until eof or error.
%
:- pred input_stream_foldl2_io(pred(char, T, T, io, io),
T, io.maybe_partial_res(T), io, io).
:- mode input_stream_foldl2_io(in(pred(in, in, out, di, uo) is det),
in, out, di, uo) is det.
:- mode input_stream_foldl2_io(in(pred(in, in, out, di, uo) is cc_multi),
in, out, di, uo) is cc_multi.
:- pragma obsolete(pred(input_stream_foldl2_io/5),
[stream.input_stream_fold_state/6]).
% Applies the given closure to each character (code point) read from the
% input stream in turn, until eof or error.
%
:- pred input_stream_foldl2_io(io.text_input_stream,
pred(char, T, T, io, io),
T, maybe_partial_res(T), io, io).
:- mode input_stream_foldl2_io(in,
in(pred(in, in, out, di, uo) is det),
in, out, di, uo) is det.
:- mode input_stream_foldl2_io(in,
in(pred(in, in, out, di, uo) is cc_multi),
in, out, di, uo) is cc_multi.
:- pragma obsolete(pred(input_stream_foldl2_io/6),
[stream.input_stream_fold_state/6]).
% Applies the given closure to each character (code point) read from the
% input stream in turn, until eof or error, or the closure returns `no' as
% its second argument.
%
:- pred input_stream_foldl2_io_maybe_stop(
pred(char, bool, T, T, io, io),
T, io.maybe_partial_res(T), io, io).
:- mode input_stream_foldl2_io_maybe_stop(
in(pred(in, out, in, out, di, uo) is det),
in, out, di, uo) is det.
:- mode input_stream_foldl2_io_maybe_stop(
in(pred(in, out, in, out, di, uo) is cc_multi),
in, out, di, uo) is cc_multi.
:- pragma obsolete(pred(input_stream_foldl2_io_maybe_stop/5),
[stream.input_stream_fold2_state_maybe_stop/6]).
% Applies the given closure to each character (code point) read from the
% input stream in turn, until eof or error, or the closure returns `no' as
% its second argument.
%
:- pred input_stream_foldl2_io_maybe_stop(io.text_input_stream,
pred(char, bool, T, T, io, io),
T, maybe_partial_res(T), io, io).
:- mode input_stream_foldl2_io_maybe_stop(in,
in(pred(in, out, in, out, di, uo) is det),
in, out, di, uo) is det.
:- mode input_stream_foldl2_io_maybe_stop(in,
in(pred(in, out, in, out, di, uo) is cc_multi),
in, out, di, uo) is cc_multi.
:- pragma obsolete(pred(input_stream_foldl2_io_maybe_stop/5),
[stream.input_stream_fold2_state_maybe_stop/6]).
%--------------------------------------------------%
% Applies the given closure to each byte read from the current binary
% input stream in turn, until eof or error.
%
:- pred binary_input_stream_foldl(pred(int, T, T),
T, maybe_partial_res(T), io, io).
:- mode binary_input_stream_foldl(in(pred(in, in, out) is det),
in, out, di, uo) is det.
:- mode binary_input_stream_foldl(in(pred(in, in, out) is cc_multi),
in, out, di, uo) is cc_multi.
:- pragma obsolete(pred(binary_input_stream_foldl/5),
[stream.input_stream_fold/6]).
% Applies the given closure to each byte read from the given binary
% input stream in turn, until eof or error.
%
:- pred binary_input_stream_foldl(io.binary_input_stream,
pred(int, T, T), T, maybe_partial_res(T), io, io).
:- mode binary_input_stream_foldl(in, in(pred(in, in, out) is det),
in, out, di, uo) is det.
:- mode binary_input_stream_foldl(in, in(pred(in, in, out) is cc_multi),
in, out, di, uo) is cc_multi.
:- pragma obsolete(pred(binary_input_stream_foldl/6),
[stream.input_stream_fold/6]).
% Applies the given closure to each byte read from the current binary
% input stream in turn, until eof or error.
%
:- pred binary_input_stream_foldl_io(pred(int, io, io),
io.res, io, io).
:- mode binary_input_stream_foldl_io(in(pred(in, di, uo) is det),
out, di, uo) is det.
:- mode binary_input_stream_foldl_io(in(pred(in, di, uo) is cc_multi),
out, di, uo) is cc_multi.
:- pragma obsolete(pred(binary_input_stream_foldl_io/4),
[stream.input_stream_fold_state/6]).
% Applies the given closure to each byte read from the given binary
% input stream in turn, until eof or error.
%
:- pred binary_input_stream_foldl_io(io.binary_input_stream,
pred(int, io, io), io.res, io, io).
:- mode binary_input_stream_foldl_io(in, in(pred(in, di, uo) is det),
out, di, uo) is det.
:- mode binary_input_stream_foldl_io(in, in(pred(in, di, uo) is cc_multi),
out, di, uo) is cc_multi.
:- pragma obsolete(pred(binary_input_stream_foldl_io/5),
[stream.input_stream_fold_state/6]).
% Applies the given closure to each byte read from the current binary
% input stream in turn, until eof or error.
%
:- pred binary_input_stream_foldl2_io(
pred(int, T, T, io, io), T, maybe_partial_res(T), io, io).
:- mode binary_input_stream_foldl2_io(
in(pred(in, in, out, di, uo) is det), in, out, di, uo) is det.
:- mode binary_input_stream_foldl2_io(
in(pred(in, in, out, di, uo) is cc_multi), in, out, di, uo) is cc_multi.
:- pragma obsolete(pred(binary_input_stream_foldl2_io/5),
[stream.input_stream_fold2_state/6]).
% Applies the given closure to each byte read from the given binary
% input stream in turn, until eof or error.
%
:- pred binary_input_stream_foldl2_io(io.binary_input_stream,
pred(int, T, T, io, io), T, maybe_partial_res(T), io, io).
:- mode binary_input_stream_foldl2_io(in,
in(pred(in, in, out, di, uo) is det), in, out, di, uo) is det.
:- mode binary_input_stream_foldl2_io(in,
in(pred(in, in, out, di, uo) is cc_multi), in, out, di, uo) is cc_multi.
:- pragma obsolete(pred(binary_input_stream_foldl2_io/6),
[stream.input_stream_fold2_state/6]).
% Applies the given closure to each byte read from the current binary
% input stream in turn, until eof or error, or the closure returns `no'
% as its second argument.
%
:- pred binary_input_stream_foldl2_io_maybe_stop(
pred(int, bool, T, T, io, io), T, maybe_partial_res(T), io, io).
:- mode binary_input_stream_foldl2_io_maybe_stop(
in(pred(in, out, in, out, di, uo) is det), in, out, di, uo) is det.
:- mode binary_input_stream_foldl2_io_maybe_stop(
in(pred(in, out, in, out, di, uo) is cc_multi), in, out, di, uo)
is cc_multi.
:- pragma obsolete(pred(binary_input_stream_foldl2_io_maybe_stop/5),
[stream.input_stream_fold2_state_maybe_stop/6]).
% Applies the given closure to each byte read from the given binary input
% stream in turn, until eof or error, or the closure returns `no' as its
% second argument.
%
:- pred binary_input_stream_foldl2_io_maybe_stop(io.binary_input_stream,
pred(int, bool, T, T, io, io), T, maybe_partial_res(T), io, io).
:- mode binary_input_stream_foldl2_io_maybe_stop(in,
in(pred(in, out, in, out, di, uo) is det), in, out, di, uo) is det.
:- mode binary_input_stream_foldl2_io_maybe_stop(in,
in(pred(in, out, in, out, di, uo) is cc_multi), in, out, di, uo)
is cc_multi.
:- pragma obsolete(pred(binary_input_stream_foldl2_io_maybe_stop/6),
[stream.input_stream_fold2_state_maybe_stop/6]).
%--------------------------------------------------%
%
% File handling predicates.
%
:- type access_type
---> read
; write
; execute.
:- type file_type
---> regular_file
; directory
; symbolic_link
; named_pipe
; socket
; character_device
; block_device
; message_queue
; semaphore
; shared_memory
; unknown.
% remove_file(FileName, Result, !IO) attempts to remove the file
% FileName, binding Result to ok/0 if it succeeds, or error/1 if it
% fails. If FileName names a file that is currently open, the behaviour
% is implementation-dependent.
%
% If FileName names a directory, the behavior is currently
% implementation-dependent. On most platforms, an empty directory will be
% deleted.
%
:- pred remove_file(string::in, io.res::out, io::di, io::uo) is det.
:- pragma obsolete(pred(remove_file/4), [io.file.remove_file/4]).
% remove_file_recursively(FileName, Result, !IO) attempts to remove
% the file FileName, binding Result to ok/0 if it succeeds, or error/1
% if it fails. If FileName names a file that is currently open, the
% behaviour is implementation-dependent.
%
% Unlike remove_file, this predicate will attempt to remove non-empty
% directories (recursively). If it fails, some of the directory elements
% may already have been removed.
%
:- pred remove_file_recursively(string::in, io.res::out, io::di, io::uo)
is det.
:- pragma obsolete(pred(remove_file_recursively/4),
[io.file.remove_file_recursively/4]).
% rename_file(OldFileName, NewFileName, Result, !IO).
%
% Attempts to rename the file or directory OldFileName as NewFileName,
% binding Result to ok/0 if it succeeds, or error/1 if it fails.
% If OldFileName names a file that is currently open, the behaviour is
% implementation-dependent. If NewFileName names a file that already
% exists the behaviour is also implementation-dependent; on some systems,
% the file previously named NewFileName will be deleted and replaced
% with the file previously named OldFileName.
%
:- pred rename_file(string::in, string::in, io.res::out, io::di, io::uo)
is det.
:- pragma obsolete(pred(rename_file/5), [io.file.rename_file/5]).
%--------------------------------------------------%
% Succeeds if this platform can read and create symbolic links.
%
:- pred have_symlinks is semidet.
:- pragma obsolete(pred(have_symlinks/0), [io.file.have_symlinks/0]).
% make_symlink(FileName, LinkFileName, Result, !IO).
%
% Attempts to make LinkFileName be a symbolic link to FileName.
% If FileName is a relative path, it is interpreted relative
% to the directory containing LinkFileName.
%
:- pred make_symlink(string::in, string::in, io.res::out, io::di, io::uo)
is det.
:- pragma obsolete(pred(make_symlink/5), [io.file.make_symlink/5]).
% read_symlink(FileName, Result, !IO) returns `ok(LinkTarget)'
% if FileName is a symbolic link pointing to LinkTarget, and
% `error(Error)' otherwise. If LinkTarget is a relative path,
% it should be interpreted relative the directory containing FileName,
% not the current directory.
%
:- pred read_symlink(string::in, io.res(string)::out, io::di, io::uo) is det.
:- pragma obsolete(pred(read_symlink/4), [io.file.read_symlink/4]).
%--------------------------------------------------%
% check_file_accessibility(FileName, AccessTypes, Result):
%
% Check whether the current process can perform the operations given
% in AccessTypes on FileName.
% XXX When using the .NET CLI, this predicate will sometimes report
% that a directory is writable when in fact it is not.
%
:- pred check_file_accessibility(string::in, list(access_type)::in,
io.res::out, io::di, io::uo) is det.
:- pragma obsolete(pred(check_file_accessibility/5),
[io.file.check_file_accessibility/5]).
% file_type(FollowSymLinks, FileName, TypeResult)
% finds the type of the given file.
%
:- pred file_type(bool::in, string::in, io.res(file_type)::out,
io::di, io::uo) is det.
:- pragma obsolete(pred(file_type/5), [io.file.file_type/5]).
% file_modification_time(FileName, TimeResult)
% finds the last modification time of the given file.
%
:- pred file_modification_time(string::in, io.res(time_t)::out,
io::di, io::uo) is det.
:- pragma obsolete(pred(file_modification_time/4),
[io.file.file_modification_time/4]).
%--------------------------------------------------%
%
% Predicates for handling temporary files.
%
% make_temp_file(Result, !IO) creates an empty file whose name is different
% to the name of any existing file. If successful Result returns the name
% of the file. It is the responsibility of the caller to delete the file
% when it is no longer required.
%
% The file is placed in the directory returned by get_temp_directory/3.
%
% On the Java backend, this does not attempt to create the file
% with restrictive permissions (600 on Unix-like systems) and therefore
% should not be used when security is required.
%
:- pred make_temp_file(io.res(string)::out, io::di, io::uo) is det.
:- pragma obsolete(pred(make_temp_file/3), [io.file.make_temp_file/3]).
% make_temp_file(Dir, Prefix, Suffix, Result, !IO) creates an empty file
% whose name is different to the name of any existing file. The file will
% reside in the directory specified by Dir and will have a prefix using up
% to the first 5 code units of Prefix. If successful, Result returns the
% name of the file. It is the responsibility of the caller to delete the
% file when it is no longer required.
%
% The reason for truncating Prefix is historical; in future the behaviour
% may be changed. Note that the truncation is performed without regard for
% code point boundaries. It is recommended to use only (printable) ASCII
% characters in the prefix string.
%
% The C backend has the following limitations:
% - Suffix may be ignored.
%
% The C# backend has the following limitations:
% - Dir is ignored.
% - Prefix is ignored.
% - Suffix is ignored.
%
% On the Java backend, this does not attempt to create the file
% with restrictive permissions (600 on Unix-like systems) and therefore
% should not be used when security is required.
%
:- pred make_temp_file(string::in, string::in, string::in, io.res(string)::out,
io::di, io::uo) is det.
:- pragma obsolete(pred(make_temp_file/6), [io.file.make_temp_file/6]).
% make_temp_directory(Result, !IO) creates an empty directory whose name
% is different from the name of any existing directory.
%
% On the Java backend this is insecure as the file permissions are not set.
%
:- pred make_temp_directory(io.res(string)::out, io::di, io::uo) is det.
:- pragma obsolete(pred(make_temp_directory/3),
[io.file.make_temp_directory/3]).
% make_temp_directory(Dir, Prefix, Suffix, Result, !IO) creates an empty
% directory whose name is different from the name of any existing
% directory. The new directory will reside in the existing directory
% specified by Dir and will have a prefix using up to the first 5
% characters of Prefix and a Suffix. Result returns the name of the
% new directory. It is the responsibility of the program to delete the
% directory when it is no longer needed.
%
% The C backend has the following limitations:
% - Suffix is ignored.
%
% The C# backend has the following limitations:
% - Prefix is ignored.
% - Suffix is ignored.
%
% On the Java backend this is insecure as the file permissions are not set.
%
:- pred make_temp_directory(string::in, string::in, string::in,
io.res(string)::out, io::di, io::uo) is det.
:- pragma obsolete(pred(make_temp_directory/6),
[io.file.make_temp_directory/6]).
% Test if the make_temp_directory predicates are available.
% This is false for C backends without support for mkdtemp(3).
%
:- pred have_make_temp_directory is semidet.
:- pragma obsolete(pred(have_make_temp_directory/0),
[io.file.have_make_temp_directory/0]).
% get_temp_directory(DirName, !IO)
%
% DirName is the name of a directory where applications should put
% temporary files.
%
% This is implementation-dependent. For current Mercury implementations,
% it is determined as follows:
% 1. For the non-Java back-ends:
% - On Microsoft Windows systems, the file will reside in
% the current directory if the TMP environment variable
% is not set, or in the directory specified by TMP if it is set.
% - On Unix systems, the file will reside in /tmp if the TMPDIR
% environment variable is not set, or in the directory specified
% by TMPDIR if it is set.
% 2. For the Java back-end, the system-dependent default
% temporary-file directory will be used, specified by the Java
% system property java.io.tmpdir. On UNIX systems the default
% value of this property is typically "/tmp" or "/var/tmp";
% on Microsoft Windows systems it is typically "c:\\temp".
%
:- pred get_temp_directory(string::out, io::di, io::uo) is det.
:- pragma obsolete(pred(get_temp_directory/3), [io.file.get_temp_directory/3]).
%--------------------------------------------------%
%
% Global state predicates.
%
% progname(DefaultProgname, Progname).
%
% Returns the name that the program was invoked with, if available,
% or DefaultProgname if the name is not available.
% Does not modify the I/O state.
%
:- pred progname(string::in, string::out, io::di, io::uo) is det.
% progname_base(DefaultProgname, Progname).
%
% Like `progname', except that it strips off any path name
% preceding the program name. Useful for error messages.
%
:- pred progname_base(string::in, string::out, io::di, io::uo) is det.
% Returns the arguments that the program was invoked with,
% if available, otherwise an empty list. Does not modify the I/O state.
%
:- pred command_line_arguments(list(string)::out, io::di, io::uo) is det.
%--------------------------------------------------%
% The I/O state contains an integer used to record the program's exit
% status. When the program finishes, it will return this exit status
% to the operating system. The following predicates can be used to get
% and set the exit status.
%
:- pred get_exit_status(int::out, io::di, io::uo) is det.
:- pred set_exit_status(int::in, io::di, io::uo) is det.
%--------------------------------------------------%
% Values of this type map the names of environment variables
% to their values.
%
:- type environment_var_map == map(string, string).
% The following predicates provide an interface to the environment list.
% Do not attempt to put spaces or '=' signs in the names of environment
% variables, or bad things may result!
%
% First argument is the name of the environment variable. Returns
% yes(Value) if the variable was set (Value will be set to the value
% of the variable) and no if the variable was not set.
%
:- pred get_environment_var(string::in, maybe(string)::out,
io::di, io::uo) is det.
:- pragma obsolete(pred(get_environment_var/4),
[io.environment.get_environment_var/4]).
% First argument is the name of the environment variable, second argument
% is the value to be assigned to that variable. Res is 'ok' on success or
% 'error(ErrorCode)' if the system runs out of environment space or if
% the environment cannot be modified.
%
% Note that the environment cannot be modified on Java.
%
:- pred set_environment_var(string::in, string::in, io.res::out,
io::di, io::uo) is det.
:- pragma obsolete(pred(set_environment_var/5),
[io.environment.set_environment_var/5]).
% Same as set_environment_var/5, but throws an exception if an error
% occurs.
%
:- pred set_environment_var(string::in, string::in, io::di, io::uo) is det.
:- pragma obsolete(pred(set_environment_var/4),
[io.environment.set_environment_var/4]).
% Test if the set_environment_var/{4,5} predicates are available.
% This is false for Java backends.
%
:- pred have_set_environment_var is semidet.
:- pragma obsolete(pred(have_set_environment_var/0),
[io.environment.have_set_environment_var/0]).
% Return a map containing all the environment variables in the current
% environment, together with their values.
%
:- pred get_environment_var_map(environment_var_map::out,
io::di, io::uo) is det.
:- pragma obsolete(pred(get_environment_var_map/3),
[io.environment.get_environment_var_map/3]).
%--------------------------------------------------%
%
% System access predicates.
%
:- type system_result
---> exited(int)
; signalled(int).
% Invokes the operating system shell with the specified Command.
% Result is either `ok(ExitStatus)', if it was possible to invoke
% the command, or `error(ErrorCode)' if not. The ExitStatus will be 0
% if the command completed successfully or the return value of the system
% call. If a signal kills the system call, then Result will be an error
% indicating which signal occurred.
%
:- pred call_system(string::in, io.res(int)::out, io::di, io::uo) is det.
:- pragma obsolete(pred(call_system_return_signal/4),
[io.call_system.call_system/4]).
% call_system_return_signal(Command, Result, !IO):
%
% Invokes the operating system shell with the specified Command.
% Result is either `ok(ExitStatus)' if it was possible to invoke
% the command or `error(Error)' if the command could not be executed.
% If the command could be executed then ExitStatus is either
% `exited(ExitCode)' if the command ran to completion or
% `signalled(SignalNum)' if the command was killed by a signal.
% If the command ran to completion then ExitCode will be 0 if the command
% ran successfully and the return value of the command otherwise.
%
:- pred call_system_return_signal(string::in, io.res(system_result)::out,
io::di, io::uo) is det.
:- pragma obsolete(pred(call_system_return_signal/4),
[io.call_system.call_system_return_signal/4]).
%--------------------------------------------------%
%
% Managing the globals structure that Mercury attaches to the I/O state.
%
% The I/O state includes a `globals' field which is not used by the
% standard library, but can be used by the application. The globals field
% is of type univ so that the application can store any data it wants
% there. The following predicates can be used to access this global state.
%
% Does not modify the I/O state.
%
% The globals field is obsolete. A mutable declaration will provide
% the same functionality with better type safety.
%
:- pred get_globals(univ::out, io::di, io::uo) is det.
:- pred set_globals(univ::in, io::di, io::uo) is det.
:- pragma obsolete(pred(get_globals/3)).
:- pragma obsolete(pred(set_globals/3)).
% update_globals(UpdatePred, !IO).
% Update the globals field in the I/O state based upon its current value.
% This is equivalent to the following:
%
% get_globals(Globals0, !IO),
% UpdatePred(Globals0, Globals),
% set_globals(Globals, !IO)
%
% In parallel grades calls to update_globals/3 are atomic.
% If UpdatePred throws an exception then the globals field is
% left unchanged.
%
% The globals field is obsolete. A mutable declaration will provide
% the same functionality with better type safety.
%
:- pred update_globals(pred(univ, univ)::in(pred(in, out) is det),
io::di, io::uo) is det.
:- pragma obsolete(pred(update_globals/3)).
%--------------------------------------------------%
%
% Predicates that report statistics about the execution of the current process
% so far.
%
% report_stats(Stream, Selector, !IO):
% report_stats(Selector, !IO):
%
% Write selected statistics to the specified stream, or (if none)
% to stderr. What statistics will be written is controlled by the
% Selector argument. What selector values cause what statistics
% to be printed is implementation defined.
%
% The Melbourne implementation supports the following selectors:
%
% "standard"
% Writes memory/time usage statistics.
%
% "full_memory_stats"
% Writes complete memory usage statistics, including information
% about all procedures and types. Requires compilation with memory
% profiling enabled.
%
% "tabling"
% Writes statistics about the internals of the tabling system.
% Requires the runtime to have been compiled with the macro
% MR_TABLE_STATISTICS defined.
%
:- pred report_stats(io.text_output_stream::in, string::in,
io::di, io::uo) is det.
:- pred report_stats(string::in, io::di, io::uo) is det.
:- pragma obsolete(pred(report_stats/4), [benchmarking.report_stats/4]).
:- pragma obsolete(pred(report_stats/3), [benchmarking.report_stats/3]).
% Write standard memory/time usage statistics to the specified stream,
% or (if none) to stderr.
%
:- pred report_standard_stats(io.text_output_stream::in,
io::di, io::uo) is det.
:- pred report_standard_stats(io::di, io::uo) is det.
:- pragma obsolete(pred(report_standard_stats/3),
[benchmarking.report_standard_stats/3]).
:- pragma obsolete(pred(report_standard_stats/2),
[benchmarking.report_standard_stats/2]).
% report_full_memory_stats/3 reports a full memory profile
% to the specified output stream, or (if none) to stderr.
%
:- pred report_full_memory_stats(io.text_output_stream::in,
io::di, io::uo) is det.
:- pred report_full_memory_stats(io::di, io::uo) is det.
:- pragma obsolete(pred(report_full_memory_stats/3),
[benchmarking.report_full_memory_stats/3]).
:- pragma obsolete(pred(report_full_memory_stats/2),
[benchmarking.report_full_memory_stats/2]).
% report_tabling_statistics/3, as its name says, reports statistics
% about tabling to the specified output stream, or (if none) to stderr.
%
% XXX For now, these predicates work only with the C backend.
%
:- pred report_tabling_statistics(io.text_output_stream::in,
io::di, io::uo) is det.
:- pred report_tabling_statistics(io::di, io::uo) is det.
:- pragma obsolete(pred(report_tabling_statistics/3),
[benchmarking.report_tabling_statistics/3]).
:- pragma obsolete(pred(report_tabling_statistics/2),
[benchmarking.report_tabling_statistics/2]).
%--------------------------------------------------%
%
% Interpreting I/O error messages.
%
% Construct an error value with the specified error message.
% The error value will not have an associated system error.
%
:- func make_io_error(string) = io.error.
% make_io_error_from_system_error(SystemError, Prefix, Error, !IO):
%
% Construct an io.error value given a system error and an error message
% prefix, which may be the empty string. The error message will be
% constructed by appending Prefix and the error message retrieved from the
% system for SystemError.
%
% On C backends, the io.system_error must be an errno value,
% not a Windows error code.
%
:- pred make_io_error_from_system_error(io.system_error::in, string::in,
io.error::out, io::di, io::uo) is det.
% make_io_error_from_windows_error(SystemError, Prefix, Error, !IO):
%
% Construct an io.error value from the given Windows system error and error
% message prefix. This predicate may only be called when using a C backend
% running on Windows. On other platforms, it throws an exception.
%
:- pred make_io_error_from_windows_error(io.system_error::in, string::in,
io.error::out, io::di, io::uo) is det.
% Return an error message for the error value.
%
:- func error_message(io.error) = string.
:- pred error_message(io.error::in, string::out) is det.
% get_system_error(Error, SystemError):
%
% Succeeds if-and-only-if SystemError is a system error
% associated with Error.
%
:- pred get_system_error(io.error::in, io.system_error::out) is semidet.
% As above, but only succeeds if the system error is an errno value.
%
:- pred get_errno_error(io.error::in, io.system_error::out) is semidet.
% As above, but only succeeds if the system error is a Windows error code.
%
:- pred get_windows_error(io.error::in, io.system_error::out) is semidet.
% As above, but only if the system error is a C# or Java exception object,
% or null.
%
:- pred get_exception_object_error(io.error::in, io.system_error::out)
is semidet.
% get_system_error_name(Error, ErrorName):
%
% Succeeds if Error has an associated system error, otherwise fails.
% On success, ErrorName is a name for that system error as follows.
%
% For C backends, a system error is usually an errno value. If the errno
% value is recognised by the Mercury system, then ErrorName will be the
% name for that errno value as defined in <errno.h>, e.g. "ENOENT".
% Otherwise, ErrorName will be "errno N" where N is a decimal number.
%
% For C backends on Windows, a system error may instead be a Windows system
% error code. If the error code is recognised by the Mercury system, then
% ErrorName will be the name for that error code in the Windows API,
% e.g. "ERROR_FILE_NOT_FOUND". Otherwise, ErrorName will be
% "System error 0xN" where 0xN is a hexadecimal number.
%
% For the C# backend, ErrorName will be the fully qualified class name
% of an exception object, e.g. "System.IO.FileNotFoundException",
% or "null".
%
% For the Java backend, ErrorName will be the fully qualified class name
% of an exception object, e.g. "java.io.FileNotFoundException",
% or "null".
%
:- pred get_system_error_name(io.error::in, string::out) is semidet.
% Succeeds if the given system error value corresponds to the lack of an
% error.
%
:- pred system_error_is_success(io.system_error::in) is semidet.
%--------------------------------------------------%
%
% Instances of the stream typeclasses.
%
:- instance stream.error(io.error).
% Text input stream instances.
:- instance stream.stream(text_input_stream, io).
:- instance stream.input(text_input_stream, io).
:- instance stream.line_oriented(text_input_stream, io).
:- instance stream.reader(text_input_stream, char, io, io.error).
:- instance stream.reader(text_input_stream, line, io, io.error).
:- instance stream.reader(text_input_stream, text_file, io, io.error).
:- instance stream.unboxed_reader(text_input_stream, char, io, io.error).
:- instance stream.putback(text_input_stream, char, io, io.error).
% Binary input stream instances.
:- instance stream.stream(binary_input_stream, io).
:- instance stream.input(binary_input_stream, io).
:- instance stream.seekable(binary_input_stream, io).
:- instance stream.reader(binary_input_stream, int, io, io.error).
:- instance stream.reader(binary_input_stream, int8, io, io.error).
:- instance stream.reader(binary_input_stream, uint8, io, io.error).
% The instance for int, which predates the addition of sized integers
% to Mercury, reads a byte, which it stores in the least significant
% eight bits. The plan is to eventually delete the instance for int.
:- instance stream.unboxed_reader(binary_input_stream, int8, io, io.error).
:- instance stream.unboxed_reader(binary_input_stream, uint8, io, io.error).
% This typeclass was defined after the addition of sized integers
% to Mercury, which is why there is no instance for int.
:- instance stream.putback(binary_input_stream, int, io, io.error).
:- instance stream.putback(binary_input_stream, int8, io, io.error).
:- instance stream.putback(binary_input_stream, uint8, io, io.error).
% The instance for int, which predates the addition of sized integers
% to Mercury, puts back a byte, which it stores in the least significant
% eight bits. The plan is to eventually delete the instance for int.
% Text output stream instances.
:- instance stream.stream(text_output_stream, io).
:- instance stream.output(text_output_stream, io).
:- instance stream.line_oriented(text_output_stream, io).
:- instance stream.writer(text_output_stream, char, io).
:- instance stream.writer(text_output_stream, float, io).
:- instance stream.writer(text_output_stream, int, io).
:- instance stream.writer(text_output_stream, int8, io).
:- instance stream.writer(text_output_stream, int16, io).
:- instance stream.writer(text_output_stream, int32, io).
:- instance stream.writer(text_output_stream, int64, io).
:- instance stream.writer(text_output_stream, uint, io).
:- instance stream.writer(text_output_stream, uint8, io).
:- instance stream.writer(text_output_stream, uint16, io).
:- instance stream.writer(text_output_stream, uint32, io).
:- instance stream.writer(text_output_stream, uint64, io).
:- instance stream.writer(text_output_stream, string, io).
:- instance stream.writer(text_output_stream, univ, io).
% Binary output stream instances.
:- instance stream.stream(binary_output_stream, io).
:- instance stream.output(binary_output_stream, io).
:- instance stream.seekable(binary_output_stream, io).
:- instance stream.writer(binary_output_stream, byte, io).
:- instance stream.writer(binary_output_stream, int8, io).
:- instance stream.writer(binary_output_stream, uint8, io).
%--------------------------------------------------%
%--------------------------------------------------%
Next: io.call_system, Previous: integer, Up: Top [Contents]