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

VxWorks

开发平台:

C/C++

  1. /* setvbuf.c - set buffered mode. stdio.h */
  2. /* Copyright 1992-1993 Wind River Systems, Inc. */
  3. /*
  4. modification history
  5. --------------------
  6. 01c,05mar93,jdi  documentation cleanup for 5.1.
  7. 01b,20sep92,smb  documentation additions
  8. 01a,29jul92,jcf  Added OBJ_VERIFY
  9.    +smb  taken from UCB stdio
  10. */
  11. /*
  12. DESCRIPTION
  13.  * Copyright (c) 1990 The Regents of the University of California.
  14.  * All rights reserved.
  15.  *
  16.  * This code is derived from software contributed to Berkeley by
  17.  * Chris Torek.
  18.  *
  19.  * Redistribution and use in source and binary forms, with or without
  20.  * modification, are permitted provided that the following conditions
  21.  * are met:
  22.  * 1. Redistributions of source code must retain the above copyright
  23.  *    notice, this list of conditions and the following disclaimer.
  24.  * 2. Redistributions in binary form must reproduce the above copyright
  25.  *    notice, this list of conditions and the following disclaimer in the
  26.  *    documentation and/or other materials provided with the distribution.
  27.  * 3. All advertising materials mentioning features or use of this software
  28.  *    must display the following acknowledgement:
  29.  * This product includes software developed by the University of
  30.  * California, Berkeley and its contributors.
  31.  * 4. Neither the name of the University nor the names of its contributors
  32.  *    may be used to endorse or promote products derived from this software
  33.  *    without specific prior written permission.
  34.  *
  35.  * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
  36.  * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
  37.  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
  38.  * ARE DISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
  39.  * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
  40.  * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
  41.  * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
  42.  * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
  43.  * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
  44.  * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
  45.  * SUCH DAMAGE.
  46. INCLUDE FILE: stdio.h, stdlib.h
  47. SEE ALSO: American National Standard X3.159-1989
  48. NOMANUAL
  49. */
  50. #include "vxWorks.h"
  51. #include "stdio.h"
  52. #include "stdlib.h"
  53. #include "objLib.h"
  54. #include "private/stdioP.h"
  55. /******************************************************************************
  56. *
  57. * setvbuf - specify buffering for a stream (ANSI)
  58. *
  59. * This routine sets the buffer size and buffering mode for a specified
  60. * stream.  It should be called only after the stream has been associated
  61. * with an open file and before any other operation is performed on the
  62. * stream.  The argument <mode> determines how the stream will be buffered,
  63. * as follows:
  64. * .iP _IOFBF 12
  65. * input/output is to be fully buffered.
  66. * .iP _IOLBF
  67. * input/output is to be line buffered.
  68. * .iP _IONBF
  69. * input/output is to be unbuffered. 
  70. * .LP
  71. *
  72. * If <buf> is not a null pointer, the array it points to may be used instead
  73. * of a buffer allocated by setvbuf().  The argument <size> specifies
  74. * the size of the array.  The contents of the array at any time are 
  75. * indeterminate.
  76. * INCLUDE FILES: stdio.h 
  77. *
  78. * RETURNS:
  79. * Zero, or non-zero if <mode> is invalid or the request cannot be honored.
  80. */
  81. int setvbuf
  82.     (
  83.     FAST FILE *  fp, /* stream to set buffering for */
  84.     char *  buf, /* buffer to use (optional) */
  85.     FAST int  mode, /* _IOFBF = fully buffered */
  86. /* _IOLBF = line buffered */
  87. /* _IONBF = unbuffered */
  88.     FAST size_t  size /* buffer size */
  89.     )
  90.     {
  91.     if (OBJ_VERIFY (fp, fpClassId) != OK)
  92. return (ERROR);
  93.     /*
  94.      * Verify arguments.  The `int' limit on `size' is due to this
  95.      * particular implementation.
  96.      */
  97.     if (((mode != _IOFBF) && (mode != _IOLBF) && (mode != _IONBF)) ||
  98. ((int)size < 0))
  99. return (EOF);
  100.     /*
  101.      * Write current buffer, if any; drop read count, if any.
  102.      * Make sure putc() will not think fp is line buffered.
  103.      * Free old buffer if it was from malloc().  Clear line and
  104.      * non buffer flags, and clear malloc flag.
  105.      */
  106.     (void) __sflush (fp);
  107.     fp->_r  = 0;
  108.     fp->_lbfsize = 0;
  109.     if (fp->_flags & __SMBF)
  110. free ((void *)fp->_bf._base);
  111.     fp->_flags &= ~(__SLBF | __SNBF | __SMBF);
  112.     /*
  113.      * Now put back whichever flag is needed, and fix _lbfsize
  114.      * if line buffered.  Ensure output flush on exit if the
  115.      * stream will be buffered at all.
  116.      */
  117.     switch (mode) 
  118. {
  119. case _IONBF:
  120. fp->_flags |= __SNBF;
  121. fp->_bf._base  = fp->_p = fp->_nbuf;
  122. fp->_bf._size  = 1;
  123. break;
  124. case _IOLBF:
  125. fp->_flags  |= __SLBF;
  126. fp->_lbfsize  = -size;
  127. /* FALLTHROUGH */
  128. case _IOFBF:
  129. /* no flag */
  130. fp->_bf._base = fp->_p = (unsigned char *)buf;
  131. fp->_bf._size = size;
  132. break;
  133. default:
  134. break;
  135. }
  136.     /*
  137.      * Patch up write count if necessary.
  138.      */
  139.     if (fp->_flags & __SWR)
  140. fp->_w = (fp->_flags & (__SLBF | __SNBF)) ? (0) : (size);
  141.     return (0);
  142.     }