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

VxWorks

开发平台:

C/C++

  1. /* fscanf.c - scan a file. stdio.h */
  2. /* Copyright 1992-1995 Wind River Systems, Inc. */
  3. /*
  4. modification history
  5. --------------------
  6. 01d,24jan95,rhp  doc: avoid 'L' in fscanf(), no long doubles 
  7.                  in VxWorks (see SPR#3886)
  8. 01c,05mar93,jdi  documentation cleanup for 5.1.
  9. 01b,20sep92,smb  documentation additions
  10. 01a,29jul92,jcf  Added OBJ_VERIFY
  11.    +smb  taken from UCB stdio
  12. */
  13. /*
  14. DESCRIPTION
  15.  * Copyright (c) 1990 The Regents of the University of California.
  16.  * All rights reserved.
  17.  *
  18.  * This code is derived from software contributed to Berkeley by
  19.  * Chris Torek.
  20.  *
  21.  * Redistribution and use in source and binary forms, with or without
  22.  * modification, are permitted provided that the following conditions
  23.  * are met:
  24.  * 1. Redistributions of source code must retain the above copyright
  25.  *    notice, this list of conditions and the following disclaimer.
  26.  * 2. Redistributions in binary form must reproduce the above copyright
  27.  *    notice, this list of conditions and the following disclaimer in the
  28.  *    documentation and/or other materials provided with the distribution.
  29.  * 3. All advertising materials mentioning features or use of this software
  30.  *    must display the following acknowledgement:
  31.  * This product includes software developed by the University of
  32.  * California, Berkeley and its contributors.
  33.  * 4. Neither the name of the University nor the names of its contributors
  34.  *    may be used to endorse or promote products derived from this software
  35.  *    without specific prior written permission.
  36.  *
  37.  * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
  38.  * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
  39.  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
  40.  * ARE DISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
  41.  * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
  42.  * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
  43.  * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
  44.  * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
  45.  * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
  46.  * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
  47.  * SUCH DAMAGE.
  48. INCLUDE FILE: stdio.h, stdarg.h
  49. SEE ALSO: American National Standard X3.159-1989
  50. NOMANUAL
  51. */
  52. #include "vxWorks.h"
  53. #include "fioLib.h"
  54. #include "stdarg.h"
  55. #include "objLib.h"
  56. #include "private/stdioP.h"
  57. /******************************************************************************
  58. *
  59. * fscanf - read and convert characters from a stream (ANSI)
  60. * This routine reads characters from a specified stream, and interprets them
  61. * according to format specifications in the string <fmt>, which specifies
  62. * the admissible input sequences and how they are to be converted for
  63. * assignment, using subsequent arguments as pointers to the objects to
  64. * receive the converted input.
  65. *
  66. * If there are insufficient arguments for the format, the behavior is
  67. * undefined.  If the format is exhausted while arguments remain, the excess
  68. * arguments are evaluated but are otherwise ignored.
  69. *
  70. * The format is a multibyte character sequence, beginning and ending in
  71. * its initial shift state.  The format is composed of zero or more directives:
  72. * one or more white-space characters; an ordinary multibyte character (neither
  73. * `%' nor a white-space character); or a conversion specification.  Each
  74. * conversion specification is introduced by the `%' character.  After the `%',
  75. * the following appear in sequence:
  76. *
  77. * .iP "" 4
  78. * An optional assignment-suppressing character `*'.
  79. * .iP
  80. * An optional non-zero decimal integer that specifies the maximum field 
  81. * width.
  82. * .iP
  83. * An optional `h' or `l' (el) indicating the size of the receiving 
  84. * object.  The conversion specifiers `d', `i', and `n' should be preceded by
  85. * `h' if the corresponding argument is a pointer to `short int' rather
  86. * than a pointer to `int', or by `l' if it is a pointer to `long int'.
  87. * Similarly, the conversion specifiers `o', `u', and `x' shall be preceded
  88. * by `h' if the corresponding argument is a pointer to `unsigned short int'
  89. * rather than a pointer to `unsigned int', or by `l' if it is a pointer to
  90. * `unsigned long int'.  Finally, the conversion specifiers `e', `f', and `g' 
  91. * shall be preceded by `l' if the corresponding argument is a pointer to
  92. * `double' rather than a pointer to `float'.  If an `h' or `l' appears
  93. * with any other conversion specifier, the behavior is undefined.
  94. *
  95. * &WARNING: ANSI C also specifies an optional `L' in some of the same
  96. * contexts as `l' above, corresponding to a `long double *' argument.
  97. * However, the current release of the VxWorks libraries does not support 
  98. * `long double' data; using the optional `L' gives unpredictable results.
  99. * .iP
  100. * A character that specifies the type of conversion to be applied.  The
  101. * valid conversion specifiers are described below.
  102. * .LP
  103. *
  104. * The fscanf() routine executes each directive of the format in turn.  If a 
  105. * directive fails, as detailed below, fscanf() returns.  Failures
  106. * are described as input failures (due to the unavailability of input
  107. * characters), or matching failures (due to inappropriate input).
  108. * A directive composed of white-space character(s) is executed by reading
  109. * input up to the first non-white-space character (which remains unread),
  110. * or until no more characters can be read.
  111. *
  112. * A directive that is an ordinary multibyte character is executed by reading
  113. * the next characters of the stream.  If one of the characters differs from
  114. * one comprising the directive, the directive fails, and the differing and
  115. * subsequent characters remain unread.
  116. *
  117. * A directive that is a conversion specification defines a set of matching
  118. * input sequences, as described below for each specifier.  A conversion
  119. * specification is executed in the following steps:
  120. *
  121. * Input white-space characters (as specified by the isspace() function) are 
  122. * skipped, unless the specification includes a `[', `c', or `n' specifier.
  123. *
  124. * An input item is read from the stream, unless the specification includes
  125. * an `n' specifier.  An input item is defined as the longest matching
  126. * sequence of input characters, unless that exceeds a specified field width,
  127. * in which case it is the initial subsequence of that length in the
  128. * sequence.  The first character, if any, after the input item remains
  129. * unread.  If the length of the input item is zero, the execution of the
  130. * directive fails:  this condition is a matching failure, unless an error
  131. * prevented input from the stream, in which case it is an input failure.
  132. *
  133. * Except in the case of a `%' specifier, the input item is converted to a
  134. * type appropriate to the conversion specifier.  If the input item is not a
  135. * matching sequence, the execution of the directive fails:  this condition
  136. * is a matching failure.  Unless assignment suppression was indicated by a
  137. * `*', the result of the conversion is placed in the object pointed to by
  138. * the first argument following the <fmt> argument that has not already
  139. * received a conversion result.  If this object does not have an appropriate
  140. * type, or if the result of the conversion cannot be represented in the
  141. * space provided, the behavior is undefined.
  142. *
  143. * The following conversion specifiers are valid:
  144. *
  145. * .iP `d'
  146. * Matches an optionally signed decimal integer whose format is
  147. * the same as expected for the subject sequence of the strtol()
  148. * function with the value 10 for the <base> argument.  The 
  149. * corresponding argument should be a pointer to `int'.
  150. * .iP `i'
  151. * Matches an optionally signed integer, whose format is the
  152. * same as expected for the subject sequence of the strtol()
  153. * function with the value 0 for the <base> argument.  The 
  154. * corresponding argument should be a pointer to `int'.
  155. * .iP `o'
  156. * Matches an optionally signed octal integer, whose format is the
  157. * same as expected for the subject sequence of the strtoul()
  158. * function with the value 8 for the <base> argument.  The
  159. * corresponding argument should be a pointer to `unsigned int'.
  160. * .iP `u'
  161. * Matches an optionally signed decimal integer, whose format is 
  162. * the same as expected for the subject sequence of the strtoul()
  163. * function with the value 10 for the <base> argument.  The
  164. * corresponding argument should be a pointer to `unsigned int'.
  165. * .iP `x'
  166. * Matches an optionally signed hexadecimal integer, whose format is
  167. * the same as expected for the subject sequence of the strtoul()
  168. * function with the value 16 for the <base> argument.  The
  169. * corresponding argument should be a pointer to `unsigned int'.
  170. * .iP "`e', `f', `g'"
  171. * Match an optionally signed floating-point number, whose format
  172. * is the same as expected for the subject string of the strtod()
  173. * function.  The corresponding argument should be a pointer to `float'.
  174. * .iP `s'
  175. * Matches a sequence of non-white-space characters.  The 
  176. * corresponding argument should be a pointer to the initial
  177. * character of an array large enough to accept the sequence
  178. * and a terminating null character, which will be added 
  179. * automatically.
  180. * .iP `['
  181. * Matches a non-empty sequence of characters from a set of 
  182. * expected characters (the `scanset').  The corresponding argument
  183. * should be a pointer to the initial character of an array large
  184. * enough to accept the sequence and a terminating null character,
  185. * which is added automatically.  The conversion specifier
  186. * includes all subsequent character in the format string, up to
  187. * and including the matching right bracket (`]').  The characters
  188. * between the brackets (the `scanlist') comprise the scanset,
  189. * unless the character after the left bracket is a circumflex (`^')
  190. * in which case the scanset contains all characters that do not
  191. * appear in the scanlist between the circumflex and the right
  192. * bracket.  If the conversion specifier begins with "[]" or "[^]", the
  193. * right bracket character is in the scanlist and the next 
  194. * right bracket character is the matching right bracket that ends
  195. * the specification; otherwise the first right bracket character
  196. * is the one that ends the specification.
  197. * .iP `c'
  198. * Matches a sequence of characters of the number specified by the
  199. * field width (1 if no field width is present in the directive).
  200. * The corresponding argument should be a pointer to the initial 
  201. * character of an array large enough to accept the sequence.
  202. * No null character is added.
  203. * .iP `p'
  204. * Matches an implementation-defined set of sequences, which should be
  205. * the same as the set of sequences that may be produced by the %p
  206. * conversion of the fprintf() function.  The corresponding argument
  207. * should be a pointer to a pointer to `void'.  VxWorks defines its
  208. * pointer input field to be consistent with pointers written by the
  209. * fprintf() function ("0x" hexadecimal notation).  If the input item is
  210. * a value converted earlier during the same program execution, the
  211. * pointer that results should compare equal to that value; otherwise
  212. * the behavior of the %p conversion is undefined.
  213. * .iP `n'
  214. * No input is consumed.  The corresponding argument should be a pointer to
  215. * `int' into which the number of characters read from the input stream so
  216. * far by this call to fscanf() is written.  Execution of a %n directive does
  217. * not increment the assignment count returned when fscanf() completes
  218. * execution.
  219. * .iP `%'
  220. * Matches a single `%'; no conversion or assignment occurs.  The
  221. * complete conversion specification is %%.
  222. * .LP
  223. *
  224. * If a conversion specification is invalid, the behavior is undefined.
  225. *
  226. * The conversion specifiers `E', `G', and `X' are also valid and behave the
  227. * same as `e', `g', and `x', respectively.
  228. *
  229. * If end-of-file is encountered during input, conversion is terminated.  If 
  230. * end-of-file occurs before any characters matching the current directive
  231. * have been read (other than leading white space, where permitted), execution
  232. * of the current directive terminates with an input failure; otherwise, unless
  233. * execution of the current directive is terminated with a matching failure,
  234. * execution of the following directive (if any) is terminated with an input
  235. * failure.
  236. *
  237. * If conversion terminates on a conflicting input character, the offending
  238. * input character is left unread in the input stream.  Trailing white space
  239. * (including new-line characters) is left unread unless matched by a
  240. * directive.  The success of literal matches and suppressed assignments is
  241. * not directly determinable other than via the %n directive.
  242. *
  243. * INCLUDE FILES: stdio.h 
  244. *
  245. * RETURNS:
  246. * The number of input items assigned, which can be fewer than provided for,
  247. * or even zero, in the event of an early matching failure; or EOF if an
  248. * input failure occurs before any conversion.
  249. *
  250. * SEE ALSO: scanf(), sscanf()
  251. */
  252. int fscanf
  253.     (
  254.     FILE *   fp, /* stream to read from */
  255.     char const *  fmt, /* format string */
  256.     ... /* arguments to format string */
  257.     ) 
  258.     {
  259.     int     nArgs;
  260.     int     unget;
  261.     va_list vaList; /* vararg list */
  262.     if (OBJ_VERIFY (fp, fpClassId) != OK)
  263. return (EOF);
  264.     va_start (vaList, fmt);
  265.     nArgs = fioScanV (fmt, fgetc, (int) fp, &unget, vaList);
  266.     va_end (vaList);
  267.     if (unget != -1)
  268. ungetc (unget, fp);
  269.     return (nArgs);
  270.     }