home *** CD-ROM | disk | FTP | other *** search
/ Atari FTP / ATARI_FTP_0693.zip / ATARI_FTP_0693 / Mint / mntlib32.zoo / fputc.c < prev    next >
C/C++ Source or Header  |  1992-09-17  |  961b  |  52 lines

  1. /* from Dale Schumacher's dLibs */
  2.  
  3. #include <stdio.h>
  4. #include "lib.h"
  5.  
  6. #ifndef TRUE
  7. #define TRUE  1
  8. #define FALSE 0
  9. #endif
  10.  
  11. int fputc(c, fp)
  12.         register int c;
  13.     register FILE *fp;
  14. {
  15.     register int nl = FALSE;
  16.     register long m;
  17.     unsigned int f = fp->_flag;
  18.  
  19.     if(f & _IORW)
  20.     {
  21.         fp->_flag |= _IOWRT;
  22.         f = (fp->_flag &= ~(_IOREAD | _IOEOF));
  23.     }
  24.     if(!(f & _IOWRT)            /* not opened for write? */
  25.        || (f & (_IOERR | _IOEOF)))        /* error/eof conditions? */
  26.         return(EOF);
  27.  
  28.     if(!(f & _IOBIN) && (c == '\n'))    /* NL -> CR+LF ? */
  29.     {
  30.         c = '\r';
  31.         nl = TRUE;
  32.     }
  33. _fputc:
  34.     *(fp->_ptr)++ = c; fp->_cnt++;
  35.     if( (fp->_cnt >= fp->_bsiz) || 
  36.         ((f & _IOLBF) && (c == '\n'))  ) /* flush line buffd stream on \n */
  37.     {
  38.         m = fp->_cnt;
  39.         fp->_cnt = 0;
  40.         fp->_ptr = fp->_base;
  41.         if(_write(fp->_file, fp->_base, m) != m) {
  42.             fp->_flag |= _IOERR;
  43.             return(EOF);
  44.         }
  45.     }
  46.     if(nl && (c == '\r')) {            /* NL -> CR+LF ? */
  47.         c = '\n';
  48.         goto _fputc;
  49.     }
  50.     return(c & 0xff);
  51. }
  52.