QU_initio() user-redefinable

Synopsis

     #include <quintus/quintus.h>
     
     int QU_initio(user_input, user_output, user_error, act_astty, error_num)
     QP_stream **user_input;
     QP_stream **user_output;
     QP_stream **user_error;
     int         act_astty;
     int        *error_num;
     

Initializes Prolog input/output system. Returns QP_SUCCESS upon success and QP_ERROR upon failure.

Description

The three Prolog initial stream are created in QU_initio(). The Prolog standard input stream is returned through user_input, the standard output stream is returned through user_output, and the standard error stream is returned through user_error. The created streams are accessed in the Prolog system as user_input (QP_stdin), user_output (QP_stdout), and user_error (QP_stderr).

If act_astty is non-zero, the Prolog system requests QU_initio() to initialize the three initial streams as tty streams even if they are not really connected to a tty. One example of such a request is that Prolog is running under remote shell.

The parameter error_num stores the error code if QU_initio() returns QP_ERROR. The error code can be any of the host operating system error numbers, QP error numbers or a user-defined error number.

Tip

The process required to create these three initial streams is similar to that of implementing a customized Prolog stream. (see fli-ios-cps). However, these three initial streams should not be registered. Calling QP_register_stream() to register any of the three streams created by QU_initio() may cause an error when Prolog starts up.

Examples

The following is the source code for an implementation of QU_initio() function in C language.

     #include <sys/types.h>
     #include <sys/stat.h>
     #include <quintus/quintus.h>
     
     #define TTY_BUFSIZ              128
     #define MAX_FIFO_BUFSIZ         4096
     
     extern  QP_stream    *QU_fdopen();
     
     /*
      *  This I/O initialization function only handles three possible
      *  types of file, a tty file , a pipe and an ordinary file
      */
     int QU_initio(user_input, user_output, user_error, act_astty,
                               error_num)
         QP_stream   **user_input, **user_output, **user_error;
         int         act_astty, *error_num;
         {
             int             fd, is_tty;
             struct  stat    statbuf;
             QP_stream       option, *streams[3], *prompt_stream;
             extern char     *ttyname();
     
             for (fd=2; fd >= 0 ; --fd) {
                 is_tty = isatty(fd);
                 QU_stream_param((is_tty) ? "/dev/tty" : "",
                             (fd) ? QP_WRITE : QP_READ, &option);
                 if (is_tty || act_astty) {
                     /* make sure other parameters are right  */
                     option.format     = QP_DELIM_TTY;
                     option.max_reclen = TTY_BUFSIZ;
                     option.seek_type  = QP_SEEK_ERROR;
                     if (fd == 0)
                         option.peof_act = QP_PASTEOF_RESET;
                 } else  {
                     if (fstat(fd, &statbuf) < 0)
                         return QP_ERROR;
                     if ((statbuf.st_mode & S_IFIFO) == S_IFIFO) {
                         option.max_reclen = MAX_FIFO_BUFSIZ;
                         option.seek_type  = QP_SEEK_ERROR;
                     } else
                         option.max_reclen = statbuf.st_blksize;
                 }
     
                 option.mode = (fd) ? QP_WRITE : QP_READ;
                 if ((streams[fd]=QU_fdopen(&option,"",error_num,fd))
                                     ==QP_NULL_STREAM)
                     return QP_ERROR;
                 if (is_tty) {
                     char        *tty_id;
                     if (! (tty_id = ttyname(fd)) )
                         tty_id = "/PROLOG DEFAULT TTYS";
                     (void) QP_add_tty(streams[fd], tty_id);
                 } else if (act_astty)
                     (void) QP_add_tty(streams[fd],
                                       "/PROLOG INITAIL STREAMS");
             }
             (streams[0])->filename="USER$INPUT";
             *user_input  = streams[0];
             (streams[1])->filename="USER$OUTPUT";
             *user_output = streams[1];
             (streams[2])->filename="USER$ERROR";
             *user_error  = streams[2];
             if ((streams[0])->format == QP_DELIM_TTY
                     && (streams[1])->format != QP_DELIM_TTY
                     && (streams[2])->format != QP_DELIM_TTY) {
                 char *tty_id;
                 /* create an output stream for prompt */
                 QU_stream_param(isatty(0) ? "/dev/tty" : "", QP_WRITE,
                                                 &option);
                 option.format = QP_DELIM_TTY;
                 option.max_reclen = TTY_BUFSIZ;
                 option.seek_type = QP_SEEK_ERROR;
                 if ((prompt_stream = QU_fdopen(&option, "", error_num,
                                    0)) == QP_NULL_STREAM)
                     return QP_ERROR;
                 (void) QP_register_stream(prompt_stream);
                 if (! (tty_id = ttyname(0)) )
                     tty_id = "/PROLOG DEFAULT TTYS";
                 (void) QP_add_tty(prompt_stream, tty_id);
             }
             return QP_SUCCESS;
         }