forked from KolibriOS/kolibrios
upload sdk
git-svn-id: svn://kolibrios.org@4349 a494cfbc-eb01-0410-851d-a64ba20cac60
This commit is contained in:
119
contrib/sdk/sources/newlib/stdio/fclose.c
Normal file
119
contrib/sdk/sources/newlib/stdio/fclose.c
Normal file
@@ -0,0 +1,119 @@
|
||||
/*
|
||||
* Copyright (c) 1990 The Regents of the University of California.
|
||||
* All rights reserved.
|
||||
*
|
||||
* Redistribution and use in source and binary forms are permitted
|
||||
* provided that the above copyright notice and this paragraph are
|
||||
* duplicated in all such forms and that any documentation,
|
||||
* advertising materials, and other materials related to such
|
||||
* distribution and use acknowledge that the software was developed
|
||||
* by the University of California, Berkeley. The name of the
|
||||
* University may not be used to endorse or promote products derived
|
||||
* from this software without specific prior written permission.
|
||||
* THIS SOFTWARE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR
|
||||
* IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED
|
||||
* WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.
|
||||
*/
|
||||
|
||||
/*
|
||||
FUNCTION
|
||||
<<fclose>>---close a file
|
||||
|
||||
INDEX
|
||||
fclose
|
||||
INDEX
|
||||
_fclose_r
|
||||
|
||||
ANSI_SYNOPSIS
|
||||
#include <stdio.h>
|
||||
int fclose(FILE *<[fp]>);
|
||||
int _fclose_r(struct _reent *<[reent]>, FILE *<[fp]>);
|
||||
|
||||
TRAD_SYNOPSIS
|
||||
#include <stdio.h>
|
||||
int fclose(<[fp]>)
|
||||
FILE *<[fp]>;
|
||||
|
||||
int fclose(<[fp]>)
|
||||
struct _reent *<[reent]>
|
||||
FILE *<[fp]>;
|
||||
|
||||
DESCRIPTION
|
||||
If the file or stream identified by <[fp]> is open, <<fclose>> closes
|
||||
it, after first ensuring that any pending data is written (by calling
|
||||
<<fflush(<[fp]>)>>).
|
||||
|
||||
The alternate function <<_fclose_r>> is a reentrant version.
|
||||
The extra argument <[reent]> is a pointer to a reentrancy structure.
|
||||
|
||||
RETURNS
|
||||
<<fclose>> returns <<0>> if successful (including when <[fp]> is
|
||||
<<NULL>> or not an open file); otherwise, it returns <<EOF>>.
|
||||
|
||||
PORTABILITY
|
||||
<<fclose>> is required by ANSI C.
|
||||
|
||||
Required OS subroutines: <<close>>, <<fstat>>, <<isatty>>, <<lseek>>,
|
||||
<<read>>, <<sbrk>>, <<write>>.
|
||||
*/
|
||||
|
||||
#include <_ansi.h>
|
||||
#include <reent.h>
|
||||
#include <stdio.h>
|
||||
#include <stdlib.h>
|
||||
#include <sys/lock.h>
|
||||
#include "local.h"
|
||||
|
||||
int
|
||||
_DEFUN(_fclose_r, (rptr, fp),
|
||||
struct _reent *rptr _AND
|
||||
register FILE * fp)
|
||||
{
|
||||
int r;
|
||||
|
||||
if (fp == NULL)
|
||||
return (0); /* on NULL */
|
||||
|
||||
CHECK_INIT (rptr, fp);
|
||||
|
||||
_flockfile (fp);
|
||||
|
||||
if (fp->_flags == 0) /* not open! */
|
||||
{
|
||||
_funlockfile (fp);
|
||||
return (0);
|
||||
}
|
||||
/* Unconditionally flush to allow special handling for seekable read
|
||||
files to reposition file to last byte processed as opposed to
|
||||
last byte read ahead into the buffer. */
|
||||
r = _fflush_r (rptr, fp);
|
||||
if (fp->_close != NULL && fp->_close (rptr, fp->_cookie) < 0)
|
||||
r = EOF;
|
||||
if (fp->_flags & __SMBF)
|
||||
_free_r (rptr, (char *) fp->_bf._base);
|
||||
if (HASUB (fp))
|
||||
FREEUB (rptr, fp);
|
||||
if (HASLB (fp))
|
||||
FREELB (rptr, fp);
|
||||
__sfp_lock_acquire ();
|
||||
fp->_flags = 0; /* release this FILE for reuse */
|
||||
_funlockfile (fp);
|
||||
#ifndef __SINGLE_THREAD__
|
||||
__lock_close_recursive (fp->_lock);
|
||||
#endif
|
||||
|
||||
__sfp_lock_release ();
|
||||
|
||||
return (r);
|
||||
}
|
||||
|
||||
#ifndef _REENT_ONLY
|
||||
|
||||
int
|
||||
_DEFUN(fclose, (fp),
|
||||
register FILE * fp)
|
||||
{
|
||||
return _fclose_r(_REENT, fp);
|
||||
}
|
||||
|
||||
#endif
|
Reference in New Issue
Block a user