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

VxWorks

开发平台:

C/C++

  1. /* fprintf.c - print to a file. stdio.h */
  2. /* Copyright 1992-1995 Wind River Systems, Inc. */
  3. /*
  4. modification history
  5. --------------------
  6. 01e,24jan95,rhp  doc: avoid 'L' in fprintf(), no long doubles 
  7.                  in VxWorks (see SPR#3886)
  8. 01d,19jul94,dvs  doc tweak (SPR #2512).
  9. 01c,05mar93,jdi  documentation cleanup for 5.1.
  10. 01b,20sep92,smb  documentation additions
  11. 01a,29jul92,jcf  Added OBJ_VERIFY
  12.     smb  taken from UCB stdio
  13. */
  14. /*
  15. DESCRIPTION
  16.  * Copyright (c) 1990 The Regents of the University of California.
  17.  * All rights reserved.
  18.  *
  19.  * This code is derived from software contributed to Berkeley by
  20.  * Chris Torek.
  21.  *
  22.  * Redistribution and use in source and binary forms, with or without
  23.  * modification, are permitted provided that the following conditions
  24.  * are met:
  25.  * 1. Redistributions of source code must retain the above copyright
  26.  *    notice, this list of conditions and the following disclaimer.
  27.  * 2. Redistributions in binary form must reproduce the above copyright
  28.  *    notice, this list of conditions and the following disclaimer in the
  29.  *    documentation and/or other materials provided with the distribution.
  30.  * 3. All advertising materials mentioning features or use of this software
  31.  *    must display the following acknowledgement:
  32.  * This product includes software developed by the University of
  33.  * California, Berkeley and its contributors.
  34.  * 4. Neither the name of the University nor the names of its contributors
  35.  *    may be used to endorse or promote products derived from this software
  36.  *    without specific prior written permission.
  37.  *
  38.  * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
  39.  * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
  40.  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
  41.  * ARE DISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
  42.  * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
  43.  * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
  44.  * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
  45.  * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
  46.  * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
  47.  * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
  48.  * SUCH DAMAGE.
  49. INCLUDE FILE: stdio.h, stdarg.h
  50. SEE ALSO: American National Standard X3.159-1989
  51. NOMANUAL
  52. */
  53. #include "vxWorks.h"
  54. #include "stdarg.h"
  55. #include "fioLib.h"
  56. #include "objLib.h"
  57. #include "private/stdioP.h"
  58. /******************************************************************************
  59. *
  60. * fprintf - write a formatted string to a stream (ANSI)
  61. *
  62. * This routine writes output to a specified stream under control of the string
  63. * <fmt>. The string <fmt> contains ordinary characters, which are written
  64. * unchanged, plus conversion specifications, which cause the arguments that
  65. * follow <fmt> to be converted and printed as part of the formatted string.
  66. *
  67. * The number of arguments for the format is arbitrary, but they must
  68. * correspond to the conversion specifications in <fmt>.  If there are
  69. * insufficient arguments, the behavior is undefined.  If the format is
  70. * exhausted while arguments remain, the excess arguments are evaluated but
  71. * otherwise ignored.  The routine returns when the end of the format string
  72. * is encountered.
  73. *
  74. * The format is a multibyte character sequence, beginning and ending in its
  75. * initial shift state.  The format is composed of zero or more directives:
  76. * ordinary multibyte characters (not `%') that are copied unchanged to the
  77. * output stream; and conversion specification, each of which results in
  78. * fetching zero or more subsequent arguments.  Each conversion specification
  79. * is introduced by the `%' character.  After the `%', the following appear in
  80. * sequence:
  81. * .iP "" 4
  82. * Zero or more flags (in any order) that modify the meaning of the 
  83. * conversion specification.
  84. * .iP
  85. * An optional minimum field width.  If the converted value has fewer
  86. * characters than the field width, it will be padded with spaces (by
  87. * default) on the left (or right, if the left adjustment flag, 
  88. * described later, has been given) to the field width. The field
  89. * width takes the form of an asterisk (`*') (described later) or a decimal
  90. * integer.
  91. * .iP
  92. * An optional precision that gives the minimum number of digits to
  93. * appear for the `d', `i', `o', `u', `x', and `X' conversions, the number of 
  94. * digits to appear after the decimal-point character for `e', `E', and `f'
  95. * conversions, the maximum number of significant digits for the `g' and
  96. * `G' conversions, or the maximum number of characters to be written 
  97. * from a string in the `s' conversion.  The precision takes the form of a 
  98. * period (`.') followed either by an asterisk (`*') (described later) or by
  99. * an optional decimal integer; if only the period is specified, the 
  100. * precision is taken as zero.  If a precision appears with any other
  101. * conversion specifier, the behavior is undefined.
  102. * .iP
  103. * An optional `h' specifying that a following `d', `i', `o', `u', `x', and
  104. * `X' conversion specifier applies to a `short int' or `unsigned short int'
  105. * argument (the argument will have been promoted according to the integral
  106. * promotions, and its value converted to `short int' or
  107. * `unsigned short int' before printing); an optional `h' specifying that a
  108. * following `n' conversion specifier applies to a pointer to a `short int'
  109. * argument; an optional `l' (el) specifying that a following `d', `i', `o',
  110. * `u', `x', and `X' conversion specifier applies to a `long int' or
  111. * `unsigned long int' argument; or an optional `l' specifying that a following
  112. * `n' conversion specifier applies to a pointer to a `long int'
  113. * argument.  If an `h' or `l' appears with any other conversion
  114. * specifier, the behavior is undefined.
  115. *
  116. * &WARNING: ANSI C also specifies an optional `L' in some of the same
  117. * contexts as `l' above, corresponding to a `long double' argument.
  118. * However, the current release of the VxWorks libraries does not support 
  119. * `long double' data; using the optional `L' gives unpredictable results.
  120. * .iP
  121. * A character that specifies the type of conversion to be applied.
  122. * .LP
  123. *
  124. * As noted above, a field width, or precision, or both, can be indicated by
  125. * an asterisk (`*').  In this case, an `int' argument supplies the field width
  126. * or precision.  The arguments specifying field width, or precision, or both,
  127. * should appear (in that order) before the argument (if any) to be converted.
  128. * A negative field width argument is taken as a `-' flag followed by a positive
  129. * field width.  A negative precision argument is taken as if the precision
  130. * were omitted.
  131. *
  132. * The flag characters and their meanings are:
  133. * .iP `-'
  134. * The result of the conversion will be left-justified within the field.
  135. * (it will be right-justified if this flag is not specified.)
  136. * .iP `+'
  137. * The result of a signed conversion will always begin with a plus or 
  138. * minus sign.  (It will begin with a sign only when a negative value
  139. * is converted if this flag is not specified.)
  140. * .iP `space'
  141. * If the first character of a signed conversion is not a sign, or 
  142. * if a signed conversion results in no characters, a space will be 
  143. * prefixed to the result.  If the `space' and `+' flags both appear, the
  144. * `space' flag will be ignored.
  145. * .iP `#'
  146. * The result is to be converted to an "alternate form."  For `o' conversion
  147. * it increases the precision to force the first digit of the result to be a
  148. * zero.  For `x' (or `X') conversion, a non-zero result will have "0x" (or
  149. * "0X") prefixed to it.  For `e', `E', `f', `g', and `G' conversions, the
  150. * result will always contain a decimal-point character, even if no digits
  151. * follow it.  (Normally, a decimal-point character appears in the result of
  152. * these conversions only if no digit follows it).  For `g' and `G'
  153. * conversions, trailing zeros will not be removed from the result.  For
  154. * other conversions, the behavior is undefined.
  155. * .iP `0'
  156. * For `d', `i', `o', `u', `x', `X', `e', `E', `f', `g', and `G' conversions,
  157. * leading zeros (following any indication of sign or base) are used to pad
  158. * to the field width; no space padding is performed.  If the `0' and `-'
  159. * flags both appear, the `0' flag will be ignored.  For `d', `i', `o', `u',
  160. * `x', and `X' conversions, if a precision is specified, the `0' flag will
  161. * be ignored.  For other conversions, the behavior is undefined.
  162. * .LP
  163. *
  164. * The conversion specifiers and their meanings are:
  165. * .iP "`d', `i'"
  166. * The `int' argument is converted to signed decimal in the style
  167. * `[-]dddd'.  The precision specifies the minimum number of digits 
  168. * to appear; if the value being converted can be represented in
  169. * fewer digits, it will be expanded with leading zeros.  The
  170. * default precision is 1.  The result of converting a zero value
  171. * with a precision of zero is no characters.
  172. * .iP "`o', `u', `x', `X'"
  173. * The `unsigned int' argument is converted to unsigned octal (`o'),
  174. * unsigned decimal (`u'), or unsigned hexadecimal notation (`x' or `X')
  175. * in the style `dddd'; the letters abcdef are used for `x' conversion
  176. * and the letters ABCDEF for `X' conversion.  The precision specifies
  177. * the minimum number of digits to appear; if the value being 
  178. * converted can be represented in fewer digits, it will be 
  179. * expanded with leading zeros.  The default precision is 1.  The
  180. * result of converting a zero value with a precision of zero is 
  181. * no characters.
  182. * .iP `f'
  183. * The `double' argument is converted to decimal notation in the 
  184. * style `[-]ddd.ddd', where the number of digits after the decimal
  185. * point character is equal to the precision specification.  If the
  186. * precision is missing, it is taken as 6; if the precision is zero
  187. * and the `#' flag is not specified, no decimal-point character
  188. * appears.  If a decimal-point character appears, at least one 
  189. * digit appears before it.  The value is rounded to the appropriate
  190. * number of digits.
  191. * .iP "`e', `E'"
  192. * The `double' argument is converted in the style `[-]d.ddde+/-dd',
  193. * where there is one digit before the decimal-point character 
  194. * (which is non-zero if the argument is non-zero) and the number
  195. * of digits after it is equal to the precision; if the precision
  196. * is missing, it is taken as 6; if the precision is zero and the 
  197. * `#' flag is not specified, no decimal-point character appears.  The
  198. * value is rounded to the appropriate number of digits.  The `E'
  199. * conversion specifier will produce a number with `E' instead of `e'
  200. * introducing the exponent.  The exponent always contains at least
  201. * two digits.  If the value is zero, the exponent is zero.
  202. * .iP "`g', `G'"
  203. * The `double' argument is converted in style `f' or `e' (or in style 
  204. * `E' in the case of a `G' conversion specifier), with the precision
  205. * specifying the number of significant digits.  If the precision
  206. * is zero, it is taken as 1.  The style used depends on the 
  207. * value converted; style `e' (or `E') will be used only if the 
  208. * exponent resulting from such a conversion is less than -4 or 
  209. * greater than or equal to the precision.  Trailing zeros are
  210. * removed from the fractional portion of the result; a decimal-point
  211. * character appears only if it is followed by a digit.
  212. * .iP `c'
  213. * The `int' argument is converted to an `unsigned char', and the 
  214. * resulting character is written.
  215. * .iP `s'
  216. * The argument should be a pointer to an array of character type.
  217. * Characters from the array are written up to (but not including)
  218. * a terminating null character; if the precision is specified,
  219. * no more than that many characters are written.  If the precision
  220. * is not specified or is greater than the size of the array, the
  221. * array will contain a null character.
  222. * .iP `p'
  223. * The argument should be a pointer to `void'.  The value of the 
  224. * pointer is converted to a sequence of printable characters,
  225. * in hexadecimal representation (prefixed with "0x").
  226. * .iP `n'
  227. * The argument should be a pointer to an integer into which
  228. * the number of characters written to the output stream
  229. * so far by this call to fprintf() is written.  No argument is converted.
  230. * .iP `%'
  231. * A `%' is written.  No argument is converted.  The complete
  232. * conversion specification is %%.
  233. * .LP
  234. *
  235. * If a conversion specification is invalid, the behavior is undefined.
  236. *
  237. * If any argument is, or points to, a union or an aggregate (except for an 
  238. * array of character type using `s' conversion, or a pointer using `p' 
  239. * conversion), the behavior is undefined.
  240. *
  241. * In no case does a non-existent or small field width cause truncation of a
  242. * field if the result of a conversion is wider than the field width, the
  243. * field is expanded to contain the conversion result.
  244. *
  245. * INCLUDE FILES: stdio.h 
  246. *
  247. * RETURNS:
  248. * The number of characters written, or a negative value if an
  249. * output error occurs.
  250. *
  251. * SEE ALSO: printf()
  252. */
  253. int fprintf
  254.     (
  255.     FILE *   fp, /* stream to write to */
  256.     const char *  fmt, /* format string */
  257.     ... /* optional arguments to format string */
  258.     )
  259.     {
  260.     int   ret;
  261.     va_list   vaList;
  262.     if (OBJ_VERIFY (fp, fpClassId) != OK)
  263. return (ERROR);
  264.     va_start (vaList, fmt);
  265.     ret = vfprintf (fp, fmt, vaList);
  266.     va_end (vaList);
  267.     return (ret);
  268.     }