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 / fgetc.c < prev    next >
Encoding:
C/C++ Source or Header  |  1987-10-05  |  2.0 KB  |  89 lines

  1. #include <osbind.h>
  2. #include <stdio.h>
  3. #include <io.h>
  4.  
  5. static int    _fgetc2 = FALSE;    /* "2nd time in" flag */
  6.  
  7. int fgetc(fp)
  8. register FILE *fp;
  9. /*
  10.  *    Get a character from <fp>.  Returns the character or EOF.
  11.  */
  12. {
  13.     register int f, m;
  14.     unsigned char c;
  15.  
  16.     f = fp->F_stat;
  17.     if(!(f & F_READ))            /* stream opened for read? */
  18.         return(EOF);
  19.     m = (F_BUFFER | F_WRITE | F_IODIR);
  20.     if((f & m) == m)            /* 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(fp->F_unc1) {            /* ungotten character */
  26.         c = fp->F_unc1;
  27.         fp->F_unc1 = fp->F_unc2;
  28.         fp->F_unc2 = '\0';
  29.     }
  30.     else if(f & F_BUFFER) {
  31.         if(!((fp->F_cnt)--)) {
  32.             if((m = read(fp->F_h, fp->F_buf, fp->F_bsiz)) < 0) {
  33.                 fp->F_stat |= F_ERROR;
  34.                 return(EOF);
  35.             }
  36.             if(m == 0) {
  37.                 fp->F_stat |= F_EOF;
  38.                 return(EOF);
  39.             }
  40.             fp->F_cnt = (m - 1);
  41.             fp->F_bp = fp->F_buf;
  42.         }
  43.         c = *(fp->F_bp)++;
  44.     }
  45.     else {
  46.         if((m = read(fp->F_h, &c, 1)) < 0) {
  47.             fp->F_stat |= F_ERROR;
  48.             return(EOF);
  49.         }
  50.         if(m == 0) {
  51.             fp->F_stat |= F_EOF;
  52.             return(EOF);
  53.         }
  54.     }
  55.     if((c == '\r') && !_fgetc2 && !(f & F_BINARY)) {
  56.         _fgetc2 = TRUE;
  57.         if(f & F_DEVICE)            /* translated device */
  58.             c = '\n';
  59.         else if((c = fgetc(fp)) != '\n') {    /* translated stream */
  60.             fungetc(c, fp);
  61.             c = '\r';
  62.         }
  63.         _fgetc2 = FALSE;
  64.     }
  65.     else if((c == '\n') && !(f & F_BINARY) && (f & F_DEVICE))
  66.         c = fgetc(fp);                /* filter <LF> on DEV */
  67.     else if((c == 0x1A) && !(f & F_BINARY)) {    /* ^Z xlat to EOF */
  68.         fp->F_stat |= F_EOF;
  69.         return(EOF);
  70.     }
  71.     return(c);
  72. }
  73.  
  74. int fungetc(c, fp)
  75. char c;
  76. register FILE *fp;
  77. /*
  78.  *    Push the character <c> back to be gotten by the next fgetc()
  79.  *    call on <fp>.  Only 1 character may be ungotten at a time on
  80.  *    each stream.  Subsequent calls to fungetc() will write over
  81.  *    the currently saved character.
  82.  */
  83. {
  84.     if(fp->F_stat & (F_ERROR | F_EOF))
  85.         return(EOF);
  86.     fp->F_unc2 = fp->F_unc1;
  87.     return(fp->F_unc1 = c);
  88. }
  89.