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

VxWorks

开发平台:

C/C++

  1. /* stdio.c - internal misc. routines for 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.  *
  45.  *DESCRIPTION OF STDIO STATE VARIABLES
  46.  *
  47.  * stdio state variables.
  48.  *
  49.  * The following always hold:
  50.  *
  51.  *      if (_flags&(__SLBF|__SWR)) == (__SLBF|__SWR),
  52.  *              _lbfsize is -_bf._size, else _lbfsize is 0
  53.  *      if _flags&__SRD, _w is 0
  54.  *      if _flags&__SWR, _r is 0
  55.  *
  56.  * This ensures that the getc and putc macros (or inline functions) never
  57.  * try to write or read from a file that is in `read' or `write' mode.
  58.  * (Moreover, they can, and do, automatically switch from read mode to
  59.  * write mode, and back, on "r+" and "w+" files.)
  60.  *
  61.  * _lbfsize is used only to make the inline line-buffered output stream
  62.  * code as compact as possible.
  63.  *
  64.  * _ub, _up, and _ur are used when ungetc() pushes back more characters
  65.  * than fit in the current _bf, or when ungetc() pushes back a character
  66.  * that does not match the previous one in _bf.  When this happens,
  67.  * _ub._base becomes non-nil (i.e., a stream has ungetc() data iff
  68.  * _ub._base!=NULL) and _up and _ur save the current values of _p and _r.
  69. INCLUDE FILE: stdio.h, fcntl.h, unistd.h
  70. SEE ALSO: American National Standard X3.159-1989
  71. NOMANUAL
  72. */
  73. #include "vxWorks.h"
  74. #include "stdio.h"
  75. #include "fcntl.h"
  76. #include "unistd.h"
  77. #include "private/stdioP.h"
  78. /******************************************************************************
  79. *
  80. * __sread - internal routine
  81. * INCLUDE: stdio.h 
  82. *
  83. * RETURNS: 
  84. * NOMANUAL
  85. */
  86. int __sread
  87.     (
  88.     FAST FILE * fp,
  89.     char * buf,
  90.     int n
  91.     )
  92.     {
  93.     FAST int ret;
  94.     
  95.     ret = read (fp->_file, buf, n);
  96.     if (ret >= 0) /* if read succeeded, update current offset */
  97. fp->_offset += ret;
  98.     else
  99. fp->_flags &= ~__SOFF; /* paranoia */
  100.     return (ret);
  101.     }
  102. /******************************************************************************
  103. *
  104. * __swrite - internal routine
  105. * INCLUDE: stdio.h 
  106. *
  107. * RETURNS: 
  108. * NOMANUAL
  109. */
  110. int __swrite
  111.     (
  112.     register FILE * fp,
  113.     char const *    buf,
  114.     int             n
  115.     )
  116.     {
  117.     if (fp->_flags & __SAPP)
  118. (void) lseek (fp->_file, (off_t)0, SEEK_END);
  119.     fp->_flags &= ~__SOFF; /* in case FAPPEND mode is set */
  120.     return (write (fp->_file, CHAR_FROM_CONST(buf), n));
  121.     }
  122. /******************************************************************************
  123. *
  124. * __sseek - internal routine
  125. * INCLUDE: stdio.h 
  126. *
  127. * RETURNS: 
  128. * NOMANUAL
  129. */
  130. fpos_t __sseek
  131.     (
  132.     FAST FILE * fp,
  133.     fpos_t offset,
  134.     int whence
  135.     )
  136.     {
  137.     FAST off_t ret;
  138.     
  139.     ret = lseek (fp->_file, (off_t)offset, whence);
  140.     if (ret == -1L)
  141. fp->_flags &= ~__SOFF;
  142.     else 
  143. {
  144. fp->_flags |= __SOFF;
  145. fp->_offset = ret;
  146. }
  147.     return (ret);
  148.     }
  149. /******************************************************************************
  150. *
  151. * __sclose - internal routine
  152. * INCLUDE: stdio.h 
  153. *
  154. * RETURNS: 
  155. * NOMANUAL
  156. */
  157. int __sclose
  158.     (
  159.     FILE * fp
  160.     )
  161.     {
  162.     int result = 0;
  163.     int fd = fp->_file;
  164.     if ((fd >= 0) && (fd < 3)) /* careful of closing standard fds! */
  165. result = 0;
  166.     else if (close (fd) < 0)
  167. result = EOF;
  168.     return (result);
  169.     }