home *** CD-ROM | disk | FTP | other *** search
/ PC Extra Super CD 1998 January / PCPLUS131.iso / DJGPP / V2 / DJLSR201.ZIP / src / libc / ansi / stdio / setvbuf.c < prev    next >
Encoding:
C/C++ Source or Header  |  1996-03-23  |  961 b   |  50 lines

  1. /* Copyright (C) 1996 DJ Delorie, see COPYING.DJ for details */
  2. /* Copyright (C) 1994 DJ Delorie, see COPYING.DJ for details */
  3. #include <stdio.h>
  4. #include <stdlib.h>
  5. #include <libc/file.h>
  6.  
  7. int setvbuf(FILE *f, char *buf, int type, size_t len)
  8. {
  9.   int mine=0;
  10.   if (!f)
  11.     return -1;
  12.   fflush(f);
  13.   switch (type)
  14.   {
  15.   case _IOFBF:
  16.   case _IOLBF:
  17.     if (len <= 0)
  18.       return -1;
  19.     if (buf == 0)
  20.     {
  21.       buf = (char *)malloc(len);
  22.       if (buf == 0)
  23.     return -1;
  24.       mine = 1;
  25.     }
  26.   case _IONBF:
  27.     if (f->_base != NULL && f->_flag & _IOMYBUF)
  28.       free(f->_base);
  29.     f->_cnt = 0;
  30.  
  31.     f->_flag &= ~(_IONBF|_IOFBF|_IOLBF|_IOUNGETC);
  32.     f->_flag |= type;
  33.     if (type != _IONBF)
  34.     {
  35.       if (mine)
  36.     f->_flag |= _IOMYBUF;
  37.       f->_ptr = f->_base = buf;
  38.       f->_bufsiz = len;
  39.     }
  40.     else
  41.     {
  42.       f->_base = 0;
  43.       f->_bufsiz = 0;
  44.     }
  45.     return 0;
  46.   default:
  47.     return -1;
  48.   }
  49. }
  50.