home *** CD-ROM | disk | FTP | other *** search
-
- /*
- * SETVBUF
- *
- * (c)Copyright 1990, Matthew Dillon, All Rights Reserved
- *
- * Hacked because my stdio utilizes two buffers to support full
- * duplex streams.
- */
-
- #include <stdio.h>
- #include <errno.h>
-
- int
- setvbuf(fi, buf, mode, bytes)
- FILE *fi;
- char *buf;
- int mode;
- long bytes;
- {
- fflush(fi);
-
- switch(mode) {
- case _IOFBF:
- fi->sd_Flags &= ~__SIF_IOLBF;
- case _IOLBF:
- if (mode == _IOLBF)
- fi->sd_Flags |= __SIF_IOLBF;
- if (bytes) {
- if (fi->sd_Flags & __SIF_MYBUF) {
- if (fi->sd_RBuf) {
- free(fi->sd_RBuf);
- }
-
- if (fi->sd_WBuf) {
- free(fi->sd_WBuf);
- }
- }
- /*
- fi->sd_Flags &= ~__SIF_MYBUF;
- */
- fi->sd_BufSiz = bytes;
- fi->sd_WLeft = -1;
- fi->sd_RLeft = -1;
-
- /*
- fi->sd_WBuf = buf;
- fi->sd_WPtr = buf;
- */
- fi->sd_WBuf = NULL;
- fi->sd_WPtr = NULL;
- fi->sd_RBuf = NULL;
- fi->sd_RPtr = NULL;
- }
- /*
- * put terminal back into cooked mode XXX
- */
- break;
- case _IONBF:
- fi->sd_Flags &= ~__SIF_IOLBF;
- fi->sd_BufSiz = 0;
- if (fi->sd_Flags & __SIF_MYBUF) {
- if (fi->sd_RBuf) {
- free(fi->sd_RBuf);
- fi->sd_RBuf = NULL;
- fi->sd_RPtr = NULL;
- }
- if (fi->sd_WBuf) {
- free(fi->sd_WBuf);
- fi->sd_WBuf = NULL;
- }
- }
- fi->sd_Flags &= ~__SIF_MYBUF;
- fi->sd_WBuf = NULL;
- fi->sd_WPtr = NULL;
- fi->sd_RBuf = NULL;
- fi->sd_RPtr = NULL;
- fi->sd_WLeft = -1;
- fi->sd_RLeft = -1;
-
- /*
- * attempt to place terminal in RAW mode XXX
- */
-
- break;
- default:
- return(EOF);
- }
- return(0);
- }
-
-