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

VxWorks

开发平台:

C/C++

  1. /* fflush.c - flush file stdio.h */
  2. /* Copyright 1992-1995 Wind River Systems, Inc. */
  3.  
  4. /*
  5. modification history
  6. --------------------
  7. 01g,05feb99,dgp  document errno values
  8. 01f,10mar95,ism  removed SPR#2548 changes.
  9. 01e,20jan95,ism  changed FIOFLUSH to FIOSYNC
  10. 01d,03oct94,ism  added FIOFLUSH ioctl to __sflush() as per SPR#2548
  11. 01c,05mar93,jdi  documentation cleanup for 5.1.
  12. 01b,20sep92,smb  documentation additions
  13. 01a,29jul92,jcf Added OBJ_VERIFY
  14.     smb taken from UCB stdio
  15. */
  16.  
  17. /*
  18. DESCRIPTION
  19.  *
  20.  * Copyright (c) 1990 The Regents of the University of California.
  21.  * All rights reserved.
  22.  *
  23.  * This code is derived from software contributed to Berkeley by
  24.  * Chris Torek.
  25.  *
  26.  * Redistribution and use in source and binary forms, with or without
  27.  * modification, are permitted provided that the following conditions
  28.  * are met:
  29.  * 1. Redistributions of source code must retain the above copyright
  30.  *    notice, this list of conditions and the following disclaimer.
  31.  * 2. Redistributions in binary form must reproduce the above copyright
  32.  *    notice, this list of conditions and the following disclaimer in the
  33.  *    documentation and/or other materials provided with the distribution.
  34.  * 3. All advertising materials mentioning features or use of this software
  35.  *    must display the following acknowledgement:
  36.  * This product includes software developed by the University of
  37.  * California, Berkeley and its contributors.
  38.  * 4. Neither the name of the University nor the names of its contributors
  39.  *    may be used to endorse or promote products derived from this software
  40.  *    without specific prior written permission.
  41.  *
  42.  * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
  43.  * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
  44.  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
  45.  * ARE DISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
  46.  * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
  47.  * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
  48.  * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
  49.  * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
  50.  * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
  51.  * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
  52.  * SUCH DAMAGE.
  53. INCLUDE FILE: stdio.h, error.h
  54. SEE ALSO: American National Standard X3.159-1989
  55. NOMANUAL
  56. */
  57. #include "vxWorks.h"
  58. #include "stdio.h"
  59. #include "errno.h"
  60. #include "objLib.h"
  61. #include "private/stdioP.h"
  62. #include "sys/ioctl.h"
  63. #include "ioLib.h"
  64. /******************************************************************************
  65. *
  66. * fflush - flush a stream (ANSI)
  67. *
  68. * This routine writes to the file any unwritten data for a specified output
  69. * or update stream for which the most recent operation was not input; for an
  70. * input stream the behavior is undefined.
  71. *
  72. * CAVEAT
  73. * ANSI specifies that if <fp> is a null pointer, fflush() performs the
  74. * flushing action on all streams for which the behavior is defined; however,
  75. * this is not implemented in VxWorks.
  76. * INCLUDE FILES: stdio.h 
  77. *
  78. * RETURNS: Zero, or EOF if a write error occurs.
  79. *
  80. * ERRNO: EBADF
  81. *
  82. * SEE ALSO: fclose()
  83. */
  84. int fflush
  85.     (
  86.     FAST FILE * fp /* stream to flush */
  87.     )
  88.     {
  89.     if (OBJ_VERIFY (fp, fpClassId) != OK)
  90. return (EOF);
  91.     /* ANSI specifies that fflush (NULL) will flush all task's file pointers.
  92.      * The problem is that we don't keep such a list today so we return EOF
  93.      * for now.
  94.      */
  95.     if ((fp == NULL) ||
  96.         ((fp->_flags & __SWR) == 0))
  97. {
  98. errno = EBADF;
  99. return (EOF);
  100. }
  101.     return (__sflush(fp));
  102.     }
  103. /******************************************************************************
  104. *
  105. * __sflush - flush stream pointed to by fp.
  106. * INCLUDE: stdio.h 
  107. *
  108. * RETURNS: ZERO or EOF
  109. * NOMANUAL
  110. */
  111. int __sflush
  112.     (
  113.     FAST FILE *fp
  114.     )
  115.     {
  116.     FAST unsigned char *p;
  117.     FAST int n;
  118.     FAST int t;
  119.     if (OBJ_VERIFY (fp, fpClassId) != OK)
  120. return (EOF);
  121.     t = fp->_flags;
  122.     if ((t & __SWR) == 0)
  123. return (0);
  124.     if ((p = fp->_bf._base) == NULL)
  125. return (0);
  126.     n = fp->_p - p; /* write this much */
  127.     /* Set these immediately to avoid problems with longjmp and to allow
  128.      * exchange buffering (via setvbuf) in user write function.
  129.      */
  130.     fp->_p = p;
  131.     fp->_w = (t & (__SLBF|__SNBF)) ? (0) : (fp->_bf._size);
  132.     for (; n > 0; n -= t, p += t) 
  133. {
  134. t = __swrite (fp, (char *)p, n);
  135. if (t <= 0) 
  136.     {
  137.     fp->_flags |= __SERR;
  138.     return (EOF);
  139.     }
  140. }
  141.     return (0);
  142.     }