home *** CD-ROM | disk | FTP | other *** search
/ Microsoft Programmer's Library 1.3 / Microsoft-Programers-Library-v1.3.iso / sampcode / alde_c / misc / lib / dlibssrc / fputc.c < prev    next >
Encoding:
C/C++ Source or Header  |  1987-10-05  |  1.0 KB  |  50 lines

  1. #include <osbind.h>
  2. #include <stdio.h>
  3. #include <io.h>
  4.  
  5. static int    _fputc2 = FALSE;    /* "2nd time in" flag */
  6.  
  7. int fputc(c, fp)
  8. char c;
  9. register FILE *fp;
  10. /*
  11.  *    Put the character <c> to the stream <fp>.
  12.  */
  13. {
  14.     register int f, m;
  15.  
  16.     f = fp->F_stat;
  17.     if(!(f & F_WRITE))            /* stream opened for write? */
  18.         return(EOF);
  19.     m = (F_BUFFER | F_READ | F_IODIR);
  20.     if((f & m) == (F_BUFFER | F_READ))    /* r/w direction switch */
  21.         fflush(fp);
  22.     fp->F_stat |= F_IODIR;
  23.     if(f & (F_ERROR | F_EOF))        /* error/eof conditions */
  24.         return(EOF);
  25.     if((c == '\n') && !_fputc2 && !(f & F_BINARY)) {
  26.         _fputc2 = TRUE;
  27.         m = fputc('\r', fp);
  28.         _fputc2 = FALSE;
  29.         if(m < 0)
  30.             return(EOF);
  31.     }
  32.     if(f & F_BUFFER) {
  33.         *(fp->F_bp)++ = c;
  34.         if((++(fp->F_cnt)) >= fp->F_bsiz) {
  35.             fp->F_cnt = 0;
  36.             fp->F_bp = fp->F_buf;
  37.             m = fp->F_bsiz;
  38.             if(write(fp->F_h, fp->F_buf, m) != m) {
  39.                 fp->F_stat |= F_ERROR;
  40.                 return(EOF);
  41.             }
  42.         }
  43.     }
  44.     else {
  45.         if(write(fp->F_h, &c, 1) != 1)
  46.             return(EOF);
  47.     }
  48.     return(c);
  49. }
  50.