9.9.4 Stream Example

This is a small example how to initialize a bidirectional socket stream (error handling omitted):

     typedef struct {
       int fd;                       /* socket number */
       FILE *r_stream;               /* For reading */
       FILE *w_stream;               /* For writing */
     } SocketData;
     
     int socket_sgetc(SocketData *socket)
     {
       return fgetc(socket->r_stream);
     }
     
     int socket_sputc(char c, SocketData *socket)
     {
       return fputc(c, socket->w_stream);
     }
     
     int socket_sflush(SocketData *socket)
     {
       return fflush(socket->w_stream);
     }
     
     int socket_seof(SocketData *socket)
     {
       return feof(socket->r_stream);
     }
     
     void socket_sclrerr(SocketData *socket)
     {
       clearerr(socket->r_stream);
       clearerr(socket->w_stream);
     }
     
     int socket_sclose(SocketData *socket)
     {
       fclose(socket->r_stream);
       fclose(socket->w_stream);
       close(socket->fd);
       free(socket);
       return 0;
     }
     SP_stream *new_socket_stream(int fd)
     {
       SP_stream *stream;
       SocketData *socket;
     
     /* Allocate and initialize data local to socket */
     
       socket = (SocketData *)malloc(sizeof(SocketData));
       socket->fd = fd;
       socket->r_stream = fdopen(fd,"r");
       socket->w_stream = fdopen(fd,"w");
     
     /* Allocate and initialize Prolog stream */
     
       SP_make_stream(
                      socket,
                      socket_sgetc,
                      socket_sputc,
                      socket_sflush,
                      socket_seof,
                      socket_sclrerr,
                      socket_sclose,
                      &stream);
     
     /* Allocate and copy string */
     
       stream->filename = "socket";
       stream->fd = fd;
     
       return stream;
     }