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

VxWorks

开发平台:

C/C++

  1. /* fopen.c - open a file. stdio.h */
  2. /* Copyright 1992-1995 Wind River Systems, Inc. */
  3. /*
  4. modification history
  5. --------------------
  6. 01d,10feb95,jdi  doc format tweak.
  7. 01c,05mar93,jdi  documentation cleanup for 5.1.
  8. 01b,20sep92,smb  documentation additions
  9. 01a,29jul92,jcf  modified to use stdioFpCreate and close memory leaks.
  10.     smb  taken from UCB stdio.
  11. */
  12. /*
  13. DESCRIPTION
  14.  * Copyright (c) 1990 The Regents of the University of California.
  15.  * All rights reserved.
  16.  *
  17.  * This code is derived from software contributed to Berkeley by
  18.  * Chris Torek.
  19.  *
  20.  * Redistribution and use in source and binary forms, with or without
  21.  * modification, are permitted provided that the following conditions
  22.  * are met:
  23.  * 1. Redistributions of source code must retain the above copyright
  24.  *    notice, this list of conditions and the following disclaimer.
  25.  * 2. Redistributions in binary form must reproduce the above copyright
  26.  *    notice, this list of conditions and the following disclaimer in the
  27.  *    documentation and/or other materials provided with the distribution.
  28.  * 3. All advertising materials mentioning features or use of this software
  29.  *    must display the following acknowledgement:
  30.  * This product includes software developed by the University of
  31.  * California, Berkeley and its contributors.
  32.  * 4. Neither the name of the University nor the names of its contributors
  33.  *    may be used to endorse or promote products derived from this software
  34.  *    without specific prior written permission.
  35.  *
  36.  * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
  37.  * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
  38.  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
  39.  * ARE DISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
  40.  * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
  41.  * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
  42.  * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
  43.  * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
  44.  * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
  45.  * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
  46.  * SUCH DAMAGE.
  47. INCLUDE FILE: stdio.h, error.h
  48. SEE ALSO: American National Standard X3.159-1989
  49. NOMANUAL
  50. */ 
  51. #include "vxWorks.h"
  52. #include "stdio.h"
  53. #include "sys/types.h"
  54. #include "sys/stat.h"
  55. #include "ioLib.h"
  56. #include "fcntl.h"
  57. #include "errno.h"
  58. #include "private/stdioP.h"
  59. /******************************************************************************
  60. *
  61. * fopen - open a file specified by name (ANSI)
  62. *
  63. * This routine opens a file whose name is the string pointed to by <file>
  64. * and associates a stream with it.
  65. * The argument <mode> points to a string beginning with one of the following 
  66. * sequences:
  67. * .iP r "" 3
  68. * open text file for reading
  69. * .iP w
  70. * truncate to zero length or create text file for writing
  71. * .iP a
  72. * append; open or create text file for writing at end-of-file
  73. * .iP rb
  74. * open binary file for reading
  75. * .iP wb
  76. * truncate to zero length or create binary file for writing
  77. * .iP ab
  78. * append; open or create binary file for writing at end-of-file
  79. * .iP r+
  80. * open text file for update (reading and writing)
  81. * .iP w+
  82. * truncate to zero length or create text file for update.
  83. * .iP a+
  84. * append; open or create text file for update, writing at end-of-file
  85. * .iP "r+b / rb+"
  86. * open binary file for update (reading and writing)
  87. * .iP "w+b / wb+"
  88. * truncate to zero length or create binary file for update
  89. * .iP "a+b / ab+"
  90. * append; open or create binary file for update, writing at end-of-file
  91. * .LP
  92. *
  93. * Opening a file with read mode (`r' as the first character in the <mode>
  94. * argument) fails if the file does not exist or cannot be read.
  95. *
  96. * Opening a file with append mode (`a' as the first character in the <mode>
  97. * argument) causes all subsequent writes to the file to be forced to the
  98. * then current end-of-file, regardless of intervening calls to fseek().  In
  99. * some implementations, opening a binary file with append mode (`b' as the
  100. * second or third character in the <mode> argument) may initially position
  101. * the file position indicator for the stream beyond the last data written,
  102. * because of null character padding.  In VxWorks, whether append mode is
  103. * supported is device-specific.
  104. *
  105. * When a file is opened with update mode (`+' as the second or third
  106. * character in the <mode> argument), both input and output may be performed
  107. * on the associated stream.  However, output may not be directly followed by
  108. * input without an intervening call to fflush() or to a file positioning
  109. * function (fseek(), fsetpos(), or rewind()), and input may not be directly
  110. * followed by output without an intervening call to a file positioning
  111. * function, unless the input operation encounters end-of-file.  Opening (or
  112. * creating) a text file with update mode may instead open (or create) a
  113. * binary stream in some implementations.
  114. *
  115. * When opened, a stream is fully buffered if and only if it can be determined
  116. * not to refer to an interactive device.  The error and end-of-file
  117. * indicators for the stream are cleared.
  118. * INCLUDE FILES: stdio.h 
  119. *
  120. * RETURNS:
  121. * A pointer to the object controlling the stream, or a null pointer if the
  122. * operation fails.
  123. *
  124. * SEE ALSO: fdopen(), freopen()
  125. */
  126. FILE * fopen
  127.     (
  128.     const char * file, /* name of file */
  129.     const char * mode /* mode */
  130.     )
  131.     {
  132.     FAST FILE * fp;
  133.     FAST int f;
  134.     int flags;
  135.     int oflags;
  136.     if ((flags = __sflags (mode, &oflags)) == 0)
  137. return (NULL);
  138.     if ((fp = stdioFpCreate ()) == NULL)
  139. return (NULL);
  140.     if ((f = open (file, oflags, DEFFILEMODE )) < 0) 
  141. fp->_flags = 0x0; /* release */
  142.         stdioFpDestroy (fp); /* destroy file pointer */
  143. return (NULL);
  144. }
  145.     fp->_file = f;
  146.     fp->_flags = flags;
  147.     /*
  148.      * When opening in append mode, even though we use O_APPEND,
  149.      * we need to seek to the end so that ftell() gets the right
  150.      * answer.  If the user then alters the seek pointer, or
  151.      * the file extends, this will fail, but there is not much
  152.      * we can do about this.  (We could set __SAPP and check in
  153.      * fseek and ftell.)
  154.      */
  155.     if (oflags & O_APPEND)
  156. (void) __sseek ((void *)fp, (fpos_t)0, SEEK_END);
  157.     return (fp);
  158.     }