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

VxWorks

开发平台:

C/C++

  1. /* fvwrite.c - internal routine for puts function. stdio.h */
  2. /* Copyright 1992 Wind River Systems, Inc. */
  3. /*
  4. modification history
  5. --------------------
  6. 01b,20sep92,smb  documentation additions
  7. 01a,29jul92,smb  taken from UCB stdio
  8. */
  9. /*
  10. DESCRIPTION
  11.  * Copyright (c) 1990 The Regents of the University of California.
  12.  * All rights reserved.
  13.  *
  14.  * This code is derived from software contributed to Berkeley by
  15.  * Chris Torek.
  16.  *
  17.  * Redistribution and use in source and binary forms, with or without
  18.  * modification, are permitted provided that the following conditions
  19.  * are met:
  20.  * 1. Redistributions of source code must retain the above copyright
  21.  *    notice, this list of conditions and the following disclaimer.
  22.  * 2. Redistributions in binary form must reproduce the above copyright
  23.  *    notice, this list of conditions and the following disclaimer in the
  24.  *    documentation and/or other materials provided with the distribution.
  25.  * 3. All advertising materials mentioning features or use of this software
  26.  *    must display the following acknowledgement:
  27.  * This product includes software developed by the University of
  28.  * California, Berkeley and its contributors.
  29.  * 4. Neither the name of the University nor the names of its contributors
  30.  *    may be used to endorse or promote products derived from this software
  31.  *    without specific prior written permission.
  32.  *
  33.  * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
  34.  * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
  35.  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
  36.  * ARE DISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
  37.  * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
  38.  * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
  39.  * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
  40.  * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
  41.  * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
  42.  * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
  43.  * SUCH DAMAGE.
  44. INCLUDE FILE: stdio.h, string.h
  45. SEE ALSO: American National Standard X3.159-1989
  46. NOMANUAL
  47. */
  48. #include "vxWorks.h"
  49. #include "stdio.h"
  50. #include "string.h"
  51. #include "private/stdioP.h"
  52. #include "private/fvwriteP.h"
  53. #define MIN(a, b) ((a) < (b) ? (a) : (b))
  54. #define COPY(n)   (void) bcopy ((void *)p, (void *)fp->_p, (size_t)(n));
  55. #define GETIOV(extra_work)
  56.     while (len == 0) 
  57. {
  58. extra_work;
  59. p = iov->iov_base;
  60. len = iov->iov_len;
  61. iov++;
  62. }
  63. /******************************************************************************
  64. *
  65. * __sfvwrite - internal function used by the write ANSI functions.
  66. * INCLUDE: stdio.h 
  67. *
  68. * RETURNS: zero on success, EOF on error
  69. * NOMANUAL
  70. */
  71. int __sfvwrite
  72.     (
  73.     FAST FILE *  fp,
  74.     FAST struct __suio * uio
  75.     )
  76.     {
  77.     FAST size_t  len;
  78.     FAST char *  p;
  79.     FAST struct __siov * iov;
  80.     FAST int  w;
  81.     FAST int  s;
  82.     char *  nl;
  83.     int  nlknown;
  84.     int  nldist;
  85.     if ((len = uio->uio_resid) == 0)
  86. return (0);
  87.     if (cantwrite (fp)) /* make sure we can write */
  88. return (EOF);
  89.     iov = uio->uio_iov;
  90.     p = iov->iov_base;
  91.     len = iov->iov_len;
  92.     iov++;
  93.     if (fp->_flags & __SNBF) 
  94. {
  95. /* Unbuffered: write up to BUFSIZ bytes at a time */
  96. do 
  97.     {
  98.     GETIOV(;);
  99.     w = __swrite (fp, p, MIN(len, BUFSIZ));
  100.     if (w <= 0)
  101. goto err;
  102.     p += w;
  103.     len -= w;
  104.     } while ((uio->uio_resid -= w) != 0);
  105.     else if ((fp->_flags & __SLBF) == 0) 
  106. {
  107. /*
  108.  * Fully buffered: fill partially full buffer, if any,
  109.  * and then flush.  If there is no partial buffer, write
  110.  * one _bf._size byte chunk directly (without copying).
  111.  *
  112.  * String output is a special case: write as many bytes
  113.  * as fit, but pretend we wrote everything.  This makes
  114.  * snprintf() return the number of bytes needed, rather
  115.  * than the number used, and avoids its write function
  116.  * (so that the write function can be invalid).
  117.  */
  118. do 
  119.     {
  120.     GETIOV(;);
  121.     w = fp->_w;
  122.     if (fp->_flags & __SSTR) 
  123. {
  124. if (len < w)
  125.     w = len;
  126. COPY(w); /* copy MIN(fp->_w,len), */
  127. fp->_w -= w;
  128. fp->_p += w;
  129. w = len; /* but pretend copied all */
  130. }
  131.     else if (fp->_p > fp->_bf._base && len > w) 
  132. {
  133. COPY(w); /* fill */
  134. fp->_p += w; /* fp->_w -= w; unneeded */
  135. if (fflush(fp)) /* flush */
  136.     goto err;
  137. }
  138.     else if (len >= (w = fp->_bf._size)) 
  139. {
  140. w = __swrite (fp, p, w); /* write directly */
  141. if (w <= 0)
  142.     goto err;
  143. }
  144.     else 
  145. {
  146. w = len;
  147. COPY(w); /* fill and done */
  148. fp->_w -= w;
  149. fp->_p += w;
  150. }
  151.     p += w;
  152.     len -= w;
  153.     } while ((uio->uio_resid -= w) != 0);
  154. }
  155.     else 
  156. {
  157. /*
  158.  * Line buffered: like fully buffered, but we
  159.  * must check for newlines.  Compute the distance
  160.  * to the first newline (including the newline),
  161.  * or `infinity' if there is none, then pretend
  162.  * that the amount to write is MIN(len,nldist).
  163.  */
  164. nlknown = 0;
  165. nldist = 0;
  166. do 
  167.     {
  168.     GETIOV(nlknown = 0);
  169.     if (!nlknown) 
  170. {
  171. nl = memchr ((void *)p, 'n', len);
  172. nldist = (nl) ? (nl + 1 - p) : (len + 1);
  173. nlknown = 1;
  174. }
  175.     s = MIN(len, nldist);
  176.     w = fp->_w + fp->_bf._size;
  177.     if (fp->_p > fp->_bf._base && s > w) 
  178. {
  179. COPY(w);
  180. fp->_p += w; /* fp->_w -= w; unneeded */
  181. if (fflush (fp))
  182.     goto err;
  183. }
  184.     else if (s >= (w = fp->_bf._size)) 
  185. {
  186. w = __swrite (fp, p, w);
  187. if (w <= 0)
  188.     goto err;
  189. }
  190.     else 
  191. {
  192. w = s;
  193. COPY(w);
  194. fp->_w -= w;
  195. fp->_p += w;
  196. }
  197.     if ((nldist -= w) == 0) 
  198. {
  199. if (fflush (fp)) /* copied newline: flush and forget */
  200.     goto err;
  201. nlknown = 0;
  202. }
  203.     p += w;
  204.     len -= w;
  205.     } while ((uio->uio_resid -= w) != 0);
  206. }
  207.     return (0);
  208. err:
  209.     fp->_flags |= __SERR;
  210.     return (EOF);
  211.     }