File:  [DVB] / dietlibc / libstdio / fgetc_unlocked.c
Revision 1.12: download - view: text, annotated - select for diffs
Thu Feb 26 20:51:54 2009 UTC (15 years, 3 months ago) by leitner
Branches: MAIN
CVS tags: HEAD
  use randomness passed in ELF auxvec instead of /dev/urandom in startup
    (strace looks cleaner now)
  use ELF auxvec to implement getpagesize
  support thread local storage (w00t!!!!)
and a small cosmetic change to fgetc_unlocked

#include "dietstdio.h"
#include <unistd.h>

int fgetc_unlocked(FILE *stream) {
  unsigned char c;
  if (__unlikely(!(stream->flags&CANREAD))) goto kaputt;
  if (__unlikely(stream->ungotten)) {
    stream->ungotten=0;
    return stream->ungetbuf;
  }

  /* common case first */
  if (__likely(stream->bm<stream->bs))
    return (unsigned char)stream->buf[stream->bm++];

  if (__unlikely(feof_unlocked(stream)))
    return EOF;
  if (__fflush4(stream,BUFINPUT)) return EOF;
  if (__unlikely(stream->bm>=stream->bs)) {
    ssize_t len=__libc_read(stream->fd,stream->buf,stream->buflen);
    if (len==0) {
      stream->flags|=EOFINDICATOR;
      return EOF;
    } else if (len<0) {
kaputt:
      stream->flags|=ERRORINDICATOR;
      return EOF;
    }
    stream->bm=0;
    stream->bs=len;
  }
  c=stream->buf[stream->bm];
  ++stream->bm;
  return c;
}

int fgetc(FILE* stream) __attribute__((weak,alias("fgetc_unlocked")));

LinuxTV legacy CVS <linuxtv.org/cvs>