OpenCores
URL https://opencores.org/ocsvn/openrisc_me/openrisc_me/trunk

Subversion Repositories openrisc_me

[/] [openrisc/] [trunk/] [gnu-src/] [newlib-1.17.0/] [newlib/] [libc/] [stdio/] [refill.c] - Diff between revs 148 and 158

Only display areas with differences | Details | Blame | View Log

Rev 148 Rev 158
/*
/*
 * Copyright (c) 1990 The Regents of the University of California.
 * Copyright (c) 1990 The Regents of the University of California.
 * All rights reserved.
 * All rights reserved.
 *
 *
 * Redistribution and use in source and binary forms are permitted
 * Redistribution and use in source and binary forms are permitted
 * provided that the above copyright notice and this paragraph are
 * provided that the above copyright notice and this paragraph are
 * duplicated in all such forms and that any documentation,
 * duplicated in all such forms and that any documentation,
 * advertising materials, and other materials related to such
 * advertising materials, and other materials related to such
 * distribution and use acknowledge that the software was developed
 * distribution and use acknowledge that the software was developed
 * by the University of California, Berkeley.  The name of the
 * by the University of California, Berkeley.  The name of the
 * University may not be used to endorse or promote products derived
 * University may not be used to endorse or promote products derived
 * from this software without specific prior written permission.
 * from this software without specific prior written permission.
 * THIS SOFTWARE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR
 * THIS SOFTWARE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR
 * IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED
 * IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED
 * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.
 * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.
 */
 */
/* No user fns here.  Pesch 15apr92. */
/* No user fns here.  Pesch 15apr92. */
 
 
#include <_ansi.h>
#include <_ansi.h>
#include <stdio.h>
#include <stdio.h>
#include <stdlib.h>
#include <stdlib.h>
#include <errno.h>
#include <errno.h>
#include "local.h"
#include "local.h"
 
 
static int
static int
_DEFUN(lflush, (fp),
_DEFUN(lflush, (fp),
       FILE *fp)
       FILE *fp)
{
{
  if ((fp->_flags & (__SLBF | __SWR)) == (__SLBF | __SWR))
  if ((fp->_flags & (__SLBF | __SWR)) == (__SLBF | __SWR))
    return fflush (fp);
    return fflush (fp);
  return 0;
  return 0;
}
}
 
 
/*
/*
 * Refill a stdio buffer.
 * Refill a stdio buffer.
 * Return EOF on eof or error, 0 otherwise.
 * Return EOF on eof or error, 0 otherwise.
 */
 */
 
 
int
int
_DEFUN(__srefill_r, (ptr, fp),
_DEFUN(__srefill_r, (ptr, fp),
       struct _reent * ptr _AND
       struct _reent * ptr _AND
       register FILE * fp)
       register FILE * fp)
{
{
  /* make sure stdio is set up */
  /* make sure stdio is set up */
 
 
  CHECK_INIT (ptr, fp);
  CHECK_INIT (ptr, fp);
 
 
  ORIENT (fp, -1);
  ORIENT (fp, -1);
 
 
  fp->_r = 0;                    /* largely a convenience for callers */
  fp->_r = 0;                    /* largely a convenience for callers */
 
 
#ifndef __CYGWIN__
#ifndef __CYGWIN__
  /* SysV does not make this test; take it out for compatibility */
  /* SysV does not make this test; take it out for compatibility */
  if (fp->_flags & __SEOF)
  if (fp->_flags & __SEOF)
    return EOF;
    return EOF;
#endif
#endif
 
 
  /* if not already reading, have to be reading and writing */
  /* if not already reading, have to be reading and writing */
  if ((fp->_flags & __SRD) == 0)
  if ((fp->_flags & __SRD) == 0)
    {
    {
      if ((fp->_flags & __SRW) == 0)
      if ((fp->_flags & __SRW) == 0)
        {
        {
          ptr->_errno = EBADF;
          ptr->_errno = EBADF;
          fp->_flags |= __SERR;
          fp->_flags |= __SERR;
          return EOF;
          return EOF;
        }
        }
      /* switch to reading */
      /* switch to reading */
      if (fp->_flags & __SWR)
      if (fp->_flags & __SWR)
        {
        {
          if (_fflush_r (ptr, fp))
          if (_fflush_r (ptr, fp))
            return EOF;
            return EOF;
          fp->_flags &= ~__SWR;
          fp->_flags &= ~__SWR;
          fp->_w = 0;
          fp->_w = 0;
          fp->_lbfsize = 0;
          fp->_lbfsize = 0;
        }
        }
      fp->_flags |= __SRD;
      fp->_flags |= __SRD;
    }
    }
  else
  else
    {
    {
      /*
      /*
       * We were reading.  If there is an ungetc buffer,
       * We were reading.  If there is an ungetc buffer,
       * we must have been reading from that.  Drop it,
       * we must have been reading from that.  Drop it,
       * restoring the previous buffer (if any).  If there
       * restoring the previous buffer (if any).  If there
       * is anything in that buffer, return.
       * is anything in that buffer, return.
       */
       */
      if (HASUB (fp))
      if (HASUB (fp))
        {
        {
          FREEUB (ptr, fp);
          FREEUB (ptr, fp);
          if ((fp->_r = fp->_ur) != 0)
          if ((fp->_r = fp->_ur) != 0)
            {
            {
              fp->_p = fp->_up;
              fp->_p = fp->_up;
              return 0;
              return 0;
            }
            }
        }
        }
    }
    }
 
 
  if (fp->_bf._base == NULL)
  if (fp->_bf._base == NULL)
    __smakebuf_r (ptr, fp);
    __smakebuf_r (ptr, fp);
 
 
  /*
  /*
   * Before reading from a line buffered or unbuffered file,
   * Before reading from a line buffered or unbuffered file,
   * flush all line buffered output files, per the ANSI C
   * flush all line buffered output files, per the ANSI C
   * standard.
   * standard.
   */
   */
 
 
  if (fp->_flags & (__SLBF | __SNBF))
  if (fp->_flags & (__SLBF | __SNBF))
    _CAST_VOID _fwalk (_GLOBAL_REENT, lflush);
    _CAST_VOID _fwalk (_GLOBAL_REENT, lflush);
  fp->_p = fp->_bf._base;
  fp->_p = fp->_bf._base;
  fp->_r = fp->_read (ptr, fp->_cookie, (char *) fp->_p, fp->_bf._size);
  fp->_r = fp->_read (ptr, fp->_cookie, (char *) fp->_p, fp->_bf._size);
#ifndef __CYGWIN__
#ifndef __CYGWIN__
  if (fp->_r <= 0)
  if (fp->_r <= 0)
#else
#else
  if (fp->_r > 0)
  if (fp->_r > 0)
    fp->_flags &= ~__SEOF;
    fp->_flags &= ~__SEOF;
  else
  else
#endif
#endif
    {
    {
      if (fp->_r == 0)
      if (fp->_r == 0)
        fp->_flags |= __SEOF;
        fp->_flags |= __SEOF;
      else
      else
        {
        {
          fp->_r = 0;
          fp->_r = 0;
          fp->_flags |= __SERR;
          fp->_flags |= __SERR;
        }
        }
      return EOF;
      return EOF;
    }
    }
  return 0;
  return 0;
}
}
 
 

powered by: WebSVN 2.1.0

© copyright 1999-2024 OpenCores.org, equivalent to Oliscience, all rights reserved. OpenCores®, registered trademark.