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_stdinuser_input in
Prolog. Which stream is referenced by user_input is
controlled by the Prolog flag user_input
SP_stdoutuser_output
in Prolog. Which stream is referenced by user_output is
controlled by the Prolog flag user_output.
SP_stderruser_error in
Prolog. Which stream is referenced by user_error is
controlled by the flag user_error.
SP_curinSP_stdin. It can be
changed with the predicates see/1 and set_input/1.
SP_curoutSP_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.