1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798 |
- #include "_stdio.h"
- int fclose(register FILE *stream)
- {
- int rv = 0;
- __STDIO_AUTO_THREADLOCK_VAR;
- #ifdef __STDIO_HAS_OPENLIST
- #if !defined(__UCLIBC_HAS_THREADS__) || !defined(__STDIO_BUFFERS)
-
- {
- FILE *ptr;
- __STDIO_THREADLOCK_OPENLIST_DEL;
- __STDIO_THREADLOCK_OPENLIST_ADD;
- ptr = _stdio_openlist;
- if ((ptr = _stdio_openlist) == stream) {
- _stdio_openlist = stream->__nextopen;
- } else {
- while (ptr) {
- if (ptr->__nextopen == stream) {
- ptr->__nextopen = stream->__nextopen;
- break;
- }
- ptr = ptr->__nextopen;
- }
- }
- __STDIO_THREADUNLOCK_OPENLIST_ADD;
- __STDIO_THREADUNLOCK_OPENLIST_DEL;
- }
- #endif
- #endif
- __STDIO_AUTO_THREADLOCK(stream);
- __STDIO_STREAM_VALIDATE(stream);
- #ifdef __STDIO_BUFFERS
-
- if (__STDIO_STREAM_IS_WRITING(stream)) {
- rv = fflush_unlocked(stream);
- }
- #endif
- if (__CLOSE(stream) < 0) {
- rv = EOF;
- }
- stream->__filedes = -1;
-
- #if defined(__UCLIBC_HAS_THREADS__) && defined(__STDIO_BUFFERS)
-
- __STDIO_OPENLIST_INC_USE;
- #endif
- stream->__modeflags &= (__FLAG_FREEBUF|__FLAG_FREEFILE);
- stream->__modeflags |= (__FLAG_READONLY|__FLAG_WRITEONLY);
- #ifndef NDEBUG
-
- __STDIO_STREAM_DISABLE_GETC(stream);
- __STDIO_STREAM_DISABLE_PUTC(stream);
- __STDIO_STREAM_INIT_BUFREAD_BUFPOS(stream);
- # ifdef __UCLIBC_HAS_WCHAR__
- stream->__ungot_width[0] = 0;
- # endif
- # ifdef __STDIO_MBSTATE
- __INIT_MBSTATE(&(stream->__state));
- # endif
- #endif
- __STDIO_AUTO_THREADUNLOCK(stream);
- __STDIO_STREAM_FREE_BUFFER(stream);
- #if defined(__UCLIBC_HAS_THREADS__) && defined(__STDIO_BUFFERS)
-
- __STDIO_OPENLIST_INC_DEL_CNT;
- __STDIO_OPENLIST_DEC_USE;
- #else
- __STDIO_STREAM_FREE_FILE(stream);
- #endif
- return rv;
- }
- libc_hidden_def(fclose)
|