
/*
 *  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);
}

