| Line | |
|---|
| 1 | #include "dietstdio.h" |
|---|
| 2 | #include <unistd.h> |
|---|
| 3 | |
|---|
| 4 | int fgetc_unlocked(FILE *stream) { |
|---|
| 5 | unsigned char c; |
|---|
| 6 | if (!(stream->flags&CANREAD)) goto kaputt; |
|---|
| 7 | |
|---|
| 8 | if (stream->ungotten) { |
|---|
| 9 | stream->ungotten=0; |
|---|
| 10 | return stream->ungetbuf; |
|---|
| 11 | } |
|---|
| 12 | |
|---|
| 13 | log_msg("fgetc fd %d, mb %d, bs %d\n", stream->fd, stream->bm, stream->bs); |
|---|
| 14 | /* common case first */ |
|---|
| 15 | if (stream->bm<stream->bs) |
|---|
| 16 | { |
|---|
| 17 | log_msg("fgetc fd %d, %c\n", stream->fd, stream->buf[stream->bm]); |
|---|
| 18 | return (unsigned char)stream->buf[stream->bm++]; |
|---|
| 19 | } |
|---|
| 20 | |
|---|
| 21 | if (feof_unlocked(stream)) |
|---|
| 22 | return EOF; |
|---|
| 23 | |
|---|
| 24 | if (__fflush4(stream,BUFINPUT)) return EOF; |
|---|
| 25 | if (stream->bm>=stream->bs) { |
|---|
| 26 | ssize_t len= read(stream->fd,stream->buf,stream->buflen); |
|---|
| 27 | if (len==0) { |
|---|
| 28 | stream->flags|=EOFINDICATOR; |
|---|
| 29 | return EOF; |
|---|
| 30 | } else if (len<0) { |
|---|
| 31 | kaputt: |
|---|
| 32 | stream->flags|=ERRORINDICATOR; |
|---|
| 33 | return EOF; |
|---|
| 34 | } |
|---|
| 35 | stream->bm=0; |
|---|
| 36 | stream->bs=len; |
|---|
| 37 | } |
|---|
| 38 | c=stream->buf[stream->bm]; |
|---|
| 39 | ++stream->bm; |
|---|
| 40 | return c; |
|---|
| 41 | } |
|---|
| 42 | |
|---|
| 43 | int fgetc(FILE* stream) __attribute__((weak,alias("fgetc_unlocked"))); |
|---|
Note: See
TracBrowser
for help on using the repository browser.