OpenCores
URL https://opencores.org/ocsvn/openrisc_2011-10-31/openrisc_2011-10-31/trunk

Subversion Repositories openrisc_2011-10-31

[/] [openrisc/] [tags/] [gnu-src/] [newlib-1.18.0/] [newlib-1.18.0-or32-1.0rc1/] [newlib/] [libc/] [stdio/] [fclose.c] - Diff between revs 207 and 345

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

Rev 207 Rev 345
/*
/*
 * 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.
 */
 */
 
 
/*
/*
FUNCTION
FUNCTION
<<fclose>>---close a file
<<fclose>>---close a file
 
 
INDEX
INDEX
        fclose
        fclose
INDEX
INDEX
        _fclose_r
        _fclose_r
 
 
ANSI_SYNOPSIS
ANSI_SYNOPSIS
        #include <stdio.h>
        #include <stdio.h>
        int fclose(FILE *<[fp]>);
        int fclose(FILE *<[fp]>);
        int _fclose_r(struct _reent *<[reent]>, FILE *<[fp]>);
        int _fclose_r(struct _reent *<[reent]>, FILE *<[fp]>);
 
 
TRAD_SYNOPSIS
TRAD_SYNOPSIS
        #include <stdio.h>
        #include <stdio.h>
        int fclose(<[fp]>)
        int fclose(<[fp]>)
        FILE *<[fp]>;
        FILE *<[fp]>;
 
 
        int fclose(<[fp]>)
        int fclose(<[fp]>)
        struct _reent *<[reent]>
        struct _reent *<[reent]>
        FILE *<[fp]>;
        FILE *<[fp]>;
 
 
DESCRIPTION
DESCRIPTION
If the file or stream identified by <[fp]> is open, <<fclose>> closes
If the file or stream identified by <[fp]> is open, <<fclose>> closes
it, after first ensuring that any pending data is written (by calling
it, after first ensuring that any pending data is written (by calling
<<fflush(<[fp]>)>>).
<<fflush(<[fp]>)>>).
 
 
The alternate function <<_fclose_r>> is a reentrant version.
The alternate function <<_fclose_r>> is a reentrant version.
The extra argument <[reent]> is a pointer to a reentrancy structure.
The extra argument <[reent]> is a pointer to a reentrancy structure.
 
 
RETURNS
RETURNS
<<fclose>> returns <<0>> if successful (including when <[fp]> is
<<fclose>> returns <<0>> if successful (including when <[fp]> is
<<NULL>> or not an open file); otherwise, it returns <<EOF>>.
<<NULL>> or not an open file); otherwise, it returns <<EOF>>.
 
 
PORTABILITY
PORTABILITY
<<fclose>> is required by ANSI C.
<<fclose>> is required by ANSI C.
 
 
Required OS subroutines: <<close>>, <<fstat>>, <<isatty>>, <<lseek>>,
Required OS subroutines: <<close>>, <<fstat>>, <<isatty>>, <<lseek>>,
<<read>>, <<sbrk>>, <<write>>.
<<read>>, <<sbrk>>, <<write>>.
*/
*/
 
 
#include <_ansi.h>
#include <_ansi.h>
#include <reent.h>
#include <reent.h>
#include <stdio.h>
#include <stdio.h>
#include <stdlib.h>
#include <stdlib.h>
#include <sys/lock.h>
#include <sys/lock.h>
#include "local.h"
#include "local.h"
 
 
int
int
_DEFUN(_fclose_r, (rptr, fp),
_DEFUN(_fclose_r, (rptr, fp),
      struct _reent *rptr _AND
      struct _reent *rptr _AND
      register FILE * fp)
      register FILE * fp)
{
{
  int r;
  int r;
 
 
  if (fp == NULL)
  if (fp == NULL)
    return (0);                  /* on NULL */
    return (0);                  /* on NULL */
 
 
  __sfp_lock_acquire ();
  __sfp_lock_acquire ();
 
 
  CHECK_INIT (rptr, fp);
  CHECK_INIT (rptr, fp);
 
 
  _flockfile (fp);
  _flockfile (fp);
 
 
  if (fp->_flags == 0)           /* not open! */
  if (fp->_flags == 0)           /* not open! */
    {
    {
      _funlockfile (fp);
      _funlockfile (fp);
      __sfp_lock_release ();
      __sfp_lock_release ();
      return (0);
      return (0);
    }
    }
  /* Unconditionally flush to allow special handling for seekable read
  /* Unconditionally flush to allow special handling for seekable read
     files to reposition file to last byte processed as opposed to
     files to reposition file to last byte processed as opposed to
     last byte read ahead into the buffer.  */
     last byte read ahead into the buffer.  */
  r = _fflush_r (rptr, fp);
  r = _fflush_r (rptr, fp);
  if (fp->_close != NULL && fp->_close (rptr, fp->_cookie) < 0)
  if (fp->_close != NULL && fp->_close (rptr, fp->_cookie) < 0)
    r = EOF;
    r = EOF;
  if (fp->_flags & __SMBF)
  if (fp->_flags & __SMBF)
    _free_r (rptr, (char *) fp->_bf._base);
    _free_r (rptr, (char *) fp->_bf._base);
  if (HASUB (fp))
  if (HASUB (fp))
    FREEUB (rptr, fp);
    FREEUB (rptr, fp);
  if (HASLB (fp))
  if (HASLB (fp))
    FREELB (rptr, fp);
    FREELB (rptr, fp);
  fp->_flags = 0;                /* release this FILE for reuse */
  fp->_flags = 0;                /* release this FILE for reuse */
  _funlockfile (fp);
  _funlockfile (fp);
#ifndef __SINGLE_THREAD__
#ifndef __SINGLE_THREAD__
  __lock_close_recursive (fp->_lock);
  __lock_close_recursive (fp->_lock);
#endif
#endif
 
 
  __sfp_lock_release ();
  __sfp_lock_release ();
 
 
  return (r);
  return (r);
}
}
 
 
#ifndef _REENT_ONLY
#ifndef _REENT_ONLY
 
 
int
int
_DEFUN(fclose, (fp),
_DEFUN(fclose, (fp),
       register FILE * fp)
       register FILE * fp)
{
{
  return _fclose_r(_REENT, fp);
  return _fclose_r(_REENT, fp);
}
}
 
 
#endif
#endif
 
 

powered by: WebSVN 2.1.0

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