fclose.c
上传用户:nvosite88
上传日期:2007-01-17
资源大小:4983k
文件大小:4k
源码类别:

VxWorks

开发平台:

C/C++

  1. /* fclose.c - close file  stdio.h */
  2. /* Copyright 1992-1993 Wind River Systems, Inc. */
  3. /*
  4. modification history
  5. --------------------
  6. 01d,05feb99,dgp  document errno values
  7. 01c,05mar93,jdi  documentation cleanup for 5.1.
  8. 01b,20sep92,smb  documentation additions
  9. 01a,29jul92,jcf  added OBJ_VERIFY and memory reclaimation.
  10.    +smb  taken from UCB stdio
  11. */
  12. /*
  13. DESCRIPTION
  14.  *
  15.  * Copyright (c) 1990 The Regents of the University of California.
  16.  * All rights reserved.
  17.  *
  18.  * This code is derived from software contributed to Berkeley by
  19.  * Chris Torek.
  20.  *
  21.  * Redistribution and use in source and binary forms, with or without
  22.  * modification, are permitted provided that the following conditions
  23.  * are met:
  24.  * 1. Redistributions of source code must retain the above copyright
  25.  *    notice, this list of conditions and the following disclaimer.
  26.  * 2. Redistributions in binary form must reproduce the above copyright
  27.  *    notice, this list of conditions and the following disclaimer in the
  28.  *    documentation and/or other materials provided with the distribution.
  29.  * 3. All advertising materials mentioning features or use of this software
  30.  *    must display the following acknowledgement:
  31.  * This product includes software developed by the University of
  32.  * California, Berkeley and its contributors.
  33.  * 4. Neither the name of the University nor the names of its contributors
  34.  *    may be used to endorse or promote products derived from this software
  35.  *    without specific prior written permission.
  36.  *
  37.  * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
  38.  * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
  39.  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
  40.  * ARE DISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
  41.  * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
  42.  * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
  43.  * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
  44.  * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
  45.  * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
  46.  * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
  47.  * SUCH DAMAGE.
  48. INCLUDE FILE: stdio.h, stdlib.h, error.h
  49. SEE ALSO: American National Standard X3.159-1989
  50. NOMANUAL
  51. */
  52. #include "vxWorks.h"
  53. #include "stdio.h"
  54. #include "errno.h"
  55. #include "stdlib.h"
  56. #include "objLib.h"
  57. #include "private/stdioP.h"
  58. /******************************************************************************
  59. *
  60. * fclose - close a stream (ANSI)
  61. *
  62. * This routine flushes a specified stream and closes the associated file.
  63. * Any unwritten buffered data is delivered to the host environment to be
  64. * written to the file; any unread buffered data is discarded.  The stream
  65. * is disassociated from the file.  If the associated buffer was allocated
  66. * automatically, it is deallocated.
  67. * INCLUDE FILES: stdio.h 
  68. *
  69. * RETURNS:
  70. * Zero if the stream is closed successfully, or EOF if errors occur.
  71. *
  72. * ERRNO: EBADF
  73. *
  74. * SEE ALSO: fflush()
  75. */
  76. int fclose
  77.     (
  78.     FAST FILE * fp /* stream to close */
  79.     )
  80.     {
  81.     FAST int r;
  82.     if (OBJ_VERIFY (fp, fpClassId) != OK)
  83. return (EOF);
  84.     if (fp->_flags == 0) /* not open! */
  85. {
  86. errno = EBADF;
  87. return (EOF);
  88. }
  89.     r = (fp->_flags & __SWR) ? (__sflush(fp)) : (0);
  90.     if (__sclose (fp) < 0)
  91. r = EOF;
  92.     if (fp->_flags & __SMBF)
  93. free ((char *)fp->_bf._base);
  94.     if (HASUB(fp)) /* ungetc buffer? */
  95. FREEUB(fp);
  96.     if (HASLB(fp)) /* fgetline buffer? */
  97. FREELB(fp);
  98.     fp->_flags = 0; /* release this FILE for reuse */
  99.     stdioFpDestroy (fp); /* destroy the file pointer */
  100.     return (r);
  101.     }