From the Prolog level there is a unique number that identifies a stream. This identifier can be converted from/to a Prolog stream:
stream_code(
+Stream,
?StreamCode)
stream_code(
?Stream,
+StreamCode)
The StreamCode is a Prolog integer representing an
SP_stream *
pointer.
To read or write on a Prolog stream from C, special versions of the most common standard C I/O functions are used:
int SP_getc(void)
int SP_fgetc(SP_stream *s)
void SP_putc(int c)
void SP_fputc(int c, SP_stream *s)
The above functions deliver or accept wide character codes.
void SP_puts(char *string)
void SP_fputs(char *string, SP_stream *s)
int SP_printf(char *format, ...)
int SP_fprintf(SP_stream *s, char *format, ...)
int SP_fflush(SP_stream *s)
int SP_fclose(SP_stream *s)
The above functions expect and deliver encoded strings in their
char *
and char **
arguments. Specifically, in the
SP_printf()
and SP_fprintf()
functions, first the
formatting operation will be performed. The resulting string will be
assumed to be in internal encoding, and will then be output using
the SP_puts()
or SP_fputs()
function (see below). This
means, e.g. that the %c
printf conversion specification can
only be used for ASCII characters, and the strings included using a
%s
specification should also be ASCII strings, or already
transformed to the encoded form.
The SP_puts()
and SP_fputs()
functions first convert their
encoded string argument into a sequence of wide
character codes, and then output these on the required
stream according to the external encoding; see WCX Foreign Interface.
There following predefined streams are accessible from C:
SP_stdin
user_input
in
Prolog. Which stream is referenced by user_input
is
controlled by the Prolog flag user_input
SP_stdout
user_output
in Prolog. Which stream is referenced by user_output
is
controlled by the Prolog flag user_output
.
SP_stderr
user_error
in
Prolog. Which stream is referenced by user_error
is
controlled by the flag user_error
.
SP_curin
SP_stdin
. It can be
changed with the predicates see/1
and set_input/1
.
SP_curout
SP_stdout
. It can
be changed with the predicates tell/1
and
set_output/1
.
Note that these variables are read only. They are set but never read by the stream handling.