home *** CD-ROM | disk | FTP | other *** search
/ Fresh Fish 9 / FreshFishVol9-CD2.bin / bbs / gnu / libnix-0.8-src.lha / libnix-0.8 / sources / nix / stdio / __srget.c < prev    next >
Encoding:
C/C++ Source or Header  |  1994-12-12  |  1007 b   |  44 lines

  1. #include <stdio.h>
  2. #include <errno.h>
  3. #include <unistd.h>
  4.  
  5. extern void __chkabort(void);
  6. extern int __fflush(FILE *stream);
  7.  
  8. int __srget(FILE *stream) /* Get next input block */
  9. {
  10.   __chkabort();
  11.   if(stream->flags&96) /* Error on stream / EOF */
  12.   { stream->incount=0;
  13.     errno=EPERM;
  14.     return EOF; }
  15.   if(stream->flags&8)
  16.   { if(__fflush(stream))
  17.       return EOF;
  18.   }else if(stream->tmpp!=NULL) /* File is in ungetc mode */
  19.   {
  20.     stream->p=stream->tmpp;
  21.     stream->incount=stream->tmpinc;
  22.     stream->tmpp=NULL;
  23.     if(--stream->incount>=0)
  24.       return *stream->p++;
  25.   }
  26.   if(stream->flags&0x200) /* Is a sscanf buffer */
  27.     return EOF;
  28.   stream->flags|=4;
  29.   stream->incount=read(stream->file,stream->buffer,stream->bufsize);
  30.   if(stream->incount==0) /* EOF found */
  31.   {
  32.     stream->flags|=32;
  33.     return EOF;
  34.   }else if(stream->incount<0) /* Error */
  35.   {
  36.     stream->incount=0;
  37.     stream->flags|=64;
  38.     return EOF;
  39.   }
  40.   stream->incount--;
  41.   stream->p=stream->buffer;
  42.   return *stream->p++;
  43. }
  44.