fix html escape
[c-standard] / n1256.html
index 7235654..30198be 100644 (file)
-<html><head><title>WG14/N1256                Committee Draft -- Septermber 7, 2007                   ISO/IEC 9899:TC3</title></head><body><pre>
+<html><head><title>WG14/N1256   Septermber 7, 2007  ISO/IEC 9899:TC3</title></head><body>
+<pre><!--page 1 -->
 WG14/N1256                Committee Draft -- Septermber 7, 2007                   ISO/IEC 9899:TC3
 
 
-<a name="Contents" href="#Contents">Contents</a>
-<a href="#Foreword">Foreword       . . . . . . . . . . . . . . . . . . . . . . . . . . . . .                                   xi</a>
-<a href="#Introduction">Introduction     . . . . . . . . . . . . . . . . . . . . . . . . . . . .                                  xiv</a>
-<a href="#1">1. Scope       . . . . . . . . . . . . . . . . . . . . . . . . . . . . .                                    1</a>
-<a href="#2">2. Normative references      . . . . . . . . . . . . . . . . . . . . . . .                                  2</a>
-<a href="#3">3. Terms, definitions, and symbols     . . . . . . . . . . . . . . . . . . .                                 3</a>
-<a href="#4">4. Conformance       . . . . . . . . . . . . . . . . . . . . . . . . . .                                    7</a>
-<a href="#5">5. Environment    . . . . . . . . . . .        . .   .   .   .   .   .   .   .    .   .   .   .   .   .    9</a>
-<a href="#5.1">   5.1 Conceptual models      . . . . . .      . .   .   .   .   .   .   .   .    .   .   .   .   .   .    9</a>
-<a href="#5.1.1">        5.1.1  Translation environment .       . .   .   .   .   .   .   .   .    .   .   .   .   .   .    9</a>
-<a href="#5.1.2">        5.1.2  Execution environments     .    . .   .   .   .   .   .   .   .    .   .   .   .   .   .   11</a>
-<a href="#5.2">   5.2 Environmental considerations    . .     . .   .   .   .   .   .   .   .    .   .   .   .   .   .   17</a>
-<a href="#5.2.1">        5.2.1 Character sets     . . . . .     . .   .   .   .   .   .   .   .    .   .   .   .   .   .   17</a>
-<a href="#5.2.2">        5.2.2  Character display semantics       .   .   .   .   .   .   .   .    .   .   .   .   .   .   19</a>
-<a href="#5.2.3">        5.2.3 Signals and interrupts . .       . .   .   .   .   .   .   .   .    .   .   .   .   .   .   20</a>
-<a href="#5.2.4">        5.2.4  Environmental limits    . .     . .   .   .   .   .   .   .   .    .   .   .   .   .   .   20</a>
-<a href="#6">6. Language . . . . . . . . . . . . . . . .              .   .   .   .   .   .    .   .   .   .   .   .   29</a>
-<a href="#6.1">   6.1 Notation . . . . . . . . . . . . . .              .   .   .   .   .   .    .   .   .   .   .   .   29</a>
-<a href="#6.2">   6.2 Concepts      . . . . . . . . . . . . .           .   .   .   .   .   .    .   .   .   .   .   .   29</a>
-<a href="#6.2.1">        6.2.1 Scopes of identifiers      . . . . .        .   .   .   .   .   .    .   .   .   .   .   .   29</a>
-<a href="#6.2.2">        6.2.2   Linkages of identifiers . . . . .         .   .   .   .   .   .    .   .   .   .   .   .   30</a>
-<a href="#6.2.3">        6.2.3 Name spaces of identifiers      . . .       .   .   .   .   .   .    .   .   .   .   .   .   31</a>
-<a href="#6.2.4">        6.2.4 Storage durations of objects     . .       .   .   .   .   .   .    .   .   .   .   .   .   32</a>
-<a href="#6.2.5">        6.2.5 Types       . . . . . . . . . . .          .   .   .   .   .   .    .   .   .   .   .   .   33</a>
-<a href="#6.2.6">        6.2.6 Representations of types . . . .           .   .   .   .   .   .    .   .   .   .   .   .   37</a>
-<a href="#6.2.7">        6.2.7 Compatible type and composite type             .   .   .   .   .    .   .   .   .   .   .   40</a>
-<a href="#6.3">   6.3 Conversions     . . . . . . . . . . . .           .   .   .   .   .   .    .   .   .   .   .   .   42</a>
-<a href="#6.3.1">        6.3.1 Arithmetic operands       . . . . .        .   .   .   .   .   .    .   .   .   .   .   .   42</a>
-<a href="#6.3.2">        6.3.2 Other operands        . . . . . . .        .   .   .   .   .   .    .   .   .   .   .   .   46</a>
-<a href="#6.4">   6.4 Lexical elements      . . . . . . . . . .         .   .   .   .   .   .    .   .   .   .   .   .   49</a>
-<a href="#6.4.1">        6.4.1 Keywords . . . . . . . . . .               .   .   .   .   .   .    .   .   .   .   .   .   50</a>
-<a href="#6.4.2">        6.4.2 Identifiers . . . . . . . . . .             .   .   .   .   .   .    .   .   .   .   .   .   51</a>
-<a href="#6.4.3">        6.4.3 Universal character names      . . .       .   .   .   .   .   .    .   .   .   .   .   .   53</a>
-<a href="#6.4.4">        6.4.4   Constants . . . . . . . . . .            .   .   .   .   .   .    .   .   .   .   .   .   54</a>
-<a href="#6.4.5">        6.4.5 String literals     . . . . . . . .        .   .   .   .   .   .    .   .   .   .   .   .   62</a>
-<a href="#6.4.6">        6.4.6   Punctuators . . . . . . . . .            .   .   .   .   .   .    .   .   .   .   .   .   63</a>
-<a href="#6.4.7">        6.4.7 Header names        . . . . . . . .        .   .   .   .   .   .    .   .   .   .   .   .   64</a>
-<a href="#6.4.8">        6.4.8 Preprocessing numbers        . . . .       .   .   .   .   .   .    .   .   .   .   .   .   65</a>
-<a href="#6.4.9">        6.4.9 Comments         . . . . . . . . .         .   .   .   .   .   .    .   .   .   .   .   .   66</a>
-<a href="#6.5">   6.5 Expressions     . . . . . . . . . . . .           .   .   .   .   .   .    .   .   .   .   .   .   67</a>
-
-
-[page iii]
-
-<a href="#6.5.1">          6.5.1   Primary expressions      . . .   .   .   .   .   .   .   .   .   .   .   .   .   .   .    69</a>
-<a href="#6.5.2">          6.5.2 Postfix operators . . . . .         .   .   .   .   .   .   .   .   .   .   .   .   .   .    69</a>
-<a href="#6.5.3">          6.5.3   Unary operators      . . . . .   .   .   .   .   .   .   .   .   .   .   .   .   .   .    78</a>
-<a href="#6.5.4">          6.5.4 Cast operators . . . . . .         .   .   .   .   .   .   .   .   .   .   .   .   .   .    81</a>
-<a href="#6.5.5">          6.5.5   Multiplicative operators   . .   .   .   .   .   .   .   .   .   .   .   .   .   .   .    82</a>
-<a href="#6.5.6">          6.5.6 Additive operators       . . . .   .   .   .   .   .   .   .   .   .   .   .   .   .   .    82</a>
-<a href="#6.5.7">          6.5.7 Bitwise shift operators . . .      .   .   .   .   .   .   .   .   .   .   .   .   .   .    84</a>
-<a href="#6.5.8">          6.5.8   Relational operators . . . .     .   .   .   .   .   .   .   .   .   .   .   .   .   .    85</a>
-<a href="#6.5.9">          6.5.9 Equality operators       . . . .   .   .   .   .   .   .   .   .   .   .   .   .   .   .    86</a>
-<a href="#6.5.10">          6.5.10 Bitwise AND operator . . .        .   .   .   .   .   .   .   .   .   .   .   .   .   .    87</a>
-<a href="#6.5.11">          6.5.11 Bitwise exclusive OR operator         .   .   .   .   .   .   .   .   .   .   .   .   .    88</a>
-<a href="#6.5.12">          6.5.12 Bitwise inclusive OR operator     .   .   .   .   .   .   .   .   .   .   .   .   .   .    88</a>
-<a href="#6.5.13">          6.5.13 Logical AND operator . . .        .   .   .   .   .   .   .   .   .   .   .   .   .   .    89</a>
-<a href="#6.5.14">          6.5.14 Logical OR operator       . . .   .   .   .   .   .   .   .   .   .   .   .   .   .   .    89</a>
-<a href="#6.5.15">          6.5.15 Conditional operator      . . .   .   .   .   .   .   .   .   .   .   .   .   .   .   .    90</a>
-<a href="#6.5.16">          6.5.16 Assignment operators . . .        .   .   .   .   .   .   .   .   .   .   .   .   .   .    91</a>
-<a href="#6.5.17">          6.5.17 Comma operator . . . . .          .   .   .   .   .   .   .   .   .   .   .   .   .   .    94</a>
-<a href="#6.6">     6.6 Constant expressions . . . . . . .        .   .   .   .   .   .   .   .   .   .   .   .   .   .    95</a>
-<a href="#6.7">     6.7 Declarations     . . . . . . . . . .      .   .   .   .   .   .   .   .   .   .   .   .   .   .    97</a>
-<a href="#6.7.1">          6.7.1 Storage-class specifiers      . .   .   .   .   .   .   .   .   .   .   .   .   .   .   .    98</a>
-<a href="#6.7.2">          6.7.2   Type specifiers . . . . . .       .   .   .   .   .   .   .   .   .   .   .   .   .   .    99</a>
-<a href="#6.7.3">          6.7.3 Type qualifiers . . . . . .         .   .   .   .   .   .   .   .   .   .   .   .   .   .   108</a>
-<a href="#6.7.4">          6.7.4   Function specifiers     . . . .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   112</a>
-<a href="#6.7.5">          6.7.5 Declarators        . . . . . . .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   114</a>
-<a href="#6.7.6">          6.7.6 Type names . . . . . . .           .   .   .   .   .   .   .   .   .   .   .   .   .   .   122</a>
-<a href="#6.7.7">          6.7.7   Type definitions      . . . . .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   123</a>
-<a href="#6.7.8">          6.7.8 Initialization       . . . . . .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   125</a>
-<a href="#6.8">     6.8 Statements and blocks       . . . . . .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   131</a>
-<a href="#6.8.1">          6.8.1   Labeled statements     . . . .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   131</a>
-<a href="#6.8.2">          6.8.2 Compound statement         . . .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   132</a>
-<a href="#6.8.3">          6.8.3 Expression and null statements         .   .   .   .   .   .   .   .   .   .   .   .   .   132</a>
-<a href="#6.8.4">          6.8.4 Selection statements       . . .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   133</a>
-<a href="#6.8.5">          6.8.5 Iteration statements . . . .       .   .   .   .   .   .   .   .   .   .   .   .   .   .   135</a>
-<a href="#6.8.6">          6.8.6 Jump statements        . . . . .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   136</a>
-<a href="#6.9">     6.9 External definitions       . . . . . . .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   140</a>
-<a href="#6.9.1">          6.9.1   Function definitions . . . .      .   .   .   .   .   .   .   .   .   .   .   .   .   .   141</a>
-<a href="#6.9.2">          6.9.2 External object definitions     .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   143</a>
-<a href="#6.10">     6.10 Preprocessing directives     . . . . .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   145</a>
-<a href="#6.10.1">          6.10.1 Conditional inclusion     . . .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   147</a>
-<a href="#6.10.2">          6.10.2 Source file inclusion      . . .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   149</a>
-<a href="#6.10.3">          6.10.3 Macro replacement . . . .         .   .   .   .   .   .   .   .   .   .   .   .   .   .   151</a>
-<a href="#6.10.4">          6.10.4 Line control . . . . . . .        .   .   .   .   .   .   .   .   .   .   .   .   .   .   158</a>
-<a href="#6.10.5">          6.10.5 Error directive . . . . . .       .   .   .   .   .   .   .   .   .   .   .   .   .   .   159</a>
-<a href="#6.10.6">          6.10.6 Pragma directive . . . . .        .   .   .   .   .   .   .   .   .   .   .   .   .   .   159</a>
-
-[page iv]
-
-<a href="#6.10.7">       6.10.7 Null directive      . . . . .   .   .   .   .   .   .   .   .   .    .   .   .   .   .   .   160</a>
-<a href="#6.10.8">       6.10.8 Predefined macro names .         .   .   .   .   .   .   .   .   .    .   .   .   .   .   .   160</a>
-<a href="#6.10.9">       6.10.9 Pragma operator       . . . .   .   .   .   .   .   .   .   .   .    .   .   .   .   .   .   161</a>
-<a href="#6.11">  6.11 Future language directions     . . .   .   .   .   .   .   .   .   .   .    .   .   .   .   .   .   163</a>
-<a href="#6.11.1">       6.11.1 Floating types      . . . . .   .   .   .   .   .   .   .   .   .    .   .   .   .   .   .   163</a>
-<a href="#6.11.2">       6.11.2 Linkages of identifiers . .      .   .   .   .   .   .   .   .   .    .   .   .   .   .   .   163</a>
-<a href="#6.11.3">       6.11.3 External names        . . . .   .   .   .   .   .   .   .   .   .    .   .   .   .   .   .   163</a>
-<a href="#6.11.4">       6.11.4 Character escape sequences          .   .   .   .   .   .   .   .    .   .   .   .   .   .   163</a>
-<a href="#6.11.5">       6.11.5 Storage-class specifiers     .   .   .   .   .   .   .   .   .   .    .   .   .   .   .   .   163</a>
-<a href="#6.11.6">       6.11.6 Function declarators      . .   .   .   .   .   .   .   .   .   .    .   .   .   .   .   .   163</a>
-<a href="#6.11.7">       6.11.7 Function definitions . . .       .   .   .   .   .   .   .   .   .    .   .   .   .   .   .   163</a>
-<a href="#6.11.8">       6.11.8 Pragma directives       . . .   .   .   .   .   .   .   .   .   .    .   .   .   .   .   .   163</a>
-<a href="#6.11.9">       6.11.9 Predefined macro names .         .   .   .   .   .   .   .   .   .    .   .   .   .   .   .   163</a>
-<a href="#7">7. Library . . . . . . . . . . . . . . . . . . . .                    . .     .    .   .   .   .   .   .   164</a>
-<a href="#7.1">   7.1 Introduction     . . . . . . . . . . . . . . .                 . .     .    .   .   .   .   .   .   164</a>
-<a href="#7.1.1">         7.1.1 Definitions of terms . . . . . . . . .                  . .     .    .   .   .   .   .   .   164</a>
-<a href="#7.1.2">         7.1.2 Standard headers . . . . . . . . . .                   . .     .    .   .   .   .   .   .   165</a>
-<a href="#7.1.3">         7.1.3 Reserved identifiers . . . . . . . . .                  . .     .    .   .   .   .   .   .   166</a>
-<a href="#7.1.4">         7.1.4 Use of library functions    . . . . . . .              . .     .    .   .   .   .   .   .   166</a>
-<a href="#7.2">   7.2 Diagnostics &lt;assert.h&gt;          . . . . . . . . .              . .     .    .   .   .   .   .   .   169</a>
-<a href="#7.2.1">         7.2.1 Program diagnostics       . . . . . . . .              . .     .    .   .   .   .   .   .   169</a>
-<a href="#7.3">   7.3 Complex arithmetic &lt;complex.h&gt;           . . . . .             . .     .    .   .   .   .   .   .   170</a>
-<a href="#7.3.1">         7.3.1 Introduction . . . . . . . . . . . .                   . .     .    .   .   .   .   .   .   170</a>
-<a href="#7.3.2">         7.3.2 Conventions . . . . . . . . . . . .                    . .     .    .   .   .   .   .   .   171</a>
-<a href="#7.3.3">         7.3.3 Branch cuts . . . . . . . . . . . .                    . .     .    .   .   .   .   .   .   171</a>
-<a href="#7.3.4">         7.3.4 The CX_LIMITED_RANGE pragma              . .           . .     .    .   .   .   .   .   .   171</a>
-<a href="#7.3.5">         7.3.5 Trigonometric functions . . . . . . .                  . .     .    .   .   .   .   .   .   172</a>
-<a href="#7.3.6">         7.3.6 Hyperbolic functions      . . . . . . . .              . .     .    .   .   .   .   .   .   174</a>
-<a href="#7.3.7">         7.3.7 Exponential and logarithmic functions      .           . .     .    .   .   .   .   .   .   176</a>
-<a href="#7.3.8">         7.3.8 Power and absolute-value functions       . .           . .     .    .   .   .   .   .   .   177</a>
-<a href="#7.3.9">         7.3.9 Manipulation functions      . . . . . . .              . .     .    .   .   .   .   .   .   178</a>
-<a href="#7.4">   7.4 Character handling &lt;ctype.h&gt; . . . . . . .                     . .     .    .   .   .   .   .   .   181</a>
-<a href="#7.4.1">         7.4.1 Character classification functions      . . .           . .     .    .   .   .   .   .   .   181</a>
-<a href="#7.4.2">         7.4.2 Character case mapping functions       . . .           . .     .    .   .   .   .   .   .   184</a>
-<a href="#7.5">   7.5 Errors &lt;errno.h&gt;         . . . . . . . . . . . .               . .     .    .   .   .   .   .   .   186</a>
-<a href="#7.6">   7.6 Floating-point environment &lt;fenv.h&gt;         . . . .            . .     .    .   .   .   .   .   .   187</a>
-<a href="#7.6.1">         7.6.1 The FENV_ACCESS pragma           . . . . .             . .     .    .   .   .   .   .   .   189</a>
-<a href="#7.6.2">         7.6.2 Floating-point exceptions      . . . . . .             . .     .    .   .   .   .   .   .   190</a>
-<a href="#7.6.3">         7.6.3 Rounding . . . . . . . . . . . . .                     . .     .    .   .   .   .   .   .   193</a>
-<a href="#7.6.4">         7.6.4 Environment        . . . . . . . . . . .               . .     .    .   .   .   .   .   .   194</a>
-<a href="#7.7">   7.7 Characteristics of floating types &lt;float.h&gt; . .                 . .     .    .   .   .   .   .   .   197</a>
-<a href="#7.8">   7.8 Format conversion of integer types &lt;inttypes.h&gt;                  .     .    .   .   .   .   .   .   198</a>
-<a href="#7.8.1">         7.8.1 Macros for format specifiers      . . . . .             . .     .    .   .   .   .   .   .   198</a>
-<a href="#7.8.2">         7.8.2 Functions for greatest-width integer types             . .     .    .   .   .   .   .   .   199</a>
-
-[page v]
-
-<a href="#7.9">     7.9 Alternative spellings &lt;iso646.h&gt; . . . . . . . . . . .         .   .   .   .   202</a>
-<a href="#7.10">     7.10 Sizes of integer types &lt;limits.h&gt;       . . . . . . . . . .   .   .   .   .   203</a>
-<a href="#7.11">     7.11 Localization &lt;locale.h&gt; . . . . . . . . . . . . . .           .   .   .   .   204</a>
-<a href="#7.11.1">          7.11.1 Locale control . . . . . . . . . . . . . . . .         .   .   .   .   205</a>
-<a href="#7.11.2">          7.11.2 Numeric formatting convention inquiry . . . . . .      .   .   .   .   206</a>
-<a href="#7.12">     7.12 Mathematics &lt;math.h&gt; . . . . . . . . . . . . . . .            .   .   .   .   212</a>
-<a href="#7.12.1">          7.12.1 Treatment of error conditions . . . . . . . . . .      .   .   .   .   214</a>
-<a href="#7.12.2">          7.12.2 The FP_CONTRACT pragma           . . . . . . . . . .   .   .   .   .   215</a>
-<a href="#7.12.3">          7.12.3 Classification macros      . . . . . . . . . . . . .    .   .   .   .   216</a>
-<a href="#7.12.4">          7.12.4 Trigonometric functions . . . . . . . . . . . .        .   .   .   .   218</a>
-<a href="#7.12.5">          7.12.5 Hyperbolic functions      . . . . . . . . . . . . .    .   .   .   .   221</a>
-<a href="#7.12.6">          7.12.6 Exponential and logarithmic functions    . . . . . .   .   .   .   .   223</a>
-<a href="#7.12.7">          7.12.7 Power and absolute-value functions     . . . . . . .   .   .   .   .   228</a>
-<a href="#7.12.8">          7.12.8 Error and gamma functions . . . . . . . . . . .        .   .   .   .   230</a>
-<a href="#7.12.9">          7.12.9 Nearest integer functions . . . . . . . . . . . .      .   .   .   .   231</a>
-<a href="#7.12.10">          7.12.10 Remainder functions      . . . . . . . . . . . . .    .   .   .   .   235</a>
-<a href="#7.12.11">          7.12.11 Manipulation functions      . . . . . . . . . . . .   .   .   .   .   236</a>
-<a href="#7.12.12">          7.12.12 Maximum, minimum, and positive difference functions       .   .   .   238</a>
-<a href="#7.12.13">          7.12.13 Floating multiply-add . . . . . . . . . . . . .       .   .   .   .   239</a>
-<a href="#7.12.14">          7.12.14 Comparison macros . . . . . . . . . . . . . .         .   .   .   .   240</a>
-<a href="#7.13">     7.13 Nonlocal jumps &lt;setjmp.h&gt;           . . . . . . . . . . . .   .   .   .   .   243</a>
-<a href="#7.13.1">          7.13.1 Save calling environment       . . . . . . . . . . .   .   .   .   .   243</a>
-<a href="#7.13.2">          7.13.2 Restore calling environment      . . . . . . . . . .   .   .   .   .   244</a>
-<a href="#7.14">     7.14 Signal handling &lt;signal.h&gt; . . . . . . . . . . . . .          .   .   .   .   246</a>
-<a href="#7.14.1">          7.14.1 Specify signal handling      . . . . . . . . . . . .   .   .   .   .   247</a>
-<a href="#7.14.2">          7.14.2 Send signal       . . . . . . . . . . . . . . . . .    .   .   .   .   248</a>
-<a href="#7.15">     7.15 Variable arguments &lt;stdarg.h&gt;         . . . . . . . . . . .   .   .   .   .   249</a>
-<a href="#7.15.1">          7.15.1 Variable argument list access macros . . . . . . .     .   .   .   .   249</a>
-<a href="#7.16">     7.16 Boolean type and values &lt;stdbool.h&gt;         . . . . . . . .   .   .   .   .   253</a>
-<a href="#7.17">     7.17 Common definitions &lt;stddef.h&gt; . . . . . . . . . . .            .   .   .   .   254</a>
-<a href="#7.18">     7.18 Integer types &lt;stdint.h&gt; . . . . . . . . . . . . . .          .   .   .   .   255</a>
-<a href="#7.18.1">          7.18.1 Integer types       . . . . . . . . . . . . . . . .    .   .   .   .   255</a>
-<a href="#7.18.2">          7.18.2 Limits of specified-width integer types   . . . . . .   .   .   .   .   257</a>
-<a href="#7.18.3">          7.18.3 Limits of other integer types    . . . . . . . . . .   .   .   .   .   259</a>
-<a href="#7.18.4">          7.18.4 Macros for integer constants     . . . . . . . . . .   .   .   .   .   260</a>
-<a href="#7.19">     7.19 Input/output &lt;stdio.h&gt;         . . . . . . . . . . . . . .    .   .   .   .   262</a>
-<a href="#7.19.1">          7.19.1 Introduction . . . . . . . . . . . . . . . . .         .   .   .   .   262</a>
-<a href="#7.19.2">          7.19.2 Streams         . . . . . . . . . . . . . . . . . .    .   .   .   .   264</a>
-<a href="#7.19.3">          7.19.3 Files . . . . . . . . . . . . . . . . . . . .          .   .   .   .   266</a>
-<a href="#7.19.4">          7.19.4 Operations on files      . . . . . . . . . . . . . .    .   .   .   .   268</a>
-<a href="#7.19.5">          7.19.5 File access functions     . . . . . . . . . . . . .    .   .   .   .   270</a>
-<a href="#7.19.6">          7.19.6 Formatted input/output functions     . . . . . . . .   .   .   .   .   274</a>
-<a href="#7.19.7">          7.19.7 Character input/output functions . . . . . . . . .     .   .   .   .   296</a>
-<a href="#7.19.8">          7.19.8 Direct input/output functions    . . . . . . . . . .   .   .   .   .   301</a>
-
-[page vi]
-
-<a href="#7.19.9">         7.19.9 File positioning functions      . . . . . . . . . . . .     .   .   .   302</a>
-<a href="#7.19.10">         7.19.10 Error-handling functions . . . . . . . . . . . . .         .   .   .   304</a>
-<a href="#7.20">  7.20   General utilities &lt;stdlib.h&gt;         . . . . . . . . . . . . .     .   .   .   306</a>
-<a href="#7.20.1">         7.20.1 Numeric conversion functions . . . . . . . . . . .          .   .   .   307</a>
-<a href="#7.20.2">         7.20.2 Pseudo-random sequence generation functions       . . . .   .   .   .   312</a>
-<a href="#7.20.3">         7.20.3 Memory management functions . . . . . . . . . .             .   .   .   313</a>
-<a href="#7.20.4">         7.20.4 Communication with the environment          . . . . . . .   .   .   .   315</a>
-<a href="#7.20.5">         7.20.5 Searching and sorting utilities . . . . . . . . . . .       .   .   .   318</a>
-<a href="#7.20.6">         7.20.6 Integer arithmetic functions      . . . . . . . . . . .     .   .   .   320</a>
-<a href="#7.20.7">         7.20.7 Multibyte/wide character conversion functions     . . . .   .   .   .   321</a>
-<a href="#7.20.8">         7.20.8 Multibyte/wide string conversion functions      . . . . .   .   .   .   323</a>
-<a href="#7.21">  7.21   String handling &lt;string.h&gt; . . . . . . . . . . . . . .             .   .   .   325</a>
-<a href="#7.21.1">         7.21.1 String function conventions . . . . . . . . . . . .         .   .   .   325</a>
-<a href="#7.21.2">         7.21.2 Copying functions       . . . . . . . . . . . . . . .       .   .   .   325</a>
-<a href="#7.21.3">         7.21.3 Concatenation functions . . . . . . . . . . . . .           .   .   .   327</a>
-<a href="#7.21.4">         7.21.4 Comparison functions . . . . . . . . . . . . . .            .   .   .   328</a>
-<a href="#7.21.5">         7.21.5 Search functions      . . . . . . . . . . . . . . . .       .   .   .   330</a>
-<a href="#7.21.6">         7.21.6 Miscellaneous functions . . . . . . . . . . . . .           .   .   .   333</a>
-<a href="#7.22">  7.22   Type-generic math &lt;tgmath.h&gt;           . . . . . . . . . . . .     .   .   .   335</a>
-<a href="#7.23">  7.23   Date and time &lt;time.h&gt;         . . . . . . . . . . . . . . .       .   .   .   338</a>
-<a href="#7.23.1">         7.23.1 Components of time         . . . . . . . . . . . . . .      .   .   .   338</a>
-<a href="#7.23.2">         7.23.2 Time manipulation functions       . . . . . . . . . . .     .   .   .   339</a>
-<a href="#7.23.3">         7.23.3 Time conversion functions       . . . . . . . . . . . .     .   .   .   341</a>
-<a href="#7.24">  7.24   Extended multibyte and wide character utilities &lt;wchar.h&gt; . .      .   .   .   348</a>
-<a href="#7.24.1">         7.24.1 Introduction . . . . . . . . . . . . . . . . . .            .   .   .   348</a>
-<a href="#7.24.2">         7.24.2 Formatted wide character input/output functions     . . .   .   .   .   349</a>
-<a href="#7.24.3">         7.24.3 Wide character input/output functions       . . . . . . .   .   .   .   367</a>
-<a href="#7.24.4">         7.24.4 General wide string utilities     . . . . . . . . . . .     .   .   .   371</a>
-<a href="#7.24.5">         7.24.5 Wide character time conversion functions      . . . . . .   .   .   .   385</a>
-<a href="#7.24.6">         7.24.6 Extended multibyte/wide character conversion utilities .    .   .   .   386</a>
-<a href="#7.25">  7.25   Wide character classification and mapping utilities &lt;wctype.h&gt;      .   .   .   393</a>
-<a href="#7.25.1">         7.25.1 Introduction . . . . . . . . . . . . . . . . . .            .   .   .   393</a>
-<a href="#7.25.2">         7.25.2 Wide character classification utilities . . . . . . . .      .   .   .   394</a>
-<a href="#7.25.3">         7.25.3 Wide character case mapping utilities . . . . . . . .       .   .   .   399</a>
-<a href="#7.26">  7.26   Future library directions    . . . . . . . . . . . . . . . .       .   .   .   401</a>
-<a href="#7.26.1">         7.26.1 Complex arithmetic &lt;complex.h&gt; . . . . . . . .              .   .   .   401</a>
-<a href="#7.26.2">         7.26.2 Character handling &lt;ctype.h&gt;           . . . . . . . . .    .   .   .   401</a>
-<a href="#7.26.3">         7.26.3 Errors &lt;errno.h&gt;           . . . . . . . . . . . . . .      .   .   .   401</a>
-<a href="#7.26.4">         7.26.4 Format conversion of integer types &lt;inttypes.h&gt;         .   .   .   .   401</a>
-<a href="#7.26.5">         7.26.5 Localization &lt;locale.h&gt;           . . . . . . . . . . .     .   .   .   401</a>
-<a href="#7.26.6">         7.26.6 Signal handling &lt;signal.h&gt;           . . . . . . . . . .    .   .   .   401</a>
-<a href="#7.26.7">         7.26.7 Boolean type and values &lt;stdbool.h&gt;           . . . . . .   .   .   .   401</a>
-<a href="#7.26.8">         7.26.8 Integer types &lt;stdint.h&gt;          . . . . . . . . . . .     .   .   .   401</a>
-<a href="#7.26.9">         7.26.9 Input/output &lt;stdio.h&gt;          . . . . . . . . . . . .     .   .   .   402</a>
-
-[page vii]
-
-<a href="#7.26.10">        7.26.10 General utilities &lt;stdlib.h&gt;      . . . . . . .            . . . . . . 402</a>
-<a href="#7.26.11">        7.26.11 String handling &lt;string.h&gt;        . . . . . . .            . . . . . . 402</a>
-<a href="#7.26.12">        7.26.12 Extended multibyte and wide character utilities
-                &lt;wchar.h&gt;          . . . . . . . . . . . . . .             . . . . . . 402</a>
-<a href="#7.26.13">        7.26.13 Wide character classification and mapping utilities
-                &lt;wctype.h&gt; . . . . . . . . . . . . . .                     . . . . . . 402</a>
-<a href="#A">Annex A (informative) Language syntax summary   . .       .    .   .   .   .   .   .   .   .   .   403</a>
-<a href="#A.1">  A.1 Lexical grammar       . . . . . . . . . . . .       .    .   .   .   .   .   .   .   .   .   403</a>
-<a href="#A.2">  A.2 Phrase structure grammar . . . . . . . . .          .    .   .   .   .   .   .   .   .   .   409</a>
-<a href="#A.3">  A.3 Preprocessing directives    . . . . . . . . .       .    .   .   .   .   .   .   .   .   .   416</a>
-<a href="#B">Annex B (informative) Library summary     . . . . . . . . . . . . .                    .   .   .   419</a>
-<a href="#B.1">  B.1 Diagnostics &lt;assert.h&gt;          . . . . . . . . . . . . . . .                    .   .   .   419</a>
-<a href="#B.2">  B.2 Complex &lt;complex.h&gt; . . . . . . . . . . . . . . . .                              .   .   .   419</a>
-<a href="#B.3">  B.3 Character handling &lt;ctype.h&gt; . . . . . . . . . . . . .                           .   .   .   421</a>
-<a href="#B.4">  B.4 Errors &lt;errno.h&gt;         . . . . . . . . . . . . . . . . . .                     .   .   .   421</a>
-<a href="#B.5">  B.5 Floating-point environment &lt;fenv.h&gt;          . . . . . . . . . .                 .   .   .   421</a>
-<a href="#B.6">  B.6 Characteristics of floating types &lt;float.h&gt; . . . . . . . .                       .   .   .   422</a>
-<a href="#B.7">  B.7 Format conversion of integer types &lt;inttypes.h&gt; . . . . .                        .   .   .   422</a>
-<a href="#B.8">  B.8 Alternative spellings &lt;iso646.h&gt; . . . . . . . . . . . .                         .   .   .   423</a>
-<a href="#B.9">  B.9 Sizes of integer types &lt;limits.h&gt;          . . . . . . . . . . .                 .   .   .   423</a>
-<a href="#B.10">  B.10 Localization &lt;locale.h&gt; . . . . . . . . . . . . . . .                           .   .   .   423</a>
-<a href="#B.11">  B.11 Mathematics &lt;math.h&gt; . . . . . . . . . . . . . . . .                            .   .   .   423</a>
-<a href="#B.12">  B.12 Nonlocal jumps &lt;setjmp.h&gt;          . . . . . . . . . . . . .                    .   .   .   428</a>
-<a href="#B.13">  B.13 Signal handling &lt;signal.h&gt; . . . . . . . . . . . . . .                          .   .   .   428</a>
-<a href="#B.14">  B.14 Variable arguments &lt;stdarg.h&gt;         . . . . . . . . . . . .                   .   .   .   428</a>
-<a href="#B.15">  B.15 Boolean type and values &lt;stdbool.h&gt;           . . . . . . . . .                 .   .   .   428</a>
-<a href="#B.16">  B.16 Common definitions &lt;stddef.h&gt; . . . . . . . . . . . .                            .   .   .   429</a>
-<a href="#B.17">  B.17 Integer types &lt;stdint.h&gt; . . . . . . . . . . . . . . .                          .   .   .   429</a>
-<a href="#B.18">  B.18 Input/output &lt;stdio.h&gt;         . . . . . . . . . . . . . . .                    .   .   .   429</a>
-<a href="#B.19">  B.19 General utilities &lt;stdlib.h&gt;       . . . . . . . . . . . . .                    .   .   .   431</a>
-<a href="#B.20">  B.20 String handling &lt;string.h&gt; . . . . . . . . . . . . . .                          .   .   .   433</a>
-<a href="#B.21">  B.21 Type-generic math &lt;tgmath.h&gt;          . . . . . . . . . . . .                   .   .   .   434</a>
-<a href="#B.22">  B.22 Date and time &lt;time.h&gt;         . . . . . . . . . . . . . . .                    .   .   .   434</a>
-<a href="#B.23">  B.23 Extended multibyte/wide character utilities &lt;wchar.h&gt;     . . .                 .   .   .   435</a>
-<a href="#B.24">  B.24 Wide character classification and mapping utilities &lt;wctype.h&gt;                   .   .   .   437</a>
-<a href="#C">Annex C (informative) Sequence points     . . . . . . . . . . . . . . . . . 439</a>
-<a href="#D">Annex D (normative) Universal character names for identifiers           . . . . . . . 440</a>
-<a href="#E">Annex E (informative) Implementation limits        . . . . . . . . . . . . . . 442</a>
-<a href="#F">Annex F (normative) IEC 60559 floating-point arithmetic    .    .   .   .   .   .   .   .   .   .   444</a>
-<a href="#F.1">  F.1 Introduction     . . . . . . . . . . . . . .        .    .   .   .   .   .   .   .   .   .   444</a>
-<a href="#F.2">  F.2 Types . . . . . . . . . . . . . . . . .             .    .   .   .   .   .   .   .   .   .   444</a>
-<a href="#F.3">  F.3 Operators and functions     . . . . . . . . .       .    .   .   .   .   .   .   .   .   .   445</a>
-
-[page viii]
-
-<a href="#F.4">   F.4   Floating to integer conversion       .   .   .   .   .   .   .   .   .   .   .    .   .   .   .   .   .   447</a>
-<a href="#F.5">   F.5   Binary-decimal conversion        .   .   .   .   .   .   .   .   .   .   .   .    .   .   .   .   .   .   447</a>
-<a href="#F.6">   F.6   Contracted expressions . .       .   .   .   .   .   .   .   .   .   .   .   .    .   .   .   .   .   .   448</a>
-<a href="#F.7">   F.7   Floating-point environment       .   .   .   .   .   .   .   .   .   .   .   .    .   .   .   .   .   .   448</a>
-<a href="#F.8">   F.8   Optimization . . . . . .         .   .   .   .   .   .   .   .   .   .   .   .    .   .   .   .   .   .   451</a>
-<a href="#F.9">   F.9   Mathematics &lt;math.h&gt; .           .   .   .   .   .   .   .   .   .   .   .   .    .   .   .   .   .   .   454</a>
-<a href="#G">Annex G (informative) IEC 60559-compatible complex arithmetic                              .   .   .   .   .   .   467</a>
-<a href="#G.1">  G.1 Introduction      . . . . . . . . . . . . . . . . .                             .    .   .   .   .   .   .   467</a>
-<a href="#G.2">  G.2 Types . . . . . . . . . . . . . . . . . . . .                                   .    .   .   .   .   .   .   467</a>
-<a href="#G.3">  G.3 Conventions       . . . . . . . . . . . . . . . . .                             .    .   .   .   .   .   .   467</a>
-<a href="#G.4">  G.4 Conversions       . . . . . . . . . . . . . . . . .                             .    .   .   .   .   .   .   468</a>
-<a href="#G.5">  G.5 Binary operators      . . . . . . . . . . . . . . .                             .    .   .   .   .   .   .   468</a>
-<a href="#G.6">  G.6 Complex arithmetic &lt;complex.h&gt;          . . . . . . .                           .    .   .   .   .   .   .   472</a>
-<a href="#G.7">  G.7 Type-generic math &lt;tgmath.h&gt;          . . . . . . . .                           .    .   .   .   .   .   .   480</a>
-<a href="#H">Annex H (informative) Language independent arithmetic . .                         .   .    .   .   .   .   .   .   481</a>
-<a href="#H.1">  H.1 Introduction     . . . . . . . . . . . . . . . .                            .   .    .   .   .   .   .   .   481</a>
-<a href="#H.2">  H.2 Types . . . . . . . . . . . . . . . . . . .                                 .   .    .   .   .   .   .   .   481</a>
-<a href="#H.3">  H.3 Notification      . . . . . . . . . . . . . . . .                            .   .    .   .   .   .   .   .   485</a>
-<a href="#I">Annex I (informative) Common warnings             . . . . . . . . . . . . . . . . 487</a>
-<a href="#J">Annex J (informative) Portability issues      . . . .         .   .   .   .   .   .   .    .   .   .   .   .   .   489</a>
-<a href="#J.1">  J.1 Unspecified behavior . . . .             . . . .         .   .   .   .   .   .   .    .   .   .   .   .   .   489</a>
-<a href="#J.2">  J.2 Undefined behavior          . . . .      . . . .         .   .   .   .   .   .   .    .   .   .   .   .   .   492</a>
-<a href="#J.3">  J.3 Implementation-defined behavior            . . .         .   .   .   .   .   .   .    .   .   .   .   .   .   505</a>
-<a href="#J.4">  J.4 Locale-specific behavior         . .     . . . .         .   .   .   .   .   .   .    .   .   .   .   .   .   512</a>
-<a href="#J.5">  J.5 Common extensions          . . . .      . . . .         .   .   .   .   .   .   .    .   .   .   .   .   .   513</a>
-<a href="#Bibliography">Bibliography      . . . . . . . . . . . . . . . . . . . . . . . . . . . 516</a>
-<a href="#Index">Index     . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 519</a>
-
-
-
-
-[<a name="pix" href="#pix">page ix</a>] (<a href="#Contents">Contents</a>)
-
-
-
-[<a name="px" href="#px">page x</a>] (<a href="#Contents">Contents</a>)
-
-<a name="Foreword" href="#Foreword"><b>    Foreword</b></a>
-1   ISO (the International Organization for Standardization) and IEC (the International
-    Electrotechnical Commission) form the specialized system for worldwide
-    standardization. National bodies that are member of ISO or IEC participate in the
-    development of International Standards through technical committees established by the
-    respective organization to deal with particular fields of technical activity. ISO and IEC
-    technical committees collaborate in fields of mutual interest. Other international
-    organizations, governmental and non-governmental, in liaison with ISO and IEC, also
-    take part in the work.
-2   International Standards are drafted in accordance with the rules given in the ISO/IEC
-    Directives, Part 3.
-3   In the field of information technology, ISO and IEC have established a joint technical
-    committee, ISO/IEC JTC 1. Draft International Standards adopted by the joint technical
-    committee are circulated to national bodies for voting. Publication as an International
-    Standard requires approval by at least 75% of the national bodies casting a vote.
-4   International Standard ISO/IEC 9899 was prepared by Joint Technical Committee
-    ISO/IEC JTC 1, Information technology, Subcommittee SC 22, Programming languages,
-    their environments and system software interfaces. The Working Group responsible for
-    this standard (WG 14) maintains a site on the World Wide Web at
-    http://www.open-std.org/JTC1/SC22/WG14/                        containing      additional
-    information relevant to this standard such as a Rationale for many of the decisions made
-    during its preparation and a log of Defect Reports and Responses.
-5   This second edition cancels and replaces the first edition, ISO/IEC 9899:1990, as
-    amended and corrected by ISO/IEC 9899/COR1:1994, ISO/IEC 9899/AMD1:1995, and
-    ISO/IEC 9899/COR2:1996. Major changes from the previous edition include:
-    -- restricted character set support via digraphs and <a href="#7.9">&lt;iso646.h&gt;</a> (originally specified
-      in AMD1)
-    -- wide character library support in <a href="#7.24">&lt;wchar.h&gt;</a> and <a href="#7.25">&lt;wctype.h&gt;</a> (originally
-      specified in AMD1)
-    -- more precise aliasing rules via effective type
-    -- restricted pointers
-    -- variable length arrays
-    -- flexible array members
-    -- static and type qualifiers in parameter array declarators
-    -- complex (and imaginary) support in <a href="#7.3">&lt;complex.h&gt;</a>
-    -- type-generic math macros in <a href="#7.22">&lt;tgmath.h&gt;</a>
-    -- the long long int type and library functions
-
-
-[<a name="pxi" href="#pxi">page xi</a>] (<a href="#Contents">Contents</a>)
-
--- increased minimum translation limits
--- additional floating-point characteristics in <a href="#7.7">&lt;float.h&gt;</a>
--- remove implicit int
--- reliable integer division
--- universal character names (\u and \U)
--- extended identifiers
--- hexadecimal floating-point constants and %a and %A printf/scanf conversion
-  specifiers
--- compound literals
--- designated initializers
--- // comments
--- extended integer types and library functions in <a href="#7.8">&lt;inttypes.h&gt;</a> and <a href="#7.18">&lt;stdint.h&gt;</a>
--- remove implicit function declaration
--- preprocessor arithmetic done in intmax_t/uintmax_t
--- mixed declarations and code
--- new block scopes for selection and iteration statements
--- integer constant type rules
--- integer promotion rules
--- macros with a variable number of arguments
--- the vscanf family of functions in <a href="#7.19">&lt;stdio.h&gt;</a> and <a href="#7.24">&lt;wchar.h&gt;</a>
--- additional math library functions in <a href="#7.12">&lt;math.h&gt;</a>
--- treatment of error conditions by math library functions (math_errhandling)
--- floating-point environment access in <a href="#7.6">&lt;fenv.h&gt;</a>
--- IEC 60559 (also known as IEC 559 or IEEE arithmetic) support
--- trailing comma allowed in enum declaration
--- %lf conversion specifier allowed in printf
--- inline functions
--- the snprintf family of functions in <a href="#7.19">&lt;stdio.h&gt;</a>
--- boolean type in <a href="#7.16">&lt;stdbool.h&gt;</a>
--- idempotent type qualifiers
--- empty macro arguments
-
-
-[<a name="pxii" href="#pxii">page xii</a>] (<a href="#Contents">Contents</a>)
-
-    -- new structure type compatibility rules (tag compatibility)
-    -- additional predefined macro names
-    -- _Pragma preprocessing operator
-    -- standard pragmas
-    -- __func__ predefined identifier
-    -- va_copy macro
-    -- additional strftime conversion specifiers
-    -- LIA compatibility annex
-    -- deprecate ungetc at the beginning of a binary file
-    -- remove deprecation of aliased array parameters
-    -- conversion of array to pointer not limited to lvalues
-    -- relaxed constraints on aggregate and union initialization
-    -- relaxed restrictions on portable header names
-    -- return without expression not permitted in function that returns a value (and vice
-      versa)
-6   Annexes D and F form a normative part of this standard; annexes A, B, C, E, G, H, I, J,
-    the bibliography, and the index are for information only. In accordance with Part 3 of the
-    ISO/IEC Directives, this foreword, the introduction, notes, footnotes, and examples are
-    also for information only.
-
-
-
-
-[<a name="pxiii" href="#pxiii">page xiii</a>] (<a href="#Contents">Contents</a>)
-
-<a name="Introduction" href="#Introduction"><b>    Introduction</b></a>
-1   With the introduction of new devices and extended character sets, new features may be
-    added to this International Standard. Subclauses in the language and library clauses warn
-    implementors and programmers of usages which, though valid in themselves, may
-    conflict with future additions.
-2   Certain features are obsolescent, which means that they may be considered for
-    withdrawal in future revisions of this International Standard. They are retained because
-    of their widespread use, but their use in new implementations (for implementation
-    features) or new programs (for language [6.11] or library features [7.26]) is discouraged.
-3   This International Standard is divided into four major subdivisions:
-    -- preliminary elements (clauses 1-4);
-    -- the characteristics of environments that translate and execute C programs (clause 5);
-    -- the language syntax, constraints, and semantics (clause 6);
-    -- the library facilities (clause 7).
-4   Examples are provided to illustrate possible forms of the constructions described.
-    Footnotes are provided to emphasize consequences of the rules described in that
-    subclause or elsewhere in this International Standard. References are used to refer to
-    other related subclauses. Recommendations are provided to give advice or guidance to
-    implementors. Annexes provide additional information and summarize the information
-    contained in this International Standard. A bibliography lists documents that were
-    referred to during the preparation of the standard.
-5   The language clause (clause 6) is derived from ''The C Reference Manual''.
-6   The library clause (clause 7) is based on the 1984 /usr/group Standard.
-
-
-
-
-[<a name="pxiv" href="#pxiv">page xiv</a>] (<a href="#Contents">Contents</a>)
-
-
-
-    Programming languages -- C
-
-
-
-
-<a name="1" href="#1"><b>    1. Scope</b></a>
-1   This International Standard specifies the form and establishes the interpretation of
-    programs written in the C programming language.1) It specifies
-    -- the representation of C programs;
-    -- the syntax and constraints of the C language;
-    -- the semantic rules for interpreting C programs;
-    -- the representation of input data to be processed by C programs;
-    -- the representation of output data produced by C programs;
-    -- the restrictions and limits imposed by a conforming implementation of C.
-2   This International Standard does not specify
-    -- the mechanism by which C programs are transformed for use by a data-processing
-      system;
-    -- the mechanism by which C programs are invoked for use by a data-processing
-      system;
-    -- the mechanism by which input data are transformed for use by a C program;
-    -- the mechanism by which output data are transformed after being produced by a C
-      program;
-    -- the size or complexity of a program and its data that will exceed the capacity of any
-      specific data-processing system or the capacity of a particular processor;
-
-
-    1)   This International Standard is designed to promote the portability of C programs among a variety of
-         data-processing systems. It is intended for use by implementors and programmers.
-
-[<a name="p1" href="#p1">page 1</a>] (<a href="#Contents">Contents</a>)
-
-    -- all minimal requirements of a data-processing system that is capable of supporting a
-      conforming implementation.
-
-<a name="2" href="#2"><b>    2. Normative references</b></a>
-1   The following normative documents contain provisions which, through reference in this
-    text, constitute provisions of this International Standard. For dated references,
-    subsequent amendments to, or revisions of, any of these publications do not apply.
-    However, parties to agreements based on this International Standard are encouraged to
-    investigate the possibility of applying the most recent editions of the normative
-    documents indicated below. For undated references, the latest edition of the normative
-    document referred to applies. Members of ISO and IEC maintain registers of currently
-    valid International Standards.
-2   ISO 31-11:1992, Quantities and units -- Part 11: Mathematical signs and symbols for
-    use in the physical sciences and technology.
-3   ISO/IEC 646, Information technology -- ISO 7-bit coded character set for information
-    interchange.
-4   ISO/IEC 2382-1:1993, Information technology -- Vocabulary -- Part 1: Fundamental
-    terms.
-5   ISO 4217, Codes for the representation of currencies and funds.
-6   ISO 8601, Data elements and interchange formats -- Information interchange --
-    Representation of dates and times.
-7   ISO/IEC 10646 (all parts), Information technology -- Universal Multiple-Octet Coded
-    Character Set (UCS).
-8   IEC 60559:1989, Binary floating-point arithmetic for microprocessor systems (previously
-    designated IEC 559:1989).
-
-
-
-
-[<a name="p2" href="#p2">page 2</a>] (<a href="#Contents">Contents</a>)
-
-
-<a name="3" href="#3"><b>    3. Terms, definitions, and symbols</b></a>
-1   For the purposes of this International Standard, the following definitions apply. Other
-    terms are defined where they appear in italic type or on the left side of a syntax rule.
-    Terms explicitly defined in this International Standard are not to be presumed to refer
-    implicitly to similar terms defined elsewhere. Terms not defined in this International
-    Standard are to be interpreted according to ISO/IEC 2382-1. Mathematical symbols not
-    defined in this International Standard are to be interpreted according to ISO 31-11.
-<a name="3.1" href="#3.1"><b>    3.1</b></a>
-1   access
-    &lt;execution-time action&gt; to read or modify the value of an object
-2   NOTE 1   Where only one of these two actions is meant, ''read'' or ''modify'' is used.
-
-3   NOTE 2   "Modify'' includes the case where the new value being stored is the same as the previous value.
-
-4   NOTE 3   Expressions that are not evaluated do not access objects.
-
-<a name="3.2" href="#3.2"><b>    3.2</b></a>
-1   alignment
-    requirement that objects of a particular type be located on storage boundaries with
-    addresses that are particular multiples of a byte address
-<a name="3.3" href="#3.3"><b>    3.3</b></a>
-1   argument
-    actual argument
-    actual parameter (deprecated)
-    expression in the comma-separated list bounded by the parentheses in a function call
-    expression, or a sequence of preprocessing tokens in the comma-separated list bounded
-    by the parentheses in a function-like macro invocation
-<a name="3.4" href="#3.4"><b>    3.4</b></a>
-1   behavior
-    external appearance or action
-<a name="3.4.1" href="#3.4.1"><b>    3.4.1</b></a>
-1   implementation-defined behavior
-    unspecified behavior where each implementation documents how the choice is made
-2   EXAMPLE An example of implementation-defined behavior is the propagation of the high-order bit
-    when a signed integer is shifted right.
-
-<a name="3.4.2" href="#3.4.2"><b>    3.4.2</b></a>
-1   locale-specific behavior
-    behavior that depends on local conventions of nationality, culture, and language that each
-    implementation documents
-
-
-[<a name="p3" href="#p3">page 3</a>] (<a href="#Contents">Contents</a>)
-
-2   EXAMPLE An example of locale-specific behavior is whether the islower function returns true for
-    characters other than the 26 lowercase Latin letters.
-
-<a name="3.4.3" href="#3.4.3"><b>    3.4.3</b></a>
-1   undefined behavior
-    behavior, upon use of a nonportable or erroneous program construct or of erroneous data,
-    for which this International Standard imposes no requirements
-2   NOTE Possible undefined behavior ranges from ignoring the situation completely with unpredictable
-    results, to behaving during translation or program execution in a documented manner characteristic of the
-    environment (with or without the issuance of a diagnostic message), to terminating a translation or
-    execution (with the issuance of a diagnostic message).
-
-3   EXAMPLE        An example of undefined behavior is the behavior on integer overflow.
-
-<a name="3.4.4" href="#3.4.4"><b>    3.4.4</b></a>
-1   unspecified behavior
-    use of an unspecified value, or other behavior where this International Standard provides
-    two or more possibilities and imposes no further requirements on which is chosen in any
-    instance
-2   EXAMPLE        An example of unspecified behavior is the order in which the arguments to a function are
-    evaluated.
-
-<a name="3.5" href="#3.5"><b>    3.5</b></a>
-1   bit
-    unit of data storage in the execution environment large enough to hold an object that may
-    have one of two values
-2   NOTE     It need not be possible to express the address of each individual bit of an object.
-
-<a name="3.6" href="#3.6"><b>    3.6</b></a>
-1   byte
-    addressable unit of data storage large enough to hold any member of the basic character
-    set of the execution environment
-2   NOTE 1 It is possible to express the address of each individual byte of an object uniquely.
-
-3   NOTE 2 A byte is composed of a contiguous sequence of bits, the number of which is implementation-
-    defined. The least significant bit is called the low-order bit; the most significant bit is called the high-order
-    bit.
-
-<a name="3.7" href="#3.7"><b>    3.7</b></a>
-1   character
-    &lt;abstract&gt; member of a set of elements used for the organization, control, or
-    representation of data
-<a name="3.7.1" href="#3.7.1"><b>    3.7.1</b></a>
-1   character
-    single-byte character
-    &lt;C&gt; bit representation that fits in a byte
-[<a name="p4" href="#p4">page 4</a>] (<a href="#Contents">Contents</a>)
-
-<a name="3.7.2" href="#3.7.2"><b>    3.7.2</b></a>
-1   multibyte character
-    sequence of one or more bytes representing a member of the extended character set of
-    either the source or the execution environment
-2   NOTE    The extended character set is a superset of the basic character set.
-
-<a name="3.7.3" href="#3.7.3"><b>    3.7.3</b></a>
-1   wide character
-    bit representation that fits in an object of type wchar_t, capable of representing any
-    character in the current locale
-<a name="3.8" href="#3.8"><b>    3.8</b></a>
-1   constraint
-    restriction, either syntactic or semantic, by which the exposition of language elements is
-    to be interpreted
-<a name="3.9" href="#3.9"><b>    3.9</b></a>
-1   correctly rounded result
-    representation in the result format that is nearest in value, subject to the current rounding
-    mode, to what the result would be given unlimited range and precision
-<a name="3.10" href="#3.10"><b>    3.10</b></a>
-1   diagnostic message
-    message belonging to an implementation-defined subset of the implementation's message
-    output
-<a name="3.11" href="#3.11"><b>    3.11</b></a>
-1   forward reference
-    reference to a later subclause of this International Standard that contains additional
-    information relevant to this subclause
-<a name="3.12" href="#3.12"><b>    3.12</b></a>
-1   implementation
-    particular set of software, running in a particular translation environment under particular
-    control options, that performs translation of programs for, and supports execution of
-    functions in, a particular execution environment
-<a name="3.13" href="#3.13"><b>    3.13</b></a>
-1   implementation limit
-    restriction imposed upon programs by the implementation
-<a name="3.14" href="#3.14"><b>    3.14</b></a>
-1   object
-    region of data storage in the execution environment, the contents of which can represent
-    values
-
-[<a name="p5" href="#p5">page 5</a>] (<a href="#Contents">Contents</a>)
-
-2   NOTE     When referenced, an object may be interpreted as having a particular type; see <a href="#6.3.2.1">6.3.2.1</a>.
-
-<a name="3.15" href="#3.15"><b>    3.15</b></a>
-1   parameter
-    formal parameter
-    formal argument (deprecated)
-    object declared as part of a function declaration or definition that acquires a value on
-    entry to the function, or an identifier from the comma-separated list bounded by the
-    parentheses immediately following the macro name in a function-like macro definition
-<a name="3.16" href="#3.16"><b>    3.16</b></a>
-1   recommended practice
-    specification that is strongly recommended as being in keeping with the intent of the
-    standard, but that may be impractical for some implementations
-<a name="3.17" href="#3.17"><b>    3.17</b></a>
-1   value
-    precise meaning of the contents of an object when interpreted as having a specific type
-<a name="3.17.1" href="#3.17.1"><b>    3.17.1</b></a>
-1   implementation-defined value
-    unspecified value where each implementation documents how the choice is made
-<a name="3.17.2" href="#3.17.2"><b>    3.17.2</b></a>
-1   indeterminate value
-    either an unspecified value or a trap representation
-<a name="3.17.3" href="#3.17.3"><b>    3.17.3</b></a>
-1   unspecified value
-    valid value of the relevant type where this International Standard imposes no
-    requirements on which value is chosen in any instance
-2   NOTE     An unspecified value cannot be a trap representation.
-
-<a name="3.18" href="#3.18"><b>    3.18</b></a>
-1   ??? x???
-    ceiling of x: the least integer greater than or equal to x
-2   EXAMPLE       ???2.4??? is 3, ???-2.4??? is -2.
-
-<a name="3.19" href="#3.19"><b>    3.19</b></a>
-1   ??? x???
-    floor of x: the greatest integer less than or equal to x
-2   EXAMPLE       ???2.4??? is 2, ???-2.4??? is -3.
-
-
-
-
-[<a name="p6" href="#p6">page 6</a>] (<a href="#Contents">Contents</a>)
-
-
-<a name="4" href="#4"><b>    4. Conformance</b></a>
-1   In this International Standard, ''shall'' is to be interpreted as a requirement on an
-    implementation or on a program; conversely, ''shall not'' is to be interpreted as a
-    prohibition.
-2   If a ''shall'' or ''shall not'' requirement that appears outside of a constraint is violated, the
-    behavior is undefined. Undefined behavior is otherwise indicated in this International
-    Standard by the words ''undefined behavior'' or by the omission of any explicit definition
-    of behavior. There is no difference in emphasis among these three; they all describe
-    ''behavior that is undefined''.
-3   A program that is correct in all other aspects, operating on correct data, containing
-    unspecified behavior shall be a correct program and act in accordance with <a href="#5.1.2.3">5.1.2.3</a>.
-4   The implementation shall not successfully translate a preprocessing translation unit
-    containing a #error preprocessing directive unless it is part of a group skipped by
-    conditional inclusion.
-5   A strictly conforming program shall use only those features of the language and library
-    specified in this International Standard.2) It shall not produce output dependent on any
-    unspecified, undefined, or implementation-defined behavior, and shall not exceed any
-    minimum implementation limit.
-6   The two forms of conforming implementation are hosted and freestanding. A conforming
-    hosted implementation shall accept any strictly conforming program. A conforming
-    freestanding implementation shall accept any strictly conforming program that does not
-    use complex types and in which the use of the features specified in the library clause
-    (clause 7) is confined to the contents of the standard headers <a href="#7.7">&lt;float.h&gt;</a>,
-    <a href="#7.9">&lt;iso646.h&gt;</a>, <a href="#7.10">&lt;limits.h&gt;</a>, <a href="#7.15">&lt;stdarg.h&gt;</a>, <a href="#7.16">&lt;stdbool.h&gt;</a>, <a href="#7.17">&lt;stddef.h&gt;</a>, and
-    <a href="#7.18">&lt;stdint.h&gt;</a>. A conforming implementation may have extensions (including additional
-    library functions), provided they do not alter the behavior of any strictly conforming
-    program.3)
-
-
-
-    2)   A strictly conforming program can use conditional features (such as those in <a href="#F">annex F</a>) provided the
-         use is guarded by a #ifdef directive with the appropriate macro. For example:
-                 #ifdef __STDC_IEC_559__ /* FE_UPWARD defined */
-                    /* ... */
-                    fesetround(FE_UPWARD);
-                    /* ... */
-                 #endif
-
-    3)   This implies that a conforming implementation reserves no identifiers other than those explicitly
-         reserved in this International Standard.
-
-[<a name="p7" href="#p7">page 7</a>] (<a href="#Contents">Contents</a>)
-
-7   A conforming program is one that is acceptable to a conforming implementation.4)
-8   An implementation shall be accompanied by a document that defines all implementation-
-    defined and locale-specific characteristics and all extensions.
-    Forward references: conditional inclusion (<a href="#6.10.1">6.10.1</a>), error directive (<a href="#6.10.5">6.10.5</a>),
-    characteristics of floating types <a href="#7.7">&lt;float.h&gt;</a> (<a href="#7.7">7.7</a>), alternative spellings <a href="#7.9">&lt;iso646.h&gt;</a>
-    (<a href="#7.9">7.9</a>), sizes of integer types <a href="#7.10">&lt;limits.h&gt;</a> (<a href="#7.10">7.10</a>), variable arguments <a href="#7.15">&lt;stdarg.h&gt;</a>
-    (<a href="#7.15">7.15</a>), boolean type and values <a href="#7.16">&lt;stdbool.h&gt;</a> (<a href="#7.16">7.16</a>), common definitions
-    <a href="#7.17">&lt;stddef.h&gt;</a> (<a href="#7.17">7.17</a>), integer types <a href="#7.18">&lt;stdint.h&gt;</a> (<a href="#7.18">7.18</a>).
-
-
-
-
-    4)   Strictly conforming programs are intended to be maximally portable among conforming
-         implementations. Conforming programs may depend upon nonportable features of a conforming
-         implementation.
-
-[<a name="p8" href="#p8">page 8</a>] (<a href="#Contents">Contents</a>)
-
-
-<a name="5" href="#5"><b>    5. Environment</b></a>
-1   An implementation translates C source files and executes C programs in two data-
-    processing-system environments, which will be called the translation environment and
-    the execution environment in this International Standard. Their characteristics define and
-    constrain the results of executing conforming C programs constructed according to the
-    syntactic and semantic rules for conforming implementations.
-    Forward references: In this clause, only a few of many possible forward references
-    have been noted.
-<a name="5.1" href="#5.1"><b>    5.1 Conceptual models</b></a>
-<a name="5.1.1" href="#5.1.1"><b>    5.1.1 Translation environment</b></a>
-<a name="5.1.1.1" href="#5.1.1.1"><b>    5.1.1.1 Program structure</b></a>
-1   A C program need not all be translated at the same time. The text of the program is kept
-    in units called source files, (or preprocessing files) in this International Standard. A
-    source file together with all the headers and source files included via the preprocessing
-    directive #include is known as a preprocessing translation unit. After preprocessing, a
-    preprocessing translation unit is called a translation unit. Previously translated translation
-    units may be preserved individually or in libraries. The separate translation units of a
-    program communicate by (for example) calls to functions whose identifiers have external
-    linkage, manipulation of objects whose identifiers have external linkage, or manipulation
-    of data files. Translation units may be separately translated and then later linked to
-    produce an executable program.
-    Forward references: linkages of identifiers (<a href="#6.2.2">6.2.2</a>), external definitions (<a href="#6.9">6.9</a>),
-    preprocessing directives (<a href="#6.10">6.10</a>).
-<a name="5.1.1.2" href="#5.1.1.2"><b>    5.1.1.2 Translation phases</b></a>
-1   The precedence among the syntax rules of translation is specified by the following
-    phases.5)
-         1. Physical source file multibyte characters are mapped, in an implementation-
-            defined manner, to the source character set (introducing new-line characters for
-            end-of-line indicators) if necessary. Trigraph sequences are replaced by
-            corresponding single-character internal representations.
-
-
-
-    5)    Implementations shall behave as if these separate phases occur, even though many are typically folded
-          together in practice. Source files, translation units, and translated translation units need not
-          necessarily be stored as files, nor need there be any one-to-one correspondence between these entities
-          and any external representation. The description is conceptual only, and does not specify any
-          particular implementation.
-
-[<a name="p9" href="#p9">page 9</a>] (<a href="#Contents">Contents</a>)
-
-     2. Each instance of a backslash character (\) immediately followed by a new-line
-        character is deleted, splicing physical source lines to form logical source lines.
-        Only the last backslash on any physical source line shall be eligible for being part
-        of such a splice. A source file that is not empty shall end in a new-line character,
-        which shall not be immediately preceded by a backslash character before any such
-        splicing takes place.
-     3. The source file is decomposed into preprocessing tokens6) and sequences of
-        white-space characters (including comments). A source file shall not end in a
-        partial preprocessing token or in a partial comment. Each comment is replaced by
-        one space character. New-line characters are retained. Whether each nonempty
-        sequence of white-space characters other than new-line is retained or replaced by
-        one space character is implementation-defined.
-     4.   Preprocessing directives are executed, macro invocations are expanded, and
-          _Pragma unary operator expressions are executed. If a character sequence that
-          matches the syntax of a universal character name is produced by token
-          concatenation (<a href="#6.10.3.3">6.10.3.3</a>), the behavior is undefined. A #include preprocessing
-          directive causes the named header or source file to be processed from phase 1
-          through phase 4, recursively. All preprocessing directives are then deleted.
-     5.   Each source character set member and escape sequence in character constants and
-          string literals is converted to the corresponding member of the execution character
-          set; if there is no corresponding member, it is converted to an implementation-
-          defined member other than the null (wide) character.7)
-     6. Adjacent string literal tokens are concatenated.
-     7. White-space characters separating tokens are no longer significant. Each
-        preprocessing token is converted into a token. The resulting tokens are
-        syntactically and semantically analyzed and translated as a translation unit.
-     8. All external object and function references are resolved. Library components are
-        linked to satisfy external references to functions and objects not defined in the
-        current translation. All such translator output is collected into a program image
-        which contains information needed for execution in its execution environment.
-Forward references: universal character names (<a href="#6.4.3">6.4.3</a>), lexical elements (<a href="#6.4">6.4</a>),
-preprocessing directives (<a href="#6.10">6.10</a>), trigraph sequences (<a href="#5.2.1.1">5.2.1.1</a>), external definitions (<a href="#6.9">6.9</a>).
-
-
-
-6)    As described in <a href="#6.4">6.4</a>, the process of dividing a source file's characters into preprocessing tokens is
-      context-dependent. For example, see the handling of &lt; within a #include preprocessing directive.
-7)    An implementation need not convert all non-corresponding source characters to the same execution
-      character.
-
-[<a name="p10" href="#p10">page 10</a>] (<a href="#Contents">Contents</a>)
-
-<a name="5.1.1.3" href="#5.1.1.3"><b>    5.1.1.3 Diagnostics</b></a>
-1   A conforming implementation shall produce at least one diagnostic message (identified in
-    an implementation-defined manner) if a preprocessing translation unit or translation unit
-    contains a violation of any syntax rule or constraint, even if the behavior is also explicitly
-    specified as undefined or implementation-defined. Diagnostic messages need not be
-    produced in other circumstances.8)
-2   EXAMPLE        An implementation shall issue a diagnostic for the translation unit:
-             char i;
-             int i;
-    because in those cases where wording in this International Standard describes the behavior for a construct
-    as being both a constraint error and resulting in undefined behavior, the constraint error shall be diagnosed.
-
-<a name="5.1.2" href="#5.1.2"><b>    5.1.2 Execution environments</b></a>
-1   Two execution environments are defined: freestanding and hosted. In both cases,
-    program startup occurs when a designated C function is called by the execution
-    environment. All objects with static storage duration shall be initialized (set to their
-    initial values) before program startup. The manner and timing of such initialization are
-    otherwise unspecified. Program termination returns control to the execution
-    environment.
-    Forward references: storage durations of objects (<a href="#6.2.4">6.2.4</a>), initialization (<a href="#6.7.8">6.7.8</a>).
-<a name="5.1.2.1" href="#5.1.2.1"><b>    5.1.2.1 Freestanding environment</b></a>
-1   In a freestanding environment (in which C program execution may take place without any
-    benefit of an operating system), the name and type of the function called at program
-    startup are implementation-defined. Any library facilities available to a freestanding
-    program, other than the minimal set required by clause 4, are implementation-defined.
-2   The effect of program termination in a freestanding environment is implementation-
-    defined.
-<a name="5.1.2.2" href="#5.1.2.2"><b>    5.1.2.2 Hosted environment</b></a>
-1   A hosted environment need not be provided, but shall conform to the following
-    specifications if present.
-
-
-
-
-    8)   The intent is that an implementation should identify the nature of, and where possible localize, each
-         violation. Of course, an implementation is free to produce any number of diagnostics as long as a
-         valid program is still correctly translated. It may also successfully translate an invalid program.
-
-[<a name="p11" href="#p11">page 11</a>] (<a href="#Contents">Contents</a>)
-
-<a name="5.1.2.2.1" href="#5.1.2.2.1"><b>    5.1.2.2.1 Program startup</b></a>
-1   The function called at program startup is named main. The implementation declares no
-    prototype for this function. It shall be defined with a return type of int and with no
-    parameters:
-            int main(void) { /* ... */ }
-    or with two parameters (referred to here as argc and argv, though any names may be
-    used, as they are local to the function in which they are declared):
-            int main(int argc, char *argv[]) { /* ... */ }
-    or equivalent;9) or in some other implementation-defined manner.
-2   If they are declared, the parameters to the main function shall obey the following
-    constraints:
-    -- The value of argc shall be nonnegative.
-    -- argv[argc] shall be a null pointer.
-    -- If the value of argc is greater than zero, the array members argv[0] through
-      argv[argc-1] inclusive shall contain pointers to strings, which are given
-      implementation-defined values by the host environment prior to program startup. The
-      intent is to supply to the program information determined prior to program startup
-      from elsewhere in the hosted environment. If the host environment is not capable of
-      supplying strings with letters in both uppercase and lowercase, the implementation
-      shall ensure that the strings are received in lowercase.
-    -- If the value of argc is greater than zero, the string pointed to by argv[0]
-      represents the program name; argv[0][0] shall be the null character if the
-      program name is not available from the host environment. If the value of argc is
-      greater than one, the strings pointed to by argv[1] through argv[argc-1]
-      represent the program parameters.
-    -- The parameters argc and argv and the strings pointed to by the argv array shall
-      be modifiable by the program, and retain their last-stored values between program
-      startup and program termination.
-<a name="5.1.2.2.2" href="#5.1.2.2.2"><b>    5.1.2.2.2 Program execution</b></a>
-1   In a hosted environment, a program may use all the functions, macros, type definitions,
-    and objects described in the library clause (clause 7).
-
-
-
-    9)   Thus, int can be replaced by a typedef name defined as int, or the type of argv can be written as
-         char ** argv, and so on.
-
-[<a name="p12" href="#p12">page 12</a>] (<a href="#Contents">Contents</a>)
-
-<a name="5.1.2.2.3" href="#5.1.2.2.3"><b>    5.1.2.2.3 Program termination</b></a>
-1   If the return type of the main function is a type compatible with int, a return from the
-    initial call to the main function is equivalent to calling the exit function with the value
-    returned by the main function as its argument;10) reaching the } that terminates the
-    main function returns a value of 0. If the return type is not compatible with int, the
-    termination status returned to the host environment is unspecified.
-    Forward references: definition of terms (<a href="#7.1.1">7.1.1</a>), the exit function (<a href="#7.20.4.3">7.20.4.3</a>).
-<a name="5.1.2.3" href="#5.1.2.3"><b>    5.1.2.3 Program execution</b></a>
-1   The semantic descriptions in this International Standard describe the behavior of an
-    abstract machine in which issues of optimization are irrelevant.
-2   Accessing a volatile object, modifying an object, modifying a file, or calling a function
-    that does any of those operations are all side effects,11) which are changes in the state of
-    the execution environment. Evaluation of an expression may produce side effects. At
-    certain specified points in the execution sequence called sequence points, all side effects
-    of previous evaluations shall be complete and no side effects of subsequent evaluations
-    shall have taken place. (A summary of the sequence points is given in <a href="#C">annex C</a>.)
-3   In the abstract machine, all expressions are evaluated as specified by the semantics. An
-    actual implementation need not evaluate part of an expression if it can deduce that its
-    value is not used and that no needed side effects are produced (including any caused by
-    calling a function or accessing a volatile object).
-4   When the processing of the abstract machine is interrupted by receipt of a signal, only the
-    values of objects as of the previous sequence point may be relied on. Objects that may be
-    modified between the previous sequence point and the next sequence point need not have
-    received their correct values yet.
-5   The least requirements on a conforming implementation are:
-    -- At sequence points, volatile objects are stable in the sense that previous accesses are
-      complete and subsequent accesses have not yet occurred.
-
-
-
-
-    10) In accordance with <a href="#6.2.4">6.2.4</a>, the lifetimes of objects with automatic storage duration declared in main
-        will have ended in the former case, even where they would not have in the latter.
-    11) The IEC 60559 standard for binary floating-point arithmetic requires certain user-accessible status
-        flags and control modes. Floating-point operations implicitly set the status flags; modes affect result
-        values of floating-point operations. Implementations that support such floating-point state are
-        required to regard changes to it as side effects -- see <a href="#F">annex F</a> for details. The floating-point
-        environment library <a href="#7.6">&lt;fenv.h&gt;</a> provides a programming facility for indicating when these side
-        effects matter, freeing the implementations in other cases.
-
-[<a name="p13" href="#p13">page 13</a>] (<a href="#Contents">Contents</a>)
-
-     -- At program termination, all data written into files shall be identical to the result that
-       execution of the program according to the abstract semantics would have produced.
-     -- The input and output dynamics of interactive devices shall take place as specified in
-<a name="7.19.3" href="#7.19.3"><b>       7.19.3. The intent of these requirements is that unbuffered or line-buffered output</b></a>
-       appear as soon as possible, to ensure that prompting messages actually appear prior to
-       a program waiting for input.
-6    What constitutes an interactive device is implementation-defined.
-7    More stringent correspondences between abstract and actual semantics may be defined by
-     each implementation.
-8    EXAMPLE 1 An implementation might define a one-to-one correspondence between abstract and actual
-     semantics: at every sequence point, the values of the actual objects would agree with those specified by the
-     abstract semantics. The keyword volatile would then be redundant.
-9    Alternatively, an implementation might perform various optimizations within each translation unit, such
-     that the actual semantics would agree with the abstract semantics only when making function calls across
-     translation unit boundaries. In such an implementation, at the time of each function entry and function
-     return where the calling function and the called function are in different translation units, the values of all
-     externally linked objects and of all objects accessible via pointers therein would agree with the abstract
-     semantics. Furthermore, at the time of each such function entry the values of the parameters of the called
-     function and of all objects accessible via pointers therein would agree with the abstract semantics. In this
-     type of implementation, objects referred to by interrupt service routines activated by the signal function
-     would require explicit specification of volatile storage, as well as other implementation-defined
-     restrictions.
-
-10   EXAMPLE 2       In executing the fragment
-              char c1, c2;
-              /* ... */
-              c1 = c1 + c2;
-     the ''integer promotions'' require that the abstract machine promote the value of each variable to int size
-     and then add the two ints and truncate the sum. Provided the addition of two chars can be done without
-     overflow, or with overflow wrapping silently to produce the correct result, the actual execution need only
-     produce the same result, possibly omitting the promotions.
-
-11   EXAMPLE 3       Similarly, in the fragment
-              float f1, f2;
-              double d;
-              /* ... */
-              f1 = f2 * d;
-     the multiplication may be executed using single-precision arithmetic if the implementation can ascertain
-     that the result would be the same as if it were executed using double-precision arithmetic (for example, if d
-     were replaced by the constant 2.0, which has type double).
-
-
-
-
-[<a name="p14" href="#p14">page 14</a>] (<a href="#Contents">Contents</a>)
-
-12   EXAMPLE 4 Implementations employing wide registers have to take care to honor appropriate
-     semantics. Values are independent of whether they are represented in a register or in memory. For
-     example, an implicit spilling of a register is not permitted to alter the value. Also, an explicit store and load
-     is required to round to the precision of the storage type. In particular, casts and assignments are required to
-     perform their specified conversion. For the fragment
-              double d1, d2;
-              float f;
-              d1 = f = expression;
-              d2 = (float) expression;
-     the values assigned to d1 and d2 are required to have been converted to float.
-
-13   EXAMPLE 5 Rearrangement for floating-point expressions is often restricted because of limitations in
-     precision as well as range. The implementation cannot generally apply the mathematical associative rules
-     for addition or multiplication, nor the distributive rule, because of roundoff error, even in the absence of
-     overflow and underflow. Likewise, implementations cannot generally replace decimal constants in order to
-     rearrange expressions. In the following fragment, rearrangements suggested by mathematical rules for real
-     numbers are often not valid (see <a href="#F.8">F.8</a>).
-              double x, y, z;
-              /* ... */
-              x = (x * y) * z;            //   not equivalent to x   *= y * z;
-              z = (x - y) + y ;           //   not equivalent to z   = x;
-              z = x + x * y;              //   not equivalent to z   = x * (1.0 + y);
-              y = x / 5.0;                //   not equivalent to y   = x * 0.2;
-
-14   EXAMPLE 6 To illustrate the grouping behavior of expressions, in the following fragment
-              int a, b;
-              /* ... */
-              a = a + 32760 + b + 5;
-     the expression statement behaves exactly the same as
-              a = (((a + 32760) + b) + 5);
-     due to the associativity and precedence of these operators. Thus, the result of the sum (a + 32760) is
-     next added to b, and that result is then added to 5 which results in the value assigned to a. On a machine in
-     which overflows produce an explicit trap and in which the range of values representable by an int is
-     [-32768, +32767], the implementation cannot rewrite this expression as
-              a = ((a + b) + 32765);
-     since if the values for a and b were, respectively, -32754 and -15, the sum a + b would produce a trap
-     while the original expression would not; nor can the expression be rewritten either as
-              a = ((a + 32765) + b);
-     or
-              a = (a + (b + 32765));
-     since the values for a and b might have been, respectively, 4 and -8 or -17 and 12. However, on a machine
-     in which overflow silently generates some value and where positive and negative overflows cancel, the
-     above expression statement can be rewritten by the implementation in any of the above ways because the
-     same result will occur.
-
-
-
-
-[<a name="p15" href="#p15">page 15</a>] (<a href="#Contents">Contents</a>)
-
-15   EXAMPLE 7 The grouping of an expression does not completely determine its evaluation. In the
-     following fragment
-              #include <a href="#7.19">&lt;stdio.h&gt;</a>
-              int sum;
-              char *p;
-              /* ... */
-              sum = sum * 10 - '0' + (*p++ = getchar());
-     the expression statement is grouped as if it were written as
-              sum = (((sum * 10) - '0') + ((*(p++)) = (getchar())));
-     but the actual increment of p can occur at any time between the previous sequence point and the next
-     sequence point (the ;), and the call to getchar can occur at any point prior to the need of its returned
-     value.
-
-     Forward references: expressions (<a href="#6.5">6.5</a>), type qualifiers (<a href="#6.7.3">6.7.3</a>), statements (<a href="#6.8">6.8</a>), the
-     signal function (<a href="#7.14">7.14</a>), files (<a href="#7.19.3">7.19.3</a>).
-
-
-
-
-[<a name="p16" href="#p16">page 16</a>] (<a href="#Contents">Contents</a>)
-
-<a name="5.2" href="#5.2"><b>    5.2 Environmental considerations</b></a>
-<a name="5.2.1" href="#5.2.1"><b>    5.2.1 Character sets</b></a>
-1   Two sets of characters and their associated collating sequences shall be defined: the set in
-    which source files are written (the source character set), and the set interpreted in the
-    execution environment (the execution character set). Each set is further divided into a
-    basic character set, whose contents are given by this subclause, and a set of zero or more
-    locale-specific members (which are not members of the basic character set) called
-    extended characters. The combined set is also called the extended character set. The
-    values of the members of the execution character set are implementation-defined.
-2   In a character constant or string literal, members of the execution character set shall be
-    represented by corresponding members of the source character set or by escape
-    sequences consisting of the backslash \ followed by one or more characters. A byte with
-    all bits set to 0, called the null character, shall exist in the basic execution character set; it
-    is used to terminate a character string.
-3   Both the basic source and basic execution character sets shall have the following
-    members: the 26 uppercase letters of the Latin alphabet
-             A   B   C      D   E   F    G    H    I    J    K    L   M
-             N   O   P      Q   R   S    T    U    V    W    X    Y   Z
-    the 26 lowercase letters of the Latin alphabet
-             a   b   c      d   e   f    g    h    i    j    k    l   m
-             n   o   p      q   r   s    t    u    v    w    x    y   z
-    the 10 decimal digits
-             0   1   2      3   4   5    6    7    8    9
-    the following 29 graphic characters
-             !   "   #      %   &amp;   '    (    )    *    +    ,    -   .    /    :
-             ;   &lt;   =      &gt;   ?   [    \    ]    ^    _    {    |   }    ~
-    the space character, and control characters representing horizontal tab, vertical tab, and
-    form feed. The representation of each member of the source and execution basic
-    character sets shall fit in a byte. In both the source and execution basic character sets, the
-    value of each character after 0 in the above list of decimal digits shall be one greater than
-    the value of the previous. In source files, there shall be some way of indicating the end of
-    each line of text; this International Standard treats such an end-of-line indicator as if it
-    were a single new-line character. In the basic execution character set, there shall be
-    control characters representing alert, backspace, carriage return, and new line. If any
-    other characters are encountered in a source file (except in an identifier, a character
-    constant, a string literal, a header name, a comment, or a preprocessing token that is never
-
-[<a name="p17" href="#p17">page 17</a>] (<a href="#Contents">Contents</a>)
-
-    converted to a token), the behavior is undefined.
-4   A letter is an uppercase letter or a lowercase letter as defined above; in this International
-    Standard the term does not include other characters that are letters in other alphabets.
-5   The universal character name construct provides a way to name other characters.
-    Forward references: universal character names (<a href="#6.4.3">6.4.3</a>), character constants (<a href="#6.4.4.4">6.4.4.4</a>),
-    preprocessing directives (<a href="#6.10">6.10</a>), string literals (<a href="#6.4.5">6.4.5</a>), comments (<a href="#6.4.9">6.4.9</a>), string (<a href="#7.1.1">7.1.1</a>).
-<a name="5.2.1.1" href="#5.2.1.1"><b>    5.2.1.1 Trigraph sequences</b></a>
-1   Before any other processing takes place, each occurrence of one of the following
-    sequences of three characters (called trigraph sequences12)) is replaced with the
-    corresponding single character.
-           ??=      #                       ??)      ]                       ??!     |
-           ??(      [                       ??'      ^                       ??&gt;     }
-           ??/      \                       ??&lt;      {                       ??-     ~
-    No other trigraph sequences exist. Each ? that does not begin one of the trigraphs listed
-    above is not changed.
-2   EXAMPLE 1
-              ??=define arraycheck(a, b) a??(b??) ??!??! b??(a??)
-    becomes
-              #define arraycheck(a, b) a[b] || b[a]
-
-3   EXAMPLE 2      The following source line
-              printf("Eh???/n");
-    becomes (after replacement of the trigraph sequence ??/)
-              printf("Eh?\n");
-
-<a name="5.2.1.2" href="#5.2.1.2"><b>    5.2.1.2 Multibyte characters</b></a>
-1   The source character set may contain multibyte characters, used to represent members of
-    the extended character set. The execution character set may also contain multibyte
-    characters, which need not have the same encoding as for the source character set. For
-    both character sets, the following shall hold:
-    -- The basic character set shall be present and each character shall be encoded as a
-      single byte.
-    -- The presence, meaning, and representation of any additional members is locale-
-      specific.
-
-    12) The trigraph sequences enable the input of characters that are not defined in the Invariant Code Set as
-        described in ISO/IEC 646, which is a subset of the seven-bit US ASCII code set.
-
-[<a name="p18" href="#p18">page 18</a>] (<a href="#Contents">Contents</a>)
-
-    -- A multibyte character set may have a state-dependent encoding, wherein each
-      sequence of multibyte characters begins in an initial shift state and enters other
-      locale-specific shift states when specific multibyte characters are encountered in the
-      sequence. While in the initial shift state, all single-byte characters retain their usual
-      interpretation and do not alter the shift state. The interpretation for subsequent bytes
-      in the sequence is a function of the current shift state.
-    -- A byte with all bits zero shall be interpreted as a null character independent of shift
-      state. Such a byte shall not occur as part of any other multibyte character.
-2   For source files, the following shall hold:
-    -- An identifier, comment, string literal, character constant, or header name shall begin
-      and end in the initial shift state.
-    -- An identifier, comment, string literal, character constant, or header name shall consist
-      of a sequence of valid multibyte characters.
-<a name="5.2.2" href="#5.2.2"><b>    5.2.2 Character display semantics</b></a>
-1   The active position is that location on a display device where the next character output by
-    the fputc function would appear. The intent of writing a printing character (as defined
-    by the isprint function) to a display device is to display a graphic representation of
-    that character at the active position and then advance the active position to the next
-    position on the current line. The direction of writing is locale-specific. If the active
-    position is at the final position of a line (if there is one), the behavior of the display device
-    is unspecified.
-2   Alphabetic escape sequences representing nongraphic characters in the execution
-    character set are intended to produce actions on display devices as follows:
-    \a (alert) Produces an audible or visible alert without changing the active position.
-    \b (backspace) Moves the active position to the previous position on the current line. If
-       the active position is at the initial position of a line, the behavior of the display
-       device is unspecified.
-    \f ( form feed) Moves the active position to the initial position at the start of the next
-       logical page.
-    \n (new line) Moves the active position to the initial position of the next line.
-    \r (carriage return) Moves the active position to the initial position of the current line.
-    \t (horizontal tab) Moves the active position to the next horizontal tabulation position
-       on the current line. If the active position is at or past the last defined horizontal
-       tabulation position, the behavior of the display device is unspecified.
-    \v (vertical tab) Moves the active position to the initial position of the next vertical
-        tabulation position. If the active position is at or past the last defined vertical
-[<a name="p19" href="#p19">page 19</a>] (<a href="#Contents">Contents</a>)
-
-         tabulation position, the behavior of the display device is unspecified.
-3   Each of these escape sequences shall produce a unique implementation-defined value
-    which can be stored in a single char object. The external representations in a text file
-    need not be identical to the internal representations, and are outside the scope of this
-    International Standard.
-    Forward references: the isprint function (<a href="#7.4.1.8">7.4.1.8</a>), the fputc function (<a href="#7.19.7.3">7.19.7.3</a>).
-<a name="5.2.3" href="#5.2.3"><b>    5.2.3 Signals and interrupts</b></a>
-1   Functions shall be implemented such that they may be interrupted at any time by a signal,
-    or may be called by a signal handler, or both, with no alteration to earlier, but still active,
-    invocations' control flow (after the interruption), function return values, or objects with
-    automatic storage duration. All such objects shall be maintained outside the function
-    image (the instructions that compose the executable representation of a function) on a
-    per-invocation basis.
-<a name="5.2.4" href="#5.2.4"><b>    5.2.4 Environmental limits</b></a>
-1   Both the translation and execution environments constrain the implementation of
-    language translators and libraries. The following summarizes the language-related
-    environmental limits on a conforming implementation; the library-related limits are
-    discussed in clause 7.
-<a name="5.2.4.1" href="#5.2.4.1"><b>    5.2.4.1 Translation limits</b></a>
-1   The implementation shall be able to translate and execute at least one program that
-    contains at least one instance of every one of the following limits:13)
-    -- 127 nesting levels of blocks
-    -- 63 nesting levels of conditional inclusion
-    -- 12 pointer, array, and function declarators (in any combinations) modifying an
-      arithmetic, structure, union, or incomplete type in a declaration
-    -- 63 nesting levels of parenthesized declarators within a full declarator
-    -- 63 nesting levels of parenthesized expressions within a full expression
-    -- 63 significant initial characters in an internal identifier or a macro name (each
-      universal character name or extended source character is considered a single
-      character)
-    -- 31 significant initial characters in an external identifier (each universal character name
-      specifying a short identifier of 0000FFFF or less is considered 6 characters, each
-
-
-    13) Implementations should avoid imposing fixed translation limits whenever possible.
-
-[<a name="p20" href="#p20">page 20</a>] (<a href="#Contents">Contents</a>)
-
-        universal character name specifying a short identifier of 00010000 or more is
-        considered 10 characters, and each extended source character is considered the same
-        number of characters as the corresponding universal character name, if any)14)
-    -- 4095 external identifiers in one translation unit
-    -- 511 identifiers with block scope declared in one block
-    -- 4095 macro identifiers simultaneously defined in one preprocessing translation unit
-    -- 127 parameters in one function definition
-    -- 127 arguments in one function call
-    -- 127 parameters in one macro definition
-    -- 127 arguments in one macro invocation
-    -- 4095 characters in a logical source line
-    -- 4095 characters in a character string literal or wide string literal (after concatenation)
-    -- 65535 bytes in an object (in a hosted environment only)
-    -- 15 nesting levels for #included files
-    -- 1023 case labels for a switch statement (excluding those for any nested switch
-      statements)
-    -- 1023 members in a single structure or union
-    -- 1023 enumeration constants in a single enumeration
-    -- 63 levels of nested structure or union definitions in a single struct-declaration-list
-<a name="5.2.4.2" href="#5.2.4.2"><b>    5.2.4.2 Numerical limits</b></a>
-1   An implementation is required to document all the limits specified in this subclause,
-    which are specified in the headers <a href="#7.10">&lt;limits.h&gt;</a> and <a href="#7.7">&lt;float.h&gt;</a>. Additional limits are
-    specified in <a href="#7.18">&lt;stdint.h&gt;</a>.
-    Forward references: integer types <a href="#7.18">&lt;stdint.h&gt;</a> (<a href="#7.18">7.18</a>).
-<a name="5.2.4.2.1" href="#5.2.4.2.1"><b>    5.2.4.2.1 Sizes of integer types &lt;limits.h&gt;</b></a>
-1   The values given below shall be replaced by constant expressions suitable for use in #if
-    preprocessing directives. Moreover, except for CHAR_BIT and MB_LEN_MAX, the
-    following shall be replaced by expressions that have the same type as would an
-    expression that is an object of the corresponding type converted according to the integer
-    promotions. Their implementation-defined values shall be equal or greater in magnitude
-
-
-    14) See ''future language directions'' (<a href="#6.11.3">6.11.3</a>).
-
-[<a name="p21" href="#p21">page 21</a>] (<a href="#Contents">Contents</a>)
-
-(absolute value) to those shown, with the same sign.
--- number of bits for smallest object that is not a bit-field (byte)
-  CHAR_BIT                                            8
--- minimum value for an object of type signed char
-  SCHAR_MIN                                -127 // -(27 - 1)
--- maximum value for an object of type signed char
-  SCHAR_MAX                                +127 // 27 - 1
--- maximum value for an object of type unsigned char
-  UCHAR_MAX                                 255 // 28 - 1
--- minimum value for an object of type char
-  CHAR_MIN                               see below
--- maximum value for an object of type char
-  CHAR_MAX                              see below
--- maximum number of bytes in a multibyte character, for any supported locale
-  MB_LEN_MAX                                    1
--- minimum value for an object of type short int
-  SHRT_MIN                               -32767 // -(215 - 1)
--- maximum value for an object of type short int
-  SHRT_MAX                               +32767 // 215 - 1
--- maximum value for an object of type unsigned short int
-  USHRT_MAX                               65535 // 216 - 1
--- minimum value for an object of type int
-  INT_MIN                                 -32767 // -(215 - 1)
--- maximum value for an object of type int
-  INT_MAX                                +32767 // 215 - 1
--- maximum value for an object of type unsigned int
-  UINT_MAX                                65535 // 216 - 1
--- minimum value for an object of type long int
-  LONG_MIN                         -2147483647 // -(231 - 1)
--- maximum value for an object of type long int
-  LONG_MAX                         +2147483647 // 231 - 1
--- maximum value for an object of type unsigned long int
-  ULONG_MAX                         4294967295 // 232 - 1
-
-
-[<a name="p22" href="#p22">page 22</a>] (<a href="#Contents">Contents</a>)
-
-    -- minimum value for an object of type long long int
-      LLONG_MIN          -9223372036854775807 // -(263 - 1)
-    -- maximum value for an object of type long long int
-      LLONG_MAX          +9223372036854775807 // 263 - 1
-    -- maximum value for an object of type unsigned long long int
-      ULLONG_MAX         18446744073709551615 // 264 - 1
-2   If the value of an object of type char is treated as a signed integer when used in an
-    expression, the value of CHAR_MIN shall be the same as that of SCHAR_MIN and the
-    value of CHAR_MAX shall be the same as that of SCHAR_MAX. Otherwise, the value of
-    CHAR_MIN shall be 0 and the value of CHAR_MAX shall be the same as that of
-    UCHAR_MAX.15) The value UCHAR_MAX shall equal 2CHAR_BIT - 1.
-    Forward references: representations of types (<a href="#6.2.6">6.2.6</a>), conditional inclusion (<a href="#6.10.1">6.10.1</a>).
-<a name="5.2.4.2.2" href="#5.2.4.2.2"><b>    5.2.4.2.2 Characteristics of floating types &lt;float.h&gt;</b></a>
-1   The characteristics of floating types are defined in terms of a model that describes a
-    representation of floating-point numbers and values that provide information about an
-    implementation's floating-point arithmetic.16) The following parameters are used to
-    define the model for each floating-point type:
-           s          sign ((+-)1)
-           b          base or radix of exponent representation (an integer &gt; 1)
-           e          exponent (an integer between a minimum emin and a maximum emax )
-           p          precision (the number of base-b digits in the significand)
-            fk        nonnegative integers less than b (the significand digits)
-2   A floating-point number (x) is defined by the following model:
-                       p
-           x = sb e   (Sum) f k b-k ,
-                      k=1
-                                     emin &lt;= e &lt;= emax
-
-3   In addition to normalized floating-point numbers ( f 1 &gt; 0 if x != 0), floating types may be
-    able to contain other kinds of floating-point numbers, such as subnormal floating-point
-    numbers (x != 0, e = emin , f 1 = 0) and unnormalized floating-point numbers (x != 0,
-    e &gt; emin , f 1 = 0), and values that are not floating-point numbers, such as infinities and
-    NaNs. A NaN is an encoding signifying Not-a-Number. A quiet NaN propagates
-    through almost every arithmetic operation without raising a floating-point exception; a
-    signaling NaN generally raises a floating-point exception when occurring as an
-
-
-    15) See <a href="#6.2.5">6.2.5</a>.
-    16) The floating-point model is intended to clarify the description of each floating-point characteristic and
-        does not require the floating-point arithmetic of the implementation to be identical.
-
-[<a name="p23" href="#p23">page 23</a>] (<a href="#Contents">Contents</a>)
-
-    arithmetic operand.17)
-4   An implementation may give zero and non-numeric values (such as infinities and NaNs) a
-    sign or may leave them unsigned. Wherever such values are unsigned, any requirement
-    in this International Standard to retrieve the sign shall produce an unspecified sign, and
-    any requirement to set the sign shall be ignored.
-5   The accuracy of the floating-point operations (+, -, *, /) and of the library functions in
-    <a href="#7.12">&lt;math.h&gt;</a> and <a href="#7.3">&lt;complex.h&gt;</a> that return floating-point results is implementation-
-    defined, as is the accuracy of the conversion between floating-point internal
-    representations and string representations performed by the library functions in
-    <a href="#7.19">&lt;stdio.h&gt;</a>, <a href="#7.20">&lt;stdlib.h&gt;</a>, and <a href="#7.24">&lt;wchar.h&gt;</a>. The implementation may state that the
-    accuracy is unknown.
-6   All integer values in the <a href="#7.7">&lt;float.h&gt;</a> header, except FLT_ROUNDS, shall be constant
-    expressions suitable for use in #if preprocessing directives; all floating values shall be
-    constant expressions. All except DECIMAL_DIG, FLT_EVAL_METHOD, FLT_RADIX,
-    and FLT_ROUNDS have separate names for all three floating-point types. The floating-
-    point model representation is provided for all values except FLT_EVAL_METHOD and
-    FLT_ROUNDS.
-7   The rounding mode for floating-point addition is characterized by the implementation-
-    defined value of FLT_ROUNDS:18)
-          -1      indeterminable
-           0      toward zero
-           1      to nearest
-           2      toward positive infinity
-           3      toward negative infinity
-    All other values for FLT_ROUNDS characterize implementation-defined rounding
-    behavior.
-8   Except for assignment and cast (which remove all extra range and precision), the values
-    of operations with floating operands and values subject to the usual arithmetic
-    conversions and of floating constants are evaluated to a format whose range and precision
-    may be greater than required by the type. The use of evaluation formats is characterized
-    by the implementation-defined value of FLT_EVAL_METHOD:19)
-
-
-
-    17) IEC 60559:1989 specifies quiet and signaling NaNs. For implementations that do not support
-        IEC 60559:1989, the terms quiet NaN and signaling NaN are intended to apply to encodings with
-        similar behavior.
-    18) Evaluation of FLT_ROUNDS correctly reflects any execution-time change of rounding mode through
-        the function fesetround in <a href="#7.6">&lt;fenv.h&gt;</a>.
-
-[<a name="p24" href="#p24">page 24</a>] (<a href="#Contents">Contents</a>)
-
-           -1        indeterminable;
-            0        evaluate all operations and constants just to the range and precision of the
-                     type;
-            1        evaluate operations and constants of type float and double to the
-                     range and precision of the double type, evaluate long double
-                     operations and constants to the range and precision of the long double
-                     type;
-            2        evaluate all operations and constants to the range and precision of the
-                     long double type.
-    All other negative values for FLT_EVAL_METHOD characterize implementation-defined
-    behavior.
-9   The values given in the following list shall be replaced by constant expressions with
-    implementation-defined values that are greater or equal in magnitude (absolute value) to
-    those shown, with the same sign:
-    -- radix of exponent representation, b
-      FLT_RADIX                                                 2
-    -- number of base-FLT_RADIX digits in the floating-point significand, p
-        FLT_MANT_DIG
-        DBL_MANT_DIG
-        LDBL_MANT_DIG
-    -- number of decimal digits, n, such that any floating-point number in the widest
-      supported floating type with pmax radix b digits can be rounded to a floating-point
-      number with n decimal digits and back again without change to the value,
-           ??? pmax log10 b       if b is a power of 10
-           ???
-           ??? ???1 + pmax log10 b??? otherwise
-        DECIMAL_DIG                                            10
-    -- number of decimal digits, q, such that any floating-point number with q decimal digits
-      can be rounded into a floating-point number with p radix b digits and back again
-      without change to the q decimal digits,
-
-
-
-
-    19) The evaluation method determines evaluation formats of expressions involving all floating types, not
-        just real types. For example, if FLT_EVAL_METHOD is 1, then the product of two float
-        _Complex operands is represented in the double _Complex format, and its parts are evaluated to
-        double.
-
-[<a name="p25" href="#p25">page 25</a>] (<a href="#Contents">Contents</a>)
-
-            ??? p log10 b          if b is a power of 10
-            ???
-            ??? ???( p - 1) log10 b??? otherwise
-        FLT_DIG                                         6
-        DBL_DIG                                        10
-        LDBL_DIG                                       10
-     -- minimum negative integer such that FLT_RADIX raised to one less than that power is
-       a normalized floating-point number, emin
-        FLT_MIN_EXP
-        DBL_MIN_EXP
-        LDBL_MIN_EXP
-     -- minimum negative integer such that 10 raised to that power is in the range of
-       normalized floating-point numbers, ???log10 b emin -1 ???
-                                         ???                ???
-       FLT_MIN_10_EXP                                 -37
-       DBL_MIN_10_EXP                                 -37
-       LDBL_MIN_10_EXP                                -37
-     -- maximum integer such that FLT_RADIX raised to one less than that power is a
-       representable finite floating-point number, emax
-        FLT_MAX_EXP
-        DBL_MAX_EXP
-        LDBL_MAX_EXP
-     -- maximum integer such that 10 raised to that power is in the range of representable
-       finite floating-point numbers, ???log10 ((1 - b- p )b emax )???
-        FLT_MAX_10_EXP                                 +37
-        DBL_MAX_10_EXP                                 +37
-        LDBL_MAX_10_EXP                                +37
-10   The values given in the following list shall be replaced by constant expressions with
-     implementation-defined values that are greater than or equal to those shown:
-     -- maximum representable finite floating-point number, (1 - b- p )b emax
-        FLT_MAX                                     1E+37
-        DBL_MAX                                     1E+37
-        LDBL_MAX                                    1E+37
-11   The values given in the following list shall be replaced by constant expressions with
-     implementation-defined (positive) values that are less than or equal to those shown:
-     -- the difference between 1 and the least value greater than 1 that is representable in the
-        given floating point type, b1- p
-[<a name="p26" href="#p26">page 26</a>] (<a href="#Contents">Contents</a>)
-
-         FLT_EPSILON                                         1E-5
-         DBL_EPSILON                                         1E-9
-         LDBL_EPSILON                                        1E-9
-     -- minimum normalized positive floating-point number, b emin -1
-         FLT_MIN                                            1E-37
-         DBL_MIN                                            1E-37
-         LDBL_MIN                                           1E-37
-     Recommended practice
-12   Conversion from (at least) double to decimal with DECIMAL_DIG digits and back
-     should be the identity function.
-13   EXAMPLE 1 The following describes an artificial floating-point representation that meets the minimum
-     requirements of this International Standard, and the appropriate values in a <a href="#7.7">&lt;float.h&gt;</a> header for type
-     float:
-                        6
-           x = s16e    (Sum) f k 16-k ,
-                       k=1
-                                       -31 &lt;= e &lt;= +32
-
-             FLT_RADIX                                  16
-             FLT_MANT_DIG                                6
-             FLT_EPSILON                   9.53674316E-07F
-             FLT_DIG                                     6
-             FLT_MIN_EXP                               -31
-             FLT_MIN                       2.93873588E-39F
-             FLT_MIN_10_EXP                            -38
-             FLT_MAX_EXP                               +32
-             FLT_MAX                       3.40282347E+38F
-             FLT_MAX_10_EXP                            +38
-
-14   EXAMPLE 2 The following describes floating-point representations that also meet the requirements for
-     single-precision and double-precision normalized numbers in IEC 60559,20) and the appropriate values in a
-     <a href="#7.7">&lt;float.h&gt;</a> header for types float and double:
-                       24
-           x f = s2e   (Sum) f k 2-k ,
-                       k=1
-                                      -125 &lt;= e &lt;= +128
-
-                       53
-           x d = s2e   (Sum) f k 2-k ,
-                       k=1
-                                      -1021 &lt;= e &lt;= +1024
-
-             FLT_RADIX                                   2
-             DECIMAL_DIG                                17
-             FLT_MANT_DIG                               24
-             FLT_EPSILON                   1.19209290E-07F // decimal constant
-             FLT_EPSILON                          0X1P-23F // hex constant
-
-
-     20) The floating-point model in that standard sums powers of b from zero, so the values of the exponent
-         limits are one less than shown here.
-
-[<a name="p27" href="#p27">page 27</a>] (<a href="#Contents">Contents</a>)
-
-        FLT_DIG                           6
-        FLT_MIN_EXP                    -125
-        FLT_MIN             1.17549435E-38F               // decimal constant
-        FLT_MIN                   0X1P-126F               // hex constant
-        FLT_MIN_10_EXP                  -37
-        FLT_MAX_EXP                    +128
-        FLT_MAX             3.40282347E+38F               // decimal constant
-        FLT_MAX             0X1.fffffeP127F               // hex constant
-        FLT_MAX_10_EXP                  +38
-        DBL_MANT_DIG                     53
-        DBL_EPSILON 2.2204460492503131E-16                // decimal constant
-        DBL_EPSILON                 0X1P-52               // hex constant
-        DBL_DIG                          15
-        DBL_MIN_EXP                   -1021
-        DBL_MIN     2.2250738585072014E-308               // decimal constant
-        DBL_MIN                   0X1P-1022               // hex constant
-        DBL_MIN_10_EXP                 -307
-        DBL_MAX_EXP                   +1024
-        DBL_MAX     1.7976931348623157E+308               // decimal constant
-        DBL_MAX      0X1.fffffffffffffP1023               // hex constant
-        DBL_MAX_10_EXP                 +308
-If a type wider than double were supported, then DECIMAL_DIG would be greater than 17. For
-example, if the widest type were to use the minimal-width IEC 60559 double-extended format (64 bits of
-precision), then DECIMAL_DIG would be 21.
-
-Forward references:        conditional inclusion (<a href="#6.10.1">6.10.1</a>), complex arithmetic
-<a href="#7.3">&lt;complex.h&gt;</a> (<a href="#7.3">7.3</a>), extended multibyte and wide character utilities <a href="#7.24">&lt;wchar.h&gt;</a>
-(<a href="#7.24">7.24</a>), floating-point environment <a href="#7.6">&lt;fenv.h&gt;</a> (<a href="#7.6">7.6</a>), general utilities <a href="#7.20">&lt;stdlib.h&gt;</a>
-(<a href="#7.20">7.20</a>), input/output <a href="#7.19">&lt;stdio.h&gt;</a> (<a href="#7.19">7.19</a>), mathematics <a href="#7.12">&lt;math.h&gt;</a> (<a href="#7.12">7.12</a>).
-
-
-
-
-[<a name="p28" href="#p28">page 28</a>] (<a href="#Contents">Contents</a>)
-
-
-<a name="6" href="#6"><b>    6. Language</b></a>
-<a name="6.1" href="#6.1"><b>    6.1 Notation</b></a>
-1   In the syntax notation used in this clause, syntactic categories (nonterminals) are
-    indicated by italic type, and literal words and character set members (terminals) by bold
-    type. A colon (:) following a nonterminal introduces its definition. Alternative
-    definitions are listed on separate lines, except when prefaced by the words ''one of''. An
-    optional symbol is indicated by the subscript ''opt'', so that
-             { expressionopt }
-    indicates an optional expression enclosed in braces.
-2   When syntactic categories are referred to in the main text, they are not italicized and
-    words are separated by spaces instead of hyphens.
-3   A summary of the language syntax is given in <a href="#A">annex A</a>.
-<a name="6.2" href="#6.2"><b>    6.2 Concepts</b></a>
-<a name="6.2.1" href="#6.2.1"><b>    6.2.1 Scopes of identifiers</b></a>
-1   An identifier can denote an object; a function; a tag or a member of a structure, union, or
-    enumeration; a typedef name; a label name; a macro name; or a macro parameter. The
-    same identifier can denote different entities at different points in the program. A member
-    of an enumeration is called an enumeration constant. Macro names and macro
-    parameters are not considered further here, because prior to the semantic phase of
-    program translation any occurrences of macro names in the source file are replaced by the
-    preprocessing token sequences that constitute their macro definitions.
-2   For each different entity that an identifier designates, the identifier is visible (i.e., can be
-    used) only within a region of program text called its scope. Different entities designated
-    by the same identifier either have different scopes, or are in different name spaces. There
-    are four kinds of scopes: function, file, block, and function prototype. (A function
-    prototype is a declaration of a function that declares the types of its parameters.)
-3   A label name is the only kind of identifier that has function scope. It can be used (in a
-    goto statement) anywhere in the function in which it appears, and is declared implicitly
-    by its syntactic appearance (followed by a : and a statement).
-4   Every other identifier has scope determined by the placement of its declaration (in a
-    declarator or type specifier). If the declarator or type specifier that declares the identifier
-    appears outside of any block or list of parameters, the identifier has file scope, which
-    terminates at the end of the translation unit. If the declarator or type specifier that
-    declares the identifier appears inside a block or within the list of parameter declarations in
-    a function definition, the identifier has block scope, which terminates at the end of the
-    associated block. If the declarator or type specifier that declares the identifier appears
-[<a name="p29" href="#p29">page 29</a>] (<a href="#Contents">Contents</a>)
-
-    within the list of parameter declarations in a function prototype (not part of a function
-    definition), the identifier has function prototype scope, which terminates at the end of the
-    function declarator. If an identifier designates two different entities in the same name
-    space, the scopes might overlap. If so, the scope of one entity (the inner scope) will be a
-    strict subset of the scope of the other entity (the outer scope). Within the inner scope, the
-    identifier designates the entity declared in the inner scope; the entity declared in the outer
-    scope is hidden (and not visible) within the inner scope.
-5   Unless explicitly stated otherwise, where this International Standard uses the term
-    ''identifier'' to refer to some entity (as opposed to the syntactic construct), it refers to the
-    entity in the relevant name space whose declaration is visible at the point the identifier
-    occurs.
-6   Two identifiers have the same scope if and only if their scopes terminate at the same
-    point.
-7   Structure, union, and enumeration tags have scope that begins just after the appearance of
-    the tag in a type specifier that declares the tag. Each enumeration constant has scope that
-    begins just after the appearance of its defining enumerator in an enumerator list. Any
-    other identifier has scope that begins just after the completion of its declarator.
-    Forward references: declarations (<a href="#6.7">6.7</a>), function calls (<a href="#6.5.2.2">6.5.2.2</a>), function definitions
-    (<a href="#6.9.1">6.9.1</a>), identifiers (<a href="#6.4.2">6.4.2</a>), name spaces of identifiers (<a href="#6.2.3">6.2.3</a>), macro replacement (<a href="#6.10.3">6.10.3</a>),
-    source file inclusion (<a href="#6.10.2">6.10.2</a>), statements (<a href="#6.8">6.8</a>).
-<a name="6.2.2" href="#6.2.2"><b>    6.2.2 Linkages of identifiers</b></a>
-1   An identifier declared in different scopes or in the same scope more than once can be
-    made to refer to the same object or function by a process called linkage.21) There are
-    three kinds of linkage: external, internal, and none.
-2   In the set of translation units and libraries that constitutes an entire program, each
-    declaration of a particular identifier with external linkage denotes the same object or
-    function. Within one translation unit, each declaration of an identifier with internal
-    linkage denotes the same object or function. Each declaration of an identifier with no
-    linkage denotes a unique entity.
-3   If the declaration of a file scope identifier for an object or a function contains the storage-
-    class specifier static, the identifier has internal linkage.22)
-4   For an identifier declared with the storage-class specifier extern in a scope in which a
-
-
-
-    21) There is no linkage between different identifiers.
-    22) A function declaration can contain the storage-class specifier static only if it is at file scope; see
-        <a href="#6.7.1">6.7.1</a>.
-
-[<a name="p30" href="#p30">page 30</a>] (<a href="#Contents">Contents</a>)
-
-    prior declaration of that identifier is visible,23) if the prior declaration specifies internal or
-    external linkage, the linkage of the identifier at the later declaration is the same as the
-    linkage specified at the prior declaration. If no prior declaration is visible, or if the prior
-    declaration specifies no linkage, then the identifier has external linkage.
-5   If the declaration of an identifier for a function has no storage-class specifier, its linkage
-    is determined exactly as if it were declared with the storage-class specifier extern. If
-    the declaration of an identifier for an object has file scope and no storage-class specifier,
-    its linkage is external.
-6   The following identifiers have no linkage: an identifier declared to be anything other than
-    an object or a function; an identifier declared to be a function parameter; a block scope
-    identifier for an object declared without the storage-class specifier extern.
-7   If, within a translation unit, the same identifier appears with both internal and external
-    linkage, the behavior is undefined.
-    Forward references: declarations (<a href="#6.7">6.7</a>), expressions (<a href="#6.5">6.5</a>), external definitions (<a href="#6.9">6.9</a>),
-    statements (<a href="#6.8">6.8</a>).
-<a name="6.2.3" href="#6.2.3"><b>    6.2.3 Name spaces of identifiers</b></a>
-1   If more than one declaration of a particular identifier is visible at any point in a
-    translation unit, the syntactic context disambiguates uses that refer to different entities.
-    Thus, there are separate name spaces for various categories of identifiers, as follows:
-    -- label names (disambiguated by the syntax of the label declaration and use);
-    -- the tags of structures, unions, and enumerations (disambiguated by following any24)
-      of the keywords struct, union, or enum);
-    -- the members of structures or unions; each structure or union has a separate name
-      space for its members (disambiguated by the type of the expression used to access the
-      member via the . or -&gt; operator);
-    -- all other identifiers, called ordinary identifiers (declared in ordinary declarators or as
-      enumeration constants).
-    Forward references: enumeration specifiers (<a href="#6.7.2.2">6.7.2.2</a>), labeled statements (<a href="#6.8.1">6.8.1</a>),
-    structure and union specifiers (<a href="#6.7.2.1">6.7.2.1</a>), structure and union members (<a href="#6.5.2.3">6.5.2.3</a>), tags
-    (<a href="#6.7.2.3">6.7.2.3</a>), the goto statement (<a href="#6.8.6.1">6.8.6.1</a>).
-
-
-
-
-    23) As specified in <a href="#6.2.1">6.2.1</a>, the later declaration might hide the prior declaration.
-    24) There is only one name space for tags even though three are possible.
-
-[<a name="p31" href="#p31">page 31</a>] (<a href="#Contents">Contents</a>)
-
-<a name="6.2.4" href="#6.2.4"><b>    6.2.4 Storage durations of objects</b></a>
-1   An object has a storage duration that determines its lifetime. There are three storage
-    durations: static, automatic, and allocated. Allocated storage is described in <a href="#7.20.3">7.20.3</a>.
-2   The lifetime of an object is the portion of program execution during which storage is
-    guaranteed to be reserved for it. An object exists, has a constant address,25) and retains
-    its last-stored value throughout its lifetime.26) If an object is referred to outside of its
-    lifetime, the behavior is undefined. The value of a pointer becomes indeterminate when
-    the object it points to reaches the end of its lifetime.
-3   An object whose identifier is declared with external or internal linkage, or with the
-    storage-class specifier static has static storage duration. Its lifetime is the entire
-    execution of the program and its stored value is initialized only once, prior to program
-    startup.
-4   An object whose identifier is declared with no linkage and without the storage-class
-    specifier static has automatic storage duration.
-5   For such an object that does not have a variable length array type, its lifetime extends
-    from entry into the block with which it is associated until execution of that block ends in
-    any way. (Entering an enclosed block or calling a function suspends, but does not end,
-    execution of the current block.) If the block is entered recursively, a new instance of the
-    object is created each time. The initial value of the object is indeterminate. If an
-    initialization is specified for the object, it is performed each time the declaration is
-    reached in the execution of the block; otherwise, the value becomes indeterminate each
-    time the declaration is reached.
-6   For such an object that does have a variable length array type, its lifetime extends from
-    the declaration of the object until execution of the program leaves the scope of the
-    declaration.27) If the scope is entered recursively, a new instance of the object is created
-    each time. The initial value of the object is indeterminate.
-    Forward references: statements (<a href="#6.8">6.8</a>), function calls (<a href="#6.5.2.2">6.5.2.2</a>), declarators (<a href="#6.7.5">6.7.5</a>), array
-    declarators (<a href="#6.7.5.2">6.7.5.2</a>), initialization (<a href="#6.7.8">6.7.8</a>).
-
-
-
-
-    25) The term ''constant address'' means that two pointers to the object constructed at possibly different
-        times will compare equal. The address may be different during two different executions of the same
-        program.
-    26) In the case of a volatile object, the last store need not be explicit in the program.
-    27) Leaving the innermost block containing the declaration, or jumping to a point in that block or an
-        embedded block prior to the declaration, leaves the scope of the declaration.
-
-[<a name="p32" href="#p32">page 32</a>] (<a href="#Contents">Contents</a>)
-
-<a name="6.2.5" href="#6.2.5"><b>    6.2.5 Types</b></a>
-1   The meaning of a value stored in an object or returned by a function is determined by the
-    type of the expression used to access it. (An identifier declared to be an object is the
-    simplest such expression; the type is specified in the declaration of the identifier.) Types
-    are partitioned into object types (types that fully describe objects), function types (types
-    that describe functions), and incomplete types (types that describe objects but lack
-    information needed to determine their sizes).
-2   An object declared as type _Bool is large enough to store the values 0 and 1.
-3   An object declared as type char is large enough to store any member of the basic
-    execution character set. If a member of the basic execution character set is stored in a
-    char object, its value is guaranteed to be nonnegative. If any other character is stored in
-    a char object, the resulting value is implementation-defined but shall be within the range
-    of values that can be represented in that type.
-4   There are five standard signed integer types, designated as signed char, short
-    int, int, long int, and long long int. (These and other types may be
-    designated in several additional ways, as described in <a href="#6.7.2">6.7.2</a>.) There may also be
-    implementation-defined extended signed integer types.28) The standard and extended
-    signed integer types are collectively called signed integer types.29)
-5   An object declared as type signed char occupies the same amount of storage as a
-    ''plain'' char object. A ''plain'' int object has the natural size suggested by the
-    architecture of the execution environment (large enough to contain any value in the range
-    INT_MIN to INT_MAX as defined in the header <a href="#7.10">&lt;limits.h&gt;</a>).
-6   For each of the signed integer types, there is a corresponding (but different) unsigned
-    integer type (designated with the keyword unsigned) that uses the same amount of
-    storage (including sign information) and has the same alignment requirements. The type
-    _Bool and the unsigned integer types that correspond to the standard signed integer
-    types are the standard unsigned integer types. The unsigned integer types that
-    correspond to the extended signed integer types are the extended unsigned integer types.
-    The standard and extended unsigned integer types are collectively called unsigned integer
-    types.30)
-
-
-
-    28) Implementation-defined keywords shall have the form of an identifier reserved for any use as
-        described in <a href="#7.1.3">7.1.3</a>.
-    29) Therefore, any statement in this Standard about signed integer types also applies to the extended
-        signed integer types.
-    30) Therefore, any statement in this Standard about unsigned integer types also applies to the extended
-        unsigned integer types.
-
-[<a name="p33" href="#p33">page 33</a>] (<a href="#Contents">Contents</a>)
-
-7    The standard signed integer types and standard unsigned integer types are collectively
-     called the standard integer types, the extended signed integer types and extended
-     unsigned integer types are collectively called the extended integer types.
-8    For any two integer types with the same signedness and different integer conversion rank
-     (see <a href="#6.3.1.1">6.3.1.1</a>), the range of values of the type with smaller integer conversion rank is a
-     subrange of the values of the other type.
-9    The range of nonnegative values of a signed integer type is a subrange of the
-     corresponding unsigned integer type, and the representation of the same value in each
-     type is the same.31) A computation involving unsigned operands can never overflow,
-     because a result that cannot be represented by the resulting unsigned integer type is
-     reduced modulo the number that is one greater than the largest value that can be
-     represented by the resulting type.
-10   There are three real floating types, designated as float, double, and long
-     double.32) The set of values of the type float is a subset of the set of values of the
-     type double; the set of values of the type double is a subset of the set of values of the
-     type long double.
-11   There are three complex types, designated as float _Complex, double
-     _Complex, and long double _Complex.33) The real floating and complex types
-     are collectively called the floating types.
-12   For each floating type there is a corresponding real type, which is always a real floating
-     type. For real floating types, it is the same type. For complex types, it is the type given
-     by deleting the keyword _Complex from the type name.
-13   Each complex type has the same representation and alignment requirements as an array
-     type containing exactly two elements of the corresponding real type; the first element is
-     equal to the real part, and the second element to the imaginary part, of the complex
-     number.
-14   The type char, the signed and unsigned integer types, and the floating types are
-     collectively called the basic types. Even if the implementation defines two or more basic
-     types to have the same representation, they are nevertheless different types.34)
-
-     31) The same representation and alignment requirements are meant to imply interchangeability as
-         arguments to functions, return values from functions, and members of unions.
-     32) See ''future language directions'' (<a href="#6.11.1">6.11.1</a>).
-     33) A specification for imaginary types is in informative <a href="#G">annex G</a>.
-     34) An implementation may define new keywords that provide alternative ways to designate a basic (or
-         any other) type; this does not violate the requirement that all basic types be different.
-         Implementation-defined keywords shall have the form of an identifier reserved for any use as
-         described in <a href="#7.1.3">7.1.3</a>.
-
-[<a name="p34" href="#p34">page 34</a>] (<a href="#Contents">Contents</a>)
-
-15   The three types char, signed char, and unsigned char are collectively called
-     the character types. The implementation shall define char to have the same range,
-     representation, and behavior as either signed char or unsigned char.35)
-16   An enumeration comprises a set of named integer constant values. Each distinct
-     enumeration constitutes a different enumerated type.
-17   The type char, the signed and unsigned integer types, and the enumerated types are
-     collectively called integer types. The integer and real floating types are collectively called
-     real types.
-18   Integer and floating types are collectively called arithmetic types. Each arithmetic type
-     belongs to one type domain: the real type domain comprises the real types, the complex
-     type domain comprises the complex types.
-19   The void type comprises an empty set of values; it is an incomplete type that cannot be
-     completed.
-20   Any number of derived types can be constructed from the object, function, and
-     incomplete types, as follows:
-     -- An array type describes a contiguously allocated nonempty set of objects with a
-       particular member object type, called the element type.36) Array types are
-       characterized by their element type and by the number of elements in the array. An
-       array type is said to be derived from its element type, and if its element type is T , the
-       array type is sometimes called ''array of T ''. The construction of an array type from
-       an element type is called ''array type derivation''.
-     -- A structure type describes a sequentially allocated nonempty set of member objects
-       (and, in certain circumstances, an incomplete array), each of which has an optionally
-       specified name and possibly distinct type.
-     -- A union type describes an overlapping nonempty set of member objects, each of
-       which has an optionally specified name and possibly distinct type.
-     -- A function type describes a function with specified return type. A function type is
-       characterized by its return type and the number and types of its parameters. A
-       function type is said to be derived from its return type, and if its return type is T , the
-       function type is sometimes called ''function returning T ''. The construction of a
-       function type from a return type is called ''function type derivation''.
-
-
-
-     35) CHAR_MIN, defined in <a href="#7.10">&lt;limits.h&gt;</a>, will have one of the values 0 or SCHAR_MIN, and this can be
-         used to distinguish the two options. Irrespective of the choice made, char is a separate type from the
-         other two and is not compatible with either.
-     36) Since object types do not include incomplete types, an array of incomplete type cannot be constructed.
-
-[<a name="p35" href="#p35">page 35</a>] (<a href="#Contents">Contents</a>)
-
-     -- A pointer type may be derived from a function type, an object type, or an incomplete
-       type, called the referenced type. A pointer type describes an object whose value
-       provides a reference to an entity of the referenced type. A pointer type derived from
-       the referenced type T is sometimes called ''pointer to T ''. The construction of a
-       pointer type from a referenced type is called ''pointer type derivation''.
-     These methods of constructing derived types can be applied recursively.
-21   Arithmetic types and pointer types are collectively called scalar types. Array and
-     structure types are collectively called aggregate types.37)
-22   An array type of unknown size is an incomplete type. It is completed, for an identifier of
-     that type, by specifying the size in a later declaration (with internal or external linkage).
-     A structure or union type of unknown content (as described in <a href="#6.7.2.3">6.7.2.3</a>) is an incomplete
-     type. It is completed, for all declarations of that type, by declaring the same structure or
-     union tag with its defining content later in the same scope.
-23   A type has known constant size if the type is not incomplete and is not a variable length
-     array type.
-24   Array, function, and pointer types are collectively called derived declarator types. A
-     declarator type derivation from a type T is the construction of a derived declarator type
-     from T by the application of an array-type, a function-type, or a pointer-type derivation to
-     T.
-25   A type is characterized by its type category, which is either the outermost derivation of a
-     derived type (as noted above in the construction of derived types), or the type itself if the
-     type consists of no derived types.
-26   Any type so far mentioned is an unqualified type. Each unqualified type has several
-     qualified versions of its type,38) corresponding to the combinations of one, two, or all
-     three of the const, volatile, and restrict qualifiers. The qualified or unqualified
-     versions of a type are distinct types that belong to the same type category and have the
-     same representation and alignment requirements.39) A derived type is not qualified by the
-     qualifiers (if any) of the type from which it is derived.
-27   A pointer to void shall have the same representation and alignment requirements as a
-     pointer to a character type.39) Similarly, pointers to qualified or unqualified versions of
-     compatible types shall have the same representation and alignment requirements. All
-
-
-     37) Note that aggregate type does not include union type because an object with union type can only
-         contain one member at a time.
-     38) See <a href="#6.7.3">6.7.3</a> regarding qualified array and function types.
-     39) The same representation and alignment requirements are meant to imply interchangeability as
-         arguments to functions, return values from functions, and members of unions.
-
-[<a name="p36" href="#p36">page 36</a>] (<a href="#Contents">Contents</a>)
-
-     pointers to structure types shall have the same representation and alignment requirements
-     as each other. All pointers to union types shall have the same representation and
-     alignment requirements as each other. Pointers to other types need not have the same
-     representation or alignment requirements.
-28   EXAMPLE 1 The type designated as ''float *'' has type ''pointer to float''. Its type category is
-     pointer, not a floating type. The const-qualified version of this type is designated as ''float * const''
-     whereas the type designated as ''const float *'' is not a qualified type -- its type is ''pointer to const-
-     qualified float'' and is a pointer to a qualified type.
-
-29   EXAMPLE 2 The type designated as ''struct tag (*[5])(float)'' has type ''array of pointer to
-     function returning struct tag''. The array has length five and the function has a single parameter of type
-     float. Its type category is array.
-
-     Forward references: compatible type and composite type (<a href="#6.2.7">6.2.7</a>), declarations (<a href="#6.7">6.7</a>).
-<a name="6.2.6" href="#6.2.6"><b>     6.2.6 Representations of types</b></a>
-<a name="6.2.6.1" href="#6.2.6.1"><b>     6.2.6.1 General</b></a>
-1    The representations of all types are unspecified except as stated in this subclause.
-2    Except for bit-fields, objects are composed of contiguous sequences of one or more bytes,
-     the number, order, and encoding of which are either explicitly specified or
-     implementation-defined.
-3    Values stored in unsigned bit-fields and objects of type unsigned char shall be
-     represented using a pure binary notation.40)
-4    Values stored in non-bit-field objects of any other object type consist of n x CHAR_BIT
-     bits, where n is the size of an object of that type, in bytes. The value may be copied into
-     an object of type unsigned char [n] (e.g., by memcpy); the resulting set of bytes is
-     called the object representation of the value. Values stored in bit-fields consist of m bits,
-     where m is the size specified for the bit-field. The object representation is the set of m
-     bits the bit-field comprises in the addressable storage unit holding it. Two values (other
-     than NaNs) with the same object representation compare equal, but values that compare
-     equal may have different object representations.
-5    Certain object representations need not represent a value of the object type. If the stored
-     value of an object has such a representation and is read by an lvalue expression that does
-     not have character type, the behavior is undefined. If such a representation is produced
-     by a side effect that modifies all or any part of the object by an lvalue expression that
-     does not have character type, the behavior is undefined.41) Such a representation is called
-
-     40) A positional representation for integers that uses the binary digits 0 and 1, in which the values
-         represented by successive bits are additive, begin with 1, and are multiplied by successive integral
-         powers of 2, except perhaps the bit with the highest position. (Adapted from the American National
-         Dictionary for Information Processing Systems.) A byte contains CHAR_BIT bits, and the values of
-         type unsigned char range from 0 to 2
-                                                   CHAR_BIT
-                                                             - 1.
-
-[<a name="p37" href="#p37">page 37</a>] (<a href="#Contents">Contents</a>)
-
-    a trap representation.
-6   When a value is stored in an object of structure or union type, including in a member
-    object, the bytes of the object representation that correspond to any padding bytes take
-    unspecified values.42) The value of a structure or union object is never a trap
-    representation, even though the value of a member of the structure or union object may be
-    a trap representation.
-7   When a value is stored in a member of an object of union type, the bytes of the object
-    representation that do not correspond to that member but do correspond to other members
-    take unspecified values.
-8   Where an operator is applied to a value that has more than one object representation,
-    which object representation is used shall not affect the value of the result.43) Where a
-    value is stored in an object using a type that has more than one object representation for
-    that value, it is unspecified which representation is used, but a trap representation shall
-    not be generated.
-    Forward references: declarations (<a href="#6.7">6.7</a>), expressions (<a href="#6.5">6.5</a>), lvalues, arrays, and function
-    designators (<a href="#6.3.2.1">6.3.2.1</a>).
-<a name="6.2.6.2" href="#6.2.6.2"><b>    6.2.6.2 Integer types</b></a>
-1   For unsigned integer types other than unsigned char, the bits of the object
-    representation shall be divided into two groups: value bits and padding bits (there need
-    not be any of the latter). If there are N value bits, each bit shall represent a different
-    power of 2 between 1 and 2 N -1 , so that objects of that type shall be capable of
-    representing values from 0 to 2 N - 1 using a pure binary representation; this shall be
-    known as the value representation. The values of any padding bits are unspecified.44)
-2   For signed integer types, the bits of the object representation shall be divided into three
-    groups: value bits, padding bits, and the sign bit. There need not be any padding bits;
-
-    41) Thus, an automatic variable can be initialized to a trap representation without causing undefined
-        behavior, but the value of the variable cannot be used until a proper value is stored in it.
-    42) Thus, for example, structure assignment need not copy any padding bits.
-    43) It is possible for objects x and y with the same effective type T to have the same value when they are
-        accessed as objects of type T, but to have different values in other contexts. In particular, if == is
-        defined for type T, then x == y does not imply that memcmp(&amp;x, &amp;y, sizeof (T)) == 0.
-        Furthermore, x == y does not necessarily imply that x and y have the same value; other operations
-        on values of type T may distinguish between them.
-    44) Some combinations of padding bits might generate trap representations, for example, if one padding
-        bit is a parity bit. Regardless, no arithmetic operation on valid values can generate a trap
-        representation other than as part of an exceptional condition such as an overflow, and this cannot occur
-        with unsigned types. All other combinations of padding bits are alternative object representations of
-        the value specified by the value bits.
-
-[<a name="p38" href="#p38">page 38</a>] (<a href="#Contents">Contents</a>)
-
-    there shall be exactly one sign bit. Each bit that is a value bit shall have the same value as
-    the same bit in the object representation of the corresponding unsigned type (if there are
-    M value bits in the signed type and N in the unsigned type, then M &lt;= N ). If the sign bit
-    is zero, it shall not affect the resulting value. If the sign bit is one, the value shall be
-    modified in one of the following ways:
-    -- the corresponding value with sign bit 0 is negated (sign and magnitude);
-    -- the sign bit has the value -(2 N ) (two's complement);
-    -- the sign bit has the value -(2 N - 1) (ones' complement ).
-    Which of these applies is implementation-defined, as is whether the value with sign bit 1
-    and all value bits zero (for the first two), or with sign bit and all value bits 1 (for ones'
-    complement), is a trap representation or a normal value. In the case of sign and
-    magnitude and ones' complement, if this representation is a normal value it is called a
-    negative zero.
-3   If the implementation supports negative zeros, they shall be generated only by:
-    -- the &amp;, |, ^, ~, &lt;&lt;, and &gt;&gt; operators with arguments that produce such a value;
-    -- the +, -, *, /, and % operators where one argument is a negative zero and the result is
-      zero;
-    -- compound assignment operators based on the above cases.
-    It is unspecified whether these cases actually generate a negative zero or a normal zero,
-    and whether a negative zero becomes a normal zero when stored in an object.
-4   If the implementation does not support negative zeros, the behavior of the &amp;, |, ^, ~, &lt;&lt;,
-    and &gt;&gt; operators with arguments that would produce such a value is undefined.
-5   The values of any padding bits are unspecified.45) A valid (non-trap) object representation
-    of a signed integer type where the sign bit is zero is a valid object representation of the
-    corresponding unsigned type, and shall represent the same value. For any integer type,
-    the object representation where all the bits are zero shall be a representation of the value
-    zero in that type.
-6   The precision of an integer type is the number of bits it uses to represent values,
-    excluding any sign and padding bits. The width of an integer type is the same but
-    including any sign bit; thus for unsigned integer types the two values are the same, while
-
-
-    45) Some combinations of padding bits might generate trap representations, for example, if one padding
-        bit is a parity bit. Regardless, no arithmetic operation on valid values can generate a trap
-        representation other than as part of an exceptional condition such as an overflow. All other
-        combinations of padding bits are alternative object representations of the value specified by the value
-        bits.
-
-[<a name="p39" href="#p39">page 39</a>] (<a href="#Contents">Contents</a>)
-
-    for signed integer types the width is one greater than the precision.
-<a name="6.2.7" href="#6.2.7"><b>    6.2.7 Compatible type and composite type</b></a>
-1   Two types have compatible type if their types are the same. Additional rules for
-    determining whether two types are compatible are described in <a href="#6.7.2">6.7.2</a> for type specifiers,
-    in <a href="#6.7.3">6.7.3</a> for type qualifiers, and in <a href="#6.7.5">6.7.5</a> for declarators.46) Moreover, two structure,
-    union, or enumerated types declared in separate translation units are compatible if their
-    tags and members satisfy the following requirements: If one is declared with a tag, the
-    other shall be declared with the same tag. If both are complete types, then the following
-    additional requirements apply: there shall be a one-to-one correspondence between their
-    members such that each pair of corresponding members are declared with compatible
-    types, and such that if one member of a corresponding pair is declared with a name, the
-    other member is declared with the same name. For two structures, corresponding
-    members shall be declared in the same order. For two structures or unions, corresponding
-    bit-fields shall have the same widths. For two enumerations, corresponding members
-    shall have the same values.
-2   All declarations that refer to the same object or function shall have compatible type;
-    otherwise, the behavior is undefined.
-3   A composite type can be constructed from two types that are compatible; it is a type that
-    is compatible with both of the two types and satisfies the following conditions:
-    -- If one type is an array of known constant size, the composite type is an array of that
-      size; otherwise, if one type is a variable length array, the composite type is that type.
-    -- If only one type is a function type with a parameter type list (a function prototype),
-      the composite type is a function prototype with the parameter type list.
-    -- If both types are function types with parameter type lists, the type of each parameter
-      in the composite parameter type list is the composite type of the corresponding
-      parameters.
-    These rules apply recursively to the types from which the two types are derived.
-4   For an identifier with internal or external linkage declared in a scope in which a prior
-    declaration of that identifier is visible,47) if the prior declaration specifies internal or
-    external linkage, the type of the identifier at the later declaration becomes the composite
-    type.
-
-
-
-
-    46) Two types need not be identical to be compatible.
-    47) As specified in <a href="#6.2.1">6.2.1</a>, the later declaration might hide the prior declaration.
-
-[<a name="p40" href="#p40">page 40</a>] (<a href="#Contents">Contents</a>)
-
-5   EXAMPLE        Given the following two file scope declarations:
-             int f(int (*)(), double (*)[3]);
-             int f(int (*)(char *), double (*)[]);
-    The resulting composite type for the function is:
-             int f(int (*)(char *), double (*)[3]);
-
-
-
-
-[<a name="p41" href="#p41">page 41</a>] (<a href="#Contents">Contents</a>)
-
-<a name="6.3" href="#6.3"><b>    6.3 Conversions</b></a>
-1   Several operators convert operand values from one type to another automatically. This
-    subclause specifies the result required from such an implicit conversion, as well as those
-    that result from a cast operation (an explicit conversion). The list in <a href="#6.3.1.8">6.3.1.8</a> summarizes
-    the conversions performed by most ordinary operators; it is supplemented as required by
-    the discussion of each operator in <a href="#6.5">6.5</a>.
-2   Conversion of an operand value to a compatible type causes no change to the value or the
-    representation.
-    Forward references: cast operators (<a href="#6.5.4">6.5.4</a>).
-<a name="6.3.1" href="#6.3.1"><b>    6.3.1 Arithmetic operands</b></a>
-<a name="6.3.1.1" href="#6.3.1.1"><b>    6.3.1.1 Boolean, characters, and integers</b></a>
-1   Every integer type has an integer conversion rank defined as follows:
-    -- No two signed integer types shall have the same rank, even if they have the same
-      representation.
-    -- The rank of a signed integer type shall be greater than the rank of any signed integer
-      type with less precision.
-    -- The rank of long long int shall be greater than the rank of long int, which
-      shall be greater than the rank of int, which shall be greater than the rank of short
-      int, which shall be greater than the rank of signed char.
-    -- The rank of any unsigned integer type shall equal the rank of the corresponding
-      signed integer type, if any.
-    -- The rank of any standard integer type shall be greater than the rank of any extended
-      integer type with the same width.
-    -- The rank of char shall equal the rank of signed char and unsigned char.
-    -- The rank of _Bool shall be less than the rank of all other standard integer types.
-    -- The rank of any enumerated type shall equal the rank of the compatible integer type
-      (see <a href="#6.7.2.2">6.7.2.2</a>).
-    -- The rank of any extended signed integer type relative to another extended signed
-      integer type with the same precision is implementation-defined, but still subject to the
-      other rules for determining the integer conversion rank.
-    -- For all integer types T1, T2, and T3, if T1 has greater rank than T2 and T2 has
-      greater rank than T3, then T1 has greater rank than T3.
-2   The following may be used in an expression wherever an int or unsigned int may
-    be used:
-
-[<a name="p42" href="#p42">page 42</a>] (<a href="#Contents">Contents</a>)
-
-    -- An object or expression with an integer type whose integer conversion rank is less
-      than or equal to the rank of int and unsigned int.
-    -- A bit-field of type _Bool, int, signed int, or unsigned int.
-    If an int can represent all values of the original type, the value is converted to an int;
-    otherwise, it is converted to an unsigned int. These are called the integer
-    promotions.48) All other types are unchanged by the integer promotions.
-3   The integer promotions preserve value including sign. As discussed earlier, whether a
-    ''plain'' char is treated as signed is implementation-defined.
-    Forward references: enumeration specifiers (<a href="#6.7.2.2">6.7.2.2</a>), structure and union specifiers
-    (<a href="#6.7.2.1">6.7.2.1</a>).
-<a name="6.3.1.2" href="#6.3.1.2"><b>    6.3.1.2 Boolean type</b></a>
-1   When any scalar value is converted to _Bool, the result is 0 if the value compares equal
-    to 0; otherwise, the result is 1.
-<a name="6.3.1.3" href="#6.3.1.3"><b>    6.3.1.3 Signed and unsigned integers</b></a>
-1   When a value with integer type is converted to another integer type other than _Bool, if
-    the value can be represented by the new type, it is unchanged.
-2   Otherwise, if the new type is unsigned, the value is converted by repeatedly adding or
-    subtracting one more than the maximum value that can be represented in the new type
-    until the value is in the range of the new type.49)
-3   Otherwise, the new type is signed and the value cannot be represented in it; either the
-    result is implementation-defined or an implementation-defined signal is raised.
-<a name="6.3.1.4" href="#6.3.1.4"><b>    6.3.1.4 Real floating and integer</b></a>
-1   When a finite value of real floating type is converted to an integer type other than _Bool,
-    the fractional part is discarded (i.e., the value is truncated toward zero). If the value of
-    the integral part cannot be represented by the integer type, the behavior is undefined.50)
-2   When a value of integer type is converted to a real floating type, if the value being
-    converted can be represented exactly in the new type, it is unchanged. If the value being
-    converted is in the range of values that can be represented but cannot be represented
-
-    48) The integer promotions are applied only: as part of the usual arithmetic conversions, to certain
-        argument expressions, to the operands of the unary +, -, and ~ operators, and to both operands of the
-        shift operators, as specified by their respective subclauses.
-    49) The rules describe arithmetic on the mathematical value, not the value of a given type of expression.
-    50) The remaindering operation performed when a value of integer type is converted to unsigned type
-        need not be performed when a value of real floating type is converted to unsigned type. Thus, the
-        range of portable real floating values is (-1, Utype_MAX+1).
-
-[<a name="p43" href="#p43">page 43</a>] (<a href="#Contents">Contents</a>)
-
-    exactly, the result is either the nearest higher or nearest lower representable value, chosen
-    in an implementation-defined manner. If the value being converted is outside the range of
-    values that can be represented, the behavior is undefined.
-<a name="6.3.1.5" href="#6.3.1.5"><b>    6.3.1.5 Real floating types</b></a>
-1   When a float is promoted to double or long double, or a double is promoted
-    to long double, its value is unchanged (if the source value is represented in the
-    precision and range of its type).
-2   When a double is demoted to float, a long double is demoted to double or
-    float, or a value being represented in greater precision and range than required by its
-    semantic type (see <a href="#6.3.1.8">6.3.1.8</a>) is explicitly converted (including to its own type), if the value
-    being converted can be represented exactly in the new type, it is unchanged. If the value
-    being converted is in the range of values that can be represented but cannot be
-    represented exactly, the result is either the nearest higher or nearest lower representable
-    value, chosen in an implementation-defined manner. If the value being converted is
-    outside the range of values that can be represented, the behavior is undefined.
-<a name="6.3.1.6" href="#6.3.1.6"><b>    6.3.1.6 Complex types</b></a>
-1   When a value of complex type is converted to another complex type, both the real and
-    imaginary parts follow the conversion rules for the corresponding real types.
-<a name="6.3.1.7" href="#6.3.1.7"><b>    6.3.1.7 Real and complex</b></a>
-1   When a value of real type is converted to a complex type, the real part of the complex
-    result value is determined by the rules of conversion to the corresponding real type and
-    the imaginary part of the complex result value is a positive zero or an unsigned zero.
-2   When a value of complex type is converted to a real type, the imaginary part of the
-    complex value is discarded and the value of the real part is converted according to the
-    conversion rules for the corresponding real type.
-<a name="6.3.1.8" href="#6.3.1.8"><b>    6.3.1.8 Usual arithmetic conversions</b></a>
-1   Many operators that expect operands of arithmetic type cause conversions and yield result
-    types in a similar way. The purpose is to determine a common real type for the operands
-    and result. For the specified operands, each operand is converted, without change of type
-    domain, to a type whose corresponding real type is the common real type. Unless
-    explicitly stated otherwise, the common real type is also the corresponding real type of
-    the result, whose type domain is the type domain of the operands if they are the same,
-    and complex otherwise. This pattern is called the usual arithmetic conversions:
-          First, if the corresponding real type of either operand is long double, the other
-          operand is converted, without change of type domain, to a type whose
-          corresponding real type is long double.
-
-[<a name="p44" href="#p44">page 44</a>] (<a href="#Contents">Contents</a>)
-
-          Otherwise, if the corresponding real type of either operand is double, the other
-          operand is converted, without change of type domain, to a type whose
-          corresponding real type is double.
-          Otherwise, if the corresponding real type of either operand is float, the other
-          operand is converted, without change of type domain, to a type whose
-          corresponding real type is float.51)
-          Otherwise, the integer promotions are performed on both operands. Then the
-          following rules are applied to the promoted operands:
-                 If both operands have the same type, then no further conversion is needed.
-                 Otherwise, if both operands have signed integer types or both have unsigned
-                 integer types, the operand with the type of lesser integer conversion rank is
-                 converted to the type of the operand with greater rank.
-                 Otherwise, if the operand that has unsigned integer type has rank greater or
-                 equal to the rank of the type of the other operand, then the operand with
-                 signed integer type is converted to the type of the operand with unsigned
-                 integer type.
-                 Otherwise, if the type of the operand with signed integer type can represent
-                 all of the values of the type of the operand with unsigned integer type, then
-                 the operand with unsigned integer type is converted to the type of the
-                 operand with signed integer type.
-                 Otherwise, both operands are converted to the unsigned integer type
-                 corresponding to the type of the operand with signed integer type.
-2   The values of floating operands and of the results of floating expressions may be
-    represented in greater precision and range than that required by the type; the types are not
-    changed thereby.52)
-
-
-
-
-    51) For example, addition of a double _Complex and a float entails just the conversion of the
-        float operand to double (and yields a double _Complex result).
-    52) The cast and assignment operators are still required to perform their specified conversions as
-        described in <a href="#6.3.1.4">6.3.1.4</a> and <a href="#6.3.1.5">6.3.1.5</a>.
-
-[<a name="p45" href="#p45">page 45</a>] (<a href="#Contents">Contents</a>)
-
-<a name="6.3.2" href="#6.3.2"><b>    6.3.2 Other operands</b></a>
-<a name="6.3.2.1" href="#6.3.2.1"><b>    6.3.2.1 Lvalues, arrays, and function designators</b></a>
-1   An lvalue is an expression with an object type or an incomplete type other than void;53)
-    if an lvalue does not designate an object when it is evaluated, the behavior is undefined.
-    When an object is said to have a particular type, the type is specified by the lvalue used to
-    designate the object. A modifiable lvalue is an lvalue that does not have array type, does
-    not have an incomplete type, does not have a const-qualified type, and if it is a structure
-    or union, does not have any member (including, recursively, any member or element of
-    all contained aggregates or unions) with a const-qualified type.
-2   Except when it is the operand of the sizeof operator, the unary &amp; operator, the ++
-    operator, the -- operator, or the left operand of the . operator or an assignment operator,
-    an lvalue that does not have array type is converted to the value stored in the designated
-    object (and is no longer an lvalue). If the lvalue has qualified type, the value has the
-    unqualified version of the type of the lvalue; otherwise, the value has the type of the
-    lvalue. If the lvalue has an incomplete type and does not have array type, the behavior is
-    undefined.
-3   Except when it is the operand of the sizeof operator or the unary &amp; operator, or is a
-    string literal used to initialize an array, an expression that has type ''array of type'' is
-    converted to an expression with type ''pointer to type'' that points to the initial element of
-    the array object and is not an lvalue. If the array object has register storage class, the
-    behavior is undefined.
-4   A function designator is an expression that has function type. Except when it is the
-    operand of the sizeof operator54) or the unary &amp; operator, a function designator with
-    type ''function returning type'' is converted to an expression that has type ''pointer to
-    function returning type''.
-    Forward references: address and indirection operators (<a href="#6.5.3.2">6.5.3.2</a>), assignment operators
-    (<a href="#6.5.16">6.5.16</a>), common definitions <a href="#7.17">&lt;stddef.h&gt;</a> (<a href="#7.17">7.17</a>), initialization (<a href="#6.7.8">6.7.8</a>), postfix
-    increment and decrement operators (<a href="#6.5.2.4">6.5.2.4</a>), prefix increment and decrement operators
-    (<a href="#6.5.3.1">6.5.3.1</a>), the sizeof operator (<a href="#6.5.3.4">6.5.3.4</a>), structure and union members (<a href="#6.5.2.3">6.5.2.3</a>).
-
-
-    53) The name ''lvalue'' comes originally from the assignment expression E1 = E2, in which the left
-        operand E1 is required to be a (modifiable) lvalue. It is perhaps better considered as representing an
-        object ''locator value''. What is sometimes called ''rvalue'' is in this International Standard described
-        as the ''value of an expression''.
-         An obvious example of an lvalue is an identifier of an object. As a further example, if E is a unary
-         expression that is a pointer to an object, *E is an lvalue that designates the object to which E points.
-    54) Because this conversion does not occur, the operand of the sizeof operator remains a function
-        designator and violates the constraint in <a href="#6.5.3.4">6.5.3.4</a>.
-
-[<a name="p46" href="#p46">page 46</a>] (<a href="#Contents">Contents</a>)
-
-    <a href="#6.3.2.2">6.3.2.2</a> void
-1   The (nonexistent) value of a void expression (an expression that has type void) shall not
-    be used in any way, and implicit or explicit conversions (except to void) shall not be
-    applied to such an expression. If an expression of any other type is evaluated as a void
-    expression, its value or designator is discarded. (A void expression is evaluated for its
-    side effects.)
-<a name="6.3.2.3" href="#6.3.2.3"><b>    6.3.2.3 Pointers</b></a>
-1   A pointer to void may be converted to or from a pointer to any incomplete or object
-    type. A pointer to any incomplete or object type may be converted to a pointer to void
-    and back again; the result shall compare equal to the original pointer.
-2   For any qualifier q, a pointer to a non-q-qualified type may be converted to a pointer to
-    the q-qualified version of the type; the values stored in the original and converted pointers
-    shall compare equal.
-3   An integer constant expression with the value 0, or such an expression cast to type
-    void *, is called a null pointer constant.55) If a null pointer constant is converted to a
-    pointer type, the resulting pointer, called a null pointer, is guaranteed to compare unequal
-    to a pointer to any object or function.
-4   Conversion of a null pointer to another pointer type yields a null pointer of that type.
-    Any two null pointers shall compare equal.
-5   An integer may be converted to any pointer type. Except as previously specified, the
-    result is implementation-defined, might not be correctly aligned, might not point to an
-    entity of the referenced type, and might be a trap representation.56)
-6   Any pointer type may be converted to an integer type. Except as previously specified, the
-    result is implementation-defined. If the result cannot be represented in the integer type,
-    the behavior is undefined. The result need not be in the range of values of any integer
-    type.
-7   A pointer to an object or incomplete type may be converted to a pointer to a different
-    object or incomplete type. If the resulting pointer is not correctly aligned57) for the
-    pointed-to type, the behavior is undefined. Otherwise, when converted back again, the
-    result shall compare equal to the original pointer. When a pointer to an object is
-
-
-    55) The macro NULL is defined in <a href="#7.17">&lt;stddef.h&gt;</a> (and other headers) as a null pointer constant; see <a href="#7.17">7.17</a>.
-    56) The mapping functions for converting a pointer to an integer or an integer to a pointer are intended to
-        be consistent with the addressing structure of the execution environment.
-    57) In general, the concept ''correctly aligned'' is transitive: if a pointer to type A is correctly aligned for a
-        pointer to type B, which in turn is correctly aligned for a pointer to type C, then a pointer to type A is
-        correctly aligned for a pointer to type C.
-
-[<a name="p47" href="#p47">page 47</a>] (<a href="#Contents">Contents</a>)
-
-    converted to a pointer to a character type, the result points to the lowest addressed byte of
-    the object. Successive increments of the result, up to the size of the object, yield pointers
-    to the remaining bytes of the object.
-8   A pointer to a function of one type may be converted to a pointer to a function of another
-    type and back again; the result shall compare equal to the original pointer. If a converted
-    pointer is used to call a function whose type is not compatible with the pointed-to type,
-    the behavior is undefined.
-    Forward references: cast operators (<a href="#6.5.4">6.5.4</a>), equality operators (<a href="#6.5.9">6.5.9</a>), integer types
-    capable of holding object pointers (<a href="#7.18.1.4">7.18.1.4</a>), simple assignment (<a href="#6.5.16.1">6.5.16.1</a>).
-
-
-
-
-[<a name="p48" href="#p48">page 48</a>] (<a href="#Contents">Contents</a>)
-
-<a name="6.4" href="#6.4"><b>    6.4 Lexical elements</b></a>
-    Syntax
-1            token:
-                      keyword
-                      identifier
-                      constant
-                      string-literal
-                      punctuator
-             preprocessing-token:
-                    header-name
-                    identifier
-                    pp-number
-                    character-constant
-                    string-literal
-                    punctuator
-                    each non-white-space character that cannot be one of the above
-    Constraints
-2   Each preprocessing token that is converted to a token shall have the lexical form of a
-    keyword, an identifier, a constant, a string literal, or a punctuator.
-    Semantics
-3   A token is the minimal lexical element of the language in translation phases 7 and 8. The
-    categories of tokens are: keywords, identifiers, constants, string literals, and punctuators.
-    A preprocessing token is the minimal lexical element of the language in translation
-    phases 3 through 6. The categories of preprocessing tokens are: header names,
-    identifiers, preprocessing numbers, character constants, string literals, punctuators, and
-    single non-white-space characters that do not lexically match the other preprocessing
-    token categories.58) If a ' or a " character matches the last category, the behavior is
-    undefined. Preprocessing tokens can be separated by white space; this consists of
-    comments (described later), or white-space characters (space, horizontal tab, new-line,
-    vertical tab, and form-feed), or both. As described in <a href="#6.10">6.10</a>, in certain circumstances
-    during translation phase 4, white space (or the absence thereof) serves as more than
-    preprocessing token separation. White space may appear within a preprocessing token
-    only as part of a header name or between the quotation characters in a character constant
-    or string literal.
-
-
-
-    58) An additional category, placemarkers, is used internally in translation phase 4 (see <a href="#6.10.3.3">6.10.3.3</a>); it cannot
-        occur in source files.
-
-[<a name="p49" href="#p49">page 49</a>] (<a href="#Contents">Contents</a>)
-
-4   If the input stream has been parsed into preprocessing tokens up to a given character, the
-    next preprocessing token is the longest sequence of characters that could constitute a
-    preprocessing token. There is one exception to this rule: header name preprocessing
-    tokens are recognized only within #include preprocessing directives and in
-    implementation-defined locations within #pragma directives. In such contexts, a
-    sequence of characters that could be either a header name or a string literal is recognized
-    as the former.
-5   EXAMPLE 1 The program fragment 1Ex is parsed as a preprocessing number token (one that is not a
-    valid floating or integer constant token), even though a parse as the pair of preprocessing tokens 1 and Ex
-    might produce a valid expression (for example, if Ex were a macro defined as +1). Similarly, the program
-    fragment 1E1 is parsed as a preprocessing number (one that is a valid floating constant token), whether or
-    not E is a macro name.
-
-6   EXAMPLE 2 The program fragment x+++++y is parsed as x ++ ++ + y, which violates a constraint on
-    increment operators, even though the parse x ++ + ++ y might yield a correct expression.
-
-    Forward references: character constants (<a href="#6.4.4.4">6.4.4.4</a>), comments (<a href="#6.4.9">6.4.9</a>), expressions (<a href="#6.5">6.5</a>),
-    floating constants (<a href="#6.4.4.2">6.4.4.2</a>), header names (<a href="#6.4.7">6.4.7</a>), macro replacement (<a href="#6.10.3">6.10.3</a>), postfix
-    increment and decrement operators (<a href="#6.5.2.4">6.5.2.4</a>), prefix increment and decrement operators
-    (<a href="#6.5.3.1">6.5.3.1</a>), preprocessing directives (<a href="#6.10">6.10</a>), preprocessing numbers (<a href="#6.4.8">6.4.8</a>), string literals
-    (<a href="#6.4.5">6.4.5</a>).
-<a name="6.4.1" href="#6.4.1"><b>    6.4.1 Keywords</b></a>
-    Syntax
-1            keyword: one of
-                   auto                    enum                  restrict              unsigned
-                   break                   extern                return                void
-                   case                    float                 short                 volatile
-                   char                    for                   signed                while
-                   const                   goto                  sizeof                _Bool
-                   continue                if                    static                _Complex
-                   default                 inline                struct                _Imaginary
-                   do                      int                   switch
-                   double                  long                  typedef
-                   else                    register              union
-    Semantics
-2   The above tokens (case sensitive) are reserved (in translation phases 7 and 8) for use as
-    keywords, and shall not be used otherwise. The keyword _Imaginary is reserved for
-    specifying imaginary types.59)
-
-
-
-    59) One possible specification for imaginary types appears in <a href="#G">annex G</a>.
-
-[<a name="p50" href="#p50">page 50</a>] (<a href="#Contents">Contents</a>)
-
-<a name="6.4.2" href="#6.4.2"><b>    6.4.2 Identifiers</b></a>
-<a name="6.4.2.1" href="#6.4.2.1"><b>    6.4.2.1 General</b></a>
-    Syntax
-1            identifier:
-                    identifier-nondigit
-                     identifier identifier-nondigit
-                    identifier digit
-             identifier-nondigit:
-                     nondigit
-                     universal-character-name
-                    other implementation-defined characters
-             nondigit: one of
-                    _ a b            c    d    e    f     g    h    i    j     k    l    m
-                        n o          p    q    r    s     t    u    v    w     x    y    z
-                        A B          C    D    E    F     G    H    I    J     K    L    M
-                        N O          P    Q    R    S     T    U    V    W     X    Y    Z
-             digit: one of
-                    0 1        2     3    4    5    6     7    8    9
-    Semantics
-2   An identifier is a sequence of nondigit characters (including the underscore _, the
-    lowercase and uppercase Latin letters, and other characters) and digits, which designates
-    one or more entities as described in <a href="#6.2.1">6.2.1</a>. Lowercase and uppercase letters are distinct.
-    There is no specific limit on the maximum length of an identifier.
-3   Each universal character name in an identifier shall designate a character whose encoding
-    in ISO/IEC 10646 falls into one of the ranges specified in <a href="#D">annex D</a>.60) The initial
-    character shall not be a universal character name designating a digit. An implementation
-    may allow multibyte characters that are not part of the basic source character set to
-    appear in identifiers; which characters and their correspondence to universal character
-    names is implementation-defined.
-4   When preprocessing tokens are converted to tokens during translation phase 7, if a
-    preprocessing token could be converted to either a keyword or an identifier, it is converted
-    to a keyword.
-
-
-    60) On systems in which linkers cannot accept extended characters, an encoding of the universal character
-        name may be used in forming valid external identifiers. For example, some otherwise unused
-        character or sequence of characters may be used to encode the \u in a universal character name.
-        Extended characters may produce a long external identifier.
-
-[<a name="p51" href="#p51">page 51</a>] (<a href="#Contents">Contents</a>)
-
-    Implementation limits
-5   As discussed in <a href="#5.2.4.1">5.2.4.1</a>, an implementation may limit the number of significant initial
-    characters in an identifier; the limit for an external name (an identifier that has external
-    linkage) may be more restrictive than that for an internal name (a macro name or an
-    identifier that does not have external linkage). The number of significant characters in an
-    identifier is implementation-defined.
-6   Any identifiers that differ in a significant character are different identifiers. If two
-    identifiers differ only in nonsignificant characters, the behavior is undefined.
-    Forward references: universal character names (<a href="#6.4.3">6.4.3</a>), macro replacement (<a href="#6.10.3">6.10.3</a>).
-<a name="6.4.2.2" href="#6.4.2.2"><b>    6.4.2.2 Predefined identifiers</b></a>
-    Semantics
-1   The identifier __func__ shall be implicitly declared by the translator as if,
-    immediately following the opening brace of each function definition, the declaration
-             static const char __func__[] = "function-name";
-    appeared, where function-name is the name of the lexically-enclosing function.61)
-2   This name is encoded as if the implicit declaration had been written in the source
-    character set and then translated into the execution character set as indicated in translation
-    phase 5.
-3   EXAMPLE        Consider the code fragment:
-             #include <a href="#7.19">&lt;stdio.h&gt;</a>
-             void myfunc(void)
-             {
-                   printf("%s\n", __func__);
-                   /* ... */
-             }
-    Each time the function is called, it will print to the standard output stream:
-             myfunc
-
-    Forward references: function definitions (<a href="#6.9.1">6.9.1</a>).
-
-
-
-
-    61) Since the name __func__ is reserved for any use by the implementation (<a href="#7.1.3">7.1.3</a>), if any other
-        identifier is explicitly declared using the name __func__, the behavior is undefined.
-
-[<a name="p52" href="#p52">page 52</a>] (<a href="#Contents">Contents</a>)
-
-<a name="6.4.3" href="#6.4.3"><b>    6.4.3 Universal character names</b></a>
-    Syntax
-1            universal-character-name:
-                    \u hex-quad
-                    \U hex-quad hex-quad
-             hex-quad:
-                    hexadecimal-digit hexadecimal-digit
-                                 hexadecimal-digit hexadecimal-digit
-    Constraints
-2   A universal character name shall not specify a character whose short identifier is less than
-    00A0 other than 0024 ($), 0040 (@), or 0060 ('), nor one in the range D800 through
-    DFFF inclusive.62)
-    Description
-3   Universal character names may be used in identifiers, character constants, and string
-    literals to designate characters that are not in the basic character set.
-    Semantics
-4   The universal character name \Unnnnnnnn designates the character whose eight-digit
-    short identifier (as specified by ISO/IEC 10646) is nnnnnnnn.63) Similarly, the universal
-    character name \unnnn designates the character whose four-digit short identifier is nnnn
-    (and whose eight-digit short identifier is 0000nnnn).
-
-
-
-
-    62) The disallowed characters are the characters in the basic character set and the code positions reserved
-        by ISO/IEC 10646 for control characters, the character DELETE, and the S-zone (reserved for use by
-        UTF-16).
-    63) Short identifiers for characters were first specified in ISO/IEC 10646-1/AMD9:1997.
-
-[<a name="p53" href="#p53">page 53</a>] (<a href="#Contents">Contents</a>)
-
-<a name="6.4.4" href="#6.4.4"><b>    6.4.4 Constants</b></a>
-    Syntax
-1            constant:
-                    integer-constant
-                    floating-constant
-                    enumeration-constant
-                    character-constant
-    Constraints
-2   Each constant shall have a type and the value of a constant shall be in the range of
-    representable values for its type.
-    Semantics
-3   Each constant has a type, determined by its form and value, as detailed later.
-<a name="6.4.4.1" href="#6.4.4.1"><b>    6.4.4.1 Integer constants</b></a>
-    Syntax
-1            integer-constant:
-                     decimal-constant integer-suffixopt
-                     octal-constant integer-suffixopt
-                     hexadecimal-constant integer-suffixopt
-             decimal-constant:
-                   nonzero-digit
-                   decimal-constant digit
-             octal-constant:
-                    0
-                    octal-constant octal-digit
-             hexadecimal-constant:
-                   hexadecimal-prefix hexadecimal-digit
-                   hexadecimal-constant hexadecimal-digit
-             hexadecimal-prefix: one of
-                   0x 0X
-             nonzero-digit: one of
-                    1 2 3 4          5     6     7   8    9
-             octal-digit: one of
-                     0 1 2 3         4     5     6   7
-
-
-
-
-[<a name="p54" href="#p54">page 54</a>] (<a href="#Contents">Contents</a>)
-
-           hexadecimal-digit:   one of
-                 0 1 2           3 4      5    6   7     8   9
-                 a b c           d e      f
-                 A B C           D E      F
-           integer-suffix:
-                   unsigned-suffix long-suffixopt
-                   unsigned-suffix long-long-suffix
-                   long-suffix unsigned-suffixopt
-                   long-long-suffix unsigned-suffixopt
-           unsigned-suffix: one of
-                  u U
-           long-suffix: one of
-                  l L
-           long-long-suffix: one of
-                  ll LL
-    Description
-2   An integer constant begins with a digit, but has no period or exponent part. It may have a
-    prefix that specifies its base and a suffix that specifies its type.
-3   A decimal constant begins with a nonzero digit and consists of a sequence of decimal
-    digits. An octal constant consists of the prefix 0 optionally followed by a sequence of the
-    digits 0 through 7 only. A hexadecimal constant consists of the prefix 0x or 0X followed
-    by a sequence of the decimal digits and the letters a (or A) through f (or F) with values
-    10 through 15 respectively.
-    Semantics
-4   The value of a decimal constant is computed base 10; that of an octal constant, base 8;
-    that of a hexadecimal constant, base 16. The lexically first digit is the most significant.
-5   The type of an integer constant is the first of the corresponding list in which its value can
-    be represented.
-
-
-
-
-[<a name="p55" href="#p55">page 55</a>] (<a href="#Contents">Contents</a>)
-
-                                                                     Octal or Hexadecimal
-    Suffix                       Decimal Constant                           Constant
-
-    none                int                                    int
-                        long int                               unsigned int
-                        long long int                          long int
-                                                               unsigned long int
-                                                               long long int
-                                                               unsigned long long int
-
-    u or U              unsigned int                           unsigned int
-                        unsigned long int                      unsigned long int
-                        unsigned long long int                 unsigned long long int
-
-    l or L              long int                               long int
-                        long long int                          unsigned long int
-                                                               long long int
-                                                               unsigned long long int
-
-    Both u or U         unsigned long int                      unsigned long int
-    and l or L          unsigned long long int                 unsigned long long int
-
-    ll or LL            long long int                          long long int
-                                                               unsigned long long int
-
-    Both u or U         unsigned long long int                 unsigned long long int
-    and ll or LL
-6   If an integer constant cannot be represented by any type in its list, it may have an
-    extended integer type, if the extended integer type can represent its value. If all of the
-    types in the list for the constant are signed, the extended integer type shall be signed. If
-    all of the types in the list for the constant are unsigned, the extended integer type shall be
-    unsigned. If the list contains both signed and unsigned types, the extended integer type
-    may be signed or unsigned. If an integer constant cannot be represented by any type in
-    its list and has no extended integer type, then the integer constant has no type.
-
-
-
-
-[<a name="p56" href="#p56">page 56</a>] (<a href="#Contents">Contents</a>)
-
-<a name="6.4.4.2" href="#6.4.4.2"><b>    6.4.4.2 Floating constants</b></a>
-    Syntax
-1            floating-constant:
-                    decimal-floating-constant
-                    hexadecimal-floating-constant
-             decimal-floating-constant:
-                   fractional-constant exponent-partopt floating-suffixopt
-                   digit-sequence exponent-part floating-suffixopt
-             hexadecimal-floating-constant:
-                   hexadecimal-prefix hexadecimal-fractional-constant
-                                  binary-exponent-part floating-suffixopt
-                   hexadecimal-prefix hexadecimal-digit-sequence
-                                  binary-exponent-part floating-suffixopt
-             fractional-constant:
-                     digit-sequenceopt . digit-sequence
-                     digit-sequence .
-             exponent-part:
-                   e signopt digit-sequence
-                   E signopt digit-sequence
-             sign: one of
-                    + -
-             digit-sequence:
-                     digit
-                     digit-sequence digit
-             hexadecimal-fractional-constant:
-                   hexadecimal-digit-sequenceopt .
-                                  hexadecimal-digit-sequence
-                   hexadecimal-digit-sequence .
-             binary-exponent-part:
-                    p signopt digit-sequence
-                    P signopt digit-sequence
-             hexadecimal-digit-sequence:
-                   hexadecimal-digit
-                   hexadecimal-digit-sequence hexadecimal-digit
-             floating-suffix: one of
-                    f l F L
-
-[<a name="p57" href="#p57">page 57</a>] (<a href="#Contents">Contents</a>)
-
-    Description
-2   A floating constant has a significand part that may be followed by an exponent part and a
-    suffix that specifies its type. The components of the significand part may include a digit
-    sequence representing the whole-number part, followed by a period (.), followed by a
-    digit sequence representing the fraction part. The components of the exponent part are an
-    e, E, p, or P followed by an exponent consisting of an optionally signed digit sequence.
-    Either the whole-number part or the fraction part has to be present; for decimal floating
-    constants, either the period or the exponent part has to be present.
-    Semantics
-3   The significand part is interpreted as a (decimal or hexadecimal) rational number; the
-    digit sequence in the exponent part is interpreted as a decimal integer. For decimal
-    floating constants, the exponent indicates the power of 10 by which the significand part is
-    to be scaled. For hexadecimal floating constants, the exponent indicates the power of 2
-    by which the significand part is to be scaled. For decimal floating constants, and also for
-    hexadecimal floating constants when FLT_RADIX is not a power of 2, the result is either
-    the nearest representable value, or the larger or smaller representable value immediately
-    adjacent to the nearest representable value, chosen in an implementation-defined manner.
-    For hexadecimal floating constants when FLT_RADIX is a power of 2, the result is
-    correctly rounded.
-4   An unsuffixed floating constant has type double. If suffixed by the letter f or F, it has
-    type float. If suffixed by the letter l or L, it has type long double.
-5   Floating constants are converted to internal format as if at translation-time. The
-    conversion of a floating constant shall not raise an exceptional condition or a floating-
-    point exception at execution time.
-    Recommended practice
-6   The implementation should produce a diagnostic message if a hexadecimal constant
-    cannot be represented exactly in its evaluation format; the implementation should then
-    proceed with the translation of the program.
-7   The translation-time conversion of floating constants should match the execution-time
-    conversion of character strings by library functions, such as strtod, given matching
-    inputs suitable for both conversions, the same result format, and default execution-time
-    rounding.64)
-
-
-
-
-    64) The specification for the library functions recommends more accurate conversion than required for
-        floating constants (see <a href="#7.20.1.3">7.20.1.3</a>).
-
-[<a name="p58" href="#p58">page 58</a>] (<a href="#Contents">Contents</a>)
-
-<a name="6.4.4.3" href="#6.4.4.3"><b>    6.4.4.3 Enumeration constants</b></a>
-    Syntax
-1            enumeration-constant:
-                   identifier
-    Semantics
-2   An identifier declared as an enumeration constant has type int.
-    Forward references: enumeration specifiers (<a href="#6.7.2.2">6.7.2.2</a>).
-<a name="6.4.4.4" href="#6.4.4.4"><b>    6.4.4.4 Character constants</b></a>
-    Syntax
-1            character-constant:
-                    ' c-char-sequence '
-                    L' c-char-sequence '
-             c-char-sequence:
-                    c-char
-                    c-char-sequence c-char
-             c-char:
-                       any member of the source character set except
-                                    the single-quote ', backslash \, or new-line character
-                       escape-sequence
-             escape-sequence:
-                    simple-escape-sequence
-                    octal-escape-sequence
-                    hexadecimal-escape-sequence
-                    universal-character-name
-             simple-escape-sequence: one of
-                    \' \" \? \\
-                    \a \b \f \n \r                  \t    \v
-             octal-escape-sequence:
-                     \ octal-digit
-                     \ octal-digit octal-digit
-                     \ octal-digit octal-digit octal-digit
-             hexadecimal-escape-sequence:
-                   \x hexadecimal-digit
-                   hexadecimal-escape-sequence hexadecimal-digit
-
-
-
-[<a name="p59" href="#p59">page 59</a>] (<a href="#Contents">Contents</a>)
-
-    Description
-2   An integer character constant is a sequence of one or more multibyte characters enclosed
-    in single-quotes, as in 'x'. A wide character constant is the same, except prefixed by the
-    letter L. With a few exceptions detailed later, the elements of the sequence are any
-    members of the source character set; they are mapped in an implementation-defined
-    manner to members of the execution character set.
-3   The single-quote ', the double-quote ", the question-mark ?, the backslash \, and
-    arbitrary integer values are representable according to the following table of escape
-    sequences:
-           single quote '                 \'
-           double quote "                 \"
-           question mark ?                \?
-           backslash \                    \\
-           octal character                \octal digits
-           hexadecimal character          \x hexadecimal digits
-4   The double-quote " and question-mark ? are representable either by themselves or by the
-    escape sequences \" and \?, respectively, but the single-quote ' and the backslash \
-    shall be represented, respectively, by the escape sequences \' and \\.
-5   The octal digits that follow the backslash in an octal escape sequence are taken to be part
-    of the construction of a single character for an integer character constant or of a single
-    wide character for a wide character constant. The numerical value of the octal integer so
-    formed specifies the value of the desired character or wide character.
-6   The hexadecimal digits that follow the backslash and the letter x in a hexadecimal escape
-    sequence are taken to be part of the construction of a single character for an integer
-    character constant or of a single wide character for a wide character constant. The
-    numerical value of the hexadecimal integer so formed specifies the value of the desired
-    character or wide character.
-7   Each octal or hexadecimal escape sequence is the longest sequence of characters that can
-    constitute the escape sequence.
-8   In addition, characters not in the basic character set are representable by universal
-    character names and certain nongraphic characters are representable by escape sequences
-    consisting of the backslash \ followed by a lowercase letter: \a, \b, \f, \n, \r, \t,
-    and \v.65)
-
-
-
-
-    65) The semantics of these characters were discussed in <a href="#5.2.2">5.2.2</a>. If any other character follows a backslash,
-        the result is not a token and a diagnostic is required. See ''future language directions'' (<a href="#6.11.4">6.11.4</a>).
-
-[<a name="p60" href="#p60">page 60</a>] (<a href="#Contents">Contents</a>)
-
-     Constraints
-9    The value of an octal or hexadecimal escape sequence shall be in the range of
-     representable values for the type unsigned char for an integer character constant, or
-     the unsigned type corresponding to wchar_t for a wide character constant.
-     Semantics
-10   An integer character constant has type int. The value of an integer character constant
-     containing a single character that maps to a single-byte execution character is the
-     numerical value of the representation of the mapped character interpreted as an integer.
-     The value of an integer character constant containing more than one character (e.g.,
-     'ab'), or containing a character or escape sequence that does not map to a single-byte
-     execution character, is implementation-defined. If an integer character constant contains
-     a single character or escape sequence, its value is the one that results when an object with
-     type char whose value is that of the single character or escape sequence is converted to
-     type int.
-11   A wide character constant has type wchar_t, an integer type defined in the
-     <a href="#7.17">&lt;stddef.h&gt;</a> header. The value of a wide character constant containing a single
-     multibyte character that maps to a member of the extended execution character set is the
-     wide character corresponding to that multibyte character, as defined by the mbtowc
-     function, with an implementation-defined current locale. The value of a wide character
-     constant containing more than one multibyte character, or containing a multibyte
-     character or escape sequence not represented in the extended execution character set, is
-     implementation-defined.
-12   EXAMPLE 1      The construction '\0' is commonly used to represent the null character.
-
-13   EXAMPLE 2 Consider implementations that use two's-complement representation for integers and eight
-     bits for objects that have type char. In an implementation in which type char has the same range of
-     values as signed char, the integer character constant '\xFF' has the value -1; if type char has the
-     same range of values as unsigned char, the character constant '\xFF' has the value +255.
-
-14   EXAMPLE 3 Even if eight bits are used for objects that have type char, the construction '\x123'
-     specifies an integer character constant containing only one character, since a hexadecimal escape sequence
-     is terminated only by a non-hexadecimal character. To specify an integer character constant containing the
-     two characters whose values are '\x12' and '3', the construction '\0223' may be used, since an octal
-     escape sequence is terminated after three octal digits. (The value of this two-character integer character
-     constant is implementation-defined.)
-
-15   EXAMPLE 4 Even if 12 or more bits are used for objects that have type wchar_t, the construction
-     L'\1234' specifies the implementation-defined value that results from the combination of the values
-     0123 and '4'.
-
-     Forward references: common definitions <a href="#7.17">&lt;stddef.h&gt;</a> (<a href="#7.17">7.17</a>), the mbtowc function
-     (<a href="#7.20.7.2">7.20.7.2</a>).
-
-
-
-
-[<a name="p61" href="#p61">page 61</a>] (<a href="#Contents">Contents</a>)
-
-<a name="6.4.5" href="#6.4.5"><b>    6.4.5 String literals</b></a>
-    Syntax
-1            string-literal:
-                     " s-char-sequenceopt "
-                     L" s-char-sequenceopt "
-             s-char-sequence:
-                    s-char
-                    s-char-sequence s-char
-             s-char:
-                       any member of the source character set except
-                                    the double-quote ", backslash \, or new-line character
-                       escape-sequence
-    Description
-2   A character string literal is a sequence of zero or more multibyte characters enclosed in
-    double-quotes, as in "xyz". A wide string literal is the same, except prefixed by the
-    letter L.
-3   The same considerations apply to each element of the sequence in a character string
-    literal or a wide string literal as if it were in an integer character constant or a wide
-    character constant, except that the single-quote ' is representable either by itself or by the
-    escape sequence \', but the double-quote " shall be represented by the escape sequence
-    \".
-    Semantics
-4   In translation phase 6, the multibyte character sequences specified by any sequence of
-    adjacent character and wide string literal tokens are concatenated into a single multibyte
-    character sequence. If any of the tokens are wide string literal tokens, the resulting
-    multibyte character sequence is treated as a wide string literal; otherwise, it is treated as a
-    character string literal.
-5   In translation phase 7, a byte or code of value zero is appended to each multibyte
-    character sequence that results from a string literal or literals.66) The multibyte character
-    sequence is then used to initialize an array of static storage duration and length just
-    sufficient to contain the sequence. For character string literals, the array elements have
-    type char, and are initialized with the individual bytes of the multibyte character
-    sequence; for wide string literals, the array elements have type wchar_t, and are
-    initialized with the sequence of wide characters corresponding to the multibyte character
-
-    66) A character string literal need not be a string (see <a href="#7.1.1">7.1.1</a>), because a null character may be embedded in
-        it by a \0 escape sequence.
-
-[<a name="p62" href="#p62">page 62</a>] (<a href="#Contents">Contents</a>)
-
-    sequence, as defined by the mbstowcs function with an implementation-defined current
-    locale. The value of a string literal containing a multibyte character or escape sequence
-    not represented in the execution character set is implementation-defined.
-6   It is unspecified whether these arrays are distinct provided their elements have the
-    appropriate values. If the program attempts to modify such an array, the behavior is
-    undefined.
-7   EXAMPLE       This pair of adjacent character string literals
-             "\x12" "3"
-    produces a single character string literal containing the two characters whose values are '\x12' and '3',
-    because escape sequences are converted into single members of the execution character set just prior to
-    adjacent string literal concatenation.
-
-    Forward references: common definitions <a href="#7.17">&lt;stddef.h&gt;</a> (<a href="#7.17">7.17</a>), the mbstowcs
-    function (<a href="#7.20.8.1">7.20.8.1</a>).
-<a name="6.4.6" href="#6.4.6"><b>    6.4.6 Punctuators</b></a>
-    Syntax
-1            punctuator: one of
-                    [ ] ( ) { } . -&gt;
-                    ++ -- &amp; * + - ~ !
-                    / % &lt;&lt; &gt;&gt; &lt; &gt; &lt;= &gt;=                               ==     !=     ^    |     &amp;&amp;     ||
-                    ? : ; ...
-                    = *= /= %= += -= &lt;&lt;=                              &gt;&gt;=      &amp;=       ^=   |=
-                    , # ##
-                    &lt;: :&gt; &lt;% %&gt; %: %:%:
-    Semantics
-2   A punctuator is a symbol that has independent syntactic and semantic significance.
-    Depending on context, it may specify an operation to be performed (which in turn may
-    yield a value or a function designator, produce a side effect, or some combination thereof)
-    in which case it is known as an operator (other forms of operator also exist in some
-    contexts). An operand is an entity on which an operator acts.
-
-
-
-
-[<a name="p63" href="#p63">page 63</a>] (<a href="#Contents">Contents</a>)
-
-3   In all aspects of the language, the six tokens67)
-             &lt;:    :&gt;      &lt;%    %&gt;     %:     %:%:
-    behave, respectively, the same as the six tokens
-             [     ]       {     }      #      ##
-    except for their spelling.68)
-    Forward references: expressions (<a href="#6.5">6.5</a>), declarations (<a href="#6.7">6.7</a>), preprocessing directives
-    (<a href="#6.10">6.10</a>), statements (<a href="#6.8">6.8</a>).
-<a name="6.4.7" href="#6.4.7"><b>    6.4.7 Header names</b></a>
-    Syntax
-1            header-name:
-                    &lt; h-char-sequence &gt;
-                    " q-char-sequence "
-             h-char-sequence:
-                    h-char
-                    h-char-sequence h-char
-             h-char:
-                       any member of the source character set except
-                                    the new-line character and &gt;
-             q-char-sequence:
-                    q-char
-                    q-char-sequence q-char
-             q-char:
-                       any member of the source character set except
-                                    the new-line character and "
-    Semantics
-2   The sequences in both forms of header names are mapped in an implementation-defined
-    manner to headers or external source file names as specified in <a href="#6.10.2">6.10.2</a>.
-3   If the characters ', \, ", //, or /* occur in the sequence between the &lt; and &gt; delimiters,
-    the behavior is undefined. Similarly, if the characters ', \, //, or /* occur in the
-
-
-
-
-    67) These tokens are sometimes called ''digraphs''.
-    68) Thus [ and &lt;: behave differently when ''stringized'' (see <a href="#6.10.3.2">6.10.3.2</a>), but can otherwise be freely
-        interchanged.
-
-[<a name="p64" href="#p64">page 64</a>] (<a href="#Contents">Contents</a>)
-
-    sequence between the " delimiters, the behavior is undefined.69) Header name
-    preprocessing tokens are recognized only within #include preprocessing directives and
-    in implementation-defined locations within #pragma directives.70)
-4   EXAMPLE       The following sequence of characters:
-             0x3&lt;1/a.h&gt;1e2
-             #include &lt;1/a.h&gt;
-             #define const.member@$
-    forms the following sequence of preprocessing tokens (with each individual preprocessing token delimited
-    by a { on the left and a } on the right).
-             {0x3}{&lt;}{1}{/}{a}{.}{h}{&gt;}{1e2}
-             {#}{include} {&lt;1/a.h&gt;}
-             {#}{define} {const}{.}{member}{@}{$}
-
-    Forward references: source file inclusion (<a href="#6.10.2">6.10.2</a>).
-<a name="6.4.8" href="#6.4.8"><b>    6.4.8 Preprocessing numbers</b></a>
-    Syntax
-1            pp-number:
-                   digit
-                   . digit
-                   pp-number       digit
-                   pp-number       identifier-nondigit
-                   pp-number       e sign
-                   pp-number       E sign
-                   pp-number       p sign
-                   pp-number       P sign
-                   pp-number       .
-    Description
-2   A preprocessing number begins with a digit optionally preceded by a period (.) and may
-    be followed by valid identifier characters and the character sequences e+, e-, E+, E-,
-    p+, p-, P+, or P-.
-3   Preprocessing number tokens lexically include all floating and integer constant tokens.
-    Semantics
-4   A preprocessing number does not have type or a value; it acquires both after a successful
-    conversion (as part of translation phase 7) to a floating constant token or an integer
-    constant token.
-
-
-    69) Thus, sequences of characters that resemble escape sequences cause undefined behavior.
-    70) For an example of a header name preprocessing token used in a #pragma directive, see <a href="#6.10.9">6.10.9</a>.
-
-[<a name="p65" href="#p65">page 65</a>] (<a href="#Contents">Contents</a>)
-
-<a name="6.4.9" href="#6.4.9"><b>    6.4.9 Comments</b></a>
-1   Except within a character constant, a string literal, or a comment, the characters /*
-    introduce a comment. The contents of such a comment are examined only to identify
-    multibyte characters and to find the characters */ that terminate it.71)
-2   Except within a character constant, a string literal, or a comment, the characters //
-    introduce a comment that includes all multibyte characters up to, but not including, the
-    next new-line character. The contents of such a comment are examined only to identify
-    multibyte characters and to find the terminating new-line character.
-3   EXAMPLE
-            "a//b"                              //   four-character string literal
-            #include "//e"                      //   undefined behavior
-            // */                               //   comment, not syntax error
-            f = g/**//h;                        //   equivalent to f = g / h;
-            //\
-            i();                                // part of a two-line comment
-            /\
-            / j();                              // part of a two-line comment
-            #define glue(x,y) x##y
-            glue(/,/) k();                      // syntax error, not comment
-            /*//*/ l();                         // equivalent to l();
-            m = n//**/o
-               + p;                             // equivalent to m = n + p;
-
-
-
-
-    71) Thus, /* ... */ comments do not nest.
-
-[<a name="p66" href="#p66">page 66</a>] (<a href="#Contents">Contents</a>)
-
-<a name="6.5" href="#6.5"><b>    6.5 Expressions</b></a>
-1   An expression is a sequence of operators and operands that specifies computation of a
-    value, or that designates an object or a function, or that generates side effects, or that
-    performs a combination thereof.
-2   Between the previous and next sequence point an object shall have its stored value
-    modified at most once by the evaluation of an expression.72) Furthermore, the prior value
-    shall be read only to determine the value to be stored.73)
-3   The grouping of operators and operands is indicated by the syntax.74) Except as specified
-    later (for the function-call (), &amp;&amp;, ||, ?:, and comma operators), the order of evaluation
-    of subexpressions and the order in which side effects take place are both unspecified.
-4   Some operators (the unary operator ~, and the binary operators &lt;&lt;, &gt;&gt;, &amp;, ^, and |,
-    collectively described as bitwise operators) are required to have operands that have
-    integer type. These operators yield values that depend on the internal representations of
-    integers, and have implementation-defined and undefined aspects for signed types.
-5   If an exceptional condition occurs during the evaluation of an expression (that is, if the
-    result is not mathematically defined or not in the range of representable values for its
-    type), the behavior is undefined.
-6   The effective type of an object for an access to its stored value is the declared type of the
-    object, if any.75) If a value is stored into an object having no declared type through an
-    lvalue having a type that is not a character type, then the type of the lvalue becomes the
-
-
-    72) A floating-point status flag is not an object and can be set more than once within an expression.
-    73) This paragraph renders undefined statement expressions such as
-                   i = ++i + 1;
-                   a[i++] = i;
-           while allowing
-                   i = i + 1;
-                   a[i] = i;
-
-    74) The syntax specifies the precedence of operators in the evaluation of an expression, which is the same
-        as the order of the major subclauses of this subclause, highest precedence first. Thus, for example, the
-        expressions allowed as the operands of the binary + operator (<a href="#6.5.6">6.5.6</a>) are those expressions defined in
-        <a href="#6.5.1">6.5.1</a> through <a href="#6.5.6">6.5.6</a>. The exceptions are cast expressions (<a href="#6.5.4">6.5.4</a>) as operands of unary operators
-        (<a href="#6.5.3">6.5.3</a>), and an operand contained between any of the following pairs of operators: grouping
-        parentheses () (<a href="#6.5.1">6.5.1</a>), subscripting brackets [] (<a href="#6.5.2.1">6.5.2.1</a>), function-call parentheses () (<a href="#6.5.2.2">6.5.2.2</a>), and
-        the conditional operator ?: (<a href="#6.5.15">6.5.15</a>).
-           Within each major subclause, the operators have the same precedence. Left- or right-associativity is
-           indicated in each subclause by the syntax for the expressions discussed therein.
-    75) Allocated objects have no declared type.
-
-[<a name="p67" href="#p67">page 67</a>] (<a href="#Contents">Contents</a>)
-
-    effective type of the object for that access and for subsequent accesses that do not modify
-    the stored value. If a value is copied into an object having no declared type using
-    memcpy or memmove, or is copied as an array of character type, then the effective type
-    of the modified object for that access and for subsequent accesses that do not modify the
-    value is the effective type of the object from which the value is copied, if it has one. For
-    all other accesses to an object having no declared type, the effective type of the object is
-    simply the type of the lvalue used for the access.
-7   An object shall have its stored value accessed only by an lvalue expression that has one of
-    the following types:76)
-    -- a type compatible with the effective type of the object,
-    -- a qualified version of a type compatible with the effective type of the object,
-    -- a type that is the signed or unsigned type corresponding to the effective type of the
-      object,
-    -- a type that is the signed or unsigned type corresponding to a qualified version of the
-      effective type of the object,
-    -- an aggregate or union type that includes one of the aforementioned types among its
-      members (including, recursively, a member of a subaggregate or contained union), or
-    -- a character type.
-8   A floating expression may be contracted, that is, evaluated as though it were an atomic
-    operation, thereby omitting rounding errors implied by the source code and the
-    expression evaluation method.77) The FP_CONTRACT pragma in <a href="#7.12">&lt;math.h&gt;</a> provides a
-    way to disallow contracted expressions. Otherwise, whether and how expressions are
-    contracted is implementation-defined.78)
-    Forward references: the FP_CONTRACT pragma (<a href="#7.12.2">7.12.2</a>), copying functions (<a href="#7.21.2">7.21.2</a>).
-
-
-
-
-    76) The intent of this list is to specify those circumstances in which an object may or may not be aliased.
-    77) A contracted expression might also omit the raising of floating-point exceptions.
-    78) This license is specifically intended to allow implementations to exploit fast machine instructions that
-        combine multiple C operators. As contractions potentially undermine predictability, and can even
-        decrease accuracy for containing expressions, their use needs to be well-defined and clearly
-        documented.
-
-[<a name="p68" href="#p68">page 68</a>] (<a href="#Contents">Contents</a>)
-
-<a name="6.5.1" href="#6.5.1"><b>    6.5.1 Primary expressions</b></a>
-    Syntax
-1            primary-expression:
-                    identifier
-                    constant
-                    string-literal
-                    ( expression )
-    Semantics
-2   An identifier is a primary expression, provided it has been declared as designating an
-    object (in which case it is an lvalue) or a function (in which case it is a function
-    designator).79)
-3   A constant is a primary expression. Its type depends on its form and value, as detailed in
-    <a href="#6.4.4">6.4.4</a>.
-4   A string literal is a primary expression. It is an lvalue with type as detailed in <a href="#6.4.5">6.4.5</a>.
-5   A parenthesized expression is a primary expression. Its type and value are identical to
-    those of the unparenthesized expression. It is an lvalue, a function designator, or a void
-    expression if the unparenthesized expression is, respectively, an lvalue, a function
-    designator, or a void expression.
-    Forward references: declarations (<a href="#6.7">6.7</a>).
-<a name="6.5.2" href="#6.5.2"><b>    6.5.2 Postfix operators</b></a>
-    Syntax
-1            postfix-expression:
-                    primary-expression
-                    postfix-expression [ expression ]
-                    postfix-expression ( argument-expression-listopt )
-                    postfix-expression . identifier
-                    postfix-expression -&gt; identifier
-                    postfix-expression ++
-                    postfix-expression --
-                    ( type-name ) { initializer-list }
-                    ( type-name ) { initializer-list , }
-
-
-
-
-    79) Thus, an undeclared identifier is a violation of the syntax.
-
-[<a name="p69" href="#p69">page 69</a>] (<a href="#Contents">Contents</a>)
-
-             argument-expression-list:
-                   assignment-expression
-                   argument-expression-list , assignment-expression
-<a name="6.5.2.1" href="#6.5.2.1"><b>    6.5.2.1 Array subscripting</b></a>
-    Constraints
-1   One of the expressions shall have type ''pointer to object type'', the other expression shall
-    have integer type, and the result has type ''type''.
-    Semantics
-2   A postfix expression followed by an expression in square brackets [] is a subscripted
-    designation of an element of an array object. The definition of the subscript operator []
-    is that E1[E2] is identical to (*((E1)+(E2))). Because of the conversion rules that
-    apply to the binary + operator, if E1 is an array object (equivalently, a pointer to the
-    initial element of an array object) and E2 is an integer, E1[E2] designates the E2-th
-    element of E1 (counting from zero).
-3   Successive subscript operators designate an element of a multidimensional array object.
-    If E is an n-dimensional array (n &gt;= 2) with dimensions i x j x . . . x k, then E (used as
-    other than an lvalue) is converted to a pointer to an (n - 1)-dimensional array with
-    dimensions j x . . . x k. If the unary * operator is applied to this pointer explicitly, or
-    implicitly as a result of subscripting, the result is the pointed-to (n - 1)-dimensional array,
-    which itself is converted into a pointer if used as other than an lvalue. It follows from this
-    that arrays are stored in row-major order (last subscript varies fastest).
-4   EXAMPLE        Consider the array object defined by the declaration
-             int x[3][5];
-    Here x is a 3 x 5 array of ints; more precisely, x is an array of three element objects, each of which is an
-    array of five ints. In the expression x[i], which is equivalent to (*((x)+(i))), x is first converted to
-    a pointer to the initial array of five ints. Then i is adjusted according to the type of x, which conceptually
-    entails multiplying i by the size of the object to which the pointer points, namely an array of five int
-    objects. The results are added and indirection is applied to yield an array of five ints. When used in the
-    expression x[i][j], that array is in turn converted to a pointer to the first of the ints, so x[i][j]
-    yields an int.
-
-    Forward references: additive operators (<a href="#6.5.6">6.5.6</a>), address and indirection operators
-    (<a href="#6.5.3.2">6.5.3.2</a>), array declarators (<a href="#6.7.5.2">6.7.5.2</a>).
-
-
-
-
-[<a name="p70" href="#p70">page 70</a>] (<a href="#Contents">Contents</a>)
-
-<a name="6.5.2.2" href="#6.5.2.2"><b>    6.5.2.2 Function calls</b></a>
-    Constraints
-1   The expression that denotes the called function80) shall have type pointer to function
-    returning void or returning an object type other than an array type.
-2   If the expression that denotes the called function has a type that includes a prototype, the
-    number of arguments shall agree with the number of parameters. Each argument shall
-    have a type such that its value may be assigned to an object with the unqualified version
-    of the type of its corresponding parameter.
-    Semantics
-3   A postfix expression followed by parentheses () containing a possibly empty, comma-
-    separated list of expressions is a function call. The postfix expression denotes the called
-    function. The list of expressions specifies the arguments to the function.
-4   An argument may be an expression of any object type. In preparing for the call to a
-    function, the arguments are evaluated, and each parameter is assigned the value of the
-    corresponding argument.81)
-5   If the expression that denotes the called function has type pointer to function returning an
-    object type, the function call expression has the same type as that object type, and has the
-    value determined as specified in <a href="#6.8.6.4">6.8.6.4</a>. Otherwise, the function call has type void. If
-    an attempt is made to modify the result of a function call or to access it after the next
-    sequence point, the behavior is undefined.
-6   If the expression that denotes the called function has a type that does not include a
-    prototype, the integer promotions are performed on each argument, and arguments that
-    have type float are promoted to double. These are called the default argument
-    promotions. If the number of arguments does not equal the number of parameters, the
-    behavior is undefined. If the function is defined with a type that includes a prototype, and
-    either the prototype ends with an ellipsis (, ...) or the types of the arguments after
-    promotion are not compatible with the types of the parameters, the behavior is undefined.
-    If the function is defined with a type that does not include a prototype, and the types of
-    the arguments after promotion are not compatible with those of the parameters after
-    promotion, the behavior is undefined, except for the following cases:
-
-
-
-
-    80) Most often, this is the result of converting an identifier that is a function designator.
-    81) A function may change the values of its parameters, but these changes cannot affect the values of the
-        arguments. On the other hand, it is possible to pass a pointer to an object, and the function may
-        change the value of the object pointed to. A parameter declared to have array or function type is
-        adjusted to have a pointer type as described in <a href="#6.9.1">6.9.1</a>.
-
-[<a name="p71" href="#p71">page 71</a>] (<a href="#Contents">Contents</a>)
-
-     -- one promoted type is a signed integer type, the other promoted type is the
-       corresponding unsigned integer type, and the value is representable in both types;
-     -- both types are pointers to qualified or unqualified versions of a character type or
-       void.
-7    If the expression that denotes the called function has a type that does include a prototype,
-     the arguments are implicitly converted, as if by assignment, to the types of the
-     corresponding parameters, taking the type of each parameter to be the unqualified version
-     of its declared type. The ellipsis notation in a function prototype declarator causes
-     argument type conversion to stop after the last declared parameter. The default argument
-     promotions are performed on trailing arguments.
-8    No other conversions are performed implicitly; in particular, the number and types of
-     arguments are not compared with those of the parameters in a function definition that
-     does not include a function prototype declarator.
-9    If the function is defined with a type that is not compatible with the type (of the
-     expression) pointed to by the expression that denotes the called function, the behavior is
-     undefined.
-10   The order of evaluation of the function designator, the actual arguments, and
-     subexpressions within the actual arguments is unspecified, but there is a sequence point
-     before the actual call.
-11   Recursive function calls shall be permitted, both directly and indirectly through any chain
-     of other functions.
-12   EXAMPLE       In the function call
-             (*pf[f1()]) (f2(), f3() + f4())
-     the functions f1, f2, f3, and f4 may be called in any order. All side effects have to be completed before
-     the function pointed to by pf[f1()] is called.
-
-     Forward references: function declarators (including prototypes) (<a href="#6.7.5.3">6.7.5.3</a>), function
-     definitions (<a href="#6.9.1">6.9.1</a>), the return statement (<a href="#6.8.6.4">6.8.6.4</a>), simple assignment (<a href="#6.5.16.1">6.5.16.1</a>).
-<a name="6.5.2.3" href="#6.5.2.3"><b>     6.5.2.3 Structure and union members</b></a>
-     Constraints
-1    The first operand of the . operator shall have a qualified or unqualified structure or union
-     type, and the second operand shall name a member of that type.
-2    The first operand of the -&gt; operator shall have type ''pointer to qualified or unqualified
-     structure'' or ''pointer to qualified or unqualified union'', and the second operand shall
-     name a member of the type pointed to.
-
-
-
-
-[<a name="p72" href="#p72">page 72</a>] (<a href="#Contents">Contents</a>)
-
-    Semantics
-3   A postfix expression followed by the . operator and an identifier designates a member of
-    a structure or union object. The value is that of the named member,82) and is an lvalue if
-    the first expression is an lvalue. If the first expression has qualified type, the result has
-    the so-qualified version of the type of the designated member.
-4   A postfix expression followed by the -&gt; operator and an identifier designates a member
-    of a structure or union object. The value is that of the named member of the object to
-    which the first expression points, and is an lvalue.83) If the first expression is a pointer to
-    a qualified type, the result has the so-qualified version of the type of the designated
-    member.
-5   One special guarantee is made in order to simplify the use of unions: if a union contains
-    several structures that share a common initial sequence (see below), and if the union
-    object currently contains one of these structures, it is permitted to inspect the common
-    initial part of any of them anywhere that a declaration of the complete type of the union is
-    visible. Two structures share a common initial sequence if corresponding members have
-    compatible types (and, for bit-fields, the same widths) for a sequence of one or more
-    initial members.
-6   EXAMPLE 1 If f is a function returning a structure or union, and x is a member of that structure or
-    union, f().x is a valid postfix expression but is not an lvalue.
-
-7   EXAMPLE 2 In:
-             struct s { int i; const int ci; };
-             struct s s;
-             const struct s cs;
-             volatile struct s vs;
-    the various members have the types:
-             s.i        int
-             s.ci       const int
-             cs.i       const int
-             cs.ci      const int
-             vs.i       volatile int
-             vs.ci      volatile const int
-
-
-
-
-    82) If the member used to access the contents of a union object is not the same as the member last used to
-        store a value in the object, the appropriate part of the object representation of the value is reinterpreted
-        as an object representation in the new type as described in <a href="#6.2.6">6.2.6</a> (a process sometimes called "type
-        punning"). This might be a trap representation.
-    83) If &amp;E is a valid pointer expression (where &amp; is the ''address-of '' operator, which generates a pointer to
-        its operand), the expression (&amp;E)-&gt;MOS is the same as E.MOS.
-
-[<a name="p73" href="#p73">page 73</a>] (<a href="#Contents">Contents</a>)
-
-8   EXAMPLE 3       The following is a valid fragment:
-             union {
-                     struct {
-                           int      alltypes;
-                     } n;
-                     struct {
-                           int      type;
-                           int      intnode;
-                     } ni;
-                     struct {
-                           int      type;
-                           double doublenode;
-                     } nf;
-             } u;
-             u.nf.type = 1;
-             u.nf.doublenode = <a href="#3.14">3.14</a>;
-             /* ... */
-             if (u.n.alltypes == 1)
-                     if (sin(u.nf.doublenode) == 0.0)
-                           /* ... */
-    The following is not a valid fragment (because the union type is not visible within function f):
-             struct t1 { int m; };
-             struct t2 { int m; };
-             int f(struct t1 *p1, struct t2 *p2)
-             {
-                   if (p1-&gt;m &lt; 0)
-                           p2-&gt;m = -p2-&gt;m;
-                   return p1-&gt;m;
-             }
-             int g()
-             {
-                   union {
-                           struct t1 s1;
-                           struct t2 s2;
-                   } u;
-                   /* ... */
-                   return f(&amp;u.s1, &amp;u.s2);
-             }
-
-    Forward references: address and indirection operators (<a href="#6.5.3.2">6.5.3.2</a>), structure and union
-    specifiers (<a href="#6.7.2.1">6.7.2.1</a>).
-
-
-
-
-[<a name="p74" href="#p74">page 74</a>] (<a href="#Contents">Contents</a>)
-
-<a name="6.5.2.4" href="#6.5.2.4"><b>    6.5.2.4 Postfix increment and decrement operators</b></a>
-    Constraints
-1   The operand of the postfix increment or decrement operator shall have qualified or
-    unqualified real or pointer type and shall be a modifiable lvalue.
-    Semantics
-2   The result of the postfix ++ operator is the value of the operand. After the result is
-    obtained, the value of the operand is incremented. (That is, the value 1 of the appropriate
-    type is added to it.) See the discussions of additive operators and compound assignment
-    for information on constraints, types, and conversions and the effects of operations on
-    pointers. The side effect of updating the stored value of the operand shall occur between
-    the previous and the next sequence point.
-3   The postfix -- operator is analogous to the postfix ++ operator, except that the value of
-    the operand is decremented (that is, the value 1 of the appropriate type is subtracted from
-    it).
-    Forward references: additive operators (<a href="#6.5.6">6.5.6</a>), compound assignment (<a href="#6.5.16.2">6.5.16.2</a>).
-<a name="6.5.2.5" href="#6.5.2.5"><b>    6.5.2.5 Compound literals</b></a>
-    Constraints
-1   The type name shall specify an object type or an array of unknown size, but not a variable
-    length array type.
-2   No initializer shall attempt to provide a value for an object not contained within the entire
-    unnamed object specified by the compound literal.
-3   If the compound literal occurs outside the body of a function, the initializer list shall
-    consist of constant expressions.
-    Semantics
-4   A postfix expression that consists of a parenthesized type name followed by a brace-
-    enclosed list of initializers is a compound literal. It provides an unnamed object whose
-    value is given by the initializer list.84)
-5   If the type name specifies an array of unknown size, the size is determined by the
-    initializer list as specified in <a href="#6.7.8">6.7.8</a>, and the type of the compound literal is that of the
-    completed array type. Otherwise (when the type name specifies an object type), the type
-    of the compound literal is that specified by the type name. In either case, the result is an
-    lvalue.
-
-
-    84) Note that this differs from a cast expression. For example, a cast specifies a conversion to scalar types
-        or void only, and the result of a cast expression is not an lvalue.
-
-[<a name="p75" href="#p75">page 75</a>] (<a href="#Contents">Contents</a>)
-
-6    The value of the compound literal is that of an unnamed object initialized by the
-     initializer list. If the compound literal occurs outside the body of a function, the object
-     has static storage duration; otherwise, it has automatic storage duration associated with
-     the enclosing block.
-7    All the semantic rules and constraints for initializer lists in <a href="#6.7.8">6.7.8</a> are applicable to
-     compound literals.85)
-8    String literals, and compound literals with const-qualified types, need not designate
-     distinct objects.86)
-9    EXAMPLE 1       The file scope definition
-              int *p = (int []){2, 4};
-     initializes p to point to the first element of an array of two ints, the first having the value two and the
-     second, four. The expressions in this compound literal are required to be constant. The unnamed object
-     has static storage duration.
-
-10   EXAMPLE 2       In contrast, in
-              void f(void)
-              {
-                    int *p;
-                    /*...*/
-                    p = (int [2]){*p};
-                    /*...*/
-              }
-     p is assigned the address of the first element of an array of two ints, the first having the value previously
-     pointed to by p and the second, zero. The expressions in this compound literal need not be constant. The
-     unnamed object has automatic storage duration.
-
-11   EXAMPLE 3 Initializers with designations can be combined with compound literals. Structure objects
-     created using compound literals can be passed to functions without depending on member order:
-              drawline((struct point){.x=1, .y=1},
-                    (struct point){.x=3, .y=4});
-     Or, if drawline instead expected pointers to struct point:
-              drawline(&amp;(struct point){.x=1, .y=1},
-                    &amp;(struct point){.x=3, .y=4});
-
-12   EXAMPLE 4       A read-only compound literal can be specified through constructions like:
-              (const float []){1e0, 1e1, 1e2, 1e3, 1e4, 1e5, 1e6}
-
-
-
-
-     85) For example, subobjects without explicit initializers are initialized to zero.
-     86) This allows implementations to share storage for string literals and constant compound literals with
-         the same or overlapping representations.
-
-[<a name="p76" href="#p76">page 76</a>] (<a href="#Contents">Contents</a>)
-
-13   EXAMPLE 5        The following three expressions have different meanings:
-              "/tmp/fileXXXXXX"
-              (char []){"/tmp/fileXXXXXX"}
-              (const char []){"/tmp/fileXXXXXX"}
-     The first always has static storage duration and has type array of char, but need not be modifiable; the last
-     two have automatic storage duration when they occur within the body of a function, and the first of these
-     two is modifiable.
-
-14   EXAMPLE 6 Like string literals, const-qualified compound literals can be placed into read-only memory
-     and can even be shared. For example,
-              (const char []){"abc"} == "abc"
-     might yield 1 if the literals' storage is shared.
-
-15   EXAMPLE 7 Since compound literals are unnamed, a single compound literal cannot specify a circularly
-     linked object. For example, there is no way to write a self-referential compound literal that could be used
-     as the function argument in place of the named object endless_zeros below:
-              struct int_list { int car; struct int_list *cdr; };
-              struct int_list endless_zeros = {0, &amp;endless_zeros};
-              eval(endless_zeros);
-
-16   EXAMPLE 8        Each compound literal creates only a single object in a given scope:
-              struct s { int i; };
-              int f (void)
-              {
-                    struct s *p = 0, *q;
-                    int j = 0;
-              again:
-                    q = p, p = &amp;((struct s){ j++ });
-                    if (j &lt; 2) goto again;
-                        return p == q &amp;&amp; q-&gt;i == 1;
-              }
-     The function f() always returns the value 1.
-17   Note that if an iteration statement were used instead of an explicit goto and a labeled statement, the
-     lifetime of the unnamed object would be the body of the loop only, and on entry next time around p would
-     have an indeterminate value, which would result in undefined behavior.
-
-     Forward references: type names (<a href="#6.7.6">6.7.6</a>), initialization (<a href="#6.7.8">6.7.8</a>).
-
-
-
-
-[<a name="p77" href="#p77">page 77</a>] (<a href="#Contents">Contents</a>)
-
-<a name="6.5.3" href="#6.5.3"><b>    6.5.3 Unary operators</b></a>
-    Syntax
-1            unary-expression:
-                    postfix-expression
-                    ++ unary-expression
-                    -- unary-expression
-                    unary-operator cast-expression
-                    sizeof unary-expression
-                    sizeof ( type-name )
-             unary-operator: one of
-                    &amp; * + - ~             !
-<a name="6.5.3.1" href="#6.5.3.1"><b>    6.5.3.1 Prefix increment and decrement operators</b></a>
-    Constraints
-1   The operand of the prefix increment or decrement operator shall have qualified or
-    unqualified real or pointer type and shall be a modifiable lvalue.
-    Semantics
-2   The value of the operand of the prefix ++ operator is incremented. The result is the new
-    value of the operand after incrementation. The expression ++E is equivalent to (E+=1).
-    See the discussions of additive operators and compound assignment for information on
-    constraints, types, side effects, and conversions and the effects of operations on pointers.
-3   The prefix -- operator is analogous to the prefix ++ operator, except that the value of the
-    operand is decremented.
-    Forward references: additive operators (<a href="#6.5.6">6.5.6</a>), compound assignment (<a href="#6.5.16.2">6.5.16.2</a>).
-<a name="6.5.3.2" href="#6.5.3.2"><b>    6.5.3.2 Address and indirection operators</b></a>
-    Constraints
-1   The operand of the unary &amp; operator shall be either a function designator, the result of a
-    [] or unary * operator, or an lvalue that designates an object that is not a bit-field and is
-    not declared with the register storage-class specifier.
-2   The operand of the unary * operator shall have pointer type.
-    Semantics
-3   The unary &amp; operator yields the address of its operand. If the operand has type ''type'',
-    the result has type ''pointer to type''. If the operand is the result of a unary * operator,
-    neither that operator nor the &amp; operator is evaluated and the result is as if both were
-    omitted, except that the constraints on the operators still apply and the result is not an
-    lvalue. Similarly, if the operand is the result of a [] operator, neither the &amp; operator nor
-
-[<a name="p78" href="#p78">page 78</a>] (<a href="#Contents">Contents</a>)
-
-    the unary * that is implied by the [] is evaluated and the result is as if the &amp; operator
-    were removed and the [] operator were changed to a + operator. Otherwise, the result is
-    a pointer to the object or function designated by its operand.
-4   The unary * operator denotes indirection. If the operand points to a function, the result is
-    a function designator; if it points to an object, the result is an lvalue designating the
-    object. If the operand has type ''pointer to type'', the result has type ''type''. If an
-    invalid value has been assigned to the pointer, the behavior of the unary * operator is
-    undefined.87)
-    Forward references: storage-class specifiers (<a href="#6.7.1">6.7.1</a>), structure and union specifiers
-    (<a href="#6.7.2.1">6.7.2.1</a>).
-<a name="6.5.3.3" href="#6.5.3.3"><b>    6.5.3.3 Unary arithmetic operators</b></a>
-    Constraints
-1   The operand of the unary + or - operator shall have arithmetic type; of the ~ operator,
-    integer type; of the ! operator, scalar type.
-    Semantics
-2   The result of the unary + operator is the value of its (promoted) operand. The integer
-    promotions are performed on the operand, and the result has the promoted type.
-3   The result of the unary - operator is the negative of its (promoted) operand. The integer
-    promotions are performed on the operand, and the result has the promoted type.
-4   The result of the ~ operator is the bitwise complement of its (promoted) operand (that is,
-    each bit in the result is set if and only if the corresponding bit in the converted operand is
-    not set). The integer promotions are performed on the operand, and the result has the
-    promoted type. If the promoted type is an unsigned type, the expression ~E is equivalent
-    to the maximum value representable in that type minus E.
-5   The result of the logical negation operator ! is 0 if the value of its operand compares
-    unequal to 0, 1 if the value of its operand compares equal to 0. The result has type int.
-    The expression !E is equivalent to (0==E).
-
-
-
-
-    87) Thus, &amp;*E is equivalent to E (even if E is a null pointer), and &amp;(E1[E2]) to ((E1)+(E2)). It is
-        always true that if E is a function designator or an lvalue that is a valid operand of the unary &amp;
-        operator, *&amp;E is a function designator or an lvalue equal to E. If *P is an lvalue and T is the name of
-        an object pointer type, *(T)P is an lvalue that has a type compatible with that to which T points.
-         Among the invalid values for dereferencing a pointer by the unary * operator are a null pointer, an
-         address inappropriately aligned for the type of object pointed to, and the address of an object after the
-         end of its lifetime.
-
-[<a name="p79" href="#p79">page 79</a>] (<a href="#Contents">Contents</a>)
-
-<a name="6.5.3.4" href="#6.5.3.4"><b>    6.5.3.4 The sizeof operator</b></a>
-    Constraints
-1   The sizeof operator shall not be applied to an expression that has function type or an
-    incomplete type, to the parenthesized name of such a type, or to an expression that
-    designates a bit-field member.
-    Semantics
-2   The sizeof operator yields the size (in bytes) of its operand, which may be an
-    expression or the parenthesized name of a type. The size is determined from the type of
-    the operand. The result is an integer. If the type of the operand is a variable length array
-    type, the operand is evaluated; otherwise, the operand is not evaluated and the result is an
-    integer constant.
-3   When applied to an operand that has type char, unsigned char, or signed char,
-    (or a qualified version thereof) the result is 1. When applied to an operand that has array
-    type, the result is the total number of bytes in the array.88) When applied to an operand
-    that has structure or union type, the result is the total number of bytes in such an object,
-    including internal and trailing padding.
-4   The value of the result is implementation-defined, and its type (an unsigned integer type)
-    is size_t, defined in <a href="#7.17">&lt;stddef.h&gt;</a> (and other headers).
-5   EXAMPLE 1 A principal use of the sizeof operator is in communication with routines such as storage
-    allocators and I/O systems. A storage-allocation function might accept a size (in bytes) of an object to
-    allocate and return a pointer to void. For example:
-            extern void *alloc(size_t);
-            double *dp = alloc(sizeof *dp);
-    The implementation of the alloc function should ensure that its return value is aligned suitably for
-    conversion to a pointer to double.
-
-6   EXAMPLE 2      Another use of the sizeof operator is to compute the number of elements in an array:
-            sizeof array / sizeof array[0]
-
-7   EXAMPLE 3      In this example, the size of a variable length array is computed and returned from a
-    function:
-            #include <a href="#7.17">&lt;stddef.h&gt;</a>
-            size_t fsize3(int n)
-            {
-                  char b[n+3];                  // variable length array
-                  return sizeof b;              // execution time sizeof
-            }
-
-
-
-    88) When applied to a parameter declared to have array or function type, the sizeof operator yields the
-        size of the adjusted (pointer) type (see <a href="#6.9.1">6.9.1</a>).
-
-[<a name="p80" href="#p80">page 80</a>] (<a href="#Contents">Contents</a>)
-
-             int main()
-             {
-                   size_t size;
-                   size = fsize3(10); // fsize3 returns 13
-                   return 0;
-             }
-
-    Forward references: common definitions <a href="#7.17">&lt;stddef.h&gt;</a> (<a href="#7.17">7.17</a>), declarations (<a href="#6.7">6.7</a>),
-    structure and union specifiers (<a href="#6.7.2.1">6.7.2.1</a>), type names (<a href="#6.7.6">6.7.6</a>), array declarators (<a href="#6.7.5.2">6.7.5.2</a>).
-<a name="6.5.4" href="#6.5.4"><b>    6.5.4 Cast operators</b></a>
-    Syntax
-1            cast-expression:
-                    unary-expression
-                    ( type-name ) cast-expression
-    Constraints
-2   Unless the type name specifies a void type, the type name shall specify qualified or
-    unqualified scalar type and the operand shall have scalar type.
-3   Conversions that involve pointers, other than where permitted by the constraints of
-    <a href="#6.5.16.1">6.5.16.1</a>, shall be specified by means of an explicit cast.
-    Semantics
-4   Preceding an expression by a parenthesized type name converts the value of the
-    expression to the named type. This construction is called a cast.89) A cast that specifies
-    no conversion has no effect on the type or value of an expression.
-5   If the value of the expression is represented with greater precision or range than required
-    by the type named by the cast (<a href="#6.3.1.8">6.3.1.8</a>), then the cast specifies a conversion even if the
-    type of the expression is the same as the named type.
-    Forward references: equality operators (<a href="#6.5.9">6.5.9</a>), function declarators (including
-    prototypes) (<a href="#6.7.5.3">6.7.5.3</a>), simple assignment (<a href="#6.5.16.1">6.5.16.1</a>), type names (<a href="#6.7.6">6.7.6</a>).
-
-
-
-
-    89) A cast does not yield an lvalue. Thus, a cast to a qualified type has the same effect as a cast to the
-        unqualified version of the type.
-
-[<a name="p81" href="#p81">page 81</a>] (<a href="#Contents">Contents</a>)
-
-<a name="6.5.5" href="#6.5.5"><b>    6.5.5 Multiplicative operators</b></a>
-    Syntax
-1            multiplicative-expression:
-                     cast-expression
-                     multiplicative-expression * cast-expression
-                     multiplicative-expression / cast-expression
-                     multiplicative-expression % cast-expression
-    Constraints
-2   Each of the operands shall have arithmetic type. The operands of the % operator shall
-    have integer type.
-    Semantics
-3   The usual arithmetic conversions are performed on the operands.
-4   The result of the binary * operator is the product of the operands.
-5   The result of the / operator is the quotient from the division of the first operand by the
-    second; the result of the % operator is the remainder. In both operations, if the value of
-    the second operand is zero, the behavior is undefined.
-6   When integers are divided, the result of the / operator is the algebraic quotient with any
-    fractional part discarded.90) If the quotient a/b is representable, the expression
-    (a/b)*b + a%b shall equal a.
-<a name="6.5.6" href="#6.5.6"><b>    6.5.6 Additive operators</b></a>
-    Syntax
-1            additive-expression:
-                     multiplicative-expression
-                     additive-expression + multiplicative-expression
-                     additive-expression - multiplicative-expression
-    Constraints
-2   For addition, either both operands shall have arithmetic type, or one operand shall be a
-    pointer to an object type and the other shall have integer type. (Incrementing is
-    equivalent to adding 1.)
-3   For subtraction, one of the following shall hold:
-    -- both operands have arithmetic type;
-
-
-
-    90) This is often called ''truncation toward zero''.
-
-[<a name="p82" href="#p82">page 82</a>] (<a href="#Contents">Contents</a>)
-
-    -- both operands are pointers to qualified or unqualified versions of compatible object
-      types; or
-    -- the left operand is a pointer to an object type and the right operand has integer type.
-    (Decrementing is equivalent to subtracting 1.)
-    Semantics
-4   If both operands have arithmetic type, the usual arithmetic conversions are performed on
-    them.
-5   The result of the binary + operator is the sum of the operands.
-6   The result of the binary - operator is the difference resulting from the subtraction of the
-    second operand from the first.
-7   For the purposes of these operators, a pointer to an object that is not an element of an
-    array behaves the same as a pointer to the first element of an array of length one with the
-    type of the object as its element type.
-8   When an expression that has integer type is added to or subtracted from a pointer, the
-    result has the type of the pointer operand. If the pointer operand points to an element of
-    an array object, and the array is large enough, the result points to an element offset from
-    the original element such that the difference of the subscripts of the resulting and original
-    array elements equals the integer expression. In other words, if the expression P points to
-    the i-th element of an array object, the expressions (P)+N (equivalently, N+(P)) and
-    (P)-N (where N has the value n) point to, respectively, the i+n-th and i-n-th elements of
-    the array object, provided they exist. Moreover, if the expression P points to the last
-    element of an array object, the expression (P)+1 points one past the last element of the
-    array object, and if the expression Q points one past the last element of an array object,
-    the expression (Q)-1 points to the last element of the array object. If both the pointer
-    operand and the result point to elements of the same array object, or one past the last
-    element of the array object, the evaluation shall not produce an overflow; otherwise, the
-    behavior is undefined. If the result points one past the last element of the array object, it
-    shall not be used as the operand of a unary * operator that is evaluated.
-9   When two pointers are subtracted, both shall point to elements of the same array object,
-    or one past the last element of the array object; the result is the difference of the
-    subscripts of the two array elements. The size of the result is implementation-defined,
-    and its type (a signed integer type) is ptrdiff_t defined in the <a href="#7.17">&lt;stddef.h&gt;</a> header.
-    If the result is not representable in an object of that type, the behavior is undefined. In
-    other words, if the expressions P and Q point to, respectively, the i-th and j-th elements of
-    an array object, the expression (P)-(Q) has the value i-j provided the value fits in an
-    object of type ptrdiff_t. Moreover, if the expression P points either to an element of
-    an array object or one past the last element of an array object, and the expression Q points
-    to the last element of the same array object, the expression ((Q)+1)-(P) has the same
-[<a name="p83" href="#p83">page 83</a>] (<a href="#Contents">Contents</a>)
-
-     value as ((Q)-(P))+1 and as -((P)-((Q)+1)), and has the value zero if the
-     expression P points one past the last element of the array object, even though the
-     expression (Q)+1 does not point to an element of the array object.91)
-10   EXAMPLE        Pointer arithmetic is well defined with pointers to variable length array types.
-              {
-                       int n = 4, m = 3;
-                       int a[n][m];
-                       int (*p)[m] = a;            //   p == &amp;a[0]
-                       p += 1;                     //   p == &amp;a[1]
-                       (*p)[2] = 99;               //   a[1][2] == 99
-                       n = p - a;                  //   n == 1
-              }
-11   If array a in the above example were declared to be an array of known constant size, and pointer p were
-     declared to be a pointer to an array of the same known constant size (pointing to a), the results would be
-     the same.
-
-     Forward references: array declarators (<a href="#6.7.5.2">6.7.5.2</a>), common definitions <a href="#7.17">&lt;stddef.h&gt;</a>
-     (<a href="#7.17">7.17</a>).
-<a name="6.5.7" href="#6.5.7"><b>     6.5.7 Bitwise shift operators</b></a>
-     Syntax
-1             shift-expression:
-                      additive-expression
-                      shift-expression &lt;&lt; additive-expression
-                      shift-expression &gt;&gt; additive-expression
-     Constraints
-2    Each of the operands shall have integer type.
-     Semantics
-3    The integer promotions are performed on each of the operands. The type of the result is
-     that of the promoted left operand. If the value of the right operand is negative or is
-     greater than or equal to the width of the promoted left operand, the behavior is undefined.
-
-
-
-
-     91) Another way to approach pointer arithmetic is first to convert the pointer(s) to character pointer(s): In
-         this scheme the integer expression added to or subtracted from the converted pointer is first multiplied
-         by the size of the object originally pointed to, and the resulting pointer is converted back to the
-         original type. For pointer subtraction, the result of the difference between the character pointers is
-         similarly divided by the size of the object originally pointed to.
-          When viewed in this way, an implementation need only provide one extra byte (which may overlap
-          another object in the program) just after the end of the object in order to satisfy the ''one past the last
-          element'' requirements.
-
-[<a name="p84" href="#p84">page 84</a>] (<a href="#Contents">Contents</a>)
-
-4   The result of E1 &lt;&lt; E2 is E1 left-shifted E2 bit positions; vacated bits are filled with
-    zeros. If E1 has an unsigned type, the value of the result is E1 x 2E2 , reduced modulo
-    one more than the maximum value representable in the result type. If E1 has a signed
-    type and nonnegative value, and E1 x 2E2 is representable in the result type, then that is
-    the resulting value; otherwise, the behavior is undefined.
-5   The result of E1 &gt;&gt; E2 is E1 right-shifted E2 bit positions. If E1 has an unsigned type
-    or if E1 has a signed type and a nonnegative value, the value of the result is the integral
-    part of the quotient of E1 / 2E2 . If E1 has a signed type and a negative value, the
-    resulting value is implementation-defined.
-<a name="6.5.8" href="#6.5.8"><b>    6.5.8 Relational operators</b></a>
-    Syntax
-1            relational-expression:
-                     shift-expression
-                     relational-expression   &lt;    shift-expression
-                     relational-expression   &gt;    shift-expression
-                     relational-expression   &lt;=   shift-expression
-                     relational-expression   &gt;=   shift-expression
-    Constraints
-2   One of the following shall hold:
-    -- both operands have real type;
-    -- both operands are pointers to qualified or unqualified versions of compatible object
-      types; or
-    -- both operands are pointers to qualified or unqualified versions of compatible
-      incomplete types.
-    Semantics
-3   If both of the operands have arithmetic type, the usual arithmetic conversions are
-    performed.
-4   For the purposes of these operators, a pointer to an object that is not an element of an
-    array behaves the same as a pointer to the first element of an array of length one with the
-    type of the object as its element type.
-5   When two pointers are compared, the result depends on the relative locations in the
-    address space of the objects pointed to. If two pointers to object or incomplete types both
-    point to the same object, or both point one past the last element of the same array object,
-    they compare equal. If the objects pointed to are members of the same aggregate object,
-    pointers to structure members declared later compare greater than pointers to members
-    declared earlier in the structure, and pointers to array elements with larger subscript
-
-[<a name="p85" href="#p85">page 85</a>] (<a href="#Contents">Contents</a>)
-
-    values compare greater than pointers to elements of the same array with lower subscript
-    values. All pointers to members of the same union object compare equal. If the
-    expression P points to an element of an array object and the expression Q points to the
-    last element of the same array object, the pointer expression Q+1 compares greater than
-    P. In all other cases, the behavior is undefined.
-6   Each of the operators &lt; (less than), &gt; (greater than), &lt;= (less than or equal to), and &gt;=
-    (greater than or equal to) shall yield 1 if the specified relation is true and 0 if it is false.92)
-    The result has type int.
-<a name="6.5.9" href="#6.5.9"><b>    6.5.9 Equality operators</b></a>
-    Syntax
-1            equality-expression:
-                     relational-expression
-                    equality-expression == relational-expression
-                    equality-expression != relational-expression
-    Constraints
-2   One of the following shall hold:
-    -- both operands have arithmetic type;
-    -- both operands are pointers to qualified or unqualified versions of compatible types;
-    -- one operand is a pointer to an object or incomplete type and the other is a pointer to a
-      qualified or unqualified version of void; or
-    -- one operand is a pointer and the other is a null pointer constant.
-    Semantics
-3   The == (equal to) and != (not equal to) operators are analogous to the relational
-    operators except for their lower precedence.93) Each of the operators yields 1 if the
-    specified relation is true and 0 if it is false. The result has type int. For any pair of
-    operands, exactly one of the relations is true.
-4   If both of the operands have arithmetic type, the usual arithmetic conversions are
-    performed. Values of complex types are equal if and only if both their real parts are equal
-    and also their imaginary parts are equal. Any two values of arithmetic types from
-    different type domains are equal if and only if the results of their conversions to the
-    (complex) result type determined by the usual arithmetic conversions are equal.
-
-
-    92) The expression a&lt;b&lt;c is not interpreted as in ordinary mathematics. As the syntax indicates, it
-        means (a&lt;b)&lt;c; in other words, ''if a is less than b, compare 1 to c; otherwise, compare 0 to c''.
-    93) Because of the precedences, a&lt;b == c&lt;d is 1 whenever a&lt;b and c&lt;d have the same truth-value.
-
-[<a name="p86" href="#p86">page 86</a>] (<a href="#Contents">Contents</a>)
-
-5   Otherwise, at least one operand is a pointer. If one operand is a pointer and the other is a
-    null pointer constant, the null pointer constant is converted to the type of the pointer. If
-    one operand is a pointer to an object or incomplete type and the other is a pointer to a
-    qualified or unqualified version of void, the former is converted to the type of the latter.
-6   Two pointers compare equal if and only if both are null pointers, both are pointers to the
-    same object (including a pointer to an object and a subobject at its beginning) or function,
-    both are pointers to one past the last element of the same array object, or one is a pointer
-    to one past the end of one array object and the other is a pointer to the start of a different
-    array object that happens to immediately follow the first array object in the address
-    space.94)
-7   For the purposes of these operators, a pointer to an object that is not an element of an
-    array behaves the same as a pointer to the first element of an array of length one with the
-    type of the object as its element type.
-<a name="6.5.10" href="#6.5.10"><b>    6.5.10 Bitwise AND operator</b></a>
-    Syntax
-1            AND-expression:
-                   equality-expression
-                   AND-expression &amp; equality-expression
-    Constraints
-2   Each of the operands shall have integer type.
-    Semantics
-3   The usual arithmetic conversions are performed on the operands.
-4   The result of the binary &amp; operator is the bitwise AND of the operands (that is, each bit in
-    the result is set if and only if each of the corresponding bits in the converted operands is
-    set).
-
-
-
-
-    94) Two objects may be adjacent in memory because they are adjacent elements of a larger array or
-        adjacent members of a structure with no padding between them, or because the implementation chose
-        to place them so, even though they are unrelated. If prior invalid pointer operations (such as accesses
-        outside array bounds) produced undefined behavior, subsequent comparisons also produce undefined
-        behavior.
-
-[<a name="p87" href="#p87">page 87</a>] (<a href="#Contents">Contents</a>)
-
-<a name="6.5.11" href="#6.5.11"><b>    6.5.11 Bitwise exclusive OR operator</b></a>
-    Syntax
-1            exclusive-OR-expression:
-                     AND-expression
-                     exclusive-OR-expression ^ AND-expression
-    Constraints
-2   Each of the operands shall have integer type.
-    Semantics
-3   The usual arithmetic conversions are performed on the operands.
-4   The result of the ^ operator is the bitwise exclusive OR of the operands (that is, each bit
-    in the result is set if and only if exactly one of the corresponding bits in the converted
-    operands is set).
-<a name="6.5.12" href="#6.5.12"><b>    6.5.12 Bitwise inclusive OR operator</b></a>
-    Syntax
-1            inclusive-OR-expression:
-                     exclusive-OR-expression
-                     inclusive-OR-expression | exclusive-OR-expression
-    Constraints
-2   Each of the operands shall have integer type.
-    Semantics
-3   The usual arithmetic conversions are performed on the operands.
-4   The result of the | operator is the bitwise inclusive OR of the operands (that is, each bit in
-    the result is set if and only if at least one of the corresponding bits in the converted
-    operands is set).
-
-
-
-
-[<a name="p88" href="#p88">page 88</a>] (<a href="#Contents">Contents</a>)
-
-<a name="6.5.13" href="#6.5.13"><b>    6.5.13 Logical AND operator</b></a>
-    Syntax
-1             logical-AND-expression:
-                      inclusive-OR-expression
-                      logical-AND-expression &amp;&amp; inclusive-OR-expression
-    Constraints
-2   Each of the operands shall have scalar type.
-    Semantics
-3   The &amp;&amp; operator shall yield 1 if both of its operands compare unequal to 0; otherwise, it
-    yields 0. The result has type int.
-4   Unlike the bitwise binary &amp; operator, the &amp;&amp; operator guarantees left-to-right evaluation;
-    there is a sequence point after the evaluation of the first operand. If the first operand
-    compares equal to 0, the second operand is not evaluated.
-<a name="6.5.14" href="#6.5.14"><b>    6.5.14 Logical OR operator</b></a>
-    Syntax
-1             logical-OR-expression:
-                      logical-AND-expression
-                      logical-OR-expression || logical-AND-expression
-    Constraints
-2   Each of the operands shall have scalar type.
-    Semantics
-3   The || operator shall yield 1 if either of its operands compare unequal to 0; otherwise, it
-    yields 0. The result has type int.
-4   Unlike the bitwise | operator, the || operator guarantees left-to-right evaluation; there is
-    a sequence point after the evaluation of the first operand. If the first operand compares
-    unequal to 0, the second operand is not evaluated.
-
-
-
-
-[<a name="p89" href="#p89">page 89</a>] (<a href="#Contents">Contents</a>)
-
-<a name="6.5.15" href="#6.5.15"><b>    6.5.15 Conditional operator</b></a>
-    Syntax
-1            conditional-expression:
-                    logical-OR-expression
-                    logical-OR-expression ? expression : conditional-expression
-    Constraints
-2   The first operand shall have scalar type.
-3   One of the following shall hold for the second and third operands:
-    -- both operands have arithmetic type;
-    -- both operands have the same structure or union type;
-    -- both operands have void type;
-    -- both operands are pointers to qualified or unqualified versions of compatible types;
-    -- one operand is a pointer and the other is a null pointer constant; or
-    -- one operand is a pointer to an object or incomplete type and the other is a pointer to a
-      qualified or unqualified version of void.
-    Semantics
-4   The first operand is evaluated; there is a sequence point after its evaluation. The second
-    operand is evaluated only if the first compares unequal to 0; the third operand is evaluated
-    only if the first compares equal to 0; the result is the value of the second or third operand
-    (whichever is evaluated), converted to the type described below.95) If an attempt is made
-    to modify the result of a conditional operator or to access it after the next sequence point,
-    the behavior is undefined.
-5   If both the second and third operands have arithmetic type, the result type that would be
-    determined by the usual arithmetic conversions, were they applied to those two operands,
-    is the type of the result. If both the operands have structure or union type, the result has
-    that type. If both operands have void type, the result has void type.
-6   If both the second and third operands are pointers or one is a null pointer constant and the
-    other is a pointer, the result type is a pointer to a type qualified with all the type qualifiers
-    of the types pointed-to by both operands. Furthermore, if both operands are pointers to
-    compatible types or to differently qualified versions of compatible types, the result type is
-    a pointer to an appropriately qualified version of the composite type; if one operand is a
-    null pointer constant, the result has the type of the other operand; otherwise, one operand
-    is a pointer to void or a qualified version of void, in which case the result type is a
-
-    95) A conditional expression does not yield an lvalue.
-
-[<a name="p90" href="#p90">page 90</a>] (<a href="#Contents">Contents</a>)
-
-    pointer to an appropriately qualified version of void.
-7   EXAMPLE The common type that results when the second and third operands are pointers is determined
-    in two independent stages. The appropriate qualifiers, for example, do not depend on whether the two
-    pointers have compatible types.
-8   Given the declarations
-             const void *c_vp;
-             void *vp;
-             const int *c_ip;
-             volatile int *v_ip;
-             int *ip;
-             const char *c_cp;
-    the third column in the following table is the common type that is the result of a conditional expression in
-    which the first two columns are the second and third operands (in either order):
-             c_vp     c_ip      const void *
-             v_ip     0         volatile int *
-             c_ip     v_ip      const volatile int *
-             vp       c_cp      const void *
-             ip       c_ip      const int *
-             vp       ip        void *
-
-<a name="6.5.16" href="#6.5.16"><b>    6.5.16 Assignment operators</b></a>
-    Syntax
-1            assignment-expression:
-                    conditional-expression
-                    unary-expression assignment-operator assignment-expression
-             assignment-operator: one of
-                    = *= /= %= +=                       -=     &lt;&lt;=      &gt;&gt;=      &amp;=     ^=     |=
-    Constraints
-2   An assignment operator shall have a modifiable lvalue as its left operand.
-    Semantics
-3   An assignment operator stores a value in the object designated by the left operand. An
-    assignment expression has the value of the left operand after the assignment, but is not an
-    lvalue. The type of an assignment expression is the type of the left operand unless the
-    left operand has qualified type, in which case it is the unqualified version of the type of
-    the left operand. The side effect of updating the stored value of the left operand shall
-    occur between the previous and the next sequence point.
-4   The order of evaluation of the operands is unspecified. If an attempt is made to modify
-    the result of an assignment operator or to access it after the next sequence point, the
-    behavior is undefined.
-
-
-[<a name="p91" href="#p91">page 91</a>] (<a href="#Contents">Contents</a>)
-
-<a name="6.5.16.1" href="#6.5.16.1"><b>    6.5.16.1 Simple assignment</b></a>
-    Constraints
-1   One of the following shall hold:96)
-    -- the left operand has qualified or unqualified arithmetic type and the right has
-      arithmetic type;
-    -- the left operand has a qualified or unqualified version of a structure or union type
-      compatible with the type of the right;
-    -- both operands are pointers to qualified or unqualified versions of compatible types,
-      and the type pointed to by the left has all the qualifiers of the type pointed to by the
-      right;
-    -- one operand is a pointer to an object or incomplete type and the other is a pointer to a
-      qualified or unqualified version of void, and the type pointed to by the left has all
-      the qualifiers of the type pointed to by the right;
-    -- the left operand is a pointer and the right is a null pointer constant; or
-    -- the left operand has type _Bool and the right is a pointer.
-    Semantics
-2   In simple assignment (=), the value of the right operand is converted to the type of the
-    assignment expression and replaces the value stored in the object designated by the left
-    operand.
-3   If the value being stored in an object is read from another object that overlaps in any way
-    the storage of the first object, then the overlap shall be exact and the two objects shall
-    have qualified or unqualified versions of a compatible type; otherwise, the behavior is
-    undefined.
-4   EXAMPLE 1       In the program fragment
-            int f(void);
-            char c;
+</pre>
+
+<h2><a name="Contents" href="#Contents">Contents</a></h2>
+<ul>
+<li><a href="#Foreword">Foreword</a>
+<li><a href="#Introduction">Introduction</a>
+<li><a href="#1">1. Scope</a>
+<li><a href="#2">2. Normative references</a>
+<li><a href="#3">3. Terms, definitions, and symbols</a>
+<li><a href="#4">4. Conformance</a>
+<li><a href="#5">5. Environment</a>
+<ul>
+<li><a href="#5.1">   5.1 Conceptual models</a>
+<ul>
+<li><a href="#5.1.1">        5.1.1  Translation environment</a>
+<li><a href="#5.1.2">        5.1.2  Execution environments</a>
+</ul>
+<li><a href="#5.2">   5.2 Environmental considerations</a>
+<ul>
+<li><a href="#5.2.1">        5.2.1 Character sets</a>
+<li><a href="#5.2.2">        5.2.2  Character display semantics</a>
+<li><a href="#5.2.3">        5.2.3 Signals and interrupts</a>
+<li><a href="#5.2.4">        5.2.4  Environmental limits</a>
+</ul>
+</ul>
+<li><a href="#6">6. Language</a>
+<ul>
+<li><a href="#6.1">   6.1 Notation</a>
+<li><a href="#6.2">   6.2 Concepts</a>
+<ul>
+<li><a href="#6.2.1">        6.2.1 Scopes of identifiers</a>
+<li><a href="#6.2.2">        6.2.2   Linkages of identifiers</a>
+<li><a href="#6.2.3">        6.2.3 Name spaces of identifiers</a>
+<li><a href="#6.2.4">        6.2.4 Storage durations of objects</a>
+<li><a href="#6.2.5">        6.2.5 Types</a>
+<li><a href="#6.2.6">        6.2.6 Representations of types</a>
+<li><a href="#6.2.7">        6.2.7 Compatible type and composite type</a>
+</ul>
+<li><a href="#6.3">   6.3 Conversions</a>
+<ul>
+<li><a href="#6.3.1">        6.3.1 Arithmetic operands</a>
+<li><a href="#6.3.2">        6.3.2 Other operands</a>
+</ul>
+<li><a href="#6.4">   6.4 Lexical elements</a>
+<ul>
+<li><a href="#6.4.1">        6.4.1 Keywords</a>
+<li><a href="#6.4.2">        6.4.2 Identifiers</a>
+<li><a href="#6.4.3">        6.4.3 Universal character names</a>
+<li><a href="#6.4.4">        6.4.4   Constants</a>
+<li><a href="#6.4.5">        6.4.5 String literals</a>
+<li><a href="#6.4.6">        6.4.6   Punctuators</a>
+<li><a href="#6.4.7">        6.4.7 Header names</a>
+<li><a href="#6.4.8">        6.4.8 Preprocessing numbers</a>
+<li><a href="#6.4.9">        6.4.9 Comments</a>
+</ul>
+<li><a href="#6.5">   6.5 Expressions</a>
+<!--page 2 -->
+<ul>
+<li><a href="#6.5.1">          6.5.1   Primary expressions</a>
+<li><a href="#6.5.2">          6.5.2 Postfix operators</a>
+<li><a href="#6.5.3">          6.5.3   Unary operators</a>
+<li><a href="#6.5.4">          6.5.4 Cast operators</a>
+<li><a href="#6.5.5">          6.5.5   Multiplicative operators</a>
+<li><a href="#6.5.6">          6.5.6 Additive operators</a>
+<li><a href="#6.5.7">          6.5.7 Bitwise shift operators</a>
+<li><a href="#6.5.8">          6.5.8   Relational operators</a>
+<li><a href="#6.5.9">          6.5.9 Equality operators</a>
+<li><a href="#6.5.10">          6.5.10 Bitwise AND operator</a>
+<li><a href="#6.5.11">          6.5.11 Bitwise exclusive OR operator</a>
+<li><a href="#6.5.12">          6.5.12 Bitwise inclusive OR operator</a>
+<li><a href="#6.5.13">          6.5.13 Logical AND operator</a>
+<li><a href="#6.5.14">          6.5.14 Logical OR operator</a>
+<li><a href="#6.5.15">          6.5.15 Conditional operator</a>
+<li><a href="#6.5.16">          6.5.16 Assignment operators</a>
+<li><a href="#6.5.17">          6.5.17 Comma operator</a>
+</ul>
+<li><a href="#6.6">     6.6 Constant expressions</a>
+<li><a href="#6.7">     6.7 Declarations</a>
+<ul>
+<li><a href="#6.7.1">          6.7.1 Storage-class specifiers</a>
+<li><a href="#6.7.2">          6.7.2   Type specifiers</a>
+<li><a href="#6.7.3">          6.7.3 Type qualifiers</a>
+<li><a href="#6.7.4">          6.7.4   Function specifiers</a>
+<li><a href="#6.7.5">          6.7.5 Declarators</a>
+<li><a href="#6.7.6">          6.7.6 Type names</a>
+<li><a href="#6.7.7">          6.7.7   Type definitions</a>
+<li><a href="#6.7.8">          6.7.8 Initialization</a>
+</ul>
+<li><a href="#6.8">     6.8 Statements and blocks</a>
+<ul>
+<li><a href="#6.8.1">          6.8.1   Labeled statements</a>
+<li><a href="#6.8.2">          6.8.2 Compound statement</a>
+<li><a href="#6.8.3">          6.8.3 Expression and null statements</a>
+<li><a href="#6.8.4">          6.8.4 Selection statements</a>
+<li><a href="#6.8.5">          6.8.5 Iteration statements</a>
+<li><a href="#6.8.6">          6.8.6 Jump statements</a>
+</ul>
+<li><a href="#6.9">     6.9 External definitions</a>
+<ul>
+<li><a href="#6.9.1">          6.9.1   Function definitions</a>
+<li><a href="#6.9.2">          6.9.2 External object definitions</a>
+</ul>
+<li><a href="#6.10">     6.10 Preprocessing directives</a>
+<ul>
+<li><a href="#6.10.1">          6.10.1 Conditional inclusion</a>
+<li><a href="#6.10.2">          6.10.2 Source file inclusion</a>
+<li><a href="#6.10.3">          6.10.3 Macro replacement</a>
+<li><a href="#6.10.4">          6.10.4 Line control</a>
+<li><a href="#6.10.5">          6.10.5 Error directive</a>
+<li><a href="#6.10.6">          6.10.6 Pragma directive</a>
+<!--page 3 -->
+<li><a href="#6.10.7">       6.10.7 Null directive</a>
+<li><a href="#6.10.8">       6.10.8 Predefined macro names</a>
+<li><a href="#6.10.9">       6.10.9 Pragma operator</a>
+</ul>
+<li><a href="#6.11">  6.11 Future language directions</a>
+<ul>
+<li><a href="#6.11.1">       6.11.1 Floating types</a>
+<li><a href="#6.11.2">       6.11.2 Linkages of identifiers</a>
+<li><a href="#6.11.3">       6.11.3 External names</a>
+<li><a href="#6.11.4">       6.11.4 Character escape sequences</a>
+<li><a href="#6.11.5">       6.11.5 Storage-class specifiers</a>
+<li><a href="#6.11.6">       6.11.6 Function declarators</a>
+<li><a href="#6.11.7">       6.11.7 Function definitions</a>
+<li><a href="#6.11.8">       6.11.8 Pragma directives</a>
+<li><a href="#6.11.9">       6.11.9 Predefined macro names</a>
+</ul>
+</ul>
+<li><a href="#7">7. Library</a>
+<ul>
+<li><a href="#7.1">   7.1 Introduction</a>
+<ul>
+<li><a href="#7.1.1">         7.1.1 Definitions of terms</a>
+<li><a href="#7.1.2">         7.1.2 Standard headers</a>
+<li><a href="#7.1.3">         7.1.3 Reserved identifiers</a>
+<li><a href="#7.1.4">         7.1.4 Use of library functions</a>
+</ul>
+<li><a href="#7.2">   7.2 Diagnostics &lt;assert.h&gt;</a>
+<ul>
+<li><a href="#7.2.1">         7.2.1 Program diagnostics</a>
+</ul>
+<li><a href="#7.3">   7.3 Complex arithmetic &lt;complex.h&gt;</a>
+<ul>
+<li><a href="#7.3.1">         7.3.1 Introduction</a>
+<li><a href="#7.3.2">         7.3.2 Conventions</a>
+<li><a href="#7.3.3">         7.3.3 Branch cuts</a>
+<li><a href="#7.3.4">         7.3.4 The CX_LIMITED_RANGE pragma</a>
+<li><a href="#7.3.5">         7.3.5 Trigonometric functions</a>
+<li><a href="#7.3.6">         7.3.6 Hyperbolic functions</a>
+<li><a href="#7.3.7">         7.3.7 Exponential and logarithmic functions</a>
+<li><a href="#7.3.8">         7.3.8 Power and absolute-value functions</a>
+<li><a href="#7.3.9">         7.3.9 Manipulation functions</a>
+</ul>
+<li><a href="#7.4">   7.4 Character handling &lt;ctype.h&gt;</a>
+<ul>
+<li><a href="#7.4.1">         7.4.1 Character classification functions</a>
+<li><a href="#7.4.2">         7.4.2 Character case mapping functions</a>
+</ul>
+<li><a href="#7.5">   7.5 Errors &lt;errno.h&gt;</a>
+<li><a href="#7.6">   7.6 Floating-point environment &lt;fenv.h&gt;</a>
+<ul>
+<li><a href="#7.6.1">         7.6.1 The FENV_ACCESS pragma</a>
+<li><a href="#7.6.2">         7.6.2 Floating-point exceptions</a>
+<li><a href="#7.6.3">         7.6.3 Rounding</a>
+<li><a href="#7.6.4">         7.6.4 Environment</a>
+</ul>
+<li><a href="#7.7">   7.7 Characteristics of floating types &lt;float.h&gt;</a>
+<li><a href="#7.8">   7.8 Format conversion of integer types &lt;inttypes.h&gt;</a>
+<ul>
+<li><a href="#7.8.1">         7.8.1 Macros for format specifiers</a>
+<li><a href="#7.8.2">         7.8.2 Functions for greatest-width integer types</a>
+<!--page 4 -->
+</ul>
+<li><a href="#7.9">     7.9 Alternative spellings &lt;iso646.h&gt;</a>
+<li><a href="#7.10">     7.10 Sizes of integer types &lt;limits.h&gt;</a>
+<li><a href="#7.11">     7.11 Localization &lt;locale.h&gt;</a>
+<ul>
+<li><a href="#7.11.1">          7.11.1 Locale control</a>
+<li><a href="#7.11.2">          7.11.2 Numeric formatting convention inquiry</a>
+</ul>
+<li><a href="#7.12">     7.12 Mathematics &lt;math.h&gt;</a>
+<ul>
+<li><a href="#7.12.1">          7.12.1 Treatment of error conditions</a>
+<li><a href="#7.12.2">          7.12.2 The FP_CONTRACT pragma</a>
+<li><a href="#7.12.3">          7.12.3 Classification macros</a>
+<li><a href="#7.12.4">          7.12.4 Trigonometric functions</a>
+<li><a href="#7.12.5">          7.12.5 Hyperbolic functions</a>
+<li><a href="#7.12.6">          7.12.6 Exponential and logarithmic functions</a>
+<li><a href="#7.12.7">          7.12.7 Power and absolute-value functions</a>
+<li><a href="#7.12.8">          7.12.8 Error and gamma functions</a>
+<li><a href="#7.12.9">          7.12.9 Nearest integer functions</a>
+<li><a href="#7.12.10">          7.12.10 Remainder functions</a>
+<li><a href="#7.12.11">          7.12.11 Manipulation functions</a>
+<li><a href="#7.12.12">          7.12.12 Maximum, minimum, and positive difference functions</a>
+<li><a href="#7.12.13">          7.12.13 Floating multiply-add</a>
+<li><a href="#7.12.14">          7.12.14 Comparison macros</a>
+</ul>
+<li><a href="#7.13">     7.13 Nonlocal jumps &lt;setjmp.h&gt;</a>
+<ul>
+<li><a href="#7.13.1">          7.13.1 Save calling environment</a>
+<li><a href="#7.13.2">          7.13.2 Restore calling environment</a>
+</ul>
+<li><a href="#7.14">     7.14 Signal handling &lt;signal.h&gt;</a>
+<ul>
+<li><a href="#7.14.1">          7.14.1 Specify signal handling</a>
+<li><a href="#7.14.2">          7.14.2 Send signal</a>
+</ul>
+<li><a href="#7.15">     7.15 Variable arguments &lt;stdarg.h&gt;</a>
+<ul>
+<li><a href="#7.15.1">          7.15.1 Variable argument list access macros</a>
+</ul>
+<li><a href="#7.16">     7.16 Boolean type and values &lt;stdbool.h&gt;</a>
+<li><a href="#7.17">     7.17 Common definitions &lt;stddef.h&gt;</a>
+<li><a href="#7.18">     7.18 Integer types &lt;stdint.h&gt;</a>
+<ul>
+<li><a href="#7.18.1">          7.18.1 Integer types</a>
+<li><a href="#7.18.2">          7.18.2 Limits of specified-width integer types</a>
+<li><a href="#7.18.3">          7.18.3 Limits of other integer types</a>
+<li><a href="#7.18.4">          7.18.4 Macros for integer constants</a>
+</ul>
+<li><a href="#7.19">     7.19 Input/output &lt;stdio.h&gt;</a>
+<ul>
+<li><a href="#7.19.1">          7.19.1 Introduction</a>
+<li><a href="#7.19.2">          7.19.2 Streams</a>
+<li><a href="#7.19.3">          7.19.3 Files</a>
+<li><a href="#7.19.4">          7.19.4 Operations on files</a>
+<li><a href="#7.19.5">          7.19.5 File access functions</a>
+<li><a href="#7.19.6">          7.19.6 Formatted input/output functions</a>
+<li><a href="#7.19.7">          7.19.7 Character input/output functions</a>
+<li><a href="#7.19.8">          7.19.8 Direct input/output functions</a>
+<!--page 5 -->
+<li><a href="#7.19.9">         7.19.9 File positioning functions</a>
+<li><a href="#7.19.10">         7.19.10 Error-handling functions</a>
+</ul>
+<li><a href="#7.20">  7.20   General utilities &lt;stdlib.h&gt;</a>
+<ul>
+<li><a href="#7.20.1">         7.20.1 Numeric conversion functions</a>
+<li><a href="#7.20.2">         7.20.2 Pseudo-random sequence generation functions</a>
+<li><a href="#7.20.3">         7.20.3 Memory management functions</a>
+<li><a href="#7.20.4">         7.20.4 Communication with the environment</a>
+<li><a href="#7.20.5">         7.20.5 Searching and sorting utilities</a>
+<li><a href="#7.20.6">         7.20.6 Integer arithmetic functions</a>
+<li><a href="#7.20.7">         7.20.7 Multibyte/wide character conversion functions</a>
+<li><a href="#7.20.8">         7.20.8 Multibyte/wide string conversion functions</a>
+</ul>
+<li><a href="#7.21">  7.21   String handling &lt;string.h&gt;</a>
+<ul>
+<li><a href="#7.21.1">         7.21.1 String function conventions</a>
+<li><a href="#7.21.2">         7.21.2 Copying functions</a>
+<li><a href="#7.21.3">         7.21.3 Concatenation functions</a>
+<li><a href="#7.21.4">         7.21.4 Comparison functions</a>
+<li><a href="#7.21.5">         7.21.5 Search functions</a>
+<li><a href="#7.21.6">         7.21.6 Miscellaneous functions</a>
+</ul>
+<li><a href="#7.22">  7.22   Type-generic math &lt;tgmath.h&gt;</a>
+<li><a href="#7.23">  7.23   Date and time &lt;time.h&gt;</a>
+<ul>
+<li><a href="#7.23.1">         7.23.1 Components of time</a>
+<li><a href="#7.23.2">         7.23.2 Time manipulation functions</a>
+<li><a href="#7.23.3">         7.23.3 Time conversion functions</a>
+</ul>
+<li><a href="#7.24">  7.24   Extended multibyte and wide character utilities &lt;wchar.h&gt;</a>
+<ul>
+<li><a href="#7.24.1">         7.24.1 Introduction</a>
+<li><a href="#7.24.2">         7.24.2 Formatted wide character input/output functions</a>
+<li><a href="#7.24.3">         7.24.3 Wide character input/output functions</a>
+<li><a href="#7.24.4">         7.24.4 General wide string utilities</a>
+<li><a href="#7.24.5">         7.24.5 Wide character time conversion functions</a>
+<li><a href="#7.24.6">         7.24.6 Extended multibyte/wide character conversion utilities</a>
+</ul>
+<li><a href="#7.25">  7.25   Wide character classification and mapping utilities &lt;wctype.h&gt;</a>
+<ul>
+<li><a href="#7.25.1">         7.25.1 Introduction</a>
+<li><a href="#7.25.2">         7.25.2 Wide character classification utilities</a>
+<li><a href="#7.25.3">         7.25.3 Wide character case mapping utilities</a>
+</ul>
+<li><a href="#7.26">  7.26   Future library directions</a>
+<ul>
+<li><a href="#7.26.1">         7.26.1 Complex arithmetic &lt;complex.h&gt;</a>
+<li><a href="#7.26.2">         7.26.2 Character handling &lt;ctype.h&gt;</a>
+<li><a href="#7.26.3">         7.26.3 Errors &lt;errno.h&gt;</a>
+<li><a href="#7.26.4">         7.26.4 Format conversion of integer types &lt;inttypes.h&gt;</a>
+<li><a href="#7.26.5">         7.26.5 Localization &lt;locale.h&gt;</a>
+<li><a href="#7.26.6">         7.26.6 Signal handling &lt;signal.h&gt;</a>
+<li><a href="#7.26.7">         7.26.7 Boolean type and values &lt;stdbool.h&gt;</a>
+<li><a href="#7.26.8">         7.26.8 Integer types &lt;stdint.h&gt;</a>
+<li><a href="#7.26.9">         7.26.9 Input/output &lt;stdio.h&gt;</a>
+<!--page 6 -->
+<li><a href="#7.26.10">        7.26.10 General utilities &lt;stdlib.h&gt;</a>
+<li><a href="#7.26.11">        7.26.11 String handling &lt;string.h&gt;</a>
+<li><a href="#7.26.12">        7.26.12 Extended multibyte and wide character utilities &lt;wchar.h&gt;</a>
+<li><a href="#7.26.13">        7.26.13 Wide character classification and mapping utilities &lt;wctype.h&gt;</a>
+</ul>
+</ul>
+<li><a href="#A">Annex A (informative) Language syntax summary</a>
+<ul>
+<li><a href="#A.1">  A.1 Lexical grammar</a>
+<li><a href="#A.2">  A.2 Phrase structure grammar</a>
+<li><a href="#A.3">  A.3 Preprocessing directives</a>
+</ul>
+<li><a href="#B">Annex B (informative) Library summary</a>
+<ul>
+<li><a href="#B.1">  B.1 Diagnostics &lt;assert.h&gt;</a>
+<li><a href="#B.2">  B.2 Complex &lt;complex.h&gt;</a>
+<li><a href="#B.3">  B.3 Character handling &lt;ctype.h&gt;</a>
+<li><a href="#B.4">  B.4 Errors &lt;errno.h&gt;</a>
+<li><a href="#B.5">  B.5 Floating-point environment &lt;fenv.h&gt;</a>
+<li><a href="#B.6">  B.6 Characteristics of floating types &lt;float.h&gt;</a>
+<li><a href="#B.7">  B.7 Format conversion of integer types &lt;inttypes.h&gt;</a>
+<li><a href="#B.8">  B.8 Alternative spellings &lt;iso646.h&gt;</a>
+<li><a href="#B.9">  B.9 Sizes of integer types &lt;limits.h&gt;</a>
+<li><a href="#B.10">  B.10 Localization &lt;locale.h&gt;</a>
+<li><a href="#B.11">  B.11 Mathematics &lt;math.h&gt;</a>
+<li><a href="#B.12">  B.12 Nonlocal jumps &lt;setjmp.h&gt;</a>
+<li><a href="#B.13">  B.13 Signal handling &lt;signal.h&gt;</a>
+<li><a href="#B.14">  B.14 Variable arguments &lt;stdarg.h&gt;</a>
+<li><a href="#B.15">  B.15 Boolean type and values &lt;stdbool.h&gt;</a>
+<li><a href="#B.16">  B.16 Common definitions &lt;stddef.h&gt;</a>
+<li><a href="#B.17">  B.17 Integer types &lt;stdint.h&gt;</a>
+<li><a href="#B.18">  B.18 Input/output &lt;stdio.h&gt;</a>
+<li><a href="#B.19">  B.19 General utilities &lt;stdlib.h&gt;</a>
+<li><a href="#B.20">  B.20 String handling &lt;string.h&gt;</a>
+<li><a href="#B.21">  B.21 Type-generic math &lt;tgmath.h&gt;</a>
+<li><a href="#B.22">  B.22 Date and time &lt;time.h&gt;</a>
+<li><a href="#B.23">  B.23 Extended multibyte/wide character utilities &lt;wchar.h&gt;</a>
+<li><a href="#B.24">  B.24 Wide character classification and mapping utilities &lt;wctype.h&gt;</a>
+</ul>
+<li><a href="#C">Annex C (informative) Sequence points</a>
+<li><a href="#D">Annex D (normative) Universal character names for identifiers</a>
+<li><a href="#E">Annex E (informative) Implementation limits</a>
+<li><a href="#F">Annex F (normative) IEC 60559 floating-point arithmetic</a>
+<ul>
+<li><a href="#F.1">  F.1 Introduction</a>
+<li><a href="#F.2">  F.2 Types</a>
+<li><a href="#F.3">  F.3 Operators and functions</a>
+<!--page 7 -->
+<li><a href="#F.4">   F.4   Floating to integer conversion</a>
+<li><a href="#F.5">   F.5   Binary-decimal conversion</a>
+<li><a href="#F.6">   F.6   Contracted expressions</a>
+<li><a href="#F.7">   F.7   Floating-point environment</a>
+<li><a href="#F.8">   F.8   Optimization</a>
+<li><a href="#F.9">   F.9   Mathematics &lt;math.h&gt;</a>
+</ul>
+<li><a href="#G">Annex G (informative) IEC 60559-compatible complex arithmetic</a>
+<ul>
+<li><a href="#G.1">  G.1 Introduction</a>
+<li><a href="#G.2">  G.2 Types</a>
+<li><a href="#G.3">  G.3 Conventions</a>
+<li><a href="#G.4">  G.4 Conversions</a>
+<li><a href="#G.5">  G.5 Binary operators</a>
+<li><a href="#G.6">  G.6 Complex arithmetic &lt;complex.h&gt;</a>
+<li><a href="#G.7">  G.7 Type-generic math &lt;tgmath.h&gt;</a>
+</ul>
+<li><a href="#H">Annex H (informative) Language independent arithmetic</a>
+<ul>
+<li><a href="#H.1">  H.1 Introduction</a>
+<li><a href="#H.2">  H.2 Types</a>
+<li><a href="#H.3">  H.3 Notification</a>
+</ul>
+<li><a href="#I">Annex I (informative) Common warnings</a>
+<li><a href="#J">Annex J (informative) Portability issues</a>
+<ul>
+<li><a href="#J.1">  J.1 Unspecified behavior</a>
+<li><a href="#J.2">  J.2 Undefined behavior</a>
+<li><a href="#J.3">  J.3 Implementation-defined behavior</a>
+<li><a href="#J.4">  J.4 Locale-specific behavior</a>
+<li><a href="#J.5">  J.5 Common extensions</a>
+</ul>
+<li><a href="#Bibliography">Bibliography</a>
+<li><a href="#Index">Index</a>
+<!--page 8 -->
+<!--page 9 -->
+</ul>
+
+<h2><a name="Foreword" href="#Foreword">Foreword</a></h2>
+<p><!--para 1 -->
+ ISO (the International Organization for Standardization) and IEC (the International
+ Electrotechnical Commission) form the specialized system for worldwide
+ standardization. National bodies that are member of ISO or IEC participate in the
+ development of International Standards through technical committees established by the
+ respective organization to deal with particular fields of technical activity. ISO and IEC
+ technical committees collaborate in fields of mutual interest. Other international
+ organizations, governmental and non-governmental, in liaison with ISO and IEC, also
+ take part in the work.
+<p><!--para 2 -->
+ International Standards are drafted in accordance with the rules given in the ISO/IEC
+ Directives, Part 3.
+<p><!--para 3 -->
+ In the field of information technology, ISO and IEC have established a joint technical
+ committee, ISO/IEC JTC 1. Draft International Standards adopted by the joint technical
+ committee are circulated to national bodies for voting. Publication as an International
+ Standard requires approval by at least 75% of the national bodies casting a vote.
+<p><!--para 4 -->
+ International Standard ISO/IEC 9899 was prepared by Joint Technical Committee
+ ISO/IEC JTC 1, Information technology, Subcommittee SC 22, Programming languages,
+ their environments and system software interfaces. The Working Group responsible for
+ this standard (WG 14) maintains a site on the World Wide Web at
+ http://www.open-std.org/JTC1/SC22/WG14/                        containing      additional
+ information relevant to this standard such as a Rationale for many of the decisions made
+ during its preparation and a log of Defect Reports and Responses.
+<p><!--para 5 -->
+ This second edition cancels and replaces the first edition, ISO/IEC 9899:1990, as
+ amended and corrected by ISO/IEC 9899/COR1:1994, ISO/IEC 9899/AMD1:1995, and
+ ISO/IEC 9899/COR2:1996. Major changes from the previous edition include:
+<ul>
+<li>  restricted character set support via digraphs and <a href="#7.9">&lt;iso646.h&gt;</a> (originally specified
+ in AMD1)
+<li>  wide character library support in <a href="#7.24">&lt;wchar.h&gt;</a> and <a href="#7.25">&lt;wctype.h&gt;</a> (originally
+ specified in AMD1)
+<li>  more precise aliasing rules via effective type
+<li>  restricted pointers
+<li>  variable length arrays
+<li>  flexible array members
+<li>  static and type qualifiers in parameter array declarators
+<li>  complex (and imaginary) support in <a href="#7.3">&lt;complex.h&gt;</a>
+<li>  type-generic math macros in <a href="#7.22">&lt;tgmath.h&gt;</a>
+<li>  the long long int type and library functions
+<!--page 10 -->
+<li>  increased minimum translation limits
+<li>  additional floating-point characteristics in <a href="#7.7">&lt;float.h&gt;</a>
+<li>  remove implicit int
+<li>  reliable integer division
+<li>  universal character names (\u and \U)
+<li>  extended identifiers
+<li>  hexadecimal floating-point constants and %a and %A printf/scanf conversion
+ specifiers
+<li>  compound literals
+<li>  designated initializers
+<li>  // comments
+<li>  extended integer types and library functions in <a href="#7.8">&lt;inttypes.h&gt;</a> and <a href="#7.18">&lt;stdint.h&gt;</a>
+<li>  remove implicit function declaration
+<li>  preprocessor arithmetic done in intmax_t/uintmax_t
+<li>  mixed declarations and code
+<li>  new block scopes for selection and iteration statements
+<li>  integer constant type rules
+<li>  integer promotion rules
+<li>  macros with a variable number of arguments
+<li>  the vscanf family of functions in <a href="#7.19">&lt;stdio.h&gt;</a> and <a href="#7.24">&lt;wchar.h&gt;</a>
+<li>  additional math library functions in <a href="#7.12">&lt;math.h&gt;</a>
+<li>  treatment of error conditions by math library functions (math_errhandling)
+<li>  floating-point environment access in <a href="#7.6">&lt;fenv.h&gt;</a>
+<li>  IEC 60559 (also known as IEC 559 or IEEE arithmetic) support
+<li>  trailing comma allowed in enum declaration
+<li>  %lf conversion specifier allowed in printf
+<li>  inline functions
+<li>  the snprintf family of functions in <a href="#7.19">&lt;stdio.h&gt;</a>
+<li>  boolean type in <a href="#7.16">&lt;stdbool.h&gt;</a>
+<li>  idempotent type qualifiers
+<li>  empty macro arguments
+<!--page 11 -->
+<li>  new structure type compatibility rules (tag compatibility)
+<li>  additional predefined macro names
+<li>  _Pragma preprocessing operator
+<li>  standard pragmas
+<li>  __func__ predefined identifier
+<li>  va_copy macro
+<li>  additional strftime conversion specifiers
+<li>  LIA compatibility annex
+<li>  deprecate ungetc at the beginning of a binary file
+<li>  remove deprecation of aliased array parameters
+<li>  conversion of array to pointer not limited to lvalues
+<li>  relaxed constraints on aggregate and union initialization
+<li>  relaxed restrictions on portable header names
+<li>  return without expression not permitted in function that returns a value (and vice
+ versa)
+</ul>
+<p><!--para 6 -->
+ Annexes D and F form a normative part of this standard; annexes A, B, C, E, G, H, I, J,
+ the bibliography, and the index are for information only. In accordance with Part 3 of the
+ ISO/IEC Directives, this foreword, the introduction, notes, footnotes, and examples are
+ also for information only.
+<!--page 12 -->
+
+<h2><a name="Introduction" href="#Introduction">Introduction</a></h2>
+<p><!--para 1 -->
+ With the introduction of new devices and extended character sets, new features may be
+ added to this International Standard. Subclauses in the language and library clauses warn
+ implementors and programmers of usages which, though valid in themselves, may
+ conflict with future additions.
+<p><!--para 2 -->
+ Certain features are obsolescent, which means that they may be considered for
+ withdrawal in future revisions of this International Standard. They are retained because
+ of their widespread use, but their use in new implementations (for implementation
+ features) or new programs (for language [<a href="#6.11">6.11</a>] or library features [<a href="#7.26">7.26</a>]) is discouraged.
+<p><!--para 3 -->
+ This International Standard is divided into four major subdivisions:
+<ul>
+<li>  preliminary elements (clauses 1-4);
+<li>  the characteristics of environments that translate and execute C programs (clause 5);
+<li>  the language syntax, constraints, and semantics (clause 6);
+<li>  the library facilities (clause 7).
+</ul>
+<p><!--para 4 -->
+ Examples are provided to illustrate possible forms of the constructions described.
+ Footnotes are provided to emphasize consequences of the rules described in that
+ subclause or elsewhere in this International Standard. References are used to refer to
+ other related subclauses. Recommendations are provided to give advice or guidance to
+ implementors. Annexes provide additional information and summarize the information
+ contained in this International Standard. A bibliography lists documents that were
+ referred to during the preparation of the standard.
+<p><!--para 5 -->
+ The language clause (clause 6) is derived from ''The C Reference Manual''.
+<p><!--para 6 -->
+ The library clause (clause 7) is based on the 1984 /usr/group Standard.
+<!--page 13 -->
+
+<h1>Programming languages -- C</h1>
+
+<h2><a name="1" href="#1">1. Scope</a></h2>
+<p><!--para 1 -->
+ This International Standard specifies the form and establishes the interpretation of
+ programs written in the C programming language.<sup><a href="#note1"><b>1)</b></a></sup> It specifies
+<ul>
+<li>  the representation of C programs;
+<li>  the syntax and constraints of the C language;
+<li>  the semantic rules for interpreting C programs;
+<li>  the representation of input data to be processed by C programs;
+<li>  the representation of output data produced by C programs;
+<li>  the restrictions and limits imposed by a conforming implementation of C.
+</ul>
+<p><!--para 2 -->
+ This International Standard does not specify
+<ul>
+<li>  the mechanism by which C programs are transformed for use by a data-processing
+ system;
+<li>  the mechanism by which C programs are invoked for use by a data-processing
+ system;
+<li>  the mechanism by which input data are transformed for use by a C program;
+<li>  the mechanism by which output data are transformed after being produced by a C
+ program;
+<li>  the size or complexity of a program and its data that will exceed the capacity of any
+ specific data-processing system or the capacity of a particular processor;
+<!--page 14 -->
+<li>  all minimal requirements of a data-processing system that is capable of supporting a
+ conforming implementation.
+</ul>
+
+<p><b>Footnotes</b>
+<p><small><a name="note1" href="#note1">1)</a> This International Standard is designed to promote the portability of C programs among a variety of
+ data-processing systems. It is intended for use by implementors and programmers.
+</small>
+
+<h2><a name="2" href="#2">2. Normative references</a></h2>
+<p><!--para 1 -->
+ The following normative documents contain provisions which, through reference in this
+ text, constitute provisions of this International Standard. For dated references,
+ subsequent amendments to, or revisions of, any of these publications do not apply.
+ However, parties to agreements based on this International Standard are encouraged to
+ investigate the possibility of applying the most recent editions of the normative
+ documents indicated below. For undated references, the latest edition of the normative
+ document referred to applies. Members of ISO and IEC maintain registers of currently
+ valid International Standards.
+<p><!--para 2 -->
+ ISO 31-11:1992, Quantities and units -- Part 11: Mathematical signs and symbols for
+ use in the physical sciences and technology.
+<p><!--para 3 -->
+ ISO/IEC 646, Information technology -- ISO 7-bit coded character set for information
+ interchange.
+<p><!--para 4 -->
+ ISO/IEC 2382-1:1993, Information technology -- Vocabulary -- Part 1: Fundamental
+ terms.
+<p><!--para 5 -->
+ ISO 4217, Codes for the representation of currencies and funds.
+<p><!--para 6 -->
+ ISO 8601, Data elements and interchange formats -- Information interchange --
+ Representation of dates and times.
+<p><!--para 7 -->
+ ISO/IEC 10646 (all parts), Information technology -- Universal Multiple-Octet Coded
+ Character Set (UCS).
+<p><!--para 8 -->
+ IEC 60559:1989, Binary floating-point arithmetic for microprocessor systems (previously
+ designated IEC 559:1989).
+<!--page 15 -->
+
+<h2><a name="3" href="#3">3. Terms, definitions, and symbols</a></h2>
+<p><!--para 1 -->
+ For the purposes of this International Standard, the following definitions apply. Other
+ terms are defined where they appear in italic type or on the left side of a syntax rule.
+ Terms explicitly defined in this International Standard are not to be presumed to refer
+ implicitly to similar terms defined elsewhere. Terms not defined in this International
+ Standard are to be interpreted according to ISO/IEC 2382-1. Mathematical symbols not
+ defined in this International Standard are to be interpreted according to ISO 31-11.
+
+<h3><a name="3.1" href="#3.1">3.1</a></h3>
+<p><!--para 1 -->
+<b> access</b><br>
+ &lt;execution-time action&gt; to read or modify the value of an object
+<p><!--para 2 -->
+ NOTE 1   Where only one of these two actions is meant, ''read'' or ''modify'' is used.
+<p><!--para 3 -->
+ NOTE 2   "Modify'' includes the case where the new value being stored is the same as the previous value.
+<p><!--para 4 -->
+ NOTE 3   Expressions that are not evaluated do not access objects.
+
+<h3><a name="3.2" href="#3.2">3.2</a></h3>
+<p><!--para 1 -->
+<b> alignment</b><br>
+ requirement that objects of a particular type be located on storage boundaries with
+ addresses that are particular multiples of a byte address
+
+<h3><a name="3.3" href="#3.3">3.3</a></h3>
+<p><!--para 1 -->
+<b> argument</b><br>
+ actual argument<br>
+ actual parameter (deprecated)<br>
+ expression in the comma-separated list bounded by the parentheses in a function call
+ expression, or a sequence of preprocessing tokens in the comma-separated list bounded
+ by the parentheses in a function-like macro invocation
+
+<h3><a name="3.4" href="#3.4">3.4</a></h3>
+<p><!--para 1 -->
+<b> behavior</b><br>
+ external appearance or action
+
+<h4><a name="3.4.1" href="#3.4.1">3.4.1</a></h4>
+<p><!--para 1 -->
+<b> implementation-defined behavior</b><br>
+ unspecified behavior where each implementation documents how the choice is made
+<p><!--para 2 -->
+ EXAMPLE An example of implementation-defined behavior is the propagation of the high-order bit
+ when a signed integer is shifted right.
+
+<h4><a name="3.4.2" href="#3.4.2">3.4.2</a></h4>
+<p><!--para 1 -->
+<b> locale-specific behavior</b><br>
+ behavior that depends on local conventions of nationality, culture, and language that each
+ implementation documents
+<!--page 16 -->
+<p><!--para 2 -->
+ EXAMPLE An example of locale-specific behavior is whether the islower function returns true for
+ characters other than the 26 lowercase Latin letters.
+
+<h4><a name="3.4.3" href="#3.4.3">3.4.3</a></h4>
+<p><!--para 1 -->
+<b> undefined behavior</b><br>
+ behavior, upon use of a nonportable or erroneous program construct or of erroneous data,
+ for which this International Standard imposes no requirements
+<p><!--para 2 -->
+ NOTE Possible undefined behavior ranges from ignoring the situation completely with unpredictable
+ results, to behaving during translation or program execution in a documented manner characteristic of the
+ environment (with or without the issuance of a diagnostic message), to terminating a translation or
+ execution (with the issuance of a diagnostic message).
+<p><!--para 3 -->
+ EXAMPLE        An example of undefined behavior is the behavior on integer overflow.
+
+<h4><a name="3.4.4" href="#3.4.4">3.4.4</a></h4>
+<p><!--para 1 -->
+<b> unspecified behavior</b><br>
+ use of an unspecified value, or other behavior where this International Standard provides
+ two or more possibilities and imposes no further requirements on which is chosen in any
+ instance
+<p><!--para 2 -->
+ EXAMPLE        An example of unspecified behavior is the order in which the arguments to a function are
+ evaluated.
+
+<h3><a name="3.5" href="#3.5">3.5</a></h3>
+<p><!--para 1 -->
+<b> bit</b><br>
+ unit of data storage in the execution environment large enough to hold an object that may
+ have one of two values
+<p><!--para 2 -->
+ NOTE     It need not be possible to express the address of each individual bit of an object.
+
+<h3><a name="3.6" href="#3.6">3.6</a></h3>
+<p><!--para 1 -->
+<b> byte</b><br>
+ addressable unit of data storage large enough to hold any member of the basic character
+ set of the execution environment
+<p><!--para 2 -->
+ NOTE 1 It is possible to express the address of each individual byte of an object uniquely.
+<p><!--para 3 -->
+ NOTE 2 A byte is composed of a contiguous sequence of bits, the number of which is implementation-
+ defined. The least significant bit is called the low-order bit; the most significant bit is called the high-order
+ bit.
+
+<h3><a name="3.7" href="#3.7">3.7</a></h3>
+<p><!--para 1 -->
+<b> character</b><br>
+ &lt;abstract&gt; member of a set of elements used for the organization, control, or
+ representation of data
+
+<h4><a name="3.7.1" href="#3.7.1">3.7.1</a></h4>
+<p><!--para 1 -->
+<b> character</b><br>
+ single-byte character
+ &lt;C&gt; bit representation that fits in a byte
+<!--page 17 -->
+
+<h4><a name="3.7.2" href="#3.7.2">3.7.2</a></h4>
+<p><!--para 1 -->
+<b> multibyte character</b><br>
+ sequence of one or more bytes representing a member of the extended character set of
+ either the source or the execution environment
+<p><!--para 2 -->
+ NOTE    The extended character set is a superset of the basic character set.
+
+<h4><a name="3.7.3" href="#3.7.3">3.7.3</a></h4>
+<p><!--para 1 -->
+<b> wide character</b><br>
+ bit representation that fits in an object of type wchar_t, capable of representing any
+ character in the current locale
+
+<h3><a name="3.8" href="#3.8">3.8</a></h3>
+<p><!--para 1 -->
+<b> constraint</b><br>
+ restriction, either syntactic or semantic, by which the exposition of language elements is
+ to be interpreted
+
+<h3><a name="3.9" href="#3.9">3.9</a></h3>
+<p><!--para 1 -->
+<b> correctly rounded result</b><br>
+ representation in the result format that is nearest in value, subject to the current rounding
+ mode, to what the result would be given unlimited range and precision
+
+<h3><a name="3.10" href="#3.10">3.10</a></h3>
+<p><!--para 1 -->
+<b> diagnostic message</b><br>
+ message belonging to an implementation-defined subset of the implementation's message
+ output
+
+<h3><a name="3.11" href="#3.11">3.11</a></h3>
+<p><!--para 1 -->
+<b> forward reference</b><br>
+ reference to a later subclause of this International Standard that contains additional
+ information relevant to this subclause
+
+<h3><a name="3.12" href="#3.12">3.12</a></h3>
+<p><!--para 1 -->
+<b> implementation</b><br>
+ particular set of software, running in a particular translation environment under particular
+ control options, that performs translation of programs for, and supports execution of
+ functions in, a particular execution environment
+
+<h3><a name="3.13" href="#3.13">3.13</a></h3>
+<p><!--para 1 -->
+<b> implementation limit</b><br>
+ restriction imposed upon programs by the implementation
+
+<h3><a name="3.14" href="#3.14">3.14</a></h3>
+<p><!--para 1 -->
+<b> object</b><br>
+ region of data storage in the execution environment, the contents of which can represent
+ values
+<!--page 18 -->
+<p><!--para 2 -->
+ NOTE     When referenced, an object may be interpreted as having a particular type; see <a href="#6.3.2.1">6.3.2.1</a>.
+
+<h3><a name="3.15" href="#3.15">3.15</a></h3>
+<p><!--para 1 -->
+<b> parameter</b><br>
+ formal parameter
+ formal argument (deprecated)
+ object declared as part of a function declaration or definition that acquires a value on
+ entry to the function, or an identifier from the comma-separated list bounded by the
+ parentheses immediately following the macro name in a function-like macro definition
+
+<h3><a name="3.16" href="#3.16">3.16</a></h3>
+<p><!--para 1 -->
+<b> recommended practice</b><br>
+ specification that is strongly recommended as being in keeping with the intent of the
+ standard, but that may be impractical for some implementations
+
+<h3><a name="3.17" href="#3.17">3.17</a></h3>
+<p><!--para 1 -->
+<b> value</b><br>
+ precise meaning of the contents of an object when interpreted as having a specific type
+
+<h4><a name="3.17.1" href="#3.17.1">3.17.1</a></h4>
+<p><!--para 1 -->
+<b> implementation-defined value</b><br>
+ unspecified value where each implementation documents how the choice is made
+
+<h4><a name="3.17.2" href="#3.17.2">3.17.2</a></h4>
+<p><!--para 1 -->
+<b> indeterminate value</b><br>
+ either an unspecified value or a trap representation
+
+<h4><a name="3.17.3" href="#3.17.3">3.17.3</a></h4>
+<p><!--para 1 -->
+<b> unspecified value</b><br>
+ valid value of the relevant type where this International Standard imposes no
+ requirements on which value is chosen in any instance
+<p><!--para 2 -->
+ NOTE     An unspecified value cannot be a trap representation.
+
+<h3><a name="3.18" href="#3.18">3.18</a></h3>
+<p><!--para 1 -->
+<b> [^ x ^]</b><br>
+ ceiling of x: the least integer greater than or equal to x
+<p><!--para 2 -->
+ EXAMPLE       [^2.4^] is 3, [^-2.4^] is -2.
+
+<h3><a name="3.19" href="#3.19">3.19</a></h3>
+<p><!--para 1 -->
+<b> [_ x _]</b><br>
+ floor of x: the greatest integer less than or equal to x
+<p><!--para 2 -->
+ EXAMPLE       [_2.4_] is 2, [_-2.4_] is -3.
+<!--page 19 -->
+
+<h2><a name="4" href="#4">4. Conformance</a></h2>
+<p><!--para 1 -->
+ In this International Standard, ''shall'' is to be interpreted as a requirement on an
+ implementation or on a program; conversely, ''shall not'' is to be interpreted as a
+ prohibition.
+<p><!--para 2 -->
+ If a ''shall'' or ''shall not'' requirement that appears outside of a constraint is violated, the
+ behavior is undefined. Undefined behavior is otherwise indicated in this International
+ Standard by the words ''undefined behavior'' or by the omission of any explicit definition
+ of behavior. There is no difference in emphasis among these three; they all describe
+ ''behavior that is undefined''.
+<p><!--para 3 -->
+ A program that is correct in all other aspects, operating on correct data, containing
+ unspecified behavior shall be a correct program and act in accordance with <a href="#5.1.2.3">5.1.2.3</a>.
+<p><!--para 4 -->
+ The implementation shall not successfully translate a preprocessing translation unit
+ containing a #error preprocessing directive unless it is part of a group skipped by
+ conditional inclusion.
+<p><!--para 5 -->
+ A strictly conforming program shall use only those features of the language and library
+ specified in this International Standard.<sup><a href="#note2"><b>2)</b></a></sup> It shall not produce output dependent on any
+ unspecified, undefined, or implementation-defined behavior, and shall not exceed any
+ minimum implementation limit.
+<p><!--para 6 -->
+ The two forms of conforming implementation are hosted and freestanding. A conforming
+ hosted implementation shall accept any strictly conforming program. A conforming
+ freestanding implementation shall accept any strictly conforming program that does not
+ use complex types and in which the use of the features specified in the library clause
+ (clause 7) is confined to the contents of the standard headers <a href="#7.7">&lt;float.h&gt;</a>,
+ <a href="#7.9">&lt;iso646.h&gt;</a>, <a href="#7.10">&lt;limits.h&gt;</a>, <a href="#7.15">&lt;stdarg.h&gt;</a>, <a href="#7.16">&lt;stdbool.h&gt;</a>, <a href="#7.17">&lt;stddef.h&gt;</a>, and
+ <a href="#7.18">&lt;stdint.h&gt;</a>. A conforming implementation may have extensions (including additional
+ library functions), provided they do not alter the behavior of any strictly conforming
+ program.<sup><a href="#note3"><b>3)</b></a></sup>
+<!--page 20 -->
+<p><!--para 7 -->
+ A conforming program is one that is acceptable to a conforming implementation.<sup><a href="#note4"><b>4)</b></a></sup>
+<p><!--para 8 -->
+ An implementation shall be accompanied by a document that defines all implementation-
+ defined and locale-specific characteristics and all extensions.
+<p><b> Forward references</b>: conditional inclusion (<a href="#6.10.1">6.10.1</a>), error directive (<a href="#6.10.5">6.10.5</a>),
+ characteristics of floating types <a href="#7.7">&lt;float.h&gt;</a> (<a href="#7.7">7.7</a>), alternative spellings <a href="#7.9">&lt;iso646.h&gt;</a>
+ (<a href="#7.9">7.9</a>), sizes of integer types <a href="#7.10">&lt;limits.h&gt;</a> (<a href="#7.10">7.10</a>), variable arguments <a href="#7.15">&lt;stdarg.h&gt;</a>
+ (<a href="#7.15">7.15</a>), boolean type and values <a href="#7.16">&lt;stdbool.h&gt;</a> (<a href="#7.16">7.16</a>), common definitions
+ <a href="#7.17">&lt;stddef.h&gt;</a> (<a href="#7.17">7.17</a>), integer types <a href="#7.18">&lt;stdint.h&gt;</a> (<a href="#7.18">7.18</a>).
+<!--page 21 -->
+
+<p><b>Footnotes</b>
+<p><small><a name="note2" href="#note2">2)</a> A strictly conforming program can use conditional features (such as those in <a href="#F">annex F</a>) provided the
+ use is guarded by a #ifdef directive with the appropriate macro. For example:
+
+<pre>
+         #ifdef __STDC_IEC_559__ /* FE_UPWARD defined */
             /* ... */
-            if ((c = f()) == -1)
-                    /* ... */
-    the int value returned by the function may be truncated when stored in the char, and then converted back
-    to int width prior to the comparison. In an implementation in which ''plain'' char has the same range of
-    values as unsigned char (and char is narrower than int), the result of the conversion cannot be
-
-
-
-    96) The asymmetric appearance of these constraints with respect to type qualifiers is due to the conversion
-        (specified in <a href="#6.3.2.1">6.3.2.1</a>) that changes lvalues to ''the value of the expression'' and thus removes any type
-        qualifiers that were applied to the type category of the expression (for example, it removes const but
-        not volatile from the type int volatile * const).
-
-[<a name="p92" href="#p92">page 92</a>] (<a href="#Contents">Contents</a>)
-
-    negative, so the operands of the comparison can never compare equal. Therefore, for full portability, the
-    variable c should be declared as int.
-
-5   EXAMPLE 2       In the fragment:
-            char c;
-            int i;
-            long l;
-            l = (c = i);
-    the value of i is converted to the type of the assignment expression c = i, that is, char type. The value
-    of the expression enclosed in parentheses is then converted to the type of the outer assignment expression,
-    that is, long int type.
-
-6   EXAMPLE 3       Consider the fragment:
-            const char **cpp;
-            char *p;
-            const char c = 'A';
-            cpp = &amp;p;                  // constraint violation
-            *cpp = &amp;c;                 // valid
-            *p = 0;                    // valid
-    The first assignment is unsafe because it would allow the following valid code to attempt to change the
-    value of the const object c.
-
-<a name="6.5.16.2" href="#6.5.16.2"><b>    6.5.16.2 Compound assignment</b></a>
-    Constraints
-1   For the operators += and -= only, either the left operand shall be a pointer to an object
-    type and the right shall have integer type, or the left operand shall have qualified or
-    unqualified arithmetic type and the right shall have arithmetic type.
-2   For the other operators, each operand shall have arithmetic type consistent with those
-    allowed by the corresponding binary operator.
-    Semantics
-3   A compound assignment of the form E1 op = E2 differs from the simple assignment
-    expression E1 = E1 op (E2) only in that the lvalue E1 is evaluated only once.
-
-
-
-
-[<a name="p93" href="#p93">page 93</a>] (<a href="#Contents">Contents</a>)
-
-<a name="6.5.17" href="#6.5.17"><b>    6.5.17 Comma operator</b></a>
-    Syntax
-1            expression:
-                    assignment-expression
-                    expression , assignment-expression
-    Semantics
-2   The left operand of a comma operator is evaluated as a void expression; there is a
-    sequence point after its evaluation. Then the right operand is evaluated; the result has its
-    type and value.97) If an attempt is made to modify the result of a comma operator or to
-    access it after the next sequence point, the behavior is undefined.
-3   EXAMPLE As indicated by the syntax, the comma operator (as described in this subclause) cannot
-    appear in contexts where a comma is used to separate items in a list (such as arguments to functions or lists
-    of initializers). On the other hand, it can be used within a parenthesized expression or within the second
-    expression of a conditional operator in such contexts. In the function call
-             f(a, (t=3, t+2), c)
-    the function has three arguments, the second of which has the value 5.
-
-    Forward references: initialization (<a href="#6.7.8">6.7.8</a>).
-
-
-
-
-    97) A comma operator does not yield an lvalue.
-
-[<a name="p94" href="#p94">page 94</a>] (<a href="#Contents">Contents</a>)
-
-<a name="6.6" href="#6.6"><b>    6.6 Constant expressions</b></a>
-    Syntax
-1            constant-expression:
-                    conditional-expression
-    Description
-2   A constant expression can be evaluated during translation rather than runtime, and
-    accordingly may be used in any place that a constant may be.
-    Constraints
-3   Constant expressions shall not contain assignment, increment, decrement, function-call,
-    or comma operators, except when they are contained within a subexpression that is not
-    evaluated.98)
-4   Each constant expression shall evaluate to a constant that is in the range of representable
-    values for its type.
-    Semantics
-5   An expression that evaluates to a constant is required in several contexts. If a floating
-    expression is evaluated in the translation environment, the arithmetic precision and range
-    shall be at least as great as if the expression were being evaluated in the execution
-    environment.
-6   An integer constant expression99) shall have integer type and shall only have operands
-    that are integer constants, enumeration constants, character constants, sizeof
-    expressions whose results are integer constants, and floating constants that are the
-    immediate operands of casts. Cast operators in an integer constant expression shall only
-    convert arithmetic types to integer types, except as part of an operand to the sizeof
-    operator.
-7   More latitude is permitted for constant expressions in initializers. Such a constant
-    expression shall be, or evaluate to, one of the following:
-    -- an arithmetic constant expression,
-    -- a null pointer constant,
-
-
-
-
-    98) The operand of a sizeof operator is usually not evaluated (<a href="#6.5.3.4">6.5.3.4</a>).
-    99) An integer constant expression is used to specify the size of a bit-field member of a structure, the
-        value of an enumeration constant, the size of an array, or the value of a case constant. Further
-        constraints that apply to the integer constant expressions used in conditional-inclusion preprocessing
-        directives are discussed in <a href="#6.10.1">6.10.1</a>.
-
-[<a name="p95" href="#p95">page 95</a>] (<a href="#Contents">Contents</a>)
-
-     -- an address constant, or
-     -- an address constant for an object type plus or minus an integer constant expression.
-8    An arithmetic constant expression shall have arithmetic type and shall only have
-     operands that are integer constants, floating constants, enumeration constants, character
-     constants, and sizeof expressions. Cast operators in an arithmetic constant expression
-     shall only convert arithmetic types to arithmetic types, except as part of an operand to a
-     sizeof operator whose result is an integer constant.
-9    An address constant is a null pointer, a pointer to an lvalue designating an object of static
-     storage duration, or a pointer to a function designator; it shall be created explicitly using
-     the unary &amp; operator or an integer constant cast to pointer type, or implicitly by the use of
-     an expression of array or function type. The array-subscript [] and member-access .
-     and -&gt; operators, the address &amp; and indirection * unary operators, and pointer casts may
-     be used in the creation of an address constant, but the value of an object shall not be
-     accessed by use of these operators.
-10   An implementation may accept other forms of constant expressions.
-11   The semantic rules for the evaluation of a constant expression are the same as for
-     nonconstant expressions.100)
-     Forward references: array declarators (<a href="#6.7.5.2">6.7.5.2</a>), initialization (<a href="#6.7.8">6.7.8</a>).
-
-
-
-
-     100) Thus, in the following initialization,
-                   static int i = 2 || 1 / 0;
-          the expression is a valid integer constant expression with value one.
-
-[<a name="p96" href="#p96">page 96</a>] (<a href="#Contents">Contents</a>)
-
-<a name="6.7" href="#6.7"><b>    6.7 Declarations</b></a>
-    Syntax
-1            declaration:
-                    declaration-specifiers init-declarator-listopt ;
-             declaration-specifiers:
-                    storage-class-specifier declaration-specifiersopt
-                    type-specifier declaration-specifiersopt
-                    type-qualifier declaration-specifiersopt
-                    function-specifier declaration-specifiersopt
-             init-declarator-list:
-                     init-declarator
-                     init-declarator-list , init-declarator
-             init-declarator:
-                     declarator
-                     declarator = initializer
-    Constraints
-2   A declaration shall declare at least a declarator (other than the parameters of a function or
-    the members of a structure or union), a tag, or the members of an enumeration.
-3   If an identifier has no linkage, there shall be no more than one declaration of the identifier
-    (in a declarator or type specifier) with the same scope and in the same name space, except
-    for tags as specified in <a href="#6.7.2.3">6.7.2.3</a>.
-4   All declarations in the same scope that refer to the same object or function shall specify
-    compatible types.
-    Semantics
-5   A declaration specifies the interpretation and attributes of a set of identifiers. A definition
-    of an identifier is a declaration for that identifier that:
-    -- for an object, causes storage to be reserved for that object;
-    -- for a function, includes the function body;101)
-    -- for an enumeration constant or typedef name, is the (only) declaration of the
-      identifier.
-6   The declaration specifiers consist of a sequence of specifiers that indicate the linkage,
-    storage duration, and part of the type of the entities that the declarators denote. The init-
-    declarator-list is a comma-separated sequence of declarators, each of which may have
-
-    101) Function definitions have a different syntax, described in <a href="#6.9.1">6.9.1</a>.
-
-[<a name="p97" href="#p97">page 97</a>] (<a href="#Contents">Contents</a>)
-
-    additional type information, or an initializer, or both. The declarators contain the
-    identifiers (if any) being declared.
-7   If an identifier for an object is declared with no linkage, the type for the object shall be
-    complete by the end of its declarator, or by the end of its init-declarator if it has an
-    initializer; in the case of function parameters (including in prototypes), it is the adjusted
-    type (see <a href="#6.7.5.3">6.7.5.3</a>) that is required to be complete.
-    Forward references: declarators (<a href="#6.7.5">6.7.5</a>), enumeration specifiers (<a href="#6.7.2.2">6.7.2.2</a>), initialization
-    (<a href="#6.7.8">6.7.8</a>).
-<a name="6.7.1" href="#6.7.1"><b>    6.7.1 Storage-class specifiers</b></a>
-    Syntax
-1            storage-class-specifier:
-                    typedef
-                    extern
-                    static
-                    auto
-                    register
-    Constraints
-2   At most, one storage-class specifier may be given in the declaration specifiers in a
-    declaration.102)
-    Semantics
-3   The typedef specifier is called a ''storage-class specifier'' for syntactic convenience
-    only; it is discussed in <a href="#6.7.7">6.7.7</a>. The meanings of the various linkages and storage durations
-    were discussed in <a href="#6.2.2">6.2.2</a> and <a href="#6.2.4">6.2.4</a>.
-4   A declaration of an identifier for an object with storage-class specifier register
-    suggests that access to the object be as fast as possible. The extent to which such
-    suggestions are effective is implementation-defined.103)
-5   The declaration of an identifier for a function that has block scope shall have no explicit
-    storage-class specifier other than extern.
-
-
-
-    102) See ''future language directions'' (<a href="#6.11.5">6.11.5</a>).
-    103) The implementation may treat any register declaration simply as an auto declaration. However,
-         whether or not addressable storage is actually used, the address of any part of an object declared with
-         storage-class specifier register cannot be computed, either explicitly (by use of the unary &amp;
-         operator as discussed in <a href="#6.5.3.2">6.5.3.2</a>) or implicitly (by converting an array name to a pointer as discussed in
-         <a href="#6.3.2.1">6.3.2.1</a>). Thus, the only operator that can be applied to an array declared with storage-class specifier
-         register is sizeof.
-
-[<a name="p98" href="#p98">page 98</a>] (<a href="#Contents">Contents</a>)
-
-6   If an aggregate or union object is declared with a storage-class specifier other than
-    typedef, the properties resulting from the storage-class specifier, except with respect to
-    linkage, also apply to the members of the object, and so on recursively for any aggregate
-    or union member objects.
-    Forward references: type definitions (<a href="#6.7.7">6.7.7</a>).
-<a name="6.7.2" href="#6.7.2"><b>    6.7.2 Type specifiers</b></a>
-    Syntax
-1            type-specifier:
-                    void
-                    char
-                    short
-                    int
-                    long
-                    float
-                    double
-                    signed
-                    unsigned
-                    _Bool
-                    _Complex
-                    struct-or-union-specifier                                                      *
-                    enum-specifier
-                    typedef-name
-    Constraints
-2   At least one type specifier shall be given in the declaration specifiers in each declaration,
-    and in the specifier-qualifier list in each struct declaration and type name. Each list of
-    type specifiers shall be one of the following sets (delimited by commas, when there is
-    more than one set on a line); the type specifiers may occur in any order, possibly
-    intermixed with the other declaration specifiers.
-    -- void
-    -- char
-    -- signed char
-    -- unsigned char
-    -- short, signed short, short int, or signed short int
-    -- unsigned short, or unsigned short int
-    -- int, signed, or signed int
-
-
-[<a name="p99" href="#p99">page 99</a>] (<a href="#Contents">Contents</a>)
-
-    -- unsigned, or unsigned int
-    -- long, signed long, long int, or signed long int
-    -- unsigned long, or unsigned long int
-    -- long long, signed long long, long long int, or
-      signed long long int
-    -- unsigned long long, or unsigned long long int
-    -- float
-    -- double
-    -- long double
-    -- _Bool
-    -- float _Complex
-    -- double _Complex
-    -- long double _Complex
-    -- struct or union specifier                                                                    *
-    -- enum specifier
-    -- typedef name
-3   The type specifier _Complex shall not be used if the implementation does not provide
-    complex types.104)
-    Semantics
-4   Specifiers for structures, unions, and enumerations are discussed in <a href="#6.7.2.1">6.7.2.1</a> through
-<a name="6.7.2.3" href="#6.7.2.3"><b>    6.7.2.3. Declarations of typedef names are discussed in 6.7.7. The characteristics of the</b></a>
-    other types are discussed in <a href="#6.2.5">6.2.5</a>.
-5   Each of the comma-separated sets designates the same type, except that for bit-fields, it is
-    implementation-defined whether the specifier int designates the same type as signed
-    int or the same type as unsigned int.
-    Forward references: enumeration specifiers (<a href="#6.7.2.2">6.7.2.2</a>), structure and union specifiers
-    (<a href="#6.7.2.1">6.7.2.1</a>), tags (<a href="#6.7.2.3">6.7.2.3</a>), type definitions (<a href="#6.7.7">6.7.7</a>).
-
-
-
-
-    104) Freestanding implementations are not required to provide complex types.                  *
-
-[<a name="p100" href="#p100">page 100</a>] (<a href="#Contents">Contents</a>)
-
-<a name="6.7.2.1" href="#6.7.2.1"><b>    6.7.2.1 Structure and union specifiers</b></a>
-    Syntax
-1            struct-or-union-specifier:
-                     struct-or-union identifieropt { struct-declaration-list }
-                     struct-or-union identifier
-             struct-or-union:
-                     struct
-                     union
-             struct-declaration-list:
-                     struct-declaration
-                     struct-declaration-list struct-declaration
-             struct-declaration:
-                     specifier-qualifier-list struct-declarator-list ;
-             specifier-qualifier-list:
-                    type-specifier specifier-qualifier-listopt
-                    type-qualifier specifier-qualifier-listopt
-             struct-declarator-list:
-                     struct-declarator
-                     struct-declarator-list , struct-declarator
-             struct-declarator:
-                     declarator
-                     declaratoropt : constant-expression
-    Constraints
-2   A structure or union shall not contain a member with incomplete or function type (hence,
-    a structure shall not contain an instance of itself, but may contain a pointer to an instance
-    of itself), except that the last member of a structure with more than one named member
-    may have incomplete array type; such a structure (and any union containing, possibly
-    recursively, a member that is such a structure) shall not be a member of a structure or an
-    element of an array.
-3   The expression that specifies the width of a bit-field shall be an integer constant
-    expression with a nonnegative value that does not exceed the width of an object of the
-    type that would be specified were the colon and expression omitted. If the value is zero,
-    the declaration shall have no declarator.
-4   A bit-field shall have a type that is a qualified or unqualified version of _Bool, signed
-    int, unsigned int, or some other implementation-defined type.
-
-
-[<a name="p101" href="#p101">page 101</a>] (<a href="#Contents">Contents</a>)
-
-     Semantics
-5    As discussed in <a href="#6.2.5">6.2.5</a>, a structure is a type consisting of a sequence of members, whose
-     storage is allocated in an ordered sequence, and a union is a type consisting of a sequence
-     of members whose storage overlap.
-6    Structure and union specifiers have the same form. The keywords struct and union
-     indicate that the type being specified is, respectively, a structure type or a union type.
-7    The presence of a struct-declaration-list in a struct-or-union-specifier declares a new type,
-     within a translation unit. The struct-declaration-list is a sequence of declarations for the
-     members of the structure or union. If the struct-declaration-list contains no named
-     members, the behavior is undefined. The type is incomplete until after the } that
-     terminates the list.
-8    A member of a structure or union may have any object type other than a variably
-     modified type.105) In addition, a member may be declared to consist of a specified
-     number of bits (including a sign bit, if any). Such a member is called a bit-field;106) its
-     width is preceded by a colon.
-9    A bit-field is interpreted as a signed or unsigned integer type consisting of the specified
-     number of bits.107) If the value 0 or 1 is stored into a nonzero-width bit-field of type
-     _Bool, the value of the bit-field shall compare equal to the value stored.
-10   An implementation may allocate any addressable storage unit large enough to hold a bit-
-     field. If enough space remains, a bit-field that immediately follows another bit-field in a
-     structure shall be packed into adjacent bits of the same unit. If insufficient space remains,
-     whether a bit-field that does not fit is put into the next unit or overlaps adjacent units is
-     implementation-defined. The order of allocation of bit-fields within a unit (high-order to
-     low-order or low-order to high-order) is implementation-defined. The alignment of the
-     addressable storage unit is unspecified.
-11   A bit-field declaration with no declarator, but only a colon and a width, indicates an
-     unnamed bit-field.108) As a special case, a bit-field structure member with a width of 0
-     indicates that no further bit-field is to be packed into the unit in which the previous bit-
-     field, if any, was placed.
-
-
-     105) A structure or union can not contain a member with a variably modified type because member names
-          are not ordinary identifiers as defined in <a href="#6.2.3">6.2.3</a>.
-     106) The unary &amp; (address-of) operator cannot be applied to a bit-field object; thus, there are no pointers to
-          or arrays of bit-field objects.
-     107) As specified in <a href="#6.7.2">6.7.2</a> above, if the actual type specifier used is int or a typedef-name defined as int,
-          then it is implementation-defined whether the bit-field is signed or unsigned.
-     108) An unnamed bit-field structure member is useful for padding to conform to externally imposed
-          layouts.
-
-[<a name="p102" href="#p102">page 102</a>] (<a href="#Contents">Contents</a>)
-
-12   Each non-bit-field member of a structure or union object is aligned in an implementation-
-     defined manner appropriate to its type.
-13   Within a structure object, the non-bit-field members and the units in which bit-fields
-     reside have addresses that increase in the order in which they are declared. A pointer to a
-     structure object, suitably converted, points to its initial member (or if that member is a
-     bit-field, then to the unit in which it resides), and vice versa. There may be unnamed
-     padding within a structure object, but not at its beginning.
-14   The size of a union is sufficient to contain the largest of its members. The value of at
-     most one of the members can be stored in a union object at any time. A pointer to a
-     union object, suitably converted, points to each of its members (or if a member is a bit-
-     field, then to the unit in which it resides), and vice versa.
-15   There may be unnamed padding at the end of a structure or union.
-16   As a special case, the last element of a structure with more than one named member may
-     have an incomplete array type; this is called a flexible array member. In most situations,
-     the flexible array member is ignored. In particular, the size of the structure is as if the
-     flexible array member were omitted except that it may have more trailing padding than
-     the omission would imply. However, when a . (or -&gt;) operator has a left operand that is
-     (a pointer to) a structure with a flexible array member and the right operand names that
-     member, it behaves as if that member were replaced with the longest array (with the same
-     element type) that would not make the structure larger than the object being accessed; the
-     offset of the array shall remain that of the flexible array member, even if this would differ
-     from that of the replacement array. If this array would have no elements, it behaves as if
-     it had one element but the behavior is undefined if any attempt is made to access that
-     element or to generate a pointer one past it.
-17   EXAMPLE       After the declaration:
-             struct s { int n; double d[]; };
-     the structure struct s has a flexible array member d. A typical way to use this is:
-             int m = /* some value */;
-             struct s *p = malloc(sizeof (struct s) + sizeof (double [m]));
-     and assuming that the call to malloc succeeds, the object pointed to by p behaves, for most purposes, as if
-     p had been declared as:
-             struct { int n; double d[m]; } *p;
-     (there are circumstances in which this equivalence is broken; in particular, the offsets of member d might
-     not be the same).
-18   Following the above declaration:
-
-
-
-
-[<a name="p103" href="#p103">page 103</a>] (<a href="#Contents">Contents</a>)
-
-              struct s t1 = { 0 };                        //   valid
-              struct s t2 = { 1, { <a href="#4.2">4.2</a> }};                //   invalid
-              t1.n = 4;                                   //   valid
-              t1.d[0] = <a href="#4.2">4.2</a>;                              //   might be undefined behavior
-     The initialization of t2 is invalid (and violates a constraint) because struct s is treated as if it did not
-     contain member d. The assignment to t1.d[0] is probably undefined behavior, but it is possible that
-              sizeof (struct s) &gt;= offsetof(struct s, d) + sizeof (double)
-     in which case the assignment would be legitimate. Nevertheless, it cannot appear in strictly conforming
-     code.
-19   After the further declaration:
-              struct ss { int n; };
-     the expressions:
-              sizeof (struct s) &gt;= sizeof (struct ss)
-              sizeof (struct s) &gt;= offsetof(struct s, d)
-     are always equal to 1.
-20   If sizeof (double) is 8, then after the following code is executed:
-              struct s *s1;
-              struct s *s2;
-              s1 = malloc(sizeof (struct s) + 64);
-              s2 = malloc(sizeof (struct s) + 46);
-     and assuming that the calls to malloc succeed, the objects pointed to by s1 and s2 behave, for most
-     purposes, as if the identifiers had been declared as:
-              struct { int n; double d[8]; } *s1;
-              struct { int n; double d[5]; } *s2;
-21   Following the further successful assignments:
-              s1 = malloc(sizeof (struct s) + 10);
-              s2 = malloc(sizeof (struct s) + 6);
-     they then behave as if the declarations were:
-              struct { int n; double d[1]; } *s1, *s2;
-     and:
-              double *dp;
-              dp = &amp;(s1-&gt;d[0]);           //   valid
-              *dp = 42;                   //   valid
-              dp = &amp;(s2-&gt;d[0]);           //   valid
-              *dp = 42;                   //   undefined behavior
-22   The assignment:
-              *s1 = *s2;
-     only copies the member n; if any of the array elements are within the first sizeof (struct s) bytes
-     of the structure, they might be copied or simply overwritten with indeterminate values.
-
-     Forward references: tags (<a href="#6.7.2.3">6.7.2.3</a>).
-
-[<a name="p104" href="#p104">page 104</a>] (<a href="#Contents">Contents</a>)
-
-<a name="6.7.2.2" href="#6.7.2.2"><b>    6.7.2.2 Enumeration specifiers</b></a>
-    Syntax
-1            enum-specifier:
-                   enum identifieropt { enumerator-list }
-                   enum identifieropt { enumerator-list , }
-                   enum identifier
-             enumerator-list:
-                   enumerator
-                   enumerator-list , enumerator
-             enumerator:
-                   enumeration-constant
-                   enumeration-constant = constant-expression
-    Constraints
-2   The expression that defines the value of an enumeration constant shall be an integer
-    constant expression that has a value representable as an int.
-    Semantics
-3   The identifiers in an enumerator list are declared as constants that have type int and
-    may appear wherever such are permitted.109) An enumerator with = defines its
-    enumeration constant as the value of the constant expression. If the first enumerator has
-    no =, the value of its enumeration constant is 0. Each subsequent enumerator with no =
-    defines its enumeration constant as the value of the constant expression obtained by
-    adding 1 to the value of the previous enumeration constant. (The use of enumerators with
-    = may produce enumeration constants with values that duplicate other values in the same
-    enumeration.) The enumerators of an enumeration are also known as its members.
-4   Each enumerated type shall be compatible with char, a signed integer type, or an
-    unsigned integer type. The choice of type is implementation-defined,110) but shall be
-    capable of representing the values of all the members of the enumeration. The
-    enumerated type is incomplete until after the } that terminates the list of enumerator
-    declarations.
-
-
-
-
-    109) Thus, the identifiers of enumeration constants declared in the same scope shall all be distinct from
-         each other and from other identifiers declared in ordinary declarators.
-    110) An implementation may delay the choice of which integer type until all enumeration constants have
-         been seen.
-
-[<a name="p105" href="#p105">page 105</a>] (<a href="#Contents">Contents</a>)
-
-5   EXAMPLE       The following fragment:
-            enum hue { chartreuse, burgundy, claret=20, winedark };
-            enum hue col, *cp;
-            col = claret;
-            cp = &amp;col;
-            if (*cp != burgundy)
-                  /* ... */
-    makes hue the tag of an enumeration, and then declares col as an object that has that type and cp as a
-    pointer to an object that has that type. The enumerated values are in the set { 0, 1, 20, 21 }.
-
-    Forward references: tags (<a href="#6.7.2.3">6.7.2.3</a>).
-<a name="6.7.2.3" href="#6.7.2.3"><b>    6.7.2.3 Tags</b></a>
-    Constraints
-1   A specific type shall have its content defined at most once.
-2   Where two declarations that use the same tag declare the same type, they shall both use
-    the same choice of struct, union, or enum.
-3   A type specifier of the form
-            enum identifier
-    without an enumerator list shall only appear after the type it specifies is complete.
-    Semantics
-4   All declarations of structure, union, or enumerated types that have the same scope and
-    use the same tag declare the same type. The type is incomplete111) until the closing brace
-    of the list defining the content, and complete thereafter.
-5   Two declarations of structure, union, or enumerated types which are in different scopes or
-    use different tags declare distinct types. Each declaration of a structure, union, or
-    enumerated type which does not include a tag declares a distinct type.
-6   A type specifier of the form
-            struct-or-union identifieropt { struct-declaration-list }
-    or
-            enum identifier { enumerator-list }
-    or
-            enum identifier { enumerator-list , }
-    declares a structure, union, or enumerated type. The list defines the structure content,
-
-    111) An incomplete type may only by used when the size of an object of that type is not needed. It is not
-         needed, for example, when a typedef name is declared to be a specifier for a structure or union, or
-         when a pointer to or a function returning a structure or union is being declared. (See incomplete types
-         in <a href="#6.2.5">6.2.5</a>.) The specification has to be complete before such a function is called or defined.
-
-[<a name="p106" href="#p106">page 106</a>] (<a href="#Contents">Contents</a>)
-
-     union content, or enumeration content. If an identifier is provided,112) the type specifier
-     also declares the identifier to be the tag of that type.
-7    A declaration of the form
-              struct-or-union identifier ;
-     specifies a structure or union type and declares the identifier as a tag of that type.113)
-8    If a type specifier of the form
-              struct-or-union identifier
-     occurs other than as part of one of the above forms, and no other declaration of the
-     identifier as a tag is visible, then it declares an incomplete structure or union type, and
-     declares the identifier as the tag of that type.113)
-9    If a type specifier of the form
-              struct-or-union identifier
-     or
-              enum identifier
-     occurs other than as part of one of the above forms, and a declaration of the identifier as a
-     tag is visible, then it specifies the same type as that other declaration, and does not
-     redeclare the tag.
-10   EXAMPLE 1       This mechanism allows declaration of a self-referential structure.
-              struct tnode {
-                    int count;
-                    struct tnode *left, *right;
-              };
-     specifies a structure that contains an integer and two pointers to objects of the same type. Once this
-     declaration has been given, the declaration
-              struct tnode s, *sp;
-     declares s to be an object of the given type and sp to be a pointer to an object of the given type. With
-     these declarations, the expression sp-&gt;left refers to the left struct tnode pointer of the object to
-     which sp points; the expression s.right-&gt;count designates the count member of the right struct
-     tnode pointed to from s.
-11   The following alternative formulation uses the typedef mechanism:
-
-
-
-
-     112) If there is no identifier, the type can, within the translation unit, only be referred to by the declaration
-          of which it is a part. Of course, when the declaration is of a typedef name, subsequent declarations
-          can make use of that typedef name to declare objects having the specified structure, union, or
-          enumerated type.
-     113) A similar construction with enum does not exist.
-
-[<a name="p107" href="#p107">page 107</a>] (<a href="#Contents">Contents</a>)
-
-              typedef struct tnode TNODE;
-              struct tnode {
-                    int count;
-                    TNODE *left, *right;
-              };
-              TNODE s, *sp;
-
-12   EXAMPLE 2 To illustrate the use of prior declaration of a tag to specify a pair of mutually referential
-     structures, the declarations
-              struct s1 { struct s2 *s2p; /* ... */ }; // D1
-              struct s2 { struct s1 *s1p; /* ... */ }; // D2
-     specify a pair of structures that contain pointers to each other. Note, however, that if s2 were already
-     declared as a tag in an enclosing scope, the declaration D1 would refer to it, not to the tag s2 declared in
-     D2. To eliminate this context sensitivity, the declaration
-              struct s2;
-     may be inserted ahead of D1. This declares a new tag s2 in the inner scope; the declaration D2 then
-     completes the specification of the new type.
-
-     Forward references: declarators (<a href="#6.7.5">6.7.5</a>), array declarators (<a href="#6.7.5.2">6.7.5.2</a>), type definitions
-     (<a href="#6.7.7">6.7.7</a>).
-<a name="6.7.3" href="#6.7.3"><b>     6.7.3 Type qualifiers</b></a>
-     Syntax
-1             type-qualifier:
-                     const
-                     restrict
-                     volatile
-     Constraints
-2    Types other than pointer types derived from object or incomplete types shall not be
-     restrict-qualified.
-     Semantics
-3    The properties associated with qualified types are meaningful only for expressions that
-     are lvalues.114)
-4    If the same qualifier appears more than once in the same specifier-qualifier-list, either
-     directly or via one or more typedefs, the behavior is the same as if it appeared only
-     once.
-
-
-
-
-     114) The implementation may place a const object that is not volatile in a read-only region of
-          storage. Moreover, the implementation need not allocate storage for such an object if its address is
-          never used.
-
-[<a name="p108" href="#p108">page 108</a>] (<a href="#Contents">Contents</a>)
-
-5    If an attempt is made to modify an object defined with a const-qualified type through use
-     of an lvalue with non-const-qualified type, the behavior is undefined. If an attempt is
-     made to refer to an object defined with a volatile-qualified type through use of an lvalue
-     with non-volatile-qualified type, the behavior is undefined.115)
-6    An object that has volatile-qualified type may be modified in ways unknown to the
-     implementation or have other unknown side effects. Therefore any expression referring
-     to such an object shall be evaluated strictly according to the rules of the abstract machine,
-     as described in <a href="#5.1.2.3">5.1.2.3</a>. Furthermore, at every sequence point the value last stored in the
-     object shall agree with that prescribed by the abstract machine, except as modified by the
-     unknown factors mentioned previously.116) What constitutes an access to an object that
-     has volatile-qualified type is implementation-defined.
-7    An object that is accessed through a restrict-qualified pointer has a special association
-     with that pointer. This association, defined in <a href="#6.7.3.1">6.7.3.1</a> below, requires that all accesses to
-     that object use, directly or indirectly, the value of that particular pointer.117) The intended
-     use of the restrict qualifier (like the register storage class) is to promote
-     optimization, and deleting all instances of the qualifier from all preprocessing translation
-     units composing a conforming program does not change its meaning (i.e., observable
-     behavior).
-8    If the specification of an array type includes any type qualifiers, the element type is so-
-     qualified, not the array type. If the specification of a function type includes any type
-     qualifiers, the behavior is undefined.118)
-9    For two qualified types to be compatible, both shall have the identically qualified version
-     of a compatible type; the order of type qualifiers within a list of specifiers or qualifiers
-     does not affect the specified type.
-10   EXAMPLE 1       An object declared
-              extern const volatile int real_time_clock;
-     may be modifiable by hardware, but cannot be assigned to, incremented, or decremented.
-
-
-
-
-     115) This applies to those objects that behave as if they were defined with qualified types, even if they are
-          never actually defined as objects in the program (such as an object at a memory-mapped input/output
-          address).
-     116) A volatile declaration may be used to describe an object corresponding to a memory-mapped
-          input/output port or an object accessed by an asynchronously interrupting function. Actions on
-          objects so declared shall not be ''optimized out'' by an implementation or reordered except as
-          permitted by the rules for evaluating expressions.
-     117) For example, a statement that assigns a value returned by malloc to a single pointer establishes this
-          association between the allocated object and the pointer.
-     118) Both of these can occur through the use of typedefs.
-
-[<a name="p109" href="#p109">page 109</a>] (<a href="#Contents">Contents</a>)
-
-11   EXAMPLE 2 The following declarations and expressions illustrate the behavior when type qualifiers
-     modify an aggregate type:
-             const struct s { int mem; } cs = { 1 };
-             struct s ncs; // the object ncs is modifiable
-             typedef int A[2][3];
-             const A a = {{4, 5, 6}, {7, 8, 9}}; // array of array of const int
-             int *pi;
-             const int *pci;
-             ncs = cs;             //   valid
-             cs = ncs;             //   violates modifiable lvalue constraint for =
-             pi = &amp;ncs.mem;        //   valid
-             pi = &amp;cs.mem;         //   violates type constraints for =
-             pci = &amp;cs.mem;        //   valid
-             pi = a[0];            //   invalid: a[0] has type ''const int *''
-
-<a name="6.7.3.1" href="#6.7.3.1"><b>     6.7.3.1 Formal definition of restrict</b></a>
-1    Let D be a declaration of an ordinary identifier that provides a means of designating an
-     object P as a restrict-qualified pointer to type T.
-2    If D appears inside a block and does not have storage class extern, let B denote the
-     block. If D appears in the list of parameter declarations of a function definition, let B
-     denote the associated block. Otherwise, let B denote the block of main (or the block of
-     whatever function is called at program startup in a freestanding environment).
-3    In what follows, a pointer expression E is said to be based on object P if (at some
-     sequence point in the execution of B prior to the evaluation of E) modifying P to point to
-     a copy of the array object into which it formerly pointed would change the value of E.119)
-     Note that ''based'' is defined only for expressions with pointer types.
-4    During each execution of B, let L be any lvalue that has &amp;L based on P. If L is used to
-     access the value of the object X that it designates, and X is also modified (by any means),
-     then the following requirements apply: T shall not be const-qualified. Every other lvalue
-     used to access the value of X shall also have its address based on P. Every access that
-     modifies X shall be considered also to modify P, for the purposes of this subclause. If P
-     is assigned the value of a pointer expression E that is based on another restricted pointer
-     object P2, associated with block B2, then either the execution of B2 shall begin before
-     the execution of B, or the execution of B2 shall end prior to the assignment. If these
-     requirements are not met, then the behavior is undefined.
-5    Here an execution of B means that portion of the execution of the program that would
-     correspond to the lifetime of an object with scalar type and automatic storage duration
-
-     119) In other words, E depends on the value of P itself rather than on the value of an object referenced
-          indirectly through P. For example, if identifier p has type (int **restrict), then the pointer
-          expressions p and p+1 are based on the restricted pointer object designated by p, but the pointer
-          expressions *p and p[1] are not.
-
-[<a name="p110" href="#p110">page 110</a>] (<a href="#Contents">Contents</a>)
-
-     associated with B.
-6    A translator is free to ignore any or all aliasing implications of uses of restrict.
-7    EXAMPLE 1       The file scope declarations
-              int * restrict a;
-              int * restrict b;
-              extern int c[];
-     assert that if an object is accessed using one of a, b, or c, and that object is modified anywhere in the
-     program, then it is never accessed using either of the other two.
-
-8    EXAMPLE 2 The function parameter declarations in the following example
-             void f(int n, int * restrict p, int * restrict q)
-             {
-                   while (n-- &gt; 0)
-                         *p++ = *q++;
-             }
-     assert that, during each execution of the function, if an object is accessed through one of the pointer
-     parameters, then it is not also accessed through the other.
-9    The benefit of the restrict qualifiers is that they enable a translator to make an effective dependence
-     analysis of function f without examining any of the calls of f in the program. The cost is that the
-     programmer has to examine all of those calls to ensure that none give undefined behavior. For example, the
-     second call of f in g has undefined behavior because each of d[1] through d[49] is accessed through
-     both p and q.
-             void g(void)
-             {
-                   extern int d[100];
-                   f(50, d + 50, d); // valid
-                   f(50, d + 1, d); // undefined behavior
-             }
-
-10   EXAMPLE 3       The function parameter declarations
-             void h(int n, int * restrict p, int * restrict q, int * restrict r)
-             {
-                   int i;
-                   for (i = 0; i &lt; n; i++)
-                          p[i] = q[i] + r[i];
-             }
-     illustrate how an unmodified object can be aliased through two restricted pointers. In particular, if a and b
-     are disjoint arrays, a call of the form h(100, a, b, b) has defined behavior, because array b is not
-     modified within function h.
-
-11   EXAMPLE 4 The rule limiting assignments between restricted pointers does not distinguish between a
-     function call and an equivalent nested block. With one exception, only ''outer-to-inner'' assignments
-     between restricted pointers declared in nested blocks have defined behavior.
-
-
-
-
-[<a name="p111" href="#p111">page 111</a>] (<a href="#Contents">Contents</a>)
-
-              {
-                       int * restrict p1;
-                       int * restrict q1;
-                       p1 = q1; // undefined behavior
-                       {
-                             int * restrict p2 = p1; // valid
-                             int * restrict q2 = q1; // valid
-                             p1 = q2;                // undefined behavior
-                             p2 = q2;                // undefined behavior
-                       }
-              }
-12   The one exception allows the value of a restricted pointer to be carried out of the block in which it (or, more
-     precisely, the ordinary identifier used to designate it) is declared when that block finishes execution. For
-     example, this permits new_vector to return a vector.
-              typedef struct { int n; float * restrict v; } vector;
-              vector new_vector(int n)
-              {
-                    vector t;
-                    t.n = n;
-                    t.v = malloc(n * sizeof (float));
-                    return t;
-              }
-
-<a name="6.7.4" href="#6.7.4"><b>     6.7.4 Function specifiers</b></a>
-     Syntax
-1             function-specifier:
-                     inline
-     Constraints
-2    Function specifiers shall be used only in the declaration of an identifier for a function.
-3    An inline definition of a function with external linkage shall not contain a definition of a
-     modifiable object with static storage duration, and shall not contain a reference to an
-     identifier with internal linkage.
-4    In a hosted environment, the inline function specifier shall not appear in a declaration
-     of main.
-     Semantics
-5    A function declared with an inline function specifier is an inline function. The
-     function specifier may appear more than once; the behavior is the same as if it appeared
-     only once. Making a function an inline function suggests that calls to the function be as
-     fast as possible.120) The extent to which such suggestions are effective is
-     implementation-defined.121)
-6    Any function with internal linkage can be an inline function. For a function with external
-     linkage, the following restrictions apply: If a function is declared with an inline
-[<a name="p112" href="#p112">page 112</a>] (<a href="#Contents">Contents</a>)
-
-    function specifier, then it shall also be defined in the same translation unit. If all of the
-    file scope declarations for a function in a translation unit include the inline function
-    specifier without extern, then the definition in that translation unit is an inline
-    definition. An inline definition does not provide an external definition for the function,
-    and does not forbid an external definition in another translation unit. An inline definition
-    provides an alternative to an external definition, which a translator may use to implement
-    any call to the function in the same translation unit. It is unspecified whether a call to the
-    function uses the inline definition or the external definition.122)
-7   EXAMPLE The declaration of an inline function with external linkage can result in either an external
-    definition, or a definition available for use only within the translation unit. A file scope declaration with
-    extern creates an external definition. The following example shows an entire translation unit.
-             inline double fahr(double t)
-             {
-                   return (9.0 * t) / 5.0 + 32.0;
-             }
-             inline double cels(double t)
-             {
-                   return (5.0 * (t - 32.0)) / 9.0;
-             }
-             extern double fahr(double);                  // creates an external definition
-             double convert(int is_fahr, double temp)
-             {
-                   /* A translator may perform inline substitutions */
-                   return is_fahr ? cels(temp) : fahr(temp);
-             }
-8   Note that the definition of fahr is an external definition because fahr is also declared with extern, but
-    the definition of cels is an inline definition. Because cels has external linkage and is referenced, an
-    external definition has to appear in another translation unit (see <a href="#6.9">6.9</a>); the inline definition and the external
-    definition are distinct and either may be used for the call.
-
-    Forward references: function definitions (<a href="#6.9.1">6.9.1</a>).
-
-
-    120) By using, for example, an alternative to the usual function call mechanism, such as ''inline
-         substitution''. Inline substitution is not textual substitution, nor does it create a new function.
-         Therefore, for example, the expansion of a macro used within the body of the function uses the
-         definition it had at the point the function body appears, and not where the function is called; and
-         identifiers refer to the declarations in scope where the body occurs. Likewise, the function has a
-         single address, regardless of the number of inline definitions that occur in addition to the external
-         definition.
-    121) For example, an implementation might never perform inline substitution, or might only perform inline
-         substitutions to calls in the scope of an inline declaration.
-    122) Since an inline definition is distinct from the corresponding external definition and from any other
-         corresponding inline definitions in other translation units, all corresponding objects with static storage
-         duration are also distinct in each of the definitions.
-
-[<a name="p113" href="#p113">page 113</a>] (<a href="#Contents">Contents</a>)
-
-<a name="6.7.5" href="#6.7.5"><b>    6.7.5 Declarators</b></a>
-    Syntax
-1            declarator:
-                    pointeropt direct-declarator
-             direct-declarator:
-                     identifier
-                     ( declarator )
-                     direct-declarator [ type-qualifier-listopt assignment-expressionopt ]
-                     direct-declarator [ static type-qualifier-listopt assignment-expression ]
-                     direct-declarator [ type-qualifier-list static assignment-expression ]
-                     direct-declarator [ type-qualifier-listopt * ]
-                     direct-declarator ( parameter-type-list )
-                     direct-declarator ( identifier-listopt )
-             pointer:
-                    * type-qualifier-listopt
-                    * type-qualifier-listopt pointer
-             type-qualifier-list:
-                    type-qualifier
-                    type-qualifier-list type-qualifier
-             parameter-type-list:
-                   parameter-list
-                   parameter-list , ...
-             parameter-list:
-                   parameter-declaration
-                   parameter-list , parameter-declaration
-             parameter-declaration:
-                   declaration-specifiers declarator
-                   declaration-specifiers abstract-declaratoropt
-             identifier-list:
-                     identifier
-                     identifier-list , identifier
-    Semantics
-2   Each declarator declares one identifier, and asserts that when an operand of the same
-    form as the declarator appears in an expression, it designates a function or object with the
-    scope, storage duration, and type indicated by the declaration specifiers.
-3   A full declarator is a declarator that is not part of another declarator. The end of a full
-    declarator is a sequence point. If, in the nested sequence of declarators in a full
-[<a name="p114" href="#p114">page 114</a>] (<a href="#Contents">Contents</a>)
-
-    declarator, there is a declarator specifying a variable length array type, the type specified
-    by the full declarator is said to be variably modified. Furthermore, any type derived by
-    declarator type derivation from a variably modified type is itself variably modified.
-4   In the following subclauses, consider a declaration
-            T D1
-    where T contains the declaration specifiers that specify a type T (such as int) and D1 is
-    a declarator that contains an identifier ident. The type specified for the identifier ident in
-    the various forms of declarator is described inductively using this notation.
-5   If, in the declaration ''T D1'', D1 has the form
-            identifier
-    then the type specified for ident is T .
-6   If, in the declaration ''T D1'', D1 has the form
-            ( D )
-    then ident has the type specified by the declaration ''T D''. Thus, a declarator in
-    parentheses is identical to the unparenthesized declarator, but the binding of complicated
-    declarators may be altered by parentheses.
-    Implementation limits
-7   As discussed in <a href="#5.2.4.1">5.2.4.1</a>, an implementation may limit the number of pointer, array, and
-    function declarators that modify an arithmetic, structure, union, or incomplete type, either
-    directly or via one or more typedefs.
-    Forward references: array declarators (<a href="#6.7.5.2">6.7.5.2</a>), type definitions (<a href="#6.7.7">6.7.7</a>).
-<a name="6.7.5.1" href="#6.7.5.1"><b>    6.7.5.1 Pointer declarators</b></a>
-    Semantics
-1   If, in the declaration ''T D1'', D1 has the form
-            * type-qualifier-listopt D
-    and the type specified for ident in the declaration ''T D'' is ''derived-declarator-type-list
-    T '', then the type specified for ident is ''derived-declarator-type-list type-qualifier-list
-    pointer to T ''. For each type qualifier in the list, ident is a so-qualified pointer.
-2   For two pointer types to be compatible, both shall be identically qualified and both shall
-    be pointers to compatible types.
-3   EXAMPLE The following pair of declarations demonstrates the difference between a ''variable pointer
-    to a constant value'' and a ''constant pointer to a variable value''.
-
-
-
-
-[<a name="p115" href="#p115">page 115</a>] (<a href="#Contents">Contents</a>)
-
-             const int *ptr_to_constant;
-             int *const constant_ptr;
-    The contents of any object pointed to by ptr_to_constant shall not be modified through that pointer,
-    but ptr_to_constant itself may be changed to point to another object. Similarly, the contents of the
-    int pointed to by constant_ptr may be modified, but constant_ptr itself shall always point to the
-    same location.
-4   The declaration of the constant pointer constant_ptr may be clarified by including a definition for the
-    type ''pointer to int''.
-             typedef int *int_ptr;
-             const int_ptr constant_ptr;
-    declares constant_ptr as an object that has type ''const-qualified pointer to int''.
-
-<a name="6.7.5.2" href="#6.7.5.2"><b>    6.7.5.2 Array declarators</b></a>
-    Constraints
-1   In addition to optional type qualifiers and the keyword static, the [ and ] may delimit
-    an expression or *. If they delimit an expression (which specifies the size of an array), the
-    expression shall have an integer type. If the expression is a constant expression, it shall
-    have a value greater than zero. The element type shall not be an incomplete or function
-    type. The optional type qualifiers and the keyword static shall appear only in a
-    declaration of a function parameter with an array type, and then only in the outermost
-    array type derivation.
-2   An ordinary identifier (as defined in <a href="#6.2.3">6.2.3</a>) that has a variably modified type shall have
-    either block scope and no linkage or function prototype scope. If an identifier is declared
-    to be an object with static storage duration, it shall not have a variable length array type.
-    Semantics
-3   If, in the declaration ''T D1'', D1 has one of the forms:
-             D[ type-qualifier-listopt assignment-expressionopt ]
-             D[ static type-qualifier-listopt assignment-expression ]
-             D[ type-qualifier-list static assignment-expression ]
-             D[ type-qualifier-listopt * ]
-    and the type specified for ident in the declaration ''T D'' is ''derived-declarator-type-list
-    T '', then the type specified for ident is ''derived-declarator-type-list array of T ''.123)
-    (See <a href="#6.7.5.3">6.7.5.3</a> for the meaning of the optional type qualifiers and the keyword static.)
-4   If the size is not present, the array type is an incomplete type. If the size is * instead of
-    being an expression, the array type is a variable length array type of unspecified size,
-    which can only be used in declarations with function prototype scope;124) such arrays are
-    nonetheless complete types. If the size is an integer constant expression and the element
-
-    123) When several ''array of'' specifications are adjacent, a multidimensional array is declared.
-
-[<a name="p116" href="#p116">page 116</a>] (<a href="#Contents">Contents</a>)
-
-    type has a known constant size, the array type is not a variable length array type;
-    otherwise, the array type is a variable length array type.
-5   If the size is an expression that is not an integer constant expression: if it occurs in a
-    declaration at function prototype scope, it is treated as if it were replaced by *; otherwise,
-    each time it is evaluated it shall have a value greater than zero. The size of each instance
-    of a variable length array type does not change during its lifetime. Where a size
-    expression is part of the operand of a sizeof operator and changing the value of the
-    size expression would not affect the result of the operator, it is unspecified whether or not
-    the size expression is evaluated.
-6   For two array types to be compatible, both shall have compatible element types, and if
-    both size specifiers are present, and are integer constant expressions, then both size
-    specifiers shall have the same constant value. If the two array types are used in a context
-    which requires them to be compatible, it is undefined behavior if the two size specifiers
-    evaluate to unequal values.
-7   EXAMPLE 1
-             float fa[11], *afp[17];
-    declares an array of float numbers and an array of pointers to float numbers.
-
-8   EXAMPLE 2       Note the distinction between the declarations
-             extern int *x;
-             extern int y[];
-    The first declares x to be a pointer to int; the second declares y to be an array of int of unspecified size
-    (an incomplete type), the storage for which is defined elsewhere.
-
-9   EXAMPLE 3       The following declarations demonstrate the compatibility rules for variably modified types.
-             extern int n;
-             extern int m;
-             void fcompat(void)
-             {
-                   int a[n][6][m];
-                   int (*p)[4][n+1];
-                   int c[n][n][6][m];
-                   int (*r)[n][n][n+1];
-                   p = a;      // invalid: not compatible because 4 != 6
-                   r = c;      // compatible, but defined behavior only if
-                               // n == 6 and m == n+1
-             }
-
-
-
-
-    124) Thus, * can be used only in function declarations that are not definitions (see <a href="#6.7.5.3">6.7.5.3</a>).
-
-[<a name="p117" href="#p117">page 117</a>] (<a href="#Contents">Contents</a>)
-
-10   EXAMPLE 4 All declarations of variably modified (VM) types have to be at either block scope or
-     function prototype scope. Array objects declared with the static or extern storage-class specifier
-     cannot have a variable length array (VLA) type. However, an object declared with the static storage-
-     class specifier can have a VM type (that is, a pointer to a VLA type). Finally, all identifiers declared with a
-     VM type have to be ordinary identifiers and cannot, therefore, be members of structures or unions.
-              extern int n;
-              int A[n];                                             // invalid: file scope VLA
-              extern int (*p2)[n];                                  // invalid: file scope VM
-              int B[100];                                           // valid: file scope but not VM
-              void fvla(int m, int C[m][m]);                        // valid: VLA with prototype scope
-              void fvla(int m, int C[m][m])                         // valid: adjusted to auto pointer to VLA
-              {
-                    typedef int VLA[m][m];                          // valid: block scope typedef VLA
-                       struct tag {
-                             int (*y)[n];                           // invalid: y not ordinary identifier
-                             int z[n];                              // invalid: z not ordinary identifier
-                       };
-                       int D[m];                                    //   valid: auto VLA
-                       static int E[m];                             //   invalid: static block scope VLA
-                       extern int F[m];                             //   invalid: F has linkage and is VLA
-                       int (*s)[m];                                 //   valid: auto pointer to VLA
-                       extern int (*r)[m];                          //   invalid: r has linkage and points to VLA
-                       static int (*q)[m] = &amp;B;                     //   valid: q is a static block pointer to VLA
-              }
-
-     Forward references:            function declarators (<a href="#6.7.5.3">6.7.5.3</a>), function definitions (<a href="#6.9.1">6.9.1</a>),
-     initialization (<a href="#6.7.8">6.7.8</a>).
-<a name="6.7.5.3" href="#6.7.5.3"><b>     6.7.5.3 Function declarators (including prototypes)</b></a>
-     Constraints
-1    A function declarator shall not specify a return type that is a function type or an array
-     type.
-2    The only storage-class specifier that shall occur in a parameter declaration is register.
-3    An identifier list in a function declarator that is not part of a definition of that function
-     shall be empty.
-4    After adjustment, the parameters in a parameter type list in a function declarator that is
-     part of a definition of that function shall not have incomplete type.
-     Semantics
-5    If, in the declaration ''T D1'', D1 has the form
-              D( parameter-type-list )
-     or
-              D( identifier-listopt )
-
-[<a name="p118" href="#p118">page 118</a>] (<a href="#Contents">Contents</a>)
-
-     and the type specified for ident in the declaration ''T D'' is ''derived-declarator-type-list
-     T '', then the type specified for ident is ''derived-declarator-type-list function returning
-     T ''.
-6    A parameter type list specifies the types of, and may declare identifiers for, the
-     parameters of the function.
-7    A declaration of a parameter as ''array of type'' shall be adjusted to ''qualified pointer to
-     type'', where the type qualifiers (if any) are those specified within the [ and ] of the
-     array type derivation. If the keyword static also appears within the [ and ] of the
-     array type derivation, then for each call to the function, the value of the corresponding
-     actual argument shall provide access to the first element of an array with at least as many
-     elements as specified by the size expression.
-8    A declaration of a parameter as ''function returning type'' shall be adjusted to ''pointer to
-     function returning type'', as in <a href="#6.3.2.1">6.3.2.1</a>.
-9    If the list terminates with an ellipsis (, ...), no information about the number or types
-     of the parameters after the comma is supplied.125)
-10   The special case of an unnamed parameter of type void as the only item in the list
-     specifies that the function has no parameters.
-11   If, in a parameter declaration, an identifier can be treated either as a typedef name or as a
-     parameter name, it shall be taken as a typedef name.
-12   If the function declarator is not part of a definition of that function, parameters may have
-     incomplete type and may use the [*] notation in their sequences of declarator specifiers
-     to specify variable length array types.
-13   The storage-class specifier in the declaration specifiers for a parameter declaration, if
-     present, is ignored unless the declared parameter is one of the members of the parameter
-     type list for a function definition.
-14   An identifier list declares only the identifiers of the parameters of the function. An empty
-     list in a function declarator that is part of a definition of that function specifies that the
-     function has no parameters. The empty list in a function declarator that is not part of a
-     definition of that function specifies that no information about the number or types of the
-     parameters is supplied.126)
-15   For two function types to be compatible, both shall specify compatible return types.127)
-
-
-     125) The macros defined in the <a href="#7.15">&lt;stdarg.h&gt;</a> header (<a href="#7.15">7.15</a>) may be used to access arguments that
-          correspond to the ellipsis.
-     126) See ''future language directions'' (<a href="#6.11.6">6.11.6</a>).
-     127) If both function types are ''old style'', parameter types are not compared.
-
-[<a name="p119" href="#p119">page 119</a>] (<a href="#Contents">Contents</a>)
-
-     Moreover, the parameter type lists, if both are present, shall agree in the number of
-     parameters and in use of the ellipsis terminator; corresponding parameters shall have
-     compatible types. If one type has a parameter type list and the other type is specified by a
-     function declarator that is not part of a function definition and that contains an empty
-     identifier list, the parameter list shall not have an ellipsis terminator and the type of each
-     parameter shall be compatible with the type that results from the application of the
-     default argument promotions. If one type has a parameter type list and the other type is
-     specified by a function definition that contains a (possibly empty) identifier list, both shall
-     agree in the number of parameters, and the type of each prototype parameter shall be
-     compatible with the type that results from the application of the default argument
-     promotions to the type of the corresponding identifier. (In the determination of type
-     compatibility and of a composite type, each parameter declared with function or array
-     type is taken as having the adjusted type and each parameter declared with qualified type
-     is taken as having the unqualified version of its declared type.)
-16   EXAMPLE 1       The declaration
-              int f(void), *fip(), (*pfi)();
-     declares a function f with no parameters returning an int, a function fip with no parameter specification
-     returning a pointer to an int, and a pointer pfi to a function with no parameter specification returning an
-     int. It is especially useful to compare the last two. The binding of *fip() is *(fip()), so that the
-     declaration suggests, and the same construction in an expression requires, the calling of a function fip,
-     and then using indirection through the pointer result to yield an int. In the declarator (*pfi)(), the
-     extra parentheses are necessary to indicate that indirection through a pointer to a function yields a function
-     designator, which is then used to call the function; it returns an int.
-17   If the declaration occurs outside of any function, the identifiers have file scope and external linkage. If the
-     declaration occurs inside a function, the identifiers of the functions f and fip have block scope and either
-     internal or external linkage (depending on what file scope declarations for these identifiers are visible), and
-     the identifier of the pointer pfi has block scope and no linkage.
-
-18   EXAMPLE 2       The declaration
-              int (*apfi[3])(int *x, int *y);
-     declares an array apfi of three pointers to functions returning int. Each of these functions has two
-     parameters that are pointers to int. The identifiers x and y are declared for descriptive purposes only and
-     go out of scope at the end of the declaration of apfi.
-
-19   EXAMPLE 3       The declaration
-              int (*fpfi(int (*)(long), int))(int, ...);
-     declares a function fpfi that returns a pointer to a function returning an int. The function fpfi has two
-     parameters: a pointer to a function returning an int (with one parameter of type long int), and an int.
-     The pointer returned by fpfi points to a function that has one int parameter and accepts zero or more
-     additional arguments of any type.
-
-
-
-
-[<a name="p120" href="#p120">page 120</a>] (<a href="#Contents">Contents</a>)
-
-20   EXAMPLE 4        The following prototype has a variably modified parameter.
-               void addscalar(int n, int m,
-                     double a[n][n*m+300], double x);
-               int main()
-               {
-                     double b[4][308];
-                     addscalar(4, 2, b, <a href="#2.17">2.17</a>);
-                     return 0;
-               }
-               void addscalar(int n, int m,
-                     double a[n][n*m+300], double x)
-               {
-                     for (int i = 0; i &lt; n; i++)
-                           for (int j = 0, k = n*m+300; j &lt; k; j++)
-                                 // a is a pointer to a VLA with n*m+300 elements
-                                 a[i][j] += x;
-               }
-
-21   EXAMPLE 5        The following are all compatible function prototype declarators.
-               double    maximum(int       n,   int   m,   double   a[n][m]);
-               double    maximum(int       n,   int   m,   double   a[*][*]);
-               double    maximum(int       n,   int   m,   double   a[ ][*]);
-               double    maximum(int       n,   int   m,   double   a[ ][m]);
-     as are:
-               void   f(double     (* restrict a)[5]);
-               void   f(double     a[restrict][5]);
-               void   f(double     a[restrict 3][5]);
-               void   f(double     a[restrict static 3][5]);
-     (Note that the last declaration also specifies that the argument corresponding to a in any call to f must be a
-     non-null pointer to the first of at least three arrays of 5 doubles, which the others do not.)
-
-     Forward references: function definitions (<a href="#6.9.1">6.9.1</a>), type names (<a href="#6.7.6">6.7.6</a>).
-
-
-
-
-[<a name="p121" href="#p121">page 121</a>] (<a href="#Contents">Contents</a>)
-
-<a name="6.7.6" href="#6.7.6"><b>    6.7.6 Type names</b></a>
-    Syntax
-1            type-name:
-                    specifier-qualifier-list abstract-declaratoropt
-             abstract-declarator:
-                    pointer
-                    pointeropt direct-abstract-declarator
-             direct-abstract-declarator:
-                     ( abstract-declarator )
-                     direct-abstract-declaratoropt [ type-qualifier-listopt
-                                    assignment-expressionopt ]
-                     direct-abstract-declaratoropt [ static type-qualifier-listopt
-                                    assignment-expression ]
-                     direct-abstract-declaratoropt [ type-qualifier-list static
-                                    assignment-expression ]
-                     direct-abstract-declaratoropt [ * ]
-                     direct-abstract-declaratoropt ( parameter-type-listopt )
-    Semantics
-2   In several contexts, it is necessary to specify a type. This is accomplished using a type
-    name, which is syntactically a declaration for a function or an object of that type that
-    omits the identifier.128)
-3   EXAMPLE        The constructions
-             (a)      int
-             (b)      int   *
-             (c)      int   *[3]
-             (d)      int   (*)[3]
-             (e)      int   (*)[*]
-             (f)      int   *()
-             (g)      int   (*)(void)
-             (h)      int   (*const [])(unsigned int, ...)
-    name respectively the types (a) int, (b) pointer to int, (c) array of three pointers to int, (d) pointer to an
-    array of three ints, (e) pointer to a variable length array of an unspecified number of ints, (f) function
-    with no parameter specification returning a pointer to int, (g) pointer to function with no parameters
-    returning an int, and (h) array of an unspecified number of constant pointers to functions, each with one
-    parameter that has type unsigned int and an unspecified number of other parameters, returning an
-    int.
-
-
-
-
-    128) As indicated by the syntax, empty parentheses in a type name are interpreted as ''function with no
-         parameter specification'', rather than redundant parentheses around the omitted identifier.
-
-[<a name="p122" href="#p122">page 122</a>] (<a href="#Contents">Contents</a>)
-
-<a name="6.7.7" href="#6.7.7"><b>    6.7.7 Type definitions</b></a>
-    Syntax
-1            typedef-name:
-                    identifier
-    Constraints
-2   If a typedef name specifies a variably modified type then it shall have block scope.
-    Semantics
-3   In a declaration whose storage-class specifier is typedef, each declarator defines an
-    identifier to be a typedef name that denotes the type specified for the identifier in the way
-    described in <a href="#6.7.5">6.7.5</a>. Any array size expressions associated with variable length array
-    declarators are evaluated each time the declaration of the typedef name is reached in the
-    order of execution. A typedef declaration does not introduce a new type, only a
-    synonym for the type so specified. That is, in the following declarations:
-             typedef T type_ident;
-             type_ident D;
-    type_ident is defined as a typedef name with the type specified by the declaration
-    specifiers in T (known as T ), and the identifier in D has the type ''derived-declarator-
-    type-list T '' where the derived-declarator-type-list is specified by the declarators of D. A
-    typedef name shares the same name space as other identifiers declared in ordinary
-    declarators.
-4   EXAMPLE 1       After
-             typedef int MILES, KLICKSP();
-             typedef struct { double hi, lo; } range;
-    the constructions
-             MILES distance;
-             extern KLICKSP *metricp;
-             range x;
-             range z, *zp;
-    are all valid declarations. The type of distance is int, that of metricp is ''pointer to function with no
-    parameter specification returning int'', and that of x and z is the specified structure; zp is a pointer to
-    such a structure. The object distance has a type compatible with any other int object.
-
-5   EXAMPLE 2       After the declarations
-             typedef struct s1 { int x; } t1, *tp1;
-             typedef struct s2 { int x; } t2, *tp2;
-    type t1 and the type pointed to by tp1 are compatible. Type t1 is also compatible with type struct
-    s1, but not compatible with the types struct s2, t2, the type pointed to by tp2, or int.
-
-
-
-
-[<a name="p123" href="#p123">page 123</a>] (<a href="#Contents">Contents</a>)
-
-6   EXAMPLE 3       The following obscure constructions
-            typedef signed int t;
-            typedef int plain;
-            struct tag {
-                  unsigned t:4;
-                  const t:5;
-                  plain r:5;
-            };
-    declare a typedef name t with type signed int, a typedef name plain with type int, and a structure
-    with three bit-field members, one named t that contains values in the range [0, 15], an unnamed const-
-    qualified bit-field which (if it could be accessed) would contain values in either the range [-15, +15] or
-    [-16, +15], and one named r that contains values in one of the ranges [0, 31], [-15, +15], or [-16, +15].
-    (The choice of range is implementation-defined.) The first two bit-field declarations differ in that
-    unsigned is a type specifier (which forces t to be the name of a structure member), while const is a
-    type qualifier (which modifies t which is still visible as a typedef name). If these declarations are followed
-    in an inner scope by
-            t f(t (t));
-            long t;
-    then a function f is declared with type ''function returning signed int with one unnamed parameter
-    with type pointer to function returning signed int with one unnamed parameter with type signed
-    int'', and an identifier t with type long int.
-
-7   EXAMPLE 4 On the other hand, typedef names can be used to improve code readability. All three of the
-    following declarations of the signal function specify exactly the same type, the first without making use
-    of any typedef names.
-            typedef void fv(int), (*pfv)(int);
-            void (*signal(int, void (*)(int)))(int);
-            fv *signal(int, fv *);
-            pfv signal(int, pfv);
-
-8   EXAMPLE 5 If a typedef name denotes a variable length array type, the length of the array is fixed at the
-    time the typedef name is defined, not each time it is used:
-            void copyt(int n)
-            {
-                  typedef int B[n];    //               B is n ints, n evaluated now
-                  n += 1;
-                  B a;                //                a is n ints, n without += 1
-                  int b[n];           //                a and b are different sizes
-                  for (int i = 1; i &lt; n;                i++)
-                        a[i-1] = b[i];
-            }
-
-
-
-
-[<a name="p124" href="#p124">page 124</a>] (<a href="#Contents">Contents</a>)
-
-<a name="6.7.8" href="#6.7.8"><b>    6.7.8 Initialization</b></a>
-    Syntax
-1            initializer:
-                      assignment-expression
-                      { initializer-list }
-                      { initializer-list , }
-             initializer-list:
-                      designationopt initializer
-                      initializer-list , designationopt initializer
-             designation:
-                    designator-list =
-             designator-list:
-                    designator
-                    designator-list designator
-             designator:
-                    [ constant-expression ]
-                    . identifier
-    Constraints
-2   No initializer shall attempt to provide a value for an object not contained within the entity
-    being initialized.
-3   The type of the entity to be initialized shall be an array of unknown size or an object type
-    that is not a variable length array type.
-4   All the expressions in an initializer for an object that has static storage duration shall be
-    constant expressions or string literals.
-5   If the declaration of an identifier has block scope, and the identifier has external or
-    internal linkage, the declaration shall have no initializer for the identifier.
-6   If a designator has the form
-             [ constant-expression ]
-    then the current object (defined below) shall have array type and the expression shall be
-    an integer constant expression. If the array is of unknown size, any nonnegative value is
-    valid.
-7   If a designator has the form
-             . identifier
-    then the current object (defined below) shall have structure or union type and the
-    identifier shall be the name of a member of that type.
-[<a name="p125" href="#p125">page 125</a>] (<a href="#Contents">Contents</a>)
-
-     Semantics
-8    An initializer specifies the initial value stored in an object.
-9    Except where explicitly stated otherwise, for the purposes of this subclause unnamed
-     members of objects of structure and union type do not participate in initialization.
-     Unnamed members of structure objects have indeterminate value even after initialization.
-10   If an object that has automatic storage duration is not initialized explicitly, its value is
-     indeterminate. If an object that has static storage duration is not initialized explicitly,
-     then:
-     -- if it has pointer type, it is initialized to a null pointer;
-     -- if it has arithmetic type, it is initialized to (positive or unsigned) zero;
-     -- if it is an aggregate, every member is initialized (recursively) according to these rules;
-     -- if it is a union, the first named member is initialized (recursively) according to these
-       rules.
-11   The initializer for a scalar shall be a single expression, optionally enclosed in braces. The
-     initial value of the object is that of the expression (after conversion); the same type
-     constraints and conversions as for simple assignment apply, taking the type of the scalar
-     to be the unqualified version of its declared type.
-12   The rest of this subclause deals with initializers for objects that have aggregate or union
-     type.
-13   The initializer for a structure or union object that has automatic storage duration shall be
-     either an initializer list as described below, or a single expression that has compatible
-     structure or union type. In the latter case, the initial value of the object, including
-     unnamed members, is that of the expression.
-14   An array of character type may be initialized by a character string literal, optionally
-     enclosed in braces. Successive characters of the character string literal (including the
-     terminating null character if there is room or if the array is of unknown size) initialize the
-     elements of the array.
-15   An array with element type compatible with wchar_t may be initialized by a wide
-     string literal, optionally enclosed in braces. Successive wide characters of the wide string
-     literal (including the terminating null wide character if there is room or if the array is of
-     unknown size) initialize the elements of the array.
-16   Otherwise, the initializer for an object that has aggregate or union type shall be a brace-
-     enclosed list of initializers for the elements or named members.
-17   Each brace-enclosed initializer list has an associated current object. When no
-     designations are present, subobjects of the current object are initialized in order according
-     to the type of the current object: array elements in increasing subscript order, structure
-[<a name="p126" href="#p126">page 126</a>] (<a href="#Contents">Contents</a>)
-
-     members in declaration order, and the first named member of a union.129) In contrast, a
-     designation causes the following initializer to begin initialization of the subobject
-     described by the designator. Initialization then continues forward in order, beginning
-     with the next subobject after that described by the designator.130)
-18   Each designator list begins its description with the current object associated with the
-     closest surrounding brace pair. Each item in the designator list (in order) specifies a
-     particular member of its current object and changes the current object for the next
-     designator (if any) to be that member.131) The current object that results at the end of the
-     designator list is the subobject to be initialized by the following initializer.
-19   The initialization shall occur in initializer list order, each initializer provided for a
-     particular subobject overriding any previously listed initializer for the same subobject;132)
-     all subobjects that are not initialized explicitly shall be initialized implicitly the same as
-     objects that have static storage duration.
-20   If the aggregate or union contains elements or members that are aggregates or unions,
-     these rules apply recursively to the subaggregates or contained unions. If the initializer of
-     a subaggregate or contained union begins with a left brace, the initializers enclosed by
-     that brace and its matching right brace initialize the elements or members of the
-     subaggregate or the contained union. Otherwise, only enough initializers from the list are
-     taken to account for the elements or members of the subaggregate or the first member of
-     the contained union; any remaining initializers are left to initialize the next element or
-     member of the aggregate of which the current subaggregate or contained union is a part.
-21   If there are fewer initializers in a brace-enclosed list than there are elements or members
-     of an aggregate, or fewer characters in a string literal used to initialize an array of known
-     size than there are elements in the array, the remainder of the aggregate shall be
-     initialized implicitly the same as objects that have static storage duration.
-22   If an array of unknown size is initialized, its size is determined by the largest indexed
-     element with an explicit initializer. At the end of its initializer list, the array no longer
-     has incomplete type.
-
-
-
-     129) If the initializer list for a subaggregate or contained union does not begin with a left brace, its
-          subobjects are initialized as usual, but the subaggregate or contained union does not become the
-          current object: current objects are associated only with brace-enclosed initializer lists.
-     130) After a union member is initialized, the next object is not the next member of the union; instead, it is
-          the next subobject of an object containing the union.
-     131) Thus, a designator can only specify a strict subobject of the aggregate or union that is associated with
-          the surrounding brace pair. Note, too, that each separate designator list is independent.
-     132) Any initializer for the subobject which is overridden and so not used to initialize that subobject might
-          not be evaluated at all.
-
-[<a name="p127" href="#p127">page 127</a>] (<a href="#Contents">Contents</a>)
-
-23   The order in which any side effects occur among the initialization list expressions is
-     unspecified.133)
-24   EXAMPLE 1       Provided that <a href="#7.3">&lt;complex.h&gt;</a> has been #included, the declarations
-              int i = <a href="#3.5">3.5</a>;
-              double complex c = 5 + 3 * I;
-     define and initialize i with the value 3 and c with the value 5.0 + i3.0.
-
-25   EXAMPLE 2 The declaration
-              int x[] = { 1, 3, 5 };
-     defines and initializes x as a one-dimensional array object that has three elements, as no size was specified
-     and there are three initializers.
-
-26   EXAMPLE 3       The declaration
-              int y[4][3] =         {
-                    { 1, 3,         5 },
-                    { 2, 4,         6 },
-                    { 3, 5,         7 },
-              };
-     is a definition with a fully bracketed initialization: 1, 3, and 5 initialize the first row of y (the array object
-     y[0]), namely y[0][0], y[0][1], and y[0][2]. Likewise the next two lines initialize y[1] and
-     y[2]. The initializer ends early, so y[3] is initialized with zeros. Precisely the same effect could have
-     been achieved by
-              int y[4][3] = {
-                    1, 3, 5, 2, 4, 6, 3, 5, 7
-              };
-     The initializer for y[0] does not begin with a left brace, so three items from the list are used. Likewise the
-     next three are taken successively for y[1] and y[2].
-
-27   EXAMPLE 4       The declaration
-              int z[4][3] = {
-                    { 1 }, { 2 }, { 3 }, { 4 }
-              };
-     initializes the first column of z as specified and initializes the rest with zeros.
-
-28   EXAMPLE 5       The declaration
-              struct { int a[3], b; } w[] = { { 1 }, 2 };
-     is a definition with an inconsistently bracketed initialization. It defines an array with two element
-     structures: w[0].a[0] is 1 and w[1].a[0] is 2; all the other elements are zero.
-
-
-
-
-     133) In particular, the evaluation order need not be the same as the order of subobject initialization.
-
-[<a name="p128" href="#p128">page 128</a>] (<a href="#Contents">Contents</a>)
-
-29   EXAMPLE 6         The declaration
-               short q[4][3][2] = {
-                     { 1 },
-                     { 2, 3 },
-                     { 4, 5, 6 }
-               };
-     contains an incompletely but consistently bracketed initialization. It defines a three-dimensional array
-     object: q[0][0][0] is 1, q[1][0][0] is 2, q[1][0][1] is 3, and 4, 5, and 6 initialize
-     q[2][0][0], q[2][0][1], and q[2][1][0], respectively; all the rest are zero. The initializer for
-     q[0][0] does not begin with a left brace, so up to six items from the current list may be used. There is
-     only one, so the values for the remaining five elements are initialized with zero. Likewise, the initializers
-     for q[1][0] and q[2][0] do not begin with a left brace, so each uses up to six items, initializing their
-     respective two-dimensional subaggregates. If there had been more than six items in any of the lists, a
-     diagnostic message would have been issued. The same initialization result could have been achieved by:
-               short q[4][3][2] = {
-                     1, 0, 0, 0, 0, 0,
-                     2, 3, 0, 0, 0, 0,
-                     4, 5, 6
-               };
-     or by:
-               short q[4][3][2] = {
-                     {
-                           { 1 },
-                     },
-                     {
-                           { 2, 3 },
-                     },
-                     {
-                           { 4, 5 },
-                           { 6 },
-                     }
-               };
-     in a fully bracketed form.
-30   Note that the fully bracketed and minimally bracketed forms of initialization are, in general, less likely to
-     cause confusion.
-
-31   EXAMPLE 7         One form of initialization that completes array types involves typedef names. Given the
-     declaration
-               typedef int A[];          // OK - declared with block scope
-     the declaration
-               A a = { 1, 2 }, b = { 3, 4, 5 };
-     is identical to
-               int a[] = { 1, 2 }, b[] = { 3, 4, 5 };
-     due to the rules for incomplete types.
-
-
-
-[<a name="p129" href="#p129">page 129</a>] (<a href="#Contents">Contents</a>)
-
-32   EXAMPLE 8       The declaration
-              char s[] = "abc", t[3] = "abc";
-     defines ''plain'' char array objects s and t whose elements are initialized with character string literals.
-     This declaration is identical to
-              char s[] = { 'a', 'b', 'c', '\0' },
-                   t[] = { 'a', 'b', 'c' };
-     The contents of the arrays are modifiable. On the other hand, the declaration
-              char *p = "abc";
-     defines p with type ''pointer to char'' and initializes it to point to an object with type ''array of char''
-     with length 4 whose elements are initialized with a character string literal. If an attempt is made to use p to
-     modify the contents of the array, the behavior is undefined.
-
-33   EXAMPLE 9       Arrays can be initialized to correspond to the elements of an enumeration by using
-     designators:
-              enum { member_one,           member_two };
-              const char *nm[] =           {
-                    [member_two]           = "member two",
-                    [member_one]           = "member one",
-              };
-
-34   EXAMPLE 10       Structure members can be initialized to nonzero values without depending on their order:
-              div_t answer = { .quot = 2, .rem = -1 };
-
-35   EXAMPLE 11 Designators can be used to provide explicit initialization when unadorned initializer lists
-     might be misunderstood:
-              struct { int a[3], b; } w[] =
-                    { [0].a = {1}, [1].a[0] = 2 };
-
-36   EXAMPLE 12       Space can be ''allocated'' from both ends of an array by using a single designator:
-              int a[MAX] = {
-                    1, 3, 5, 7, 9, [MAX-5] = 8, 6, 4, 2, 0
-              };
-37   In the above, if MAX is greater than ten, there will be some zero-valued elements in the middle; if it is less
-     than ten, some of the values provided by the first five initializers will be overridden by the second five.
-
-38   EXAMPLE 13       Any member of a union can be initialized:
-              union { /* ... */ } u = { .any_member = 42 };
-
-     Forward references: common definitions <a href="#7.17">&lt;stddef.h&gt;</a> (<a href="#7.17">7.17</a>).
-
-
-
-
-[<a name="p130" href="#p130">page 130</a>] (<a href="#Contents">Contents</a>)
-
-<a name="6.8" href="#6.8"><b>    6.8 Statements and blocks</b></a>
-    Syntax
-1            statement:
-                    labeled-statement
-                    compound-statement
-                    expression-statement
-                    selection-statement
-                    iteration-statement
-                    jump-statement
-    Semantics
-2   A statement specifies an action to be performed. Except as indicated, statements are
-    executed in sequence.
-3   A block allows a set of declarations and statements to be grouped into one syntactic unit.
-    The initializers of objects that have automatic storage duration, and the variable length
-    array declarators of ordinary identifiers with block scope, are evaluated and the values are
-    stored in the objects (including storing an indeterminate value in objects without an
-    initializer) each time the declaration is reached in the order of execution, as if it were a
-    statement, and within each declaration in the order that declarators appear.
-4   A full expression is an expression that is not part of another expression or of a declarator.
-    Each of the following is a full expression: an initializer; the expression in an expression
-    statement; the controlling expression of a selection statement (if or switch); the
-    controlling expression of a while or do statement; each of the (optional) expressions of
-    a for statement; the (optional) expression in a return statement. The end of a full
-    expression is a sequence point.
-    Forward references: expression and null statements (<a href="#6.8.3">6.8.3</a>), selection statements
-    (<a href="#6.8.4">6.8.4</a>), iteration statements (<a href="#6.8.5">6.8.5</a>), the return statement (<a href="#6.8.6.4">6.8.6.4</a>).
-<a name="6.8.1" href="#6.8.1"><b>    6.8.1 Labeled statements</b></a>
-    Syntax
-1            labeled-statement:
-                    identifier : statement
-                    case constant-expression : statement
-                    default : statement
-    Constraints
-2   A case or default label shall appear only in a switch statement. Further
-    constraints on such labels are discussed under the switch statement.
-
-
-[<a name="p131" href="#p131">page 131</a>] (<a href="#Contents">Contents</a>)
-
-3   Label names shall be unique within a function.
-    Semantics
-4   Any statement may be preceded by a prefix that declares an identifier as a label name.
-    Labels in themselves do not alter the flow of control, which continues unimpeded across
-    them.
-    Forward references: the goto statement (<a href="#6.8.6.1">6.8.6.1</a>), the switch statement (<a href="#6.8.4.2">6.8.4.2</a>).
-<a name="6.8.2" href="#6.8.2"><b>    6.8.2 Compound statement</b></a>
-    Syntax
-1            compound-statement:
-                   { block-item-listopt }
-             block-item-list:
-                     block-item
-                     block-item-list block-item
-             block-item:
-                     declaration
-                     statement
-    Semantics
-2   A compound statement is a block.
-<a name="6.8.3" href="#6.8.3"><b>    6.8.3 Expression and null statements</b></a>
-    Syntax
-1            expression-statement:
-                    expressionopt ;
-    Semantics
-2   The expression in an expression statement is evaluated as a void expression for its side
-    effects.134)
-3   A null statement (consisting of just a semicolon) performs no operations.
-4   EXAMPLE 1 If a function call is evaluated as an expression statement for its side effects only, the
-    discarding of its value may be made explicit by converting the expression to a void expression by means of
-    a cast:
-             int p(int);
-             /* ... */
-             (void)p(0);
-
-
-
-    134) Such as assignments, and function calls which have side effects.
-
-[<a name="p132" href="#p132">page 132</a>] (<a href="#Contents">Contents</a>)
-
-5   EXAMPLE 2       In the program fragment
-             char *s;
-             /* ... */
-             while (*s++ != '\0')
-                     ;
-    a null statement is used to supply an empty loop body to the iteration statement.
-
-6   EXAMPLE 3       A null statement may also be used to carry a label just before the closing } of a compound
-    statement.
-             while (loop1) {
-                   /* ... */
-                   while (loop2) {
-                           /* ... */
-                           if (want_out)
-                                   goto end_loop1;
-                           /* ... */
-                   }
-                   /* ... */
-             end_loop1: ;
-             }
-
-    Forward references: iteration statements (<a href="#6.8.5">6.8.5</a>).
-<a name="6.8.4" href="#6.8.4"><b>    6.8.4 Selection statements</b></a>
-    Syntax
-1            selection-statement:
-                     if ( expression ) statement
-                     if ( expression ) statement else statement
-                     switch ( expression ) statement
-    Semantics
-2   A selection statement selects among a set of statements depending on the value of a
-    controlling expression.
-3   A selection statement is a block whose scope is a strict subset of the scope of its
-    enclosing block. Each associated substatement is also a block whose scope is a strict
-    subset of the scope of the selection statement.
-<a name="6.8.4.1" href="#6.8.4.1"><b>    6.8.4.1 The if statement</b></a>
-    Constraints
-1   The controlling expression of an if statement shall have scalar type.
-    Semantics
-2   In both forms, the first substatement is executed if the expression compares unequal to 0.
-    In the else form, the second substatement is executed if the expression compares equal
-
-[<a name="p133" href="#p133">page 133</a>] (<a href="#Contents">Contents</a>)
-
-    to 0. If the first substatement is reached via a label, the second substatement is not
-    executed.
-3   An else is associated with the lexically nearest preceding if that is allowed by the
-    syntax.
-<a name="6.8.4.2" href="#6.8.4.2"><b>    6.8.4.2 The switch statement</b></a>
-    Constraints
-1   The controlling expression of a switch statement shall have integer type.
-2   If a switch statement has an associated case or default label within the scope of an
-    identifier with a variably modified type, the entire switch statement shall be within the
-    scope of that identifier.135)
-3   The expression of each case label shall be an integer constant expression and no two of
-    the case constant expressions in the same switch statement shall have the same value
-    after conversion. There may be at most one default label in a switch statement.
-    (Any enclosed switch statement may have a default label or case constant
-    expressions with values that duplicate case constant expressions in the enclosing
-    switch statement.)
-    Semantics
-4   A switch statement causes control to jump to, into, or past the statement that is the
-    switch body, depending on the value of a controlling expression, and on the presence of a
-    default label and the values of any case labels on or in the switch body. A case or
-    default label is accessible only within the closest enclosing switch statement.
-5   The integer promotions are performed on the controlling expression. The constant
-    expression in each case label is converted to the promoted type of the controlling
-    expression. If a converted value matches that of the promoted controlling expression,
-    control jumps to the statement following the matched case label. Otherwise, if there is
-    a default label, control jumps to the labeled statement. If no converted case constant
-    expression matches and there is no default label, no part of the switch body is
-    executed.
-    Implementation limits
-6   As discussed in <a href="#5.2.4.1">5.2.4.1</a>, the implementation may limit the number of case values in a
-    switch statement.
-
-
-
-
-    135) That is, the declaration either precedes the switch statement, or it follows the last case or
-         default label associated with the switch that is in the block containing the declaration.
-
-[<a name="p134" href="#p134">page 134</a>] (<a href="#Contents">Contents</a>)
-
-7   EXAMPLE        In the artificial program fragment
-             switch (expr)
-             {
-                   int i = 4;
-                   f(i);
-             case 0:
-                   i = 17;
-                   /* falls through into default code */
-             default:
-                   printf("%d\n", i);
-             }
-    the object whose identifier is i exists with automatic storage duration (within the block) but is never
-    initialized, and thus if the controlling expression has a nonzero value, the call to the printf function will
-    access an indeterminate value. Similarly, the call to the function f cannot be reached.
-
-<a name="6.8.5" href="#6.8.5"><b>    6.8.5 Iteration statements</b></a>
-    Syntax
-1            iteration-statement:
-                     while ( expression ) statement
-                     do statement while ( expression ) ;
-                     for ( expressionopt ; expressionopt ; expressionopt ) statement
-                     for ( declaration expressionopt ; expressionopt ) statement
-    Constraints
-2   The controlling expression of an iteration statement shall have scalar type.
-3   The declaration part of a for statement shall only declare identifiers for objects having
-    storage class auto or register.
-    Semantics
-4   An iteration statement causes a statement called the loop body to be executed repeatedly
-    until the controlling expression compares equal to 0. The repetition occurs regardless of
-    whether the loop body is entered from the iteration statement or by a jump.136)
-5   An iteration statement is a block whose scope is a strict subset of the scope of its
-    enclosing block. The loop body is also a block whose scope is a strict subset of the scope
-    of the iteration statement.
-
-
-
-
-    136) Code jumped over is not executed. In particular, the controlling expression of a for or while
-         statement is not evaluated before entering the loop body, nor is clause-1 of a for statement.
-
-[<a name="p135" href="#p135">page 135</a>] (<a href="#Contents">Contents</a>)
-
-<a name="6.8.5.1" href="#6.8.5.1"><b>    6.8.5.1 The while statement</b></a>
-1   The evaluation of the controlling expression takes place before each execution of the loop
-    body.
-<a name="6.8.5.2" href="#6.8.5.2"><b>    6.8.5.2 The do statement</b></a>
-1   The evaluation of the controlling expression takes place after each execution of the loop
-    body.
-<a name="6.8.5.3" href="#6.8.5.3"><b>    6.8.5.3 The for statement</b></a>
-1   The statement
-             for ( clause-1 ; expression-2 ; expression-3 ) statement
-    behaves as follows: The expression expression-2 is the controlling expression that is
-    evaluated before each execution of the loop body. The expression expression-3 is
-    evaluated as a void expression after each execution of the loop body. If clause-1 is a
-    declaration, the scope of any identifiers it declares is the remainder of the declaration and
-    the entire loop, including the other two expressions; it is reached in the order of execution
-    before the first evaluation of the controlling expression. If clause-1 is an expression, it is
-    evaluated as a void expression before the first evaluation of the controlling expression.137)
-2   Both clause-1 and expression-3 can be omitted. An omitted expression-2 is replaced by a
-    nonzero constant.
-<a name="6.8.6" href="#6.8.6"><b>    6.8.6 Jump statements</b></a>
-    Syntax
-1            jump-statement:
-                    goto identifier ;
-                    continue ;
-                    break ;
-                    return expressionopt ;
-    Semantics
-2   A jump statement causes an unconditional jump to another place.
-
-
-
-
-    137) Thus, clause-1 specifies initialization for the loop, possibly declaring one or more variables for use in
-         the loop; the controlling expression, expression-2, specifies an evaluation made before each iteration,
-         such that execution of the loop continues until the expression compares equal to 0; and expression-3
-         specifies an operation (such as incrementing) that is performed after each iteration.
-
-[<a name="p136" href="#p136">page 136</a>] (<a href="#Contents">Contents</a>)
-
-<a name="6.8.6.1" href="#6.8.6.1"><b>    6.8.6.1 The goto statement</b></a>
-    Constraints
-1   The identifier in a goto statement shall name a label located somewhere in the enclosing
-    function. A goto statement shall not jump from outside the scope of an identifier having
-    a variably modified type to inside the scope of that identifier.
-    Semantics
-2   A goto statement causes an unconditional jump to the statement prefixed by the named
-    label in the enclosing function.
-3   EXAMPLE 1 It is sometimes convenient to jump into the middle of a complicated set of statements. The
-    following outline presents one possible approach to a problem based on these three assumptions:
-      1.   The general initialization code accesses objects only visible to the current function.
-      2.   The general initialization code is too large to warrant duplication.
-      3.   The code to determine the next operation is at the head of the loop. (To allow it to be reached by
-           continue statements, for example.)
+            fesetround(FE_UPWARD);
             /* ... */
-            goto first_time;
-            for (;;) {
-                    // determine next operation
-                    /* ... */
-                    if (need to reinitialize) {
-                            // reinitialize-only code
-                            /* ... */
-                    first_time:
-                            // general initialization code
-                            /* ... */
-                            continue;
-                    }
-                    // handle other operations
-                    /* ... */
-            }
-
-
-
-
-[<a name="p137" href="#p137">page 137</a>] (<a href="#Contents">Contents</a>)
-
-4   EXAMPLE 2 A goto statement is not allowed to jump past any declarations of objects with variably
-    modified types. A jump within the scope, however, is permitted.
-            goto lab3;                         // invalid: going INTO scope of VLA.
-            {
-                  double a[n];
-                  a[j] = <a href="#4.4">4.4</a>;
-            lab3:
-                  a[j] = <a href="#3.3">3.3</a>;
-                  goto lab4;                   // valid: going WITHIN scope of VLA.
-                  a[j] = <a href="#5.5">5.5</a>;
-            lab4:
-                  a[j] = <a href="#6.6">6.6</a>;
-            }
-            goto lab4;                         // invalid: going INTO scope of VLA.
-
-<a name="6.8.6.2" href="#6.8.6.2"><b>    6.8.6.2 The continue statement</b></a>
-    Constraints
-1   A continue statement shall appear only in or as a loop body.
-    Semantics
-2   A continue statement causes a jump to the loop-continuation portion of the smallest
-    enclosing iteration statement; that is, to the end of the loop body. More precisely, in each
-    of the statements
-    while (/* ... */) {                  do {                                 for (/* ... */) {
-       /* ... */                            /* ... */                            /* ... */
-       continue;                            continue;                            continue;
-       /* ... */                            /* ... */                            /* ... */
-    contin: ;                            contin: ;                            contin: ;
-    }                                    } while (/* ... */);                 }
-    unless the continue statement shown is in an enclosed iteration statement (in which
-    case it is interpreted within that statement), it is equivalent to goto contin;.138)
-<a name="6.8.6.3" href="#6.8.6.3"><b>    6.8.6.3 The break statement</b></a>
-    Constraints
-1   A break statement shall appear only in or as a switch body or loop body.
-    Semantics
-2   A break statement terminates execution of the smallest enclosing switch or iteration
-    statement.
-
-
-
-    138) Following the contin: label is a null statement.
-
-[<a name="p138" href="#p138">page 138</a>] (<a href="#Contents">Contents</a>)
-
-<a name="6.8.6.4" href="#6.8.6.4"><b>    6.8.6.4 The return statement</b></a>
-    Constraints
-1   A return statement with an expression shall not appear in a function whose return type
-    is void. A return statement without an expression shall only appear in a function
-    whose return type is void.
-    Semantics
-2   A return statement terminates execution of the current function and returns control to
-    its caller. A function may have any number of return statements.
-3   If a return statement with an expression is executed, the value of the expression is
-    returned to the caller as the value of the function call expression. If the expression has a
-    type different from the return type of the function in which it appears, the value is
-    converted as if by assignment to an object having the return type of the function.139)
-4   EXAMPLE       In:
-            struct s { double i; } f(void);
-            union {
+         #endif
+</pre>
+</small>
+<p><small><a name="note3" href="#note3">3)</a> This implies that a conforming implementation reserves no identifiers other than those explicitly
+ reserved in this International Standard.
+</small>
+<p><small><a name="note4" href="#note4">4)</a> Strictly conforming programs are intended to be maximally portable among conforming
+ implementations. Conforming programs may depend upon nonportable features of a conforming
+ implementation.
+</small>
+
+<h2><a name="5" href="#5">5. Environment</a></h2>
+<p><!--para 1 -->
+ An implementation translates C source files and executes C programs in two data-
+ processing-system environments, which will be called the translation environment and
+ the execution environment in this International Standard. Their characteristics define and
+ constrain the results of executing conforming C programs constructed according to the
+ syntactic and semantic rules for conforming implementations.
+<p><b> Forward references</b>: In this clause, only a few of many possible forward references
+ have been noted.
+
+<h3><a name="5.1" href="#5.1">5.1 Conceptual models</a></h3>
+
+<h4><a name="5.1.1" href="#5.1.1">5.1.1 Translation environment</a></h4>
+
+<h5><a name="5.1.1.1" href="#5.1.1.1">5.1.1.1 Program structure</a></h5>
+<p><!--para 1 -->
+ A C program need not all be translated at the same time. The text of the program is kept
+ in units called source files, (or preprocessing files) in this International Standard. A
+ source file together with all the headers and source files included via the preprocessing
+ directive #include is known as a preprocessing translation unit. After preprocessing, a
+ preprocessing translation unit is called a translation unit. Previously translated translation
+ units may be preserved individually or in libraries. The separate translation units of a
+ program communicate by (for example) calls to functions whose identifiers have external
+ linkage, manipulation of objects whose identifiers have external linkage, or manipulation
+ of data files. Translation units may be separately translated and then later linked to
+ produce an executable program.
+<p><b> Forward references</b>: linkages of identifiers (<a href="#6.2.2">6.2.2</a>), external definitions (<a href="#6.9">6.9</a>),
+ preprocessing directives (<a href="#6.10">6.10</a>).
+
+<h5><a name="5.1.1.2" href="#5.1.1.2">5.1.1.2 Translation phases</a></h5>
+<p><!--para 1 -->
+ The precedence among the syntax rules of translation is specified by the following
+ phases.<sup><a href="#note5"><b>5)</b></a></sup>
+<ol>
+<li>  Physical source file multibyte characters are mapped, in an implementation-
+ defined manner, to the source character set (introducing new-line characters for
+ end-of-line indicators) if necessary. Trigraph sequences are replaced by
+ corresponding single-character internal representations.
+<!--page 22 -->
+<li>  Each instance of a backslash character (\) immediately followed by a new-line
+ character is deleted, splicing physical source lines to form logical source lines.
+ Only the last backslash on any physical source line shall be eligible for being part
+ of such a splice. A source file that is not empty shall end in a new-line character,
+ which shall not be immediately preceded by a backslash character before any such
+ splicing takes place.
+<li>  The source file is decomposed into preprocessing tokens<sup><a href="#note6"><b>6)</b></a></sup> and sequences of
+ white-space characters (including comments). A source file shall not end in a
+ partial preprocessing token or in a partial comment. Each comment is replaced by
+ one space character. New-line characters are retained. Whether each nonempty
+ sequence of white-space characters other than new-line is retained or replaced by
+ one space character is implementation-defined.
+<li>  Preprocessing directives are executed, macro invocations are expanded, and
+ _Pragma unary operator expressions are executed. If a character sequence that
+ matches the syntax of a universal character name is produced by token
+ concatenation (<a href="#6.10.3.3">6.10.3.3</a>), the behavior is undefined. A #include preprocessing
+ directive causes the named header or source file to be processed from phase 1
+ through phase 4, recursively. All preprocessing directives are then deleted.
+<li>  Each source character set member and escape sequence in character constants and
+ string literals is converted to the corresponding member of the execution character
+ set; if there is no corresponding member, it is converted to an implementation-
+ defined member other than the null (wide) character.<sup><a href="#note7"><b>7)</b></a></sup>
+<li>  Adjacent string literal tokens are concatenated.
+<li>  White-space characters separating tokens are no longer significant. Each
+ preprocessing token is converted into a token. The resulting tokens are
+ syntactically and semantically analyzed and translated as a translation unit.
+<li>  All external object and function references are resolved. Library components are
+ linked to satisfy external references to functions and objects not defined in the
+ current translation. All such translator output is collected into a program image
+ which contains information needed for execution in its execution environment.
+</ol>
+<p><b> Forward references</b>: universal character names (<a href="#6.4.3">6.4.3</a>), lexical elements (<a href="#6.4">6.4</a>),
+ preprocessing directives (<a href="#6.10">6.10</a>), trigraph sequences (<a href="#5.2.1.1">5.2.1.1</a>), external definitions (<a href="#6.9">6.9</a>).
+<!--page 23 -->
+
+<p><b>Footnotes</b>
+<p><small><a name="note5" href="#note5">5)</a> Implementations shall behave as if these separate phases occur, even though many are typically folded
+ together in practice. Source files, translation units, and translated translation units need not
+ necessarily be stored as files, nor need there be any one-to-one correspondence between these entities
+ and any external representation. The description is conceptual only, and does not specify any
+ particular implementation.
+</small>
+<p><small><a name="note6" href="#note6">6)</a> As described in <a href="#6.4">6.4</a>, the process of dividing a source file's characters into preprocessing tokens is
+ context-dependent. For example, see the handling of &lt; within a #include preprocessing directive.
+</small>
+<p><small><a name="note7" href="#note7">7)</a> An implementation need not convert all non-corresponding source characters to the same execution
+ character.
+</small>
+
+<h5><a name="5.1.1.3" href="#5.1.1.3">5.1.1.3 Diagnostics</a></h5>
+<p><!--para 1 -->
+ A conforming implementation shall produce at least one diagnostic message (identified in
+ an implementation-defined manner) if a preprocessing translation unit or translation unit
+ contains a violation of any syntax rule or constraint, even if the behavior is also explicitly
+ specified as undefined or implementation-defined. Diagnostic messages need not be
+ produced in other circumstances.<sup><a href="#note8"><b>8)</b></a></sup>
+<p><!--para 2 -->
+ EXAMPLE        An implementation shall issue a diagnostic for the translation unit:
+<pre>
+          char i;
+          int i;
+</pre>
+ because in those cases where wording in this International Standard describes the behavior for a construct
+ as being both a constraint error and resulting in undefined behavior, the constraint error shall be diagnosed.
+
+<p><b>Footnotes</b>
+<p><small><a name="note8" href="#note8">8)</a> The intent is that an implementation should identify the nature of, and where possible localize, each
+ violation. Of course, an implementation is free to produce any number of diagnostics as long as a
+ valid program is still correctly translated. It may also successfully translate an invalid program.
+</small>
+
+<h4><a name="5.1.2" href="#5.1.2">5.1.2 Execution environments</a></h4>
+<p><!--para 1 -->
+ Two execution environments are defined: freestanding and hosted. In both cases,
+ program startup occurs when a designated C function is called by the execution
+ environment. All objects with static storage duration shall be initialized (set to their
+ initial values) before program startup. The manner and timing of such initialization are
+ otherwise unspecified. Program termination returns control to the execution
+ environment.
+<p><b> Forward references</b>: storage durations of objects (<a href="#6.2.4">6.2.4</a>), initialization (<a href="#6.7.8">6.7.8</a>).
+
+<h5><a name="5.1.2.1" href="#5.1.2.1">5.1.2.1 Freestanding environment</a></h5>
+<p><!--para 1 -->
+ In a freestanding environment (in which C program execution may take place without any
+ benefit of an operating system), the name and type of the function called at program
+ startup are implementation-defined. Any library facilities available to a freestanding
+ program, other than the minimal set required by clause 4, are implementation-defined.
+<p><!--para 2 -->
+ The effect of program termination in a freestanding environment is implementation-
+ defined.
+
+<h5><a name="5.1.2.2" href="#5.1.2.2">5.1.2.2 Hosted environment</a></h5>
+<p><!--para 1 -->
+ A hosted environment need not be provided, but shall conform to the following
+ specifications if present.
+<!--page 24 -->
+
+<h5><a name="5.1.2.2.1" href="#5.1.2.2.1">5.1.2.2.1 Program startup</a></h5>
+<p><!--para 1 -->
+ The function called at program startup is named main. The implementation declares no
+ prototype for this function. It shall be defined with a return type of int and with no
+ parameters:
+<pre>
+         int main(void) { /* ... */ }
+</pre>
+ or with two parameters (referred to here as argc and argv, though any names may be
+ used, as they are local to the function in which they are declared):
+<pre>
+         int main(int argc, char *argv[]) { /* ... */ }
+</pre>
+ or equivalent;<sup><a href="#note9"><b>9)</b></a></sup> or in some other implementation-defined manner.
+<p><!--para 2 -->
+ If they are declared, the parameters to the main function shall obey the following
+ constraints:
+<ul>
+<li>  The value of argc shall be nonnegative.
+<li>  argv[argc] shall be a null pointer.
+<li>  If the value of argc is greater than zero, the array members argv[0] through
+ argv[argc-1] inclusive shall contain pointers to strings, which are given
+ implementation-defined values by the host environment prior to program startup. The
+ intent is to supply to the program information determined prior to program startup
+ from elsewhere in the hosted environment. If the host environment is not capable of
+ supplying strings with letters in both uppercase and lowercase, the implementation
+ shall ensure that the strings are received in lowercase.
+<li>  If the value of argc is greater than zero, the string pointed to by argv[0]
+ represents the program name; argv[0][0] shall be the null character if the
+ program name is not available from the host environment. If the value of argc is
+ greater than one, the strings pointed to by argv[1] through argv[argc-1]
+ represent the program parameters.
+<li>  The parameters argc and argv and the strings pointed to by the argv array shall
+ be modifiable by the program, and retain their last-stored values between program
+ startup and program termination.
+</ul>
+
+<p><b>Footnotes</b>
+<p><small><a name="note9" href="#note9">9)</a> Thus, int can be replaced by a typedef name defined as int, or the type of argv can be written as
+ char ** argv, and so on.
+</small>
+
+<h5><a name="5.1.2.2.2" href="#5.1.2.2.2">5.1.2.2.2 Program execution</a></h5>
+<p><!--para 1 -->
+ In a hosted environment, a program may use all the functions, macros, type definitions,
+ and objects described in the library clause (clause 7).
+<!--page 25 -->
+
+<h5><a name="5.1.2.2.3" href="#5.1.2.2.3">5.1.2.2.3 Program termination</a></h5>
+<p><!--para 1 -->
+ If the return type of the main function is a type compatible with int, a return from the
+ initial call to the main function is equivalent to calling the exit function with the value
+ returned by the main function as its argument;<sup><a href="#note10"><b>10)</b></a></sup> reaching the } that terminates the
+ main function returns a value of 0. If the return type is not compatible with int, the
+ termination status returned to the host environment is unspecified.
+<p><b> Forward references</b>: definition of terms (<a href="#7.1.1">7.1.1</a>), the exit function (<a href="#7.20.4.3">7.20.4.3</a>).
+
+<p><b>Footnotes</b>
+<p><small><a name="note10" href="#note10">10)</a> In accordance with <a href="#6.2.4">6.2.4</a>, the lifetimes of objects with automatic storage duration declared in main
+ will have ended in the former case, even where they would not have in the latter.
+</small>
+
+<h5><a name="5.1.2.3" href="#5.1.2.3">5.1.2.3 Program execution</a></h5>
+<p><!--para 1 -->
+ The semantic descriptions in this International Standard describe the behavior of an
+ abstract machine in which issues of optimization are irrelevant.
+<p><!--para 2 -->
+ Accessing a volatile object, modifying an object, modifying a file, or calling a function
+ that does any of those operations are all side effects,<sup><a href="#note11"><b>11)</b></a></sup> which are changes in the state of
+ the execution environment. Evaluation of an expression may produce side effects. At
+ certain specified points in the execution sequence called sequence points, all side effects
+ of previous evaluations shall be complete and no side effects of subsequent evaluations
+ shall have taken place. (A summary of the sequence points is given in <a href="#C">annex C</a>.)
+<p><!--para 3 -->
+ In the abstract machine, all expressions are evaluated as specified by the semantics. An
+ actual implementation need not evaluate part of an expression if it can deduce that its
+ value is not used and that no needed side effects are produced (including any caused by
+ calling a function or accessing a volatile object).
+<p><!--para 4 -->
+ When the processing of the abstract machine is interrupted by receipt of a signal, only the
+ values of objects as of the previous sequence point may be relied on. Objects that may be
+ modified between the previous sequence point and the next sequence point need not have
+ received their correct values yet.
+<p><!--para 5 -->
+ The least requirements on a conforming implementation are:
+<ul>
+<li>  At sequence points, volatile objects are stable in the sense that previous accesses are
+ complete and subsequent accesses have not yet occurred.
+<!--page 26 -->
+<li>  At program termination, all data written into files shall be identical to the result that
+ execution of the program according to the abstract semantics would have produced.
+<li>  The input and output dynamics of interactive devices shall take place as specified in
+ <a href="#7.19.3">7.19.3</a>. The intent of these requirements is that unbuffered or line-buffered output
+ appear as soon as possible, to ensure that prompting messages actually appear prior to
+ a program waiting for input.
+</ul>
+<p><!--para 6 -->
+ What constitutes an interactive device is implementation-defined.
+<p><!--para 7 -->
+ More stringent correspondences between abstract and actual semantics may be defined by
+ each implementation.
+<p><!--para 8 -->
+ EXAMPLE 1 An implementation might define a one-to-one correspondence between abstract and actual
+ semantics: at every sequence point, the values of the actual objects would agree with those specified by the
+ abstract semantics. The keyword volatile would then be redundant.
+<p><!--para 9 -->
+ Alternatively, an implementation might perform various optimizations within each translation unit, such
+ that the actual semantics would agree with the abstract semantics only when making function calls across
+ translation unit boundaries. In such an implementation, at the time of each function entry and function
+ return where the calling function and the called function are in different translation units, the values of all
+ externally linked objects and of all objects accessible via pointers therein would agree with the abstract
+ semantics. Furthermore, at the time of each such function entry the values of the parameters of the called
+ function and of all objects accessible via pointers therein would agree with the abstract semantics. In this
+ type of implementation, objects referred to by interrupt service routines activated by the signal function
+ would require explicit specification of volatile storage, as well as other implementation-defined
+ restrictions.
+<p><!--para 10 -->
+ EXAMPLE 2       In executing the fragment
+<pre>
+          char c1, c2;
+          /* ... */
+          c1 = c1 + c2;
+</pre>
+ the ''integer promotions'' require that the abstract machine promote the value of each variable to int size
+ and then add the two ints and truncate the sum. Provided the addition of two chars can be done without
+ overflow, or with overflow wrapping silently to produce the correct result, the actual execution need only
+ produce the same result, possibly omitting the promotions.
+<p><!--para 11 -->
+ EXAMPLE 3       Similarly, in the fragment
+<pre>
+          float f1, f2;
+          double d;
+          /* ... */
+          f1 = f2 * d;
+</pre>
+ the multiplication may be executed using single-precision arithmetic if the implementation can ascertain
+ that the result would be the same as if it were executed using double-precision arithmetic (for example, if d
+ were replaced by the constant 2.0, which has type double).
+<!--page 27 -->
+<p><!--para 12 -->
+ EXAMPLE 4 Implementations employing wide registers have to take care to honor appropriate
+ semantics. Values are independent of whether they are represented in a register or in memory. For
+ example, an implicit spilling of a register is not permitted to alter the value. Also, an explicit store and load
+ is required to round to the precision of the storage type. In particular, casts and assignments are required to
+ perform their specified conversion. For the fragment
+<pre>
+          double d1, d2;
+          float f;
+          d1 = f = expression;
+          d2 = (float) expression;
+</pre>
+ the values assigned to d1 and d2 are required to have been converted to float.
+<p><!--para 13 -->
+ EXAMPLE 5 Rearrangement for floating-point expressions is often restricted because of limitations in
+ precision as well as range. The implementation cannot generally apply the mathematical associative rules
+ for addition or multiplication, nor the distributive rule, because of roundoff error, even in the absence of
+ overflow and underflow. Likewise, implementations cannot generally replace decimal constants in order to
+ rearrange expressions. In the following fragment, rearrangements suggested by mathematical rules for real
+ numbers are often not valid (see <a href="#F.8">F.8</a>).
+<pre>
+          double x, y, z;
+          /* ... */
+          x = (x * y) * z;            //   not equivalent to x   *= y * z;
+          z = (x - y) + y ;           //   not equivalent to z   = x;
+          z = x + x * y;              //   not equivalent to z   = x * (1.0 + y);
+          y = x / 5.0;                //   not equivalent to y   = x * 0.2;
+</pre>
+<p><!--para 14 -->
+ EXAMPLE 6 To illustrate the grouping behavior of expressions, in the following fragment
+<pre>
+          int a, b;
+          /* ... */
+          a = a + 32760 + b + 5;
+</pre>
+ the expression statement behaves exactly the same as
+<pre>
+          a = (((a + 32760) + b) + 5);
+</pre>
+ due to the associativity and precedence of these operators. Thus, the result of the sum (a + 32760) is
+ next added to b, and that result is then added to 5 which results in the value assigned to a. On a machine in
+ which overflows produce an explicit trap and in which the range of values representable by an int is
+ [-32768, +32767], the implementation cannot rewrite this expression as
+<pre>
+          a = ((a + b) + 32765);
+</pre>
+ since if the values for a and b were, respectively, -32754 and -15, the sum a + b would produce a trap
+ while the original expression would not; nor can the expression be rewritten either as
+<pre>
+          a = ((a + 32765) + b);
+</pre>
+ or
+<pre>
+          a = (a + (b + 32765));
+</pre>
+ since the values for a and b might have been, respectively, 4 and -8 or -17 and 12. However, on a machine
+ in which overflow silently generates some value and where positive and negative overflows cancel, the
+ above expression statement can be rewritten by the implementation in any of the above ways because the
+ same result will occur.
+<!--page 28 -->
+<p><!--para 15 -->
+ EXAMPLE 7 The grouping of an expression does not completely determine its evaluation. In the
+ following fragment
+<pre>
+          #include <a href="#7.19">&lt;stdio.h&gt;</a>
+          int sum;
+          char *p;
+          /* ... */
+          sum = sum * 10 - '0' + (*p++ = getchar());
+</pre>
+ the expression statement is grouped as if it were written as
+<pre>
+          sum = (((sum * 10) - '0') + ((*(p++)) = (getchar())));
+</pre>
+ but the actual increment of p can occur at any time between the previous sequence point and the next
+ sequence point (the ;), and the call to getchar can occur at any point prior to the need of its returned
+ value.
+<p><b> Forward references</b>: expressions (<a href="#6.5">6.5</a>), type qualifiers (<a href="#6.7.3">6.7.3</a>), statements (<a href="#6.8">6.8</a>), the
+ signal function (<a href="#7.14">7.14</a>), files (<a href="#7.19.3">7.19.3</a>).
+<!--page 29 -->
+
+<p><b>Footnotes</b>
+<p><small><a name="note11" href="#note11">11)</a> The IEC 60559 standard for binary floating-point arithmetic requires certain user-accessible status
+ flags and control modes. Floating-point operations implicitly set the status flags; modes affect result
+ values of floating-point operations. Implementations that support such floating-point state are
+ required to regard changes to it as side effects -- see <a href="#F">annex F</a> for details. The floating-point
+ environment library <a href="#7.6">&lt;fenv.h&gt;</a> provides a programming facility for indicating when these side
+ effects matter, freeing the implementations in other cases.
+</small>
+
+<h3><a name="5.2" href="#5.2">5.2 Environmental considerations</a></h3>
+
+<h4><a name="5.2.1" href="#5.2.1">5.2.1 Character sets</a></h4>
+<p><!--para 1 -->
+ Two sets of characters and their associated collating sequences shall be defined: the set in
+ which source files are written (the source character set), and the set interpreted in the
+ execution environment (the execution character set). Each set is further divided into a
+ basic character set, whose contents are given by this subclause, and a set of zero or more
+ locale-specific members (which are not members of the basic character set) called
+ extended characters. The combined set is also called the extended character set. The
+ values of the members of the execution character set are implementation-defined.
+<p><!--para 2 -->
+ In a character constant or string literal, members of the execution character set shall be
+ represented by corresponding members of the source character set or by escape
+ sequences consisting of the backslash \ followed by one or more characters. A byte with
+ all bits set to 0, called the null character, shall exist in the basic execution character set; it
+ is used to terminate a character string.
+<p><!--para 3 -->
+ Both the basic source and basic execution character sets shall have the following
+ members: the 26 uppercase letters of the Latin alphabet
+<pre>
+          A   B   C      D   E   F    G    H    I    J    K    L   M
+          N   O   P      Q   R   S    T    U    V    W    X    Y   Z
+</pre>
+ the 26 lowercase letters of the Latin alphabet
+<pre>
+          a   b   c      d   e   f    g    h    i    j    k    l   m
+          n   o   p      q   r   s    t    u    v    w    x    y   z
+</pre>
+ the 10 decimal digits
+<pre>
+          0   1   2      3   4   5    6    7    8    9
+</pre>
+ the following 29 graphic characters
+<pre>
+          !   "   #      %   &amp;   '    (    )    *    +    ,    -   .    /    :
+          ;   &lt;   =      &gt;   ?   [    \    ]    ^    _    {    |   }    ~
+</pre>
+ the space character, and control characters representing horizontal tab, vertical tab, and
+ form feed. The representation of each member of the source and execution basic
+ character sets shall fit in a byte. In both the source and execution basic character sets, the
+ value of each character after 0 in the above list of decimal digits shall be one greater than
+ the value of the previous. In source files, there shall be some way of indicating the end of
+ each line of text; this International Standard treats such an end-of-line indicator as if it
+ were a single new-line character. In the basic execution character set, there shall be
+ control characters representing alert, backspace, carriage return, and new line. If any
+ other characters are encountered in a source file (except in an identifier, a character
+ constant, a string literal, a header name, a comment, or a preprocessing token that is never
+<!--page 30 -->
+ converted to a token), the behavior is undefined.
+<p><!--para 4 -->
+ A letter is an uppercase letter or a lowercase letter as defined above; in this International
+ Standard the term does not include other characters that are letters in other alphabets.
+<p><!--para 5 -->
+ The universal character name construct provides a way to name other characters.
+<p><b> Forward references</b>: universal character names (<a href="#6.4.3">6.4.3</a>), character constants (<a href="#6.4.4.4">6.4.4.4</a>),
+ preprocessing directives (<a href="#6.10">6.10</a>), string literals (<a href="#6.4.5">6.4.5</a>), comments (<a href="#6.4.9">6.4.9</a>), string (<a href="#7.1.1">7.1.1</a>).
+
+<h5><a name="5.2.1.1" href="#5.2.1.1">5.2.1.1 Trigraph sequences</a></h5>
+<p><!--para 1 -->
+ Before any other processing takes place, each occurrence of one of the following
+ sequences of three characters (called trigraph sequences<sup><a href="#note12"><b>12)</b></a></sup>) is replaced with the
+ corresponding single character.
+<pre>
+        ??=      #                       ??)      ]                       ??!     |
+        ??(      [                       ??'      ^                       ??&gt;     }
+        ??/      \                       ??&lt;      {                       ??-     ~
+</pre>
+ No other trigraph sequences exist. Each ? that does not begin one of the trigraphs listed
+ above is not changed.
+<p><!--para 2 -->
+ EXAMPLE 1
+<pre>
+           ??=define arraycheck(a, b) a??(b??) ??!??! b??(a??)
+</pre>
+ becomes
+<pre>
+           #define arraycheck(a, b) a[b] || b[a]
+</pre>
+<p><!--para 3 -->
+ EXAMPLE 2      The following source line
+<pre>
+           printf("Eh???/n");
+</pre>
+ becomes (after replacement of the trigraph sequence ??/)
+<pre>
+           printf("Eh?\n");
+</pre>
+
+<p><b>Footnotes</b>
+<p><small><a name="note12" href="#note12">12)</a> The trigraph sequences enable the input of characters that are not defined in the Invariant Code Set as
+ described in ISO/IEC 646, which is a subset of the seven-bit US ASCII code set.
+</small>
+
+<h5><a name="5.2.1.2" href="#5.2.1.2">5.2.1.2 Multibyte characters</a></h5>
+<p><!--para 1 -->
+ The source character set may contain multibyte characters, used to represent members of
+ the extended character set. The execution character set may also contain multibyte
+ characters, which need not have the same encoding as for the source character set. For
+ both character sets, the following shall hold:
+<ul>
+<li>  The basic character set shall be present and each character shall be encoded as a
+ single byte.
+<li>  The presence, meaning, and representation of any additional members is locale-
+ specific.
+<!--page 31 -->
+<li>  A multibyte character set may have a state-dependent encoding, wherein each
+ sequence of multibyte characters begins in an initial shift state and enters other
+ locale-specific shift states when specific multibyte characters are encountered in the
+ sequence. While in the initial shift state, all single-byte characters retain their usual
+ interpretation and do not alter the shift state. The interpretation for subsequent bytes
+ in the sequence is a function of the current shift state.
+<li>  A byte with all bits zero shall be interpreted as a null character independent of shift
+ state. Such a byte shall not occur as part of any other multibyte character.
+</ul>
+<p><!--para 2 -->
+ For source files, the following shall hold:
+<ul>
+<li>  An identifier, comment, string literal, character constant, or header name shall begin
+ and end in the initial shift state.
+<li>  An identifier, comment, string literal, character constant, or header name shall consist
+ of a sequence of valid multibyte characters.
+</ul>
+
+<h4><a name="5.2.2" href="#5.2.2">5.2.2 Character display semantics</a></h4>
+<p><!--para 1 -->
+ The active position is that location on a display device where the next character output by
+ the fputc function would appear. The intent of writing a printing character (as defined
+ by the isprint function) to a display device is to display a graphic representation of
+ that character at the active position and then advance the active position to the next
+ position on the current line. The direction of writing is locale-specific. If the active
+ position is at the final position of a line (if there is one), the behavior of the display device
+ is unspecified.
+<p><!--para 2 -->
+ Alphabetic escape sequences representing nongraphic characters in the execution
+ character set are intended to produce actions on display devices as follows:
+<dl>
+<dt> \a <dd>(alert) Produces an audible or visible alert without changing the active position.
+<dt> \b <dd>(backspace) Moves the active position to the previous position on the current line. If
+    the active position is at the initial position of a line, the behavior of the display
+    device is unspecified.
+<dt> \f <dd>( form feed) Moves the active position to the initial position at the start of the next
+    logical page.
+<dt> \n <dd>(new line) Moves the active position to the initial position of the next line.
+<dt> \r <dd>(carriage return) Moves the active position to the initial position of the current line.
+<dt> \t <dd>(horizontal tab) Moves the active position to the next horizontal tabulation position
+    on the current line. If the active position is at or past the last defined horizontal
+    tabulation position, the behavior of the display device is unspecified.
+<dt> \v <dd>(vertical tab) Moves the active position to the initial position of the next vertical
+<!--page 32 -->
+     tabulation position. If the active position is at or past the last defined vertical
+      tabulation position, the behavior of the display device is unspecified.
+</dl>
+<p><!--para 3 -->
+ Each of these escape sequences shall produce a unique implementation-defined value
+ which can be stored in a single char object. The external representations in a text file
+ need not be identical to the internal representations, and are outside the scope of this
+ International Standard.
+<p><b> Forward references</b>: the isprint function (<a href="#7.4.1.8">7.4.1.8</a>), the fputc function (<a href="#7.19.7.3">7.19.7.3</a>).
+
+<h4><a name="5.2.3" href="#5.2.3">5.2.3 Signals and interrupts</a></h4>
+<p><!--para 1 -->
+ Functions shall be implemented such that they may be interrupted at any time by a signal,
+ or may be called by a signal handler, or both, with no alteration to earlier, but still active,
+ invocations' control flow (after the interruption), function return values, or objects with
+ automatic storage duration. All such objects shall be maintained outside the function
+ image (the instructions that compose the executable representation of a function) on a
+ per-invocation basis.
+
+<h4><a name="5.2.4" href="#5.2.4">5.2.4 Environmental limits</a></h4>
+<p><!--para 1 -->
+ Both the translation and execution environments constrain the implementation of
+ language translators and libraries. The following summarizes the language-related
+ environmental limits on a conforming implementation; the library-related limits are
+ discussed in clause 7.
+
+<h5><a name="5.2.4.1" href="#5.2.4.1">5.2.4.1 Translation limits</a></h5>
+<p><!--para 1 -->
+ The implementation shall be able to translate and execute at least one program that
+ contains at least one instance of every one of the following limits:<sup><a href="#note13"><b>13)</b></a></sup>
+<ul>
+<li>  127 nesting levels of blocks
+<li>  63 nesting levels of conditional inclusion
+<li>  12 pointer, array, and function declarators (in any combinations) modifying an
+ arithmetic, structure, union, or incomplete type in a declaration
+<li>  63 nesting levels of parenthesized declarators within a full declarator
+<li>  63 nesting levels of parenthesized expressions within a full expression
+<li>  63 significant initial characters in an internal identifier or a macro name (each
+ universal character name or extended source character is considered a single
+ character)
+<li>  31 significant initial characters in an external identifier (each universal character name
+ specifying a short identifier of 0000FFFF or less is considered 6 characters, each
+<!--page 33 -->
+   universal character name specifying a short identifier of 00010000 or more is
+   considered 10 characters, and each extended source character is considered the same
+   number of characters as the corresponding universal character name, if any)<sup><a href="#note14"><b>14)</b></a></sup>
+<li>  4095 external identifiers in one translation unit
+<li>  511 identifiers with block scope declared in one block
+<li>  4095 macro identifiers simultaneously defined in one preprocessing translation unit
+<li>  127 parameters in one function definition
+<li>  127 arguments in one function call
+<li>  127 parameters in one macro definition
+<li>  127 arguments in one macro invocation
+<li>  4095 characters in a logical source line
+<li>  4095 characters in a character string literal or wide string literal (after concatenation)
+<li>  65535 bytes in an object (in a hosted environment only)
+<li>  15 nesting levels for #included files
+<li>  1023 case labels for a switch statement (excluding those for any nested switch
+ statements)
+<li>  1023 members in a single structure or union
+<li>  1023 enumeration constants in a single enumeration
+<li>  63 levels of nested structure or union definitions in a single struct-declaration-list
+</ul>
+
+<p><b>Footnotes</b>
+<p><small><a name="note13" href="#note13">13)</a> Implementations should avoid imposing fixed translation limits whenever possible.
+</small>
+<p><small><a name="note14" href="#note14">14)</a> See ''future language directions'' (<a href="#6.11.3">6.11.3</a>).
+</small>
+
+<h5><a name="5.2.4.2" href="#5.2.4.2">5.2.4.2 Numerical limits</a></h5>
+<p><!--para 1 -->
+ An implementation is required to document all the limits specified in this subclause,
+ which are specified in the headers <a href="#7.10">&lt;limits.h&gt;</a> and <a href="#7.7">&lt;float.h&gt;</a>. Additional limits are
+ specified in <a href="#7.18">&lt;stdint.h&gt;</a>.
+<p><b> Forward references</b>: integer types <a href="#7.18">&lt;stdint.h&gt;</a> (<a href="#7.18">7.18</a>).
+
+<h5><a name="5.2.4.2.1" href="#5.2.4.2.1">5.2.4.2.1 Sizes of integer types &lt;limits.h&gt;</a></h5>
+<p><!--para 1 -->
+ The values given below shall be replaced by constant expressions suitable for use in #if
+ preprocessing directives. Moreover, except for CHAR_BIT and MB_LEN_MAX, the
+ following shall be replaced by expressions that have the same type as would an
+ expression that is an object of the corresponding type converted according to the integer
+ promotions. Their implementation-defined values shall be equal or greater in magnitude
+<!--page 34 -->
+ (absolute value) to those shown, with the same sign.
+<ul>
+<li>  number of bits for smallest object that is not a bit-field (byte)
+<pre>
+ CHAR_BIT                                            8
+</pre>
+<li>  minimum value for an object of type signed char
+<pre>
+ SCHAR_MIN                                -127 // -(2<sup>7</sup> - 1)
+</pre>
+<li>  maximum value for an object of type signed char
+<pre>
+ SCHAR_MAX                                +127 // 2<sup>7</sup> - 1
+</pre>
+<li>  maximum value for an object of type unsigned char
+<pre>
+ UCHAR_MAX                                 255 // 2<sup>8</sup> - 1
+</pre>
+<li>  minimum value for an object of type char
+<pre>
+ CHAR_MIN                               see below
+</pre>
+<li>  maximum value for an object of type char
+<pre>
+ CHAR_MAX                              see below
+</pre>
+<li>  maximum number of bytes in a multibyte character, for any supported locale
+<pre>
+ MB_LEN_MAX                                    1
+</pre>
+<li>  minimum value for an object of type short int
+<pre>
+ SHRT_MIN                               -32767 // -(2<sup>15</sup> - 1)
+</pre>
+<li>  maximum value for an object of type short int
+<pre>
+ SHRT_MAX                               +32767 // 2<sup>15</sup> - 1
+</pre>
+<li>  maximum value for an object of type unsigned short int
+<pre>
+ USHRT_MAX                               65535 // 2<sup>16</sup> - 1
+</pre>
+<li>  minimum value for an object of type int
+<pre>
+ INT_MIN                                 -32767 // -(2<sup>15</sup> - 1)
+</pre>
+<li>  maximum value for an object of type int
+<pre>
+ INT_MAX                                +32767 // 2<sup>15</sup> - 1
+</pre>
+<li>  maximum value for an object of type unsigned int
+<pre>
+ UINT_MAX                                65535 // 2<sup>16</sup> - 1
+</pre>
+<li>  minimum value for an object of type long int
+<pre>
+ LONG_MIN                         -2147483647 // -(2<sup>31</sup> - 1)
+</pre>
+<li>  maximum value for an object of type long int
+<pre>
+ LONG_MAX                         +2147483647 // 2<sup>31</sup> - 1
+</pre>
+<li>  maximum value for an object of type unsigned long int
+<pre>
+ ULONG_MAX                         4294967295 // 2<sup>32</sup> - 1
+</pre>
+<!--page 35 -->
+<li>  minimum value for an object of type long long int
+<pre>
+ LLONG_MIN          -9223372036854775807 // -(2<sup>63</sup> - 1)
+</pre>
+<li>  maximum value for an object of type long long int
+<pre>
+ LLONG_MAX          +9223372036854775807 // 2<sup>63</sup> - 1
+</pre>
+<li>  maximum value for an object of type unsigned long long int
+<pre>
+ ULLONG_MAX         18446744073709551615 // 2<sup>64</sup> - 1
+</pre>
+</ul>
+<p><!--para 2 -->
+ If the value of an object of type char is treated as a signed integer when used in an
+ expression, the value of CHAR_MIN shall be the same as that of SCHAR_MIN and the
+ value of CHAR_MAX shall be the same as that of SCHAR_MAX. Otherwise, the value of
+ CHAR_MIN shall be 0 and the value of CHAR_MAX shall be the same as that of
+ UCHAR_MAX.<sup><a href="#note15"><b>15)</b></a></sup> The value UCHAR_MAX shall equal 2<sup>CHAR_BIT</sup> - 1.
+<p><b> Forward references</b>: representations of types (<a href="#6.2.6">6.2.6</a>), conditional inclusion (<a href="#6.10.1">6.10.1</a>).
+
+<p><b>Footnotes</b>
+<p><small><a name="note15" href="#note15">15)</a> See <a href="#6.2.5">6.2.5</a>.
+</small>
+
+<h5><a name="5.2.4.2.2" href="#5.2.4.2.2">5.2.4.2.2 Characteristics of floating types &lt;float.h&gt;</a></h5>
+<p><!--para 1 -->
+ The characteristics of floating types are defined in terms of a model that describes a
+ representation of floating-point numbers and values that provide information about an
+ implementation's floating-point arithmetic.<sup><a href="#note16"><b>16)</b></a></sup> The following parameters are used to
+ define the model for each floating-point type:
+<pre>
+        s          sign ((+-)1)
+        b          base or radix of exponent representation (an integer &gt; 1)
+        e          exponent (an integer between a minimum emin and a maximum emax )
+        p          precision (the number of base-b digits in the significand)
+        f<sub>k</sub>         nonnegative integers less than b (the significand digits)
+</pre>
+<p><!--para 2 -->
+ A floating-point number (x) is defined by the following model:
+<pre>
+                    p
+        x = s b<sup>e</sup>  (Sum) f<sub>k</sub> b<sup>-k</sup> ,   emin &lt;= e &lt;= emax
+                   k=1
+</pre>
+<p><!--para 3 -->
+ In addition to normalized floating-point numbers ( f<sub>1</sub> &gt; 0 if x != 0), floating types may be
+ able to contain other kinds of floating-point numbers, such as subnormal floating-point
+ numbers (x != 0, e = emin , f<sub>1</sub> = 0) and unnormalized floating-point numbers (x != 0,
+ e &gt; emin , f<sub>1</sub> = 0), and values that are not floating-point numbers, such as infinities and
+ NaNs. A NaN is an encoding signifying Not-a-Number. A quiet NaN propagates
+ through almost every arithmetic operation without raising a floating-point exception; a
+ signaling NaN generally raises a floating-point exception when occurring as an
+<!--page 36 -->
+ arithmetic operand.<sup><a href="#note17"><b>17)</b></a></sup>
+<p><!--para 4 -->
+ An implementation may give zero and non-numeric values (such as infinities and NaNs) a
+ sign or may leave them unsigned. Wherever such values are unsigned, any requirement
+ in this International Standard to retrieve the sign shall produce an unspecified sign, and
+ any requirement to set the sign shall be ignored.
+<p><!--para 5 -->
+ The accuracy of the floating-point operations (+, -, *, /) and of the library functions in
+ <a href="#7.12">&lt;math.h&gt;</a> and <a href="#7.3">&lt;complex.h&gt;</a> that return floating-point results is implementation-
+ defined, as is the accuracy of the conversion between floating-point internal
+ representations and string representations performed by the library functions in
+ <a href="#7.19">&lt;stdio.h&gt;</a>, <a href="#7.20">&lt;stdlib.h&gt;</a>, and <a href="#7.24">&lt;wchar.h&gt;</a>. The implementation may state that the
+ accuracy is unknown.
+<p><!--para 6 -->
+ All integer values in the <a href="#7.7">&lt;float.h&gt;</a> header, except FLT_ROUNDS, shall be constant
+ expressions suitable for use in #if preprocessing directives; all floating values shall be
+ constant expressions. All except DECIMAL_DIG, FLT_EVAL_METHOD, FLT_RADIX,
+ and FLT_ROUNDS have separate names for all three floating-point types. The floating-point
+ model representation is provided for all values except FLT_EVAL_METHOD and
+ FLT_ROUNDS.
+<p><!--para 7 -->
+ The rounding mode for floating-point addition is characterized by the implementation-
+ defined value of FLT_ROUNDS:<sup><a href="#note18"><b>18)</b></a></sup>
+<pre>
+       -1      indeterminable
+        0      toward zero
+        1      to nearest
+        2      toward positive infinity
+        3      toward negative infinity
+</pre>
+ All other values for FLT_ROUNDS characterize implementation-defined rounding
+ behavior.
+<p><!--para 8 -->
+ Except for assignment and cast (which remove all extra range and precision), the values
+ of operations with floating operands and values subject to the usual arithmetic
+ conversions and of floating constants are evaluated to a format whose range and precision
+ may be greater than required by the type. The use of evaluation formats is characterized
+ by the implementation-defined value of FLT_EVAL_METHOD:<sup><a href="#note19"><b>19)</b></a></sup>
+<!--page 37 -->
+<pre>
+        -1        indeterminable;
+         0        evaluate all operations and constants just to the range and precision of the
+                  type;
+         1        evaluate operations and constants of type float and double to the
+                  range and precision of the double type, evaluate long double
+                  operations and constants to the range and precision of the long double
+                  type;
+         2        evaluate all operations and constants to the range and precision of the
+                  long double type.
+</pre>
+ All other negative values for FLT_EVAL_METHOD characterize implementation-defined
+ behavior.
+<p><!--para 9 -->
+ The values given in the following list shall be replaced by constant expressions with
+ implementation-defined values that are greater or equal in magnitude (absolute value) to
+ those shown, with the same sign:
+<ul>
+<li>  radix of exponent representation, b
+<pre>
+ FLT_RADIX                                                 2
+</pre>
+<li>  number of base-FLT_RADIX digits in the floating-point significand, p
+<pre>
+   FLT_MANT_DIG
+   DBL_MANT_DIG
+   LDBL_MANT_DIG
+</pre>
+<li>  number of decimal digits, n, such that any floating-point number in the widest
+ supported floating type with pmax radix b digits can be rounded to a floating-point
+ number with n decimal digits and back again without change to the value,
+<pre>
+      { pmax log10 b       if b is a power of 10
+      {
+      { [^1 + pmax log10 b^] otherwise
+</pre>
+<pre>
+   DECIMAL_DIG                                            10
+</pre>
+<li>  number of decimal digits, q, such that any floating-point number with q decimal digits
+ can be rounded into a floating-point number with p radix b digits and back again
+ without change to the q decimal digits,
+<!--page 38 -->
+<pre>
+      { p log10 b          if b is a power of 10
+      {
+      { [_( p - 1) log10 b_] otherwise
+</pre>
+<pre>
+  FLT_DIG                                         6
+  DBL_DIG                                        10
+  LDBL_DIG                                       10
+</pre>
+<li>  minimum negative integer such that FLT_RADIX raised to one less than that power is
+ a normalized floating-point number, emin
+<pre>
+  FLT_MIN_EXP
+  DBL_MIN_EXP
+  LDBL_MIN_EXP
+</pre>
+<li>  minimum negative integer such that 10 raised to that power is in the range of
+ normalized floating-point numbers, [^log10 b<sup>emin -1</sup>^]
+<pre>
+ FLT_MIN_10_EXP                                 -37
+ DBL_MIN_10_EXP                                 -37
+ LDBL_MIN_10_EXP                                -37
+</pre>
+<li>  maximum integer such that FLT_RADIX raised to one less than that power is a
+ representable finite floating-point number, emax
+<pre>
+  FLT_MAX_EXP
+  DBL_MAX_EXP
+  LDBL_MAX_EXP
+</pre>
+<li>  maximum integer such that 10 raised to that power is in the range of representable
+ finite floating-point numbers, [_log10 ((1 - b<sup>-p</sup>)b<sup>emax</sup>)_]
+<pre>
+  FLT_MAX_10_EXP                                 +37
+  DBL_MAX_10_EXP                                 +37
+  LDBL_MAX_10_EXP                                +37
+</pre>
+</ul>
+<p><!--para 10 -->
+ The values given in the following list shall be replaced by constant expressions with
+ implementation-defined values that are greater than or equal to those shown:
+<ul>
+<li>  maximum representable finite floating-point number, (1 - b<sup>-p</sup>)b<sup>emax</sup>
+<pre>
+  FLT_MAX                                     1E+37
+  DBL_MAX                                     1E+37
+  LDBL_MAX                                    1E+37
+</pre>
+</ul>
+<p><!--para 11 -->
+ The values given in the following list shall be replaced by constant expressions with
+ implementation-defined (positive) values that are less than or equal to those shown:
+<ul>
+<li>  the difference between 1 and the least value greater than 1 that is representable in the
+  given floating point type, b<sup>1-p</sup>
+<!--page 39 -->
+<pre>
+   FLT_EPSILON                                         1E-5
+   DBL_EPSILON                                         1E-9
+   LDBL_EPSILON                                        1E-9
+</pre>
+<li>  minimum normalized positive floating-point number, b<sup>emin -1</sup>
+<pre>
+   FLT_MIN                                            1E-37
+   DBL_MIN                                            1E-37
+   LDBL_MIN                                           1E-37
+</pre>
+</ul>
+<p><b>Recommended practice</b>
+<p><!--para 12 -->
+ Conversion from (at least) double to decimal with DECIMAL_DIG digits and back
+ should be the identity function.
+<p><!--para 13 -->
+ EXAMPLE 1 The following describes an artificial floating-point representation that meets the minimum
+ requirements of this International Standard, and the appropriate values in a <a href="#7.7">&lt;float.h&gt;</a> header for type
+ float:
+<pre>
+                    6
+       x = s 16<sup>e</sup>   (Sum) f<sub>k</sub> 16<sup>-k</sup> ,   -31 &lt;= e &lt;= +32
+                   k=1
+</pre>
+<pre>
+         FLT_RADIX                                  16
+         FLT_MANT_DIG                                6
+         FLT_EPSILON                   9.53674316E-07F
+         FLT_DIG                                     6
+         FLT_MIN_EXP                               -31
+         FLT_MIN                       2.93873588E-39F
+         FLT_MIN_10_EXP                            -38
+         FLT_MAX_EXP                               +32
+         FLT_MAX                       3.40282347E+38F
+         FLT_MAX_10_EXP                            +38
+</pre>
+<p><!--para 14 -->
+ EXAMPLE 2 The following describes floating-point representations that also meet the requirements for
+ single-precision and double-precision normalized numbers in IEC 60559,<sup><a href="#note20"><b>20)</b></a></sup> and the appropriate values in a
+ <a href="#7.7">&lt;float.h&gt;</a> header for types float and double:
+<pre>
+                   24
+       xf = s 2<sup>e</sup>  (Sum) f<sub>k</sub> 2<sup>-k</sup> ,   -125 &lt;= e &lt;= +128
+                   k=1
+</pre>
+<pre>
+                   53
+       xd = s 2<sup>e</sup>  (Sum) f<sub>k</sub> 2<sup>-k</sup> ,   -1021 &lt;= e &lt;= +1024
+                   k=1
+</pre>
+
+<pre>
+         FLT_RADIX                                   2
+         DECIMAL_DIG                                17
+         FLT_MANT_DIG                               24
+         FLT_EPSILON                   1.19209290E-07F // decimal constant
+         FLT_EPSILON                          0X1P-23F // hex constant
+</pre>
+<!--page 40 -->
+<pre>
+         FLT_DIG                           6
+         FLT_MIN_EXP                    -125
+         FLT_MIN             1.17549435E-38F               // decimal constant
+         FLT_MIN                   0X1P-126F               // hex constant
+         FLT_MIN_10_EXP                  -37
+         FLT_MAX_EXP                    +128
+         FLT_MAX             3.40282347E+38F               // decimal constant
+         FLT_MAX             0X1.fffffeP127F               // hex constant
+         FLT_MAX_10_EXP                  +38
+         DBL_MANT_DIG                     53
+         DBL_EPSILON 2.2204460492503131E-16                // decimal constant
+         DBL_EPSILON                 0X1P-52               // hex constant
+         DBL_DIG                          15
+         DBL_MIN_EXP                   -1021
+         DBL_MIN     2.2250738585072014E-308               // decimal constant
+         DBL_MIN                   0X1P-1022               // hex constant
+         DBL_MIN_10_EXP                 -307
+         DBL_MAX_EXP                   +1024
+         DBL_MAX     1.7976931348623157E+308               // decimal constant
+         DBL_MAX      0X1.fffffffffffffP1023               // hex constant
+         DBL_MAX_10_EXP                 +308
+</pre>
+ If a type wider than double were supported, then DECIMAL_DIG would be greater than 17. For
+ example, if the widest type were to use the minimal-width IEC 60559 double-extended format (64 bits of
+ precision), then DECIMAL_DIG would be 21.
+<p><b> Forward references</b>:        conditional inclusion (<a href="#6.10.1">6.10.1</a>), complex arithmetic
+ <a href="#7.3">&lt;complex.h&gt;</a> (<a href="#7.3">7.3</a>), extended multibyte and wide character utilities <a href="#7.24">&lt;wchar.h&gt;</a>
+ (<a href="#7.24">7.24</a>), floating-point environment <a href="#7.6">&lt;fenv.h&gt;</a> (<a href="#7.6">7.6</a>), general utilities <a href="#7.20">&lt;stdlib.h&gt;</a>
+ (<a href="#7.20">7.20</a>), input/output <a href="#7.19">&lt;stdio.h&gt;</a> (<a href="#7.19">7.19</a>), mathematics <a href="#7.12">&lt;math.h&gt;</a> (<a href="#7.12">7.12</a>).
+<!--page 41 -->
+
+<p><b>Footnotes</b>
+<p><small><a name="note16" href="#note16">16)</a> The floating-point model is intended to clarify the description of each floating-point characteristic and
+ does not require the floating-point arithmetic of the implementation to be identical.
+</small>
+<p><small><a name="note17" href="#note17">17)</a> IEC 60559:1989 specifies quiet and signaling NaNs. For implementations that do not support
+ IEC 60559:1989, the terms quiet NaN and signaling NaN are intended to apply to encodings with
+ similar behavior.
+</small>
+<p><small><a name="note18" href="#note18">18)</a> Evaluation of FLT_ROUNDS correctly reflects any execution-time change of rounding mode through
+ the function fesetround in <a href="#7.6">&lt;fenv.h&gt;</a>.
+</small>
+<p><small><a name="note19" href="#note19">19)</a> The evaluation method determines evaluation formats of expressions involving all floating types, not
+ just real types. For example, if FLT_EVAL_METHOD is 1, then the product of two float
+ _Complex operands is represented in the double _Complex format, and its parts are evaluated to
+ double.
+</small>
+<p><small><a name="note20" href="#note20">20)</a> The floating-point model in that standard sums powers of b from zero, so the values of the exponent
+ limits are one less than shown here.
+</small>
+
+<h2><a name="6" href="#6">6. Language</a></h2>
+
+<h3><a name="6.1" href="#6.1">6.1 Notation</a></h3>
+<p><!--para 1 -->
+ In the syntax notation used in this clause, syntactic categories (nonterminals) are
+ indicated by italic type, and literal words and character set members (terminals) by bold
+ type. A colon (:) following a nonterminal introduces its definition. Alternative
+ definitions are listed on separate lines, except when prefaced by the words ''one of''. An
+ optional symbol is indicated by the subscript ''opt'', so that
+<pre>
+          { expression<sub>opt</sub> }
+</pre>
+ indicates an optional expression enclosed in braces.
+<p><!--para 2 -->
+ When syntactic categories are referred to in the main text, they are not italicized and
+ words are separated by spaces instead of hyphens.
+<p><!--para 3 -->
+ A summary of the language syntax is given in <a href="#A">annex A</a>.
+
+<h3><a name="6.2" href="#6.2">6.2 Concepts</a></h3>
+
+<h4><a name="6.2.1" href="#6.2.1">6.2.1 Scopes of identifiers</a></h4>
+<p><!--para 1 -->
+ An identifier can denote an object; a function; a tag or a member of a structure, union, or
+ enumeration; a typedef name; a label name; a macro name; or a macro parameter. The
+ same identifier can denote different entities at different points in the program. A member
+ of an enumeration is called an enumeration constant. Macro names and macro
+ parameters are not considered further here, because prior to the semantic phase of
+ program translation any occurrences of macro names in the source file are replaced by the
+ preprocessing token sequences that constitute their macro definitions.
+<p><!--para 2 -->
+ For each different entity that an identifier designates, the identifier is visible (i.e., can be
+ used) only within a region of program text called its scope. Different entities designated
+ by the same identifier either have different scopes, or are in different name spaces. There
+ are four kinds of scopes: function, file, block, and function prototype. (A function
+ prototype is a declaration of a function that declares the types of its parameters.)
+<p><!--para 3 -->
+ A label name is the only kind of identifier that has function scope. It can be used (in a
+ goto statement) anywhere in the function in which it appears, and is declared implicitly
+ by its syntactic appearance (followed by a : and a statement).
+<p><!--para 4 -->
+ Every other identifier has scope determined by the placement of its declaration (in a
+ declarator or type specifier). If the declarator or type specifier that declares the identifier
+ appears outside of any block or list of parameters, the identifier has file scope, which
+ terminates at the end of the translation unit. If the declarator or type specifier that
+ declares the identifier appears inside a block or within the list of parameter declarations in
+ a function definition, the identifier has block scope, which terminates at the end of the
+ associated block. If the declarator or type specifier that declares the identifier appears
+<!--page 42 -->
+ within the list of parameter declarations in a function prototype (not part of a function
+ definition), the identifier has function prototype scope, which terminates at the end of the
+ function declarator. If an identifier designates two different entities in the same name
+ space, the scopes might overlap. If so, the scope of one entity (the inner scope) will be a
+ strict subset of the scope of the other entity (the outer scope). Within the inner scope, the
+ identifier designates the entity declared in the inner scope; the entity declared in the outer
+ scope is hidden (and not visible) within the inner scope.
+<p><!--para 5 -->
+ Unless explicitly stated otherwise, where this International Standard uses the term
+ ''identifier'' to refer to some entity (as opposed to the syntactic construct), it refers to the
+ entity in the relevant name space whose declaration is visible at the point the identifier
+ occurs.
+<p><!--para 6 -->
+ Two identifiers have the same scope if and only if their scopes terminate at the same
+ point.
+<p><!--para 7 -->
+ Structure, union, and enumeration tags have scope that begins just after the appearance of
+ the tag in a type specifier that declares the tag. Each enumeration constant has scope that
+ begins just after the appearance of its defining enumerator in an enumerator list. Any
+ other identifier has scope that begins just after the completion of its declarator.
+<p><b> Forward references</b>: declarations (<a href="#6.7">6.7</a>), function calls (<a href="#6.5.2.2">6.5.2.2</a>), function definitions
+ (<a href="#6.9.1">6.9.1</a>), identifiers (<a href="#6.4.2">6.4.2</a>), name spaces of identifiers (<a href="#6.2.3">6.2.3</a>), macro replacement (<a href="#6.10.3">6.10.3</a>),
+ source file inclusion (<a href="#6.10.2">6.10.2</a>), statements (<a href="#6.8">6.8</a>).
+
+<h4><a name="6.2.2" href="#6.2.2">6.2.2 Linkages of identifiers</a></h4>
+<p><!--para 1 -->
+ An identifier declared in different scopes or in the same scope more than once can be
+ made to refer to the same object or function by a process called linkage.<sup><a href="#note21"><b>21)</b></a></sup> There are
+ three kinds of linkage: external, internal, and none.
+<p><!--para 2 -->
+ In the set of translation units and libraries that constitutes an entire program, each
+ declaration of a particular identifier with external linkage denotes the same object or
+ function. Within one translation unit, each declaration of an identifier with internal
+ linkage denotes the same object or function. Each declaration of an identifier with no
+ linkage denotes a unique entity.
+<p><!--para 3 -->
+ If the declaration of a file scope identifier for an object or a function contains the storage-
+ class specifier static, the identifier has internal linkage.<sup><a href="#note22"><b>22)</b></a></sup>
+<p><!--para 4 -->
+ For an identifier declared with the storage-class specifier extern in a scope in which a
+<!--page 43 -->
+ prior declaration of that identifier is visible,<sup><a href="#note23"><b>23)</b></a></sup> if the prior declaration specifies internal or
+ external linkage, the linkage of the identifier at the later declaration is the same as the
+ linkage specified at the prior declaration. If no prior declaration is visible, or if the prior
+ declaration specifies no linkage, then the identifier has external linkage.
+<p><!--para 5 -->
+ If the declaration of an identifier for a function has no storage-class specifier, its linkage
+ is determined exactly as if it were declared with the storage-class specifier extern. If
+ the declaration of an identifier for an object has file scope and no storage-class specifier,
+ its linkage is external.
+<p><!--para 6 -->
+ The following identifiers have no linkage: an identifier declared to be anything other than
+ an object or a function; an identifier declared to be a function parameter; a block scope
+ identifier for an object declared without the storage-class specifier extern.
+<p><!--para 7 -->
+ If, within a translation unit, the same identifier appears with both internal and external
+ linkage, the behavior is undefined.
+<p><b> Forward references</b>: declarations (<a href="#6.7">6.7</a>), expressions (<a href="#6.5">6.5</a>), external definitions (<a href="#6.9">6.9</a>),
+ statements (<a href="#6.8">6.8</a>).
+
+<p><b>Footnotes</b>
+<p><small><a name="note21" href="#note21">21)</a> There is no linkage between different identifiers.
+</small>
+<p><small><a name="note22" href="#note22">22)</a> A function declaration can contain the storage-class specifier static only if it is at file scope; see
+ <a href="#6.7.1">6.7.1</a>.
+</small>
+<p><small><a name="note23" href="#note23">23)</a> As specified in <a href="#6.2.1">6.2.1</a>, the later declaration might hide the prior declaration.
+</small>
+
+<h4><a name="6.2.3" href="#6.2.3">6.2.3 Name spaces of identifiers</a></h4>
+<p><!--para 1 -->
+ If more than one declaration of a particular identifier is visible at any point in a
+ translation unit, the syntactic context disambiguates uses that refer to different entities.
+ Thus, there are separate name spaces for various categories of identifiers, as follows:
+<ul>
+<li>  label names (disambiguated by the syntax of the label declaration and use);
+<li>  the tags of structures, unions, and enumerations (disambiguated by following any<sup><a href="#note24"><b>24)</b></a></sup>
+ of the keywords struct, union, or enum);
+<li>  the members of structures or unions; each structure or union has a separate name
+ space for its members (disambiguated by the type of the expression used to access the
+ member via the . or -&gt; operator);
+<li>  all other identifiers, called ordinary identifiers (declared in ordinary declarators or as
+ enumeration constants).
+</ul>
+<p><b> Forward references</b>: enumeration specifiers (<a href="#6.7.2.2">6.7.2.2</a>), labeled statements (<a href="#6.8.1">6.8.1</a>),
+ structure and union specifiers (<a href="#6.7.2.1">6.7.2.1</a>), structure and union members (<a href="#6.5.2.3">6.5.2.3</a>), tags
+ (<a href="#6.7.2.3">6.7.2.3</a>), the goto statement (<a href="#6.8.6.1">6.8.6.1</a>).
+<!--page 44 -->
+
+<p><b>Footnotes</b>
+<p><small><a name="note24" href="#note24">24)</a> There is only one name space for tags even though three are possible.
+</small>
+
+<h4><a name="6.2.4" href="#6.2.4">6.2.4 Storage durations of objects</a></h4>
+<p><!--para 1 -->
+ An object has a storage duration that determines its lifetime. There are three storage
+ durations: static, automatic, and allocated. Allocated storage is described in <a href="#7.20.3">7.20.3</a>.
+<p><!--para 2 -->
+ The lifetime of an object is the portion of program execution during which storage is
+ guaranteed to be reserved for it. An object exists, has a constant address,<sup><a href="#note25"><b>25)</b></a></sup> and retains
+ its last-stored value throughout its lifetime.<sup><a href="#note26"><b>26)</b></a></sup> If an object is referred to outside of its
+ lifetime, the behavior is undefined. The value of a pointer becomes indeterminate when
+ the object it points to reaches the end of its lifetime.
+<p><!--para 3 -->
+ An object whose identifier is declared with external or internal linkage, or with the
+ storage-class specifier static has static storage duration. Its lifetime is the entire
+ execution of the program and its stored value is initialized only once, prior to program
+ startup.
+<p><!--para 4 -->
+ An object whose identifier is declared with no linkage and without the storage-class
+ specifier static has automatic storage duration.
+<p><!--para 5 -->
+ For such an object that does not have a variable length array type, its lifetime extends
+ from entry into the block with which it is associated until execution of that block ends in
+ any way. (Entering an enclosed block or calling a function suspends, but does not end,
+ execution of the current block.) If the block is entered recursively, a new instance of the
+ object is created each time. The initial value of the object is indeterminate. If an
+ initialization is specified for the object, it is performed each time the declaration is
+ reached in the execution of the block; otherwise, the value becomes indeterminate each
+ time the declaration is reached.
+<p><!--para 6 -->
+ For such an object that does have a variable length array type, its lifetime extends from
+ the declaration of the object until execution of the program leaves the scope of the
+ declaration.<sup><a href="#note27"><b>27)</b></a></sup> If the scope is entered recursively, a new instance of the object is created
+ each time. The initial value of the object is indeterminate.
+<p><b> Forward references</b>: statements (<a href="#6.8">6.8</a>), function calls (<a href="#6.5.2.2">6.5.2.2</a>), declarators (<a href="#6.7.5">6.7.5</a>), array
+ declarators (<a href="#6.7.5.2">6.7.5.2</a>), initialization (<a href="#6.7.8">6.7.8</a>).
+<!--page 45 -->
+
+<p><b>Footnotes</b>
+<p><small><a name="note25" href="#note25">25)</a> The term ''constant address'' means that two pointers to the object constructed at possibly different
+ times will compare equal. The address may be different during two different executions of the same
+ program.
+</small>
+<p><small><a name="note26" href="#note26">26)</a> In the case of a volatile object, the last store need not be explicit in the program.
+</small>
+<p><small><a name="note27" href="#note27">27)</a> Leaving the innermost block containing the declaration, or jumping to a point in that block or an
+ embedded block prior to the declaration, leaves the scope of the declaration.
+</small>
+
+<h4><a name="6.2.5" href="#6.2.5">6.2.5 Types</a></h4>
+<p><!--para 1 -->
+ The meaning of a value stored in an object or returned by a function is determined by the
+ type of the expression used to access it. (An identifier declared to be an object is the
+ simplest such expression; the type is specified in the declaration of the identifier.) Types
+ are partitioned into object types (types that fully describe objects), function types (types
+ that describe functions), and incomplete types (types that describe objects but lack
+ information needed to determine their sizes).
+<p><!--para 2 -->
+ An object declared as type _Bool is large enough to store the values 0 and 1.
+<p><!--para 3 -->
+ An object declared as type char is large enough to store any member of the basic
+ execution character set. If a member of the basic execution character set is stored in a
+ char object, its value is guaranteed to be nonnegative. If any other character is stored in
+ a char object, the resulting value is implementation-defined but shall be within the range
+ of values that can be represented in that type.
+<p><!--para 4 -->
+ There are five standard signed integer types, designated as signed char, short
+ int, int, long int, and long long int. (These and other types may be
+ designated in several additional ways, as described in <a href="#6.7.2">6.7.2</a>.) There may also be
+ implementation-defined extended signed integer types.<sup><a href="#note28"><b>28)</b></a></sup> The standard and extended
+ signed integer types are collectively called signed integer types.<sup><a href="#note29"><b>29)</b></a></sup>
+<p><!--para 5 -->
+ An object declared as type signed char occupies the same amount of storage as a
+ ''plain'' char object. A ''plain'' int object has the natural size suggested by the
+ architecture of the execution environment (large enough to contain any value in the range
+ INT_MIN to INT_MAX as defined in the header <a href="#7.10">&lt;limits.h&gt;</a>).
+<p><!--para 6 -->
+ For each of the signed integer types, there is a corresponding (but different) unsigned
+ integer type (designated with the keyword unsigned) that uses the same amount of
+ storage (including sign information) and has the same alignment requirements. The type
+ _Bool and the unsigned integer types that correspond to the standard signed integer
+ types are the standard unsigned integer types. The unsigned integer types that
+ correspond to the extended signed integer types are the extended unsigned integer types.
+ The standard and extended unsigned integer types are collectively called unsigned integer
+ types.<sup><a href="#note30"><b>30)</b></a></sup>
+<!--page 46 -->
+<p><!--para 7 -->
+ The standard signed integer types and standard unsigned integer types are collectively
+ called the standard integer types, the extended signed integer types and extended
+ unsigned integer types are collectively called the extended integer types.
+<p><!--para 8 -->
+ For any two integer types with the same signedness and different integer conversion rank
+ (see <a href="#6.3.1.1">6.3.1.1</a>), the range of values of the type with smaller integer conversion rank is a
+ subrange of the values of the other type.
+<p><!--para 9 -->
+ The range of nonnegative values of a signed integer type is a subrange of the
+ corresponding unsigned integer type, and the representation of the same value in each
+ type is the same.<sup><a href="#note31"><b>31)</b></a></sup> A computation involving unsigned operands can never overflow,
+ because a result that cannot be represented by the resulting unsigned integer type is
+ reduced modulo the number that is one greater than the largest value that can be
+ represented by the resulting type.
+<p><!--para 10 -->
+ There are three real floating types, designated as float, double, and long
+ double.<sup><a href="#note32"><b>32)</b></a></sup> The set of values of the type float is a subset of the set of values of the
+ type double; the set of values of the type double is a subset of the set of values of the
+ type long double.
+<p><!--para 11 -->
+ There are three complex types, designated as float _Complex, double
+ _Complex, and long double _Complex.<sup><a href="#note33"><b>33)</b></a></sup> The real floating and complex types
+ are collectively called the floating types.
+<p><!--para 12 -->
+ For each floating type there is a corresponding real type, which is always a real floating
+ type. For real floating types, it is the same type. For complex types, it is the type given
+ by deleting the keyword _Complex from the type name.
+<p><!--para 13 -->
+ Each complex type has the same representation and alignment requirements as an array
+ type containing exactly two elements of the corresponding real type; the first element is
+ equal to the real part, and the second element to the imaginary part, of the complex
+ number.
+<p><!--para 14 -->
+ The type char, the signed and unsigned integer types, and the floating types are
+ collectively called the basic types. Even if the implementation defines two or more basic
+ types to have the same representation, they are nevertheless different types.<sup><a href="#note34"><b>34)</b></a></sup>
+<!--page 47 -->
+<p><!--para 15 -->
+ The three types char, signed char, and unsigned char are collectively called
+ the character types. The implementation shall define char to have the same range,
+ representation, and behavior as either signed char or unsigned char.<sup><a href="#note35"><b>35)</b></a></sup>
+<p><!--para 16 -->
+ An enumeration comprises a set of named integer constant values. Each distinct
+ enumeration constitutes a different enumerated type.
+<p><!--para 17 -->
+ The type char, the signed and unsigned integer types, and the enumerated types are
+ collectively called integer types. The integer and real floating types are collectively called
+ real types.
+<p><!--para 18 -->
+ Integer and floating types are collectively called arithmetic types. Each arithmetic type
+ belongs to one type domain: the real type domain comprises the real types, the complex
+ type domain comprises the complex types.
+<p><!--para 19 -->
+ The void type comprises an empty set of values; it is an incomplete type that cannot be
+ completed.
+<p><!--para 20 -->
+ Any number of derived types can be constructed from the object, function, and
+ incomplete types, as follows:
+<ul>
+<li>  An array type describes a contiguously allocated nonempty set of objects with a
+ particular member object type, called the element type.<sup><a href="#note36"><b>36)</b></a></sup> Array types are
+ characterized by their element type and by the number of elements in the array. An
+ array type is said to be derived from its element type, and if its element type is T , the
+ array type is sometimes called ''array of T ''. The construction of an array type from
+ an element type is called ''array type derivation''.
+<li>  A structure type describes a sequentially allocated nonempty set of member objects
+ (and, in certain circumstances, an incomplete array), each of which has an optionally
+ specified name and possibly distinct type.
+<li>  A union type describes an overlapping nonempty set of member objects, each of
+ which has an optionally specified name and possibly distinct type.
+<li>  A function type describes a function with specified return type. A function type is
+ characterized by its return type and the number and types of its parameters. A
+ function type is said to be derived from its return type, and if its return type is T , the
+ function type is sometimes called ''function returning T ''. The construction of a
+ function type from a return type is called ''function type derivation''.
+<!--page 48 -->
+<li>  A pointer type may be derived from a function type, an object type, or an incomplete
+ type, called the referenced type. A pointer type describes an object whose value
+ provides a reference to an entity of the referenced type. A pointer type derived from
+ the referenced type T is sometimes called ''pointer to T ''. The construction of a
+ pointer type from a referenced type is called ''pointer type derivation''.
+</ul>
+ These methods of constructing derived types can be applied recursively.
+<p><!--para 21 -->
+ Arithmetic types and pointer types are collectively called scalar types. Array and
+ structure types are collectively called aggregate types.<sup><a href="#note37"><b>37)</b></a></sup>
+<p><!--para 22 -->
+ An array type of unknown size is an incomplete type. It is completed, for an identifier of
+ that type, by specifying the size in a later declaration (with internal or external linkage).
+ A structure or union type of unknown content (as described in <a href="#6.7.2.3">6.7.2.3</a>) is an incomplete
+ type. It is completed, for all declarations of that type, by declaring the same structure or
+ union tag with its defining content later in the same scope.
+<p><!--para 23 -->
+ A type has known constant size if the type is not incomplete and is not a variable length
+ array type.
+<p><!--para 24 -->
+ Array, function, and pointer types are collectively called derived declarator types. A
+ declarator type derivation from a type T is the construction of a derived declarator type
+ from T by the application of an array-type, a function-type, or a pointer-type derivation to
+ T.
+<p><!--para 25 -->
+ A type is characterized by its type category, which is either the outermost derivation of a
+ derived type (as noted above in the construction of derived types), or the type itself if the
+ type consists of no derived types.
+<p><!--para 26 -->
+ Any type so far mentioned is an unqualified type. Each unqualified type has several
+ qualified versions of its type,<sup><a href="#note38"><b>38)</b></a></sup> corresponding to the combinations of one, two, or all
+ three of the const, volatile, and restrict qualifiers. The qualified or unqualified
+ versions of a type are distinct types that belong to the same type category and have the
+ same representation and alignment requirements.<sup><a href="#note39"><b>39)</b></a></sup> A derived type is not qualified by the
+ qualifiers (if any) of the type from which it is derived.
+<p><!--para 27 -->
+ A pointer to void shall have the same representation and alignment requirements as a
+ pointer to a character type.<sup><a href="#note39"><b>39)</b></a></sup> Similarly, pointers to qualified or unqualified versions of
+ compatible types shall have the same representation and alignment requirements. All
+<!--page 49 -->
+ pointers to structure types shall have the same representation and alignment requirements
+ as each other. All pointers to union types shall have the same representation and
+ alignment requirements as each other. Pointers to other types need not have the same
+ representation or alignment requirements.
+<p><!--para 28 -->
+ EXAMPLE 1 The type designated as ''float *'' has type ''pointer to float''. Its type category is
+ pointer, not a floating type. The const-qualified version of this type is designated as ''float * const''
+ whereas the type designated as ''const float *'' is not a qualified type -- its type is ''pointer to const-
+ qualified float'' and is a pointer to a qualified type.
+<p><!--para 29 -->
+ EXAMPLE 2 The type designated as ''struct tag (*[5])(float)'' has type ''array of pointer to
+ function returning struct tag''. The array has length five and the function has a single parameter of type
+ float. Its type category is array.
+<p><b> Forward references</b>: compatible type and composite type (<a href="#6.2.7">6.2.7</a>), declarations (<a href="#6.7">6.7</a>).
+
+<p><b>Footnotes</b>
+<p><small><a name="note28" href="#note28">28)</a> Implementation-defined keywords shall have the form of an identifier reserved for any use as
+ described in <a href="#7.1.3">7.1.3</a>.
+</small>
+<p><small><a name="note29" href="#note29">29)</a> Therefore, any statement in this Standard about signed integer types also applies to the extended
+ signed integer types.
+</small>
+<p><small><a name="note30" href="#note30">30)</a> Therefore, any statement in this Standard about unsigned integer types also applies to the extended
+ unsigned integer types.
+</small>
+<p><small><a name="note31" href="#note31">31)</a> The same representation and alignment requirements are meant to imply interchangeability as
+ arguments to functions, return values from functions, and members of unions.
+</small>
+<p><small><a name="note32" href="#note32">32)</a> See ''future language directions'' (<a href="#6.11.1">6.11.1</a>).
+</small>
+<p><small><a name="note33" href="#note33">33)</a> A specification for imaginary types is in informative <a href="#G">annex G</a>.
+</small>
+<p><small><a name="note34" href="#note34">34)</a> An implementation may define new keywords that provide alternative ways to designate a basic (or
+ any other) type; this does not violate the requirement that all basic types be different.
+ Implementation-defined keywords shall have the form of an identifier reserved for any use as
+ described in <a href="#7.1.3">7.1.3</a>.
+</small>
+<p><small><a name="note35" href="#note35">35)</a> CHAR_MIN, defined in <a href="#7.10">&lt;limits.h&gt;</a>, will have one of the values 0 or SCHAR_MIN, and this can be
+ used to distinguish the two options. Irrespective of the choice made, char is a separate type from the
+ other two and is not compatible with either.
+</small>
+<p><small><a name="note36" href="#note36">36)</a> Since object types do not include incomplete types, an array of incomplete type cannot be constructed.
+</small>
+<p><small><a name="note37" href="#note37">37)</a> Note that aggregate type does not include union type because an object with union type can only
+ contain one member at a time.
+</small>
+<p><small><a name="note38" href="#note38">38)</a> See <a href="#6.7.3">6.7.3</a> regarding qualified array and function types.
+</small>
+<p><small><a name="note39" href="#note39">39)</a> The same representation and alignment requirements are meant to imply interchangeability as
+ arguments to functions, return values from functions, and members of unions.
+</small>
+
+<h4><a name="6.2.6" href="#6.2.6">6.2.6 Representations of types</a></h4>
+
+<h5><a name="6.2.6.1" href="#6.2.6.1">6.2.6.1 General</a></h5>
+<p><!--para 1 -->
+ The representations of all types are unspecified except as stated in this subclause.
+<p><!--para 2 -->
+ Except for bit-fields, objects are composed of contiguous sequences of one or more bytes,
+ the number, order, and encoding of which are either explicitly specified or
+ implementation-defined.
+<p><!--para 3 -->
+ Values stored in unsigned bit-fields and objects of type unsigned char shall be
+ represented using a pure binary notation.<sup><a href="#note40"><b>40)</b></a></sup>
+<p><!--para 4 -->
+ Values stored in non-bit-field objects of any other object type consist of n x CHAR_BIT
+ bits, where n is the size of an object of that type, in bytes. The value may be copied into
+ an object of type unsigned char [n] (e.g., by memcpy); the resulting set of bytes is
+ called the object representation of the value. Values stored in bit-fields consist of m bits,
+ where m is the size specified for the bit-field. The object representation is the set of m
+ bits the bit-field comprises in the addressable storage unit holding it. Two values (other
+ than NaNs) with the same object representation compare equal, but values that compare
+ equal may have different object representations.
+<p><!--para 5 -->
+ Certain object representations need not represent a value of the object type. If the stored
+ value of an object has such a representation and is read by an lvalue expression that does
+ not have character type, the behavior is undefined. If such a representation is produced
+ by a side effect that modifies all or any part of the object by an lvalue expression that
+ does not have character type, the behavior is undefined.<sup><a href="#note41"><b>41)</b></a></sup> Such a representation is called
+<!--page 50 -->
+ a trap representation.
+<p><!--para 6 -->
+ When a value is stored in an object of structure or union type, including in a member
+ object, the bytes of the object representation that correspond to any padding bytes take
+ unspecified values.<sup><a href="#note42"><b>42)</b></a></sup> The value of a structure or union object is never a trap
+ representation, even though the value of a member of the structure or union object may be
+ a trap representation.
+<p><!--para 7 -->
+ When a value is stored in a member of an object of union type, the bytes of the object
+ representation that do not correspond to that member but do correspond to other members
+ take unspecified values.
+<p><!--para 8 -->
+ Where an operator is applied to a value that has more than one object representation,
+ which object representation is used shall not affect the value of the result.<sup><a href="#note43"><b>43)</b></a></sup> Where a
+ value is stored in an object using a type that has more than one object representation for
+ that value, it is unspecified which representation is used, but a trap representation shall
+ not be generated.
+<p><b> Forward references</b>: declarations (<a href="#6.7">6.7</a>), expressions (<a href="#6.5">6.5</a>), lvalues, arrays, and function
+ designators (<a href="#6.3.2.1">6.3.2.1</a>).
+
+<p><b>Footnotes</b>
+<p><small><a name="note40" href="#note40">40)</a> A positional representation for integers that uses the binary digits 0 and 1, in which the values
+ represented by successive bits are additive, begin with 1, and are multiplied by successive integral
+ powers of 2, except perhaps the bit with the highest position. (Adapted from the American National
+ Dictionary for Information Processing Systems.) A byte contains CHAR_BIT bits, and the values of
+ type unsigned char range from 0 to 2<sup>CHAR_BIT</sup>- 1.
+</small>
+<p><small><a name="note41" href="#note41">41)</a> Thus, an automatic variable can be initialized to a trap representation without causing undefined
+ behavior, but the value of the variable cannot be used until a proper value is stored in it.
+</small>
+<p><small><a name="note42" href="#note42">42)</a> Thus, for example, structure assignment need not copy any padding bits.
+</small>
+<p><small><a name="note43" href="#note43">43)</a> It is possible for objects x and y with the same effective type T to have the same value when they are
+ accessed as objects of type T, but to have different values in other contexts. In particular, if == is
+ defined for type T, then x == y does not imply that memcmp(&amp;x, &amp;y, sizeof (T)) == 0.
+ Furthermore, x == y does not necessarily imply that x and y have the same value; other operations
+ on values of type T may distinguish between them.
+</small>
+
+<h5><a name="6.2.6.2" href="#6.2.6.2">6.2.6.2 Integer types</a></h5>
+<p><!--para 1 -->
+ For unsigned integer types other than unsigned char, the bits of the object
+ representation shall be divided into two groups: value bits and padding bits (there need
+ not be any of the latter). If there are N value bits, each bit shall represent a different
+ power of 2 between 1 and 2<sup>N-1</sup> , so that objects of that type shall be capable of
+ representing values from 0 to 2<sup>N</sup> - 1 using a pure binary representation; this shall be
+ known as the value representation. The values of any padding bits are unspecified.<sup><a href="#note44"><b>44)</b></a></sup>
+<p><!--para 2 -->
+ For signed integer types, the bits of the object representation shall be divided into three
+ groups: value bits, padding bits, and the sign bit. There need not be any padding bits;
+<!--page 51 -->
+ there shall be exactly one sign bit. Each bit that is a value bit shall have the same value as
+ the same bit in the object representation of the corresponding unsigned type (if there are
+ M value bits in the signed type and N in the unsigned type, then M &lt;= N ). If the sign bit
+ is zero, it shall not affect the resulting value. If the sign bit is one, the value shall be
+ modified in one of the following ways:
+<ul>
+<li>  the corresponding value with sign bit 0 is negated (sign and magnitude);
+<li>  the sign bit has the value -(2<sup>N</sup> ) (two's complement);
+<li>  the sign bit has the value -(2<sup>N</sup> - 1) (ones' complement ).
+</ul>
+ Which of these applies is implementation-defined, as is whether the value with sign bit 1
+ and all value bits zero (for the first two), or with sign bit and all value bits 1 (for ones'
+ complement), is a trap representation or a normal value. In the case of sign and
+ magnitude and ones' complement, if this representation is a normal value it is called a
+ negative zero.
+<p><!--para 3 -->
+ If the implementation supports negative zeros, they shall be generated only by:
+<ul>
+<li>  the &amp;, |, ^, ~, &lt;&lt;, and &gt;&gt; operators with arguments that produce such a value;
+<li>  the +, -, *, /, and % operators where one argument is a negative zero and the result is
+ zero;
+<li>  compound assignment operators based on the above cases.
+</ul>
+ It is unspecified whether these cases actually generate a negative zero or a normal zero,
+ and whether a negative zero becomes a normal zero when stored in an object.
+<p><!--para 4 -->
+ If the implementation does not support negative zeros, the behavior of the &amp;, |, ^, ~, &lt;&lt;,
+ and &gt;&gt; operators with arguments that would produce such a value is undefined.
+<p><!--para 5 -->
+ The values of any padding bits are unspecified.<sup><a href="#note45"><b>45)</b></a></sup> A valid (non-trap) object representation
+ of a signed integer type where the sign bit is zero is a valid object representation of the
+ corresponding unsigned type, and shall represent the same value. For any integer type,
+ the object representation where all the bits are zero shall be a representation of the value
+ zero in that type.
+<p><!--para 6 -->
+ The precision of an integer type is the number of bits it uses to represent values,
+ excluding any sign and padding bits. The width of an integer type is the same but
+ including any sign bit; thus for unsigned integer types the two values are the same, while
+<!--page 52 -->
+ for signed integer types the width is one greater than the precision.
+
+<p><b>Footnotes</b>
+<p><small><a name="note44" href="#note44">44)</a> Some combinations of padding bits might generate trap representations, for example, if one padding
+ bit is a parity bit. Regardless, no arithmetic operation on valid values can generate a trap
+ representation other than as part of an exceptional condition such as an overflow, and this cannot occur
+ with unsigned types. All other combinations of padding bits are alternative object representations of
+ the value specified by the value bits.
+</small>
+<p><small><a name="note45" href="#note45">45)</a> Some combinations of padding bits might generate trap representations, for example, if one padding
+ bit is a parity bit. Regardless, no arithmetic operation on valid values can generate a trap
+ representation other than as part of an exceptional condition such as an overflow. All other
+ combinations of padding bits are alternative object representations of the value specified by the value
+ bits.
+</small>
+
+<h4><a name="6.2.7" href="#6.2.7">6.2.7 Compatible type and composite type</a></h4>
+<p><!--para 1 -->
+ Two types have compatible type if their types are the same. Additional rules for
+ determining whether two types are compatible are described in <a href="#6.7.2">6.7.2</a> for type specifiers,
+ in <a href="#6.7.3">6.7.3</a> for type qualifiers, and in <a href="#6.7.5">6.7.5</a> for declarators.<sup><a href="#note46"><b>46)</b></a></sup> Moreover, two structure,
+ union, or enumerated types declared in separate translation units are compatible if their
+ tags and members satisfy the following requirements: If one is declared with a tag, the
+ other shall be declared with the same tag. If both are complete types, then the following
+ additional requirements apply: there shall be a one-to-one correspondence between their
+ members such that each pair of corresponding members are declared with compatible
+ types, and such that if one member of a corresponding pair is declared with a name, the
+ other member is declared with the same name. For two structures, corresponding
+ members shall be declared in the same order. For two structures or unions, corresponding
+ bit-fields shall have the same widths. For two enumerations, corresponding members
+ shall have the same values.
+<p><!--para 2 -->
+ All declarations that refer to the same object or function shall have compatible type;
+ otherwise, the behavior is undefined.
+<p><!--para 3 -->
+ A composite type can be constructed from two types that are compatible; it is a type that
+ is compatible with both of the two types and satisfies the following conditions:
+<ul>
+<li>  If one type is an array of known constant size, the composite type is an array of that
+ size; otherwise, if one type is a variable length array, the composite type is that type.
+<li>  If only one type is a function type with a parameter type list (a function prototype),
+ the composite type is a function prototype with the parameter type list.
+<li>  If both types are function types with parameter type lists, the type of each parameter
+ in the composite parameter type list is the composite type of the corresponding
+ parameters.
+</ul>
+ These rules apply recursively to the types from which the two types are derived.
+<p><!--para 4 -->
+ For an identifier with internal or external linkage declared in a scope in which a prior
+ declaration of that identifier is visible,<sup><a href="#note47"><b>47)</b></a></sup> if the prior declaration specifies internal or
+ external linkage, the type of the identifier at the later declaration becomes the composite
+ type.
+<!--page 53 -->
+<p><!--para 5 -->
+ EXAMPLE        Given the following two file scope declarations:
+<pre>
+          int f(int (*)(), double (*)[3]);
+          int f(int (*)(char *), double (*)[]);
+</pre>
+ The resulting composite type for the function is:
+<!--page 54 -->
+<pre>
+          int f(int (*)(char *), double (*)[3]);
+</pre>
+
+<p><b>Footnotes</b>
+<p><small><a name="note46" href="#note46">46)</a> Two types need not be identical to be compatible.
+</small>
+<p><small><a name="note47" href="#note47">47)</a> As specified in <a href="#6.2.1">6.2.1</a>, the later declaration might hide the prior declaration.
+</small>
+
+<h3><a name="6.3" href="#6.3">6.3 Conversions</a></h3>
+<p><!--para 1 -->
+ Several operators convert operand values from one type to another automatically. This
+ subclause specifies the result required from such an implicit conversion, as well as those
+ that result from a cast operation (an explicit conversion). The list in <a href="#6.3.1.8">6.3.1.8</a> summarizes
+ the conversions performed by most ordinary operators; it is supplemented as required by
+ the discussion of each operator in <a href="#6.5">6.5</a>.
+<p><!--para 2 -->
+ Conversion of an operand value to a compatible type causes no change to the value or the
+ representation.
+<p><b> Forward references</b>: cast operators (<a href="#6.5.4">6.5.4</a>).
+
+<h4><a name="6.3.1" href="#6.3.1">6.3.1 Arithmetic operands</a></h4>
+
+<h5><a name="6.3.1.1" href="#6.3.1.1">6.3.1.1 Boolean, characters, and integers</a></h5>
+<p><!--para 1 -->
+ Every integer type has an integer conversion rank defined as follows:
+<ul>
+<li>  No two signed integer types shall have the same rank, even if they have the same
+ representation.
+<li>  The rank of a signed integer type shall be greater than the rank of any signed integer
+ type with less precision.
+<li>  The rank of long long int shall be greater than the rank of long int, which
+ shall be greater than the rank of int, which shall be greater than the rank of short
+ int, which shall be greater than the rank of signed char.
+<li>  The rank of any unsigned integer type shall equal the rank of the corresponding
+ signed integer type, if any.
+<li>  The rank of any standard integer type shall be greater than the rank of any extended
+ integer type with the same width.
+<li>  The rank of char shall equal the rank of signed char and unsigned char.
+<li>  The rank of _Bool shall be less than the rank of all other standard integer types.
+<li>  The rank of any enumerated type shall equal the rank of the compatible integer type
+ (see <a href="#6.7.2.2">6.7.2.2</a>).
+<li>  The rank of any extended signed integer type relative to another extended signed
+ integer type with the same precision is implementation-defined, but still subject to the
+ other rules for determining the integer conversion rank.
+<li>  For all integer types T1, T2, and T3, if T1 has greater rank than T2 and T2 has
+ greater rank than T3, then T1 has greater rank than T3.
+</ul>
+<p><!--para 2 -->
+ The following may be used in an expression wherever an int or unsigned int may
+ be used:
+<!--page 55 -->
+<ul>
+<li>  An object or expression with an integer type whose integer conversion rank is less
+ than or equal to the rank of int and unsigned int.
+<li>  A bit-field of type _Bool, int, signed int, or unsigned int.
+</ul>
+ If an int can represent all values of the original type, the value is converted to an int;
+ otherwise, it is converted to an unsigned int. These are called the integer
+ promotions.<sup><a href="#note48"><b>48)</b></a></sup> All other types are unchanged by the integer promotions.
+<p><!--para 3 -->
+ The integer promotions preserve value including sign. As discussed earlier, whether a
+ ''plain'' char is treated as signed is implementation-defined.
+<p><b> Forward references</b>: enumeration specifiers (<a href="#6.7.2.2">6.7.2.2</a>), structure and union specifiers
+ (<a href="#6.7.2.1">6.7.2.1</a>).
+
+<p><b>Footnotes</b>
+<p><small><a name="note48" href="#note48">48)</a> The integer promotions are applied only: as part of the usual arithmetic conversions, to certain
+ argument expressions, to the operands of the unary +, -, and ~ operators, and to both operands of the
+ shift operators, as specified by their respective subclauses.
+</small>
+
+<h5><a name="6.3.1.2" href="#6.3.1.2">6.3.1.2 Boolean type</a></h5>
+<p><!--para 1 -->
+ When any scalar value is converted to _Bool, the result is 0 if the value compares equal
+ to 0; otherwise, the result is 1.
+
+<h5><a name="6.3.1.3" href="#6.3.1.3">6.3.1.3 Signed and unsigned integers</a></h5>
+<p><!--para 1 -->
+ When a value with integer type is converted to another integer type other than _Bool, if
+ the value can be represented by the new type, it is unchanged.
+<p><!--para 2 -->
+ Otherwise, if the new type is unsigned, the value is converted by repeatedly adding or
+ subtracting one more than the maximum value that can be represented in the new type
+ until the value is in the range of the new type.<sup><a href="#note49"><b>49)</b></a></sup>
+<p><!--para 3 -->
+ Otherwise, the new type is signed and the value cannot be represented in it; either the
+ result is implementation-defined or an implementation-defined signal is raised.
+
+<p><b>Footnotes</b>
+<p><small><a name="note49" href="#note49">49)</a> The rules describe arithmetic on the mathematical value, not the value of a given type of expression.
+</small>
+
+<h5><a name="6.3.1.4" href="#6.3.1.4">6.3.1.4 Real floating and integer</a></h5>
+<p><!--para 1 -->
+ When a finite value of real floating type is converted to an integer type other than _Bool,
+ the fractional part is discarded (i.e., the value is truncated toward zero). If the value of
+ the integral part cannot be represented by the integer type, the behavior is undefined.<sup><a href="#note50"><b>50)</b></a></sup>
+<p><!--para 2 -->
+ When a value of integer type is converted to a real floating type, if the value being
+ converted can be represented exactly in the new type, it is unchanged. If the value being
+ converted is in the range of values that can be represented but cannot be represented
+<!--page 56 -->
+ exactly, the result is either the nearest higher or nearest lower representable value, chosen
+ in an implementation-defined manner. If the value being converted is outside the range of
+ values that can be represented, the behavior is undefined.
+
+<p><b>Footnotes</b>
+<p><small><a name="note50" href="#note50">50)</a> The remaindering operation performed when a value of integer type is converted to unsigned type
+ need not be performed when a value of real floating type is converted to unsigned type. Thus, the
+ range of portable real floating values is (-1, Utype_MAX+1).
+</small>
+
+<h5><a name="6.3.1.5" href="#6.3.1.5">6.3.1.5 Real floating types</a></h5>
+<p><!--para 1 -->
+ When a float is promoted to double or long double, or a double is promoted
+ to long double, its value is unchanged (if the source value is represented in the
+ precision and range of its type).
+<p><!--para 2 -->
+ When a double is demoted to float, a long double is demoted to double or
+ float, or a value being represented in greater precision and range than required by its
+ semantic type (see <a href="#6.3.1.8">6.3.1.8</a>) is explicitly converted (including to its own type), if the value
+ being converted can be represented exactly in the new type, it is unchanged. If the value
+ being converted is in the range of values that can be represented but cannot be
+ represented exactly, the result is either the nearest higher or nearest lower representable
+ value, chosen in an implementation-defined manner. If the value being converted is
+ outside the range of values that can be represented, the behavior is undefined.
+
+<h5><a name="6.3.1.6" href="#6.3.1.6">6.3.1.6 Complex types</a></h5>
+<p><!--para 1 -->
+ When a value of complex type is converted to another complex type, both the real and
+ imaginary parts follow the conversion rules for the corresponding real types.
+
+<h5><a name="6.3.1.7" href="#6.3.1.7">6.3.1.7 Real and complex</a></h5>
+<p><!--para 1 -->
+ When a value of real type is converted to a complex type, the real part of the complex
+ result value is determined by the rules of conversion to the corresponding real type and
+ the imaginary part of the complex result value is a positive zero or an unsigned zero.
+<p><!--para 2 -->
+ When a value of complex type is converted to a real type, the imaginary part of the
+ complex value is discarded and the value of the real part is converted according to the
+ conversion rules for the corresponding real type.
+
+<h5><a name="6.3.1.8" href="#6.3.1.8">6.3.1.8 Usual arithmetic conversions</a></h5>
+<p><!--para 1 -->
+ Many operators that expect operands of arithmetic type cause conversions and yield result
+ types in a similar way. The purpose is to determine a common real type for the operands
+ and result. For the specified operands, each operand is converted, without change of type
+ domain, to a type whose corresponding real type is the common real type. Unless
+ explicitly stated otherwise, the common real type is also the corresponding real type of
+ the result, whose type domain is the type domain of the operands if they are the same,
+ and complex otherwise. This pattern is called the usual arithmetic conversions:
+<!--page 57 -->
+<ul>
+<li>       First, if the corresponding real type of either operand is long double, the other
+       operand is converted, without change of type domain, to a type whose
+       corresponding real type is long double.
+<li>       Otherwise, if the corresponding real type of either operand is double, the other
+       operand is converted, without change of type domain, to a type whose
+       corresponding real type is double.
+<li>       Otherwise, if the corresponding real type of either operand is float, the other
+       operand is converted, without change of type domain, to a type whose
+       corresponding real type is float.<sup><a href="#note51"><b>51)</b></a></sup>
+<li>       Otherwise, the integer promotions are performed on both operands. Then the
+       following rules are applied to the promoted operands:
+<ul>
+<li>              If both operands have the same type, then no further conversion is needed.
+<li>              Otherwise, if both operands have signed integer types or both have unsigned
+              integer types, the operand with the type of lesser integer conversion rank is
+              converted to the type of the operand with greater rank.
+<li>              Otherwise, if the operand that has unsigned integer type has rank greater or
+              equal to the rank of the type of the other operand, then the operand with
+              signed integer type is converted to the type of the operand with unsigned
+              integer type.
+<li>              Otherwise, if the type of the operand with signed integer type can represent
+              all of the values of the type of the operand with unsigned integer type, then
+              the operand with unsigned integer type is converted to the type of the
+              operand with signed integer type.
+<li>              Otherwise, both operands are converted to the unsigned integer type
+              corresponding to the type of the operand with signed integer type.
+</ul>
+</ul>
+<p><!--para 2 -->
+ The values of floating operands and of the results of floating expressions may be
+ represented in greater precision and range than that required by the type; the types are not
+ changed thereby.<sup><a href="#note52"><b>52)</b></a></sup>
+<!--page 58 -->
+
+<p><b>Footnotes</b>
+<p><small><a name="note51" href="#note51">51)</a> For example, addition of a double _Complex and a float entails just the conversion of the
+ float operand to double (and yields a double _Complex result).
+</small>
+<p><small><a name="note52" href="#note52">52)</a> The cast and assignment operators are still required to perform their specified conversions as
+ described in <a href="#6.3.1.4">6.3.1.4</a> and <a href="#6.3.1.5">6.3.1.5</a>.
+</small>
+
+<h4><a name="6.3.2" href="#6.3.2">6.3.2 Other operands</a></h4>
+
+<h5><a name="6.3.2.1" href="#6.3.2.1">6.3.2.1 Lvalues, arrays, and function designators</a></h5>
+<p><!--para 1 -->
+ An lvalue is an expression with an object type or an incomplete type other than void;<sup><a href="#note53"><b>53)</b></a></sup>
+ if an lvalue does not designate an object when it is evaluated, the behavior is undefined.
+ When an object is said to have a particular type, the type is specified by the lvalue used to
+ designate the object. A modifiable lvalue is an lvalue that does not have array type, does
+ not have an incomplete type, does not have a const-qualified type, and if it is a structure
+ or union, does not have any member (including, recursively, any member or element of
+ all contained aggregates or unions) with a const-qualified type.
+<p><!--para 2 -->
+ Except when it is the operand of the sizeof operator, the unary &amp; operator, the ++
+ operator, the -- operator, or the left operand of the . operator or an assignment operator,
+ an lvalue that does not have array type is converted to the value stored in the designated
+ object (and is no longer an lvalue). If the lvalue has qualified type, the value has the
+ unqualified version of the type of the lvalue; otherwise, the value has the type of the
+ lvalue. If the lvalue has an incomplete type and does not have array type, the behavior is
+ undefined.
+<p><!--para 3 -->
+ Except when it is the operand of the sizeof operator or the unary &amp; operator, or is a
+ string literal used to initialize an array, an expression that has type ''array of type'' is
+ converted to an expression with type ''pointer to type'' that points to the initial element of
+ the array object and is not an lvalue. If the array object has register storage class, the
+ behavior is undefined.
+<p><!--para 4 -->
+ A function designator is an expression that has function type. Except when it is the
+ operand of the sizeof operator<sup><a href="#note54"><b>54)</b></a></sup> or the unary &amp; operator, a function designator with
+ type ''function returning type'' is converted to an expression that has type ''pointer to
+ function returning type''.
+<p><b> Forward references</b>: address and indirection operators (<a href="#6.5.3.2">6.5.3.2</a>), assignment operators
+ (<a href="#6.5.16">6.5.16</a>), common definitions <a href="#7.17">&lt;stddef.h&gt;</a> (<a href="#7.17">7.17</a>), initialization (<a href="#6.7.8">6.7.8</a>), postfix
+ increment and decrement operators (<a href="#6.5.2.4">6.5.2.4</a>), prefix increment and decrement operators
+ (<a href="#6.5.3.1">6.5.3.1</a>), the sizeof operator (<a href="#6.5.3.4">6.5.3.4</a>), structure and union members (<a href="#6.5.2.3">6.5.2.3</a>).
+<!--page 59 -->
+
+<p><b>Footnotes</b>
+<p><small><a name="note53" href="#note53">53)</a> The name ''lvalue'' comes originally from the assignment expression E1 = E2, in which the left
+ operand E1 is required to be a (modifiable) lvalue. It is perhaps better considered as representing an
+ object ''locator value''. What is sometimes called ''rvalue'' is in this International Standard described
+ as the ''value of an expression''.
+  An obvious example of an lvalue is an identifier of an object. As a further example, if E is a unary
+  expression that is a pointer to an object, *E is an lvalue that designates the object to which E points.
+</small>
+<p><small><a name="note54" href="#note54">54)</a> Because this conversion does not occur, the operand of the sizeof operator remains a function
+ designator and violates the constraint in <a href="#6.5.3.4">6.5.3.4</a>.
+</small>
+
+<h5><a name="6.3.2.2" href="#6.3.2.2">6.3.2.2 void</a></h5>
+<p><!--para 1 -->
+ The (nonexistent) value of a void expression (an expression that has type void) shall not
+ be used in any way, and implicit or explicit conversions (except to void) shall not be
+ applied to such an expression. If an expression of any other type is evaluated as a void
+ expression, its value or designator is discarded. (A void expression is evaluated for its
+ side effects.)
+
+<h5><a name="6.3.2.3" href="#6.3.2.3">6.3.2.3 Pointers</a></h5>
+<p><!--para 1 -->
+ A pointer to void may be converted to or from a pointer to any incomplete or object
+ type. A pointer to any incomplete or object type may be converted to a pointer to void
+ and back again; the result shall compare equal to the original pointer.
+<p><!--para 2 -->
+ For any qualifier q, a pointer to a non-q-qualified type may be converted to a pointer to
+ the q-qualified version of the type; the values stored in the original and converted pointers
+ shall compare equal.
+<p><!--para 3 -->
+ An integer constant expression with the value 0, or such an expression cast to type
+ void *, is called a null pointer constant.<sup><a href="#note55"><b>55)</b></a></sup> If a null pointer constant is converted to a
+ pointer type, the resulting pointer, called a null pointer, is guaranteed to compare unequal
+ to a pointer to any object or function.
+<p><!--para 4 -->
+ Conversion of a null pointer to another pointer type yields a null pointer of that type.
+ Any two null pointers shall compare equal.
+<p><!--para 5 -->
+ An integer may be converted to any pointer type. Except as previously specified, the
+ result is implementation-defined, might not be correctly aligned, might not point to an
+ entity of the referenced type, and might be a trap representation.<sup><a href="#note56"><b>56)</b></a></sup>
+<p><!--para 6 -->
+ Any pointer type may be converted to an integer type. Except as previously specified, the
+ result is implementation-defined. If the result cannot be represented in the integer type,
+ the behavior is undefined. The result need not be in the range of values of any integer
+ type.
+<p><!--para 7 -->
+ A pointer to an object or incomplete type may be converted to a pointer to a different
+ object or incomplete type. If the resulting pointer is not correctly aligned<sup><a href="#note57"><b>57)</b></a></sup> for the
+ pointed-to type, the behavior is undefined. Otherwise, when converted back again, the
+ result shall compare equal to the original pointer. When a pointer to an object is
+<!--page 60 -->
+ converted to a pointer to a character type, the result points to the lowest addressed byte of
+ the object. Successive increments of the result, up to the size of the object, yield pointers
+ to the remaining bytes of the object.
+<p><!--para 8 -->
+ A pointer to a function of one type may be converted to a pointer to a function of another
+ type and back again; the result shall compare equal to the original pointer. If a converted
+ pointer is used to call a function whose type is not compatible with the pointed-to type,
+ the behavior is undefined.
+<p><b> Forward references</b>: cast operators (<a href="#6.5.4">6.5.4</a>), equality operators (<a href="#6.5.9">6.5.9</a>), integer types
+ capable of holding object pointers (<a href="#7.18.1.4">7.18.1.4</a>), simple assignment (<a href="#6.5.16.1">6.5.16.1</a>).
+<!--page 61 -->
+
+<p><b>Footnotes</b>
+<p><small><a name="note55" href="#note55">55)</a> The macro NULL is defined in <a href="#7.17">&lt;stddef.h&gt;</a> (and other headers) as a null pointer constant; see <a href="#7.17">7.17</a>.
+</small>
+<p><small><a name="note56" href="#note56">56)</a> The mapping functions for converting a pointer to an integer or an integer to a pointer are intended to
+ be consistent with the addressing structure of the execution environment.
+</small>
+<p><small><a name="note57" href="#note57">57)</a> In general, the concept ''correctly aligned'' is transitive: if a pointer to type A is correctly aligned for a
+ pointer to type B, which in turn is correctly aligned for a pointer to type C, then a pointer to type A is
+ correctly aligned for a pointer to type C.
+</small>
+
+<h3><a name="6.4" href="#6.4">6.4 Lexical elements</a></h3>
+<p><b>Syntax</b>
+<p><!--para 1 -->
+<pre>
+          token:
+                   keyword
+                   identifier
+                   constant
+                   string-literal
+                   punctuator
+          preprocessing-token:
+                 header-name
+                 identifier
+                 pp-number
+                 character-constant
+                 string-literal
+                 punctuator
+                 each non-white-space character that cannot be one of the above
+</pre>
+<p><b>Constraints</b>
+<p><!--para 2 -->
+ Each preprocessing token that is converted to a token shall have the lexical form of a
+ keyword, an identifier, a constant, a string literal, or a punctuator.
+<p><b>Semantics</b>
+<p><!--para 3 -->
+ A token is the minimal lexical element of the language in translation phases 7 and 8. The
+ categories of tokens are: keywords, identifiers, constants, string literals, and punctuators.
+ A preprocessing token is the minimal lexical element of the language in translation
+ phases 3 through 6. The categories of preprocessing tokens are: header names,
+ identifiers, preprocessing numbers, character constants, string literals, punctuators, and
+ single non-white-space characters that do not lexically match the other preprocessing
+ token categories.<sup><a href="#note58"><b>58)</b></a></sup> If a ' or a " character matches the last category, the behavior is
+ undefined. Preprocessing tokens can be separated by white space; this consists of
+ comments (described later), or white-space characters (space, horizontal tab, new-line,
+ vertical tab, and form-feed), or both. As described in <a href="#6.10">6.10</a>, in certain circumstances
+ during translation phase 4, white space (or the absence thereof) serves as more than
+ preprocessing token separation. White space may appear within a preprocessing token
+ only as part of a header name or between the quotation characters in a character constant
+ or string literal.
+<!--page 62 -->
+<p><!--para 4 -->
+ If the input stream has been parsed into preprocessing tokens up to a given character, the
+ next preprocessing token is the longest sequence of characters that could constitute a
+ preprocessing token. There is one exception to this rule: header name preprocessing
+ tokens are recognized only within #include preprocessing directives and in
+ implementation-defined locations within #pragma directives. In such contexts, a
+ sequence of characters that could be either a header name or a string literal is recognized
+ as the former.
+<p><!--para 5 -->
+ EXAMPLE 1 The program fragment 1Ex is parsed as a preprocessing number token (one that is not a
+ valid floating or integer constant token), even though a parse as the pair of preprocessing tokens 1 and Ex
+ might produce a valid expression (for example, if Ex were a macro defined as +1). Similarly, the program
+ fragment 1E1 is parsed as a preprocessing number (one that is a valid floating constant token), whether or
+ not E is a macro name.
+<p><!--para 6 -->
+ EXAMPLE 2 The program fragment x+++++y is parsed as x ++ ++ + y, which violates a constraint on
+ increment operators, even though the parse x ++ + ++ y might yield a correct expression.
+<p><b> Forward references</b>: character constants (<a href="#6.4.4.4">6.4.4.4</a>), comments (<a href="#6.4.9">6.4.9</a>), expressions (<a href="#6.5">6.5</a>),
+ floating constants (<a href="#6.4.4.2">6.4.4.2</a>), header names (<a href="#6.4.7">6.4.7</a>), macro replacement (<a href="#6.10.3">6.10.3</a>), postfix
+ increment and decrement operators (<a href="#6.5.2.4">6.5.2.4</a>), prefix increment and decrement operators
+ (<a href="#6.5.3.1">6.5.3.1</a>), preprocessing directives (<a href="#6.10">6.10</a>), preprocessing numbers (<a href="#6.4.8">6.4.8</a>), string literals
+ (<a href="#6.4.5">6.4.5</a>).
+
+<p><b>Footnotes</b>
+<p><small><a name="note58" href="#note58">58)</a> An additional category, placemarkers, is used internally in translation phase 4 (see <a href="#6.10.3.3">6.10.3.3</a>); it cannot
+ occur in source files.
+</small>
+
+<h4><a name="6.4.1" href="#6.4.1">6.4.1 Keywords</a></h4>
+<p><b>Syntax</b>
+<p><!--para 1 -->
+<pre>
+          keyword: one of
+                auto                    enum                  restrict              unsigned
+                break                   extern                return                void
+                case                    float                 short                 volatile
+                char                    for                   signed                while
+                const                   goto                  sizeof                _Bool
+                continue                if                    static                _Complex
+                default                 inline                struct                _Imaginary
+                do                      int                   switch
+                double                  long                  typedef
+                else                    register              union
+</pre>
+<p><b>Semantics</b>
+<p><!--para 2 -->
+ The above tokens (case sensitive) are reserved (in translation phases 7 and 8) for use as
+ keywords, and shall not be used otherwise. The keyword _Imaginary is reserved for
+ specifying imaginary types.<sup><a href="#note59"><b>59)</b></a></sup>
+<!--page 63 -->
+
+<p><b>Footnotes</b>
+<p><small><a name="note59" href="#note59">59)</a> One possible specification for imaginary types appears in <a href="#G">annex G</a>.
+</small>
+
+<h4><a name="6.4.2" href="#6.4.2">6.4.2 Identifiers</a></h4>
+
+<h5><a name="6.4.2.1" href="#6.4.2.1">6.4.2.1 General</a></h5>
+<p><b>Syntax</b>
+<p><!--para 1 -->
+<pre>
+          identifier:
+                 identifier-nondigit
+                  identifier identifier-nondigit
+                 identifier digit
+          identifier-nondigit:
+                  nondigit
+                  universal-character-name
+                 other implementation-defined characters
+          nondigit: one of
+                 _ a b            c    d    e    f     g    h    i    j     k    l    m
+                     n o          p    q    r    s     t    u    v    w     x    y    z
+                     A B          C    D    E    F     G    H    I    J     K    L    M
+                     N O          P    Q    R    S     T    U    V    W     X    Y    Z
+          digit: one of
+                 0 1        2     3    4    5    6     7    8    9
+</pre>
+<p><b>Semantics</b>
+<p><!--para 2 -->
+ An identifier is a sequence of nondigit characters (including the underscore _, the
+ lowercase and uppercase Latin letters, and other characters) and digits, which designates
+ one or more entities as described in <a href="#6.2.1">6.2.1</a>. Lowercase and uppercase letters are distinct.
+ There is no specific limit on the maximum length of an identifier.
+<p><!--para 3 -->
+ Each universal character name in an identifier shall designate a character whose encoding
+ in ISO/IEC 10646 falls into one of the ranges specified in <a href="#D">annex D</a>.<sup><a href="#note60"><b>60)</b></a></sup> The initial
+ character shall not be a universal character name designating a digit. An implementation
+ may allow multibyte characters that are not part of the basic source character set to
+ appear in identifiers; which characters and their correspondence to universal character
+ names is implementation-defined.
+<p><!--para 4 -->
+ When preprocessing tokens are converted to tokens during translation phase 7, if a
+ preprocessing token could be converted to either a keyword or an identifier, it is converted
+ to a keyword.
+<!--page 64 -->
+<p><b>Implementation limits</b>
+<p><!--para 5 -->
+ As discussed in <a href="#5.2.4.1">5.2.4.1</a>, an implementation may limit the number of significant initial
+ characters in an identifier; the limit for an external name (an identifier that has external
+ linkage) may be more restrictive than that for an internal name (a macro name or an
+ identifier that does not have external linkage). The number of significant characters in an
+ identifier is implementation-defined.
+<p><!--para 6 -->
+ Any identifiers that differ in a significant character are different identifiers. If two
+ identifiers differ only in nonsignificant characters, the behavior is undefined.
+<p><b> Forward references</b>: universal character names (<a href="#6.4.3">6.4.3</a>), macro replacement (<a href="#6.10.3">6.10.3</a>).
+
+<p><b>Footnotes</b>
+<p><small><a name="note60" href="#note60">60)</a> On systems in which linkers cannot accept extended characters, an encoding of the universal character
+ name may be used in forming valid external identifiers. For example, some otherwise unused
+ character or sequence of characters may be used to encode the \u in a universal character name.
+ Extended characters may produce a long external identifier.
+</small>
+
+<h5><a name="6.4.2.2" href="#6.4.2.2">6.4.2.2 Predefined identifiers</a></h5>
+<p><b>Semantics</b>
+<p><!--para 1 -->
+ The identifier __func__ shall be implicitly declared by the translator as if,
+ immediately following the opening brace of each function definition, the declaration
+<pre>
+          static const char __func__[] = "function-name";
+</pre>
+ appeared, where function-name is the name of the lexically-enclosing function.<sup><a href="#note61"><b>61)</b></a></sup>
+<p><!--para 2 -->
+ This name is encoded as if the implicit declaration had been written in the source
+ character set and then translated into the execution character set as indicated in translation
+ phase 5.
+<p><!--para 3 -->
+ EXAMPLE        Consider the code fragment:
+<pre>
+          #include <a href="#7.19">&lt;stdio.h&gt;</a>
+          void myfunc(void)
+          {
+                printf("%s\n", __func__);
+                /* ... */
+          }
+</pre>
+ Each time the function is called, it will print to the standard output stream:
+<pre>
+          myfunc
+</pre>
+<p><b> Forward references</b>: function definitions (<a href="#6.9.1">6.9.1</a>).
+<!--page 65 -->
+
+<p><b>Footnotes</b>
+<p><small><a name="note61" href="#note61">61)</a> Since the name __func__ is reserved for any use by the implementation (<a href="#7.1.3">7.1.3</a>), if any other
+ identifier is explicitly declared using the name __func__, the behavior is undefined.
+</small>
+
+<h4><a name="6.4.3" href="#6.4.3">6.4.3 Universal character names</a></h4>
+<p><b>Syntax</b>
+<p><!--para 1 -->
+<pre>
+          universal-character-name:
+                 \u hex-quad
+                 \U hex-quad hex-quad
+          hex-quad:
+                 hexadecimal-digit hexadecimal-digit
+                              hexadecimal-digit hexadecimal-digit
+</pre>
+<p><b>Constraints</b>
+<p><!--para 2 -->
+ A universal character name shall not specify a character whose short identifier is less than
+ 00A0 other than 0024 ($), 0040 (@), or 0060 ('), nor one in the range D800 through
+ DFFF inclusive.<sup><a href="#note62"><b>62)</b></a></sup>
+<p><b>Description</b>
+<p><!--para 3 -->
+ Universal character names may be used in identifiers, character constants, and string
+ literals to designate characters that are not in the basic character set.
+<p><b>Semantics</b>
+<p><!--para 4 -->
+ The universal character name \Unnnnnnnn designates the character whose eight-digit
+ short identifier (as specified by ISO/IEC 10646) is nnnnnnnn.<sup><a href="#note63"><b>63)</b></a></sup> Similarly, the universal
+ character name \unnnn designates the character whose four-digit short identifier is nnnn
+ (and whose eight-digit short identifier is 0000nnnn).
+<!--page 66 -->
+
+<p><b>Footnotes</b>
+<p><small><a name="note62" href="#note62">62)</a> The disallowed characters are the characters in the basic character set and the code positions reserved
+ by ISO/IEC 10646 for control characters, the character DELETE, and the S-zone (reserved for use by
+ UTF-16).
+</small>
+<p><small><a name="note63" href="#note63">63)</a> Short identifiers for characters were first specified in ISO/IEC 10646-1/AMD9:1997.
+</small>
+
+<h4><a name="6.4.4" href="#6.4.4">6.4.4 Constants</a></h4>
+<p><b>Syntax</b>
+<p><!--para 1 -->
+<pre>
+          constant:
+                 integer-constant
+                 floating-constant
+                 enumeration-constant
+                 character-constant
+</pre>
+<p><b>Constraints</b>
+<p><!--para 2 -->
+ Each constant shall have a type and the value of a constant shall be in the range of
+ representable values for its type.
+<p><b>Semantics</b>
+<p><!--para 3 -->
+ Each constant has a type, determined by its form and value, as detailed later.
+
+<h5><a name="6.4.4.1" href="#6.4.4.1">6.4.4.1 Integer constants</a></h5>
+<p><b>Syntax</b>
+<p><!--para 1 -->
+<!--page 67 -->
+<pre>
+          integer-constant:
+                  decimal-constant integer-suffix<sub>opt</sub>
+                  octal-constant integer-suffix<sub>opt</sub>
+                  hexadecimal-constant integer-suffix<sub>opt</sub>
+          decimal-constant:
+                nonzero-digit
+                decimal-constant digit
+          octal-constant:
+                 0
+                 octal-constant octal-digit
+          hexadecimal-constant:
+                hexadecimal-prefix hexadecimal-digit
+                hexadecimal-constant hexadecimal-digit
+          hexadecimal-prefix: one of
+                0x 0X
+          nonzero-digit: one of
+                 1 2 3 4          5     6     7   8    9
+          octal-digit: one of
+                  0 1 2 3         4     5     6   7
+        hexadecimal-digit:   one of
+              0 1 2           3 4      5    6   7     8   9
+              a b c           d e      f
+              A B C           D E      F
+        integer-suffix:
+                unsigned-suffix long-suffix<sub>opt</sub>
+                unsigned-suffix long-long-suffix
+                long-suffix unsigned-suffix<sub>opt</sub>
+                long-long-suffix unsigned-suffix<sub>opt</sub>
+        unsigned-suffix: one of
+               u U
+        long-suffix: one of
+               l L
+        long-long-suffix: one of
+               ll LL
+</pre>
+<p><b>Description</b>
+<p><!--para 2 -->
+ An integer constant begins with a digit, but has no period or exponent part. It may have a
+ prefix that specifies its base and a suffix that specifies its type.
+<p><!--para 3 -->
+ A decimal constant begins with a nonzero digit and consists of a sequence of decimal
+ digits. An octal constant consists of the prefix 0 optionally followed by a sequence of the
+ digits 0 through 7 only. A hexadecimal constant consists of the prefix 0x or 0X followed
+ by a sequence of the decimal digits and the letters a (or A) through f (or F) with values
+ 10 through 15 respectively.
+<p><b>Semantics</b>
+<p><!--para 4 -->
+ The value of a decimal constant is computed base 10; that of an octal constant, base 8;
+ that of a hexadecimal constant, base 16. The lexically first digit is the most significant.
+<p><!--para 5 -->
+ The type of an integer constant is the first of the corresponding list in which its value can
+ be represented.
+<!--page 68 -->
+<table border=1>
+<tr><th> Suffix           <th>Decimal Constant           <th>Octal or Hexadecimal Constant
+<tr><td> none
+<td><pre>
+int
+long int
+long long int
+</pre>
+<td><pre>
+int
+unsigned int
+long int
+unsigned long int
+long long int
+unsigned long long int
+</pre>
+<tr><td> u or U
+<td><pre>
+unsigned int
+unsigned long int
+unsigned long long int
+</pre>
+<td><pre>
+unsigned int
+unsigned long int
+unsigned long long int
+</pre>
+<tr><td> l or L
+<td><pre>
+long int
+long long int
+</pre>
+<td><pre>
+long int
+unsigned long int
+long long int
+unsigned long long int
+</pre>
+<tr><td> Both u or U and l or L
+<td><pre>
+unsigned long int
+unsigned long long int
+</pre>
+<td><pre>
+unsigned long int
+unsigned long long int
+</pre>
+<tr><td> ll or LL
+<td><pre>
+long long int
+</pre>
+<td><pre>
+long long int
+unsigned long long int
+</pre>
+<tr><td> Both u or U and ll or LL
+<td><pre>
+unsigned long long int
+</pre>
+<td><pre>
+unsigned long long int
+</pre>
+</table>
+<p><!--para 6 -->
+ If an integer constant cannot be represented by any type in its list, it may have an
+ extended integer type, if the extended integer type can represent its value. If all of the
+ types in the list for the constant are signed, the extended integer type shall be signed. If
+ all of the types in the list for the constant are unsigned, the extended integer type shall be
+ unsigned. If the list contains both signed and unsigned types, the extended integer type
+ may be signed or unsigned. If an integer constant cannot be represented by any type in
+ its list and has no extended integer type, then the integer constant has no type.
+<!--page 69 -->
+
+<h5><a name="6.4.4.2" href="#6.4.4.2">6.4.4.2 Floating constants</a></h5>
+<p><b>Syntax</b>
+<p><!--para 1 -->
+<!--page 70 -->
+<pre>
+          floating-constant:
+                 decimal-floating-constant
+                 hexadecimal-floating-constant
+          decimal-floating-constant:
+                fractional-constant exponent-part<sub>opt</sub> floating-suffix<sub>opt</sub>
+                digit-sequence exponent-part floating-suffix<sub>opt</sub>
+          hexadecimal-floating-constant:
+                hexadecimal-prefix hexadecimal-fractional-constant
+                               binary-exponent-part floating-suffix<sub>opt</sub>
+                hexadecimal-prefix hexadecimal-digit-sequence
+                               binary-exponent-part floating-suffix<sub>opt</sub>
+          fractional-constant:
+                  digit-sequence<sub>opt</sub> . digit-sequence
+                  digit-sequence .
+          exponent-part:
+                e sign<sub>opt</sub> digit-sequence
+                E sign<sub>opt</sub> digit-sequence
+          sign: one of
+                 + -
+          digit-sequence:
+                  digit
+                  digit-sequence digit
+          hexadecimal-fractional-constant:
+                hexadecimal-digit-sequence<sub>opt</sub> .
+                               hexadecimal-digit-sequence
+                hexadecimal-digit-sequence .
+          binary-exponent-part:
+                 p sign<sub>opt</sub> digit-sequence
+                 P sign<sub>opt</sub> digit-sequence
+          hexadecimal-digit-sequence:
+                hexadecimal-digit
+                hexadecimal-digit-sequence hexadecimal-digit
+          floating-suffix: one of
+                 f l F L
+</pre>
+<p><b>Description</b>
+<p><!--para 2 -->
+ A floating constant has a significand part that may be followed by an exponent part and a
+ suffix that specifies its type. The components of the significand part may include a digit
+ sequence representing the whole-number part, followed by a period (.), followed by a
+ digit sequence representing the fraction part. The components of the exponent part are an
+ e, E, p, or P followed by an exponent consisting of an optionally signed digit sequence.
+ Either the whole-number part or the fraction part has to be present; for decimal floating
+ constants, either the period or the exponent part has to be present.
+<p><b>Semantics</b>
+<p><!--para 3 -->
+ The significand part is interpreted as a (decimal or hexadecimal) rational number; the
+ digit sequence in the exponent part is interpreted as a decimal integer. For decimal
+ floating constants, the exponent indicates the power of 10 by which the significand part is
+ to be scaled. For hexadecimal floating constants, the exponent indicates the power of 2
+ by which the significand part is to be scaled. For decimal floating constants, and also for
+ hexadecimal floating constants when FLT_RADIX is not a power of 2, the result is either
+ the nearest representable value, or the larger or smaller representable value immediately
+ adjacent to the nearest representable value, chosen in an implementation-defined manner.
+ For hexadecimal floating constants when FLT_RADIX is a power of 2, the result is
+ correctly rounded.
+<p><!--para 4 -->
+ An unsuffixed floating constant has type double. If suffixed by the letter f or F, it has
+ type float. If suffixed by the letter l or L, it has type long double.
+<p><!--para 5 -->
+ Floating constants are converted to internal format as if at translation-time. The
+ conversion of a floating constant shall not raise an exceptional condition or a floating-
+ point exception at execution time.
+<p><b>Recommended practice</b>
+<p><!--para 6 -->
+ The implementation should produce a diagnostic message if a hexadecimal constant
+ cannot be represented exactly in its evaluation format; the implementation should then
+ proceed with the translation of the program.
+<p><!--para 7 -->
+ The translation-time conversion of floating constants should match the execution-time
+ conversion of character strings by library functions, such as strtod, given matching
+ inputs suitable for both conversions, the same result format, and default execution-time
+ rounding.<sup><a href="#note64"><b>64)</b></a></sup>
+<!--page 71 -->
+
+<p><b>Footnotes</b>
+<p><small><a name="note64" href="#note64">64)</a> The specification for the library functions recommends more accurate conversion than required for
+ floating constants (see <a href="#7.20.1.3">7.20.1.3</a>).
+</small>
+
+<h5><a name="6.4.4.3" href="#6.4.4.3">6.4.4.3 Enumeration constants</a></h5>
+<p><b>Syntax</b>
+<p><!--para 1 -->
+<pre>
+          enumeration-constant:
+                identifier
+</pre>
+<p><b>Semantics</b>
+<p><!--para 2 -->
+ An identifier declared as an enumeration constant has type int.
+<p><b> Forward references</b>: enumeration specifiers (<a href="#6.7.2.2">6.7.2.2</a>).
+
+<h5><a name="6.4.4.4" href="#6.4.4.4">6.4.4.4 Character constants</a></h5>
+<p><b>Syntax</b>
+<p><!--para 1 -->
+<!--page 72 -->
+<pre>
+          character-constant:
+                 ' c-char-sequence '
+                 L' c-char-sequence '
+          c-char-sequence:
+                 c-char
+                 c-char-sequence c-char
+          c-char:
+                    any member of the source character set except
+                                 the single-quote ', backslash \, or new-line character
+                    escape-sequence
+          escape-sequence:
+                 simple-escape-sequence
+                 octal-escape-sequence
+                 hexadecimal-escape-sequence
+                 universal-character-name
+          simple-escape-sequence: one of
+                 \' \" \? \\
+                 \a \b \f \n \r                  \t    \v
+          octal-escape-sequence:
+                  \ octal-digit
+                  \ octal-digit octal-digit
+                  \ octal-digit octal-digit octal-digit
+          hexadecimal-escape-sequence:
+                \x hexadecimal-digit
+                hexadecimal-escape-sequence hexadecimal-digit
+</pre>
+<p><b>Description</b>
+<p><!--para 2 -->
+ An integer character constant is a sequence of one or more multibyte characters enclosed
+ in single-quotes, as in 'x'. A wide character constant is the same, except prefixed by the
+ letter L. With a few exceptions detailed later, the elements of the sequence are any
+ members of the source character set; they are mapped in an implementation-defined
+ manner to members of the execution character set.
+<p><!--para 3 -->
+ The single-quote ', the double-quote ", the question-mark ?, the backslash \, and
+ arbitrary integer values are representable according to the following table of escape
+ sequences:
+<pre>
+        single quote '                 \'
+        double quote "                 \"
+        question mark ?                \?
+        backslash \                    \\
+        octal character                \octal digits
+        hexadecimal character          \x hexadecimal digits
+</pre>
+<p><!--para 4 -->
+ The double-quote " and question-mark ? are representable either by themselves or by the
+ escape sequences \" and \?, respectively, but the single-quote ' and the backslash \
+ shall be represented, respectively, by the escape sequences \' and \\.
+<p><!--para 5 -->
+ The octal digits that follow the backslash in an octal escape sequence are taken to be part
+ of the construction of a single character for an integer character constant or of a single
+ wide character for a wide character constant. The numerical value of the octal integer so
+ formed specifies the value of the desired character or wide character.
+<p><!--para 6 -->
+ The hexadecimal digits that follow the backslash and the letter x in a hexadecimal escape
+ sequence are taken to be part of the construction of a single character for an integer
+ character constant or of a single wide character for a wide character constant. The
+ numerical value of the hexadecimal integer so formed specifies the value of the desired
+ character or wide character.
+<p><!--para 7 -->
+ Each octal or hexadecimal escape sequence is the longest sequence of characters that can
+ constitute the escape sequence.
+<p><!--para 8 -->
+ In addition, characters not in the basic character set are representable by universal
+ character names and certain nongraphic characters are representable by escape sequences
+ consisting of the backslash \ followed by a lowercase letter: \a, \b, \f, \n, \r, \t,
+ and \v.<sup><a href="#note65"><b>65)</b></a></sup>
+<!--page 73 -->
+<p><b>Constraints</b>
+<p><!--para 9 -->
+ The value of an octal or hexadecimal escape sequence shall be in the range of
+ representable values for the type unsigned char for an integer character constant, or
+ the unsigned type corresponding to wchar_t for a wide character constant.
+<p><b>Semantics</b>
+<p><!--para 10 -->
+ An integer character constant has type int. The value of an integer character constant
+ containing a single character that maps to a single-byte execution character is the
+ numerical value of the representation of the mapped character interpreted as an integer.
+ The value of an integer character constant containing more than one character (e.g.,
+ 'ab'), or containing a character or escape sequence that does not map to a single-byte
+ execution character, is implementation-defined. If an integer character constant contains
+ a single character or escape sequence, its value is the one that results when an object with
+ type char whose value is that of the single character or escape sequence is converted to
+ type int.
+<p><!--para 11 -->
+ A wide character constant has type wchar_t, an integer type defined in the
+ <a href="#7.17">&lt;stddef.h&gt;</a> header. The value of a wide character constant containing a single
+ multibyte character that maps to a member of the extended execution character set is the
+ wide character corresponding to that multibyte character, as defined by the mbtowc
+ function, with an implementation-defined current locale. The value of a wide character
+ constant containing more than one multibyte character, or containing a multibyte
+ character or escape sequence not represented in the extended execution character set, is
+ implementation-defined.
+<p><!--para 12 -->
+ EXAMPLE 1      The construction '\0' is commonly used to represent the null character.
+<p><!--para 13 -->
+ EXAMPLE 2 Consider implementations that use two's-complement representation for integers and eight
+ bits for objects that have type char. In an implementation in which type char has the same range of
+ values as signed char, the integer character constant '\xFF' has the value -1; if type char has the
+ same range of values as unsigned char, the character constant '\xFF' has the value +255.
+<p><!--para 14 -->
+ EXAMPLE 3 Even if eight bits are used for objects that have type char, the construction '\x123'
+ specifies an integer character constant containing only one character, since a hexadecimal escape sequence
+ is terminated only by a non-hexadecimal character. To specify an integer character constant containing the
+ two characters whose values are '\x12' and '3', the construction '\0223' may be used, since an octal
+ escape sequence is terminated after three octal digits. (The value of this two-character integer character
+ constant is implementation-defined.)
+<p><!--para 15 -->
+ EXAMPLE 4 Even if 12 or more bits are used for objects that have type wchar_t, the construction
+ L'\1234' specifies the implementation-defined value that results from the combination of the values
+ 0123 and '4'.
+<p><b> Forward references</b>: common definitions <a href="#7.17">&lt;stddef.h&gt;</a> (<a href="#7.17">7.17</a>), the mbtowc function
+ (<a href="#7.20.7.2">7.20.7.2</a>).
+<!--page 74 -->
+
+<p><b>Footnotes</b>
+<p><small><a name="note65" href="#note65">65)</a> The semantics of these characters were discussed in <a href="#5.2.2">5.2.2</a>. If any other character follows a backslash,
+ the result is not a token and a diagnostic is required. See ''future language directions'' (<a href="#6.11.4">6.11.4</a>).
+</small>
+
+<h4><a name="6.4.5" href="#6.4.5">6.4.5 String literals</a></h4>
+<p><b>Syntax</b>
+<p><!--para 1 -->
+<pre>
+          string-literal:
+                  " s-char-sequence<sub>opt</sub> "
+                  L" s-char-sequence<sub>opt</sub> "
+          s-char-sequence:
+                 s-char
+                 s-char-sequence s-char
+          s-char:
+                    any member of the source character set except
+                                 the double-quote ", backslash \, or new-line character
+                    escape-sequence
+</pre>
+<p><b>Description</b>
+<p><!--para 2 -->
+ A character string literal is a sequence of zero or more multibyte characters enclosed in
+ double-quotes, as in "xyz". A wide string literal is the same, except prefixed by the
+ letter L.
+<p><!--para 3 -->
+ The same considerations apply to each element of the sequence in a character string
+ literal or a wide string literal as if it were in an integer character constant or a wide
+ character constant, except that the single-quote ' is representable either by itself or by the
+ escape sequence \', but the double-quote " shall be represented by the escape sequence
+ \".
+<p><b>Semantics</b>
+<p><!--para 4 -->
+ In translation phase 6, the multibyte character sequences specified by any sequence of
+ adjacent character and wide string literal tokens are concatenated into a single multibyte
+ character sequence. If any of the tokens are wide string literal tokens, the resulting
+ multibyte character sequence is treated as a wide string literal; otherwise, it is treated as a
+ character string literal.
+<p><!--para 5 -->
+ In translation phase 7, a byte or code of value zero is appended to each multibyte
+ character sequence that results from a string literal or literals.<sup><a href="#note66"><b>66)</b></a></sup> The multibyte character
+ sequence is then used to initialize an array of static storage duration and length just
+ sufficient to contain the sequence. For character string literals, the array elements have
+ type char, and are initialized with the individual bytes of the multibyte character
+ sequence; for wide string literals, the array elements have type wchar_t, and are
+ initialized with the sequence of wide characters corresponding to the multibyte character
+<!--page 75 -->
+ sequence, as defined by the mbstowcs function with an implementation-defined current
+ locale. The value of a string literal containing a multibyte character or escape sequence
+ not represented in the execution character set is implementation-defined.
+<p><!--para 6 -->
+ It is unspecified whether these arrays are distinct provided their elements have the
+ appropriate values. If the program attempts to modify such an array, the behavior is
+ undefined.
+<p><!--para 7 -->
+ EXAMPLE       This pair of adjacent character string literals
+<pre>
+          "\x12" "3"
+</pre>
+ produces a single character string literal containing the two characters whose values are '\x12' and '3',
+ because escape sequences are converted into single members of the execution character set just prior to
+ adjacent string literal concatenation.
+<p><b> Forward references</b>: common definitions <a href="#7.17">&lt;stddef.h&gt;</a> (<a href="#7.17">7.17</a>), the mbstowcs
+ function (<a href="#7.20.8.1">7.20.8.1</a>).
+
+<p><b>Footnotes</b>
+<p><small><a name="note66" href="#note66">66)</a> A character string literal need not be a string (see <a href="#7.1.1">7.1.1</a>), because a null character may be embedded in
+ it by a \0 escape sequence.
+</small>
+
+<h4><a name="6.4.6" href="#6.4.6">6.4.6 Punctuators</a></h4>
+<p><b>Syntax</b>
+<p><!--para 1 -->
+<pre>
+          punctuator: one of
+                 [ ] ( ) { } . -&gt;
+                 ++ -- &amp; * + - ~ !
+                 / % &lt;&lt; &gt;&gt; &lt; &gt; &lt;= &gt;=                               ==     !=     ^    |     &amp;&amp;     ||
+                 ? : ; ...
+                 = *= /= %= += -= &lt;&lt;=                              &gt;&gt;=      &amp;=       ^=   |=
+                 , # ##
+                 &lt;: :&gt; &lt;% %&gt; %: %:%:
+</pre>
+<p><b>Semantics</b>
+<p><!--para 2 -->
+ A punctuator is a symbol that has independent syntactic and semantic significance.
+ Depending on context, it may specify an operation to be performed (which in turn may
+ yield a value or a function designator, produce a side effect, or some combination thereof)
+ in which case it is known as an operator (other forms of operator also exist in some
+ contexts). An operand is an entity on which an operator acts.
+<!--page 76 -->
+<p><!--para 3 -->
+ In all aspects of the language, the six tokens<sup><a href="#note67"><b>67)</b></a></sup>
+<pre>
+          &lt;:    :&gt;      &lt;%    %&gt;     %:     %:%:
+</pre>
+ behave, respectively, the same as the six tokens
+<pre>
+          [     ]       {     }      #      ##
+</pre>
+ except for their spelling.<sup><a href="#note68"><b>68)</b></a></sup>
+<p><b> Forward references</b>: expressions (<a href="#6.5">6.5</a>), declarations (<a href="#6.7">6.7</a>), preprocessing directives
+ (<a href="#6.10">6.10</a>), statements (<a href="#6.8">6.8</a>).
+
+<p><b>Footnotes</b>
+<p><small><a name="note67" href="#note67">67)</a> These tokens are sometimes called ''digraphs''.
+</small>
+<p><small><a name="note68" href="#note68">68)</a> Thus [ and &lt;: behave differently when ''stringized'' (see <a href="#6.10.3.2">6.10.3.2</a>), but can otherwise be freely
+ interchanged.
+</small>
+
+<h4><a name="6.4.7" href="#6.4.7">6.4.7 Header names</a></h4>
+<p><b>Syntax</b>
+<p><!--para 1 -->
+<pre>
+          header-name:
+                 &lt; h-char-sequence &gt;
+                 " q-char-sequence "
+          h-char-sequence:
+                 h-char
+                 h-char-sequence h-char
+          h-char:
+                    any member of the source character set except
+                                 the new-line character and &gt;
+          q-char-sequence:
+                 q-char
+                 q-char-sequence q-char
+          q-char:
+                    any member of the source character set except
+                                 the new-line character and "
+</pre>
+<p><b>Semantics</b>
+<p><!--para 2 -->
+ The sequences in both forms of header names are mapped in an implementation-defined
+ manner to headers or external source file names as specified in <a href="#6.10.2">6.10.2</a>.
+<p><!--para 3 -->
+ If the characters ', \, ", //, or /* occur in the sequence between the &lt; and &gt; delimiters,
+ the behavior is undefined. Similarly, if the characters ', \, //, or /* occur in the
+<!--page 77 -->
+ sequence between the " delimiters, the behavior is undefined.<sup><a href="#note69"><b>69)</b></a></sup> Header name
+ preprocessing tokens are recognized only within #include preprocessing directives and
+ in implementation-defined locations within #pragma directives.<sup><a href="#note70"><b>70)</b></a></sup>
+<p><!--para 4 -->
+ EXAMPLE       The following sequence of characters:
+<pre>
+          0x3&lt;1/a.h&gt;1e2
+          #include &lt;1/a.h&gt;
+          #define const.member@$
+</pre>
+ forms the following sequence of preprocessing tokens (with each individual preprocessing token delimited
+ by a { on the left and a } on the right).
+<pre>
+          {0x3}{&lt;}{1}{/}{a}{.}{h}{&gt;}{1e2}
+          {#}{include} {&lt;1/a.h&gt;}
+          {#}{define} {const}{.}{member}{@}{$}
+</pre>
+<p><b> Forward references</b>: source file inclusion (<a href="#6.10.2">6.10.2</a>).
+
+<p><b>Footnotes</b>
+<p><small><a name="note69" href="#note69">69)</a> Thus, sequences of characters that resemble escape sequences cause undefined behavior.
+</small>
+<p><small><a name="note70" href="#note70">70)</a> For an example of a header name preprocessing token used in a #pragma directive, see <a href="#6.10.9">6.10.9</a>.
+</small>
+
+<h4><a name="6.4.8" href="#6.4.8">6.4.8 Preprocessing numbers</a></h4>
+<p><b>Syntax</b>
+<p><!--para 1 -->
+<pre>
+          pp-number:
+                digit
+                . digit
+                pp-number       digit
+                pp-number       identifier-nondigit
+                pp-number       e sign
+                pp-number       E sign
+                pp-number       p sign
+                pp-number       P sign
+                pp-number       .
+</pre>
+<p><b>Description</b>
+<p><!--para 2 -->
+ A preprocessing number begins with a digit optionally preceded by a period (.) and may
+ be followed by valid identifier characters and the character sequences e+, e-, E+, E-,
+ p+, p-, P+, or P-.
+<p><!--para 3 -->
+ Preprocessing number tokens lexically include all floating and integer constant tokens.
+<p><b>Semantics</b>
+<p><!--para 4 -->
+ A preprocessing number does not have type or a value; it acquires both after a successful
+ conversion (as part of translation phase 7) to a floating constant token or an integer
+ constant token.
+<!--page 78 -->
+
+<h4><a name="6.4.9" href="#6.4.9">6.4.9 Comments</a></h4>
+<p><!--para 1 -->
+ Except within a character constant, a string literal, or a comment, the characters /*
+ introduce a comment. The contents of such a comment are examined only to identify
+ multibyte characters and to find the characters */ that terminate it.<sup><a href="#note71"><b>71)</b></a></sup>
+<p><!--para 2 -->
+ Except within a character constant, a string literal, or a comment, the characters //
+ introduce a comment that includes all multibyte characters up to, but not including, the
+ next new-line character. The contents of such a comment are examined only to identify
+ multibyte characters and to find the terminating new-line character.
+<p><!--para 3 -->
+ EXAMPLE
+<pre>
+         "a//b"                              //   four-character string literal
+         #include "//e"                      //   undefined behavior
+         // */                               //   comment, not syntax error
+         f = g/**//h;                        //   equivalent to f = g / h;
+         //\
+         i();                                // part of a two-line comment
+         /\
+         / j();                              // part of a two-line comment
+         #define glue(x,y) x##y
+         glue(/,/) k();                      // syntax error, not comment
+         /*//*/ l();                         // equivalent to l();
+         m = n//**/o
+            + p;                             // equivalent to m = n + p;
+</pre>
+<!--page 79 -->
+
+<p><b>Footnotes</b>
+<p><small><a name="note71" href="#note71">71)</a> Thus, /* ... */ comments do not nest.
+</small>
+
+<h3><a name="6.5" href="#6.5">6.5 Expressions</a></h3>
+<p><!--para 1 -->
+ An expression is a sequence of operators and operands that specifies computation of a
+ value, or that designates an object or a function, or that generates side effects, or that
+ performs a combination thereof.
+<p><!--para 2 -->
+ Between the previous and next sequence point an object shall have its stored value
+ modified at most once by the evaluation of an expression.<sup><a href="#note72"><b>72)</b></a></sup> Furthermore, the prior value
+ shall be read only to determine the value to be stored.<sup><a href="#note73"><b>73)</b></a></sup>
+<p><!--para 3 -->
+ The grouping of operators and operands is indicated by the syntax.<sup><a href="#note74"><b>74)</b></a></sup> Except as specified
+ later (for the function-call (), &amp;&amp;, ||, ?:, and comma operators), the order of evaluation
+ of subexpressions and the order in which side effects take place are both unspecified.
+<p><!--para 4 -->
+ Some operators (the unary operator ~, and the binary operators &lt;&lt;, &gt;&gt;, &amp;, ^, and |,
+ collectively described as bitwise operators) are required to have operands that have
+ integer type. These operators yield values that depend on the internal representations of
+ integers, and have implementation-defined and undefined aspects for signed types.
+<p><!--para 5 -->
+ If an exceptional condition occurs during the evaluation of an expression (that is, if the
+ result is not mathematically defined or not in the range of representable values for its
+ type), the behavior is undefined.
+<p><!--para 6 -->
+ The effective type of an object for an access to its stored value is the declared type of the
+ object, if any.<sup><a href="#note75"><b>75)</b></a></sup> If a value is stored into an object having no declared type through an
+ lvalue having a type that is not a character type, then the type of the lvalue becomes the
+<!--page 80 -->
+ effective type of the object for that access and for subsequent accesses that do not modify
+ the stored value. If a value is copied into an object having no declared type using
+ memcpy or memmove, or is copied as an array of character type, then the effective type
+ of the modified object for that access and for subsequent accesses that do not modify the
+ value is the effective type of the object from which the value is copied, if it has one. For
+ all other accesses to an object having no declared type, the effective type of the object is
+ simply the type of the lvalue used for the access.
+<p><!--para 7 -->
+ An object shall have its stored value accessed only by an lvalue expression that has one of
+ the following types:<sup><a href="#note76"><b>76)</b></a></sup>
+<ul>
+<li>  a type compatible with the effective type of the object,
+<li>  a qualified version of a type compatible with the effective type of the object,
+<li>  a type that is the signed or unsigned type corresponding to the effective type of the
+ object,
+<li>  a type that is the signed or unsigned type corresponding to a qualified version of the
+ effective type of the object,
+<li>  an aggregate or union type that includes one of the aforementioned types among its
+ members (including, recursively, a member of a subaggregate or contained union), or
+<li>  a character type.
+</ul>
+<p><!--para 8 -->
+ A floating expression may be contracted, that is, evaluated as though it were an atomic
+ operation, thereby omitting rounding errors implied by the source code and the
+ expression evaluation method.<sup><a href="#note77"><b>77)</b></a></sup> The FP_CONTRACT pragma in <a href="#7.12">&lt;math.h&gt;</a> provides a
+ way to disallow contracted expressions. Otherwise, whether and how expressions are
+ contracted is implementation-defined.<sup><a href="#note78"><b>78)</b></a></sup>
+<p><b> Forward references</b>: the FP_CONTRACT pragma (<a href="#7.12.2">7.12.2</a>), copying functions (<a href="#7.21.2">7.21.2</a>).
+<!--page 81 -->
+
+<p><b>Footnotes</b>
+<p><small><a name="note72" href="#note72">72)</a> A floating-point status flag is not an object and can be set more than once within an expression.
+</small>
+<p><small><a name="note73" href="#note73">73)</a> This paragraph renders undefined statement expressions such as
+
+<pre>
+            i = ++i + 1;
+            a[i++] = i;
+</pre>
+    while allowing
+<pre>
+            i = i + 1;
+            a[i] = i;
+</pre>
+</small>
+<p><small><a name="note74" href="#note74">74)</a> The syntax specifies the precedence of operators in the evaluation of an expression, which is the same
+ as the order of the major subclauses of this subclause, highest precedence first. Thus, for example, the
+ expressions allowed as the operands of the binary + operator (<a href="#6.5.6">6.5.6</a>) are those expressions defined in
+ <a href="#6.5.1">6.5.1</a> through <a href="#6.5.6">6.5.6</a>. The exceptions are cast expressions (<a href="#6.5.4">6.5.4</a>) as operands of unary operators
+ (<a href="#6.5.3">6.5.3</a>), and an operand contained between any of the following pairs of operators: grouping
+ parentheses () (<a href="#6.5.1">6.5.1</a>), subscripting brackets [] (<a href="#6.5.2.1">6.5.2.1</a>), function-call parentheses () (<a href="#6.5.2.2">6.5.2.2</a>), and
+ the conditional operator ?: (<a href="#6.5.15">6.5.15</a>).
+
+ Within each major subclause, the operators have the same precedence. Left- or right-associativity is
+ indicated in each subclause by the syntax for the expressions discussed therein.
+</small>
+<p><small><a name="note75" href="#note75">75)</a> Allocated objects have no declared type.
+</small>
+<p><small><a name="note76" href="#note76">76)</a> The intent of this list is to specify those circumstances in which an object may or may not be aliased.
+</small>
+<p><small><a name="note77" href="#note77">77)</a> A contracted expression might also omit the raising of floating-point exceptions.
+</small>
+<p><small><a name="note78" href="#note78">78)</a> This license is specifically intended to allow implementations to exploit fast machine instructions that
+ combine multiple C operators. As contractions potentially undermine predictability, and can even
+ decrease accuracy for containing expressions, their use needs to be well-defined and clearly
+ documented.
+</small>
+
+<h4><a name="6.5.1" href="#6.5.1">6.5.1 Primary expressions</a></h4>
+<p><b>Syntax</b>
+<p><!--para 1 -->
+<pre>
+          primary-expression:
+                 identifier
+                 constant
+                 string-literal
+                 ( expression )
+</pre>
+<p><b>Semantics</b>
+<p><!--para 2 -->
+ An identifier is a primary expression, provided it has been declared as designating an
+ object (in which case it is an lvalue) or a function (in which case it is a function
+ designator).<sup><a href="#note79"><b>79)</b></a></sup>
+<p><!--para 3 -->
+ A constant is a primary expression. Its type depends on its form and value, as detailed in
+ <a href="#6.4.4">6.4.4</a>.
+<p><!--para 4 -->
+ A string literal is a primary expression. It is an lvalue with type as detailed in <a href="#6.4.5">6.4.5</a>.
+<p><!--para 5 -->
+ A parenthesized expression is a primary expression. Its type and value are identical to
+ those of the unparenthesized expression. It is an lvalue, a function designator, or a void
+ expression if the unparenthesized expression is, respectively, an lvalue, a function
+ designator, or a void expression.
+<p><b> Forward references</b>: declarations (<a href="#6.7">6.7</a>).
+
+<p><b>Footnotes</b>
+<p><small><a name="note79" href="#note79">79)</a> Thus, an undeclared identifier is a violation of the syntax.
+</small>
+
+<h4><a name="6.5.2" href="#6.5.2">6.5.2 Postfix operators</a></h4>
+<p><b>Syntax</b>
+<p><!--para 1 -->
+<pre>
+          postfix-expression:
+                 primary-expression
+                 postfix-expression [ expression ]
+                 postfix-expression ( argument-expression-list<sub>opt</sub> )
+                 postfix-expression . identifier
+                 postfix-expression -&gt; identifier
+                 postfix-expression ++
+                 postfix-expression --
+                 ( type-name ) { initializer-list }
+                 ( type-name ) { initializer-list , }
+</pre>
+<!--page 82 -->
+<pre>
+          argument-expression-list:
+                assignment-expression
+                argument-expression-list , assignment-expression
+</pre>
+
+<h5><a name="6.5.2.1" href="#6.5.2.1">6.5.2.1 Array subscripting</a></h5>
+<p><b>Constraints</b>
+<p><!--para 1 -->
+ One of the expressions shall have type ''pointer to object type'', the other expression shall
+ have integer type, and the result has type ''type''.
+<p><b>Semantics</b>
+<p><!--para 2 -->
+ A postfix expression followed by an expression in square brackets [] is a subscripted
+ designation of an element of an array object. The definition of the subscript operator []
+ is that E1[E2] is identical to (*((E1)+(E2))). Because of the conversion rules that
+ apply to the binary + operator, if E1 is an array object (equivalently, a pointer to the
+ initial element of an array object) and E2 is an integer, E1[E2] designates the E2-th
+ element of E1 (counting from zero).
+<p><!--para 3 -->
+ Successive subscript operators designate an element of a multidimensional array object.
+ If E is an n-dimensional array (n &gt;= 2) with dimensions i x j x . . . x k, then E (used as
+ other than an lvalue) is converted to a pointer to an (n - 1)-dimensional array with
+ dimensions j x . . . x k. If the unary * operator is applied to this pointer explicitly, or
+ implicitly as a result of subscripting, the result is the pointed-to (n - 1)-dimensional array,
+ which itself is converted into a pointer if used as other than an lvalue. It follows from this
+ that arrays are stored in row-major order (last subscript varies fastest).
+<p><!--para 4 -->
+ EXAMPLE        Consider the array object defined by the declaration
+<pre>
+          int x[3][5];
+</pre>
+ Here x is a 3 x 5 array of ints; more precisely, x is an array of three element objects, each of which is an
+ array of five ints. In the expression x[i], which is equivalent to (*((x)+(i))), x is first converted to
+ a pointer to the initial array of five ints. Then i is adjusted according to the type of x, which conceptually
+ entails multiplying i by the size of the object to which the pointer points, namely an array of five int
+ objects. The results are added and indirection is applied to yield an array of five ints. When used in the
+ expression x[i][j], that array is in turn converted to a pointer to the first of the ints, so x[i][j]
+ yields an int.
+<p><b> Forward references</b>: additive operators (<a href="#6.5.6">6.5.6</a>), address and indirection operators
+ (<a href="#6.5.3.2">6.5.3.2</a>), array declarators (<a href="#6.7.5.2">6.7.5.2</a>).
+<!--page 83 -->
+
+<h5><a name="6.5.2.2" href="#6.5.2.2">6.5.2.2 Function calls</a></h5>
+<p><b>Constraints</b>
+<p><!--para 1 -->
+ The expression that denotes the called function<sup><a href="#note80"><b>80)</b></a></sup> shall have type pointer to function
+ returning void or returning an object type other than an array type.
+<p><!--para 2 -->
+ If the expression that denotes the called function has a type that includes a prototype, the
+ number of arguments shall agree with the number of parameters. Each argument shall
+ have a type such that its value may be assigned to an object with the unqualified version
+ of the type of its corresponding parameter.
+<p><b>Semantics</b>
+<p><!--para 3 -->
+ A postfix expression followed by parentheses () containing a possibly empty, comma-
+ separated list of expressions is a function call. The postfix expression denotes the called
+ function. The list of expressions specifies the arguments to the function.
+<p><!--para 4 -->
+ An argument may be an expression of any object type. In preparing for the call to a
+ function, the arguments are evaluated, and each parameter is assigned the value of the
+ corresponding argument.<sup><a href="#note81"><b>81)</b></a></sup>
+<p><!--para 5 -->
+ If the expression that denotes the called function has type pointer to function returning an
+ object type, the function call expression has the same type as that object type, and has the
+ value determined as specified in <a href="#6.8.6.4">6.8.6.4</a>. Otherwise, the function call has type void. If
+ an attempt is made to modify the result of a function call or to access it after the next
+ sequence point, the behavior is undefined.
+<p><!--para 6 -->
+ If the expression that denotes the called function has a type that does not include a
+ prototype, the integer promotions are performed on each argument, and arguments that
+ have type float are promoted to double. These are called the default argument
+ promotions. If the number of arguments does not equal the number of parameters, the
+ behavior is undefined. If the function is defined with a type that includes a prototype, and
+ either the prototype ends with an ellipsis (, ...) or the types of the arguments after
+ promotion are not compatible with the types of the parameters, the behavior is undefined.
+ If the function is defined with a type that does not include a prototype, and the types of
+ the arguments after promotion are not compatible with those of the parameters after
+ promotion, the behavior is undefined, except for the following cases:
+<!--page 84 -->
+<ul>
+<li>  one promoted type is a signed integer type, the other promoted type is the
+ corresponding unsigned integer type, and the value is representable in both types;
+<li>  both types are pointers to qualified or unqualified versions of a character type or
+ void.
+</ul>
+<p><!--para 7 -->
+ If the expression that denotes the called function has a type that does include a prototype,
+ the arguments are implicitly converted, as if by assignment, to the types of the
+ corresponding parameters, taking the type of each parameter to be the unqualified version
+ of its declared type. The ellipsis notation in a function prototype declarator causes
+ argument type conversion to stop after the last declared parameter. The default argument
+ promotions are performed on trailing arguments.
+<p><!--para 8 -->
+ No other conversions are performed implicitly; in particular, the number and types of
+ arguments are not compared with those of the parameters in a function definition that
+ does not include a function prototype declarator.
+<p><!--para 9 -->
+ If the function is defined with a type that is not compatible with the type (of the
+ expression) pointed to by the expression that denotes the called function, the behavior is
+ undefined.
+<p><!--para 10 -->
+ The order of evaluation of the function designator, the actual arguments, and
+ subexpressions within the actual arguments is unspecified, but there is a sequence point
+ before the actual call.
+<p><!--para 11 -->
+ Recursive function calls shall be permitted, both directly and indirectly through any chain
+ of other functions.
+<p><!--para 12 -->
+ EXAMPLE       In the function call
+<pre>
+         (*pf[f1()]) (f2(), f3() + f4())
+</pre>
+ the functions f1, f2, f3, and f4 may be called in any order. All side effects have to be completed before
+ the function pointed to by pf[f1()] is called.
+<p><b> Forward references</b>: function declarators (including prototypes) (<a href="#6.7.5.3">6.7.5.3</a>), function
+ definitions (<a href="#6.9.1">6.9.1</a>), the return statement (<a href="#6.8.6.4">6.8.6.4</a>), simple assignment (<a href="#6.5.16.1">6.5.16.1</a>).
+
+<p><b>Footnotes</b>
+<p><small><a name="note80" href="#note80">80)</a> Most often, this is the result of converting an identifier that is a function designator.
+</small>
+<p><small><a name="note81" href="#note81">81)</a> A function may change the values of its parameters, but these changes cannot affect the values of the
+ arguments. On the other hand, it is possible to pass a pointer to an object, and the function may
+ change the value of the object pointed to. A parameter declared to have array or function type is
+ adjusted to have a pointer type as described in <a href="#6.9.1">6.9.1</a>.
+</small>
+
+<h5><a name="6.5.2.3" href="#6.5.2.3">6.5.2.3 Structure and union members</a></h5>
+<p><b>Constraints</b>
+<p><!--para 1 -->
+ The first operand of the . operator shall have a qualified or unqualified structure or union
+ type, and the second operand shall name a member of that type.
+<p><!--para 2 -->
+ The first operand of the -&gt; operator shall have type ''pointer to qualified or unqualified
+ structure'' or ''pointer to qualified or unqualified union'', and the second operand shall
+ name a member of the type pointed to.
+<!--page 85 -->
+<p><b>Semantics</b>
+<p><!--para 3 -->
+ A postfix expression followed by the . operator and an identifier designates a member of
+ a structure or union object. The value is that of the named member,<sup><a href="#note82"><b>82)</b></a></sup> and is an lvalue if
+ the first expression is an lvalue. If the first expression has qualified type, the result has
+ the so-qualified version of the type of the designated member.
+<p><!--para 4 -->
+ A postfix expression followed by the -&gt; operator and an identifier designates a member
+ of a structure or union object. The value is that of the named member of the object to
+ which the first expression points, and is an lvalue.<sup><a href="#note83"><b>83)</b></a></sup> If the first expression is a pointer to
+ a qualified type, the result has the so-qualified version of the type of the designated
+ member.
+<p><!--para 5 -->
+ One special guarantee is made in order to simplify the use of unions: if a union contains
+ several structures that share a common initial sequence (see below), and if the union
+ object currently contains one of these structures, it is permitted to inspect the common
+ initial part of any of them anywhere that a declaration of the complete type of the union is
+ visible. Two structures share a common initial sequence if corresponding members have
+ compatible types (and, for bit-fields, the same widths) for a sequence of one or more
+ initial members.
+<p><!--para 6 -->
+ EXAMPLE 1 If f is a function returning a structure or union, and x is a member of that structure or
+ union, f().x is a valid postfix expression but is not an lvalue.
+<p><!--para 7 -->
+ EXAMPLE 2 In:
+<pre>
+          struct s { int i; const int ci; };
+          struct s s;
+          const struct s cs;
+          volatile struct s vs;
+</pre>
+ the various members have the types:
+<pre>
+          s.i        int
+          s.ci       const int
+          cs.i       const int
+          cs.ci      const int
+          vs.i       volatile int
+          vs.ci      volatile const int
+</pre>
+<!--page 86 -->
+<p><!--para 8 -->
+ EXAMPLE 3       The following is a valid fragment:
+<pre>
+          union {
                   struct {
-                        int f1;
-                        struct s f2;
-                  } u1;
+                        int      alltypes;
+                  } n;
                   struct {
-                        struct s f3;
-                        int f4;
-                  } u2;
-            } g;
-            struct s f(void)
-            {
-                  return g.u1.f2;
-            }
-            /* ... */
-            g.u2.f3 = f();
-    there is no undefined behavior, although there would be if the assignment were done directly (without using
-    a function call to fetch the value).
-
-
-
-
-    139) The return statement is not an assignment. The overlap restriction of subclause <a href="#6.5.16.1">6.5.16.1</a> does not
-         apply to the case of function return. The representation of floating-point values may have wider range
-         or precision and is determined by FLT_EVAL_METHOD. A cast may be used to remove this extra
-         range and precision.
-
-[<a name="p139" href="#p139">page 139</a>] (<a href="#Contents">Contents</a>)
-
-<a name="6.9" href="#6.9"><b>    6.9 External definitions</b></a>
-    Syntax
-1            translation-unit:
-                     external-declaration
-                     translation-unit external-declaration
-             external-declaration:
-                    function-definition
-                    declaration
-    Constraints
-2   The storage-class specifiers auto and register shall not appear in the declaration
-    specifiers in an external declaration.
-3   There shall be no more than one external definition for each identifier declared with
-    internal linkage in a translation unit. Moreover, if an identifier declared with internal
-    linkage is used in an expression (other than as a part of the operand of a sizeof
-    operator whose result is an integer constant), there shall be exactly one external definition
-    for the identifier in the translation unit.
-    Semantics
-4   As discussed in <a href="#5.1.1.1">5.1.1.1</a>, the unit of program text after preprocessing is a translation unit,
-    which consists of a sequence of external declarations. These are described as ''external''
-    because they appear outside any function (and hence have file scope). As discussed in
-    <a href="#6.7">6.7</a>, a declaration that also causes storage to be reserved for an object or a function named
-    by the identifier is a definition.
-5   An external definition is an external declaration that is also a definition of a function
-    (other than an inline definition) or an object. If an identifier declared with external
-    linkage is used in an expression (other than as part of the operand of a sizeof operator
-    whose result is an integer constant), somewhere in the entire program there shall be
-    exactly one external definition for the identifier; otherwise, there shall be no more than
-    one.140)
-
-
-
-
-    140) Thus, if an identifier declared with external linkage is not used in an expression, there need be no
-         external definition for it.
-
-[<a name="p140" href="#p140">page 140</a>] (<a href="#Contents">Contents</a>)
-
-<a name="6.9.1" href="#6.9.1"><b>    6.9.1 Function definitions</b></a>
-    Syntax
-1            function-definition:
-                    declaration-specifiers declarator declaration-listopt compound-statement
-             declaration-list:
-                    declaration
-                    declaration-list declaration
-    Constraints
-2   The identifier declared in a function definition (which is the name of the function) shall
-    have a function type, as specified by the declarator portion of the function definition.141)
-3   The return type of a function shall be void or an object type other than array type.
-4   The storage-class specifier, if any, in the declaration specifiers shall be either extern or
-    static.
-5   If the declarator includes a parameter type list, the declaration of each parameter shall
-    include an identifier, except for the special case of a parameter list consisting of a single
-    parameter of type void, in which case there shall not be an identifier. No declaration list
-    shall follow.
-6   If the declarator includes an identifier list, each declaration in the declaration list shall
-    have at least one declarator, those declarators shall declare only identifiers from the
-    identifier list, and every identifier in the identifier list shall be declared. An identifier
-    declared as a typedef name shall not be redeclared as a parameter. The declarations in the
-    declaration list shall contain no storage-class specifier other than register and no
-    initializations.
-
-
-
-
-    141) The intent is that the type category in a function definition cannot be inherited from a typedef:
-                  typedef int F(void);                          //   type F is ''function with no parameters
-                                                                //                  returning int''
-                  F f, g;                                       //   f and g both have type compatible with F
-                  F f { /* ... */ }                             //   WRONG: syntax/constraint error
-                  F g() { /* ... */ }                           //   WRONG: declares that g returns a function
-                  int f(void) { /* ... */ }                     //   RIGHT: f has type compatible with F
-                  int g() { /* ... */ }                         //   RIGHT: g has type compatible with F
-                  F *e(void) { /* ... */ }                      //   e returns a pointer to a function
-                  F *((e))(void) { /* ... */ }                  //   same: parentheses irrelevant
-                  int (*fp)(void);                              //   fp points to a function that has type F
-                  F *Fp;                                        //   Fp points to a function that has type F
-
-
-[<a name="p141" href="#p141">page 141</a>] (<a href="#Contents">Contents</a>)
-
-     Semantics
-7    The declarator in a function definition specifies the name of the function being defined
-     and the identifiers of its parameters. If the declarator includes a parameter type list, the
-     list also specifies the types of all the parameters; such a declarator also serves as a
-     function prototype for later calls to the same function in the same translation unit. If the
-     declarator includes an identifier list,142) the types of the parameters shall be declared in a
-     following declaration list. In either case, the type of each parameter is adjusted as
-     described in <a href="#6.7.5.3">6.7.5.3</a> for a parameter type list; the resulting type shall be an object type.
-8    If a function that accepts a variable number of arguments is defined without a parameter
-     type list that ends with the ellipsis notation, the behavior is undefined.
-9    Each parameter has automatic storage duration. Its identifier is an lvalue, which is in
-     effect declared at the head of the compound statement that constitutes the function body
-     (and therefore cannot be redeclared in the function body except in an enclosed block).
-     The layout of the storage for parameters is unspecified.
-10   On entry to the function, the size expressions of each variably modified parameter are
-     evaluated and the value of each argument expression is converted to the type of the
-     corresponding parameter as if by assignment. (Array expressions and function
-     designators as arguments were converted to pointers before the call.)
-11   After all parameters have been assigned, the compound statement that constitutes the
-     body of the function definition is executed.
-12   If the } that terminates a function is reached, and the value of the function call is used by
-     the caller, the behavior is undefined.
-13   EXAMPLE 1       In the following:
-              extern int max(int a, int b)
-              {
-                    return a &gt; b ? a : b;
-              }
-     extern is the storage-class specifier and int is the type specifier; max(int a, int b) is the
-     function declarator; and
-              { return a &gt; b ? a : b; }
-     is the function body. The following similar definition uses the identifier-list form for the parameter
-     declarations:
-
-
-
-
-     142) See ''future language directions'' (<a href="#6.11.7">6.11.7</a>).
-
-[<a name="p142" href="#p142">page 142</a>] (<a href="#Contents">Contents</a>)
-
-              extern int max(a, b)
-              int a, b;
-              {
-                    return a &gt; b ? a : b;
-              }
-     Here int a, b; is the declaration list for the parameters. The difference between these two definitions is
-     that the first form acts as a prototype declaration that forces conversion of the arguments of subsequent calls
-     to the function, whereas the second form does not.
-
-14   EXAMPLE 2           To pass one function to another, one might say
-                          int f(void);
-                          /* ... */
-                          g(f);
-     Then the definition of g might read
-              void g(int (*funcp)(void))
-              {
-                    /* ... */
-                    (*funcp)(); /* or funcp(); ...                    */
-              }
-     or, equivalently,
-              void g(int func(void))
-              {
-                    /* ... */
-                    func(); /* or (*func)(); ...                   */
-              }
-
-<a name="6.9.2" href="#6.9.2"><b>     6.9.2 External object definitions</b></a>
-     Semantics
-1    If the declaration of an identifier for an object has file scope and an initializer, the
-     declaration is an external definition for the identifier.
-2    A declaration of an identifier for an object that has file scope without an initializer, and
-     without a storage-class specifier or with the storage-class specifier static, constitutes a
-     tentative definition. If a translation unit contains one or more tentative definitions for an
-     identifier, and the translation unit contains no external definition for that identifier, then
-     the behavior is exactly as if the translation unit contains a file scope declaration of that
-     identifier, with the composite type as of the end of the translation unit, with an initializer
-     equal to 0.
-3    If the declaration of an identifier for an object is a tentative definition and has internal
-     linkage, the declared type shall not be an incomplete type.
-
-
-
-
-[<a name="p143" href="#p143">page 143</a>] (<a href="#Contents">Contents</a>)
-
-4   EXAMPLE 1
-             int i1 = 1;                    // definition, external linkage
-             static int i2 = 2;             // definition, internal linkage
-             extern int i3 = 3;             // definition, external linkage
-             int i4;                        // tentative definition, external linkage
-             static int i5;                 // tentative definition, internal linkage
-             int   i1;                      // valid tentative definition, refers to previous
-             int   i2;                      // <a href="#6.2.2">6.2.2</a> renders undefined, linkage disagreement
-             int   i3;                      // valid tentative definition, refers to previous
-             int   i4;                      // valid tentative definition, refers to previous
-             int   i5;                      // <a href="#6.2.2">6.2.2</a> renders undefined, linkage disagreement
-             extern    int   i1;            // refers to previous, whose linkage is external
-             extern    int   i2;            // refers to previous, whose linkage is internal
-             extern    int   i3;            // refers to previous, whose linkage is external
-             extern    int   i4;            // refers to previous, whose linkage is external
-             extern    int   i5;            // refers to previous, whose linkage is internal
-
-5   EXAMPLE 2       If at the end of the translation unit containing
-             int i[];
-    the array i still has incomplete type, the implicit initializer causes it to have one element, which is set to
-    zero on program startup.
-
-
-
-
-[<a name="p144" href="#p144">page 144</a>] (<a href="#Contents">Contents</a>)
-
-<a name="6.10" href="#6.10"><b>    6.10 Preprocessing directives</b></a>
-    Syntax
-1            preprocessing-file:
-                    groupopt
-             group:
-                      group-part
-                      group group-part
-             group-part:
-                    if-section
-                    control-line
-                    text-line
-                    # non-directive
-             if-section:
-                      if-group elif-groupsopt else-groupopt endif-line
-             if-group:
-                     # if     constant-expression new-line groupopt
-                     # ifdef identifier new-line groupopt
-                     # ifndef identifier new-line groupopt
-             elif-groups:
-                     elif-group
-                     elif-groups elif-group
-             elif-group:
-                     # elif       constant-expression new-line groupopt
-             else-group:
-                     # else       new-line groupopt
-             endif-line:
-                     # endif      new-line
-
-
-
-
-[<a name="p145" href="#p145">page 145</a>] (<a href="#Contents">Contents</a>)
-
-             control-line:
-                    # include pp-tokens new-line
-                    # define identifier replacement-list new-line
-                    # define identifier lparen identifier-listopt )
-                                                    replacement-list new-line
-                    # define identifier lparen ... ) replacement-list new-line
-                    # define identifier lparen identifier-list , ... )
-                                                    replacement-list new-line
-                    # undef   identifier new-line
-                    # line    pp-tokens new-line
-                    # error   pp-tokensopt new-line
-                    # pragma pp-tokensopt new-line
-                    #         new-line
-             text-line:
-                     pp-tokensopt new-line
-             non-directive:
-                    pp-tokens new-line
-             lparen:
-                       a ( character not immediately preceded by white-space
-             replacement-list:
-                    pp-tokensopt
-             pp-tokens:
-                    preprocessing-token
-                    pp-tokens preprocessing-token
-             new-line:
-                    the new-line character
-    Description
-2   A preprocessing directive consists of a sequence of preprocessing tokens that satisfies the
-    following constraints: The first token in the sequence is a # preprocessing token that (at
-    the start of translation phase 4) is either the first character in the source file (optionally
-    after white space containing no new-line characters) or that follows white space
-    containing at least one new-line character. The last token in the sequence is the first new-
-    line character that follows the first token in the sequence.143) A new-line character ends
-    the preprocessing directive even if it occurs within what would otherwise be an
-
-    143) Thus, preprocessing directives are commonly called ''lines''. These ''lines'' have no other syntactic
-         significance, as all white space is equivalent except in certain situations during preprocessing (see the
-         # character string literal creation operator in <a href="#6.10.3.2">6.10.3.2</a>, for example).
-
-[<a name="p146" href="#p146">page 146</a>] (<a href="#Contents">Contents</a>)
-
-    invocation of a function-like macro.
-3   A text line shall not begin with a # preprocessing token. A non-directive shall not begin
-    with any of the directive names appearing in the syntax.
-4   When in a group that is skipped (<a href="#6.10.1">6.10.1</a>), the directive syntax is relaxed to allow any
-    sequence of preprocessing tokens to occur between the directive name and the following
-    new-line character.
-    Constraints
-5   The only white-space characters that shall appear between preprocessing tokens within a
-    preprocessing directive (from just after the introducing # preprocessing token through
-    just before the terminating new-line character) are space and horizontal-tab (including
-    spaces that have replaced comments or possibly other white-space characters in
-    translation phase 3).
-    Semantics
-6   The implementation can process and skip sections of source files conditionally, include
-    other source files, and replace macros. These capabilities are called preprocessing,
-    because conceptually they occur before translation of the resulting translation unit.
-7   The preprocessing tokens within a preprocessing directive are not subject to macro
-    expansion unless otherwise stated.
-8   EXAMPLE        In:
-             #define EMPTY
-             EMPTY # include &lt;file.h&gt;
-    the sequence of preprocessing tokens on the second line is not a preprocessing directive, because it does not
-    begin with a # at the start of translation phase 4, even though it will do so after the macro EMPTY has been
-    replaced.
-
-<a name="6.10.1" href="#6.10.1"><b>    6.10.1 Conditional inclusion</b></a>
-    Constraints
-1   The expression that controls conditional inclusion shall be an integer constant expression
-    except that: it shall not contain a cast; identifiers (including those lexically identical to
-    keywords) are interpreted as described below;144) and it may contain unary operator
-    expressions of the form
-
-
-
-
-    144) Because the controlling constant expression is evaluated during translation phase 4, all identifiers
-         either are or are not macro names -- there simply are no keywords, enumeration constants, etc.
-
-[<a name="p147" href="#p147">page 147</a>] (<a href="#Contents">Contents</a>)
-
-         defined identifier
-    or
-         defined ( identifier )
-    which evaluate to 1 if the identifier is currently defined as a macro name (that is, if it is
-    predefined or if it has been the subject of a #define preprocessing directive without an
-    intervening #undef directive with the same subject identifier), 0 if it is not.
-2   Each preprocessing token that remains (in the list of preprocessing tokens that will
-    become the controlling expression) after all macro replacements have occurred shall be in
-    the lexical form of a token (<a href="#6.4">6.4</a>).
-    Semantics
-3   Preprocessing directives of the forms
-         # if   constant-expression new-line groupopt
-         # elif constant-expression new-line groupopt
-    check whether the controlling constant expression evaluates to nonzero.
-4   Prior to evaluation, macro invocations in the list of preprocessing tokens that will become
-    the controlling constant expression are replaced (except for those macro names modified
-    by the defined unary operator), just as in normal text. If the token defined is
-    generated as a result of this replacement process or use of the defined unary operator
-    does not match one of the two specified forms prior to macro replacement, the behavior is
-    undefined. After all replacements due to macro expansion and the defined unary
-    operator have been performed, all remaining identifiers (including those lexically
-    identical to keywords) are replaced with the pp-number 0, and then each preprocessing
-    token is converted into a token. The resulting tokens compose the controlling constant
-    expression which is evaluated according to the rules of <a href="#6.6">6.6</a>. For the purposes of this
-    token conversion and evaluation, all signed integer types and all unsigned integer types
-    act as if they have the same representation as, respectively, the types intmax_t and
-    uintmax_t defined in the header <a href="#7.18">&lt;stdint.h&gt;</a>.145) This includes interpreting
-    character constants, which may involve converting escape sequences into execution
-    character set members. Whether the numeric value for these character constants matches
-    the value obtained when an identical character constant occurs in an expression (other
-    than within a #if or #elif directive) is implementation-defined.146) Also, whether a
-    single-character character constant may have a negative value is implementation-defined.
-5   Preprocessing directives of the forms
-
-
-
-    145) Thus, on an implementation where INT_MAX is 0x7FFF and UINT_MAX is 0xFFFF, the constant
-         0x8000 is signed and positive within a #if expression even though it would be unsigned in
-         translation phase 7.
-
-[<a name="p148" href="#p148">page 148</a>] (<a href="#Contents">Contents</a>)
-
-       # ifdef identifier new-line groupopt
-       # ifndef identifier new-line groupopt
-    check whether the identifier is or is not currently defined as a macro name. Their
-    conditions are equivalent to #if defined identifier and #if !defined identifier
-    respectively.
-6   Each directive's condition is checked in order. If it evaluates to false (zero), the group
-    that it controls is skipped: directives are processed only through the name that determines
-    the directive in order to keep track of the level of nested conditionals; the rest of the
-    directives' preprocessing tokens are ignored, as are the other preprocessing tokens in the
-    group. Only the first group whose control condition evaluates to true (nonzero) is
-    processed. If none of the conditions evaluates to true, and there is a #else directive, the
-    group controlled by the #else is processed; lacking a #else directive, all the groups
-    until the #endif are skipped.147)
-    Forward references: macro replacement (<a href="#6.10.3">6.10.3</a>), source file inclusion (<a href="#6.10.2">6.10.2</a>), largest
-    integer types (<a href="#7.18.1.5">7.18.1.5</a>).
-<a name="6.10.2" href="#6.10.2"><b>    6.10.2 Source file inclusion</b></a>
-    Constraints
-1   A #include directive shall identify a header or source file that can be processed by the
-    implementation.
-    Semantics
-2   A preprocessing directive of the form
-       # include &lt;h-char-sequence&gt; new-line
-    searches a sequence of implementation-defined places for a header identified uniquely by
-    the specified sequence between the &lt; and &gt; delimiters, and causes the replacement of that
-    directive by the entire contents of the header. How the places are specified or the header
-    identified is implementation-defined.
-3   A preprocessing directive of the form
-
-
-
-    146) Thus, the constant expression in the following #if directive and if statement is not guaranteed to
-         evaluate to the same value in these two contexts.
-           #if 'z' - 'a' == 25
-           if ('z' - 'a' == 25)
-
-    147) As indicated by the syntax, a preprocessing token shall not follow a #else or #endif directive
-         before the terminating new-line character. However, comments may appear anywhere in a source file,
-         including within a preprocessing directive.
-
-[<a name="p149" href="#p149">page 149</a>] (<a href="#Contents">Contents</a>)
-
-       # include "q-char-sequence" new-line
-    causes the replacement of that directive by the entire contents of the source file identified
-    by the specified sequence between the " delimiters. The named source file is searched
-    for in an implementation-defined manner. If this search is not supported, or if the search
-    fails, the directive is reprocessed as if it read
-       # include &lt;h-char-sequence&gt; new-line
-    with the identical contained sequence (including &gt; characters, if any) from the original
-    directive.
-4   A preprocessing directive of the form
-       # include pp-tokens new-line
-    (that does not match one of the two previous forms) is permitted. The preprocessing
-    tokens after include in the directive are processed just as in normal text. (Each
-    identifier currently defined as a macro name is replaced by its replacement list of
-    preprocessing tokens.) The directive resulting after all replacements shall match one of
-    the two previous forms.148) The method by which a sequence of preprocessing tokens
-    between a &lt; and a &gt; preprocessing token pair or a pair of " characters is combined into a
-    single header name preprocessing token is implementation-defined.
-5   The implementation shall provide unique mappings for sequences consisting of one or
-    more nondigits or digits (<a href="#6.4.2.1">6.4.2.1</a>) followed by a period (.) and a single nondigit. The
-    first character shall not be a digit. The implementation may ignore distinctions of
-    alphabetical case and restrict the mapping to eight significant characters before the
-    period.
-6   A #include preprocessing directive may appear in a source file that has been read
-    because of a #include directive in another file, up to an implementation-defined
-    nesting limit (see <a href="#5.2.4.1">5.2.4.1</a>).
-7   EXAMPLE 1       The most common uses of #include preprocessing directives are as in the following:
-             #include <a href="#7.19">&lt;stdio.h&gt;</a>
-             #include "myprog.h"
-
-8   EXAMPLE 2       This illustrates macro-replaced #include directives:
-
-
-
-
-    148) Note that adjacent string literals are not concatenated into a single string literal (see the translation
-         phases in <a href="#5.1.1.2">5.1.1.2</a>); thus, an expansion that results in two string literals is an invalid directive.
-
-[<a name="p150" href="#p150">page 150</a>] (<a href="#Contents">Contents</a>)
-
-           #if VERSION == 1
-                 #define INCFILE        "vers1.h"
-           #elif VERSION == 2
-                 #define INCFILE        "vers2.h"      // and so on
-           #else
-                 #define INCFILE        "versN.h"
-           #endif
-           #include INCFILE
-
-    Forward references: macro replacement (<a href="#6.10.3">6.10.3</a>).
-<a name="6.10.3" href="#6.10.3"><b>    6.10.3 Macro replacement</b></a>
-    Constraints
-1   Two replacement lists are identical if and only if the preprocessing tokens in both have
-    the same number, ordering, spelling, and white-space separation, where all white-space
-    separations are considered identical.
-2   An identifier currently defined as an object-like macro shall not be redefined by another
-    #define preprocessing directive unless the second definition is an object-like macro
-    definition and the two replacement lists are identical. Likewise, an identifier currently
-    defined as a function-like macro shall not be redefined by another #define
-    preprocessing directive unless the second definition is a function-like macro definition
-    that has the same number and spelling of parameters, and the two replacement lists are
-    identical.
-3   There shall be white-space between the identifier and the replacement list in the definition
-    of an object-like macro.
-4   If the identifier-list in the macro definition does not end with an ellipsis, the number of
-    arguments (including those arguments consisting of no preprocessing tokens) in an
-    invocation of a function-like macro shall equal the number of parameters in the macro
-    definition. Otherwise, there shall be more arguments in the invocation than there are
-    parameters in the macro definition (excluding the ...). There shall exist a )
-    preprocessing token that terminates the invocation.
-5   The identifier __VA_ARGS__ shall occur only in the replacement-list of a function-like
-    macro that uses the ellipsis notation in the parameters.
-6   A parameter identifier in a function-like macro shall be uniquely declared within its
-    scope.
-    Semantics
-7   The identifier immediately following the define is called the macro name. There is one
-    name space for macro names. Any white-space characters preceding or following the
-    replacement list of preprocessing tokens are not considered part of the replacement list
-    for either form of macro.
-
-[<a name="p151" href="#p151">page 151</a>] (<a href="#Contents">Contents</a>)
-
-8    If a # preprocessing token, followed by an identifier, occurs lexically at the point at which
-     a preprocessing directive could begin, the identifier is not subject to macro replacement.
-9    A preprocessing directive of the form
-        # define identifier replacement-list new-line
-     defines an object-like macro that causes each subsequent instance of the macro name149)
-     to be replaced by the replacement list of preprocessing tokens that constitute the
-     remainder of the directive. The replacement list is then rescanned for more macro names
-     as specified below.
-10   A preprocessing directive of the form
-        # define identifier lparen identifier-listopt ) replacement-list new-line
-        # define identifier lparen ... ) replacement-list new-line
-        # define identifier lparen identifier-list , ... ) replacement-list new-line
-     defines a function-like macro with parameters, whose use is similar syntactically to a
-     function call. The parameters are specified by the optional list of identifiers, whose scope
-     extends from their declaration in the identifier list until the new-line character that
-     terminates the #define preprocessing directive. Each subsequent instance of the
-     function-like macro name followed by a ( as the next preprocessing token introduces the
-     sequence of preprocessing tokens that is replaced by the replacement list in the definition
-     (an invocation of the macro). The replaced sequence of preprocessing tokens is
-     terminated by the matching ) preprocessing token, skipping intervening matched pairs of
-     left and right parenthesis preprocessing tokens. Within the sequence of preprocessing
-     tokens making up an invocation of a function-like macro, new-line is considered a normal
-     white-space character.
-11   The sequence of preprocessing tokens bounded by the outside-most matching parentheses
-     forms the list of arguments for the function-like macro. The individual arguments within
-     the list are separated by comma preprocessing tokens, but comma preprocessing tokens
-     between matching inner parentheses do not separate arguments. If there are sequences of
-     preprocessing tokens within the list of arguments that would otherwise act as
-     preprocessing directives,150) the behavior is undefined.
-12   If there is a ... in the identifier-list in the macro definition, then the trailing arguments,
-     including any separating comma preprocessing tokens, are merged to form a single item:
-     the variable arguments. The number of arguments so combined is such that, following
-
-
-     149) Since, by macro-replacement time, all character constants and string literals are preprocessing tokens,
-          not sequences possibly containing identifier-like subsequences (see <a href="#5.1.1.2">5.1.1.2</a>, translation phases), they
-          are never scanned for macro names or parameters.
-     150) Despite the name, a non-directive is a preprocessing directive.
-
-[<a name="p152" href="#p152">page 152</a>] (<a href="#Contents">Contents</a>)
-
-    merger, the number of arguments is one more than the number of parameters in the macro
-    definition (excluding the ...).
-<a name="6.10.3.1" href="#6.10.3.1"><b>    6.10.3.1 Argument substitution</b></a>
-1   After the arguments for the invocation of a function-like macro have been identified,
-    argument substitution takes place. A parameter in the replacement list, unless preceded
-    by a # or ## preprocessing token or followed by a ## preprocessing token (see below), is
-    replaced by the corresponding argument after all macros contained therein have been
-    expanded. Before being substituted, each argument's preprocessing tokens are
-    completely macro replaced as if they formed the rest of the preprocessing file; no other
-    preprocessing tokens are available.
-2   An identifier __VA_ARGS__ that occurs in the replacement list shall be treated as if it
-    were a parameter, and the variable arguments shall form the preprocessing tokens used to
-    replace it.
-<a name="6.10.3.2" href="#6.10.3.2"><b>    6.10.3.2 The # operator</b></a>
-    Constraints
-1   Each # preprocessing token in the replacement list for a function-like macro shall be
-    followed by a parameter as the next preprocessing token in the replacement list.
-    Semantics
-2   If, in the replacement list, a parameter is immediately preceded by a # preprocessing
-    token, both are replaced by a single character string literal preprocessing token that
-    contains the spelling of the preprocessing token sequence for the corresponding
-    argument. Each occurrence of white space between the argument's preprocessing tokens
-    becomes a single space character in the character string literal. White space before the
-    first preprocessing token and after the last preprocessing token composing the argument
-    is deleted. Otherwise, the original spelling of each preprocessing token in the argument
-    is retained in the character string literal, except for special handling for producing the
-    spelling of string literals and character constants: a \ character is inserted before each "
-    and \ character of a character constant or string literal (including the delimiting "
-    characters), except that it is implementation-defined whether a \ character is inserted
-    before the \ character beginning a universal character name. If the replacement that
-    results is not a valid character string literal, the behavior is undefined. The character
-    string literal corresponding to an empty argument is "". The order of evaluation of # and
-    ## operators is unspecified.
-
-
-
-
-[<a name="p153" href="#p153">page 153</a>] (<a href="#Contents">Contents</a>)
-
-<a name="6.10.3.3" href="#6.10.3.3"><b>    6.10.3.3 The ## operator</b></a>
-    Constraints
-1   A ## preprocessing token shall not occur at the beginning or at the end of a replacement
-    list for either form of macro definition.
-    Semantics
-2   If, in the replacement list of a function-like macro, a parameter is immediately preceded
-    or followed by a ## preprocessing token, the parameter is replaced by the corresponding
-    argument's preprocessing token sequence; however, if an argument consists of no
-    preprocessing tokens, the parameter is replaced by a placemarker preprocessing token
-    instead.151)
-3   For both object-like and function-like macro invocations, before the replacement list is
-    reexamined for more macro names to replace, each instance of a ## preprocessing token
-    in the replacement list (not from an argument) is deleted and the preceding preprocessing
-    token is concatenated with the following preprocessing token. Placemarker
-    preprocessing tokens are handled specially: concatenation of two placemarkers results in
-    a single placemarker preprocessing token, and concatenation of a placemarker with a
-    non-placemarker preprocessing token results in the non-placemarker preprocessing token.
-    If the result is not a valid preprocessing token, the behavior is undefined. The resulting
-    token is available for further macro replacement. The order of evaluation of ## operators
-    is unspecified.
-4   EXAMPLE       In the following fragment:
-            #define     hash_hash # ## #
-            #define     mkstr(a) # a
-            #define     in_between(a) mkstr(a)
-            #define     join(c, d) in_between(c hash_hash d)
-            char p[] = join(x, y); // equivalent to
-                                   // char p[] = "x ## y";
-    The expansion produces, at various stages:
-            join(x, y)
-            in_between(x hash_hash y)
-            in_between(x ## y)
-            mkstr(x ## y)
-            "x ## y"
-    In other words, expanding hash_hash produces a new token, consisting of two adjacent sharp signs, but
-    this new token is not the ## operator.
-
-
-    151) Placemarker preprocessing tokens do not appear in the syntax because they are temporary entities that
-         exist only within translation phase 4.
-
-[<a name="p154" href="#p154">page 154</a>] (<a href="#Contents">Contents</a>)
-
-<a name="6.10.3.4" href="#6.10.3.4"><b>    6.10.3.4 Rescanning and further replacement</b></a>
-1   After all parameters in the replacement list have been substituted and # and ##
-    processing has taken place, all placemarker preprocessing tokens are removed. Then, the
-    resulting preprocessing token sequence is rescanned, along with all subsequent
-    preprocessing tokens of the source file, for more macro names to replace.
-2   If the name of the macro being replaced is found during this scan of the replacement list
-    (not including the rest of the source file's preprocessing tokens), it is not replaced.
-    Furthermore, if any nested replacements encounter the name of the macro being replaced,
-    it is not replaced. These nonreplaced macro name preprocessing tokens are no longer
-    available for further replacement even if they are later (re)examined in contexts in which
-    that macro name preprocessing token would otherwise have been replaced.
-3   The resulting completely macro-replaced preprocessing token sequence is not processed
-    as a preprocessing directive even if it resembles one, but all pragma unary operator
-    expressions within it are then processed as specified in <a href="#6.10.9">6.10.9</a> below.
-<a name="6.10.3.5" href="#6.10.3.5"><b>    6.10.3.5 Scope of macro definitions</b></a>
-1   A macro definition lasts (independent of block structure) until a corresponding #undef
-    directive is encountered or (if none is encountered) until the end of the preprocessing
-    translation unit. Macro definitions have no significance after translation phase 4.
-2   A preprocessing directive of the form
-       # undef identifier new-line
-    causes the specified identifier no longer to be defined as a macro name. It is ignored if
-    the specified identifier is not currently defined as a macro name.
-3   EXAMPLE 1      The simplest use of this facility is to define a ''manifest constant'', as in
-            #define TABSIZE 100
-            int table[TABSIZE];
-
-4   EXAMPLE 2 The following defines a function-like macro whose value is the maximum of its arguments.
-    It has the advantages of working for any compatible types of the arguments and of generating in-line code
-    without the overhead of function calling. It has the disadvantages of evaluating one or the other of its
-    arguments a second time (including side effects) and generating more code than a function if invoked
-    several times. It also cannot have its address taken, as it has none.
-            #define max(a, b) ((a) &gt; (b) ? (a) : (b))
-    The parentheses ensure that the arguments and the resulting expression are bound properly.
-
-
-
-
-[<a name="p155" href="#p155">page 155</a>] (<a href="#Contents">Contents</a>)
-
-5   EXAMPLE 3     To illustrate the rules for redefinition and reexamination, the sequence
-             #define   x         3
-             #define   f(a)      f(x * (a))
-             #undef    x
-             #define   x         2
-             #define   g         f
-             #define   z         z[0]
-             #define   h         g(~
-             #define   m(a)      a(w)
-             #define   w         0,1
-             #define   t(a)      a
-             #define   p()       int
-             #define   q(x)      x
-             #define   r(x,y)    x ## y
-             #define   str(x)    # x
-             f(y+1) + f(f(z)) % t(t(g)(0) + t)(1);
-             g(x+(3,4)-w) | h 5) &amp; m
-                   (f)^m(m);
-             p() i[q()] = { q(1), r(2,3), r(4,), r(,5), r(,) };
-             char c[2][6] = { str(hello), str() };
-    results in
-             f(2 * (y+1)) + f(2 * (f(2 * (z[0])))) % f(2 * (0)) + t(1);
-             f(2 * (2+(3,4)-0,1)) | f(2 * (~ 5)) &amp; f(2 * (0,1))^m(0,1);
-             int i[] = { 1, 23, 4, 5, };
-             char c[2][6] = { "hello", "" };
-
-6   EXAMPLE 4     To illustrate the rules for creating character string literals and concatenating tokens, the
-    sequence
-             #define str(s)      # s
-             #define xstr(s)     str(s)
-             #define debug(s, t) printf("x" # s "= %d, x" # t "= %s", \
-                                     x ## s, x ## t)
-             #define INCFILE(n) vers ## n
-             #define glue(a, b) a ## b
-             #define xglue(a, b) glue(a, b)
-             #define HIGHLOW     "hello"
-             #define LOW         LOW ", world"
-             debug(1, 2);
-             fputs(str(strncmp("abc\0d", "abc", '\4') // this goes away
-                   == 0) str(: @\n), s);
-             #include xstr(INCFILE(2).h)
-             glue(HIGH, LOW);
-             xglue(HIGH, LOW)
-    results in
-
-
-
-
-[<a name="p156" href="#p156">page 156</a>] (<a href="#Contents">Contents</a>)
-
-             printf("x" "1" "= %d, x" "2" "= %s", x1, x2);
-             fputs(
-               "strncmp(\"abc\\0d\", \"abc\", '\\4') == 0" ": @\n",
-               s);
-             #include "vers2.h"    (after macro replacement, before file access)
-             "hello";
-             "hello" ", world"
-    or, after concatenation of the character string literals,
-             printf("x1= %d, x2= %s", x1, x2);
-             fputs(
-               "strncmp(\"abc\\0d\", \"abc\", '\\4') == 0: @\n",
-               s);
-             #include "vers2.h"    (after macro replacement, before file access)
-             "hello";
-             "hello, world"
-    Space around the # and ## tokens in the macro definition is optional.
-
-7   EXAMPLE 5        To illustrate the rules for placemarker preprocessing tokens, the sequence
-             #define t(x,y,z) x ## y ## z
-             int j[] = { t(1,2,3), t(,4,5), t(6,,7), t(8,9,),
-                        t(10,,), t(,11,), t(,,12), t(,,) };
-    results in
-             int j[] = { 123, 45, 67, 89,
-                         10, 11, 12, };
-
-8   EXAMPLE 6        To demonstrate the redefinition rules, the following sequence is valid.
-             #define      OBJ_LIKE      (1-1)
-             #define      OBJ_LIKE      /* white space */ (1-1) /* other */
-             #define      FUNC_LIKE(a)   ( a )
-             #define      FUNC_LIKE( a )( /* note the white space */ \
-                                          a /* other stuff on this line
-                                              */ )
-    But the following redefinitions are invalid:
-             #define      OBJ_LIKE    (0)     // different token sequence
-             #define      OBJ_LIKE    (1 - 1) // different white space
-             #define      FUNC_LIKE(b) ( a ) // different parameter usage
-             #define      FUNC_LIKE(b) ( b ) // different parameter spelling
-
-9   EXAMPLE 7        Finally, to show the variable argument list macro facilities:
-             #define debug(...)       fprintf(stderr, __VA_ARGS__)
-             #define showlist(...)    puts(#__VA_ARGS__)
-             #define report(test, ...) ((test)?puts(#test):\
-                         printf(__VA_ARGS__))
-             debug("Flag");
-             debug("X = %d\n", x);
-             showlist(The first, second, and third items.);
-             report(x&gt;y, "x is %d but y is %d", x, y);
-
-
-[<a name="p157" href="#p157">page 157</a>] (<a href="#Contents">Contents</a>)
-
-    results in
-             fprintf(stderr, "Flag" );
-             fprintf(stderr, "X = %d\n", x );
-             puts( "The first, second, and third items." );
-             ((x&gt;y)?puts("x&gt;y"):
-                         printf("x is %d but y is %d", x, y));
-
-<a name="6.10.4" href="#6.10.4"><b>    6.10.4 Line control</b></a>
-    Constraints
-1   The string literal of a #line directive, if present, shall be a character string literal.
-    Semantics
-2   The line number of the current source line is one greater than the number of new-line
-    characters read or introduced in translation phase 1 (<a href="#5.1.1.2">5.1.1.2</a>) while processing the source
-    file to the current token.
-3   A preprocessing directive of the form
-       # line digit-sequence new-line
-    causes the implementation to behave as if the following sequence of source lines begins
-    with a source line that has a line number as specified by the digit sequence (interpreted as
-    a decimal integer). The digit sequence shall not specify zero, nor a number greater than
-    2147483647.
-4   A preprocessing directive of the form
-       # line digit-sequence "s-char-sequenceopt" new-line
-    sets the presumed line number similarly and changes the presumed name of the source
-    file to be the contents of the character string literal.
-5   A preprocessing directive of the form
-       # line pp-tokens new-line
-    (that does not match one of the two previous forms) is permitted. The preprocessing
-    tokens after line on the directive are processed just as in normal text (each identifier
-    currently defined as a macro name is replaced by its replacement list of preprocessing
-    tokens). The directive resulting after all replacements shall match one of the two
-    previous forms and is then processed as appropriate.
-
-
-
-
-[<a name="p158" href="#p158">page 158</a>] (<a href="#Contents">Contents</a>)
-
-<a name="6.10.5" href="#6.10.5"><b>    6.10.5 Error directive</b></a>
-    Semantics
-1   A preprocessing directive of the form
-       # error pp-tokensopt new-line
-    causes the implementation to produce a diagnostic message that includes the specified
-    sequence of preprocessing tokens.
-<a name="6.10.6" href="#6.10.6"><b>    6.10.6 Pragma directive</b></a>
-    Semantics
-1   A preprocessing directive of the form
-       # pragma pp-tokensopt new-line
-    where the preprocessing token STDC does not immediately follow pragma in the
-    directive (prior to any macro replacement)152) causes the implementation to behave in an
-    implementation-defined manner. The behavior might cause translation to fail or cause the
-    translator or the resulting program to behave in a non-conforming manner. Any such
-    pragma that is not recognized by the implementation is ignored.
-2   If the preprocessing token STDC does immediately follow pragma in the directive (prior
-    to any macro replacement), then no macro replacement is performed on the directive, and
-    the directive shall have one of the following forms153) whose meanings are described
-    elsewhere:
-       #pragma STDC FP_CONTRACT on-off-switch
-       #pragma STDC FENV_ACCESS on-off-switch
-       #pragma STDC CX_LIMITED_RANGE on-off-switch
-       on-off-switch: one of
-                   ON     OFF           DEFAULT
-    Forward references: the FP_CONTRACT pragma (<a href="#7.12.2">7.12.2</a>), the FENV_ACCESS pragma
-    (<a href="#7.6.1">7.6.1</a>), the CX_LIMITED_RANGE pragma (<a href="#7.3.4">7.3.4</a>).
-
-
-
-
-    152) An implementation is not required to perform macro replacement in pragmas, but it is permitted
-         except for in standard pragmas (where STDC immediately follows pragma). If the result of macro
-         replacement in a non-standard pragma has the same form as a standard pragma, the behavior is still
-         implementation-defined; an implementation is permitted to behave as if it were the standard pragma,
-         but is not required to.
-    153) See ''future language directions'' (<a href="#6.11.8">6.11.8</a>).
-
-[<a name="p159" href="#p159">page 159</a>] (<a href="#Contents">Contents</a>)
-
-<a name="6.10.7" href="#6.10.7"><b>    6.10.7 Null directive</b></a>
-    Semantics
-1   A preprocessing directive of the form
-       # new-line
-    has no effect.
-<a name="6.10.8" href="#6.10.8"><b>    6.10.8 Predefined macro names</b></a>
-1   The following macro names154) shall be defined by the implementation:
-    __DATE__ The date of translation of the preprocessing translation unit: a character
-               string literal of the form "Mmm dd yyyy", where the names of the
-               months are the same as those generated by the asctime function, and the
-               first character of dd is a space character if the value is less than 10. If the
-               date of translation is not available, an implementation-defined valid date
-               shall be supplied.
-    __FILE__ The presumed name of the current source file (a character string literal).155)
-    __LINE__ The presumed line number (within the current source file) of the current
-               source line (an integer constant).155)
-    __STDC__ The integer constant 1, intended to indicate a conforming implementation.
-    __STDC_HOSTED__ The integer constant 1 if the implementation is a hosted
-              implementation or the integer constant 0 if it is not.
-    __STDC_MB_MIGHT_NEQ_WC__ The integer constant 1, intended to indicate that, in
-              the encoding for wchar_t, a member of the basic character set need not
-              have a code value equal to its value when used as the lone character in an
-              integer character constant.
-    __STDC_VERSION__ The integer constant 199901L.156)
-    __TIME__ The time of translation of the preprocessing translation unit: a character
-               string literal of the form "hh:mm:ss" as in the time generated by the
-               asctime function. If the time of translation is not available, an
-               implementation-defined valid time shall be supplied.
-
-
-
-    154) See ''future language directions'' (<a href="#6.11.9">6.11.9</a>).
-    155) The presumed source file name and line number can be changed by the #line directive.
-    156) This macro was not specified in ISO/IEC 9899:1990 and was specified as 199409L in
-         ISO/IEC 9899/AMD1:1995. The intention is that this will remain an integer constant of type long
-         int that is increased with each revision of this International Standard.
-
-[<a name="p160" href="#p160">page 160</a>] (<a href="#Contents">Contents</a>)
-
-2   The following macro names are conditionally defined by the implementation:
-    __STDC_IEC_559__ The integer constant 1, intended to indicate conformance to the
-              specifications in <a href="#F">annex F</a> (IEC 60559 floating-point arithmetic).
-    __STDC_IEC_559_COMPLEX__ The integer constant 1, intended to indicate
-              adherence to the specifications in informative <a href="#G">annex G</a> (IEC 60559
-              compatible complex arithmetic).
-    __STDC_ISO_10646__ An integer constant of the form yyyymmL (for example,
-              199712L). If this symbol is defined, then every character in the Unicode
-              required set, when stored in an object of type wchar_t, has the same
-              value as the short identifier of that character. The Unicode required set
-              consists of all the characters that are defined by ISO/IEC 10646, along with
-              all amendments and technical corrigenda, as of the specified year and
-              month.
-3   The values of the predefined macros (except for __FILE__ and __LINE__) remain
-    constant throughout the translation unit.
-4   None of these macro names, nor the identifier defined, shall be the subject of a
-    #define or a #undef preprocessing directive. Any other predefined macro names
-    shall begin with a leading underscore followed by an uppercase letter or a second
-    underscore.
-5   The implementation shall not predefine the macro __cplusplus, nor shall it define it
-    in any standard header.
-    Forward references: the asctime function (<a href="#7.23.3.1">7.23.3.1</a>), standard headers (<a href="#7.1.2">7.1.2</a>).
-<a name="6.10.9" href="#6.10.9"><b>    6.10.9 Pragma operator</b></a>
-    Semantics
-1   A unary operator expression of the form:
-       _Pragma ( string-literal )
-    is processed as follows: The string literal is destringized by deleting the L prefix, if
-    present, deleting the leading and trailing double-quotes, replacing each escape sequence
-    \" by a double-quote, and replacing each escape sequence \\ by a single backslash. The
-    resulting sequence of characters is processed through translation phase 3 to produce
-    preprocessing tokens that are executed as if they were the pp-tokens in a pragma
-    directive. The original four preprocessing tokens in the unary operator expression are
-    removed.
-2   EXAMPLE       A directive of the form:
-             #pragma listing on "..\listing.dir"
-    can also be expressed as:
-[<a name="p161" href="#p161">page 161</a>] (<a href="#Contents">Contents</a>)
-
-        _Pragma ( "listing on \"..\\listing.dir\"" )
-The latter form is processed in the same way whether it appears literally as shown, or results from macro
-replacement, as in:
-        #define LISTING(x) PRAGMA(listing on #x)
-        #define PRAGMA(x) _Pragma(#x)
-        LISTING ( ..\listing.dir )
-
-
-
-
-[<a name="p162" href="#p162">page 162</a>] (<a href="#Contents">Contents</a>)
-
-<a name="6.11" href="#6.11"><b>    6.11 Future language directions</b></a>
-<a name="6.11.1" href="#6.11.1"><b>    6.11.1 Floating types</b></a>
-1   Future standardization may include additional floating-point types, including those with
-    greater range, precision, or both than long double.
-<a name="6.11.2" href="#6.11.2"><b>    6.11.2 Linkages of identifiers</b></a>
-1   Declaring an identifier with internal linkage at file scope without the static storage-
-    class specifier is an obsolescent feature.
-<a name="6.11.3" href="#6.11.3"><b>    6.11.3 External names</b></a>
-1   Restriction of the significance of an external name to fewer than 255 characters
-    (considering each universal character name or extended source character as a single
-    character) is an obsolescent feature that is a concession to existing implementations.
-<a name="6.11.4" href="#6.11.4"><b>    6.11.4 Character escape sequences</b></a>
-1   Lowercase letters as escape sequences are reserved for future standardization. Other
-    characters may be used in extensions.
-<a name="6.11.5" href="#6.11.5"><b>    6.11.5 Storage-class specifiers</b></a>
-1   The placement of a storage-class specifier other than at the beginning of the declaration
-    specifiers in a declaration is an obsolescent feature.
-<a name="6.11.6" href="#6.11.6"><b>    6.11.6 Function declarators</b></a>
-1   The use of function declarators with empty parentheses (not prototype-format parameter
-    type declarators) is an obsolescent feature.
-<a name="6.11.7" href="#6.11.7"><b>    6.11.7 Function definitions</b></a>
-1   The use of function definitions with separate parameter identifier and declaration lists
-    (not prototype-format parameter type and identifier declarators) is an obsolescent feature.
-<a name="6.11.8" href="#6.11.8"><b>    6.11.8 Pragma directives</b></a>
-1   Pragmas whose first preprocessing token is STDC are reserved for future standardization.
-<a name="6.11.9" href="#6.11.9"><b>    6.11.9 Predefined macro names</b></a>
-1   Macro names beginning with __STDC_ are reserved for future standardization.
-
-
-
-
-[<a name="p163" href="#p163">page 163</a>] (<a href="#Contents">Contents</a>)
-
-
-<a name="7" href="#7"><b>    7. Library</b></a>
-
-<a name="7.1" href="#7.1"><b>    7.1 Introduction</b></a>
-<a name="7.1.1" href="#7.1.1"><b>    7.1.1 Definitions of terms</b></a>
-1   A string is a contiguous sequence of characters terminated by and including the first null
-    character. The term multibyte string is sometimes used instead to emphasize special
-    processing given to multibyte characters contained in the string or to avoid confusion
-    with a wide string. A pointer to a string is a pointer to its initial (lowest addressed)
-    character. The length of a string is the number of bytes preceding the null character and
-    the value of a string is the sequence of the values of the contained characters, in order.
-2   The decimal-point character is the character used by functions that convert floating-point
-    numbers to or from character sequences to denote the beginning of the fractional part of
-    such character sequences.157) It is represented in the text and examples by a period, but
-    may be changed by the setlocale function.
-3   A null wide character is a wide character with code value zero.
-4   A wide string is a contiguous sequence of wide characters terminated by and including
-    the first null wide character. A pointer to a wide string is a pointer to its initial (lowest
-    addressed) wide character. The length of a wide string is the number of wide characters
-    preceding the null wide character and the value of a wide string is the sequence of code
-    values of the contained wide characters, in order.
-5   A shift sequence is a contiguous sequence of bytes within a multibyte string that
-    (potentially) causes a change in shift state (see <a href="#5.2.1.2">5.2.1.2</a>). A shift sequence shall not have a
-    corresponding wide character; it is instead taken to be an adjunct to an adjacent multibyte
-    character.158)
-    Forward references: character handling (<a href="#7.4">7.4</a>), the setlocale function (<a href="#7.11.1.1">7.11.1.1</a>).
-
-
-
-
-    157) The functions that make use of the decimal-point character are the numeric conversion functions
-         (<a href="#7.20.1">7.20.1</a>, <a href="#7.24.4.1">7.24.4.1</a>) and the formatted input/output functions (<a href="#7.19.6">7.19.6</a>, <a href="#7.24.2">7.24.2</a>).
-    158) For state-dependent encodings, the values for MB_CUR_MAX and MB_LEN_MAX shall thus be large
-         enough to count all the bytes in any complete multibyte character plus at least one adjacent shift
-         sequence of maximum length. Whether these counts provide for more than one shift sequence is the
-         implementation's choice.
-
-[<a name="p164" href="#p164">page 164</a>] (<a href="#Contents">Contents</a>)
-
-<a name="7.1.2" href="#7.1.2"><b>    7.1.2 Standard headers</b></a>
-1   Each library function is declared, with a type that includes a prototype, in a header,159)
-    whose contents are made available by the #include preprocessing directive. The
-    header declares a set of related functions, plus any necessary types and additional macros
-    needed to facilitate their use. Declarations of types described in this clause shall not
-    include type qualifiers, unless explicitly stated otherwise.
-2   The standard headers are
-           <a href="#7.2">&lt;assert.h&gt;</a>             <a href="#7.8">&lt;inttypes.h&gt;</a>            <a href="#7.14">&lt;signal.h&gt;</a>              <a href="#7.20">&lt;stdlib.h&gt;</a>
-           <a href="#7.3">&lt;complex.h&gt;</a>            <a href="#7.9">&lt;iso646.h&gt;</a>              <a href="#7.15">&lt;stdarg.h&gt;</a>              <a href="#7.21">&lt;string.h&gt;</a>
-           <a href="#7.4">&lt;ctype.h&gt;</a>              <a href="#7.10">&lt;limits.h&gt;</a>              <a href="#7.16">&lt;stdbool.h&gt;</a>             <a href="#7.22">&lt;tgmath.h&gt;</a>
-           <a href="#7.5">&lt;errno.h&gt;</a>              <a href="#7.11">&lt;locale.h&gt;</a>              <a href="#7.17">&lt;stddef.h&gt;</a>              <a href="#7.23">&lt;time.h&gt;</a>
-           <a href="#7.6">&lt;fenv.h&gt;</a>               <a href="#7.12">&lt;math.h&gt;</a>                <a href="#7.18">&lt;stdint.h&gt;</a>              <a href="#7.24">&lt;wchar.h&gt;</a>
-           <a href="#7.7">&lt;float.h&gt;</a>              <a href="#7.13">&lt;setjmp.h&gt;</a>              <a href="#7.19">&lt;stdio.h&gt;</a>               <a href="#7.25">&lt;wctype.h&gt;</a>
-3   If a file with the same name as one of the above &lt; and &gt; delimited sequences, not
-    provided as part of the implementation, is placed in any of the standard places that are
-    searched for included source files, the behavior is undefined.
-4   Standard headers may be included in any order; each may be included more than once in
-    a given scope, with no effect different from being included only once, except that the
-    effect of including <a href="#7.2">&lt;assert.h&gt;</a> depends on the definition of NDEBUG (see <a href="#7.2">7.2</a>). If
-    used, a header shall be included outside of any external declaration or definition, and it
-    shall first be included before the first reference to any of the functions or objects it
-    declares, or to any of the types or macros it defines. However, if an identifier is declared
-    or defined in more than one header, the second and subsequent associated headers may be
-    included after the initial reference to the identifier. The program shall not have any
-    macros with names lexically identical to keywords currently defined prior to the
-    inclusion.
-5   Any definition of an object-like macro described in this clause shall expand to code that is
-    fully protected by parentheses where necessary, so that it groups in an arbitrary
-    expression as if it were a single identifier.
-6   Any declaration of a library function shall have external linkage.
-7   A summary of the contents of the standard headers is given in <a href="#B">annex B</a>.
-    Forward references: diagnostics (<a href="#7.2">7.2</a>).
-
-
-
-
-    159) A header is not necessarily a source file, nor are the &lt; and &gt; delimited sequences in header names
-         necessarily valid source file names.
-
-[<a name="p165" href="#p165">page 165</a>] (<a href="#Contents">Contents</a>)
-
-<a name="7.1.3" href="#7.1.3"><b>    7.1.3 Reserved identifiers</b></a>
-1   Each header declares or defines all identifiers listed in its associated subclause, and
-    optionally declares or defines identifiers listed in its associated future library directions
-    subclause and identifiers which are always reserved either for any use or for use as file
-    scope identifiers.
-    -- All identifiers that begin with an underscore and either an uppercase letter or another
-      underscore are always reserved for any use.
-    -- All identifiers that begin with an underscore are always reserved for use as identifiers
-      with file scope in both the ordinary and tag name spaces.
-    -- Each macro name in any of the following subclauses (including the future library
-      directions) is reserved for use as specified if any of its associated headers is included;
-      unless explicitly stated otherwise (see <a href="#7.1.4">7.1.4</a>).
-    -- All identifiers with external linkage in any of the following subclauses (including the
-      future library directions) are always reserved for use as identifiers with external
-      linkage.160)
-    -- Each identifier with file scope listed in any of the following subclauses (including the
-      future library directions) is reserved for use as a macro name and as an identifier with
-      file scope in the same name space if any of its associated headers is included.
-2   No other identifiers are reserved. If the program declares or defines an identifier in a
-    context in which it is reserved (other than as allowed by <a href="#7.1.4">7.1.4</a>), or defines a reserved
-    identifier as a macro name, the behavior is undefined.
-3   If the program removes (with #undef) any macro definition of an identifier in the first
-    group listed above, the behavior is undefined.
-<a name="7.1.4" href="#7.1.4"><b>    7.1.4 Use of library functions</b></a>
-1   Each of the following statements applies unless explicitly stated otherwise in the detailed
-    descriptions that follow: If an argument to a function has an invalid value (such as a value
-    outside the domain of the function, or a pointer outside the address space of the program,
-    or a null pointer, or a pointer to non-modifiable storage when the corresponding
-    parameter is not const-qualified) or a type (after promotion) not expected by a function
-    with variable number of arguments, the behavior is undefined. If a function argument is
-    described as being an array, the pointer actually passed to the function shall have a value
-    such that all address computations and accesses to objects (that would be valid if the
-    pointer did point to the first element of such an array) are in fact valid. Any function
-    declared in a header may be additionally implemented as a function-like macro defined in
-
-    160) The list of reserved identifiers with external linkage includes errno, math_errhandling,
-         setjmp, and va_end.
-
-[<a name="p166" href="#p166">page 166</a>] (<a href="#Contents">Contents</a>)
-
-    the header, so if a library function is declared explicitly when its header is included, one
-    of the techniques shown below can be used to ensure the declaration is not affected by
-    such a macro. Any macro definition of a function can be suppressed locally by enclosing
-    the name of the function in parentheses, because the name is then not followed by the left
-    parenthesis that indicates expansion of a macro function name. For the same syntactic
-    reason, it is permitted to take the address of a library function even if it is also defined as
-    a macro.161) The use of #undef to remove any macro definition will also ensure that an
-    actual function is referred to. Any invocation of a library function that is implemented as
-    a macro shall expand to code that evaluates each of its arguments exactly once, fully
-    protected by parentheses where necessary, so it is generally safe to use arbitrary
-    expressions as arguments.162) Likewise, those function-like macros described in the
-    following subclauses may be invoked in an expression anywhere a function with a
-    compatible return type could be called.163) All object-like macros listed as expanding to
-    integer constant expressions shall additionally be suitable for use in #if preprocessing
-    directives.
-2   Provided that a library function can be declared without reference to any type defined in a
-    header, it is also permissible to declare the function and use it without including its
-    associated header.
-3   There is a sequence point immediately before a library function returns.
-4   The functions in the standard library are not guaranteed to be reentrant and may modify
-    objects with static storage duration.164)
-
-
-
-    161) This means that an implementation shall provide an actual function for each library function, even if it
-         also provides a macro for that function.
-    162) Such macros might not contain the sequence points that the corresponding function calls do.
-    163) Because external identifiers and some macro names beginning with an underscore are reserved,
-         implementations may provide special semantics for such names. For example, the identifier
-         _BUILTIN_abs could be used to indicate generation of in-line code for the abs function. Thus, the
-         appropriate header could specify
-                  #define abs(x) _BUILTIN_abs(x)
-         for a compiler whose code generator will accept it.
-         In this manner, a user desiring to guarantee that a given library function such as abs will be a genuine
-         function may write
-                  #undef abs
-         whether the implementation's header provides a macro implementation of abs or a built-in
-         implementation. The prototype for the function, which precedes and is hidden by any macro
-         definition, is thereby revealed also.
-    164) Thus, a signal handler cannot, in general, call standard library functions.
-
-[<a name="p167" href="#p167">page 167</a>] (<a href="#Contents">Contents</a>)
-
-5   EXAMPLE       The function atoi may be used in any of several ways:
-    -- by use of its associated header (possibly generating a macro expansion)
-                #include <a href="#7.20">&lt;stdlib.h&gt;</a>
-                const char *str;
-                /* ... */
-                i = atoi(str);
-    -- by use of its associated header (assuredly generating a true function reference)
-                #include <a href="#7.20">&lt;stdlib.h&gt;</a>
-                #undef atoi
-                const char *str;
-                /* ... */
-                i = atoi(str);
-       or
-                #include <a href="#7.20">&lt;stdlib.h&gt;</a>
-                const char *str;
-                /* ... */
-                i = (atoi)(str);
-    -- by explicit declaration
-                extern int atoi(const char *);
-                const char *str;
+                        int      type;
+                        int      intnode;
+                  } ni;
+                  struct {
+                        int      type;
+                        double doublenode;
+                  } nf;
+          } u;
+          u.nf.type = 1;
+          u.nf.doublenode = <a href="#3.14">3.14</a>;
+          /* ... */
+          if (u.n.alltypes == 1)
+                  if (sin(u.nf.doublenode) == 0.0)
+                        /* ... */
+</pre>
+ The following is not a valid fragment (because the union type is not visible within function f):
+<pre>
+          struct t1 { int m; };
+          struct t2 { int m; };
+          int f(struct t1 *p1, struct t2 *p2)
+          {
+                if (p1-&gt;m &lt; 0)
+                        p2-&gt;m = -p2-&gt;m;
+                return p1-&gt;m;
+          }
+          int g()
+          {
+                union {
+                        struct t1 s1;
+                        struct t2 s2;
+                } u;
                 /* ... */
-                i = atoi(str);
-
-
-
-
-[<a name="p168" href="#p168">page 168</a>] (<a href="#Contents">Contents</a>)
-
-<a name="7.2" href="#7.2"><b>    7.2 Diagnostics &lt;assert.h&gt;</b></a>
-1   The header <a href="#7.2">&lt;assert.h&gt;</a> defines the assert macro and refers to another macro,
-            NDEBUG
-    which is not defined by <a href="#7.2">&lt;assert.h&gt;</a>. If NDEBUG is defined as a macro name at the
-    point in the source file where <a href="#7.2">&lt;assert.h&gt;</a> is included, the assert macro is defined
-    simply as
-            #define assert(ignore) ((void)0)
-    The assert macro is redefined according to the current state of NDEBUG each time that
-    <a href="#7.2">&lt;assert.h&gt;</a> is included.
-2   The assert macro shall be implemented as a macro, not as an actual function. If the
-    macro definition is suppressed in order to access an actual function, the behavior is
-    undefined.
-<a name="7.2.1" href="#7.2.1"><b>    7.2.1 Program diagnostics</b></a>
-<a name="7.2.1.1" href="#7.2.1.1"><b>    7.2.1.1 The assert macro</b></a>
-    Synopsis
-1           #include <a href="#7.2">&lt;assert.h&gt;</a>
-            void assert(scalar expression);
-    Description
-2   The assert macro puts diagnostic tests into programs; it expands to a void expression.
-    When it is executed, if expression (which shall have a scalar type) is false (that is,
-    compares equal to 0), the assert macro writes information about the particular call that
-    failed (including the text of the argument, the name of the source file, the source line
-    number, and the name of the enclosing function -- the latter are respectively the values of
-    the preprocessing macros __FILE__ and __LINE__ and of the identifier
-    __func__) on the standard error stream in an implementation-defined format.165) It
-    then calls the abort function.
-    Returns
-3   The assert macro returns no value.
-    Forward references: the abort function (<a href="#7.20.4.1">7.20.4.1</a>).
-
-
-
-
-    165) The message written might be of the form:
-         Assertion failed: expression, function abc, file xyz, line nnn.
-
-
-[<a name="p169" href="#p169">page 169</a>] (<a href="#Contents">Contents</a>)
-
-<a name="7.3" href="#7.3"><b>    7.3 Complex arithmetic &lt;complex.h&gt;</b></a>
-<a name="7.3.1" href="#7.3.1"><b>    7.3.1 Introduction</b></a>
-1   The header <a href="#7.3">&lt;complex.h&gt;</a> defines macros and declares functions that support complex
-    arithmetic.166) Each synopsis specifies a family of functions consisting of a principal
-    function with one or more double complex parameters and a double complex or
-    double return value; and other functions with the same name but with f and l suffixes
-    which are corresponding functions with float and long double parameters and
-    return values.
-2   The macro
-             complex
-    expands to _Complex; the macro
-             _Complex_I
-    expands to a constant expression of type const float _Complex, with the value of
-    the imaginary unit.167)
-3   The macros
-             imaginary
-    and
-             _Imaginary_I
-    are defined if and only if the implementation supports imaginary types;168) if defined,
-    they expand to _Imaginary and a constant expression of type const float
-    _Imaginary with the value of the imaginary unit.
-4   The macro
-             I
-    expands to either _Imaginary_I or _Complex_I. If _Imaginary_I is not
-    defined, I shall expand to _Complex_I.
-5   Notwithstanding the provisions of <a href="#7.1.3">7.1.3</a>, a program may undefine and perhaps then
-    redefine the macros complex, imaginary, and I.
-    Forward references: IEC 60559-compatible complex arithmetic (<a href="#G">annex G</a>).
-
-
-
-    166) See ''future library directions'' (<a href="#7.26.1">7.26.1</a>).
-    167) The imaginary unit is a number i such that i 2   = -1.
-    168) A specification for imaginary types is in informative <a href="#G">annex G</a>.
-
-[<a name="p170" href="#p170">page 170</a>] (<a href="#Contents">Contents</a>)
-
-<a name="7.3.2" href="#7.3.2"><b>    7.3.2 Conventions</b></a>
-1   Values are interpreted as radians, not degrees. An implementation may set errno but is
-    not required to.
-<a name="7.3.3" href="#7.3.3"><b>    7.3.3 Branch cuts</b></a>
-1   Some of the functions below have branch cuts, across which the function is
-    discontinuous. For implementations with a signed zero (including all IEC 60559
-    implementations) that follow the specifications of <a href="#G">annex G</a>, the sign of zero distinguishes
-    one side of a cut from another so the function is continuous (except for format
-    limitations) as the cut is approached from either side. For example, for the square root
-    function, which has a branch cut along the negative real axis, the top of the cut, with
-    imaginary part +0, maps to the positive imaginary axis, and the bottom of the cut, with
-    imaginary part -0, maps to the negative imaginary axis.
-2   Implementations that do not support a signed zero (see <a href="#F">annex F</a>) cannot distinguish the
-    sides of branch cuts. These implementations shall map a cut so the function is continuous
-    as the cut is approached coming around the finite endpoint of the cut in a counter
-    clockwise direction. (Branch cuts for the functions specified here have just one finite
-    endpoint.) For example, for the square root function, coming counter clockwise around
-    the finite endpoint of the cut along the negative real axis approaches the cut from above,
-    so the cut maps to the positive imaginary axis.
-<a name="7.3.4" href="#7.3.4"><b>    7.3.4 The CX_LIMITED_RANGE pragma</b></a>
-    Synopsis
-1            #include <a href="#7.3">&lt;complex.h&gt;</a>
-             #pragma STDC CX_LIMITED_RANGE on-off-switch
-    Description
-2   The usual mathematical formulas for complex multiply, divide, and absolute value are
-    problematic because of their treatment of infinities and because of undue overflow and
-    underflow. The CX_LIMITED_RANGE pragma can be used to inform the
-    implementation that (where the state is ''on'') the usual mathematical formulas are
-    acceptable.169) The pragma can occur either outside external declarations or preceding all
-    explicit declarations and statements inside a compound statement. When outside external
-
-    169) The purpose of the pragma is to allow the implementation to use the formulas:
-             (x + iy) x (u + iv) = (xu - yv) + i(yu + xv)
-             (x + iy) / (u + iv) = [(xu + yv) + i(yu - xv)]/(u2 + v 2 )
-             | x + iy | = sqrt: x 2 + y 2
-                          ???????????????
-         where the programmer can determine they are safe.
-
-[<a name="p171" href="#p171">page 171</a>] (<a href="#Contents">Contents</a>)
-
-    declarations, the pragma takes effect from its occurrence until another
-    CX_LIMITED_RANGE pragma is encountered, or until the end of the translation unit.
-    When inside a compound statement, the pragma takes effect from its occurrence until
-    another CX_LIMITED_RANGE pragma is encountered (including within a nested
-    compound statement), or until the end of the compound statement; at the end of a
-    compound statement the state for the pragma is restored to its condition just before the
-    compound statement. If this pragma is used in any other context, the behavior is
-    undefined. The default state for the pragma is ''off''.
-<a name="7.3.5" href="#7.3.5"><b>    7.3.5 Trigonometric functions</b></a>
-<a name="7.3.5.1" href="#7.3.5.1"><b>    7.3.5.1 The cacos functions</b></a>
-    Synopsis
-1          #include <a href="#7.3">&lt;complex.h&gt;</a>
-           double complex cacos(double complex z);
-           float complex cacosf(float complex z);
-           long double complex cacosl(long double complex z);
-    Description
-2   The cacos functions compute the complex arc cosine of z, with branch cuts outside the
-    interval [-1, +1] along the real axis.
-    Returns
-3   The cacos functions return the complex arc cosine value, in the range of a strip
-    mathematically unbounded along the imaginary axis and in the interval [0, pi ] along the
-    real axis.
-<a name="7.3.5.2" href="#7.3.5.2"><b>    7.3.5.2 The casin functions</b></a>
-    Synopsis
-1          #include <a href="#7.3">&lt;complex.h&gt;</a>
-           double complex casin(double complex z);
-           float complex casinf(float complex z);
-           long double complex casinl(long double complex z);
-    Description
-2   The casin functions compute the complex arc sine of z, with branch cuts outside the
-    interval [-1, +1] along the real axis.
-    Returns
-3   The casin functions return the complex arc sine value, in the range of a strip
-    mathematically unbounded along the imaginary axis and in the interval [-pi /2, +pi /2]
-    along the real axis.
-
-[<a name="p172" href="#p172">page 172</a>] (<a href="#Contents">Contents</a>)
-
-<a name="7.3.5.3" href="#7.3.5.3"><b>    7.3.5.3 The catan functions</b></a>
-    Synopsis
-1          #include <a href="#7.3">&lt;complex.h&gt;</a>
-           double complex catan(double complex z);
-           float complex catanf(float complex z);
-           long double complex catanl(long double complex z);
-    Description
-2   The catan functions compute the complex arc tangent of z, with branch cuts outside the
-    interval [-i, +i] along the imaginary axis.
-    Returns
-3   The catan functions return the complex arc tangent value, in the range of a strip
-    mathematically unbounded along the imaginary axis and in the interval [-pi /2, +pi /2]
-    along the real axis.
-<a name="7.3.5.4" href="#7.3.5.4"><b>    7.3.5.4 The ccos functions</b></a>
-    Synopsis
-1          #include <a href="#7.3">&lt;complex.h&gt;</a>
-           double complex ccos(double complex z);
-           float complex ccosf(float complex z);
-           long double complex ccosl(long double complex z);
-    Description
-2   The ccos functions compute the complex cosine of z.
-    Returns
-3   The ccos functions return the complex cosine value.
-<a name="7.3.5.5" href="#7.3.5.5"><b>    7.3.5.5 The csin functions</b></a>
-    Synopsis
-1          #include <a href="#7.3">&lt;complex.h&gt;</a>
-           double complex csin(double complex z);
-           float complex csinf(float complex z);
-           long double complex csinl(long double complex z);
-    Description
-2   The csin functions compute the complex sine of z.
-    Returns
-3   The csin functions return the complex sine value.
-
-[<a name="p173" href="#p173">page 173</a>] (<a href="#Contents">Contents</a>)
-
-<a name="7.3.5.6" href="#7.3.5.6"><b>    7.3.5.6 The ctan functions</b></a>
-    Synopsis
-1          #include <a href="#7.3">&lt;complex.h&gt;</a>
-           double complex ctan(double complex z);
-           float complex ctanf(float complex z);
-           long double complex ctanl(long double complex z);
-    Description
-2   The ctan functions compute the complex tangent of z.
-    Returns
-3   The ctan functions return the complex tangent value.
-<a name="7.3.6" href="#7.3.6"><b>    7.3.6 Hyperbolic functions</b></a>
-<a name="7.3.6.1" href="#7.3.6.1"><b>    7.3.6.1 The cacosh functions</b></a>
-    Synopsis
-1          #include <a href="#7.3">&lt;complex.h&gt;</a>
-           double complex cacosh(double complex z);
-           float complex cacoshf(float complex z);
-           long double complex cacoshl(long double complex z);
-    Description
-2   The cacosh functions compute the complex arc hyperbolic cosine of z, with a branch
-    cut at values less than 1 along the real axis.
-    Returns
-3   The cacosh functions return the complex arc hyperbolic cosine value, in the range of a
-    half-strip of non-negative values along the real axis and in the interval [-ipi , +ipi ] along
-    the imaginary axis.
-<a name="7.3.6.2" href="#7.3.6.2"><b>    7.3.6.2 The casinh functions</b></a>
-    Synopsis
-1          #include <a href="#7.3">&lt;complex.h&gt;</a>
-           double complex casinh(double complex z);
-           float complex casinhf(float complex z);
-           long double complex casinhl(long double complex z);
-    Description
-2   The casinh functions compute the complex arc hyperbolic sine of z, with branch cuts
-    outside the interval [-i, +i] along the imaginary axis.
-
-
-[<a name="p174" href="#p174">page 174</a>] (<a href="#Contents">Contents</a>)
-
-    Returns
-3   The casinh functions return the complex arc hyperbolic sine value, in the range of a
-    strip mathematically unbounded along the real axis and in the interval [-ipi /2, +ipi /2]
-    along the imaginary axis.
-<a name="7.3.6.3" href="#7.3.6.3"><b>    7.3.6.3 The catanh functions</b></a>
-    Synopsis
-1          #include <a href="#7.3">&lt;complex.h&gt;</a>
-           double complex catanh(double complex z);
-           float complex catanhf(float complex z);
-           long double complex catanhl(long double complex z);
-    Description
-2   The catanh functions compute the complex arc hyperbolic tangent of z, with branch
-    cuts outside the interval [-1, +1] along the real axis.
-    Returns
-3   The catanh functions return the complex arc hyperbolic tangent value, in the range of a
-    strip mathematically unbounded along the real axis and in the interval [-ipi /2, +ipi /2]
-    along the imaginary axis.
-<a name="7.3.6.4" href="#7.3.6.4"><b>    7.3.6.4 The ccosh functions</b></a>
-    Synopsis
-1          #include <a href="#7.3">&lt;complex.h&gt;</a>
-           double complex ccosh(double complex z);
-           float complex ccoshf(float complex z);
-           long double complex ccoshl(long double complex z);
-    Description
-2   The ccosh functions compute the complex hyperbolic cosine of z.
-    Returns
-3   The ccosh functions return the complex hyperbolic cosine value.
-<a name="7.3.6.5" href="#7.3.6.5"><b>    7.3.6.5 The csinh functions</b></a>
-    Synopsis
-1          #include <a href="#7.3">&lt;complex.h&gt;</a>
-           double complex csinh(double complex z);
-           float complex csinhf(float complex z);
-           long double complex csinhl(long double complex z);
-
-
-[<a name="p175" href="#p175">page 175</a>] (<a href="#Contents">Contents</a>)
-
-    Description
-2   The csinh functions compute the complex hyperbolic sine of z.
-    Returns
-3   The csinh functions return the complex hyperbolic sine value.
-<a name="7.3.6.6" href="#7.3.6.6"><b>    7.3.6.6 The ctanh functions</b></a>
-    Synopsis
-1          #include <a href="#7.3">&lt;complex.h&gt;</a>
-           double complex ctanh(double complex z);
-           float complex ctanhf(float complex z);
-           long double complex ctanhl(long double complex z);
-    Description
-2   The ctanh functions compute the complex hyperbolic tangent of z.
-    Returns
-3   The ctanh functions return the complex hyperbolic tangent value.
-<a name="7.3.7" href="#7.3.7"><b>    7.3.7 Exponential and logarithmic functions</b></a>
-<a name="7.3.7.1" href="#7.3.7.1"><b>    7.3.7.1 The cexp functions</b></a>
-    Synopsis
-1          #include <a href="#7.3">&lt;complex.h&gt;</a>
-           double complex cexp(double complex z);
-           float complex cexpf(float complex z);
-           long double complex cexpl(long double complex z);
-    Description
-2   The cexp functions compute the complex base-e exponential of z.
-    Returns
-3   The cexp functions return the complex base-e exponential value.
-<a name="7.3.7.2" href="#7.3.7.2"><b>    7.3.7.2 The clog functions</b></a>
-    Synopsis
-1          #include <a href="#7.3">&lt;complex.h&gt;</a>
-           double complex clog(double complex z);
-           float complex clogf(float complex z);
-           long double complex clogl(long double complex z);
-
-
-
-[<a name="p176" href="#p176">page 176</a>] (<a href="#Contents">Contents</a>)
-
-    Description
-2   The clog functions compute the complex natural (base-e) logarithm of z, with a branch
-    cut along the negative real axis.
-    Returns
-3   The clog functions return the complex natural logarithm value, in the range of a strip
-    mathematically unbounded along the real axis and in the interval [-ipi , +ipi ] along the
-    imaginary axis.
-<a name="7.3.8" href="#7.3.8"><b>    7.3.8 Power and absolute-value functions</b></a>
-<a name="7.3.8.1" href="#7.3.8.1"><b>    7.3.8.1 The cabs functions</b></a>
-    Synopsis
-1          #include <a href="#7.3">&lt;complex.h&gt;</a>
-           double cabs(double complex z);
-           float cabsf(float complex z);
-           long double cabsl(long double complex z);
-    Description
-2   The cabs functions compute the complex absolute value (also called norm, modulus, or
-    magnitude) of z.
-    Returns
-3   The cabs functions return the complex absolute value.
-<a name="7.3.8.2" href="#7.3.8.2"><b>    7.3.8.2 The cpow functions</b></a>
-    Synopsis
-1          #include <a href="#7.3">&lt;complex.h&gt;</a>
-           double complex cpow(double complex x, double complex y);
-           float complex cpowf(float complex x, float complex y);
-           long double complex cpowl(long double complex x,
-                long double complex y);
-    Description
-2   The cpow functions compute the complex power function xy , with a branch cut for the
-    first parameter along the negative real axis.
-    Returns
-3   The cpow functions return the complex power function value.
-
-
-
-
-[<a name="p177" href="#p177">page 177</a>] (<a href="#Contents">Contents</a>)
-
-<a name="7.3.8.3" href="#7.3.8.3"><b>    7.3.8.3 The csqrt functions</b></a>
-    Synopsis
-1          #include <a href="#7.3">&lt;complex.h&gt;</a>
-           double complex csqrt(double complex z);
-           float complex csqrtf(float complex z);
-           long double complex csqrtl(long double complex z);
-    Description
-2   The csqrt functions compute the complex square root of z, with a branch cut along the
-    negative real axis.
-    Returns
-3   The csqrt functions return the complex square root value, in the range of the right half-
-    plane (including the imaginary axis).
-<a name="7.3.9" href="#7.3.9"><b>    7.3.9 Manipulation functions</b></a>
-<a name="7.3.9.1" href="#7.3.9.1"><b>    7.3.9.1 The carg functions</b></a>
-    Synopsis
-1          #include <a href="#7.3">&lt;complex.h&gt;</a>
-           double carg(double complex z);
-           float cargf(float complex z);
-           long double cargl(long double complex z);
-    Description
-2   The carg functions compute the argument (also called phase angle) of z, with a branch
-    cut along the negative real axis.
-    Returns
-3   The carg functions return the value of the argument in the interval [-pi , +pi ].
-<a name="7.3.9.2" href="#7.3.9.2"><b>    7.3.9.2 The cimag functions</b></a>
-    Synopsis
-1          #include <a href="#7.3">&lt;complex.h&gt;</a>
-           double cimag(double complex z);
-           float cimagf(float complex z);
-           long double cimagl(long double complex z);
-
-
-
-
-[<a name="p178" href="#p178">page 178</a>] (<a href="#Contents">Contents</a>)
-
-    Description
-2   The cimag functions compute the imaginary part of z.170)
-    Returns
-3   The cimag functions return the imaginary part value (as a real).
-<a name="7.3.9.3" href="#7.3.9.3"><b>    7.3.9.3 The conj functions</b></a>
-    Synopsis
-1          #include <a href="#7.3">&lt;complex.h&gt;</a>
-           double complex conj(double complex z);
-           float complex conjf(float complex z);
-           long double complex conjl(long double complex z);
-    Description
-2   The conj functions compute the complex conjugate of z, by reversing the sign of its
-    imaginary part.
-    Returns
-3   The conj functions return the complex conjugate value.
-<a name="7.3.9.4" href="#7.3.9.4"><b>    7.3.9.4 The cproj functions</b></a>
-    Synopsis
-1          #include <a href="#7.3">&lt;complex.h&gt;</a>
-           double complex cproj(double complex z);
-           float complex cprojf(float complex z);
-           long double complex cprojl(long double complex z);
-    Description
-2   The cproj functions compute a projection of z onto the Riemann sphere: z projects to
-    z except that all complex infinities (even those with one infinite part and one NaN part)
-    project to positive infinity on the real axis. If z has an infinite part, then cproj(z) is
-    equivalent to
-           INFINITY + I * copysign(0.0, cimag(z))
-    Returns
-3   The cproj functions return the value of the projection onto the Riemann sphere.
-
-
-
-
-    170) For a variable z of complex type, z == creal(z) + cimag(z)*I.
-
-[<a name="p179" href="#p179">page 179</a>] (<a href="#Contents">Contents</a>)
-
-<a name="7.3.9.5" href="#7.3.9.5"><b>    7.3.9.5 The creal functions</b></a>
-    Synopsis
-1          #include <a href="#7.3">&lt;complex.h&gt;</a>
-           double creal(double complex z);
-           float crealf(float complex z);
-           long double creall(long double complex z);
-    Description
-2   The creal functions compute the real part of z.171)
-    Returns
-3   The creal functions return the real part value.
-
-
-
-
-    171) For a variable z of complex type, z == creal(z) + cimag(z)*I.
-
-[<a name="p180" href="#p180">page 180</a>] (<a href="#Contents">Contents</a>)
-
-<a name="7.4" href="#7.4"><b>    7.4 Character handling &lt;ctype.h&gt;</b></a>
-1   The header <a href="#7.4">&lt;ctype.h&gt;</a> declares several functions useful for classifying and mapping
-    characters.172) In all cases the argument is an int, the value of which shall be
-    representable as an unsigned char or shall equal the value of the macro EOF. If the
-    argument has any other value, the behavior is undefined.
-2   The behavior of these functions is affected by the current locale. Those functions that
-    have locale-specific aspects only when not in the "C" locale are noted below.
-3   The term printing character refers to a member of a locale-specific set of characters, each
-    of which occupies one printing position on a display device; the term control character
-    refers to a member of a locale-specific set of characters that are not printing
-    characters.173) All letters and digits are printing characters.
-    Forward references: EOF (<a href="#7.19.1">7.19.1</a>), localization (<a href="#7.11">7.11</a>).
-<a name="7.4.1" href="#7.4.1"><b>    7.4.1 Character classification functions</b></a>
-1   The functions in this subclause return nonzero (true) if and only if the value of the
-    argument c conforms to that in the description of the function.
-<a name="7.4.1.1" href="#7.4.1.1"><b>    7.4.1.1 The isalnum function</b></a>
-    Synopsis
-1            #include <a href="#7.4">&lt;ctype.h&gt;</a>
-             int isalnum(int c);
-    Description
-2   The isalnum function tests for any character for which isalpha or isdigit is true.
-<a name="7.4.1.2" href="#7.4.1.2"><b>    7.4.1.2 The isalpha function</b></a>
-    Synopsis
-1            #include <a href="#7.4">&lt;ctype.h&gt;</a>
-             int isalpha(int c);
-    Description
-2   The isalpha function tests for any character for which isupper or islower is true,
-    or any character that is one of a locale-specific set of alphabetic characters for which
-
-
-
-    172) See ''future library directions'' (<a href="#7.26.2">7.26.2</a>).
-    173) In an implementation that uses the seven-bit US ASCII character set, the printing characters are those
-         whose values lie from 0x20 (space) through 0x7E (tilde); the control characters are those whose
-         values lie from 0 (NUL) through 0x1F (US), and the character 0x7F (DEL).
-
-[<a name="p181" href="#p181">page 181</a>] (<a href="#Contents">Contents</a>)
-
-    none of iscntrl, isdigit, ispunct, or isspace is true.174) In the "C" locale,
-    isalpha returns true only for the characters for which isupper or islower is true.
-<a name="7.4.1.3" href="#7.4.1.3"><b>    7.4.1.3 The isblank function</b></a>
-    Synopsis
-1           #include <a href="#7.4">&lt;ctype.h&gt;</a>
-            int isblank(int c);
-    Description
-2   The isblank function tests for any character that is a standard blank character or is one
-    of a locale-specific set of characters for which isspace is true and that is used to
-    separate words within a line of text. The standard blank characters are the following:
-    space (' '), and horizontal tab ('\t'). In the "C" locale, isblank returns true only
-    for the standard blank characters.
-<a name="7.4.1.4" href="#7.4.1.4"><b>    7.4.1.4 The iscntrl function</b></a>
-    Synopsis
-1           #include <a href="#7.4">&lt;ctype.h&gt;</a>
-            int iscntrl(int c);
-    Description
-2   The iscntrl function tests for any control character.
-<a name="7.4.1.5" href="#7.4.1.5"><b>    7.4.1.5 The isdigit function</b></a>
-    Synopsis
-1           #include <a href="#7.4">&lt;ctype.h&gt;</a>
-            int isdigit(int c);
-    Description
-2   The isdigit function tests for any decimal-digit character (as defined in <a href="#5.2.1">5.2.1</a>).
-<a name="7.4.1.6" href="#7.4.1.6"><b>    7.4.1.6 The isgraph function</b></a>
-    Synopsis
-1           #include <a href="#7.4">&lt;ctype.h&gt;</a>
-            int isgraph(int c);
-
-
-
-
-    174) The functions islower and isupper test true or false separately for each of these additional
-         characters; all four combinations are possible.
-
-[<a name="p182" href="#p182">page 182</a>] (<a href="#Contents">Contents</a>)
-
-    Description
-2   The isgraph function tests for any printing character except space (' ').
-<a name="7.4.1.7" href="#7.4.1.7"><b>    7.4.1.7 The islower function</b></a>
-    Synopsis
-1          #include <a href="#7.4">&lt;ctype.h&gt;</a>
-           int islower(int c);
-    Description
-2   The islower function tests for any character that is a lowercase letter or is one of a
-    locale-specific set of characters for which none of iscntrl, isdigit, ispunct, or
-    isspace is true. In the "C" locale, islower returns true only for the lowercase
-    letters (as defined in <a href="#5.2.1">5.2.1</a>).
-<a name="7.4.1.8" href="#7.4.1.8"><b>    7.4.1.8 The isprint function</b></a>
-    Synopsis
-1          #include <a href="#7.4">&lt;ctype.h&gt;</a>
-           int isprint(int c);
-    Description
-2   The isprint function tests for any printing character including space (' ').
-<a name="7.4.1.9" href="#7.4.1.9"><b>    7.4.1.9 The ispunct function</b></a>
-    Synopsis
-1          #include <a href="#7.4">&lt;ctype.h&gt;</a>
-           int ispunct(int c);
-    Description
-2   The ispunct function tests for any printing character that is one of a locale-specific set
-    of punctuation characters for which neither isspace nor isalnum is true. In the "C"
-    locale, ispunct returns true for every printing character for which neither isspace
-    nor isalnum is true.
-<a name="7.4.1.10" href="#7.4.1.10"><b>    7.4.1.10 The isspace function</b></a>
-    Synopsis
-1          #include <a href="#7.4">&lt;ctype.h&gt;</a>
-           int isspace(int c);
-    Description
-2   The isspace function tests for any character that is a standard white-space character or
-    is one of a locale-specific set of characters for which isalnum is false. The standard
-
-[<a name="p183" href="#p183">page 183</a>] (<a href="#Contents">Contents</a>)
-
-    white-space characters are the following: space (' '), form feed ('\f'), new-line
-    ('\n'), carriage return ('\r'), horizontal tab ('\t'), and vertical tab ('\v'). In the
-    "C" locale, isspace returns true only for the standard white-space characters.
-<a name="7.4.1.11" href="#7.4.1.11"><b>    7.4.1.11 The isupper function</b></a>
-    Synopsis
-1          #include <a href="#7.4">&lt;ctype.h&gt;</a>
-           int isupper(int c);
-    Description
-2   The isupper function tests for any character that is an uppercase letter or is one of a
-    locale-specific set of characters for which none of iscntrl, isdigit, ispunct, or
-    isspace is true. In the "C" locale, isupper returns true only for the uppercase
-    letters (as defined in <a href="#5.2.1">5.2.1</a>).
-<a name="7.4.1.12" href="#7.4.1.12"><b>    7.4.1.12 The isxdigit function</b></a>
-    Synopsis
-1          #include <a href="#7.4">&lt;ctype.h&gt;</a>
-           int isxdigit(int c);
-    Description
-2   The isxdigit function tests for any hexadecimal-digit character (as defined in <a href="#6.4.4.1">6.4.4.1</a>).
-<a name="7.4.2" href="#7.4.2"><b>    7.4.2 Character case mapping functions</b></a>
-<a name="7.4.2.1" href="#7.4.2.1"><b>    7.4.2.1 The tolower function</b></a>
-    Synopsis
-1          #include <a href="#7.4">&lt;ctype.h&gt;</a>
-           int tolower(int c);
-    Description
-2   The tolower function converts an uppercase letter to a corresponding lowercase letter.
-    Returns
-3   If the argument is a character for which isupper is true and there are one or more
-    corresponding characters, as specified by the current locale, for which islower is true,
-    the tolower function returns one of the corresponding characters (always the same one
-    for any given locale); otherwise, the argument is returned unchanged.
-
-
-
-
-[<a name="p184" href="#p184">page 184</a>] (<a href="#Contents">Contents</a>)
-
-<a name="7.4.2.2" href="#7.4.2.2"><b>    7.4.2.2 The toupper function</b></a>
-    Synopsis
-1          #include <a href="#7.4">&lt;ctype.h&gt;</a>
-           int toupper(int c);
-    Description
-2   The toupper function converts a lowercase letter to a corresponding uppercase letter.
-    Returns
-3   If the argument is a character for which islower is true and there are one or more
-    corresponding characters, as specified by the current locale, for which isupper is true,
-    the toupper function returns one of the corresponding characters (always the same one
-    for any given locale); otherwise, the argument is returned unchanged.
-
-
-
-
-[<a name="p185" href="#p185">page 185</a>] (<a href="#Contents">Contents</a>)
-
-<a name="7.5" href="#7.5"><b>    7.5 Errors &lt;errno.h&gt;</b></a>
-1   The header <a href="#7.5">&lt;errno.h&gt;</a> defines several macros, all relating to the reporting of error
-    conditions.
-2   The macros are
-             EDOM
-             EILSEQ
-             ERANGE
-    which expand to integer constant expressions with type int, distinct positive values, and
-    which are suitable for use in #if preprocessing directives; and
-             errno
-    which expands to a modifiable lvalue175) that has type int, the value of which is set to a
-    positive error number by several library functions. It is unspecified whether errno is a
-    macro or an identifier declared with external linkage. If a macro definition is suppressed
-    in order to access an actual object, or a program defines an identifier with the name
-    errno, the behavior is undefined.
-3   The value of errno is zero at program startup, but is never set to zero by any library
-    function.176) The value of errno may be set to nonzero by a library function call
-    whether or not there is an error, provided the use of errno is not documented in the
-    description of the function in this International Standard.
-4   Additional macro definitions, beginning with E and a digit or E and an uppercase
-    letter,177) may also be specified by the implementation.
-
-
-
-
-    175) The macro errno need not be the identifier of an object. It might expand to a modifiable lvalue
-         resulting from a function call (for example, *errno()).
-    176) Thus, a program that uses errno for error checking should set it to zero before a library function call,
-         then inspect it before a subsequent library function call. Of course, a library function can save the
-         value of errno on entry and then set it to zero, as long as the original value is restored if errno's
-         value is still zero just before the return.
-    177) See ''future library directions'' (<a href="#7.26.3">7.26.3</a>).
-
-[<a name="p186" href="#p186">page 186</a>] (<a href="#Contents">Contents</a>)
-
-<a name="7.6" href="#7.6"><b>    7.6 Floating-point environment &lt;fenv.h&gt;</b></a>
-1   The header <a href="#7.6">&lt;fenv.h&gt;</a> declares two types and several macros and functions to provide
-    access to the floating-point environment. The floating-point environment refers
-    collectively to any floating-point status flags and control modes supported by the
-    implementation.178) A floating-point status flag is a system variable whose value is set
-    (but never cleared) when a floating-point exception is raised, which occurs as a side effect
-    of exceptional floating-point arithmetic to provide auxiliary information.179) A floating-
-    point control mode is a system variable whose value may be set by the user to affect the
-    subsequent behavior of floating-point arithmetic.
-2   Certain programming conventions support the intended model of use for the floating-
-    point environment:180)
-    -- a function call does not alter its caller's floating-point control modes, clear its caller's
-      floating-point status flags, nor depend on the state of its caller's floating-point status
-      flags unless the function is so documented;
-    -- a function call is assumed to require default floating-point control modes, unless its
-      documentation promises otherwise;
-    -- a function call is assumed to have the potential for raising floating-point exceptions,
-      unless its documentation promises otherwise.
-3   The type
-            fenv_t
-    represents the entire floating-point environment.
-4   The type
-            fexcept_t
-    represents the floating-point status flags collectively, including any status the
-    implementation associates with the flags.
-
-
-
-
-    178) This header is designed to support the floating-point exception status flags and directed-rounding
-         control modes required by IEC 60559, and other similar floating-point state information. Also it is
-         designed to facilitate code portability among all systems.
-    179) A floating-point status flag is not an object and can be set more than once within an expression.
-    180) With these conventions, a programmer can safely assume default floating-point control modes (or be
-         unaware of them). The responsibilities associated with accessing the floating-point environment fall
-         on the programmer or program that does so explicitly.
-
-[<a name="p187" href="#p187">page 187</a>] (<a href="#Contents">Contents</a>)
-
-5   Each of the macros
-            FE_DIVBYZERO
-            FE_INEXACT
-            FE_INVALID
-            FE_OVERFLOW
-            FE_UNDERFLOW
-    is defined if and only if the implementation supports the floating-point exception by
-    means of the functions in 7.6.2.181) Additional implementation-defined floating-point
-    exceptions, with macro definitions beginning with FE_ and an uppercase letter, may also
-    be specified by the implementation. The defined macros expand to integer constant
-    expressions with values such that bitwise ORs of all combinations of the macros result in
-    distinct values, and furthermore, bitwise ANDs of all combinations of the macros result in
-    zero.182)
-6   The macro
-            FE_ALL_EXCEPT
-    is simply the bitwise OR of all floating-point exception macros defined by the
-    implementation. If no such macros are defined, FE_ALL_EXCEPT shall be defined as 0.
-7   Each of the macros
-            FE_DOWNWARD
-            FE_TONEAREST
-            FE_TOWARDZERO
-            FE_UPWARD
-    is defined if and only if the implementation supports getting and setting the represented
-    rounding direction by means of the fegetround and fesetround functions.
-    Additional implementation-defined rounding directions, with macro definitions beginning
-    with FE_ and an uppercase letter, may also be specified by the implementation. The
-    defined macros expand to integer constant expressions whose values are distinct
-    nonnegative values.183)
-8   The macro
-
-
-
-    181) The implementation supports an exception if there are circumstances where a call to at least one of the
-         functions in <a href="#7.6.2">7.6.2</a>, using the macro as the appropriate argument, will succeed. It is not necessary for
-         all the functions to succeed all the time.
-    182) The macros should be distinct powers of two.
-    183) Even though the rounding direction macros may expand to constants corresponding to the values of
-         FLT_ROUNDS, they are not required to do so.
-
-[<a name="p188" href="#p188">page 188</a>] (<a href="#Contents">Contents</a>)
-
-             FE_DFL_ENV
-    represents the default floating-point environment -- the one installed at program startup
-    -- and has type ''pointer to const-qualified fenv_t''. It can be used as an argument to
-    <a href="#7.6">&lt;fenv.h&gt;</a> functions that manage the floating-point environment.
-9   Additional implementation-defined environments, with macro definitions beginning with
-    FE_ and an uppercase letter, and having type ''pointer to const-qualified fenv_t'', may
-    also be specified by the implementation.
-<a name="7.6.1" href="#7.6.1"><b>    7.6.1 The FENV_ACCESS pragma</b></a>
-    Synopsis
-1            #include <a href="#7.6">&lt;fenv.h&gt;</a>
-             #pragma STDC FENV_ACCESS on-off-switch
-    Description
-2   The FENV_ACCESS pragma provides a means to inform the implementation when a
-    program might access the floating-point environment to test floating-point status flags or
-    run under non-default floating-point control modes.184) The pragma shall occur either
-    outside external declarations or preceding all explicit declarations and statements inside a
-    compound statement. When outside external declarations, the pragma takes effect from
-    its occurrence until another FENV_ACCESS pragma is encountered, or until the end of
-    the translation unit. When inside a compound statement, the pragma takes effect from its
-    occurrence until another FENV_ACCESS pragma is encountered (including within a
-    nested compound statement), or until the end of the compound statement; at the end of a
-    compound statement the state for the pragma is restored to its condition just before the
-    compound statement. If this pragma is used in any other context, the behavior is
-    undefined. If part of a program tests floating-point status flags, sets floating-point control
-    modes, or runs under non-default mode settings, but was translated with the state for the
-    FENV_ACCESS pragma ''off'', the behavior is undefined. The default state (''on'' or
-    ''off'') for the pragma is implementation-defined. (When execution passes from a part of
-    the program translated with FENV_ACCESS ''off'' to a part translated with
-    FENV_ACCESS ''on'', the state of the floating-point status flags is unspecified and the
-    floating-point control modes have their default settings.)
-
-
-
-
-    184) The purpose of the FENV_ACCESS pragma is to allow certain optimizations that could subvert flag
-         tests and mode changes (e.g., global common subexpression elimination, code motion, and constant
-         folding). In general, if the state of FENV_ACCESS is ''off'', the translator can assume that default
-         modes are in effect and the flags are not tested.
-
-[<a name="p189" href="#p189">page 189</a>] (<a href="#Contents">Contents</a>)
-
-3   EXAMPLE
-            #include <a href="#7.6">&lt;fenv.h&gt;</a>
-            void f(double x)
-            {
-                  #pragma STDC FENV_ACCESS ON
-                  void g(double);
-                  void h(double);
-                  /* ... */
-                  g(x + 1);
-                  h(x + 1);
-                  /* ... */
-            }
-4   If the function g might depend on status flags set as a side effect of the first x + 1, or if the second
-    x + 1 might depend on control modes set as a side effect of the call to function g, then the program shall
-    contain an appropriately placed invocation of #pragma STDC FENV_ACCESS ON.185)
-
-<a name="7.6.2" href="#7.6.2"><b>    7.6.2 Floating-point exceptions</b></a>
-1   The following functions provide access to the floating-point status flags.186) The int
-    input argument for the functions represents a subset of floating-point exceptions, and can
-    be zero or the bitwise OR of one or more floating-point exception macros, for example
-    FE_OVERFLOW | FE_INEXACT. For other argument values the behavior of these
-    functions is undefined.
-<a name="7.6.2.1" href="#7.6.2.1"><b>    7.6.2.1 The feclearexcept function</b></a>
-    Synopsis
-1           #include <a href="#7.6">&lt;fenv.h&gt;</a>
-            int feclearexcept(int excepts);
-    Description
-2   The feclearexcept function attempts to clear the supported floating-point exceptions
-    represented by its argument.
-    Returns
-3   The feclearexcept function returns zero if the excepts argument is zero or if all
-    the specified exceptions were successfully cleared. Otherwise, it returns a nonzero value.
-
-
-    185) The side effects impose a temporal ordering that requires two evaluations of x + 1. On the other
-         hand, without the #pragma STDC FENV_ACCESS ON pragma, and assuming the default state is
-         ''off'', just one evaluation of x + 1 would suffice.
-    186) The functions fetestexcept, feraiseexcept, and feclearexcept support the basic
-         abstraction of flags that are either set or clear. An implementation may endow floating-point status
-         flags with more information -- for example, the address of the code which first raised the floating-
-         point exception; the functions fegetexceptflag and fesetexceptflag deal with the full
-         content of flags.
-
-[<a name="p190" href="#p190">page 190</a>] (<a href="#Contents">Contents</a>)
-
-<a name="7.6.2.2" href="#7.6.2.2"><b>    7.6.2.2 The fegetexceptflag function</b></a>
-    Synopsis
-1            #include <a href="#7.6">&lt;fenv.h&gt;</a>
-             int fegetexceptflag(fexcept_t *flagp,
-                  int excepts);
-    Description
-2   The fegetexceptflag function attempts to store an implementation-defined
-    representation of the states of the floating-point status flags indicated by the argument
-    excepts in the object pointed to by the argument flagp.
-    Returns
-3   The fegetexceptflag function returns zero if the representation was successfully
-    stored. Otherwise, it returns a nonzero value.
-<a name="7.6.2.3" href="#7.6.2.3"><b>    7.6.2.3 The feraiseexcept function</b></a>
-    Synopsis
-1            #include <a href="#7.6">&lt;fenv.h&gt;</a>
-             int feraiseexcept(int excepts);
-    Description
-2   The feraiseexcept function attempts to raise the supported floating-point exceptions
-    represented by its argument.187) The order in which these floating-point exceptions are
-    raised is unspecified, except as stated in <a href="#F.7.6">F.7.6</a>. Whether the feraiseexcept function
-    additionally raises the ''inexact'' floating-point exception whenever it raises the
-    ''overflow'' or ''underflow'' floating-point exception is implementation-defined.
-    Returns
-3   The feraiseexcept function returns zero if the excepts argument is zero or if all
-    the specified exceptions were successfully raised. Otherwise, it returns a nonzero value.
-
-
-
-
-    187) The effect is intended to be similar to that of floating-point exceptions raised by arithmetic operations.
-         Hence, enabled traps for floating-point exceptions raised by this function are taken. The specification
-         in <a href="#F.7.6">F.7.6</a> is in the same spirit.
-
-[<a name="p191" href="#p191">page 191</a>] (<a href="#Contents">Contents</a>)
-
-<a name="7.6.2.4" href="#7.6.2.4"><b>    7.6.2.4 The fesetexceptflag function</b></a>
-    Synopsis
-1           #include <a href="#7.6">&lt;fenv.h&gt;</a>
-            int fesetexceptflag(const fexcept_t *flagp,
-                 int excepts);
-    Description
-2   The fesetexceptflag function attempts to set the floating-point status flags
-    indicated by the argument excepts to the states stored in the object pointed to by
-    flagp. The value of *flagp shall have been set by a previous call to
-    fegetexceptflag whose second argument represented at least those floating-point
-    exceptions represented by the argument excepts. This function does not raise floating-
-    point exceptions, but only sets the state of the flags.
-    Returns
-3   The fesetexceptflag function returns zero if the excepts argument is zero or if
-    all the specified flags were successfully set to the appropriate state. Otherwise, it returns
-    a nonzero value.
-<a name="7.6.2.5" href="#7.6.2.5"><b>    7.6.2.5 The fetestexcept function</b></a>
-    Synopsis
-1           #include <a href="#7.6">&lt;fenv.h&gt;</a>
-            int fetestexcept(int excepts);
-    Description
-2   The fetestexcept function determines which of a specified subset of the floating-
-    point exception flags are currently set. The excepts argument specifies the floating-
-    point status flags to be queried.188)
-    Returns
-3   The fetestexcept function returns the value of the bitwise OR of the floating-point
-    exception macros corresponding to the currently set floating-point exceptions included in
-    excepts.
-4   EXAMPLE       Call f if ''invalid'' is set, then g if ''overflow'' is set:
-
-
-
-
-    188) This mechanism allows testing several floating-point exceptions with just one function call.
-
-[<a name="p192" href="#p192">page 192</a>] (<a href="#Contents">Contents</a>)
-
-           #include <a href="#7.6">&lt;fenv.h&gt;</a>
-           /* ... */
-           {
-                   #pragma STDC FENV_ACCESS ON
-                   int set_excepts;
-                   feclearexcept(FE_INVALID | FE_OVERFLOW);
-                   // maybe raise exceptions
-                   set_excepts = fetestexcept(FE_INVALID | FE_OVERFLOW);
-                   if (set_excepts &amp; FE_INVALID) f();
-                   if (set_excepts &amp; FE_OVERFLOW) g();
-                   /* ... */
-           }
-
-<a name="7.6.3" href="#7.6.3"><b>    7.6.3 Rounding</b></a>
-1   The fegetround and fesetround functions provide control of rounding direction
-    modes.
-<a name="7.6.3.1" href="#7.6.3.1"><b>    7.6.3.1 The fegetround function</b></a>
-    Synopsis
-1          #include <a href="#7.6">&lt;fenv.h&gt;</a>
-           int fegetround(void);
-    Description
-2   The fegetround function gets the current rounding direction.
-    Returns
-3   The fegetround function returns the value of the rounding direction macro
-    representing the current rounding direction or a negative value if there is no such
-    rounding direction macro or the current rounding direction is not determinable.
-<a name="7.6.3.2" href="#7.6.3.2"><b>    7.6.3.2 The fesetround function</b></a>
-    Synopsis
-1          #include <a href="#7.6">&lt;fenv.h&gt;</a>
-           int fesetround(int round);
-    Description
-2   The fesetround function establishes the rounding direction represented by its
-    argument round. If the argument is not equal to the value of a rounding direction macro,
-    the rounding direction is not changed.
-    Returns
-3   The fesetround function returns zero if and only if the requested rounding direction
-    was established.
-
-
-[<a name="p193" href="#p193">page 193</a>] (<a href="#Contents">Contents</a>)
-
-4   EXAMPLE Save, set, and restore the rounding direction. Report an error and abort if setting the
-    rounding direction fails.
-           #include <a href="#7.6">&lt;fenv.h&gt;</a>
-           #include <a href="#7.2">&lt;assert.h&gt;</a>
-           void f(int round_dir)
-           {
-                 #pragma STDC FENV_ACCESS ON
-                 int save_round;
-                 int setround_ok;
-                 save_round = fegetround();
-                 setround_ok = fesetround(round_dir);
-                 assert(setround_ok == 0);
-                 /* ... */
-                 fesetround(save_round);
-                 /* ... */
-           }
-
-<a name="7.6.4" href="#7.6.4"><b>    7.6.4 Environment</b></a>
-1   The functions in this section manage the floating-point environment -- status flags and
-    control modes -- as one entity.
-<a name="7.6.4.1" href="#7.6.4.1"><b>    7.6.4.1 The fegetenv function</b></a>
-    Synopsis
-1          #include <a href="#7.6">&lt;fenv.h&gt;</a>
-           int fegetenv(fenv_t *envp);
-    Description
-2   The fegetenv function attempts to store the current floating-point environment in the
-    object pointed to by envp.
-    Returns
-3   The fegetenv function returns zero if the environment was successfully stored.
-    Otherwise, it returns a nonzero value.
-<a name="7.6.4.2" href="#7.6.4.2"><b>    7.6.4.2 The feholdexcept function</b></a>
-    Synopsis
-1          #include <a href="#7.6">&lt;fenv.h&gt;</a>
-           int feholdexcept(fenv_t *envp);
-    Description
-2   The feholdexcept function saves the current floating-point environment in the object
-    pointed to by envp, clears the floating-point status flags, and then installs a non-stop
-    (continue on floating-point exceptions) mode, if available, for all floating-point
-    exceptions.189)
-
-[<a name="p194" href="#p194">page 194</a>] (<a href="#Contents">Contents</a>)
-
-    Returns
-3   The feholdexcept function returns zero if and only if non-stop floating-point
-    exception handling was successfully installed.
-<a name="7.6.4.3" href="#7.6.4.3"><b>    7.6.4.3 The fesetenv function</b></a>
-    Synopsis
-1           #include <a href="#7.6">&lt;fenv.h&gt;</a>
-            int fesetenv(const fenv_t *envp);
-    Description
-2   The fesetenv function attempts to establish the floating-point environment represented
-    by the object pointed to by envp. The argument envp shall point to an object set by a
-    call to fegetenv or feholdexcept, or equal a floating-point environment macro.
-    Note that fesetenv merely installs the state of the floating-point status flags
-    represented through its argument, and does not raise these floating-point exceptions.
-    Returns
-3   The fesetenv function returns zero if the environment was successfully established.
-    Otherwise, it returns a nonzero value.
-<a name="7.6.4.4" href="#7.6.4.4"><b>    7.6.4.4 The feupdateenv function</b></a>
-    Synopsis
-1           #include <a href="#7.6">&lt;fenv.h&gt;</a>
-            int feupdateenv(const fenv_t *envp);
-    Description
-2   The feupdateenv function attempts to save the currently raised floating-point
-    exceptions in its automatic storage, install the floating-point environment represented by
-    the object pointed to by envp, and then raise the saved floating-point exceptions. The
-    argument envp shall point to an object set by a call to feholdexcept or fegetenv,
-    or equal a floating-point environment macro.
-    Returns
-3   The feupdateenv function returns zero if all the actions were successfully carried out.
-    Otherwise, it returns a nonzero value.
-
-
-
-
-    189) IEC 60559 systems have a default non-stop mode, and typically at least one other mode for trap
-         handling or aborting; if the system provides only the non-stop mode then installing it is trivial. For
-         such systems, the feholdexcept function can be used in conjunction with the feupdateenv
-         function to write routines that hide spurious floating-point exceptions from their callers.
-
-[<a name="p195" href="#p195">page 195</a>] (<a href="#Contents">Contents</a>)
-
-4   EXAMPLE   Hide spurious underflow floating-point exceptions:
-          #include <a href="#7.6">&lt;fenv.h&gt;</a>
-          double f(double x)
+                return f(&amp;u.s1, &amp;u.s2);
+          }
+</pre>
+<p><b> Forward references</b>: address and indirection operators (<a href="#6.5.3.2">6.5.3.2</a>), structure and union
+ specifiers (<a href="#6.7.2.1">6.7.2.1</a>).
+<!--page 87 -->
+
+<p><b>Footnotes</b>
+<p><small><a name="note82" href="#note82">82)</a> If the member used to access the contents of a union object is not the same as the member last used to
+ store a value in the object, the appropriate part of the object representation of the value is reinterpreted
+ as an object representation in the new type as described in <a href="#6.2.6">6.2.6</a> (a process sometimes called "type
+ punning"). This might be a trap representation.
+</small>
+<p><small><a name="note83" href="#note83">83)</a> If &amp;E is a valid pointer expression (where &amp; is the ''address-of '' operator, which generates a pointer to
+ its operand), the expression (&amp;E)-&gt;MOS is the same as E.MOS.
+</small>
+
+<h5><a name="6.5.2.4" href="#6.5.2.4">6.5.2.4 Postfix increment and decrement operators</a></h5>
+<p><b>Constraints</b>
+<p><!--para 1 -->
+ The operand of the postfix increment or decrement operator shall have qualified or
+ unqualified real or pointer type and shall be a modifiable lvalue.
+<p><b>Semantics</b>
+<p><!--para 2 -->
+ The result of the postfix ++ operator is the value of the operand. After the result is
+ obtained, the value of the operand is incremented. (That is, the value 1 of the appropriate
+ type is added to it.) See the discussions of additive operators and compound assignment
+ for information on constraints, types, and conversions and the effects of operations on
+ pointers. The side effect of updating the stored value of the operand shall occur between
+ the previous and the next sequence point.
+<p><!--para 3 -->
+ The postfix -- operator is analogous to the postfix ++ operator, except that the value of
+ the operand is decremented (that is, the value 1 of the appropriate type is subtracted from
+ it).
+<p><b> Forward references</b>: additive operators (<a href="#6.5.6">6.5.6</a>), compound assignment (<a href="#6.5.16.2">6.5.16.2</a>).
+
+<h5><a name="6.5.2.5" href="#6.5.2.5">6.5.2.5 Compound literals</a></h5>
+<p><b>Constraints</b>
+<p><!--para 1 -->
+ The type name shall specify an object type or an array of unknown size, but not a variable
+ length array type.
+<p><!--para 2 -->
+ No initializer shall attempt to provide a value for an object not contained within the entire
+ unnamed object specified by the compound literal.
+<p><!--para 3 -->
+ If the compound literal occurs outside the body of a function, the initializer list shall
+ consist of constant expressions.
+<p><b>Semantics</b>
+<p><!--para 4 -->
+ A postfix expression that consists of a parenthesized type name followed by a brace-
+ enclosed list of initializers is a compound literal. It provides an unnamed object whose
+ value is given by the initializer list.<sup><a href="#note84"><b>84)</b></a></sup>
+<p><!--para 5 -->
+ If the type name specifies an array of unknown size, the size is determined by the
+ initializer list as specified in <a href="#6.7.8">6.7.8</a>, and the type of the compound literal is that of the
+ completed array type. Otherwise (when the type name specifies an object type), the type
+ of the compound literal is that specified by the type name. In either case, the result is an
+ lvalue.
+<!--page 88 -->
+<p><!--para 6 -->
+ The value of the compound literal is that of an unnamed object initialized by the
+ initializer list. If the compound literal occurs outside the body of a function, the object
+ has static storage duration; otherwise, it has automatic storage duration associated with
+ the enclosing block.
+<p><!--para 7 -->
+ All the semantic rules and constraints for initializer lists in <a href="#6.7.8">6.7.8</a> are applicable to
+ compound literals.<sup><a href="#note85"><b>85)</b></a></sup>
+<p><!--para 8 -->
+ String literals, and compound literals with const-qualified types, need not designate
+ distinct objects.<sup><a href="#note86"><b>86)</b></a></sup>
+<p><!--para 9 -->
+ EXAMPLE 1       The file scope definition
+<pre>
+          int *p = (int []){2, 4};
+</pre>
+ initializes p to point to the first element of an array of two ints, the first having the value two and the
+ second, four. The expressions in this compound literal are required to be constant. The unnamed object
+ has static storage duration.
+<p><!--para 10 -->
+ EXAMPLE 2       In contrast, in
+<pre>
+          void f(void)
           {
-                #pragma STDC FENV_ACCESS ON
-                double result;
-                fenv_t save_env;
-                if (feholdexcept(&amp;save_env))
-                      return /* indication of an environmental problem */;
-                // compute result
-                if (/* test spurious underflow */)
-                      if (feclearexcept(FE_UNDERFLOW))
-                               return /* indication of an environmental problem */;
-                if (feupdateenv(&amp;save_env))
-                      return /* indication of an environmental problem */;
-                return result;
+                int *p;
+                /*...*/
+                p = (int [2]){*p};
+                /*...*/
           }
-
-
-
-
-[<a name="p196" href="#p196">page 196</a>] (<a href="#Contents">Contents</a>)
-
-<a name="7.7" href="#7.7"><b>    7.7 Characteristics of floating types &lt;float.h&gt;</b></a>
-1   The header <a href="#7.7">&lt;float.h&gt;</a> defines several macros that expand to various limits and
-    parameters of the standard floating-point types.
-2   The macros, their meanings, and the constraints (or restrictions) on their values are listed
-    in <a href="#5.2.4.2.2">5.2.4.2.2</a>.
-
-
-
-
-[<a name="p197" href="#p197">page 197</a>] (<a href="#Contents">Contents</a>)
-
-<a name="7.8" href="#7.8"><b>    7.8 Format conversion of integer types &lt;inttypes.h&gt;</b></a>
-1   The header <a href="#7.8">&lt;inttypes.h&gt;</a> includes the header <a href="#7.18">&lt;stdint.h&gt;</a> and extends it with
-    additional facilities provided by hosted implementations.
-2   It declares functions for manipulating greatest-width integers and converting numeric
-    character strings to greatest-width integers, and it declares the type
-             imaxdiv_t
-    which is a structure type that is the type of the value returned by the imaxdiv function.
-    For each type declared in <a href="#7.18">&lt;stdint.h&gt;</a>, it defines corresponding macros for conversion
-    specifiers for use with the formatted input/output functions.190)
-    Forward references: integer types <a href="#7.18">&lt;stdint.h&gt;</a> (<a href="#7.18">7.18</a>), formatted input/output
-    functions (<a href="#7.19.6">7.19.6</a>), formatted wide character input/output functions (<a href="#7.24.2">7.24.2</a>).
-<a name="7.8.1" href="#7.8.1"><b>    7.8.1 Macros for format specifiers</b></a>
-1   Each of the following object-like macros191) expands to a character string literal
-    containing a conversion specifier, possibly modified by a length modifier, suitable for use
-    within the format argument of a formatted input/output function when converting the
-    corresponding integer type. These macro names have the general form of PRI (character
-    string literals for the fprintf and fwprintf family) or SCN (character string literals
-    for the fscanf and fwscanf family),192) followed by the conversion specifier,
-    followed by a name corresponding to a similar type name in <a href="#7.18.1">7.18.1</a>. In these names, N
-    represents the width of the type as described in <a href="#7.18.1">7.18.1</a>. For example, PRIdFAST32 can
-    be used in a format string to print the value of an integer of type int_fast32_t.
-2   The fprintf macros for signed integers are:
-           PRIdN             PRIdLEASTN                PRIdFASTN          PRIdMAX             PRIdPTR
-           PRIiN             PRIiLEASTN                PRIiFASTN          PRIiMAX             PRIiPTR
-
-
-
-
-    190) See ''future library directions'' (<a href="#7.26.4">7.26.4</a>).
-    191) C++ implementations should define these macros only when __STDC_FORMAT_MACROS is defined
-         before <a href="#7.8">&lt;inttypes.h&gt;</a> is included.
-    192) Separate macros are given for use with fprintf and fscanf functions because, in the general case,
-         different format specifiers may be required for fprintf and fscanf, even when the type is the
-         same.
-
-[<a name="p198" href="#p198">page 198</a>] (<a href="#Contents">Contents</a>)
-
-3   The fprintf macros for unsigned integers are:
-           PRIoN           PRIoLEASTN               PRIoFASTN              PRIoMAX             PRIoPTR
-           PRIuN           PRIuLEASTN               PRIuFASTN              PRIuMAX             PRIuPTR
-           PRIxN           PRIxLEASTN               PRIxFASTN              PRIxMAX             PRIxPTR
-           PRIXN           PRIXLEASTN               PRIXFASTN              PRIXMAX             PRIXPTR
-4   The fscanf macros for signed integers are:
-           SCNdN           SCNdLEASTN               SCNdFASTN              SCNdMAX             SCNdPTR
-           SCNiN           SCNiLEASTN               SCNiFASTN              SCNiMAX             SCNiPTR
-5   The fscanf macros for unsigned integers are:
-           SCNoN           SCNoLEASTN               SCNoFASTN              SCNoMAX             SCNoPTR
-           SCNuN           SCNuLEASTN               SCNuFASTN              SCNuMAX             SCNuPTR
-           SCNxN           SCNxLEASTN               SCNxFASTN              SCNxMAX             SCNxPTR
-6   For each type that the implementation provides in <a href="#7.18">&lt;stdint.h&gt;</a>, the corresponding
-    fprintf macros shall be defined and the corresponding fscanf macros shall be
-    defined unless the implementation does not have a suitable fscanf length modifier for
-    the type.
-7   EXAMPLE
-            #include <a href="#7.8">&lt;inttypes.h&gt;</a>
-            #include <a href="#7.24">&lt;wchar.h&gt;</a>
-            int main(void)
-            {
-                  uintmax_t i = UINTMAX_MAX;    // this type always exists
-                  wprintf(L"The largest integer value is %020"
-                        PRIxMAX "\n", i);
-                  return 0;
-            }
-
-<a name="7.8.2" href="#7.8.2"><b>    7.8.2 Functions for greatest-width integer types</b></a>
-<a name="7.8.2.1" href="#7.8.2.1"><b>    7.8.2.1 The imaxabs function</b></a>
-    Synopsis
-1           #include <a href="#7.8">&lt;inttypes.h&gt;</a>
-            intmax_t imaxabs(intmax_t j);
-    Description
-2   The imaxabs function computes the absolute value of an integer j. If the result cannot
-    be represented, the behavior is undefined.193)
-
-
-
-    193) The absolute value of the most negative number cannot be represented in two's complement.
-
-[<a name="p199" href="#p199">page 199</a>] (<a href="#Contents">Contents</a>)
-
-    Returns
-3   The imaxabs function returns the absolute value.
-<a name="7.8.2.2" href="#7.8.2.2"><b>    7.8.2.2 The imaxdiv function</b></a>
-    Synopsis
-1              #include <a href="#7.8">&lt;inttypes.h&gt;</a>
-               imaxdiv_t imaxdiv(intmax_t numer, intmax_t denom);
-    Description
-2   The imaxdiv function computes numer / denom and numer % denom in a single
-    operation.
-    Returns
-3   The imaxdiv function returns a structure of type imaxdiv_t comprising both the
-    quotient and the remainder. The structure shall contain (in either order) the members
-    quot (the quotient) and rem (the remainder), each of which has type intmax_t. If
-    either part of the result cannot be represented, the behavior is undefined.
-<a name="7.8.2.3" href="#7.8.2.3"><b>    7.8.2.3 The strtoimax and strtoumax functions</b></a>
-    Synopsis
-1          #include <a href="#7.8">&lt;inttypes.h&gt;</a>
-           intmax_t strtoimax(const char * restrict nptr,
-                char ** restrict endptr, int base);
-           uintmax_t strtoumax(const char * restrict nptr,
-                char ** restrict endptr, int base);
-    Description
-2   The strtoimax and strtoumax functions are equivalent to the strtol, strtoll,
-    strtoul, and strtoull functions, except that the initial portion of the string is
-    converted to intmax_t and uintmax_t representation, respectively.
-    Returns
-3   The strtoimax and strtoumax functions return the converted value, if any. If no
-    conversion could be performed, zero is returned. If the correct value is outside the range
-    of representable values, INTMAX_MAX, INTMAX_MIN, or UINTMAX_MAX is returned
-    (according to the return type and sign of the value, if any), and the value of the macro
-    ERANGE is stored in errno.
-    Forward references: the strtol, strtoll, strtoul, and strtoull functions
-    (<a href="#7.20.1.4">7.20.1.4</a>).
-
-
-
-[<a name="p200" href="#p200">page 200</a>] (<a href="#Contents">Contents</a>)
-
-<a name="7.8.2.4" href="#7.8.2.4"><b>    7.8.2.4 The wcstoimax and wcstoumax functions</b></a>
-    Synopsis
-1          #include <a href="#7.17">&lt;stddef.h&gt;</a>           // for wchar_t
-           #include <a href="#7.8">&lt;inttypes.h&gt;</a>
-           intmax_t wcstoimax(const wchar_t * restrict nptr,
-                wchar_t ** restrict endptr, int base);
-           uintmax_t wcstoumax(const wchar_t * restrict nptr,
-                wchar_t ** restrict endptr, int base);
-    Description
-2   The wcstoimax and wcstoumax functions are equivalent to the wcstol, wcstoll,
-    wcstoul, and wcstoull functions except that the initial portion of the wide string is
-    converted to intmax_t and uintmax_t representation, respectively.
-    Returns
-3   The wcstoimax function returns the converted value, if any. If no conversion could be
-    performed, zero is returned. If the correct value is outside the range of representable
-    values, INTMAX_MAX, INTMAX_MIN, or UINTMAX_MAX is returned (according to the
-    return type and sign of the value, if any), and the value of the macro ERANGE is stored in
-    errno.
-    Forward references: the wcstol, wcstoll, wcstoul, and wcstoull functions
-    (<a href="#7.24.4.1.2">7.24.4.1.2</a>).
-
-
-
-
-[<a name="p201" href="#p201">page 201</a>] (<a href="#Contents">Contents</a>)
-
-<a name="7.9" href="#7.9"><b>    7.9 Alternative spellings &lt;iso646.h&gt;</b></a>
-1   The header <a href="#7.9">&lt;iso646.h&gt;</a> defines the following eleven macros (on the left) that expand
-    to the corresponding tokens (on the right):
-          and          &amp;&amp;
-          and_eq       &amp;=
-          bitand       &amp;
-          bitor        |
-          compl        ~
-          not          !
-          not_eq       !=
-          or           ||
-          or_eq        |=
-          xor          ^
-          xor_eq       ^=
-
-
-
-
-[<a name="p202" href="#p202">page 202</a>] (<a href="#Contents">Contents</a>)
-
-<a name="7.10" href="#7.10"><b>    7.10 Sizes of integer types &lt;limits.h&gt;</b></a>
-1   The header <a href="#7.10">&lt;limits.h&gt;</a> defines several macros that expand to various limits and
-    parameters of the standard integer types.
-2   The macros, their meanings, and the constraints (or restrictions) on their values are listed
-    in <a href="#5.2.4.2.1">5.2.4.2.1</a>.
-
-
-
-
-[<a name="p203" href="#p203">page 203</a>] (<a href="#Contents">Contents</a>)
-
-<a name="7.11" href="#7.11"><b>    7.11 Localization &lt;locale.h&gt;</b></a>
-1   The header <a href="#7.11">&lt;locale.h&gt;</a> declares two functions, one type, and defines several macros.
-2   The type is
-           struct lconv
-    which contains members related to the formatting of numeric values. The structure shall
-    contain at least the following members, in any order. The semantics of the members and
-    their normal ranges are explained in <a href="#7.11.2.1">7.11.2.1</a>. In the "C" locale, the members shall have
-    the values specified in the comments.
-           char   *decimal_point;                 //   "."
-           char   *thousands_sep;                 //   ""
-           char   *grouping;                      //   ""
-           char   *mon_decimal_point;             //   ""
-           char   *mon_thousands_sep;             //   ""
-           char   *mon_grouping;                  //   ""
-           char   *positive_sign;                 //   ""
-           char   *negative_sign;                 //   ""
-           char   *currency_symbol;               //   ""
-           char   frac_digits;                    //   CHAR_MAX
-           char   p_cs_precedes;                  //   CHAR_MAX
-           char   n_cs_precedes;                  //   CHAR_MAX
-           char   p_sep_by_space;                 //   CHAR_MAX
-           char   n_sep_by_space;                 //   CHAR_MAX
-           char   p_sign_posn;                    //   CHAR_MAX
-           char   n_sign_posn;                    //   CHAR_MAX
-           char   *int_curr_symbol;               //   ""
-           char   int_frac_digits;                //   CHAR_MAX
-           char   int_p_cs_precedes;              //   CHAR_MAX
-           char   int_n_cs_precedes;              //   CHAR_MAX
-           char   int_p_sep_by_space;             //   CHAR_MAX
-           char   int_n_sep_by_space;             //   CHAR_MAX
-           char   int_p_sign_posn;                //   CHAR_MAX
-           char   int_n_sign_posn;                //   CHAR_MAX
-
-
-
-
-[<a name="p204" href="#p204">page 204</a>] (<a href="#Contents">Contents</a>)
-
-3   The macros defined are NULL (described in <a href="#7.17">7.17</a>); and
-             LC_ALL
-             LC_COLLATE
-             LC_CTYPE
-             LC_MONETARY
-             LC_NUMERIC
-             LC_TIME
-    which expand to integer constant expressions with distinct values, suitable for use as the
-    first argument to the setlocale function.194) Additional macro definitions, beginning
-    with the characters LC_ and an uppercase letter,195) may also be specified by the
-    implementation.
-<a name="7.11.1" href="#7.11.1"><b>    7.11.1 Locale control</b></a>
-<a name="7.11.1.1" href="#7.11.1.1"><b>    7.11.1.1 The setlocale function</b></a>
-    Synopsis
-1            #include <a href="#7.11">&lt;locale.h&gt;</a>
-             char *setlocale(int category, const char *locale);
-    Description
-2   The setlocale function selects the appropriate portion of the program's locale as
-    specified by the category and locale arguments. The setlocale function may be
-    used to change or query the program's entire current locale or portions thereof. The value
-    LC_ALL for category names the program's entire locale; the other values for
-    category name only a portion of the program's locale. LC_COLLATE affects the
-    behavior of the strcoll and strxfrm functions. LC_CTYPE affects the behavior of
-    the character handling functions196) and the multibyte and wide character functions.
-    LC_MONETARY affects the monetary formatting information returned by the
-    localeconv function. LC_NUMERIC affects the decimal-point character for the
-    formatted input/output functions and the string conversion functions, as well as the
-    nonmonetary formatting information returned by the localeconv function. LC_TIME
-    affects the behavior of the strftime and wcsftime functions.
-3   A value of "C" for locale specifies the minimal environment for C translation; a value
-    of "" for locale specifies the locale-specific native environment. Other
-    implementation-defined strings may be passed as the second argument to setlocale.
-
-    194) ISO/IEC 9945-2 specifies locale and charmap formats that may be used to specify locales for C.
-    195) See ''future library directions'' (<a href="#7.26.5">7.26.5</a>).
-    196) The only functions in <a href="#7.4">7.4</a> whose behavior is not affected by the current locale are isdigit and
-         isxdigit.
-
-[<a name="p205" href="#p205">page 205</a>] (<a href="#Contents">Contents</a>)
-
-4   At program startup, the equivalent of
-            setlocale(LC_ALL, "C");
-    is executed.
-5   The implementation shall behave as if no library function calls the setlocale function.
-    Returns
-6   If a pointer to a string is given for locale and the selection can be honored, the
-    setlocale function returns a pointer to the string associated with the specified
-    category for the new locale. If the selection cannot be honored, the setlocale
-    function returns a null pointer and the program's locale is not changed.
-7   A null pointer for locale causes the setlocale function to return a pointer to the
-    string associated with the category for the program's current locale; the program's
-    locale is not changed.197)
-8   The pointer to string returned by the setlocale function is such that a subsequent call
-    with that string value and its associated category will restore that part of the program's
-    locale. The string pointed to shall not be modified by the program, but may be
-    overwritten by a subsequent call to the setlocale function.
-    Forward references: formatted input/output functions (<a href="#7.19.6">7.19.6</a>), multibyte/wide
-    character conversion functions (<a href="#7.20.7">7.20.7</a>), multibyte/wide string conversion functions
-    (<a href="#7.20.8">7.20.8</a>), numeric conversion functions (<a href="#7.20.1">7.20.1</a>), the strcoll function (<a href="#7.21.4.3">7.21.4.3</a>), the
-    strftime function (<a href="#7.23.3.5">7.23.3.5</a>), the strxfrm function (<a href="#7.21.4.5">7.21.4.5</a>).
-<a name="7.11.2" href="#7.11.2"><b>    7.11.2 Numeric formatting convention inquiry</b></a>
-<a name="7.11.2.1" href="#7.11.2.1"><b>    7.11.2.1 The localeconv function</b></a>
-    Synopsis
-1           #include <a href="#7.11">&lt;locale.h&gt;</a>
-            struct lconv *localeconv(void);
-    Description
-2   The localeconv function sets the components of an object with type struct lconv
-    with values appropriate for the formatting of numeric quantities (monetary and otherwise)
-    according to the rules of the current locale.
-3   The members of the structure with type char * are pointers to strings, any of which
-    (except decimal_point) can point to "", to indicate that the value is not available in
-    the current locale or is of zero length. Apart from grouping and mon_grouping, the
-
-    197) The implementation shall arrange to encode in a string the various categories due to a heterogeneous
-         locale when category has the value LC_ALL.
-
-[<a name="p206" href="#p206">page 206</a>] (<a href="#Contents">Contents</a>)
-
-strings shall start and end in the initial shift state. The members with type char are
-nonnegative numbers, any of which can be CHAR_MAX to indicate that the value is not
-available in the current locale. The members include the following:
-char *decimal_point
-          The decimal-point character used to format nonmonetary quantities.
-char *thousands_sep
-          The character used to separate groups of digits before the decimal-point
-          character in formatted nonmonetary quantities.
-char *grouping
-          A string whose elements indicate the size of each group of digits in
-          formatted nonmonetary quantities.
-char *mon_decimal_point
-          The decimal-point used to format monetary quantities.
-char *mon_thousands_sep
-          The separator for groups of digits before the decimal-point in formatted
-          monetary quantities.
-char *mon_grouping
-          A string whose elements indicate the size of each group of digits in
-          formatted monetary quantities.
-char *positive_sign
-          The string used to indicate a nonnegative-valued formatted monetary
-          quantity.
-char *negative_sign
-          The string used to indicate a negative-valued formatted monetary quantity.
-char *currency_symbol
-          The local currency symbol applicable to the current locale.
-char frac_digits
-          The number of fractional digits (those after the decimal-point) to be
-          displayed in a locally formatted monetary quantity.
-char p_cs_precedes
-          Set to 1 or 0 if the currency_symbol respectively precedes or
-          succeeds the value for a nonnegative locally formatted monetary quantity.
-char n_cs_precedes
-          Set to 1 or 0 if the currency_symbol respectively precedes or
-          succeeds the value for a negative locally formatted monetary quantity.
-
-
-[<a name="p207" href="#p207">page 207</a>] (<a href="#Contents">Contents</a>)
-
-char p_sep_by_space
-          Set to a value indicating the separation of the currency_symbol, the
-          sign string, and the value for a nonnegative locally formatted monetary
-          quantity.
-char n_sep_by_space
-          Set to a value indicating the separation of the currency_symbol, the
-          sign string, and the value for a negative locally formatted monetary
-          quantity.
-char p_sign_posn
-          Set to a value indicating the positioning of the positive_sign for a
-          nonnegative locally formatted monetary quantity.
-char n_sign_posn
-          Set to a value indicating the positioning of the negative_sign for a
-          negative locally formatted monetary quantity.
-char *int_curr_symbol
-          The international currency symbol applicable to the current locale. The
-          first three characters contain the alphabetic international currency symbol
-          in accordance with those specified in ISO 4217. The fourth character
-          (immediately preceding the null character) is the character used to separate
-          the international currency symbol from the monetary quantity.
-char int_frac_digits
-          The number of fractional digits (those after the decimal-point) to be
-          displayed in an internationally formatted monetary quantity.
-char int_p_cs_precedes
-          Set to 1 or 0 if the int_curr_symbol respectively precedes or
-          succeeds the value for a nonnegative internationally formatted monetary
-          quantity.
-char int_n_cs_precedes
-          Set to 1 or 0 if the int_curr_symbol respectively precedes or
-          succeeds the value for a negative internationally formatted monetary
-          quantity.
-char int_p_sep_by_space
-          Set to a value indicating the separation of the int_curr_symbol, the
-          sign string, and the value for a nonnegative internationally formatted
-          monetary quantity.
-
-
-
-
-[<a name="p208" href="#p208">page 208</a>] (<a href="#Contents">Contents</a>)
-
-    char int_n_sep_by_space
-              Set to a value indicating the separation of the int_curr_symbol, the
-              sign string, and the value for a negative internationally formatted monetary
-              quantity.
-    char int_p_sign_posn
-              Set to a value indicating the positioning of the positive_sign for a
-              nonnegative internationally formatted monetary quantity.
-    char int_n_sign_posn
-              Set to a value indicating the positioning of the negative_sign for a
-              negative internationally formatted monetary quantity.
-4   The elements of grouping and mon_grouping are interpreted according to the
-    following:
-    CHAR_MAX      No further grouping is to be performed.
-    0             The previous element is to be repeatedly used for the remainder of the
-                  digits.
-    other         The integer value is the number of digits that compose the current group.
-                  The next element is examined to determine the size of the next group of
-                  digits before the current group.
-5   The values of p_sep_by_space, n_sep_by_space, int_p_sep_by_space,
-    and int_n_sep_by_space are interpreted according to the following:
-    0   No space separates the currency symbol and value.
-    1   If the currency symbol and sign string are adjacent, a space separates them from the
-        value; otherwise, a space separates the currency symbol from the value.
-    2   If the currency symbol and sign string are adjacent, a space separates them;
-        otherwise, a space separates the sign string from the value.
-    For int_p_sep_by_space and int_n_sep_by_space, the fourth character of
-    int_curr_symbol is used instead of a space.
-6   The values of p_sign_posn, n_sign_posn, int_p_sign_posn,                            and
-    int_n_sign_posn are interpreted according to the following:
-    0   Parentheses surround the quantity and currency symbol.
-    1   The sign string precedes the quantity and currency symbol.
-    2   The sign string succeeds the quantity and currency symbol.
-    3   The sign string immediately precedes the currency symbol.
-    4   The sign string immediately succeeds the currency symbol.
-
-
-[<a name="p209" href="#p209">page 209</a>] (<a href="#Contents">Contents</a>)
-
-7    The implementation shall behave as if no library function calls the localeconv
-     function.
-     Returns
-8    The localeconv function returns a pointer to the filled-in object. The structure
-     pointed to by the return value shall not be modified by the program, but may be
-     overwritten by a subsequent call to the localeconv function. In addition, calls to the
-     setlocale function with categories LC_ALL, LC_MONETARY, or LC_NUMERIC may
-     overwrite the contents of the structure.
-9    EXAMPLE 1 The following table illustrates rules which may well be used by four countries to format
-     monetary quantities.
-                                   Local format                                     International format
-
-     Country            Positive                  Negative                    Positive               Negative
-
-     Country1     1.234,56 mk             -1.234,56 mk                  FIM   1.234,56         FIM -1.234,56
-     Country2     L.1.234                 -L.1.234                      ITL   1.234            -ITL 1.234
-     Country3     fl. 1.234,56              fl. -1.234,56                   NLG   1.234,56         NLG -1.234,56
-     Country4     SFrs.1,234.56           SFrs.1,234.56C                CHF   1,234.56         CHF 1,234.56C
-10   For these four countries, the respective values for the monetary members of the structure returned by
-     localeconv could be:
-                                       Country1              Country2              Country3            Country4
-
-     mon_decimal_point                 ","                   ""                   ","                 "."
-     mon_thousands_sep                 "."                   "."                  "."                 ","
-     mon_grouping                      "\3"                  "\3"                 "\3"                "\3"
-     positive_sign                     ""                    ""                   ""                  ""
-     negative_sign                     "-"                   "-"                  "-"                 "C"
-     currency_symbol                   "mk"                  "L."                 "\u0192"            "SFrs."
-     frac_digits                       2                     0                    2                   2
-     p_cs_precedes                     0                     1                    1                   1
-     n_cs_precedes                     0                     1                    1                   1
-     p_sep_by_space                    1                     0                    1                   0
-     n_sep_by_space                    1                     0                    2                   0
-     p_sign_posn                       1                     1                    1                   1
-     n_sign_posn                       1                     1                    4                   2
-     int_curr_symbol                   "FIM "                "ITL "               "NLG "              "CHF "
-     int_frac_digits                   2                     0                    2                   2
-     int_p_cs_precedes                 1                     1                    1                   1
-     int_n_cs_precedes                 1                     1                    1                   1
-     int_p_sep_by_space                1                     1                    1                   1
-     int_n_sep_by_space                2                     1                    2                   1
-     int_p_sign_posn                   1                     1                    1                   1
-     int_n_sign_posn                   4                     1                    4                   2
-
-
-
-
-[<a name="p210" href="#p210">page 210</a>] (<a href="#Contents">Contents</a>)
-
-11   EXAMPLE 2 The following table illustrates how the cs_precedes, sep_by_space, and sign_posn members
-     affect the formatted value.
-                                                                   p_sep_by_space
-
-     p_cs_precedes           p_sign_posn                0                   1                  2
-
-                     0                    0         (<a href="#1.25">1.25</a>$)            (<a href="#1.25">1.25</a> $)            (<a href="#1.25">1.25</a>$)
-                                          1         +1.25$             +1.25 $             + <a href="#1.25">1.25</a>$
-                                          2         <a href="#1.25">1.25</a>$+             <a href="#1.25">1.25</a> $+             <a href="#1.25">1.25</a>$ +
-                                          3         <a href="#1.25">1.25</a>+$             <a href="#1.25">1.25</a> +$             <a href="#1.25">1.25</a>+ $
-                                          4         <a href="#1.25">1.25</a>$+             <a href="#1.25">1.25</a> $+             <a href="#1.25">1.25</a>$ +
-
-                     1                    0         ($1.25)            ($ <a href="#1.25">1.25</a>)            ($1.25)
-                                          1         +$1.25             +$ <a href="#1.25">1.25</a>             + $1.25
-                                          2         $1.25+             $ <a href="#1.25">1.25</a>+             $1.25 +
-                                          3         +$1.25             +$ <a href="#1.25">1.25</a>             + $1.25
-                                          4         $+1.25             $+ <a href="#1.25">1.25</a>             $ +1.25
-
-
-
-
-[<a name="p211" href="#p211">page 211</a>] (<a href="#Contents">Contents</a>)
-
-<a name="7.12" href="#7.12"><b>    7.12 Mathematics &lt;math.h&gt;</b></a>
-1   The header <a href="#7.12">&lt;math.h&gt;</a> declares two types and many mathematical functions and defines
-    several macros. Most synopses specify a family of functions consisting of a principal
-    function with one or more double parameters, a double return value, or both; and
-    other functions with the same name but with f and l suffixes, which are corresponding
-    functions with float and long double parameters, return values, or both.198)
-    Integer arithmetic functions and conversion functions are discussed later.
-2   The types
-            float_t
-            double_t
-    are floating types at least as wide as float and double, respectively, and such that
-    double_t is at least as wide as float_t. If FLT_EVAL_METHOD equals 0,
-    float_t and double_t are float and double, respectively; if
-    FLT_EVAL_METHOD equals 1, they are both double; if FLT_EVAL_METHOD equals
-    2, they are both long double; and for other values of FLT_EVAL_METHOD, they are
-    otherwise implementation-defined.199)
-3   The macro
-            HUGE_VAL
-    expands to a positive double constant expression, not necessarily representable as a
-    float. The macros
-            HUGE_VALF
-            HUGE_VALL
-    are respectively float and long double analogs of HUGE_VAL.200)
-4   The macro
-            INFINITY
-    expands to a constant expression of type float representing positive or unsigned
-    infinity, if available; else to a positive constant of type float that overflows at
-
-
-
-    198) Particularly on systems with wide expression evaluation, a <a href="#7.12">&lt;math.h&gt;</a> function might pass arguments
-         and return values in wider format than the synopsis prototype indicates.
-    199) The types float_t and double_t are intended to be the implementation's most efficient types at
-         least as wide as float and double, respectively. For FLT_EVAL_METHOD equal 0, 1, or 2, the
-         type float_t is the narrowest type used by the implementation to evaluate floating expressions.
-    200) HUGE_VAL, HUGE_VALF, and HUGE_VALL can be positive infinities in an implementation that
-         supports infinities.
-
-[<a name="p212" href="#p212">page 212</a>] (<a href="#Contents">Contents</a>)
-
-    translation time.201)
-5   The macro
-             NAN
-    is defined if and only if the implementation supports quiet NaNs for the float type. It
-    expands to a constant expression of type float representing a quiet NaN.
-6   The number classification macros
-             FP_INFINITE
-             FP_NAN
-             FP_NORMAL
-             FP_SUBNORMAL
-             FP_ZERO
-    represent the mutually exclusive kinds of floating-point values. They expand to integer
-    constant expressions with distinct values. Additional implementation-defined floating-
-    point classifications, with macro definitions beginning with FP_ and an uppercase letter,
-    may also be specified by the implementation.
-7   The macro
-             FP_FAST_FMA
-    is optionally defined. If defined, it indicates that the fma function generally executes
-    about as fast as, or faster than, a multiply and an add of double operands.202) The
-    macros
-             FP_FAST_FMAF
-             FP_FAST_FMAL
-    are, respectively, float and long double analogs of FP_FAST_FMA. If defined,
-    these macros expand to the integer constant 1.
-8   The macros
-             FP_ILOGB0
-             FP_ILOGBNAN
-    expand to integer constant expressions whose values are returned by ilogb(x) if x is
-    zero or NaN, respectively. The value of FP_ILOGB0 shall be either INT_MIN or
-    -INT_MAX. The value of FP_ILOGBNAN shall be either INT_MAX or INT_MIN.
-
-
-    201) In this case, using INFINITY will violate the constraint in <a href="#6.4.4">6.4.4</a> and thus require a diagnostic.
-    202) Typically, the FP_FAST_FMA macro is defined if and only if the fma function is implemented
-         directly with a hardware multiply-add instruction. Software implementations are expected to be
-         substantially slower.
-
-[<a name="p213" href="#p213">page 213</a>] (<a href="#Contents">Contents</a>)
-
-9   The macros
-            MATH_ERRNO
-            MATH_ERREXCEPT
-    expand to the integer constants 1 and 2, respectively; the macro
-            math_errhandling
-    expands to an expression that has type int and the value MATH_ERRNO,
-    MATH_ERREXCEPT, or the bitwise OR of both. The value of math_errhandling is
-    constant for the duration of the program. It is unspecified whether
-    math_errhandling is a macro or an identifier with external linkage. If a macro
-    definition is suppressed or a program defines an identifier with the name
-    math_errhandling, the behavior is undefined.               If the expression
-    math_errhandling &amp; MATH_ERREXCEPT can be nonzero, the implementation
-    shall define the macros FE_DIVBYZERO, FE_INVALID, and FE_OVERFLOW in
-    <a href="#7.6">&lt;fenv.h&gt;</a>.
-<a name="7.12.1" href="#7.12.1"><b>    7.12.1 Treatment of error conditions</b></a>
-1   The behavior of each of the functions in <a href="#7.12">&lt;math.h&gt;</a> is specified for all representable
-    values of its input arguments, except where stated otherwise. Each function shall execute
-    as if it were a single operation without generating any externally visible exceptional
-    conditions.
-2   For all functions, a domain error occurs if an input argument is outside the domain over
-    which the mathematical function is defined. The description of each function lists any
-    required domain errors; an implementation may define additional domain errors, provided
-    that such errors are consistent with the mathematical definition of the function.203) On a
-    domain error, the function returns an implementation-defined value; if the integer
-    expression math_errhandling &amp; MATH_ERRNO is nonzero, the integer expression
-    errno acquires the value EDOM; if the integer expression math_errhandling &amp;
-    MATH_ERREXCEPT is nonzero, the ''invalid'' floating-point exception is raised.
-3   Similarly, a range error occurs if the mathematical result of the function cannot be
-    represented in an object of the specified type, due to extreme magnitude.
-4   A floating result overflows if the magnitude of the mathematical result is finite but so
-    large that the mathematical result cannot be represented without extraordinary roundoff
-    error in an object of the specified type. If a floating result overflows and default rounding
-    is in effect, or if the mathematical result is an exact infinity from finite arguments (for
-    example log(0.0)), then the function returns the value of the macro HUGE_VAL,
-
-
-    203) In an implementation that supports infinities, this allows an infinity as an argument to be a domain
-         error if the mathematical domain of the function does not include the infinity.
-
-[<a name="p214" href="#p214">page 214</a>] (<a href="#Contents">Contents</a>)
-
-    HUGE_VALF, or HUGE_VALL according to the return type, with the same sign as the
-    correct value of the function; if the integer expression math_errhandling &amp;
-    MATH_ERRNO is nonzero, the integer expression errno acquires the value ERANGE; if
-    the integer expression math_errhandling &amp; MATH_ERREXCEPT is nonzero, the
-    ''divide-by-zero'' floating-point exception is raised if the mathematical result is an exact
-    infinity and the ''overflow'' floating-point exception is raised otherwise.
-5   The result underflows if the magnitude of the mathematical result is so small that the
-    mathematical result cannot be represented, without extraordinary roundoff error, in an
-    object of the specified type.204) If the result underflows, the function returns an
-    implementation-defined value whose magnitude is no greater than the smallest
-    normalized positive number in the specified type; if the integer expression
-    math_errhandling &amp; MATH_ERRNO is nonzero, whether errno acquires the
-    value    ERANGE       is    implementation-defined;     if   the  integer   expression
-    math_errhandling &amp; MATH_ERREXCEPT is nonzero, whether the ''underflow''
-    floating-point exception is raised is implementation-defined.
-<a name="7.12.2" href="#7.12.2"><b>    7.12.2 The FP_CONTRACT pragma</b></a>
-    Synopsis
-1           #include <a href="#7.12">&lt;math.h&gt;</a>
-            #pragma STDC FP_CONTRACT on-off-switch
-    Description
-2   The FP_CONTRACT pragma can be used to allow (if the state is ''on'') or disallow (if the
-    state is ''off'') the implementation to contract expressions (<a href="#6.5">6.5</a>). Each pragma can occur
-    either outside external declarations or preceding all explicit declarations and statements
-    inside a compound statement. When outside external declarations, the pragma takes
-    effect from its occurrence until another FP_CONTRACT pragma is encountered, or until
-    the end of the translation unit. When inside a compound statement, the pragma takes
-    effect from its occurrence until another FP_CONTRACT pragma is encountered
-    (including within a nested compound statement), or until the end of the compound
-    statement; at the end of a compound statement the state for the pragma is restored to its
-    condition just before the compound statement. If this pragma is used in any other
-    context, the behavior is undefined. The default state (''on'' or ''off'') for the pragma is
-    implementation-defined.
-
-
-
-
-    204) The term underflow here is intended to encompass both ''gradual underflow'' as in IEC 60559 and
-         also ''flush-to-zero'' underflow.
-
-[<a name="p215" href="#p215">page 215</a>] (<a href="#Contents">Contents</a>)
-
-<a name="7.12.3" href="#7.12.3"><b>    7.12.3 Classification macros</b></a>
-1   In the synopses in this subclause, real-floating indicates that the argument shall be an
-    expression of real floating type.
-<a name="7.12.3.1" href="#7.12.3.1"><b>    7.12.3.1 The fpclassify macro</b></a>
-    Synopsis
-1            #include <a href="#7.12">&lt;math.h&gt;</a>
-             int fpclassify(real-floating x);
-    Description
-2   The fpclassify macro classifies its argument value as NaN, infinite, normal,
-    subnormal, zero, or into another implementation-defined category. First, an argument
-    represented in a format wider than its semantic type is converted to its semantic type.
-    Then classification is based on the type of the argument.205)
-    Returns
-3   The fpclassify macro returns the value of the number classification macro
-    appropriate to the value of its argument.
-4   EXAMPLE        The fpclassify macro might be implemented in terms of ordinary functions as
-             #define fpclassify(x) \
-                   ((sizeof (x) == sizeof (float)) ? __fpclassifyf(x) : \
-                    (sizeof (x) == sizeof (double)) ? __fpclassifyd(x) : \
-                                                      __fpclassifyl(x))
-
-<a name="7.12.3.2" href="#7.12.3.2"><b>    7.12.3.2 The isfinite macro</b></a>
-    Synopsis
-1            #include <a href="#7.12">&lt;math.h&gt;</a>
-             int isfinite(real-floating x);
-    Description
-2   The isfinite macro determines whether its argument has a finite value (zero,
-    subnormal, or normal, and not infinite or NaN). First, an argument represented in a
-    format wider than its semantic type is converted to its semantic type. Then determination
-    is based on the type of the argument.
-
-
-
-
-    205) Since an expression can be evaluated with more range and precision than its type has, it is important to
-         know the type that classification is based on. For example, a normal long double value might
-         become subnormal when converted to double, and zero when converted to float.
-
-[<a name="p216" href="#p216">page 216</a>] (<a href="#Contents">Contents</a>)
-
-    Returns
-3   The isfinite macro returns a nonzero value if and only if its argument has a finite
-    value.
-<a name="7.12.3.3" href="#7.12.3.3"><b>    7.12.3.3 The isinf macro</b></a>
-    Synopsis
-1           #include <a href="#7.12">&lt;math.h&gt;</a>
-            int isinf(real-floating x);
-    Description
-2   The isinf macro determines whether its argument value is an infinity (positive or
-    negative). First, an argument represented in a format wider than its semantic type is
-    converted to its semantic type. Then determination is based on the type of the argument.
-    Returns
-3   The isinf macro returns a nonzero value if and only if its argument has an infinite
-    value.
-<a name="7.12.3.4" href="#7.12.3.4"><b>    7.12.3.4 The isnan macro</b></a>
-    Synopsis
-1           #include <a href="#7.12">&lt;math.h&gt;</a>
-            int isnan(real-floating x);
-    Description
-2   The isnan macro determines whether its argument value is a NaN. First, an argument
-    represented in a format wider than its semantic type is converted to its semantic type.
-    Then determination is based on the type of the argument.206)
-    Returns
-3   The isnan macro returns a nonzero value if and only if its argument has a NaN value.
-<a name="7.12.3.5" href="#7.12.3.5"><b>    7.12.3.5 The isnormal macro</b></a>
-    Synopsis
-1           #include <a href="#7.12">&lt;math.h&gt;</a>
-            int isnormal(real-floating x);
-
-
-
-
-    206) For the isnan macro, the type for determination does not matter unless the implementation supports
-         NaNs in the evaluation type but not in the semantic type.
-
-[<a name="p217" href="#p217">page 217</a>] (<a href="#Contents">Contents</a>)
-
-    Description
-2   The isnormal macro determines whether its argument value is normal (neither zero,
-    subnormal, infinite, nor NaN). First, an argument represented in a format wider than its
-    semantic type is converted to its semantic type. Then determination is based on the type
-    of the argument.
-    Returns
-3   The isnormal macro returns a nonzero value if and only if its argument has a normal
-    value.
-<a name="7.12.3.6" href="#7.12.3.6"><b>    7.12.3.6 The signbit macro</b></a>
-    Synopsis
-1           #include <a href="#7.12">&lt;math.h&gt;</a>
-            int signbit(real-floating x);
-    Description
-2   The signbit macro determines whether the sign of its argument value is negative.207)
-    Returns
-3   The signbit macro returns a nonzero value if and only if the sign of its argument value
-    is negative.
-<a name="7.12.4" href="#7.12.4"><b>    7.12.4 Trigonometric functions</b></a>
-<a name="7.12.4.1" href="#7.12.4.1"><b>    7.12.4.1 The acos functions</b></a>
-    Synopsis
-1           #include <a href="#7.12">&lt;math.h&gt;</a>
-            double acos(double x);
-            float acosf(float x);
-            long double acosl(long double x);
-    Description
-2   The acos functions compute the principal value of the arc cosine of x. A domain error
-    occurs for arguments not in the interval [-1, +1].
-    Returns
-3   The acos functions return arccos x in the interval [0, pi ] radians.
-
-
-
-
-    207) The signbit macro reports the sign of all values, including infinities, zeros, and NaNs. If zero is
-         unsigned, it is treated as positive.
-
-[<a name="p218" href="#p218">page 218</a>] (<a href="#Contents">Contents</a>)
-
-<a name="7.12.4.2" href="#7.12.4.2"><b>    7.12.4.2 The asin functions</b></a>
-    Synopsis
-1          #include <a href="#7.12">&lt;math.h&gt;</a>
-           double asin(double x);
-           float asinf(float x);
-           long double asinl(long double x);
-    Description
-2   The asin functions compute the principal value of the arc sine of x. A domain error
-    occurs for arguments not in the interval [-1, +1].
-    Returns
-3   The asin functions return arcsin x in the interval [-pi /2, +pi /2] radians.
-<a name="7.12.4.3" href="#7.12.4.3"><b>    7.12.4.3 The atan functions</b></a>
-    Synopsis
-1          #include <a href="#7.12">&lt;math.h&gt;</a>
-           double atan(double x);
-           float atanf(float x);
-           long double atanl(long double x);
-    Description
-2   The atan functions compute the principal value of the arc tangent of x.
-    Returns
-3   The atan functions return arctan x in the interval [-pi /2, +pi /2] radians.
-<a name="7.12.4.4" href="#7.12.4.4"><b>    7.12.4.4 The atan2 functions</b></a>
-    Synopsis
-1          #include <a href="#7.12">&lt;math.h&gt;</a>
-           double atan2(double y, double x);
-           float atan2f(float y, float x);
-           long double atan2l(long double y, long double x);
-    Description
-2   The atan2 functions compute the value of the arc tangent of y/x, using the signs of both
-    arguments to determine the quadrant of the return value. A domain error may occur if
-    both arguments are zero.
-    Returns
-3   The atan2 functions return arctan y/x in the interval [-pi , +pi ] radians.
-
-
-[<a name="p219" href="#p219">page 219</a>] (<a href="#Contents">Contents</a>)
-
-<a name="7.12.4.5" href="#7.12.4.5"><b>    7.12.4.5 The cos functions</b></a>
-    Synopsis
-1          #include <a href="#7.12">&lt;math.h&gt;</a>
-           double cos(double x);
-           float cosf(float x);
-           long double cosl(long double x);
-    Description
-2   The cos functions compute the cosine of x (measured in radians).
-    Returns
-3   The cos functions return cos x.
-<a name="7.12.4.6" href="#7.12.4.6"><b>    7.12.4.6 The sin functions</b></a>
-    Synopsis
-1          #include <a href="#7.12">&lt;math.h&gt;</a>
-           double sin(double x);
-           float sinf(float x);
-           long double sinl(long double x);
-    Description
-2   The sin functions compute the sine of x (measured in radians).
-    Returns
-3   The sin functions return sin x.
-<a name="7.12.4.7" href="#7.12.4.7"><b>    7.12.4.7 The tan functions</b></a>
-    Synopsis
-1          #include <a href="#7.12">&lt;math.h&gt;</a>
-           double tan(double x);
-           float tanf(float x);
-           long double tanl(long double x);
-    Description
-2   The tan functions return the tangent of x (measured in radians).
-    Returns
-3   The tan functions return tan x.
-
-
-
-
-[<a name="p220" href="#p220">page 220</a>] (<a href="#Contents">Contents</a>)
-
-<a name="7.12.5" href="#7.12.5"><b>    7.12.5 Hyperbolic functions</b></a>
-<a name="7.12.5.1" href="#7.12.5.1"><b>    7.12.5.1 The acosh functions</b></a>
-    Synopsis
-1          #include <a href="#7.12">&lt;math.h&gt;</a>
-           double acosh(double x);
-           float acoshf(float x);
-           long double acoshl(long double x);
-    Description
-2   The acosh functions compute the (nonnegative) arc hyperbolic cosine of x. A domain
-    error occurs for arguments less than 1.
-    Returns
-3   The acosh functions return arcosh x in the interval [0, +(inf)].
-<a name="7.12.5.2" href="#7.12.5.2"><b>    7.12.5.2 The asinh functions</b></a>
-    Synopsis
-1          #include <a href="#7.12">&lt;math.h&gt;</a>
-           double asinh(double x);
-           float asinhf(float x);
-           long double asinhl(long double x);
-    Description
-2   The asinh functions compute the arc hyperbolic sine of x.
-    Returns
-3   The asinh functions return arsinh x.
-<a name="7.12.5.3" href="#7.12.5.3"><b>    7.12.5.3 The atanh functions</b></a>
-    Synopsis
-1          #include <a href="#7.12">&lt;math.h&gt;</a>
-           double atanh(double x);
-           float atanhf(float x);
-           long double atanhl(long double x);
-    Description
-2   The atanh functions compute the arc hyperbolic tangent of x. A domain error occurs
-    for arguments not in the interval [-1, +1]. A range error may occur if the argument
-    equals -1 or +1.
-
-
-
-[<a name="p221" href="#p221">page 221</a>] (<a href="#Contents">Contents</a>)
-
-    Returns
-3   The atanh functions return artanh x.
-<a name="7.12.5.4" href="#7.12.5.4"><b>    7.12.5.4 The cosh functions</b></a>
-    Synopsis
-1          #include <a href="#7.12">&lt;math.h&gt;</a>
-           double cosh(double x);
-           float coshf(float x);
-           long double coshl(long double x);
-    Description
-2   The cosh functions compute the hyperbolic cosine of x. A range error occurs if the
-    magnitude of x is too large.
-    Returns
-3   The cosh functions return cosh x.
-<a name="7.12.5.5" href="#7.12.5.5"><b>    7.12.5.5 The sinh functions</b></a>
-    Synopsis
-1          #include <a href="#7.12">&lt;math.h&gt;</a>
-           double sinh(double x);
-           float sinhf(float x);
-           long double sinhl(long double x);
-    Description
-2   The sinh functions compute the hyperbolic sine of x. A range error occurs if the
-    magnitude of x is too large.
-    Returns
-3   The sinh functions return sinh x.
-<a name="7.12.5.6" href="#7.12.5.6"><b>    7.12.5.6 The tanh functions</b></a>
-    Synopsis
-1          #include <a href="#7.12">&lt;math.h&gt;</a>
-           double tanh(double x);
-           float tanhf(float x);
-           long double tanhl(long double x);
-    Description
-2   The tanh functions compute the hyperbolic tangent of x.
-
-
-
-[<a name="p222" href="#p222">page 222</a>] (<a href="#Contents">Contents</a>)
-
-    Returns
-3   The tanh functions return tanh x.
-<a name="7.12.6" href="#7.12.6"><b>    7.12.6 Exponential and logarithmic functions</b></a>
-<a name="7.12.6.1" href="#7.12.6.1"><b>    7.12.6.1 The exp functions</b></a>
-    Synopsis
-1          #include <a href="#7.12">&lt;math.h&gt;</a>
-           double exp(double x);
-           float expf(float x);
-           long double expl(long double x);
-    Description
-2   The exp functions compute the base-e exponential of x. A range error occurs if the
-    magnitude of x is too large.
-    Returns
-3   The exp functions return ex .
-<a name="7.12.6.2" href="#7.12.6.2"><b>    7.12.6.2 The exp2 functions</b></a>
-    Synopsis
-1          #include <a href="#7.12">&lt;math.h&gt;</a>
-           double exp2(double x);
-           float exp2f(float x);
-           long double exp2l(long double x);
-    Description
-2   The exp2 functions compute the base-2 exponential of x. A range error occurs if the
-    magnitude of x is too large.
-    Returns
-3   The exp2 functions return 2x .
-<a name="7.12.6.3" href="#7.12.6.3"><b>    7.12.6.3 The expm1 functions</b></a>
-    Synopsis
-1          #include <a href="#7.12">&lt;math.h&gt;</a>
-           double expm1(double x);
-           float expm1f(float x);
-           long double expm1l(long double x);
-
-
-
-
-[<a name="p223" href="#p223">page 223</a>] (<a href="#Contents">Contents</a>)
-
-    Description
-2   The expm1 functions compute the base-e exponential of the argument, minus 1. A range
-    error occurs if x is too large.208)
-    Returns
-3   The expm1 functions return ex - 1.
-<a name="7.12.6.4" href="#7.12.6.4"><b>    7.12.6.4 The frexp functions</b></a>
-    Synopsis
-1           #include <a href="#7.12">&lt;math.h&gt;</a>
-            double frexp(double value, int *exp);
-            float frexpf(float value, int *exp);
-            long double frexpl(long double value, int *exp);
-    Description
-2   The frexp functions break a floating-point number into a normalized fraction and an
-    integral power of 2. They store the integer in the int object pointed to by exp.
-    Returns
-3   If value is not a floating-point number, the results are unspecified. Otherwise, the
-    frexp functions return the value x, such that x has a magnitude in the interval [1/2, 1) or
-    zero, and value equals x x 2*exp . If value is zero, both parts of the result are zero.
-<a name="7.12.6.5" href="#7.12.6.5"><b>    7.12.6.5 The ilogb functions</b></a>
-    Synopsis
-1           #include <a href="#7.12">&lt;math.h&gt;</a>
-            int ilogb(double x);
-            int ilogbf(float x);
-            int ilogbl(long double x);
-    Description
-2   The ilogb functions extract the exponent of x as a signed int value. If x is zero they
-    compute the value FP_ILOGB0; if x is infinite they compute the value INT_MAX; if x is
-    a NaN they compute the value FP_ILOGBNAN; otherwise, they are equivalent to calling
-    the corresponding logb function and casting the returned value to type int. A domain
-    error or range error may occur if x is zero, infinite, or NaN. If the correct value is outside
-    the range of the return type, the numeric result is unspecified.
-
-
-
-
-    208) For small magnitude x, expm1(x) is expected to be more accurate than exp(x) - 1.
-
-[<a name="p224" href="#p224">page 224</a>] (<a href="#Contents">Contents</a>)
-
-    Returns
-3   The ilogb functions return the exponent of x as a signed int value.
-    Forward references: the logb functions (<a href="#7.12.6.11">7.12.6.11</a>).
-<a name="7.12.6.6" href="#7.12.6.6"><b>    7.12.6.6 The ldexp functions</b></a>
-    Synopsis
-1          #include <a href="#7.12">&lt;math.h&gt;</a>
-           double ldexp(double x, int exp);
-           float ldexpf(float x, int exp);
-           long double ldexpl(long double x, int exp);
-    Description
-2   The ldexp functions multiply a floating-point number by an integral power of 2. A
-    range error may occur.
-    Returns
-3   The ldexp functions return x x 2exp .
-<a name="7.12.6.7" href="#7.12.6.7"><b>    7.12.6.7 The log functions</b></a>
-    Synopsis
-1          #include <a href="#7.12">&lt;math.h&gt;</a>
-           double log(double x);
-           float logf(float x);
-           long double logl(long double x);
-    Description
-2   The log functions compute the base-e (natural) logarithm of x. A domain error occurs if
-    the argument is negative. A range error may occur if the argument is zero.
-    Returns
-3   The log functions return loge x.
-<a name="7.12.6.8" href="#7.12.6.8"><b>    7.12.6.8 The log10 functions</b></a>
-    Synopsis
-1          #include <a href="#7.12">&lt;math.h&gt;</a>
-           double log10(double x);
-           float log10f(float x);
-           long double log10l(long double x);
-
-
-
-
-[<a name="p225" href="#p225">page 225</a>] (<a href="#Contents">Contents</a>)
-
-    Description
-2   The log10 functions compute the base-10 (common) logarithm of x. A domain error
-    occurs if the argument is negative. A range error may occur if the argument is zero.
-    Returns
-3   The log10 functions return log10 x.
-<a name="7.12.6.9" href="#7.12.6.9"><b>    7.12.6.9 The log1p functions</b></a>
-    Synopsis
-1           #include <a href="#7.12">&lt;math.h&gt;</a>
-            double log1p(double x);
-            float log1pf(float x);
-            long double log1pl(long double x);
-    Description
-2   The log1p functions compute the base-e (natural) logarithm of 1 plus the argument.209)
-    A domain error occurs if the argument is less than -1. A range error may occur if the
-    argument equals -1.
-    Returns
-3   The log1p functions return loge (1 + x).
-<a name="7.12.6.10" href="#7.12.6.10"><b>    7.12.6.10 The log2 functions</b></a>
-    Synopsis
-1           #include <a href="#7.12">&lt;math.h&gt;</a>
-            double log2(double x);
-            float log2f(float x);
-            long double log2l(long double x);
-    Description
-2   The log2 functions compute the base-2 logarithm of x. A domain error occurs if the
-    argument is less than zero. A range error may occur if the argument is zero.
-    Returns
-3   The log2 functions return log2 x.
-
-
-
-
-    209) For small magnitude x, log1p(x) is expected to be more accurate than log(1 + x).
-
-[<a name="p226" href="#p226">page 226</a>] (<a href="#Contents">Contents</a>)
-
-<a name="7.12.6.11" href="#7.12.6.11"><b>    7.12.6.11 The logb functions</b></a>
-    Synopsis
-1          #include <a href="#7.12">&lt;math.h&gt;</a>
-           double logb(double x);
-           float logbf(float x);
-           long double logbl(long double x);
-    Description
-2   The logb functions extract the exponent of x, as a signed integer value in floating-point
-    format. If x is subnormal it is treated as though it were normalized; thus, for positive
-    finite x,
-          1 &lt;= x x FLT_RADIX-logb(x) &lt; FLT_RADIX
-    A domain error or range error may occur if the argument is zero.
-    Returns
-3   The logb functions return the signed exponent of x.
-<a name="7.12.6.12" href="#7.12.6.12"><b>    7.12.6.12 The modf functions</b></a>
-    Synopsis
-1          #include <a href="#7.12">&lt;math.h&gt;</a>
-           double modf(double value, double *iptr);
-           float modff(float value, float *iptr);
-           long double modfl(long double value, long double *iptr);
-    Description
-2   The modf functions break the argument value into integral and fractional parts, each of
-    which has the same type and sign as the argument. They store the integral part (in
-    floating-point format) in the object pointed to by iptr.
-    Returns
-3   The modf functions return the signed fractional part of value.
-
-
-
-
-[<a name="p227" href="#p227">page 227</a>] (<a href="#Contents">Contents</a>)
-
-<a name="7.12.6.13" href="#7.12.6.13"><b>    7.12.6.13 The scalbn and scalbln functions</b></a>
-    Synopsis
-1          #include <a href="#7.12">&lt;math.h&gt;</a>
-           double scalbn(double x, int n);
-           float scalbnf(float x, int n);
-           long double scalbnl(long double x, int n);
-           double scalbln(double x, long int n);
-           float scalblnf(float x, long int n);
-           long double scalblnl(long double x, long int n);
-    Description
-2   The scalbn and scalbln functions compute x x FLT_RADIXn efficiently, not
-    normally by computing FLT_RADIXn explicitly. A range error may occur.
-    Returns
-3   The scalbn and scalbln functions return x x FLT_RADIXn .
-<a name="7.12.7" href="#7.12.7"><b>    7.12.7 Power and absolute-value functions</b></a>
-<a name="7.12.7.1" href="#7.12.7.1"><b>    7.12.7.1 The cbrt functions</b></a>
-    Synopsis
-1          #include <a href="#7.12">&lt;math.h&gt;</a>
-           double cbrt(double x);
-           float cbrtf(float x);
-           long double cbrtl(long double x);
-    Description
-2   The cbrt functions compute the real cube root of x.
-    Returns
-3   The cbrt functions return x1/3 .
-<a name="7.12.7.2" href="#7.12.7.2"><b>    7.12.7.2 The fabs functions</b></a>
-    Synopsis
-1          #include <a href="#7.12">&lt;math.h&gt;</a>
-           double fabs(double x);
-           float fabsf(float x);
-           long double fabsl(long double x);
-    Description
-2   The fabs functions compute the absolute value of a floating-point number x.
-
-
-[<a name="p228" href="#p228">page 228</a>] (<a href="#Contents">Contents</a>)
-
-    Returns
-3   The fabs functions return | x |.
-<a name="7.12.7.3" href="#7.12.7.3"><b>    7.12.7.3 The hypot functions</b></a>
-    Synopsis
-1          #include <a href="#7.12">&lt;math.h&gt;</a>
-           double hypot(double x, double y);
-           float hypotf(float x, float y);
-           long double hypotl(long double x, long double y);
-    Description
-2   The hypot functions compute the square root of the sum of the squares of x and y,
-    without undue overflow or underflow. A range error may occur.
-3   Returns
-4   The hypot functions return sqrt:x2 + y2 .
-                               ???
-                               ???????????????
-<a name="7.12.7.4" href="#7.12.7.4"><b>    7.12.7.4 The pow functions</b></a>
-    Synopsis
-1          #include <a href="#7.12">&lt;math.h&gt;</a>
-           double pow(double x, double y);
-           float powf(float x, float y);
-           long double powl(long double x, long double y);
-    Description
-2   The pow functions compute x raised to the power y. A domain error occurs if x is finite
-    and negative and y is finite and not an integer value. A range error may occur. A domain
-    error may occur if x is zero and y is zero. A domain error or range error may occur if x
-    is zero and y is less than zero.
-    Returns
-3   The pow functions return xy .
-<a name="7.12.7.5" href="#7.12.7.5"><b>    7.12.7.5 The sqrt functions</b></a>
-    Synopsis
-1          #include <a href="#7.12">&lt;math.h&gt;</a>
-           double sqrt(double x);
-           float sqrtf(float x);
-           long double sqrtl(long double x);
-
-
-
-
-[<a name="p229" href="#p229">page 229</a>] (<a href="#Contents">Contents</a>)
-
-    Description
-2   The sqrt functions compute the nonnegative square root of x. A domain error occurs if
-    the argument is less than zero.
-    Returns
-3   The sqrt functions return sqrt:x.
-                              ???
-                              ???
-<a name="7.12.8" href="#7.12.8"><b>    7.12.8 Error and gamma functions</b></a>
-<a name="7.12.8.1" href="#7.12.8.1"><b>    7.12.8.1 The erf functions</b></a>
-    Synopsis
-1          #include <a href="#7.12">&lt;math.h&gt;</a>
-           double erf(double x);
-           float erff(float x);
-           long double erfl(long double x);
-    Description
-2   The erf functions compute the error function of x.
-    Returns
-                                       2        x
-                                            (integral)
-3
-    The erf functions return erf x =                e-t dt.
-                                                      2
-
-
-                                       sqrt:pi
-                                       ???
-                                       ???    0
-
-<a name="7.12.8.2" href="#7.12.8.2"><b>    7.12.8.2 The erfc functions</b></a>
-    Synopsis
-1          #include <a href="#7.12">&lt;math.h&gt;</a>
-           double erfc(double x);
-           float erfcf(float x);
-           long double erfcl(long double x);
-    Description
-2   The erfc functions compute the complementary error function of x. A range error
-    occurs if x is too large.
-    Returns
-                                                              2        (inf)
-                                                                   (integral)
-3
-    The erfc functions return erfc x = 1 - erf x =                         e-t dt.
-                                                                             2
-
-
-                                                              sqrt:pi
-                                                              ???
-                                                              ???    x
-
-
-
-
-[<a name="p230" href="#p230">page 230</a>] (<a href="#Contents">Contents</a>)
-
-<a name="7.12.8.3" href="#7.12.8.3"><b>    7.12.8.3 The lgamma functions</b></a>
-    Synopsis
-1          #include <a href="#7.12">&lt;math.h&gt;</a>
-           double lgamma(double x);
-           float lgammaf(float x);
-           long double lgammal(long double x);
-    Description
-2   The lgamma functions compute the natural logarithm of the absolute value of gamma of
-    x. A range error occurs if x is too large. A range error may occur if x is a negative
-    integer or zero.
-    Returns
-3   The lgamma functions return loge | (Gamma)(x) |.
-<a name="7.12.8.4" href="#7.12.8.4"><b>    7.12.8.4 The tgamma functions</b></a>
-    Synopsis
-1          #include <a href="#7.12">&lt;math.h&gt;</a>
-           double tgamma(double x);
-           float tgammaf(float x);
-           long double tgammal(long double x);
-    Description
-2   The tgamma functions compute the gamma function of x. A domain error or range error
-    may occur if x is a negative integer or zero. A range error may occur if the magnitude of
-    x is too large or too small.
-    Returns
-3   The tgamma functions return (Gamma)(x).
-<a name="7.12.9" href="#7.12.9"><b>    7.12.9 Nearest integer functions</b></a>
-<a name="7.12.9.1" href="#7.12.9.1"><b>    7.12.9.1 The ceil functions</b></a>
-    Synopsis
-1          #include <a href="#7.12">&lt;math.h&gt;</a>
-           double ceil(double x);
-           float ceilf(float x);
-           long double ceill(long double x);
-    Description
-2   The ceil functions compute the smallest integer value not less than x.
-
-
-[<a name="p231" href="#p231">page 231</a>] (<a href="#Contents">Contents</a>)
-
-    Returns
-3   The ceil functions return ???x???, expressed as a floating-point number.
-<a name="7.12.9.2" href="#7.12.9.2"><b>    7.12.9.2 The floor functions</b></a>
-    Synopsis
-1          #include <a href="#7.12">&lt;math.h&gt;</a>
-           double floor(double x);
-           float floorf(float x);
-           long double floorl(long double x);
-    Description
-2   The floor functions compute the largest integer value not greater than x.
-    Returns
-3   The floor functions return ???x???, expressed as a floating-point number.
-<a name="7.12.9.3" href="#7.12.9.3"><b>    7.12.9.3 The nearbyint functions</b></a>
-    Synopsis
-1          #include <a href="#7.12">&lt;math.h&gt;</a>
-           double nearbyint(double x);
-           float nearbyintf(float x);
-           long double nearbyintl(long double x);
-    Description
-2   The nearbyint functions round their argument to an integer value in floating-point
-    format, using the current rounding direction and without raising the ''inexact'' floating-
-    point exception.
-    Returns
-3   The nearbyint functions return the rounded integer value.
-<a name="7.12.9.4" href="#7.12.9.4"><b>    7.12.9.4 The rint functions</b></a>
-    Synopsis
-1          #include <a href="#7.12">&lt;math.h&gt;</a>
-           double rint(double x);
-           float rintf(float x);
-           long double rintl(long double x);
-    Description
-2   The rint functions differ from the nearbyint functions (<a href="#7.12.9.3">7.12.9.3</a>) only in that the
-    rint functions may raise the ''inexact'' floating-point exception if the result differs in
-    value from the argument.
-[<a name="p232" href="#p232">page 232</a>] (<a href="#Contents">Contents</a>)
-
-    Returns
-3   The rint functions return the rounded integer value.
-<a name="7.12.9.5" href="#7.12.9.5"><b>    7.12.9.5 The lrint and llrint functions</b></a>
-    Synopsis
-1          #include <a href="#7.12">&lt;math.h&gt;</a>
-           long int lrint(double x);
-           long int lrintf(float x);
-           long int lrintl(long double x);
-           long long int llrint(double x);
-           long long int llrintf(float x);
-           long long int llrintl(long double x);
-    Description
-2   The lrint and llrint functions round their argument to the nearest integer value,
-    rounding according to the current rounding direction. If the rounded value is outside the
-    range of the return type, the numeric result is unspecified and a domain error or range
-    error may occur.                                                                          *
-    Returns
-3   The lrint and llrint functions return the rounded integer value.
-<a name="7.12.9.6" href="#7.12.9.6"><b>    7.12.9.6 The round functions</b></a>
-    Synopsis
-1          #include <a href="#7.12">&lt;math.h&gt;</a>
-           double round(double x);
-           float roundf(float x);
-           long double roundl(long double x);
-    Description
-2   The round functions round their argument to the nearest integer value in floating-point
-    format, rounding halfway cases away from zero, regardless of the current rounding
-    direction.
-    Returns
-3   The round functions return the rounded integer value.
-
-
-
-
-[<a name="p233" href="#p233">page 233</a>] (<a href="#Contents">Contents</a>)
-
-<a name="7.12.9.7" href="#7.12.9.7"><b>    7.12.9.7 The lround and llround functions</b></a>
-    Synopsis
-1          #include <a href="#7.12">&lt;math.h&gt;</a>
-           long int lround(double x);
-           long int lroundf(float x);
-           long int lroundl(long double x);
-           long long int llround(double x);
-           long long int llroundf(float x);
-           long long int llroundl(long double x);
-    Description
-2   The lround and llround functions round their argument to the nearest integer value,
-    rounding halfway cases away from zero, regardless of the current rounding direction. If
-    the rounded value is outside the range of the return type, the numeric result is unspecified
-    and a domain error or range error may occur.
-    Returns
-3   The lround and llround functions return the rounded integer value.
-<a name="7.12.9.8" href="#7.12.9.8"><b>    7.12.9.8 The trunc functions</b></a>
-    Synopsis
-1          #include <a href="#7.12">&lt;math.h&gt;</a>
-           double trunc(double x);
-           float truncf(float x);
-           long double truncl(long double x);
-    Description
-2   The trunc functions round their argument to the integer value, in floating format,
-    nearest to but no larger in magnitude than the argument.
-    Returns
-3   The trunc functions return the truncated integer value.
-
-
-
-
-[<a name="p234" href="#p234">page 234</a>] (<a href="#Contents">Contents</a>)
-
-<a name="7.12.10" href="#7.12.10"><b>    7.12.10 Remainder functions</b></a>
-<a name="7.12.10.1" href="#7.12.10.1"><b>    7.12.10.1 The fmod functions</b></a>
-    Synopsis
-1            #include <a href="#7.12">&lt;math.h&gt;</a>
-             double fmod(double x, double y);
-             float fmodf(float x, float y);
-             long double fmodl(long double x, long double y);
-    Description
-2   The fmod functions compute the floating-point remainder of x/y.
-    Returns
-3   The fmod functions return the value x - ny, for some integer n such that, if y is nonzero,
-    the result has the same sign as x and magnitude less than the magnitude of y. If y is zero,
-    whether a domain error occurs or the fmod functions return zero is implementation-
-    defined.
-<a name="7.12.10.2" href="#7.12.10.2"><b>    7.12.10.2 The remainder functions</b></a>
-    Synopsis
-1            #include <a href="#7.12">&lt;math.h&gt;</a>
-             double remainder(double x, double y);
-             float remainderf(float x, float y);
-             long double remainderl(long double x, long double y);
-    Description
-2   The remainder functions compute the remainder x REM y required by IEC 60559.210)
-    Returns
-3   The remainder functions return x REM y. If y is zero, whether a domain error occurs
-    or the functions return zero is implementation defined.
-
-
-
-
-    210) ''When y != 0, the remainder r = x REM y is defined regardless of the rounding mode by the
-         mathematical relation r = x - ny, where n is the integer nearest the exact value of x/y; whenever
-         | n - x/y | = 1/2, then n is even. Thus, the remainder is always exact. If r = 0, its sign shall be that of
-         x.'' This definition is applicable for all implementations.
-
-[<a name="p235" href="#p235">page 235</a>] (<a href="#Contents">Contents</a>)
-
-<a name="7.12.10.3" href="#7.12.10.3"><b>    7.12.10.3 The remquo functions</b></a>
-    Synopsis
-1          #include <a href="#7.12">&lt;math.h&gt;</a>
-           double remquo(double x, double y, int *quo);
-           float remquof(float x, float y, int *quo);
-           long double remquol(long double x, long double y,
-                int *quo);
-    Description
-2   The remquo functions compute the same remainder as the remainder functions. In
-    the object pointed to by quo they store a value whose sign is the sign of x/y and whose
-    magnitude is congruent modulo 2n to the magnitude of the integral quotient of x/y, where
-    n is an implementation-defined integer greater than or equal to 3.
-    Returns
-3   The remquo functions return x REM y. If y is zero, the value stored in the object
-    pointed to by quo is unspecified and whether a domain error occurs or the functions
-    return zero is implementation defined.
-<a name="7.12.11" href="#7.12.11"><b>    7.12.11 Manipulation functions</b></a>
-<a name="7.12.11.1" href="#7.12.11.1"><b>    7.12.11.1 The copysign functions</b></a>
-    Synopsis
-1          #include <a href="#7.12">&lt;math.h&gt;</a>
-           double copysign(double x, double y);
-           float copysignf(float x, float y);
-           long double copysignl(long double x, long double y);
-    Description
-2   The copysign functions produce a value with the magnitude of x and the sign of y.
-    They produce a NaN (with the sign of y) if x is a NaN. On implementations that
-    represent a signed zero but do not treat negative zero consistently in arithmetic
-    operations, the copysign functions regard the sign of zero as positive.
-    Returns
-3   The copysign functions return a value with the magnitude of x and the sign of y.
-
-
-
-
-[<a name="p236" href="#p236">page 236</a>] (<a href="#Contents">Contents</a>)
-
-<a name="7.12.11.2" href="#7.12.11.2"><b>    7.12.11.2 The nan functions</b></a>
-    Synopsis
-1           #include <a href="#7.12">&lt;math.h&gt;</a>
-            double nan(const char *tagp);
-            float nanf(const char *tagp);
-            long double nanl(const char *tagp);
-    Description
-2   The call nan("n-char-sequence") is equivalent to strtod("NAN(n-char-
-    sequence)",     (char**)       NULL); the call nan("") is equivalent to
-    strtod("NAN()", (char**) NULL). If tagp does not point to an n-char
-    sequence or an empty string, the call is equivalent to strtod("NAN", (char**)
-    NULL). Calls to nanf and nanl are equivalent to the corresponding calls to strtof
-    and strtold.
-    Returns
-3   The nan functions return a quiet NaN, if available, with content indicated through tagp.
-    If the implementation does not support quiet NaNs, the functions return zero.
-    Forward references: the strtod, strtof, and strtold functions (<a href="#7.20.1.3">7.20.1.3</a>).
-<a name="7.12.11.3" href="#7.12.11.3"><b>    7.12.11.3 The nextafter functions</b></a>
-    Synopsis
-1           #include <a href="#7.12">&lt;math.h&gt;</a>
-            double nextafter(double x, double y);
-            float nextafterf(float x, float y);
-            long double nextafterl(long double x, long double y);
-    Description
-2   The nextafter functions determine the next representable value, in the type of the
-    function, after x in the direction of y, where x and y are first converted to the type of the
-    function.211) The nextafter functions return y if x equals y. A range error may occur
-    if the magnitude of x is the largest finite value representable in the type and the result is
-    infinite or not representable in the type.
-    Returns
-3   The nextafter functions return the next representable value in the specified format
-    after x in the direction of y.
-
-
-    211) The argument values are converted to the type of the function, even by a macro implementation of the
-         function.
-
-[<a name="p237" href="#p237">page 237</a>] (<a href="#Contents">Contents</a>)
-
-<a name="7.12.11.4" href="#7.12.11.4"><b>    7.12.11.4 The nexttoward functions</b></a>
-    Synopsis
-1           #include <a href="#7.12">&lt;math.h&gt;</a>
-            double nexttoward(double x, long double y);
-            float nexttowardf(float x, long double y);
-            long double nexttowardl(long double x, long double y);
-    Description
-2   The nexttoward functions are equivalent to the nextafter functions except that the
-    second parameter has type long double and the functions return y converted to the
-    type of the function if x equals y.212)
-<a name="7.12.12" href="#7.12.12"><b>    7.12.12 Maximum, minimum, and positive difference functions</b></a>
-<a name="7.12.12.1" href="#7.12.12.1"><b>    7.12.12.1 The fdim functions</b></a>
-    Synopsis
-1           #include <a href="#7.12">&lt;math.h&gt;</a>
-            double fdim(double x, double y);
-            float fdimf(float x, float y);
-            long double fdiml(long double x, long double y);
-    Description
-2   The fdim functions determine the positive difference between their arguments:
-          ???x - y if x &gt; y
-          ???
-          ???+0     if x &lt;= y
-    A range error may occur.
-    Returns
-3   The fdim functions return the positive difference value.
-<a name="7.12.12.2" href="#7.12.12.2"><b>    7.12.12.2 The fmax functions</b></a>
-    Synopsis
-1           #include <a href="#7.12">&lt;math.h&gt;</a>
-            double fmax(double x, double y);
-            float fmaxf(float x, float y);
-            long double fmaxl(long double x, long double y);
-
-
-
-    212) The result of the nexttoward functions is determined in the type of the function, without loss of
-         range or precision in a floating second argument.
-
-[<a name="p238" href="#p238">page 238</a>] (<a href="#Contents">Contents</a>)
-
-    Description
-2   The fmax functions determine the maximum numeric value of their arguments.213)
-    Returns
-3   The fmax functions return the maximum numeric value of their arguments.
-<a name="7.12.12.3" href="#7.12.12.3"><b>    7.12.12.3 The fmin functions</b></a>
-    Synopsis
-1           #include <a href="#7.12">&lt;math.h&gt;</a>
-            double fmin(double x, double y);
-            float fminf(float x, float y);
-            long double fminl(long double x, long double y);
-    Description
-2   The fmin functions determine the minimum numeric value of their arguments.214)
-    Returns
-3   The fmin functions return the minimum numeric value of their arguments.
-<a name="7.12.13" href="#7.12.13"><b>    7.12.13 Floating multiply-add</b></a>
-<a name="7.12.13.1" href="#7.12.13.1"><b>    7.12.13.1 The fma functions</b></a>
-    Synopsis
-1           #include <a href="#7.12">&lt;math.h&gt;</a>
-            double fma(double x, double y, double z);
-            float fmaf(float x, float y, float z);
-            long double fmal(long double x, long double y,
-                 long double z);
-    Description
-2   The fma functions compute (x x y) + z, rounded as one ternary operation: they compute
-    the value (as if) to infinite precision and round once to the result format, according to the
-    current rounding mode. A range error may occur.
-    Returns
-3   The fma functions return (x x y) + z, rounded as one ternary operation.
-
-
-
-
-    213) NaN arguments are treated as missing data: if one argument is a NaN and the other numeric, then the
-         fmax functions choose the numeric value. See <a href="#F.9.9.2">F.9.9.2</a>.
-    214) The fmin functions are analogous to the fmax functions in their treatment of NaNs.
-
-[<a name="p239" href="#p239">page 239</a>] (<a href="#Contents">Contents</a>)
-
-<a name="7.12.14" href="#7.12.14"><b>    7.12.14 Comparison macros</b></a>
-1   The relational and equality operators support the usual mathematical relationships
-    between numeric values. For any ordered pair of numeric values exactly one of the
-    relationships -- less, greater, and equal -- is true. Relational operators may raise the
-    ''invalid'' floating-point exception when argument values are NaNs. For a NaN and a
-    numeric value, or for two NaNs, just the unordered relationship is true.215) The following
-    subclauses provide macros that are quiet (non floating-point exception raising) versions
-    of the relational operators, and other comparison macros that facilitate writing efficient
-    code that accounts for NaNs without suffering the ''invalid'' floating-point exception. In
-    the synopses in this subclause, real-floating indicates that the argument shall be an
-    expression of real floating type.
-<a name="7.12.14.1" href="#7.12.14.1"><b>    7.12.14.1 The isgreater macro</b></a>
-    Synopsis
-1            #include <a href="#7.12">&lt;math.h&gt;</a>
-             int isgreater(real-floating x, real-floating y);
-    Description
-2   The isgreater macro determines whether its first argument is greater than its second
-    argument. The value of isgreater(x, y) is always equal to (x) &gt; (y); however,
-    unlike (x) &gt; (y), isgreater(x, y) does not raise the ''invalid'' floating-point
-    exception when x and y are unordered.
-    Returns
-3   The isgreater macro returns the value of (x) &gt; (y).
-<a name="7.12.14.2" href="#7.12.14.2"><b>    7.12.14.2 The isgreaterequal macro</b></a>
-    Synopsis
-1            #include <a href="#7.12">&lt;math.h&gt;</a>
-             int isgreaterequal(real-floating x, real-floating y);
-    Description
-2   The isgreaterequal macro determines whether its first argument is greater than or
-    equal to its second argument. The value of isgreaterequal(x, y) is always equal
-    to (x) &gt;= (y); however, unlike (x) &gt;= (y), isgreaterequal(x, y) does
-    not raise the ''invalid'' floating-point exception when x and y are unordered.
-
-
-
-    215) IEC 60559 requires that the built-in relational operators raise the ''invalid'' floating-point exception if
-         the operands compare unordered, as an error indicator for programs written without consideration of
-         NaNs; the result in these cases is false.
-
-[<a name="p240" href="#p240">page 240</a>] (<a href="#Contents">Contents</a>)
-
-    Returns
-3   The isgreaterequal macro returns the value of (x) &gt;= (y).
-<a name="7.12.14.3" href="#7.12.14.3"><b>    7.12.14.3 The isless macro</b></a>
-    Synopsis
-1          #include <a href="#7.12">&lt;math.h&gt;</a>
-           int isless(real-floating x, real-floating y);
-    Description
-2   The isless macro determines whether its first argument is less than its second
-    argument. The value of isless(x, y) is always equal to (x) &lt; (y); however,
-    unlike (x) &lt; (y), isless(x, y) does not raise the ''invalid'' floating-point
-    exception when x and y are unordered.
-    Returns
-3   The isless macro returns the value of (x) &lt; (y).
-<a name="7.12.14.4" href="#7.12.14.4"><b>    7.12.14.4 The islessequal macro</b></a>
-    Synopsis
-1          #include <a href="#7.12">&lt;math.h&gt;</a>
-           int islessequal(real-floating x, real-floating y);
-    Description
-2   The islessequal macro determines whether its first argument is less than or equal to
-    its second argument. The value of islessequal(x, y) is always equal to
-    (x) &lt;= (y); however, unlike (x) &lt;= (y), islessequal(x, y) does not raise
-    the ''invalid'' floating-point exception when x and y are unordered.
-    Returns
-3   The islessequal macro returns the value of (x) &lt;= (y).
-<a name="7.12.14.5" href="#7.12.14.5"><b>    7.12.14.5 The islessgreater macro</b></a>
-    Synopsis
-1          #include <a href="#7.12">&lt;math.h&gt;</a>
-           int islessgreater(real-floating x, real-floating y);
-    Description
-2   The islessgreater macro determines whether its first argument is less than or
-    greater than its second argument. The islessgreater(x, y) macro is similar to
-    (x) &lt; (y) || (x) &gt; (y); however, islessgreater(x, y) does not raise
-    the ''invalid'' floating-point exception when x and y are unordered (nor does it evaluate x
-    and y twice).
-[<a name="p241" href="#p241">page 241</a>] (<a href="#Contents">Contents</a>)
-
-    Returns
-3   The islessgreater macro returns the value of (x) &lt; (y) || (x) &gt; (y).
-<a name="7.12.14.6" href="#7.12.14.6"><b>    7.12.14.6 The isunordered macro</b></a>
-    Synopsis
-1         #include <a href="#7.12">&lt;math.h&gt;</a>
-          int isunordered(real-floating x, real-floating y);
-    Description
-2   The isunordered macro determines whether its arguments are unordered.
-    Returns
-3   The isunordered macro returns 1 if its arguments are unordered and 0 otherwise.
-
-
-
-
-[<a name="p242" href="#p242">page 242</a>] (<a href="#Contents">Contents</a>)
-
-<a name="7.13" href="#7.13"><b>    7.13 Nonlocal jumps &lt;setjmp.h&gt;</b></a>
-1   The header <a href="#7.13">&lt;setjmp.h&gt;</a> defines the macro setjmp, and declares one function and
-    one type, for bypassing the normal function call and return discipline.216)
-2   The type declared is
-            jmp_buf
-    which is an array type suitable for holding the information needed to restore a calling
-    environment. The environment of a call to the setjmp macro consists of information
-    sufficient for a call to the longjmp function to return execution to the correct block and
-    invocation of that block, were it called recursively. It does not include the state of the
-    floating-point status flags, of open files, or of any other component of the abstract
-    machine.
-3   It is unspecified whether setjmp is a macro or an identifier declared with external
-    linkage. If a macro definition is suppressed in order to access an actual function, or a
-    program defines an external identifier with the name setjmp, the behavior is undefined.
-<a name="7.13.1" href="#7.13.1"><b>    7.13.1 Save calling environment</b></a>
-<a name="7.13.1.1" href="#7.13.1.1"><b>    7.13.1.1 The setjmp macro</b></a>
-    Synopsis
-1           #include <a href="#7.13">&lt;setjmp.h&gt;</a>
-            int setjmp(jmp_buf env);
-    Description
-2   The setjmp macro saves its calling environment in its jmp_buf argument for later use
-    by the longjmp function.
-    Returns
-3   If the return is from a direct invocation, the setjmp macro returns the value zero. If the
-    return is from a call to the longjmp function, the setjmp macro returns a nonzero
-    value.
-    Environmental limits
-4   An invocation of the setjmp macro shall appear only in one of the following contexts:
-    -- the entire controlling expression of a selection or iteration statement;
-    -- one operand of a relational or equality operator with the other operand an integer
-      constant expression, with the resulting expression being the entire controlling
-
-
-    216) These functions are useful for dealing with unusual conditions encountered in a low-level function of
-         a program.
-
-[<a name="p243" href="#p243">page 243</a>] (<a href="#Contents">Contents</a>)
-
-        expression of a selection or iteration statement;
-    -- the operand of a unary ! operator with the resulting expression being the entire
-      controlling expression of a selection or iteration statement; or
-    -- the entire expression of an expression statement (possibly cast to void).
-5   If the invocation appears in any other context, the behavior is undefined.
-<a name="7.13.2" href="#7.13.2"><b>    7.13.2 Restore calling environment</b></a>
-<a name="7.13.2.1" href="#7.13.2.1"><b>    7.13.2.1 The longjmp function</b></a>
-    Synopsis
-1            #include <a href="#7.13">&lt;setjmp.h&gt;</a>
-             void longjmp(jmp_buf env, int val);
-    Description
-2   The longjmp function restores the environment saved by the most recent invocation of
-    the setjmp macro in the same invocation of the program with the corresponding
-    jmp_buf argument. If there has been no such invocation, or if the function containing
-    the invocation of the setjmp macro has terminated execution217) in the interim, or if the
-    invocation of the setjmp macro was within the scope of an identifier with variably
-    modified type and execution has left that scope in the interim, the behavior is undefined.
-3   All accessible objects have values, and all other components of the abstract machine218)
-    have state, as of the time the longjmp function was called, except that the values of
-    objects of automatic storage duration that are local to the function containing the
-    invocation of the corresponding setjmp macro that do not have volatile-qualified type
-    and have been changed between the setjmp invocation and longjmp call are
-    indeterminate.
-    Returns
-4   After longjmp is completed, program execution continues as if the corresponding
-    invocation of the setjmp macro had just returned the value specified by val. The
-    longjmp function cannot cause the setjmp macro to return the value 0; if val is 0,
-    the setjmp macro returns the value 1.
-5   EXAMPLE The longjmp function that returns control back to the point of the setjmp invocation
-    might cause memory associated with a variable length array object to be squandered.
-
-
-
-
-    217) For example, by executing a return statement or because another longjmp call has caused a
-         transfer to a setjmp invocation in a function earlier in the set of nested calls.
-    218) This includes, but is not limited to, the floating-point status flags and the state of open files.
-
-[<a name="p244" href="#p244">page 244</a>] (<a href="#Contents">Contents</a>)
-
-       #include <a href="#7.13">&lt;setjmp.h&gt;</a>
-       jmp_buf buf;
-       void g(int n);
-       void h(int n);
-       int n = 6;
-       void f(void)
-       {
-             int x[n];          // valid: f is not terminated
-             setjmp(buf);
-             g(n);
-       }
-       void g(int n)
-       {
-             int a[n];          // a may remain allocated
-             h(n);
-       }
-       void h(int n)
-       {
-             int b[n];          // b may remain allocated
-             longjmp(buf, 2);   // might cause memory loss
-       }
-
-
-
-
-[<a name="p245" href="#p245">page 245</a>] (<a href="#Contents">Contents</a>)
-
-<a name="7.14" href="#7.14"><b>    7.14 Signal handling &lt;signal.h&gt;</b></a>
-1   The header <a href="#7.14">&lt;signal.h&gt;</a> declares a type and two functions and defines several macros,
-    for handling various signals (conditions that may be reported during program execution).
-2   The type defined is
-            sig_atomic_t
-    which is the (possibly volatile-qualified) integer type of an object that can be accessed as
-    an atomic entity, even in the presence of asynchronous interrupts.
-3   The macros defined are
-            SIG_DFL
-            SIG_ERR
-            SIG_IGN
-    which expand to constant expressions with distinct values that have type compatible with
-    the second argument to, and the return value of, the signal function, and whose values
-    compare unequal to the address of any declarable function; and the following, which
-    expand to positive integer constant expressions with type int and distinct values that are
-    the signal numbers, each corresponding to the specified condition:
-            SIGABRT abnormal termination, such as is initiated by the abort function
-            SIGFPE         an erroneous arithmetic operation, such as zero divide or an operation
-                           resulting in overflow
-            SIGILL         detection of an invalid function image, such as an invalid instruction
-            SIGINT         receipt of an interactive attention signal
-            SIGSEGV an invalid access to storage
-            SIGTERM a termination request sent to the program
-4   An implementation need not generate any of these signals, except as a result of explicit
-    calls to the raise function. Additional signals and pointers to undeclarable functions,
-    with macro definitions beginning, respectively, with the letters SIG and an uppercase
-    letter or with SIG_ and an uppercase letter,219) may also be specified by the
-    implementation. The complete set of signals, their semantics, and their default handling
-    is implementation-defined; all signal numbers shall be positive.
-
-
-
-
-    219) See ''future library directions'' (<a href="#7.26.9">7.26.9</a>). The names of the signal numbers reflect the following terms
-         (respectively): abort, floating-point exception, illegal instruction, interrupt, segmentation violation,
-         and termination.
-
-[<a name="p246" href="#p246">page 246</a>] (<a href="#Contents">Contents</a>)
-
-<a name="7.14.1" href="#7.14.1"><b>    7.14.1 Specify signal handling</b></a>
-<a name="7.14.1.1" href="#7.14.1.1"><b>    7.14.1.1 The signal function</b></a>
-    Synopsis
-1           #include <a href="#7.14">&lt;signal.h&gt;</a>
-            void (*signal(int sig, void (*func)(int)))(int);
-    Description
-2   The signal function chooses one of three ways in which receipt of the signal number
-    sig is to be subsequently handled. If the value of func is SIG_DFL, default handling
-    for that signal will occur. If the value of func is SIG_IGN, the signal will be ignored.
-    Otherwise, func shall point to a function to be called when that signal occurs. An
-    invocation of such a function because of a signal, or (recursively) of any further functions
-    called by that invocation (other than functions in the standard library), is called a signal
-    handler.
-3   When a signal occurs and func points to a function, it is implementation-defined
-    whether the equivalent of signal(sig, SIG_DFL); is executed or the
-    implementation prevents some implementation-defined set of signals (at least including
-    sig) from occurring until the current signal handling has completed; in the case of
-    SIGILL, the implementation may alternatively define that no action is taken. Then the
-    equivalent of (*func)(sig); is executed. If and when the function returns, if the
-    value of sig is SIGFPE, SIGILL, SIGSEGV, or any other implementation-defined
-    value corresponding to a computational exception, the behavior is undefined; otherwise
-    the program will resume execution at the point it was interrupted.
-4   If the signal occurs as the result of calling the abort or raise function, the signal
-    handler shall not call the raise function.
-5   If the signal occurs other than as the result of calling the abort or raise function, the
-    behavior is undefined if the signal handler refers to any object with static storage duration
-    other than by assigning a value to an object declared as volatile sig_atomic_t, or
-    the signal handler calls any function in the standard library other than the abort
-    function, the _Exit function, or the signal function with the first argument equal to
-    the signal number corresponding to the signal that caused the invocation of the handler.
-    Furthermore, if such a call to the signal function results in a SIG_ERR return, the
-    value of errno is indeterminate.220)
-6   At program startup, the equivalent of
-            signal(sig, SIG_IGN);
-
-
-    220) If any signal is generated by an asynchronous signal handler, the behavior is undefined.
-
-[<a name="p247" href="#p247">page 247</a>] (<a href="#Contents">Contents</a>)
-
-    may be executed for some signals selected in an implementation-defined manner; the
-    equivalent of
-           signal(sig, SIG_DFL);
-    is executed for all other signals defined by the implementation.
-7   The implementation shall behave as if no library function calls the signal function.
-    Returns
-8   If the request can be honored, the signal function returns the value of func for the
-    most recent successful call to signal for the specified signal sig. Otherwise, a value of
-    SIG_ERR is returned and a positive value is stored in errno.
-    Forward references: the abort function (<a href="#7.20.4.1">7.20.4.1</a>), the exit function (<a href="#7.20.4.3">7.20.4.3</a>), the
-    _Exit function (<a href="#7.20.4.4">7.20.4.4</a>).
-<a name="7.14.2" href="#7.14.2"><b>    7.14.2 Send signal</b></a>
-<a name="7.14.2.1" href="#7.14.2.1"><b>    7.14.2.1 The raise function</b></a>
-    Synopsis
-1          #include <a href="#7.14">&lt;signal.h&gt;</a>
-           int raise(int sig);
-    Description
-2   The raise function carries out the actions described in <a href="#7.14.1.1">7.14.1.1</a> for the signal sig. If a
-    signal handler is called, the raise function shall not return until after the signal handler
-    does.
-    Returns
-3   The raise function returns zero if successful, nonzero if unsuccessful.
-
-
-
-
-[<a name="p248" href="#p248">page 248</a>] (<a href="#Contents">Contents</a>)
-
-<a name="7.15" href="#7.15"><b>    7.15 Variable arguments &lt;stdarg.h&gt;</b></a>
-1   The header <a href="#7.15">&lt;stdarg.h&gt;</a> declares a type and defines four macros, for advancing
-    through a list of arguments whose number and types are not known to the called function
-    when it is translated.
-2   A function may be called with a variable number of arguments of varying types. As
-    described in <a href="#6.9.1">6.9.1</a>, its parameter list contains one or more parameters. The rightmost
-    parameter plays a special role in the access mechanism, and will be designated parmN in
-    this description.
-3   The type declared is
-            va_list
-    which is an object type suitable for holding information needed by the macros
-    va_start, va_arg, va_end, and va_copy. If access to the varying arguments is
-    desired, the called function shall declare an object (generally referred to as ap in this
-    subclause) having type va_list. The object ap may be passed as an argument to
-    another function; if that function invokes the va_arg macro with parameter ap, the
-    value of ap in the calling function is indeterminate and shall be passed to the va_end
-    macro prior to any further reference to ap.221)
-<a name="7.15.1" href="#7.15.1"><b>    7.15.1 Variable argument list access macros</b></a>
-1   The va_start and va_arg macros described in this subclause shall be implemented
-    as macros, not functions. It is unspecified whether va_copy and va_end are macros or
-    identifiers declared with external linkage. If a macro definition is suppressed in order to
-    access an actual function, or a program defines an external identifier with the same name,
-    the behavior is undefined. Each invocation of the va_start and va_copy macros
-    shall be matched by a corresponding invocation of the va_end macro in the same
-    function.
-<a name="7.15.1.1" href="#7.15.1.1"><b>    7.15.1.1 The va_arg macro</b></a>
-    Synopsis
-1           #include <a href="#7.15">&lt;stdarg.h&gt;</a>
-            type va_arg(va_list ap, type);
-    Description
-2   The va_arg macro expands to an expression that has the specified type and the value of
-    the next argument in the call. The parameter ap shall have been initialized by the
-    va_start or va_copy macro (without an intervening invocation of the va_end
-
-    221) It is permitted to create a pointer to a va_list and pass that pointer to another function, in which
-         case the original function may make further use of the original list after the other function returns.
-
-[<a name="p249" href="#p249">page 249</a>] (<a href="#Contents">Contents</a>)
-
-    macro for the same ap). Each invocation of the va_arg macro modifies ap so that the
-    values of successive arguments are returned in turn. The parameter type shall be a type
-    name specified such that the type of a pointer to an object that has the specified type can
-    be obtained simply by postfixing a * to type. If there is no actual next argument, or if
-    type is not compatible with the type of the actual next argument (as promoted according
-    to the default argument promotions), the behavior is undefined, except for the following
-    cases:
-    -- one type is a signed integer type, the other type is the corresponding unsigned integer
-      type, and the value is representable in both types;
-    -- one type is pointer to void and the other is a pointer to a character type.
-    Returns
-3   The first invocation of the va_arg macro after that of the va_start macro returns the
-    value of the argument after that specified by parmN . Successive invocations return the
-    values of the remaining arguments in succession.
-<a name="7.15.1.2" href="#7.15.1.2"><b>    7.15.1.2 The va_copy macro</b></a>
-    Synopsis
-1          #include <a href="#7.15">&lt;stdarg.h&gt;</a>
-           void va_copy(va_list dest, va_list src);
-    Description
-2   The va_copy macro initializes dest as a copy of src, as if the va_start macro had
-    been applied to dest followed by the same sequence of uses of the va_arg macro as
-    had previously been used to reach the present state of src. Neither the va_copy nor
-    va_start macro shall be invoked to reinitialize dest without an intervening
-    invocation of the va_end macro for the same dest.
-    Returns
-3   The va_copy macro returns no value.
-<a name="7.15.1.3" href="#7.15.1.3"><b>    7.15.1.3 The va_end macro</b></a>
-    Synopsis
-1          #include <a href="#7.15">&lt;stdarg.h&gt;</a>
-           void va_end(va_list ap);
-    Description
-2   The va_end macro facilitates a normal return from the function whose variable
-    argument list was referred to by the expansion of the va_start macro, or the function
-    containing the expansion of the va_copy macro, that initialized the va_list ap. The
-    va_end macro may modify ap so that it is no longer usable (without being reinitialized
-
-[<a name="p250" href="#p250">page 250</a>] (<a href="#Contents">Contents</a>)
-
-    by the va_start or va_copy macro). If there is no corresponding invocation of the
-    va_start or va_copy macro, or if the va_end macro is not invoked before the
-    return, the behavior is undefined.
-    Returns
-3   The va_end macro returns no value.
-<a name="7.15.1.4" href="#7.15.1.4"><b>    7.15.1.4 The va_start macro</b></a>
-    Synopsis
-1           #include <a href="#7.15">&lt;stdarg.h&gt;</a>
-            void va_start(va_list ap, parmN);
-    Description
-2   The va_start macro shall be invoked before any access to the unnamed arguments.
-3   The va_start macro initializes ap for subsequent use by the va_arg and va_end
-    macros. Neither the va_start nor va_copy macro shall be invoked to reinitialize ap
-    without an intervening invocation of the va_end macro for the same ap.
-4   The parameter parmN is the identifier of the rightmost parameter in the variable
-    parameter list in the function definition (the one just before the , ...). If the parameter
-    parmN is declared with the register storage class, with a function or array type, or
-    with a type that is not compatible with the type that results after application of the default
-    argument promotions, the behavior is undefined.
-    Returns
-5   The va_start macro returns no value.
-6   EXAMPLE 1 The function f1 gathers into an array a list of arguments that are pointers to strings (but not
-    more than MAXARGS arguments), then passes the array as a single argument to function f2. The number of
-    pointers is specified by the first argument to f1.
-            #include <a href="#7.15">&lt;stdarg.h&gt;</a>
-            #define MAXARGS   31
-            void f1(int n_ptrs, ...)
-            {
-                  va_list ap;
-                  char *array[MAXARGS];
-                  int ptr_no = 0;
-
-
-
-
-[<a name="p251" href="#p251">page 251</a>] (<a href="#Contents">Contents</a>)
-
-                      if (n_ptrs &gt; MAXARGS)
-                            n_ptrs = MAXARGS;
-                      va_start(ap, n_ptrs);
-                      while (ptr_no &lt; n_ptrs)
-                            array[ptr_no++] = va_arg(ap, char *);
-                      va_end(ap);
-                      f2(n_ptrs, array);
-             }
-    Each call to f1 is required to have visible the definition of the function or a declaration such as
-             void f1(int, ...);
-
-7   EXAMPLE 2 The function f3 is similar, but saves the status of the variable argument list after the
-    indicated number of arguments; after f2 has been called once with the whole list, the trailing part of the list
-    is gathered again and passed to function f4.
-             #include <a href="#7.15">&lt;stdarg.h&gt;</a>
-             #define MAXARGS 31
-             void f3(int n_ptrs, int f4_after, ...)
-             {
-                   va_list ap, ap_save;
-                   char *array[MAXARGS];
-                   int ptr_no = 0;
-                   if (n_ptrs &gt; MAXARGS)
-                         n_ptrs = MAXARGS;
-                   va_start(ap, f4_after);
-                   while (ptr_no &lt; n_ptrs) {
-                         array[ptr_no++] = va_arg(ap, char *);
-                         if (ptr_no == f4_after)
-                               va_copy(ap_save, ap);
-                   }
-                   va_end(ap);
-                   f2(n_ptrs, array);
-                      // Now process the saved copy.
-                      n_ptrs -= f4_after;
-                      ptr_no = 0;
-                      while (ptr_no &lt; n_ptrs)
-                            array[ptr_no++] = va_arg(ap_save, char *);
-                      va_end(ap_save);
-                      f4(n_ptrs, array);
-             }
-
-
-
-
-[<a name="p252" href="#p252">page 252</a>] (<a href="#Contents">Contents</a>)
-
-<a name="7.16" href="#7.16"><b>    7.16 Boolean type and values &lt;stdbool.h&gt;</b></a>
-1   The header <a href="#7.16">&lt;stdbool.h&gt;</a> defines four macros.
-2   The macro
-             bool
-    expands to _Bool.
-3   The remaining three macros are suitable for use in #if preprocessing directives. They
-    are
-             true
-    which expands to the integer constant 1,
-             false
-    which expands to the integer constant 0, and
-             __bool_true_false_are_defined
-    which expands to the integer constant 1.
-4   Notwithstanding the provisions of <a href="#7.1.3">7.1.3</a>, a program may undefine and perhaps then
-    redefine the macros bool, true, and false.222)
-
-
-
-
-    222) See ''future library directions'' (<a href="#7.26.7">7.26.7</a>).
-
-[<a name="p253" href="#p253">page 253</a>] (<a href="#Contents">Contents</a>)
-
-<a name="7.17" href="#7.17"><b>    7.17 Common definitions &lt;stddef.h&gt;</b></a>
-1   The following types and macros are defined in the standard header <a href="#7.17">&lt;stddef.h&gt;</a>. Some
-    are also defined in other headers, as noted in their respective subclauses.
-2   The types are
-           ptrdiff_t
-    which is the signed integer type of the result of subtracting two pointers;
-           size_t
-    which is the unsigned integer type of the result of the sizeof operator; and
-           wchar_t
-    which is an integer type whose range of values can represent distinct codes for all
-    members of the largest extended character set specified among the supported locales; the
-    null character shall have the code value zero. Each member of the basic character set
-    shall have a code value equal to its value when used as the lone character in an integer
-    character      constant     if     an      implementation      does      not      define
-    __STDC_MB_MIGHT_NEQ_WC__.
-3   The macros are
-           NULL
-    which expands to an implementation-defined null pointer constant; and
-           offsetof(type, member-designator)
-    which expands to an integer constant expression that has type size_t, the value of
-    which is the offset in bytes, to the structure member (designated by member-designator),
-    from the beginning of its structure (designated by type). The type and member designator
-    shall be such that given
-           static type t;
-    then the expression &amp;(t.member-designator) evaluates to an address constant. (If the
-    specified member is a bit-field, the behavior is undefined.)
-    Recommended practice
-4   The types used for size_t and ptrdiff_t should not have an integer conversion rank
-    greater than that of signed long int unless the implementation supports objects
-    large enough to make this necessary.
-    Forward references: localization (<a href="#7.11">7.11</a>).
-
-
-
-
-[<a name="p254" href="#p254">page 254</a>] (<a href="#Contents">Contents</a>)
-
-<a name="7.18" href="#7.18"><b>    7.18 Integer types &lt;stdint.h&gt;</b></a>
-1   The header <a href="#7.18">&lt;stdint.h&gt;</a> declares sets of integer types having specified widths, and
-    defines corresponding sets of macros.223) It also defines macros that specify limits of
-    integer types corresponding to types defined in other standard headers.
-2   Types are defined in the following categories:
-    -- integer types having certain exact widths;
-    -- integer types having at least certain specified widths;
-    -- fastest integer types having at least certain specified widths;
-    -- integer types wide enough to hold pointers to objects;
-    -- integer types having greatest width.
-    (Some of these types may denote the same type.)
-3   Corresponding macros specify limits of the declared types and construct suitable
-    constants.
-4   For each type described herein that the implementation provides,224) <a href="#7.18">&lt;stdint.h&gt;</a> shall
-    declare that typedef name and define the associated macros. Conversely, for each type
-    described herein that the implementation does not provide, <a href="#7.18">&lt;stdint.h&gt;</a> shall not
-    declare that typedef name nor shall it define the associated macros. An implementation
-    shall provide those types described as ''required'', but need not provide any of the others
-    (described as ''optional'').
-<a name="7.18.1" href="#7.18.1"><b>    7.18.1 Integer types</b></a>
-1   When typedef names differing only in the absence or presence of the initial u are defined,
-    they shall denote corresponding signed and unsigned types as described in <a href="#6.2.5">6.2.5</a>; an
-    implementation providing one of these corresponding types shall also provide the other.
-2   In the following descriptions, the symbol N represents an unsigned decimal integer with
-    no leading zeros (e.g., 8 or 24, but not 04 or 048).
-
-
-
-
-    223) See ''future library directions'' (<a href="#7.26.8">7.26.8</a>).
-    224) Some of these types may denote implementation-defined extended integer types.
-
-[<a name="p255" href="#p255">page 255</a>] (<a href="#Contents">Contents</a>)
-
-<a name="7.18.1.1" href="#7.18.1.1"><b>    7.18.1.1 Exact-width integer types</b></a>
-1   The typedef name intN_t designates a signed integer type with width N , no padding
-    bits, and a two's complement representation. Thus, int8_t denotes a signed integer
-    type with a width of exactly 8 bits.
-2   The typedef name uintN_t designates an unsigned integer type with width N . Thus,
-    uint24_t denotes an unsigned integer type with a width of exactly 24 bits.
-3   These types are optional. However, if an implementation provides integer types with
-    widths of 8, 16, 32, or 64 bits, no padding bits, and (for the signed types) that have a
-    two's complement representation, it shall define the corresponding typedef names.
-<a name="7.18.1.2" href="#7.18.1.2"><b>    7.18.1.2 Minimum-width integer types</b></a>
-1   The typedef name int_leastN_t designates a signed integer type with a width of at
-    least N , such that no signed integer type with lesser size has at least the specified width.
-    Thus, int_least32_t denotes a signed integer type with a width of at least 32 bits.
-2   The typedef name uint_leastN_t designates an unsigned integer type with a width
-    of at least N , such that no unsigned integer type with lesser size has at least the specified
-    width. Thus, uint_least16_t denotes an unsigned integer type with a width of at
-    least 16 bits.
-3   The following types are required:
-             int_least8_t                                      uint_least8_t
-             int_least16_t                                     uint_least16_t
-             int_least32_t                                     uint_least32_t
-             int_least64_t                                     uint_least64_t
-    All other types of this form are optional.
-<a name="7.18.1.3" href="#7.18.1.3"><b>    7.18.1.3 Fastest minimum-width integer types</b></a>
-1   Each of the following types designates an integer type that is usually fastest225) to operate
-    with among all integer types that have at least the specified width.
-2   The typedef name int_fastN_t designates the fastest signed integer type with a width
-    of at least N . The typedef name uint_fastN_t designates the fastest unsigned integer
-    type with a width of at least N .
-
-
-
-
-    225) The designated type is not guaranteed to be fastest for all purposes; if the implementation has no clear
-         grounds for choosing one type over another, it will simply pick some integer type satisfying the
-         signedness and width requirements.
-
-[<a name="p256" href="#p256">page 256</a>] (<a href="#Contents">Contents</a>)
-
-3   The following types are required:
-           int_fast8_t                                 uint_fast8_t
-           int_fast16_t                                uint_fast16_t
-           int_fast32_t                                uint_fast32_t
-           int_fast64_t                                uint_fast64_t
-    All other types of this form are optional.
-<a name="7.18.1.4" href="#7.18.1.4"><b>    7.18.1.4 Integer types capable of holding object pointers</b></a>
-1   The following type designates a signed integer type with the property that any valid
-    pointer to void can be converted to this type, then converted back to pointer to void,
-    and the result will compare equal to the original pointer:
-           intptr_t
-    The following type designates an unsigned integer type with the property that any valid
-    pointer to void can be converted to this type, then converted back to pointer to void,
-    and the result will compare equal to the original pointer:
-           uintptr_t
-    These types are optional.
-<a name="7.18.1.5" href="#7.18.1.5"><b>    7.18.1.5 Greatest-width integer types</b></a>
-1   The following type designates a signed integer type capable of representing any value of
-    any signed integer type:
-           intmax_t
-    The following type designates an unsigned integer type capable of representing any value
-    of any unsigned integer type:
-           uintmax_t
-    These types are required.
-<a name="7.18.2" href="#7.18.2"><b>    7.18.2 Limits of specified-width integer types</b></a>
-1   The following object-like macros226) specify the minimum and maximum limits of the
-    types declared in <a href="#7.18">&lt;stdint.h&gt;</a>. Each macro name corresponds to a similar type name in
-    <a href="#7.18.1">7.18.1</a>.
-2   Each instance of any defined macro shall be replaced by a constant expression suitable
-    for use in #if preprocessing directives, and this expression shall have the same type as
-    would an expression that is an object of the corresponding type converted according to
-
-    226) C++ implementations should define these macros only when __STDC_LIMIT_MACROS is defined
-         before <a href="#7.18">&lt;stdint.h&gt;</a> is included.
-
-[<a name="p257" href="#p257">page 257</a>] (<a href="#Contents">Contents</a>)
-
-    the integer promotions. Its implementation-defined value shall be equal to or greater in
-    magnitude (absolute value) than the corresponding value given below, with the same sign,
-    except where stated to be exactly the given value.
-<a name="7.18.2.1" href="#7.18.2.1"><b>    7.18.2.1 Limits of exact-width integer types</b></a>
-1   -- minimum values of exact-width signed integer types
-       INTN_MIN                                    exactly -(2 N -1 )
-    -- maximum values of exact-width signed integer types
-       INTN_MAX                                    exactly 2 N -1 - 1
-    -- maximum values of exact-width unsigned integer types
-       UINTN_MAX                                   exactly 2 N - 1
-<a name="7.18.2.2" href="#7.18.2.2"><b>    7.18.2.2 Limits of minimum-width integer types</b></a>
-1   -- minimum values of minimum-width signed integer types
-       INT_LEASTN_MIN                                      -(2 N -1 - 1)
-    -- maximum values of minimum-width signed integer types
-       INT_LEASTN_MAX                                      2 N -1 - 1
-    -- maximum values of minimum-width unsigned integer types
-       UINT_LEASTN_MAX                                     2N - 1
-<a name="7.18.2.3" href="#7.18.2.3"><b>    7.18.2.3 Limits of fastest minimum-width integer types</b></a>
-1   -- minimum values of fastest minimum-width signed integer types
-       INT_FASTN_MIN                                       -(2 N -1 - 1)
-    -- maximum values of fastest minimum-width signed integer types
-       INT_FASTN_MAX                                       2 N -1 - 1
-    -- maximum values of fastest minimum-width unsigned integer types
-       UINT_FASTN_MAX                                      2N - 1
-<a name="7.18.2.4" href="#7.18.2.4"><b>    7.18.2.4 Limits of integer types capable of holding object pointers</b></a>
-1   -- minimum value of pointer-holding signed integer type
-          INTPTR_MIN                                       -(215 - 1)
-    -- maximum value of pointer-holding signed integer type
-          INTPTR_MAX                                       215 - 1
-
-
-
-[<a name="p258" href="#p258">page 258</a>] (<a href="#Contents">Contents</a>)
-
-    -- maximum value of pointer-holding unsigned integer type
-        UINTPTR_MAX                                                   216 - 1
-<a name="7.18.2.5" href="#7.18.2.5"><b>    7.18.2.5 Limits of greatest-width integer types</b></a>
-1   -- minimum value of greatest-width signed integer type
-        INTMAX_MIN                                                    -(263 - 1)
-    -- maximum value of greatest-width signed integer type
-        INTMAX_MAX                                                    263 - 1
-    -- maximum value of greatest-width unsigned integer type
-        UINTMAX_MAX                                                   264 - 1
-<a name="7.18.3" href="#7.18.3"><b>    7.18.3 Limits of other integer types</b></a>
-1   The following object-like macros227) specify the minimum and maximum limits of
-    integer types corresponding to types defined in other standard headers.
-2   Each instance of these macros shall be replaced by a constant expression suitable for use
-    in #if preprocessing directives, and this expression shall have the same type as would an
-    expression that is an object of the corresponding type converted according to the integer
-    promotions. Its implementation-defined value shall be equal to or greater in magnitude
-    (absolute value) than the corresponding value given below, with the same sign. An
-    implementation shall define only the macros corresponding to those typedef names it
-    actually provides.228)
-    -- limits of ptrdiff_t
-        PTRDIFF_MIN                                                 -65535
-        PTRDIFF_MAX                                                 +65535
-    -- limits of sig_atomic_t
-        SIG_ATOMIC_MIN                                              see below
-        SIG_ATOMIC_MAX                                              see below
-    -- limit of size_t
-        SIZE_MAX                                                      65535
-    -- limits of wchar_t
-
-
-
-    227) C++ implementations should define these macros only when __STDC_LIMIT_MACROS is defined
-         before <a href="#7.18">&lt;stdint.h&gt;</a> is included.
-    228) A freestanding implementation need not provide all of these types.
-
-[<a name="p259" href="#p259">page 259</a>] (<a href="#Contents">Contents</a>)
-
-       WCHAR_MIN                                              see below
-       WCHAR_MAX                                              see below
-    -- limits of wint_t
-       WINT_MIN                                               see below
-       WINT_MAX                                               see below
-3   If sig_atomic_t (see <a href="#7.14">7.14</a>) is defined as a signed integer type, the value of
-    SIG_ATOMIC_MIN shall be no greater than -127 and the value of SIG_ATOMIC_MAX
-    shall be no less than 127; otherwise, sig_atomic_t is defined as an unsigned integer
-    type, and the value of SIG_ATOMIC_MIN shall be 0 and the value of
-    SIG_ATOMIC_MAX shall be no less than 255.
-4   If wchar_t (see <a href="#7.17">7.17</a>) is defined as a signed integer type, the value of WCHAR_MIN
-    shall be no greater than -127 and the value of WCHAR_MAX shall be no less than 127;
-    otherwise, wchar_t is defined as an unsigned integer type, and the value of
-    WCHAR_MIN shall be 0 and the value of WCHAR_MAX shall be no less than 255.229)
-5   If wint_t (see <a href="#7.24">7.24</a>) is defined as a signed integer type, the value of WINT_MIN shall
-    be no greater than -32767 and the value of WINT_MAX shall be no less than 32767;
-    otherwise, wint_t is defined as an unsigned integer type, and the value of WINT_MIN
-    shall be 0 and the value of WINT_MAX shall be no less than 65535.
-<a name="7.18.4" href="#7.18.4"><b>    7.18.4 Macros for integer constants</b></a>
-1   The following function-like macros230) expand to integer constants suitable for
-    initializing objects that have integer types corresponding to types defined in
-    <a href="#7.18">&lt;stdint.h&gt;</a>. Each macro name corresponds to a similar type name in <a href="#7.18.1.2">7.18.1.2</a> or
-    <a href="#7.18.1.5">7.18.1.5</a>.
-2   The argument in any instance of these macros shall be an unsuffixed integer constant (as
-    defined in <a href="#6.4.4.1">6.4.4.1</a>) with a value that does not exceed the limits for the corresponding type.
-3   Each invocation of one of these macros shall expand to an integer constant expression
-    suitable for use in #if preprocessing directives. The type of the expression shall have
-    the same type as would an expression of the corresponding type converted according to
-    the integer promotions. The value of the expression shall be that of the argument.
-
-
-
-
-    229) The values WCHAR_MIN and WCHAR_MAX do not necessarily correspond to members of the extended
-         character set.
-    230) C++ implementations should define these macros only when __STDC_CONSTANT_MACROS is
-         defined before <a href="#7.18">&lt;stdint.h&gt;</a> is included.
-
-[<a name="p260" href="#p260">page 260</a>] (<a href="#Contents">Contents</a>)
-
-<a name="7.18.4.1" href="#7.18.4.1"><b>    7.18.4.1 Macros for minimum-width integer constants</b></a>
-1   The macro INTN_C(value) shall expand to an integer constant expression
-    corresponding to the type int_leastN_t. The macro UINTN_C(value) shall expand
-    to an integer constant expression corresponding to the type uint_leastN_t. For
-    example, if uint_least64_t is a name for the type unsigned long long int,
-    then UINT64_C(0x123) might expand to the integer constant 0x123ULL.
-<a name="7.18.4.2" href="#7.18.4.2"><b>    7.18.4.2 Macros for greatest-width integer constants</b></a>
-1   The following macro expands to an integer constant expression having the value specified
-    by its argument and the type intmax_t:
-           INTMAX_C(value)
-    The following macro expands to an integer constant expression having the value specified
-    by its argument and the type uintmax_t:
-           UINTMAX_C(value)
-
-
-
-
-[<a name="p261" href="#p261">page 261</a>] (<a href="#Contents">Contents</a>)
-
-<a name="7.19" href="#7.19"><b>    7.19 Input/output &lt;stdio.h&gt;</b></a>
-<a name="7.19.1" href="#7.19.1"><b>    7.19.1 Introduction</b></a>
-1   The header <a href="#7.19">&lt;stdio.h&gt;</a> declares three types, several macros, and many functions for
-    performing input and output.
-2   The types declared are size_t (described in <a href="#7.17">7.17</a>);
-           FILE
-    which is an object type capable of recording all the information needed to control a
-    stream, including its file position indicator, a pointer to its associated buffer (if any), an
-    error indicator that records whether a read/write error has occurred, and an end-of-file
-    indicator that records whether the end of the file has been reached; and
-           fpos_t
-    which is an object type other than an array type capable of recording all the information
-    needed to specify uniquely every position within a file.
-3   The macros are NULL (described in <a href="#7.17">7.17</a>);
-           _IOFBF
-           _IOLBF
-           _IONBF
-    which expand to integer constant expressions with distinct values, suitable for use as the
-    third argument to the setvbuf function;
-           BUFSIZ
-    which expands to an integer constant expression that is the size of the buffer used by the
-    setbuf function;
-           EOF
-    which expands to an integer constant expression, with type int and a negative value, that
-    is returned by several functions to indicate end-of-file, that is, no more input from a
-    stream;
-           FOPEN_MAX
-    which expands to an integer constant expression that is the minimum number of files that
-    the implementation guarantees can be open simultaneously;
-           FILENAME_MAX
-    which expands to an integer constant expression that is the size needed for an array of
-    char large enough to hold the longest file name string that the implementation
-
-
-
-[<a name="p262" href="#p262">page 262</a>] (<a href="#Contents">Contents</a>)
-
-    guarantees can be opened;231)
-            L_tmpnam
-    which expands to an integer constant expression that is the size needed for an array of
-    char large enough to hold a temporary file name string generated by the tmpnam
-    function;
-            SEEK_CUR
-            SEEK_END
-            SEEK_SET
-    which expand to integer constant expressions with distinct values, suitable for use as the
-    third argument to the fseek function;
-            TMP_MAX
-    which expands to an integer constant expression that is the maximum number of unique
-    file names that can be generated by the tmpnam function;
-            stderr
-            stdin
-            stdout
-    which are expressions of type ''pointer to FILE'' that point to the FILE objects
-    associated, respectively, with the standard error, input, and output streams.
-4   The header <a href="#7.24">&lt;wchar.h&gt;</a> declares a number of functions useful for wide character input
-    and output. The wide character input/output functions described in that subclause
-    provide operations analogous to most of those described here, except that the
-    fundamental units internal to the program are wide characters. The external
-    representation (in the file) is a sequence of ''generalized'' multibyte characters, as
-    described further in <a href="#7.19.3">7.19.3</a>.
-5   The input/output functions are given the following collective terms:
-    -- The wide character input functions -- those functions described in <a href="#7.24">7.24</a> that perform
-      input into wide characters and wide strings: fgetwc, fgetws, getwc, getwchar,
-      fwscanf, wscanf, vfwscanf, and vwscanf.
-    -- The wide character output functions -- those functions described in <a href="#7.24">7.24</a> that perform
-      output from wide characters and wide strings: fputwc, fputws, putwc,
-      putwchar, fwprintf, wprintf, vfwprintf, and vwprintf.
-
-
-    231) If the implementation imposes no practical limit on the length of file name strings, the value of
-         FILENAME_MAX should instead be the recommended size of an array intended to hold a file name
-         string. Of course, file name string contents are subject to other system-specific constraints; therefore
-         all possible strings of length FILENAME_MAX cannot be expected to be opened successfully.
-
-[<a name="p263" href="#p263">page 263</a>] (<a href="#Contents">Contents</a>)
-
-    -- The wide character input/output functions -- the union of the ungetwc function, the
-      wide character input functions, and the wide character output functions.
-    -- The byte input/output functions -- those functions described in this subclause that
-      perform input/output: fgetc, fgets, fprintf, fputc, fputs, fread,
-      fscanf, fwrite, getc, getchar, gets, printf, putc, putchar, puts,
-      scanf, ungetc, vfprintf, vfscanf, vprintf, and vscanf.
-    Forward references: files (<a href="#7.19.3">7.19.3</a>), the fseek function (<a href="#7.19.9.2">7.19.9.2</a>), streams (<a href="#7.19.2">7.19.2</a>), the
-    tmpnam function (<a href="#7.19.4.4">7.19.4.4</a>), <a href="#7.24">&lt;wchar.h&gt;</a> (<a href="#7.24">7.24</a>).
-<a name="7.19.2" href="#7.19.2"><b>    7.19.2 Streams</b></a>
-1   Input and output, whether to or from physical devices such as terminals and tape drives,
-    or whether to or from files supported on structured storage devices, are mapped into
-    logical data streams, whose properties are more uniform than their various inputs and
-    outputs. Two forms of mapping are supported, for text streams and for binary
-    streams.232)
-2   A text stream is an ordered sequence of characters composed into lines, each line
-    consisting of zero or more characters plus a terminating new-line character. Whether the
-    last line requires a terminating new-line character is implementation-defined. Characters
-    may have to be added, altered, or deleted on input and output to conform to differing
-    conventions for representing text in the host environment. Thus, there need not be a one-
-    to-one correspondence between the characters in a stream and those in the external
-    representation. Data read in from a text stream will necessarily compare equal to the data
-    that were earlier written out to that stream only if: the data consist only of printing
-    characters and the control characters horizontal tab and new-line; no new-line character is
-    immediately preceded by space characters; and the last character is a new-line character.
-    Whether space characters that are written out immediately before a new-line character
-    appear when read in is implementation-defined.
-3   A binary stream is an ordered sequence of characters that can transparently record
-    internal data. Data read in from a binary stream shall compare equal to the data that were
-    earlier written out to that stream, under the same implementation. Such a stream may,
-    however, have an implementation-defined number of null characters appended to the end
-    of the stream.
-4   Each stream has an orientation. After a stream is associated with an external file, but
-    before any operations are performed on it, the stream is without orientation. Once a wide
-    character input/output function has been applied to a stream without orientation, the
-
-
-    232) An implementation need not distinguish between text streams and binary streams. In such an
-         implementation, there need be no new-line characters in a text stream nor any limit to the length of a
-         line.
-
-[<a name="p264" href="#p264">page 264</a>] (<a href="#Contents">Contents</a>)
-
-    stream becomes a wide-oriented stream. Similarly, once a byte input/output function has
-    been applied to a stream without orientation, the stream becomes a byte-oriented stream.
-    Only a call to the freopen function or the fwide function can otherwise alter the
-    orientation of a stream. (A successful call to freopen removes any orientation.)233)
-5   Byte input/output functions shall not be applied to a wide-oriented stream and wide
-    character input/output functions shall not be applied to a byte-oriented stream. The
-    remaining stream operations do not affect, and are not affected by, a stream's orientation,
-    except for the following additional restrictions:
-    -- Binary wide-oriented streams have the file-positioning restrictions ascribed to both
-      text and binary streams.
-    -- For wide-oriented streams, after a successful call to a file-positioning function that
-      leaves the file position indicator prior to the end-of-file, a wide character output
-      function can overwrite a partial multibyte character; any file contents beyond the
-      byte(s) written are henceforth indeterminate.
-6   Each wide-oriented stream has an associated mbstate_t object that stores the current
-    parse state of the stream. A successful call to fgetpos stores a representation of the
-    value of this mbstate_t object as part of the value of the fpos_t object. A later
-    successful call to fsetpos using the same stored fpos_t value restores the value of
-    the associated mbstate_t object as well as the position within the controlled stream.
-    Environmental limits
-7   An implementation shall support text files with lines containing at least 254 characters,
-    including the terminating new-line character. The value of the macro BUFSIZ shall be at
-    least 256.
-    Forward references: the freopen function (<a href="#7.19.5.4">7.19.5.4</a>), the fwide function (<a href="#7.24.3.5">7.24.3.5</a>),
-    mbstate_t (<a href="#7.25.1">7.25.1</a>), the fgetpos function (<a href="#7.19.9.1">7.19.9.1</a>), the fsetpos function
-    (<a href="#7.19.9.3">7.19.9.3</a>).
-
-
-
-
-    233) The three predefined streams stdin, stdout, and stderr are unoriented at program startup.
-
-[<a name="p265" href="#p265">page 265</a>] (<a href="#Contents">Contents</a>)
-
-<a name="7.19.3" href="#7.19.3"><b>    7.19.3 Files</b></a>
-1   A stream is associated with an external file (which may be a physical device) by opening
-    a file, which may involve creating a new file. Creating an existing file causes its former
-    contents to be discarded, if necessary. If a file can support positioning requests (such as a
-    disk file, as opposed to a terminal), then a file position indicator associated with the
-    stream is positioned at the start (character number zero) of the file, unless the file is
-    opened with append mode in which case it is implementation-defined whether the file
-    position indicator is initially positioned at the beginning or the end of the file. The file
-    position indicator is maintained by subsequent reads, writes, and positioning requests, to
-    facilitate an orderly progression through the file.
-2   Binary files are not truncated, except as defined in <a href="#7.19.5.3">7.19.5.3</a>. Whether a write on a text
-    stream causes the associated file to be truncated beyond that point is implementation-
-    defined.
-3   When a stream is unbuffered, characters are intended to appear from the source or at the
-    destination as soon as possible. Otherwise characters may be accumulated and
-    transmitted to or from the host environment as a block. When a stream is fully buffered,
-    characters are intended to be transmitted to or from the host environment as a block when
-    a buffer is filled. When a stream is line buffered, characters are intended to be
-    transmitted to or from the host environment as a block when a new-line character is
-    encountered. Furthermore, characters are intended to be transmitted as a block to the host
-    environment when a buffer is filled, when input is requested on an unbuffered stream, or
-    when input is requested on a line buffered stream that requires the transmission of
-    characters from the host environment. Support for these characteristics is
-    implementation-defined, and may be affected via the setbuf and setvbuf functions.
-4   A file may be disassociated from a controlling stream by closing the file. Output streams
-    are flushed (any unwritten buffer contents are transmitted to the host environment) before
-    the stream is disassociated from the file. The value of a pointer to a FILE object is
-    indeterminate after the associated file is closed (including the standard text streams).
-    Whether a file of zero length (on which no characters have been written by an output
-    stream) actually exists is implementation-defined.
-5   The file may be subsequently reopened, by the same or another program execution, and
-    its contents reclaimed or modified (if it can be repositioned at its start). If the main
-    function returns to its original caller, or if the exit function is called, all open files are
-    closed (hence all output streams are flushed) before program termination. Other paths to
-    program termination, such as calling the abort function, need not close all files
-    properly.
-6   The address of the FILE object used to control a stream may be significant; a copy of a
-    FILE object need not serve in place of the original.
-
-[<a name="p266" href="#p266">page 266</a>] (<a href="#Contents">Contents</a>)
-
-7    At program startup, three text streams are predefined and need not be opened explicitly
-     -- standard input (for reading conventional input), standard output (for writing
-     conventional output), and standard error (for writing diagnostic output). As initially
-     opened, the standard error stream is not fully buffered; the standard input and standard
-     output streams are fully buffered if and only if the stream can be determined not to refer
-     to an interactive device.
-8    Functions that open additional (nontemporary) files require a file name, which is a string.
-     The rules for composing valid file names are implementation-defined. Whether the same
-     file can be simultaneously open multiple times is also implementation-defined.
-9    Although both text and binary wide-oriented streams are conceptually sequences of wide
-     characters, the external file associated with a wide-oriented stream is a sequence of
-     multibyte characters, generalized as follows:
-     -- Multibyte encodings within files may contain embedded null bytes (unlike multibyte
-       encodings valid for use internal to the program).
-     -- A file need not begin nor end in the initial shift state.234)
-10   Moreover, the encodings used for multibyte characters may differ among files. Both the
-     nature and choice of such encodings are implementation-defined.
-11   The wide character input functions read multibyte characters from the stream and convert
-     them to wide characters as if they were read by successive calls to the fgetwc function.
-     Each conversion occurs as if by a call to the mbrtowc function, with the conversion state
-     described by the stream's own mbstate_t object. The byte input functions read
-     characters from the stream as if by successive calls to the fgetc function.
-12   The wide character output functions convert wide characters to multibyte characters and
-     write them to the stream as if they were written by successive calls to the fputwc
-     function. Each conversion occurs as if by a call to the wcrtomb function, with the
-     conversion state described by the stream's own mbstate_t object. The byte output
-     functions write characters to the stream as if by successive calls to the fputc function.
-13   In some cases, some of the byte input/output functions also perform conversions between
-     multibyte characters and wide characters. These conversions also occur as if by calls to
-     the mbrtowc and wcrtomb functions.
-14   An encoding error occurs if the character sequence presented to the underlying
-     mbrtowc function does not form a valid (generalized) multibyte character, or if the code
-     value passed to the underlying wcrtomb does not correspond to a valid (generalized)
-
-
-     234) Setting the file position indicator to end-of-file, as with fseek(file, 0, SEEK_END), has
-          undefined behavior for a binary stream (because of possible trailing null characters) or for any stream
-          with state-dependent encoding that does not assuredly end in the initial shift state.
-
-[<a name="p267" href="#p267">page 267</a>] (<a href="#Contents">Contents</a>)
-
-     multibyte character. The wide character input/output functions and the byte input/output
-     functions store the value of the macro EILSEQ in errno if and only if an encoding error
-     occurs.
-     Environmental limits
-15   The value of FOPEN_MAX shall be at least eight, including the three standard text
-     streams.
-     Forward references: the exit function (<a href="#7.20.4.3">7.20.4.3</a>), the fgetc function (<a href="#7.19.7.1">7.19.7.1</a>), the
-     fopen function (<a href="#7.19.5.3">7.19.5.3</a>), the fputc function (<a href="#7.19.7.3">7.19.7.3</a>), the setbuf function
-     (<a href="#7.19.5.5">7.19.5.5</a>), the setvbuf function (<a href="#7.19.5.6">7.19.5.6</a>), the fgetwc function (<a href="#7.24.3.1">7.24.3.1</a>), the
-     fputwc function (<a href="#7.24.3.3">7.24.3.3</a>), conversion state (<a href="#7.24.6">7.24.6</a>), the mbrtowc function
-     (<a href="#7.24.6.3.2">7.24.6.3.2</a>), the wcrtomb function (<a href="#7.24.6.3.3">7.24.6.3.3</a>).
-<a name="7.19.4" href="#7.19.4"><b>     7.19.4 Operations on files</b></a>
-<a name="7.19.4.1" href="#7.19.4.1"><b>     7.19.4.1 The remove function</b></a>
-     Synopsis
-1           #include <a href="#7.19">&lt;stdio.h&gt;</a>
-            int remove(const char *filename);
-     Description
-2    The remove function causes the file whose name is the string pointed to by filename
-     to be no longer accessible by that name. A subsequent attempt to open that file using that
-     name will fail, unless it is created anew. If the file is open, the behavior of the remove
-     function is implementation-defined.
-     Returns
-3    The remove function returns zero if the operation succeeds, nonzero if it fails.
-<a name="7.19.4.2" href="#7.19.4.2"><b>     7.19.4.2 The rename function</b></a>
-     Synopsis
-1           #include <a href="#7.19">&lt;stdio.h&gt;</a>
-            int rename(const char *old, const char *new);
-     Description
-2    The rename function causes the file whose name is the string pointed to by old to be
-     henceforth known by the name given by the string pointed to by new. The file named
-     old is no longer accessible by that name. If a file named by the string pointed to by new
-     exists prior to the call to the rename function, the behavior is implementation-defined.
-
-
-
-
-[<a name="p268" href="#p268">page 268</a>] (<a href="#Contents">Contents</a>)
-
-    Returns
-3   The rename function returns zero if the operation succeeds, nonzero if it fails,235) in
-    which case if the file existed previously it is still known by its original name.
-<a name="7.19.4.3" href="#7.19.4.3"><b>    7.19.4.3 The tmpfile function</b></a>
-    Synopsis
-1           #include <a href="#7.19">&lt;stdio.h&gt;</a>
-            FILE *tmpfile(void);
-    Description
-2   The tmpfile function creates a temporary binary file that is different from any other
-    existing file and that will automatically be removed when it is closed or at program
-    termination. If the program terminates abnormally, whether an open temporary file is
-    removed is implementation-defined. The file is opened for update with "wb+" mode.
-    Recommended practice
-3   It should be possible to open at least TMP_MAX temporary files during the lifetime of the
-    program (this limit may be shared with tmpnam) and there should be no limit on the
-    number simultaneously open other than this limit and any limit on the number of open
-    files (FOPEN_MAX).
-    Returns
-4   The tmpfile function returns a pointer to the stream of the file that it created. If the file
-    cannot be created, the tmpfile function returns a null pointer.
-    Forward references: the fopen function (<a href="#7.19.5.3">7.19.5.3</a>).
-<a name="7.19.4.4" href="#7.19.4.4"><b>    7.19.4.4 The tmpnam function</b></a>
-    Synopsis
-1           #include <a href="#7.19">&lt;stdio.h&gt;</a>
-            char *tmpnam(char *s);
-    Description
-2   The tmpnam function generates a string that is a valid file name and that is not the same
-    as the name of an existing file.236) The function is potentially capable of generating
-
-
-    235) Among the reasons the implementation may cause the rename function to fail are that the file is open
-         or that it is necessary to copy its contents to effectuate its renaming.
-    236) Files created using strings generated by the tmpnam function are temporary only in the sense that
-         their names should not collide with those generated by conventional naming rules for the
-         implementation. It is still necessary to use the remove function to remove such files when their use
-         is ended, and before program termination.
-
-[<a name="p269" href="#p269">page 269</a>] (<a href="#Contents">Contents</a>)
-
-    TMP_MAX different strings, but any or all of them may already be in use by existing files
-    and thus not be suitable return values.
-3   The tmpnam function generates a different string each time it is called.
-4   The implementation shall behave as if no library function calls the tmpnam function.
-    Returns
-5   If no suitable string can be generated, the tmpnam function returns a null pointer.
-    Otherwise, if the argument is a null pointer, the tmpnam function leaves its result in an
-    internal static object and returns a pointer to that object (subsequent calls to the tmpnam
-    function may modify the same object). If the argument is not a null pointer, it is assumed
-    to point to an array of at least L_tmpnam chars; the tmpnam function writes its result
-    in that array and returns the argument as its value.
-    Environmental limits
-6   The value of the macro TMP_MAX shall be at least 25.
-<a name="7.19.5" href="#7.19.5"><b>    7.19.5 File access functions</b></a>
-<a name="7.19.5.1" href="#7.19.5.1"><b>    7.19.5.1 The fclose function</b></a>
-    Synopsis
-1          #include <a href="#7.19">&lt;stdio.h&gt;</a>
-           int fclose(FILE *stream);
-    Description
-2   A successful call to the fclose function causes the stream pointed to by stream to be
-    flushed and the associated file to be closed. Any unwritten buffered data for the stream
-    are delivered to the host environment to be written to the file; any unread buffered data
-    are discarded. Whether or not the call succeeds, the stream is disassociated from the file
-    and any buffer set by the setbuf or setvbuf function is disassociated from the stream
-    (and deallocated if it was automatically allocated).
-    Returns
-3   The fclose function returns zero if the stream was successfully closed, or EOF if any
-    errors were detected.
-<a name="7.19.5.2" href="#7.19.5.2"><b>    7.19.5.2 The fflush function</b></a>
-    Synopsis
-1          #include <a href="#7.19">&lt;stdio.h&gt;</a>
-           int fflush(FILE *stream);
-
-
-
-
-[<a name="p270" href="#p270">page 270</a>] (<a href="#Contents">Contents</a>)
-
-    Description
-2   If stream points to an output stream or an update stream in which the most recent
-    operation was not input, the fflush function causes any unwritten data for that stream
-    to be delivered to the host environment to be written to the file; otherwise, the behavior is
-    undefined.
-3   If stream is a null pointer, the fflush function performs this flushing action on all
-    streams for which the behavior is defined above.
-    Returns
-4   The fflush function sets the error indicator for the stream and returns EOF if a write
-    error occurs, otherwise it returns zero.
-    Forward references: the fopen function (<a href="#7.19.5.3">7.19.5.3</a>).
-<a name="7.19.5.3" href="#7.19.5.3"><b>    7.19.5.3 The fopen function</b></a>
-    Synopsis
-1           #include <a href="#7.19">&lt;stdio.h&gt;</a>
-            FILE *fopen(const char * restrict filename,
-                 const char * restrict mode);
-    Description
-2   The fopen function opens the file whose name is the string pointed to by filename,
-    and associates a stream with it.
-3   The argument mode points to a string. If the string is one of the following, the file is
-    open in the indicated mode. Otherwise, the behavior is undefined.237)
-    r                open text file for reading
-    w                truncate to zero length or create text file for writing
-    a                append; open or create text file for writing at end-of-file
-    rb               open binary file for reading
-    wb               truncate to zero length or create binary file for writing
-    ab               append; open or create binary file for writing at end-of-file
-    r+               open text file for update (reading and writing)
-    w+               truncate to zero length or create text file for update
-    a+               append; open or create text file for update, writing at end-of-file
-
-
-
-
-    237) If the string begins with one of the above sequences, the implementation might choose to ignore the
-         remaining characters, or it might use them to select different kinds of a file (some of which might not
-         conform to the properties in <a href="#7.19.2">7.19.2</a>).
-
-[<a name="p271" href="#p271">page 271</a>] (<a href="#Contents">Contents</a>)
-
-    r+b or rb+ open binary file for update (reading and writing)
-    w+b or wb+ truncate to zero length or create binary file for update
-    a+b or ab+ append; open or create binary file for update, writing at end-of-file
-4   Opening a file with read mode ('r' as the first character in the mode argument) fails if
-    the file does not exist or cannot be read.
-5   Opening a file with append mode ('a' as the first character in the mode argument)
-    causes all subsequent writes to the file to be forced to the then current end-of-file,
-    regardless of intervening calls to the fseek function. In some implementations, opening
-    a binary file with append mode ('b' as the second or third character in the above list of
-    mode argument values) may initially position the file position indicator for the stream
-    beyond the last data written, because of null character padding.
-6   When a file is opened with update mode ('+' as the second or third character in the
-    above list of mode argument values), both input and output may be performed on the
-    associated stream. However, output shall not be directly followed by input without an
-    intervening call to the fflush function or to a file positioning function (fseek,
-    fsetpos, or rewind), and input shall not be directly followed by output without an
-    intervening call to a file positioning function, unless the input operation encounters end-
-    of-file. Opening (or creating) a text file with update mode may instead open (or create) a
-    binary stream in some implementations.
-7   When opened, a stream is fully buffered if and only if it can be determined not to refer to
-    an interactive device. The error and end-of-file indicators for the stream are cleared.
-    Returns
-8   The fopen function returns a pointer to the object controlling the stream. If the open
-    operation fails, fopen returns a null pointer.
-    Forward references: file positioning functions (<a href="#7.19.9">7.19.9</a>).
-<a name="7.19.5.4" href="#7.19.5.4"><b>    7.19.5.4 The freopen function</b></a>
-    Synopsis
-1          #include <a href="#7.19">&lt;stdio.h&gt;</a>
-           FILE *freopen(const char * restrict filename,
-                const char * restrict mode,
-                FILE * restrict stream);
-    Description
-2   The freopen function opens the file whose name is the string pointed to by filename
-    and associates the stream pointed to by stream with it. The mode argument is used just
-
-
-
-
-[<a name="p272" href="#p272">page 272</a>] (<a href="#Contents">Contents</a>)
-
-    as in the fopen function.238)
-3   If filename is a null pointer, the freopen function attempts to change the mode of
-    the stream to that specified by mode, as if the name of the file currently associated with
-    the stream had been used. It is implementation-defined which changes of mode are
-    permitted (if any), and under what circumstances.
-4   The freopen function first attempts to close any file that is associated with the specified
-    stream. Failure to close the file is ignored. The error and end-of-file indicators for the
-    stream are cleared.
-    Returns
-5   The freopen function returns a null pointer if the open operation fails. Otherwise,
-    freopen returns the value of stream.
-<a name="7.19.5.5" href="#7.19.5.5"><b>    7.19.5.5 The setbuf function</b></a>
-    Synopsis
-1           #include <a href="#7.19">&lt;stdio.h&gt;</a>
-            void setbuf(FILE * restrict stream,
-                 char * restrict buf);
-    Description
-2   Except that it returns no value, the setbuf function is equivalent to the setvbuf
-    function invoked with the values _IOFBF for mode and BUFSIZ for size, or (if buf
-    is a null pointer), with the value _IONBF for mode.
-    Returns
-3   The setbuf function returns no value.
-    Forward references: the setvbuf function (<a href="#7.19.5.6">7.19.5.6</a>).
-<a name="7.19.5.6" href="#7.19.5.6"><b>    7.19.5.6 The setvbuf function</b></a>
-    Synopsis
-1           #include <a href="#7.19">&lt;stdio.h&gt;</a>
-            int setvbuf(FILE * restrict stream,
-                 char * restrict buf,
-                 int mode, size_t size);
-
-
-
-
-    238) The primary use of the freopen function is to change the file associated with a standard text stream
-         (stderr, stdin, or stdout), as those identifiers need not be modifiable lvalues to which the value
-         returned by the fopen function may be assigned.
-
-[<a name="p273" href="#p273">page 273</a>] (<a href="#Contents">Contents</a>)
-
-    Description
-2   The setvbuf function may be used only after the stream pointed to by stream has
-    been associated with an open file and before any other operation (other than an
-    unsuccessful call to setvbuf) is performed on the stream. The argument mode
-    determines how stream will be buffered, as follows: _IOFBF causes input/output to be
-    fully buffered; _IOLBF causes input/output to be line buffered; _IONBF causes
-    input/output to be unbuffered. If buf is not a null pointer, the array it points to may be
-    used instead of a buffer allocated by the setvbuf function239) and the argument size
-    specifies the size of the array; otherwise, size may determine the size of a buffer
-    allocated by the setvbuf function. The contents of the array at any time are
-    indeterminate.
-    Returns
-3   The setvbuf function returns zero on success, or nonzero if an invalid value is given
-    for mode or if the request cannot be honored.
-<a name="7.19.6" href="#7.19.6"><b>    7.19.6 Formatted input/output functions</b></a>
-1   The formatted input/output functions shall behave as if there is a sequence point after the
-    actions associated with each specifier.240)
-<a name="7.19.6.1" href="#7.19.6.1"><b>    7.19.6.1 The fprintf function</b></a>
-    Synopsis
-1           #include <a href="#7.19">&lt;stdio.h&gt;</a>
-            int fprintf(FILE * restrict stream,
-                 const char * restrict format, ...);
-    Description
-2   The fprintf function writes output to the stream pointed to by stream, under control
-    of the string pointed to by format that specifies how subsequent arguments are
-    converted for output. If there are insufficient arguments for the format, the behavior is
-    undefined. If the format is exhausted while arguments remain, the excess arguments are
-    evaluated (as always) but are otherwise ignored. The fprintf function returns when
-    the end of the format string is encountered.
-3   The format shall be a multibyte character sequence, beginning and ending in its initial
-    shift state. The format is composed of zero or more directives: ordinary multibyte
-    characters (not %), which are copied unchanged to the output stream; and conversion
-
-
-    239) The buffer has to have a lifetime at least as great as the open stream, so the stream should be closed
-         before a buffer that has automatic storage duration is deallocated upon block exit.
-    240) The fprintf functions perform writes to memory for the %n specifier.
-
-[<a name="p274" href="#p274">page 274</a>] (<a href="#Contents">Contents</a>)
-
-    specifications, each of which results in fetching zero or more subsequent arguments,
-    converting them, if applicable, according to the corresponding conversion specifier, and
-    then writing the result to the output stream.
-4   Each conversion specification is introduced by the character %. After the %, the following
-    appear in sequence:
-    -- Zero or more flags (in any order) that modify the meaning of the conversion
-      specification.
-    -- An optional minimum field width. If the converted value has fewer characters than the
-      field width, it is padded with spaces (by default) on the left (or right, if the left
-      adjustment flag, described later, has been given) to the field width. The field width
-      takes the form of an asterisk * (described later) or a nonnegative decimal integer.241)
-    -- An optional precision that gives the minimum number of digits to appear for the d, i,
-      o, u, x, and X conversions, the number of digits to appear after the decimal-point
-      character for a, A, e, E, f, and F conversions, the maximum number of significant
-      digits for the g and G conversions, or the maximum number of bytes to be written for
-      s conversions. The precision takes the form of a period (.) followed either by an
-      asterisk * (described later) or by an optional decimal integer; if only the period is
-      specified, the precision is taken as zero. If a precision appears with any other
-      conversion specifier, the behavior is undefined.
-    -- An optional length modifier that specifies the size of the argument.
-    -- A conversion specifier character that specifies the type of conversion to be applied.
-5   As noted above, a field width, or precision, or both, may be indicated by an asterisk. In
-    this case, an int argument supplies the field width or precision. The arguments
-    specifying field width, or precision, or both, shall appear (in that order) before the
-    argument (if any) to be converted. A negative field width argument is taken as a - flag
-    followed by a positive field width. A negative precision argument is taken as if the
-    precision were omitted.
-6   The flag characters and their meanings are:
-    -        The result of the conversion is left-justified within the field. (It is right-justified if
-             this flag is not specified.)
-    +        The result of a signed conversion always begins with a plus or minus sign. (It
-             begins with a sign only when a negative value is converted if this flag is not
-
-
-
-
-    241) Note that 0 is taken as a flag, not as the beginning of a field width.
-
-[<a name="p275" href="#p275">page 275</a>] (<a href="#Contents">Contents</a>)
-
-              specified.)242)
-    space If the first character of a signed conversion is not a sign, or if a signed conversion
-          results in no characters, a space is prefixed to the result. If the space and + flags
-          both appear, the space flag is ignored.
-    #         The result is converted to an ''alternative form''. For o conversion, it increases
-              the precision, if and only if necessary, to force the first digit of the result to be a
-              zero (if the value and precision are both 0, a single 0 is printed). For x (or X)
-              conversion, a nonzero result has 0x (or 0X) prefixed to it. For a, A, e, E, f, F, g,
-              and G conversions, the result of converting a floating-point number always
-              contains a decimal-point character, even if no digits follow it. (Normally, a
-              decimal-point character appears in the result of these conversions only if a digit
-              follows it.) For g and G conversions, trailing zeros are not removed from the
-              result. For other conversions, the behavior is undefined.
-    0         For d, i, o, u, x, X, a, A, e, E, f, F, g, and G conversions, leading zeros
-              (following any indication of sign or base) are used to pad to the field width rather
-              than performing space padding, except when converting an infinity or NaN. If the
-              0 and - flags both appear, the 0 flag is ignored. For d, i, o, u, x, and X
-              conversions, if a precision is specified, the 0 flag is ignored. For other
-              conversions, the behavior is undefined.
-7   The length modifiers and their meanings are:
-    hh             Specifies that a following d, i, o, u, x, or X conversion specifier applies to a
-                   signed char or unsigned char argument (the argument will have
-                   been promoted according to the integer promotions, but its value shall be
-                   converted to signed char or unsigned char before printing); or that
-                   a following n conversion specifier applies to a pointer to a signed char
-                   argument.
-    h              Specifies that a following d, i, o, u, x, or X conversion specifier applies to a
-                   short int or unsigned short int argument (the argument will
-                   have been promoted according to the integer promotions, but its value shall
-                   be converted to short int or unsigned short int before printing);
-                   or that a following n conversion specifier applies to a pointer to a short
-                   int argument.
-    l (ell)        Specifies that a following d, i, o, u, x, or X conversion specifier applies to a
-                   long int or unsigned long int argument; that a following n
-                   conversion specifier applies to a pointer to a long int argument; that a
-
-    242) The results of all floating conversions of a negative zero, and of negative values that round to zero,
-         include a minus sign.
-
-[<a name="p276" href="#p276">page 276</a>] (<a href="#Contents">Contents</a>)
-
-                 following c conversion specifier applies to a wint_t argument; that a
-                 following s conversion specifier applies to a pointer to a wchar_t
-                 argument; or has no effect on a following a, A, e, E, f, F, g, or G conversion
-                 specifier.
-    ll (ell-ell) Specifies that a following d, i, o, u, x, or X conversion specifier applies to a
-                 long long int or unsigned long long int argument; or that a
-                 following n conversion specifier applies to a pointer to a long long int
-                 argument.
-    j            Specifies that a following d, i, o, u, x, or X conversion specifier applies to
-                 an intmax_t or uintmax_t argument; or that a following n conversion
-                 specifier applies to a pointer to an intmax_t argument.
-    z            Specifies that a following d, i, o, u, x, or X conversion specifier applies to a
-                 size_t or the corresponding signed integer type argument; or that a
-                 following n conversion specifier applies to a pointer to a signed integer type
-                 corresponding to size_t argument.
-    t            Specifies that a following d, i, o, u, x, or X conversion specifier applies to a
-                 ptrdiff_t or the corresponding unsigned integer type argument; or that a
-                 following n conversion specifier applies to a pointer to a ptrdiff_t
-                 argument.
-    L            Specifies that a following a, A, e, E, f, F, g, or G conversion specifier
-                 applies to a long double argument.
-    If a length modifier appears with any conversion specifier other than as specified above,
-    the behavior is undefined.
-8   The conversion specifiers and their meanings are:
-    d,i         The int argument is converted to signed decimal in the style [-]dddd. The
-                precision specifies the minimum number of digits to appear; if the value
-                being converted can be represented in fewer digits, it is expanded with
-                leading zeros. The default precision is 1. The result of converting a zero
-                value with a precision of zero is no characters.
-    o,u,x,X The unsigned int argument is converted to unsigned octal (o), unsigned
-            decimal (u), or unsigned hexadecimal notation (x or X) in the style dddd; the
-            letters abcdef are used for x conversion and the letters ABCDEF for X
-            conversion. The precision specifies the minimum number of digits to appear;
-            if the value being converted can be represented in fewer digits, it is expanded
-            with leading zeros. The default precision is 1. The result of converting a
-            zero value with a precision of zero is no characters.
-
-
-[<a name="p277" href="#p277">page 277</a>] (<a href="#Contents">Contents</a>)
-
-f,F          A double argument representing a floating-point number is converted to
-             decimal notation in the style [-]ddd.ddd, where the number of digits after
-             the decimal-point character is equal to the precision specification. If the
-             precision is missing, it is taken as 6; if the precision is zero and the # flag is
-             not specified, no decimal-point character appears. If a decimal-point
-             character appears, at least one digit appears before it. The value is rounded to
-             the appropriate number of digits.
-             A double argument representing an infinity is converted in one of the styles
-             [-]inf or [-]infinity -- which style is implementation-defined. A
-             double argument representing a NaN is converted in one of the styles
-             [-]nan or [-]nan(n-char-sequence) -- which style, and the meaning of
-             any n-char-sequence, is implementation-defined. The F conversion specifier
-             produces INF, INFINITY, or NAN instead of inf, infinity, or nan,
-             respectively.243)
-e,E          A double argument representing a floating-point number is converted in the
-             style [-]d.ddd e(+-)dd, where there is one digit (which is nonzero if the
-             argument is nonzero) before the decimal-point character and the number of
-             digits after it is equal to the precision; if the precision is missing, it is taken as
-             6; if the precision is zero and the # flag is not specified, no decimal-point
-             character appears. The value is rounded to the appropriate number of digits.
-             The E conversion specifier produces a number with E instead of e
-             introducing the exponent. The exponent always contains at least two digits,
-             and only as many more digits as necessary to represent the exponent. If the
-             value is zero, the exponent is zero.
-             A double argument representing an infinity or NaN is converted in the style
-             of an f or F conversion specifier.
-g,G          A double argument representing a floating-point number is converted in
-             style f or e (or in style F or E in the case of a G conversion specifier),
-             depending on the value converted and the precision. Let P equal the
-             precision if nonzero, 6 if the precision is omitted, or 1 if the precision is zero.
-             Then, if a conversion with style E would have an exponent of X :
-             -- if P &gt; X &gt;= -4, the conversion is with style f (or F) and precision
-               P - (X + 1).
-             -- otherwise, the conversion is with style e (or E) and precision P - 1.
-             Finally, unless the # flag is used, any trailing zeros are removed from the
-
-243) When applied to infinite and NaN values, the -, +, and space flag characters have their usual meaning;
-     the # and 0 flag characters have no effect.
-
-[<a name="p278" href="#p278">page 278</a>] (<a href="#Contents">Contents</a>)
-
-              fractional portion of the result and the decimal-point character is removed if
-              there is no fractional portion remaining.
-              A double argument representing an infinity or NaN is converted in the style
-              of an f or F conversion specifier.
-a,A           A double argument representing a floating-point number is converted in the
-              style [-]0xh.hhhh p(+-)d, where there is one hexadecimal digit (which is
-              nonzero if the argument is a normalized floating-point number and is
-              otherwise unspecified) before the decimal-point character244) and the number
-              of hexadecimal digits after it is equal to the precision; if the precision is
-              missing and FLT_RADIX is a power of 2, then the precision is sufficient for
-              an exact representation of the value; if the precision is missing and
-              FLT_RADIX is not a power of 2, then the precision is sufficient to
-              distinguish245) values of type double, except that trailing zeros may be
-              omitted; if the precision is zero and the # flag is not specified, no decimal-
-              point character appears. The letters abcdef are used for a conversion and
-              the letters ABCDEF for A conversion. The A conversion specifier produces a
-              number with X and P instead of x and p. The exponent always contains at
-              least one digit, and only as many more digits as necessary to represent the
-              decimal exponent of 2. If the value is zero, the exponent is zero.
-              A double argument representing an infinity or NaN is converted in the style
-              of an f or F conversion specifier.
-c             If no l length modifier is present, the int argument is converted to an
-              unsigned char, and the resulting character is written.
-              If an l length modifier is present, the wint_t argument is converted as if by
-              an ls conversion specification with no precision and an argument that points
-              to the initial element of a two-element array of wchar_t, the first element
-              containing the wint_t argument to the lc conversion specification and the
-              second a null wide character.
-s             If no l length modifier is present, the argument shall be a pointer to the initial
-              element of an array of character type.246) Characters from the array are
-
-
-244) Binary implementations can choose the hexadecimal digit to the left of the decimal-point character so
-     that subsequent digits align to nibble (4-bit) boundaries.
-245) The precision p is sufficient to distinguish values of the source type if 16 p-1 &gt; b n where b is
-     FLT_RADIX and n is the number of base-b digits in the significand of the source type. A smaller p
-     might suffice depending on the implementation's scheme for determining the digit to the left of the
-     decimal-point character.
-246) No special provisions are made for multibyte characters.
-
-[<a name="p279" href="#p279">page 279</a>] (<a href="#Contents">Contents</a>)
-
-                    written up to (but not including) the terminating null character. If the
-                    precision is specified, no more than that many bytes are written. If the
-                    precision is not specified or is greater than the size of the array, the array shall
-                    contain a null character.
-                    If an l length modifier is present, the argument shall be a pointer to the initial
-                    element of an array of wchar_t type. Wide characters from the array are
-                    converted to multibyte characters (each as if by a call to the wcrtomb
-                    function, with the conversion state described by an mbstate_t object
-                    initialized to zero before the first wide character is converted) up to and
-                    including a terminating null wide character. The resulting multibyte
-                    characters are written up to (but not including) the terminating null character
-                    (byte). If no precision is specified, the array shall contain a null wide
-                    character. If a precision is specified, no more than that many bytes are
-                    written (including shift sequences, if any), and the array shall contain a null
-                    wide character if, to equal the multibyte character sequence length given by
-                    the precision, the function would need to access a wide character one past the
-                    end of the array. In no case is a partial multibyte character written.247)
-     p              The argument shall be a pointer to void. The value of the pointer is
-                    converted to a sequence of printing characters, in an implementation-defined
-                    manner.
-     n              The argument shall be a pointer to signed integer into which is written the
-                    number of characters written to the output stream so far by this call to
-                    fprintf. No argument is converted, but one is consumed. If the conversion
-                    specification includes any flags, a field width, or a precision, the behavior is
-                    undefined.
-     %              A % character is written. No argument is converted. The complete
-                    conversion specification shall be %%.
-9    If a conversion specification is invalid, the behavior is undefined.248) If any argument is
-     not the correct type for the corresponding conversion specification, the behavior is
-     undefined.
-10   In no case does a nonexistent or small field width cause truncation of a field; if the result
-     of a conversion is wider than the field width, the field is expanded to contain the
-     conversion result.
-
-
-
-
-     247) Redundant shift sequences may result if multibyte characters have a state-dependent encoding.
-     248) See ''future library directions'' (<a href="#7.26.9">7.26.9</a>).
-
-[<a name="p280" href="#p280">page 280</a>] (<a href="#Contents">Contents</a>)
-
-11   For a and A conversions, if FLT_RADIX is a power of 2, the value is correctly rounded
-     to a hexadecimal floating number with the given precision.
-     Recommended practice
-12   For a and A conversions, if FLT_RADIX is not a power of 2 and the result is not exactly
-     representable in the given precision, the result should be one of the two adjacent numbers
-     in hexadecimal floating style with the given precision, with the extra stipulation that the
-     error should have a correct sign for the current rounding direction.
-13   For e, E, f, F, g, and G conversions, if the number of significant decimal digits is at most
-     DECIMAL_DIG, then the result should be correctly rounded.249) If the number of
-     significant decimal digits is more than DECIMAL_DIG but the source value is exactly
-     representable with DECIMAL_DIG digits, then the result should be an exact
-     representation with trailing zeros. Otherwise, the source value is bounded by two
-     adjacent decimal strings L &lt; U, both having DECIMAL_DIG significant digits; the value
-     of the resultant decimal string D should satisfy L &lt;= D &lt;= U, with the extra stipulation that
-     the error should have a correct sign for the current rounding direction.
-     Returns
-14   The fprintf function returns the number of characters transmitted, or a negative value
-     if an output or encoding error occurred.
-     Environmental limits
-15   The number of characters that can be produced by any single conversion shall be at least
-     4095.
-16   EXAMPLE 1 To print a date and time in the form ''Sunday, July 3, 10:02'' followed by pi to five decimal
-     places:
-             #include <a href="#7.12">&lt;math.h&gt;</a>
-             #include <a href="#7.19">&lt;stdio.h&gt;</a>
-             /* ... */
-             char *weekday, *month;      // pointers to strings
-             int day, hour, min;
-             fprintf(stdout, "%s, %s %d, %.2d:%.2d\n",
-                     weekday, month, day, hour, min);
-             fprintf(stdout, "pi = %.5f\n", 4 * atan(1.0));
-
-17   EXAMPLE 2 In this example, multibyte characters do not have a state-dependent encoding, and the
-     members of the extended character set that consist of more than one byte each consist of exactly two bytes,
-     the first of which is denoted here by a and the second by an uppercase letter.
-
-
-
-
-     249) For binary-to-decimal conversion, the result format's values are the numbers representable with the
-          given format specifier. The number of significant digits is determined by the format specifier, and in
-          the case of fixed-point conversion by the source value as well.
-
-[<a name="p281" href="#p281">page 281</a>] (<a href="#Contents">Contents</a>)
-
-18   Given the following wide string with length seven,
-              static wchar_t wstr[] = L" X Yabc Z W";
-     the seven calls
-              fprintf(stdout,          "|1234567890123|\n");
-              fprintf(stdout,          "|%13ls|\n", wstr);
-              fprintf(stdout,          "|%-13.9ls|\n", wstr);
-              fprintf(stdout,          "|%13.10ls|\n", wstr);
-              fprintf(stdout,          "|%13.11ls|\n", wstr);
-              fprintf(stdout,          "|%13.15ls|\n", &amp;wstr[2]);
-              fprintf(stdout,          "|%13lc|\n", (wint_t) wstr[5]);
-     will print the following seven lines:
-              |1234567890123|
-              |   X Yabc Z W|
-              | X Yabc Z    |
-              |     X Yabc Z|
-              |   X Yabc Z W|
-              |      abc Z W|
-              |            Z|
-
-     Forward references: conversion state (<a href="#7.24.6">7.24.6</a>), the wcrtomb function (<a href="#7.24.6.3.3">7.24.6.3.3</a>).
-<a name="7.19.6.2" href="#7.19.6.2"><b>     7.19.6.2 The fscanf function</b></a>
-     Synopsis
-1             #include <a href="#7.19">&lt;stdio.h&gt;</a>
-              int fscanf(FILE * restrict stream,
-                   const char * restrict format, ...);
-     Description
-2    The fscanf function reads input from the stream pointed to by stream, under control
-     of the string pointed to by format that specifies the admissible input sequences and how
-     they are to be converted for assignment, using subsequent arguments as pointers to the
-     objects to receive the converted input. If there are insufficient arguments for the format,
-     the behavior is undefined. If the format is exhausted while arguments remain, the excess
-     arguments are evaluated (as always) but are otherwise ignored.
-3    The format shall be a multibyte character sequence, beginning and ending in its initial
-     shift state. The format is composed of zero or more directives: one or more white-space
-     characters, an ordinary multibyte character (neither % nor a white-space character), or a
-     conversion specification. Each conversion specification is introduced by the character %.
-     After the %, the following appear in sequence:
-     -- An optional assignment-suppressing character *.
-     -- An optional decimal integer greater than zero that specifies the maximum field width
-       (in characters).
-
-[<a name="p282" href="#p282">page 282</a>] (<a href="#Contents">Contents</a>)
-
-     -- An optional length modifier that specifies the size of the receiving object.
-     -- A conversion specifier character that specifies the type of conversion to be applied.
-4    The fscanf function executes each directive of the format in turn. If a directive fails, as
-     detailed below, the function returns. Failures are described as input failures (due to the
-     occurrence of an encoding error or the unavailability of input characters), or matching
-     failures (due to inappropriate input).
-5    A directive composed of white-space character(s) is executed by reading input up to the
-     first non-white-space character (which remains unread), or until no more characters can
-     be read.
-6    A directive that is an ordinary multibyte character is executed by reading the next
-     characters of the stream. If any of those characters differ from the ones composing the
-     directive, the directive fails and the differing and subsequent characters remain unread.
-     Similarly, if end-of-file, an encoding error, or a read error prevents a character from being
-     read, the directive fails.
-7    A directive that is a conversion specification defines a set of matching input sequences, as
-     described below for each specifier. A conversion specification is executed in the
-     following steps:
-8    Input white-space characters (as specified by the isspace function) are skipped, unless
-     the specification includes a [, c, or n specifier.250)
-9    An input item is read from the stream, unless the specification includes an n specifier. An
-     input item is defined as the longest sequence of input characters which does not exceed
-     any specified field width and which is, or is a prefix of, a matching input sequence.251)
-     The first character, if any, after the input item remains unread. If the length of the input
-     item is zero, the execution of the directive fails; this condition is a matching failure unless
-     end-of-file, an encoding error, or a read error prevented input from the stream, in which
-     case it is an input failure.
-10   Except in the case of a % specifier, the input item (or, in the case of a %n directive, the
-     count of input characters) is converted to a type appropriate to the conversion specifier. If
-     the input item is not a matching sequence, the execution of the directive fails: this
-     condition is a matching failure. Unless assignment suppression was indicated by a *, the
-     result of the conversion is placed in the object pointed to by the first argument following
-     the format argument that has not already received a conversion result. If this object
-     does not have an appropriate type, or if the result of the conversion cannot be represented
-
-
-     250) These white-space characters are not counted against a specified field width.
-     251) fscanf pushes back at most one input character onto the input stream. Therefore, some sequences
-          that are acceptable to strtod, strtol, etc., are unacceptable to fscanf.
-
-[<a name="p283" href="#p283">page 283</a>] (<a href="#Contents">Contents</a>)
-
-     in the object, the behavior is undefined.
-11   The length modifiers and their meanings are:
-     hh           Specifies that a following d, i, o, u, x, X, or n conversion specifier applies
-                  to an argument with type pointer to signed char or unsigned char.
-     h            Specifies that a following d, i, o, u, x, X, or n conversion specifier applies
-                  to an argument with type pointer to short int or unsigned short
-                  int.
-     l (ell)      Specifies that a following d, i, o, u, x, X, or n conversion specifier applies
-                  to an argument with type pointer to long int or unsigned long
-                  int; that a following a, A, e, E, f, F, g, or G conversion specifier applies to
-                  an argument with type pointer to double; or that a following c, s, or [
-                  conversion specifier applies to an argument with type pointer to wchar_t.
-     ll (ell-ell) Specifies that a following d, i, o, u, x, X, or n conversion specifier applies
-                  to an argument with type pointer to long long int or unsigned
-                  long long int.
-     j            Specifies that a following d, i, o, u, x, X, or n conversion specifier applies
-                  to an argument with type pointer to intmax_t or uintmax_t.
-     z            Specifies that a following d, i, o, u, x, X, or n conversion specifier applies
-                  to an argument with type pointer to size_t or the corresponding signed
-                  integer type.
-     t            Specifies that a following d, i, o, u, x, X, or n conversion specifier applies
-                  to an argument with type pointer to ptrdiff_t or the corresponding
-                  unsigned integer type.
-     L            Specifies that a following a, A, e, E, f, F, g, or G conversion specifier
-                  applies to an argument with type pointer to long double.
-     If a length modifier appears with any conversion specifier other than as specified above,
-     the behavior is undefined.
-12   The conversion specifiers and their meanings are:
-     d           Matches an optionally signed decimal integer, whose format is the same as
-                 expected for the subject sequence of the strtol function with the value 10
-                 for the base argument. The corresponding argument shall be a pointer to
-                 signed integer.
-     i           Matches an optionally signed integer, whose format is the same as expected
-                 for the subject sequence of the strtol function with the value 0 for the
-                 base argument. The corresponding argument shall be a pointer to signed
-                 integer.
-[<a name="p284" href="#p284">page 284</a>] (<a href="#Contents">Contents</a>)
-
-o             Matches an optionally signed octal integer, whose format is the same as
-              expected for the subject sequence of the strtoul function with the value 8
-              for the base argument. The corresponding argument shall be a pointer to
-              unsigned integer.
-u             Matches an optionally signed decimal integer, whose format is the same as
-              expected for the subject sequence of the strtoul function with the value 10
-              for the base argument. The corresponding argument shall be a pointer to
-              unsigned integer.
-x             Matches an optionally signed hexadecimal integer, whose format is the same
-              as expected for the subject sequence of the strtoul function with the value
-              16 for the base argument. The corresponding argument shall be a pointer to
-              unsigned integer.
-a,e,f,g Matches an optionally signed floating-point number, infinity, or NaN, whose
-        format is the same as expected for the subject sequence of the strtod
-        function. The corresponding argument shall be a pointer to floating.
-c             Matches a sequence of characters of exactly the number specified by the field
-              width (1 if no field width is present in the directive).252)
-              If no l length modifier is present, the corresponding argument shall be a
-              pointer to the initial element of a character array large enough to accept the
-              sequence. No null character is added.
-              If an l length modifier is present, the input shall be a sequence of multibyte
-              characters that begins in the initial shift state. Each multibyte character in the
-              sequence is converted to a wide character as if by a call to the mbrtowc
-              function, with the conversion state described by an mbstate_t object
-              initialized to zero before the first multibyte character is converted. The
-              corresponding argument shall be a pointer to the initial element of an array of
-              wchar_t large enough to accept the resulting sequence of wide characters.
-              No null wide character is added.
-s             Matches a sequence of non-white-space characters.252)
-              If no l length modifier is present, the corresponding argument shall be a
-              pointer to the initial element of a character array large enough to accept the
-              sequence and a terminating null character, which will be added automatically.
-              If an l length modifier is present, the input shall be a sequence of multibyte
-
-
-252) No special provisions are made for multibyte characters in the matching rules used by the c, s, and [
-     conversion specifiers -- the extent of the input field is determined on a byte-by-byte basis. The
-     resulting field is nevertheless a sequence of multibyte characters that begins in the initial shift state.
-
-[<a name="p285" href="#p285">page 285</a>] (<a href="#Contents">Contents</a>)
-
-         characters that begins in the initial shift state. Each multibyte character is
-         converted to a wide character as if by a call to the mbrtowc function, with
-         the conversion state described by an mbstate_t object initialized to zero
-         before the first multibyte character is converted. The corresponding argument
-         shall be a pointer to the initial element of an array of wchar_t large enough
-         to accept the sequence and the terminating null wide character, which will be
-         added automatically.
-[        Matches a nonempty sequence of characters from a set of expected characters
-         (the scanset).252)
-         If no l length modifier is present, the corresponding argument shall be a
-         pointer to the initial element of a character array large enough to accept the
-         sequence and a terminating null character, which will be added automatically.
-         If an l length modifier is present, the input shall be a sequence of multibyte
-         characters that begins in the initial shift state. Each multibyte character is
-         converted to a wide character as if by a call to the mbrtowc function, with
-         the conversion state described by an mbstate_t object initialized to zero
-         before the first multibyte character is converted. The corresponding argument
-         shall be a pointer to the initial element of an array of wchar_t large enough
-         to accept the sequence and the terminating null wide character, which will be
-         added automatically.
-         The conversion specifier includes all subsequent characters in the format
-         string, up to and including the matching right bracket (]). The characters
-         between the brackets (the scanlist) compose the scanset, unless the character
-         after the left bracket is a circumflex (^), in which case the scanset contains all
-         characters that do not appear in the scanlist between the circumflex and the
-         right bracket. If the conversion specifier begins with [] or [^], the right
-         bracket character is in the scanlist and the next following right bracket
-         character is the matching right bracket that ends the specification; otherwise
-         the first following right bracket character is the one that ends the
-         specification. If a - character is in the scanlist and is not the first, nor the
-         second where the first character is a ^, nor the last character, the behavior is
-         implementation-defined.
-p        Matches an implementation-defined set of sequences, which should be the
-         same as the set of sequences that may be produced by the %p conversion of
-         the fprintf function. The corresponding argument shall be a pointer to a
-         pointer to void. The input item is converted to a pointer value in an
-         implementation-defined manner. If the input item is a value converted earlier
-         during the same program execution, the pointer that results shall compare
-         equal to that value; otherwise the behavior of the %p conversion is undefined.
-
-[<a name="p286" href="#p286">page 286</a>] (<a href="#Contents">Contents</a>)
-
-     n              No input is consumed. The corresponding argument shall be a pointer to
-                    signed integer into which is to be written the number of characters read from
-                    the input stream so far by this call to the fscanf function. Execution of a
-                    %n directive does not increment the assignment count returned at the
-                    completion of execution of the fscanf function. No argument is converted,
-                    but one is consumed. If the conversion specification includes an assignment-
-                    suppressing character or a field width, the behavior is undefined.
-     %              Matches a single % character; no conversion or assignment occurs. The
-                    complete conversion specification shall be %%.
-13   If a conversion specification is invalid, the behavior is undefined.253)
-14   The conversion specifiers A, E, F, G, and X are also valid and behave the same as,
-     respectively, a, e, f, g, and x.
-15   Trailing white space (including new-line characters) is left unread unless matched by a
-     directive. The success of literal matches and suppressed assignments is not directly
-     determinable other than via the %n directive.
-     Returns
-16   The fscanf function returns the value of the macro EOF if an input failure occurs
-     before any conversion. Otherwise, the function returns the number of input items
-     assigned, which can be fewer than provided for, or even zero, in the event of an early
-     matching failure.
-17   EXAMPLE 1        The call:
-              #include <a href="#7.19">&lt;stdio.h&gt;</a>
-              /* ... */
-              int n, i; float x; char name[50];
-              n = fscanf(stdin, "%d%f%s", &amp;i, &amp;x, name);
-     with the input line:
-              25 54.32E-1 thompson
-     will assign to n the value 3, to i the value 25, to x the value 5.432, and to name the sequence
-     thompson\0.
-
-18   EXAMPLE 2        The call:
-              #include <a href="#7.19">&lt;stdio.h&gt;</a>
-              /* ... */
-              int i; float x; char name[50];
-              fscanf(stdin, "%2d%f%*d %[0123456789]", &amp;i, &amp;x, name);
-     with input:
-
-
-
-     253) See ''future library directions'' (<a href="#7.26.9">7.26.9</a>).
-
-[<a name="p287" href="#p287">page 287</a>] (<a href="#Contents">Contents</a>)
-
-              56789 0123 56a72
-     will assign to i the value 56 and to x the value 789.0, will skip 0123, and will assign to name the
-     sequence 56\0. The next character read from the input stream will be a.
-
-19   EXAMPLE 3         To accept repeatedly from stdin a quantity, a unit of measure, and an item name:
-              #include <a href="#7.19">&lt;stdio.h&gt;</a>
-              /* ... */
-              int count; float quant; char units[21], item[21];
-              do {
-                      count = fscanf(stdin, "%f%20s of %20s", &amp;quant, units, item);
-                      fscanf(stdin,"%*[^\n]");
-              } while (!feof(stdin) &amp;&amp; !ferror(stdin));
-20   If the stdin stream contains the following lines:
-              2 quarts of oil
-              -12.8degrees Celsius
-              lots of luck
-              10.0LBS      of
-              dirt
-              100ergs of energy
-     the execution of the above example will be analogous to the following assignments:
-              quant     =    2; strcpy(units, "quarts"); strcpy(item, "oil");
-              count     =    3;
-              quant     =    -12.8; strcpy(units, "degrees");
-              count     =    2; // "C" fails to match "o"
-              count     =    0; // "l" fails to match "%f"
-              quant     =    10.0; strcpy(units, "LBS"); strcpy(item, "dirt");
-              count     =    3;
-              count     =    0; // "100e" fails to match "%f"
-              count     =    EOF;
-
-21   EXAMPLE 4         In:
-              #include <a href="#7.19">&lt;stdio.h&gt;</a>
-              /* ... */
-              int d1, d2, n1, n2, i;
-              i = sscanf("123", "%d%n%n%d", &amp;d1, &amp;n1, &amp;n2, &amp;d2);
-     the value 123 is assigned to d1 and the value 3 to n1. Because %n can never get an input failure the value
-     of 3 is also assigned to n2. The value of d2 is not affected. The value 1 is assigned to i.
-
-22   EXAMPLE 5 In these examples, multibyte characters do have a state-dependent encoding, and the
-     members of the extended character set that consist of more than one byte each consist of exactly two bytes,
-     the first of which is denoted here by a and the second by an uppercase letter, but are only recognized as
-     such when in the alternate shift state. The shift sequences are denoted by (uparrow) and (downarrow), in which the first causes
-     entry into the alternate shift state.
-23   After the call:
-
-
-
-
-[<a name="p288" href="#p288">page 288</a>] (<a href="#Contents">Contents</a>)
-
-               #include <a href="#7.19">&lt;stdio.h&gt;</a>
-               /* ... */
-               char str[50];
-               fscanf(stdin, "a%s", str);
-     with the input line:
-               a(uparrow) X Y(downarrow) bc
-     str will contain (uparrow) X Y(downarrow)\0 assuming that none of the bytes of the shift sequences (or of the multibyte
-     characters, in the more general case) appears to be a single-byte white-space character.
-24   In contrast, after the call:
-               #include <a href="#7.19">&lt;stdio.h&gt;</a>
-               #include <a href="#7.17">&lt;stddef.h&gt;</a>
-               /* ... */
-               wchar_t wstr[50];
-               fscanf(stdin, "a%ls", wstr);
-     with the same input line, wstr will contain the two wide characters that correspond to X and Y and a
-     terminating null wide character.
-25   However, the call:
-               #include <a href="#7.19">&lt;stdio.h&gt;</a>
-               #include <a href="#7.17">&lt;stddef.h&gt;</a>
-               /* ... */
-               wchar_t wstr[50];
-               fscanf(stdin, "a(uparrow) X(downarrow)%ls", wstr);
-     with the same input line will return zero due to a matching failure against the (downarrow) sequence in the format
-     string.
-26   Assuming that the first byte of the multibyte character X is the same as the first byte of the multibyte
-     character Y, after the call:
-               #include <a href="#7.19">&lt;stdio.h&gt;</a>
-               #include <a href="#7.17">&lt;stddef.h&gt;</a>
+</pre>
+ p is assigned the address of the first element of an array of two ints, the first having the value previously
+ pointed to by p and the second, zero. The expressions in this compound literal need not be constant. The
+ unnamed object has automatic storage duration.
+<p><!--para 11 -->
+ EXAMPLE 3 Initializers with designations can be combined with compound literals. Structure objects
+ created using compound literals can be passed to functions without depending on member order:
+<pre>
+          drawline((struct point){.x=1, .y=1},
+                (struct point){.x=3, .y=4});
+</pre>
+ Or, if drawline instead expected pointers to struct point:
+<pre>
+          drawline(&amp;(struct point){.x=1, .y=1},
+                &amp;(struct point){.x=3, .y=4});
+</pre>
+<p><!--para 12 -->
+ EXAMPLE 4       A read-only compound literal can be specified through constructions like:
+<pre>
+          (const float []){1e0, 1e1, 1e2, 1e3, 1e4, 1e5, 1e6}
+</pre>
+<!--page 89 -->
+<p><!--para 13 -->
+ EXAMPLE 5        The following three expressions have different meanings:
+<pre>
+          "/tmp/fileXXXXXX"
+          (char []){"/tmp/fileXXXXXX"}
+          (const char []){"/tmp/fileXXXXXX"}
+</pre>
+ The first always has static storage duration and has type array of char, but need not be modifiable; the last
+ two have automatic storage duration when they occur within the body of a function, and the first of these
+ two is modifiable.
+<p><!--para 14 -->
+ EXAMPLE 6 Like string literals, const-qualified compound literals can be placed into read-only memory
+ and can even be shared. For example,
+<pre>
+          (const char []){"abc"} == "abc"
+</pre>
+ might yield 1 if the literals' storage is shared.
+<p><!--para 15 -->
+ EXAMPLE 7 Since compound literals are unnamed, a single compound literal cannot specify a circularly
+ linked object. For example, there is no way to write a self-referential compound literal that could be used
+ as the function argument in place of the named object endless_zeros below:
+<pre>
+          struct int_list { int car; struct int_list *cdr; };
+          struct int_list endless_zeros = {0, &amp;endless_zeros};
+          eval(endless_zeros);
+</pre>
+<p><!--para 16 -->
+ EXAMPLE 8        Each compound literal creates only a single object in a given scope:
+<pre>
+          struct s { int i; };
+          int f (void)
+          {
+                struct s *p = 0, *q;
+                int j = 0;
+          again:
+                q = p, p = &amp;((struct s){ j++ });
+                if (j &lt; 2) goto again;
+                    return p == q &amp;&amp; q-&gt;i == 1;
+          }
+</pre>
+ The function f() always returns the value 1.
+<p><!--para 17 -->
+ Note that if an iteration statement were used instead of an explicit goto and a labeled statement, the
+ lifetime of the unnamed object would be the body of the loop only, and on entry next time around p would
+ have an indeterminate value, which would result in undefined behavior.
+<p><b> Forward references</b>: type names (<a href="#6.7.6">6.7.6</a>), initialization (<a href="#6.7.8">6.7.8</a>).
+<!--page 90 -->
+
+<p><b>Footnotes</b>
+<p><small><a name="note84" href="#note84">84)</a> Note that this differs from a cast expression. For example, a cast specifies a conversion to scalar types
+ or void only, and the result of a cast expression is not an lvalue.
+</small>
+<p><small><a name="note85" href="#note85">85)</a> For example, subobjects without explicit initializers are initialized to zero.
+</small>
+<p><small><a name="note86" href="#note86">86)</a> This allows implementations to share storage for string literals and constant compound literals with
+ the same or overlapping representations.
+</small>
+
+<h4><a name="6.5.3" href="#6.5.3">6.5.3 Unary operators</a></h4>
+<p><b>Syntax</b>
+<p><!--para 1 -->
+<pre>
+          unary-expression:
+                 postfix-expression
+                 ++ unary-expression
+                 -- unary-expression
+                 unary-operator cast-expression
+                 sizeof unary-expression
+                 sizeof ( type-name )
+          unary-operator: one of
+                 &amp; * + - ~             !
+</pre>
+
+<h5><a name="6.5.3.1" href="#6.5.3.1">6.5.3.1 Prefix increment and decrement operators</a></h5>
+<p><b>Constraints</b>
+<p><!--para 1 -->
+ The operand of the prefix increment or decrement operator shall have qualified or
+ unqualified real or pointer type and shall be a modifiable lvalue.
+<p><b>Semantics</b>
+<p><!--para 2 -->
+ The value of the operand of the prefix ++ operator is incremented. The result is the new
+ value of the operand after incrementation. The expression ++E is equivalent to (E+=1).
+ See the discussions of additive operators and compound assignment for information on
+ constraints, types, side effects, and conversions and the effects of operations on pointers.
+<p><!--para 3 -->
+ The prefix -- operator is analogous to the prefix ++ operator, except that the value of the
+ operand is decremented.
+<p><b> Forward references</b>: additive operators (<a href="#6.5.6">6.5.6</a>), compound assignment (<a href="#6.5.16.2">6.5.16.2</a>).
+
+<h5><a name="6.5.3.2" href="#6.5.3.2">6.5.3.2 Address and indirection operators</a></h5>
+<p><b>Constraints</b>
+<p><!--para 1 -->
+ The operand of the unary &amp; operator shall be either a function designator, the result of a
+ [] or unary * operator, or an lvalue that designates an object that is not a bit-field and is
+ not declared with the register storage-class specifier.
+<p><!--para 2 -->
+ The operand of the unary * operator shall have pointer type.
+<p><b>Semantics</b>
+<p><!--para 3 -->
+ The unary &amp; operator yields the address of its operand. If the operand has type ''type'',
+ the result has type ''pointer to type''. If the operand is the result of a unary * operator,
+ neither that operator nor the &amp; operator is evaluated and the result is as if both were
+ omitted, except that the constraints on the operators still apply and the result is not an
+ lvalue. Similarly, if the operand is the result of a [] operator, neither the &amp; operator nor
+<!--page 91 -->
+ the unary * that is implied by the [] is evaluated and the result is as if the &amp; operator
+ were removed and the [] operator were changed to a + operator. Otherwise, the result is
+ a pointer to the object or function designated by its operand.
+<p><!--para 4 -->
+ The unary * operator denotes indirection. If the operand points to a function, the result is
+ a function designator; if it points to an object, the result is an lvalue designating the
+ object. If the operand has type ''pointer to type'', the result has type ''type''. If an
+ invalid value has been assigned to the pointer, the behavior of the unary * operator is
+ undefined.<sup><a href="#note87"><b>87)</b></a></sup>
+<p><b> Forward references</b>: storage-class specifiers (<a href="#6.7.1">6.7.1</a>), structure and union specifiers
+ (<a href="#6.7.2.1">6.7.2.1</a>).
+
+<p><b>Footnotes</b>
+<p><small><a name="note87" href="#note87">87)</a> Thus, &amp;*E is equivalent to E (even if E is a null pointer), and &amp;(E1[E2]) to ((E1)+(E2)). It is
+ always true that if E is a function designator or an lvalue that is a valid operand of the unary &amp;
+ operator, *&amp;E is a function designator or an lvalue equal to E. If *P is an lvalue and T is the name of
+ an object pointer type, *(T)P is an lvalue that has a type compatible with that to which T points.
+  Among the invalid values for dereferencing a pointer by the unary * operator are a null pointer, an
+  address inappropriately aligned for the type of object pointed to, and the address of an object after the
+  end of its lifetime.
+</small>
+
+<h5><a name="6.5.3.3" href="#6.5.3.3">6.5.3.3 Unary arithmetic operators</a></h5>
+<p><b>Constraints</b>
+<p><!--para 1 -->
+ The operand of the unary + or - operator shall have arithmetic type; of the ~ operator,
+ integer type; of the ! operator, scalar type.
+<p><b>Semantics</b>
+<p><!--para 2 -->
+ The result of the unary + operator is the value of its (promoted) operand. The integer
+ promotions are performed on the operand, and the result has the promoted type.
+<p><!--para 3 -->
+ The result of the unary - operator is the negative of its (promoted) operand. The integer
+ promotions are performed on the operand, and the result has the promoted type.
+<p><!--para 4 -->
+ The result of the ~ operator is the bitwise complement of its (promoted) operand (that is,
+ each bit in the result is set if and only if the corresponding bit in the converted operand is
+ not set). The integer promotions are performed on the operand, and the result has the
+ promoted type. If the promoted type is an unsigned type, the expression ~E is equivalent
+ to the maximum value representable in that type minus E.
+<p><!--para 5 -->
+ The result of the logical negation operator ! is 0 if the value of its operand compares
+ unequal to 0, 1 if the value of its operand compares equal to 0. The result has type int.
+ The expression !E is equivalent to (0==E).
+<!--page 92 -->
+
+<h5><a name="6.5.3.4" href="#6.5.3.4">6.5.3.4 The sizeof operator</a></h5>
+<p><b>Constraints</b>
+<p><!--para 1 -->
+ The sizeof operator shall not be applied to an expression that has function type or an
+ incomplete type, to the parenthesized name of such a type, or to an expression that
+ designates a bit-field member.
+<p><b>Semantics</b>
+<p><!--para 2 -->
+ The sizeof operator yields the size (in bytes) of its operand, which may be an
+ expression or the parenthesized name of a type. The size is determined from the type of
+ the operand. The result is an integer. If the type of the operand is a variable length array
+ type, the operand is evaluated; otherwise, the operand is not evaluated and the result is an
+ integer constant.
+<p><!--para 3 -->
+ When applied to an operand that has type char, unsigned char, or signed char,
+ (or a qualified version thereof) the result is 1. When applied to an operand that has array
+ type, the result is the total number of bytes in the array.<sup><a href="#note88"><b>88)</b></a></sup> When applied to an operand
+ that has structure or union type, the result is the total number of bytes in such an object,
+ including internal and trailing padding.
+<p><!--para 4 -->
+ The value of the result is implementation-defined, and its type (an unsigned integer type)
+ is size_t, defined in <a href="#7.17">&lt;stddef.h&gt;</a> (and other headers).
+<p><!--para 5 -->
+ EXAMPLE 1 A principal use of the sizeof operator is in communication with routines such as storage
+ allocators and I/O systems. A storage-allocation function might accept a size (in bytes) of an object to
+ allocate and return a pointer to void. For example:
+<pre>
+         extern void *alloc(size_t);
+         double *dp = alloc(sizeof *dp);
+</pre>
+ The implementation of the alloc function should ensure that its return value is aligned suitably for
+ conversion to a pointer to double.
+<p><!--para 6 -->
+ EXAMPLE 2      Another use of the sizeof operator is to compute the number of elements in an array:
+<pre>
+         sizeof array / sizeof array[0]
+</pre>
+<p><!--para 7 -->
+ EXAMPLE 3      In this example, the size of a variable length array is computed and returned from a
+ function:
+<pre>
+         #include <a href="#7.17">&lt;stddef.h&gt;</a>
+         size_t fsize3(int n)
+         {
+               char b[n+3];                  // variable length array
+               return sizeof b;              // execution time sizeof
+         }
+</pre>
+<!--page 93 -->
+<pre>
+          int main()
+          {
+                size_t size;
+                size = fsize3(10); // fsize3 returns 13
+                return 0;
+          }
+</pre>
+<p><b> Forward references</b>: common definitions <a href="#7.17">&lt;stddef.h&gt;</a> (<a href="#7.17">7.17</a>), declarations (<a href="#6.7">6.7</a>),
+ structure and union specifiers (<a href="#6.7.2.1">6.7.2.1</a>), type names (<a href="#6.7.6">6.7.6</a>), array declarators (<a href="#6.7.5.2">6.7.5.2</a>).
+
+<p><b>Footnotes</b>
+<p><small><a name="note88" href="#note88">88)</a> When applied to a parameter declared to have array or function type, the sizeof operator yields the
+ size of the adjusted (pointer) type (see <a href="#6.9.1">6.9.1</a>).
+</small>
+
+<h4><a name="6.5.4" href="#6.5.4">6.5.4 Cast operators</a></h4>
+<p><b>Syntax</b>
+<p><!--para 1 -->
+<pre>
+          cast-expression:
+                 unary-expression
+                 ( type-name ) cast-expression
+</pre>
+<p><b>Constraints</b>
+<p><!--para 2 -->
+ Unless the type name specifies a void type, the type name shall specify qualified or
+ unqualified scalar type and the operand shall have scalar type.
+<p><!--para 3 -->
+ Conversions that involve pointers, other than where permitted by the constraints of
+ <a href="#6.5.16.1">6.5.16.1</a>, shall be specified by means of an explicit cast.
+<p><b>Semantics</b>
+<p><!--para 4 -->
+ Preceding an expression by a parenthesized type name converts the value of the
+ expression to the named type. This construction is called a cast.<sup><a href="#note89"><b>89)</b></a></sup> A cast that specifies
+ no conversion has no effect on the type or value of an expression.
+<p><!--para 5 -->
+ If the value of the expression is represented with greater precision or range than required
+ by the type named by the cast (<a href="#6.3.1.8">6.3.1.8</a>), then the cast specifies a conversion even if the
+ type of the expression is the same as the named type.
+<p><b> Forward references</b>: equality operators (<a href="#6.5.9">6.5.9</a>), function declarators (including
+ prototypes) (<a href="#6.7.5.3">6.7.5.3</a>), simple assignment (<a href="#6.5.16.1">6.5.16.1</a>), type names (<a href="#6.7.6">6.7.6</a>).
+<!--page 94 -->
+
+<p><b>Footnotes</b>
+<p><small><a name="note89" href="#note89">89)</a> A cast does not yield an lvalue. Thus, a cast to a qualified type has the same effect as a cast to the
+ unqualified version of the type.
+</small>
+
+<h4><a name="6.5.5" href="#6.5.5">6.5.5 Multiplicative operators</a></h4>
+<p><b>Syntax</b>
+<p><!--para 1 -->
+<pre>
+          multiplicative-expression:
+                  cast-expression
+                  multiplicative-expression * cast-expression
+                  multiplicative-expression / cast-expression
+                  multiplicative-expression % cast-expression
+</pre>
+<p><b>Constraints</b>
+<p><!--para 2 -->
+ Each of the operands shall have arithmetic type. The operands of the % operator shall
+ have integer type.
+<p><b>Semantics</b>
+<p><!--para 3 -->
+ The usual arithmetic conversions are performed on the operands.
+<p><!--para 4 -->
+ The result of the binary * operator is the product of the operands.
+<p><!--para 5 -->
+ The result of the / operator is the quotient from the division of the first operand by the
+ second; the result of the % operator is the remainder. In both operations, if the value of
+ the second operand is zero, the behavior is undefined.
+<p><!--para 6 -->
+ When integers are divided, the result of the / operator is the algebraic quotient with any
+ fractional part discarded.<sup><a href="#note90"><b>90)</b></a></sup> If the quotient a/b is representable, the expression
+ (a/b)*b + a%b shall equal a.
+
+<p><b>Footnotes</b>
+<p><small><a name="note90" href="#note90">90)</a> This is often called ''truncation toward zero''.
+</small>
+
+<h4><a name="6.5.6" href="#6.5.6">6.5.6 Additive operators</a></h4>
+<p><b>Syntax</b>
+<p><!--para 1 -->
+<pre>
+          additive-expression:
+                  multiplicative-expression
+                  additive-expression + multiplicative-expression
+                  additive-expression - multiplicative-expression
+</pre>
+<p><b>Constraints</b>
+<p><!--para 2 -->
+ For addition, either both operands shall have arithmetic type, or one operand shall be a
+ pointer to an object type and the other shall have integer type. (Incrementing is
+ equivalent to adding 1.)
+<p><!--para 3 -->
+ For subtraction, one of the following shall hold:
+<ul>
+<li>  both operands have arithmetic type;
+<!--page 95 -->
+<li>  both operands are pointers to qualified or unqualified versions of compatible object
+ types; or
+<li>  the left operand is a pointer to an object type and the right operand has integer type.
+</ul>
+ (Decrementing is equivalent to subtracting 1.)
+<p><b>Semantics</b>
+<p><!--para 4 -->
+ If both operands have arithmetic type, the usual arithmetic conversions are performed on
+ them.
+<p><!--para 5 -->
+ The result of the binary + operator is the sum of the operands.
+<p><!--para 6 -->
+ The result of the binary - operator is the difference resulting from the subtraction of the
+ second operand from the first.
+<p><!--para 7 -->
+ For the purposes of these operators, a pointer to an object that is not an element of an
+ array behaves the same as a pointer to the first element of an array of length one with the
+ type of the object as its element type.
+<p><!--para 8 -->
+ When an expression that has integer type is added to or subtracted from a pointer, the
+ result has the type of the pointer operand. If the pointer operand points to an element of
+ an array object, and the array is large enough, the result points to an element offset from
+ the original element such that the difference of the subscripts of the resulting and original
+ array elements equals the integer expression. In other words, if the expression P points to
+ the i-th element of an array object, the expressions (P)+N (equivalently, N+(P)) and
+ (P)-N (where N has the value n) point to, respectively, the i+n-th and i-n-th elements of
+ the array object, provided they exist. Moreover, if the expression P points to the last
+ element of an array object, the expression (P)+1 points one past the last element of the
+ array object, and if the expression Q points one past the last element of an array object,
+ the expression (Q)-1 points to the last element of the array object. If both the pointer
+ operand and the result point to elements of the same array object, or one past the last
+ element of the array object, the evaluation shall not produce an overflow; otherwise, the
+ behavior is undefined. If the result points one past the last element of the array object, it
+ shall not be used as the operand of a unary * operator that is evaluated.
+<p><!--para 9 -->
+ When two pointers are subtracted, both shall point to elements of the same array object,
+ or one past the last element of the array object; the result is the difference of the
+ subscripts of the two array elements. The size of the result is implementation-defined,
+ and its type (a signed integer type) is ptrdiff_t defined in the <a href="#7.17">&lt;stddef.h&gt;</a> header.
+ If the result is not representable in an object of that type, the behavior is undefined. In
+ other words, if the expressions P and Q point to, respectively, the i-th and j-th elements of
+ an array object, the expression (P)-(Q) has the value i-j provided the value fits in an
+ object of type ptrdiff_t. Moreover, if the expression P points either to an element of
+ an array object or one past the last element of an array object, and the expression Q points
+ to the last element of the same array object, the expression ((Q)+1)-(P) has the same
+<!--page 96 -->
+ value as ((Q)-(P))+1 and as -((P)-((Q)+1)), and has the value zero if the
+ expression P points one past the last element of the array object, even though the
+ expression (Q)+1 does not point to an element of the array object.<sup><a href="#note91"><b>91)</b></a></sup>
+<p><!--para 10 -->
+ EXAMPLE        Pointer arithmetic is well defined with pointers to variable length array types.
+<pre>
+          {
+                   int n = 4, m = 3;
+                   int a[n][m];
+                   int (*p)[m] = a;            //   p == &amp;a[0]
+                   p += 1;                     //   p == &amp;a[1]
+                   (*p)[2] = 99;               //   a[1][2] == 99
+                   n = p - a;                  //   n == 1
+          }
+</pre>
+<p><!--para 11 -->
+ If array a in the above example were declared to be an array of known constant size, and pointer p were
+ declared to be a pointer to an array of the same known constant size (pointing to a), the results would be
+ the same.
+<p><b> Forward references</b>: array declarators (<a href="#6.7.5.2">6.7.5.2</a>), common definitions <a href="#7.17">&lt;stddef.h&gt;</a>
+ (<a href="#7.17">7.17</a>).
+
+<p><b>Footnotes</b>
+<p><small><a name="note91" href="#note91">91)</a> Another way to approach pointer arithmetic is first to convert the pointer(s) to character pointer(s): In
+ this scheme the integer expression added to or subtracted from the converted pointer is first multiplied
+ by the size of the object originally pointed to, and the resulting pointer is converted back to the
+ original type. For pointer subtraction, the result of the difference between the character pointers is
+ similarly divided by the size of the object originally pointed to.
+  When viewed in this way, an implementation need only provide one extra byte (which may overlap
+  another object in the program) just after the end of the object in order to satisfy the ''one past the last
+  element'' requirements.
+</small>
+
+<h4><a name="6.5.7" href="#6.5.7">6.5.7 Bitwise shift operators</a></h4>
+<p><b>Syntax</b>
+<p><!--para 1 -->
+<pre>
+          shift-expression:
+                  additive-expression
+                  shift-expression &lt;&lt; additive-expression
+                  shift-expression &gt;&gt; additive-expression
+</pre>
+<p><b>Constraints</b>
+<p><!--para 2 -->
+ Each of the operands shall have integer type.
+<p><b>Semantics</b>
+<p><!--para 3 -->
+ The integer promotions are performed on each of the operands. The type of the result is
+ that of the promoted left operand. If the value of the right operand is negative or is
+ greater than or equal to the width of the promoted left operand, the behavior is undefined.
+<!--page 97 -->
+<p><!--para 4 -->
+ The result of E1 &lt;&lt; E2 is E1 left-shifted E2 bit positions; vacated bits are filled with
+ zeros. If E1 has an unsigned type, the value of the result is E1 x 2E2 , reduced modulo
+ one more than the maximum value representable in the result type. If E1 has a signed
+ type and nonnegative value, and E1 x 2E2 is representable in the result type, then that is
+ the resulting value; otherwise, the behavior is undefined.
+<p><!--para 5 -->
+ The result of E1 &gt;&gt; E2 is E1 right-shifted E2 bit positions. If E1 has an unsigned type
+ or if E1 has a signed type and a nonnegative value, the value of the result is the integral
+ part of the quotient of E1 / 2E2 . If E1 has a signed type and a negative value, the
+ resulting value is implementation-defined.
+
+<h4><a name="6.5.8" href="#6.5.8">6.5.8 Relational operators</a></h4>
+<p><b>Syntax</b>
+<p><!--para 1 -->
+<pre>
+          relational-expression:
+                  shift-expression
+                  relational-expression   &lt;    shift-expression
+                  relational-expression   &gt;    shift-expression
+                  relational-expression   &lt;=   shift-expression
+                  relational-expression   &gt;=   shift-expression
+</pre>
+<p><b>Constraints</b>
+<p><!--para 2 -->
+ One of the following shall hold:
+<ul>
+<li>  both operands have real type;
+<li>  both operands are pointers to qualified or unqualified versions of compatible object
+ types; or
+<li>  both operands are pointers to qualified or unqualified versions of compatible
+ incomplete types.
+</ul>
+<p><b>Semantics</b>
+<p><!--para 3 -->
+ If both of the operands have arithmetic type, the usual arithmetic conversions are
+ performed.
+<p><!--para 4 -->
+ For the purposes of these operators, a pointer to an object that is not an element of an
+ array behaves the same as a pointer to the first element of an array of length one with the
+ type of the object as its element type.
+<p><!--para 5 -->
+ When two pointers are compared, the result depends on the relative locations in the
+ address space of the objects pointed to. If two pointers to object or incomplete types both
+ point to the same object, or both point one past the last element of the same array object,
+ they compare equal. If the objects pointed to are members of the same aggregate object,
+ pointers to structure members declared later compare greater than pointers to members
+ declared earlier in the structure, and pointers to array elements with larger subscript
+<!--page 98 -->
+ values compare greater than pointers to elements of the same array with lower subscript
+ values. All pointers to members of the same union object compare equal. If the
+ expression P points to an element of an array object and the expression Q points to the
+ last element of the same array object, the pointer expression Q+1 compares greater than
+ P. In all other cases, the behavior is undefined.
+<p><!--para 6 -->
+ Each of the operators &lt; (less than), &gt; (greater than), &lt;= (less than or equal to), and &gt;=
+ (greater than or equal to) shall yield 1 if the specified relation is true and 0 if it is false.<sup><a href="#note92"><b>92)</b></a></sup>
+ The result has type int.
+
+<p><b>Footnotes</b>
+<p><small><a name="note92" href="#note92">92)</a> The expression a&lt;b&lt;c is not interpreted as in ordinary mathematics. As the syntax indicates, it
+ means (a&lt;b)&lt;c; in other words, ''if a is less than b, compare 1 to c; otherwise, compare 0 to c''.
+</small>
+
+<h4><a name="6.5.9" href="#6.5.9">6.5.9 Equality operators</a></h4>
+<p><b>Syntax</b>
+<p><!--para 1 -->
+<pre>
+          equality-expression:
+                  relational-expression
+                 equality-expression == relational-expression
+                 equality-expression != relational-expression
+</pre>
+<p><b>Constraints</b>
+<p><!--para 2 -->
+ One of the following shall hold:
+<ul>
+<li>  both operands have arithmetic type;
+<li>  both operands are pointers to qualified or unqualified versions of compatible types;
+<li>  one operand is a pointer to an object or incomplete type and the other is a pointer to a
+ qualified or unqualified version of void; or
+<li>  one operand is a pointer and the other is a null pointer constant.
+</ul>
+<p><b>Semantics</b>
+<p><!--para 3 -->
+ The == (equal to) and != (not equal to) operators are analogous to the relational
+ operators except for their lower precedence.<sup><a href="#note93"><b>93)</b></a></sup> Each of the operators yields 1 if the
+ specified relation is true and 0 if it is false. The result has type int. For any pair of
+ operands, exactly one of the relations is true.
+<p><!--para 4 -->
+ If both of the operands have arithmetic type, the usual arithmetic conversions are
+ performed. Values of complex types are equal if and only if both their real parts are equal
+ and also their imaginary parts are equal. Any two values of arithmetic types from
+ different type domains are equal if and only if the results of their conversions to the
+ (complex) result type determined by the usual arithmetic conversions are equal.
+<!--page 99 -->
+<p><!--para 5 -->
+ Otherwise, at least one operand is a pointer. If one operand is a pointer and the other is a
+ null pointer constant, the null pointer constant is converted to the type of the pointer. If
+ one operand is a pointer to an object or incomplete type and the other is a pointer to a
+ qualified or unqualified version of void, the former is converted to the type of the latter.
+<p><!--para 6 -->
+ Two pointers compare equal if and only if both are null pointers, both are pointers to the
+ same object (including a pointer to an object and a subobject at its beginning) or function,
+ both are pointers to one past the last element of the same array object, or one is a pointer
+ to one past the end of one array object and the other is a pointer to the start of a different
+ array object that happens to immediately follow the first array object in the address
+ space.<sup><a href="#note94"><b>94)</b></a></sup>
+<p><!--para 7 -->
+ For the purposes of these operators, a pointer to an object that is not an element of an
+ array behaves the same as a pointer to the first element of an array of length one with the
+ type of the object as its element type.
+
+<p><b>Footnotes</b>
+<p><small><a name="note93" href="#note93">93)</a> Because of the precedences, a&lt;b == c&lt;d is 1 whenever a&lt;b and c&lt;d have the same truth-value.
+</small>
+<p><small><a name="note94" href="#note94">94)</a> Two objects may be adjacent in memory because they are adjacent elements of a larger array or
+ adjacent members of a structure with no padding between them, or because the implementation chose
+ to place them so, even though they are unrelated. If prior invalid pointer operations (such as accesses
+ outside array bounds) produced undefined behavior, subsequent comparisons also produce undefined
+ behavior.
+</small>
+
+<h4><a name="6.5.10" href="#6.5.10">6.5.10 Bitwise AND operator</a></h4>
+<p><b>Syntax</b>
+<p><!--para 1 -->
+<pre>
+          AND-expression:
+                equality-expression
+                AND-expression &amp; equality-expression
+</pre>
+<p><b>Constraints</b>
+<p><!--para 2 -->
+ Each of the operands shall have integer type.
+<p><b>Semantics</b>
+<p><!--para 3 -->
+ The usual arithmetic conversions are performed on the operands.
+<p><!--para 4 -->
+ The result of the binary &amp; operator is the bitwise AND of the operands (that is, each bit in
+ the result is set if and only if each of the corresponding bits in the converted operands is
+ set).
+<!--page 100 -->
+
+<h4><a name="6.5.11" href="#6.5.11">6.5.11 Bitwise exclusive OR operator</a></h4>
+<p><b>Syntax</b>
+<p><!--para 1 -->
+<pre>
+          exclusive-OR-expression:
+                  AND-expression
+                  exclusive-OR-expression ^ AND-expression
+</pre>
+<p><b>Constraints</b>
+<p><!--para 2 -->
+ Each of the operands shall have integer type.
+<p><b>Semantics</b>
+<p><!--para 3 -->
+ The usual arithmetic conversions are performed on the operands.
+<p><!--para 4 -->
+ The result of the ^ operator is the bitwise exclusive OR of the operands (that is, each bit
+ in the result is set if and only if exactly one of the corresponding bits in the converted
+ operands is set).
+
+<h4><a name="6.5.12" href="#6.5.12">6.5.12 Bitwise inclusive OR operator</a></h4>
+<p><b>Syntax</b>
+<p><!--para 1 -->
+<pre>
+          inclusive-OR-expression:
+                  exclusive-OR-expression
+                  inclusive-OR-expression | exclusive-OR-expression
+</pre>
+<p><b>Constraints</b>
+<p><!--para 2 -->
+ Each of the operands shall have integer type.
+<p><b>Semantics</b>
+<p><!--para 3 -->
+ The usual arithmetic conversions are performed on the operands.
+<p><!--para 4 -->
+ The result of the | operator is the bitwise inclusive OR of the operands (that is, each bit in
+ the result is set if and only if at least one of the corresponding bits in the converted
+ operands is set).
+<!--page 101 -->
+
+<h4><a name="6.5.13" href="#6.5.13">6.5.13 Logical AND operator</a></h4>
+<p><b>Syntax</b>
+<p><!--para 1 -->
+<pre>
+           logical-AND-expression:
+                   inclusive-OR-expression
+                   logical-AND-expression &amp;&amp; inclusive-OR-expression
+</pre>
+<p><b>Constraints</b>
+<p><!--para 2 -->
+ Each of the operands shall have scalar type.
+<p><b>Semantics</b>
+<p><!--para 3 -->
+ The &amp;&amp; operator shall yield 1 if both of its operands compare unequal to 0; otherwise, it
+ yields 0. The result has type int.
+<p><!--para 4 -->
+ Unlike the bitwise binary &amp; operator, the &amp;&amp; operator guarantees left-to-right evaluation;
+ there is a sequence point after the evaluation of the first operand. If the first operand
+ compares equal to 0, the second operand is not evaluated.
+
+<h4><a name="6.5.14" href="#6.5.14">6.5.14 Logical OR operator</a></h4>
+<p><b>Syntax</b>
+<p><!--para 1 -->
+<pre>
+           logical-OR-expression:
+                   logical-AND-expression
+                   logical-OR-expression || logical-AND-expression
+</pre>
+<p><b>Constraints</b>
+<p><!--para 2 -->
+ Each of the operands shall have scalar type.
+<p><b>Semantics</b>
+<p><!--para 3 -->
+ The || operator shall yield 1 if either of its operands compare unequal to 0; otherwise, it
+ yields 0. The result has type int.
+<p><!--para 4 -->
+ Unlike the bitwise | operator, the || operator guarantees left-to-right evaluation; there is
+ a sequence point after the evaluation of the first operand. If the first operand compares
+ unequal to 0, the second operand is not evaluated.
+<!--page 102 -->
+
+<h4><a name="6.5.15" href="#6.5.15">6.5.15 Conditional operator</a></h4>
+<p><b>Syntax</b>
+<p><!--para 1 -->
+<pre>
+          conditional-expression:
+                 logical-OR-expression
+                 logical-OR-expression ? expression : conditional-expression
+</pre>
+<p><b>Constraints</b>
+<p><!--para 2 -->
+ The first operand shall have scalar type.
+<p><!--para 3 -->
+ One of the following shall hold for the second and third operands:
+<ul>
+<li>  both operands have arithmetic type;
+<li>  both operands have the same structure or union type;
+<li>  both operands have void type;
+<li>  both operands are pointers to qualified or unqualified versions of compatible types;
+<li>  one operand is a pointer and the other is a null pointer constant; or
+<li>  one operand is a pointer to an object or incomplete type and the other is a pointer to a
+ qualified or unqualified version of void.
+</ul>
+<p><b>Semantics</b>
+<p><!--para 4 -->
+ The first operand is evaluated; there is a sequence point after its evaluation. The second
+ operand is evaluated only if the first compares unequal to 0; the third operand is evaluated
+ only if the first compares equal to 0; the result is the value of the second or third operand
+ (whichever is evaluated), converted to the type described below.<sup><a href="#note95"><b>95)</b></a></sup> If an attempt is made
+ to modify the result of a conditional operator or to access it after the next sequence point,
+ the behavior is undefined.
+<p><!--para 5 -->
+ If both the second and third operands have arithmetic type, the result type that would be
+ determined by the usual arithmetic conversions, were they applied to those two operands,
+ is the type of the result. If both the operands have structure or union type, the result has
+ that type. If both operands have void type, the result has void type.
+<p><!--para 6 -->
+ If both the second and third operands are pointers or one is a null pointer constant and the
+ other is a pointer, the result type is a pointer to a type qualified with all the type qualifiers
+ of the types pointed-to by both operands. Furthermore, if both operands are pointers to
+ compatible types or to differently qualified versions of compatible types, the result type is
+ a pointer to an appropriately qualified version of the composite type; if one operand is a
+ null pointer constant, the result has the type of the other operand; otherwise, one operand
+ is a pointer to void or a qualified version of void, in which case the result type is a
+<!--page 103 -->
+ pointer to an appropriately qualified version of void.
+<p><!--para 7 -->
+ EXAMPLE The common type that results when the second and third operands are pointers is determined
+ in two independent stages. The appropriate qualifiers, for example, do not depend on whether the two
+ pointers have compatible types.
+<p><!--para 8 -->
+ Given the declarations
+<pre>
+          const void *c_vp;
+          void *vp;
+          const int *c_ip;
+          volatile int *v_ip;
+          int *ip;
+          const char *c_cp;
+</pre>
+ the third column in the following table is the common type that is the result of a conditional expression in
+ which the first two columns are the second and third operands (in either order):
+<pre>
+          c_vp     c_ip      const void *
+          v_ip     0         volatile int *
+          c_ip     v_ip      const volatile int *
+          vp       c_cp      const void *
+          ip       c_ip      const int *
+          vp       ip        void *
+</pre>
+
+<p><b>Footnotes</b>
+<p><small><a name="note95" href="#note95">95)</a> A conditional expression does not yield an lvalue.
+</small>
+
+<h4><a name="6.5.16" href="#6.5.16">6.5.16 Assignment operators</a></h4>
+<p><b>Syntax</b>
+<p><!--para 1 -->
+<pre>
+          assignment-expression:
+                 conditional-expression
+                 unary-expression assignment-operator assignment-expression
+          assignment-operator: one of
+                 = *= /= %= +=                       -=     &lt;&lt;=      &gt;&gt;=      &amp;=     ^=     |=
+</pre>
+<p><b>Constraints</b>
+<p><!--para 2 -->
+ An assignment operator shall have a modifiable lvalue as its left operand.
+<p><b>Semantics</b>
+<p><!--para 3 -->
+ An assignment operator stores a value in the object designated by the left operand. An
+ assignment expression has the value of the left operand after the assignment, but is not an
+ lvalue. The type of an assignment expression is the type of the left operand unless the
+ left operand has qualified type, in which case it is the unqualified version of the type of
+ the left operand. The side effect of updating the stored value of the left operand shall
+ occur between the previous and the next sequence point.
+<p><!--para 4 -->
+ The order of evaluation of the operands is unspecified. If an attempt is made to modify
+ the result of an assignment operator or to access it after the next sequence point, the
+ behavior is undefined.
+<!--page 104 -->
+
+<h5><a name="6.5.16.1" href="#6.5.16.1">6.5.16.1 Simple assignment</a></h5>
+<p><b>Constraints</b>
+<p><!--para 1 -->
+ One of the following shall hold:<sup><a href="#note96"><b>96)</b></a></sup>
+<ul>
+<li>  the left operand has qualified or unqualified arithmetic type and the right has
+ arithmetic type;
+<li>  the left operand has a qualified or unqualified version of a structure or union type
+ compatible with the type of the right;
+<li>  both operands are pointers to qualified or unqualified versions of compatible types,
+ and the type pointed to by the left has all the qualifiers of the type pointed to by the
+ right;
+<li>  one operand is a pointer to an object or incomplete type and the other is a pointer to a
+ qualified or unqualified version of void, and the type pointed to by the left has all
+ the qualifiers of the type pointed to by the right;
+<li>  the left operand is a pointer and the right is a null pointer constant; or
+<li>  the left operand has type _Bool and the right is a pointer.
+</ul>
+<p><b>Semantics</b>
+<p><!--para 2 -->
+ In simple assignment (=), the value of the right operand is converted to the type of the
+ assignment expression and replaces the value stored in the object designated by the left
+ operand.
+<p><!--para 3 -->
+ If the value being stored in an object is read from another object that overlaps in any way
+ the storage of the first object, then the overlap shall be exact and the two objects shall
+ have qualified or unqualified versions of a compatible type; otherwise, the behavior is
+ undefined.
+<p><!--para 4 -->
+ EXAMPLE 1       In the program fragment
+<pre>
+         int f(void);
+         char c;
+         /* ... */
+         if ((c = f()) == -1)
+                 /* ... */
+</pre>
+ the int value returned by the function may be truncated when stored in the char, and then converted back
+ to int width prior to the comparison. In an implementation in which ''plain'' char has the same range of
+ values as unsigned char (and char is narrower than int), the result of the conversion cannot be
+<!--page 105 -->
+ negative, so the operands of the comparison can never compare equal. Therefore, for full portability, the
+ variable c should be declared as int.
+<p><!--para 5 -->
+ EXAMPLE 2       In the fragment:
+<pre>
+         char c;
+         int i;
+         long l;
+         l = (c = i);
+</pre>
+ the value of i is converted to the type of the assignment expression c = i, that is, char type. The value
+ of the expression enclosed in parentheses is then converted to the type of the outer assignment expression,
+ that is, long int type.
+<p><!--para 6 -->
+ EXAMPLE 3       Consider the fragment:
+<pre>
+         const char **cpp;
+         char *p;
+         const char c = 'A';
+         cpp = &amp;p;                  // constraint violation
+         *cpp = &amp;c;                 // valid
+         *p = 0;                    // valid
+</pre>
+ The first assignment is unsafe because it would allow the following valid code to attempt to change the
+ value of the const object c.
+
+<p><b>Footnotes</b>
+<p><small><a name="note96" href="#note96">96)</a> The asymmetric appearance of these constraints with respect to type qualifiers is due to the conversion
+ (specified in <a href="#6.3.2.1">6.3.2.1</a>) that changes lvalues to ''the value of the expression'' and thus removes any type
+ qualifiers that were applied to the type category of the expression (for example, it removes const but
+ not volatile from the type int volatile * const).
+</small>
+
+<h5><a name="6.5.16.2" href="#6.5.16.2">6.5.16.2 Compound assignment</a></h5>
+<p><b>Constraints</b>
+<p><!--para 1 -->
+ For the operators += and -= only, either the left operand shall be a pointer to an object
+ type and the right shall have integer type, or the left operand shall have qualified or
+ unqualified arithmetic type and the right shall have arithmetic type.
+<p><!--para 2 -->
+ For the other operators, each operand shall have arithmetic type consistent with those
+ allowed by the corresponding binary operator.
+<p><b>Semantics</b>
+<p><!--para 3 -->
+ A compound assignment of the form E1 op = E2 differs from the simple assignment
+ expression E1 = E1 op (E2) only in that the lvalue E1 is evaluated only once.
+<!--page 106 -->
+
+<h4><a name="6.5.17" href="#6.5.17">6.5.17 Comma operator</a></h4>
+<p><b>Syntax</b>
+<p><!--para 1 -->
+<pre>
+          expression:
+                 assignment-expression
+                 expression , assignment-expression
+</pre>
+<p><b>Semantics</b>
+<p><!--para 2 -->
+ The left operand of a comma operator is evaluated as a void expression; there is a
+ sequence point after its evaluation. Then the right operand is evaluated; the result has its
+ type and value.<sup><a href="#note97"><b>97)</b></a></sup> If an attempt is made to modify the result of a comma operator or to
+ access it after the next sequence point, the behavior is undefined.
+<p><!--para 3 -->
+ EXAMPLE As indicated by the syntax, the comma operator (as described in this subclause) cannot
+ appear in contexts where a comma is used to separate items in a list (such as arguments to functions or lists
+ of initializers). On the other hand, it can be used within a parenthesized expression or within the second
+ expression of a conditional operator in such contexts. In the function call
+<pre>
+          f(a, (t=3, t+2), c)
+</pre>
+ the function has three arguments, the second of which has the value 5.
+<p><b> Forward references</b>: initialization (<a href="#6.7.8">6.7.8</a>).
+<!--page 107 -->
+
+<p><b>Footnotes</b>
+<p><small><a name="note97" href="#note97">97)</a> A comma operator does not yield an lvalue.
+</small>
+
+<h3><a name="6.6" href="#6.6">6.6 Constant expressions</a></h3>
+<p><b>Syntax</b>
+<p><!--para 1 -->
+<pre>
+          constant-expression:
+                 conditional-expression
+</pre>
+<p><b>Description</b>
+<p><!--para 2 -->
+ A constant expression can be evaluated during translation rather than runtime, and
+ accordingly may be used in any place that a constant may be.
+<p><b>Constraints</b>
+<p><!--para 3 -->
+ Constant expressions shall not contain assignment, increment, decrement, function-call,
+ or comma operators, except when they are contained within a subexpression that is not
+ evaluated.<sup><a href="#note98"><b>98)</b></a></sup>
+<p><!--para 4 -->
+ Each constant expression shall evaluate to a constant that is in the range of representable
+ values for its type.
+<p><b>Semantics</b>
+<p><!--para 5 -->
+ An expression that evaluates to a constant is required in several contexts. If a floating
+ expression is evaluated in the translation environment, the arithmetic precision and range
+ shall be at least as great as if the expression were being evaluated in the execution
+ environment.
+<p><!--para 6 -->
+ An integer constant expression<sup><a href="#note99"><b>99)</b></a></sup> shall have integer type and shall only have operands
+ that are integer constants, enumeration constants, character constants, sizeof
+ expressions whose results are integer constants, and floating constants that are the
+ immediate operands of casts. Cast operators in an integer constant expression shall only
+ convert arithmetic types to integer types, except as part of an operand to the sizeof
+ operator.
+<p><!--para 7 -->
+ More latitude is permitted for constant expressions in initializers. Such a constant
+ expression shall be, or evaluate to, one of the following:
+<ul>
+<li>  an arithmetic constant expression,
+<li>  a null pointer constant,
+<!--page 108 -->
+<li>  an address constant, or
+<li>  an address constant for an object type plus or minus an integer constant expression.
+</ul>
+<p><!--para 8 -->
+ An arithmetic constant expression shall have arithmetic type and shall only have
+ operands that are integer constants, floating constants, enumeration constants, character
+ constants, and sizeof expressions. Cast operators in an arithmetic constant expression
+ shall only convert arithmetic types to arithmetic types, except as part of an operand to a
+ sizeof operator whose result is an integer constant.
+<p><!--para 9 -->
+ An address constant is a null pointer, a pointer to an lvalue designating an object of static
+ storage duration, or a pointer to a function designator; it shall be created explicitly using
+ the unary &amp; operator or an integer constant cast to pointer type, or implicitly by the use of
+ an expression of array or function type. The array-subscript [] and member-access .
+ and -&gt; operators, the address &amp; and indirection * unary operators, and pointer casts may
+ be used in the creation of an address constant, but the value of an object shall not be
+ accessed by use of these operators.
+<p><!--para 10 -->
+ An implementation may accept other forms of constant expressions.
+<p><!--para 11 -->
+ The semantic rules for the evaluation of a constant expression are the same as for
+ nonconstant expressions.<sup><a href="#note100"><b>100)</b></a></sup>
+<p><b> Forward references</b>: array declarators (<a href="#6.7.5.2">6.7.5.2</a>), initialization (<a href="#6.7.8">6.7.8</a>).
+<!--page 109 -->
+
+<p><b>Footnotes</b>
+<p><small><a name="note98" href="#note98">98)</a> The operand of a sizeof operator is usually not evaluated (<a href="#6.5.3.4">6.5.3.4</a>).
+</small>
+<p><small><a name="note99" href="#note99">99)</a> An integer constant expression is used to specify the size of a bit-field member of a structure, the
+ value of an enumeration constant, the size of an array, or the value of a case constant. Further
+ constraints that apply to the integer constant expressions used in conditional-inclusion preprocessing
+ directives are discussed in <a href="#6.10.1">6.10.1</a>.
+</small>
+<p><small><a name="note100" href="#note100">100)</a> Thus, in the following initialization,
+
+<pre>
+          static int i = 2 || 1 / 0;
+</pre>
+ the expression is a valid integer constant expression with value one.
+</small>
+
+<h3><a name="6.7" href="#6.7">6.7 Declarations</a></h3>
+<p><b>Syntax</b>
+<p><!--para 1 -->
+<pre>
+          declaration:
+                 declaration-specifiers init-declarator-list<sub>opt</sub> ;
+          declaration-specifiers:
+                 storage-class-specifier declaration-specifiers<sub>opt</sub>
+                 type-specifier declaration-specifiers<sub>opt</sub>
+                 type-qualifier declaration-specifiers<sub>opt</sub>
+                 function-specifier declaration-specifiers<sub>opt</sub>
+          init-declarator-list:
+                  init-declarator
+                  init-declarator-list , init-declarator
+          init-declarator:
+                  declarator
+                  declarator = initializer
+</pre>
+<p><b>Constraints</b>
+<p><!--para 2 -->
+ A declaration shall declare at least a declarator (other than the parameters of a function or
+ the members of a structure or union), a tag, or the members of an enumeration.
+<p><!--para 3 -->
+ If an identifier has no linkage, there shall be no more than one declaration of the identifier
+ (in a declarator or type specifier) with the same scope and in the same name space, except
+ for tags as specified in <a href="#6.7.2.3">6.7.2.3</a>.
+<p><!--para 4 -->
+ All declarations in the same scope that refer to the same object or function shall specify
+ compatible types.
+<p><b>Semantics</b>
+<p><!--para 5 -->
+ A declaration specifies the interpretation and attributes of a set of identifiers. A definition
+ of an identifier is a declaration for that identifier that:
+<ul>
+<li>  for an object, causes storage to be reserved for that object;
+<li>  for a function, includes the function body;<sup><a href="#note101"><b>101)</b></a></sup>
+<li>  for an enumeration constant or typedef name, is the (only) declaration of the
+ identifier.
+</ul>
+<p><!--para 6 -->
+ The declaration specifiers consist of a sequence of specifiers that indicate the linkage,
+ storage duration, and part of the type of the entities that the declarators denote. The init-
+ declarator-list is a comma-separated sequence of declarators, each of which may have
+<!--page 110 -->
+ additional type information, or an initializer, or both. The declarators contain the
+ identifiers (if any) being declared.
+<p><!--para 7 -->
+ If an identifier for an object is declared with no linkage, the type for the object shall be
+ complete by the end of its declarator, or by the end of its init-declarator if it has an
+ initializer; in the case of function parameters (including in prototypes), it is the adjusted
+ type (see <a href="#6.7.5.3">6.7.5.3</a>) that is required to be complete.
+<p><b> Forward references</b>: declarators (<a href="#6.7.5">6.7.5</a>), enumeration specifiers (<a href="#6.7.2.2">6.7.2.2</a>), initialization
+ (<a href="#6.7.8">6.7.8</a>).
+
+<p><b>Footnotes</b>
+<p><small><a name="note101" href="#note101">101)</a> Function definitions have a different syntax, described in <a href="#6.9.1">6.9.1</a>.
+</small>
+
+<h4><a name="6.7.1" href="#6.7.1">6.7.1 Storage-class specifiers</a></h4>
+<p><b>Syntax</b>
+<p><!--para 1 -->
+<pre>
+          storage-class-specifier:
+                 typedef
+                 extern
+                 static
+                 auto
+                 register
+</pre>
+<p><b>Constraints</b>
+<p><!--para 2 -->
+ At most, one storage-class specifier may be given in the declaration specifiers in a
+ declaration.<sup><a href="#note102"><b>102)</b></a></sup>
+<p><b>Semantics</b>
+<p><!--para 3 -->
+ The typedef specifier is called a ''storage-class specifier'' for syntactic convenience
+ only; it is discussed in <a href="#6.7.7">6.7.7</a>. The meanings of the various linkages and storage durations
+ were discussed in <a href="#6.2.2">6.2.2</a> and <a href="#6.2.4">6.2.4</a>.
+<p><!--para 4 -->
+ A declaration of an identifier for an object with storage-class specifier register
+ suggests that access to the object be as fast as possible. The extent to which such
+ suggestions are effective is implementation-defined.<sup><a href="#note103"><b>103)</b></a></sup>
+<p><!--para 5 -->
+ The declaration of an identifier for a function that has block scope shall have no explicit
+ storage-class specifier other than extern.
+<!--page 111 -->
+<p><!--para 6 -->
+ If an aggregate or union object is declared with a storage-class specifier other than
+ typedef, the properties resulting from the storage-class specifier, except with respect to
+ linkage, also apply to the members of the object, and so on recursively for any aggregate
+ or union member objects.
+<p><b> Forward references</b>: type definitions (<a href="#6.7.7">6.7.7</a>).
+
+<p><b>Footnotes</b>
+<p><small><a name="note102" href="#note102">102)</a> See ''future language directions'' (<a href="#6.11.5">6.11.5</a>).
+</small>
+<p><small><a name="note103" href="#note103">103)</a> The implementation may treat any register declaration simply as an auto declaration. However,
+ whether or not addressable storage is actually used, the address of any part of an object declared with
+ storage-class specifier register cannot be computed, either explicitly (by use of the unary &amp;
+ operator as discussed in <a href="#6.5.3.2">6.5.3.2</a>) or implicitly (by converting an array name to a pointer as discussed in
+ <a href="#6.3.2.1">6.3.2.1</a>). Thus, the only operator that can be applied to an array declared with storage-class specifier
+ register is sizeof.
+</small>
+
+<h4><a name="6.7.2" href="#6.7.2">6.7.2 Type specifiers</a></h4>
+<p><b>Syntax</b>
+<p><!--para 1 -->
+<pre>
+          type-specifier:
+                 void
+                 char
+                 short
+                 int
+                 long
+                 float
+                 double
+                 signed
+                 unsigned
+                 _Bool
+                 _Complex
+                 struct-or-union-specifier                                                      *
+                 enum-specifier
+                 typedef-name
+</pre>
+<p><b>Constraints</b>
+<p><!--para 2 -->
+ At least one type specifier shall be given in the declaration specifiers in each declaration,
+ and in the specifier-qualifier list in each struct declaration and type name. Each list of
+ type specifiers shall be one of the following sets (delimited by commas, when there is
+ more than one set on a line); the type specifiers may occur in any order, possibly
+ intermixed with the other declaration specifiers.
+<ul>
+<li>  void
+<li>  char
+<li>  signed char
+<li>  unsigned char
+<li>  short, signed short, short int, or signed short int
+<li>  unsigned short, or unsigned short int
+<li>  int, signed, or signed int
+<!--page 112 -->
+<li>  unsigned, or unsigned int
+<li>  long, signed long, long int, or signed long int
+<li>  unsigned long, or unsigned long int
+<li>  long long, signed long long, long long int, or
+ signed long long int
+<li>  unsigned long long, or unsigned long long int
+<li>  float
+<li>  double
+<li>  long double
+<li>  _Bool
+<li>  float _Complex
+<li>  double _Complex
+<li>  long double _Complex
+<li>  struct or union specifier                                                                    *
+<li>  enum specifier
+<li>  typedef name
+</ul>
+<p><!--para 3 -->
+ The type specifier _Complex shall not be used if the implementation does not provide
+ complex types.<sup><a href="#note104"><b>104)</b></a></sup>
+<p><b>Semantics</b>
+<p><!--para 4 -->
+ Specifiers for structures, unions, and enumerations are discussed in <a href="#6.7.2.1">6.7.2.1</a> through
+ <a href="#6.7.2.3">6.7.2.3</a>. Declarations of typedef names are discussed in <a href="#6.7.7">6.7.7</a>. The characteristics of the
+ other types are discussed in <a href="#6.2.5">6.2.5</a>.
+<p><!--para 5 -->
+ Each of the comma-separated sets designates the same type, except that for bit-fields, it is
+ implementation-defined whether the specifier int designates the same type as signed
+ int or the same type as unsigned int.
+<p><b> Forward references</b>: enumeration specifiers (<a href="#6.7.2.2">6.7.2.2</a>), structure and union specifiers
+ (<a href="#6.7.2.1">6.7.2.1</a>), tags (<a href="#6.7.2.3">6.7.2.3</a>), type definitions (<a href="#6.7.7">6.7.7</a>).
+<!--page 113 -->
+
+<p><b>Footnotes</b>
+<p><small><a name="note104" href="#note104">104)</a> Freestanding implementations are not required to provide complex types.                  *
+</small>
+
+<h5><a name="6.7.2.1" href="#6.7.2.1">6.7.2.1 Structure and union specifiers</a></h5>
+<p><b>Syntax</b>
+<p><!--para 1 -->
+<pre>
+          struct-or-union-specifier:
+                  struct-or-union identifier<sub>opt</sub> { struct-declaration-list }
+                  struct-or-union identifier
+          struct-or-union:
+                  struct
+                  union
+          struct-declaration-list:
+                  struct-declaration
+                  struct-declaration-list struct-declaration
+          struct-declaration:
+                  specifier-qualifier-list struct-declarator-list ;
+          specifier-qualifier-list:
+                 type-specifier specifier-qualifier-list<sub>opt</sub>
+                 type-qualifier specifier-qualifier-list<sub>opt</sub>
+          struct-declarator-list:
+                  struct-declarator
+                  struct-declarator-list , struct-declarator
+          struct-declarator:
+                  declarator
+                  declarator<sub>opt</sub> : constant-expression
+</pre>
+<p><b>Constraints</b>
+<p><!--para 2 -->
+ A structure or union shall not contain a member with incomplete or function type (hence,
+ a structure shall not contain an instance of itself, but may contain a pointer to an instance
+ of itself), except that the last member of a structure with more than one named member
+ may have incomplete array type; such a structure (and any union containing, possibly
+ recursively, a member that is such a structure) shall not be a member of a structure or an
+ element of an array.
+<p><!--para 3 -->
+ The expression that specifies the width of a bit-field shall be an integer constant
+ expression with a nonnegative value that does not exceed the width of an object of the
+ type that would be specified were the colon and expression omitted. If the value is zero,
+ the declaration shall have no declarator.
+<p><!--para 4 -->
+ A bit-field shall have a type that is a qualified or unqualified version of _Bool, signed
+ int, unsigned int, or some other implementation-defined type.
+<!--page 114 -->
+<p><b>Semantics</b>
+<p><!--para 5 -->
+ As discussed in <a href="#6.2.5">6.2.5</a>, a structure is a type consisting of a sequence of members, whose
+ storage is allocated in an ordered sequence, and a union is a type consisting of a sequence
+ of members whose storage overlap.
+<p><!--para 6 -->
+ Structure and union specifiers have the same form. The keywords struct and union
+ indicate that the type being specified is, respectively, a structure type or a union type.
+<p><!--para 7 -->
+ The presence of a struct-declaration-list in a struct-or-union-specifier declares a new type,
+ within a translation unit. The struct-declaration-list is a sequence of declarations for the
+ members of the structure or union. If the struct-declaration-list contains no named
+ members, the behavior is undefined. The type is incomplete until after the } that
+ terminates the list.
+<p><!--para 8 -->
+ A member of a structure or union may have any object type other than a variably
+ modified type.<sup><a href="#note105"><b>105)</b></a></sup> In addition, a member may be declared to consist of a specified
+ number of bits (including a sign bit, if any). Such a member is called a bit-field;<sup><a href="#note106"><b>106)</b></a></sup> its
+ width is preceded by a colon.
+<p><!--para 9 -->
+ A bit-field is interpreted as a signed or unsigned integer type consisting of the specified
+ number of bits.<sup><a href="#note107"><b>107)</b></a></sup> If the value 0 or 1 is stored into a nonzero-width bit-field of type
+ _Bool, the value of the bit-field shall compare equal to the value stored.
+<p><!--para 10 -->
+ An implementation may allocate any addressable storage unit large enough to hold a bit-
+ field. If enough space remains, a bit-field that immediately follows another bit-field in a
+ structure shall be packed into adjacent bits of the same unit. If insufficient space remains,
+ whether a bit-field that does not fit is put into the next unit or overlaps adjacent units is
+ implementation-defined. The order of allocation of bit-fields within a unit (high-order to
+ low-order or low-order to high-order) is implementation-defined. The alignment of the
+ addressable storage unit is unspecified.
+<p><!--para 11 -->
+ A bit-field declaration with no declarator, but only a colon and a width, indicates an
+ unnamed bit-field.<sup><a href="#note108"><b>108)</b></a></sup> As a special case, a bit-field structure member with a width of 0
+ indicates that no further bit-field is to be packed into the unit in which the previous bit-
+ field, if any, was placed.
+<!--page 115 -->
+<p><!--para 12 -->
+ Each non-bit-field member of a structure or union object is aligned in an implementation-
+ defined manner appropriate to its type.
+<p><!--para 13 -->
+ Within a structure object, the non-bit-field members and the units in which bit-fields
+ reside have addresses that increase in the order in which they are declared. A pointer to a
+ structure object, suitably converted, points to its initial member (or if that member is a
+ bit-field, then to the unit in which it resides), and vice versa. There may be unnamed
+ padding within a structure object, but not at its beginning.
+<p><!--para 14 -->
+ The size of a union is sufficient to contain the largest of its members. The value of at
+ most one of the members can be stored in a union object at any time. A pointer to a
+ union object, suitably converted, points to each of its members (or if a member is a bit-
+ field, then to the unit in which it resides), and vice versa.
+<p><!--para 15 -->
+ There may be unnamed padding at the end of a structure or union.
+<p><!--para 16 -->
+ As a special case, the last element of a structure with more than one named member may
+ have an incomplete array type; this is called a flexible array member. In most situations,
+ the flexible array member is ignored. In particular, the size of the structure is as if the
+ flexible array member were omitted except that it may have more trailing padding than
+ the omission would imply. However, when a . (or -&gt;) operator has a left operand that is
+ (a pointer to) a structure with a flexible array member and the right operand names that
+ member, it behaves as if that member were replaced with the longest array (with the same
+ element type) that would not make the structure larger than the object being accessed; the
+ offset of the array shall remain that of the flexible array member, even if this would differ
+ from that of the replacement array. If this array would have no elements, it behaves as if
+ it had one element but the behavior is undefined if any attempt is made to access that
+ element or to generate a pointer one past it.
+<p><!--para 17 -->
+ EXAMPLE       After the declaration:
+<pre>
+         struct s { int n; double d[]; };
+</pre>
+ the structure struct s has a flexible array member d. A typical way to use this is:
+<pre>
+         int m = /* some value */;
+         struct s *p = malloc(sizeof (struct s) + sizeof (double [m]));
+</pre>
+ and assuming that the call to malloc succeeds, the object pointed to by p behaves, for most purposes, as if
+ p had been declared as:
+<pre>
+         struct { int n; double d[m]; } *p;
+</pre>
+ (there are circumstances in which this equivalence is broken; in particular, the offsets of member d might
+ not be the same).
+<p><!--para 18 -->
+ Following the above declaration:
+<!--page 116 -->
+<pre>
+          struct s t1 = { 0 };                        //   valid
+          struct s t2 = { 1, { <a href="#4.2">4.2</a> }};                //   invalid
+          t1.n = 4;                                   //   valid
+          t1.d[0] = <a href="#4.2">4.2</a>;                              //   might be undefined behavior
+</pre>
+ The initialization of t2 is invalid (and violates a constraint) because struct s is treated as if it did not
+ contain member d. The assignment to t1.d[0] is probably undefined behavior, but it is possible that
+<pre>
+          sizeof (struct s) &gt;= offsetof(struct s, d) + sizeof (double)
+</pre>
+ in which case the assignment would be legitimate. Nevertheless, it cannot appear in strictly conforming
+ code.
+<p><!--para 19 -->
+ After the further declaration:
+<pre>
+          struct ss { int n; };
+</pre>
+ the expressions:
+<pre>
+          sizeof (struct s) &gt;= sizeof (struct ss)
+          sizeof (struct s) &gt;= offsetof(struct s, d)
+</pre>
+ are always equal to 1.
+<p><!--para 20 -->
+ If sizeof (double) is 8, then after the following code is executed:
+<pre>
+          struct s *s1;
+          struct s *s2;
+          s1 = malloc(sizeof (struct s) + 64);
+          s2 = malloc(sizeof (struct s) + 46);
+</pre>
+ and assuming that the calls to malloc succeed, the objects pointed to by s1 and s2 behave, for most
+ purposes, as if the identifiers had been declared as:
+<pre>
+          struct { int n; double d[8]; } *s1;
+          struct { int n; double d[5]; } *s2;
+</pre>
+<p><!--para 21 -->
+ Following the further successful assignments:
+<pre>
+          s1 = malloc(sizeof (struct s) + 10);
+          s2 = malloc(sizeof (struct s) + 6);
+</pre>
+ they then behave as if the declarations were:
+<pre>
+          struct { int n; double d[1]; } *s1, *s2;
+</pre>
+ and:
+<pre>
+          double *dp;
+          dp = &amp;(s1-&gt;d[0]);           //   valid
+          *dp = 42;                   //   valid
+          dp = &amp;(s2-&gt;d[0]);           //   valid
+          *dp = 42;                   //   undefined behavior
+</pre>
+<p><!--para 22 -->
+ The assignment:
+<pre>
+          *s1 = *s2;
+</pre>
+ only copies the member n; if any of the array elements are within the first sizeof (struct s) bytes
+ of the structure, they might be copied or simply overwritten with indeterminate values.
+<p><b> Forward references</b>: tags (<a href="#6.7.2.3">6.7.2.3</a>).
+<!--page 117 -->
+
+<p><b>Footnotes</b>
+<p><small><a name="note105" href="#note105">105)</a> A structure or union can not contain a member with a variably modified type because member names
+ are not ordinary identifiers as defined in <a href="#6.2.3">6.2.3</a>.
+</small>
+<p><small><a name="note106" href="#note106">106)</a> The unary &amp; (address-of) operator cannot be applied to a bit-field object; thus, there are no pointers to
+ or arrays of bit-field objects.
+</small>
+<p><small><a name="note107" href="#note107">107)</a> As specified in <a href="#6.7.2">6.7.2</a> above, if the actual type specifier used is int or a typedef-name defined as int,
+ then it is implementation-defined whether the bit-field is signed or unsigned.
+</small>
+<p><small><a name="note108" href="#note108">108)</a> An unnamed bit-field structure member is useful for padding to conform to externally imposed
+ layouts.
+</small>
+
+<h5><a name="6.7.2.2" href="#6.7.2.2">6.7.2.2 Enumeration specifiers</a></h5>
+<p><b>Syntax</b>
+<p><!--para 1 -->
+<pre>
+          enum-specifier:
+                enum identifier<sub>opt</sub> { enumerator-list }
+                enum identifier<sub>opt</sub> { enumerator-list , }
+                enum identifier
+          enumerator-list:
+                enumerator
+                enumerator-list , enumerator
+          enumerator:
+                enumeration-constant
+                enumeration-constant = constant-expression
+</pre>
+<p><b>Constraints</b>
+<p><!--para 2 -->
+ The expression that defines the value of an enumeration constant shall be an integer
+ constant expression that has a value representable as an int.
+<p><b>Semantics</b>
+<p><!--para 3 -->
+ The identifiers in an enumerator list are declared as constants that have type int and
+ may appear wherever such are permitted.<sup><a href="#note109"><b>109)</b></a></sup> An enumerator with = defines its
+ enumeration constant as the value of the constant expression. If the first enumerator has
+ no =, the value of its enumeration constant is 0. Each subsequent enumerator with no =
+ defines its enumeration constant as the value of the constant expression obtained by
+ adding 1 to the value of the previous enumeration constant. (The use of enumerators with
+ = may produce enumeration constants with values that duplicate other values in the same
+ enumeration.) The enumerators of an enumeration are also known as its members.
+<p><!--para 4 -->
+ Each enumerated type shall be compatible with char, a signed integer type, or an
+ unsigned integer type. The choice of type is implementation-defined,<sup><a href="#note110"><b>110)</b></a></sup> but shall be
+ capable of representing the values of all the members of the enumeration. The
+ enumerated type is incomplete until after the } that terminates the list of enumerator
+ declarations.
+<!--page 118 -->
+<p><!--para 5 -->
+ EXAMPLE       The following fragment:
+<pre>
+         enum hue { chartreuse, burgundy, claret=20, winedark };
+         enum hue col, *cp;
+         col = claret;
+         cp = &amp;col;
+         if (*cp != burgundy)
                /* ... */
-               wchar_t wstr[50];
-               fscanf(stdin, "a(uparrow) Y(downarrow)%ls", wstr);
-     with the same input line, zero will again be returned, but stdin will be left with a partially consumed
-     multibyte character.
-
-     Forward references: the strtod, strtof, and strtold functions (<a href="#7.20.1.3">7.20.1.3</a>), the
-     strtol, strtoll, strtoul, and strtoull functions (<a href="#7.20.1.4">7.20.1.4</a>), conversion state
-     (<a href="#7.24.6">7.24.6</a>), the wcrtomb function (<a href="#7.24.6.3.3">7.24.6.3.3</a>).
-
-
-
-
-[<a name="p289" href="#p289">page 289</a>] (<a href="#Contents">Contents</a>)
-
-<a name="7.19.6.3" href="#7.19.6.3"><b>    7.19.6.3 The printf function</b></a>
-    Synopsis
-1          #include <a href="#7.19">&lt;stdio.h&gt;</a>
-           int printf(const char * restrict format, ...);
-    Description
-2   The printf function is equivalent to fprintf with the argument stdout interposed
-    before the arguments to printf.
-    Returns
-3   The printf function returns the number of characters transmitted, or a negative value if
-    an output or encoding error occurred.
-<a name="7.19.6.4" href="#7.19.6.4"><b>    7.19.6.4 The scanf function</b></a>
-    Synopsis
-1          #include <a href="#7.19">&lt;stdio.h&gt;</a>
-           int scanf(const char * restrict format, ...);
-    Description
-2   The scanf function is equivalent to fscanf with the argument stdin interposed
-    before the arguments to scanf.
-    Returns
-3   The scanf function returns the value of the macro EOF if an input failure occurs before
-    any conversion. Otherwise, the scanf function returns the number of input items
-    assigned, which can be fewer than provided for, or even zero, in the event of an early
-    matching failure.
-<a name="7.19.6.5" href="#7.19.6.5"><b>    7.19.6.5 The snprintf function</b></a>
-    Synopsis
-1          #include <a href="#7.19">&lt;stdio.h&gt;</a>
-           int snprintf(char * restrict s, size_t n,
-                const char * restrict format, ...);
-    Description
-2   The snprintf function is equivalent to fprintf, except that the output is written into
-    an array (specified by argument s) rather than to a stream. If n is zero, nothing is written,
-    and s may be a null pointer. Otherwise, output characters beyond the n-1st are
-    discarded rather than being written to the array, and a null character is written at the end
-    of the characters actually written into the array. If copying takes place between objects
-    that overlap, the behavior is undefined.
-
-[<a name="p290" href="#p290">page 290</a>] (<a href="#Contents">Contents</a>)
-
-    Returns
-3   The snprintf function returns the number of characters that would have been written
-    had n been sufficiently large, not counting the terminating null character, or a negative
-    value if an encoding error occurred. Thus, the null-terminated output has been
-    completely written if and only if the returned value is nonnegative and less than n.
-<a name="7.19.6.6" href="#7.19.6.6"><b>    7.19.6.6 The sprintf function</b></a>
-    Synopsis
-1          #include <a href="#7.19">&lt;stdio.h&gt;</a>
-           int sprintf(char * restrict s,
-                const char * restrict format, ...);
-    Description
-2   The sprintf function is equivalent to fprintf, except that the output is written into
-    an array (specified by the argument s) rather than to a stream. A null character is written
-    at the end of the characters written; it is not counted as part of the returned value. If
-    copying takes place between objects that overlap, the behavior is undefined.
-    Returns
-3   The sprintf function returns the number of characters written in the array, not
-    counting the terminating null character, or a negative value if an encoding error occurred.
-<a name="7.19.6.7" href="#7.19.6.7"><b>    7.19.6.7 The sscanf function</b></a>
-    Synopsis
-1          #include <a href="#7.19">&lt;stdio.h&gt;</a>
-           int sscanf(const char * restrict s,
-                const char * restrict format, ...);
-    Description
-2   The sscanf function is equivalent to fscanf, except that input is obtained from a
-    string (specified by the argument s) rather than from a stream. Reaching the end of the
-    string is equivalent to encountering end-of-file for the fscanf function. If copying
-    takes place between objects that overlap, the behavior is undefined.
-    Returns
-3   The sscanf function returns the value of the macro EOF if an input failure occurs
-    before any conversion. Otherwise, the sscanf function returns the number of input
-    items assigned, which can be fewer than provided for, or even zero, in the event of an
-    early matching failure.
-
-
-
-
-[<a name="p291" href="#p291">page 291</a>] (<a href="#Contents">Contents</a>)
-
-<a name="7.19.6.8" href="#7.19.6.8"><b>    7.19.6.8 The vfprintf function</b></a>
-    Synopsis
-1          #include <a href="#7.15">&lt;stdarg.h&gt;</a>
-           #include <a href="#7.19">&lt;stdio.h&gt;</a>
-           int vfprintf(FILE * restrict stream,
-                const char * restrict format,
-                va_list arg);
-    Description
-2   The vfprintf function is equivalent to fprintf, with the variable argument list
-    replaced by arg, which shall have been initialized by the va_start macro (and
-    possibly subsequent va_arg calls). The vfprintf function does not invoke the
-    va_end macro.254)
-    Returns
-3   The vfprintf function returns the number of characters transmitted, or a negative
-    value if an output or encoding error occurred.
-4   EXAMPLE       The following shows the use of the vfprintf function in a general error-reporting routine.
-           #include <a href="#7.15">&lt;stdarg.h&gt;</a>
-           #include <a href="#7.19">&lt;stdio.h&gt;</a>
-           void error(char *function_name, char *format, ...)
+</pre>
+ makes hue the tag of an enumeration, and then declares col as an object that has that type and cp as a
+ pointer to an object that has that type. The enumerated values are in the set { 0, 1, 20, 21 }.
+<p><b> Forward references</b>: tags (<a href="#6.7.2.3">6.7.2.3</a>).
+
+<p><b>Footnotes</b>
+<p><small><a name="note109" href="#note109">109)</a> Thus, the identifiers of enumeration constants declared in the same scope shall all be distinct from
+ each other and from other identifiers declared in ordinary declarators.
+</small>
+<p><small><a name="note110" href="#note110">110)</a> An implementation may delay the choice of which integer type until all enumeration constants have
+ been seen.
+</small>
+
+<h5><a name="6.7.2.3" href="#6.7.2.3">6.7.2.3 Tags</a></h5>
+<p><b>Constraints</b>
+<p><!--para 1 -->
+ A specific type shall have its content defined at most once.
+<p><!--para 2 -->
+ Where two declarations that use the same tag declare the same type, they shall both use
+ the same choice of struct, union, or enum.
+<p><!--para 3 -->
+ A type specifier of the form
+<pre>
+         enum identifier
+</pre>
+ without an enumerator list shall only appear after the type it specifies is complete.
+<p><b>Semantics</b>
+<p><!--para 4 -->
+ All declarations of structure, union, or enumerated types that have the same scope and
+ use the same tag declare the same type. The type is incomplete<sup><a href="#note111"><b>111)</b></a></sup> until the closing brace
+ of the list defining the content, and complete thereafter.
+<p><!--para 5 -->
+ Two declarations of structure, union, or enumerated types which are in different scopes or
+ use different tags declare distinct types. Each declaration of a structure, union, or
+ enumerated type which does not include a tag declares a distinct type.
+<p><!--para 6 -->
+ A type specifier of the form
+<pre>
+         struct-or-union identifier<sub>opt</sub> { struct-declaration-list }
+</pre>
+ or
+<pre>
+         enum identifier { enumerator-list }
+</pre>
+ or
+<pre>
+         enum identifier { enumerator-list , }
+</pre>
+ declares a structure, union, or enumerated type. The list defines the structure content,
+<!--page 119 -->
+ union content, or enumeration content. If an identifier is provided,<sup><a href="#note112"><b>112)</b></a></sup> the type specifier
+ also declares the identifier to be the tag of that type.
+<p><!--para 7 -->
+ A declaration of the form
+<pre>
+          struct-or-union identifier ;
+</pre>
+ specifies a structure or union type and declares the identifier as a tag of that type.<sup><a href="#note113"><b>113)</b></a></sup>
+<p><!--para 8 -->
+ If a type specifier of the form
+<pre>
+          struct-or-union identifier
+</pre>
+ occurs other than as part of one of the above forms, and no other declaration of the
+ identifier as a tag is visible, then it declares an incomplete structure or union type, and
+ declares the identifier as the tag of that type.<sup><a href="#note113"><b>113)</b></a></sup>
+<p><!--para 9 -->
+ If a type specifier of the form
+<pre>
+          struct-or-union identifier
+</pre>
+ or
+<pre>
+          enum identifier
+</pre>
+ occurs other than as part of one of the above forms, and a declaration of the identifier as a
+ tag is visible, then it specifies the same type as that other declaration, and does not
+ redeclare the tag.
+<p><!--para 10 -->
+ EXAMPLE 1       This mechanism allows declaration of a self-referential structure.
+<pre>
+          struct tnode {
+                int count;
+                struct tnode *left, *right;
+          };
+</pre>
+ specifies a structure that contains an integer and two pointers to objects of the same type. Once this
+ declaration has been given, the declaration
+<pre>
+          struct tnode s, *sp;
+</pre>
+ declares s to be an object of the given type and sp to be a pointer to an object of the given type. With
+ these declarations, the expression sp-&gt;left refers to the left struct tnode pointer of the object to
+ which sp points; the expression s.right-&gt;count designates the count member of the right struct
+ tnode pointed to from s.
+<p><!--para 11 -->
+ The following alternative formulation uses the typedef mechanism:
+<!--page 120 -->
+<pre>
+          typedef struct tnode TNODE;
+          struct tnode {
+                int count;
+                TNODE *left, *right;
+          };
+          TNODE s, *sp;
+</pre>
+<p><!--para 12 -->
+ EXAMPLE 2 To illustrate the use of prior declaration of a tag to specify a pair of mutually referential
+ structures, the declarations
+<pre>
+          struct s1 { struct s2 *s2p; /* ... */ }; // D1
+          struct s2 { struct s1 *s1p; /* ... */ }; // D2
+</pre>
+ specify a pair of structures that contain pointers to each other. Note, however, that if s2 were already
+ declared as a tag in an enclosing scope, the declaration D1 would refer to it, not to the tag s2 declared in
+ D2. To eliminate this context sensitivity, the declaration
+<pre>
+          struct s2;
+</pre>
+ may be inserted ahead of D1. This declares a new tag s2 in the inner scope; the declaration D2 then
+ completes the specification of the new type.
+<p><b> Forward references</b>: declarators (<a href="#6.7.5">6.7.5</a>), array declarators (<a href="#6.7.5.2">6.7.5.2</a>), type definitions
+ (<a href="#6.7.7">6.7.7</a>).
+
+<p><b>Footnotes</b>
+<p><small><a name="note111" href="#note111">111)</a> An incomplete type may only by used when the size of an object of that type is not needed. It is not
+ needed, for example, when a typedef name is declared to be a specifier for a structure or union, or
+ when a pointer to or a function returning a structure or union is being declared. (See incomplete types
+ in <a href="#6.2.5">6.2.5</a>.) The specification has to be complete before such a function is called or defined.
+</small>
+<p><small><a name="note112" href="#note112">112)</a> If there is no identifier, the type can, within the translation unit, only be referred to by the declaration
+ of which it is a part. Of course, when the declaration is of a typedef name, subsequent declarations
+ can make use of that typedef name to declare objects having the specified structure, union, or
+ enumerated type.
+</small>
+<p><small><a name="note113" href="#note113">113)</a> A similar construction with enum does not exist.
+</small>
+
+<h4><a name="6.7.3" href="#6.7.3">6.7.3 Type qualifiers</a></h4>
+<p><b>Syntax</b>
+<p><!--para 1 -->
+<pre>
+          type-qualifier:
+                 const
+                 restrict
+                 volatile
+</pre>
+<p><b>Constraints</b>
+<p><!--para 2 -->
+ Types other than pointer types derived from object or incomplete types shall not be
+ restrict-qualified.
+<p><b>Semantics</b>
+<p><!--para 3 -->
+ The properties associated with qualified types are meaningful only for expressions that
+ are lvalues.<sup><a href="#note114"><b>114)</b></a></sup>
+<p><!--para 4 -->
+ If the same qualifier appears more than once in the same specifier-qualifier-list, either
+ directly or via one or more typedefs, the behavior is the same as if it appeared only
+ once.
+<!--page 121 -->
+<p><!--para 5 -->
+ If an attempt is made to modify an object defined with a const-qualified type through use
+ of an lvalue with non-const-qualified type, the behavior is undefined. If an attempt is
+ made to refer to an object defined with a volatile-qualified type through use of an lvalue
+ with non-volatile-qualified type, the behavior is undefined.<sup><a href="#note115"><b>115)</b></a></sup>
+<p><!--para 6 -->
+ An object that has volatile-qualified type may be modified in ways unknown to the
+ implementation or have other unknown side effects. Therefore any expression referring
+ to such an object shall be evaluated strictly according to the rules of the abstract machine,
+ as described in <a href="#5.1.2.3">5.1.2.3</a>. Furthermore, at every sequence point the value last stored in the
+ object shall agree with that prescribed by the abstract machine, except as modified by the
+ unknown factors mentioned previously.<sup><a href="#note116"><b>116)</b></a></sup> What constitutes an access to an object that
+ has volatile-qualified type is implementation-defined.
+<p><!--para 7 -->
+ An object that is accessed through a restrict-qualified pointer has a special association
+ with that pointer. This association, defined in <a href="#6.7.3.1">6.7.3.1</a> below, requires that all accesses to
+ that object use, directly or indirectly, the value of that particular pointer.<sup><a href="#note117"><b>117)</b></a></sup> The intended
+ use of the restrict qualifier (like the register storage class) is to promote
+ optimization, and deleting all instances of the qualifier from all preprocessing translation
+ units composing a conforming program does not change its meaning (i.e., observable
+ behavior).
+<p><!--para 8 -->
+ If the specification of an array type includes any type qualifiers, the element type is so-
+ qualified, not the array type. If the specification of a function type includes any type
+ qualifiers, the behavior is undefined.<sup><a href="#note118"><b>118)</b></a></sup>
+<p><!--para 9 -->
+ For two qualified types to be compatible, both shall have the identically qualified version
+ of a compatible type; the order of type qualifiers within a list of specifiers or qualifiers
+ does not affect the specified type.
+<p><!--para 10 -->
+ EXAMPLE 1       An object declared
+<pre>
+          extern const volatile int real_time_clock;
+</pre>
+ may be modifiable by hardware, but cannot be assigned to, incremented, or decremented.
+<!--page 122 -->
+<p><!--para 11 -->
+ EXAMPLE 2 The following declarations and expressions illustrate the behavior when type qualifiers
+ modify an aggregate type:
+<pre>
+         const struct s { int mem; } cs = { 1 };
+         struct s ncs; // the object ncs is modifiable
+         typedef int A[2][3];
+         const A a = {{4, 5, 6}, {7, 8, 9}}; // array of array of const int
+         int *pi;
+         const int *pci;
+         ncs = cs;             //   valid
+         cs = ncs;             //   violates modifiable lvalue constraint for =
+         pi = &amp;ncs.mem;        //   valid
+         pi = &amp;cs.mem;         //   violates type constraints for =
+         pci = &amp;cs.mem;        //   valid
+         pi = a[0];            //   invalid: a[0] has type ''const int *''
+</pre>
+
+<p><b>Footnotes</b>
+<p><small><a name="note114" href="#note114">114)</a> The implementation may place a const object that is not volatile in a read-only region of
+ storage. Moreover, the implementation need not allocate storage for such an object if its address is
+ never used.
+</small>
+<p><small><a name="note115" href="#note115">115)</a> This applies to those objects that behave as if they were defined with qualified types, even if they are
+ never actually defined as objects in the program (such as an object at a memory-mapped input/output
+ address).
+</small>
+<p><small><a name="note116" href="#note116">116)</a> A volatile declaration may be used to describe an object corresponding to a memory-mapped
+ input/output port or an object accessed by an asynchronously interrupting function. Actions on
+ objects so declared shall not be ''optimized out'' by an implementation or reordered except as
+ permitted by the rules for evaluating expressions.
+</small>
+<p><small><a name="note117" href="#note117">117)</a> For example, a statement that assigns a value returned by malloc to a single pointer establishes this
+ association between the allocated object and the pointer.
+</small>
+<p><small><a name="note118" href="#note118">118)</a> Both of these can occur through the use of typedefs.
+</small>
+
+<h5><a name="6.7.3.1" href="#6.7.3.1">6.7.3.1 Formal definition of restrict</a></h5>
+<p><!--para 1 -->
+ Let D be a declaration of an ordinary identifier that provides a means of designating an
+ object P as a restrict-qualified pointer to type T.
+<p><!--para 2 -->
+ If D appears inside a block and does not have storage class extern, let B denote the
+ block. If D appears in the list of parameter declarations of a function definition, let B
+ denote the associated block. Otherwise, let B denote the block of main (or the block of
+ whatever function is called at program startup in a freestanding environment).
+<p><!--para 3 -->
+ In what follows, a pointer expression E is said to be based on object P if (at some
+ sequence point in the execution of B prior to the evaluation of E) modifying P to point to
+ a copy of the array object into which it formerly pointed would change the value of E.<sup><a href="#note119"><b>119)</b></a></sup>
+ Note that ''based'' is defined only for expressions with pointer types.
+<p><!--para 4 -->
+ During each execution of B, let L be any lvalue that has &amp;L based on P. If L is used to
+ access the value of the object X that it designates, and X is also modified (by any means),
+ then the following requirements apply: T shall not be const-qualified. Every other lvalue
+ used to access the value of X shall also have its address based on P. Every access that
+ modifies X shall be considered also to modify P, for the purposes of this subclause. If P
+ is assigned the value of a pointer expression E that is based on another restricted pointer
+ object P2, associated with block B2, then either the execution of B2 shall begin before
+ the execution of B, or the execution of B2 shall end prior to the assignment. If these
+ requirements are not met, then the behavior is undefined.
+<p><!--para 5 -->
+ Here an execution of B means that portion of the execution of the program that would
+ correspond to the lifetime of an object with scalar type and automatic storage duration
+<!--page 123 -->
+ associated with B.
+<p><!--para 6 -->
+ A translator is free to ignore any or all aliasing implications of uses of restrict.
+<p><!--para 7 -->
+ EXAMPLE 1       The file scope declarations
+<pre>
+          int * restrict a;
+          int * restrict b;
+          extern int c[];
+</pre>
+ assert that if an object is accessed using one of a, b, or c, and that object is modified anywhere in the
+ program, then it is never accessed using either of the other two.
+<p><!--para 8 -->
+ EXAMPLE 2 The function parameter declarations in the following example
+<pre>
+         void f(int n, int * restrict p, int * restrict q)
+         {
+               while (n-- &gt; 0)
+                     *p++ = *q++;
+         }
+</pre>
+ assert that, during each execution of the function, if an object is accessed through one of the pointer
+ parameters, then it is not also accessed through the other.
+<p><!--para 9 -->
+ The benefit of the restrict qualifiers is that they enable a translator to make an effective dependence
+ analysis of function f without examining any of the calls of f in the program. The cost is that the
+ programmer has to examine all of those calls to ensure that none give undefined behavior. For example, the
+ second call of f in g has undefined behavior because each of d[1] through d[49] is accessed through
+ both p and q.
+<pre>
+         void g(void)
+         {
+               extern int d[100];
+               f(50, d + 50, d); // valid
+               f(50, d + 1, d); // undefined behavior
+         }
+</pre>
+<p><!--para 10 -->
+ EXAMPLE 3       The function parameter declarations
+<pre>
+         void h(int n, int * restrict p, int * restrict q, int * restrict r)
+         {
+               int i;
+               for (i = 0; i &lt; n; i++)
+                      p[i] = q[i] + r[i];
+         }
+</pre>
+ illustrate how an unmodified object can be aliased through two restricted pointers. In particular, if a and b
+ are disjoint arrays, a call of the form h(100, a, b, b) has defined behavior, because array b is not
+ modified within function h.
+<p><!--para 11 -->
+ EXAMPLE 4 The rule limiting assignments between restricted pointers does not distinguish between a
+ function call and an equivalent nested block. With one exception, only ''outer-to-inner'' assignments
+ between restricted pointers declared in nested blocks have defined behavior.
+<!--page 124 -->
+<pre>
+          {
+                   int * restrict p1;
+                   int * restrict q1;
+                   p1 = q1; // undefined behavior
+                   {
+                         int * restrict p2 = p1; // valid
+                         int * restrict q2 = q1; // valid
+                         p1 = q2;                // undefined behavior
+                         p2 = q2;                // undefined behavior
+                   }
+          }
+</pre>
+<p><!--para 12 -->
+ The one exception allows the value of a restricted pointer to be carried out of the block in which it (or, more
+ precisely, the ordinary identifier used to designate it) is declared when that block finishes execution. For
+ example, this permits new_vector to return a vector.
+<pre>
+          typedef struct { int n; float * restrict v; } vector;
+          vector new_vector(int n)
+          {
+                vector t;
+                t.n = n;
+                t.v = malloc(n * sizeof (float));
+                return t;
+          }
+</pre>
+
+<p><b>Footnotes</b>
+<p><small><a name="note119" href="#note119">119)</a> In other words, E depends on the value of P itself rather than on the value of an object referenced
+ indirectly through P. For example, if identifier p has type (int **restrict), then the pointer
+ expressions p and p+1 are based on the restricted pointer object designated by p, but the pointer
+ expressions *p and p[1] are not.
+</small>
+
+<h4><a name="6.7.4" href="#6.7.4">6.7.4 Function specifiers</a></h4>
+<p><b>Syntax</b>
+<p><!--para 1 -->
+<pre>
+          function-specifier:
+                 inline
+</pre>
+<p><b>Constraints</b>
+<p><!--para 2 -->
+ Function specifiers shall be used only in the declaration of an identifier for a function.
+<p><!--para 3 -->
+ An inline definition of a function with external linkage shall not contain a definition of a
+ modifiable object with static storage duration, and shall not contain a reference to an
+ identifier with internal linkage.
+<p><!--para 4 -->
+ In a hosted environment, the inline function specifier shall not appear in a declaration
+ of main.
+<p><b>Semantics</b>
+<p><!--para 5 -->
+ A function declared with an inline function specifier is an inline function. The
+ function specifier may appear more than once; the behavior is the same as if it appeared
+ only once. Making a function an inline function suggests that calls to the function be as
+ fast as possible.<sup><a href="#note120"><b>120)</b></a></sup> The extent to which such suggestions are effective is
+ implementation-defined.<sup><a href="#note121"><b>121)</b></a></sup>
+<p><!--para 6 -->
+ Any function with internal linkage can be an inline function. For a function with external
+ linkage, the following restrictions apply: If a function is declared with an inline
+<!--page 125 -->
+ function specifier, then it shall also be defined in the same translation unit. If all of the
+ file scope declarations for a function in a translation unit include the inline function
+ specifier without extern, then the definition in that translation unit is an inline
+ definition. An inline definition does not provide an external definition for the function,
+ and does not forbid an external definition in another translation unit. An inline definition
+ provides an alternative to an external definition, which a translator may use to implement
+ any call to the function in the same translation unit. It is unspecified whether a call to the
+ function uses the inline definition or the external definition.<sup><a href="#note122"><b>122)</b></a></sup>
+<p><!--para 7 -->
+ EXAMPLE The declaration of an inline function with external linkage can result in either an external
+ definition, or a definition available for use only within the translation unit. A file scope declaration with
+ extern creates an external definition. The following example shows an entire translation unit.
+<pre>
+          inline double fahr(double t)
+          {
+                return (9.0 * t) / 5.0 + 32.0;
+          }
+          inline double cels(double t)
+          {
+                return (5.0 * (t - 32.0)) / 9.0;
+          }
+          extern double fahr(double);                  // creates an external definition
+          double convert(int is_fahr, double temp)
+          {
+                /* A translator may perform inline substitutions */
+                return is_fahr ? cels(temp) : fahr(temp);
+          }
+</pre>
+<p><!--para 8 -->
+ Note that the definition of fahr is an external definition because fahr is also declared with extern, but
+ the definition of cels is an inline definition. Because cels has external linkage and is referenced, an
+ external definition has to appear in another translation unit (see <a href="#6.9">6.9</a>); the inline definition and the external
+ definition are distinct and either may be used for the call.
+<p><b> Forward references</b>: function definitions (<a href="#6.9.1">6.9.1</a>).
+<!--page 126 -->
+
+<p><b>Footnotes</b>
+<p><small><a name="note120" href="#note120">120)</a> By using, for example, an alternative to the usual function call mechanism, such as ''inline
+ substitution''. Inline substitution is not textual substitution, nor does it create a new function.
+ Therefore, for example, the expansion of a macro used within the body of the function uses the
+ definition it had at the point the function body appears, and not where the function is called; and
+ identifiers refer to the declarations in scope where the body occurs. Likewise, the function has a
+ single address, regardless of the number of inline definitions that occur in addition to the external
+ definition.
+</small>
+<p><small><a name="note121" href="#note121">121)</a> For example, an implementation might never perform inline substitution, or might only perform inline
+ substitutions to calls in the scope of an inline declaration.
+</small>
+<p><small><a name="note122" href="#note122">122)</a> Since an inline definition is distinct from the corresponding external definition and from any other
+ corresponding inline definitions in other translation units, all corresponding objects with static storage
+ duration are also distinct in each of the definitions.
+</small>
+
+<h4><a name="6.7.5" href="#6.7.5">6.7.5 Declarators</a></h4>
+<p><b>Syntax</b>
+<p><!--para 1 -->
+<pre>
+          declarator:
+                 pointer<sub>opt</sub> direct-declarator
+          direct-declarator:
+                  identifier
+                  ( declarator )
+                  direct-declarator [ type-qualifier-list<sub>opt</sub> assignment-expression<sub>opt</sub> ]
+                  direct-declarator [ static type-qualifier-list<sub>opt</sub> assignment-expression ]
+                  direct-declarator [ type-qualifier-list static assignment-expression ]
+                  direct-declarator [ type-qualifier-list<sub>opt</sub> * ]
+                  direct-declarator ( parameter-type-list )
+                  direct-declarator ( identifier-list<sub>opt</sub> )
+          pointer:
+                 * type-qualifier-list<sub>opt</sub>
+                 * type-qualifier-list<sub>opt</sub> pointer
+          type-qualifier-list:
+                 type-qualifier
+                 type-qualifier-list type-qualifier
+          parameter-type-list:
+                parameter-list
+                parameter-list , ...
+          parameter-list:
+                parameter-declaration
+                parameter-list , parameter-declaration
+          parameter-declaration:
+                declaration-specifiers declarator
+                declaration-specifiers abstract-declarator<sub>opt</sub>
+          identifier-list:
+                  identifier
+                  identifier-list , identifier
+</pre>
+<p><b>Semantics</b>
+<p><!--para 2 -->
+ Each declarator declares one identifier, and asserts that when an operand of the same
+ form as the declarator appears in an expression, it designates a function or object with the
+ scope, storage duration, and type indicated by the declaration specifiers.
+<p><!--para 3 -->
+ A full declarator is a declarator that is not part of another declarator. The end of a full
+ declarator is a sequence point. If, in the nested sequence of declarators in a full
+<!--page 127 -->
+ declarator, there is a declarator specifying a variable length array type, the type specified
+ by the full declarator is said to be variably modified. Furthermore, any type derived by
+ declarator type derivation from a variably modified type is itself variably modified.
+<p><!--para 4 -->
+ In the following subclauses, consider a declaration
+<pre>
+         T D1
+</pre>
+ where T contains the declaration specifiers that specify a type T (such as int) and D1 is
+ a declarator that contains an identifier ident. The type specified for the identifier ident in
+ the various forms of declarator is described inductively using this notation.
+<p><!--para 5 -->
+ If, in the declaration ''T D1'', D1 has the form
+<pre>
+         identifier
+</pre>
+ then the type specified for ident is T .
+<p><!--para 6 -->
+ If, in the declaration ''T D1'', D1 has the form
+<pre>
+         ( D )
+</pre>
+ then ident has the type specified by the declaration ''T D''. Thus, a declarator in
+ parentheses is identical to the unparenthesized declarator, but the binding of complicated
+ declarators may be altered by parentheses.
+<p><b>Implementation limits</b>
+<p><!--para 7 -->
+ As discussed in <a href="#5.2.4.1">5.2.4.1</a>, an implementation may limit the number of pointer, array, and
+ function declarators that modify an arithmetic, structure, union, or incomplete type, either
+ directly or via one or more typedefs.
+<p><b> Forward references</b>: array declarators (<a href="#6.7.5.2">6.7.5.2</a>), type definitions (<a href="#6.7.7">6.7.7</a>).
+
+<h5><a name="6.7.5.1" href="#6.7.5.1">6.7.5.1 Pointer declarators</a></h5>
+<p><b>Semantics</b>
+<p><!--para 1 -->
+ If, in the declaration ''T D1'', D1 has the form
+<pre>
+         * type-qualifier-list<sub>opt</sub> D
+</pre>
+ and the type specified for ident in the declaration ''T D'' is ''derived-declarator-type-list
+ T '', then the type specified for ident is ''derived-declarator-type-list type-qualifier-list
+ pointer to T ''. For each type qualifier in the list, ident is a so-qualified pointer.
+<p><!--para 2 -->
+ For two pointer types to be compatible, both shall be identically qualified and both shall
+ be pointers to compatible types.
+<p><!--para 3 -->
+ EXAMPLE The following pair of declarations demonstrates the difference between a ''variable pointer
+ to a constant value'' and a ''constant pointer to a variable value''.
+<!--page 128 -->
+<pre>
+          const int *ptr_to_constant;
+          int *const constant_ptr;
+</pre>
+ The contents of any object pointed to by ptr_to_constant shall not be modified through that pointer,
+ but ptr_to_constant itself may be changed to point to another object. Similarly, the contents of the
+ int pointed to by constant_ptr may be modified, but constant_ptr itself shall always point to the
+ same location.
+<p><!--para 4 -->
+ The declaration of the constant pointer constant_ptr may be clarified by including a definition for the
+ type ''pointer to int''.
+<pre>
+          typedef int *int_ptr;
+          const int_ptr constant_ptr;
+</pre>
+ declares constant_ptr as an object that has type ''const-qualified pointer to int''.
+
+<h5><a name="6.7.5.2" href="#6.7.5.2">6.7.5.2 Array declarators</a></h5>
+<p><b>Constraints</b>
+<p><!--para 1 -->
+ In addition to optional type qualifiers and the keyword static, the [ and ] may delimit
+ an expression or *. If they delimit an expression (which specifies the size of an array), the
+ expression shall have an integer type. If the expression is a constant expression, it shall
+ have a value greater than zero. The element type shall not be an incomplete or function
+ type. The optional type qualifiers and the keyword static shall appear only in a
+ declaration of a function parameter with an array type, and then only in the outermost
+ array type derivation.
+<p><!--para 2 -->
+ An ordinary identifier (as defined in <a href="#6.2.3">6.2.3</a>) that has a variably modified type shall have
+ either block scope and no linkage or function prototype scope. If an identifier is declared
+ to be an object with static storage duration, it shall not have a variable length array type.
+<p><b>Semantics</b>
+<p><!--para 3 -->
+ If, in the declaration ''T D1'', D1 has one of the forms:
+<pre>
+          D[ type-qualifier-list<sub>opt</sub> assignment-expression<sub>opt</sub> ]
+          D[ static type-qualifier-list<sub>opt</sub> assignment-expression ]
+          D[ type-qualifier-list static assignment-expression ]
+          D[ type-qualifier-list<sub>opt</sub> * ]
+</pre>
+ and the type specified for ident in the declaration ''T D'' is ''derived-declarator-type-list
+ T '', then the type specified for ident is ''derived-declarator-type-list array of T ''.<sup><a href="#note123"><b>123)</b></a></sup>
+ (See <a href="#6.7.5.3">6.7.5.3</a> for the meaning of the optional type qualifiers and the keyword static.)
+<p><!--para 4 -->
+ If the size is not present, the array type is an incomplete type. If the size is * instead of
+ being an expression, the array type is a variable length array type of unspecified size,
+ which can only be used in declarations with function prototype scope;<sup><a href="#note124"><b>124)</b></a></sup> such arrays are
+ nonetheless complete types. If the size is an integer constant expression and the element
+<!--page 129 -->
+ type has a known constant size, the array type is not a variable length array type;
+ otherwise, the array type is a variable length array type.
+<p><!--para 5 -->
+ If the size is an expression that is not an integer constant expression: if it occurs in a
+ declaration at function prototype scope, it is treated as if it were replaced by *; otherwise,
+ each time it is evaluated it shall have a value greater than zero. The size of each instance
+ of a variable length array type does not change during its lifetime. Where a size
+ expression is part of the operand of a sizeof operator and changing the value of the
+ size expression would not affect the result of the operator, it is unspecified whether or not
+ the size expression is evaluated.
+<p><!--para 6 -->
+ For two array types to be compatible, both shall have compatible element types, and if
+ both size specifiers are present, and are integer constant expressions, then both size
+ specifiers shall have the same constant value. If the two array types are used in a context
+ which requires them to be compatible, it is undefined behavior if the two size specifiers
+ evaluate to unequal values.
+<p><!--para 7 -->
+ EXAMPLE 1
+<pre>
+          float fa[11], *afp[17];
+</pre>
+ declares an array of float numbers and an array of pointers to float numbers.
+<p><!--para 8 -->
+ EXAMPLE 2       Note the distinction between the declarations
+<pre>
+          extern int *x;
+          extern int y[];
+</pre>
+ The first declares x to be a pointer to int; the second declares y to be an array of int of unspecified size
+ (an incomplete type), the storage for which is defined elsewhere.
+<p><!--para 9 -->
+ EXAMPLE 3       The following declarations demonstrate the compatibility rules for variably modified types.
+<pre>
+          extern int n;
+          extern int m;
+          void fcompat(void)
+          {
+                int a[n][6][m];
+                int (*p)[4][n+1];
+                int c[n][n][6][m];
+                int (*r)[n][n][n+1];
+                p = a;      // invalid: not compatible because 4 != 6
+                r = c;      // compatible, but defined behavior only if
+                            // n == 6 and m == n+1
+          }
+</pre>
+<!--page 130 -->
+<p><!--para 10 -->
+ EXAMPLE 4 All declarations of variably modified (VM) types have to be at either block scope or
+ function prototype scope. Array objects declared with the static or extern storage-class specifier
+ cannot have a variable length array (VLA) type. However, an object declared with the static storage-
+ class specifier can have a VM type (that is, a pointer to a VLA type). Finally, all identifiers declared with a
+ VM type have to be ordinary identifiers and cannot, therefore, be members of structures or unions.
+<pre>
+          extern int n;
+          int A[n];                                             // invalid: file scope VLA
+          extern int (*p2)[n];                                  // invalid: file scope VM
+          int B[100];                                           // valid: file scope but not VM
+          void fvla(int m, int C[m][m]);                        // valid: VLA with prototype scope
+          void fvla(int m, int C[m][m])                         // valid: adjusted to auto pointer to VLA
+          {
+                typedef int VLA[m][m];                          // valid: block scope typedef VLA
+                   struct tag {
+                         int (*y)[n];                           // invalid: y not ordinary identifier
+                         int z[n];                              // invalid: z not ordinary identifier
+                   };
+                   int D[m];                                    //   valid: auto VLA
+                   static int E[m];                             //   invalid: static block scope VLA
+                   extern int F[m];                             //   invalid: F has linkage and is VLA
+                   int (*s)[m];                                 //   valid: auto pointer to VLA
+                   extern int (*r)[m];                          //   invalid: r has linkage and points to VLA
+                   static int (*q)[m] = &amp;B;                     //   valid: q is a static block pointer to VLA
+          }
+</pre>
+<p><b> Forward references</b>:            function declarators (<a href="#6.7.5.3">6.7.5.3</a>), function definitions (<a href="#6.9.1">6.9.1</a>),
+ initialization (<a href="#6.7.8">6.7.8</a>).
+
+<p><b>Footnotes</b>
+<p><small><a name="note123" href="#note123">123)</a> When several ''array of'' specifications are adjacent, a multidimensional array is declared.
+</small>
+<p><small><a name="note124" href="#note124">124)</a> Thus, * can be used only in function declarations that are not definitions (see <a href="#6.7.5.3">6.7.5.3</a>).
+</small>
+
+<h5><a name="6.7.5.3" href="#6.7.5.3">6.7.5.3 Function declarators (including prototypes)</a></h5>
+<p><b>Constraints</b>
+<p><!--para 1 -->
+ A function declarator shall not specify a return type that is a function type or an array
+ type.
+<p><!--para 2 -->
+ The only storage-class specifier that shall occur in a parameter declaration is register.
+<p><!--para 3 -->
+ An identifier list in a function declarator that is not part of a definition of that function
+ shall be empty.
+<p><!--para 4 -->
+ After adjustment, the parameters in a parameter type list in a function declarator that is
+ part of a definition of that function shall not have incomplete type.
+<p><b>Semantics</b>
+<p><!--para 5 -->
+ If, in the declaration ''T D1'', D1 has the form
+<pre>
+          D( parameter-type-list )
+</pre>
+ or
+<!--page 131 -->
+<pre>
+          D( identifier-list<sub>opt</sub> )
+</pre>
+ and the type specified for ident in the declaration ''T D'' is ''derived-declarator-type-list
+ T '', then the type specified for ident is ''derived-declarator-type-list function returning
+ T ''.
+<p><!--para 6 -->
+ A parameter type list specifies the types of, and may declare identifiers for, the
+ parameters of the function.
+<p><!--para 7 -->
+ A declaration of a parameter as ''array of type'' shall be adjusted to ''qualified pointer to
+ type'', where the type qualifiers (if any) are those specified within the [ and ] of the
+ array type derivation. If the keyword static also appears within the [ and ] of the
+ array type derivation, then for each call to the function, the value of the corresponding
+ actual argument shall provide access to the first element of an array with at least as many
+ elements as specified by the size expression.
+<p><!--para 8 -->
+ A declaration of a parameter as ''function returning type'' shall be adjusted to ''pointer to
+ function returning type'', as in <a href="#6.3.2.1">6.3.2.1</a>.
+<p><!--para 9 -->
+ If the list terminates with an ellipsis (, ...), no information about the number or types
+ of the parameters after the comma is supplied.<sup><a href="#note125"><b>125)</b></a></sup>
+<p><!--para 10 -->
+ The special case of an unnamed parameter of type void as the only item in the list
+ specifies that the function has no parameters.
+<p><!--para 11 -->
+ If, in a parameter declaration, an identifier can be treated either as a typedef name or as a
+ parameter name, it shall be taken as a typedef name.
+<p><!--para 12 -->
+ If the function declarator is not part of a definition of that function, parameters may have
+ incomplete type and may use the [*] notation in their sequences of declarator specifiers
+ to specify variable length array types.
+<p><!--para 13 -->
+ The storage-class specifier in the declaration specifiers for a parameter declaration, if
+ present, is ignored unless the declared parameter is one of the members of the parameter
+ type list for a function definition.
+<p><!--para 14 -->
+ An identifier list declares only the identifiers of the parameters of the function. An empty
+ list in a function declarator that is part of a definition of that function specifies that the
+ function has no parameters. The empty list in a function declarator that is not part of a
+ definition of that function specifies that no information about the number or types of the
+ parameters is supplied.<sup><a href="#note126"><b>126)</b></a></sup>
+<p><!--para 15 -->
+ For two function types to be compatible, both shall specify compatible return types.<sup><a href="#note127"><b>127)</b></a></sup>
+<!--page 132 -->
+ Moreover, the parameter type lists, if both are present, shall agree in the number of
+ parameters and in use of the ellipsis terminator; corresponding parameters shall have
+ compatible types. If one type has a parameter type list and the other type is specified by a
+ function declarator that is not part of a function definition and that contains an empty
+ identifier list, the parameter list shall not have an ellipsis terminator and the type of each
+ parameter shall be compatible with the type that results from the application of the
+ default argument promotions. If one type has a parameter type list and the other type is
+ specified by a function definition that contains a (possibly empty) identifier list, both shall
+ agree in the number of parameters, and the type of each prototype parameter shall be
+ compatible with the type that results from the application of the default argument
+ promotions to the type of the corresponding identifier. (In the determination of type
+ compatibility and of a composite type, each parameter declared with function or array
+ type is taken as having the adjusted type and each parameter declared with qualified type
+ is taken as having the unqualified version of its declared type.)
+<p><!--para 16 -->
+ EXAMPLE 1       The declaration
+<pre>
+          int f(void), *fip(), (*pfi)();
+</pre>
+ declares a function f with no parameters returning an int, a function fip with no parameter specification
+ returning a pointer to an int, and a pointer pfi to a function with no parameter specification returning an
+ int. It is especially useful to compare the last two. The binding of *fip() is *(fip()), so that the
+ declaration suggests, and the same construction in an expression requires, the calling of a function fip,
+ and then using indirection through the pointer result to yield an int. In the declarator (*pfi)(), the
+ extra parentheses are necessary to indicate that indirection through a pointer to a function yields a function
+ designator, which is then used to call the function; it returns an int.
+<p><!--para 17 -->
+ If the declaration occurs outside of any function, the identifiers have file scope and external linkage. If the
+ declaration occurs inside a function, the identifiers of the functions f and fip have block scope and either
+ internal or external linkage (depending on what file scope declarations for these identifiers are visible), and
+ the identifier of the pointer pfi has block scope and no linkage.
+<p><!--para 18 -->
+ EXAMPLE 2       The declaration
+<pre>
+          int (*apfi[3])(int *x, int *y);
+</pre>
+ declares an array apfi of three pointers to functions returning int. Each of these functions has two
+ parameters that are pointers to int. The identifiers x and y are declared for descriptive purposes only and
+ go out of scope at the end of the declaration of apfi.
+<p><!--para 19 -->
+ EXAMPLE 3       The declaration
+<pre>
+          int (*fpfi(int (*)(long), int))(int, ...);
+</pre>
+ declares a function fpfi that returns a pointer to a function returning an int. The function fpfi has two
+ parameters: a pointer to a function returning an int (with one parameter of type long int), and an int.
+ The pointer returned by fpfi points to a function that has one int parameter and accepts zero or more
+ additional arguments of any type.
+<!--page 133 -->
+<p><!--para 20 -->
+ EXAMPLE 4        The following prototype has a variably modified parameter.
+<pre>
+           void addscalar(int n, int m,
+                 double a[n][n*m+300], double x);
+           int main()
            {
-                 va_list args;
-                    va_start(args, format);
-                    // print out name of function causing error
-                    fprintf(stderr, "ERROR in %s: ", function_name);
-                    // print out remainder of message
-                    vfprintf(stderr, format, args);
-                    va_end(args);
+                 double b[4][308];
+                 addscalar(4, 2, b, <a href="#2.17">2.17</a>);
+                 return 0;
            }
-
-
-
-
-    254) As the functions vfprintf, vfscanf, vprintf, vscanf, vsnprintf, vsprintf, and
-         vsscanf invoke the va_arg macro, the value of arg after the return is indeterminate.
-
-[<a name="p292" href="#p292">page 292</a>] (<a href="#Contents">Contents</a>)
-
-<a name="7.19.6.9" href="#7.19.6.9"><b>    7.19.6.9 The vfscanf function</b></a>
-    Synopsis
-1          #include <a href="#7.15">&lt;stdarg.h&gt;</a>
-           #include <a href="#7.19">&lt;stdio.h&gt;</a>
-           int vfscanf(FILE * restrict stream,
-                const char * restrict format,
-                va_list arg);
-    Description
-2   The vfscanf function is equivalent to fscanf, with the variable argument list
-    replaced by arg, which shall have been initialized by the va_start macro (and
-    possibly subsequent va_arg calls). The vfscanf function does not invoke the
-    va_end macro.254)
-    Returns
-3   The vfscanf function returns the value of the macro EOF if an input failure occurs
-    before any conversion. Otherwise, the vfscanf function returns the number of input
-    items assigned, which can be fewer than provided for, or even zero, in the event of an
-    early matching failure.
-<a name="7.19.6.10" href="#7.19.6.10"><b>    7.19.6.10 The vprintf function</b></a>
-    Synopsis
-1          #include <a href="#7.15">&lt;stdarg.h&gt;</a>
-           #include <a href="#7.19">&lt;stdio.h&gt;</a>
-           int vprintf(const char * restrict format,
-                va_list arg);
-    Description
-2   The vprintf function is equivalent to printf, with the variable argument list
-    replaced by arg, which shall have been initialized by the va_start macro (and
-    possibly subsequent va_arg calls). The vprintf function does not invoke the
-    va_end macro.254)
-    Returns
-3   The vprintf function returns the number of characters transmitted, or a negative value
-    if an output or encoding error occurred.
-
-
-
-
-[<a name="p293" href="#p293">page 293</a>] (<a href="#Contents">Contents</a>)
-
-<a name="7.19.6.11" href="#7.19.6.11"><b>    7.19.6.11 The vscanf function</b></a>
-    Synopsis
-1          #include <a href="#7.15">&lt;stdarg.h&gt;</a>
-           #include <a href="#7.19">&lt;stdio.h&gt;</a>
-           int vscanf(const char * restrict format,
-                va_list arg);
-    Description
-2   The vscanf function is equivalent to scanf, with the variable argument list replaced
-    by arg, which shall have been initialized by the va_start macro (and possibly
-    subsequent va_arg calls). The vscanf function does not invoke the va_end
-    macro.254)
-    Returns
-3   The vscanf function returns the value of the macro EOF if an input failure occurs
-    before any conversion. Otherwise, the vscanf function returns the number of input
-    items assigned, which can be fewer than provided for, or even zero, in the event of an
-    early matching failure.
-<a name="7.19.6.12" href="#7.19.6.12"><b>    7.19.6.12 The vsnprintf function</b></a>
-    Synopsis
-1          #include <a href="#7.15">&lt;stdarg.h&gt;</a>
-           #include <a href="#7.19">&lt;stdio.h&gt;</a>
-           int vsnprintf(char * restrict s, size_t n,
-                const char * restrict format,
-                va_list arg);
-    Description
-2   The vsnprintf function is equivalent to snprintf, with the variable argument list
-    replaced by arg, which shall have been initialized by the va_start macro (and
-    possibly subsequent va_arg calls). The vsnprintf function does not invoke the
-    va_end macro.254) If copying takes place between objects that overlap, the behavior is
-    undefined.
-    Returns
-3   The vsnprintf function returns the number of characters that would have been written
-    had n been sufficiently large, not counting the terminating null character, or a negative
-    value if an encoding error occurred. Thus, the null-terminated output has been
-    completely written if and only if the returned value is nonnegative and less than n.
-
-
-
-
-[<a name="p294" href="#p294">page 294</a>] (<a href="#Contents">Contents</a>)
-
-<a name="7.19.6.13" href="#7.19.6.13"><b>    7.19.6.13 The vsprintf function</b></a>
-    Synopsis
-1          #include <a href="#7.15">&lt;stdarg.h&gt;</a>
-           #include <a href="#7.19">&lt;stdio.h&gt;</a>
-           int vsprintf(char * restrict s,
-                const char * restrict format,
-                va_list arg);
-    Description
-2   The vsprintf function is equivalent to sprintf, with the variable argument list
-    replaced by arg, which shall have been initialized by the va_start macro (and
-    possibly subsequent va_arg calls). The vsprintf function does not invoke the
-    va_end macro.254) If copying takes place between objects that overlap, the behavior is
-    undefined.
-    Returns
-3   The vsprintf function returns the number of characters written in the array, not
-    counting the terminating null character, or a negative value if an encoding error occurred.
-<a name="7.19.6.14" href="#7.19.6.14"><b>    7.19.6.14 The vsscanf function</b></a>
-    Synopsis
-1          #include <a href="#7.15">&lt;stdarg.h&gt;</a>
-           #include <a href="#7.19">&lt;stdio.h&gt;</a>
-           int vsscanf(const char * restrict s,
-                const char * restrict format,
-                va_list arg);
-    Description
-2   The vsscanf function is equivalent to sscanf, with the variable argument list
-    replaced by arg, which shall have been initialized by the va_start macro (and
-    possibly subsequent va_arg calls). The vsscanf function does not invoke the
-    va_end macro.254)
-    Returns
-3   The vsscanf function returns the value of the macro EOF if an input failure occurs
-    before any conversion. Otherwise, the vsscanf function returns the number of input
-    items assigned, which can be fewer than provided for, or even zero, in the event of an
-    early matching failure.
-
-
-
-
-[<a name="p295" href="#p295">page 295</a>] (<a href="#Contents">Contents</a>)
-
-<a name="7.19.7" href="#7.19.7"><b>    7.19.7 Character input/output functions</b></a>
-<a name="7.19.7.1" href="#7.19.7.1"><b>    7.19.7.1 The fgetc function</b></a>
-    Synopsis
-1           #include <a href="#7.19">&lt;stdio.h&gt;</a>
-            int fgetc(FILE *stream);
-    Description
-2   If the end-of-file indicator for the input stream pointed to by stream is not set and a
-    next character is present, the fgetc function obtains that character as an unsigned
-    char converted to an int and advances the associated file position indicator for the
-    stream (if defined).
-    Returns
-3   If the end-of-file indicator for the stream is set, or if the stream is at end-of-file, the end-
-    of-file indicator for the stream is set and the fgetc function returns EOF. Otherwise, the
-    fgetc function returns the next character from the input stream pointed to by stream.
-    If a read error occurs, the error indicator for the stream is set and the fgetc function
-    returns EOF.255)
-<a name="7.19.7.2" href="#7.19.7.2"><b>    7.19.7.2 The fgets function</b></a>
-    Synopsis
-1           #include <a href="#7.19">&lt;stdio.h&gt;</a>
-            char *fgets(char * restrict s, int n,
-                 FILE * restrict stream);
-    Description
-2   The fgets function reads at most one less than the number of characters specified by n
-    from the stream pointed to by stream into the array pointed to by s. No additional
-    characters are read after a new-line character (which is retained) or after end-of-file. A
-    null character is written immediately after the last character read into the array.
-    Returns
-3   The fgets function returns s if successful. If end-of-file is encountered and no
-    characters have been read into the array, the contents of the array remain unchanged and a
-    null pointer is returned. If a read error occurs during the operation, the array contents are
-    indeterminate and a null pointer is returned.
-
-
-
-
-    255) An end-of-file and a read error can be distinguished by use of the feof and ferror functions.
-
-[<a name="p296" href="#p296">page 296</a>] (<a href="#Contents">Contents</a>)
-
-<a name="7.19.7.3" href="#7.19.7.3"><b>    7.19.7.3 The fputc function</b></a>
-    Synopsis
-1          #include <a href="#7.19">&lt;stdio.h&gt;</a>
-           int fputc(int c, FILE *stream);
-    Description
-2   The fputc function writes the character specified by c (converted to an unsigned
-    char) to the output stream pointed to by stream, at the position indicated by the
-    associated file position indicator for the stream (if defined), and advances the indicator
-    appropriately. If the file cannot support positioning requests, or if the stream was opened
-    with append mode, the character is appended to the output stream.
-    Returns
-3   The fputc function returns the character written. If a write error occurs, the error
-    indicator for the stream is set and fputc returns EOF.
-<a name="7.19.7.4" href="#7.19.7.4"><b>    7.19.7.4 The fputs function</b></a>
-    Synopsis
-1          #include <a href="#7.19">&lt;stdio.h&gt;</a>
-           int fputs(const char * restrict s,
-                FILE * restrict stream);
-    Description
-2   The fputs function writes the string pointed to by s to the stream pointed to by
-    stream. The terminating null character is not written.
-    Returns
-3   The fputs function returns EOF if a write error occurs; otherwise it returns a
-    nonnegative value.
-<a name="7.19.7.5" href="#7.19.7.5"><b>    7.19.7.5 The getc function</b></a>
-    Synopsis
-1          #include <a href="#7.19">&lt;stdio.h&gt;</a>
-           int getc(FILE *stream);
-    Description
-2   The getc function is equivalent to fgetc, except that if it is implemented as a macro, it
-    may evaluate stream more than once, so the argument should never be an expression
-    with side effects.
-
-
-
-
-[<a name="p297" href="#p297">page 297</a>] (<a href="#Contents">Contents</a>)
-
-    Returns
-3   The getc function returns the next character from the input stream pointed to by
-    stream. If the stream is at end-of-file, the end-of-file indicator for the stream is set and
-    getc returns EOF. If a read error occurs, the error indicator for the stream is set and
-    getc returns EOF.
-<a name="7.19.7.6" href="#7.19.7.6"><b>    7.19.7.6 The getchar function</b></a>
-    Synopsis
-1          #include <a href="#7.19">&lt;stdio.h&gt;</a>
-           int getchar(void);
-    Description
-2   The getchar function is equivalent to getc with the argument stdin.
-    Returns
-3   The getchar function returns the next character from the input stream pointed to by
-    stdin. If the stream is at end-of-file, the end-of-file indicator for the stream is set and
-    getchar returns EOF. If a read error occurs, the error indicator for the stream is set and
-    getchar returns EOF.
-<a name="7.19.7.7" href="#7.19.7.7"><b>    7.19.7.7 The gets function</b></a>
-    Synopsis
-1          #include <a href="#7.19">&lt;stdio.h&gt;</a>
-           char *gets(char *s);
-    Description
-2   The gets function reads characters from the input stream pointed to by stdin, into the
-    array pointed to by s, until end-of-file is encountered or a new-line character is read.
-    Any new-line character is discarded, and a null character is written immediately after the
-    last character read into the array.
-    Returns
-3   The gets function returns s if successful. If end-of-file is encountered and no
-    characters have been read into the array, the contents of the array remain unchanged and a
-    null pointer is returned. If a read error occurs during the operation, the array contents are
-    indeterminate and a null pointer is returned.
-    Forward references: future library directions (<a href="#7.26.9">7.26.9</a>).
-
-
-
-
-[<a name="p298" href="#p298">page 298</a>] (<a href="#Contents">Contents</a>)
-
-<a name="7.19.7.8" href="#7.19.7.8"><b>    7.19.7.8 The putc function</b></a>
-    Synopsis
-1          #include <a href="#7.19">&lt;stdio.h&gt;</a>
-           int putc(int c, FILE *stream);
-    Description
-2   The putc function is equivalent to fputc, except that if it is implemented as a macro, it
-    may evaluate stream more than once, so that argument should never be an expression
-    with side effects.
-    Returns
-3   The putc function returns the character written. If a write error occurs, the error
-    indicator for the stream is set and putc returns EOF.
-<a name="7.19.7.9" href="#7.19.7.9"><b>    7.19.7.9 The putchar function</b></a>
-    Synopsis
-1          #include <a href="#7.19">&lt;stdio.h&gt;</a>
-           int putchar(int c);
-    Description
-2   The putchar function is equivalent to putc with the second argument stdout.
-    Returns
-3   The putchar function returns the character written. If a write error occurs, the error
-    indicator for the stream is set and putchar returns EOF.
-<a name="7.19.7.10" href="#7.19.7.10"><b>    7.19.7.10 The puts function</b></a>
-    Synopsis
-1          #include <a href="#7.19">&lt;stdio.h&gt;</a>
-           int puts(const char *s);
-    Description
-2   The puts function writes the string pointed to by s to the stream pointed to by stdout,
-    and appends a new-line character to the output. The terminating null character is not
-    written.
-    Returns
-3   The puts function returns EOF if a write error occurs; otherwise it returns a nonnegative
-    value.
-
-
-
-
-[<a name="p299" href="#p299">page 299</a>] (<a href="#Contents">Contents</a>)
-
-<a name="7.19.7.11" href="#7.19.7.11"><b>    7.19.7.11 The ungetc function</b></a>
-    Synopsis
-1            #include <a href="#7.19">&lt;stdio.h&gt;</a>
-             int ungetc(int c, FILE *stream);
-    Description
-2   The ungetc function pushes the character specified by c (converted to an unsigned
-    char) back onto the input stream pointed to by stream. Pushed-back characters will be
-    returned by subsequent reads on that stream in the reverse order of their pushing. A
-    successful intervening call (with the stream pointed to by stream) to a file positioning
-    function (fseek, fsetpos, or rewind) discards any pushed-back characters for the
-    stream. The external storage corresponding to the stream is unchanged.
-3   One character of pushback is guaranteed. If the ungetc function is called too many
-    times on the same stream without an intervening read or file positioning operation on that
-    stream, the operation may fail.
-4   If the value of c equals that of the macro EOF, the operation fails and the input stream is
-    unchanged.
-5   A successful call to the ungetc function clears the end-of-file indicator for the stream.
-    The value of the file position indicator for the stream after reading or discarding all
-    pushed-back characters shall be the same as it was before the characters were pushed
-    back. For a text stream, the value of its file position indicator after a successful call to the
-    ungetc function is unspecified until all pushed-back characters are read or discarded.
-    For a binary stream, its file position indicator is decremented by each successful call to
-    the ungetc function; if its value was zero before a call, it is indeterminate after the
-    call.256)
-    Returns
-6   The ungetc function returns the character pushed back after conversion, or EOF if the
-    operation fails.
-    Forward references: file positioning functions (<a href="#7.19.9">7.19.9</a>).
-
-
-
-
-    256) See ''future library directions'' (<a href="#7.26.9">7.26.9</a>).
-
-[<a name="p300" href="#p300">page 300</a>] (<a href="#Contents">Contents</a>)
-
-<a name="7.19.8" href="#7.19.8"><b>    7.19.8 Direct input/output functions</b></a>
-<a name="7.19.8.1" href="#7.19.8.1"><b>    7.19.8.1 The fread function</b></a>
-    Synopsis
-1          #include <a href="#7.19">&lt;stdio.h&gt;</a>
-           size_t fread(void * restrict ptr,
-                size_t size, size_t nmemb,
-                FILE * restrict stream);
-    Description
-2   The fread function reads, into the array pointed to by ptr, up to nmemb elements
-    whose size is specified by size, from the stream pointed to by stream. For each
-    object, size calls are made to the fgetc function and the results stored, in the order
-    read, in an array of unsigned char exactly overlaying the object. The file position
-    indicator for the stream (if defined) is advanced by the number of characters successfully
-    read. If an error occurs, the resulting value of the file position indicator for the stream is
-    indeterminate. If a partial element is read, its value is indeterminate.
-    Returns
-3   The fread function returns the number of elements successfully read, which may be
-    less than nmemb if a read error or end-of-file is encountered. If size or nmemb is zero,
-    fread returns zero and the contents of the array and the state of the stream remain
-    unchanged.
-<a name="7.19.8.2" href="#7.19.8.2"><b>    7.19.8.2 The fwrite function</b></a>
-    Synopsis
-1          #include <a href="#7.19">&lt;stdio.h&gt;</a>
-           size_t fwrite(const void * restrict ptr,
-                size_t size, size_t nmemb,
-                FILE * restrict stream);
-    Description
-2   The fwrite function writes, from the array pointed to by ptr, up to nmemb elements
-    whose size is specified by size, to the stream pointed to by stream. For each object,
-    size calls are made to the fputc function, taking the values (in order) from an array of
-    unsigned char exactly overlaying the object. The file position indicator for the
-    stream (if defined) is advanced by the number of characters successfully written. If an
-    error occurs, the resulting value of the file position indicator for the stream is
-    indeterminate.
-
-
-
-
-[<a name="p301" href="#p301">page 301</a>] (<a href="#Contents">Contents</a>)
-
-    Returns
-3   The fwrite function returns the number of elements successfully written, which will be
-    less than nmemb only if a write error is encountered. If size or nmemb is zero,
-    fwrite returns zero and the state of the stream remains unchanged.
-<a name="7.19.9" href="#7.19.9"><b>    7.19.9 File positioning functions</b></a>
-<a name="7.19.9.1" href="#7.19.9.1"><b>    7.19.9.1 The fgetpos function</b></a>
-    Synopsis
-1          #include <a href="#7.19">&lt;stdio.h&gt;</a>
-           int fgetpos(FILE * restrict stream,
-                fpos_t * restrict pos);
-    Description
-2   The fgetpos function stores the current values of the parse state (if any) and file
-    position indicator for the stream pointed to by stream in the object pointed to by pos.
-    The values stored contain unspecified information usable by the fsetpos function for
-    repositioning the stream to its position at the time of the call to the fgetpos function.
-    Returns
-3   If successful, the fgetpos function returns zero; on failure, the fgetpos function
-    returns nonzero and stores an implementation-defined positive value in errno.
-    Forward references: the fsetpos function (<a href="#7.19.9.3">7.19.9.3</a>).
-<a name="7.19.9.2" href="#7.19.9.2"><b>    7.19.9.2 The fseek function</b></a>
-    Synopsis
-1          #include <a href="#7.19">&lt;stdio.h&gt;</a>
-           int fseek(FILE *stream, long int offset, int whence);
-    Description
-2   The fseek function sets the file position indicator for the stream pointed to by stream.
-    If a read or write error occurs, the error indicator for the stream is set and fseek fails.
-3   For a binary stream, the new position, measured in characters from the beginning of the
-    file, is obtained by adding offset to the position specified by whence. The specified
-    position is the beginning of the file if whence is SEEK_SET, the current value of the file
-    position indicator if SEEK_CUR, or end-of-file if SEEK_END. A binary stream need not
-    meaningfully support fseek calls with a whence value of SEEK_END.
-4   For a text stream, either offset shall be zero, or offset shall be a value returned by
-    an earlier successful call to the ftell function on a stream associated with the same file
-    and whence shall be SEEK_SET.
-
-[<a name="p302" href="#p302">page 302</a>] (<a href="#Contents">Contents</a>)
-
-5   After determining the new position, a successful call to the fseek function undoes any
-    effects of the ungetc function on the stream, clears the end-of-file indicator for the
-    stream, and then establishes the new position. After a successful fseek call, the next
-    operation on an update stream may be either input or output.
-    Returns
-6   The fseek function returns nonzero only for a request that cannot be satisfied.
-    Forward references: the ftell function (<a href="#7.19.9.4">7.19.9.4</a>).
-<a name="7.19.9.3" href="#7.19.9.3"><b>    7.19.9.3 The fsetpos function</b></a>
-    Synopsis
-1          #include <a href="#7.19">&lt;stdio.h&gt;</a>
-           int fsetpos(FILE *stream, const fpos_t *pos);
-    Description
-2   The fsetpos function sets the mbstate_t object (if any) and file position indicator
-    for the stream pointed to by stream according to the value of the object pointed to by
-    pos, which shall be a value obtained from an earlier successful call to the fgetpos
-    function on a stream associated with the same file. If a read or write error occurs, the
-    error indicator for the stream is set and fsetpos fails.
-3   A successful call to the fsetpos function undoes any effects of the ungetc function
-    on the stream, clears the end-of-file indicator for the stream, and then establishes the new
-    parse state and position. After a successful fsetpos call, the next operation on an
-    update stream may be either input or output.
-    Returns
-4   If successful, the fsetpos function returns zero; on failure, the fsetpos function
-    returns nonzero and stores an implementation-defined positive value in errno.
-<a name="7.19.9.4" href="#7.19.9.4"><b>    7.19.9.4 The ftell function</b></a>
-    Synopsis
-1          #include <a href="#7.19">&lt;stdio.h&gt;</a>
-           long int ftell(FILE *stream);
-    Description
-2   The ftell function obtains the current value of the file position indicator for the stream
-    pointed to by stream. For a binary stream, the value is the number of characters from
-    the beginning of the file. For a text stream, its file position indicator contains unspecified
-    information, usable by the fseek function for returning the file position indicator for the
-    stream to its position at the time of the ftell call; the difference between two such
-    return values is not necessarily a meaningful measure of the number of characters written
-
-[<a name="p303" href="#p303">page 303</a>] (<a href="#Contents">Contents</a>)
-
-    or read.
-    Returns
-3   If successful, the ftell function returns the current value of the file position indicator
-    for the stream. On failure, the ftell function returns -1L and stores an
-    implementation-defined positive value in errno.
-<a name="7.19.9.5" href="#7.19.9.5"><b>    7.19.9.5 The rewind function</b></a>
-    Synopsis
-1          #include <a href="#7.19">&lt;stdio.h&gt;</a>
-           void rewind(FILE *stream);
-    Description
-2   The rewind function sets the file position indicator for the stream pointed to by
-    stream to the beginning of the file. It is equivalent to
-           (void)fseek(stream, 0L, SEEK_SET)
-    except that the error indicator for the stream is also cleared.
-    Returns
-3   The rewind function returns no value.
-<a name="7.19.10" href="#7.19.10"><b>    7.19.10 Error-handling functions</b></a>
-<a name="7.19.10.1" href="#7.19.10.1"><b>    7.19.10.1 The clearerr function</b></a>
-    Synopsis
-1          #include <a href="#7.19">&lt;stdio.h&gt;</a>
-           void clearerr(FILE *stream);
-    Description
-2   The clearerr function clears the end-of-file and error indicators for the stream pointed
-    to by stream.
-    Returns
-3   The clearerr function returns no value.
-
-
-
-
-[<a name="p304" href="#p304">page 304</a>] (<a href="#Contents">Contents</a>)
-
-<a name="7.19.10.2" href="#7.19.10.2"><b>    7.19.10.2 The feof function</b></a>
-    Synopsis
-1          #include <a href="#7.19">&lt;stdio.h&gt;</a>
-           int feof(FILE *stream);
-    Description
-2   The feof function tests the end-of-file indicator for the stream pointed to by stream.
-    Returns
-3   The feof function returns nonzero if and only if the end-of-file indicator is set for
-    stream.
-<a name="7.19.10.3" href="#7.19.10.3"><b>    7.19.10.3 The ferror function</b></a>
-    Synopsis
-1          #include <a href="#7.19">&lt;stdio.h&gt;</a>
-           int ferror(FILE *stream);
-    Description
-2   The ferror function tests the error indicator for the stream pointed to by stream.
-    Returns
-3   The ferror function returns nonzero if and only if the error indicator is set for
-    stream.
-<a name="7.19.10.4" href="#7.19.10.4"><b>    7.19.10.4 The perror function</b></a>
-    Synopsis
-1          #include <a href="#7.19">&lt;stdio.h&gt;</a>
-           void perror(const char *s);
-    Description
-2   The perror function maps the error number in the integer expression errno to an
-    error message. It writes a sequence of characters to the standard error stream thus: first
-    (if s is not a null pointer and the character pointed to by s is not the null character), the
-    string pointed to by s followed by a colon (:) and a space; then an appropriate error
-    message string followed by a new-line character. The contents of the error message
-    strings are the same as those returned by the strerror function with argument errno.
-    Returns
-3   The perror function returns no value.
-    Forward references: the strerror function (<a href="#7.21.6.2">7.21.6.2</a>).
-
-
-[<a name="p305" href="#p305">page 305</a>] (<a href="#Contents">Contents</a>)
-
-<a name="7.20" href="#7.20"><b>    7.20 General utilities &lt;stdlib.h&gt;</b></a>
-1   The header <a href="#7.20">&lt;stdlib.h&gt;</a> declares five types and several functions of general utility, and
-    defines several macros.257)
-2   The types declared are size_t and wchar_t (both described in <a href="#7.17">7.17</a>),
-             div_t
-    which is a structure type that is the type of the value returned by the div function,
-             ldiv_t
-    which is a structure type that is the type of the value returned by the ldiv function, and
-             lldiv_t
-    which is a structure type that is the type of the value returned by the lldiv function.
-3   The macros defined are NULL (described in <a href="#7.17">7.17</a>);
-             EXIT_FAILURE
-    and
-             EXIT_SUCCESS
-    which expand to integer constant expressions that can be used as the argument to the
-    exit function to return unsuccessful or successful termination status, respectively, to the
-    host environment;
-             RAND_MAX
-    which expands to an integer constant expression that is the maximum value returned by
-    the rand function; and
-             MB_CUR_MAX
-    which expands to a positive integer expression with type size_t that is the maximum
-    number of bytes in a multibyte character for the extended character set specified by the
-    current locale (category LC_CTYPE), which is never greater than MB_LEN_MAX.
-
-
-
-
-    257) See ''future library directions'' (<a href="#7.26.10">7.26.10</a>).
-
-[<a name="p306" href="#p306">page 306</a>] (<a href="#Contents">Contents</a>)
-
-<a name="7.20.1" href="#7.20.1"><b>    7.20.1 Numeric conversion functions</b></a>
-1   The functions atof, atoi, atol, and atoll need not affect the value of the integer
-    expression errno on an error. If the value of the result cannot be represented, the
-    behavior is undefined.
-<a name="7.20.1.1" href="#7.20.1.1"><b>    7.20.1.1 The atof function</b></a>
-    Synopsis
-1          #include <a href="#7.20">&lt;stdlib.h&gt;</a>
-           double atof(const char *nptr);
-    Description
-2   The atof function converts the initial portion of the string pointed to by nptr to
-    double representation. Except for the behavior on error, it is equivalent to
-           strtod(nptr, (char **)NULL)
-    Returns
-3   The atof function returns the converted value.
-    Forward references: the strtod, strtof, and strtold functions (<a href="#7.20.1.3">7.20.1.3</a>).
-<a name="7.20.1.2" href="#7.20.1.2"><b>    7.20.1.2 The atoi, atol, and atoll functions</b></a>
-    Synopsis
-1          #include <a href="#7.20">&lt;stdlib.h&gt;</a>
-           int atoi(const char *nptr);
-           long int atol(const char *nptr);
-           long long int atoll(const char *nptr);
-    Description
-2   The atoi, atol, and atoll functions convert the initial portion of the string pointed
-    to by nptr to int, long int, and long long int representation, respectively.
-    Except for the behavior on error, they are equivalent to
-           atoi: (int)strtol(nptr, (char **)NULL, 10)
-           atol: strtol(nptr, (char **)NULL, 10)
-           atoll: strtoll(nptr, (char **)NULL, 10)
-    Returns
-3   The atoi, atol, and atoll functions return the converted value.
-    Forward references: the strtol, strtoll, strtoul, and strtoull functions
-    (<a href="#7.20.1.4">7.20.1.4</a>).
-
-
-
-[<a name="p307" href="#p307">page 307</a>] (<a href="#Contents">Contents</a>)
-
-<a name="7.20.1.3" href="#7.20.1.3"><b>    7.20.1.3 The strtod, strtof, and strtold functions</b></a>
-    Synopsis
-1          #include <a href="#7.20">&lt;stdlib.h&gt;</a>
-           double strtod(const char * restrict nptr,
-                char ** restrict endptr);
-           float strtof(const char * restrict nptr,
-                char ** restrict endptr);
-           long double strtold(const char * restrict nptr,
-                char ** restrict endptr);
-    Description
-2   The strtod, strtof, and strtold functions convert the initial portion of the string
-    pointed to by nptr to double, float, and long double representation,
-    respectively. First, they decompose the input string into three parts: an initial, possibly
-    empty, sequence of white-space characters (as specified by the isspace function), a
-    subject sequence resembling a floating-point constant or representing an infinity or NaN;
-    and a final string of one or more unrecognized characters, including the terminating null
-    character of the input string. Then, they attempt to convert the subject sequence to a
-    floating-point number, and return the result.
-3   The expected form of the subject sequence is an optional plus or minus sign, then one of
-    the following:
-    -- a nonempty sequence of decimal digits optionally containing a decimal-point
-      character, then an optional exponent part as defined in <a href="#6.4.4.2">6.4.4.2</a>;
-    -- a 0x or 0X, then a nonempty sequence of hexadecimal digits optionally containing a
-      decimal-point character, then an optional binary exponent part as defined in <a href="#6.4.4.2">6.4.4.2</a>;
-    -- INF or INFINITY, ignoring case
-    -- NAN or NAN(n-char-sequenceopt), ignoring case in the NAN part, where:
-               n-char-sequence:
-                      digit
-                      nondigit
-                      n-char-sequence digit
-                      n-char-sequence nondigit
-    The subject sequence is defined as the longest initial subsequence of the input string,
-    starting with the first non-white-space character, that is of the expected form. The subject
-    sequence contains no characters if the input string is not of the expected form.
-4   If the subject sequence has the expected form for a floating-point number, the sequence of
-    characters starting with the first digit or the decimal-point character (whichever occurs
-    first) is interpreted as a floating constant according to the rules of <a href="#6.4.4.2">6.4.4.2</a>, except that the
-[<a name="p308" href="#p308">page 308</a>] (<a href="#Contents">Contents</a>)
-
-    decimal-point character is used in place of a period, and that if neither an exponent part
-    nor a decimal-point character appears in a decimal floating point number, or if a binary
-    exponent part does not appear in a hexadecimal floating point number, an exponent part
-    of the appropriate type with value zero is assumed to follow the last digit in the string. If
-    the subject sequence begins with a minus sign, the sequence is interpreted as negated.258)
-    A character sequence INF or INFINITY is interpreted as an infinity, if representable in
-    the return type, else like a floating constant that is too large for the range of the return
-    type. A character sequence NAN or NAN(n-char-sequenceopt), is interpreted as a quiet
-    NaN, if supported in the return type, else like a subject sequence part that does not have
-    the expected form; the meaning of the n-char sequences is implementation-defined.259) A
-    pointer to the final string is stored in the object pointed to by endptr, provided that
-    endptr is not a null pointer.
-5   If the subject sequence has the hexadecimal form and FLT_RADIX is a power of 2, the
-    value resulting from the conversion is correctly rounded.
-6   In other than the "C" locale, additional locale-specific subject sequence forms may be
-    accepted.
-7   If the subject sequence is empty or does not have the expected form, no conversion is
-    performed; the value of nptr is stored in the object pointed to by endptr, provided
-    that endptr is not a null pointer.
-    Recommended practice
-8   If the subject sequence has the hexadecimal form, FLT_RADIX is not a power of 2, and
-    the result is not exactly representable, the result should be one of the two numbers in the
-    appropriate internal format that are adjacent to the hexadecimal floating source value,
-    with the extra stipulation that the error should have a correct sign for the current rounding
-    direction.
-9   If the subject sequence has the decimal form and at most DECIMAL_DIG (defined in
-    <a href="#7.7">&lt;float.h&gt;</a>) significant digits, the result should be correctly rounded. If the subject
-    sequence D has the decimal form and more than DECIMAL_DIG significant digits,
-    consider the two bounding, adjacent decimal strings L and U, both having
-    DECIMAL_DIG significant digits, such that the values of L, D, and U satisfy L &lt;= D &lt;= U.
-    The result should be one of the (equal or adjacent) values that would be obtained by
-    correctly rounding L and U according to the current rounding direction, with the extra
-
-    258) It is unspecified whether a minus-signed sequence is converted to a negative number directly or by
-         negating the value resulting from converting the corresponding unsigned sequence (see <a href="#F.5">F.5</a>); the two
-         methods may yield different results if rounding is toward positive or negative infinity. In either case,
-         the functions honor the sign of zero if floating-point arithmetic supports signed zeros.
-    259) An implementation may use the n-char sequence to determine extra information to be represented in
-         the NaN's significand.
-
-[<a name="p309" href="#p309">page 309</a>] (<a href="#Contents">Contents</a>)
-
-     stipulation that the error with respect to D should have a correct sign for the current
-     rounding direction.260)
-     Returns
-10   The functions return the converted value, if any. If no conversion could be performed,
-     zero is returned. If the correct value is outside the range of representable values, plus or
-     minus HUGE_VAL, HUGE_VALF, or HUGE_VALL is returned (according to the return
-     type and sign of the value), and the value of the macro ERANGE is stored in errno. If
-     the result underflows (<a href="#7.12.1">7.12.1</a>), the functions return a value whose magnitude is no greater
-     than the smallest normalized positive number in the return type; whether errno acquires
-     the value ERANGE is implementation-defined.
-<a name="7.20.1.4" href="#7.20.1.4"><b>     7.20.1.4 The strtol, strtoll, strtoul, and strtoull functions</b></a>
-     Synopsis
-1            #include <a href="#7.20">&lt;stdlib.h&gt;</a>
-             long int strtol(
-                  const char * restrict nptr,
-                  char ** restrict endptr,
-                  int base);
-             long long int strtoll(
-                  const char * restrict nptr,
-                  char ** restrict endptr,
-                  int base);
-             unsigned long int strtoul(
-                  const char * restrict nptr,
-                  char ** restrict endptr,
-                  int base);
-             unsigned long long int strtoull(
-                  const char * restrict nptr,
-                  char ** restrict endptr,
-                  int base);
-     Description
-2    The strtol, strtoll, strtoul, and strtoull functions convert the initial
-     portion of the string pointed to by nptr to long int, long long int, unsigned
-     long int, and unsigned long long int representation, respectively. First,
-     they decompose the input string into three parts: an initial, possibly empty, sequence of
-     white-space characters (as specified by the isspace function), a subject sequence
-
-
-     260) DECIMAL_DIG, defined in <a href="#7.7">&lt;float.h&gt;</a>, should be sufficiently large that L and U will usually round
-          to the same internal floating value, but if not will round to adjacent values.
-
-[<a name="p310" href="#p310">page 310</a>] (<a href="#Contents">Contents</a>)
-
-    resembling an integer represented in some radix determined by the value of base, and a
-    final string of one or more unrecognized characters, including the terminating null
-    character of the input string. Then, they attempt to convert the subject sequence to an
-    integer, and return the result.
-3   If the value of base is zero, the expected form of the subject sequence is that of an
-    integer constant as described in <a href="#6.4.4.1">6.4.4.1</a>, optionally preceded by a plus or minus sign, but
-    not including an integer suffix. If the value of base is between 2 and 36 (inclusive), the
-    expected form of the subject sequence is a sequence of letters and digits representing an
-    integer with the radix specified by base, optionally preceded by a plus or minus sign,
-    but not including an integer suffix. The letters from a (or A) through z (or Z) are
-    ascribed the values 10 through 35; only letters and digits whose ascribed values are less
-    than that of base are permitted. If the value of base is 16, the characters 0x or 0X may
-    optionally precede the sequence of letters and digits, following the sign if present.
-4   The subject sequence is defined as the longest initial subsequence of the input string,
-    starting with the first non-white-space character, that is of the expected form. The subject
-    sequence contains no characters if the input string is empty or consists entirely of white
-    space, or if the first non-white-space character is other than a sign or a permissible letter
-    or digit.
-5   If the subject sequence has the expected form and the value of base is zero, the sequence
-    of characters starting with the first digit is interpreted as an integer constant according to
-    the rules of <a href="#6.4.4.1">6.4.4.1</a>. If the subject sequence has the expected form and the value of base
-    is between 2 and 36, it is used as the base for conversion, ascribing to each letter its value
-    as given above. If the subject sequence begins with a minus sign, the value resulting from
-    the conversion is negated (in the return type). A pointer to the final string is stored in the
-    object pointed to by endptr, provided that endptr is not a null pointer.
-6   In other than the "C" locale, additional locale-specific subject sequence forms may be
-    accepted.
-7   If the subject sequence is empty or does not have the expected form, no conversion is
-    performed; the value of nptr is stored in the object pointed to by endptr, provided
-    that endptr is not a null pointer.
-    Returns
-8   The strtol, strtoll, strtoul, and strtoull functions return the converted
-    value, if any. If no conversion could be performed, zero is returned. If the correct value
-    is outside the range of representable values, LONG_MIN, LONG_MAX, LLONG_MIN,
-    LLONG_MAX, ULONG_MAX, or ULLONG_MAX is returned (according to the return type
-    and sign of the value, if any), and the value of the macro ERANGE is stored in errno.
-
-
-
-
-[<a name="p311" href="#p311">page 311</a>] (<a href="#Contents">Contents</a>)
-
-<a name="7.20.2" href="#7.20.2"><b>    7.20.2 Pseudo-random sequence generation functions</b></a>
-<a name="7.20.2.1" href="#7.20.2.1"><b>    7.20.2.1 The rand function</b></a>
-    Synopsis
-1          #include <a href="#7.20">&lt;stdlib.h&gt;</a>
-           int rand(void);
-    Description
-2   The rand function computes a sequence of pseudo-random integers in the range 0 to
-    RAND_MAX.
-3   The implementation shall behave as if no library function calls the rand function.
-    Returns
-4   The rand function returns a pseudo-random integer.
-    Environmental limits
-5   The value of the RAND_MAX macro shall be at least 32767.
-<a name="7.20.2.2" href="#7.20.2.2"><b>    7.20.2.2 The srand function</b></a>
-    Synopsis
-1          #include <a href="#7.20">&lt;stdlib.h&gt;</a>
-           void srand(unsigned int seed);
-    Description
-2   The srand function uses the argument as a seed for a new sequence of pseudo-random
-    numbers to be returned by subsequent calls to rand. If srand is then called with the
-    same seed value, the sequence of pseudo-random numbers shall be repeated. If rand is
-    called before any calls to srand have been made, the same sequence shall be generated
-    as when srand is first called with a seed value of 1.
-3   The implementation shall behave as if no library function calls the srand function.
-    Returns
-4   The srand function returns no value.
-5   EXAMPLE       The following functions define a portable implementation of rand and srand.
-           static unsigned long int next = 1;
-           int rand(void)   // RAND_MAX assumed to be 32767
+           void addscalar(int n, int m,
+                 double a[n][n*m+300], double x)
            {
-                 next = next * 1103515245 + 12345;
-                 return (unsigned int)(next/65536) % 32768;
+                 for (int i = 0; i &lt; n; i++)
+                       for (int j = 0, k = n*m+300; j &lt; k; j++)
+                             // a is a pointer to a VLA with n*m+300 elements
+                             a[i][j] += x;
            }
-
-
-
-[<a name="p312" href="#p312">page 312</a>] (<a href="#Contents">Contents</a>)
-
-            void srand(unsigned int seed)
-            {
-                  next = seed;
-            }
-
-<a name="7.20.3" href="#7.20.3"><b>    7.20.3 Memory management functions</b></a>
-1   The order and contiguity of storage allocated by successive calls to the calloc,
-    malloc, and realloc functions is unspecified. The pointer returned if the allocation
-    succeeds is suitably aligned so that it may be assigned to a pointer to any type of object
-    and then used to access such an object or an array of such objects in the space allocated
-    (until the space is explicitly deallocated). The lifetime of an allocated object extends
-    from the allocation until the deallocation. Each such allocation shall yield a pointer to an
-    object disjoint from any other object. The pointer returned points to the start (lowest byte
-    address) of the allocated space. If the space cannot be allocated, a null pointer is
-    returned. If the size of the space requested is zero, the behavior is implementation-
-    defined: either a null pointer is returned, or the behavior is as if the size were some
-    nonzero value, except that the returned pointer shall not be used to access an object.
-<a name="7.20.3.1" href="#7.20.3.1"><b>    7.20.3.1 The calloc function</b></a>
-    Synopsis
-1           #include <a href="#7.20">&lt;stdlib.h&gt;</a>
-            void *calloc(size_t nmemb, size_t size);
-    Description
-2   The calloc function allocates space for an array of nmemb objects, each of whose size
-    is size. The space is initialized to all bits zero.261)
-    Returns
-3   The calloc function returns either a null pointer or a pointer to the allocated space.
-<a name="7.20.3.2" href="#7.20.3.2"><b>    7.20.3.2 The free function</b></a>
-    Synopsis
-1           #include <a href="#7.20">&lt;stdlib.h&gt;</a>
-            void free(void *ptr);
-    Description
-2   The free function causes the space pointed to by ptr to be deallocated, that is, made
-    available for further allocation. If ptr is a null pointer, no action occurs. Otherwise, if
-    the argument does not match a pointer earlier returned by the calloc, malloc, or
-
-
-    261) Note that this need not be the same as the representation of floating-point zero or a null pointer
-         constant.
-
-[<a name="p313" href="#p313">page 313</a>] (<a href="#Contents">Contents</a>)
-
-    realloc function, or if the space has been deallocated by a call to free or realloc,
-    the behavior is undefined.
-    Returns
-3   The free function returns no value.
-<a name="7.20.3.3" href="#7.20.3.3"><b>    7.20.3.3 The malloc function</b></a>
-    Synopsis
-1          #include <a href="#7.20">&lt;stdlib.h&gt;</a>
-           void *malloc(size_t size);
-    Description
-2   The malloc function allocates space for an object whose size is specified by size and
-    whose value is indeterminate.
-    Returns
-3   The malloc function returns either a null pointer or a pointer to the allocated space.
-<a name="7.20.3.4" href="#7.20.3.4"><b>    7.20.3.4 The realloc function</b></a>
-    Synopsis
-1          #include <a href="#7.20">&lt;stdlib.h&gt;</a>
-           void *realloc(void *ptr, size_t size);
-    Description
-2   The realloc function deallocates the old object pointed to by ptr and returns a
-    pointer to a new object that has the size specified by size. The contents of the new
-    object shall be the same as that of the old object prior to deallocation, up to the lesser of
-    the new and old sizes. Any bytes in the new object beyond the size of the old object have
-    indeterminate values.
-3   If ptr is a null pointer, the realloc function behaves like the malloc function for the
-    specified size. Otherwise, if ptr does not match a pointer earlier returned by the
-    calloc, malloc, or realloc function, or if the space has been deallocated by a call
-    to the free or realloc function, the behavior is undefined. If memory for the new
-    object cannot be allocated, the old object is not deallocated and its value is unchanged.
-    Returns
-4   The realloc function returns a pointer to the new object (which may have the same
-    value as a pointer to the old object), or a null pointer if the new object could not be
-    allocated.
-
-
-
-
-[<a name="p314" href="#p314">page 314</a>] (<a href="#Contents">Contents</a>)
-
-<a name="7.20.4" href="#7.20.4"><b>    7.20.4 Communication with the environment</b></a>
-<a name="7.20.4.1" href="#7.20.4.1"><b>    7.20.4.1 The abort function</b></a>
-    Synopsis
-1          #include <a href="#7.20">&lt;stdlib.h&gt;</a>
-           void abort(void);
-    Description
-2   The abort function causes abnormal program termination to occur, unless the signal
-    SIGABRT is being caught and the signal handler does not return. Whether open streams
-    with unwritten buffered data are flushed, open streams are closed, or temporary files are
-    removed is implementation-defined. An implementation-defined form of the status
-    unsuccessful termination is returned to the host environment by means of the function
-    call raise(SIGABRT).
-    Returns
-3   The abort function does not return to its caller.
-<a name="7.20.4.2" href="#7.20.4.2"><b>    7.20.4.2 The atexit function</b></a>
-    Synopsis
-1          #include <a href="#7.20">&lt;stdlib.h&gt;</a>
-           int atexit(void (*func)(void));
-    Description
-2   The atexit function registers the function pointed to by func, to be called without
-    arguments at normal program termination.
-    Environmental limits
-3   The implementation shall support the registration of at least 32 functions.
-    Returns
-4   The atexit function returns zero if the registration succeeds, nonzero if it fails.
-    Forward references: the exit function (<a href="#7.20.4.3">7.20.4.3</a>).
-<a name="7.20.4.3" href="#7.20.4.3"><b>    7.20.4.3 The exit function</b></a>
-    Synopsis
-1          #include <a href="#7.20">&lt;stdlib.h&gt;</a>
-           void exit(int status);
-    Description
-2   The exit function causes normal program termination to occur. If more than one call to
-    the exit function is executed by a program, the behavior is undefined.
-[<a name="p315" href="#p315">page 315</a>] (<a href="#Contents">Contents</a>)
-
-3   First, all functions registered by the atexit function are called, in the reverse order of
-    their registration,262) except that a function is called after any previously registered
-    functions that had already been called at the time it was registered. If, during the call to
-    any such function, a call to the longjmp function is made that would terminate the call
-    to the registered function, the behavior is undefined.
-4   Next, all open streams with unwritten buffered data are flushed, all open streams are
-    closed, and all files created by the tmpfile function are removed.
-5   Finally, control is returned to the host environment. If the value of status is zero or
-    EXIT_SUCCESS, an implementation-defined form of the status successful termination is
-    returned. If the value of status is EXIT_FAILURE, an implementation-defined form
-    of the status unsuccessful termination is returned. Otherwise the status returned is
-    implementation-defined.
-    Returns
-6   The exit function cannot return to its caller.
-<a name="7.20.4.4" href="#7.20.4.4"><b>    7.20.4.4 The _Exit function</b></a>
-    Synopsis
-1           #include <a href="#7.20">&lt;stdlib.h&gt;</a>
-            void _Exit(int status);
-    Description
-2   The _Exit function causes normal program termination to occur and control to be
-    returned to the host environment. No functions registered by the atexit function or
-    signal handlers registered by the signal function are called. The status returned to the
-    host environment is determined in the same way as for the exit function (<a href="#7.20.4.3">7.20.4.3</a>).
-    Whether open streams with unwritten buffered data are flushed, open streams are closed,
-    or temporary files are removed is implementation-defined.
-    Returns
-3   The _Exit function cannot return to its caller.
-
-
-
-
-    262) Each function is called as many times as it was registered, and in the correct order with respect to
-         other registered functions.
-
-[<a name="p316" href="#p316">page 316</a>] (<a href="#Contents">Contents</a>)
-
-<a name="7.20.4.5" href="#7.20.4.5"><b>    7.20.4.5 The getenv function</b></a>
-    Synopsis
-1          #include <a href="#7.20">&lt;stdlib.h&gt;</a>
-           char *getenv(const char *name);
-    Description
-2   The getenv function searches an environment list, provided by the host environment,
-    for a string that matches the string pointed to by name. The set of environment names
-    and the method for altering the environment list are implementation-defined.
-3   The implementation shall behave as if no library function calls the getenv function.
-    Returns
-4   The getenv function returns a pointer to a string associated with the matched list
-    member. The string pointed to shall not be modified by the program, but may be
-    overwritten by a subsequent call to the getenv function. If the specified name cannot
-    be found, a null pointer is returned.
-<a name="7.20.4.6" href="#7.20.4.6"><b>    7.20.4.6 The system function</b></a>
-    Synopsis
-1          #include <a href="#7.20">&lt;stdlib.h&gt;</a>
-           int system(const char *string);
-    Description
-2   If string is a null pointer, the system function determines whether the host
-    environment has a command processor. If string is not a null pointer, the system
-    function passes the string pointed to by string to that command processor to be
-    executed in a manner which the implementation shall document; this might then cause the
-    program calling system to behave in a non-conforming manner or to terminate.
-    Returns
-3   If the argument is a null pointer, the system function returns nonzero only if a
-    command processor is available. If the argument is not a null pointer, and the system
-    function does return, it returns an implementation-defined value.
-
-
-
-
-[<a name="p317" href="#p317">page 317</a>] (<a href="#Contents">Contents</a>)
-
-<a name="7.20.5" href="#7.20.5"><b>    7.20.5 Searching and sorting utilities</b></a>
-1   These utilities make use of a comparison function to search or sort arrays of unspecified
-    type. Where an argument declared as size_t nmemb specifies the length of the array
-    for a function, nmemb can have the value zero on a call to that function; the comparison
-    function is not called, a search finds no matching element, and sorting performs no
-    rearrangement. Pointer arguments on such a call shall still have valid values, as described
-    in <a href="#7.1.4">7.1.4</a>.
-2   The implementation shall ensure that the second argument of the comparison function
-    (when called from bsearch), or both arguments (when called from qsort), are
-    pointers to elements of the array.263) The first argument when called from bsearch
-    shall equal key.
-3   The comparison function shall not alter the contents of the array. The implementation
-    may reorder elements of the array between calls to the comparison function, but shall not
-    alter the contents of any individual element.
-4   When the same objects (consisting of size bytes, irrespective of their current positions
-    in the array) are passed more than once to the comparison function, the results shall be
-    consistent with one another. That is, for qsort they shall define a total ordering on the
-    array, and for bsearch the same object shall always compare the same way with the
-    key.
-5   A sequence point occurs immediately before and immediately after each call to the
-    comparison function, and also between any call to the comparison function and any
-    movement of the objects passed as arguments to that call.
-<a name="7.20.5.1" href="#7.20.5.1"><b>    7.20.5.1 The bsearch function</b></a>
-    Synopsis
-1            #include <a href="#7.20">&lt;stdlib.h&gt;</a>
-             void *bsearch(const void *key, const void *base,
-                  size_t nmemb, size_t size,
-                  int (*compar)(const void *, const void *));
-    Description
-2   The bsearch function searches an array of nmemb objects, the initial element of which
-    is pointed to by base, for an element that matches the object pointed to by key. The
-
-
-    263) That is, if the value passed is p, then the following expressions are always nonzero:
-                  ((char *)p - (char *)base) % size == 0
-                  (char *)p &gt;= (char *)base
-                  (char *)p &lt; (char *)base + nmemb * size
-
-
-[<a name="p318" href="#p318">page 318</a>] (<a href="#Contents">Contents</a>)
-
-    size of each element of the array is specified by size.
-3   The comparison function pointed to by compar is called with two arguments that point
-    to the key object and to an array element, in that order. The function shall return an
-    integer less than, equal to, or greater than zero if the key object is considered,
-    respectively, to be less than, to match, or to be greater than the array element. The array
-    shall consist of: all the elements that compare less than, all the elements that compare
-    equal to, and all the elements that compare greater than the key object, in that order.264)
-    Returns
-4   The bsearch function returns a pointer to a matching element of the array, or a null
-    pointer if no match is found. If two elements compare as equal, which element is
-    matched is unspecified.
-<a name="7.20.5.2" href="#7.20.5.2"><b>    7.20.5.2 The qsort function</b></a>
-    Synopsis
-1            #include <a href="#7.20">&lt;stdlib.h&gt;</a>
-             void qsort(void *base, size_t nmemb, size_t size,
-                  int (*compar)(const void *, const void *));
-    Description
-2   The qsort function sorts an array of nmemb objects, the initial element of which is
-    pointed to by base. The size of each object is specified by size.
-3   The contents of the array are sorted into ascending order according to a comparison
-    function pointed to by compar, which is called with two arguments that point to the
-    objects being compared. The function shall return an integer less than, equal to, or
-    greater than zero if the first argument is considered to be respectively less than, equal to,
-    or greater than the second.
-4   If two elements compare as equal, their order in the resulting sorted array is unspecified.
-    Returns
-5   The qsort function returns no value.
-
-
-
-
-    264) In practice, the entire array is sorted according to the comparison function.
-
-[<a name="p319" href="#p319">page 319</a>] (<a href="#Contents">Contents</a>)
-
-<a name="7.20.6" href="#7.20.6"><b>    7.20.6 Integer arithmetic functions</b></a>
-<a name="7.20.6.1" href="#7.20.6.1"><b>    7.20.6.1 The abs, labs and llabs functions</b></a>
-    Synopsis
-1           #include <a href="#7.20">&lt;stdlib.h&gt;</a>
-            int abs(int j);
-            long int labs(long int j);
-            long long int llabs(long long int j);
-    Description
-2   The abs, labs, and llabs functions compute the absolute value of an integer j. If the
-    result cannot be represented, the behavior is undefined.265)
-    Returns
-3   The abs, labs, and llabs, functions return the absolute value.
-<a name="7.20.6.2" href="#7.20.6.2"><b>    7.20.6.2 The div, ldiv, and lldiv functions</b></a>
-    Synopsis
-1           #include <a href="#7.20">&lt;stdlib.h&gt;</a>
-            div_t div(int numer, int denom);
-            ldiv_t ldiv(long int numer, long int denom);
-            lldiv_t lldiv(long long int numer, long long int denom);
-    Description
-2   The div, ldiv, and lldiv, functions compute numer / denom and numer %
-    denom in a single operation.
-    Returns
-3   The div, ldiv, and lldiv functions return a structure of type div_t, ldiv_t, and
-    lldiv_t, respectively, comprising both the quotient and the remainder. The structures
-    shall contain (in either order) the members quot (the quotient) and rem (the remainder),
-    each of which has the same type as the arguments numer and denom. If either part of
-    the result cannot be represented, the behavior is undefined.
-
-
-
-
-    265) The absolute value of the most negative number cannot be represented in two's complement.
-
-[<a name="p320" href="#p320">page 320</a>] (<a href="#Contents">Contents</a>)
-
-<a name="7.20.7" href="#7.20.7"><b>    7.20.7 Multibyte/wide character conversion functions</b></a>
-1   The behavior of the multibyte character functions is affected by the LC_CTYPE category
-    of the current locale. For a state-dependent encoding, each function is placed into its
-    initial conversion state by a call for which its character pointer argument, s, is a null
-    pointer. Subsequent calls with s as other than a null pointer cause the internal conversion
-    state of the function to be altered as necessary. A call with s as a null pointer causes
-    these functions to return a nonzero value if encodings have state dependency, and zero
-    otherwise.266) Changing the LC_CTYPE category causes the conversion state of these
-    functions to be indeterminate.
-<a name="7.20.7.1" href="#7.20.7.1"><b>    7.20.7.1 The mblen function</b></a>
-    Synopsis
-1           #include <a href="#7.20">&lt;stdlib.h&gt;</a>
-            int mblen(const char *s, size_t n);
-    Description
-2   If s is not a null pointer, the mblen function determines the number of bytes contained
-    in the multibyte character pointed to by s. Except that the conversion state of the
-    mbtowc function is not affected, it is equivalent to
-            mbtowc((wchar_t *)0, s, n);
-3   The implementation shall behave as if no library function calls the mblen function.
-    Returns
-4   If s is a null pointer, the mblen function returns a nonzero or zero value, if multibyte
-    character encodings, respectively, do or do not have state-dependent encodings. If s is
-    not a null pointer, the mblen function either returns 0 (if s points to the null character),
-    or returns the number of bytes that are contained in the multibyte character (if the next n
-    or fewer bytes form a valid multibyte character), or returns -1 (if they do not form a valid
-    multibyte character).
-    Forward references: the mbtowc function (<a href="#7.20.7.2">7.20.7.2</a>).
-
-
-
-
-    266) If the locale employs special bytes to change the shift state, these bytes do not produce separate wide
-         character codes, but are grouped with an adjacent multibyte character.
-
-[<a name="p321" href="#p321">page 321</a>] (<a href="#Contents">Contents</a>)
-
-<a name="7.20.7.2" href="#7.20.7.2"><b>    7.20.7.2 The mbtowc function</b></a>
-    Synopsis
-1          #include <a href="#7.20">&lt;stdlib.h&gt;</a>
-           int mbtowc(wchar_t * restrict pwc,
-                const char * restrict s,
-                size_t n);
-    Description
-2   If s is not a null pointer, the mbtowc function inspects at most n bytes beginning with
-    the byte pointed to by s to determine the number of bytes needed to complete the next
-    multibyte character (including any shift sequences). If the function determines that the
-    next multibyte character is complete and valid, it determines the value of the
-    corresponding wide character and then, if pwc is not a null pointer, stores that value in
-    the object pointed to by pwc. If the corresponding wide character is the null wide
-    character, the function is left in the initial conversion state.
-3   The implementation shall behave as if no library function calls the mbtowc function.
-    Returns
-4   If s is a null pointer, the mbtowc function returns a nonzero or zero value, if multibyte
-    character encodings, respectively, do or do not have state-dependent encodings. If s is
-    not a null pointer, the mbtowc function either returns 0 (if s points to the null character),
-    or returns the number of bytes that are contained in the converted multibyte character (if
-    the next n or fewer bytes form a valid multibyte character), or returns -1 (if they do not
-    form a valid multibyte character).
-5   In no case will the value returned be greater than n or the value of the MB_CUR_MAX
-    macro.
-<a name="7.20.7.3" href="#7.20.7.3"><b>    7.20.7.3 The wctomb function</b></a>
-    Synopsis
-1          #include <a href="#7.20">&lt;stdlib.h&gt;</a>
-           int wctomb(char *s, wchar_t wc);
-    Description
-2   The wctomb function determines the number of bytes needed to represent the multibyte
-    character corresponding to the wide character given by wc (including any shift
-    sequences), and stores the multibyte character representation in the array whose first
-    element is pointed to by s (if s is not a null pointer). At most MB_CUR_MAX characters
-    are stored. If wc is a null wide character, a null byte is stored, preceded by any shift
-    sequence needed to restore the initial shift state, and the function is left in the initial
-    conversion state.
-
-[<a name="p322" href="#p322">page 322</a>] (<a href="#Contents">Contents</a>)
-
-3   The implementation shall behave as if no library function calls the wctomb function.
-    Returns
-4   If s is a null pointer, the wctomb function returns a nonzero or zero value, if multibyte
-    character encodings, respectively, do or do not have state-dependent encodings. If s is
-    not a null pointer, the wctomb function returns -1 if the value of wc does not correspond
-    to a valid multibyte character, or returns the number of bytes that are contained in the
-    multibyte character corresponding to the value of wc.
-5   In no case will the value returned be greater than the value of the MB_CUR_MAX macro.
-<a name="7.20.8" href="#7.20.8"><b>    7.20.8 Multibyte/wide string conversion functions</b></a>
-1   The behavior of the multibyte string functions is affected by the LC_CTYPE category of
-    the current locale.
-<a name="7.20.8.1" href="#7.20.8.1"><b>    7.20.8.1 The mbstowcs function</b></a>
-    Synopsis
-1            #include <a href="#7.20">&lt;stdlib.h&gt;</a>
-             size_t mbstowcs(wchar_t * restrict pwcs,
-                  const char * restrict s,
-                  size_t n);
-    Description
-2   The mbstowcs function converts a sequence of multibyte characters that begins in the
-    initial shift state from the array pointed to by s into a sequence of corresponding wide
-    characters and stores not more than n wide characters into the array pointed to by pwcs.
-    No multibyte characters that follow a null character (which is converted into a null wide
-    character) will be examined or converted. Each multibyte character is converted as if by
-    a call to the mbtowc function, except that the conversion state of the mbtowc function is
-    not affected.
-3   No more than n elements will be modified in the array pointed to by pwcs. If copying
-    takes place between objects that overlap, the behavior is undefined.
-    Returns
-4   If an invalid multibyte character is encountered, the mbstowcs function returns
-    (size_t)(-1). Otherwise, the mbstowcs function returns the number of array
-    elements modified, not including a terminating null wide character, if any.267)
-
-
-
-
-    267) The array will not be null-terminated if the value returned is n.
-
-[<a name="p323" href="#p323">page 323</a>] (<a href="#Contents">Contents</a>)
-
-<a name="7.20.8.2" href="#7.20.8.2"><b>    7.20.8.2 The wcstombs function</b></a>
-    Synopsis
-1          #include <a href="#7.20">&lt;stdlib.h&gt;</a>
-           size_t wcstombs(char * restrict s,
-                const wchar_t * restrict pwcs,
-                size_t n);
-    Description
-2   The wcstombs function converts a sequence of wide characters from the array pointed
-    to by pwcs into a sequence of corresponding multibyte characters that begins in the
-    initial shift state, and stores these multibyte characters into the array pointed to by s,
-    stopping if a multibyte character would exceed the limit of n total bytes or if a null
-    character is stored. Each wide character is converted as if by a call to the wctomb
-    function, except that the conversion state of the wctomb function is not affected.
-3   No more than n bytes will be modified in the array pointed to by s. If copying takes place
-    between objects that overlap, the behavior is undefined.
-    Returns
-4   If a wide character is encountered that does not correspond to a valid multibyte character,
-    the wcstombs function returns (size_t)(-1). Otherwise, the wcstombs function
-    returns the number of bytes modified, not including a terminating null character, if
-    any.267)
-
-
-
-
-[<a name="p324" href="#p324">page 324</a>] (<a href="#Contents">Contents</a>)
-
-<a name="7.21" href="#7.21"><b>    7.21 String handling &lt;string.h&gt;</b></a>
-<a name="7.21.1" href="#7.21.1"><b>    7.21.1 String function conventions</b></a>
-1   The header <a href="#7.21">&lt;string.h&gt;</a> declares one type and several functions, and defines one
-    macro useful for manipulating arrays of character type and other objects treated as arrays
-    of character type.268) The type is size_t and the macro is NULL (both described in
-<a name="7.17)" href="#7.17)"><b>    7.17). Various methods are used for determining the lengths of the arrays, but in all cases</b></a>
-    a char * or void * argument points to the initial (lowest addressed) character of the
-    array. If an array is accessed beyond the end of an object, the behavior is undefined.
-2   Where an argument declared as size_t n specifies the length of the array for a
-    function, n can have the value zero on a call to that function. Unless explicitly stated
-    otherwise in the description of a particular function in this subclause, pointer arguments
-    on such a call shall still have valid values, as described in <a href="#7.1.4">7.1.4</a>. On such a call, a
-    function that locates a character finds no occurrence, a function that compares two
-    character sequences returns zero, and a function that copies characters copies zero
-    characters.
-3   For all functions in this subclause, each character shall be interpreted as if it had the type
-    unsigned char (and therefore every possible object representation is valid and has a
-    different value).
-<a name="7.21.2" href="#7.21.2"><b>    7.21.2 Copying functions</b></a>
-<a name="7.21.2.1" href="#7.21.2.1"><b>    7.21.2.1 The memcpy function</b></a>
-    Synopsis
-1            #include <a href="#7.21">&lt;string.h&gt;</a>
-             void *memcpy(void * restrict s1,
-                  const void * restrict s2,
-                  size_t n);
-    Description
-2   The memcpy function copies n characters from the object pointed to by s2 into the
-    object pointed to by s1. If copying takes place between objects that overlap, the behavior
-    is undefined.
-    Returns
-3   The memcpy function returns the value of s1.
-
-
-
-
-    268) See ''future library directions'' (<a href="#7.26.11">7.26.11</a>).
-
-[<a name="p325" href="#p325">page 325</a>] (<a href="#Contents">Contents</a>)
-
-<a name="7.21.2.2" href="#7.21.2.2"><b>    7.21.2.2 The memmove function</b></a>
-    Synopsis
-1          #include <a href="#7.21">&lt;string.h&gt;</a>
-           void *memmove(void *s1, const void *s2, size_t n);
-    Description
-2   The memmove function copies n characters from the object pointed to by s2 into the
-    object pointed to by s1. Copying takes place as if the n characters from the object
-    pointed to by s2 are first copied into a temporary array of n characters that does not
-    overlap the objects pointed to by s1 and s2, and then the n characters from the
-    temporary array are copied into the object pointed to by s1.
-    Returns
-3   The memmove function returns the value of s1.
-<a name="7.21.2.3" href="#7.21.2.3"><b>    7.21.2.3 The strcpy function</b></a>
-    Synopsis
-1          #include <a href="#7.21">&lt;string.h&gt;</a>
-           char *strcpy(char * restrict s1,
-                const char * restrict s2);
-    Description
-2   The strcpy function copies the string pointed to by s2 (including the terminating null
-    character) into the array pointed to by s1. If copying takes place between objects that
-    overlap, the behavior is undefined.
-    Returns
-3   The strcpy function returns the value of s1.
-<a name="7.21.2.4" href="#7.21.2.4"><b>    7.21.2.4 The strncpy function</b></a>
-    Synopsis
-1          #include <a href="#7.21">&lt;string.h&gt;</a>
-           char *strncpy(char * restrict s1,
-                const char * restrict s2,
-                size_t n);
-    Description
-2   The strncpy function copies not more than n characters (characters that follow a null
-    character are not copied) from the array pointed to by s2 to the array pointed to by
-
-
-
-
-[<a name="p326" href="#p326">page 326</a>] (<a href="#Contents">Contents</a>)
-
-    s1.269) If copying takes place between objects that overlap, the behavior is undefined.
-3   If the array pointed to by s2 is a string that is shorter than n characters, null characters
-    are appended to the copy in the array pointed to by s1, until n characters in all have been
-    written.
-    Returns
-4   The strncpy function returns the value of s1.
-<a name="7.21.3" href="#7.21.3"><b>    7.21.3 Concatenation functions</b></a>
-<a name="7.21.3.1" href="#7.21.3.1"><b>    7.21.3.1 The strcat function</b></a>
-    Synopsis
-1            #include <a href="#7.21">&lt;string.h&gt;</a>
-             char *strcat(char * restrict s1,
-                  const char * restrict s2);
-    Description
-2   The strcat function appends a copy of the string pointed to by s2 (including the
-    terminating null character) to the end of the string pointed to by s1. The initial character
-    of s2 overwrites the null character at the end of s1. If copying takes place between
-    objects that overlap, the behavior is undefined.
-    Returns
-3   The strcat function returns the value of s1.
-<a name="7.21.3.2" href="#7.21.3.2"><b>    7.21.3.2 The strncat function</b></a>
-    Synopsis
-1            #include <a href="#7.21">&lt;string.h&gt;</a>
-             char *strncat(char * restrict s1,
-                  const char * restrict s2,
-                  size_t n);
-    Description
-2   The strncat function appends not more than n characters (a null character and
-    characters that follow it are not appended) from the array pointed to by s2 to the end of
-    the string pointed to by s1. The initial character of s2 overwrites the null character at the
-    end of s1. A terminating null character is always appended to the result.270) If copying
-
-    269) Thus, if there is no null character in the first n characters of the array pointed to by s2, the result will
-         not be null-terminated.
-    270) Thus, the maximum number of characters that can end up in the array pointed to by s1 is
-         strlen(s1)+n+1.
-
-[<a name="p327" href="#p327">page 327</a>] (<a href="#Contents">Contents</a>)
-
-    takes place between objects that overlap, the behavior is undefined.
-    Returns
-3   The strncat function returns the value of s1.
-    Forward references: the strlen function (<a href="#7.21.6.3">7.21.6.3</a>).
-<a name="7.21.4" href="#7.21.4"><b>    7.21.4 Comparison functions</b></a>
-1   The sign of a nonzero value returned by the comparison functions memcmp, strcmp,
-    and strncmp is determined by the sign of the difference between the values of the first
-    pair of characters (both interpreted as unsigned char) that differ in the objects being
-    compared.
-<a name="7.21.4.1" href="#7.21.4.1"><b>    7.21.4.1 The memcmp function</b></a>
-    Synopsis
-1           #include <a href="#7.21">&lt;string.h&gt;</a>
-            int memcmp(const void *s1, const void *s2, size_t n);
-    Description
-2   The memcmp function compares the first n characters of the object pointed to by s1 to
-    the first n characters of the object pointed to by s2.271)
-    Returns
-3   The memcmp function returns an integer greater than, equal to, or less than zero,
-    accordingly as the object pointed to by s1 is greater than, equal to, or less than the object
-    pointed to by s2.
-<a name="7.21.4.2" href="#7.21.4.2"><b>    7.21.4.2 The strcmp function</b></a>
-    Synopsis
-1           #include <a href="#7.21">&lt;string.h&gt;</a>
-            int strcmp(const char *s1, const char *s2);
-    Description
-2   The strcmp function compares the string pointed to by s1 to the string pointed to by
-    s2.
-    Returns
-3   The strcmp function returns an integer greater than, equal to, or less than zero,
-    accordingly as the string pointed to by s1 is greater than, equal to, or less than the string
-
-    271) The contents of ''holes'' used as padding for purposes of alignment within structure objects are
-         indeterminate. Strings shorter than their allocated space and unions may also cause problems in
-         comparison.
-
-[<a name="p328" href="#p328">page 328</a>] (<a href="#Contents">Contents</a>)
-
-    pointed to by s2.
-<a name="7.21.4.3" href="#7.21.4.3"><b>    7.21.4.3 The strcoll function</b></a>
-    Synopsis
-1          #include <a href="#7.21">&lt;string.h&gt;</a>
-           int strcoll(const char *s1, const char *s2);
-    Description
-2   The strcoll function compares the string pointed to by s1 to the string pointed to by
-    s2, both interpreted as appropriate to the LC_COLLATE category of the current locale.
-    Returns
-3   The strcoll function returns an integer greater than, equal to, or less than zero,
-    accordingly as the string pointed to by s1 is greater than, equal to, or less than the string
-    pointed to by s2 when both are interpreted as appropriate to the current locale.
-<a name="7.21.4.4" href="#7.21.4.4"><b>    7.21.4.4 The strncmp function</b></a>
-    Synopsis
-1          #include <a href="#7.21">&lt;string.h&gt;</a>
-           int strncmp(const char *s1, const char *s2, size_t n);
-    Description
-2   The strncmp function compares not more than n characters (characters that follow a
-    null character are not compared) from the array pointed to by s1 to the array pointed to
-    by s2.
-    Returns
-3   The strncmp function returns an integer greater than, equal to, or less than zero,
-    accordingly as the possibly null-terminated array pointed to by s1 is greater than, equal
-    to, or less than the possibly null-terminated array pointed to by s2.
-<a name="7.21.4.5" href="#7.21.4.5"><b>    7.21.4.5 The strxfrm function</b></a>
-    Synopsis
-1          #include <a href="#7.21">&lt;string.h&gt;</a>
-           size_t strxfrm(char * restrict s1,
-                const char * restrict s2,
-                size_t n);
-    Description
-2   The strxfrm function transforms the string pointed to by s2 and places the resulting
-    string into the array pointed to by s1. The transformation is such that if the strcmp
-    function is applied to two transformed strings, it returns a value greater than, equal to, or
-
-[<a name="p329" href="#p329">page 329</a>] (<a href="#Contents">Contents</a>)
-
-    less than zero, corresponding to the result of the strcoll function applied to the same
-    two original strings. No more than n characters are placed into the resulting array
-    pointed to by s1, including the terminating null character. If n is zero, s1 is permitted to
-    be a null pointer. If copying takes place between objects that overlap, the behavior is
-    undefined.
-    Returns
-3   The strxfrm function returns the length of the transformed string (not including the
-    terminating null character). If the value returned is n or more, the contents of the array
-    pointed to by s1 are indeterminate.
-4   EXAMPLE The value of the following expression is the size of the array needed to hold the
-    transformation of the string pointed to by s.
-           1 + strxfrm(NULL, s, 0)
-
-<a name="7.21.5" href="#7.21.5"><b>    7.21.5 Search functions</b></a>
-<a name="7.21.5.1" href="#7.21.5.1"><b>    7.21.5.1 The memchr function</b></a>
-    Synopsis
-1          #include <a href="#7.21">&lt;string.h&gt;</a>
-           void *memchr(const void *s, int c, size_t n);
-    Description
-2   The memchr function locates the first occurrence of c (converted to an unsigned
-    char) in the initial n characters (each interpreted as unsigned char) of the object
-    pointed to by s.
-    Returns
-3   The memchr function returns a pointer to the located character, or a null pointer if the
-    character does not occur in the object.
-<a name="7.21.5.2" href="#7.21.5.2"><b>    7.21.5.2 The strchr function</b></a>
-    Synopsis
-1          #include <a href="#7.21">&lt;string.h&gt;</a>
-           char *strchr(const char *s, int c);
-    Description
-2   The strchr function locates the first occurrence of c (converted to a char) in the
-    string pointed to by s. The terminating null character is considered to be part of the
-    string.
-    Returns
-3   The strchr function returns a pointer to the located character, or a null pointer if the
-    character does not occur in the string.
-[<a name="p330" href="#p330">page 330</a>] (<a href="#Contents">Contents</a>)
-
-<a name="7.21.5.3" href="#7.21.5.3"><b>    7.21.5.3 The strcspn function</b></a>
-    Synopsis
-1          #include <a href="#7.21">&lt;string.h&gt;</a>
-           size_t strcspn(const char *s1, const char *s2);
-    Description
-2   The strcspn function computes the length of the maximum initial segment of the string
-    pointed to by s1 which consists entirely of characters not from the string pointed to by
-    s2.
-    Returns
-3   The strcspn function returns the length of the segment.
-<a name="7.21.5.4" href="#7.21.5.4"><b>    7.21.5.4 The strpbrk function</b></a>
-    Synopsis
-1          #include <a href="#7.21">&lt;string.h&gt;</a>
-           char *strpbrk(const char *s1, const char *s2);
-    Description
-2   The strpbrk function locates the first occurrence in the string pointed to by s1 of any
-    character from the string pointed to by s2.
-    Returns
-3   The strpbrk function returns a pointer to the character, or a null pointer if no character
-    from s2 occurs in s1.
-<a name="7.21.5.5" href="#7.21.5.5"><b>    7.21.5.5 The strrchr function</b></a>
-    Synopsis
-1          #include <a href="#7.21">&lt;string.h&gt;</a>
-           char *strrchr(const char *s, int c);
-    Description
-2   The strrchr function locates the last occurrence of c (converted to a char) in the
-    string pointed to by s. The terminating null character is considered to be part of the
-    string.
-    Returns
-3   The strrchr function returns a pointer to the character, or a null pointer if c does not
-    occur in the string.
-
-
-
-
-[<a name="p331" href="#p331">page 331</a>] (<a href="#Contents">Contents</a>)
-
-<a name="7.21.5.6" href="#7.21.5.6"><b>    7.21.5.6 The strspn function</b></a>
-    Synopsis
-1          #include <a href="#7.21">&lt;string.h&gt;</a>
-           size_t strspn(const char *s1, const char *s2);
-    Description
-2   The strspn function computes the length of the maximum initial segment of the string
-    pointed to by s1 which consists entirely of characters from the string pointed to by s2.
-    Returns
-3   The strspn function returns the length of the segment.
-<a name="7.21.5.7" href="#7.21.5.7"><b>    7.21.5.7 The strstr function</b></a>
-    Synopsis
-1          #include <a href="#7.21">&lt;string.h&gt;</a>
-           char *strstr(const char *s1, const char *s2);
-    Description
-2   The strstr function locates the first occurrence in the string pointed to by s1 of the
-    sequence of characters (excluding the terminating null character) in the string pointed to
-    by s2.
-    Returns
-3   The strstr function returns a pointer to the located string, or a null pointer if the string
-    is not found. If s2 points to a string with zero length, the function returns s1.
-<a name="7.21.5.8" href="#7.21.5.8"><b>    7.21.5.8 The strtok function</b></a>
-    Synopsis
-1          #include <a href="#7.21">&lt;string.h&gt;</a>
-           char *strtok(char * restrict s1,
-                const char * restrict s2);
-    Description
-2   A sequence of calls to the strtok function breaks the string pointed to by s1 into a
-    sequence of tokens, each of which is delimited by a character from the string pointed to
-    by s2. The first call in the sequence has a non-null first argument; subsequent calls in the
-    sequence have a null first argument. The separator string pointed to by s2 may be
-    different from call to call.
-3   The first call in the sequence searches the string pointed to by s1 for the first character
-    that is not contained in the current separator string pointed to by s2. If no such character
-    is found, then there are no tokens in the string pointed to by s1 and the strtok function
-
-[<a name="p332" href="#p332">page 332</a>] (<a href="#Contents">Contents</a>)
-
-    returns a null pointer. If such a character is found, it is the start of the first token.
-4   The strtok function then searches from there for a character that is contained in the
-    current separator string. If no such character is found, the current token extends to the
-    end of the string pointed to by s1, and subsequent searches for a token will return a null
-    pointer. If such a character is found, it is overwritten by a null character, which
-    terminates the current token. The strtok function saves a pointer to the following
-    character, from which the next search for a token will start.
-5   Each subsequent call, with a null pointer as the value of the first argument, starts
-    searching from the saved pointer and behaves as described above.
-6   The implementation shall behave as if no library function calls the strtok function.
-    Returns
-7   The strtok function returns a pointer to the first character of a token, or a null pointer
-    if there is no token.
-8   EXAMPLE
-            #include <a href="#7.21">&lt;string.h&gt;</a>
-            static char str[] = "?a???b,,,#c";
-            char *t;
-            t   =   strtok(str, "?");       //   t   points to the token "a"
-            t   =   strtok(NULL, ",");      //   t   points to the token "??b"
-            t   =   strtok(NULL, "#,");     //   t   points to the token "c"
-            t   =   strtok(NULL, "?");      //   t   is a null pointer
-
-<a name="7.21.6" href="#7.21.6"><b>    7.21.6 Miscellaneous functions</b></a>
-<a name="7.21.6.1" href="#7.21.6.1"><b>    7.21.6.1 The memset function</b></a>
-    Synopsis
-1           #include <a href="#7.21">&lt;string.h&gt;</a>
-            void *memset(void *s, int c, size_t n);
-    Description
-2   The memset function copies the value of c (converted to an unsigned char) into
-    each of the first n characters of the object pointed to by s.
-    Returns
-3   The memset function returns the value of s.
-
-
-
-
-[<a name="p333" href="#p333">page 333</a>] (<a href="#Contents">Contents</a>)
-
-<a name="7.21.6.2" href="#7.21.6.2"><b>    7.21.6.2 The strerror function</b></a>
-    Synopsis
-1          #include <a href="#7.21">&lt;string.h&gt;</a>
-           char *strerror(int errnum);
-    Description
-2   The strerror function maps the number in errnum to a message string. Typically,
-    the values for errnum come from errno, but strerror shall map any value of type
-    int to a message.
-3   The implementation shall behave as if no library function calls the strerror function.
-    Returns
-4   The strerror function returns a pointer to the string, the contents of which are locale-
-    specific. The array pointed to shall not be modified by the program, but may be
-    overwritten by a subsequent call to the strerror function.
-<a name="7.21.6.3" href="#7.21.6.3"><b>    7.21.6.3 The strlen function</b></a>
-    Synopsis
-1          #include <a href="#7.21">&lt;string.h&gt;</a>
-           size_t strlen(const char *s);
-    Description
-2   The strlen function computes the length of the string pointed to by s.
-    Returns
-3   The strlen function returns the number of characters that precede the terminating null
-    character.
-
-
-
-
-[<a name="p334" href="#p334">page 334</a>] (<a href="#Contents">Contents</a>)
-
-<a name="7.22" href="#7.22"><b>    7.22 Type-generic math &lt;tgmath.h&gt;</b></a>
-1   The header <a href="#7.22">&lt;tgmath.h&gt;</a> includes the headers <a href="#7.12">&lt;math.h&gt;</a> and <a href="#7.3">&lt;complex.h&gt;</a> and
-    defines several type-generic macros.
-2   Of the <a href="#7.12">&lt;math.h&gt;</a> and <a href="#7.3">&lt;complex.h&gt;</a> functions without an f (float) or l (long
-    double) suffix, several have one or more parameters whose corresponding real type is
-    double. For each such function, except modf, there is a corresponding type-generic
-    macro.272) The parameters whose corresponding real type is double in the function
-    synopsis are generic parameters. Use of the macro invokes a function whose
-    corresponding real type and type domain are determined by the arguments for the generic
-    parameters.273)
-3   Use of the macro invokes a function whose generic parameters have the corresponding
-    real type determined as follows:
-    -- First, if any argument for generic parameters has type long double, the type
-      determined is long double.
-    -- Otherwise, if any argument for generic parameters has type double or is of integer
-      type, the type determined is double.
-    -- Otherwise, the type determined is float.
-4   For each unsuffixed function in <a href="#7.12">&lt;math.h&gt;</a> for which there is a function in
-    <a href="#7.3">&lt;complex.h&gt;</a> with the same name except for a c prefix, the corresponding type-
-    generic macro (for both functions) has the same name as the function in <a href="#7.12">&lt;math.h&gt;</a>. The
-    corresponding type-generic macro for fabs and cabs is fabs.
-
-
-
-
-    272) Like other function-like macros in Standard libraries, each type-generic macro can be suppressed to
-         make available the corresponding ordinary function.
-    273) If the type of the argument is not compatible with the type of the parameter for the selected function,
-         the behavior is undefined.
-
-[<a name="p335" href="#p335">page 335</a>] (<a href="#Contents">Contents</a>)
-
-            <a href="#7.12">&lt;math.h&gt;</a>          <a href="#7.3">&lt;complex.h&gt;</a>           type-generic
-             function            function              macro
-              acos               cacos                acos
-              asin               casin                asin
-              atan               catan                atan
-              acosh              cacosh               acosh
-              asinh              casinh               asinh
-              atanh              catanh               atanh
-              cos                ccos                 cos
-              sin                csin                 sin
-              tan                ctan                 tan
-              cosh               ccosh                cosh
-              sinh               csinh                sinh
-              tanh               ctanh                tanh
-              exp                cexp                 exp
-              log                clog                 log
-              pow                cpow                 pow
-              sqrt               csqrt                sqrt
-              fabs               cabs                 fabs
-    If at least one argument for a generic parameter is complex, then use of the macro invokes
-    a complex function; otherwise, use of the macro invokes a real function.
-5   For each unsuffixed function in <a href="#7.12">&lt;math.h&gt;</a> without a c-prefixed counterpart in
-    <a href="#7.3">&lt;complex.h&gt;</a> (except modf), the corresponding type-generic macro has the same
-    name as the function. These type-generic macros are:
-          atan2                fma                  llround              remainder
-          cbrt                 fmax                 log10                remquo
-          ceil                 fmin                 log1p                rint
-          copysign             fmod                 log2                 round
-          erf                  frexp                logb                 scalbn
-          erfc                 hypot                lrint                scalbln
-          exp2                 ilogb                lround               tgamma
-          expm1                ldexp                nearbyint            trunc
-          fdim                 lgamma               nextafter
-          floor                llrint               nexttoward
-    If all arguments for generic parameters are real, then use of the macro invokes a real
-    function; otherwise, use of the macro results in undefined behavior.
-6   For each unsuffixed function in <a href="#7.3">&lt;complex.h&gt;</a> that is not a c-prefixed counterpart to a
-    function in <a href="#7.12">&lt;math.h&gt;</a>, the corresponding type-generic macro has the same name as the
-    function. These type-generic macros are:
-
-[<a name="p336" href="#p336">page 336</a>] (<a href="#Contents">Contents</a>)
-
-            carg                    conj                     creal
-            cimag                   cproj
-    Use of the macro with any real or complex argument invokes a complex function.
-7   EXAMPLE       With the declarations
-            #include <a href="#7.22">&lt;tgmath.h&gt;</a>
-            int n;
-            float f;
-            double d;
-            long double ld;
-            float complex fc;
-            double complex dc;
-            long double complex ldc;
-    functions invoked by use of type-generic macros are shown in the following table:
-                     macro use                                  invokes
-                exp(n)                              exp(n), the function
-                acosh(f)                            acoshf(f)
-                sin(d)                              sin(d), the function
-                atan(ld)                            atanl(ld)
-                log(fc)                             clogf(fc)
-                sqrt(dc)                            csqrt(dc)
-                pow(ldc, f)                         cpowl(ldc, f)
-                remainder(n, n)                     remainder(n, n), the function
-                nextafter(d, f)                     nextafter(d, f), the function
-                nexttoward(f, ld)                   nexttowardf(f, ld)
-                copysign(n, ld)                     copysignl(n, ld)
-                ceil(fc)                            undefined behavior
-                rint(dc)                            undefined behavior
-                fmax(ldc, ld)                       undefined behavior
-                carg(n)                             carg(n), the function
-                cproj(f)                            cprojf(f)
-                creal(d)                            creal(d), the function
-                cimag(ld)                           cimagl(ld)
-                fabs(fc)                            cabsf(fc)
-                carg(dc)                            carg(dc), the function
-                cproj(ldc)                          cprojl(ldc)
-
-
-
-
-[<a name="p337" href="#p337">page 337</a>] (<a href="#Contents">Contents</a>)
-
-<a name="7.23" href="#7.23"><b>    7.23 Date and time &lt;time.h&gt;</b></a>
-<a name="7.23.1" href="#7.23.1"><b>    7.23.1 Components of time</b></a>
-1   The header <a href="#7.23">&lt;time.h&gt;</a> defines two macros, and declares several types and functions for
-    manipulating time. Many functions deal with a calendar time that represents the current
-    date (according to the Gregorian calendar) and time. Some functions deal with local
-    time, which is the calendar time expressed for some specific time zone, and with Daylight
-    Saving Time, which is a temporary change in the algorithm for determining local time.
-    The local time zone and Daylight Saving Time are implementation-defined.
-2   The macros defined are NULL (described in <a href="#7.17">7.17</a>); and
-            CLOCKS_PER_SEC
-    which expands to an expression with type clock_t (described below) that is the
-    number per second of the value returned by the clock function.
-3   The types declared are size_t (described in <a href="#7.17">7.17</a>);
-            clock_t
-    and
-            time_t
-    which are arithmetic types capable of representing times; and
-            struct tm
-    which holds the components of a calendar time, called the broken-down time.
-4   The range and precision of times representable in clock_t and time_t are
-    implementation-defined. The tm structure shall contain at least the following members,
-    in any order. The semantics of the members and their normal ranges are expressed in the
-    comments.274)
-            int    tm_sec;           //   seconds after the minute -- [0, 60]
-            int    tm_min;           //   minutes after the hour -- [0, 59]
-            int    tm_hour;          //   hours since midnight -- [0, 23]
-            int    tm_mday;          //   day of the month -- [1, 31]
-            int    tm_mon;           //   months since January -- [0, 11]
-            int    tm_year;          //   years since 1900
-            int    tm_wday;          //   days since Sunday -- [0, 6]
-            int    tm_yday;          //   days since January 1 -- [0, 365]
-            int    tm_isdst;         //   Daylight Saving Time flag
-
-
-
-    274) The range [0, 60] for tm_sec allows for a positive leap second.
-
-[<a name="p338" href="#p338">page 338</a>] (<a href="#Contents">Contents</a>)
-
-    The value of tm_isdst is positive if Daylight Saving Time is in effect, zero if Daylight
-    Saving Time is not in effect, and negative if the information is not available.
-<a name="7.23.2" href="#7.23.2"><b>    7.23.2 Time manipulation functions</b></a>
-<a name="7.23.2.1" href="#7.23.2.1"><b>    7.23.2.1 The clock function</b></a>
-    Synopsis
-1           #include <a href="#7.23">&lt;time.h&gt;</a>
-            clock_t clock(void);
-    Description
-2   The clock function determines the processor time used.
-    Returns
-3   The clock function returns the implementation's best approximation to the processor
-    time used by the program since the beginning of an implementation-defined era related
-    only to the program invocation. To determine the time in seconds, the value returned by
-    the clock function should be divided by the value of the macro CLOCKS_PER_SEC. If
-    the processor time used is not available or its value cannot be represented, the function
-    returns the value (clock_t)(-1).275)
-<a name="7.23.2.2" href="#7.23.2.2"><b>    7.23.2.2 The difftime function</b></a>
-    Synopsis
-1           #include <a href="#7.23">&lt;time.h&gt;</a>
-            double difftime(time_t time1, time_t time0);
-    Description
-2   The difftime function computes the difference between two calendar times: time1 -
-    time0.
-    Returns
-3   The difftime function returns the difference expressed in seconds as a double.
-
-
-
-
-    275) In order to measure the time spent in a program, the clock function should be called at the start of
-         the program and its return value subtracted from the value returned by subsequent calls.
-
-[<a name="p339" href="#p339">page 339</a>] (<a href="#Contents">Contents</a>)
-
-<a name="7.23.2.3" href="#7.23.2.3"><b>    7.23.2.3 The mktime function</b></a>
-    Synopsis
-1           #include <a href="#7.23">&lt;time.h&gt;</a>
-            time_t mktime(struct tm *timeptr);
-    Description
-2   The mktime function converts the broken-down time, expressed as local time, in the
-    structure pointed to by timeptr into a calendar time value with the same encoding as
-    that of the values returned by the time function. The original values of the tm_wday
-    and tm_yday components of the structure are ignored, and the original values of the
-    other components are not restricted to the ranges indicated above.276) On successful
-    completion, the values of the tm_wday and tm_yday components of the structure are
-    set appropriately, and the other components are set to represent the specified calendar
-    time, but with their values forced to the ranges indicated above; the final value of
-    tm_mday is not set until tm_mon and tm_year are determined.
-    Returns
-3   The mktime function returns the specified calendar time encoded as a value of type
-    time_t. If the calendar time cannot be represented, the function returns the value
-    (time_t)(-1).
-4   EXAMPLE       What day of the week is July 4, 2001?
-            #include <a href="#7.19">&lt;stdio.h&gt;</a>
-            #include <a href="#7.23">&lt;time.h&gt;</a>
-            static const char *const wday[] = {
-                    "Sunday", "Monday", "Tuesday", "Wednesday",
-                    "Thursday", "Friday", "Saturday", "-unknown-"
-            };
-            struct tm time_str;
-            /* ... */
-
-
-
-
-    276) Thus, a positive or zero value for tm_isdst causes the mktime function to presume initially that
-         Daylight Saving Time, respectively, is or is not in effect for the specified time. A negative value
-         causes it to attempt to determine whether Daylight Saving Time is in effect for the specified time.
-
-[<a name="p340" href="#p340">page 340</a>] (<a href="#Contents">Contents</a>)
-
-           time_str.tm_year   = 2001 - 1900;
-           time_str.tm_mon    = 7 - 1;
-           time_str.tm_mday   = 4;
-           time_str.tm_hour   = 0;
-           time_str.tm_min    = 0;
-           time_str.tm_sec    = 1;
-           time_str.tm_isdst = -1;
-           if (mktime(&amp;time_str) == (time_t)(-1))
-                 time_str.tm_wday = 7;
-           printf("%s\n", wday[time_str.tm_wday]);
-
-<a name="7.23.2.4" href="#7.23.2.4"><b>    7.23.2.4 The time function</b></a>
-    Synopsis
-1          #include <a href="#7.23">&lt;time.h&gt;</a>
-           time_t time(time_t *timer);
-    Description
-2   The time function determines the current calendar time. The encoding of the value is
-    unspecified.
-    Returns
-3   The time function returns the implementation's best approximation to the current
-    calendar time. The value (time_t)(-1) is returned if the calendar time is not
-    available. If timer is not a null pointer, the return value is also assigned to the object it
-    points to.
-<a name="7.23.3" href="#7.23.3"><b>    7.23.3 Time conversion functions</b></a>
-1   Except for the strftime function, these functions each return a pointer to one of two
-    types of static objects: a broken-down time structure or an array of char. Execution of
-    any of the functions that return a pointer to one of these object types may overwrite the
-    information in any object of the same type pointed to by the value returned from any
-    previous call to any of them. The implementation shall behave as if no other library
-    functions call these functions.
-<a name="7.23.3.1" href="#7.23.3.1"><b>    7.23.3.1 The asctime function</b></a>
-    Synopsis
-1          #include <a href="#7.23">&lt;time.h&gt;</a>
-           char *asctime(const struct tm *timeptr);
-    Description
-2   The asctime function converts the broken-down time in the structure pointed to by
-    timeptr into a string in the form
-           Sun Sep 16 01:03:52 1973\n\0
-
-[<a name="p341" href="#p341">page 341</a>] (<a href="#Contents">Contents</a>)
-
-    using the equivalent of the following algorithm.
-    char *asctime(const struct tm *timeptr)
-    {
-         static const char wday_name[7][3] = {
-              "Sun", "Mon", "Tue", "Wed", "Thu", "Fri", "Sat"
-         };
-         static const char mon_name[12][3] = {
-              "Jan", "Feb", "Mar", "Apr", "May", "Jun",
-              "Jul", "Aug", "Sep", "Oct", "Nov", "Dec"
+</pre>
+<p><!--para 21 -->
+ EXAMPLE 5        The following are all compatible function prototype declarators.
+<pre>
+           double    maximum(int       n,   int   m,   double   a[n][m]);
+           double    maximum(int       n,   int   m,   double   a[*][*]);
+           double    maximum(int       n,   int   m,   double   a[ ][*]);
+           double    maximum(int       n,   int   m,   double   a[ ][m]);
+</pre>
+ as are:
+<pre>
+           void   f(double     (* restrict a)[5]);
+           void   f(double     a[restrict][5]);
+           void   f(double     a[restrict 3][5]);
+           void   f(double     a[restrict static 3][5]);
+</pre>
+ (Note that the last declaration also specifies that the argument corresponding to a in any call to f must be a
+ non-null pointer to the first of at least three arrays of 5 doubles, which the others do not.)
+<p><b> Forward references</b>: function definitions (<a href="#6.9.1">6.9.1</a>), type names (<a href="#6.7.6">6.7.6</a>).
+<!--page 134 -->
+
+<p><b>Footnotes</b>
+<p><small><a name="note125" href="#note125">125)</a> The macros defined in the <a href="#7.15">&lt;stdarg.h&gt;</a> header (<a href="#7.15">7.15</a>) may be used to access arguments that
+ correspond to the ellipsis.
+</small>
+<p><small><a name="note126" href="#note126">126)</a> See ''future language directions'' (<a href="#6.11.6">6.11.6</a>).
+</small>
+<p><small><a name="note127" href="#note127">127)</a> If both function types are ''old style'', parameter types are not compared.
+</small>
+
+<h4><a name="6.7.6" href="#6.7.6">6.7.6 Type names</a></h4>
+<p><b>Syntax</b>
+<p><!--para 1 -->
+<pre>
+          type-name:
+                 specifier-qualifier-list abstract-declarator<sub>opt</sub>
+          abstract-declarator:
+                 pointer
+                 pointer<sub>opt</sub> direct-abstract-declarator
+          direct-abstract-declarator:
+                  ( abstract-declarator )
+                  direct-abstract-declarator<sub>opt</sub> [ type-qualifier-list<sub>opt</sub>
+                                 assignment-expression<sub>opt</sub> ]
+                  direct-abstract-declarator<sub>opt</sub> [ static type-qualifier-list<sub>opt</sub>
+                                 assignment-expression ]
+                  direct-abstract-declarator<sub>opt</sub> [ type-qualifier-list static
+                                 assignment-expression ]
+                  direct-abstract-declarator<sub>opt</sub> [ * ]
+                  direct-abstract-declarator<sub>opt</sub> ( parameter-type-list<sub>opt</sub> )
+</pre>
+<p><b>Semantics</b>
+<p><!--para 2 -->
+ In several contexts, it is necessary to specify a type. This is accomplished using a type
+ name, which is syntactically a declaration for a function or an object of that type that
+ omits the identifier.<sup><a href="#note128"><b>128)</b></a></sup>
+<p><!--para 3 -->
+ EXAMPLE        The constructions
+<pre>
+          (a)      int
+          (b)      int   *
+          (c)      int   *[3]
+          (d)      int   (*)[3]
+          (e)      int   (*)[*]
+          (f)      int   *()
+          (g)      int   (*)(void)
+          (h)      int   (*const [])(unsigned int, ...)
+</pre>
+ name respectively the types (a) int, (b) pointer to int, (c) array of three pointers to int, (d) pointer to an
+ array of three ints, (e) pointer to a variable length array of an unspecified number of ints, (f) function
+ with no parameter specification returning a pointer to int, (g) pointer to function with no parameters
+ returning an int, and (h) array of an unspecified number of constant pointers to functions, each with one
+ parameter that has type unsigned int and an unspecified number of other parameters, returning an
+ int.
+<!--page 135 -->
+
+<p><b>Footnotes</b>
+<p><small><a name="note128" href="#note128">128)</a> As indicated by the syntax, empty parentheses in a type name are interpreted as ''function with no
+ parameter specification'', rather than redundant parentheses around the omitted identifier.
+</small>
+
+<h4><a name="6.7.7" href="#6.7.7">6.7.7 Type definitions</a></h4>
+<p><b>Syntax</b>
+<p><!--para 1 -->
+<pre>
+          typedef-name:
+                 identifier
+</pre>
+<p><b>Constraints</b>
+<p><!--para 2 -->
+ If a typedef name specifies a variably modified type then it shall have block scope.
+<p><b>Semantics</b>
+<p><!--para 3 -->
+ In a declaration whose storage-class specifier is typedef, each declarator defines an
+ identifier to be a typedef name that denotes the type specified for the identifier in the way
+ described in <a href="#6.7.5">6.7.5</a>. Any array size expressions associated with variable length array
+ declarators are evaluated each time the declaration of the typedef name is reached in the
+ order of execution. A typedef declaration does not introduce a new type, only a
+ synonym for the type so specified. That is, in the following declarations:
+<pre>
+          typedef T type_ident;
+          type_ident D;
+</pre>
+ type_ident is defined as a typedef name with the type specified by the declaration
+ specifiers in T (known as T ), and the identifier in D has the type ''derived-declarator-
+ type-list T '' where the derived-declarator-type-list is specified by the declarators of D. A
+ typedef name shares the same name space as other identifiers declared in ordinary
+ declarators.
+<p><!--para 4 -->
+ EXAMPLE 1       After
+<pre>
+          typedef int MILES, KLICKSP();
+          typedef struct { double hi, lo; } range;
+</pre>
+ the constructions
+<pre>
+          MILES distance;
+          extern KLICKSP *metricp;
+          range x;
+          range z, *zp;
+</pre>
+ are all valid declarations. The type of distance is int, that of metricp is ''pointer to function with no
+ parameter specification returning int'', and that of x and z is the specified structure; zp is a pointer to
+ such a structure. The object distance has a type compatible with any other int object.
+<p><!--para 5 -->
+ EXAMPLE 2       After the declarations
+<pre>
+          typedef struct s1 { int x; } t1, *tp1;
+          typedef struct s2 { int x; } t2, *tp2;
+</pre>
+ type t1 and the type pointed to by tp1 are compatible. Type t1 is also compatible with type struct
+ s1, but not compatible with the types struct s2, t2, the type pointed to by tp2, or int.
+<!--page 136 -->
+<p><!--para 6 -->
+ EXAMPLE 3       The following obscure constructions
+<pre>
+         typedef signed int t;
+         typedef int plain;
+         struct tag {
+               unsigned t:4;
+               const t:5;
+               plain r:5;
          };
-         static char result[26];
-           sprintf(result, "%.3s %.3s%3d %.2d:%.2d:%.2d %d\n",
-                wday_name[timeptr-&gt;tm_wday],
-                mon_name[timeptr-&gt;tm_mon],
-                timeptr-&gt;tm_mday, timeptr-&gt;tm_hour,
-                timeptr-&gt;tm_min, timeptr-&gt;tm_sec,
-                1900 + timeptr-&gt;tm_year);
-           return result;
-    }
-    Returns
-3   The asctime function returns a pointer to the string.
-<a name="7.23.3.2" href="#7.23.3.2"><b>    7.23.3.2 The ctime function</b></a>
-    Synopsis
-1          #include <a href="#7.23">&lt;time.h&gt;</a>
-           char *ctime(const time_t *timer);
-    Description
-2   The ctime function converts the calendar time pointed to by timer to local time in the
-    form of a string. It is equivalent to
-           asctime(localtime(timer))
-    Returns
-3   The ctime function returns the pointer returned by the asctime function with that
-    broken-down time as argument.
-    Forward references: the localtime function (<a href="#7.23.3.4">7.23.3.4</a>).
-
-
-
-
-[<a name="p342" href="#p342">page 342</a>] (<a href="#Contents">Contents</a>)
-
-<a name="7.23.3.3" href="#7.23.3.3"><b>    7.23.3.3 The gmtime function</b></a>
-    Synopsis
-1          #include <a href="#7.23">&lt;time.h&gt;</a>
-           struct tm *gmtime(const time_t *timer);
-    Description
-2   The gmtime function converts the calendar time pointed to by timer into a broken-
-    down time, expressed as UTC.
-    Returns
-3   The gmtime function returns a pointer to the broken-down time, or a null pointer if the
-    specified time cannot be converted to UTC.
-<a name="7.23.3.4" href="#7.23.3.4"><b>    7.23.3.4 The localtime function</b></a>
-    Synopsis
-1          #include <a href="#7.23">&lt;time.h&gt;</a>
-           struct tm *localtime(const time_t *timer);
-    Description
-2   The localtime function converts the calendar time pointed to by timer into a
-    broken-down time, expressed as local time.
-    Returns
-3   The localtime function returns a pointer to the broken-down time, or a null pointer if
-    the specified time cannot be converted to local time.
-<a name="7.23.3.5" href="#7.23.3.5"><b>    7.23.3.5 The strftime function</b></a>
-    Synopsis
-1          #include <a href="#7.23">&lt;time.h&gt;</a>
-           size_t strftime(char * restrict s,
-                size_t maxsize,
-                const char * restrict format,
-                const struct tm * restrict timeptr);
-    Description
-2   The strftime function places characters into the array pointed to by s as controlled by
-    the string pointed to by format. The format shall be a multibyte character sequence,
-    beginning and ending in its initial shift state. The format string consists of zero or
-    more conversion specifiers and ordinary multibyte characters. A conversion specifier
-    consists of a % character, possibly followed by an E or O modifier character (described
-    below), followed by a character that determines the behavior of the conversion specifier.
-    All ordinary multibyte characters (including the terminating null character) are copied
-[<a name="p343" href="#p343">page 343</a>] (<a href="#Contents">Contents</a>)
-
-    unchanged into the array. If copying takes place between objects that overlap, the
-    behavior is undefined. No more than maxsize characters are placed into the array.
-3   Each conversion specifier is replaced by appropriate characters as described in the
-    following list. The appropriate characters are determined using the LC_TIME category
-    of the current locale and by the values of zero or more members of the broken-down time
-    structure pointed to by timeptr, as specified in brackets in the description. If any of
-    the specified values is outside the normal range, the characters stored are unspecified.
-    %a    is replaced by the locale's abbreviated weekday name. [tm_wday]
-    %A    is replaced by the locale's full weekday name. [tm_wday]
-    %b    is replaced by the locale's abbreviated month name. [tm_mon]
-    %B    is replaced by the locale's full month name. [tm_mon]
-    %c    is replaced by the locale's appropriate date and time representation. [all specified
-          in <a href="#7.23.1">7.23.1</a>]
-    %C    is replaced by the year divided by 100 and truncated to an integer, as a decimal
-          number (00-99). [tm_year]
-    %d    is replaced by the day of the month as a decimal number (01-31). [tm_mday]
-    %D    is equivalent to ''%m/%d/%y''. [tm_mon, tm_mday, tm_year]
-    %e    is replaced by the day of the month as a decimal number (1-31); a single digit is
-          preceded by a space. [tm_mday]
-    %F    is equivalent to ''%Y-%m-%d'' (the ISO 8601 date format). [tm_year, tm_mon,
-          tm_mday]
-    %g    is replaced by the last 2 digits of the week-based year (see below) as a decimal
-          number (00-99). [tm_year, tm_wday, tm_yday]
-    %G    is replaced by the week-based year (see below) as a decimal number (e.g., 1997).
-          [tm_year, tm_wday, tm_yday]
-    %h    is equivalent to ''%b''. [tm_mon]
-    %H    is replaced by the hour (24-hour clock) as a decimal number (00-23). [tm_hour]
-    %I    is replaced by the hour (12-hour clock) as a decimal number (01-12). [tm_hour]
-    %j    is replaced by the day of the year as a decimal number (001-366). [tm_yday]
-    %m    is replaced by the month as a decimal number (01-12). [tm_mon]
-    %M    is replaced by the minute as a decimal number (00-59). [tm_min]
-    %n    is replaced by a new-line character.
-    %p    is replaced by the locale's equivalent of the AM/PM designations associated with a
-          12-hour clock. [tm_hour]
-    %r    is replaced by the locale's 12-hour clock time. [tm_hour, tm_min, tm_sec]
-    %R    is equivalent to ''%H:%M''. [tm_hour, tm_min]
-    %S    is replaced by the second as a decimal number (00-60). [tm_sec]
-    %t    is replaced by a horizontal-tab character.
-    %T    is equivalent to ''%H:%M:%S'' (the ISO 8601 time format). [tm_hour, tm_min,
-          tm_sec]
-
-[<a name="p344" href="#p344">page 344</a>] (<a href="#Contents">Contents</a>)
-
-    %u   is replaced by the ISO 8601 weekday as a decimal number (1-7), where Monday
-         is 1. [tm_wday]
-    %U   is replaced by the week number of the year (the first Sunday as the first day of week
-         1) as a decimal number (00-53). [tm_year, tm_wday, tm_yday]
-    %V   is replaced by the ISO 8601 week number (see below) as a decimal number
-         (01-53). [tm_year, tm_wday, tm_yday]
-    %w   is replaced by the weekday as a decimal number (0-6), where Sunday is 0.
-         [tm_wday]
-    %W   is replaced by the week number of the year (the first Monday as the first day of
-         week 1) as a decimal number (00-53). [tm_year, tm_wday, tm_yday]
-    %x   is replaced by the locale's appropriate date representation. [all specified in <a href="#7.23.1">7.23.1</a>]
-    %X   is replaced by the locale's appropriate time representation. [all specified in <a href="#7.23.1">7.23.1</a>]
-    %y   is replaced by the last 2 digits of the year as a decimal number (00-99).
-         [tm_year]
-    %Y   is replaced by the year as a decimal number (e.g., 1997). [tm_year]
-    %z   is replaced by the offset from UTC in the ISO 8601 format ''-0430'' (meaning 4
-         hours 30 minutes behind UTC, west of Greenwich), or by no characters if no time
-         zone is determinable. [tm_isdst]
-    %Z   is replaced by the locale's time zone name or abbreviation, or by no characters if no
-         time zone is determinable. [tm_isdst]
-    %%   is replaced by %.
-4   Some conversion specifiers can be modified by the inclusion of an E or O modifier
-    character to indicate an alternative format or specification. If the alternative format or
-    specification does not exist for the current locale, the modifier is ignored.
-    %Ec is replaced by the locale's alternative date and time representation.
-    %EC is replaced by the name of the base year (period) in the locale's alternative
-        representation.
-    %Ex is replaced by the locale's alternative date representation.
-    %EX is replaced by the locale's alternative time representation.
-    %Ey is replaced by the offset from %EC (year only) in the locale's alternative
-        representation.
-    %EY is replaced by the locale's full alternative year representation.
-    %Od is replaced by the day of the month, using the locale's alternative numeric symbols
-        (filled as needed with leading zeros, or with leading spaces if there is no alternative
-        symbol for zero).
-    %Oe is replaced by the day of the month, using the locale's alternative numeric symbols
-        (filled as needed with leading spaces).
-    %OH is replaced by the hour (24-hour clock), using the locale's alternative numeric
-        symbols.
-
-
-[<a name="p345" href="#p345">page 345</a>] (<a href="#Contents">Contents</a>)
-
-    %OI is replaced by the hour (12-hour clock), using the locale's alternative numeric
-        symbols.
-    %Om is replaced by the month, using the locale's alternative numeric symbols.
-    %OM is replaced by the minutes, using the locale's alternative numeric symbols.
-    %OS is replaced by the seconds, using the locale's alternative numeric symbols.
-    %Ou is replaced by the ISO 8601 weekday as a number in the locale's alternative
-        representation, where Monday is 1.
-    %OU is replaced by the week number, using the locale's alternative numeric symbols.
-    %OV is replaced by the ISO 8601 week number, using the locale's alternative numeric
-        symbols.
-    %Ow is replaced by the weekday as a number, using the locale's alternative numeric
-        symbols.
-    %OW is replaced by the week number of the year, using the locale's alternative numeric
-        symbols.
-    %Oy is replaced by the last 2 digits of the year, using the locale's alternative numeric
-        symbols.
-5   %g, %G, and %V give values according to the ISO 8601 week-based year. In this system,
-    weeks begin on a Monday and week 1 of the year is the week that includes January 4th,
-    which is also the week that includes the first Thursday of the year, and is also the first
-    week that contains at least four days in the year. If the first Monday of January is the
-    2nd, 3rd, or 4th, the preceding days are part of the last week of the preceding year; thus,
-    for Saturday 2nd January 1999, %G is replaced by 1998 and %V is replaced by 53. If
-    December 29th, 30th, or 31st is a Monday, it and any following days are part of week 1 of
-    the following year. Thus, for Tuesday 30th December 1997, %G is replaced by 1998 and
-    %V is replaced by 01.
-6   If a conversion specifier is not one of the above, the behavior is undefined.
-7   In the "C" locale, the E and O modifiers are ignored and the replacement strings for the
-    following specifiers are:
-    %a    the first three characters of %A.
-    %A    one of ''Sunday'', ''Monday'', ... , ''Saturday''.
-    %b    the first three characters of %B.
-    %B    one of ''January'', ''February'', ... , ''December''.
-    %c    equivalent to ''%a %b %e %T %Y''.
-    %p    one of ''AM'' or ''PM''.
-    %r    equivalent to ''%I:%M:%S %p''.
-    %x    equivalent to ''%m/%d/%y''.
-    %X    equivalent to %T.
-    %Z    implementation-defined.
-
-
-[<a name="p346" href="#p346">page 346</a>] (<a href="#Contents">Contents</a>)
-
-    Returns
-8   If the total number of resulting characters including the terminating null character is not
-    more than maxsize, the strftime function returns the number of characters placed
-    into the array pointed to by s not including the terminating null character. Otherwise,
-    zero is returned and the contents of the array are indeterminate.
-
-
-
-
-[<a name="p347" href="#p347">page 347</a>] (<a href="#Contents">Contents</a>)
-
-<a name="7.24" href="#7.24"><b>    7.24 Extended multibyte and wide character utilities &lt;wchar.h&gt;</b></a>
-<a name="7.24.1" href="#7.24.1"><b>    7.24.1 Introduction</b></a>
-1   The header <a href="#7.24">&lt;wchar.h&gt;</a> declares four data types, one tag, four macros, and many
-    functions.277)
-2   The types declared are wchar_t and size_t (both described in <a href="#7.17">7.17</a>);
-             mbstate_t
-    which is an object type other than an array type that can hold the conversion state
-    information necessary to convert between sequences of multibyte characters and wide
-    characters;
-             wint_t
-    which is an integer type unchanged by default argument promotions that can hold any
-    value corresponding to members of the extended character set, as well as at least one
-    value that does not correspond to any member of the extended character set (see WEOF
-    below);278) and
-             struct tm
-    which is declared as an incomplete structure type (the contents are described in <a href="#7.23.1">7.23.1</a>).
-3   The macros defined are NULL (described in <a href="#7.17">7.17</a>); WCHAR_MIN and WCHAR_MAX
-    (described in <a href="#7.18.3">7.18.3</a>); and
-             WEOF
-    which expands to a constant expression of type wint_t whose value does not
-    correspond to any member of the extended character set.279) It is accepted (and returned)
-    by several functions in this subclause to indicate end-of-file, that is, no more input from a
-    stream. It is also used as a wide character value that does not correspond to any member
-    of the extended character set.
-4   The functions declared are grouped as follows:
-    -- Functions that perform input and output of wide characters, or multibyte characters,
-      or both;
-    -- Functions that provide wide string numeric conversion;
-    -- Functions that perform general wide string manipulation;
-
-
-    277) See ''future library directions'' (<a href="#7.26.12">7.26.12</a>).
-    278) wchar_t and wint_t can be the same integer type.
-    279) The value of the macro WEOF may differ from that of EOF and need not be negative.
-
-[<a name="p348" href="#p348">page 348</a>] (<a href="#Contents">Contents</a>)
-
-    -- Functions for wide string date and time conversion; and
-    -- Functions that provide extended capabilities for conversion between multibyte and
-      wide character sequences.
-5   Unless explicitly stated otherwise, if the execution of a function described in this
-    subclause causes copying to take place between objects that overlap, the behavior is
-    undefined.
-<a name="7.24.2" href="#7.24.2"><b>    7.24.2 Formatted wide character input/output functions</b></a>
-1   The formatted wide character input/output functions shall behave as if there is a sequence
-    point after the actions associated with each specifier.280)
-<a name="7.24.2.1" href="#7.24.2.1"><b>    7.24.2.1 The fwprintf function</b></a>
-    Synopsis
-1           #include <a href="#7.19">&lt;stdio.h&gt;</a>
-            #include <a href="#7.24">&lt;wchar.h&gt;</a>
-            int fwprintf(FILE * restrict stream,
-                 const wchar_t * restrict format, ...);
-    Description
-2   The fwprintf function writes output to the stream pointed to by stream, under
-    control of the wide string pointed to by format that specifies how subsequent arguments
-    are converted for output. If there are insufficient arguments for the format, the behavior
-    is undefined. If the format is exhausted while arguments remain, the excess arguments
-    are evaluated (as always) but are otherwise ignored. The fwprintf function returns
-    when the end of the format string is encountered.
-3   The format is composed of zero or more directives: ordinary wide characters (not %),
-    which are copied unchanged to the output stream; and conversion specifications, each of
-    which results in fetching zero or more subsequent arguments, converting them, if
-    applicable, according to the corresponding conversion specifier, and then writing the
-    result to the output stream.
-4   Each conversion specification is introduced by the wide character %. After the %, the
-    following appear in sequence:
-    -- Zero or more flags (in any order) that modify the meaning of the conversion
-      specification.
-    -- An optional minimum field width. If the converted value has fewer wide characters
-      than the field width, it is padded with spaces (by default) on the left (or right, if the
-
-
-    280) The fwprintf functions perform writes to memory for the %n specifier.
-
-[<a name="p349" href="#p349">page 349</a>] (<a href="#Contents">Contents</a>)
-
-        left adjustment flag, described later, has been given) to the field width. The field
-        width takes the form of an asterisk * (described later) or a nonnegative decimal
-        integer.281)
-    -- An optional precision that gives the minimum number of digits to appear for the d, i,
-      o, u, x, and X conversions, the number of digits to appear after the decimal-point
-      wide character for a, A, e, E, f, and F conversions, the maximum number of
-      significant digits for the g and G conversions, or the maximum number of wide
-      characters to be written for s conversions. The precision takes the form of a period
-      (.) followed either by an asterisk * (described later) or by an optional decimal
-      integer; if only the period is specified, the precision is taken as zero. If a precision
-      appears with any other conversion specifier, the behavior is undefined.
-    -- An optional length modifier that specifies the size of the argument.
-    -- A conversion specifier wide character that specifies the type of conversion to be
-      applied.
-5   As noted above, a field width, or precision, or both, may be indicated by an asterisk. In
-    this case, an int argument supplies the field width or precision. The arguments
-    specifying field width, or precision, or both, shall appear (in that order) before the
-    argument (if any) to be converted. A negative field width argument is taken as a - flag
-    followed by a positive field width. A negative precision argument is taken as if the
-    precision were omitted.
-6   The flag wide characters and their meanings are:
-    -        The result of the conversion is left-justified within the field. (It is right-justified if
-             this flag is not specified.)
-    +        The result of a signed conversion always begins with a plus or minus sign. (It
-             begins with a sign only when a negative value is converted if this flag is not
-             specified.)282)
-    space If the first wide character of a signed conversion is not a sign, or if a signed
-          conversion results in no wide characters, a space is prefixed to the result. If the
-          space and + flags both appear, the space flag is ignored.
-    #        The result is converted to an ''alternative form''. For o conversion, it increases
-             the precision, if and only if necessary, to force the first digit of the result to be a
-             zero (if the value and precision are both 0, a single 0 is printed). For x (or X)
-             conversion, a nonzero result has 0x (or 0X) prefixed to it. For a, A, e, E, f, F, g,
-
-    281) Note that 0 is taken as a flag, not as the beginning of a field width.
-    282) The results of all floating conversions of a negative zero, and of negative values that round to zero,
-         include a minus sign.
-
-[<a name="p350" href="#p350">page 350</a>] (<a href="#Contents">Contents</a>)
-
-              and G conversions, the result of converting a floating-point number always
-              contains a decimal-point wide character, even if no digits follow it. (Normally, a
-              decimal-point wide character appears in the result of these conversions only if a
-              digit follows it.) For g and G conversions, trailing zeros are not removed from the
-              result. For other conversions, the behavior is undefined.
-    0         For d, i, o, u, x, X, a, A, e, E, f, F, g, and G conversions, leading zeros
-              (following any indication of sign or base) are used to pad to the field width rather
-              than performing space padding, except when converting an infinity or NaN. If the
-              0 and - flags both appear, the 0 flag is ignored. For d, i, o, u, x, and X
-              conversions, if a precision is specified, the 0 flag is ignored. For other
-              conversions, the behavior is undefined.
-7   The length modifiers and their meanings are:
-    hh             Specifies that a following d, i, o, u, x, or X conversion specifier applies to a
-                   signed char or unsigned char argument (the argument will have
-                   been promoted according to the integer promotions, but its value shall be
-                   converted to signed char or unsigned char before printing); or that
-                   a following n conversion specifier applies to a pointer to a signed char
-                   argument.
-    h              Specifies that a following d, i, o, u, x, or X conversion specifier applies to a
-                   short int or unsigned short int argument (the argument will
-                   have been promoted according to the integer promotions, but its value shall
-                   be converted to short int or unsigned short int before printing);
-                   or that a following n conversion specifier applies to a pointer to a short
-                   int argument.
-    l (ell)        Specifies that a following d, i, o, u, x, or X conversion specifier applies to a
-                   long int or unsigned long int argument; that a following n
-                   conversion specifier applies to a pointer to a long int argument; that a
-                   following c conversion specifier applies to a wint_t argument; that a
-                   following s conversion specifier applies to a pointer to a wchar_t
-                   argument; or has no effect on a following a, A, e, E, f, F, g, or G conversion
-                   specifier.
-    ll (ell-ell) Specifies that a following d, i, o, u, x, or X conversion specifier applies to a
-                 long long int or unsigned long long int argument; or that a
-                 following n conversion specifier applies to a pointer to a long long int
-                 argument.
-    j              Specifies that a following d, i, o, u, x, or X conversion specifier applies to
-                   an intmax_t or uintmax_t argument; or that a following n conversion
-                   specifier applies to a pointer to an intmax_t argument.
-
-[<a name="p351" href="#p351">page 351</a>] (<a href="#Contents">Contents</a>)
-
-    z           Specifies that a following d, i, o, u, x, or X conversion specifier applies to a
-                size_t or the corresponding signed integer type argument; or that a
-                following n conversion specifier applies to a pointer to a signed integer type
-                corresponding to size_t argument.
-    t           Specifies that a following d, i, o, u, x, or X conversion specifier applies to a
-                ptrdiff_t or the corresponding unsigned integer type argument; or that a
-                following n conversion specifier applies to a pointer to a ptrdiff_t
-                argument.
-    L           Specifies that a following a, A, e, E, f, F, g, or G conversion specifier
-                applies to a long double argument.
-    If a length modifier appears with any conversion specifier other than as specified above,
-    the behavior is undefined.
-8   The conversion specifiers and their meanings are:
-    d,i        The int argument is converted to signed decimal in the style [-]dddd. The
-               precision specifies the minimum number of digits to appear; if the value
-               being converted can be represented in fewer digits, it is expanded with
-               leading zeros. The default precision is 1. The result of converting a zero
-               value with a precision of zero is no wide characters.
-    o,u,x,X The unsigned int argument is converted to unsigned octal (o), unsigned
-            decimal (u), or unsigned hexadecimal notation (x or X) in the style dddd; the
-            letters abcdef are used for x conversion and the letters ABCDEF for X
-            conversion. The precision specifies the minimum number of digits to appear;
-            if the value being converted can be represented in fewer digits, it is expanded
-            with leading zeros. The default precision is 1. The result of converting a
-            zero value with a precision of zero is no wide characters.
-    f,F        A double argument representing a floating-point number is converted to
-               decimal notation in the style [-]ddd.ddd, where the number of digits after
-               the decimal-point wide character is equal to the precision specification. If the
-               precision is missing, it is taken as 6; if the precision is zero and the # flag is
-               not specified, no decimal-point wide character appears. If a decimal-point
-               wide character appears, at least one digit appears before it. The value is
-               rounded to the appropriate number of digits.
-               A double argument representing an infinity is converted in one of the styles
-               [-]inf or [-]infinity -- which style is implementation-defined. A
-               double argument representing a NaN is converted in one of the styles
-               [-]nan or [-]nan(n-wchar-sequence) -- which style, and the meaning of
-               any n-wchar-sequence, is implementation-defined. The F conversion
-               specifier produces INF, INFINITY, or NAN instead of inf, infinity, or
-[<a name="p352" href="#p352">page 352</a>] (<a href="#Contents">Contents</a>)
-
-             nan, respectively.283)
-e,E          A double argument representing a floating-point number is converted in the
-             style [-]d.ddd e(+-)dd, where there is one digit (which is nonzero if the
-             argument is nonzero) before the decimal-point wide character and the number
-             of digits after it is equal to the precision; if the precision is missing, it is taken
-             as 6; if the precision is zero and the # flag is not specified, no decimal-point
-             wide character appears. The value is rounded to the appropriate number of
-             digits. The E conversion specifier produces a number with E instead of e
-             introducing the exponent. The exponent always contains at least two digits,
-             and only as many more digits as necessary to represent the exponent. If the
-             value is zero, the exponent is zero.
-             A double argument representing an infinity or NaN is converted in the style
-             of an f or F conversion specifier.
-g,G          A double argument representing a floating-point number is converted in
-             style f or e (or in style F or E in the case of a G conversion specifier),
-             depending on the value converted and the precision. Let P equal the
-             precision if nonzero, 6 if the precision is omitted, or 1 if the precision is zero.
-             Then, if a conversion with style E would have an exponent of X :
-             -- if P &gt; X &gt;= -4, the conversion is with style f (or F) and precision
-               P - (X + 1).
-             -- otherwise, the conversion is with style e (or E) and precision P - 1.
-             Finally, unless the # flag is used, any trailing zeros are removed from the
-             fractional portion of the result and the decimal-point wide character is
-             removed if there is no fractional portion remaining.
-             A double argument representing an infinity or NaN is converted in the style
-             of an f or F conversion specifier.
-a,A          A double argument representing a floating-point number is converted in the
-             style [-]0xh.hhhh p(+-)d, where there is one hexadecimal digit (which is
-             nonzero if the argument is a normalized floating-point number and is
-             otherwise unspecified) before the decimal-point wide character284) and the
-             number of hexadecimal digits after it is equal to the precision; if the precision
-             is missing and FLT_RADIX is a power of 2, then the precision is sufficient
-
-
-283) When applied to infinite and NaN values, the -, +, and space flag wide characters have their usual
-     meaning; the # and 0 flag wide characters have no effect.
-284) Binary implementations can choose the hexadecimal digit to the left of the decimal-point wide
-     character so that subsequent digits align to nibble (4-bit) boundaries.
-
-[<a name="p353" href="#p353">page 353</a>] (<a href="#Contents">Contents</a>)
-
-             for an exact representation of the value; if the precision is missing and
-             FLT_RADIX is not a power of 2, then the precision is sufficient to
-             distinguish285) values of type double, except that trailing zeros may be
-             omitted; if the precision is zero and the # flag is not specified, no decimal-
-             point wide character appears. The letters abcdef are used for a conversion
-             and the letters ABCDEF for A conversion. The A conversion specifier
-             produces a number with X and P instead of x and p. The exponent always
-             contains at least one digit, and only as many more digits as necessary to
-             represent the decimal exponent of 2. If the value is zero, the exponent is
-             zero.
-             A double argument representing an infinity or NaN is converted in the style
-             of an f or F conversion specifier.
-c            If no l length modifier is present, the int argument is converted to a wide
-             character as if by calling btowc and the resulting wide character is written.
-             If an l length modifier is present, the wint_t argument is converted to
-             wchar_t and written.
-s            If no l length modifier is present, the argument shall be a pointer to the initial
-             element of a character array containing a multibyte character sequence
-             beginning in the initial shift state. Characters from the array are converted as
-             if by repeated calls to the mbrtowc function, with the conversion state
-             described by an mbstate_t object initialized to zero before the first
-             multibyte character is converted, and written up to (but not including) the
-             terminating null wide character. If the precision is specified, no more than
-             that many wide characters are written. If the precision is not specified or is
-             greater than the size of the converted array, the converted array shall contain a
-             null wide character.
-             If an l length modifier is present, the argument shall be a pointer to the initial
-             element of an array of wchar_t type. Wide characters from the array are
-             written up to (but not including) a terminating null wide character. If the
-             precision is specified, no more than that many wide characters are written. If
-             the precision is not specified or is greater than the size of the array, the array
-             shall contain a null wide character.
-p            The argument shall be a pointer to void. The value of the pointer is
-             converted to a sequence of printing wide characters, in an implementation-
-
-285) The precision p is sufficient to distinguish values of the source type if 16 p-1 &gt; b n where b is
-     FLT_RADIX and n is the number of base-b digits in the significand of the source type. A smaller p
-     might suffice depending on the implementation's scheme for determining the digit to the left of the
-     decimal-point wide character.
-
-[<a name="p354" href="#p354">page 354</a>] (<a href="#Contents">Contents</a>)
-
-                    defined manner.
-     n              The argument shall be a pointer to signed integer into which is written the
-                    number of wide characters written to the output stream so far by this call to
-                    fwprintf. No argument is converted, but one is consumed. If the
-                    conversion specification includes any flags, a field width, or a precision, the
-                    behavior is undefined.
-     %              A % wide character is written. No argument is converted. The complete
-                    conversion specification shall be %%.
-9    If a conversion specification is invalid, the behavior is undefined.286) If any argument is
-     not the correct type for the corresponding conversion specification, the behavior is
-     undefined.
-10   In no case does a nonexistent or small field width cause truncation of a field; if the result
-     of a conversion is wider than the field width, the field is expanded to contain the
-     conversion result.
-11   For a and A conversions, if FLT_RADIX is a power of 2, the value is correctly rounded
-     to a hexadecimal floating number with the given precision.
-     Recommended practice
-12   For a and A conversions, if FLT_RADIX is not a power of 2 and the result is not exactly
-     representable in the given precision, the result should be one of the two adjacent numbers
-     in hexadecimal floating style with the given precision, with the extra stipulation that the
-     error should have a correct sign for the current rounding direction.
-13   For e, E, f, F, g, and G conversions, if the number of significant decimal digits is at most
-     DECIMAL_DIG, then the result should be correctly rounded.287) If the number of
-     significant decimal digits is more than DECIMAL_DIG but the source value is exactly
-     representable with DECIMAL_DIG digits, then the result should be an exact
-     representation with trailing zeros. Otherwise, the source value is bounded by two
-     adjacent decimal strings L &lt; U, both having DECIMAL_DIG significant digits; the value
-     of the resultant decimal string D should satisfy L &lt;= D &lt;= U, with the extra stipulation that
-     the error should have a correct sign for the current rounding direction.
-     Returns
-14   The fwprintf function returns the number of wide characters transmitted, or a negative
-     value if an output or encoding error occurred.
-
-     286) See ''future library directions'' (<a href="#7.26.12">7.26.12</a>).
-     287) For binary-to-decimal conversion, the result format's values are the numbers representable with the
-          given format specifier. The number of significant digits is determined by the format specifier, and in
-          the case of fixed-point conversion by the source value as well.
-
-[<a name="p355" href="#p355">page 355</a>] (<a href="#Contents">Contents</a>)
-
-     Environmental limits
-15   The number of wide characters that can be produced by any single conversion shall be at
-     least 4095.
-16   EXAMPLE       To print a date and time in the form ''Sunday, July 3, 10:02'' followed by pi to five decimal
-     places:
-            #include <a href="#7.12">&lt;math.h&gt;</a>
-            #include <a href="#7.19">&lt;stdio.h&gt;</a>
-            #include <a href="#7.24">&lt;wchar.h&gt;</a>
-            /* ... */
-            wchar_t *weekday, *month; // pointers to wide strings
-            int day, hour, min;
-            fwprintf(stdout, L"%ls, %ls %d, %.2d:%.2d\n",
-                    weekday, month, day, hour, min);
-            fwprintf(stdout, L"pi = %.5f\n", 4 * atan(1.0));
-
-     Forward references:          the btowc function (<a href="#7.24.6.1.1">7.24.6.1.1</a>), the mbrtowc function
-     (<a href="#7.24.6.3.2">7.24.6.3.2</a>).
-<a name="7.24.2.2" href="#7.24.2.2"><b>     7.24.2.2 The fwscanf function</b></a>
-     Synopsis
-1           #include <a href="#7.19">&lt;stdio.h&gt;</a>
-            #include <a href="#7.24">&lt;wchar.h&gt;</a>
-            int fwscanf(FILE * restrict stream,
-                 const wchar_t * restrict format, ...);
-     Description
-2    The fwscanf function reads input from the stream pointed to by stream, under
-     control of the wide string pointed to by format that specifies the admissible input
-     sequences and how they are to be converted for assignment, using subsequent arguments
-     as pointers to the objects to receive the converted input. If there are insufficient
-     arguments for the format, the behavior is undefined. If the format is exhausted while
-     arguments remain, the excess arguments are evaluated (as always) but are otherwise
-     ignored.
-3    The format is composed of zero or more directives: one or more white-space wide
-     characters, an ordinary wide character (neither % nor a white-space wide character), or a
-     conversion specification. Each conversion specification is introduced by the wide
-     character %. After the %, the following appear in sequence:
-     -- An optional assignment-suppressing wide character *.
-     -- An optional decimal integer greater than zero that specifies the maximum field width
-       (in wide characters).
-
-
-
-[<a name="p356" href="#p356">page 356</a>] (<a href="#Contents">Contents</a>)
-
-     -- An optional length modifier that specifies the size of the receiving object.
-     -- A conversion specifier wide character that specifies the type of conversion to be
-       applied.
-4    The fwscanf function executes each directive of the format in turn. If a directive fails,
-     as detailed below, the function returns. Failures are described as input failures (due to the
-     occurrence of an encoding error or the unavailability of input characters), or matching
-     failures (due to inappropriate input).
-5    A directive composed of white-space wide character(s) is executed by reading input up to
-     the first non-white-space wide character (which remains unread), or until no more wide
-     characters can be read.
-6    A directive that is an ordinary wide character is executed by reading the next wide
-     character of the stream. If that wide character differs from the directive, the directive
-     fails and the differing and subsequent wide characters remain unread. Similarly, if end-
-     of-file, an encoding error, or a read error prevents a wide character from being read, the
-     directive fails.
-7    A directive that is a conversion specification defines a set of matching input sequences, as
-     described below for each specifier. A conversion specification is executed in the
-     following steps:
-8    Input white-space wide characters (as specified by the iswspace function) are skipped,
-     unless the specification includes a [, c, or n specifier.288)
-9    An input item is read from the stream, unless the specification includes an n specifier. An
-     input item is defined as the longest sequence of input wide characters which does not
-     exceed any specified field width and which is, or is a prefix of, a matching input
-     sequence.289) The first wide character, if any, after the input item remains unread. If the
-     length of the input item is zero, the execution of the directive fails; this condition is a
-     matching failure unless end-of-file, an encoding error, or a read error prevented input
-     from the stream, in which case it is an input failure.
-10   Except in the case of a % specifier, the input item (or, in the case of a %n directive, the
-     count of input wide characters) is converted to a type appropriate to the conversion
-     specifier. If the input item is not a matching sequence, the execution of the directive fails:
-     this condition is a matching failure. Unless assignment suppression was indicated by a *,
-     the result of the conversion is placed in the object pointed to by the first argument
-     following the format argument that has not already received a conversion result. If this
-
-
-     288) These white-space wide characters are not counted against a specified field width.
-     289) fwscanf pushes back at most one input wide character onto the input stream. Therefore, some
-          sequences that are acceptable to wcstod, wcstol, etc., are unacceptable to fwscanf.
-
-[<a name="p357" href="#p357">page 357</a>] (<a href="#Contents">Contents</a>)
-
-     object does not have an appropriate type, or if the result of the conversion cannot be
-     represented in the object, the behavior is undefined.
-11   The length modifiers and their meanings are:
-     hh          Specifies that a following d, i, o, u, x, X, or n conversion specifier applies
-                 to an argument with type pointer to signed char or unsigned char.
-     h           Specifies that a following d, i, o, u, x, X, or n conversion specifier applies
-                 to an argument with type pointer to short int or unsigned short
-                 int.
-     l (ell)     Specifies that a following d, i, o, u, x, X, or n conversion specifier applies
-                 to an argument with type pointer to long int or unsigned long
-                 int; that a following a, A, e, E, f, F, g, or G conversion specifier applies to
-                 an argument with type pointer to double; or that a following c, s, or [
-                 conversion specifier applies to an argument with type pointer to wchar_t.
-     ll (ell-ell) Specifies that a following d, i, o, u, x, X, or n conversion specifier applies
-                  to an argument with type pointer to long long int or unsigned
-                  long long int.
-     j           Specifies that a following d, i, o, u, x, X, or n conversion specifier applies
-                 to an argument with type pointer to intmax_t or uintmax_t.
-     z           Specifies that a following d, i, o, u, x, X, or n conversion specifier applies
-                 to an argument with type pointer to size_t or the corresponding signed
-                 integer type.
-     t           Specifies that a following d, i, o, u, x, X, or n conversion specifier applies
-                 to an argument with type pointer to ptrdiff_t or the corresponding
-                 unsigned integer type.
-     L           Specifies that a following a, A, e, E, f, F, g, or G conversion specifier
-                 applies to an argument with type pointer to long double.
-     If a length modifier appears with any conversion specifier other than as specified above,
-     the behavior is undefined.
-12   The conversion specifiers and their meanings are:
-     d          Matches an optionally signed decimal integer, whose format is the same as
-                expected for the subject sequence of the wcstol function with the value 10
-                for the base argument. The corresponding argument shall be a pointer to
-                signed integer.
-     i          Matches an optionally signed integer, whose format is the same as expected
-                for the subject sequence of the wcstol function with the value 0 for the
-                base argument. The corresponding argument shall be a pointer to signed
-[<a name="p358" href="#p358">page 358</a>] (<a href="#Contents">Contents</a>)
-
-            integer.
-o           Matches an optionally signed octal integer, whose format is the same as
-            expected for the subject sequence of the wcstoul function with the value 8
-            for the base argument. The corresponding argument shall be a pointer to
-            unsigned integer.
-u           Matches an optionally signed decimal integer, whose format is the same as
-            expected for the subject sequence of the wcstoul function with the value 10
-            for the base argument. The corresponding argument shall be a pointer to
-            unsigned integer.
-x           Matches an optionally signed hexadecimal integer, whose format is the same
-            as expected for the subject sequence of the wcstoul function with the value
-            16 for the base argument. The corresponding argument shall be a pointer to
-            unsigned integer.
-a,e,f,g Matches an optionally signed floating-point number, infinity, or NaN, whose
-        format is the same as expected for the subject sequence of the wcstod
-        function. The corresponding argument shall be a pointer to floating.
-c           Matches a sequence of wide characters of exactly the number specified by the
-            field width (1 if no field width is present in the directive).
-            If no l length modifier is present, characters from the input field are
-            converted as if by repeated calls to the wcrtomb function, with the
-            conversion state described by an mbstate_t object initialized to zero
-            before the first wide character is converted. The corresponding argument
-            shall be a pointer to the initial element of a character array large enough to
-            accept the sequence. No null character is added.
-            If an l length modifier is present, the corresponding argument shall be a
-            pointer to the initial element of an array of wchar_t large enough to accept
-            the sequence. No null wide character is added.
-s           Matches a sequence of non-white-space wide characters.
-            If no l length modifier is present, characters from the input field are
-            converted as if by repeated calls to the wcrtomb function, with the
-            conversion state described by an mbstate_t object initialized to zero
-            before the first wide character is converted. The corresponding argument
-            shall be a pointer to the initial element of a character array large enough to
-            accept the sequence and a terminating null character, which will be added
-            automatically.
-            If an l length modifier is present, the corresponding argument shall be a
-            pointer to the initial element of an array of wchar_t large enough to accept
-
-[<a name="p359" href="#p359">page 359</a>] (<a href="#Contents">Contents</a>)
-
-         the sequence and the terminating null wide character, which will be added
-         automatically.
-[        Matches a nonempty sequence of wide characters from a set of expected
-         characters (the scanset).
-         If no l length modifier is present, characters from the input field are
-         converted as if by repeated calls to the wcrtomb function, with the
-         conversion state described by an mbstate_t object initialized to zero
-         before the first wide character is converted. The corresponding argument
-         shall be a pointer to the initial element of a character array large enough to
-         accept the sequence and a terminating null character, which will be added
-         automatically.
-         If an l length modifier is present, the corresponding argument shall be a
-         pointer to the initial element of an array of wchar_t large enough to accept
-         the sequence and the terminating null wide character, which will be added
-         automatically.
-         The conversion specifier includes all subsequent wide characters in the
-         format string, up to and including the matching right bracket (]). The wide
-         characters between the brackets (the scanlist) compose the scanset, unless the
-         wide character after the left bracket is a circumflex (^), in which case the
-         scanset contains all wide characters that do not appear in the scanlist between
-         the circumflex and the right bracket. If the conversion specifier begins with
-         [] or [^], the right bracket wide character is in the scanlist and the next
-         following right bracket wide character is the matching right bracket that ends
-         the specification; otherwise the first following right bracket wide character is
-         the one that ends the specification. If a - wide character is in the scanlist and
-         is not the first, nor the second where the first wide character is a ^, nor the
-         last character, the behavior is implementation-defined.
-p        Matches an implementation-defined set of sequences, which should be the
-         same as the set of sequences that may be produced by the %p conversion of
-         the fwprintf function. The corresponding argument shall be a pointer to a
-         pointer to void. The input item is converted to a pointer value in an
-         implementation-defined manner. If the input item is a value converted earlier
-         during the same program execution, the pointer that results shall compare
-         equal to that value; otherwise the behavior of the %p conversion is undefined.
-n        No input is consumed. The corresponding argument shall be a pointer to
-         signed integer into which is to be written the number of wide characters read
-         from the input stream so far by this call to the fwscanf function. Execution
-         of a %n directive does not increment the assignment count returned at the
-         completion of execution of the fwscanf function. No argument is
-[<a name="p360" href="#p360">page 360</a>] (<a href="#Contents">Contents</a>)
-
-                    converted, but one is consumed. If the conversion specification includes an
-                    assignment-suppressing wide character or a field width, the behavior is
-                    undefined.
-     %              Matches a single % wide character; no conversion or assignment occurs. The
-                    complete conversion specification shall be %%.
-13   If a conversion specification is invalid, the behavior is undefined.290)
-14   The conversion specifiers A, E, F, G, and X are also valid and behave the same as,
-     respectively, a, e, f, g, and x.
-15   Trailing white space (including new-line wide characters) is left unread unless matched
-     by a directive. The success of literal matches and suppressed assignments is not directly
-     determinable other than via the %n directive.
-     Returns
-16   The fwscanf function returns the value of the macro EOF if an input failure occurs
-     before any conversion. Otherwise, the function returns the number of input items
-     assigned, which can be fewer than provided for, or even zero, in the event of an early
-     matching failure.
-17   EXAMPLE 1        The call:
-              #include <a href="#7.19">&lt;stdio.h&gt;</a>
-              #include <a href="#7.24">&lt;wchar.h&gt;</a>
+</pre>
+ declare a typedef name t with type signed int, a typedef name plain with type int, and a structure
+ with three bit-field members, one named t that contains values in the range [0, 15], an unnamed const-
+ qualified bit-field which (if it could be accessed) would contain values in either the range [-15, +15] or
+ [-16, +15], and one named r that contains values in one of the ranges [0, 31], [-15, +15], or [-16, +15].
+ (The choice of range is implementation-defined.) The first two bit-field declarations differ in that
+ unsigned is a type specifier (which forces t to be the name of a structure member), while const is a
+ type qualifier (which modifies t which is still visible as a typedef name). If these declarations are followed
+ in an inner scope by
+<pre>
+         t f(t (t));
+         long t;
+</pre>
+ then a function f is declared with type ''function returning signed int with one unnamed parameter
+ with type pointer to function returning signed int with one unnamed parameter with type signed
+ int'', and an identifier t with type long int.
+<p><!--para 7 -->
+ EXAMPLE 4 On the other hand, typedef names can be used to improve code readability. All three of the
+ following declarations of the signal function specify exactly the same type, the first without making use
+ of any typedef names.
+<pre>
+         typedef void fv(int), (*pfv)(int);
+         void (*signal(int, void (*)(int)))(int);
+         fv *signal(int, fv *);
+         pfv signal(int, pfv);
+</pre>
+<p><!--para 8 -->
+ EXAMPLE 5 If a typedef name denotes a variable length array type, the length of the array is fixed at the
+ time the typedef name is defined, not each time it is used:
+<!--page 137 -->
+<pre>
+         void copyt(int n)
+         {
+               typedef int B[n];    //               B is n ints, n evaluated now
+               n += 1;
+               B a;                //                a is n ints, n without += 1
+               int b[n];           //                a and b are different sizes
+               for (int i = 1; i &lt; n;                i++)
+                     a[i-1] = b[i];
+         }
+</pre>
+
+<h4><a name="6.7.8" href="#6.7.8">6.7.8 Initialization</a></h4>
+<p><b>Syntax</b>
+<p><!--para 1 -->
+<pre>
+          initializer:
+                   assignment-expression
+                   { initializer-list }
+                   { initializer-list , }
+          initializer-list:
+                   designation<sub>opt</sub> initializer
+                   initializer-list , designation<sub>opt</sub> initializer
+          designation:
+                 designator-list =
+          designator-list:
+                 designator
+                 designator-list designator
+          designator:
+                 [ constant-expression ]
+                 . identifier
+</pre>
+<p><b>Constraints</b>
+<p><!--para 2 -->
+ No initializer shall attempt to provide a value for an object not contained within the entity
+ being initialized.
+<p><!--para 3 -->
+ The type of the entity to be initialized shall be an array of unknown size or an object type
+ that is not a variable length array type.
+<p><!--para 4 -->
+ All the expressions in an initializer for an object that has static storage duration shall be
+ constant expressions or string literals.
+<p><!--para 5 -->
+ If the declaration of an identifier has block scope, and the identifier has external or
+ internal linkage, the declaration shall have no initializer for the identifier.
+<p><!--para 6 -->
+ If a designator has the form
+<pre>
+          [ constant-expression ]
+</pre>
+ then the current object (defined below) shall have array type and the expression shall be
+ an integer constant expression. If the array is of unknown size, any nonnegative value is
+ valid.
+<p><!--para 7 -->
+ If a designator has the form
+<pre>
+          . identifier
+</pre>
+ then the current object (defined below) shall have structure or union type and the
+ identifier shall be the name of a member of that type.
+<!--page 138 -->
+<p><b>Semantics</b>
+<p><!--para 8 -->
+ An initializer specifies the initial value stored in an object.
+<p><!--para 9 -->
+ Except where explicitly stated otherwise, for the purposes of this subclause unnamed
+ members of objects of structure and union type do not participate in initialization.
+ Unnamed members of structure objects have indeterminate value even after initialization.
+<p><!--para 10 -->
+ If an object that has automatic storage duration is not initialized explicitly, its value is
+ indeterminate. If an object that has static storage duration is not initialized explicitly,
+ then:
+<ul>
+<li>  if it has pointer type, it is initialized to a null pointer;
+<li>  if it has arithmetic type, it is initialized to (positive or unsigned) zero;
+<li>  if it is an aggregate, every member is initialized (recursively) according to these rules;
+<li>  if it is a union, the first named member is initialized (recursively) according to these
+ rules.
+</ul>
+<p><!--para 11 -->
+ The initializer for a scalar shall be a single expression, optionally enclosed in braces. The
+ initial value of the object is that of the expression (after conversion); the same type
+ constraints and conversions as for simple assignment apply, taking the type of the scalar
+ to be the unqualified version of its declared type.
+<p><!--para 12 -->
+ The rest of this subclause deals with initializers for objects that have aggregate or union
+ type.
+<p><!--para 13 -->
+ The initializer for a structure or union object that has automatic storage duration shall be
+ either an initializer list as described below, or a single expression that has compatible
+ structure or union type. In the latter case, the initial value of the object, including
+ unnamed members, is that of the expression.
+<p><!--para 14 -->
+ An array of character type may be initialized by a character string literal, optionally
+ enclosed in braces. Successive characters of the character string literal (including the
+ terminating null character if there is room or if the array is of unknown size) initialize the
+ elements of the array.
+<p><!--para 15 -->
+ An array with element type compatible with wchar_t may be initialized by a wide
+ string literal, optionally enclosed in braces. Successive wide characters of the wide string
+ literal (including the terminating null wide character if there is room or if the array is of
+ unknown size) initialize the elements of the array.
+<p><!--para 16 -->
+ Otherwise, the initializer for an object that has aggregate or union type shall be a brace-
+ enclosed list of initializers for the elements or named members.
+<p><!--para 17 -->
+ Each brace-enclosed initializer list has an associated current object. When no
+ designations are present, subobjects of the current object are initialized in order according
+ to the type of the current object: array elements in increasing subscript order, structure
+<!--page 139 -->
+ members in declaration order, and the first named member of a union.<sup><a href="#note129"><b>129)</b></a></sup> In contrast, a
+ designation causes the following initializer to begin initialization of the subobject
+ described by the designator. Initialization then continues forward in order, beginning
+ with the next subobject after that described by the designator.<sup><a href="#note130"><b>130)</b></a></sup>
+<p><!--para 18 -->
+ Each designator list begins its description with the current object associated with the
+ closest surrounding brace pair. Each item in the designator list (in order) specifies a
+ particular member of its current object and changes the current object for the next
+ designator (if any) to be that member.<sup><a href="#note131"><b>131)</b></a></sup> The current object that results at the end of the
+ designator list is the subobject to be initialized by the following initializer.
+<p><!--para 19 -->
+ The initialization shall occur in initializer list order, each initializer provided for a
+ particular subobject overriding any previously listed initializer for the same subobject;<sup><a href="#note132"><b>132)</b></a></sup>
+ all subobjects that are not initialized explicitly shall be initialized implicitly the same as
+ objects that have static storage duration.
+<p><!--para 20 -->
+ If the aggregate or union contains elements or members that are aggregates or unions,
+ these rules apply recursively to the subaggregates or contained unions. If the initializer of
+ a subaggregate or contained union begins with a left brace, the initializers enclosed by
+ that brace and its matching right brace initialize the elements or members of the
+ subaggregate or the contained union. Otherwise, only enough initializers from the list are
+ taken to account for the elements or members of the subaggregate or the first member of
+ the contained union; any remaining initializers are left to initialize the next element or
+ member of the aggregate of which the current subaggregate or contained union is a part.
+<p><!--para 21 -->
+ If there are fewer initializers in a brace-enclosed list than there are elements or members
+ of an aggregate, or fewer characters in a string literal used to initialize an array of known
+ size than there are elements in the array, the remainder of the aggregate shall be
+ initialized implicitly the same as objects that have static storage duration.
+<p><!--para 22 -->
+ If an array of unknown size is initialized, its size is determined by the largest indexed
+ element with an explicit initializer. At the end of its initializer list, the array no longer
+ has incomplete type.
+<!--page 140 -->
+<p><!--para 23 -->
+ The order in which any side effects occur among the initialization list expressions is
+ unspecified.<sup><a href="#note133"><b>133)</b></a></sup>
+<p><!--para 24 -->
+ EXAMPLE 1       Provided that <a href="#7.3">&lt;complex.h&gt;</a> has been #included, the declarations
+<pre>
+          int i = <a href="#3.5">3.5</a>;
+          double complex c = 5 + 3 * I;
+</pre>
+ define and initialize i with the value 3 and c with the value 5.0 + i3.0.
+<p><!--para 25 -->
+ EXAMPLE 2 The declaration
+<pre>
+          int x[] = { 1, 3, 5 };
+</pre>
+ defines and initializes x as a one-dimensional array object that has three elements, as no size was specified
+ and there are three initializers.
+<p><!--para 26 -->
+ EXAMPLE 3       The declaration
+<pre>
+          int y[4][3] =         {
+                { 1, 3,         5 },
+                { 2, 4,         6 },
+                { 3, 5,         7 },
+          };
+</pre>
+ is a definition with a fully bracketed initialization: 1, 3, and 5 initialize the first row of y (the array object
+ y[0]), namely y[0][0], y[0][1], and y[0][2]. Likewise the next two lines initialize y[1] and
+ y[2]. The initializer ends early, so y[3] is initialized with zeros. Precisely the same effect could have
+ been achieved by
+<pre>
+          int y[4][3] = {
+                1, 3, 5, 2, 4, 6, 3, 5, 7
+          };
+</pre>
+ The initializer for y[0] does not begin with a left brace, so three items from the list are used. Likewise the
+ next three are taken successively for y[1] and y[2].
+<p><!--para 27 -->
+ EXAMPLE 4       The declaration
+<pre>
+          int z[4][3] = {
+                { 1 }, { 2 }, { 3 }, { 4 }
+          };
+</pre>
+ initializes the first column of z as specified and initializes the rest with zeros.
+<p><!--para 28 -->
+ EXAMPLE 5       The declaration
+<pre>
+          struct { int a[3], b; } w[] = { { 1 }, 2 };
+</pre>
+ is a definition with an inconsistently bracketed initialization. It defines an array with two element
+ structures: w[0].a[0] is 1 and w[1].a[0] is 2; all the other elements are zero.
+<!--page 141 -->
+<p><!--para 29 -->
+ EXAMPLE 6         The declaration
+<pre>
+           short q[4][3][2] = {
+                 { 1 },
+                 { 2, 3 },
+                 { 4, 5, 6 }
+           };
+</pre>
+ contains an incompletely but consistently bracketed initialization. It defines a three-dimensional array
+ object: q[0][0][0] is 1, q[1][0][0] is 2, q[1][0][1] is 3, and 4, 5, and 6 initialize
+ q[2][0][0], q[2][0][1], and q[2][1][0], respectively; all the rest are zero. The initializer for
+ q[0][0] does not begin with a left brace, so up to six items from the current list may be used. There is
+ only one, so the values for the remaining five elements are initialized with zero. Likewise, the initializers
+ for q[1][0] and q[2][0] do not begin with a left brace, so each uses up to six items, initializing their
+ respective two-dimensional subaggregates. If there had been more than six items in any of the lists, a
+ diagnostic message would have been issued. The same initialization result could have been achieved by:
+<pre>
+           short q[4][3][2] = {
+                 1, 0, 0, 0, 0, 0,
+                 2, 3, 0, 0, 0, 0,
+                 4, 5, 6
+           };
+</pre>
+ or by:
+<pre>
+           short q[4][3][2] = {
+                 {
+                       { 1 },
+                 },
+                 {
+                       { 2, 3 },
+                 },
+                 {
+                       { 4, 5 },
+                       { 6 },
+                 }
+           };
+</pre>
+ in a fully bracketed form.
+<p><!--para 30 -->
+ Note that the fully bracketed and minimally bracketed forms of initialization are, in general, less likely to
+ cause confusion.
+<p><!--para 31 -->
+ EXAMPLE 7         One form of initialization that completes array types involves typedef names. Given the
+ declaration
+<pre>
+           typedef int A[];          // OK - declared with block scope
+</pre>
+ the declaration
+<pre>
+           A a = { 1, 2 }, b = { 3, 4, 5 };
+</pre>
+ is identical to
+<pre>
+           int a[] = { 1, 2 }, b[] = { 3, 4, 5 };
+</pre>
+ due to the rules for incomplete types.
+<!--page 142 -->
+<p><!--para 32 -->
+ EXAMPLE 8       The declaration
+<pre>
+          char s[] = "abc", t[3] = "abc";
+</pre>
+ defines ''plain'' char array objects s and t whose elements are initialized with character string literals.
+ This declaration is identical to
+<pre>
+          char s[] = { 'a', 'b', 'c', '\0' },
+               t[] = { 'a', 'b', 'c' };
+</pre>
+ The contents of the arrays are modifiable. On the other hand, the declaration
+<pre>
+          char *p = "abc";
+</pre>
+ defines p with type ''pointer to char'' and initializes it to point to an object with type ''array of char''
+ with length 4 whose elements are initialized with a character string literal. If an attempt is made to use p to
+ modify the contents of the array, the behavior is undefined.
+<p><!--para 33 -->
+ EXAMPLE 9       Arrays can be initialized to correspond to the elements of an enumeration by using
+ designators:
+<pre>
+          enum { member_one,           member_two };
+          const char *nm[] =           {
+                [member_two]           = "member two",
+                [member_one]           = "member one",
+          };
+</pre>
+<p><!--para 34 -->
+ EXAMPLE 10       Structure members can be initialized to nonzero values without depending on their order:
+<pre>
+          div_t answer = { .quot = 2, .rem = -1 };
+</pre>
+<p><!--para 35 -->
+ EXAMPLE 11 Designators can be used to provide explicit initialization when unadorned initializer lists
+ might be misunderstood:
+<pre>
+          struct { int a[3], b; } w[] =
+                { [0].a = {1}, [1].a[0] = 2 };
+</pre>
+<p><!--para 36 -->
+ EXAMPLE 12       Space can be ''allocated'' from both ends of an array by using a single designator:
+<pre>
+          int a[MAX] = {
+                1, 3, 5, 7, 9, [MAX-5] = 8, 6, 4, 2, 0
+          };
+</pre>
+<p><!--para 37 -->
+ In the above, if MAX is greater than ten, there will be some zero-valued elements in the middle; if it is less
+ than ten, some of the values provided by the first five initializers will be overridden by the second five.
+<p><!--para 38 -->
+ EXAMPLE 13       Any member of a union can be initialized:
+<pre>
+          union { /* ... */ } u = { .any_member = 42 };
+</pre>
+<p><b> Forward references</b>: common definitions <a href="#7.17">&lt;stddef.h&gt;</a> (<a href="#7.17">7.17</a>).
+<!--page 143 -->
+
+<p><b>Footnotes</b>
+<p><small><a name="note129" href="#note129">129)</a> If the initializer list for a subaggregate or contained union does not begin with a left brace, its
+ subobjects are initialized as usual, but the subaggregate or contained union does not become the
+ current object: current objects are associated only with brace-enclosed initializer lists.
+</small>
+<p><small><a name="note130" href="#note130">130)</a> After a union member is initialized, the next object is not the next member of the union; instead, it is
+ the next subobject of an object containing the union.
+</small>
+<p><small><a name="note131" href="#note131">131)</a> Thus, a designator can only specify a strict subobject of the aggregate or union that is associated with
+ the surrounding brace pair. Note, too, that each separate designator list is independent.
+</small>
+<p><small><a name="note132" href="#note132">132)</a> Any initializer for the subobject which is overridden and so not used to initialize that subobject might
+ not be evaluated at all.
+</small>
+<p><small><a name="note133" href="#note133">133)</a> In particular, the evaluation order need not be the same as the order of subobject initialization.
+</small>
+
+<h3><a name="6.8" href="#6.8">6.8 Statements and blocks</a></h3>
+<p><b>Syntax</b>
+<p><!--para 1 -->
+<pre>
+          statement:
+                 labeled-statement
+                 compound-statement
+                 expression-statement
+                 selection-statement
+                 iteration-statement
+                 jump-statement
+</pre>
+<p><b>Semantics</b>
+<p><!--para 2 -->
+ A statement specifies an action to be performed. Except as indicated, statements are
+ executed in sequence.
+<p><!--para 3 -->
+ A block allows a set of declarations and statements to be grouped into one syntactic unit.
+ The initializers of objects that have automatic storage duration, and the variable length
+ array declarators of ordinary identifiers with block scope, are evaluated and the values are
+ stored in the objects (including storing an indeterminate value in objects without an
+ initializer) each time the declaration is reached in the order of execution, as if it were a
+ statement, and within each declaration in the order that declarators appear.
+<p><!--para 4 -->
+ A full expression is an expression that is not part of another expression or of a declarator.
+ Each of the following is a full expression: an initializer; the expression in an expression
+ statement; the controlling expression of a selection statement (if or switch); the
+ controlling expression of a while or do statement; each of the (optional) expressions of
+ a for statement; the (optional) expression in a return statement. The end of a full
+ expression is a sequence point.
+<p><b> Forward references</b>: expression and null statements (<a href="#6.8.3">6.8.3</a>), selection statements
+ (<a href="#6.8.4">6.8.4</a>), iteration statements (<a href="#6.8.5">6.8.5</a>), the return statement (<a href="#6.8.6.4">6.8.6.4</a>).
+
+<h4><a name="6.8.1" href="#6.8.1">6.8.1 Labeled statements</a></h4>
+<p><b>Syntax</b>
+<p><!--para 1 -->
+<pre>
+          labeled-statement:
+                 identifier : statement
+                 case constant-expression : statement
+                 default : statement
+</pre>
+<p><b>Constraints</b>
+<p><!--para 2 -->
+ A case or default label shall appear only in a switch statement. Further
+ constraints on such labels are discussed under the switch statement.
+<!--page 144 -->
+<p><!--para 3 -->
+ Label names shall be unique within a function.
+<p><b>Semantics</b>
+<p><!--para 4 -->
+ Any statement may be preceded by a prefix that declares an identifier as a label name.
+ Labels in themselves do not alter the flow of control, which continues unimpeded across
+ them.
+<p><b> Forward references</b>: the goto statement (<a href="#6.8.6.1">6.8.6.1</a>), the switch statement (<a href="#6.8.4.2">6.8.4.2</a>).
+
+<h4><a name="6.8.2" href="#6.8.2">6.8.2 Compound statement</a></h4>
+<p><b>Syntax</b>
+<p><!--para 1 -->
+<pre>
+          compound-statement:
+                { block-item-list<sub>opt</sub> }
+          block-item-list:
+                  block-item
+                  block-item-list block-item
+          block-item:
+                  declaration
+                  statement
+</pre>
+<p><b>Semantics</b>
+<p><!--para 2 -->
+ A compound statement is a block.
+
+<h4><a name="6.8.3" href="#6.8.3">6.8.3 Expression and null statements</a></h4>
+<p><b>Syntax</b>
+<p><!--para 1 -->
+<pre>
+          expression-statement:
+                 expression<sub>opt</sub> ;
+</pre>
+<p><b>Semantics</b>
+<p><!--para 2 -->
+ The expression in an expression statement is evaluated as a void expression for its side
+ effects.<sup><a href="#note134"><b>134)</b></a></sup>
+<p><!--para 3 -->
+ A null statement (consisting of just a semicolon) performs no operations.
+<p><!--para 4 -->
+ EXAMPLE 1 If a function call is evaluated as an expression statement for its side effects only, the
+ discarding of its value may be made explicit by converting the expression to a void expression by means of
+ a cast:
+<pre>
+          int p(int);
+          /* ... */
+          (void)p(0);
+</pre>
+<!--page 145 -->
+<p><!--para 5 -->
+ EXAMPLE 2       In the program fragment
+<pre>
+          char *s;
+          /* ... */
+          while (*s++ != '\0')
+                  ;
+</pre>
+ a null statement is used to supply an empty loop body to the iteration statement.
+<p><!--para 6 -->
+ EXAMPLE 3       A null statement may also be used to carry a label just before the closing } of a compound
+ statement.
+<pre>
+          while (loop1) {
+                /* ... */
+                while (loop2) {
+                        /* ... */
+                        if (want_out)
+                                goto end_loop1;
+                        /* ... */
+                }
+                /* ... */
+          end_loop1: ;
+          }
+</pre>
+<p><b> Forward references</b>: iteration statements (<a href="#6.8.5">6.8.5</a>).
+
+<p><b>Footnotes</b>
+<p><small><a name="note134" href="#note134">134)</a> Such as assignments, and function calls which have side effects.
+</small>
+
+<h4><a name="6.8.4" href="#6.8.4">6.8.4 Selection statements</a></h4>
+<p><b>Syntax</b>
+<p><!--para 1 -->
+<pre>
+          selection-statement:
+                  if ( expression ) statement
+                  if ( expression ) statement else statement
+                  switch ( expression ) statement
+</pre>
+<p><b>Semantics</b>
+<p><!--para 2 -->
+ A selection statement selects among a set of statements depending on the value of a
+ controlling expression.
+<p><!--para 3 -->
+ A selection statement is a block whose scope is a strict subset of the scope of its
+ enclosing block. Each associated substatement is also a block whose scope is a strict
+ subset of the scope of the selection statement.
+
+<h5><a name="6.8.4.1" href="#6.8.4.1">6.8.4.1 The if statement</a></h5>
+<p><b>Constraints</b>
+<p><!--para 1 -->
+ The controlling expression of an if statement shall have scalar type.
+<p><b>Semantics</b>
+<p><!--para 2 -->
+ In both forms, the first substatement is executed if the expression compares unequal to 0.
+ In the else form, the second substatement is executed if the expression compares equal
+<!--page 146 -->
+ to 0. If the first substatement is reached via a label, the second substatement is not
+ executed.
+<p><!--para 3 -->
+ An else is associated with the lexically nearest preceding if that is allowed by the
+ syntax.
+
+<h5><a name="6.8.4.2" href="#6.8.4.2">6.8.4.2 The switch statement</a></h5>
+<p><b>Constraints</b>
+<p><!--para 1 -->
+ The controlling expression of a switch statement shall have integer type.
+<p><!--para 2 -->
+ If a switch statement has an associated case or default label within the scope of an
+ identifier with a variably modified type, the entire switch statement shall be within the
+ scope of that identifier.<sup><a href="#note135"><b>135)</b></a></sup>
+<p><!--para 3 -->
+ The expression of each case label shall be an integer constant expression and no two of
+ the case constant expressions in the same switch statement shall have the same value
+ after conversion. There may be at most one default label in a switch statement.
+ (Any enclosed switch statement may have a default label or case constant
+ expressions with values that duplicate case constant expressions in the enclosing
+ switch statement.)
+<p><b>Semantics</b>
+<p><!--para 4 -->
+ A switch statement causes control to jump to, into, or past the statement that is the
+ switch body, depending on the value of a controlling expression, and on the presence of a
+ default label and the values of any case labels on or in the switch body. A case or
+ default label is accessible only within the closest enclosing switch statement.
+<p><!--para 5 -->
+ The integer promotions are performed on the controlling expression. The constant
+ expression in each case label is converted to the promoted type of the controlling
+ expression. If a converted value matches that of the promoted controlling expression,
+ control jumps to the statement following the matched case label. Otherwise, if there is
+ a default label, control jumps to the labeled statement. If no converted case constant
+ expression matches and there is no default label, no part of the switch body is
+ executed.
+<p><b>Implementation limits</b>
+<p><!--para 6 -->
+ As discussed in <a href="#5.2.4.1">5.2.4.1</a>, the implementation may limit the number of case values in a
+ switch statement.
+<!--page 147 -->
+<p><!--para 7 -->
+ EXAMPLE        In the artificial program fragment
+<pre>
+          switch (expr)
+          {
+                int i = 4;
+                f(i);
+          case 0:
+                i = 17;
+                /* falls through into default code */
+          default:
+                printf("%d\n", i);
+          }
+</pre>
+ the object whose identifier is i exists with automatic storage duration (within the block) but is never
+ initialized, and thus if the controlling expression has a nonzero value, the call to the printf function will
+ access an indeterminate value. Similarly, the call to the function f cannot be reached.
+
+<p><b>Footnotes</b>
+<p><small><a name="note135" href="#note135">135)</a> That is, the declaration either precedes the switch statement, or it follows the last case or
+ default label associated with the switch that is in the block containing the declaration.
+</small>
+
+<h4><a name="6.8.5" href="#6.8.5">6.8.5 Iteration statements</a></h4>
+<p><b>Syntax</b>
+<p><!--para 1 -->
+<pre>
+          iteration-statement:
+                  while ( expression ) statement
+                  do statement while ( expression ) ;
+                  for ( expression<sub>opt</sub> ; expression<sub>opt</sub> ; expression<sub>opt</sub> ) statement
+                  for ( declaration expression<sub>opt</sub> ; expression<sub>opt</sub> ) statement
+</pre>
+<p><b>Constraints</b>
+<p><!--para 2 -->
+ The controlling expression of an iteration statement shall have scalar type.
+<p><!--para 3 -->
+ The declaration part of a for statement shall only declare identifiers for objects having
+ storage class auto or register.
+<p><b>Semantics</b>
+<p><!--para 4 -->
+ An iteration statement causes a statement called the loop body to be executed repeatedly
+ until the controlling expression compares equal to 0. The repetition occurs regardless of
+ whether the loop body is entered from the iteration statement or by a jump.<sup><a href="#note136"><b>136)</b></a></sup>
+<p><!--para 5 -->
+ An iteration statement is a block whose scope is a strict subset of the scope of its
+ enclosing block. The loop body is also a block whose scope is a strict subset of the scope
+ of the iteration statement.
+<!--page 148 -->
+
+<p><b>Footnotes</b>
+<p><small><a name="note136" href="#note136">136)</a> Code jumped over is not executed. In particular, the controlling expression of a for or while
+ statement is not evaluated before entering the loop body, nor is clause-1 of a for statement.
+</small>
+
+<h5><a name="6.8.5.1" href="#6.8.5.1">6.8.5.1 The while statement</a></h5>
+<p><!--para 1 -->
+ The evaluation of the controlling expression takes place before each execution of the loop
+ body.
+
+<h5><a name="6.8.5.2" href="#6.8.5.2">6.8.5.2 The do statement</a></h5>
+<p><!--para 1 -->
+ The evaluation of the controlling expression takes place after each execution of the loop
+ body.
+
+<h5><a name="6.8.5.3" href="#6.8.5.3">6.8.5.3 The for statement</a></h5>
+<p><!--para 1 -->
+ The statement
+<pre>
+          for ( clause-1 ; expression-2 ; expression-3 ) statement
+</pre>
+ behaves as follows: The expression expression-2 is the controlling expression that is
+ evaluated before each execution of the loop body. The expression expression-3 is
+ evaluated as a void expression after each execution of the loop body. If clause-1 is a
+ declaration, the scope of any identifiers it declares is the remainder of the declaration and
+ the entire loop, including the other two expressions; it is reached in the order of execution
+ before the first evaluation of the controlling expression. If clause-1 is an expression, it is
+ evaluated as a void expression before the first evaluation of the controlling expression.<sup><a href="#note137"><b>137)</b></a></sup>
+<p><!--para 2 -->
+ Both clause-1 and expression-3 can be omitted. An omitted expression-2 is replaced by a
+ nonzero constant.
+
+<p><b>Footnotes</b>
+<p><small><a name="note137" href="#note137">137)</a> Thus, clause-1 specifies initialization for the loop, possibly declaring one or more variables for use in
+ the loop; the controlling expression, expression-2, specifies an evaluation made before each iteration,
+ such that execution of the loop continues until the expression compares equal to 0; and expression-3
+ specifies an operation (such as incrementing) that is performed after each iteration.
+</small>
+
+<h4><a name="6.8.6" href="#6.8.6">6.8.6 Jump statements</a></h4>
+<p><b>Syntax</b>
+<p><!--para 1 -->
+<pre>
+          jump-statement:
+                 goto identifier ;
+                 continue ;
+                 break ;
+                 return expression<sub>opt</sub> ;
+</pre>
+<p><b>Semantics</b>
+<p><!--para 2 -->
+ A jump statement causes an unconditional jump to another place.
+<!--page 149 -->
+
+<h5><a name="6.8.6.1" href="#6.8.6.1">6.8.6.1 The goto statement</a></h5>
+<p><b>Constraints</b>
+<p><!--para 1 -->
+ The identifier in a goto statement shall name a label located somewhere in the enclosing
+ function. A goto statement shall not jump from outside the scope of an identifier having
+ a variably modified type to inside the scope of that identifier.
+<p><b>Semantics</b>
+<p><!--para 2 -->
+ A goto statement causes an unconditional jump to the statement prefixed by the named
+ label in the enclosing function.
+<p><!--para 3 -->
+ EXAMPLE 1 It is sometimes convenient to jump into the middle of a complicated set of statements. The
+ following outline presents one possible approach to a problem based on these three assumptions:
+<ol>
+<li>  The general initialization code accesses objects only visible to the current function.
+<li>  The general initialization code is too large to warrant duplication.
+<li>  The code to determine the next operation is at the head of the loop. (To allow it to be reached by
+ continue statements, for example.)
+<pre>
+  /* ... */
+  goto first_time;
+  for (;;) {
+          // determine next operation
+          /* ... */
+          if (need to reinitialize) {
+                  // reinitialize-only code
+                  /* ... */
+          first_time:
+                  // general initialization code
+                  /* ... */
+                  continue;
+          }
+          // handle other operations
+          /* ... */
+  }
+</pre>
+<!--page 150 -->
+</ol>
+<p><!--para 4 -->
+ EXAMPLE 2 A goto statement is not allowed to jump past any declarations of objects with variably
+ modified types. A jump within the scope, however, is permitted.
+<pre>
+         goto lab3;                         // invalid: going INTO scope of VLA.
+         {
+               double a[n];
+               a[j] = <a href="#4.4">4.4</a>;
+         lab3:
+               a[j] = <a href="#3.3">3.3</a>;
+               goto lab4;                   // valid: going WITHIN scope of VLA.
+               a[j] = <a href="#5.5">5.5</a>;
+         lab4:
+               a[j] = <a href="#6.6">6.6</a>;
+         }
+         goto lab4;                         // invalid: going INTO scope of VLA.
+</pre>
+
+<h5><a name="6.8.6.2" href="#6.8.6.2">6.8.6.2 The continue statement</a></h5>
+<p><b>Constraints</b>
+<p><!--para 1 -->
+ A continue statement shall appear only in or as a loop body.
+<p><b>Semantics</b>
+<p><!--para 2 -->
+ A continue statement causes a jump to the loop-continuation portion of the smallest
+ enclosing iteration statement; that is, to the end of the loop body. More precisely, in each
+ of the statements
+<pre>
+ while (/* ... */) {                  do {                                 for (/* ... */) {
+    /* ... */                            /* ... */                            /* ... */
+    continue;                            continue;                            continue;
+    /* ... */                            /* ... */                            /* ... */
+ contin: ;                            contin: ;                            contin: ;
+ }                                    } while (/* ... */);                 }
+</pre>
+ unless the continue statement shown is in an enclosed iteration statement (in which
+ case it is interpreted within that statement), it is equivalent to goto contin;.<sup><a href="#note138"><b>138)</b></a></sup>
+
+<p><b>Footnotes</b>
+<p><small><a name="note138" href="#note138">138)</a> Following the contin: label is a null statement.
+</small>
+
+<h5><a name="6.8.6.3" href="#6.8.6.3">6.8.6.3 The break statement</a></h5>
+<p><b>Constraints</b>
+<p><!--para 1 -->
+ A break statement shall appear only in or as a switch body or loop body.
+<p><b>Semantics</b>
+<p><!--para 2 -->
+ A break statement terminates execution of the smallest enclosing switch or iteration
+ statement.
+<!--page 151 -->
+
+<h5><a name="6.8.6.4" href="#6.8.6.4">6.8.6.4 The return statement</a></h5>
+<p><b>Constraints</b>
+<p><!--para 1 -->
+ A return statement with an expression shall not appear in a function whose return type
+ is void. A return statement without an expression shall only appear in a function
+ whose return type is void.
+<p><b>Semantics</b>
+<p><!--para 2 -->
+ A return statement terminates execution of the current function and returns control to
+ its caller. A function may have any number of return statements.
+<p><!--para 3 -->
+ If a return statement with an expression is executed, the value of the expression is
+ returned to the caller as the value of the function call expression. If the expression has a
+ type different from the return type of the function in which it appears, the value is
+ converted as if by assignment to an object having the return type of the function.<sup><a href="#note139"><b>139)</b></a></sup>
+<p><!--para 4 -->
+ EXAMPLE       In:
+<pre>
+         struct s { double i; } f(void);
+         union {
+               struct {
+                     int f1;
+                     struct s f2;
+               } u1;
+               struct {
+                     struct s f3;
+                     int f4;
+               } u2;
+         } g;
+         struct s f(void)
+         {
+               return g.u1.f2;
+         }
+         /* ... */
+         g.u2.f3 = f();
+</pre>
+ there is no undefined behavior, although there would be if the assignment were done directly (without using
+ a function call to fetch the value).
+<!--page 152 -->
+
+<p><b>Footnotes</b>
+<p><small><a name="note139" href="#note139">139)</a> The return statement is not an assignment. The overlap restriction of subclause <a href="#6.5.16.1">6.5.16.1</a> does not
+ apply to the case of function return. The representation of floating-point values may have wider range
+ or precision and is determined by FLT_EVAL_METHOD. A cast may be used to remove this extra
+ range and precision.
+</small>
+
+<h3><a name="6.9" href="#6.9">6.9 External definitions</a></h3>
+<p><b>Syntax</b>
+<p><!--para 1 -->
+<pre>
+          translation-unit:
+                  external-declaration
+                  translation-unit external-declaration
+          external-declaration:
+                 function-definition
+                 declaration
+</pre>
+<p><b>Constraints</b>
+<p><!--para 2 -->
+ The storage-class specifiers auto and register shall not appear in the declaration
+ specifiers in an external declaration.
+<p><!--para 3 -->
+ There shall be no more than one external definition for each identifier declared with
+ internal linkage in a translation unit. Moreover, if an identifier declared with internal
+ linkage is used in an expression (other than as a part of the operand of a sizeof
+ operator whose result is an integer constant), there shall be exactly one external definition
+ for the identifier in the translation unit.
+<p><b>Semantics</b>
+<p><!--para 4 -->
+ As discussed in <a href="#5.1.1.1">5.1.1.1</a>, the unit of program text after preprocessing is a translation unit,
+ which consists of a sequence of external declarations. These are described as ''external''
+ because they appear outside any function (and hence have file scope). As discussed in
+ <a href="#6.7">6.7</a>, a declaration that also causes storage to be reserved for an object or a function named
+ by the identifier is a definition.
+<p><!--para 5 -->
+ An external definition is an external declaration that is also a definition of a function
+ (other than an inline definition) or an object. If an identifier declared with external
+ linkage is used in an expression (other than as part of the operand of a sizeof operator
+ whose result is an integer constant), somewhere in the entire program there shall be
+ exactly one external definition for the identifier; otherwise, there shall be no more than
+ one.<sup><a href="#note140"><b>140)</b></a></sup>
+<!--page 153 -->
+
+<p><b>Footnotes</b>
+<p><small><a name="note140" href="#note140">140)</a> Thus, if an identifier declared with external linkage is not used in an expression, there need be no
+ external definition for it.
+</small>
+
+<h4><a name="6.9.1" href="#6.9.1">6.9.1 Function definitions</a></h4>
+<p><b>Syntax</b>
+<p><!--para 1 -->
+<pre>
+          function-definition:
+                 declaration-specifiers declarator declaration-list<sub>opt</sub> compound-statement
+          declaration-list:
+                 declaration
+                 declaration-list declaration
+</pre>
+<p><b>Constraints</b>
+<p><!--para 2 -->
+ The identifier declared in a function definition (which is the name of the function) shall
+ have a function type, as specified by the declarator portion of the function definition.<sup><a href="#note141"><b>141)</b></a></sup>
+<p><!--para 3 -->
+ The return type of a function shall be void or an object type other than array type.
+<p><!--para 4 -->
+ The storage-class specifier, if any, in the declaration specifiers shall be either extern or
+ static.
+<p><!--para 5 -->
+ If the declarator includes a parameter type list, the declaration of each parameter shall
+ include an identifier, except for the special case of a parameter list consisting of a single
+ parameter of type void, in which case there shall not be an identifier. No declaration list
+ shall follow.
+<p><!--para 6 -->
+ If the declarator includes an identifier list, each declaration in the declaration list shall
+ have at least one declarator, those declarators shall declare only identifiers from the
+ identifier list, and every identifier in the identifier list shall be declared. An identifier
+ declared as a typedef name shall not be redeclared as a parameter. The declarations in the
+ declaration list shall contain no storage-class specifier other than register and no
+ initializations.
+<!--page 154 -->
+<p><b>Semantics</b>
+<p><!--para 7 -->
+ The declarator in a function definition specifies the name of the function being defined
+ and the identifiers of its parameters. If the declarator includes a parameter type list, the
+ list also specifies the types of all the parameters; such a declarator also serves as a
+ function prototype for later calls to the same function in the same translation unit. If the
+ declarator includes an identifier list,<sup><a href="#note142"><b>142)</b></a></sup> the types of the parameters shall be declared in a
+ following declaration list. In either case, the type of each parameter is adjusted as
+ described in <a href="#6.7.5.3">6.7.5.3</a> for a parameter type list; the resulting type shall be an object type.
+<p><!--para 8 -->
+ If a function that accepts a variable number of arguments is defined without a parameter
+ type list that ends with the ellipsis notation, the behavior is undefined.
+<p><!--para 9 -->
+ Each parameter has automatic storage duration. Its identifier is an lvalue, which is in
+ effect declared at the head of the compound statement that constitutes the function body
+ (and therefore cannot be redeclared in the function body except in an enclosed block).
+ The layout of the storage for parameters is unspecified.
+<p><!--para 10 -->
+ On entry to the function, the size expressions of each variably modified parameter are
+ evaluated and the value of each argument expression is converted to the type of the
+ corresponding parameter as if by assignment. (Array expressions and function
+ designators as arguments were converted to pointers before the call.)
+<p><!--para 11 -->
+ After all parameters have been assigned, the compound statement that constitutes the
+ body of the function definition is executed.
+<p><!--para 12 -->
+ If the } that terminates a function is reached, and the value of the function call is used by
+ the caller, the behavior is undefined.
+<p><!--para 13 -->
+ EXAMPLE 1       In the following:
+<pre>
+          extern int max(int a, int b)
+          {
+                return a &gt; b ? a : b;
+          }
+</pre>
+ extern is the storage-class specifier and int is the type specifier; max(int a, int b) is the
+ function declarator; and
+<pre>
+          { return a &gt; b ? a : b; }
+</pre>
+ is the function body. The following similar definition uses the identifier-list form for the parameter
+ declarations:
+<!--page 155 -->
+<pre>
+          extern int max(a, b)
+          int a, b;
+          {
+                return a &gt; b ? a : b;
+          }
+</pre>
+ Here int a, b; is the declaration list for the parameters. The difference between these two definitions is
+ that the first form acts as a prototype declaration that forces conversion of the arguments of subsequent calls
+ to the function, whereas the second form does not.
+<p><!--para 14 -->
+ EXAMPLE 2           To pass one function to another, one might say
+<pre>
+                      int f(void);
+                      /* ... */
+                      g(f);
+</pre>
+ Then the definition of g might read
+<pre>
+          void g(int (*funcp)(void))
+          {
+                /* ... */
+                (*funcp)(); /* or funcp(); ...                    */
+          }
+</pre>
+ or, equivalently,
+<pre>
+          void g(int func(void))
+          {
+                /* ... */
+                func(); /* or (*func)(); ...                   */
+          }
+</pre>
+
+<p><b>Footnotes</b>
+<p><small><a name="note141" href="#note141">141)</a> The intent is that the type category in a function definition cannot be inherited from a typedef:
+
+<pre>
+          typedef int F(void);                          //   type F is ''function with no parameters
+                                                        //                  returning int''
+          F f, g;                                       //   f and g both have type compatible with F
+          F f { /* ... */ }                             //   WRONG: syntax/constraint error
+          F g() { /* ... */ }                           //   WRONG: declares that g returns a function
+          int f(void) { /* ... */ }                     //   RIGHT: f has type compatible with F
+          int g() { /* ... */ }                         //   RIGHT: g has type compatible with F
+          F *e(void) { /* ... */ }                      //   e returns a pointer to a function
+          F *((e))(void) { /* ... */ }                  //   same: parentheses irrelevant
+          int (*fp)(void);                              //   fp points to a function that has type F
+          F *Fp;                                        //   Fp points to a function that has type F
+</pre>
+</small>
+<p><small><a name="note142" href="#note142">142)</a> See ''future language directions'' (<a href="#6.11.7">6.11.7</a>).
+</small>
+
+<h4><a name="6.9.2" href="#6.9.2">6.9.2 External object definitions</a></h4>
+<p><b>Semantics</b>
+<p><!--para 1 -->
+ If the declaration of an identifier for an object has file scope and an initializer, the
+ declaration is an external definition for the identifier.
+<p><!--para 2 -->
+ A declaration of an identifier for an object that has file scope without an initializer, and
+ without a storage-class specifier or with the storage-class specifier static, constitutes a
+ tentative definition. If a translation unit contains one or more tentative definitions for an
+ identifier, and the translation unit contains no external definition for that identifier, then
+ the behavior is exactly as if the translation unit contains a file scope declaration of that
+ identifier, with the composite type as of the end of the translation unit, with an initializer
+ equal to 0.
+<p><!--para 3 -->
+ If the declaration of an identifier for an object is a tentative definition and has internal
+ linkage, the declared type shall not be an incomplete type.
+<!--page 156 -->
+<p><!--para 4 -->
+ EXAMPLE 1
+<pre>
+          int i1 = 1;                    // definition, external linkage
+          static int i2 = 2;             // definition, internal linkage
+          extern int i3 = 3;             // definition, external linkage
+          int i4;                        // tentative definition, external linkage
+          static int i5;                 // tentative definition, internal linkage
+          int   i1;                      // valid tentative definition, refers to previous
+          int   i2;                      // <a href="#6.2.2">6.2.2</a> renders undefined, linkage disagreement
+          int   i3;                      // valid tentative definition, refers to previous
+          int   i4;                      // valid tentative definition, refers to previous
+          int   i5;                      // <a href="#6.2.2">6.2.2</a> renders undefined, linkage disagreement
+          extern    int   i1;            // refers to previous, whose linkage is external
+          extern    int   i2;            // refers to previous, whose linkage is internal
+          extern    int   i3;            // refers to previous, whose linkage is external
+          extern    int   i4;            // refers to previous, whose linkage is external
+          extern    int   i5;            // refers to previous, whose linkage is internal
+</pre>
+<p><!--para 5 -->
+ EXAMPLE 2       If at the end of the translation unit containing
+<pre>
+          int i[];
+</pre>
+ the array i still has incomplete type, the implicit initializer causes it to have one element, which is set to
+ zero on program startup.
+<!--page 157 -->
+
+<h3><a name="6.10" href="#6.10">6.10 Preprocessing directives</a></h3>
+<p><b>Syntax</b>
+<p><!--para 1 -->
+<!--page 158 -->
+<pre>
+          preprocessing-file:
+                 group<sub>opt</sub>
+          group:
+                   group-part
+                   group group-part
+          group-part:
+                 if-section
+                 control-line
+                 text-line
+                 # non-directive
+          if-section:
+                   if-group elif-groups<sub>opt</sub> else-group<sub>opt</sub> endif-line
+          if-group:
+                  # if     constant-expression new-line group<sub>opt</sub>
+                  # ifdef identifier new-line group<sub>opt</sub>
+                  # ifndef identifier new-line group<sub>opt</sub>
+          elif-groups:
+                  elif-group
+                  elif-groups elif-group
+          elif-group:
+                  # elif       constant-expression new-line group<sub>opt</sub>
+          else-group:
+                  # else       new-line group<sub>opt</sub>
+          endif-line:
+                  # endif      new-line
+          control-line:
+                 # include pp-tokens new-line
+                 # define identifier replacement-list new-line
+                 # define identifier lparen identifier-list<sub>opt</sub> )
+                                                 replacement-list new-line
+                 # define identifier lparen ... ) replacement-list new-line
+                 # define identifier lparen identifier-list , ... )
+                                                 replacement-list new-line
+                 # undef   identifier new-line
+                 # line    pp-tokens new-line
+                 # error   pp-tokens<sub>opt</sub> new-line
+                 # pragma pp-tokens<sub>opt</sub> new-line
+                 #         new-line
+          text-line:
+                  pp-tokens<sub>opt</sub> new-line
+          non-directive:
+                 pp-tokens new-line
+          lparen:
+                    a ( character not immediately preceded by white-space
+          replacement-list:
+                 pp-tokens<sub>opt</sub>
+          pp-tokens:
+                 preprocessing-token
+                 pp-tokens preprocessing-token
+          new-line:
+                 the new-line character
+</pre>
+<p><b>Description</b>
+<p><!--para 2 -->
+ A preprocessing directive consists of a sequence of preprocessing tokens that satisfies the
+ following constraints: The first token in the sequence is a # preprocessing token that (at
+ the start of translation phase 4) is either the first character in the source file (optionally
+ after white space containing no new-line characters) or that follows white space
+ containing at least one new-line character. The last token in the sequence is the first new-
+ line character that follows the first token in the sequence.<sup><a href="#note143"><b>143)</b></a></sup> A new-line character ends
+ the preprocessing directive even if it occurs within what would otherwise be an
+<!--page 159 -->
+ invocation of a function-like macro.
+<p><!--para 3 -->
+ A text line shall not begin with a # preprocessing token. A non-directive shall not begin
+ with any of the directive names appearing in the syntax.
+<p><!--para 4 -->
+ When in a group that is skipped (<a href="#6.10.1">6.10.1</a>), the directive syntax is relaxed to allow any
+ sequence of preprocessing tokens to occur between the directive name and the following
+ new-line character.
+<p><b>Constraints</b>
+<p><!--para 5 -->
+ The only white-space characters that shall appear between preprocessing tokens within a
+ preprocessing directive (from just after the introducing # preprocessing token through
+ just before the terminating new-line character) are space and horizontal-tab (including
+ spaces that have replaced comments or possibly other white-space characters in
+ translation phase 3).
+<p><b>Semantics</b>
+<p><!--para 6 -->
+ The implementation can process and skip sections of source files conditionally, include
+ other source files, and replace macros. These capabilities are called preprocessing,
+ because conceptually they occur before translation of the resulting translation unit.
+<p><!--para 7 -->
+ The preprocessing tokens within a preprocessing directive are not subject to macro
+ expansion unless otherwise stated.
+<p><!--para 8 -->
+ EXAMPLE        In:
+<pre>
+          #define EMPTY
+          EMPTY # include &lt;file.h&gt;
+</pre>
+ the sequence of preprocessing tokens on the second line is not a preprocessing directive, because it does not
+ begin with a # at the start of translation phase 4, even though it will do so after the macro EMPTY has been
+ replaced.
+
+<p><b>Footnotes</b>
+<p><small><a name="note143" href="#note143">143)</a> Thus, preprocessing directives are commonly called ''lines''. These ''lines'' have no other syntactic
+ significance, as all white space is equivalent except in certain situations during preprocessing (see the
+ # character string literal creation operator in <a href="#6.10.3.2">6.10.3.2</a>, for example).
+</small>
+
+<h4><a name="6.10.1" href="#6.10.1">6.10.1 Conditional inclusion</a></h4>
+<p><b>Constraints</b>
+<p><!--para 1 -->
+ The expression that controls conditional inclusion shall be an integer constant expression
+ except that: it shall not contain a cast; identifiers (including those lexically identical to
+ keywords) are interpreted as described below;<sup><a href="#note144"><b>144)</b></a></sup> and it may contain unary operator
+ expressions of the form
+<!--page 160 -->
+<pre>
+      defined identifier
+</pre>
+ or
+<pre>
+      defined ( identifier )
+</pre>
+ which evaluate to 1 if the identifier is currently defined as a macro name (that is, if it is
+ predefined or if it has been the subject of a #define preprocessing directive without an
+ intervening #undef directive with the same subject identifier), 0 if it is not.
+<p><!--para 2 -->
+ Each preprocessing token that remains (in the list of preprocessing tokens that will
+ become the controlling expression) after all macro replacements have occurred shall be in
+ the lexical form of a token (<a href="#6.4">6.4</a>).
+<p><b>Semantics</b>
+<p><!--para 3 -->
+ Preprocessing directives of the forms
+<pre>
+      # if   constant-expression new-line group<sub>opt</sub>
+      # elif constant-expression new-line group<sub>opt</sub>
+</pre>
+ check whether the controlling constant expression evaluates to nonzero.
+<p><!--para 4 -->
+ Prior to evaluation, macro invocations in the list of preprocessing tokens that will become
+ the controlling constant expression are replaced (except for those macro names modified
+ by the defined unary operator), just as in normal text. If the token defined is
+ generated as a result of this replacement process or use of the defined unary operator
+ does not match one of the two specified forms prior to macro replacement, the behavior is
+ undefined. After all replacements due to macro expansion and the defined unary
+ operator have been performed, all remaining identifiers (including those lexically
+ identical to keywords) are replaced with the pp-number 0, and then each preprocessing
+ token is converted into a token. The resulting tokens compose the controlling constant
+ expression which is evaluated according to the rules of <a href="#6.6">6.6</a>. For the purposes of this
+ token conversion and evaluation, all signed integer types and all unsigned integer types
+ act as if they have the same representation as, respectively, the types intmax_t and
+ uintmax_t defined in the header <a href="#7.18">&lt;stdint.h&gt;</a>.<sup><a href="#note145"><b>145)</b></a></sup> This includes interpreting
+ character constants, which may involve converting escape sequences into execution
+ character set members. Whether the numeric value for these character constants matches
+ the value obtained when an identical character constant occurs in an expression (other
+ than within a #if or #elif directive) is implementation-defined.<sup><a href="#note146"><b>146)</b></a></sup> Also, whether a
+ single-character character constant may have a negative value is implementation-defined.
+<p><!--para 5 -->
+ Preprocessing directives of the forms
+<!--page 161 -->
+<pre>
+    # ifdef identifier new-line group<sub>opt</sub>
+    # ifndef identifier new-line group<sub>opt</sub>
+</pre>
+ check whether the identifier is or is not currently defined as a macro name. Their
+ conditions are equivalent to #if defined identifier and #if !defined identifier
+ respectively.
+<p><!--para 6 -->
+ Each directive's condition is checked in order. If it evaluates to false (zero), the group
+ that it controls is skipped: directives are processed only through the name that determines
+ the directive in order to keep track of the level of nested conditionals; the rest of the
+ directives' preprocessing tokens are ignored, as are the other preprocessing tokens in the
+ group. Only the first group whose control condition evaluates to true (nonzero) is
+ processed. If none of the conditions evaluates to true, and there is a #else directive, the
+ group controlled by the #else is processed; lacking a #else directive, all the groups
+ until the #endif are skipped.<sup><a href="#note147"><b>147)</b></a></sup>
+<p><b> Forward references</b>: macro replacement (<a href="#6.10.3">6.10.3</a>), source file inclusion (<a href="#6.10.2">6.10.2</a>), largest
+ integer types (<a href="#7.18.1.5">7.18.1.5</a>).
+
+<p><b>Footnotes</b>
+<p><small><a name="note144" href="#note144">144)</a> Because the controlling constant expression is evaluated during translation phase 4, all identifiers
+ either are or are not macro names -- there simply are no keywords, enumeration constants, etc.
+</small>
+<p><small><a name="note145" href="#note145">145)</a> Thus, on an implementation where INT_MAX is 0x7FFF and UINT_MAX is 0xFFFF, the constant
+ 0x8000 is signed and positive within a #if expression even though it would be unsigned in
+ translation phase 7.
+</small>
+<p><small><a name="note146" href="#note146">146)</a> Thus, the constant expression in the following #if directive and if statement is not guaranteed to
+ evaluate to the same value in these two contexts.
+<pre>
+   #if 'z' - 'a' == 25
+   if ('z' - 'a' == 25)
+</pre>
+</small>
+<p><small><a name="note147" href="#note147">147)</a> As indicated by the syntax, a preprocessing token shall not follow a #else or #endif directive
+ before the terminating new-line character. However, comments may appear anywhere in a source file,
+ including within a preprocessing directive.
+</small>
+
+<h4><a name="6.10.2" href="#6.10.2">6.10.2 Source file inclusion</a></h4>
+<p><b>Constraints</b>
+<p><!--para 1 -->
+ A #include directive shall identify a header or source file that can be processed by the
+ implementation.
+<p><b>Semantics</b>
+<p><!--para 2 -->
+ A preprocessing directive of the form
+<pre>
+    # include &lt;h-char-sequence&gt; new-line
+</pre>
+ searches a sequence of implementation-defined places for a header identified uniquely by
+ the specified sequence between the &lt; and &gt; delimiters, and causes the replacement of that
+ directive by the entire contents of the header. How the places are specified or the header
+ identified is implementation-defined.
+<p><!--para 3 -->
+ A preprocessing directive of the form
+<!--page 162 -->
+<pre>
+    # include "q-char-sequence" new-line
+</pre>
+ causes the replacement of that directive by the entire contents of the source file identified
+ by the specified sequence between the " delimiters. The named source file is searched
+ for in an implementation-defined manner. If this search is not supported, or if the search
+ fails, the directive is reprocessed as if it read
+<pre>
+    # include &lt;h-char-sequence&gt; new-line
+</pre>
+ with the identical contained sequence (including &gt; characters, if any) from the original
+ directive.
+<p><!--para 4 -->
+ A preprocessing directive of the form
+<pre>
+    # include pp-tokens new-line
+</pre>
+ (that does not match one of the two previous forms) is permitted. The preprocessing
+ tokens after include in the directive are processed just as in normal text. (Each
+ identifier currently defined as a macro name is replaced by its replacement list of
+ preprocessing tokens.) The directive resulting after all replacements shall match one of
+ the two previous forms.<sup><a href="#note148"><b>148)</b></a></sup> The method by which a sequence of preprocessing tokens
+ between a &lt; and a &gt; preprocessing token pair or a pair of " characters is combined into a
+ single header name preprocessing token is implementation-defined.
+<p><!--para 5 -->
+ The implementation shall provide unique mappings for sequences consisting of one or
+ more nondigits or digits (<a href="#6.4.2.1">6.4.2.1</a>) followed by a period (.) and a single nondigit. The
+ first character shall not be a digit. The implementation may ignore distinctions of
+ alphabetical case and restrict the mapping to eight significant characters before the
+ period.
+<p><!--para 6 -->
+ A #include preprocessing directive may appear in a source file that has been read
+ because of a #include directive in another file, up to an implementation-defined
+ nesting limit (see <a href="#5.2.4.1">5.2.4.1</a>).
+<p><!--para 7 -->
+ EXAMPLE 1       The most common uses of #include preprocessing directives are as in the following:
+<pre>
+          #include <a href="#7.19">&lt;stdio.h&gt;</a>
+          #include "myprog.h"
+</pre>
+<p><!--para 8 -->
+ EXAMPLE 2       This illustrates macro-replaced #include directives:
+<!--page 163 -->
+<pre>
+        #if VERSION == 1
+              #define INCFILE        "vers1.h"
+        #elif VERSION == 2
+              #define INCFILE        "vers2.h"      // and so on
+        #else
+              #define INCFILE        "versN.h"
+        #endif
+        #include INCFILE
+</pre>
+<p><b> Forward references</b>: macro replacement (<a href="#6.10.3">6.10.3</a>).
+
+<p><b>Footnotes</b>
+<p><small><a name="note148" href="#note148">148)</a> Note that adjacent string literals are not concatenated into a single string literal (see the translation
+ phases in <a href="#5.1.1.2">5.1.1.2</a>); thus, an expansion that results in two string literals is an invalid directive.
+</small>
+
+<h4><a name="6.10.3" href="#6.10.3">6.10.3 Macro replacement</a></h4>
+<p><b>Constraints</b>
+<p><!--para 1 -->
+ Two replacement lists are identical if and only if the preprocessing tokens in both have
+ the same number, ordering, spelling, and white-space separation, where all white-space
+ separations are considered identical.
+<p><!--para 2 -->
+ An identifier currently defined as an object-like macro shall not be redefined by another
+ #define preprocessing directive unless the second definition is an object-like macro
+ definition and the two replacement lists are identical. Likewise, an identifier currently
+ defined as a function-like macro shall not be redefined by another #define
+ preprocessing directive unless the second definition is a function-like macro definition
+ that has the same number and spelling of parameters, and the two replacement lists are
+ identical.
+<p><!--para 3 -->
+ There shall be white-space between the identifier and the replacement list in the definition
+ of an object-like macro.
+<p><!--para 4 -->
+ If the identifier-list in the macro definition does not end with an ellipsis, the number of
+ arguments (including those arguments consisting of no preprocessing tokens) in an
+ invocation of a function-like macro shall equal the number of parameters in the macro
+ definition. Otherwise, there shall be more arguments in the invocation than there are
+ parameters in the macro definition (excluding the ...). There shall exist a )
+ preprocessing token that terminates the invocation.
+<p><!--para 5 -->
+ The identifier __VA_ARGS__ shall occur only in the replacement-list of a function-like
+ macro that uses the ellipsis notation in the parameters.
+<p><!--para 6 -->
+ A parameter identifier in a function-like macro shall be uniquely declared within its
+ scope.
+<p><b>Semantics</b>
+<p><!--para 7 -->
+ The identifier immediately following the define is called the macro name. There is one
+ name space for macro names. Any white-space characters preceding or following the
+ replacement list of preprocessing tokens are not considered part of the replacement list
+ for either form of macro.
+<!--page 164 -->
+<p><!--para 8 -->
+ If a # preprocessing token, followed by an identifier, occurs lexically at the point at which
+ a preprocessing directive could begin, the identifier is not subject to macro replacement.
+<p><!--para 9 -->
+ A preprocessing directive of the form
+<pre>
+    # define identifier replacement-list new-line
+</pre>
+ defines an object-like macro that causes each subsequent instance of the macro name<sup><a href="#note149"><b>149)</b></a></sup>
+ to be replaced by the replacement list of preprocessing tokens that constitute the
+ remainder of the directive. The replacement list is then rescanned for more macro names
+ as specified below.
+<p><!--para 10 -->
+ A preprocessing directive of the form
+<pre>
+    # define identifier lparen identifier-list<sub>opt</sub> ) replacement-list new-line
+    # define identifier lparen ... ) replacement-list new-line
+    # define identifier lparen identifier-list , ... ) replacement-list new-line
+</pre>
+ defines a function-like macro with parameters, whose use is similar syntactically to a
+ function call. The parameters are specified by the optional list of identifiers, whose scope
+ extends from their declaration in the identifier list until the new-line character that
+ terminates the #define preprocessing directive. Each subsequent instance of the
+ function-like macro name followed by a ( as the next preprocessing token introduces the
+ sequence of preprocessing tokens that is replaced by the replacement list in the definition
+ (an invocation of the macro). The replaced sequence of preprocessing tokens is
+ terminated by the matching ) preprocessing token, skipping intervening matched pairs of
+ left and right parenthesis preprocessing tokens. Within the sequence of preprocessing
+ tokens making up an invocation of a function-like macro, new-line is considered a normal
+ white-space character.
+<p><!--para 11 -->
+ The sequence of preprocessing tokens bounded by the outside-most matching parentheses
+ forms the list of arguments for the function-like macro. The individual arguments within
+ the list are separated by comma preprocessing tokens, but comma preprocessing tokens
+ between matching inner parentheses do not separate arguments. If there are sequences of
+ preprocessing tokens within the list of arguments that would otherwise act as
+ preprocessing directives,<sup><a href="#note150"><b>150)</b></a></sup> the behavior is undefined.
+<p><!--para 12 -->
+ If there is a ... in the identifier-list in the macro definition, then the trailing arguments,
+ including any separating comma preprocessing tokens, are merged to form a single item:
+ the variable arguments. The number of arguments so combined is such that, following
+<!--page 165 -->
+ merger, the number of arguments is one more than the number of parameters in the macro
+ definition (excluding the ...).
+
+<p><b>Footnotes</b>
+<p><small><a name="note149" href="#note149">149)</a> Since, by macro-replacement time, all character constants and string literals are preprocessing tokens,
+ not sequences possibly containing identifier-like subsequences (see <a href="#5.1.1.2">5.1.1.2</a>, translation phases), they
+ are never scanned for macro names or parameters.
+</small>
+<p><small><a name="note150" href="#note150">150)</a> Despite the name, a non-directive is a preprocessing directive.
+</small>
+
+<h5><a name="6.10.3.1" href="#6.10.3.1">6.10.3.1 Argument substitution</a></h5>
+<p><!--para 1 -->
+ After the arguments for the invocation of a function-like macro have been identified,
+ argument substitution takes place. A parameter in the replacement list, unless preceded
+ by a # or ## preprocessing token or followed by a ## preprocessing token (see below), is
+ replaced by the corresponding argument after all macros contained therein have been
+ expanded. Before being substituted, each argument's preprocessing tokens are
+ completely macro replaced as if they formed the rest of the preprocessing file; no other
+ preprocessing tokens are available.
+<p><!--para 2 -->
+ An identifier __VA_ARGS__ that occurs in the replacement list shall be treated as if it
+ were a parameter, and the variable arguments shall form the preprocessing tokens used to
+ replace it.
+
+<h5><a name="6.10.3.2" href="#6.10.3.2">6.10.3.2 The # operator</a></h5>
+<p><b>Constraints</b>
+<p><!--para 1 -->
+ Each # preprocessing token in the replacement list for a function-like macro shall be
+ followed by a parameter as the next preprocessing token in the replacement list.
+<p><b>Semantics</b>
+<p><!--para 2 -->
+ If, in the replacement list, a parameter is immediately preceded by a # preprocessing
+ token, both are replaced by a single character string literal preprocessing token that
+ contains the spelling of the preprocessing token sequence for the corresponding
+ argument. Each occurrence of white space between the argument's preprocessing tokens
+ becomes a single space character in the character string literal. White space before the
+ first preprocessing token and after the last preprocessing token composing the argument
+ is deleted. Otherwise, the original spelling of each preprocessing token in the argument
+ is retained in the character string literal, except for special handling for producing the
+ spelling of string literals and character constants: a \ character is inserted before each "
+ and \ character of a character constant or string literal (including the delimiting "
+ characters), except that it is implementation-defined whether a \ character is inserted
+ before the \ character beginning a universal character name. If the replacement that
+ results is not a valid character string literal, the behavior is undefined. The character
+ string literal corresponding to an empty argument is "". The order of evaluation of # and
+ ## operators is unspecified.
+<!--page 166 -->
+
+<h5><a name="6.10.3.3" href="#6.10.3.3">6.10.3.3 The ## operator</a></h5>
+<p><b>Constraints</b>
+<p><!--para 1 -->
+ A ## preprocessing token shall not occur at the beginning or at the end of a replacement
+ list for either form of macro definition.
+<p><b>Semantics</b>
+<p><!--para 2 -->
+ If, in the replacement list of a function-like macro, a parameter is immediately preceded
+ or followed by a ## preprocessing token, the parameter is replaced by the corresponding
+ argument's preprocessing token sequence; however, if an argument consists of no
+ preprocessing tokens, the parameter is replaced by a placemarker preprocessing token
+ instead.<sup><a href="#note151"><b>151)</b></a></sup>
+<p><!--para 3 -->
+ For both object-like and function-like macro invocations, before the replacement list is
+ reexamined for more macro names to replace, each instance of a ## preprocessing token
+ in the replacement list (not from an argument) is deleted and the preceding preprocessing
+ token is concatenated with the following preprocessing token. Placemarker
+ preprocessing tokens are handled specially: concatenation of two placemarkers results in
+ a single placemarker preprocessing token, and concatenation of a placemarker with a
+ non-placemarker preprocessing token results in the non-placemarker preprocessing token.
+ If the result is not a valid preprocessing token, the behavior is undefined. The resulting
+ token is available for further macro replacement. The order of evaluation of ## operators
+ is unspecified.
+<p><!--para 4 -->
+ EXAMPLE       In the following fragment:
+<pre>
+         #define     hash_hash # ## #
+         #define     mkstr(a) # a
+         #define     in_between(a) mkstr(a)
+         #define     join(c, d) in_between(c hash_hash d)
+         char p[] = join(x, y); // equivalent to
+                                // char p[] = "x ## y";
+</pre>
+ The expansion produces, at various stages:
+<pre>
+         join(x, y)
+         in_between(x hash_hash y)
+         in_between(x ## y)
+         mkstr(x ## y)
+         "x ## y"
+</pre>
+ In other words, expanding hash_hash produces a new token, consisting of two adjacent sharp signs, but
+ this new token is not the ## operator.
+<!--page 167 -->
+
+<p><b>Footnotes</b>
+<p><small><a name="note151" href="#note151">151)</a> Placemarker preprocessing tokens do not appear in the syntax because they are temporary entities that
+ exist only within translation phase 4.
+</small>
+
+<h5><a name="6.10.3.4" href="#6.10.3.4">6.10.3.4 Rescanning and further replacement</a></h5>
+<p><!--para 1 -->
+ After all parameters in the replacement list have been substituted and # and ##
+ processing has taken place, all placemarker preprocessing tokens are removed. Then, the
+ resulting preprocessing token sequence is rescanned, along with all subsequent
+ preprocessing tokens of the source file, for more macro names to replace.
+<p><!--para 2 -->
+ If the name of the macro being replaced is found during this scan of the replacement list
+ (not including the rest of the source file's preprocessing tokens), it is not replaced.
+ Furthermore, if any nested replacements encounter the name of the macro being replaced,
+ it is not replaced. These nonreplaced macro name preprocessing tokens are no longer
+ available for further replacement even if they are later (re)examined in contexts in which
+ that macro name preprocessing token would otherwise have been replaced.
+<p><!--para 3 -->
+ The resulting completely macro-replaced preprocessing token sequence is not processed
+ as a preprocessing directive even if it resembles one, but all pragma unary operator
+ expressions within it are then processed as specified in <a href="#6.10.9">6.10.9</a> below.
+
+<h5><a name="6.10.3.5" href="#6.10.3.5">6.10.3.5 Scope of macro definitions</a></h5>
+<p><!--para 1 -->
+ A macro definition lasts (independent of block structure) until a corresponding #undef
+ directive is encountered or (if none is encountered) until the end of the preprocessing
+ translation unit. Macro definitions have no significance after translation phase 4.
+<p><!--para 2 -->
+ A preprocessing directive of the form
+<pre>
+    # undef identifier new-line
+</pre>
+ causes the specified identifier no longer to be defined as a macro name. It is ignored if
+ the specified identifier is not currently defined as a macro name.
+<p><!--para 3 -->
+ EXAMPLE 1      The simplest use of this facility is to define a ''manifest constant'', as in
+<pre>
+         #define TABSIZE 100
+         int table[TABSIZE];
+</pre>
+<p><!--para 4 -->
+ EXAMPLE 2 The following defines a function-like macro whose value is the maximum of its arguments.
+ It has the advantages of working for any compatible types of the arguments and of generating in-line code
+ without the overhead of function calling. It has the disadvantages of evaluating one or the other of its
+ arguments a second time (including side effects) and generating more code than a function if invoked
+ several times. It also cannot have its address taken, as it has none.
+<pre>
+         #define max(a, b) ((a) &gt; (b) ? (a) : (b))
+</pre>
+ The parentheses ensure that the arguments and the resulting expression are bound properly.
+<!--page 168 -->
+<p><!--para 5 -->
+ EXAMPLE 3     To illustrate the rules for redefinition and reexamination, the sequence
+<pre>
+          #define   x         3
+          #define   f(a)      f(x * (a))
+          #undef    x
+          #define   x         2
+          #define   g         f
+          #define   z         z[0]
+          #define   h         g(~
+          #define   m(a)      a(w)
+          #define   w         0,1
+          #define   t(a)      a
+          #define   p()       int
+          #define   q(x)      x
+          #define   r(x,y)    x ## y
+          #define   str(x)    # x
+          f(y+1) + f(f(z)) % t(t(g)(0) + t)(1);
+          g(x+(3,4)-w) | h 5) &amp; m
+                (f)^m(m);
+          p() i[q()] = { q(1), r(2,3), r(4,), r(,5), r(,) };
+          char c[2][6] = { str(hello), str() };
+</pre>
+ results in
+<pre>
+          f(2 * (y+1)) + f(2 * (f(2 * (z[0])))) % f(2 * (0)) + t(1);
+          f(2 * (2+(3,4)-0,1)) | f(2 * (~ 5)) &amp; f(2 * (0,1))^m(0,1);
+          int i[] = { 1, 23, 4, 5, };
+          char c[2][6] = { "hello", "" };
+</pre>
+<p><!--para 6 -->
+ EXAMPLE 4     To illustrate the rules for creating character string literals and concatenating tokens, the
+ sequence
+<pre>
+          #define str(s)      # s
+          #define xstr(s)     str(s)
+          #define debug(s, t) printf("x" # s "= %d, x" # t "= %s", \
+                                  x ## s, x ## t)
+          #define INCFILE(n) vers ## n
+          #define glue(a, b) a ## b
+          #define xglue(a, b) glue(a, b)
+          #define HIGHLOW     "hello"
+          #define LOW         LOW ", world"
+          debug(1, 2);
+          fputs(str(strncmp("abc\0d", "abc", '\4') // this goes away
+                == 0) str(: @\n), s);
+          #include xstr(INCFILE(2).h)
+          glue(HIGH, LOW);
+          xglue(HIGH, LOW)
+</pre>
+ results in
+<!--page 169 -->
+<pre>
+          printf("x" "1" "= %d, x" "2" "= %s", x1, x2);
+          fputs(
+            "strncmp(\"abc\\0d\", \"abc\", '\\4') == 0" ": @\n",
+            s);
+          #include "vers2.h"    (after macro replacement, before file access)
+          "hello";
+          "hello" ", world"
+</pre>
+ or, after concatenation of the character string literals,
+<pre>
+          printf("x1= %d, x2= %s", x1, x2);
+          fputs(
+            "strncmp(\"abc\\0d\", \"abc\", '\\4') == 0: @\n",
+            s);
+          #include "vers2.h"    (after macro replacement, before file access)
+          "hello";
+          "hello, world"
+</pre>
+ Space around the # and ## tokens in the macro definition is optional.
+<p><!--para 7 -->
+ EXAMPLE 5        To illustrate the rules for placemarker preprocessing tokens, the sequence
+<pre>
+          #define t(x,y,z) x ## y ## z
+          int j[] = { t(1,2,3), t(,4,5), t(6,,7), t(8,9,),
+                     t(10,,), t(,11,), t(,,12), t(,,) };
+</pre>
+ results in
+<pre>
+          int j[] = { 123, 45, 67, 89,
+                      10, 11, 12, };
+</pre>
+<p><!--para 8 -->
+ EXAMPLE 6        To demonstrate the redefinition rules, the following sequence is valid.
+<pre>
+          #define      OBJ_LIKE      (1-1)
+          #define      OBJ_LIKE      /* white space */ (1-1) /* other */
+          #define      FUNC_LIKE(a)   ( a )
+          #define      FUNC_LIKE( a )( /* note the white space */ \
+                                       a /* other stuff on this line
+                                           */ )
+</pre>
+ But the following redefinitions are invalid:
+<pre>
+          #define      OBJ_LIKE    (0)     // different token sequence
+          #define      OBJ_LIKE    (1 - 1) // different white space
+          #define      FUNC_LIKE(b) ( a ) // different parameter usage
+          #define      FUNC_LIKE(b) ( b ) // different parameter spelling
+</pre>
+<p><!--para 9 -->
+ EXAMPLE 7        Finally, to show the variable argument list macro facilities:
+<!--page 170 -->
+<pre>
+          #define debug(...)       fprintf(stderr, __VA_ARGS__)
+          #define showlist(...)    puts(#__VA_ARGS__)
+          #define report(test, ...) ((test)?puts(#test):\
+                      printf(__VA_ARGS__))
+          debug("Flag");
+          debug("X = %d\n", x);
+          showlist(The first, second, and third items.);
+          report(x&gt;y, "x is %d but y is %d", x, y);
+</pre>
+ results in
+<pre>
+          fprintf(stderr, "Flag" );
+          fprintf(stderr, "X = %d\n", x );
+          puts( "The first, second, and third items." );
+          ((x&gt;y)?puts("x&gt;y"):
+                      printf("x is %d but y is %d", x, y));
+</pre>
+
+<h4><a name="6.10.4" href="#6.10.4">6.10.4 Line control</a></h4>
+<p><b>Constraints</b>
+<p><!--para 1 -->
+ The string literal of a #line directive, if present, shall be a character string literal.
+<p><b>Semantics</b>
+<p><!--para 2 -->
+ The line number of the current source line is one greater than the number of new-line
+ characters read or introduced in translation phase 1 (<a href="#5.1.1.2">5.1.1.2</a>) while processing the source
+ file to the current token.
+<p><!--para 3 -->
+ A preprocessing directive of the form
+<pre>
+    # line digit-sequence new-line
+</pre>
+ causes the implementation to behave as if the following sequence of source lines begins
+ with a source line that has a line number as specified by the digit sequence (interpreted as
+ a decimal integer). The digit sequence shall not specify zero, nor a number greater than
+ 2147483647.
+<p><!--para 4 -->
+ A preprocessing directive of the form
+<pre>
+    # line digit-sequence "s-char-sequence<sub>opt</sub>" new-line
+</pre>
+ sets the presumed line number similarly and changes the presumed name of the source
+ file to be the contents of the character string literal.
+<p><!--para 5 -->
+ A preprocessing directive of the form
+<pre>
+    # line pp-tokens new-line
+</pre>
+ (that does not match one of the two previous forms) is permitted. The preprocessing
+ tokens after line on the directive are processed just as in normal text (each identifier
+ currently defined as a macro name is replaced by its replacement list of preprocessing
+ tokens). The directive resulting after all replacements shall match one of the two
+ previous forms and is then processed as appropriate.
+<!--page 171 -->
+
+<h4><a name="6.10.5" href="#6.10.5">6.10.5 Error directive</a></h4>
+<p><b>Semantics</b>
+<p><!--para 1 -->
+ A preprocessing directive of the form
+<pre>
+    # error pp-tokens<sub>opt</sub> new-line
+</pre>
+ causes the implementation to produce a diagnostic message that includes the specified
+ sequence of preprocessing tokens.
+
+<h4><a name="6.10.6" href="#6.10.6">6.10.6 Pragma directive</a></h4>
+<p><b>Semantics</b>
+<p><!--para 1 -->
+ A preprocessing directive of the form
+<pre>
+    # pragma pp-tokens<sub>opt</sub> new-line
+</pre>
+ where the preprocessing token STDC does not immediately follow pragma in the
+ directive (prior to any macro replacement)<sup><a href="#note152"><b>152)</b></a></sup> causes the implementation to behave in an
+ implementation-defined manner. The behavior might cause translation to fail or cause the
+ translator or the resulting program to behave in a non-conforming manner. Any such
+ pragma that is not recognized by the implementation is ignored.
+<p><!--para 2 -->
+ If the preprocessing token STDC does immediately follow pragma in the directive (prior
+ to any macro replacement), then no macro replacement is performed on the directive, and
+ the directive shall have one of the following forms<sup><a href="#note153"><b>153)</b></a></sup> whose meanings are described
+ elsewhere:
+<pre>
+    #pragma STDC FP_CONTRACT on-off-switch
+    #pragma STDC FENV_ACCESS on-off-switch
+    #pragma STDC CX_LIMITED_RANGE on-off-switch
+    on-off-switch: one of
+                ON     OFF           DEFAULT
+</pre>
+<p><b> Forward references</b>: the FP_CONTRACT pragma (<a href="#7.12.2">7.12.2</a>), the FENV_ACCESS pragma
+ (<a href="#7.6.1">7.6.1</a>), the CX_LIMITED_RANGE pragma (<a href="#7.3.4">7.3.4</a>).
+<!--page 172 -->
+
+<p><b>Footnotes</b>
+<p><small><a name="note152" href="#note152">152)</a> An implementation is not required to perform macro replacement in pragmas, but it is permitted
+ except for in standard pragmas (where STDC immediately follows pragma). If the result of macro
+ replacement in a non-standard pragma has the same form as a standard pragma, the behavior is still
+ implementation-defined; an implementation is permitted to behave as if it were the standard pragma,
+ but is not required to.
+</small>
+<p><small><a name="note153" href="#note153">153)</a> See ''future language directions'' (<a href="#6.11.8">6.11.8</a>).
+</small>
+
+<h4><a name="6.10.7" href="#6.10.7">6.10.7 Null directive</a></h4>
+<p><b>Semantics</b>
+<p><!--para 1 -->
+ A preprocessing directive of the form
+<pre>
+    # new-line
+</pre>
+ has no effect.
+
+<h4><a name="6.10.8" href="#6.10.8">6.10.8 Predefined macro names</a></h4>
+<p><!--para 1 -->
+ The following macro names<sup><a href="#note154"><b>154)</b></a></sup> shall be defined by the implementation:
+<dl>
+<dt> __DATE__ <dd>The date of translation of the preprocessing translation unit: a character
+            string literal of the form "Mmm dd yyyy", where the names of the
+            months are the same as those generated by the asctime function, and the
+            first character of dd is a space character if the value is less than 10. If the
+            date of translation is not available, an implementation-defined valid date
+            shall be supplied.
+<dt> __FILE__ <dd>The presumed name of the current source file (a character string literal).<sup><a href="#note155"><b>155)</b></a></sup>
+<dt> __LINE__ <dd>The presumed line number (within the current source file) of the current
+            source line (an integer constant).<sup><a href="#note155"><b>155)</b></a></sup>
+<dt> __STDC__ <dd>The integer constant 1, intended to indicate a conforming implementation.
+<dt> __STDC_HOSTED__ <dd>The integer constant 1 if the implementation is a hosted
+           implementation or the integer constant 0 if it is not.
+<dt> __STDC_MB_MIGHT_NEQ_WC__ <dd>The integer constant 1, intended to indicate that, in
+           the encoding for wchar_t, a member of the basic character set need not
+           have a code value equal to its value when used as the lone character in an
+           integer character constant.
+<dt> __STDC_VERSION__ <dd>The integer constant 199901L.<sup><a href="#note156"><b>156)</b></a></sup>
+<dt> __TIME__ <dd>The time of translation of the preprocessing translation unit: a character
+            string literal of the form "hh:mm:ss" as in the time generated by the
+            asctime function. If the time of translation is not available, an
+            implementation-defined valid time shall be supplied.
+</dl>
+<!--page 173 -->
+<p><!--para 2 -->
+ The following macro names are conditionally defined by the implementation:
+<dl>
+<dt> __STDC_IEC_559__ <dd>The integer constant 1, intended to indicate conformance to the
+           specifications in <a href="#F">annex F</a> (IEC 60559 floating-point arithmetic).
+<dt> __STDC_IEC_559_COMPLEX__ <dd>The integer constant 1, intended to indicate
+           adherence to the specifications in informative <a href="#G">annex G</a> (IEC 60559
+           compatible complex arithmetic).
+<dt> __STDC_ISO_10646__ <dd>An integer constant of the form yyyymmL (for example,
+           199712L). If this symbol is defined, then every character in the Unicode
+           required set, when stored in an object of type wchar_t, has the same
+           value as the short identifier of that character. The Unicode required set
+           consists of all the characters that are defined by ISO/IEC 10646, along with
+           all amendments and technical corrigenda, as of the specified year and
+           month.
+</dl>
+<p><!--para 3 -->
+ The values of the predefined macros (except for __FILE__ and __LINE__) remain
+ constant throughout the translation unit.
+<p><!--para 4 -->
+ None of these macro names, nor the identifier defined, shall be the subject of a
+ #define or a #undef preprocessing directive. Any other predefined macro names
+ shall begin with a leading underscore followed by an uppercase letter or a second
+ underscore.
+<p><!--para 5 -->
+ The implementation shall not predefine the macro __cplusplus, nor shall it define it
+ in any standard header.
+<p><b> Forward references</b>: the asctime function (<a href="#7.23.3.1">7.23.3.1</a>), standard headers (<a href="#7.1.2">7.1.2</a>).
+
+<p><b>Footnotes</b>
+<p><small><a name="note154" href="#note154">154)</a> See ''future language directions'' (<a href="#6.11.9">6.11.9</a>).
+</small>
+<p><small><a name="note155" href="#note155">155)</a> The presumed source file name and line number can be changed by the #line directive.
+</small>
+<p><small><a name="note156" href="#note156">156)</a> This macro was not specified in ISO/IEC 9899:1990 and was specified as 199409L in
+ ISO/IEC 9899/AMD1:1995. The intention is that this will remain an integer constant of type long
+ int that is increased with each revision of this International Standard.
+</small>
+
+<h4><a name="6.10.9" href="#6.10.9">6.10.9 Pragma operator</a></h4>
+<p><b>Semantics</b>
+<p><!--para 1 -->
+ A unary operator expression of the form:
+<pre>
+    _Pragma ( string-literal )
+</pre>
+ is processed as follows: The string literal is destringized by deleting the L prefix, if
+ present, deleting the leading and trailing double-quotes, replacing each escape sequence
+ \" by a double-quote, and replacing each escape sequence \\ by a single backslash. The
+ resulting sequence of characters is processed through translation phase 3 to produce
+ preprocessing tokens that are executed as if they were the pp-tokens in a pragma
+ directive. The original four preprocessing tokens in the unary operator expression are
+ removed.
+<p><!--para 2 -->
+ EXAMPLE       A directive of the form:
+<pre>
+          #pragma listing on "..\listing.dir"
+</pre>
+ can also be expressed as:
+<!--page 174 -->
+<pre>
+         _Pragma ( "listing on \"..\\listing.dir\"" )
+</pre>
+ The latter form is processed in the same way whether it appears literally as shown, or results from macro
+ replacement, as in:
+<!--page 175 -->
+<pre>
+         #define LISTING(x) PRAGMA(listing on #x)
+         #define PRAGMA(x) _Pragma(#x)
+         LISTING ( ..\listing.dir )
+</pre>
+
+<h3><a name="6.11" href="#6.11">6.11 Future language directions</a></h3>
+
+<h4><a name="6.11.1" href="#6.11.1">6.11.1 Floating types</a></h4>
+<p><!--para 1 -->
+ Future standardization may include additional floating-point types, including those with
+ greater range, precision, or both than long double.
+
+<h4><a name="6.11.2" href="#6.11.2">6.11.2 Linkages of identifiers</a></h4>
+<p><!--para 1 -->
+ Declaring an identifier with internal linkage at file scope without the static storage-
+ class specifier is an obsolescent feature.
+
+<h4><a name="6.11.3" href="#6.11.3">6.11.3 External names</a></h4>
+<p><!--para 1 -->
+ Restriction of the significance of an external name to fewer than 255 characters
+ (considering each universal character name or extended source character as a single
+ character) is an obsolescent feature that is a concession to existing implementations.
+
+<h4><a name="6.11.4" href="#6.11.4">6.11.4 Character escape sequences</a></h4>
+<p><!--para 1 -->
+ Lowercase letters as escape sequences are reserved for future standardization. Other
+ characters may be used in extensions.
+
+<h4><a name="6.11.5" href="#6.11.5">6.11.5 Storage-class specifiers</a></h4>
+<p><!--para 1 -->
+ The placement of a storage-class specifier other than at the beginning of the declaration
+ specifiers in a declaration is an obsolescent feature.
+
+<h4><a name="6.11.6" href="#6.11.6">6.11.6 Function declarators</a></h4>
+<p><!--para 1 -->
+ The use of function declarators with empty parentheses (not prototype-format parameter
+ type declarators) is an obsolescent feature.
+
+<h4><a name="6.11.7" href="#6.11.7">6.11.7 Function definitions</a></h4>
+<p><!--para 1 -->
+ The use of function definitions with separate parameter identifier and declaration lists
+ (not prototype-format parameter type and identifier declarators) is an obsolescent feature.
+
+<h4><a name="6.11.8" href="#6.11.8">6.11.8 Pragma directives</a></h4>
+<p><!--para 1 -->
+ Pragmas whose first preprocessing token is STDC are reserved for future standardization.
+
+<h4><a name="6.11.9" href="#6.11.9">6.11.9 Predefined macro names</a></h4>
+<p><!--para 1 -->
+ Macro names beginning with __STDC_ are reserved for future standardization.
+<!--page 176 -->
+
+<h2><a name="7" href="#7">7. Library</a></h2>
+
+<h3><a name="7.1" href="#7.1">7.1 Introduction</a></h3>
+
+<h4><a name="7.1.1" href="#7.1.1">7.1.1 Definitions of terms</a></h4>
+<p><!--para 1 -->
+ A string is a contiguous sequence of characters terminated by and including the first null
+ character. The term multibyte string is sometimes used instead to emphasize special
+ processing given to multibyte characters contained in the string or to avoid confusion
+ with a wide string. A pointer to a string is a pointer to its initial (lowest addressed)
+ character. The length of a string is the number of bytes preceding the null character and
+ the value of a string is the sequence of the values of the contained characters, in order.
+<p><!--para 2 -->
+ The decimal-point character is the character used by functions that convert floating-point
+ numbers to or from character sequences to denote the beginning of the fractional part of
+ such character sequences.<sup><a href="#note157"><b>157)</b></a></sup> It is represented in the text and examples by a period, but
+ may be changed by the setlocale function.
+<p><!--para 3 -->
+ A null wide character is a wide character with code value zero.
+<p><!--para 4 -->
+ A wide string is a contiguous sequence of wide characters terminated by and including
+ the first null wide character. A pointer to a wide string is a pointer to its initial (lowest
+ addressed) wide character. The length of a wide string is the number of wide characters
+ preceding the null wide character and the value of a wide string is the sequence of code
+ values of the contained wide characters, in order.
+<p><!--para 5 -->
+ A shift sequence is a contiguous sequence of bytes within a multibyte string that
+ (potentially) causes a change in shift state (see <a href="#5.2.1.2">5.2.1.2</a>). A shift sequence shall not have a
+ corresponding wide character; it is instead taken to be an adjunct to an adjacent multibyte
+ character.<sup><a href="#note158"><b>158)</b></a></sup>
+<p><b> Forward references</b>: character handling (<a href="#7.4">7.4</a>), the setlocale function (<a href="#7.11.1.1">7.11.1.1</a>).
+<!--page 177 -->
+
+<p><b>Footnotes</b>
+<p><small><a name="note157" href="#note157">157)</a> The functions that make use of the decimal-point character are the numeric conversion functions
+ (<a href="#7.20.1">7.20.1</a>, <a href="#7.24.4.1">7.24.4.1</a>) and the formatted input/output functions (<a href="#7.19.6">7.19.6</a>, <a href="#7.24.2">7.24.2</a>).
+</small>
+<p><small><a name="note158" href="#note158">158)</a> For state-dependent encodings, the values for MB_CUR_MAX and MB_LEN_MAX shall thus be large
+ enough to count all the bytes in any complete multibyte character plus at least one adjacent shift
+ sequence of maximum length. Whether these counts provide for more than one shift sequence is the
+ implementation's choice.
+</small>
+
+<h4><a name="7.1.2" href="#7.1.2">7.1.2 Standard headers</a></h4>
+<p><!--para 1 -->
+ Each library function is declared, with a type that includes a prototype, in a header,<sup><a href="#note159"><b>159)</b></a></sup>
+ whose contents are made available by the #include preprocessing directive. The
+ header declares a set of related functions, plus any necessary types and additional macros
+ needed to facilitate their use. Declarations of types described in this clause shall not
+ include type qualifiers, unless explicitly stated otherwise.
+<p><!--para 2 -->
+ The standard headers are
+<pre>
+        <a href="#7.2">&lt;assert.h&gt;</a>             <a href="#7.8">&lt;inttypes.h&gt;</a>            <a href="#7.14">&lt;signal.h&gt;</a>              <a href="#7.20">&lt;stdlib.h&gt;</a>
+        <a href="#7.3">&lt;complex.h&gt;</a>            <a href="#7.9">&lt;iso646.h&gt;</a>              <a href="#7.15">&lt;stdarg.h&gt;</a>              <a href="#7.21">&lt;string.h&gt;</a>
+        <a href="#7.4">&lt;ctype.h&gt;</a>              <a href="#7.10">&lt;limits.h&gt;</a>              <a href="#7.16">&lt;stdbool.h&gt;</a>             <a href="#7.22">&lt;tgmath.h&gt;</a>
+        <a href="#7.5">&lt;errno.h&gt;</a>              <a href="#7.11">&lt;locale.h&gt;</a>              <a href="#7.17">&lt;stddef.h&gt;</a>              <a href="#7.23">&lt;time.h&gt;</a>
+        <a href="#7.6">&lt;fenv.h&gt;</a>               <a href="#7.12">&lt;math.h&gt;</a>                <a href="#7.18">&lt;stdint.h&gt;</a>              <a href="#7.24">&lt;wchar.h&gt;</a>
+        <a href="#7.7">&lt;float.h&gt;</a>              <a href="#7.13">&lt;setjmp.h&gt;</a>              <a href="#7.19">&lt;stdio.h&gt;</a>               <a href="#7.25">&lt;wctype.h&gt;</a>
+</pre>
+<p><!--para 3 -->
+ If a file with the same name as one of the above &lt; and &gt; delimited sequences, not
+ provided as part of the implementation, is placed in any of the standard places that are
+ searched for included source files, the behavior is undefined.
+<p><!--para 4 -->
+ Standard headers may be included in any order; each may be included more than once in
+ a given scope, with no effect different from being included only once, except that the
+ effect of including <a href="#7.2">&lt;assert.h&gt;</a> depends on the definition of NDEBUG (see <a href="#7.2">7.2</a>). If
+ used, a header shall be included outside of any external declaration or definition, and it
+ shall first be included before the first reference to any of the functions or objects it
+ declares, or to any of the types or macros it defines. However, if an identifier is declared
+ or defined in more than one header, the second and subsequent associated headers may be
+ included after the initial reference to the identifier. The program shall not have any
+ macros with names lexically identical to keywords currently defined prior to the
+ inclusion.
+<p><!--para 5 -->
+ Any definition of an object-like macro described in this clause shall expand to code that is
+ fully protected by parentheses where necessary, so that it groups in an arbitrary
+ expression as if it were a single identifier.
+<p><!--para 6 -->
+ Any declaration of a library function shall have external linkage.
+<p><!--para 7 -->
+ A summary of the contents of the standard headers is given in <a href="#B">annex B</a>.
+<p><b> Forward references</b>: diagnostics (<a href="#7.2">7.2</a>).
+<!--page 178 -->
+
+<p><b>Footnotes</b>
+<p><small><a name="note159" href="#note159">159)</a> A header is not necessarily a source file, nor are the &lt; and &gt; delimited sequences in header names
+ necessarily valid source file names.
+</small>
+
+<h4><a name="7.1.3" href="#7.1.3">7.1.3 Reserved identifiers</a></h4>
+<p><!--para 1 -->
+ Each header declares or defines all identifiers listed in its associated subclause, and
+ optionally declares or defines identifiers listed in its associated future library directions
+ subclause and identifiers which are always reserved either for any use or for use as file
+ scope identifiers.
+<ul>
+<li>  All identifiers that begin with an underscore and either an uppercase letter or another
+ underscore are always reserved for any use.
+<li>  All identifiers that begin with an underscore are always reserved for use as identifiers
+ with file scope in both the ordinary and tag name spaces.
+<li>  Each macro name in any of the following subclauses (including the future library
+ directions) is reserved for use as specified if any of its associated headers is included;
+ unless explicitly stated otherwise (see <a href="#7.1.4">7.1.4</a>).
+<li>  All identifiers with external linkage in any of the following subclauses (including the
+ future library directions) are always reserved for use as identifiers with external
+ linkage.<sup><a href="#note160"><b>160)</b></a></sup>
+<li>  Each identifier with file scope listed in any of the following subclauses (including the
+ future library directions) is reserved for use as a macro name and as an identifier with
+ file scope in the same name space if any of its associated headers is included.
+</ul>
+<p><!--para 2 -->
+ No other identifiers are reserved. If the program declares or defines an identifier in a
+ context in which it is reserved (other than as allowed by <a href="#7.1.4">7.1.4</a>), or defines a reserved
+ identifier as a macro name, the behavior is undefined.
+<p><!--para 3 -->
+ If the program removes (with #undef) any macro definition of an identifier in the first
+ group listed above, the behavior is undefined.
+
+<p><b>Footnotes</b>
+<p><small><a name="note160" href="#note160">160)</a> The list of reserved identifiers with external linkage includes errno, math_errhandling,
+ setjmp, and va_end.
+</small>
+
+<h4><a name="7.1.4" href="#7.1.4">7.1.4 Use of library functions</a></h4>
+<p><!--para 1 -->
+ Each of the following statements applies unless explicitly stated otherwise in the detailed
+ descriptions that follow: If an argument to a function has an invalid value (such as a value
+ outside the domain of the function, or a pointer outside the address space of the program,
+ or a null pointer, or a pointer to non-modifiable storage when the corresponding
+ parameter is not const-qualified) or a type (after promotion) not expected by a function
+ with variable number of arguments, the behavior is undefined. If a function argument is
+ described as being an array, the pointer actually passed to the function shall have a value
+ such that all address computations and accesses to objects (that would be valid if the
+ pointer did point to the first element of such an array) are in fact valid. Any function
+ declared in a header may be additionally implemented as a function-like macro defined in
+<!--page 179 -->
+ the header, so if a library function is declared explicitly when its header is included, one
+ of the techniques shown below can be used to ensure the declaration is not affected by
+ such a macro. Any macro definition of a function can be suppressed locally by enclosing
+ the name of the function in parentheses, because the name is then not followed by the left
+ parenthesis that indicates expansion of a macro function name. For the same syntactic
+ reason, it is permitted to take the address of a library function even if it is also defined as
+ a macro.<sup><a href="#note161"><b>161)</b></a></sup> The use of #undef to remove any macro definition will also ensure that an
+ actual function is referred to. Any invocation of a library function that is implemented as
+ a macro shall expand to code that evaluates each of its arguments exactly once, fully
+ protected by parentheses where necessary, so it is generally safe to use arbitrary
+ expressions as arguments.<sup><a href="#note162"><b>162)</b></a></sup> Likewise, those function-like macros described in the
+ following subclauses may be invoked in an expression anywhere a function with a
+ compatible return type could be called.<sup><a href="#note163"><b>163)</b></a></sup> All object-like macros listed as expanding to
+ integer constant expressions shall additionally be suitable for use in #if preprocessing
+ directives.
+<p><!--para 2 -->
+ Provided that a library function can be declared without reference to any type defined in a
+ header, it is also permissible to declare the function and use it without including its
+ associated header.
+<p><!--para 3 -->
+ There is a sequence point immediately before a library function returns.
+<p><!--para 4 -->
+ The functions in the standard library are not guaranteed to be reentrant and may modify
+ objects with static storage duration.<sup><a href="#note164"><b>164)</b></a></sup>
+<!--page 180 -->
+<p><!--para 5 -->
+ EXAMPLE       The function atoi may be used in any of several ways:
+<ul>
+<li>  by use of its associated header (possibly generating a macro expansion)
+<pre>
+           #include <a href="#7.20">&lt;stdlib.h&gt;</a>
+           const char *str;
+           /* ... */
+           i = atoi(str);
+</pre>
+<li>  by use of its associated header (assuredly generating a true function reference)
+<pre>
+           #include <a href="#7.20">&lt;stdlib.h&gt;</a>
+           #undef atoi
+           const char *str;
+           /* ... */
+           i = atoi(str);
+</pre>
+  or
+<pre>
+           #include <a href="#7.20">&lt;stdlib.h&gt;</a>
+           const char *str;
+           /* ... */
+           i = (atoi)(str);
+</pre>
+<li>  by explicit declaration
+<!--page 181 -->
+<pre>
+           extern int atoi(const char *);
+           const char *str;
+           /* ... */
+           i = atoi(str);
+</pre>
+</ul>
+
+<p><b>Footnotes</b>
+<p><small><a name="note161" href="#note161">161)</a> This means that an implementation shall provide an actual function for each library function, even if it
+ also provides a macro for that function.
+</small>
+<p><small><a name="note162" href="#note162">162)</a> Such macros might not contain the sequence points that the corresponding function calls do.
+</small>
+<p><small><a name="note163" href="#note163">163)</a> Because external identifiers and some macro names beginning with an underscore are reserved,
+ implementations may provide special semantics for such names. For example, the identifier
+ _BUILTIN_abs could be used to indicate generation of in-line code for the abs function. Thus, the
+ appropriate header could specify
+
+<pre>
+          #define abs(x) _BUILTIN_abs(x)
+</pre>
+ for a compiler whose code generator will accept it.
+ In this manner, a user desiring to guarantee that a given library function such as abs will be a genuine
+ function may write
+
+<pre>
+          #undef abs
+</pre>
+ whether the implementation's header provides a macro implementation of abs or a built-in
+ implementation. The prototype for the function, which precedes and is hidden by any macro
+ definition, is thereby revealed also.
+</small>
+<p><small><a name="note164" href="#note164">164)</a> Thus, a signal handler cannot, in general, call standard library functions.
+</small>
+
+<h3><a name="7.2" href="#7.2">7.2 Diagnostics &lt;assert.h&gt;</a></h3>
+<p><!--para 1 -->
+ The header <a href="#7.2">&lt;assert.h&gt;</a> defines the assert macro and refers to another macro,
+<pre>
+         NDEBUG
+</pre>
+ which is not defined by <a href="#7.2">&lt;assert.h&gt;</a>. If NDEBUG is defined as a macro name at the
+ point in the source file where <a href="#7.2">&lt;assert.h&gt;</a> is included, the assert macro is defined
+ simply as
+<pre>
+         #define assert(ignore) ((void)0)
+</pre>
+ The assert macro is redefined according to the current state of NDEBUG each time that
+ <a href="#7.2">&lt;assert.h&gt;</a> is included.
+<p><!--para 2 -->
+ The assert macro shall be implemented as a macro, not as an actual function. If the
+ macro definition is suppressed in order to access an actual function, the behavior is
+ undefined.
+
+<h4><a name="7.2.1" href="#7.2.1">7.2.1 Program diagnostics</a></h4>
+
+<h5><a name="7.2.1.1" href="#7.2.1.1">7.2.1.1 The assert macro</a></h5>
+<p><b>Synopsis</b>
+<p><!--para 1 -->
+<pre>
+         #include <a href="#7.2">&lt;assert.h&gt;</a>
+         void assert(scalar expression);
+</pre>
+<p><b>Description</b>
+<p><!--para 2 -->
+ The assert macro puts diagnostic tests into programs; it expands to a void expression.
+ When it is executed, if expression (which shall have a scalar type) is false (that is,
+ compares equal to 0), the assert macro writes information about the particular call that
+ failed (including the text of the argument, the name of the source file, the source line
+ number, and the name of the enclosing function -- the latter are respectively the values of
+ the preprocessing macros __FILE__ and __LINE__ and of the identifier
+ __func__) on the standard error stream in an implementation-defined format.<sup><a href="#note165"><b>165)</b></a></sup> It
+ then calls the abort function.
+<p><b>Returns</b>
+<p><!--para 3 -->
+ The assert macro returns no value.
+<p><b> Forward references</b>: the abort function (<a href="#7.20.4.1">7.20.4.1</a>).
+<!--page 182 -->
+
+<p><b>Footnotes</b>
+<p><small><a name="note165" href="#note165">165)</a> The message written might be of the form:
+ Assertion failed: expression, function abc, file xyz, line nnn.
+</small>
+
+<h3><a name="7.3" href="#7.3">7.3 Complex arithmetic &lt;complex.h&gt;</a></h3>
+
+<h4><a name="7.3.1" href="#7.3.1">7.3.1 Introduction</a></h4>
+<p><!--para 1 -->
+ The header <a href="#7.3">&lt;complex.h&gt;</a> defines macros and declares functions that support complex
+ arithmetic.<sup><a href="#note166"><b>166)</b></a></sup> Each synopsis specifies a family of functions consisting of a principal
+ function with one or more double complex parameters and a double complex or
+ double return value; and other functions with the same name but with f and l suffixes
+ which are corresponding functions with float and long double parameters and
+ return values.
+<p><!--para 2 -->
+ The macro
+<pre>
+          complex
+</pre>
+ expands to _Complex; the macro
+<pre>
+          _Complex_I
+</pre>
+ expands to a constant expression of type const float _Complex, with the value of
+ the imaginary unit.<sup><a href="#note167"><b>167)</b></a></sup>
+<p><!--para 3 -->
+ The macros
+<pre>
+          imaginary
+</pre>
+ and
+<pre>
+          _Imaginary_I
+</pre>
+ are defined if and only if the implementation supports imaginary types;<sup><a href="#note168"><b>168)</b></a></sup> if defined,
+ they expand to _Imaginary and a constant expression of type const float
+ _Imaginary with the value of the imaginary unit.
+<p><!--para 4 -->
+ The macro
+<pre>
+          I
+</pre>
+ expands to either _Imaginary_I or _Complex_I. If _Imaginary_I is not
+ defined, I shall expand to _Complex_I.
+<p><!--para 5 -->
+ Notwithstanding the provisions of <a href="#7.1.3">7.1.3</a>, a program may undefine and perhaps then
+ redefine the macros complex, imaginary, and I.
+<p><b> Forward references</b>: IEC 60559-compatible complex arithmetic (<a href="#G">annex G</a>).
+<!--page 183 -->
+
+<p><b>Footnotes</b>
+<p><small><a name="note166" href="#note166">166)</a> See ''future library directions'' (<a href="#7.26.1">7.26.1</a>).
+</small>
+<p><small><a name="note167" href="#note167">167)</a> The imaginary unit is a number i such that i<sup>2</sup>  = -1.
+</small>
+<p><small><a name="note168" href="#note168">168)</a> A specification for imaginary types is in informative <a href="#G">annex G</a>.
+</small>
+
+<h4><a name="7.3.2" href="#7.3.2">7.3.2 Conventions</a></h4>
+<p><!--para 1 -->
+ Values are interpreted as radians, not degrees. An implementation may set errno but is
+ not required to.
+
+<h4><a name="7.3.3" href="#7.3.3">7.3.3 Branch cuts</a></h4>
+<p><!--para 1 -->
+ Some of the functions below have branch cuts, across which the function is
+ discontinuous. For implementations with a signed zero (including all IEC 60559
+ implementations) that follow the specifications of <a href="#G">annex G</a>, the sign of zero distinguishes
+ one side of a cut from another so the function is continuous (except for format
+ limitations) as the cut is approached from either side. For example, for the square root
+ function, which has a branch cut along the negative real axis, the top of the cut, with
+ imaginary part +0, maps to the positive imaginary axis, and the bottom of the cut, with
+ imaginary part -0, maps to the negative imaginary axis.
+<p><!--para 2 -->
+ Implementations that do not support a signed zero (see <a href="#F">annex F</a>) cannot distinguish the
+ sides of branch cuts. These implementations shall map a cut so the function is continuous
+ as the cut is approached coming around the finite endpoint of the cut in a counter
+ clockwise direction. (Branch cuts for the functions specified here have just one finite
+ endpoint.) For example, for the square root function, coming counter clockwise around
+ the finite endpoint of the cut along the negative real axis approaches the cut from above,
+ so the cut maps to the positive imaginary axis.
+
+<h4><a name="7.3.4" href="#7.3.4">7.3.4 The CX_LIMITED_RANGE pragma</a></h4>
+<p><b>Synopsis</b>
+<p><!--para 1 -->
+<pre>
+          #include <a href="#7.3">&lt;complex.h&gt;</a>
+          #pragma STDC CX_LIMITED_RANGE on-off-switch
+</pre>
+<p><b>Description</b>
+<p><!--para 2 -->
+ The usual mathematical formulas for complex multiply, divide, and absolute value are
+ problematic because of their treatment of infinities and because of undue overflow and
+ underflow. The CX_LIMITED_RANGE pragma can be used to inform the
+ implementation that (where the state is ''on'') the usual mathematical formulas are
+ acceptable.<sup><a href="#note169"><b>169)</b></a></sup> The pragma can occur either outside external declarations or preceding all
+ explicit declarations and statements inside a compound statement. When outside external
+<!--page 184 -->
+ declarations, the pragma takes effect from its occurrence until another
+ CX_LIMITED_RANGE pragma is encountered, or until the end of the translation unit.
+ When inside a compound statement, the pragma takes effect from its occurrence until
+ another CX_LIMITED_RANGE pragma is encountered (including within a nested
+ compound statement), or until the end of the compound statement; at the end of a
+ compound statement the state for the pragma is restored to its condition just before the
+ compound statement. If this pragma is used in any other context, the behavior is
+ undefined. The default state for the pragma is ''off''.
+
+<p><b>Footnotes</b>
+<p><small><a name="note169" href="#note169">169)</a> The purpose of the pragma is to allow the implementation to use the formulas:
+
+<pre>
+     (x + iy) x (u + iv) = (xu - yv) + i(yu + xv)
+     (x + iy) / (u + iv) = [(xu + yv) + i(yu - xv)]/(u<sup>2</sup> + v<sup>2</sup>)
+     | x + iy | = (sqrt)(x<sup>2</sup> + y<sup>2</sup>)
+</pre>
+ where the programmer can determine they are safe.
+</small>
+
+<h4><a name="7.3.5" href="#7.3.5">7.3.5 Trigonometric functions</a></h4>
+
+<h5><a name="7.3.5.1" href="#7.3.5.1">7.3.5.1 The cacos functions</a></h5>
+<p><b>Synopsis</b>
+<p><!--para 1 -->
+<pre>
+        #include <a href="#7.3">&lt;complex.h&gt;</a>
+        double complex cacos(double complex z);
+        float complex cacosf(float complex z);
+        long double complex cacosl(long double complex z);
+</pre>
+<p><b>Description</b>
+<p><!--para 2 -->
+ The cacos functions compute the complex arc cosine of z, with branch cuts outside the
+ interval [-1, +1] along the real axis.
+<p><b>Returns</b>
+<p><!--para 3 -->
+ The cacos functions return the complex arc cosine value, in the range of a strip
+ mathematically unbounded along the imaginary axis and in the interval [0, pi ] along the
+ real axis.
+
+<h5><a name="7.3.5.2" href="#7.3.5.2">7.3.5.2 The casin functions</a></h5>
+<p><b>Synopsis</b>
+<p><!--para 1 -->
+<pre>
+        #include <a href="#7.3">&lt;complex.h&gt;</a>
+        double complex casin(double complex z);
+        float complex casinf(float complex z);
+        long double complex casinl(long double complex z);
+</pre>
+<p><b>Description</b>
+<p><!--para 2 -->
+ The casin functions compute the complex arc sine of z, with branch cuts outside the
+ interval [-1, +1] along the real axis.
+<p><b>Returns</b>
+<p><!--para 3 -->
+ The casin functions return the complex arc sine value, in the range of a strip
+ mathematically unbounded along the imaginary axis and in the interval [-pi /2, +pi /2]
+ along the real axis.
+<!--page 185 -->
+
+<h5><a name="7.3.5.3" href="#7.3.5.3">7.3.5.3 The catan functions</a></h5>
+<p><b>Synopsis</b>
+<p><!--para 1 -->
+<pre>
+        #include <a href="#7.3">&lt;complex.h&gt;</a>
+        double complex catan(double complex z);
+        float complex catanf(float complex z);
+        long double complex catanl(long double complex z);
+</pre>
+<p><b>Description</b>
+<p><!--para 2 -->
+ The catan functions compute the complex arc tangent of z, with branch cuts outside the
+ interval [-i, +i] along the imaginary axis.
+<p><b>Returns</b>
+<p><!--para 3 -->
+ The catan functions return the complex arc tangent value, in the range of a strip
+ mathematically unbounded along the imaginary axis and in the interval [-pi /2, +pi /2]
+ along the real axis.
+
+<h5><a name="7.3.5.4" href="#7.3.5.4">7.3.5.4 The ccos functions</a></h5>
+<p><b>Synopsis</b>
+<p><!--para 1 -->
+<pre>
+        #include <a href="#7.3">&lt;complex.h&gt;</a>
+        double complex ccos(double complex z);
+        float complex ccosf(float complex z);
+        long double complex ccosl(long double complex z);
+</pre>
+<p><b>Description</b>
+<p><!--para 2 -->
+ The ccos functions compute the complex cosine of z.
+<p><b>Returns</b>
+<p><!--para 3 -->
+ The ccos functions return the complex cosine value.
+
+<h5><a name="7.3.5.5" href="#7.3.5.5">7.3.5.5 The csin functions</a></h5>
+<p><b>Synopsis</b>
+<p><!--para 1 -->
+<pre>
+        #include <a href="#7.3">&lt;complex.h&gt;</a>
+        double complex csin(double complex z);
+        float complex csinf(float complex z);
+        long double complex csinl(long double complex z);
+</pre>
+<p><b>Description</b>
+<p><!--para 2 -->
+ The csin functions compute the complex sine of z.
+<p><b>Returns</b>
+<p><!--para 3 -->
+ The csin functions return the complex sine value.
+<!--page 186 -->
+
+<h5><a name="7.3.5.6" href="#7.3.5.6">7.3.5.6 The ctan functions</a></h5>
+<p><b>Synopsis</b>
+<p><!--para 1 -->
+<pre>
+        #include <a href="#7.3">&lt;complex.h&gt;</a>
+        double complex ctan(double complex z);
+        float complex ctanf(float complex z);
+        long double complex ctanl(long double complex z);
+</pre>
+<p><b>Description</b>
+<p><!--para 2 -->
+ The ctan functions compute the complex tangent of z.
+<p><b>Returns</b>
+<p><!--para 3 -->
+ The ctan functions return the complex tangent value.
+
+<h4><a name="7.3.6" href="#7.3.6">7.3.6 Hyperbolic functions</a></h4>
+
+<h5><a name="7.3.6.1" href="#7.3.6.1">7.3.6.1 The cacosh functions</a></h5>
+<p><b>Synopsis</b>
+<p><!--para 1 -->
+<pre>
+        #include <a href="#7.3">&lt;complex.h&gt;</a>
+        double complex cacosh(double complex z);
+        float complex cacoshf(float complex z);
+        long double complex cacoshl(long double complex z);
+</pre>
+<p><b>Description</b>
+<p><!--para 2 -->
+ The cacosh functions compute the complex arc hyperbolic cosine of z, with a branch
+ cut at values less than 1 along the real axis.
+<p><b>Returns</b>
+<p><!--para 3 -->
+ The cacosh functions return the complex arc hyperbolic cosine value, in the range of a
+ half-strip of non-negative values along the real axis and in the interval [-ipi , +ipi ] along
+ the imaginary axis.
+
+<h5><a name="7.3.6.2" href="#7.3.6.2">7.3.6.2 The casinh functions</a></h5>
+<p><b>Synopsis</b>
+<p><!--para 1 -->
+<pre>
+        #include <a href="#7.3">&lt;complex.h&gt;</a>
+        double complex casinh(double complex z);
+        float complex casinhf(float complex z);
+        long double complex casinhl(long double complex z);
+</pre>
+<p><b>Description</b>
+<p><!--para 2 -->
+ The casinh functions compute the complex arc hyperbolic sine of z, with branch cuts
+ outside the interval [-i, +i] along the imaginary axis.
+<!--page 187 -->
+<p><b>Returns</b>
+<p><!--para 3 -->
+ The casinh functions return the complex arc hyperbolic sine value, in the range of a
+ strip mathematically unbounded along the real axis and in the interval [-ipi /2, +ipi /2]
+ along the imaginary axis.
+
+<h5><a name="7.3.6.3" href="#7.3.6.3">7.3.6.3 The catanh functions</a></h5>
+<p><b>Synopsis</b>
+<p><!--para 1 -->
+<pre>
+        #include <a href="#7.3">&lt;complex.h&gt;</a>
+        double complex catanh(double complex z);
+        float complex catanhf(float complex z);
+        long double complex catanhl(long double complex z);
+</pre>
+<p><b>Description</b>
+<p><!--para 2 -->
+ The catanh functions compute the complex arc hyperbolic tangent of z, with branch
+ cuts outside the interval [-1, +1] along the real axis.
+<p><b>Returns</b>
+<p><!--para 3 -->
+ The catanh functions return the complex arc hyperbolic tangent value, in the range of a
+ strip mathematically unbounded along the real axis and in the interval [-ipi /2, +ipi /2]
+ along the imaginary axis.
+
+<h5><a name="7.3.6.4" href="#7.3.6.4">7.3.6.4 The ccosh functions</a></h5>
+<p><b>Synopsis</b>
+<p><!--para 1 -->
+<pre>
+        #include <a href="#7.3">&lt;complex.h&gt;</a>
+        double complex ccosh(double complex z);
+        float complex ccoshf(float complex z);
+        long double complex ccoshl(long double complex z);
+</pre>
+<p><b>Description</b>
+<p><!--para 2 -->
+ The ccosh functions compute the complex hyperbolic cosine of z.
+<p><b>Returns</b>
+<p><!--para 3 -->
+ The ccosh functions return the complex hyperbolic cosine value.
+
+<h5><a name="7.3.6.5" href="#7.3.6.5">7.3.6.5 The csinh functions</a></h5>
+<p><b>Synopsis</b>
+<p><!--para 1 -->
+<!--page 188 -->
+<pre>
+        #include <a href="#7.3">&lt;complex.h&gt;</a>
+        double complex csinh(double complex z);
+        float complex csinhf(float complex z);
+        long double complex csinhl(long double complex z);
+</pre>
+<p><b>Description</b>
+<p><!--para 2 -->
+ The csinh functions compute the complex hyperbolic sine of z.
+<p><b>Returns</b>
+<p><!--para 3 -->
+ The csinh functions return the complex hyperbolic sine value.
+
+<h5><a name="7.3.6.6" href="#7.3.6.6">7.3.6.6 The ctanh functions</a></h5>
+<p><b>Synopsis</b>
+<p><!--para 1 -->
+<pre>
+        #include <a href="#7.3">&lt;complex.h&gt;</a>
+        double complex ctanh(double complex z);
+        float complex ctanhf(float complex z);
+        long double complex ctanhl(long double complex z);
+</pre>
+<p><b>Description</b>
+<p><!--para 2 -->
+ The ctanh functions compute the complex hyperbolic tangent of z.
+<p><b>Returns</b>
+<p><!--para 3 -->
+ The ctanh functions return the complex hyperbolic tangent value.
+
+<h4><a name="7.3.7" href="#7.3.7">7.3.7 Exponential and logarithmic functions</a></h4>
+
+<h5><a name="7.3.7.1" href="#7.3.7.1">7.3.7.1 The cexp functions</a></h5>
+<p><b>Synopsis</b>
+<p><!--para 1 -->
+<pre>
+        #include <a href="#7.3">&lt;complex.h&gt;</a>
+        double complex cexp(double complex z);
+        float complex cexpf(float complex z);
+        long double complex cexpl(long double complex z);
+</pre>
+<p><b>Description</b>
+<p><!--para 2 -->
+ The cexp functions compute the complex base-e exponential of z.
+<p><b>Returns</b>
+<p><!--para 3 -->
+ The cexp functions return the complex base-e exponential value.
+
+<h5><a name="7.3.7.2" href="#7.3.7.2">7.3.7.2 The clog functions</a></h5>
+<p><b>Synopsis</b>
+<p><!--para 1 -->
+<!--page 189 -->
+<pre>
+        #include <a href="#7.3">&lt;complex.h&gt;</a>
+        double complex clog(double complex z);
+        float complex clogf(float complex z);
+        long double complex clogl(long double complex z);
+</pre>
+<p><b>Description</b>
+<p><!--para 2 -->
+ The clog functions compute the complex natural (base-e) logarithm of z, with a branch
+ cut along the negative real axis.
+<p><b>Returns</b>
+<p><!--para 3 -->
+ The clog functions return the complex natural logarithm value, in the range of a strip
+ mathematically unbounded along the real axis and in the interval [-ipi , +ipi ] along the
+ imaginary axis.
+
+<h4><a name="7.3.8" href="#7.3.8">7.3.8 Power and absolute-value functions</a></h4>
+
+<h5><a name="7.3.8.1" href="#7.3.8.1">7.3.8.1 The cabs functions</a></h5>
+<p><b>Synopsis</b>
+<p><!--para 1 -->
+<pre>
+        #include <a href="#7.3">&lt;complex.h&gt;</a>
+        double cabs(double complex z);
+        float cabsf(float complex z);
+        long double cabsl(long double complex z);
+</pre>
+<p><b>Description</b>
+<p><!--para 2 -->
+ The cabs functions compute the complex absolute value (also called norm, modulus, or
+ magnitude) of z.
+<p><b>Returns</b>
+<p><!--para 3 -->
+ The cabs functions return the complex absolute value.
+
+<h5><a name="7.3.8.2" href="#7.3.8.2">7.3.8.2 The cpow functions</a></h5>
+<p><b>Synopsis</b>
+<p><!--para 1 -->
+<pre>
+        #include <a href="#7.3">&lt;complex.h&gt;</a>
+        double complex cpow(double complex x, double complex y);
+        float complex cpowf(float complex x, float complex y);
+        long double complex cpowl(long double complex x,
+             long double complex y);
+</pre>
+<p><b>Description</b>
+<p><!--para 2 -->
+ The cpow functions compute the complex power function xy , with a branch cut for the
+ first parameter along the negative real axis.
+<p><b>Returns</b>
+<p><!--para 3 -->
+ The cpow functions return the complex power function value.
+<!--page 190 -->
+
+<h5><a name="7.3.8.3" href="#7.3.8.3">7.3.8.3 The csqrt functions</a></h5>
+<p><b>Synopsis</b>
+<p><!--para 1 -->
+<pre>
+        #include <a href="#7.3">&lt;complex.h&gt;</a>
+        double complex csqrt(double complex z);
+        float complex csqrtf(float complex z);
+        long double complex csqrtl(long double complex z);
+</pre>
+<p><b>Description</b>
+<p><!--para 2 -->
+ The csqrt functions compute the complex square root of z, with a branch cut along the
+ negative real axis.
+<p><b>Returns</b>
+<p><!--para 3 -->
+ The csqrt functions return the complex square root value, in the range of the right half-
+ plane (including the imaginary axis).
+
+<h4><a name="7.3.9" href="#7.3.9">7.3.9 Manipulation functions</a></h4>
+
+<h5><a name="7.3.9.1" href="#7.3.9.1">7.3.9.1 The carg functions</a></h5>
+<p><b>Synopsis</b>
+<p><!--para 1 -->
+<pre>
+        #include <a href="#7.3">&lt;complex.h&gt;</a>
+        double carg(double complex z);
+        float cargf(float complex z);
+        long double cargl(long double complex z);
+</pre>
+<p><b>Description</b>
+<p><!--para 2 -->
+ The carg functions compute the argument (also called phase angle) of z, with a branch
+ cut along the negative real axis.
+<p><b>Returns</b>
+<p><!--para 3 -->
+ The carg functions return the value of the argument in the interval [-pi , +pi ].
+
+<h5><a name="7.3.9.2" href="#7.3.9.2">7.3.9.2 The cimag functions</a></h5>
+<p><b>Synopsis</b>
+<p><!--para 1 -->
+<!--page 191 -->
+<pre>
+        #include <a href="#7.3">&lt;complex.h&gt;</a>
+        double cimag(double complex z);
+        float cimagf(float complex z);
+        long double cimagl(long double complex z);
+</pre>
+<p><b>Description</b>
+<p><!--para 2 -->
+ The cimag functions compute the imaginary part of z.<sup><a href="#note170"><b>170)</b></a></sup>
+<p><b>Returns</b>
+<p><!--para 3 -->
+ The cimag functions return the imaginary part value (as a real).
+
+<p><b>Footnotes</b>
+<p><small><a name="note170" href="#note170">170)</a> For a variable z of complex type, z == creal(z) + cimag(z)*I.
+</small>
+
+<h5><a name="7.3.9.3" href="#7.3.9.3">7.3.9.3 The conj functions</a></h5>
+<p><b>Synopsis</b>
+<p><!--para 1 -->
+<pre>
+        #include <a href="#7.3">&lt;complex.h&gt;</a>
+        double complex conj(double complex z);
+        float complex conjf(float complex z);
+        long double complex conjl(long double complex z);
+</pre>
+<p><b>Description</b>
+<p><!--para 2 -->
+ The conj functions compute the complex conjugate of z, by reversing the sign of its
+ imaginary part.
+<p><b>Returns</b>
+<p><!--para 3 -->
+ The conj functions return the complex conjugate value.
+
+<h5><a name="7.3.9.4" href="#7.3.9.4">7.3.9.4 The cproj functions</a></h5>
+<p><b>Synopsis</b>
+<p><!--para 1 -->
+<pre>
+        #include <a href="#7.3">&lt;complex.h&gt;</a>
+        double complex cproj(double complex z);
+        float complex cprojf(float complex z);
+        long double complex cprojl(long double complex z);
+</pre>
+<p><b>Description</b>
+<p><!--para 2 -->
+ The cproj functions compute a projection of z onto the Riemann sphere: z projects to
+ z except that all complex infinities (even those with one infinite part and one NaN part)
+ project to positive infinity on the real axis. If z has an infinite part, then cproj(z) is
+ equivalent to
+<pre>
+        INFINITY + I * copysign(0.0, cimag(z))
+</pre>
+<p><b>Returns</b>
+<p><!--para 3 -->
+ The cproj functions return the value of the projection onto the Riemann sphere.
+<!--page 192 -->
+
+<h5><a name="7.3.9.5" href="#7.3.9.5">7.3.9.5 The creal functions</a></h5>
+<p><b>Synopsis</b>
+<p><!--para 1 -->
+<pre>
+        #include <a href="#7.3">&lt;complex.h&gt;</a>
+        double creal(double complex z);
+        float crealf(float complex z);
+        long double creall(long double complex z);
+</pre>
+<p><b>Description</b>
+<p><!--para 2 -->
+ The creal functions compute the real part of z.<sup><a href="#note171"><b>171)</b></a></sup>
+<p><b>Returns</b>
+<p><!--para 3 -->
+ The creal functions return the real part value.
+<!--page 193 -->
+
+<p><b>Footnotes</b>
+<p><small><a name="note171" href="#note171">171)</a> For a variable z of complex type, z == creal(z) + cimag(z)*I.
+</small>
+
+<h3><a name="7.4" href="#7.4">7.4 Character handling &lt;ctype.h&gt;</a></h3>
+<p><!--para 1 -->
+ The header <a href="#7.4">&lt;ctype.h&gt;</a> declares several functions useful for classifying and mapping
+ characters.<sup><a href="#note172"><b>172)</b></a></sup> In all cases the argument is an int, the value of which shall be
+ representable as an unsigned char or shall equal the value of the macro EOF. If the
+ argument has any other value, the behavior is undefined.
+<p><!--para 2 -->
+ The behavior of these functions is affected by the current locale. Those functions that
+ have locale-specific aspects only when not in the "C" locale are noted below.
+<p><!--para 3 -->
+ The term printing character refers to a member of a locale-specific set of characters, each
+ of which occupies one printing position on a display device; the term control character
+ refers to a member of a locale-specific set of characters that are not printing
+ characters.<sup><a href="#note173"><b>173)</b></a></sup> All letters and digits are printing characters.
+<p><b> Forward references</b>: EOF (<a href="#7.19.1">7.19.1</a>), localization (<a href="#7.11">7.11</a>).
+
+<p><b>Footnotes</b>
+<p><small><a name="note172" href="#note172">172)</a> See ''future library directions'' (<a href="#7.26.2">7.26.2</a>).
+</small>
+<p><small><a name="note173" href="#note173">173)</a> In an implementation that uses the seven-bit US ASCII character set, the printing characters are those
+ whose values lie from 0x20 (space) through 0x7E (tilde); the control characters are those whose
+ values lie from 0 (NUL) through 0x1F (US), and the character 0x7F (DEL).
+</small>
+
+<h4><a name="7.4.1" href="#7.4.1">7.4.1 Character classification functions</a></h4>
+<p><!--para 1 -->
+ The functions in this subclause return nonzero (true) if and only if the value of the
+ argument c conforms to that in the description of the function.
+
+<h5><a name="7.4.1.1" href="#7.4.1.1">7.4.1.1 The isalnum function</a></h5>
+<p><b>Synopsis</b>
+<p><!--para 1 -->
+<pre>
+          #include <a href="#7.4">&lt;ctype.h&gt;</a>
+          int isalnum(int c);
+</pre>
+<p><b>Description</b>
+<p><!--para 2 -->
+ The isalnum function tests for any character for which isalpha or isdigit is true.
+
+<h5><a name="7.4.1.2" href="#7.4.1.2">7.4.1.2 The isalpha function</a></h5>
+<p><b>Synopsis</b>
+<p><!--para 1 -->
+<pre>
+          #include <a href="#7.4">&lt;ctype.h&gt;</a>
+          int isalpha(int c);
+</pre>
+<p><b>Description</b>
+<p><!--para 2 -->
+ The isalpha function tests for any character for which isupper or islower is true,
+ or any character that is one of a locale-specific set of alphabetic characters for which
+<!--page 194 -->
+ none of iscntrl, isdigit, ispunct, or isspace is true.<sup><a href="#note174"><b>174)</b></a></sup> In the "C" locale,
+ isalpha returns true only for the characters for which isupper or islower is true.
+
+<p><b>Footnotes</b>
+<p><small><a name="note174" href="#note174">174)</a> The functions islower and isupper test true or false separately for each of these additional
+ characters; all four combinations are possible.
+</small>
+
+<h5><a name="7.4.1.3" href="#7.4.1.3">7.4.1.3 The isblank function</a></h5>
+<p><b>Synopsis</b>
+<p><!--para 1 -->
+<pre>
+         #include <a href="#7.4">&lt;ctype.h&gt;</a>
+         int isblank(int c);
+</pre>
+<p><b>Description</b>
+<p><!--para 2 -->
+ The isblank function tests for any character that is a standard blank character or is one
+ of a locale-specific set of characters for which isspace is true and that is used to
+ separate words within a line of text. The standard blank characters are the following:
+ space (' '), and horizontal tab ('\t'). In the "C" locale, isblank returns true only
+ for the standard blank characters.
+
+<h5><a name="7.4.1.4" href="#7.4.1.4">7.4.1.4 The iscntrl function</a></h5>
+<p><b>Synopsis</b>
+<p><!--para 1 -->
+<pre>
+         #include <a href="#7.4">&lt;ctype.h&gt;</a>
+         int iscntrl(int c);
+</pre>
+<p><b>Description</b>
+<p><!--para 2 -->
+ The iscntrl function tests for any control character.
+
+<h5><a name="7.4.1.5" href="#7.4.1.5">7.4.1.5 The isdigit function</a></h5>
+<p><b>Synopsis</b>
+<p><!--para 1 -->
+<pre>
+         #include <a href="#7.4">&lt;ctype.h&gt;</a>
+         int isdigit(int c);
+</pre>
+<p><b>Description</b>
+<p><!--para 2 -->
+ The isdigit function tests for any decimal-digit character (as defined in <a href="#5.2.1">5.2.1</a>).
+
+<h5><a name="7.4.1.6" href="#7.4.1.6">7.4.1.6 The isgraph function</a></h5>
+<p><b>Synopsis</b>
+<p><!--para 1 -->
+<pre>
+         #include <a href="#7.4">&lt;ctype.h&gt;</a>
+         int isgraph(int c);
+</pre>
+<!--page 195 -->
+<p><b>Description</b>
+<p><!--para 2 -->
+ The isgraph function tests for any printing character except space (' ').
+
+<h5><a name="7.4.1.7" href="#7.4.1.7">7.4.1.7 The islower function</a></h5>
+<p><b>Synopsis</b>
+<p><!--para 1 -->
+<pre>
+        #include <a href="#7.4">&lt;ctype.h&gt;</a>
+        int islower(int c);
+</pre>
+<p><b>Description</b>
+<p><!--para 2 -->
+ The islower function tests for any character that is a lowercase letter or is one of a
+ locale-specific set of characters for which none of iscntrl, isdigit, ispunct, or
+ isspace is true. In the "C" locale, islower returns true only for the lowercase
+ letters (as defined in <a href="#5.2.1">5.2.1</a>).
+
+<h5><a name="7.4.1.8" href="#7.4.1.8">7.4.1.8 The isprint function</a></h5>
+<p><b>Synopsis</b>
+<p><!--para 1 -->
+<pre>
+        #include <a href="#7.4">&lt;ctype.h&gt;</a>
+        int isprint(int c);
+</pre>
+<p><b>Description</b>
+<p><!--para 2 -->
+ The isprint function tests for any printing character including space (' ').
+
+<h5><a name="7.4.1.9" href="#7.4.1.9">7.4.1.9 The ispunct function</a></h5>
+<p><b>Synopsis</b>
+<p><!--para 1 -->
+<pre>
+        #include <a href="#7.4">&lt;ctype.h&gt;</a>
+        int ispunct(int c);
+</pre>
+<p><b>Description</b>
+<p><!--para 2 -->
+ The ispunct function tests for any printing character that is one of a locale-specific set
+ of punctuation characters for which neither isspace nor isalnum is true. In the "C"
+ locale, ispunct returns true for every printing character for which neither isspace
+ nor isalnum is true.
+
+<h5><a name="7.4.1.10" href="#7.4.1.10">7.4.1.10 The isspace function</a></h5>
+<p><b>Synopsis</b>
+<p><!--para 1 -->
+<pre>
+        #include <a href="#7.4">&lt;ctype.h&gt;</a>
+        int isspace(int c);
+</pre>
+<p><b>Description</b>
+<p><!--para 2 -->
+ The isspace function tests for any character that is a standard white-space character or
+ is one of a locale-specific set of characters for which isalnum is false. The standard
+<!--page 196 -->
+ white-space characters are the following: space (' '), form feed ('\f'), new-line
+ ('\n'), carriage return ('\r'), horizontal tab ('\t'), and vertical tab ('\v'). In the
+ "C" locale, isspace returns true only for the standard white-space characters.
+
+<h5><a name="7.4.1.11" href="#7.4.1.11">7.4.1.11 The isupper function</a></h5>
+<p><b>Synopsis</b>
+<p><!--para 1 -->
+<pre>
+        #include <a href="#7.4">&lt;ctype.h&gt;</a>
+        int isupper(int c);
+</pre>
+<p><b>Description</b>
+<p><!--para 2 -->
+ The isupper function tests for any character that is an uppercase letter or is one of a
+ locale-specific set of characters for which none of iscntrl, isdigit, ispunct, or
+ isspace is true. In the "C" locale, isupper returns true only for the uppercase
+ letters (as defined in <a href="#5.2.1">5.2.1</a>).
+
+<h5><a name="7.4.1.12" href="#7.4.1.12">7.4.1.12 The isxdigit function</a></h5>
+<p><b>Synopsis</b>
+<p><!--para 1 -->
+<pre>
+        #include <a href="#7.4">&lt;ctype.h&gt;</a>
+        int isxdigit(int c);
+</pre>
+<p><b>Description</b>
+<p><!--para 2 -->
+ The isxdigit function tests for any hexadecimal-digit character (as defined in <a href="#6.4.4.1">6.4.4.1</a>).
+
+<h4><a name="7.4.2" href="#7.4.2">7.4.2 Character case mapping functions</a></h4>
+
+<h5><a name="7.4.2.1" href="#7.4.2.1">7.4.2.1 The tolower function</a></h5>
+<p><b>Synopsis</b>
+<p><!--para 1 -->
+<pre>
+        #include <a href="#7.4">&lt;ctype.h&gt;</a>
+        int tolower(int c);
+</pre>
+<p><b>Description</b>
+<p><!--para 2 -->
+ The tolower function converts an uppercase letter to a corresponding lowercase letter.
+<p><b>Returns</b>
+<p><!--para 3 -->
+ If the argument is a character for which isupper is true and there are one or more
+ corresponding characters, as specified by the current locale, for which islower is true,
+ the tolower function returns one of the corresponding characters (always the same one
+ for any given locale); otherwise, the argument is returned unchanged.
+<!--page 197 -->
+
+<h5><a name="7.4.2.2" href="#7.4.2.2">7.4.2.2 The toupper function</a></h5>
+<p><b>Synopsis</b>
+<p><!--para 1 -->
+<pre>
+        #include <a href="#7.4">&lt;ctype.h&gt;</a>
+        int toupper(int c);
+</pre>
+<p><b>Description</b>
+<p><!--para 2 -->
+ The toupper function converts a lowercase letter to a corresponding uppercase letter.
+<p><b>Returns</b>
+<p><!--para 3 -->
+ If the argument is a character for which islower is true and there are one or more
+ corresponding characters, as specified by the current locale, for which isupper is true,
+ the toupper function returns one of the corresponding characters (always the same one
+ for any given locale); otherwise, the argument is returned unchanged.
+<!--page 198 -->
+
+<h3><a name="7.5" href="#7.5">7.5 Errors &lt;errno.h&gt;</a></h3>
+<p><!--para 1 -->
+ The header <a href="#7.5">&lt;errno.h&gt;</a> defines several macros, all relating to the reporting of error
+ conditions.
+<p><!--para 2 -->
+ The macros are
+<pre>
+          EDOM
+          EILSEQ
+          ERANGE
+</pre>
+ which expand to integer constant expressions with type int, distinct positive values, and
+ which are suitable for use in #if preprocessing directives; and
+<pre>
+          errno
+</pre>
+ which expands to a modifiable lvalue<sup><a href="#note175"><b>175)</b></a></sup> that has type int, the value of which is set to a
+ positive error number by several library functions. It is unspecified whether errno is a
+ macro or an identifier declared with external linkage. If a macro definition is suppressed
+ in order to access an actual object, or a program defines an identifier with the name
+ errno, the behavior is undefined.
+<p><!--para 3 -->
+ The value of errno is zero at program startup, but is never set to zero by any library
+ function.<sup><a href="#note176"><b>176)</b></a></sup> The value of errno may be set to nonzero by a library function call
+ whether or not there is an error, provided the use of errno is not documented in the
+ description of the function in this International Standard.
+<p><!--para 4 -->
+ Additional macro definitions, beginning with E and a digit or E and an uppercase
+ letter,<sup><a href="#note177"><b>177)</b></a></sup> may also be specified by the implementation.
+<!--page 199 -->
+
+<p><b>Footnotes</b>
+<p><small><a name="note175" href="#note175">175)</a> The macro errno need not be the identifier of an object. It might expand to a modifiable lvalue
+ resulting from a function call (for example, *errno()).
+</small>
+<p><small><a name="note176" href="#note176">176)</a> Thus, a program that uses errno for error checking should set it to zero before a library function call,
+ then inspect it before a subsequent library function call. Of course, a library function can save the
+ value of errno on entry and then set it to zero, as long as the original value is restored if errno's
+ value is still zero just before the return.
+</small>
+<p><small><a name="note177" href="#note177">177)</a> See ''future library directions'' (<a href="#7.26.3">7.26.3</a>).
+</small>
+
+<h3><a name="7.6" href="#7.6">7.6 Floating-point environment &lt;fenv.h&gt;</a></h3>
+<p><!--para 1 -->
+ The header <a href="#7.6">&lt;fenv.h&gt;</a> declares two types and several macros and functions to provide
+ access to the floating-point environment. The floating-point environment refers
+ collectively to any floating-point status flags and control modes supported by the
+ implementation.<sup><a href="#note178"><b>178)</b></a></sup> A floating-point status flag is a system variable whose value is set
+ (but never cleared) when a floating-point exception is raised, which occurs as a side effect
+ of exceptional floating-point arithmetic to provide auxiliary information.<sup><a href="#note179"><b>179)</b></a></sup> A floating-
+ point control mode is a system variable whose value may be set by the user to affect the
+ subsequent behavior of floating-point arithmetic.
+<p><!--para 2 -->
+ Certain programming conventions support the intended model of use for the floating-
+ point environment:<sup><a href="#note180"><b>180)</b></a></sup>
+<ul>
+<li>  a function call does not alter its caller's floating-point control modes, clear its caller's
+ floating-point status flags, nor depend on the state of its caller's floating-point status
+ flags unless the function is so documented;
+<li>  a function call is assumed to require default floating-point control modes, unless its
+ documentation promises otherwise;
+<li>  a function call is assumed to have the potential for raising floating-point exceptions,
+ unless its documentation promises otherwise.
+</ul>
+<p><!--para 3 -->
+ The type
+<pre>
+         fenv_t
+</pre>
+ represents the entire floating-point environment.
+<p><!--para 4 -->
+ The type
+<pre>
+         fexcept_t
+</pre>
+ represents the floating-point status flags collectively, including any status the
+ implementation associates with the flags.
+<!--page 200 -->
+<p><!--para 5 -->
+ Each of the macros
+<pre>
+         FE_DIVBYZERO
+         FE_INEXACT
+         FE_INVALID
+         FE_OVERFLOW
+         FE_UNDERFLOW
+</pre>
+ is defined if and only if the implementation supports the floating-point exception by
+ means of the functions in 7.6.2.<sup><a href="#note181"><b>181)</b></a></sup> Additional implementation-defined floating-point
+ exceptions, with macro definitions beginning with FE_ and an uppercase letter, may also
+ be specified by the implementation. The defined macros expand to integer constant
+ expressions with values such that bitwise ORs of all combinations of the macros result in
+ distinct values, and furthermore, bitwise ANDs of all combinations of the macros result in
+ zero.<sup><a href="#note182"><b>182)</b></a></sup>
+<p><!--para 6 -->
+ The macro
+<pre>
+         FE_ALL_EXCEPT
+</pre>
+ is simply the bitwise OR of all floating-point exception macros defined by the
+ implementation. If no such macros are defined, FE_ALL_EXCEPT shall be defined as 0.
+<p><!--para 7 -->
+ Each of the macros
+<pre>
+         FE_DOWNWARD
+         FE_TONEAREST
+         FE_TOWARDZERO
+         FE_UPWARD
+</pre>
+ is defined if and only if the implementation supports getting and setting the represented
+ rounding direction by means of the fegetround and fesetround functions.
+ Additional implementation-defined rounding directions, with macro definitions beginning
+ with FE_ and an uppercase letter, may also be specified by the implementation. The
+ defined macros expand to integer constant expressions whose values are distinct
+ nonnegative values.<sup><a href="#note183"><b>183)</b></a></sup>
+<p><!--para 8 -->
+ The macro
+<!--page 201 -->
+<pre>
+          FE_DFL_ENV
+</pre>
+ represents the default floating-point environment -- the one installed at program startup
+ -- and has type ''pointer to const-qualified fenv_t''. It can be used as an argument to
+ <a href="#7.6">&lt;fenv.h&gt;</a> functions that manage the floating-point environment.
+<p><!--para 9 -->
+ Additional implementation-defined environments, with macro definitions beginning with
+ FE_ and an uppercase letter, and having type ''pointer to const-qualified fenv_t'', may
+ also be specified by the implementation.
+
+<p><b>Footnotes</b>
+<p><small><a name="note178" href="#note178">178)</a> This header is designed to support the floating-point exception status flags and directed-rounding
+ control modes required by IEC 60559, and other similar floating-point state information. Also it is
+ designed to facilitate code portability among all systems.
+</small>
+<p><small><a name="note179" href="#note179">179)</a> A floating-point status flag is not an object and can be set more than once within an expression.
+</small>
+<p><small><a name="note180" href="#note180">180)</a> With these conventions, a programmer can safely assume default floating-point control modes (or be
+ unaware of them). The responsibilities associated with accessing the floating-point environment fall
+ on the programmer or program that does so explicitly.
+</small>
+<p><small><a name="note181" href="#note181">181)</a> The implementation supports an exception if there are circumstances where a call to at least one of the
+ functions in <a href="#7.6.2">7.6.2</a>, using the macro as the appropriate argument, will succeed. It is not necessary for
+ all the functions to succeed all the time.
+</small>
+<p><small><a name="note182" href="#note182">182)</a> The macros should be distinct powers of two.
+</small>
+<p><small><a name="note183" href="#note183">183)</a> Even though the rounding direction macros may expand to constants corresponding to the values of
+ FLT_ROUNDS, they are not required to do so.
+</small>
+
+<h4><a name="7.6.1" href="#7.6.1">7.6.1 The FENV_ACCESS pragma</a></h4>
+<p><b>Synopsis</b>
+<p><!--para 1 -->
+<pre>
+          #include <a href="#7.6">&lt;fenv.h&gt;</a>
+          #pragma STDC FENV_ACCESS on-off-switch
+</pre>
+<p><b>Description</b>
+<p><!--para 2 -->
+ The FENV_ACCESS pragma provides a means to inform the implementation when a
+ program might access the floating-point environment to test floating-point status flags or
+ run under non-default floating-point control modes.<sup><a href="#note184"><b>184)</b></a></sup> The pragma shall occur either
+ outside external declarations or preceding all explicit declarations and statements inside a
+ compound statement. When outside external declarations, the pragma takes effect from
+ its occurrence until another FENV_ACCESS pragma is encountered, or until the end of
+ the translation unit. When inside a compound statement, the pragma takes effect from its
+ occurrence until another FENV_ACCESS pragma is encountered (including within a
+ nested compound statement), or until the end of the compound statement; at the end of a
+ compound statement the state for the pragma is restored to its condition just before the
+ compound statement. If this pragma is used in any other context, the behavior is
+ undefined. If part of a program tests floating-point status flags, sets floating-point control
+ modes, or runs under non-default mode settings, but was translated with the state for the
+ FENV_ACCESS pragma ''off'', the behavior is undefined. The default state (''on'' or
+ ''off'') for the pragma is implementation-defined. (When execution passes from a part of
+ the program translated with FENV_ACCESS ''off'' to a part translated with
+ FENV_ACCESS ''on'', the state of the floating-point status flags is unspecified and the
+ floating-point control modes have their default settings.)
+<!--page 202 -->
+<p><!--para 3 -->
+ EXAMPLE
+<pre>
+         #include <a href="#7.6">&lt;fenv.h&gt;</a>
+         void f(double x)
+         {
+               #pragma STDC FENV_ACCESS ON
+               void g(double);
+               void h(double);
+               /* ... */
+               g(x + 1);
+               h(x + 1);
+               /* ... */
+         }
+</pre>
+<p><!--para 4 -->
+ If the function g might depend on status flags set as a side effect of the first x + 1, or if the second
+ x + 1 might depend on control modes set as a side effect of the call to function g, then the program shall
+ contain an appropriately placed invocation of #pragma STDC FENV_ACCESS ON.<sup><a href="#note185"><b>185)</b></a></sup>
+
+<p><b>Footnotes</b>
+<p><small><a name="note184" href="#note184">184)</a> The purpose of the FENV_ACCESS pragma is to allow certain optimizations that could subvert flag
+ tests and mode changes (e.g., global common subexpression elimination, code motion, and constant
+ folding). In general, if the state of FENV_ACCESS is ''off'', the translator can assume that default
+ modes are in effect and the flags are not tested.
+</small>
+<p><small><a name="note185" href="#note185">185)</a> The side effects impose a temporal ordering that requires two evaluations of x + 1. On the other
+ hand, without the #pragma STDC FENV_ACCESS ON pragma, and assuming the default state is
+ ''off'', just one evaluation of x + 1 would suffice.
+</small>
+
+<h4><a name="7.6.2" href="#7.6.2">7.6.2 Floating-point exceptions</a></h4>
+<p><!--para 1 -->
+ The following functions provide access to the floating-point status flags.<sup><a href="#note186"><b>186)</b></a></sup> The int
+ input argument for the functions represents a subset of floating-point exceptions, and can
+ be zero or the bitwise OR of one or more floating-point exception macros, for example
+ FE_OVERFLOW | FE_INEXACT. For other argument values the behavior of these
+ functions is undefined.
+
+<p><b>Footnotes</b>
+<p><small><a name="note186" href="#note186">186)</a> The functions fetestexcept, feraiseexcept, and feclearexcept support the basic
+ abstraction of flags that are either set or clear. An implementation may endow floating-point status
+ flags with more information -- for example, the address of the code which first raised the floating-
+ point exception; the functions fegetexceptflag and fesetexceptflag deal with the full
+ content of flags.
+</small>
+
+<h5><a name="7.6.2.1" href="#7.6.2.1">7.6.2.1 The feclearexcept function</a></h5>
+<p><b>Synopsis</b>
+<p><!--para 1 -->
+<pre>
+         #include <a href="#7.6">&lt;fenv.h&gt;</a>
+         int feclearexcept(int excepts);
+</pre>
+<p><b>Description</b>
+<p><!--para 2 -->
+ The feclearexcept function attempts to clear the supported floating-point exceptions
+ represented by its argument.
+<p><b>Returns</b>
+<p><!--para 3 -->
+ The feclearexcept function returns zero if the excepts argument is zero or if all
+ the specified exceptions were successfully cleared. Otherwise, it returns a nonzero value.
+<!--page 203 -->
+
+<h5><a name="7.6.2.2" href="#7.6.2.2">7.6.2.2 The fegetexceptflag function</a></h5>
+<p><b>Synopsis</b>
+<p><!--para 1 -->
+<pre>
+          #include <a href="#7.6">&lt;fenv.h&gt;</a>
+          int fegetexceptflag(fexcept_t *flagp,
+               int excepts);
+</pre>
+<p><b>Description</b>
+<p><!--para 2 -->
+ The fegetexceptflag function attempts to store an implementation-defined
+ representation of the states of the floating-point status flags indicated by the argument
+ excepts in the object pointed to by the argument flagp.
+<p><b>Returns</b>
+<p><!--para 3 -->
+ The fegetexceptflag function returns zero if the representation was successfully
+ stored. Otherwise, it returns a nonzero value.
+
+<h5><a name="7.6.2.3" href="#7.6.2.3">7.6.2.3 The feraiseexcept function</a></h5>
+<p><b>Synopsis</b>
+<p><!--para 1 -->
+<pre>
+          #include <a href="#7.6">&lt;fenv.h&gt;</a>
+          int feraiseexcept(int excepts);
+</pre>
+<p><b>Description</b>
+<p><!--para 2 -->
+ The feraiseexcept function attempts to raise the supported floating-point exceptions
+ represented by its argument.<sup><a href="#note187"><b>187)</b></a></sup> The order in which these floating-point exceptions are
+ raised is unspecified, except as stated in <a href="#F.7.6">F.7.6</a>. Whether the feraiseexcept function
+ additionally raises the ''inexact'' floating-point exception whenever it raises the
+ ''overflow'' or ''underflow'' floating-point exception is implementation-defined.
+<p><b>Returns</b>
+<p><!--para 3 -->
+ The feraiseexcept function returns zero if the excepts argument is zero or if all
+ the specified exceptions were successfully raised. Otherwise, it returns a nonzero value.
+<!--page 204 -->
+
+<p><b>Footnotes</b>
+<p><small><a name="note187" href="#note187">187)</a> The effect is intended to be similar to that of floating-point exceptions raised by arithmetic operations.
+ Hence, enabled traps for floating-point exceptions raised by this function are taken. The specification
+ in <a href="#F.7.6">F.7.6</a> is in the same spirit.
+</small>
+
+<h5><a name="7.6.2.4" href="#7.6.2.4">7.6.2.4 The fesetexceptflag function</a></h5>
+<p><b>Synopsis</b>
+<p><!--para 1 -->
+<pre>
+         #include <a href="#7.6">&lt;fenv.h&gt;</a>
+         int fesetexceptflag(const fexcept_t *flagp,
+              int excepts);
+</pre>
+<p><b>Description</b>
+<p><!--para 2 -->
+ The fesetexceptflag function attempts to set the floating-point status flags
+ indicated by the argument excepts to the states stored in the object pointed to by
+ flagp. The value of *flagp shall have been set by a previous call to
+ fegetexceptflag whose second argument represented at least those floating-point
+ exceptions represented by the argument excepts. This function does not raise floating-
+ point exceptions, but only sets the state of the flags.
+<p><b>Returns</b>
+<p><!--para 3 -->
+ The fesetexceptflag function returns zero if the excepts argument is zero or if
+ all the specified flags were successfully set to the appropriate state. Otherwise, it returns
+ a nonzero value.
+
+<h5><a name="7.6.2.5" href="#7.6.2.5">7.6.2.5 The fetestexcept function</a></h5>
+<p><b>Synopsis</b>
+<p><!--para 1 -->
+<pre>
+         #include <a href="#7.6">&lt;fenv.h&gt;</a>
+         int fetestexcept(int excepts);
+</pre>
+<p><b>Description</b>
+<p><!--para 2 -->
+ The fetestexcept function determines which of a specified subset of the floating-
+ point exception flags are currently set. The excepts argument specifies the floating-
+ point status flags to be queried.<sup><a href="#note188"><b>188)</b></a></sup>
+<p><b>Returns</b>
+<p><!--para 3 -->
+ The fetestexcept function returns the value of the bitwise OR of the floating-point
+ exception macros corresponding to the currently set floating-point exceptions included in
+ excepts.
+<p><!--para 4 -->
+ EXAMPLE       Call f if ''invalid'' is set, then g if ''overflow'' is set:
+<!--page 205 -->
+<pre>
+        #include <a href="#7.6">&lt;fenv.h&gt;</a>
+        /* ... */
+        {
+                #pragma STDC FENV_ACCESS ON
+                int set_excepts;
+                feclearexcept(FE_INVALID | FE_OVERFLOW);
+                // maybe raise exceptions
+                set_excepts = fetestexcept(FE_INVALID | FE_OVERFLOW);
+                if (set_excepts &amp; FE_INVALID) f();
+                if (set_excepts &amp; FE_OVERFLOW) g();
+                /* ... */
+        }
+</pre>
+
+<p><b>Footnotes</b>
+<p><small><a name="note188" href="#note188">188)</a> This mechanism allows testing several floating-point exceptions with just one function call.
+</small>
+
+<h4><a name="7.6.3" href="#7.6.3">7.6.3 Rounding</a></h4>
+<p><!--para 1 -->
+ The fegetround and fesetround functions provide control of rounding direction
+ modes.
+
+<h5><a name="7.6.3.1" href="#7.6.3.1">7.6.3.1 The fegetround function</a></h5>
+<p><b>Synopsis</b>
+<p><!--para 1 -->
+<pre>
+        #include <a href="#7.6">&lt;fenv.h&gt;</a>
+        int fegetround(void);
+</pre>
+<p><b>Description</b>
+<p><!--para 2 -->
+ The fegetround function gets the current rounding direction.
+<p><b>Returns</b>
+<p><!--para 3 -->
+ The fegetround function returns the value of the rounding direction macro
+ representing the current rounding direction or a negative value if there is no such
+ rounding direction macro or the current rounding direction is not determinable.
+
+<h5><a name="7.6.3.2" href="#7.6.3.2">7.6.3.2 The fesetround function</a></h5>
+<p><b>Synopsis</b>
+<p><!--para 1 -->
+<pre>
+        #include <a href="#7.6">&lt;fenv.h&gt;</a>
+        int fesetround(int round);
+</pre>
+<p><b>Description</b>
+<p><!--para 2 -->
+ The fesetround function establishes the rounding direction represented by its
+ argument round. If the argument is not equal to the value of a rounding direction macro,
+ the rounding direction is not changed.
+<p><b>Returns</b>
+<p><!--para 3 -->
+ The fesetround function returns zero if and only if the requested rounding direction
+ was established.
+<!--page 206 -->
+<p><!--para 4 -->
+ EXAMPLE Save, set, and restore the rounding direction. Report an error and abort if setting the
+ rounding direction fails.
+<pre>
+        #include <a href="#7.6">&lt;fenv.h&gt;</a>
+        #include <a href="#7.2">&lt;assert.h&gt;</a>
+        void f(int round_dir)
+        {
+              #pragma STDC FENV_ACCESS ON
+              int save_round;
+              int setround_ok;
+              save_round = fegetround();
+              setround_ok = fesetround(round_dir);
+              assert(setround_ok == 0);
               /* ... */
-              int n, i; float x; wchar_t name[50];
-              n = fwscanf(stdin, L"%d%f%ls", &amp;i, &amp;x, name);
-     with the input line:
-              25 54.32E-1 thompson
-     will assign to n the value 3, to i the value 25, to x the value 5.432, and to name the sequence
-     thompson\0.
-
-18   EXAMPLE 2        The call:
-              #include <a href="#7.19">&lt;stdio.h&gt;</a>
-              #include <a href="#7.24">&lt;wchar.h&gt;</a>
+              fesetround(save_round);
               /* ... */
-              int i; float x; double y;
-              fwscanf(stdin, L"%2d%f%*d %lf", &amp;i, &amp;x, &amp;y);
-     with input:
-              56789 0123 56a72
-     will assign to i the value 56 and to x the value 789.0, will skip past 0123, and will assign to y the value
-     56.0. The next wide character read from the input stream will be a.
-
-
-     290) See ''future library directions'' (<a href="#7.26.12">7.26.12</a>).
-
-[<a name="p361" href="#p361">page 361</a>] (<a href="#Contents">Contents</a>)
-
-    Forward references: the wcstod, wcstof, and wcstold functions (<a href="#7.24.4.1.1">7.24.4.1.1</a>), the
-    wcstol, wcstoll, wcstoul, and wcstoull functions (<a href="#7.24.4.1.2">7.24.4.1.2</a>), the wcrtomb
-    function (<a href="#7.24.6.3.3">7.24.6.3.3</a>).
-<a name="7.24.2.3" href="#7.24.2.3"><b>    7.24.2.3 The swprintf function</b></a>
-    Synopsis
-1          #include <a href="#7.24">&lt;wchar.h&gt;</a>
-           int swprintf(wchar_t * restrict s,
-                size_t n,
-                const wchar_t * restrict format, ...);
-    Description
-2   The swprintf function is equivalent to fwprintf, except that the argument s
-    specifies an array of wide characters into which the generated output is to be written,
-    rather than written to a stream. No more than n wide characters are written, including a
-    terminating null wide character, which is always added (unless n is zero).
-    Returns
-3   The swprintf function returns the number of wide characters written in the array, not
-    counting the terminating null wide character, or a negative value if an encoding error
-    occurred or if n or more wide characters were requested to be written.
-<a name="7.24.2.4" href="#7.24.2.4"><b>    7.24.2.4 The swscanf function</b></a>
-    Synopsis
-1          #include <a href="#7.24">&lt;wchar.h&gt;</a>
-           int swscanf(const wchar_t * restrict s,
-                const wchar_t * restrict format, ...);
-    Description
-2   The swscanf function is equivalent to fwscanf, except that the argument s specifies a
-    wide string from which the input is to be obtained, rather than from a stream. Reaching
-    the end of the wide string is equivalent to encountering end-of-file for the fwscanf
-    function.
-    Returns
-3   The swscanf function returns the value of the macro EOF if an input failure occurs
-    before any conversion. Otherwise, the swscanf function returns the number of input
-    items assigned, which can be fewer than provided for, or even zero, in the event of an
-    early matching failure.
-
-
-
-
-[<a name="p362" href="#p362">page 362</a>] (<a href="#Contents">Contents</a>)
-
-<a name="7.24.2.5" href="#7.24.2.5"><b>    7.24.2.5 The vfwprintf function</b></a>
-    Synopsis
-1          #include <a href="#7.15">&lt;stdarg.h&gt;</a>
-           #include <a href="#7.19">&lt;stdio.h&gt;</a>
-           #include <a href="#7.24">&lt;wchar.h&gt;</a>
-           int vfwprintf(FILE * restrict stream,
-                const wchar_t * restrict format,
-                va_list arg);
-    Description
-2   The vfwprintf function is equivalent to fwprintf, with the variable argument list
-    replaced by arg, which shall have been initialized by the va_start macro (and
-    possibly subsequent va_arg calls). The vfwprintf function does not invoke the
-    va_end macro.291)
-    Returns
-3   The vfwprintf function returns the number of wide characters transmitted, or a
-    negative value if an output or encoding error occurred.
-4   EXAMPLE       The following shows the use of the vfwprintf function in a general error-reporting
-    routine.
-           #include <a href="#7.15">&lt;stdarg.h&gt;</a>
-           #include <a href="#7.19">&lt;stdio.h&gt;</a>
-           #include <a href="#7.24">&lt;wchar.h&gt;</a>
-           void error(char *function_name, wchar_t *format, ...)
-           {
-                 va_list args;
-                    va_start(args, format);
-                    // print out name of function causing error
-                    fwprintf(stderr, L"ERROR in %s: ", function_name);
-                    // print out remainder of message
-                    vfwprintf(stderr, format, args);
-                    va_end(args);
-           }
-
-
-
-
-    291) As the functions vfwprintf, vswprintf, vfwscanf, vwprintf, vwscanf, and vswscanf
-         invoke the va_arg macro, the value of arg after the return is indeterminate.
-
-[<a name="p363" href="#p363">page 363</a>] (<a href="#Contents">Contents</a>)
-
-<a name="7.24.2.6" href="#7.24.2.6"><b>    7.24.2.6 The vfwscanf function</b></a>
-    Synopsis
-1          #include <a href="#7.15">&lt;stdarg.h&gt;</a>
-           #include <a href="#7.19">&lt;stdio.h&gt;</a>
-           #include <a href="#7.24">&lt;wchar.h&gt;</a>
-           int vfwscanf(FILE * restrict stream,
-                const wchar_t * restrict format,
-                va_list arg);
-    Description
-2   The vfwscanf function is equivalent to fwscanf, with the variable argument list
-    replaced by arg, which shall have been initialized by the va_start macro (and
-    possibly subsequent va_arg calls). The vfwscanf function does not invoke the
-    va_end macro.291)
-    Returns
-3   The vfwscanf function returns the value of the macro EOF if an input failure occurs
-    before any conversion. Otherwise, the vfwscanf function returns the number of input
-    items assigned, which can be fewer than provided for, or even zero, in the event of an
-    early matching failure.
-<a name="7.24.2.7" href="#7.24.2.7"><b>    7.24.2.7 The vswprintf function</b></a>
-    Synopsis
-1          #include <a href="#7.15">&lt;stdarg.h&gt;</a>
-           #include <a href="#7.24">&lt;wchar.h&gt;</a>
-           int vswprintf(wchar_t * restrict s,
-                size_t n,
-                const wchar_t * restrict format,
-                va_list arg);
-    Description
-2   The vswprintf function is equivalent to swprintf, with the variable argument list
-    replaced by arg, which shall have been initialized by the va_start macro (and
-    possibly subsequent va_arg calls). The vswprintf function does not invoke the
-    va_end macro.291)
-    Returns
-3   The vswprintf function returns the number of wide characters written in the array, not
-    counting the terminating null wide character, or a negative value if an encoding error
-    occurred or if n or more wide characters were requested to be generated.
-
-
-[<a name="p364" href="#p364">page 364</a>] (<a href="#Contents">Contents</a>)
-
-<a name="7.24.2.8" href="#7.24.2.8"><b>    7.24.2.8 The vswscanf function</b></a>
-    Synopsis
-1          #include <a href="#7.15">&lt;stdarg.h&gt;</a>
-           #include <a href="#7.24">&lt;wchar.h&gt;</a>
-           int vswscanf(const wchar_t * restrict s,
-                const wchar_t * restrict format,
-                va_list arg);
-    Description
-2   The vswscanf function is equivalent to swscanf, with the variable argument list
-    replaced by arg, which shall have been initialized by the va_start macro (and
-    possibly subsequent va_arg calls). The vswscanf function does not invoke the
-    va_end macro.291)
-    Returns
-3   The vswscanf function returns the value of the macro EOF if an input failure occurs
-    before any conversion. Otherwise, the vswscanf function returns the number of input
-    items assigned, which can be fewer than provided for, or even zero, in the event of an
-    early matching failure.
-<a name="7.24.2.9" href="#7.24.2.9"><b>    7.24.2.9 The vwprintf function</b></a>
-    Synopsis
-1          #include <a href="#7.15">&lt;stdarg.h&gt;</a>
-           #include <a href="#7.24">&lt;wchar.h&gt;</a>
-           int vwprintf(const wchar_t * restrict format,
-                va_list arg);
-    Description
-2   The vwprintf function is equivalent to wprintf, with the variable argument list
-    replaced by arg, which shall have been initialized by the va_start macro (and
-    possibly subsequent va_arg calls). The vwprintf function does not invoke the
-    va_end macro.291)
-    Returns
-3   The vwprintf function returns the number of wide characters transmitted, or a negative
-    value if an output or encoding error occurred.
-
-
-
-
-[<a name="p365" href="#p365">page 365</a>] (<a href="#Contents">Contents</a>)
-
-<a name="7.24.2.10" href="#7.24.2.10"><b>    7.24.2.10 The vwscanf function</b></a>
-    Synopsis
-1          #include <a href="#7.15">&lt;stdarg.h&gt;</a>
-           #include <a href="#7.24">&lt;wchar.h&gt;</a>
-           int vwscanf(const wchar_t * restrict format,
-                va_list arg);
-    Description
-2   The vwscanf function is equivalent to wscanf, with the variable argument list
-    replaced by arg, which shall have been initialized by the va_start macro (and
-    possibly subsequent va_arg calls). The vwscanf function does not invoke the
-    va_end macro.291)
-    Returns
-3   The vwscanf function returns the value of the macro EOF if an input failure occurs
-    before any conversion. Otherwise, the vwscanf function returns the number of input
-    items assigned, which can be fewer than provided for, or even zero, in the event of an
-    early matching failure.
-<a name="7.24.2.11" href="#7.24.2.11"><b>    7.24.2.11 The wprintf function</b></a>
-    Synopsis
-1          #include <a href="#7.24">&lt;wchar.h&gt;</a>
-           int wprintf(const wchar_t * restrict format, ...);
-    Description
-2   The wprintf function is equivalent to fwprintf with the argument stdout
-    interposed before the arguments to wprintf.
-    Returns
-3   The wprintf function returns the number of wide characters transmitted, or a negative
-    value if an output or encoding error occurred.
-<a name="7.24.2.12" href="#7.24.2.12"><b>    7.24.2.12 The wscanf function</b></a>
-    Synopsis
-1          #include <a href="#7.24">&lt;wchar.h&gt;</a>
-           int wscanf(const wchar_t * restrict format, ...);
-    Description
-2   The wscanf function is equivalent to fwscanf with the argument stdin interposed
-    before the arguments to wscanf.
-
-
-[<a name="p366" href="#p366">page 366</a>] (<a href="#Contents">Contents</a>)
-
-    Returns
-3   The wscanf function returns the value of the macro EOF if an input failure occurs
-    before any conversion. Otherwise, the wscanf function returns the number of input
-    items assigned, which can be fewer than provided for, or even zero, in the event of an
-    early matching failure.
-<a name="7.24.3" href="#7.24.3"><b>    7.24.3 Wide character input/output functions</b></a>
-<a name="7.24.3.1" href="#7.24.3.1"><b>    7.24.3.1 The fgetwc function</b></a>
-    Synopsis
-1           #include <a href="#7.19">&lt;stdio.h&gt;</a>
-            #include <a href="#7.24">&lt;wchar.h&gt;</a>
-            wint_t fgetwc(FILE *stream);
-    Description
-2   If the end-of-file indicator for the input stream pointed to by stream is not set and a
-    next wide character is present, the fgetwc function obtains that wide character as a
-    wchar_t converted to a wint_t and advances the associated file position indicator for
-    the stream (if defined).
-    Returns
-3   If the end-of-file indicator for the stream is set, or if the stream is at end-of-file, the end-
-    of-file indicator for the stream is set and the fgetwc function returns WEOF. Otherwise,
-    the fgetwc function returns the next wide character from the input stream pointed to by
-    stream. If a read error occurs, the error indicator for the stream is set and the fgetwc
-    function returns WEOF. If an encoding error occurs (including too few bytes), the value of
-    the macro EILSEQ is stored in errno and the fgetwc function returns WEOF.292)
-<a name="7.24.3.2" href="#7.24.3.2"><b>    7.24.3.2 The fgetws function</b></a>
-    Synopsis
-1           #include <a href="#7.19">&lt;stdio.h&gt;</a>
-            #include <a href="#7.24">&lt;wchar.h&gt;</a>
-            wchar_t *fgetws(wchar_t * restrict s,
-                 int n, FILE * restrict stream);
-    Description
-2   The fgetws function reads at most one less than the number of wide characters
-    specified by n from the stream pointed to by stream into the array pointed to by s. No
-
-
-    292) An end-of-file and a read error can be distinguished by use of the feof and ferror functions.
-         Also, errno will be set to EILSEQ by input/output functions only if an encoding error occurs.
-
-[<a name="p367" href="#p367">page 367</a>] (<a href="#Contents">Contents</a>)
-
-    additional wide characters are read after a new-line wide character (which is retained) or
-    after end-of-file. A null wide character is written immediately after the last wide
-    character read into the array.
-    Returns
-3   The fgetws function returns s if successful. If end-of-file is encountered and no
-    characters have been read into the array, the contents of the array remain unchanged and a
-    null pointer is returned. If a read or encoding error occurs during the operation, the array
-    contents are indeterminate and a null pointer is returned.
-<a name="7.24.3.3" href="#7.24.3.3"><b>    7.24.3.3 The fputwc function</b></a>
-    Synopsis
-1          #include <a href="#7.19">&lt;stdio.h&gt;</a>
-           #include <a href="#7.24">&lt;wchar.h&gt;</a>
-           wint_t fputwc(wchar_t c, FILE *stream);
-    Description
-2   The fputwc function writes the wide character specified by c to the output stream
-    pointed to by stream, at the position indicated by the associated file position indicator
-    for the stream (if defined), and advances the indicator appropriately. If the file cannot
-    support positioning requests, or if the stream was opened with append mode, the
-    character is appended to the output stream.
-    Returns
-3   The fputwc function returns the wide character written. If a write error occurs, the
-    error indicator for the stream is set and fputwc returns WEOF. If an encoding error
-    occurs, the value of the macro EILSEQ is stored in errno and fputwc returns WEOF.
-<a name="7.24.3.4" href="#7.24.3.4"><b>    7.24.3.4 The fputws function</b></a>
-    Synopsis
-1          #include <a href="#7.19">&lt;stdio.h&gt;</a>
-           #include <a href="#7.24">&lt;wchar.h&gt;</a>
-           int fputws(const wchar_t * restrict s,
-                FILE * restrict stream);
-    Description
-2   The fputws function writes the wide string pointed to by s to the stream pointed to by
-    stream. The terminating null wide character is not written.
-    Returns
-3   The fputws function returns EOF if a write or encoding error occurs; otherwise, it
-    returns a nonnegative value.
-
-[<a name="p368" href="#p368">page 368</a>] (<a href="#Contents">Contents</a>)
-
-<a name="7.24.3.5" href="#7.24.3.5"><b>    7.24.3.5 The fwide function</b></a>
-    Synopsis
-1           #include <a href="#7.19">&lt;stdio.h&gt;</a>
-            #include <a href="#7.24">&lt;wchar.h&gt;</a>
-            int fwide(FILE *stream, int mode);
-    Description
-2   The fwide function determines the orientation of the stream pointed to by stream. If
-    mode is greater than zero, the function first attempts to make the stream wide oriented. If
-    mode is less than zero, the function first attempts to make the stream byte oriented.293)
-    Otherwise, mode is zero and the function does not alter the orientation of the stream.
-    Returns
-3   The fwide function returns a value greater than zero if, after the call, the stream has
-    wide orientation, a value less than zero if the stream has byte orientation, or zero if the
-    stream has no orientation.
-<a name="7.24.3.6" href="#7.24.3.6"><b>    7.24.3.6 The getwc function</b></a>
-    Synopsis
-1           #include <a href="#7.19">&lt;stdio.h&gt;</a>
-            #include <a href="#7.24">&lt;wchar.h&gt;</a>
-            wint_t getwc(FILE *stream);
-    Description
-2   The getwc function is equivalent to fgetwc, except that if it is implemented as a
-    macro, it may evaluate stream more than once, so the argument should never be an
-    expression with side effects.
-    Returns
-3   The getwc function returns the next wide character from the input stream pointed to by
-    stream, or WEOF.
-<a name="7.24.3.7" href="#7.24.3.7"><b>    7.24.3.7 The getwchar function</b></a>
-    Synopsis
-1           #include <a href="#7.24">&lt;wchar.h&gt;</a>
-            wint_t getwchar(void);
-
-
-
-
-    293) If the orientation of the stream has already been determined, fwide does not change it.
-
-[<a name="p369" href="#p369">page 369</a>] (<a href="#Contents">Contents</a>)
-
-    Description
-2   The getwchar function is equivalent to getwc with the argument stdin.
-    Returns
-3   The getwchar function returns the next wide character from the input stream pointed to
-    by stdin, or WEOF.
-<a name="7.24.3.8" href="#7.24.3.8"><b>    7.24.3.8 The putwc function</b></a>
-    Synopsis
-1          #include <a href="#7.19">&lt;stdio.h&gt;</a>
-           #include <a href="#7.24">&lt;wchar.h&gt;</a>
-           wint_t putwc(wchar_t c, FILE *stream);
-    Description
-2   The putwc function is equivalent to fputwc, except that if it is implemented as a
-    macro, it may evaluate stream more than once, so that argument should never be an
-    expression with side effects.
-    Returns
-3   The putwc function returns the wide character written, or WEOF.
-<a name="7.24.3.9" href="#7.24.3.9"><b>    7.24.3.9 The putwchar function</b></a>
-    Synopsis
-1          #include <a href="#7.24">&lt;wchar.h&gt;</a>
-           wint_t putwchar(wchar_t c);
-    Description
-2   The putwchar function is equivalent to putwc with the second argument stdout.
-    Returns
-3   The putwchar function returns the character written, or WEOF.
-<a name="7.24.3.10" href="#7.24.3.10"><b>    7.24.3.10 The ungetwc function</b></a>
-    Synopsis
-1          #include <a href="#7.19">&lt;stdio.h&gt;</a>
-           #include <a href="#7.24">&lt;wchar.h&gt;</a>
-           wint_t ungetwc(wint_t c, FILE *stream);
-    Description
-2   The ungetwc function pushes the wide character specified by c back onto the input
-    stream pointed to by stream. Pushed-back wide characters will be returned by
-    subsequent reads on that stream in the reverse order of their pushing. A successful
-
-[<a name="p370" href="#p370">page 370</a>] (<a href="#Contents">Contents</a>)
-
-    intervening call (with the stream pointed to by stream) to a file positioning function
-    (fseek, fsetpos, or rewind) discards any pushed-back wide characters for the
-    stream. The external storage corresponding to the stream is unchanged.
-3   One wide character of pushback is guaranteed, even if the call to the ungetwc function
-    follows just after a call to a formatted wide character input function fwscanf,
-    vfwscanf, vwscanf, or wscanf. If the ungetwc function is called too many times
-    on the same stream without an intervening read or file positioning operation on that
-    stream, the operation may fail.
-4   If the value of c equals that of the macro WEOF, the operation fails and the input stream is
-    unchanged.
-5   A successful call to the ungetwc function clears the end-of-file indicator for the stream.
-    The value of the file position indicator for the stream after reading or discarding all
-    pushed-back wide characters is the same as it was before the wide characters were pushed
-    back. For a text or binary stream, the value of its file position indicator after a successful
-    call to the ungetwc function is unspecified until all pushed-back wide characters are
-    read or discarded.
-    Returns
-6   The ungetwc function returns the wide character pushed back, or WEOF if the operation
-    fails.
-<a name="7.24.4" href="#7.24.4"><b>    7.24.4 General wide string utilities</b></a>
-1   The header <a href="#7.24">&lt;wchar.h&gt;</a> declares a number of functions useful for wide string
-    manipulation. Various methods are used for determining the lengths of the arrays, but in
-    all cases a wchar_t * argument points to the initial (lowest addressed) element of the
-    array. If an array is accessed beyond the end of an object, the behavior is undefined.
-2   Where an argument declared as size_t n determines the length of the array for a
-    function, n can have the value zero on a call to that function. Unless explicitly stated
-    otherwise in the description of a particular function in this subclause, pointer arguments
-    on such a call shall still have valid values, as described in <a href="#7.1.4">7.1.4</a>. On such a call, a
-    function that locates a wide character finds no occurrence, a function that compares two
-    wide character sequences returns zero, and a function that copies wide characters copies
-    zero wide characters.
-
-
-
-
-[<a name="p371" href="#p371">page 371</a>] (<a href="#Contents">Contents</a>)
-
-<a name="7.24.4.1" href="#7.24.4.1"><b>    7.24.4.1 Wide string numeric conversion functions</b></a>
-<a name="7.24.4.1.1" href="#7.24.4.1.1"><b>    7.24.4.1.1 The wcstod, wcstof, and wcstold functions</b></a>
-    Synopsis
-1          #include <a href="#7.24">&lt;wchar.h&gt;</a>
-           double wcstod(const wchar_t * restrict nptr,
-                wchar_t ** restrict endptr);
-           float wcstof(const wchar_t * restrict nptr,
-                wchar_t ** restrict endptr);
-           long double wcstold(const wchar_t * restrict nptr,
-                wchar_t ** restrict endptr);
-    Description
-2   The wcstod, wcstof, and wcstold functions convert the initial portion of the wide
-    string pointed to by nptr to double, float, and long double representation,
-    respectively. First, they decompose the input string into three parts: an initial, possibly
-    empty, sequence of white-space wide characters (as specified by the iswspace
-    function), a subject sequence resembling a floating-point constant or representing an
-    infinity or NaN; and a final wide string of one or more unrecognized wide characters,
-    including the terminating null wide character of the input wide string. Then, they attempt
-    to convert the subject sequence to a floating-point number, and return the result.
-3   The expected form of the subject sequence is an optional plus or minus sign, then one of
-    the following:
-    -- a nonempty sequence of decimal digits optionally containing a decimal-point wide
-      character, then an optional exponent part as defined for the corresponding single-byte
-      characters in <a href="#6.4.4.2">6.4.4.2</a>;
-    -- a 0x or 0X, then a nonempty sequence of hexadecimal digits optionally containing a
-      decimal-point wide character, then an optional binary exponent part as defined in
-      <a href="#6.4.4.2">6.4.4.2</a>;
-    -- INF or INFINITY, or any other wide string equivalent except for case
-    -- NAN or NAN(n-wchar-sequenceopt), or any other wide string equivalent except for
-      case in the NAN part, where:
-               n-wchar-sequence:
-                     digit
-                     nondigit
-                     n-wchar-sequence digit
-                     n-wchar-sequence nondigit
-    The subject sequence is defined as the longest initial subsequence of the input wide
-    string, starting with the first non-white-space wide character, that is of the expected form.
-[<a name="p372" href="#p372">page 372</a>] (<a href="#Contents">Contents</a>)
-
-    The subject sequence contains no wide characters if the input wide string is not of the
-    expected form.
-4   If the subject sequence has the expected form for a floating-point number, the sequence of
-    wide characters starting with the first digit or the decimal-point wide character
-    (whichever occurs first) is interpreted as a floating constant according to the rules of
-    <a href="#6.4.4.2">6.4.4.2</a>, except that the decimal-point wide character is used in place of a period, and that
-    if neither an exponent part nor a decimal-point wide character appears in a decimal
-    floating point number, or if a binary exponent part does not appear in a hexadecimal
-    floating point number, an exponent part of the appropriate type with value zero is
-    assumed to follow the last digit in the string. If the subject sequence begins with a minus
-    sign, the sequence is interpreted as negated.294) A wide character sequence INF or
-    INFINITY is interpreted as an infinity, if representable in the return type, else like a
-    floating constant that is too large for the range of the return type. A wide character
-    sequence NAN or NAN(n-wchar-sequenceopt) is interpreted as a quiet NaN, if supported
-    in the return type, else like a subject sequence part that does not have the expected form;
-    the meaning of the n-wchar sequences is implementation-defined.295) A pointer to the
-    final wide string is stored in the object pointed to by endptr, provided that endptr is
-    not a null pointer.
-5   If the subject sequence has the hexadecimal form and FLT_RADIX is a power of 2, the
-    value resulting from the conversion is correctly rounded.
-6   In other than the "C" locale, additional locale-specific subject sequence forms may be
-    accepted.
-7   If the subject sequence is empty or does not have the expected form, no conversion is
-    performed; the value of nptr is stored in the object pointed to by endptr, provided
-    that endptr is not a null pointer.
-    Recommended practice
-8   If the subject sequence has the hexadecimal form, FLT_RADIX is not a power of 2, and
-    the result is not exactly representable, the result should be one of the two numbers in the
-    appropriate internal format that are adjacent to the hexadecimal floating source value,
-    with the extra stipulation that the error should have a correct sign for the current rounding
-    direction.
-
-
-
-    294) It is unspecified whether a minus-signed sequence is converted to a negative number directly or by
-         negating the value resulting from converting the corresponding unsigned sequence (see <a href="#F.5">F.5</a>); the two
-         methods may yield different results if rounding is toward positive or negative infinity. In either case,
-         the functions honor the sign of zero if floating-point arithmetic supports signed zeros.
-    295) An implementation may use the n-wchar sequence to determine extra information to be represented in
-         the NaN's significand.
-
-[<a name="p373" href="#p373">page 373</a>] (<a href="#Contents">Contents</a>)
-
-9    If the subject sequence has the decimal form and at most DECIMAL_DIG (defined in
-     <a href="#7.7">&lt;float.h&gt;</a>) significant digits, the result should be correctly rounded. If the subject
-     sequence D has the decimal form and more than DECIMAL_DIG significant digits,
-     consider the two bounding, adjacent decimal strings L and U, both having
-     DECIMAL_DIG significant digits, such that the values of L, D, and U satisfy L &lt;= D &lt;= U.
-     The result should be one of the (equal or adjacent) values that would be obtained by
-     correctly rounding L and U according to the current rounding direction, with the extra
-     stipulation that the error with respect to D should have a correct sign for the current
-     rounding direction.296)
-     Returns
-10   The functions return the converted value, if any. If no conversion could be performed,
-     zero is returned. If the correct value is outside the range of representable values, plus or
-     minus HUGE_VAL, HUGE_VALF, or HUGE_VALL is returned (according to the return
-     type and sign of the value), and the value of the macro ERANGE is stored in errno. If
-     the result underflows (<a href="#7.12.1">7.12.1</a>), the functions return a value whose magnitude is no greater
-     than the smallest normalized positive number in the return type; whether errno acquires
-     the value ERANGE is implementation-defined.
-
-
-
-
-     296) DECIMAL_DIG, defined in <a href="#7.7">&lt;float.h&gt;</a>, should be sufficiently large that L and U will usually round
-          to the same internal floating value, but if not will round to adjacent values.
-
-[<a name="p374" href="#p374">page 374</a>] (<a href="#Contents">Contents</a>)
-
-<a name="7.24.4.1.2" href="#7.24.4.1.2"><b>    7.24.4.1.2 The wcstol, wcstoll, wcstoul, and wcstoull functions</b></a>
-    Synopsis
-1          #include <a href="#7.24">&lt;wchar.h&gt;</a>
-           long int wcstol(
-                const wchar_t * restrict nptr,
-                wchar_t ** restrict endptr,
-                int base);
-           long long int wcstoll(
-                const wchar_t * restrict nptr,
-                wchar_t ** restrict endptr,
-                int base);
-           unsigned long int wcstoul(
-                const wchar_t * restrict nptr,
-                wchar_t ** restrict endptr,
-                int base);
-           unsigned long long int wcstoull(
-                const wchar_t * restrict nptr,
-                wchar_t ** restrict endptr,
-                int base);
-    Description
-2   The wcstol, wcstoll, wcstoul, and wcstoull functions convert the initial
-    portion of the wide string pointed to by nptr to long int, long long int,
-    unsigned long int, and unsigned long long int representation,
-    respectively. First, they decompose the input string into three parts: an initial, possibly
-    empty, sequence of white-space wide characters (as specified by the iswspace
-    function), a subject sequence resembling an integer represented in some radix determined
-    by the value of base, and a final wide string of one or more unrecognized wide
-    characters, including the terminating null wide character of the input wide string. Then,
-    they attempt to convert the subject sequence to an integer, and return the result.
-3   If the value of base is zero, the expected form of the subject sequence is that of an
-    integer constant as described for the corresponding single-byte characters in <a href="#6.4.4.1">6.4.4.1</a>,
-    optionally preceded by a plus or minus sign, but not including an integer suffix. If the
-    value of base is between 2 and 36 (inclusive), the expected form of the subject sequence
-    is a sequence of letters and digits representing an integer with the radix specified by
-    base, optionally preceded by a plus or minus sign, but not including an integer suffix.
-    The letters from a (or A) through z (or Z) are ascribed the values 10 through 35; only
-    letters and digits whose ascribed values are less than that of base are permitted. If the
-    value of base is 16, the wide characters 0x or 0X may optionally precede the sequence
-    of letters and digits, following the sign if present.
-
-[<a name="p375" href="#p375">page 375</a>] (<a href="#Contents">Contents</a>)
-
-4   The subject sequence is defined as the longest initial subsequence of the input wide
-    string, starting with the first non-white-space wide character, that is of the expected form.
-    The subject sequence contains no wide characters if the input wide string is empty or
-    consists entirely of white space, or if the first non-white-space wide character is other
-    than a sign or a permissible letter or digit.
-5   If the subject sequence has the expected form and the value of base is zero, the sequence
-    of wide characters starting with the first digit is interpreted as an integer constant
-    according to the rules of <a href="#6.4.4.1">6.4.4.1</a>. If the subject sequence has the expected form and the
-    value of base is between 2 and 36, it is used as the base for conversion, ascribing to each
-    letter its value as given above. If the subject sequence begins with a minus sign, the value
-    resulting from the conversion is negated (in the return type). A pointer to the final wide
-    string is stored in the object pointed to by endptr, provided that endptr is not a null
-    pointer.
-6   In other than the "C" locale, additional locale-specific subject sequence forms may be
-    accepted.
-7   If the subject sequence is empty or does not have the expected form, no conversion is
-    performed; the value of nptr is stored in the object pointed to by endptr, provided
-    that endptr is not a null pointer.
-    Returns
-8   The wcstol, wcstoll, wcstoul, and wcstoull functions return the converted
-    value, if any. If no conversion could be performed, zero is returned. If the correct value
-    is outside the range of representable values, LONG_MIN, LONG_MAX, LLONG_MIN,
-    LLONG_MAX, ULONG_MAX, or ULLONG_MAX is returned (according to the return type
-    sign of the value, if any), and the value of the macro ERANGE is stored in errno.
-<a name="7.24.4.2" href="#7.24.4.2"><b>    7.24.4.2 Wide string copying functions</b></a>
-<a name="7.24.4.2.1" href="#7.24.4.2.1"><b>    7.24.4.2.1 The wcscpy function</b></a>
-    Synopsis
-1          #include <a href="#7.24">&lt;wchar.h&gt;</a>
-           wchar_t *wcscpy(wchar_t * restrict s1,
-                const wchar_t * restrict s2);
-    Description
-2   The wcscpy function copies the wide string pointed to by s2 (including the terminating
-    null wide character) into the array pointed to by s1.
-    Returns
-3   The wcscpy function returns the value of s1.
-
-
-[<a name="p376" href="#p376">page 376</a>] (<a href="#Contents">Contents</a>)
-
-<a name="7.24.4.2.2" href="#7.24.4.2.2"><b>    7.24.4.2.2 The wcsncpy function</b></a>
-    Synopsis
-1            #include <a href="#7.24">&lt;wchar.h&gt;</a>
-             wchar_t *wcsncpy(wchar_t * restrict s1,
-                  const wchar_t * restrict s2,
-                  size_t n);
-    Description
-2   The wcsncpy function copies not more than n wide characters (those that follow a null
-    wide character are not copied) from the array pointed to by s2 to the array pointed to by
-    s1.297)
-3   If the array pointed to by s2 is a wide string that is shorter than n wide characters, null
-    wide characters are appended to the copy in the array pointed to by s1, until n wide
-    characters in all have been written.
-    Returns
-4   The wcsncpy function returns the value of s1.
-<a name="7.24.4.2.3" href="#7.24.4.2.3"><b>    7.24.4.2.3 The wmemcpy function</b></a>
-    Synopsis
-1            #include <a href="#7.24">&lt;wchar.h&gt;</a>
-             wchar_t *wmemcpy(wchar_t * restrict s1,
-                  const wchar_t * restrict s2,
-                  size_t n);
-    Description
-2   The wmemcpy function copies n wide characters from the object pointed to by s2 to the
-    object pointed to by s1.
-    Returns
-3   The wmemcpy function returns the value of s1.
-
-
-
-
-    297) Thus, if there is no null wide character in the first n wide characters of the array pointed to by s2, the
-         result will not be null-terminated.
-
-[<a name="p377" href="#p377">page 377</a>] (<a href="#Contents">Contents</a>)
-
-<a name="7.24.4.2.4" href="#7.24.4.2.4"><b>    7.24.4.2.4 The wmemmove function</b></a>
-    Synopsis
-1          #include <a href="#7.24">&lt;wchar.h&gt;</a>
-           wchar_t *wmemmove(wchar_t *s1, const wchar_t *s2,
-                size_t n);
-    Description
-2   The wmemmove function copies n wide characters from the object pointed to by s2 to
-    the object pointed to by s1. Copying takes place as if the n wide characters from the
-    object pointed to by s2 are first copied into a temporary array of n wide characters that
-    does not overlap the objects pointed to by s1 or s2, and then the n wide characters from
-    the temporary array are copied into the object pointed to by s1.
-    Returns
-3   The wmemmove function returns the value of s1.
-<a name="7.24.4.3" href="#7.24.4.3"><b>    7.24.4.3 Wide string concatenation functions</b></a>
-<a name="7.24.4.3.1" href="#7.24.4.3.1"><b>    7.24.4.3.1 The wcscat function</b></a>
-    Synopsis
-1          #include <a href="#7.24">&lt;wchar.h&gt;</a>
-           wchar_t *wcscat(wchar_t * restrict s1,
-                const wchar_t * restrict s2);
-    Description
-2   The wcscat function appends a copy of the wide string pointed to by s2 (including the
-    terminating null wide character) to the end of the wide string pointed to by s1. The initial
-    wide character of s2 overwrites the null wide character at the end of s1.
-    Returns
-3   The wcscat function returns the value of s1.
-<a name="7.24.4.3.2" href="#7.24.4.3.2"><b>    7.24.4.3.2 The wcsncat function</b></a>
-    Synopsis
-1          #include <a href="#7.24">&lt;wchar.h&gt;</a>
-           wchar_t *wcsncat(wchar_t * restrict s1,
-                const wchar_t * restrict s2,
-                size_t n);
-    Description
-2   The wcsncat function appends not more than n wide characters (a null wide character
-    and those that follow it are not appended) from the array pointed to by s2 to the end of
-
-[<a name="p378" href="#p378">page 378</a>] (<a href="#Contents">Contents</a>)
-
-    the wide string pointed to by s1. The initial wide character of s2 overwrites the null
-    wide character at the end of s1. A terminating null wide character is always appended to
-    the result.298)
-    Returns
-3   The wcsncat function returns the value of s1.
-<a name="7.24.4.4" href="#7.24.4.4"><b>    7.24.4.4 Wide string comparison functions</b></a>
-1   Unless explicitly stated otherwise, the functions described in this subclause order two
-    wide characters the same way as two integers of the underlying integer type designated
-    by wchar_t.
-<a name="7.24.4.4.1" href="#7.24.4.4.1"><b>    7.24.4.4.1 The wcscmp function</b></a>
-    Synopsis
-1           #include <a href="#7.24">&lt;wchar.h&gt;</a>
-            int wcscmp(const wchar_t *s1, const wchar_t *s2);
-    Description
-2   The wcscmp function compares the wide string pointed to by s1 to the wide string
-    pointed to by s2.
-    Returns
-3   The wcscmp function returns an integer greater than, equal to, or less than zero,
-    accordingly as the wide string pointed to by s1 is greater than, equal to, or less than the
-    wide string pointed to by s2.
-<a name="7.24.4.4.2" href="#7.24.4.4.2"><b>    7.24.4.4.2 The wcscoll function</b></a>
-    Synopsis
-1           #include <a href="#7.24">&lt;wchar.h&gt;</a>
-            int wcscoll(const wchar_t *s1, const wchar_t *s2);
-    Description
-2   The wcscoll function compares the wide string pointed to by s1 to the wide string
-    pointed to by s2, both interpreted as appropriate to the LC_COLLATE category of the
-    current locale.
-    Returns
-3   The wcscoll function returns an integer greater than, equal to, or less than zero,
-    accordingly as the wide string pointed to by s1 is greater than, equal to, or less than the
-
-
-    298) Thus, the maximum number of wide characters that can end up in the array pointed to by s1 is
-         wcslen(s1)+n+1.
-
-[<a name="p379" href="#p379">page 379</a>] (<a href="#Contents">Contents</a>)
-
-    wide string pointed to by s2 when both are interpreted as appropriate to the current
-    locale.
-<a name="7.24.4.4.3" href="#7.24.4.4.3"><b>    7.24.4.4.3 The wcsncmp function</b></a>
-    Synopsis
-1          #include <a href="#7.24">&lt;wchar.h&gt;</a>
-           int wcsncmp(const wchar_t *s1, const wchar_t *s2,
-                size_t n);
-    Description
-2   The wcsncmp function compares not more than n wide characters (those that follow a
-    null wide character are not compared) from the array pointed to by s1 to the array
-    pointed to by s2.
-    Returns
-3   The wcsncmp function returns an integer greater than, equal to, or less than zero,
-    accordingly as the possibly null-terminated array pointed to by s1 is greater than, equal
-    to, or less than the possibly null-terminated array pointed to by s2.
-<a name="7.24.4.4.4" href="#7.24.4.4.4"><b>    7.24.4.4.4 The wcsxfrm function</b></a>
-    Synopsis
-1          #include <a href="#7.24">&lt;wchar.h&gt;</a>
-           size_t wcsxfrm(wchar_t * restrict s1,
-                const wchar_t * restrict s2,
-                size_t n);
-    Description
-2   The wcsxfrm function transforms the wide string pointed to by s2 and places the
-    resulting wide string into the array pointed to by s1. The transformation is such that if
-    the wcscmp function is applied to two transformed wide strings, it returns a value greater
-    than, equal to, or less than zero, corresponding to the result of the wcscoll function
-    applied to the same two original wide strings. No more than n wide characters are placed
-    into the resulting array pointed to by s1, including the terminating null wide character. If
-    n is zero, s1 is permitted to be a null pointer.
-    Returns
-3   The wcsxfrm function returns the length of the transformed wide string (not including
-    the terminating null wide character). If the value returned is n or greater, the contents of
-    the array pointed to by s1 are indeterminate.
-4   EXAMPLE The value of the following expression is the length of the array needed to hold the
-    transformation of the wide string pointed to by s:
-
-
-[<a name="p380" href="#p380">page 380</a>] (<a href="#Contents">Contents</a>)
-
-           1 + wcsxfrm(NULL, s, 0)
-
-<a name="7.24.4.4.5" href="#7.24.4.4.5"><b>    7.24.4.4.5 The wmemcmp function</b></a>
-    Synopsis
-1          #include <a href="#7.24">&lt;wchar.h&gt;</a>
-           int wmemcmp(const wchar_t *s1, const wchar_t *s2,
-                size_t n);
-    Description
-2   The wmemcmp function compares the first n wide characters of the object pointed to by
-    s1 to the first n wide characters of the object pointed to by s2.
-    Returns
-3   The wmemcmp function returns an integer greater than, equal to, or less than zero,
-    accordingly as the object pointed to by s1 is greater than, equal to, or less than the object
-    pointed to by s2.
-<a name="7.24.4.5" href="#7.24.4.5"><b>    7.24.4.5 Wide string search functions</b></a>
-<a name="7.24.4.5.1" href="#7.24.4.5.1"><b>    7.24.4.5.1 The wcschr function</b></a>
-    Synopsis
-1          #include <a href="#7.24">&lt;wchar.h&gt;</a>
-           wchar_t *wcschr(const wchar_t *s, wchar_t c);
-    Description
-2   The wcschr function locates the first occurrence of c in the wide string pointed to by s.
-    The terminating null wide character is considered to be part of the wide string.
-    Returns
-3   The wcschr function returns a pointer to the located wide character, or a null pointer if
-    the wide character does not occur in the wide string.
-<a name="7.24.4.5.2" href="#7.24.4.5.2"><b>    7.24.4.5.2 The wcscspn function</b></a>
-    Synopsis
-1          #include <a href="#7.24">&lt;wchar.h&gt;</a>
-           size_t wcscspn(const wchar_t *s1, const wchar_t *s2);
-    Description
-2   The wcscspn function computes the length of the maximum initial segment of the wide
-    string pointed to by s1 which consists entirely of wide characters not from the wide
-    string pointed to by s2.
-
-
-
-[<a name="p381" href="#p381">page 381</a>] (<a href="#Contents">Contents</a>)
-
-    Returns
-3   The wcscspn function returns the length of the segment.
-<a name="7.24.4.5.3" href="#7.24.4.5.3"><b>    7.24.4.5.3 The wcspbrk function</b></a>
-    Synopsis
-1          #include <a href="#7.24">&lt;wchar.h&gt;</a>
-           wchar_t *wcspbrk(const wchar_t *s1, const wchar_t *s2);
-    Description
-2   The wcspbrk function locates the first occurrence in the wide string pointed to by s1 of
-    any wide character from the wide string pointed to by s2.
-    Returns
-3   The wcspbrk function returns a pointer to the wide character in s1, or a null pointer if
-    no wide character from s2 occurs in s1.
-<a name="7.24.4.5.4" href="#7.24.4.5.4"><b>    7.24.4.5.4 The wcsrchr function</b></a>
-    Synopsis
-1          #include <a href="#7.24">&lt;wchar.h&gt;</a>
-           wchar_t *wcsrchr(const wchar_t *s, wchar_t c);
-    Description
-2   The wcsrchr function locates the last occurrence of c in the wide string pointed to by
-    s. The terminating null wide character is considered to be part of the wide string.
-    Returns
-3   The wcsrchr function returns a pointer to the wide character, or a null pointer if c does
-    not occur in the wide string.
-<a name="7.24.4.5.5" href="#7.24.4.5.5"><b>    7.24.4.5.5 The wcsspn function</b></a>
-    Synopsis
-1          #include <a href="#7.24">&lt;wchar.h&gt;</a>
-           size_t wcsspn(const wchar_t *s1, const wchar_t *s2);
-    Description
-2   The wcsspn function computes the length of the maximum initial segment of the wide
-    string pointed to by s1 which consists entirely of wide characters from the wide string
-    pointed to by s2.
-    Returns
-3   The wcsspn function returns the length of the segment.
-
-
-[<a name="p382" href="#p382">page 382</a>] (<a href="#Contents">Contents</a>)
-
-<a name="7.24.4.5.6" href="#7.24.4.5.6"><b>    7.24.4.5.6 The wcsstr function</b></a>
-    Synopsis
-1          #include <a href="#7.24">&lt;wchar.h&gt;</a>
-           wchar_t *wcsstr(const wchar_t *s1, const wchar_t *s2);
-    Description
-2   The wcsstr function locates the first occurrence in the wide string pointed to by s1 of
-    the sequence of wide characters (excluding the terminating null wide character) in the
-    wide string pointed to by s2.
-    Returns
-3   The wcsstr function returns a pointer to the located wide string, or a null pointer if the
-    wide string is not found. If s2 points to a wide string with zero length, the function
-    returns s1.
-<a name="7.24.4.5.7" href="#7.24.4.5.7"><b>    7.24.4.5.7 The wcstok function</b></a>
-    Synopsis
-1          #include <a href="#7.24">&lt;wchar.h&gt;</a>
-           wchar_t *wcstok(wchar_t * restrict s1,
-                const wchar_t * restrict s2,
-                wchar_t ** restrict ptr);
-    Description
-2   A sequence of calls to the wcstok function breaks the wide string pointed to by s1 into
-    a sequence of tokens, each of which is delimited by a wide character from the wide string
-    pointed to by s2. The third argument points to a caller-provided wchar_t pointer into
-    which the wcstok function stores information necessary for it to continue scanning the
-    same wide string.
-3   The first call in a sequence has a non-null first argument and stores an initial value in the
-    object pointed to by ptr. Subsequent calls in the sequence have a null first argument and
-    the object pointed to by ptr is required to have the value stored by the previous call in
-    the sequence, which is then updated. The separator wide string pointed to by s2 may be
-    different from call to call.
-4   The first call in the sequence searches the wide string pointed to by s1 for the first wide
-    character that is not contained in the current separator wide string pointed to by s2. If no
-    such wide character is found, then there are no tokens in the wide string pointed to by s1
-    and the wcstok function returns a null pointer. If such a wide character is found, it is
-    the start of the first token.
-5   The wcstok function then searches from there for a wide character that is contained in
-    the current separator wide string. If no such wide character is found, the current token
-[<a name="p383" href="#p383">page 383</a>] (<a href="#Contents">Contents</a>)
-
-    extends to the end of the wide string pointed to by s1, and subsequent searches in the
-    same wide string for a token return a null pointer. If such a wide character is found, it is
-    overwritten by a null wide character, which terminates the current token.
-6   In all cases, the wcstok function stores sufficient information in the pointer pointed to
-    by ptr so that subsequent calls, with a null pointer for s1 and the unmodified pointer
-    value for ptr, shall start searching just past the element overwritten by a null wide
-    character (if any).
-    Returns
-7   The wcstok function returns a pointer to the first wide character of a token, or a null
-    pointer if there is no token.
-8   EXAMPLE
-           #include <a href="#7.24">&lt;wchar.h&gt;</a>
-           static wchar_t str1[] = L"?a???b,,,#c";
-           static wchar_t str2[] = L"\t \t";
-           wchar_t *t, *ptr1, *ptr2;
-           t   =   wcstok(str1,   L"?", &amp;ptr1);          //   t   points to the token L"a"
-           t   =   wcstok(NULL,   L",", &amp;ptr1);          //   t   points to the token L"??b"
-           t   =   wcstok(str2,   L" \t", &amp;ptr2);        //   t   is a null pointer
-           t   =   wcstok(NULL,   L"#,", &amp;ptr1);         //   t   points to the token L"c"
-           t   =   wcstok(NULL,   L"?", &amp;ptr1);          //   t   is a null pointer
-
-<a name="7.24.4.5.8" href="#7.24.4.5.8"><b>    7.24.4.5.8 The wmemchr function</b></a>
-    Synopsis
-1          #include <a href="#7.24">&lt;wchar.h&gt;</a>
-           wchar_t *wmemchr(const wchar_t *s, wchar_t c,
-                size_t n);
-    Description
-2   The wmemchr function locates the first occurrence of c in the initial n wide characters of
-    the object pointed to by s.
-    Returns
-3   The wmemchr function returns a pointer to the located wide character, or a null pointer if
-    the wide character does not occur in the object.
-
-
-
-
-[<a name="p384" href="#p384">page 384</a>] (<a href="#Contents">Contents</a>)
-
-<a name="7.24.4.6" href="#7.24.4.6"><b>    7.24.4.6 Miscellaneous functions</b></a>
-<a name="7.24.4.6.1" href="#7.24.4.6.1"><b>    7.24.4.6.1 The wcslen function</b></a>
-    Synopsis
-1          #include <a href="#7.24">&lt;wchar.h&gt;</a>
-           size_t wcslen(const wchar_t *s);
-    Description
-2   The wcslen function computes the length of the wide string pointed to by s.
-    Returns
-3   The wcslen function returns the number of wide characters that precede the terminating
-    null wide character.
-<a name="7.24.4.6.2" href="#7.24.4.6.2"><b>    7.24.4.6.2 The wmemset function</b></a>
-    Synopsis
-1          #include <a href="#7.24">&lt;wchar.h&gt;</a>
-           wchar_t *wmemset(wchar_t *s, wchar_t c, size_t n);
-    Description
-2   The wmemset function copies the value of c into each of the first n wide characters of
-    the object pointed to by s.
-    Returns
-3   The wmemset function returns the value of s.
-<a name="7.24.5" href="#7.24.5"><b>    7.24.5 Wide character time conversion functions</b></a>
-<a name="7.24.5.1" href="#7.24.5.1"><b>    7.24.5.1 The wcsftime function</b></a>
-    Synopsis
-1          #include <a href="#7.23">&lt;time.h&gt;</a>
-           #include <a href="#7.24">&lt;wchar.h&gt;</a>
-           size_t wcsftime(wchar_t * restrict s,
-                size_t maxsize,
-                const wchar_t * restrict format,
-                const struct tm * restrict timeptr);
-    Description
-2   The wcsftime function is equivalent to the strftime function, except that:
-    -- The argument s points to the initial element of an array of wide characters into which
-      the generated output is to be placed.
-
-
-[<a name="p385" href="#p385">page 385</a>] (<a href="#Contents">Contents</a>)
-
-    -- The argument maxsize indicates the limiting number of wide characters.
-    -- The argument format is a wide string and the conversion specifiers are replaced by
-      corresponding sequences of wide characters.
-    -- The return value indicates the number of wide characters.
-    Returns
-3   If the total number of resulting wide characters including the terminating null wide
-    character is not more than maxsize, the wcsftime function returns the number of
-    wide characters placed into the array pointed to by s not including the terminating null
-    wide character. Otherwise, zero is returned and the contents of the array are
-    indeterminate.
-<a name="7.24.6" href="#7.24.6"><b>    7.24.6 Extended multibyte/wide character conversion utilities</b></a>
-1   The header <a href="#7.24">&lt;wchar.h&gt;</a> declares an extended set of functions useful for conversion
-    between multibyte characters and wide characters.
-2   Most of the following functions -- those that are listed as ''restartable'', <a href="#7.24.6.3">7.24.6.3</a> and
-    <a href="#7.24.6.4">7.24.6.4</a> -- take as a last argument a pointer to an object of type mbstate_t that is used
-    to describe the current conversion state from a particular multibyte character sequence to
-    a wide character sequence (or the reverse) under the rules of a particular setting for the
-    LC_CTYPE category of the current locale.
-3   The initial conversion state corresponds, for a conversion in either direction, to the
-    beginning of a new multibyte character in the initial shift state. A zero-valued
-    mbstate_t object is (at least) one way to describe an initial conversion state. A zero-
-    valued mbstate_t object can be used to initiate conversion involving any multibyte
-    character sequence, in any LC_CTYPE category setting. If an mbstate_t object has
-    been altered by any of the functions described in this subclause, and is then used with a
-    different multibyte character sequence, or in the other conversion direction, or with a
-    different LC_CTYPE category setting than on earlier function calls, the behavior is
-    undefined.299)
-4   On entry, each function takes the described conversion state (either internal or pointed to
-    by an argument) as current. The conversion state described by the pointed-to object is
-    altered as needed to track the shift state, and the position within a multibyte character, for
-    the associated multibyte character sequence.
-
-
-
-
-    299) Thus, a particular mbstate_t object can be used, for example, with both the mbrtowc and
-         mbsrtowcs functions as long as they are used to step sequentially through the same multibyte
-         character string.
-
-[<a name="p386" href="#p386">page 386</a>] (<a href="#Contents">Contents</a>)
-
-<a name="7.24.6.1" href="#7.24.6.1"><b>    7.24.6.1 Single-byte/wide character conversion functions</b></a>
-<a name="7.24.6.1.1" href="#7.24.6.1.1"><b>    7.24.6.1.1 The btowc function</b></a>
-    Synopsis
-1          #include <a href="#7.19">&lt;stdio.h&gt;</a>
-           #include <a href="#7.24">&lt;wchar.h&gt;</a>
-           wint_t btowc(int c);
-    Description
-2   The btowc function determines whether c constitutes a valid single-byte character in the
-    initial shift state.
-    Returns
-3   The btowc function returns WEOF if c has the value EOF or if (unsigned char)c
-    does not constitute a valid single-byte character in the initial shift state. Otherwise, it
-    returns the wide character representation of that character.
-<a name="7.24.6.1.2" href="#7.24.6.1.2"><b>    7.24.6.1.2 The wctob function</b></a>
-    Synopsis
-1          #include <a href="#7.19">&lt;stdio.h&gt;</a>
-           #include <a href="#7.24">&lt;wchar.h&gt;</a>
-           int wctob(wint_t c);
-    Description
-2   The wctob function determines whether c corresponds to a member of the extended
-    character set whose multibyte character representation is a single byte when in the initial
-    shift state.
-    Returns
-3   The wctob function returns EOF if c does not correspond to a multibyte character with
-    length one in the initial shift state. Otherwise, it returns the single-byte representation of
-    that character as an unsigned char converted to an int.
-<a name="7.24.6.2" href="#7.24.6.2"><b>    7.24.6.2 Conversion state functions</b></a>
-<a name="7.24.6.2.1" href="#7.24.6.2.1"><b>    7.24.6.2.1 The mbsinit function</b></a>
-    Synopsis
-1          #include <a href="#7.24">&lt;wchar.h&gt;</a>
-           int mbsinit(const mbstate_t *ps);
-    Description
-2   If ps is not a null pointer, the mbsinit function determines whether the pointed-to
-    mbstate_t object describes an initial conversion state.
-[<a name="p387" href="#p387">page 387</a>] (<a href="#Contents">Contents</a>)
-
-    Returns
-3   The mbsinit function returns nonzero if ps is a null pointer or if the pointed-to object
-    describes an initial conversion state; otherwise, it returns zero.
-<a name="7.24.6.3" href="#7.24.6.3"><b>    7.24.6.3 Restartable multibyte/wide character conversion functions</b></a>
-1   These functions differ from the corresponding multibyte character functions of <a href="#7.20.7">7.20.7</a>
-    (mblen, mbtowc, and wctomb) in that they have an extra parameter, ps, of type
-    pointer to mbstate_t that points to an object that can completely describe the current
-    conversion state of the associated multibyte character sequence. If ps is a null pointer,
-    each function uses its own internal mbstate_t object instead, which is initialized at
-    program startup to the initial conversion state. The implementation behaves as if no
-    library function calls these functions with a null pointer for ps.
-2   Also unlike their corresponding functions, the return value does not represent whether the
-    encoding is state-dependent.
-<a name="7.24.6.3.1" href="#7.24.6.3.1"><b>    7.24.6.3.1 The mbrlen function</b></a>
-    Synopsis
-1          #include <a href="#7.24">&lt;wchar.h&gt;</a>
-           size_t mbrlen(const char * restrict s,
-                size_t n,
-                mbstate_t * restrict ps);
-    Description
-2   The mbrlen function is equivalent to the call:
-           mbrtowc(NULL, s, n, ps != NULL ? ps : &amp;internal)
-    where internal is the mbstate_t object for the mbrlen function, except that the
-    expression designated by ps is evaluated only once.
-    Returns
-3   The mbrlen function returns a value between zero and n, inclusive, (size_t)(-2),
-    or (size_t)(-1).
-    Forward references: the mbrtowc function (<a href="#7.24.6.3.2">7.24.6.3.2</a>).
-
-
-
-
-[<a name="p388" href="#p388">page 388</a>] (<a href="#Contents">Contents</a>)
-
-<a name="7.24.6.3.2" href="#7.24.6.3.2"><b>    7.24.6.3.2 The mbrtowc function</b></a>
-    Synopsis
-1           #include <a href="#7.24">&lt;wchar.h&gt;</a>
-            size_t mbrtowc(wchar_t * restrict pwc,
-                 const char * restrict s,
-                 size_t n,
-                 mbstate_t * restrict ps);
-    Description
-2   If s is a null pointer, the mbrtowc function is equivalent to the call:
-                    mbrtowc(NULL, "", 1, ps)
-    In this case, the values of the parameters pwc and n are ignored.
-3   If s is not a null pointer, the mbrtowc function inspects at most n bytes beginning with
-    the byte pointed to by s to determine the number of bytes needed to complete the next
-    multibyte character (including any shift sequences). If the function determines that the
-    next multibyte character is complete and valid, it determines the value of the
-    corresponding wide character and then, if pwc is not a null pointer, stores that value in
-    the object pointed to by pwc. If the corresponding wide character is the null wide
-    character, the resulting state described is the initial conversion state.
-    Returns
-4   The mbrtowc function returns the first of the following that applies (given the current
-    conversion state):
-    0                     if the next n or fewer bytes complete the multibyte character that
-                          corresponds to the null wide character (which is the value stored).
-    between 1 and n inclusive if the next n or fewer bytes complete a valid multibyte
-                       character (which is the value stored); the value returned is the number
-                       of bytes that complete the multibyte character.
-    (size_t)(-2) if the next n bytes contribute to an incomplete (but potentially valid)
-                 multibyte character, and all n bytes have been processed (no value is
-                 stored).300)
-    (size_t)(-1) if an encoding error occurs, in which case the next n or fewer bytes
-                 do not contribute to a complete and valid multibyte character (no
-                 value is stored); the value of the macro EILSEQ is stored in errno,
-                 and the conversion state is unspecified.
-
-    300) When n has at least the value of the MB_CUR_MAX macro, this case can only occur if s points at a
-         sequence of redundant shift sequences (for implementations with state-dependent encodings).
-
-[<a name="p389" href="#p389">page 389</a>] (<a href="#Contents">Contents</a>)
-
-<a name="7.24.6.3.3" href="#7.24.6.3.3"><b>    7.24.6.3.3 The wcrtomb function</b></a>
-    Synopsis
-1           #include <a href="#7.24">&lt;wchar.h&gt;</a>
-            size_t wcrtomb(char * restrict s,
-                 wchar_t wc,
-                 mbstate_t * restrict ps);
-    Description
-2   If s is a null pointer, the wcrtomb function is equivalent to the call
-                    wcrtomb(buf, L'\0', ps)
-    where buf is an internal buffer.
-3   If s is not a null pointer, the wcrtomb function determines the number of bytes needed
-    to represent the multibyte character that corresponds to the wide character given by wc
-    (including any shift sequences), and stores the multibyte character representation in the
-    array whose first element is pointed to by s. At most MB_CUR_MAX bytes are stored. If
-    wc is a null wide character, a null byte is stored, preceded by any shift sequence needed
-    to restore the initial shift state; the resulting state described is the initial conversion state.
-    Returns
-4   The wcrtomb function returns the number of bytes stored in the array object (including
-    any shift sequences). When wc is not a valid wide character, an encoding error occurs:
-    the function stores the value of the macro EILSEQ in errno and returns
-    (size_t)(-1); the conversion state is unspecified.
-<a name="7.24.6.4" href="#7.24.6.4"><b>    7.24.6.4 Restartable multibyte/wide string conversion functions</b></a>
-1   These functions differ from the corresponding multibyte string functions of <a href="#7.20.8">7.20.8</a>
-    (mbstowcs and wcstombs) in that they have an extra parameter, ps, of type pointer to
-    mbstate_t that points to an object that can completely describe the current conversion
-    state of the associated multibyte character sequence. If ps is a null pointer, each function
-    uses its own internal mbstate_t object instead, which is initialized at program startup
-    to the initial conversion state. The implementation behaves as if no library function calls
-    these functions with a null pointer for ps.
-2   Also unlike their corresponding functions, the conversion source parameter, src, has a
-    pointer-to-pointer type. When the function is storing the results of conversions (that is,
-    when dst is not a null pointer), the pointer object pointed to by this parameter is updated
-    to reflect the amount of the source processed by that invocation.
-
-
-
-
-[<a name="p390" href="#p390">page 390</a>] (<a href="#Contents">Contents</a>)
-
-<a name="7.24.6.4.1" href="#7.24.6.4.1"><b>    7.24.6.4.1 The mbsrtowcs function</b></a>
-    Synopsis
-1            #include <a href="#7.24">&lt;wchar.h&gt;</a>
-             size_t mbsrtowcs(wchar_t * restrict dst,
-                  const char ** restrict src,
-                  size_t len,
-                  mbstate_t * restrict ps);
-    Description
-2   The mbsrtowcs function converts a sequence of multibyte characters that begins in the
-    conversion state described by the object pointed to by ps, from the array indirectly
-    pointed to by src into a sequence of corresponding wide characters. If dst is not a null
-    pointer, the converted characters are stored into the array pointed to by dst. Conversion
-    continues up to and including a terminating null character, which is also stored.
-    Conversion stops earlier in two cases: when a sequence of bytes is encountered that does
-    not form a valid multibyte character, or (if dst is not a null pointer) when len wide
-    characters have been stored into the array pointed to by dst.301) Each conversion takes
-    place as if by a call to the mbrtowc function.
-3   If dst is not a null pointer, the pointer object pointed to by src is assigned either a null
-    pointer (if conversion stopped due to reaching a terminating null character) or the address
-    just past the last multibyte character converted (if any). If conversion stopped due to
-    reaching a terminating null character and if dst is not a null pointer, the resulting state
-    described is the initial conversion state.
-    Returns
-4   If the input conversion encounters a sequence of bytes that do not form a valid multibyte
-    character, an encoding error occurs: the mbsrtowcs function stores the value of the
-    macro EILSEQ in errno and returns (size_t)(-1); the conversion state is
-    unspecified. Otherwise, it returns the number of multibyte characters successfully
-    converted, not including the terminating null character (if any).
-
-
-
-
-    301) Thus, the value of len is ignored if dst is a null pointer.
-
-[<a name="p391" href="#p391">page 391</a>] (<a href="#Contents">Contents</a>)
-
-<a name="7.24.6.4.2" href="#7.24.6.4.2"><b>    7.24.6.4.2 The wcsrtombs function</b></a>
-    Synopsis
-1           #include <a href="#7.24">&lt;wchar.h&gt;</a>
-            size_t wcsrtombs(char * restrict dst,
-                 const wchar_t ** restrict src,
-                 size_t len,
-                 mbstate_t * restrict ps);
-    Description
-2   The wcsrtombs function converts a sequence of wide characters from the array
-    indirectly pointed to by src into a sequence of corresponding multibyte characters that
-    begins in the conversion state described by the object pointed to by ps. If dst is not a
-    null pointer, the converted characters are then stored into the array pointed to by dst.
-    Conversion continues up to and including a terminating null wide character, which is also
-    stored. Conversion stops earlier in two cases: when a wide character is reached that does
-    not correspond to a valid multibyte character, or (if dst is not a null pointer) when the
-    next multibyte character would exceed the limit of len total bytes to be stored into the
-    array pointed to by dst. Each conversion takes place as if by a call to the wcrtomb
-    function.302)
-3   If dst is not a null pointer, the pointer object pointed to by src is assigned either a null
-    pointer (if conversion stopped due to reaching a terminating null wide character) or the
-    address just past the last wide character converted (if any). If conversion stopped due to
-    reaching a terminating null wide character, the resulting state described is the initial
-    conversion state.
-    Returns
-4   If conversion stops because a wide character is reached that does not correspond to a
-    valid multibyte character, an encoding error occurs: the wcsrtombs function stores the
-    value of the macro EILSEQ in errno and returns (size_t)(-1); the conversion
-    state is unspecified. Otherwise, it returns the number of bytes in the resulting multibyte
-    character sequence, not including the terminating null character (if any).
-
-
-
-
-    302) If conversion stops because a terminating null wide character has been reached, the bytes stored
-         include those necessary to reach the initial shift state immediately before the null byte.
-
-[<a name="p392" href="#p392">page 392</a>] (<a href="#Contents">Contents</a>)
-
-<a name="7.25" href="#7.25"><b>    7.25 Wide character classification and mapping utilities &lt;wctype.h&gt;</b></a>
-<a name="7.25.1" href="#7.25.1"><b>    7.25.1 Introduction</b></a>
-1   The header <a href="#7.25">&lt;wctype.h&gt;</a> declares three data types, one macro, and many functions.303)
-2   The types declared are
-             wint_t
-    described in <a href="#7.24.1">7.24.1</a>;
-             wctrans_t
-    which is a scalar type that can hold values which represent locale-specific character
-    mappings; and
-             wctype_t
-    which is a scalar type that can hold values which represent locale-specific character
-    classifications.
-3   The macro defined is WEOF (described in <a href="#7.24.1">7.24.1</a>).
-4   The functions declared are grouped as follows:
-    -- Functions that provide wide character classification;
-    -- Extensible functions that provide wide character classification;
-    -- Functions that provide wide character case mapping;
-    -- Extensible functions that provide wide character mapping.
-5   For all functions described in this subclause that accept an argument of type wint_t, the
-    value shall be representable as a wchar_t or shall equal the value of the macro WEOF. If
-    this argument has any other value, the behavior is undefined.
-6   The behavior of these functions is affected by the LC_CTYPE category of the current
-    locale.
-
-
-
-
-    303) See ''future library directions'' (<a href="#7.26.13">7.26.13</a>).
-
-[<a name="p393" href="#p393">page 393</a>] (<a href="#Contents">Contents</a>)
-
-<a name="7.25.2" href="#7.25.2"><b>    7.25.2 Wide character classification utilities</b></a>
-1   The header <a href="#7.25">&lt;wctype.h&gt;</a> declares several functions useful for classifying wide
-    characters.
-2   The term printing wide character refers to a member of a locale-specific set of wide
-    characters, each of which occupies at least one printing position on a display device. The
-    term control wide character refers to a member of a locale-specific set of wide characters
-    that are not printing wide characters.
-<a name="7.25.2.1" href="#7.25.2.1"><b>    7.25.2.1 Wide character classification functions</b></a>
-1   The functions in this subclause return nonzero (true) if and only if the value of the
-    argument wc conforms to that in the description of the function.
-2   Each of the following functions returns true for each wide character that corresponds (as
-    if by a call to the wctob function) to a single-byte character for which the corresponding
-    character classification function from <a href="#7.4.1">7.4.1</a> returns true, except that the iswgraph and
-    iswpunct functions may differ with respect to wide characters other than L' ' that are
-    both printing and white-space wide characters.304)
-    Forward references: the wctob function (<a href="#7.24.6.1.2">7.24.6.1.2</a>).
-<a name="7.25.2.1.1" href="#7.25.2.1.1"><b>    7.25.2.1.1 The iswalnum function</b></a>
-    Synopsis
-1          #include <a href="#7.25">&lt;wctype.h&gt;</a>
-           int iswalnum(wint_t wc);
-    Description
-2   The iswalnum function tests for any wide character for which iswalpha or
-    iswdigit is true.
-<a name="7.25.2.1.2" href="#7.25.2.1.2"><b>    7.25.2.1.2 The iswalpha function</b></a>
-    Synopsis
-1          #include <a href="#7.25">&lt;wctype.h&gt;</a>
-           int iswalpha(wint_t wc);
-    Description
-2   The iswalpha function tests for any wide character for which iswupper or
-    iswlower is true, or any wide character that is one of a locale-specific set of alphabetic
-
-    304) For example, if the expression isalpha(wctob(wc)) evaluates to true, then the call
-         iswalpha(wc) also returns true. But, if the expression isgraph(wctob(wc)) evaluates to true
-         (which cannot occur for wc == L' ' of course), then either iswgraph(wc) or iswprint(wc)
-         &amp;&amp; iswspace(wc) is true, but not both.
-
-[<a name="p394" href="#p394">page 394</a>] (<a href="#Contents">Contents</a>)
-
-    wide characters for which none of iswcntrl, iswdigit, iswpunct, or iswspace
-    is true.305)
-<a name="7.25.2.1.3" href="#7.25.2.1.3"><b>    7.25.2.1.3 The iswblank function</b></a>
-    Synopsis
-1           #include <a href="#7.25">&lt;wctype.h&gt;</a>
-            int iswblank(wint_t wc);
-    Description
-2   The iswblank function tests for any wide character that is a standard blank wide
-    character or is one of a locale-specific set of wide characters for which iswspace is true
-    and that is used to separate words within a line of text. The standard blank wide
-    characters are the following: space (L' '), and horizontal tab (L'\t'). In the "C"
-    locale, iswblank returns true only for the standard blank characters.
-<a name="7.25.2.1.4" href="#7.25.2.1.4"><b>    7.25.2.1.4 The iswcntrl function</b></a>
-    Synopsis
-1           #include <a href="#7.25">&lt;wctype.h&gt;</a>
-            int iswcntrl(wint_t wc);
-    Description
-2   The iswcntrl function tests for any control wide character.
-<a name="7.25.2.1.5" href="#7.25.2.1.5"><b>    7.25.2.1.5 The iswdigit function</b></a>
-    Synopsis
-1           #include <a href="#7.25">&lt;wctype.h&gt;</a>
-            int iswdigit(wint_t wc);
-    Description
-2   The iswdigit function tests for any wide character that corresponds to a decimal-digit
-    character (as defined in <a href="#5.2.1">5.2.1</a>).
-<a name="7.25.2.1.6" href="#7.25.2.1.6"><b>    7.25.2.1.6 The iswgraph function</b></a>
-    Synopsis
-1           #include <a href="#7.25">&lt;wctype.h&gt;</a>
-            int iswgraph(wint_t wc);
-
-
-
-
-    305) The functions iswlower and iswupper test true or false separately for each of these additional
-         wide characters; all four combinations are possible.
-
-[<a name="p395" href="#p395">page 395</a>] (<a href="#Contents">Contents</a>)
-
-    Description
-2   The iswgraph function tests for any wide character for which iswprint is true and
-    iswspace is false.306)
-<a name="7.25.2.1.7" href="#7.25.2.1.7"><b>    7.25.2.1.7 The iswlower function</b></a>
-    Synopsis
-1           #include <a href="#7.25">&lt;wctype.h&gt;</a>
-            int iswlower(wint_t wc);
-    Description
-2   The iswlower function tests for any wide character that corresponds to a lowercase
-    letter or is one of a locale-specific set of wide characters for which none of iswcntrl,
-    iswdigit, iswpunct, or iswspace is true.
-<a name="7.25.2.1.8" href="#7.25.2.1.8"><b>    7.25.2.1.8 The iswprint function</b></a>
-    Synopsis
-1           #include <a href="#7.25">&lt;wctype.h&gt;</a>
-            int iswprint(wint_t wc);
-    Description
-2   The iswprint function tests for any printing wide character.
-<a name="7.25.2.1.9" href="#7.25.2.1.9"><b>    7.25.2.1.9 The iswpunct function</b></a>
-    Synopsis
-1           #include <a href="#7.25">&lt;wctype.h&gt;</a>
-            int iswpunct(wint_t wc);
-    Description
-2   The iswpunct function tests for any printing wide character that is one of a locale-
-    specific set of punctuation wide characters for which neither iswspace nor iswalnum
-    is true.306)
-<a name="7.25.2.1.10" href="#7.25.2.1.10"><b>    7.25.2.1.10 The iswspace function</b></a>
-    Synopsis
-1           #include <a href="#7.25">&lt;wctype.h&gt;</a>
-            int iswspace(wint_t wc);
-
-
-
-    306) Note that the behavior of the iswgraph and iswpunct functions may differ from their
-         corresponding functions in <a href="#7.4.1">7.4.1</a> with respect to printing, white-space, single-byte execution
-         characters other than ' '.
-
-[<a name="p396" href="#p396">page 396</a>] (<a href="#Contents">Contents</a>)
-
-    Description
-2   The iswspace function tests for any wide character that corresponds to a locale-specific
-    set of white-space wide characters for which none of iswalnum, iswgraph, or
-    iswpunct is true.
-<a name="7.25.2.1.11" href="#7.25.2.1.11"><b>    7.25.2.1.11 The iswupper function</b></a>
-    Synopsis
-1          #include <a href="#7.25">&lt;wctype.h&gt;</a>
-           int iswupper(wint_t wc);
-    Description
-2   The iswupper function tests for any wide character that corresponds to an uppercase
-    letter or is one of a locale-specific set of wide characters for which none of iswcntrl,
-    iswdigit, iswpunct, or iswspace is true.
-<a name="7.25.2.1.12" href="#7.25.2.1.12"><b>    7.25.2.1.12 The iswxdigit function</b></a>
-    Synopsis
-1          #include <a href="#7.25">&lt;wctype.h&gt;</a>
-           int iswxdigit(wint_t wc);
-    Description
-2   The iswxdigit function tests for any wide character that corresponds to a
-    hexadecimal-digit character (as defined in <a href="#6.4.4.1">6.4.4.1</a>).
-<a name="7.25.2.2" href="#7.25.2.2"><b>    7.25.2.2 Extensible wide character classification functions</b></a>
-1   The functions wctype and iswctype provide extensible wide character classification
-    as well as testing equivalent to that performed by the functions described in the previous
-    subclause (<a href="#7.25.2.1">7.25.2.1</a>).
-<a name="7.25.2.2.1" href="#7.25.2.2.1"><b>    7.25.2.2.1 The iswctype function</b></a>
-    Synopsis
-1          #include <a href="#7.25">&lt;wctype.h&gt;</a>
-           int iswctype(wint_t wc, wctype_t desc);
-    Description
-2   The iswctype function determines whether the wide character wc has the property
-    described by desc. The current setting of the LC_CTYPE category shall be the same as
-    during the call to wctype that returned the value desc.
-3   Each of the following expressions has a truth-value equivalent to the call to the wide
-    character classification function (<a href="#7.25.2.1">7.25.2.1</a>) in the comment that follows the expression:
-
-
-[<a name="p397" href="#p397">page 397</a>] (<a href="#Contents">Contents</a>)
-
-           iswctype(wc,       wctype("alnum"))             //   iswalnum(wc)
-           iswctype(wc,       wctype("alpha"))             //   iswalpha(wc)
-           iswctype(wc,       wctype("blank"))             //   iswblank(wc)
-           iswctype(wc,       wctype("cntrl"))             //   iswcntrl(wc)
-           iswctype(wc,       wctype("digit"))             //   iswdigit(wc)
-           iswctype(wc,       wctype("graph"))             //   iswgraph(wc)
-           iswctype(wc,       wctype("lower"))             //   iswlower(wc)
-           iswctype(wc,       wctype("print"))             //   iswprint(wc)
-           iswctype(wc,       wctype("punct"))             //   iswpunct(wc)
-           iswctype(wc,       wctype("space"))             //   iswspace(wc)
-           iswctype(wc,       wctype("upper"))             //   iswupper(wc)
-           iswctype(wc,       wctype("xdigit"))            //   iswxdigit(wc)
-    Returns
-4   The iswctype function returns nonzero (true) if and only if the value of the wide
-    character wc has the property described by desc.
-    Forward references: the wctype function (<a href="#7.25.2.2.2">7.25.2.2.2</a>).
-<a name="7.25.2.2.2" href="#7.25.2.2.2"><b>    7.25.2.2.2 The wctype function</b></a>
-    Synopsis
-1          #include <a href="#7.25">&lt;wctype.h&gt;</a>
-           wctype_t wctype(const char *property);
-    Description
-2   The wctype function constructs a value with type wctype_t that describes a class of
-    wide characters identified by the string argument property.
-3   The strings listed in the description of the iswctype function shall be valid in all
-    locales as property arguments to the wctype function.
-    Returns
-4   If property identifies a valid class of wide characters according to the LC_CTYPE
-    category of the current locale, the wctype function returns a nonzero value that is valid
-    as the second argument to the iswctype function; otherwise, it returns zero.              *
-
-
-
-
-[<a name="p398" href="#p398">page 398</a>] (<a href="#Contents">Contents</a>)
-
-<a name="7.25.3" href="#7.25.3"><b>    7.25.3 Wide character case mapping utilities</b></a>
-1   The header <a href="#7.25">&lt;wctype.h&gt;</a> declares several functions useful for mapping wide characters.
-<a name="7.25.3.1" href="#7.25.3.1"><b>    7.25.3.1 Wide character case mapping functions</b></a>
-<a name="7.25.3.1.1" href="#7.25.3.1.1"><b>    7.25.3.1.1 The towlower function</b></a>
-    Synopsis
-1          #include <a href="#7.25">&lt;wctype.h&gt;</a>
-           wint_t towlower(wint_t wc);
-    Description
-2   The towlower function converts an uppercase letter to a corresponding lowercase letter.
-    Returns
-3   If the argument is a wide character for which iswupper is true and there are one or
-    more corresponding wide characters, as specified by the current locale, for which
-    iswlower is true, the towlower function returns one of the corresponding wide
-    characters (always the same one for any given locale); otherwise, the argument is
-    returned unchanged.
-<a name="7.25.3.1.2" href="#7.25.3.1.2"><b>    7.25.3.1.2 The towupper function</b></a>
-    Synopsis
-1          #include <a href="#7.25">&lt;wctype.h&gt;</a>
-           wint_t towupper(wint_t wc);
-    Description
-2   The towupper function converts a lowercase letter to a corresponding uppercase letter.
-    Returns
-3   If the argument is a wide character for which iswlower is true and there are one or
-    more corresponding wide characters, as specified by the current locale, for which
-    iswupper is true, the towupper function returns one of the corresponding wide
-    characters (always the same one for any given locale); otherwise, the argument is
-    returned unchanged.
-<a name="7.25.3.2" href="#7.25.3.2"><b>    7.25.3.2 Extensible wide character case mapping functions</b></a>
-1   The functions wctrans and towctrans provide extensible wide character mapping as
-    well as case mapping equivalent to that performed by the functions described in the
-    previous subclause (<a href="#7.25.3.1">7.25.3.1</a>).
-
-
-
-
-[<a name="p399" href="#p399">page 399</a>] (<a href="#Contents">Contents</a>)
-
-<a name="7.25.3.2.1" href="#7.25.3.2.1"><b>    7.25.3.2.1 The towctrans function</b></a>
-    Synopsis
-1          #include <a href="#7.25">&lt;wctype.h&gt;</a>
-           wint_t towctrans(wint_t wc, wctrans_t desc);
-    Description
-2   The towctrans function maps the wide character wc using the mapping described by
-    desc. The current setting of the LC_CTYPE category shall be the same as during the call
-    to wctrans that returned the value desc.
-3   Each of the following expressions behaves the same as the call to the wide character case
-    mapping function (<a href="#7.25.3.1">7.25.3.1</a>) in the comment that follows the expression:
-           towctrans(wc, wctrans("tolower"))                      // towlower(wc)
-           towctrans(wc, wctrans("toupper"))                      // towupper(wc)
-    Returns
-4   The towctrans function returns the mapped value of wc using the mapping described
-    by desc.
-<a name="7.25.3.2.2" href="#7.25.3.2.2"><b>    7.25.3.2.2 The wctrans function</b></a>
-    Synopsis
-1          #include <a href="#7.25">&lt;wctype.h&gt;</a>
-           wctrans_t wctrans(const char *property);
-    Description
-2   The wctrans function constructs a value with type wctrans_t that describes a
-    mapping between wide characters identified by the string argument property.
-3   The strings listed in the description of the towctrans function shall be valid in all
-    locales as property arguments to the wctrans function.
-    Returns
-4   If property identifies a valid mapping of wide characters according to the LC_CTYPE
-    category of the current locale, the wctrans function returns a nonzero value that is valid
-    as the second argument to the towctrans function; otherwise, it returns zero.
-
-
-
-
-[<a name="p400" href="#p400">page 400</a>] (<a href="#Contents">Contents</a>)
-
-<a name="7.26" href="#7.26"><b>    7.26 Future library directions</b></a>
-1   The following names are grouped under individual headers for convenience. All external
-    names described below are reserved no matter what headers are included by the program.
-<a name="7.26.1" href="#7.26.1"><b>    7.26.1 Complex arithmetic &lt;complex.h&gt;</b></a>
-1   The function names
-         cerf                cexpm1              clog2
-         cerfc               clog10              clgamma
-         cexp2               clog1p              ctgamma
-    and the same names suffixed with f or l may be added to the declarations in the
-    <a href="#7.3">&lt;complex.h&gt;</a> header.
-<a name="7.26.2" href="#7.26.2"><b>    7.26.2 Character handling &lt;ctype.h&gt;</b></a>
-1   Function names that begin with either is or to, and a lowercase letter may be added to
-    the declarations in the <a href="#7.4">&lt;ctype.h&gt;</a> header.
-<a name="7.26.3" href="#7.26.3"><b>    7.26.3 Errors &lt;errno.h&gt;</b></a>
-1   Macros that begin with E and a digit or E and an uppercase letter may be added to the
-    declarations in the <a href="#7.5">&lt;errno.h&gt;</a> header.
-<a name="7.26.4" href="#7.26.4"><b>    7.26.4 Format conversion of integer types &lt;inttypes.h&gt;</b></a>
-1   Macro names beginning with PRI or SCN followed by any lowercase letter or X may be
-    added to the macros defined in the <a href="#7.8">&lt;inttypes.h&gt;</a> header.
-<a name="7.26.5" href="#7.26.5"><b>    7.26.5 Localization &lt;locale.h&gt;</b></a>
-1   Macros that begin with LC_ and an uppercase letter may be added to the definitions in
-    the <a href="#7.11">&lt;locale.h&gt;</a> header.
-<a name="7.26.6" href="#7.26.6"><b>    7.26.6 Signal handling &lt;signal.h&gt;</b></a>
-1   Macros that begin with either SIG and an uppercase letter or SIG_ and an uppercase
-    letter may be added to the definitions in the <a href="#7.14">&lt;signal.h&gt;</a> header.
-<a name="7.26.7" href="#7.26.7"><b>    7.26.7 Boolean type and values &lt;stdbool.h&gt;</b></a>
-1   The ability to undefine and perhaps then redefine the macros bool, true, and false is
-    an obsolescent feature.
-<a name="7.26.8" href="#7.26.8"><b>    7.26.8 Integer types &lt;stdint.h&gt;</b></a>
-1   Typedef names beginning with int or uint and ending with _t may be added to the
-    types defined in the <a href="#7.18">&lt;stdint.h&gt;</a> header. Macro names beginning with INT or UINT
-    and ending with _MAX, _MIN, or _C may be added to the macros defined in the
-    <a href="#7.18">&lt;stdint.h&gt;</a> header.
-[<a name="p401" href="#p401">page 401</a>] (<a href="#Contents">Contents</a>)
-
-<a name="7.26.9" href="#7.26.9"><b>    7.26.9 Input/output &lt;stdio.h&gt;</b></a>
-1   Lowercase letters may be added to the conversion specifiers and length modifiers in
-    fprintf and fscanf. Other characters may be used in extensions.
-2   The gets function is obsolescent, and is deprecated.
-3   The use of ungetc on a binary stream where the file position indicator is zero prior to
-    the call is an obsolescent feature.
-<a name="7.26.10" href="#7.26.10"><b>    7.26.10 General utilities &lt;stdlib.h&gt;</b></a>
-1   Function names that begin with str and a lowercase letter may be added to the
-    declarations in the <a href="#7.20">&lt;stdlib.h&gt;</a> header.
-<a name="7.26.11" href="#7.26.11"><b>    7.26.11 String handling &lt;string.h&gt;</b></a>
-1   Function names that begin with str, mem, or wcs and a lowercase letter may be added
-    to the declarations in the <a href="#7.21">&lt;string.h&gt;</a> header.
-<a name="7.26.12" href="#7.26.12"><b>    7.26.12 Extended multibyte and wide character utilities &lt;wchar.h&gt;</b></a>
-1   Function names that begin with wcs and a lowercase letter may be added to the
-    declarations in the <a href="#7.24">&lt;wchar.h&gt;</a> header.
-2   Lowercase letters may be added to the conversion specifiers and length modifiers in
-    fwprintf and fwscanf. Other characters may be used in extensions.
-<a name="7.26.13" href="#7.26.13"><b>    7.26.13 Wide character classification and mapping utilities</b></a>
-    <a href="#7.25">&lt;wctype.h&gt;</a>
-1   Function names that begin with is or to and a lowercase letter may be added to the
-    declarations in the <a href="#7.25">&lt;wctype.h&gt;</a> header.
-
-
-
-
-[<a name="p402" href="#p402">page 402</a>] (<a href="#Contents">Contents</a>)
-
-<a name="A" href="#A"><b>                                                   Annex A</b></a>
-                                                 (informative)
-                                  Language syntax summary
-1   NOTE     The notation is described in <a href="#6.1">6.1</a>.
-
-<a name="A.1" href="#A.1"><b>    A.1 Lexical grammar</b></a>
-<a name="A.1.1" href="#A.1.1"><b>    A.1.1 Lexical elements</b></a>
-    (<a href="#6.4">6.4</a>) token:
-                     keyword
-                     identifier
-                     constant
-                     string-literal
-                     punctuator
-    (<a href="#6.4">6.4</a>) preprocessing-token:
-                  header-name
-                  identifier
-                  pp-number
-                  character-constant
-                  string-literal
-                  punctuator
-                  each non-white-space character that cannot be one of the above
-<a name="A.1.2" href="#A.1.2"><b>    A.1.2 Keywords</b></a>
-    (<a href="#6.4.1">6.4.1</a>) keyword: one of
-                  auto                      enum             restrict    unsigned
-                  break                     extern           return      void
-                  case                      float            short       volatile
-                  char                      for              signed      while
-                  const                     goto             sizeof      _Bool
-                  continue                  if               static      _Complex
-                  default                   inline           struct      _Imaginary
-                  do                        int              switch
-                  double                    long             typedef
-                  else                      register         union
-
-
-
-
-[<a name="p403" href="#p403">page 403</a>] (<a href="#Contents">Contents</a>)
-
-<a name="A.1.3" href="#A.1.3"><b>A.1.3 Identifiers</b></a>
-(<a href="#6.4.2.1">6.4.2.1</a>) identifier:
-               identifier-nondigit
-               identifier identifier-nondigit
-               identifier digit
-(<a href="#6.4.2.1">6.4.2.1</a>) identifier-nondigit:
-               nondigit
-               universal-character-name
-               other implementation-defined characters
-(<a href="#6.4.2.1">6.4.2.1</a>) nondigit: one of
-              _ a b          c    d   e   f   g   h     i   j   k   l   m
-                   n o       p    q   r   s   t   u     v   w   x   y   z
-                   A B       C    D   E   F   G   H     I   J   K   L   M
-                   N O       P    Q   R   S   T   U     V   W   X   Y   Z
-(<a href="#6.4.2.1">6.4.2.1</a>) digit: one of
-               0 1 2         3    4   5   6   7   8     9
-<a name="A.1.4" href="#A.1.4"><b>A.1.4 Universal character names</b></a>
-(<a href="#6.4.3">6.4.3</a>) universal-character-name:
-              \u hex-quad
-              \U hex-quad hex-quad
-(<a href="#6.4.3">6.4.3</a>) hex-quad:
-              hexadecimal-digit hexadecimal-digit
-                           hexadecimal-digit hexadecimal-digit
-<a name="A.1.5" href="#A.1.5"><b>A.1.5 Constants</b></a>
-(<a href="#6.4.4">6.4.4</a>) constant:
-              integer-constant
-              floating-constant
-              enumeration-constant
-              character-constant
-(<a href="#6.4.4.1">6.4.4.1</a>) integer-constant:
-               decimal-constant integer-suffixopt
-               octal-constant integer-suffixopt
-               hexadecimal-constant integer-suffixopt
-(<a href="#6.4.4.1">6.4.4.1</a>) decimal-constant:
-              nonzero-digit
-              decimal-constant digit
-[<a name="p404" href="#p404">page 404</a>] (<a href="#Contents">Contents</a>)
-
-(<a href="#6.4.4.1">6.4.4.1</a>) octal-constant:
-               0
-               octal-constant octal-digit
-(<a href="#6.4.4.1">6.4.4.1</a>) hexadecimal-constant:
-              hexadecimal-prefix hexadecimal-digit
-              hexadecimal-constant hexadecimal-digit
-(<a href="#6.4.4.1">6.4.4.1</a>) hexadecimal-prefix: one of
-              0x 0X
-(<a href="#6.4.4.1">6.4.4.1</a>) nonzero-digit: one of
-              1 2 3 4 5              6      7   8   9
-(<a href="#6.4.4.1">6.4.4.1</a>) octal-digit: one of
-               0 1 2 3           4   5      6   7
-(<a href="#6.4.4.1">6.4.4.1</a>) hexadecimal-digit: one of
-              0 1 2 3 4 5                   6   7   8   9
-              a b c d e f
-              A B C D E F
-(<a href="#6.4.4.1">6.4.4.1</a>) integer-suffix:
-               unsigned-suffix long-suffixopt
-               unsigned-suffix long-long-suffix
-               long-suffix unsigned-suffixopt
-               long-long-suffix unsigned-suffixopt
-(<a href="#6.4.4.1">6.4.4.1</a>) unsigned-suffix: one of
-               u U
-(<a href="#6.4.4.1">6.4.4.1</a>) long-suffix: one of
-               l L
-(<a href="#6.4.4.1">6.4.4.1</a>) long-long-suffix: one of
-               ll LL
-(<a href="#6.4.4.2">6.4.4.2</a>) floating-constant:
-               decimal-floating-constant
-               hexadecimal-floating-constant
-(<a href="#6.4.4.2">6.4.4.2</a>) decimal-floating-constant:
-              fractional-constant exponent-partopt floating-suffixopt
-              digit-sequence exponent-part floating-suffixopt
-
-
-
-
-[<a name="p405" href="#p405">page 405</a>] (<a href="#Contents">Contents</a>)
-
-(<a href="#6.4.4.2">6.4.4.2</a>) hexadecimal-floating-constant:
-              hexadecimal-prefix hexadecimal-fractional-constant
-                            binary-exponent-part floating-suffixopt
-              hexadecimal-prefix hexadecimal-digit-sequence
-                            binary-exponent-part floating-suffixopt
-(<a href="#6.4.4.2">6.4.4.2</a>) fractional-constant:
-               digit-sequenceopt . digit-sequence
-               digit-sequence .
-(<a href="#6.4.4.2">6.4.4.2</a>) exponent-part:
-              e signopt digit-sequence
-              E signopt digit-sequence
-(<a href="#6.4.4.2">6.4.4.2</a>) sign: one of
-               + -
-(<a href="#6.4.4.2">6.4.4.2</a>) digit-sequence:
-               digit
-               digit-sequence digit
-(<a href="#6.4.4.2">6.4.4.2</a>) hexadecimal-fractional-constant:
-              hexadecimal-digit-sequenceopt .
-                             hexadecimal-digit-sequence
-              hexadecimal-digit-sequence .
-(<a href="#6.4.4.2">6.4.4.2</a>) binary-exponent-part:
-               p signopt digit-sequence
-               P signopt digit-sequence
-(<a href="#6.4.4.2">6.4.4.2</a>) hexadecimal-digit-sequence:
-              hexadecimal-digit
-              hexadecimal-digit-sequence hexadecimal-digit
-(<a href="#6.4.4.2">6.4.4.2</a>) floating-suffix: one of
-               f l F L
-(<a href="#6.4.4.3">6.4.4.3</a>) enumeration-constant:
-              identifier
-(<a href="#6.4.4.4">6.4.4.4</a>) character-constant:
-              ' c-char-sequence '
-              L' c-char-sequence '
-
-
-
-
-[<a name="p406" href="#p406">page 406</a>] (<a href="#Contents">Contents</a>)
-
-(<a href="#6.4.4.4">6.4.4.4</a>) c-char-sequence:
-               c-char
-               c-char-sequence c-char
-(<a href="#6.4.4.4">6.4.4.4</a>) c-char:
-               any member of the source character set except
-                            the single-quote ', backslash \, or new-line character
-               escape-sequence
-(<a href="#6.4.4.4">6.4.4.4</a>) escape-sequence:
-              simple-escape-sequence
-              octal-escape-sequence
-              hexadecimal-escape-sequence
-              universal-character-name
-(<a href="#6.4.4.4">6.4.4.4</a>) simple-escape-sequence: one of
-              \' \" \? \\
-              \a \b \f \n \r \t                   \v
-(<a href="#6.4.4.4">6.4.4.4</a>) octal-escape-sequence:
-               \ octal-digit
-               \ octal-digit octal-digit
-               \ octal-digit octal-digit octal-digit
-(<a href="#6.4.4.4">6.4.4.4</a>) hexadecimal-escape-sequence:
-              \x hexadecimal-digit
-              hexadecimal-escape-sequence hexadecimal-digit
-<a name="A.1.6" href="#A.1.6"><b>A.1.6 String literals</b></a>
-(<a href="#6.4.5">6.4.5</a>) string-literal:
-               " s-char-sequenceopt "
-               L" s-char-sequenceopt "
-(<a href="#6.4.5">6.4.5</a>) s-char-sequence:
-               s-char
-               s-char-sequence s-char
-(<a href="#6.4.5">6.4.5</a>) s-char:
-               any member of the source character set except
-                            the double-quote ", backslash \, or new-line character
-               escape-sequence
-
-
-
-
-[<a name="p407" href="#p407">page 407</a>] (<a href="#Contents">Contents</a>)
-
-<a name="A.1.7" href="#A.1.7"><b>A.1.7 Punctuators</b></a>
-(<a href="#6.4.6">6.4.6</a>) punctuator: one of
-              [ ] ( ) { } . -&gt;
-              ++ -- &amp; * + - ~ !
-              / % &lt;&lt; &gt;&gt; &lt; &gt; &lt;= &gt;=                     ==      !=    ^    |    &amp;&amp;   ||
-              ? : ; ...
-              = *= /= %= += -= &lt;&lt;=                    &gt;&gt;=      &amp;=       ^=   |=
-              , # ##
-              &lt;: :&gt; &lt;% %&gt; %: %:%:
-<a name="A.1.8" href="#A.1.8"><b>A.1.8 Header names</b></a>
-(<a href="#6.4.7">6.4.7</a>) header-name:
-              &lt; h-char-sequence &gt;
-              " q-char-sequence "
-(<a href="#6.4.7">6.4.7</a>) h-char-sequence:
-              h-char
-              h-char-sequence h-char
-(<a href="#6.4.7">6.4.7</a>) h-char:
-              any member of the source character set except
-                           the new-line character and &gt;
-(<a href="#6.4.7">6.4.7</a>) q-char-sequence:
-              q-char
-              q-char-sequence q-char
-(<a href="#6.4.7">6.4.7</a>) q-char:
-              any member of the source character set except
-                           the new-line character and "
-<a name="A.1.9" href="#A.1.9"><b>A.1.9 Preprocessing numbers</b></a>
-(<a href="#6.4.8">6.4.8</a>) pp-number:
-              digit
-              . digit
-              pp-number   digit
-              pp-number   identifier-nondigit
-              pp-number   e sign
-              pp-number   E sign
-              pp-number   p sign
-              pp-number   P sign
-              pp-number   .
-
-
-[<a name="p408" href="#p408">page 408</a>] (<a href="#Contents">Contents</a>)
-
-<a name="A.2" href="#A.2"><b>A.2 Phrase structure grammar</b></a>
-<a name="A.2.1" href="#A.2.1"><b>A.2.1 Expressions</b></a>
-(<a href="#6.5.1">6.5.1</a>) primary-expression:
-              identifier
-              constant
-              string-literal
-              ( expression )
-(<a href="#6.5.2">6.5.2</a>) postfix-expression:
-              primary-expression
-              postfix-expression [ expression ]
-              postfix-expression ( argument-expression-listopt )
-              postfix-expression . identifier
-              postfix-expression -&gt; identifier
-              postfix-expression ++
-              postfix-expression --
-              ( type-name ) { initializer-list }
-              ( type-name ) { initializer-list , }
-(<a href="#6.5.2">6.5.2</a>) argument-expression-list:
-             assignment-expression
-             argument-expression-list , assignment-expression
-(<a href="#6.5.3">6.5.3</a>) unary-expression:
-              postfix-expression
-              ++ unary-expression
-              -- unary-expression
-              unary-operator cast-expression
-              sizeof unary-expression
-              sizeof ( type-name )
-(<a href="#6.5.3">6.5.3</a>) unary-operator: one of
-              &amp; * + - ~             !
-(<a href="#6.5.4">6.5.4</a>) cast-expression:
-               unary-expression
-               ( type-name ) cast-expression
-(<a href="#6.5.5">6.5.5</a>) multiplicative-expression:
-               cast-expression
-               multiplicative-expression * cast-expression
-               multiplicative-expression / cast-expression
-               multiplicative-expression % cast-expression
-
-[<a name="p409" href="#p409">page 409</a>] (<a href="#Contents">Contents</a>)
-
-(<a href="#6.5.6">6.5.6</a>) additive-expression:
-               multiplicative-expression
-               additive-expression + multiplicative-expression
-               additive-expression - multiplicative-expression
-(<a href="#6.5.7">6.5.7</a>) shift-expression:
-                additive-expression
-                shift-expression &lt;&lt; additive-expression
-                shift-expression &gt;&gt; additive-expression
-(<a href="#6.5.8">6.5.8</a>) relational-expression:
-               shift-expression
-               relational-expression   &lt;    shift-expression
-               relational-expression   &gt;    shift-expression
-               relational-expression   &lt;=   shift-expression
-               relational-expression   &gt;=   shift-expression
-(<a href="#6.5.9">6.5.9</a>) equality-expression:
-               relational-expression
-               equality-expression == relational-expression
-               equality-expression != relational-expression
-(<a href="#6.5.10">6.5.10</a>) AND-expression:
-             equality-expression
-             AND-expression &amp; equality-expression
-(<a href="#6.5.11">6.5.11</a>) exclusive-OR-expression:
-              AND-expression
-              exclusive-OR-expression ^ AND-expression
-(<a href="#6.5.12">6.5.12</a>) inclusive-OR-expression:
-               exclusive-OR-expression
-               inclusive-OR-expression | exclusive-OR-expression
-(<a href="#6.5.13">6.5.13</a>) logical-AND-expression:
-              inclusive-OR-expression
-              logical-AND-expression &amp;&amp; inclusive-OR-expression
-(<a href="#6.5.14">6.5.14</a>) logical-OR-expression:
-              logical-AND-expression
-              logical-OR-expression || logical-AND-expression
-(<a href="#6.5.15">6.5.15</a>) conditional-expression:
-              logical-OR-expression
-              logical-OR-expression ? expression : conditional-expression
-
-[<a name="p410" href="#p410">page 410</a>] (<a href="#Contents">Contents</a>)
-
-(<a href="#6.5.16">6.5.16</a>) assignment-expression:
-              conditional-expression
-              unary-expression assignment-operator assignment-expression
-(<a href="#6.5.16">6.5.16</a>) assignment-operator: one of
-              = *= /= %= +=                -=    &lt;&lt;=    &gt;&gt;=      &amp;=   ^=   |=
-(<a href="#6.5.17">6.5.17</a>) expression:
-              assignment-expression
-              expression , assignment-expression
-(<a href="#6.6">6.6</a>) constant-expression:
-              conditional-expression
-<a name="A.2.2" href="#A.2.2"><b>A.2.2 Declarations</b></a>
-(<a href="#6.7">6.7</a>) declaration:
-               declaration-specifiers init-declarator-listopt ;
-(<a href="#6.7">6.7</a>) declaration-specifiers:
-               storage-class-specifier declaration-specifiersopt
-               type-specifier declaration-specifiersopt
-               type-qualifier declaration-specifiersopt
-               function-specifier declaration-specifiersopt
-(<a href="#6.7">6.7</a>) init-declarator-list:
-               init-declarator
-               init-declarator-list , init-declarator
-(<a href="#6.7">6.7</a>) init-declarator:
-               declarator
-               declarator = initializer
-(<a href="#6.7.1">6.7.1</a>) storage-class-specifier:
-              typedef
-              extern
-              static
-              auto
-              register
-
-
-
-
-[<a name="p411" href="#p411">page 411</a>] (<a href="#Contents">Contents</a>)
-
-(<a href="#6.7.2">6.7.2</a>) type-specifier:
-               void
-               char
-               short
-               int
-               long
-               float
-               double
-               signed
-               unsigned
-               _Bool
-               _Complex
-               struct-or-union-specifier                                                 *
-               enum-specifier
-               typedef-name
-(<a href="#6.7.2.1">6.7.2.1</a>) struct-or-union-specifier:
-               struct-or-union identifieropt { struct-declaration-list }
-               struct-or-union identifier
-(<a href="#6.7.2.1">6.7.2.1</a>) struct-or-union:
-               struct
-               union
-(<a href="#6.7.2.1">6.7.2.1</a>) struct-declaration-list:
-               struct-declaration
-               struct-declaration-list struct-declaration
-(<a href="#6.7.2.1">6.7.2.1</a>) struct-declaration:
-               specifier-qualifier-list struct-declarator-list ;
-(<a href="#6.7.2.1">6.7.2.1</a>) specifier-qualifier-list:
-               type-specifier specifier-qualifier-listopt
-               type-qualifier specifier-qualifier-listopt
-(<a href="#6.7.2.1">6.7.2.1</a>) struct-declarator-list:
-               struct-declarator
-               struct-declarator-list , struct-declarator
-(<a href="#6.7.2.1">6.7.2.1</a>) struct-declarator:
-               declarator
-               declaratoropt : constant-expression
-
-
-
-
-[<a name="p412" href="#p412">page 412</a>] (<a href="#Contents">Contents</a>)
-
-(<a href="#6.7.2.2">6.7.2.2</a>) enum-specifier:
-              enum identifieropt { enumerator-list }
-              enum identifieropt { enumerator-list , }
-              enum identifier
-(<a href="#6.7.2.2">6.7.2.2</a>) enumerator-list:
-              enumerator
-              enumerator-list , enumerator
-(<a href="#6.7.2.2">6.7.2.2</a>) enumerator:
-              enumeration-constant
-              enumeration-constant = constant-expression
-(<a href="#6.7.3">6.7.3</a>) type-qualifier:
-              const
-              restrict
-              volatile
-(<a href="#6.7.4">6.7.4</a>) function-specifier:
-               inline
-(<a href="#6.7.5">6.7.5</a>) declarator:
-              pointeropt direct-declarator
-(<a href="#6.7.5">6.7.5</a>) direct-declarator:
-               identifier
-               ( declarator )
-               direct-declarator [ type-qualifier-listopt assignment-expressionopt ]
-               direct-declarator [ static type-qualifier-listopt assignment-expression ]
-               direct-declarator [ type-qualifier-list static assignment-expression ]
-               direct-declarator [ type-qualifier-listopt * ]
-               direct-declarator ( parameter-type-list )
-               direct-declarator ( identifier-listopt )
-(<a href="#6.7.5">6.7.5</a>) pointer:
-               * type-qualifier-listopt
-               * type-qualifier-listopt pointer
-(<a href="#6.7.5">6.7.5</a>) type-qualifier-list:
-              type-qualifier
-              type-qualifier-list type-qualifier
-(<a href="#6.7.5">6.7.5</a>) parameter-type-list:
-             parameter-list
-             parameter-list , ...
-
-[<a name="p413" href="#p413">page 413</a>] (<a href="#Contents">Contents</a>)
-
-(<a href="#6.7.5">6.7.5</a>) parameter-list:
-             parameter-declaration
-             parameter-list , parameter-declaration
-(<a href="#6.7.5">6.7.5</a>) parameter-declaration:
-             declaration-specifiers declarator
-             declaration-specifiers abstract-declaratoropt
-(<a href="#6.7.5">6.7.5</a>) identifier-list:
-               identifier
-               identifier-list , identifier
-(<a href="#6.7.6">6.7.6</a>) type-name:
-              specifier-qualifier-list abstract-declaratoropt
-(<a href="#6.7.6">6.7.6</a>) abstract-declarator:
-              pointer
-              pointeropt direct-abstract-declarator
-(<a href="#6.7.6">6.7.6</a>) direct-abstract-declarator:
-               ( abstract-declarator )
-               direct-abstract-declaratoropt [ type-qualifier-listopt
-                              assignment-expressionopt ]
-               direct-abstract-declaratoropt [ static type-qualifier-listopt
-                              assignment-expression ]
-               direct-abstract-declaratoropt [ type-qualifier-list static
-                              assignment-expression ]
-               direct-abstract-declaratoropt [ * ]
-               direct-abstract-declaratoropt ( parameter-type-listopt )
-(<a href="#6.7.7">6.7.7</a>) typedef-name:
-              identifier
-(<a href="#6.7.8">6.7.8</a>) initializer:
-                assignment-expression
-                { initializer-list }
-                { initializer-list , }
-(<a href="#6.7.8">6.7.8</a>) initializer-list:
-                designationopt initializer
-                initializer-list , designationopt initializer
-(<a href="#6.7.8">6.7.8</a>) designation:
-              designator-list =
-
-
-
-[<a name="p414" href="#p414">page 414</a>] (<a href="#Contents">Contents</a>)
-
-(<a href="#6.7.8">6.7.8</a>) designator-list:
-              designator
-              designator-list designator
-(<a href="#6.7.8">6.7.8</a>) designator:
-              [ constant-expression ]
-              . identifier
-<a name="A.2.3" href="#A.2.3"><b>A.2.3 Statements</b></a>
-(<a href="#6.8">6.8</a>) statement:
-              labeled-statement
-              compound-statement
-              expression-statement
-              selection-statement
-              iteration-statement
-              jump-statement
-(<a href="#6.8.1">6.8.1</a>) labeled-statement:
-               identifier : statement
-               case constant-expression : statement
-               default : statement
-(<a href="#6.8.2">6.8.2</a>) compound-statement:
-             { block-item-listopt }
-(<a href="#6.8.2">6.8.2</a>) block-item-list:
-               block-item
-               block-item-list block-item
-(<a href="#6.8.2">6.8.2</a>) block-item:
-               declaration
-               statement
-(<a href="#6.8.3">6.8.3</a>) expression-statement:
-              expressionopt ;
-(<a href="#6.8.4">6.8.4</a>) selection-statement:
-               if ( expression ) statement
-               if ( expression ) statement else statement
-               switch ( expression ) statement
-
-
-
-
-[<a name="p415" href="#p415">page 415</a>] (<a href="#Contents">Contents</a>)
-
-(<a href="#6.8.5">6.8.5</a>) iteration-statement:
-                while ( expression ) statement
-                do statement while ( expression ) ;
-                for ( expressionopt ; expressionopt ; expressionopt ) statement
-                for ( declaration expressionopt ; expressionopt ) statement
-(<a href="#6.8.6">6.8.6</a>) jump-statement:
-              goto identifier ;
-              continue ;
-              break ;
-              return expressionopt ;
-<a name="A.2.4" href="#A.2.4"><b>A.2.4 External definitions</b></a>
-(<a href="#6.9">6.9</a>) translation-unit:
-               external-declaration
-               translation-unit external-declaration
-(<a href="#6.9">6.9</a>) external-declaration:
-               function-definition
-               declaration
-(<a href="#6.9.1">6.9.1</a>) function-definition:
-               declaration-specifiers declarator declaration-listopt compound-statement
-(<a href="#6.9.1">6.9.1</a>) declaration-list:
-              declaration
-              declaration-list declaration
-<a name="A.3" href="#A.3"><b>A.3 Preprocessing directives</b></a>
-(<a href="#6.10">6.10</a>) preprocessing-file:
-              groupopt
-(<a href="#6.10">6.10</a>) group:
-                group-part
-                group group-part
-(<a href="#6.10">6.10</a>) group-part:
-              if-section
-              control-line
-              text-line
-              # non-directive
-(<a href="#6.10">6.10</a>) if-section:
-                if-group elif-groupsopt else-groupopt endif-line
-
-
-[<a name="p416" href="#p416">page 416</a>] (<a href="#Contents">Contents</a>)
-
-(<a href="#6.10">6.10</a>) if-group:
-               # if     constant-expression new-line groupopt
-               # ifdef identifier new-line groupopt
-               # ifndef identifier new-line groupopt
-(<a href="#6.10">6.10</a>) elif-groups:
-               elif-group
-               elif-groups elif-group
-(<a href="#6.10">6.10</a>) elif-group:
-               # elif        constant-expression new-line groupopt
-(<a href="#6.10">6.10</a>) else-group:
-               # else        new-line groupopt
-(<a href="#6.10">6.10</a>) endif-line:
-               # endif       new-line
-(<a href="#6.10">6.10</a>) control-line:
-              # include pp-tokens new-line
-              # define identifier replacement-list new-line
-              # define identifier lparen identifier-listopt )
-                                              replacement-list new-line
-              # define identifier lparen ... ) replacement-list new-line
-              # define identifier lparen identifier-list , ... )
-                                              replacement-list new-line
-              # undef   identifier new-line
-              # line    pp-tokens new-line
-              # error   pp-tokensopt new-line
-              # pragma pp-tokensopt new-line
-              #         new-line
-(<a href="#6.10">6.10</a>) text-line:
-               pp-tokensopt new-line
-(<a href="#6.10">6.10</a>) non-directive:
-              pp-tokens new-line
-(<a href="#6.10">6.10</a>) lparen:
-                 a ( character not immediately preceded by white-space
-(<a href="#6.10">6.10</a>) replacement-list:
-              pp-tokensopt
-
-
-
-
-[<a name="p417" href="#p417">page 417</a>] (<a href="#Contents">Contents</a>)
-
-(<a href="#6.10">6.10</a>) pp-tokens:
-              preprocessing-token
-              pp-tokens preprocessing-token
-(<a href="#6.10">6.10</a>) new-line:
-              the new-line character
-
-
-
-
-[<a name="p418" href="#p418">page 418</a>] (<a href="#Contents">Contents</a>)
-
-<a name="B" href="#B"><b>                                Annex B</b></a>
-                              (informative)
-                          Library summary
-<a name="B.1" href="#B.1"><b>B.1 Diagnostics &lt;assert.h&gt;</b></a>
-       NDEBUG
-       void assert(scalar expression);
-<a name="B.2" href="#B.2"><b>B.2 Complex &lt;complex.h&gt;</b></a>
-       complex               imaginary               I
-       _Complex_I            _Imaginary_I
-       #pragma STDC CX_LIMITED_RANGE on-off-switch
-       double complex cacos(double complex z);
-       float complex cacosf(float complex z);
-       long double complex cacosl(long double complex z);
-       double complex casin(double complex z);
-       float complex casinf(float complex z);
-       long double complex casinl(long double complex z);
-       double complex catan(double complex z);
-       float complex catanf(float complex z);
-       long double complex catanl(long double complex z);
-       double complex ccos(double complex z);
-       float complex ccosf(float complex z);
-       long double complex ccosl(long double complex z);
-       double complex csin(double complex z);
-       float complex csinf(float complex z);
-       long double complex csinl(long double complex z);
-       double complex ctan(double complex z);
-       float complex ctanf(float complex z);
-       long double complex ctanl(long double complex z);
-       double complex cacosh(double complex z);
-       float complex cacoshf(float complex z);
-       long double complex cacoshl(long double complex z);
-       double complex casinh(double complex z);
-       float complex casinhf(float complex z);
-       long double complex casinhl(long double complex z);
-       double complex catanh(double complex z);
-       float complex catanhf(float complex z);
-       long double complex catanhl(long double complex z);
-[<a name="p419" href="#p419">page 419</a>] (<a href="#Contents">Contents</a>)
-
-      double complex ccosh(double complex z);
-      float complex ccoshf(float complex z);
-      long double complex ccoshl(long double complex z);
-      double complex csinh(double complex z);
-      float complex csinhf(float complex z);
-      long double complex csinhl(long double complex z);
-      double complex ctanh(double complex z);
-      float complex ctanhf(float complex z);
-      long double complex ctanhl(long double complex z);
-      double complex cexp(double complex z);
-      float complex cexpf(float complex z);
-      long double complex cexpl(long double complex z);
-      double complex clog(double complex z);
-      float complex clogf(float complex z);
-      long double complex clogl(long double complex z);
-      double cabs(double complex z);
-      float cabsf(float complex z);
-      long double cabsl(long double complex z);
-      double complex cpow(double complex x, double complex y);
-      float complex cpowf(float complex x, float complex y);
-      long double complex cpowl(long double complex x,
-           long double complex y);
-      double complex csqrt(double complex z);
-      float complex csqrtf(float complex z);
-      long double complex csqrtl(long double complex z);
-      double carg(double complex z);
-      float cargf(float complex z);
-      long double cargl(long double complex z);
-      double cimag(double complex z);
-      float cimagf(float complex z);
-      long double cimagl(long double complex z);
-      double complex conj(double complex z);
-      float complex conjf(float complex z);
-      long double complex conjl(long double complex z);
-      double complex cproj(double complex z);
-      float complex cprojf(float complex z);
-      long double complex cprojl(long double complex z);
-      double creal(double complex z);
-      float crealf(float complex z);
-      long double creall(long double complex z);
-
-
-[<a name="p420" href="#p420">page 420</a>] (<a href="#Contents">Contents</a>)
-
-<a name="B.3" href="#B.3"><b>B.3 Character handling &lt;ctype.h&gt;</b></a>
-       int    isalnum(int c);
-       int    isalpha(int c);
-       int    isblank(int c);
-       int    iscntrl(int c);
-       int    isdigit(int c);
-       int    isgraph(int c);
-       int    islower(int c);
-       int    isprint(int c);
-       int    ispunct(int c);
-       int    isspace(int c);
-       int    isupper(int c);
-       int    isxdigit(int c);
-       int    tolower(int c);
-       int    toupper(int c);
-<a name="B.4" href="#B.4"><b>B.4 Errors &lt;errno.h&gt;</b></a>
-       EDOM            EILSEQ             ERANGE            errno
-<a name="B.5" href="#B.5"><b>B.5 Floating-point environment &lt;fenv.h&gt;</b></a>
-       fenv_t                 FE_OVERFLOW             FE_TOWARDZERO
-       fexcept_t              FE_UNDERFLOW            FE_UPWARD
-       FE_DIVBYZERO           FE_ALL_EXCEPT           FE_DFL_ENV
-       FE_INEXACT             FE_DOWNWARD
-       FE_INVALID             FE_TONEAREST
-       #pragma STDC FENV_ACCESS on-off-switch
-       int feclearexcept(int excepts);
-       int fegetexceptflag(fexcept_t *flagp, int excepts);
-       int feraiseexcept(int excepts);
-       int fesetexceptflag(const fexcept_t *flagp,
-            int excepts);
-       int fetestexcept(int excepts);
-       int fegetround(void);
-       int fesetround(int round);
-       int fegetenv(fenv_t *envp);
-       int feholdexcept(fenv_t *envp);
-       int fesetenv(const fenv_t *envp);
-       int feupdateenv(const fenv_t *envp);
-
-
-
-[<a name="p421" href="#p421">page 421</a>] (<a href="#Contents">Contents</a>)
-
-<a name="B.6" href="#B.6"><b>B.6 Characteristics of floating types &lt;float.h&gt;</b></a>
-      FLT_ROUNDS              DBL_MIN_EXP             FLT_MAX
-      FLT_EVAL_METHOD         LDBL_MIN_EXP            DBL_MAX
-      FLT_RADIX               FLT_MIN_10_EXP          LDBL_MAX
-      FLT_MANT_DIG            DBL_MIN_10_EXP          FLT_EPSILON
-      DBL_MANT_DIG            LDBL_MIN_10_EXP         DBL_EPSILON
-      LDBL_MANT_DIG           FLT_MAX_EXP             LDBL_EPSILON
-      DECIMAL_DIG             DBL_MAX_EXP             FLT_MIN
-      FLT_DIG                 LDBL_MAX_EXP            DBL_MIN
-      DBL_DIG                 FLT_MAX_10_EXP          LDBL_MIN
-      LDBL_DIG                DBL_MAX_10_EXP
-      FLT_MIN_EXP             LDBL_MAX_10_EXP
-<a name="B.7" href="#B.7"><b>B.7 Format conversion of integer types &lt;inttypes.h&gt;</b></a>
-      imaxdiv_t
-      PRIdN        PRIdLEASTN        PRIdFASTN        PRIdMAX     PRIdPTR
-      PRIiN        PRIiLEASTN        PRIiFASTN        PRIiMAX     PRIiPTR
-      PRIoN        PRIoLEASTN        PRIoFASTN        PRIoMAX     PRIoPTR
-      PRIuN        PRIuLEASTN        PRIuFASTN        PRIuMAX     PRIuPTR
-      PRIxN        PRIxLEASTN        PRIxFASTN        PRIxMAX     PRIxPTR
-      PRIXN        PRIXLEASTN        PRIXFASTN        PRIXMAX     PRIXPTR
-      SCNdN        SCNdLEASTN        SCNdFASTN        SCNdMAX     SCNdPTR
-      SCNiN        SCNiLEASTN        SCNiFASTN        SCNiMAX     SCNiPTR
-      SCNoN        SCNoLEASTN        SCNoFASTN        SCNoMAX     SCNoPTR
-      SCNuN        SCNuLEASTN        SCNuFASTN        SCNuMAX     SCNuPTR
-      SCNxN        SCNxLEASTN        SCNxFASTN        SCNxMAX     SCNxPTR
-      intmax_t imaxabs(intmax_t j);
-      imaxdiv_t imaxdiv(intmax_t numer, intmax_t denom);
-      intmax_t strtoimax(const char * restrict nptr,
-              char ** restrict endptr, int base);
-      uintmax_t strtoumax(const char * restrict nptr,
-              char ** restrict endptr, int base);
-      intmax_t wcstoimax(const wchar_t * restrict nptr,
-              wchar_t ** restrict endptr, int base);
-      uintmax_t wcstoumax(const wchar_t * restrict nptr,
-              wchar_t ** restrict endptr, int base);
-
-
-
-
-[<a name="p422" href="#p422">page 422</a>] (<a href="#Contents">Contents</a>)
-
-<a name="B.8" href="#B.8"><b>B.8 Alternative spellings &lt;iso646.h&gt;</b></a>
-     and             bitor             not_eq            xor
-     and_eq          compl             or                xor_eq
-     bitand          not               or_eq
-<a name="B.9" href="#B.9"><b>B.9 Sizes of integer types &lt;limits.h&gt;</b></a>
-     CHAR_BIT        CHAR_MAX          INT_MIN           ULONG_MAX
-     SCHAR_MIN       MB_LEN_MAX        INT_MAX           LLONG_MIN
-     SCHAR_MAX       SHRT_MIN          UINT_MAX          LLONG_MAX
-     UCHAR_MAX       SHRT_MAX          LONG_MIN          ULLONG_MAX
-     CHAR_MIN        USHRT_MAX         LONG_MAX
-<a name="B.10" href="#B.10"><b>B.10 Localization &lt;locale.h&gt;</b></a>
-     struct lconv    LC_ALL            LC_CTYPE          LC_NUMERIC
-     NULL            LC_COLLATE        LC_MONETARY       LC_TIME
-     char *setlocale(int category, const char *locale);
-     struct lconv *localeconv(void);
-<a name="B.11" href="#B.11"><b>B.11 Mathematics &lt;math.h&gt;</b></a>
-     float_t               FP_INFINITE             FP_FAST_FMAL
-     double_t              FP_NAN                  FP_ILOGB0
-     HUGE_VAL              FP_NORMAL               FP_ILOGBNAN
-     HUGE_VALF             FP_SUBNORMAL            MATH_ERRNO
-     HUGE_VALL             FP_ZERO                 MATH_ERREXCEPT
-     INFINITY              FP_FAST_FMA             math_errhandling
-     NAN                   FP_FAST_FMAF
-      #pragma STDC FP_CONTRACT on-off-switch
-      int fpclassify(real-floating x);
-      int isfinite(real-floating x);
-      int isinf(real-floating x);
-      int isnan(real-floating x);
-      int isnormal(real-floating x);
-      int signbit(real-floating x);
-      double acos(double x);
-      float acosf(float x);
-      long double acosl(long double x);
-      double asin(double x);
-      float asinf(float x);
-      long double asinl(long double x);
-      double atan(double x);
-[<a name="p423" href="#p423">page 423</a>] (<a href="#Contents">Contents</a>)
-
-      float atanf(float x);
-      long double atanl(long double x);
-      double atan2(double y, double x);
-      float atan2f(float y, float x);
-      long double atan2l(long double y, long double x);
-      double cos(double x);
-      float cosf(float x);
-      long double cosl(long double x);
-      double sin(double x);
-      float sinf(float x);
-      long double sinl(long double x);
-      double tan(double x);
-      float tanf(float x);
-      long double tanl(long double x);
-      double acosh(double x);
-      float acoshf(float x);
-      long double acoshl(long double x);
-      double asinh(double x);
-      float asinhf(float x);
-      long double asinhl(long double x);
-      double atanh(double x);
-      float atanhf(float x);
-      long double atanhl(long double x);
-      double cosh(double x);
-      float coshf(float x);
-      long double coshl(long double x);
-      double sinh(double x);
-      float sinhf(float x);
-      long double sinhl(long double x);
-      double tanh(double x);
-      float tanhf(float x);
-      long double tanhl(long double x);
-      double exp(double x);
-      float expf(float x);
-      long double expl(long double x);
-      double exp2(double x);
-      float exp2f(float x);
-      long double exp2l(long double x);
-      double expm1(double x);
-      float expm1f(float x);
-      long double expm1l(long double x);
-
-[<a name="p424" href="#p424">page 424</a>] (<a href="#Contents">Contents</a>)
-
-        double frexp(double value, int *exp);
-        float frexpf(float value, int *exp);
-        long double frexpl(long double value, int *exp);
-        int ilogb(double x);
-        int ilogbf(float x);
-        int ilogbl(long double x);
+        }
+</pre>
+
+<h4><a name="7.6.4" href="#7.6.4">7.6.4 Environment</a></h4>
+<p><!--para 1 -->
+ The functions in this section manage the floating-point environment -- status flags and
+ control modes -- as one entity.
+
+<h5><a name="7.6.4.1" href="#7.6.4.1">7.6.4.1 The fegetenv function</a></h5>
+<p><b>Synopsis</b>
+<p><!--para 1 -->
+<pre>
+        #include <a href="#7.6">&lt;fenv.h&gt;</a>
+        int fegetenv(fenv_t *envp);
+</pre>
+<p><b>Description</b>
+<p><!--para 2 -->
+ The fegetenv function attempts to store the current floating-point environment in the
+ object pointed to by envp.
+<p><b>Returns</b>
+<p><!--para 3 -->
+ The fegetenv function returns zero if the environment was successfully stored.
+ Otherwise, it returns a nonzero value.
+
+<h5><a name="7.6.4.2" href="#7.6.4.2">7.6.4.2 The feholdexcept function</a></h5>
+<p><b>Synopsis</b>
+<p><!--para 1 -->
+<pre>
+        #include <a href="#7.6">&lt;fenv.h&gt;</a>
+        int feholdexcept(fenv_t *envp);
+</pre>
+<p><b>Description</b>
+<p><!--para 2 -->
+ The feholdexcept function saves the current floating-point environment in the object
+ pointed to by envp, clears the floating-point status flags, and then installs a non-stop
+ (continue on floating-point exceptions) mode, if available, for all floating-point
+ exceptions.<sup><a href="#note189"><b>189)</b></a></sup>
+<!--page 207 -->
+<p><b>Returns</b>
+<p><!--para 3 -->
+ The feholdexcept function returns zero if and only if non-stop floating-point
+ exception handling was successfully installed.
+
+<p><b>Footnotes</b>
+<p><small><a name="note189" href="#note189">189)</a> IEC 60559 systems have a default non-stop mode, and typically at least one other mode for trap
+ handling or aborting; if the system provides only the non-stop mode then installing it is trivial. For
+ such systems, the feholdexcept function can be used in conjunction with the feupdateenv
+ function to write routines that hide spurious floating-point exceptions from their callers.
+</small>
+
+<h5><a name="7.6.4.3" href="#7.6.4.3">7.6.4.3 The fesetenv function</a></h5>
+<p><b>Synopsis</b>
+<p><!--para 1 -->
+<pre>
+         #include <a href="#7.6">&lt;fenv.h&gt;</a>
+         int fesetenv(const fenv_t *envp);
+</pre>
+<p><b>Description</b>
+<p><!--para 2 -->
+ The fesetenv function attempts to establish the floating-point environment represented
+ by the object pointed to by envp. The argument envp shall point to an object set by a
+ call to fegetenv or feholdexcept, or equal a floating-point environment macro.
+ Note that fesetenv merely installs the state of the floating-point status flags
+ represented through its argument, and does not raise these floating-point exceptions.
+<p><b>Returns</b>
+<p><!--para 3 -->
+ The fesetenv function returns zero if the environment was successfully established.
+ Otherwise, it returns a nonzero value.
+
+<h5><a name="7.6.4.4" href="#7.6.4.4">7.6.4.4 The feupdateenv function</a></h5>
+<p><b>Synopsis</b>
+<p><!--para 1 -->
+<pre>
+         #include <a href="#7.6">&lt;fenv.h&gt;</a>
+         int feupdateenv(const fenv_t *envp);
+</pre>
+<p><b>Description</b>
+<p><!--para 2 -->
+ The feupdateenv function attempts to save the currently raised floating-point
+ exceptions in its automatic storage, install the floating-point environment represented by
+ the object pointed to by envp, and then raise the saved floating-point exceptions. The
+ argument envp shall point to an object set by a call to feholdexcept or fegetenv,
+ or equal a floating-point environment macro.
+<p><b>Returns</b>
+<p><!--para 3 -->
+ The feupdateenv function returns zero if all the actions were successfully carried out.
+ Otherwise, it returns a nonzero value.
+<!--page 208 -->
+<p><!--para 4 -->
+ EXAMPLE   Hide spurious underflow floating-point exceptions:
+<!--page 209 -->
+<pre>
+       #include <a href="#7.6">&lt;fenv.h&gt;</a>
+       double f(double x)
+       {
+             #pragma STDC FENV_ACCESS ON
+             double result;
+             fenv_t save_env;
+             if (feholdexcept(&amp;save_env))
+                   return /* indication of an environmental problem */;
+             // compute result
+             if (/* test spurious underflow */)
+                   if (feclearexcept(FE_UNDERFLOW))
+                            return /* indication of an environmental problem */;
+             if (feupdateenv(&amp;save_env))
+                   return /* indication of an environmental problem */;
+             return result;
+       }
+</pre>
+
+<h3><a name="7.7" href="#7.7">7.7 Characteristics of floating types &lt;float.h&gt;</a></h3>
+<p><!--para 1 -->
+ The header <a href="#7.7">&lt;float.h&gt;</a> defines several macros that expand to various limits and
+ parameters of the standard floating-point types.
+<p><!--para 2 -->
+ The macros, their meanings, and the constraints (or restrictions) on their values are listed
+ in <a href="#5.2.4.2.2">5.2.4.2.2</a>.
+<!--page 210 -->
+
+<h3><a name="7.8" href="#7.8">7.8 Format conversion of integer types &lt;inttypes.h&gt;</a></h3>
+<p><!--para 1 -->
+ The header <a href="#7.8">&lt;inttypes.h&gt;</a> includes the header <a href="#7.18">&lt;stdint.h&gt;</a> and extends it with
+ additional facilities provided by hosted implementations.
+<p><!--para 2 -->
+ It declares functions for manipulating greatest-width integers and converting numeric
+ character strings to greatest-width integers, and it declares the type
+<pre>
+          imaxdiv_t
+</pre>
+ which is a structure type that is the type of the value returned by the imaxdiv function.
+ For each type declared in <a href="#7.18">&lt;stdint.h&gt;</a>, it defines corresponding macros for conversion
+ specifiers for use with the formatted input/output functions.<sup><a href="#note190"><b>190)</b></a></sup>
+<p><b> Forward references</b>: integer types <a href="#7.18">&lt;stdint.h&gt;</a> (<a href="#7.18">7.18</a>), formatted input/output
+ functions (<a href="#7.19.6">7.19.6</a>), formatted wide character input/output functions (<a href="#7.24.2">7.24.2</a>).
+
+<p><b>Footnotes</b>
+<p><small><a name="note190" href="#note190">190)</a> See ''future library directions'' (<a href="#7.26.4">7.26.4</a>).
+</small>
+
+<h4><a name="7.8.1" href="#7.8.1">7.8.1 Macros for format specifiers</a></h4>
+<p><!--para 1 -->
+ Each of the following object-like macros<sup><a href="#note191"><b>191)</b></a></sup> expands to a character string literal
+ containing a conversion specifier, possibly modified by a length modifier, suitable for use
+ within the format argument of a formatted input/output function when converting the
+ corresponding integer type. These macro names have the general form of PRI (character
+ string literals for the fprintf and fwprintf family) or SCN (character string literals
+ for the fscanf and fwscanf family),<sup><a href="#note192"><b>192)</b></a></sup> followed by the conversion specifier,
+ followed by a name corresponding to a similar type name in <a href="#7.18.1">7.18.1</a>. In these names, N
+ represents the width of the type as described in <a href="#7.18.1">7.18.1</a>. For example, PRIdFAST32 can
+ be used in a format string to print the value of an integer of type int_fast32_t.
+<p><!--para 2 -->
+ The fprintf macros for signed integers are:
+<pre>
+        PRIdN             PRIdLEASTN                PRIdFASTN          PRIdMAX             PRIdPTR
+        PRIiN             PRIiLEASTN                PRIiFASTN          PRIiMAX             PRIiPTR
+</pre>
+<!--page 211 -->
+<p><!--para 3 -->
+ The fprintf macros for unsigned integers are:
+<pre>
+        PRIoN           PRIoLEASTN               PRIoFASTN              PRIoMAX             PRIoPTR
+        PRIuN           PRIuLEASTN               PRIuFASTN              PRIuMAX             PRIuPTR
+        PRIxN           PRIxLEASTN               PRIxFASTN              PRIxMAX             PRIxPTR
+        PRIXN           PRIXLEASTN               PRIXFASTN              PRIXMAX             PRIXPTR
+</pre>
+<p><!--para 4 -->
+ The fscanf macros for signed integers are:
+<pre>
+        SCNdN           SCNdLEASTN               SCNdFASTN              SCNdMAX             SCNdPTR
+        SCNiN           SCNiLEASTN               SCNiFASTN              SCNiMAX             SCNiPTR
+</pre>
+<p><!--para 5 -->
+ The fscanf macros for unsigned integers are:
+<pre>
+        SCNoN           SCNoLEASTN               SCNoFASTN              SCNoMAX             SCNoPTR
+        SCNuN           SCNuLEASTN               SCNuFASTN              SCNuMAX             SCNuPTR
+        SCNxN           SCNxLEASTN               SCNxFASTN              SCNxMAX             SCNxPTR
+</pre>
+<p><!--para 6 -->
+ For each type that the implementation provides in <a href="#7.18">&lt;stdint.h&gt;</a>, the corresponding
+ fprintf macros shall be defined and the corresponding fscanf macros shall be
+ defined unless the implementation does not have a suitable fscanf length modifier for
+ the type.
+<p><!--para 7 -->
+ EXAMPLE
+<pre>
+         #include <a href="#7.8">&lt;inttypes.h&gt;</a>
+         #include <a href="#7.24">&lt;wchar.h&gt;</a>
+         int main(void)
+         {
+               uintmax_t i = UINTMAX_MAX;    // this type always exists
+               wprintf(L"The largest integer value is %020"
+                     PRIxMAX "\n", i);
+               return 0;
+         }
+</pre>
+
+<p><b>Footnotes</b>
+<p><small><a name="note191" href="#note191">191)</a> C++ implementations should define these macros only when __STDC_FORMAT_MACROS is defined
+ before <a href="#7.8">&lt;inttypes.h&gt;</a> is included.
+</small>
+<p><small><a name="note192" href="#note192">192)</a> Separate macros are given for use with fprintf and fscanf functions because, in the general case,
+ different format specifiers may be required for fprintf and fscanf, even when the type is the
+ same.
+</small>
+
+<h4><a name="7.8.2" href="#7.8.2">7.8.2 Functions for greatest-width integer types</a></h4>
+
+<h5><a name="7.8.2.1" href="#7.8.2.1">7.8.2.1 The imaxabs function</a></h5>
+<p><b>Synopsis</b>
+<p><!--para 1 -->
+<pre>
+         #include <a href="#7.8">&lt;inttypes.h&gt;</a>
+         intmax_t imaxabs(intmax_t j);
+</pre>
+<p><b>Description</b>
+<p><!--para 2 -->
+ The imaxabs function computes the absolute value of an integer j. If the result cannot
+ be represented, the behavior is undefined.<sup><a href="#note193"><b>193)</b></a></sup>
+<!--page 212 -->
+<p><b>Returns</b>
+<p><!--para 3 -->
+ The imaxabs function returns the absolute value.
+
+<p><b>Footnotes</b>
+<p><small><a name="note193" href="#note193">193)</a> The absolute value of the most negative number cannot be represented in two's complement.
+</small>
+
+<h5><a name="7.8.2.2" href="#7.8.2.2">7.8.2.2 The imaxdiv function</a></h5>
+<p><b>Synopsis</b>
+<p><!--para 1 -->
+<pre>
+            #include <a href="#7.8">&lt;inttypes.h&gt;</a>
+            imaxdiv_t imaxdiv(intmax_t numer, intmax_t denom);
+</pre>
+<p><b>Description</b>
+<p><!--para 2 -->
+ The imaxdiv function computes numer / denom and numer % denom in a single
+ operation.
+<p><b>Returns</b>
+<p><!--para 3 -->
+ The imaxdiv function returns a structure of type imaxdiv_t comprising both the
+ quotient and the remainder. The structure shall contain (in either order) the members
+ quot (the quotient) and rem (the remainder), each of which has type intmax_t. If
+ either part of the result cannot be represented, the behavior is undefined.
+
+<h5><a name="7.8.2.3" href="#7.8.2.3">7.8.2.3 The strtoimax and strtoumax functions</a></h5>
+<p><b>Synopsis</b>
+<p><!--para 1 -->
+<pre>
+        #include <a href="#7.8">&lt;inttypes.h&gt;</a>
+        intmax_t strtoimax(const char * restrict nptr,
+             char ** restrict endptr, int base);
+        uintmax_t strtoumax(const char * restrict nptr,
+             char ** restrict endptr, int base);
+</pre>
+<p><b>Description</b>
+<p><!--para 2 -->
+ The strtoimax and strtoumax functions are equivalent to the strtol, strtoll,
+ strtoul, and strtoull functions, except that the initial portion of the string is
+ converted to intmax_t and uintmax_t representation, respectively.
+<p><b>Returns</b>
+<p><!--para 3 -->
+ The strtoimax and strtoumax functions return the converted value, if any. If no
+ conversion could be performed, zero is returned. If the correct value is outside the range
+ of representable values, INTMAX_MAX, INTMAX_MIN, or UINTMAX_MAX is returned
+ (according to the return type and sign of the value, if any), and the value of the macro
+ ERANGE is stored in errno.
+<p><b> Forward references</b>: the strtol, strtoll, strtoul, and strtoull functions
+ (<a href="#7.20.1.4">7.20.1.4</a>).
+<!--page 213 -->
+
+<h5><a name="7.8.2.4" href="#7.8.2.4">7.8.2.4 The wcstoimax and wcstoumax functions</a></h5>
+<p><b>Synopsis</b>
+<p><!--para 1 -->
+<pre>
+        #include <a href="#7.17">&lt;stddef.h&gt;</a>           // for wchar_t
+        #include <a href="#7.8">&lt;inttypes.h&gt;</a>
+        intmax_t wcstoimax(const wchar_t * restrict nptr,
+             wchar_t ** restrict endptr, int base);
+        uintmax_t wcstoumax(const wchar_t * restrict nptr,
+             wchar_t ** restrict endptr, int base);
+</pre>
+<p><b>Description</b>
+<p><!--para 2 -->
+ The wcstoimax and wcstoumax functions are equivalent to the wcstol, wcstoll,
+ wcstoul, and wcstoull functions except that the initial portion of the wide string is
+ converted to intmax_t and uintmax_t representation, respectively.
+<p><b>Returns</b>
+<p><!--para 3 -->
+ The wcstoimax function returns the converted value, if any. If no conversion could be
+ performed, zero is returned. If the correct value is outside the range of representable
+ values, INTMAX_MAX, INTMAX_MIN, or UINTMAX_MAX is returned (according to the
+ return type and sign of the value, if any), and the value of the macro ERANGE is stored in
+ errno.
+<p><b> Forward references</b>: the wcstol, wcstoll, wcstoul, and wcstoull functions
+ (<a href="#7.24.4.1.2">7.24.4.1.2</a>).
+<!--page 214 -->
+
+<h3><a name="7.9" href="#7.9">7.9 Alternative spellings &lt;iso646.h&gt;</a></h3>
+<p><!--para 1 -->
+ The header <a href="#7.9">&lt;iso646.h&gt;</a> defines the following eleven macros (on the left) that expand
+ to the corresponding tokens (on the right):
+<!--page 215 -->
+<pre>
+       and          &amp;&amp;
+       and_eq       &amp;=
+       bitand       &amp;
+       bitor        |
+       compl        ~
+       not          !
+       not_eq       !=
+       or           ||
+       or_eq        |=
+       xor          ^
+       xor_eq       ^=
+</pre>
+
+<h3><a name="7.10" href="#7.10">7.10 Sizes of integer types &lt;limits.h&gt;</a></h3>
+<p><!--para 1 -->
+ The header <a href="#7.10">&lt;limits.h&gt;</a> defines several macros that expand to various limits and
+ parameters of the standard integer types.
+<p><!--para 2 -->
+ The macros, their meanings, and the constraints (or restrictions) on their values are listed
+ in <a href="#5.2.4.2.1">5.2.4.2.1</a>.
+<!--page 216 -->
+
+<h3><a name="7.11" href="#7.11">7.11 Localization &lt;locale.h&gt;</a></h3>
+<p><!--para 1 -->
+ The header <a href="#7.11">&lt;locale.h&gt;</a> declares two functions, one type, and defines several macros.
+<p><!--para 2 -->
+ The type is
+<pre>
+        struct lconv
+</pre>
+ which contains members related to the formatting of numeric values. The structure shall
+ contain at least the following members, in any order. The semantics of the members and
+ their normal ranges are explained in <a href="#7.11.2.1">7.11.2.1</a>. In the "C" locale, the members shall have
+ the values specified in the comments.
+<!--page 217 -->
+<pre>
+        char   *decimal_point;                 //   "."
+        char   *thousands_sep;                 //   ""
+        char   *grouping;                      //   ""
+        char   *mon_decimal_point;             //   ""
+        char   *mon_thousands_sep;             //   ""
+        char   *mon_grouping;                  //   ""
+        char   *positive_sign;                 //   ""
+        char   *negative_sign;                 //   ""
+        char   *currency_symbol;               //   ""
+        char   frac_digits;                    //   CHAR_MAX
+        char   p_cs_precedes;                  //   CHAR_MAX
+        char   n_cs_precedes;                  //   CHAR_MAX
+        char   p_sep_by_space;                 //   CHAR_MAX
+        char   n_sep_by_space;                 //   CHAR_MAX
+        char   p_sign_posn;                    //   CHAR_MAX
+        char   n_sign_posn;                    //   CHAR_MAX
+        char   *int_curr_symbol;               //   ""
+        char   int_frac_digits;                //   CHAR_MAX
+        char   int_p_cs_precedes;              //   CHAR_MAX
+        char   int_n_cs_precedes;              //   CHAR_MAX
+        char   int_p_sep_by_space;             //   CHAR_MAX
+        char   int_n_sep_by_space;             //   CHAR_MAX
+        char   int_p_sign_posn;                //   CHAR_MAX
+        char   int_n_sign_posn;                //   CHAR_MAX
+</pre>
+<p><!--para 3 -->
+ The macros defined are NULL (described in <a href="#7.17">7.17</a>); and
+<pre>
+          LC_ALL
+          LC_COLLATE
+          LC_CTYPE
+          LC_MONETARY
+          LC_NUMERIC
+          LC_TIME
+</pre>
+ which expand to integer constant expressions with distinct values, suitable for use as the
+ first argument to the setlocale function.<sup><a href="#note194"><b>194)</b></a></sup> Additional macro definitions, beginning
+ with the characters LC_ and an uppercase letter,<sup><a href="#note195"><b>195)</b></a></sup> may also be specified by the
+ implementation.
+
+<p><b>Footnotes</b>
+<p><small><a name="note194" href="#note194">194)</a> ISO/IEC 9945-2 specifies locale and charmap formats that may be used to specify locales for C.
+</small>
+<p><small><a name="note195" href="#note195">195)</a> See ''future library directions'' (<a href="#7.26.5">7.26.5</a>).
+</small>
+
+<h4><a name="7.11.1" href="#7.11.1">7.11.1 Locale control</a></h4>
+
+<h5><a name="7.11.1.1" href="#7.11.1.1">7.11.1.1 The setlocale function</a></h5>
+<p><b>Synopsis</b>
+<p><!--para 1 -->
+<pre>
+          #include <a href="#7.11">&lt;locale.h&gt;</a>
+          char *setlocale(int category, const char *locale);
+</pre>
+<p><b>Description</b>
+<p><!--para 2 -->
+ The setlocale function selects the appropriate portion of the program's locale as
+ specified by the category and locale arguments. The setlocale function may be
+ used to change or query the program's entire current locale or portions thereof. The value
+ LC_ALL for category names the program's entire locale; the other values for
+ category name only a portion of the program's locale. LC_COLLATE affects the
+ behavior of the strcoll and strxfrm functions. LC_CTYPE affects the behavior of
+ the character handling functions<sup><a href="#note196"><b>196)</b></a></sup> and the multibyte and wide character functions.
+ LC_MONETARY affects the monetary formatting information returned by the
+ localeconv function. LC_NUMERIC affects the decimal-point character for the
+ formatted input/output functions and the string conversion functions, as well as the
+ nonmonetary formatting information returned by the localeconv function. LC_TIME
+ affects the behavior of the strftime and wcsftime functions.
+<p><!--para 3 -->
+ A value of "C" for locale specifies the minimal environment for C translation; a value
+ of "" for locale specifies the locale-specific native environment. Other
+ implementation-defined strings may be passed as the second argument to setlocale.
+<!--page 218 -->
+<p><!--para 4 -->
+ At program startup, the equivalent of
+<pre>
+         setlocale(LC_ALL, "C");
+</pre>
+ is executed.
+<p><!--para 5 -->
+ The implementation shall behave as if no library function calls the setlocale function.
+<p><b>Returns</b>
+<p><!--para 6 -->
+ If a pointer to a string is given for locale and the selection can be honored, the
+ setlocale function returns a pointer to the string associated with the specified
+ category for the new locale. If the selection cannot be honored, the setlocale
+ function returns a null pointer and the program's locale is not changed.
+<p><!--para 7 -->
+ A null pointer for locale causes the setlocale function to return a pointer to the
+ string associated with the category for the program's current locale; the program's
+ locale is not changed.<sup><a href="#note197"><b>197)</b></a></sup>
+<p><!--para 8 -->
+ The pointer to string returned by the setlocale function is such that a subsequent call
+ with that string value and its associated category will restore that part of the program's
+ locale. The string pointed to shall not be modified by the program, but may be
+ overwritten by a subsequent call to the setlocale function.
+<p><b> Forward references</b>: formatted input/output functions (<a href="#7.19.6">7.19.6</a>), multibyte/wide
+ character conversion functions (<a href="#7.20.7">7.20.7</a>), multibyte/wide string conversion functions
+ (<a href="#7.20.8">7.20.8</a>), numeric conversion functions (<a href="#7.20.1">7.20.1</a>), the strcoll function (<a href="#7.21.4.3">7.21.4.3</a>), the
+ strftime function (<a href="#7.23.3.5">7.23.3.5</a>), the strxfrm function (<a href="#7.21.4.5">7.21.4.5</a>).
+
+<p><b>Footnotes</b>
+<p><small><a name="note196" href="#note196">196)</a> The only functions in <a href="#7.4">7.4</a> whose behavior is not affected by the current locale are isdigit and
+ isxdigit.
+</small>
+<p><small><a name="note197" href="#note197">197)</a> The implementation shall arrange to encode in a string the various categories due to a heterogeneous
+ locale when category has the value LC_ALL.
+</small>
+
+<h4><a name="7.11.2" href="#7.11.2">7.11.2 Numeric formatting convention inquiry</a></h4>
+
+<h5><a name="7.11.2.1" href="#7.11.2.1">7.11.2.1 The localeconv function</a></h5>
+<p><b>Synopsis</b>
+<p><!--para 1 -->
+<pre>
+         #include <a href="#7.11">&lt;locale.h&gt;</a>
+         struct lconv *localeconv(void);
+</pre>
+<p><b>Description</b>
+<p><!--para 2 -->
+ The localeconv function sets the components of an object with type struct lconv
+ with values appropriate for the formatting of numeric quantities (monetary and otherwise)
+ according to the rules of the current locale.
+<p><!--para 3 -->
+ The members of the structure with type char * are pointers to strings, any of which
+ (except decimal_point) can point to "", to indicate that the value is not available in
+ the current locale or is of zero length. Apart from grouping and mon_grouping, the
+<!--page 219 -->
+ strings shall start and end in the initial shift state. The members with type char are
+ nonnegative numbers, any of which can be CHAR_MAX to indicate that the value is not
+ available in the current locale. The members include the following:
+<dl>
+<dt> char *decimal_point
+<dd>
+           The decimal-point character used to format nonmonetary quantities.
+<dt> char *thousands_sep
+<dd>
+           The character used to separate groups of digits before the decimal-point
+           character in formatted nonmonetary quantities.
+<dt> char *grouping
+<dd>
+           A string whose elements indicate the size of each group of digits in
+           formatted nonmonetary quantities.
+<dt> char *mon_decimal_point
+<dd>
+           The decimal-point used to format monetary quantities.
+<dt> char *mon_thousands_sep
+<dd>
+           The separator for groups of digits before the decimal-point in formatted
+           monetary quantities.
+<dt> char *mon_grouping
+<dd>
+           A string whose elements indicate the size of each group of digits in
+           formatted monetary quantities.
+<dt> char *positive_sign
+<dd>
+           The string used to indicate a nonnegative-valued formatted monetary
+           quantity.
+<dt> char *negative_sign
+<dd>
+           The string used to indicate a negative-valued formatted monetary quantity.
+<dt> char *currency_symbol
+<dd>
+           The local currency symbol applicable to the current locale.
+<dt> char frac_digits
+<dd>
+           The number of fractional digits (those after the decimal-point) to be
+           displayed in a locally formatted monetary quantity.
+<dt> char p_cs_precedes
+<dd>
+           Set to 1 or 0 if the currency_symbol respectively precedes or
+           succeeds the value for a nonnegative locally formatted monetary quantity.
+<dt> char n_cs_precedes
+<!--page 220 -->
+<dd>
+           Set to 1 or 0 if the currency_symbol respectively precedes or
+           succeeds the value for a negative locally formatted monetary quantity.
+<dt> char p_sep_by_space
+<dd>
+           Set to a value indicating the separation of the currency_symbol, the
+           sign string, and the value for a nonnegative locally formatted monetary
+           quantity.
+<dt> char n_sep_by_space
+<dd>
+           Set to a value indicating the separation of the currency_symbol, the
+           sign string, and the value for a negative locally formatted monetary
+           quantity.
+<dt> char p_sign_posn
+<dd>
+           Set to a value indicating the positioning of the positive_sign for a
+           nonnegative locally formatted monetary quantity.
+<dt> char n_sign_posn
+<dd>
+           Set to a value indicating the positioning of the negative_sign for a
+           negative locally formatted monetary quantity.
+<dt> char *int_curr_symbol
+<dd>
+           The international currency symbol applicable to the current locale. The
+           first three characters contain the alphabetic international currency symbol
+           in accordance with those specified in ISO 4217. The fourth character
+           (immediately preceding the null character) is the character used to separate
+           the international currency symbol from the monetary quantity.
+<dt> char int_frac_digits
+<dd>
+           The number of fractional digits (those after the decimal-point) to be
+           displayed in an internationally formatted monetary quantity.
+<dt> char int_p_cs_precedes
+<dd>
+           Set to 1 or 0 if the int_curr_symbol respectively precedes or
+           succeeds the value for a nonnegative internationally formatted monetary
+           quantity.
+<dt> char int_n_cs_precedes
+<dd>
+           Set to 1 or 0 if the int_curr_symbol respectively precedes or
+           succeeds the value for a negative internationally formatted monetary
+           quantity.
+<dt> char int_p_sep_by_space
+<!--page 221 -->
+<dd>
+           Set to a value indicating the separation of the int_curr_symbol, the
+           sign string, and the value for a nonnegative internationally formatted
+           monetary quantity.
+<dt> char int_n_sep_by_space
+<dd>
+           Set to a value indicating the separation of the int_curr_symbol, the
+           sign string, and the value for a negative internationally formatted monetary
+           quantity.
+<dt> char int_p_sign_posn
+<dd>
+           Set to a value indicating the positioning of the positive_sign for a
+           nonnegative internationally formatted monetary quantity.
+<dt> char int_n_sign_posn
+<dd>
+           Set to a value indicating the positioning of the negative_sign for a
+           negative internationally formatted monetary quantity.
+</dl>
+<p><!--para 4 -->
+ The elements of grouping and mon_grouping are interpreted according to the
+ following:
+<dl>
+<dt> CHAR_MAX      <dd>No further grouping is to be performed.
+<dt> 0             <dd>The previous element is to be repeatedly used for the remainder of the
+               digits.
+<dt> other         <dd>The integer value is the number of digits that compose the current group.
+               The next element is examined to determine the size of the next group of
+               digits before the current group.
+</dl>
+<p><!--para 5 -->
+ The values of p_sep_by_space, n_sep_by_space, int_p_sep_by_space,
+ and int_n_sep_by_space are interpreted according to the following:
+<dl>
+<dt> 0   <dd>No space separates the currency symbol and value.
+<dt> 1   <dd>If the currency symbol and sign string are adjacent, a space separates them from the
+     value; otherwise, a space separates the currency symbol from the value.
+<dt> 2   <dd>If the currency symbol and sign string are adjacent, a space separates them;
+     otherwise, a space separates the sign string from the value.
+</dl>
+ For int_p_sep_by_space and int_n_sep_by_space, the fourth character of
+ int_curr_symbol is used instead of a space.
+<p><!--para 6 -->
+ The values of p_sign_posn, n_sign_posn, int_p_sign_posn,                            and
+ int_n_sign_posn are interpreted according to the following:
+<dl>
+<dt> 0   <dd>Parentheses surround the quantity and currency symbol.
+<dt> 1   <dd>The sign string precedes the quantity and currency symbol.
+<dt> 2   <dd>The sign string succeeds the quantity and currency symbol.
+<dt> 3   <dd>The sign string immediately precedes the currency symbol.
+<dt> 4   <dd>The sign string immediately succeeds the currency symbol.
+</dl>
+<!--page 222 -->
+<p><!--para 7 -->
+ The implementation shall behave as if no library function calls the localeconv
+ function.
+<p><b>Returns</b>
+<p><!--para 8 -->
+ The localeconv function returns a pointer to the filled-in object. The structure
+ pointed to by the return value shall not be modified by the program, but may be
+ overwritten by a subsequent call to the localeconv function. In addition, calls to the
+ setlocale function with categories LC_ALL, LC_MONETARY, or LC_NUMERIC may
+ overwrite the contents of the structure.
+<p><!--para 9 -->
+ EXAMPLE 1 The following table illustrates rules which may well be used by four countries to format
+ monetary quantities.
+<pre>
+                          Local format                                     International format
+ Country        Positive                  Negative                    Positive               Negative
+ Country1     1.234,56 mk             -1.234,56 mk                  FIM   1.234,56         FIM -1.234,56
+ Country2     L.1.234                 -L.1.234                      ITL   1.234            -ITL 1.234
+ Country3     fl. 1.234,56            fl. -1.234,56                 NLG   1.234,56         NLG -1.234,56
+ Country4     SFrs.1,234.56           SFrs.1,234.56C                CHF   1,234.56         CHF 1,234.56C
+</pre>
+<p><!--para 10 -->
+ For these four countries, the respective values for the monetary members of the structure returned by
+ localeconv could be:
+<pre>
+                                   Country1              Country2              Country3            Country4
+ mon_decimal_point                 ","                   ""                   ","                 "."
+ mon_thousands_sep                 "."                   "."                  "."                 ","
+ mon_grouping                      "\3"                  "\3"                 "\3"                "\3"
+ positive_sign                     ""                    ""                   ""                  ""
+ negative_sign                     "-"                   "-"                  "-"                 "C"
+ currency_symbol                   "mk"                  "L."                 "\u0192"            "SFrs."
+ frac_digits                       2                     0                    2                   2
+ p_cs_precedes                     0                     1                    1                   1
+ n_cs_precedes                     0                     1                    1                   1
+ p_sep_by_space                    1                     0                    1                   0
+ n_sep_by_space                    1                     0                    2                   0
+ p_sign_posn                       1                     1                    1                   1
+ n_sign_posn                       1                     1                    4                   2
+ int_curr_symbol                   "FIM "                "ITL "               "NLG "              "CHF "
+ int_frac_digits                   2                     0                    2                   2
+ int_p_cs_precedes                 1                     1                    1                   1
+ int_n_cs_precedes                 1                     1                    1                   1
+ int_p_sep_by_space                1                     1                    1                   1
+ int_n_sep_by_space                2                     1                    2                   1
+ int_p_sign_posn                   1                     1                    1                   1
+ int_n_sign_posn                   4                     1                    4                   2
+</pre>
+<!--page 223 -->
+<p><!--para 11 -->
+ EXAMPLE 2 The following table illustrates how the cs_precedes, sep_by_space, and sign_posn members
+ affect the formatted value.
+<pre>
+                                                           p_sep_by_space
+ p_cs_precedes           p_sign_posn          0                   1                  2
+
+            0                    0         (<a href="#1.25">1.25</a>$)            (<a href="#1.25">1.25</a> $)            (<a href="#1.25">1.25</a>$)
+                                 1         +1.25$             +1.25 $             + <a href="#1.25">1.25</a>$
+                                 2         <a href="#1.25">1.25</a>$+             <a href="#1.25">1.25</a> $+             <a href="#1.25">1.25</a>$ +
+                                 3         <a href="#1.25">1.25</a>+$             <a href="#1.25">1.25</a> +$             <a href="#1.25">1.25</a>+ $
+                                 4         <a href="#1.25">1.25</a>$+             <a href="#1.25">1.25</a> $+             <a href="#1.25">1.25</a>$ +
+
+            1                    0         ($1.25)            ($ <a href="#1.25">1.25</a>)            ($1.25)
+                                 1         +$1.25             +$ <a href="#1.25">1.25</a>             + $1.25
+                                 2         $1.25+             $ <a href="#1.25">1.25</a>+             $1.25 +
+                                 3         +$1.25             +$ <a href="#1.25">1.25</a>             + $1.25
+                                 4         $+1.25             $+ <a href="#1.25">1.25</a>             $ +1.25
+</pre>
+
+<!--page 224 -->
+<h3><a name="7.12" href="#7.12">7.12 Mathematics &lt;math.h&gt;</a></h3>
+<p><!--para 1 -->
+ The header <a href="#7.12">&lt;math.h&gt;</a> declares two types and many mathematical functions and defines
+ several macros. Most synopses specify a family of functions consisting of a principal
+ function with one or more double parameters, a double return value, or both; and
+ other functions with the same name but with f and l suffixes, which are corresponding
+ functions with float and long double parameters, return values, or both.<sup><a href="#note198"><b>198)</b></a></sup>
+ Integer arithmetic functions and conversion functions are discussed later.
+<p><!--para 2 -->
+ The types
+<pre>
+         float_t
+         double_t
+</pre>
+ are floating types at least as wide as float and double, respectively, and such that
+ double_t is at least as wide as float_t. If FLT_EVAL_METHOD equals 0,
+ float_t and double_t are float and double, respectively; if
+ FLT_EVAL_METHOD equals 1, they are both double; if FLT_EVAL_METHOD equals
+ 2, they are both long double; and for other values of FLT_EVAL_METHOD, they are
+ otherwise implementation-defined.<sup><a href="#note199"><b>199)</b></a></sup>
+<p><!--para 3 -->
+ The macro
+<pre>
+         HUGE_VAL
+</pre>
+ expands to a positive double constant expression, not necessarily representable as a
+ float. The macros
+<pre>
+         HUGE_VALF
+         HUGE_VALL
+</pre>
+ are respectively float and long double analogs of HUGE_VAL.<sup><a href="#note200"><b>200)</b></a></sup>
+<p><!--para 4 -->
+ The macro
+<pre>
+         INFINITY
+</pre>
+ expands to a constant expression of type float representing positive or unsigned
+ infinity, if available; else to a positive constant of type float that overflows at
+<!--page 225 -->
+ translation time.<sup><a href="#note201"><b>201)</b></a></sup>
+<p><!--para 5 -->
+ The macro
+<pre>
+          NAN
+</pre>
+ is defined if and only if the implementation supports quiet NaNs for the float type. It
+ expands to a constant expression of type float representing a quiet NaN.
+<p><!--para 6 -->
+ The number classification macros
+<pre>
+          FP_INFINITE
+          FP_NAN
+          FP_NORMAL
+          FP_SUBNORMAL
+          FP_ZERO
+</pre>
+ represent the mutually exclusive kinds of floating-point values. They expand to integer
+ constant expressions with distinct values. Additional implementation-defined floating-
+ point classifications, with macro definitions beginning with FP_ and an uppercase letter,
+ may also be specified by the implementation.
+<p><!--para 7 -->
+ The macro
+<pre>
+          FP_FAST_FMA
+</pre>
+ is optionally defined. If defined, it indicates that the fma function generally executes
+ about as fast as, or faster than, a multiply and an add of double operands.<sup><a href="#note202"><b>202)</b></a></sup> The
+ macros
+<pre>
+          FP_FAST_FMAF
+          FP_FAST_FMAL
+</pre>
+ are, respectively, float and long double analogs of FP_FAST_FMA. If defined,
+ these macros expand to the integer constant 1.
+<p><!--para 8 -->
+ The macros
+<pre>
+          FP_ILOGB0
+          FP_ILOGBNAN
+</pre>
+ expand to integer constant expressions whose values are returned by ilogb(x) if x is
+ zero or NaN, respectively. The value of FP_ILOGB0 shall be either INT_MIN or
+ -INT_MAX. The value of FP_ILOGBNAN shall be either INT_MAX or INT_MIN.
+<!--page 226 -->
+<p><!--para 9 -->
+ The macros
+<pre>
+         MATH_ERRNO
+         MATH_ERREXCEPT
+</pre>
+ expand to the integer constants 1 and 2, respectively; the macro
+<pre>
+         math_errhandling
+</pre>
+ expands to an expression that has type int and the value MATH_ERRNO,
+ MATH_ERREXCEPT, or the bitwise OR of both. The value of math_errhandling is
+ constant for the duration of the program. It is unspecified whether
+ math_errhandling is a macro or an identifier with external linkage. If a macro
+ definition is suppressed or a program defines an identifier with the name
+ math_errhandling, the behavior is undefined.               If the expression
+ math_errhandling &amp; MATH_ERREXCEPT can be nonzero, the implementation
+ shall define the macros FE_DIVBYZERO, FE_INVALID, and FE_OVERFLOW in
+ <a href="#7.6">&lt;fenv.h&gt;</a>.
+
+<p><b>Footnotes</b>
+<p><small><a name="note198" href="#note198">198)</a> Particularly on systems with wide expression evaluation, a <a href="#7.12">&lt;math.h&gt;</a> function might pass arguments
+ and return values in wider format than the synopsis prototype indicates.
+</small>
+<p><small><a name="note199" href="#note199">199)</a> The types float_t and double_t are intended to be the implementation's most efficient types at
+ least as wide as float and double, respectively. For FLT_EVAL_METHOD equal 0, 1, or 2, the
+ type float_t is the narrowest type used by the implementation to evaluate floating expressions.
+</small>
+<p><small><a name="note200" href="#note200">200)</a> HUGE_VAL, HUGE_VALF, and HUGE_VALL can be positive infinities in an implementation that
+ supports infinities.
+</small>
+<p><small><a name="note201" href="#note201">201)</a> In this case, using INFINITY will violate the constraint in <a href="#6.4.4">6.4.4</a> and thus require a diagnostic.
+</small>
+<p><small><a name="note202" href="#note202">202)</a> Typically, the FP_FAST_FMA macro is defined if and only if the fma function is implemented
+ directly with a hardware multiply-add instruction. Software implementations are expected to be
+ substantially slower.
+</small>
+
+<h4><a name="7.12.1" href="#7.12.1">7.12.1 Treatment of error conditions</a></h4>
+<p><!--para 1 -->
+ The behavior of each of the functions in <a href="#7.12">&lt;math.h&gt;</a> is specified for all representable
+ values of its input arguments, except where stated otherwise. Each function shall execute
+ as if it were a single operation without generating any externally visible exceptional
+ conditions.
+<p><!--para 2 -->
+ For all functions, a domain error occurs if an input argument is outside the domain over
+ which the mathematical function is defined. The description of each function lists any
+ required domain errors; an implementation may define additional domain errors, provided
+ that such errors are consistent with the mathematical definition of the function.<sup><a href="#note203"><b>203)</b></a></sup> On a
+ domain error, the function returns an implementation-defined value; if the integer
+ expression math_errhandling &amp; MATH_ERRNO is nonzero, the integer expression
+ errno acquires the value EDOM; if the integer expression math_errhandling &amp;
+ MATH_ERREXCEPT is nonzero, the ''invalid'' floating-point exception is raised.
+<p><!--para 3 -->
+ Similarly, a range error occurs if the mathematical result of the function cannot be
+ represented in an object of the specified type, due to extreme magnitude.
+<p><!--para 4 -->
+ A floating result overflows if the magnitude of the mathematical result is finite but so
+ large that the mathematical result cannot be represented without extraordinary roundoff
+ error in an object of the specified type. If a floating result overflows and default rounding
+ is in effect, or if the mathematical result is an exact infinity from finite arguments (for
+ example log(0.0)), then the function returns the value of the macro HUGE_VAL,
+<!--page 227 -->
+ HUGE_VALF, or HUGE_VALL according to the return type, with the same sign as the
+ correct value of the function; if the integer expression math_errhandling &amp;
+ MATH_ERRNO is nonzero, the integer expression errno acquires the value ERANGE; if
+ the integer expression math_errhandling &amp; MATH_ERREXCEPT is nonzero, the
+ ''divide-by-zero'' floating-point exception is raised if the mathematical result is an exact
+ infinity and the ''overflow'' floating-point exception is raised otherwise.
+<p><!--para 5 -->
+ The result underflows if the magnitude of the mathematical result is so small that the
+ mathematical result cannot be represented, without extraordinary roundoff error, in an
+ object of the specified type.<sup><a href="#note204"><b>204)</b></a></sup> If the result underflows, the function returns an
+ implementation-defined value whose magnitude is no greater than the smallest
+ normalized positive number in the specified type; if the integer expression
+ math_errhandling &amp; MATH_ERRNO is nonzero, whether errno acquires the
+ value    ERANGE       is    implementation-defined;     if   the  integer   expression
+ math_errhandling &amp; MATH_ERREXCEPT is nonzero, whether the ''underflow''
+ floating-point exception is raised is implementation-defined.
+
+<p><b>Footnotes</b>
+<p><small><a name="note203" href="#note203">203)</a> In an implementation that supports infinities, this allows an infinity as an argument to be a domain
+ error if the mathematical domain of the function does not include the infinity.
+</small>
+<p><small><a name="note204" href="#note204">204)</a> The term underflow here is intended to encompass both ''gradual underflow'' as in IEC 60559 and
+ also ''flush-to-zero'' underflow.
+</small>
+
+<h4><a name="7.12.2" href="#7.12.2">7.12.2 The FP_CONTRACT pragma</a></h4>
+<p><b>Synopsis</b>
+<p><!--para 1 -->
+<pre>
+         #include <a href="#7.12">&lt;math.h&gt;</a>
+         #pragma STDC FP_CONTRACT on-off-switch
+</pre>
+<p><b>Description</b>
+<p><!--para 2 -->
+ The FP_CONTRACT pragma can be used to allow (if the state is ''on'') or disallow (if the
+ state is ''off'') the implementation to contract expressions (<a href="#6.5">6.5</a>). Each pragma can occur
+ either outside external declarations or preceding all explicit declarations and statements
+ inside a compound statement. When outside external declarations, the pragma takes
+ effect from its occurrence until another FP_CONTRACT pragma is encountered, or until
+ the end of the translation unit. When inside a compound statement, the pragma takes
+ effect from its occurrence until another FP_CONTRACT pragma is encountered
+ (including within a nested compound statement), or until the end of the compound
+ statement; at the end of a compound statement the state for the pragma is restored to its
+ condition just before the compound statement. If this pragma is used in any other
+ context, the behavior is undefined. The default state (''on'' or ''off'') for the pragma is
+ implementation-defined.
+<!--page 228 -->
+
+<h4><a name="7.12.3" href="#7.12.3">7.12.3 Classification macros</a></h4>
+<p><!--para 1 -->
+ In the synopses in this subclause, real-floating indicates that the argument shall be an
+ expression of real floating type.
+
+<h5><a name="7.12.3.1" href="#7.12.3.1">7.12.3.1 The fpclassify macro</a></h5>
+<p><b>Synopsis</b>
+<p><!--para 1 -->
+<pre>
+          #include <a href="#7.12">&lt;math.h&gt;</a>
+          int fpclassify(real-floating x);
+</pre>
+<p><b>Description</b>
+<p><!--para 2 -->
+ The fpclassify macro classifies its argument value as NaN, infinite, normal,
+ subnormal, zero, or into another implementation-defined category. First, an argument
+ represented in a format wider than its semantic type is converted to its semantic type.
+ Then classification is based on the type of the argument.<sup><a href="#note205"><b>205)</b></a></sup>
+<p><b>Returns</b>
+<p><!--para 3 -->
+ The fpclassify macro returns the value of the number classification macro
+ appropriate to the value of its argument.
+<p><!--para 4 -->
+ EXAMPLE        The fpclassify macro might be implemented in terms of ordinary functions as
+<pre>
+          #define fpclassify(x) \
+                ((sizeof (x) == sizeof (float)) ? __fpclassifyf(x) : \
+                 (sizeof (x) == sizeof (double)) ? __fpclassifyd(x) : \
+                                                   __fpclassifyl(x))
+</pre>
+
+<p><b>Footnotes</b>
+<p><small><a name="note205" href="#note205">205)</a> Since an expression can be evaluated with more range and precision than its type has, it is important to
+ know the type that classification is based on. For example, a normal long double value might
+ become subnormal when converted to double, and zero when converted to float.
+</small>
+
+<h5><a name="7.12.3.2" href="#7.12.3.2">7.12.3.2 The isfinite macro</a></h5>
+<p><b>Synopsis</b>
+<p><!--para 1 -->
+<pre>
+          #include <a href="#7.12">&lt;math.h&gt;</a>
+          int isfinite(real-floating x);
+</pre>
+<p><b>Description</b>
+<p><!--para 2 -->
+ The isfinite macro determines whether its argument has a finite value (zero,
+ subnormal, or normal, and not infinite or NaN). First, an argument represented in a
+ format wider than its semantic type is converted to its semantic type. Then determination
+ is based on the type of the argument.
+<!--page 229 -->
+<p><b>Returns</b>
+<p><!--para 3 -->
+ The isfinite macro returns a nonzero value if and only if its argument has a finite
+ value.
+
+<h5><a name="7.12.3.3" href="#7.12.3.3">7.12.3.3 The isinf macro</a></h5>
+<p><b>Synopsis</b>
+<p><!--para 1 -->
+<pre>
+         #include <a href="#7.12">&lt;math.h&gt;</a>
+         int isinf(real-floating x);
+</pre>
+<p><b>Description</b>
+<p><!--para 2 -->
+ The isinf macro determines whether its argument value is an infinity (positive or
+ negative). First, an argument represented in a format wider than its semantic type is
+ converted to its semantic type. Then determination is based on the type of the argument.
+<p><b>Returns</b>
+<p><!--para 3 -->
+ The isinf macro returns a nonzero value if and only if its argument has an infinite
+ value.
+
+<h5><a name="7.12.3.4" href="#7.12.3.4">7.12.3.4 The isnan macro</a></h5>
+<p><b>Synopsis</b>
+<p><!--para 1 -->
+<pre>
+         #include <a href="#7.12">&lt;math.h&gt;</a>
+         int isnan(real-floating x);
+</pre>
+<p><b>Description</b>
+<p><!--para 2 -->
+ The isnan macro determines whether its argument value is a NaN. First, an argument
+ represented in a format wider than its semantic type is converted to its semantic type.
+ Then determination is based on the type of the argument.<sup><a href="#note206"><b>206)</b></a></sup>
+<p><b>Returns</b>
+<p><!--para 3 -->
+ The isnan macro returns a nonzero value if and only if its argument has a NaN value.
+
+<p><b>Footnotes</b>
+<p><small><a name="note206" href="#note206">206)</a> For the isnan macro, the type for determination does not matter unless the implementation supports
+ NaNs in the evaluation type but not in the semantic type.
+</small>
+
+<h5><a name="7.12.3.5" href="#7.12.3.5">7.12.3.5 The isnormal macro</a></h5>
+<p><b>Synopsis</b>
+<p><!--para 1 -->
+<pre>
+         #include <a href="#7.12">&lt;math.h&gt;</a>
+         int isnormal(real-floating x);
+</pre>
+<!--page 230 -->
+<p><b>Description</b>
+<p><!--para 2 -->
+ The isnormal macro determines whether its argument value is normal (neither zero,
+ subnormal, infinite, nor NaN). First, an argument represented in a format wider than its
+ semantic type is converted to its semantic type. Then determination is based on the type
+ of the argument.
+<p><b>Returns</b>
+<p><!--para 3 -->
+ The isnormal macro returns a nonzero value if and only if its argument has a normal
+ value.
+
+<h5><a name="7.12.3.6" href="#7.12.3.6">7.12.3.6 The signbit macro</a></h5>
+<p><b>Synopsis</b>
+<p><!--para 1 -->
+<pre>
+         #include <a href="#7.12">&lt;math.h&gt;</a>
+         int signbit(real-floating x);
+</pre>
+<p><b>Description</b>
+<p><!--para 2 -->
+ The signbit macro determines whether the sign of its argument value is negative.<sup><a href="#note207"><b>207)</b></a></sup>
+<p><b>Returns</b>
+<p><!--para 3 -->
+ The signbit macro returns a nonzero value if and only if the sign of its argument value
+ is negative.
+
+<p><b>Footnotes</b>
+<p><small><a name="note207" href="#note207">207)</a> The signbit macro reports the sign of all values, including infinities, zeros, and NaNs. If zero is
+ unsigned, it is treated as positive.
+</small>
+
+<h4><a name="7.12.4" href="#7.12.4">7.12.4 Trigonometric functions</a></h4>
+
+<h5><a name="7.12.4.1" href="#7.12.4.1">7.12.4.1 The acos functions</a></h5>
+<p><b>Synopsis</b>
+<p><!--para 1 -->
+<pre>
+         #include <a href="#7.12">&lt;math.h&gt;</a>
+         double acos(double x);
+         float acosf(float x);
+         long double acosl(long double x);
+</pre>
+<p><b>Description</b>
+<p><!--para 2 -->
+ The acos functions compute the principal value of the arc cosine of x. A domain error
+ occurs for arguments not in the interval [-1, +1].
+<p><b>Returns</b>
+<p><!--para 3 -->
+ The acos functions return arccos x in the interval [0, pi ] radians.
+<!--page 231 -->
+
+<h5><a name="7.12.4.2" href="#7.12.4.2">7.12.4.2 The asin functions</a></h5>
+<p><b>Synopsis</b>
+<p><!--para 1 -->
+<pre>
+        #include <a href="#7.12">&lt;math.h&gt;</a>
+        double asin(double x);
+        float asinf(float x);
+        long double asinl(long double x);
+</pre>
+<p><b>Description</b>
+<p><!--para 2 -->
+ The asin functions compute the principal value of the arc sine of x. A domain error
+ occurs for arguments not in the interval [-1, +1].
+<p><b>Returns</b>
+<p><!--para 3 -->
+ The asin functions return arcsin x in the interval [-pi /2, +pi /2] radians.
+
+<h5><a name="7.12.4.3" href="#7.12.4.3">7.12.4.3 The atan functions</a></h5>
+<p><b>Synopsis</b>
+<p><!--para 1 -->
+<pre>
+        #include <a href="#7.12">&lt;math.h&gt;</a>
+        double atan(double x);
+        float atanf(float x);
+        long double atanl(long double x);
+</pre>
+<p><b>Description</b>
+<p><!--para 2 -->
+ The atan functions compute the principal value of the arc tangent of x.
+<p><b>Returns</b>
+<p><!--para 3 -->
+ The atan functions return arctan x in the interval [-pi /2, +pi /2] radians.
+
+<h5><a name="7.12.4.4" href="#7.12.4.4">7.12.4.4 The atan2 functions</a></h5>
+<p><b>Synopsis</b>
+<p><!--para 1 -->
+<pre>
+        #include <a href="#7.12">&lt;math.h&gt;</a>
+        double atan2(double y, double x);
+        float atan2f(float y, float x);
+        long double atan2l(long double y, long double x);
+</pre>
+<p><b>Description</b>
+<p><!--para 2 -->
+ The atan2 functions compute the value of the arc tangent of y/x, using the signs of both
+ arguments to determine the quadrant of the return value. A domain error may occur if
+ both arguments are zero.
+<p><b>Returns</b>
+<p><!--para 3 -->
+ The atan2 functions return arctan y/x in the interval [-pi , +pi ] radians.
+<!--page 232 -->
+
+<h5><a name="7.12.4.5" href="#7.12.4.5">7.12.4.5 The cos functions</a></h5>
+<p><b>Synopsis</b>
+<p><!--para 1 -->
+<pre>
+        #include <a href="#7.12">&lt;math.h&gt;</a>
+        double cos(double x);
+        float cosf(float x);
+        long double cosl(long double x);
+</pre>
+<p><b>Description</b>
+<p><!--para 2 -->
+ The cos functions compute the cosine of x (measured in radians).
+<p><b>Returns</b>
+<p><!--para 3 -->
+ The cos functions return cos x.
+
+<h5><a name="7.12.4.6" href="#7.12.4.6">7.12.4.6 The sin functions</a></h5>
+<p><b>Synopsis</b>
+<p><!--para 1 -->
+<pre>
+        #include <a href="#7.12">&lt;math.h&gt;</a>
+        double sin(double x);
+        float sinf(float x);
+        long double sinl(long double x);
+</pre>
+<p><b>Description</b>
+<p><!--para 2 -->
+ The sin functions compute the sine of x (measured in radians).
+<p><b>Returns</b>
+<p><!--para 3 -->
+ The sin functions return sin x.
+
+<h5><a name="7.12.4.7" href="#7.12.4.7">7.12.4.7 The tan functions</a></h5>
+<p><b>Synopsis</b>
+<p><!--para 1 -->
+<pre>
+        #include <a href="#7.12">&lt;math.h&gt;</a>
+        double tan(double x);
+        float tanf(float x);
+        long double tanl(long double x);
+</pre>
+<p><b>Description</b>
+<p><!--para 2 -->
+ The tan functions return the tangent of x (measured in radians).
+<p><b>Returns</b>
+<p><!--para 3 -->
+ The tan functions return tan x.
+<!--page 233 -->
+
+<h4><a name="7.12.5" href="#7.12.5">7.12.5 Hyperbolic functions</a></h4>
+
+<h5><a name="7.12.5.1" href="#7.12.5.1">7.12.5.1 The acosh functions</a></h5>
+<p><b>Synopsis</b>
+<p><!--para 1 -->
+<pre>
+        #include <a href="#7.12">&lt;math.h&gt;</a>
+        double acosh(double x);
+        float acoshf(float x);
+        long double acoshl(long double x);
+</pre>
+<p><b>Description</b>
+<p><!--para 2 -->
+ The acosh functions compute the (nonnegative) arc hyperbolic cosine of x. A domain
+ error occurs for arguments less than 1.
+<p><b>Returns</b>
+<p><!--para 3 -->
+ The acosh functions return arcosh x in the interval [0, +(inf)].
+
+<h5><a name="7.12.5.2" href="#7.12.5.2">7.12.5.2 The asinh functions</a></h5>
+<p><b>Synopsis</b>
+<p><!--para 1 -->
+<pre>
+        #include <a href="#7.12">&lt;math.h&gt;</a>
+        double asinh(double x);
+        float asinhf(float x);
+        long double asinhl(long double x);
+</pre>
+<p><b>Description</b>
+<p><!--para 2 -->
+ The asinh functions compute the arc hyperbolic sine of x.
+<p><b>Returns</b>
+<p><!--para 3 -->
+ The asinh functions return arsinh x.
+
+<h5><a name="7.12.5.3" href="#7.12.5.3">7.12.5.3 The atanh functions</a></h5>
+<p><b>Synopsis</b>
+<p><!--para 1 -->
+<pre>
+        #include <a href="#7.12">&lt;math.h&gt;</a>
+        double atanh(double x);
+        float atanhf(float x);
+        long double atanhl(long double x);
+</pre>
+<p><b>Description</b>
+<p><!--para 2 -->
+ The atanh functions compute the arc hyperbolic tangent of x. A domain error occurs
+ for arguments not in the interval [-1, +1]. A range error may occur if the argument
+ equals -1 or +1.
+<!--page 234 -->
+<p><b>Returns</b>
+<p><!--para 3 -->
+ The atanh functions return artanh x.
+
+<h5><a name="7.12.5.4" href="#7.12.5.4">7.12.5.4 The cosh functions</a></h5>
+<p><b>Synopsis</b>
+<p><!--para 1 -->
+<pre>
+        #include <a href="#7.12">&lt;math.h&gt;</a>
+        double cosh(double x);
+        float coshf(float x);
+        long double coshl(long double x);
+</pre>
+<p><b>Description</b>
+<p><!--para 2 -->
+ The cosh functions compute the hyperbolic cosine of x. A range error occurs if the
+ magnitude of x is too large.
+<p><b>Returns</b>
+<p><!--para 3 -->
+ The cosh functions return cosh x.
+
+<h5><a name="7.12.5.5" href="#7.12.5.5">7.12.5.5 The sinh functions</a></h5>
+<p><b>Synopsis</b>
+<p><!--para 1 -->
+<pre>
+        #include <a href="#7.12">&lt;math.h&gt;</a>
+        double sinh(double x);
+        float sinhf(float x);
+        long double sinhl(long double x);
+</pre>
+<p><b>Description</b>
+<p><!--para 2 -->
+ The sinh functions compute the hyperbolic sine of x. A range error occurs if the
+ magnitude of x is too large.
+<p><b>Returns</b>
+<p><!--para 3 -->
+ The sinh functions return sinh x.
+
+<h5><a name="7.12.5.6" href="#7.12.5.6">7.12.5.6 The tanh functions</a></h5>
+<p><b>Synopsis</b>
+<p><!--para 1 -->
+<pre>
+        #include <a href="#7.12">&lt;math.h&gt;</a>
+        double tanh(double x);
+        float tanhf(float x);
+        long double tanhl(long double x);
+</pre>
+<p><b>Description</b>
+<p><!--para 2 -->
+ The tanh functions compute the hyperbolic tangent of x.
+<!--page 235 -->
+<p><b>Returns</b>
+<p><!--para 3 -->
+ The tanh functions return tanh x.
+
+<h4><a name="7.12.6" href="#7.12.6">7.12.6 Exponential and logarithmic functions</a></h4>
+
+<h5><a name="7.12.6.1" href="#7.12.6.1">7.12.6.1 The exp functions</a></h5>
+<p><b>Synopsis</b>
+<p><!--para 1 -->
+<pre>
+        #include <a href="#7.12">&lt;math.h&gt;</a>
+        double exp(double x);
+        float expf(float x);
+        long double expl(long double x);
+</pre>
+<p><b>Description</b>
+<p><!--para 2 -->
+ The exp functions compute the base-e exponential of x. A range error occurs if the
+ magnitude of x is too large.
+<p><b>Returns</b>
+<p><!--para 3 -->
+ The exp functions return e<sup>x</sup>.
+
+<h5><a name="7.12.6.2" href="#7.12.6.2">7.12.6.2 The exp2 functions</a></h5>
+<p><b>Synopsis</b>
+<p><!--para 1 -->
+<pre>
+        #include <a href="#7.12">&lt;math.h&gt;</a>
+        double exp2(double x);
+        float exp2f(float x);
+        long double exp2l(long double x);
+</pre>
+<p><b>Description</b>
+<p><!--para 2 -->
+ The exp2 functions compute the base-2 exponential of x. A range error occurs if the
+ magnitude of x is too large.
+<p><b>Returns</b>
+<p><!--para 3 -->
+ The exp2 functions return 2<sup>x</sup>.
+
+<h5><a name="7.12.6.3" href="#7.12.6.3">7.12.6.3 The expm1 functions</a></h5>
+<p><b>Synopsis</b>
+<p><!--para 1 -->
+<!--page 236 -->
+<pre>
+        #include <a href="#7.12">&lt;math.h&gt;</a>
+        double expm1(double x);
+        float expm1f(float x);
+        long double expm1l(long double x);
+</pre>
+<p><b>Description</b>
+<p><!--para 2 -->
+ The expm1 functions compute the base-e exponential of the argument, minus 1. A range
+ error occurs if x is too large.<sup><a href="#note208"><b>208)</b></a></sup>
+<p><b>Returns</b>
+<p><!--para 3 -->
+ The expm1 functions return e<sup>x</sup> - 1.
+
+<p><b>Footnotes</b>
+<p><small><a name="note208" href="#note208">208)</a> For small magnitude x, expm1(x) is expected to be more accurate than exp(x) - 1.
+</small>
+
+<h5><a name="7.12.6.4" href="#7.12.6.4">7.12.6.4 The frexp functions</a></h5>
+<p><b>Synopsis</b>
+<p><!--para 1 -->
+<pre>
+         #include <a href="#7.12">&lt;math.h&gt;</a>
+         double frexp(double value, int *exp);
+         float frexpf(float value, int *exp);
+         long double frexpl(long double value, int *exp);
+</pre>
+<p><b>Description</b>
+<p><!--para 2 -->
+ The frexp functions break a floating-point number into a normalized fraction and an
+ integral power of 2. They store the integer in the int object pointed to by exp.
+<p><b>Returns</b>
+<p><!--para 3 -->
+ If value is not a floating-point number, the results are unspecified. Otherwise, the
+ frexp functions return the value x, such that x has a magnitude in the interval [1/2, 1) or
+ zero, and value equals x 2<sup>*exp</sup> . If value is zero, both parts of the result are zero.
+
+<h5><a name="7.12.6.5" href="#7.12.6.5">7.12.6.5 The ilogb functions</a></h5>
+<p><b>Synopsis</b>
+<p><!--para 1 -->
+<pre>
+         #include <a href="#7.12">&lt;math.h&gt;</a>
+         int ilogb(double x);
+         int ilogbf(float x);
+         int ilogbl(long double x);
+</pre>
+<p><b>Description</b>
+<p><!--para 2 -->
+ The ilogb functions extract the exponent of x as a signed int value. If x is zero they
+ compute the value FP_ILOGB0; if x is infinite they compute the value INT_MAX; if x is
+ a NaN they compute the value FP_ILOGBNAN; otherwise, they are equivalent to calling
+ the corresponding logb function and casting the returned value to type int. A domain
+ error or range error may occur if x is zero, infinite, or NaN. If the correct value is outside
+ the range of the return type, the numeric result is unspecified.
+<!--page 237 -->
+<p><b>Returns</b>
+<p><!--para 3 -->
+ The ilogb functions return the exponent of x as a signed int value.
+<p><b> Forward references</b>: the logb functions (<a href="#7.12.6.11">7.12.6.11</a>).
+
+<h5><a name="7.12.6.6" href="#7.12.6.6">7.12.6.6 The ldexp functions</a></h5>
+<p><b>Synopsis</b>
+<p><!--para 1 -->
+<pre>
+        #include <a href="#7.12">&lt;math.h&gt;</a>
         double ldexp(double x, int exp);
         float ldexpf(float x, int exp);
         long double ldexpl(long double x, int exp);
+</pre>
+<p><b>Description</b>
+<p><!--para 2 -->
+ The ldexp functions multiply a floating-point number by an integral power of 2. A
+ range error may occur.
+<p><b>Returns</b>
+<p><!--para 3 -->
+ The ldexp functions return x 2<sup>exp</sup> .
+
+<h5><a name="7.12.6.7" href="#7.12.6.7">7.12.6.7 The log functions</a></h5>
+<p><b>Synopsis</b>
+<p><!--para 1 -->
+<pre>
+        #include <a href="#7.12">&lt;math.h&gt;</a>
         double log(double x);
         float logf(float x);
         long double logl(long double x);
+</pre>
+<p><b>Description</b>
+<p><!--para 2 -->
+ The log functions compute the base-e (natural) logarithm of x. A domain error occurs if
+ the argument is negative. A range error may occur if the argument is zero.
+<p><b>Returns</b>
+<p><!--para 3 -->
+ The log functions return loge x.
+
+<h5><a name="7.12.6.8" href="#7.12.6.8">7.12.6.8 The log10 functions</a></h5>
+<p><b>Synopsis</b>
+<p><!--para 1 -->
+<!--page 238 -->
+<pre>
+        #include <a href="#7.12">&lt;math.h&gt;</a>
         double log10(double x);
         float log10f(float x);
         long double log10l(long double x);
-        double log1p(double x);
-        float log1pf(float x);
-        long double log1pl(long double x);
-        double log2(double x);
-        float log2f(float x);
-        long double log2l(long double x);
+</pre>
+<p><b>Description</b>
+<p><!--para 2 -->
+ The log10 functions compute the base-10 (common) logarithm of x. A domain error
+ occurs if the argument is negative. A range error may occur if the argument is zero.
+<p><b>Returns</b>
+<p><!--para 3 -->
+ The log10 functions return log10 x.
+
+<h5><a name="7.12.6.9" href="#7.12.6.9">7.12.6.9 The log1p functions</a></h5>
+<p><b>Synopsis</b>
+<p><!--para 1 -->
+<pre>
+         #include <a href="#7.12">&lt;math.h&gt;</a>
+         double log1p(double x);
+         float log1pf(float x);
+         long double log1pl(long double x);
+</pre>
+<p><b>Description</b>
+<p><!--para 2 -->
+ The log1p functions compute the base-e (natural) logarithm of 1 plus the argument.<sup><a href="#note209"><b>209)</b></a></sup>
+ A domain error occurs if the argument is less than -1. A range error may occur if the
+ argument equals -1.
+<p><b>Returns</b>
+<p><!--para 3 -->
+ The log1p functions return loge (1 + x).
+
+<p><b>Footnotes</b>
+<p><small><a name="note209" href="#note209">209)</a> For small magnitude x, log1p(x) is expected to be more accurate than log(1 + x).
+</small>
+
+<h5><a name="7.12.6.10" href="#7.12.6.10">7.12.6.10 The log2 functions</a></h5>
+<p><b>Synopsis</b>
+<p><!--para 1 -->
+<pre>
+         #include <a href="#7.12">&lt;math.h&gt;</a>
+         double log2(double x);
+         float log2f(float x);
+         long double log2l(long double x);
+</pre>
+<p><b>Description</b>
+<p><!--para 2 -->
+ The log2 functions compute the base-2 logarithm of x. A domain error occurs if the
+ argument is less than zero. A range error may occur if the argument is zero.
+<p><b>Returns</b>
+<p><!--para 3 -->
+ The log2 functions return log2 x.
+<!--page 239 -->
+
+<h5><a name="7.12.6.11" href="#7.12.6.11">7.12.6.11 The logb functions</a></h5>
+<p><b>Synopsis</b>
+<p><!--para 1 -->
+<pre>
+        #include <a href="#7.12">&lt;math.h&gt;</a>
         double logb(double x);
         float logbf(float x);
         long double logbl(long double x);
+</pre>
+<p><b>Description</b>
+<p><!--para 2 -->
+ The logb functions extract the exponent of x, as a signed integer value in floating-point
+ format. If x is subnormal it is treated as though it were normalized; thus, for positive
+ finite x,
+<pre>
+       1 &lt;= x FLT_RADIX<sup>-logb(x)</sup> &lt; FLT_RADIX
+</pre>
+ A domain error or range error may occur if the argument is zero.
+<p><b>Returns</b>
+<p><!--para 3 -->
+ The logb functions return the signed exponent of x.
+
+<h5><a name="7.12.6.12" href="#7.12.6.12">7.12.6.12 The modf functions</a></h5>
+<p><b>Synopsis</b>
+<p><!--para 1 -->
+<pre>
+        #include <a href="#7.12">&lt;math.h&gt;</a>
         double modf(double value, double *iptr);
         float modff(float value, float *iptr);
         long double modfl(long double value, long double *iptr);
+</pre>
+<p><b>Description</b>
+<p><!--para 2 -->
+ The modf functions break the argument value into integral and fractional parts, each of
+ which has the same type and sign as the argument. They store the integral part (in
+ floating-point format) in the object pointed to by iptr.
+<p><b>Returns</b>
+<p><!--para 3 -->
+ The modf functions return the signed fractional part of value.
+<!--page 240 -->
+
+<h5><a name="7.12.6.13" href="#7.12.6.13">7.12.6.13 The scalbn and scalbln functions</a></h5>
+<p><b>Synopsis</b>
+<p><!--para 1 -->
+<pre>
+        #include <a href="#7.12">&lt;math.h&gt;</a>
         double scalbn(double x, int n);
         float scalbnf(float x, int n);
         long double scalbnl(long double x, int n);
         double scalbln(double x, long int n);
         float scalblnf(float x, long int n);
         long double scalblnl(long double x, long int n);
+</pre>
+<p><b>Description</b>
+<p><!--para 2 -->
+ The scalbn and scalbln functions compute x FLT_RADIX<sup>n</sup> efficiently, not
+ normally by computing FLT_RADIX<sup>n</sup> explicitly. A range error may occur.
+<p><b>Returns</b>
+<p><!--para 3 -->
+ The scalbn and scalbln functions return x FLT_RADIX<sup>n</sup> .
+
+<h4><a name="7.12.7" href="#7.12.7">7.12.7 Power and absolute-value functions</a></h4>
+
+<h5><a name="7.12.7.1" href="#7.12.7.1">7.12.7.1 The cbrt functions</a></h5>
+<p><b>Synopsis</b>
+<p><!--para 1 -->
+<pre>
+        #include <a href="#7.12">&lt;math.h&gt;</a>
         double cbrt(double x);
         float cbrtf(float x);
         long double cbrtl(long double x);
+</pre>
+<p><b>Description</b>
+<p><!--para 2 -->
+ The cbrt functions compute the real cube root of x.
+<p><b>Returns</b>
+<p><!--para 3 -->
+ The cbrt functions return x<sup>1/3</sup>.
+
+<h5><a name="7.12.7.2" href="#7.12.7.2">7.12.7.2 The fabs functions</a></h5>
+<p><b>Synopsis</b>
+<p><!--para 1 -->
+<pre>
+        #include <a href="#7.12">&lt;math.h&gt;</a>
         double fabs(double x);
         float fabsf(float x);
         long double fabsl(long double x);
+</pre>
+<p><b>Description</b>
+<p><!--para 2 -->
+ The fabs functions compute the absolute value of a floating-point number x.
+<!--page 241 -->
+<p><b>Returns</b>
+<p><!--para 3 -->
+ The fabs functions return | x |.
+
+<h5><a name="7.12.7.3" href="#7.12.7.3">7.12.7.3 The hypot functions</a></h5>
+<p><b>Synopsis</b>
+<p><!--para 1 -->
+<pre>
+        #include <a href="#7.12">&lt;math.h&gt;</a>
         double hypot(double x, double y);
         float hypotf(float x, float y);
-
-[<a name="p425" href="#p425">page 425</a>] (<a href="#Contents">Contents</a>)
-
-      long double hypotl(long double x, long double y);
-      double pow(double x, double y);
-      float powf(float x, float y);
-      long double powl(long double x, long double y);
-      double sqrt(double x);
-      float sqrtf(float x);
-      long double sqrtl(long double x);
-      double erf(double x);
-      float erff(float x);
-      long double erfl(long double x);
-      double erfc(double x);
-      float erfcf(float x);
-      long double erfcl(long double x);
-      double lgamma(double x);
-      float lgammaf(float x);
-      long double lgammal(long double x);
-      double tgamma(double x);
-      float tgammaf(float x);
-      long double tgammal(long double x);
-      double ceil(double x);
-      float ceilf(float x);
-      long double ceill(long double x);
-      double floor(double x);
-      float floorf(float x);
-      long double floorl(long double x);
-      double nearbyint(double x);
-      float nearbyintf(float x);
-      long double nearbyintl(long double x);
-      double rint(double x);
-      float rintf(float x);
-      long double rintl(long double x);
-      long int lrint(double x);
-      long int lrintf(float x);
-      long int lrintl(long double x);
-      long long int llrint(double x);
-      long long int llrintf(float x);
-      long long int llrintl(long double x);
-      double round(double x);
-      float roundf(float x);
-      long double roundl(long double x);
-      long int lround(double x);
-
-[<a name="p426" href="#p426">page 426</a>] (<a href="#Contents">Contents</a>)
-
+        long double hypotl(long double x, long double y);
+</pre>
+<p><b>Description</b>
+<p><!--para 2 -->
+ The hypot functions compute the square root of the sum of the squares of x and y,
+ without undue overflow or underflow. A range error may occur.
+<p><!--para 3 -->
+<p><b>Returns</b>
+<p><!--para 4 -->
+ The hypot functions return (sqrt)(x<sup>2</sup> + y<sup>2</sup>).
+
+<h5><a name="7.12.7.4" href="#7.12.7.4">7.12.7.4 The pow functions</a></h5>
+<p><b>Synopsis</b>
+<p><!--para 1 -->
+<pre>
+        #include <a href="#7.12">&lt;math.h&gt;</a>
+        double pow(double x, double y);
+        float powf(float x, float y);
+        long double powl(long double x, long double y);
+</pre>
+<p><b>Description</b>
+<p><!--para 2 -->
+ The pow functions compute x raised to the power y. A domain error occurs if x is finite
+ and negative and y is finite and not an integer value. A range error may occur. A domain
+ error may occur if x is zero and y is zero. A domain error or range error may occur if x
+ is zero and y is less than zero.
+<p><b>Returns</b>
+<p><!--para 3 -->
+ The pow functions return x<sup>y</sup>.
+
+<h5><a name="7.12.7.5" href="#7.12.7.5">7.12.7.5 The sqrt functions</a></h5>
+<p><b>Synopsis</b>
+<p><!--para 1 -->
+<!--page 242 -->
+<pre>
+        #include <a href="#7.12">&lt;math.h&gt;</a>
+        double sqrt(double x);
+        float sqrtf(float x);
+        long double sqrtl(long double x);
+</pre>
+<p><b>Description</b>
+<p><!--para 2 -->
+ The sqrt functions compute the nonnegative square root of x. A domain error occurs if
+ the argument is less than zero.
+<p><b>Returns</b>
+<p><!--para 3 -->
+ The sqrt functions return (sqrt)(x).
+
+<h4><a name="7.12.8" href="#7.12.8">7.12.8 Error and gamma functions</a></h4>
+
+<h5><a name="7.12.8.1" href="#7.12.8.1">7.12.8.1 The erf functions</a></h5>
+<p><b>Synopsis</b>
+<p><!--para 1 -->
+<pre>
+        #include <a href="#7.12">&lt;math.h&gt;</a>
+        double erf(double x);
+        float erff(float x);
+        long double erfl(long double x);
+</pre>
+<p><b>Description</b>
+<p><!--para 2 -->
+ The erf functions compute the error function of x.
+<p><b>Returns</b>
+<p><!--para 3 -->
+ The erf functions return
+<pre>
+              2        x
+ erf x =     ---    (integral)  e<sup>-t<sup>2</sup></sup> dt .
+          (sqrt)(pi)   0 
+</pre>
+
+<h5><a name="7.12.8.2" href="#7.12.8.2">7.12.8.2 The erfc functions</a></h5>
+<p><b>Synopsis</b>
+<p><!--para 1 -->
+<pre>
+        #include <a href="#7.12">&lt;math.h&gt;</a>
+        double erfc(double x);
+        float erfcf(float x);
+        long double erfcl(long double x);
+</pre>
+<p><b>Description</b>
+<p><!--para 2 -->
+ The erfc functions compute the complementary error function of x. A range error
+ occurs if x is too large.
+<p><b>Returns</b>
+<p><!--para 3 -->
+ The erfc functions return
+<pre>
+                           2       (inf)
+ erfc x = 1 - erf x =     ---    (integral)  e<sup>-t<sup>2</sup></sup> dt .
+                       (sqrt)(pi)    x 
+</pre>
+<!--page 243 -->
+<h5><a name="7.12.8.3" href="#7.12.8.3">7.12.8.3 The lgamma functions</a></h5>
+<p><b>Synopsis</b>
+<p><!--para 1 -->
+<pre>
+        #include <a href="#7.12">&lt;math.h&gt;</a>
+        double lgamma(double x);
+        float lgammaf(float x);
+        long double lgammal(long double x);
+</pre>
+<p><b>Description</b>
+<p><!--para 2 -->
+ The lgamma functions compute the natural logarithm of the absolute value of gamma of
+ x. A range error occurs if x is too large. A range error may occur if x is a negative
+ integer or zero.
+<p><b>Returns</b>
+<p><!--para 3 -->
+ The lgamma functions return loge | (Gamma)(x) |.
+
+<h5><a name="7.12.8.4" href="#7.12.8.4">7.12.8.4 The tgamma functions</a></h5>
+<p><b>Synopsis</b>
+<p><!--para 1 -->
+<pre>
+        #include <a href="#7.12">&lt;math.h&gt;</a>
+        double tgamma(double x);
+        float tgammaf(float x);
+        long double tgammal(long double x);
+</pre>
+<p><b>Description</b>
+<p><!--para 2 -->
+ The tgamma functions compute the gamma function of x. A domain error or range error
+ may occur if x is a negative integer or zero. A range error may occur if the magnitude of
+ x is too large or too small.
+<p><b>Returns</b>
+<p><!--para 3 -->
+ The tgamma functions return (Gamma)(x).
+
+<h4><a name="7.12.9" href="#7.12.9">7.12.9 Nearest integer functions</a></h4>
+
+<h5><a name="7.12.9.1" href="#7.12.9.1">7.12.9.1 The ceil functions</a></h5>
+<p><b>Synopsis</b>
+<p><!--para 1 -->
+<pre>
+        #include <a href="#7.12">&lt;math.h&gt;</a>
+        double ceil(double x);
+        float ceilf(float x);
+        long double ceill(long double x);
+</pre>
+<p><b>Description</b>
+<p><!--para 2 -->
+ The ceil functions compute the smallest integer value not less than x.
+<!--page 244 -->
+<p><b>Returns</b>
+<p><!--para 3 -->
+ The ceil functions return [^x^], expressed as a floating-point number.
+
+<h5><a name="7.12.9.2" href="#7.12.9.2">7.12.9.2 The floor functions</a></h5>
+<p><b>Synopsis</b>
+<p><!--para 1 -->
+<pre>
+        #include <a href="#7.12">&lt;math.h&gt;</a>
+        double floor(double x);
+        float floorf(float x);
+        long double floorl(long double x);
+</pre>
+<p><b>Description</b>
+<p><!--para 2 -->
+ The floor functions compute the largest integer value not greater than x.
+<p><b>Returns</b>
+<p><!--para 3 -->
+ The floor functions return [_x_], expressed as a floating-point number.
+
+<h5><a name="7.12.9.3" href="#7.12.9.3">7.12.9.3 The nearbyint functions</a></h5>
+<p><b>Synopsis</b>
+<p><!--para 1 -->
+<pre>
+        #include <a href="#7.12">&lt;math.h&gt;</a>
+        double nearbyint(double x);
+        float nearbyintf(float x);
+        long double nearbyintl(long double x);
+</pre>
+<p><b>Description</b>
+<p><!--para 2 -->
+ The nearbyint functions round their argument to an integer value in floating-point
+ format, using the current rounding direction and without raising the ''inexact'' floating-
+ point exception.
+<p><b>Returns</b>
+<p><!--para 3 -->
+ The nearbyint functions return the rounded integer value.
+
+<h5><a name="7.12.9.4" href="#7.12.9.4">7.12.9.4 The rint functions</a></h5>
+<p><b>Synopsis</b>
+<p><!--para 1 -->
+<pre>
+        #include <a href="#7.12">&lt;math.h&gt;</a>
+        double rint(double x);
+        float rintf(float x);
+        long double rintl(long double x);
+</pre>
+<p><b>Description</b>
+<p><!--para 2 -->
+ The rint functions differ from the nearbyint functions (<a href="#7.12.9.3">7.12.9.3</a>) only in that the
+ rint functions may raise the ''inexact'' floating-point exception if the result differs in
+ value from the argument.
+<!--page 245 -->
+<p><b>Returns</b>
+<p><!--para 3 -->
+ The rint functions return the rounded integer value.
+
+<h5><a name="7.12.9.5" href="#7.12.9.5">7.12.9.5 The lrint and llrint functions</a></h5>
+<p><b>Synopsis</b>
+<p><!--para 1 -->
+<pre>
+        #include <a href="#7.12">&lt;math.h&gt;</a>
+        long int lrint(double x);
+        long int lrintf(float x);
+        long int lrintl(long double x);
+        long long int llrint(double x);
+        long long int llrintf(float x);
+        long long int llrintl(long double x);
+</pre>
+<p><b>Description</b>
+<p><!--para 2 -->
+ The lrint and llrint functions round their argument to the nearest integer value,
+ rounding according to the current rounding direction. If the rounded value is outside the
+ range of the return type, the numeric result is unspecified and a domain error or range
+ error may occur.                                                                          *
+<p><b>Returns</b>
+<p><!--para 3 -->
+ The lrint and llrint functions return the rounded integer value.
+
+<h5><a name="7.12.9.6" href="#7.12.9.6">7.12.9.6 The round functions</a></h5>
+<p><b>Synopsis</b>
+<p><!--para 1 -->
+<pre>
+        #include <a href="#7.12">&lt;math.h&gt;</a>
+        double round(double x);
+        float roundf(float x);
+        long double roundl(long double x);
+</pre>
+<p><b>Description</b>
+<p><!--para 2 -->
+ The round functions round their argument to the nearest integer value in floating-point
+ format, rounding halfway cases away from zero, regardless of the current rounding
+ direction.
+<p><b>Returns</b>
+<p><!--para 3 -->
+ The round functions return the rounded integer value.
+<!--page 246 -->
+
+<h5><a name="7.12.9.7" href="#7.12.9.7">7.12.9.7 The lround and llround functions</a></h5>
+<p><b>Synopsis</b>
+<p><!--para 1 -->
+<pre>
+        #include <a href="#7.12">&lt;math.h&gt;</a>
+        long int lround(double x);
         long int lroundf(float x);
         long int lroundl(long double x);
         long long int llround(double x);
         long long int llroundf(float x);
         long long int llroundl(long double x);
+</pre>
+<p><b>Description</b>
+<p><!--para 2 -->
+ The lround and llround functions round their argument to the nearest integer value,
+ rounding halfway cases away from zero, regardless of the current rounding direction. If
+ the rounded value is outside the range of the return type, the numeric result is unspecified
+ and a domain error or range error may occur.
+<p><b>Returns</b>
+<p><!--para 3 -->
+ The lround and llround functions return the rounded integer value.
+
+<h5><a name="7.12.9.8" href="#7.12.9.8">7.12.9.8 The trunc functions</a></h5>
+<p><b>Synopsis</b>
+<p><!--para 1 -->
+<pre>
+        #include <a href="#7.12">&lt;math.h&gt;</a>
         double trunc(double x);
         float truncf(float x);
         long double truncl(long double x);
-        double fmod(double x, double y);
-        float fmodf(float x, float y);
-        long double fmodl(long double x, long double y);
-        double remainder(double x, double y);
-        float remainderf(float x, float y);
-        long double remainderl(long double x, long double y);
+</pre>
+<p><b>Description</b>
+<p><!--para 2 -->
+ The trunc functions round their argument to the integer value, in floating format,
+ nearest to but no larger in magnitude than the argument.
+<p><b>Returns</b>
+<p><!--para 3 -->
+ The trunc functions return the truncated integer value.
+<!--page 247 -->
+
+<h4><a name="7.12.10" href="#7.12.10">7.12.10 Remainder functions</a></h4>
+
+<h5><a name="7.12.10.1" href="#7.12.10.1">7.12.10.1 The fmod functions</a></h5>
+<p><b>Synopsis</b>
+<p><!--para 1 -->
+<pre>
+          #include <a href="#7.12">&lt;math.h&gt;</a>
+          double fmod(double x, double y);
+          float fmodf(float x, float y);
+          long double fmodl(long double x, long double y);
+</pre>
+<p><b>Description</b>
+<p><!--para 2 -->
+ The fmod functions compute the floating-point remainder of x/y.
+<p><b>Returns</b>
+<p><!--para 3 -->
+ The fmod functions return the value x - ny, for some integer n such that, if y is nonzero,
+ the result has the same sign as x and magnitude less than the magnitude of y. If y is zero,
+ whether a domain error occurs or the fmod functions return zero is implementation-
+ defined.
+
+<h5><a name="7.12.10.2" href="#7.12.10.2">7.12.10.2 The remainder functions</a></h5>
+<p><b>Synopsis</b>
+<p><!--para 1 -->
+<pre>
+          #include <a href="#7.12">&lt;math.h&gt;</a>
+          double remainder(double x, double y);
+          float remainderf(float x, float y);
+          long double remainderl(long double x, long double y);
+</pre>
+<p><b>Description</b>
+<p><!--para 2 -->
+ The remainder functions compute the remainder x REM y required by IEC 60559.<sup><a href="#note210"><b>210)</b></a></sup>
+<p><b>Returns</b>
+<p><!--para 3 -->
+ The remainder functions return x REM y. If y is zero, whether a domain error occurs
+ or the functions return zero is implementation defined.
+<!--page 248 -->
+
+<p><b>Footnotes</b>
+<p><small><a name="note210" href="#note210">210)</a> ''When y != 0, the remainder r = x REM y is defined regardless of the rounding mode by the
+ mathematical relation r = x - ny, where n is the integer nearest the exact value of x/y; whenever
+ | n - x/y | = 1/2, then n is even. Thus, the remainder is always exact. If r = 0, its sign shall be that of
+ x.'' This definition is applicable for all implementations.
+</small>
+
+<h5><a name="7.12.10.3" href="#7.12.10.3">7.12.10.3 The remquo functions</a></h5>
+<p><b>Synopsis</b>
+<p><!--para 1 -->
+<pre>
+        #include <a href="#7.12">&lt;math.h&gt;</a>
         double remquo(double x, double y, int *quo);
         float remquof(float x, float y, int *quo);
         long double remquol(long double x, long double y,
              int *quo);
+</pre>
+<p><b>Description</b>
+<p><!--para 2 -->
+ The remquo functions compute the same remainder as the remainder functions. In
+ the object pointed to by quo they store a value whose sign is the sign of x/y and whose
+ magnitude is congruent modulo 2<sup>n</sup> to the magnitude of the integral quotient of x/y, where
+ n is an implementation-defined integer greater than or equal to 3.
+<p><b>Returns</b>
+<p><!--para 3 -->
+ The remquo functions return x REM y. If y is zero, the value stored in the object
+ pointed to by quo is unspecified and whether a domain error occurs or the functions
+ return zero is implementation defined.
+
+<h4><a name="7.12.11" href="#7.12.11">7.12.11 Manipulation functions</a></h4>
+
+<h5><a name="7.12.11.1" href="#7.12.11.1">7.12.11.1 The copysign functions</a></h5>
+<p><b>Synopsis</b>
+<p><!--para 1 -->
+<pre>
+        #include <a href="#7.12">&lt;math.h&gt;</a>
         double copysign(double x, double y);
         float copysignf(float x, float y);
         long double copysignl(long double x, long double y);
-        double nan(const char *tagp);
-        float nanf(const char *tagp);
-        long double nanl(const char *tagp);
-        double nextafter(double x, double y);
-        float nextafterf(float x, float y);
-        long double nextafterl(long double x, long double y);
-        double nexttoward(double x, long double y);
-        float nexttowardf(float x, long double y);
-        long double nexttowardl(long double x, long double y);
-        double fdim(double x, double y);
-        float fdimf(float x, float y);
-        long double fdiml(long double x, long double y);
-        double fmax(double x, double y);
-        float fmaxf(float x, float y);
-        long double fmaxl(long double x, long double y);
-        double fmin(double x, double y);
-        float fminf(float x, float y);
-        long double fminl(long double x, long double y);
-        double fma(double x, double y, double z);
-        float fmaf(float x, float y, float z);
-
-[<a name="p427" href="#p427">page 427</a>] (<a href="#Contents">Contents</a>)
-
-      long double fmal(long double x, long double y,
-           long double z);
-      int isgreater(real-floating x, real-floating y);
-      int isgreaterequal(real-floating x, real-floating y);
-      int isless(real-floating x, real-floating y);
-      int islessequal(real-floating x, real-floating y);
-      int islessgreater(real-floating x, real-floating y);
-      int isunordered(real-floating x, real-floating y);
-<a name="B.12" href="#B.12"><b>B.12 Nonlocal jumps &lt;setjmp.h&gt;</b></a>
-      jmp_buf
-      int setjmp(jmp_buf env);
-      void longjmp(jmp_buf env, int val);
-<a name="B.13" href="#B.13"><b>B.13 Signal handling &lt;signal.h&gt;</b></a>
-      sig_atomic_t   SIG_IGN            SIGILL            SIGTERM
-      SIG_DFL        SIGABRT            SIGINT
-      SIG_ERR        SIGFPE             SIGSEGV
-      void (*signal(int sig, void (*func)(int)))(int);
-      int raise(int sig);
-<a name="B.14" href="#B.14"><b>B.14 Variable arguments &lt;stdarg.h&gt;</b></a>
-      va_list
-      type va_arg(va_list ap, type);
-      void va_copy(va_list dest, va_list src);
-      void va_end(va_list ap);
-      void va_start(va_list ap, parmN);
-<a name="B.15" href="#B.15"><b>B.15 Boolean type and values &lt;stdbool.h&gt;</b></a>
-      bool
-      true
-      false
-      __bool_true_false_are_defined
-
-
-
-
-[<a name="p428" href="#p428">page 428</a>] (<a href="#Contents">Contents</a>)
-
-<a name="B.16" href="#B.16"><b>B.16 Common definitions &lt;stddef.h&gt;</b></a>
-        ptrdiff_t       size_t            wchar_t           NULL
+</pre>
+<p><b>Description</b>
+<p><!--para 2 -->
+ The copysign functions produce a value with the magnitude of x and the sign of y.
+ They produce a NaN (with the sign of y) if x is a NaN. On implementations that
+ represent a signed zero but do not treat negative zero consistently in arithmetic
+ operations, the copysign functions regard the sign of zero as positive.
+<p><b>Returns</b>
+<p><!--para 3 -->
+ The copysign functions return a value with the magnitude of x and the sign of y.
+<!--page 249 -->
+
+<h5><a name="7.12.11.2" href="#7.12.11.2">7.12.11.2 The nan functions</a></h5>
+<p><b>Synopsis</b>
+<p><!--para 1 -->
+<pre>
+         #include <a href="#7.12">&lt;math.h&gt;</a>
+         double nan(const char *tagp);
+         float nanf(const char *tagp);
+         long double nanl(const char *tagp);
+</pre>
+<p><b>Description</b>
+<p><!--para 2 -->
+ The call nan("n-char-sequence") is equivalent to strtod("NAN(n-char-
+ sequence)",     (char**)       NULL); the call nan("") is equivalent to
+ strtod("NAN()", (char**) NULL). If tagp does not point to an n-char
+ sequence or an empty string, the call is equivalent to strtod("NAN", (char**)
+ NULL). Calls to nanf and nanl are equivalent to the corresponding calls to strtof
+ and strtold.
+<p><b>Returns</b>
+<p><!--para 3 -->
+ The nan functions return a quiet NaN, if available, with content indicated through tagp.
+ If the implementation does not support quiet NaNs, the functions return zero.
+<p><b> Forward references</b>: the strtod, strtof, and strtold functions (<a href="#7.20.1.3">7.20.1.3</a>).
+
+<h5><a name="7.12.11.3" href="#7.12.11.3">7.12.11.3 The nextafter functions</a></h5>
+<p><b>Synopsis</b>
+<p><!--para 1 -->
+<pre>
+         #include <a href="#7.12">&lt;math.h&gt;</a>
+         double nextafter(double x, double y);
+         float nextafterf(float x, float y);
+         long double nextafterl(long double x, long double y);
+</pre>
+<p><b>Description</b>
+<p><!--para 2 -->
+ The nextafter functions determine the next representable value, in the type of the
+ function, after x in the direction of y, where x and y are first converted to the type of the
+ function.<sup><a href="#note211"><b>211)</b></a></sup> The nextafter functions return y if x equals y. A range error may occur
+ if the magnitude of x is the largest finite value representable in the type and the result is
+ infinite or not representable in the type.
+<p><b>Returns</b>
+<p><!--para 3 -->
+ The nextafter functions return the next representable value in the specified format
+ after x in the direction of y.
+<!--page 250 -->
+
+<p><b>Footnotes</b>
+<p><small><a name="note211" href="#note211">211)</a> The argument values are converted to the type of the function, even by a macro implementation of the
+ function.
+</small>
+
+<h5><a name="7.12.11.4" href="#7.12.11.4">7.12.11.4 The nexttoward functions</a></h5>
+<p><b>Synopsis</b>
+<p><!--para 1 -->
+<pre>
+         #include <a href="#7.12">&lt;math.h&gt;</a>
+         double nexttoward(double x, long double y);
+         float nexttowardf(float x, long double y);
+         long double nexttowardl(long double x, long double y);
+</pre>
+<p><b>Description</b>
+<p><!--para 2 -->
+ The nexttoward functions are equivalent to the nextafter functions except that the
+ second parameter has type long double and the functions return y converted to the
+ type of the function if x equals y.<sup><a href="#note212"><b>212)</b></a></sup>
+
+<p><b>Footnotes</b>
+<p><small><a name="note212" href="#note212">212)</a> The result of the nexttoward functions is determined in the type of the function, without loss of
+ range or precision in a floating second argument.
+</small>
+
+<h4><a name="7.12.12" href="#7.12.12">7.12.12 Maximum, minimum, and positive difference functions</a></h4>
+
+<h5><a name="7.12.12.1" href="#7.12.12.1">7.12.12.1 The fdim functions</a></h5>
+<p><b>Synopsis</b>
+<p><!--para 1 -->
+<pre>
+         #include <a href="#7.12">&lt;math.h&gt;</a>
+         double fdim(double x, double y);
+         float fdimf(float x, float y);
+         long double fdiml(long double x, long double y);
+</pre>
+<p><b>Description</b>
+<p><!--para 2 -->
+ The fdim functions determine the positive difference between their arguments:
+<pre>
+       {x - y  if x &gt; y
+       {
+       {+0     if x &lt;= y
+</pre>
+ A range error may occur.
+<p><b>Returns</b>
+<p><!--para 3 -->
+ The fdim functions return the positive difference value.
+
+<h5><a name="7.12.12.2" href="#7.12.12.2">7.12.12.2 The fmax functions</a></h5>
+<p><b>Synopsis</b>
+<p><!--para 1 -->
+<pre>
+         #include <a href="#7.12">&lt;math.h&gt;</a>
+         double fmax(double x, double y);
+         float fmaxf(float x, float y);
+         long double fmaxl(long double x, long double y);
+</pre>
+<!--page 251 -->
+<p><b>Description</b>
+<p><!--para 2 -->
+ The fmax functions determine the maximum numeric value of their arguments.<sup><a href="#note213"><b>213)</b></a></sup>
+<p><b>Returns</b>
+<p><!--para 3 -->
+ The fmax functions return the maximum numeric value of their arguments.
+
+<p><b>Footnotes</b>
+<p><small><a name="note213" href="#note213">213)</a> NaN arguments are treated as missing data: if one argument is a NaN and the other numeric, then the
+ fmax functions choose the numeric value. See <a href="#F.9.9.2">F.9.9.2</a>.
+</small>
+
+<h5><a name="7.12.12.3" href="#7.12.12.3">7.12.12.3 The fmin functions</a></h5>
+<p><b>Synopsis</b>
+<p><!--para 1 -->
+<pre>
+         #include <a href="#7.12">&lt;math.h&gt;</a>
+         double fmin(double x, double y);
+         float fminf(float x, float y);
+         long double fminl(long double x, long double y);
+</pre>
+<p><b>Description</b>
+<p><!--para 2 -->
+ The fmin functions determine the minimum numeric value of their arguments.<sup><a href="#note214"><b>214)</b></a></sup>
+<p><b>Returns</b>
+<p><!--para 3 -->
+ The fmin functions return the minimum numeric value of their arguments.
+
+<p><b>Footnotes</b>
+<p><small><a name="note214" href="#note214">214)</a> The fmin functions are analogous to the fmax functions in their treatment of NaNs.
+</small>
+
+<h4><a name="7.12.13" href="#7.12.13">7.12.13 Floating multiply-add</a></h4>
+
+<h5><a name="7.12.13.1" href="#7.12.13.1">7.12.13.1 The fma functions</a></h5>
+<p><b>Synopsis</b>
+<p><!--para 1 -->
+<pre>
+         #include <a href="#7.12">&lt;math.h&gt;</a>
+         double fma(double x, double y, double z);
+         float fmaf(float x, float y, float z);
+         long double fmal(long double x, long double y,
+              long double z);
+</pre>
+<p><b>Description</b>
+<p><!--para 2 -->
+ The fma functions compute (x y) + z, rounded as one ternary operation: they compute
+ the value (as if) to infinite precision and round once to the result format, according to the
+ current rounding mode. A range error may occur.
+<p><b>Returns</b>
+<p><!--para 3 -->
+ The fma functions return (x y) + z, rounded as one ternary operation.
+<!--page 252 -->
+
+<h4><a name="7.12.14" href="#7.12.14">7.12.14 Comparison macros</a></h4>
+<p><!--para 1 -->
+ The relational and equality operators support the usual mathematical relationships
+ between numeric values. For any ordered pair of numeric values exactly one of the
+ relationships -- less, greater, and equal -- is true. Relational operators may raise the
+ ''invalid'' floating-point exception when argument values are NaNs. For a NaN and a
+ numeric value, or for two NaNs, just the unordered relationship is true.<sup><a href="#note215"><b>215)</b></a></sup> The following
+ subclauses provide macros that are quiet (non floating-point exception raising) versions
+ of the relational operators, and other comparison macros that facilitate writing efficient
+ code that accounts for NaNs without suffering the ''invalid'' floating-point exception. In
+ the synopses in this subclause, real-floating indicates that the argument shall be an
+ expression of real floating type.
+
+<p><b>Footnotes</b>
+<p><small><a name="note215" href="#note215">215)</a> IEC 60559 requires that the built-in relational operators raise the ''invalid'' floating-point exception if
+ the operands compare unordered, as an error indicator for programs written without consideration of
+ NaNs; the result in these cases is false.
+</small>
+
+<h5><a name="7.12.14.1" href="#7.12.14.1">7.12.14.1 The isgreater macro</a></h5>
+<p><b>Synopsis</b>
+<p><!--para 1 -->
+<pre>
+          #include <a href="#7.12">&lt;math.h&gt;</a>
+          int isgreater(real-floating x, real-floating y);
+</pre>
+<p><b>Description</b>
+<p><!--para 2 -->
+ The isgreater macro determines whether its first argument is greater than its second
+ argument. The value of isgreater(x, y) is always equal to (x) &gt; (y); however,
+ unlike (x) &gt; (y), isgreater(x, y) does not raise the ''invalid'' floating-point
+ exception when x and y are unordered.
+<p><b>Returns</b>
+<p><!--para 3 -->
+ The isgreater macro returns the value of (x) &gt; (y).
+
+<h5><a name="7.12.14.2" href="#7.12.14.2">7.12.14.2 The isgreaterequal macro</a></h5>
+<p><b>Synopsis</b>
+<p><!--para 1 -->
+<pre>
+          #include <a href="#7.12">&lt;math.h&gt;</a>
+          int isgreaterequal(real-floating x, real-floating y);
+</pre>
+<p><b>Description</b>
+<p><!--para 2 -->
+ The isgreaterequal macro determines whether its first argument is greater than or
+ equal to its second argument. The value of isgreaterequal(x, y) is always equal
+ to (x) &gt;= (y); however, unlike (x) &gt;= (y), isgreaterequal(x, y) does
+ not raise the ''invalid'' floating-point exception when x and y are unordered.
+<!--page 253 -->
+<p><b>Returns</b>
+<p><!--para 3 -->
+ The isgreaterequal macro returns the value of (x) &gt;= (y).
+
+<h5><a name="7.12.14.3" href="#7.12.14.3">7.12.14.3 The isless macro</a></h5>
+<p><b>Synopsis</b>
+<p><!--para 1 -->
+<pre>
+        #include <a href="#7.12">&lt;math.h&gt;</a>
+        int isless(real-floating x, real-floating y);
+</pre>
+<p><b>Description</b>
+<p><!--para 2 -->
+ The isless macro determines whether its first argument is less than its second
+ argument. The value of isless(x, y) is always equal to (x) &lt; (y); however,
+ unlike (x) &lt; (y), isless(x, y) does not raise the ''invalid'' floating-point
+ exception when x and y are unordered.
+<p><b>Returns</b>
+<p><!--para 3 -->
+ The isless macro returns the value of (x) &lt; (y).
+
+<h5><a name="7.12.14.4" href="#7.12.14.4">7.12.14.4 The islessequal macro</a></h5>
+<p><b>Synopsis</b>
+<p><!--para 1 -->
+<pre>
+        #include <a href="#7.12">&lt;math.h&gt;</a>
+        int islessequal(real-floating x, real-floating y);
+</pre>
+<p><b>Description</b>
+<p><!--para 2 -->
+ The islessequal macro determines whether its first argument is less than or equal to
+ its second argument. The value of islessequal(x, y) is always equal to
+ (x) &lt;= (y); however, unlike (x) &lt;= (y), islessequal(x, y) does not raise
+ the ''invalid'' floating-point exception when x and y are unordered.
+<p><b>Returns</b>
+<p><!--para 3 -->
+ The islessequal macro returns the value of (x) &lt;= (y).
+
+<h5><a name="7.12.14.5" href="#7.12.14.5">7.12.14.5 The islessgreater macro</a></h5>
+<p><b>Synopsis</b>
+<p><!--para 1 -->
+<pre>
+        #include <a href="#7.12">&lt;math.h&gt;</a>
+        int islessgreater(real-floating x, real-floating y);
+</pre>
+<p><b>Description</b>
+<p><!--para 2 -->
+ The islessgreater macro determines whether its first argument is less than or
+ greater than its second argument. The islessgreater(x, y) macro is similar to
+ (x) &lt; (y) || (x) &gt; (y); however, islessgreater(x, y) does not raise
+ the ''invalid'' floating-point exception when x and y are unordered (nor does it evaluate x
+ and y twice).
+<!--page 254 -->
+<p><b>Returns</b>
+<p><!--para 3 -->
+ The islessgreater macro returns the value of (x) &lt; (y) || (x) &gt; (y).
+
+<h5><a name="7.12.14.6" href="#7.12.14.6">7.12.14.6 The isunordered macro</a></h5>
+<p><b>Synopsis</b>
+<p><!--para 1 -->
+<pre>
+       #include <a href="#7.12">&lt;math.h&gt;</a>
+       int isunordered(real-floating x, real-floating y);
+</pre>
+<p><b>Description</b>
+<p><!--para 2 -->
+ The isunordered macro determines whether its arguments are unordered.
+<p><b>Returns</b>
+<p><!--para 3 -->
+ The isunordered macro returns 1 if its arguments are unordered and 0 otherwise.
+<!--page 255 -->
+
+<h3><a name="7.13" href="#7.13">7.13 Nonlocal jumps &lt;setjmp.h&gt;</a></h3>
+<p><!--para 1 -->
+ The header <a href="#7.13">&lt;setjmp.h&gt;</a> defines the macro setjmp, and declares one function and
+ one type, for bypassing the normal function call and return discipline.<sup><a href="#note216"><b>216)</b></a></sup>
+<p><!--para 2 -->
+ The type declared is
+<pre>
+         jmp_buf
+</pre>
+ which is an array type suitable for holding the information needed to restore a calling
+ environment. The environment of a call to the setjmp macro consists of information
+ sufficient for a call to the longjmp function to return execution to the correct block and
+ invocation of that block, were it called recursively. It does not include the state of the
+ floating-point status flags, of open files, or of any other component of the abstract
+ machine.
+<p><!--para 3 -->
+ It is unspecified whether setjmp is a macro or an identifier declared with external
+ linkage. If a macro definition is suppressed in order to access an actual function, or a
+ program defines an external identifier with the name setjmp, the behavior is undefined.
+
+<p><b>Footnotes</b>
+<p><small><a name="note216" href="#note216">216)</a> These functions are useful for dealing with unusual conditions encountered in a low-level function of
+ a program.
+</small>
+
+<h4><a name="7.13.1" href="#7.13.1">7.13.1 Save calling environment</a></h4>
+
+<h5><a name="7.13.1.1" href="#7.13.1.1">7.13.1.1 The setjmp macro</a></h5>
+<p><b>Synopsis</b>
+<p><!--para 1 -->
+<pre>
+         #include <a href="#7.13">&lt;setjmp.h&gt;</a>
+         int setjmp(jmp_buf env);
+</pre>
+<p><b>Description</b>
+<p><!--para 2 -->
+ The setjmp macro saves its calling environment in its jmp_buf argument for later use
+ by the longjmp function.
+<p><b>Returns</b>
+<p><!--para 3 -->
+ If the return is from a direct invocation, the setjmp macro returns the value zero. If the
+ return is from a call to the longjmp function, the setjmp macro returns a nonzero
+ value.
+<p><b>Environmental limits</b>
+<p><!--para 4 -->
+ An invocation of the setjmp macro shall appear only in one of the following contexts:
+<ul>
+<li>  the entire controlling expression of a selection or iteration statement;
+<li>  one operand of a relational or equality operator with the other operand an integer
+ constant expression, with the resulting expression being the entire controlling
+<!--page 256 -->
+   expression of a selection or iteration statement;
+<li>  the operand of a unary ! operator with the resulting expression being the entire
+ controlling expression of a selection or iteration statement; or
+<li>  the entire expression of an expression statement (possibly cast to void).
+</ul>
+<p><!--para 5 -->
+ If the invocation appears in any other context, the behavior is undefined.
+
+<h4><a name="7.13.2" href="#7.13.2">7.13.2 Restore calling environment</a></h4>
+
+<h5><a name="7.13.2.1" href="#7.13.2.1">7.13.2.1 The longjmp function</a></h5>
+<p><b>Synopsis</b>
+<p><!--para 1 -->
+<pre>
+          #include <a href="#7.13">&lt;setjmp.h&gt;</a>
+          void longjmp(jmp_buf env, int val);
+</pre>
+<p><b>Description</b>
+<p><!--para 2 -->
+ The longjmp function restores the environment saved by the most recent invocation of
+ the setjmp macro in the same invocation of the program with the corresponding
+ jmp_buf argument. If there has been no such invocation, or if the function containing
+ the invocation of the setjmp macro has terminated execution<sup><a href="#note217"><b>217)</b></a></sup> in the interim, or if the
+ invocation of the setjmp macro was within the scope of an identifier with variably
+ modified type and execution has left that scope in the interim, the behavior is undefined.
+<p><!--para 3 -->
+ All accessible objects have values, and all other components of the abstract machine<sup><a href="#note218"><b>218)</b></a></sup>
+ have state, as of the time the longjmp function was called, except that the values of
+ objects of automatic storage duration that are local to the function containing the
+ invocation of the corresponding setjmp macro that do not have volatile-qualified type
+ and have been changed between the setjmp invocation and longjmp call are
+ indeterminate.
+<p><b>Returns</b>
+<p><!--para 4 -->
+ After longjmp is completed, program execution continues as if the corresponding
+ invocation of the setjmp macro had just returned the value specified by val. The
+ longjmp function cannot cause the setjmp macro to return the value 0; if val is 0,
+ the setjmp macro returns the value 1.
+<p><!--para 5 -->
+ EXAMPLE The longjmp function that returns control back to the point of the setjmp invocation
+ might cause memory associated with a variable length array object to be squandered.
+<!--page 257 -->
+<!--page 258 -->
+<pre>
+        #include <a href="#7.13">&lt;setjmp.h&gt;</a>
+        jmp_buf buf;
+        void g(int n);
+        void h(int n);
+        int n = 6;
+        void f(void)
+        {
+              int x[n];          // valid: f is not terminated
+              setjmp(buf);
+              g(n);
+        }
+        void g(int n)
+        {
+              int a[n];          // a may remain allocated
+              h(n);
+        }
+        void h(int n)
+        {
+              int b[n];          // b may remain allocated
+              longjmp(buf, 2);   // might cause memory loss
+        }
+</pre>
+
+<p><b>Footnotes</b>
+<p><small><a name="note217" href="#note217">217)</a> For example, by executing a return statement or because another longjmp call has caused a
+ transfer to a setjmp invocation in a function earlier in the set of nested calls.
+</small>
+<p><small><a name="note218" href="#note218">218)</a> This includes, but is not limited to, the floating-point status flags and the state of open files.
+</small>
+
+<h3><a name="7.14" href="#7.14">7.14 Signal handling &lt;signal.h&gt;</a></h3>
+<p><!--para 1 -->
+ The header <a href="#7.14">&lt;signal.h&gt;</a> declares a type and two functions and defines several macros,
+ for handling various signals (conditions that may be reported during program execution).
+<p><!--para 2 -->
+ The type defined is
+<pre>
+         sig_atomic_t
+</pre>
+ which is the (possibly volatile-qualified) integer type of an object that can be accessed as
+ an atomic entity, even in the presence of asynchronous interrupts.
+<p><!--para 3 -->
+ The macros defined are
+<pre>
+         SIG_DFL
+         SIG_ERR
+         SIG_IGN
+</pre>
+ which expand to constant expressions with distinct values that have type compatible with
+ the second argument to, and the return value of, the signal function, and whose values
+ compare unequal to the address of any declarable function; and the following, which
+ expand to positive integer constant expressions with type int and distinct values that are
+ the signal numbers, each corresponding to the specified condition:
+<pre>
+         SIGABRT abnormal termination, such as is initiated by the abort function
+         SIGFPE         an erroneous arithmetic operation, such as zero divide or an operation
+                        resulting in overflow
+         SIGILL         detection of an invalid function image, such as an invalid instruction
+         SIGINT         receipt of an interactive attention signal
+         SIGSEGV an invalid access to storage
+         SIGTERM a termination request sent to the program
+</pre>
+<p><!--para 4 -->
+ An implementation need not generate any of these signals, except as a result of explicit
+ calls to the raise function. Additional signals and pointers to undeclarable functions,
+ with macro definitions beginning, respectively, with the letters SIG and an uppercase
+ letter or with SIG_ and an uppercase letter,<sup><a href="#note219"><b>219)</b></a></sup> may also be specified by the
+ implementation. The complete set of signals, their semantics, and their default handling
+ is implementation-defined; all signal numbers shall be positive.
+<!--page 259 -->
+
+<p><b>Footnotes</b>
+<p><small><a name="note219" href="#note219">219)</a> See ''future library directions'' (<a href="#7.26.9">7.26.9</a>). The names of the signal numbers reflect the following terms
+ (respectively): abort, floating-point exception, illegal instruction, interrupt, segmentation violation,
+ and termination.
+</small>
+
+<h4><a name="7.14.1" href="#7.14.1">7.14.1 Specify signal handling</a></h4>
+
+<h5><a name="7.14.1.1" href="#7.14.1.1">7.14.1.1 The signal function</a></h5>
+<p><b>Synopsis</b>
+<p><!--para 1 -->
+<pre>
+         #include <a href="#7.14">&lt;signal.h&gt;</a>
+         void (*signal(int sig, void (*func)(int)))(int);
+</pre>
+<p><b>Description</b>
+<p><!--para 2 -->
+ The signal function chooses one of three ways in which receipt of the signal number
+ sig is to be subsequently handled. If the value of func is SIG_DFL, default handling
+ for that signal will occur. If the value of func is SIG_IGN, the signal will be ignored.
+ Otherwise, func shall point to a function to be called when that signal occurs. An
+ invocation of such a function because of a signal, or (recursively) of any further functions
+ called by that invocation (other than functions in the standard library), is called a signal
+ handler.
+<p><!--para 3 -->
+ When a signal occurs and func points to a function, it is implementation-defined
+ whether the equivalent of signal(sig, SIG_DFL); is executed or the
+ implementation prevents some implementation-defined set of signals (at least including
+ sig) from occurring until the current signal handling has completed; in the case of
+ SIGILL, the implementation may alternatively define that no action is taken. Then the
+ equivalent of (*func)(sig); is executed. If and when the function returns, if the
+ value of sig is SIGFPE, SIGILL, SIGSEGV, or any other implementation-defined
+ value corresponding to a computational exception, the behavior is undefined; otherwise
+ the program will resume execution at the point it was interrupted.
+<p><!--para 4 -->
+ If the signal occurs as the result of calling the abort or raise function, the signal
+ handler shall not call the raise function.
+<p><!--para 5 -->
+ If the signal occurs other than as the result of calling the abort or raise function, the
+ behavior is undefined if the signal handler refers to any object with static storage duration
+ other than by assigning a value to an object declared as volatile sig_atomic_t, or
+ the signal handler calls any function in the standard library other than the abort
+ function, the _Exit function, or the signal function with the first argument equal to
+ the signal number corresponding to the signal that caused the invocation of the handler.
+ Furthermore, if such a call to the signal function results in a SIG_ERR return, the
+ value of errno is indeterminate.<sup><a href="#note220"><b>220)</b></a></sup>
+<p><!--para 6 -->
+ At program startup, the equivalent of
+<pre>
+         signal(sig, SIG_IGN);
+</pre>
+<!--page 260 -->
+ may be executed for some signals selected in an implementation-defined manner; the
+ equivalent of
+<pre>
+        signal(sig, SIG_DFL);
+</pre>
+ is executed for all other signals defined by the implementation.
+<p><!--para 7 -->
+ The implementation shall behave as if no library function calls the signal function.
+<p><b>Returns</b>
+<p><!--para 8 -->
+ If the request can be honored, the signal function returns the value of func for the
+ most recent successful call to signal for the specified signal sig. Otherwise, a value of
+ SIG_ERR is returned and a positive value is stored in errno.
+<p><b> Forward references</b>: the abort function (<a href="#7.20.4.1">7.20.4.1</a>), the exit function (<a href="#7.20.4.3">7.20.4.3</a>), the
+ _Exit function (<a href="#7.20.4.4">7.20.4.4</a>).
+
+<p><b>Footnotes</b>
+<p><small><a name="note220" href="#note220">220)</a> If any signal is generated by an asynchronous signal handler, the behavior is undefined.
+</small>
+
+<h4><a name="7.14.2" href="#7.14.2">7.14.2 Send signal</a></h4>
+
+<h5><a name="7.14.2.1" href="#7.14.2.1">7.14.2.1 The raise function</a></h5>
+<p><b>Synopsis</b>
+<p><!--para 1 -->
+<pre>
+        #include <a href="#7.14">&lt;signal.h&gt;</a>
+        int raise(int sig);
+</pre>
+<p><b>Description</b>
+<p><!--para 2 -->
+ The raise function carries out the actions described in <a href="#7.14.1.1">7.14.1.1</a> for the signal sig. If a
+ signal handler is called, the raise function shall not return until after the signal handler
+ does.
+<p><b>Returns</b>
+<p><!--para 3 -->
+ The raise function returns zero if successful, nonzero if unsuccessful.
+<!--page 261 -->
+
+<h3><a name="7.15" href="#7.15">7.15 Variable arguments &lt;stdarg.h&gt;</a></h3>
+<p><!--para 1 -->
+ The header <a href="#7.15">&lt;stdarg.h&gt;</a> declares a type and defines four macros, for advancing
+ through a list of arguments whose number and types are not known to the called function
+ when it is translated.
+<p><!--para 2 -->
+ A function may be called with a variable number of arguments of varying types. As
+ described in <a href="#6.9.1">6.9.1</a>, its parameter list contains one or more parameters. The rightmost
+ parameter plays a special role in the access mechanism, and will be designated parmN in
+ this description.
+<p><!--para 3 -->
+ The type declared is
+<pre>
+         va_list
+</pre>
+ which is an object type suitable for holding information needed by the macros
+ va_start, va_arg, va_end, and va_copy. If access to the varying arguments is
+ desired, the called function shall declare an object (generally referred to as ap in this
+ subclause) having type va_list. The object ap may be passed as an argument to
+ another function; if that function invokes the va_arg macro with parameter ap, the
+ value of ap in the calling function is indeterminate and shall be passed to the va_end
+ macro prior to any further reference to ap.<sup><a href="#note221"><b>221)</b></a></sup>
+
+<p><b>Footnotes</b>
+<p><small><a name="note221" href="#note221">221)</a> It is permitted to create a pointer to a va_list and pass that pointer to another function, in which
+ case the original function may make further use of the original list after the other function returns.
+</small>
+
+<h4><a name="7.15.1" href="#7.15.1">7.15.1 Variable argument list access macros</a></h4>
+<p><!--para 1 -->
+ The va_start and va_arg macros described in this subclause shall be implemented
+ as macros, not functions. It is unspecified whether va_copy and va_end are macros or
+ identifiers declared with external linkage. If a macro definition is suppressed in order to
+ access an actual function, or a program defines an external identifier with the same name,
+ the behavior is undefined. Each invocation of the va_start and va_copy macros
+ shall be matched by a corresponding invocation of the va_end macro in the same
+ function.
+
+<h5><a name="7.15.1.1" href="#7.15.1.1">7.15.1.1 The va_arg macro</a></h5>
+<p><b>Synopsis</b>
+<p><!--para 1 -->
+<pre>
+         #include <a href="#7.15">&lt;stdarg.h&gt;</a>
+         type va_arg(va_list ap, type);
+</pre>
+<p><b>Description</b>
+<p><!--para 2 -->
+ The va_arg macro expands to an expression that has the specified type and the value of
+ the next argument in the call. The parameter ap shall have been initialized by the
+ va_start or va_copy macro (without an intervening invocation of the va_end
+<!--page 262 -->
+ macro for the same ap). Each invocation of the va_arg macro modifies ap so that the
+ values of successive arguments are returned in turn. The parameter type shall be a type
+ name specified such that the type of a pointer to an object that has the specified type can
+ be obtained simply by postfixing a * to type. If there is no actual next argument, or if
+ type is not compatible with the type of the actual next argument (as promoted according
+ to the default argument promotions), the behavior is undefined, except for the following
+ cases:
+<ul>
+<li>  one type is a signed integer type, the other type is the corresponding unsigned integer
+ type, and the value is representable in both types;
+<li>  one type is pointer to void and the other is a pointer to a character type.
+</ul>
+<p><b>Returns</b>
+<p><!--para 3 -->
+ The first invocation of the va_arg macro after that of the va_start macro returns the
+ value of the argument after that specified by parmN . Successive invocations return the
+ values of the remaining arguments in succession.
+
+<h5><a name="7.15.1.2" href="#7.15.1.2">7.15.1.2 The va_copy macro</a></h5>
+<p><b>Synopsis</b>
+<p><!--para 1 -->
+<pre>
+        #include <a href="#7.15">&lt;stdarg.h&gt;</a>
+        void va_copy(va_list dest, va_list src);
+</pre>
+<p><b>Description</b>
+<p><!--para 2 -->
+ The va_copy macro initializes dest as a copy of src, as if the va_start macro had
+ been applied to dest followed by the same sequence of uses of the va_arg macro as
+ had previously been used to reach the present state of src. Neither the va_copy nor
+ va_start macro shall be invoked to reinitialize dest without an intervening
+ invocation of the va_end macro for the same dest.
+<p><b>Returns</b>
+<p><!--para 3 -->
+ The va_copy macro returns no value.
+
+<h5><a name="7.15.1.3" href="#7.15.1.3">7.15.1.3 The va_end macro</a></h5>
+<p><b>Synopsis</b>
+<p><!--para 1 -->
+<pre>
+        #include <a href="#7.15">&lt;stdarg.h&gt;</a>
+        void va_end(va_list ap);
+</pre>
+<p><b>Description</b>
+<p><!--para 2 -->
+ The va_end macro facilitates a normal return from the function whose variable
+ argument list was referred to by the expansion of the va_start macro, or the function
+ containing the expansion of the va_copy macro, that initialized the va_list ap. The
+ va_end macro may modify ap so that it is no longer usable (without being reinitialized
+<!--page 263 -->
+ by the va_start or va_copy macro). If there is no corresponding invocation of the
+ va_start or va_copy macro, or if the va_end macro is not invoked before the
+ return, the behavior is undefined.
+<p><b>Returns</b>
+<p><!--para 3 -->
+ The va_end macro returns no value.
+
+<h5><a name="7.15.1.4" href="#7.15.1.4">7.15.1.4 The va_start macro</a></h5>
+<p><b>Synopsis</b>
+<p><!--para 1 -->
+<pre>
+         #include <a href="#7.15">&lt;stdarg.h&gt;</a>
+         void va_start(va_list ap, parmN);
+</pre>
+<p><b>Description</b>
+<p><!--para 2 -->
+ The va_start macro shall be invoked before any access to the unnamed arguments.
+<p><!--para 3 -->
+ The va_start macro initializes ap for subsequent use by the va_arg and va_end
+ macros. Neither the va_start nor va_copy macro shall be invoked to reinitialize ap
+ without an intervening invocation of the va_end macro for the same ap.
+<p><!--para 4 -->
+ The parameter parmN is the identifier of the rightmost parameter in the variable
+ parameter list in the function definition (the one just before the , ...). If the parameter
+ parmN is declared with the register storage class, with a function or array type, or
+ with a type that is not compatible with the type that results after application of the default
+ argument promotions, the behavior is undefined.
+<p><b>Returns</b>
+<p><!--para 5 -->
+ The va_start macro returns no value.
+<p><!--para 6 -->
+ EXAMPLE 1 The function f1 gathers into an array a list of arguments that are pointers to strings (but not
+ more than MAXARGS arguments), then passes the array as a single argument to function f2. The number of
+ pointers is specified by the first argument to f1.
+<!--page 264 -->
+<pre>
+         #include <a href="#7.15">&lt;stdarg.h&gt;</a>
+         #define MAXARGS   31
+         void f1(int n_ptrs, ...)
+         {
+               va_list ap;
+               char *array[MAXARGS];
+               int ptr_no = 0;
+               if (n_ptrs &gt; MAXARGS)
+                     n_ptrs = MAXARGS;
+               va_start(ap, n_ptrs);
+               while (ptr_no &lt; n_ptrs)
+                     array[ptr_no++] = va_arg(ap, char *);
+               va_end(ap);
+               f2(n_ptrs, array);
+          }
+</pre>
+ Each call to f1 is required to have visible the definition of the function or a declaration such as
+<pre>
+          void f1(int, ...);
+</pre>
+<p><!--para 7 -->
+ EXAMPLE 2 The function f3 is similar, but saves the status of the variable argument list after the
+ indicated number of arguments; after f2 has been called once with the whole list, the trailing part of the list
+ is gathered again and passed to function f4.
+<!--page 265 -->
+<pre>
+          #include <a href="#7.15">&lt;stdarg.h&gt;</a>
+          #define MAXARGS 31
+          void f3(int n_ptrs, int f4_after, ...)
+          {
+                va_list ap, ap_save;
+                char *array[MAXARGS];
+                int ptr_no = 0;
+                if (n_ptrs &gt; MAXARGS)
+                      n_ptrs = MAXARGS;
+                va_start(ap, f4_after);
+                while (ptr_no &lt; n_ptrs) {
+                      array[ptr_no++] = va_arg(ap, char *);
+                      if (ptr_no == f4_after)
+                            va_copy(ap_save, ap);
+                }
+                va_end(ap);
+                f2(n_ptrs, array);
+                   // Now process the saved copy.
+                   n_ptrs -= f4_after;
+                   ptr_no = 0;
+                   while (ptr_no &lt; n_ptrs)
+                         array[ptr_no++] = va_arg(ap_save, char *);
+                   va_end(ap_save);
+                   f4(n_ptrs, array);
+          }
+</pre>
+
+<h3><a name="7.16" href="#7.16">7.16 Boolean type and values &lt;stdbool.h&gt;</a></h3>
+<p><!--para 1 -->
+ The header <a href="#7.16">&lt;stdbool.h&gt;</a> defines four macros.
+<p><!--para 2 -->
+ The macro
+<pre>
+          bool
+</pre>
+ expands to _Bool.
+<p><!--para 3 -->
+ The remaining three macros are suitable for use in #if preprocessing directives. They
+ are
+<pre>
+          true
+</pre>
+ which expands to the integer constant 1,
+<pre>
+          false
+</pre>
+ which expands to the integer constant 0, and
+<pre>
+          __bool_true_false_are_defined
+</pre>
+ which expands to the integer constant 1.
+<p><!--para 4 -->
+ Notwithstanding the provisions of <a href="#7.1.3">7.1.3</a>, a program may undefine and perhaps then
+ redefine the macros bool, true, and false.<sup><a href="#note222"><b>222)</b></a></sup>
+<!--page 266 -->
+
+<p><b>Footnotes</b>
+<p><small><a name="note222" href="#note222">222)</a> See ''future library directions'' (<a href="#7.26.7">7.26.7</a>).
+</small>
+
+<h3><a name="7.17" href="#7.17">7.17 Common definitions &lt;stddef.h&gt;</a></h3>
+<p><!--para 1 -->
+ The following types and macros are defined in the standard header <a href="#7.17">&lt;stddef.h&gt;</a>. Some
+ are also defined in other headers, as noted in their respective subclauses.
+<p><!--para 2 -->
+ The types are
+<pre>
+        ptrdiff_t
+</pre>
+ which is the signed integer type of the result of subtracting two pointers;
+<pre>
+        size_t
+</pre>
+ which is the unsigned integer type of the result of the sizeof operator; and
+<pre>
+        wchar_t
+</pre>
+ which is an integer type whose range of values can represent distinct codes for all
+ members of the largest extended character set specified among the supported locales; the
+ null character shall have the code value zero. Each member of the basic character set
+ shall have a code value equal to its value when used as the lone character in an integer
+ character      constant     if     an      implementation      does      not      define
+ __STDC_MB_MIGHT_NEQ_WC__.
+<p><!--para 3 -->
+ The macros are
+<pre>
+        NULL
+</pre>
+ which expands to an implementation-defined null pointer constant; and
+<pre>
         offsetof(type, member-designator)
-<a name="B.17" href="#B.17"><b>B.17 Integer types &lt;stdint.h&gt;</b></a>
-        intN_t                INT_LEASTN_MIN          PTRDIFF_MAX
-        uintN_t               INT_LEASTN_MAX          SIG_ATOMIC_MIN
-        int_leastN_t          UINT_LEASTN_MAX         SIG_ATOMIC_MAX
-        uint_leastN_t         INT_FASTN_MIN           SIZE_MAX
-        int_fastN_t           INT_FASTN_MAX           WCHAR_MIN
-        uint_fastN_t          UINT_FASTN_MAX          WCHAR_MAX
-        intptr_t              INTPTR_MIN              WINT_MIN
-        uintptr_t             INTPTR_MAX              WINT_MAX
-        intmax_t              UINTPTR_MAX             INTN_C(value)
-        uintmax_t             INTMAX_MIN              UINTN_C(value)
-        INTN_MIN              INTMAX_MAX              INTMAX_C(value)
-        INTN_MAX              UINTMAX_MAX             UINTMAX_C(value)
-        UINTN_MAX             PTRDIFF_MIN
-<a name="B.18" href="#B.18"><b>B.18 Input/output &lt;stdio.h&gt;</b></a>
-        size_t          _IOLBF            FILENAME_MAX      TMP_MAX
-        FILE            _IONBF            L_tmpnam          stderr
-        fpos_t          BUFSIZ            SEEK_CUR          stdin
-        NULL            EOF               SEEK_END          stdout
-        _IOFBF          FOPEN_MAX         SEEK_SET
+</pre>
+ which expands to an integer constant expression that has type size_t, the value of
+ which is the offset in bytes, to the structure member (designated by member-designator),
+ from the beginning of its structure (designated by type). The type and member designator
+ shall be such that given
+<pre>
+        static type t;
+</pre>
+ then the expression &amp;(t.member-designator) evaluates to an address constant. (If the
+ specified member is a bit-field, the behavior is undefined.)
+<p><b>Recommended practice</b>
+<p><!--para 4 -->
+ The types used for size_t and ptrdiff_t should not have an integer conversion rank
+ greater than that of signed long int unless the implementation supports objects
+ large enough to make this necessary.
+<p><b> Forward references</b>: localization (<a href="#7.11">7.11</a>).
+<!--page 267 -->
+
+<h3><a name="7.18" href="#7.18">7.18 Integer types &lt;stdint.h&gt;</a></h3>
+<p><!--para 1 -->
+ The header <a href="#7.18">&lt;stdint.h&gt;</a> declares sets of integer types having specified widths, and
+ defines corresponding sets of macros.<sup><a href="#note223"><b>223)</b></a></sup> It also defines macros that specify limits of
+ integer types corresponding to types defined in other standard headers.
+<p><!--para 2 -->
+ Types are defined in the following categories:
+<ul>
+<li>  integer types having certain exact widths;
+<li>  integer types having at least certain specified widths;
+<li>  fastest integer types having at least certain specified widths;
+<li>  integer types wide enough to hold pointers to objects;
+<li>  integer types having greatest width.
+</ul>
+ (Some of these types may denote the same type.)
+<p><!--para 3 -->
+ Corresponding macros specify limits of the declared types and construct suitable
+ constants.
+<p><!--para 4 -->
+ For each type described herein that the implementation provides,<sup><a href="#note224"><b>224)</b></a></sup> <a href="#7.18">&lt;stdint.h&gt;</a> shall
+ declare that typedef name and define the associated macros. Conversely, for each type
+ described herein that the implementation does not provide, <a href="#7.18">&lt;stdint.h&gt;</a> shall not
+ declare that typedef name nor shall it define the associated macros. An implementation
+ shall provide those types described as ''required'', but need not provide any of the others
+ (described as ''optional'').
+
+<p><b>Footnotes</b>
+<p><small><a name="note223" href="#note223">223)</a> See ''future library directions'' (<a href="#7.26.8">7.26.8</a>).
+</small>
+<p><small><a name="note224" href="#note224">224)</a> Some of these types may denote implementation-defined extended integer types.
+</small>
+
+<h4><a name="7.18.1" href="#7.18.1">7.18.1 Integer types</a></h4>
+<p><!--para 1 -->
+ When typedef names differing only in the absence or presence of the initial u are defined,
+ they shall denote corresponding signed and unsigned types as described in <a href="#6.2.5">6.2.5</a>; an
+ implementation providing one of these corresponding types shall also provide the other.
+<p><!--para 2 -->
+ In the following descriptions, the symbol N represents an unsigned decimal integer with
+ no leading zeros (e.g., 8 or 24, but not 04 or 048).
+<!--page 268 -->
+
+<h5><a name="7.18.1.1" href="#7.18.1.1">7.18.1.1 Exact-width integer types</a></h5>
+<p><!--para 1 -->
+ The typedef name intN_t designates a signed integer type with width N , no padding
+ bits, and a two's complement representation. Thus, int8_t denotes a signed integer
+ type with a width of exactly 8 bits.
+<p><!--para 2 -->
+ The typedef name uintN_t designates an unsigned integer type with width N . Thus,
+ uint24_t denotes an unsigned integer type with a width of exactly 24 bits.
+<p><!--para 3 -->
+ These types are optional. However, if an implementation provides integer types with
+ widths of 8, 16, 32, or 64 bits, no padding bits, and (for the signed types) that have a
+ two's complement representation, it shall define the corresponding typedef names.
+
+<h5><a name="7.18.1.2" href="#7.18.1.2">7.18.1.2 Minimum-width integer types</a></h5>
+<p><!--para 1 -->
+ The typedef name int_leastN_t designates a signed integer type with a width of at
+ least N , such that no signed integer type with lesser size has at least the specified width.
+ Thus, int_least32_t denotes a signed integer type with a width of at least 32 bits.
+<p><!--para 2 -->
+ The typedef name uint_leastN_t designates an unsigned integer type with a width
+ of at least N , such that no unsigned integer type with lesser size has at least the specified
+ width. Thus, uint_least16_t denotes an unsigned integer type with a width of at
+ least 16 bits.
+<p><!--para 3 -->
+ The following types are required:
+<pre>
+          int_least8_t                                      uint_least8_t
+          int_least16_t                                     uint_least16_t
+          int_least32_t                                     uint_least32_t
+          int_least64_t                                     uint_least64_t
+</pre>
+ All other types of this form are optional.
+
+<h5><a name="7.18.1.3" href="#7.18.1.3">7.18.1.3 Fastest minimum-width integer types</a></h5>
+<p><!--para 1 -->
+ Each of the following types designates an integer type that is usually fastest<sup><a href="#note225"><b>225)</b></a></sup> to operate
+ with among all integer types that have at least the specified width.
+<p><!--para 2 -->
+ The typedef name int_fastN_t designates the fastest signed integer type with a width
+ of at least N . The typedef name uint_fastN_t designates the fastest unsigned integer
+ type with a width of at least N .
+<!--page 269 -->
+<p><!--para 3 -->
+ The following types are required:
+<pre>
+        int_fast8_t                                 uint_fast8_t
+        int_fast16_t                                uint_fast16_t
+        int_fast32_t                                uint_fast32_t
+        int_fast64_t                                uint_fast64_t
+</pre>
+ All other types of this form are optional.
+
+<p><b>Footnotes</b>
+<p><small><a name="note225" href="#note225">225)</a> The designated type is not guaranteed to be fastest for all purposes; if the implementation has no clear
+ grounds for choosing one type over another, it will simply pick some integer type satisfying the
+ signedness and width requirements.
+</small>
+
+<h5><a name="7.18.1.4" href="#7.18.1.4">7.18.1.4 Integer types capable of holding object pointers</a></h5>
+<p><!--para 1 -->
+ The following type designates a signed integer type with the property that any valid
+ pointer to void can be converted to this type, then converted back to pointer to void,
+ and the result will compare equal to the original pointer:
+<pre>
+        intptr_t
+</pre>
+ The following type designates an unsigned integer type with the property that any valid
+ pointer to void can be converted to this type, then converted back to pointer to void,
+ and the result will compare equal to the original pointer:
+<pre>
+        uintptr_t
+</pre>
+ These types are optional.
+
+<h5><a name="7.18.1.5" href="#7.18.1.5">7.18.1.5 Greatest-width integer types</a></h5>
+<p><!--para 1 -->
+ The following type designates a signed integer type capable of representing any value of
+ any signed integer type:
+<pre>
+        intmax_t
+</pre>
+ The following type designates an unsigned integer type capable of representing any value
+ of any unsigned integer type:
+<pre>
+        uintmax_t
+</pre>
+ These types are required.
+
+<h4><a name="7.18.2" href="#7.18.2">7.18.2 Limits of specified-width integer types</a></h4>
+<p><!--para 1 -->
+ The following object-like macros<sup><a href="#note226"><b>226)</b></a></sup> specify the minimum and maximum limits of the
+ types declared in <a href="#7.18">&lt;stdint.h&gt;</a>. Each macro name corresponds to a similar type name in
+ <a href="#7.18.1">7.18.1</a>.
+<p><!--para 2 -->
+ Each instance of any defined macro shall be replaced by a constant expression suitable
+ for use in #if preprocessing directives, and this expression shall have the same type as
+ would an expression that is an object of the corresponding type converted according to
+<!--page 270 -->
+ the integer promotions. Its implementation-defined value shall be equal to or greater in
+ magnitude (absolute value) than the corresponding value given below, with the same sign,
+ except where stated to be exactly the given value.
+
+<p><b>Footnotes</b>
+<p><small><a name="note226" href="#note226">226)</a> C++ implementations should define these macros only when __STDC_LIMIT_MACROS is defined
+ before <a href="#7.18">&lt;stdint.h&gt;</a> is included.
+</small>
+
+<h5><a name="7.18.2.1" href="#7.18.2.1">7.18.2.1 Limits of exact-width integer types</a></h5>
+<p><!--para 1 -->
+<ul>
+<li>  minimum values of exact-width signed integer types
+<pre>
+  INTN_MIN                                    exactly -(2<sup>N-1</sup>)
+</pre>
+<li>  maximum values of exact-width signed integer types
+<pre>
+  INTN_MAX                                    exactly 2<sup>N-1</sup> - 1
+</pre>
+<li>  maximum values of exact-width unsigned integer types
+<pre>
+  UINTN_MAX                                   exactly 2<sup>N</sup> - 1
+</pre>
+</ul>
+
+<h5><a name="7.18.2.2" href="#7.18.2.2">7.18.2.2 Limits of minimum-width integer types</a></h5>
+<p><!--para 1 -->
+<ul>
+<li>  minimum values of minimum-width signed integer types
+<pre>
+  INT_LEASTN_MIN                                      -(2<sup>N-1</sup> - 1)
+</pre>
+<li>  maximum values of minimum-width signed integer types
+<pre>
+  INT_LEASTN_MAX                                      2<sup>N-1</sup> - 1
+</pre>
+<li>  maximum values of minimum-width unsigned integer types
+<pre>
+  UINT_LEASTN_MAX                                     2<sup>N</sup> - 1
+</pre>
+</ul>
+
+<h5><a name="7.18.2.3" href="#7.18.2.3">7.18.2.3 Limits of fastest minimum-width integer types</a></h5>
+<p><!--para 1 -->
+<ul>
+<li>  minimum values of fastest minimum-width signed integer types
+<pre>
+  INT_FASTN_MIN                                       -(2<sup>N-1</sup> - 1)
+</pre>
+<li>  maximum values of fastest minimum-width signed integer types
+<pre>
+  INT_FASTN_MAX                                       2<sup>N-1</sup> - 1
+</pre>
+<li>  maximum values of fastest minimum-width unsigned integer types
+<pre>
+  UINT_FASTN_MAX                                      2<sup>N</sup> - 1
+</pre>
+</ul>
+
+<h5><a name="7.18.2.4" href="#7.18.2.4">7.18.2.4 Limits of integer types capable of holding object pointers</a></h5>
+<p><!--para 1 -->
+<ul>
+<li>  minimum value of pointer-holding signed integer type
+<pre>
+   INTPTR_MIN                                         -(2<sup>15</sup> - 1)
+</pre>
+<li>  maximum value of pointer-holding signed integer type
+<!--page 271 -->
+<pre>
+   INTPTR_MAX                                         2<sup>15</sup> - 1
+</pre>
+<li>  maximum value of pointer-holding unsigned integer type
+<pre>
+   UINTPTR_MAX                                        2<sup>16</sup> - 1
+</pre>
+</ul>
+
+<h5><a name="7.18.2.5" href="#7.18.2.5">7.18.2.5 Limits of greatest-width integer types</a></h5>
+<p><!--para 1 -->
+<ul>
+<li>  minimum value of greatest-width signed integer type
+<pre>
+   INTMAX_MIN                                         -(2<sup>63</sup> - 1)
+</pre>
+<li>  maximum value of greatest-width signed integer type
+<pre>
+   INTMAX_MAX                                         2<sup>63</sup> - 1
+</pre>
+<li>  maximum value of greatest-width unsigned integer type
+<pre>
+   UINTMAX_MAX                                        2<sup>64</sup> - 1
+</pre>
+</ul>
+
+<h4><a name="7.18.3" href="#7.18.3">7.18.3 Limits of other integer types</a></h4>
+<p><!--para 1 -->
+ The following object-like macros<sup><a href="#note227"><b>227)</b></a></sup> specify the minimum and maximum limits of
+ integer types corresponding to types defined in other standard headers.
+<p><!--para 2 -->
+ Each instance of these macros shall be replaced by a constant expression suitable for use
+ in #if preprocessing directives, and this expression shall have the same type as would an
+ expression that is an object of the corresponding type converted according to the integer
+ promotions. Its implementation-defined value shall be equal to or greater in magnitude
+ (absolute value) than the corresponding value given below, with the same sign. An
+ implementation shall define only the macros corresponding to those typedef names it
+ actually provides.<sup><a href="#note228"><b>228)</b></a></sup>
+<ul>
+<li>  limits of ptrdiff_t
+<pre>
+   PTRDIFF_MIN                                            -65535
+   PTRDIFF_MAX                                            +65535
+</pre>
+<li>  limits of sig_atomic_t
+<pre>
+   SIG_ATOMIC_MIN                                         see below
+   SIG_ATOMIC_MAX                                         see below
+</pre>
+<li>  limit of size_t
+<pre>
+   SIZE_MAX                                               65535
+</pre>
+<li>  limits of wchar_t
+<!--page 272 -->
+<pre>
+   WCHAR_MIN                                              see below
+   WCHAR_MAX                                              see below
+</pre>
+<li>  limits of wint_t
+<pre>
+   WINT_MIN                                               see below
+   WINT_MAX                                               see below
+</pre>
+</ul>
+<p><!--para 3 -->
+ If sig_atomic_t (see <a href="#7.14">7.14</a>) is defined as a signed integer type, the value of
+ SIG_ATOMIC_MIN shall be no greater than -127 and the value of SIG_ATOMIC_MAX
+ shall be no less than 127; otherwise, sig_atomic_t is defined as an unsigned integer
+ type, and the value of SIG_ATOMIC_MIN shall be 0 and the value of
+ SIG_ATOMIC_MAX shall be no less than 255.
+<p><!--para 4 -->
+ If wchar_t (see <a href="#7.17">7.17</a>) is defined as a signed integer type, the value of WCHAR_MIN
+ shall be no greater than -127 and the value of WCHAR_MAX shall be no less than 127;
+ otherwise, wchar_t is defined as an unsigned integer type, and the value of
+ WCHAR_MIN shall be 0 and the value of WCHAR_MAX shall be no less than 255.<sup><a href="#note229"><b>229)</b></a></sup>
+<p><!--para 5 -->
+ If wint_t (see <a href="#7.24">7.24</a>) is defined as a signed integer type, the value of WINT_MIN shall
+ be no greater than -32767 and the value of WINT_MAX shall be no less than 32767;
+ otherwise, wint_t is defined as an unsigned integer type, and the value of WINT_MIN
+ shall be 0 and the value of WINT_MAX shall be no less than 65535.
+
+<p><b>Footnotes</b>
+<p><small><a name="note227" href="#note227">227)</a> C++ implementations should define these macros only when __STDC_LIMIT_MACROS is defined
+ before <a href="#7.18">&lt;stdint.h&gt;</a> is included.
+</small>
+<p><small><a name="note228" href="#note228">228)</a> A freestanding implementation need not provide all of these types.
+</small>
+<p><small><a name="note229" href="#note229">229)</a> The values WCHAR_MIN and WCHAR_MAX do not necessarily correspond to members of the extended
+ character set.
+</small>
+
+<h4><a name="7.18.4" href="#7.18.4">7.18.4 Macros for integer constants</a></h4>
+<p><!--para 1 -->
+ The following function-like macros<sup><a href="#note230"><b>230)</b></a></sup> expand to integer constants suitable for
+ initializing objects that have integer types corresponding to types defined in
+ <a href="#7.18">&lt;stdint.h&gt;</a>. Each macro name corresponds to a similar type name in <a href="#7.18.1.2">7.18.1.2</a> or
+ <a href="#7.18.1.5">7.18.1.5</a>.
+<p><!--para 2 -->
+ The argument in any instance of these macros shall be an unsuffixed integer constant (as
+ defined in <a href="#6.4.4.1">6.4.4.1</a>) with a value that does not exceed the limits for the corresponding type.
+<p><!--para 3 -->
+ Each invocation of one of these macros shall expand to an integer constant expression
+ suitable for use in #if preprocessing directives. The type of the expression shall have
+ the same type as would an expression of the corresponding type converted according to
+ the integer promotions. The value of the expression shall be that of the argument.
+<!--page 273 -->
+
+<p><b>Footnotes</b>
+<p><small><a name="note230" href="#note230">230)</a> C++ implementations should define these macros only when __STDC_CONSTANT_MACROS is
+ defined before <a href="#7.18">&lt;stdint.h&gt;</a> is included.
+</small>
+
+<h5><a name="7.18.4.1" href="#7.18.4.1">7.18.4.1 Macros for minimum-width integer constants</a></h5>
+<p><!--para 1 -->
+ The macro INTN_C(value) shall expand to an integer constant expression
+ corresponding to the type int_leastN_t. The macro UINTN_C(value) shall expand
+ to an integer constant expression corresponding to the type uint_leastN_t. For
+ example, if uint_least64_t is a name for the type unsigned long long int,
+ then UINT64_C(0x123) might expand to the integer constant 0x123ULL.
+
+<h5><a name="7.18.4.2" href="#7.18.4.2">7.18.4.2 Macros for greatest-width integer constants</a></h5>
+<p><!--para 1 -->
+ The following macro expands to an integer constant expression having the value specified
+ by its argument and the type intmax_t:
+<pre>
+        INTMAX_C(value)
+</pre>
+ The following macro expands to an integer constant expression having the value specified
+ by its argument and the type uintmax_t:
+<!--page 274 -->
+<pre>
+        UINTMAX_C(value)
+</pre>
+
+<h3><a name="7.19" href="#7.19">7.19 Input/output &lt;stdio.h&gt;</a></h3>
+
+<h4><a name="7.19.1" href="#7.19.1">7.19.1 Introduction</a></h4>
+<p><!--para 1 -->
+ The header <a href="#7.19">&lt;stdio.h&gt;</a> declares three types, several macros, and many functions for
+ performing input and output.
+<p><!--para 2 -->
+ The types declared are size_t (described in <a href="#7.17">7.17</a>);
+<pre>
+        FILE
+</pre>
+ which is an object type capable of recording all the information needed to control a
+ stream, including its file position indicator, a pointer to its associated buffer (if any), an
+ error indicator that records whether a read/write error has occurred, and an end-of-file
+ indicator that records whether the end of the file has been reached; and
+<pre>
+        fpos_t
+</pre>
+ which is an object type other than an array type capable of recording all the information
+ needed to specify uniquely every position within a file.
+<p><!--para 3 -->
+ The macros are NULL (described in <a href="#7.17">7.17</a>);
+<pre>
+        _IOFBF
+        _IOLBF
+        _IONBF
+</pre>
+ which expand to integer constant expressions with distinct values, suitable for use as the
+ third argument to the setvbuf function;
+<pre>
+        BUFSIZ
+</pre>
+ which expands to an integer constant expression that is the size of the buffer used by the
+ setbuf function;
+<pre>
+        EOF
+</pre>
+ which expands to an integer constant expression, with type int and a negative value, that
+ is returned by several functions to indicate end-of-file, that is, no more input from a
+ stream;
+<pre>
+        FOPEN_MAX
+</pre>
+ which expands to an integer constant expression that is the minimum number of files that
+ the implementation guarantees can be open simultaneously;
+<pre>
+        FILENAME_MAX
+</pre>
+ which expands to an integer constant expression that is the size needed for an array of
+ char large enough to hold the longest file name string that the implementation
+<!--page 275 -->
+ guarantees can be opened;<sup><a href="#note231"><b>231)</b></a></sup>
+<pre>
+         L_tmpnam
+</pre>
+ which expands to an integer constant expression that is the size needed for an array of
+ char large enough to hold a temporary file name string generated by the tmpnam
+ function;
+<pre>
+         SEEK_CUR
+         SEEK_END
+         SEEK_SET
+</pre>
+ which expand to integer constant expressions with distinct values, suitable for use as the
+ third argument to the fseek function;
+<pre>
+         TMP_MAX
+</pre>
+ which expands to an integer constant expression that is the maximum number of unique
+ file names that can be generated by the tmpnam function;
+<pre>
+         stderr
+         stdin
+         stdout
+</pre>
+ which are expressions of type ''pointer to FILE'' that point to the FILE objects
+ associated, respectively, with the standard error, input, and output streams.
+<p><!--para 4 -->
+ The header <a href="#7.24">&lt;wchar.h&gt;</a> declares a number of functions useful for wide character input
+ and output. The wide character input/output functions described in that subclause
+ provide operations analogous to most of those described here, except that the
+ fundamental units internal to the program are wide characters. The external
+ representation (in the file) is a sequence of ''generalized'' multibyte characters, as
+ described further in <a href="#7.19.3">7.19.3</a>.
+<p><!--para 5 -->
+ The input/output functions are given the following collective terms:
+<ul>
+<li>  The wide character input functions -- those functions described in <a href="#7.24">7.24</a> that perform
+ input into wide characters and wide strings: fgetwc, fgetws, getwc, getwchar,
+ fwscanf, wscanf, vfwscanf, and vwscanf.
+<li>  The wide character output functions -- those functions described in <a href="#7.24">7.24</a> that perform
+ output from wide characters and wide strings: fputwc, fputws, putwc,
+ putwchar, fwprintf, wprintf, vfwprintf, and vwprintf.
+<!--page 276 -->
+<li>  The wide character input/output functions -- the union of the ungetwc function, the
+ wide character input functions, and the wide character output functions.
+<li>  The byte input/output functions -- those functions described in this subclause that
+ perform input/output: fgetc, fgets, fprintf, fputc, fputs, fread,
+ fscanf, fwrite, getc, getchar, gets, printf, putc, putchar, puts,
+ scanf, ungetc, vfprintf, vfscanf, vprintf, and vscanf.
+</ul>
+<p><b> Forward references</b>: files (<a href="#7.19.3">7.19.3</a>), the fseek function (<a href="#7.19.9.2">7.19.9.2</a>), streams (<a href="#7.19.2">7.19.2</a>), the
+ tmpnam function (<a href="#7.19.4.4">7.19.4.4</a>), <a href="#7.24">&lt;wchar.h&gt;</a> (<a href="#7.24">7.24</a>).
+
+<p><b>Footnotes</b>
+<p><small><a name="note231" href="#note231">231)</a> If the implementation imposes no practical limit on the length of file name strings, the value of
+ FILENAME_MAX should instead be the recommended size of an array intended to hold a file name
+ string. Of course, file name string contents are subject to other system-specific constraints; therefore
+ all possible strings of length FILENAME_MAX cannot be expected to be opened successfully.
+</small>
+
+<h4><a name="7.19.2" href="#7.19.2">7.19.2 Streams</a></h4>
+<p><!--para 1 -->
+ Input and output, whether to or from physical devices such as terminals and tape drives,
+ or whether to or from files supported on structured storage devices, are mapped into
+ logical data streams, whose properties are more uniform than their various inputs and
+ outputs. Two forms of mapping are supported, for text streams and for binary
+ streams.<sup><a href="#note232"><b>232)</b></a></sup>
+<p><!--para 2 -->
+ A text stream is an ordered sequence of characters composed into lines, each line
+ consisting of zero or more characters plus a terminating new-line character. Whether the
+ last line requires a terminating new-line character is implementation-defined. Characters
+ may have to be added, altered, or deleted on input and output to conform to differing
+ conventions for representing text in the host environment. Thus, there need not be a one-
+ to-one correspondence between the characters in a stream and those in the external
+ representation. Data read in from a text stream will necessarily compare equal to the data
+ that were earlier written out to that stream only if: the data consist only of printing
+ characters and the control characters horizontal tab and new-line; no new-line character is
+ immediately preceded by space characters; and the last character is a new-line character.
+ Whether space characters that are written out immediately before a new-line character
+ appear when read in is implementation-defined.
+<p><!--para 3 -->
+ A binary stream is an ordered sequence of characters that can transparently record
+ internal data. Data read in from a binary stream shall compare equal to the data that were
+ earlier written out to that stream, under the same implementation. Such a stream may,
+ however, have an implementation-defined number of null characters appended to the end
+ of the stream.
+<p><!--para 4 -->
+ Each stream has an orientation. After a stream is associated with an external file, but
+ before any operations are performed on it, the stream is without orientation. Once a wide
+ character input/output function has been applied to a stream without orientation, the
+<!--page 277 -->
+ stream becomes a wide-oriented stream. Similarly, once a byte input/output function has
+ been applied to a stream without orientation, the stream becomes a byte-oriented stream.
+ Only a call to the freopen function or the fwide function can otherwise alter the
+ orientation of a stream. (A successful call to freopen removes any orientation.)<sup><a href="#note233"><b>233)</b></a></sup>
+<p><!--para 5 -->
+ Byte input/output functions shall not be applied to a wide-oriented stream and wide
+ character input/output functions shall not be applied to a byte-oriented stream. The
+ remaining stream operations do not affect, and are not affected by, a stream's orientation,
+ except for the following additional restrictions:
+<ul>
+<li>  Binary wide-oriented streams have the file-positioning restrictions ascribed to both
+ text and binary streams.
+<li>  For wide-oriented streams, after a successful call to a file-positioning function that
+ leaves the file position indicator prior to the end-of-file, a wide character output
+ function can overwrite a partial multibyte character; any file contents beyond the
+ byte(s) written are henceforth indeterminate.
+</ul>
+<p><!--para 6 -->
+ Each wide-oriented stream has an associated mbstate_t object that stores the current
+ parse state of the stream. A successful call to fgetpos stores a representation of the
+ value of this mbstate_t object as part of the value of the fpos_t object. A later
+ successful call to fsetpos using the same stored fpos_t value restores the value of
+ the associated mbstate_t object as well as the position within the controlled stream.
+<p><b>Environmental limits</b>
+<p><!--para 7 -->
+ An implementation shall support text files with lines containing at least 254 characters,
+ including the terminating new-line character. The value of the macro BUFSIZ shall be at
+ least 256.
+<p><b> Forward references</b>: the freopen function (<a href="#7.19.5.4">7.19.5.4</a>), the fwide function (<a href="#7.24.3.5">7.24.3.5</a>),
+ mbstate_t (<a href="#7.25.1">7.25.1</a>), the fgetpos function (<a href="#7.19.9.1">7.19.9.1</a>), the fsetpos function
+ (<a href="#7.19.9.3">7.19.9.3</a>).
+<!--page 278 -->
+
+<p><b>Footnotes</b>
+<p><small><a name="note232" href="#note232">232)</a> An implementation need not distinguish between text streams and binary streams. In such an
+ implementation, there need be no new-line characters in a text stream nor any limit to the length of a
+ line.
+</small>
+<p><small><a name="note233" href="#note233">233)</a> The three predefined streams stdin, stdout, and stderr are unoriented at program startup.
+</small>
+
+<h4><a name="7.19.3" href="#7.19.3">7.19.3 Files</a></h4>
+<p><!--para 1 -->
+ A stream is associated with an external file (which may be a physical device) by opening
+ a file, which may involve creating a new file. Creating an existing file causes its former
+ contents to be discarded, if necessary. If a file can support positioning requests (such as a
+ disk file, as opposed to a terminal), then a file position indicator associated with the
+ stream is positioned at the start (character number zero) of the file, unless the file is
+ opened with append mode in which case it is implementation-defined whether the file
+ position indicator is initially positioned at the beginning or the end of the file. The file
+ position indicator is maintained by subsequent reads, writes, and positioning requests, to
+ facilitate an orderly progression through the file.
+<p><!--para 2 -->
+ Binary files are not truncated, except as defined in <a href="#7.19.5.3">7.19.5.3</a>. Whether a write on a text
+ stream causes the associated file to be truncated beyond that point is implementation-
+ defined.
+<p><!--para 3 -->
+ When a stream is unbuffered, characters are intended to appear from the source or at the
+ destination as soon as possible. Otherwise characters may be accumulated and
+ transmitted to or from the host environment as a block. When a stream is fully buffered,
+ characters are intended to be transmitted to or from the host environment as a block when
+ a buffer is filled. When a stream is line buffered, characters are intended to be
+ transmitted to or from the host environment as a block when a new-line character is
+ encountered. Furthermore, characters are intended to be transmitted as a block to the host
+ environment when a buffer is filled, when input is requested on an unbuffered stream, or
+ when input is requested on a line buffered stream that requires the transmission of
+ characters from the host environment. Support for these characteristics is
+ implementation-defined, and may be affected via the setbuf and setvbuf functions.
+<p><!--para 4 -->
+ A file may be disassociated from a controlling stream by closing the file. Output streams
+ are flushed (any unwritten buffer contents are transmitted to the host environment) before
+ the stream is disassociated from the file. The value of a pointer to a FILE object is
+ indeterminate after the associated file is closed (including the standard text streams).
+ Whether a file of zero length (on which no characters have been written by an output
+ stream) actually exists is implementation-defined.
+<p><!--para 5 -->
+ The file may be subsequently reopened, by the same or another program execution, and
+ its contents reclaimed or modified (if it can be repositioned at its start). If the main
+ function returns to its original caller, or if the exit function is called, all open files are
+ closed (hence all output streams are flushed) before program termination. Other paths to
+ program termination, such as calling the abort function, need not close all files
+ properly.
+<p><!--para 6 -->
+ The address of the FILE object used to control a stream may be significant; a copy of a
+ FILE object need not serve in place of the original.
+<!--page 279 -->
+<p><!--para 7 -->
+ At program startup, three text streams are predefined and need not be opened explicitly
+ -- standard input (for reading conventional input), standard output (for writing
+ conventional output), and standard error (for writing diagnostic output). As initially
+ opened, the standard error stream is not fully buffered; the standard input and standard
+ output streams are fully buffered if and only if the stream can be determined not to refer
+ to an interactive device.
+<p><!--para 8 -->
+ Functions that open additional (nontemporary) files require a file name, which is a string.
+ The rules for composing valid file names are implementation-defined. Whether the same
+ file can be simultaneously open multiple times is also implementation-defined.
+<p><!--para 9 -->
+ Although both text and binary wide-oriented streams are conceptually sequences of wide
+ characters, the external file associated with a wide-oriented stream is a sequence of
+ multibyte characters, generalized as follows:
+<ul>
+<li>  Multibyte encodings within files may contain embedded null bytes (unlike multibyte
+ encodings valid for use internal to the program).
+<li>  A file need not begin nor end in the initial shift state.<sup><a href="#note234"><b>234)</b></a></sup>
+</ul>
+<p><!--para 10 -->
+ Moreover, the encodings used for multibyte characters may differ among files. Both the
+ nature and choice of such encodings are implementation-defined.
+<p><!--para 11 -->
+ The wide character input functions read multibyte characters from the stream and convert
+ them to wide characters as if they were read by successive calls to the fgetwc function.
+ Each conversion occurs as if by a call to the mbrtowc function, with the conversion state
+ described by the stream's own mbstate_t object. The byte input functions read
+ characters from the stream as if by successive calls to the fgetc function.
+<p><!--para 12 -->
+ The wide character output functions convert wide characters to multibyte characters and
+ write them to the stream as if they were written by successive calls to the fputwc
+ function. Each conversion occurs as if by a call to the wcrtomb function, with the
+ conversion state described by the stream's own mbstate_t object. The byte output
+ functions write characters to the stream as if by successive calls to the fputc function.
+<p><!--para 13 -->
+ In some cases, some of the byte input/output functions also perform conversions between
+ multibyte characters and wide characters. These conversions also occur as if by calls to
+ the mbrtowc and wcrtomb functions.
+<p><!--para 14 -->
+ An encoding error occurs if the character sequence presented to the underlying
+ mbrtowc function does not form a valid (generalized) multibyte character, or if the code
+ value passed to the underlying wcrtomb does not correspond to a valid (generalized)
+<!--page 280 -->
+ multibyte character. The wide character input/output functions and the byte input/output
+ functions store the value of the macro EILSEQ in errno if and only if an encoding error
+ occurs.
+<p><b>Environmental limits</b>
+<p><!--para 15 -->
+ The value of FOPEN_MAX shall be at least eight, including the three standard text
+ streams.
+<p><b> Forward references</b>: the exit function (<a href="#7.20.4.3">7.20.4.3</a>), the fgetc function (<a href="#7.19.7.1">7.19.7.1</a>), the
+ fopen function (<a href="#7.19.5.3">7.19.5.3</a>), the fputc function (<a href="#7.19.7.3">7.19.7.3</a>), the setbuf function
+ (<a href="#7.19.5.5">7.19.5.5</a>), the setvbuf function (<a href="#7.19.5.6">7.19.5.6</a>), the fgetwc function (<a href="#7.24.3.1">7.24.3.1</a>), the
+ fputwc function (<a href="#7.24.3.3">7.24.3.3</a>), conversion state (<a href="#7.24.6">7.24.6</a>), the mbrtowc function
+ (<a href="#7.24.6.3.2">7.24.6.3.2</a>), the wcrtomb function (<a href="#7.24.6.3.3">7.24.6.3.3</a>).
+
+<p><b>Footnotes</b>
+<p><small><a name="note234" href="#note234">234)</a> Setting the file position indicator to end-of-file, as with fseek(file, 0, SEEK_END), has
+ undefined behavior for a binary stream (because of possible trailing null characters) or for any stream
+ with state-dependent encoding that does not assuredly end in the initial shift state.
+</small>
+
+<h4><a name="7.19.4" href="#7.19.4">7.19.4 Operations on files</a></h4>
+
+<h5><a name="7.19.4.1" href="#7.19.4.1">7.19.4.1 The remove function</a></h5>
+<p><b>Synopsis</b>
+<p><!--para 1 -->
+<pre>
+        #include <a href="#7.19">&lt;stdio.h&gt;</a>
         int remove(const char *filename);
+</pre>
+<p><b>Description</b>
+<p><!--para 2 -->
+ The remove function causes the file whose name is the string pointed to by filename
+ to be no longer accessible by that name. A subsequent attempt to open that file using that
+ name will fail, unless it is created anew. If the file is open, the behavior of the remove
+ function is implementation-defined.
+<p><b>Returns</b>
+<p><!--para 3 -->
+ The remove function returns zero if the operation succeeds, nonzero if it fails.
+
+<h5><a name="7.19.4.2" href="#7.19.4.2">7.19.4.2 The rename function</a></h5>
+<p><b>Synopsis</b>
+<p><!--para 1 -->
+<pre>
+        #include <a href="#7.19">&lt;stdio.h&gt;</a>
         int rename(const char *old, const char *new);
-        FILE *tmpfile(void);
-        char *tmpnam(char *s);
+</pre>
+<p><b>Description</b>
+<p><!--para 2 -->
+ The rename function causes the file whose name is the string pointed to by old to be
+ henceforth known by the name given by the string pointed to by new. The file named
+ old is no longer accessible by that name. If a file named by the string pointed to by new
+ exists prior to the call to the rename function, the behavior is implementation-defined.
+<!--page 281 -->
+<p><b>Returns</b>
+<p><!--para 3 -->
+ The rename function returns zero if the operation succeeds, nonzero if it fails,<sup><a href="#note235"><b>235)</b></a></sup> in
+ which case if the file existed previously it is still known by its original name.
+
+<p><b>Footnotes</b>
+<p><small><a name="note235" href="#note235">235)</a> Among the reasons the implementation may cause the rename function to fail are that the file is open
+ or that it is necessary to copy its contents to effectuate its renaming.
+</small>
+
+<h5><a name="7.19.4.3" href="#7.19.4.3">7.19.4.3 The tmpfile function</a></h5>
+<p><b>Synopsis</b>
+<p><!--para 1 -->
+<pre>
+         #include <a href="#7.19">&lt;stdio.h&gt;</a>
+         FILE *tmpfile(void);
+</pre>
+<p><b>Description</b>
+<p><!--para 2 -->
+ The tmpfile function creates a temporary binary file that is different from any other
+ existing file and that will automatically be removed when it is closed or at program
+ termination. If the program terminates abnormally, whether an open temporary file is
+ removed is implementation-defined. The file is opened for update with "wb+" mode.
+<p><b>Recommended practice</b>
+<p><!--para 3 -->
+ It should be possible to open at least TMP_MAX temporary files during the lifetime of the
+ program (this limit may be shared with tmpnam) and there should be no limit on the
+ number simultaneously open other than this limit and any limit on the number of open
+ files (FOPEN_MAX).
+<p><b>Returns</b>
+<p><!--para 4 -->
+ The tmpfile function returns a pointer to the stream of the file that it created. If the file
+ cannot be created, the tmpfile function returns a null pointer.
+<p><b> Forward references</b>: the fopen function (<a href="#7.19.5.3">7.19.5.3</a>).
+
+<h5><a name="7.19.4.4" href="#7.19.4.4">7.19.4.4 The tmpnam function</a></h5>
+<p><b>Synopsis</b>
+<p><!--para 1 -->
+<pre>
+         #include <a href="#7.19">&lt;stdio.h&gt;</a>
+         char *tmpnam(char *s);
+</pre>
+<p><b>Description</b>
+<p><!--para 2 -->
+ The tmpnam function generates a string that is a valid file name and that is not the same
+ as the name of an existing file.<sup><a href="#note236"><b>236)</b></a></sup> The function is potentially capable of generating
+<!--page 282 -->
+ TMP_MAX different strings, but any or all of them may already be in use by existing files
+ and thus not be suitable return values.
+<p><!--para 3 -->
+ The tmpnam function generates a different string each time it is called.
+<p><!--para 4 -->
+ The implementation shall behave as if no library function calls the tmpnam function.
+<p><b>Returns</b>
+<p><!--para 5 -->
+ If no suitable string can be generated, the tmpnam function returns a null pointer.
+ Otherwise, if the argument is a null pointer, the tmpnam function leaves its result in an
+ internal static object and returns a pointer to that object (subsequent calls to the tmpnam
+ function may modify the same object). If the argument is not a null pointer, it is assumed
+ to point to an array of at least L_tmpnam chars; the tmpnam function writes its result
+ in that array and returns the argument as its value.
+<p><b>Environmental limits</b>
+<p><!--para 6 -->
+ The value of the macro TMP_MAX shall be at least 25.
+
+<p><b>Footnotes</b>
+<p><small><a name="note236" href="#note236">236)</a> Files created using strings generated by the tmpnam function are temporary only in the sense that
+ their names should not collide with those generated by conventional naming rules for the
+ implementation. It is still necessary to use the remove function to remove such files when their use
+ is ended, and before program termination.
+</small>
+
+<h4><a name="7.19.5" href="#7.19.5">7.19.5 File access functions</a></h4>
+
+<h5><a name="7.19.5.1" href="#7.19.5.1">7.19.5.1 The fclose function</a></h5>
+<p><b>Synopsis</b>
+<p><!--para 1 -->
+<pre>
+        #include <a href="#7.19">&lt;stdio.h&gt;</a>
         int fclose(FILE *stream);
+</pre>
+<p><b>Description</b>
+<p><!--para 2 -->
+ A successful call to the fclose function causes the stream pointed to by stream to be
+ flushed and the associated file to be closed. Any unwritten buffered data for the stream
+ are delivered to the host environment to be written to the file; any unread buffered data
+ are discarded. Whether or not the call succeeds, the stream is disassociated from the file
+ and any buffer set by the setbuf or setvbuf function is disassociated from the stream
+ (and deallocated if it was automatically allocated).
+<p><b>Returns</b>
+<p><!--para 3 -->
+ The fclose function returns zero if the stream was successfully closed, or EOF if any
+ errors were detected.
+
+<h5><a name="7.19.5.2" href="#7.19.5.2">7.19.5.2 The fflush function</a></h5>
+<p><b>Synopsis</b>
+<p><!--para 1 -->
+<!--page 283 -->
+<pre>
+        #include <a href="#7.19">&lt;stdio.h&gt;</a>
         int fflush(FILE *stream);
-        FILE *fopen(const char * restrict filename,
-             const char * restrict mode);
+</pre>
+<p><b>Description</b>
+<p><!--para 2 -->
+ If stream points to an output stream or an update stream in which the most recent
+ operation was not input, the fflush function causes any unwritten data for that stream
+ to be delivered to the host environment to be written to the file; otherwise, the behavior is
+ undefined.
+<p><!--para 3 -->
+ If stream is a null pointer, the fflush function performs this flushing action on all
+ streams for which the behavior is defined above.
+<p><b>Returns</b>
+<p><!--para 4 -->
+ The fflush function sets the error indicator for the stream and returns EOF if a write
+ error occurs, otherwise it returns zero.
+<p><b> Forward references</b>: the fopen function (<a href="#7.19.5.3">7.19.5.3</a>).
+
+<h5><a name="7.19.5.3" href="#7.19.5.3">7.19.5.3 The fopen function</a></h5>
+<p><b>Synopsis</b>
+<p><!--para 1 -->
+<pre>
+         #include <a href="#7.19">&lt;stdio.h&gt;</a>
+         FILE *fopen(const char * restrict filename,
+              const char * restrict mode);
+</pre>
+<p><b>Description</b>
+<p><!--para 2 -->
+ The fopen function opens the file whose name is the string pointed to by filename,
+ and associates a stream with it.
+<p><!--para 3 -->
+ The argument mode points to a string. If the string is one of the following, the file is
+ open in the indicated mode. Otherwise, the behavior is undefined.<sup><a href="#note237"><b>237)</b></a></sup>
+<dl>
+<dt> r                <dd>open text file for reading
+<dt> w                <dd>truncate to zero length or create text file for writing
+<dt> a                <dd>append; open or create text file for writing at end-of-file
+<dt> rb               <dd>open binary file for reading
+<dt> wb               <dd>truncate to zero length or create binary file for writing
+<dt> ab               <dd><dd>append; open or create binary file for writing at end-of-file
+<dt> r+               <dd>open text file for update (reading and writing)
+<dt> w+               <dd>truncate to zero length or create text file for update
+<dt> a+               <dd>append; open or create text file for update, writing at end-of-file
+<!--page 284 -->
+<dt> r+b or rb+ <dd>open binary file for update (reading and writing)
+<dt> w+b or wb+ <dd>truncate to zero length or create binary file for update
+<dt> a+b or ab+ <dd>append; open or create binary file for update, writing at end-of-file
+</dl>
+<p><!--para 4 -->
+ Opening a file with read mode ('r' as the first character in the mode argument) fails if
+ the file does not exist or cannot be read.
+<p><!--para 5 -->
+ Opening a file with append mode ('a' as the first character in the mode argument)
+ causes all subsequent writes to the file to be forced to the then current end-of-file,
+ regardless of intervening calls to the fseek function. In some implementations, opening
+ a binary file with append mode ('b' as the second or third character in the above list of
+ mode argument values) may initially position the file position indicator for the stream
+ beyond the last data written, because of null character padding.
+<p><!--para 6 -->
+ When a file is opened with update mode ('+' as the second or third character in the
+ above list of mode argument values), both input and output may be performed on the
+ associated stream. However, output shall not be directly followed by input without an
+ intervening call to the fflush function or to a file positioning function (fseek,
+ fsetpos, or rewind), and input shall not be directly followed by output without an
+ intervening call to a file positioning function, unless the input operation encounters end-
+ of-file. Opening (or creating) a text file with update mode may instead open (or create) a
+ binary stream in some implementations.
+<p><!--para 7 -->
+ When opened, a stream is fully buffered if and only if it can be determined not to refer to
+ an interactive device. The error and end-of-file indicators for the stream are cleared.
+<p><b>Returns</b>
+<p><!--para 8 -->
+ The fopen function returns a pointer to the object controlling the stream. If the open
+ operation fails, fopen returns a null pointer.
+<p><b> Forward references</b>: file positioning functions (<a href="#7.19.9">7.19.9</a>).
+
+<p><b>Footnotes</b>
+<p><small><a name="note237" href="#note237">237)</a> If the string begins with one of the above sequences, the implementation might choose to ignore the
+ remaining characters, or it might use them to select different kinds of a file (some of which might not
+ conform to the properties in <a href="#7.19.2">7.19.2</a>).
+</small>
+
+<h5><a name="7.19.5.4" href="#7.19.5.4">7.19.5.4 The freopen function</a></h5>
+<p><b>Synopsis</b>
+<p><!--para 1 -->
+<pre>
+        #include <a href="#7.19">&lt;stdio.h&gt;</a>
         FILE *freopen(const char * restrict filename,
              const char * restrict mode,
              FILE * restrict stream);
-        void setbuf(FILE * restrict stream,
-             char * restrict buf);
-
-
-[<a name="p429" href="#p429">page 429</a>] (<a href="#Contents">Contents</a>)
-
-      int setvbuf(FILE * restrict stream,
-           char * restrict buf,
-           int mode, size_t size);
-      int fprintf(FILE * restrict stream,
-           const char * restrict format, ...);
-      int fscanf(FILE * restrict stream,
-           const char * restrict format, ...);
-      int printf(const char * restrict format, ...);
-      int scanf(const char * restrict format, ...);
-      int snprintf(char * restrict s, size_t n,
-           const char * restrict format, ...);
-      int sprintf(char * restrict s,
-           const char * restrict format, ...);
-      int sscanf(const char * restrict s,
-           const char * restrict format, ...);
-      int vfprintf(FILE * restrict stream,
-           const char * restrict format, va_list arg);
-      int vfscanf(FILE * restrict stream,
-           const char * restrict format, va_list arg);
-      int vprintf(const char * restrict format, va_list arg);
-      int vscanf(const char * restrict format, va_list arg);
-      int vsnprintf(char * restrict s, size_t n,
-           const char * restrict format, va_list arg);
-      int vsprintf(char * restrict s,
-           const char * restrict format, va_list arg);
-      int vsscanf(const char * restrict s,
-           const char * restrict format, va_list arg);
-      int fgetc(FILE *stream);
-      char *fgets(char * restrict s, int n,
-           FILE * restrict stream);
-      int fputc(int c, FILE *stream);
-      int fputs(const char * restrict s,
-           FILE * restrict stream);
-      int getc(FILE *stream);
-      int getchar(void);
-      char *gets(char *s);
-      int putc(int c, FILE *stream);
-      int putchar(int c);
-      int puts(const char *s);
-      int ungetc(int c, FILE *stream);
-
-
-[<a name="p430" href="#p430">page 430</a>] (<a href="#Contents">Contents</a>)
-
+</pre>
+<p><b>Description</b>
+<p><!--para 2 -->
+ The freopen function opens the file whose name is the string pointed to by filename
+ and associates the stream pointed to by stream with it. The mode argument is used just
+<!--page 285 -->
+ as in the fopen function.<sup><a href="#note238"><b>238)</b></a></sup>
+<p><!--para 3 -->
+ If filename is a null pointer, the freopen function attempts to change the mode of
+ the stream to that specified by mode, as if the name of the file currently associated with
+ the stream had been used. It is implementation-defined which changes of mode are
+ permitted (if any), and under what circumstances.
+<p><!--para 4 -->
+ The freopen function first attempts to close any file that is associated with the specified
+ stream. Failure to close the file is ignored. The error and end-of-file indicators for the
+ stream are cleared.
+<p><b>Returns</b>
+<p><!--para 5 -->
+ The freopen function returns a null pointer if the open operation fails. Otherwise,
+ freopen returns the value of stream.
+
+<p><b>Footnotes</b>
+<p><small><a name="note238" href="#note238">238)</a> The primary use of the freopen function is to change the file associated with a standard text stream
+ (stderr, stdin, or stdout), as those identifiers need not be modifiable lvalues to which the value
+ returned by the fopen function may be assigned.
+</small>
+
+<h5><a name="7.19.5.5" href="#7.19.5.5">7.19.5.5 The setbuf function</a></h5>
+<p><b>Synopsis</b>
+<p><!--para 1 -->
+<pre>
+         #include <a href="#7.19">&lt;stdio.h&gt;</a>
+         void setbuf(FILE * restrict stream,
+              char * restrict buf);
+</pre>
+<p><b>Description</b>
+<p><!--para 2 -->
+ Except that it returns no value, the setbuf function is equivalent to the setvbuf
+ function invoked with the values _IOFBF for mode and BUFSIZ for size, or (if buf
+ is a null pointer), with the value _IONBF for mode.
+<p><b>Returns</b>
+<p><!--para 3 -->
+ The setbuf function returns no value.
+<p><b> Forward references</b>: the setvbuf function (<a href="#7.19.5.6">7.19.5.6</a>).
+
+<h5><a name="7.19.5.6" href="#7.19.5.6">7.19.5.6 The setvbuf function</a></h5>
+<p><b>Synopsis</b>
+<p><!--para 1 -->
+<pre>
+         #include <a href="#7.19">&lt;stdio.h&gt;</a>
+         int setvbuf(FILE * restrict stream,
+              char * restrict buf,
+              int mode, size_t size);
+</pre>
+<!--page 286 -->
+<p><b>Description</b>
+<p><!--para 2 -->
+ The setvbuf function may be used only after the stream pointed to by stream has
+ been associated with an open file and before any other operation (other than an
+ unsuccessful call to setvbuf) is performed on the stream. The argument mode
+ determines how stream will be buffered, as follows: _IOFBF causes input/output to be
+ fully buffered; _IOLBF causes input/output to be line buffered; _IONBF causes
+ input/output to be unbuffered. If buf is not a null pointer, the array it points to may be
+ used instead of a buffer allocated by the setvbuf function<sup><a href="#note239"><b>239)</b></a></sup> and the argument size
+ specifies the size of the array; otherwise, size may determine the size of a buffer
+ allocated by the setvbuf function. The contents of the array at any time are
+ indeterminate.
+<p><b>Returns</b>
+<p><!--para 3 -->
+ The setvbuf function returns zero on success, or nonzero if an invalid value is given
+ for mode or if the request cannot be honored.
+
+<p><b>Footnotes</b>
+<p><small><a name="note239" href="#note239">239)</a> The buffer has to have a lifetime at least as great as the open stream, so the stream should be closed
+ before a buffer that has automatic storage duration is deallocated upon block exit.
+</small>
+
+<h4><a name="7.19.6" href="#7.19.6">7.19.6 Formatted input/output functions</a></h4>
+<p><!--para 1 -->
+ The formatted input/output functions shall behave as if there is a sequence point after the
+ actions associated with each specifier.<sup><a href="#note240"><b>240)</b></a></sup>
+
+<p><b>Footnotes</b>
+<p><small><a name="note240" href="#note240">240)</a> The fprintf functions perform writes to memory for the %n specifier.
+</small>
+
+<h5><a name="7.19.6.1" href="#7.19.6.1">7.19.6.1 The fprintf function</a></h5>
+<p><b>Synopsis</b>
+<p><!--para 1 -->
+<pre>
+         #include <a href="#7.19">&lt;stdio.h&gt;</a>
+         int fprintf(FILE * restrict stream,
+              const char * restrict format, ...);
+</pre>
+<p><b>Description</b>
+<p><!--para 2 -->
+ The fprintf function writes output to the stream pointed to by stream, under control
+ of the string pointed to by format that specifies how subsequent arguments are
+ converted for output. If there are insufficient arguments for the format, the behavior is
+ undefined. If the format is exhausted while arguments remain, the excess arguments are
+ evaluated (as always) but are otherwise ignored. The fprintf function returns when
+ the end of the format string is encountered.
+<p><!--para 3 -->
+ The format shall be a multibyte character sequence, beginning and ending in its initial
+ shift state. The format is composed of zero or more directives: ordinary multibyte
+ characters (not %), which are copied unchanged to the output stream; and conversion
+<!--page 287 -->
+ specifications, each of which results in fetching zero or more subsequent arguments,
+ converting them, if applicable, according to the corresponding conversion specifier, and
+ then writing the result to the output stream.
+<p><!--para 4 -->
+ Each conversion specification is introduced by the character %. After the %, the following
+ appear in sequence:
+<ul>
+<li>  Zero or more flags (in any order) that modify the meaning of the conversion
+ specification.
+<li>  An optional minimum field width. If the converted value has fewer characters than the
+ field width, it is padded with spaces (by default) on the left (or right, if the left
+ adjustment flag, described later, has been given) to the field width. The field width
+ takes the form of an asterisk * (described later) or a nonnegative decimal integer.<sup><a href="#note241"><b>241)</b></a></sup>
+<li>  An optional precision that gives the minimum number of digits to appear for the d, i,
+ o, u, x, and X conversions, the number of digits to appear after the decimal-point
+ character for a, A, e, E, f, and F conversions, the maximum number of significant
+ digits for the g and G conversions, or the maximum number of bytes to be written for
+ s conversions. The precision takes the form of a period (.) followed either by an
+ asterisk * (described later) or by an optional decimal integer; if only the period is
+ specified, the precision is taken as zero. If a precision appears with any other
+ conversion specifier, the behavior is undefined.
+<li>  An optional length modifier that specifies the size of the argument.
+<li>  A conversion specifier character that specifies the type of conversion to be applied.
+</ul>
+<p><!--para 5 -->
+ As noted above, a field width, or precision, or both, may be indicated by an asterisk. In
+ this case, an int argument supplies the field width or precision. The arguments
+ specifying field width, or precision, or both, shall appear (in that order) before the
+ argument (if any) to be converted. A negative field width argument is taken as a - flag
+ followed by a positive field width. A negative precision argument is taken as if the
+ precision were omitted.
+<p><!--para 6 -->
+ The flag characters and their meanings are:
+<dl>
+<dt> -    <dd>    The result of the conversion is left-justified within the field. (It is right-justified if
+          this flag is not specified.)
+<dt> +    <dd>    The result of a signed conversion always begins with a plus or minus sign. (It
+          begins with a sign only when a negative value is converted if this flag is not
+<!--page 288 -->
+           specified.)<sup><a href="#note242"><b>242)</b></a></sup>
+<dt> space<dd> If the first character of a signed conversion is not a sign, or if a signed conversion
+       results in no characters, a space is prefixed to the result. If the space and + flags
+       both appear, the space flag is ignored.
+<dt> #    <dd>     The result is converted to an ''alternative form''. For o conversion, it increases
+           the precision, if and only if necessary, to force the first digit of the result to be a
+           zero (if the value and precision are both 0, a single 0 is printed). For x (or X)
+           conversion, a nonzero result has 0x (or 0X) prefixed to it. For a, A, e, E, f, F, g,
+           and G conversions, the result of converting a floating-point number always
+           contains a decimal-point character, even if no digits follow it. (Normally, a
+           decimal-point character appears in the result of these conversions only if a digit
+           follows it.) For g and G conversions, trailing zeros are not removed from the
+           result. For other conversions, the behavior is undefined.
+<dt> 0    <dd>     For d, i, o, u, x, X, a, A, e, E, f, F, g, and G conversions, leading zeros
+           (following any indication of sign or base) are used to pad to the field width rather
+           than performing space padding, except when converting an infinity or NaN. If the
+           0 and - flags both appear, the 0 flag is ignored. For d, i, o, u, x, and X
+           conversions, if a precision is specified, the 0 flag is ignored. For other
+           conversions, the behavior is undefined.
+</dl>
+<p><!--para 7 -->
+ The length modifiers and their meanings are:
+<dl>
+<dt> hh        <dd>    Specifies that a following d, i, o, u, x, or X conversion specifier applies to a
+                signed char or unsigned char argument (the argument will have
+                been promoted according to the integer promotions, but its value shall be
+                converted to signed char or unsigned char before printing); or that
+                a following n conversion specifier applies to a pointer to a signed char
+                argument.
+<dt> h         <dd>     Specifies that a following d, i, o, u, x, or X conversion specifier applies to a
+                short int or unsigned short int argument (the argument will
+                have been promoted according to the integer promotions, but its value shall
+                be converted to short int or unsigned short int before printing);
+                or that a following n conversion specifier applies to a pointer to a short
+                int argument.
+<dt> l (ell)   <dd>     Specifies that a following d, i, o, u, x, or X conversion specifier applies to a
+                long int or unsigned long int argument; that a following n
+                conversion specifier applies to a pointer to a long int argument; that a
+<!--page 289 -->
+              following c conversion specifier applies to a wint_t argument; that a
+              following s conversion specifier applies to a pointer to a wchar_t
+              argument; or has no effect on a following a, A, e, E, f, F, g, or G conversion
+              specifier.
+<dt> ll (ell-ell)<dd> Specifies that a following d, i, o, u, x, or X conversion specifier applies to a
+              long long int or unsigned long long int argument; or that a
+              following n conversion specifier applies to a pointer to a long long int
+              argument.
+<dt> j           <dd> Specifies that a following d, i, o, u, x, or X conversion specifier applies to
+              an intmax_t or uintmax_t argument; or that a following n conversion
+              specifier applies to a pointer to an intmax_t argument.
+<dt> z           <dd> Specifies that a following d, i, o, u, x, or X conversion specifier applies to a
+              size_t or the corresponding signed integer type argument; or that a
+              following n conversion specifier applies to a pointer to a signed integer type
+              corresponding to size_t argument.
+<dt> t           <dd> Specifies that a following d, i, o, u, x, or X conversion specifier applies to a
+              ptrdiff_t or the corresponding unsigned integer type argument; or that a
+              following n conversion specifier applies to a pointer to a ptrdiff_t
+              argument.
+<dt> L           <dd> Specifies that a following a, A, e, E, f, F, g, or G conversion specifier
+              applies to a long double argument.
+</dl>
+If a length modifier appears with any conversion specifier other than as specified above,
+ the behavior is undefined.
+<p><!--para 8 -->
+ The conversion specifiers and their meanings are:
+<dl>
+<dt> d,i    <dd>     The int argument is converted to signed decimal in the style [-]dddd. The
+             precision specifies the minimum number of digits to appear; if the value
+             being converted can be represented in fewer digits, it is expanded with
+             leading zeros. The default precision is 1. The result of converting a zero
+             value with a precision of zero is no characters.
+<dt> o,u,x,X<dd> The unsigned int argument is converted to unsigned octal (o), unsigned
+<!--page 290 -->
+         decimal (u), or unsigned hexadecimal notation (x or X) in the style dddd; the
+         letters abcdef are used for x conversion and the letters ABCDEF for X
+         conversion. The precision specifies the minimum number of digits to appear;
+         if the value being converted can be represented in fewer digits, it is expanded
+         with leading zeros. The default precision is 1. The result of converting a
+         zero value with a precision of zero is no characters.
+<dt> f,F    <dd>      A double argument representing a floating-point number is converted to
+              decimal notation in the style [-]ddd.ddd, where the number of digits after
+              the decimal-point character is equal to the precision specification. If the
+              precision is missing, it is taken as 6; if the precision is zero and the # flag is
+              not specified, no decimal-point character appears. If a decimal-point
+              character appears, at least one digit appears before it. The value is rounded to
+              the appropriate number of digits.
+              A double argument representing an infinity is converted in one of the styles
+              [-]inf or [-]infinity -- which style is implementation-defined. A
+              double argument representing a NaN is converted in one of the styles
+              [-]nan or [-]nan(n-char-sequence) -- which style, and the meaning of
+              any n-char-sequence, is implementation-defined. The F conversion specifier
+              produces INF, INFINITY, or NAN instead of inf, infinity, or nan,
+              respectively.<sup><a href="#note243"><b>243)</b></a></sup>
+<dt> e,E    <dd>      A double argument representing a floating-point number is converted in the
+              style [-]d.ddd e(+-)dd, where there is one digit (which is nonzero if the
+              argument is nonzero) before the decimal-point character and the number of
+              digits after it is equal to the precision; if the precision is missing, it is taken as
+              6; if the precision is zero and the # flag is not specified, no decimal-point
+              character appears. The value is rounded to the appropriate number of digits.
+              The E conversion specifier produces a number with E instead of e
+              introducing the exponent. The exponent always contains at least two digits,
+              and only as many more digits as necessary to represent the exponent. If the
+              value is zero, the exponent is zero.
+              A double argument representing an infinity or NaN is converted in the style
+              of an f or F conversion specifier.
+<dt> g,G    <dd>      A double argument representing a floating-point number is converted in
+              style f or e (or in style F or E in the case of a G conversion specifier),
+              depending on the value converted and the precision. Let P equal the
+              precision if nonzero, 6 if the precision is omitted, or 1 if the precision is zero.
+              Then, if a conversion with style E would have an exponent of X :
+              <ul>
+              <li> if P &gt; X &gt;= -4, the conversion is with style f (or F) and precision
+                P - (X + 1).
+              <li> otherwise, the conversion is with style e (or E) and precision P - 1.
+              </ul>
+              Finally, unless the # flag is used, any trailing zeros are removed from the
+<!--page 291 -->
+               fractional portion of the result and the decimal-point character is removed if
+               there is no fractional portion remaining.
+               A double argument representing an infinity or NaN is converted in the style
+               of an f or F conversion specifier.
+<dt> a,A    <dd>       A double argument representing a floating-point number is converted in the
+               style [-]0xh.hhhh p(+-)d, where there is one hexadecimal digit (which is
+               nonzero if the argument is a normalized floating-point number and is
+               otherwise unspecified) before the decimal-point character<sup><a href="#note244"><b>244)</b></a></sup> and the number
+               of hexadecimal digits after it is equal to the precision; if the precision is
+               missing and FLT_RADIX is a power of 2, then the precision is sufficient for
+               an exact representation of the value; if the precision is missing and
+               FLT_RADIX is not a power of 2, then the precision is sufficient to
+               distinguish<sup><a href="#note245"><b>245)</b></a></sup> values of type double, except that trailing zeros may be
+               omitted; if the precision is zero and the # flag is not specified, no decimal-
+               point character appears. The letters abcdef are used for a conversion and
+               the letters ABCDEF for A conversion. The A conversion specifier produces a
+               number with X and P instead of x and p. The exponent always contains at
+               least one digit, and only as many more digits as necessary to represent the
+               decimal exponent of 2. If the value is zero, the exponent is zero.
+               A double argument representing an infinity or NaN is converted in the style
+               of an f or F conversion specifier.
+<dt> c      <dd>       If no l length modifier is present, the int argument is converted to an
+               unsigned char, and the resulting character is written.
+               If an l length modifier is present, the wint_t argument is converted as if by
+               an ls conversion specification with no precision and an argument that points
+               to the initial element of a two-element array of wchar_t, the first element
+               containing the wint_t argument to the lc conversion specification and the
+               second a null wide character.
+<dt> s      <dd>       If no l length modifier is present, the argument shall be a pointer to the initial
+               element of an array of character type.<sup><a href="#note246"><b>246)</b></a></sup> Characters from the array are
+<!--page 292 -->
+                written up to (but not including) the terminating null character. If the
+                precision is specified, no more than that many bytes are written. If the
+                precision is not specified or is greater than the size of the array, the array shall
+                contain a null character.
+                If an l length modifier is present, the argument shall be a pointer to the initial
+                element of an array of wchar_t type. Wide characters from the array are
+                converted to multibyte characters (each as if by a call to the wcrtomb
+                function, with the conversion state described by an mbstate_t object
+                initialized to zero before the first wide character is converted) up to and
+                including a terminating null wide character. The resulting multibyte
+                characters are written up to (but not including) the terminating null character
+                (byte). If no precision is specified, the array shall contain a null wide
+                character. If a precision is specified, no more than that many bytes are
+                written (including shift sequences, if any), and the array shall contain a null
+                wide character if, to equal the multibyte character sequence length given by
+                the precision, the function would need to access a wide character one past the
+                end of the array. In no case is a partial multibyte character written.<sup><a href="#note247"><b>247)</b></a></sup>
+<dt> p      <dd>        The argument shall be a pointer to void. The value of the pointer is
+                converted to a sequence of printing characters, in an implementation-defined
+                manner.
+<dt> n      <dd>        The argument shall be a pointer to signed integer into which is written the
+                number of characters written to the output stream so far by this call to
+                fprintf. No argument is converted, but one is consumed. If the conversion
+                specification includes any flags, a field width, or a precision, the behavior is
+                undefined.
+<dt> %      <dd>        A % character is written. No argument is converted. The complete
+                conversion specification shall be %%.
+</dl>
+<p><!--para 9 -->
+ If a conversion specification is invalid, the behavior is undefined.<sup><a href="#note248"><b>248)</b></a></sup> If any argument is
+ not the correct type for the corresponding conversion specification, the behavior is
+ undefined.
+<p><!--para 10 -->
+ In no case does a nonexistent or small field width cause truncation of a field; if the result
+ of a conversion is wider than the field width, the field is expanded to contain the
+ conversion result.
+<!--page 293 -->
+<p><!--para 11 -->
+ For a and A conversions, if FLT_RADIX is a power of 2, the value is correctly rounded
+ to a hexadecimal floating number with the given precision.
+<p><b>Recommended practice</b>
+<p><!--para 12 -->
+ For a and A conversions, if FLT_RADIX is not a power of 2 and the result is not exactly
+ representable in the given precision, the result should be one of the two adjacent numbers
+ in hexadecimal floating style with the given precision, with the extra stipulation that the
+ error should have a correct sign for the current rounding direction.
+<p><!--para 13 -->
+ For e, E, f, F, g, and G conversions, if the number of significant decimal digits is at most
+ DECIMAL_DIG, then the result should be correctly rounded.<sup><a href="#note249"><b>249)</b></a></sup> If the number of
+ significant decimal digits is more than DECIMAL_DIG but the source value is exactly
+ representable with DECIMAL_DIG digits, then the result should be an exact
+ representation with trailing zeros. Otherwise, the source value is bounded by two
+ adjacent decimal strings L &lt; U, both having DECIMAL_DIG significant digits; the value
+ of the resultant decimal string D should satisfy L &lt;= D &lt;= U, with the extra stipulation that
+ the error should have a correct sign for the current rounding direction.
+<p><b>Returns</b>
+<p><!--para 14 -->
+ The fprintf function returns the number of characters transmitted, or a negative value
+ if an output or encoding error occurred.
+<p><b>Environmental limits</b>
+<p><!--para 15 -->
+ The number of characters that can be produced by any single conversion shall be at least
+ 4095.
+<p><!--para 16 -->
+ EXAMPLE 1 To print a date and time in the form ''Sunday, July 3, 10:02'' followed by pi to five decimal
+ places:
+<pre>
+         #include <a href="#7.12">&lt;math.h&gt;</a>
+         #include <a href="#7.19">&lt;stdio.h&gt;</a>
+         /* ... */
+         char *weekday, *month;      // pointers to strings
+         int day, hour, min;
+         fprintf(stdout, "%s, %s %d, %.2d:%.2d\n",
+                 weekday, month, day, hour, min);
+         fprintf(stdout, "pi = %.5f\n", 4 * atan(1.0));
+</pre>
+<p><!--para 17 -->
+ EXAMPLE 2 In this example, multibyte characters do not have a state-dependent encoding, and the
+ members of the extended character set that consist of more than one byte each consist of exactly two bytes,
+ the first of which is denoted here by a and the second by an uppercase letter.
+<!--page 294 -->
+<p><!--para 18 -->
+ Given the following wide string with length seven,
+<pre>
+          static wchar_t wstr[] = L" X Yabc Z W";
+</pre>
+ the seven calls
+<pre>
+          fprintf(stdout,          "|1234567890123|\n");
+          fprintf(stdout,          "|%13ls|\n", wstr);
+          fprintf(stdout,          "|%-13.9ls|\n", wstr);
+          fprintf(stdout,          "|%13.10ls|\n", wstr);
+          fprintf(stdout,          "|%13.11ls|\n", wstr);
+          fprintf(stdout,          "|%13.15ls|\n", &amp;wstr[2]);
+          fprintf(stdout,          "|%13lc|\n", (wint_t) wstr[5]);
+</pre>
+ will print the following seven lines:
+<pre>
+          |1234567890123|
+          |   X Yabc Z W|
+          | X Yabc Z    |
+          |     X Yabc Z|
+          |   X Yabc Z W|
+          |      abc Z W|
+          |            Z|
+</pre>
+<p><b> Forward references</b>: conversion state (<a href="#7.24.6">7.24.6</a>), the wcrtomb function (<a href="#7.24.6.3.3">7.24.6.3.3</a>).
+
+<p><b>Footnotes</b>
+<p><small><a name="note241" href="#note241">241)</a> Note that 0 is taken as a flag, not as the beginning of a field width.
+</small>
+<p><small><a name="note242" href="#note242">242)</a> The results of all floating conversions of a negative zero, and of negative values that round to zero,
+ include a minus sign.
+</small>
+<p><small><a name="note243" href="#note243">243)</a> When applied to infinite and NaN values, the -, +, and space flag characters have their usual meaning;
+ the # and 0 flag characters have no effect.
+</small>
+<p><small><a name="note244" href="#note244">244)</a> Binary implementations can choose the hexadecimal digit to the left of the decimal-point character so
+ that subsequent digits align to nibble (4-bit) boundaries.
+</small>
+<p><small><a name="note245" href="#note245">245)</a> The precision p is sufficient to distinguish values of the source type if 16<sup>p-1</sup> &gt; b n where b is
+ FLT_RADIX and n is the number of base-b digits in the significand of the source type. A smaller p
+ might suffice depending on the implementation's scheme for determining the digit to the left of the
+ decimal-point character.
+</small>
+<p><small><a name="note246" href="#note246">246)</a> No special provisions are made for multibyte characters.
+</small>
+<p><small><a name="note247" href="#note247">247)</a> Redundant shift sequences may result if multibyte characters have a state-dependent encoding.
+</small>
+<p><small><a name="note248" href="#note248">248)</a> See ''future library directions'' (<a href="#7.26.9">7.26.9</a>).
+</small>
+<p><small><a name="note249" href="#note249">249)</a> For binary-to-decimal conversion, the result format's values are the numbers representable with the
+ given format specifier. The number of significant digits is determined by the format specifier, and in
+ the case of fixed-point conversion by the source value as well.
+</small>
+
+<h5><a name="7.19.6.2" href="#7.19.6.2">7.19.6.2 The fscanf function</a></h5>
+<p><b>Synopsis</b>
+<p><!--para 1 -->
+<pre>
+          #include <a href="#7.19">&lt;stdio.h&gt;</a>
+          int fscanf(FILE * restrict stream,
+               const char * restrict format, ...);
+</pre>
+<p><b>Description</b>
+<p><!--para 2 -->
+ The fscanf function reads input from the stream pointed to by stream, under control
+ of the string pointed to by format that specifies the admissible input sequences and how
+ they are to be converted for assignment, using subsequent arguments as pointers to the
+ objects to receive the converted input. If there are insufficient arguments for the format,
+ the behavior is undefined. If the format is exhausted while arguments remain, the excess
+ arguments are evaluated (as always) but are otherwise ignored.
+<p><!--para 3 -->
+ The format shall be a multibyte character sequence, beginning and ending in its initial
+ shift state. The format is composed of zero or more directives: one or more white-space
+ characters, an ordinary multibyte character (neither % nor a white-space character), or a
+ conversion specification. Each conversion specification is introduced by the character %.
+ After the %, the following appear in sequence:
+<ul>
+<li>  An optional assignment-suppressing character *.
+<li>  An optional decimal integer greater than zero that specifies the maximum field width
+ (in characters).
+<!--page 295 -->
+<li>  An optional length modifier that specifies the size of the receiving object.
+<li>  A conversion specifier character that specifies the type of conversion to be applied.
+</ul>
+<p><!--para 4 -->
+ The fscanf function executes each directive of the format in turn. If a directive fails, as
+ detailed below, the function returns. Failures are described as input failures (due to the
+ occurrence of an encoding error or the unavailability of input characters), or matching
+ failures (due to inappropriate input).
+<p><!--para 5 -->
+ A directive composed of white-space character(s) is executed by reading input up to the
+ first non-white-space character (which remains unread), or until no more characters can
+ be read.
+<p><!--para 6 -->
+ A directive that is an ordinary multibyte character is executed by reading the next
+ characters of the stream. If any of those characters differ from the ones composing the
+ directive, the directive fails and the differing and subsequent characters remain unread.
+ Similarly, if end-of-file, an encoding error, or a read error prevents a character from being
+ read, the directive fails.
+<p><!--para 7 -->
+ A directive that is a conversion specification defines a set of matching input sequences, as
+ described below for each specifier. A conversion specification is executed in the
+ following steps:
+<p><!--para 8 -->
+ Input white-space characters (as specified by the isspace function) are skipped, unless
+ the specification includes a [, c, or n specifier.<sup><a href="#note250"><b>250)</b></a></sup>
+<p><!--para 9 -->
+ An input item is read from the stream, unless the specification includes an n specifier. An
+ input item is defined as the longest sequence of input characters which does not exceed
+ any specified field width and which is, or is a prefix of, a matching input sequence.<sup><a href="#note251"><b>251)</b></a></sup>
+ The first character, if any, after the input item remains unread. If the length of the input
+ item is zero, the execution of the directive fails; this condition is a matching failure unless
+ end-of-file, an encoding error, or a read error prevented input from the stream, in which
+ case it is an input failure.
+<p><!--para 10 -->
+ Except in the case of a % specifier, the input item (or, in the case of a %n directive, the
+ count of input characters) is converted to a type appropriate to the conversion specifier. If
+ the input item is not a matching sequence, the execution of the directive fails: this
+ condition is a matching failure. Unless assignment suppression was indicated by a *, the
+ result of the conversion is placed in the object pointed to by the first argument following
+ the format argument that has not already received a conversion result. If this object
+ does not have an appropriate type, or if the result of the conversion cannot be represented
+<!--page 296 -->
+ in the object, the behavior is undefined.
+<p><!--para 11 -->
+ The length modifiers and their meanings are:
+<dl>
+<dt> hh       <dd>    Specifies that a following d, i, o, u, x, X, or n conversion specifier applies
+              to an argument with type pointer to signed char or unsigned char.
+<dt> h        <dd>    Specifies that a following d, i, o, u, x, X, or n conversion specifier applies
+              to an argument with type pointer to short int or unsigned short
+              int.
+<dt> l (ell)  <dd>    Specifies that a following d, i, o, u, x, X, or n conversion specifier applies
+              to an argument with type pointer to long int or unsigned long
+              int; that a following a, A, e, E, f, F, g, or G conversion specifier applies to
+              an argument with type pointer to double; or that a following c, s, or [
+              conversion specifier applies to an argument with type pointer to wchar_t.
+<dt> ll (ell-ell)<dd> Specifies that a following d, i, o, u, x, X, or n conversion specifier applies
+              to an argument with type pointer to long long int or unsigned
+              long long int.
+<dt> j        <dd>    Specifies that a following d, i, o, u, x, X, or n conversion specifier applies
+              to an argument with type pointer to intmax_t or uintmax_t.
+<dt> z        <dd>    Specifies that a following d, i, o, u, x, X, or n conversion specifier applies
+              to an argument with type pointer to size_t or the corresponding signed
+              integer type.
+<dt> t        <dd>    Specifies that a following d, i, o, u, x, X, or n conversion specifier applies
+              to an argument with type pointer to ptrdiff_t or the corresponding
+              unsigned integer type.
+<dt> L        <dd>    Specifies that a following a, A, e, E, f, F, g, or G conversion specifier
+              applies to an argument with type pointer to long double.
+</dl>
+ If a length modifier appears with any conversion specifier other than as specified above,
+ the behavior is undefined.
+<p><!--para 12 -->
+ The conversion specifiers and their meanings are:
+<dl>
+<dt> d      <dd>     Matches an optionally signed decimal integer, whose format is the same as
+             expected for the subject sequence of the strtol function with the value 10
+             for the base argument. The corresponding argument shall be a pointer to
+             signed integer.
+<dt> i      <dd>     Matches an optionally signed integer, whose format is the same as expected
+<!--page 297 -->
+             for the subject sequence of the strtol function with the value 0 for the
+             base argument. The corresponding argument shall be a pointer to signed
+             integer.
+<dt> o      <dd>       Matches an optionally signed octal integer, whose format is the same as
+               expected for the subject sequence of the strtoul function with the value 8
+               for the base argument. The corresponding argument shall be a pointer to
+               unsigned integer.
+<dt> u      <dd>       Matches an optionally signed decimal integer, whose format is the same as
+               expected for the subject sequence of the strtoul function with the value 10
+               for the base argument. The corresponding argument shall be a pointer to
+               unsigned integer.
+<dt> x      <dd>       Matches an optionally signed hexadecimal integer, whose format is the same
+               as expected for the subject sequence of the strtoul function with the value
+               16 for the base argument. The corresponding argument shall be a pointer to
+               unsigned integer.
+<dt> a,e,f,g<dd> Matches an optionally signed floating-point number, infinity, or NaN, whose
+         format is the same as expected for the subject sequence of the strtod
+         function. The corresponding argument shall be a pointer to floating.
+<dt> c      <dd>       Matches a sequence of characters of exactly the number specified by the field
+               width (1 if no field width is present in the directive).<sup><a href="#note252"><b>252)</b></a></sup>
+               If no l length modifier is present, the corresponding argument shall be a
+               pointer to the initial element of a character array large enough to accept the
+               sequence. No null character is added.
+               If an l length modifier is present, the input shall be a sequence of multibyte
+               characters that begins in the initial shift state. Each multibyte character in the
+               sequence is converted to a wide character as if by a call to the mbrtowc
+               function, with the conversion state described by an mbstate_t object
+               initialized to zero before the first multibyte character is converted. The
+               corresponding argument shall be a pointer to the initial element of an array of
+               wchar_t large enough to accept the resulting sequence of wide characters.
+               No null wide character is added.
+<dt> s      <dd>       Matches a sequence of non-white-space characters.<sup><a href="#note252"><b>252)</b></a></sup>
+               If no l length modifier is present, the corresponding argument shall be a
+               pointer to the initial element of a character array large enough to accept the
+               sequence and a terminating null character, which will be added automatically.
+               If an l length modifier is present, the input shall be a sequence of multibyte
+<!--page 298 -->
+          characters that begins in the initial shift state. Each multibyte character is
+          converted to a wide character as if by a call to the mbrtowc function, with
+          the conversion state described by an mbstate_t object initialized to zero
+          before the first multibyte character is converted. The corresponding argument
+          shall be a pointer to the initial element of an array of wchar_t large enough
+          to accept the sequence and the terminating null wide character, which will be
+          added automatically.
+<dt> [      <dd>  Matches a nonempty sequence of characters from a set of expected characters
+          (the scanset).<sup><a href="#note252"><b>252)</b></a></sup>
+          If no l length modifier is present, the corresponding argument shall be a
+          pointer to the initial element of a character array large enough to accept the
+          sequence and a terminating null character, which will be added automatically.
+          If an l length modifier is present, the input shall be a sequence of multibyte
+          characters that begins in the initial shift state. Each multibyte character is
+          converted to a wide character as if by a call to the mbrtowc function, with
+          the conversion state described by an mbstate_t object initialized to zero
+          before the first multibyte character is converted. The corresponding argument
+          shall be a pointer to the initial element of an array of wchar_t large enough
+          to accept the sequence and the terminating null wide character, which will be
+          added automatically.
+          The conversion specifier includes all subsequent characters in the format
+          string, up to and including the matching right bracket (]). The characters
+          between the brackets (the scanlist) compose the scanset, unless the character
+          after the left bracket is a circumflex (^), in which case the scanset contains all
+          characters that do not appear in the scanlist between the circumflex and the
+          right bracket. If the conversion specifier begins with [] or [^], the right
+          bracket character is in the scanlist and the next following right bracket
+          character is the matching right bracket that ends the specification; otherwise
+          the first following right bracket character is the one that ends the
+          specification. If a - character is in the scanlist and is not the first, nor the
+          second where the first character is a ^, nor the last character, the behavior is
+          implementation-defined.
+<dt> p      <dd>  Matches an implementation-defined set of sequences, which should be the
+<!--page 299 -->
+          same as the set of sequences that may be produced by the %p conversion of
+          the fprintf function. The corresponding argument shall be a pointer to a
+          pointer to void. The input item is converted to a pointer value in an
+          implementation-defined manner. If the input item is a value converted earlier
+          during the same program execution, the pointer that results shall compare
+          equal to that value; otherwise the behavior of the %p conversion is undefined.
+<dt> n      <dd>        No input is consumed. The corresponding argument shall be a pointer to
+                signed integer into which is to be written the number of characters read from
+                the input stream so far by this call to the fscanf function. Execution of a
+                %n directive does not increment the assignment count returned at the
+                completion of execution of the fscanf function. No argument is converted,
+                but one is consumed. If the conversion specification includes an assignment-
+                suppressing character or a field width, the behavior is undefined.
+<dt> %      <dd>        Matches a single % character; no conversion or assignment occurs. The
+                complete conversion specification shall be %%.
+</dl>
+<p><!--para 13 -->
+ If a conversion specification is invalid, the behavior is undefined.<sup><a href="#note253"><b>253)</b></a></sup>
+<p><!--para 14 -->
+ The conversion specifiers A, E, F, G, and X are also valid and behave the same as,
+ respectively, a, e, f, g, and x.
+<p><!--para 15 -->
+ Trailing white space (including new-line characters) is left unread unless matched by a
+ directive. The success of literal matches and suppressed assignments is not directly
+ determinable other than via the %n directive.
+<p><b>Returns</b>
+<p><!--para 16 -->
+ The fscanf function returns the value of the macro EOF if an input failure occurs
+ before any conversion. Otherwise, the function returns the number of input items
+ assigned, which can be fewer than provided for, or even zero, in the event of an early
+ matching failure.
+<p><!--para 17 -->
+ EXAMPLE 1        The call:
+<pre>
+          #include <a href="#7.19">&lt;stdio.h&gt;</a>
+          /* ... */
+          int n, i; float x; char name[50];
+          n = fscanf(stdin, "%d%f%s", &amp;i, &amp;x, name);
+</pre>
+ with the input line:
+<pre>
+          25 54.32E-1 thompson
+</pre>
+ will assign to n the value 3, to i the value 25, to x the value 5.432, and to name the sequence
+ thompson\0.
+<p><!--para 18 -->
+ EXAMPLE 2        The call:
+<pre>
+          #include <a href="#7.19">&lt;stdio.h&gt;</a>
+          /* ... */
+          int i; float x; char name[50];
+          fscanf(stdin, "%2d%f%*d %[0123456789]", &amp;i, &amp;x, name);
+</pre>
+ with input:
+<!--page 300 -->
+<pre>
+          56789 0123 56a72
+</pre>
+ will assign to i the value 56 and to x the value 789.0, will skip 0123, and will assign to name the
+ sequence 56\0. The next character read from the input stream will be a.
+<p><!--para 19 -->
+ EXAMPLE 3         To accept repeatedly from stdin a quantity, a unit of measure, and an item name:
+<pre>
+          #include <a href="#7.19">&lt;stdio.h&gt;</a>
+          /* ... */
+          int count; float quant; char units[21], item[21];
+          do {
+                  count = fscanf(stdin, "%f%20s of %20s", &amp;quant, units, item);
+                  fscanf(stdin,"%*[^\n]");
+          } while (!feof(stdin) &amp;&amp; !ferror(stdin));
+</pre>
+<p><!--para 20 -->
+ If the stdin stream contains the following lines:
+<pre>
+          2 quarts of oil
+          -12.8degrees Celsius
+          lots of luck
+          10.0LBS      of
+          dirt
+          100ergs of energy
+</pre>
+ the execution of the above example will be analogous to the following assignments:
+<pre>
+          quant     =    2; strcpy(units, "quarts"); strcpy(item, "oil");
+          count     =    3;
+          quant     =    -12.8; strcpy(units, "degrees");
+          count     =    2; // "C" fails to match "o"
+          count     =    0; // "l" fails to match "%f"
+          quant     =    10.0; strcpy(units, "LBS"); strcpy(item, "dirt");
+          count     =    3;
+          count     =    0; // "100e" fails to match "%f"
+          count     =    EOF;
+</pre>
+<p><!--para 21 -->
+ EXAMPLE 4         In:
+<pre>
+          #include <a href="#7.19">&lt;stdio.h&gt;</a>
+          /* ... */
+          int d1, d2, n1, n2, i;
+          i = sscanf("123", "%d%n%n%d", &amp;d1, &amp;n1, &amp;n2, &amp;d2);
+</pre>
+ the value 123 is assigned to d1 and the value 3 to n1. Because %n can never get an input failure the value
+ of 3 is also assigned to n2. The value of d2 is not affected. The value 1 is assigned to i.
+<p><!--para 22 -->
+ EXAMPLE 5 In these examples, multibyte characters do have a state-dependent encoding, and the
+ members of the extended character set that consist of more than one byte each consist of exactly two bytes,
+ the first of which is denoted here by a and the second by an uppercase letter, but are only recognized as
+ such when in the alternate shift state. The shift sequences are denoted by (uparrow) and (downarrow), in which the first causes
+ entry into the alternate shift state.
+<p><!--para 23 -->
+ After the call:
+<!--page 301 -->
+<pre>
+           #include <a href="#7.19">&lt;stdio.h&gt;</a>
+           /* ... */
+           char str[50];
+           fscanf(stdin, "a%s", str);
+</pre>
+ with the input line:
+<pre>
+           a(uparrow) X Y(downarrow) bc
+</pre>
+ str will contain (uparrow) X Y(downarrow)\0 assuming that none of the bytes of the shift sequences (or of the multibyte
+ characters, in the more general case) appears to be a single-byte white-space character.
+<p><!--para 24 -->
+ In contrast, after the call:
+<pre>
+           #include <a href="#7.19">&lt;stdio.h&gt;</a>
+           #include <a href="#7.17">&lt;stddef.h&gt;</a>
+           /* ... */
+           wchar_t wstr[50];
+           fscanf(stdin, "a%ls", wstr);
+</pre>
+ with the same input line, wstr will contain the two wide characters that correspond to X and Y and a
+ terminating null wide character.
+<p><!--para 25 -->
+ However, the call:
+<pre>
+           #include <a href="#7.19">&lt;stdio.h&gt;</a>
+           #include <a href="#7.17">&lt;stddef.h&gt;</a>
+           /* ... */
+           wchar_t wstr[50];
+           fscanf(stdin, "a(uparrow) X(downarrow)%ls", wstr);
+</pre>
+ with the same input line will return zero due to a matching failure against the (downarrow) sequence in the format
+ string.
+<p><!--para 26 -->
+ Assuming that the first byte of the multibyte character X is the same as the first byte of the multibyte
+ character Y, after the call:
+<pre>
+           #include <a href="#7.19">&lt;stdio.h&gt;</a>
+           #include <a href="#7.17">&lt;stddef.h&gt;</a>
+           /* ... */
+           wchar_t wstr[50];
+           fscanf(stdin, "a(uparrow) Y(downarrow)%ls", wstr);
+</pre>
+ with the same input line, zero will again be returned, but stdin will be left with a partially consumed
+ multibyte character.
+<p><b> Forward references</b>: the strtod, strtof, and strtold functions (<a href="#7.20.1.3">7.20.1.3</a>), the
+ strtol, strtoll, strtoul, and strtoull functions (<a href="#7.20.1.4">7.20.1.4</a>), conversion state
+ (<a href="#7.24.6">7.24.6</a>), the wcrtomb function (<a href="#7.24.6.3.3">7.24.6.3.3</a>).
+<!--page 302 -->
+
+<p><b>Footnotes</b>
+<p><small><a name="note250" href="#note250">250)</a> These white-space characters are not counted against a specified field width.
+</small>
+<p><small><a name="note251" href="#note251">251)</a> fscanf pushes back at most one input character onto the input stream. Therefore, some sequences
+ that are acceptable to strtod, strtol, etc., are unacceptable to fscanf.
+</small>
+<p><small><a name="note252" href="#note252">252)</a> No special provisions are made for multibyte characters in the matching rules used by the c, s, and [
+ conversion specifiers -- the extent of the input field is determined on a byte-by-byte basis. The
+ resulting field is nevertheless a sequence of multibyte characters that begins in the initial shift state.
+</small>
+<p><small><a name="note253" href="#note253">253)</a> See ''future library directions'' (<a href="#7.26.9">7.26.9</a>).
+</small>
+
+<h5><a name="7.19.6.3" href="#7.19.6.3">7.19.6.3 The printf function</a></h5>
+<p><b>Synopsis</b>
+<p><!--para 1 -->
+<pre>
+        #include <a href="#7.19">&lt;stdio.h&gt;</a>
+        int printf(const char * restrict format, ...);
+</pre>
+<p><b>Description</b>
+<p><!--para 2 -->
+ The printf function is equivalent to fprintf with the argument stdout interposed
+ before the arguments to printf.
+<p><b>Returns</b>
+<p><!--para 3 -->
+ The printf function returns the number of characters transmitted, or a negative value if
+ an output or encoding error occurred.
+
+<h5><a name="7.19.6.4" href="#7.19.6.4">7.19.6.4 The scanf function</a></h5>
+<p><b>Synopsis</b>
+<p><!--para 1 -->
+<pre>
+        #include <a href="#7.19">&lt;stdio.h&gt;</a>
+        int scanf(const char * restrict format, ...);
+</pre>
+<p><b>Description</b>
+<p><!--para 2 -->
+ The scanf function is equivalent to fscanf with the argument stdin interposed
+ before the arguments to scanf.
+<p><b>Returns</b>
+<p><!--para 3 -->
+ The scanf function returns the value of the macro EOF if an input failure occurs before
+ any conversion. Otherwise, the scanf function returns the number of input items
+ assigned, which can be fewer than provided for, or even zero, in the event of an early
+ matching failure.
+
+<h5><a name="7.19.6.5" href="#7.19.6.5">7.19.6.5 The snprintf function</a></h5>
+<p><b>Synopsis</b>
+<p><!--para 1 -->
+<pre>
+        #include <a href="#7.19">&lt;stdio.h&gt;</a>
+        int snprintf(char * restrict s, size_t n,
+             const char * restrict format, ...);
+</pre>
+<p><b>Description</b>
+<p><!--para 2 -->
+ The snprintf function is equivalent to fprintf, except that the output is written into
+ an array (specified by argument s) rather than to a stream. If n is zero, nothing is written,
+ and s may be a null pointer. Otherwise, output characters beyond the n-1st are
+ discarded rather than being written to the array, and a null character is written at the end
+ of the characters actually written into the array. If copying takes place between objects
+ that overlap, the behavior is undefined.
+<!--page 303 -->
+<p><b>Returns</b>
+<p><!--para 3 -->
+ The snprintf function returns the number of characters that would have been written
+ had n been sufficiently large, not counting the terminating null character, or a negative
+ value if an encoding error occurred. Thus, the null-terminated output has been
+ completely written if and only if the returned value is nonnegative and less than n.
+
+<h5><a name="7.19.6.6" href="#7.19.6.6">7.19.6.6 The sprintf function</a></h5>
+<p><b>Synopsis</b>
+<p><!--para 1 -->
+<pre>
+        #include <a href="#7.19">&lt;stdio.h&gt;</a>
+        int sprintf(char * restrict s,
+             const char * restrict format, ...);
+</pre>
+<p><b>Description</b>
+<p><!--para 2 -->
+ The sprintf function is equivalent to fprintf, except that the output is written into
+ an array (specified by the argument s) rather than to a stream. A null character is written
+ at the end of the characters written; it is not counted as part of the returned value. If
+ copying takes place between objects that overlap, the behavior is undefined.
+<p><b>Returns</b>
+<p><!--para 3 -->
+ The sprintf function returns the number of characters written in the array, not
+ counting the terminating null character, or a negative value if an encoding error occurred.
+
+<h5><a name="7.19.6.7" href="#7.19.6.7">7.19.6.7 The sscanf function</a></h5>
+<p><b>Synopsis</b>
+<p><!--para 1 -->
+<pre>
+        #include <a href="#7.19">&lt;stdio.h&gt;</a>
+        int sscanf(const char * restrict s,
+             const char * restrict format, ...);
+</pre>
+<p><b>Description</b>
+<p><!--para 2 -->
+ The sscanf function is equivalent to fscanf, except that input is obtained from a
+ string (specified by the argument s) rather than from a stream. Reaching the end of the
+ string is equivalent to encountering end-of-file for the fscanf function. If copying
+ takes place between objects that overlap, the behavior is undefined.
+<p><b>Returns</b>
+<p><!--para 3 -->
+ The sscanf function returns the value of the macro EOF if an input failure occurs
+ before any conversion. Otherwise, the sscanf function returns the number of input
+ items assigned, which can be fewer than provided for, or even zero, in the event of an
+ early matching failure.
+<!--page 304 -->
+
+<h5><a name="7.19.6.8" href="#7.19.6.8">7.19.6.8 The vfprintf function</a></h5>
+<p><b>Synopsis</b>
+<p><!--para 1 -->
+<pre>
+        #include <a href="#7.15">&lt;stdarg.h&gt;</a>
+        #include <a href="#7.19">&lt;stdio.h&gt;</a>
+        int vfprintf(FILE * restrict stream,
+             const char * restrict format,
+             va_list arg);
+</pre>
+<p><b>Description</b>
+<p><!--para 2 -->
+ The vfprintf function is equivalent to fprintf, with the variable argument list
+ replaced by arg, which shall have been initialized by the va_start macro (and
+ possibly subsequent va_arg calls). The vfprintf function does not invoke the
+ va_end macro.<sup><a href="#note254"><b>254)</b></a></sup>
+<p><b>Returns</b>
+<p><!--para 3 -->
+ The vfprintf function returns the number of characters transmitted, or a negative
+ value if an output or encoding error occurred.
+<p><!--para 4 -->
+ EXAMPLE       The following shows the use of the vfprintf function in a general error-reporting routine.
+<pre>
+        #include <a href="#7.15">&lt;stdarg.h&gt;</a>
+        #include <a href="#7.19">&lt;stdio.h&gt;</a>
+        void error(char *function_name, char *format, ...)
+        {
+              va_list args;
+                 va_start(args, format);
+                 // print out name of function causing error
+                 fprintf(stderr, "ERROR in %s: ", function_name);
+                 // print out remainder of message
+                 vfprintf(stderr, format, args);
+                 va_end(args);
+        }
+</pre>
+<!--page 305 -->
+
+<p><b>Footnotes</b>
+<p><small><a name="note254" href="#note254">254)</a> As the functions vfprintf, vfscanf, vprintf, vscanf, vsnprintf, vsprintf, and
+ vsscanf invoke the va_arg macro, the value of arg after the return is indeterminate.
+</small>
+
+<h5><a name="7.19.6.9" href="#7.19.6.9">7.19.6.9 The vfscanf function</a></h5>
+<p><b>Synopsis</b>
+<p><!--para 1 -->
+<pre>
+        #include <a href="#7.15">&lt;stdarg.h&gt;</a>
+        #include <a href="#7.19">&lt;stdio.h&gt;</a>
+        int vfscanf(FILE * restrict stream,
+             const char * restrict format,
+             va_list arg);
+</pre>
+<p><b>Description</b>
+<p><!--para 2 -->
+ The vfscanf function is equivalent to fscanf, with the variable argument list
+ replaced by arg, which shall have been initialized by the va_start macro (and
+ possibly subsequent va_arg calls). The vfscanf function does not invoke the
+ va_end macro.<sup><a href="#note254"><b>254)</b></a></sup>
+<p><b>Returns</b>
+<p><!--para 3 -->
+ The vfscanf function returns the value of the macro EOF if an input failure occurs
+ before any conversion. Otherwise, the vfscanf function returns the number of input
+ items assigned, which can be fewer than provided for, or even zero, in the event of an
+ early matching failure.
+
+<h5><a name="7.19.6.10" href="#7.19.6.10">7.19.6.10 The vprintf function</a></h5>
+<p><b>Synopsis</b>
+<p><!--para 1 -->
+<pre>
+        #include <a href="#7.15">&lt;stdarg.h&gt;</a>
+        #include <a href="#7.19">&lt;stdio.h&gt;</a>
+        int vprintf(const char * restrict format,
+             va_list arg);
+</pre>
+<p><b>Description</b>
+<p><!--para 2 -->
+ The vprintf function is equivalent to printf, with the variable argument list
+ replaced by arg, which shall have been initialized by the va_start macro (and
+ possibly subsequent va_arg calls). The vprintf function does not invoke the
+ va_end macro.<sup><a href="#note254"><b>254)</b></a></sup>
+<p><b>Returns</b>
+<p><!--para 3 -->
+ The vprintf function returns the number of characters transmitted, or a negative value
+ if an output or encoding error occurred.
+<!--page 306 -->
+
+<h5><a name="7.19.6.11" href="#7.19.6.11">7.19.6.11 The vscanf function</a></h5>
+<p><b>Synopsis</b>
+<p><!--para 1 -->
+<pre>
+        #include <a href="#7.15">&lt;stdarg.h&gt;</a>
+        #include <a href="#7.19">&lt;stdio.h&gt;</a>
+        int vscanf(const char * restrict format,
+             va_list arg);
+</pre>
+<p><b>Description</b>
+<p><!--para 2 -->
+ The vscanf function is equivalent to scanf, with the variable argument list replaced
+ by arg, which shall have been initialized by the va_start macro (and possibly
+ subsequent va_arg calls). The vscanf function does not invoke the va_end
+ macro.<sup><a href="#note254"><b>254)</b></a></sup>
+<p><b>Returns</b>
+<p><!--para 3 -->
+ The vscanf function returns the value of the macro EOF if an input failure occurs
+ before any conversion. Otherwise, the vscanf function returns the number of input
+ items assigned, which can be fewer than provided for, or even zero, in the event of an
+ early matching failure.
+
+<h5><a name="7.19.6.12" href="#7.19.6.12">7.19.6.12 The vsnprintf function</a></h5>
+<p><b>Synopsis</b>
+<p><!--para 1 -->
+<pre>
+        #include <a href="#7.15">&lt;stdarg.h&gt;</a>
+        #include <a href="#7.19">&lt;stdio.h&gt;</a>
+        int vsnprintf(char * restrict s, size_t n,
+             const char * restrict format,
+             va_list arg);
+</pre>
+<p><b>Description</b>
+<p><!--para 2 -->
+ The vsnprintf function is equivalent to snprintf, with the variable argument list
+ replaced by arg, which shall have been initialized by the va_start macro (and
+ possibly subsequent va_arg calls). The vsnprintf function does not invoke the
+ va_end macro.<sup><a href="#note254"><b>254)</b></a></sup> If copying takes place between objects that overlap, the behavior is
+ undefined.
+<p><b>Returns</b>
+<p><!--para 3 -->
+ The vsnprintf function returns the number of characters that would have been written
+ had n been sufficiently large, not counting the terminating null character, or a negative
+ value if an encoding error occurred. Thus, the null-terminated output has been
+ completely written if and only if the returned value is nonnegative and less than n.
+<!--page 307 -->
+
+<h5><a name="7.19.6.13" href="#7.19.6.13">7.19.6.13 The vsprintf function</a></h5>
+<p><b>Synopsis</b>
+<p><!--para 1 -->
+<pre>
+        #include <a href="#7.15">&lt;stdarg.h&gt;</a>
+        #include <a href="#7.19">&lt;stdio.h&gt;</a>
+        int vsprintf(char * restrict s,
+             const char * restrict format,
+             va_list arg);
+</pre>
+<p><b>Description</b>
+<p><!--para 2 -->
+ The vsprintf function is equivalent to sprintf, with the variable argument list
+ replaced by arg, which shall have been initialized by the va_start macro (and
+ possibly subsequent va_arg calls). The vsprintf function does not invoke the
+ va_end macro.<sup><a href="#note254"><b>254)</b></a></sup> If copying takes place between objects that overlap, the behavior is
+ undefined.
+<p><b>Returns</b>
+<p><!--para 3 -->
+ The vsprintf function returns the number of characters written in the array, not
+ counting the terminating null character, or a negative value if an encoding error occurred.
+
+<h5><a name="7.19.6.14" href="#7.19.6.14">7.19.6.14 The vsscanf function</a></h5>
+<p><b>Synopsis</b>
+<p><!--para 1 -->
+<pre>
+        #include <a href="#7.15">&lt;stdarg.h&gt;</a>
+        #include <a href="#7.19">&lt;stdio.h&gt;</a>
+        int vsscanf(const char * restrict s,
+             const char * restrict format,
+             va_list arg);
+</pre>
+<p><b>Description</b>
+<p><!--para 2 -->
+ The vsscanf function is equivalent to sscanf, with the variable argument list
+ replaced by arg, which shall have been initialized by the va_start macro (and
+ possibly subsequent va_arg calls). The vsscanf function does not invoke the
+ va_end macro.<sup><a href="#note254"><b>254)</b></a></sup>
+<p><b>Returns</b>
+<p><!--para 3 -->
+ The vsscanf function returns the value of the macro EOF if an input failure occurs
+ before any conversion. Otherwise, the vsscanf function returns the number of input
+ items assigned, which can be fewer than provided for, or even zero, in the event of an
+ early matching failure.
+<!--page 308 -->
+
+<h4><a name="7.19.7" href="#7.19.7">7.19.7 Character input/output functions</a></h4>
+
+<h5><a name="7.19.7.1" href="#7.19.7.1">7.19.7.1 The fgetc function</a></h5>
+<p><b>Synopsis</b>
+<p><!--para 1 -->
+<pre>
+         #include <a href="#7.19">&lt;stdio.h&gt;</a>
+         int fgetc(FILE *stream);
+</pre>
+<p><b>Description</b>
+<p><!--para 2 -->
+ If the end-of-file indicator for the input stream pointed to by stream is not set and a
+ next character is present, the fgetc function obtains that character as an unsigned
+ char converted to an int and advances the associated file position indicator for the
+ stream (if defined).
+<p><b>Returns</b>
+<p><!--para 3 -->
+ If the end-of-file indicator for the stream is set, or if the stream is at end-of-file, the end-
+ of-file indicator for the stream is set and the fgetc function returns EOF. Otherwise, the
+ fgetc function returns the next character from the input stream pointed to by stream.
+ If a read error occurs, the error indicator for the stream is set and the fgetc function
+ returns EOF.<sup><a href="#note255"><b>255)</b></a></sup>
+
+<p><b>Footnotes</b>
+<p><small><a name="note255" href="#note255">255)</a> An end-of-file and a read error can be distinguished by use of the feof and ferror functions.
+</small>
+
+<h5><a name="7.19.7.2" href="#7.19.7.2">7.19.7.2 The fgets function</a></h5>
+<p><b>Synopsis</b>
+<p><!--para 1 -->
+<pre>
+         #include <a href="#7.19">&lt;stdio.h&gt;</a>
+         char *fgets(char * restrict s, int n,
+              FILE * restrict stream);
+</pre>
+<p><b>Description</b>
+<p><!--para 2 -->
+ The fgets function reads at most one less than the number of characters specified by n
+ from the stream pointed to by stream into the array pointed to by s. No additional
+ characters are read after a new-line character (which is retained) or after end-of-file. A
+ null character is written immediately after the last character read into the array.
+<p><b>Returns</b>
+<p><!--para 3 -->
+ The fgets function returns s if successful. If end-of-file is encountered and no
+ characters have been read into the array, the contents of the array remain unchanged and a
+ null pointer is returned. If a read error occurs during the operation, the array contents are
+ indeterminate and a null pointer is returned.
+<!--page 309 -->
+
+<h5><a name="7.19.7.3" href="#7.19.7.3">7.19.7.3 The fputc function</a></h5>
+<p><b>Synopsis</b>
+<p><!--para 1 -->
+<pre>
+        #include <a href="#7.19">&lt;stdio.h&gt;</a>
+        int fputc(int c, FILE *stream);
+</pre>
+<p><b>Description</b>
+<p><!--para 2 -->
+ The fputc function writes the character specified by c (converted to an unsigned
+ char) to the output stream pointed to by stream, at the position indicated by the
+ associated file position indicator for the stream (if defined), and advances the indicator
+ appropriately. If the file cannot support positioning requests, or if the stream was opened
+ with append mode, the character is appended to the output stream.
+<p><b>Returns</b>
+<p><!--para 3 -->
+ The fputc function returns the character written. If a write error occurs, the error
+ indicator for the stream is set and fputc returns EOF.
+
+<h5><a name="7.19.7.4" href="#7.19.7.4">7.19.7.4 The fputs function</a></h5>
+<p><b>Synopsis</b>
+<p><!--para 1 -->
+<pre>
+        #include <a href="#7.19">&lt;stdio.h&gt;</a>
+        int fputs(const char * restrict s,
+             FILE * restrict stream);
+</pre>
+<p><b>Description</b>
+<p><!--para 2 -->
+ The fputs function writes the string pointed to by s to the stream pointed to by
+ stream. The terminating null character is not written.
+<p><b>Returns</b>
+<p><!--para 3 -->
+ The fputs function returns EOF if a write error occurs; otherwise it returns a
+ nonnegative value.
+
+<h5><a name="7.19.7.5" href="#7.19.7.5">7.19.7.5 The getc function</a></h5>
+<p><b>Synopsis</b>
+<p><!--para 1 -->
+<pre>
+        #include <a href="#7.19">&lt;stdio.h&gt;</a>
+        int getc(FILE *stream);
+</pre>
+<p><b>Description</b>
+<p><!--para 2 -->
+ The getc function is equivalent to fgetc, except that if it is implemented as a macro, it
+ may evaluate stream more than once, so the argument should never be an expression
+ with side effects.
+<!--page 310 -->
+<p><b>Returns</b>
+<p><!--para 3 -->
+ The getc function returns the next character from the input stream pointed to by
+ stream. If the stream is at end-of-file, the end-of-file indicator for the stream is set and
+ getc returns EOF. If a read error occurs, the error indicator for the stream is set and
+ getc returns EOF.
+
+<h5><a name="7.19.7.6" href="#7.19.7.6">7.19.7.6 The getchar function</a></h5>
+<p><b>Synopsis</b>
+<p><!--para 1 -->
+<pre>
+        #include <a href="#7.19">&lt;stdio.h&gt;</a>
+        int getchar(void);
+</pre>
+<p><b>Description</b>
+<p><!--para 2 -->
+ The getchar function is equivalent to getc with the argument stdin.
+<p><b>Returns</b>
+<p><!--para 3 -->
+ The getchar function returns the next character from the input stream pointed to by
+ stdin. If the stream is at end-of-file, the end-of-file indicator for the stream is set and
+ getchar returns EOF. If a read error occurs, the error indicator for the stream is set and
+ getchar returns EOF.
+
+<h5><a name="7.19.7.7" href="#7.19.7.7">7.19.7.7 The gets function</a></h5>
+<p><b>Synopsis</b>
+<p><!--para 1 -->
+<pre>
+        #include <a href="#7.19">&lt;stdio.h&gt;</a>
+        char *gets(char *s);
+</pre>
+<p><b>Description</b>
+<p><!--para 2 -->
+ The gets function reads characters from the input stream pointed to by stdin, into the
+ array pointed to by s, until end-of-file is encountered or a new-line character is read.
+ Any new-line character is discarded, and a null character is written immediately after the
+ last character read into the array.
+<p><b>Returns</b>
+<p><!--para 3 -->
+ The gets function returns s if successful. If end-of-file is encountered and no
+ characters have been read into the array, the contents of the array remain unchanged and a
+ null pointer is returned. If a read error occurs during the operation, the array contents are
+ indeterminate and a null pointer is returned.
+<p><b> Forward references</b>: future library directions (<a href="#7.26.9">7.26.9</a>).
+<!--page 311 -->
+
+<h5><a name="7.19.7.8" href="#7.19.7.8">7.19.7.8 The putc function</a></h5>
+<p><b>Synopsis</b>
+<p><!--para 1 -->
+<pre>
+        #include <a href="#7.19">&lt;stdio.h&gt;</a>
+        int putc(int c, FILE *stream);
+</pre>
+<p><b>Description</b>
+<p><!--para 2 -->
+ The putc function is equivalent to fputc, except that if it is implemented as a macro, it
+ may evaluate stream more than once, so that argument should never be an expression
+ with side effects.
+<p><b>Returns</b>
+<p><!--para 3 -->
+ The putc function returns the character written. If a write error occurs, the error
+ indicator for the stream is set and putc returns EOF.
+
+<h5><a name="7.19.7.9" href="#7.19.7.9">7.19.7.9 The putchar function</a></h5>
+<p><b>Synopsis</b>
+<p><!--para 1 -->
+<pre>
+        #include <a href="#7.19">&lt;stdio.h&gt;</a>
+        int putchar(int c);
+</pre>
+<p><b>Description</b>
+<p><!--para 2 -->
+ The putchar function is equivalent to putc with the second argument stdout.
+<p><b>Returns</b>
+<p><!--para 3 -->
+ The putchar function returns the character written. If a write error occurs, the error
+ indicator for the stream is set and putchar returns EOF.
+
+<h5><a name="7.19.7.10" href="#7.19.7.10">7.19.7.10 The puts function</a></h5>
+<p><b>Synopsis</b>
+<p><!--para 1 -->
+<pre>
+        #include <a href="#7.19">&lt;stdio.h&gt;</a>
+        int puts(const char *s);
+</pre>
+<p><b>Description</b>
+<p><!--para 2 -->
+ The puts function writes the string pointed to by s to the stream pointed to by stdout,
+ and appends a new-line character to the output. The terminating null character is not
+ written.
+<p><b>Returns</b>
+<p><!--para 3 -->
+ The puts function returns EOF if a write error occurs; otherwise it returns a nonnegative
+ value.
+<!--page 312 -->
+
+<h5><a name="7.19.7.11" href="#7.19.7.11">7.19.7.11 The ungetc function</a></h5>
+<p><b>Synopsis</b>
+<p><!--para 1 -->
+<pre>
+          #include <a href="#7.19">&lt;stdio.h&gt;</a>
+          int ungetc(int c, FILE *stream);
+</pre>
+<p><b>Description</b>
+<p><!--para 2 -->
+ The ungetc function pushes the character specified by c (converted to an unsigned
+ char) back onto the input stream pointed to by stream. Pushed-back characters will be
+ returned by subsequent reads on that stream in the reverse order of their pushing. A
+ successful intervening call (with the stream pointed to by stream) to a file positioning
+ function (fseek, fsetpos, or rewind) discards any pushed-back characters for the
+ stream. The external storage corresponding to the stream is unchanged.
+<p><!--para 3 -->
+ One character of pushback is guaranteed. If the ungetc function is called too many
+ times on the same stream without an intervening read or file positioning operation on that
+ stream, the operation may fail.
+<p><!--para 4 -->
+ If the value of c equals that of the macro EOF, the operation fails and the input stream is
+ unchanged.
+<p><!--para 5 -->
+ A successful call to the ungetc function clears the end-of-file indicator for the stream.
+ The value of the file position indicator for the stream after reading or discarding all
+ pushed-back characters shall be the same as it was before the characters were pushed
+ back. For a text stream, the value of its file position indicator after a successful call to the
+ ungetc function is unspecified until all pushed-back characters are read or discarded.
+ For a binary stream, its file position indicator is decremented by each successful call to
+ the ungetc function; if its value was zero before a call, it is indeterminate after the
+ call.<sup><a href="#note256"><b>256)</b></a></sup>
+<p><b>Returns</b>
+<p><!--para 6 -->
+ The ungetc function returns the character pushed back after conversion, or EOF if the
+ operation fails.
+<p><b> Forward references</b>: file positioning functions (<a href="#7.19.9">7.19.9</a>).
+<!--page 313 -->
+
+<p><b>Footnotes</b>
+<p><small><a name="note256" href="#note256">256)</a> See ''future library directions'' (<a href="#7.26.9">7.26.9</a>).
+</small>
+
+<h4><a name="7.19.8" href="#7.19.8">7.19.8 Direct input/output functions</a></h4>
+
+<h5><a name="7.19.8.1" href="#7.19.8.1">7.19.8.1 The fread function</a></h5>
+<p><b>Synopsis</b>
+<p><!--para 1 -->
+<pre>
+        #include <a href="#7.19">&lt;stdio.h&gt;</a>
         size_t fread(void * restrict ptr,
              size_t size, size_t nmemb,
              FILE * restrict stream);
+</pre>
+<p><b>Description</b>
+<p><!--para 2 -->
+ The fread function reads, into the array pointed to by ptr, up to nmemb elements
+ whose size is specified by size, from the stream pointed to by stream. For each
+ object, size calls are made to the fgetc function and the results stored, in the order
+ read, in an array of unsigned char exactly overlaying the object. The file position
+ indicator for the stream (if defined) is advanced by the number of characters successfully
+ read. If an error occurs, the resulting value of the file position indicator for the stream is
+ indeterminate. If a partial element is read, its value is indeterminate.
+<p><b>Returns</b>
+<p><!--para 3 -->
+ The fread function returns the number of elements successfully read, which may be
+ less than nmemb if a read error or end-of-file is encountered. If size or nmemb is zero,
+ fread returns zero and the contents of the array and the state of the stream remain
+ unchanged.
+
+<h5><a name="7.19.8.2" href="#7.19.8.2">7.19.8.2 The fwrite function</a></h5>
+<p><b>Synopsis</b>
+<p><!--para 1 -->
+<pre>
+        #include <a href="#7.19">&lt;stdio.h&gt;</a>
         size_t fwrite(const void * restrict ptr,
              size_t size, size_t nmemb,
              FILE * restrict stream);
+</pre>
+<p><b>Description</b>
+<p><!--para 2 -->
+ The fwrite function writes, from the array pointed to by ptr, up to nmemb elements
+ whose size is specified by size, to the stream pointed to by stream. For each object,
+ size calls are made to the fputc function, taking the values (in order) from an array of
+ unsigned char exactly overlaying the object. The file position indicator for the
+ stream (if defined) is advanced by the number of characters successfully written. If an
+ error occurs, the resulting value of the file position indicator for the stream is
+ indeterminate.
+<!--page 314 -->
+<p><b>Returns</b>
+<p><!--para 3 -->
+ The fwrite function returns the number of elements successfully written, which will be
+ less than nmemb only if a write error is encountered. If size or nmemb is zero,
+ fwrite returns zero and the state of the stream remains unchanged.
+
+<h4><a name="7.19.9" href="#7.19.9">7.19.9 File positioning functions</a></h4>
+
+<h5><a name="7.19.9.1" href="#7.19.9.1">7.19.9.1 The fgetpos function</a></h5>
+<p><b>Synopsis</b>
+<p><!--para 1 -->
+<pre>
+        #include <a href="#7.19">&lt;stdio.h&gt;</a>
         int fgetpos(FILE * restrict stream,
              fpos_t * restrict pos);
+</pre>
+<p><b>Description</b>
+<p><!--para 2 -->
+ The fgetpos function stores the current values of the parse state (if any) and file
+ position indicator for the stream pointed to by stream in the object pointed to by pos.
+ The values stored contain unspecified information usable by the fsetpos function for
+ repositioning the stream to its position at the time of the call to the fgetpos function.
+<p><b>Returns</b>
+<p><!--para 3 -->
+ If successful, the fgetpos function returns zero; on failure, the fgetpos function
+ returns nonzero and stores an implementation-defined positive value in errno.
+<p><b> Forward references</b>: the fsetpos function (<a href="#7.19.9.3">7.19.9.3</a>).
+
+<h5><a name="7.19.9.2" href="#7.19.9.2">7.19.9.2 The fseek function</a></h5>
+<p><b>Synopsis</b>
+<p><!--para 1 -->
+<pre>
+        #include <a href="#7.19">&lt;stdio.h&gt;</a>
         int fseek(FILE *stream, long int offset, int whence);
+</pre>
+<p><b>Description</b>
+<p><!--para 2 -->
+ The fseek function sets the file position indicator for the stream pointed to by stream.
+ If a read or write error occurs, the error indicator for the stream is set and fseek fails.
+<p><!--para 3 -->
+ For a binary stream, the new position, measured in characters from the beginning of the
+ file, is obtained by adding offset to the position specified by whence. The specified
+ position is the beginning of the file if whence is SEEK_SET, the current value of the file
+ position indicator if SEEK_CUR, or end-of-file if SEEK_END. A binary stream need not
+ meaningfully support fseek calls with a whence value of SEEK_END.
+<p><!--para 4 -->
+ For a text stream, either offset shall be zero, or offset shall be a value returned by
+ an earlier successful call to the ftell function on a stream associated with the same file
+ and whence shall be SEEK_SET.
+<!--page 315 -->
+<p><!--para 5 -->
+ After determining the new position, a successful call to the fseek function undoes any
+ effects of the ungetc function on the stream, clears the end-of-file indicator for the
+ stream, and then establishes the new position. After a successful fseek call, the next
+ operation on an update stream may be either input or output.
+<p><b>Returns</b>
+<p><!--para 6 -->
+ The fseek function returns nonzero only for a request that cannot be satisfied.
+<p><b> Forward references</b>: the ftell function (<a href="#7.19.9.4">7.19.9.4</a>).
+
+<h5><a name="7.19.9.3" href="#7.19.9.3">7.19.9.3 The fsetpos function</a></h5>
+<p><b>Synopsis</b>
+<p><!--para 1 -->
+<pre>
+        #include <a href="#7.19">&lt;stdio.h&gt;</a>
         int fsetpos(FILE *stream, const fpos_t *pos);
+</pre>
+<p><b>Description</b>
+<p><!--para 2 -->
+ The fsetpos function sets the mbstate_t object (if any) and file position indicator
+ for the stream pointed to by stream according to the value of the object pointed to by
+ pos, which shall be a value obtained from an earlier successful call to the fgetpos
+ function on a stream associated with the same file. If a read or write error occurs, the
+ error indicator for the stream is set and fsetpos fails.
+<p><!--para 3 -->
+ A successful call to the fsetpos function undoes any effects of the ungetc function
+ on the stream, clears the end-of-file indicator for the stream, and then establishes the new
+ parse state and position. After a successful fsetpos call, the next operation on an
+ update stream may be either input or output.
+<p><b>Returns</b>
+<p><!--para 4 -->
+ If successful, the fsetpos function returns zero; on failure, the fsetpos function
+ returns nonzero and stores an implementation-defined positive value in errno.
+
+<h5><a name="7.19.9.4" href="#7.19.9.4">7.19.9.4 The ftell function</a></h5>
+<p><b>Synopsis</b>
+<p><!--para 1 -->
+<pre>
+        #include <a href="#7.19">&lt;stdio.h&gt;</a>
         long int ftell(FILE *stream);
+</pre>
+<p><b>Description</b>
+<p><!--para 2 -->
+ The ftell function obtains the current value of the file position indicator for the stream
+ pointed to by stream. For a binary stream, the value is the number of characters from
+ the beginning of the file. For a text stream, its file position indicator contains unspecified
+ information, usable by the fseek function for returning the file position indicator for the
+ stream to its position at the time of the ftell call; the difference between two such
+ return values is not necessarily a meaningful measure of the number of characters written
+<!--page 316 -->
+ or read.
+<p><b>Returns</b>
+<p><!--para 3 -->
+ If successful, the ftell function returns the current value of the file position indicator
+ for the stream. On failure, the ftell function returns -1L and stores an
+ implementation-defined positive value in errno.
+
+<h5><a name="7.19.9.5" href="#7.19.9.5">7.19.9.5 The rewind function</a></h5>
+<p><b>Synopsis</b>
+<p><!--para 1 -->
+<pre>
+        #include <a href="#7.19">&lt;stdio.h&gt;</a>
         void rewind(FILE *stream);
+</pre>
+<p><b>Description</b>
+<p><!--para 2 -->
+ The rewind function sets the file position indicator for the stream pointed to by
+ stream to the beginning of the file. It is equivalent to
+<pre>
+        (void)fseek(stream, 0L, SEEK_SET)
+</pre>
+ except that the error indicator for the stream is also cleared.
+<p><b>Returns</b>
+<p><!--para 3 -->
+ The rewind function returns no value.
+
+<h4><a name="7.19.10" href="#7.19.10">7.19.10 Error-handling functions</a></h4>
+
+<h5><a name="7.19.10.1" href="#7.19.10.1">7.19.10.1 The clearerr function</a></h5>
+<p><b>Synopsis</b>
+<p><!--para 1 -->
+<pre>
+        #include <a href="#7.19">&lt;stdio.h&gt;</a>
         void clearerr(FILE *stream);
+</pre>
+<p><b>Description</b>
+<p><!--para 2 -->
+ The clearerr function clears the end-of-file and error indicators for the stream pointed
+ to by stream.
+<p><b>Returns</b>
+<p><!--para 3 -->
+ The clearerr function returns no value.
+<!--page 317 -->
+
+<h5><a name="7.19.10.2" href="#7.19.10.2">7.19.10.2 The feof function</a></h5>
+<p><b>Synopsis</b>
+<p><!--para 1 -->
+<pre>
+        #include <a href="#7.19">&lt;stdio.h&gt;</a>
         int feof(FILE *stream);
+</pre>
+<p><b>Description</b>
+<p><!--para 2 -->
+ The feof function tests the end-of-file indicator for the stream pointed to by stream.
+<p><b>Returns</b>
+<p><!--para 3 -->
+ The feof function returns nonzero if and only if the end-of-file indicator is set for
+ stream.
+
+<h5><a name="7.19.10.3" href="#7.19.10.3">7.19.10.3 The ferror function</a></h5>
+<p><b>Synopsis</b>
+<p><!--para 1 -->
+<pre>
+        #include <a href="#7.19">&lt;stdio.h&gt;</a>
         int ferror(FILE *stream);
+</pre>
+<p><b>Description</b>
+<p><!--para 2 -->
+ The ferror function tests the error indicator for the stream pointed to by stream.
+<p><b>Returns</b>
+<p><!--para 3 -->
+ The ferror function returns nonzero if and only if the error indicator is set for
+ stream.
+
+<h5><a name="7.19.10.4" href="#7.19.10.4">7.19.10.4 The perror function</a></h5>
+<p><b>Synopsis</b>
+<p><!--para 1 -->
+<pre>
+        #include <a href="#7.19">&lt;stdio.h&gt;</a>
         void perror(const char *s);
-<a name="B.19" href="#B.19"><b>B.19 General utilities &lt;stdlib.h&gt;</b></a>
-        size_t       ldiv_t             EXIT_FAILURE      MB_CUR_MAX
-        wchar_t      lldiv_t            EXIT_SUCCESS
-        div_t        NULL               RAND_MAX
+</pre>
+<p><b>Description</b>
+<p><!--para 2 -->
+ The perror function maps the error number in the integer expression errno to an
+ error message. It writes a sequence of characters to the standard error stream thus: first
+ (if s is not a null pointer and the character pointed to by s is not the null character), the
+ string pointed to by s followed by a colon (:) and a space; then an appropriate error
+ message string followed by a new-line character. The contents of the error message
+ strings are the same as those returned by the strerror function with argument errno.
+<p><b>Returns</b>
+<p><!--para 3 -->
+ The perror function returns no value.
+<p><b> Forward references</b>: the strerror function (<a href="#7.21.6.2">7.21.6.2</a>).
+<!--page 318 -->
+
+<h3><a name="7.20" href="#7.20">7.20 General utilities &lt;stdlib.h&gt;</a></h3>
+<p><!--para 1 -->
+ The header <a href="#7.20">&lt;stdlib.h&gt;</a> declares five types and several functions of general utility, and
+ defines several macros.<sup><a href="#note257"><b>257)</b></a></sup>
+<p><!--para 2 -->
+ The types declared are size_t and wchar_t (both described in <a href="#7.17">7.17</a>),
+<pre>
+          div_t
+</pre>
+ which is a structure type that is the type of the value returned by the div function,
+<pre>
+          ldiv_t
+</pre>
+ which is a structure type that is the type of the value returned by the ldiv function, and
+<pre>
+          lldiv_t
+</pre>
+ which is a structure type that is the type of the value returned by the lldiv function.
+<p><!--para 3 -->
+ The macros defined are NULL (described in <a href="#7.17">7.17</a>);
+<pre>
+          EXIT_FAILURE
+</pre>
+ and
+<pre>
+          EXIT_SUCCESS
+</pre>
+ which expand to integer constant expressions that can be used as the argument to the
+ exit function to return unsuccessful or successful termination status, respectively, to the
+ host environment;
+<pre>
+          RAND_MAX
+</pre>
+ which expands to an integer constant expression that is the maximum value returned by
+ the rand function; and
+<pre>
+          MB_CUR_MAX
+</pre>
+ which expands to a positive integer expression with type size_t that is the maximum
+ number of bytes in a multibyte character for the extended character set specified by the
+ current locale (category LC_CTYPE), which is never greater than MB_LEN_MAX.
+<!--page 319 -->
+
+<p><b>Footnotes</b>
+<p><small><a name="note257" href="#note257">257)</a> See ''future library directions'' (<a href="#7.26.10">7.26.10</a>).
+</small>
+
+<h4><a name="7.20.1" href="#7.20.1">7.20.1 Numeric conversion functions</a></h4>
+<p><!--para 1 -->
+ The functions atof, atoi, atol, and atoll need not affect the value of the integer
+ expression errno on an error. If the value of the result cannot be represented, the
+ behavior is undefined.
+
+<h5><a name="7.20.1.1" href="#7.20.1.1">7.20.1.1 The atof function</a></h5>
+<p><b>Synopsis</b>
+<p><!--para 1 -->
+<pre>
+        #include <a href="#7.20">&lt;stdlib.h&gt;</a>
         double atof(const char *nptr);
+</pre>
+<p><b>Description</b>
+<p><!--para 2 -->
+ The atof function converts the initial portion of the string pointed to by nptr to
+ double representation. Except for the behavior on error, it is equivalent to
+<pre>
+        strtod(nptr, (char **)NULL)
+</pre>
+<p><b>Returns</b>
+<p><!--para 3 -->
+ The atof function returns the converted value.
+<p><b> Forward references</b>: the strtod, strtof, and strtold functions (<a href="#7.20.1.3">7.20.1.3</a>).
+
+<h5><a name="7.20.1.2" href="#7.20.1.2">7.20.1.2 The atoi, atol, and atoll functions</a></h5>
+<p><b>Synopsis</b>
+<p><!--para 1 -->
+<pre>
+        #include <a href="#7.20">&lt;stdlib.h&gt;</a>
         int atoi(const char *nptr);
         long int atol(const char *nptr);
         long long int atoll(const char *nptr);
+</pre>
+<p><b>Description</b>
+<p><!--para 2 -->
+ The atoi, atol, and atoll functions convert the initial portion of the string pointed
+ to by nptr to int, long int, and long long int representation, respectively.
+ Except for the behavior on error, they are equivalent to
+<pre>
+        atoi: (int)strtol(nptr, (char **)NULL, 10)
+        atol: strtol(nptr, (char **)NULL, 10)
+        atoll: strtoll(nptr, (char **)NULL, 10)
+</pre>
+<p><b>Returns</b>
+<p><!--para 3 -->
+ The atoi, atol, and atoll functions return the converted value.
+<p><b> Forward references</b>: the strtol, strtoll, strtoul, and strtoull functions
+ (<a href="#7.20.1.4">7.20.1.4</a>).
+<!--page 320 -->
+
+<h5><a name="7.20.1.3" href="#7.20.1.3">7.20.1.3 The strtod, strtof, and strtold functions</a></h5>
+<p><b>Synopsis</b>
+<p><!--para 1 -->
+<pre>
+        #include <a href="#7.20">&lt;stdlib.h&gt;</a>
         double strtod(const char * restrict nptr,
              char ** restrict endptr);
         float strtof(const char * restrict nptr,
              char ** restrict endptr);
         long double strtold(const char * restrict nptr,
              char ** restrict endptr);
-        long int strtol(const char * restrict nptr,
-             char ** restrict endptr, int base);
-        long long int strtoll(const char * restrict nptr,
-             char ** restrict endptr, int base);
-        unsigned long int strtoul(
-             const char * restrict nptr,
-             char ** restrict endptr, int base);
-
-
-
-
-[<a name="p431" href="#p431">page 431</a>] (<a href="#Contents">Contents</a>)
-
-      unsigned long long int strtoull(
-           const char * restrict nptr,
-           char ** restrict endptr, int base);
-      int rand(void);
-      void srand(unsigned int seed);
-      void *calloc(size_t nmemb, size_t size);
-      void free(void *ptr);
-      void *malloc(size_t size);
-      void *realloc(void *ptr, size_t size);
-      void abort(void);
-      int atexit(void (*func)(void));
-      void exit(int status);
-      void _Exit(int status);
-      char *getenv(const char *name);
-      int system(const char *string);
-      void *bsearch(const void *key, const void *base,
-           size_t nmemb, size_t size,
-           int (*compar)(const void *, const void *));
-      void qsort(void *base, size_t nmemb, size_t size,
-           int (*compar)(const void *, const void *));
-      int abs(int j);
-      long int labs(long int j);
-      long long int llabs(long long int j);
-      div_t div(int numer, int denom);
-      ldiv_t ldiv(long int numer, long int denom);
-      lldiv_t lldiv(long long int numer,
-           long long int denom);
-      int mblen(const char *s, size_t n);
-      int mbtowc(wchar_t * restrict pwc,
-           const char * restrict s, size_t n);
-      int wctomb(char *s, wchar_t wchar);
-      size_t mbstowcs(wchar_t * restrict pwcs,
-           const char * restrict s, size_t n);
-      size_t wcstombs(char * restrict s,
-           const wchar_t * restrict pwcs, size_t n);
-
-
-
-
-[<a name="p432" href="#p432">page 432</a>] (<a href="#Contents">Contents</a>)
-
-<a name="B.20" href="#B.20"><b>B.20 String handling &lt;string.h&gt;</b></a>
-        size_t
-        NULL
-        void *memcpy(void * restrict s1,
-             const void * restrict s2, size_t n);
+</pre>
+<p><b>Description</b>
+<p><!--para 2 -->
+ The strtod, strtof, and strtold functions convert the initial portion of the string
+ pointed to by nptr to double, float, and long double representation,
+ respectively. First, they decompose the input string into three parts: an initial, possibly
+ empty, sequence of white-space characters (as specified by the isspace function), a
+ subject sequence resembling a floating-point constant or representing an infinity or NaN;
+ and a final string of one or more unrecognized characters, including the terminating null
+ character of the input string. Then, they attempt to convert the subject sequence to a
+ floating-point number, and return the result.
+<p><!--para 3 -->
+ The expected form of the subject sequence is an optional plus or minus sign, then one of
+ the following:
+<ul>
+<li>  a nonempty sequence of decimal digits optionally containing a decimal-point
+ character, then an optional exponent part as defined in <a href="#6.4.4.2">6.4.4.2</a>;
+<li>  a 0x or 0X, then a nonempty sequence of hexadecimal digits optionally containing a
+ decimal-point character, then an optional binary exponent part as defined in <a href="#6.4.4.2">6.4.4.2</a>;
+<li>  INF or INFINITY, ignoring case
+<li>  NAN or NAN(n-char-sequence<sub>opt</sub>), ignoring case in the NAN part, where:
+<pre>
+          n-char-sequence:
+                 digit
+                 nondigit
+                 n-char-sequence digit
+                 n-char-sequence nondigit
+</pre>
+</ul>
+ The subject sequence is defined as the longest initial subsequence of the input string,
+ starting with the first non-white-space character, that is of the expected form. The subject
+ sequence contains no characters if the input string is not of the expected form.
+<p><!--para 4 -->
+ If the subject sequence has the expected form for a floating-point number, the sequence of
+ characters starting with the first digit or the decimal-point character (whichever occurs
+ first) is interpreted as a floating constant according to the rules of <a href="#6.4.4.2">6.4.4.2</a>, except that the
+<!--page 321 -->
+ decimal-point character is used in place of a period, and that if neither an exponent part
+ nor a decimal-point character appears in a decimal floating point number, or if a binary
+ exponent part does not appear in a hexadecimal floating point number, an exponent part
+ of the appropriate type with value zero is assumed to follow the last digit in the string. If
+ the subject sequence begins with a minus sign, the sequence is interpreted as negated.<sup><a href="#note258"><b>258)</b></a></sup>
+ A character sequence INF or INFINITY is interpreted as an infinity, if representable in
+ the return type, else like a floating constant that is too large for the range of the return
+ type. A character sequence NAN or NAN(n-char-sequence<sub>opt</sub>), is interpreted as a quiet
+ NaN, if supported in the return type, else like a subject sequence part that does not have
+ the expected form; the meaning of the n-char sequences is implementation-defined.<sup><a href="#note259"><b>259)</b></a></sup> A
+ pointer to the final string is stored in the object pointed to by endptr, provided that
+ endptr is not a null pointer.
+<p><!--para 5 -->
+ If the subject sequence has the hexadecimal form and FLT_RADIX is a power of 2, the
+ value resulting from the conversion is correctly rounded.
+<p><!--para 6 -->
+ In other than the "C" locale, additional locale-specific subject sequence forms may be
+ accepted.
+<p><!--para 7 -->
+ If the subject sequence is empty or does not have the expected form, no conversion is
+ performed; the value of nptr is stored in the object pointed to by endptr, provided
+ that endptr is not a null pointer.
+<p><b>Recommended practice</b>
+<p><!--para 8 -->
+ If the subject sequence has the hexadecimal form, FLT_RADIX is not a power of 2, and
+ the result is not exactly representable, the result should be one of the two numbers in the
+ appropriate internal format that are adjacent to the hexadecimal floating source value,
+ with the extra stipulation that the error should have a correct sign for the current rounding
+ direction.
+<p><!--para 9 -->
+ If the subject sequence has the decimal form and at most DECIMAL_DIG (defined in
+ <a href="#7.7">&lt;float.h&gt;</a>) significant digits, the result should be correctly rounded. If the subject
+ sequence D has the decimal form and more than DECIMAL_DIG significant digits,
+ consider the two bounding, adjacent decimal strings L and U, both having
+ DECIMAL_DIG significant digits, such that the values of L, D, and U satisfy L &lt;= D &lt;= U.
+ The result should be one of the (equal or adjacent) values that would be obtained by
+ correctly rounding L and U according to the current rounding direction, with the extra
+<!--page 322 -->
+ stipulation that the error with respect to D should have a correct sign for the current
+ rounding direction.<sup><a href="#note260"><b>260)</b></a></sup>
+<p><b>Returns</b>
+<p><!--para 10 -->
+ The functions return the converted value, if any. If no conversion could be performed,
+ zero is returned. If the correct value is outside the range of representable values, plus or
+ minus HUGE_VAL, HUGE_VALF, or HUGE_VALL is returned (according to the return
+ type and sign of the value), and the value of the macro ERANGE is stored in errno. If
+ the result underflows (<a href="#7.12.1">7.12.1</a>), the functions return a value whose magnitude is no greater
+ than the smallest normalized positive number in the return type; whether errno acquires
+ the value ERANGE is implementation-defined.
+
+<p><b>Footnotes</b>
+<p><small><a name="note258" href="#note258">258)</a> It is unspecified whether a minus-signed sequence is converted to a negative number directly or by
+ negating the value resulting from converting the corresponding unsigned sequence (see <a href="#F.5">F.5</a>); the two
+ methods may yield different results if rounding is toward positive or negative infinity. In either case,
+ the functions honor the sign of zero if floating-point arithmetic supports signed zeros.
+</small>
+<p><small><a name="note259" href="#note259">259)</a> An implementation may use the n-char sequence to determine extra information to be represented in
+ the NaN's significand.
+</small>
+<p><small><a name="note260" href="#note260">260)</a> DECIMAL_DIG, defined in <a href="#7.7">&lt;float.h&gt;</a>, should be sufficiently large that L and U will usually round
+ to the same internal floating value, but if not will round to adjacent values.
+</small>
+
+<h5><a name="7.20.1.4" href="#7.20.1.4">7.20.1.4 The strtol, strtoll, strtoul, and strtoull functions</a></h5>
+<p><b>Synopsis</b>
+<p><!--para 1 -->
+<pre>
+         #include <a href="#7.20">&lt;stdlib.h&gt;</a>
+         long int strtol(
+              const char * restrict nptr,
+              char ** restrict endptr,
+              int base);
+         long long int strtoll(
+              const char * restrict nptr,
+              char ** restrict endptr,
+              int base);
+         unsigned long int strtoul(
+              const char * restrict nptr,
+              char ** restrict endptr,
+              int base);
+         unsigned long long int strtoull(
+              const char * restrict nptr,
+              char ** restrict endptr,
+              int base);
+</pre>
+<p><b>Description</b>
+<p><!--para 2 -->
+ The strtol, strtoll, strtoul, and strtoull functions convert the initial
+ portion of the string pointed to by nptr to long int, long long int, unsigned
+ long int, and unsigned long long int representation, respectively. First,
+ they decompose the input string into three parts: an initial, possibly empty, sequence of
+ white-space characters (as specified by the isspace function), a subject sequence
+<!--page 323 -->
+ resembling an integer represented in some radix determined by the value of base, and a
+ final string of one or more unrecognized characters, including the terminating null
+ character of the input string. Then, they attempt to convert the subject sequence to an
+ integer, and return the result.
+<p><!--para 3 -->
+ If the value of base is zero, the expected form of the subject sequence is that of an
+ integer constant as described in <a href="#6.4.4.1">6.4.4.1</a>, optionally preceded by a plus or minus sign, but
+ not including an integer suffix. If the value of base is between 2 and 36 (inclusive), the
+ expected form of the subject sequence is a sequence of letters and digits representing an
+ integer with the radix specified by base, optionally preceded by a plus or minus sign,
+ but not including an integer suffix. The letters from a (or A) through z (or Z) are
+ ascribed the values 10 through 35; only letters and digits whose ascribed values are less
+ than that of base are permitted. If the value of base is 16, the characters 0x or 0X may
+ optionally precede the sequence of letters and digits, following the sign if present.
+<p><!--para 4 -->
+ The subject sequence is defined as the longest initial subsequence of the input string,
+ starting with the first non-white-space character, that is of the expected form. The subject
+ sequence contains no characters if the input string is empty or consists entirely of white
+ space, or if the first non-white-space character is other than a sign or a permissible letter
+ or digit.
+<p><!--para 5 -->
+ If the subject sequence has the expected form and the value of base is zero, the sequence
+ of characters starting with the first digit is interpreted as an integer constant according to
+ the rules of <a href="#6.4.4.1">6.4.4.1</a>. If the subject sequence has the expected form and the value of base
+ is between 2 and 36, it is used as the base for conversion, ascribing to each letter its value
+ as given above. If the subject sequence begins with a minus sign, the value resulting from
+ the conversion is negated (in the return type). A pointer to the final string is stored in the
+ object pointed to by endptr, provided that endptr is not a null pointer.
+<p><!--para 6 -->
+ In other than the "C" locale, additional locale-specific subject sequence forms may be
+ accepted.
+<p><!--para 7 -->
+ If the subject sequence is empty or does not have the expected form, no conversion is
+ performed; the value of nptr is stored in the object pointed to by endptr, provided
+ that endptr is not a null pointer.
+<p><b>Returns</b>
+<p><!--para 8 -->
+ The strtol, strtoll, strtoul, and strtoull functions return the converted
+ value, if any. If no conversion could be performed, zero is returned. If the correct value
+ is outside the range of representable values, LONG_MIN, LONG_MAX, LLONG_MIN,
+ LLONG_MAX, ULONG_MAX, or ULLONG_MAX is returned (according to the return type
+ and sign of the value, if any), and the value of the macro ERANGE is stored in errno.
+<!--page 324 -->
+
+<h4><a name="7.20.2" href="#7.20.2">7.20.2 Pseudo-random sequence generation functions</a></h4>
+
+<h5><a name="7.20.2.1" href="#7.20.2.1">7.20.2.1 The rand function</a></h5>
+<p><b>Synopsis</b>
+<p><!--para 1 -->
+<pre>
+        #include <a href="#7.20">&lt;stdlib.h&gt;</a>
+        int rand(void);
+</pre>
+<p><b>Description</b>
+<p><!--para 2 -->
+ The rand function computes a sequence of pseudo-random integers in the range 0 to
+ RAND_MAX.
+<p><!--para 3 -->
+ The implementation shall behave as if no library function calls the rand function.
+<p><b>Returns</b>
+<p><!--para 4 -->
+ The rand function returns a pseudo-random integer.
+<p><b>Environmental limits</b>
+<p><!--para 5 -->
+ The value of the RAND_MAX macro shall be at least 32767.
+
+<h5><a name="7.20.2.2" href="#7.20.2.2">7.20.2.2 The srand function</a></h5>
+<p><b>Synopsis</b>
+<p><!--para 1 -->
+<pre>
+        #include <a href="#7.20">&lt;stdlib.h&gt;</a>
+        void srand(unsigned int seed);
+</pre>
+<p><b>Description</b>
+<p><!--para 2 -->
+ The srand function uses the argument as a seed for a new sequence of pseudo-random
+ numbers to be returned by subsequent calls to rand. If srand is then called with the
+ same seed value, the sequence of pseudo-random numbers shall be repeated. If rand is
+ called before any calls to srand have been made, the same sequence shall be generated
+ as when srand is first called with a seed value of 1.
+<p><!--para 3 -->
+ The implementation shall behave as if no library function calls the srand function.
+<p><b>Returns</b>
+<p><!--para 4 -->
+ The srand function returns no value.
+<p><!--para 5 -->
+ EXAMPLE       The following functions define a portable implementation of rand and srand.
+<!--page 325 -->
+<pre>
+        static unsigned long int next = 1;
+        int rand(void)   // RAND_MAX assumed to be 32767
+        {
+              next = next * 1103515245 + 12345;
+              return (unsigned int)(next/65536) % 32768;
+        }
+         void srand(unsigned int seed)
+         {
+               next = seed;
+         }
+</pre>
+
+<h4><a name="7.20.3" href="#7.20.3">7.20.3 Memory management functions</a></h4>
+<p><!--para 1 -->
+ The order and contiguity of storage allocated by successive calls to the calloc,
+ malloc, and realloc functions is unspecified. The pointer returned if the allocation
+ succeeds is suitably aligned so that it may be assigned to a pointer to any type of object
+ and then used to access such an object or an array of such objects in the space allocated
+ (until the space is explicitly deallocated). The lifetime of an allocated object extends
+ from the allocation until the deallocation. Each such allocation shall yield a pointer to an
+ object disjoint from any other object. The pointer returned points to the start (lowest byte
+ address) of the allocated space. If the space cannot be allocated, a null pointer is
+ returned. If the size of the space requested is zero, the behavior is implementation-
+ defined: either a null pointer is returned, or the behavior is as if the size were some
+ nonzero value, except that the returned pointer shall not be used to access an object.
+
+<h5><a name="7.20.3.1" href="#7.20.3.1">7.20.3.1 The calloc function</a></h5>
+<p><b>Synopsis</b>
+<p><!--para 1 -->
+<pre>
+         #include <a href="#7.20">&lt;stdlib.h&gt;</a>
+         void *calloc(size_t nmemb, size_t size);
+</pre>
+<p><b>Description</b>
+<p><!--para 2 -->
+ The calloc function allocates space for an array of nmemb objects, each of whose size
+ is size. The space is initialized to all bits zero.<sup><a href="#note261"><b>261)</b></a></sup>
+<p><b>Returns</b>
+<p><!--para 3 -->
+ The calloc function returns either a null pointer or a pointer to the allocated space.
+
+<p><b>Footnotes</b>
+<p><small><a name="note261" href="#note261">261)</a> Note that this need not be the same as the representation of floating-point zero or a null pointer
+ constant.
+</small>
+
+<h5><a name="7.20.3.2" href="#7.20.3.2">7.20.3.2 The free function</a></h5>
+<p><b>Synopsis</b>
+<p><!--para 1 -->
+<pre>
+         #include <a href="#7.20">&lt;stdlib.h&gt;</a>
+         void free(void *ptr);
+</pre>
+<p><b>Description</b>
+<p><!--para 2 -->
+ The free function causes the space pointed to by ptr to be deallocated, that is, made
+ available for further allocation. If ptr is a null pointer, no action occurs. Otherwise, if
+ the argument does not match a pointer earlier returned by the calloc, malloc, or
+<!--page 326 -->
+ realloc function, or if the space has been deallocated by a call to free or realloc,
+ the behavior is undefined.
+<p><b>Returns</b>
+<p><!--para 3 -->
+ The free function returns no value.
+
+<h5><a name="7.20.3.3" href="#7.20.3.3">7.20.3.3 The malloc function</a></h5>
+<p><b>Synopsis</b>
+<p><!--para 1 -->
+<pre>
+        #include <a href="#7.20">&lt;stdlib.h&gt;</a>
+        void *malloc(size_t size);
+</pre>
+<p><b>Description</b>
+<p><!--para 2 -->
+ The malloc function allocates space for an object whose size is specified by size and
+ whose value is indeterminate.
+<p><b>Returns</b>
+<p><!--para 3 -->
+ The malloc function returns either a null pointer or a pointer to the allocated space.
+
+<h5><a name="7.20.3.4" href="#7.20.3.4">7.20.3.4 The realloc function</a></h5>
+<p><b>Synopsis</b>
+<p><!--para 1 -->
+<pre>
+        #include <a href="#7.20">&lt;stdlib.h&gt;</a>
+        void *realloc(void *ptr, size_t size);
+</pre>
+<p><b>Description</b>
+<p><!--para 2 -->
+ The realloc function deallocates the old object pointed to by ptr and returns a
+ pointer to a new object that has the size specified by size. The contents of the new
+ object shall be the same as that of the old object prior to deallocation, up to the lesser of
+ the new and old sizes. Any bytes in the new object beyond the size of the old object have
+ indeterminate values.
+<p><!--para 3 -->
+ If ptr is a null pointer, the realloc function behaves like the malloc function for the
+ specified size. Otherwise, if ptr does not match a pointer earlier returned by the
+ calloc, malloc, or realloc function, or if the space has been deallocated by a call
+ to the free or realloc function, the behavior is undefined. If memory for the new
+ object cannot be allocated, the old object is not deallocated and its value is unchanged.
+<p><b>Returns</b>
+<p><!--para 4 -->
+ The realloc function returns a pointer to the new object (which may have the same
+ value as a pointer to the old object), or a null pointer if the new object could not be
+ allocated.
+<!--page 327 -->
+
+<h4><a name="7.20.4" href="#7.20.4">7.20.4 Communication with the environment</a></h4>
+
+<h5><a name="7.20.4.1" href="#7.20.4.1">7.20.4.1 The abort function</a></h5>
+<p><b>Synopsis</b>
+<p><!--para 1 -->
+<pre>
+        #include <a href="#7.20">&lt;stdlib.h&gt;</a>
+        void abort(void);
+</pre>
+<p><b>Description</b>
+<p><!--para 2 -->
+ The abort function causes abnormal program termination to occur, unless the signal
+ SIGABRT is being caught and the signal handler does not return. Whether open streams
+ with unwritten buffered data are flushed, open streams are closed, or temporary files are
+ removed is implementation-defined. An implementation-defined form of the status
+ unsuccessful termination is returned to the host environment by means of the function
+ call raise(SIGABRT).
+<p><b>Returns</b>
+<p><!--para 3 -->
+ The abort function does not return to its caller.
+
+<h5><a name="7.20.4.2" href="#7.20.4.2">7.20.4.2 The atexit function</a></h5>
+<p><b>Synopsis</b>
+<p><!--para 1 -->
+<pre>
+        #include <a href="#7.20">&lt;stdlib.h&gt;</a>
+        int atexit(void (*func)(void));
+</pre>
+<p><b>Description</b>
+<p><!--para 2 -->
+ The atexit function registers the function pointed to by func, to be called without
+ arguments at normal program termination.
+<p><b>Environmental limits</b>
+<p><!--para 3 -->
+ The implementation shall support the registration of at least 32 functions.
+<p><b>Returns</b>
+<p><!--para 4 -->
+ The atexit function returns zero if the registration succeeds, nonzero if it fails.
+<p><b> Forward references</b>: the exit function (<a href="#7.20.4.3">7.20.4.3</a>).
+
+<h5><a name="7.20.4.3" href="#7.20.4.3">7.20.4.3 The exit function</a></h5>
+<p><b>Synopsis</b>
+<p><!--para 1 -->
+<pre>
+        #include <a href="#7.20">&lt;stdlib.h&gt;</a>
+        void exit(int status);
+</pre>
+<p><b>Description</b>
+<p><!--para 2 -->
+ The exit function causes normal program termination to occur. If more than one call to
+ the exit function is executed by a program, the behavior is undefined.
+<!--page 328 -->
+<p><!--para 3 -->
+ First, all functions registered by the atexit function are called, in the reverse order of
+ their registration,<sup><a href="#note262"><b>262)</b></a></sup> except that a function is called after any previously registered
+ functions that had already been called at the time it was registered. If, during the call to
+ any such function, a call to the longjmp function is made that would terminate the call
+ to the registered function, the behavior is undefined.
+<p><!--para 4 -->
+ Next, all open streams with unwritten buffered data are flushed, all open streams are
+ closed, and all files created by the tmpfile function are removed.
+<p><!--para 5 -->
+ Finally, control is returned to the host environment. If the value of status is zero or
+ EXIT_SUCCESS, an implementation-defined form of the status successful termination is
+ returned. If the value of status is EXIT_FAILURE, an implementation-defined form
+ of the status unsuccessful termination is returned. Otherwise the status returned is
+ implementation-defined.
+<p><b>Returns</b>
+<p><!--para 6 -->
+ The exit function cannot return to its caller.
+
+<p><b>Footnotes</b>
+<p><small><a name="note262" href="#note262">262)</a> Each function is called as many times as it was registered, and in the correct order with respect to
+ other registered functions.
+</small>
+
+<h5><a name="7.20.4.4" href="#7.20.4.4">7.20.4.4 The _Exit function</a></h5>
+<p><b>Synopsis</b>
+<p><!--para 1 -->
+<pre>
+         #include <a href="#7.20">&lt;stdlib.h&gt;</a>
+         void _Exit(int status);
+</pre>
+<p><b>Description</b>
+<p><!--para 2 -->
+ The _Exit function causes normal program termination to occur and control to be
+ returned to the host environment. No functions registered by the atexit function or
+ signal handlers registered by the signal function are called. The status returned to the
+ host environment is determined in the same way as for the exit function (<a href="#7.20.4.3">7.20.4.3</a>).
+ Whether open streams with unwritten buffered data are flushed, open streams are closed,
+ or temporary files are removed is implementation-defined.
+<p><b>Returns</b>
+<p><!--para 3 -->
+ The _Exit function cannot return to its caller.
+<!--page 329 -->
+
+<h5><a name="7.20.4.5" href="#7.20.4.5">7.20.4.5 The getenv function</a></h5>
+<p><b>Synopsis</b>
+<p><!--para 1 -->
+<pre>
+        #include <a href="#7.20">&lt;stdlib.h&gt;</a>
+        char *getenv(const char *name);
+</pre>
+<p><b>Description</b>
+<p><!--para 2 -->
+ The getenv function searches an environment list, provided by the host environment,
+ for a string that matches the string pointed to by name. The set of environment names
+ and the method for altering the environment list are implementation-defined.
+<p><!--para 3 -->
+ The implementation shall behave as if no library function calls the getenv function.
+<p><b>Returns</b>
+<p><!--para 4 -->
+ The getenv function returns a pointer to a string associated with the matched list
+ member. The string pointed to shall not be modified by the program, but may be
+ overwritten by a subsequent call to the getenv function. If the specified name cannot
+ be found, a null pointer is returned.
+
+<h5><a name="7.20.4.6" href="#7.20.4.6">7.20.4.6 The system function</a></h5>
+<p><b>Synopsis</b>
+<p><!--para 1 -->
+<pre>
+        #include <a href="#7.20">&lt;stdlib.h&gt;</a>
+        int system(const char *string);
+</pre>
+<p><b>Description</b>
+<p><!--para 2 -->
+ If string is a null pointer, the system function determines whether the host
+ environment has a command processor. If string is not a null pointer, the system
+ function passes the string pointed to by string to that command processor to be
+ executed in a manner which the implementation shall document; this might then cause the
+ program calling system to behave in a non-conforming manner or to terminate.
+<p><b>Returns</b>
+<p><!--para 3 -->
+ If the argument is a null pointer, the system function returns nonzero only if a
+ command processor is available. If the argument is not a null pointer, and the system
+ function does return, it returns an implementation-defined value.
+<!--page 330 -->
+
+<h4><a name="7.20.5" href="#7.20.5">7.20.5 Searching and sorting utilities</a></h4>
+<p><!--para 1 -->
+ These utilities make use of a comparison function to search or sort arrays of unspecified
+ type. Where an argument declared as size_t nmemb specifies the length of the array
+ for a function, nmemb can have the value zero on a call to that function; the comparison
+ function is not called, a search finds no matching element, and sorting performs no
+ rearrangement. Pointer arguments on such a call shall still have valid values, as described
+ in <a href="#7.1.4">7.1.4</a>.
+<p><!--para 2 -->
+ The implementation shall ensure that the second argument of the comparison function
+ (when called from bsearch), or both arguments (when called from qsort), are
+ pointers to elements of the array.<sup><a href="#note263"><b>263)</b></a></sup> The first argument when called from bsearch
+ shall equal key.
+<p><!--para 3 -->
+ The comparison function shall not alter the contents of the array. The implementation
+ may reorder elements of the array between calls to the comparison function, but shall not
+ alter the contents of any individual element.
+<p><!--para 4 -->
+ When the same objects (consisting of size bytes, irrespective of their current positions
+ in the array) are passed more than once to the comparison function, the results shall be
+ consistent with one another. That is, for qsort they shall define a total ordering on the
+ array, and for bsearch the same object shall always compare the same way with the
+ key.
+<p><!--para 5 -->
+ A sequence point occurs immediately before and immediately after each call to the
+ comparison function, and also between any call to the comparison function and any
+ movement of the objects passed as arguments to that call.
+
+<p><b>Footnotes</b>
+<p><small><a name="note263" href="#note263">263)</a> That is, if the value passed is p, then the following expressions are always nonzero:
+
+<pre>
+          ((char *)p - (char *)base) % size == 0
+          (char *)p &gt;= (char *)base
+          (char *)p &lt; (char *)base + nmemb * size
+</pre>
+</small>
+
+<h5><a name="7.20.5.1" href="#7.20.5.1">7.20.5.1 The bsearch function</a></h5>
+<p><b>Synopsis</b>
+<p><!--para 1 -->
+<pre>
+          #include <a href="#7.20">&lt;stdlib.h&gt;</a>
+          void *bsearch(const void *key, const void *base,
+               size_t nmemb, size_t size,
+               int (*compar)(const void *, const void *));
+</pre>
+<p><b>Description</b>
+<p><!--para 2 -->
+ The bsearch function searches an array of nmemb objects, the initial element of which
+ is pointed to by base, for an element that matches the object pointed to by key. The
+<!--page 331 -->
+ size of each element of the array is specified by size.
+<p><!--para 3 -->
+ The comparison function pointed to by compar is called with two arguments that point
+ to the key object and to an array element, in that order. The function shall return an
+ integer less than, equal to, or greater than zero if the key object is considered,
+ respectively, to be less than, to match, or to be greater than the array element. The array
+ shall consist of: all the elements that compare less than, all the elements that compare
+ equal to, and all the elements that compare greater than the key object, in that order.<sup><a href="#note264"><b>264)</b></a></sup>
+<p><b>Returns</b>
+<p><!--para 4 -->
+ The bsearch function returns a pointer to a matching element of the array, or a null
+ pointer if no match is found. If two elements compare as equal, which element is
+ matched is unspecified.
+
+<p><b>Footnotes</b>
+<p><small><a name="note264" href="#note264">264)</a> In practice, the entire array is sorted according to the comparison function.
+</small>
+
+<h5><a name="7.20.5.2" href="#7.20.5.2">7.20.5.2 The qsort function</a></h5>
+<p><b>Synopsis</b>
+<p><!--para 1 -->
+<pre>
+          #include <a href="#7.20">&lt;stdlib.h&gt;</a>
+          void qsort(void *base, size_t nmemb, size_t size,
+               int (*compar)(const void *, const void *));
+</pre>
+<p><b>Description</b>
+<p><!--para 2 -->
+ The qsort function sorts an array of nmemb objects, the initial element of which is
+ pointed to by base. The size of each object is specified by size.
+<p><!--para 3 -->
+ The contents of the array are sorted into ascending order according to a comparison
+ function pointed to by compar, which is called with two arguments that point to the
+ objects being compared. The function shall return an integer less than, equal to, or
+ greater than zero if the first argument is considered to be respectively less than, equal to,
+ or greater than the second.
+<p><!--para 4 -->
+ If two elements compare as equal, their order in the resulting sorted array is unspecified.
+<p><b>Returns</b>
+<p><!--para 5 -->
+ The qsort function returns no value.
+<!--page 332 -->
+
+<h4><a name="7.20.6" href="#7.20.6">7.20.6 Integer arithmetic functions</a></h4>
+
+<h5><a name="7.20.6.1" href="#7.20.6.1">7.20.6.1 The abs, labs and llabs functions</a></h5>
+<p><b>Synopsis</b>
+<p><!--para 1 -->
+<pre>
+         #include <a href="#7.20">&lt;stdlib.h&gt;</a>
+         int abs(int j);
+         long int labs(long int j);
+         long long int llabs(long long int j);
+</pre>
+<p><b>Description</b>
+<p><!--para 2 -->
+ The abs, labs, and llabs functions compute the absolute value of an integer j. If the
+ result cannot be represented, the behavior is undefined.<sup><a href="#note265"><b>265)</b></a></sup>
+<p><b>Returns</b>
+<p><!--para 3 -->
+ The abs, labs, and llabs, functions return the absolute value.
+
+<p><b>Footnotes</b>
+<p><small><a name="note265" href="#note265">265)</a> The absolute value of the most negative number cannot be represented in two's complement.
+</small>
+
+<h5><a name="7.20.6.2" href="#7.20.6.2">7.20.6.2 The div, ldiv, and lldiv functions</a></h5>
+<p><b>Synopsis</b>
+<p><!--para 1 -->
+<pre>
+         #include <a href="#7.20">&lt;stdlib.h&gt;</a>
+         div_t div(int numer, int denom);
+         ldiv_t ldiv(long int numer, long int denom);
+         lldiv_t lldiv(long long int numer, long long int denom);
+</pre>
+<p><b>Description</b>
+<p><!--para 2 -->
+ The div, ldiv, and lldiv, functions compute numer / denom and numer %
+ denom in a single operation.
+<p><b>Returns</b>
+<p><!--para 3 -->
+ The div, ldiv, and lldiv functions return a structure of type div_t, ldiv_t, and
+ lldiv_t, respectively, comprising both the quotient and the remainder. The structures
+ shall contain (in either order) the members quot (the quotient) and rem (the remainder),
+ each of which has the same type as the arguments numer and denom. If either part of
+ the result cannot be represented, the behavior is undefined.
+<!--page 333 -->
+
+<h4><a name="7.20.7" href="#7.20.7">7.20.7 Multibyte/wide character conversion functions</a></h4>
+<p><!--para 1 -->
+ The behavior of the multibyte character functions is affected by the LC_CTYPE category
+ of the current locale. For a state-dependent encoding, each function is placed into its
+ initial conversion state by a call for which its character pointer argument, s, is a null
+ pointer. Subsequent calls with s as other than a null pointer cause the internal conversion
+ state of the function to be altered as necessary. A call with s as a null pointer causes
+ these functions to return a nonzero value if encodings have state dependency, and zero
+ otherwise.<sup><a href="#note266"><b>266)</b></a></sup> Changing the LC_CTYPE category causes the conversion state of these
+ functions to be indeterminate.
+
+<p><b>Footnotes</b>
+<p><small><a name="note266" href="#note266">266)</a> If the locale employs special bytes to change the shift state, these bytes do not produce separate wide
+ character codes, but are grouped with an adjacent multibyte character.
+</small>
+
+<h5><a name="7.20.7.1" href="#7.20.7.1">7.20.7.1 The mblen function</a></h5>
+<p><b>Synopsis</b>
+<p><!--para 1 -->
+<pre>
+         #include <a href="#7.20">&lt;stdlib.h&gt;</a>
+         int mblen(const char *s, size_t n);
+</pre>
+<p><b>Description</b>
+<p><!--para 2 -->
+ If s is not a null pointer, the mblen function determines the number of bytes contained
+ in the multibyte character pointed to by s. Except that the conversion state of the
+ mbtowc function is not affected, it is equivalent to
+<pre>
+         mbtowc((wchar_t *)0, s, n);
+</pre>
+<p><!--para 3 -->
+ The implementation shall behave as if no library function calls the mblen function.
+<p><b>Returns</b>
+<p><!--para 4 -->
+ If s is a null pointer, the mblen function returns a nonzero or zero value, if multibyte
+ character encodings, respectively, do or do not have state-dependent encodings. If s is
+ not a null pointer, the mblen function either returns 0 (if s points to the null character),
+ or returns the number of bytes that are contained in the multibyte character (if the next n
+ or fewer bytes form a valid multibyte character), or returns -1 (if they do not form a valid
+ multibyte character).
+<p><b> Forward references</b>: the mbtowc function (<a href="#7.20.7.2">7.20.7.2</a>).
+<!--page 334 -->
+
+<h5><a name="7.20.7.2" href="#7.20.7.2">7.20.7.2 The mbtowc function</a></h5>
+<p><b>Synopsis</b>
+<p><!--para 1 -->
+<pre>
+        #include <a href="#7.20">&lt;stdlib.h&gt;</a>
+        int mbtowc(wchar_t * restrict pwc,
+             const char * restrict s,
+             size_t n);
+</pre>
+<p><b>Description</b>
+<p><!--para 2 -->
+ If s is not a null pointer, the mbtowc function inspects at most n bytes beginning with
+ the byte pointed to by s to determine the number of bytes needed to complete the next
+ multibyte character (including any shift sequences). If the function determines that the
+ next multibyte character is complete and valid, it determines the value of the
+ corresponding wide character and then, if pwc is not a null pointer, stores that value in
+ the object pointed to by pwc. If the corresponding wide character is the null wide
+ character, the function is left in the initial conversion state.
+<p><!--para 3 -->
+ The implementation shall behave as if no library function calls the mbtowc function.
+<p><b>Returns</b>
+<p><!--para 4 -->
+ If s is a null pointer, the mbtowc function returns a nonzero or zero value, if multibyte
+ character encodings, respectively, do or do not have state-dependent encodings. If s is
+ not a null pointer, the mbtowc function either returns 0 (if s points to the null character),
+ or returns the number of bytes that are contained in the converted multibyte character (if
+ the next n or fewer bytes form a valid multibyte character), or returns -1 (if they do not
+ form a valid multibyte character).
+<p><!--para 5 -->
+ In no case will the value returned be greater than n or the value of the MB_CUR_MAX
+ macro.
+
+<h5><a name="7.20.7.3" href="#7.20.7.3">7.20.7.3 The wctomb function</a></h5>
+<p><b>Synopsis</b>
+<p><!--para 1 -->
+<pre>
+        #include <a href="#7.20">&lt;stdlib.h&gt;</a>
+        int wctomb(char *s, wchar_t wc);
+</pre>
+<p><b>Description</b>
+<p><!--para 2 -->
+ The wctomb function determines the number of bytes needed to represent the multibyte
+ character corresponding to the wide character given by wc (including any shift
+ sequences), and stores the multibyte character representation in the array whose first
+ element is pointed to by s (if s is not a null pointer). At most MB_CUR_MAX characters
+ are stored. If wc is a null wide character, a null byte is stored, preceded by any shift
+ sequence needed to restore the initial shift state, and the function is left in the initial
+ conversion state.
+<!--page 335 -->
+<p><!--para 3 -->
+ The implementation shall behave as if no library function calls the wctomb function.
+<p><b>Returns</b>
+<p><!--para 4 -->
+ If s is a null pointer, the wctomb function returns a nonzero or zero value, if multibyte
+ character encodings, respectively, do or do not have state-dependent encodings. If s is
+ not a null pointer, the wctomb function returns -1 if the value of wc does not correspond
+ to a valid multibyte character, or returns the number of bytes that are contained in the
+ multibyte character corresponding to the value of wc.
+<p><!--para 5 -->
+ In no case will the value returned be greater than the value of the MB_CUR_MAX macro.
+
+<h4><a name="7.20.8" href="#7.20.8">7.20.8 Multibyte/wide string conversion functions</a></h4>
+<p><!--para 1 -->
+ The behavior of the multibyte string functions is affected by the LC_CTYPE category of
+ the current locale.
+
+<h5><a name="7.20.8.1" href="#7.20.8.1">7.20.8.1 The mbstowcs function</a></h5>
+<p><b>Synopsis</b>
+<p><!--para 1 -->
+<pre>
+          #include <a href="#7.20">&lt;stdlib.h&gt;</a>
+          size_t mbstowcs(wchar_t * restrict pwcs,
+               const char * restrict s,
+               size_t n);
+</pre>
+<p><b>Description</b>
+<p><!--para 2 -->
+ The mbstowcs function converts a sequence of multibyte characters that begins in the
+ initial shift state from the array pointed to by s into a sequence of corresponding wide
+ characters and stores not more than n wide characters into the array pointed to by pwcs.
+ No multibyte characters that follow a null character (which is converted into a null wide
+ character) will be examined or converted. Each multibyte character is converted as if by
+ a call to the mbtowc function, except that the conversion state of the mbtowc function is
+ not affected.
+<p><!--para 3 -->
+ No more than n elements will be modified in the array pointed to by pwcs. If copying
+ takes place between objects that overlap, the behavior is undefined.
+<p><b>Returns</b>
+<p><!--para 4 -->
+ If an invalid multibyte character is encountered, the mbstowcs function returns
+ (size_t)(-1). Otherwise, the mbstowcs function returns the number of array
+ elements modified, not including a terminating null wide character, if any.<sup><a href="#note267"><b>267)</b></a></sup>
+<!--page 336 -->
+
+<p><b>Footnotes</b>
+<p><small><a name="note267" href="#note267">267)</a> The array will not be null-terminated if the value returned is n.
+</small>
+
+<h5><a name="7.20.8.2" href="#7.20.8.2">7.20.8.2 The wcstombs function</a></h5>
+<p><b>Synopsis</b>
+<p><!--para 1 -->
+<pre>
+        #include <a href="#7.20">&lt;stdlib.h&gt;</a>
+        size_t wcstombs(char * restrict s,
+             const wchar_t * restrict pwcs,
+             size_t n);
+</pre>
+<p><b>Description</b>
+<p><!--para 2 -->
+ The wcstombs function converts a sequence of wide characters from the array pointed
+ to by pwcs into a sequence of corresponding multibyte characters that begins in the
+ initial shift state, and stores these multibyte characters into the array pointed to by s,
+ stopping if a multibyte character would exceed the limit of n total bytes or if a null
+ character is stored. Each wide character is converted as if by a call to the wctomb
+ function, except that the conversion state of the wctomb function is not affected.
+<p><!--para 3 -->
+ No more than n bytes will be modified in the array pointed to by s. If copying takes place
+ between objects that overlap, the behavior is undefined.
+<p><b>Returns</b>
+<p><!--para 4 -->
+ If a wide character is encountered that does not correspond to a valid multibyte character,
+ the wcstombs function returns (size_t)(-1). Otherwise, the wcstombs function
+ returns the number of bytes modified, not including a terminating null character, if
+ any.<sup><a href="#note267"><b>267)</b></a></sup>
+<!--page 337 -->
+
+<h3><a name="7.21" href="#7.21">7.21 String handling &lt;string.h&gt;</a></h3>
+
+<h4><a name="7.21.1" href="#7.21.1">7.21.1 String function conventions</a></h4>
+<p><!--para 1 -->
+ The header <a href="#7.21">&lt;string.h&gt;</a> declares one type and several functions, and defines one
+ macro useful for manipulating arrays of character type and other objects treated as arrays
+ of character type.<sup><a href="#note268"><b>268)</b></a></sup> The type is size_t and the macro is NULL (both described in
+ <a href="#7.17">7.17</a>). Various methods are used for determining the lengths of the arrays, but in all cases
+ a char * or void * argument points to the initial (lowest addressed) character of the
+ array. If an array is accessed beyond the end of an object, the behavior is undefined.
+<p><!--para 2 -->
+ Where an argument declared as size_t n specifies the length of the array for a
+ function, n can have the value zero on a call to that function. Unless explicitly stated
+ otherwise in the description of a particular function in this subclause, pointer arguments
+ on such a call shall still have valid values, as described in <a href="#7.1.4">7.1.4</a>. On such a call, a
+ function that locates a character finds no occurrence, a function that compares two
+ character sequences returns zero, and a function that copies characters copies zero
+ characters.
+<p><!--para 3 -->
+ For all functions in this subclause, each character shall be interpreted as if it had the type
+ unsigned char (and therefore every possible object representation is valid and has a
+ different value).
+
+<p><b>Footnotes</b>
+<p><small><a name="note268" href="#note268">268)</a> See ''future library directions'' (<a href="#7.26.11">7.26.11</a>).
+</small>
+
+<h4><a name="7.21.2" href="#7.21.2">7.21.2 Copying functions</a></h4>
+
+<h5><a name="7.21.2.1" href="#7.21.2.1">7.21.2.1 The memcpy function</a></h5>
+<p><b>Synopsis</b>
+<p><!--para 1 -->
+<pre>
+          #include <a href="#7.21">&lt;string.h&gt;</a>
+          void *memcpy(void * restrict s1,
+               const void * restrict s2,
+               size_t n);
+</pre>
+<p><b>Description</b>
+<p><!--para 2 -->
+ The memcpy function copies n characters from the object pointed to by s2 into the
+ object pointed to by s1. If copying takes place between objects that overlap, the behavior
+ is undefined.
+<p><b>Returns</b>
+<p><!--para 3 -->
+ The memcpy function returns the value of s1.
+<!--page 338 -->
+
+<h5><a name="7.21.2.2" href="#7.21.2.2">7.21.2.2 The memmove function</a></h5>
+<p><b>Synopsis</b>
+<p><!--para 1 -->
+<pre>
+        #include <a href="#7.21">&lt;string.h&gt;</a>
         void *memmove(void *s1, const void *s2, size_t n);
+</pre>
+<p><b>Description</b>
+<p><!--para 2 -->
+ The memmove function copies n characters from the object pointed to by s2 into the
+ object pointed to by s1. Copying takes place as if the n characters from the object
+ pointed to by s2 are first copied into a temporary array of n characters that does not
+ overlap the objects pointed to by s1 and s2, and then the n characters from the
+ temporary array are copied into the object pointed to by s1.
+<p><b>Returns</b>
+<p><!--para 3 -->
+ The memmove function returns the value of s1.
+
+<h5><a name="7.21.2.3" href="#7.21.2.3">7.21.2.3 The strcpy function</a></h5>
+<p><b>Synopsis</b>
+<p><!--para 1 -->
+<pre>
+        #include <a href="#7.21">&lt;string.h&gt;</a>
         char *strcpy(char * restrict s1,
              const char * restrict s2);
+</pre>
+<p><b>Description</b>
+<p><!--para 2 -->
+ The strcpy function copies the string pointed to by s2 (including the terminating null
+ character) into the array pointed to by s1. If copying takes place between objects that
+ overlap, the behavior is undefined.
+<p><b>Returns</b>
+<p><!--para 3 -->
+ The strcpy function returns the value of s1.
+
+<h5><a name="7.21.2.4" href="#7.21.2.4">7.21.2.4 The strncpy function</a></h5>
+<p><b>Synopsis</b>
+<p><!--para 1 -->
+<pre>
+        #include <a href="#7.21">&lt;string.h&gt;</a>
         char *strncpy(char * restrict s1,
-             const char * restrict s2, size_t n);
-        char *strcat(char * restrict s1,
-             const char * restrict s2);
-        char *strncat(char * restrict s1,
-             const char * restrict s2, size_t n);
-        int memcmp(const void *s1, const void *s2, size_t n);
-        int strcmp(const char *s1, const char *s2);
+             const char * restrict s2,
+             size_t n);
+</pre>
+<p><b>Description</b>
+<p><!--para 2 -->
+ The strncpy function copies not more than n characters (characters that follow a null
+ character are not copied) from the array pointed to by s2 to the array pointed to by
+<!--page 339 -->
+ s1.<sup><a href="#note269"><b>269)</b></a></sup> If copying takes place between objects that overlap, the behavior is undefined.
+<p><!--para 3 -->
+ If the array pointed to by s2 is a string that is shorter than n characters, null characters
+ are appended to the copy in the array pointed to by s1, until n characters in all have been
+ written.
+<p><b>Returns</b>
+<p><!--para 4 -->
+ The strncpy function returns the value of s1.
+
+<p><b>Footnotes</b>
+<p><small><a name="note269" href="#note269">269)</a> Thus, if there is no null character in the first n characters of the array pointed to by s2, the result will
+ not be null-terminated.
+</small>
+
+<h4><a name="7.21.3" href="#7.21.3">7.21.3 Concatenation functions</a></h4>
+
+<h5><a name="7.21.3.1" href="#7.21.3.1">7.21.3.1 The strcat function</a></h5>
+<p><b>Synopsis</b>
+<p><!--para 1 -->
+<pre>
+          #include <a href="#7.21">&lt;string.h&gt;</a>
+          char *strcat(char * restrict s1,
+               const char * restrict s2);
+</pre>
+<p><b>Description</b>
+<p><!--para 2 -->
+ The strcat function appends a copy of the string pointed to by s2 (including the
+ terminating null character) to the end of the string pointed to by s1. The initial character
+ of s2 overwrites the null character at the end of s1. If copying takes place between
+ objects that overlap, the behavior is undefined.
+<p><b>Returns</b>
+<p><!--para 3 -->
+ The strcat function returns the value of s1.
+
+<h5><a name="7.21.3.2" href="#7.21.3.2">7.21.3.2 The strncat function</a></h5>
+<p><b>Synopsis</b>
+<p><!--para 1 -->
+<pre>
+          #include <a href="#7.21">&lt;string.h&gt;</a>
+          char *strncat(char * restrict s1,
+               const char * restrict s2,
+               size_t n);
+</pre>
+<p><b>Description</b>
+<p><!--para 2 -->
+ The strncat function appends not more than n characters (a null character and
+ characters that follow it are not appended) from the array pointed to by s2 to the end of
+ the string pointed to by s1. The initial character of s2 overwrites the null character at the
+ end of s1. A terminating null character is always appended to the result.<sup><a href="#note270"><b>270)</b></a></sup> If copying
+<!--page 340 -->
+ takes place between objects that overlap, the behavior is undefined.
+<p><b>Returns</b>
+<p><!--para 3 -->
+ The strncat function returns the value of s1.
+<p><b> Forward references</b>: the strlen function (<a href="#7.21.6.3">7.21.6.3</a>).
+
+<p><b>Footnotes</b>
+<p><small><a name="note270" href="#note270">270)</a> Thus, the maximum number of characters that can end up in the array pointed to by s1 is
+ strlen(s1)+n+1.
+</small>
+
+<h4><a name="7.21.4" href="#7.21.4">7.21.4 Comparison functions</a></h4>
+<p><!--para 1 -->
+ The sign of a nonzero value returned by the comparison functions memcmp, strcmp,
+ and strncmp is determined by the sign of the difference between the values of the first
+ pair of characters (both interpreted as unsigned char) that differ in the objects being
+ compared.
+
+<h5><a name="7.21.4.1" href="#7.21.4.1">7.21.4.1 The memcmp function</a></h5>
+<p><b>Synopsis</b>
+<p><!--para 1 -->
+<pre>
+         #include <a href="#7.21">&lt;string.h&gt;</a>
+         int memcmp(const void *s1, const void *s2, size_t n);
+</pre>
+<p><b>Description</b>
+<p><!--para 2 -->
+ The memcmp function compares the first n characters of the object pointed to by s1 to
+ the first n characters of the object pointed to by s2.<sup><a href="#note271"><b>271)</b></a></sup>
+<p><b>Returns</b>
+<p><!--para 3 -->
+ The memcmp function returns an integer greater than, equal to, or less than zero,
+ accordingly as the object pointed to by s1 is greater than, equal to, or less than the object
+ pointed to by s2.
+
+<p><b>Footnotes</b>
+<p><small><a name="note271" href="#note271">271)</a> The contents of ''holes'' used as padding for purposes of alignment within structure objects are
+ indeterminate. Strings shorter than their allocated space and unions may also cause problems in
+ comparison.
+</small>
+
+<h5><a name="7.21.4.2" href="#7.21.4.2">7.21.4.2 The strcmp function</a></h5>
+<p><b>Synopsis</b>
+<p><!--para 1 -->
+<pre>
+         #include <a href="#7.21">&lt;string.h&gt;</a>
+         int strcmp(const char *s1, const char *s2);
+</pre>
+<p><b>Description</b>
+<p><!--para 2 -->
+ The strcmp function compares the string pointed to by s1 to the string pointed to by
+ s2.
+<p><b>Returns</b>
+<p><!--para 3 -->
+ The strcmp function returns an integer greater than, equal to, or less than zero,
+ accordingly as the string pointed to by s1 is greater than, equal to, or less than the string
+<!--page 341 -->
+ pointed to by s2.
+
+<h5><a name="7.21.4.3" href="#7.21.4.3">7.21.4.3 The strcoll function</a></h5>
+<p><b>Synopsis</b>
+<p><!--para 1 -->
+<pre>
+        #include <a href="#7.21">&lt;string.h&gt;</a>
         int strcoll(const char *s1, const char *s2);
+</pre>
+<p><b>Description</b>
+<p><!--para 2 -->
+ The strcoll function compares the string pointed to by s1 to the string pointed to by
+ s2, both interpreted as appropriate to the LC_COLLATE category of the current locale.
+<p><b>Returns</b>
+<p><!--para 3 -->
+ The strcoll function returns an integer greater than, equal to, or less than zero,
+ accordingly as the string pointed to by s1 is greater than, equal to, or less than the string
+ pointed to by s2 when both are interpreted as appropriate to the current locale.
+
+<h5><a name="7.21.4.4" href="#7.21.4.4">7.21.4.4 The strncmp function</a></h5>
+<p><b>Synopsis</b>
+<p><!--para 1 -->
+<pre>
+        #include <a href="#7.21">&lt;string.h&gt;</a>
         int strncmp(const char *s1, const char *s2, size_t n);
+</pre>
+<p><b>Description</b>
+<p><!--para 2 -->
+ The strncmp function compares not more than n characters (characters that follow a
+ null character are not compared) from the array pointed to by s1 to the array pointed to
+ by s2.
+<p><b>Returns</b>
+<p><!--para 3 -->
+ The strncmp function returns an integer greater than, equal to, or less than zero,
+ accordingly as the possibly null-terminated array pointed to by s1 is greater than, equal
+ to, or less than the possibly null-terminated array pointed to by s2.
+
+<h5><a name="7.21.4.5" href="#7.21.4.5">7.21.4.5 The strxfrm function</a></h5>
+<p><b>Synopsis</b>
+<p><!--para 1 -->
+<pre>
+        #include <a href="#7.21">&lt;string.h&gt;</a>
         size_t strxfrm(char * restrict s1,
-             const char * restrict s2, size_t n);
+             const char * restrict s2,
+             size_t n);
+</pre>
+<p><b>Description</b>
+<p><!--para 2 -->
+ The strxfrm function transforms the string pointed to by s2 and places the resulting
+ string into the array pointed to by s1. The transformation is such that if the strcmp
+ function is applied to two transformed strings, it returns a value greater than, equal to, or
+<!--page 342 -->
+ less than zero, corresponding to the result of the strcoll function applied to the same
+ two original strings. No more than n characters are placed into the resulting array
+ pointed to by s1, including the terminating null character. If n is zero, s1 is permitted to
+ be a null pointer. If copying takes place between objects that overlap, the behavior is
+ undefined.
+<p><b>Returns</b>
+<p><!--para 3 -->
+ The strxfrm function returns the length of the transformed string (not including the
+ terminating null character). If the value returned is n or more, the contents of the array
+ pointed to by s1 are indeterminate.
+<p><!--para 4 -->
+ EXAMPLE The value of the following expression is the size of the array needed to hold the
+ transformation of the string pointed to by s.
+<pre>
+        1 + strxfrm(NULL, s, 0)
+</pre>
+
+<h4><a name="7.21.5" href="#7.21.5">7.21.5 Search functions</a></h4>
+
+<h5><a name="7.21.5.1" href="#7.21.5.1">7.21.5.1 The memchr function</a></h5>
+<p><b>Synopsis</b>
+<p><!--para 1 -->
+<pre>
+        #include <a href="#7.21">&lt;string.h&gt;</a>
         void *memchr(const void *s, int c, size_t n);
+</pre>
+<p><b>Description</b>
+<p><!--para 2 -->
+ The memchr function locates the first occurrence of c (converted to an unsigned
+ char) in the initial n characters (each interpreted as unsigned char) of the object
+ pointed to by s.
+<p><b>Returns</b>
+<p><!--para 3 -->
+ The memchr function returns a pointer to the located character, or a null pointer if the
+ character does not occur in the object.
+
+<h5><a name="7.21.5.2" href="#7.21.5.2">7.21.5.2 The strchr function</a></h5>
+<p><b>Synopsis</b>
+<p><!--para 1 -->
+<pre>
+        #include <a href="#7.21">&lt;string.h&gt;</a>
         char *strchr(const char *s, int c);
+</pre>
+<p><b>Description</b>
+<p><!--para 2 -->
+ The strchr function locates the first occurrence of c (converted to a char) in the
+ string pointed to by s. The terminating null character is considered to be part of the
+ string.
+<p><b>Returns</b>
+<p><!--para 3 -->
+ The strchr function returns a pointer to the located character, or a null pointer if the
+ character does not occur in the string.
+<!--page 343 -->
+
+<h5><a name="7.21.5.3" href="#7.21.5.3">7.21.5.3 The strcspn function</a></h5>
+<p><b>Synopsis</b>
+<p><!--para 1 -->
+<pre>
+        #include <a href="#7.21">&lt;string.h&gt;</a>
         size_t strcspn(const char *s1, const char *s2);
+</pre>
+<p><b>Description</b>
+<p><!--para 2 -->
+ The strcspn function computes the length of the maximum initial segment of the string
+ pointed to by s1 which consists entirely of characters not from the string pointed to by
+ s2.
+<p><b>Returns</b>
+<p><!--para 3 -->
+ The strcspn function returns the length of the segment.
+
+<h5><a name="7.21.5.4" href="#7.21.5.4">7.21.5.4 The strpbrk function</a></h5>
+<p><b>Synopsis</b>
+<p><!--para 1 -->
+<pre>
+        #include <a href="#7.21">&lt;string.h&gt;</a>
         char *strpbrk(const char *s1, const char *s2);
+</pre>
+<p><b>Description</b>
+<p><!--para 2 -->
+ The strpbrk function locates the first occurrence in the string pointed to by s1 of any
+ character from the string pointed to by s2.
+<p><b>Returns</b>
+<p><!--para 3 -->
+ The strpbrk function returns a pointer to the character, or a null pointer if no character
+ from s2 occurs in s1.
+
+<h5><a name="7.21.5.5" href="#7.21.5.5">7.21.5.5 The strrchr function</a></h5>
+<p><b>Synopsis</b>
+<p><!--para 1 -->
+<pre>
+        #include <a href="#7.21">&lt;string.h&gt;</a>
         char *strrchr(const char *s, int c);
+</pre>
+<p><b>Description</b>
+<p><!--para 2 -->
+ The strrchr function locates the last occurrence of c (converted to a char) in the
+ string pointed to by s. The terminating null character is considered to be part of the
+ string.
+<p><b>Returns</b>
+<p><!--para 3 -->
+ The strrchr function returns a pointer to the character, or a null pointer if c does not
+ occur in the string.
+<!--page 344 -->
+
+<h5><a name="7.21.5.6" href="#7.21.5.6">7.21.5.6 The strspn function</a></h5>
+<p><b>Synopsis</b>
+<p><!--para 1 -->
+<pre>
+        #include <a href="#7.21">&lt;string.h&gt;</a>
         size_t strspn(const char *s1, const char *s2);
+</pre>
+<p><b>Description</b>
+<p><!--para 2 -->
+ The strspn function computes the length of the maximum initial segment of the string
+ pointed to by s1 which consists entirely of characters from the string pointed to by s2.
+<p><b>Returns</b>
+<p><!--para 3 -->
+ The strspn function returns the length of the segment.
+
+<h5><a name="7.21.5.7" href="#7.21.5.7">7.21.5.7 The strstr function</a></h5>
+<p><b>Synopsis</b>
+<p><!--para 1 -->
+<pre>
+        #include <a href="#7.21">&lt;string.h&gt;</a>
         char *strstr(const char *s1, const char *s2);
+</pre>
+<p><b>Description</b>
+<p><!--para 2 -->
+ The strstr function locates the first occurrence in the string pointed to by s1 of the
+ sequence of characters (excluding the terminating null character) in the string pointed to
+ by s2.
+<p><b>Returns</b>
+<p><!--para 3 -->
+ The strstr function returns a pointer to the located string, or a null pointer if the string
+ is not found. If s2 points to a string with zero length, the function returns s1.
+
+<h5><a name="7.21.5.8" href="#7.21.5.8">7.21.5.8 The strtok function</a></h5>
+<p><b>Synopsis</b>
+<p><!--para 1 -->
+<pre>
+        #include <a href="#7.21">&lt;string.h&gt;</a>
         char *strtok(char * restrict s1,
              const char * restrict s2);
-        void *memset(void *s, int c, size_t n);
+</pre>
+<p><b>Description</b>
+<p><!--para 2 -->
+ A sequence of calls to the strtok function breaks the string pointed to by s1 into a
+ sequence of tokens, each of which is delimited by a character from the string pointed to
+ by s2. The first call in the sequence has a non-null first argument; subsequent calls in the
+ sequence have a null first argument. The separator string pointed to by s2 may be
+ different from call to call.
+<p><!--para 3 -->
+ The first call in the sequence searches the string pointed to by s1 for the first character
+ that is not contained in the current separator string pointed to by s2. If no such character
+ is found, then there are no tokens in the string pointed to by s1 and the strtok function
+<!--page 345 -->
+ returns a null pointer. If such a character is found, it is the start of the first token.
+<p><!--para 4 -->
+ The strtok function then searches from there for a character that is contained in the
+ current separator string. If no such character is found, the current token extends to the
+ end of the string pointed to by s1, and subsequent searches for a token will return a null
+ pointer. If such a character is found, it is overwritten by a null character, which
+ terminates the current token. The strtok function saves a pointer to the following
+ character, from which the next search for a token will start.
+<p><!--para 5 -->
+ Each subsequent call, with a null pointer as the value of the first argument, starts
+ searching from the saved pointer and behaves as described above.
+<p><!--para 6 -->
+ The implementation shall behave as if no library function calls the strtok function.
+<p><b>Returns</b>
+<p><!--para 7 -->
+ The strtok function returns a pointer to the first character of a token, or a null pointer
+ if there is no token.
+<p><!--para 8 -->
+ EXAMPLE
+<pre>
+         #include <a href="#7.21">&lt;string.h&gt;</a>
+         static char str[] = "?a???b,,,#c";
+         char *t;
+         t   =   strtok(str, "?");       //   t   points to the token "a"
+         t   =   strtok(NULL, ",");      //   t   points to the token "??b"
+         t   =   strtok(NULL, "#,");     //   t   points to the token "c"
+         t   =   strtok(NULL, "?");      //   t   is a null pointer
+</pre>
+
+<h4><a name="7.21.6" href="#7.21.6">7.21.6 Miscellaneous functions</a></h4>
+
+<h5><a name="7.21.6.1" href="#7.21.6.1">7.21.6.1 The memset function</a></h5>
+<p><b>Synopsis</b>
+<p><!--para 1 -->
+<pre>
+         #include <a href="#7.21">&lt;string.h&gt;</a>
+         void *memset(void *s, int c, size_t n);
+</pre>
+<p><b>Description</b>
+<p><!--para 2 -->
+ The memset function copies the value of c (converted to an unsigned char) into
+ each of the first n characters of the object pointed to by s.
+<p><b>Returns</b>
+<p><!--para 3 -->
+ The memset function returns the value of s.
+<!--page 346 -->
+
+<h5><a name="7.21.6.2" href="#7.21.6.2">7.21.6.2 The strerror function</a></h5>
+<p><b>Synopsis</b>
+<p><!--para 1 -->
+<pre>
+        #include <a href="#7.21">&lt;string.h&gt;</a>
         char *strerror(int errnum);
+</pre>
+<p><b>Description</b>
+<p><!--para 2 -->
+ The strerror function maps the number in errnum to a message string. Typically,
+ the values for errnum come from errno, but strerror shall map any value of type
+ int to a message.
+<p><!--para 3 -->
+ The implementation shall behave as if no library function calls the strerror function.
+<p><b>Returns</b>
+<p><!--para 4 -->
+ The strerror function returns a pointer to the string, the contents of which are locale-
+ specific. The array pointed to shall not be modified by the program, but may be
+ overwritten by a subsequent call to the strerror function.
+
+<h5><a name="7.21.6.3" href="#7.21.6.3">7.21.6.3 The strlen function</a></h5>
+<p><b>Synopsis</b>
+<p><!--para 1 -->
+<pre>
+        #include <a href="#7.21">&lt;string.h&gt;</a>
         size_t strlen(const char *s);
-
-
-
-
-[<a name="p433" href="#p433">page 433</a>] (<a href="#Contents">Contents</a>)
-
-<a name="B.21" href="#B.21"><b>B.21 Type-generic math &lt;tgmath.h&gt;</b></a>
-      acos           sqrt               fmod              nextafter
-      asin           fabs               frexp             nexttoward
-      atan           atan2              hypot             remainder
-      acosh          cbrt               ilogb             remquo
-      asinh          ceil               ldexp             rint
-      atanh          copysign           lgamma            round
-      cos            erf                llrint            scalbn
-      sin            erfc               llround           scalbln
-      tan            exp2               log10             tgamma
-      cosh           expm1              log1p             trunc
-      sinh           fdim               log2              carg
-      tanh           floor              logb              cimag
-      exp            fma                lrint             conj
-      log            fmax               lround            cproj
-      pow            fmin               nearbyint         creal
-<a name="B.22" href="#B.22"><b>B.22 Date and time &lt;time.h&gt;</b></a>
-      NULL                  size_t                  time_t
-      CLOCKS_PER_SEC        clock_t                 struct tm
-      clock_t clock(void);
-      double difftime(time_t time1, time_t time0);
-      time_t mktime(struct tm *timeptr);
-      time_t time(time_t *timer);
-      char *asctime(const struct tm *timeptr);
-      char *ctime(const time_t *timer);
-      struct tm *gmtime(const time_t *timer);
-      struct tm *localtime(const time_t *timer);
-      size_t strftime(char * restrict s,
-           size_t maxsize,
-           const char * restrict format,
-           const struct tm * restrict timeptr);
-
-
-
-
-[<a name="p434" href="#p434">page 434</a>] (<a href="#Contents">Contents</a>)
-
-<a name="B.23" href="#B.23"><b>B.23 Extended multibyte/wide character utilities &lt;wchar.h&gt;</b></a>
-        wchar_t       wint_t             WCHAR_MAX
-        size_t        struct tm          WCHAR_MIN
-        mbstate_t     NULL               WEOF
-        int fwprintf(FILE * restrict stream,
-             const wchar_t * restrict format, ...);
+</pre>
+<p><b>Description</b>
+<p><!--para 2 -->
+ The strlen function computes the length of the string pointed to by s.
+<p><b>Returns</b>
+<p><!--para 3 -->
+ The strlen function returns the number of characters that precede the terminating null
+ character.
+<!--page 347 -->
+
+<h3><a name="7.22" href="#7.22">7.22 Type-generic math &lt;tgmath.h&gt;</a></h3>
+<p><!--para 1 -->
+ The header <a href="#7.22">&lt;tgmath.h&gt;</a> includes the headers <a href="#7.12">&lt;math.h&gt;</a> and <a href="#7.3">&lt;complex.h&gt;</a> and
+ defines several type-generic macros.
+<p><!--para 2 -->
+ Of the <a href="#7.12">&lt;math.h&gt;</a> and <a href="#7.3">&lt;complex.h&gt;</a> functions without an f (float) or l (long
+ double) suffix, several have one or more parameters whose corresponding real type is
+ double. For each such function, except modf, there is a corresponding type-generic
+ macro.<sup><a href="#note272"><b>272)</b></a></sup> The parameters whose corresponding real type is double in the function
+ synopsis are generic parameters. Use of the macro invokes a function whose
+ corresponding real type and type domain are determined by the arguments for the generic
+ parameters.<sup><a href="#note273"><b>273)</b></a></sup>
+<p><!--para 3 -->
+ Use of the macro invokes a function whose generic parameters have the corresponding
+ real type determined as follows:
+<ul>
+<li>  First, if any argument for generic parameters has type long double, the type
+ determined is long double.
+<li>  Otherwise, if any argument for generic parameters has type double or is of integer
+ type, the type determined is double.
+<li>  Otherwise, the type determined is float.
+</ul>
+<p><!--para 4 -->
+ For each unsuffixed function in <a href="#7.12">&lt;math.h&gt;</a> for which there is a function in
+ <a href="#7.3">&lt;complex.h&gt;</a> with the same name except for a c prefix, the corresponding type-
+ generic macro (for both functions) has the same name as the function in <a href="#7.12">&lt;math.h&gt;</a>. The
+ corresponding type-generic macro for fabs and cabs is fabs.
+<!--page 348 -->
+<pre>
+         <a href="#7.12">&lt;math.h&gt;</a>          <a href="#7.3">&lt;complex.h&gt;</a>           type-generic
+          function            function              macro
+
+           acos               cacos                acos
+           asin               casin                asin
+           atan               catan                atan
+           acosh              cacosh               acosh
+           asinh              casinh               asinh
+           atanh              catanh               atanh
+           cos                ccos                 cos
+           sin                csin                 sin
+           tan                ctan                 tan
+           cosh               ccosh                cosh
+           sinh               csinh                sinh
+           tanh               ctanh                tanh
+           exp                cexp                 exp
+           log                clog                 log
+           pow                cpow                 pow
+           sqrt               csqrt                sqrt
+           fabs               cabs                 fabs
+</pre>
+ If at least one argument for a generic parameter is complex, then use of the macro invokes
+ a complex function; otherwise, use of the macro invokes a real function.
+<p><!--para 5 -->
+ For each unsuffixed function in <a href="#7.12">&lt;math.h&gt;</a> without a c-prefixed counterpart in
+ <a href="#7.3">&lt;complex.h&gt;</a> (except modf), the corresponding type-generic macro has the same
+ name as the function. These type-generic macros are:
+<pre>
+       atan2                fma                  llround              remainder
+       cbrt                 fmax                 log10                remquo
+       ceil                 fmin                 log1p                rint
+       copysign             fmod                 log2                 round
+       erf                  frexp                logb                 scalbn
+       erfc                 hypot                lrint                scalbln
+       exp2                 ilogb                lround               tgamma
+       expm1                ldexp                nearbyint            trunc
+       fdim                 lgamma               nextafter
+       floor                llrint               nexttoward
+</pre>
+ If all arguments for generic parameters are real, then use of the macro invokes a real
+ function; otherwise, use of the macro results in undefined behavior.
+<p><!--para 6 -->
+ For each unsuffixed function in <a href="#7.3">&lt;complex.h&gt;</a> that is not a c-prefixed counterpart to a
+ function in <a href="#7.12">&lt;math.h&gt;</a>, the corresponding type-generic macro has the same name as the
+ function. These type-generic macros are:
+<!--page 349 -->
+<pre>
+         carg                    conj                     creal
+         cimag                   cproj
+</pre>
+ Use of the macro with any real or complex argument invokes a complex function.
+<p><!--para 7 -->
+ EXAMPLE       With the declarations
+<pre>
+         #include <a href="#7.22">&lt;tgmath.h&gt;</a>
+         int n;
+         float f;
+         double d;
+         long double ld;
+         float complex fc;
+         double complex dc;
+         long double complex ldc;
+</pre>
+ functions invoked by use of type-generic macros are shown in the following table:
+<!--page 350 -->
+<pre>
+                macro use                                  invokes
+
+             exp(n)                              exp(n), the function
+             acosh(f)                            acoshf(f)
+             sin(d)                              sin(d), the function
+             atan(ld)                            atanl(ld)
+             log(fc)                             clogf(fc)
+             sqrt(dc)                            csqrt(dc)
+             pow(ldc, f)                         cpowl(ldc, f)
+             remainder(n, n)                     remainder(n, n), the function
+             nextafter(d, f)                     nextafter(d, f), the function
+             nexttoward(f, ld)                   nexttowardf(f, ld)
+             copysign(n, ld)                     copysignl(n, ld)
+             ceil(fc)                            undefined behavior
+             rint(dc)                            undefined behavior
+             fmax(ldc, ld)                       undefined behavior
+             carg(n)                             carg(n), the function
+             cproj(f)                            cprojf(f)
+             creal(d)                            creal(d), the function
+             cimag(ld)                           cimagl(ld)
+             fabs(fc)                            cabsf(fc)
+             carg(dc)                            carg(dc), the function
+             cproj(ldc)                          cprojl(ldc)
+</pre>
+
+<p><b>Footnotes</b>
+<p><small><a name="note272" href="#note272">272)</a> Like other function-like macros in Standard libraries, each type-generic macro can be suppressed to
+ make available the corresponding ordinary function.
+</small>
+<p><small><a name="note273" href="#note273">273)</a> If the type of the argument is not compatible with the type of the parameter for the selected function,
+ the behavior is undefined.
+</small>
+
+<h3><a name="7.23" href="#7.23">7.23 Date and time &lt;time.h&gt;</a></h3>
+
+<h4><a name="7.23.1" href="#7.23.1">7.23.1 Components of time</a></h4>
+<p><!--para 1 -->
+ The header <a href="#7.23">&lt;time.h&gt;</a> defines two macros, and declares several types and functions for
+ manipulating time. Many functions deal with a calendar time that represents the current
+ date (according to the Gregorian calendar) and time. Some functions deal with local
+ time, which is the calendar time expressed for some specific time zone, and with Daylight
+ Saving Time, which is a temporary change in the algorithm for determining local time.
+ The local time zone and Daylight Saving Time are implementation-defined.
+<p><!--para 2 -->
+ The macros defined are NULL (described in <a href="#7.17">7.17</a>); and
+<pre>
+         CLOCKS_PER_SEC
+</pre>
+ which expands to an expression with type clock_t (described below) that is the
+ number per second of the value returned by the clock function.
+<p><!--para 3 -->
+ The types declared are size_t (described in <a href="#7.17">7.17</a>);
+<pre>
+         clock_t
+</pre>
+ and
+<pre>
+         time_t
+</pre>
+ which are arithmetic types capable of representing times; and
+<pre>
+         struct tm
+</pre>
+ which holds the components of a calendar time, called the broken-down time.
+<p><!--para 4 -->
+ The range and precision of times representable in clock_t and time_t are
+ implementation-defined. The tm structure shall contain at least the following members,
+ in any order. The semantics of the members and their normal ranges are expressed in the
+ comments.<sup><a href="#note274"><b>274)</b></a></sup>
+<pre>
+         int    tm_sec;           //   seconds after the minute -- [0, 60]
+         int    tm_min;           //   minutes after the hour -- [0, 59]
+         int    tm_hour;          //   hours since midnight -- [0, 23]
+         int    tm_mday;          //   day of the month -- [1, 31]
+         int    tm_mon;           //   months since January -- [0, 11]
+         int    tm_year;          //   years since 1900
+         int    tm_wday;          //   days since Sunday -- [0, 6]
+         int    tm_yday;          //   days since January 1 -- [0, 365]
+         int    tm_isdst;         //   Daylight Saving Time flag
+</pre>
+<!--page 351 -->
+ The value of tm_isdst is positive if Daylight Saving Time is in effect, zero if Daylight
+ Saving Time is not in effect, and negative if the information is not available.
+
+<p><b>Footnotes</b>
+<p><small><a name="note274" href="#note274">274)</a> The range [0, 60] for tm_sec allows for a positive leap second.
+</small>
+
+<h4><a name="7.23.2" href="#7.23.2">7.23.2 Time manipulation functions</a></h4>
+
+<h5><a name="7.23.2.1" href="#7.23.2.1">7.23.2.1 The clock function</a></h5>
+<p><b>Synopsis</b>
+<p><!--para 1 -->
+<pre>
+         #include <a href="#7.23">&lt;time.h&gt;</a>
+         clock_t clock(void);
+</pre>
+<p><b>Description</b>
+<p><!--para 2 -->
+ The clock function determines the processor time used.
+<p><b>Returns</b>
+<p><!--para 3 -->
+ The clock function returns the implementation's best approximation to the processor
+ time used by the program since the beginning of an implementation-defined era related
+ only to the program invocation. To determine the time in seconds, the value returned by
+ the clock function should be divided by the value of the macro CLOCKS_PER_SEC. If
+ the processor time used is not available or its value cannot be represented, the function
+ returns the value (clock_t)(-1).<sup><a href="#note275"><b>275)</b></a></sup>
+
+<p><b>Footnotes</b>
+<p><small><a name="note275" href="#note275">275)</a> In order to measure the time spent in a program, the clock function should be called at the start of
+ the program and its return value subtracted from the value returned by subsequent calls.
+</small>
+
+<h5><a name="7.23.2.2" href="#7.23.2.2">7.23.2.2 The difftime function</a></h5>
+<p><b>Synopsis</b>
+<p><!--para 1 -->
+<pre>
+         #include <a href="#7.23">&lt;time.h&gt;</a>
+         double difftime(time_t time1, time_t time0);
+</pre>
+<p><b>Description</b>
+<p><!--para 2 -->
+ The difftime function computes the difference between two calendar times: time1 -
+ time0.
+<p><b>Returns</b>
+<p><!--para 3 -->
+ The difftime function returns the difference expressed in seconds as a double.
+<!--page 352 -->
+
+<h5><a name="7.23.2.3" href="#7.23.2.3">7.23.2.3 The mktime function</a></h5>
+<p><b>Synopsis</b>
+<p><!--para 1 -->
+<pre>
+         #include <a href="#7.23">&lt;time.h&gt;</a>
+         time_t mktime(struct tm *timeptr);
+</pre>
+<p><b>Description</b>
+<p><!--para 2 -->
+ The mktime function converts the broken-down time, expressed as local time, in the
+ structure pointed to by timeptr into a calendar time value with the same encoding as
+ that of the values returned by the time function. The original values of the tm_wday
+ and tm_yday components of the structure are ignored, and the original values of the
+ other components are not restricted to the ranges indicated above.<sup><a href="#note276"><b>276)</b></a></sup> On successful
+ completion, the values of the tm_wday and tm_yday components of the structure are
+ set appropriately, and the other components are set to represent the specified calendar
+ time, but with their values forced to the ranges indicated above; the final value of
+ tm_mday is not set until tm_mon and tm_year are determined.
+<p><b>Returns</b>
+<p><!--para 3 -->
+ The mktime function returns the specified calendar time encoded as a value of type
+ time_t. If the calendar time cannot be represented, the function returns the value
+ (time_t)(-1).
+<p><!--para 4 -->
+ EXAMPLE       What day of the week is July 4, 2001?
+<pre>
+         #include <a href="#7.19">&lt;stdio.h&gt;</a>
+         #include <a href="#7.23">&lt;time.h&gt;</a>
+         static const char *const wday[] = {
+                 "Sunday", "Monday", "Tuesday", "Wednesday",
+                 "Thursday", "Friday", "Saturday", "-unknown-"
+         };
+         struct tm time_str;
+         /* ... */
+</pre>
+<!--page 353 -->
+<pre>
+        time_str.tm_year   = 2001 - 1900;
+        time_str.tm_mon    = 7 - 1;
+        time_str.tm_mday   = 4;
+        time_str.tm_hour   = 0;
+        time_str.tm_min    = 0;
+        time_str.tm_sec    = 1;
+        time_str.tm_isdst = -1;
+        if (mktime(&amp;time_str) == (time_t)(-1))
+              time_str.tm_wday = 7;
+        printf("%s\n", wday[time_str.tm_wday]);
+</pre>
+
+<p><b>Footnotes</b>
+<p><small><a name="note276" href="#note276">276)</a> Thus, a positive or zero value for tm_isdst causes the mktime function to presume initially that
+ Daylight Saving Time, respectively, is or is not in effect for the specified time. A negative value
+ causes it to attempt to determine whether Daylight Saving Time is in effect for the specified time.
+</small>
+
+<h5><a name="7.23.2.4" href="#7.23.2.4">7.23.2.4 The time function</a></h5>
+<p><b>Synopsis</b>
+<p><!--para 1 -->
+<pre>
+        #include <a href="#7.23">&lt;time.h&gt;</a>
+        time_t time(time_t *timer);
+</pre>
+<p><b>Description</b>
+<p><!--para 2 -->
+ The time function determines the current calendar time. The encoding of the value is
+ unspecified.
+<p><b>Returns</b>
+<p><!--para 3 -->
+ The time function returns the implementation's best approximation to the current
+ calendar time. The value (time_t)(-1) is returned if the calendar time is not
+ available. If timer is not a null pointer, the return value is also assigned to the object it
+ points to.
+
+<h4><a name="7.23.3" href="#7.23.3">7.23.3 Time conversion functions</a></h4>
+<p><!--para 1 -->
+ Except for the strftime function, these functions each return a pointer to one of two
+ types of static objects: a broken-down time structure or an array of char. Execution of
+ any of the functions that return a pointer to one of these object types may overwrite the
+ information in any object of the same type pointed to by the value returned from any
+ previous call to any of them. The implementation shall behave as if no other library
+ functions call these functions.
+
+<h5><a name="7.23.3.1" href="#7.23.3.1">7.23.3.1 The asctime function</a></h5>
+<p><b>Synopsis</b>
+<p><!--para 1 -->
+<pre>
+        #include <a href="#7.23">&lt;time.h&gt;</a>
+        char *asctime(const struct tm *timeptr);
+</pre>
+<p><b>Description</b>
+<p><!--para 2 -->
+ The asctime function converts the broken-down time in the structure pointed to by
+ timeptr into a string in the form
+<!--page 354 -->
+<pre>
+        Sun Sep 16 01:03:52 1973\n\0
+</pre>
+ using the equivalent of the following algorithm.
+<pre>
+ char *asctime(const struct tm *timeptr)
+ {
+      static const char wday_name[7][3] = {
+           "Sun", "Mon", "Tue", "Wed", "Thu", "Fri", "Sat"
+      };
+      static const char mon_name[12][3] = {
+           "Jan", "Feb", "Mar", "Apr", "May", "Jun",
+           "Jul", "Aug", "Sep", "Oct", "Nov", "Dec"
+      };
+      static char result[26];
+        sprintf(result, "%.3s %.3s%3d %.2d:%.2d:%.2d %d\n",
+             wday_name[timeptr-&gt;tm_wday],
+             mon_name[timeptr-&gt;tm_mon],
+             timeptr-&gt;tm_mday, timeptr-&gt;tm_hour,
+             timeptr-&gt;tm_min, timeptr-&gt;tm_sec,
+             1900 + timeptr-&gt;tm_year);
+        return result;
+ }
+</pre>
+<p><b>Returns</b>
+<p><!--para 3 -->
+ The asctime function returns a pointer to the string.
+
+<h5><a name="7.23.3.2" href="#7.23.3.2">7.23.3.2 The ctime function</a></h5>
+<p><b>Synopsis</b>
+<p><!--para 1 -->
+<pre>
+        #include <a href="#7.23">&lt;time.h&gt;</a>
+        char *ctime(const time_t *timer);
+</pre>
+<p><b>Description</b>
+<p><!--para 2 -->
+ The ctime function converts the calendar time pointed to by timer to local time in the
+ form of a string. It is equivalent to
+<pre>
+        asctime(localtime(timer))
+</pre>
+<p><b>Returns</b>
+<p><!--para 3 -->
+ The ctime function returns the pointer returned by the asctime function with that
+ broken-down time as argument.
+<p><b> Forward references</b>: the localtime function (<a href="#7.23.3.4">7.23.3.4</a>).
+<!--page 355 -->
+
+<h5><a name="7.23.3.3" href="#7.23.3.3">7.23.3.3 The gmtime function</a></h5>
+<p><b>Synopsis</b>
+<p><!--para 1 -->
+<pre>
+        #include <a href="#7.23">&lt;time.h&gt;</a>
+        struct tm *gmtime(const time_t *timer);
+</pre>
+<p><b>Description</b>
+<p><!--para 2 -->
+ The gmtime function converts the calendar time pointed to by timer into a broken-
+ down time, expressed as UTC.
+<p><b>Returns</b>
+<p><!--para 3 -->
+ The gmtime function returns a pointer to the broken-down time, or a null pointer if the
+ specified time cannot be converted to UTC.
+
+<h5><a name="7.23.3.4" href="#7.23.3.4">7.23.3.4 The localtime function</a></h5>
+<p><b>Synopsis</b>
+<p><!--para 1 -->
+<pre>
+        #include <a href="#7.23">&lt;time.h&gt;</a>
+        struct tm *localtime(const time_t *timer);
+</pre>
+<p><b>Description</b>
+<p><!--para 2 -->
+ The localtime function converts the calendar time pointed to by timer into a
+ broken-down time, expressed as local time.
+<p><b>Returns</b>
+<p><!--para 3 -->
+ The localtime function returns a pointer to the broken-down time, or a null pointer if
+ the specified time cannot be converted to local time.
+
+<h5><a name="7.23.3.5" href="#7.23.3.5">7.23.3.5 The strftime function</a></h5>
+<p><b>Synopsis</b>
+<p><!--para 1 -->
+<pre>
+        #include <a href="#7.23">&lt;time.h&gt;</a>
+        size_t strftime(char * restrict s,
+             size_t maxsize,
+             const char * restrict format,
+             const struct tm * restrict timeptr);
+</pre>
+<p><b>Description</b>
+<p><!--para 2 -->
+ The strftime function places characters into the array pointed to by s as controlled by
+ the string pointed to by format. The format shall be a multibyte character sequence,
+ beginning and ending in its initial shift state. The format string consists of zero or
+ more conversion specifiers and ordinary multibyte characters. A conversion specifier
+ consists of a % character, possibly followed by an E or O modifier character (described
+ below), followed by a character that determines the behavior of the conversion specifier.
+ All ordinary multibyte characters (including the terminating null character) are copied
+<!--page 356 -->
+ unchanged into the array. If copying takes place between objects that overlap, the
+ behavior is undefined. No more than maxsize characters are placed into the array.
+<p><!--para 3 -->
+ Each conversion specifier is replaced by appropriate characters as described in the
+ following list. The appropriate characters are determined using the LC_TIME category
+ of the current locale and by the values of zero or more members of the broken-down time
+ structure pointed to by timeptr, as specified in brackets in the description. If any of
+ the specified values is outside the normal range, the characters stored are unspecified.
+<dl>
+<dt> %a   <dd> is replaced by the locale's abbreviated weekday name. [tm_wday]
+<dt> %A   <dd> is replaced by the locale's full weekday name. [tm_wday]
+<dt> %b   <dd> is replaced by the locale's abbreviated month name. [tm_mon]
+<dt> %B   <dd> is replaced by the locale's full month name. [tm_mon]
+<dt> %c   <dd> is replaced by the locale's appropriate date and time representation. [all specified
+       in <a href="#7.23.1">7.23.1</a>]
+<dt> %C   <dd> is replaced by the year divided by 100 and truncated to an integer, as a decimal
+       number (00-99). [tm_year]
+<dt> %d   <dd> is replaced by the day of the month as a decimal number (01-31). [tm_mday]
+<dt> %D   <dd> is equivalent to ''%m/%d/%y''. [tm_mon, tm_mday, tm_year]
+<dt> %e   <dd> is replaced by the day of the month as a decimal number (1-31); a single digit is
+       preceded by a space. [tm_mday]
+<dt> %F   <dd> is equivalent to ''%Y-%m-%d'' (the ISO 8601 date format). [tm_year, tm_mon,
+       tm_mday]
+<dt> %g   <dd> is replaced by the last 2 digits of the week-based year (see below) as a decimal
+       number (00-99). [tm_year, tm_wday, tm_yday]
+<dt> %G   <dd> is replaced by the week-based year (see below) as a decimal number (e.g., 1997).
+       [tm_year, tm_wday, tm_yday]
+<dt> %h   <dd> is equivalent to ''%b''. [tm_mon]
+<dt> %H   <dd> is replaced by the hour (24-hour clock) as a decimal number (00-23). [tm_hour]
+<dt> %I   <dd> is replaced by the hour (12-hour clock) as a decimal number (01-12). [tm_hour]
+<dt> %j   <dd> is replaced by the day of the year as a decimal number (001-366). [tm_yday]
+<dt> %m   <dd> is replaced by the month as a decimal number (01-12). [tm_mon]
+<dt> %M   <dd> is replaced by the minute as a decimal number (00-59). [tm_min]
+<dt> %n   <dd> is replaced by a new-line character.
+<dt> %p   <dd> is replaced by the locale's equivalent of the AM/PM designations associated with a
+       12-hour clock. [tm_hour]
+<dt> %r   <dd> is replaced by the locale's 12-hour clock time. [tm_hour, tm_min, tm_sec]
+<dt> %R   <dd> is equivalent to ''%H:%M''. [tm_hour, tm_min]
+<dt> %S   <dd> is replaced by the second as a decimal number (00-60). [tm_sec]
+<dt> %t   <dd> is replaced by a horizontal-tab character.
+<dt> %T   <dd> is equivalent to ''%H:%M:%S'' (the ISO 8601 time format). [tm_hour, tm_min,
+<!--page 357 -->
+       tm_sec]
+<dt> %u   <dd>is replaced by the ISO 8601 weekday as a decimal number (1-7), where Monday
+      is 1. [tm_wday]
+<dt> %U  <dd> is replaced by the week number of the year (the first Sunday as the first day of week
+      1) as a decimal number (00-53). [tm_year, tm_wday, tm_yday]
+<dt> %V  <dd> is replaced by the ISO 8601 week number (see below) as a decimal number
+      (01-53). [tm_year, tm_wday, tm_yday]
+<dt> %w  <dd> is replaced by the weekday as a decimal number (0-6), where Sunday is 0.
+      [tm_wday]
+<dt> %W  <dd> is replaced by the week number of the year (the first Monday as the first day of
+      week 1) as a decimal number (00-53). [tm_year, tm_wday, tm_yday]
+<dt> %x  <dd> is replaced by the locale's appropriate date representation. [all specified in <a href="#7.23.1">7.23.1</a>]
+<dt> %X  <dd> is replaced by the locale's appropriate time representation. [all specified in <a href="#7.23.1">7.23.1</a>]
+<dt> %y  <dd> is replaced by the last 2 digits of the year as a decimal number (00-99).
+      [tm_year]
+<dt> %Y  <dd> is replaced by the year as a decimal number (e.g., 1997). [tm_year]
+<dt> %z  <dd> is replaced by the offset from UTC in the ISO 8601 format ''-0430'' (meaning 4
+      hours 30 minutes behind UTC, west of Greenwich), or by no characters if no time
+      zone is determinable. [tm_isdst]
+<dt> %Z  <dd> is replaced by the locale's time zone name or abbreviation, or by no characters if no
+      time zone is determinable. [tm_isdst]
+<dt> %%  <dd> is replaced by %.
+</dl>
+<p><!--para 4 -->
+ Some conversion specifiers can be modified by the inclusion of an E or O modifier
+ character to indicate an alternative format or specification. If the alternative format or
+ specification does not exist for the current locale, the modifier is ignored.
+<dl>
+<dt> %Ec <dd> is replaced by the locale's alternative date and time representation.
+<dt> %EC <dd>is replaced by the name of the base year (period) in the locale's alternative
+     representation.
+<dt> %Ex <dd>is replaced by the locale's alternative date representation.
+<dt> %EX <dd>is replaced by the locale's alternative time representation.
+<dt> %Ey <dd>is replaced by the offset from %EC (year only) in the locale's alternative
+     representation.
+<dt> %EY <dd>is replaced by the locale's full alternative year representation.
+<dt> %Od <dd>is replaced by the day of the month, using the locale's alternative numeric symbols
+     (filled as needed with leading zeros, or with leading spaces if there is no alternative
+     symbol for zero).
+<dt> %Oe <dd>is replaced by the day of the month, using the locale's alternative numeric symbols
+     (filled as needed with leading spaces).
+<dt> %OH <dd>is replaced by the hour (24-hour clock), using the locale's alternative numeric
+<!--page 358 -->
+     symbols.
+<dt> %OI <dd>is replaced by the hour (12-hour clock), using the locale's alternative numeric
+     symbols.
+<dt> %Om <dd>is replaced by the month, using the locale's alternative numeric symbols.
+<dt> %OM <dd>is replaced by the minutes, using the locale's alternative numeric symbols.
+<dt> %OS <dd>is replaced by the seconds, using the locale's alternative numeric symbols.
+<dt> %Ou <dd>is replaced by the ISO 8601 weekday as a number in the locale's alternative
+     representation, where Monday is 1.
+<dt> %OU <dd>is replaced by the week number, using the locale's alternative numeric symbols.
+<dt> %OV <dd>is replaced by the ISO 8601 week number, using the locale's alternative numeric
+     symbols.
+<dt> %Ow <dd>is replaced by the weekday as a number, using the locale's alternative numeric
+     symbols.
+<dt> %OW <dd>is replaced by the week number of the year, using the locale's alternative numeric
+     symbols.
+<dt> %Oy <dd>is replaced by the last 2 digits of the year, using the locale's alternative numeric
+     symbols.
+</dl>
+<p><!--para 5 -->
+ %g, %G, and %V give values according to the ISO 8601 week-based year. In this system,
+ weeks begin on a Monday and week 1 of the year is the week that includes January 4th,
+ which is also the week that includes the first Thursday of the year, and is also the first
+ week that contains at least four days in the year. If the first Monday of January is the
+ 2nd, 3rd, or 4th, the preceding days are part of the last week of the preceding year; thus,
+ for Saturday 2nd January 1999, %G is replaced by 1998 and %V is replaced by 53. If
+ December 29th, 30th, or 31st is a Monday, it and any following days are part of week 1 of
+ the following year. Thus, for Tuesday 30th December 1997, %G is replaced by 1998 and
+ %V is replaced by 01.
+<p><!--para 6 -->
+ If a conversion specifier is not one of the above, the behavior is undefined.
+<p><!--para 7 -->
+ In the "C" locale, the E and O modifiers are ignored and the replacement strings for the
+ following specifiers are:
+<dl>
+<dt> %a  <dd>  the first three characters of %A.
+<dt> %A  <dd>  one of ''Sunday'', ''Monday'', ... , ''Saturday''.
+<dt> %b  <dd>  the first three characters of %B.
+<dt> %B  <dd>  one of ''January'', ''February'', ... , ''December''.
+<dt> %c  <dd>  equivalent to ''%a %b %e %T %Y''.
+<dt> %p  <dd>  one of ''AM'' or ''PM''.
+<dt> %r  <dd>  equivalent to ''%I:%M:%S %p''.
+<dt> %x  <dd>  equivalent to ''%m/%d/%y''.
+<dt> %X  <dd>  equivalent to %T.
+<dt> %Z  <dd>  implementation-defined.
+</dl>
+<!--page 359 -->
+<p><b>Returns</b>
+<p><!--para 8 -->
+ If the total number of resulting characters including the terminating null character is not
+ more than maxsize, the strftime function returns the number of characters placed
+ into the array pointed to by s not including the terminating null character. Otherwise,
+ zero is returned and the contents of the array are indeterminate.
+<!--page 360 -->
+
+<h3><a name="7.24" href="#7.24">7.24 Extended multibyte and wide character utilities &lt;wchar.h&gt;</a></h3>
+
+<h4><a name="7.24.1" href="#7.24.1">7.24.1 Introduction</a></h4>
+<p><!--para 1 -->
+ The header <a href="#7.24">&lt;wchar.h&gt;</a> declares four data types, one tag, four macros, and many
+ functions.<sup><a href="#note277"><b>277)</b></a></sup>
+<p><!--para 2 -->
+ The types declared are wchar_t and size_t (both described in <a href="#7.17">7.17</a>);
+<pre>
+          mbstate_t
+</pre>
+ which is an object type other than an array type that can hold the conversion state
+ information necessary to convert between sequences of multibyte characters and wide
+ characters;
+<pre>
+          wint_t
+</pre>
+ which is an integer type unchanged by default argument promotions that can hold any
+ value corresponding to members of the extended character set, as well as at least one
+ value that does not correspond to any member of the extended character set (see WEOF
+ below);<sup><a href="#note278"><b>278)</b></a></sup> and
+<pre>
+          struct tm
+</pre>
+ which is declared as an incomplete structure type (the contents are described in <a href="#7.23.1">7.23.1</a>).
+<p><!--para 3 -->
+ The macros defined are NULL (described in <a href="#7.17">7.17</a>); WCHAR_MIN and WCHAR_MAX
+ (described in <a href="#7.18.3">7.18.3</a>); and
+<pre>
+          WEOF
+</pre>
+ which expands to a constant expression of type wint_t whose value does not
+ correspond to any member of the extended character set.<sup><a href="#note279"><b>279)</b></a></sup> It is accepted (and returned)
+ by several functions in this subclause to indicate end-of-file, that is, no more input from a
+ stream. It is also used as a wide character value that does not correspond to any member
+ of the extended character set.
+<p><!--para 4 -->
+ The functions declared are grouped as follows:
+<ul>
+<li>  Functions that perform input and output of wide characters, or multibyte characters,
+ or both;
+<li>  Functions that provide wide string numeric conversion;
+<li>  Functions that perform general wide string manipulation;
+<!--page 361 -->
+<li>  Functions for wide string date and time conversion; and
+<li>  Functions that provide extended capabilities for conversion between multibyte and
+ wide character sequences.
+</ul>
+<p><!--para 5 -->
+ Unless explicitly stated otherwise, if the execution of a function described in this
+ subclause causes copying to take place between objects that overlap, the behavior is
+ undefined.
+
+<p><b>Footnotes</b>
+<p><small><a name="note277" href="#note277">277)</a> See ''future library directions'' (<a href="#7.26.12">7.26.12</a>).
+</small>
+<p><small><a name="note278" href="#note278">278)</a> wchar_t and wint_t can be the same integer type.
+</small>
+<p><small><a name="note279" href="#note279">279)</a> The value of the macro WEOF may differ from that of EOF and need not be negative.
+</small>
+
+<h4><a name="7.24.2" href="#7.24.2">7.24.2 Formatted wide character input/output functions</a></h4>
+<p><!--para 1 -->
+ The formatted wide character input/output functions shall behave as if there is a sequence
+ point after the actions associated with each specifier.<sup><a href="#note280"><b>280)</b></a></sup>
+
+<p><b>Footnotes</b>
+<p><small><a name="note280" href="#note280">280)</a> The fwprintf functions perform writes to memory for the %n specifier.
+</small>
+
+<h5><a name="7.24.2.1" href="#7.24.2.1">7.24.2.1 The fwprintf function</a></h5>
+<p><b>Synopsis</b>
+<p><!--para 1 -->
+<pre>
+         #include <a href="#7.19">&lt;stdio.h&gt;</a>
+         #include <a href="#7.24">&lt;wchar.h&gt;</a>
+         int fwprintf(FILE * restrict stream,
+              const wchar_t * restrict format, ...);
+</pre>
+<p><b>Description</b>
+<p><!--para 2 -->
+ The fwprintf function writes output to the stream pointed to by stream, under
+ control of the wide string pointed to by format that specifies how subsequent arguments
+ are converted for output. If there are insufficient arguments for the format, the behavior
+ is undefined. If the format is exhausted while arguments remain, the excess arguments
+ are evaluated (as always) but are otherwise ignored. The fwprintf function returns
+ when the end of the format string is encountered.
+<p><!--para 3 -->
+ The format is composed of zero or more directives: ordinary wide characters (not %),
+ which are copied unchanged to the output stream; and conversion specifications, each of
+ which results in fetching zero or more subsequent arguments, converting them, if
+ applicable, according to the corresponding conversion specifier, and then writing the
+ result to the output stream.
+<p><!--para 4 -->
+ Each conversion specification is introduced by the wide character %. After the %, the
+ following appear in sequence:
+<ul>
+<li>  Zero or more flags (in any order) that modify the meaning of the conversion
+ specification.
+<li>  An optional minimum field width. If the converted value has fewer wide characters
+ than the field width, it is padded with spaces (by default) on the left (or right, if the
+<!--page 362 -->
+   left adjustment flag, described later, has been given) to the field width. The field
+   width takes the form of an asterisk * (described later) or a nonnegative decimal
+   integer.<sup><a href="#note281"><b>281)</b></a></sup>
+<li>  An optional precision that gives the minimum number of digits to appear for the d, i,
+ o, u, x, and X conversions, the number of digits to appear after the decimal-point
+ wide character for a, A, e, E, f, and F conversions, the maximum number of
+ significant digits for the g and G conversions, or the maximum number of wide
+ characters to be written for s conversions. The precision takes the form of a period
+ (.) followed either by an asterisk * (described later) or by an optional decimal
+ integer; if only the period is specified, the precision is taken as zero. If a precision
+ appears with any other conversion specifier, the behavior is undefined.
+<li>  An optional length modifier that specifies the size of the argument.
+<li>  A conversion specifier wide character that specifies the type of conversion to be
+ applied.
+</ul>
+<p><!--para 5 -->
+ As noted above, a field width, or precision, or both, may be indicated by an asterisk. In
+ this case, an int argument supplies the field width or precision. The arguments
+ specifying field width, or precision, or both, shall appear (in that order) before the
+ argument (if any) to be converted. A negative field width argument is taken as a - flag
+ followed by a positive field width. A negative precision argument is taken as if the
+ precision were omitted.
+<p><!--para 6 -->
+ The flag wide characters and their meanings are:
+<dl>
+<dt> -   <dd>     The result of the conversion is left-justified within the field. (It is right-justified if
+          this flag is not specified.)
+<dt> +   <dd>     The result of a signed conversion always begins with a plus or minus sign. (It
+          begins with a sign only when a negative value is converted if this flag is not
+          specified.)<sup><a href="#note282"><b>282)</b></a></sup>
+<dt> space<dd> If the first wide character of a signed conversion is not a sign, or if a signed
+       conversion results in no wide characters, a space is prefixed to the result. If the
+       space and + flags both appear, the space flag is ignored.
+<dt> #    <dd>    The result is converted to an ''alternative form''. For o conversion, it increases
+          the precision, if and only if necessary, to force the first digit of the result to be a
+          zero (if the value and precision are both 0, a single 0 is printed). For x (or X)
+          conversion, a nonzero result has 0x (or 0X) prefixed to it. For a, A, e, E, f, F, g,
+<!--page 363 -->
+           and G conversions, the result of converting a floating-point number always
+           contains a decimal-point wide character, even if no digits follow it. (Normally, a
+           decimal-point wide character appears in the result of these conversions only if a
+           digit follows it.) For g and G conversions, trailing zeros are not removed from the
+           result. For other conversions, the behavior is undefined.
+<dt> 0    <dd>     For d, i, o, u, x, X, a, A, e, E, f, F, g, and G conversions, leading zeros
+           (following any indication of sign or base) are used to pad to the field width rather
+           than performing space padding, except when converting an infinity or NaN. If the
+           0 and - flags both appear, the 0 flag is ignored. For d, i, o, u, x, and X
+           conversions, if a precision is specified, the 0 flag is ignored. For other
+           conversions, the behavior is undefined.
+</dl>
+<p><!--para 7 -->
+ The length modifiers and their meanings are:
+<dl>
+<dt> hh     <dd>        Specifies that a following d, i, o, u, x, or X conversion specifier applies to a
+                signed char or unsigned char argument (the argument will have
+                been promoted according to the integer promotions, but its value shall be
+                converted to signed char or unsigned char before printing); or that
+                a following n conversion specifier applies to a pointer to a signed char
+                argument.
+<dt> h      <dd>        Specifies that a following d, i, o, u, x, or X conversion specifier applies to a
+                short int or unsigned short int argument (the argument will
+                have been promoted according to the integer promotions, but its value shall
+                be converted to short int or unsigned short int before printing);
+                or that a following n conversion specifier applies to a pointer to a short
+                int argument.
+<dt> l (ell)<dd>        Specifies that a following d, i, o, u, x, or X conversion specifier applies to a
+                long int or unsigned long int argument; that a following n
+                conversion specifier applies to a pointer to a long int argument; that a
+                following c conversion specifier applies to a wint_t argument; that a
+                following s conversion specifier applies to a pointer to a wchar_t
+                argument; or has no effect on a following a, A, e, E, f, F, g, or G conversion
+                specifier.
+<dt> ll (ell-ell)<dd> Specifies that a following d, i, o, u, x, or X conversion specifier applies to a
+              long long int or unsigned long long int argument; or that a
+              following n conversion specifier applies to a pointer to a long long int
+              argument.
+<dt> j           <dd>   Specifies that a following d, i, o, u, x, or X conversion specifier applies to
+<!--page 364 -->
+                an intmax_t or uintmax_t argument; or that a following n conversion
+                specifier applies to a pointer to an intmax_t argument.
+<dt> z         <dd>  Specifies that a following d, i, o, u, x, or X conversion specifier applies to a
+             size_t or the corresponding signed integer type argument; or that a
+             following n conversion specifier applies to a pointer to a signed integer type
+             corresponding to size_t argument.
+<dt> t         <dd>  Specifies that a following d, i, o, u, x, or X conversion specifier applies to a
+             ptrdiff_t or the corresponding unsigned integer type argument; or that a
+             following n conversion specifier applies to a pointer to a ptrdiff_t
+             argument.
+<dt> L         <dd>  Specifies that a following a, A, e, E, f, F, g, or G conversion specifier
+             applies to a long double argument.
+</dl>
+ If a length modifier appears with any conversion specifier other than as specified above,
+ the behavior is undefined.
+<p><!--para 8 -->
+ The conversion specifiers and their meanings are:
+<dl>
+<dt> d,i   <dd>     The int argument is converted to signed decimal in the style [-]dddd. The
+            precision specifies the minimum number of digits to appear; if the value
+            being converted can be represented in fewer digits, it is expanded with
+            leading zeros. The default precision is 1. The result of converting a zero
+            value with a precision of zero is no wide characters.
+<dt> o,u,x,X<dd> The unsigned int argument is converted to unsigned octal (o), unsigned
+         decimal (u), or unsigned hexadecimal notation (x or X) in the style dddd; the
+         letters abcdef are used for x conversion and the letters ABCDEF for X
+         conversion. The precision specifies the minimum number of digits to appear;
+         if the value being converted can be represented in fewer digits, it is expanded
+         with leading zeros. The default precision is 1. The result of converting a
+         zero value with a precision of zero is no wide characters.
+<dt> f,F    <dd>    A double argument representing a floating-point number is converted to
+<!--page 365 -->
+            decimal notation in the style [-]ddd.ddd, where the number of digits after
+            the decimal-point wide character is equal to the precision specification. If the
+            precision is missing, it is taken as 6; if the precision is zero and the # flag is
+            not specified, no decimal-point wide character appears. If a decimal-point
+            wide character appears, at least one digit appears before it. The value is
+            rounded to the appropriate number of digits.
+            A double argument representing an infinity is converted in one of the styles
+            [-]inf or [-]infinity -- which style is implementation-defined. A
+            double argument representing a NaN is converted in one of the styles
+            [-]nan or [-]nan(n-wchar-sequence) -- which style, and the meaning of
+            any n-wchar-sequence, is implementation-defined. The F conversion
+            specifier produces INF, INFINITY, or NAN instead of inf, infinity, or
+              nan, respectively.<sup><a href="#note283"><b>283)</b></a></sup>
+<dt> e,E    <dd>      A double argument representing a floating-point number is converted in the
+              style [-]d.ddd e(+-)dd, where there is one digit (which is nonzero if the
+              argument is nonzero) before the decimal-point wide character and the number
+              of digits after it is equal to the precision; if the precision is missing, it is taken
+              as 6; if the precision is zero and the # flag is not specified, no decimal-point
+              wide character appears. The value is rounded to the appropriate number of
+              digits. The E conversion specifier produces a number with E instead of e
+              introducing the exponent. The exponent always contains at least two digits,
+              and only as many more digits as necessary to represent the exponent. If the
+              value is zero, the exponent is zero.
+              A double argument representing an infinity or NaN is converted in the style
+              of an f or F conversion specifier.
+<dt> g,G    <dd>      A double argument representing a floating-point number is converted in
+              style f or e (or in style F or E in the case of a G conversion specifier),
+              depending on the value converted and the precision. Let P equal the
+              precision if nonzero, 6 if the precision is omitted, or 1 if the precision is zero.
+              Then, if a conversion with style E would have an exponent of X :
+              <ul>
+              <li> if P &gt; X &gt;= -4, the conversion is with style f (or F) and precision
+                P - (X + 1).
+              <li> otherwise, the conversion is with style e (or E) and precision P - 1.
+              </ul>
+              Finally, unless the # flag is used, any trailing zeros are removed from the
+              fractional portion of the result and the decimal-point wide character is
+              removed if there is no fractional portion remaining.
+              A double argument representing an infinity or NaN is converted in the style
+              of an f or F conversion specifier.
+<dt> a,A    <dd>      A double argument representing a floating-point number is converted in the
+              style [-]0xh.hhhh p(+-)d, where there is one hexadecimal digit (which is
+              nonzero if the argument is a normalized floating-point number and is
+              otherwise unspecified) before the decimal-point wide character<sup><a href="#note284"><b>284)</b></a></sup> and the
+              number of hexadecimal digits after it is equal to the precision; if the precision
+              is missing and FLT_RADIX is a power of 2, then the precision is sufficient
+<!--page 366 -->
+              for an exact representation of the value; if the precision is missing and
+              FLT_RADIX is not a power of 2, then the precision is sufficient to
+              distinguish<sup><a href="#note285"><b>285)</b></a></sup> values of type double, except that trailing zeros may be
+              omitted; if the precision is zero and the # flag is not specified, no decimal-
+              point wide character appears. The letters abcdef are used for a conversion
+              and the letters ABCDEF for A conversion. The A conversion specifier
+              produces a number with X and P instead of x and p. The exponent always
+              contains at least one digit, and only as many more digits as necessary to
+              represent the decimal exponent of 2. If the value is zero, the exponent is
+              zero.
+              A double argument representing an infinity or NaN is converted in the style
+              of an f or F conversion specifier.
+<dt> c      <dd>      If no l length modifier is present, the int argument is converted to a wide
+              character as if by calling btowc and the resulting wide character is written.
+              If an l length modifier is present, the wint_t argument is converted to
+              wchar_t and written.
+<dt> s      <dd>      If no l length modifier is present, the argument shall be a pointer to the initial
+              element of a character array containing a multibyte character sequence
+              beginning in the initial shift state. Characters from the array are converted as
+              if by repeated calls to the mbrtowc function, with the conversion state
+              described by an mbstate_t object initialized to zero before the first
+              multibyte character is converted, and written up to (but not including) the
+              terminating null wide character. If the precision is specified, no more than
+              that many wide characters are written. If the precision is not specified or is
+              greater than the size of the converted array, the converted array shall contain a
+              null wide character.
+              If an l length modifier is present, the argument shall be a pointer to the initial
+              element of an array of wchar_t type. Wide characters from the array are
+              written up to (but not including) a terminating null wide character. If the
+              precision is specified, no more than that many wide characters are written. If
+              the precision is not specified or is greater than the size of the array, the array
+              shall contain a null wide character.
+<dt> p      <dd>      The argument shall be a pointer to void. The value of the pointer is
+              converted to a sequence of printing wide characters, in an implementation-
+<!--page 367 -->
+                defined manner.
+<dt> n      <dd>        The argument shall be a pointer to signed integer into which is written the
+                number of wide characters written to the output stream so far by this call to
+                fwprintf. No argument is converted, but one is consumed. If the
+                conversion specification includes any flags, a field width, or a precision, the
+                behavior is undefined.
+<dt> %      <dd>        A % wide character is written. No argument is converted. The complete
+                conversion specification shall be %%.
+</dl>
+<p><!--para 9 -->
+ If a conversion specification is invalid, the behavior is undefined.<sup><a href="#note286"><b>286)</b></a></sup> If any argument is
+ not the correct type for the corresponding conversion specification, the behavior is
+ undefined.
+<p><!--para 10 -->
+ In no case does a nonexistent or small field width cause truncation of a field; if the result
+ of a conversion is wider than the field width, the field is expanded to contain the
+ conversion result.
+<p><!--para 11 -->
+ For a and A conversions, if FLT_RADIX is a power of 2, the value is correctly rounded
+ to a hexadecimal floating number with the given precision.
+<p><b>Recommended practice</b>
+<p><!--para 12 -->
+ For a and A conversions, if FLT_RADIX is not a power of 2 and the result is not exactly
+ representable in the given precision, the result should be one of the two adjacent numbers
+ in hexadecimal floating style with the given precision, with the extra stipulation that the
+ error should have a correct sign for the current rounding direction.
+<p><!--para 13 -->
+ For e, E, f, F, g, and G conversions, if the number of significant decimal digits is at most
+ DECIMAL_DIG, then the result should be correctly rounded.<sup><a href="#note287"><b>287)</b></a></sup> If the number of
+ significant decimal digits is more than DECIMAL_DIG but the source value is exactly
+ representable with DECIMAL_DIG digits, then the result should be an exact
+ representation with trailing zeros. Otherwise, the source value is bounded by two
+ adjacent decimal strings L &lt; U, both having DECIMAL_DIG significant digits; the value
+ of the resultant decimal string D should satisfy L &lt;= D &lt;= U, with the extra stipulation that
+ the error should have a correct sign for the current rounding direction.
+<p><b>Returns</b>
+<p><!--para 14 -->
+ The fwprintf function returns the number of wide characters transmitted, or a negative
+ value if an output or encoding error occurred.
+<!--page 368 -->
+<p><b>Environmental limits</b>
+<p><!--para 15 -->
+ The number of wide characters that can be produced by any single conversion shall be at
+ least 4095.
+<p><!--para 16 -->
+ EXAMPLE       To print a date and time in the form ''Sunday, July 3, 10:02'' followed by pi to five decimal
+ places:
+<pre>
+        #include <a href="#7.12">&lt;math.h&gt;</a>
+        #include <a href="#7.19">&lt;stdio.h&gt;</a>
+        #include <a href="#7.24">&lt;wchar.h&gt;</a>
+        /* ... */
+        wchar_t *weekday, *month; // pointers to wide strings
+        int day, hour, min;
+        fwprintf(stdout, L"%ls, %ls %d, %.2d:%.2d\n",
+                weekday, month, day, hour, min);
+        fwprintf(stdout, L"pi = %.5f\n", 4 * atan(1.0));
+</pre>
+<p><b> Forward references</b>:          the btowc function (<a href="#7.24.6.1.1">7.24.6.1.1</a>), the mbrtowc function
+ (<a href="#7.24.6.3.2">7.24.6.3.2</a>).
+
+<p><b>Footnotes</b>
+<p><small><a name="note281" href="#note281">281)</a> Note that 0 is taken as a flag, not as the beginning of a field width.
+</small>
+<p><small><a name="note282" href="#note282">282)</a> The results of all floating conversions of a negative zero, and of negative values that round to zero,
+ include a minus sign.
+</small>
+<p><small><a name="note283" href="#note283">283)</a> When applied to infinite and NaN values, the -, +, and space flag wide characters have their usual
+ meaning; the # and 0 flag wide characters have no effect.
+</small>
+<p><small><a name="note284" href="#note284">284)</a> Binary implementations can choose the hexadecimal digit to the left of the decimal-point wide
+ character so that subsequent digits align to nibble (4-bit) boundaries.
+</small>
+<p><small><a name="note285" href="#note285">285)</a> The precision p is sufficient to distinguish values of the source type if 16<sup>p-1</sup> &gt; b n where b is
+ FLT_RADIX and n is the number of base-b digits in the significand of the source type. A smaller p
+ might suffice depending on the implementation's scheme for determining the digit to the left of the
+ decimal-point wide character.
+</small>
+<p><small><a name="note286" href="#note286">286)</a> See ''future library directions'' (<a href="#7.26.12">7.26.12</a>).
+</small>
+<p><small><a name="note287" href="#note287">287)</a> For binary-to-decimal conversion, the result format's values are the numbers representable with the
+ given format specifier. The number of significant digits is determined by the format specifier, and in
+ the case of fixed-point conversion by the source value as well.
+</small>
+
+<h5><a name="7.24.2.2" href="#7.24.2.2">7.24.2.2 The fwscanf function</a></h5>
+<p><b>Synopsis</b>
+<p><!--para 1 -->
+<pre>
+        #include <a href="#7.19">&lt;stdio.h&gt;</a>
+        #include <a href="#7.24">&lt;wchar.h&gt;</a>
         int fwscanf(FILE * restrict stream,
              const wchar_t * restrict format, ...);
-        int swprintf(wchar_t * restrict s, size_t n,
+</pre>
+<p><b>Description</b>
+<p><!--para 2 -->
+ The fwscanf function reads input from the stream pointed to by stream, under
+ control of the wide string pointed to by format that specifies the admissible input
+ sequences and how they are to be converted for assignment, using subsequent arguments
+ as pointers to the objects to receive the converted input. If there are insufficient
+ arguments for the format, the behavior is undefined. If the format is exhausted while
+ arguments remain, the excess arguments are evaluated (as always) but are otherwise
+ ignored.
+<p><!--para 3 -->
+ The format is composed of zero or more directives: one or more white-space wide
+ characters, an ordinary wide character (neither % nor a white-space wide character), or a
+ conversion specification. Each conversion specification is introduced by the wide
+ character %. After the %, the following appear in sequence:
+<ul>
+<li>  An optional assignment-suppressing wide character *.
+<li>  An optional decimal integer greater than zero that specifies the maximum field width
+ (in wide characters).
+<!--page 369 -->
+<li>  An optional length modifier that specifies the size of the receiving object.
+<li>  A conversion specifier wide character that specifies the type of conversion to be
+ applied.
+</ul>
+<p><!--para 4 -->
+ The fwscanf function executes each directive of the format in turn. If a directive fails,
+ as detailed below, the function returns. Failures are described as input failures (due to the
+ occurrence of an encoding error or the unavailability of input characters), or matching
+ failures (due to inappropriate input).
+<p><!--para 5 -->
+ A directive composed of white-space wide character(s) is executed by reading input up to
+ the first non-white-space wide character (which remains unread), or until no more wide
+ characters can be read.
+<p><!--para 6 -->
+ A directive that is an ordinary wide character is executed by reading the next wide
+ character of the stream. If that wide character differs from the directive, the directive
+ fails and the differing and subsequent wide characters remain unread. Similarly, if end-
+ of-file, an encoding error, or a read error prevents a wide character from being read, the
+ directive fails.
+<p><!--para 7 -->
+ A directive that is a conversion specification defines a set of matching input sequences, as
+ described below for each specifier. A conversion specification is executed in the
+ following steps:
+<p><!--para 8 -->
+ Input white-space wide characters (as specified by the iswspace function) are skipped,
+ unless the specification includes a [, c, or n specifier.<sup><a href="#note288"><b>288)</b></a></sup>
+<p><!--para 9 -->
+ An input item is read from the stream, unless the specification includes an n specifier. An
+ input item is defined as the longest sequence of input wide characters which does not
+ exceed any specified field width and which is, or is a prefix of, a matching input
+ sequence.<sup><a href="#note289"><b>289)</b></a></sup> The first wide character, if any, after the input item remains unread. If the
+ length of the input item is zero, the execution of the directive fails; this condition is a
+ matching failure unless end-of-file, an encoding error, or a read error prevented input
+ from the stream, in which case it is an input failure.
+<p><!--para 10 -->
+ Except in the case of a % specifier, the input item (or, in the case of a %n directive, the
+ count of input wide characters) is converted to a type appropriate to the conversion
+ specifier. If the input item is not a matching sequence, the execution of the directive fails:
+ this condition is a matching failure. Unless assignment suppression was indicated by a *,
+ the result of the conversion is placed in the object pointed to by the first argument
+ following the format argument that has not already received a conversion result. If this
+<!--page 370 -->
+ object does not have an appropriate type, or if the result of the conversion cannot be
+ represented in the object, the behavior is undefined.
+<p><!--para 11 -->
+ The length modifiers and their meanings are:
+<dl>
+<dt> hh      <dd>    Specifies that a following d, i, o, u, x, X, or n conversion specifier applies
+             to an argument with type pointer to signed char or unsigned char.
+<dt> h       <dd>    Specifies that a following d, i, o, u, x, X, or n conversion specifier applies
+             to an argument with type pointer to short int or unsigned short
+             int.
+<dt> l (ell) <dd>    Specifies that a following d, i, o, u, x, X, or n conversion specifier applies
+             to an argument with type pointer to long int or unsigned long
+             int; that a following a, A, e, E, f, F, g, or G conversion specifier applies to
+             an argument with type pointer to double; or that a following c, s, or [
+             conversion specifier applies to an argument with type pointer to wchar_t.
+<dt> ll (ell-ell)<dd> Specifies that a following d, i, o, u, x, X, or n conversion specifier applies
+              to an argument with type pointer to long long int or unsigned
+              long long int.
+<dt> j         <dd>  Specifies that a following d, i, o, u, x, X, or n conversion specifier applies
+             to an argument with type pointer to intmax_t or uintmax_t.
+<dt> z         <dd>  Specifies that a following d, i, o, u, x, X, or n conversion specifier applies
+             to an argument with type pointer to size_t or the corresponding signed
+             integer type.
+<dt> t         <dd>  Specifies that a following d, i, o, u, x, X, or n conversion specifier applies
+             to an argument with type pointer to ptrdiff_t or the corresponding
+             unsigned integer type.
+<dt> L         <dd>  Specifies that a following a, A, e, E, f, F, g, or G conversion specifier
+             applies to an argument with type pointer to long double.
+</dl>
+ If a length modifier appears with any conversion specifier other than as specified above,
+ the behavior is undefined.
+<p><!--para 12 -->
+ The conversion specifiers and their meanings are:
+<dl>
+<dt> d   <dd>       Matches an optionally signed decimal integer, whose format is the same as
+            expected for the subject sequence of the wcstol function with the value 10
+            for the base argument. The corresponding argument shall be a pointer to
+            signed integer.
+<dt> i   <dd>       Matches an optionally signed integer, whose format is the same as expected
+<!--page 371 -->
+            for the subject sequence of the wcstol function with the value 0 for the
+            base argument. The corresponding argument shall be a pointer to signed
+             integer.
+<dt> o   <dd>        Matches an optionally signed octal integer, whose format is the same as
+             expected for the subject sequence of the wcstoul function with the value 8
+             for the base argument. The corresponding argument shall be a pointer to
+             unsigned integer.
+<dt> u   <dd>        Matches an optionally signed decimal integer, whose format is the same as
+             expected for the subject sequence of the wcstoul function with the value 10
+             for the base argument. The corresponding argument shall be a pointer to
+             unsigned integer.
+<dt> x   <dd>        Matches an optionally signed hexadecimal integer, whose format is the same
+             as expected for the subject sequence of the wcstoul function with the value
+             16 for the base argument. The corresponding argument shall be a pointer to
+             unsigned integer.
+<dt> a,e,f,g<dd> Matches an optionally signed floating-point number, infinity, or NaN, whose
+         format is the same as expected for the subject sequence of the wcstod
+         function. The corresponding argument shall be a pointer to floating.
+<dt> c   <dd>        Matches a sequence of wide characters of exactly the number specified by the
+             field width (1 if no field width is present in the directive).
+             If no l length modifier is present, characters from the input field are
+             converted as if by repeated calls to the wcrtomb function, with the
+             conversion state described by an mbstate_t object initialized to zero
+             before the first wide character is converted. The corresponding argument
+             shall be a pointer to the initial element of a character array large enough to
+             accept the sequence. No null character is added.
+             If an l length modifier is present, the corresponding argument shall be a
+             pointer to the initial element of an array of wchar_t large enough to accept
+             the sequence. No null wide character is added.
+<dt> s   <dd>        Matches a sequence of non-white-space wide characters.
+<!--page 372 -->
+             If no l length modifier is present, characters from the input field are
+             converted as if by repeated calls to the wcrtomb function, with the
+             conversion state described by an mbstate_t object initialized to zero
+             before the first wide character is converted. The corresponding argument
+             shall be a pointer to the initial element of a character array large enough to
+             accept the sequence and a terminating null character, which will be added
+             automatically.
+             If an l length modifier is present, the corresponding argument shall be a
+             pointer to the initial element of an array of wchar_t large enough to accept
+          the sequence and the terminating null wide character, which will be added
+          automatically.
+<dt> [   <dd>     Matches a nonempty sequence of wide characters from a set of expected
+          characters (the scanset).
+          If no l length modifier is present, characters from the input field are
+          converted as if by repeated calls to the wcrtomb function, with the
+          conversion state described by an mbstate_t object initialized to zero
+          before the first wide character is converted. The corresponding argument
+          shall be a pointer to the initial element of a character array large enough to
+          accept the sequence and a terminating null character, which will be added
+          automatically.
+          If an l length modifier is present, the corresponding argument shall be a
+          pointer to the initial element of an array of wchar_t large enough to accept
+          the sequence and the terminating null wide character, which will be added
+          automatically.
+          The conversion specifier includes all subsequent wide characters in the
+          format string, up to and including the matching right bracket (]). The wide
+          characters between the brackets (the scanlist) compose the scanset, unless the
+          wide character after the left bracket is a circumflex (^), in which case the
+          scanset contains all wide characters that do not appear in the scanlist between
+          the circumflex and the right bracket. If the conversion specifier begins with
+          [] or [^], the right bracket wide character is in the scanlist and the next
+          following right bracket wide character is the matching right bracket that ends
+          the specification; otherwise the first following right bracket wide character is
+          the one that ends the specification. If a - wide character is in the scanlist and
+          is not the first, nor the second where the first wide character is a ^, nor the
+          last character, the behavior is implementation-defined.
+<dt> p      <dd>  Matches an implementation-defined set of sequences, which should be the
+          same as the set of sequences that may be produced by the %p conversion of
+          the fwprintf function. The corresponding argument shall be a pointer to a
+          pointer to void. The input item is converted to a pointer value in an
+          implementation-defined manner. If the input item is a value converted earlier
+          during the same program execution, the pointer that results shall compare
+          equal to that value; otherwise the behavior of the %p conversion is undefined.
+<dt> n      <dd>  No input is consumed. The corresponding argument shall be a pointer to
+<!--page 373 -->
+          signed integer into which is to be written the number of wide characters read
+          from the input stream so far by this call to the fwscanf function. Execution
+          of a %n directive does not increment the assignment count returned at the
+          completion of execution of the fwscanf function. No argument is
+                converted, but one is consumed. If the conversion specification includes an
+                assignment-suppressing wide character or a field width, the behavior is
+                undefined.
+<dt> %      <dd>        Matches a single % wide character; no conversion or assignment occurs. The
+                complete conversion specification shall be %%.
+</dl>
+<p><!--para 13 -->
+ If a conversion specification is invalid, the behavior is undefined.<sup><a href="#note290"><b>290)</b></a></sup>
+<p><!--para 14 -->
+ The conversion specifiers A, E, F, G, and X are also valid and behave the same as,
+ respectively, a, e, f, g, and x.
+<p><!--para 15 -->
+ Trailing white space (including new-line wide characters) is left unread unless matched
+ by a directive. The success of literal matches and suppressed assignments is not directly
+ determinable other than via the %n directive.
+<p><b>Returns</b>
+<p><!--para 16 -->
+ The fwscanf function returns the value of the macro EOF if an input failure occurs
+ before any conversion. Otherwise, the function returns the number of input items
+ assigned, which can be fewer than provided for, or even zero, in the event of an early
+ matching failure.
+<p><!--para 17 -->
+ EXAMPLE 1        The call:
+<pre>
+          #include <a href="#7.19">&lt;stdio.h&gt;</a>
+          #include <a href="#7.24">&lt;wchar.h&gt;</a>
+          /* ... */
+          int n, i; float x; wchar_t name[50];
+          n = fwscanf(stdin, L"%d%f%ls", &amp;i, &amp;x, name);
+</pre>
+ with the input line:
+<pre>
+          25 54.32E-1 thompson
+</pre>
+ will assign to n the value 3, to i the value 25, to x the value 5.432, and to name the sequence
+ thompson\0.
+<p><!--para 18 -->
+ EXAMPLE 2        The call:
+<pre>
+          #include <a href="#7.19">&lt;stdio.h&gt;</a>
+          #include <a href="#7.24">&lt;wchar.h&gt;</a>
+          /* ... */
+          int i; float x; double y;
+          fwscanf(stdin, L"%2d%f%*d %lf", &amp;i, &amp;x, &amp;y);
+</pre>
+ with input:
+<pre>
+          56789 0123 56a72
+</pre>
+ will assign to i the value 56 and to x the value 789.0, will skip past 0123, and will assign to y the value
+ 56.0. The next wide character read from the input stream will be a.
+<!--page 374 -->
+<p><b> Forward references</b>: the wcstod, wcstof, and wcstold functions (<a href="#7.24.4.1.1">7.24.4.1.1</a>), the
+ wcstol, wcstoll, wcstoul, and wcstoull functions (<a href="#7.24.4.1.2">7.24.4.1.2</a>), the wcrtomb
+ function (<a href="#7.24.6.3.3">7.24.6.3.3</a>).
+
+<p><b>Footnotes</b>
+<p><small><a name="note288" href="#note288">288)</a> These white-space wide characters are not counted against a specified field width.
+</small>
+<p><small><a name="note289" href="#note289">289)</a> fwscanf pushes back at most one input wide character onto the input stream. Therefore, some
+ sequences that are acceptable to wcstod, wcstol, etc., are unacceptable to fwscanf.
+</small>
+<p><small><a name="note290" href="#note290">290)</a> See ''future library directions'' (<a href="#7.26.12">7.26.12</a>).
+</small>
+
+<h5><a name="7.24.2.3" href="#7.24.2.3">7.24.2.3 The swprintf function</a></h5>
+<p><b>Synopsis</b>
+<p><!--para 1 -->
+<pre>
+        #include <a href="#7.24">&lt;wchar.h&gt;</a>
+        int swprintf(wchar_t * restrict s,
+             size_t n,
              const wchar_t * restrict format, ...);
+</pre>
+<p><b>Description</b>
+<p><!--para 2 -->
+ The swprintf function is equivalent to fwprintf, except that the argument s
+ specifies an array of wide characters into which the generated output is to be written,
+ rather than written to a stream. No more than n wide characters are written, including a
+ terminating null wide character, which is always added (unless n is zero).
+<p><b>Returns</b>
+<p><!--para 3 -->
+ The swprintf function returns the number of wide characters written in the array, not
+ counting the terminating null wide character, or a negative value if an encoding error
+ occurred or if n or more wide characters were requested to be written.
+
+<h5><a name="7.24.2.4" href="#7.24.2.4">7.24.2.4 The swscanf function</a></h5>
+<p><b>Synopsis</b>
+<p><!--para 1 -->
+<pre>
+        #include <a href="#7.24">&lt;wchar.h&gt;</a>
         int swscanf(const wchar_t * restrict s,
              const wchar_t * restrict format, ...);
+</pre>
+<p><b>Description</b>
+<p><!--para 2 -->
+ The swscanf function is equivalent to fwscanf, except that the argument s specifies a
+ wide string from which the input is to be obtained, rather than from a stream. Reaching
+ the end of the wide string is equivalent to encountering end-of-file for the fwscanf
+ function.
+<p><b>Returns</b>
+<p><!--para 3 -->
+ The swscanf function returns the value of the macro EOF if an input failure occurs
+ before any conversion. Otherwise, the swscanf function returns the number of input
+ items assigned, which can be fewer than provided for, or even zero, in the event of an
+ early matching failure.
+<!--page 375 -->
+
+<h5><a name="7.24.2.5" href="#7.24.2.5">7.24.2.5 The vfwprintf function</a></h5>
+<p><b>Synopsis</b>
+<p><!--para 1 -->
+<pre>
+        #include <a href="#7.15">&lt;stdarg.h&gt;</a>
+        #include <a href="#7.19">&lt;stdio.h&gt;</a>
+        #include <a href="#7.24">&lt;wchar.h&gt;</a>
         int vfwprintf(FILE * restrict stream,
-             const wchar_t * restrict format, va_list arg);
+             const wchar_t * restrict format,
+             va_list arg);
+</pre>
+<p><b>Description</b>
+<p><!--para 2 -->
+ The vfwprintf function is equivalent to fwprintf, with the variable argument list
+ replaced by arg, which shall have been initialized by the va_start macro (and
+ possibly subsequent va_arg calls). The vfwprintf function does not invoke the
+ va_end macro.<sup><a href="#note291"><b>291)</b></a></sup>
+<p><b>Returns</b>
+<p><!--para 3 -->
+ The vfwprintf function returns the number of wide characters transmitted, or a
+ negative value if an output or encoding error occurred.
+<p><!--para 4 -->
+ EXAMPLE       The following shows the use of the vfwprintf function in a general error-reporting
+ routine.
+<pre>
+        #include <a href="#7.15">&lt;stdarg.h&gt;</a>
+        #include <a href="#7.19">&lt;stdio.h&gt;</a>
+        #include <a href="#7.24">&lt;wchar.h&gt;</a>
+        void error(char *function_name, wchar_t *format, ...)
+        {
+              va_list args;
+                 va_start(args, format);
+                 // print out name of function causing error
+                 fwprintf(stderr, L"ERROR in %s: ", function_name);
+                 // print out remainder of message
+                 vfwprintf(stderr, format, args);
+                 va_end(args);
+        }
+</pre>
+<!--page 376 -->
+
+<p><b>Footnotes</b>
+<p><small><a name="note291" href="#note291">291)</a> As the functions vfwprintf, vswprintf, vfwscanf, vwprintf, vwscanf, and vswscanf
+ invoke the va_arg macro, the value of arg after the return is indeterminate.
+</small>
+
+<h5><a name="7.24.2.6" href="#7.24.2.6">7.24.2.6 The vfwscanf function</a></h5>
+<p><b>Synopsis</b>
+<p><!--para 1 -->
+<pre>
+        #include <a href="#7.15">&lt;stdarg.h&gt;</a>
+        #include <a href="#7.19">&lt;stdio.h&gt;</a>
+        #include <a href="#7.24">&lt;wchar.h&gt;</a>
         int vfwscanf(FILE * restrict stream,
-             const wchar_t * restrict format, va_list arg);
-        int vswprintf(wchar_t * restrict s, size_t n,
-             const wchar_t * restrict format, va_list arg);
+             const wchar_t * restrict format,
+             va_list arg);
+</pre>
+<p><b>Description</b>
+<p><!--para 2 -->
+ The vfwscanf function is equivalent to fwscanf, with the variable argument list
+ replaced by arg, which shall have been initialized by the va_start macro (and
+ possibly subsequent va_arg calls). The vfwscanf function does not invoke the
+ va_end macro.<sup><a href="#note291"><b>291)</b></a></sup>
+<p><b>Returns</b>
+<p><!--para 3 -->
+ The vfwscanf function returns the value of the macro EOF if an input failure occurs
+ before any conversion. Otherwise, the vfwscanf function returns the number of input
+ items assigned, which can be fewer than provided for, or even zero, in the event of an
+ early matching failure.
+
+<h5><a name="7.24.2.7" href="#7.24.2.7">7.24.2.7 The vswprintf function</a></h5>
+<p><b>Synopsis</b>
+<p><!--para 1 -->
+<pre>
+        #include <a href="#7.15">&lt;stdarg.h&gt;</a>
+        #include <a href="#7.24">&lt;wchar.h&gt;</a>
+        int vswprintf(wchar_t * restrict s,
+             size_t n,
+             const wchar_t * restrict format,
+             va_list arg);
+</pre>
+<p><b>Description</b>
+<p><!--para 2 -->
+ The vswprintf function is equivalent to swprintf, with the variable argument list
+ replaced by arg, which shall have been initialized by the va_start macro (and
+ possibly subsequent va_arg calls). The vswprintf function does not invoke the
+ va_end macro.<sup><a href="#note291"><b>291)</b></a></sup>
+<p><b>Returns</b>
+<p><!--para 3 -->
+ The vswprintf function returns the number of wide characters written in the array, not
+ counting the terminating null wide character, or a negative value if an encoding error
+ occurred or if n or more wide characters were requested to be generated.
+<!--page 377 -->
+
+<h5><a name="7.24.2.8" href="#7.24.2.8">7.24.2.8 The vswscanf function</a></h5>
+<p><b>Synopsis</b>
+<p><!--para 1 -->
+<pre>
+        #include <a href="#7.15">&lt;stdarg.h&gt;</a>
+        #include <a href="#7.24">&lt;wchar.h&gt;</a>
         int vswscanf(const wchar_t * restrict s,
-             const wchar_t * restrict format, va_list arg);
+             const wchar_t * restrict format,
+             va_list arg);
+</pre>
+<p><b>Description</b>
+<p><!--para 2 -->
+ The vswscanf function is equivalent to swscanf, with the variable argument list
+ replaced by arg, which shall have been initialized by the va_start macro (and
+ possibly subsequent va_arg calls). The vswscanf function does not invoke the
+ va_end macro.<sup><a href="#note291"><b>291)</b></a></sup>
+<p><b>Returns</b>
+<p><!--para 3 -->
+ The vswscanf function returns the value of the macro EOF if an input failure occurs
+ before any conversion. Otherwise, the vswscanf function returns the number of input
+ items assigned, which can be fewer than provided for, or even zero, in the event of an
+ early matching failure.
+
+<h5><a name="7.24.2.9" href="#7.24.2.9">7.24.2.9 The vwprintf function</a></h5>
+<p><b>Synopsis</b>
+<p><!--para 1 -->
+<pre>
+        #include <a href="#7.15">&lt;stdarg.h&gt;</a>
+        #include <a href="#7.24">&lt;wchar.h&gt;</a>
         int vwprintf(const wchar_t * restrict format,
              va_list arg);
+</pre>
+<p><b>Description</b>
+<p><!--para 2 -->
+ The vwprintf function is equivalent to wprintf, with the variable argument list
+ replaced by arg, which shall have been initialized by the va_start macro (and
+ possibly subsequent va_arg calls). The vwprintf function does not invoke the
+ va_end macro.<sup><a href="#note291"><b>291)</b></a></sup>
+<p><b>Returns</b>
+<p><!--para 3 -->
+ The vwprintf function returns the number of wide characters transmitted, or a negative
+ value if an output or encoding error occurred.
+<!--page 378 -->
+
+<h5><a name="7.24.2.10" href="#7.24.2.10">7.24.2.10 The vwscanf function</a></h5>
+<p><b>Synopsis</b>
+<p><!--para 1 -->
+<pre>
+        #include <a href="#7.15">&lt;stdarg.h&gt;</a>
+        #include <a href="#7.24">&lt;wchar.h&gt;</a>
         int vwscanf(const wchar_t * restrict format,
              va_list arg);
+</pre>
+<p><b>Description</b>
+<p><!--para 2 -->
+ The vwscanf function is equivalent to wscanf, with the variable argument list
+ replaced by arg, which shall have been initialized by the va_start macro (and
+ possibly subsequent va_arg calls). The vwscanf function does not invoke the
+ va_end macro.<sup><a href="#note291"><b>291)</b></a></sup>
+<p><b>Returns</b>
+<p><!--para 3 -->
+ The vwscanf function returns the value of the macro EOF if an input failure occurs
+ before any conversion. Otherwise, the vwscanf function returns the number of input
+ items assigned, which can be fewer than provided for, or even zero, in the event of an
+ early matching failure.
+
+<h5><a name="7.24.2.11" href="#7.24.2.11">7.24.2.11 The wprintf function</a></h5>
+<p><b>Synopsis</b>
+<p><!--para 1 -->
+<pre>
+        #include <a href="#7.24">&lt;wchar.h&gt;</a>
         int wprintf(const wchar_t * restrict format, ...);
+</pre>
+<p><b>Description</b>
+<p><!--para 2 -->
+ The wprintf function is equivalent to fwprintf with the argument stdout
+ interposed before the arguments to wprintf.
+<p><b>Returns</b>
+<p><!--para 3 -->
+ The wprintf function returns the number of wide characters transmitted, or a negative
+ value if an output or encoding error occurred.
+
+<h5><a name="7.24.2.12" href="#7.24.2.12">7.24.2.12 The wscanf function</a></h5>
+<p><b>Synopsis</b>
+<p><!--para 1 -->
+<pre>
+        #include <a href="#7.24">&lt;wchar.h&gt;</a>
         int wscanf(const wchar_t * restrict format, ...);
-        wint_t fgetwc(FILE *stream);
-        wchar_t *fgetws(wchar_t * restrict s, int n,
-             FILE * restrict stream);
+</pre>
+<p><b>Description</b>
+<p><!--para 2 -->
+ The wscanf function is equivalent to fwscanf with the argument stdin interposed
+ before the arguments to wscanf.
+<!--page 379 -->
+<p><b>Returns</b>
+<p><!--para 3 -->
+ The wscanf function returns the value of the macro EOF if an input failure occurs
+ before any conversion. Otherwise, the wscanf function returns the number of input
+ items assigned, which can be fewer than provided for, or even zero, in the event of an
+ early matching failure.
+
+<h4><a name="7.24.3" href="#7.24.3">7.24.3 Wide character input/output functions</a></h4>
+
+<h5><a name="7.24.3.1" href="#7.24.3.1">7.24.3.1 The fgetwc function</a></h5>
+<p><b>Synopsis</b>
+<p><!--para 1 -->
+<pre>
+         #include <a href="#7.19">&lt;stdio.h&gt;</a>
+         #include <a href="#7.24">&lt;wchar.h&gt;</a>
+         wint_t fgetwc(FILE *stream);
+</pre>
+<p><b>Description</b>
+<p><!--para 2 -->
+ If the end-of-file indicator for the input stream pointed to by stream is not set and a
+ next wide character is present, the fgetwc function obtains that wide character as a
+ wchar_t converted to a wint_t and advances the associated file position indicator for
+ the stream (if defined).
+<p><b>Returns</b>
+<p><!--para 3 -->
+ If the end-of-file indicator for the stream is set, or if the stream is at end-of-file, the end-
+ of-file indicator for the stream is set and the fgetwc function returns WEOF. Otherwise,
+ the fgetwc function returns the next wide character from the input stream pointed to by
+ stream. If a read error occurs, the error indicator for the stream is set and the fgetwc
+ function returns WEOF. If an encoding error occurs (including too few bytes), the value of
+ the macro EILSEQ is stored in errno and the fgetwc function returns WEOF.<sup><a href="#note292"><b>292)</b></a></sup>
+
+<p><b>Footnotes</b>
+<p><small><a name="note292" href="#note292">292)</a> An end-of-file and a read error can be distinguished by use of the feof and ferror functions.
+ Also, errno will be set to EILSEQ by input/output functions only if an encoding error occurs.
+</small>
+
+<h5><a name="7.24.3.2" href="#7.24.3.2">7.24.3.2 The fgetws function</a></h5>
+<p><b>Synopsis</b>
+<p><!--para 1 -->
+<pre>
+         #include <a href="#7.19">&lt;stdio.h&gt;</a>
+         #include <a href="#7.24">&lt;wchar.h&gt;</a>
+         wchar_t *fgetws(wchar_t * restrict s,
+              int n, FILE * restrict stream);
+</pre>
+<p><b>Description</b>
+<p><!--para 2 -->
+ The fgetws function reads at most one less than the number of wide characters
+ specified by n from the stream pointed to by stream into the array pointed to by s. No
+<!--page 380 -->
+ additional wide characters are read after a new-line wide character (which is retained) or
+ after end-of-file. A null wide character is written immediately after the last wide
+ character read into the array.
+<p><b>Returns</b>
+<p><!--para 3 -->
+ The fgetws function returns s if successful. If end-of-file is encountered and no
+ characters have been read into the array, the contents of the array remain unchanged and a
+ null pointer is returned. If a read or encoding error occurs during the operation, the array
+ contents are indeterminate and a null pointer is returned.
+
+<h5><a name="7.24.3.3" href="#7.24.3.3">7.24.3.3 The fputwc function</a></h5>
+<p><b>Synopsis</b>
+<p><!--para 1 -->
+<pre>
+        #include <a href="#7.19">&lt;stdio.h&gt;</a>
+        #include <a href="#7.24">&lt;wchar.h&gt;</a>
         wint_t fputwc(wchar_t c, FILE *stream);
+</pre>
+<p><b>Description</b>
+<p><!--para 2 -->
+ The fputwc function writes the wide character specified by c to the output stream
+ pointed to by stream, at the position indicated by the associated file position indicator
+ for the stream (if defined), and advances the indicator appropriately. If the file cannot
+ support positioning requests, or if the stream was opened with append mode, the
+ character is appended to the output stream.
+<p><b>Returns</b>
+<p><!--para 3 -->
+ The fputwc function returns the wide character written. If a write error occurs, the
+ error indicator for the stream is set and fputwc returns WEOF. If an encoding error
+ occurs, the value of the macro EILSEQ is stored in errno and fputwc returns WEOF.
+
+<h5><a name="7.24.3.4" href="#7.24.3.4">7.24.3.4 The fputws function</a></h5>
+<p><b>Synopsis</b>
+<p><!--para 1 -->
+<pre>
+        #include <a href="#7.19">&lt;stdio.h&gt;</a>
+        #include <a href="#7.24">&lt;wchar.h&gt;</a>
         int fputws(const wchar_t * restrict s,
              FILE * restrict stream);
-        int fwide(FILE *stream, int mode);
-        wint_t getwc(FILE *stream);
-        wint_t getwchar(void);
+</pre>
+<p><b>Description</b>
+<p><!--para 2 -->
+ The fputws function writes the wide string pointed to by s to the stream pointed to by
+ stream. The terminating null wide character is not written.
+<p><b>Returns</b>
+<p><!--para 3 -->
+ The fputws function returns EOF if a write or encoding error occurs; otherwise, it
+ returns a nonnegative value.
+<!--page 381 -->
+
+<h5><a name="7.24.3.5" href="#7.24.3.5">7.24.3.5 The fwide function</a></h5>
+<p><b>Synopsis</b>
+<p><!--para 1 -->
+<pre>
+         #include <a href="#7.19">&lt;stdio.h&gt;</a>
+         #include <a href="#7.24">&lt;wchar.h&gt;</a>
+         int fwide(FILE *stream, int mode);
+</pre>
+<p><b>Description</b>
+<p><!--para 2 -->
+ The fwide function determines the orientation of the stream pointed to by stream. If
+ mode is greater than zero, the function first attempts to make the stream wide oriented. If
+ mode is less than zero, the function first attempts to make the stream byte oriented.<sup><a href="#note293"><b>293)</b></a></sup>
+ Otherwise, mode is zero and the function does not alter the orientation of the stream.
+<p><b>Returns</b>
+<p><!--para 3 -->
+ The fwide function returns a value greater than zero if, after the call, the stream has
+ wide orientation, a value less than zero if the stream has byte orientation, or zero if the
+ stream has no orientation.
+
+<p><b>Footnotes</b>
+<p><small><a name="note293" href="#note293">293)</a> If the orientation of the stream has already been determined, fwide does not change it.
+</small>
+
+<h5><a name="7.24.3.6" href="#7.24.3.6">7.24.3.6 The getwc function</a></h5>
+<p><b>Synopsis</b>
+<p><!--para 1 -->
+<pre>
+         #include <a href="#7.19">&lt;stdio.h&gt;</a>
+         #include <a href="#7.24">&lt;wchar.h&gt;</a>
+         wint_t getwc(FILE *stream);
+</pre>
+<p><b>Description</b>
+<p><!--para 2 -->
+ The getwc function is equivalent to fgetwc, except that if it is implemented as a
+ macro, it may evaluate stream more than once, so the argument should never be an
+ expression with side effects.
+<p><b>Returns</b>
+<p><!--para 3 -->
+ The getwc function returns the next wide character from the input stream pointed to by
+ stream, or WEOF.
+
+<h5><a name="7.24.3.7" href="#7.24.3.7">7.24.3.7 The getwchar function</a></h5>
+<p><b>Synopsis</b>
+<p><!--para 1 -->
+<pre>
+         #include <a href="#7.24">&lt;wchar.h&gt;</a>
+         wint_t getwchar(void);
+</pre>
+<!--page 382 -->
+<p><b>Description</b>
+<p><!--para 2 -->
+ The getwchar function is equivalent to getwc with the argument stdin.
+<p><b>Returns</b>
+<p><!--para 3 -->
+ The getwchar function returns the next wide character from the input stream pointed to
+ by stdin, or WEOF.
+
+<h5><a name="7.24.3.8" href="#7.24.3.8">7.24.3.8 The putwc function</a></h5>
+<p><b>Synopsis</b>
+<p><!--para 1 -->
+<pre>
+        #include <a href="#7.19">&lt;stdio.h&gt;</a>
+        #include <a href="#7.24">&lt;wchar.h&gt;</a>
         wint_t putwc(wchar_t c, FILE *stream);
+</pre>
+<p><b>Description</b>
+<p><!--para 2 -->
+ The putwc function is equivalent to fputwc, except that if it is implemented as a
+ macro, it may evaluate stream more than once, so that argument should never be an
+ expression with side effects.
+<p><b>Returns</b>
+<p><!--para 3 -->
+ The putwc function returns the wide character written, or WEOF.
+
+<h5><a name="7.24.3.9" href="#7.24.3.9">7.24.3.9 The putwchar function</a></h5>
+<p><b>Synopsis</b>
+<p><!--para 1 -->
+<pre>
+        #include <a href="#7.24">&lt;wchar.h&gt;</a>
         wint_t putwchar(wchar_t c);
+</pre>
+<p><b>Description</b>
+<p><!--para 2 -->
+ The putwchar function is equivalent to putwc with the second argument stdout.
+<p><b>Returns</b>
+<p><!--para 3 -->
+ The putwchar function returns the character written, or WEOF.
+
+<h5><a name="7.24.3.10" href="#7.24.3.10">7.24.3.10 The ungetwc function</a></h5>
+<p><b>Synopsis</b>
+<p><!--para 1 -->
+<pre>
+        #include <a href="#7.19">&lt;stdio.h&gt;</a>
+        #include <a href="#7.24">&lt;wchar.h&gt;</a>
         wint_t ungetwc(wint_t c, FILE *stream);
-
-
-
-[<a name="p435" href="#p435">page 435</a>] (<a href="#Contents">Contents</a>)
-
-      double wcstod(const wchar_t * restrict nptr,
-           wchar_t ** restrict endptr);
-      float wcstof(const wchar_t * restrict nptr,
-           wchar_t ** restrict endptr);
-      long double wcstold(const wchar_t * restrict nptr,
-           wchar_t ** restrict endptr);
-      long int wcstol(const wchar_t * restrict nptr,
-           wchar_t ** restrict endptr, int base);
-      long long int wcstoll(const wchar_t * restrict nptr,
-           wchar_t ** restrict endptr, int base);
-      unsigned long int wcstoul(const wchar_t * restrict nptr,
-           wchar_t ** restrict endptr, int base);
-      unsigned long long int wcstoull(
-           const wchar_t * restrict nptr,
-           wchar_t ** restrict endptr, int base);
-      wchar_t *wcscpy(wchar_t * restrict s1,
-           const wchar_t * restrict s2);
-      wchar_t *wcsncpy(wchar_t * restrict s1,
-           const wchar_t * restrict s2, size_t n);
-      wchar_t *wmemcpy(wchar_t * restrict s1,
-           const wchar_t * restrict s2, size_t n);
-      wchar_t *wmemmove(wchar_t *s1, const wchar_t *s2,
-           size_t n);
-      wchar_t *wcscat(wchar_t * restrict s1,
-           const wchar_t * restrict s2);
-      wchar_t *wcsncat(wchar_t * restrict s1,
-           const wchar_t * restrict s2, size_t n);
-      int wcscmp(const wchar_t *s1, const wchar_t *s2);
-      int wcscoll(const wchar_t *s1, const wchar_t *s2);
-      int wcsncmp(const wchar_t *s1, const wchar_t *s2,
-           size_t n);
-      size_t wcsxfrm(wchar_t * restrict s1,
-           const wchar_t * restrict s2, size_t n);
-      int wmemcmp(const wchar_t *s1, const wchar_t *s2,
-           size_t n);
-      wchar_t *wcschr(const wchar_t *s, wchar_t c);
-      size_t wcscspn(const wchar_t *s1, const wchar_t *s2);
-      wchar_t *wcspbrk(const wchar_t *s1, const wchar_t *s2); *
-      wchar_t *wcsrchr(const wchar_t *s, wchar_t c);
-      size_t wcsspn(const wchar_t *s1, const wchar_t *s2);
-      wchar_t *wcsstr(const wchar_t *s1, const wchar_t *s2);
-
-[<a name="p436" href="#p436">page 436</a>] (<a href="#Contents">Contents</a>)
-
+</pre>
+<p><b>Description</b>
+<p><!--para 2 -->
+ The ungetwc function pushes the wide character specified by c back onto the input
+ stream pointed to by stream. Pushed-back wide characters will be returned by
+ subsequent reads on that stream in the reverse order of their pushing. A successful
+<!--page 383 -->
+ intervening call (with the stream pointed to by stream) to a file positioning function
+ (fseek, fsetpos, or rewind) discards any pushed-back wide characters for the
+ stream. The external storage corresponding to the stream is unchanged.
+<p><!--para 3 -->
+ One wide character of pushback is guaranteed, even if the call to the ungetwc function
+ follows just after a call to a formatted wide character input function fwscanf,
+ vfwscanf, vwscanf, or wscanf. If the ungetwc function is called too many times
+ on the same stream without an intervening read or file positioning operation on that
+ stream, the operation may fail.
+<p><!--para 4 -->
+ If the value of c equals that of the macro WEOF, the operation fails and the input stream is
+ unchanged.
+<p><!--para 5 -->
+ A successful call to the ungetwc function clears the end-of-file indicator for the stream.
+ The value of the file position indicator for the stream after reading or discarding all
+ pushed-back wide characters is the same as it was before the wide characters were pushed
+ back. For a text or binary stream, the value of its file position indicator after a successful
+ call to the ungetwc function is unspecified until all pushed-back wide characters are
+ read or discarded.
+<p><b>Returns</b>
+<p><!--para 6 -->
+ The ungetwc function returns the wide character pushed back, or WEOF if the operation
+ fails.
+
+<h4><a name="7.24.4" href="#7.24.4">7.24.4 General wide string utilities</a></h4>
+<p><!--para 1 -->
+ The header <a href="#7.24">&lt;wchar.h&gt;</a> declares a number of functions useful for wide string
+ manipulation. Various methods are used for determining the lengths of the arrays, but in
+ all cases a wchar_t * argument points to the initial (lowest addressed) element of the
+ array. If an array is accessed beyond the end of an object, the behavior is undefined.
+<p><!--para 2 -->
+ Where an argument declared as size_t n determines the length of the array for a
+ function, n can have the value zero on a call to that function. Unless explicitly stated
+ otherwise in the description of a particular function in this subclause, pointer arguments
+ on such a call shall still have valid values, as described in <a href="#7.1.4">7.1.4</a>. On such a call, a
+ function that locates a wide character finds no occurrence, a function that compares two
+ wide character sequences returns zero, and a function that copies wide characters copies
+ zero wide characters.
+<!--page 384 -->
+
+<h5><a name="7.24.4.1" href="#7.24.4.1">7.24.4.1 Wide string numeric conversion functions</a></h5>
+
+<h5><a name="7.24.4.1.1" href="#7.24.4.1.1">7.24.4.1.1 The wcstod, wcstof, and wcstold functions</a></h5>
+<p><b>Synopsis</b>
+<p><!--para 1 -->
+<pre>
+        #include <a href="#7.24">&lt;wchar.h&gt;</a>
+        double wcstod(const wchar_t * restrict nptr,
+             wchar_t ** restrict endptr);
+        float wcstof(const wchar_t * restrict nptr,
+             wchar_t ** restrict endptr);
+        long double wcstold(const wchar_t * restrict nptr,
+             wchar_t ** restrict endptr);
+</pre>
+<p><b>Description</b>
+<p><!--para 2 -->
+ The wcstod, wcstof, and wcstold functions convert the initial portion of the wide
+ string pointed to by nptr to double, float, and long double representation,
+ respectively. First, they decompose the input string into three parts: an initial, possibly
+ empty, sequence of white-space wide characters (as specified by the iswspace
+ function), a subject sequence resembling a floating-point constant or representing an
+ infinity or NaN; and a final wide string of one or more unrecognized wide characters,
+ including the terminating null wide character of the input wide string. Then, they attempt
+ to convert the subject sequence to a floating-point number, and return the result.
+<p><!--para 3 -->
+ The expected form of the subject sequence is an optional plus or minus sign, then one of
+ the following:
+<ul>
+<li>  a nonempty sequence of decimal digits optionally containing a decimal-point wide
+ character, then an optional exponent part as defined for the corresponding single-byte
+ characters in <a href="#6.4.4.2">6.4.4.2</a>;
+<li>  a 0x or 0X, then a nonempty sequence of hexadecimal digits optionally containing a
+ decimal-point wide character, then an optional binary exponent part as defined in
+ <a href="#6.4.4.2">6.4.4.2</a>;
+<li>  INF or INFINITY, or any other wide string equivalent except for case
+<li>  NAN or NAN(n-wchar-sequence<sub>opt</sub>), or any other wide string equivalent except for
+ case in the NAN part, where:
+<pre>
+          n-wchar-sequence:
+                digit
+                nondigit
+                n-wchar-sequence digit
+                n-wchar-sequence nondigit
+</pre>
+</ul>
+ The subject sequence is defined as the longest initial subsequence of the input wide
+ string, starting with the first non-white-space wide character, that is of the expected form.
+<!--page 385 -->
+ The subject sequence contains no wide characters if the input wide string is not of the
+ expected form.
+<p><!--para 4 -->
+ If the subject sequence has the expected form for a floating-point number, the sequence of
+ wide characters starting with the first digit or the decimal-point wide character
+ (whichever occurs first) is interpreted as a floating constant according to the rules of
+ <a href="#6.4.4.2">6.4.4.2</a>, except that the decimal-point wide character is used in place of a period, and that
+ if neither an exponent part nor a decimal-point wide character appears in a decimal
+ floating point number, or if a binary exponent part does not appear in a hexadecimal
+ floating point number, an exponent part of the appropriate type with value zero is
+ assumed to follow the last digit in the string. If the subject sequence begins with a minus
+ sign, the sequence is interpreted as negated.<sup><a href="#note294"><b>294)</b></a></sup> A wide character sequence INF or
+ INFINITY is interpreted as an infinity, if representable in the return type, else like a
+ floating constant that is too large for the range of the return type. A wide character
+ sequence NAN or NAN(n-wchar-sequence<sub>opt</sub>) is interpreted as a quiet NaN, if supported
+ in the return type, else like a subject sequence part that does not have the expected form;
+ the meaning of the n-wchar sequences is implementation-defined.<sup><a href="#note295"><b>295)</b></a></sup> A pointer to the
+ final wide string is stored in the object pointed to by endptr, provided that endptr is
+ not a null pointer.
+<p><!--para 5 -->
+ If the subject sequence has the hexadecimal form and FLT_RADIX is a power of 2, the
+ value resulting from the conversion is correctly rounded.
+<p><!--para 6 -->
+ In other than the "C" locale, additional locale-specific subject sequence forms may be
+ accepted.
+<p><!--para 7 -->
+ If the subject sequence is empty or does not have the expected form, no conversion is
+ performed; the value of nptr is stored in the object pointed to by endptr, provided
+ that endptr is not a null pointer.
+<p><b>Recommended practice</b>
+<p><!--para 8 -->
+ If the subject sequence has the hexadecimal form, FLT_RADIX is not a power of 2, and
+ the result is not exactly representable, the result should be one of the two numbers in the
+ appropriate internal format that are adjacent to the hexadecimal floating source value,
+ with the extra stipulation that the error should have a correct sign for the current rounding
+ direction.
+<!--page 386 -->
+<p><!--para 9 -->
+ If the subject sequence has the decimal form and at most DECIMAL_DIG (defined in
+ <a href="#7.7">&lt;float.h&gt;</a>) significant digits, the result should be correctly rounded. If the subject
+ sequence D has the decimal form and more than DECIMAL_DIG significant digits,
+ consider the two bounding, adjacent decimal strings L and U, both having
+ DECIMAL_DIG significant digits, such that the values of L, D, and U satisfy L &lt;= D &lt;= U.
+ The result should be one of the (equal or adjacent) values that would be obtained by
+ correctly rounding L and U according to the current rounding direction, with the extra
+ stipulation that the error with respect to D should have a correct sign for the current
+ rounding direction.<sup><a href="#note296"><b>296)</b></a></sup>
+<p><b>Returns</b>
+<p><!--para 10 -->
+ The functions return the converted value, if any. If no conversion could be performed,
+ zero is returned. If the correct value is outside the range of representable values, plus or
+ minus HUGE_VAL, HUGE_VALF, or HUGE_VALL is returned (according to the return
+ type and sign of the value), and the value of the macro ERANGE is stored in errno. If
+ the result underflows (<a href="#7.12.1">7.12.1</a>), the functions return a value whose magnitude is no greater
+ than the smallest normalized positive number in the return type; whether errno acquires
+ the value ERANGE is implementation-defined.
+<!--page 387 -->
+
+<p><b>Footnotes</b>
+<p><small><a name="note294" href="#note294">294)</a> It is unspecified whether a minus-signed sequence is converted to a negative number directly or by
+ negating the value resulting from converting the corresponding unsigned sequence (see <a href="#F.5">F.5</a>); the two
+ methods may yield different results if rounding is toward positive or negative infinity. In either case,
+ the functions honor the sign of zero if floating-point arithmetic supports signed zeros.
+</small>
+<p><small><a name="note295" href="#note295">295)</a> An implementation may use the n-wchar sequence to determine extra information to be represented in
+ the NaN's significand.
+</small>
+<p><small><a name="note296" href="#note296">296)</a> DECIMAL_DIG, defined in <a href="#7.7">&lt;float.h&gt;</a>, should be sufficiently large that L and U will usually round
+ to the same internal floating value, but if not will round to adjacent values.
+</small>
+
+<h5><a name="7.24.4.1.2" href="#7.24.4.1.2">7.24.4.1.2 The wcstol, wcstoll, wcstoul, and wcstoull functions</a></h5>
+<p><b>Synopsis</b>
+<p><!--para 1 -->
+<pre>
+        #include <a href="#7.24">&lt;wchar.h&gt;</a>
+        long int wcstol(
+             const wchar_t * restrict nptr,
+             wchar_t ** restrict endptr,
+             int base);
+        long long int wcstoll(
+             const wchar_t * restrict nptr,
+             wchar_t ** restrict endptr,
+             int base);
+        unsigned long int wcstoul(
+             const wchar_t * restrict nptr,
+             wchar_t ** restrict endptr,
+             int base);
+        unsigned long long int wcstoull(
+             const wchar_t * restrict nptr,
+             wchar_t ** restrict endptr,
+             int base);
+</pre>
+<p><b>Description</b>
+<p><!--para 2 -->
+ The wcstol, wcstoll, wcstoul, and wcstoull functions convert the initial
+ portion of the wide string pointed to by nptr to long int, long long int,
+ unsigned long int, and unsigned long long int representation,
+ respectively. First, they decompose the input string into three parts: an initial, possibly
+ empty, sequence of white-space wide characters (as specified by the iswspace
+ function), a subject sequence resembling an integer represented in some radix determined
+ by the value of base, and a final wide string of one or more unrecognized wide
+ characters, including the terminating null wide character of the input wide string. Then,
+ they attempt to convert the subject sequence to an integer, and return the result.
+<p><!--para 3 -->
+ If the value of base is zero, the expected form of the subject sequence is that of an
+ integer constant as described for the corresponding single-byte characters in <a href="#6.4.4.1">6.4.4.1</a>,
+ optionally preceded by a plus or minus sign, but not including an integer suffix. If the
+ value of base is between 2 and 36 (inclusive), the expected form of the subject sequence
+ is a sequence of letters and digits representing an integer with the radix specified by
+ base, optionally preceded by a plus or minus sign, but not including an integer suffix.
+ The letters from a (or A) through z (or Z) are ascribed the values 10 through 35; only
+ letters and digits whose ascribed values are less than that of base are permitted. If the
+ value of base is 16, the wide characters 0x or 0X may optionally precede the sequence
+ of letters and digits, following the sign if present.
+<!--page 388 -->
+<p><!--para 4 -->
+ The subject sequence is defined as the longest initial subsequence of the input wide
+ string, starting with the first non-white-space wide character, that is of the expected form.
+ The subject sequence contains no wide characters if the input wide string is empty or
+ consists entirely of white space, or if the first non-white-space wide character is other
+ than a sign or a permissible letter or digit.
+<p><!--para 5 -->
+ If the subject sequence has the expected form and the value of base is zero, the sequence
+ of wide characters starting with the first digit is interpreted as an integer constant
+ according to the rules of <a href="#6.4.4.1">6.4.4.1</a>. If the subject sequence has the expected form and the
+ value of base is between 2 and 36, it is used as the base for conversion, ascribing to each
+ letter its value as given above. If the subject sequence begins with a minus sign, the value
+ resulting from the conversion is negated (in the return type). A pointer to the final wide
+ string is stored in the object pointed to by endptr, provided that endptr is not a null
+ pointer.
+<p><!--para 6 -->
+ In other than the "C" locale, additional locale-specific subject sequence forms may be
+ accepted.
+<p><!--para 7 -->
+ If the subject sequence is empty or does not have the expected form, no conversion is
+ performed; the value of nptr is stored in the object pointed to by endptr, provided
+ that endptr is not a null pointer.
+<p><b>Returns</b>
+<p><!--para 8 -->
+ The wcstol, wcstoll, wcstoul, and wcstoull functions return the converted
+ value, if any. If no conversion could be performed, zero is returned. If the correct value
+ is outside the range of representable values, LONG_MIN, LONG_MAX, LLONG_MIN,
+ LLONG_MAX, ULONG_MAX, or ULLONG_MAX is returned (according to the return type
+ sign of the value, if any), and the value of the macro ERANGE is stored in errno.
+
+<h5><a name="7.24.4.2" href="#7.24.4.2">7.24.4.2 Wide string copying functions</a></h5>
+
+<h5><a name="7.24.4.2.1" href="#7.24.4.2.1">7.24.4.2.1 The wcscpy function</a></h5>
+<p><b>Synopsis</b>
+<p><!--para 1 -->
+<pre>
+        #include <a href="#7.24">&lt;wchar.h&gt;</a>
+        wchar_t *wcscpy(wchar_t * restrict s1,
+             const wchar_t * restrict s2);
+</pre>
+<p><b>Description</b>
+<p><!--para 2 -->
+ The wcscpy function copies the wide string pointed to by s2 (including the terminating
+ null wide character) into the array pointed to by s1.
+<p><b>Returns</b>
+<p><!--para 3 -->
+ The wcscpy function returns the value of s1.
+<!--page 389 -->
+
+<h5><a name="7.24.4.2.2" href="#7.24.4.2.2">7.24.4.2.2 The wcsncpy function</a></h5>
+<p><b>Synopsis</b>
+<p><!--para 1 -->
+<pre>
+          #include <a href="#7.24">&lt;wchar.h&gt;</a>
+          wchar_t *wcsncpy(wchar_t * restrict s1,
+               const wchar_t * restrict s2,
+               size_t n);
+</pre>
+<p><b>Description</b>
+<p><!--para 2 -->
+ The wcsncpy function copies not more than n wide characters (those that follow a null
+ wide character are not copied) from the array pointed to by s2 to the array pointed to by
+ s1.<sup><a href="#note297"><b>297)</b></a></sup>
+<p><!--para 3 -->
+ If the array pointed to by s2 is a wide string that is shorter than n wide characters, null
+ wide characters are appended to the copy in the array pointed to by s1, until n wide
+ characters in all have been written.
+<p><b>Returns</b>
+<p><!--para 4 -->
+ The wcsncpy function returns the value of s1.
+
+<p><b>Footnotes</b>
+<p><small><a name="note297" href="#note297">297)</a> Thus, if there is no null wide character in the first n wide characters of the array pointed to by s2, the
+ result will not be null-terminated.
+</small>
+
+<h5><a name="7.24.4.2.3" href="#7.24.4.2.3">7.24.4.2.3 The wmemcpy function</a></h5>
+<p><b>Synopsis</b>
+<p><!--para 1 -->
+<pre>
+          #include <a href="#7.24">&lt;wchar.h&gt;</a>
+          wchar_t *wmemcpy(wchar_t * restrict s1,
+               const wchar_t * restrict s2,
+               size_t n);
+</pre>
+<p><b>Description</b>
+<p><!--para 2 -->
+ The wmemcpy function copies n wide characters from the object pointed to by s2 to the
+ object pointed to by s1.
+<p><b>Returns</b>
+<p><!--para 3 -->
+ The wmemcpy function returns the value of s1.
+<!--page 390 -->
+
+<h5><a name="7.24.4.2.4" href="#7.24.4.2.4">7.24.4.2.4 The wmemmove function</a></h5>
+<p><b>Synopsis</b>
+<p><!--para 1 -->
+<pre>
+        #include <a href="#7.24">&lt;wchar.h&gt;</a>
+        wchar_t *wmemmove(wchar_t *s1, const wchar_t *s2,
+             size_t n);
+</pre>
+<p><b>Description</b>
+<p><!--para 2 -->
+ The wmemmove function copies n wide characters from the object pointed to by s2 to
+ the object pointed to by s1. Copying takes place as if the n wide characters from the
+ object pointed to by s2 are first copied into a temporary array of n wide characters that
+ does not overlap the objects pointed to by s1 or s2, and then the n wide characters from
+ the temporary array are copied into the object pointed to by s1.
+<p><b>Returns</b>
+<p><!--para 3 -->
+ The wmemmove function returns the value of s1.
+
+<h5><a name="7.24.4.3" href="#7.24.4.3">7.24.4.3 Wide string concatenation functions</a></h5>
+
+<h5><a name="7.24.4.3.1" href="#7.24.4.3.1">7.24.4.3.1 The wcscat function</a></h5>
+<p><b>Synopsis</b>
+<p><!--para 1 -->
+<pre>
+        #include <a href="#7.24">&lt;wchar.h&gt;</a>
+        wchar_t *wcscat(wchar_t * restrict s1,
+             const wchar_t * restrict s2);
+</pre>
+<p><b>Description</b>
+<p><!--para 2 -->
+ The wcscat function appends a copy of the wide string pointed to by s2 (including the
+ terminating null wide character) to the end of the wide string pointed to by s1. The initial
+ wide character of s2 overwrites the null wide character at the end of s1.
+<p><b>Returns</b>
+<p><!--para 3 -->
+ The wcscat function returns the value of s1.
+
+<h5><a name="7.24.4.3.2" href="#7.24.4.3.2">7.24.4.3.2 The wcsncat function</a></h5>
+<p><b>Synopsis</b>
+<p><!--para 1 -->
+<pre>
+        #include <a href="#7.24">&lt;wchar.h&gt;</a>
+        wchar_t *wcsncat(wchar_t * restrict s1,
+             const wchar_t * restrict s2,
+             size_t n);
+</pre>
+<p><b>Description</b>
+<p><!--para 2 -->
+ The wcsncat function appends not more than n wide characters (a null wide character
+ and those that follow it are not appended) from the array pointed to by s2 to the end of
+<!--page 391 -->
+ the wide string pointed to by s1. The initial wide character of s2 overwrites the null
+ wide character at the end of s1. A terminating null wide character is always appended to
+ the result.<sup><a href="#note298"><b>298)</b></a></sup>
+<p><b>Returns</b>
+<p><!--para 3 -->
+ The wcsncat function returns the value of s1.
+
+<p><b>Footnotes</b>
+<p><small><a name="note298" href="#note298">298)</a> Thus, the maximum number of wide characters that can end up in the array pointed to by s1 is
+ wcslen(s1)+n+1.
+</small>
+
+<h5><a name="7.24.4.4" href="#7.24.4.4">7.24.4.4 Wide string comparison functions</a></h5>
+<p><!--para 1 -->
+ Unless explicitly stated otherwise, the functions described in this subclause order two
+ wide characters the same way as two integers of the underlying integer type designated
+ by wchar_t.
+
+<h5><a name="7.24.4.4.1" href="#7.24.4.4.1">7.24.4.4.1 The wcscmp function</a></h5>
+<p><b>Synopsis</b>
+<p><!--para 1 -->
+<pre>
+         #include <a href="#7.24">&lt;wchar.h&gt;</a>
+         int wcscmp(const wchar_t *s1, const wchar_t *s2);
+</pre>
+<p><b>Description</b>
+<p><!--para 2 -->
+ The wcscmp function compares the wide string pointed to by s1 to the wide string
+ pointed to by s2.
+<p><b>Returns</b>
+<p><!--para 3 -->
+ The wcscmp function returns an integer greater than, equal to, or less than zero,
+ accordingly as the wide string pointed to by s1 is greater than, equal to, or less than the
+ wide string pointed to by s2.
+
+<h5><a name="7.24.4.4.2" href="#7.24.4.4.2">7.24.4.4.2 The wcscoll function</a></h5>
+<p><b>Synopsis</b>
+<p><!--para 1 -->
+<pre>
+         #include <a href="#7.24">&lt;wchar.h&gt;</a>
+         int wcscoll(const wchar_t *s1, const wchar_t *s2);
+</pre>
+<p><b>Description</b>
+<p><!--para 2 -->
+ The wcscoll function compares the wide string pointed to by s1 to the wide string
+ pointed to by s2, both interpreted as appropriate to the LC_COLLATE category of the
+ current locale.
+<p><b>Returns</b>
+<p><!--para 3 -->
+ The wcscoll function returns an integer greater than, equal to, or less than zero,
+ accordingly as the wide string pointed to by s1 is greater than, equal to, or less than the
+<!--page 392 -->
+ wide string pointed to by s2 when both are interpreted as appropriate to the current
+ locale.
+
+<h5><a name="7.24.4.4.3" href="#7.24.4.4.3">7.24.4.4.3 The wcsncmp function</a></h5>
+<p><b>Synopsis</b>
+<p><!--para 1 -->
+<pre>
+        #include <a href="#7.24">&lt;wchar.h&gt;</a>
+        int wcsncmp(const wchar_t *s1, const wchar_t *s2,
+             size_t n);
+</pre>
+<p><b>Description</b>
+<p><!--para 2 -->
+ The wcsncmp function compares not more than n wide characters (those that follow a
+ null wide character are not compared) from the array pointed to by s1 to the array
+ pointed to by s2.
+<p><b>Returns</b>
+<p><!--para 3 -->
+ The wcsncmp function returns an integer greater than, equal to, or less than zero,
+ accordingly as the possibly null-terminated array pointed to by s1 is greater than, equal
+ to, or less than the possibly null-terminated array pointed to by s2.
+
+<h5><a name="7.24.4.4.4" href="#7.24.4.4.4">7.24.4.4.4 The wcsxfrm function</a></h5>
+<p><b>Synopsis</b>
+<p><!--para 1 -->
+<pre>
+        #include <a href="#7.24">&lt;wchar.h&gt;</a>
+        size_t wcsxfrm(wchar_t * restrict s1,
+             const wchar_t * restrict s2,
+             size_t n);
+</pre>
+<p><b>Description</b>
+<p><!--para 2 -->
+ The wcsxfrm function transforms the wide string pointed to by s2 and places the
+ resulting wide string into the array pointed to by s1. The transformation is such that if
+ the wcscmp function is applied to two transformed wide strings, it returns a value greater
+ than, equal to, or less than zero, corresponding to the result of the wcscoll function
+ applied to the same two original wide strings. No more than n wide characters are placed
+ into the resulting array pointed to by s1, including the terminating null wide character. If
+ n is zero, s1 is permitted to be a null pointer.
+<p><b>Returns</b>
+<p><!--para 3 -->
+ The wcsxfrm function returns the length of the transformed wide string (not including
+ the terminating null wide character). If the value returned is n or greater, the contents of
+ the array pointed to by s1 are indeterminate.
+<p><!--para 4 -->
+ EXAMPLE The value of the following expression is the length of the array needed to hold the
+ transformation of the wide string pointed to by s:
+<!--page 393 -->
+<pre>
+        1 + wcsxfrm(NULL, s, 0)
+</pre>
+
+<h5><a name="7.24.4.4.5" href="#7.24.4.4.5">7.24.4.4.5 The wmemcmp function</a></h5>
+<p><b>Synopsis</b>
+<p><!--para 1 -->
+<pre>
+        #include <a href="#7.24">&lt;wchar.h&gt;</a>
+        int wmemcmp(const wchar_t *s1, const wchar_t *s2,
+             size_t n);
+</pre>
+<p><b>Description</b>
+<p><!--para 2 -->
+ The wmemcmp function compares the first n wide characters of the object pointed to by
+ s1 to the first n wide characters of the object pointed to by s2.
+<p><b>Returns</b>
+<p><!--para 3 -->
+ The wmemcmp function returns an integer greater than, equal to, or less than zero,
+ accordingly as the object pointed to by s1 is greater than, equal to, or less than the object
+ pointed to by s2.
+
+<h5><a name="7.24.4.5" href="#7.24.4.5">7.24.4.5 Wide string search functions</a></h5>
+
+<h5><a name="7.24.4.5.1" href="#7.24.4.5.1">7.24.4.5.1 The wcschr function</a></h5>
+<p><b>Synopsis</b>
+<p><!--para 1 -->
+<pre>
+        #include <a href="#7.24">&lt;wchar.h&gt;</a>
+        wchar_t *wcschr(const wchar_t *s, wchar_t c);
+</pre>
+<p><b>Description</b>
+<p><!--para 2 -->
+ The wcschr function locates the first occurrence of c in the wide string pointed to by s.
+ The terminating null wide character is considered to be part of the wide string.
+<p><b>Returns</b>
+<p><!--para 3 -->
+ The wcschr function returns a pointer to the located wide character, or a null pointer if
+ the wide character does not occur in the wide string.
+
+<h5><a name="7.24.4.5.2" href="#7.24.4.5.2">7.24.4.5.2 The wcscspn function</a></h5>
+<p><b>Synopsis</b>
+<p><!--para 1 -->
+<pre>
+        #include <a href="#7.24">&lt;wchar.h&gt;</a>
+        size_t wcscspn(const wchar_t *s1, const wchar_t *s2);
+</pre>
+<p><b>Description</b>
+<p><!--para 2 -->
+ The wcscspn function computes the length of the maximum initial segment of the wide
+ string pointed to by s1 which consists entirely of wide characters not from the wide
+ string pointed to by s2.
+<!--page 394 -->
+<p><b>Returns</b>
+<p><!--para 3 -->
+ The wcscspn function returns the length of the segment.
+
+<h5><a name="7.24.4.5.3" href="#7.24.4.5.3">7.24.4.5.3 The wcspbrk function</a></h5>
+<p><b>Synopsis</b>
+<p><!--para 1 -->
+<pre>
+        #include <a href="#7.24">&lt;wchar.h&gt;</a>
+        wchar_t *wcspbrk(const wchar_t *s1, const wchar_t *s2);
+</pre>
+<p><b>Description</b>
+<p><!--para 2 -->
+ The wcspbrk function locates the first occurrence in the wide string pointed to by s1 of
+ any wide character from the wide string pointed to by s2.
+<p><b>Returns</b>
+<p><!--para 3 -->
+ The wcspbrk function returns a pointer to the wide character in s1, or a null pointer if
+ no wide character from s2 occurs in s1.
+
+<h5><a name="7.24.4.5.4" href="#7.24.4.5.4">7.24.4.5.4 The wcsrchr function</a></h5>
+<p><b>Synopsis</b>
+<p><!--para 1 -->
+<pre>
+        #include <a href="#7.24">&lt;wchar.h&gt;</a>
+        wchar_t *wcsrchr(const wchar_t *s, wchar_t c);
+</pre>
+<p><b>Description</b>
+<p><!--para 2 -->
+ The wcsrchr function locates the last occurrence of c in the wide string pointed to by
+ s. The terminating null wide character is considered to be part of the wide string.
+<p><b>Returns</b>
+<p><!--para 3 -->
+ The wcsrchr function returns a pointer to the wide character, or a null pointer if c does
+ not occur in the wide string.
+
+<h5><a name="7.24.4.5.5" href="#7.24.4.5.5">7.24.4.5.5 The wcsspn function</a></h5>
+<p><b>Synopsis</b>
+<p><!--para 1 -->
+<pre>
+        #include <a href="#7.24">&lt;wchar.h&gt;</a>
+        size_t wcsspn(const wchar_t *s1, const wchar_t *s2);
+</pre>
+<p><b>Description</b>
+<p><!--para 2 -->
+ The wcsspn function computes the length of the maximum initial segment of the wide
+ string pointed to by s1 which consists entirely of wide characters from the wide string
+ pointed to by s2.
+<p><b>Returns</b>
+<p><!--para 3 -->
+ The wcsspn function returns the length of the segment.
+<!--page 395 -->
+
+<h5><a name="7.24.4.5.6" href="#7.24.4.5.6">7.24.4.5.6 The wcsstr function</a></h5>
+<p><b>Synopsis</b>
+<p><!--para 1 -->
+<pre>
+        #include <a href="#7.24">&lt;wchar.h&gt;</a>
+        wchar_t *wcsstr(const wchar_t *s1, const wchar_t *s2);
+</pre>
+<p><b>Description</b>
+<p><!--para 2 -->
+ The wcsstr function locates the first occurrence in the wide string pointed to by s1 of
+ the sequence of wide characters (excluding the terminating null wide character) in the
+ wide string pointed to by s2.
+<p><b>Returns</b>
+<p><!--para 3 -->
+ The wcsstr function returns a pointer to the located wide string, or a null pointer if the
+ wide string is not found. If s2 points to a wide string with zero length, the function
+ returns s1.
+
+<h5><a name="7.24.4.5.7" href="#7.24.4.5.7">7.24.4.5.7 The wcstok function</a></h5>
+<p><b>Synopsis</b>
+<p><!--para 1 -->
+<pre>
+        #include <a href="#7.24">&lt;wchar.h&gt;</a>
         wchar_t *wcstok(wchar_t * restrict s1,
              const wchar_t * restrict s2,
              wchar_t ** restrict ptr);
-        wchar_t *wmemchr(const wchar_t *s, wchar_t c, size_t n);
+</pre>
+<p><b>Description</b>
+<p><!--para 2 -->
+ A sequence of calls to the wcstok function breaks the wide string pointed to by s1 into
+ a sequence of tokens, each of which is delimited by a wide character from the wide string
+ pointed to by s2. The third argument points to a caller-provided wchar_t pointer into
+ which the wcstok function stores information necessary for it to continue scanning the
+ same wide string.
+<p><!--para 3 -->
+ The first call in a sequence has a non-null first argument and stores an initial value in the
+ object pointed to by ptr. Subsequent calls in the sequence have a null first argument and
+ the object pointed to by ptr is required to have the value stored by the previous call in
+ the sequence, which is then updated. The separator wide string pointed to by s2 may be
+ different from call to call.
+<p><!--para 4 -->
+ The first call in the sequence searches the wide string pointed to by s1 for the first wide
+ character that is not contained in the current separator wide string pointed to by s2. If no
+ such wide character is found, then there are no tokens in the wide string pointed to by s1
+ and the wcstok function returns a null pointer. If such a wide character is found, it is
+ the start of the first token.
+<p><!--para 5 -->
+ The wcstok function then searches from there for a wide character that is contained in
+ the current separator wide string. If no such wide character is found, the current token
+<!--page 396 -->
+ extends to the end of the wide string pointed to by s1, and subsequent searches in the
+ same wide string for a token return a null pointer. If such a wide character is found, it is
+ overwritten by a null wide character, which terminates the current token.
+<p><!--para 6 -->
+ In all cases, the wcstok function stores sufficient information in the pointer pointed to
+ by ptr so that subsequent calls, with a null pointer for s1 and the unmodified pointer
+ value for ptr, shall start searching just past the element overwritten by a null wide
+ character (if any).
+<p><b>Returns</b>
+<p><!--para 7 -->
+ The wcstok function returns a pointer to the first wide character of a token, or a null
+ pointer if there is no token.
+<p><!--para 8 -->
+ EXAMPLE
+<pre>
+        #include <a href="#7.24">&lt;wchar.h&gt;</a>
+        static wchar_t str1[] = L"?a???b,,,#c";
+        static wchar_t str2[] = L"\t \t";
+        wchar_t *t, *ptr1, *ptr2;
+        t   =   wcstok(str1,   L"?", &amp;ptr1);          //   t   points to the token L"a"
+        t   =   wcstok(NULL,   L",", &amp;ptr1);          //   t   points to the token L"??b"
+        t   =   wcstok(str2,   L" \t", &amp;ptr2);        //   t   is a null pointer
+        t   =   wcstok(NULL,   L"#,", &amp;ptr1);         //   t   points to the token L"c"
+        t   =   wcstok(NULL,   L"?", &amp;ptr1);          //   t   is a null pointer
+</pre>
+
+<h5><a name="7.24.4.5.8" href="#7.24.4.5.8">7.24.4.5.8 The wmemchr function</a></h5>
+<p><b>Synopsis</b>
+<p><!--para 1 -->
+<pre>
+        #include <a href="#7.24">&lt;wchar.h&gt;</a>
+        wchar_t *wmemchr(const wchar_t *s, wchar_t c,
+             size_t n);
+</pre>
+<p><b>Description</b>
+<p><!--para 2 -->
+ The wmemchr function locates the first occurrence of c in the initial n wide characters of
+ the object pointed to by s.
+<p><b>Returns</b>
+<p><!--para 3 -->
+ The wmemchr function returns a pointer to the located wide character, or a null pointer if
+ the wide character does not occur in the object.
+<!--page 397 -->
+
+<h5><a name="7.24.4.6" href="#7.24.4.6">7.24.4.6 Miscellaneous functions</a></h5>
+
+<h5><a name="7.24.4.6.1" href="#7.24.4.6.1">7.24.4.6.1 The wcslen function</a></h5>
+<p><b>Synopsis</b>
+<p><!--para 1 -->
+<pre>
+        #include <a href="#7.24">&lt;wchar.h&gt;</a>
         size_t wcslen(const wchar_t *s);
+</pre>
+<p><b>Description</b>
+<p><!--para 2 -->
+ The wcslen function computes the length of the wide string pointed to by s.
+<p><b>Returns</b>
+<p><!--para 3 -->
+ The wcslen function returns the number of wide characters that precede the terminating
+ null wide character.
+
+<h5><a name="7.24.4.6.2" href="#7.24.4.6.2">7.24.4.6.2 The wmemset function</a></h5>
+<p><b>Synopsis</b>
+<p><!--para 1 -->
+<pre>
+        #include <a href="#7.24">&lt;wchar.h&gt;</a>
         wchar_t *wmemset(wchar_t *s, wchar_t c, size_t n);
-        size_t wcsftime(wchar_t * restrict s, size_t maxsize,
+</pre>
+<p><b>Description</b>
+<p><!--para 2 -->
+ The wmemset function copies the value of c into each of the first n wide characters of
+ the object pointed to by s.
+<p><b>Returns</b>
+<p><!--para 3 -->
+ The wmemset function returns the value of s.
+
+<h4><a name="7.24.5" href="#7.24.5">7.24.5 Wide character time conversion functions</a></h4>
+
+<h5><a name="7.24.5.1" href="#7.24.5.1">7.24.5.1 The wcsftime function</a></h5>
+<p><b>Synopsis</b>
+<p><!--para 1 -->
+<pre>
+        #include <a href="#7.23">&lt;time.h&gt;</a>
+        #include <a href="#7.24">&lt;wchar.h&gt;</a>
+        size_t wcsftime(wchar_t * restrict s,
+             size_t maxsize,
              const wchar_t * restrict format,
              const struct tm * restrict timeptr);
+</pre>
+<p><b>Description</b>
+<p><!--para 2 -->
+ The wcsftime function is equivalent to the strftime function, except that:
+<ul>
+<li>  The argument s points to the initial element of an array of wide characters into which
+ the generated output is to be placed.
+<!--page 398 -->
+<li>  The argument maxsize indicates the limiting number of wide characters.
+<li>  The argument format is a wide string and the conversion specifiers are replaced by
+ corresponding sequences of wide characters.
+<li>  The return value indicates the number of wide characters.
+</ul>
+<p><b>Returns</b>
+<p><!--para 3 -->
+ If the total number of resulting wide characters including the terminating null wide
+ character is not more than maxsize, the wcsftime function returns the number of
+ wide characters placed into the array pointed to by s not including the terminating null
+ wide character. Otherwise, zero is returned and the contents of the array are
+ indeterminate.
+
+<h4><a name="7.24.6" href="#7.24.6">7.24.6 Extended multibyte/wide character conversion utilities</a></h4>
+<p><!--para 1 -->
+ The header <a href="#7.24">&lt;wchar.h&gt;</a> declares an extended set of functions useful for conversion
+ between multibyte characters and wide characters.
+<p><!--para 2 -->
+ Most of the following functions -- those that are listed as ''restartable'', <a href="#7.24.6.3">7.24.6.3</a> and
+ <a href="#7.24.6.4">7.24.6.4</a> -- take as a last argument a pointer to an object of type mbstate_t that is used
+ to describe the current conversion state from a particular multibyte character sequence to
+ a wide character sequence (or the reverse) under the rules of a particular setting for the
+ LC_CTYPE category of the current locale.
+<p><!--para 3 -->
+ The initial conversion state corresponds, for a conversion in either direction, to the
+ beginning of a new multibyte character in the initial shift state. A zero-valued
+ mbstate_t object is (at least) one way to describe an initial conversion state. A zero-
+ valued mbstate_t object can be used to initiate conversion involving any multibyte
+ character sequence, in any LC_CTYPE category setting. If an mbstate_t object has
+ been altered by any of the functions described in this subclause, and is then used with a
+ different multibyte character sequence, or in the other conversion direction, or with a
+ different LC_CTYPE category setting than on earlier function calls, the behavior is
+ undefined.<sup><a href="#note299"><b>299)</b></a></sup>
+<p><!--para 4 -->
+ On entry, each function takes the described conversion state (either internal or pointed to
+ by an argument) as current. The conversion state described by the pointed-to object is
+ altered as needed to track the shift state, and the position within a multibyte character, for
+ the associated multibyte character sequence.
+<!--page 399 -->
+
+<p><b>Footnotes</b>
+<p><small><a name="note299" href="#note299">299)</a> Thus, a particular mbstate_t object can be used, for example, with both the mbrtowc and
+ mbsrtowcs functions as long as they are used to step sequentially through the same multibyte
+ character string.
+</small>
+
+<h5><a name="7.24.6.1" href="#7.24.6.1">7.24.6.1 Single-byte/wide character conversion functions</a></h5>
+
+<h5><a name="7.24.6.1.1" href="#7.24.6.1.1">7.24.6.1.1 The btowc function</a></h5>
+<p><b>Synopsis</b>
+<p><!--para 1 -->
+<pre>
+        #include <a href="#7.19">&lt;stdio.h&gt;</a>
+        #include <a href="#7.24">&lt;wchar.h&gt;</a>
         wint_t btowc(int c);
+</pre>
+<p><b>Description</b>
+<p><!--para 2 -->
+ The btowc function determines whether c constitutes a valid single-byte character in the
+ initial shift state.
+<p><b>Returns</b>
+<p><!--para 3 -->
+ The btowc function returns WEOF if c has the value EOF or if (unsigned char)c
+ does not constitute a valid single-byte character in the initial shift state. Otherwise, it
+ returns the wide character representation of that character.
+
+<h5><a name="7.24.6.1.2" href="#7.24.6.1.2">7.24.6.1.2 The wctob function</a></h5>
+<p><b>Synopsis</b>
+<p><!--para 1 -->
+<pre>
+        #include <a href="#7.19">&lt;stdio.h&gt;</a>
+        #include <a href="#7.24">&lt;wchar.h&gt;</a>
         int wctob(wint_t c);
+</pre>
+<p><b>Description</b>
+<p><!--para 2 -->
+ The wctob function determines whether c corresponds to a member of the extended
+ character set whose multibyte character representation is a single byte when in the initial
+ shift state.
+<p><b>Returns</b>
+<p><!--para 3 -->
+ The wctob function returns EOF if c does not correspond to a multibyte character with
+ length one in the initial shift state. Otherwise, it returns the single-byte representation of
+ that character as an unsigned char converted to an int.
+
+<h5><a name="7.24.6.2" href="#7.24.6.2">7.24.6.2 Conversion state functions</a></h5>
+
+<h5><a name="7.24.6.2.1" href="#7.24.6.2.1">7.24.6.2.1 The mbsinit function</a></h5>
+<p><b>Synopsis</b>
+<p><!--para 1 -->
+<pre>
+        #include <a href="#7.24">&lt;wchar.h&gt;</a>
         int mbsinit(const mbstate_t *ps);
-        size_t mbrlen(const char * restrict s, size_t n,
-             mbstate_t * restrict ps);
-        size_t mbrtowc(wchar_t * restrict pwc,
-             const char * restrict s, size_t n,
+</pre>
+<p><b>Description</b>
+<p><!--para 2 -->
+ If ps is not a null pointer, the mbsinit function determines whether the pointed-to
+ mbstate_t object describes an initial conversion state.
+<!--page 400 -->
+<p><b>Returns</b>
+<p><!--para 3 -->
+ The mbsinit function returns nonzero if ps is a null pointer or if the pointed-to object
+ describes an initial conversion state; otherwise, it returns zero.
+
+<h5><a name="7.24.6.3" href="#7.24.6.3">7.24.6.3 Restartable multibyte/wide character conversion functions</a></h5>
+<p><!--para 1 -->
+ These functions differ from the corresponding multibyte character functions of <a href="#7.20.7">7.20.7</a>
+ (mblen, mbtowc, and wctomb) in that they have an extra parameter, ps, of type
+ pointer to mbstate_t that points to an object that can completely describe the current
+ conversion state of the associated multibyte character sequence. If ps is a null pointer,
+ each function uses its own internal mbstate_t object instead, which is initialized at
+ program startup to the initial conversion state. The implementation behaves as if no
+ library function calls these functions with a null pointer for ps.
+<p><!--para 2 -->
+ Also unlike their corresponding functions, the return value does not represent whether the
+ encoding is state-dependent.
+
+<h5><a name="7.24.6.3.1" href="#7.24.6.3.1">7.24.6.3.1 The mbrlen function</a></h5>
+<p><b>Synopsis</b>
+<p><!--para 1 -->
+<pre>
+        #include <a href="#7.24">&lt;wchar.h&gt;</a>
+        size_t mbrlen(const char * restrict s,
+             size_t n,
              mbstate_t * restrict ps);
-        size_t wcrtomb(char * restrict s, wchar_t wc,
-             mbstate_t * restrict ps);
-        size_t mbsrtowcs(wchar_t * restrict dst,
-             const char ** restrict src, size_t len,
-             mbstate_t * restrict ps);
-        size_t wcsrtombs(char * restrict dst,
-             const wchar_t ** restrict src, size_t len,
-             mbstate_t * restrict ps);
-<a name="B.24" href="#B.24"><b>B.24 Wide character classification and mapping utilities &lt;wctype.h&gt;</b></a>
-        wint_t         wctrans_t          wctype_t          WEOF
-        int   iswalnum(wint_t wc);
-        int   iswalpha(wint_t wc);
-        int   iswblank(wint_t wc);
-        int   iswcntrl(wint_t wc);
-        int   iswdigit(wint_t wc);
-        int   iswgraph(wint_t wc);
-        int   iswlower(wint_t wc);
-        int   iswprint(wint_t wc);
-        int   iswpunct(wint_t wc);
-        int   iswspace(wint_t wc);
-        int   iswupper(wint_t wc);
-        int   iswxdigit(wint_t wc);
-        int   iswctype(wint_t wc, wctype_t desc);
-[<a name="p437" href="#p437">page 437</a>] (<a href="#Contents">Contents</a>)
-
-      wctype_t wctype(const char *property);
-      wint_t towlower(wint_t wc);
-      wint_t towupper(wint_t wc);
-      wint_t towctrans(wint_t wc, wctrans_t desc);
-      wctrans_t wctrans(const char *property);
-
-
-
-
-[<a name="p438" href="#p438">page 438</a>] (<a href="#Contents">Contents</a>)
-
-<a name="C" href="#C"><b>                                          Annex C</b></a>
-                                        (informative)
-                                      Sequence points
-1   The following are the sequence points described in <a href="#5.1.2.3">5.1.2.3</a>:
-    -- The call to a function, after the arguments have been evaluated (<a href="#6.5.2.2">6.5.2.2</a>).
-    -- The end of the first operand of the following operators: logical AND &amp;&amp; (<a href="#6.5.13">6.5.13</a>);
-      logical OR || (<a href="#6.5.14">6.5.14</a>); conditional ? (<a href="#6.5.15">6.5.15</a>); comma , (<a href="#6.5.17">6.5.17</a>).
-    -- The end of a full declarator: declarators (<a href="#6.7.5">6.7.5</a>);
-    -- The end of a full expression: an initializer (<a href="#6.7.8">6.7.8</a>); the expression in an expression
-      statement (<a href="#6.8.3">6.8.3</a>); the controlling expression of a selection statement (if or switch)
-      (<a href="#6.8.4">6.8.4</a>); the controlling expression of a while or do statement (<a href="#6.8.5">6.8.5</a>); each of the
-      expressions of a for statement (<a href="#6.8.5.3">6.8.5.3</a>); the expression in a return statement
-      (<a href="#6.8.6.4">6.8.6.4</a>).
-    -- Immediately before a library function returns (<a href="#7.1.4">7.1.4</a>).
-    -- After the actions associated with each formatted input/output function conversion
-      specifier (<a href="#7.19.6">7.19.6</a>, <a href="#7.24.2">7.24.2</a>).
-    -- Immediately before and immediately after each call to a comparison function, and
-      also between any call to a comparison function and any movement of the objects
-      passed as arguments to that call (<a href="#7.20.5">7.20.5</a>).
-
-
-
-
-[<a name="p439" href="#p439">page 439</a>] (<a href="#Contents">Contents</a>)
-
-<a name="D" href="#D"><b>                                         Annex D</b></a>
-                                        (normative)
-                   Universal character names for identifiers
-1   This clause lists the hexadecimal code values that are valid in universal character names
-    in identifiers.
-2   This table is reproduced unchanged from ISO/IEC TR 10176:1998, produced by ISO/IEC
-    JTC 1/SC 22/WG 20, except for the omission of ranges that are part of the basic character
-    sets.
-    Latin:            00AA, 00BA, 00C0-00D6, 00D8-00F6, 00F8-01F5, 01FA-0217,
-                      0250-02A8, 1E00-1E9B, 1EA0-1EF9, 207F
-    Greek:            0386, 0388-038A, 038C, 038E-03A1, 03A3-03CE, 03D0-03D6,
-                      03DA, 03DC, 03DE, 03E0, 03E2-03F3, 1F00-1F15, 1F18-1F1D,
-                      1F20-1F45, 1F48-1F4D, 1F50-1F57, 1F59, 1F5B, 1F5D,
-                      1F5F-1F7D, 1F80-1FB4, 1FB6-1FBC, 1FC2-1FC4, 1FC6-1FCC,
-                      1FD0-1FD3, 1FD6-1FDB, 1FE0-1FEC, 1FF2-1FF4, 1FF6-1FFC
-    Cyrillic:         0401-040C, 040E-044F, 0451-045C, 045E-0481, 0490-04C4,
-                      04C7-04C8, 04CB-04CC, 04D0-04EB, 04EE-04F5, 04F8-04F9
-    Armenian:         0531-0556, 0561-0587
-    Hebrew:           05B0-05B9,      05BB-05BD,       05BF,   05C1-05C2,      05D0-05EA,
-                      05F0-05F2
-    Arabic:           0621-063A, 0640-0652, 0670-06B7, 06BA-06BE, 06C0-06CE,
-                      06D0-06DC, 06E5-06E8, 06EA-06ED
-    Devanagari:       0901-0903, 0905-0939, 093E-094D, 0950-0952, 0958-0963
-    Bengali:          0981-0983, 0985-098C, 098F-0990, 0993-09A8, 09AA-09B0,
-                      09B2, 09B6-09B9, 09BE-09C4, 09C7-09C8, 09CB-09CD,
-                      09DC-09DD, 09DF-09E3, 09F0-09F1
-    Gurmukhi:         0A02, 0A05-0A0A, 0A0F-0A10, 0A13-0A28, 0A2A-0A30,
-                      0A32-0A33, 0A35-0A36, 0A38-0A39, 0A3E-0A42, 0A47-0A48,
-                      0A4B-0A4D, 0A59-0A5C, 0A5E, 0A74
-    Gujarati:         0A81-0A83, 0A85-0A8B, 0A8D, 0A8F-0A91, 0A93-0AA8,
-                      0AAA-0AB0,    0AB2-0AB3,     0AB5-0AB9, 0ABD-0AC5,
-                      0AC7-0AC9, 0ACB-0ACD, 0AD0, 0AE0
-    Oriya:            0B01-0B03, 0B05-0B0C, 0B0F-0B10, 0B13-0B28, 0B2A-0B30,
-                      0B32-0B33, 0B36-0B39, 0B3E-0B43, 0B47-0B48, 0B4B-0B4D,
-[<a name="p440" href="#p440">page 440</a>] (<a href="#Contents">Contents</a>)
-
-                0B5C-0B5D, 0B5F-0B61
-Tamil:          0B82-0B83, 0B85-0B8A, 0B8E-0B90, 0B92-0B95, 0B99-0B9A,
-                0B9C, 0B9E-0B9F, 0BA3-0BA4, 0BA8-0BAA, 0BAE-0BB5,
-                0BB7-0BB9, 0BBE-0BC2, 0BC6-0BC8, 0BCA-0BCD
-Telugu:         0C01-0C03, 0C05-0C0C, 0C0E-0C10, 0C12-0C28, 0C2A-0C33,
-                0C35-0C39, 0C3E-0C44, 0C46-0C48, 0C4A-0C4D, 0C60-0C61
-Kannada:        0C82-0C83, 0C85-0C8C, 0C8E-0C90, 0C92-0CA8, 0CAA-0CB3,
-                0CB5-0CB9, 0CBE-0CC4, 0CC6-0CC8, 0CCA-0CCD, 0CDE,
-                0CE0-0CE1
-Malayalam:      0D02-0D03, 0D05-0D0C, 0D0E-0D10, 0D12-0D28, 0D2A-0D39,
-                0D3E-0D43, 0D46-0D48, 0D4A-0D4D, 0D60-0D61
-Thai:           0E01-0E3A, 0E40-0E5B
-Lao:            0E81-0E82, 0E84, 0E87-0E88, 0E8A, 0E8D, 0E94-0E97,
-                0E99-0E9F,   0EA1-0EA3,  0EA5,  0EA7,  0EAA-0EAB,
-                0EAD-0EAE, 0EB0-0EB9, 0EBB-0EBD, 0EC0-0EC4, 0EC6,
-                0EC8-0ECD, 0EDC-0EDD
-Tibetan:        0F00, 0F18-0F19, 0F35, 0F37, 0F39, 0F3E-0F47, 0F49-0F69,
-                0F71-0F84, 0F86-0F8B, 0F90-0F95, 0F97, 0F99-0FAD,
-                0FB1-0FB7, 0FB9
-Georgian:       10A0-10C5, 10D0-10F6
-Hiragana:       3041-3093, 309B-309C
-Katakana:       30A1-30F6, 30FB-30FC
-Bopomofo:       3105-312C
-CJK Unified Ideographs: 4E00-9FA5
-Hangul:         AC00-D7A3
-Digits:         0660-0669, 06F0-06F9, 0966-096F, 09E6-09EF, 0A66-0A6F,
-                0AE6-0AEF, 0B66-0B6F, 0BE7-0BEF, 0C66-0C6F, 0CE6-0CEF,
-                0D66-0D6F, 0E50-0E59, 0ED0-0ED9, 0F20-0F33
-Special characters: 00B5, 00B7, 02B0-02B8, 02BB, 02BD-02C1, 02D0-02D1,
-                   02E0-02E4, 037A, 0559, 093D, 0B3D, 1FBE, 203F-2040, 2102,
-                   2107, 210A-2113, 2115, 2118-211D, 2124, 2126, 2128, 212A-2131,
-                   2133-2138, 2160-2182, 3005-3007, 3021-3029
-
-
-
-
-[<a name="p441" href="#p441">page 441</a>] (<a href="#Contents">Contents</a>)
-
-<a name="E" href="#E"><b>                                         Annex E</b></a>
-                                       (informative)
-                                Implementation limits
-1   The contents of the header <a href="#7.10">&lt;limits.h&gt;</a> are given below, in alphabetical order. The
-    minimum magnitudes shown shall be replaced by implementation-defined magnitudes
-    with the same sign. The values shall all be constant expressions suitable for use in #if
-    preprocessing directives. The components are described further in <a href="#5.2.4.2.1">5.2.4.2.1</a>.
-           #define     CHAR_BIT                               8
-           #define     CHAR_MAX          UCHAR_MAX or SCHAR_MAX
-           #define     CHAR_MIN                  0 or SCHAR_MIN
-           #define     INT_MAX                           +32767
-           #define     INT_MIN                           -32767
-           #define     LONG_MAX                     +2147483647
-           #define     LONG_MIN                     -2147483647
-           #define     LLONG_MAX           +9223372036854775807
-           #define     LLONG_MIN           -9223372036854775807
-           #define     MB_LEN_MAX                             1
-           #define     SCHAR_MAX                           +127
-           #define     SCHAR_MIN                           -127
-           #define     SHRT_MAX                          +32767
-           #define     SHRT_MIN                          -32767
-           #define     UCHAR_MAX                            255
-           #define     USHRT_MAX                          65535
-           #define     UINT_MAX                           65535
-           #define     ULONG_MAX                     4294967295
-           #define     ULLONG_MAX          18446744073709551615
-2   The contents of the header <a href="#7.7">&lt;float.h&gt;</a> are given below. All integer values, except
-    FLT_ROUNDS, shall be constant expressions suitable for use in #if preprocessing
-    directives; all floating values shall be constant expressions. The components are
-    described further in <a href="#5.2.4.2.2">5.2.4.2.2</a>.
-3   The values given in the following list shall be replaced by implementation-defined
-    expressions:
-           #define FLT_EVAL_METHOD
-           #define FLT_ROUNDS
-4   The values given in the following list shall be replaced by implementation-defined
-    constant expressions that are greater or equal in magnitude (absolute value) to those
-    shown, with the same sign:
-[<a name="p442" href="#p442">page 442</a>] (<a href="#Contents">Contents</a>)
-
-           #define    DBL_DIG                                        10
-           #define    DBL_MANT_DIG
-           #define    DBL_MAX_10_EXP                               +37
-           #define    DBL_MAX_EXP
-           #define    DBL_MIN_10_EXP                               -37
-           #define    DBL_MIN_EXP
-           #define    DECIMAL_DIG                                    10
-           #define    FLT_DIG                                         6
-           #define    FLT_MANT_DIG
-           #define    FLT_MAX_10_EXP                               +37
-           #define    FLT_MAX_EXP
-           #define    FLT_MIN_10_EXP                               -37
-           #define    FLT_MIN_EXP
-           #define    FLT_RADIX                                       2
-           #define    LDBL_DIG                                       10
-           #define    LDBL_MANT_DIG
-           #define    LDBL_MAX_10_EXP                              +37
-           #define    LDBL_MAX_EXP
-           #define    LDBL_MIN_10_EXP                              -37
-           #define    LDBL_MIN_EXP
-5   The values given in the following list shall be replaced by implementation-defined
-    constant expressions with values that are greater than or equal to those shown:
-           #define DBL_MAX                                      1E+37
-           #define FLT_MAX                                      1E+37
-           #define LDBL_MAX                                     1E+37
-6   The values given in the following list shall be replaced by implementation-defined
-    constant expressions with (positive) values that are less than or equal to those shown:
-           #define    DBL_EPSILON                                1E-9
-           #define    DBL_MIN                                   1E-37
-           #define    FLT_EPSILON                                1E-5
-           #define    FLT_MIN                                   1E-37
-           #define    LDBL_EPSILON                               1E-9
-           #define    LDBL_MIN                                  1E-37
-
-
-
-
-[<a name="p443" href="#p443">page 443</a>] (<a href="#Contents">Contents</a>)
-
-<a name="F" href="#F"><b>                                               Annex F</b></a>
-                                              (normative)
-                          IEC 60559 floating-point arithmetic
-<a name="F.1" href="#F.1"><b>    F.1 Introduction</b></a>
-1   This annex specifies C language support for the IEC 60559 floating-point standard. The
-    IEC 60559 floating-point standard is specifically Binary floating-point arithmetic for
-    microprocessor systems, second edition (IEC 60559:1989), previously designated
-    IEC 559:1989 and as IEEE Standard for Binary Floating-Point Arithmetic
-    (ANSI/IEEE 754-1985). IEEE Standard for Radix-Independent Floating-Point
-    Arithmetic (ANSI/IEEE 854-1987) generalizes the binary standard to remove
-    dependencies on radix and word length. IEC 60559 generally refers to the floating-point
-    standard, as in IEC 60559 operation, IEC 60559 format, etc. An implementation that
-    defines __STDC_IEC_559__ shall conform to the specifications in this annex. Where
-    a binding between the C language and IEC 60559 is indicated, the IEC 60559-specified
-    behavior is adopted by reference, unless stated otherwise.
-<a name="F.2" href="#F.2"><b>    F.2 Types</b></a>
-1   The C floating types match the IEC 60559 formats as follows:
-    -- The float type matches the IEC 60559 single format.
-    -- The double type matches the IEC 60559 double format.
-    -- The long double type matches an IEC 60559 extended format,307) else a
-      non-IEC 60559 extended format, else the IEC 60559 double format.
-    Any non-IEC 60559 extended format used for the long double type shall have more
-    precision than IEC 60559 double and at least the range of IEC 60559 double.308)
-    Recommended practice
-2   The long double type should match an IEC 60559 extended format.
-
-
-
-
-    307) ''Extended'' is IEC 60559's double-extended data format. Extended refers to both the common 80-bit
-         and quadruple 128-bit IEC 60559 formats.
-    308) A non-IEC 60559 long double type is required to provide infinity and NaNs, as its values include
-         all double values.
-
-[<a name="p444" href="#p444">page 444</a>] (<a href="#Contents">Contents</a>)
-
-<a name="F.2.1" href="#F.2.1"><b>    F.2.1 Infinities, signed zeros, and NaNs</b></a>
-1   This specification does not define the behavior of signaling NaNs.309) It generally uses
-    the term NaN to denote quiet NaNs. The NAN and INFINITY macros and the nan
-    functions in <a href="#7.12">&lt;math.h&gt;</a> provide designations for IEC 60559 NaNs and infinities.
-<a name="F.3" href="#F.3"><b>    F.3 Operators and functions</b></a>
-1   C operators and functions provide IEC 60559 required and recommended facilities as
-    listed below.
-    -- The +, -, *, and / operators provide the IEC 60559 add, subtract, multiply, and
-      divide operations.
-    -- The sqrt functions in <a href="#7.12">&lt;math.h&gt;</a> provide the IEC 60559 square root operation.
-    -- The remainder functions in <a href="#7.12">&lt;math.h&gt;</a> provide the IEC 60559 remainder
-      operation. The remquo functions in <a href="#7.12">&lt;math.h&gt;</a> provide the same operation but
-      with additional information.
-    -- The rint functions in <a href="#7.12">&lt;math.h&gt;</a> provide the IEC 60559 operation that rounds a
-      floating-point number to an integer value (in the same precision). The nearbyint
-      functions in <a href="#7.12">&lt;math.h&gt;</a> provide the nearbyinteger function recommended in the
-      Appendix to ANSI/IEEE 854.
-    -- The conversions for floating types provide the IEC 60559 conversions between
-      floating-point precisions.
-    -- The conversions from integer to floating types provide the IEC 60559 conversions
-      from integer to floating point.
-    -- The conversions from floating to integer types provide IEC 60559-like conversions
-      but always round toward zero.
-    -- The lrint and llrint functions in <a href="#7.12">&lt;math.h&gt;</a> provide the IEC 60559
-      conversions, which honor the directed rounding mode, from floating point to the
-      long int and long long int integer formats. The lrint and llrint
-      functions can be used to implement IEC 60559 conversions from floating to other
-      integer formats.
-    -- The translation time conversion of floating constants and the strtod, strtof,
-      strtold, fprintf, fscanf, and related library functions in <a href="#7.20">&lt;stdlib.h&gt;</a>,
-      <a href="#7.19">&lt;stdio.h&gt;</a>, and <a href="#7.24">&lt;wchar.h&gt;</a> provide IEC 60559 binary-decimal conversions. The
-      strtold function in <a href="#7.20">&lt;stdlib.h&gt;</a> provides the conv function recommended in the
-      Appendix to ANSI/IEEE 854.
-
-    309) Since NaNs created by IEC 60559 operations are always quiet, quiet NaNs (along with infinities) are
-         sufficient for closure of the arithmetic.
-
-[<a name="p445" href="#p445">page 445</a>] (<a href="#Contents">Contents</a>)
-
--- The relational and equality operators provide IEC 60559 comparisons. IEC 60559
-  identifies a need for additional comparison predicates to facilitate writing code that
-  accounts for NaNs. The comparison macros (isgreater, isgreaterequal,
-  isless, islessequal, islessgreater, and isunordered) in <a href="#7.12">&lt;math.h&gt;</a>
-  supplement the language operators to address this need. The islessgreater and
-  isunordered macros provide respectively a quiet version of the &lt;&gt; predicate and
-  the unordered predicate recommended in the Appendix to IEC 60559.
--- The feclearexcept, feraiseexcept, and fetestexcept functions in
-  <a href="#7.6">&lt;fenv.h&gt;</a> provide the facility to test and alter the IEC 60559 floating-point
-  exception status flags. The fegetexceptflag and fesetexceptflag
-  functions in <a href="#7.6">&lt;fenv.h&gt;</a> provide the facility to save and restore all five status flags at
-  one time. These functions are used in conjunction with the type fexcept_t and the
-  floating-point     exception      macros      (FE_INEXACT,         FE_DIVBYZERO,
-  FE_UNDERFLOW, FE_OVERFLOW, FE_INVALID) also in <a href="#7.6">&lt;fenv.h&gt;</a>.
--- The fegetround and fesetround functions in <a href="#7.6">&lt;fenv.h&gt;</a> provide the facility
-  to select among the IEC 60559 directed rounding modes represented by the rounding
-  direction macros in <a href="#7.6">&lt;fenv.h&gt;</a> (FE_TONEAREST, FE_UPWARD, FE_DOWNWARD,
-  FE_TOWARDZERO) and the values 0, 1, 2, and 3 of FLT_ROUNDS are the
-  IEC 60559 directed rounding modes.
--- The fegetenv, feholdexcept, fesetenv, and feupdateenv functions in
-  <a href="#7.6">&lt;fenv.h&gt;</a> provide a facility to manage the floating-point environment, comprising
-  the IEC 60559 status flags and control modes.
--- The copysign functions in <a href="#7.12">&lt;math.h&gt;</a> provide the copysign function
-  recommended in the Appendix to IEC 60559.
--- The unary minus (-) operator provides the minus (-) operation recommended in the
-  Appendix to IEC 60559.
--- The scalbn and scalbln functions in <a href="#7.12">&lt;math.h&gt;</a> provide the scalb function
-  recommended in the Appendix to IEC 60559.
--- The logb functions in <a href="#7.12">&lt;math.h&gt;</a> provide the logb function recommended in the
-  Appendix to IEC 60559, but following the newer specifications in ANSI/IEEE 854.
--- The nextafter and nexttoward functions in <a href="#7.12">&lt;math.h&gt;</a> provide the nextafter
-  function recommended in the Appendix to IEC 60559 (but with a minor change to
-  better handle signed zeros).
--- The isfinite macro in <a href="#7.12">&lt;math.h&gt;</a> provides the finite function recommended in
-  the Appendix to IEC 60559.
--- The isnan macro in <a href="#7.12">&lt;math.h&gt;</a> provides the isnan function recommended in the
-  Appendix to IEC 60559.
-
-[<a name="p446" href="#p446">page 446</a>] (<a href="#Contents">Contents</a>)
-
-    -- The signbit macro and the fpclassify macro in <a href="#7.12">&lt;math.h&gt;</a>, used in
-      conjunction with the number classification macros (FP_NAN, FP_INFINITE,
-      FP_NORMAL, FP_SUBNORMAL, FP_ZERO), provide the facility of the class
-      function recommended in the Appendix to IEC 60559 (except that the classification
-      macros defined in <a href="#7.12.3">7.12.3</a> do not distinguish signaling from quiet NaNs).
-<a name="F.4" href="#F.4"><b>    F.4 Floating to integer conversion</b></a>
-1   If the floating value is infinite or NaN or if the integral part of the floating value exceeds
-    the range of the integer type, then the ''invalid'' floating-point exception is raised and the
-    resulting value is unspecified. Whether conversion of non-integer floating values whose
-    integral part is within the range of the integer type raises the ''inexact'' floating-point
-    exception is unspecified.310)
-<a name="F.5" href="#F.5"><b>    F.5 Binary-decimal conversion</b></a>
-1   Conversion from the widest supported IEC 60559 format to decimal with
-    DECIMAL_DIG digits and back is the identity function.311)
-2   Conversions involving IEC 60559 formats follow all pertinent recommended practice. In
-    particular, conversion between any supported IEC 60559 format and decimal with
-    DECIMAL_DIG or fewer significant digits is correctly rounded (honoring the current
-    rounding mode), which assures that conversion from the widest supported IEC 60559
-    format to decimal with DECIMAL_DIG digits and back is the identity function.
-3   Functions such as strtod that convert character sequences to floating types honor the
-    rounding direction. Hence, if the rounding direction might be upward or downward, the
-    implementation cannot convert a minus-signed sequence by negating the converted
-    unsigned sequence.
-
-
-
-
-    310) ANSI/IEEE 854, but not IEC 60559 (ANSI/IEEE 754), directly specifies that floating-to-integer
-         conversions raise the ''inexact'' floating-point exception for non-integer in-range values. In those
-         cases where it matters, library functions can be used to effect such conversions with or without raising
-         the ''inexact'' floating-point exception. See rint, lrint, llrint, and nearbyint in
-         <a href="#7.12">&lt;math.h&gt;</a>.
-    311) If the minimum-width IEC 60559 extended format (64 bits of precision) is supported,
-         DECIMAL_DIG shall be at least 21. If IEC 60559 double (53 bits of precision) is the widest
-         IEC 60559 format supported, then DECIMAL_DIG shall be at least 17. (By contrast, LDBL_DIG and
-         DBL_DIG are 18 and 15, respectively, for these formats.)
-
-[<a name="p447" href="#p447">page 447</a>] (<a href="#Contents">Contents</a>)
-
-<a name="F.6" href="#F.6"><b>    F.6 Contracted expressions</b></a>
-1   A contracted expression treats infinities, NaNs, signed zeros, subnormals, and the
-    rounding directions in a manner consistent with the basic arithmetic operations covered
-    by IEC 60559.
-    Recommended practice
-2   A contracted expression should raise floating-point exceptions in a manner generally
-    consistent with the basic arithmetic operations. A contracted expression should deliver
-    the same value as its uncontracted counterpart, else should be correctly rounded (once).
-<a name="F.7" href="#F.7"><b>    F.7 Floating-point environment</b></a>
-1   The floating-point environment defined in <a href="#7.6">&lt;fenv.h&gt;</a> includes the IEC 60559 floating-
-    point exception status flags and directed-rounding control modes. It includes also
-    IEC 60559 dynamic rounding precision and trap enablement modes, if the
-    implementation supports them.312)
-<a name="F.7.1" href="#F.7.1"><b>    F.7.1 Environment management</b></a>
-1   IEC 60559 requires that floating-point operations implicitly raise floating-point exception
-    status flags, and that rounding control modes can be set explicitly to affect result values of
-    floating-point operations. When the state for the FENV_ACCESS pragma (defined in
-    <a href="#7.6">&lt;fenv.h&gt;</a>) is ''on'', these changes to the floating-point state are treated as side effects
-    which respect sequence points.313)
-<a name="F.7.2" href="#F.7.2"><b>    F.7.2 Translation</b></a>
-1   During translation the IEC 60559 default modes are in effect:
-    -- The rounding direction mode is rounding to nearest.
-    -- The rounding precision mode (if supported) is set so that results are not shortened.
-    -- Trapping or stopping (if supported) is disabled on all floating-point exceptions.
-    Recommended practice
-2   The implementation should produce a diagnostic message for each translation-time
-
-
-
-
-    312) This specification does not require dynamic rounding precision nor trap enablement modes.
-    313) If the state for the FENV_ACCESS pragma is ''off'', the implementation is free to assume the floating-
-         point control modes will be the default ones and the floating-point status flags will not be tested,
-         which allows certain optimizations (see <a href="#F.8">F.8</a>).
-
-[<a name="p448" href="#p448">page 448</a>] (<a href="#Contents">Contents</a>)
-
-    floating-point exception, other than ''inexact'';314) the implementation should then
-    proceed with the translation of the program.
-<a name="F.7.3" href="#F.7.3"><b>    F.7.3 Execution</b></a>
-1   At program startup the floating-point environment is initialized as prescribed by
-    IEC 60559:
-    -- All floating-point exception status flags are cleared.
-    -- The rounding direction mode is rounding to nearest.
-    -- The dynamic rounding precision mode (if supported) is set so that results are not
-      shortened.
-    -- Trapping or stopping (if supported) is disabled on all floating-point exceptions.
-<a name="F.7.4" href="#F.7.4"><b>    F.7.4 Constant expressions</b></a>
-1   An arithmetic constant expression of floating type, other than one in an initializer for an
-    object that has static storage duration, is evaluated (as if) during execution; thus, it is
-    affected by any operative floating-point control modes and raises floating-point
-    exceptions as required by IEC 60559 (provided the state for the FENV_ACCESS pragma
-    is ''on'').315)
-2   EXAMPLE
-             #include <a href="#7.6">&lt;fenv.h&gt;</a>
-             #pragma STDC FENV_ACCESS ON
-             void f(void)
-             {
-                   float w[] = { 0.0/0.0 };                  //   raises an exception
-                   static float x = 0.0/0.0;                 //   does not raise an exception
-                   float y = 0.0/0.0;                        //   raises an exception
-                   double z = 0.0/0.0;                       //   raises an exception
-                   /* ... */
-             }
-3   For the static initialization, the division is done at translation time, raising no (execution-time) floating-
-    point exceptions. On the other hand, for the three automatic initializations the invalid division occurs at
-
-
-    314) As floating constants are converted to appropriate internal representations at translation time, their
-         conversion is subject to default rounding modes and raises no execution-time floating-point exceptions
-         (even where the state of the FENV_ACCESS pragma is ''on''). Library functions, for example
-         strtod, provide execution-time conversion of numeric strings.
-    315) Where the state for the FENV_ACCESS pragma is ''on'', results of inexact expressions like 1.0/3.0
-         are affected by rounding modes set at execution time, and expressions such as 0.0/0.0 and
-         1.0/0.0 generate execution-time floating-point exceptions. The programmer can achieve the
-         efficiency of translation-time evaluation through static initialization, such as
-                  const static double one_third = 1.0/3.0;
-
-
-[<a name="p449" href="#p449">page 449</a>] (<a href="#Contents">Contents</a>)
-
-    execution time.
+</pre>
+<p><b>Description</b>
+<p><!--para 2 -->
+ The mbrlen function is equivalent to the call:
+<pre>
+        mbrtowc(NULL, s, n, ps != NULL ? ps : &amp;internal)
+</pre>
+ where internal is the mbstate_t object for the mbrlen function, except that the
+ expression designated by ps is evaluated only once.
+<p><b>Returns</b>
+<p><!--para 3 -->
+ The mbrlen function returns a value between zero and n, inclusive, (size_t)(-2),
+ or (size_t)(-1).
+<p><b> Forward references</b>: the mbrtowc function (<a href="#7.24.6.3.2">7.24.6.3.2</a>).
+<!--page 401 -->
+
+<h5><a name="7.24.6.3.2" href="#7.24.6.3.2">7.24.6.3.2 The mbrtowc function</a></h5>
+<p><b>Synopsis</b>
+<p><!--para 1 -->
+<pre>
+         #include <a href="#7.24">&lt;wchar.h&gt;</a>
+         size_t mbrtowc(wchar_t * restrict pwc,
+              const char * restrict s,
+              size_t n,
+              mbstate_t * restrict ps);
+</pre>
+<p><b>Description</b>
+<p><!--para 2 -->
+ If s is a null pointer, the mbrtowc function is equivalent to the call:
+<pre>
+                 mbrtowc(NULL, "", 1, ps)
+</pre>
+ In this case, the values of the parameters pwc and n are ignored.
+<p><!--para 3 -->
+ If s is not a null pointer, the mbrtowc function inspects at most n bytes beginning with
+ the byte pointed to by s to determine the number of bytes needed to complete the next
+ multibyte character (including any shift sequences). If the function determines that the
+ next multibyte character is complete and valid, it determines the value of the
+ corresponding wide character and then, if pwc is not a null pointer, stores that value in
+ the object pointed to by pwc. If the corresponding wide character is the null wide
+ character, the resulting state described is the initial conversion state.
+<p><b>Returns</b>
+<p><!--para 4 -->
+ The mbrtowc function returns the first of the following that applies (given the current
+ conversion state):
+<dl>
+<dt> 0         <dd>            if the next n or fewer bytes complete the multibyte character that
+                       corresponds to the null wide character (which is the value stored).
+<dt> between 1 and n inclusive<dd> if the next n or fewer bytes complete a valid multibyte
+                    character (which is the value stored); the value returned is the number
+                    of bytes that complete the multibyte character.
+<dt> (size_t)(-2)<dd> if the next n bytes contribute to an incomplete (but potentially valid)
+              multibyte character, and all n bytes have been processed (no value is
+              stored).<sup><a href="#note300"><b>300)</b></a></sup>
+<dt> (size_t)(-1)<dd> if an encoding error occurs, in which case the next n or fewer bytes
+              do not contribute to a complete and valid multibyte character (no
+              value is stored); the value of the macro EILSEQ is stored in errno,
+              and the conversion state is unspecified.
+</dl>
+<!--page 402 -->
+
+<p><b>Footnotes</b>
+<p><small><a name="note300" href="#note300">300)</a> When n has at least the value of the MB_CUR_MAX macro, this case can only occur if s points at a
+ sequence of redundant shift sequences (for implementations with state-dependent encodings).
+</small>
+
+<h5><a name="7.24.6.3.3" href="#7.24.6.3.3">7.24.6.3.3 The wcrtomb function</a></h5>
+<p><b>Synopsis</b>
+<p><!--para 1 -->
+<pre>
+         #include <a href="#7.24">&lt;wchar.h&gt;</a>
+         size_t wcrtomb(char * restrict s,
+              wchar_t wc,
+              mbstate_t * restrict ps);
+</pre>
+<p><b>Description</b>
+<p><!--para 2 -->
+ If s is a null pointer, the wcrtomb function is equivalent to the call
+<pre>
+                 wcrtomb(buf, L'\0', ps)
+</pre>
+ where buf is an internal buffer.
+<p><!--para 3 -->
+ If s is not a null pointer, the wcrtomb function determines the number of bytes needed
+ to represent the multibyte character that corresponds to the wide character given by wc
+ (including any shift sequences), and stores the multibyte character representation in the
+ array whose first element is pointed to by s. At most MB_CUR_MAX bytes are stored. If
+ wc is a null wide character, a null byte is stored, preceded by any shift sequence needed
+ to restore the initial shift state; the resulting state described is the initial conversion state.
+<p><b>Returns</b>
+<p><!--para 4 -->
+ The wcrtomb function returns the number of bytes stored in the array object (including
+ any shift sequences). When wc is not a valid wide character, an encoding error occurs:
+ the function stores the value of the macro EILSEQ in errno and returns
+ (size_t)(-1); the conversion state is unspecified.
+
+<h5><a name="7.24.6.4" href="#7.24.6.4">7.24.6.4 Restartable multibyte/wide string conversion functions</a></h5>
+<p><!--para 1 -->
+ These functions differ from the corresponding multibyte string functions of <a href="#7.20.8">7.20.8</a>
+ (mbstowcs and wcstombs) in that they have an extra parameter, ps, of type pointer to
+ mbstate_t that points to an object that can completely describe the current conversion
+ state of the associated multibyte character sequence. If ps is a null pointer, each function
+ uses its own internal mbstate_t object instead, which is initialized at program startup
+ to the initial conversion state. The implementation behaves as if no library function calls
+ these functions with a null pointer for ps.
+<p><!--para 2 -->
+ Also unlike their corresponding functions, the conversion source parameter, src, has a
+ pointer-to-pointer type. When the function is storing the results of conversions (that is,
+ when dst is not a null pointer), the pointer object pointed to by this parameter is updated
+ to reflect the amount of the source processed by that invocation.
+<!--page 403 -->
+
+<h5><a name="7.24.6.4.1" href="#7.24.6.4.1">7.24.6.4.1 The mbsrtowcs function</a></h5>
+<p><b>Synopsis</b>
+<p><!--para 1 -->
+<pre>
+          #include <a href="#7.24">&lt;wchar.h&gt;</a>
+          size_t mbsrtowcs(wchar_t * restrict dst,
+               const char ** restrict src,
+               size_t len,
+               mbstate_t * restrict ps);
+</pre>
+<p><b>Description</b>
+<p><!--para 2 -->
+ The mbsrtowcs function converts a sequence of multibyte characters that begins in the
+ conversion state described by the object pointed to by ps, from the array indirectly
+ pointed to by src into a sequence of corresponding wide characters. If dst is not a null
+ pointer, the converted characters are stored into the array pointed to by dst. Conversion
+ continues up to and including a terminating null character, which is also stored.
+ Conversion stops earlier in two cases: when a sequence of bytes is encountered that does
+ not form a valid multibyte character, or (if dst is not a null pointer) when len wide
+ characters have been stored into the array pointed to by dst.<sup><a href="#note301"><b>301)</b></a></sup> Each conversion takes
+ place as if by a call to the mbrtowc function.
+<p><!--para 3 -->
+ If dst is not a null pointer, the pointer object pointed to by src is assigned either a null
+ pointer (if conversion stopped due to reaching a terminating null character) or the address
+ just past the last multibyte character converted (if any). If conversion stopped due to
+ reaching a terminating null character and if dst is not a null pointer, the resulting state
+ described is the initial conversion state.
+<p><b>Returns</b>
+<p><!--para 4 -->
+ If the input conversion encounters a sequence of bytes that do not form a valid multibyte
+ character, an encoding error occurs: the mbsrtowcs function stores the value of the
+ macro EILSEQ in errno and returns (size_t)(-1); the conversion state is
+ unspecified. Otherwise, it returns the number of multibyte characters successfully
+ converted, not including the terminating null character (if any).
+<!--page 404 -->
+
+<p><b>Footnotes</b>
+<p><small><a name="note301" href="#note301">301)</a> Thus, the value of len is ignored if dst is a null pointer.
+</small>
+
+<h5><a name="7.24.6.4.2" href="#7.24.6.4.2">7.24.6.4.2 The wcsrtombs function</a></h5>
+<p><b>Synopsis</b>
+<p><!--para 1 -->
+<pre>
+         #include <a href="#7.24">&lt;wchar.h&gt;</a>
+         size_t wcsrtombs(char * restrict dst,
+              const wchar_t ** restrict src,
+              size_t len,
+              mbstate_t * restrict ps);
+</pre>
+<p><b>Description</b>
+<p><!--para 2 -->
+ The wcsrtombs function converts a sequence of wide characters from the array
+ indirectly pointed to by src into a sequence of corresponding multibyte characters that
+ begins in the conversion state described by the object pointed to by ps. If dst is not a
+ null pointer, the converted characters are then stored into the array pointed to by dst.
+ Conversion continues up to and including a terminating null wide character, which is also
+ stored. Conversion stops earlier in two cases: when a wide character is reached that does
+ not correspond to a valid multibyte character, or (if dst is not a null pointer) when the
+ next multibyte character would exceed the limit of len total bytes to be stored into the
+ array pointed to by dst. Each conversion takes place as if by a call to the wcrtomb
+ function.<sup><a href="#note302"><b>302)</b></a></sup>
+<p><!--para 3 -->
+ If dst is not a null pointer, the pointer object pointed to by src is assigned either a null
+ pointer (if conversion stopped due to reaching a terminating null wide character) or the
+ address just past the last wide character converted (if any). If conversion stopped due to
+ reaching a terminating null wide character, the resulting state described is the initial
+ conversion state.
+<p><b>Returns</b>
+<p><!--para 4 -->
+ If conversion stops because a wide character is reached that does not correspond to a
+ valid multibyte character, an encoding error occurs: the wcsrtombs function stores the
+ value of the macro EILSEQ in errno and returns (size_t)(-1); the conversion
+ state is unspecified. Otherwise, it returns the number of bytes in the resulting multibyte
+ character sequence, not including the terminating null character (if any).
+<!--page 405 -->
+
+<p><b>Footnotes</b>
+<p><small><a name="note302" href="#note302">302)</a> If conversion stops because a terminating null wide character has been reached, the bytes stored
+ include those necessary to reach the initial shift state immediately before the null byte.
+</small>
+
+<h3><a name="7.25" href="#7.25">7.25 Wide character classification and mapping utilities &lt;wctype.h&gt;</a></h3>
+
+<h4><a name="7.25.1" href="#7.25.1">7.25.1 Introduction</a></h4>
+<p><!--para 1 -->
+ The header <a href="#7.25">&lt;wctype.h&gt;</a> declares three data types, one macro, and many functions.<sup><a href="#note303"><b>303)</b></a></sup>
+<p><!--para 2 -->
+ The types declared are
+<pre>
+          wint_t
+</pre>
+ described in <a href="#7.24.1">7.24.1</a>;
+<pre>
+          wctrans_t
+</pre>
+ which is a scalar type that can hold values which represent locale-specific character
+ mappings; and
+<pre>
+          wctype_t
+</pre>
+ which is a scalar type that can hold values which represent locale-specific character
+ classifications.
+<p><!--para 3 -->
+ The macro defined is WEOF (described in <a href="#7.24.1">7.24.1</a>).
+<p><!--para 4 -->
+ The functions declared are grouped as follows:
+<ul>
+<li>  Functions that provide wide character classification;
+<li>  Extensible functions that provide wide character classification;
+<li>  Functions that provide wide character case mapping;
+<li>  Extensible functions that provide wide character mapping.
+</ul>
+<p><!--para 5 -->
+ For all functions described in this subclause that accept an argument of type wint_t, the
+ value shall be representable as a wchar_t or shall equal the value of the macro WEOF. If
+ this argument has any other value, the behavior is undefined.
+<p><!--para 6 -->
+ The behavior of these functions is affected by the LC_CTYPE category of the current
+ locale.
+<!--page 406 -->
+
+<p><b>Footnotes</b>
+<p><small><a name="note303" href="#note303">303)</a> See ''future library directions'' (<a href="#7.26.13">7.26.13</a>).
+</small>
+
+<h4><a name="7.25.2" href="#7.25.2">7.25.2 Wide character classification utilities</a></h4>
+<p><!--para 1 -->
+ The header <a href="#7.25">&lt;wctype.h&gt;</a> declares several functions useful for classifying wide
+ characters.
+<p><!--para 2 -->
+ The term printing wide character refers to a member of a locale-specific set of wide
+ characters, each of which occupies at least one printing position on a display device. The
+ term control wide character refers to a member of a locale-specific set of wide characters
+ that are not printing wide characters.
+
+<h5><a name="7.25.2.1" href="#7.25.2.1">7.25.2.1 Wide character classification functions</a></h5>
+<p><!--para 1 -->
+ The functions in this subclause return nonzero (true) if and only if the value of the
+ argument wc conforms to that in the description of the function.
+<p><!--para 2 -->
+ Each of the following functions returns true for each wide character that corresponds (as
+ if by a call to the wctob function) to a single-byte character for which the corresponding
+ character classification function from <a href="#7.4.1">7.4.1</a> returns true, except that the iswgraph and
+ iswpunct functions may differ with respect to wide characters other than L' ' that are
+ both printing and white-space wide characters.<sup><a href="#note304"><b>304)</b></a></sup>
+<p><b> Forward references</b>: the wctob function (<a href="#7.24.6.1.2">7.24.6.1.2</a>).
+
+<p><b>Footnotes</b>
+<p><small><a name="note304" href="#note304">304)</a> For example, if the expression isalpha(wctob(wc)) evaluates to true, then the call
+ iswalpha(wc) also returns true. But, if the expression isgraph(wctob(wc)) evaluates to true
+ (which cannot occur for wc == L' ' of course), then either iswgraph(wc) or iswprint(wc)
+ &amp;&amp; iswspace(wc) is true, but not both.
+</small>
+
+<h5><a name="7.25.2.1.1" href="#7.25.2.1.1">7.25.2.1.1 The iswalnum function</a></h5>
+<p><b>Synopsis</b>
+<p><!--para 1 -->
+<pre>
+        #include <a href="#7.25">&lt;wctype.h&gt;</a>
+        int iswalnum(wint_t wc);
+</pre>
+<p><b>Description</b>
+<p><!--para 2 -->
+ The iswalnum function tests for any wide character for which iswalpha or
+ iswdigit is true.
+
+<h5><a name="7.25.2.1.2" href="#7.25.2.1.2">7.25.2.1.2 The iswalpha function</a></h5>
+<p><b>Synopsis</b>
+<p><!--para 1 -->
+<pre>
+        #include <a href="#7.25">&lt;wctype.h&gt;</a>
+        int iswalpha(wint_t wc);
+</pre>
+<p><b>Description</b>
+<p><!--para 2 -->
+ The iswalpha function tests for any wide character for which iswupper or
+ iswlower is true, or any wide character that is one of a locale-specific set of alphabetic
+<!--page 407 -->
+ wide characters for which none of iswcntrl, iswdigit, iswpunct, or iswspace
+ is true.<sup><a href="#note305"><b>305)</b></a></sup>
+
+<p><b>Footnotes</b>
+<p><small><a name="note305" href="#note305">305)</a> The functions iswlower and iswupper test true or false separately for each of these additional
+ wide characters; all four combinations are possible.
+</small>
+
+<h5><a name="7.25.2.1.3" href="#7.25.2.1.3">7.25.2.1.3 The iswblank function</a></h5>
+<p><b>Synopsis</b>
+<p><!--para 1 -->
+<pre>
+         #include <a href="#7.25">&lt;wctype.h&gt;</a>
+         int iswblank(wint_t wc);
+</pre>
+<p><b>Description</b>
+<p><!--para 2 -->
+ The iswblank function tests for any wide character that is a standard blank wide
+ character or is one of a locale-specific set of wide characters for which iswspace is true
+ and that is used to separate words within a line of text. The standard blank wide
+ characters are the following: space (L' '), and horizontal tab (L'\t'). In the "C"
+ locale, iswblank returns true only for the standard blank characters.
+
+<h5><a name="7.25.2.1.4" href="#7.25.2.1.4">7.25.2.1.4 The iswcntrl function</a></h5>
+<p><b>Synopsis</b>
+<p><!--para 1 -->
+<pre>
+         #include <a href="#7.25">&lt;wctype.h&gt;</a>
+         int iswcntrl(wint_t wc);
+</pre>
+<p><b>Description</b>
+<p><!--para 2 -->
+ The iswcntrl function tests for any control wide character.
+
+<h5><a name="7.25.2.1.5" href="#7.25.2.1.5">7.25.2.1.5 The iswdigit function</a></h5>
+<p><b>Synopsis</b>
+<p><!--para 1 -->
+<pre>
+         #include <a href="#7.25">&lt;wctype.h&gt;</a>
+         int iswdigit(wint_t wc);
+</pre>
+<p><b>Description</b>
+<p><!--para 2 -->
+ The iswdigit function tests for any wide character that corresponds to a decimal-digit
+ character (as defined in <a href="#5.2.1">5.2.1</a>).
+
+<h5><a name="7.25.2.1.6" href="#7.25.2.1.6">7.25.2.1.6 The iswgraph function</a></h5>
+<p><b>Synopsis</b>
+<p><!--para 1 -->
+<pre>
+         #include <a href="#7.25">&lt;wctype.h&gt;</a>
+         int iswgraph(wint_t wc);
+</pre>
+<!--page 408 -->
+<p><b>Description</b>
+<p><!--para 2 -->
+ The iswgraph function tests for any wide character for which iswprint is true and
+ iswspace is false.<sup><a href="#note306"><b>306)</b></a></sup>
+
+<p><b>Footnotes</b>
+<p><small><a name="note306" href="#note306">306)</a> Note that the behavior of the iswgraph and iswpunct functions may differ from their
+ corresponding functions in <a href="#7.4.1">7.4.1</a> with respect to printing, white-space, single-byte execution
+ characters other than ' '.
+</small>
+
+<h5><a name="7.25.2.1.7" href="#7.25.2.1.7">7.25.2.1.7 The iswlower function</a></h5>
+<p><b>Synopsis</b>
+<p><!--para 1 -->
+<pre>
+         #include <a href="#7.25">&lt;wctype.h&gt;</a>
+         int iswlower(wint_t wc);
+</pre>
+<p><b>Description</b>
+<p><!--para 2 -->
+ The iswlower function tests for any wide character that corresponds to a lowercase
+ letter or is one of a locale-specific set of wide characters for which none of iswcntrl,
+ iswdigit, iswpunct, or iswspace is true.
+
+<h5><a name="7.25.2.1.8" href="#7.25.2.1.8">7.25.2.1.8 The iswprint function</a></h5>
+<p><b>Synopsis</b>
+<p><!--para 1 -->
+<pre>
+         #include <a href="#7.25">&lt;wctype.h&gt;</a>
+         int iswprint(wint_t wc);
+</pre>
+<p><b>Description</b>
+<p><!--para 2 -->
+ The iswprint function tests for any printing wide character.
+
+<h5><a name="7.25.2.1.9" href="#7.25.2.1.9">7.25.2.1.9 The iswpunct function</a></h5>
+<p><b>Synopsis</b>
+<p><!--para 1 -->
+<pre>
+         #include <a href="#7.25">&lt;wctype.h&gt;</a>
+         int iswpunct(wint_t wc);
+</pre>
+<p><b>Description</b>
+<p><!--para 2 -->
+ The iswpunct function tests for any printing wide character that is one of a locale-
+ specific set of punctuation wide characters for which neither iswspace nor iswalnum
+ is true.<sup><a href="#note306"><b>306)</b></a></sup>
+
+<h5><a name="7.25.2.1.10" href="#7.25.2.1.10">7.25.2.1.10 The iswspace function</a></h5>
+<p><b>Synopsis</b>
+<p><!--para 1 -->
+<pre>
+         #include <a href="#7.25">&lt;wctype.h&gt;</a>
+         int iswspace(wint_t wc);
+</pre>
+<!--page 409 -->
+<p><b>Description</b>
+<p><!--para 2 -->
+ The iswspace function tests for any wide character that corresponds to a locale-specific
+ set of white-space wide characters for which none of iswalnum, iswgraph, or
+ iswpunct is true.
+
+<h5><a name="7.25.2.1.11" href="#7.25.2.1.11">7.25.2.1.11 The iswupper function</a></h5>
+<p><b>Synopsis</b>
+<p><!--para 1 -->
+<pre>
+        #include <a href="#7.25">&lt;wctype.h&gt;</a>
+        int iswupper(wint_t wc);
+</pre>
+<p><b>Description</b>
+<p><!--para 2 -->
+ The iswupper function tests for any wide character that corresponds to an uppercase
+ letter or is one of a locale-specific set of wide characters for which none of iswcntrl,
+ iswdigit, iswpunct, or iswspace is true.
+
+<h5><a name="7.25.2.1.12" href="#7.25.2.1.12">7.25.2.1.12 The iswxdigit function</a></h5>
+<p><b>Synopsis</b>
+<p><!--para 1 -->
+<pre>
+        #include <a href="#7.25">&lt;wctype.h&gt;</a>
+        int iswxdigit(wint_t wc);
+</pre>
+<p><b>Description</b>
+<p><!--para 2 -->
+ The iswxdigit function tests for any wide character that corresponds to a
+ hexadecimal-digit character (as defined in <a href="#6.4.4.1">6.4.4.1</a>).
+
+<h5><a name="7.25.2.2" href="#7.25.2.2">7.25.2.2 Extensible wide character classification functions</a></h5>
+<p><!--para 1 -->
+ The functions wctype and iswctype provide extensible wide character classification
+ as well as testing equivalent to that performed by the functions described in the previous
+ subclause (<a href="#7.25.2.1">7.25.2.1</a>).
+
+<h5><a name="7.25.2.2.1" href="#7.25.2.2.1">7.25.2.2.1 The iswctype function</a></h5>
+<p><b>Synopsis</b>
+<p><!--para 1 -->
+<pre>
+        #include <a href="#7.25">&lt;wctype.h&gt;</a>
+        int iswctype(wint_t wc, wctype_t desc);
+</pre>
+<p><b>Description</b>
+<p><!--para 2 -->
+ The iswctype function determines whether the wide character wc has the property
+ described by desc. The current setting of the LC_CTYPE category shall be the same as
+ during the call to wctype that returned the value desc.
+<p><!--para 3 -->
+ Each of the following expressions has a truth-value equivalent to the call to the wide
+ character classification function (<a href="#7.25.2.1">7.25.2.1</a>) in the comment that follows the expression:
+<!--page 410 -->
+<pre>
+        iswctype(wc,       wctype("alnum"))             //   iswalnum(wc)
+        iswctype(wc,       wctype("alpha"))             //   iswalpha(wc)
+        iswctype(wc,       wctype("blank"))             //   iswblank(wc)
+        iswctype(wc,       wctype("cntrl"))             //   iswcntrl(wc)
+        iswctype(wc,       wctype("digit"))             //   iswdigit(wc)
+        iswctype(wc,       wctype("graph"))             //   iswgraph(wc)
+        iswctype(wc,       wctype("lower"))             //   iswlower(wc)
+        iswctype(wc,       wctype("print"))             //   iswprint(wc)
+        iswctype(wc,       wctype("punct"))             //   iswpunct(wc)
+        iswctype(wc,       wctype("space"))             //   iswspace(wc)
+        iswctype(wc,       wctype("upper"))             //   iswupper(wc)
+        iswctype(wc,       wctype("xdigit"))            //   iswxdigit(wc)
+</pre>
+<p><b>Returns</b>
+<p><!--para 4 -->
+ The iswctype function returns nonzero (true) if and only if the value of the wide
+ character wc has the property described by desc.
+<p><b> Forward references</b>: the wctype function (<a href="#7.25.2.2.2">7.25.2.2.2</a>).
+
+<h5><a name="7.25.2.2.2" href="#7.25.2.2.2">7.25.2.2.2 The wctype function</a></h5>
+<p><b>Synopsis</b>
+<p><!--para 1 -->
+<pre>
+        #include <a href="#7.25">&lt;wctype.h&gt;</a>
+        wctype_t wctype(const char *property);
+</pre>
+<p><b>Description</b>
+<p><!--para 2 -->
+ The wctype function constructs a value with type wctype_t that describes a class of
+ wide characters identified by the string argument property.
+<p><!--para 3 -->
+ The strings listed in the description of the iswctype function shall be valid in all
+ locales as property arguments to the wctype function.
+<p><b>Returns</b>
+<p><!--para 4 -->
+ If property identifies a valid class of wide characters according to the LC_CTYPE
+ category of the current locale, the wctype function returns a nonzero value that is valid
+ as the second argument to the iswctype function; otherwise, it returns zero.              *
+<!--page 411 -->
+
+<h4><a name="7.25.3" href="#7.25.3">7.25.3 Wide character case mapping utilities</a></h4>
+<p><!--para 1 -->
+ The header <a href="#7.25">&lt;wctype.h&gt;</a> declares several functions useful for mapping wide characters.
+
+<h5><a name="7.25.3.1" href="#7.25.3.1">7.25.3.1 Wide character case mapping functions</a></h5>
+
+<h5><a name="7.25.3.1.1" href="#7.25.3.1.1">7.25.3.1.1 The towlower function</a></h5>
+<p><b>Synopsis</b>
+<p><!--para 1 -->
+<pre>
+        #include <a href="#7.25">&lt;wctype.h&gt;</a>
+        wint_t towlower(wint_t wc);
+</pre>
+<p><b>Description</b>
+<p><!--para 2 -->
+ The towlower function converts an uppercase letter to a corresponding lowercase letter.
+<p><b>Returns</b>
+<p><!--para 3 -->
+ If the argument is a wide character for which iswupper is true and there are one or
+ more corresponding wide characters, as specified by the current locale, for which
+ iswlower is true, the towlower function returns one of the corresponding wide
+ characters (always the same one for any given locale); otherwise, the argument is
+ returned unchanged.
+
+<h5><a name="7.25.3.1.2" href="#7.25.3.1.2">7.25.3.1.2 The towupper function</a></h5>
+<p><b>Synopsis</b>
+<p><!--para 1 -->
+<pre>
+        #include <a href="#7.25">&lt;wctype.h&gt;</a>
+        wint_t towupper(wint_t wc);
+</pre>
+<p><b>Description</b>
+<p><!--para 2 -->
+ The towupper function converts a lowercase letter to a corresponding uppercase letter.
+<p><b>Returns</b>
+<p><!--para 3 -->
+ If the argument is a wide character for which iswlower is true and there are one or
+ more corresponding wide characters, as specified by the current locale, for which
+ iswupper is true, the towupper function returns one of the corresponding wide
+ characters (always the same one for any given locale); otherwise, the argument is
+ returned unchanged.
+
+<h5><a name="7.25.3.2" href="#7.25.3.2">7.25.3.2 Extensible wide character case mapping functions</a></h5>
+<p><!--para 1 -->
+ The functions wctrans and towctrans provide extensible wide character mapping as
+ well as case mapping equivalent to that performed by the functions described in the
+ previous subclause (<a href="#7.25.3.1">7.25.3.1</a>).
+<!--page 412 -->
+
+<h5><a name="7.25.3.2.1" href="#7.25.3.2.1">7.25.3.2.1 The towctrans function</a></h5>
+<p><b>Synopsis</b>
+<p><!--para 1 -->
+<pre>
+        #include <a href="#7.25">&lt;wctype.h&gt;</a>
+        wint_t towctrans(wint_t wc, wctrans_t desc);
+</pre>
+<p><b>Description</b>
+<p><!--para 2 -->
+ The towctrans function maps the wide character wc using the mapping described by
+ desc. The current setting of the LC_CTYPE category shall be the same as during the call
+ to wctrans that returned the value desc.
+<p><!--para 3 -->
+ Each of the following expressions behaves the same as the call to the wide character case
+ mapping function (<a href="#7.25.3.1">7.25.3.1</a>) in the comment that follows the expression:
+<pre>
+        towctrans(wc, wctrans("tolower"))                      // towlower(wc)
+        towctrans(wc, wctrans("toupper"))                      // towupper(wc)
+</pre>
+<p><b>Returns</b>
+<p><!--para 4 -->
+ The towctrans function returns the mapped value of wc using the mapping described
+ by desc.
+
+<h5><a name="7.25.3.2.2" href="#7.25.3.2.2">7.25.3.2.2 The wctrans function</a></h5>
+<p><b>Synopsis</b>
+<p><!--para 1 -->
+<pre>
+        #include <a href="#7.25">&lt;wctype.h&gt;</a>
+        wctrans_t wctrans(const char *property);
+</pre>
+<p><b>Description</b>
+<p><!--para 2 -->
+ The wctrans function constructs a value with type wctrans_t that describes a
+ mapping between wide characters identified by the string argument property.
+<p><!--para 3 -->
+ The strings listed in the description of the towctrans function shall be valid in all
+ locales as property arguments to the wctrans function.
+<p><b>Returns</b>
+<p><!--para 4 -->
+ If property identifies a valid mapping of wide characters according to the LC_CTYPE
+ category of the current locale, the wctrans function returns a nonzero value that is valid
+ as the second argument to the towctrans function; otherwise, it returns zero.
+<!--page 413 -->
+
+<h3><a name="7.26" href="#7.26">7.26 Future library directions</a></h3>
+<p><!--para 1 -->
+ The following names are grouped under individual headers for convenience. All external
+ names described below are reserved no matter what headers are included by the program.
+
+<h4><a name="7.26.1" href="#7.26.1">7.26.1 Complex arithmetic &lt;complex.h&gt;</a></h4>
+<p><!--para 1 -->
+ The function names
+<pre>
+      cerf                cexpm1              clog2
+      cerfc               clog10              clgamma
+      cexp2               clog1p              ctgamma
+</pre>
+ and the same names suffixed with f or l may be added to the declarations in the
+ <a href="#7.3">&lt;complex.h&gt;</a> header.
+
+<h4><a name="7.26.2" href="#7.26.2">7.26.2 Character handling &lt;ctype.h&gt;</a></h4>
+<p><!--para 1 -->
+ Function names that begin with either is or to, and a lowercase letter may be added to
+ the declarations in the <a href="#7.4">&lt;ctype.h&gt;</a> header.
+
+<h4><a name="7.26.3" href="#7.26.3">7.26.3 Errors &lt;errno.h&gt;</a></h4>
+<p><!--para 1 -->
+ Macros that begin with E and a digit or E and an uppercase letter may be added to the
+ declarations in the <a href="#7.5">&lt;errno.h&gt;</a> header.
+
+<h4><a name="7.26.4" href="#7.26.4">7.26.4 Format conversion of integer types &lt;inttypes.h&gt;</a></h4>
+<p><!--para 1 -->
+ Macro names beginning with PRI or SCN followed by any lowercase letter or X may be
+ added to the macros defined in the <a href="#7.8">&lt;inttypes.h&gt;</a> header.
+
+<h4><a name="7.26.5" href="#7.26.5">7.26.5 Localization &lt;locale.h&gt;</a></h4>
+<p><!--para 1 -->
+ Macros that begin with LC_ and an uppercase letter may be added to the definitions in
+ the <a href="#7.11">&lt;locale.h&gt;</a> header.
+
+<h4><a name="7.26.6" href="#7.26.6">7.26.6 Signal handling &lt;signal.h&gt;</a></h4>
+<p><!--para 1 -->
+ Macros that begin with either SIG and an uppercase letter or SIG_ and an uppercase
+ letter may be added to the definitions in the <a href="#7.14">&lt;signal.h&gt;</a> header.
+
+<h4><a name="7.26.7" href="#7.26.7">7.26.7 Boolean type and values &lt;stdbool.h&gt;</a></h4>
+<p><!--para 1 -->
+ The ability to undefine and perhaps then redefine the macros bool, true, and false is
+ an obsolescent feature.
+
+<h4><a name="7.26.8" href="#7.26.8">7.26.8 Integer types &lt;stdint.h&gt;</a></h4>
+<p><!--para 1 -->
+ Typedef names beginning with int or uint and ending with _t may be added to the
+ types defined in the <a href="#7.18">&lt;stdint.h&gt;</a> header. Macro names beginning with INT or UINT
+ and ending with _MAX, _MIN, or _C may be added to the macros defined in the
+ <a href="#7.18">&lt;stdint.h&gt;</a> header.
+<!--page 414 -->
+
+<h4><a name="7.26.9" href="#7.26.9">7.26.9 Input/output &lt;stdio.h&gt;</a></h4>
+<p><!--para 1 -->
+ Lowercase letters may be added to the conversion specifiers and length modifiers in
+ fprintf and fscanf. Other characters may be used in extensions.
+<p><!--para 2 -->
+ The gets function is obsolescent, and is deprecated.
+<p><!--para 3 -->
+ The use of ungetc on a binary stream where the file position indicator is zero prior to
+ the call is an obsolescent feature.
+
+<h4><a name="7.26.10" href="#7.26.10">7.26.10 General utilities &lt;stdlib.h&gt;</a></h4>
+<p><!--para 1 -->
+ Function names that begin with str and a lowercase letter may be added to the
+ declarations in the <a href="#7.20">&lt;stdlib.h&gt;</a> header.
+
+<h4><a name="7.26.11" href="#7.26.11">7.26.11 String handling &lt;string.h&gt;</a></h4>
+<p><!--para 1 -->
+ Function names that begin with str, mem, or wcs and a lowercase letter may be added
+ to the declarations in the <a href="#7.21">&lt;string.h&gt;</a> header.
+
+<h4><a name="7.26.12" href="#7.26.12">7.26.12 Extended multibyte and wide character utilities &lt;wchar.h&gt;</a></h4>
+<p><!--para 1 -->
+ Function names that begin with wcs and a lowercase letter may be added to the
+ declarations in the <a href="#7.24">&lt;wchar.h&gt;</a> header.
+<p><!--para 2 -->
+ Lowercase letters may be added to the conversion specifiers and length modifiers in
+ fwprintf and fwscanf. Other characters may be used in extensions.
+
+<h4><a name="7.26.13" href="#7.26.13">7.26.13 Wide character classification and mapping utilities</a></h4>
+ <a href="#7.25">&lt;wctype.h&gt;</a>
+<p><!--para 1 -->
+ Function names that begin with is or to and a lowercase letter may be added to the
+ declarations in the <a href="#7.25">&lt;wctype.h&gt;</a> header.
+<!--page 415 -->
+
+<h2><a name="A" href="#A">Annex A</a></h2>
+<pre>
+                                              (informative)
+                               Language syntax summary
+</pre>
+<p><!--para 1 -->
+ NOTE     The notation is described in <a href="#6.1">6.1</a>.
+
+<h3><a name="A.1" href="#A.1">A.1 Lexical grammar</a></h3>
+
+<h4><a name="A.1.1" href="#A.1.1">A.1.1 Lexical elements</a></h4>
+ (<a href="#6.4">6.4</a>) token:
+<pre>
+                  keyword
+                  identifier
+                  constant
+                  string-literal
+                  punctuator
+</pre>
+ (<a href="#6.4">6.4</a>) preprocessing-token:
+<pre>
+               header-name
+               identifier
+               pp-number
+               character-constant
+               string-literal
+               punctuator
+               each non-white-space character that cannot be one of the above
+</pre>
+
+<h4><a name="A.1.2" href="#A.1.2">A.1.2 Keywords</a></h4>
+ (<a href="#6.4.1">6.4.1</a>) keyword: one of
+<!--page 416 -->
+<pre>
+               auto                      enum             restrict    unsigned
+               break                     extern           return      void
+               case                      float            short       volatile
+               char                      for              signed      while
+               const                     goto             sizeof      _Bool
+               continue                  if               static      _Complex
+               default                   inline           struct      _Imaginary
+               do                        int              switch
+               double                    long             typedef
+               else                      register         union
+</pre>
+
+<h4><a name="A.1.3" href="#A.1.3">A.1.3 Identifiers</a></h4>
+ (<a href="#6.4.2.1">6.4.2.1</a>) identifier:
+<pre>
+                identifier-nondigit
+                identifier identifier-nondigit
+                identifier digit
+</pre>
+ (<a href="#6.4.2.1">6.4.2.1</a>) identifier-nondigit:
+<pre>
+                nondigit
+                universal-character-name
+                other implementation-defined characters
+</pre>
+ (<a href="#6.4.2.1">6.4.2.1</a>) nondigit: one of
+<pre>
+               _ a b          c    d   e   f   g   h     i   j   k   l   m
+                    n o       p    q   r   s   t   u     v   w   x   y   z
+                    A B       C    D   E   F   G   H     I   J   K   L   M
+                    N O       P    Q   R   S   T   U     V   W   X   Y   Z
+</pre>
+ (<a href="#6.4.2.1">6.4.2.1</a>) digit: one of
+<pre>
+                0 1 2         3    4   5   6   7   8     9
+</pre>
+
+<h4><a name="A.1.4" href="#A.1.4">A.1.4 Universal character names</a></h4>
+ (<a href="#6.4.3">6.4.3</a>) universal-character-name:
+<pre>
+               \u hex-quad
+               \U hex-quad hex-quad
+</pre>
+ (<a href="#6.4.3">6.4.3</a>) hex-quad:
+<pre>
+               hexadecimal-digit hexadecimal-digit
+                            hexadecimal-digit hexadecimal-digit
+</pre>
+
+<h4><a name="A.1.5" href="#A.1.5">A.1.5 Constants</a></h4>
+ (<a href="#6.4.4">6.4.4</a>) constant:
+<pre>
+               integer-constant
+               floating-constant
+               enumeration-constant
+               character-constant
+</pre>
+ (<a href="#6.4.4.1">6.4.4.1</a>) integer-constant:
+<pre>
+                decimal-constant integer-suffix<sub>opt</sub>
+                octal-constant integer-suffix<sub>opt</sub>
+                hexadecimal-constant integer-suffix<sub>opt</sub>
+</pre>
+ (<a href="#6.4.4.1">6.4.4.1</a>) decimal-constant:
+<!--page 417 -->
+<pre>
+               nonzero-digit
+               decimal-constant digit
+</pre>
+ (<a href="#6.4.4.1">6.4.4.1</a>) octal-constant:
+<pre>
+                0
+                octal-constant octal-digit
+</pre>
+ (<a href="#6.4.4.1">6.4.4.1</a>) hexadecimal-constant:
+<pre>
+               hexadecimal-prefix hexadecimal-digit
+               hexadecimal-constant hexadecimal-digit
+</pre>
+ (<a href="#6.4.4.1">6.4.4.1</a>) hexadecimal-prefix: one of
+<pre>
+               0x 0X
+</pre>
+ (<a href="#6.4.4.1">6.4.4.1</a>) nonzero-digit: one of
+<pre>
+               1 2 3 4 5              6      7   8   9
+</pre>
+ (<a href="#6.4.4.1">6.4.4.1</a>) octal-digit: one of
+<pre>
+                0 1 2 3           4   5      6   7
+</pre>
+ (<a href="#6.4.4.1">6.4.4.1</a>) hexadecimal-digit: one of
+<pre>
+               0 1 2 3 4 5                   6   7   8   9
+               a b c d e f
+               A B C D E F
+</pre>
+ (<a href="#6.4.4.1">6.4.4.1</a>) integer-suffix:
+<pre>
+                unsigned-suffix long-suffix<sub>opt</sub>
+                unsigned-suffix long-long-suffix
+                long-suffix unsigned-suffix<sub>opt</sub>
+                long-long-suffix unsigned-suffix<sub>opt</sub>
+</pre>
+ (<a href="#6.4.4.1">6.4.4.1</a>) unsigned-suffix: one of
+<pre>
+                u U
+</pre>
+ (<a href="#6.4.4.1">6.4.4.1</a>) long-suffix: one of
+<pre>
+                l L
+</pre>
+ (<a href="#6.4.4.1">6.4.4.1</a>) long-long-suffix: one of
+<pre>
+                ll LL
+</pre>
+ (<a href="#6.4.4.2">6.4.4.2</a>) floating-constant:
+<pre>
+                decimal-floating-constant
+                hexadecimal-floating-constant
+</pre>
+ (<a href="#6.4.4.2">6.4.4.2</a>) decimal-floating-constant:
+<!--page 418 -->
+<pre>
+               fractional-constant exponent-part<sub>opt</sub> floating-suffix<sub>opt</sub>
+               digit-sequence exponent-part floating-suffix<sub>opt</sub>
+</pre>
+ (<a href="#6.4.4.2">6.4.4.2</a>) hexadecimal-floating-constant:
+<pre>
+               hexadecimal-prefix hexadecimal-fractional-constant
+                             binary-exponent-part floating-suffix<sub>opt</sub>
+               hexadecimal-prefix hexadecimal-digit-sequence
+                             binary-exponent-part floating-suffix<sub>opt</sub>
+</pre>
+ (<a href="#6.4.4.2">6.4.4.2</a>) fractional-constant:
+<pre>
+                digit-sequence<sub>opt</sub> . digit-sequence
+                digit-sequence .
+</pre>
+ (<a href="#6.4.4.2">6.4.4.2</a>) exponent-part:
+<pre>
+               e sign<sub>opt</sub> digit-sequence
+               E sign<sub>opt</sub> digit-sequence
+</pre>
+ (<a href="#6.4.4.2">6.4.4.2</a>) sign: one of
+<pre>
+                + -
+</pre>
+ (<a href="#6.4.4.2">6.4.4.2</a>) digit-sequence:
+<pre>
+                digit
+                digit-sequence digit
+</pre>
+ (<a href="#6.4.4.2">6.4.4.2</a>) hexadecimal-fractional-constant:
+<pre>
+               hexadecimal-digit-sequence<sub>opt</sub> .
+                              hexadecimal-digit-sequence
+               hexadecimal-digit-sequence .
+</pre>
+ (<a href="#6.4.4.2">6.4.4.2</a>) binary-exponent-part:
+<pre>
+                p sign<sub>opt</sub> digit-sequence
+                P sign<sub>opt</sub> digit-sequence
+</pre>
+ (<a href="#6.4.4.2">6.4.4.2</a>) hexadecimal-digit-sequence:
+<pre>
+               hexadecimal-digit
+               hexadecimal-digit-sequence hexadecimal-digit
+</pre>
+ (<a href="#6.4.4.2">6.4.4.2</a>) floating-suffix: one of
+<pre>
+                f l F L
+</pre>
+ (<a href="#6.4.4.3">6.4.4.3</a>) enumeration-constant:
+<pre>
+               identifier
+</pre>
+ (<a href="#6.4.4.4">6.4.4.4</a>) character-constant:
+<!--page 419 -->
+<pre>
+               ' c-char-sequence '
+               L' c-char-sequence '
+</pre>
+ (<a href="#6.4.4.4">6.4.4.4</a>) c-char-sequence:
+<pre>
+                c-char
+                c-char-sequence c-char
+</pre>
+ (<a href="#6.4.4.4">6.4.4.4</a>) c-char:
+<pre>
+                any member of the source character set except
+                             the single-quote ', backslash \, or new-line character
+                escape-sequence
+</pre>
+ (<a href="#6.4.4.4">6.4.4.4</a>) escape-sequence:
+<pre>
+               simple-escape-sequence
+               octal-escape-sequence
+               hexadecimal-escape-sequence
+               universal-character-name
+</pre>
+ (<a href="#6.4.4.4">6.4.4.4</a>) simple-escape-sequence: one of
+<pre>
+               \' \" \? \\
+               \a \b \f \n \r \t                   \v
+</pre>
+ (<a href="#6.4.4.4">6.4.4.4</a>) octal-escape-sequence:
+<pre>
+                \ octal-digit
+                \ octal-digit octal-digit
+                \ octal-digit octal-digit octal-digit
+</pre>
+ (<a href="#6.4.4.4">6.4.4.4</a>) hexadecimal-escape-sequence:
+<pre>
+               \x hexadecimal-digit
+               hexadecimal-escape-sequence hexadecimal-digit
+</pre>
+
+<h4><a name="A.1.6" href="#A.1.6">A.1.6 String literals</a></h4>
+ (<a href="#6.4.5">6.4.5</a>) string-literal:
+<pre>
+                " s-char-sequence<sub>opt</sub> "
+                L" s-char-sequence<sub>opt</sub> "
+</pre>
+ (<a href="#6.4.5">6.4.5</a>) s-char-sequence:
+<pre>
+                s-char
+                s-char-sequence s-char
+</pre>
+ (<a href="#6.4.5">6.4.5</a>) s-char:
+<!--page 420 -->
+<pre>
+                any member of the source character set except
+                             the double-quote ", backslash \, or new-line character
+                escape-sequence
+</pre>
+
+<h4><a name="A.1.7" href="#A.1.7">A.1.7 Punctuators</a></h4>
+ (<a href="#6.4.6">6.4.6</a>) punctuator: one of
+<pre>
+               [ ] ( ) { } . -&gt;
+               ++ -- &amp; * + - ~ !
+               / % &lt;&lt; &gt;&gt; &lt; &gt; &lt;= &gt;=                     ==      !=    ^    |    &amp;&amp;   ||
+               ? : ; ...
+               = *= /= %= += -= &lt;&lt;=                    &gt;&gt;=      &amp;=       ^=   |=
+               , # ##
+               &lt;: :&gt; &lt;% %&gt; %: %:%:
+</pre>
+
+<h4><a name="A.1.8" href="#A.1.8">A.1.8 Header names</a></h4>
+ (<a href="#6.4.7">6.4.7</a>) header-name:
+<pre>
+               &lt; h-char-sequence &gt;
+               " q-char-sequence "
+</pre>
+ (<a href="#6.4.7">6.4.7</a>) h-char-sequence:
+<pre>
+               h-char
+               h-char-sequence h-char
+</pre>
+ (<a href="#6.4.7">6.4.7</a>) h-char:
+<pre>
+               any member of the source character set except
+                            the new-line character and &gt;
+</pre>
+ (<a href="#6.4.7">6.4.7</a>) q-char-sequence:
+<pre>
+               q-char
+               q-char-sequence q-char
+</pre>
+ (<a href="#6.4.7">6.4.7</a>) q-char:
+<pre>
+               any member of the source character set except
+                            the new-line character and "
+</pre>
 
-<a name="F.7.5" href="#F.7.5"><b>    F.7.5 Initialization</b></a>
-1   All computation for automatic initialization is done (as if) at execution time; thus, it is
-    affected by any operative modes and raises floating-point exceptions as required by
-    IEC 60559 (provided the state for the FENV_ACCESS pragma is ''on''). All computation
-    for initialization of objects that have static storage duration is done (as if) at translation
-    time.
-2   EXAMPLE
-             #include <a href="#7.6">&lt;fenv.h&gt;</a>
-             #pragma STDC FENV_ACCESS ON
-             void f(void)
-             {
-                   float u[] = { 1.1e75 };                  //   raises exceptions
-                   static float v = 1.1e75;                 //   does not raise exceptions
-                   float w = 1.1e75;                        //   raises exceptions
-                   double x = 1.1e75;                       //   may raise exceptions
-                   float y = 1.1e75f;                       //   may raise exceptions
-                   long double z = 1.1e75;                  //   does not raise exceptions
-                   /* ... */
-             }
-3   The static initialization of v raises no (execution-time) floating-point exceptions because its computation is
-    done at translation time. The automatic initialization of u and w require an execution-time conversion to
-    float of the wider value 1.1e75, which raises floating-point exceptions. The automatic initializations
-    of x and y entail execution-time conversion; however, in some expression evaluation methods, the
-    conversions is not to a narrower format, in which case no floating-point exception is raised.316) The
-    automatic initialization of z entails execution-time conversion, but not to a narrower format, so no floating-
-    point exception is raised. Note that the conversions of the floating constants 1.1e75 and 1.1e75f to
-    their internal representations occur at translation time in all cases.
-
-
-
-
-    316) Use of float_t and double_t variables increases the likelihood of translation-time computation.
-         For example, the automatic initialization
-                   double_t x = 1.1e75;
-          could be done at translation time, regardless of the expression evaluation method.
-
-[<a name="p450" href="#p450">page 450</a>] (<a href="#Contents">Contents</a>)
-
-<a name="F.7.6" href="#F.7.6"><b>    F.7.6 Changing the environment</b></a>
-1   Operations defined in <a href="#6.5">6.5</a> and functions and macros defined for the standard libraries
-    change floating-point status flags and control modes just as indicated by their
-    specifications (including conformance to IEC 60559). They do not change flags or modes
-    (so as to be detectable by the user) in any other cases.
-2   If the argument to the feraiseexcept function in <a href="#7.6">&lt;fenv.h&gt;</a> represents IEC 60559
-    valid coincident floating-point exceptions for atomic operations (namely ''overflow'' and
-    ''inexact'', or ''underflow'' and ''inexact''), then ''overflow'' or ''underflow'' is raised
-    before ''inexact''.
-<a name="F.8" href="#F.8"><b>    F.8 Optimization</b></a>
-1   This section identifies code transformations that might subvert IEC 60559-specified
-    behavior, and others that do not.
-<a name="F.8.1" href="#F.8.1"><b>    F.8.1 Global transformations</b></a>
-1   Floating-point arithmetic operations and external function calls may entail side effects
-    which optimization shall honor, at least where the state of the FENV_ACCESS pragma is
-    ''on''. The flags and modes in the floating-point environment may be regarded as global
-    variables; floating-point operations (+, *, etc.) implicitly read the modes and write the
-    flags.
-2   Concern about side effects may inhibit code motion and removal of seemingly useless
-    code. For example, in
-             #include <a href="#7.6">&lt;fenv.h&gt;</a>
-             #pragma STDC FENV_ACCESS ON
-             void f(double x)
-             {
-                  /* ... */
-                  for (i = 0; i &lt; n; i++) x + 1;
-                  /* ... */
-             }
-    x + 1 might raise floating-point exceptions, so cannot be removed. And since the loop
-    body might not execute (maybe 0 &gt;= n), x + 1 cannot be moved out of the loop. (Of
-    course these optimizations are valid if the implementation can rule out the nettlesome
-    cases.)
-3   This specification does not require support for trap handlers that maintain information
-    about the order or count of floating-point exceptions. Therefore, between function calls,
-    floating-point exceptions need not be precise: the actual order and number of occurrences
-    of floating-point exceptions (&gt; 1) may vary from what the source code expresses. Thus,
-    the preceding loop could be treated as
-[<a name="p451" href="#p451">page 451</a>] (<a href="#Contents">Contents</a>)
-
-            if (0 &lt; n) x + 1;
-<a name="F.8.2" href="#F.8.2"><b>    F.8.2 Expression transformations</b></a>
-1   x / 2 (&lt;-&gt;) x * 0.5                         Although similar transformations involving inexact
-                                            constants generally do not yield numerically equivalent
-                                            expressions, if the constants are exact then such
-                                            transformations can be made on IEC 60559 machines
-                                            and others that round perfectly.
-    1 * x and x / 1 (-&gt;) x                     The expressions 1 * x, x / 1, and x are equivalent
-                                            (on IEC 60559 machines, among others).317)
-    x / x (-&gt;) 1.0                             The expressions x / x and 1.0 are not equivalent if x
-                                            can be zero, infinite, or NaN.
-    x - y (&lt;-&gt;) x + (-y)                        The expressions x - y, x + (-y), and (-y) + x
-                                            are equivalent (on IEC 60559 machines, among others).
-    x - y (&lt;-&gt;) -(y - x)                        The expressions x - y and -(y - x) are not
-                                            equivalent because 1 - 1 is +0 but -(1 - 1) is -0 (in the
-                                            default rounding direction).318)
-    x - x (-&gt;) 0.0                             The expressions x - x and 0.0 are not equivalent if
-                                            x is a NaN or infinite.
-    0 * x (-&gt;) 0.0                             The expressions 0 * x and 0.0 are not equivalent if
-                                            x is a NaN, infinite, or -0.
-    x + 0(-&gt;)x                                 The expressions x + 0 and x are not equivalent if x is
-                                            -0, because (-0) + (+0) yields +0 (in the default
-                                            rounding direction), not -0.
-    x - 0(-&gt;)x                                 (+0) - (+0) yields -0 when rounding is downward
-                                            (toward -(inf)), but +0 otherwise, and (-0) - (+0) always
-                                            yields -0; so, if the state of the FENV_ACCESS pragma
-                                            is ''off'', promising default rounding, then the
-                                            implementation can replace x - 0 by x, even if x
-
-
-    317) Strict support for signaling NaNs -- not required by this specification -- would invalidate these and
-         other transformations that remove arithmetic operators.
-    318) IEC 60559 prescribes a signed zero to preserve mathematical identities across certain discontinuities.
-         Examples include:
-            1/(1/ (+-) (inf)) is (+-) (inf)
-         and
-            conj(csqrt(z)) is csqrt(conj(z)),
-         for complex z.
-
-[<a name="p452" href="#p452">page 452</a>] (<a href="#Contents">Contents</a>)
-
-                                             might be zero.
-    -x (&lt;-&gt;) 0 - x                               The expressions -x and 0 - x are not equivalent if x
-                                             is +0, because -(+0) yields -0, but 0 - (+0) yields +0
-                                             (unless rounding is downward).
-<a name="F.8.3" href="#F.8.3"><b>    F.8.3 Relational operators</b></a>
-1   x != x (-&gt;) false                           The statement x != x is true if x is a NaN.
-    x == x (-&gt;) true                            The statement x == x is false if x is a NaN.
-    x &lt; y (-&gt;) isless(x,y)                      (and similarly for &lt;=, &gt;, &gt;=) Though numerically
-                                             equal, these expressions are not equivalent because of
-                                             side effects when x or y is a NaN and the state of the
-                                             FENV_ACCESS pragma is ''on''. This transformation,
-                                             which would be desirable if extra code were required to
-                                             cause the ''invalid'' floating-point exception for
-                                             unordered cases, could be performed provided the state
-                                             of the FENV_ACCESS pragma is ''off''.
-    The sense of relational operators shall be maintained. This includes handling unordered
-    cases as expressed by the source code.
-2   EXAMPLE
-             // calls g and raises ''invalid'' if a and b are unordered
-             if (a &lt; b)
-                     f();
-             else
-                     g();
-    is not equivalent to
-             // calls f and raises ''invalid'' if a and b are unordered
-             if (a &gt;= b)
-                     g();
-             else
-                     f();
-    nor to
-             // calls f without raising ''invalid'' if a and b are unordered
-             if (isgreaterequal(a,b))
-                     g();
-             else
-                     f();
-    nor, unless the state of the FENV_ACCESS pragma is ''off'', to
-
-
-
-
-[<a name="p453" href="#p453">page 453</a>] (<a href="#Contents">Contents</a>)
-
-             // calls g without raising ''invalid'' if a and b are unordered
-             if (isless(a,b))
-                     f();
-             else
-                     g();
-    but is equivalent to
-             if (!(a &lt; b))
-                   g();
-             else
-                   f();
-
-<a name="F.8.4" href="#F.8.4"><b>    F.8.4 Constant arithmetic</b></a>
-1   The implementation shall honor floating-point exceptions raised by execution-time
-    constant arithmetic wherever the state of the FENV_ACCESS pragma is ''on''. (See <a href="#F.7.4">F.7.4</a>
-    and <a href="#F.7.5">F.7.5</a>.) An operation on constants that raises no floating-point exception can be
-    folded during translation, except, if the state of the FENV_ACCESS pragma is ''on'', a
-    further check is required to assure that changing the rounding direction to downward does
-    not alter the sign of the result,319) and implementations that support dynamic rounding
-    precision modes shall assure further that the result of the operation raises no floating-
-    point exception when converted to the semantic type of the operation.
-<a name="F.9" href="#F.9"><b>    F.9 Mathematics &lt;math.h&gt;</b></a>
-1   This subclause contains specifications of <a href="#7.12">&lt;math.h&gt;</a> facilities that are particularly suited
-    for IEC 60559 implementations.
-2   The Standard C macro HUGE_VAL and its float and long double analogs,
-    HUGE_VALF and HUGE_VALL, expand to expressions whose values are positive
-    infinities.
-3   Special cases for functions in <a href="#7.12">&lt;math.h&gt;</a> are covered directly or indirectly by
-    IEC 60559. The functions that IEC 60559 specifies directly are identified in <a href="#F.3">F.3</a>. The
-    other functions in <a href="#7.12">&lt;math.h&gt;</a> treat infinities, NaNs, signed zeros, subnormals, and
-    (provided the state of the FENV_ACCESS pragma is ''on'') the floating-point status flags
-    in a manner consistent with the basic arithmetic operations covered by IEC 60559.
-4   The expression math_errhandling &amp; MATH_ERREXCEPT shall evaluate to a
-    nonzero value.
-5   The ''invalid'' and ''divide-by-zero'' floating-point exceptions are raised as specified in
-    subsequent subclauses of this annex.
-6   The ''overflow'' floating-point exception is raised whenever an infinity -- or, because of
-    rounding direction, a maximal-magnitude finite number -- is returned in lieu of a value
-
-
-    319) 0 - 0 yields -0 instead of +0 just when the rounding direction is downward.
-
-[<a name="p454" href="#p454">page 454</a>] (<a href="#Contents">Contents</a>)
-
-     whose magnitude is too large.
-7    The ''underflow'' floating-point exception is raised whenever a result is tiny (essentially
-     subnormal or zero) and suffers loss of accuracy.320)
-8    Whether or when library functions raise the ''inexact'' floating-point exception is
-     unspecified, unless explicitly specified otherwise.
-9    Whether or when library functions raise an undeserved ''underflow'' floating-point
-     exception is unspecified.321) Otherwise, as implied by <a href="#F.7.6">F.7.6</a>, the <a href="#7.12">&lt;math.h&gt;</a> functions do
-     not raise spurious floating-point exceptions (detectable by the user), other than the
-     ''inexact'' floating-point exception.
-10   Whether the functions honor the rounding direction mode is implementation-defined,
-     unless explicitly specified otherwise.
-11   Functions with a NaN argument return a NaN result and raise no floating-point exception,
-     except where stated otherwise.
-12   The specifications in the following subclauses append to the definitions in <a href="#7.12">&lt;math.h&gt;</a>.
-     For families of functions, the specifications apply to all of the functions even though only
-     the principal function is shown. Unless otherwise specified, where the symbol ''(+-)''
-     occurs in both an argument and the result, the result has the same sign as the argument.
-     Recommended practice
-13   If a function with one or more NaN arguments returns a NaN result, the result should be
-     the same as one of the NaN arguments (after possible type conversion), except perhaps
-     for the sign.
-<a name="F.9.1" href="#F.9.1"><b>     F.9.1 Trigonometric functions</b></a>
-<a name="F.9.1.1" href="#F.9.1.1"><b>     F.9.1.1 The acos functions</b></a>
-1    -- acos(1) returns +0.
-     -- acos(x) returns a NaN and raises the ''invalid'' floating-point exception for
-       | x | &gt; 1.
-
-
-
-
-     320) IEC 60559 allows different definitions of underflow. They all result in the same values, but differ on
-          when the floating-point exception is raised.
-     321) It is intended that undeserved ''underflow'' and ''inexact'' floating-point exceptions are raised only if
-          avoiding them would be too costly.
-
-[<a name="p455" href="#p455">page 455</a>] (<a href="#Contents">Contents</a>)
-
-<a name="F.9.1.2" href="#F.9.1.2"><b>    F.9.1.2 The asin functions</b></a>
-1   -- asin((+-)0) returns (+-)0.
-    -- asin(x) returns a NaN and raises the ''invalid'' floating-point exception for
-      | x | &gt; 1.
-<a name="F.9.1.3" href="#F.9.1.3"><b>    F.9.1.3 The atan functions</b></a>
-1   -- atan((+-)0) returns (+-)0.
-    -- atan((+-)(inf)) returns (+-)pi /2.
-<a name="F.9.1.4" href="#F.9.1.4"><b>    F.9.1.4 The atan2 functions</b></a>
-1   -- atan2((+-)0, -0) returns (+-)pi .322)
-    -- atan2((+-)0, +0) returns (+-)0.
-    -- atan2((+-)0, x) returns (+-)pi for x &lt; 0.
-    -- atan2((+-)0, x) returns (+-)0 for x &gt; 0.
-    -- atan2(y, (+-)0) returns -pi /2 for y &lt; 0.
-    -- atan2(y, (+-)0) returns pi /2 for y &gt; 0.
-    -- atan2((+-)y, -(inf)) returns (+-)pi for finite y &gt; 0.
-    -- atan2((+-)y, +(inf)) returns (+-)0 for finite y &gt; 0.
-    -- atan2((+-)(inf), x) returns (+-)pi /2 for finite x.
-    -- atan2((+-)(inf), -(inf)) returns (+-)3pi /4.
-    -- atan2((+-)(inf), +(inf)) returns (+-)pi /4.
-<a name="F.9.1.5" href="#F.9.1.5"><b>    F.9.1.5 The cos functions</b></a>
-1   -- cos((+-)0) returns 1.
-    -- cos((+-)(inf)) returns a NaN and raises the ''invalid'' floating-point exception.
-<a name="F.9.1.6" href="#F.9.1.6"><b>    F.9.1.6 The sin functions</b></a>
-1   -- sin((+-)0) returns (+-)0.
-    -- sin((+-)(inf)) returns a NaN and raises the ''invalid'' floating-point exception.
-
-
-
-
-    322) atan2(0, 0) does not raise the ''invalid'' floating-point exception, nor does atan2( y ,    0) raise
-         the ''divide-by-zero'' floating-point exception.
-
-[<a name="p456" href="#p456">page 456</a>] (<a href="#Contents">Contents</a>)
-
-<a name="F.9.1.7" href="#F.9.1.7"><b>    F.9.1.7 The tan functions</b></a>
-1   -- tan((+-)0) returns (+-)0.
-    -- tan((+-)(inf)) returns a NaN and raises the ''invalid'' floating-point exception.
-<a name="F.9.2" href="#F.9.2"><b>    F.9.2 Hyperbolic functions</b></a>
-<a name="F.9.2.1" href="#F.9.2.1"><b>    F.9.2.1 The acosh functions</b></a>
-1   -- acosh(1) returns +0.
-    -- acosh(x) returns a NaN and raises the ''invalid'' floating-point exception for x &lt; 1.
-    -- acosh(+(inf)) returns +(inf).
-<a name="F.9.2.2" href="#F.9.2.2"><b>    F.9.2.2 The asinh functions</b></a>
-1   -- asinh((+-)0) returns (+-)0.
-    -- asinh((+-)(inf)) returns (+-)(inf).
-<a name="F.9.2.3" href="#F.9.2.3"><b>    F.9.2.3 The atanh functions</b></a>
-1   -- atanh((+-)0) returns (+-)0.
-    -- atanh((+-)1) returns (+-)(inf) and raises the ''divide-by-zero'' floating-point exception.
-    -- atanh(x) returns a NaN and raises the ''invalid'' floating-point exception for
-      | x | &gt; 1.
-<a name="F.9.2.4" href="#F.9.2.4"><b>    F.9.2.4 The cosh functions</b></a>
-1   -- cosh((+-)0) returns 1.
-    -- cosh((+-)(inf)) returns +(inf).
-<a name="F.9.2.5" href="#F.9.2.5"><b>    F.9.2.5 The sinh functions</b></a>
-1   -- sinh((+-)0) returns (+-)0.
-    -- sinh((+-)(inf)) returns (+-)(inf).
-<a name="F.9.2.6" href="#F.9.2.6"><b>    F.9.2.6 The tanh functions</b></a>
-1   -- tanh((+-)0) returns (+-)0.
-    -- tanh((+-)(inf)) returns (+-)1.
-
-
-
-
-[<a name="p457" href="#p457">page 457</a>] (<a href="#Contents">Contents</a>)
-
-<a name="F.9.3" href="#F.9.3"><b>    F.9.3 Exponential and logarithmic functions</b></a>
-<a name="F.9.3.1" href="#F.9.3.1"><b>    F.9.3.1 The exp functions</b></a>
-1   -- exp((+-)0) returns 1.
-    -- exp(-(inf)) returns +0.
-    -- exp(+(inf)) returns +(inf).
-<a name="F.9.3.2" href="#F.9.3.2"><b>    F.9.3.2 The exp2 functions</b></a>
-1   -- exp2((+-)0) returns 1.
-    -- exp2(-(inf)) returns +0.
-    -- exp2(+(inf)) returns +(inf).
-<a name="F.9.3.3" href="#F.9.3.3"><b>    F.9.3.3 The expm1 functions</b></a>
-1   -- expm1((+-)0) returns (+-)0.
-    -- expm1(-(inf)) returns -1.
-    -- expm1(+(inf)) returns +(inf).
-<a name="F.9.3.4" href="#F.9.3.4"><b>    F.9.3.4 The frexp functions</b></a>
-1   -- frexp((+-)0, exp) returns (+-)0, and stores 0 in the object pointed to by exp.
-    -- frexp((+-)(inf), exp) returns (+-)(inf), and stores an unspecified value in the object
-      pointed to by exp.
-    -- frexp(NaN, exp) stores an unspecified value in the object pointed to by exp
-      (and returns a NaN).
-2   frexp raises no floating-point exceptions.
-3   On a binary system, the body of the frexp function might be
-           {
-                  *exp = (value == 0) ? 0 : (int)(1 + logb(value));
-                  return scalbn(value, -(*exp));
-           }
-<a name="F.9.3.5" href="#F.9.3.5"><b>    F.9.3.5 The ilogb functions</b></a>
-1   If the correct result is outside the range of the return type, the numeric result is
-    unspecified and the ''invalid'' floating-point exception is raised.
-
-
-
-
-[<a name="p458" href="#p458">page 458</a>] (<a href="#Contents">Contents</a>)
-
-<a name="F.9.3.6" href="#F.9.3.6"><b>    F.9.3.6 The ldexp functions</b></a>
-1   On a binary system, ldexp(x, exp) is equivalent to scalbn(x, exp).
-<a name="F.9.3.7" href="#F.9.3.7"><b>    F.9.3.7 The log functions</b></a>
-1   -- log((+-)0) returns -(inf) and raises the ''divide-by-zero'' floating-point exception.
-    -- log(1) returns +0.
-    -- log(x) returns a NaN and raises the ''invalid'' floating-point exception for x &lt; 0.
-    -- log(+(inf)) returns +(inf).
-<a name="F.9.3.8" href="#F.9.3.8"><b>    F.9.3.8 The log10 functions</b></a>
-1   -- log10((+-)0) returns -(inf) and raises the ''divide-by-zero'' floating-point exception.
-    -- log10(1) returns +0.
-    -- log10(x) returns a NaN and raises the ''invalid'' floating-point exception for x &lt; 0.
-    -- log10(+(inf)) returns +(inf).
-<a name="F.9.3.9" href="#F.9.3.9"><b>    F.9.3.9 The log1p functions</b></a>
-1   -- log1p((+-)0) returns (+-)0.
-    -- log1p(-1) returns -(inf) and raises the ''divide-by-zero'' floating-point exception.
-    -- log1p(x) returns a NaN and raises the ''invalid'' floating-point exception for
-      x &lt; -1.
-    -- log1p(+(inf)) returns +(inf).
-<a name="F.9.3.10" href="#F.9.3.10"><b>    F.9.3.10 The log2 functions</b></a>
-1   -- log2((+-)0) returns -(inf) and raises the ''divide-by-zero'' floating-point exception.
-    -- log2(1) returns +0.
-    -- log2(x) returns a NaN and raises the ''invalid'' floating-point exception for x &lt; 0.
-    -- log2(+(inf)) returns +(inf).
-<a name="F.9.3.11" href="#F.9.3.11"><b>    F.9.3.11 The logb functions</b></a>
-1   -- logb((+-)0) returns -(inf) and raises the ''divide-by-zero'' floating-point exception.
-    -- logb((+-)(inf)) returns +(inf).
-
-
-
-
-[<a name="p459" href="#p459">page 459</a>] (<a href="#Contents">Contents</a>)
-
-<a name="F.9.3.12" href="#F.9.3.12"><b>    F.9.3.12 The modf functions</b></a>
-1   -- modf((+-)x, iptr) returns a result with the same sign as x.
-    -- modf((+-)(inf), iptr) returns (+-)0 and stores (+-)(inf) in the object pointed to by iptr.
-    -- modf(NaN, iptr) stores a NaN in the object pointed to by iptr (and returns a
-      NaN).
-2   modf behaves as though implemented by
-          #include <a href="#7.12">&lt;math.h&gt;</a>
+<h4><a name="A.1.9" href="#A.1.9">A.1.9 Preprocessing numbers</a></h4>
+ (<a href="#6.4.8">6.4.8</a>) pp-number:
+<!--page 421 -->
+<pre>
+               digit
+               . digit
+               pp-number   digit
+               pp-number   identifier-nondigit
+               pp-number   e sign
+               pp-number   E sign
+               pp-number   p sign
+               pp-number   P sign
+               pp-number   .
+</pre>
+
+<h3><a name="A.2" href="#A.2">A.2 Phrase structure grammar</a></h3>
+
+<h4><a name="A.2.1" href="#A.2.1">A.2.1 Expressions</a></h4>
+ (<a href="#6.5.1">6.5.1</a>) primary-expression:
+<pre>
+               identifier
+               constant
+               string-literal
+               ( expression )
+</pre>
+ (<a href="#6.5.2">6.5.2</a>) postfix-expression:
+<pre>
+               primary-expression
+               postfix-expression [ expression ]
+               postfix-expression ( argument-expression-list<sub>opt</sub> )
+               postfix-expression . identifier
+               postfix-expression -&gt; identifier
+               postfix-expression ++
+               postfix-expression --
+               ( type-name ) { initializer-list }
+               ( type-name ) { initializer-list , }
+</pre>
+ (<a href="#6.5.2">6.5.2</a>) argument-expression-list:
+<pre>
+              assignment-expression
+              argument-expression-list , assignment-expression
+</pre>
+ (<a href="#6.5.3">6.5.3</a>) unary-expression:
+<pre>
+               postfix-expression
+               ++ unary-expression
+               -- unary-expression
+               unary-operator cast-expression
+               sizeof unary-expression
+               sizeof ( type-name )
+</pre>
+ (<a href="#6.5.3">6.5.3</a>) unary-operator: one of
+<pre>
+               &amp; * + - ~             !
+</pre>
+ (<a href="#6.5.4">6.5.4</a>) cast-expression:
+<pre>
+                unary-expression
+                ( type-name ) cast-expression
+</pre>
+ (<a href="#6.5.5">6.5.5</a>) multiplicative-expression:
+<!--page 422 -->
+<pre>
+                cast-expression
+                multiplicative-expression * cast-expression
+                multiplicative-expression / cast-expression
+                multiplicative-expression % cast-expression
+</pre>
+ (<a href="#6.5.6">6.5.6</a>) additive-expression:
+<pre>
+                multiplicative-expression
+                additive-expression + multiplicative-expression
+                additive-expression - multiplicative-expression
+</pre>
+ (<a href="#6.5.7">6.5.7</a>) shift-expression:
+<pre>
+                 additive-expression
+                 shift-expression &lt;&lt; additive-expression
+                 shift-expression &gt;&gt; additive-expression
+</pre>
+ (<a href="#6.5.8">6.5.8</a>) relational-expression:
+<pre>
+                shift-expression
+                relational-expression   &lt;    shift-expression
+                relational-expression   &gt;    shift-expression
+                relational-expression   &lt;=   shift-expression
+                relational-expression   &gt;=   shift-expression
+</pre>
+ (<a href="#6.5.9">6.5.9</a>) equality-expression:
+<pre>
+                relational-expression
+                equality-expression == relational-expression
+                equality-expression != relational-expression
+</pre>
+ (<a href="#6.5.10">6.5.10</a>) AND-expression:
+<pre>
+              equality-expression
+              AND-expression &amp; equality-expression
+</pre>
+ (<a href="#6.5.11">6.5.11</a>) exclusive-OR-expression:
+<pre>
+               AND-expression
+               exclusive-OR-expression ^ AND-expression
+</pre>
+ (<a href="#6.5.12">6.5.12</a>) inclusive-OR-expression:
+<pre>
+                exclusive-OR-expression
+                inclusive-OR-expression | exclusive-OR-expression
+</pre>
+ (<a href="#6.5.13">6.5.13</a>) logical-AND-expression:
+<pre>
+               inclusive-OR-expression
+               logical-AND-expression &amp;&amp; inclusive-OR-expression
+</pre>
+ (<a href="#6.5.14">6.5.14</a>) logical-OR-expression:
+<pre>
+               logical-AND-expression
+               logical-OR-expression || logical-AND-expression
+</pre>
+ (<a href="#6.5.15">6.5.15</a>) conditional-expression:
+<!--page 423 -->
+<pre>
+               logical-OR-expression
+               logical-OR-expression ? expression : conditional-expression
+</pre>
+ (<a href="#6.5.16">6.5.16</a>) assignment-expression:
+<pre>
+               conditional-expression
+               unary-expression assignment-operator assignment-expression
+</pre>
+ (<a href="#6.5.16">6.5.16</a>) assignment-operator: one of
+<pre>
+               = *= /= %= +=                -=    &lt;&lt;=    &gt;&gt;=      &amp;=   ^=   |=
+</pre>
+ (<a href="#6.5.17">6.5.17</a>) expression:
+<pre>
+               assignment-expression
+               expression , assignment-expression
+</pre>
+ (<a href="#6.6">6.6</a>) constant-expression:
+<pre>
+               conditional-expression
+</pre>
+
+<h4><a name="A.2.2" href="#A.2.2">A.2.2 Declarations</a></h4>
+ (<a href="#6.7">6.7</a>) declaration:
+<pre>
+                declaration-specifiers init-declarator-list<sub>opt</sub> ;
+</pre>
+ (<a href="#6.7">6.7</a>) declaration-specifiers:
+<pre>
+                storage-class-specifier declaration-specifiers<sub>opt</sub>
+                type-specifier declaration-specifiers<sub>opt</sub>
+                type-qualifier declaration-specifiers<sub>opt</sub>
+                function-specifier declaration-specifiers<sub>opt</sub>
+</pre>
+ (<a href="#6.7">6.7</a>) init-declarator-list:
+<pre>
+                init-declarator
+                init-declarator-list , init-declarator
+</pre>
+ (<a href="#6.7">6.7</a>) init-declarator:
+<pre>
+                declarator
+                declarator = initializer
+</pre>
+ (<a href="#6.7.1">6.7.1</a>) storage-class-specifier:
+<!--page 424 -->
+<pre>
+               typedef
+               extern
+               static
+               auto
+               register
+</pre>
+ (<a href="#6.7.2">6.7.2</a>) type-specifier:
+<pre>
+                void
+                char
+                short
+                int
+                long
+                float
+                double
+                signed
+                unsigned
+                _Bool
+                _Complex
+                struct-or-union-specifier                                                 *
+                enum-specifier
+                typedef-name
+</pre>
+ (<a href="#6.7.2.1">6.7.2.1</a>) struct-or-union-specifier:
+<pre>
+                struct-or-union identifier<sub>opt</sub> { struct-declaration-list }
+                struct-or-union identifier
+</pre>
+ (<a href="#6.7.2.1">6.7.2.1</a>) struct-or-union:
+<pre>
+                struct
+                union
+</pre>
+ (<a href="#6.7.2.1">6.7.2.1</a>) struct-declaration-list:
+<pre>
+                struct-declaration
+                struct-declaration-list struct-declaration
+</pre>
+ (<a href="#6.7.2.1">6.7.2.1</a>) struct-declaration:
+<pre>
+                specifier-qualifier-list struct-declarator-list ;
+</pre>
+ (<a href="#6.7.2.1">6.7.2.1</a>) specifier-qualifier-list:
+<pre>
+                type-specifier specifier-qualifier-list<sub>opt</sub>
+                type-qualifier specifier-qualifier-list<sub>opt</sub>
+</pre>
+ (<a href="#6.7.2.1">6.7.2.1</a>) struct-declarator-list:
+<pre>
+                struct-declarator
+                struct-declarator-list , struct-declarator
+</pre>
+ (<a href="#6.7.2.1">6.7.2.1</a>) struct-declarator:
+<!--page 425 -->
+<pre>
+                declarator
+                declarator<sub>opt</sub> : constant-expression
+</pre>
+ (<a href="#6.7.2.2">6.7.2.2</a>) enum-specifier:
+<pre>
+               enum identifier<sub>opt</sub> { enumerator-list }
+               enum identifier<sub>opt</sub> { enumerator-list , }
+               enum identifier
+</pre>
+ (<a href="#6.7.2.2">6.7.2.2</a>) enumerator-list:
+<pre>
+               enumerator
+               enumerator-list , enumerator
+</pre>
+ (<a href="#6.7.2.2">6.7.2.2</a>) enumerator:
+<pre>
+               enumeration-constant
+               enumeration-constant = constant-expression
+</pre>
+ (<a href="#6.7.3">6.7.3</a>) type-qualifier:
+<pre>
+               const
+               restrict
+               volatile
+</pre>
+ (<a href="#6.7.4">6.7.4</a>) function-specifier:
+<pre>
+                inline
+</pre>
+ (<a href="#6.7.5">6.7.5</a>) declarator:
+<pre>
+               pointer<sub>opt</sub> direct-declarator
+</pre>
+ (<a href="#6.7.5">6.7.5</a>) direct-declarator:
+<pre>
+                identifier
+                ( declarator )
+                direct-declarator [ type-qualifier-list<sub>opt</sub> assignment-expression<sub>opt</sub> ]
+                direct-declarator [ static type-qualifier-list<sub>opt</sub> assignment-expression ]
+                direct-declarator [ type-qualifier-list static assignment-expression ]
+                direct-declarator [ type-qualifier-list<sub>opt</sub> * ]
+                direct-declarator ( parameter-type-list )
+                direct-declarator ( identifier-list<sub>opt</sub> )
+</pre>
+ (<a href="#6.7.5">6.7.5</a>) pointer:
+<pre>
+                * type-qualifier-list<sub>opt</sub>
+                * type-qualifier-list<sub>opt</sub> pointer
+</pre>
+ (<a href="#6.7.5">6.7.5</a>) type-qualifier-list:
+<pre>
+               type-qualifier
+               type-qualifier-list type-qualifier
+</pre>
+ (<a href="#6.7.5">6.7.5</a>) parameter-type-list:
+<!--page 426 -->
+<pre>
+              parameter-list
+              parameter-list , ...
+</pre>
+ (<a href="#6.7.5">6.7.5</a>) parameter-list:
+<pre>
+              parameter-declaration
+              parameter-list , parameter-declaration
+</pre>
+ (<a href="#6.7.5">6.7.5</a>) parameter-declaration:
+<pre>
+              declaration-specifiers declarator
+              declaration-specifiers abstract-declarator<sub>opt</sub>
+</pre>
+ (<a href="#6.7.5">6.7.5</a>) identifier-list:
+<pre>
+                identifier
+                identifier-list , identifier
+</pre>
+ (<a href="#6.7.6">6.7.6</a>) type-name:
+<pre>
+               specifier-qualifier-list abstract-declarator<sub>opt</sub>
+</pre>
+ (<a href="#6.7.6">6.7.6</a>) abstract-declarator:
+<pre>
+               pointer
+               pointer<sub>opt</sub> direct-abstract-declarator
+</pre>
+ (<a href="#6.7.6">6.7.6</a>) direct-abstract-declarator:
+<pre>
+                ( abstract-declarator )
+                direct-abstract-declarator<sub>opt</sub> [ type-qualifier-list<sub>opt</sub>
+                               assignment-expression<sub>opt</sub> ]
+                direct-abstract-declarator<sub>opt</sub> [ static type-qualifier-list<sub>opt</sub>
+                               assignment-expression ]
+                direct-abstract-declarator<sub>opt</sub> [ type-qualifier-list static
+                               assignment-expression ]
+                direct-abstract-declarator<sub>opt</sub> [ * ]
+                direct-abstract-declarator<sub>opt</sub> ( parameter-type-list<sub>opt</sub> )
+</pre>
+ (<a href="#6.7.7">6.7.7</a>) typedef-name:
+<pre>
+               identifier
+</pre>
+ (<a href="#6.7.8">6.7.8</a>) initializer:
+<pre>
+                 assignment-expression
+                 { initializer-list }
+                 { initializer-list , }
+</pre>
+ (<a href="#6.7.8">6.7.8</a>) initializer-list:
+<pre>
+                 designation<sub>opt</sub> initializer
+                 initializer-list , designation<sub>opt</sub> initializer
+</pre>
+ (<a href="#6.7.8">6.7.8</a>) designation:
+<!--page 427 -->
+<pre>
+               designator-list =
+</pre>
+ (<a href="#6.7.8">6.7.8</a>) designator-list:
+<pre>
+               designator
+               designator-list designator
+</pre>
+ (<a href="#6.7.8">6.7.8</a>) designator:
+<pre>
+               [ constant-expression ]
+               . identifier
+</pre>
+
+<h4><a name="A.2.3" href="#A.2.3">A.2.3 Statements</a></h4>
+ (<a href="#6.8">6.8</a>) statement:
+<pre>
+               labeled-statement
+               compound-statement
+               expression-statement
+               selection-statement
+               iteration-statement
+               jump-statement
+</pre>
+ (<a href="#6.8.1">6.8.1</a>) labeled-statement:
+<pre>
+                identifier : statement
+                case constant-expression : statement
+                default : statement
+</pre>
+ (<a href="#6.8.2">6.8.2</a>) compound-statement:
+<pre>
+              { block-item-list<sub>opt</sub> }
+</pre>
+ (<a href="#6.8.2">6.8.2</a>) block-item-list:
+<pre>
+                block-item
+                block-item-list block-item
+</pre>
+ (<a href="#6.8.2">6.8.2</a>) block-item:
+<pre>
+                declaration
+                statement
+</pre>
+ (<a href="#6.8.3">6.8.3</a>) expression-statement:
+<pre>
+               expression<sub>opt</sub> ;
+</pre>
+ (<a href="#6.8.4">6.8.4</a>) selection-statement:
+<!--page 428 -->
+<pre>
+                if ( expression ) statement
+                if ( expression ) statement else statement
+                switch ( expression ) statement
+</pre>
+ (<a href="#6.8.5">6.8.5</a>) iteration-statement:
+<pre>
+                 while ( expression ) statement
+                 do statement while ( expression ) ;
+                 for ( expression<sub>opt</sub> ; expression<sub>opt</sub> ; expression<sub>opt</sub> ) statement
+                 for ( declaration expression<sub>opt</sub> ; expression<sub>opt</sub> ) statement
+</pre>
+ (<a href="#6.8.6">6.8.6</a>) jump-statement:
+<pre>
+               goto identifier ;
+               continue ;
+               break ;
+               return expression<sub>opt</sub> ;
+</pre>
+
+<h4><a name="A.2.4" href="#A.2.4">A.2.4 External definitions</a></h4>
+ (<a href="#6.9">6.9</a>) translation-unit:
+<pre>
+                external-declaration
+                translation-unit external-declaration
+</pre>
+ (<a href="#6.9">6.9</a>) external-declaration:
+<pre>
+                function-definition
+                declaration
+</pre>
+ (<a href="#6.9.1">6.9.1</a>) function-definition:
+<pre>
+                declaration-specifiers declarator declaration-list<sub>opt</sub> compound-statement
+</pre>
+ (<a href="#6.9.1">6.9.1</a>) declaration-list:
+<pre>
+               declaration
+               declaration-list declaration
+</pre>
+
+<h3><a name="A.3" href="#A.3">A.3 Preprocessing directives</a></h3>
+ (<a href="#6.10">6.10</a>) preprocessing-file:
+<pre>
+               group<sub>opt</sub>
+</pre>
+ (<a href="#6.10">6.10</a>) group:
+<pre>
+                 group-part
+                 group group-part
+</pre>
+ (<a href="#6.10">6.10</a>) group-part:
+<pre>
+               if-section
+               control-line
+               text-line
+               # non-directive
+</pre>
+ (<a href="#6.10">6.10</a>) if-section:
+<!--page 429 -->
+<pre>
+                 if-group elif-groups<sub>opt</sub> else-group<sub>opt</sub> endif-line
+</pre>
+ (<a href="#6.10">6.10</a>) if-group:
+<pre>
+                # if     constant-expression new-line group<sub>opt</sub>
+                # ifdef identifier new-line group<sub>opt</sub>
+                # ifndef identifier new-line group<sub>opt</sub>
+</pre>
+ (<a href="#6.10">6.10</a>) elif-groups:
+<pre>
+                elif-group
+                elif-groups elif-group
+</pre>
+ (<a href="#6.10">6.10</a>) elif-group:
+<pre>
+                # elif        constant-expression new-line group<sub>opt</sub>
+</pre>
+ (<a href="#6.10">6.10</a>) else-group:
+<pre>
+                # else        new-line group<sub>opt</sub>
+</pre>
+ (<a href="#6.10">6.10</a>) endif-line:
+<pre>
+                # endif       new-line
+</pre>
+ (<a href="#6.10">6.10</a>) control-line:
+<pre>
+               # include pp-tokens new-line
+               # define identifier replacement-list new-line
+               # define identifier lparen identifier-list<sub>opt</sub> )
+                                               replacement-list new-line
+               # define identifier lparen ... ) replacement-list new-line
+               # define identifier lparen identifier-list , ... )
+                                               replacement-list new-line
+               # undef   identifier new-line
+               # line    pp-tokens new-line
+               # error   pp-tokens<sub>opt</sub> new-line
+               # pragma pp-tokens<sub>opt</sub> new-line
+               #         new-line
+</pre>
+ (<a href="#6.10">6.10</a>) text-line:
+<pre>
+                pp-tokens<sub>opt</sub> new-line
+</pre>
+ (<a href="#6.10">6.10</a>) non-directive:
+<pre>
+               pp-tokens new-line
+</pre>
+ (<a href="#6.10">6.10</a>) lparen:
+<pre>
+                  a ( character not immediately preceded by white-space
+</pre>
+ (<a href="#6.10">6.10</a>) replacement-list:
+<!--page 430 -->
+<pre>
+               pp-tokens<sub>opt</sub>
+</pre>
+ (<a href="#6.10">6.10</a>) pp-tokens:
+<pre>
+               preprocessing-token
+               pp-tokens preprocessing-token
+</pre>
+ (<a href="#6.10">6.10</a>) new-line:
+<!--page 431 -->
+<pre>
+               the new-line character
+</pre>
+
+<h2><a name="B" href="#B">Annex B</a></h2>
+<pre>
+                               (informative)
+                           Library summary
+</pre>
+
+<h3><a name="B.1" href="#B.1">B.1 Diagnostics &lt;assert.h&gt;</a></h3>
+<pre>
+        NDEBUG
+        void assert(scalar expression);
+</pre>
+
+<h3><a name="B.2" href="#B.2">B.2 Complex &lt;complex.h&gt;</a></h3>
+<!--page 432 -->
+<!--page 433 -->
+<pre>
+        complex               imaginary               I
+        _Complex_I            _Imaginary_I
+        #pragma STDC CX_LIMITED_RANGE on-off-switch
+        double complex cacos(double complex z);
+        float complex cacosf(float complex z);
+        long double complex cacosl(long double complex z);
+        double complex casin(double complex z);
+        float complex casinf(float complex z);
+        long double complex casinl(long double complex z);
+        double complex catan(double complex z);
+        float complex catanf(float complex z);
+        long double complex catanl(long double complex z);
+        double complex ccos(double complex z);
+        float complex ccosf(float complex z);
+        long double complex ccosl(long double complex z);
+        double complex csin(double complex z);
+        float complex csinf(float complex z);
+        long double complex csinl(long double complex z);
+        double complex ctan(double complex z);
+        float complex ctanf(float complex z);
+        long double complex ctanl(long double complex z);
+        double complex cacosh(double complex z);
+        float complex cacoshf(float complex z);
+        long double complex cacoshl(long double complex z);
+        double complex casinh(double complex z);
+        float complex casinhf(float complex z);
+        long double complex casinhl(long double complex z);
+        double complex catanh(double complex z);
+        float complex catanhf(float complex z);
+        long double complex catanhl(long double complex z);
+       double complex ccosh(double complex z);
+       float complex ccoshf(float complex z);
+       long double complex ccoshl(long double complex z);
+       double complex csinh(double complex z);
+       float complex csinhf(float complex z);
+       long double complex csinhl(long double complex z);
+       double complex ctanh(double complex z);
+       float complex ctanhf(float complex z);
+       long double complex ctanhl(long double complex z);
+       double complex cexp(double complex z);
+       float complex cexpf(float complex z);
+       long double complex cexpl(long double complex z);
+       double complex clog(double complex z);
+       float complex clogf(float complex z);
+       long double complex clogl(long double complex z);
+       double cabs(double complex z);
+       float cabsf(float complex z);
+       long double cabsl(long double complex z);
+       double complex cpow(double complex x, double complex y);
+       float complex cpowf(float complex x, float complex y);
+       long double complex cpowl(long double complex x,
+            long double complex y);
+       double complex csqrt(double complex z);
+       float complex csqrtf(float complex z);
+       long double complex csqrtl(long double complex z);
+       double carg(double complex z);
+       float cargf(float complex z);
+       long double cargl(long double complex z);
+       double cimag(double complex z);
+       float cimagf(float complex z);
+       long double cimagl(long double complex z);
+       double complex conj(double complex z);
+       float complex conjf(float complex z);
+       long double complex conjl(long double complex z);
+       double complex cproj(double complex z);
+       float complex cprojf(float complex z);
+       long double complex cprojl(long double complex z);
+       double creal(double complex z);
+       float crealf(float complex z);
+       long double creall(long double complex z);
+</pre>
+
+<h3><a name="B.3" href="#B.3">B.3 Character handling &lt;ctype.h&gt;</a></h3>
+<pre>
+        int    isalnum(int c);
+        int    isalpha(int c);
+        int    isblank(int c);
+        int    iscntrl(int c);
+        int    isdigit(int c);
+        int    isgraph(int c);
+        int    islower(int c);
+        int    isprint(int c);
+        int    ispunct(int c);
+        int    isspace(int c);
+        int    isupper(int c);
+        int    isxdigit(int c);
+        int    tolower(int c);
+        int    toupper(int c);
+</pre>
+
+<h3><a name="B.4" href="#B.4">B.4 Errors &lt;errno.h&gt;</a></h3>
+<pre>
+        EDOM            EILSEQ             ERANGE            errno
+</pre>
+
+<h3><a name="B.5" href="#B.5">B.5 Floating-point environment &lt;fenv.h&gt;</a></h3>
+<!--page 434 -->
+<pre>
+        fenv_t                 FE_OVERFLOW             FE_TOWARDZERO
+        fexcept_t              FE_UNDERFLOW            FE_UPWARD
+        FE_DIVBYZERO           FE_ALL_EXCEPT           FE_DFL_ENV
+        FE_INEXACT             FE_DOWNWARD
+        FE_INVALID             FE_TONEAREST
+        #pragma STDC FENV_ACCESS on-off-switch
+        int feclearexcept(int excepts);
+        int fegetexceptflag(fexcept_t *flagp, int excepts);
+        int feraiseexcept(int excepts);
+        int fesetexceptflag(const fexcept_t *flagp,
+             int excepts);
+        int fetestexcept(int excepts);
+        int fegetround(void);
+        int fesetround(int round);
+        int fegetenv(fenv_t *envp);
+        int feholdexcept(fenv_t *envp);
+        int fesetenv(const fenv_t *envp);
+        int feupdateenv(const fenv_t *envp);
+</pre>
+
+<h3><a name="B.6" href="#B.6">B.6 Characteristics of floating types &lt;float.h&gt;</a></h3>
+<pre>
+       FLT_ROUNDS              DBL_MIN_EXP             FLT_MAX
+       FLT_EVAL_METHOD         LDBL_MIN_EXP            DBL_MAX
+       FLT_RADIX               FLT_MIN_10_EXP          LDBL_MAX
+       FLT_MANT_DIG            DBL_MIN_10_EXP          FLT_EPSILON
+       DBL_MANT_DIG            LDBL_MIN_10_EXP         DBL_EPSILON
+       LDBL_MANT_DIG           FLT_MAX_EXP             LDBL_EPSILON
+       DECIMAL_DIG             DBL_MAX_EXP             FLT_MIN
+       FLT_DIG                 LDBL_MAX_EXP            DBL_MIN
+       DBL_DIG                 FLT_MAX_10_EXP          LDBL_MIN
+       LDBL_DIG                DBL_MAX_10_EXP
+       FLT_MIN_EXP             LDBL_MAX_10_EXP
+</pre>
+
+<h3><a name="B.7" href="#B.7">B.7 Format conversion of integer types &lt;inttypes.h&gt;</a></h3>
+<!--page 435 -->
+<pre>
+       imaxdiv_t
+       PRIdN        PRIdLEASTN        PRIdFASTN        PRIdMAX     PRIdPTR
+       PRIiN        PRIiLEASTN        PRIiFASTN        PRIiMAX     PRIiPTR
+       PRIoN        PRIoLEASTN        PRIoFASTN        PRIoMAX     PRIoPTR
+       PRIuN        PRIuLEASTN        PRIuFASTN        PRIuMAX     PRIuPTR
+       PRIxN        PRIxLEASTN        PRIxFASTN        PRIxMAX     PRIxPTR
+       PRIXN        PRIXLEASTN        PRIXFASTN        PRIXMAX     PRIXPTR
+       SCNdN        SCNdLEASTN        SCNdFASTN        SCNdMAX     SCNdPTR
+       SCNiN        SCNiLEASTN        SCNiFASTN        SCNiMAX     SCNiPTR
+       SCNoN        SCNoLEASTN        SCNoFASTN        SCNoMAX     SCNoPTR
+       SCNuN        SCNuLEASTN        SCNuFASTN        SCNuMAX     SCNuPTR
+       SCNxN        SCNxLEASTN        SCNxFASTN        SCNxMAX     SCNxPTR
+       intmax_t imaxabs(intmax_t j);
+       imaxdiv_t imaxdiv(intmax_t numer, intmax_t denom);
+       intmax_t strtoimax(const char * restrict nptr,
+               char ** restrict endptr, int base);
+       uintmax_t strtoumax(const char * restrict nptr,
+               char ** restrict endptr, int base);
+       intmax_t wcstoimax(const wchar_t * restrict nptr,
+               wchar_t ** restrict endptr, int base);
+       uintmax_t wcstoumax(const wchar_t * restrict nptr,
+               wchar_t ** restrict endptr, int base);
+</pre>
+
+<h3><a name="B.8" href="#B.8">B.8 Alternative spellings &lt;iso646.h&gt;</a></h3>
+<pre>
+      and             bitor             not_eq            xor
+      and_eq          compl             or                xor_eq
+      bitand          not               or_eq
+</pre>
+
+<h3><a name="B.9" href="#B.9">B.9 Sizes of integer types &lt;limits.h&gt;</a></h3>
+<pre>
+      CHAR_BIT        CHAR_MAX          INT_MIN           ULONG_MAX
+      SCHAR_MIN       MB_LEN_MAX        INT_MAX           LLONG_MIN
+      SCHAR_MAX       SHRT_MIN          UINT_MAX          LLONG_MAX
+      UCHAR_MAX       SHRT_MAX          LONG_MIN          ULLONG_MAX
+      CHAR_MIN        USHRT_MAX         LONG_MAX
+</pre>
+
+<h3><a name="B.10" href="#B.10">B.10 Localization &lt;locale.h&gt;</a></h3>
+<pre>
+      struct lconv    LC_ALL            LC_CTYPE          LC_NUMERIC
+      NULL            LC_COLLATE        LC_MONETARY       LC_TIME
+      char *setlocale(int category, const char *locale);
+      struct lconv *localeconv(void);
+</pre>
+
+<h3><a name="B.11" href="#B.11">B.11 Mathematics &lt;math.h&gt;</a></h3>
+<!--page 436 -->
+<!--page 437 -->
+<!--page 438 -->
+<!--page 439 -->
+<!--page 440 -->
+<pre>
+      float_t               FP_INFINITE             FP_FAST_FMAL
+      double_t              FP_NAN                  FP_ILOGB0
+      HUGE_VAL              FP_NORMAL               FP_ILOGBNAN
+      HUGE_VALF             FP_SUBNORMAL            MATH_ERRNO
+      HUGE_VALL             FP_ZERO                 MATH_ERREXCEPT
+      INFINITY              FP_FAST_FMA             math_errhandling
+      NAN                   FP_FAST_FMAF
+       #pragma STDC FP_CONTRACT on-off-switch
+       int fpclassify(real-floating x);
+       int isfinite(real-floating x);
+       int isinf(real-floating x);
+       int isnan(real-floating x);
+       int isnormal(real-floating x);
+       int signbit(real-floating x);
+       double acos(double x);
+       float acosf(float x);
+       long double acosl(long double x);
+       double asin(double x);
+       float asinf(float x);
+       long double asinl(long double x);
+       double atan(double x);
+       float atanf(float x);
+       long double atanl(long double x);
+       double atan2(double y, double x);
+       float atan2f(float y, float x);
+       long double atan2l(long double y, long double x);
+       double cos(double x);
+       float cosf(float x);
+       long double cosl(long double x);
+       double sin(double x);
+       float sinf(float x);
+       long double sinl(long double x);
+       double tan(double x);
+       float tanf(float x);
+       long double tanl(long double x);
+       double acosh(double x);
+       float acoshf(float x);
+       long double acoshl(long double x);
+       double asinh(double x);
+       float asinhf(float x);
+       long double asinhl(long double x);
+       double atanh(double x);
+       float atanhf(float x);
+       long double atanhl(long double x);
+       double cosh(double x);
+       float coshf(float x);
+       long double coshl(long double x);
+       double sinh(double x);
+       float sinhf(float x);
+       long double sinhl(long double x);
+       double tanh(double x);
+       float tanhf(float x);
+       long double tanhl(long double x);
+       double exp(double x);
+       float expf(float x);
+       long double expl(long double x);
+       double exp2(double x);
+       float exp2f(float x);
+       long double exp2l(long double x);
+       double expm1(double x);
+       float expm1f(float x);
+       long double expm1l(long double x);
+         double frexp(double value, int *exp);
+         float frexpf(float value, int *exp);
+         long double frexpl(long double value, int *exp);
+         int ilogb(double x);
+         int ilogbf(float x);
+         int ilogbl(long double x);
+         double ldexp(double x, int exp);
+         float ldexpf(float x, int exp);
+         long double ldexpl(long double x, int exp);
+         double log(double x);
+         float logf(float x);
+         long double logl(long double x);
+         double log10(double x);
+         float log10f(float x);
+         long double log10l(long double x);
+         double log1p(double x);
+         float log1pf(float x);
+         long double log1pl(long double x);
+         double log2(double x);
+         float log2f(float x);
+         long double log2l(long double x);
+         double logb(double x);
+         float logbf(float x);
+         long double logbl(long double x);
+         double modf(double value, double *iptr);
+         float modff(float value, float *iptr);
+         long double modfl(long double value, long double *iptr);
+         double scalbn(double x, int n);
+         float scalbnf(float x, int n);
+         long double scalbnl(long double x, int n);
+         double scalbln(double x, long int n);
+         float scalblnf(float x, long int n);
+         long double scalblnl(long double x, long int n);
+         double cbrt(double x);
+         float cbrtf(float x);
+         long double cbrtl(long double x);
+         double fabs(double x);
+         float fabsf(float x);
+         long double fabsl(long double x);
+         double hypot(double x, double y);
+         float hypotf(float x, float y);
+       long double hypotl(long double x, long double y);
+       double pow(double x, double y);
+       float powf(float x, float y);
+       long double powl(long double x, long double y);
+       double sqrt(double x);
+       float sqrtf(float x);
+       long double sqrtl(long double x);
+       double erf(double x);
+       float erff(float x);
+       long double erfl(long double x);
+       double erfc(double x);
+       float erfcf(float x);
+       long double erfcl(long double x);
+       double lgamma(double x);
+       float lgammaf(float x);
+       long double lgammal(long double x);
+       double tgamma(double x);
+       float tgammaf(float x);
+       long double tgammal(long double x);
+       double ceil(double x);
+       float ceilf(float x);
+       long double ceill(long double x);
+       double floor(double x);
+       float floorf(float x);
+       long double floorl(long double x);
+       double nearbyint(double x);
+       float nearbyintf(float x);
+       long double nearbyintl(long double x);
+       double rint(double x);
+       float rintf(float x);
+       long double rintl(long double x);
+       long int lrint(double x);
+       long int lrintf(float x);
+       long int lrintl(long double x);
+       long long int llrint(double x);
+       long long int llrintf(float x);
+       long long int llrintl(long double x);
+       double round(double x);
+       float roundf(float x);
+       long double roundl(long double x);
+       long int lround(double x);
+         long int lroundf(float x);
+         long int lroundl(long double x);
+         long long int llround(double x);
+         long long int llroundf(float x);
+         long long int llroundl(long double x);
+         double trunc(double x);
+         float truncf(float x);
+         long double truncl(long double x);
+         double fmod(double x, double y);
+         float fmodf(float x, float y);
+         long double fmodl(long double x, long double y);
+         double remainder(double x, double y);
+         float remainderf(float x, float y);
+         long double remainderl(long double x, long double y);
+         double remquo(double x, double y, int *quo);
+         float remquof(float x, float y, int *quo);
+         long double remquol(long double x, long double y,
+              int *quo);
+         double copysign(double x, double y);
+         float copysignf(float x, float y);
+         long double copysignl(long double x, long double y);
+         double nan(const char *tagp);
+         float nanf(const char *tagp);
+         long double nanl(const char *tagp);
+         double nextafter(double x, double y);
+         float nextafterf(float x, float y);
+         long double nextafterl(long double x, long double y);
+         double nexttoward(double x, long double y);
+         float nexttowardf(float x, long double y);
+         long double nexttowardl(long double x, long double y);
+         double fdim(double x, double y);
+         float fdimf(float x, float y);
+         long double fdiml(long double x, long double y);
+         double fmax(double x, double y);
+         float fmaxf(float x, float y);
+         long double fmaxl(long double x, long double y);
+         double fmin(double x, double y);
+         float fminf(float x, float y);
+         long double fminl(long double x, long double y);
+         double fma(double x, double y, double z);
+         float fmaf(float x, float y, float z);
+       long double fmal(long double x, long double y,
+            long double z);
+       int isgreater(real-floating x, real-floating y);
+       int isgreaterequal(real-floating x, real-floating y);
+       int isless(real-floating x, real-floating y);
+       int islessequal(real-floating x, real-floating y);
+       int islessgreater(real-floating x, real-floating y);
+       int isunordered(real-floating x, real-floating y);
+</pre>
+
+<h3><a name="B.12" href="#B.12">B.12 Nonlocal jumps &lt;setjmp.h&gt;</a></h3>
+<pre>
+       jmp_buf
+       int setjmp(jmp_buf env);
+       void longjmp(jmp_buf env, int val);
+</pre>
+
+<h3><a name="B.13" href="#B.13">B.13 Signal handling &lt;signal.h&gt;</a></h3>
+<pre>
+       sig_atomic_t   SIG_IGN            SIGILL            SIGTERM
+       SIG_DFL        SIGABRT            SIGINT
+       SIG_ERR        SIGFPE             SIGSEGV
+       void (*signal(int sig, void (*func)(int)))(int);
+       int raise(int sig);
+</pre>
+
+<h3><a name="B.14" href="#B.14">B.14 Variable arguments &lt;stdarg.h&gt;</a></h3>
+<pre>
+       va_list
+       type va_arg(va_list ap, type);
+       void va_copy(va_list dest, va_list src);
+       void va_end(va_list ap);
+       void va_start(va_list ap, parmN);
+</pre>
+
+<h3><a name="B.15" href="#B.15">B.15 Boolean type and values &lt;stdbool.h&gt;</a></h3>
+<!--page 441 -->
+<pre>
+       bool
+       true
+       false
+       __bool_true_false_are_defined
+</pre>
+
+<h3><a name="B.16" href="#B.16">B.16 Common definitions &lt;stddef.h&gt;</a></h3>
+<pre>
+         ptrdiff_t       size_t            wchar_t           NULL
+         offsetof(type, member-designator)
+</pre>
+
+<h3><a name="B.17" href="#B.17">B.17 Integer types &lt;stdint.h&gt;</a></h3>
+<pre>
+         intN_t                INT_LEASTN_MIN          PTRDIFF_MAX
+         uintN_t               INT_LEASTN_MAX          SIG_ATOMIC_MIN
+         int_leastN_t          UINT_LEASTN_MAX         SIG_ATOMIC_MAX
+         uint_leastN_t         INT_FASTN_MIN           SIZE_MAX
+         int_fastN_t           INT_FASTN_MAX           WCHAR_MIN
+         uint_fastN_t          UINT_FASTN_MAX          WCHAR_MAX
+         intptr_t              INTPTR_MIN              WINT_MIN
+         uintptr_t             INTPTR_MAX              WINT_MAX
+         intmax_t              UINTPTR_MAX             INTN_C(value)
+         uintmax_t             INTMAX_MIN              UINTN_C(value)
+         INTN_MIN              INTMAX_MAX              INTMAX_C(value)
+         INTN_MAX              UINTMAX_MAX             UINTMAX_C(value)
+         UINTN_MAX             PTRDIFF_MIN
+</pre>
+
+<h3><a name="B.18" href="#B.18">B.18 Input/output &lt;stdio.h&gt;</a></h3>
+<!--page 442 -->
+<!--page 443 -->
+<pre>
+         size_t          _IOLBF            FILENAME_MAX      TMP_MAX
+         FILE            _IONBF            L_tmpnam          stderr
+         fpos_t          BUFSIZ            SEEK_CUR          stdin
+         NULL            EOF               SEEK_END          stdout
+         _IOFBF          FOPEN_MAX         SEEK_SET
+         int remove(const char *filename);
+         int rename(const char *old, const char *new);
+         FILE *tmpfile(void);
+         char *tmpnam(char *s);
+         int fclose(FILE *stream);
+         int fflush(FILE *stream);
+         FILE *fopen(const char * restrict filename,
+              const char * restrict mode);
+         FILE *freopen(const char * restrict filename,
+              const char * restrict mode,
+              FILE * restrict stream);
+         void setbuf(FILE * restrict stream,
+              char * restrict buf);
+       int setvbuf(FILE * restrict stream,
+            char * restrict buf,
+            int mode, size_t size);
+       int fprintf(FILE * restrict stream,
+            const char * restrict format, ...);
+       int fscanf(FILE * restrict stream,
+            const char * restrict format, ...);
+       int printf(const char * restrict format, ...);
+       int scanf(const char * restrict format, ...);
+       int snprintf(char * restrict s, size_t n,
+            const char * restrict format, ...);
+       int sprintf(char * restrict s,
+            const char * restrict format, ...);
+       int sscanf(const char * restrict s,
+            const char * restrict format, ...);
+       int vfprintf(FILE * restrict stream,
+            const char * restrict format, va_list arg);
+       int vfscanf(FILE * restrict stream,
+            const char * restrict format, va_list arg);
+       int vprintf(const char * restrict format, va_list arg);
+       int vscanf(const char * restrict format, va_list arg);
+       int vsnprintf(char * restrict s, size_t n,
+            const char * restrict format, va_list arg);
+       int vsprintf(char * restrict s,
+            const char * restrict format, va_list arg);
+       int vsscanf(const char * restrict s,
+            const char * restrict format, va_list arg);
+       int fgetc(FILE *stream);
+       char *fgets(char * restrict s, int n,
+            FILE * restrict stream);
+       int fputc(int c, FILE *stream);
+       int fputs(const char * restrict s,
+            FILE * restrict stream);
+       int getc(FILE *stream);
+       int getchar(void);
+       char *gets(char *s);
+       int putc(int c, FILE *stream);
+       int putchar(int c);
+       int puts(const char *s);
+       int ungetc(int c, FILE *stream);
+         size_t fread(void * restrict ptr,
+              size_t size, size_t nmemb,
+              FILE * restrict stream);
+         size_t fwrite(const void * restrict ptr,
+              size_t size, size_t nmemb,
+              FILE * restrict stream);
+         int fgetpos(FILE * restrict stream,
+              fpos_t * restrict pos);
+         int fseek(FILE *stream, long int offset, int whence);
+         int fsetpos(FILE *stream, const fpos_t *pos);
+         long int ftell(FILE *stream);
+         void rewind(FILE *stream);
+         void clearerr(FILE *stream);
+         int feof(FILE *stream);
+         int ferror(FILE *stream);
+         void perror(const char *s);
+</pre>
+
+<h3><a name="B.19" href="#B.19">B.19 General utilities &lt;stdlib.h&gt;</a></h3>
+<!--page 444 -->
+<!--page 445 -->
+<pre>
+         size_t       ldiv_t             EXIT_FAILURE      MB_CUR_MAX
+         wchar_t      lldiv_t            EXIT_SUCCESS
+         div_t        NULL               RAND_MAX
+         double atof(const char *nptr);
+         int atoi(const char *nptr);
+         long int atol(const char *nptr);
+         long long int atoll(const char *nptr);
+         double strtod(const char * restrict nptr,
+              char ** restrict endptr);
+         float strtof(const char * restrict nptr,
+              char ** restrict endptr);
+         long double strtold(const char * restrict nptr,
+              char ** restrict endptr);
+         long int strtol(const char * restrict nptr,
+              char ** restrict endptr, int base);
+         long long int strtoll(const char * restrict nptr,
+              char ** restrict endptr, int base);
+         unsigned long int strtoul(
+              const char * restrict nptr,
+              char ** restrict endptr, int base);
+       unsigned long long int strtoull(
+            const char * restrict nptr,
+            char ** restrict endptr, int base);
+       int rand(void);
+       void srand(unsigned int seed);
+       void *calloc(size_t nmemb, size_t size);
+       void free(void *ptr);
+       void *malloc(size_t size);
+       void *realloc(void *ptr, size_t size);
+       void abort(void);
+       int atexit(void (*func)(void));
+       void exit(int status);
+       void _Exit(int status);
+       char *getenv(const char *name);
+       int system(const char *string);
+       void *bsearch(const void *key, const void *base,
+            size_t nmemb, size_t size,
+            int (*compar)(const void *, const void *));
+       void qsort(void *base, size_t nmemb, size_t size,
+            int (*compar)(const void *, const void *));
+       int abs(int j);
+       long int labs(long int j);
+       long long int llabs(long long int j);
+       div_t div(int numer, int denom);
+       ldiv_t ldiv(long int numer, long int denom);
+       lldiv_t lldiv(long long int numer,
+            long long int denom);
+       int mblen(const char *s, size_t n);
+       int mbtowc(wchar_t * restrict pwc,
+            const char * restrict s, size_t n);
+       int wctomb(char *s, wchar_t wchar);
+       size_t mbstowcs(wchar_t * restrict pwcs,
+            const char * restrict s, size_t n);
+       size_t wcstombs(char * restrict s,
+            const wchar_t * restrict pwcs, size_t n);
+</pre>
+
+<h3><a name="B.20" href="#B.20">B.20 String handling &lt;string.h&gt;</a></h3>
+<!--page 446 -->
+<pre>
+         size_t
+         NULL
+         void *memcpy(void * restrict s1,
+              const void * restrict s2, size_t n);
+         void *memmove(void *s1, const void *s2, size_t n);
+         char *strcpy(char * restrict s1,
+              const char * restrict s2);
+         char *strncpy(char * restrict s1,
+              const char * restrict s2, size_t n);
+         char *strcat(char * restrict s1,
+              const char * restrict s2);
+         char *strncat(char * restrict s1,
+              const char * restrict s2, size_t n);
+         int memcmp(const void *s1, const void *s2, size_t n);
+         int strcmp(const char *s1, const char *s2);
+         int strcoll(const char *s1, const char *s2);
+         int strncmp(const char *s1, const char *s2, size_t n);
+         size_t strxfrm(char * restrict s1,
+              const char * restrict s2, size_t n);
+         void *memchr(const void *s, int c, size_t n);
+         char *strchr(const char *s, int c);
+         size_t strcspn(const char *s1, const char *s2);
+         char *strpbrk(const char *s1, const char *s2);
+         char *strrchr(const char *s, int c);
+         size_t strspn(const char *s1, const char *s2);
+         char *strstr(const char *s1, const char *s2);
+         char *strtok(char * restrict s1,
+              const char * restrict s2);
+         void *memset(void *s, int c, size_t n);
+         char *strerror(int errnum);
+         size_t strlen(const char *s);
+</pre>
+
+<h3><a name="B.21" href="#B.21">B.21 Type-generic math &lt;tgmath.h&gt;</a></h3>
+<pre>
+       acos           sqrt               fmod              nextafter
+       asin           fabs               frexp             nexttoward
+       atan           atan2              hypot             remainder
+       acosh          cbrt               ilogb             remquo
+       asinh          ceil               ldexp             rint
+       atanh          copysign           lgamma            round
+       cos            erf                llrint            scalbn
+       sin            erfc               llround           scalbln
+       tan            exp2               log10             tgamma
+       cosh           expm1              log1p             trunc
+       sinh           fdim               log2              carg
+       tanh           floor              logb              cimag
+       exp            fma                lrint             conj
+       log            fmax               lround            cproj
+       pow            fmin               nearbyint         creal
+</pre>
+
+<h3><a name="B.22" href="#B.22">B.22 Date and time &lt;time.h&gt;</a></h3>
+<!--page 447 -->
+<pre>
+       NULL                  size_t                  time_t
+       CLOCKS_PER_SEC        clock_t                 struct tm
+       clock_t clock(void);
+       double difftime(time_t time1, time_t time0);
+       time_t mktime(struct tm *timeptr);
+       time_t time(time_t *timer);
+       char *asctime(const struct tm *timeptr);
+       char *ctime(const time_t *timer);
+       struct tm *gmtime(const time_t *timer);
+       struct tm *localtime(const time_t *timer);
+       size_t strftime(char * restrict s,
+            size_t maxsize,
+            const char * restrict format,
+            const struct tm * restrict timeptr);
+</pre>
+
+<h3><a name="B.23" href="#B.23">B.23 Extended multibyte/wide character utilities &lt;wchar.h&gt;</a></h3>
+<!--page 448 -->
+<!--page 449 -->
+<pre>
+         wchar_t       wint_t             WCHAR_MAX
+         size_t        struct tm          WCHAR_MIN
+         mbstate_t     NULL               WEOF
+         int fwprintf(FILE * restrict stream,
+              const wchar_t * restrict format, ...);
+         int fwscanf(FILE * restrict stream,
+              const wchar_t * restrict format, ...);
+         int swprintf(wchar_t * restrict s, size_t n,
+              const wchar_t * restrict format, ...);
+         int swscanf(const wchar_t * restrict s,
+              const wchar_t * restrict format, ...);
+         int vfwprintf(FILE * restrict stream,
+              const wchar_t * restrict format, va_list arg);
+         int vfwscanf(FILE * restrict stream,
+              const wchar_t * restrict format, va_list arg);
+         int vswprintf(wchar_t * restrict s, size_t n,
+              const wchar_t * restrict format, va_list arg);
+         int vswscanf(const wchar_t * restrict s,
+              const wchar_t * restrict format, va_list arg);
+         int vwprintf(const wchar_t * restrict format,
+              va_list arg);
+         int vwscanf(const wchar_t * restrict format,
+              va_list arg);
+         int wprintf(const wchar_t * restrict format, ...);
+         int wscanf(const wchar_t * restrict format, ...);
+         wint_t fgetwc(FILE *stream);
+         wchar_t *fgetws(wchar_t * restrict s, int n,
+              FILE * restrict stream);
+         wint_t fputwc(wchar_t c, FILE *stream);
+         int fputws(const wchar_t * restrict s,
+              FILE * restrict stream);
+         int fwide(FILE *stream, int mode);
+         wint_t getwc(FILE *stream);
+         wint_t getwchar(void);
+         wint_t putwc(wchar_t c, FILE *stream);
+         wint_t putwchar(wchar_t c);
+         wint_t ungetwc(wint_t c, FILE *stream);
+       double wcstod(const wchar_t * restrict nptr,
+            wchar_t ** restrict endptr);
+       float wcstof(const wchar_t * restrict nptr,
+            wchar_t ** restrict endptr);
+       long double wcstold(const wchar_t * restrict nptr,
+            wchar_t ** restrict endptr);
+       long int wcstol(const wchar_t * restrict nptr,
+            wchar_t ** restrict endptr, int base);
+       long long int wcstoll(const wchar_t * restrict nptr,
+            wchar_t ** restrict endptr, int base);
+       unsigned long int wcstoul(const wchar_t * restrict nptr,
+            wchar_t ** restrict endptr, int base);
+       unsigned long long int wcstoull(
+            const wchar_t * restrict nptr,
+            wchar_t ** restrict endptr, int base);
+       wchar_t *wcscpy(wchar_t * restrict s1,
+            const wchar_t * restrict s2);
+       wchar_t *wcsncpy(wchar_t * restrict s1,
+            const wchar_t * restrict s2, size_t n);
+       wchar_t *wmemcpy(wchar_t * restrict s1,
+            const wchar_t * restrict s2, size_t n);
+       wchar_t *wmemmove(wchar_t *s1, const wchar_t *s2,
+            size_t n);
+       wchar_t *wcscat(wchar_t * restrict s1,
+            const wchar_t * restrict s2);
+       wchar_t *wcsncat(wchar_t * restrict s1,
+            const wchar_t * restrict s2, size_t n);
+       int wcscmp(const wchar_t *s1, const wchar_t *s2);
+       int wcscoll(const wchar_t *s1, const wchar_t *s2);
+       int wcsncmp(const wchar_t *s1, const wchar_t *s2,
+            size_t n);
+       size_t wcsxfrm(wchar_t * restrict s1,
+            const wchar_t * restrict s2, size_t n);
+       int wmemcmp(const wchar_t *s1, const wchar_t *s2,
+            size_t n);
+       wchar_t *wcschr(const wchar_t *s, wchar_t c);
+       size_t wcscspn(const wchar_t *s1, const wchar_t *s2);
+       wchar_t *wcspbrk(const wchar_t *s1, const wchar_t *s2); *
+       wchar_t *wcsrchr(const wchar_t *s, wchar_t c);
+       size_t wcsspn(const wchar_t *s1, const wchar_t *s2);
+       wchar_t *wcsstr(const wchar_t *s1, const wchar_t *s2);
+         wchar_t *wcstok(wchar_t * restrict s1,
+              const wchar_t * restrict s2,
+              wchar_t ** restrict ptr);
+         wchar_t *wmemchr(const wchar_t *s, wchar_t c, size_t n);
+         size_t wcslen(const wchar_t *s);
+         wchar_t *wmemset(wchar_t *s, wchar_t c, size_t n);
+         size_t wcsftime(wchar_t * restrict s, size_t maxsize,
+              const wchar_t * restrict format,
+              const struct tm * restrict timeptr);
+         wint_t btowc(int c);
+         int wctob(wint_t c);
+         int mbsinit(const mbstate_t *ps);
+         size_t mbrlen(const char * restrict s, size_t n,
+              mbstate_t * restrict ps);
+         size_t mbrtowc(wchar_t * restrict pwc,
+              const char * restrict s, size_t n,
+              mbstate_t * restrict ps);
+         size_t wcrtomb(char * restrict s, wchar_t wc,
+              mbstate_t * restrict ps);
+         size_t mbsrtowcs(wchar_t * restrict dst,
+              const char ** restrict src, size_t len,
+              mbstate_t * restrict ps);
+         size_t wcsrtombs(char * restrict dst,
+              const wchar_t ** restrict src, size_t len,
+              mbstate_t * restrict ps);
+</pre>
+
+<h3><a name="B.24" href="#B.24">B.24 Wide character classification and mapping utilities &lt;wctype.h&gt;</a></h3>
+<!--page 450 -->
+<!--page 451 -->
+<pre>
+         wint_t         wctrans_t          wctype_t          WEOF
+         int   iswalnum(wint_t wc);
+         int   iswalpha(wint_t wc);
+         int   iswblank(wint_t wc);
+         int   iswcntrl(wint_t wc);
+         int   iswdigit(wint_t wc);
+         int   iswgraph(wint_t wc);
+         int   iswlower(wint_t wc);
+         int   iswprint(wint_t wc);
+         int   iswpunct(wint_t wc);
+         int   iswspace(wint_t wc);
+         int   iswupper(wint_t wc);
+         int   iswxdigit(wint_t wc);
+         int   iswctype(wint_t wc, wctype_t desc);
+       wctype_t wctype(const char *property);
+       wint_t towlower(wint_t wc);
+       wint_t towupper(wint_t wc);
+       wint_t towctrans(wint_t wc, wctrans_t desc);
+       wctrans_t wctrans(const char *property);
+</pre>
+
+<h2><a name="C" href="#C">Annex C</a></h2>
+<pre>
+                                     (informative)
+                                   Sequence points
+</pre>
+<p><!--para 1 -->
+ The following are the sequence points described in <a href="#5.1.2.3">5.1.2.3</a>:
+<ul>
+<li>  The call to a function, after the arguments have been evaluated (<a href="#6.5.2.2">6.5.2.2</a>).
+<li>  The end of the first operand of the following operators: logical AND &amp;&amp; (<a href="#6.5.13">6.5.13</a>);
+ logical OR || (<a href="#6.5.14">6.5.14</a>); conditional ? (<a href="#6.5.15">6.5.15</a>); comma , (<a href="#6.5.17">6.5.17</a>).
+<li>  The end of a full declarator: declarators (<a href="#6.7.5">6.7.5</a>);
+<li>  The end of a full expression: an initializer (<a href="#6.7.8">6.7.8</a>); the expression in an expression
+ statement (<a href="#6.8.3">6.8.3</a>); the controlling expression of a selection statement (if or switch)
+ (<a href="#6.8.4">6.8.4</a>); the controlling expression of a while or do statement (<a href="#6.8.5">6.8.5</a>); each of the
+ expressions of a for statement (<a href="#6.8.5.3">6.8.5.3</a>); the expression in a return statement
+ (<a href="#6.8.6.4">6.8.6.4</a>).
+<li>  Immediately before a library function returns (<a href="#7.1.4">7.1.4</a>).
+<li>  After the actions associated with each formatted input/output function conversion
+ specifier (<a href="#7.19.6">7.19.6</a>, <a href="#7.24.2">7.24.2</a>).
+<li>  Immediately before and immediately after each call to a comparison function, and
+ also between any call to a comparison function and any movement of the objects
+ passed as arguments to that call (<a href="#7.20.5">7.20.5</a>).
+<!--page 452 -->
+</ul>
+
+<h2><a name="D" href="#D">Annex D</a></h2>
+<pre>
+                                     (normative)
+                Universal character names for identifiers
+</pre>
+<p><!--para 1 -->
+ This clause lists the hexadecimal code values that are valid in universal character names
+ in identifiers.
+<p><!--para 2 -->
+ This table is reproduced unchanged from ISO/IEC TR 10176:1998, produced by ISO/IEC
+ JTC 1/SC 22/WG 20, except for the omission of ranges that are part of the basic character
+ sets.
+ Latin:            00AA, 00BA, 00C0-00D6, 00D8-00F6, 00F8-01F5, 01FA-0217,
+<pre>
+                   0250-02A8, 1E00-1E9B, 1EA0-1EF9, 207F
+</pre>
+ Greek:            0386, 0388-038A, 038C, 038E-03A1, 03A3-03CE, 03D0-03D6,
+<pre>
+                   03DA, 03DC, 03DE, 03E0, 03E2-03F3, 1F00-1F15, 1F18-1F1D,
+                   1F20-1F45, 1F48-1F4D, 1F50-1F57, 1F59, 1F5B, 1F5D,
+                   1F5F-1F7D, 1F80-1FB4, 1FB6-1FBC, 1FC2-1FC4, 1FC6-1FCC,
+                   1FD0-1FD3, 1FD6-1FDB, 1FE0-1FEC, 1FF2-1FF4, 1FF6-1FFC
+</pre>
+ Cyrillic:         0401-040C, 040E-044F, 0451-045C, 045E-0481, 0490-04C4,
+<pre>
+                   04C7-04C8, 04CB-04CC, 04D0-04EB, 04EE-04F5, 04F8-04F9
+</pre>
+ Armenian:         0531-0556, 0561-0587
+ Hebrew:           05B0-05B9,      05BB-05BD,       05BF,   05C1-05C2,      05D0-05EA,
+<pre>
+                   05F0-05F2
+</pre>
+ Arabic:           0621-063A, 0640-0652, 0670-06B7, 06BA-06BE, 06C0-06CE,
+<pre>
+                   06D0-06DC, 06E5-06E8, 06EA-06ED
+</pre>
+ Devanagari:       0901-0903, 0905-0939, 093E-094D, 0950-0952, 0958-0963
+ Bengali:          0981-0983, 0985-098C, 098F-0990, 0993-09A8, 09AA-09B0,
+<pre>
+                   09B2, 09B6-09B9, 09BE-09C4, 09C7-09C8, 09CB-09CD,
+                   09DC-09DD, 09DF-09E3, 09F0-09F1
+</pre>
+ Gurmukhi:         0A02, 0A05-0A0A, 0A0F-0A10, 0A13-0A28, 0A2A-0A30,
+<pre>
+                   0A32-0A33, 0A35-0A36, 0A38-0A39, 0A3E-0A42, 0A47-0A48,
+                   0A4B-0A4D, 0A59-0A5C, 0A5E, 0A74
+</pre>
+ Gujarati:         0A81-0A83, 0A85-0A8B, 0A8D, 0A8F-0A91, 0A93-0AA8,
+<pre>
+                   0AAA-0AB0,    0AB2-0AB3,     0AB5-0AB9, 0ABD-0AC5,
+                   0AC7-0AC9, 0ACB-0ACD, 0AD0, 0AE0
+</pre>
+ Oriya:            0B01-0B03, 0B05-0B0C, 0B0F-0B10, 0B13-0B28, 0B2A-0B30,
+<!--page 453 -->
+<pre>
+                   0B32-0B33, 0B36-0B39, 0B3E-0B43, 0B47-0B48, 0B4B-0B4D,
+                 0B5C-0B5D, 0B5F-0B61
+</pre>
+ Tamil:          0B82-0B83, 0B85-0B8A, 0B8E-0B90, 0B92-0B95, 0B99-0B9A,
+<pre>
+                 0B9C, 0B9E-0B9F, 0BA3-0BA4, 0BA8-0BAA, 0BAE-0BB5,
+                 0BB7-0BB9, 0BBE-0BC2, 0BC6-0BC8, 0BCA-0BCD
+</pre>
+ Telugu:         0C01-0C03, 0C05-0C0C, 0C0E-0C10, 0C12-0C28, 0C2A-0C33,
+<pre>
+                 0C35-0C39, 0C3E-0C44, 0C46-0C48, 0C4A-0C4D, 0C60-0C61
+</pre>
+ Kannada:        0C82-0C83, 0C85-0C8C, 0C8E-0C90, 0C92-0CA8, 0CAA-0CB3,
+<pre>
+                 0CB5-0CB9, 0CBE-0CC4, 0CC6-0CC8, 0CCA-0CCD, 0CDE,
+                 0CE0-0CE1
+</pre>
+ Malayalam:      0D02-0D03, 0D05-0D0C, 0D0E-0D10, 0D12-0D28, 0D2A-0D39,
+<pre>
+                 0D3E-0D43, 0D46-0D48, 0D4A-0D4D, 0D60-0D61
+</pre>
+ Thai:           0E01-0E3A, 0E40-0E5B
+ Lao:            0E81-0E82, 0E84, 0E87-0E88, 0E8A, 0E8D, 0E94-0E97,
+<pre>
+                 0E99-0E9F,   0EA1-0EA3,  0EA5,  0EA7,  0EAA-0EAB,
+                 0EAD-0EAE, 0EB0-0EB9, 0EBB-0EBD, 0EC0-0EC4, 0EC6,
+                 0EC8-0ECD, 0EDC-0EDD
+</pre>
+ Tibetan:        0F00, 0F18-0F19, 0F35, 0F37, 0F39, 0F3E-0F47, 0F49-0F69,
+<pre>
+                 0F71-0F84, 0F86-0F8B, 0F90-0F95, 0F97, 0F99-0FAD,
+                 0FB1-0FB7, 0FB9
+</pre>
+ Georgian:       10A0-10C5, 10D0-10F6
+ Hiragana:       3041-3093, 309B-309C
+ Katakana:       30A1-30F6, 30FB-30FC
+ Bopomofo:       3105-312C
+ CJK Unified Ideographs: 4E00-9FA5
+ Hangul:         AC00-D7A3
+ Digits:         0660-0669, 06F0-06F9, 0966-096F, 09E6-09EF, 0A66-0A6F,
+<pre>
+                 0AE6-0AEF, 0B66-0B6F, 0BE7-0BEF, 0C66-0C6F, 0CE6-0CEF,
+                 0D66-0D6F, 0E50-0E59, 0ED0-0ED9, 0F20-0F33
+</pre>
+ Special characters: 00B5, 00B7, 02B0-02B8, 02BB, 02BD-02C1, 02D0-02D1,
+<!--page 454 -->
+<pre>
+                    02E0-02E4, 037A, 0559, 093D, 0B3D, 1FBE, 203F-2040, 2102,
+                    2107, 210A-2113, 2115, 2118-211D, 2124, 2126, 2128, 212A-2131,
+                    2133-2138, 2160-2182, 3005-3007, 3021-3029
+</pre>
+
+<h2><a name="E" href="#E">Annex E</a></h2>
+<pre>
+                                    (informative)
+                             Implementation limits
+</pre>
+<p><!--para 1 -->
+ The contents of the header <a href="#7.10">&lt;limits.h&gt;</a> are given below, in alphabetical order. The
+ minimum magnitudes shown shall be replaced by implementation-defined magnitudes
+ with the same sign. The values shall all be constant expressions suitable for use in #if
+ preprocessing directives. The components are described further in <a href="#5.2.4.2.1">5.2.4.2.1</a>.
+<pre>
+        #define     CHAR_BIT                               8
+        #define     CHAR_MAX          UCHAR_MAX or SCHAR_MAX
+        #define     CHAR_MIN                  0 or SCHAR_MIN
+        #define     INT_MAX                           +32767
+        #define     INT_MIN                           -32767
+        #define     LONG_MAX                     +2147483647
+        #define     LONG_MIN                     -2147483647
+        #define     LLONG_MAX           +9223372036854775807
+        #define     LLONG_MIN           -9223372036854775807
+        #define     MB_LEN_MAX                             1
+        #define     SCHAR_MAX                           +127
+        #define     SCHAR_MIN                           -127
+        #define     SHRT_MAX                          +32767
+        #define     SHRT_MIN                          -32767
+        #define     UCHAR_MAX                            255
+        #define     USHRT_MAX                          65535
+        #define     UINT_MAX                           65535
+        #define     ULONG_MAX                     4294967295
+        #define     ULLONG_MAX          18446744073709551615
+</pre>
+<p><!--para 2 -->
+ The contents of the header <a href="#7.7">&lt;float.h&gt;</a> are given below. All integer values, except
+ FLT_ROUNDS, shall be constant expressions suitable for use in #if preprocessing
+ directives; all floating values shall be constant expressions. The components are
+ described further in <a href="#5.2.4.2.2">5.2.4.2.2</a>.
+<p><!--para 3 -->
+ The values given in the following list shall be replaced by implementation-defined
+ expressions:
+<pre>
+        #define FLT_EVAL_METHOD
+        #define FLT_ROUNDS
+</pre>
+<p><!--para 4 -->
+ The values given in the following list shall be replaced by implementation-defined
+ constant expressions that are greater or equal in magnitude (absolute value) to those
+ shown, with the same sign:
+<!--page 455 -->
+<pre>
+        #define    DBL_DIG                                        10
+        #define    DBL_MANT_DIG
+        #define    DBL_MAX_10_EXP                               +37
+        #define    DBL_MAX_EXP
+        #define    DBL_MIN_10_EXP                               -37
+        #define    DBL_MIN_EXP
+        #define    DECIMAL_DIG                                    10
+        #define    FLT_DIG                                         6
+        #define    FLT_MANT_DIG
+        #define    FLT_MAX_10_EXP                               +37
+        #define    FLT_MAX_EXP
+        #define    FLT_MIN_10_EXP                               -37
+        #define    FLT_MIN_EXP
+        #define    FLT_RADIX                                       2
+        #define    LDBL_DIG                                       10
+        #define    LDBL_MANT_DIG
+        #define    LDBL_MAX_10_EXP                              +37
+        #define    LDBL_MAX_EXP
+        #define    LDBL_MIN_10_EXP                              -37
+        #define    LDBL_MIN_EXP
+</pre>
+<p><!--para 5 -->
+ The values given in the following list shall be replaced by implementation-defined
+ constant expressions with values that are greater than or equal to those shown:
+<pre>
+        #define DBL_MAX                                      1E+37
+        #define FLT_MAX                                      1E+37
+        #define LDBL_MAX                                     1E+37
+</pre>
+<p><!--para 6 -->
+ The values given in the following list shall be replaced by implementation-defined
+ constant expressions with (positive) values that are less than or equal to those shown:
+<!--page 456 -->
+<pre>
+        #define    DBL_EPSILON                                1E-9
+        #define    DBL_MIN                                   1E-37
+        #define    FLT_EPSILON                                1E-5
+        #define    FLT_MIN                                   1E-37
+        #define    LDBL_EPSILON                               1E-9
+        #define    LDBL_MIN                                  1E-37
+</pre>
+
+<h2><a name="F" href="#F">Annex F</a></h2>
+<pre>
+                                           (normative)
+                       IEC 60559 floating-point arithmetic
+</pre>
+
+<h3><a name="F.1" href="#F.1">F.1 Introduction</a></h3>
+<p><!--para 1 -->
+ This annex specifies C language support for the IEC 60559 floating-point standard. The
+ IEC 60559 floating-point standard is specifically Binary floating-point arithmetic for
+ microprocessor systems, second edition (IEC 60559:1989), previously designated
+ IEC 559:1989 and as IEEE Standard for Binary Floating-Point Arithmetic
+ (ANSI/IEEE 754-1985). IEEE Standard for Radix-Independent Floating-Point
+ Arithmetic (ANSI/IEEE 854-1987) generalizes the binary standard to remove
+ dependencies on radix and word length. IEC 60559 generally refers to the floating-point
+ standard, as in IEC 60559 operation, IEC 60559 format, etc. An implementation that
+ defines __STDC_IEC_559__ shall conform to the specifications in this annex. Where
+ a binding between the C language and IEC 60559 is indicated, the IEC 60559-specified
+ behavior is adopted by reference, unless stated otherwise.
+
+<h3><a name="F.2" href="#F.2">F.2 Types</a></h3>
+<p><!--para 1 -->
+ The C floating types match the IEC 60559 formats as follows:
+<ul>
+<li>  The float type matches the IEC 60559 single format.
+<li>  The double type matches the IEC 60559 double format.
+<li>  The long double type matches an IEC 60559 extended format,<sup><a href="#note307"><b>307)</b></a></sup> else a
+ non-IEC 60559 extended format, else the IEC 60559 double format.
+</ul>
+ Any non-IEC 60559 extended format used for the long double type shall have more
+ precision than IEC 60559 double and at least the range of IEC 60559 double.<sup><a href="#note308"><b>308)</b></a></sup>
+<p><b>Recommended practice</b>
+<p><!--para 2 -->
+ The long double type should match an IEC 60559 extended format.
+<!--page 457 -->
+
+<p><b>Footnotes</b>
+<p><small><a name="note307" href="#note307">307)</a> ''Extended'' is IEC 60559's double-extended data format. Extended refers to both the common 80-bit
+ and quadruple 128-bit IEC 60559 formats.
+</small>
+<p><small><a name="note308" href="#note308">308)</a> A non-IEC 60559 long double type is required to provide infinity and NaNs, as its values include
+ all double values.
+</small>
+
+<h4><a name="F.2.1" href="#F.2.1">F.2.1 Infinities, signed zeros, and NaNs</a></h4>
+<p><!--para 1 -->
+ This specification does not define the behavior of signaling NaNs.<sup><a href="#note309"><b>309)</b></a></sup> It generally uses
+ the term NaN to denote quiet NaNs. The NAN and INFINITY macros and the nan
+ functions in <a href="#7.12">&lt;math.h&gt;</a> provide designations for IEC 60559 NaNs and infinities.
+
+<p><b>Footnotes</b>
+<p><small><a name="note309" href="#note309">309)</a> Since NaNs created by IEC 60559 operations are always quiet, quiet NaNs (along with infinities) are
+ sufficient for closure of the arithmetic.
+</small>
+
+<h3><a name="F.3" href="#F.3">F.3 Operators and functions</a></h3>
+<p><!--para 1 -->
+ C operators and functions provide IEC 60559 required and recommended facilities as
+ listed below.
+<ul>
+<li>  The +, -, *, and / operators provide the IEC 60559 add, subtract, multiply, and
+ divide operations.
+<li>  The sqrt functions in <a href="#7.12">&lt;math.h&gt;</a> provide the IEC 60559 square root operation.
+<li>  The remainder functions in <a href="#7.12">&lt;math.h&gt;</a> provide the IEC 60559 remainder
+ operation. The remquo functions in <a href="#7.12">&lt;math.h&gt;</a> provide the same operation but
+ with additional information.
+<li>  The rint functions in <a href="#7.12">&lt;math.h&gt;</a> provide the IEC 60559 operation that rounds a
+ floating-point number to an integer value (in the same precision). The nearbyint
+ functions in <a href="#7.12">&lt;math.h&gt;</a> provide the nearbyinteger function recommended in the
+ Appendix to ANSI/IEEE 854.
+<li>  The conversions for floating types provide the IEC 60559 conversions between
+ floating-point precisions.
+<li>  The conversions from integer to floating types provide the IEC 60559 conversions
+ from integer to floating point.
+<li>  The conversions from floating to integer types provide IEC 60559-like conversions
+ but always round toward zero.
+<li>  The lrint and llrint functions in <a href="#7.12">&lt;math.h&gt;</a> provide the IEC 60559
+ conversions, which honor the directed rounding mode, from floating point to the
+ long int and long long int integer formats. The lrint and llrint
+ functions can be used to implement IEC 60559 conversions from floating to other
+ integer formats.
+<li>  The translation time conversion of floating constants and the strtod, strtof,
+ strtold, fprintf, fscanf, and related library functions in <a href="#7.20">&lt;stdlib.h&gt;</a>,
+ <a href="#7.19">&lt;stdio.h&gt;</a>, and <a href="#7.24">&lt;wchar.h&gt;</a> provide IEC 60559 binary-decimal conversions. The
+ strtold function in <a href="#7.20">&lt;stdlib.h&gt;</a> provides the conv function recommended in the
+ Appendix to ANSI/IEEE 854.
+<!--page 458 -->
+<li>  The relational and equality operators provide IEC 60559 comparisons. IEC 60559
+ identifies a need for additional comparison predicates to facilitate writing code that
+ accounts for NaNs. The comparison macros (isgreater, isgreaterequal,
+ isless, islessequal, islessgreater, and isunordered) in <a href="#7.12">&lt;math.h&gt;</a>
+ supplement the language operators to address this need. The islessgreater and
+ isunordered macros provide respectively a quiet version of the &lt;&gt; predicate and
+ the unordered predicate recommended in the Appendix to IEC 60559.
+<li>  The feclearexcept, feraiseexcept, and fetestexcept functions in
+ <a href="#7.6">&lt;fenv.h&gt;</a> provide the facility to test and alter the IEC 60559 floating-point
+ exception status flags. The fegetexceptflag and fesetexceptflag
+ functions in <a href="#7.6">&lt;fenv.h&gt;</a> provide the facility to save and restore all five status flags at
+ one time. These functions are used in conjunction with the type fexcept_t and the
+ floating-point     exception      macros      (FE_INEXACT,         FE_DIVBYZERO,
+ FE_UNDERFLOW, FE_OVERFLOW, FE_INVALID) also in <a href="#7.6">&lt;fenv.h&gt;</a>.
+<li>  The fegetround and fesetround functions in <a href="#7.6">&lt;fenv.h&gt;</a> provide the facility
+ to select among the IEC 60559 directed rounding modes represented by the rounding
+ direction macros in <a href="#7.6">&lt;fenv.h&gt;</a> (FE_TONEAREST, FE_UPWARD, FE_DOWNWARD,
+ FE_TOWARDZERO) and the values 0, 1, 2, and 3 of FLT_ROUNDS are the
+ IEC 60559 directed rounding modes.
+<li>  The fegetenv, feholdexcept, fesetenv, and feupdateenv functions in
+ <a href="#7.6">&lt;fenv.h&gt;</a> provide a facility to manage the floating-point environment, comprising
+ the IEC 60559 status flags and control modes.
+<li>  The copysign functions in <a href="#7.12">&lt;math.h&gt;</a> provide the copysign function
+ recommended in the Appendix to IEC 60559.
+<li>  The unary minus (-) operator provides the minus (-) operation recommended in the
+ Appendix to IEC 60559.
+<li>  The scalbn and scalbln functions in <a href="#7.12">&lt;math.h&gt;</a> provide the scalb function
+ recommended in the Appendix to IEC 60559.
+<li>  The logb functions in <a href="#7.12">&lt;math.h&gt;</a> provide the logb function recommended in the
+ Appendix to IEC 60559, but following the newer specifications in ANSI/IEEE 854.
+<li>  The nextafter and nexttoward functions in <a href="#7.12">&lt;math.h&gt;</a> provide the nextafter
+ function recommended in the Appendix to IEC 60559 (but with a minor change to
+ better handle signed zeros).
+<li>  The isfinite macro in <a href="#7.12">&lt;math.h&gt;</a> provides the finite function recommended in
+ the Appendix to IEC 60559.
+<li>  The isnan macro in <a href="#7.12">&lt;math.h&gt;</a> provides the isnan function recommended in the
+ Appendix to IEC 60559.
+<!--page 459 -->
+<li>  The signbit macro and the fpclassify macro in <a href="#7.12">&lt;math.h&gt;</a>, used in
+ conjunction with the number classification macros (FP_NAN, FP_INFINITE,
+ FP_NORMAL, FP_SUBNORMAL, FP_ZERO), provide the facility of the class
+ function recommended in the Appendix to IEC 60559 (except that the classification
+ macros defined in <a href="#7.12.3">7.12.3</a> do not distinguish signaling from quiet NaNs).
+</ul>
+
+<h3><a name="F.4" href="#F.4">F.4 Floating to integer conversion</a></h3>
+<p><!--para 1 -->
+ If the floating value is infinite or NaN or if the integral part of the floating value exceeds
+ the range of the integer type, then the ''invalid'' floating-point exception is raised and the
+ resulting value is unspecified. Whether conversion of non-integer floating values whose
+ integral part is within the range of the integer type raises the ''inexact'' floating-point
+ exception is unspecified.<sup><a href="#note310"><b>310)</b></a></sup>
+
+<p><b>Footnotes</b>
+<p><small><a name="note310" href="#note310">310)</a> ANSI/IEEE 854, but not IEC 60559 (ANSI/IEEE 754), directly specifies that floating-to-integer
+ conversions raise the ''inexact'' floating-point exception for non-integer in-range values. In those
+ cases where it matters, library functions can be used to effect such conversions with or without raising
+ the ''inexact'' floating-point exception. See rint, lrint, llrint, and nearbyint in
+ <a href="#7.12">&lt;math.h&gt;</a>.
+</small>
+
+<h3><a name="F.5" href="#F.5">F.5 Binary-decimal conversion</a></h3>
+<p><!--para 1 -->
+ Conversion from the widest supported IEC 60559 format to decimal with
+ DECIMAL_DIG digits and back is the identity function.<sup><a href="#note311"><b>311)</b></a></sup>
+<p><!--para 2 -->
+ Conversions involving IEC 60559 formats follow all pertinent recommended practice. In
+ particular, conversion between any supported IEC 60559 format and decimal with
+ DECIMAL_DIG or fewer significant digits is correctly rounded (honoring the current
+ rounding mode), which assures that conversion from the widest supported IEC 60559
+ format to decimal with DECIMAL_DIG digits and back is the identity function.
+<p><!--para 3 -->
+ Functions such as strtod that convert character sequences to floating types honor the
+ rounding direction. Hence, if the rounding direction might be upward or downward, the
+ implementation cannot convert a minus-signed sequence by negating the converted
+ unsigned sequence.
+<!--page 460 -->
+
+<p><b>Footnotes</b>
+<p><small><a name="note311" href="#note311">311)</a> If the minimum-width IEC 60559 extended format (64 bits of precision) is supported,
+ DECIMAL_DIG shall be at least 21. If IEC 60559 double (53 bits of precision) is the widest
+ IEC 60559 format supported, then DECIMAL_DIG shall be at least 17. (By contrast, LDBL_DIG and
+ DBL_DIG are 18 and 15, respectively, for these formats.)
+</small>
+
+<h3><a name="F.6" href="#F.6">F.6 Contracted expressions</a></h3>
+<p><!--para 1 -->
+ A contracted expression treats infinities, NaNs, signed zeros, subnormals, and the
+ rounding directions in a manner consistent with the basic arithmetic operations covered
+ by IEC 60559.
+<p><b>Recommended practice</b>
+<p><!--para 2 -->
+ A contracted expression should raise floating-point exceptions in a manner generally
+ consistent with the basic arithmetic operations. A contracted expression should deliver
+ the same value as its uncontracted counterpart, else should be correctly rounded (once).
+
+<h3><a name="F.7" href="#F.7">F.7 Floating-point environment</a></h3>
+<p><!--para 1 -->
+ The floating-point environment defined in <a href="#7.6">&lt;fenv.h&gt;</a> includes the IEC 60559 floating-
+ point exception status flags and directed-rounding control modes. It includes also
+ IEC 60559 dynamic rounding precision and trap enablement modes, if the
+ implementation supports them.<sup><a href="#note312"><b>312)</b></a></sup>
+
+<p><b>Footnotes</b>
+<p><small><a name="note312" href="#note312">312)</a> This specification does not require dynamic rounding precision nor trap enablement modes.
+</small>
+
+<h4><a name="F.7.1" href="#F.7.1">F.7.1 Environment management</a></h4>
+<p><!--para 1 -->
+ IEC 60559 requires that floating-point operations implicitly raise floating-point exception
+ status flags, and that rounding control modes can be set explicitly to affect result values of
+ floating-point operations. When the state for the FENV_ACCESS pragma (defined in
+ <a href="#7.6">&lt;fenv.h&gt;</a>) is ''on'', these changes to the floating-point state are treated as side effects
+ which respect sequence points.<sup><a href="#note313"><b>313)</b></a></sup>
+
+<p><b>Footnotes</b>
+<p><small><a name="note313" href="#note313">313)</a> If the state for the FENV_ACCESS pragma is ''off'', the implementation is free to assume the floating-
+ point control modes will be the default ones and the floating-point status flags will not be tested,
+ which allows certain optimizations (see <a href="#F.8">F.8</a>).
+</small>
+
+<h4><a name="F.7.2" href="#F.7.2">F.7.2 Translation</a></h4>
+<p><!--para 1 -->
+ During translation the IEC 60559 default modes are in effect:
+<ul>
+<li>  The rounding direction mode is rounding to nearest.
+<li>  The rounding precision mode (if supported) is set so that results are not shortened.
+<li>  Trapping or stopping (if supported) is disabled on all floating-point exceptions.
+</ul>
+<p><b>Recommended practice</b>
+<p><!--para 2 -->
+ The implementation should produce a diagnostic message for each translation-time
+<!--page 461 -->
+ floating-point exception, other than ''inexact'';<sup><a href="#note314"><b>314)</b></a></sup> the implementation should then
+ proceed with the translation of the program.
+
+<p><b>Footnotes</b>
+<p><small><a name="note314" href="#note314">314)</a> As floating constants are converted to appropriate internal representations at translation time, their
+ conversion is subject to default rounding modes and raises no execution-time floating-point exceptions
+ (even where the state of the FENV_ACCESS pragma is ''on''). Library functions, for example
+ strtod, provide execution-time conversion of numeric strings.
+</small>
+
+<h4><a name="F.7.3" href="#F.7.3">F.7.3 Execution</a></h4>
+<p><!--para 1 -->
+ At program startup the floating-point environment is initialized as prescribed by
+ IEC 60559:
+<ul>
+<li>  All floating-point exception status flags are cleared.
+<li>  The rounding direction mode is rounding to nearest.
+<li>  The dynamic rounding precision mode (if supported) is set so that results are not
+ shortened.
+<li>  Trapping or stopping (if supported) is disabled on all floating-point exceptions.
+</ul>
+
+<h4><a name="F.7.4" href="#F.7.4">F.7.4 Constant expressions</a></h4>
+<p><!--para 1 -->
+ An arithmetic constant expression of floating type, other than one in an initializer for an
+ object that has static storage duration, is evaluated (as if) during execution; thus, it is
+ affected by any operative floating-point control modes and raises floating-point
+ exceptions as required by IEC 60559 (provided the state for the FENV_ACCESS pragma
+ is ''on'').<sup><a href="#note315"><b>315)</b></a></sup>
+<p><!--para 2 -->
+ EXAMPLE
+<pre>
           #include <a href="#7.6">&lt;fenv.h&gt;</a>
           #pragma STDC FENV_ACCESS ON
-          double modf(double value, double *iptr)
+          void f(void)
           {
-               int save_round = fegetround();
-               fesetround(FE_TOWARDZERO);
-               *iptr = nearbyint(value);
-               fesetround(save_round);
-               return copysign(
-                    isinf(value) ? 0.0 :
-                         value - (*iptr), value);
+                float w[] = { 0.0/0.0 };                  //   raises an exception
+                static float x = 0.0/0.0;                 //   does not raise an exception
+                float y = 0.0/0.0;                        //   raises an exception
+                double z = 0.0/0.0;                       //   raises an exception
+                /* ... */
           }
-<a name="F.9.3.13" href="#F.9.3.13"><b>    F.9.3.13 The scalbn and scalbln functions</b></a>
-1   -- scalbn((+-)0, n) returns (+-)0.
-    -- scalbn(x, 0) returns x.
-    -- scalbn((+-)(inf), n) returns (+-)(inf).
-<a name="F.9.4" href="#F.9.4"><b>    F.9.4 Power and absolute value functions</b></a>
-<a name="F.9.4.1" href="#F.9.4.1"><b>    F.9.4.1 The cbrt functions</b></a>
-1   -- cbrt((+-)0) returns (+-)0.
-    -- cbrt((+-)(inf)) returns (+-)(inf).
-<a name="F.9.4.2" href="#F.9.4.2"><b>    F.9.4.2 The fabs functions</b></a>
-1   -- fabs((+-)0) returns +0.
-    -- fabs((+-)(inf)) returns +(inf).
-
-
-
-
-[<a name="p460" href="#p460">page 460</a>] (<a href="#Contents">Contents</a>)
-
-<a name="F.9.4.3" href="#F.9.4.3"><b>    F.9.4.3 The hypot functions</b></a>
-1   -- hypot(x, y), hypot(y, x), and hypot(x, -y) are equivalent.
-    -- hypot(x, (+-)0) is equivalent to fabs(x).
-    -- hypot((+-)(inf), y) returns +(inf), even if y is a NaN.
-<a name="F.9.4.4" href="#F.9.4.4"><b>    F.9.4.4 The pow functions</b></a>
-1   -- pow((+-)0, y) returns (+-)(inf) and raises the ''divide-by-zero'' floating-point exception
-      for y an odd integer &lt; 0.
-    -- pow((+-)0, y) returns +(inf) and raises the ''divide-by-zero'' floating-point exception
-      for y &lt; 0 and not an odd integer.
-    -- pow((+-)0, y) returns (+-)0 for y an odd integer &gt; 0.
-    -- pow((+-)0, y) returns +0 for y &gt; 0 and not an odd integer.
-    -- pow(-1, (+-)(inf)) returns 1.
-    -- pow(+1, y) returns 1 for any y, even a NaN.
-    -- pow(x, (+-)0) returns 1 for any x, even a NaN.
-    -- pow(x, y) returns a NaN and raises the ''invalid'' floating-point exception for
-      finite x &lt; 0 and finite non-integer y.
-    -- pow(x, -(inf)) returns +(inf) for | x | &lt; 1.
-    -- pow(x, -(inf)) returns +0 for | x | &gt; 1.
-    -- pow(x, +(inf)) returns +0 for | x | &lt; 1.
-    -- pow(x, +(inf)) returns +(inf) for | x | &gt; 1.
-    -- pow(-(inf), y) returns -0 for y an odd integer &lt; 0.
-    -- pow(-(inf), y) returns +0 for y &lt; 0 and not an odd integer.
-    -- pow(-(inf), y) returns -(inf) for y an odd integer &gt; 0.
-    -- pow(-(inf), y) returns +(inf) for y &gt; 0 and not an odd integer.
-    -- pow(+(inf), y) returns +0 for y &lt; 0.
-    -- pow(+(inf), y) returns +(inf) for y &gt; 0.
-
-
-
-
-[<a name="p461" href="#p461">page 461</a>] (<a href="#Contents">Contents</a>)
-
-<a name="F.9.4.5" href="#F.9.4.5"><b>    F.9.4.5 The sqrt functions</b></a>
-1   sqrt is fully specified as a basic arithmetic operation in IEC 60559.
-<a name="F.9.5" href="#F.9.5"><b>    F.9.5 Error and gamma functions</b></a>
-<a name="F.9.5.1" href="#F.9.5.1"><b>    F.9.5.1 The erf functions</b></a>
-1   -- erf((+-)0) returns (+-)0.
-    -- erf((+-)(inf)) returns (+-)1.
-<a name="F.9.5.2" href="#F.9.5.2"><b>    F.9.5.2 The erfc functions</b></a>
-1   -- erfc(-(inf)) returns 2.
-    -- erfc(+(inf)) returns +0.
-<a name="F.9.5.3" href="#F.9.5.3"><b>    F.9.5.3 The lgamma functions</b></a>
-1   -- lgamma(1) returns +0.
-    -- lgamma(2) returns +0.
-    -- lgamma(x) returns +(inf) and raises the ''divide-by-zero'' floating-point exception for
-      x a negative integer or zero.
-    -- lgamma(-(inf)) returns +(inf).
-    -- lgamma(+(inf)) returns +(inf).
-<a name="F.9.5.4" href="#F.9.5.4"><b>    F.9.5.4 The tgamma functions</b></a>
-1   -- tgamma((+-)0) returns (+-)(inf) and raises the ''divide-by-zero'' floating-point exception.
-    -- tgamma(x) returns a NaN and raises the ''invalid'' floating-point exception for x a
-      negative integer.
-    -- tgamma(-(inf)) returns a NaN and raises the ''invalid'' floating-point exception.
-    -- tgamma(+(inf)) returns +(inf).
-<a name="F.9.6" href="#F.9.6"><b>    F.9.6 Nearest integer functions</b></a>
-<a name="F.9.6.1" href="#F.9.6.1"><b>    F.9.6.1 The ceil functions</b></a>
-1   -- ceil((+-)0) returns (+-)0.
-    -- ceil((+-)(inf)) returns (+-)(inf).
-2   The double version of ceil behaves as though implemented by
-
-
-
-
-[<a name="p462" href="#p462">page 462</a>] (<a href="#Contents">Contents</a>)
-
-           #include <a href="#7.12">&lt;math.h&gt;</a>
-           #include <a href="#7.6">&lt;fenv.h&gt;</a>
-           #pragma STDC FENV_ACCESS ON
-           double ceil(double x)
-           {
-                double result;
-                int save_round = fegetround();
-                fesetround(FE_UPWARD);
-                result = rint(x); // or nearbyint instead of rint
-                fesetround(save_round);
-                return result;
-           }
-<a name="F.9.6.2" href="#F.9.6.2"><b>    F.9.6.2 The floor functions</b></a>
-1   -- floor((+-)0) returns (+-)0.
-    -- floor((+-)(inf)) returns (+-)(inf).
-2   See the sample implementation for ceil in <a href="#F.9.6.1">F.9.6.1</a>.
-<a name="F.9.6.3" href="#F.9.6.3"><b>    F.9.6.3 The nearbyint functions</b></a>
-1   The nearbyint functions use IEC 60559 rounding according to the current rounding
-    direction. They do not raise the ''inexact'' floating-point exception if the result differs in
-    value from the argument.
-    -- nearbyint((+-)0) returns (+-)0 (for all rounding directions).
-    -- nearbyint((+-)(inf)) returns (+-)(inf) (for all rounding directions).
-<a name="F.9.6.4" href="#F.9.6.4"><b>    F.9.6.4 The rint functions</b></a>
-1   The rint functions differ from the nearbyint functions only in that they do raise the
-    ''inexact'' floating-point exception if the result differs in value from the argument.
-<a name="F.9.6.5" href="#F.9.6.5"><b>    F.9.6.5 The lrint and llrint functions</b></a>
-1   The lrint and llrint functions provide floating-to-integer conversion as prescribed
-    by IEC 60559. They round according to the current rounding direction. If the rounded
-    value is outside the range of the return type, the numeric result is unspecified and the
-    ''invalid'' floating-point exception is raised. When they raise no other floating-point
-    exception and the result differs from the argument, they raise the ''inexact'' floating-point
-    exception.
-
-
-
-
-[<a name="p463" href="#p463">page 463</a>] (<a href="#Contents">Contents</a>)
-
-<a name="F.9.6.6" href="#F.9.6.6"><b>    F.9.6.6 The round functions</b></a>
-1   -- round((+-)0) returns (+-)0.
-    -- round((+-)(inf)) returns (+-)(inf).
-2   The double version of round behaves as though implemented by
-           #include <a href="#7.12">&lt;math.h&gt;</a>
-           #include <a href="#7.6">&lt;fenv.h&gt;</a>
-           #pragma STDC FENV_ACCESS ON
-           double round(double x)
-           {
-                double result;
-                fenv_t save_env;
-                feholdexcept(&amp;save_env);
-                result = rint(x);
-                if (fetestexcept(FE_INEXACT)) {
-                     fesetround(FE_TOWARDZERO);
-                     result = rint(copysign(0.5 + fabs(x), x));
-                }
-                feupdateenv(&amp;save_env);
-                return result;
-           }
-    The round functions may, but are not required to, raise the ''inexact'' floating-point
-    exception for non-integer numeric arguments, as this implementation does.
-<a name="F.9.6.7" href="#F.9.6.7"><b>    F.9.6.7 The lround and llround functions</b></a>
-1   The lround and llround functions differ from the lrint and llrint functions
-    with the default rounding direction just in that the lround and llround functions
-    round halfway cases away from zero and need not raise the ''inexact'' floating-point
-    exception for non-integer arguments that round to within the range of the return type.
-<a name="F.9.6.8" href="#F.9.6.8"><b>    F.9.6.8 The trunc functions</b></a>
-1   The trunc functions use IEC 60559 rounding toward zero (regardless of the current
-    rounding direction).
-    -- trunc((+-)0) returns (+-)0.
-    -- trunc((+-)(inf)) returns (+-)(inf).
-
-
-
-
-[<a name="p464" href="#p464">page 464</a>] (<a href="#Contents">Contents</a>)
-
-<a name="F.9.7" href="#F.9.7"><b>    F.9.7 Remainder functions</b></a>
-<a name="F.9.7.1" href="#F.9.7.1"><b>    F.9.7.1 The fmod functions</b></a>
-1   -- fmod((+-)0, y) returns (+-)0 for y not zero.
-    -- fmod(x, y) returns a NaN and raises the ''invalid'' floating-point exception for x
-      infinite or y zero.
-    -- fmod(x, (+-)(inf)) returns x for x not infinite.
-2   The double version of fmod behaves as though implemented by
-           #include <a href="#7.12">&lt;math.h&gt;</a>
-           #include <a href="#7.6">&lt;fenv.h&gt;</a>
-           #pragma STDC FENV_ACCESS ON
-           double fmod(double x, double y)
-           {
-                double result;
-                result = remainder(fabs(x), (y = fabs(y)));
-                if (signbit(result)) result += y;
-                return copysign(result, x);
-           }
-<a name="F.9.7.2" href="#F.9.7.2"><b>    F.9.7.2 The remainder functions</b></a>
-1   The remainder functions are fully specified as a basic arithmetic operation in
-    IEC 60559.
-<a name="F.9.7.3" href="#F.9.7.3"><b>    F.9.7.3 The remquo functions</b></a>
-1   The remquo functions follow the specifications for the remainder functions. They
-    have no further specifications special to IEC 60559 implementations.
-<a name="F.9.8" href="#F.9.8"><b>    F.9.8 Manipulation functions</b></a>
-<a name="F.9.8.1" href="#F.9.8.1"><b>    F.9.8.1 The copysign functions</b></a>
-1   copysign is specified in the Appendix to IEC 60559.
-<a name="F.9.8.2" href="#F.9.8.2"><b>    F.9.8.2 The nan functions</b></a>
-1   All IEC 60559 implementations support quiet NaNs, in all floating formats.
-
-
-
-
-[<a name="p465" href="#p465">page 465</a>] (<a href="#Contents">Contents</a>)
-
-<a name="F.9.8.3" href="#F.9.8.3"><b>    F.9.8.3 The nextafter functions</b></a>
-1   -- nextafter(x, y) raises the ''overflow'' and ''inexact'' floating-point exceptions
-      for x finite and the function value infinite.
-    -- nextafter(x, y) raises the ''underflow'' and ''inexact'' floating-point
-      exceptions for the function value subnormal or zero and x != y.
-<a name="F.9.8.4" href="#F.9.8.4"><b>    F.9.8.4 The nexttoward functions</b></a>
-1   No additional requirements beyond those on nextafter.
-<a name="F.9.9" href="#F.9.9"><b>    F.9.9 Maximum, minimum, and positive difference functions</b></a>
-<a name="F.9.9.1" href="#F.9.9.1"><b>    F.9.9.1 The fdim functions</b></a>
-1   No additional requirements.
-<a name="F.9.9.2" href="#F.9.9.2"><b>    F.9.9.2 The fmax functions</b></a>
-1   If just one argument is a NaN, the fmax functions return the other argument (if both
-    arguments are NaNs, the functions return a NaN).
-2   The body of the fmax function might be323)
-           { return (isgreaterequal(x, y) ||
-                isnan(y)) ? x : y; }
-<a name="F.9.9.3" href="#F.9.9.3"><b>    F.9.9.3 The fmin functions</b></a>
-1   The fmin functions are analogous to the fmax functions (see <a href="#F.9.9.2">F.9.9.2</a>).
-<a name="F.9.10" href="#F.9.10"><b>    F.9.10 Floating multiply-add</b></a>
-<a name="F.9.10.1" href="#F.9.10.1"><b>    F.9.10.1 The fma functions</b></a>
-1   -- fma(x, y, z) computes xy + z, correctly rounded once.
-    -- fma(x, y, z) returns a NaN and optionally raises the ''invalid'' floating-point
-      exception if one of x and y is infinite, the other is zero, and z is a NaN.
-    -- fma(x, y, z) returns a NaN and raises the ''invalid'' floating-point exception if
-      one of x and y is infinite, the other is zero, and z is not a NaN.
-    -- fma(x, y, z) returns a NaN and raises the ''invalid'' floating-point exception if x
-      times y is an exact infinity and z is also an infinity but with the opposite sign.
-
-
-
-
-    323) Ideally, fmax would be sensitive to the sign of zero, for example fmax(-0.0, +0.0) would
-         return +0; however, implementation in software might be impractical.
-
-[<a name="p466" href="#p466">page 466</a>] (<a href="#Contents">Contents</a>)
-
-<a name="G" href="#G"><b>                                          Annex G</b></a>
-                                        (informative)
-                  IEC 60559-compatible complex arithmetic
-<a name="G.1" href="#G.1"><b>    G.1 Introduction</b></a>
-1   This annex supplements <a href="#F">annex F</a> to specify complex arithmetic for compatibility with
-    IEC 60559 real floating-point arithmetic. Although these specifications have been
-    carefully designed, there is little existing practice to validate the design decisions.
-    Therefore, these specifications are not normative, but should be viewed more as
-    recommended          practice.       An         implementation        that     defines
-    __STDC_IEC_559_COMPLEX__ should conform to the specifications in this annex.
-<a name="G.2" href="#G.2"><b>    G.2 Types</b></a>
-1   There is a new keyword _Imaginary, which is used to specify imaginary types. It is
-    used as a type specifier within declaration specifiers in the same way as _Complex is
-    (thus, _Imaginary float is a valid type name).
-2   There are three imaginary types, designated as float _Imaginary, double
-    _Imaginary, and long double _Imaginary. The imaginary types (along with
-    the real floating and complex types) are floating types.
-3   For imaginary types, the corresponding real type is given by deleting the keyword
-    _Imaginary from the type name.
-4   Each imaginary type has the same representation and alignment requirements as the
-    corresponding real type. The value of an object of imaginary type is the value of the real
-    representation times the imaginary unit.
-5   The imaginary type domain comprises the imaginary types.
-<a name="G.3" href="#G.3"><b>    G.3 Conventions</b></a>
-1   A complex or imaginary value with at least one infinite part is regarded as an infinity
-    (even if its other part is a NaN). A complex or imaginary value is a finite number if each
-    of its parts is a finite number (neither infinite nor NaN). A complex or imaginary value is
-    a zero if each of its parts is a zero.
-
-
-
-
-[<a name="p467" href="#p467">page 467</a>] (<a href="#Contents">Contents</a>)
-
-<a name="G.4" href="#G.4"><b>    G.4 Conversions</b></a>
-<a name="G.4.1" href="#G.4.1"><b>    G.4.1 Imaginary types</b></a>
-1   Conversions among imaginary types follow rules analogous to those for real floating
-    types.
-<a name="G.4.2" href="#G.4.2"><b>    G.4.2 Real and imaginary</b></a>
-1   When a value of imaginary type is converted to a real type other than _Bool,324) the
-    result is a positive zero.
-2   When a value of real type is converted to an imaginary type, the result is a positive
-    imaginary zero.
-<a name="G.4.3" href="#G.4.3"><b>    G.4.3 Imaginary and complex</b></a>
-1   When a value of imaginary type is converted to a complex type, the real part of the
-    complex result value is a positive zero and the imaginary part of the complex result value
-    is determined by the conversion rules for the corresponding real types.
-2   When a value of complex type is converted to an imaginary type, the real part of the
-    complex value is discarded and the value of the imaginary part is converted according to
-    the conversion rules for the corresponding real types.
-<a name="G.5" href="#G.5"><b>    G.5 Binary operators</b></a>
-1   The following subclauses supplement <a href="#6.5">6.5</a> in order to specify the type of the result for an
-    operation with an imaginary operand.
-2   For most operand types, the value of the result of a binary operator with an imaginary or
-    complex operand is completely determined, with reference to real arithmetic, by the usual
-    mathematical formula. For some operand types, the usual mathematical formula is
-    problematic because of its treatment of infinities and because of undue overflow or
-    underflow; in these cases the result satisfies certain properties (specified in <a href="#G.5.1">G.5.1</a>), but is
-    not completely determined.
-
-
-
-
-    324) See <a href="#6.3.1.2">6.3.1.2</a>.
-
-[<a name="p468" href="#p468">page 468</a>] (<a href="#Contents">Contents</a>)
-
-<a name="G.5.1" href="#G.5.1"><b>    G.5.1 Multiplicative operators</b></a>
-    Semantics
-1   If one operand has real type and the other operand has imaginary type, then the result has
-    imaginary type. If both operands have imaginary type, then the result has real type. (If
-    either operand has complex type, then the result has complex type.)
-2   If the operands are not both complex, then the result and floating-point exception
-    behavior of the * operator is defined by the usual mathematical formula:
-           *                  u                   iv                 u + iv
-
-           x                  xu                i(xv)            (xu) + i(xv)
-
-           iy               i(yu)                -yv            (-yv) + i(yu)
-
-           x + iy       (xu) + i(yu)        (-yv) + i(xv)
-3   If the second operand is not complex, then the result and floating-point exception
-    behavior of the / operator is defined by the usual mathematical formula:
-           /                   u                       iv
-
-           x                  x/u                 i(-x/v)
-
-           iy               i(y/u)                     y/v
-
-           x + iy       (x/u) + i(y/u)        (y/v) + i(-x/v)
-4   The * and / operators satisfy the following infinity properties for all real, imaginary, and
-    complex operands:325)
-    -- if one operand is an infinity and the other operand is a nonzero finite number or an
-      infinity, then the result of the * operator is an infinity;
-    -- if the first operand is an infinity and the second operand is a finite number, then the
-      result of the / operator is an infinity;
-    -- if the first operand is a finite number and the second operand is an infinity, then the
-      result of the / operator is a zero;
-
-
-
-
-    325) These properties are already implied for those cases covered in the tables, but are required for all cases
-         (at least where the state for CX_LIMITED_RANGE is ''off'').
-
-[<a name="p469" href="#p469">page 469</a>] (<a href="#Contents">Contents</a>)
-
-    -- if the first operand is a nonzero finite number or an infinity and the second operand is
-      a zero, then the result of the / operator is an infinity.
-5   If both operands of the * operator are complex or if the second operand of the / operator
-    is complex, the operator raises floating-point exceptions if appropriate for the calculation
-    of the parts of the result, and may raise spurious floating-point exceptions.
-6   EXAMPLE 1 Multiplication of double _Complex operands could be implemented as follows. Note
-    that the imaginary unit I has imaginary type (see <a href="#G.6">G.6</a>).
-           #include <a href="#7.12">&lt;math.h&gt;</a>
-           #include <a href="#7.3">&lt;complex.h&gt;</a>
-           /* Multiply z * w ... */
-           double complex _Cmultd(double complex z, double complex w)
-           {
-                  #pragma STDC FP_CONTRACT OFF
-                  double a, b, c, d, ac, bd, ad, bc, x, y;
-                  a = creal(z); b = cimag(z);
-                  c = creal(w); d = cimag(w);
-                  ac = a * c;       bd = b * d;
-                  ad = a * d;       bc = b * c;
-                  x = ac - bd; y = ad + bc;
-                  if (isnan(x) &amp;&amp; isnan(y)) {
-                          /* Recover infinities that computed as NaN+iNaN ... */
-                          int recalc = 0;
-                          if ( isinf(a) || isinf(b) ) { // z is infinite
-                                  /* "Box" the infinity and change NaNs in the other factor to 0 */
-                                  a = copysign(isinf(a) ? 1.0 : 0.0, a);
-                                  b = copysign(isinf(b) ? 1.0 : 0.0, b);
-                                  if (isnan(c)) c = copysign(0.0, c);
-                                  if (isnan(d)) d = copysign(0.0, d);
-                                  recalc = 1;
-                          }
-                          if ( isinf(c) || isinf(d) ) { // w is infinite
-                                  /* "Box" the infinity and change NaNs in the other factor to 0 */
-                                  c = copysign(isinf(c) ? 1.0 : 0.0, c);
-                                  d = copysign(isinf(d) ? 1.0 : 0.0, d);
-                                  if (isnan(a)) a = copysign(0.0, a);
-                                  if (isnan(b)) b = copysign(0.0, b);
-                                  recalc = 1;
-                          }
-                          if (!recalc &amp;&amp; (isinf(ac) || isinf(bd) ||
-                                                 isinf(ad) || isinf(bc))) {
-                                  /* Recover infinities from overflow by changing NaNs to 0 ... */
-                                  if (isnan(a)) a = copysign(0.0, a);
-                                  if (isnan(b)) b = copysign(0.0, b);
-                                  if (isnan(c)) c = copysign(0.0, c);
-                                  if (isnan(d)) d = copysign(0.0, d);
-                                  recalc = 1;
-                          }
-                          if (recalc) {
-
-[<a name="p470" href="#p470">page 470</a>] (<a href="#Contents">Contents</a>)
-
-                                      x = INFINITY * ( a * c - b * d );
-                                      y = INFINITY * ( a * d + b * c );
-                           }
-                     }
-                     return x + I * y;
+</pre>
+<p><!--para 3 -->
+ For the static initialization, the division is done at translation time, raising no (execution-time) floating-
+ point exceptions. On the other hand, for the three automatic initializations the invalid division occurs at
+<!--page 462 -->
+ execution time.
+
+<p><b>Footnotes</b>
+<p><small><a name="note315" href="#note315">315)</a> Where the state for the FENV_ACCESS pragma is ''on'', results of inexact expressions like 1.0/3.0
+ are affected by rounding modes set at execution time, and expressions such as 0.0/0.0 and
+ 1.0/0.0 generate execution-time floating-point exceptions. The programmer can achieve the
+ efficiency of translation-time evaluation through static initialization, such as
+
+<pre>
+          const static double one_third = 1.0/3.0;
+</pre>
+</small>
+
+<h4><a name="F.7.5" href="#F.7.5">F.7.5 Initialization</a></h4>
+<p><!--para 1 -->
+ All computation for automatic initialization is done (as if) at execution time; thus, it is
+ affected by any operative modes and raises floating-point exceptions as required by
+ IEC 60559 (provided the state for the FENV_ACCESS pragma is ''on''). All computation
+ for initialization of objects that have static storage duration is done (as if) at translation
+ time.
+<p><!--para 2 -->
+ EXAMPLE
+<pre>
+          #include <a href="#7.6">&lt;fenv.h&gt;</a>
+          #pragma STDC FENV_ACCESS ON
+          void f(void)
+          {
+                float u[] = { 1.1e75 };                  //   raises exceptions
+                static float v = 1.1e75;                 //   does not raise exceptions
+                float w = 1.1e75;                        //   raises exceptions
+                double x = 1.1e75;                       //   may raise exceptions
+                float y = 1.1e75f;                       //   may raise exceptions
+                long double z = 1.1e75;                  //   does not raise exceptions
+                /* ... */
+          }
+</pre>
+<p><!--para 3 -->
+ The static initialization of v raises no (execution-time) floating-point exceptions because its computation is
+ done at translation time. The automatic initialization of u and w require an execution-time conversion to
+ float of the wider value 1.1e75, which raises floating-point exceptions. The automatic initializations
+ of x and y entail execution-time conversion; however, in some expression evaluation methods, the
+ conversions is not to a narrower format, in which case no floating-point exception is raised.<sup><a href="#note316"><b>316)</b></a></sup> The
+ automatic initialization of z entails execution-time conversion, but not to a narrower format, so no floating-
+ point exception is raised. Note that the conversions of the floating constants 1.1e75 and 1.1e75f to
+ their internal representations occur at translation time in all cases.
+<!--page 463 -->
+
+<p><b>Footnotes</b>
+<p><small><a name="note316" href="#note316">316)</a> Use of float_t and double_t variables increases the likelihood of translation-time computation.
+ For example, the automatic initialization
+
+<pre>
+           double_t x = 1.1e75;
+</pre>
+  could be done at translation time, regardless of the expression evaluation method.
+</small>
+
+<h4><a name="F.7.6" href="#F.7.6">F.7.6 Changing the environment</a></h4>
+<p><!--para 1 -->
+ Operations defined in <a href="#6.5">6.5</a> and functions and macros defined for the standard libraries
+ change floating-point status flags and control modes just as indicated by their
+ specifications (including conformance to IEC 60559). They do not change flags or modes
+ (so as to be detectable by the user) in any other cases.
+<p><!--para 2 -->
+ If the argument to the feraiseexcept function in <a href="#7.6">&lt;fenv.h&gt;</a> represents IEC 60559
+ valid coincident floating-point exceptions for atomic operations (namely ''overflow'' and
+ ''inexact'', or ''underflow'' and ''inexact''), then ''overflow'' or ''underflow'' is raised
+ before ''inexact''.
+
+<h3><a name="F.8" href="#F.8">F.8 Optimization</a></h3>
+<p><!--para 1 -->
+ This section identifies code transformations that might subvert IEC 60559-specified
+ behavior, and others that do not.
+
+<h4><a name="F.8.1" href="#F.8.1">F.8.1 Global transformations</a></h4>
+<p><!--para 1 -->
+ Floating-point arithmetic operations and external function calls may entail side effects
+ which optimization shall honor, at least where the state of the FENV_ACCESS pragma is
+ ''on''. The flags and modes in the floating-point environment may be regarded as global
+ variables; floating-point operations (+, *, etc.) implicitly read the modes and write the
+ flags.
+<p><!--para 2 -->
+ Concern about side effects may inhibit code motion and removal of seemingly useless
+ code. For example, in
+<pre>
+          #include <a href="#7.6">&lt;fenv.h&gt;</a>
+          #pragma STDC FENV_ACCESS ON
+          void f(double x)
+          {
+               /* ... */
+               for (i = 0; i &lt; n; i++) x + 1;
+               /* ... */
+          }
+</pre>
+ x + 1 might raise floating-point exceptions, so cannot be removed. And since the loop
+ body might not execute (maybe 0 &gt;= n), x + 1 cannot be moved out of the loop. (Of
+ course these optimizations are valid if the implementation can rule out the nettlesome
+ cases.)
+<p><!--para 3 -->
+ This specification does not require support for trap handlers that maintain information
+ about the order or count of floating-point exceptions. Therefore, between function calls,
+ floating-point exceptions need not be precise: the actual order and number of occurrences
+ of floating-point exceptions (&gt; 1) may vary from what the source code expresses. Thus,
+ the preceding loop could be treated as
+<!--page 464 -->
+<pre>
+         if (0 &lt; n) x + 1;
+</pre>
+
+<h4><a name="F.8.2" href="#F.8.2">F.8.2 Expression transformations</a></h4>
+<p><!--para 1 -->
+ x / 2 &lt;-&gt; x * 0.5                         Although similar transformations involving inexact
+<pre>
+                                         constants generally do not yield numerically equivalent
+                                         expressions, if the constants are exact then such
+                                         transformations can be made on IEC 60559 machines
+                                         and others that round perfectly.
+</pre>
+ 1 * x and x / 1 -&gt; x                     The expressions 1 * x, x / 1, and x are equivalent
+<pre>
+                                         (on IEC 60559 machines, among others).<sup><a href="#note317"><b>317)</b></a></sup>
+</pre>
+ x / x -&gt; 1.0                             The expressions x / x and 1.0 are not equivalent if x
+<pre>
+                                         can be zero, infinite, or NaN.
+</pre>
+ x - y &lt;-&gt; x + (-y)                        The expressions x - y, x + (-y), and (-y) + x
+<pre>
+                                         are equivalent (on IEC 60559 machines, among others).
+</pre>
+ x - y &lt;-&gt; -(y - x)                        The expressions x - y and -(y - x) are not
+<pre>
+                                         equivalent because 1 - 1 is +0 but -(1 - 1) is -0 (in the
+                                         default rounding direction).<sup><a href="#note318"><b>318)</b></a></sup>
+</pre>
+ x - x -&gt; 0.0                             The expressions x - x and 0.0 are not equivalent if
+<pre>
+                                         x is a NaN or infinite.
+</pre>
+ 0 * x -&gt; 0.0                             The expressions 0 * x and 0.0 are not equivalent if
+<pre>
+                                         x is a NaN, infinite, or -0.
+</pre>
+ x + 0-&gt;x                                 The expressions x + 0 and x are not equivalent if x is
+<pre>
+                                         -0, because (-0) + (+0) yields +0 (in the default
+                                         rounding direction), not -0.
+</pre>
+ x - 0-&gt;x                                 (+0) - (+0) yields -0 when rounding is downward
+<pre>
+                                         (toward -(inf)), but +0 otherwise, and (-0) - (+0) always
+                                         yields -0; so, if the state of the FENV_ACCESS pragma
+                                         is ''off'', promising default rounding, then the
+                                         implementation can replace x - 0 by x, even if x
+</pre>
+<!--page 465 -->
+<pre>
+                                          might be zero.
+</pre>
+ -x &lt;-&gt; 0 - x                               The expressions -x and 0 - x are not equivalent if x
+<pre>
+                                          is +0, because -(+0) yields -0, but 0 - (+0) yields +0
+                                          (unless rounding is downward).
+</pre>
+
+<p><b>Footnotes</b>
+<p><small><a name="note317" href="#note317">317)</a> Strict support for signaling NaNs -- not required by this specification -- would invalidate these and
+ other transformations that remove arithmetic operators.
+</small>
+<p><small><a name="note318" href="#note318">318)</a> IEC 60559 prescribes a signed zero to preserve mathematical identities across certain discontinuities.
+ Examples include:
+
+<pre>
+    1/(1/ (+-) (inf)) is (+-) (inf)
+</pre>
+ and
+
+<pre>
+    conj(csqrt(z)) is csqrt(conj(z)),
+</pre>
+ for complex z.
+</small>
+
+<h4><a name="F.8.3" href="#F.8.3">F.8.3 Relational operators</a></h4>
+<p><!--para 1 -->
+ x != x -&gt; false                           The statement x != x is true if x is a NaN.
+ x == x -&gt; true                            The statement x == x is false if x is a NaN.
+ x &lt; y -&gt; isless(x,y)                      (and similarly for &lt;=, &gt;, &gt;=) Though numerically
+<pre>
+                                          equal, these expressions are not equivalent because of
+                                          side effects when x or y is a NaN and the state of the
+                                          FENV_ACCESS pragma is ''on''. This transformation,
+                                          which would be desirable if extra code were required to
+                                          cause the ''invalid'' floating-point exception for
+                                          unordered cases, could be performed provided the state
+                                          of the FENV_ACCESS pragma is ''off''.
+</pre>
+ The sense of relational operators shall be maintained. This includes handling unordered
+ cases as expressed by the source code.
+<p><!--para 2 -->
+ EXAMPLE
+<pre>
+          // calls g and raises ''invalid'' if a and b are unordered
+          if (a &lt; b)
+                  f();
+          else
+                  g();
+</pre>
+ is not equivalent to
+<pre>
+          // calls f and raises ''invalid'' if a and b are unordered
+          if (a &gt;= b)
+                  g();
+          else
+                  f();
+</pre>
+ nor to
+<pre>
+          // calls f without raising ''invalid'' if a and b are unordered
+          if (isgreaterequal(a,b))
+                  g();
+          else
+                  f();
+</pre>
+ nor, unless the state of the FENV_ACCESS pragma is ''off'', to
+<!--page 466 -->
+<pre>
+          // calls g without raising ''invalid'' if a and b are unordered
+          if (isless(a,b))
+                  f();
+          else
+                  g();
+</pre>
+ but is equivalent to
+<pre>
+          if (!(a &lt; b))
+                g();
+          else
+                f();
+</pre>
+
+<h4><a name="F.8.4" href="#F.8.4">F.8.4 Constant arithmetic</a></h4>
+<p><!--para 1 -->
+ The implementation shall honor floating-point exceptions raised by execution-time
+ constant arithmetic wherever the state of the FENV_ACCESS pragma is ''on''. (See <a href="#F.7.4">F.7.4</a>
+ and <a href="#F.7.5">F.7.5</a>.) An operation on constants that raises no floating-point exception can be
+ folded during translation, except, if the state of the FENV_ACCESS pragma is ''on'', a
+ further check is required to assure that changing the rounding direction to downward does
+ not alter the sign of the result,<sup><a href="#note319"><b>319)</b></a></sup> and implementations that support dynamic rounding
+ precision modes shall assure further that the result of the operation raises no floating-
+ point exception when converted to the semantic type of the operation.
+
+<p><b>Footnotes</b>
+<p><small><a name="note319" href="#note319">319)</a> 0 - 0 yields -0 instead of +0 just when the rounding direction is downward.
+</small>
+
+<h3><a name="F.9" href="#F.9">F.9 Mathematics &lt;math.h&gt;</a></h3>
+<p><!--para 1 -->
+ This subclause contains specifications of <a href="#7.12">&lt;math.h&gt;</a> facilities that are particularly suited
+ for IEC 60559 implementations.
+<p><!--para 2 -->
+ The Standard C macro HUGE_VAL and its float and long double analogs,
+ HUGE_VALF and HUGE_VALL, expand to expressions whose values are positive
+ infinities.
+<p><!--para 3 -->
+ Special cases for functions in <a href="#7.12">&lt;math.h&gt;</a> are covered directly or indirectly by
+ IEC 60559. The functions that IEC 60559 specifies directly are identified in <a href="#F.3">F.3</a>. The
+ other functions in <a href="#7.12">&lt;math.h&gt;</a> treat infinities, NaNs, signed zeros, subnormals, and
+ (provided the state of the FENV_ACCESS pragma is ''on'') the floating-point status flags
+ in a manner consistent with the basic arithmetic operations covered by IEC 60559.
+<p><!--para 4 -->
+ The expression math_errhandling &amp; MATH_ERREXCEPT shall evaluate to a
+ nonzero value.
+<p><!--para 5 -->
+ The ''invalid'' and ''divide-by-zero'' floating-point exceptions are raised as specified in
+ subsequent subclauses of this annex.
+<p><!--para 6 -->
+ The ''overflow'' floating-point exception is raised whenever an infinity -- or, because of
+ rounding direction, a maximal-magnitude finite number -- is returned in lieu of a value
+<!--page 467 -->
+ whose magnitude is too large.
+<p><!--para 7 -->
+ The ''underflow'' floating-point exception is raised whenever a result is tiny (essentially
+ subnormal or zero) and suffers loss of accuracy.<sup><a href="#note320"><b>320)</b></a></sup>
+<p><!--para 8 -->
+ Whether or when library functions raise the ''inexact'' floating-point exception is
+ unspecified, unless explicitly specified otherwise.
+<p><!--para 9 -->
+ Whether or when library functions raise an undeserved ''underflow'' floating-point
+ exception is unspecified.<sup><a href="#note321"><b>321)</b></a></sup> Otherwise, as implied by <a href="#F.7.6">F.7.6</a>, the <a href="#7.12">&lt;math.h&gt;</a> functions do
+ not raise spurious floating-point exceptions (detectable by the user), other than the
+ ''inexact'' floating-point exception.
+<p><!--para 10 -->
+ Whether the functions honor the rounding direction mode is implementation-defined,
+ unless explicitly specified otherwise.
+<p><!--para 11 -->
+ Functions with a NaN argument return a NaN result and raise no floating-point exception,
+ except where stated otherwise.
+<p><!--para 12 -->
+ The specifications in the following subclauses append to the definitions in <a href="#7.12">&lt;math.h&gt;</a>.
+ For families of functions, the specifications apply to all of the functions even though only
+ the principal function is shown. Unless otherwise specified, where the symbol ''(+-)''
+ occurs in both an argument and the result, the result has the same sign as the argument.
+<p><b>Recommended practice</b>
+<p><!--para 13 -->
+ If a function with one or more NaN arguments returns a NaN result, the result should be
+ the same as one of the NaN arguments (after possible type conversion), except perhaps
+ for the sign.
+
+<p><b>Footnotes</b>
+<p><small><a name="note320" href="#note320">320)</a> IEC 60559 allows different definitions of underflow. They all result in the same values, but differ on
+ when the floating-point exception is raised.
+</small>
+<p><small><a name="note321" href="#note321">321)</a> It is intended that undeserved ''underflow'' and ''inexact'' floating-point exceptions are raised only if
+ avoiding them would be too costly.
+</small>
+
+<h4><a name="F.9.1" href="#F.9.1">F.9.1 Trigonometric functions</a></h4>
+
+<h5><a name="F.9.1.1" href="#F.9.1.1">F.9.1.1 The acos functions</a></h5>
+<p><!--para 1 -->
+<ul>
+<li>  acos(1) returns +0.
+<li>  acos(x) returns a NaN and raises the ''invalid'' floating-point exception for
+ | x | &gt; 1.
+<!--page 468 -->
+</ul>
+
+<h5><a name="F.9.1.2" href="#F.9.1.2">F.9.1.2 The asin functions</a></h5>
+<p><!--para 1 -->
+<ul>
+<li>  asin((+-)0) returns (+-)0.
+<li>  asin(x) returns a NaN and raises the ''invalid'' floating-point exception for
+ | x | &gt; 1.
+</ul>
+
+<h5><a name="F.9.1.3" href="#F.9.1.3">F.9.1.3 The atan functions</a></h5>
+<p><!--para 1 -->
+<ul>
+<li>  atan((+-)0) returns (+-)0.
+<li>  atan((+-)(inf)) returns (+-)pi /2.
+</ul>
+
+<h5><a name="F.9.1.4" href="#F.9.1.4">F.9.1.4 The atan2 functions</a></h5>
+<p><!--para 1 -->
+<ul>
+<li>  atan2((+-)0, -0) returns (+-)pi .<sup><a href="#note322"><b>322)</b></a></sup>
+<li>  atan2((+-)0, +0) returns (+-)0.
+<li>  atan2((+-)0, x) returns (+-)pi for x &lt; 0.
+<li>  atan2((+-)0, x) returns (+-)0 for x &gt; 0.
+<li>  atan2(y, (+-)0) returns -pi /2 for y &lt; 0.
+<li>  atan2(y, (+-)0) returns pi /2 for y &gt; 0.
+<li>  atan2((+-)y, -(inf)) returns (+-)pi for finite y &gt; 0.
+<li>  atan2((+-)y, +(inf)) returns (+-)0 for finite y &gt; 0.
+<li>  atan2((+-)(inf), x) returns (+-)pi /2 for finite x.
+<li>  atan2((+-)(inf), -(inf)) returns (+-)3pi /4.
+<li>  atan2((+-)(inf), +(inf)) returns (+-)pi /4.
+</ul>
+
+<p><b>Footnotes</b>
+<p><small><a name="note322" href="#note322">322)</a> atan2(0, 0) does not raise the ''invalid'' floating-point exception, nor does atan2( y ,    0) raise
+ the ''divide-by-zero'' floating-point exception.
+</small>
+
+<h5><a name="F.9.1.5" href="#F.9.1.5">F.9.1.5 The cos functions</a></h5>
+<p><!--para 1 -->
+<ul>
+<li>  cos((+-)0) returns 1.
+<li>  cos((+-)(inf)) returns a NaN and raises the ''invalid'' floating-point exception.
+</ul>
+
+<h5><a name="F.9.1.6" href="#F.9.1.6">F.9.1.6 The sin functions</a></h5>
+<p><!--para 1 -->
+<ul>
+<li>  sin((+-)0) returns (+-)0.
+<li>  sin((+-)(inf)) returns a NaN and raises the ''invalid'' floating-point exception.
+<!--page 469 -->
+</ul>
+
+<h5><a name="F.9.1.7" href="#F.9.1.7">F.9.1.7 The tan functions</a></h5>
+<p><!--para 1 -->
+<ul>
+<li>  tan((+-)0) returns (+-)0.
+<li>  tan((+-)(inf)) returns a NaN and raises the ''invalid'' floating-point exception.
+</ul>
+
+<h4><a name="F.9.2" href="#F.9.2">F.9.2 Hyperbolic functions</a></h4>
+
+<h5><a name="F.9.2.1" href="#F.9.2.1">F.9.2.1 The acosh functions</a></h5>
+<p><!--para 1 -->
+<ul>
+<li>  acosh(1) returns +0.
+<li>  acosh(x) returns a NaN and raises the ''invalid'' floating-point exception for x &lt; 1.
+<li>  acosh(+(inf)) returns +(inf).
+</ul>
+
+<h5><a name="F.9.2.2" href="#F.9.2.2">F.9.2.2 The asinh functions</a></h5>
+<p><!--para 1 -->
+<ul>
+<li>  asinh((+-)0) returns (+-)0.
+<li>  asinh((+-)(inf)) returns (+-)(inf).
+</ul>
+
+<h5><a name="F.9.2.3" href="#F.9.2.3">F.9.2.3 The atanh functions</a></h5>
+<p><!--para 1 -->
+<ul>
+<li>  atanh((+-)0) returns (+-)0.
+<li>  atanh((+-)1) returns (+-)(inf) and raises the ''divide-by-zero'' floating-point exception.
+<li>  atanh(x) returns a NaN and raises the ''invalid'' floating-point exception for
+ | x | &gt; 1.
+</ul>
+
+<h5><a name="F.9.2.4" href="#F.9.2.4">F.9.2.4 The cosh functions</a></h5>
+<p><!--para 1 -->
+<ul>
+<li>  cosh((+-)0) returns 1.
+<li>  cosh((+-)(inf)) returns +(inf).
+</ul>
+
+<h5><a name="F.9.2.5" href="#F.9.2.5">F.9.2.5 The sinh functions</a></h5>
+<p><!--para 1 -->
+<ul>
+<li>  sinh((+-)0) returns (+-)0.
+<li>  sinh((+-)(inf)) returns (+-)(inf).
+</ul>
+
+<h5><a name="F.9.2.6" href="#F.9.2.6">F.9.2.6 The tanh functions</a></h5>
+<p><!--para 1 -->
+<ul>
+<li>  tanh((+-)0) returns (+-)0.
+<li>  tanh((+-)(inf)) returns (+-)1.
+<!--page 470 -->
+</ul>
+
+<h4><a name="F.9.3" href="#F.9.3">F.9.3 Exponential and logarithmic functions</a></h4>
+
+<h5><a name="F.9.3.1" href="#F.9.3.1">F.9.3.1 The exp functions</a></h5>
+<p><!--para 1 -->
+<ul>
+<li>  exp((+-)0) returns 1.
+<li>  exp(-(inf)) returns +0.
+<li>  exp(+(inf)) returns +(inf).
+</ul>
+
+<h5><a name="F.9.3.2" href="#F.9.3.2">F.9.3.2 The exp2 functions</a></h5>
+<p><!--para 1 -->
+<ul>
+<li>  exp2((+-)0) returns 1.
+<li>  exp2(-(inf)) returns +0.
+<li>  exp2(+(inf)) returns +(inf).
+</ul>
+
+<h5><a name="F.9.3.3" href="#F.9.3.3">F.9.3.3 The expm1 functions</a></h5>
+<p><!--para 1 -->
+<ul>
+<li>  expm1((+-)0) returns (+-)0.
+<li>  expm1(-(inf)) returns -1.
+<li>  expm1(+(inf)) returns +(inf).
+</ul>
+
+<h5><a name="F.9.3.4" href="#F.9.3.4">F.9.3.4 The frexp functions</a></h5>
+<p><!--para 1 -->
+<ul>
+<li>  frexp((+-)0, exp) returns (+-)0, and stores 0 in the object pointed to by exp.
+<li>  frexp((+-)(inf), exp) returns (+-)(inf), and stores an unspecified value in the object
+ pointed to by exp.
+<li>  frexp(NaN, exp) stores an unspecified value in the object pointed to by exp
+ (and returns a NaN).
+</ul>
+<p><!--para 2 -->
+ frexp raises no floating-point exceptions.
+<p><!--para 3 -->
+ On a binary system, the body of the frexp function might be
+<pre>
+        {
+               *exp = (value == 0) ? 0 : (int)(1 + logb(value));
+               return scalbn(value, -(*exp));
+        }
+</pre>
+
+<h5><a name="F.9.3.5" href="#F.9.3.5">F.9.3.5 The ilogb functions</a></h5>
+<p><!--para 1 -->
+ If the correct result is outside the range of the return type, the numeric result is
+ unspecified and the ''invalid'' floating-point exception is raised.
+<!--page 471 -->
+
+<h5><a name="F.9.3.6" href="#F.9.3.6">F.9.3.6 The ldexp functions</a></h5>
+<p><!--para 1 -->
+ On a binary system, ldexp(x, exp) is equivalent to scalbn(x, exp).
+
+<h5><a name="F.9.3.7" href="#F.9.3.7">F.9.3.7 The log functions</a></h5>
+<p><!--para 1 -->
+<ul>
+<li>  log((+-)0) returns -(inf) and raises the ''divide-by-zero'' floating-point exception.
+<li>  log(1) returns +0.
+<li>  log(x) returns a NaN and raises the ''invalid'' floating-point exception for x &lt; 0.
+<li>  log(+(inf)) returns +(inf).
+</ul>
+
+<h5><a name="F.9.3.8" href="#F.9.3.8">F.9.3.8 The log10 functions</a></h5>
+<p><!--para 1 -->
+<ul>
+<li>  log10((+-)0) returns -(inf) and raises the ''divide-by-zero'' floating-point exception.
+<li>  log10(1) returns +0.
+<li>  log10(x) returns a NaN and raises the ''invalid'' floating-point exception for x &lt; 0.
+<li>  log10(+(inf)) returns +(inf).
+</ul>
+
+<h5><a name="F.9.3.9" href="#F.9.3.9">F.9.3.9 The log1p functions</a></h5>
+<p><!--para 1 -->
+<ul>
+<li>  log1p((+-)0) returns (+-)0.
+<li>  log1p(-1) returns -(inf) and raises the ''divide-by-zero'' floating-point exception.
+<li>  log1p(x) returns a NaN and raises the ''invalid'' floating-point exception for
+ x &lt; -1.
+<li>  log1p(+(inf)) returns +(inf).
+</ul>
+
+<h5><a name="F.9.3.10" href="#F.9.3.10">F.9.3.10 The log2 functions</a></h5>
+<p><!--para 1 -->
+<ul>
+<li>  log2((+-)0) returns -(inf) and raises the ''divide-by-zero'' floating-point exception.
+<li>  log2(1) returns +0.
+<li>  log2(x) returns a NaN and raises the ''invalid'' floating-point exception for x &lt; 0.
+<li>  log2(+(inf)) returns +(inf).
+</ul>
+
+<h5><a name="F.9.3.11" href="#F.9.3.11">F.9.3.11 The logb functions</a></h5>
+<p><!--para 1 -->
+<ul>
+<li>  logb((+-)0) returns -(inf) and raises the ''divide-by-zero'' floating-point exception.
+<li>  logb((+-)(inf)) returns +(inf).
+<!--page 472 -->
+</ul>
+
+<h5><a name="F.9.3.12" href="#F.9.3.12">F.9.3.12 The modf functions</a></h5>
+<p><!--para 1 -->
+<ul>
+<li>  modf((+-)x, iptr) returns a result with the same sign as x.
+<li>  modf((+-)(inf), iptr) returns (+-)0 and stores (+-)(inf) in the object pointed to by iptr.
+<li>  modf(NaN, iptr) stores a NaN in the object pointed to by iptr (and returns a
+ NaN).
+</ul>
+<p><!--para 2 -->
+ modf behaves as though implemented by
+<pre>
+       #include <a href="#7.12">&lt;math.h&gt;</a>
+       #include <a href="#7.6">&lt;fenv.h&gt;</a>
+       #pragma STDC FENV_ACCESS ON
+       double modf(double value, double *iptr)
+       {
+            int save_round = fegetround();
+            fesetround(FE_TOWARDZERO);
+            *iptr = nearbyint(value);
+            fesetround(save_round);
+            return copysign(
+                 isinf(value) ? 0.0 :
+                      value - (*iptr), value);
+       }
+</pre>
+
+<h5><a name="F.9.3.13" href="#F.9.3.13">F.9.3.13 The scalbn and scalbln functions</a></h5>
+<p><!--para 1 -->
+<ul>
+<li>  scalbn((+-)0, n) returns (+-)0.
+<li>  scalbn(x, 0) returns x.
+<li>  scalbn((+-)(inf), n) returns (+-)(inf).
+</ul>
+
+<h4><a name="F.9.4" href="#F.9.4">F.9.4 Power and absolute value functions</a></h4>
+
+<h5><a name="F.9.4.1" href="#F.9.4.1">F.9.4.1 The cbrt functions</a></h5>
+<p><!--para 1 -->
+<ul>
+<li>  cbrt((+-)0) returns (+-)0.
+<li>  cbrt((+-)(inf)) returns (+-)(inf).
+</ul>
+
+<h5><a name="F.9.4.2" href="#F.9.4.2">F.9.4.2 The fabs functions</a></h5>
+<p><!--para 1 -->
+<ul>
+<li>  fabs((+-)0) returns +0.
+<li>  fabs((+-)(inf)) returns +(inf).
+<!--page 473 -->
+</ul>
+
+<h5><a name="F.9.4.3" href="#F.9.4.3">F.9.4.3 The hypot functions</a></h5>
+<p><!--para 1 -->
+<ul>
+<li>  hypot(x, y), hypot(y, x), and hypot(x, -y) are equivalent.
+<li>  hypot(x, (+-)0) is equivalent to fabs(x).
+<li>  hypot((+-)(inf), y) returns +(inf), even if y is a NaN.
+</ul>
+
+<h5><a name="F.9.4.4" href="#F.9.4.4">F.9.4.4 The pow functions</a></h5>
+<p><!--para 1 -->
+<ul>
+<li>  pow((+-)0, y) returns (+-)(inf) and raises the ''divide-by-zero'' floating-point exception
+ for y an odd integer &lt; 0.
+<li>  pow((+-)0, y) returns +(inf) and raises the ''divide-by-zero'' floating-point exception
+ for y &lt; 0 and not an odd integer.
+<li>  pow((+-)0, y) returns (+-)0 for y an odd integer &gt; 0.
+<li>  pow((+-)0, y) returns +0 for y &gt; 0 and not an odd integer.
+<li>  pow(-1, (+-)(inf)) returns 1.
+<li>  pow(+1, y) returns 1 for any y, even a NaN.
+<li>  pow(x, (+-)0) returns 1 for any x, even a NaN.
+<li>  pow(x, y) returns a NaN and raises the ''invalid'' floating-point exception for
+ finite x &lt; 0 and finite non-integer y.
+<li>  pow(x, -(inf)) returns +(inf) for | x | &lt; 1.
+<li>  pow(x, -(inf)) returns +0 for | x | &gt; 1.
+<li>  pow(x, +(inf)) returns +0 for | x | &lt; 1.
+<li>  pow(x, +(inf)) returns +(inf) for | x | &gt; 1.
+<li>  pow(-(inf), y) returns -0 for y an odd integer &lt; 0.
+<li>  pow(-(inf), y) returns +0 for y &lt; 0 and not an odd integer.
+<li>  pow(-(inf), y) returns -(inf) for y an odd integer &gt; 0.
+<li>  pow(-(inf), y) returns +(inf) for y &gt; 0 and not an odd integer.
+<li>  pow(+(inf), y) returns +0 for y &lt; 0.
+<li>  pow(+(inf), y) returns +(inf) for y &gt; 0.
+<!--page 474 -->
+</ul>
+
+<h5><a name="F.9.4.5" href="#F.9.4.5">F.9.4.5 The sqrt functions</a></h5>
+<p><!--para 1 -->
+ sqrt is fully specified as a basic arithmetic operation in IEC 60559.
+
+<h4><a name="F.9.5" href="#F.9.5">F.9.5 Error and gamma functions</a></h4>
+
+<h5><a name="F.9.5.1" href="#F.9.5.1">F.9.5.1 The erf functions</a></h5>
+<p><!--para 1 -->
+<ul>
+<li>  erf((+-)0) returns (+-)0.
+<li>  erf((+-)(inf)) returns (+-)1.
+</ul>
+
+<h5><a name="F.9.5.2" href="#F.9.5.2">F.9.5.2 The erfc functions</a></h5>
+<p><!--para 1 -->
+<ul>
+<li>  erfc(-(inf)) returns 2.
+<li>  erfc(+(inf)) returns +0.
+</ul>
+
+<h5><a name="F.9.5.3" href="#F.9.5.3">F.9.5.3 The lgamma functions</a></h5>
+<p><!--para 1 -->
+<ul>
+<li>  lgamma(1) returns +0.
+<li>  lgamma(2) returns +0.
+<li>  lgamma(x) returns +(inf) and raises the ''divide-by-zero'' floating-point exception for
+ x a negative integer or zero.
+<li>  lgamma(-(inf)) returns +(inf).
+<li>  lgamma(+(inf)) returns +(inf).
+</ul>
+
+<h5><a name="F.9.5.4" href="#F.9.5.4">F.9.5.4 The tgamma functions</a></h5>
+<p><!--para 1 -->
+<ul>
+<li>  tgamma((+-)0) returns (+-)(inf) and raises the ''divide-by-zero'' floating-point exception.
+<li>  tgamma(x) returns a NaN and raises the ''invalid'' floating-point exception for x a
+ negative integer.
+<li>  tgamma(-(inf)) returns a NaN and raises the ''invalid'' floating-point exception.
+<li>  tgamma(+(inf)) returns +(inf).
+</ul>
+
+<h4><a name="F.9.6" href="#F.9.6">F.9.6 Nearest integer functions</a></h4>
+
+<h5><a name="F.9.6.1" href="#F.9.6.1">F.9.6.1 The ceil functions</a></h5>
+<p><!--para 1 -->
+<ul>
+<li>  ceil((+-)0) returns (+-)0.
+<li>  ceil((+-)(inf)) returns (+-)(inf).
+</ul>
+<p><!--para 2 -->
+ The double version of ceil behaves as though implemented by
+<!--page 475 -->
+<pre>
+        #include <a href="#7.12">&lt;math.h&gt;</a>
+        #include <a href="#7.6">&lt;fenv.h&gt;</a>
+        #pragma STDC FENV_ACCESS ON
+        double ceil(double x)
+        {
+             double result;
+             int save_round = fegetround();
+             fesetround(FE_UPWARD);
+             result = rint(x); // or nearbyint instead of rint
+             fesetround(save_round);
+             return result;
+        }
+</pre>
+
+<h5><a name="F.9.6.2" href="#F.9.6.2">F.9.6.2 The floor functions</a></h5>
+<p><!--para 1 -->
+<ul>
+<li>  floor((+-)0) returns (+-)0.
+<li>  floor((+-)(inf)) returns (+-)(inf).
+</ul>
+<p><!--para 2 -->
+ See the sample implementation for ceil in <a href="#F.9.6.1">F.9.6.1</a>.
+
+<h5><a name="F.9.6.3" href="#F.9.6.3">F.9.6.3 The nearbyint functions</a></h5>
+<p><!--para 1 -->
+ The nearbyint functions use IEC 60559 rounding according to the current rounding
+ direction. They do not raise the ''inexact'' floating-point exception if the result differs in
+ value from the argument.
+<ul>
+<li>  nearbyint((+-)0) returns (+-)0 (for all rounding directions).
+<li>  nearbyint((+-)(inf)) returns (+-)(inf) (for all rounding directions).
+</ul>
+
+<h5><a name="F.9.6.4" href="#F.9.6.4">F.9.6.4 The rint functions</a></h5>
+<p><!--para 1 -->
+ The rint functions differ from the nearbyint functions only in that they do raise the
+ ''inexact'' floating-point exception if the result differs in value from the argument.
+
+<h5><a name="F.9.6.5" href="#F.9.6.5">F.9.6.5 The lrint and llrint functions</a></h5>
+<p><!--para 1 -->
+ The lrint and llrint functions provide floating-to-integer conversion as prescribed
+ by IEC 60559. They round according to the current rounding direction. If the rounded
+ value is outside the range of the return type, the numeric result is unspecified and the
+ ''invalid'' floating-point exception is raised. When they raise no other floating-point
+ exception and the result differs from the argument, they raise the ''inexact'' floating-point
+ exception.
+<!--page 476 -->
+
+<h5><a name="F.9.6.6" href="#F.9.6.6">F.9.6.6 The round functions</a></h5>
+<p><!--para 1 -->
+<ul>
+<li>  round((+-)0) returns (+-)0.
+<li>  round((+-)(inf)) returns (+-)(inf).
+</ul>
+<p><!--para 2 -->
+ The double version of round behaves as though implemented by
+<pre>
+        #include <a href="#7.12">&lt;math.h&gt;</a>
+        #include <a href="#7.6">&lt;fenv.h&gt;</a>
+        #pragma STDC FENV_ACCESS ON
+        double round(double x)
+        {
+             double result;
+             fenv_t save_env;
+             feholdexcept(&amp;save_env);
+             result = rint(x);
+             if (fetestexcept(FE_INEXACT)) {
+                  fesetround(FE_TOWARDZERO);
+                  result = rint(copysign(0.5 + fabs(x), x));
              }
-7   This implementation achieves the required treatment of infinities at the cost of only one isnan test in
-    ordinary (finite) cases. It is less than ideal in that undue overflow and underflow may occur.
-
-8   EXAMPLE 2      Division of two double _Complex operands could be implemented as follows.
-             #include <a href="#7.12">&lt;math.h&gt;</a>
-             #include <a href="#7.3">&lt;complex.h&gt;</a>
-             /* Divide z / w ... */
-             double complex _Cdivd(double complex z, double complex w)
-             {
-                    #pragma STDC FP_CONTRACT OFF
-                    double a, b, c, d, logbw, denom, x, y;
-                    int ilogbw = 0;
-                    a = creal(z); b = cimag(z);
-                    c = creal(w); d = cimag(w);
-                    logbw = logb(fmax(fabs(c), fabs(d)));
-                    if (isfinite(logbw)) {
-                           ilogbw = (int)logbw;
-                           c = scalbn(c, -ilogbw); d = scalbn(d, -ilogbw);
-                    }
-                    denom = c * c + d * d;
-                    x = scalbn((a * c + b * d) / denom, -ilogbw);
-                    y = scalbn((b * c - a * d) / denom, -ilogbw);
-                     /* Recover infinities and zeros that computed as NaN+iNaN;                 */
-                     /* the only cases are nonzero/zero, infinite/finite, and finite/infinite, ... */
-                     if (isnan(x) &amp;&amp; isnan(y)) {
-                           if ((denom == 0.0) &amp;&amp;
-                                 (!isnan(a) || !isnan(b))) {
-                                 x = copysign(INFINITY, c) * a;
-                                 y = copysign(INFINITY, c) * b;
-                           }
-                           else if ((isinf(a) || isinf(b)) &amp;&amp;
-                                 isfinite(c) &amp;&amp; isfinite(d)) {
-                                 a = copysign(isinf(a) ? 1.0 : 0.0,                        a);
-                                 b = copysign(isinf(b) ? 1.0 : 0.0,                        b);
-                                 x = INFINITY * ( a * c + b * d );
-                                 y = INFINITY * ( b * c - a * d );
-                           }
-                           else if (isinf(logbw) &amp;&amp;
-                                 isfinite(a) &amp;&amp; isfinite(b)) {
-                                 c = copysign(isinf(c) ? 1.0 : 0.0,                        c);
-                                 d = copysign(isinf(d) ? 1.0 : 0.0,                        d);
-                                 x = 0.0 * ( a * c + b * d );
-                                 y = 0.0 * ( b * c - a * d );
-
-[<a name="p471" href="#p471">page 471</a>] (<a href="#Contents">Contents</a>)
-
-                           }
-                     }
-                     return x + I * y;
-            }
-9   Scaling the denominator alleviates the main overflow and underflow problem, which is more serious than
-    for multiplication. In the spirit of the multiplication example above, this code does not defend against
-    overflow and underflow in the calculation of the numerator. Scaling with the scalbn function, instead of
-    with division, provides better roundoff characteristics.
-
-<a name="G.5.2" href="#G.5.2"><b>    G.5.2 Additive operators</b></a>
-    Semantics
-1   If both operands have imaginary type, then the result has imaginary type. (If one operand
-    has real type and the other operand has imaginary type, or if either operand has complex
-    type, then the result has complex type.)
-2   In all cases the result and floating-point exception behavior of a + or - operator is defined
-    by the usual mathematical formula:
-           + or -              u                       iv                    u + iv
-
-           x                 x(+-)u                     x (+-) iv              (x (+-) u) (+-) iv
-
-           iy               (+-)u + iy                 i(y (+-) v)             (+-)u + i(y (+-) v)
-
-           x + iy         (x (+-) u) + iy            x + i(y (+-) v)        (x (+-) u) + i(y (+-) v)
-<a name="G.6" href="#G.6"><b>    G.6 Complex arithmetic &lt;complex.h&gt;</b></a>
-1   The macros
-            imaginary
-    and
-            _Imaginary_I
-    are defined, respectively, as _Imaginary and a constant expression of type const
-    float _Imaginary with the value of the imaginary unit. The macro
-            I
-    is defined to be _Imaginary_I (not _Complex_I as stated in <a href="#7.3">7.3</a>). Notwithstanding
-    the provisions of <a href="#7.1.3">7.1.3</a>, a program may undefine and then perhaps redefine the macro
-    imaginary.
-2   This subclause contains specifications for the <a href="#7.3">&lt;complex.h&gt;</a> functions that are
-    particularly suited to IEC 60559 implementations. For families of functions, the
-    specifications apply to all of the functions even though only the principal function is
-
-[<a name="p472" href="#p472">page 472</a>] (<a href="#Contents">Contents</a>)
-
-    shown. Unless otherwise specified, where the symbol ''(+-)'' occurs in both an argument
-    and the result, the result has the same sign as the argument.
-3   The functions are continuous onto both sides of their branch cuts, taking into account the
-    sign of zero. For example, csqrt(-2 (+-) i0) = (+-)isqrt:2.  ???
-4   Since complex and imaginary values are composed of real values, each function may be
-    regarded as computing real values from real values. Except as noted, the functions treat
-    real infinities, NaNs, signed zeros, subnormals, and the floating-point exception flags in a
-    manner consistent with the specifications for real functions in F.9.326)
-5   The functions cimag, conj, cproj, and creal are fully specified for all
-    implementations, including IEC 60559 ones, in <a href="#7.3.9">7.3.9</a>. These functions raise no floating-
-    point exceptions.
-6   Each of the functions cabs and carg is specified by a formula in terms of a real
-    function (whose special cases are covered in <a href="#F">annex F</a>):
-            cabs(x + iy) = hypot(x, y)
-            carg(x + iy) = atan2(y, x)
-7   Each of the functions casin, catan, ccos, csin, and ctan is specified implicitly by
-    a formula in terms of other complex functions (whose special cases are specified below):
-            casin(z)        =   -i casinh(iz)
-            catan(z)        =   -i catanh(iz)
-            ccos(z)         =   ccosh(iz)
-            csin(z)         =   -i csinh(iz)
-            ctan(z)         =   -i ctanh(iz)
-8   For the other functions, the following subclauses specify behavior for special cases,
-    including treatment of the ''invalid'' and ''divide-by-zero'' floating-point exceptions. For
-    families of functions, the specifications apply to all of the functions even though only the
-    principal function is shown. For a function f satisfying f (conj(z)) = conj( f (z)), the
-    specifications for the upper half-plane imply the specifications for the lower half-plane; if
-    the function f is also either even, f (-z) = f (z), or odd, f (-z) = - f (z), then the
-    specifications for the first quadrant imply the specifications for the other three quadrants.
-9   In the following subclauses, cis(y) is defined as cos(y) + i sin(y).
-
-
-
-
-    326) As noted in <a href="#G.3">G.3</a>, a complex value with at least one infinite part is regarded as an infinity even if its
-         other part is a NaN.
-
-[<a name="p473" href="#p473">page 473</a>] (<a href="#Contents">Contents</a>)
-
-<a name="G.6.1" href="#G.6.1"><b>    G.6.1 Trigonometric functions</b></a>
-<a name="G.6.1.1" href="#G.6.1.1"><b>    G.6.1.1 The cacos functions</b></a>
-1   -- cacos(conj(z)) = conj(cacos(z)).
-    -- cacos((+-)0 + i0) returns pi /2 - i0.
-    -- cacos((+-)0 + iNaN) returns pi /2 + iNaN.
-    -- cacos(x + i (inf)) returns pi /2 - i (inf), for finite x.
-    -- cacos(x + iNaN) returns NaN + iNaN and optionally raises the ''invalid'' floating-
-      point exception, for nonzero finite x.
-    -- cacos(-(inf) + iy) returns pi - i (inf), for positive-signed finite y.
-    -- cacos(+(inf) + iy) returns +0 - i (inf), for positive-signed finite y.
-    -- cacos(-(inf) + i (inf)) returns 3pi /4 - i (inf).
-    -- cacos(+(inf) + i (inf)) returns pi /4 - i (inf).
-    -- cacos((+-)(inf) + iNaN) returns NaN (+-) i (inf) (where the sign of the imaginary part of the
-      result is unspecified).
-    -- cacos(NaN + iy) returns NaN + iNaN and optionally raises the ''invalid'' floating-
-      point exception, for finite y.
-    -- cacos(NaN + i (inf)) returns NaN - i (inf).
-    -- cacos(NaN + iNaN) returns NaN + iNaN.
-<a name="G.6.2" href="#G.6.2"><b>    G.6.2 Hyperbolic functions</b></a>
-<a name="G.6.2.1" href="#G.6.2.1"><b>    G.6.2.1 The cacosh functions</b></a>
-1   -- cacosh(conj(z)) = conj(cacosh(z)).
-    -- cacosh((+-)0 + i0) returns +0 + ipi /2.
-    -- cacosh(x + i (inf)) returns +(inf) + ipi /2, for finite x.
-    -- cacosh(x + iNaN) returns NaN + iNaN and optionally raises the ''invalid''
-      floating-point exception, for finite x.
-    -- cacosh(-(inf) + iy) returns +(inf) + ipi , for positive-signed finite y.
-    -- cacosh(+(inf) + iy) returns +(inf) + i0, for positive-signed finite y.
-    -- cacosh(-(inf) + i (inf)) returns +(inf) + i3pi /4.
-    -- cacosh(+(inf) + i (inf)) returns +(inf) + ipi /4.
-    -- cacosh((+-)(inf) + iNaN) returns +(inf) + iNaN.
-
-
-[<a name="p474" href="#p474">page 474</a>] (<a href="#Contents">Contents</a>)
-
-    -- cacosh(NaN + iy) returns NaN + iNaN and optionally raises the ''invalid''
-      floating-point exception, for finite y.
-    -- cacosh(NaN + i (inf)) returns +(inf) + iNaN.
-    -- cacosh(NaN + iNaN) returns NaN + iNaN.
-<a name="G.6.2.2" href="#G.6.2.2"><b>    G.6.2.2 The casinh functions</b></a>
-1   -- casinh(conj(z)) = conj(casinh(z)) and casinh is odd.
-    -- casinh(+0 + i0) returns 0 + i0.
-    -- casinh(x + i (inf)) returns +(inf) + ipi /2 for positive-signed finite x.
-    -- casinh(x + iNaN) returns NaN + iNaN and optionally raises the ''invalid''
-      floating-point exception, for finite x.
-    -- casinh(+(inf) + iy) returns +(inf) + i0 for positive-signed finite y.
-    -- casinh(+(inf) + i (inf)) returns +(inf) + ipi /4.
-    -- casinh(+(inf) + iNaN) returns +(inf) + iNaN.
-    -- casinh(NaN + i0) returns NaN + i0.
-    -- casinh(NaN + iy) returns NaN + iNaN and optionally raises the ''invalid''
-      floating-point exception, for finite nonzero y.
-    -- casinh(NaN + i (inf)) returns (+-)(inf) + iNaN (where the sign of the real part of the result
-      is unspecified).
-    -- casinh(NaN + iNaN) returns NaN + iNaN.
-<a name="G.6.2.3" href="#G.6.2.3"><b>    G.6.2.3 The catanh functions</b></a>
-1   -- catanh(conj(z)) = conj(catanh(z)) and catanh is odd.
-    -- catanh(+0 + i0) returns +0 + i0.
-    -- catanh(+0 + iNaN) returns +0 + iNaN.
-    -- catanh(+1 + i0) returns +(inf) + i0 and raises the ''divide-by-zero'' floating-point
-      exception.
-    -- catanh(x + i (inf)) returns +0 + ipi /2, for finite positive-signed x.
-    -- catanh(x + iNaN) returns NaN + iNaN and optionally raises the ''invalid''
-      floating-point exception, for nonzero finite x.
-    -- catanh(+(inf) + iy) returns +0 + ipi /2, for finite positive-signed y.
-    -- catanh(+(inf) + i (inf)) returns +0 + ipi /2.
-    -- catanh(+(inf) + iNaN) returns +0 + iNaN.
-
-[<a name="p475" href="#p475">page 475</a>] (<a href="#Contents">Contents</a>)
-
-    -- catanh(NaN + iy) returns NaN + iNaN and optionally raises the ''invalid''
-      floating-point exception, for finite y.
-    -- catanh(NaN + i (inf)) returns (+-)0 + ipi /2 (where the sign of the real part of the result is
-      unspecified).
-    -- catanh(NaN + iNaN) returns NaN + iNaN.
-<a name="G.6.2.4" href="#G.6.2.4"><b>    G.6.2.4 The ccosh functions</b></a>
-1   -- ccosh(conj(z)) = conj(ccosh(z)) and ccosh is even.
-    -- ccosh(+0 + i0) returns 1 + i0.
-    -- ccosh(+0 + i (inf)) returns NaN (+-) i0 (where the sign of the imaginary part of the
-      result is unspecified) and raises the ''invalid'' floating-point exception.
-    -- ccosh(+0 + iNaN) returns NaN (+-) i0 (where the sign of the imaginary part of the
-      result is unspecified).
-    -- ccosh(x + i (inf)) returns NaN + iNaN and raises the ''invalid'' floating-point
-      exception, for finite nonzero x.
-    -- ccosh(x + iNaN) returns NaN + iNaN and optionally raises the ''invalid'' floating-
-      point exception, for finite nonzero x.
-    -- ccosh(+(inf) + i0) returns +(inf) + i0.
-    -- ccosh(+(inf) + iy) returns +(inf) cis(y), for finite nonzero y.
-    -- ccosh(+(inf) + i (inf)) returns (+-)(inf) + iNaN (where the sign of the real part of the result is
-      unspecified) and raises the ''invalid'' floating-point exception.
-    -- ccosh(+(inf) + iNaN) returns +(inf) + iNaN.
-    -- ccosh(NaN + i0) returns NaN (+-) i0 (where the sign of the imaginary part of the
-      result is unspecified).
-    -- ccosh(NaN + iy) returns NaN + iNaN and optionally raises the ''invalid'' floating-
-      point exception, for all nonzero numbers y.
-    -- ccosh(NaN + iNaN) returns NaN + iNaN.
-<a name="G.6.2.5" href="#G.6.2.5"><b>    G.6.2.5 The csinh functions</b></a>
-1   -- csinh(conj(z)) = conj(csinh(z)) and csinh is odd.
-    -- csinh(+0 + i0) returns +0 + i0.
-    -- csinh(+0 + i (inf)) returns (+-)0 + iNaN (where the sign of the real part of the result is
-      unspecified) and raises the ''invalid'' floating-point exception.
-    -- csinh(+0 + iNaN) returns (+-)0 + iNaN (where the sign of the real part of the result is
-      unspecified).
-[<a name="p476" href="#p476">page 476</a>] (<a href="#Contents">Contents</a>)
-
-    -- csinh(x + i (inf)) returns NaN + iNaN and raises the ''invalid'' floating-point
-      exception, for positive finite x.
-    -- csinh(x + iNaN) returns NaN + iNaN and optionally raises the ''invalid'' floating-
-      point exception, for finite nonzero x.
-    -- csinh(+(inf) + i0) returns +(inf) + i0.
-    -- csinh(+(inf) + iy) returns +(inf) cis(y), for positive finite y.
-    -- csinh(+(inf) + i (inf)) returns (+-)(inf) + iNaN (where the sign of the real part of the result is
-      unspecified) and raises the ''invalid'' floating-point exception.
-    -- csinh(+(inf) + iNaN) returns (+-)(inf) + iNaN (where the sign of the real part of the result
-      is unspecified).
-    -- csinh(NaN + i0) returns NaN + i0.
-    -- csinh(NaN + iy) returns NaN + iNaN and optionally raises the ''invalid'' floating-
-      point exception, for all nonzero numbers y.
-    -- csinh(NaN + iNaN) returns NaN + iNaN.
-<a name="G.6.2.6" href="#G.6.2.6"><b>    G.6.2.6 The ctanh functions</b></a>
-1   -- ctanh(conj(z)) = conj(ctanh(z))and ctanh is odd.
-    -- ctanh(+0 + i0) returns +0 + i0.
-    -- ctanh(x + i (inf)) returns NaN + iNaN and raises the ''invalid'' floating-point
-      exception, for finite x.
-    -- ctanh(x + iNaN) returns NaN + iNaN and optionally raises the ''invalid'' floating-
-      point exception, for finite x.
-    -- ctanh(+(inf) + iy) returns 1 + i0 sin(2y), for positive-signed finite y.
-    -- ctanh(+(inf) + i (inf)) returns 1 (+-) i0 (where the sign of the imaginary part of the result
-      is unspecified).
-    -- ctanh(+(inf) + iNaN) returns 1 (+-) i0 (where the sign of the imaginary part of the
-      result is unspecified).
-    -- ctanh(NaN + i0) returns NaN + i0.
-    -- ctanh(NaN + iy) returns NaN + iNaN and optionally raises the ''invalid'' floating-
-      point exception, for all nonzero numbers y.
-    -- ctanh(NaN + iNaN) returns NaN + iNaN.
-
-
-
-
-[<a name="p477" href="#p477">page 477</a>] (<a href="#Contents">Contents</a>)
-
-<a name="G.6.3" href="#G.6.3"><b>    G.6.3 Exponential and logarithmic functions</b></a>
-<a name="G.6.3.1" href="#G.6.3.1"><b>    G.6.3.1 The cexp functions</b></a>
-1   -- cexp(conj(z)) = conj(cexp(z)).
-    -- cexp((+-)0 + i0) returns 1 + i0.
-    -- cexp(x + i (inf)) returns NaN + iNaN and raises the ''invalid'' floating-point
-      exception, for finite x.
-    -- cexp(x + iNaN) returns NaN + iNaN and optionally raises the ''invalid'' floating-
-      point exception, for finite x.
-    -- cexp(+(inf) + i0) returns +(inf) + i0.
-    -- cexp(-(inf) + iy) returns +0 cis(y), for finite y.
-    -- cexp(+(inf) + iy) returns +(inf) cis(y), for finite nonzero y.
-    -- cexp(-(inf) + i (inf)) returns (+-)0 (+-) i0 (where the signs of the real and imaginary parts of
-      the result are unspecified).
-    -- cexp(+(inf) + i (inf)) returns (+-)(inf) + iNaN and raises the ''invalid'' floating-point
-      exception (where the sign of the real part of the result is unspecified).
-    -- cexp(-(inf) + iNaN) returns (+-)0 (+-) i0 (where the signs of the real and imaginary parts
-      of the result are unspecified).
-    -- cexp(+(inf) + iNaN) returns (+-)(inf) + iNaN (where the sign of the real part of the result
-      is unspecified).
-    -- cexp(NaN + i0) returns NaN + i0.
-    -- cexp(NaN + iy) returns NaN + iNaN and optionally raises the ''invalid'' floating-
-      point exception, for all nonzero numbers y.
-    -- cexp(NaN + iNaN) returns NaN + iNaN.
-<a name="G.6.3.2" href="#G.6.3.2"><b>    G.6.3.2 The clog functions</b></a>
-1   -- clog(conj(z)) = conj(clog(z)).
-    -- clog(-0 + i0) returns -(inf) + ipi and raises the ''divide-by-zero'' floating-point
-      exception.
-    -- clog(+0 + i0) returns -(inf) + i0 and raises the ''divide-by-zero'' floating-point
-      exception.
-    -- clog(x + i (inf)) returns +(inf) + ipi /2, for finite x.
-    -- clog(x + iNaN) returns NaN + iNaN and optionally raises the ''invalid'' floating-
-      point exception, for finite x.
-
-[<a name="p478" href="#p478">page 478</a>] (<a href="#Contents">Contents</a>)
-
-    -- clog(-(inf) + iy) returns +(inf) + ipi , for finite positive-signed y.
-    -- clog(+(inf) + iy) returns +(inf) + i0, for finite positive-signed y.
-    -- clog(-(inf) + i (inf)) returns +(inf) + i3pi /4.
-    -- clog(+(inf) + i (inf)) returns +(inf) + ipi /4.
-    -- clog((+-)(inf) + iNaN) returns +(inf) + iNaN.
-    -- clog(NaN + iy) returns NaN + iNaN and optionally raises the ''invalid'' floating-
-      point exception, for finite y.
-    -- clog(NaN + i (inf)) returns +(inf) + iNaN.
-    -- clog(NaN + iNaN) returns NaN + iNaN.
-<a name="G.6.4" href="#G.6.4"><b>    G.6.4 Power and absolute-value functions</b></a>
-<a name="G.6.4.1" href="#G.6.4.1"><b>    G.6.4.1 The cpow functions</b></a>
-1   The cpow functions raise floating-point exceptions if appropriate for the calculation of
-    the parts of the result, and may raise spurious exceptions.327)
-<a name="G.6.4.2" href="#G.6.4.2"><b>    G.6.4.2 The csqrt functions</b></a>
-1   -- csqrt(conj(z)) = conj(csqrt(z)).
-    -- csqrt((+-)0 + i0) returns +0 + i0.
-    -- csqrt(x + i (inf)) returns +(inf) + i (inf), for all x (including NaN).
-    -- csqrt(x + iNaN) returns NaN + iNaN and optionally raises the ''invalid'' floating-
-      point exception, for finite x.
-    -- csqrt(-(inf) + iy) returns +0 + i (inf), for finite positive-signed y.
-    -- csqrt(+(inf) + iy) returns +(inf) + i0, for finite positive-signed y.
-    -- csqrt(-(inf) + iNaN) returns NaN (+-) i (inf) (where the sign of the imaginary part of the
-      result is unspecified).
-    -- csqrt(+(inf) + iNaN) returns +(inf) + iNaN.
-    -- csqrt(NaN + iy) returns NaN + iNaN and optionally raises the ''invalid'' floating-
-      point exception, for finite y.
-    -- csqrt(NaN + iNaN) returns NaN + iNaN.
-
-
-
-
-    327) This allows cpow( z , c ) to be implemented as cexp(c      clog( z )) without precluding
-         implementations that treat special cases more carefully.
-
-[<a name="p479" href="#p479">page 479</a>] (<a href="#Contents">Contents</a>)
-
-<a name="G.7" href="#G.7"><b>    G.7 Type-generic math &lt;tgmath.h&gt;</b></a>
-1   Type-generic macros that accept complex arguments also accept imaginary arguments. If
-    an argument is imaginary, the macro expands to an expression whose type is real,
-    imaginary, or complex, as appropriate for the particular function: if the argument is
-    imaginary, then the types of cos, cosh, fabs, carg, cimag, and creal are real; the
-    types of sin, tan, sinh, tanh, asin, atan, asinh, and atanh are imaginary; and
-    the types of the others are complex.
-2   Given an imaginary argument, each of the type-generic macros cos, sin, tan, cosh,
-    sinh, tanh, asin, atan, asinh, atanh is specified by a formula in terms of real
-    functions:
-           cos(iy)      =   cosh(y)
-           sin(iy)      =   i sinh(y)
-           tan(iy)      =   i tanh(y)
-           cosh(iy)     =   cos(y)
-           sinh(iy)     =   i sin(y)
-           tanh(iy)     =   i tan(y)
-           asin(iy)     =   i asinh(y)
-           atan(iy)     =   i atanh(y)
-           asinh(iy)    =   i asin(y)
-           atanh(iy)    =   i atan(y)
-
-
-
-
-[<a name="p480" href="#p480">page 480</a>] (<a href="#Contents">Contents</a>)
-
-<a name="H" href="#H"><b>                                          Annex H</b></a>
-                                        (informative)
-                        Language independent arithmetic
-<a name="H.1" href="#H.1"><b>    H.1 Introduction</b></a>
-1   This annex documents the extent to which the C language supports the ISO/IEC 10967-1
-    standard for language-independent arithmetic (LIA-1). LIA-1 is more general than
-    IEC 60559 (<a href="#F">annex F</a>) in that it covers integer and diverse floating-point arithmetics.
-<a name="H.2" href="#H.2"><b>    H.2 Types</b></a>
-1   The relevant C arithmetic types meet the requirements of LIA-1 types if an
-    implementation adds notification of exceptional arithmetic operations and meets the 1
-    unit in the last place (ULP) accuracy requirement (LIA-1 subclause <a href="#5.2.8">5.2.8</a>).
-<a name="H.2.1" href="#H.2.1"><b>    H.2.1 Boolean type</b></a>
-1   The LIA-1 data type Boolean is implemented by the C data type bool with values of
-    true and false, all from <a href="#7.16">&lt;stdbool.h&gt;</a>.
-<a name="H.2.2" href="#H.2.2"><b>    H.2.2 Integer types</b></a>
-1   The signed C integer types int, long int, long long int, and the corresponding
-    unsigned types are compatible with LIA-1. If an implementation adds support for the
-    LIA-1 exceptional values ''integer_overflow'' and ''undefined'', then those types are
-    LIA-1 conformant types. C's unsigned integer types are ''modulo'' in the LIA-1 sense
-    in that overflows or out-of-bounds results silently wrap. An implementation that defines
-    signed integer types as also being modulo need not detect integer overflow, in which case,
-    only integer divide-by-zero need be detected.
-2   The parameters for the integer data types can be accessed by the following:
-    maxint        INT_MAX, LONG_MAX, LLONG_MAX, UINT_MAX, ULONG_MAX,
-                  ULLONG_MAX
-    minint        INT_MIN, LONG_MIN, LLONG_MIN
-3   The parameter ''bounded'' is always true, and is not provided. The parameter ''minint''
-    is always 0 for the unsigned types, and is not provided for those types.
-
-
-
-
-[<a name="p481" href="#p481">page 481</a>] (<a href="#Contents">Contents</a>)
-
-<a name="H.2.2.1" href="#H.2.2.1"><b>    H.2.2.1 Integer operations</b></a>
-1   The integer operations on integer types are the following:
-    addI           x + y
-    subI           x - y
-    mulI           x * y
-    divI, divtI    x / y
-    remI, remtI    x % y
-    negI           -x
-    absI           abs(x), labs(x), llabs(x)
-    eqI            x == y
-    neqI           x != y
-    lssI           x &lt; y
-    leqI           x &lt;= y
-    gtrI           x &gt; y
-    geqI           x &gt;= y
-    where x and y are expressions of the same integer type.
-<a name="H.2.3" href="#H.2.3"><b>    H.2.3 Floating-point types</b></a>
-1   The C floating-point types float, double, and long double are compatible with
-    LIA-1. If an implementation adds support for the LIA-1 exceptional values
-    ''underflow'', ''floating_overflow'', and ''"undefined'', then those types are conformant
-    with LIA-1. An implementation that uses IEC 60559 floating-point formats and
-    operations (see <a href="#F">annex F</a>) along with IEC 60559 status flags and traps has LIA-1
-    conformant types.
-<a name="H.2.3.1" href="#H.2.3.1"><b>    H.2.3.1 Floating-point parameters</b></a>
-1   The parameters for a floating point data type can be accessed by the following:
-    r              FLT_RADIX
-    p              FLT_MANT_DIG, DBL_MANT_DIG, LDBL_MANT_DIG
-    emax           FLT_MAX_EXP, DBL_MAX_EXP, LDBL_MAX_EXP
-    emin           FLT_MIN_EXP, DBL_MIN_EXP, LDBL_MIN_EXP
-2   The derived constants for the floating point types are accessed by the following:
-
-
-[<a name="p482" href="#p482">page 482</a>] (<a href="#Contents">Contents</a>)
-
-    fmax          FLT_MAX, DBL_MAX, LDBL_MAX
-    fminN         FLT_MIN, DBL_MIN, LDBL_MIN
-    epsilon       FLT_EPSILON, DBL_EPSILON, LDBL_EPSILON
-    rnd_style     FLT_ROUNDS
-<a name="H.2.3.2" href="#H.2.3.2"><b>    H.2.3.2 Floating-point operations</b></a>
-1   The floating-point operations on floating-point types are the following:
-    addF          x + y
-    subF          x - y
-    mulF          x * y
-    divF          x / y
-    negF          -x
-    absF          fabsf(x), fabs(x), fabsl(x)
-    exponentF     1.f+logbf(x), 1.0+logb(x), 1.L+logbl(x)
-    scaleF        scalbnf(x, n), scalbn(x, n), scalbnl(x, n),
-                  scalblnf(x, li), scalbln(x, li), scalblnl(x, li)
-    intpartF      modff(x, &amp;y), modf(x, &amp;y), modfl(x, &amp;y)
-    fractpartF    modff(x, &amp;y), modf(x, &amp;y), modfl(x, &amp;y)
-    eqF           x == y
-    neqF          x != y
-    lssF          x &lt; y
-    leqF          x &lt;= y
-    gtrF          x &gt; y
-    geqF          x &gt;= y
-    where x and y are expressions of the same floating point type, n is of type int, and li
-    is of type long int.
-<a name="H.2.3.3" href="#H.2.3.3"><b>    H.2.3.3 Rounding styles</b></a>
-1   The C Standard requires all floating types to use the same radix and rounding style, so
-    that only one identifier for each is provided to map to LIA-1.
-2   The FLT_ROUNDS parameter can be used to indicate the LIA-1 rounding styles:
-    truncate      FLT_ROUNDS == 0
-
-[<a name="p483" href="#p483">page 483</a>] (<a href="#Contents">Contents</a>)
-
-    nearest        FLT_ROUNDS == 1
-    other          FLT_ROUNDS != 0 &amp;&amp; FLT_ROUNDS != 1
-    provided that an implementation extends FLT_ROUNDS to cover the rounding style used
-    in all relevant LIA-1 operations, not just addition as in C.
-<a name="H.2.4" href="#H.2.4"><b>    H.2.4 Type conversions</b></a>
-1   The LIA-1 type conversions are the following type casts:
-    cvtI' (-&gt;) I      (int)i, (long int)i, (long long int)i,
-                   (unsigned int)i, (unsigned long int)i,
-                   (unsigned long long int)i
-    cvtF (-&gt;) I       (int)x, (long int)x, (long long int)x,
-                   (unsigned int)x, (unsigned long int)x,
-                   (unsigned long long int)x
-    cvtI (-&gt;) F       (float)i, (double)i, (long double)i
-    cvtF' (-&gt;) F      (float)x, (double)x, (long double)x
-2   In the above conversions from floating to integer, the use of (cast)x can be replaced with
-    (cast)round(x), (cast)rint(x), (cast)nearbyint(x), (cast)trunc(x),
-    (cast)ceil(x), or (cast)floor(x). In addition, C's floating-point to integer
-    conversion functions, lrint(), llrint(), lround(), and llround(), can be
-    used. They all meet LIA-1's requirements on floating to integer rounding for in-range
-    values. For out-of-range values, the conversions shall silently wrap for the modulo types.
-3   The fmod() function is useful for doing silent wrapping to unsigned integer types, e.g.,
-    fmod( fabs(rint(x)), 65536.0 ) or (0.0 &lt;= (y = fmod( rint(x),
-    65536.0 )) ? y : 65536.0 + y) will compute an integer value in the range 0.0
-    to 65535.0 which can then be cast to unsigned short int. But, the
-    remainder() function is not useful for doing silent wrapping to signed integer types,
-    e.g., remainder( rint(x), 65536.0 ) will compute an integer value in the
-    range -32767.0 to +32768.0 which is not, in general, in the range of signed short
-    int.
-4   C's conversions (casts) from floating-point to floating-point can meet LIA-1
-    requirements if an implementation uses round-to-nearest (IEC 60559 default).
-5   C's conversions (casts) from integer to floating-point can meet LIA-1 requirements if an
-    implementation uses round-to-nearest.
-
-
-
-
-[<a name="p484" href="#p484">page 484</a>] (<a href="#Contents">Contents</a>)
-
-<a name="H.3" href="#H.3"><b>    H.3 Notification</b></a>
-1   Notification is the process by which a user or program is informed that an exceptional
-    arithmetic operation has occurred. C's operations are compatible with LIA-1 in that C
-    allows an implementation to cause a notification to occur when any arithmetic operation
-    returns an exceptional value as defined in LIA-1 clause 5.
-<a name="H.3.1" href="#H.3.1"><b>    H.3.1 Notification alternatives</b></a>
-1   LIA-1 requires at least the following two alternatives for handling of notifications:
-    setting indicators or trap-and-terminate. LIA-1 allows a third alternative: trap-and-
-    resume.
-2   An implementation need only support a given notification alternative for the entire
-    program. An implementation may support the ability to switch between notification
-    alternatives during execution, but is not required to do so. An implementation can
-    provide separate selection for each kind of notification, but this is not required.
-3   C allows an implementation to provide notification. C's SIGFPE (for traps) and
-    FE_INVALID, FE_DIVBYZERO, FE_OVERFLOW, FE_UNDERFLOW (for indicators)
-    can provide LIA-1 notification.
-4   C's signal handlers are compatible with LIA-1. Default handling of SIGFPE can
-    provide trap-and-terminate behavior, except for those LIA-1 operations implemented by
-    math library function calls. User-provided signal handlers for SIGFPE allow for trap-
-    and-resume behavior with the same constraint.
-<a name="H.3.1.1" href="#H.3.1.1"><b>    H.3.1.1 Indicators</b></a>
-1   C's <a href="#7.6">&lt;fenv.h&gt;</a> status flags are compatible with the LIA-1 indicators.
-2   The following mapping is for floating-point types:
-    undefined                FE_INVALID, FE_DIVBYZERO
-    floating_overflow         FE_OVERFLOW
-    underflow                FE_UNDERFLOW
-3   The floating-point indicator interrogation and manipulation operations are:
-    set_indicators          feraiseexcept(i)
-    clear_indicators        feclearexcept(i)
-    test_indicators         fetestexcept(i)
-    current_indicators      fetestexcept(FE_ALL_EXCEPT)
-    where i is an expression of type int representing a subset of the LIA-1 indicators.
-4   C allows an implementation to provide the following LIA-1 required behavior: at
-    program termination if any indicator is set the implementation shall send an unambiguous
-[<a name="p485" href="#p485">page 485</a>] (<a href="#Contents">Contents</a>)
-
-    and ''hard to ignore'' message (see LIA-1 subclause <a href="#6.1.2">6.1.2</a>)
-5   LIA-1 does not make the distinction between floating-point and integer for ''undefined''.
-    This documentation makes that distinction because <a href="#7.6">&lt;fenv.h&gt;</a> covers only the floating-
-    point indicators.
-<a name="H.3.1.2" href="#H.3.1.2"><b>    H.3.1.2 Traps</b></a>
-1   C is compatible with LIA-1's trap requirements for arithmetic operations, but not for
-    math library functions (which are not permitted to generate any externally visible
-    exceptional conditions). An implementation can provide an alternative of notification
-    through termination with a ''hard-to-ignore'' message (see LIA-1 subclause <a href="#6.1.3">6.1.3</a>).
-2   LIA-1 does not require that traps be precise.
-3   C does require that SIGFPE be the signal corresponding to arithmetic exceptions, if there
-    is any signal raised for them.
-4   C supports signal handlers for SIGFPE and allows trapping of arithmetic exceptions.
-    When arithmetic exceptions do trap, C's signal-handler mechanism allows trap-and-
-    terminate (either default implementation behavior or user replacement for it) or trap-and-
-    resume, at the programmer's option.
-
-
-
-
-[<a name="p486" href="#p486">page 486</a>] (<a href="#Contents">Contents</a>)
-
-<a name="I" href="#I"><b>                                           Annex I</b></a>
-                                        (informative)
-                                   Common warnings
-1   An implementation may generate warnings in many situations, none of which are
-    specified as part of this International Standard. The following are a few of the more
-    common situations.
-2   -- A new struct or union type appears in a function prototype (<a href="#6.2.1">6.2.1</a>, <a href="#6.7.2.3">6.7.2.3</a>).
-    -- A block with initialization of an object that has automatic storage duration is jumped
-      into (<a href="#6.2.4">6.2.4</a>).
-    -- An implicit narrowing conversion is encountered, such as the assignment of a long
-      int or a double to an int, or a pointer to void to a pointer to any type other than
-      a character type (<a href="#6.3">6.3</a>).
-    -- A hexadecimal floating constant cannot be represented exactly in its evaluation format
-      (<a href="#6.4.4.2">6.4.4.2</a>).
-    -- An integer character constant includes more than one character or a wide character
-      constant includes more than one multibyte character (<a href="#6.4.4.4">6.4.4.4</a>).
-    -- The characters /* are found in a comment (<a href="#6.4.7">6.4.7</a>).
-    -- An ''unordered'' binary operator (not comma, &amp;&amp;, or ||) contains a side effect to an
-      lvalue in one operand, and a side effect to, or an access to the value of, the identical
-      lvalue in the other operand (<a href="#6.5">6.5</a>).
-    -- A function is called but no prototype has been supplied (<a href="#6.5.2.2">6.5.2.2</a>).
-    -- The arguments in a function call do not agree in number and type with those of the
-      parameters in a function definition that is not a prototype (<a href="#6.5.2.2">6.5.2.2</a>).
-    -- An object is defined but not used (<a href="#6.7">6.7</a>).
-    -- A value is given to an object of an enumerated type other than by assignment of an
-      enumeration constant that is a member of that type, or an enumeration object that has
-      the same type, or the value of a function that returns the same enumerated type
-      (<a href="#6.7.2.2">6.7.2.2</a>).
-    -- An aggregate has a partly bracketed initialization (<a href="#6.7.7">6.7.7</a>).
-    -- A statement cannot be reached (<a href="#6.8">6.8</a>).
-    -- A statement with no apparent effect is encountered (<a href="#6.8">6.8</a>).
-    -- A constant expression is used as the controlling expression of a selection statement
-      (<a href="#6.8.4">6.8.4</a>).
-[<a name="p487" href="#p487">page 487</a>] (<a href="#Contents">Contents</a>)
-
--- An incorrectly formed preprocessing group is encountered while skipping a
-  preprocessing group (<a href="#6.10.1">6.10.1</a>).
--- An unrecognized #pragma directive is encountered (<a href="#6.10.6">6.10.6</a>).
-
-
-
-
-[<a name="p488" href="#p488">page 488</a>] (<a href="#Contents">Contents</a>)
-
-<a name="J" href="#J"><b>                                            Annex J</b></a>
-                                         (informative)
-                                      Portability issues
-1   This annex collects some information about portability that appears in this International
-    Standard.
-<a name="J.1" href="#J.1"><b>    J.1 Unspecified behavior</b></a>
-1   The following are unspecified:
-    -- The manner and timing of static initialization (<a href="#5.1.2">5.1.2</a>).
-    -- The termination status returned to the hosted environment if the return type of main
-      is not compatible with int (<a href="#5.1.2.2.3">5.1.2.2.3</a>).
-    -- The behavior of the display device if a printing character is written when the active
-      position is at the final position of a line (<a href="#5.2.2">5.2.2</a>).
-    -- The behavior of the display device if a backspace character is written when the active
-      position is at the initial position of a line (<a href="#5.2.2">5.2.2</a>).
-    -- The behavior of the display device if a horizontal tab character is written when the
-      active position is at or past the last defined horizontal tabulation position (<a href="#5.2.2">5.2.2</a>).
-    -- The behavior of the display device if a vertical tab character is written when the active
-      position is at or past the last defined vertical tabulation position (<a href="#5.2.2">5.2.2</a>).
-    -- How an extended source character that does not correspond to a universal character
-      name counts toward the significant initial characters in an external identifier (<a href="#5.2.4.1">5.2.4.1</a>).
-    -- Many aspects of the representations of types (<a href="#6.2.6">6.2.6</a>).
-    -- The value of padding bytes when storing values in structures or unions (<a href="#6.2.6.1">6.2.6.1</a>).
-    -- The value of a union member other than the last one stored into (<a href="#6.2.6.1">6.2.6.1</a>).
-    -- The representation used when storing a value in an object that has more than one
-      object representation for that value (<a href="#6.2.6.1">6.2.6.1</a>).
-    -- The values of any padding bits in integer representations (<a href="#6.2.6.2">6.2.6.2</a>).
-    -- Whether certain operators can generate negative zeros and whether a negative zero
-      becomes a normal zero when stored in an object (<a href="#6.2.6.2">6.2.6.2</a>).
-    -- Whether two string literals result in distinct arrays (<a href="#6.4.5">6.4.5</a>).
-    -- The order in which subexpressions are evaluated and the order in which side effects
-      take place, except as specified for the function-call (), &amp;&amp;, ||, ?:, and comma
-      operators (<a href="#6.5">6.5</a>).
-[<a name="p489" href="#p489">page 489</a>] (<a href="#Contents">Contents</a>)
-
--- The order in which the function designator, arguments, and subexpressions within the
-  arguments are evaluated in a function call (<a href="#6.5.2.2">6.5.2.2</a>).
--- The order of side effects among compound literal initialization list expressions
-  (<a href="#6.5.2.5">6.5.2.5</a>).
--- The order in which the operands of an assignment operator are evaluated (<a href="#6.5.16">6.5.16</a>).
--- The alignment of the addressable storage unit allocated to hold a bit-field (<a href="#6.7.2.1">6.7.2.1</a>).
--- Whether a call to an inline function uses the inline definition or the external definition
-  of the function (<a href="#6.7.4">6.7.4</a>).
--- Whether or not a size expression is evaluated when it is part of the operand of a
-  sizeof operator and changing the value of the size expression would not affect the
-  result of the operator (<a href="#6.7.5.2">6.7.5.2</a>).
--- The order in which any side effects occur among the initialization list expressions in
-  an initializer (<a href="#6.7.8">6.7.8</a>).
--- The layout of storage for function parameters (<a href="#6.9.1">6.9.1</a>).
--- When a fully expanded macro replacement list contains a function-like macro name
-  as its last preprocessing token and the next preprocessing token from the source file is
-  a (, and the fully expanded replacement of that macro ends with the name of the first
-  macro and the next preprocessing token from the source file is again a (, whether that
-  is considered a nested replacement (<a href="#6.10.3">6.10.3</a>).
--- The order in which # and ## operations are evaluated during macro substitution
-  (<a href="#6.10.3.2">6.10.3.2</a>, <a href="#6.10.3.3">6.10.3.3</a>).
--- Whether errno is a macro or an identifier with external linkage (<a href="#7.5">7.5</a>).
--- The state of the floating-point status flags when execution passes from a part of the
-  program translated with FENV_ACCESS ''off'' to a part translated with
-  FENV_ACCESS ''on'' (<a href="#7.6.1">7.6.1</a>).
--- The order in which feraiseexcept raises floating-point exceptions, except as
-  stated in <a href="#F.7.6">F.7.6</a> (<a href="#7.6.2.3">7.6.2.3</a>).
--- Whether math_errhandling is a macro or an identifier with external linkage
-  (<a href="#7.12">7.12</a>).
--- The results of the frexp functions when the specified value is not a floating-point
-  number (<a href="#7.12.6.4">7.12.6.4</a>).
--- The numeric result of the ilogb functions when the correct value is outside the
-  range of the return type (<a href="#7.12.6.5">7.12.6.5</a>, <a href="#F.9.3.5">F.9.3.5</a>).
--- The result of rounding when the value is out of range (<a href="#7.12.9.5">7.12.9.5</a>, <a href="#7.12.9.7">7.12.9.7</a>, <a href="#F.9.6.5">F.9.6.5</a>).
-
-[<a name="p490" href="#p490">page 490</a>] (<a href="#Contents">Contents</a>)
-
--- The value stored by the remquo functions in the object pointed to by quo when y is
-  zero (<a href="#7.12.10.3">7.12.10.3</a>).
--- Whether setjmp is a macro or an identifier with external linkage (<a href="#7.13">7.13</a>).
--- Whether va_copy and va_end are macros or identifiers with external linkage
-  (<a href="#7.15.1">7.15.1</a>).
--- The hexadecimal digit before the decimal point when a non-normalized floating-point
-  number is printed with an a or A conversion specifier (<a href="#7.19.6.1">7.19.6.1</a>, <a href="#7.24.2.1">7.24.2.1</a>).
--- The value of the file position indicator after a successful call to the ungetc function
-  for a text stream, or the ungetwc function for any stream, until all pushed-back
-  characters are read or discarded (<a href="#7.19.7.11">7.19.7.11</a>, <a href="#7.24.3.10">7.24.3.10</a>).
--- The details of the value stored by the fgetpos function (<a href="#7.19.9.1">7.19.9.1</a>).
--- The details of the value returned by the ftell function for a text stream (<a href="#7.19.9.4">7.19.9.4</a>).
--- Whether the strtod, strtof, strtold, wcstod, wcstof, and wcstold
-  functions convert a minus-signed sequence to a negative number directly or by
-  negating the value resulting from converting the corresponding unsigned sequence
-  (<a href="#7.20.1.3">7.20.1.3</a>, <a href="#7.24.4.1.1">7.24.4.1.1</a>).
--- The order and contiguity of storage allocated by successive calls to the calloc,
-  malloc, and realloc functions (<a href="#7.20.3">7.20.3</a>).
--- The amount of storage allocated by a successful call to the calloc, malloc, or
-  realloc function when 0 bytes was requested (<a href="#7.20.3">7.20.3</a>).
--- Which of two elements that compare as equal is matched by the bsearch function
-  (<a href="#7.20.5.1">7.20.5.1</a>).
--- The order of two elements that compare as equal in an array sorted by the qsort
-  function (<a href="#7.20.5.2">7.20.5.2</a>).
--- The encoding of the calendar time returned by the time function (<a href="#7.23.2.4">7.23.2.4</a>).
--- The characters stored by the strftime or wcsftime function if any of the time
-  values being converted is outside the normal range (<a href="#7.23.3.5">7.23.3.5</a>, <a href="#7.24.5.1">7.24.5.1</a>).
--- The conversion state after an encoding error occurs (<a href="#7.24.6.3.2">7.24.6.3.2</a>, <a href="#7.24.6.3.3">7.24.6.3.3</a>, <a href="#7.24.6.4.1">7.24.6.4.1</a>,
-  <a href="#7.24.6.4.2">7.24.6.4.2</a>,
--- The resulting value when the ''invalid'' floating-point exception is raised during
-  IEC 60559 floating to integer conversion (<a href="#F.4">F.4</a>).
--- Whether conversion of non-integer IEC 60559 floating values to integer raises the
-  ''inexact'' floating-point exception (<a href="#F.4">F.4</a>).
-
-
-
-[<a name="p491" href="#p491">page 491</a>] (<a href="#Contents">Contents</a>)
-
-    -- Whether or when library functions in <a href="#7.12">&lt;math.h&gt;</a> raise the ''inexact'' floating-point
-      exception in an IEC 60559 conformant implementation (<a href="#F.9">F.9</a>).
-    -- Whether or when library functions in <a href="#7.12">&lt;math.h&gt;</a> raise an undeserved ''underflow''
-      floating-point exception in an IEC 60559 conformant implementation (<a href="#F.9">F.9</a>).
-    -- The exponent value stored by frexp for a NaN or infinity (<a href="#F.9.3.4">F.9.3.4</a>).
-    -- The numeric result returned by the lrint, llrint, lround, and llround
-      functions if the rounded value is outside the range of the return type (<a href="#F.9.6.5">F.9.6.5</a>, <a href="#F.9.6.7">F.9.6.7</a>).
-    -- The sign of one part of the complex result of several math functions for certain
-      exceptional values in IEC 60559 compatible implementations (<a href="#G.6.1.1">G.6.1.1</a>, <a href="#G.6.2.2">G.6.2.2</a>,
-      <a href="#G.6.2.3">G.6.2.3</a>, <a href="#G.6.2.4">G.6.2.4</a>, <a href="#G.6.2.5">G.6.2.5</a>, <a href="#G.6.2.6">G.6.2.6</a>, <a href="#G.6.3.1">G.6.3.1</a>, <a href="#G.6.4.2">G.6.4.2</a>).
-<a name="J.2" href="#J.2"><b>    J.2 Undefined behavior</b></a>
-1   The behavior is undefined in the following circumstances:
-    -- A ''shall'' or ''shall not'' requirement that appears outside of a constraint is violated
-      (clause 4).
-    -- A nonempty source file does not end in a new-line character which is not immediately
-      preceded by a backslash character or ends in a partial preprocessing token or
-      comment (<a href="#5.1.1.2">5.1.1.2</a>).
-    -- Token concatenation produces a character sequence matching the syntax of a
-      universal character name (<a href="#5.1.1.2">5.1.1.2</a>).
-    -- A program in a hosted environment does not define a function named main using one
-      of the specified forms (<a href="#5.1.2.2.1">5.1.2.2.1</a>).
-    -- A character not in the basic source character set is encountered in a source file, except
-      in an identifier, a character constant, a string literal, a header name, a comment, or a
-      preprocessing token that is never converted to a token (<a href="#5.2.1">5.2.1</a>).
-    -- An identifier, comment, string literal, character constant, or header name contains an
-      invalid multibyte character or does not begin and end in the initial shift state (<a href="#5.2.1.2">5.2.1.2</a>).
-    -- The same identifier has both internal and external linkage in the same translation unit
-      (<a href="#6.2.2">6.2.2</a>).
-    -- An object is referred to outside of its lifetime (<a href="#6.2.4">6.2.4</a>).
-    -- The value of a pointer to an object whose lifetime has ended is used (<a href="#6.2.4">6.2.4</a>).
-    -- The value of an object with automatic storage duration is used while it is
-      indeterminate (<a href="#6.2.4">6.2.4</a>, <a href="#6.7.8">6.7.8</a>, <a href="#6.8">6.8</a>).
-    -- A trap representation is read by an lvalue expression that does not have character type
-      (<a href="#6.2.6.1">6.2.6.1</a>).
-
-[<a name="p492" href="#p492">page 492</a>] (<a href="#Contents">Contents</a>)
-
--- A trap representation is produced by a side effect that modifies any part of the object
-  using an lvalue expression that does not have character type (<a href="#6.2.6.1">6.2.6.1</a>).
--- The arguments to certain operators are such that could produce a negative zero result,
-  but the implementation does not support negative zeros (<a href="#6.2.6.2">6.2.6.2</a>).
--- Two declarations of the same object or function specify types that are not compatible
-  (<a href="#6.2.7">6.2.7</a>).
--- Conversion to or from an integer type produces a value outside the range that can be
-  represented (<a href="#6.3.1.4">6.3.1.4</a>).
--- Demotion of one real floating type to another produces a value outside the range that
-  can be represented (<a href="#6.3.1.5">6.3.1.5</a>).
--- An lvalue does not designate an object when evaluated (<a href="#6.3.2.1">6.3.2.1</a>).
--- A non-array lvalue with an incomplete type is used in a context that requires the value
-  of the designated object (<a href="#6.3.2.1">6.3.2.1</a>).
--- An lvalue having array type is converted to a pointer to the initial element of the
-  array, and the array object has register storage class (<a href="#6.3.2.1">6.3.2.1</a>).
--- An attempt is made to use the value of a void expression, or an implicit or explicit
-  conversion (except to void) is applied to a void expression (<a href="#6.3.2.2">6.3.2.2</a>).
--- Conversion of a pointer to an integer type produces a value outside the range that can
-  be represented (<a href="#6.3.2.3">6.3.2.3</a>).
--- Conversion between two pointer types produces a result that is incorrectly aligned
-  (<a href="#6.3.2.3">6.3.2.3</a>).
--- A pointer is used to call a function whose type is not compatible with the pointed-to
-  type (<a href="#6.3.2.3">6.3.2.3</a>).
--- An unmatched ' or " character is encountered on a logical source line during
-  tokenization (<a href="#6.4">6.4</a>).
--- A reserved keyword token is used in translation phase 7 or 8 for some purpose other
-  than as a keyword (<a href="#6.4.1">6.4.1</a>).
--- A universal character name in an identifier does not designate a character whose
-  encoding falls into one of the specified ranges (<a href="#6.4.2.1">6.4.2.1</a>).
--- The initial character of an identifier is a universal character name designating a digit
-  (<a href="#6.4.2.1">6.4.2.1</a>).
--- Two identifiers differ only in nonsignificant characters (<a href="#6.4.2.1">6.4.2.1</a>).
--- The identifier __func__ is explicitly declared (<a href="#6.4.2.2">6.4.2.2</a>).
-
-
-[<a name="p493" href="#p493">page 493</a>] (<a href="#Contents">Contents</a>)
-
--- The program attempts to modify a string literal (<a href="#6.4.5">6.4.5</a>).
--- The characters ', \, ", //, or /* occur in the sequence between the &lt; and &gt;
-  delimiters, or the characters ', \, //, or /* occur in the sequence between the "
-  delimiters, in a header name preprocessing token (<a href="#6.4.7">6.4.7</a>).
--- Between two sequence points, an object is modified more than once, or is modified
-  and the prior value is read other than to determine the value to be stored (<a href="#6.5">6.5</a>).
--- An exceptional condition occurs during the evaluation of an expression (<a href="#6.5">6.5</a>).
--- An object has its stored value accessed other than by an lvalue of an allowable type
-  (<a href="#6.5">6.5</a>).
--- An attempt is made to modify the result of a function call, a conditional operator, an
-  assignment operator, or a comma operator, or to access it after the next sequence
-  point (<a href="#6.5.2.2">6.5.2.2</a>, <a href="#6.5.15">6.5.15</a>, <a href="#6.5.16">6.5.16</a>, <a href="#6.5.17">6.5.17</a>).
--- For a call to a function without a function prototype in scope, the number of
-  arguments does not equal the number of parameters (<a href="#6.5.2.2">6.5.2.2</a>).
--- For call to a function without a function prototype in scope where the function is
-  defined with a function prototype, either the prototype ends with an ellipsis or the
-  types of the arguments after promotion are not compatible with the types of the
-  parameters (<a href="#6.5.2.2">6.5.2.2</a>).
--- For a call to a function without a function prototype in scope where the function is not
-  defined with a function prototype, the types of the arguments after promotion are not
-  compatible with those of the parameters after promotion (with certain exceptions)
-  (<a href="#6.5.2.2">6.5.2.2</a>).
--- A function is defined with a type that is not compatible with the type (of the
-  expression) pointed to by the expression that denotes the called function (<a href="#6.5.2.2">6.5.2.2</a>).
--- The operand of the unary * operator has an invalid value (<a href="#6.5.3.2">6.5.3.2</a>).
--- A pointer is converted to other than an integer or pointer type (<a href="#6.5.4">6.5.4</a>).
--- The value of the second operand of the / or % operator is zero (<a href="#6.5.5">6.5.5</a>).
--- Addition or subtraction of a pointer into, or just beyond, an array object and an
-  integer type produces a result that does not point into, or just beyond, the same array
-  object (<a href="#6.5.6">6.5.6</a>).
--- Addition or subtraction of a pointer into, or just beyond, an array object and an
-  integer type produces a result that points just beyond the array object and is used as
-  the operand of a unary * operator that is evaluated (<a href="#6.5.6">6.5.6</a>).
--- Pointers that do not point into, or just beyond, the same array object are subtracted
-  (<a href="#6.5.6">6.5.6</a>).
-
-[<a name="p494" href="#p494">page 494</a>] (<a href="#Contents">Contents</a>)
-
--- An array subscript is out of range, even if an object is apparently accessible with the
-  given subscript (as in the lvalue expression a[1][7] given the declaration int
-  a[4][5]) (<a href="#6.5.6">6.5.6</a>).
--- The result of subtracting two pointers is not representable in an object of type
-  ptrdiff_t (<a href="#6.5.6">6.5.6</a>).
--- An expression is shifted by a negative number or by an amount greater than or equal
-  to the width of the promoted expression (<a href="#6.5.7">6.5.7</a>).
--- An expression having signed promoted type is left-shifted and either the value of the
-  expression is negative or the result of shifting would be not be representable in the
-  promoted type (<a href="#6.5.7">6.5.7</a>).
--- Pointers that do not point to the same aggregate or union (nor just beyond the same
-  array object) are compared using relational operators (<a href="#6.5.8">6.5.8</a>).
--- An object is assigned to an inexactly overlapping object or to an exactly overlapping
-  object with incompatible type (<a href="#6.5.16.1">6.5.16.1</a>).
--- An expression that is required to be an integer constant expression does not have an
-  integer type; has operands that are not integer constants, enumeration constants,
-  character constants, sizeof expressions whose results are integer constants, or
-  immediately-cast floating constants; or contains casts (outside operands to sizeof
-  operators) other than conversions of arithmetic types to integer types (<a href="#6.6">6.6</a>).
--- A constant expression in an initializer is not, or does not evaluate to, one of the
-  following: an arithmetic constant expression, a null pointer constant, an address
-  constant, or an address constant for an object type plus or minus an integer constant
-  expression (<a href="#6.6">6.6</a>).
--- An arithmetic constant expression does not have arithmetic type; has operands that
-  are not integer constants, floating constants, enumeration constants, character
-  constants, or sizeof expressions; or contains casts (outside operands to sizeof
-  operators) other than conversions of arithmetic types to arithmetic types (<a href="#6.6">6.6</a>).
--- The value of an object is accessed by an array-subscript [], member-access . or -&gt;,
-  address &amp;, or indirection * operator or a pointer cast in creating an address constant
-  (<a href="#6.6">6.6</a>).
--- An identifier for an object is declared with no linkage and the type of the object is
-  incomplete after its declarator, or after its init-declarator if it has an initializer (<a href="#6.7">6.7</a>).
--- A function is declared at block scope with an explicit storage-class specifier other
-  than extern (<a href="#6.7.1">6.7.1</a>).
--- A structure or union is defined as containing no named members (<a href="#6.7.2.1">6.7.2.1</a>).
-
-
-[<a name="p495" href="#p495">page 495</a>] (<a href="#Contents">Contents</a>)
-
--- An attempt is made to access, or generate a pointer to just past, a flexible array
-  member of a structure when the referenced object provides no elements for that array
-  (<a href="#6.7.2.1">6.7.2.1</a>).
--- When the complete type is needed, an incomplete structure or union type is not
-  completed in the same scope by another declaration of the tag that defines the content
-  (<a href="#6.7.2.3">6.7.2.3</a>).
--- An attempt is made to modify an object defined with a const-qualified type through
-  use of an lvalue with non-const-qualified type (<a href="#6.7.3">6.7.3</a>).
--- An attempt is made to refer to an object defined with a volatile-qualified type through
-  use of an lvalue with non-volatile-qualified type (<a href="#6.7.3">6.7.3</a>).
--- The specification of a function type includes any type qualifiers (<a href="#6.7.3">6.7.3</a>).
--- Two qualified types that are required to be compatible do not have the identically
-  qualified version of a compatible type (<a href="#6.7.3">6.7.3</a>).
--- An object which has been modified is accessed through a restrict-qualified pointer to
-  a const-qualified type, or through a restrict-qualified pointer and another pointer that
-  are not both based on the same object (<a href="#6.7.3.1">6.7.3.1</a>).
--- A restrict-qualified pointer is assigned a value based on another restricted pointer
-  whose associated block neither began execution before the block associated with this
-  pointer, nor ended before the assignment (<a href="#6.7.3.1">6.7.3.1</a>).
--- A function with external linkage is declared with an inline function specifier, but is
-  not also defined in the same translation unit (<a href="#6.7.4">6.7.4</a>).
--- Two pointer types that are required to be compatible are not identically qualified, or
-  are not pointers to compatible types (<a href="#6.7.5.1">6.7.5.1</a>).
--- The size expression in an array declaration is not a constant expression and evaluates
-  at program execution time to a nonpositive value (<a href="#6.7.5.2">6.7.5.2</a>).
--- In a context requiring two array types to be compatible, they do not have compatible
-  element types, or their size specifiers evaluate to unequal values (<a href="#6.7.5.2">6.7.5.2</a>).
--- A declaration of an array parameter includes the keyword static within the [ and
-  ] and the corresponding argument does not provide access to the first element of an
-  array with at least the specified number of elements (<a href="#6.7.5.3">6.7.5.3</a>).
--- A storage-class specifier or type qualifier modifies the keyword void as a function
-  parameter type list (<a href="#6.7.5.3">6.7.5.3</a>).
--- In a context requiring two function types to be compatible, they do not have
-   compatible return types, or their parameters disagree in use of the ellipsis terminator
-   or the number and type of parameters (after default argument promotion, when there
-    is no parameter type list or when one type is specified by a function definition with an
-[<a name="p496" href="#p496">page 496</a>] (<a href="#Contents">Contents</a>)
-
-   identifier list) (<a href="#6.7.5.3">6.7.5.3</a>).
--- The value of an unnamed member of a structure or union is used (<a href="#6.7.8">6.7.8</a>).
--- The initializer for a scalar is neither a single expression nor a single expression
-  enclosed in braces (<a href="#6.7.8">6.7.8</a>).
--- The initializer for a structure or union object that has automatic storage duration is
-  neither an initializer list nor a single expression that has compatible structure or union
-  type (<a href="#6.7.8">6.7.8</a>).
--- The initializer for an aggregate or union, other than an array initialized by a string
-  literal, is not a brace-enclosed list of initializers for its elements or members (<a href="#6.7.8">6.7.8</a>).
--- An identifier with external linkage is used, but in the program there does not exist
-  exactly one external definition for the identifier, or the identifier is not used and there
-  exist multiple external definitions for the identifier (<a href="#6.9">6.9</a>).
--- A function definition includes an identifier list, but the types of the parameters are not
-  declared in a following declaration list (<a href="#6.9.1">6.9.1</a>).
--- An adjusted parameter type in a function definition is not an object type (<a href="#6.9.1">6.9.1</a>).
--- A function that accepts a variable number of arguments is defined without a
-  parameter type list that ends with the ellipsis notation (<a href="#6.9.1">6.9.1</a>).
--- The } that terminates a function is reached, and the value of the function call is used
-  by the caller (<a href="#6.9.1">6.9.1</a>).
--- An identifier for an object with internal linkage and an incomplete type is declared
-  with a tentative definition (<a href="#6.9.2">6.9.2</a>).
--- The token defined is generated during the expansion of a #if or #elif
-  preprocessing directive, or the use of the defined unary operator does not match
-  one of the two specified forms prior to macro replacement (<a href="#6.10.1">6.10.1</a>).
--- The #include preprocessing directive that results after expansion does not match
-  one of the two header name forms (<a href="#6.10.2">6.10.2</a>).
--- The character sequence in an #include preprocessing directive does not start with a
-  letter (<a href="#6.10.2">6.10.2</a>).
--- There are sequences of preprocessing tokens within the list of macro arguments that
-  would otherwise act as preprocessing directives (<a href="#6.10.3">6.10.3</a>).
--- The result of the preprocessing operator # is not a valid character string literal
-  (<a href="#6.10.3.2">6.10.3.2</a>).
--- The result of the preprocessing operator ## is not a valid preprocessing token
-  (<a href="#6.10.3.3">6.10.3.3</a>).
-
-[<a name="p497" href="#p497">page 497</a>] (<a href="#Contents">Contents</a>)
-
--- The #line preprocessing directive that results after expansion does not match one of
-  the two well-defined forms, or its digit sequence specifies zero or a number greater
-  than 2147483647 (<a href="#6.10.4">6.10.4</a>).
--- A non-STDC #pragma preprocessing directive that is documented as causing
-  translation failure or some other form of undefined behavior is encountered (<a href="#6.10.6">6.10.6</a>).
--- A #pragma STDC preprocessing directive does not match one of the well-defined
-  forms (<a href="#6.10.6">6.10.6</a>).
--- The name of a predefined macro, or the identifier defined, is the subject of a
-  #define or #undef preprocessing directive (<a href="#6.10.8">6.10.8</a>).
--- An attempt is made to copy an object to an overlapping object by use of a library
-  function, other than as explicitly allowed (e.g., memmove) (clause 7).
--- A file with the same name as one of the standard headers, not provided as part of the
-  implementation, is placed in any of the standard places that are searched for included
-  source files (<a href="#7.1.2">7.1.2</a>).
--- A header is included within an external declaration or definition (<a href="#7.1.2">7.1.2</a>).
--- A function, object, type, or macro that is specified as being declared or defined by
-  some standard header is used before any header that declares or defines it is included
-  (<a href="#7.1.2">7.1.2</a>).
--- A standard header is included while a macro is defined with the same name as a
-  keyword (<a href="#7.1.2">7.1.2</a>).
--- The program attempts to declare a library function itself, rather than via a standard
-  header, but the declaration does not have external linkage (<a href="#7.1.2">7.1.2</a>).
--- The program declares or defines a reserved identifier, other than as allowed by <a href="#7.1.4">7.1.4</a>
-  (<a href="#7.1.3">7.1.3</a>).
--- The program removes the definition of a macro whose name begins with an
-  underscore and either an uppercase letter or another underscore (<a href="#7.1.3">7.1.3</a>).
--- An argument to a library function has an invalid value or a type not expected by a
-  function with variable number of arguments (<a href="#7.1.4">7.1.4</a>).
--- The pointer passed to a library function array parameter does not have a value such
-  that all address computations and object accesses are valid (<a href="#7.1.4">7.1.4</a>).
--- The macro definition of assert is suppressed in order to access an actual function
-  (<a href="#7.2">7.2</a>).
--- The argument to the assert macro does not have a scalar type (<a href="#7.2">7.2</a>).
--- The CX_LIMITED_RANGE, FENV_ACCESS, or FP_CONTRACT pragma is used in
-  any context other than outside all external declarations or preceding all explicit
-[<a name="p498" href="#p498">page 498</a>] (<a href="#Contents">Contents</a>)
-
-   declarations and statements inside a compound statement (<a href="#7.3.4">7.3.4</a>, <a href="#7.6.1">7.6.1</a>, <a href="#7.12.2">7.12.2</a>).
--- The value of an argument to a character handling function is neither equal to the value
-  of EOF nor representable as an unsigned char (<a href="#7.4">7.4</a>).
--- A macro definition of errno is suppressed in order to access an actual object, or the
-  program defines an identifier with the name errno (<a href="#7.5">7.5</a>).
--- Part of the program tests floating-point status flags, sets floating-point control modes,
-  or runs under non-default mode settings, but was translated with the state for the
-  FENV_ACCESS pragma ''off'' (<a href="#7.6.1">7.6.1</a>).
--- The exception-mask argument for one of the functions that provide access to the
-  floating-point status flags has a nonzero value not obtained by bitwise OR of the
-  floating-point exception macros (<a href="#7.6.2">7.6.2</a>).
--- The fesetexceptflag function is used to set floating-point status flags that were
-  not specified in the call to the fegetexceptflag function that provided the value
-  of the corresponding fexcept_t object (<a href="#7.6.2.4">7.6.2.4</a>).
--- The argument to fesetenv or feupdateenv is neither an object set by a call to
-  fegetenv or feholdexcept, nor is it an environment macro (<a href="#7.6.4.3">7.6.4.3</a>, <a href="#7.6.4.4">7.6.4.4</a>).
--- The value of the result of an integer arithmetic or conversion function cannot be
-  represented (<a href="#7.8.2.1">7.8.2.1</a>, <a href="#7.8.2.2">7.8.2.2</a>, <a href="#7.8.2.3">7.8.2.3</a>, <a href="#7.8.2.4">7.8.2.4</a>, <a href="#7.20.6.1">7.20.6.1</a>, <a href="#7.20.6.2">7.20.6.2</a>, <a href="#7.20.1">7.20.1</a>).
--- The program modifies the string pointed to by the value returned by the setlocale
-  function (<a href="#7.11.1.1">7.11.1.1</a>).
--- The program modifies the structure pointed to by the value returned by the
-  localeconv function (<a href="#7.11.2.1">7.11.2.1</a>).
--- A macro definition of math_errhandling is suppressed or the program defines
-  an identifier with the name math_errhandling (<a href="#7.12">7.12</a>).
--- An argument to a floating-point classification or comparison macro is not of real
-  floating type (<a href="#7.12.3">7.12.3</a>, <a href="#7.12.14">7.12.14</a>).
--- A macro definition of setjmp is suppressed in order to access an actual function, or
-  the program defines an external identifier with the name setjmp (<a href="#7.13">7.13</a>).
--- An invocation of the setjmp macro occurs other than in an allowed context
-  (<a href="#7.13.2.1">7.13.2.1</a>).
--- The longjmp function is invoked to restore a nonexistent environment (<a href="#7.13.2.1">7.13.2.1</a>).
--- After a longjmp, there is an attempt to access the value of an object of automatic
-  storage class with non-volatile-qualified type, local to the function containing the
-  invocation of the corresponding setjmp macro, that was changed between the
-  setjmp invocation and longjmp call (<a href="#7.13.2.1">7.13.2.1</a>).
-
-[<a name="p499" href="#p499">page 499</a>] (<a href="#Contents">Contents</a>)
-
--- The program specifies an invalid pointer to a signal handler function (<a href="#7.14.1.1">7.14.1.1</a>).
--- A signal handler returns when the signal corresponded to a computational exception
-  (<a href="#7.14.1.1">7.14.1.1</a>).
--- A signal occurs as the result of calling the abort or raise function, and the signal
-  handler calls the raise function (<a href="#7.14.1.1">7.14.1.1</a>).
--- A signal occurs other than as the result of calling the abort or raise function, and
-  the signal handler refers to an object with static storage duration other than by
-  assigning a value to an object declared as volatile sig_atomic_t, or calls any
-  function in the standard library other than the abort function, the _Exit function,
-  or the signal function (for the same signal number) (<a href="#7.14.1.1">7.14.1.1</a>).
--- The value of errno is referred to after a signal occurred other than as the result of
-  calling the abort or raise function and the corresponding signal handler obtained
-  a SIG_ERR return from a call to the signal function (<a href="#7.14.1.1">7.14.1.1</a>).
--- A signal is generated by an asynchronous signal handler (<a href="#7.14.1.1">7.14.1.1</a>).
--- A function with a variable number of arguments attempts to access its varying
-  arguments other than through a properly declared and initialized va_list object, or
-  before the va_start macro is invoked (<a href="#7.15">7.15</a>, <a href="#7.15.1.1">7.15.1.1</a>, <a href="#7.15.1.4">7.15.1.4</a>).
--- The macro va_arg is invoked using the parameter ap that was passed to a function
-  that invoked the macro va_arg with the same parameter (<a href="#7.15">7.15</a>).
--- A macro definition of va_start, va_arg, va_copy, or va_end is suppressed in
-  order to access an actual function, or the program defines an external identifier with
-  the name va_copy or va_end (<a href="#7.15.1">7.15.1</a>).
--- The va_start or va_copy macro is invoked without a corresponding invocation
-  of the va_end macro in the same function, or vice versa (<a href="#7.15.1">7.15.1</a>, <a href="#7.15.1.2">7.15.1.2</a>, <a href="#7.15.1.3">7.15.1.3</a>,
-  <a href="#7.15.1.4">7.15.1.4</a>).
--- The type parameter to the va_arg macro is not such that a pointer to an object of
-  that type can be obtained simply by postfixing a * (<a href="#7.15.1.1">7.15.1.1</a>).
--- The va_arg macro is invoked when there is no actual next argument, or with a
-  specified type that is not compatible with the promoted type of the actual next
-  argument, with certain exceptions (<a href="#7.15.1.1">7.15.1.1</a>).
--- The va_copy or va_start macro is called to initialize a va_list that was
-  previously initialized by either macro without an intervening invocation of the
-  va_end macro for the same va_list (<a href="#7.15.1.2">7.15.1.2</a>, <a href="#7.15.1.4">7.15.1.4</a>).
--- The parameter parmN of a va_start macro is declared with the register
-  storage class, with a function or array type, or with a type that is not compatible with
-  the type that results after application of the default argument promotions (<a href="#7.15.1.4">7.15.1.4</a>).
-[<a name="p500" href="#p500">page 500</a>] (<a href="#Contents">Contents</a>)
-
--- The member designator parameter of an offsetof macro is an invalid right
-  operand of the . operator for the type parameter, or designates a bit-field (<a href="#7.17">7.17</a>).
--- The argument in an instance of one of the integer-constant macros is not a decimal,
-  octal, or hexadecimal constant, or it has a value that exceeds the limits for the
-  corresponding type (<a href="#7.18.4">7.18.4</a>).
--- A byte input/output function is applied to a wide-oriented stream, or a wide character
-  input/output function is applied to a byte-oriented stream (<a href="#7.19.2">7.19.2</a>).
--- Use is made of any portion of a file beyond the most recent wide character written to
-  a wide-oriented stream (<a href="#7.19.2">7.19.2</a>).
--- The value of a pointer to a FILE object is used after the associated file is closed
-  (<a href="#7.19.3">7.19.3</a>).
--- The stream for the fflush function points to an input stream or to an update stream
-  in which the most recent operation was input (<a href="#7.19.5.2">7.19.5.2</a>).
--- The string pointed to by the mode argument in a call to the fopen function does not
-  exactly match one of the specified character sequences (<a href="#7.19.5.3">7.19.5.3</a>).
--- An output operation on an update stream is followed by an input operation without an
-  intervening call to the fflush function or a file positioning function, or an input
-  operation on an update stream is followed by an output operation with an intervening
-  call to a file positioning function (<a href="#7.19.5.3">7.19.5.3</a>).
--- An attempt is made to use the contents of the array that was supplied in a call to the
-  setvbuf function (<a href="#7.19.5.6">7.19.5.6</a>).
--- There are insufficient arguments for the format in a call to one of the formatted
-  input/output functions, or an argument does not have an appropriate type (<a href="#7.19.6.1">7.19.6.1</a>,
-  <a href="#7.19.6.2">7.19.6.2</a>, <a href="#7.24.2.1">7.24.2.1</a>, <a href="#7.24.2.2">7.24.2.2</a>).
--- The format in a call to one of the formatted input/output functions or to the
-  strftime or wcsftime function is not a valid multibyte character sequence that
-  begins and ends in its initial shift state (<a href="#7.19.6.1">7.19.6.1</a>, <a href="#7.19.6.2">7.19.6.2</a>, <a href="#7.23.3.5">7.23.3.5</a>, <a href="#7.24.2.1">7.24.2.1</a>, <a href="#7.24.2.2">7.24.2.2</a>,
-  <a href="#7.24.5.1">7.24.5.1</a>).
--- In a call to one of the formatted output functions, a precision appears with a
-  conversion specifier other than those described (<a href="#7.19.6.1">7.19.6.1</a>, <a href="#7.24.2.1">7.24.2.1</a>).
--- A conversion specification for a formatted output function uses an asterisk to denote
-  an argument-supplied field width or precision, but the corresponding argument is not
-  provided (<a href="#7.19.6.1">7.19.6.1</a>, <a href="#7.24.2.1">7.24.2.1</a>).
--- A conversion specification for a formatted output function uses a # or 0 flag with a
-  conversion specifier other than those described (<a href="#7.19.6.1">7.19.6.1</a>, <a href="#7.24.2.1">7.24.2.1</a>).
-
-
-[<a name="p501" href="#p501">page 501</a>] (<a href="#Contents">Contents</a>)
-
--- A conversion specification for one of the formatted input/output functions uses a
-  length modifier with a conversion specifier other than those described (<a href="#7.19.6.1">7.19.6.1</a>,
-  <a href="#7.19.6.2">7.19.6.2</a>, <a href="#7.24.2.1">7.24.2.1</a>, <a href="#7.24.2.2">7.24.2.2</a>).
--- An s conversion specifier is encountered by one of the formatted output functions,
-  and the argument is missing the null terminator (unless a precision is specified that
-  does not require null termination) (<a href="#7.19.6.1">7.19.6.1</a>, <a href="#7.24.2.1">7.24.2.1</a>).
--- An n conversion specification for one of the formatted input/output functions includes
-  any flags, an assignment-suppressing character, a field width, or a precision (<a href="#7.19.6.1">7.19.6.1</a>,
-  <a href="#7.19.6.2">7.19.6.2</a>, <a href="#7.24.2.1">7.24.2.1</a>, <a href="#7.24.2.2">7.24.2.2</a>).
--- A % conversion specifier is encountered by one of the formatted input/output
-  functions, but the complete conversion specification is not exactly %% (<a href="#7.19.6.1">7.19.6.1</a>,
-  <a href="#7.19.6.2">7.19.6.2</a>, <a href="#7.24.2.1">7.24.2.1</a>, <a href="#7.24.2.2">7.24.2.2</a>).
--- An invalid conversion specification is found in the format for one of the formatted
-  input/output functions, or the strftime or wcsftime function (<a href="#7.19.6.1">7.19.6.1</a>, <a href="#7.19.6.2">7.19.6.2</a>,
-  <a href="#7.23.3.5">7.23.3.5</a>, <a href="#7.24.2.1">7.24.2.1</a>, <a href="#7.24.2.2">7.24.2.2</a>, <a href="#7.24.5.1">7.24.5.1</a>).
--- The number of characters transmitted by a formatted output function is greater than
-  INT_MAX (<a href="#7.19.6.1">7.19.6.1</a>, <a href="#7.19.6.3">7.19.6.3</a>, <a href="#7.19.6.8">7.19.6.8</a>, <a href="#7.19.6.10">7.19.6.10</a>).
--- The result of a conversion by one of the formatted input functions cannot be
-  represented in the corresponding object, or the receiving object does not have an
-  appropriate type (<a href="#7.19.6.2">7.19.6.2</a>, <a href="#7.24.2.2">7.24.2.2</a>).
--- A c, s, or [ conversion specifier is encountered by one of the formatted input
-  functions, and the array pointed to by the corresponding argument is not large enough
-  to accept the input sequence (and a null terminator if the conversion specifier is s or
-  [) (<a href="#7.19.6.2">7.19.6.2</a>, <a href="#7.24.2.2">7.24.2.2</a>).
--- A c, s, or [ conversion specifier with an l qualifier is encountered by one of the
-  formatted input functions, but the input is not a valid multibyte character sequence
-  that begins in the initial shift state (<a href="#7.19.6.2">7.19.6.2</a>, <a href="#7.24.2.2">7.24.2.2</a>).
--- The input item for a %p conversion by one of the formatted input functions is not a
-  value converted earlier during the same program execution (<a href="#7.19.6.2">7.19.6.2</a>, <a href="#7.24.2.2">7.24.2.2</a>).
--- The vfprintf, vfscanf, vprintf, vscanf, vsnprintf, vsprintf,
-  vsscanf, vfwprintf, vfwscanf, vswprintf, vswscanf, vwprintf, or
-  vwscanf function is called with an improperly initialized va_list argument, or
-  the argument is used (other than in an invocation of va_end) after the function
-  returns (<a href="#7.19.6.8">7.19.6.8</a>, <a href="#7.19.6.9">7.19.6.9</a>, <a href="#7.19.6.10">7.19.6.10</a>, <a href="#7.19.6.11">7.19.6.11</a>, <a href="#7.19.6.12">7.19.6.12</a>, <a href="#7.19.6.13">7.19.6.13</a>, <a href="#7.19.6.14">7.19.6.14</a>,
-  <a href="#7.24.2.5">7.24.2.5</a>, <a href="#7.24.2.6">7.24.2.6</a>, <a href="#7.24.2.7">7.24.2.7</a>, <a href="#7.24.2.8">7.24.2.8</a>, <a href="#7.24.2.9">7.24.2.9</a>, <a href="#7.24.2.10">7.24.2.10</a>).
--- The contents of the array supplied in a call to the fgets, gets, or fgetws function
-  are used after a read error occurred (<a href="#7.19.7.2">7.19.7.2</a>, <a href="#7.19.7.7">7.19.7.7</a>, <a href="#7.24.3.2">7.24.3.2</a>).
-[<a name="p502" href="#p502">page 502</a>] (<a href="#Contents">Contents</a>)
-
--- The file position indicator for a binary stream is used after a call to the ungetc
-  function where its value was zero before the call (<a href="#7.19.7.11">7.19.7.11</a>).
--- The file position indicator for a stream is used after an error occurred during a call to
-  the fread or fwrite function (<a href="#7.19.8.1">7.19.8.1</a>, <a href="#7.19.8.2">7.19.8.2</a>).
--- A partial element read by a call to the fread function is used (<a href="#7.19.8.1">7.19.8.1</a>).
--- The fseek function is called for a text stream with a nonzero offset and either the
-  offset was not returned by a previous successful call to the ftell function on a
-  stream associated with the same file or whence is not SEEK_SET (<a href="#7.19.9.2">7.19.9.2</a>).
--- The fsetpos function is called to set a position that was not returned by a previous
-  successful call to the fgetpos function on a stream associated with the same file
-  (<a href="#7.19.9.3">7.19.9.3</a>).
--- A non-null pointer returned by a call to the calloc, malloc, or realloc function
-  with a zero requested size is used to access an object (<a href="#7.20.3">7.20.3</a>).
--- The value of a pointer that refers to space deallocated by a call to the free or
-  realloc function is used (<a href="#7.20.3">7.20.3</a>).
--- The pointer argument to the free or realloc function does not match a pointer
-  earlier returned by calloc, malloc, or realloc, or the space has been
-  deallocated by a call to free or realloc (<a href="#7.20.3.2">7.20.3.2</a>, <a href="#7.20.3.4">7.20.3.4</a>).
--- The value of the object allocated by the malloc function is used (<a href="#7.20.3.3">7.20.3.3</a>).
--- The value of any bytes in a new object allocated by the realloc function beyond
-  the size of the old object are used (<a href="#7.20.3.4">7.20.3.4</a>).
--- The program executes more than one call to the exit function (<a href="#7.20.4.3">7.20.4.3</a>).
--- During the call to a function registered with the atexit function, a call is made to
-  the longjmp function that would terminate the call to the registered function
-  (<a href="#7.20.4.3">7.20.4.3</a>).
--- The string set up by the getenv or strerror function is modified by the program
-  (<a href="#7.20.4.5">7.20.4.5</a>, <a href="#7.21.6.2">7.21.6.2</a>).
--- A command is executed through the system function in a way that is documented as
-  causing termination or some other form of undefined behavior (<a href="#7.20.4.6">7.20.4.6</a>).
--- A searching or sorting utility function is called with an invalid pointer argument, even
-  if the number of elements is zero (<a href="#7.20.5">7.20.5</a>).
--- The comparison function called by a searching or sorting utility function alters the
-  contents of the array being searched or sorted, or returns ordering values
-  inconsistently (<a href="#7.20.5">7.20.5</a>).
-
-
-[<a name="p503" href="#p503">page 503</a>] (<a href="#Contents">Contents</a>)
-
--- The array being searched by the bsearch function does not have its elements in
-  proper order (<a href="#7.20.5.1">7.20.5.1</a>).
--- The current conversion state is used by a multibyte/wide character conversion
-  function after changing the LC_CTYPE category (<a href="#7.20.7">7.20.7</a>).
--- A string or wide string utility function is instructed to access an array beyond the end
-  of an object (<a href="#7.21.1">7.21.1</a>, <a href="#7.24.4">7.24.4</a>).
--- A string or wide string utility function is called with an invalid pointer argument, even
-  if the length is zero (<a href="#7.21.1">7.21.1</a>, <a href="#7.24.4">7.24.4</a>).
--- The contents of the destination array are used after a call to the strxfrm,
-  strftime, wcsxfrm, or wcsftime function in which the specified length was
-  too small to hold the entire null-terminated result (<a href="#7.21.4.5">7.21.4.5</a>, <a href="#7.23.3.5">7.23.3.5</a>, <a href="#7.24.4.4.4">7.24.4.4.4</a>,
-  <a href="#7.24.5.1">7.24.5.1</a>).
--- The first argument in the very first call to the strtok or wcstok is a null pointer
-  (<a href="#7.21.5.8">7.21.5.8</a>, <a href="#7.24.4.5.7">7.24.4.5.7</a>).
--- The type of an argument to a type-generic macro is not compatible with the type of
-  the corresponding parameter of the selected function (<a href="#7.22">7.22</a>).
--- A complex argument is supplied for a generic parameter of a type-generic macro that
-  has no corresponding complex function (<a href="#7.22">7.22</a>).
--- The argument corresponding to an s specifier without an l qualifier in a call to the
-  fwprintf function does not point to a valid multibyte character sequence that
-  begins in the initial shift state (<a href="#7.24.2.11">7.24.2.11</a>).
--- In a call to the wcstok function, the object pointed to by ptr does not have the
-  value stored by the previous call for the same wide string (<a href="#7.24.4.5.7">7.24.4.5.7</a>).
--- An mbstate_t object is used inappropriately (<a href="#7.24.6">7.24.6</a>).
--- The value of an argument of type wint_t to a wide character classification or case
-  mapping function is neither equal to the value of WEOF nor representable as a
-  wchar_t (<a href="#7.25.1">7.25.1</a>).
--- The iswctype function is called using a different LC_CTYPE category from the
-  one in effect for the call to the wctype function that returned the description
-  (<a href="#7.25.2.2.1">7.25.2.2.1</a>).
--- The towctrans function is called using a different LC_CTYPE category from the
-  one in effect for the call to the wctrans function that returned the description
-  (<a href="#7.25.3.2.1">7.25.3.2.1</a>).
-
-
-
-
-[<a name="p504" href="#p504">page 504</a>] (<a href="#Contents">Contents</a>)
-
-<a name="J.3" href="#J.3"><b>    J.3 Implementation-defined behavior</b></a>
-1   A conforming implementation is required to document its choice of behavior in each of
-    the areas listed in this subclause. The following are implementation-defined:
-<a name="J.3.1" href="#J.3.1"><b>    J.3.1 Translation</b></a>
-1   -- How a diagnostic is identified (<a href="#3.10">3.10</a>, <a href="#5.1.1.3">5.1.1.3</a>).
-    -- Whether each nonempty sequence of white-space characters other than new-line is
-      retained or replaced by one space character in translation phase 3 (<a href="#5.1.1.2">5.1.1.2</a>).
-<a name="J.3.2" href="#J.3.2"><b>    J.3.2 Environment</b></a>
-1   -- The mapping between physical source file multibyte characters and the source
-      character set in translation phase 1 (<a href="#5.1.1.2">5.1.1.2</a>).
-    -- The name and type of the function called at program startup in a freestanding
-      environment (<a href="#5.1.2.1">5.1.2.1</a>).
-    -- The effect of program termination in a freestanding environment (<a href="#5.1.2.1">5.1.2.1</a>).
-    -- An alternative manner in which the main function may be defined (<a href="#5.1.2.2.1">5.1.2.2.1</a>).
-    -- The values given to the strings pointed to by the argv argument to main (<a href="#5.1.2.2.1">5.1.2.2.1</a>).
-    -- What constitutes an interactive device (<a href="#5.1.2.3">5.1.2.3</a>).
-    -- The set of signals, their semantics, and their default handling (<a href="#7.14">7.14</a>).
-    -- Signal values other than SIGFPE, SIGILL, and SIGSEGV that correspond to a
-      computational exception (<a href="#7.14.1.1">7.14.1.1</a>).
-    -- Signals for which the equivalent of signal(sig, SIG_IGN); is executed at
-      program startup (<a href="#7.14.1.1">7.14.1.1</a>).
-    -- The set of environment names and the method for altering the environment list used
-      by the getenv function (<a href="#7.20.4.5">7.20.4.5</a>).
-    -- The manner of execution of the string by the system function (<a href="#7.20.4.6">7.20.4.6</a>).
-<a name="J.3.3" href="#J.3.3"><b>    J.3.3 Identifiers</b></a>
-1   -- Which additional multibyte characters may appear in identifiers and their
-      correspondence to universal character names (<a href="#6.4.2">6.4.2</a>).
-    -- The number of significant initial characters in an identifier (<a href="#5.2.4.1">5.2.4.1</a>, <a href="#6.4.2">6.4.2</a>).
-
-
-
-
-[<a name="p505" href="#p505">page 505</a>] (<a href="#Contents">Contents</a>)
-
-<a name="J.3.4" href="#J.3.4"><b>    J.3.4 Characters</b></a>
-1   -- The number of bits in a byte (<a href="#3.6">3.6</a>).
-    -- The values of the members of the execution character set (<a href="#5.2.1">5.2.1</a>).
-    -- The unique value of the member of the execution character set produced for each of
-      the standard alphabetic escape sequences (<a href="#5.2.2">5.2.2</a>).
-    -- The value of a char object into which has been stored any character other than a
-      member of the basic execution character set (<a href="#6.2.5">6.2.5</a>).
-    -- Which of signed char or unsigned char has the same range, representation,
-      and behavior as ''plain'' char (<a href="#6.2.5">6.2.5</a>, <a href="#6.3.1.1">6.3.1.1</a>).
-    -- The mapping of members of the source character set (in character constants and string
-      literals) to members of the execution character set (<a href="#6.4.4.4">6.4.4.4</a>, <a href="#5.1.1.2">5.1.1.2</a>).
-    -- The value of an integer character constant containing more than one character or
-      containing a character or escape sequence that does not map to a single-byte
-      execution character (<a href="#6.4.4.4">6.4.4.4</a>).
-    -- The value of a wide character constant containing more than one multibyte character,
-      or containing a multibyte character or escape sequence not represented in the
-      extended execution character set (<a href="#6.4.4.4">6.4.4.4</a>).
-    -- The current locale used to convert a wide character constant consisting of a single
-      multibyte character that maps to a member of the extended execution character set
-      into a corresponding wide character code (<a href="#6.4.4.4">6.4.4.4</a>).
-    -- The current locale used to convert a wide string literal into corresponding wide
-      character codes (<a href="#6.4.5">6.4.5</a>).
-    -- The value of a string literal containing a multibyte character or escape sequence not
-      represented in the execution character set (<a href="#6.4.5">6.4.5</a>).
-<a name="J.3.5" href="#J.3.5"><b>    J.3.5 Integers</b></a>
-1   -- Any extended integer types that exist in the implementation (<a href="#6.2.5">6.2.5</a>).
-    -- Whether signed integer types are represented using sign and magnitude, two's
-      complement, or ones' complement, and whether the extraordinary value is a trap
-      representation or an ordinary value (<a href="#6.2.6.2">6.2.6.2</a>).
-    -- The rank of any extended integer type relative to another extended integer type with
-      the same precision (<a href="#6.3.1.1">6.3.1.1</a>).
-    -- The result of, or the signal raised by, converting an integer to a signed integer type
-      when the value cannot be represented in an object of that type (<a href="#6.3.1.3">6.3.1.3</a>).
-
-
-
-[<a name="p506" href="#p506">page 506</a>] (<a href="#Contents">Contents</a>)
-
-    -- The results of some bitwise operations on signed integers (<a href="#6.5">6.5</a>).
-<a name="J.3.6" href="#J.3.6"><b>    J.3.6 Floating point</b></a>
-1   -- The accuracy of the floating-point operations and of the library functions in
-      <a href="#7.12">&lt;math.h&gt;</a> and <a href="#7.3">&lt;complex.h&gt;</a> that return floating-point results (<a href="#5.2.4.2.2">5.2.4.2.2</a>).
-    -- The accuracy of the conversions between floating-point internal representations and
-      string representations performed by the library functions in <a href="#7.19">&lt;stdio.h&gt;</a>,
-      <a href="#7.20">&lt;stdlib.h&gt;</a>, and <a href="#7.24">&lt;wchar.h&gt;</a> (<a href="#5.2.4.2.2">5.2.4.2.2</a>).
-    -- The rounding behaviors characterized by non-standard values of FLT_ROUNDS
-      (<a href="#5.2.4.2.2">5.2.4.2.2</a>).
-    -- The evaluation methods characterized by non-standard negative values of
-      FLT_EVAL_METHOD (<a href="#5.2.4.2.2">5.2.4.2.2</a>).
-    -- The direction of rounding when an integer is converted to a floating-point number that
-      cannot exactly represent the original value (<a href="#6.3.1.4">6.3.1.4</a>).
-    -- The direction of rounding when a floating-point number is converted to a narrower
-      floating-point number (<a href="#6.3.1.5">6.3.1.5</a>).
-    -- How the nearest representable value or the larger or smaller representable value
-      immediately adjacent to the nearest representable value is chosen for certain floating
-      constants (<a href="#6.4.4.2">6.4.4.2</a>).
-    -- Whether and how floating expressions are contracted when not disallowed by the
-      FP_CONTRACT pragma (<a href="#6.5">6.5</a>).
-    -- The default state for the FENV_ACCESS pragma (<a href="#7.6.1">7.6.1</a>).
-    -- Additional floating-point exceptions, rounding             modes,    environments,   and
-      classifications, and their macro names (<a href="#7.6">7.6</a>, <a href="#7.12">7.12</a>).
-    -- The default state for the FP_CONTRACT pragma (<a href="#7.12.2">7.12.2</a>).                                    *
-<a name="J.3.7" href="#J.3.7"><b>    J.3.7 Arrays and pointers</b></a>
-1   -- The result of converting a pointer to an integer or vice versa (<a href="#6.3.2.3">6.3.2.3</a>).
-    -- The size of the result of subtracting two pointers to elements of the same array
-      (<a href="#6.5.6">6.5.6</a>).
-
-
-
-
-[<a name="p507" href="#p507">page 507</a>] (<a href="#Contents">Contents</a>)
-
-<a name="J.3.8" href="#J.3.8"><b>    J.3.8 Hints</b></a>
-1   -- The extent to which suggestions made by using the register storage-class
-      specifier are effective (<a href="#6.7.1">6.7.1</a>).
-    -- The extent to which suggestions made by using the inline function specifier are
-      effective (<a href="#6.7.4">6.7.4</a>).
-<a name="J.3.9" href="#J.3.9"><b>    J.3.9 Structures, unions, enumerations, and bit-fields</b></a>
-1   -- Whether a ''plain'' int bit-field is treated as a signed int bit-field or as an
-      unsigned int bit-field (<a href="#6.7.2">6.7.2</a>, <a href="#6.7.2.1">6.7.2.1</a>).
-    -- Allowable bit-field types other than _Bool, signed int, and unsigned int
-      (<a href="#6.7.2.1">6.7.2.1</a>).
-    -- Whether a bit-field can straddle a storage-unit boundary (<a href="#6.7.2.1">6.7.2.1</a>).
-    -- The order of allocation of bit-fields within a unit (<a href="#6.7.2.1">6.7.2.1</a>).
-    -- The alignment of non-bit-field members of structures (<a href="#6.7.2.1">6.7.2.1</a>). This should present
-      no problem unless binary data written by one implementation is read by another.
-    -- The integer type compatible with each enumerated type (<a href="#6.7.2.2">6.7.2.2</a>).
-<a name="J.3.10" href="#J.3.10"><b>    J.3.10 Qualifiers</b></a>
-1   -- What constitutes an access to an object that has volatile-qualified type (<a href="#6.7.3">6.7.3</a>).
-<a name="J.3.11" href="#J.3.11"><b>    J.3.11 Preprocessing directives</b></a>
-1   -- The locations within #pragma directives where header name preprocessing tokens
-      are recognized (<a href="#6.4">6.4</a>, <a href="#6.4.7">6.4.7</a>).
-    -- How sequences in both forms of header names are mapped to headers or external
-      source file names (<a href="#6.4.7">6.4.7</a>).
-    -- Whether the value of a character constant in a constant expression that controls
-      conditional inclusion matches the value of the same character constant in the
-      execution character set (<a href="#6.10.1">6.10.1</a>).
-    -- Whether the value of a single-character character constant in a constant expression
-      that controls conditional inclusion may have a negative value (<a href="#6.10.1">6.10.1</a>).
-    -- The places that are searched for an included &lt; &gt; delimited header, and how the places
-      are specified or the header is identified (<a href="#6.10.2">6.10.2</a>).
-    -- How the named source file is searched for in an included " " delimited header
-      (<a href="#6.10.2">6.10.2</a>).
-    -- The method by which preprocessing tokens (possibly resulting from macro
-      expansion) in a #include directive are combined into a header name (<a href="#6.10.2">6.10.2</a>).
-
-[<a name="p508" href="#p508">page 508</a>] (<a href="#Contents">Contents</a>)
-
-    -- The nesting limit for #include processing (<a href="#6.10.2">6.10.2</a>).
-    -- Whether the # operator inserts a \ character before the \ character that begins a
-      universal character name in a character constant or string literal (<a href="#6.10.3.2">6.10.3.2</a>).
-    -- The behavior on each recognized non-STDC #pragma directive (<a href="#6.10.6">6.10.6</a>).
-    -- The definitions for __DATE__ and __TIME__ when respectively, the date and
-      time of translation are not available (<a href="#6.10.8">6.10.8</a>).
-<a name="J.3.12" href="#J.3.12"><b>    J.3.12 Library functions</b></a>
-1   -- Any library facilities available to a freestanding program, other than the minimal set
-      required by clause 4 (<a href="#5.1.2.1">5.1.2.1</a>).
-    -- The format of the diagnostic printed by the assert macro (<a href="#7.2.1.1">7.2.1.1</a>).
-    -- The representation of the floating-point               status   flags     stored   by   the
-      fegetexceptflag function (<a href="#7.6.2.2">7.6.2.2</a>).
-    -- Whether the feraiseexcept function raises the ''inexact'' floating-point
-      exception in addition to the ''overflow'' or ''underflow'' floating-point exception
-      (<a href="#7.6.2.3">7.6.2.3</a>).
-    -- Strings other than "C" and "" that may be passed as the second argument to the
-      setlocale function (<a href="#7.11.1.1">7.11.1.1</a>).
-    -- The types defined for float_t and double_t when the value of the
-      FLT_EVAL_METHOD macro is less than 0 (<a href="#7.12">7.12</a>).
-    -- Domain errors for the mathematics functions, other than those required by this
-      International Standard (<a href="#7.12.1">7.12.1</a>).
-    -- The values returned by the mathematics functions on domain errors (<a href="#7.12.1">7.12.1</a>).
-    -- The values returned by the mathematics functions on underflow range errors, whether
-      errno is set to the value of the macro ERANGE when the integer expression
-      math_errhandling &amp; MATH_ERRNO is nonzero, and whether the ''underflow''
-      floating-point exception is raised when the integer expression math_errhandling
-      &amp; MATH_ERREXCEPT is nonzero. (<a href="#7.12.1">7.12.1</a>).
-    -- Whether a domain error occurs or zero is returned when an fmod function has a
-      second argument of zero (<a href="#7.12.10.1">7.12.10.1</a>).
-    -- Whether a domain error occurs or zero is returned when a remainder function has
-      a second argument of zero (<a href="#7.12.10.2">7.12.10.2</a>).
-    -- The base-2 logarithm of the modulus used by the remquo functions in reducing the
-      quotient (<a href="#7.12.10.3">7.12.10.3</a>).
-
-
-
-[<a name="p509" href="#p509">page 509</a>] (<a href="#Contents">Contents</a>)
-
--- Whether a domain error occurs or zero is returned when a remquo function has a
-  second argument of zero (<a href="#7.12.10.3">7.12.10.3</a>).
--- Whether the equivalent of signal(sig, SIG_DFL); is executed prior to the call
-  of a signal handler, and, if not, the blocking of signals that is performed (<a href="#7.14.1.1">7.14.1.1</a>).
--- The null pointer constant to which the macro NULL expands (<a href="#7.17">7.17</a>).
--- Whether the last line of a text stream requires a terminating new-line character
-  (<a href="#7.19.2">7.19.2</a>).
--- Whether space characters that are written out to a text stream immediately before a
-  new-line character appear when read in (<a href="#7.19.2">7.19.2</a>).
--- The number of null characters that may be appended to data written to a binary
-  stream (<a href="#7.19.2">7.19.2</a>).
--- Whether the file position indicator of an append-mode stream is initially positioned at
-  the beginning or end of the file (<a href="#7.19.3">7.19.3</a>).
--- Whether a write on a text stream causes the associated file to be truncated beyond that
-  point (<a href="#7.19.3">7.19.3</a>).
--- The characteristics of file buffering (<a href="#7.19.3">7.19.3</a>).
--- Whether a zero-length file actually exists (<a href="#7.19.3">7.19.3</a>).
--- The rules for composing valid file names (<a href="#7.19.3">7.19.3</a>).
--- Whether the same file can be simultaneously open multiple times (<a href="#7.19.3">7.19.3</a>).
--- The nature and choice of encodings used for multibyte characters in files (<a href="#7.19.3">7.19.3</a>).
--- The effect of the remove function on an open file (<a href="#7.19.4.1">7.19.4.1</a>).
--- The effect if a file with the new name exists prior to a call to the rename function
-  (<a href="#7.19.4.2">7.19.4.2</a>).
--- Whether an open temporary file is removed upon abnormal program termination
-  (<a href="#7.19.4.3">7.19.4.3</a>).
--- Which changes of mode are permitted (if any), and under what circumstances
-  (<a href="#7.19.5.4">7.19.5.4</a>).
--- The style used to print an infinity or NaN, and the meaning of any n-char or n-wchar
-  sequence printed for a NaN (<a href="#7.19.6.1">7.19.6.1</a>, <a href="#7.24.2.1">7.24.2.1</a>).
--- The output for %p conversion in the fprintf or fwprintf function (<a href="#7.19.6.1">7.19.6.1</a>,
-  <a href="#7.24.2.1">7.24.2.1</a>).
--- The interpretation of a - character that is neither the first nor the last character, nor
-    the second where a ^ character is the first, in the scanlist for %[ conversion in the
-   fscanf or fwscanf function (<a href="#7.19.6.2">7.19.6.2</a>, <a href="#7.24.2.1">7.24.2.1</a>).
-[<a name="p510" href="#p510">page 510</a>] (<a href="#Contents">Contents</a>)
-
-    -- The set of sequences matched by a %p conversion and the interpretation of the
-      corresponding input item in the fscanf or fwscanf function (<a href="#7.19.6.2">7.19.6.2</a>, <a href="#7.24.2.2">7.24.2.2</a>).
-    -- The value to which the macro errno is set by the fgetpos, fsetpos, or ftell
-      functions on failure (<a href="#7.19.9.1">7.19.9.1</a>, <a href="#7.19.9.3">7.19.9.3</a>, <a href="#7.19.9.4">7.19.9.4</a>).
-    -- The meaning of any n-char or n-wchar sequence in a string representing a NaN that is
-      converted by the strtod, strtof, strtold, wcstod, wcstof, or wcstold
-      function (<a href="#7.20.1.3">7.20.1.3</a>, <a href="#7.24.4.1.1">7.24.4.1.1</a>).
-    -- Whether or not the strtod, strtof, strtold, wcstod, wcstof, or wcstold
-      function sets errno to ERANGE when underflow occurs (<a href="#7.20.1.3">7.20.1.3</a>, <a href="#7.24.4.1.1">7.24.4.1.1</a>).
-    -- Whether the calloc, malloc, and realloc functions return a null pointer or a
-      pointer to an allocated object when the size requested is zero (<a href="#7.20.3">7.20.3</a>).
-    -- Whether open streams with unwritten buffered data are flushed, open streams are
-      closed, or temporary files are removed when the abort or _Exit function is called
-      (<a href="#7.20.4.1">7.20.4.1</a>, <a href="#7.20.4.4">7.20.4.4</a>).
-    -- The termination status returned to the host environment by the abort, exit, or
-      _Exit function (<a href="#7.20.4.1">7.20.4.1</a>, <a href="#7.20.4.3">7.20.4.3</a>, <a href="#7.20.4.4">7.20.4.4</a>).
-    -- The value returned by the system function when its argument is not a null pointer
-      (<a href="#7.20.4.6">7.20.4.6</a>).
-    -- The local time zone and Daylight Saving Time (<a href="#7.23.1">7.23.1</a>).
-    -- The range and precision of times representable in clock_t and time_t (<a href="#7.23">7.23</a>).
-    -- The era for the clock function (<a href="#7.23.2.1">7.23.2.1</a>).
-    -- The replacement string for the %Z specifier to the strftime, and wcsftime
-      functions in the "C" locale (<a href="#7.23.3.5">7.23.3.5</a>, <a href="#7.24.5.1">7.24.5.1</a>).
-    -- Whether the functions in <a href="#7.12">&lt;math.h&gt;</a> honor the rounding direction mode in an
-      IEC 60559 conformant implementation, unless explicitly specified otherwise (<a href="#F.9">F.9</a>).
-<a name="J.3.13" href="#J.3.13"><b>    J.3.13 Architecture</b></a>
-1   -- The values or expressions assigned to the macros specified in the headers
-      <a href="#7.7">&lt;float.h&gt;</a>, <a href="#7.10">&lt;limits.h&gt;</a>, and <a href="#7.18">&lt;stdint.h&gt;</a> (<a href="#5.2.4.2">5.2.4.2</a>, <a href="#7.18.2">7.18.2</a>, <a href="#7.18.3">7.18.3</a>).
-    -- The number, order, and encoding of bytes in any object (when not explicitly specified
-      in this International Standard) (<a href="#6.2.6.1">6.2.6.1</a>).
-    -- The value of the result of the sizeof operator (<a href="#6.5.3.4">6.5.3.4</a>).
-
-
-
-
-[<a name="p511" href="#p511">page 511</a>] (<a href="#Contents">Contents</a>)
-
-<a name="J.4" href="#J.4"><b>    J.4 Locale-specific behavior</b></a>
-1   The following characteristics of a hosted environment are locale-specific and are required
-    to be documented by the implementation:
-    -- Additional members of the source and execution character sets beyond the basic
-      character set (<a href="#5.2.1">5.2.1</a>).
-    -- The presence, meaning, and representation of additional multibyte characters in the
-      execution character set beyond the basic character set (<a href="#5.2.1.2">5.2.1.2</a>).
-    -- The shift states used for the encoding of multibyte characters (<a href="#5.2.1.2">5.2.1.2</a>).
-    -- The direction of writing of successive printing characters (<a href="#5.2.2">5.2.2</a>).
-    -- The decimal-point character (<a href="#7.1.1">7.1.1</a>).
-    -- The set of printing characters (<a href="#7.4">7.4</a>, <a href="#7.25.2">7.25.2</a>).
-    -- The set of control characters (<a href="#7.4">7.4</a>, <a href="#7.25.2">7.25.2</a>).
-    -- The sets of characters tested for by the isalpha, isblank, islower, ispunct,
-      isspace, isupper, iswalpha, iswblank, iswlower, iswpunct,
-      iswspace, or iswupper functions (<a href="#7.4.1.2">7.4.1.2</a>, <a href="#7.4.1.3">7.4.1.3</a>, <a href="#7.4.1.7">7.4.1.7</a>, <a href="#7.4.1.9">7.4.1.9</a>, <a href="#7.4.1.10">7.4.1.10</a>,
-      <a href="#7.4.1.11">7.4.1.11</a>, <a href="#7.25.2.1.2">7.25.2.1.2</a>, <a href="#7.25.2.1.3">7.25.2.1.3</a>, <a href="#7.25.2.1.7">7.25.2.1.7</a>, <a href="#7.25.2.1.9">7.25.2.1.9</a>, <a href="#7.25.2.1.10">7.25.2.1.10</a>, <a href="#7.25.2.1.11">7.25.2.1.11</a>).
-    -- The native environment (<a href="#7.11.1.1">7.11.1.1</a>).
-    -- Additional subject sequences accepted by the numeric conversion functions (<a href="#7.20.1">7.20.1</a>,
-      <a href="#7.24.4.1">7.24.4.1</a>).
-    -- The collation sequence of the execution character set (<a href="#7.21.4.3">7.21.4.3</a>, <a href="#7.24.4.4.2">7.24.4.4.2</a>).
-    -- The contents of the error message strings set up by the strerror function
-      (<a href="#7.21.6.2">7.21.6.2</a>).
-    -- The formats for time and date (<a href="#7.23.3.5">7.23.3.5</a>, <a href="#7.24.5.1">7.24.5.1</a>).
-    -- Character mappings that are supported by the towctrans function (<a href="#7.25.1">7.25.1</a>).
-    -- Character classifications that are supported by the iswctype function (<a href="#7.25.1">7.25.1</a>).
-
-
-
-
-[<a name="p512" href="#p512">page 512</a>] (<a href="#Contents">Contents</a>)
-
-<a name="J.5" href="#J.5"><b>    J.5 Common extensions</b></a>
-1   The following extensions are widely used in many systems, but are not portable to all
-    implementations. The inclusion of any extension that may cause a strictly conforming
-    program to become invalid renders an implementation nonconforming. Examples of such
-    extensions are new keywords, extra library functions declared in standard headers, or
-    predefined macros with names that do not begin with an underscore.
-<a name="J.5.1" href="#J.5.1"><b>    J.5.1 Environment arguments</b></a>
-1   In a hosted environment, the main function receives a third argument, char *envp[],
-    that points to a null-terminated array of pointers to char, each of which points to a string
-    that provides information about the environment for this execution of the program
-    (<a href="#5.1.2.2.1">5.1.2.2.1</a>).
-<a name="J.5.2" href="#J.5.2"><b>    J.5.2 Specialized identifiers</b></a>
-1   Characters other than the underscore _, letters, and digits, that are not part of the basic
-    source character set (such as the dollar sign $, or characters in national character sets)
-    may appear in an identifier (<a href="#6.4.2">6.4.2</a>).
-<a name="J.5.3" href="#J.5.3"><b>    J.5.3 Lengths and cases of identifiers</b></a>
-1   All characters in identifiers (with or without external linkage) are significant (<a href="#6.4.2">6.4.2</a>).
-<a name="J.5.4" href="#J.5.4"><b>    J.5.4 Scopes of identifiers</b></a>
-1   A function identifier, or the identifier of an object the declaration of which contains the
-    keyword extern, has file scope (<a href="#6.2.1">6.2.1</a>).
-<a name="J.5.5" href="#J.5.5"><b>    J.5.5 Writable string literals</b></a>
-1   String literals are modifiable (in which case, identical string literals should denote distinct
-    objects) (<a href="#6.4.5">6.4.5</a>).
-<a name="J.5.6" href="#J.5.6"><b>    J.5.6 Other arithmetic types</b></a>
-1   Additional arithmetic types, such as __int128 or double double, and their
-    appropriate conversions are defined (<a href="#6.2.5">6.2.5</a>, <a href="#6.3.1">6.3.1</a>). Additional floating types may have
-    more range or precision than long double, may be used for evaluating expressions of
-    other floating types, and may be used to define float_t or double_t.
-
-
-
-
-[<a name="p513" href="#p513">page 513</a>] (<a href="#Contents">Contents</a>)
-
-<a name="J.5.7" href="#J.5.7"><b>    J.5.7 Function pointer casts</b></a>
-1   A pointer to an object or to void may be cast to a pointer to a function, allowing data to
-    be invoked as a function (<a href="#6.5.4">6.5.4</a>).
-2   A pointer to a function may be cast to a pointer to an object or to void, allowing a
-    function to be inspected or modified (for example, by a debugger) (<a href="#6.5.4">6.5.4</a>).
-<a name="J.5.8" href="#J.5.8"><b>    J.5.8 Extended bit-field types</b></a>
-1   A bit-field may be declared with a type other than _Bool, unsigned int, or
-    signed int, with an appropriate maximum width (<a href="#6.7.2.1">6.7.2.1</a>).
-<a name="J.5.9" href="#J.5.9"><b>    J.5.9 The fortran keyword</b></a>
-1   The fortran function specifier may be used in a function declaration to indicate that
-    calls suitable for FORTRAN should be generated, or that a different representation for the
-    external name is to be generated (<a href="#6.7.4">6.7.4</a>).
-<a name="J.5.10" href="#J.5.10"><b>    J.5.10 The asm keyword</b></a>
-1   The asm keyword may be used to insert assembly language directly into the translator
-    output (<a href="#6.8">6.8</a>). The most common implementation is via a statement of the form:
-           asm ( character-string-literal );
-<a name="J.5.11" href="#J.5.11"><b>    J.5.11 Multiple external definitions</b></a>
-1   There may be more than one external definition for the identifier of an object, with or
-    without the explicit use of the keyword extern; if the definitions disagree, or more than
-    one is initialized, the behavior is undefined (<a href="#6.9.2">6.9.2</a>).
-<a name="J.5.12" href="#J.5.12"><b>    J.5.12 Predefined macro names</b></a>
-1   Macro names that do not begin with an underscore, describing the translation and
-    execution environments, are defined by the implementation before translation begins
-    (<a href="#6.10.8">6.10.8</a>).
-<a name="J.5.13" href="#J.5.13"><b>    J.5.13 Floating-point status flags</b></a>
-1   If any floating-point status flags are set on normal termination after all calls to functions
-    registered by the atexit function have been made (see <a href="#7.20.4.3">7.20.4.3</a>), the implementation
-    writes some diagnostics indicating the fact to the stderr stream, if it is still open,
-
-
-
-
-[<a name="p514" href="#p514">page 514</a>] (<a href="#Contents">Contents</a>)
-
-<a name="J.5.14" href="#J.5.14"><b>    J.5.14 Extra arguments for signal handlers</b></a>
-1   Handlers for specific signals are called with extra arguments in addition to the signal
-    number (<a href="#7.14.1.1">7.14.1.1</a>).
-<a name="J.5.15" href="#J.5.15"><b>    J.5.15 Additional stream types and file-opening modes</b></a>
-1   Additional mappings from files to streams are supported (<a href="#7.19.2">7.19.2</a>).
-2   Additional file-opening modes may be specified by characters appended to the mode
-    argument of the fopen function (<a href="#7.19.5.3">7.19.5.3</a>).
-<a name="J.5.16" href="#J.5.16"><b>    J.5.16 Defined file position indicator</b></a>
-1   The file position indicator is decremented by each successful call to the ungetc or
-    ungetwc function for a text stream, except if its value was zero before a call (<a href="#7.19.7.11">7.19.7.11</a>,
-<a name="7.24.3.10)" href="#7.24.3.10)"><b>    7.24.3.10).</b></a>
-<a name="J.5.17" href="#J.5.17"><b>    J.5.17 Math error reporting</b></a>
-1   Functions declared in <a href="#7.3">&lt;complex.h&gt;</a> and <a href="#7.12">&lt;math.h&gt;</a> raise SIGFPE to report errors
-    instead of, or in addition to, setting errno or raising floating-point exceptions (<a href="#7.3">7.3</a>,
-<a name="7.12)" href="#7.12)"><b>    7.12).</b></a>
-
-
-
-
-[<a name="p515" href="#p515">page 515</a>] (<a href="#Contents">Contents</a>)
-
-
-<a name="Bibliography" href="#Bibliography"><b>                                 Bibliography</b></a>
-  1. ''The C Reference Manual'' by Dennis M. Ritchie, a version of which was
-     published in The C Programming Language by Brian W. Kernighan and Dennis
-     M. Ritchie, Prentice-Hall, Inc., (1978). Copyright owned by AT&amp;T.
-  2.   1984 /usr/group Standard by the /usr/group Standards Committee, Santa Clara,
-       California, USA, November 1984.
-  3.   ANSI X3/TR-1-82 (1982), American National Dictionary for Information
-       Processing Systems, Information Processing Systems Technical Report.
-  4.   ANSI/IEEE 754-1985, American National Standard for Binary Floating-Point
-       Arithmetic.
-  5.   ANSI/IEEE 854-1988, American National Standard for Radix-Independent
-       Floating-Point Arithmetic.
-  6.   IEC 60559:1989, Binary floating-point arithmetic for microprocessor systems,
-       second edition (previously designated IEC 559:1989).
-  7.   ISO 31-11:1992, Quantities and units -- Part 11: Mathematical signs and
-       symbols for use in the physical sciences and technology.
-  8. ISO/IEC 646:1991, Information technology -- ISO 7-bit coded character set for
-     information interchange.
-  9. ISO/IEC 2382-1:1993, Information technology -- Vocabulary -- Part 1:
-     Fundamental terms.
- 10. ISO 4217:1995, Codes for the representation of currencies and funds.
- 11. ISO 8601:1988, Data elements and interchange formats -- Information
-     interchange -- Representation of dates and times.
- 12.   ISO/IEC 9899:1990, Programming languages -- C.
- 13. ISO/IEC 9899/COR1:1994, Technical Corrigendum 1.
- 14. ISO/IEC 9899/COR2:1996, Technical Corrigendum 2.
- 15.   ISO/IEC 9899/AMD1:1995, Amendment 1 to ISO/IEC 9899:1990 C Integrity.
- 16.   ISO/IEC 9945-2:1993, Information technology -- Portable Operating System
-       Interface (POSIX) -- Part 2: Shell and Utilities.
- 17.   ISO/IEC TR 10176:1998, Information technology -- Guidelines for the
-       preparation of programming language standards.
- 18. ISO/IEC 10646-1:1993, Information technology -- Universal Multiple-Octet
-     Coded Character Set (UCS) -- Part 1: Architecture and Basic Multilingual Plane.
-
-[<a name="p516" href="#p516">page 516</a>] (<a href="#Contents">Contents</a>)
-
- 19. ISO/IEC 10646-1/COR1:1996,      Technical       Corrigendum      1      to
-     ISO/IEC 10646-1:1993.
- 20. ISO/IEC 10646-1/COR2:1998,      Technical       Corrigendum      2      to
-     ISO/IEC 10646-1:1993.
- 21.   ISO/IEC 10646-1/AMD1:1996, Amendment 1 to ISO/IEC 10646-1:1993
-       Transformation Format for 16 planes of group 00 (UTF-16).
- 22.   ISO/IEC 10646-1/AMD2:1996, Amendment 2 to ISO/IEC 10646-1:1993 UCS
-       Transformation Format 8 (UTF-8).
- 23. ISO/IEC 10646-1/AMD3:1996, Amendment 3 to ISO/IEC 10646-1:1993.
- 24. ISO/IEC 10646-1/AMD4:1996, Amendment 4 to ISO/IEC 10646-1:1993.
- 25. ISO/IEC 10646-1/AMD5:1998, Amendment 5 to ISO/IEC 10646-1:1993 Hangul
-     syllables.
- 26. ISO/IEC 10646-1/AMD6:1997, Amendment 6 to ISO/IEC 10646-1:1993 Tibetan.
- 27. ISO/IEC 10646-1/AMD7:1997, Amendment 7 to ISO/IEC 10646-1:1993 33
-     additional characters.
- 28. ISO/IEC 10646-1/AMD8:1997, Amendment 8 to ISO/IEC 10646-1:1993.
- 29. ISO/IEC 10646-1/AMD9:1997,    Amendment     9   to    ISO/IEC 10646-1:1993
-     Identifiers for characters.
- 30.   ISO/IEC 10646-1/AMD10:1998, Amendment 10 to ISO/IEC 10646-1:1993
-       Ethiopic.
- 31. ISO/IEC 10646-1/AMD11:1998, Amendment 11 to ISO/IEC 10646-1:1993
-     Unified Canadian Aboriginal Syllabics.
- 32. ISO/IEC 10646-1/AMD12:1998, Amendment 12 to ISO/IEC 10646-1:1993
-     Cherokee.
- 33. ISO/IEC 10967-1:1994, Information technology -- Language independent
-     arithmetic -- Part 1: Integer and floating point arithmetic.
-
-
-
-
-[<a name="p517" href="#p517">page 517</a>] (<a href="#Contents">Contents</a>)
-
-
-
-[<a name="p518" href="#p518">page 518</a>] (<a href="#Contents">Contents</a>)
-
-
-<a name="Index" href="#Index"><b>Index</b></a>
-??? x ???, <a href="#3.18">3.18</a>                                                    , (comma punctuator), <a href="#6.5.2">6.5.2</a>, <a href="#6.7">6.7</a>, <a href="#6.7.2.1">6.7.2.1</a>, <a href="#6.7.2.2">6.7.2.2</a>,
-                                                                    <a href="#6.7.2.3">6.7.2.3</a>, <a href="#6.7.8">6.7.8</a>
-??? x ???, <a href="#3.19">3.19</a>                                                    - (subtraction operator), <a href="#6.5.6">6.5.6</a>, <a href="#F.3">F.3</a>, <a href="#G.5.2">G.5.2</a>
-! (logical negation operator), <a href="#6.5.3.3">6.5.3.3</a>                         - (unary minus operator), <a href="#6.5.3.3">6.5.3.3</a>, <a href="#F.3">F.3</a>
-!= (inequality operator), <a href="#6.5.9">6.5.9</a>                                -- (postfix decrement operator), <a href="#6.3.2.1">6.3.2.1</a>, <a href="#6.5.2.4">6.5.2.4</a>
-# operator, <a href="#6.10.3.2">6.10.3.2</a>                                           -- (prefix decrement operator), <a href="#6.3.2.1">6.3.2.1</a>, <a href="#6.5.3.1">6.5.3.1</a>
-# preprocessing directive, <a href="#6.10.7">6.10.7</a>                              -= (subtraction assignment operator), <a href="#6.5.16.2">6.5.16.2</a>
-# punctuator, <a href="#6.10">6.10</a>                                             -&gt; (structure/union pointer operator), <a href="#6.5.2.3">6.5.2.3</a>
-## operator, <a href="#6.10.3.3">6.10.3.3</a>                                          . (structure/union member operator), <a href="#6.3.2.1">6.3.2.1</a>,
-#define preprocessing directive, <a href="#6.10.3">6.10.3</a>                             <a href="#6.5.2.3">6.5.2.3</a>
-#elif preprocessing directive, <a href="#6.10.1">6.10.1</a>                          . punctuator, <a href="#6.7.8">6.7.8</a>
-#else preprocessing directive, <a href="#6.10.1">6.10.1</a>                          ... (ellipsis punctuator), <a href="#6.5.2.2">6.5.2.2</a>, <a href="#6.7.5.3">6.7.5.3</a>, <a href="#6.10.3">6.10.3</a>
-#endif preprocessing directive, <a href="#6.10.1">6.10.1</a>                         / (division operator), <a href="#6.5.5">6.5.5</a>, <a href="#F.3">F.3</a>, <a href="#G.5.1">G.5.1</a>
-#error preprocessing directive, <a href="#4">4</a>, <a href="#6.10.5">6.10.5</a>                      /* */ (comment delimiters), <a href="#6.4.9">6.4.9</a>
-#if preprocessing directive, <a href="#5.2.4.2.1">5.2.4.2.1</a>, <a href="#5.2.4.2.2">5.2.4.2.2</a>,             // (comment delimiter), <a href="#6.4.9">6.4.9</a>
-     <a href="#6.10.1">6.10.1</a>, <a href="#7.1.4">7.1.4</a>                                             /= (division assignment operator), <a href="#6.5.16.2">6.5.16.2</a>
-#ifdef preprocessing directive, <a href="#6.10.1">6.10.1</a>                         : (colon punctuator), <a href="#6.7.2.1">6.7.2.1</a>
-#ifndef preprocessing directive, <a href="#6.10.1">6.10.1</a>                        :&gt; (alternative spelling of ]), <a href="#6.4.6">6.4.6</a>
-#include preprocessing directive, <a href="#5.1.1.2">5.1.1.2</a>,                     ; (semicolon punctuator), <a href="#6.7">6.7</a>, <a href="#6.7.2.1">6.7.2.1</a>, <a href="#6.8.3">6.8.3</a>,
-     <a href="#6.10.2">6.10.2</a>                                                         <a href="#6.8.5">6.8.5</a>, <a href="#6.8.6">6.8.6</a>
-#line preprocessing directive, <a href="#6.10.4">6.10.4</a>                          &lt; (less-than operator), <a href="#6.5.8">6.5.8</a>
-#pragma preprocessing directive, <a href="#6.10.6">6.10.6</a>                        &lt;% (alternative spelling of {), <a href="#6.4.6">6.4.6</a>
-#undef preprocessing directive, <a href="#6.10.3.5">6.10.3.5</a>, <a href="#7.1.3">7.1.3</a>,               &lt;: (alternative spelling of [), <a href="#6.4.6">6.4.6</a>
-     <a href="#7.1.4">7.1.4</a>                                                     &lt;&lt; (left-shift operator), <a href="#6.5.7">6.5.7</a>
-% (remainder operator), <a href="#6.5.5">6.5.5</a>                                  &lt;&lt;= (left-shift assignment operator), <a href="#6.5.16.2">6.5.16.2</a>
-%: (alternative spelling of #), <a href="#6.4.6">6.4.6</a>                          &lt;= (less-than-or-equal-to operator), <a href="#6.5.8">6.5.8</a>
-%:%: (alternative spelling of ##), <a href="#6.4.6">6.4.6</a>                       <a href="#7.2">&lt;assert.h&gt;</a> header, <a href="#7.2">7.2</a>, <a href="#B.1">B.1</a>
-%= (remainder assignment operator), <a href="#6.5.16.2">6.5.16.2</a>                   <a href="#7.3">&lt;complex.h&gt;</a> header, <a href="#5.2.4.2.2">5.2.4.2.2</a>, <a href="#7.3">7.3</a>, <a href="#7.22">7.22</a>,
-%&gt; (alternative spelling of }), <a href="#6.4.6">6.4.6</a>                               <a href="#7.26.1">7.26.1</a>, <a href="#G.6">G.6</a>, <a href="#J.5.17">J.5.17</a>
-&amp; (address operator), <a href="#6.3.2.1">6.3.2.1</a>, <a href="#6.5.3.2">6.5.3.2</a>                         <a href="#7.4">&lt;ctype.h&gt;</a> header, <a href="#7.4">7.4</a>, <a href="#7.26.2">7.26.2</a>
-&amp; (bitwise AND operator), <a href="#6.5.10">6.5.10</a>                               <a href="#7.5">&lt;errno.h&gt;</a> header, <a href="#7.5">7.5</a>, <a href="#7.26.3">7.26.3</a>
-&amp;&amp; (logical AND operator), <a href="#6.5.13">6.5.13</a>                              <a href="#7.6">&lt;fenv.h&gt;</a> header, <a href="#5.1.2.3">5.1.2.3</a>, <a href="#5.2.4.2.2">5.2.4.2.2</a>, <a href="#7.6">7.6</a>, <a href="#7.12">7.12</a>, <a href="#F">F</a>,
-&amp;= (bitwise AND assignment operator), <a href="#6.5.16.2">6.5.16.2</a>                      <a href="#H">H</a>
-' ' (space character), <a href="#5.1.1.2">5.1.1.2</a>, <a href="#5.2.1">5.2.1</a>, <a href="#6.4">6.4</a>, <a href="#7.4.1.3">7.4.1.3</a>,           <a href="#7.7">&lt;float.h&gt;</a> header, <a href="#4">4</a>, <a href="#5.2.4.2.2">5.2.4.2.2</a>, <a href="#7.7">7.7</a>, <a href="#7.20.1.3">7.20.1.3</a>,
-     <a href="#7.4.1.10">7.4.1.10</a>, <a href="#7.25.2.1.3">7.25.2.1.3</a>                                           <a href="#7.24.4.1.1">7.24.4.1.1</a>
-( ) (cast operator), <a href="#6.5.4">6.5.4</a>                                     <a href="#7.8">&lt;inttypes.h&gt;</a> header, <a href="#7.8">7.8</a>, <a href="#7.26.4">7.26.4</a>
-( ) (function-call operator), <a href="#6.5.2.2">6.5.2.2</a>                          <a href="#7.9">&lt;iso646.h&gt;</a> header, <a href="#4">4</a>, <a href="#7.9">7.9</a>
-( ) (parentheses punctuator), <a href="#6.7.5.3">6.7.5.3</a>, <a href="#6.8.4">6.8.4</a>, <a href="#6.8.5">6.8.5</a>            <a href="#7.10">&lt;limits.h&gt;</a> header, <a href="#4">4</a>, <a href="#5.2.4.2.1">5.2.4.2.1</a>, <a href="#6.2.5">6.2.5</a>, <a href="#7.10">7.10</a>
-( ){ } (compound-literal operator), <a href="#6.5.2.5">6.5.2.5</a>                    <a href="#7.11">&lt;locale.h&gt;</a> header, <a href="#7.11">7.11</a>, <a href="#7.26.5">7.26.5</a>
-* (asterisk punctuator), <a href="#6.7.5.1">6.7.5.1</a>, <a href="#6.7.5.2">6.7.5.2</a>                      <a href="#7.12">&lt;math.h&gt;</a> header, <a href="#5.2.4.2.2">5.2.4.2.2</a>, <a href="#6.5">6.5</a>, <a href="#7.12">7.12</a>, <a href="#7.22">7.22</a>, <a href="#F">F</a>,
-* (indirection operator), <a href="#6.5.2.1">6.5.2.1</a>, <a href="#6.5.3.2">6.5.3.2</a>                          <a href="#F.9">F.9</a>, <a href="#J.5.17">J.5.17</a>
-* (multiplication operator), <a href="#6.5.5">6.5.5</a>, <a href="#F.3">F.3</a>, <a href="#G.5.1">G.5.1</a>                 <a href="#7.13">&lt;setjmp.h&gt;</a> header, <a href="#7.13">7.13</a>
-*= (multiplication assignment operator), <a href="#6.5.16.2">6.5.16.2</a>              <a href="#7.14">&lt;signal.h&gt;</a> header, <a href="#7.14">7.14</a>, <a href="#7.26.6">7.26.6</a>
-+ (addition operator), <a href="#6.5.2.1">6.5.2.1</a>, <a href="#6.5.3.2">6.5.3.2</a>, <a href="#6.5.6">6.5.6</a>, <a href="#F.3">F.3</a>,           <a href="#7.15">&lt;stdarg.h&gt;</a> header, <a href="#4">4</a>, <a href="#6.7.5.3">6.7.5.3</a>, <a href="#7.15">7.15</a>
-     <a href="#G.5.2">G.5.2</a>                                                     <a href="#7.16">&lt;stdbool.h&gt;</a> header, <a href="#4">4</a>, <a href="#7.16">7.16</a>, <a href="#7.26.7">7.26.7</a>, <a href="#H">H</a>
-+ (unary plus operator), <a href="#6.5.3.3">6.5.3.3</a>                               <a href="#7.17">&lt;stddef.h&gt;</a> header, <a href="#4">4</a>, <a href="#6.3.2.1">6.3.2.1</a>, <a href="#6.3.2.3">6.3.2.3</a>, <a href="#6.4.4.4">6.4.4.4</a>,
-++ (postfix increment operator), <a href="#6.3.2.1">6.3.2.1</a>, <a href="#6.5.2.4">6.5.2.4</a>                    <a href="#6.4.5">6.4.5</a>, <a href="#6.5.3.4">6.5.3.4</a>, <a href="#6.5.6">6.5.6</a>, <a href="#7.17">7.17</a>
-++ (prefix increment operator), <a href="#6.3.2.1">6.3.2.1</a>, <a href="#6.5.3.1">6.5.3.1</a>                <a href="#7.18">&lt;stdint.h&gt;</a> header, <a href="#4">4</a>, <a href="#5.2.4.2">5.2.4.2</a>, <a href="#6.10.1">6.10.1</a>, <a href="#7.8">7.8</a>,
-+= (addition assignment operator), <a href="#6.5.16.2">6.5.16.2</a>                         <a href="#7.18">7.18</a>, <a href="#7.26.8">7.26.8</a>
-, (comma operator), <a href="#6.5.17">6.5.17</a>
-[<a name="p519" href="#p519">page 519</a>] (<a href="#Contents">Contents</a>)
-
-<a href="#7.19">&lt;stdio.h&gt;</a> header, <a href="#5.2.4.2.2">5.2.4.2.2</a>, <a href="#7.19">7.19</a>, <a href="#7.26.9">7.26.9</a>, <a href="#F">F</a>                 __cplusplus macro, <a href="#6.10.8">6.10.8</a>
-<a href="#7.20">&lt;stdlib.h&gt;</a> header, <a href="#5.2.4.2.2">5.2.4.2.2</a>, <a href="#7.20">7.20</a>, <a href="#7.26.10">7.26.10</a>, <a href="#F">F</a>               __DATE__ macro, <a href="#6.10.8">6.10.8</a>
-<a href="#7.21">&lt;string.h&gt;</a> header, <a href="#7.21">7.21</a>, <a href="#7.26.11">7.26.11</a>                             __FILE__ macro, <a href="#6.10.8">6.10.8</a>, <a href="#7.2.1.1">7.2.1.1</a>
-<a href="#7.22">&lt;tgmath.h&gt;</a> header, <a href="#7.22">7.22</a>, <a href="#G.7">G.7</a>                                 __func__ identifier, <a href="#6.4.2.2">6.4.2.2</a>, <a href="#7.2.1.1">7.2.1.1</a>
-<a href="#7.23">&lt;time.h&gt;</a> header, <a href="#7.23">7.23</a>                                        __LINE__ macro, <a href="#6.10.8">6.10.8</a>, <a href="#7.2.1.1">7.2.1.1</a>
-<a href="#7.24">&lt;wchar.h&gt;</a> header, <a href="#5.2.4.2.2">5.2.4.2.2</a>, <a href="#7.19.1">7.19.1</a>, <a href="#7.24">7.24</a>,                   __STDC_, <a href="#6.11.9">6.11.9</a>
-     <a href="#7.26.12">7.26.12</a>, <a href="#F">F</a>                                              __STDC__ macro, <a href="#6.10.8">6.10.8</a>
-<a href="#7.25">&lt;wctype.h&gt;</a> header, <a href="#7.25">7.25</a>, <a href="#7.26.13">7.26.13</a>                             __STDC_CONSTANT_MACROS macro, <a href="#7.18.4">7.18.4</a>
-= (equal-sign punctuator), <a href="#6.7">6.7</a>, <a href="#6.7.2.2">6.7.2.2</a>, <a href="#6.7.8">6.7.8</a>               __STDC_FORMAT_MACROS macro, <a href="#7.8.1">7.8.1</a>
-= (simple assignment operator), <a href="#6.5.16.1">6.5.16.1</a>                     __STDC_HOSTED__ macro, <a href="#6.10.8">6.10.8</a>
-== (equality operator), <a href="#6.5.9">6.5.9</a>                                __STDC_IEC_559__ macro, <a href="#6.10.8">6.10.8</a>, <a href="#F.1">F.1</a>
-&gt; (greater-than operator), <a href="#6.5.8">6.5.8</a>                             __STDC_IEC_559_COMPLEX__ macro,
-&gt;= (greater-than-or-equal-to operator), <a href="#6.5.8">6.5.8</a>                     <a href="#6.10.8">6.10.8</a>, <a href="#G.1">G.1</a>
-&gt;&gt; (right-shift operator), <a href="#6.5.7">6.5.7</a>                             __STDC_ISO_10646__ macro, <a href="#6.10.8">6.10.8</a>
-&gt;&gt;= (right-shift assignment operator), <a href="#6.5.16.2">6.5.16.2</a>              __STDC_LIMIT_MACROS macro, <a href="#7.18.2">7.18.2</a>,
-? : (conditional operator), <a href="#6.5.15">6.5.15</a>                                <a href="#7.18.3">7.18.3</a>
-?? (trigraph sequences), <a href="#5.2.1.1">5.2.1.1</a>                             __STDC_MB_MIGHT_NEQ_WC__ macro,
-[ ] (array subscript operator), <a href="#6.5.2.1">6.5.2.1</a>, <a href="#6.5.3.2">6.5.3.2</a>                  <a href="#6.10.8">6.10.8</a>, <a href="#7.17">7.17</a>
-[ ] (brackets punctuator), <a href="#6.7.5.2">6.7.5.2</a>, <a href="#6.7.8">6.7.8</a>                    __STDC_VERSION__ macro, <a href="#6.10.8">6.10.8</a>
-\ (backslash character), <a href="#5.1.1.2">5.1.1.2</a>, <a href="#5.2.1">5.2.1</a>, <a href="#6.4.4.4">6.4.4.4</a>             __TIME__ macro, <a href="#6.10.8">6.10.8</a>
-\ (escape character), <a href="#6.4.4.4">6.4.4.4</a>                                __VA_ARGS__ identifier, <a href="#6.10.3">6.10.3</a>, <a href="#6.10.3.1">6.10.3.1</a>
-\" (double-quote escape sequence), <a href="#6.4.4.4">6.4.4.4</a>,                  _Bool type, <a href="#6.2.5">6.2.5</a>, <a href="#6.3.1.1">6.3.1.1</a>, <a href="#6.3.1.2">6.3.1.2</a>, <a href="#6.7.2">6.7.2</a>
-     <a href="#6.4.5">6.4.5</a>, <a href="#6.10.9">6.10.9</a>                                           _Bool type conversions, <a href="#6.3.1.2">6.3.1.2</a>
-\\ (backslash escape sequence), <a href="#6.4.4.4">6.4.4.4</a>, <a href="#6.10.9">6.10.9</a>              _Complex types, <a href="#6.2.5">6.2.5</a>, <a href="#6.7.2">6.7.2</a>, <a href="#7.3.1">7.3.1</a>, <a href="#G">G</a>
-\' (single-quote escape sequence), <a href="#6.4.4.4">6.4.4.4</a>, <a href="#6.4.5">6.4.5</a>            _Complex_I macro, <a href="#7.3.1">7.3.1</a>
-\0 (null character), <a href="#5.2.1">5.2.1</a>, <a href="#6.4.4.4">6.4.4.4</a>, <a href="#6.4.5">6.4.5</a>                   _Exit function, <a href="#7.20.4.4">7.20.4.4</a>
-  padding of binary stream, <a href="#7.19.2">7.19.2</a>                           _Imaginary keyword, <a href="#G.2">G.2</a>
-\? (question-mark escape sequence), <a href="#6.4.4.4">6.4.4.4</a>                  _Imaginary types, <a href="#7.3.1">7.3.1</a>, <a href="#G">G</a>
-\a (alert escape sequence), <a href="#5.2.2">5.2.2</a>, <a href="#6.4.4.4">6.4.4.4</a>                   _Imaginary_I macro, <a href="#7.3.1">7.3.1</a>, <a href="#G.6">G.6</a>
-\b (backspace escape sequence), <a href="#5.2.2">5.2.2</a>, <a href="#6.4.4.4">6.4.4.4</a>               _IOFBF macro, <a href="#7.19.1">7.19.1</a>, <a href="#7.19.5.5">7.19.5.5</a>, <a href="#7.19.5.6">7.19.5.6</a>
-\f (form-feed escape sequence), <a href="#5.2.2">5.2.2</a>, <a href="#6.4.4.4">6.4.4.4</a>,              _IOLBF macro, <a href="#7.19.1">7.19.1</a>, <a href="#7.19.5.6">7.19.5.6</a>
-     <a href="#7.4.1.10">7.4.1.10</a>                                                _IONBF macro, <a href="#7.19.1">7.19.1</a>, <a href="#7.19.5.5">7.19.5.5</a>, <a href="#7.19.5.6">7.19.5.6</a>
-\n (new-line escape sequence), <a href="#5.2.2">5.2.2</a>, <a href="#6.4.4.4">6.4.4.4</a>,               _Pragma operator, <a href="#5.1.1.2">5.1.1.2</a>, <a href="#6.10.9">6.10.9</a>
-     <a href="#7.4.1.10">7.4.1.10</a>                                                { } (braces punctuator), <a href="#6.7.2.2">6.7.2.2</a>, <a href="#6.7.2.3">6.7.2.3</a>, <a href="#6.7.8">6.7.8</a>,
-\octal digits (octal-character escape sequence),                  <a href="#6.8.2">6.8.2</a>
-     <a href="#6.4.4.4">6.4.4.4</a>                                                 { } (compound-literal operator), <a href="#6.5.2.5">6.5.2.5</a>
-\r (carriage-return escape sequence), <a href="#5.2.2">5.2.2</a>,                 | (bitwise inclusive OR operator), <a href="#6.5.12">6.5.12</a>
-     <a href="#6.4.4.4">6.4.4.4</a>, <a href="#7.4.1.10">7.4.1.10</a>                                       |= (bitwise inclusive OR assignment operator),
-\t (horizontal-tab escape sequence), <a href="#5.2.2">5.2.2</a>,                       <a href="#6.5.16.2">6.5.16.2</a>
-     <a href="#6.4.4.4">6.4.4.4</a>, <a href="#7.4.1.3">7.4.1.3</a>, <a href="#7.4.1.10">7.4.1.10</a>, <a href="#7.25.2.1.3">7.25.2.1.3</a>                  || (logical OR operator), <a href="#6.5.14">6.5.14</a>
-\U (universal character names), <a href="#6.4.3">6.4.3</a>                        ~ (bitwise complement operator), <a href="#6.5.3.3">6.5.3.3</a>
-\u (universal character names), <a href="#6.4.3">6.4.3</a>
-\v (vertical-tab escape sequence), <a href="#5.2.2">5.2.2</a>, <a href="#6.4.4.4">6.4.4.4</a>,           abort function, <a href="#7.2.1.1">7.2.1.1</a>, <a href="#7.14.1.1">7.14.1.1</a>, <a href="#7.19.3">7.19.3</a>,
-     <a href="#7.4.1.10">7.4.1.10</a>                                                     <a href="#7.20.4.1">7.20.4.1</a>
-\x hexadecimal digits (hexadecimal-character                 abs function, <a href="#7.20.6.1">7.20.6.1</a>
-     escape sequence), <a href="#6.4.4.4">6.4.4.4</a>                               absolute-value functions
-^ (bitwise exclusive OR operator), <a href="#6.5.11">6.5.11</a>                      complex, <a href="#7.3.8">7.3.8</a>, <a href="#G.6.4">G.6.4</a>
-^= (bitwise exclusive OR assignment operator),                 integer, <a href="#7.8.2.1">7.8.2.1</a>, <a href="#7.20.6.1">7.20.6.1</a>
-     <a href="#6.5.16.2">6.5.16.2</a>                                                  real, <a href="#7.12.7">7.12.7</a>, <a href="#F.9.4">F.9.4</a>
-__bool_true_false_are_defined                               abstract declarator, <a href="#6.7.6">6.7.6</a>
-     macro, <a href="#7.16">7.16</a>                                             abstract machine, <a href="#5.1.2.3">5.1.2.3</a>
-
-[<a name="p520" href="#p520">page 520</a>] (<a href="#Contents">Contents</a>)
-
-access, <a href="#3.1">3.1</a>, <a href="#6.7.3">6.7.3</a>                                             array
-accuracy, see floating-point accuracy                              argument, <a href="#6.9.1">6.9.1</a>
-acos functions, <a href="#7.12.4.1">7.12.4.1</a>, <a href="#F.9.1.1">F.9.1.1</a>                                 declarator, <a href="#6.7.5.2">6.7.5.2</a>
-acos type-generic macro, <a href="#7.22">7.22</a>                                     initialization, <a href="#6.7.8">6.7.8</a>
-acosh functions, <a href="#7.12.5.1">7.12.5.1</a>, <a href="#F.9.2.1">F.9.2.1</a>                                multidimensional, <a href="#6.5.2.1">6.5.2.1</a>
-acosh type-generic macro, <a href="#7.22">7.22</a>                                    parameter, <a href="#6.9.1">6.9.1</a>
-active position, <a href="#5.2.2">5.2.2</a>                                            storage order, <a href="#6.5.2.1">6.5.2.1</a>
-actual argument, <a href="#3.3">3.3</a>                                              subscript operator ([ ]), <a href="#6.5.2.1">6.5.2.1</a>, <a href="#6.5.3.2">6.5.3.2</a>
-actual parameter (deprecated), <a href="#3.3">3.3</a>                                subscripting, <a href="#6.5.2.1">6.5.2.1</a>
-addition assignment operator (+=), <a href="#6.5.16.2">6.5.16.2</a>                       type, <a href="#6.2.5">6.2.5</a>
-addition operator (+), <a href="#6.5.2.1">6.5.2.1</a>, <a href="#6.5.3.2">6.5.3.2</a>, <a href="#6.5.6">6.5.6</a>, <a href="#F.3">F.3</a>,              type conversion, <a href="#6.3.2.1">6.3.2.1</a>
-      <a href="#G.5.2">G.5.2</a>                                                       variable length, <a href="#6.7.5">6.7.5</a>, <a href="#6.7.5.2">6.7.5.2</a>
-additive expressions, <a href="#6.5.6">6.5.6</a>, <a href="#G.5.2">G.5.2</a>                             arrow operator (-&gt;), <a href="#6.5.2.3">6.5.2.3</a>
-address constant, <a href="#6.6">6.6</a>                                          as-if rule, <a href="#5.1.2.3">5.1.2.3</a>
-address operator (&amp;), <a href="#6.3.2.1">6.3.2.1</a>, <a href="#6.5.3.2">6.5.3.2</a>                         ASCII code set, <a href="#5.2.1.1">5.2.1.1</a>
-aggregate initialization, <a href="#6.7.8">6.7.8</a>                                asctime function, <a href="#7.23.3.1">7.23.3.1</a>
-aggregate types, <a href="#6.2.5">6.2.5</a>                                         asin functions, <a href="#7.12.4.2">7.12.4.2</a>, <a href="#F.9.1.2">F.9.1.2</a>
-alert escape sequence (\a), <a href="#5.2.2">5.2.2</a>, <a href="#6.4.4.4">6.4.4.4</a>                     asin type-generic macro, <a href="#7.22">7.22</a>, <a href="#G.7">G.7</a>
-aliasing, <a href="#6.5">6.5</a>                                                  asinh functions, <a href="#7.12.5.2">7.12.5.2</a>, <a href="#F.9.2.2">F.9.2.2</a>
-alignment, <a href="#3.2">3.2</a>                                                 asinh type-generic macro, <a href="#7.22">7.22</a>, <a href="#G.7">G.7</a>
-   pointer, <a href="#6.2.5">6.2.5</a>, <a href="#6.3.2.3">6.3.2.3</a>                                     asm keyword, <a href="#J.5.10">J.5.10</a>
-   structure/union member, <a href="#6.7.2.1">6.7.2.1</a>                             assert macro, <a href="#7.2.1.1">7.2.1.1</a>
-allocated storage, order and contiguity, <a href="#7.20.3">7.20.3</a>                assert.h header, <a href="#7.2">7.2</a>, <a href="#B.1">B.1</a>
-and macro, <a href="#7.9">7.9</a>                                                 assignment
-AND operators                                                     compound, <a href="#6.5.16.2">6.5.16.2</a>
-   bitwise (&amp;), <a href="#6.5.10">6.5.10</a>                                            conversion, <a href="#6.5.16.1">6.5.16.1</a>
-   bitwise assignment (&amp;=), <a href="#6.5.16.2">6.5.16.2</a>                              expression, <a href="#6.5.16">6.5.16</a>
-   logical (&amp;&amp;), <a href="#6.5.13">6.5.13</a>                                           operators, <a href="#6.3.2.1">6.3.2.1</a>, <a href="#6.5.16">6.5.16</a>
-and_eq macro, <a href="#7.9">7.9</a>                                                 simple, <a href="#6.5.16.1">6.5.16.1</a>
-ANSI/IEEE 754, <a href="#F.1">F.1</a>                                             associativity of operators, <a href="#6.5">6.5</a>
-ANSI/IEEE 854, <a href="#F.1">F.1</a>                                             asterisk punctuator (*), <a href="#6.7.5.1">6.7.5.1</a>, <a href="#6.7.5.2">6.7.5.2</a>
-argc (main function parameter), <a href="#5.1.2.2.1">5.1.2.2.1</a>                      atan functions, <a href="#7.12.4.3">7.12.4.3</a>, <a href="#F.9.1.3">F.9.1.3</a>
-argument, <a href="#3.3">3.3</a>                                                  atan type-generic macro, <a href="#7.22">7.22</a>, <a href="#G.7">G.7</a>
-   array, <a href="#6.9.1">6.9.1</a>                                                atan2 functions, <a href="#7.12.4.4">7.12.4.4</a>, <a href="#F.9.1.4">F.9.1.4</a>
-   default promotions, <a href="#6.5.2.2">6.5.2.2</a>                                 atan2 type-generic macro, <a href="#7.22">7.22</a>
-   function, <a href="#6.5.2.2">6.5.2.2</a>, <a href="#6.9.1">6.9.1</a>                                    atanh functions, <a href="#7.12.5.3">7.12.5.3</a>, <a href="#F.9.2.3">F.9.2.3</a>
-   macro, substitution, <a href="#6.10.3.1">6.10.3.1</a>                               atanh type-generic macro, <a href="#7.22">7.22</a>, <a href="#G.7">G.7</a>
-argument, complex, <a href="#7.3.9.1">7.3.9.1</a>                                     atexit function, <a href="#7.20.4.2">7.20.4.2</a>, <a href="#7.20.4.3">7.20.4.3</a>, <a href="#7.20.4.4">7.20.4.4</a>,
-argv (main function parameter), <a href="#5.1.2.2.1">5.1.2.2.1</a>                            <a href="#J.5.13">J.5.13</a>
-arithmetic constant expression, <a href="#6.6">6.6</a>                            atof function, <a href="#7.20.1">7.20.1</a>, <a href="#7.20.1.1">7.20.1.1</a>
-arithmetic conversions, usual, see usual arithmetic            atoi function, <a href="#7.20.1">7.20.1</a>, <a href="#7.20.1.2">7.20.1.2</a>
-      conversions                                              atol function, <a href="#7.20.1">7.20.1</a>, <a href="#7.20.1.2">7.20.1.2</a>
-arithmetic operators                                           atoll function, <a href="#7.20.1">7.20.1</a>, <a href="#7.20.1.2">7.20.1.2</a>
-   additive, <a href="#6.5.6">6.5.6</a>, <a href="#G.5.2">G.5.2</a>                                      auto storage-class specifier, <a href="#6.7.1">6.7.1</a>, <a href="#6.9">6.9</a>
-   bitwise, <a href="#6.5.10">6.5.10</a>, <a href="#6.5.11">6.5.11</a>, <a href="#6.5.12">6.5.12</a>                             automatic storage duration, <a href="#5.2.3">5.2.3</a>, <a href="#6.2.4">6.2.4</a>
-   increment and decrement, <a href="#6.5.2.4">6.5.2.4</a>, <a href="#6.5.3.1">6.5.3.1</a>
-   multiplicative, <a href="#6.5.5">6.5.5</a>, <a href="#G.5.1">G.5.1</a>                                backslash character (\), <a href="#5.1.1.2">5.1.1.2</a>, <a href="#5.2.1">5.2.1</a>, <a href="#6.4.4.4">6.4.4.4</a>
-   shift, <a href="#6.5.7">6.5.7</a>                                                backslash escape sequence (\\), <a href="#6.4.4.4">6.4.4.4</a>, <a href="#6.10.9">6.10.9</a>
-   unary, <a href="#6.5.3.3">6.5.3.3</a>                                              backspace escape sequence (\b), <a href="#5.2.2">5.2.2</a>, <a href="#6.4.4.4">6.4.4.4</a>
-arithmetic types, <a href="#6.2.5">6.2.5</a>                                        basic character set, <a href="#3.6">3.6</a>, <a href="#3.7.2">3.7.2</a>, <a href="#5.2.1">5.2.1</a>
-arithmetic, pointer, <a href="#6.5.6">6.5.6</a>                                     basic types, <a href="#6.2.5">6.2.5</a>
-
-[<a name="p521" href="#p521">page 521</a>] (<a href="#Contents">Contents</a>)
-
-behavior, <a href="#3.4">3.4</a>                                                  call by value, <a href="#6.5.2.2">6.5.2.2</a>
-binary streams, <a href="#7.19.2">7.19.2</a>, <a href="#7.19.7.11">7.19.7.11</a>, <a href="#7.19.9.2">7.19.9.2</a>,                   calloc function, <a href="#7.20.3">7.20.3</a>, <a href="#7.20.3.1">7.20.3.1</a>, <a href="#7.20.3.2">7.20.3.2</a>,
-      <a href="#7.19.9.4">7.19.9.4</a>                                                       <a href="#7.20.3.4">7.20.3.4</a>
-bit, <a href="#3.5">3.5</a>                                                       carg functions, <a href="#7.3.9.1">7.3.9.1</a>, <a href="#G.6">G.6</a>
-   high order, <a href="#3.6">3.6</a>                                             carg type-generic macro, <a href="#7.22">7.22</a>, <a href="#G.7">G.7</a>
-   low order, <a href="#3.6">3.6</a>                                              carriage-return escape sequence (\r), <a href="#5.2.2">5.2.2</a>,
-bit-field, <a href="#6.7.2.1">6.7.2.1</a>                                                    <a href="#6.4.4.4">6.4.4.4</a>, <a href="#7.4.1.10">7.4.1.10</a>
-bitand macro, <a href="#7.9">7.9</a>                                              case label, <a href="#6.8.1">6.8.1</a>, <a href="#6.8.4.2">6.8.4.2</a>
-bitor macro, <a href="#7.9">7.9</a>                                               case mapping functions
-bitwise operators, <a href="#6.5">6.5</a>                                           character, <a href="#7.4.2">7.4.2</a>
-   AND, <a href="#6.5.10">6.5.10</a>                                                   wide character, <a href="#7.25.3.1">7.25.3.1</a>
-   AND assignment (&amp;=), <a href="#6.5.16.2">6.5.16.2</a>                                     extensible, <a href="#7.25.3.2">7.25.3.2</a>
-   complement (~), <a href="#6.5.3.3">6.5.3.3</a>                                     casin functions, <a href="#7.3.5.2">7.3.5.2</a>, <a href="#G.6">G.6</a>
-   exclusive OR, <a href="#6.5.11">6.5.11</a>                                          type-generic macro for, <a href="#7.22">7.22</a>
-   exclusive OR assignment (^=), <a href="#6.5.16.2">6.5.16.2</a>                      casinh functions, <a href="#7.3.6.2">7.3.6.2</a>, <a href="#G.6.2.2">G.6.2.2</a>
-   inclusive OR, <a href="#6.5.12">6.5.12</a>                                          type-generic macro for, <a href="#7.22">7.22</a>
-   inclusive OR assignment (|=), <a href="#6.5.16.2">6.5.16.2</a>                      cast expression, <a href="#6.5.4">6.5.4</a>
-   shift, <a href="#6.5.7">6.5.7</a>                                                cast operator (( )), <a href="#6.5.4">6.5.4</a>
-blank character, <a href="#7.4.1.3">7.4.1.3</a>                                       catan functions, <a href="#7.3.5.3">7.3.5.3</a>, <a href="#G.6">G.6</a>
-block, <a href="#6.8">6.8</a>, <a href="#6.8.2">6.8.2</a>, <a href="#6.8.4">6.8.4</a>, <a href="#6.8.5">6.8.5</a>                                  type-generic macro for, <a href="#7.22">7.22</a>
-block scope, <a href="#6.2.1">6.2.1</a>                                             catanh functions, <a href="#7.3.6.3">7.3.6.3</a>, <a href="#G.6.2.3">G.6.2.3</a>
-block structure, <a href="#6.2.1">6.2.1</a>                                           type-generic macro for, <a href="#7.22">7.22</a>
-bold type convention, <a href="#6.1">6.1</a>                                      cbrt functions, <a href="#7.12.7.1">7.12.7.1</a>, <a href="#F.9.4.1">F.9.4.1</a>
-bool macro, <a href="#7.16">7.16</a>                                               cbrt type-generic macro, <a href="#7.22">7.22</a>
-boolean type, <a href="#6.3.1.2">6.3.1.2</a>                                          ccos functions, <a href="#7.3.5.4">7.3.5.4</a>, <a href="#G.6">G.6</a>
-boolean type conversion, <a href="#6.3.1.1">6.3.1.1</a>, <a href="#6.3.1.2">6.3.1.2</a>                        type-generic macro for, <a href="#7.22">7.22</a>
-braces punctuator ({ }), <a href="#6.7.2.2">6.7.2.2</a>, <a href="#6.7.2.3">6.7.2.3</a>, <a href="#6.7.8">6.7.8</a>,              ccosh functions, <a href="#7.3.6.4">7.3.6.4</a>, <a href="#G.6.2.4">G.6.2.4</a>
-      <a href="#6.8.2">6.8.2</a>                                                      type-generic macro for, <a href="#7.22">7.22</a>
-brackets operator ([ ]), <a href="#6.5.2.1">6.5.2.1</a>, <a href="#6.5.3.2">6.5.3.2</a>                      ceil functions, <a href="#7.12.9.1">7.12.9.1</a>, <a href="#F.9.6.1">F.9.6.1</a>
-brackets punctuator ([ ]), <a href="#6.7.5.2">6.7.5.2</a>, <a href="#6.7.8">6.7.8</a>                      ceil type-generic macro, <a href="#7.22">7.22</a>
-branch cuts, <a href="#7.3.3">7.3.3</a>                                             cerf function, <a href="#7.26.1">7.26.1</a>
-break statement, <a href="#6.8.6.3">6.8.6.3</a>                                       cerfc function, <a href="#7.26.1">7.26.1</a>
-broken-down time, <a href="#7.23.1">7.23.1</a>, <a href="#7.23.2.3">7.23.2.3</a>, <a href="#7.23.3">7.23.3</a>,                    cexp functions, <a href="#7.3.7.1">7.3.7.1</a>, <a href="#G.6.3.1">G.6.3.1</a>
-      <a href="#7.23.3.1">7.23.3.1</a>, <a href="#7.23.3.3">7.23.3.3</a>, <a href="#7.23.3.4">7.23.3.4</a>, <a href="#7.23.3.5">7.23.3.5</a>                     type-generic macro for, <a href="#7.22">7.22</a>
-bsearch function, <a href="#7.20.5">7.20.5</a>, <a href="#7.20.5.1">7.20.5.1</a>                             cexp2 function, <a href="#7.26.1">7.26.1</a>
-btowc function, <a href="#7.24.6.1.1">7.24.6.1.1</a>                                     cexpm1 function, <a href="#7.26.1">7.26.1</a>
-BUFSIZ macro, <a href="#7.19.1">7.19.1</a>, <a href="#7.19.2">7.19.2</a>, <a href="#7.19.5.5">7.19.5.5</a>                         char type, <a href="#6.2.5">6.2.5</a>, <a href="#6.3.1.1">6.3.1.1</a>, <a href="#6.7.2">6.7.2</a>
-byte, <a href="#3.6">3.6</a>, <a href="#6.5.3.4">6.5.3.4</a>                                             char type conversion, <a href="#6.3.1.1">6.3.1.1</a>, <a href="#6.3.1.3">6.3.1.3</a>, <a href="#6.3.1.4">6.3.1.4</a>,
-byte input/output functions, <a href="#7.19.1">7.19.1</a>                                  <a href="#6.3.1.8">6.3.1.8</a>
-byte-oriented stream, <a href="#7.19.2">7.19.2</a>                                   CHAR_BIT macro, <a href="#5.2.4.2.1">5.2.4.2.1</a>
-                                                               CHAR_MAX macro, <a href="#5.2.4.2.1">5.2.4.2.1</a>, <a href="#7.11.2.1">7.11.2.1</a>
-C program, <a href="#5.1.1.1">5.1.1.1</a>                                             CHAR_MIN macro, <a href="#5.2.4.2.1">5.2.4.2.1</a>
-C++, <a href="#7.8.1">7.8.1</a>, <a href="#7.18.2">7.18.2</a>, <a href="#7.18.3">7.18.3</a>, <a href="#7.18.4">7.18.4</a>                             character, <a href="#3.7">3.7</a>, <a href="#3.7.1">3.7.1</a>
-cabs functions, <a href="#7.3.8.1">7.3.8.1</a>, <a href="#G.6">G.6</a>                                   character array initialization, <a href="#6.7.8">6.7.8</a>
-  type-generic macro for, <a href="#7.22">7.22</a>                                 character case mapping functions, <a href="#7.4.2">7.4.2</a>
-cacos functions, <a href="#7.3.5.1">7.3.5.1</a>, <a href="#G.6.1.1">G.6.1.1</a>                                wide character, <a href="#7.25.3.1">7.25.3.1</a>
-  type-generic macro for, <a href="#7.22">7.22</a>                                       extensible, <a href="#7.25.3.2">7.25.3.2</a>
-cacosh functions, <a href="#7.3.6.1">7.3.6.1</a>, <a href="#G.6.2.1">G.6.2.1</a>                             character classification functions, <a href="#7.4.1">7.4.1</a>
-  type-generic macro for, <a href="#7.22">7.22</a>                                   wide character, <a href="#7.25.2.1">7.25.2.1</a>
-calendar time, <a href="#7.23.1">7.23.1</a>, <a href="#7.23.2.2">7.23.2.2</a>, <a href="#7.23.2.3">7.23.2.3</a>, <a href="#7.23.2.4">7.23.2.4</a>,                 extensible, <a href="#7.25.2.2">7.25.2.2</a>
-     <a href="#7.23.3.2">7.23.3.2</a>, <a href="#7.23.3.3">7.23.3.3</a>, <a href="#7.23.3.4">7.23.3.4</a>                              character constant, <a href="#5.1.1.2">5.1.1.2</a>, <a href="#5.2.1">5.2.1</a>, <a href="#6.4.4.4">6.4.4.4</a>
-
-[<a name="p522" href="#p522">page 522</a>] (<a href="#Contents">Contents</a>)
-
-character display semantics, <a href="#5.2.2">5.2.2</a>                            complex.h header, <a href="#5.2.4.2.2">5.2.4.2.2</a>, <a href="#7.3">7.3</a>, <a href="#7.22">7.22</a>, <a href="#7.26.1">7.26.1</a>,
-character handling header, <a href="#7.4">7.4</a>, <a href="#7.11.1.1">7.11.1.1</a>                           <a href="#G.6">G.6</a>, <a href="#J.5.17">J.5.17</a>
-character input/output functions, <a href="#7.19.7">7.19.7</a>                      compliance, see conformance
-   wide character, <a href="#7.24.3">7.24.3</a>                                     components of time, <a href="#7.23.1">7.23.1</a>
-character sets, <a href="#5.2.1">5.2.1</a>                                         composite type, <a href="#6.2.7">6.2.7</a>
-character string literal, see string literal                  compound assignment, <a href="#6.5.16.2">6.5.16.2</a>
-character type conversion, <a href="#6.3.1.1">6.3.1.1</a>                            compound literals, <a href="#6.5.2.5">6.5.2.5</a>
-character types, <a href="#6.2.5">6.2.5</a>, <a href="#6.7.8">6.7.8</a>                                 compound statement, <a href="#6.8.2">6.8.2</a>
-cimag functions, <a href="#7.3.9.2">7.3.9.2</a>, <a href="#7.3.9.4">7.3.9.4</a>, <a href="#G.6">G.6</a>                        compound-literal operator (( ){ }), <a href="#6.5.2.5">6.5.2.5</a>
-cimag type-generic macro, <a href="#7.22">7.22</a>, <a href="#G.7">G.7</a>                           concatenation functions
-cis function, <a href="#G.6">G.6</a>                                               string, <a href="#7.21.3">7.21.3</a>
-classification functions                                         wide string, <a href="#7.24.4.3">7.24.4.3</a>
-   character, <a href="#7.4.1">7.4.1</a>                                           concatenation, preprocessing, see preprocessing
-   floating-point, <a href="#7.12.3">7.12.3</a>                                           concatenation
-   wide character, <a href="#7.25.2.1">7.25.2.1</a>                                   conceptual models, <a href="#5.1">5.1</a>
-      extensible, <a href="#7.25.2.2">7.25.2.2</a>                                    conditional inclusion, <a href="#6.10.1">6.10.1</a>
-clearerr function, <a href="#7.19.10.1">7.19.10.1</a>                                  conditional operator (? :), <a href="#6.5.15">6.5.15</a>
-clgamma function, <a href="#7.26.1">7.26.1</a>                                      conformance, <a href="#4">4</a>
-clock function, <a href="#7.23.2.1">7.23.2.1</a>                                      conj functions, <a href="#7.3.9.3">7.3.9.3</a>, <a href="#G.6">G.6</a>
-clock_t type, <a href="#7.23.1">7.23.1</a>, <a href="#7.23.2.1">7.23.2.1</a>                                conj type-generic macro, <a href="#7.22">7.22</a>
-CLOCKS_PER_SEC macro, <a href="#7.23.1">7.23.1</a>, <a href="#7.23.2.1">7.23.2.1</a>                        const type qualifier, <a href="#6.7.3">6.7.3</a>
-clog functions, <a href="#7.3.7.2">7.3.7.2</a>, <a href="#G.6.3.2">G.6.3.2</a>                              const-qualified type, <a href="#6.2.5">6.2.5</a>, <a href="#6.3.2.1">6.3.2.1</a>, <a href="#6.7.3">6.7.3</a>
-   type-generic macro for, <a href="#7.22">7.22</a>                               constant expression, <a href="#6.6">6.6</a>, <a href="#F.7.4">F.7.4</a>
-clog10 function, <a href="#7.26.1">7.26.1</a>                                       constants, <a href="#6.4.4">6.4.4</a>
-clog1p function, <a href="#7.26.1">7.26.1</a>                                         as primary expression, <a href="#6.5.1">6.5.1</a>
-clog2 function, <a href="#7.26.1">7.26.1</a>                                          character, <a href="#6.4.4.4">6.4.4.4</a>
-collating sequences, <a href="#5.2.1">5.2.1</a>                                      enumeration, <a href="#6.2.1">6.2.1</a>, <a href="#6.4.4.3">6.4.4.3</a>
-colon punctuator (:), <a href="#6.7.2.1">6.7.2.1</a>                                   floating, <a href="#6.4.4.2">6.4.4.2</a>
-comma operator (,), <a href="#6.5.17">6.5.17</a>                                      hexadecimal, <a href="#6.4.4.1">6.4.4.1</a>
-comma punctuator (,), <a href="#6.5.2">6.5.2</a>, <a href="#6.7">6.7</a>, <a href="#6.7.2.1">6.7.2.1</a>, <a href="#6.7.2.2">6.7.2.2</a>,             integer, <a href="#6.4.4.1">6.4.4.1</a>
-      <a href="#6.7.2.3">6.7.2.3</a>, <a href="#6.7.8">6.7.8</a>                                            octal, <a href="#6.4.4.1">6.4.4.1</a>
-command processor, <a href="#7.20.4.6">7.20.4.6</a>                                   constraint, <a href="#3.8">3.8</a>, <a href="#4">4</a>
-comment delimiters (/* */ and //), <a href="#6.4.9">6.4.9</a>                      content of structure/union/enumeration, <a href="#6.7.2.3">6.7.2.3</a>
-comments, <a href="#5.1.1.2">5.1.1.2</a>, <a href="#6.4">6.4</a>, <a href="#6.4.9">6.4.9</a>                                 contiguity of allocated storage, <a href="#7.20.3">7.20.3</a>
-common extensions, <a href="#J.5">J.5</a>                                        continue statement, <a href="#6.8.6.2">6.8.6.2</a>
-common initial sequence, <a href="#6.5.2.3">6.5.2.3</a>                              contracted expression, <a href="#6.5">6.5</a>, <a href="#7.12.2">7.12.2</a>, <a href="#F.6">F.6</a>
-common real type, <a href="#6.3.1.8">6.3.1.8</a>                                     control character, <a href="#5.2.1">5.2.1</a>, <a href="#7.4">7.4</a>
-common warnings, <a href="#I">I</a>                                            control wide character, <a href="#7.25.2">7.25.2</a>
-comparison functions, <a href="#7.20.5">7.20.5</a>, <a href="#7.20.5.1">7.20.5.1</a>, <a href="#7.20.5.2">7.20.5.2</a>              conversion, <a href="#6.3">6.3</a>
-   string, <a href="#7.21.4">7.21.4</a>                                               arithmetic operands, <a href="#6.3.1">6.3.1</a>
-   wide string, <a href="#7.24.4.4">7.24.4.4</a>                                        array argument, <a href="#6.9.1">6.9.1</a>                           *
-comparison macros, <a href="#7.12.14">7.12.14</a>                                      array parameter, <a href="#6.9.1">6.9.1</a>
-comparison, pointer, <a href="#6.5.8">6.5.8</a>                                      arrays, <a href="#6.3.2.1">6.3.2.1</a>
-compatible type, <a href="#6.2.7">6.2.7</a>, <a href="#6.7.2">6.7.2</a>, <a href="#6.7.3">6.7.3</a>, <a href="#6.7.5">6.7.5</a>                     boolean, <a href="#6.3.1.2">6.3.1.2</a>
-compl macro, <a href="#7.9">7.9</a>                                                boolean, characters, and integers, <a href="#6.3.1.1">6.3.1.1</a>
-complement operator (~), <a href="#6.5.3.3">6.5.3.3</a>                                by assignment, <a href="#6.5.16.1">6.5.16.1</a>
-complex macro, <a href="#7.3.1">7.3.1</a>                                            by return statement, <a href="#6.8.6.4">6.8.6.4</a>
-complex numbers, <a href="#6.2.5">6.2.5</a>, <a href="#G">G</a>                                       complex types, <a href="#6.3.1.6">6.3.1.6</a>
-complex type conversion, <a href="#6.3.1.6">6.3.1.6</a>, <a href="#6.3.1.7">6.3.1.7</a>                       explicit, <a href="#6.3">6.3</a>
-complex type domain, <a href="#6.2.5">6.2.5</a>                                      function, <a href="#6.3.2.1">6.3.2.1</a>
-complex types, <a href="#6.2.5">6.2.5</a>, <a href="#6.7.2">6.7.2</a>, <a href="#G">G</a>                                  function argument, <a href="#6.5.2.2">6.5.2.2</a>, <a href="#6.9.1">6.9.1</a>
-
-[<a name="p523" href="#p523">page 523</a>] (<a href="#Contents">Contents</a>)
-
-  function designators, <a href="#6.3.2.1">6.3.2.1</a>                                type-generic macro for, <a href="#7.22">7.22</a>
-  function parameter, <a href="#6.9.1">6.9.1</a>                                  csinh functions, <a href="#7.3.6.5">7.3.6.5</a>, <a href="#G.6.2.5">G.6.2.5</a>
-  imaginary, <a href="#G.4.1">G.4.1</a>                                             type-generic macro for, <a href="#7.22">7.22</a>
-  imaginary and complex, <a href="#G.4.3">G.4.3</a>                               csqrt functions, <a href="#7.3.8.3">7.3.8.3</a>, <a href="#G.6.4.2">G.6.4.2</a>
-  implicit, <a href="#6.3">6.3</a>                                                type-generic macro for, <a href="#7.22">7.22</a>
-  lvalues, <a href="#6.3.2.1">6.3.2.1</a>                                           ctan functions, <a href="#7.3.5.6">7.3.5.6</a>, <a href="#G.6">G.6</a>
-  pointer, <a href="#6.3.2.1">6.3.2.1</a>, <a href="#6.3.2.3">6.3.2.3</a>                                    type-generic macro for, <a href="#7.22">7.22</a>
-  real and complex, <a href="#6.3.1.7">6.3.1.7</a>                                  ctanh functions, <a href="#7.3.6.6">7.3.6.6</a>, <a href="#G.6.2.6">G.6.2.6</a>
-  real and imaginary, <a href="#G.4.2">G.4.2</a>                                    type-generic macro for, <a href="#7.22">7.22</a>
-  real floating and integer, <a href="#6.3.1.4">6.3.1.4</a>, <a href="#F.3">F.3</a>, <a href="#F.4">F.4</a>                ctgamma function, <a href="#7.26.1">7.26.1</a>
-  real floating types, <a href="#6.3.1.5">6.3.1.5</a>, <a href="#F.3">F.3</a>                           ctime function, <a href="#7.23.3.2">7.23.3.2</a>
-  signed and unsigned integers, <a href="#6.3.1.3">6.3.1.3</a>                      ctype.h header, <a href="#7.4">7.4</a>, <a href="#7.26.2">7.26.2</a>
-  usual arithmetic, see usual arithmetic                     current object, <a href="#6.7.8">6.7.8</a>
-        conversions                                          CX_LIMITED_RANGE pragma, <a href="#6.10.6">6.10.6</a>, <a href="#7.3.4">7.3.4</a>
-  void type, <a href="#6.3.2.2">6.3.2.2</a>
-conversion functions                                         data stream, see streams
-  multibyte/wide character, <a href="#7.20.7">7.20.7</a>                           date and time header, <a href="#7.23">7.23</a>
-     extended, <a href="#7.24.6">7.24.6</a>                                        Daylight Saving Time, <a href="#7.23.1">7.23.1</a>
-     restartable, <a href="#7.24.6.3">7.24.6.3</a>                                   DBL_DIG macro, <a href="#5.2.4.2.2">5.2.4.2.2</a>
-  multibyte/wide string, <a href="#7.20.8">7.20.8</a>                              DBL_EPSILON macro, <a href="#5.2.4.2.2">5.2.4.2.2</a>
-     restartable, <a href="#7.24.6.4">7.24.6.4</a>                                   DBL_MANT_DIG macro, <a href="#5.2.4.2.2">5.2.4.2.2</a>
-  numeric, <a href="#7.8.2.3">7.8.2.3</a>, <a href="#7.20.1">7.20.1</a>                                   DBL_MAX macro, <a href="#5.2.4.2.2">5.2.4.2.2</a>
-     wide string, <a href="#7.8.2.4">7.8.2.4</a>, <a href="#7.24.4.1">7.24.4.1</a>                          DBL_MAX_10_EXP macro, <a href="#5.2.4.2.2">5.2.4.2.2</a>
-  single byte/wide character, <a href="#7.24.6.1">7.24.6.1</a>                       DBL_MAX_EXP macro, <a href="#5.2.4.2.2">5.2.4.2.2</a>
-  time, <a href="#7.23.3">7.23.3</a>                                               DBL_MIN macro, <a href="#5.2.4.2.2">5.2.4.2.2</a>
-     wide character, <a href="#7.24.5">7.24.5</a>                                  DBL_MIN_10_EXP macro, <a href="#5.2.4.2.2">5.2.4.2.2</a>
-conversion specifier, <a href="#7.19.6.1">7.19.6.1</a>, <a href="#7.19.6.2">7.19.6.2</a>, <a href="#7.24.2.1">7.24.2.1</a>,           DBL_MIN_EXP macro, <a href="#5.2.4.2.2">5.2.4.2.2</a>
-     <a href="#7.24.2.2">7.24.2.2</a>                                                decimal constant, <a href="#6.4.4.1">6.4.4.1</a>
-conversion state, <a href="#7.20.7">7.20.7</a>, <a href="#7.24.6">7.24.6</a>, <a href="#7.24.6.2.1">7.24.6.2.1</a>,                decimal digit, <a href="#5.2.1">5.2.1</a>
-     <a href="#7.24.6.3">7.24.6.3</a>, <a href="#7.24.6.3.2">7.24.6.3.2</a>, <a href="#7.24.6.3.3">7.24.6.3.3</a>, <a href="#7.24.6.4">7.24.6.4</a>,             decimal-point character, <a href="#7.1.1">7.1.1</a>, <a href="#7.11.2.1">7.11.2.1</a>
-     <a href="#7.24.6.4.1">7.24.6.4.1</a>, <a href="#7.24.6.4.2">7.24.6.4.2</a>                                  DECIMAL_DIG macro, <a href="#5.2.4.2.2">5.2.4.2.2</a>, <a href="#7.19.6.1">7.19.6.1</a>,
-conversion state functions, <a href="#7.24.6.2">7.24.6.2</a>                              <a href="#7.20.1.3">7.20.1.3</a>, <a href="#7.24.2.1">7.24.2.1</a>, <a href="#7.24.4.1.1">7.24.4.1.1</a>, <a href="#F.5">F.5</a>
-copying functions                                            declaration specifiers, <a href="#6.7">6.7</a>
-  string, <a href="#7.21.2">7.21.2</a>                                             declarations, <a href="#6.7">6.7</a>
-  wide string, <a href="#7.24.4.2">7.24.4.2</a>                                        function, <a href="#6.7.5.3">6.7.5.3</a>
-copysign functions, <a href="#7.3.9.4">7.3.9.4</a>, <a href="#7.12.11.1">7.12.11.1</a>, <a href="#F.3">F.3</a>,                   pointer, <a href="#6.7.5.1">6.7.5.1</a>
-     <a href="#F.9.8.1">F.9.8.1</a>                                                   structure/union, <a href="#6.7.2.1">6.7.2.1</a>
-copysign type-generic macro, <a href="#7.22">7.22</a>                              typedef, <a href="#6.7.7">6.7.7</a>
-correctly rounded result, <a href="#3.9">3.9</a>                                declarator, <a href="#6.7.5">6.7.5</a>
-corresponding real type, <a href="#6.2.5">6.2.5</a>                                 abstract, <a href="#6.7.6">6.7.6</a>
-cos functions, <a href="#7.12.4.5">7.12.4.5</a>, <a href="#F.9.1.5">F.9.1.5</a>                             declarator type derivation, <a href="#6.2.5">6.2.5</a>, <a href="#6.7.5">6.7.5</a>
-cos type-generic macro, <a href="#7.22">7.22</a>, <a href="#G.7">G.7</a>                            decrement operators, see arithmetic operators,
-cosh functions, <a href="#7.12.5.4">7.12.5.4</a>, <a href="#F.9.2.4">F.9.2.4</a>                                 increment and decrement
-cosh type-generic macro, <a href="#7.22">7.22</a>, <a href="#G.7">G.7</a>                           default argument promotions, <a href="#6.5.2.2">6.5.2.2</a>
-cpow functions, <a href="#7.3.8.2">7.3.8.2</a>, <a href="#G.6.4.1">G.6.4.1</a>                             default initialization, <a href="#6.7.8">6.7.8</a>
-  type-generic macro for, <a href="#7.22">7.22</a>                               default label, <a href="#6.8.1">6.8.1</a>, <a href="#6.8.4.2">6.8.4.2</a>
-cproj functions, <a href="#7.3.9.4">7.3.9.4</a>, <a href="#G.6">G.6</a>                                define preprocessing directive, <a href="#6.10.3">6.10.3</a>
-cproj type-generic macro, <a href="#7.22">7.22</a>                               defined operator, <a href="#6.10.1">6.10.1</a>, <a href="#6.10.8">6.10.8</a>
-creal functions, <a href="#7.3.9.5">7.3.9.5</a>, <a href="#G.6">G.6</a>                                definition, <a href="#6.7">6.7</a>
-creal type-generic macro, <a href="#7.22">7.22</a>, <a href="#G.7">G.7</a>                            function, <a href="#6.9.1">6.9.1</a>
-csin functions, <a href="#7.3.5.5">7.3.5.5</a>, <a href="#G.6">G.6</a>                                 derived declarator types, <a href="#6.2.5">6.2.5</a>
-
-[<a name="p524" href="#p524">page 524</a>] (<a href="#Contents">Contents</a>)
-
-derived types, <a href="#6.2.5">6.2.5</a>                                            end-of-file indicator, <a href="#7.19.1">7.19.1</a>, <a href="#7.19.5.3">7.19.5.3</a>, <a href="#7.19.7.1">7.19.7.1</a>,
-designated initializer, <a href="#6.7.8">6.7.8</a>                                         <a href="#7.19.7.5">7.19.7.5</a>, <a href="#7.19.7.6">7.19.7.6</a>, <a href="#7.19.7.11">7.19.7.11</a>, <a href="#7.19.9.2">7.19.9.2</a>,
-destringizing, <a href="#6.10.9">6.10.9</a>                                                 <a href="#7.19.9.3">7.19.9.3</a>, <a href="#7.19.10.1">7.19.10.1</a>, <a href="#7.19.10.2">7.19.10.2</a>, <a href="#7.24.3.1">7.24.3.1</a>,
-device input/output, <a href="#5.1.2.3">5.1.2.3</a>                                          <a href="#7.24.3.10">7.24.3.10</a>
-diagnostic message, <a href="#3.10">3.10</a>, <a href="#5.1.1.3">5.1.1.3</a>                               end-of-file macro, see EOF macro
-diagnostics, <a href="#5.1.1.3">5.1.1.3</a>                                            end-of-line indicator, <a href="#5.2.1">5.2.1</a>
-diagnostics header, <a href="#7.2">7.2</a>                                         endif preprocessing directive, <a href="#6.10.1">6.10.1</a>
-difftime function, <a href="#7.23.2.2">7.23.2.2</a>                                     enum type, <a href="#6.2.5">6.2.5</a>, <a href="#6.7.2">6.7.2</a>, <a href="#6.7.2.2">6.7.2.2</a>
-digit, <a href="#5.2.1">5.2.1</a>, <a href="#7.4">7.4</a>                                               enumerated type, <a href="#6.2.5">6.2.5</a>
-digraphs, <a href="#6.4.6">6.4.6</a>                                                 enumeration, <a href="#6.2.5">6.2.5</a>, <a href="#6.7.2.2">6.7.2.2</a>
-direct input/output functions, <a href="#7.19.8">7.19.8</a>                           enumeration constant, <a href="#6.2.1">6.2.1</a>, <a href="#6.4.4.3">6.4.4.3</a>
-display device, <a href="#5.2.2">5.2.2</a>                                           enumeration content, <a href="#6.7.2.3">6.7.2.3</a>
-div function, <a href="#7.20.6.2">7.20.6.2</a>                                          enumeration members, <a href="#6.7.2.2">6.7.2.2</a>
-div_t type, <a href="#7.20">7.20</a>                                                enumeration specifiers, <a href="#6.7.2.2">6.7.2.2</a>
-division assignment operator (/=), <a href="#6.5.16.2">6.5.16.2</a>                     enumeration tag, <a href="#6.2.3">6.2.3</a>, <a href="#6.7.2.3">6.7.2.3</a>
-division operator (/), <a href="#6.5.5">6.5.5</a>, <a href="#F.3">F.3</a>, <a href="#G.5.1">G.5.1</a>                        enumerator, <a href="#6.7.2.2">6.7.2.2</a>
-do statement, <a href="#6.8.5.2">6.8.5.2</a>                                           environment, <a href="#5">5</a>
-documentation of implementation, <a href="#4">4</a>                              environment functions, <a href="#7.20.4">7.20.4</a>
-domain error, <a href="#7.12.1">7.12.1</a>, <a href="#7.12.4.1">7.12.4.1</a>, <a href="#7.12.4.2">7.12.4.2</a>, <a href="#7.12.4.4">7.12.4.4</a>,             environment list, <a href="#7.20.4.5">7.20.4.5</a>
-      <a href="#7.12.5.1">7.12.5.1</a>, <a href="#7.12.5.3">7.12.5.3</a>, <a href="#7.12.6.5">7.12.6.5</a>, <a href="#7.12.6.7">7.12.6.7</a>,                   environmental considerations, <a href="#5.2">5.2</a>
-      <a href="#7.12.6.8">7.12.6.8</a>, <a href="#7.12.6.9">7.12.6.9</a>, <a href="#7.12.6.10">7.12.6.10</a>, <a href="#7.12.6.11">7.12.6.11</a>,                 environmental limits, <a href="#5.2.4">5.2.4</a>, <a href="#7.13.1.1">7.13.1.1</a>, <a href="#7.19.2">7.19.2</a>,
-      <a href="#7.12.7.4">7.12.7.4</a>, <a href="#7.12.7.5">7.12.7.5</a>, <a href="#7.12.8.4">7.12.8.4</a>, <a href="#7.12.9.5">7.12.9.5</a>,                         <a href="#7.19.3">7.19.3</a>, <a href="#7.19.4.4">7.19.4.4</a>, <a href="#7.19.6.1">7.19.6.1</a>, <a href="#7.20.2.1">7.20.2.1</a>, <a href="#7.20.4.2">7.20.4.2</a>,
-      <a href="#7.12.9.7">7.12.9.7</a>, <a href="#7.12.10.1">7.12.10.1</a>, <a href="#7.12.10.2">7.12.10.2</a>, <a href="#7.12.10.3">7.12.10.3</a>                       <a href="#7.24.2.1">7.24.2.1</a>
-dot operator (.), <a href="#6.5.2.3">6.5.2.3</a>                                       EOF macro, <a href="#7.4">7.4</a>, <a href="#7.19.1">7.19.1</a>, <a href="#7.19.5.1">7.19.5.1</a>, <a href="#7.19.5.2">7.19.5.2</a>,
-double _Complex type, <a href="#6.2.5">6.2.5</a>                                           <a href="#7.19.6.2">7.19.6.2</a>, <a href="#7.19.6.7">7.19.6.7</a>, <a href="#7.19.6.9">7.19.6.9</a>, <a href="#7.19.6.11">7.19.6.11</a>,
-double _Complex type conversion, <a href="#6.3.1.6">6.3.1.6</a>,                             <a href="#7.19.6.14">7.19.6.14</a>, <a href="#7.19.7.1">7.19.7.1</a>, <a href="#7.19.7.3">7.19.7.3</a>, <a href="#7.19.7.4">7.19.7.4</a>,
-      <a href="#6.3.1.7">6.3.1.7</a>, <a href="#6.3.1.8">6.3.1.8</a>                                                <a href="#7.19.7.5">7.19.7.5</a>, <a href="#7.19.7.6">7.19.7.6</a>, <a href="#7.19.7.9">7.19.7.9</a>, <a href="#7.19.7.10">7.19.7.10</a>,
-double _Imaginary type, <a href="#G.2">G.2</a>                                           <a href="#7.19.7.11">7.19.7.11</a>, <a href="#7.24.1">7.24.1</a>, <a href="#7.24.2.2">7.24.2.2</a>, <a href="#7.24.2.4">7.24.2.4</a>,
-double type, <a href="#6.2.5">6.2.5</a>, <a href="#6.4.4.2">6.4.4.2</a>, <a href="#6.7.2">6.7.2</a>, <a href="#7.19.6.2">7.19.6.2</a>,                         <a href="#7.24.2.6">7.24.2.6</a>, <a href="#7.24.2.8">7.24.2.8</a>, <a href="#7.24.2.10">7.24.2.10</a>, <a href="#7.24.2.12">7.24.2.12</a>,
-      <a href="#7.24.2.2">7.24.2.2</a>, <a href="#F.2">F.2</a>                                                   <a href="#7.24.3.4">7.24.3.4</a>, <a href="#7.24.6.1.1">7.24.6.1.1</a>, <a href="#7.24.6.1.2">7.24.6.1.2</a>
-double type conversion, <a href="#6.3.1.4">6.3.1.4</a>, <a href="#6.3.1.5">6.3.1.5</a>, <a href="#6.3.1.7">6.3.1.7</a>,              equal-sign punctuator (=), <a href="#6.7">6.7</a>, <a href="#6.7.2.2">6.7.2.2</a>, <a href="#6.7.8">6.7.8</a>
-      <a href="#6.3.1.8">6.3.1.8</a>                                                   equal-to operator, see equality operator
-double-precision arithmetic, <a href="#5.1.2.3">5.1.2.3</a>                            equality expressions, <a href="#6.5.9">6.5.9</a>
-double-quote escape sequence (\"), <a href="#6.4.4.4">6.4.4.4</a>,                     equality operator (==), <a href="#6.5.9">6.5.9</a>
-      <a href="#6.4.5">6.4.5</a>, <a href="#6.10.9">6.10.9</a>                                             ERANGE macro, <a href="#7.5">7.5</a>, <a href="#7.8.2.3">7.8.2.3</a>, <a href="#7.8.2.4">7.8.2.4</a>, <a href="#7.12.1">7.12.1</a>,
-double_t type, <a href="#7.12">7.12</a>, <a href="#J.5.6">J.5.6</a>                                            <a href="#7.20.1.3">7.20.1.3</a>, <a href="#7.20.1.4">7.20.1.4</a>, <a href="#7.24.4.1.1">7.24.4.1.1</a>, <a href="#7.24.4.1.2">7.24.4.1.2</a>, see
-                                                                      also range error
-EDOM macro, <a href="#7.5">7.5</a>, <a href="#7.12.1">7.12.1</a>, see also domain error                  erf functions, <a href="#7.12.8.1">7.12.8.1</a>, <a href="#F.9.5.1">F.9.5.1</a>
-effective type, <a href="#6.5">6.5</a>                                             erf type-generic macro, <a href="#7.22">7.22</a>
-EILSEQ macro, <a href="#7.5">7.5</a>, <a href="#7.19.3">7.19.3</a>, <a href="#7.24.3.1">7.24.3.1</a>, <a href="#7.24.3.3">7.24.3.3</a>,                  erfc functions, <a href="#7.12.8.2">7.12.8.2</a>, <a href="#F.9.5.2">F.9.5.2</a>
-      <a href="#7.24.6.3.2">7.24.6.3.2</a>, <a href="#7.24.6.3.3">7.24.6.3.3</a>, <a href="#7.24.6.4.1">7.24.6.4.1</a>, <a href="#7.24.6.4.2">7.24.6.4.2</a>,           erfc type-generic macro, <a href="#7.22">7.22</a>
-      see also encoding error                                   errno macro, <a href="#7.1.3">7.1.3</a>, <a href="#7.3.2">7.3.2</a>, <a href="#7.5">7.5</a>, <a href="#7.8.2.3">7.8.2.3</a>, <a href="#7.8.2.4">7.8.2.4</a>,
-element type, <a href="#6.2.5">6.2.5</a>                                                   <a href="#7.12.1">7.12.1</a>, <a href="#7.14.1.1">7.14.1.1</a>, <a href="#7.19.3">7.19.3</a>, <a href="#7.19.9.3">7.19.9.3</a>, <a href="#7.19.10.4">7.19.10.4</a>,
-elif preprocessing directive, <a href="#6.10.1">6.10.1</a>                                  <a href="#7.20.1">7.20.1</a>, <a href="#7.20.1.3">7.20.1.3</a>, <a href="#7.20.1.4">7.20.1.4</a>, <a href="#7.21.6.2">7.21.6.2</a>, <a href="#7.24.3.1">7.24.3.1</a>,
-ellipsis punctuator (...), <a href="#6.5.2.2">6.5.2.2</a>, <a href="#6.7.5.3">6.7.5.3</a>, <a href="#6.10.3">6.10.3</a>                   <a href="#7.24.3.3">7.24.3.3</a>, <a href="#7.24.4.1.1">7.24.4.1.1</a>, <a href="#7.24.4.1.2">7.24.4.1.2</a>, <a href="#7.24.6.3.2">7.24.6.3.2</a>,
-else preprocessing directive, <a href="#6.10.1">6.10.1</a>                                  <a href="#7.24.6.3.3">7.24.6.3.3</a>, <a href="#7.24.6.4.1">7.24.6.4.1</a>, <a href="#7.24.6.4.2">7.24.6.4.2</a>, <a href="#J.5.17">J.5.17</a>
-else statement, <a href="#6.8.4.1">6.8.4.1</a>                                         errno.h header, <a href="#7.5">7.5</a>, <a href="#7.26.3">7.26.3</a>
-empty statement, <a href="#6.8.3">6.8.3</a>                                          error
-encoding error, <a href="#7.19.3">7.19.3</a>, <a href="#7.24.3.1">7.24.3.1</a>, <a href="#7.24.3.3">7.24.3.3</a>,                        domain, see domain error
-      <a href="#7.24.6.3.2">7.24.6.3.2</a>, <a href="#7.24.6.3.3">7.24.6.3.3</a>, <a href="#7.24.6.4.1">7.24.6.4.1</a>, <a href="#7.24.6.4.2">7.24.6.4.2</a>               encoding, see encoding error
-end-of-file, <a href="#7.24.1">7.24.1</a>                                                 range, see range error
-
-[<a name="p525" href="#p525">page 525</a>] (<a href="#Contents">Contents</a>)
-
-error conditions, <a href="#7.12.1">7.12.1</a>                                     extended characters, <a href="#5.2.1">5.2.1</a>
-error functions, <a href="#7.12.8">7.12.8</a>, <a href="#F.9.5">F.9.5</a>                               extended integer types, <a href="#6.2.5">6.2.5</a>, <a href="#6.3.1.1">6.3.1.1</a>, <a href="#6.4.4.1">6.4.4.1</a>,
-error indicator, <a href="#7.19.1">7.19.1</a>, <a href="#7.19.5.3">7.19.5.3</a>, <a href="#7.19.7.1">7.19.7.1</a>,                      <a href="#7.18">7.18</a>
-      <a href="#7.19.7.3">7.19.7.3</a>, <a href="#7.19.7.5">7.19.7.5</a>, <a href="#7.19.7.6">7.19.7.6</a>, <a href="#7.19.7.8">7.19.7.8</a>,                extended multibyte/wide character conversion
-      <a href="#7.19.7.9">7.19.7.9</a>, <a href="#7.19.9.2">7.19.9.2</a>, <a href="#7.19.10.1">7.19.10.1</a>, <a href="#7.19.10.3">7.19.10.3</a>,                   utilities, <a href="#7.24.6">7.24.6</a>
-      <a href="#7.24.3.1">7.24.3.1</a>, <a href="#7.24.3.3">7.24.3.3</a>                                     extensible wide character case mapping functions,
-error preprocessing directive, <a href="#4">4</a>, <a href="#6.10.5">6.10.5</a>                          <a href="#7.25.3.2">7.25.3.2</a>
-error-handling functions, <a href="#7.19.10">7.19.10</a>, <a href="#7.21.6.2">7.21.6.2</a>                  extensible wide character classification functions,
-escape character (\), <a href="#6.4.4.4">6.4.4.4</a>                                     <a href="#7.25.2.2">7.25.2.2</a>
-escape sequences, <a href="#5.2.1">5.2.1</a>, <a href="#5.2.2">5.2.2</a>, <a href="#6.4.4.4">6.4.4.4</a>, <a href="#6.11.4">6.11.4</a>              extern storage-class specifier, <a href="#6.2.2">6.2.2</a>, <a href="#6.7.1">6.7.1</a>
-evaluation format, <a href="#5.2.4.2.2">5.2.4.2.2</a>, <a href="#6.4.4.2">6.4.4.2</a>, <a href="#7.12">7.12</a>                  external definition, <a href="#6.9">6.9</a>
-evaluation method, <a href="#5.2.4.2.2">5.2.4.2.2</a>, <a href="#6.5">6.5</a>, <a href="#F.7.5">F.7.5</a>                     external identifiers, underscore, <a href="#7.1.3">7.1.3</a>
-evaluation order, <a href="#6.5">6.5</a>                                        external linkage, <a href="#6.2.2">6.2.2</a>
-exceptional condition, <a href="#6.5">6.5</a>, <a href="#7.12.1">7.12.1</a>                           external name, <a href="#6.4.2.1">6.4.2.1</a>
-excess precision, <a href="#5.2.4.2.2">5.2.4.2.2</a>, <a href="#6.3.1.5">6.3.1.5</a>, <a href="#6.3.1.8">6.3.1.8</a>,               external object definitions, <a href="#6.9.2">6.9.2</a>
-      <a href="#6.8.6.4">6.8.6.4</a>
-excess range, <a href="#5.2.4.2.2">5.2.4.2.2</a>, <a href="#6.3.1.5">6.3.1.5</a>, <a href="#6.3.1.8">6.3.1.8</a>, <a href="#6.8.6.4">6.8.6.4</a>           fabs functions, <a href="#7.12.7.2">7.12.7.2</a>, <a href="#F.9.4.2">F.9.4.2</a>
-exclusive OR operators                                       fabs type-generic macro, <a href="#7.22">7.22</a>, <a href="#G.7">G.7</a>
-   bitwise (^), <a href="#6.5.11">6.5.11</a>                                       false macro, <a href="#7.16">7.16</a>
-   bitwise assignment (^=), <a href="#6.5.16.2">6.5.16.2</a>                         fclose function, <a href="#7.19.5.1">7.19.5.1</a>
-executable program, <a href="#5.1.1.1">5.1.1.1</a>                                  fdim functions, <a href="#7.12.12.1">7.12.12.1</a>, <a href="#F.9.9.1">F.9.9.1</a>
-execution character set, <a href="#5.2.1">5.2.1</a>                               fdim type-generic macro, <a href="#7.22">7.22</a>
-execution environment, <a href="#5">5</a>, <a href="#5.1.2">5.1.2</a>, see also                    FE_ALL_EXCEPT macro, <a href="#7.6">7.6</a>
-      environmental limits                                   FE_DFL_ENV macro, <a href="#7.6">7.6</a>
-execution sequence, <a href="#5.1.2.3">5.1.2.3</a>, <a href="#6.8">6.8</a>                             FE_DIVBYZERO macro, <a href="#7.6">7.6</a>, <a href="#7.12">7.12</a>, <a href="#F.3">F.3</a>
-exit function, <a href="#5.1.2.2.3">5.1.2.2.3</a>, <a href="#7.19.3">7.19.3</a>, <a href="#7.20">7.20</a>, <a href="#7.20.4.3">7.20.4.3</a>,            FE_DOWNWARD macro, <a href="#7.6">7.6</a>, <a href="#F.3">F.3</a>
-      <a href="#7.20.4.4">7.20.4.4</a>                                               FE_INEXACT macro, <a href="#7.6">7.6</a>, <a href="#F.3">F.3</a>
-EXIT_FAILURE macro, <a href="#7.20">7.20</a>, <a href="#7.20.4.3">7.20.4.3</a>                           FE_INVALID macro, <a href="#7.6">7.6</a>, <a href="#7.12">7.12</a>, <a href="#F.3">F.3</a>
-EXIT_SUCCESS macro, <a href="#7.20">7.20</a>, <a href="#7.20.4.3">7.20.4.3</a>                           FE_OVERFLOW macro, <a href="#7.6">7.6</a>, <a href="#7.12">7.12</a>, <a href="#F.3">F.3</a>
-exp functions, <a href="#7.12.6.1">7.12.6.1</a>, <a href="#F.9.3.1">F.9.3.1</a>                             FE_TONEAREST macro, <a href="#7.6">7.6</a>, <a href="#F.3">F.3</a>
-exp type-generic macro, <a href="#7.22">7.22</a>                                 FE_TOWARDZERO macro, <a href="#7.6">7.6</a>, <a href="#F.3">F.3</a>
-exp2 functions, <a href="#7.12.6.2">7.12.6.2</a>, <a href="#F.9.3.2">F.9.3.2</a>                            FE_UNDERFLOW macro, <a href="#7.6">7.6</a>, <a href="#F.3">F.3</a>
-exp2 type-generic macro, <a href="#7.22">7.22</a>                                FE_UPWARD macro, <a href="#7.6">7.6</a>, <a href="#F.3">F.3</a>
-explicit conversion, <a href="#6.3">6.3</a>                                     feclearexcept function, <a href="#7.6.2">7.6.2</a>, <a href="#7.6.2.1">7.6.2.1</a>, <a href="#F.3">F.3</a>
-expm1 functions, <a href="#7.12.6.3">7.12.6.3</a>, <a href="#F.9.3.3">F.9.3.3</a>                           fegetenv function, <a href="#7.6.4.1">7.6.4.1</a>, <a href="#7.6.4.3">7.6.4.3</a>, <a href="#7.6.4.4">7.6.4.4</a>, <a href="#F.3">F.3</a>
-expm1 type-generic macro, <a href="#7.22">7.22</a>                               fegetexceptflag function, <a href="#7.6.2">7.6.2</a>, <a href="#7.6.2.2">7.6.2.2</a>, <a href="#F.3">F.3</a>
-exponent part, <a href="#6.4.4.2">6.4.4.2</a>                                       fegetround function, <a href="#7.6">7.6</a>, <a href="#7.6.3.1">7.6.3.1</a>, <a href="#F.3">F.3</a>
-exponential functions                                        feholdexcept function, <a href="#7.6.4.2">7.6.4.2</a>, <a href="#7.6.4.3">7.6.4.3</a>,
-   complex, <a href="#7.3.7">7.3.7</a>, <a href="#G.6.3">G.6.3</a>                                        <a href="#7.6.4.4">7.6.4.4</a>, <a href="#F.3">F.3</a>
-   real, <a href="#7.12.6">7.12.6</a>, <a href="#F.9.3">F.9.3</a>                                       fenv.h header, <a href="#5.1.2.3">5.1.2.3</a>, <a href="#5.2.4.2.2">5.2.4.2.2</a>, <a href="#7.6">7.6</a>, <a href="#7.12">7.12</a>, <a href="#F">F</a>, <a href="#H">H</a>
-expression, <a href="#6.5">6.5</a>                                              FENV_ACCESS pragma, <a href="#6.10.6">6.10.6</a>, <a href="#7.6.1">7.6.1</a>, <a href="#F.7">F.7</a>, <a href="#F.8">F.8</a>,
-   assignment, <a href="#6.5.16">6.5.16</a>                                           <a href="#F.9">F.9</a>
-   cast, <a href="#6.5.4">6.5.4</a>                                               fenv_t type, <a href="#7.6">7.6</a>
-   constant, <a href="#6.6">6.6</a>                                             feof function, <a href="#7.19.10.2">7.19.10.2</a>
-   full, <a href="#6.8">6.8</a>                                                 feraiseexcept function, <a href="#7.6.2">7.6.2</a>, <a href="#7.6.2.3">7.6.2.3</a>, <a href="#F.3">F.3</a>
-   order of evaluation, <a href="#6.5">6.5</a>                                  ferror function, <a href="#7.19.10.3">7.19.10.3</a>
-   parenthesized, <a href="#6.5.1">6.5.1</a>                                      fesetenv function, <a href="#7.6.4.3">7.6.4.3</a>, <a href="#F.3">F.3</a>
-   primary, <a href="#6.5.1">6.5.1</a>                                            fesetexceptflag function, <a href="#7.6.2">7.6.2</a>, <a href="#7.6.2.4">7.6.2.4</a>, <a href="#F.3">F.3</a>
-   unary, <a href="#6.5.3">6.5.3</a>                                              fesetround function, <a href="#7.6">7.6</a>, <a href="#7.6.3.2">7.6.3.2</a>, <a href="#F.3">F.3</a>
-expression statement, <a href="#6.8.3">6.8.3</a>                                  fetestexcept function, <a href="#7.6.2">7.6.2</a>, <a href="#7.6.2.5">7.6.2.5</a>, <a href="#F.3">F.3</a>
-extended character set, <a href="#3.7.2">3.7.2</a>, <a href="#5.2.1">5.2.1</a>, <a href="#5.2.1.2">5.2.1.2</a>                feupdateenv function, <a href="#7.6.4.2">7.6.4.2</a>, <a href="#7.6.4.4">7.6.4.4</a>, <a href="#F.3">F.3</a>
-
-[<a name="p526" href="#p526">page 526</a>] (<a href="#Contents">Contents</a>)
-
-fexcept_t type, <a href="#7.6">7.6</a>, <a href="#F.3">F.3</a>                                      floating-point status flag, <a href="#7.6">7.6</a>, <a href="#F.7.6">F.7.6</a>
-fflush function, <a href="#7.19.5.2">7.19.5.2</a>, <a href="#7.19.5.3">7.19.5.3</a>                           floor functions, <a href="#7.12.9.2">7.12.9.2</a>, <a href="#F.9.6.2">F.9.6.2</a>
-fgetc function, <a href="#7.19.1">7.19.1</a>, <a href="#7.19.3">7.19.3</a>, <a href="#7.19.7.1">7.19.7.1</a>,                     floor type-generic macro, <a href="#7.22">7.22</a>
-     <a href="#7.19.7.5">7.19.7.5</a>, <a href="#7.19.8.1">7.19.8.1</a>                                       FLT_DIG macro, <a href="#5.2.4.2.2">5.2.4.2.2</a>
-fgetpos function, <a href="#7.19.2">7.19.2</a>, <a href="#7.19.9.1">7.19.9.1</a>, <a href="#7.19.9.3">7.19.9.3</a>                  FLT_EPSILON macro, <a href="#5.2.4.2.2">5.2.4.2.2</a>
-fgets function, <a href="#7.19.1">7.19.1</a>, <a href="#7.19.7.2">7.19.7.2</a>                              FLT_EVAL_METHOD macro, <a href="#5.2.4.2.2">5.2.4.2.2</a>, <a href="#6.8.6.4">6.8.6.4</a>,
-fgetwc function, <a href="#7.19.1">7.19.1</a>, <a href="#7.19.3">7.19.3</a>, <a href="#7.24.3.1">7.24.3.1</a>,                         <a href="#7.12">7.12</a>
-     <a href="#7.24.3.6">7.24.3.6</a>                                                 FLT_MANT_DIG macro, <a href="#5.2.4.2.2">5.2.4.2.2</a>
-fgetws function, <a href="#7.19.1">7.19.1</a>, <a href="#7.24.3.2">7.24.3.2</a>                             FLT_MAX macro, <a href="#5.2.4.2.2">5.2.4.2.2</a>
-field width, <a href="#7.19.6.1">7.19.6.1</a>, <a href="#7.24.2.1">7.24.2.1</a>                                FLT_MAX_10_EXP macro, <a href="#5.2.4.2.2">5.2.4.2.2</a>
-file, <a href="#7.19.3">7.19.3</a>                                                   FLT_MAX_EXP macro, <a href="#5.2.4.2.2">5.2.4.2.2</a>
-  access functions, <a href="#7.19.5">7.19.5</a>                                    FLT_MIN macro, <a href="#5.2.4.2.2">5.2.4.2.2</a>
-  name, <a href="#7.19.3">7.19.3</a>                                                FLT_MIN_10_EXP macro, <a href="#5.2.4.2.2">5.2.4.2.2</a>
-  operations, <a href="#7.19.4">7.19.4</a>                                          FLT_MIN_EXP macro, <a href="#5.2.4.2.2">5.2.4.2.2</a>
-  position indicator, <a href="#7.19.1">7.19.1</a>, <a href="#7.19.2">7.19.2</a>, <a href="#7.19.3">7.19.3</a>,                 FLT_RADIX macro, <a href="#5.2.4.2.2">5.2.4.2.2</a>, <a href="#7.19.6.1">7.19.6.1</a>, <a href="#7.20.1.3">7.20.1.3</a>,
-        <a href="#7.19.5.3">7.19.5.3</a>, <a href="#7.19.7.1">7.19.7.1</a>, <a href="#7.19.7.3">7.19.7.3</a>, <a href="#7.19.7.11">7.19.7.11</a>,                   <a href="#7.24.2.1">7.24.2.1</a>, <a href="#7.24.4.1.1">7.24.4.1.1</a>
-        <a href="#7.19.8.1">7.19.8.1</a>, <a href="#7.19.8.2">7.19.8.2</a>, <a href="#7.19.9.1">7.19.9.1</a>, <a href="#7.19.9.2">7.19.9.2</a>,               FLT_ROUNDS macro, <a href="#5.2.4.2.2">5.2.4.2.2</a>, <a href="#7.6">7.6</a>, <a href="#F.3">F.3</a>
-        <a href="#7.19.9.3">7.19.9.3</a>, <a href="#7.19.9.4">7.19.9.4</a>, <a href="#7.19.9.5">7.19.9.5</a>, <a href="#7.24.3.1">7.24.3.1</a>,               fma functions, <a href="#7.12">7.12</a>, <a href="#7.12.13.1">7.12.13.1</a>, <a href="#F.9.10.1">F.9.10.1</a>
-        <a href="#7.24.3.3">7.24.3.3</a>, <a href="#7.24.3.10">7.24.3.10</a>                                   fma type-generic macro, <a href="#7.22">7.22</a>
-  positioning functions, <a href="#7.19.9">7.19.9</a>                               fmax functions, <a href="#7.12.12.2">7.12.12.2</a>, <a href="#F.9.9.2">F.9.9.2</a>
-file scope, <a href="#6.2.1">6.2.1</a>, <a href="#6.9">6.9</a>                                         fmax type-generic macro, <a href="#7.22">7.22</a>
-FILE type, <a href="#7.19.1">7.19.1</a>, <a href="#7.19.3">7.19.3</a>                                     fmin functions, <a href="#7.12.12.3">7.12.12.3</a>, <a href="#F.9.9.3">F.9.9.3</a>
-FILENAME_MAX macro, <a href="#7.19.1">7.19.1</a>                                    fmin type-generic macro, <a href="#7.22">7.22</a>
-flags, <a href="#7.19.6.1">7.19.6.1</a>, <a href="#7.24.2.1">7.24.2.1</a>                                      fmod functions, <a href="#7.12.10.1">7.12.10.1</a>, <a href="#F.9.7.1">F.9.7.1</a>
-  floating-point status, see floating-point status              fmod type-generic macro, <a href="#7.22">7.22</a>
-        flag                                                   fopen function, <a href="#7.19.5.3">7.19.5.3</a>, <a href="#7.19.5.4">7.19.5.4</a>
-flexible array member, <a href="#6.7.2.1">6.7.2.1</a>                                 FOPEN_MAX macro, <a href="#7.19.1">7.19.1</a>, <a href="#7.19.3">7.19.3</a>, <a href="#7.19.4.3">7.19.4.3</a>
-float _Complex type, <a href="#6.2.5">6.2.5</a>                                    for statement, <a href="#6.8.5">6.8.5</a>, <a href="#6.8.5.3">6.8.5.3</a>
-float _Complex type conversion, <a href="#6.3.1.6">6.3.1.6</a>,                      form-feed character, <a href="#5.2.1">5.2.1</a>, <a href="#6.4">6.4</a>
-     <a href="#6.3.1.7">6.3.1.7</a>, <a href="#6.3.1.8">6.3.1.8</a>                                         form-feed escape sequence (\f), <a href="#5.2.2">5.2.2</a>, <a href="#6.4.4.4">6.4.4.4</a>,
-float _Imaginary type, <a href="#G.2">G.2</a>                                         <a href="#7.4.1.10">7.4.1.10</a>
-float type, <a href="#6.2.5">6.2.5</a>, <a href="#6.4.4.2">6.4.4.2</a>, <a href="#6.7.2">6.7.2</a>, <a href="#F.2">F.2</a>                        formal argument (deprecated), <a href="#3.15">3.15</a>
-float type conversion, <a href="#6.3.1.4">6.3.1.4</a>, <a href="#6.3.1.5">6.3.1.5</a>, <a href="#6.3.1.7">6.3.1.7</a>,             formal parameter, <a href="#3.15">3.15</a>
-     <a href="#6.3.1.8">6.3.1.8</a>                                                  formatted input/output functions, <a href="#7.11.1.1">7.11.1.1</a>, <a href="#7.19.6">7.19.6</a>
-float.h header, <a href="#4">4</a>, <a href="#5.2.4.2.2">5.2.4.2.2</a>, <a href="#7.7">7.7</a>, <a href="#7.20.1.3">7.20.1.3</a>,                     wide character, <a href="#7.24.2">7.24.2</a>
-     <a href="#7.24.4.1.1">7.24.4.1.1</a>                                               fortran keyword, <a href="#J.5.9">J.5.9</a>
-float_t type, <a href="#7.12">7.12</a>, <a href="#J.5.6">J.5.6</a>                                     forward reference, <a href="#3.11">3.11</a>
-floating constant, <a href="#6.4.4.2">6.4.4.2</a>                                     FP_CONTRACT pragma, <a href="#6.5">6.5</a>, <a href="#6.10.6">6.10.6</a>, <a href="#7.12.2">7.12.2</a>, see
-floating suffix, f or <a href="#F">F</a>, <a href="#6.4.4.2">6.4.4.2</a>                                     also contracted expression
-floating type conversion, <a href="#6.3.1.4">6.3.1.4</a>, <a href="#6.3.1.5">6.3.1.5</a>, <a href="#6.3.1.7">6.3.1.7</a>,           FP_FAST_FMA macro, <a href="#7.12">7.12</a>
-     <a href="#F.3">F.3</a>, <a href="#F.4">F.4</a>                                                 FP_FAST_FMAF macro, <a href="#7.12">7.12</a>
-floating types, <a href="#6.2.5">6.2.5</a>, <a href="#6.11.1">6.11.1</a>                                  FP_FAST_FMAL macro, <a href="#7.12">7.12</a>
-floating-point accuracy, <a href="#5.2.4.2.2">5.2.4.2.2</a>, <a href="#6.4.4.2">6.4.4.2</a>, <a href="#6.5">6.5</a>,              FP_ILOGB0 macro, <a href="#7.12">7.12</a>, <a href="#7.12.6.5">7.12.6.5</a>
-     <a href="#7.20.1.3">7.20.1.3</a>, <a href="#F.5">F.5</a>, see also contracted expression            FP_ILOGBNAN macro, <a href="#7.12">7.12</a>, <a href="#7.12.6.5">7.12.6.5</a>
-floating-point arithmetic functions, <a href="#7.12">7.12</a>, <a href="#F.9">F.9</a>                 FP_INFINITE macro, <a href="#7.12">7.12</a>, <a href="#F.3">F.3</a>
-floating-point classification functions, <a href="#7.12.3">7.12.3</a>                 FP_NAN macro, <a href="#7.12">7.12</a>, <a href="#F.3">F.3</a>
-floating-point control mode, <a href="#7.6">7.6</a>, <a href="#F.7.6">F.7.6</a>                        FP_NORMAL macro, <a href="#7.12">7.12</a>, <a href="#F.3">F.3</a>
-floating-point environment, <a href="#7.6">7.6</a>, <a href="#F.7">F.7</a>, <a href="#F.7.6">F.7.6</a>                    FP_SUBNORMAL macro, <a href="#7.12">7.12</a>, <a href="#F.3">F.3</a>
-floating-point exception, <a href="#7.6">7.6</a>, <a href="#7.6.2">7.6.2</a>, <a href="#F.9">F.9</a>                      FP_ZERO macro, <a href="#7.12">7.12</a>, <a href="#F.3">F.3</a>
-floating-point number, <a href="#5.2.4.2.2">5.2.4.2.2</a>, <a href="#6.2.5">6.2.5</a>                        fpclassify macro, <a href="#7.12.3.1">7.12.3.1</a>, <a href="#F.3">F.3</a>
-floating-point rounding mode, <a href="#5.2.4.2.2">5.2.4.2.2</a>                        fpos_t type, <a href="#7.19.1">7.19.1</a>, <a href="#7.19.2">7.19.2</a>
-
-[<a name="p527" href="#p527">page 527</a>] (<a href="#Contents">Contents</a>)
-
-fprintf function, <a href="#7.8.1">7.8.1</a>, <a href="#7.19.1">7.19.1</a>, <a href="#7.19.6.1">7.19.6.1</a>,                       language, <a href="#6.11">6.11</a>
-      <a href="#7.19.6.2">7.19.6.2</a>, <a href="#7.19.6.3">7.19.6.3</a>, <a href="#7.19.6.5">7.19.6.5</a>, <a href="#7.19.6.6">7.19.6.6</a>,                    library, <a href="#7.26">7.26</a>
-      <a href="#7.19.6.8">7.19.6.8</a>, <a href="#7.24.2.2">7.24.2.2</a>, <a href="#F.3">F.3</a>                                  fwide function, <a href="#7.19.2">7.19.2</a>, <a href="#7.24.3.5">7.24.3.5</a>
-fputc function, <a href="#5.2.2">5.2.2</a>, <a href="#7.19.1">7.19.1</a>, <a href="#7.19.3">7.19.3</a>, <a href="#7.19.7.3">7.19.7.3</a>,               fwprintf function, <a href="#7.8.1">7.8.1</a>, <a href="#7.19.1">7.19.1</a>, <a href="#7.19.6.2">7.19.6.2</a>,
-      <a href="#7.19.7.8">7.19.7.8</a>, <a href="#7.19.8.2">7.19.8.2</a>                                            <a href="#7.24.2.1">7.24.2.1</a>, <a href="#7.24.2.2">7.24.2.2</a>, <a href="#7.24.2.3">7.24.2.3</a>, <a href="#7.24.2.5">7.24.2.5</a>,
-fputs function, <a href="#7.19.1">7.19.1</a>, <a href="#7.19.7.4">7.19.7.4</a>                                    <a href="#7.24.2.11">7.24.2.11</a>
-fputwc function, <a href="#7.19.1">7.19.1</a>, <a href="#7.19.3">7.19.3</a>, <a href="#7.24.3.3">7.24.3.3</a>,                     fwrite function, <a href="#7.19.1">7.19.1</a>, <a href="#7.19.8.2">7.19.8.2</a>
-      <a href="#7.24.3.8">7.24.3.8</a>                                                 fwscanf function, <a href="#7.8.1">7.8.1</a>, <a href="#7.19.1">7.19.1</a>, <a href="#7.24.2.2">7.24.2.2</a>,
-fputws function, <a href="#7.19.1">7.19.1</a>, <a href="#7.24.3.4">7.24.3.4</a>                                   <a href="#7.24.2.4">7.24.2.4</a>, <a href="#7.24.2.6">7.24.2.6</a>, <a href="#7.24.2.12">7.24.2.12</a>, <a href="#7.24.3.10">7.24.3.10</a>
-fread function, <a href="#7.19.1">7.19.1</a>, <a href="#7.19.8.1">7.19.8.1</a>
-free function, <a href="#7.20.3.2">7.20.3.2</a>, <a href="#7.20.3.4">7.20.3.4</a>                              gamma functions, <a href="#7.12.8">7.12.8</a>, <a href="#F.9.5">F.9.5</a>
-freestanding execution environment, <a href="#4">4</a>, <a href="#5.1.2">5.1.2</a>,                  general utilities, <a href="#7.20">7.20</a>
-      <a href="#5.1.2.1">5.1.2.1</a>                                                    wide string, <a href="#7.24.4">7.24.4</a>
-freopen function, <a href="#7.19.2">7.19.2</a>, <a href="#7.19.5.4">7.19.5.4</a>                             general wide string utilities, <a href="#7.24.4">7.24.4</a>
-frexp functions, <a href="#7.12.6.4">7.12.6.4</a>, <a href="#F.9.3.4">F.9.3.4</a>                             generic parameters, <a href="#7.22">7.22</a>
-frexp type-generic macro, <a href="#7.22">7.22</a>                                 getc function, <a href="#7.19.1">7.19.1</a>, <a href="#7.19.7.5">7.19.7.5</a>, <a href="#7.19.7.6">7.19.7.6</a>
-fscanf function, <a href="#7.8.1">7.8.1</a>, <a href="#7.19.1">7.19.1</a>, <a href="#7.19.6.2">7.19.6.2</a>,                      getchar function, <a href="#7.19.1">7.19.1</a>, <a href="#7.19.7.6">7.19.7.6</a>
-      <a href="#7.19.6.4">7.19.6.4</a>, <a href="#7.19.6.7">7.19.6.7</a>, <a href="#7.19.6.9">7.19.6.9</a>, <a href="#F.3">F.3</a>                        getenv function, <a href="#7.20.4.5">7.20.4.5</a>
-fseek function, <a href="#7.19.1">7.19.1</a>, <a href="#7.19.5.3">7.19.5.3</a>, <a href="#7.19.7.11">7.19.7.11</a>,                   gets function, <a href="#7.19.1">7.19.1</a>, <a href="#7.19.7.7">7.19.7.7</a>, <a href="#7.26.9">7.26.9</a>
-      <a href="#7.19.9.2">7.19.9.2</a>, <a href="#7.19.9.4">7.19.9.4</a>, <a href="#7.19.9.5">7.19.9.5</a>, <a href="#7.24.3.10">7.24.3.10</a>                  getwc function, <a href="#7.19.1">7.19.1</a>, <a href="#7.24.3.6">7.24.3.6</a>, <a href="#7.24.3.7">7.24.3.7</a>
-fsetpos function, <a href="#7.19.2">7.19.2</a>, <a href="#7.19.5.3">7.19.5.3</a>, <a href="#7.19.7.11">7.19.7.11</a>,                 getwchar function, <a href="#7.19.1">7.19.1</a>, <a href="#7.24.3.7">7.24.3.7</a>
-      <a href="#7.19.9.1">7.19.9.1</a>, <a href="#7.19.9.3">7.19.9.3</a>, <a href="#7.24.3.10">7.24.3.10</a>                            gmtime function, <a href="#7.23.3.3">7.23.3.3</a>
-ftell function, <a href="#7.19.9.2">7.19.9.2</a>, <a href="#7.19.9.4">7.19.9.4</a>                             goto statement, <a href="#6.2.1">6.2.1</a>, <a href="#6.8.1">6.8.1</a>, <a href="#6.8.6.1">6.8.6.1</a>
-full declarator, <a href="#6.7.5">6.7.5</a>                                         graphic characters, <a href="#5.2.1">5.2.1</a>
-full expression, <a href="#6.8">6.8</a>                                           greater-than operator (&gt;), <a href="#6.5.8">6.5.8</a>
-fully buffered stream, <a href="#7.19.3">7.19.3</a>                                  greater-than-or-equal-to operator (&gt;=), <a href="#6.5.8">6.5.8</a>
-function
-   argument, <a href="#6.5.2.2">6.5.2.2</a>, <a href="#6.9.1">6.9.1</a>                                    header, <a href="#5.1.1.1">5.1.1.1</a>, <a href="#7.1.2">7.1.2</a>, see also standard headers
-   body, <a href="#6.9.1">6.9.1</a>                                                 header names, <a href="#6.4">6.4</a>, <a href="#6.4.7">6.4.7</a>, <a href="#6.10.2">6.10.2</a>
-   call, <a href="#6.5.2.2">6.5.2.2</a>                                               hexadecimal constant, <a href="#6.4.4.1">6.4.4.1</a>
-      library, <a href="#7.1.4">7.1.4</a>                                           hexadecimal digit, <a href="#6.4.4.1">6.4.4.1</a>, <a href="#6.4.4.2">6.4.4.2</a>, <a href="#6.4.4.4">6.4.4.4</a>
-   declarator, <a href="#6.7.5.3">6.7.5.3</a>, <a href="#6.11.6">6.11.6</a>                                 hexadecimal prefix, <a href="#6.4.4.1">6.4.4.1</a>
-   definition, <a href="#6.7.5.3">6.7.5.3</a>, <a href="#6.9.1">6.9.1</a>, <a href="#6.11.7">6.11.7</a>                           hexadecimal-character escape sequence
-   designator, <a href="#6.3.2.1">6.3.2.1</a>                                              (\x hexadecimal digits), <a href="#6.4.4.4">6.4.4.4</a>
-   image, <a href="#5.2.3">5.2.3</a>                                                high-order bit, <a href="#3.6">3.6</a>
-   library, <a href="#5.1.1.1">5.1.1.1</a>, <a href="#7.1.4">7.1.4</a>                                     horizontal-tab character, <a href="#5.2.1">5.2.1</a>, <a href="#6.4">6.4</a>
-   name length, <a href="#5.2.4.1">5.2.4.1</a>, <a href="#6.4.2.1">6.4.2.1</a>, <a href="#6.11.3">6.11.3</a>                       horizontal-tab escape sequence (\r), <a href="#7.25.2.1.3">7.25.2.1.3</a>
-   parameter, <a href="#5.1.2.2.1">5.1.2.2.1</a>, <a href="#6.5.2.2">6.5.2.2</a>, <a href="#6.7">6.7</a>, <a href="#6.9.1">6.9.1</a>                   horizontal-tab escape sequence (\t), <a href="#5.2.2">5.2.2</a>,
-   prototype, <a href="#5.1.2.2.1">5.1.2.2.1</a>, <a href="#6.2.1">6.2.1</a>, <a href="#6.2.7">6.2.7</a>, <a href="#6.5.2.2">6.5.2.2</a>, <a href="#6.7">6.7</a>,                <a href="#6.4.4.4">6.4.4.4</a>, <a href="#7.4.1.3">7.4.1.3</a>, <a href="#7.4.1.10">7.4.1.10</a>
-         <a href="#6.7.5.3">6.7.5.3</a>, <a href="#6.9.1">6.9.1</a>, <a href="#6.11.6">6.11.6</a>, <a href="#6.11.7">6.11.7</a>, <a href="#7.1.2">7.1.2</a>, <a href="#7.12">7.12</a>           hosted execution environment, <a href="#4">4</a>, <a href="#5.1.2">5.1.2</a>, <a href="#5.1.2.2">5.1.2.2</a>
-   prototype scope, <a href="#6.2.1">6.2.1</a>, <a href="#6.7.5.2">6.7.5.2</a>                             HUGE_VAL macro, <a href="#7.12">7.12</a>, <a href="#7.12.1">7.12.1</a>, <a href="#7.20.1.3">7.20.1.3</a>,
-   recursive call, <a href="#6.5.2.2">6.5.2.2</a>                                          <a href="#7.24.4.1.1">7.24.4.1.1</a>, <a href="#F.9">F.9</a>
-   return, <a href="#6.8.6.4">6.8.6.4</a>                                             HUGE_VALF macro, <a href="#7.12">7.12</a>, <a href="#7.12.1">7.12.1</a>, <a href="#7.20.1.3">7.20.1.3</a>,
-   scope, <a href="#6.2.1">6.2.1</a>                                                     <a href="#7.24.4.1.1">7.24.4.1.1</a>, <a href="#F.9">F.9</a>
-   type, <a href="#6.2.5">6.2.5</a>                                                 HUGE_VALL macro, <a href="#7.12">7.12</a>, <a href="#7.12.1">7.12.1</a>, <a href="#7.20.1.3">7.20.1.3</a>,
-   type conversion, <a href="#6.3.2.1">6.3.2.1</a>                                         <a href="#7.24.4.1.1">7.24.4.1.1</a>, <a href="#F.9">F.9</a>
-function specifiers, <a href="#6.7.4">6.7.4</a>                                      hyperbolic functions
-function type, <a href="#6.2.5">6.2.5</a>                                             complex, <a href="#7.3.6">7.3.6</a>, <a href="#G.6.2">G.6.2</a>
-function-call operator (( )), <a href="#6.5.2.2">6.5.2.2</a>                            real, <a href="#7.12.5">7.12.5</a>, <a href="#F.9.2">F.9.2</a>
-function-like macro, <a href="#6.10.3">6.10.3</a>                                    hypot functions, <a href="#7.12.7.3">7.12.7.3</a>, <a href="#F.9.4.3">F.9.4.3</a>
-future directions                                              hypot type-generic macro, <a href="#7.22">7.22</a>
-
-[<a name="p528" href="#p528">page 528</a>] (<a href="#Contents">Contents</a>)
-
-I macro, <a href="#7.3.1">7.3.1</a>, <a href="#7.3.9.4">7.3.9.4</a>, <a href="#G.6">G.6</a>                                    initial position, <a href="#5.2.2">5.2.2</a>
-identifier, <a href="#6.4.2.1">6.4.2.1</a>, <a href="#6.5.1">6.5.1</a>                                       initial shift state, <a href="#5.2.1.2">5.2.1.2</a>
-   linkage, see linkage                                         initialization, <a href="#5.1.2">5.1.2</a>, <a href="#6.2.4">6.2.4</a>, <a href="#6.3.2.1">6.3.2.1</a>, <a href="#6.5.2.5">6.5.2.5</a>, <a href="#6.7.8">6.7.8</a>,
-  maximum length, <a href="#6.4.2.1">6.4.2.1</a>                                             <a href="#F.7.5">F.7.5</a>
-   name spaces, <a href="#6.2.3">6.2.3</a>                                              in blocks, <a href="#6.8">6.8</a>
-   reserved, <a href="#6.4.1">6.4.1</a>, <a href="#7.1.3">7.1.3</a>                                       initializer, <a href="#6.7.8">6.7.8</a>
-  scope, <a href="#6.2.1">6.2.1</a>                                                     permitted form, <a href="#6.6">6.6</a>
-   type, <a href="#6.2.5">6.2.5</a>                                                     string literal, <a href="#6.3.2.1">6.3.2.1</a>
-identifier list, <a href="#6.7.5">6.7.5</a>                                           inline, <a href="#6.7.4">6.7.4</a>
-identifier nondigit, <a href="#6.4.2.1">6.4.2.1</a>                                     inner scope, <a href="#6.2.1">6.2.1</a>
-IEC 559, <a href="#F.1">F.1</a>                                                    input failure, <a href="#7.24.2.6">7.24.2.6</a>, <a href="#7.24.2.8">7.24.2.8</a>, <a href="#7.24.2.10">7.24.2.10</a>
-IEC 60559, <a href="#2">2</a>, <a href="#5.1.2.3">5.1.2.3</a>, <a href="#5.2.4.2.2">5.2.4.2.2</a>, <a href="#6.10.8">6.10.8</a>, <a href="#7.3.3">7.3.3</a>, <a href="#7.6">7.6</a>,           input/output functions
-      <a href="#7.6.4.2">7.6.4.2</a>, <a href="#7.12.1">7.12.1</a>, <a href="#7.12.10.2">7.12.10.2</a>, <a href="#7.12.14">7.12.14</a>, <a href="#F">F</a>, <a href="#G">G</a>, <a href="#H.1">H.1</a>               character, <a href="#7.19.7">7.19.7</a>
-IEEE 754, <a href="#F.1">F.1</a>                                                      direct, <a href="#7.19.8">7.19.8</a>
-IEEE 854, <a href="#F.1">F.1</a>                                                      formatted, <a href="#7.19.6">7.19.6</a>
-IEEE floating-point arithmetic standard, see                           wide character, <a href="#7.24.2">7.24.2</a>
-      IEC 60559, ANSI/IEEE 754,                                    wide character, <a href="#7.24.3">7.24.3</a>
-      ANSI/IEEE 854                                                   formatted, <a href="#7.24.2">7.24.2</a>
-if preprocessing directive, <a href="#5.2.4.2.1">5.2.4.2.1</a>, <a href="#5.2.4.2.2">5.2.4.2.2</a>,               input/output header, <a href="#7.19">7.19</a>
-      <a href="#6.10.1">6.10.1</a>, <a href="#7.1.4">7.1.4</a>                                             input/output, device, <a href="#5.1.2.3">5.1.2.3</a>
-if statement, <a href="#6.8.4.1">6.8.4.1</a>                                           int type, <a href="#6.2.5">6.2.5</a>, <a href="#6.3.1.1">6.3.1.1</a>, <a href="#6.3.1.3">6.3.1.3</a>, <a href="#6.4.4.1">6.4.4.1</a>, <a href="#6.7.2">6.7.2</a>
-ifdef preprocessing directive, <a href="#6.10.1">6.10.1</a>                           int type conversion, <a href="#6.3.1.1">6.3.1.1</a>, <a href="#6.3.1.3">6.3.1.3</a>, <a href="#6.3.1.4">6.3.1.4</a>,
-ifndef preprocessing directive, <a href="#6.10.1">6.10.1</a>                                <a href="#6.3.1.8">6.3.1.8</a>
-ilogb functions, <a href="#7.12">7.12</a>, <a href="#7.12.6.5">7.12.6.5</a>, <a href="#F.9.3.5">F.9.3.5</a>                        INT_FASTN_MAX macros, <a href="#7.18.2.3">7.18.2.3</a>
-ilogb type-generic macro, <a href="#7.22">7.22</a>                                  INT_FASTN_MIN macros, <a href="#7.18.2.3">7.18.2.3</a>
-imaginary macro, <a href="#7.3.1">7.3.1</a>, <a href="#G.6">G.6</a>                                     int_fastN_t types, <a href="#7.18.1.3">7.18.1.3</a>
-imaginary numbers, <a href="#G">G</a>                                            INT_LEASTN_MAX macros, <a href="#7.18.2.2">7.18.2.2</a>
-imaginary type domain, <a href="#G.2">G.2</a>                                      INT_LEASTN_MIN macros, <a href="#7.18.2.2">7.18.2.2</a>
-imaginary types, <a href="#G">G</a>                                              int_leastN_t types, <a href="#7.18.1.2">7.18.1.2</a>
-imaxabs function, <a href="#7.8.2.1">7.8.2.1</a>                                       INT_MAX macro, <a href="#5.2.4.2.1">5.2.4.2.1</a>, <a href="#7.12">7.12</a>, <a href="#7.12.6.5">7.12.6.5</a>
-imaxdiv function, <a href="#7.8">7.8</a>, <a href="#7.8.2.2">7.8.2.2</a>                                  INT_MIN macro, <a href="#5.2.4.2.1">5.2.4.2.1</a>, <a href="#7.12">7.12</a>
-imaxdiv_t type, <a href="#7.8">7.8</a>                                             integer arithmetic functions, <a href="#7.8.2.1">7.8.2.1</a>, <a href="#7.8.2.2">7.8.2.2</a>,
-implementation, <a href="#3.12">3.12</a>                                                  <a href="#7.20.6">7.20.6</a>
-implementation limit, <a href="#3.13">3.13</a>, <a href="#4">4</a>, <a href="#5.2.4.2">5.2.4.2</a>, <a href="#6.4.2.1">6.4.2.1</a>,                integer character constant, <a href="#6.4.4.4">6.4.4.4</a>
-      <a href="#6.7.5">6.7.5</a>, <a href="#6.8.4.2">6.8.4.2</a>, <a href="#E">E</a>, see also environmental                 integer constant, <a href="#6.4.4.1">6.4.4.1</a>
-      limits                                                    integer constant expression, <a href="#6.6">6.6</a>
-implementation-defined behavior, <a href="#3.4.1">3.4.1</a>, <a href="#4">4</a>, <a href="#J.3">J.3</a>                   integer conversion rank, <a href="#6.3.1.1">6.3.1.1</a>
-implementation-defined value, <a href="#3.17.1">3.17.1</a>                             integer promotions, <a href="#5.1.2.3">5.1.2.3</a>, <a href="#5.2.4.2.1">5.2.4.2.1</a>, <a href="#6.3.1.1">6.3.1.1</a>,
-implicit conversion, <a href="#6.3">6.3</a>                                              <a href="#6.5.2.2">6.5.2.2</a>, <a href="#6.5.3.3">6.5.3.3</a>, <a href="#6.5.7">6.5.7</a>, <a href="#6.8.4.2">6.8.4.2</a>, <a href="#7.18.2">7.18.2</a>, <a href="#7.18.3">7.18.3</a>,
-implicit initialization, <a href="#6.7.8">6.7.8</a>                                        <a href="#7.19.6.1">7.19.6.1</a>, <a href="#7.24.2.1">7.24.2.1</a>
-include preprocessing directive, <a href="#5.1.1.2">5.1.1.2</a>, <a href="#6.10.2">6.10.2</a>                integer suffix, <a href="#6.4.4.1">6.4.4.1</a>
-inclusive OR operators                                          integer type conversion, <a href="#6.3.1.1">6.3.1.1</a>, <a href="#6.3.1.3">6.3.1.3</a>, <a href="#6.3.1.4">6.3.1.4</a>,
-   bitwise (|), <a href="#6.5.12">6.5.12</a>                                                <a href="#F.3">F.3</a>, <a href="#F.4">F.4</a>
-   bitwise assignment (|=), <a href="#6.5.16.2">6.5.16.2</a>                            integer types, <a href="#6.2.5">6.2.5</a>, <a href="#7.18">7.18</a>
-incomplete type, <a href="#6.2.5">6.2.5</a>                                             extended, <a href="#6.2.5">6.2.5</a>, <a href="#6.3.1.1">6.3.1.1</a>, <a href="#6.4.4.1">6.4.4.1</a>, <a href="#7.18">7.18</a>
-increment operators, see arithmetic operators,                  interactive device, <a href="#5.1.2.3">5.1.2.3</a>, <a href="#7.19.3">7.19.3</a>, <a href="#7.19.5.3">7.19.5.3</a>
-      increment and decrement                                   internal linkage, <a href="#6.2.2">6.2.2</a>
-indeterminate value, <a href="#3.17.2">3.17.2</a>                                     internal name, <a href="#6.4.2.1">6.4.2.1</a>
-indirection operator (*), <a href="#6.5.2.1">6.5.2.1</a>, <a href="#6.5.3.2">6.5.3.2</a>                      interrupt, <a href="#5.2.3">5.2.3</a>
-inequality operator (!=), <a href="#6.5.9">6.5.9</a>                                 INTMAX_C macro, <a href="#7.18.4.2">7.18.4.2</a>
-INFINITY macro, <a href="#7.3.9.4">7.3.9.4</a>, <a href="#7.12">7.12</a>, <a href="#F.2.1">F.2.1</a>                            INTMAX_MAX macro, <a href="#7.8.2.3">7.8.2.3</a>, <a href="#7.8.2.4">7.8.2.4</a>, <a href="#7.18.2.5">7.18.2.5</a>
-
-[<a name="p529" href="#p529">page 529</a>] (<a href="#Contents">Contents</a>)
-
-INTMAX_MIN macro, <a href="#7.8.2.3">7.8.2.3</a>, <a href="#7.8.2.4">7.8.2.4</a>, <a href="#7.18.2.5">7.18.2.5</a>            iswalpha function, <a href="#7.25.2.1.1">7.25.2.1.1</a>, <a href="#7.25.2.1.2">7.25.2.1.2</a>,
-intmax_t type, <a href="#7.18.1.5">7.18.1.5</a>, <a href="#7.19.6.1">7.19.6.1</a>, <a href="#7.19.6.2">7.19.6.2</a>,                  <a href="#7.25.2.2.1">7.25.2.2.1</a>
-    <a href="#7.24.2.1">7.24.2.1</a>, <a href="#7.24.2.2">7.24.2.2</a>                                  iswblank function, <a href="#7.25.2.1.3">7.25.2.1.3</a>, <a href="#7.25.2.2.1">7.25.2.2.1</a>
-INTN_C macros, <a href="#7.18.4.1">7.18.4.1</a>                                 iswcntrl function, <a href="#7.25.2.1.2">7.25.2.1.2</a>, <a href="#7.25.2.1.4">7.25.2.1.4</a>,
-INTN_MAX macros, <a href="#7.18.2.1">7.18.2.1</a>                                     <a href="#7.25.2.1.7">7.25.2.1.7</a>, <a href="#7.25.2.1.11">7.25.2.1.11</a>, <a href="#7.25.2.2.1">7.25.2.2.1</a>
-INTN_MIN macros, <a href="#7.18.2.1">7.18.2.1</a>                               iswctype function, <a href="#7.25.2.2.1">7.25.2.2.1</a>, <a href="#7.25.2.2.2">7.25.2.2.2</a>
-intN_t types, <a href="#7.18.1.1">7.18.1.1</a>                                  iswdigit function, <a href="#7.25.2.1.1">7.25.2.1.1</a>, <a href="#7.25.2.1.2">7.25.2.1.2</a>,
-INTPTR_MAX macro, <a href="#7.18.2.4">7.18.2.4</a>                                    <a href="#7.25.2.1.5">7.25.2.1.5</a>, <a href="#7.25.2.1.7">7.25.2.1.7</a>, <a href="#7.25.2.1.11">7.25.2.1.11</a>, <a href="#7.25.2.2.1">7.25.2.2.1</a>
-INTPTR_MIN macro, <a href="#7.18.2.4">7.18.2.4</a>                              iswgraph function, <a href="#7.25.2.1">7.25.2.1</a>, <a href="#7.25.2.1.6">7.25.2.1.6</a>,
-intptr_t type, <a href="#7.18.1.4">7.18.1.4</a>                                       <a href="#7.25.2.1.10">7.25.2.1.10</a>, <a href="#7.25.2.2.1">7.25.2.2.1</a>
-inttypes.h header, <a href="#7.8">7.8</a>, <a href="#7.26.4">7.26.4</a>                          iswlower function, <a href="#7.25.2.1.2">7.25.2.1.2</a>, <a href="#7.25.2.1.7">7.25.2.1.7</a>,
-isalnum function, <a href="#7.4.1.1">7.4.1.1</a>, <a href="#7.4.1.9">7.4.1.9</a>, <a href="#7.4.1.10">7.4.1.10</a>                  <a href="#7.25.2.2.1">7.25.2.2.1</a>, <a href="#7.25.3.1.1">7.25.3.1.1</a>, <a href="#7.25.3.1.2">7.25.3.1.2</a>
-isalpha function, <a href="#7.4.1.1">7.4.1.1</a>, <a href="#7.4.1.2">7.4.1.2</a>                      iswprint function, <a href="#7.25.2.1.6">7.25.2.1.6</a>, <a href="#7.25.2.1.8">7.25.2.1.8</a>,
-isblank function, <a href="#7.4.1.3">7.4.1.3</a>                                     <a href="#7.25.2.2.1">7.25.2.2.1</a>
-iscntrl function, <a href="#7.4.1.2">7.4.1.2</a>, <a href="#7.4.1.4">7.4.1.4</a>, <a href="#7.4.1.7">7.4.1.7</a>,            iswpunct function, <a href="#7.25.2.1">7.25.2.1</a>, <a href="#7.25.2.1.2">7.25.2.1.2</a>,
-    <a href="#7.4.1.11">7.4.1.11</a>                                                  <a href="#7.25.2.1.7">7.25.2.1.7</a>, <a href="#7.25.2.1.9">7.25.2.1.9</a>, <a href="#7.25.2.1.10">7.25.2.1.10</a>,
-isdigit function, <a href="#7.4.1.1">7.4.1.1</a>, <a href="#7.4.1.2">7.4.1.2</a>, <a href="#7.4.1.5">7.4.1.5</a>,                  <a href="#7.25.2.1.11">7.25.2.1.11</a>, <a href="#7.25.2.2.1">7.25.2.2.1</a>
-    <a href="#7.4.1.7">7.4.1.7</a>, <a href="#7.4.1.11">7.4.1.11</a>, <a href="#7.11.1.1">7.11.1.1</a>                         iswspace function, <a href="#7.19.6.2">7.19.6.2</a>, <a href="#7.24.2.2">7.24.2.2</a>,
-isfinite macro, <a href="#7.12.3.2">7.12.3.2</a>, <a href="#F.3">F.3</a>                                 <a href="#7.24.4.1.1">7.24.4.1.1</a>, <a href="#7.24.4.1.2">7.24.4.1.2</a>, <a href="#7.25.2.1.2">7.25.2.1.2</a>, <a href="#7.25.2.1.6">7.25.2.1.6</a>,
-isgraph function, <a href="#7.4.1.6">7.4.1.6</a>                                     <a href="#7.25.2.1.7">7.25.2.1.7</a>, <a href="#7.25.2.1.9">7.25.2.1.9</a>, <a href="#7.25.2.1.10">7.25.2.1.10</a>,
-isgreater macro, <a href="#7.12.14.1">7.12.14.1</a>, <a href="#F.3">F.3</a>                               <a href="#7.25.2.1.11">7.25.2.1.11</a>, <a href="#7.25.2.2.1">7.25.2.2.1</a>
-isgreaterequal macro, <a href="#7.12.14.2">7.12.14.2</a>, <a href="#F.3">F.3</a>                    iswupper function, <a href="#7.25.2.1.2">7.25.2.1.2</a>, <a href="#7.25.2.1.11">7.25.2.1.11</a>,
-isinf macro, <a href="#7.12.3.3">7.12.3.3</a>                                         <a href="#7.25.2.2.1">7.25.2.2.1</a>, <a href="#7.25.3.1.1">7.25.3.1.1</a>, <a href="#7.25.3.1.2">7.25.3.1.2</a>
-isless macro, <a href="#7.12.14.3">7.12.14.3</a>, <a href="#F.3">F.3</a>                            iswxdigit function, <a href="#7.25.2.1.12">7.25.2.1.12</a>, <a href="#7.25.2.2.1">7.25.2.2.1</a>
-islessequal macro, <a href="#7.12.14.4">7.12.14.4</a>, <a href="#F.3">F.3</a>                       isxdigit function, <a href="#7.4.1.12">7.4.1.12</a>, <a href="#7.11.1.1">7.11.1.1</a>
-islessgreater macro, <a href="#7.12.14.5">7.12.14.5</a>, <a href="#F.3">F.3</a>                     italic type convention, <a href="#3">3</a>, <a href="#6.1">6.1</a>
-islower function, <a href="#7.4.1.2">7.4.1.2</a>, <a href="#7.4.1.7">7.4.1.7</a>, <a href="#7.4.2.1">7.4.2.1</a>,            iteration statements, <a href="#6.8.5">6.8.5</a>
-    <a href="#7.4.2.2">7.4.2.2</a>
-isnan macro, <a href="#7.12.3.4">7.12.3.4</a>, <a href="#F.3">F.3</a>                              jmp_buf type, <a href="#7.13">7.13</a>
-isnormal macro, <a href="#7.12.3.5">7.12.3.5</a>                                jump statements, <a href="#6.8.6">6.8.6</a>
-ISO 31-11, <a href="#2">2</a>, <a href="#3">3</a>
-ISO 4217, <a href="#2">2</a>, <a href="#7.11.2.1">7.11.2.1</a>                                   keywords, <a href="#6.4.1">6.4.1</a>, <a href="#G.2">G.2</a>, <a href="#J.5.9">J.5.9</a>, <a href="#J.5.10">J.5.10</a>
-ISO 8601, <a href="#2">2</a>, <a href="#7.23.3.5">7.23.3.5</a>                                   known constant size, <a href="#6.2.5">6.2.5</a>
-ISO/IEC 10646, <a href="#2">2</a>, <a href="#6.4.2.1">6.4.2.1</a>, <a href="#6.4.3">6.4.3</a>, <a href="#6.10.8">6.10.8</a>
-ISO/IEC 10976-1, <a href="#H.1">H.1</a>                                    <a href="#L">L</a>_tmpnam macro, <a href="#7.19.1">7.19.1</a>, <a href="#7.19.4.4">7.19.4.4</a>
-ISO/IEC 2382-1, <a href="#2">2</a>, <a href="#3">3</a>                                    label name, <a href="#6.2.1">6.2.1</a>, <a href="#6.2.3">6.2.3</a>
-ISO/IEC 646, <a href="#2">2</a>, <a href="#5.2.1.1">5.2.1.1</a>                                 labeled statement, <a href="#6.8.1">6.8.1</a>
-ISO/IEC 9945-2, <a href="#7.11">7.11</a>                                    labs function, <a href="#7.20.6.1">7.20.6.1</a>
-ISO/IEC TR 10176, <a href="#D">D</a>                                     language, <a href="#6">6</a>
-iso646.h header, <a href="#4">4</a>, <a href="#7.9">7.9</a>                                    future directions, <a href="#6.11">6.11</a>
-isprint function, <a href="#5.2.2">5.2.2</a>, <a href="#7.4.1.8">7.4.1.8</a>                           syntax summary, <a href="#A">A</a>
-ispunct function, <a href="#7.4.1.2">7.4.1.2</a>, <a href="#7.4.1.7">7.4.1.7</a>, <a href="#7.4.1.9">7.4.1.9</a>,            Latin alphabet, <a href="#5.2.1">5.2.1</a>, <a href="#6.4.2.1">6.4.2.1</a>
-    <a href="#7.4.1.11">7.4.1.11</a>                                            LC_ALL macro, <a href="#7.11">7.11</a>, <a href="#7.11.1.1">7.11.1.1</a>, <a href="#7.11.2.1">7.11.2.1</a>
-isspace function, <a href="#7.4.1.2">7.4.1.2</a>, <a href="#7.4.1.7">7.4.1.7</a>, <a href="#7.4.1.9">7.4.1.9</a>,            LC_COLLATE macro, <a href="#7.11">7.11</a>, <a href="#7.11.1.1">7.11.1.1</a>, <a href="#7.21.4.3">7.21.4.3</a>,
-    <a href="#7.4.1.10">7.4.1.10</a>, <a href="#7.4.1.11">7.4.1.11</a>, <a href="#7.19.6.2">7.19.6.2</a>, <a href="#7.20.1.3">7.20.1.3</a>,                   <a href="#7.24.4.4.2">7.24.4.4.2</a>
-    <a href="#7.20.1.4">7.20.1.4</a>, <a href="#7.24.2.2">7.24.2.2</a>                                  LC_CTYPE macro, <a href="#7.11">7.11</a>, <a href="#7.11.1.1">7.11.1.1</a>, <a href="#7.20">7.20</a>, <a href="#7.20.7">7.20.7</a>,
-isunordered macro, <a href="#7.12.14.6">7.12.14.6</a>, <a href="#F.3">F.3</a>                             <a href="#7.20.8">7.20.8</a>, <a href="#7.24.6">7.24.6</a>, <a href="#7.25.1">7.25.1</a>, <a href="#7.25.2.2.1">7.25.2.2.1</a>, <a href="#7.25.2.2.2">7.25.2.2.2</a>,
-isupper function, <a href="#7.4.1.2">7.4.1.2</a>, <a href="#7.4.1.11">7.4.1.11</a>, <a href="#7.4.2.1">7.4.2.1</a>,                 <a href="#7.25.3.2.1">7.25.3.2.1</a>, <a href="#7.25.3.2.2">7.25.3.2.2</a>
-    <a href="#7.4.2.2">7.4.2.2</a>                                             LC_MONETARY macro, <a href="#7.11">7.11</a>, <a href="#7.11.1.1">7.11.1.1</a>, <a href="#7.11.2.1">7.11.2.1</a>
-iswalnum function, <a href="#7.25.2.1.1">7.25.2.1.1</a>, <a href="#7.25.2.1.9">7.25.2.1.9</a>,              LC_NUMERIC macro, <a href="#7.11">7.11</a>, <a href="#7.11.1.1">7.11.1.1</a>, <a href="#7.11.2.1">7.11.2.1</a>
-    <a href="#7.25.2.1.10">7.25.2.1.10</a>, <a href="#7.25.2.2.1">7.25.2.2.1</a>                             LC_TIME macro, <a href="#7.11">7.11</a>, <a href="#7.11.1.1">7.11.1.1</a>, <a href="#7.23.3.5">7.23.3.5</a>
-
-[<a name="p530" href="#p530">page 530</a>] (<a href="#Contents">Contents</a>)
-
-lconv structure type, <a href="#7.11">7.11</a>                                 llabs function, <a href="#7.20.6.1">7.20.6.1</a>
-LDBL_DIG macro, <a href="#5.2.4.2.2">5.2.4.2.2</a>                                  lldiv function, <a href="#7.20.6.2">7.20.6.2</a>
-LDBL_EPSILON macro, <a href="#5.2.4.2.2">5.2.4.2.2</a>                              lldiv_t type, <a href="#7.20">7.20</a>
-LDBL_MANT_DIG macro, <a href="#5.2.4.2.2">5.2.4.2.2</a>                             LLONG_MAX macro, <a href="#5.2.4.2.1">5.2.4.2.1</a>, <a href="#7.20.1.4">7.20.1.4</a>,
-LDBL_MAX macro, <a href="#5.2.4.2.2">5.2.4.2.2</a>                                       <a href="#7.24.4.1.2">7.24.4.1.2</a>
-LDBL_MAX_10_EXP macro, <a href="#5.2.4.2.2">5.2.4.2.2</a>                           LLONG_MIN macro, <a href="#5.2.4.2.1">5.2.4.2.1</a>, <a href="#7.20.1.4">7.20.1.4</a>,
-LDBL_MAX_EXP macro, <a href="#5.2.4.2.2">5.2.4.2.2</a>                                   <a href="#7.24.4.1.2">7.24.4.1.2</a>
-LDBL_MIN macro, <a href="#5.2.4.2.2">5.2.4.2.2</a>                                  llrint functions, <a href="#7.12.9.5">7.12.9.5</a>, <a href="#F.3">F.3</a>, <a href="#F.9.6.5">F.9.6.5</a>
-LDBL_MIN_10_EXP macro, <a href="#5.2.4.2.2">5.2.4.2.2</a>                           llrint type-generic macro, <a href="#7.22">7.22</a>
-LDBL_MIN_EXP macro, <a href="#5.2.4.2.2">5.2.4.2.2</a>                              llround functions, <a href="#7.12.9.7">7.12.9.7</a>, <a href="#F.9.6.7">F.9.6.7</a>
-ldexp functions, <a href="#7.12.6.6">7.12.6.6</a>, <a href="#F.9.3.6">F.9.3.6</a>                         llround type-generic macro, <a href="#7.22">7.22</a>
-ldexp type-generic macro, <a href="#7.22">7.22</a>                             local time, <a href="#7.23.1">7.23.1</a>
-ldiv function, <a href="#7.20.6.2">7.20.6.2</a>                                    locale, <a href="#3.4.2">3.4.2</a>
-ldiv_t type, <a href="#7.20">7.20</a>                                          locale-specific behavior, <a href="#3.4.2">3.4.2</a>, <a href="#J.4">J.4</a>
-leading underscore in identifiers, <a href="#7.1.3">7.1.3</a>                    locale.h header, <a href="#7.11">7.11</a>, <a href="#7.26.5">7.26.5</a>
-left-shift assignment operator (&lt;&lt;=), <a href="#6.5.16.2">6.5.16.2</a>             localeconv function, <a href="#7.11.1.1">7.11.1.1</a>, <a href="#7.11.2.1">7.11.2.1</a>
-left-shift operator (&lt;&lt;), <a href="#6.5.7">6.5.7</a>                            localization, <a href="#7.11">7.11</a>
-length                                                     localtime function, <a href="#7.23.3.4">7.23.3.4</a>
-   external name, <a href="#5.2.4.1">5.2.4.1</a>, <a href="#6.4.2.1">6.4.2.1</a>, <a href="#6.11.3">6.11.3</a>                 log functions, <a href="#7.12.6.7">7.12.6.7</a>, <a href="#F.9.3.7">F.9.3.7</a>
-   function name, <a href="#5.2.4.1">5.2.4.1</a>, <a href="#6.4.2.1">6.4.2.1</a>, <a href="#6.11.3">6.11.3</a>                 log type-generic macro, <a href="#7.22">7.22</a>
-   identifier, <a href="#6.4.2.1">6.4.2.1</a>                                      log10 functions, <a href="#7.12.6.8">7.12.6.8</a>, <a href="#F.9.3.8">F.9.3.8</a>
-   internal name, <a href="#5.2.4.1">5.2.4.1</a>, <a href="#6.4.2.1">6.4.2.1</a>                         log10 type-generic macro, <a href="#7.22">7.22</a>
-length function, <a href="#7.20.7.1">7.20.7.1</a>, <a href="#7.21.6.3">7.21.6.3</a>, <a href="#7.24.4.6.1">7.24.4.6.1</a>,           log1p functions, <a href="#7.12.6.9">7.12.6.9</a>, <a href="#F.9.3.9">F.9.3.9</a>
-      <a href="#7.24.6.3.1">7.24.6.3.1</a>                                           log1p type-generic macro, <a href="#7.22">7.22</a>
-length modifier, <a href="#7.19.6.1">7.19.6.1</a>, <a href="#7.19.6.2">7.19.6.2</a>, <a href="#7.24.2.1">7.24.2.1</a>,              log2 functions, <a href="#7.12.6.10">7.12.6.10</a>, <a href="#F.9.3.10">F.9.3.10</a>
-      <a href="#7.24.2.2">7.24.2.2</a>                                             log2 type-generic macro, <a href="#7.22">7.22</a>
-less-than operator (&lt;), <a href="#6.5.8">6.5.8</a>                              logarithmic functions
-less-than-or-equal-to operator (&lt;=), <a href="#6.5.8">6.5.8</a>                   complex, <a href="#7.3.7">7.3.7</a>, <a href="#G.6.3">G.6.3</a>
-letter, <a href="#5.2.1">5.2.1</a>, <a href="#7.4">7.4</a>                                           real, <a href="#7.12.6">7.12.6</a>, <a href="#F.9.3">F.9.3</a>
-lexical elements, <a href="#5.1.1.2">5.1.1.2</a>, <a href="#6.4">6.4</a>                             logb functions, <a href="#7.12.6.11">7.12.6.11</a>, <a href="#F.3">F.3</a>, <a href="#F.9.3.11">F.9.3.11</a>
-lgamma functions, <a href="#7.12.8.3">7.12.8.3</a>, <a href="#F.9.5.3">F.9.5.3</a>                        logb type-generic macro, <a href="#7.22">7.22</a>
-lgamma type-generic macro, <a href="#7.22">7.22</a>                            logical operators
-library, <a href="#5.1.1.1">5.1.1.1</a>, <a href="#7">7</a>                                          AND (&amp;&amp;), <a href="#6.5.13">6.5.13</a>
-   future directions, <a href="#7.26">7.26</a>                                   negation (!), <a href="#6.5.3.3">6.5.3.3</a>
-   summary, <a href="#B">B</a>                                                OR (||), <a href="#6.5.14">6.5.14</a>
-   terms, <a href="#7.1.1">7.1.1</a>                                            logical source lines, <a href="#5.1.1.2">5.1.1.2</a>
-   use of functions, <a href="#7.1.4">7.1.4</a>                                 long double _Complex type, <a href="#6.2.5">6.2.5</a>
-lifetime, <a href="#6.2.4">6.2.4</a>                                            long double _Complex type conversion,
-limits                                                          <a href="#6.3.1.6">6.3.1.6</a>, <a href="#6.3.1.7">6.3.1.7</a>, <a href="#6.3.1.8">6.3.1.8</a>
-   environmental, see environmental limits                 long double _Imaginary type, <a href="#G.2">G.2</a>
-   implementation, see implementation limits               long double suffix, l or <a href="#L">L</a>, <a href="#6.4.4.2">6.4.4.2</a>
-   numerical, see numerical limits                         long double type, <a href="#6.2.5">6.2.5</a>, <a href="#6.4.4.2">6.4.4.2</a>, <a href="#6.7.2">6.7.2</a>,
-   translation, see translation limits                          <a href="#7.19.6.1">7.19.6.1</a>, <a href="#7.19.6.2">7.19.6.2</a>, <a href="#7.24.2.1">7.24.2.1</a>, <a href="#7.24.2.2">7.24.2.2</a>, <a href="#F.2">F.2</a>
-limits.h header, <a href="#4">4</a>, <a href="#5.2.4.2.1">5.2.4.2.1</a>, <a href="#6.2.5">6.2.5</a>, <a href="#7.10">7.10</a>                 long double type conversion, <a href="#6.3.1.4">6.3.1.4</a>, <a href="#6.3.1.5">6.3.1.5</a>,
-line buffered stream, <a href="#7.19.3">7.19.3</a>                                    <a href="#6.3.1.7">6.3.1.7</a>, <a href="#6.3.1.8">6.3.1.8</a>
-line number, <a href="#6.10.4">6.10.4</a>, <a href="#6.10.8">6.10.8</a>                                long int type, <a href="#6.2.5">6.2.5</a>, <a href="#6.3.1.1">6.3.1.1</a>, <a href="#6.7.2">6.7.2</a>, <a href="#7.19.6.1">7.19.6.1</a>,
-line preprocessing directive, <a href="#6.10.4">6.10.4</a>                            <a href="#7.19.6.2">7.19.6.2</a>, <a href="#7.24.2.1">7.24.2.1</a>, <a href="#7.24.2.2">7.24.2.2</a>
-lines, <a href="#5.1.1.2">5.1.1.2</a>, <a href="#7.19.2">7.19.2</a>                                     long int type conversion, <a href="#6.3.1.1">6.3.1.1</a>, <a href="#6.3.1.3">6.3.1.3</a>,
-   preprocessing directive, <a href="#6.10">6.10</a>                                <a href="#6.3.1.4">6.3.1.4</a>, <a href="#6.3.1.8">6.3.1.8</a>
-linkage, <a href="#6.2.2">6.2.2</a>, <a href="#6.7">6.7</a>, <a href="#6.7.4">6.7.4</a>, <a href="#6.7.5.2">6.7.5.2</a>, <a href="#6.9">6.9</a>, <a href="#6.9.2">6.9.2</a>,           long integer suffix, l or <a href="#L">L</a>, <a href="#6.4.4.1">6.4.4.1</a>
-      <a href="#6.11.2">6.11.2</a>                                               long long int type, <a href="#6.2.5">6.2.5</a>, <a href="#6.3.1.1">6.3.1.1</a>, <a href="#6.7.2">6.7.2</a>,
-
-[<a name="p531" href="#p531">page 531</a>] (<a href="#Contents">Contents</a>)
-
-     <a href="#7.19.6.1">7.19.6.1</a>, <a href="#7.19.6.2">7.19.6.2</a>, <a href="#7.24.2.1">7.24.2.1</a>, <a href="#7.24.2.2">7.24.2.2</a>                    mbsinit function, <a href="#7.24.6.2.1">7.24.6.2.1</a>
-long long int type conversion, <a href="#6.3.1.1">6.3.1.1</a>,                        mbsrtowcs function, <a href="#7.24.6.4.1">7.24.6.4.1</a>
-     <a href="#6.3.1.3">6.3.1.3</a>, <a href="#6.3.1.4">6.3.1.4</a>, <a href="#6.3.1.8">6.3.1.8</a>                                 mbstate_t type, <a href="#7.19.2">7.19.2</a>, <a href="#7.19.3">7.19.3</a>, <a href="#7.19.6.1">7.19.6.1</a>,
-long long integer suffix, ll or LL, <a href="#6.4.4.1">6.4.4.1</a>                          <a href="#7.19.6.2">7.19.6.2</a>, <a href="#7.24.1">7.24.1</a>, <a href="#7.24.2.1">7.24.2.1</a>, <a href="#7.24.2.2">7.24.2.2</a>, <a href="#7.24.6">7.24.6</a>,
-LONG_MAX macro, <a href="#5.2.4.2.1">5.2.4.2.1</a>, <a href="#7.20.1.4">7.20.1.4</a>, <a href="#7.24.4.1.2">7.24.4.1.2</a>                     <a href="#7.24.6.2.1">7.24.6.2.1</a>, <a href="#7.24.6.3">7.24.6.3</a>, <a href="#7.24.6.3.1">7.24.6.3.1</a>, <a href="#7.24.6.4">7.24.6.4</a>
-LONG_MIN macro, <a href="#5.2.4.2.1">5.2.4.2.1</a>, <a href="#7.20.1.4">7.20.1.4</a>, <a href="#7.24.4.1.2">7.24.4.1.2</a>                mbstowcs function, <a href="#6.4.5">6.4.5</a>, <a href="#7.20.8.1">7.20.8.1</a>, <a href="#7.24.6.4">7.24.6.4</a>
-longjmp function, <a href="#7.13.1.1">7.13.1.1</a>, <a href="#7.13.2.1">7.13.2.1</a>, <a href="#7.20.4.3">7.20.4.3</a>                 mbtowc function, <a href="#7.20.7.1">7.20.7.1</a>, <a href="#7.20.7.2">7.20.7.2</a>, <a href="#7.20.8.1">7.20.8.1</a>,
-loop body, <a href="#6.8.5">6.8.5</a>                                                    <a href="#7.24.6.3">7.24.6.3</a>
-low-order bit, <a href="#3.6">3.6</a>                                             member access operators (. and -&gt;), <a href="#6.5.2.3">6.5.2.3</a>
-lowercase letter, <a href="#5.2.1">5.2.1</a>                                        member alignment, <a href="#6.7.2.1">6.7.2.1</a>
-lrint functions, <a href="#7.12.9.5">7.12.9.5</a>, <a href="#F.3">F.3</a>, <a href="#F.9.6.5">F.9.6.5</a>                        memchr function, <a href="#7.21.5.1">7.21.5.1</a>
-lrint type-generic macro, <a href="#7.22">7.22</a>                                 memcmp function, <a href="#7.21.4">7.21.4</a>, <a href="#7.21.4.1">7.21.4.1</a>
-lround functions, <a href="#7.12.9.7">7.12.9.7</a>, <a href="#F.9.6.7">F.9.6.7</a>                            memcpy function, <a href="#7.21.2.1">7.21.2.1</a>
-lround type-generic macro, <a href="#7.22">7.22</a>                                memmove function, <a href="#7.21.2.2">7.21.2.2</a>
-lvalue, <a href="#6.3.2.1">6.3.2.1</a>, <a href="#6.5.1">6.5.1</a>, <a href="#6.5.2.4">6.5.2.4</a>, <a href="#6.5.3.1">6.5.3.1</a>, <a href="#6.5.16">6.5.16</a>               memory management functions, <a href="#7.20.3">7.20.3</a>
-                                                               memset function, <a href="#7.21.6.1">7.21.6.1</a>
-macro argument substitution, <a href="#6.10.3.1">6.10.3.1</a>                          minimum functions, <a href="#7.12.12">7.12.12</a>, <a href="#F.9.9">F.9.9</a>
-macro definition                                                minus operator, unary, <a href="#6.5.3.3">6.5.3.3</a>
-  library function, <a href="#7.1.4">7.1.4</a>                                      miscellaneous functions
-macro invocation, <a href="#6.10.3">6.10.3</a>                                         string, <a href="#7.21.6">7.21.6</a>
-macro name, <a href="#6.10.3">6.10.3</a>                                               wide string, <a href="#7.24.4.6">7.24.4.6</a>
-  length, <a href="#5.2.4.1">5.2.4.1</a>                                              mktime function, <a href="#7.23.2.3">7.23.2.3</a>
-  predefined, <a href="#6.10.8">6.10.8</a>, <a href="#6.11.9">6.11.9</a>                                    modf functions, <a href="#7.12.6.12">7.12.6.12</a>, <a href="#F.9.3.12">F.9.3.12</a>
-  redefinition, <a href="#6.10.3">6.10.3</a>                                          modifiable lvalue, <a href="#6.3.2.1">6.3.2.1</a>
-  scope, <a href="#6.10.3.5">6.10.3.5</a>                                              modulus functions, <a href="#7.12.6.12">7.12.6.12</a>
-macro parameter, <a href="#6.10.3">6.10.3</a>                                        modulus, complex, <a href="#7.3.8.1">7.3.8.1</a>
-macro preprocessor, <a href="#6.10">6.10</a>                                       multibyte character, <a href="#3.7.2">3.7.2</a>, <a href="#5.2.1.2">5.2.1.2</a>, <a href="#6.4.4.4">6.4.4.4</a>
-macro replacement, <a href="#6.10.3">6.10.3</a>                                      multibyte conversion functions
-magnitude, complex, <a href="#7.3.8.1">7.3.8.1</a>                                      wide character, <a href="#7.20.7">7.20.7</a>
-main function, <a href="#5.1.2.2.1">5.1.2.2.1</a>, <a href="#5.1.2.2.3">5.1.2.2.3</a>, <a href="#6.7.3.1">6.7.3.1</a>, <a href="#6.7.4">6.7.4</a>,                extended, <a href="#7.24.6">7.24.6</a>
-     <a href="#7.19.3">7.19.3</a>                                                         restartable, <a href="#7.24.6.3">7.24.6.3</a>
-malloc function, <a href="#7.20.3">7.20.3</a>, <a href="#7.20.3.2">7.20.3.2</a>, <a href="#7.20.3.3">7.20.3.3</a>,                     wide string, <a href="#7.20.8">7.20.8</a>
-     <a href="#7.20.3.4">7.20.3.4</a>                                                       restartable, <a href="#7.24.6.4">7.24.6.4</a>
-manipulation functions                                         multibyte string, <a href="#7.1.1">7.1.1</a>
-  complex, <a href="#7.3.9">7.3.9</a>                                               multibyte/wide character conversion functions,
-  real, <a href="#7.12.11">7.12.11</a>, <a href="#F.9.8">F.9.8</a>                                              <a href="#7.20.7">7.20.7</a>
-matching failure, <a href="#7.24.2.6">7.24.2.6</a>, <a href="#7.24.2.8">7.24.2.8</a>, <a href="#7.24.2.10">7.24.2.10</a>                  extended, <a href="#7.24.6">7.24.6</a>
-math.h header, <a href="#5.2.4.2.2">5.2.4.2.2</a>, <a href="#6.5">6.5</a>, <a href="#7.12">7.12</a>, <a href="#7.22">7.22</a>, <a href="#F">F</a>, <a href="#F.9">F.9</a>,               restartable, <a href="#7.24.6.3">7.24.6.3</a>
-     <a href="#J.5.17">J.5.17</a>                                                    multibyte/wide string conversion functions, <a href="#7.20.8">7.20.8</a>
-MATH_ERREXCEPT macro, <a href="#7.12">7.12</a>, <a href="#F.9">F.9</a>                                  restartable, <a href="#7.24.6.4">7.24.6.4</a>
-math_errhandling macro, <a href="#7.1.3">7.1.3</a>, <a href="#7.12">7.12</a>, <a href="#F.9">F.9</a>                       multidimensional array, <a href="#6.5.2.1">6.5.2.1</a>
-MATH_ERRNO macro, <a href="#7.12">7.12</a>                                         multiplication assignment operator (*=), <a href="#6.5.16.2">6.5.16.2</a>
-maximum functions, <a href="#7.12.12">7.12.12</a>, <a href="#F.9.9">F.9.9</a>                              multiplication operator (*), <a href="#6.5.5">6.5.5</a>, <a href="#F.3">F.3</a>, <a href="#G.5.1">G.5.1</a>
-MB_CUR_MAX macro, <a href="#7.1.1">7.1.1</a>, <a href="#7.20">7.20</a>, <a href="#7.20.7.2">7.20.7.2</a>,                       multiplicative expressions, <a href="#6.5.5">6.5.5</a>, <a href="#G.5.1">G.5.1</a>
-     <a href="#7.20.7.3">7.20.7.3</a>, <a href="#7.24.6.3.3">7.24.6.3.3</a>
-MB_LEN_MAX macro, <a href="#5.2.4.2.1">5.2.4.2.1</a>, <a href="#7.1.1">7.1.1</a>, <a href="#7.20">7.20</a>                       n-char sequence, <a href="#7.20.1.3">7.20.1.3</a>
-mblen function, <a href="#7.20.7.1">7.20.7.1</a>, <a href="#7.24.6.3">7.24.6.3</a>                             n-wchar sequence, <a href="#7.24.4.1.1">7.24.4.1.1</a>
-mbrlen function, <a href="#7.24.6.3.1">7.24.6.3.1</a>                                    name
-mbrtowc function, <a href="#7.19.3">7.19.3</a>, <a href="#7.19.6.1">7.19.6.1</a>, <a href="#7.19.6.2">7.19.6.2</a>,                    external, <a href="#5.2.4.1">5.2.4.1</a>, <a href="#6.4.2.1">6.4.2.1</a>, <a href="#6.11.3">6.11.3</a>
-     <a href="#7.24.2.1">7.24.2.1</a>, <a href="#7.24.2.2">7.24.2.2</a>, <a href="#7.24.6.3.1">7.24.6.3.1</a>, <a href="#7.24.6.3.2">7.24.6.3.2</a>,                 file, <a href="#7.19.3">7.19.3</a>
-     <a href="#7.24.6.4.1">7.24.6.4.1</a>                                                  internal, <a href="#5.2.4.1">5.2.4.1</a>, <a href="#6.4.2.1">6.4.2.1</a>
-
-[<a name="p532" href="#p532">page 532</a>] (<a href="#Contents">Contents</a>)
-
-  label, <a href="#6.2.3">6.2.3</a>                                                  octal-character escape sequence (\octal digits),
-  structure/union member, <a href="#6.2.3">6.2.3</a>                                       <a href="#6.4.4.4">6.4.4.4</a>
-name spaces, <a href="#6.2.3">6.2.3</a>                                              offsetof macro, <a href="#7.17">7.17</a>
-named label, <a href="#6.8.1">6.8.1</a>                                              on-off switch, <a href="#6.10.6">6.10.6</a>
-NaN, <a href="#5.2.4.2.2">5.2.4.2.2</a>                                                  ones' complement, <a href="#6.2.6.2">6.2.6.2</a>
-nan functions, <a href="#7.12.11.2">7.12.11.2</a>, <a href="#F.2.1">F.2.1</a>, <a href="#F.9.8.2">F.9.8.2</a>                        operand, <a href="#6.4.6">6.4.6</a>, <a href="#6.5">6.5</a>
-NAN macro, <a href="#7.12">7.12</a>, <a href="#F.2.1">F.2.1</a>                                          operating system, <a href="#5.1.2.1">5.1.2.1</a>, <a href="#7.20.4.6">7.20.4.6</a>
-NDEBUG macro, <a href="#7.2">7.2</a>                                               operations on files, <a href="#7.19.4">7.19.4</a>
-nearbyint functions, <a href="#7.12.9.3">7.12.9.3</a>, <a href="#7.12.9.4">7.12.9.4</a>, <a href="#F.3">F.3</a>,                   operator, <a href="#6.4.6">6.4.6</a>
-     <a href="#F.9.6.3">F.9.6.3</a>                                                    operators, <a href="#6.5">6.5</a>
-nearbyint type-generic macro, <a href="#7.22">7.22</a>                                 assignment, <a href="#6.5.16">6.5.16</a>
-nearest integer functions, <a href="#7.12.9">7.12.9</a>, <a href="#F.9.6">F.9.6</a>                           associativity, <a href="#6.5">6.5</a>
-negation operator (!), <a href="#6.5.3.3">6.5.3.3</a>                                     equality, <a href="#6.5.9">6.5.9</a>
-negative zero, <a href="#6.2.6.2">6.2.6.2</a>, <a href="#7.12.11.1">7.12.11.1</a>                                  multiplicative, <a href="#6.5.5">6.5.5</a>, <a href="#G.5.1">G.5.1</a>
-new-line character, <a href="#5.1.1.2">5.1.1.2</a>, <a href="#5.2.1">5.2.1</a>, <a href="#6.4">6.4</a>, <a href="#6.10">6.10</a>, <a href="#6.10.4">6.10.4</a>              postfix, <a href="#6.5.2">6.5.2</a>
-new-line escape sequence (\n), <a href="#5.2.2">5.2.2</a>, <a href="#6.4.4.4">6.4.4.4</a>,                     precedence, <a href="#6.5">6.5</a>
-     <a href="#7.4.1.10">7.4.1.10</a>                                                      preprocessing, <a href="#6.10.1">6.10.1</a>, <a href="#6.10.3.2">6.10.3.2</a>, <a href="#6.10.3.3">6.10.3.3</a>, <a href="#6.10.9">6.10.9</a>
-nextafter functions, <a href="#7.12.11.3">7.12.11.3</a>, <a href="#7.12.11.4">7.12.11.4</a>, <a href="#F.3">F.3</a>,                    relational, <a href="#6.5.8">6.5.8</a>
-     <a href="#F.9.8.3">F.9.8.3</a>                                                       shift, <a href="#6.5.7">6.5.7</a>
-nextafter type-generic macro, <a href="#7.22">7.22</a>                                 unary, <a href="#6.5.3">6.5.3</a>
-nexttoward functions, <a href="#7.12.11.4">7.12.11.4</a>, <a href="#F.3">F.3</a>, <a href="#F.9.8.4">F.9.8.4</a>                      unary arithmetic, <a href="#6.5.3.3">6.5.3.3</a>
-nexttoward type-generic macro, <a href="#7.22">7.22</a>                             or macro, <a href="#7.9">7.9</a>
-no linkage, <a href="#6.2.2">6.2.2</a>                                               OR operators
-non-stop floating-point control mode, <a href="#7.6.4.2">7.6.4.2</a>                       bitwise exclusive (^), <a href="#6.5.11">6.5.11</a>
-nongraphic characters, <a href="#5.2.2">5.2.2</a>, <a href="#6.4.4.4">6.4.4.4</a>                              bitwise exclusive assignment (^=), <a href="#6.5.16.2">6.5.16.2</a>
-nonlocal jumps header, <a href="#7.13">7.13</a>                                        bitwise inclusive (|), <a href="#6.5.12">6.5.12</a>
-norm, complex, <a href="#7.3.8.1">7.3.8.1</a>                                             bitwise inclusive assignment (|=), <a href="#6.5.16.2">6.5.16.2</a>
-not macro, <a href="#7.9">7.9</a>                                                     logical (||), <a href="#6.5.14">6.5.14</a>
-not-equal-to operator, see inequality operator                  or_eq macro, <a href="#7.9">7.9</a>
-not_eq macro, <a href="#7.9">7.9</a>                                               order of allocated storage, <a href="#7.20.3">7.20.3</a>
-null character (\0), <a href="#5.2.1">5.2.1</a>, <a href="#6.4.4.4">6.4.4.4</a>, <a href="#6.4.5">6.4.5</a>                      order of evaluation, <a href="#6.5">6.5</a>
-  padding of binary stream, <a href="#7.19.2">7.19.2</a>                              ordinary identifier name space, <a href="#6.2.3">6.2.3</a>
-NULL macro, <a href="#7.11">7.11</a>, <a href="#7.17">7.17</a>, <a href="#7.19.1">7.19.1</a>, <a href="#7.20">7.20</a>, <a href="#7.21.1">7.21.1</a>,                   orientation of stream, <a href="#7.19.2">7.19.2</a>, <a href="#7.24.3.5">7.24.3.5</a>
-     <a href="#7.23.1">7.23.1</a>, <a href="#7.24.1">7.24.1</a>                                             outer scope, <a href="#6.2.1">6.2.1</a>
-null pointer, <a href="#6.3.2.3">6.3.2.3</a>
-null pointer constant, <a href="#6.3.2.3">6.3.2.3</a>                                  padding
-null preprocessing directive, <a href="#6.10.7">6.10.7</a>                              binary stream, <a href="#7.19.2">7.19.2</a>
-null statement, <a href="#6.8.3">6.8.3</a>                                             bits, <a href="#6.2.6.2">6.2.6.2</a>, <a href="#7.18.1.1">7.18.1.1</a>
-null wide character, <a href="#7.1.1">7.1.1</a>                                        structure/union, <a href="#6.2.6.1">6.2.6.1</a>, <a href="#6.7.2.1">6.7.2.1</a>
-number classification macros, <a href="#7.12">7.12</a>, <a href="#7.12.3.1">7.12.3.1</a>                     parameter, <a href="#3.15">3.15</a>
-numeric conversion functions, <a href="#7.8.2.3">7.8.2.3</a>, <a href="#7.20.1">7.20.1</a>                     array, <a href="#6.9.1">6.9.1</a>
-  wide string, <a href="#7.8.2.4">7.8.2.4</a>, <a href="#7.24.4.1">7.24.4.1</a>                                  ellipsis, <a href="#6.7.5.3">6.7.5.3</a>, <a href="#6.10.3">6.10.3</a>
-numerical limits, <a href="#5.2.4.2">5.2.4.2</a>                                         function, <a href="#6.5.2.2">6.5.2.2</a>, <a href="#6.7">6.7</a>, <a href="#6.9.1">6.9.1</a>
-                                                                  macro, <a href="#6.10.3">6.10.3</a>
-object, <a href="#3.14">3.14</a>                                                      main function, <a href="#5.1.2.2.1">5.1.2.2.1</a>
-object representation, <a href="#6.2.6.1">6.2.6.1</a>                                    program, <a href="#5.1.2.2.1">5.1.2.2.1</a>
-object type, <a href="#6.2.5">6.2.5</a>                                              parameter type list, <a href="#6.7.5.3">6.7.5.3</a>
-object-like macro, <a href="#6.10.3">6.10.3</a>                                       parentheses punctuator (( )), <a href="#6.7.5.3">6.7.5.3</a>, <a href="#6.8.4">6.8.4</a>, <a href="#6.8.5">6.8.5</a>
-obsolescence, <a href="#6.11">6.11</a>, <a href="#7.26">7.26</a>                                        parenthesized expression, <a href="#6.5.1">6.5.1</a>
-octal constant, <a href="#6.4.4.1">6.4.4.1</a>                                         parse state, <a href="#7.19.2">7.19.2</a>
-octal digit, <a href="#6.4.4.1">6.4.4.1</a>, <a href="#6.4.4.4">6.4.4.4</a>                                   permitted form of initializer, <a href="#6.6">6.6</a>
-
-[<a name="p533" href="#p533">page 533</a>] (<a href="#Contents">Contents</a>)
-
-perror function, <a href="#7.19.10.4">7.19.10.4</a>                                    PRIcPTR macros, <a href="#7.8.1">7.8.1</a>
-phase angle, complex, <a href="#7.3.9.1">7.3.9.1</a>                                 primary expression, <a href="#6.5.1">6.5.1</a>
-physical source lines, <a href="#5.1.1.2">5.1.1.2</a>                                printf function, <a href="#7.19.1">7.19.1</a>, <a href="#7.19.6.3">7.19.6.3</a>, <a href="#7.19.6.10">7.19.6.10</a>
-placemarker, <a href="#6.10.3.3">6.10.3.3</a>                                         printing character, <a href="#5.2.2">5.2.2</a>, <a href="#7.4">7.4</a>, <a href="#7.4.1.8">7.4.1.8</a>
-plus operator, unary, <a href="#6.5.3.3">6.5.3.3</a>                                 printing wide character, <a href="#7.25.2">7.25.2</a>
-pointer arithmetic, <a href="#6.5.6">6.5.6</a>                                     program diagnostics, <a href="#7.2.1">7.2.1</a>
-pointer comparison, <a href="#6.5.8">6.5.8</a>                                     program execution, <a href="#5.1.2.2.2">5.1.2.2.2</a>, <a href="#5.1.2.3">5.1.2.3</a>
-pointer declarator, <a href="#6.7.5.1">6.7.5.1</a>                                   program file, <a href="#5.1.1.1">5.1.1.1</a>
-pointer operator (-&gt;), <a href="#6.5.2.3">6.5.2.3</a>                                program image, <a href="#5.1.1.2">5.1.1.2</a>
-pointer to function, <a href="#6.5.2.2">6.5.2.2</a>                                  program name (argv[0]), <a href="#5.1.2.2.1">5.1.2.2.1</a>
-pointer type, <a href="#6.2.5">6.2.5</a>                                           program parameters, <a href="#5.1.2.2.1">5.1.2.2.1</a>
-pointer type conversion, <a href="#6.3.2.1">6.3.2.1</a>, <a href="#6.3.2.3">6.3.2.3</a>                     program startup, <a href="#5.1.2">5.1.2</a>, <a href="#5.1.2.1">5.1.2.1</a>, <a href="#5.1.2.2.1">5.1.2.2.1</a>
-pointer, null, <a href="#6.3.2.3">6.3.2.3</a>                                        program structure, <a href="#5.1.1.1">5.1.1.1</a>
-portability, <a href="#4">4</a>, <a href="#J">J</a>                                             program termination, <a href="#5.1.2">5.1.2</a>, <a href="#5.1.2.1">5.1.2.1</a>, <a href="#5.1.2.2.3">5.1.2.2.3</a>,
-position indicator, file, see file position indicator                 <a href="#5.1.2.3">5.1.2.3</a>
-positive difference, <a href="#7.12.12.1">7.12.12.1</a>                                program, conforming, <a href="#4">4</a>
-positive difference functions, <a href="#7.12.12">7.12.12</a>, <a href="#F.9.9">F.9.9</a>                 program, strictly conforming, <a href="#4">4</a>
-postfix decrement operator (--), <a href="#6.3.2.1">6.3.2.1</a>, <a href="#6.5.2.4">6.5.2.4</a>              promotions
-postfix expressions, <a href="#6.5.2">6.5.2</a>                                        default argument, <a href="#6.5.2.2">6.5.2.2</a>
-postfix increment operator (++), <a href="#6.3.2.1">6.3.2.1</a>, <a href="#6.5.2.4">6.5.2.4</a>                 integer, <a href="#5.1.2.3">5.1.2.3</a>, <a href="#6.3.1.1">6.3.1.1</a>
-pow functions, <a href="#7.12.7.4">7.12.7.4</a>, <a href="#F.9.4.4">F.9.4.4</a>                              prototype, see function prototype
-pow type-generic macro, <a href="#7.22">7.22</a>                                  pseudo-random sequence functions, <a href="#7.20.2">7.20.2</a>
-power functions                                               PTRDIFF_MAX macro, <a href="#7.18.3">7.18.3</a>
-  complex, <a href="#7.3.8">7.3.8</a>, <a href="#G.6.4">G.6.4</a>                                       PTRDIFF_MIN macro, <a href="#7.18.3">7.18.3</a>
-  real, <a href="#7.12.7">7.12.7</a>, <a href="#F.9.4">F.9.4</a>                                         ptrdiff_t type, <a href="#7.17">7.17</a>, <a href="#7.18.3">7.18.3</a>, <a href="#7.19.6.1">7.19.6.1</a>,
-pp-number, <a href="#6.4.8">6.4.8</a>                                                    <a href="#7.19.6.2">7.19.6.2</a>, <a href="#7.24.2.1">7.24.2.1</a>, <a href="#7.24.2.2">7.24.2.2</a>
-pragma operator, <a href="#6.10.9">6.10.9</a>                                       punctuators, <a href="#6.4.6">6.4.6</a>
-pragma preprocessing directive, <a href="#6.10.6">6.10.6</a>, <a href="#6.11.8">6.11.8</a>                putc function, <a href="#7.19.1">7.19.1</a>, <a href="#7.19.7.8">7.19.7.8</a>, <a href="#7.19.7.9">7.19.7.9</a>
-precedence of operators, <a href="#6.5">6.5</a>                                  putchar function, <a href="#7.19.1">7.19.1</a>, <a href="#7.19.7.9">7.19.7.9</a>
-precedence of syntax rules, <a href="#5.1.1.2">5.1.1.2</a>                           puts function, <a href="#7.19.1">7.19.1</a>, <a href="#7.19.7.10">7.19.7.10</a>
-precision, <a href="#6.2.6.2">6.2.6.2</a>, <a href="#6.3.1.1">6.3.1.1</a>, <a href="#7.19.6.1">7.19.6.1</a>, <a href="#7.24.2.1">7.24.2.1</a>               putwc function, <a href="#7.19.1">7.19.1</a>, <a href="#7.24.3.8">7.24.3.8</a>, <a href="#7.24.3.9">7.24.3.9</a>
-   excess, <a href="#5.2.4.2.2">5.2.4.2.2</a>, <a href="#6.3.1.5">6.3.1.5</a>, <a href="#6.3.1.8">6.3.1.8</a>, <a href="#6.8.6.4">6.8.6.4</a>               putwchar function, <a href="#7.19.1">7.19.1</a>, <a href="#7.24.3.9">7.24.3.9</a>
-predefined macro names, <a href="#6.10.8">6.10.8</a>, <a href="#6.11.9">6.11.9</a>
-prefix decrement operator (--), <a href="#6.3.2.1">6.3.2.1</a>, <a href="#6.5.3.1">6.5.3.1</a>               qsort function, <a href="#7.20.5">7.20.5</a>, <a href="#7.20.5.2">7.20.5.2</a>
-prefix increment operator (++), <a href="#6.3.2.1">6.3.2.1</a>, <a href="#6.5.3.1">6.5.3.1</a>               qualified types, <a href="#6.2.5">6.2.5</a>
-preprocessing concatenation, <a href="#6.10.3.3">6.10.3.3</a>                         qualified version of type, <a href="#6.2.5">6.2.5</a>
-preprocessing directives, <a href="#5.1.1.2">5.1.1.2</a>, <a href="#6.10">6.10</a>                       question-mark escape sequence (\?), <a href="#6.4.4.4">6.4.4.4</a>
-preprocessing file, <a href="#5.1.1.1">5.1.1.1</a>, <a href="#6.10">6.10</a>                              quiet NaN, <a href="#5.2.4.2.2">5.2.4.2.2</a>
-preprocessing numbers, <a href="#6.4">6.4</a>, <a href="#6.4.8">6.4.8</a>
-preprocessing operators                                       raise function, <a href="#7.14">7.14</a>, <a href="#7.14.1.1">7.14.1.1</a>, <a href="#7.14.2.1">7.14.2.1</a>, <a href="#7.20.4.1">7.20.4.1</a>
-   #, <a href="#6.10.3.2">6.10.3.2</a>                                                rand function, <a href="#7.20">7.20</a>, <a href="#7.20.2.1">7.20.2.1</a>, <a href="#7.20.2.2">7.20.2.2</a>
-   ##, <a href="#6.10.3.3">6.10.3.3</a>                                               RAND_MAX macro, <a href="#7.20">7.20</a>, <a href="#7.20.2.1">7.20.2.1</a>
-   _Pragma, <a href="#5.1.1.2">5.1.1.2</a>, <a href="#6.10.9">6.10.9</a>                                   range
-   defined, <a href="#6.10.1">6.10.1</a>                                              excess, <a href="#5.2.4.2.2">5.2.4.2.2</a>, <a href="#6.3.1.5">6.3.1.5</a>, <a href="#6.3.1.8">6.3.1.8</a>, <a href="#6.8.6.4">6.8.6.4</a>
-preprocessing tokens, <a href="#5.1.1.2">5.1.1.2</a>, <a href="#6.4">6.4</a>, <a href="#6.10">6.10</a>                      range error, <a href="#7.12.1">7.12.1</a>, <a href="#7.12.5.3">7.12.5.3</a>, <a href="#7.12.5.4">7.12.5.4</a>, <a href="#7.12.5.5">7.12.5.5</a>,
-preprocessing translation unit, <a href="#5.1.1.1">5.1.1.1</a>                            <a href="#7.12.6.1">7.12.6.1</a>, <a href="#7.12.6.2">7.12.6.2</a>, <a href="#7.12.6.3">7.12.6.3</a>, <a href="#7.12.6.5">7.12.6.5</a>,
-preprocessor, <a href="#6.10">6.10</a>                                                 <a href="#7.12.6.6">7.12.6.6</a>, <a href="#7.12.6.7">7.12.6.7</a>, <a href="#7.12.6.8">7.12.6.8</a>, <a href="#7.12.6.9">7.12.6.9</a>,
-PRIcFASTN macros, <a href="#7.8.1">7.8.1</a>                                            <a href="#7.12.6.10">7.12.6.10</a>, <a href="#7.12.6.11">7.12.6.11</a>, <a href="#7.12.6.13">7.12.6.13</a>, <a href="#7.12.7.3">7.12.7.3</a>,
-PRIcLEASTN macros, <a href="#7.8.1">7.8.1</a>                                           <a href="#7.12.7.4">7.12.7.4</a>, <a href="#7.12.8.2">7.12.8.2</a>, <a href="#7.12.8.3">7.12.8.3</a>, <a href="#7.12.8.4">7.12.8.4</a>,
-PRIcMAX macros, <a href="#7.8.1">7.8.1</a>                                              <a href="#7.12.9.5">7.12.9.5</a>, <a href="#7.12.9.7">7.12.9.7</a>, <a href="#7.12.11.3">7.12.11.3</a>, <a href="#7.12.12.1">7.12.12.1</a>,
-PRIcN macros, <a href="#7.8.1">7.8.1</a>                                                <a href="#7.12.13.1">7.12.13.1</a>
-
-[<a name="p534" href="#p534">page 534</a>] (<a href="#Contents">Contents</a>)
-
-rank, see integer conversion rank                         same scope, <a href="#6.2.1">6.2.1</a>
-real floating type conversion, <a href="#6.3.1.4">6.3.1.4</a>, <a href="#6.3.1.5">6.3.1.5</a>,           save calling environment function, <a href="#7.13.1">7.13.1</a>
-      <a href="#6.3.1.7">6.3.1.7</a>, <a href="#F.3">F.3</a>, <a href="#F.4">F.4</a>                                   scalar types, <a href="#6.2.5">6.2.5</a>
-real floating types, <a href="#6.2.5">6.2.5</a>                                 scalbln function, <a href="#7.12.6.13">7.12.6.13</a>, <a href="#F.3">F.3</a>, <a href="#F.9.3.13">F.9.3.13</a>
-real type domain, <a href="#6.2.5">6.2.5</a>                                   scalbln type-generic macro, <a href="#7.22">7.22</a>
-real types, <a href="#6.2.5">6.2.5</a>                                         scalbn function, <a href="#7.12.6.13">7.12.6.13</a>, <a href="#F.3">F.3</a>, <a href="#F.9.3.13">F.9.3.13</a>
-real-floating, <a href="#7.12.3">7.12.3</a>                                      scalbn type-generic macro, <a href="#7.22">7.22</a>
-realloc function, <a href="#7.20.3">7.20.3</a>, <a href="#7.20.3.2">7.20.3.2</a>, <a href="#7.20.3.4">7.20.3.4</a>              scanf function, <a href="#7.19.1">7.19.1</a>, <a href="#7.19.6.4">7.19.6.4</a>, <a href="#7.19.6.11">7.19.6.11</a>
-recommended practice, <a href="#3.16">3.16</a>                                scanlist, <a href="#7.19.6.2">7.19.6.2</a>, <a href="#7.24.2.2">7.24.2.2</a>
-recursion, <a href="#6.5.2.2">6.5.2.2</a>                                        scanset, <a href="#7.19.6.2">7.19.6.2</a>, <a href="#7.24.2.2">7.24.2.2</a>
-recursive function call, <a href="#6.5.2.2">6.5.2.2</a>                          SCHAR_MAX macro, <a href="#5.2.4.2.1">5.2.4.2.1</a>
-redefinition of macro, <a href="#6.10.3">6.10.3</a>                              SCHAR_MIN macro, <a href="#5.2.4.2.1">5.2.4.2.1</a>
-reentrancy, <a href="#5.1.2.3">5.1.2.3</a>, <a href="#5.2.3">5.2.3</a>                                SCNcFASTN macros, <a href="#7.8.1">7.8.1</a>
-   library functions, <a href="#7.1.4">7.1.4</a>                               SCNcLEASTN macros, <a href="#7.8.1">7.8.1</a>
-referenced type, <a href="#6.2.5">6.2.5</a>                                    SCNcMAX macros, <a href="#7.8.1">7.8.1</a>
-register storage-class specifier, <a href="#6.7.1">6.7.1</a>, <a href="#6.9">6.9</a>               SCNcN macros, <a href="#7.8.1">7.8.1</a>
-relational expressions, <a href="#6.5.8">6.5.8</a>                             SCNcPTR macros, <a href="#7.8.1">7.8.1</a>
-reliability of data, interrupted, <a href="#5.1.2.3">5.1.2.3</a>                 scope of identifier, <a href="#6.2.1">6.2.1</a>, <a href="#6.9.2">6.9.2</a>
-remainder assignment operator (%=), <a href="#6.5.16.2">6.5.16.2</a>              search functions
-remainder functions, <a href="#7.12.10">7.12.10</a>, <a href="#F.9.7">F.9.7</a>                          string, <a href="#7.21.5">7.21.5</a>
-remainder functions, <a href="#7.12.10.2">7.12.10.2</a>, <a href="#7.12.10.3">7.12.10.3</a>, <a href="#F.3">F.3</a>,              utility, <a href="#7.20.5">7.20.5</a>
-      <a href="#F.9.7.2">F.9.7.2</a>                                                wide string, <a href="#7.24.4.5">7.24.4.5</a>
-remainder operator (%), <a href="#6.5.5">6.5.5</a>                             SEEK_CUR macro, <a href="#7.19.1">7.19.1</a>, <a href="#7.19.9.2">7.19.9.2</a>
-remainder type-generic macro, <a href="#7.22">7.22</a>                        SEEK_END macro, <a href="#7.19.1">7.19.1</a>, <a href="#7.19.9.2">7.19.9.2</a>
-remove function, <a href="#7.19.4.1">7.19.4.1</a>, <a href="#7.19.4.4">7.19.4.4</a>                       SEEK_SET macro, <a href="#7.19.1">7.19.1</a>, <a href="#7.19.9.2">7.19.9.2</a>
-remquo functions, <a href="#7.12.10.3">7.12.10.3</a>, <a href="#F.3">F.3</a>, <a href="#F.9.7.3">F.9.7.3</a>                 selection statements, <a href="#6.8.4">6.8.4</a>
-remquo type-generic macro, <a href="#7.22">7.22</a>                           self-referential structure, <a href="#6.7.2.3">6.7.2.3</a>
-rename function, <a href="#7.19.4.2">7.19.4.2</a>                                 semicolon punctuator (;), <a href="#6.7">6.7</a>, <a href="#6.7.2.1">6.7.2.1</a>, <a href="#6.8.3">6.8.3</a>,
-representations of types, <a href="#6.2.6">6.2.6</a>                                 <a href="#6.8.5">6.8.5</a>, <a href="#6.8.6">6.8.6</a>
-   pointer, <a href="#6.2.5">6.2.5</a>                                         separate compilation, <a href="#5.1.1.1">5.1.1.1</a>
-rescanning and replacement, <a href="#6.10.3.4">6.10.3.4</a>                      separate translation, <a href="#5.1.1.1">5.1.1.1</a>
-reserved identifiers, <a href="#6.4.1">6.4.1</a>, <a href="#7.1.3">7.1.3</a>                         sequence points, <a href="#5.1.2.3">5.1.2.3</a>, <a href="#6.5">6.5</a>, <a href="#6.8">6.8</a>, <a href="#7.1.4">7.1.4</a>, <a href="#7.19.6">7.19.6</a>,
-restartable multibyte/wide character conversion                 <a href="#7.20.5">7.20.5</a>, <a href="#7.24.2">7.24.2</a>, <a href="#C">C</a>
-      functions, <a href="#7.24.6.3">7.24.6.3</a>                                 sequencing of statements, <a href="#6.8">6.8</a>
-restartable multibyte/wide string conversion              setbuf function, <a href="#7.19.3">7.19.3</a>, <a href="#7.19.5.1">7.19.5.1</a>, <a href="#7.19.5.5">7.19.5.5</a>
-      functions, <a href="#7.24.6.4">7.24.6.4</a>                                 setjmp macro, <a href="#7.1.3">7.1.3</a>, <a href="#7.13.1.1">7.13.1.1</a>, <a href="#7.13.2.1">7.13.2.1</a>
-restore calling environment function, <a href="#7.13.2">7.13.2</a>              setjmp.h header, <a href="#7.13">7.13</a>
-restrict type qualifier, <a href="#6.7.3">6.7.3</a>, <a href="#6.7.3.1">6.7.3.1</a>                    setlocale function, <a href="#7.11.1.1">7.11.1.1</a>, <a href="#7.11.2.1">7.11.2.1</a>
-restrict-qualified type, <a href="#6.2.5">6.2.5</a>, <a href="#6.7.3">6.7.3</a>                      setvbuf function, <a href="#7.19.1">7.19.1</a>, <a href="#7.19.3">7.19.3</a>, <a href="#7.19.5.1">7.19.5.1</a>,
-return statement, <a href="#6.8.6.4">6.8.6.4</a>                                       <a href="#7.19.5.5">7.19.5.5</a>, <a href="#7.19.5.6">7.19.5.6</a>
-rewind function, <a href="#7.19.5.3">7.19.5.3</a>, <a href="#7.19.7.11">7.19.7.11</a>, <a href="#7.19.9.5">7.19.9.5</a>,           shall, <a href="#4">4</a>
-      <a href="#7.24.3.10">7.24.3.10</a>                                           shift expressions, <a href="#6.5.7">6.5.7</a>
-right-shift assignment operator (&gt;&gt;=), <a href="#6.5.16.2">6.5.16.2</a>           shift sequence, <a href="#7.1.1">7.1.1</a>
-right-shift operator (&gt;&gt;), <a href="#6.5.7">6.5.7</a>                          shift states, <a href="#5.2.1.2">5.2.1.2</a>
-rint functions, <a href="#7.12.9.4">7.12.9.4</a>, <a href="#F.3">F.3</a>, <a href="#F.9.6.4">F.9.6.4</a>                    short identifier, character, <a href="#5.2.4.1">5.2.4.1</a>, <a href="#6.4.3">6.4.3</a>
-rint type-generic macro, <a href="#7.22">7.22</a>                             short int type, <a href="#6.2.5">6.2.5</a>, <a href="#6.3.1.1">6.3.1.1</a>, <a href="#6.7.2">6.7.2</a>, <a href="#7.19.6.1">7.19.6.1</a>,
-round functions, <a href="#7.12.9.6">7.12.9.6</a>, <a href="#F.9.6.6">F.9.6.6</a>                              <a href="#7.19.6.2">7.19.6.2</a>, <a href="#7.24.2.1">7.24.2.1</a>, <a href="#7.24.2.2">7.24.2.2</a>
-round type-generic macro, <a href="#7.22">7.22</a>                            short int type conversion, <a href="#6.3.1.1">6.3.1.1</a>, <a href="#6.3.1.3">6.3.1.3</a>,
-rounding mode, floating point, <a href="#5.2.4.2.2">5.2.4.2.2</a>                         <a href="#6.3.1.4">6.3.1.4</a>, <a href="#6.3.1.8">6.3.1.8</a>
-rvalue, <a href="#6.3.2.1">6.3.2.1</a>                                           SHRT_MAX macro, <a href="#5.2.4.2.1">5.2.4.2.1</a>
-                                                          SHRT_MIN macro, <a href="#5.2.4.2.1">5.2.4.2.1</a>
-
-[<a name="p535" href="#p535">page 535</a>] (<a href="#Contents">Contents</a>)
-
-side effects, <a href="#5.1.2.3">5.1.2.3</a>, <a href="#6.5">6.5</a>                                   source lines, <a href="#5.1.1.2">5.1.1.2</a>
-SIG_ATOMIC_MAX macro, <a href="#7.18.3">7.18.3</a>                                 source text, <a href="#5.1.1.2">5.1.1.2</a>
-SIG_ATOMIC_MIN macro, <a href="#7.18.3">7.18.3</a>                                 space character (' '), <a href="#5.1.1.2">5.1.1.2</a>, <a href="#5.2.1">5.2.1</a>, <a href="#6.4">6.4</a>, <a href="#7.4.1.3">7.4.1.3</a>,
-sig_atomic_t type, <a href="#7.14">7.14</a>, <a href="#7.14.1.1">7.14.1.1</a>, <a href="#7.18.3">7.18.3</a>                         <a href="#7.4.1.10">7.4.1.10</a>, <a href="#7.25.2.1.3">7.25.2.1.3</a>
-SIG_DFL macro, <a href="#7.14">7.14</a>, <a href="#7.14.1.1">7.14.1.1</a>                                sprintf function, <a href="#7.19.6.6">7.19.6.6</a>, <a href="#7.19.6.13">7.19.6.13</a>
-SIG_ERR macro, <a href="#7.14">7.14</a>, <a href="#7.14.1.1">7.14.1.1</a>                                sqrt functions, <a href="#7.12.7.5">7.12.7.5</a>, <a href="#F.3">F.3</a>, <a href="#F.9.4.5">F.9.4.5</a>
-SIG_IGN macro, <a href="#7.14">7.14</a>, <a href="#7.14.1.1">7.14.1.1</a>                                sqrt type-generic macro, <a href="#7.22">7.22</a>
-SIGABRT macro, <a href="#7.14">7.14</a>, <a href="#7.20.4.1">7.20.4.1</a>                                srand function, <a href="#7.20.2.2">7.20.2.2</a>
-SIGFPE macro, <a href="#7.14">7.14</a>, <a href="#7.14.1.1">7.14.1.1</a>, <a href="#J.5.17">J.5.17</a>                         sscanf function, <a href="#7.19.6.7">7.19.6.7</a>, <a href="#7.19.6.14">7.19.6.14</a>
-SIGILL macro, <a href="#7.14">7.14</a>, <a href="#7.14.1.1">7.14.1.1</a>                                 standard error stream, <a href="#7.19.1">7.19.1</a>, <a href="#7.19.3">7.19.3</a>, <a href="#7.19.10.4">7.19.10.4</a>
-SIGINT macro, <a href="#7.14">7.14</a>                                           standard headers, <a href="#4">4</a>, <a href="#7.1.2">7.1.2</a>
-sign and magnitude, <a href="#6.2.6.2">6.2.6.2</a>                                     <a href="#7.2">&lt;assert.h&gt;</a>, <a href="#7.2">7.2</a>, <a href="#B.1">B.1</a>
-sign bit, <a href="#6.2.6.2">6.2.6.2</a>                                               <a href="#7.3">&lt;complex.h&gt;</a>, <a href="#5.2.4.2.2">5.2.4.2.2</a>, <a href="#7.3">7.3</a>, <a href="#7.22">7.22</a>, <a href="#7.26.1">7.26.1</a>,
-signal function, <a href="#7.14.1.1">7.14.1.1</a>, <a href="#7.20.4.4">7.20.4.4</a>                                  <a href="#G.6">G.6</a>, <a href="#J.5.17">J.5.17</a>
-signal handler, <a href="#5.1.2.3">5.1.2.3</a>, <a href="#5.2.3">5.2.3</a>, <a href="#7.14.1.1">7.14.1.1</a>, <a href="#7.14.2.1">7.14.2.1</a>              <a href="#7.4">&lt;ctype.h&gt;</a>, <a href="#7.4">7.4</a>, <a href="#7.26.2">7.26.2</a>
-signal handling functions, <a href="#7.14.1">7.14.1</a>                               <a href="#7.5">&lt;errno.h&gt;</a>, <a href="#7.5">7.5</a>, <a href="#7.26.3">7.26.3</a>
-signal.h header, <a href="#7.14">7.14</a>, <a href="#7.26.6">7.26.6</a>                                   <a href="#7.6">&lt;fenv.h&gt;</a>, <a href="#5.1.2.3">5.1.2.3</a>, <a href="#5.2.4.2.2">5.2.4.2.2</a>, <a href="#7.6">7.6</a>, <a href="#7.12">7.12</a>, <a href="#F">F</a>, <a href="#H">H</a>
-signaling NaN, <a href="#5.2.4.2.2">5.2.4.2.2</a>, <a href="#F.2.1">F.2.1</a>                                 <a href="#7.7">&lt;float.h&gt;</a>, <a href="#4">4</a>, <a href="#5.2.4.2.2">5.2.4.2.2</a>, <a href="#7.7">7.7</a>, <a href="#7.20.1.3">7.20.1.3</a>,
-signals, <a href="#5.1.2.3">5.1.2.3</a>, <a href="#5.2.3">5.2.3</a>, <a href="#7.14.1">7.14.1</a>                                      <a href="#7.24.4.1.1">7.24.4.1.1</a>
-signbit macro, <a href="#7.12.3.6">7.12.3.6</a>, <a href="#F.3">F.3</a>                                    <a href="#7.8">&lt;inttypes.h&gt;</a>, <a href="#7.8">7.8</a>, <a href="#7.26.4">7.26.4</a>
-signed char type, <a href="#6.2.5">6.2.5</a>, <a href="#7.19.6.1">7.19.6.1</a>, <a href="#7.19.6.2">7.19.6.2</a>,                    <a href="#7.9">&lt;iso646.h&gt;</a>, <a href="#4">4</a>, <a href="#7.9">7.9</a>
-     <a href="#7.24.2.1">7.24.2.1</a>, <a href="#7.24.2.2">7.24.2.2</a>                                         <a href="#7.10">&lt;limits.h&gt;</a>, <a href="#4">4</a>, <a href="#5.2.4.2.1">5.2.4.2.1</a>, <a href="#6.2.5">6.2.5</a>, <a href="#7.10">7.10</a>
-signed character, <a href="#6.3.1.1">6.3.1.1</a>                                       <a href="#7.11">&lt;locale.h&gt;</a>, <a href="#7.11">7.11</a>, <a href="#7.26.5">7.26.5</a>
-signed integer types, <a href="#6.2.5">6.2.5</a>, <a href="#6.3.1.3">6.3.1.3</a>, <a href="#6.4.4.1">6.4.4.1</a>                   <a href="#7.12">&lt;math.h&gt;</a>, <a href="#5.2.4.2.2">5.2.4.2.2</a>, <a href="#6.5">6.5</a>, <a href="#7.12">7.12</a>, <a href="#7.22">7.22</a>, <a href="#F">F</a>, <a href="#F.9">F.9</a>,
-signed type conversion, <a href="#6.3.1.1">6.3.1.1</a>, <a href="#6.3.1.3">6.3.1.3</a>, <a href="#6.3.1.4">6.3.1.4</a>,                   <a href="#J.5.17">J.5.17</a>
-     <a href="#6.3.1.8">6.3.1.8</a>                                                    <a href="#7.13">&lt;setjmp.h&gt;</a>, <a href="#7.13">7.13</a>
-signed types, <a href="#6.2.5">6.2.5</a>, <a href="#6.7.2">6.7.2</a>                                      <a href="#7.14">&lt;signal.h&gt;</a>, <a href="#7.14">7.14</a>, <a href="#7.26.6">7.26.6</a>
-significand part, <a href="#6.4.4.2">6.4.4.2</a>                                        <a href="#7.15">&lt;stdarg.h&gt;</a>, <a href="#4">4</a>, <a href="#6.7.5.3">6.7.5.3</a>, <a href="#7.15">7.15</a>
-SIGSEGV macro, <a href="#7.14">7.14</a>, <a href="#7.14.1.1">7.14.1.1</a>                                   <a href="#7.16">&lt;stdbool.h&gt;</a>, <a href="#4">4</a>, <a href="#7.16">7.16</a>, <a href="#7.26.7">7.26.7</a>, <a href="#H">H</a>
-SIGTERM macro, <a href="#7.14">7.14</a>                                             <a href="#7.17">&lt;stddef.h&gt;</a>, <a href="#4">4</a>, <a href="#6.3.2.1">6.3.2.1</a>, <a href="#6.3.2.3">6.3.2.3</a>, <a href="#6.4.4.4">6.4.4.4</a>,
-simple assignment operator (=), <a href="#6.5.16.1">6.5.16.1</a>                             <a href="#6.4.5">6.4.5</a>, <a href="#6.5.3.4">6.5.3.4</a>, <a href="#6.5.6">6.5.6</a>, <a href="#7.17">7.17</a>
-sin functions, <a href="#7.12.4.6">7.12.4.6</a>, <a href="#F.9.1.6">F.9.1.6</a>                                <a href="#7.18">&lt;stdint.h&gt;</a>, <a href="#4">4</a>, <a href="#5.2.4.2">5.2.4.2</a>, <a href="#6.10.1">6.10.1</a>, <a href="#7.8">7.8</a>, <a href="#7.18">7.18</a>,
-sin type-generic macro, <a href="#7.22">7.22</a>, <a href="#G.7">G.7</a>                                    <a href="#7.26.8">7.26.8</a>
-single-byte character, <a href="#3.7.1">3.7.1</a>, <a href="#5.2.1.2">5.2.1.2</a>                           <a href="#7.19">&lt;stdio.h&gt;</a>, <a href="#5.2.4.2.2">5.2.4.2.2</a>, <a href="#7.19">7.19</a>, <a href="#7.26.9">7.26.9</a>, <a href="#F">F</a>
-single-byte/wide character conversion functions,                <a href="#7.20">&lt;stdlib.h&gt;</a>, <a href="#5.2.4.2.2">5.2.4.2.2</a>, <a href="#7.20">7.20</a>, <a href="#7.26.10">7.26.10</a>, <a href="#F">F</a>
-     <a href="#7.24.6.1">7.24.6.1</a>                                                   <a href="#7.21">&lt;string.h&gt;</a>, <a href="#7.21">7.21</a>, <a href="#7.26.11">7.26.11</a>
-single-precision arithmetic, <a href="#5.1.2.3">5.1.2.3</a>                            <a href="#7.22">&lt;tgmath.h&gt;</a>, <a href="#7.22">7.22</a>, <a href="#G.7">G.7</a>
-single-quote escape sequence (\'), <a href="#6.4.4.4">6.4.4.4</a>, <a href="#6.4.5">6.4.5</a>               <a href="#7.23">&lt;time.h&gt;</a>, <a href="#7.23">7.23</a>
-sinh functions, <a href="#7.12.5.5">7.12.5.5</a>, <a href="#F.9.2.5">F.9.2.5</a>                               <a href="#7.24">&lt;wchar.h&gt;</a>, <a href="#5.2.4.2.2">5.2.4.2.2</a>, <a href="#7.19.1">7.19.1</a>, <a href="#7.24">7.24</a>, <a href="#7.26.12">7.26.12</a>,
-sinh type-generic macro, <a href="#7.22">7.22</a>, <a href="#G.7">G.7</a>                                   <a href="#F">F</a>
-SIZE_MAX macro, <a href="#7.18.3">7.18.3</a>                                          <a href="#7.25">&lt;wctype.h&gt;</a>, <a href="#7.25">7.25</a>, <a href="#7.26.13">7.26.13</a>
-size_t type, <a href="#6.5.3.4">6.5.3.4</a>, <a href="#7.17">7.17</a>, <a href="#7.18.3">7.18.3</a>, <a href="#7.19.1">7.19.1</a>,                  standard input stream, <a href="#7.19.1">7.19.1</a>, <a href="#7.19.3">7.19.3</a>
-     <a href="#7.19.6.1">7.19.6.1</a>, <a href="#7.19.6.2">7.19.6.2</a>, <a href="#7.20">7.20</a>, <a href="#7.21.1">7.21.1</a>, <a href="#7.23.1">7.23.1</a>,               standard integer types, <a href="#6.2.5">6.2.5</a>
-     <a href="#7.24.1">7.24.1</a>, <a href="#7.24.2.1">7.24.2.1</a>, <a href="#7.24.2.2">7.24.2.2</a>                              standard output stream, <a href="#7.19.1">7.19.1</a>, <a href="#7.19.3">7.19.3</a>
-sizeof operator, <a href="#6.3.2.1">6.3.2.1</a>, <a href="#6.5.3">6.5.3</a>, <a href="#6.5.3.4">6.5.3.4</a>                     standard signed integer types, <a href="#6.2.5">6.2.5</a>
-snprintf function, <a href="#7.19.6.5">7.19.6.5</a>, <a href="#7.19.6.12">7.19.6.12</a>                       state-dependent encoding, <a href="#5.2.1.2">5.2.1.2</a>, <a href="#7.20.7">7.20.7</a>
-sorting utility functions, <a href="#7.20.5">7.20.5</a>                            statements, <a href="#6.8">6.8</a>
-source character set, <a href="#5.1.1.2">5.1.1.2</a>, <a href="#5.2.1">5.2.1</a>                            break, <a href="#6.8.6.3">6.8.6.3</a>
-source file, <a href="#5.1.1.1">5.1.1.1</a>                                             compound, <a href="#6.8.2">6.8.2</a>
-   name, <a href="#6.10.4">6.10.4</a>, <a href="#6.10.8">6.10.8</a>                                         continue, <a href="#6.8.6.2">6.8.6.2</a>
-source file inclusion, <a href="#6.10.2">6.10.2</a>                                    do, <a href="#6.8.5.2">6.8.5.2</a>
-
-[<a name="p536" href="#p536">page 536</a>] (<a href="#Contents">Contents</a>)
-
-   else, <a href="#6.8.4.1">6.8.4.1</a>                                             strictly conforming program, <a href="#4">4</a>
-   expression, <a href="#6.8.3">6.8.3</a>                                         string, <a href="#7.1.1">7.1.1</a>
-   for, <a href="#6.8.5.3">6.8.5.3</a>                                                 comparison functions, <a href="#7.21.4">7.21.4</a>
-   goto, <a href="#6.8.6.1">6.8.6.1</a>                                                concatenation functions, <a href="#7.21.3">7.21.3</a>
-   if, <a href="#6.8.4.1">6.8.4.1</a>                                                  conversion functions, <a href="#7.11.1.1">7.11.1.1</a>
-   iteration, <a href="#6.8.5">6.8.5</a>                                             copying functions, <a href="#7.21.2">7.21.2</a>
-   jump, <a href="#6.8.6">6.8.6</a>                                                  library function conventions, <a href="#7.21.1">7.21.1</a>
-   labeled, <a href="#6.8.1">6.8.1</a>                                               literal, <a href="#5.1.1.2">5.1.1.2</a>, <a href="#5.2.1">5.2.1</a>, <a href="#6.3.2.1">6.3.2.1</a>, <a href="#6.4.5">6.4.5</a>, <a href="#6.5.1">6.5.1</a>, <a href="#6.7.8">6.7.8</a>
-   null, <a href="#6.8.3">6.8.3</a>                                                  miscellaneous functions, <a href="#7.21.6">7.21.6</a>
-   return, <a href="#6.8.6.4">6.8.6.4</a>                                              numeric conversion functions, <a href="#7.8.2.3">7.8.2.3</a>, <a href="#7.20.1">7.20.1</a>
-   selection, <a href="#6.8.4">6.8.4</a>                                             search functions, <a href="#7.21.5">7.21.5</a>
-   sequencing, <a href="#6.8">6.8</a>                                           string handling header, <a href="#7.21">7.21</a>
-   switch, <a href="#6.8.4.2">6.8.4.2</a>                                           string.h header, <a href="#7.21">7.21</a>, <a href="#7.26.11">7.26.11</a>
-   while, <a href="#6.8.5.1">6.8.5.1</a>                                            stringizing, <a href="#6.10.3.2">6.10.3.2</a>, <a href="#6.10.9">6.10.9</a>
-static storage duration, <a href="#6.2.4">6.2.4</a>                               strlen function, <a href="#7.21.6.3">7.21.6.3</a>
-static storage-class specifier, <a href="#6.2.2">6.2.2</a>, <a href="#6.2.4">6.2.4</a>, <a href="#6.7.1">6.7.1</a>           strncat function, <a href="#7.21.3.2">7.21.3.2</a>
-static, in array declarators, <a href="#6.7.5.2">6.7.5.2</a>, <a href="#6.7.5.3">6.7.5.3</a>               strncmp function, <a href="#7.21.4">7.21.4</a>, <a href="#7.21.4.4">7.21.4.4</a>
-stdarg.h header, <a href="#4">4</a>, <a href="#6.7.5.3">6.7.5.3</a>, <a href="#7.15">7.15</a>                            strncpy function, <a href="#7.21.2.4">7.21.2.4</a>
-stdbool.h header, <a href="#4">4</a>, <a href="#7.16">7.16</a>, <a href="#7.26.7">7.26.7</a>, <a href="#H">H</a>                         strpbrk function, <a href="#7.21.5.4">7.21.5.4</a>
-STDC, <a href="#6.10.6">6.10.6</a>, <a href="#6.11.8">6.11.8</a>                                         strrchr function, <a href="#7.21.5.5">7.21.5.5</a>
-stddef.h header, <a href="#4">4</a>, <a href="#6.3.2.1">6.3.2.1</a>, <a href="#6.3.2.3">6.3.2.3</a>, <a href="#6.4.4.4">6.4.4.4</a>,               strspn function, <a href="#7.21.5.6">7.21.5.6</a>
-      <a href="#6.4.5">6.4.5</a>, <a href="#6.5.3.4">6.5.3.4</a>, <a href="#6.5.6">6.5.6</a>, <a href="#7.17">7.17</a>                            strstr function, <a href="#7.21.5.7">7.21.5.7</a>
-stderr macro, <a href="#7.19.1">7.19.1</a>, <a href="#7.19.2">7.19.2</a>, <a href="#7.19.3">7.19.3</a>                         strtod function, <a href="#7.12.11.2">7.12.11.2</a>, <a href="#7.19.6.2">7.19.6.2</a>, <a href="#7.20.1.3">7.20.1.3</a>,
-stdin macro, <a href="#7.19.1">7.19.1</a>, <a href="#7.19.2">7.19.2</a>, <a href="#7.19.3">7.19.3</a>, <a href="#7.19.6.4">7.19.6.4</a>,                     <a href="#7.24.2.2">7.24.2.2</a>, <a href="#F.3">F.3</a>
-      <a href="#7.19.7.6">7.19.7.6</a>, <a href="#7.19.7.7">7.19.7.7</a>, <a href="#7.24.2.12">7.24.2.12</a>, <a href="#7.24.3.7">7.24.3.7</a>                strtof function, <a href="#7.12.11.2">7.12.11.2</a>, <a href="#7.20.1.3">7.20.1.3</a>, <a href="#F.3">F.3</a>
-stdint.h header, <a href="#4">4</a>, <a href="#5.2.4.2">5.2.4.2</a>, <a href="#6.10.1">6.10.1</a>, <a href="#7.8">7.8</a>, <a href="#7.18">7.18</a>,              strtoimax function, <a href="#7.8.2.3">7.8.2.3</a>
-      <a href="#7.26.8">7.26.8</a>                                                 strtok function, <a href="#7.21.5.8">7.21.5.8</a>
-stdio.h header, <a href="#5.2.4.2.2">5.2.4.2.2</a>, <a href="#7.19">7.19</a>, <a href="#7.26.9">7.26.9</a>, <a href="#F">F</a>                   strtol function, <a href="#7.8.2.3">7.8.2.3</a>, <a href="#7.19.6.2">7.19.6.2</a>, <a href="#7.20.1.2">7.20.1.2</a>,
-stdlib.h header, <a href="#5.2.4.2.2">5.2.4.2.2</a>, <a href="#7.20">7.20</a>, <a href="#7.26.10">7.26.10</a>, <a href="#F">F</a>                       <a href="#7.20.1.4">7.20.1.4</a>, <a href="#7.24.2.2">7.24.2.2</a>
-stdout macro, <a href="#7.19.1">7.19.1</a>, <a href="#7.19.2">7.19.2</a>, <a href="#7.19.3">7.19.3</a>, <a href="#7.19.6.3">7.19.6.3</a>,              strtold function, <a href="#7.12.11.2">7.12.11.2</a>, <a href="#7.20.1.3">7.20.1.3</a>, <a href="#F.3">F.3</a>
-      <a href="#7.19.7.9">7.19.7.9</a>, <a href="#7.19.7.10">7.19.7.10</a>, <a href="#7.24.2.11">7.24.2.11</a>, <a href="#7.24.3.9">7.24.3.9</a>               strtoll function, <a href="#7.8.2.3">7.8.2.3</a>, <a href="#7.20.1.2">7.20.1.2</a>, <a href="#7.20.1.4">7.20.1.4</a>
-storage duration, <a href="#6.2.4">6.2.4</a>                                      strtoul function, <a href="#7.8.2.3">7.8.2.3</a>, <a href="#7.19.6.2">7.19.6.2</a>, <a href="#7.20.1.2">7.20.1.2</a>,
-storage order of array, <a href="#6.5.2.1">6.5.2.1</a>                                    <a href="#7.20.1.4">7.20.1.4</a>, <a href="#7.24.2.2">7.24.2.2</a>
-storage-class specifiers, <a href="#6.7.1">6.7.1</a>, <a href="#6.11.5">6.11.5</a>                       strtoull function, <a href="#7.8.2.3">7.8.2.3</a>, <a href="#7.20.1.2">7.20.1.2</a>, <a href="#7.20.1.4">7.20.1.4</a>
-strcat function, <a href="#7.21.3.1">7.21.3.1</a>                                    strtoumax function, <a href="#7.8.2.3">7.8.2.3</a>
-strchr function, <a href="#7.21.5.2">7.21.5.2</a>                                    struct hack, see flexible array member
-strcmp function, <a href="#7.21.4">7.21.4</a>, <a href="#7.21.4.2">7.21.4.2</a>                            structure
-strcoll function, <a href="#7.11.1.1">7.11.1.1</a>, <a href="#7.21.4.3">7.21.4.3</a>, <a href="#7.21.4.5">7.21.4.5</a>                  arrow operator (-&gt;), <a href="#6.5.2.3">6.5.2.3</a>
-strcpy function, <a href="#7.21.2.3">7.21.2.3</a>                                       content, <a href="#6.7.2.3">6.7.2.3</a>
-strcspn function, <a href="#7.21.5.3">7.21.5.3</a>                                      dot operator (.), <a href="#6.5.2.3">6.5.2.3</a>
-streams, <a href="#7.19.2">7.19.2</a>, <a href="#7.20.4.3">7.20.4.3</a>                                       initialization, <a href="#6.7.8">6.7.8</a>
-   fully buffered, <a href="#7.19.3">7.19.3</a>                                       member alignment, <a href="#6.7.2.1">6.7.2.1</a>
-   line buffered, <a href="#7.19.3">7.19.3</a>                                        member name space, <a href="#6.2.3">6.2.3</a>
-   orientation, <a href="#7.19.2">7.19.2</a>                                          member operator (.), <a href="#6.3.2.1">6.3.2.1</a>, <a href="#6.5.2.3">6.5.2.3</a>
-   standard error, <a href="#7.19.1">7.19.1</a>, <a href="#7.19.3">7.19.3</a>                               pointer operator (-&gt;), <a href="#6.5.2.3">6.5.2.3</a>
-   standard input, <a href="#7.19.1">7.19.1</a>, <a href="#7.19.3">7.19.3</a>                               specifier, <a href="#6.7.2.1">6.7.2.1</a>
-   standard output, <a href="#7.19.1">7.19.1</a>, <a href="#7.19.3">7.19.3</a>                              tag, <a href="#6.2.3">6.2.3</a>, <a href="#6.7.2.3">6.7.2.3</a>
-   unbuffered, <a href="#7.19.3">7.19.3</a>                                           type, <a href="#6.2.5">6.2.5</a>, <a href="#6.7.2.1">6.7.2.1</a>
-strerror function, <a href="#7.19.10.4">7.19.10.4</a>, <a href="#7.21.6.2">7.21.6.2</a>                       strxfrm function, <a href="#7.11.1.1">7.11.1.1</a>, <a href="#7.21.4.5">7.21.4.5</a>
-strftime function, <a href="#7.11.1.1">7.11.1.1</a>, <a href="#7.23.3">7.23.3</a>, <a href="#7.23.3.5">7.23.3.5</a>,               subscripting, <a href="#6.5.2.1">6.5.2.1</a>
-      <a href="#7.24.5.1">7.24.5.1</a>                                               subtraction assignment operator (-=), <a href="#6.5.16.2">6.5.16.2</a>
-
-[<a name="p537" href="#p537">page 537</a>] (<a href="#Contents">Contents</a>)
-
-subtraction operator (-), <a href="#6.5.6">6.5.6</a>, <a href="#F.3">F.3</a>, <a href="#G.5.2">G.5.2</a>                   tolower function, <a href="#7.4.2.1">7.4.2.1</a>
-suffix                                                         toupper function, <a href="#7.4.2.2">7.4.2.2</a>
-  floating constant, <a href="#6.4.4.2">6.4.4.2</a>                                   towctrans function, <a href="#7.25.3.2.1">7.25.3.2.1</a>, <a href="#7.25.3.2.2">7.25.3.2.2</a>
-  integer constant, <a href="#6.4.4.1">6.4.4.1</a>                                   towlower function, <a href="#7.25.3.1.1">7.25.3.1.1</a>, <a href="#7.25.3.2.1">7.25.3.2.1</a>
-switch body, <a href="#6.8.4.2">6.8.4.2</a>                                          towupper function, <a href="#7.25.3.1.2">7.25.3.1.2</a>, <a href="#7.25.3.2.1">7.25.3.2.1</a>
-switch case label, <a href="#6.8.1">6.8.1</a>, <a href="#6.8.4.2">6.8.4.2</a>                             translation environment, <a href="#5">5</a>, <a href="#5.1.1">5.1.1</a>
-switch default label, <a href="#6.8.1">6.8.1</a>, <a href="#6.8.4.2">6.8.4.2</a>                          translation limits, <a href="#5.2.4.1">5.2.4.1</a>
-switch statement, <a href="#6.8.1">6.8.1</a>, <a href="#6.8.4.2">6.8.4.2</a>                              translation phases, <a href="#5.1.1.2">5.1.1.2</a>
-swprintf function, <a href="#7.24.2.3">7.24.2.3</a>, <a href="#7.24.2.7">7.24.2.7</a>                         translation unit, <a href="#5.1.1.1">5.1.1.1</a>, <a href="#6.9">6.9</a>
-swscanf function, <a href="#7.24.2.4">7.24.2.4</a>, <a href="#7.24.2.8">7.24.2.8</a>                          trap representation, <a href="#6.2.6.1">6.2.6.1</a>, <a href="#6.2.6.2">6.2.6.2</a>, <a href="#6.3.2.3">6.3.2.3</a>,
-symbols, <a href="#3">3</a>                                                          <a href="#6.5.2.3">6.5.2.3</a>
-syntactic categories, <a href="#6.1">6.1</a>                                     trigonometric functions
-syntax notation, <a href="#6.1">6.1</a>                                             complex, <a href="#7.3.5">7.3.5</a>, <a href="#G.6.1">G.6.1</a>
-syntax rule precedence, <a href="#5.1.1.2">5.1.1.2</a>                                  real, <a href="#7.12.4">7.12.4</a>, <a href="#F.9.1">F.9.1</a>
-syntax summary, language, <a href="#A">A</a>                                   trigraph sequences, <a href="#5.1.1.2">5.1.1.2</a>, <a href="#5.2.1.1">5.2.1.1</a>
-system function, <a href="#7.20.4.6">7.20.4.6</a>                                     true macro, <a href="#7.16">7.16</a>
-                                                              trunc functions, <a href="#7.12.9.8">7.12.9.8</a>, <a href="#F.9.6.8">F.9.6.8</a>
-tab characters, <a href="#5.2.1">5.2.1</a>, <a href="#6.4">6.4</a>                                    trunc type-generic macro, <a href="#7.22">7.22</a>
-tag compatibility, <a href="#6.2.7">6.2.7</a>                                      truncation, <a href="#6.3.1.4">6.3.1.4</a>, <a href="#7.12.9.8">7.12.9.8</a>, <a href="#7.19.3">7.19.3</a>, <a href="#7.19.5.3">7.19.5.3</a>
-tag name space, <a href="#6.2.3">6.2.3</a>                                         truncation toward zero, <a href="#6.5.5">6.5.5</a>
-tags, <a href="#6.7.2.3">6.7.2.3</a>                                                 two's complement, <a href="#6.2.6.2">6.2.6.2</a>, <a href="#7.18.1.1">7.18.1.1</a>
-tan functions, <a href="#7.12.4.7">7.12.4.7</a>, <a href="#F.9.1.7">F.9.1.7</a>                              type category, <a href="#6.2.5">6.2.5</a>
-tan type-generic macro, <a href="#7.22">7.22</a>, <a href="#G.7">G.7</a>                             type conversion, <a href="#6.3">6.3</a>
-tanh functions, <a href="#7.12.5.6">7.12.5.6</a>, <a href="#F.9.2.6">F.9.2.6</a>                             type definitions, <a href="#6.7.7">6.7.7</a>
-tanh type-generic macro, <a href="#7.22">7.22</a>, <a href="#G.7">G.7</a>                            type domain, <a href="#6.2.5">6.2.5</a>, <a href="#G.2">G.2</a>
-tentative definition, <a href="#6.9.2">6.9.2</a>                                    type names, <a href="#6.7.6">6.7.6</a>
-terms, <a href="#3">3</a>                                                      type punning, <a href="#6.5.2.3">6.5.2.3</a>
-text streams, <a href="#7.19.2">7.19.2</a>, <a href="#7.19.7.11">7.19.7.11</a>, <a href="#7.19.9.2">7.19.9.2</a>, <a href="#7.19.9.4">7.19.9.4</a>           type qualifiers, <a href="#6.7.3">6.7.3</a>
-tgamma functions, <a href="#7.12.8.4">7.12.8.4</a>, <a href="#F.9.5.4">F.9.5.4</a>                           type specifiers, <a href="#6.7.2">6.7.2</a>
-tgamma type-generic macro, <a href="#7.22">7.22</a>                               type-generic macro, <a href="#7.22">7.22</a>, <a href="#G.7">G.7</a>
-tgmath.h header, <a href="#7.22">7.22</a>, <a href="#G.7">G.7</a>                                    typedef declaration, <a href="#6.7.7">6.7.7</a>
-time                                                          typedef storage-class specifier, <a href="#6.7.1">6.7.1</a>, <a href="#6.7.7">6.7.7</a>
-   broken down, <a href="#7.23.1">7.23.1</a>, <a href="#7.23.2.3">7.23.2.3</a>, <a href="#7.23.3">7.23.3</a>, <a href="#7.23.3.1">7.23.3.1</a>,           types, <a href="#6.2.5">6.2.5</a>
-         <a href="#7.23.3.3">7.23.3.3</a>, <a href="#7.23.3.4">7.23.3.4</a>, <a href="#7.23.3.5">7.23.3.5</a>                            character, <a href="#6.7.8">6.7.8</a>
-   calendar, <a href="#7.23.1">7.23.1</a>, <a href="#7.23.2.2">7.23.2.2</a>, <a href="#7.23.2.3">7.23.2.3</a>, <a href="#7.23.2.4">7.23.2.4</a>,               compatible, <a href="#6.2.7">6.2.7</a>, <a href="#6.7.2">6.7.2</a>, <a href="#6.7.3">6.7.3</a>, <a href="#6.7.5">6.7.5</a>
-         <a href="#7.23.3.2">7.23.3.2</a>, <a href="#7.23.3.3">7.23.3.3</a>, <a href="#7.23.3.4">7.23.3.4</a>                            complex, <a href="#6.2.5">6.2.5</a>, <a href="#G">G</a>
-   components, <a href="#7.23.1">7.23.1</a>                                            composite, <a href="#6.2.7">6.2.7</a>
-   conversion functions, <a href="#7.23.3">7.23.3</a>                                  const qualified, <a href="#6.7.3">6.7.3</a>
-      wide character, <a href="#7.24.5">7.24.5</a>                                     conversions, <a href="#6.3">6.3</a>
-   local, <a href="#7.23.1">7.23.1</a>                                                 imaginary, <a href="#G">G</a>
-   manipulation functions, <a href="#7.23.2">7.23.2</a>                                restrict qualified, <a href="#6.7.3">6.7.3</a>
-time function, <a href="#7.23.2.4">7.23.2.4</a>                                          volatile qualified, <a href="#6.7.3">6.7.3</a>
-time.h header, <a href="#7.23">7.23</a>
-time_t type, <a href="#7.23.1">7.23.1</a>                                           UCHAR_MAX macro, <a href="#5.2.4.2.1">5.2.4.2.1</a>
-tm structure type, <a href="#7.23.1">7.23.1</a>, <a href="#7.24.1">7.24.1</a>                             UINT_FASTN_MAX macros, <a href="#7.18.2.3">7.18.2.3</a>
-TMP_MAX macro, <a href="#7.19.1">7.19.1</a>, <a href="#7.19.4.3">7.19.4.3</a>, <a href="#7.19.4.4">7.19.4.4</a>                     uint_fastN_t types, <a href="#7.18.1.3">7.18.1.3</a>
-tmpfile function, <a href="#7.19.4.3">7.19.4.3</a>, <a href="#7.20.4.3">7.20.4.3</a>                          UINT_LEASTN_MAX macros, <a href="#7.18.2.2">7.18.2.2</a>
-tmpnam function, <a href="#7.19.1">7.19.1</a>, <a href="#7.19.4.3">7.19.4.3</a>, <a href="#7.19.4.4">7.19.4.4</a>                   uint_leastN_t types, <a href="#7.18.1.2">7.18.1.2</a>
-token, <a href="#5.1.1.2">5.1.1.2</a>, <a href="#6.4">6.4</a>, see also preprocessing tokens            UINT_MAX macro, <a href="#5.2.4.2.1">5.2.4.2.1</a>
-token concatenation, <a href="#6.10.3.3">6.10.3.3</a>                                 UINTMAX_C macro, <a href="#7.18.4.2">7.18.4.2</a>
-token pasting, <a href="#6.10.3.3">6.10.3.3</a>                                       UINTMAX_MAX macro, <a href="#7.8.2.3">7.8.2.3</a>, <a href="#7.8.2.4">7.8.2.4</a>, <a href="#7.18.2.5">7.18.2.5</a>
-
-[<a name="p538" href="#p538">page 538</a>] (<a href="#Contents">Contents</a>)
-
-uintmax_t type, <a href="#7.18.1.5">7.18.1.5</a>, <a href="#7.19.6.1">7.19.6.1</a>, <a href="#7.19.6.2">7.19.6.2</a>,               USHRT_MAX macro, <a href="#5.2.4.2.1">5.2.4.2.1</a>
-     <a href="#7.24.2.1">7.24.2.1</a>, <a href="#7.24.2.2">7.24.2.2</a>                                     usual arithmetic conversions, <a href="#6.3.1.8">6.3.1.8</a>, <a href="#6.5.5">6.5.5</a>, <a href="#6.5.6">6.5.6</a>,
-UINTN_C macros, <a href="#7.18.4.1">7.18.4.1</a>                                          <a href="#6.5.8">6.5.8</a>, <a href="#6.5.9">6.5.9</a>, <a href="#6.5.10">6.5.10</a>, <a href="#6.5.11">6.5.11</a>, <a href="#6.5.12">6.5.12</a>, <a href="#6.5.15">6.5.15</a>
-UINTN_MAX macros, <a href="#7.18.2.1">7.18.2.1</a>                                  utilities, general, <a href="#7.20">7.20</a>
-uintN_t types, <a href="#7.18.1.1">7.18.1.1</a>                                        wide string, <a href="#7.24.4">7.24.4</a>
-UINTPTR_MAX macro, <a href="#7.18.2.4">7.18.2.4</a>
-uintptr_t type, <a href="#7.18.1.4">7.18.1.4</a>                                    va_arg macro, <a href="#7.15">7.15</a>, <a href="#7.15.1">7.15.1</a>, <a href="#7.15.1.1">7.15.1.1</a>, <a href="#7.15.1.2">7.15.1.2</a>,
-ULLONG_MAX macro, <a href="#5.2.4.2.1">5.2.4.2.1</a>, <a href="#7.20.1.4">7.20.1.4</a>,                           <a href="#7.15.1.4">7.15.1.4</a>, <a href="#7.19.6.8">7.19.6.8</a>, <a href="#7.19.6.9">7.19.6.9</a>, <a href="#7.19.6.10">7.19.6.10</a>,
-     <a href="#7.24.4.1.2">7.24.4.1.2</a>                                                  <a href="#7.19.6.11">7.19.6.11</a>, <a href="#7.19.6.12">7.19.6.12</a>, <a href="#7.19.6.13">7.19.6.13</a>, <a href="#7.19.6.14">7.19.6.14</a>,
-ULONG_MAX macro, <a href="#5.2.4.2.1">5.2.4.2.1</a>, <a href="#7.20.1.4">7.20.1.4</a>,                            <a href="#7.24.2.5">7.24.2.5</a>, <a href="#7.24.2.6">7.24.2.6</a>, <a href="#7.24.2.7">7.24.2.7</a>, <a href="#7.24.2.8">7.24.2.8</a>,
-     <a href="#7.24.4.1.2">7.24.4.1.2</a>                                                  <a href="#7.24.2.9">7.24.2.9</a>, <a href="#7.24.2.10">7.24.2.10</a>
-unary arithmetic operators, <a href="#6.5.3.3">6.5.3.3</a>                         va_copy macro, <a href="#7.15">7.15</a>, <a href="#7.15.1">7.15.1</a>, <a href="#7.15.1.1">7.15.1.1</a>, <a href="#7.15.1.2">7.15.1.2</a>,
-unary expression, <a href="#6.5.3">6.5.3</a>                                          <a href="#7.15.1.3">7.15.1.3</a>
-unary minus operator (-), <a href="#6.5.3.3">6.5.3.3</a>, <a href="#F.3">F.3</a>                      va_end macro, <a href="#7.1.3">7.1.3</a>, <a href="#7.15">7.15</a>, <a href="#7.15.1">7.15.1</a>, <a href="#7.15.1.3">7.15.1.3</a>,
-unary operators, <a href="#6.5.3">6.5.3</a>                                           <a href="#7.15.1.4">7.15.1.4</a>, <a href="#7.19.6.8">7.19.6.8</a>, <a href="#7.19.6.9">7.19.6.9</a>, <a href="#7.19.6.10">7.19.6.10</a>,
-unary plus operator (+), <a href="#6.5.3.3">6.5.3.3</a>                                 <a href="#7.19.6.11">7.19.6.11</a>, <a href="#7.19.6.12">7.19.6.12</a>, <a href="#7.19.6.13">7.19.6.13</a>, <a href="#7.19.6.14">7.19.6.14</a>,
-unbuffered stream, <a href="#7.19.3">7.19.3</a>                                        <a href="#7.24.2.5">7.24.2.5</a>, <a href="#7.24.2.6">7.24.2.6</a>, <a href="#7.24.2.7">7.24.2.7</a>, <a href="#7.24.2.8">7.24.2.8</a>,
-undef preprocessing directive, <a href="#6.10.3.5">6.10.3.5</a>, <a href="#7.1.3">7.1.3</a>,                  <a href="#7.24.2.9">7.24.2.9</a>, <a href="#7.24.2.10">7.24.2.10</a>
-     <a href="#7.1.4">7.1.4</a>                                                  va_list type, <a href="#7.15">7.15</a>, <a href="#7.15.1.3">7.15.1.3</a>
-undefined behavior, <a href="#3.4.3">3.4.3</a>, <a href="#4">4</a>, <a href="#J.2">J.2</a>                            va_start macro, <a href="#7.15">7.15</a>, <a href="#7.15.1">7.15.1</a>, <a href="#7.15.1.1">7.15.1.1</a>,
-underscore character, <a href="#6.4.2.1">6.4.2.1</a>                                    <a href="#7.15.1.2">7.15.1.2</a>, <a href="#7.15.1.3">7.15.1.3</a>, <a href="#7.15.1.4">7.15.1.4</a>, <a href="#7.19.6.8">7.19.6.8</a>,
-underscore, leading, in identifier, <a href="#7.1.3">7.1.3</a>                         <a href="#7.19.6.9">7.19.6.9</a>, <a href="#7.19.6.10">7.19.6.10</a>, <a href="#7.19.6.11">7.19.6.11</a>, <a href="#7.19.6.12">7.19.6.12</a>,
-ungetc function, <a href="#7.19.1">7.19.1</a>, <a href="#7.19.7.11">7.19.7.11</a>, <a href="#7.19.9.2">7.19.9.2</a>,                    <a href="#7.19.6.13">7.19.6.13</a>, <a href="#7.19.6.14">7.19.6.14</a>, <a href="#7.24.2.5">7.24.2.5</a>, <a href="#7.24.2.6">7.24.2.6</a>,
-     <a href="#7.19.9.3">7.19.9.3</a>                                                    <a href="#7.24.2.7">7.24.2.7</a>, <a href="#7.24.2.8">7.24.2.8</a>, <a href="#7.24.2.9">7.24.2.9</a>, <a href="#7.24.2.10">7.24.2.10</a>
-ungetwc function, <a href="#7.19.1">7.19.1</a>, <a href="#7.24.3.10">7.24.3.10</a>                         value, <a href="#3.17">3.17</a>
-Unicode required set, <a href="#6.10.8">6.10.8</a>                                value bits, <a href="#6.2.6.2">6.2.6.2</a>
-union                                                       variable arguments, <a href="#6.10.3">6.10.3</a>, <a href="#7.15">7.15</a>
-  arrow operator (-&gt;), <a href="#6.5.2.3">6.5.2.3</a>                              variable arguments header, <a href="#7.15">7.15</a>
-  content, <a href="#6.7.2.3">6.7.2.3</a>                                          variable length array, <a href="#6.7.5">6.7.5</a>, <a href="#6.7.5.2">6.7.5.2</a>
-  dot operator (.), <a href="#6.5.2.3">6.5.2.3</a>                                 variably modified type, <a href="#6.7.5">6.7.5</a>, <a href="#6.7.5.2">6.7.5.2</a>
-  initialization, <a href="#6.7.8">6.7.8</a>                                     vertical-tab character, <a href="#5.2.1">5.2.1</a>, <a href="#6.4">6.4</a>
-  member alignment, <a href="#6.7.2.1">6.7.2.1</a>                                 vertical-tab escape sequence (\v), <a href="#5.2.2">5.2.2</a>, <a href="#6.4.4.4">6.4.4.4</a>,
-  member name space, <a href="#6.2.3">6.2.3</a>                                       <a href="#7.4.1.10">7.4.1.10</a>
-  member operator (.), <a href="#6.3.2.1">6.3.2.1</a>, <a href="#6.5.2.3">6.5.2.3</a>                     vfprintf function, <a href="#7.19.1">7.19.1</a>, <a href="#7.19.6.8">7.19.6.8</a>
-  pointer operator (-&gt;), <a href="#6.5.2.3">6.5.2.3</a>                            vfscanf function, <a href="#7.19.1">7.19.1</a>, <a href="#7.19.6.8">7.19.6.8</a>, <a href="#7.19.6.9">7.19.6.9</a>
-  specifier, <a href="#6.7.2.1">6.7.2.1</a>                                         vfwprintf function, <a href="#7.19.1">7.19.1</a>, <a href="#7.24.2.5">7.24.2.5</a>
-  tag, <a href="#6.2.3">6.2.3</a>, <a href="#6.7.2.3">6.7.2.3</a>                                       vfwscanf function, <a href="#7.19.1">7.19.1</a>, <a href="#7.24.2.6">7.24.2.6</a>, <a href="#7.24.3.10">7.24.3.10</a>
-  type, <a href="#6.2.5">6.2.5</a>, <a href="#6.7.2.1">6.7.2.1</a>                                      visibility of identifier, <a href="#6.2.1">6.2.1</a>
-universal character name, <a href="#6.4.3">6.4.3</a>                             VLA, see variable length array
-unqualified type, <a href="#6.2.5">6.2.5</a>                                      void expression, <a href="#6.3.2.2">6.3.2.2</a>
-unqualified version of type, <a href="#6.2.5">6.2.5</a>                           void function parameter, <a href="#6.7.5.3">6.7.5.3</a>
-unsigned integer suffix, u or <a href="#U">U</a>, <a href="#6.4.4.1">6.4.4.1</a>                     void type, <a href="#6.2.5">6.2.5</a>, <a href="#6.3.2.2">6.3.2.2</a>, <a href="#6.7.2">6.7.2</a>
-unsigned integer types, <a href="#6.2.5">6.2.5</a>, <a href="#6.3.1.3">6.3.1.3</a>, <a href="#6.4.4.1">6.4.4.1</a>             void type conversion, <a href="#6.3.2.2">6.3.2.2</a>
-unsigned type conversion, <a href="#6.3.1.1">6.3.1.1</a>, <a href="#6.3.1.3">6.3.1.3</a>,                 volatile storage, <a href="#5.1.2.3">5.1.2.3</a>
-     <a href="#6.3.1.4">6.3.1.4</a>, <a href="#6.3.1.8">6.3.1.8</a>                                       volatile type qualifier, <a href="#6.7.3">6.7.3</a>
-unsigned types, <a href="#6.2.5">6.2.5</a>, <a href="#6.7.2">6.7.2</a>, <a href="#7.19.6.1">7.19.6.1</a>, <a href="#7.19.6.2">7.19.6.2</a>,           volatile-qualified type, <a href="#6.2.5">6.2.5</a>, <a href="#6.7.3">6.7.3</a>
-     <a href="#7.24.2.1">7.24.2.1</a>, <a href="#7.24.2.2">7.24.2.2</a>                                     vprintf function, <a href="#7.19.1">7.19.1</a>, <a href="#7.19.6.8">7.19.6.8</a>, <a href="#7.19.6.10">7.19.6.10</a>
-unspecified behavior, <a href="#3.4.4">3.4.4</a>, <a href="#4">4</a>, <a href="#J.1">J.1</a>                          vscanf function, <a href="#7.19.1">7.19.1</a>, <a href="#7.19.6.8">7.19.6.8</a>, <a href="#7.19.6.11">7.19.6.11</a>
-unspecified value, <a href="#3.17.3">3.17.3</a>                                    vsnprintf function, <a href="#7.19.6.8">7.19.6.8</a>, <a href="#7.19.6.12">7.19.6.12</a>
-uppercase letter, <a href="#5.2.1">5.2.1</a>                                     vsprintf function, <a href="#7.19.6.8">7.19.6.8</a>, <a href="#7.19.6.13">7.19.6.13</a>
-use of library functions, <a href="#7.1.4">7.1.4</a>                             vsscanf function, <a href="#7.19.6.8">7.19.6.8</a>, <a href="#7.19.6.14">7.19.6.14</a>
-
-[<a name="p539" href="#p539">page 539</a>] (<a href="#Contents">Contents</a>)
-
-vswprintf function, <a href="#7.24.2.7">7.24.2.7</a>                                  wctype.h header, <a href="#7.25">7.25</a>, <a href="#7.26.13">7.26.13</a>
-vswscanf function, <a href="#7.24.2.8">7.24.2.8</a>                                   wctype_t type, <a href="#7.25.1">7.25.1</a>, <a href="#7.25.2.2.2">7.25.2.2.2</a>
-vwprintf function, <a href="#7.19.1">7.19.1</a>, <a href="#7.24.2.9">7.24.2.9</a>                           WEOF macro, <a href="#7.24.1">7.24.1</a>, <a href="#7.24.3.1">7.24.3.1</a>, <a href="#7.24.3.3">7.24.3.3</a>, <a href="#7.24.3.6">7.24.3.6</a>,
-vwscanf function, <a href="#7.19.1">7.19.1</a>, <a href="#7.24.2.10">7.24.2.10</a>, <a href="#7.24.3.10">7.24.3.10</a>                     <a href="#7.24.3.7">7.24.3.7</a>, <a href="#7.24.3.8">7.24.3.8</a>, <a href="#7.24.3.9">7.24.3.9</a>, <a href="#7.24.3.10">7.24.3.10</a>,
-                                                                   <a href="#7.24.6.1.1">7.24.6.1.1</a>, <a href="#7.25.1">7.25.1</a>
-warnings, <a href="#I">I</a>                                                   while statement, <a href="#6.8.5.1">6.8.5.1</a>
-wchar.h header, <a href="#5.2.4.2.2">5.2.4.2.2</a>, <a href="#7.19.1">7.19.1</a>, <a href="#7.24">7.24</a>, <a href="#7.26.12">7.26.12</a>,             white space, <a href="#5.1.1.2">5.1.1.2</a>, <a href="#6.4">6.4</a>, <a href="#6.10">6.10</a>, <a href="#7.4.1.10">7.4.1.10</a>,
-    <a href="#F">F</a>                                                              <a href="#7.25.2.1.10">7.25.2.1.10</a>
-WCHAR_MAX macro, <a href="#7.18.3">7.18.3</a>, <a href="#7.24.1">7.24.1</a>                               white-space characters, <a href="#6.4">6.4</a>
-WCHAR_MIN macro, <a href="#7.18.3">7.18.3</a>, <a href="#7.24.1">7.24.1</a>                               wide character, <a href="#3.7.3">3.7.3</a>
-wchar_t type, <a href="#3.7.3">3.7.3</a>, <a href="#6.4.4.4">6.4.4.4</a>, <a href="#6.4.5">6.4.5</a>, <a href="#6.7.8">6.7.8</a>,                     case mapping functions, <a href="#7.25.3.1">7.25.3.1</a>
-    <a href="#6.10.8">6.10.8</a>, <a href="#7.17">7.17</a>, <a href="#7.18.3">7.18.3</a>, <a href="#7.19.6.1">7.19.6.1</a>, <a href="#7.19.6.2">7.19.6.2</a>, <a href="#7.20">7.20</a>,                extensible, <a href="#7.25.3.2">7.25.3.2</a>
-    <a href="#7.24.1">7.24.1</a>, <a href="#7.24.2.1">7.24.2.1</a>, <a href="#7.24.2.2">7.24.2.2</a>                                  classification functions, <a href="#7.25.2.1">7.25.2.1</a>
-wcrtomb function, <a href="#7.19.3">7.19.3</a>, <a href="#7.19.6.2">7.19.6.2</a>, <a href="#7.24.2.2">7.24.2.2</a>,                      extensible, <a href="#7.25.2.2">7.25.2.2</a>
-    <a href="#7.24.6.3.3">7.24.6.3.3</a>, <a href="#7.24.6.4.2">7.24.6.4.2</a>                                      constant, <a href="#6.4.4.4">6.4.4.4</a>
-wcscat function, <a href="#7.24.4.3.1">7.24.4.3.1</a>                                     formatted input/output functions, <a href="#7.24.2">7.24.2</a>
-wcschr function, <a href="#7.24.4.5.1">7.24.4.5.1</a>                                     input functions, <a href="#7.19.1">7.19.1</a>
-wcscmp function, <a href="#7.24.4.4.1">7.24.4.4.1</a>, <a href="#7.24.4.4.4">7.24.4.4.4</a>                         input/output functions, <a href="#7.19.1">7.19.1</a>, <a href="#7.24.3">7.24.3</a>
-wcscoll function, <a href="#7.24.4.4.2">7.24.4.4.2</a>, <a href="#7.24.4.4.4">7.24.4.4.4</a>                        output functions, <a href="#7.19.1">7.19.1</a>
-wcscpy function, <a href="#7.24.4.2.1">7.24.4.2.1</a>                                     single-byte conversion functions, <a href="#7.24.6.1">7.24.6.1</a>
-wcscspn function, <a href="#7.24.4.5.2">7.24.4.5.2</a>                                  wide string, <a href="#7.1.1">7.1.1</a>
-wcsftime function, <a href="#7.11.1.1">7.11.1.1</a>, <a href="#7.24.5.1">7.24.5.1</a>                         wide string comparison functions, <a href="#7.24.4.4">7.24.4.4</a>
-wcslen function, <a href="#7.24.4.6.1">7.24.4.6.1</a>                                   wide string concatenation functions, <a href="#7.24.4.3">7.24.4.3</a>
-wcsncat function, <a href="#7.24.4.3.2">7.24.4.3.2</a>                                  wide string copying functions, <a href="#7.24.4.2">7.24.4.2</a>
-wcsncmp function, <a href="#7.24.4.4.3">7.24.4.4.3</a>                                  wide string literal, see string literal
-wcsncpy function, <a href="#7.24.4.2.2">7.24.4.2.2</a>                                  wide string miscellaneous functions, <a href="#7.24.4.6">7.24.4.6</a>
-wcspbrk function, <a href="#7.24.4.5.3">7.24.4.5.3</a>                                  wide string numeric conversion functions, <a href="#7.8.2.4">7.8.2.4</a>,
-wcsrchr function, <a href="#7.24.4.5.4">7.24.4.5.4</a>                                       <a href="#7.24.4.1">7.24.4.1</a>
-wcsrtombs function, <a href="#7.24.6.4.2">7.24.6.4.2</a>                                wide string search functions, <a href="#7.24.4.5">7.24.4.5</a>
-wcsspn function, <a href="#7.24.4.5.5">7.24.4.5.5</a>                                   wide-oriented stream, <a href="#7.19.2">7.19.2</a>
-wcsstr function, <a href="#7.24.4.5.6">7.24.4.5.6</a>                                   width, <a href="#6.2.6.2">6.2.6.2</a>
-wcstod function, <a href="#7.19.6.2">7.19.6.2</a>, <a href="#7.24.2.2">7.24.2.2</a>                           WINT_MAX macro, <a href="#7.18.3">7.18.3</a>
-wcstod function, <a href="#7.24.4.1.1">7.24.4.1.1</a>                                   WINT_MIN macro, <a href="#7.18.3">7.18.3</a>
-wcstof function, <a href="#7.24.4.1.1">7.24.4.1.1</a>                                   wint_t type, <a href="#7.18.3">7.18.3</a>, <a href="#7.19.6.1">7.19.6.1</a>, <a href="#7.24.1">7.24.1</a>, <a href="#7.24.2.1">7.24.2.1</a>,
-wcstoimax function, <a href="#7.8.2.4">7.8.2.4</a>                                        <a href="#7.25.1">7.25.1</a>
-wcstok function, <a href="#7.24.4.5.7">7.24.4.5.7</a>                                   wmemchr function, <a href="#7.24.4.5.8">7.24.4.5.8</a>
-wcstol function, <a href="#7.8.2.4">7.8.2.4</a>, <a href="#7.19.6.2">7.19.6.2</a>, <a href="#7.24.2.2">7.24.2.2</a>,                 wmemcmp function, <a href="#7.24.4.4.5">7.24.4.4.5</a>
-    <a href="#7.24.4.1.2">7.24.4.1.2</a>                                                wmemcpy function, <a href="#7.24.4.2.3">7.24.4.2.3</a>
-wcstold function, <a href="#7.24.4.1.1">7.24.4.1.1</a>                                  wmemmove function, <a href="#7.24.4.2.4">7.24.4.2.4</a>
-wcstoll function, <a href="#7.8.2.4">7.8.2.4</a>, <a href="#7.24.4.1.2">7.24.4.1.2</a>                         wmemset function, <a href="#7.24.4.6.2">7.24.4.6.2</a>
-wcstombs function, <a href="#7.20.8.2">7.20.8.2</a>, <a href="#7.24.6.4">7.24.6.4</a>                         wprintf function, <a href="#7.19.1">7.19.1</a>, <a href="#7.24.2.9">7.24.2.9</a>, <a href="#7.24.2.11">7.24.2.11</a>
-wcstoul function, <a href="#7.8.2.4">7.8.2.4</a>, <a href="#7.19.6.2">7.19.6.2</a>, <a href="#7.24.2.2">7.24.2.2</a>,                wscanf function, <a href="#7.19.1">7.19.1</a>, <a href="#7.24.2.10">7.24.2.10</a>, <a href="#7.24.2.12">7.24.2.12</a>,
-    <a href="#7.24.4.1.2">7.24.4.1.2</a>                                                     <a href="#7.24.3.10">7.24.3.10</a>
-wcstoull function, <a href="#7.8.2.4">7.8.2.4</a>, <a href="#7.24.4.1.2">7.24.4.1.2</a>
-wcstoumax function, <a href="#7.8.2.4">7.8.2.4</a>                                   xor macro, <a href="#7.9">7.9</a>
-wcsxfrm function, <a href="#7.24.4.4.4">7.24.4.4.4</a>                                  xor_eq macro, <a href="#7.9">7.9</a>
-wctob function, <a href="#7.24.6.1.2">7.24.6.1.2</a>, <a href="#7.25.2.1">7.25.2.1</a>
-wctomb function, <a href="#7.20.7.3">7.20.7.3</a>, <a href="#7.20.8.2">7.20.8.2</a>, <a href="#7.24.6.3">7.24.6.3</a>
-wctrans function, <a href="#7.25.3.2.1">7.25.3.2.1</a>, <a href="#7.25.3.2.2">7.25.3.2.2</a>
-wctrans_t type, <a href="#7.25.1">7.25.1</a>, <a href="#7.25.3.2.2">7.25.3.2.2</a>
-wctype function, <a href="#7.25.2.2.1">7.25.2.2.1</a>, <a href="#7.25.2.2.2">7.25.2.2.2</a>
-
-[<a name="p540" href="#p540">page 540</a>] (<a href="#Contents">Contents</a>)
-</pre></body></html>
+             feupdateenv(&amp;save_env);
+             return result;
+        }
+</pre>
+ The round functions may, but are not required to, raise the ''inexact'' floating-point
+ exception for non-integer numeric arguments, as this implementation does.
+
+<h5><a name="F.9.6.7" href="#F.9.6.7">F.9.6.7 The lround and llround functions</a></h5>
+<p><!--para 1 -->
+ The lround and llround functions differ from the lrint and llrint functions
+ with the default rounding direction just in that the lround and llround functions
+ round halfway cases away from zero and need not raise the ''inexact'' floating-point
+ exception for non-integer arguments that round to within the range of the return type.
+
+<h5><a name="F.9.6.8" href="#F.9.6.8">F.9.6.8 The trunc functions</a></h5>
+<p><!--para 1 -->
+ The trunc functions use IEC 60559 rounding toward zero (regardless of the current
+ rounding direction).
+<ul>
+<li>  trunc((+-)0) returns (+-)0.
+<li>  trunc((+-)(inf)) returns (+-)(inf).
+<!--page 477 -->
+</ul>
+
+<h4><a name="F.9.7" href="#F.9.7">F.9.7 Remainder functions</a></h4>
+
+<h5><a name="F.9.7.1" href="#F.9.7.1">F.9.7.1 The fmod functions</a></h5>
+<p><!--para 1 -->
+<ul>
+<li>  fmod((+-)0, y) returns (+-)0 for y not zero.
+<li>  fmod(x, y) returns a NaN and raises the ''invalid'' floating-point exception for x
+ infinite or y zero.
+<li>  fmod(x, (+-)(inf)) returns x for x not infinite.
+</ul>
+<p><!--para 2 -->
+ The double version of fmod behaves as though implemented by
+<pre>
+        #include <a href="#7.12">&lt;math.h&gt;</a>
+        #include <a href="#7.6">&lt;fenv.h&gt;</a>
+        #pragma STDC FENV_ACCESS ON
+        double fmod(double x, double y)
+        {
+             double result;
+             result = remainder(fabs(x), (y = fabs(y)));
+             if (signbit(result)) result += y;
+             return copysign(result, x);
+        }
+</pre>
+
+<h5><a name="F.9.7.2" href="#F.9.7.2">F.9.7.2 The remainder functions</a></h5>
+<p><!--para 1 -->
+ The remainder functions are fully specified as a basic arithmetic operation in
+ IEC 60559.
+
+<h5><a name="F.9.7.3" href="#F.9.7.3">F.9.7.3 The remquo functions</a></h5>
+<p><!--para 1 -->
+ The remquo functions follow the specifications for the remainder functions. They
+ have no further specifications special to IEC 60559 implementations.
+
+<h4><a name="F.9.8" href="#F.9.8">F.9.8 Manipulation functions</a></h4>
+
+<h5><a name="F.9.8.1" href="#F.9.8.1">F.9.8.1 The copysign functions</a></h5>
+<p><!--para 1 -->
+ copysign is specified in the Appendix to IEC 60559.
+
+<h5><a name="F.9.8.2" href="#F.9.8.2">F.9.8.2 The nan functions</a></h5>
+<p><!--para 1 -->
+ All IEC 60559 implementations support quiet NaNs, in all floating formats.
+<!--page 478 -->
+
+<h5><a name="F.9.8.3" href="#F.9.8.3">F.9.8.3 The nextafter functions</a></h5>
+<p><!--para 1 -->
+<ul>
+<li>  nextafter(x, y) raises the ''overflow'' and ''inexact'' floating-point exceptions
+ for x finite and the function value infinite.
+<li>  nextafter(x, y) raises the ''underflow'' and ''inexact'' floating-point
+ exceptions for the function value subnormal or zero and x != y.
+</ul>
+
+<h5><a name="F.9.8.4" href="#F.9.8.4">F.9.8.4 The nexttoward functions</a></h5>
+<p><!--para 1 -->
+ No additional requirements beyond those on nextafter.
+
+<h4><a name="F.9.9" href="#F.9.9">F.9.9 Maximum, minimum, and positive difference functions</a></h4>
+
+<h5><a name="F.9.9.1" href="#F.9.9.1">F.9.9.1 The fdim functions</a></h5>
+<p><!--para 1 -->
+ No additional requirements.
+
+<h5><a name="F.9.9.2" href="#F.9.9.2">F.9.9.2 The fmax functions</a></h5>
+<p><!--para 1 -->
+ If just one argument is a NaN, the fmax functions return the other argument (if both
+ arguments are NaNs, the functions return a NaN).
+<p><!--para 2 -->
+ The body of the fmax function might be<sup><a href="#note323"><b>323)</b></a></sup>
+<pre>
+        { return (isgreaterequal(x, y) ||
+             isnan(y)) ? x : y; }
+</pre>
+
+<p><b>Footnotes</b>
+<p><small><a name="note323" href="#note323">323)</a> Ideally, fmax would be sensitive to the sign of zero, for example fmax(-0.0, +0.0) would
+ return +0; however, implementation in software might be impractical.
+</small>
+
+<h5><a name="F.9.9.3" href="#F.9.9.3">F.9.9.3 The fmin functions</a></h5>
+<p><!--para 1 -->
+ The fmin functions are analogous to the fmax functions (see <a href="#F.9.9.2">F.9.9.2</a>).
+
+<h4><a name="F.9.10" href="#F.9.10">F.9.10 Floating multiply-add</a></h4>
+
+<h5><a name="F.9.10.1" href="#F.9.10.1">F.9.10.1 The fma functions</a></h5>
+<p><!--para 1 -->
+<ul>
+<li>  fma(x, y, z) computes xy + z, correctly rounded once.
+<li>  fma(x, y, z) returns a NaN and optionally raises the ''invalid'' floating-point
+ exception if one of x and y is infinite, the other is zero, and z is a NaN.
+<li>  fma(x, y, z) returns a NaN and raises the ''invalid'' floating-point exception if
+ one of x and y is infinite, the other is zero, and z is not a NaN.
+<li>  fma(x, y, z) returns a NaN and raises the ''invalid'' floating-point exception if x
+ times y is an exact infinity and z is also an infinity but with the opposite sign.
+<!--page 479 -->
+</ul>
+
+<h2><a name="G" href="#G">Annex G</a></h2>
+<pre>
+                                     (informative)
+               IEC 60559-compatible complex arithmetic
+</pre>
+
+<h3><a name="G.1" href="#G.1">G.1 Introduction</a></h3>
+<p><!--para 1 -->
+ This annex supplements <a href="#F">annex F</a> to specify complex arithmetic for compatibility with
+ IEC 60559 real floating-point arithmetic. Although these specifications have been
+ carefully designed, there is little existing practice to validate the design decisions.
+ Therefore, these specifications are not normative, but should be viewed more as
+ recommended          practice.       An         implementation        that     defines
+ __STDC_IEC_559_COMPLEX__ should conform to the specifications in this annex.
+
+<h3><a name="G.2" href="#G.2">G.2 Types</a></h3>
+<p><!--para 1 -->
+ There is a new keyword _Imaginary, which is used to specify imaginary types. It is
+ used as a type specifier within declaration specifiers in the same way as _Complex is
+ (thus, _Imaginary float is a valid type name).
+<p><!--para 2 -->
+ There are three imaginary types, designated as float _Imaginary, double
+ _Imaginary, and long double _Imaginary. The imaginary types (along with
+ the real floating and complex types) are floating types.
+<p><!--para 3 -->
+ For imaginary types, the corresponding real type is given by deleting the keyword
+ _Imaginary from the type name.
+<p><!--para 4 -->
+ Each imaginary type has the same representation and alignment requirements as the
+ corresponding real type. The value of an object of imaginary type is the value of the real
+ representation times the imaginary unit.
+<p><!--para 5 -->
+ The imaginary type domain comprises the imaginary types.
+
+<h3><a name="G.3" href="#G.3">G.3 Conventions</a></h3>
+<p><!--para 1 -->
+ A complex or imaginary value with at least one infinite part is regarded as an infinity
+ (even if its other part is a NaN). A complex or imaginary value is a finite number if each
+ of its parts is a finite number (neither infinite nor NaN). A complex or imaginary value is
+ a zero if each of its parts is a zero.
+<!--page 480 -->
+
+<h3><a name="G.4" href="#G.4">G.4 Conversions</a></h3>
+
+<h4><a name="G.4.1" href="#G.4.1">G.4.1 Imaginary types</a></h4>
+<p><!--para 1 -->
+ Conversions among imaginary types follow rules analogous to those for real floating
+ types.
+
+<h4><a name="G.4.2" href="#G.4.2">G.4.2 Real and imaginary</a></h4>
+<p><!--para 1 -->
+ When a value of imaginary type is converted to a real type other than _Bool,<sup><a href="#note324"><b>324)</b></a></sup> the
+ result is a positive zero.
+<p><!--para 2 -->
+ When a value of real type is converted to an imaginary type, the result is a positive
+ imaginary zero.
+
+<p><b>Footnotes</b>
+<p><small><a name="note324" href="#note324">324)</a> See <a href="#6.3.1.2">6.3.1.2</a>.
+</small>
+
+<h4><a name="G.4.3" href="#G.4.3">G.4.3 Imaginary and complex</a></h4>
+<p><!--para 1 -->
+ When a value of imaginary type is converted to a complex type, the real part of the
+ complex result value is a positive zero and the imaginary part of the complex result value
+ is determined by the conversion rules for the corresponding real types.
+<p><!--para 2 -->
+ When a value of complex type is converted to an imaginary type, the real part of the
+ complex value is discarded and the value of the imaginary part is converted according to
+ the conversion rules for the corresponding real types.
+
+<h3><a name="G.5" href="#G.5">G.5 Binary operators</a></h3>
+<p><!--para 1 -->
+ The following subclauses supplement <a href="#6.5">6.5</a> in order to specify the type of the result for an
+ operation with an imaginary operand.
+<p><!--para 2 -->
+ For most operand types, the value of the result of a binary operator with an imaginary or
+ complex operand is completely determined, with reference to real arithmetic, by the usual
+ mathematical formula. For some operand types, the usual mathematical formula is
+ problematic because of its treatment of infinities and because of undue overflow or
+ underflow; in these cases the result satisfies certain properties (specified in <a href="#G.5.1">G.5.1</a>), but is
+ not completely determined.
+<!--page 481 -->
+
+<h4><a name="G.5.1" href="#G.5.1">G.5.1 Multiplicative operators</a></h4>
+<p><b>Semantics</b>
+<p><!--para 1 -->
+ If one operand has real type and the other operand has imaginary type, then the result has
+ imaginary type. If both operands have imaginary type, then the result has real type. (If
+ either operand has complex type, then the result has complex type.)
+<p><!--para 2 -->
+ If the operands are not both complex, then the result and floating-point exception
+ behavior of the * operator is defined by the usual mathematical formula:
+<pre>
+        *                  u                   iv                 u + iv
+</pre>
+<pre>
+        x                  xu                i(xv)            (xu) + i(xv)
+</pre>
+<pre>
+        iy               i(yu)                -yv            (-yv) + i(yu)
+</pre>
+<pre>
+        x + iy       (xu) + i(yu)        (-yv) + i(xv)
+</pre>
+<p><!--para 3 -->
+ If the second operand is not complex, then the result and floating-point exception
+ behavior of the / operator is defined by the usual mathematical formula:
+<pre>
+        /                   u                       iv
+</pre>
+<pre>
+        x                  x/u                 i(-x/v)
+</pre>
+<pre>
+        iy               i(y/u)                     y/v
+</pre>
+<pre>
+        x + iy       (x/u) + i(y/u)        (y/v) + i(-x/v)
+</pre>
+<p><!--para 4 -->
+ The * and / operators satisfy the following infinity properties for all real, imaginary, and
+ complex operands:<sup><a href="#note325"><b>325)</b></a></sup>
+<ul>
+<li>  if one operand is an infinity and the other operand is a nonzero finite number or an
+ infinity, then the result of the * operator is an infinity;
+<li>  if the first operand is an infinity and the second operand is a finite number, then the
+ result of the / operator is an infinity;
+<li>  if the first operand is a finite number and the second operand is an infinity, then the
+ result of the / operator is a zero;
+<!--page 482 -->
+<li>  if the first operand is a nonzero finite number or an infinity and the second operand is
+ a zero, then the result of the / operator is an infinity.
+</ul>
+<p><!--para 5 -->
+ If both operands of the * operator are complex or if the second operand of the / operator
+ is complex, the operator raises floating-point exceptions if appropriate for the calculation
+ of the parts of the result, and may raise spurious floating-point exceptions.
+<p><!--para 6 -->
+ EXAMPLE 1 Multiplication of double _Complex operands could be implemented as follows. Note
+ that the imaginary unit I has imaginary type (see <a href="#G.6">G.6</a>).
+<!--page 483 -->
+<pre>
+        #include <a href="#7.12">&lt;math.h&gt;</a>
+        #include <a href="#7.3">&lt;complex.h&gt;</a>
+        /* Multiply z * w ... */
+        double complex _Cmultd(double complex z, double complex w)
+        {
+               #pragma STDC FP_CONTRACT OFF
+               double a, b, c, d, ac, bd, ad, bc, x, y;
+               a = creal(z); b = cimag(z);
+               c = creal(w); d = cimag(w);
+               ac = a * c;       bd = b * d;
+               ad = a * d;       bc = b * c;
+               x = ac - bd; y = ad + bc;
+               if (isnan(x) &amp;&amp; isnan(y)) {
+                       /* Recover infinities that computed as NaN+iNaN ... */
+                       int recalc = 0;
+                       if ( isinf(a) || isinf(b) ) { // z is infinite
+                               /* "Box" the infinity and change NaNs in the other factor to 0 */
+                               a = copysign(isinf(a) ? 1.0 : 0.0, a);
+                               b = copysign(isinf(b) ? 1.0 : 0.0, b);
+                               if (isnan(c)) c = copysign(0.0, c);
+                               if (isnan(d)) d = copysign(0.0, d);
+                               recalc = 1;
+                       }
+                       if ( isinf(c) || isinf(d) ) { // w is infinite
+                               /* "Box" the infinity and change NaNs in the other factor to 0 */
+                               c = copysign(isinf(c) ? 1.0 : 0.0, c);
+                               d = copysign(isinf(d) ? 1.0 : 0.0, d);
+                               if (isnan(a)) a = copysign(0.0, a);
+                               if (isnan(b)) b = copysign(0.0, b);
+                               recalc = 1;
+                       }
+                       if (!recalc &amp;&amp; (isinf(ac) || isinf(bd) ||
+                                              isinf(ad) || isinf(bc))) {
+                               /* Recover infinities from overflow by changing NaNs to 0 ... */
+                               if (isnan(a)) a = copysign(0.0, a);
+                               if (isnan(b)) b = copysign(0.0, b);
+                               if (isnan(c)) c = copysign(0.0, c);
+                               if (isnan(d)) d = copysign(0.0, d);
+                               recalc = 1;
+                       }
+                       if (recalc) {
+                                   x = INFINITY * ( a * c - b * d );
+                                   y = INFINITY * ( a * d + b * c );
+                        }
+                  }
+                  return x + I * y;
+          }
+</pre>
+<p><!--para 7 -->
+ This implementation achieves the required treatment of infinities at the cost of only one isnan test in
+ ordinary (finite) cases. It is less than ideal in that undue overflow and underflow may occur.
+<p><!--para 8 -->
+ EXAMPLE 2      Division of two double _Complex operands could be implemented as follows.
+<!--page 484 -->
+<pre>
+          #include <a href="#7.12">&lt;math.h&gt;</a>
+          #include <a href="#7.3">&lt;complex.h&gt;</a>
+          /* Divide z / w ... */
+          double complex _Cdivd(double complex z, double complex w)
+          {
+                 #pragma STDC FP_CONTRACT OFF
+                 double a, b, c, d, logbw, denom, x, y;
+                 int ilogbw = 0;
+                 a = creal(z); b = cimag(z);
+                 c = creal(w); d = cimag(w);
+                 logbw = logb(fmax(fabs(c), fabs(d)));
+                 if (isfinite(logbw)) {
+                        ilogbw = (int)logbw;
+                        c = scalbn(c, -ilogbw); d = scalbn(d, -ilogbw);
+                 }
+                 denom = c * c + d * d;
+                 x = scalbn((a * c + b * d) / denom, -ilogbw);
+                 y = scalbn((b * c - a * d) / denom, -ilogbw);
+                  /* Recover infinities and zeros that computed as NaN+iNaN;                 */
+                  /* the only cases are nonzero/zero, infinite/finite, and finite/infinite, ... */
+                  if (isnan(x) &amp;&amp; isnan(y)) {
+                        if ((denom == 0.0) &amp;&amp;
+                              (!isnan(a) || !isnan(b))) {
+                              x = copysign(INFINITY, c) * a;
+                              y = copysign(INFINITY, c) * b;
+                        }
+                        else if ((isinf(a) || isinf(b)) &amp;&amp;
+                              isfinite(c) &amp;&amp; isfinite(d)) {
+                              a = copysign(isinf(a) ? 1.0 : 0.0,                        a);
+                              b = copysign(isinf(b) ? 1.0 : 0.0,                        b);
+                              x = INFINITY * ( a * c + b * d );
+                              y = INFINITY * ( b * c - a * d );
+                        }
+                        else if (isinf(logbw) &amp;&amp;
+                              isfinite(a) &amp;&amp; isfinite(b)) {
+                              c = copysign(isinf(c) ? 1.0 : 0.0,                        c);
+                              d = copysign(isinf(d) ? 1.0 : 0.0,                        d);
+                              x = 0.0 * ( a * c + b * d );
+                              y = 0.0 * ( b * c - a * d );
+                        }
+                  }
+                  return x + I * y;
+         }
+</pre>
+<p><!--para 9 -->
+ Scaling the denominator alleviates the main overflow and underflow problem, which is more serious than
+ for multiplication. In the spirit of the multiplication example above, this code does not defend against
+ overflow and underflow in the calculation of the numerator. Scaling with the scalbn function, instead of
+ with division, provides better roundoff characteristics.
+
+<p><b>Footnotes</b>
+<p><small><a name="note325" href="#note325">325)</a> These properties are already implied for those cases covered in the tables, but are required for all cases
+ (at least where the state for CX_LIMITED_RANGE is ''off'').
+</small>
+
+<h4><a name="G.5.2" href="#G.5.2">G.5.2 Additive operators</a></h4>
+<p><b>Semantics</b>
+<p><!--para 1 -->
+ If both operands have imaginary type, then the result has imaginary type. (If one operand
+ has real type and the other operand has imaginary type, or if either operand has complex
+ type, then the result has complex type.)
+<p><!--para 2 -->
+ In all cases the result and floating-point exception behavior of a + or - operator is defined
+ by the usual mathematical formula:
+<pre>
+        + or -              u                       iv                    u + iv
+</pre>
+<pre>
+        x                 x(+-)u                     x (+-) iv              (x (+-) u) (+-) iv
+</pre>
+<pre>
+        iy               (+-)u + iy                 i(y (+-) v)             (+-)u + i(y (+-) v)
+</pre>
+<pre>
+        x + iy         (x (+-) u) + iy            x + i(y (+-) v)        (x (+-) u) + i(y (+-) v)
+</pre>
+
+<h3><a name="G.6" href="#G.6">G.6 Complex arithmetic &lt;complex.h&gt;</a></h3>
+<p><!--para 1 -->
+ The macros
+<pre>
+         imaginary
+</pre>
+ and
+<pre>
+         _Imaginary_I
+</pre>
+ are defined, respectively, as _Imaginary and a constant expression of type const
+ float _Imaginary with the value of the imaginary unit. The macro
+<pre>
+         I
+</pre>
+ is defined to be _Imaginary_I (not _Complex_I as stated in <a href="#7.3">7.3</a>). Notwithstanding
+ the provisions of <a href="#7.1.3">7.1.3</a>, a program may undefine and then perhaps redefine the macro
+ imaginary.
+<p><!--para 2 -->
+ This subclause contains specifications for the <a href="#7.3">&lt;complex.h&gt;</a> functions that are
+ particularly suited to IEC 60559 implementations. For families of functions, the
+ specifications apply to all of the functions even though only the principal function is
+<!--page 485 -->
+ shown. Unless otherwise specified, where the symbol ''(+-)'' occurs in both an argument
+ and the result, the result has the same sign as the argument.
+<p><!--para 3 -->
+ The functions are continuous onto both sides of their branch cuts, taking into account the
+ sign of zero. For example, csqrt(-2 (+-) i0) = (+-)i(sqrt)2.  ???
+<p><!--para 4 -->
+ Since complex and imaginary values are composed of real values, each function may be
+ regarded as computing real values from real values. Except as noted, the functions treat
+ real infinities, NaNs, signed zeros, subnormals, and the floating-point exception flags in a
+ manner consistent with the specifications for real functions in F.9.<sup><a href="#note326"><b>326)</b></a></sup>
+<p><!--para 5 -->
+ The functions cimag, conj, cproj, and creal are fully specified for all
+ implementations, including IEC 60559 ones, in <a href="#7.3.9">7.3.9</a>. These functions raise no floating-
+ point exceptions.
+<p><!--para 6 -->
+ Each of the functions cabs and carg is specified by a formula in terms of a real
+ function (whose special cases are covered in <a href="#F">annex F</a>):
+<pre>
+         cabs(x + iy) = hypot(x, y)
+         carg(x + iy) = atan2(y, x)
+</pre>
+<p><!--para 7 -->
+ Each of the functions casin, catan, ccos, csin, and ctan is specified implicitly by
+ a formula in terms of other complex functions (whose special cases are specified below):
+<pre>
+         casin(z)        =   -i casinh(iz)
+         catan(z)        =   -i catanh(iz)
+         ccos(z)         =   ccosh(iz)
+         csin(z)         =   -i csinh(iz)
+         ctan(z)         =   -i ctanh(iz)
+</pre>
+<p><!--para 8 -->
+ For the other functions, the following subclauses specify behavior for special cases,
+ including treatment of the ''invalid'' and ''divide-by-zero'' floating-point exceptions. For
+ families of functions, the specifications apply to all of the functions even though only the
+ principal function is shown. For a function f satisfying f (conj(z)) = conj( f (z)), the
+ specifications for the upper half-plane imply the specifications for the lower half-plane; if
+ the function f is also either even, f (-z) = f (z), or odd, f (-z) = - f (z), then the
+ specifications for the first quadrant imply the specifications for the other three quadrants.
+<p><!--para 9 -->
+ In the following subclauses, cis(y) is defined as cos(y) + i sin(y).
+<!--page 486 -->
+
+<p><b>Footnotes</b>
+<p><small><a name="note326" href="#note326">326)</a> As noted in <a href="#G.3">G.3</a>, a complex value with at least one infinite part is regarded as an infinity even if its
+ other part is a NaN.
+</small>
+
+<h4><a name="G.6.1" href="#G.6.1">G.6.1 Trigonometric functions</a></h4>
+
+<h5><a name="G.6.1.1" href="#G.6.1.1">G.6.1.1 The cacos functions</a></h5>
+<p><!--para 1 -->
+<ul>
+<li>  cacos(conj(z)) = conj(cacos(z)).
+<li>  cacos((+-)0 + i0) returns pi /2 - i0.
+<li>  cacos((+-)0 + iNaN) returns pi /2 + iNaN.
+<li>  cacos(x + i (inf)) returns pi /2 - i (inf), for finite x.
+<li>  cacos(x + iNaN) returns NaN + iNaN and optionally raises the ''invalid'' floating-
+ point exception, for nonzero finite x.
+<li>  cacos(-(inf) + iy) returns pi - i (inf), for positive-signed finite y.
+<li>  cacos(+(inf) + iy) returns +0 - i (inf), for positive-signed finite y.
+<li>  cacos(-(inf) + i (inf)) returns 3pi /4 - i (inf).
+<li>  cacos(+(inf) + i (inf)) returns pi /4 - i (inf).
+<li>  cacos((+-)(inf) + iNaN) returns NaN (+-) i (inf) (where the sign of the imaginary part of the
+ result is unspecified).
+<li>  cacos(NaN + iy) returns NaN + iNaN and optionally raises the ''invalid'' floating-
+ point exception, for finite y.
+<li>  cacos(NaN + i (inf)) returns NaN - i (inf).
+<li>  cacos(NaN + iNaN) returns NaN + iNaN.
+</ul>
+
+<h4><a name="G.6.2" href="#G.6.2">G.6.2 Hyperbolic functions</a></h4>
+
+<h5><a name="G.6.2.1" href="#G.6.2.1">G.6.2.1 The cacosh functions</a></h5>
+<p><!--para 1 -->
+<ul>
+<li>  cacosh(conj(z)) = conj(cacosh(z)).
+<li>  cacosh((+-)0 + i0) returns +0 + ipi /2.
+<li>  cacosh(x + i (inf)) returns +(inf) + ipi /2, for finite x.
+<li>  cacosh(x + iNaN) returns NaN + iNaN and optionally raises the ''invalid''
+ floating-point exception, for finite x.
+<li>  cacosh(-(inf) + iy) returns +(inf) + ipi , for positive-signed finite y.
+<li>  cacosh(+(inf) + iy) returns +(inf) + i0, for positive-signed finite y.
+<li>  cacosh(-(inf) + i (inf)) returns +(inf) + i3pi /4.
+<li>  cacosh(+(inf) + i (inf)) returns +(inf) + ipi /4.
+<li>  cacosh((+-)(inf) + iNaN) returns +(inf) + iNaN.
+<!--page 487 -->
+<li>  cacosh(NaN + iy) returns NaN + iNaN and optionally raises the ''invalid''
+ floating-point exception, for finite y.
+<li>  cacosh(NaN + i (inf)) returns +(inf) + iNaN.
+<li>  cacosh(NaN + iNaN) returns NaN + iNaN.
+</ul>
+
+<h5><a name="G.6.2.2" href="#G.6.2.2">G.6.2.2 The casinh functions</a></h5>
+<p><!--para 1 -->
+<ul>
+<li>  casinh(conj(z)) = conj(casinh(z)) and casinh is odd.
+<li>  casinh(+0 + i0) returns 0 + i0.
+<li>  casinh(x + i (inf)) returns +(inf) + ipi /2 for positive-signed finite x.
+<li>  casinh(x + iNaN) returns NaN + iNaN and optionally raises the ''invalid''
+ floating-point exception, for finite x.
+<li>  casinh(+(inf) + iy) returns +(inf) + i0 for positive-signed finite y.
+<li>  casinh(+(inf) + i (inf)) returns +(inf) + ipi /4.
+<li>  casinh(+(inf) + iNaN) returns +(inf) + iNaN.
+<li>  casinh(NaN + i0) returns NaN + i0.
+<li>  casinh(NaN + iy) returns NaN + iNaN and optionally raises the ''invalid''
+ floating-point exception, for finite nonzero y.
+<li>  casinh(NaN + i (inf)) returns (+-)(inf) + iNaN (where the sign of the real part of the result
+ is unspecified).
+<li>  casinh(NaN + iNaN) returns NaN + iNaN.
+</ul>
+
+<h5><a name="G.6.2.3" href="#G.6.2.3">G.6.2.3 The catanh functions</a></h5>
+<p><!--para 1 -->
+<ul>
+<li>  catanh(conj(z)) = conj(catanh(z)) and catanh is odd.
+<li>  catanh(+0 + i0) returns +0 + i0.
+<li>  catanh(+0 + iNaN) returns +0 + iNaN.
+<li>  catanh(+1 + i0) returns +(inf) + i0 and raises the ''divide-by-zero'' floating-point
+ exception.
+<li>  catanh(x + i (inf)) returns +0 + ipi /2, for finite positive-signed x.
+<li>  catanh(x + iNaN) returns NaN + iNaN and optionally raises the ''invalid''
+ floating-point exception, for nonzero finite x.
+<li>  catanh(+(inf) + iy) returns +0 + ipi /2, for finite positive-signed y.
+<li>  catanh(+(inf) + i (inf)) returns +0 + ipi /2.
+<li>  catanh(+(inf) + iNaN) returns +0 + iNaN.
+<!--page 488 -->
+<li>  catanh(NaN + iy) returns NaN + iNaN and optionally raises the ''invalid''
+ floating-point exception, for finite y.
+<li>  catanh(NaN + i (inf)) returns (+-)0 + ipi /2 (where the sign of the real part of the result is
+ unspecified).
+<li>  catanh(NaN + iNaN) returns NaN + iNaN.
+</ul>
+
+<h5><a name="G.6.2.4" href="#G.6.2.4">G.6.2.4 The ccosh functions</a></h5>
+<p><!--para 1 -->
+<ul>
+<li>  ccosh(conj(z)) = conj(ccosh(z)) and ccosh is even.
+<li>  ccosh(+0 + i0) returns 1 + i0.
+<li>  ccosh(+0 + i (inf)) returns NaN (+-) i0 (where the sign of the imaginary part of the
+ result is unspecified) and raises the ''invalid'' floating-point exception.
+<li>  ccosh(+0 + iNaN) returns NaN (+-) i0 (where the sign of the imaginary part of the
+ result is unspecified).
+<li>  ccosh(x + i (inf)) returns NaN + iNaN and raises the ''invalid'' floating-point
+ exception, for finite nonzero x.
+<li>  ccosh(x + iNaN) returns NaN + iNaN and optionally raises the ''invalid'' floating-
+ point exception, for finite nonzero x.
+<li>  ccosh(+(inf) + i0) returns +(inf) + i0.
+<li>  ccosh(+(inf) + iy) returns +(inf) cis(y), for finite nonzero y.
+<li>  ccosh(+(inf) + i (inf)) returns (+-)(inf) + iNaN (where the sign of the real part of the result is
+ unspecified) and raises the ''invalid'' floating-point exception.
+<li>  ccosh(+(inf) + iNaN) returns +(inf) + iNaN.
+<li>  ccosh(NaN + i0) returns NaN (+-) i0 (where the sign of the imaginary part of the
+ result is unspecified).
+<li>  ccosh(NaN + iy) returns NaN + iNaN and optionally raises the ''invalid'' floating-
+ point exception, for all nonzero numbers y.
+<li>  ccosh(NaN + iNaN) returns NaN + iNaN.
+</ul>
+
+<h5><a name="G.6.2.5" href="#G.6.2.5">G.6.2.5 The csinh functions</a></h5>
+<p><!--para 1 -->
+<ul>
+<li>  csinh(conj(z)) = conj(csinh(z)) and csinh is odd.
+<li>  csinh(+0 + i0) returns +0 + i0.
+<li>  csinh(+0 + i (inf)) returns (+-)0 + iNaN (where the sign of the real part of the result is
+ unspecified) and raises the ''invalid'' floating-point exception.
+<li>  csinh(+0 + iNaN) returns (+-)0 + iNaN (where the sign of the real part of the result is
+ unspecified).
+<!--page 489 -->
+<li>  csinh(x + i (inf)) returns NaN + iNaN and raises the ''invalid'' floating-point
+ exception, for positive finite x.
+<li>  csinh(x + iNaN) returns NaN + iNaN and optionally raises the ''invalid'' floating-
+ point exception, for finite nonzero x.
+<li>  csinh(+(inf) + i0) returns +(inf) + i0.
+<li>  csinh(+(inf) + iy) returns +(inf) cis(y), for positive finite y.
+<li>  csinh(+(inf) + i (inf)) returns (+-)(inf) + iNaN (where the sign of the real part of the result is
+ unspecified) and raises the ''invalid'' floating-point exception.
+<li>  csinh(+(inf) + iNaN) returns (+-)(inf) + iNaN (where the sign of the real part of the result
+ is unspecified).
+<li>  csinh(NaN + i0) returns NaN + i0.
+<li>  csinh(NaN + iy) returns NaN + iNaN and optionally raises the ''invalid'' floating-
+ point exception, for all nonzero numbers y.
+<li>  csinh(NaN + iNaN) returns NaN + iNaN.
+</ul>
+
+<h5><a name="G.6.2.6" href="#G.6.2.6">G.6.2.6 The ctanh functions</a></h5>
+<p><!--para 1 -->
+<ul>
+<li>  ctanh(conj(z)) = conj(ctanh(z))and ctanh is odd.
+<li>  ctanh(+0 + i0) returns +0 + i0.
+<li>  ctanh(x + i (inf)) returns NaN + iNaN and raises the ''invalid'' floating-point
+ exception, for finite x.
+<li>  ctanh(x + iNaN) returns NaN + iNaN and optionally raises the ''invalid'' floating-
+ point exception, for finite x.
+<li>  ctanh(+(inf) + iy) returns 1 + i0 sin(2y), for positive-signed finite y.
+<li>  ctanh(+(inf) + i (inf)) returns 1 (+-) i0 (where the sign of the imaginary part of the result
+ is unspecified).
+<li>  ctanh(+(inf) + iNaN) returns 1 (+-) i0 (where the sign of the imaginary part of the
+ result is unspecified).
+<li>  ctanh(NaN + i0) returns NaN + i0.
+<li>  ctanh(NaN + iy) returns NaN + iNaN and optionally raises the ''invalid'' floating-
+ point exception, for all nonzero numbers y.
+<li>  ctanh(NaN + iNaN) returns NaN + iNaN.
+<!--page 490 -->
+</ul>
+
+<h4><a name="G.6.3" href="#G.6.3">G.6.3 Exponential and logarithmic functions</a></h4>
+
+<h5><a name="G.6.3.1" href="#G.6.3.1">G.6.3.1 The cexp functions</a></h5>
+<p><!--para 1 -->
+<ul>
+<li>  cexp(conj(z)) = conj(cexp(z)).
+<li>  cexp((+-)0 + i0) returns 1 + i0.
+<li>  cexp(x + i (inf)) returns NaN + iNaN and raises the ''invalid'' floating-point
+ exception, for finite x.
+<li>  cexp(x + iNaN) returns NaN + iNaN and optionally raises the ''invalid'' floating-
+ point exception, for finite x.
+<li>  cexp(+(inf) + i0) returns +(inf) + i0.
+<li>  cexp(-(inf) + iy) returns +0 cis(y), for finite y.
+<li>  cexp(+(inf) + iy) returns +(inf) cis(y), for finite nonzero y.
+<li>  cexp(-(inf) + i (inf)) returns (+-)0 (+-) i0 (where the signs of the real and imaginary parts of
+ the result are unspecified).
+<li>  cexp(+(inf) + i (inf)) returns (+-)(inf) + iNaN and raises the ''invalid'' floating-point
+ exception (where the sign of the real part of the result is unspecified).
+<li>  cexp(-(inf) + iNaN) returns (+-)0 (+-) i0 (where the signs of the real and imaginary parts
+ of the result are unspecified).
+<li>  cexp(+(inf) + iNaN) returns (+-)(inf) + iNaN (where the sign of the real part of the result
+ is unspecified).
+<li>  cexp(NaN + i0) returns NaN + i0.
+<li>  cexp(NaN + iy) returns NaN + iNaN and optionally raises the ''invalid'' floating-
+ point exception, for all nonzero numbers y.
+<li>  cexp(NaN + iNaN) returns NaN + iNaN.
+</ul>
+
+<h5><a name="G.6.3.2" href="#G.6.3.2">G.6.3.2 The clog functions</a></h5>
+<p><!--para 1 -->
+<ul>
+<li>  clog(conj(z)) = conj(clog(z)).
+<li>  clog(-0 + i0) returns -(inf) + ipi and raises the ''divide-by-zero'' floating-point
+ exception.
+<li>  clog(+0 + i0) returns -(inf) + i0 and raises the ''divide-by-zero'' floating-point
+ exception.
+<li>  clog(x + i (inf)) returns +(inf) + ipi /2, for finite x.
+<li>  clog(x + iNaN) returns NaN + iNaN and optionally raises the ''invalid'' floating-
+ point exception, for finite x.
+<!--page 491 -->
+<li>  clog(-(inf) + iy) returns +(inf) + ipi , for finite positive-signed y.
+<li>  clog(+(inf) + iy) returns +(inf) + i0, for finite positive-signed y.
+<li>  clog(-(inf) + i (inf)) returns +(inf) + i3pi /4.
+<li>  clog(+(inf) + i (inf)) returns +(inf) + ipi /4.
+<li>  clog((+-)(inf) + iNaN) returns +(inf) + iNaN.
+<li>  clog(NaN + iy) returns NaN + iNaN and optionally raises the ''invalid'' floating-
+ point exception, for finite y.
+<li>  clog(NaN + i (inf)) returns +(inf) + iNaN.
+<li>  clog(NaN + iNaN) returns NaN + iNaN.
+</ul>
+
+<h4><a name="G.6.4" href="#G.6.4">G.6.4 Power and absolute-value functions</a></h4>
+
+<h5><a name="G.6.4.1" href="#G.6.4.1">G.6.4.1 The cpow functions</a></h5>
+<p><!--para 1 -->
+ The cpow functions raise floating-point exceptions if appropriate for the calculation of
+ the parts of the result, and may raise spurious exceptions.<sup><a href="#note327"><b>327)</b></a></sup>
+
+<p><b>Footnotes</b>
+<p><small><a name="note327" href="#note327">327)</a> This allows cpow( z , c ) to be implemented as cexp(c      clog( z )) without precluding
+ implementations that treat special cases more carefully.
+</small>
+
+<h5><a name="G.6.4.2" href="#G.6.4.2">G.6.4.2 The csqrt functions</a></h5>
+<p><!--para 1 -->
+<ul>
+<li>  csqrt(conj(z)) = conj(csqrt(z)).
+<li>  csqrt((+-)0 + i0) returns +0 + i0.
+<li>  csqrt(x + i (inf)) returns +(inf) + i (inf), for all x (including NaN).
+<li>  csqrt(x + iNaN) returns NaN + iNaN and optionally raises the ''invalid'' floating-
+ point exception, for finite x.
+<li>  csqrt(-(inf) + iy) returns +0 + i (inf), for finite positive-signed y.
+<li>  csqrt(+(inf) + iy) returns +(inf) + i0, for finite positive-signed y.
+<li>  csqrt(-(inf) + iNaN) returns NaN (+-) i (inf) (where the sign of the imaginary part of the
+ result is unspecified).
+<li>  csqrt(+(inf) + iNaN) returns +(inf) + iNaN.
+<li>  csqrt(NaN + iy) returns NaN + iNaN and optionally raises the ''invalid'' floating-
+ point exception, for finite y.
+<li>  csqrt(NaN + iNaN) returns NaN + iNaN.
+<!--page 492 -->
+</ul>
+
+<h3><a name="G.7" href="#G.7">G.7 Type-generic math &lt;tgmath.h&gt;</a></h3>
+<p><!--para 1 -->
+ Type-generic macros that accept complex arguments also accept imaginary arguments. If
+ an argument is imaginary, the macro expands to an expression whose type is real,
+ imaginary, or complex, as appropriate for the particular function: if the argument is
+ imaginary, then the types of cos, cosh, fabs, carg, cimag, and creal are real; the
+ types of sin, tan, sinh, tanh, asin, atan, asinh, and atanh are imaginary; and
+ the types of the others are complex.
+<p><!--para 2 -->
+ Given an imaginary argument, each of the type-generic macros cos, sin, tan, cosh,
+ sinh, tanh, asin, atan, asinh, atanh is specified by a formula in terms of real
+ functions:
+<!--page 493 -->
+<pre>
+        cos(iy)      =   cosh(y)
+        sin(iy)      =   i sinh(y)
+        tan(iy)      =   i tanh(y)
+        cosh(iy)     =   cos(y)
+        sinh(iy)     =   i sin(y)
+        tanh(iy)     =   i tan(y)
+        asin(iy)     =   i asinh(y)
+        atan(iy)     =   i atanh(y)
+        asinh(iy)    =   i asin(y)
+        atanh(iy)    =   i atan(y)
+</pre>
+
+<h2><a name="H" href="#H">Annex H</a></h2>
+<pre>
+                                     (informative)
+                     Language independent arithmetic
+</pre>
+
+<h3><a name="H.1" href="#H.1">H.1 Introduction</a></h3>
+<p><!--para 1 -->
+ This annex documents the extent to which the C language supports the ISO/IEC 10967-1
+ standard for language-independent arithmetic (LIA-1). LIA-1 is more general than
+ IEC 60559 (<a href="#F">annex F</a>) in that it covers integer and diverse floating-point arithmetics.
+
+<h3><a name="H.2" href="#H.2">H.2 Types</a></h3>
+<p><!--para 1 -->
+ The relevant C arithmetic types meet the requirements of LIA-1 types if an
+ implementation adds notification of exceptional arithmetic operations and meets the 1
+ unit in the last place (ULP) accuracy requirement (LIA-1 subclause <a href="#5.2.8">5.2.8</a>).
+
+<h4><a name="H.2.1" href="#H.2.1">H.2.1 Boolean type</a></h4>
+<p><!--para 1 -->
+ The LIA-1 data type Boolean is implemented by the C data type bool with values of
+ true and false, all from <a href="#7.16">&lt;stdbool.h&gt;</a>.
+
+<h4><a name="H.2.2" href="#H.2.2">H.2.2 Integer types</a></h4>
+<p><!--para 1 -->
+ The signed C integer types int, long int, long long int, and the corresponding
+ unsigned types are compatible with LIA-1. If an implementation adds support for the
+ LIA-1 exceptional values ''integer_overflow'' and ''undefined'', then those types are
+ LIA-1 conformant types. C's unsigned integer types are ''modulo'' in the LIA-1 sense
+ in that overflows or out-of-bounds results silently wrap. An implementation that defines
+ signed integer types as also being modulo need not detect integer overflow, in which case,
+ only integer divide-by-zero need be detected.
+<p><!--para 2 -->
+ The parameters for the integer data types can be accessed by the following:
+ maxint        INT_MAX, LONG_MAX, LLONG_MAX, UINT_MAX, ULONG_MAX,
+<pre>
+               ULLONG_MAX
+</pre>
+ minint        INT_MIN, LONG_MIN, LLONG_MIN
+<p><!--para 3 -->
+ The parameter ''bounded'' is always true, and is not provided. The parameter ''minint''
+ is always 0 for the unsigned types, and is not provided for those types.
+<!--page 494 -->
+
+<h5><a name="H.2.2.1" href="#H.2.2.1">H.2.2.1 Integer operations</a></h5>
+<p><!--para 1 -->
+ The integer operations on integer types are the following:
+ addI           x + y
+ subI           x - y
+ mulI           x * y
+ divI, divtI    x / y
+ remI, remtI    x % y
+ negI           -x
+ absI           abs(x), labs(x), llabs(x)
+ eqI            x == y
+ neqI           x != y
+ lssI           x &lt; y
+ leqI           x &lt;= y
+ gtrI           x &gt; y
+ geqI           x &gt;= y
+ where x and y are expressions of the same integer type.
+
+<h4><a name="H.2.3" href="#H.2.3">H.2.3 Floating-point types</a></h4>
+<p><!--para 1 -->
+ The C floating-point types float, double, and long double are compatible with
+ LIA-1. If an implementation adds support for the LIA-1 exceptional values
+ ''underflow'', ''floating_overflow'', and ''"undefined'', then those types are conformant
+ with LIA-1. An implementation that uses IEC 60559 floating-point formats and
+ operations (see <a href="#F">annex F</a>) along with IEC 60559 status flags and traps has LIA-1
+ conformant types.
+
+<h5><a name="H.2.3.1" href="#H.2.3.1">H.2.3.1 Floating-point parameters</a></h5>
+<p><!--para 1 -->
+ The parameters for a floating point data type can be accessed by the following:
+ r              FLT_RADIX
+ p              FLT_MANT_DIG, DBL_MANT_DIG, LDBL_MANT_DIG
+ emax           FLT_MAX_EXP, DBL_MAX_EXP, LDBL_MAX_EXP
+ emin           FLT_MIN_EXP, DBL_MIN_EXP, LDBL_MIN_EXP
+<p><!--para 2 -->
+ The derived constants for the floating point types are accessed by the following:
+<!--page 495 -->
+ fmax          FLT_MAX, DBL_MAX, LDBL_MAX
+ fminN         FLT_MIN, DBL_MIN, LDBL_MIN
+ epsilon       FLT_EPSILON, DBL_EPSILON, LDBL_EPSILON
+ rnd_style     FLT_ROUNDS
+
+<h5><a name="H.2.3.2" href="#H.2.3.2">H.2.3.2 Floating-point operations</a></h5>
+<p><!--para 1 -->
+ The floating-point operations on floating-point types are the following:
+ addF          x + y
+ subF          x - y
+ mulF          x * y
+ divF          x / y
+ negF          -x
+ absF          fabsf(x), fabs(x), fabsl(x)
+ exponentF     1.f+logbf(x), 1.0+logb(x), 1.L+logbl(x)
+ scaleF        scalbnf(x, n), scalbn(x, n), scalbnl(x, n),
+<pre>
+               scalblnf(x, li), scalbln(x, li), scalblnl(x, li)
+</pre>
+ intpartF      modff(x, &amp;y), modf(x, &amp;y), modfl(x, &amp;y)
+ fractpartF    modff(x, &amp;y), modf(x, &amp;y), modfl(x, &amp;y)
+ eqF           x == y
+ neqF          x != y
+ lssF          x &lt; y
+ leqF          x &lt;= y
+ gtrF          x &gt; y
+ geqF          x &gt;= y
+ where x and y are expressions of the same floating point type, n is of type int, and li
+ is of type long int.
+
+<h5><a name="H.2.3.3" href="#H.2.3.3">H.2.3.3 Rounding styles</a></h5>
+<p><!--para 1 -->
+ The C Standard requires all floating types to use the same radix and rounding style, so
+ that only one identifier for each is provided to map to LIA-1.
+<p><!--para 2 -->
+ The FLT_ROUNDS parameter can be used to indicate the LIA-1 rounding styles:
+ truncate      FLT_ROUNDS == 0
+<!--page 496 -->
+ nearest        FLT_ROUNDS == 1
+ other          FLT_ROUNDS != 0 &amp;&amp; FLT_ROUNDS != 1
+ provided that an implementation extends FLT_ROUNDS to cover the rounding style used
+ in all relevant LIA-1 operations, not just addition as in C.
+
+<h4><a name="H.2.4" href="#H.2.4">H.2.4 Type conversions</a></h4>
+<p><!--para 1 -->
+ The LIA-1 type conversions are the following type casts:
+ cvtI' -&gt; I      (int)i, (long int)i, (long long int)i,
+<pre>
+                (unsigned int)i, (unsigned long int)i,
+                (unsigned long long int)i
+</pre>
+ cvtF -&gt; I       (int)x, (long int)x, (long long int)x,
+<pre>
+                (unsigned int)x, (unsigned long int)x,
+                (unsigned long long int)x
+</pre>
+ cvtI -&gt; F       (float)i, (double)i, (long double)i
+ cvtF' -&gt; F      (float)x, (double)x, (long double)x
+<p><!--para 2 -->
+ In the above conversions from floating to integer, the use of (cast)x can be replaced with
+ (cast)round(x), (cast)rint(x), (cast)nearbyint(x), (cast)trunc(x),
+ (cast)ceil(x), or (cast)floor(x). In addition, C's floating-point to integer
+ conversion functions, lrint(), llrint(), lround(), and llround(), can be
+ used. They all meet LIA-1's requirements on floating to integer rounding for in-range
+ values. For out-of-range values, the conversions shall silently wrap for the modulo types.
+<p><!--para 3 -->
+ The fmod() function is useful for doing silent wrapping to unsigned integer types, e.g.,
+ fmod( fabs(rint(x)), 65536.0 ) or (0.0 &lt;= (y = fmod( rint(x),
+ 65536.0 )) ? y : 65536.0 + y) will compute an integer value in the range 0.0
+ to 65535.0 which can then be cast to unsigned short int. But, the
+ remainder() function is not useful for doing silent wrapping to signed integer types,
+ e.g., remainder( rint(x), 65536.0 ) will compute an integer value in the
+ range -32767.0 to +32768.0 which is not, in general, in the range of signed short
+ int.
+<p><!--para 4 -->
+ C's conversions (casts) from floating-point to floating-point can meet LIA-1
+ requirements if an implementation uses round-to-nearest (IEC 60559 default).
+<p><!--para 5 -->
+ C's conversions (casts) from integer to floating-point can meet LIA-1 requirements if an
+ implementation uses round-to-nearest.
+<!--page 497 -->
+
+<h3><a name="H.3" href="#H.3">H.3 Notification</a></h3>
+<p><!--para 1 -->
+ Notification is the process by which a user or program is informed that an exceptional
+ arithmetic operation has occurred. C's operations are compatible with LIA-1 in that C
+ allows an implementation to cause a notification to occur when any arithmetic operation
+ returns an exceptional value as defined in LIA-1 clause 5.
+
+<h4><a name="H.3.1" href="#H.3.1">H.3.1 Notification alternatives</a></h4>
+<p><!--para 1 -->
+ LIA-1 requires at least the following two alternatives for handling of notifications:
+ setting indicators or trap-and-terminate. LIA-1 allows a third alternative: trap-and-
+ resume.
+<p><!--para 2 -->
+ An implementation need only support a given notification alternative for the entire
+ program. An implementation may support the ability to switch between notification
+ alternatives during execution, but is not required to do so. An implementation can
+ provide separate selection for each kind of notification, but this is not required.
+<p><!--para 3 -->
+ C allows an implementation to provide notification. C's SIGFPE (for traps) and
+ FE_INVALID, FE_DIVBYZERO, FE_OVERFLOW, FE_UNDERFLOW (for indicators)
+ can provide LIA-1 notification.
+<p><!--para 4 -->
+ C's signal handlers are compatible with LIA-1. Default handling of SIGFPE can
+ provide trap-and-terminate behavior, except for those LIA-1 operations implemented by
+ math library function calls. User-provided signal handlers for SIGFPE allow for trap-
+ and-resume behavior with the same constraint.
+
+<h5><a name="H.3.1.1" href="#H.3.1.1">H.3.1.1 Indicators</a></h5>
+<p><!--para 1 -->
+ C's <a href="#7.6">&lt;fenv.h&gt;</a> status flags are compatible with the LIA-1 indicators.
+<p><!--para 2 -->
+ The following mapping is for floating-point types:
+ undefined                FE_INVALID, FE_DIVBYZERO
+ floating_overflow         FE_OVERFLOW
+ underflow                FE_UNDERFLOW
+<p><!--para 3 -->
+ The floating-point indicator interrogation and manipulation operations are:
+ set_indicators          feraiseexcept(i)
+ clear_indicators        feclearexcept(i)
+ test_indicators         fetestexcept(i)
+ current_indicators      fetestexcept(FE_ALL_EXCEPT)
+ where i is an expression of type int representing a subset of the LIA-1 indicators.
+<p><!--para 4 -->
+ C allows an implementation to provide the following LIA-1 required behavior: at
+ program termination if any indicator is set the implementation shall send an unambiguous
+<!--page 498 -->
+ and ''hard to ignore'' message (see LIA-1 subclause <a href="#6.1.2">6.1.2</a>)
+<p><!--para 5 -->
+ LIA-1 does not make the distinction between floating-point and integer for ''undefined''.
+ This documentation makes that distinction because <a href="#7.6">&lt;fenv.h&gt;</a> covers only the floating-
+ point indicators.
+
+<h5><a name="H.3.1.2" href="#H.3.1.2">H.3.1.2 Traps</a></h5>
+<p><!--para 1 -->
+ C is compatible with LIA-1's trap requirements for arithmetic operations, but not for
+ math library functions (which are not permitted to generate any externally visible
+ exceptional conditions). An implementation can provide an alternative of notification
+ through termination with a ''hard-to-ignore'' message (see LIA-1 subclause <a href="#6.1.3">6.1.3</a>).
+<p><!--para 2 -->
+ LIA-1 does not require that traps be precise.
+<p><!--para 3 -->
+ C does require that SIGFPE be the signal corresponding to arithmetic exceptions, if there
+ is any signal raised for them.
+<p><!--para 4 -->
+ C supports signal handlers for SIGFPE and allows trapping of arithmetic exceptions.
+ When arithmetic exceptions do trap, C's signal-handler mechanism allows trap-and-
+ terminate (either default implementation behavior or user replacement for it) or trap-and-
+ resume, at the programmer's option.
+<!--page 499 -->
+
+<h2><a name="I" href="#I">Annex I</a></h2>
+<pre>
+                                     (informative)
+                                Common warnings
+</pre>
+<p><!--para 1 -->
+ An implementation may generate warnings in many situations, none of which are
+ specified as part of this International Standard. The following are a few of the more
+ common situations.
+<p><!--para 2 -->
+<ul>
+<li>  A new struct or union type appears in a function prototype (<a href="#6.2.1">6.2.1</a>, <a href="#6.7.2.3">6.7.2.3</a>).
+<li>  A block with initialization of an object that has automatic storage duration is jumped
+ into (<a href="#6.2.4">6.2.4</a>).
+<li>  An implicit narrowing conversion is encountered, such as the assignment of a long
+ int or a double to an int, or a pointer to void to a pointer to any type other than
+ a character type (<a href="#6.3">6.3</a>).
+<li>  A hexadecimal floating constant cannot be represented exactly in its evaluation format
+ (<a href="#6.4.4.2">6.4.4.2</a>).
+<li>  An integer character constant includes more than one character or a wide character
+ constant includes more than one multibyte character (<a href="#6.4.4.4">6.4.4.4</a>).
+<li>  The characters /* are found in a comment (<a href="#6.4.7">6.4.7</a>).
+<li>  An ''unordered'' binary operator (not comma, &amp;&amp;, or ||) contains a side effect to an
+ lvalue in one operand, and a side effect to, or an access to the value of, the identical
+ lvalue in the other operand (<a href="#6.5">6.5</a>).
+<li>  A function is called but no prototype has been supplied (<a href="#6.5.2.2">6.5.2.2</a>).
+<li>  The arguments in a function call do not agree in number and type with those of the
+ parameters in a function definition that is not a prototype (<a href="#6.5.2.2">6.5.2.2</a>).
+<li>  An object is defined but not used (<a href="#6.7">6.7</a>).
+<li>  A value is given to an object of an enumerated type other than by assignment of an
+ enumeration constant that is a member of that type, or an enumeration object that has
+ the same type, or the value of a function that returns the same enumerated type
+ (<a href="#6.7.2.2">6.7.2.2</a>).
+<li>  An aggregate has a partly bracketed initialization (<a href="#6.7.7">6.7.7</a>).
+<li>  A statement cannot be reached (<a href="#6.8">6.8</a>).
+<li>  A statement with no apparent effect is encountered (<a href="#6.8">6.8</a>).
+<li>  A constant expression is used as the controlling expression of a selection statement
+ (<a href="#6.8.4">6.8.4</a>).
+<!--page 500 -->
+<li>  An incorrectly formed preprocessing group is encountered while skipping a
+ preprocessing group (<a href="#6.10.1">6.10.1</a>).
+<li>  An unrecognized #pragma directive is encountered (<a href="#6.10.6">6.10.6</a>).
+<!--page 501 -->
+</ul>
+
+<h2><a name="J" href="#J">Annex J</a></h2>
+<pre>
+                                      (informative)
+                                   Portability issues
+</pre>
+<p><!--para 1 -->
+ This annex collects some information about portability that appears in this International
+ Standard.
+
+<h3><a name="J.1" href="#J.1">J.1 Unspecified behavior</a></h3>
+<p><!--para 1 -->
+ The following are unspecified:
+<ul>
+<li>  The manner and timing of static initialization (<a href="#5.1.2">5.1.2</a>).
+<li>  The termination status returned to the hosted environment if the return type of main
+ is not compatible with int (<a href="#5.1.2.2.3">5.1.2.2.3</a>).
+<li>  The behavior of the display device if a printing character is written when the active
+ position is at the final position of a line (<a href="#5.2.2">5.2.2</a>).
+<li>  The behavior of the display device if a backspace character is written when the active
+ position is at the initial position of a line (<a href="#5.2.2">5.2.2</a>).
+<li>  The behavior of the display device if a horizontal tab character is written when the
+ active position is at or past the last defined horizontal tabulation position (<a href="#5.2.2">5.2.2</a>).
+<li>  The behavior of the display device if a vertical tab character is written when the active
+ position is at or past the last defined vertical tabulation position (<a href="#5.2.2">5.2.2</a>).
+<li>  How an extended source character that does not correspond to a universal character
+ name counts toward the significant initial characters in an external identifier (<a href="#5.2.4.1">5.2.4.1</a>).
+<li>  Many aspects of the representations of types (<a href="#6.2.6">6.2.6</a>).
+<li>  The value of padding bytes when storing values in structures or unions (<a href="#6.2.6.1">6.2.6.1</a>).
+<li>  The value of a union member other than the last one stored into (<a href="#6.2.6.1">6.2.6.1</a>).
+<li>  The representation used when storing a value in an object that has more than one
+ object representation for that value (<a href="#6.2.6.1">6.2.6.1</a>).
+<li>  The values of any padding bits in integer representations (<a href="#6.2.6.2">6.2.6.2</a>).
+<li>  Whether certain operators can generate negative zeros and whether a negative zero
+ becomes a normal zero when stored in an object (<a href="#6.2.6.2">6.2.6.2</a>).
+<li>  Whether two string literals result in distinct arrays (<a href="#6.4.5">6.4.5</a>).
+<li>  The order in which subexpressions are evaluated and the order in which side effects
+ take place, except as specified for the function-call (), &amp;&amp;, ||, ?:, and comma
+ operators (<a href="#6.5">6.5</a>).
+<!--page 502 -->
+<li>  The order in which the function designator, arguments, and subexpressions within the
+ arguments are evaluated in a function call (<a href="#6.5.2.2">6.5.2.2</a>).
+<li>  The order of side effects among compound literal initialization list expressions
+ (<a href="#6.5.2.5">6.5.2.5</a>).
+<li>  The order in which the operands of an assignment operator are evaluated (<a href="#6.5.16">6.5.16</a>).
+<li>  The alignment of the addressable storage unit allocated to hold a bit-field (<a href="#6.7.2.1">6.7.2.1</a>).
+<li>  Whether a call to an inline function uses the inline definition or the external definition
+ of the function (<a href="#6.7.4">6.7.4</a>).
+<li>  Whether or not a size expression is evaluated when it is part of the operand of a
+ sizeof operator and changing the value of the size expression would not affect the
+ result of the operator (<a href="#6.7.5.2">6.7.5.2</a>).
+<li>  The order in which any side effects occur among the initialization list expressions in
+ an initializer (<a href="#6.7.8">6.7.8</a>).
+<li>  The layout of storage for function parameters (<a href="#6.9.1">6.9.1</a>).
+<li>  When a fully expanded macro replacement list contains a function-like macro name
+ as its last preprocessing token and the next preprocessing token from the source file is
+ a (, and the fully expanded replacement of that macro ends with the name of the first
+ macro and the next preprocessing token from the source file is again a (, whether that
+ is considered a nested replacement (<a href="#6.10.3">6.10.3</a>).
+<li>  The order in which # and ## operations are evaluated during macro substitution
+ (<a href="#6.10.3.2">6.10.3.2</a>, <a href="#6.10.3.3">6.10.3.3</a>).
+<li>  Whether errno is a macro or an identifier with external linkage (<a href="#7.5">7.5</a>).
+<li>  The state of the floating-point status flags when execution passes from a part of the
+ program translated with FENV_ACCESS ''off'' to a part translated with
+ FENV_ACCESS ''on'' (<a href="#7.6.1">7.6.1</a>).
+<li>  The order in which feraiseexcept raises floating-point exceptions, except as
+ stated in <a href="#F.7.6">F.7.6</a> (<a href="#7.6.2.3">7.6.2.3</a>).
+<li>  Whether math_errhandling is a macro or an identifier with external linkage
+ (<a href="#7.12">7.12</a>).
+<li>  The results of the frexp functions when the specified value is not a floating-point
+ number (<a href="#7.12.6.4">7.12.6.4</a>).
+<li>  The numeric result of the ilogb functions when the correct value is outside the
+ range of the return type (<a href="#7.12.6.5">7.12.6.5</a>, <a href="#F.9.3.5">F.9.3.5</a>).
+<li>  The result of rounding when the value is out of range (<a href="#7.12.9.5">7.12.9.5</a>, <a href="#7.12.9.7">7.12.9.7</a>, <a href="#F.9.6.5">F.9.6.5</a>).
+<!--page 503 -->
+<li>  The value stored by the remquo functions in the object pointed to by quo when y is
+ zero (<a href="#7.12.10.3">7.12.10.3</a>).
+<li>  Whether setjmp is a macro or an identifier with external linkage (<a href="#7.13">7.13</a>).
+<li>  Whether va_copy and va_end are macros or identifiers with external linkage
+ (<a href="#7.15.1">7.15.1</a>).
+<li>  The hexadecimal digit before the decimal point when a non-normalized floating-point
+ number is printed with an a or A conversion specifier (<a href="#7.19.6.1">7.19.6.1</a>, <a href="#7.24.2.1">7.24.2.1</a>).
+<li>  The value of the file position indicator after a successful call to the ungetc function
+ for a text stream, or the ungetwc function for any stream, until all pushed-back
+ characters are read or discarded (<a href="#7.19.7.11">7.19.7.11</a>, <a href="#7.24.3.10">7.24.3.10</a>).
+<li>  The details of the value stored by the fgetpos function (<a href="#7.19.9.1">7.19.9.1</a>).
+<li>  The details of the value returned by the ftell function for a text stream (<a href="#7.19.9.4">7.19.9.4</a>).
+<li>  Whether the strtod, strtof, strtold, wcstod, wcstof, and wcstold
+ functions convert a minus-signed sequence to a negative number directly or by
+ negating the value resulting from converting the corresponding unsigned sequence
+ (<a href="#7.20.1.3">7.20.1.3</a>, <a href="#7.24.4.1.1">7.24.4.1.1</a>).
+<li>  The order and contiguity of storage allocated by successive calls to the calloc,
+ malloc, and realloc functions (<a href="#7.20.3">7.20.3</a>).
+<li>  The amount of storage allocated by a successful call to the calloc, malloc, or
+ realloc function when 0 bytes was requested (<a href="#7.20.3">7.20.3</a>).
+<li>  Which of two elements that compare as equal is matched by the bsearch function
+ (<a href="#7.20.5.1">7.20.5.1</a>).
+<li>  The order of two elements that compare as equal in an array sorted by the qsort
+ function (<a href="#7.20.5.2">7.20.5.2</a>).
+<li>  The encoding of the calendar time returned by the time function (<a href="#7.23.2.4">7.23.2.4</a>).
+<li>  The characters stored by the strftime or wcsftime function if any of the time
+ values being converted is outside the normal range (<a href="#7.23.3.5">7.23.3.5</a>, <a href="#7.24.5.1">7.24.5.1</a>).
+<li>  The conversion state after an encoding error occurs (<a href="#7.24.6.3.2">7.24.6.3.2</a>, <a href="#7.24.6.3.3">7.24.6.3.3</a>, <a href="#7.24.6.4.1">7.24.6.4.1</a>,
+ <a href="#7.24.6.4.2">7.24.6.4.2</a>,
+<li>  The resulting value when the ''invalid'' floating-point exception is raised during
+ IEC 60559 floating to integer conversion (<a href="#F.4">F.4</a>).
+<li>  Whether conversion of non-integer IEC 60559 floating values to integer raises the
+ ''inexact'' floating-point exception (<a href="#F.4">F.4</a>).
+<!--page 504 -->
+<li>  Whether or when library functions in <a href="#7.12">&lt;math.h&gt;</a> raise the ''inexact'' floating-point
+ exception in an IEC 60559 conformant implementation (<a href="#F.9">F.9</a>).
+<li>  Whether or when library functions in <a href="#7.12">&lt;math.h&gt;</a> raise an undeserved ''underflow''
+ floating-point exception in an IEC 60559 conformant implementation (<a href="#F.9">F.9</a>).
+<li>  The exponent value stored by frexp for a NaN or infinity (<a href="#F.9.3.4">F.9.3.4</a>).
+<li>  The numeric result returned by the lrint, llrint, lround, and llround
+ functions if the rounded value is outside the range of the return type (<a href="#F.9.6.5">F.9.6.5</a>, <a href="#F.9.6.7">F.9.6.7</a>).
+<li>  The sign of one part of the complex result of several math functions for certain
+ exceptional values in IEC 60559 compatible implementations (<a href="#G.6.1.1">G.6.1.1</a>, <a href="#G.6.2.2">G.6.2.2</a>,
+ <a href="#G.6.2.3">G.6.2.3</a>, <a href="#G.6.2.4">G.6.2.4</a>, <a href="#G.6.2.5">G.6.2.5</a>, <a href="#G.6.2.6">G.6.2.6</a>, <a href="#G.6.3.1">G.6.3.1</a>, <a href="#G.6.4.2">G.6.4.2</a>).
+</ul>
+
+<h3><a name="J.2" href="#J.2">J.2 Undefined behavior</a></h3>
+<p><!--para 1 -->
+ The behavior is undefined in the following circumstances:
+<ul>
+<li>  A ''shall'' or ''shall not'' requirement that appears outside of a constraint is violated
+ (clause 4).
+<li>  A nonempty source file does not end in a new-line character which is not immediately
+ preceded by a backslash character or ends in a partial preprocessing token or
+ comment (<a href="#5.1.1.2">5.1.1.2</a>).
+<li>  Token concatenation produces a character sequence matching the syntax of a
+ universal character name (<a href="#5.1.1.2">5.1.1.2</a>).
+<li>  A program in a hosted environment does not define a function named main using one
+ of the specified forms (<a href="#5.1.2.2.1">5.1.2.2.1</a>).
+<li>  A character not in the basic source character set is encountered in a source file, except
+ in an identifier, a character constant, a string literal, a header name, a comment, or a
+ preprocessing token that is never converted to a token (<a href="#5.2.1">5.2.1</a>).
+<li>  An identifier, comment, string literal, character constant, or header name contains an
+ invalid multibyte character or does not begin and end in the initial shift state (<a href="#5.2.1.2">5.2.1.2</a>).
+<li>  The same identifier has both internal and external linkage in the same translation unit
+ (<a href="#6.2.2">6.2.2</a>).
+<li>  An object is referred to outside of its lifetime (<a href="#6.2.4">6.2.4</a>).
+<li>  The value of a pointer to an object whose lifetime has ended is used (<a href="#6.2.4">6.2.4</a>).
+<li>  The value of an object with automatic storage duration is used while it is
+ indeterminate (<a href="#6.2.4">6.2.4</a>, <a href="#6.7.8">6.7.8</a>, <a href="#6.8">6.8</a>).
+<li>  A trap representation is read by an lvalue expression that does not have character type
+ (<a href="#6.2.6.1">6.2.6.1</a>).
+<!--page 505 -->
+<li>  A trap representation is produced by a side effect that modifies any part of the object
+ using an lvalue expression that does not have character type (<a href="#6.2.6.1">6.2.6.1</a>).
+<li>  The arguments to certain operators are such that could produce a negative zero result,
+ but the implementation does not support negative zeros (<a href="#6.2.6.2">6.2.6.2</a>).
+<li>  Two declarations of the same object or function specify types that are not compatible
+ (<a href="#6.2.7">6.2.7</a>).
+<li>  Conversion to or from an integer type produces a value outside the range that can be
+ represented (<a href="#6.3.1.4">6.3.1.4</a>).
+<li>  Demotion of one real floating type to another produces a value outside the range that
+ can be represented (<a href="#6.3.1.5">6.3.1.5</a>).
+<li>  An lvalue does not designate an object when evaluated (<a href="#6.3.2.1">6.3.2.1</a>).
+<li>  A non-array lvalue with an incomplete type is used in a context that requires the value
+ of the designated object (<a href="#6.3.2.1">6.3.2.1</a>).
+<li>  An lvalue having array type is converted to a pointer to the initial element of the
+ array, and the array object has register storage class (<a href="#6.3.2.1">6.3.2.1</a>).
+<li>  An attempt is made to use the value of a void expression, or an implicit or explicit
+ conversion (except to void) is applied to a void expression (<a href="#6.3.2.2">6.3.2.2</a>).
+<li>  Conversion of a pointer to an integer type produces a value outside the range that can
+ be represented (<a href="#6.3.2.3">6.3.2.3</a>).
+<li>  Conversion between two pointer types produces a result that is incorrectly aligned
+ (<a href="#6.3.2.3">6.3.2.3</a>).
+<li>  A pointer is used to call a function whose type is not compatible with the pointed-to
+ type (<a href="#6.3.2.3">6.3.2.3</a>).
+<li>  An unmatched ' or " character is encountered on a logical source line during
+ tokenization (<a href="#6.4">6.4</a>).
+<li>  A reserved keyword token is used in translation phase 7 or 8 for some purpose other
+ than as a keyword (<a href="#6.4.1">6.4.1</a>).
+<li>  A universal character name in an identifier does not designate a character whose
+ encoding falls into one of the specified ranges (<a href="#6.4.2.1">6.4.2.1</a>).
+<li>  The initial character of an identifier is a universal character name designating a digit
+ (<a href="#6.4.2.1">6.4.2.1</a>).
+<li>  Two identifiers differ only in nonsignificant characters (<a href="#6.4.2.1">6.4.2.1</a>).
+<li>  The identifier __func__ is explicitly declared (<a href="#6.4.2.2">6.4.2.2</a>).
+<!--page 506 -->
+<li>  The program attempts to modify a string literal (<a href="#6.4.5">6.4.5</a>).
+<li>  The characters ', \, ", //, or /* occur in the sequence between the &lt; and &gt;
+ delimiters, or the characters ', \, //, or /* occur in the sequence between the "
+ delimiters, in a header name preprocessing token (<a href="#6.4.7">6.4.7</a>).
+<li>  Between two sequence points, an object is modified more than once, or is modified
+ and the prior value is read other than to determine the value to be stored (<a href="#6.5">6.5</a>).
+<li>  An exceptional condition occurs during the evaluation of an expression (<a href="#6.5">6.5</a>).
+<li>  An object has its stored value accessed other than by an lvalue of an allowable type
+ (<a href="#6.5">6.5</a>).
+<li>  An attempt is made to modify the result of a function call, a conditional operator, an
+ assignment operator, or a comma operator, or to access it after the next sequence
+ point (<a href="#6.5.2.2">6.5.2.2</a>, <a href="#6.5.15">6.5.15</a>, <a href="#6.5.16">6.5.16</a>, <a href="#6.5.17">6.5.17</a>).
+<li>  For a call to a function without a function prototype in scope, the number of
+ arguments does not equal the number of parameters (<a href="#6.5.2.2">6.5.2.2</a>).
+<li>  For call to a function without a function prototype in scope where the function is
+ defined with a function prototype, either the prototype ends with an ellipsis or the
+ types of the arguments after promotion are not compatible with the types of the
+ parameters (<a href="#6.5.2.2">6.5.2.2</a>).
+<li>  For a call to a function without a function prototype in scope where the function is not
+ defined with a function prototype, the types of the arguments after promotion are not
+ compatible with those of the parameters after promotion (with certain exceptions)
+ (<a href="#6.5.2.2">6.5.2.2</a>).
+<li>  A function is defined with a type that is not compatible with the type (of the
+ expression) pointed to by the expression that denotes the called function (<a href="#6.5.2.2">6.5.2.2</a>).
+<li>  The operand of the unary * operator has an invalid value (<a href="#6.5.3.2">6.5.3.2</a>).
+<li>  A pointer is converted to other than an integer or pointer type (<a href="#6.5.4">6.5.4</a>).
+<li>  The value of the second operand of the / or % operator is zero (<a href="#6.5.5">6.5.5</a>).
+<li>  Addition or subtraction of a pointer into, or just beyond, an array object and an
+ integer type produces a result that does not point into, or just beyond, the same array
+ object (<a href="#6.5.6">6.5.6</a>).
+<li>  Addition or subtraction of a pointer into, or just beyond, an array object and an
+ integer type produces a result that points just beyond the array object and is used as
+ the operand of a unary * operator that is evaluated (<a href="#6.5.6">6.5.6</a>).
+<li>  Pointers that do not point into, or just beyond, the same array object are subtracted
+ (<a href="#6.5.6">6.5.6</a>).
+<!--page 507 -->
+<li>  An array subscript is out of range, even if an object is apparently accessible with the
+ given subscript (as in the lvalue expression a[1][7] given the declaration int
+ a[4][5]) (<a href="#6.5.6">6.5.6</a>).
+<li>  The result of subtracting two pointers is not representable in an object of type
+ ptrdiff_t (<a href="#6.5.6">6.5.6</a>).
+<li>  An expression is shifted by a negative number or by an amount greater than or equal
+ to the width of the promoted expression (<a href="#6.5.7">6.5.7</a>).
+<li>  An expression having signed promoted type is left-shifted and either the value of the
+ expression is negative or the result of shifting would be not be representable in the
+ promoted type (<a href="#6.5.7">6.5.7</a>).
+<li>  Pointers that do not point to the same aggregate or union (nor just beyond the same
+ array object) are compared using relational operators (<a href="#6.5.8">6.5.8</a>).
+<li>  An object is assigned to an inexactly overlapping object or to an exactly overlapping
+ object with incompatible type (<a href="#6.5.16.1">6.5.16.1</a>).
+<li>  An expression that is required to be an integer constant expression does not have an
+ integer type; has operands that are not integer constants, enumeration constants,
+ character constants, sizeof expressions whose results are integer constants, or
+ immediately-cast floating constants; or contains casts (outside operands to sizeof
+ operators) other than conversions of arithmetic types to integer types (<a href="#6.6">6.6</a>).
+<li>  A constant expression in an initializer is not, or does not evaluate to, one of the
+ following: an arithmetic constant expression, a null pointer constant, an address
+ constant, or an address constant for an object type plus or minus an integer constant
+ expression (<a href="#6.6">6.6</a>).
+<li>  An arithmetic constant expression does not have arithmetic type; has operands that
+ are not integer constants, floating constants, enumeration constants, character
+ constants, or sizeof expressions; or contains casts (outside operands to sizeof
+ operators) other than conversions of arithmetic types to arithmetic types (<a href="#6.6">6.6</a>).
+<li>  The value of an object is accessed by an array-subscript [], member-access . or -&gt;,
+ address &amp;, or indirection * operator or a pointer cast in creating an address constant
+ (<a href="#6.6">6.6</a>).
+<li>  An identifier for an object is declared with no linkage and the type of the object is
+ incomplete after its declarator, or after its init-declarator if it has an initializer (<a href="#6.7">6.7</a>).
+<li>  A function is declared at block scope with an explicit storage-class specifier other
+ than extern (<a href="#6.7.1">6.7.1</a>).
+<li>  A structure or union is defined as containing no named members (<a href="#6.7.2.1">6.7.2.1</a>).
+<!--page 508 -->
+<li>  An attempt is made to access, or generate a pointer to just past, a flexible array
+ member of a structure when the referenced object provides no elements for that array
+ (<a href="#6.7.2.1">6.7.2.1</a>).
+<li>  When the complete type is needed, an incomplete structure or union type is not
+ completed in the same scope by another declaration of the tag that defines the content
+ (<a href="#6.7.2.3">6.7.2.3</a>).
+<li>  An attempt is made to modify an object defined with a const-qualified type through
+ use of an lvalue with non-const-qualified type (<a href="#6.7.3">6.7.3</a>).
+<li>  An attempt is made to refer to an object defined with a volatile-qualified type through
+ use of an lvalue with non-volatile-qualified type (<a href="#6.7.3">6.7.3</a>).
+<li>  The specification of a function type includes any type qualifiers (<a href="#6.7.3">6.7.3</a>).
+<li>  Two qualified types that are required to be compatible do not have the identically
+ qualified version of a compatible type (<a href="#6.7.3">6.7.3</a>).
+<li>  An object which has been modified is accessed through a restrict-qualified pointer to
+ a const-qualified type, or through a restrict-qualified pointer and another pointer that
+ are not both based on the same object (<a href="#6.7.3.1">6.7.3.1</a>).
+<li>  A restrict-qualified pointer is assigned a value based on another restricted pointer
+ whose associated block neither began execution before the block associated with this
+ pointer, nor ended before the assignment (<a href="#6.7.3.1">6.7.3.1</a>).
+<li>  A function with external linkage is declared with an inline function specifier, but is
+ not also defined in the same translation unit (<a href="#6.7.4">6.7.4</a>).
+<li>  Two pointer types that are required to be compatible are not identically qualified, or
+ are not pointers to compatible types (<a href="#6.7.5.1">6.7.5.1</a>).
+<li>  The size expression in an array declaration is not a constant expression and evaluates
+ at program execution time to a nonpositive value (<a href="#6.7.5.2">6.7.5.2</a>).
+<li>  In a context requiring two array types to be compatible, they do not have compatible
+ element types, or their size specifiers evaluate to unequal values (<a href="#6.7.5.2">6.7.5.2</a>).
+<li>  A declaration of an array parameter includes the keyword static within the [ and
+ ] and the corresponding argument does not provide access to the first element of an
+ array with at least the specified number of elements (<a href="#6.7.5.3">6.7.5.3</a>).
+<li>  A storage-class specifier or type qualifier modifies the keyword void as a function
+ parameter type list (<a href="#6.7.5.3">6.7.5.3</a>).
+<li>  In a context requiring two function types to be compatible, they do not have
+  compatible return types, or their parameters disagree in use of the ellipsis terminator
+  or the number and type of parameters (after default argument promotion, when there
+   is no parameter type list or when one type is specified by a function definition with an
+<!--page 509 -->
+  identifier list) (<a href="#6.7.5.3">6.7.5.3</a>).
+<li>  The value of an unnamed member of a structure or union is used (<a href="#6.7.8">6.7.8</a>).
+<li>  The initializer for a scalar is neither a single expression nor a single expression
+ enclosed in braces (<a href="#6.7.8">6.7.8</a>).
+<li>  The initializer for a structure or union object that has automatic storage duration is
+ neither an initializer list nor a single expression that has compatible structure or union
+ type (<a href="#6.7.8">6.7.8</a>).
+<li>  The initializer for an aggregate or union, other than an array initialized by a string
+ literal, is not a brace-enclosed list of initializers for its elements or members (<a href="#6.7.8">6.7.8</a>).
+<li>  An identifier with external linkage is used, but in the program there does not exist
+ exactly one external definition for the identifier, or the identifier is not used and there
+ exist multiple external definitions for the identifier (<a href="#6.9">6.9</a>).
+<li>  A function definition includes an identifier list, but the types of the parameters are not
+ declared in a following declaration list (<a href="#6.9.1">6.9.1</a>).
+<li>  An adjusted parameter type in a function definition is not an object type (<a href="#6.9.1">6.9.1</a>).
+<li>  A function that accepts a variable number of arguments is defined without a
+ parameter type list that ends with the ellipsis notation (<a href="#6.9.1">6.9.1</a>).
+<li>  The } that terminates a function is reached, and the value of the function call is used
+ by the caller (<a href="#6.9.1">6.9.1</a>).
+<li>  An identifier for an object with internal linkage and an incomplete type is declared
+ with a tentative definition (<a href="#6.9.2">6.9.2</a>).
+<li>  The token defined is generated during the expansion of a #if or #elif
+ preprocessing directive, or the use of the defined unary operator does not match
+ one of the two specified forms prior to macro replacement (<a href="#6.10.1">6.10.1</a>).
+<li>  The #include preprocessing directive that results after expansion does not match
+ one of the two header name forms (<a href="#6.10.2">6.10.2</a>).
+<li>  The character sequence in an #include preprocessing directive does not start with a
+ letter (<a href="#6.10.2">6.10.2</a>).
+<li>  There are sequences of preprocessing tokens within the list of macro arguments that
+ would otherwise act as preprocessing directives (<a href="#6.10.3">6.10.3</a>).
+<li>  The result of the preprocessing operator # is not a valid character string literal
+ (<a href="#6.10.3.2">6.10.3.2</a>).
+<li>  The result of the preprocessing operator ## is not a valid preprocessing token
+ (<a href="#6.10.3.3">6.10.3.3</a>).
+<!--page 510 -->
+<li>  The #line preprocessing directive that results after expansion does not match one of
+ the two well-defined forms, or its digit sequence specifies zero or a number greater
+ than 2147483647 (<a href="#6.10.4">6.10.4</a>).
+<li>  A non-STDC #pragma preprocessing directive that is documented as causing
+ translation failure or some other form of undefined behavior is encountered (<a href="#6.10.6">6.10.6</a>).
+<li>  A #pragma STDC preprocessing directive does not match one of the well-defined
+ forms (<a href="#6.10.6">6.10.6</a>).
+<li>  The name of a predefined macro, or the identifier defined, is the subject of a
+ #define or #undef preprocessing directive (<a href="#6.10.8">6.10.8</a>).
+<li>  An attempt is made to copy an object to an overlapping object by use of a library
+ function, other than as explicitly allowed (e.g., memmove) (clause 7).
+<li>  A file with the same name as one of the standard headers, not provided as part of the
+ implementation, is placed in any of the standard places that are searched for included
+ source files (<a href="#7.1.2">7.1.2</a>).
+<li>  A header is included within an external declaration or definition (<a href="#7.1.2">7.1.2</a>).
+<li>  A function, object, type, or macro that is specified as being declared or defined by
+ some standard header is used before any header that declares or defines it is included
+ (<a href="#7.1.2">7.1.2</a>).
+<li>  A standard header is included while a macro is defined with the same name as a
+ keyword (<a href="#7.1.2">7.1.2</a>).
+<li>  The program attempts to declare a library function itself, rather than via a standard
+ header, but the declaration does not have external linkage (<a href="#7.1.2">7.1.2</a>).
+<li>  The program declares or defines a reserved identifier, other than as allowed by <a href="#7.1.4">7.1.4</a>
+ (<a href="#7.1.3">7.1.3</a>).
+<li>  The program removes the definition of a macro whose name begins with an
+ underscore and either an uppercase letter or another underscore (<a href="#7.1.3">7.1.3</a>).
+<li>  An argument to a library function has an invalid value or a type not expected by a
+ function with variable number of arguments (<a href="#7.1.4">7.1.4</a>).
+<li>  The pointer passed to a library function array parameter does not have a value such
+ that all address computations and object accesses are valid (<a href="#7.1.4">7.1.4</a>).
+<li>  The macro definition of assert is suppressed in order to access an actual function
+ (<a href="#7.2">7.2</a>).
+<li>  The argument to the assert macro does not have a scalar type (<a href="#7.2">7.2</a>).
+<li>  The CX_LIMITED_RANGE, FENV_ACCESS, or FP_CONTRACT pragma is used in
+ any context other than outside all external declarations or preceding all explicit
+<!--page 511 -->
+  declarations and statements inside a compound statement (<a href="#7.3.4">7.3.4</a>, <a href="#7.6.1">7.6.1</a>, <a href="#7.12.2">7.12.2</a>).
+<li>  The value of an argument to a character handling function is neither equal to the value
+ of EOF nor representable as an unsigned char (<a href="#7.4">7.4</a>).
+<li>  A macro definition of errno is suppressed in order to access an actual object, or the
+ program defines an identifier with the name errno (<a href="#7.5">7.5</a>).
+<li>  Part of the program tests floating-point status flags, sets floating-point control modes,
+ or runs under non-default mode settings, but was translated with the state for the
+ FENV_ACCESS pragma ''off'' (<a href="#7.6.1">7.6.1</a>).
+<li>  The exception-mask argument for one of the functions that provide access to the
+ floating-point status flags has a nonzero value not obtained by bitwise OR of the
+ floating-point exception macros (<a href="#7.6.2">7.6.2</a>).
+<li>  The fesetexceptflag function is used to set floating-point status flags that were
+ not specified in the call to the fegetexceptflag function that provided the value
+ of the corresponding fexcept_t object (<a href="#7.6.2.4">7.6.2.4</a>).
+<li>  The argument to fesetenv or feupdateenv is neither an object set by a call to
+ fegetenv or feholdexcept, nor is it an environment macro (<a href="#7.6.4.3">7.6.4.3</a>, <a href="#7.6.4.4">7.6.4.4</a>).
+<li>  The value of the result of an integer arithmetic or conversion function cannot be
+ represented (<a href="#7.8.2.1">7.8.2.1</a>, <a href="#7.8.2.2">7.8.2.2</a>, <a href="#7.8.2.3">7.8.2.3</a>, <a href="#7.8.2.4">7.8.2.4</a>, <a href="#7.20.6.1">7.20.6.1</a>, <a href="#7.20.6.2">7.20.6.2</a>, <a href="#7.20.1">7.20.1</a>).
+<li>  The program modifies the string pointed to by the value returned by the setlocale
+ function (<a href="#7.11.1.1">7.11.1.1</a>).
+<li>  The program modifies the structure pointed to by the value returned by the
+ localeconv function (<a href="#7.11.2.1">7.11.2.1</a>).
+<li>  A macro definition of math_errhandling is suppressed or the program defines
+ an identifier with the name math_errhandling (<a href="#7.12">7.12</a>).
+<li>  An argument to a floating-point classification or comparison macro is not of real
+ floating type (<a href="#7.12.3">7.12.3</a>, <a href="#7.12.14">7.12.14</a>).
+<li>  A macro definition of setjmp is suppressed in order to access an actual function, or
+ the program defines an external identifier with the name setjmp (<a href="#7.13">7.13</a>).
+<li>  An invocation of the setjmp macro occurs other than in an allowed context
+ (<a href="#7.13.2.1">7.13.2.1</a>).
+<li>  The longjmp function is invoked to restore a nonexistent environment (<a href="#7.13.2.1">7.13.2.1</a>).
+<li>  After a longjmp, there is an attempt to access the value of an object of automatic
+ storage class with non-volatile-qualified type, local to the function containing the
+ invocation of the corresponding setjmp macro, that was changed between the
+ setjmp invocation and longjmp call (<a href="#7.13.2.1">7.13.2.1</a>).
+<!--page 512 -->
+<li>  The program specifies an invalid pointer to a signal handler function (<a href="#7.14.1.1">7.14.1.1</a>).
+<li>  A signal handler returns when the signal corresponded to a computational exception
+ (<a href="#7.14.1.1">7.14.1.1</a>).
+<li>  A signal occurs as the result of calling the abort or raise function, and the signal
+ handler calls the raise function (<a href="#7.14.1.1">7.14.1.1</a>).
+<li>  A signal occurs other than as the result of calling the abort or raise function, and
+ the signal handler refers to an object with static storage duration other than by
+ assigning a value to an object declared as volatile sig_atomic_t, or calls any
+ function in the standard library other than the abort function, the _Exit function,
+ or the signal function (for the same signal number) (<a href="#7.14.1.1">7.14.1.1</a>).
+<li>  The value of errno is referred to after a signal occurred other than as the result of
+ calling the abort or raise function and the corresponding signal handler obtained
+ a SIG_ERR return from a call to the signal function (<a href="#7.14.1.1">7.14.1.1</a>).
+<li>  A signal is generated by an asynchronous signal handler (<a href="#7.14.1.1">7.14.1.1</a>).
+<li>  A function with a variable number of arguments attempts to access its varying
+ arguments other than through a properly declared and initialized va_list object, or
+ before the va_start macro is invoked (<a href="#7.15">7.15</a>, <a href="#7.15.1.1">7.15.1.1</a>, <a href="#7.15.1.4">7.15.1.4</a>).
+<li>  The macro va_arg is invoked using the parameter ap that was passed to a function
+ that invoked the macro va_arg with the same parameter (<a href="#7.15">7.15</a>).
+<li>  A macro definition of va_start, va_arg, va_copy, or va_end is suppressed in
+ order to access an actual function, or the program defines an external identifier with
+ the name va_copy or va_end (<a href="#7.15.1">7.15.1</a>).
+<li>  The va_start or va_copy macro is invoked without a corresponding invocation
+ of the va_end macro in the same function, or vice versa (<a href="#7.15.1">7.15.1</a>, <a href="#7.15.1.2">7.15.1.2</a>, <a href="#7.15.1.3">7.15.1.3</a>,
+ <a href="#7.15.1.4">7.15.1.4</a>).
+<li>  The type parameter to the va_arg macro is not such that a pointer to an object of
+ that type can be obtained simply by postfixing a * (<a href="#7.15.1.1">7.15.1.1</a>).
+<li>  The va_arg macro is invoked when there is no actual next argument, or with a
+ specified type that is not compatible with the promoted type of the actual next
+ argument, with certain exceptions (<a href="#7.15.1.1">7.15.1.1</a>).
+<li>  The va_copy or va_start macro is called to initialize a va_list that was
+ previously initialized by either macro without an intervening invocation of the
+ va_end macro for the same va_list (<a href="#7.15.1.2">7.15.1.2</a>, <a href="#7.15.1.4">7.15.1.4</a>).
+<li>  The parameter parmN of a va_start macro is declared with the register
+ storage class, with a function or array type, or with a type that is not compatible with
+ the type that results after application of the default argument promotions (<a href="#7.15.1.4">7.15.1.4</a>).
+<!--page 513 -->
+<li>  The member designator parameter of an offsetof macro is an invalid right
+ operand of the . operator for the type parameter, or designates a bit-field (<a href="#7.17">7.17</a>).
+<li>  The argument in an instance of one of the integer-constant macros is not a decimal,
+ octal, or hexadecimal constant, or it has a value that exceeds the limits for the
+ corresponding type (<a href="#7.18.4">7.18.4</a>).
+<li>  A byte input/output function is applied to a wide-oriented stream, or a wide character
+ input/output function is applied to a byte-oriented stream (<a href="#7.19.2">7.19.2</a>).
+<li>  Use is made of any portion of a file beyond the most recent wide character written to
+ a wide-oriented stream (<a href="#7.19.2">7.19.2</a>).
+<li>  The value of a pointer to a FILE object is used after the associated file is closed
+ (<a href="#7.19.3">7.19.3</a>).
+<li>  The stream for the fflush function points to an input stream or to an update stream
+ in which the most recent operation was input (<a href="#7.19.5.2">7.19.5.2</a>).
+<li>  The string pointed to by the mode argument in a call to the fopen function does not
+ exactly match one of the specified character sequences (<a href="#7.19.5.3">7.19.5.3</a>).
+<li>  An output operation on an update stream is followed by an input operation without an
+ intervening call to the fflush function or a file positioning function, or an input
+ operation on an update stream is followed by an output operation with an intervening
+ call to a file positioning function (<a href="#7.19.5.3">7.19.5.3</a>).
+<li>  An attempt is made to use the contents of the array that was supplied in a call to the
+ setvbuf function (<a href="#7.19.5.6">7.19.5.6</a>).
+<li>  There are insufficient arguments for the format in a call to one of the formatted
+ input/output functions, or an argument does not have an appropriate type (<a href="#7.19.6.1">7.19.6.1</a>,
+ <a href="#7.19.6.2">7.19.6.2</a>, <a href="#7.24.2.1">7.24.2.1</a>, <a href="#7.24.2.2">7.24.2.2</a>).
+<li>  The format in a call to one of the formatted input/output functions or to the
+ strftime or wcsftime function is not a valid multibyte character sequence that
+ begins and ends in its initial shift state (<a href="#7.19.6.1">7.19.6.1</a>, <a href="#7.19.6.2">7.19.6.2</a>, <a href="#7.23.3.5">7.23.3.5</a>, <a href="#7.24.2.1">7.24.2.1</a>, <a href="#7.24.2.2">7.24.2.2</a>,
+ <a href="#7.24.5.1">7.24.5.1</a>).
+<li>  In a call to one of the formatted output functions, a precision appears with a
+ conversion specifier other than those described (<a href="#7.19.6.1">7.19.6.1</a>, <a href="#7.24.2.1">7.24.2.1</a>).
+<li>  A conversion specification for a formatted output function uses an asterisk to denote
+ an argument-supplied field width or precision, but the corresponding argument is not
+ provided (<a href="#7.19.6.1">7.19.6.1</a>, <a href="#7.24.2.1">7.24.2.1</a>).
+<li>  A conversion specification for a formatted output function uses a # or 0 flag with a
+ conversion specifier other than those described (<a href="#7.19.6.1">7.19.6.1</a>, <a href="#7.24.2.1">7.24.2.1</a>).
+<!--page 514 -->
+<li>  A conversion specification for one of the formatted input/output functions uses a
+ length modifier with a conversion specifier other than those described (<a href="#7.19.6.1">7.19.6.1</a>,
+ <a href="#7.19.6.2">7.19.6.2</a>, <a href="#7.24.2.1">7.24.2.1</a>, <a href="#7.24.2.2">7.24.2.2</a>).
+<li>  An s conversion specifier is encountered by one of the formatted output functions,
+ and the argument is missing the null terminator (unless a precision is specified that
+ does not require null termination) (<a href="#7.19.6.1">7.19.6.1</a>, <a href="#7.24.2.1">7.24.2.1</a>).
+<li>  An n conversion specification for one of the formatted input/output functions includes
+ any flags, an assignment-suppressing character, a field width, or a precision (<a href="#7.19.6.1">7.19.6.1</a>,
+ <a href="#7.19.6.2">7.19.6.2</a>, <a href="#7.24.2.1">7.24.2.1</a>, <a href="#7.24.2.2">7.24.2.2</a>).
+<li>  A % conversion specifier is encountered by one of the formatted input/output
+ functions, but the complete conversion specification is not exactly %% (<a href="#7.19.6.1">7.19.6.1</a>,
+ <a href="#7.19.6.2">7.19.6.2</a>, <a href="#7.24.2.1">7.24.2.1</a>, <a href="#7.24.2.2">7.24.2.2</a>).
+<li>  An invalid conversion specification is found in the format for one of the formatted
+ input/output functions, or the strftime or wcsftime function (<a href="#7.19.6.1">7.19.6.1</a>, <a href="#7.19.6.2">7.19.6.2</a>,
+ <a href="#7.23.3.5">7.23.3.5</a>, <a href="#7.24.2.1">7.24.2.1</a>, <a href="#7.24.2.2">7.24.2.2</a>, <a href="#7.24.5.1">7.24.5.1</a>).
+<li>  The number of characters transmitted by a formatted output function is greater than
+ INT_MAX (<a href="#7.19.6.1">7.19.6.1</a>, <a href="#7.19.6.3">7.19.6.3</a>, <a href="#7.19.6.8">7.19.6.8</a>, <a href="#7.19.6.10">7.19.6.10</a>).
+<li>  The result of a conversion by one of the formatted input functions cannot be
+ represented in the corresponding object, or the receiving object does not have an
+ appropriate type (<a href="#7.19.6.2">7.19.6.2</a>, <a href="#7.24.2.2">7.24.2.2</a>).
+<li>  A c, s, or [ conversion specifier is encountered by one of the formatted input
+ functions, and the array pointed to by the corresponding argument is not large enough
+ to accept the input sequence (and a null terminator if the conversion specifier is s or
+ [) (<a href="#7.19.6.2">7.19.6.2</a>, <a href="#7.24.2.2">7.24.2.2</a>).
+<li>  A c, s, or [ conversion specifier with an l qualifier is encountered by one of the
+ formatted input functions, but the input is not a valid multibyte character sequence
+ that begins in the initial shift state (<a href="#7.19.6.2">7.19.6.2</a>, <a href="#7.24.2.2">7.24.2.2</a>).
+<li>  The input item for a %p conversion by one of the formatted input functions is not a
+ value converted earlier during the same program execution (<a href="#7.19.6.2">7.19.6.2</a>, <a href="#7.24.2.2">7.24.2.2</a>).
+<li>  The vfprintf, vfscanf, vprintf, vscanf, vsnprintf, vsprintf,
+ vsscanf, vfwprintf, vfwscanf, vswprintf, vswscanf, vwprintf, or
+ vwscanf function is called with an improperly initialized va_list argument, or
+ the argument is used (other than in an invocation of va_end) after the function
+ returns (<a href="#7.19.6.8">7.19.6.8</a>, <a href="#7.19.6.9">7.19.6.9</a>, <a href="#7.19.6.10">7.19.6.10</a>, <a href="#7.19.6.11">7.19.6.11</a>, <a href="#7.19.6.12">7.19.6.12</a>, <a href="#7.19.6.13">7.19.6.13</a>, <a href="#7.19.6.14">7.19.6.14</a>,
+ <a href="#7.24.2.5">7.24.2.5</a>, <a href="#7.24.2.6">7.24.2.6</a>, <a href="#7.24.2.7">7.24.2.7</a>, <a href="#7.24.2.8">7.24.2.8</a>, <a href="#7.24.2.9">7.24.2.9</a>, <a href="#7.24.2.10">7.24.2.10</a>).
+<li>  The contents of the array supplied in a call to the fgets, gets, or fgetws function
+ are used after a read error occurred (<a href="#7.19.7.2">7.19.7.2</a>, <a href="#7.19.7.7">7.19.7.7</a>, <a href="#7.24.3.2">7.24.3.2</a>).
+<!--page 515 -->
+<li>  The file position indicator for a binary stream is used after a call to the ungetc
+ function where its value was zero before the call (<a href="#7.19.7.11">7.19.7.11</a>).
+<li>  The file position indicator for a stream is used after an error occurred during a call to
+ the fread or fwrite function (<a href="#7.19.8.1">7.19.8.1</a>, <a href="#7.19.8.2">7.19.8.2</a>).
+<li>  A partial element read by a call to the fread function is used (<a href="#7.19.8.1">7.19.8.1</a>).
+<li>  The fseek function is called for a text stream with a nonzero offset and either the
+ offset was not returned by a previous successful call to the ftell function on a
+ stream associated with the same file or whence is not SEEK_SET (<a href="#7.19.9.2">7.19.9.2</a>).
+<li>  The fsetpos function is called to set a position that was not returned by a previous
+ successful call to the fgetpos function on a stream associated with the same file
+ (<a href="#7.19.9.3">7.19.9.3</a>).
+<li>  A non-null pointer returned by a call to the calloc, malloc, or realloc function
+ with a zero requested size is used to access an object (<a href="#7.20.3">7.20.3</a>).
+<li>  The value of a pointer that refers to space deallocated by a call to the free or
+ realloc function is used (<a href="#7.20.3">7.20.3</a>).
+<li>  The pointer argument to the free or realloc function does not match a pointer
+ earlier returned by calloc, malloc, or realloc, or the space has been
+ deallocated by a call to free or realloc (<a href="#7.20.3.2">7.20.3.2</a>, <a href="#7.20.3.4">7.20.3.4</a>).
+<li>  The value of the object allocated by the malloc function is used (<a href="#7.20.3.3">7.20.3.3</a>).
+<li>  The value of any bytes in a new object allocated by the realloc function beyond
+ the size of the old object are used (<a href="#7.20.3.4">7.20.3.4</a>).
+<li>  The program executes more than one call to the exit function (<a href="#7.20.4.3">7.20.4.3</a>).
+<li>  During the call to a function registered with the atexit function, a call is made to
+ the longjmp function that would terminate the call to the registered function
+ (<a href="#7.20.4.3">7.20.4.3</a>).
+<li>  The string set up by the getenv or strerror function is modified by the program
+ (<a href="#7.20.4.5">7.20.4.5</a>, <a href="#7.21.6.2">7.21.6.2</a>).
+<li>  A command is executed through the system function in a way that is documented as
+ causing termination or some other form of undefined behavior (<a href="#7.20.4.6">7.20.4.6</a>).
+<li>  A searching or sorting utility function is called with an invalid pointer argument, even
+ if the number of elements is zero (<a href="#7.20.5">7.20.5</a>).
+<li>  The comparison function called by a searching or sorting utility function alters the
+ contents of the array being searched or sorted, or returns ordering values
+ inconsistently (<a href="#7.20.5">7.20.5</a>).
+<!--page 516 -->
+<li>  The array being searched by the bsearch function does not have its elements in
+ proper order (<a href="#7.20.5.1">7.20.5.1</a>).
+<li>  The current conversion state is used by a multibyte/wide character conversion
+ function after changing the LC_CTYPE category (<a href="#7.20.7">7.20.7</a>).
+<li>  A string or wide string utility function is instructed to access an array beyond the end
+ of an object (<a href="#7.21.1">7.21.1</a>, <a href="#7.24.4">7.24.4</a>).
+<li>  A string or wide string utility function is called with an invalid pointer argument, even
+ if the length is zero (<a href="#7.21.1">7.21.1</a>, <a href="#7.24.4">7.24.4</a>).
+<li>  The contents of the destination array are used after a call to the strxfrm,
+ strftime, wcsxfrm, or wcsftime function in which the specified length was
+ too small to hold the entire null-terminated result (<a href="#7.21.4.5">7.21.4.5</a>, <a href="#7.23.3.5">7.23.3.5</a>, <a href="#7.24.4.4.4">7.24.4.4.4</a>,
+ <a href="#7.24.5.1">7.24.5.1</a>).
+<li>  The first argument in the very first call to the strtok or wcstok is a null pointer
+ (<a href="#7.21.5.8">7.21.5.8</a>, <a href="#7.24.4.5.7">7.24.4.5.7</a>).
+<li>  The type of an argument to a type-generic macro is not compatible with the type of
+ the corresponding parameter of the selected function (<a href="#7.22">7.22</a>).
+<li>  A complex argument is supplied for a generic parameter of a type-generic macro that
+ has no corresponding complex function (<a href="#7.22">7.22</a>).
+<li>  The argument corresponding to an s specifier without an l qualifier in a call to the
+ fwprintf function does not point to a valid multibyte character sequence that
+ begins in the initial shift state (<a href="#7.24.2.11">7.24.2.11</a>).
+<li>  In a call to the wcstok function, the object pointed to by ptr does not have the
+ value stored by the previous call for the same wide string (<a href="#7.24.4.5.7">7.24.4.5.7</a>).
+<li>  An mbstate_t object is used inappropriately (<a href="#7.24.6">7.24.6</a>).
+<li>  The value of an argument of type wint_t to a wide character classification or case
+ mapping function is neither equal to the value of WEOF nor representable as a
+ wchar_t (<a href="#7.25.1">7.25.1</a>).
+<li>  The iswctype function is called using a different LC_CTYPE category from the
+ one in effect for the call to the wctype function that returned the description
+ (<a href="#7.25.2.2.1">7.25.2.2.1</a>).
+<li>  The towctrans function is called using a different LC_CTYPE category from the
+ one in effect for the call to the wctrans function that returned the description
+ (<a href="#7.25.3.2.1">7.25.3.2.1</a>).
+<!--page 517 -->
+</ul>
+
+<h3><a name="J.3" href="#J.3">J.3 Implementation-defined behavior</a></h3>
+<p><!--para 1 -->
+ A conforming implementation is required to document its choice of behavior in each of
+ the areas listed in this subclause. The following are implementation-defined:
+
+<h4><a name="J.3.1" href="#J.3.1">J.3.1 Translation</a></h4>
+<p><!--para 1 -->
+<ul>
+<li>  How a diagnostic is identified (<a href="#3.10">3.10</a>, <a href="#5.1.1.3">5.1.1.3</a>).
+<li>  Whether each nonempty sequence of white-space characters other than new-line is
+ retained or replaced by one space character in translation phase 3 (<a href="#5.1.1.2">5.1.1.2</a>).
+</ul>
+
+<h4><a name="J.3.2" href="#J.3.2">J.3.2 Environment</a></h4>
+<p><!--para 1 -->
+<ul>
+<li>  The mapping between physical source file multibyte characters and the source
+ character set in translation phase 1 (<a href="#5.1.1.2">5.1.1.2</a>).
+<li>  The name and type of the function called at program startup in a freestanding
+ environment (<a href="#5.1.2.1">5.1.2.1</a>).
+<li>  The effect of program termination in a freestanding environment (<a href="#5.1.2.1">5.1.2.1</a>).
+<li>  An alternative manner in which the main function may be defined (<a href="#5.1.2.2.1">5.1.2.2.1</a>).
+<li>  The values given to the strings pointed to by the argv argument to main (<a href="#5.1.2.2.1">5.1.2.2.1</a>).
+<li>  What constitutes an interactive device (<a href="#5.1.2.3">5.1.2.3</a>).
+<li>  The set of signals, their semantics, and their default handling (<a href="#7.14">7.14</a>).
+<li>  Signal values other than SIGFPE, SIGILL, and SIGSEGV that correspond to a
+ computational exception (<a href="#7.14.1.1">7.14.1.1</a>).
+<li>  Signals for which the equivalent of signal(sig, SIG_IGN); is executed at
+ program startup (<a href="#7.14.1.1">7.14.1.1</a>).
+<li>  The set of environment names and the method for altering the environment list used
+ by the getenv function (<a href="#7.20.4.5">7.20.4.5</a>).
+<li>  The manner of execution of the string by the system function (<a href="#7.20.4.6">7.20.4.6</a>).
+</ul>
+
+<h4><a name="J.3.3" href="#J.3.3">J.3.3 Identifiers</a></h4>
+<p><!--para 1 -->
+<ul>
+<li>  Which additional multibyte characters may appear in identifiers and their
+ correspondence to universal character names (<a href="#6.4.2">6.4.2</a>).
+<li>  The number of significant initial characters in an identifier (<a href="#5.2.4.1">5.2.4.1</a>, <a href="#6.4.2">6.4.2</a>).
+<!--page 518 -->
+</ul>
+
+<h4><a name="J.3.4" href="#J.3.4">J.3.4 Characters</a></h4>
+<p><!--para 1 -->
+<ul>
+<li>  The number of bits in a byte (<a href="#3.6">3.6</a>).
+<li>  The values of the members of the execution character set (<a href="#5.2.1">5.2.1</a>).
+<li>  The unique value of the member of the execution character set produced for each of
+ the standard alphabetic escape sequences (<a href="#5.2.2">5.2.2</a>).
+<li>  The value of a char object into which has been stored any character other than a
+ member of the basic execution character set (<a href="#6.2.5">6.2.5</a>).
+<li>  Which of signed char or unsigned char has the same range, representation,
+ and behavior as ''plain'' char (<a href="#6.2.5">6.2.5</a>, <a href="#6.3.1.1">6.3.1.1</a>).
+<li>  The mapping of members of the source character set (in character constants and string
+ literals) to members of the execution character set (<a href="#6.4.4.4">6.4.4.4</a>, <a href="#5.1.1.2">5.1.1.2</a>).
+<li>  The value of an integer character constant containing more than one character or
+ containing a character or escape sequence that does not map to a single-byte
+ execution character (<a href="#6.4.4.4">6.4.4.4</a>).
+<li>  The value of a wide character constant containing more than one multibyte character,
+ or containing a multibyte character or escape sequence not represented in the
+ extended execution character set (<a href="#6.4.4.4">6.4.4.4</a>).
+<li>  The current locale used to convert a wide character constant consisting of a single
+ multibyte character that maps to a member of the extended execution character set
+ into a corresponding wide character code (<a href="#6.4.4.4">6.4.4.4</a>).
+<li>  The current locale used to convert a wide string literal into corresponding wide
+ character codes (<a href="#6.4.5">6.4.5</a>).
+<li>  The value of a string literal containing a multibyte character or escape sequence not
+ represented in the execution character set (<a href="#6.4.5">6.4.5</a>).
+</ul>
+
+<h4><a name="J.3.5" href="#J.3.5">J.3.5 Integers</a></h4>
+<p><!--para 1 -->
+<ul>
+<li>  Any extended integer types that exist in the implementation (<a href="#6.2.5">6.2.5</a>).
+<li>  Whether signed integer types are represented using sign and magnitude, two's
+ complement, or ones' complement, and whether the extraordinary value is a trap
+ representation or an ordinary value (<a href="#6.2.6.2">6.2.6.2</a>).
+<li>  The rank of any extended integer type relative to another extended integer type with
+ the same precision (<a href="#6.3.1.1">6.3.1.1</a>).
+<li>  The result of, or the signal raised by, converting an integer to a signed integer type
+ when the value cannot be represented in an object of that type (<a href="#6.3.1.3">6.3.1.3</a>).
+<!--page 519 -->
+<li>  The results of some bitwise operations on signed integers (<a href="#6.5">6.5</a>).
+</ul>
+
+<h4><a name="J.3.6" href="#J.3.6">J.3.6 Floating point</a></h4>
+<p><!--para 1 -->
+<ul>
+<li>  The accuracy of the floating-point operations and of the library functions in
+ <a href="#7.12">&lt;math.h&gt;</a> and <a href="#7.3">&lt;complex.h&gt;</a> that return floating-point results (<a href="#5.2.4.2.2">5.2.4.2.2</a>).
+<li>  The accuracy of the conversions between floating-point internal representations and
+ string representations performed by the library functions in <a href="#7.19">&lt;stdio.h&gt;</a>,
+ <a href="#7.20">&lt;stdlib.h&gt;</a>, and <a href="#7.24">&lt;wchar.h&gt;</a> (<a href="#5.2.4.2.2">5.2.4.2.2</a>).
+<li>  The rounding behaviors characterized by non-standard values of FLT_ROUNDS
+ (<a href="#5.2.4.2.2">5.2.4.2.2</a>).
+<li>  The evaluation methods characterized by non-standard negative values of
+ FLT_EVAL_METHOD (<a href="#5.2.4.2.2">5.2.4.2.2</a>).
+<li>  The direction of rounding when an integer is converted to a floating-point number that
+ cannot exactly represent the original value (<a href="#6.3.1.4">6.3.1.4</a>).
+<li>  The direction of rounding when a floating-point number is converted to a narrower
+ floating-point number (<a href="#6.3.1.5">6.3.1.5</a>).
+<li>  How the nearest representable value or the larger or smaller representable value
+ immediately adjacent to the nearest representable value is chosen for certain floating
+ constants (<a href="#6.4.4.2">6.4.4.2</a>).
+<li>  Whether and how floating expressions are contracted when not disallowed by the
+ FP_CONTRACT pragma (<a href="#6.5">6.5</a>).
+<li>  The default state for the FENV_ACCESS pragma (<a href="#7.6.1">7.6.1</a>).
+<li>  Additional floating-point exceptions, rounding             modes,    environments,   and
+ classifications, and their macro names (<a href="#7.6">7.6</a>, <a href="#7.12">7.12</a>).
+<li>  The default state for the FP_CONTRACT pragma (<a href="#7.12.2">7.12.2</a>).                                    *
+</ul>
+
+<h4><a name="J.3.7" href="#J.3.7">J.3.7 Arrays and pointers</a></h4>
+<p><!--para 1 -->
+<ul>
+<li>  The result of converting a pointer to an integer or vice versa (<a href="#6.3.2.3">6.3.2.3</a>).
+<li>  The size of the result of subtracting two pointers to elements of the same array
+ (<a href="#6.5.6">6.5.6</a>).
+<!--page 520 -->
+</ul>
+
+<h4><a name="J.3.8" href="#J.3.8">J.3.8 Hints</a></h4>
+<p><!--para 1 -->
+<ul>
+<li>  The extent to which suggestions made by using the register storage-class
+ specifier are effective (<a href="#6.7.1">6.7.1</a>).
+<li>  The extent to which suggestions made by using the inline function specifier are
+ effective (<a href="#6.7.4">6.7.4</a>).
+</ul>
+
+<h4><a name="J.3.9" href="#J.3.9">J.3.9 Structures, unions, enumerations, and bit-fields</a></h4>
+<p><!--para 1 -->
+<ul>
+<li>  Whether a ''plain'' int bit-field is treated as a signed int bit-field or as an
+ unsigned int bit-field (<a href="#6.7.2">6.7.2</a>, <a href="#6.7.2.1">6.7.2.1</a>).
+<li>  Allowable bit-field types other than _Bool, signed int, and unsigned int
+ (<a href="#6.7.2.1">6.7.2.1</a>).
+<li>  Whether a bit-field can straddle a storage-unit boundary (<a href="#6.7.2.1">6.7.2.1</a>).
+<li>  The order of allocation of bit-fields within a unit (<a href="#6.7.2.1">6.7.2.1</a>).
+<li>  The alignment of non-bit-field members of structures (<a href="#6.7.2.1">6.7.2.1</a>). This should present
+ no problem unless binary data written by one implementation is read by another.
+<li>  The integer type compatible with each enumerated type (<a href="#6.7.2.2">6.7.2.2</a>).
+</ul>
+
+<h4><a name="J.3.10" href="#J.3.10">J.3.10 Qualifiers</a></h4>
+<p><!--para 1 -->
+<ul>
+<li>  What constitutes an access to an object that has volatile-qualified type (<a href="#6.7.3">6.7.3</a>).
+</ul>
+
+<h4><a name="J.3.11" href="#J.3.11">J.3.11 Preprocessing directives</a></h4>
+<p><!--para 1 -->
+<ul>
+<li>  The locations within #pragma directives where header name preprocessing tokens
+ are recognized (<a href="#6.4">6.4</a>, <a href="#6.4.7">6.4.7</a>).
+<li>  How sequences in both forms of header names are mapped to headers or external
+ source file names (<a href="#6.4.7">6.4.7</a>).
+<li>  Whether the value of a character constant in a constant expression that controls
+ conditional inclusion matches the value of the same character constant in the
+ execution character set (<a href="#6.10.1">6.10.1</a>).
+<li>  Whether the value of a single-character character constant in a constant expression
+ that controls conditional inclusion may have a negative value (<a href="#6.10.1">6.10.1</a>).
+<li>  The places that are searched for an included &lt; &gt; delimited header, and how the places
+ are specified or the header is identified (<a href="#6.10.2">6.10.2</a>).
+<li>  How the named source file is searched for in an included " " delimited header
+ (<a href="#6.10.2">6.10.2</a>).
+<li>  The method by which preprocessing tokens (possibly resulting from macro
+ expansion) in a #include directive are combined into a header name (<a href="#6.10.2">6.10.2</a>).
+<!--page 521 -->
+<li>  The nesting limit for #include processing (<a href="#6.10.2">6.10.2</a>).
+<li>  Whether the # operator inserts a \ character before the \ character that begins a
+ universal character name in a character constant or string literal (<a href="#6.10.3.2">6.10.3.2</a>).
+<li>  The behavior on each recognized non-STDC #pragma directive (<a href="#6.10.6">6.10.6</a>).
+<li>  The definitions for __DATE__ and __TIME__ when respectively, the date and
+ time of translation are not available (<a href="#6.10.8">6.10.8</a>).
+</ul>
+
+<h4><a name="J.3.12" href="#J.3.12">J.3.12 Library functions</a></h4>
+<p><!--para 1 -->
+<ul>
+<li>  Any library facilities available to a freestanding program, other than the minimal set
+ required by clause 4 (<a href="#5.1.2.1">5.1.2.1</a>).
+<li>  The format of the diagnostic printed by the assert macro (<a href="#7.2.1.1">7.2.1.1</a>).
+<li>  The representation of the floating-point               status   flags     stored   by   the
+ fegetexceptflag function (<a href="#7.6.2.2">7.6.2.2</a>).
+<li>  Whether the feraiseexcept function raises the ''inexact'' floating-point
+ exception in addition to the ''overflow'' or ''underflow'' floating-point exception
+ (<a href="#7.6.2.3">7.6.2.3</a>).
+<li>  Strings other than "C" and "" that may be passed as the second argument to the
+ setlocale function (<a href="#7.11.1.1">7.11.1.1</a>).
+<li>  The types defined for float_t and double_t when the value of the
+ FLT_EVAL_METHOD macro is less than 0 (<a href="#7.12">7.12</a>).
+<li>  Domain errors for the mathematics functions, other than those required by this
+ International Standard (<a href="#7.12.1">7.12.1</a>).
+<li>  The values returned by the mathematics functions on domain errors (<a href="#7.12.1">7.12.1</a>).
+<li>  The values returned by the mathematics functions on underflow range errors, whether
+ errno is set to the value of the macro ERANGE when the integer expression
+ math_errhandling &amp; MATH_ERRNO is nonzero, and whether the ''underflow''
+ floating-point exception is raised when the integer expression math_errhandling
+ &amp; MATH_ERREXCEPT is nonzero. (<a href="#7.12.1">7.12.1</a>).
+<li>  Whether a domain error occurs or zero is returned when an fmod function has a
+ second argument of zero (<a href="#7.12.10.1">7.12.10.1</a>).
+<li>  Whether a domain error occurs or zero is returned when a remainder function has
+ a second argument of zero (<a href="#7.12.10.2">7.12.10.2</a>).
+<li>  The base-2 logarithm of the modulus used by the remquo functions in reducing the
+ quotient (<a href="#7.12.10.3">7.12.10.3</a>).
+<!--page 522 -->
+<li>  Whether a domain error occurs or zero is returned when a remquo function has a
+ second argument of zero (<a href="#7.12.10.3">7.12.10.3</a>).
+<li>  Whether the equivalent of signal(sig, SIG_DFL); is executed prior to the call
+ of a signal handler, and, if not, the blocking of signals that is performed (<a href="#7.14.1.1">7.14.1.1</a>).
+<li>  The null pointer constant to which the macro NULL expands (<a href="#7.17">7.17</a>).
+<li>  Whether the last line of a text stream requires a terminating new-line character
+ (<a href="#7.19.2">7.19.2</a>).
+<li>  Whether space characters that are written out to a text stream immediately before a
+ new-line character appear when read in (<a href="#7.19.2">7.19.2</a>).
+<li>  The number of null characters that may be appended to data written to a binary
+ stream (<a href="#7.19.2">7.19.2</a>).
+<li>  Whether the file position indicator of an append-mode stream is initially positioned at
+ the beginning or end of the file (<a href="#7.19.3">7.19.3</a>).
+<li>  Whether a write on a text stream causes the associated file to be truncated beyond that
+ point (<a href="#7.19.3">7.19.3</a>).
+<li>  The characteristics of file buffering (<a href="#7.19.3">7.19.3</a>).
+<li>  Whether a zero-length file actually exists (<a href="#7.19.3">7.19.3</a>).
+<li>  The rules for composing valid file names (<a href="#7.19.3">7.19.3</a>).
+<li>  Whether the same file can be simultaneously open multiple times (<a href="#7.19.3">7.19.3</a>).
+<li>  The nature and choice of encodings used for multibyte characters in files (<a href="#7.19.3">7.19.3</a>).
+<li>  The effect of the remove function on an open file (<a href="#7.19.4.1">7.19.4.1</a>).
+<li>  The effect if a file with the new name exists prior to a call to the rename function
+ (<a href="#7.19.4.2">7.19.4.2</a>).
+<li>  Whether an open temporary file is removed upon abnormal program termination
+ (<a href="#7.19.4.3">7.19.4.3</a>).
+<li>  Which changes of mode are permitted (if any), and under what circumstances
+ (<a href="#7.19.5.4">7.19.5.4</a>).
+<li>  The style used to print an infinity or NaN, and the meaning of any n-char or n-wchar
+ sequence printed for a NaN (<a href="#7.19.6.1">7.19.6.1</a>, <a href="#7.24.2.1">7.24.2.1</a>).
+<li>  The output for %p conversion in the fprintf or fwprintf function (<a href="#7.19.6.1">7.19.6.1</a>,
+ <a href="#7.24.2.1">7.24.2.1</a>).
+<li>  The interpretation of a - character that is neither the first nor the last character, nor
+   the second where a ^ character is the first, in the scanlist for %[ conversion in the
+  fscanf or fwscanf function (<a href="#7.19.6.2">7.19.6.2</a>, <a href="#7.24.2.1">7.24.2.1</a>).
+<!--page 523 -->
+<li>  The set of sequences matched by a %p conversion and the interpretation of the
+ corresponding input item in the fscanf or fwscanf function (<a href="#7.19.6.2">7.19.6.2</a>, <a href="#7.24.2.2">7.24.2.2</a>).
+<li>  The value to which the macro errno is set by the fgetpos, fsetpos, or ftell
+ functions on failure (<a href="#7.19.9.1">7.19.9.1</a>, <a href="#7.19.9.3">7.19.9.3</a>, <a href="#7.19.9.4">7.19.9.4</a>).
+<li>  The meaning of any n-char or n-wchar sequence in a string representing a NaN that is
+ converted by the strtod, strtof, strtold, wcstod, wcstof, or wcstold
+ function (<a href="#7.20.1.3">7.20.1.3</a>, <a href="#7.24.4.1.1">7.24.4.1.1</a>).
+<li>  Whether or not the strtod, strtof, strtold, wcstod, wcstof, or wcstold
+ function sets errno to ERANGE when underflow occurs (<a href="#7.20.1.3">7.20.1.3</a>, <a href="#7.24.4.1.1">7.24.4.1.1</a>).
+<li>  Whether the calloc, malloc, and realloc functions return a null pointer or a
+ pointer to an allocated object when the size requested is zero (<a href="#7.20.3">7.20.3</a>).
+<li>  Whether open streams with unwritten buffered data are flushed, open streams are
+ closed, or temporary files are removed when the abort or _Exit function is called
+ (<a href="#7.20.4.1">7.20.4.1</a>, <a href="#7.20.4.4">7.20.4.4</a>).
+<li>  The termination status returned to the host environment by the abort, exit, or
+ _Exit function (<a href="#7.20.4.1">7.20.4.1</a>, <a href="#7.20.4.3">7.20.4.3</a>, <a href="#7.20.4.4">7.20.4.4</a>).
+<li>  The value returned by the system function when its argument is not a null pointer
+ (<a href="#7.20.4.6">7.20.4.6</a>).
+<li>  The local time zone and Daylight Saving Time (<a href="#7.23.1">7.23.1</a>).
+<li>  The range and precision of times representable in clock_t and time_t (<a href="#7.23">7.23</a>).
+<li>  The era for the clock function (<a href="#7.23.2.1">7.23.2.1</a>).
+<li>  The replacement string for the %Z specifier to the strftime, and wcsftime
+ functions in the "C" locale (<a href="#7.23.3.5">7.23.3.5</a>, <a href="#7.24.5.1">7.24.5.1</a>).
+<li>  Whether the functions in <a href="#7.12">&lt;math.h&gt;</a> honor the rounding direction mode in an
+ IEC 60559 conformant implementation, unless explicitly specified otherwise (<a href="#F.9">F.9</a>).
+</ul>
+
+<h4><a name="J.3.13" href="#J.3.13">J.3.13 Architecture</a></h4>
+<p><!--para 1 -->
+<ul>
+<li>  The values or expressions assigned to the macros specified in the headers
+ <a href="#7.7">&lt;float.h&gt;</a>, <a href="#7.10">&lt;limits.h&gt;</a>, and <a href="#7.18">&lt;stdint.h&gt;</a> (<a href="#5.2.4.2">5.2.4.2</a>, <a href="#7.18.2">7.18.2</a>, <a href="#7.18.3">7.18.3</a>).
+<li>  The number, order, and encoding of bytes in any object (when not explicitly specified
+ in this International Standard) (<a href="#6.2.6.1">6.2.6.1</a>).
+<li>  The value of the result of the sizeof operator (<a href="#6.5.3.4">6.5.3.4</a>).
+<!--page 524 -->
+</ul>
+
+<h3><a name="J.4" href="#J.4">J.4 Locale-specific behavior</a></h3>
+<p><!--para 1 -->
+ The following characteristics of a hosted environment are locale-specific and are required
+ to be documented by the implementation:
+<ul>
+<li>  Additional members of the source and execution character sets beyond the basic
+ character set (<a href="#5.2.1">5.2.1</a>).
+<li>  The presence, meaning, and representation of additional multibyte characters in the
+ execution character set beyond the basic character set (<a href="#5.2.1.2">5.2.1.2</a>).
+<li>  The shift states used for the encoding of multibyte characters (<a href="#5.2.1.2">5.2.1.2</a>).
+<li>  The direction of writing of successive printing characters (<a href="#5.2.2">5.2.2</a>).
+<li>  The decimal-point character (<a href="#7.1.1">7.1.1</a>).
+<li>  The set of printing characters (<a href="#7.4">7.4</a>, <a href="#7.25.2">7.25.2</a>).
+<li>  The set of control characters (<a href="#7.4">7.4</a>, <a href="#7.25.2">7.25.2</a>).
+<li>  The sets of characters tested for by the isalpha, isblank, islower, ispunct,
+ isspace, isupper, iswalpha, iswblank, iswlower, iswpunct,
+ iswspace, or iswupper functions (<a href="#7.4.1.2">7.4.1.2</a>, <a href="#7.4.1.3">7.4.1.3</a>, <a href="#7.4.1.7">7.4.1.7</a>, <a href="#7.4.1.9">7.4.1.9</a>, <a href="#7.4.1.10">7.4.1.10</a>,
+ <a href="#7.4.1.11">7.4.1.11</a>, <a href="#7.25.2.1.2">7.25.2.1.2</a>, <a href="#7.25.2.1.3">7.25.2.1.3</a>, <a href="#7.25.2.1.7">7.25.2.1.7</a>, <a href="#7.25.2.1.9">7.25.2.1.9</a>, <a href="#7.25.2.1.10">7.25.2.1.10</a>, <a href="#7.25.2.1.11">7.25.2.1.11</a>).
+<li>  The native environment (<a href="#7.11.1.1">7.11.1.1</a>).
+<li>  Additional subject sequences accepted by the numeric conversion functions (<a href="#7.20.1">7.20.1</a>,
+ <a href="#7.24.4.1">7.24.4.1</a>).
+<li>  The collation sequence of the execution character set (<a href="#7.21.4.3">7.21.4.3</a>, <a href="#7.24.4.4.2">7.24.4.4.2</a>).
+<li>  The contents of the error message strings set up by the strerror function
+ (<a href="#7.21.6.2">7.21.6.2</a>).
+<li>  The formats for time and date (<a href="#7.23.3.5">7.23.3.5</a>, <a href="#7.24.5.1">7.24.5.1</a>).
+<li>  Character mappings that are supported by the towctrans function (<a href="#7.25.1">7.25.1</a>).
+<li>  Character classifications that are supported by the iswctype function (<a href="#7.25.1">7.25.1</a>).
+<!--page 525 -->
+</ul>
+
+<h3><a name="J.5" href="#J.5">J.5 Common extensions</a></h3>
+<p><!--para 1 -->
+ The following extensions are widely used in many systems, but are not portable to all
+ implementations. The inclusion of any extension that may cause a strictly conforming
+ program to become invalid renders an implementation nonconforming. Examples of such
+ extensions are new keywords, extra library functions declared in standard headers, or
+ predefined macros with names that do not begin with an underscore.
+
+<h4><a name="J.5.1" href="#J.5.1">J.5.1 Environment arguments</a></h4>
+<p><!--para 1 -->
+ In a hosted environment, the main function receives a third argument, char *envp[],
+ that points to a null-terminated array of pointers to char, each of which points to a string
+ that provides information about the environment for this execution of the program
+ (<a href="#5.1.2.2.1">5.1.2.2.1</a>).
+
+<h4><a name="J.5.2" href="#J.5.2">J.5.2 Specialized identifiers</a></h4>
+<p><!--para 1 -->
+ Characters other than the underscore _, letters, and digits, that are not part of the basic
+ source character set (such as the dollar sign $, or characters in national character sets)
+ may appear in an identifier (<a href="#6.4.2">6.4.2</a>).
+
+<h4><a name="J.5.3" href="#J.5.3">J.5.3 Lengths and cases of identifiers</a></h4>
+<p><!--para 1 -->
+ All characters in identifiers (with or without external linkage) are significant (<a href="#6.4.2">6.4.2</a>).
+
+<h4><a name="J.5.4" href="#J.5.4">J.5.4 Scopes of identifiers</a></h4>
+<p><!--para 1 -->
+ A function identifier, or the identifier of an object the declaration of which contains the
+ keyword extern, has file scope (<a href="#6.2.1">6.2.1</a>).
+
+<h4><a name="J.5.5" href="#J.5.5">J.5.5 Writable string literals</a></h4>
+<p><!--para 1 -->
+ String literals are modifiable (in which case, identical string literals should denote distinct
+ objects) (<a href="#6.4.5">6.4.5</a>).
+
+<h4><a name="J.5.6" href="#J.5.6">J.5.6 Other arithmetic types</a></h4>
+<p><!--para 1 -->
+ Additional arithmetic types, such as __int128 or double double, and their
+ appropriate conversions are defined (<a href="#6.2.5">6.2.5</a>, <a href="#6.3.1">6.3.1</a>). Additional floating types may have
+ more range or precision than long double, may be used for evaluating expressions of
+ other floating types, and may be used to define float_t or double_t.
+<!--page 526 -->
+
+<h4><a name="J.5.7" href="#J.5.7">J.5.7 Function pointer casts</a></h4>
+<p><!--para 1 -->
+ A pointer to an object or to void may be cast to a pointer to a function, allowing data to
+ be invoked as a function (<a href="#6.5.4">6.5.4</a>).
+<p><!--para 2 -->
+ A pointer to a function may be cast to a pointer to an object or to void, allowing a
+ function to be inspected or modified (for example, by a debugger) (<a href="#6.5.4">6.5.4</a>).
+
+<h4><a name="J.5.8" href="#J.5.8">J.5.8 Extended bit-field types</a></h4>
+<p><!--para 1 -->
+ A bit-field may be declared with a type other than _Bool, unsigned int, or
+ signed int, with an appropriate maximum width (<a href="#6.7.2.1">6.7.2.1</a>).
+
+<h4><a name="J.5.9" href="#J.5.9">J.5.9 The fortran keyword</a></h4>
+<p><!--para 1 -->
+ The fortran function specifier may be used in a function declaration to indicate that
+ calls suitable for FORTRAN should be generated, or that a different representation for the
+ external name is to be generated (<a href="#6.7.4">6.7.4</a>).
+
+<h4><a name="J.5.10" href="#J.5.10">J.5.10 The asm keyword</a></h4>
+<p><!--para 1 -->
+ The asm keyword may be used to insert assembly language directly into the translator
+ output (<a href="#6.8">6.8</a>). The most common implementation is via a statement of the form:
+<pre>
+        asm ( character-string-literal );
+</pre>
+
+<h4><a name="J.5.11" href="#J.5.11">J.5.11 Multiple external definitions</a></h4>
+<p><!--para 1 -->
+ There may be more than one external definition for the identifier of an object, with or
+ without the explicit use of the keyword extern; if the definitions disagree, or more than
+ one is initialized, the behavior is undefined (<a href="#6.9.2">6.9.2</a>).
+
+<h4><a name="J.5.12" href="#J.5.12">J.5.12 Predefined macro names</a></h4>
+<p><!--para 1 -->
+ Macro names that do not begin with an underscore, describing the translation and
+ execution environments, are defined by the implementation before translation begins
+ (<a href="#6.10.8">6.10.8</a>).
+
+<h4><a name="J.5.13" href="#J.5.13">J.5.13 Floating-point status flags</a></h4>
+<p><!--para 1 -->
+ If any floating-point status flags are set on normal termination after all calls to functions
+ registered by the atexit function have been made (see <a href="#7.20.4.3">7.20.4.3</a>), the implementation
+ writes some diagnostics indicating the fact to the stderr stream, if it is still open,
+<!--page 527 -->
+
+<h4><a name="J.5.14" href="#J.5.14">J.5.14 Extra arguments for signal handlers</a></h4>
+<p><!--para 1 -->
+ Handlers for specific signals are called with extra arguments in addition to the signal
+ number (<a href="#7.14.1.1">7.14.1.1</a>).
+
+<h4><a name="J.5.15" href="#J.5.15">J.5.15 Additional stream types and file-opening modes</a></h4>
+<p><!--para 1 -->
+ Additional mappings from files to streams are supported (<a href="#7.19.2">7.19.2</a>).
+<p><!--para 2 -->
+ Additional file-opening modes may be specified by characters appended to the mode
+ argument of the fopen function (<a href="#7.19.5.3">7.19.5.3</a>).
+
+<h4><a name="J.5.16" href="#J.5.16">J.5.16 Defined file position indicator</a></h4>
+<p><!--para 1 -->
+ The file position indicator is decremented by each successful call to the ungetc or
+ ungetwc function for a text stream, except if its value was zero before a call (<a href="#7.19.7.11">7.19.7.11</a>,
+ <a href="#7.24.3.10">7.24.3.10</a>).
+
+<h4><a name="J.5.17" href="#J.5.17">J.5.17 Math error reporting</a></h4>
+<p><!--para 1 -->
+ Functions declared in <a href="#7.3">&lt;complex.h&gt;</a> and <a href="#7.12">&lt;math.h&gt;</a> raise SIGFPE to report errors
+ instead of, or in addition to, setting errno or raising floating-point exceptions (<a href="#7.3">7.3</a>,
+ <a href="#7.12">7.12</a>).
+<!--page 528 -->
+
+<h2><a name="Bibliography" href="#Bibliography">Bibliography</a></h2>
+<ol>
+<li>  ''The C Reference Manual'' by Dennis M. Ritchie, a version of which was
+ published in The C Programming Language by Brian W. Kernighan and Dennis
+ M. Ritchie, Prentice-Hall, Inc., (1978). Copyright owned by AT&amp;T.
+<li>  1984 /usr/group Standard by the /usr/group Standards Committee, Santa Clara,
+ California, USA, November 1984.
+<li>  ANSI X3/TR-1-82 (1982), American National Dictionary for Information
+ Processing Systems, Information Processing Systems Technical Report.
+<li>  ANSI/IEEE 754-1985, American National Standard for Binary Floating-Point
+ Arithmetic.
+<li>  ANSI/IEEE 854-1988, American National Standard for Radix-Independent
+ Floating-Point Arithmetic.
+<li>  IEC 60559:1989, Binary floating-point arithmetic for microprocessor systems,
+ second edition (previously designated IEC 559:1989).
+<li>  ISO 31-11:1992, Quantities and units -- Part 11: Mathematical signs and
+ symbols for use in the physical sciences and technology.
+<li>  ISO/IEC 646:1991, Information technology -- ISO 7-bit coded character set for
+ information interchange.
+<li>  ISO/IEC 2382-1:1993, Information technology -- Vocabulary -- Part 1:
+ Fundamental terms.
+<li>  ISO 4217:1995, Codes for the representation of currencies and funds.
+<li>  ISO 8601:1988, Data elements and interchange formats -- Information
+ interchange -- Representation of dates and times.
+<li>  ISO/IEC 9899:1990, Programming languages -- C.
+<li>  ISO/IEC 9899/COR1:1994, Technical Corrigendum 1.
+<li>  ISO/IEC 9899/COR2:1996, Technical Corrigendum 2.
+<li>  ISO/IEC 9899/AMD1:1995, Amendment 1 to ISO/IEC 9899:1990 C Integrity.
+<li>  ISO/IEC 9945-2:1993, Information technology -- Portable Operating System
+ Interface (POSIX) -- Part 2: Shell and Utilities.
+<li>  ISO/IEC TR 10176:1998, Information technology -- Guidelines for the
+ preparation of programming language standards.
+<li>  ISO/IEC 10646-1:1993, Information technology -- Universal Multiple-Octet
+ Coded Character Set (UCS) -- Part 1: Architecture and Basic Multilingual Plane.
+<!--page 529 -->
+<li>  ISO/IEC 10646-1/COR1:1996,      Technical       Corrigendum      1      to
+ ISO/IEC 10646-1:1993.
+<li>  ISO/IEC 10646-1/COR2:1998,      Technical       Corrigendum      2      to
+ ISO/IEC 10646-1:1993.
+<li>  ISO/IEC 10646-1/AMD1:1996, Amendment 1 to ISO/IEC 10646-1:1993
+ Transformation Format for 16 planes of group 00 (UTF-16).
+<li>  ISO/IEC 10646-1/AMD2:1996, Amendment 2 to ISO/IEC 10646-1:1993 UCS
+ Transformation Format 8 (UTF-8).
+<li>  ISO/IEC 10646-1/AMD3:1996, Amendment 3 to ISO/IEC 10646-1:1993.
+<li>  ISO/IEC 10646-1/AMD4:1996, Amendment 4 to ISO/IEC 10646-1:1993.
+<li>  ISO/IEC 10646-1/AMD5:1998, Amendment 5 to ISO/IEC 10646-1:1993 Hangul
+ syllables.
+<li>  ISO/IEC 10646-1/AMD6:1997, Amendment 6 to ISO/IEC 10646-1:1993 Tibetan.
+<li>  ISO/IEC 10646-1/AMD7:1997, Amendment 7 to ISO/IEC 10646-1:1993 33
+ additional characters.
+<li>  ISO/IEC 10646-1/AMD8:1997, Amendment 8 to ISO/IEC 10646-1:1993.
+<li>  ISO/IEC 10646-1/AMD9:1997,    Amendment     9   to    ISO/IEC 10646-1:1993
+ Identifiers for characters.
+<li>  ISO/IEC 10646-1/AMD10:1998, Amendment 10 to ISO/IEC 10646-1:1993
+ Ethiopic.
+<li>  ISO/IEC 10646-1/AMD11:1998, Amendment 11 to ISO/IEC 10646-1:1993
+ Unified Canadian Aboriginal Syllabics.
+<li>  ISO/IEC 10646-1/AMD12:1998, Amendment 12 to ISO/IEC 10646-1:1993
+ Cherokee.
+<li>  ISO/IEC 10967-1:1994, Information technology -- Language independent
+ arithmetic -- Part 1: Integer and floating point arithmetic.
+<!--page 530 -->
+<!--page 531 -->
+</ol>
+
+<h2><a name="Index" href="#Index">Index</a></h2>
+<pre>
+ ??? x ???, <a href="#3.18">3.18</a>                                                    , (comma punctuator), <a href="#6.5.2">6.5.2</a>, <a href="#6.7">6.7</a>, <a href="#6.7.2.1">6.7.2.1</a>, <a href="#6.7.2.2">6.7.2.2</a>,
+                                                                     <a href="#6.7.2.3">6.7.2.3</a>, <a href="#6.7.8">6.7.8</a>
+ ??? x ???, <a href="#3.19">3.19</a>                                                    - (subtraction operator), <a href="#6.5.6">6.5.6</a>, <a href="#F.3">F.3</a>, <a href="#G.5.2">G.5.2</a>
+ ! (logical negation operator), <a href="#6.5.3.3">6.5.3.3</a>                         - (unary minus operator), <a href="#6.5.3.3">6.5.3.3</a>, <a href="#F.3">F.3</a>
+ != (inequality operator), <a href="#6.5.9">6.5.9</a>                                -- (postfix decrement operator), <a href="#6.3.2.1">6.3.2.1</a>, <a href="#6.5.2.4">6.5.2.4</a>
+ # operator, <a href="#6.10.3.2">6.10.3.2</a>                                           -- (prefix decrement operator), <a href="#6.3.2.1">6.3.2.1</a>, <a href="#6.5.3.1">6.5.3.1</a>
+ # preprocessing directive, <a href="#6.10.7">6.10.7</a>                              -= (subtraction assignment operator), <a href="#6.5.16.2">6.5.16.2</a>
+ # punctuator, <a href="#6.10">6.10</a>                                             -&gt; (structure/union pointer operator), <a href="#6.5.2.3">6.5.2.3</a>
+ ## operator, <a href="#6.10.3.3">6.10.3.3</a>                                          . (structure/union member operator), <a href="#6.3.2.1">6.3.2.1</a>,
+ #define preprocessing directive, <a href="#6.10.3">6.10.3</a>                             <a href="#6.5.2.3">6.5.2.3</a>
+ #elif preprocessing directive, <a href="#6.10.1">6.10.1</a>                          . punctuator, <a href="#6.7.8">6.7.8</a>
+ #else preprocessing directive, <a href="#6.10.1">6.10.1</a>                          ... (ellipsis punctuator), <a href="#6.5.2.2">6.5.2.2</a>, <a href="#6.7.5.3">6.7.5.3</a>, <a href="#6.10.3">6.10.3</a>
+ #endif preprocessing directive, <a href="#6.10.1">6.10.1</a>                         / (division operator), <a href="#6.5.5">6.5.5</a>, <a href="#F.3">F.3</a>, <a href="#G.5.1">G.5.1</a>
+ #error preprocessing directive, <a href="#4">4</a>, <a href="#6.10.5">6.10.5</a>                      /* */ (comment delimiters), <a href="#6.4.9">6.4.9</a>
+ #if preprocessing directive, <a href="#5.2.4.2.1">5.2.4.2.1</a>, <a href="#5.2.4.2.2">5.2.4.2.2</a>,             // (comment delimiter), <a href="#6.4.9">6.4.9</a>
+      <a href="#6.10.1">6.10.1</a>, <a href="#7.1.4">7.1.4</a>                                             /= (division assignment operator), <a href="#6.5.16.2">6.5.16.2</a>
+ #ifdef preprocessing directive, <a href="#6.10.1">6.10.1</a>                         : (colon punctuator), <a href="#6.7.2.1">6.7.2.1</a>
+ #ifndef preprocessing directive, <a href="#6.10.1">6.10.1</a>                        :&gt; (alternative spelling of ]), <a href="#6.4.6">6.4.6</a>
+ #include preprocessing directive, <a href="#5.1.1.2">5.1.1.2</a>,                     ; (semicolon punctuator), <a href="#6.7">6.7</a>, <a href="#6.7.2.1">6.7.2.1</a>, <a href="#6.8.3">6.8.3</a>,
+      <a href="#6.10.2">6.10.2</a>                                                         <a href="#6.8.5">6.8.5</a>, <a href="#6.8.6">6.8.6</a>
+ #line preprocessing directive, <a href="#6.10.4">6.10.4</a>                          &lt; (less-than operator), <a href="#6.5.8">6.5.8</a>
+ #pragma preprocessing directive, <a href="#6.10.6">6.10.6</a>                        &lt;% (alternative spelling of {), <a href="#6.4.6">6.4.6</a>
+ #undef preprocessing directive, <a href="#6.10.3.5">6.10.3.5</a>, <a href="#7.1.3">7.1.3</a>,               &lt;: (alternative spelling of [), <a href="#6.4.6">6.4.6</a>
+      <a href="#7.1.4">7.1.4</a>                                                     &lt;&lt; (left-shift operator), <a href="#6.5.7">6.5.7</a>
+ % (remainder operator), <a href="#6.5.5">6.5.5</a>                                  &lt;&lt;= (left-shift assignment operator), <a href="#6.5.16.2">6.5.16.2</a>
+ %: (alternative spelling of #), <a href="#6.4.6">6.4.6</a>                          &lt;= (less-than-or-equal-to operator), <a href="#6.5.8">6.5.8</a>
+ %:%: (alternative spelling of ##), <a href="#6.4.6">6.4.6</a>                       <a href="#7.2">&lt;assert.h&gt;</a> header, <a href="#7.2">7.2</a>, <a href="#B.1">B.1</a>
+ %= (remainder assignment operator), <a href="#6.5.16.2">6.5.16.2</a>                   <a href="#7.3">&lt;complex.h&gt;</a> header, <a href="#5.2.4.2.2">5.2.4.2.2</a>, <a href="#7.3">7.3</a>, <a href="#7.22">7.22</a>,
+ %&gt; (alternative spelling of }), <a href="#6.4.6">6.4.6</a>                               <a href="#7.26.1">7.26.1</a>, <a href="#G.6">G.6</a>, <a href="#J.5.17">J.5.17</a>
+ &amp; (address operator), <a href="#6.3.2.1">6.3.2.1</a>, <a href="#6.5.3.2">6.5.3.2</a>                         <a href="#7.4">&lt;ctype.h&gt;</a> header, <a href="#7.4">7.4</a>, <a href="#7.26.2">7.26.2</a>
+ &amp; (bitwise AND operator), <a href="#6.5.10">6.5.10</a>                               <a href="#7.5">&lt;errno.h&gt;</a> header, <a href="#7.5">7.5</a>, <a href="#7.26.3">7.26.3</a>
+ &amp;&amp; (logical AND operator), <a href="#6.5.13">6.5.13</a>                              <a href="#7.6">&lt;fenv.h&gt;</a> header, <a href="#5.1.2.3">5.1.2.3</a>, <a href="#5.2.4.2.2">5.2.4.2.2</a>, <a href="#7.6">7.6</a>, <a href="#7.12">7.12</a>, <a href="#F">F</a>,
+ &amp;= (bitwise AND assignment operator), <a href="#6.5.16.2">6.5.16.2</a>                      <a href="#H">H</a>
+ ' ' (space character), <a href="#5.1.1.2">5.1.1.2</a>, <a href="#5.2.1">5.2.1</a>, <a href="#6.4">6.4</a>, <a href="#7.4.1.3">7.4.1.3</a>,           <a href="#7.7">&lt;float.h&gt;</a> header, <a href="#4">4</a>, <a href="#5.2.4.2.2">5.2.4.2.2</a>, <a href="#7.7">7.7</a>, <a href="#7.20.1.3">7.20.1.3</a>,
+      <a href="#7.4.1.10">7.4.1.10</a>, <a href="#7.25.2.1.3">7.25.2.1.3</a>                                           <a href="#7.24.4.1.1">7.24.4.1.1</a>
+ ( ) (cast operator), <a href="#6.5.4">6.5.4</a>                                     <a href="#7.8">&lt;inttypes.h&gt;</a> header, <a href="#7.8">7.8</a>, <a href="#7.26.4">7.26.4</a>
+ ( ) (function-call operator), <a href="#6.5.2.2">6.5.2.2</a>                          <a href="#7.9">&lt;iso646.h&gt;</a> header, <a href="#4">4</a>, <a href="#7.9">7.9</a>
+ ( ) (parentheses punctuator), <a href="#6.7.5.3">6.7.5.3</a>, <a href="#6.8.4">6.8.4</a>, <a href="#6.8.5">6.8.5</a>            <a href="#7.10">&lt;limits.h&gt;</a> header, <a href="#4">4</a>, <a href="#5.2.4.2.1">5.2.4.2.1</a>, <a href="#6.2.5">6.2.5</a>, <a href="#7.10">7.10</a>
+ ( ){ } (compound-literal operator), <a href="#6.5.2.5">6.5.2.5</a>                    <a href="#7.11">&lt;locale.h&gt;</a> header, <a href="#7.11">7.11</a>, <a href="#7.26.5">7.26.5</a>
+ * (asterisk punctuator), <a href="#6.7.5.1">6.7.5.1</a>, <a href="#6.7.5.2">6.7.5.2</a>                      <a href="#7.12">&lt;math.h&gt;</a> header, <a href="#5.2.4.2.2">5.2.4.2.2</a>, <a href="#6.5">6.5</a>, <a href="#7.12">7.12</a>, <a href="#7.22">7.22</a>, <a href="#F">F</a>,
+ * (indirection operator), <a href="#6.5.2.1">6.5.2.1</a>, <a href="#6.5.3.2">6.5.3.2</a>                          <a href="#F.9">F.9</a>, <a href="#J.5.17">J.5.17</a>
+ * (multiplication operator), <a href="#6.5.5">6.5.5</a>, <a href="#F.3">F.3</a>, <a href="#G.5.1">G.5.1</a>                 <a href="#7.13">&lt;setjmp.h&gt;</a> header, <a href="#7.13">7.13</a>
+ *= (multiplication assignment operator), <a href="#6.5.16.2">6.5.16.2</a>              <a href="#7.14">&lt;signal.h&gt;</a> header, <a href="#7.14">7.14</a>, <a href="#7.26.6">7.26.6</a>
+ + (addition operator), <a href="#6.5.2.1">6.5.2.1</a>, <a href="#6.5.3.2">6.5.3.2</a>, <a href="#6.5.6">6.5.6</a>, <a href="#F.3">F.3</a>,           <a href="#7.15">&lt;stdarg.h&gt;</a> header, <a href="#4">4</a>, <a href="#6.7.5.3">6.7.5.3</a>, <a href="#7.15">7.15</a>
+      <a href="#G.5.2">G.5.2</a>                                                     <a href="#7.16">&lt;stdbool.h&gt;</a> header, <a href="#4">4</a>, <a href="#7.16">7.16</a>, <a href="#7.26.7">7.26.7</a>, <a href="#H">H</a>
+ + (unary plus operator), <a href="#6.5.3.3">6.5.3.3</a>                               <a href="#7.17">&lt;stddef.h&gt;</a> header, <a href="#4">4</a>, <a href="#6.3.2.1">6.3.2.1</a>, <a href="#6.3.2.3">6.3.2.3</a>, <a href="#6.4.4.4">6.4.4.4</a>,
+ ++ (postfix increment operator), <a href="#6.3.2.1">6.3.2.1</a>, <a href="#6.5.2.4">6.5.2.4</a>                    <a href="#6.4.5">6.4.5</a>, <a href="#6.5.3.4">6.5.3.4</a>, <a href="#6.5.6">6.5.6</a>, <a href="#7.17">7.17</a>
+ ++ (prefix increment operator), <a href="#6.3.2.1">6.3.2.1</a>, <a href="#6.5.3.1">6.5.3.1</a>                <a href="#7.18">&lt;stdint.h&gt;</a> header, <a href="#4">4</a>, <a href="#5.2.4.2">5.2.4.2</a>, <a href="#6.10.1">6.10.1</a>, <a href="#7.8">7.8</a>,
+ += (addition assignment operator), <a href="#6.5.16.2">6.5.16.2</a>                         <a href="#7.18">7.18</a>, <a href="#7.26.8">7.26.8</a>
+ , (comma operator), <a href="#6.5.17">6.5.17</a>
+<!--page 532 -->
+ <a href="#7.19">&lt;stdio.h&gt;</a> header, <a href="#5.2.4.2.2">5.2.4.2.2</a>, <a href="#7.19">7.19</a>, <a href="#7.26.9">7.26.9</a>, <a href="#F">F</a>                 __cplusplus macro, <a href="#6.10.8">6.10.8</a>
+ <a href="#7.20">&lt;stdlib.h&gt;</a> header, <a href="#5.2.4.2.2">5.2.4.2.2</a>, <a href="#7.20">7.20</a>, <a href="#7.26.10">7.26.10</a>, <a href="#F">F</a>               __DATE__ macro, <a href="#6.10.8">6.10.8</a>
+ <a href="#7.21">&lt;string.h&gt;</a> header, <a href="#7.21">7.21</a>, <a href="#7.26.11">7.26.11</a>                             __FILE__ macro, <a href="#6.10.8">6.10.8</a>, <a href="#7.2.1.1">7.2.1.1</a>
+ <a href="#7.22">&lt;tgmath.h&gt;</a> header, <a href="#7.22">7.22</a>, <a href="#G.7">G.7</a>                                 __func__ identifier, <a href="#6.4.2.2">6.4.2.2</a>, <a href="#7.2.1.1">7.2.1.1</a>
+ <a href="#7.23">&lt;time.h&gt;</a> header, <a href="#7.23">7.23</a>                                        __LINE__ macro, <a href="#6.10.8">6.10.8</a>, <a href="#7.2.1.1">7.2.1.1</a>
+ <a href="#7.24">&lt;wchar.h&gt;</a> header, <a href="#5.2.4.2.2">5.2.4.2.2</a>, <a href="#7.19.1">7.19.1</a>, <a href="#7.24">7.24</a>,                   __STDC_, <a href="#6.11.9">6.11.9</a>
+      <a href="#7.26.12">7.26.12</a>, <a href="#F">F</a>                                              __STDC__ macro, <a href="#6.10.8">6.10.8</a>
+ <a href="#7.25">&lt;wctype.h&gt;</a> header, <a href="#7.25">7.25</a>, <a href="#7.26.13">7.26.13</a>                             __STDC_CONSTANT_MACROS macro, <a href="#7.18.4">7.18.4</a>
+ = (equal-sign punctuator), <a href="#6.7">6.7</a>, <a href="#6.7.2.2">6.7.2.2</a>, <a href="#6.7.8">6.7.8</a>               __STDC_FORMAT_MACROS macro, <a href="#7.8.1">7.8.1</a>
+ = (simple assignment operator), <a href="#6.5.16.1">6.5.16.1</a>                     __STDC_HOSTED__ macro, <a href="#6.10.8">6.10.8</a>
+ == (equality operator), <a href="#6.5.9">6.5.9</a>                                __STDC_IEC_559__ macro, <a href="#6.10.8">6.10.8</a>, <a href="#F.1">F.1</a>
+ &gt; (greater-than operator), <a href="#6.5.8">6.5.8</a>                             __STDC_IEC_559_COMPLEX__ macro,
+ &gt;= (greater-than-or-equal-to operator), <a href="#6.5.8">6.5.8</a>                     <a href="#6.10.8">6.10.8</a>, <a href="#G.1">G.1</a>
+ &gt;&gt; (right-shift operator), <a href="#6.5.7">6.5.7</a>                             __STDC_ISO_10646__ macro, <a href="#6.10.8">6.10.8</a>
+ &gt;&gt;= (right-shift assignment operator), <a href="#6.5.16.2">6.5.16.2</a>              __STDC_LIMIT_MACROS macro, <a href="#7.18.2">7.18.2</a>,
+ ? : (conditional operator), <a href="#6.5.15">6.5.15</a>                                <a href="#7.18.3">7.18.3</a>
+ ?? (trigraph sequences), <a href="#5.2.1.1">5.2.1.1</a>                             __STDC_MB_MIGHT_NEQ_WC__ macro,
+ [ ] (array subscript operator), <a href="#6.5.2.1">6.5.2.1</a>, <a href="#6.5.3.2">6.5.3.2</a>                  <a href="#6.10.8">6.10.8</a>, <a href="#7.17">7.17</a>
+ [ ] (brackets punctuator), <a href="#6.7.5.2">6.7.5.2</a>, <a href="#6.7.8">6.7.8</a>                    __STDC_VERSION__ macro, <a href="#6.10.8">6.10.8</a>
+ \ (backslash character), <a href="#5.1.1.2">5.1.1.2</a>, <a href="#5.2.1">5.2.1</a>, <a href="#6.4.4.4">6.4.4.4</a>             __TIME__ macro, <a href="#6.10.8">6.10.8</a>
+ \ (escape character), <a href="#6.4.4.4">6.4.4.4</a>                                __VA_ARGS__ identifier, <a href="#6.10.3">6.10.3</a>, <a href="#6.10.3.1">6.10.3.1</a>
+ \" (double-quote escape sequence), <a href="#6.4.4.4">6.4.4.4</a>,                  _Bool type, <a href="#6.2.5">6.2.5</a>, <a href="#6.3.1.1">6.3.1.1</a>, <a href="#6.3.1.2">6.3.1.2</a>, <a href="#6.7.2">6.7.2</a>
+      <a href="#6.4.5">6.4.5</a>, <a href="#6.10.9">6.10.9</a>                                           _Bool type conversions, <a href="#6.3.1.2">6.3.1.2</a>
+ \\ (backslash escape sequence), <a href="#6.4.4.4">6.4.4.4</a>, <a href="#6.10.9">6.10.9</a>              _Complex types, <a href="#6.2.5">6.2.5</a>, <a href="#6.7.2">6.7.2</a>, <a href="#7.3.1">7.3.1</a>, <a href="#G">G</a>
+ \' (single-quote escape sequence), <a href="#6.4.4.4">6.4.4.4</a>, <a href="#6.4.5">6.4.5</a>            _Complex_I macro, <a href="#7.3.1">7.3.1</a>
+ \0 (null character), <a href="#5.2.1">5.2.1</a>, <a href="#6.4.4.4">6.4.4.4</a>, <a href="#6.4.5">6.4.5</a>                   _Exit function, <a href="#7.20.4.4">7.20.4.4</a>
+   padding of binary stream, <a href="#7.19.2">7.19.2</a>                           _Imaginary keyword, <a href="#G.2">G.2</a>
+ \? (question-mark escape sequence), <a href="#6.4.4.4">6.4.4.4</a>                  _Imaginary types, <a href="#7.3.1">7.3.1</a>, <a href="#G">G</a>
+ \a (alert escape sequence), <a href="#5.2.2">5.2.2</a>, <a href="#6.4.4.4">6.4.4.4</a>                   _Imaginary_I macro, <a href="#7.3.1">7.3.1</a>, <a href="#G.6">G.6</a>
+ \b (backspace escape sequence), <a href="#5.2.2">5.2.2</a>, <a href="#6.4.4.4">6.4.4.4</a>               _IOFBF macro, <a href="#7.19.1">7.19.1</a>, <a href="#7.19.5.5">7.19.5.5</a>, <a href="#7.19.5.6">7.19.5.6</a>
+ \f (form-feed escape sequence), <a href="#5.2.2">5.2.2</a>, <a href="#6.4.4.4">6.4.4.4</a>,              _IOLBF macro, <a href="#7.19.1">7.19.1</a>, <a href="#7.19.5.6">7.19.5.6</a>
+      <a href="#7.4.1.10">7.4.1.10</a>                                                _IONBF macro, <a href="#7.19.1">7.19.1</a>, <a href="#7.19.5.5">7.19.5.5</a>, <a href="#7.19.5.6">7.19.5.6</a>
+ \n (new-line escape sequence), <a href="#5.2.2">5.2.2</a>, <a href="#6.4.4.4">6.4.4.4</a>,               _Pragma operator, <a href="#5.1.1.2">5.1.1.2</a>, <a href="#6.10.9">6.10.9</a>
+      <a href="#7.4.1.10">7.4.1.10</a>                                                { } (braces punctuator), <a href="#6.7.2.2">6.7.2.2</a>, <a href="#6.7.2.3">6.7.2.3</a>, <a href="#6.7.8">6.7.8</a>,
+ \octal digits (octal-character escape sequence),                  <a href="#6.8.2">6.8.2</a>
+      <a href="#6.4.4.4">6.4.4.4</a>                                                 { } (compound-literal operator), <a href="#6.5.2.5">6.5.2.5</a>
+ \r (carriage-return escape sequence), <a href="#5.2.2">5.2.2</a>,                 | (bitwise inclusive OR operator), <a href="#6.5.12">6.5.12</a>
+      <a href="#6.4.4.4">6.4.4.4</a>, <a href="#7.4.1.10">7.4.1.10</a>                                       |= (bitwise inclusive OR assignment operator),
+ \t (horizontal-tab escape sequence), <a href="#5.2.2">5.2.2</a>,                       <a href="#6.5.16.2">6.5.16.2</a>
+      <a href="#6.4.4.4">6.4.4.4</a>, <a href="#7.4.1.3">7.4.1.3</a>, <a href="#7.4.1.10">7.4.1.10</a>, <a href="#7.25.2.1.3">7.25.2.1.3</a>                  || (logical OR operator), <a href="#6.5.14">6.5.14</a>
+ \U (universal character names), <a href="#6.4.3">6.4.3</a>                        ~ (bitwise complement operator), <a href="#6.5.3.3">6.5.3.3</a>
+ \u (universal character names), <a href="#6.4.3">6.4.3</a>
+ \v (vertical-tab escape sequence), <a href="#5.2.2">5.2.2</a>, <a href="#6.4.4.4">6.4.4.4</a>,           abort function, <a href="#7.2.1.1">7.2.1.1</a>, <a href="#7.14.1.1">7.14.1.1</a>, <a href="#7.19.3">7.19.3</a>,
+      <a href="#7.4.1.10">7.4.1.10</a>                                                     <a href="#7.20.4.1">7.20.4.1</a>
+ \x hexadecimal digits (hexadecimal-character                 abs function, <a href="#7.20.6.1">7.20.6.1</a>
+      escape sequence), <a href="#6.4.4.4">6.4.4.4</a>                               absolute-value functions
+ ^ (bitwise exclusive OR operator), <a href="#6.5.11">6.5.11</a>                      complex, <a href="#7.3.8">7.3.8</a>, <a href="#G.6.4">G.6.4</a>
+ ^= (bitwise exclusive OR assignment operator),                 integer, <a href="#7.8.2.1">7.8.2.1</a>, <a href="#7.20.6.1">7.20.6.1</a>
+      <a href="#6.5.16.2">6.5.16.2</a>                                                  real, <a href="#7.12.7">7.12.7</a>, <a href="#F.9.4">F.9.4</a>
+ __bool_true_false_are_defined                               abstract declarator, <a href="#6.7.6">6.7.6</a>
+      macro, <a href="#7.16">7.16</a>                                             abstract machine, <a href="#5.1.2.3">5.1.2.3</a>
+<!--page 533 -->
+ access, <a href="#3.1">3.1</a>, <a href="#6.7.3">6.7.3</a>                                             array
+ accuracy, see floating-point accuracy                              argument, <a href="#6.9.1">6.9.1</a>
+ acos functions, <a href="#7.12.4.1">7.12.4.1</a>, <a href="#F.9.1.1">F.9.1.1</a>                                 declarator, <a href="#6.7.5.2">6.7.5.2</a>
+ acos type-generic macro, <a href="#7.22">7.22</a>                                     initialization, <a href="#6.7.8">6.7.8</a>
+ acosh functions, <a href="#7.12.5.1">7.12.5.1</a>, <a href="#F.9.2.1">F.9.2.1</a>                                multidimensional, <a href="#6.5.2.1">6.5.2.1</a>
+ acosh type-generic macro, <a href="#7.22">7.22</a>                                    parameter, <a href="#6.9.1">6.9.1</a>
+ active position, <a href="#5.2.2">5.2.2</a>                                            storage order, <a href="#6.5.2.1">6.5.2.1</a>
+ actual argument, <a href="#3.3">3.3</a>                                              subscript operator ([ ]), <a href="#6.5.2.1">6.5.2.1</a>, <a href="#6.5.3.2">6.5.3.2</a>
+ actual parameter (deprecated), <a href="#3.3">3.3</a>                                subscripting, <a href="#6.5.2.1">6.5.2.1</a>
+ addition assignment operator (+=), <a href="#6.5.16.2">6.5.16.2</a>                       type, <a href="#6.2.5">6.2.5</a>
+ addition operator (+), <a href="#6.5.2.1">6.5.2.1</a>, <a href="#6.5.3.2">6.5.3.2</a>, <a href="#6.5.6">6.5.6</a>, <a href="#F.3">F.3</a>,              type conversion, <a href="#6.3.2.1">6.3.2.1</a>
+       <a href="#G.5.2">G.5.2</a>                                                       variable length, <a href="#6.7.5">6.7.5</a>, <a href="#6.7.5.2">6.7.5.2</a>
+ additive expressions, <a href="#6.5.6">6.5.6</a>, <a href="#G.5.2">G.5.2</a>                             arrow operator (-&gt;), <a href="#6.5.2.3">6.5.2.3</a>
+ address constant, <a href="#6.6">6.6</a>                                          as-if rule, <a href="#5.1.2.3">5.1.2.3</a>
+ address operator (&amp;), <a href="#6.3.2.1">6.3.2.1</a>, <a href="#6.5.3.2">6.5.3.2</a>                         ASCII code set, <a href="#5.2.1.1">5.2.1.1</a>
+ aggregate initialization, <a href="#6.7.8">6.7.8</a>                                asctime function, <a href="#7.23.3.1">7.23.3.1</a>
+ aggregate types, <a href="#6.2.5">6.2.5</a>                                         asin functions, <a href="#7.12.4.2">7.12.4.2</a>, <a href="#F.9.1.2">F.9.1.2</a>
+ alert escape sequence (\a), <a href="#5.2.2">5.2.2</a>, <a href="#6.4.4.4">6.4.4.4</a>                     asin type-generic macro, <a href="#7.22">7.22</a>, <a href="#G.7">G.7</a>
+ aliasing, <a href="#6.5">6.5</a>                                                  asinh functions, <a href="#7.12.5.2">7.12.5.2</a>, <a href="#F.9.2.2">F.9.2.2</a>
+ alignment, <a href="#3.2">3.2</a>                                                 asinh type-generic macro, <a href="#7.22">7.22</a>, <a href="#G.7">G.7</a>
+    pointer, <a href="#6.2.5">6.2.5</a>, <a href="#6.3.2.3">6.3.2.3</a>                                     asm keyword, <a href="#J.5.10">J.5.10</a>
+    structure/union member, <a href="#6.7.2.1">6.7.2.1</a>                             assert macro, <a href="#7.2.1.1">7.2.1.1</a>
+ allocated storage, order and contiguity, <a href="#7.20.3">7.20.3</a>                assert.h header, <a href="#7.2">7.2</a>, <a href="#B.1">B.1</a>
+ and macro, <a href="#7.9">7.9</a>                                                 assignment
+ AND operators                                                     compound, <a href="#6.5.16.2">6.5.16.2</a>
+    bitwise (&amp;), <a href="#6.5.10">6.5.10</a>                                            conversion, <a href="#6.5.16.1">6.5.16.1</a>
+    bitwise assignment (&amp;=), <a href="#6.5.16.2">6.5.16.2</a>                              expression, <a href="#6.5.16">6.5.16</a>
+    logical (&amp;&amp;), <a href="#6.5.13">6.5.13</a>                                           operators, <a href="#6.3.2.1">6.3.2.1</a>, <a href="#6.5.16">6.5.16</a>
+ and_eq macro, <a href="#7.9">7.9</a>                                                 simple, <a href="#6.5.16.1">6.5.16.1</a>
+ ANSI/IEEE 754, <a href="#F.1">F.1</a>                                             associativity of operators, <a href="#6.5">6.5</a>
+ ANSI/IEEE 854, <a href="#F.1">F.1</a>                                             asterisk punctuator (*), <a href="#6.7.5.1">6.7.5.1</a>, <a href="#6.7.5.2">6.7.5.2</a>
+ argc (main function parameter), <a href="#5.1.2.2.1">5.1.2.2.1</a>                      atan functions, <a href="#7.12.4.3">7.12.4.3</a>, <a href="#F.9.1.3">F.9.1.3</a>
+ argument, <a href="#3.3">3.3</a>                                                  atan type-generic macro, <a href="#7.22">7.22</a>, <a href="#G.7">G.7</a>
+    array, <a href="#6.9.1">6.9.1</a>                                                atan2 functions, <a href="#7.12.4.4">7.12.4.4</a>, <a href="#F.9.1.4">F.9.1.4</a>
+    default promotions, <a href="#6.5.2.2">6.5.2.2</a>                                 atan2 type-generic macro, <a href="#7.22">7.22</a>
+    function, <a href="#6.5.2.2">6.5.2.2</a>, <a href="#6.9.1">6.9.1</a>                                    atanh functions, <a href="#7.12.5.3">7.12.5.3</a>, <a href="#F.9.2.3">F.9.2.3</a>
+    macro, substitution, <a href="#6.10.3.1">6.10.3.1</a>                               atanh type-generic macro, <a href="#7.22">7.22</a>, <a href="#G.7">G.7</a>
+ argument, complex, <a href="#7.3.9.1">7.3.9.1</a>                                     atexit function, <a href="#7.20.4.2">7.20.4.2</a>, <a href="#7.20.4.3">7.20.4.3</a>, <a href="#7.20.4.4">7.20.4.4</a>,
+ argv (main function parameter), <a href="#5.1.2.2.1">5.1.2.2.1</a>                            <a href="#J.5.13">J.5.13</a>
+ arithmetic constant expression, <a href="#6.6">6.6</a>                            atof function, <a href="#7.20.1">7.20.1</a>, <a href="#7.20.1.1">7.20.1.1</a>
+ arithmetic conversions, usual, see usual arithmetic            atoi function, <a href="#7.20.1">7.20.1</a>, <a href="#7.20.1.2">7.20.1.2</a>
+       conversions                                              atol function, <a href="#7.20.1">7.20.1</a>, <a href="#7.20.1.2">7.20.1.2</a>
+ arithmetic operators                                           atoll function, <a href="#7.20.1">7.20.1</a>, <a href="#7.20.1.2">7.20.1.2</a>
+    additive, <a href="#6.5.6">6.5.6</a>, <a href="#G.5.2">G.5.2</a>                                      auto storage-class specifier, <a href="#6.7.1">6.7.1</a>, <a href="#6.9">6.9</a>
+    bitwise, <a href="#6.5.10">6.5.10</a>, <a href="#6.5.11">6.5.11</a>, <a href="#6.5.12">6.5.12</a>                             automatic storage duration, <a href="#5.2.3">5.2.3</a>, <a href="#6.2.4">6.2.4</a>
+    increment and decrement, <a href="#6.5.2.4">6.5.2.4</a>, <a href="#6.5.3.1">6.5.3.1</a>
+    multiplicative, <a href="#6.5.5">6.5.5</a>, <a href="#G.5.1">G.5.1</a>                                backslash character (\), <a href="#5.1.1.2">5.1.1.2</a>, <a href="#5.2.1">5.2.1</a>, <a href="#6.4.4.4">6.4.4.4</a>
+    shift, <a href="#6.5.7">6.5.7</a>                                                backslash escape sequence (\\), <a href="#6.4.4.4">6.4.4.4</a>, <a href="#6.10.9">6.10.9</a>
+    unary, <a href="#6.5.3.3">6.5.3.3</a>                                              backspace escape sequence (\b), <a href="#5.2.2">5.2.2</a>, <a href="#6.4.4.4">6.4.4.4</a>
+ arithmetic types, <a href="#6.2.5">6.2.5</a>                                        basic character set, <a href="#3.6">3.6</a>, <a href="#3.7.2">3.7.2</a>, <a href="#5.2.1">5.2.1</a>
+ arithmetic, pointer, <a href="#6.5.6">6.5.6</a>                                     basic types, <a href="#6.2.5">6.2.5</a>
+<!--page 534 -->
+ behavior, <a href="#3.4">3.4</a>                                                  call by value, <a href="#6.5.2.2">6.5.2.2</a>
+ binary streams, <a href="#7.19.2">7.19.2</a>, <a href="#7.19.7.11">7.19.7.11</a>, <a href="#7.19.9.2">7.19.9.2</a>,                   calloc function, <a href="#7.20.3">7.20.3</a>, <a href="#7.20.3.1">7.20.3.1</a>, <a href="#7.20.3.2">7.20.3.2</a>,
+       <a href="#7.19.9.4">7.19.9.4</a>                                                       <a href="#7.20.3.4">7.20.3.4</a>
+ bit, <a href="#3.5">3.5</a>                                                       carg functions, <a href="#7.3.9.1">7.3.9.1</a>, <a href="#G.6">G.6</a>
+    high order, <a href="#3.6">3.6</a>                                             carg type-generic macro, <a href="#7.22">7.22</a>, <a href="#G.7">G.7</a>
+    low order, <a href="#3.6">3.6</a>                                              carriage-return escape sequence (\r), <a href="#5.2.2">5.2.2</a>,
+ bit-field, <a href="#6.7.2.1">6.7.2.1</a>                                                    <a href="#6.4.4.4">6.4.4.4</a>, <a href="#7.4.1.10">7.4.1.10</a>
+ bitand macro, <a href="#7.9">7.9</a>                                              case label, <a href="#6.8.1">6.8.1</a>, <a href="#6.8.4.2">6.8.4.2</a>
+ bitor macro, <a href="#7.9">7.9</a>                                               case mapping functions
+ bitwise operators, <a href="#6.5">6.5</a>                                           character, <a href="#7.4.2">7.4.2</a>
+    AND, <a href="#6.5.10">6.5.10</a>                                                   wide character, <a href="#7.25.3.1">7.25.3.1</a>
+    AND assignment (&amp;=), <a href="#6.5.16.2">6.5.16.2</a>                                     extensible, <a href="#7.25.3.2">7.25.3.2</a>
+    complement (~), <a href="#6.5.3.3">6.5.3.3</a>                                     casin functions, <a href="#7.3.5.2">7.3.5.2</a>, <a href="#G.6">G.6</a>
+    exclusive OR, <a href="#6.5.11">6.5.11</a>                                          type-generic macro for, <a href="#7.22">7.22</a>
+    exclusive OR assignment (^=), <a href="#6.5.16.2">6.5.16.2</a>                      casinh functions, <a href="#7.3.6.2">7.3.6.2</a>, <a href="#G.6.2.2">G.6.2.2</a>
+    inclusive OR, <a href="#6.5.12">6.5.12</a>                                          type-generic macro for, <a href="#7.22">7.22</a>
+    inclusive OR assignment (|=), <a href="#6.5.16.2">6.5.16.2</a>                      cast expression, <a href="#6.5.4">6.5.4</a>
+    shift, <a href="#6.5.7">6.5.7</a>                                                cast operator (( )), <a href="#6.5.4">6.5.4</a>
+ blank character, <a href="#7.4.1.3">7.4.1.3</a>                                       catan functions, <a href="#7.3.5.3">7.3.5.3</a>, <a href="#G.6">G.6</a>
+ block, <a href="#6.8">6.8</a>, <a href="#6.8.2">6.8.2</a>, <a href="#6.8.4">6.8.4</a>, <a href="#6.8.5">6.8.5</a>                                  type-generic macro for, <a href="#7.22">7.22</a>
+ block scope, <a href="#6.2.1">6.2.1</a>                                             catanh functions, <a href="#7.3.6.3">7.3.6.3</a>, <a href="#G.6.2.3">G.6.2.3</a>
+ block structure, <a href="#6.2.1">6.2.1</a>                                           type-generic macro for, <a href="#7.22">7.22</a>
+ bold type convention, <a href="#6.1">6.1</a>                                      cbrt functions, <a href="#7.12.7.1">7.12.7.1</a>, <a href="#F.9.4.1">F.9.4.1</a>
+ bool macro, <a href="#7.16">7.16</a>                                               cbrt type-generic macro, <a href="#7.22">7.22</a>
+ boolean type, <a href="#6.3.1.2">6.3.1.2</a>                                          ccos functions, <a href="#7.3.5.4">7.3.5.4</a>, <a href="#G.6">G.6</a>
+ boolean type conversion, <a href="#6.3.1.1">6.3.1.1</a>, <a href="#6.3.1.2">6.3.1.2</a>                        type-generic macro for, <a href="#7.22">7.22</a>
+ braces punctuator ({ }), <a href="#6.7.2.2">6.7.2.2</a>, <a href="#6.7.2.3">6.7.2.3</a>, <a href="#6.7.8">6.7.8</a>,              ccosh functions, <a href="#7.3.6.4">7.3.6.4</a>, <a href="#G.6.2.4">G.6.2.4</a>
+       <a href="#6.8.2">6.8.2</a>                                                      type-generic macro for, <a href="#7.22">7.22</a>
+ brackets operator ([ ]), <a href="#6.5.2.1">6.5.2.1</a>, <a href="#6.5.3.2">6.5.3.2</a>                      ceil functions, <a href="#7.12.9.1">7.12.9.1</a>, <a href="#F.9.6.1">F.9.6.1</a>
+ brackets punctuator ([ ]), <a href="#6.7.5.2">6.7.5.2</a>, <a href="#6.7.8">6.7.8</a>                      ceil type-generic macro, <a href="#7.22">7.22</a>
+ branch cuts, <a href="#7.3.3">7.3.3</a>                                             cerf function, <a href="#7.26.1">7.26.1</a>
+ break statement, <a href="#6.8.6.3">6.8.6.3</a>                                       cerfc function, <a href="#7.26.1">7.26.1</a>
+ broken-down time, <a href="#7.23.1">7.23.1</a>, <a href="#7.23.2.3">7.23.2.3</a>, <a href="#7.23.3">7.23.3</a>,                    cexp functions, <a href="#7.3.7.1">7.3.7.1</a>, <a href="#G.6.3.1">G.6.3.1</a>
+       <a href="#7.23.3.1">7.23.3.1</a>, <a href="#7.23.3.3">7.23.3.3</a>, <a href="#7.23.3.4">7.23.3.4</a>, <a href="#7.23.3.5">7.23.3.5</a>                     type-generic macro for, <a href="#7.22">7.22</a>
+ bsearch function, <a href="#7.20.5">7.20.5</a>, <a href="#7.20.5.1">7.20.5.1</a>                             cexp2 function, <a href="#7.26.1">7.26.1</a>
+ btowc function, <a href="#7.24.6.1.1">7.24.6.1.1</a>                                     cexpm1 function, <a href="#7.26.1">7.26.1</a>
+ BUFSIZ macro, <a href="#7.19.1">7.19.1</a>, <a href="#7.19.2">7.19.2</a>, <a href="#7.19.5.5">7.19.5.5</a>                         char type, <a href="#6.2.5">6.2.5</a>, <a href="#6.3.1.1">6.3.1.1</a>, <a href="#6.7.2">6.7.2</a>
+ byte, <a href="#3.6">3.6</a>, <a href="#6.5.3.4">6.5.3.4</a>                                             char type conversion, <a href="#6.3.1.1">6.3.1.1</a>, <a href="#6.3.1.3">6.3.1.3</a>, <a href="#6.3.1.4">6.3.1.4</a>,
+ byte input/output functions, <a href="#7.19.1">7.19.1</a>                                  <a href="#6.3.1.8">6.3.1.8</a>
+ byte-oriented stream, <a href="#7.19.2">7.19.2</a>                                   CHAR_BIT macro, <a href="#5.2.4.2.1">5.2.4.2.1</a>
+                                                                CHAR_MAX macro, <a href="#5.2.4.2.1">5.2.4.2.1</a>, <a href="#7.11.2.1">7.11.2.1</a>
+ <a href="#C">C</a> program, <a href="#5.1.1.1">5.1.1.1</a>                                             CHAR_MIN macro, <a href="#5.2.4.2.1">5.2.4.2.1</a>
+ <a href="#C">C</a>++, <a href="#7.8.1">7.8.1</a>, <a href="#7.18.2">7.18.2</a>, <a href="#7.18.3">7.18.3</a>, <a href="#7.18.4">7.18.4</a>                             character, <a href="#3.7">3.7</a>, <a href="#3.7.1">3.7.1</a>
+ cabs functions, <a href="#7.3.8.1">7.3.8.1</a>, <a href="#G.6">G.6</a>                                   character array initialization, <a href="#6.7.8">6.7.8</a>
+   type-generic macro for, <a href="#7.22">7.22</a>                                 character case mapping functions, <a href="#7.4.2">7.4.2</a>
+ cacos functions, <a href="#7.3.5.1">7.3.5.1</a>, <a href="#G.6.1.1">G.6.1.1</a>                                wide character, <a href="#7.25.3.1">7.25.3.1</a>
+   type-generic macro for, <a href="#7.22">7.22</a>                                       extensible, <a href="#7.25.3.2">7.25.3.2</a>
+ cacosh functions, <a href="#7.3.6.1">7.3.6.1</a>, <a href="#G.6.2.1">G.6.2.1</a>                             character classification functions, <a href="#7.4.1">7.4.1</a>
+   type-generic macro for, <a href="#7.22">7.22</a>                                   wide character, <a href="#7.25.2.1">7.25.2.1</a>
+ calendar time, <a href="#7.23.1">7.23.1</a>, <a href="#7.23.2.2">7.23.2.2</a>, <a href="#7.23.2.3">7.23.2.3</a>, <a href="#7.23.2.4">7.23.2.4</a>,                 extensible, <a href="#7.25.2.2">7.25.2.2</a>
+      <a href="#7.23.3.2">7.23.3.2</a>, <a href="#7.23.3.3">7.23.3.3</a>, <a href="#7.23.3.4">7.23.3.4</a>                              character constant, <a href="#5.1.1.2">5.1.1.2</a>, <a href="#5.2.1">5.2.1</a>, <a href="#6.4.4.4">6.4.4.4</a>
+<!--page 535 -->
+ character display semantics, <a href="#5.2.2">5.2.2</a>                            complex.h header, <a href="#5.2.4.2.2">5.2.4.2.2</a>, <a href="#7.3">7.3</a>, <a href="#7.22">7.22</a>, <a href="#7.26.1">7.26.1</a>,
+ character handling header, <a href="#7.4">7.4</a>, <a href="#7.11.1.1">7.11.1.1</a>                           <a href="#G.6">G.6</a>, <a href="#J.5.17">J.5.17</a>
+ character input/output functions, <a href="#7.19.7">7.19.7</a>                      compliance, see conformance
+    wide character, <a href="#7.24.3">7.24.3</a>                                     components of time, <a href="#7.23.1">7.23.1</a>
+ character sets, <a href="#5.2.1">5.2.1</a>                                         composite type, <a href="#6.2.7">6.2.7</a>
+ character string literal, see string literal                  compound assignment, <a href="#6.5.16.2">6.5.16.2</a>
+ character type conversion, <a href="#6.3.1.1">6.3.1.1</a>                            compound literals, <a href="#6.5.2.5">6.5.2.5</a>
+ character types, <a href="#6.2.5">6.2.5</a>, <a href="#6.7.8">6.7.8</a>                                 compound statement, <a href="#6.8.2">6.8.2</a>
+ cimag functions, <a href="#7.3.9.2">7.3.9.2</a>, <a href="#7.3.9.4">7.3.9.4</a>, <a href="#G.6">G.6</a>                        compound-literal operator (( ){ }), <a href="#6.5.2.5">6.5.2.5</a>
+ cimag type-generic macro, <a href="#7.22">7.22</a>, <a href="#G.7">G.7</a>                           concatenation functions
+ cis function, <a href="#G.6">G.6</a>                                               string, <a href="#7.21.3">7.21.3</a>
+ classification functions                                         wide string, <a href="#7.24.4.3">7.24.4.3</a>
+    character, <a href="#7.4.1">7.4.1</a>                                           concatenation, preprocessing, see preprocessing
+    floating-point, <a href="#7.12.3">7.12.3</a>                                           concatenation
+    wide character, <a href="#7.25.2.1">7.25.2.1</a>                                   conceptual models, <a href="#5.1">5.1</a>
+       extensible, <a href="#7.25.2.2">7.25.2.2</a>                                    conditional inclusion, <a href="#6.10.1">6.10.1</a>
+ clearerr function, <a href="#7.19.10.1">7.19.10.1</a>                                  conditional operator (? :), <a href="#6.5.15">6.5.15</a>
+ clgamma function, <a href="#7.26.1">7.26.1</a>                                      conformance, <a href="#4">4</a>
+ clock function, <a href="#7.23.2.1">7.23.2.1</a>                                      conj functions, <a href="#7.3.9.3">7.3.9.3</a>, <a href="#G.6">G.6</a>
+ clock_t type, <a href="#7.23.1">7.23.1</a>, <a href="#7.23.2.1">7.23.2.1</a>                                conj type-generic macro, <a href="#7.22">7.22</a>
+ CLOCKS_PER_SEC macro, <a href="#7.23.1">7.23.1</a>, <a href="#7.23.2.1">7.23.2.1</a>                        const type qualifier, <a href="#6.7.3">6.7.3</a>
+ clog functions, <a href="#7.3.7.2">7.3.7.2</a>, <a href="#G.6.3.2">G.6.3.2</a>                              const-qualified type, <a href="#6.2.5">6.2.5</a>, <a href="#6.3.2.1">6.3.2.1</a>, <a href="#6.7.3">6.7.3</a>
+    type-generic macro for, <a href="#7.22">7.22</a>                               constant expression, <a href="#6.6">6.6</a>, <a href="#F.7.4">F.7.4</a>
+ clog10 function, <a href="#7.26.1">7.26.1</a>                                       constants, <a href="#6.4.4">6.4.4</a>
+ clog1p function, <a href="#7.26.1">7.26.1</a>                                         as primary expression, <a href="#6.5.1">6.5.1</a>
+ clog2 function, <a href="#7.26.1">7.26.1</a>                                          character, <a href="#6.4.4.4">6.4.4.4</a>
+ collating sequences, <a href="#5.2.1">5.2.1</a>                                      enumeration, <a href="#6.2.1">6.2.1</a>, <a href="#6.4.4.3">6.4.4.3</a>
+ colon punctuator (:), <a href="#6.7.2.1">6.7.2.1</a>                                   floating, <a href="#6.4.4.2">6.4.4.2</a>
+ comma operator (,), <a href="#6.5.17">6.5.17</a>                                      hexadecimal, <a href="#6.4.4.1">6.4.4.1</a>
+ comma punctuator (,), <a href="#6.5.2">6.5.2</a>, <a href="#6.7">6.7</a>, <a href="#6.7.2.1">6.7.2.1</a>, <a href="#6.7.2.2">6.7.2.2</a>,             integer, <a href="#6.4.4.1">6.4.4.1</a>
+       <a href="#6.7.2.3">6.7.2.3</a>, <a href="#6.7.8">6.7.8</a>                                            octal, <a href="#6.4.4.1">6.4.4.1</a>
+ command processor, <a href="#7.20.4.6">7.20.4.6</a>                                   constraint, <a href="#3.8">3.8</a>, <a href="#4">4</a>
+ comment delimiters (/* */ and //), <a href="#6.4.9">6.4.9</a>                      content of structure/union/enumeration, <a href="#6.7.2.3">6.7.2.3</a>
+ comments, <a href="#5.1.1.2">5.1.1.2</a>, <a href="#6.4">6.4</a>, <a href="#6.4.9">6.4.9</a>                                 contiguity of allocated storage, <a href="#7.20.3">7.20.3</a>
+ common extensions, <a href="#J.5">J.5</a>                                        continue statement, <a href="#6.8.6.2">6.8.6.2</a>
+ common initial sequence, <a href="#6.5.2.3">6.5.2.3</a>                              contracted expression, <a href="#6.5">6.5</a>, <a href="#7.12.2">7.12.2</a>, <a href="#F.6">F.6</a>
+ common real type, <a href="#6.3.1.8">6.3.1.8</a>                                     control character, <a href="#5.2.1">5.2.1</a>, <a href="#7.4">7.4</a>
+ common warnings, <a href="#I">I</a>                                            control wide character, <a href="#7.25.2">7.25.2</a>
+ comparison functions, <a href="#7.20.5">7.20.5</a>, <a href="#7.20.5.1">7.20.5.1</a>, <a href="#7.20.5.2">7.20.5.2</a>              conversion, <a href="#6.3">6.3</a>
+    string, <a href="#7.21.4">7.21.4</a>                                               arithmetic operands, <a href="#6.3.1">6.3.1</a>
+    wide string, <a href="#7.24.4.4">7.24.4.4</a>                                        array argument, <a href="#6.9.1">6.9.1</a>                           *
+ comparison macros, <a href="#7.12.14">7.12.14</a>                                      array parameter, <a href="#6.9.1">6.9.1</a>
+ comparison, pointer, <a href="#6.5.8">6.5.8</a>                                      arrays, <a href="#6.3.2.1">6.3.2.1</a>
+ compatible type, <a href="#6.2.7">6.2.7</a>, <a href="#6.7.2">6.7.2</a>, <a href="#6.7.3">6.7.3</a>, <a href="#6.7.5">6.7.5</a>                     boolean, <a href="#6.3.1.2">6.3.1.2</a>
+ compl macro, <a href="#7.9">7.9</a>                                                boolean, characters, and integers, <a href="#6.3.1.1">6.3.1.1</a>
+ complement operator (~), <a href="#6.5.3.3">6.5.3.3</a>                                by assignment, <a href="#6.5.16.1">6.5.16.1</a>
+ complex macro, <a href="#7.3.1">7.3.1</a>                                            by return statement, <a href="#6.8.6.4">6.8.6.4</a>
+ complex numbers, <a href="#6.2.5">6.2.5</a>, <a href="#G">G</a>                                       complex types, <a href="#6.3.1.6">6.3.1.6</a>
+ complex type conversion, <a href="#6.3.1.6">6.3.1.6</a>, <a href="#6.3.1.7">6.3.1.7</a>                       explicit, <a href="#6.3">6.3</a>
+ complex type domain, <a href="#6.2.5">6.2.5</a>                                      function, <a href="#6.3.2.1">6.3.2.1</a>
+ complex types, <a href="#6.2.5">6.2.5</a>, <a href="#6.7.2">6.7.2</a>, <a href="#G">G</a>                                  function argument, <a href="#6.5.2.2">6.5.2.2</a>, <a href="#6.9.1">6.9.1</a>
+<!--page 536 -->
+   function designators, <a href="#6.3.2.1">6.3.2.1</a>                                type-generic macro for, <a href="#7.22">7.22</a>
+   function parameter, <a href="#6.9.1">6.9.1</a>                                  csinh functions, <a href="#7.3.6.5">7.3.6.5</a>, <a href="#G.6.2.5">G.6.2.5</a>
+   imaginary, <a href="#G.4.1">G.4.1</a>                                             type-generic macro for, <a href="#7.22">7.22</a>
+   imaginary and complex, <a href="#G.4.3">G.4.3</a>                               csqrt functions, <a href="#7.3.8.3">7.3.8.3</a>, <a href="#G.6.4.2">G.6.4.2</a>
+   implicit, <a href="#6.3">6.3</a>                                                type-generic macro for, <a href="#7.22">7.22</a>
+   lvalues, <a href="#6.3.2.1">6.3.2.1</a>                                           ctan functions, <a href="#7.3.5.6">7.3.5.6</a>, <a href="#G.6">G.6</a>
+   pointer, <a href="#6.3.2.1">6.3.2.1</a>, <a href="#6.3.2.3">6.3.2.3</a>                                    type-generic macro for, <a href="#7.22">7.22</a>
+   real and complex, <a href="#6.3.1.7">6.3.1.7</a>                                  ctanh functions, <a href="#7.3.6.6">7.3.6.6</a>, <a href="#G.6.2.6">G.6.2.6</a>
+   real and imaginary, <a href="#G.4.2">G.4.2</a>                                    type-generic macro for, <a href="#7.22">7.22</a>
+   real floating and integer, <a href="#6.3.1.4">6.3.1.4</a>, <a href="#F.3">F.3</a>, <a href="#F.4">F.4</a>                ctgamma function, <a href="#7.26.1">7.26.1</a>
+   real floating types, <a href="#6.3.1.5">6.3.1.5</a>, <a href="#F.3">F.3</a>                           ctime function, <a href="#7.23.3.2">7.23.3.2</a>
+   signed and unsigned integers, <a href="#6.3.1.3">6.3.1.3</a>                      ctype.h header, <a href="#7.4">7.4</a>, <a href="#7.26.2">7.26.2</a>
+   usual arithmetic, see usual arithmetic                     current object, <a href="#6.7.8">6.7.8</a>
+         conversions                                          CX_LIMITED_RANGE pragma, <a href="#6.10.6">6.10.6</a>, <a href="#7.3.4">7.3.4</a>
+   void type, <a href="#6.3.2.2">6.3.2.2</a>
+ conversion functions                                         data stream, see streams
+   multibyte/wide character, <a href="#7.20.7">7.20.7</a>                           date and time header, <a href="#7.23">7.23</a>
+      extended, <a href="#7.24.6">7.24.6</a>                                        Daylight Saving Time, <a href="#7.23.1">7.23.1</a>
+      restartable, <a href="#7.24.6.3">7.24.6.3</a>                                   DBL_DIG macro, <a href="#5.2.4.2.2">5.2.4.2.2</a>
+   multibyte/wide string, <a href="#7.20.8">7.20.8</a>                              DBL_EPSILON macro, <a href="#5.2.4.2.2">5.2.4.2.2</a>
+      restartable, <a href="#7.24.6.4">7.24.6.4</a>                                   DBL_MANT_DIG macro, <a href="#5.2.4.2.2">5.2.4.2.2</a>
+   numeric, <a href="#7.8.2.3">7.8.2.3</a>, <a href="#7.20.1">7.20.1</a>                                   DBL_MAX macro, <a href="#5.2.4.2.2">5.2.4.2.2</a>
+      wide string, <a href="#7.8.2.4">7.8.2.4</a>, <a href="#7.24.4.1">7.24.4.1</a>                          DBL_MAX_10_EXP macro, <a href="#5.2.4.2.2">5.2.4.2.2</a>
+   single byte/wide character, <a href="#7.24.6.1">7.24.6.1</a>                       DBL_MAX_EXP macro, <a href="#5.2.4.2.2">5.2.4.2.2</a>
+   time, <a href="#7.23.3">7.23.3</a>                                               DBL_MIN macro, <a href="#5.2.4.2.2">5.2.4.2.2</a>
+      wide character, <a href="#7.24.5">7.24.5</a>                                  DBL_MIN_10_EXP macro, <a href="#5.2.4.2.2">5.2.4.2.2</a>
+ conversion specifier, <a href="#7.19.6.1">7.19.6.1</a>, <a href="#7.19.6.2">7.19.6.2</a>, <a href="#7.24.2.1">7.24.2.1</a>,           DBL_MIN_EXP macro, <a href="#5.2.4.2.2">5.2.4.2.2</a>
+      <a href="#7.24.2.2">7.24.2.2</a>                                                decimal constant, <a href="#6.4.4.1">6.4.4.1</a>
+ conversion state, <a href="#7.20.7">7.20.7</a>, <a href="#7.24.6">7.24.6</a>, <a href="#7.24.6.2.1">7.24.6.2.1</a>,                decimal digit, <a href="#5.2.1">5.2.1</a>
+      <a href="#7.24.6.3">7.24.6.3</a>, <a href="#7.24.6.3.2">7.24.6.3.2</a>, <a href="#7.24.6.3.3">7.24.6.3.3</a>, <a href="#7.24.6.4">7.24.6.4</a>,             decimal-point character, <a href="#7.1.1">7.1.1</a>, <a href="#7.11.2.1">7.11.2.1</a>
+      <a href="#7.24.6.4.1">7.24.6.4.1</a>, <a href="#7.24.6.4.2">7.24.6.4.2</a>                                  DECIMAL_DIG macro, <a href="#5.2.4.2.2">5.2.4.2.2</a>, <a href="#7.19.6.1">7.19.6.1</a>,
+ conversion state functions, <a href="#7.24.6.2">7.24.6.2</a>                              <a href="#7.20.1.3">7.20.1.3</a>, <a href="#7.24.2.1">7.24.2.1</a>, <a href="#7.24.4.1.1">7.24.4.1.1</a>, <a href="#F.5">F.5</a>
+ copying functions                                            declaration specifiers, <a href="#6.7">6.7</a>
+   string, <a href="#7.21.2">7.21.2</a>                                             declarations, <a href="#6.7">6.7</a>
+   wide string, <a href="#7.24.4.2">7.24.4.2</a>                                        function, <a href="#6.7.5.3">6.7.5.3</a>
+ copysign functions, <a href="#7.3.9.4">7.3.9.4</a>, <a href="#7.12.11.1">7.12.11.1</a>, <a href="#F.3">F.3</a>,                   pointer, <a href="#6.7.5.1">6.7.5.1</a>
+      <a href="#F.9.8.1">F.9.8.1</a>                                                   structure/union, <a href="#6.7.2.1">6.7.2.1</a>
+ copysign type-generic macro, <a href="#7.22">7.22</a>                              typedef, <a href="#6.7.7">6.7.7</a>
+ correctly rounded result, <a href="#3.9">3.9</a>                                declarator, <a href="#6.7.5">6.7.5</a>
+ corresponding real type, <a href="#6.2.5">6.2.5</a>                                 abstract, <a href="#6.7.6">6.7.6</a>
+ cos functions, <a href="#7.12.4.5">7.12.4.5</a>, <a href="#F.9.1.5">F.9.1.5</a>                             declarator type derivation, <a href="#6.2.5">6.2.5</a>, <a href="#6.7.5">6.7.5</a>
+ cos type-generic macro, <a href="#7.22">7.22</a>, <a href="#G.7">G.7</a>                            decrement operators, see arithmetic operators,
+ cosh functions, <a href="#7.12.5.4">7.12.5.4</a>, <a href="#F.9.2.4">F.9.2.4</a>                                 increment and decrement
+ cosh type-generic macro, <a href="#7.22">7.22</a>, <a href="#G.7">G.7</a>                           default argument promotions, <a href="#6.5.2.2">6.5.2.2</a>
+ cpow functions, <a href="#7.3.8.2">7.3.8.2</a>, <a href="#G.6.4.1">G.6.4.1</a>                             default initialization, <a href="#6.7.8">6.7.8</a>
+   type-generic macro for, <a href="#7.22">7.22</a>                               default label, <a href="#6.8.1">6.8.1</a>, <a href="#6.8.4.2">6.8.4.2</a>
+ cproj functions, <a href="#7.3.9.4">7.3.9.4</a>, <a href="#G.6">G.6</a>                                define preprocessing directive, <a href="#6.10.3">6.10.3</a>
+ cproj type-generic macro, <a href="#7.22">7.22</a>                               defined operator, <a href="#6.10.1">6.10.1</a>, <a href="#6.10.8">6.10.8</a>
+ creal functions, <a href="#7.3.9.5">7.3.9.5</a>, <a href="#G.6">G.6</a>                                definition, <a href="#6.7">6.7</a>
+ creal type-generic macro, <a href="#7.22">7.22</a>, <a href="#G.7">G.7</a>                            function, <a href="#6.9.1">6.9.1</a>
+ csin functions, <a href="#7.3.5.5">7.3.5.5</a>, <a href="#G.6">G.6</a>                                 derived declarator types, <a href="#6.2.5">6.2.5</a>
+<!--page 537 -->
+ derived types, <a href="#6.2.5">6.2.5</a>                                            end-of-file indicator, <a href="#7.19.1">7.19.1</a>, <a href="#7.19.5.3">7.19.5.3</a>, <a href="#7.19.7.1">7.19.7.1</a>,
+ designated initializer, <a href="#6.7.8">6.7.8</a>                                         <a href="#7.19.7.5">7.19.7.5</a>, <a href="#7.19.7.6">7.19.7.6</a>, <a href="#7.19.7.11">7.19.7.11</a>, <a href="#7.19.9.2">7.19.9.2</a>,
+ destringizing, <a href="#6.10.9">6.10.9</a>                                                 <a href="#7.19.9.3">7.19.9.3</a>, <a href="#7.19.10.1">7.19.10.1</a>, <a href="#7.19.10.2">7.19.10.2</a>, <a href="#7.24.3.1">7.24.3.1</a>,
+ device input/output, <a href="#5.1.2.3">5.1.2.3</a>                                          <a href="#7.24.3.10">7.24.3.10</a>
+ diagnostic message, <a href="#3.10">3.10</a>, <a href="#5.1.1.3">5.1.1.3</a>                               end-of-file macro, see EOF macro
+ diagnostics, <a href="#5.1.1.3">5.1.1.3</a>                                            end-of-line indicator, <a href="#5.2.1">5.2.1</a>
+ diagnostics header, <a href="#7.2">7.2</a>                                         endif preprocessing directive, <a href="#6.10.1">6.10.1</a>
+ difftime function, <a href="#7.23.2.2">7.23.2.2</a>                                     enum type, <a href="#6.2.5">6.2.5</a>, <a href="#6.7.2">6.7.2</a>, <a href="#6.7.2.2">6.7.2.2</a>
+ digit, <a href="#5.2.1">5.2.1</a>, <a href="#7.4">7.4</a>                                               enumerated type, <a href="#6.2.5">6.2.5</a>
+ digraphs, <a href="#6.4.6">6.4.6</a>                                                 enumeration, <a href="#6.2.5">6.2.5</a>, <a href="#6.7.2.2">6.7.2.2</a>
+ direct input/output functions, <a href="#7.19.8">7.19.8</a>                           enumeration constant, <a href="#6.2.1">6.2.1</a>, <a href="#6.4.4.3">6.4.4.3</a>
+ display device, <a href="#5.2.2">5.2.2</a>                                           enumeration content, <a href="#6.7.2.3">6.7.2.3</a>
+ div function, <a href="#7.20.6.2">7.20.6.2</a>                                          enumeration members, <a href="#6.7.2.2">6.7.2.2</a>
+ div_t type, <a href="#7.20">7.20</a>                                                enumeration specifiers, <a href="#6.7.2.2">6.7.2.2</a>
+ division assignment operator (/=), <a href="#6.5.16.2">6.5.16.2</a>                     enumeration tag, <a href="#6.2.3">6.2.3</a>, <a href="#6.7.2.3">6.7.2.3</a>
+ division operator (/), <a href="#6.5.5">6.5.5</a>, <a href="#F.3">F.3</a>, <a href="#G.5.1">G.5.1</a>                        enumerator, <a href="#6.7.2.2">6.7.2.2</a>
+ do statement, <a href="#6.8.5.2">6.8.5.2</a>                                           environment, <a href="#5">5</a>
+ documentation of implementation, <a href="#4">4</a>                              environment functions, <a href="#7.20.4">7.20.4</a>
+ domain error, <a href="#7.12.1">7.12.1</a>, <a href="#7.12.4.1">7.12.4.1</a>, <a href="#7.12.4.2">7.12.4.2</a>, <a href="#7.12.4.4">7.12.4.4</a>,             environment list, <a href="#7.20.4.5">7.20.4.5</a>
+       <a href="#7.12.5.1">7.12.5.1</a>, <a href="#7.12.5.3">7.12.5.3</a>, <a href="#7.12.6.5">7.12.6.5</a>, <a href="#7.12.6.7">7.12.6.7</a>,                   environmental considerations, <a href="#5.2">5.2</a>
+       <a href="#7.12.6.8">7.12.6.8</a>, <a href="#7.12.6.9">7.12.6.9</a>, <a href="#7.12.6.10">7.12.6.10</a>, <a href="#7.12.6.11">7.12.6.11</a>,                 environmental limits, <a href="#5.2.4">5.2.4</a>, <a href="#7.13.1.1">7.13.1.1</a>, <a href="#7.19.2">7.19.2</a>,
+       <a href="#7.12.7.4">7.12.7.4</a>, <a href="#7.12.7.5">7.12.7.5</a>, <a href="#7.12.8.4">7.12.8.4</a>, <a href="#7.12.9.5">7.12.9.5</a>,                         <a href="#7.19.3">7.19.3</a>, <a href="#7.19.4.4">7.19.4.4</a>, <a href="#7.19.6.1">7.19.6.1</a>, <a href="#7.20.2.1">7.20.2.1</a>, <a href="#7.20.4.2">7.20.4.2</a>,
+       <a href="#7.12.9.7">7.12.9.7</a>, <a href="#7.12.10.1">7.12.10.1</a>, <a href="#7.12.10.2">7.12.10.2</a>, <a href="#7.12.10.3">7.12.10.3</a>                       <a href="#7.24.2.1">7.24.2.1</a>
+ dot operator (.), <a href="#6.5.2.3">6.5.2.3</a>                                       EOF macro, <a href="#7.4">7.4</a>, <a href="#7.19.1">7.19.1</a>, <a href="#7.19.5.1">7.19.5.1</a>, <a href="#7.19.5.2">7.19.5.2</a>,
+ double _Complex type, <a href="#6.2.5">6.2.5</a>                                           <a href="#7.19.6.2">7.19.6.2</a>, <a href="#7.19.6.7">7.19.6.7</a>, <a href="#7.19.6.9">7.19.6.9</a>, <a href="#7.19.6.11">7.19.6.11</a>,
+ double _Complex type conversion, <a href="#6.3.1.6">6.3.1.6</a>,                             <a href="#7.19.6.14">7.19.6.14</a>, <a href="#7.19.7.1">7.19.7.1</a>, <a href="#7.19.7.3">7.19.7.3</a>, <a href="#7.19.7.4">7.19.7.4</a>,
+       <a href="#6.3.1.7">6.3.1.7</a>, <a href="#6.3.1.8">6.3.1.8</a>                                                <a href="#7.19.7.5">7.19.7.5</a>, <a href="#7.19.7.6">7.19.7.6</a>, <a href="#7.19.7.9">7.19.7.9</a>, <a href="#7.19.7.10">7.19.7.10</a>,
+ double _Imaginary type, <a href="#G.2">G.2</a>                                           <a href="#7.19.7.11">7.19.7.11</a>, <a href="#7.24.1">7.24.1</a>, <a href="#7.24.2.2">7.24.2.2</a>, <a href="#7.24.2.4">7.24.2.4</a>,
+ double type, <a href="#6.2.5">6.2.5</a>, <a href="#6.4.4.2">6.4.4.2</a>, <a href="#6.7.2">6.7.2</a>, <a href="#7.19.6.2">7.19.6.2</a>,                         <a href="#7.24.2.6">7.24.2.6</a>, <a href="#7.24.2.8">7.24.2.8</a>, <a href="#7.24.2.10">7.24.2.10</a>, <a href="#7.24.2.12">7.24.2.12</a>,
+       <a href="#7.24.2.2">7.24.2.2</a>, <a href="#F.2">F.2</a>                                                   <a href="#7.24.3.4">7.24.3.4</a>, <a href="#7.24.6.1.1">7.24.6.1.1</a>, <a href="#7.24.6.1.2">7.24.6.1.2</a>
+ double type conversion, <a href="#6.3.1.4">6.3.1.4</a>, <a href="#6.3.1.5">6.3.1.5</a>, <a href="#6.3.1.7">6.3.1.7</a>,              equal-sign punctuator (=), <a href="#6.7">6.7</a>, <a href="#6.7.2.2">6.7.2.2</a>, <a href="#6.7.8">6.7.8</a>
+       <a href="#6.3.1.8">6.3.1.8</a>                                                   equal-to operator, see equality operator
+ double-precision arithmetic, <a href="#5.1.2.3">5.1.2.3</a>                            equality expressions, <a href="#6.5.9">6.5.9</a>
+ double-quote escape sequence (\"), <a href="#6.4.4.4">6.4.4.4</a>,                     equality operator (==), <a href="#6.5.9">6.5.9</a>
+       <a href="#6.4.5">6.4.5</a>, <a href="#6.10.9">6.10.9</a>                                             ERANGE macro, <a href="#7.5">7.5</a>, <a href="#7.8.2.3">7.8.2.3</a>, <a href="#7.8.2.4">7.8.2.4</a>, <a href="#7.12.1">7.12.1</a>,
+ double_t type, <a href="#7.12">7.12</a>, <a href="#J.5.6">J.5.6</a>                                            <a href="#7.20.1.3">7.20.1.3</a>, <a href="#7.20.1.4">7.20.1.4</a>, <a href="#7.24.4.1.1">7.24.4.1.1</a>, <a href="#7.24.4.1.2">7.24.4.1.2</a>, see
+                                                                       also range error
+ EDOM macro, <a href="#7.5">7.5</a>, <a href="#7.12.1">7.12.1</a>, see also domain error                  erf functions, <a href="#7.12.8.1">7.12.8.1</a>, <a href="#F.9.5.1">F.9.5.1</a>
+ effective type, <a href="#6.5">6.5</a>                                             erf type-generic macro, <a href="#7.22">7.22</a>
+ EILSEQ macro, <a href="#7.5">7.5</a>, <a href="#7.19.3">7.19.3</a>, <a href="#7.24.3.1">7.24.3.1</a>, <a href="#7.24.3.3">7.24.3.3</a>,                  erfc functions, <a href="#7.12.8.2">7.12.8.2</a>, <a href="#F.9.5.2">F.9.5.2</a>
+       <a href="#7.24.6.3.2">7.24.6.3.2</a>, <a href="#7.24.6.3.3">7.24.6.3.3</a>, <a href="#7.24.6.4.1">7.24.6.4.1</a>, <a href="#7.24.6.4.2">7.24.6.4.2</a>,           erfc type-generic macro, <a href="#7.22">7.22</a>
+       see also encoding error                                   errno macro, <a href="#7.1.3">7.1.3</a>, <a href="#7.3.2">7.3.2</a>, <a href="#7.5">7.5</a>, <a href="#7.8.2.3">7.8.2.3</a>, <a href="#7.8.2.4">7.8.2.4</a>,
+ element type, <a href="#6.2.5">6.2.5</a>                                                   <a href="#7.12.1">7.12.1</a>, <a href="#7.14.1.1">7.14.1.1</a>, <a href="#7.19.3">7.19.3</a>, <a href="#7.19.9.3">7.19.9.3</a>, <a href="#7.19.10.4">7.19.10.4</a>,
+ elif preprocessing directive, <a href="#6.10.1">6.10.1</a>                                  <a href="#7.20.1">7.20.1</a>, <a href="#7.20.1.3">7.20.1.3</a>, <a href="#7.20.1.4">7.20.1.4</a>, <a href="#7.21.6.2">7.21.6.2</a>, <a href="#7.24.3.1">7.24.3.1</a>,
+ ellipsis punctuator (...), <a href="#6.5.2.2">6.5.2.2</a>, <a href="#6.7.5.3">6.7.5.3</a>, <a href="#6.10.3">6.10.3</a>                   <a href="#7.24.3.3">7.24.3.3</a>, <a href="#7.24.4.1.1">7.24.4.1.1</a>, <a href="#7.24.4.1.2">7.24.4.1.2</a>, <a href="#7.24.6.3.2">7.24.6.3.2</a>,
+ else preprocessing directive, <a href="#6.10.1">6.10.1</a>                                  <a href="#7.24.6.3.3">7.24.6.3.3</a>, <a href="#7.24.6.4.1">7.24.6.4.1</a>, <a href="#7.24.6.4.2">7.24.6.4.2</a>, <a href="#J.5.17">J.5.17</a>
+ else statement, <a href="#6.8.4.1">6.8.4.1</a>                                         errno.h header, <a href="#7.5">7.5</a>, <a href="#7.26.3">7.26.3</a>
+ empty statement, <a href="#6.8.3">6.8.3</a>                                          error
+ encoding error, <a href="#7.19.3">7.19.3</a>, <a href="#7.24.3.1">7.24.3.1</a>, <a href="#7.24.3.3">7.24.3.3</a>,                        domain, see domain error
+       <a href="#7.24.6.3.2">7.24.6.3.2</a>, <a href="#7.24.6.3.3">7.24.6.3.3</a>, <a href="#7.24.6.4.1">7.24.6.4.1</a>, <a href="#7.24.6.4.2">7.24.6.4.2</a>               encoding, see encoding error
+ end-of-file, <a href="#7.24.1">7.24.1</a>                                                 range, see range error
+<!--page 538 -->
+ error conditions, <a href="#7.12.1">7.12.1</a>                                     extended characters, <a href="#5.2.1">5.2.1</a>
+ error functions, <a href="#7.12.8">7.12.8</a>, <a href="#F.9.5">F.9.5</a>                               extended integer types, <a href="#6.2.5">6.2.5</a>, <a href="#6.3.1.1">6.3.1.1</a>, <a href="#6.4.4.1">6.4.4.1</a>,
+ error indicator, <a href="#7.19.1">7.19.1</a>, <a href="#7.19.5.3">7.19.5.3</a>, <a href="#7.19.7.1">7.19.7.1</a>,                      <a href="#7.18">7.18</a>
+       <a href="#7.19.7.3">7.19.7.3</a>, <a href="#7.19.7.5">7.19.7.5</a>, <a href="#7.19.7.6">7.19.7.6</a>, <a href="#7.19.7.8">7.19.7.8</a>,                extended multibyte/wide character conversion
+       <a href="#7.19.7.9">7.19.7.9</a>, <a href="#7.19.9.2">7.19.9.2</a>, <a href="#7.19.10.1">7.19.10.1</a>, <a href="#7.19.10.3">7.19.10.3</a>,                   utilities, <a href="#7.24.6">7.24.6</a>
+       <a href="#7.24.3.1">7.24.3.1</a>, <a href="#7.24.3.3">7.24.3.3</a>                                     extensible wide character case mapping functions,
+ error preprocessing directive, <a href="#4">4</a>, <a href="#6.10.5">6.10.5</a>                          <a href="#7.25.3.2">7.25.3.2</a>
+ error-handling functions, <a href="#7.19.10">7.19.10</a>, <a href="#7.21.6.2">7.21.6.2</a>                  extensible wide character classification functions,
+ escape character (\), <a href="#6.4.4.4">6.4.4.4</a>                                     <a href="#7.25.2.2">7.25.2.2</a>
+ escape sequences, <a href="#5.2.1">5.2.1</a>, <a href="#5.2.2">5.2.2</a>, <a href="#6.4.4.4">6.4.4.4</a>, <a href="#6.11.4">6.11.4</a>              extern storage-class specifier, <a href="#6.2.2">6.2.2</a>, <a href="#6.7.1">6.7.1</a>
+ evaluation format, <a href="#5.2.4.2.2">5.2.4.2.2</a>, <a href="#6.4.4.2">6.4.4.2</a>, <a href="#7.12">7.12</a>                  external definition, <a href="#6.9">6.9</a>
+ evaluation method, <a href="#5.2.4.2.2">5.2.4.2.2</a>, <a href="#6.5">6.5</a>, <a href="#F.7.5">F.7.5</a>                     external identifiers, underscore, <a href="#7.1.3">7.1.3</a>
+ evaluation order, <a href="#6.5">6.5</a>                                        external linkage, <a href="#6.2.2">6.2.2</a>
+ exceptional condition, <a href="#6.5">6.5</a>, <a href="#7.12.1">7.12.1</a>                           external name, <a href="#6.4.2.1">6.4.2.1</a>
+ excess precision, <a href="#5.2.4.2.2">5.2.4.2.2</a>, <a href="#6.3.1.5">6.3.1.5</a>, <a href="#6.3.1.8">6.3.1.8</a>,               external object definitions, <a href="#6.9.2">6.9.2</a>
+       <a href="#6.8.6.4">6.8.6.4</a>
+ excess range, <a href="#5.2.4.2.2">5.2.4.2.2</a>, <a href="#6.3.1.5">6.3.1.5</a>, <a href="#6.3.1.8">6.3.1.8</a>, <a href="#6.8.6.4">6.8.6.4</a>           fabs functions, <a href="#7.12.7.2">7.12.7.2</a>, <a href="#F.9.4.2">F.9.4.2</a>
+ exclusive OR operators                                       fabs type-generic macro, <a href="#7.22">7.22</a>, <a href="#G.7">G.7</a>
+    bitwise (^), <a href="#6.5.11">6.5.11</a>                                       false macro, <a href="#7.16">7.16</a>
+    bitwise assignment (^=), <a href="#6.5.16.2">6.5.16.2</a>                         fclose function, <a href="#7.19.5.1">7.19.5.1</a>
+ executable program, <a href="#5.1.1.1">5.1.1.1</a>                                  fdim functions, <a href="#7.12.12.1">7.12.12.1</a>, <a href="#F.9.9.1">F.9.9.1</a>
+ execution character set, <a href="#5.2.1">5.2.1</a>                               fdim type-generic macro, <a href="#7.22">7.22</a>
+ execution environment, <a href="#5">5</a>, <a href="#5.1.2">5.1.2</a>, see also                    FE_ALL_EXCEPT macro, <a href="#7.6">7.6</a>
+       environmental limits                                   FE_DFL_ENV macro, <a href="#7.6">7.6</a>
+ execution sequence, <a href="#5.1.2.3">5.1.2.3</a>, <a href="#6.8">6.8</a>                             FE_DIVBYZERO macro, <a href="#7.6">7.6</a>, <a href="#7.12">7.12</a>, <a href="#F.3">F.3</a>
+ exit function, <a href="#5.1.2.2.3">5.1.2.2.3</a>, <a href="#7.19.3">7.19.3</a>, <a href="#7.20">7.20</a>, <a href="#7.20.4.3">7.20.4.3</a>,            FE_DOWNWARD macro, <a href="#7.6">7.6</a>, <a href="#F.3">F.3</a>
+       <a href="#7.20.4.4">7.20.4.4</a>                                               FE_INEXACT macro, <a href="#7.6">7.6</a>, <a href="#F.3">F.3</a>
+ EXIT_FAILURE macro, <a href="#7.20">7.20</a>, <a href="#7.20.4.3">7.20.4.3</a>                           FE_INVALID macro, <a href="#7.6">7.6</a>, <a href="#7.12">7.12</a>, <a href="#F.3">F.3</a>
+ EXIT_SUCCESS macro, <a href="#7.20">7.20</a>, <a href="#7.20.4.3">7.20.4.3</a>                           FE_OVERFLOW macro, <a href="#7.6">7.6</a>, <a href="#7.12">7.12</a>, <a href="#F.3">F.3</a>
+ exp functions, <a href="#7.12.6.1">7.12.6.1</a>, <a href="#F.9.3.1">F.9.3.1</a>                             FE_TONEAREST macro, <a href="#7.6">7.6</a>, <a href="#F.3">F.3</a>
+ exp type-generic macro, <a href="#7.22">7.22</a>                                 FE_TOWARDZERO macro, <a href="#7.6">7.6</a>, <a href="#F.3">F.3</a>
+ exp2 functions, <a href="#7.12.6.2">7.12.6.2</a>, <a href="#F.9.3.2">F.9.3.2</a>                            FE_UNDERFLOW macro, <a href="#7.6">7.6</a>, <a href="#F.3">F.3</a>
+ exp2 type-generic macro, <a href="#7.22">7.22</a>                                FE_UPWARD macro, <a href="#7.6">7.6</a>, <a href="#F.3">F.3</a>
+ explicit conversion, <a href="#6.3">6.3</a>                                     feclearexcept function, <a href="#7.6.2">7.6.2</a>, <a href="#7.6.2.1">7.6.2.1</a>, <a href="#F.3">F.3</a>
+ expm1 functions, <a href="#7.12.6.3">7.12.6.3</a>, <a href="#F.9.3.3">F.9.3.3</a>                           fegetenv function, <a href="#7.6.4.1">7.6.4.1</a>, <a href="#7.6.4.3">7.6.4.3</a>, <a href="#7.6.4.4">7.6.4.4</a>, <a href="#F.3">F.3</a>
+ expm1 type-generic macro, <a href="#7.22">7.22</a>                               fegetexceptflag function, <a href="#7.6.2">7.6.2</a>, <a href="#7.6.2.2">7.6.2.2</a>, <a href="#F.3">F.3</a>
+ exponent part, <a href="#6.4.4.2">6.4.4.2</a>                                       fegetround function, <a href="#7.6">7.6</a>, <a href="#7.6.3.1">7.6.3.1</a>, <a href="#F.3">F.3</a>
+ exponential functions                                        feholdexcept function, <a href="#7.6.4.2">7.6.4.2</a>, <a href="#7.6.4.3">7.6.4.3</a>,
+    complex, <a href="#7.3.7">7.3.7</a>, <a href="#G.6.3">G.6.3</a>                                        <a href="#7.6.4.4">7.6.4.4</a>, <a href="#F.3">F.3</a>
+    real, <a href="#7.12.6">7.12.6</a>, <a href="#F.9.3">F.9.3</a>                                       fenv.h header, <a href="#5.1.2.3">5.1.2.3</a>, <a href="#5.2.4.2.2">5.2.4.2.2</a>, <a href="#7.6">7.6</a>, <a href="#7.12">7.12</a>, <a href="#F">F</a>, <a href="#H">H</a>
+ expression, <a href="#6.5">6.5</a>                                              FENV_ACCESS pragma, <a href="#6.10.6">6.10.6</a>, <a href="#7.6.1">7.6.1</a>, <a href="#F.7">F.7</a>, <a href="#F.8">F.8</a>,
+    assignment, <a href="#6.5.16">6.5.16</a>                                           <a href="#F.9">F.9</a>
+    cast, <a href="#6.5.4">6.5.4</a>                                               fenv_t type, <a href="#7.6">7.6</a>
+    constant, <a href="#6.6">6.6</a>                                             feof function, <a href="#7.19.10.2">7.19.10.2</a>
+    full, <a href="#6.8">6.8</a>                                                 feraiseexcept function, <a href="#7.6.2">7.6.2</a>, <a href="#7.6.2.3">7.6.2.3</a>, <a href="#F.3">F.3</a>
+    order of evaluation, <a href="#6.5">6.5</a>                                  ferror function, <a href="#7.19.10.3">7.19.10.3</a>
+    parenthesized, <a href="#6.5.1">6.5.1</a>                                      fesetenv function, <a href="#7.6.4.3">7.6.4.3</a>, <a href="#F.3">F.3</a>
+    primary, <a href="#6.5.1">6.5.1</a>                                            fesetexceptflag function, <a href="#7.6.2">7.6.2</a>, <a href="#7.6.2.4">7.6.2.4</a>, <a href="#F.3">F.3</a>
+    unary, <a href="#6.5.3">6.5.3</a>                                              fesetround function, <a href="#7.6">7.6</a>, <a href="#7.6.3.2">7.6.3.2</a>, <a href="#F.3">F.3</a>
+ expression statement, <a href="#6.8.3">6.8.3</a>                                  fetestexcept function, <a href="#7.6.2">7.6.2</a>, <a href="#7.6.2.5">7.6.2.5</a>, <a href="#F.3">F.3</a>
+ extended character set, <a href="#3.7.2">3.7.2</a>, <a href="#5.2.1">5.2.1</a>, <a href="#5.2.1.2">5.2.1.2</a>                feupdateenv function, <a href="#7.6.4.2">7.6.4.2</a>, <a href="#7.6.4.4">7.6.4.4</a>, <a href="#F.3">F.3</a>
+<!--page 539 -->
+ fexcept_t type, <a href="#7.6">7.6</a>, <a href="#F.3">F.3</a>                                      floating-point status flag, <a href="#7.6">7.6</a>, <a href="#F.7.6">F.7.6</a>
+ fflush function, <a href="#7.19.5.2">7.19.5.2</a>, <a href="#7.19.5.3">7.19.5.3</a>                           floor functions, <a href="#7.12.9.2">7.12.9.2</a>, <a href="#F.9.6.2">F.9.6.2</a>
+ fgetc function, <a href="#7.19.1">7.19.1</a>, <a href="#7.19.3">7.19.3</a>, <a href="#7.19.7.1">7.19.7.1</a>,                     floor type-generic macro, <a href="#7.22">7.22</a>
+      <a href="#7.19.7.5">7.19.7.5</a>, <a href="#7.19.8.1">7.19.8.1</a>                                       FLT_DIG macro, <a href="#5.2.4.2.2">5.2.4.2.2</a>
+ fgetpos function, <a href="#7.19.2">7.19.2</a>, <a href="#7.19.9.1">7.19.9.1</a>, <a href="#7.19.9.3">7.19.9.3</a>                  FLT_EPSILON macro, <a href="#5.2.4.2.2">5.2.4.2.2</a>
+ fgets function, <a href="#7.19.1">7.19.1</a>, <a href="#7.19.7.2">7.19.7.2</a>                              FLT_EVAL_METHOD macro, <a href="#5.2.4.2.2">5.2.4.2.2</a>, <a href="#6.8.6.4">6.8.6.4</a>,
+ fgetwc function, <a href="#7.19.1">7.19.1</a>, <a href="#7.19.3">7.19.3</a>, <a href="#7.24.3.1">7.24.3.1</a>,                         <a href="#7.12">7.12</a>
+      <a href="#7.24.3.6">7.24.3.6</a>                                                 FLT_MANT_DIG macro, <a href="#5.2.4.2.2">5.2.4.2.2</a>
+ fgetws function, <a href="#7.19.1">7.19.1</a>, <a href="#7.24.3.2">7.24.3.2</a>                             FLT_MAX macro, <a href="#5.2.4.2.2">5.2.4.2.2</a>
+ field width, <a href="#7.19.6.1">7.19.6.1</a>, <a href="#7.24.2.1">7.24.2.1</a>                                FLT_MAX_10_EXP macro, <a href="#5.2.4.2.2">5.2.4.2.2</a>
+ file, <a href="#7.19.3">7.19.3</a>                                                   FLT_MAX_EXP macro, <a href="#5.2.4.2.2">5.2.4.2.2</a>
+   access functions, <a href="#7.19.5">7.19.5</a>                                    FLT_MIN macro, <a href="#5.2.4.2.2">5.2.4.2.2</a>
+   name, <a href="#7.19.3">7.19.3</a>                                                FLT_MIN_10_EXP macro, <a href="#5.2.4.2.2">5.2.4.2.2</a>
+   operations, <a href="#7.19.4">7.19.4</a>                                          FLT_MIN_EXP macro, <a href="#5.2.4.2.2">5.2.4.2.2</a>
+   position indicator, <a href="#7.19.1">7.19.1</a>, <a href="#7.19.2">7.19.2</a>, <a href="#7.19.3">7.19.3</a>,                 FLT_RADIX macro, <a href="#5.2.4.2.2">5.2.4.2.2</a>, <a href="#7.19.6.1">7.19.6.1</a>, <a href="#7.20.1.3">7.20.1.3</a>,
+         <a href="#7.19.5.3">7.19.5.3</a>, <a href="#7.19.7.1">7.19.7.1</a>, <a href="#7.19.7.3">7.19.7.3</a>, <a href="#7.19.7.11">7.19.7.11</a>,                   <a href="#7.24.2.1">7.24.2.1</a>, <a href="#7.24.4.1.1">7.24.4.1.1</a>
+         <a href="#7.19.8.1">7.19.8.1</a>, <a href="#7.19.8.2">7.19.8.2</a>, <a href="#7.19.9.1">7.19.9.1</a>, <a href="#7.19.9.2">7.19.9.2</a>,               FLT_ROUNDS macro, <a href="#5.2.4.2.2">5.2.4.2.2</a>, <a href="#7.6">7.6</a>, <a href="#F.3">F.3</a>
+         <a href="#7.19.9.3">7.19.9.3</a>, <a href="#7.19.9.4">7.19.9.4</a>, <a href="#7.19.9.5">7.19.9.5</a>, <a href="#7.24.3.1">7.24.3.1</a>,               fma functions, <a href="#7.12">7.12</a>, <a href="#7.12.13.1">7.12.13.1</a>, <a href="#F.9.10.1">F.9.10.1</a>
+         <a href="#7.24.3.3">7.24.3.3</a>, <a href="#7.24.3.10">7.24.3.10</a>                                   fma type-generic macro, <a href="#7.22">7.22</a>
+   positioning functions, <a href="#7.19.9">7.19.9</a>                               fmax functions, <a href="#7.12.12.2">7.12.12.2</a>, <a href="#F.9.9.2">F.9.9.2</a>
+ file scope, <a href="#6.2.1">6.2.1</a>, <a href="#6.9">6.9</a>                                         fmax type-generic macro, <a href="#7.22">7.22</a>
+ FILE type, <a href="#7.19.1">7.19.1</a>, <a href="#7.19.3">7.19.3</a>                                     fmin functions, <a href="#7.12.12.3">7.12.12.3</a>, <a href="#F.9.9.3">F.9.9.3</a>
+ FILENAME_MAX macro, <a href="#7.19.1">7.19.1</a>                                    fmin type-generic macro, <a href="#7.22">7.22</a>
+ flags, <a href="#7.19.6.1">7.19.6.1</a>, <a href="#7.24.2.1">7.24.2.1</a>                                      fmod functions, <a href="#7.12.10.1">7.12.10.1</a>, <a href="#F.9.7.1">F.9.7.1</a>
+   floating-point status, see floating-point status              fmod type-generic macro, <a href="#7.22">7.22</a>
+         flag                                                   fopen function, <a href="#7.19.5.3">7.19.5.3</a>, <a href="#7.19.5.4">7.19.5.4</a>
+ flexible array member, <a href="#6.7.2.1">6.7.2.1</a>                                 FOPEN_MAX macro, <a href="#7.19.1">7.19.1</a>, <a href="#7.19.3">7.19.3</a>, <a href="#7.19.4.3">7.19.4.3</a>
+ float _Complex type, <a href="#6.2.5">6.2.5</a>                                    for statement, <a href="#6.8.5">6.8.5</a>, <a href="#6.8.5.3">6.8.5.3</a>
+ float _Complex type conversion, <a href="#6.3.1.6">6.3.1.6</a>,                      form-feed character, <a href="#5.2.1">5.2.1</a>, <a href="#6.4">6.4</a>
+      <a href="#6.3.1.7">6.3.1.7</a>, <a href="#6.3.1.8">6.3.1.8</a>                                         form-feed escape sequence (\f), <a href="#5.2.2">5.2.2</a>, <a href="#6.4.4.4">6.4.4.4</a>,
+ float _Imaginary type, <a href="#G.2">G.2</a>                                         <a href="#7.4.1.10">7.4.1.10</a>
+ float type, <a href="#6.2.5">6.2.5</a>, <a href="#6.4.4.2">6.4.4.2</a>, <a href="#6.7.2">6.7.2</a>, <a href="#F.2">F.2</a>                        formal argument (deprecated), <a href="#3.15">3.15</a>
+ float type conversion, <a href="#6.3.1.4">6.3.1.4</a>, <a href="#6.3.1.5">6.3.1.5</a>, <a href="#6.3.1.7">6.3.1.7</a>,             formal parameter, <a href="#3.15">3.15</a>
+      <a href="#6.3.1.8">6.3.1.8</a>                                                  formatted input/output functions, <a href="#7.11.1.1">7.11.1.1</a>, <a href="#7.19.6">7.19.6</a>
+ float.h header, <a href="#4">4</a>, <a href="#5.2.4.2.2">5.2.4.2.2</a>, <a href="#7.7">7.7</a>, <a href="#7.20.1.3">7.20.1.3</a>,                     wide character, <a href="#7.24.2">7.24.2</a>
+      <a href="#7.24.4.1.1">7.24.4.1.1</a>                                               fortran keyword, <a href="#J.5.9">J.5.9</a>
+ float_t type, <a href="#7.12">7.12</a>, <a href="#J.5.6">J.5.6</a>                                     forward reference, <a href="#3.11">3.11</a>
+ floating constant, <a href="#6.4.4.2">6.4.4.2</a>                                     FP_CONTRACT pragma, <a href="#6.5">6.5</a>, <a href="#6.10.6">6.10.6</a>, <a href="#7.12.2">7.12.2</a>, see
+ floating suffix, f or <a href="#F">F</a>, <a href="#6.4.4.2">6.4.4.2</a>                                     also contracted expression
+ floating type conversion, <a href="#6.3.1.4">6.3.1.4</a>, <a href="#6.3.1.5">6.3.1.5</a>, <a href="#6.3.1.7">6.3.1.7</a>,           FP_FAST_FMA macro, <a href="#7.12">7.12</a>
+      <a href="#F.3">F.3</a>, <a href="#F.4">F.4</a>                                                 FP_FAST_FMAF macro, <a href="#7.12">7.12</a>
+ floating types, <a href="#6.2.5">6.2.5</a>, <a href="#6.11.1">6.11.1</a>                                  FP_FAST_FMAL macro, <a href="#7.12">7.12</a>
+ floating-point accuracy, <a href="#5.2.4.2.2">5.2.4.2.2</a>, <a href="#6.4.4.2">6.4.4.2</a>, <a href="#6.5">6.5</a>,              FP_ILOGB0 macro, <a href="#7.12">7.12</a>, <a href="#7.12.6.5">7.12.6.5</a>
+      <a href="#7.20.1.3">7.20.1.3</a>, <a href="#F.5">F.5</a>, see also contracted expression            FP_ILOGBNAN macro, <a href="#7.12">7.12</a>, <a href="#7.12.6.5">7.12.6.5</a>
+ floating-point arithmetic functions, <a href="#7.12">7.12</a>, <a href="#F.9">F.9</a>                 FP_INFINITE macro, <a href="#7.12">7.12</a>, <a href="#F.3">F.3</a>
+ floating-point classification functions, <a href="#7.12.3">7.12.3</a>                 FP_NAN macro, <a href="#7.12">7.12</a>, <a href="#F.3">F.3</a>
+ floating-point control mode, <a href="#7.6">7.6</a>, <a href="#F.7.6">F.7.6</a>                        FP_NORMAL macro, <a href="#7.12">7.12</a>, <a href="#F.3">F.3</a>
+ floating-point environment, <a href="#7.6">7.6</a>, <a href="#F.7">F.7</a>, <a href="#F.7.6">F.7.6</a>                    FP_SUBNORMAL macro, <a href="#7.12">7.12</a>, <a href="#F.3">F.3</a>
+ floating-point exception, <a href="#7.6">7.6</a>, <a href="#7.6.2">7.6.2</a>, <a href="#F.9">F.9</a>                      FP_ZERO macro, <a href="#7.12">7.12</a>, <a href="#F.3">F.3</a>
+ floating-point number, <a href="#5.2.4.2.2">5.2.4.2.2</a>, <a href="#6.2.5">6.2.5</a>                        fpclassify macro, <a href="#7.12.3.1">7.12.3.1</a>, <a href="#F.3">F.3</a>
+ floating-point rounding mode, <a href="#5.2.4.2.2">5.2.4.2.2</a>                        fpos_t type, <a href="#7.19.1">7.19.1</a>, <a href="#7.19.2">7.19.2</a>
+<!--page 540 -->
+ fprintf function, <a href="#7.8.1">7.8.1</a>, <a href="#7.19.1">7.19.1</a>, <a href="#7.19.6.1">7.19.6.1</a>,                       language, <a href="#6.11">6.11</a>
+       <a href="#7.19.6.2">7.19.6.2</a>, <a href="#7.19.6.3">7.19.6.3</a>, <a href="#7.19.6.5">7.19.6.5</a>, <a href="#7.19.6.6">7.19.6.6</a>,                    library, <a href="#7.26">7.26</a>
+       <a href="#7.19.6.8">7.19.6.8</a>, <a href="#7.24.2.2">7.24.2.2</a>, <a href="#F.3">F.3</a>                                  fwide function, <a href="#7.19.2">7.19.2</a>, <a href="#7.24.3.5">7.24.3.5</a>
+ fputc function, <a href="#5.2.2">5.2.2</a>, <a href="#7.19.1">7.19.1</a>, <a href="#7.19.3">7.19.3</a>, <a href="#7.19.7.3">7.19.7.3</a>,               fwprintf function, <a href="#7.8.1">7.8.1</a>, <a href="#7.19.1">7.19.1</a>, <a href="#7.19.6.2">7.19.6.2</a>,
+       <a href="#7.19.7.8">7.19.7.8</a>, <a href="#7.19.8.2">7.19.8.2</a>                                            <a href="#7.24.2.1">7.24.2.1</a>, <a href="#7.24.2.2">7.24.2.2</a>, <a href="#7.24.2.3">7.24.2.3</a>, <a href="#7.24.2.5">7.24.2.5</a>,
+ fputs function, <a href="#7.19.1">7.19.1</a>, <a href="#7.19.7.4">7.19.7.4</a>                                    <a href="#7.24.2.11">7.24.2.11</a>
+ fputwc function, <a href="#7.19.1">7.19.1</a>, <a href="#7.19.3">7.19.3</a>, <a href="#7.24.3.3">7.24.3.3</a>,                     fwrite function, <a href="#7.19.1">7.19.1</a>, <a href="#7.19.8.2">7.19.8.2</a>
+       <a href="#7.24.3.8">7.24.3.8</a>                                                 fwscanf function, <a href="#7.8.1">7.8.1</a>, <a href="#7.19.1">7.19.1</a>, <a href="#7.24.2.2">7.24.2.2</a>,
+ fputws function, <a href="#7.19.1">7.19.1</a>, <a href="#7.24.3.4">7.24.3.4</a>                                   <a href="#7.24.2.4">7.24.2.4</a>, <a href="#7.24.2.6">7.24.2.6</a>, <a href="#7.24.2.12">7.24.2.12</a>, <a href="#7.24.3.10">7.24.3.10</a>
+ fread function, <a href="#7.19.1">7.19.1</a>, <a href="#7.19.8.1">7.19.8.1</a>
+ free function, <a href="#7.20.3.2">7.20.3.2</a>, <a href="#7.20.3.4">7.20.3.4</a>                              gamma functions, <a href="#7.12.8">7.12.8</a>, <a href="#F.9.5">F.9.5</a>
+ freestanding execution environment, <a href="#4">4</a>, <a href="#5.1.2">5.1.2</a>,                  general utilities, <a href="#7.20">7.20</a>
+       <a href="#5.1.2.1">5.1.2.1</a>                                                    wide string, <a href="#7.24.4">7.24.4</a>
+ freopen function, <a href="#7.19.2">7.19.2</a>, <a href="#7.19.5.4">7.19.5.4</a>                             general wide string utilities, <a href="#7.24.4">7.24.4</a>
+ frexp functions, <a href="#7.12.6.4">7.12.6.4</a>, <a href="#F.9.3.4">F.9.3.4</a>                             generic parameters, <a href="#7.22">7.22</a>
+ frexp type-generic macro, <a href="#7.22">7.22</a>                                 getc function, <a href="#7.19.1">7.19.1</a>, <a href="#7.19.7.5">7.19.7.5</a>, <a href="#7.19.7.6">7.19.7.6</a>
+ fscanf function, <a href="#7.8.1">7.8.1</a>, <a href="#7.19.1">7.19.1</a>, <a href="#7.19.6.2">7.19.6.2</a>,                      getchar function, <a href="#7.19.1">7.19.1</a>, <a href="#7.19.7.6">7.19.7.6</a>
+       <a href="#7.19.6.4">7.19.6.4</a>, <a href="#7.19.6.7">7.19.6.7</a>, <a href="#7.19.6.9">7.19.6.9</a>, <a href="#F.3">F.3</a>                        getenv function, <a href="#7.20.4.5">7.20.4.5</a>
+ fseek function, <a href="#7.19.1">7.19.1</a>, <a href="#7.19.5.3">7.19.5.3</a>, <a href="#7.19.7.11">7.19.7.11</a>,                   gets function, <a href="#7.19.1">7.19.1</a>, <a href="#7.19.7.7">7.19.7.7</a>, <a href="#7.26.9">7.26.9</a>
+       <a href="#7.19.9.2">7.19.9.2</a>, <a href="#7.19.9.4">7.19.9.4</a>, <a href="#7.19.9.5">7.19.9.5</a>, <a href="#7.24.3.10">7.24.3.10</a>                  getwc function, <a href="#7.19.1">7.19.1</a>, <a href="#7.24.3.6">7.24.3.6</a>, <a href="#7.24.3.7">7.24.3.7</a>
+ fsetpos function, <a href="#7.19.2">7.19.2</a>, <a href="#7.19.5.3">7.19.5.3</a>, <a href="#7.19.7.11">7.19.7.11</a>,                 getwchar function, <a href="#7.19.1">7.19.1</a>, <a href="#7.24.3.7">7.24.3.7</a>
+       <a href="#7.19.9.1">7.19.9.1</a>, <a href="#7.19.9.3">7.19.9.3</a>, <a href="#7.24.3.10">7.24.3.10</a>                            gmtime function, <a href="#7.23.3.3">7.23.3.3</a>
+ ftell function, <a href="#7.19.9.2">7.19.9.2</a>, <a href="#7.19.9.4">7.19.9.4</a>                             goto statement, <a href="#6.2.1">6.2.1</a>, <a href="#6.8.1">6.8.1</a>, <a href="#6.8.6.1">6.8.6.1</a>
+ full declarator, <a href="#6.7.5">6.7.5</a>                                         graphic characters, <a href="#5.2.1">5.2.1</a>
+ full expression, <a href="#6.8">6.8</a>                                           greater-than operator (&gt;), <a href="#6.5.8">6.5.8</a>
+ fully buffered stream, <a href="#7.19.3">7.19.3</a>                                  greater-than-or-equal-to operator (&gt;=), <a href="#6.5.8">6.5.8</a>
+ function
+    argument, <a href="#6.5.2.2">6.5.2.2</a>, <a href="#6.9.1">6.9.1</a>                                    header, <a href="#5.1.1.1">5.1.1.1</a>, <a href="#7.1.2">7.1.2</a>, see also standard headers
+    body, <a href="#6.9.1">6.9.1</a>                                                 header names, <a href="#6.4">6.4</a>, <a href="#6.4.7">6.4.7</a>, <a href="#6.10.2">6.10.2</a>
+    call, <a href="#6.5.2.2">6.5.2.2</a>                                               hexadecimal constant, <a href="#6.4.4.1">6.4.4.1</a>
+       library, <a href="#7.1.4">7.1.4</a>                                           hexadecimal digit, <a href="#6.4.4.1">6.4.4.1</a>, <a href="#6.4.4.2">6.4.4.2</a>, <a href="#6.4.4.4">6.4.4.4</a>
+    declarator, <a href="#6.7.5.3">6.7.5.3</a>, <a href="#6.11.6">6.11.6</a>                                 hexadecimal prefix, <a href="#6.4.4.1">6.4.4.1</a>
+    definition, <a href="#6.7.5.3">6.7.5.3</a>, <a href="#6.9.1">6.9.1</a>, <a href="#6.11.7">6.11.7</a>                           hexadecimal-character escape sequence
+    designator, <a href="#6.3.2.1">6.3.2.1</a>                                              (\x hexadecimal digits), <a href="#6.4.4.4">6.4.4.4</a>
+    image, <a href="#5.2.3">5.2.3</a>                                                high-order bit, <a href="#3.6">3.6</a>
+    library, <a href="#5.1.1.1">5.1.1.1</a>, <a href="#7.1.4">7.1.4</a>                                     horizontal-tab character, <a href="#5.2.1">5.2.1</a>, <a href="#6.4">6.4</a>
+    name length, <a href="#5.2.4.1">5.2.4.1</a>, <a href="#6.4.2.1">6.4.2.1</a>, <a href="#6.11.3">6.11.3</a>                       horizontal-tab escape sequence (\r), <a href="#7.25.2.1.3">7.25.2.1.3</a>
+    parameter, <a href="#5.1.2.2.1">5.1.2.2.1</a>, <a href="#6.5.2.2">6.5.2.2</a>, <a href="#6.7">6.7</a>, <a href="#6.9.1">6.9.1</a>                   horizontal-tab escape sequence (\t), <a href="#5.2.2">5.2.2</a>,
+    prototype, <a href="#5.1.2.2.1">5.1.2.2.1</a>, <a href="#6.2.1">6.2.1</a>, <a href="#6.2.7">6.2.7</a>, <a href="#6.5.2.2">6.5.2.2</a>, <a href="#6.7">6.7</a>,                <a href="#6.4.4.4">6.4.4.4</a>, <a href="#7.4.1.3">7.4.1.3</a>, <a href="#7.4.1.10">7.4.1.10</a>
+          <a href="#6.7.5.3">6.7.5.3</a>, <a href="#6.9.1">6.9.1</a>, <a href="#6.11.6">6.11.6</a>, <a href="#6.11.7">6.11.7</a>, <a href="#7.1.2">7.1.2</a>, <a href="#7.12">7.12</a>           hosted execution environment, <a href="#4">4</a>, <a href="#5.1.2">5.1.2</a>, <a href="#5.1.2.2">5.1.2.2</a>
+    prototype scope, <a href="#6.2.1">6.2.1</a>, <a href="#6.7.5.2">6.7.5.2</a>                             HUGE_VAL macro, <a href="#7.12">7.12</a>, <a href="#7.12.1">7.12.1</a>, <a href="#7.20.1.3">7.20.1.3</a>,
+    recursive call, <a href="#6.5.2.2">6.5.2.2</a>                                          <a href="#7.24.4.1.1">7.24.4.1.1</a>, <a href="#F.9">F.9</a>
+    return, <a href="#6.8.6.4">6.8.6.4</a>                                             HUGE_VALF macro, <a href="#7.12">7.12</a>, <a href="#7.12.1">7.12.1</a>, <a href="#7.20.1.3">7.20.1.3</a>,
+    scope, <a href="#6.2.1">6.2.1</a>                                                     <a href="#7.24.4.1.1">7.24.4.1.1</a>, <a href="#F.9">F.9</a>
+    type, <a href="#6.2.5">6.2.5</a>                                                 HUGE_VALL macro, <a href="#7.12">7.12</a>, <a href="#7.12.1">7.12.1</a>, <a href="#7.20.1.3">7.20.1.3</a>,
+    type conversion, <a href="#6.3.2.1">6.3.2.1</a>                                         <a href="#7.24.4.1.1">7.24.4.1.1</a>, <a href="#F.9">F.9</a>
+ function specifiers, <a href="#6.7.4">6.7.4</a>                                      hyperbolic functions
+ function type, <a href="#6.2.5">6.2.5</a>                                             complex, <a href="#7.3.6">7.3.6</a>, <a href="#G.6.2">G.6.2</a>
+ function-call operator (( )), <a href="#6.5.2.2">6.5.2.2</a>                            real, <a href="#7.12.5">7.12.5</a>, <a href="#F.9.2">F.9.2</a>
+ function-like macro, <a href="#6.10.3">6.10.3</a>                                    hypot functions, <a href="#7.12.7.3">7.12.7.3</a>, <a href="#F.9.4.3">F.9.4.3</a>
+ future directions                                              hypot type-generic macro, <a href="#7.22">7.22</a>
+<!--page 541 -->
+ <a href="#I">I</a> macro, <a href="#7.3.1">7.3.1</a>, <a href="#7.3.9.4">7.3.9.4</a>, <a href="#G.6">G.6</a>                                    initial position, <a href="#5.2.2">5.2.2</a>
+ identifier, <a href="#6.4.2.1">6.4.2.1</a>, <a href="#6.5.1">6.5.1</a>                                       initial shift state, <a href="#5.2.1.2">5.2.1.2</a>
+    linkage, see linkage                                         initialization, <a href="#5.1.2">5.1.2</a>, <a href="#6.2.4">6.2.4</a>, <a href="#6.3.2.1">6.3.2.1</a>, <a href="#6.5.2.5">6.5.2.5</a>, <a href="#6.7.8">6.7.8</a>,
+   maximum length, <a href="#6.4.2.1">6.4.2.1</a>                                             <a href="#F.7.5">F.7.5</a>
+    name spaces, <a href="#6.2.3">6.2.3</a>                                              in blocks, <a href="#6.8">6.8</a>
+    reserved, <a href="#6.4.1">6.4.1</a>, <a href="#7.1.3">7.1.3</a>                                       initializer, <a href="#6.7.8">6.7.8</a>
+   scope, <a href="#6.2.1">6.2.1</a>                                                     permitted form, <a href="#6.6">6.6</a>
+    type, <a href="#6.2.5">6.2.5</a>                                                     string literal, <a href="#6.3.2.1">6.3.2.1</a>
+ identifier list, <a href="#6.7.5">6.7.5</a>                                           inline, <a href="#6.7.4">6.7.4</a>
+ identifier nondigit, <a href="#6.4.2.1">6.4.2.1</a>                                     inner scope, <a href="#6.2.1">6.2.1</a>
+ IEC 559, <a href="#F.1">F.1</a>                                                    input failure, <a href="#7.24.2.6">7.24.2.6</a>, <a href="#7.24.2.8">7.24.2.8</a>, <a href="#7.24.2.10">7.24.2.10</a>
+ IEC 60559, <a href="#2">2</a>, <a href="#5.1.2.3">5.1.2.3</a>, <a href="#5.2.4.2.2">5.2.4.2.2</a>, <a href="#6.10.8">6.10.8</a>, <a href="#7.3.3">7.3.3</a>, <a href="#7.6">7.6</a>,           input/output functions
+       <a href="#7.6.4.2">7.6.4.2</a>, <a href="#7.12.1">7.12.1</a>, <a href="#7.12.10.2">7.12.10.2</a>, <a href="#7.12.14">7.12.14</a>, <a href="#F">F</a>, <a href="#G">G</a>, <a href="#H.1">H.1</a>               character, <a href="#7.19.7">7.19.7</a>
+ IEEE 754, <a href="#F.1">F.1</a>                                                      direct, <a href="#7.19.8">7.19.8</a>
+ IEEE 854, <a href="#F.1">F.1</a>                                                      formatted, <a href="#7.19.6">7.19.6</a>
+ IEEE floating-point arithmetic standard, see                           wide character, <a href="#7.24.2">7.24.2</a>
+       IEC 60559, ANSI/IEEE 754,                                    wide character, <a href="#7.24.3">7.24.3</a>
+       ANSI/IEEE 854                                                   formatted, <a href="#7.24.2">7.24.2</a>
+ if preprocessing directive, <a href="#5.2.4.2.1">5.2.4.2.1</a>, <a href="#5.2.4.2.2">5.2.4.2.2</a>,               input/output header, <a href="#7.19">7.19</a>
+       <a href="#6.10.1">6.10.1</a>, <a href="#7.1.4">7.1.4</a>                                             input/output, device, <a href="#5.1.2.3">5.1.2.3</a>
+ if statement, <a href="#6.8.4.1">6.8.4.1</a>                                           int type, <a href="#6.2.5">6.2.5</a>, <a href="#6.3.1.1">6.3.1.1</a>, <a href="#6.3.1.3">6.3.1.3</a>, <a href="#6.4.4.1">6.4.4.1</a>, <a href="#6.7.2">6.7.2</a>
+ ifdef preprocessing directive, <a href="#6.10.1">6.10.1</a>                           int type conversion, <a href="#6.3.1.1">6.3.1.1</a>, <a href="#6.3.1.3">6.3.1.3</a>, <a href="#6.3.1.4">6.3.1.4</a>,
+ ifndef preprocessing directive, <a href="#6.10.1">6.10.1</a>                                <a href="#6.3.1.8">6.3.1.8</a>
+ ilogb functions, <a href="#7.12">7.12</a>, <a href="#7.12.6.5">7.12.6.5</a>, <a href="#F.9.3.5">F.9.3.5</a>                        INT_FASTN_MAX macros, <a href="#7.18.2.3">7.18.2.3</a>
+ ilogb type-generic macro, <a href="#7.22">7.22</a>                                  INT_FASTN_MIN macros, <a href="#7.18.2.3">7.18.2.3</a>
+ imaginary macro, <a href="#7.3.1">7.3.1</a>, <a href="#G.6">G.6</a>                                     int_fastN_t types, <a href="#7.18.1.3">7.18.1.3</a>
+ imaginary numbers, <a href="#G">G</a>                                            INT_LEASTN_MAX macros, <a href="#7.18.2.2">7.18.2.2</a>
+ imaginary type domain, <a href="#G.2">G.2</a>                                      INT_LEASTN_MIN macros, <a href="#7.18.2.2">7.18.2.2</a>
+ imaginary types, <a href="#G">G</a>                                              int_leastN_t types, <a href="#7.18.1.2">7.18.1.2</a>
+ imaxabs function, <a href="#7.8.2.1">7.8.2.1</a>                                       INT_MAX macro, <a href="#5.2.4.2.1">5.2.4.2.1</a>, <a href="#7.12">7.12</a>, <a href="#7.12.6.5">7.12.6.5</a>
+ imaxdiv function, <a href="#7.8">7.8</a>, <a href="#7.8.2.2">7.8.2.2</a>                                  INT_MIN macro, <a href="#5.2.4.2.1">5.2.4.2.1</a>, <a href="#7.12">7.12</a>
+ imaxdiv_t type, <a href="#7.8">7.8</a>                                             integer arithmetic functions, <a href="#7.8.2.1">7.8.2.1</a>, <a href="#7.8.2.2">7.8.2.2</a>,
+ implementation, <a href="#3.12">3.12</a>                                                  <a href="#7.20.6">7.20.6</a>
+ implementation limit, <a href="#3.13">3.13</a>, <a href="#4">4</a>, <a href="#5.2.4.2">5.2.4.2</a>, <a href="#6.4.2.1">6.4.2.1</a>,                integer character constant, <a href="#6.4.4.4">6.4.4.4</a>
+       <a href="#6.7.5">6.7.5</a>, <a href="#6.8.4.2">6.8.4.2</a>, <a href="#E">E</a>, see also environmental                 integer constant, <a href="#6.4.4.1">6.4.4.1</a>
+       limits                                                    integer constant expression, <a href="#6.6">6.6</a>
+ implementation-defined behavior, <a href="#3.4.1">3.4.1</a>, <a href="#4">4</a>, <a href="#J.3">J.3</a>                   integer conversion rank, <a href="#6.3.1.1">6.3.1.1</a>
+ implementation-defined value, <a href="#3.17.1">3.17.1</a>                             integer promotions, <a href="#5.1.2.3">5.1.2.3</a>, <a href="#5.2.4.2.1">5.2.4.2.1</a>, <a href="#6.3.1.1">6.3.1.1</a>,
+ implicit conversion, <a href="#6.3">6.3</a>                                              <a href="#6.5.2.2">6.5.2.2</a>, <a href="#6.5.3.3">6.5.3.3</a>, <a href="#6.5.7">6.5.7</a>, <a href="#6.8.4.2">6.8.4.2</a>, <a href="#7.18.2">7.18.2</a>, <a href="#7.18.3">7.18.3</a>,
+ implicit initialization, <a href="#6.7.8">6.7.8</a>                                        <a href="#7.19.6.1">7.19.6.1</a>, <a href="#7.24.2.1">7.24.2.1</a>
+ include preprocessing directive, <a href="#5.1.1.2">5.1.1.2</a>, <a href="#6.10.2">6.10.2</a>                integer suffix, <a href="#6.4.4.1">6.4.4.1</a>
+ inclusive OR operators                                          integer type conversion, <a href="#6.3.1.1">6.3.1.1</a>, <a href="#6.3.1.3">6.3.1.3</a>, <a href="#6.3.1.4">6.3.1.4</a>,
+    bitwise (|), <a href="#6.5.12">6.5.12</a>                                                <a href="#F.3">F.3</a>, <a href="#F.4">F.4</a>
+    bitwise assignment (|=), <a href="#6.5.16.2">6.5.16.2</a>                            integer types, <a href="#6.2.5">6.2.5</a>, <a href="#7.18">7.18</a>
+ incomplete type, <a href="#6.2.5">6.2.5</a>                                             extended, <a href="#6.2.5">6.2.5</a>, <a href="#6.3.1.1">6.3.1.1</a>, <a href="#6.4.4.1">6.4.4.1</a>, <a href="#7.18">7.18</a>
+ increment operators, see arithmetic operators,                  interactive device, <a href="#5.1.2.3">5.1.2.3</a>, <a href="#7.19.3">7.19.3</a>, <a href="#7.19.5.3">7.19.5.3</a>
+       increment and decrement                                   internal linkage, <a href="#6.2.2">6.2.2</a>
+ indeterminate value, <a href="#3.17.2">3.17.2</a>                                     internal name, <a href="#6.4.2.1">6.4.2.1</a>
+ indirection operator (*), <a href="#6.5.2.1">6.5.2.1</a>, <a href="#6.5.3.2">6.5.3.2</a>                      interrupt, <a href="#5.2.3">5.2.3</a>
+ inequality operator (!=), <a href="#6.5.9">6.5.9</a>                                 INTMAX_C macro, <a href="#7.18.4.2">7.18.4.2</a>
+ INFINITY macro, <a href="#7.3.9.4">7.3.9.4</a>, <a href="#7.12">7.12</a>, <a href="#F.2.1">F.2.1</a>                            INTMAX_MAX macro, <a href="#7.8.2.3">7.8.2.3</a>, <a href="#7.8.2.4">7.8.2.4</a>, <a href="#7.18.2.5">7.18.2.5</a>
+<!--page 542 -->
+ INTMAX_MIN macro, <a href="#7.8.2.3">7.8.2.3</a>, <a href="#7.8.2.4">7.8.2.4</a>, <a href="#7.18.2.5">7.18.2.5</a>            iswalpha function, <a href="#7.25.2.1.1">7.25.2.1.1</a>, <a href="#7.25.2.1.2">7.25.2.1.2</a>,
+ intmax_t type, <a href="#7.18.1.5">7.18.1.5</a>, <a href="#7.19.6.1">7.19.6.1</a>, <a href="#7.19.6.2">7.19.6.2</a>,                  <a href="#7.25.2.2.1">7.25.2.2.1</a>
+     <a href="#7.24.2.1">7.24.2.1</a>, <a href="#7.24.2.2">7.24.2.2</a>                                  iswblank function, <a href="#7.25.2.1.3">7.25.2.1.3</a>, <a href="#7.25.2.2.1">7.25.2.2.1</a>
+ INTN_C macros, <a href="#7.18.4.1">7.18.4.1</a>                                 iswcntrl function, <a href="#7.25.2.1.2">7.25.2.1.2</a>, <a href="#7.25.2.1.4">7.25.2.1.4</a>,
+ INTN_MAX macros, <a href="#7.18.2.1">7.18.2.1</a>                                     <a href="#7.25.2.1.7">7.25.2.1.7</a>, <a href="#7.25.2.1.11">7.25.2.1.11</a>, <a href="#7.25.2.2.1">7.25.2.2.1</a>
+ INTN_MIN macros, <a href="#7.18.2.1">7.18.2.1</a>                               iswctype function, <a href="#7.25.2.2.1">7.25.2.2.1</a>, <a href="#7.25.2.2.2">7.25.2.2.2</a>
+ intN_t types, <a href="#7.18.1.1">7.18.1.1</a>                                  iswdigit function, <a href="#7.25.2.1.1">7.25.2.1.1</a>, <a href="#7.25.2.1.2">7.25.2.1.2</a>,
+ INTPTR_MAX macro, <a href="#7.18.2.4">7.18.2.4</a>                                    <a href="#7.25.2.1.5">7.25.2.1.5</a>, <a href="#7.25.2.1.7">7.25.2.1.7</a>, <a href="#7.25.2.1.11">7.25.2.1.11</a>, <a href="#7.25.2.2.1">7.25.2.2.1</a>
+ INTPTR_MIN macro, <a href="#7.18.2.4">7.18.2.4</a>                              iswgraph function, <a href="#7.25.2.1">7.25.2.1</a>, <a href="#7.25.2.1.6">7.25.2.1.6</a>,
+ intptr_t type, <a href="#7.18.1.4">7.18.1.4</a>                                       <a href="#7.25.2.1.10">7.25.2.1.10</a>, <a href="#7.25.2.2.1">7.25.2.2.1</a>
+ inttypes.h header, <a href="#7.8">7.8</a>, <a href="#7.26.4">7.26.4</a>                          iswlower function, <a href="#7.25.2.1.2">7.25.2.1.2</a>, <a href="#7.25.2.1.7">7.25.2.1.7</a>,
+ isalnum function, <a href="#7.4.1.1">7.4.1.1</a>, <a href="#7.4.1.9">7.4.1.9</a>, <a href="#7.4.1.10">7.4.1.10</a>                  <a href="#7.25.2.2.1">7.25.2.2.1</a>, <a href="#7.25.3.1.1">7.25.3.1.1</a>, <a href="#7.25.3.1.2">7.25.3.1.2</a>
+ isalpha function, <a href="#7.4.1.1">7.4.1.1</a>, <a href="#7.4.1.2">7.4.1.2</a>                      iswprint function, <a href="#7.25.2.1.6">7.25.2.1.6</a>, <a href="#7.25.2.1.8">7.25.2.1.8</a>,
+ isblank function, <a href="#7.4.1.3">7.4.1.3</a>                                     <a href="#7.25.2.2.1">7.25.2.2.1</a>
+ iscntrl function, <a href="#7.4.1.2">7.4.1.2</a>, <a href="#7.4.1.4">7.4.1.4</a>, <a href="#7.4.1.7">7.4.1.7</a>,            iswpunct function, <a href="#7.25.2.1">7.25.2.1</a>, <a href="#7.25.2.1.2">7.25.2.1.2</a>,
+     <a href="#7.4.1.11">7.4.1.11</a>                                                  <a href="#7.25.2.1.7">7.25.2.1.7</a>, <a href="#7.25.2.1.9">7.25.2.1.9</a>, <a href="#7.25.2.1.10">7.25.2.1.10</a>,
+ isdigit function, <a href="#7.4.1.1">7.4.1.1</a>, <a href="#7.4.1.2">7.4.1.2</a>, <a href="#7.4.1.5">7.4.1.5</a>,                  <a href="#7.25.2.1.11">7.25.2.1.11</a>, <a href="#7.25.2.2.1">7.25.2.2.1</a>
+     <a href="#7.4.1.7">7.4.1.7</a>, <a href="#7.4.1.11">7.4.1.11</a>, <a href="#7.11.1.1">7.11.1.1</a>                         iswspace function, <a href="#7.19.6.2">7.19.6.2</a>, <a href="#7.24.2.2">7.24.2.2</a>,
+ isfinite macro, <a href="#7.12.3.2">7.12.3.2</a>, <a href="#F.3">F.3</a>                                 <a href="#7.24.4.1.1">7.24.4.1.1</a>, <a href="#7.24.4.1.2">7.24.4.1.2</a>, <a href="#7.25.2.1.2">7.25.2.1.2</a>, <a href="#7.25.2.1.6">7.25.2.1.6</a>,
+ isgraph function, <a href="#7.4.1.6">7.4.1.6</a>                                     <a href="#7.25.2.1.7">7.25.2.1.7</a>, <a href="#7.25.2.1.9">7.25.2.1.9</a>, <a href="#7.25.2.1.10">7.25.2.1.10</a>,
+ isgreater macro, <a href="#7.12.14.1">7.12.14.1</a>, <a href="#F.3">F.3</a>                               <a href="#7.25.2.1.11">7.25.2.1.11</a>, <a href="#7.25.2.2.1">7.25.2.2.1</a>
+ isgreaterequal macro, <a href="#7.12.14.2">7.12.14.2</a>, <a href="#F.3">F.3</a>                    iswupper function, <a href="#7.25.2.1.2">7.25.2.1.2</a>, <a href="#7.25.2.1.11">7.25.2.1.11</a>,
+ isinf macro, <a href="#7.12.3.3">7.12.3.3</a>                                         <a href="#7.25.2.2.1">7.25.2.2.1</a>, <a href="#7.25.3.1.1">7.25.3.1.1</a>, <a href="#7.25.3.1.2">7.25.3.1.2</a>
+ isless macro, <a href="#7.12.14.3">7.12.14.3</a>, <a href="#F.3">F.3</a>                            iswxdigit function, <a href="#7.25.2.1.12">7.25.2.1.12</a>, <a href="#7.25.2.2.1">7.25.2.2.1</a>
+ islessequal macro, <a href="#7.12.14.4">7.12.14.4</a>, <a href="#F.3">F.3</a>                       isxdigit function, <a href="#7.4.1.12">7.4.1.12</a>, <a href="#7.11.1.1">7.11.1.1</a>
+ islessgreater macro, <a href="#7.12.14.5">7.12.14.5</a>, <a href="#F.3">F.3</a>                     italic type convention, <a href="#3">3</a>, <a href="#6.1">6.1</a>
+ islower function, <a href="#7.4.1.2">7.4.1.2</a>, <a href="#7.4.1.7">7.4.1.7</a>, <a href="#7.4.2.1">7.4.2.1</a>,            iteration statements, <a href="#6.8.5">6.8.5</a>
+     <a href="#7.4.2.2">7.4.2.2</a>
+ isnan macro, <a href="#7.12.3.4">7.12.3.4</a>, <a href="#F.3">F.3</a>                              jmp_buf type, <a href="#7.13">7.13</a>
+ isnormal macro, <a href="#7.12.3.5">7.12.3.5</a>                                jump statements, <a href="#6.8.6">6.8.6</a>
+ ISO 31-11, <a href="#2">2</a>, <a href="#3">3</a>
+ ISO 4217, <a href="#2">2</a>, <a href="#7.11.2.1">7.11.2.1</a>                                   keywords, <a href="#6.4.1">6.4.1</a>, <a href="#G.2">G.2</a>, <a href="#J.5.9">J.5.9</a>, <a href="#J.5.10">J.5.10</a>
+ ISO 8601, <a href="#2">2</a>, <a href="#7.23.3.5">7.23.3.5</a>                                   known constant size, <a href="#6.2.5">6.2.5</a>
+ ISO/IEC 10646, <a href="#2">2</a>, <a href="#6.4.2.1">6.4.2.1</a>, <a href="#6.4.3">6.4.3</a>, <a href="#6.10.8">6.10.8</a>
+ ISO/IEC 10976-1, <a href="#H.1">H.1</a>                                    L_tmpnam macro, <a href="#7.19.1">7.19.1</a>, <a href="#7.19.4.4">7.19.4.4</a>
+ ISO/IEC 2382-1, <a href="#2">2</a>, <a href="#3">3</a>                                    label name, <a href="#6.2.1">6.2.1</a>, <a href="#6.2.3">6.2.3</a>
+ ISO/IEC 646, <a href="#2">2</a>, <a href="#5.2.1.1">5.2.1.1</a>                                 labeled statement, <a href="#6.8.1">6.8.1</a>
+ ISO/IEC 9945-2, <a href="#7.11">7.11</a>                                    labs function, <a href="#7.20.6.1">7.20.6.1</a>
+ ISO/IEC TR 10176, <a href="#D">D</a>                                     language, <a href="#6">6</a>
+ iso646.h header, <a href="#4">4</a>, <a href="#7.9">7.9</a>                                    future directions, <a href="#6.11">6.11</a>
+ isprint function, <a href="#5.2.2">5.2.2</a>, <a href="#7.4.1.8">7.4.1.8</a>                           syntax summary, <a href="#A">A</a>
+ ispunct function, <a href="#7.4.1.2">7.4.1.2</a>, <a href="#7.4.1.7">7.4.1.7</a>, <a href="#7.4.1.9">7.4.1.9</a>,            Latin alphabet, <a href="#5.2.1">5.2.1</a>, <a href="#6.4.2.1">6.4.2.1</a>
+     <a href="#7.4.1.11">7.4.1.11</a>                                            LC_ALL macro, <a href="#7.11">7.11</a>, <a href="#7.11.1.1">7.11.1.1</a>, <a href="#7.11.2.1">7.11.2.1</a>
+ isspace function, <a href="#7.4.1.2">7.4.1.2</a>, <a href="#7.4.1.7">7.4.1.7</a>, <a href="#7.4.1.9">7.4.1.9</a>,            LC_COLLATE macro, <a href="#7.11">7.11</a>, <a href="#7.11.1.1">7.11.1.1</a>, <a href="#7.21.4.3">7.21.4.3</a>,
+     <a href="#7.4.1.10">7.4.1.10</a>, <a href="#7.4.1.11">7.4.1.11</a>, <a href="#7.19.6.2">7.19.6.2</a>, <a href="#7.20.1.3">7.20.1.3</a>,                   <a href="#7.24.4.4.2">7.24.4.4.2</a>
+     <a href="#7.20.1.4">7.20.1.4</a>, <a href="#7.24.2.2">7.24.2.2</a>                                  LC_CTYPE macro, <a href="#7.11">7.11</a>, <a href="#7.11.1.1">7.11.1.1</a>, <a href="#7.20">7.20</a>, <a href="#7.20.7">7.20.7</a>,
+ isunordered macro, <a href="#7.12.14.6">7.12.14.6</a>, <a href="#F.3">F.3</a>                             <a href="#7.20.8">7.20.8</a>, <a href="#7.24.6">7.24.6</a>, <a href="#7.25.1">7.25.1</a>, <a href="#7.25.2.2.1">7.25.2.2.1</a>, <a href="#7.25.2.2.2">7.25.2.2.2</a>,
+ isupper function, <a href="#7.4.1.2">7.4.1.2</a>, <a href="#7.4.1.11">7.4.1.11</a>, <a href="#7.4.2.1">7.4.2.1</a>,                 <a href="#7.25.3.2.1">7.25.3.2.1</a>, <a href="#7.25.3.2.2">7.25.3.2.2</a>
+     <a href="#7.4.2.2">7.4.2.2</a>                                             LC_MONETARY macro, <a href="#7.11">7.11</a>, <a href="#7.11.1.1">7.11.1.1</a>, <a href="#7.11.2.1">7.11.2.1</a>
+ iswalnum function, <a href="#7.25.2.1.1">7.25.2.1.1</a>, <a href="#7.25.2.1.9">7.25.2.1.9</a>,              LC_NUMERIC macro, <a href="#7.11">7.11</a>, <a href="#7.11.1.1">7.11.1.1</a>, <a href="#7.11.2.1">7.11.2.1</a>
+     <a href="#7.25.2.1.10">7.25.2.1.10</a>, <a href="#7.25.2.2.1">7.25.2.2.1</a>                             LC_TIME macro, <a href="#7.11">7.11</a>, <a href="#7.11.1.1">7.11.1.1</a>, <a href="#7.23.3.5">7.23.3.5</a>
+<!--page 543 -->
+ lconv structure type, <a href="#7.11">7.11</a>                                 llabs function, <a href="#7.20.6.1">7.20.6.1</a>
+ LDBL_DIG macro, <a href="#5.2.4.2.2">5.2.4.2.2</a>                                  lldiv function, <a href="#7.20.6.2">7.20.6.2</a>
+ LDBL_EPSILON macro, <a href="#5.2.4.2.2">5.2.4.2.2</a>                              lldiv_t type, <a href="#7.20">7.20</a>
+ LDBL_MANT_DIG macro, <a href="#5.2.4.2.2">5.2.4.2.2</a>                             LLONG_MAX macro, <a href="#5.2.4.2.1">5.2.4.2.1</a>, <a href="#7.20.1.4">7.20.1.4</a>,
+ LDBL_MAX macro, <a href="#5.2.4.2.2">5.2.4.2.2</a>                                       <a href="#7.24.4.1.2">7.24.4.1.2</a>
+ LDBL_MAX_10_EXP macro, <a href="#5.2.4.2.2">5.2.4.2.2</a>                           LLONG_MIN macro, <a href="#5.2.4.2.1">5.2.4.2.1</a>, <a href="#7.20.1.4">7.20.1.4</a>,
+ LDBL_MAX_EXP macro, <a href="#5.2.4.2.2">5.2.4.2.2</a>                                   <a href="#7.24.4.1.2">7.24.4.1.2</a>
+ LDBL_MIN macro, <a href="#5.2.4.2.2">5.2.4.2.2</a>                                  llrint functions, <a href="#7.12.9.5">7.12.9.5</a>, <a href="#F.3">F.3</a>, <a href="#F.9.6.5">F.9.6.5</a>
+ LDBL_MIN_10_EXP macro, <a href="#5.2.4.2.2">5.2.4.2.2</a>                           llrint type-generic macro, <a href="#7.22">7.22</a>
+ LDBL_MIN_EXP macro, <a href="#5.2.4.2.2">5.2.4.2.2</a>                              llround functions, <a href="#7.12.9.7">7.12.9.7</a>, <a href="#F.9.6.7">F.9.6.7</a>
+ ldexp functions, <a href="#7.12.6.6">7.12.6.6</a>, <a href="#F.9.3.6">F.9.3.6</a>                         llround type-generic macro, <a href="#7.22">7.22</a>
+ ldexp type-generic macro, <a href="#7.22">7.22</a>                             local time, <a href="#7.23.1">7.23.1</a>
+ ldiv function, <a href="#7.20.6.2">7.20.6.2</a>                                    locale, <a href="#3.4.2">3.4.2</a>
+ ldiv_t type, <a href="#7.20">7.20</a>                                          locale-specific behavior, <a href="#3.4.2">3.4.2</a>, <a href="#J.4">J.4</a>
+ leading underscore in identifiers, <a href="#7.1.3">7.1.3</a>                    locale.h header, <a href="#7.11">7.11</a>, <a href="#7.26.5">7.26.5</a>
+ left-shift assignment operator (&lt;&lt;=), <a href="#6.5.16.2">6.5.16.2</a>             localeconv function, <a href="#7.11.1.1">7.11.1.1</a>, <a href="#7.11.2.1">7.11.2.1</a>
+ left-shift operator (&lt;&lt;), <a href="#6.5.7">6.5.7</a>                            localization, <a href="#7.11">7.11</a>
+ length                                                     localtime function, <a href="#7.23.3.4">7.23.3.4</a>
+    external name, <a href="#5.2.4.1">5.2.4.1</a>, <a href="#6.4.2.1">6.4.2.1</a>, <a href="#6.11.3">6.11.3</a>                 log functions, <a href="#7.12.6.7">7.12.6.7</a>, <a href="#F.9.3.7">F.9.3.7</a>
+    function name, <a href="#5.2.4.1">5.2.4.1</a>, <a href="#6.4.2.1">6.4.2.1</a>, <a href="#6.11.3">6.11.3</a>                 log type-generic macro, <a href="#7.22">7.22</a>
+    identifier, <a href="#6.4.2.1">6.4.2.1</a>                                      log10 functions, <a href="#7.12.6.8">7.12.6.8</a>, <a href="#F.9.3.8">F.9.3.8</a>
+    internal name, <a href="#5.2.4.1">5.2.4.1</a>, <a href="#6.4.2.1">6.4.2.1</a>                         log10 type-generic macro, <a href="#7.22">7.22</a>
+ length function, <a href="#7.20.7.1">7.20.7.1</a>, <a href="#7.21.6.3">7.21.6.3</a>, <a href="#7.24.4.6.1">7.24.4.6.1</a>,           log1p functions, <a href="#7.12.6.9">7.12.6.9</a>, <a href="#F.9.3.9">F.9.3.9</a>
+       <a href="#7.24.6.3.1">7.24.6.3.1</a>                                           log1p type-generic macro, <a href="#7.22">7.22</a>
+ length modifier, <a href="#7.19.6.1">7.19.6.1</a>, <a href="#7.19.6.2">7.19.6.2</a>, <a href="#7.24.2.1">7.24.2.1</a>,              log2 functions, <a href="#7.12.6.10">7.12.6.10</a>, <a href="#F.9.3.10">F.9.3.10</a>
+       <a href="#7.24.2.2">7.24.2.2</a>                                             log2 type-generic macro, <a href="#7.22">7.22</a>
+ less-than operator (&lt;), <a href="#6.5.8">6.5.8</a>                              logarithmic functions
+ less-than-or-equal-to operator (&lt;=), <a href="#6.5.8">6.5.8</a>                   complex, <a href="#7.3.7">7.3.7</a>, <a href="#G.6.3">G.6.3</a>
+ letter, <a href="#5.2.1">5.2.1</a>, <a href="#7.4">7.4</a>                                           real, <a href="#7.12.6">7.12.6</a>, <a href="#F.9.3">F.9.3</a>
+ lexical elements, <a href="#5.1.1.2">5.1.1.2</a>, <a href="#6.4">6.4</a>                             logb functions, <a href="#7.12.6.11">7.12.6.11</a>, <a href="#F.3">F.3</a>, <a href="#F.9.3.11">F.9.3.11</a>
+ lgamma functions, <a href="#7.12.8.3">7.12.8.3</a>, <a href="#F.9.5.3">F.9.5.3</a>                        logb type-generic macro, <a href="#7.22">7.22</a>
+ lgamma type-generic macro, <a href="#7.22">7.22</a>                            logical operators
+ library, <a href="#5.1.1.1">5.1.1.1</a>, <a href="#7">7</a>                                          AND (&amp;&amp;), <a href="#6.5.13">6.5.13</a>
+    future directions, <a href="#7.26">7.26</a>                                   negation (!), <a href="#6.5.3.3">6.5.3.3</a>
+    summary, <a href="#B">B</a>                                                OR (||), <a href="#6.5.14">6.5.14</a>
+    terms, <a href="#7.1.1">7.1.1</a>                                            logical source lines, <a href="#5.1.1.2">5.1.1.2</a>
+    use of functions, <a href="#7.1.4">7.1.4</a>                                 long double _Complex type, <a href="#6.2.5">6.2.5</a>
+ lifetime, <a href="#6.2.4">6.2.4</a>                                            long double _Complex type conversion,
+ limits                                                          <a href="#6.3.1.6">6.3.1.6</a>, <a href="#6.3.1.7">6.3.1.7</a>, <a href="#6.3.1.8">6.3.1.8</a>
+    environmental, see environmental limits                 long double _Imaginary type, <a href="#G.2">G.2</a>
+    implementation, see implementation limits               long double suffix, l or <a href="#L">L</a>, <a href="#6.4.4.2">6.4.4.2</a>
+    numerical, see numerical limits                         long double type, <a href="#6.2.5">6.2.5</a>, <a href="#6.4.4.2">6.4.4.2</a>, <a href="#6.7.2">6.7.2</a>,
+    translation, see translation limits                          <a href="#7.19.6.1">7.19.6.1</a>, <a href="#7.19.6.2">7.19.6.2</a>, <a href="#7.24.2.1">7.24.2.1</a>, <a href="#7.24.2.2">7.24.2.2</a>, <a href="#F.2">F.2</a>
+ limits.h header, <a href="#4">4</a>, <a href="#5.2.4.2.1">5.2.4.2.1</a>, <a href="#6.2.5">6.2.5</a>, <a href="#7.10">7.10</a>                 long double type conversion, <a href="#6.3.1.4">6.3.1.4</a>, <a href="#6.3.1.5">6.3.1.5</a>,
+ line buffered stream, <a href="#7.19.3">7.19.3</a>                                    <a href="#6.3.1.7">6.3.1.7</a>, <a href="#6.3.1.8">6.3.1.8</a>
+ line number, <a href="#6.10.4">6.10.4</a>, <a href="#6.10.8">6.10.8</a>                                long int type, <a href="#6.2.5">6.2.5</a>, <a href="#6.3.1.1">6.3.1.1</a>, <a href="#6.7.2">6.7.2</a>, <a href="#7.19.6.1">7.19.6.1</a>,
+ line preprocessing directive, <a href="#6.10.4">6.10.4</a>                            <a href="#7.19.6.2">7.19.6.2</a>, <a href="#7.24.2.1">7.24.2.1</a>, <a href="#7.24.2.2">7.24.2.2</a>
+ lines, <a href="#5.1.1.2">5.1.1.2</a>, <a href="#7.19.2">7.19.2</a>                                     long int type conversion, <a href="#6.3.1.1">6.3.1.1</a>, <a href="#6.3.1.3">6.3.1.3</a>,
+    preprocessing directive, <a href="#6.10">6.10</a>                                <a href="#6.3.1.4">6.3.1.4</a>, <a href="#6.3.1.8">6.3.1.8</a>
+ linkage, <a href="#6.2.2">6.2.2</a>, <a href="#6.7">6.7</a>, <a href="#6.7.4">6.7.4</a>, <a href="#6.7.5.2">6.7.5.2</a>, <a href="#6.9">6.9</a>, <a href="#6.9.2">6.9.2</a>,           long integer suffix, l or <a href="#L">L</a>, <a href="#6.4.4.1">6.4.4.1</a>
+       <a href="#6.11.2">6.11.2</a>                                               long long int type, <a href="#6.2.5">6.2.5</a>, <a href="#6.3.1.1">6.3.1.1</a>, <a href="#6.7.2">6.7.2</a>,
+<!--page 544 -->
+      <a href="#7.19.6.1">7.19.6.1</a>, <a href="#7.19.6.2">7.19.6.2</a>, <a href="#7.24.2.1">7.24.2.1</a>, <a href="#7.24.2.2">7.24.2.2</a>                    mbsinit function, <a href="#7.24.6.2.1">7.24.6.2.1</a>
+ long long int type conversion, <a href="#6.3.1.1">6.3.1.1</a>,                        mbsrtowcs function, <a href="#7.24.6.4.1">7.24.6.4.1</a>
+      <a href="#6.3.1.3">6.3.1.3</a>, <a href="#6.3.1.4">6.3.1.4</a>, <a href="#6.3.1.8">6.3.1.8</a>                                 mbstate_t type, <a href="#7.19.2">7.19.2</a>, <a href="#7.19.3">7.19.3</a>, <a href="#7.19.6.1">7.19.6.1</a>,
+ long long integer suffix, ll or LL, <a href="#6.4.4.1">6.4.4.1</a>                          <a href="#7.19.6.2">7.19.6.2</a>, <a href="#7.24.1">7.24.1</a>, <a href="#7.24.2.1">7.24.2.1</a>, <a href="#7.24.2.2">7.24.2.2</a>, <a href="#7.24.6">7.24.6</a>,
+ LONG_MAX macro, <a href="#5.2.4.2.1">5.2.4.2.1</a>, <a href="#7.20.1.4">7.20.1.4</a>, <a href="#7.24.4.1.2">7.24.4.1.2</a>                     <a href="#7.24.6.2.1">7.24.6.2.1</a>, <a href="#7.24.6.3">7.24.6.3</a>, <a href="#7.24.6.3.1">7.24.6.3.1</a>, <a href="#7.24.6.4">7.24.6.4</a>
+ LONG_MIN macro, <a href="#5.2.4.2.1">5.2.4.2.1</a>, <a href="#7.20.1.4">7.20.1.4</a>, <a href="#7.24.4.1.2">7.24.4.1.2</a>                mbstowcs function, <a href="#6.4.5">6.4.5</a>, <a href="#7.20.8.1">7.20.8.1</a>, <a href="#7.24.6.4">7.24.6.4</a>
+ longjmp function, <a href="#7.13.1.1">7.13.1.1</a>, <a href="#7.13.2.1">7.13.2.1</a>, <a href="#7.20.4.3">7.20.4.3</a>                 mbtowc function, <a href="#7.20.7.1">7.20.7.1</a>, <a href="#7.20.7.2">7.20.7.2</a>, <a href="#7.20.8.1">7.20.8.1</a>,
+ loop body, <a href="#6.8.5">6.8.5</a>                                                    <a href="#7.24.6.3">7.24.6.3</a>
+ low-order bit, <a href="#3.6">3.6</a>                                             member access operators (. and -&gt;), <a href="#6.5.2.3">6.5.2.3</a>
+ lowercase letter, <a href="#5.2.1">5.2.1</a>                                        member alignment, <a href="#6.7.2.1">6.7.2.1</a>
+ lrint functions, <a href="#7.12.9.5">7.12.9.5</a>, <a href="#F.3">F.3</a>, <a href="#F.9.6.5">F.9.6.5</a>                        memchr function, <a href="#7.21.5.1">7.21.5.1</a>
+ lrint type-generic macro, <a href="#7.22">7.22</a>                                 memcmp function, <a href="#7.21.4">7.21.4</a>, <a href="#7.21.4.1">7.21.4.1</a>
+ lround functions, <a href="#7.12.9.7">7.12.9.7</a>, <a href="#F.9.6.7">F.9.6.7</a>                            memcpy function, <a href="#7.21.2.1">7.21.2.1</a>
+ lround type-generic macro, <a href="#7.22">7.22</a>                                memmove function, <a href="#7.21.2.2">7.21.2.2</a>
+ lvalue, <a href="#6.3.2.1">6.3.2.1</a>, <a href="#6.5.1">6.5.1</a>, <a href="#6.5.2.4">6.5.2.4</a>, <a href="#6.5.3.1">6.5.3.1</a>, <a href="#6.5.16">6.5.16</a>               memory management functions, <a href="#7.20.3">7.20.3</a>
+                                                                memset function, <a href="#7.21.6.1">7.21.6.1</a>
+ macro argument substitution, <a href="#6.10.3.1">6.10.3.1</a>                          minimum functions, <a href="#7.12.12">7.12.12</a>, <a href="#F.9.9">F.9.9</a>
+ macro definition                                                minus operator, unary, <a href="#6.5.3.3">6.5.3.3</a>
+   library function, <a href="#7.1.4">7.1.4</a>                                      miscellaneous functions
+ macro invocation, <a href="#6.10.3">6.10.3</a>                                         string, <a href="#7.21.6">7.21.6</a>
+ macro name, <a href="#6.10.3">6.10.3</a>                                               wide string, <a href="#7.24.4.6">7.24.4.6</a>
+   length, <a href="#5.2.4.1">5.2.4.1</a>                                              mktime function, <a href="#7.23.2.3">7.23.2.3</a>
+   predefined, <a href="#6.10.8">6.10.8</a>, <a href="#6.11.9">6.11.9</a>                                    modf functions, <a href="#7.12.6.12">7.12.6.12</a>, <a href="#F.9.3.12">F.9.3.12</a>
+   redefinition, <a href="#6.10.3">6.10.3</a>                                          modifiable lvalue, <a href="#6.3.2.1">6.3.2.1</a>
+   scope, <a href="#6.10.3.5">6.10.3.5</a>                                              modulus functions, <a href="#7.12.6.12">7.12.6.12</a>
+ macro parameter, <a href="#6.10.3">6.10.3</a>                                        modulus, complex, <a href="#7.3.8.1">7.3.8.1</a>
+ macro preprocessor, <a href="#6.10">6.10</a>                                       multibyte character, <a href="#3.7.2">3.7.2</a>, <a href="#5.2.1.2">5.2.1.2</a>, <a href="#6.4.4.4">6.4.4.4</a>
+ macro replacement, <a href="#6.10.3">6.10.3</a>                                      multibyte conversion functions
+ magnitude, complex, <a href="#7.3.8.1">7.3.8.1</a>                                      wide character, <a href="#7.20.7">7.20.7</a>
+ main function, <a href="#5.1.2.2.1">5.1.2.2.1</a>, <a href="#5.1.2.2.3">5.1.2.2.3</a>, <a href="#6.7.3.1">6.7.3.1</a>, <a href="#6.7.4">6.7.4</a>,                extended, <a href="#7.24.6">7.24.6</a>
+      <a href="#7.19.3">7.19.3</a>                                                         restartable, <a href="#7.24.6.3">7.24.6.3</a>
+ malloc function, <a href="#7.20.3">7.20.3</a>, <a href="#7.20.3.2">7.20.3.2</a>, <a href="#7.20.3.3">7.20.3.3</a>,                     wide string, <a href="#7.20.8">7.20.8</a>
+      <a href="#7.20.3.4">7.20.3.4</a>                                                       restartable, <a href="#7.24.6.4">7.24.6.4</a>
+ manipulation functions                                         multibyte string, <a href="#7.1.1">7.1.1</a>
+   complex, <a href="#7.3.9">7.3.9</a>                                               multibyte/wide character conversion functions,
+   real, <a href="#7.12.11">7.12.11</a>, <a href="#F.9.8">F.9.8</a>                                              <a href="#7.20.7">7.20.7</a>
+ matching failure, <a href="#7.24.2.6">7.24.2.6</a>, <a href="#7.24.2.8">7.24.2.8</a>, <a href="#7.24.2.10">7.24.2.10</a>                  extended, <a href="#7.24.6">7.24.6</a>
+ math.h header, <a href="#5.2.4.2.2">5.2.4.2.2</a>, <a href="#6.5">6.5</a>, <a href="#7.12">7.12</a>, <a href="#7.22">7.22</a>, <a href="#F">F</a>, <a href="#F.9">F.9</a>,               restartable, <a href="#7.24.6.3">7.24.6.3</a>
+      <a href="#J.5.17">J.5.17</a>                                                    multibyte/wide string conversion functions, <a href="#7.20.8">7.20.8</a>
+ MATH_ERREXCEPT macro, <a href="#7.12">7.12</a>, <a href="#F.9">F.9</a>                                  restartable, <a href="#7.24.6.4">7.24.6.4</a>
+ math_errhandling macro, <a href="#7.1.3">7.1.3</a>, <a href="#7.12">7.12</a>, <a href="#F.9">F.9</a>                       multidimensional array, <a href="#6.5.2.1">6.5.2.1</a>
+ MATH_ERRNO macro, <a href="#7.12">7.12</a>                                         multiplication assignment operator (*=), <a href="#6.5.16.2">6.5.16.2</a>
+ maximum functions, <a href="#7.12.12">7.12.12</a>, <a href="#F.9.9">F.9.9</a>                              multiplication operator (*), <a href="#6.5.5">6.5.5</a>, <a href="#F.3">F.3</a>, <a href="#G.5.1">G.5.1</a>
+ MB_CUR_MAX macro, <a href="#7.1.1">7.1.1</a>, <a href="#7.20">7.20</a>, <a href="#7.20.7.2">7.20.7.2</a>,                       multiplicative expressions, <a href="#6.5.5">6.5.5</a>, <a href="#G.5.1">G.5.1</a>
+      <a href="#7.20.7.3">7.20.7.3</a>, <a href="#7.24.6.3.3">7.24.6.3.3</a>
+ MB_LEN_MAX macro, <a href="#5.2.4.2.1">5.2.4.2.1</a>, <a href="#7.1.1">7.1.1</a>, <a href="#7.20">7.20</a>                       n-char sequence, <a href="#7.20.1.3">7.20.1.3</a>
+ mblen function, <a href="#7.20.7.1">7.20.7.1</a>, <a href="#7.24.6.3">7.24.6.3</a>                             n-wchar sequence, <a href="#7.24.4.1.1">7.24.4.1.1</a>
+ mbrlen function, <a href="#7.24.6.3.1">7.24.6.3.1</a>                                    name
+ mbrtowc function, <a href="#7.19.3">7.19.3</a>, <a href="#7.19.6.1">7.19.6.1</a>, <a href="#7.19.6.2">7.19.6.2</a>,                    external, <a href="#5.2.4.1">5.2.4.1</a>, <a href="#6.4.2.1">6.4.2.1</a>, <a href="#6.11.3">6.11.3</a>
+      <a href="#7.24.2.1">7.24.2.1</a>, <a href="#7.24.2.2">7.24.2.2</a>, <a href="#7.24.6.3.1">7.24.6.3.1</a>, <a href="#7.24.6.3.2">7.24.6.3.2</a>,                 file, <a href="#7.19.3">7.19.3</a>
+      <a href="#7.24.6.4.1">7.24.6.4.1</a>                                                  internal, <a href="#5.2.4.1">5.2.4.1</a>, <a href="#6.4.2.1">6.4.2.1</a>
+<!--page 545 -->
+   label, <a href="#6.2.3">6.2.3</a>                                                  octal-character escape sequence (\octal digits),
+   structure/union member, <a href="#6.2.3">6.2.3</a>                                       <a href="#6.4.4.4">6.4.4.4</a>
+ name spaces, <a href="#6.2.3">6.2.3</a>                                              offsetof macro, <a href="#7.17">7.17</a>
+ named label, <a href="#6.8.1">6.8.1</a>                                              on-off switch, <a href="#6.10.6">6.10.6</a>
+ NaN, <a href="#5.2.4.2.2">5.2.4.2.2</a>                                                  ones' complement, <a href="#6.2.6.2">6.2.6.2</a>
+ nan functions, <a href="#7.12.11.2">7.12.11.2</a>, <a href="#F.2.1">F.2.1</a>, <a href="#F.9.8.2">F.9.8.2</a>                        operand, <a href="#6.4.6">6.4.6</a>, <a href="#6.5">6.5</a>
+ NAN macro, <a href="#7.12">7.12</a>, <a href="#F.2.1">F.2.1</a>                                          operating system, <a href="#5.1.2.1">5.1.2.1</a>, <a href="#7.20.4.6">7.20.4.6</a>
+ NDEBUG macro, <a href="#7.2">7.2</a>                                               operations on files, <a href="#7.19.4">7.19.4</a>
+ nearbyint functions, <a href="#7.12.9.3">7.12.9.3</a>, <a href="#7.12.9.4">7.12.9.4</a>, <a href="#F.3">F.3</a>,                   operator, <a href="#6.4.6">6.4.6</a>
+      <a href="#F.9.6.3">F.9.6.3</a>                                                    operators, <a href="#6.5">6.5</a>
+ nearbyint type-generic macro, <a href="#7.22">7.22</a>                                 assignment, <a href="#6.5.16">6.5.16</a>
+ nearest integer functions, <a href="#7.12.9">7.12.9</a>, <a href="#F.9.6">F.9.6</a>                           associativity, <a href="#6.5">6.5</a>
+ negation operator (!), <a href="#6.5.3.3">6.5.3.3</a>                                     equality, <a href="#6.5.9">6.5.9</a>
+ negative zero, <a href="#6.2.6.2">6.2.6.2</a>, <a href="#7.12.11.1">7.12.11.1</a>                                  multiplicative, <a href="#6.5.5">6.5.5</a>, <a href="#G.5.1">G.5.1</a>
+ new-line character, <a href="#5.1.1.2">5.1.1.2</a>, <a href="#5.2.1">5.2.1</a>, <a href="#6.4">6.4</a>, <a href="#6.10">6.10</a>, <a href="#6.10.4">6.10.4</a>              postfix, <a href="#6.5.2">6.5.2</a>
+ new-line escape sequence (\n), <a href="#5.2.2">5.2.2</a>, <a href="#6.4.4.4">6.4.4.4</a>,                     precedence, <a href="#6.5">6.5</a>
+      <a href="#7.4.1.10">7.4.1.10</a>                                                      preprocessing, <a href="#6.10.1">6.10.1</a>, <a href="#6.10.3.2">6.10.3.2</a>, <a href="#6.10.3.3">6.10.3.3</a>, <a href="#6.10.9">6.10.9</a>
+ nextafter functions, <a href="#7.12.11.3">7.12.11.3</a>, <a href="#7.12.11.4">7.12.11.4</a>, <a href="#F.3">F.3</a>,                    relational, <a href="#6.5.8">6.5.8</a>
+      <a href="#F.9.8.3">F.9.8.3</a>                                                       shift, <a href="#6.5.7">6.5.7</a>
+ nextafter type-generic macro, <a href="#7.22">7.22</a>                                 unary, <a href="#6.5.3">6.5.3</a>
+ nexttoward functions, <a href="#7.12.11.4">7.12.11.4</a>, <a href="#F.3">F.3</a>, <a href="#F.9.8.4">F.9.8.4</a>                      unary arithmetic, <a href="#6.5.3.3">6.5.3.3</a>
+ nexttoward type-generic macro, <a href="#7.22">7.22</a>                             or macro, <a href="#7.9">7.9</a>
+ no linkage, <a href="#6.2.2">6.2.2</a>                                               OR operators
+ non-stop floating-point control mode, <a href="#7.6.4.2">7.6.4.2</a>                       bitwise exclusive (^), <a href="#6.5.11">6.5.11</a>
+ nongraphic characters, <a href="#5.2.2">5.2.2</a>, <a href="#6.4.4.4">6.4.4.4</a>                              bitwise exclusive assignment (^=), <a href="#6.5.16.2">6.5.16.2</a>
+ nonlocal jumps header, <a href="#7.13">7.13</a>                                        bitwise inclusive (|), <a href="#6.5.12">6.5.12</a>
+ norm, complex, <a href="#7.3.8.1">7.3.8.1</a>                                             bitwise inclusive assignment (|=), <a href="#6.5.16.2">6.5.16.2</a>
+ not macro, <a href="#7.9">7.9</a>                                                     logical (||), <a href="#6.5.14">6.5.14</a>
+ not-equal-to operator, see inequality operator                  or_eq macro, <a href="#7.9">7.9</a>
+ not_eq macro, <a href="#7.9">7.9</a>                                               order of allocated storage, <a href="#7.20.3">7.20.3</a>
+ null character (\0), <a href="#5.2.1">5.2.1</a>, <a href="#6.4.4.4">6.4.4.4</a>, <a href="#6.4.5">6.4.5</a>                      order of evaluation, <a href="#6.5">6.5</a>
+   padding of binary stream, <a href="#7.19.2">7.19.2</a>                              ordinary identifier name space, <a href="#6.2.3">6.2.3</a>
+ NULL macro, <a href="#7.11">7.11</a>, <a href="#7.17">7.17</a>, <a href="#7.19.1">7.19.1</a>, <a href="#7.20">7.20</a>, <a href="#7.21.1">7.21.1</a>,                   orientation of stream, <a href="#7.19.2">7.19.2</a>, <a href="#7.24.3.5">7.24.3.5</a>
+      <a href="#7.23.1">7.23.1</a>, <a href="#7.24.1">7.24.1</a>                                             outer scope, <a href="#6.2.1">6.2.1</a>
+ null pointer, <a href="#6.3.2.3">6.3.2.3</a>
+ null pointer constant, <a href="#6.3.2.3">6.3.2.3</a>                                  padding
+ null preprocessing directive, <a href="#6.10.7">6.10.7</a>                              binary stream, <a href="#7.19.2">7.19.2</a>
+ null statement, <a href="#6.8.3">6.8.3</a>                                             bits, <a href="#6.2.6.2">6.2.6.2</a>, <a href="#7.18.1.1">7.18.1.1</a>
+ null wide character, <a href="#7.1.1">7.1.1</a>                                        structure/union, <a href="#6.2.6.1">6.2.6.1</a>, <a href="#6.7.2.1">6.7.2.1</a>
+ number classification macros, <a href="#7.12">7.12</a>, <a href="#7.12.3.1">7.12.3.1</a>                     parameter, <a href="#3.15">3.15</a>
+ numeric conversion functions, <a href="#7.8.2.3">7.8.2.3</a>, <a href="#7.20.1">7.20.1</a>                     array, <a href="#6.9.1">6.9.1</a>
+   wide string, <a href="#7.8.2.4">7.8.2.4</a>, <a href="#7.24.4.1">7.24.4.1</a>                                  ellipsis, <a href="#6.7.5.3">6.7.5.3</a>, <a href="#6.10.3">6.10.3</a>
+ numerical limits, <a href="#5.2.4.2">5.2.4.2</a>                                         function, <a href="#6.5.2.2">6.5.2.2</a>, <a href="#6.7">6.7</a>, <a href="#6.9.1">6.9.1</a>
+                                                                   macro, <a href="#6.10.3">6.10.3</a>
+ object, <a href="#3.14">3.14</a>                                                      main function, <a href="#5.1.2.2.1">5.1.2.2.1</a>
+ object representation, <a href="#6.2.6.1">6.2.6.1</a>                                    program, <a href="#5.1.2.2.1">5.1.2.2.1</a>
+ object type, <a href="#6.2.5">6.2.5</a>                                              parameter type list, <a href="#6.7.5.3">6.7.5.3</a>
+ object-like macro, <a href="#6.10.3">6.10.3</a>                                       parentheses punctuator (( )), <a href="#6.7.5.3">6.7.5.3</a>, <a href="#6.8.4">6.8.4</a>, <a href="#6.8.5">6.8.5</a>
+ obsolescence, <a href="#6.11">6.11</a>, <a href="#7.26">7.26</a>                                        parenthesized expression, <a href="#6.5.1">6.5.1</a>
+ octal constant, <a href="#6.4.4.1">6.4.4.1</a>                                         parse state, <a href="#7.19.2">7.19.2</a>
+ octal digit, <a href="#6.4.4.1">6.4.4.1</a>, <a href="#6.4.4.4">6.4.4.4</a>                                   permitted form of initializer, <a href="#6.6">6.6</a>
+<!--page 546 -->
+ perror function, <a href="#7.19.10.4">7.19.10.4</a>                                    PRIcPTR macros, <a href="#7.8.1">7.8.1</a>
+ phase angle, complex, <a href="#7.3.9.1">7.3.9.1</a>                                 primary expression, <a href="#6.5.1">6.5.1</a>
+ physical source lines, <a href="#5.1.1.2">5.1.1.2</a>                                printf function, <a href="#7.19.1">7.19.1</a>, <a href="#7.19.6.3">7.19.6.3</a>, <a href="#7.19.6.10">7.19.6.10</a>
+ placemarker, <a href="#6.10.3.3">6.10.3.3</a>                                         printing character, <a href="#5.2.2">5.2.2</a>, <a href="#7.4">7.4</a>, <a href="#7.4.1.8">7.4.1.8</a>
+ plus operator, unary, <a href="#6.5.3.3">6.5.3.3</a>                                 printing wide character, <a href="#7.25.2">7.25.2</a>
+ pointer arithmetic, <a href="#6.5.6">6.5.6</a>                                     program diagnostics, <a href="#7.2.1">7.2.1</a>
+ pointer comparison, <a href="#6.5.8">6.5.8</a>                                     program execution, <a href="#5.1.2.2.2">5.1.2.2.2</a>, <a href="#5.1.2.3">5.1.2.3</a>
+ pointer declarator, <a href="#6.7.5.1">6.7.5.1</a>                                   program file, <a href="#5.1.1.1">5.1.1.1</a>
+ pointer operator (-&gt;), <a href="#6.5.2.3">6.5.2.3</a>                                program image, <a href="#5.1.1.2">5.1.1.2</a>
+ pointer to function, <a href="#6.5.2.2">6.5.2.2</a>                                  program name (argv[0]), <a href="#5.1.2.2.1">5.1.2.2.1</a>
+ pointer type, <a href="#6.2.5">6.2.5</a>                                           program parameters, <a href="#5.1.2.2.1">5.1.2.2.1</a>
+ pointer type conversion, <a href="#6.3.2.1">6.3.2.1</a>, <a href="#6.3.2.3">6.3.2.3</a>                     program startup, <a href="#5.1.2">5.1.2</a>, <a href="#5.1.2.1">5.1.2.1</a>, <a href="#5.1.2.2.1">5.1.2.2.1</a>
+ pointer, null, <a href="#6.3.2.3">6.3.2.3</a>                                        program structure, <a href="#5.1.1.1">5.1.1.1</a>
+ portability, <a href="#4">4</a>, <a href="#J">J</a>                                             program termination, <a href="#5.1.2">5.1.2</a>, <a href="#5.1.2.1">5.1.2.1</a>, <a href="#5.1.2.2.3">5.1.2.2.3</a>,
+ position indicator, file, see file position indicator                 <a href="#5.1.2.3">5.1.2.3</a>
+ positive difference, <a href="#7.12.12.1">7.12.12.1</a>                                program, conforming, <a href="#4">4</a>
+ positive difference functions, <a href="#7.12.12">7.12.12</a>, <a href="#F.9.9">F.9.9</a>                 program, strictly conforming, <a href="#4">4</a>
+ postfix decrement operator (--), <a href="#6.3.2.1">6.3.2.1</a>, <a href="#6.5.2.4">6.5.2.4</a>              promotions
+ postfix expressions, <a href="#6.5.2">6.5.2</a>                                        default argument, <a href="#6.5.2.2">6.5.2.2</a>
+ postfix increment operator (++), <a href="#6.3.2.1">6.3.2.1</a>, <a href="#6.5.2.4">6.5.2.4</a>                 integer, <a href="#5.1.2.3">5.1.2.3</a>, <a href="#6.3.1.1">6.3.1.1</a>
+ pow functions, <a href="#7.12.7.4">7.12.7.4</a>, <a href="#F.9.4.4">F.9.4.4</a>                              prototype, see function prototype
+ pow type-generic macro, <a href="#7.22">7.22</a>                                  pseudo-random sequence functions, <a href="#7.20.2">7.20.2</a>
+ power functions                                               PTRDIFF_MAX macro, <a href="#7.18.3">7.18.3</a>
+   complex, <a href="#7.3.8">7.3.8</a>, <a href="#G.6.4">G.6.4</a>                                       PTRDIFF_MIN macro, <a href="#7.18.3">7.18.3</a>
+   real, <a href="#7.12.7">7.12.7</a>, <a href="#F.9.4">F.9.4</a>                                         ptrdiff_t type, <a href="#7.17">7.17</a>, <a href="#7.18.3">7.18.3</a>, <a href="#7.19.6.1">7.19.6.1</a>,
+ pp-number, <a href="#6.4.8">6.4.8</a>                                                    <a href="#7.19.6.2">7.19.6.2</a>, <a href="#7.24.2.1">7.24.2.1</a>, <a href="#7.24.2.2">7.24.2.2</a>
+ pragma operator, <a href="#6.10.9">6.10.9</a>                                       punctuators, <a href="#6.4.6">6.4.6</a>
+ pragma preprocessing directive, <a href="#6.10.6">6.10.6</a>, <a href="#6.11.8">6.11.8</a>                putc function, <a href="#7.19.1">7.19.1</a>, <a href="#7.19.7.8">7.19.7.8</a>, <a href="#7.19.7.9">7.19.7.9</a>
+ precedence of operators, <a href="#6.5">6.5</a>                                  putchar function, <a href="#7.19.1">7.19.1</a>, <a href="#7.19.7.9">7.19.7.9</a>
+ precedence of syntax rules, <a href="#5.1.1.2">5.1.1.2</a>                           puts function, <a href="#7.19.1">7.19.1</a>, <a href="#7.19.7.10">7.19.7.10</a>
+ precision, <a href="#6.2.6.2">6.2.6.2</a>, <a href="#6.3.1.1">6.3.1.1</a>, <a href="#7.19.6.1">7.19.6.1</a>, <a href="#7.24.2.1">7.24.2.1</a>               putwc function, <a href="#7.19.1">7.19.1</a>, <a href="#7.24.3.8">7.24.3.8</a>, <a href="#7.24.3.9">7.24.3.9</a>
+    excess, <a href="#5.2.4.2.2">5.2.4.2.2</a>, <a href="#6.3.1.5">6.3.1.5</a>, <a href="#6.3.1.8">6.3.1.8</a>, <a href="#6.8.6.4">6.8.6.4</a>               putwchar function, <a href="#7.19.1">7.19.1</a>, <a href="#7.24.3.9">7.24.3.9</a>
+ predefined macro names, <a href="#6.10.8">6.10.8</a>, <a href="#6.11.9">6.11.9</a>
+ prefix decrement operator (--), <a href="#6.3.2.1">6.3.2.1</a>, <a href="#6.5.3.1">6.5.3.1</a>               qsort function, <a href="#7.20.5">7.20.5</a>, <a href="#7.20.5.2">7.20.5.2</a>
+ prefix increment operator (++), <a href="#6.3.2.1">6.3.2.1</a>, <a href="#6.5.3.1">6.5.3.1</a>               qualified types, <a href="#6.2.5">6.2.5</a>
+ preprocessing concatenation, <a href="#6.10.3.3">6.10.3.3</a>                         qualified version of type, <a href="#6.2.5">6.2.5</a>
+ preprocessing directives, <a href="#5.1.1.2">5.1.1.2</a>, <a href="#6.10">6.10</a>                       question-mark escape sequence (\?), <a href="#6.4.4.4">6.4.4.4</a>
+ preprocessing file, <a href="#5.1.1.1">5.1.1.1</a>, <a href="#6.10">6.10</a>                              quiet NaN, <a href="#5.2.4.2.2">5.2.4.2.2</a>
+ preprocessing numbers, <a href="#6.4">6.4</a>, <a href="#6.4.8">6.4.8</a>
+ preprocessing operators                                       raise function, <a href="#7.14">7.14</a>, <a href="#7.14.1.1">7.14.1.1</a>, <a href="#7.14.2.1">7.14.2.1</a>, <a href="#7.20.4.1">7.20.4.1</a>
+    #, <a href="#6.10.3.2">6.10.3.2</a>                                                rand function, <a href="#7.20">7.20</a>, <a href="#7.20.2.1">7.20.2.1</a>, <a href="#7.20.2.2">7.20.2.2</a>
+    ##, <a href="#6.10.3.3">6.10.3.3</a>                                               RAND_MAX macro, <a href="#7.20">7.20</a>, <a href="#7.20.2.1">7.20.2.1</a>
+    _Pragma, <a href="#5.1.1.2">5.1.1.2</a>, <a href="#6.10.9">6.10.9</a>                                   range
+    defined, <a href="#6.10.1">6.10.1</a>                                              excess, <a href="#5.2.4.2.2">5.2.4.2.2</a>, <a href="#6.3.1.5">6.3.1.5</a>, <a href="#6.3.1.8">6.3.1.8</a>, <a href="#6.8.6.4">6.8.6.4</a>
+ preprocessing tokens, <a href="#5.1.1.2">5.1.1.2</a>, <a href="#6.4">6.4</a>, <a href="#6.10">6.10</a>                      range error, <a href="#7.12.1">7.12.1</a>, <a href="#7.12.5.3">7.12.5.3</a>, <a href="#7.12.5.4">7.12.5.4</a>, <a href="#7.12.5.5">7.12.5.5</a>,
+ preprocessing translation unit, <a href="#5.1.1.1">5.1.1.1</a>                            <a href="#7.12.6.1">7.12.6.1</a>, <a href="#7.12.6.2">7.12.6.2</a>, <a href="#7.12.6.3">7.12.6.3</a>, <a href="#7.12.6.5">7.12.6.5</a>,
+ preprocessor, <a href="#6.10">6.10</a>                                                 <a href="#7.12.6.6">7.12.6.6</a>, <a href="#7.12.6.7">7.12.6.7</a>, <a href="#7.12.6.8">7.12.6.8</a>, <a href="#7.12.6.9">7.12.6.9</a>,
+ PRIcFASTN macros, <a href="#7.8.1">7.8.1</a>                                            <a href="#7.12.6.10">7.12.6.10</a>, <a href="#7.12.6.11">7.12.6.11</a>, <a href="#7.12.6.13">7.12.6.13</a>, <a href="#7.12.7.3">7.12.7.3</a>,
+ PRIcLEASTN macros, <a href="#7.8.1">7.8.1</a>                                           <a href="#7.12.7.4">7.12.7.4</a>, <a href="#7.12.8.2">7.12.8.2</a>, <a href="#7.12.8.3">7.12.8.3</a>, <a href="#7.12.8.4">7.12.8.4</a>,
+ PRIcMAX macros, <a href="#7.8.1">7.8.1</a>                                              <a href="#7.12.9.5">7.12.9.5</a>, <a href="#7.12.9.7">7.12.9.7</a>, <a href="#7.12.11.3">7.12.11.3</a>, <a href="#7.12.12.1">7.12.12.1</a>,
+ PRIcN macros, <a href="#7.8.1">7.8.1</a>                                                <a href="#7.12.13.1">7.12.13.1</a>
+<!--page 547 -->
+ rank, see integer conversion rank                         same scope, <a href="#6.2.1">6.2.1</a>
+ real floating type conversion, <a href="#6.3.1.4">6.3.1.4</a>, <a href="#6.3.1.5">6.3.1.5</a>,           save calling environment function, <a href="#7.13.1">7.13.1</a>
+       <a href="#6.3.1.7">6.3.1.7</a>, <a href="#F.3">F.3</a>, <a href="#F.4">F.4</a>                                   scalar types, <a href="#6.2.5">6.2.5</a>
+ real floating types, <a href="#6.2.5">6.2.5</a>                                 scalbln function, <a href="#7.12.6.13">7.12.6.13</a>, <a href="#F.3">F.3</a>, <a href="#F.9.3.13">F.9.3.13</a>
+ real type domain, <a href="#6.2.5">6.2.5</a>                                   scalbln type-generic macro, <a href="#7.22">7.22</a>
+ real types, <a href="#6.2.5">6.2.5</a>                                         scalbn function, <a href="#7.12.6.13">7.12.6.13</a>, <a href="#F.3">F.3</a>, <a href="#F.9.3.13">F.9.3.13</a>
+ real-floating, <a href="#7.12.3">7.12.3</a>                                      scalbn type-generic macro, <a href="#7.22">7.22</a>
+ realloc function, <a href="#7.20.3">7.20.3</a>, <a href="#7.20.3.2">7.20.3.2</a>, <a href="#7.20.3.4">7.20.3.4</a>              scanf function, <a href="#7.19.1">7.19.1</a>, <a href="#7.19.6.4">7.19.6.4</a>, <a href="#7.19.6.11">7.19.6.11</a>
+ recommended practice, <a href="#3.16">3.16</a>                                scanlist, <a href="#7.19.6.2">7.19.6.2</a>, <a href="#7.24.2.2">7.24.2.2</a>
+ recursion, <a href="#6.5.2.2">6.5.2.2</a>                                        scanset, <a href="#7.19.6.2">7.19.6.2</a>, <a href="#7.24.2.2">7.24.2.2</a>
+ recursive function call, <a href="#6.5.2.2">6.5.2.2</a>                          SCHAR_MAX macro, <a href="#5.2.4.2.1">5.2.4.2.1</a>
+ redefinition of macro, <a href="#6.10.3">6.10.3</a>                              SCHAR_MIN macro, <a href="#5.2.4.2.1">5.2.4.2.1</a>
+ reentrancy, <a href="#5.1.2.3">5.1.2.3</a>, <a href="#5.2.3">5.2.3</a>                                SCNcFASTN macros, <a href="#7.8.1">7.8.1</a>
+    library functions, <a href="#7.1.4">7.1.4</a>                               SCNcLEASTN macros, <a href="#7.8.1">7.8.1</a>
+ referenced type, <a href="#6.2.5">6.2.5</a>                                    SCNcMAX macros, <a href="#7.8.1">7.8.1</a>
+ register storage-class specifier, <a href="#6.7.1">6.7.1</a>, <a href="#6.9">6.9</a>               SCNcN macros, <a href="#7.8.1">7.8.1</a>
+ relational expressions, <a href="#6.5.8">6.5.8</a>                             SCNcPTR macros, <a href="#7.8.1">7.8.1</a>
+ reliability of data, interrupted, <a href="#5.1.2.3">5.1.2.3</a>                 scope of identifier, <a href="#6.2.1">6.2.1</a>, <a href="#6.9.2">6.9.2</a>
+ remainder assignment operator (%=), <a href="#6.5.16.2">6.5.16.2</a>              search functions
+ remainder functions, <a href="#7.12.10">7.12.10</a>, <a href="#F.9.7">F.9.7</a>                          string, <a href="#7.21.5">7.21.5</a>
+ remainder functions, <a href="#7.12.10.2">7.12.10.2</a>, <a href="#7.12.10.3">7.12.10.3</a>, <a href="#F.3">F.3</a>,              utility, <a href="#7.20.5">7.20.5</a>
+       <a href="#F.9.7.2">F.9.7.2</a>                                                wide string, <a href="#7.24.4.5">7.24.4.5</a>
+ remainder operator (%), <a href="#6.5.5">6.5.5</a>                             SEEK_CUR macro, <a href="#7.19.1">7.19.1</a>, <a href="#7.19.9.2">7.19.9.2</a>
+ remainder type-generic macro, <a href="#7.22">7.22</a>                        SEEK_END macro, <a href="#7.19.1">7.19.1</a>, <a href="#7.19.9.2">7.19.9.2</a>
+ remove function, <a href="#7.19.4.1">7.19.4.1</a>, <a href="#7.19.4.4">7.19.4.4</a>                       SEEK_SET macro, <a href="#7.19.1">7.19.1</a>, <a href="#7.19.9.2">7.19.9.2</a>
+ remquo functions, <a href="#7.12.10.3">7.12.10.3</a>, <a href="#F.3">F.3</a>, <a href="#F.9.7.3">F.9.7.3</a>                 selection statements, <a href="#6.8.4">6.8.4</a>
+ remquo type-generic macro, <a href="#7.22">7.22</a>                           self-referential structure, <a href="#6.7.2.3">6.7.2.3</a>
+ rename function, <a href="#7.19.4.2">7.19.4.2</a>                                 semicolon punctuator (;), <a href="#6.7">6.7</a>, <a href="#6.7.2.1">6.7.2.1</a>, <a href="#6.8.3">6.8.3</a>,
+ representations of types, <a href="#6.2.6">6.2.6</a>                                 <a href="#6.8.5">6.8.5</a>, <a href="#6.8.6">6.8.6</a>
+    pointer, <a href="#6.2.5">6.2.5</a>                                         separate compilation, <a href="#5.1.1.1">5.1.1.1</a>
+ rescanning and replacement, <a href="#6.10.3.4">6.10.3.4</a>                      separate translation, <a href="#5.1.1.1">5.1.1.1</a>
+ reserved identifiers, <a href="#6.4.1">6.4.1</a>, <a href="#7.1.3">7.1.3</a>                         sequence points, <a href="#5.1.2.3">5.1.2.3</a>, <a href="#6.5">6.5</a>, <a href="#6.8">6.8</a>, <a href="#7.1.4">7.1.4</a>, <a href="#7.19.6">7.19.6</a>,
+ restartable multibyte/wide character conversion                 <a href="#7.20.5">7.20.5</a>, <a href="#7.24.2">7.24.2</a>, <a href="#C">C</a>
+       functions, <a href="#7.24.6.3">7.24.6.3</a>                                 sequencing of statements, <a href="#6.8">6.8</a>
+ restartable multibyte/wide string conversion              setbuf function, <a href="#7.19.3">7.19.3</a>, <a href="#7.19.5.1">7.19.5.1</a>, <a href="#7.19.5.5">7.19.5.5</a>
+       functions, <a href="#7.24.6.4">7.24.6.4</a>                                 setjmp macro, <a href="#7.1.3">7.1.3</a>, <a href="#7.13.1.1">7.13.1.1</a>, <a href="#7.13.2.1">7.13.2.1</a>
+ restore calling environment function, <a href="#7.13.2">7.13.2</a>              setjmp.h header, <a href="#7.13">7.13</a>
+ restrict type qualifier, <a href="#6.7.3">6.7.3</a>, <a href="#6.7.3.1">6.7.3.1</a>                    setlocale function, <a href="#7.11.1.1">7.11.1.1</a>, <a href="#7.11.2.1">7.11.2.1</a>
+ restrict-qualified type, <a href="#6.2.5">6.2.5</a>, <a href="#6.7.3">6.7.3</a>                      setvbuf function, <a href="#7.19.1">7.19.1</a>, <a href="#7.19.3">7.19.3</a>, <a href="#7.19.5.1">7.19.5.1</a>,
+ return statement, <a href="#6.8.6.4">6.8.6.4</a>                                       <a href="#7.19.5.5">7.19.5.5</a>, <a href="#7.19.5.6">7.19.5.6</a>
+ rewind function, <a href="#7.19.5.3">7.19.5.3</a>, <a href="#7.19.7.11">7.19.7.11</a>, <a href="#7.19.9.5">7.19.9.5</a>,           shall, <a href="#4">4</a>
+       <a href="#7.24.3.10">7.24.3.10</a>                                           shift expressions, <a href="#6.5.7">6.5.7</a>
+ right-shift assignment operator (&gt;&gt;=), <a href="#6.5.16.2">6.5.16.2</a>           shift sequence, <a href="#7.1.1">7.1.1</a>
+ right-shift operator (&gt;&gt;), <a href="#6.5.7">6.5.7</a>                          shift states, <a href="#5.2.1.2">5.2.1.2</a>
+ rint functions, <a href="#7.12.9.4">7.12.9.4</a>, <a href="#F.3">F.3</a>, <a href="#F.9.6.4">F.9.6.4</a>                    short identifier, character, <a href="#5.2.4.1">5.2.4.1</a>, <a href="#6.4.3">6.4.3</a>
+ rint type-generic macro, <a href="#7.22">7.22</a>                             short int type, <a href="#6.2.5">6.2.5</a>, <a href="#6.3.1.1">6.3.1.1</a>, <a href="#6.7.2">6.7.2</a>, <a href="#7.19.6.1">7.19.6.1</a>,
+ round functions, <a href="#7.12.9.6">7.12.9.6</a>, <a href="#F.9.6.6">F.9.6.6</a>                              <a href="#7.19.6.2">7.19.6.2</a>, <a href="#7.24.2.1">7.24.2.1</a>, <a href="#7.24.2.2">7.24.2.2</a>
+ round type-generic macro, <a href="#7.22">7.22</a>                            short int type conversion, <a href="#6.3.1.1">6.3.1.1</a>, <a href="#6.3.1.3">6.3.1.3</a>,
+ rounding mode, floating point, <a href="#5.2.4.2.2">5.2.4.2.2</a>                         <a href="#6.3.1.4">6.3.1.4</a>, <a href="#6.3.1.8">6.3.1.8</a>
+ rvalue, <a href="#6.3.2.1">6.3.2.1</a>                                           SHRT_MAX macro, <a href="#5.2.4.2.1">5.2.4.2.1</a>
+                                                           SHRT_MIN macro, <a href="#5.2.4.2.1">5.2.4.2.1</a>
+<!--page 548 -->
+ side effects, <a href="#5.1.2.3">5.1.2.3</a>, <a href="#6.5">6.5</a>                                   source lines, <a href="#5.1.1.2">5.1.1.2</a>
+ SIG_ATOMIC_MAX macro, <a href="#7.18.3">7.18.3</a>                                 source text, <a href="#5.1.1.2">5.1.1.2</a>
+ SIG_ATOMIC_MIN macro, <a href="#7.18.3">7.18.3</a>                                 space character (' '), <a href="#5.1.1.2">5.1.1.2</a>, <a href="#5.2.1">5.2.1</a>, <a href="#6.4">6.4</a>, <a href="#7.4.1.3">7.4.1.3</a>,
+ sig_atomic_t type, <a href="#7.14">7.14</a>, <a href="#7.14.1.1">7.14.1.1</a>, <a href="#7.18.3">7.18.3</a>                         <a href="#7.4.1.10">7.4.1.10</a>, <a href="#7.25.2.1.3">7.25.2.1.3</a>
+ SIG_DFL macro, <a href="#7.14">7.14</a>, <a href="#7.14.1.1">7.14.1.1</a>                                sprintf function, <a href="#7.19.6.6">7.19.6.6</a>, <a href="#7.19.6.13">7.19.6.13</a>
+ SIG_ERR macro, <a href="#7.14">7.14</a>, <a href="#7.14.1.1">7.14.1.1</a>                                sqrt functions, <a href="#7.12.7.5">7.12.7.5</a>, <a href="#F.3">F.3</a>, <a href="#F.9.4.5">F.9.4.5</a>
+ SIG_IGN macro, <a href="#7.14">7.14</a>, <a href="#7.14.1.1">7.14.1.1</a>                                sqrt type-generic macro, <a href="#7.22">7.22</a>
+ SIGABRT macro, <a href="#7.14">7.14</a>, <a href="#7.20.4.1">7.20.4.1</a>                                srand function, <a href="#7.20.2.2">7.20.2.2</a>
+ SIGFPE macro, <a href="#7.14">7.14</a>, <a href="#7.14.1.1">7.14.1.1</a>, <a href="#J.5.17">J.5.17</a>                         sscanf function, <a href="#7.19.6.7">7.19.6.7</a>, <a href="#7.19.6.14">7.19.6.14</a>
+ SIGILL macro, <a href="#7.14">7.14</a>, <a href="#7.14.1.1">7.14.1.1</a>                                 standard error stream, <a href="#7.19.1">7.19.1</a>, <a href="#7.19.3">7.19.3</a>, <a href="#7.19.10.4">7.19.10.4</a>
+ SIGINT macro, <a href="#7.14">7.14</a>                                           standard headers, <a href="#4">4</a>, <a href="#7.1.2">7.1.2</a>
+ sign and magnitude, <a href="#6.2.6.2">6.2.6.2</a>                                     <a href="#7.2">&lt;assert.h&gt;</a>, <a href="#7.2">7.2</a>, <a href="#B.1">B.1</a>
+ sign bit, <a href="#6.2.6.2">6.2.6.2</a>                                               <a href="#7.3">&lt;complex.h&gt;</a>, <a href="#5.2.4.2.2">5.2.4.2.2</a>, <a href="#7.3">7.3</a>, <a href="#7.22">7.22</a>, <a href="#7.26.1">7.26.1</a>,
+ signal function, <a href="#7.14.1.1">7.14.1.1</a>, <a href="#7.20.4.4">7.20.4.4</a>                                  <a href="#G.6">G.6</a>, <a href="#J.5.17">J.5.17</a>
+ signal handler, <a href="#5.1.2.3">5.1.2.3</a>, <a href="#5.2.3">5.2.3</a>, <a href="#7.14.1.1">7.14.1.1</a>, <a href="#7.14.2.1">7.14.2.1</a>              <a href="#7.4">&lt;ctype.h&gt;</a>, <a href="#7.4">7.4</a>, <a href="#7.26.2">7.26.2</a>
+ signal handling functions, <a href="#7.14.1">7.14.1</a>                               <a href="#7.5">&lt;errno.h&gt;</a>, <a href="#7.5">7.5</a>, <a href="#7.26.3">7.26.3</a>
+ signal.h header, <a href="#7.14">7.14</a>, <a href="#7.26.6">7.26.6</a>                                   <a href="#7.6">&lt;fenv.h&gt;</a>, <a href="#5.1.2.3">5.1.2.3</a>, <a href="#5.2.4.2.2">5.2.4.2.2</a>, <a href="#7.6">7.6</a>, <a href="#7.12">7.12</a>, <a href="#F">F</a>, <a href="#H">H</a>
+ signaling NaN, <a href="#5.2.4.2.2">5.2.4.2.2</a>, <a href="#F.2.1">F.2.1</a>                                 <a href="#7.7">&lt;float.h&gt;</a>, <a href="#4">4</a>, <a href="#5.2.4.2.2">5.2.4.2.2</a>, <a href="#7.7">7.7</a>, <a href="#7.20.1.3">7.20.1.3</a>,
+ signals, <a href="#5.1.2.3">5.1.2.3</a>, <a href="#5.2.3">5.2.3</a>, <a href="#7.14.1">7.14.1</a>                                      <a href="#7.24.4.1.1">7.24.4.1.1</a>
+ signbit macro, <a href="#7.12.3.6">7.12.3.6</a>, <a href="#F.3">F.3</a>                                    <a href="#7.8">&lt;inttypes.h&gt;</a>, <a href="#7.8">7.8</a>, <a href="#7.26.4">7.26.4</a>
+ signed char type, <a href="#6.2.5">6.2.5</a>, <a href="#7.19.6.1">7.19.6.1</a>, <a href="#7.19.6.2">7.19.6.2</a>,                    <a href="#7.9">&lt;iso646.h&gt;</a>, <a href="#4">4</a>, <a href="#7.9">7.9</a>
+      <a href="#7.24.2.1">7.24.2.1</a>, <a href="#7.24.2.2">7.24.2.2</a>                                         <a href="#7.10">&lt;limits.h&gt;</a>, <a href="#4">4</a>, <a href="#5.2.4.2.1">5.2.4.2.1</a>, <a href="#6.2.5">6.2.5</a>, <a href="#7.10">7.10</a>
+ signed character, <a href="#6.3.1.1">6.3.1.1</a>                                       <a href="#7.11">&lt;locale.h&gt;</a>, <a href="#7.11">7.11</a>, <a href="#7.26.5">7.26.5</a>
+ signed integer types, <a href="#6.2.5">6.2.5</a>, <a href="#6.3.1.3">6.3.1.3</a>, <a href="#6.4.4.1">6.4.4.1</a>                   <a href="#7.12">&lt;math.h&gt;</a>, <a href="#5.2.4.2.2">5.2.4.2.2</a>, <a href="#6.5">6.5</a>, <a href="#7.12">7.12</a>, <a href="#7.22">7.22</a>, <a href="#F">F</a>, <a href="#F.9">F.9</a>,
+ signed type conversion, <a href="#6.3.1.1">6.3.1.1</a>, <a href="#6.3.1.3">6.3.1.3</a>, <a href="#6.3.1.4">6.3.1.4</a>,                   <a href="#J.5.17">J.5.17</a>
+      <a href="#6.3.1.8">6.3.1.8</a>                                                    <a href="#7.13">&lt;setjmp.h&gt;</a>, <a href="#7.13">7.13</a>
+ signed types, <a href="#6.2.5">6.2.5</a>, <a href="#6.7.2">6.7.2</a>                                      <a href="#7.14">&lt;signal.h&gt;</a>, <a href="#7.14">7.14</a>, <a href="#7.26.6">7.26.6</a>
+ significand part, <a href="#6.4.4.2">6.4.4.2</a>                                        <a href="#7.15">&lt;stdarg.h&gt;</a>, <a href="#4">4</a>, <a href="#6.7.5.3">6.7.5.3</a>, <a href="#7.15">7.15</a>
+ SIGSEGV macro, <a href="#7.14">7.14</a>, <a href="#7.14.1.1">7.14.1.1</a>                                   <a href="#7.16">&lt;stdbool.h&gt;</a>, <a href="#4">4</a>, <a href="#7.16">7.16</a>, <a href="#7.26.7">7.26.7</a>, <a href="#H">H</a>
+ SIGTERM macro, <a href="#7.14">7.14</a>                                             <a href="#7.17">&lt;stddef.h&gt;</a>, <a href="#4">4</a>, <a href="#6.3.2.1">6.3.2.1</a>, <a href="#6.3.2.3">6.3.2.3</a>, <a href="#6.4.4.4">6.4.4.4</a>,
+ simple assignment operator (=), <a href="#6.5.16.1">6.5.16.1</a>                             <a href="#6.4.5">6.4.5</a>, <a href="#6.5.3.4">6.5.3.4</a>, <a href="#6.5.6">6.5.6</a>, <a href="#7.17">7.17</a>
+ sin functions, <a href="#7.12.4.6">7.12.4.6</a>, <a href="#F.9.1.6">F.9.1.6</a>                                <a href="#7.18">&lt;stdint.h&gt;</a>, <a href="#4">4</a>, <a href="#5.2.4.2">5.2.4.2</a>, <a href="#6.10.1">6.10.1</a>, <a href="#7.8">7.8</a>, <a href="#7.18">7.18</a>,
+ sin type-generic macro, <a href="#7.22">7.22</a>, <a href="#G.7">G.7</a>                                    <a href="#7.26.8">7.26.8</a>
+ single-byte character, <a href="#3.7.1">3.7.1</a>, <a href="#5.2.1.2">5.2.1.2</a>                           <a href="#7.19">&lt;stdio.h&gt;</a>, <a href="#5.2.4.2.2">5.2.4.2.2</a>, <a href="#7.19">7.19</a>, <a href="#7.26.9">7.26.9</a>, <a href="#F">F</a>
+ single-byte/wide character conversion functions,                <a href="#7.20">&lt;stdlib.h&gt;</a>, <a href="#5.2.4.2.2">5.2.4.2.2</a>, <a href="#7.20">7.20</a>, <a href="#7.26.10">7.26.10</a>, <a href="#F">F</a>
+      <a href="#7.24.6.1">7.24.6.1</a>                                                   <a href="#7.21">&lt;string.h&gt;</a>, <a href="#7.21">7.21</a>, <a href="#7.26.11">7.26.11</a>
+ single-precision arithmetic, <a href="#5.1.2.3">5.1.2.3</a>                            <a href="#7.22">&lt;tgmath.h&gt;</a>, <a href="#7.22">7.22</a>, <a href="#G.7">G.7</a>
+ single-quote escape sequence (\'), <a href="#6.4.4.4">6.4.4.4</a>, <a href="#6.4.5">6.4.5</a>               <a href="#7.23">&lt;time.h&gt;</a>, <a href="#7.23">7.23</a>
+ sinh functions, <a href="#7.12.5.5">7.12.5.5</a>, <a href="#F.9.2.5">F.9.2.5</a>                               <a href="#7.24">&lt;wchar.h&gt;</a>, <a href="#5.2.4.2.2">5.2.4.2.2</a>, <a href="#7.19.1">7.19.1</a>, <a href="#7.24">7.24</a>, <a href="#7.26.12">7.26.12</a>,
+ sinh type-generic macro, <a href="#7.22">7.22</a>, <a href="#G.7">G.7</a>                                   <a href="#F">F</a>
+ SIZE_MAX macro, <a href="#7.18.3">7.18.3</a>                                          <a href="#7.25">&lt;wctype.h&gt;</a>, <a href="#7.25">7.25</a>, <a href="#7.26.13">7.26.13</a>
+ size_t type, <a href="#6.5.3.4">6.5.3.4</a>, <a href="#7.17">7.17</a>, <a href="#7.18.3">7.18.3</a>, <a href="#7.19.1">7.19.1</a>,                  standard input stream, <a href="#7.19.1">7.19.1</a>, <a href="#7.19.3">7.19.3</a>
+      <a href="#7.19.6.1">7.19.6.1</a>, <a href="#7.19.6.2">7.19.6.2</a>, <a href="#7.20">7.20</a>, <a href="#7.21.1">7.21.1</a>, <a href="#7.23.1">7.23.1</a>,               standard integer types, <a href="#6.2.5">6.2.5</a>
+      <a href="#7.24.1">7.24.1</a>, <a href="#7.24.2.1">7.24.2.1</a>, <a href="#7.24.2.2">7.24.2.2</a>                              standard output stream, <a href="#7.19.1">7.19.1</a>, <a href="#7.19.3">7.19.3</a>
+ sizeof operator, <a href="#6.3.2.1">6.3.2.1</a>, <a href="#6.5.3">6.5.3</a>, <a href="#6.5.3.4">6.5.3.4</a>                     standard signed integer types, <a href="#6.2.5">6.2.5</a>
+ snprintf function, <a href="#7.19.6.5">7.19.6.5</a>, <a href="#7.19.6.12">7.19.6.12</a>                       state-dependent encoding, <a href="#5.2.1.2">5.2.1.2</a>, <a href="#7.20.7">7.20.7</a>
+ sorting utility functions, <a href="#7.20.5">7.20.5</a>                            statements, <a href="#6.8">6.8</a>
+ source character set, <a href="#5.1.1.2">5.1.1.2</a>, <a href="#5.2.1">5.2.1</a>                            break, <a href="#6.8.6.3">6.8.6.3</a>
+ source file, <a href="#5.1.1.1">5.1.1.1</a>                                             compound, <a href="#6.8.2">6.8.2</a>
+    name, <a href="#6.10.4">6.10.4</a>, <a href="#6.10.8">6.10.8</a>                                         continue, <a href="#6.8.6.2">6.8.6.2</a>
+ source file inclusion, <a href="#6.10.2">6.10.2</a>                                    do, <a href="#6.8.5.2">6.8.5.2</a>
+<!--page 549 -->
+    else, <a href="#6.8.4.1">6.8.4.1</a>                                             strictly conforming program, <a href="#4">4</a>
+    expression, <a href="#6.8.3">6.8.3</a>                                         string, <a href="#7.1.1">7.1.1</a>
+    for, <a href="#6.8.5.3">6.8.5.3</a>                                                 comparison functions, <a href="#7.21.4">7.21.4</a>
+    goto, <a href="#6.8.6.1">6.8.6.1</a>                                                concatenation functions, <a href="#7.21.3">7.21.3</a>
+    if, <a href="#6.8.4.1">6.8.4.1</a>                                                  conversion functions, <a href="#7.11.1.1">7.11.1.1</a>
+    iteration, <a href="#6.8.5">6.8.5</a>                                             copying functions, <a href="#7.21.2">7.21.2</a>
+    jump, <a href="#6.8.6">6.8.6</a>                                                  library function conventions, <a href="#7.21.1">7.21.1</a>
+    labeled, <a href="#6.8.1">6.8.1</a>                                               literal, <a href="#5.1.1.2">5.1.1.2</a>, <a href="#5.2.1">5.2.1</a>, <a href="#6.3.2.1">6.3.2.1</a>, <a href="#6.4.5">6.4.5</a>, <a href="#6.5.1">6.5.1</a>, <a href="#6.7.8">6.7.8</a>
+    null, <a href="#6.8.3">6.8.3</a>                                                  miscellaneous functions, <a href="#7.21.6">7.21.6</a>
+    return, <a href="#6.8.6.4">6.8.6.4</a>                                              numeric conversion functions, <a href="#7.8.2.3">7.8.2.3</a>, <a href="#7.20.1">7.20.1</a>
+    selection, <a href="#6.8.4">6.8.4</a>                                             search functions, <a href="#7.21.5">7.21.5</a>
+    sequencing, <a href="#6.8">6.8</a>                                           string handling header, <a href="#7.21">7.21</a>
+    switch, <a href="#6.8.4.2">6.8.4.2</a>                                           string.h header, <a href="#7.21">7.21</a>, <a href="#7.26.11">7.26.11</a>
+    while, <a href="#6.8.5.1">6.8.5.1</a>                                            stringizing, <a href="#6.10.3.2">6.10.3.2</a>, <a href="#6.10.9">6.10.9</a>
+ static storage duration, <a href="#6.2.4">6.2.4</a>                               strlen function, <a href="#7.21.6.3">7.21.6.3</a>
+ static storage-class specifier, <a href="#6.2.2">6.2.2</a>, <a href="#6.2.4">6.2.4</a>, <a href="#6.7.1">6.7.1</a>           strncat function, <a href="#7.21.3.2">7.21.3.2</a>
+ static, in array declarators, <a href="#6.7.5.2">6.7.5.2</a>, <a href="#6.7.5.3">6.7.5.3</a>               strncmp function, <a href="#7.21.4">7.21.4</a>, <a href="#7.21.4.4">7.21.4.4</a>
+ stdarg.h header, <a href="#4">4</a>, <a href="#6.7.5.3">6.7.5.3</a>, <a href="#7.15">7.15</a>                            strncpy function, <a href="#7.21.2.4">7.21.2.4</a>
+ stdbool.h header, <a href="#4">4</a>, <a href="#7.16">7.16</a>, <a href="#7.26.7">7.26.7</a>, <a href="#H">H</a>                         strpbrk function, <a href="#7.21.5.4">7.21.5.4</a>
+ STDC, <a href="#6.10.6">6.10.6</a>, <a href="#6.11.8">6.11.8</a>                                         strrchr function, <a href="#7.21.5.5">7.21.5.5</a>
+ stddef.h header, <a href="#4">4</a>, <a href="#6.3.2.1">6.3.2.1</a>, <a href="#6.3.2.3">6.3.2.3</a>, <a href="#6.4.4.4">6.4.4.4</a>,               strspn function, <a href="#7.21.5.6">7.21.5.6</a>
+       <a href="#6.4.5">6.4.5</a>, <a href="#6.5.3.4">6.5.3.4</a>, <a href="#6.5.6">6.5.6</a>, <a href="#7.17">7.17</a>                            strstr function, <a href="#7.21.5.7">7.21.5.7</a>
+ stderr macro, <a href="#7.19.1">7.19.1</a>, <a href="#7.19.2">7.19.2</a>, <a href="#7.19.3">7.19.3</a>                         strtod function, <a href="#7.12.11.2">7.12.11.2</a>, <a href="#7.19.6.2">7.19.6.2</a>, <a href="#7.20.1.3">7.20.1.3</a>,
+ stdin macro, <a href="#7.19.1">7.19.1</a>, <a href="#7.19.2">7.19.2</a>, <a href="#7.19.3">7.19.3</a>, <a href="#7.19.6.4">7.19.6.4</a>,                     <a href="#7.24.2.2">7.24.2.2</a>, <a href="#F.3">F.3</a>
+       <a href="#7.19.7.6">7.19.7.6</a>, <a href="#7.19.7.7">7.19.7.7</a>, <a href="#7.24.2.12">7.24.2.12</a>, <a href="#7.24.3.7">7.24.3.7</a>                strtof function, <a href="#7.12.11.2">7.12.11.2</a>, <a href="#7.20.1.3">7.20.1.3</a>, <a href="#F.3">F.3</a>
+ stdint.h header, <a href="#4">4</a>, <a href="#5.2.4.2">5.2.4.2</a>, <a href="#6.10.1">6.10.1</a>, <a href="#7.8">7.8</a>, <a href="#7.18">7.18</a>,              strtoimax function, <a href="#7.8.2.3">7.8.2.3</a>
+       <a href="#7.26.8">7.26.8</a>                                                 strtok function, <a href="#7.21.5.8">7.21.5.8</a>
+ stdio.h header, <a href="#5.2.4.2.2">5.2.4.2.2</a>, <a href="#7.19">7.19</a>, <a href="#7.26.9">7.26.9</a>, <a href="#F">F</a>                   strtol function, <a href="#7.8.2.3">7.8.2.3</a>, <a href="#7.19.6.2">7.19.6.2</a>, <a href="#7.20.1.2">7.20.1.2</a>,
+ stdlib.h header, <a href="#5.2.4.2.2">5.2.4.2.2</a>, <a href="#7.20">7.20</a>, <a href="#7.26.10">7.26.10</a>, <a href="#F">F</a>                       <a href="#7.20.1.4">7.20.1.4</a>, <a href="#7.24.2.2">7.24.2.2</a>
+ stdout macro, <a href="#7.19.1">7.19.1</a>, <a href="#7.19.2">7.19.2</a>, <a href="#7.19.3">7.19.3</a>, <a href="#7.19.6.3">7.19.6.3</a>,              strtold function, <a href="#7.12.11.2">7.12.11.2</a>, <a href="#7.20.1.3">7.20.1.3</a>, <a href="#F.3">F.3</a>
+       <a href="#7.19.7.9">7.19.7.9</a>, <a href="#7.19.7.10">7.19.7.10</a>, <a href="#7.24.2.11">7.24.2.11</a>, <a href="#7.24.3.9">7.24.3.9</a>               strtoll function, <a href="#7.8.2.3">7.8.2.3</a>, <a href="#7.20.1.2">7.20.1.2</a>, <a href="#7.20.1.4">7.20.1.4</a>
+ storage duration, <a href="#6.2.4">6.2.4</a>                                      strtoul function, <a href="#7.8.2.3">7.8.2.3</a>, <a href="#7.19.6.2">7.19.6.2</a>, <a href="#7.20.1.2">7.20.1.2</a>,
+ storage order of array, <a href="#6.5.2.1">6.5.2.1</a>                                    <a href="#7.20.1.4">7.20.1.4</a>, <a href="#7.24.2.2">7.24.2.2</a>
+ storage-class specifiers, <a href="#6.7.1">6.7.1</a>, <a href="#6.11.5">6.11.5</a>                       strtoull function, <a href="#7.8.2.3">7.8.2.3</a>, <a href="#7.20.1.2">7.20.1.2</a>, <a href="#7.20.1.4">7.20.1.4</a>
+ strcat function, <a href="#7.21.3.1">7.21.3.1</a>                                    strtoumax function, <a href="#7.8.2.3">7.8.2.3</a>
+ strchr function, <a href="#7.21.5.2">7.21.5.2</a>                                    struct hack, see flexible array member
+ strcmp function, <a href="#7.21.4">7.21.4</a>, <a href="#7.21.4.2">7.21.4.2</a>                            structure
+ strcoll function, <a href="#7.11.1.1">7.11.1.1</a>, <a href="#7.21.4.3">7.21.4.3</a>, <a href="#7.21.4.5">7.21.4.5</a>                  arrow operator (-&gt;), <a href="#6.5.2.3">6.5.2.3</a>
+ strcpy function, <a href="#7.21.2.3">7.21.2.3</a>                                       content, <a href="#6.7.2.3">6.7.2.3</a>
+ strcspn function, <a href="#7.21.5.3">7.21.5.3</a>                                      dot operator (.), <a href="#6.5.2.3">6.5.2.3</a>
+ streams, <a href="#7.19.2">7.19.2</a>, <a href="#7.20.4.3">7.20.4.3</a>                                       initialization, <a href="#6.7.8">6.7.8</a>
+    fully buffered, <a href="#7.19.3">7.19.3</a>                                       member alignment, <a href="#6.7.2.1">6.7.2.1</a>
+    line buffered, <a href="#7.19.3">7.19.3</a>                                        member name space, <a href="#6.2.3">6.2.3</a>
+    orientation, <a href="#7.19.2">7.19.2</a>                                          member operator (.), <a href="#6.3.2.1">6.3.2.1</a>, <a href="#6.5.2.3">6.5.2.3</a>
+    standard error, <a href="#7.19.1">7.19.1</a>, <a href="#7.19.3">7.19.3</a>                               pointer operator (-&gt;), <a href="#6.5.2.3">6.5.2.3</a>
+    standard input, <a href="#7.19.1">7.19.1</a>, <a href="#7.19.3">7.19.3</a>                               specifier, <a href="#6.7.2.1">6.7.2.1</a>
+    standard output, <a href="#7.19.1">7.19.1</a>, <a href="#7.19.3">7.19.3</a>                              tag, <a href="#6.2.3">6.2.3</a>, <a href="#6.7.2.3">6.7.2.3</a>
+    unbuffered, <a href="#7.19.3">7.19.3</a>                                           type, <a href="#6.2.5">6.2.5</a>, <a href="#6.7.2.1">6.7.2.1</a>
+ strerror function, <a href="#7.19.10.4">7.19.10.4</a>, <a href="#7.21.6.2">7.21.6.2</a>                       strxfrm function, <a href="#7.11.1.1">7.11.1.1</a>, <a href="#7.21.4.5">7.21.4.5</a>
+ strftime function, <a href="#7.11.1.1">7.11.1.1</a>, <a href="#7.23.3">7.23.3</a>, <a href="#7.23.3.5">7.23.3.5</a>,               subscripting, <a href="#6.5.2.1">6.5.2.1</a>
+       <a href="#7.24.5.1">7.24.5.1</a>                                               subtraction assignment operator (-=), <a href="#6.5.16.2">6.5.16.2</a>
+<!--page 550 -->
+ subtraction operator (-), <a href="#6.5.6">6.5.6</a>, <a href="#F.3">F.3</a>, <a href="#G.5.2">G.5.2</a>                   tolower function, <a href="#7.4.2.1">7.4.2.1</a>
+ suffix                                                         toupper function, <a href="#7.4.2.2">7.4.2.2</a>
+   floating constant, <a href="#6.4.4.2">6.4.4.2</a>                                   towctrans function, <a href="#7.25.3.2.1">7.25.3.2.1</a>, <a href="#7.25.3.2.2">7.25.3.2.2</a>
+   integer constant, <a href="#6.4.4.1">6.4.4.1</a>                                   towlower function, <a href="#7.25.3.1.1">7.25.3.1.1</a>, <a href="#7.25.3.2.1">7.25.3.2.1</a>
+ switch body, <a href="#6.8.4.2">6.8.4.2</a>                                          towupper function, <a href="#7.25.3.1.2">7.25.3.1.2</a>, <a href="#7.25.3.2.1">7.25.3.2.1</a>
+ switch case label, <a href="#6.8.1">6.8.1</a>, <a href="#6.8.4.2">6.8.4.2</a>                             translation environment, <a href="#5">5</a>, <a href="#5.1.1">5.1.1</a>
+ switch default label, <a href="#6.8.1">6.8.1</a>, <a href="#6.8.4.2">6.8.4.2</a>                          translation limits, <a href="#5.2.4.1">5.2.4.1</a>
+ switch statement, <a href="#6.8.1">6.8.1</a>, <a href="#6.8.4.2">6.8.4.2</a>                              translation phases, <a href="#5.1.1.2">5.1.1.2</a>
+ swprintf function, <a href="#7.24.2.3">7.24.2.3</a>, <a href="#7.24.2.7">7.24.2.7</a>                         translation unit, <a href="#5.1.1.1">5.1.1.1</a>, <a href="#6.9">6.9</a>
+ swscanf function, <a href="#7.24.2.4">7.24.2.4</a>, <a href="#7.24.2.8">7.24.2.8</a>                          trap representation, <a href="#6.2.6.1">6.2.6.1</a>, <a href="#6.2.6.2">6.2.6.2</a>, <a href="#6.3.2.3">6.3.2.3</a>,
+ symbols, <a href="#3">3</a>                                                          <a href="#6.5.2.3">6.5.2.3</a>
+ syntactic categories, <a href="#6.1">6.1</a>                                     trigonometric functions
+ syntax notation, <a href="#6.1">6.1</a>                                             complex, <a href="#7.3.5">7.3.5</a>, <a href="#G.6.1">G.6.1</a>
+ syntax rule precedence, <a href="#5.1.1.2">5.1.1.2</a>                                  real, <a href="#7.12.4">7.12.4</a>, <a href="#F.9.1">F.9.1</a>
+ syntax summary, language, <a href="#A">A</a>                                   trigraph sequences, <a href="#5.1.1.2">5.1.1.2</a>, <a href="#5.2.1.1">5.2.1.1</a>
+ system function, <a href="#7.20.4.6">7.20.4.6</a>                                     true macro, <a href="#7.16">7.16</a>
+                                                               trunc functions, <a href="#7.12.9.8">7.12.9.8</a>, <a href="#F.9.6.8">F.9.6.8</a>
+ tab characters, <a href="#5.2.1">5.2.1</a>, <a href="#6.4">6.4</a>                                    trunc type-generic macro, <a href="#7.22">7.22</a>
+ tag compatibility, <a href="#6.2.7">6.2.7</a>                                      truncation, <a href="#6.3.1.4">6.3.1.4</a>, <a href="#7.12.9.8">7.12.9.8</a>, <a href="#7.19.3">7.19.3</a>, <a href="#7.19.5.3">7.19.5.3</a>
+ tag name space, <a href="#6.2.3">6.2.3</a>                                         truncation toward zero, <a href="#6.5.5">6.5.5</a>
+ tags, <a href="#6.7.2.3">6.7.2.3</a>                                                 two's complement, <a href="#6.2.6.2">6.2.6.2</a>, <a href="#7.18.1.1">7.18.1.1</a>
+ tan functions, <a href="#7.12.4.7">7.12.4.7</a>, <a href="#F.9.1.7">F.9.1.7</a>                              type category, <a href="#6.2.5">6.2.5</a>
+ tan type-generic macro, <a href="#7.22">7.22</a>, <a href="#G.7">G.7</a>                             type conversion, <a href="#6.3">6.3</a>
+ tanh functions, <a href="#7.12.5.6">7.12.5.6</a>, <a href="#F.9.2.6">F.9.2.6</a>                             type definitions, <a href="#6.7.7">6.7.7</a>
+ tanh type-generic macro, <a href="#7.22">7.22</a>, <a href="#G.7">G.7</a>                            type domain, <a href="#6.2.5">6.2.5</a>, <a href="#G.2">G.2</a>
+ tentative definition, <a href="#6.9.2">6.9.2</a>                                    type names, <a href="#6.7.6">6.7.6</a>
+ terms, <a href="#3">3</a>                                                      type punning, <a href="#6.5.2.3">6.5.2.3</a>
+ text streams, <a href="#7.19.2">7.19.2</a>, <a href="#7.19.7.11">7.19.7.11</a>, <a href="#7.19.9.2">7.19.9.2</a>, <a href="#7.19.9.4">7.19.9.4</a>           type qualifiers, <a href="#6.7.3">6.7.3</a>
+ tgamma functions, <a href="#7.12.8.4">7.12.8.4</a>, <a href="#F.9.5.4">F.9.5.4</a>                           type specifiers, <a href="#6.7.2">6.7.2</a>
+ tgamma type-generic macro, <a href="#7.22">7.22</a>                               type-generic macro, <a href="#7.22">7.22</a>, <a href="#G.7">G.7</a>
+ tgmath.h header, <a href="#7.22">7.22</a>, <a href="#G.7">G.7</a>                                    typedef declaration, <a href="#6.7.7">6.7.7</a>
+ time                                                          typedef storage-class specifier, <a href="#6.7.1">6.7.1</a>, <a href="#6.7.7">6.7.7</a>
+    broken down, <a href="#7.23.1">7.23.1</a>, <a href="#7.23.2.3">7.23.2.3</a>, <a href="#7.23.3">7.23.3</a>, <a href="#7.23.3.1">7.23.3.1</a>,           types, <a href="#6.2.5">6.2.5</a>
+          <a href="#7.23.3.3">7.23.3.3</a>, <a href="#7.23.3.4">7.23.3.4</a>, <a href="#7.23.3.5">7.23.3.5</a>                            character, <a href="#6.7.8">6.7.8</a>
+    calendar, <a href="#7.23.1">7.23.1</a>, <a href="#7.23.2.2">7.23.2.2</a>, <a href="#7.23.2.3">7.23.2.3</a>, <a href="#7.23.2.4">7.23.2.4</a>,               compatible, <a href="#6.2.7">6.2.7</a>, <a href="#6.7.2">6.7.2</a>, <a href="#6.7.3">6.7.3</a>, <a href="#6.7.5">6.7.5</a>
+          <a href="#7.23.3.2">7.23.3.2</a>, <a href="#7.23.3.3">7.23.3.3</a>, <a href="#7.23.3.4">7.23.3.4</a>                            complex, <a href="#6.2.5">6.2.5</a>, <a href="#G">G</a>
+    components, <a href="#7.23.1">7.23.1</a>                                            composite, <a href="#6.2.7">6.2.7</a>
+    conversion functions, <a href="#7.23.3">7.23.3</a>                                  const qualified, <a href="#6.7.3">6.7.3</a>
+       wide character, <a href="#7.24.5">7.24.5</a>                                     conversions, <a href="#6.3">6.3</a>
+    local, <a href="#7.23.1">7.23.1</a>                                                 imaginary, <a href="#G">G</a>
+    manipulation functions, <a href="#7.23.2">7.23.2</a>                                restrict qualified, <a href="#6.7.3">6.7.3</a>
+ time function, <a href="#7.23.2.4">7.23.2.4</a>                                          volatile qualified, <a href="#6.7.3">6.7.3</a>
+ time.h header, <a href="#7.23">7.23</a>
+ time_t type, <a href="#7.23.1">7.23.1</a>                                           UCHAR_MAX macro, <a href="#5.2.4.2.1">5.2.4.2.1</a>
+ tm structure type, <a href="#7.23.1">7.23.1</a>, <a href="#7.24.1">7.24.1</a>                             UINT_FASTN_MAX macros, <a href="#7.18.2.3">7.18.2.3</a>
+ TMP_MAX macro, <a href="#7.19.1">7.19.1</a>, <a href="#7.19.4.3">7.19.4.3</a>, <a href="#7.19.4.4">7.19.4.4</a>                     uint_fastN_t types, <a href="#7.18.1.3">7.18.1.3</a>
+ tmpfile function, <a href="#7.19.4.3">7.19.4.3</a>, <a href="#7.20.4.3">7.20.4.3</a>                          UINT_LEASTN_MAX macros, <a href="#7.18.2.2">7.18.2.2</a>
+ tmpnam function, <a href="#7.19.1">7.19.1</a>, <a href="#7.19.4.3">7.19.4.3</a>, <a href="#7.19.4.4">7.19.4.4</a>                   uint_leastN_t types, <a href="#7.18.1.2">7.18.1.2</a>
+ token, <a href="#5.1.1.2">5.1.1.2</a>, <a href="#6.4">6.4</a>, see also preprocessing tokens            UINT_MAX macro, <a href="#5.2.4.2.1">5.2.4.2.1</a>
+ token concatenation, <a href="#6.10.3.3">6.10.3.3</a>                                 UINTMAX_C macro, <a href="#7.18.4.2">7.18.4.2</a>
+ token pasting, <a href="#6.10.3.3">6.10.3.3</a>                                       UINTMAX_MAX macro, <a href="#7.8.2.3">7.8.2.3</a>, <a href="#7.8.2.4">7.8.2.4</a>, <a href="#7.18.2.5">7.18.2.5</a>
+<!--page 551 -->
+ uintmax_t type, <a href="#7.18.1.5">7.18.1.5</a>, <a href="#7.19.6.1">7.19.6.1</a>, <a href="#7.19.6.2">7.19.6.2</a>,               USHRT_MAX macro, <a href="#5.2.4.2.1">5.2.4.2.1</a>
+      <a href="#7.24.2.1">7.24.2.1</a>, <a href="#7.24.2.2">7.24.2.2</a>                                     usual arithmetic conversions, <a href="#6.3.1.8">6.3.1.8</a>, <a href="#6.5.5">6.5.5</a>, <a href="#6.5.6">6.5.6</a>,
+ UINTN_C macros, <a href="#7.18.4.1">7.18.4.1</a>                                          <a href="#6.5.8">6.5.8</a>, <a href="#6.5.9">6.5.9</a>, <a href="#6.5.10">6.5.10</a>, <a href="#6.5.11">6.5.11</a>, <a href="#6.5.12">6.5.12</a>, <a href="#6.5.15">6.5.15</a>
+ UINTN_MAX macros, <a href="#7.18.2.1">7.18.2.1</a>                                  utilities, general, <a href="#7.20">7.20</a>
+ uintN_t types, <a href="#7.18.1.1">7.18.1.1</a>                                        wide string, <a href="#7.24.4">7.24.4</a>
+ UINTPTR_MAX macro, <a href="#7.18.2.4">7.18.2.4</a>
+ uintptr_t type, <a href="#7.18.1.4">7.18.1.4</a>                                    va_arg macro, <a href="#7.15">7.15</a>, <a href="#7.15.1">7.15.1</a>, <a href="#7.15.1.1">7.15.1.1</a>, <a href="#7.15.1.2">7.15.1.2</a>,
+ ULLONG_MAX macro, <a href="#5.2.4.2.1">5.2.4.2.1</a>, <a href="#7.20.1.4">7.20.1.4</a>,                           <a href="#7.15.1.4">7.15.1.4</a>, <a href="#7.19.6.8">7.19.6.8</a>, <a href="#7.19.6.9">7.19.6.9</a>, <a href="#7.19.6.10">7.19.6.10</a>,
+      <a href="#7.24.4.1.2">7.24.4.1.2</a>                                                  <a href="#7.19.6.11">7.19.6.11</a>, <a href="#7.19.6.12">7.19.6.12</a>, <a href="#7.19.6.13">7.19.6.13</a>, <a href="#7.19.6.14">7.19.6.14</a>,
+ ULONG_MAX macro, <a href="#5.2.4.2.1">5.2.4.2.1</a>, <a href="#7.20.1.4">7.20.1.4</a>,                            <a href="#7.24.2.5">7.24.2.5</a>, <a href="#7.24.2.6">7.24.2.6</a>, <a href="#7.24.2.7">7.24.2.7</a>, <a href="#7.24.2.8">7.24.2.8</a>,
+      <a href="#7.24.4.1.2">7.24.4.1.2</a>                                                  <a href="#7.24.2.9">7.24.2.9</a>, <a href="#7.24.2.10">7.24.2.10</a>
+ unary arithmetic operators, <a href="#6.5.3.3">6.5.3.3</a>                         va_copy macro, <a href="#7.15">7.15</a>, <a href="#7.15.1">7.15.1</a>, <a href="#7.15.1.1">7.15.1.1</a>, <a href="#7.15.1.2">7.15.1.2</a>,
+ unary expression, <a href="#6.5.3">6.5.3</a>                                          <a href="#7.15.1.3">7.15.1.3</a>
+ unary minus operator (-), <a href="#6.5.3.3">6.5.3.3</a>, <a href="#F.3">F.3</a>                      va_end macro, <a href="#7.1.3">7.1.3</a>, <a href="#7.15">7.15</a>, <a href="#7.15.1">7.15.1</a>, <a href="#7.15.1.3">7.15.1.3</a>,
+ unary operators, <a href="#6.5.3">6.5.3</a>                                           <a href="#7.15.1.4">7.15.1.4</a>, <a href="#7.19.6.8">7.19.6.8</a>, <a href="#7.19.6.9">7.19.6.9</a>, <a href="#7.19.6.10">7.19.6.10</a>,
+ unary plus operator (+), <a href="#6.5.3.3">6.5.3.3</a>                                 <a href="#7.19.6.11">7.19.6.11</a>, <a href="#7.19.6.12">7.19.6.12</a>, <a href="#7.19.6.13">7.19.6.13</a>, <a href="#7.19.6.14">7.19.6.14</a>,
+ unbuffered stream, <a href="#7.19.3">7.19.3</a>                                        <a href="#7.24.2.5">7.24.2.5</a>, <a href="#7.24.2.6">7.24.2.6</a>, <a href="#7.24.2.7">7.24.2.7</a>, <a href="#7.24.2.8">7.24.2.8</a>,
+ undef preprocessing directive, <a href="#6.10.3.5">6.10.3.5</a>, <a href="#7.1.3">7.1.3</a>,                  <a href="#7.24.2.9">7.24.2.9</a>, <a href="#7.24.2.10">7.24.2.10</a>
+      <a href="#7.1.4">7.1.4</a>                                                  va_list type, <a href="#7.15">7.15</a>, <a href="#7.15.1.3">7.15.1.3</a>
+ undefined behavior, <a href="#3.4.3">3.4.3</a>, <a href="#4">4</a>, <a href="#J.2">J.2</a>                            va_start macro, <a href="#7.15">7.15</a>, <a href="#7.15.1">7.15.1</a>, <a href="#7.15.1.1">7.15.1.1</a>,
+ underscore character, <a href="#6.4.2.1">6.4.2.1</a>                                    <a href="#7.15.1.2">7.15.1.2</a>, <a href="#7.15.1.3">7.15.1.3</a>, <a href="#7.15.1.4">7.15.1.4</a>, <a href="#7.19.6.8">7.19.6.8</a>,
+ underscore, leading, in identifier, <a href="#7.1.3">7.1.3</a>                         <a href="#7.19.6.9">7.19.6.9</a>, <a href="#7.19.6.10">7.19.6.10</a>, <a href="#7.19.6.11">7.19.6.11</a>, <a href="#7.19.6.12">7.19.6.12</a>,
+ ungetc function, <a href="#7.19.1">7.19.1</a>, <a href="#7.19.7.11">7.19.7.11</a>, <a href="#7.19.9.2">7.19.9.2</a>,                    <a href="#7.19.6.13">7.19.6.13</a>, <a href="#7.19.6.14">7.19.6.14</a>, <a href="#7.24.2.5">7.24.2.5</a>, <a href="#7.24.2.6">7.24.2.6</a>,
+      <a href="#7.19.9.3">7.19.9.3</a>                                                    <a href="#7.24.2.7">7.24.2.7</a>, <a href="#7.24.2.8">7.24.2.8</a>, <a href="#7.24.2.9">7.24.2.9</a>, <a href="#7.24.2.10">7.24.2.10</a>
+ ungetwc function, <a href="#7.19.1">7.19.1</a>, <a href="#7.24.3.10">7.24.3.10</a>                         value, <a href="#3.17">3.17</a>
+ Unicode required set, <a href="#6.10.8">6.10.8</a>                                value bits, <a href="#6.2.6.2">6.2.6.2</a>
+ union                                                       variable arguments, <a href="#6.10.3">6.10.3</a>, <a href="#7.15">7.15</a>
+   arrow operator (-&gt;), <a href="#6.5.2.3">6.5.2.3</a>                              variable arguments header, <a href="#7.15">7.15</a>
+   content, <a href="#6.7.2.3">6.7.2.3</a>                                          variable length array, <a href="#6.7.5">6.7.5</a>, <a href="#6.7.5.2">6.7.5.2</a>
+   dot operator (.), <a href="#6.5.2.3">6.5.2.3</a>                                 variably modified type, <a href="#6.7.5">6.7.5</a>, <a href="#6.7.5.2">6.7.5.2</a>
+   initialization, <a href="#6.7.8">6.7.8</a>                                     vertical-tab character, <a href="#5.2.1">5.2.1</a>, <a href="#6.4">6.4</a>
+   member alignment, <a href="#6.7.2.1">6.7.2.1</a>                                 vertical-tab escape sequence (\v), <a href="#5.2.2">5.2.2</a>, <a href="#6.4.4.4">6.4.4.4</a>,
+   member name space, <a href="#6.2.3">6.2.3</a>                                       <a href="#7.4.1.10">7.4.1.10</a>
+   member operator (.), <a href="#6.3.2.1">6.3.2.1</a>, <a href="#6.5.2.3">6.5.2.3</a>                     vfprintf function, <a href="#7.19.1">7.19.1</a>, <a href="#7.19.6.8">7.19.6.8</a>
+   pointer operator (-&gt;), <a href="#6.5.2.3">6.5.2.3</a>                            vfscanf function, <a href="#7.19.1">7.19.1</a>, <a href="#7.19.6.8">7.19.6.8</a>, <a href="#7.19.6.9">7.19.6.9</a>
+   specifier, <a href="#6.7.2.1">6.7.2.1</a>                                         vfwprintf function, <a href="#7.19.1">7.19.1</a>, <a href="#7.24.2.5">7.24.2.5</a>
+   tag, <a href="#6.2.3">6.2.3</a>, <a href="#6.7.2.3">6.7.2.3</a>                                       vfwscanf function, <a href="#7.19.1">7.19.1</a>, <a href="#7.24.2.6">7.24.2.6</a>, <a href="#7.24.3.10">7.24.3.10</a>
+   type, <a href="#6.2.5">6.2.5</a>, <a href="#6.7.2.1">6.7.2.1</a>                                      visibility of identifier, <a href="#6.2.1">6.2.1</a>
+ universal character name, <a href="#6.4.3">6.4.3</a>                             VLA, see variable length array
+ unqualified type, <a href="#6.2.5">6.2.5</a>                                      void expression, <a href="#6.3.2.2">6.3.2.2</a>
+ unqualified version of type, <a href="#6.2.5">6.2.5</a>                           void function parameter, <a href="#6.7.5.3">6.7.5.3</a>
+ unsigned integer suffix, u or <a href="#U">U</a>, <a href="#6.4.4.1">6.4.4.1</a>                     void type, <a href="#6.2.5">6.2.5</a>, <a href="#6.3.2.2">6.3.2.2</a>, <a href="#6.7.2">6.7.2</a>
+ unsigned integer types, <a href="#6.2.5">6.2.5</a>, <a href="#6.3.1.3">6.3.1.3</a>, <a href="#6.4.4.1">6.4.4.1</a>             void type conversion, <a href="#6.3.2.2">6.3.2.2</a>
+ unsigned type conversion, <a href="#6.3.1.1">6.3.1.1</a>, <a href="#6.3.1.3">6.3.1.3</a>,                 volatile storage, <a href="#5.1.2.3">5.1.2.3</a>
+      <a href="#6.3.1.4">6.3.1.4</a>, <a href="#6.3.1.8">6.3.1.8</a>                                       volatile type qualifier, <a href="#6.7.3">6.7.3</a>
+ unsigned types, <a href="#6.2.5">6.2.5</a>, <a href="#6.7.2">6.7.2</a>, <a href="#7.19.6.1">7.19.6.1</a>, <a href="#7.19.6.2">7.19.6.2</a>,           volatile-qualified type, <a href="#6.2.5">6.2.5</a>, <a href="#6.7.3">6.7.3</a>
+      <a href="#7.24.2.1">7.24.2.1</a>, <a href="#7.24.2.2">7.24.2.2</a>                                     vprintf function, <a href="#7.19.1">7.19.1</a>, <a href="#7.19.6.8">7.19.6.8</a>, <a href="#7.19.6.10">7.19.6.10</a>
+ unspecified behavior, <a href="#3.4.4">3.4.4</a>, <a href="#4">4</a>, <a href="#J.1">J.1</a>                          vscanf function, <a href="#7.19.1">7.19.1</a>, <a href="#7.19.6.8">7.19.6.8</a>, <a href="#7.19.6.11">7.19.6.11</a>
+ unspecified value, <a href="#3.17.3">3.17.3</a>                                    vsnprintf function, <a href="#7.19.6.8">7.19.6.8</a>, <a href="#7.19.6.12">7.19.6.12</a>
+ uppercase letter, <a href="#5.2.1">5.2.1</a>                                     vsprintf function, <a href="#7.19.6.8">7.19.6.8</a>, <a href="#7.19.6.13">7.19.6.13</a>
+ use of library functions, <a href="#7.1.4">7.1.4</a>                             vsscanf function, <a href="#7.19.6.8">7.19.6.8</a>, <a href="#7.19.6.14">7.19.6.14</a>
+<!--page 552 -->
+ vswprintf function, <a href="#7.24.2.7">7.24.2.7</a>                                  wctype.h header, <a href="#7.25">7.25</a>, <a href="#7.26.13">7.26.13</a>
+ vswscanf function, <a href="#7.24.2.8">7.24.2.8</a>                                   wctype_t type, <a href="#7.25.1">7.25.1</a>, <a href="#7.25.2.2.2">7.25.2.2.2</a>
+ vwprintf function, <a href="#7.19.1">7.19.1</a>, <a href="#7.24.2.9">7.24.2.9</a>                           WEOF macro, <a href="#7.24.1">7.24.1</a>, <a href="#7.24.3.1">7.24.3.1</a>, <a href="#7.24.3.3">7.24.3.3</a>, <a href="#7.24.3.6">7.24.3.6</a>,
+ vwscanf function, <a href="#7.19.1">7.19.1</a>, <a href="#7.24.2.10">7.24.2.10</a>, <a href="#7.24.3.10">7.24.3.10</a>                     <a href="#7.24.3.7">7.24.3.7</a>, <a href="#7.24.3.8">7.24.3.8</a>, <a href="#7.24.3.9">7.24.3.9</a>, <a href="#7.24.3.10">7.24.3.10</a>,
+                                                                    <a href="#7.24.6.1.1">7.24.6.1.1</a>, <a href="#7.25.1">7.25.1</a>
+ warnings, <a href="#I">I</a>                                                   while statement, <a href="#6.8.5.1">6.8.5.1</a>
+ wchar.h header, <a href="#5.2.4.2.2">5.2.4.2.2</a>, <a href="#7.19.1">7.19.1</a>, <a href="#7.24">7.24</a>, <a href="#7.26.12">7.26.12</a>,             white space, <a href="#5.1.1.2">5.1.1.2</a>, <a href="#6.4">6.4</a>, <a href="#6.10">6.10</a>, <a href="#7.4.1.10">7.4.1.10</a>,
+     <a href="#F">F</a>                                                              <a href="#7.25.2.1.10">7.25.2.1.10</a>
+ WCHAR_MAX macro, <a href="#7.18.3">7.18.3</a>, <a href="#7.24.1">7.24.1</a>                               white-space characters, <a href="#6.4">6.4</a>
+ WCHAR_MIN macro, <a href="#7.18.3">7.18.3</a>, <a href="#7.24.1">7.24.1</a>                               wide character, <a href="#3.7.3">3.7.3</a>
+ wchar_t type, <a href="#3.7.3">3.7.3</a>, <a href="#6.4.4.4">6.4.4.4</a>, <a href="#6.4.5">6.4.5</a>, <a href="#6.7.8">6.7.8</a>,                     case mapping functions, <a href="#7.25.3.1">7.25.3.1</a>
+     <a href="#6.10.8">6.10.8</a>, <a href="#7.17">7.17</a>, <a href="#7.18.3">7.18.3</a>, <a href="#7.19.6.1">7.19.6.1</a>, <a href="#7.19.6.2">7.19.6.2</a>, <a href="#7.20">7.20</a>,                extensible, <a href="#7.25.3.2">7.25.3.2</a>
+     <a href="#7.24.1">7.24.1</a>, <a href="#7.24.2.1">7.24.2.1</a>, <a href="#7.24.2.2">7.24.2.2</a>                                  classification functions, <a href="#7.25.2.1">7.25.2.1</a>
+ wcrtomb function, <a href="#7.19.3">7.19.3</a>, <a href="#7.19.6.2">7.19.6.2</a>, <a href="#7.24.2.2">7.24.2.2</a>,                      extensible, <a href="#7.25.2.2">7.25.2.2</a>
+     <a href="#7.24.6.3.3">7.24.6.3.3</a>, <a href="#7.24.6.4.2">7.24.6.4.2</a>                                      constant, <a href="#6.4.4.4">6.4.4.4</a>
+ wcscat function, <a href="#7.24.4.3.1">7.24.4.3.1</a>                                     formatted input/output functions, <a href="#7.24.2">7.24.2</a>
+ wcschr function, <a href="#7.24.4.5.1">7.24.4.5.1</a>                                     input functions, <a href="#7.19.1">7.19.1</a>
+ wcscmp function, <a href="#7.24.4.4.1">7.24.4.4.1</a>, <a href="#7.24.4.4.4">7.24.4.4.4</a>                         input/output functions, <a href="#7.19.1">7.19.1</a>, <a href="#7.24.3">7.24.3</a>
+ wcscoll function, <a href="#7.24.4.4.2">7.24.4.4.2</a>, <a href="#7.24.4.4.4">7.24.4.4.4</a>                        output functions, <a href="#7.19.1">7.19.1</a>
+ wcscpy function, <a href="#7.24.4.2.1">7.24.4.2.1</a>                                     single-byte conversion functions, <a href="#7.24.6.1">7.24.6.1</a>
+ wcscspn function, <a href="#7.24.4.5.2">7.24.4.5.2</a>                                  wide string, <a href="#7.1.1">7.1.1</a>
+ wcsftime function, <a href="#7.11.1.1">7.11.1.1</a>, <a href="#7.24.5.1">7.24.5.1</a>                         wide string comparison functions, <a href="#7.24.4.4">7.24.4.4</a>
+ wcslen function, <a href="#7.24.4.6.1">7.24.4.6.1</a>                                   wide string concatenation functions, <a href="#7.24.4.3">7.24.4.3</a>
+ wcsncat function, <a href="#7.24.4.3.2">7.24.4.3.2</a>                                  wide string copying functions, <a href="#7.24.4.2">7.24.4.2</a>
+ wcsncmp function, <a href="#7.24.4.4.3">7.24.4.4.3</a>                                  wide string literal, see string literal
+ wcsncpy function, <a href="#7.24.4.2.2">7.24.4.2.2</a>                                  wide string miscellaneous functions, <a href="#7.24.4.6">7.24.4.6</a>
+ wcspbrk function, <a href="#7.24.4.5.3">7.24.4.5.3</a>                                  wide string numeric conversion functions, <a href="#7.8.2.4">7.8.2.4</a>,
+ wcsrchr function, <a href="#7.24.4.5.4">7.24.4.5.4</a>                                       <a href="#7.24.4.1">7.24.4.1</a>
+ wcsrtombs function, <a href="#7.24.6.4.2">7.24.6.4.2</a>                                wide string search functions, <a href="#7.24.4.5">7.24.4.5</a>
+ wcsspn function, <a href="#7.24.4.5.5">7.24.4.5.5</a>                                   wide-oriented stream, <a href="#7.19.2">7.19.2</a>
+ wcsstr function, <a href="#7.24.4.5.6">7.24.4.5.6</a>                                   width, <a href="#6.2.6.2">6.2.6.2</a>
+ wcstod function, <a href="#7.19.6.2">7.19.6.2</a>, <a href="#7.24.2.2">7.24.2.2</a>                           WINT_MAX macro, <a href="#7.18.3">7.18.3</a>
+ wcstod function, <a href="#7.24.4.1.1">7.24.4.1.1</a>                                   WINT_MIN macro, <a href="#7.18.3">7.18.3</a>
+ wcstof function, <a href="#7.24.4.1.1">7.24.4.1.1</a>                                   wint_t type, <a href="#7.18.3">7.18.3</a>, <a href="#7.19.6.1">7.19.6.1</a>, <a href="#7.24.1">7.24.1</a>, <a href="#7.24.2.1">7.24.2.1</a>,
+ wcstoimax function, <a href="#7.8.2.4">7.8.2.4</a>                                        <a href="#7.25.1">7.25.1</a>
+ wcstok function, <a href="#7.24.4.5.7">7.24.4.5.7</a>                                   wmemchr function, <a href="#7.24.4.5.8">7.24.4.5.8</a>
+ wcstol function, <a href="#7.8.2.4">7.8.2.4</a>, <a href="#7.19.6.2">7.19.6.2</a>, <a href="#7.24.2.2">7.24.2.2</a>,                 wmemcmp function, <a href="#7.24.4.4.5">7.24.4.4.5</a>
+     <a href="#7.24.4.1.2">7.24.4.1.2</a>                                                wmemcpy function, <a href="#7.24.4.2.3">7.24.4.2.3</a>
+ wcstold function, <a href="#7.24.4.1.1">7.24.4.1.1</a>                                  wmemmove function, <a href="#7.24.4.2.4">7.24.4.2.4</a>
+ wcstoll function, <a href="#7.8.2.4">7.8.2.4</a>, <a href="#7.24.4.1.2">7.24.4.1.2</a>                         wmemset function, <a href="#7.24.4.6.2">7.24.4.6.2</a>
+ wcstombs function, <a href="#7.20.8.2">7.20.8.2</a>, <a href="#7.24.6.4">7.24.6.4</a>                         wprintf function, <a href="#7.19.1">7.19.1</a>, <a href="#7.24.2.9">7.24.2.9</a>, <a href="#7.24.2.11">7.24.2.11</a>
+ wcstoul function, <a href="#7.8.2.4">7.8.2.4</a>, <a href="#7.19.6.2">7.19.6.2</a>, <a href="#7.24.2.2">7.24.2.2</a>,                wscanf function, <a href="#7.19.1">7.19.1</a>, <a href="#7.24.2.10">7.24.2.10</a>, <a href="#7.24.2.12">7.24.2.12</a>,
+     <a href="#7.24.4.1.2">7.24.4.1.2</a>                                                     <a href="#7.24.3.10">7.24.3.10</a>
+ wcstoull function, <a href="#7.8.2.4">7.8.2.4</a>, <a href="#7.24.4.1.2">7.24.4.1.2</a>
+ wcstoumax function, <a href="#7.8.2.4">7.8.2.4</a>                                   xor macro, <a href="#7.9">7.9</a>
+ wcsxfrm function, <a href="#7.24.4.4.4">7.24.4.4.4</a>                                  xor_eq macro, <a href="#7.9">7.9</a>
+ wctob function, <a href="#7.24.6.1.2">7.24.6.1.2</a>, <a href="#7.25.2.1">7.25.2.1</a>
+ wctomb function, <a href="#7.20.7.3">7.20.7.3</a>, <a href="#7.20.8.2">7.20.8.2</a>, <a href="#7.24.6.3">7.24.6.3</a>
+ wctrans function, <a href="#7.25.3.2.1">7.25.3.2.1</a>, <a href="#7.25.3.2.2">7.25.3.2.2</a>
+ wctrans_t type, <a href="#7.25.1">7.25.1</a>, <a href="#7.25.3.2.2">7.25.3.2.2</a>
+ wctype function, <a href="#7.25.2.2.1">7.25.2.2.1</a>, <a href="#7.25.2.2.2">7.25.2.2.2</a>
+</pre>
+</body></html>