summaryrefslogtreecommitdiffstats
path: root/mdk-stage1/dietlibc/libstdio/fgetc.c
blob: 90d83961a10a3d011eefa9d73861e215b01804f7 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
#include "dietstdio.h"
#include <unistd.h>

extern int feof(FILE *stream);

int fgetc(FILE *stream) {
  unsigned char c;
#ifdef WANT_UNGETC
  if (stream->ungotten) {
    stream->ungotten=0;
    return stream->ungetbuf;
  }
#endif
  if (feof(stream))
    return EOF;
#ifdef WANT_BUFFERED_STDIO
  if (__fflush4(stream,BUFINPUT)) return EOF;
  if (stream->bm>=stream->bs) {
    int len=read(stream->fd,stream->buf,BUFSIZE);
    if (len==0) {
      stream->flags|=EOFINDICATOR;
      return EOF;
    } else if (len<0) {
      stream->flags|=ERRORINDICATOR;
      return EOF;
    }
    stream->bm=0;
    stream->bs=len;
  }
  c=stream->buf[stream->bm];
  ++stream->bm;
  return c;
#else
  if (read(stream->fd,&c,1)!=1) {
    stream->flags|=ERRORINDICATOR;
    return EOF;
  }
  return c;
#endif
}