newer c1x draft
authornsz <nsz@tpx.(none)>
Mon, 4 Jul 2011 01:09:33 +0000 (03:09 +0200)
committernsz <nsz@tpx.(none)>
Mon, 4 Jul 2011 01:09:33 +0000 (03:09 +0200)
n1548.html [new file with mode: 0644]
n1548.txt [new file with mode: 0644]

diff --git a/n1548.html b/n1548.html
new file mode 100644 (file)
index 0000000..4b289e9
--- /dev/null
@@ -0,0 +1,26906 @@
+<html><head><title>N1548                    Committee Draft -- December 2, 2010          ISO/IEC 9899:201x</title></head><body><pre>
+N1548                    Committee Draft -- December 2, 2010          ISO/IEC 9899:201x
+
+
+
+
+INTERNATIONAL STANDARD                         (C)ISO/IEC              ISO/IEC 9899:201x
+
+
+
+
+Programming languages -- C
+
+
+                                       ABSTRACT
+
+
+
+                     (Cover sheet to be provided by ISO Secretariat.)
+
+This International Standard specifies the form and establishes the interpretation of
+programs expressed in the programming language C. Its purpose is to promote
+portability, reliability, maintainability, and efficient execution of C language programs on
+a variety of computing systems.
+
+Clauses are included that detail the C language itself and the contents of the C language
+execution library. Annexes summarize aspects of both of them, and enumerate factors
+that influence the portability of C programs.
+
+Although this International Standard is intended to guide knowledgeable C language
+programmers as well as implementors of C language translation systems, the document
+itself is not designed to serve as a tutorial.
+
+Recipients of this draft are invited to submit, with their comments, notification of any
+relevant patent rights of which they are aware and to provide supporting documentation.
+
+Changes from the previous draft (N1256) are indicated by ''diff marks'' in the right
+margin: deleted text is marked with ''*'', new or changed text with '' ''.
+
+
+
+
+[page i]
+
+
+
+[page ii]
+
+<a name="Contents" href="#Contents">Contents</a>
+<a href="#Foreword">Foreword       . . . . . . . . . . . . . . . . . . . . . . . . . . . . .                                 xiii</a>
+<a href="#Introduction">Introduction    . . . . . . . . . . . . . . . . . . . . . . . . . . . . xvii</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       . . . . . . . . . . . . . . . . . . . . . . . . . .                                   8</a>
+<a href="#5">5. Environment    . . . . . . . . . . .       . .   .   .   .   .   .   .   .    .   .   .   .   .   .    10</a>
+<a href="#5.1">   5.1 Conceptual models       . . . . . .    . .   .   .   .   .   .   .   .    .   .   .   .   .   .    10</a>
+<a href="#5.1.1">        5.1.1  Translation environment .      . .   .   .   .   .   .   .   .    .   .   .   .   .   .    10</a>
+<a href="#5.1.2">        5.1.2  Execution environments     .   . .   .   .   .   .   .   .   .    .   .   .   .   .   .    12</a>
+<a href="#5.2">   5.2 Environmental considerations    . .    . .   .   .   .   .   .   .   .    .   .   .   .   .   .    22</a>
+<a href="#5.2.1">        5.2.1  Character sets    . . . . .    . .   .   .   .   .   .   .   .    .   .   .   .   .   .    22</a>
+<a href="#5.2.2">        5.2.2  Character display semantics      .   .   .   .   .   .   .   .    .   .   .   .   .   .    24</a>
+<a href="#5.2.3">        5.2.3  Signals and interrupts . .     . .   .   .   .   .   .   .   .    .   .   .   .   .   .    25</a>
+<a href="#5.2.4">        5.2.4  Environmental limits    . .    . .   .   .   .   .   .   .   .    .   .   .   .   .   .    25</a>
+<a href="#6">6. Language . . . . . . . . . . . . . . . .             .   .   .   .   .   .    .   .   .   .   .   .    35</a>
+<a href="#6.1">   6.1 Notation . . . . . . . . . . . . . .             .   .   .   .   .   .    .   .   .   .   .   .    35</a>
+<a href="#6.2">   6.2 Concepts       . . . . . . . . . . . . .         .   .   .   .   .   .    .   .   .   .   .   .    35</a>
+<a href="#6.2.1">        6.2.1   Scopes of identifiers     . . . . .      .   .   .   .   .   .    .   .   .   .   .   .    35</a>
+<a href="#6.2.2">        6.2.2   Linkages of identifiers . . . . .        .   .   .   .   .   .    .   .   .   .   .   .    36</a>
+<a href="#6.2.3">        6.2.3   Name spaces of identifiers      . . .    .   .   .   .   .   .    .   .   .   .   .   .    37</a>
+<a href="#6.2.4">        6.2.4   Storage durations of objects     . .    .   .   .   .   .   .    .   .   .   .   .   .    38</a>
+<a href="#6.2.5">        6.2.5   Types       . . . . . . . . . . .       .   .   .   .   .   .    .   .   .   .   .   .    39</a>
+<a href="#6.2.6">        6.2.6   Representations of types . . . .        .   .   .   .   .   .    .   .   .   .   .   .    44</a>
+<a href="#6.2.7">        6.2.7   Compatible type and composite type          .   .   .   .   .    .   .   .   .   .   .    47</a>
+<a href="#6.2.8">        6.2.8   Alignment of objects     . . . . .      .   .   .   .   .   .    .   .   .   .   .   .    48</a>
+<a href="#6.3">   6.3 Conversions       . . . . . . . . . . . .        .   .   .   .   .   .    .   .   .   .   .   .    50</a>
+<a href="#6.3.1">        6.3.1   Arithmetic operands      . . . . .      .   .   .   .   .   .    .   .   .   .   .   .    50</a>
+<a href="#6.3.2">        6.3.2   Other operands       . . . . . . .      .   .   .   .   .   .    .   .   .   .   .   .    54</a>
+<a href="#6.4">   6.4 Lexical elements       . . . . . . . . . .       .   .   .   .   .   .    .   .   .   .   .   .    57</a>
+<a href="#6.4.1">        6.4.1   Keywords . . . . . . . . . .            .   .   .   .   .   .    .   .   .   .   .   .    58</a>
+<a href="#6.4.2">        6.4.2   Identifiers . . . . . . . . . .          .   .   .   .   .   .    .   .   .   .   .   .    59</a>
+<a href="#6.4.3">        6.4.3   Universal character names      . . .    .   .   .   .   .   .    .   .   .   .   .   .    61</a>
+<a href="#6.4.4">        6.4.4   Constants . . . . . . . . . .           .   .   .   .   .   .    .   .   .   .   .   .    62</a>
+<a href="#6.4.5">        6.4.5   String literals   . . . . . . . .       .   .   .   .   .   .    .   .   .   .   .   .    70</a>
+<a href="#6.4.6">        6.4.6   Punctuators . . . . . . . . .           .   .   .   .   .   .    .   .   .   .   .   .    72</a>
+<a href="#6.4.7">        6.4.7   Header names      . . . . . . . .       .   .   .   .   .   .    .   .   .   .   .   .    73</a>
+<a href="#6.4.8">        6.4.8   Preprocessing numbers        . . . .    .   .   .   .   .   .    .   .   .   .   .   .    74</a>
+<a href="#6.4.9">        6.4.9   Comments        . . . . . . . . .       .   .   .   .   .   .    .   .   .   .   .   .    75</a>
+
+
+[page iii]
+
+<a href="#6.5">     6.5  Expressions      . . . . . . . . . .     .   .   .   .   .   .   .   .   .   .   .   .   .   .    76</a>
+<a href="#6.5.1">          6.5.1   Primary expressions      . . .   .   .   .   .   .   .   .   .   .   .   .   .   .   .    78</a>
+<a href="#6.5.2">          6.5.2   Postfix operators . . . . .       .   .   .   .   .   .   .   .   .   .   .   .   .   .    79</a>
+<a href="#6.5.3">          6.5.3   Unary operators      . . . . .   .   .   .   .   .   .   .   .   .   .   .   .   .   .    88</a>
+<a href="#6.5.4">          6.5.4   Cast operators . . . . . .       .   .   .   .   .   .   .   .   .   .   .   .   .   .    91</a>
+<a href="#6.5.5">          6.5.5   Multiplicative operators   . .   .   .   .   .   .   .   .   .   .   .   .   .   .   .    92</a>
+<a href="#6.5.6">          6.5.6   Additive operators     . . . .   .   .   .   .   .   .   .   .   .   .   .   .   .   .    92</a>
+<a href="#6.5.7">          6.5.7   Bitwise shift operators . . .    .   .   .   .   .   .   .   .   .   .   .   .   .   .    94</a>
+<a href="#6.5.8">          6.5.8   Relational operators . . . .     .   .   .   .   .   .   .   .   .   .   .   .   .   .    95</a>
+<a href="#6.5.9">          6.5.9   Equality operators     . . . .   .   .   .   .   .   .   .   .   .   .   .   .   .   .    96</a>
+<a href="#6.5.10">          6.5.10 Bitwise AND operator . . .        .   .   .   .   .   .   .   .   .   .   .   .   .   .    97</a>
+<a href="#6.5.11">          6.5.11 Bitwise exclusive OR operator         .   .   .   .   .   .   .   .   .   .   .   .   .    98</a>
+<a href="#6.5.12">          6.5.12 Bitwise inclusive OR operator     .   .   .   .   .   .   .   .   .   .   .   .   .   .    98</a>
+<a href="#6.5.13">          6.5.13 Logical AND operator . . .        .   .   .   .   .   .   .   .   .   .   .   .   .   .    99</a>
+<a href="#6.5.14">          6.5.14 Logical OR operator       . . .   .   .   .   .   .   .   .   .   .   .   .   .   .   .    99</a>
+<a href="#6.5.15">          6.5.15 Conditional operator      . . .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   100</a>
+<a href="#6.5.16">          6.5.16 Assignment operators . . .        .   .   .   .   .   .   .   .   .   .   .   .   .   .   101</a>
+<a href="#6.5.17">          6.5.17 Comma operator . . . . .          .   .   .   .   .   .   .   .   .   .   .   .   .   .   104</a>
+<a href="#6.6">     6.6 Constant expressions . . . . . . .        .   .   .   .   .   .   .   .   .   .   .   .   .   .   105</a>
+<a href="#6.7">     6.7 Declarations      . . . . . . . . . .     .   .   .   .   .   .   .   .   .   .   .   .   .   .   107</a>
+<a href="#6.7.1">          6.7.1   Storage-class specifiers    . .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   108</a>
+<a href="#6.7.2">          6.7.2   Type specifiers . . . . . .       .   .   .   .   .   .   .   .   .   .   .   .   .   .   109</a>
+<a href="#6.7.3">          6.7.3   Type qualifiers . . . . . .       .   .   .   .   .   .   .   .   .   .   .   .   .   .   120</a>
+<a href="#6.7.4">          6.7.4   Function specifiers     . . . .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   124</a>
+<a href="#6.7.5">          6.7.5   Alignment specifier . . . .       .   .   .   .   .   .   .   .   .   .   .   .   .   .   126</a>
+<a href="#6.7.6">          6.7.6   Declarators     . . . . . . .    .   .   .   .   .   .   .   .   .   .   .   .   .   .   127</a>
+<a href="#6.7.7">          6.7.7   Type names . . . . . . .         .   .   .   .   .   .   .   .   .   .   .   .   .   .   135</a>
+<a href="#6.7.8">          6.7.8   Type definitions      . . . . .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   136</a>
+<a href="#6.7.9">          6.7.9   Initialization    . . . . . .    .   .   .   .   .   .   .   .   .   .   .   .   .   .   138</a>
+<a href="#6.7.10">          6.7.10 Static assertions     . . . . .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   144</a>
+<a href="#6.8">     6.8 Statements and blocks      . . . . . .    .   .   .   .   .   .   .   .   .   .   .   .   .   .   145</a>
+<a href="#6.8.1">          6.8.1   Labeled statements     . . . .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   145</a>
+<a href="#6.8.2">          6.8.2   Compound statement       . . .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   146</a>
+<a href="#6.8.3">          6.8.3   Expression and null statements       .   .   .   .   .   .   .   .   .   .   .   .   .   146</a>
+<a href="#6.8.4">          6.8.4   Selection statements     . . .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   147</a>
+<a href="#6.8.5">          6.8.5   Iteration statements . . . .     .   .   .   .   .   .   .   .   .   .   .   .   .   .   149</a>
+<a href="#6.8.6">          6.8.6   Jump statements      . . . . .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   150</a>
+<a href="#6.9">     6.9 External definitions      . . . . . . .    .   .   .   .   .   .   .   .   .   .   .   .   .   .   154</a>
+<a href="#6.9.1">          6.9.1   Function definitions . . . .      .   .   .   .   .   .   .   .   .   .   .   .   .   .   155</a>
+<a href="#6.9.2">          6.9.2   External object definitions   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   157</a>
+<a href="#6.10">     6.10 Preprocessing directives     . . . . .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   159</a>
+<a href="#6.10.1">          6.10.1 Conditional inclusion     . . .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   161</a>
+<a href="#6.10.2">          6.10.2 Source file inclusion      . . .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   163</a>
+<a href="#6.10.3">          6.10.3 Macro replacement . . . .         .   .   .   .   .   .   .   .   .   .   .   .   .   .   165</a>
+
+
+[page iv]
+
+<a href="#6.10.4">       6.10.4 Line control . . . . . .        .   .   .   .   .   .   .   .   .    .   .   .   .   .   .   172</a>
+<a href="#6.10.5">       6.10.5 Error directive . . . . .       .   .   .   .   .   .   .   .   .    .   .   .   .   .   .   173</a>
+<a href="#6.10.6">       6.10.6 Pragma directive . . . .        .   .   .   .   .   .   .   .   .    .   .   .   .   .   .   173</a>
+<a href="#6.10.7">       6.10.7 Null directive      . . . . .   .   .   .   .   .   .   .   .   .    .   .   .   .   .   .   174</a>
+<a href="#6.10.8">       6.10.8 Predefined macro names .         .   .   .   .   .   .   .   .   .    .   .   .   .   .   .   174</a>
+<a href="#6.10.9">       6.10.9 Pragma operator       . . . .   .   .   .   .   .   .   .   .   .    .   .   .   .   .   .   176</a>
+<a href="#6.11">  6.11 Future language directions     . . .   .   .   .   .   .   .   .   .   .    .   .   .   .   .   .   178</a>
+<a href="#6.11.1">       6.11.1 Floating types      . . . . .   .   .   .   .   .   .   .   .   .    .   .   .   .   .   .   178</a>
+<a href="#6.11.2">       6.11.2 Linkages of identifiers . .      .   .   .   .   .   .   .   .   .    .   .   .   .   .   .   178</a>
+<a href="#6.11.3">       6.11.3 External names        . . . .   .   .   .   .   .   .   .   .   .    .   .   .   .   .   .   178</a>
+<a href="#6.11.4">       6.11.4 Character escape sequences          .   .   .   .   .   .   .   .    .   .   .   .   .   .   178</a>
+<a href="#6.11.5">       6.11.5 Storage-class specifiers     .   .   .   .   .   .   .   .   .   .    .   .   .   .   .   .   178</a>
+<a href="#6.11.6">       6.11.6 Function declarators      . .   .   .   .   .   .   .   .   .   .    .   .   .   .   .   .   178</a>
+<a href="#6.11.7">       6.11.7 Function definitions . . .       .   .   .   .   .   .   .   .   .    .   .   .   .   .   .   178</a>
+<a href="#6.11.8">       6.11.8 Pragma directives       . . .   .   .   .   .   .   .   .   .   .    .   .   .   .   .   .   178</a>
+<a href="#6.11.9">       6.11.9 Predefined macro names .         .   .   .   .   .   .   .   .   .    .   .   .   .   .   .   178</a>
+<a href="#7">7. Library . . . . . . . . . . . . . . . . . .                .   .   .   .   .    .   .   .   .   .   .   179</a>
+<a href="#7.1">   7.1 Introduction     . . . . . . . . . . . . .             .   .   .   .   .    .   .   .   .   .   .   179</a>
+<a href="#7.1.1">         7.1.1 Definitions of terms . . . . . . .              .   .   .   .   .    .   .   .   .   .   .   179</a>
+<a href="#7.1.2">         7.1.2 Standard headers . . . . . . . .               .   .   .   .   .    .   .   .   .   .   .   180</a>
+<a href="#7.1.3">         7.1.3 Reserved identifiers . . . . . . .              .   .   .   .   .    .   .   .   .   .   .   181</a>
+<a href="#7.1.4">         7.1.4 Use of library functions    . . . . .          .   .   .   .   .    .   .   .   .   .   .   182</a>
+<a href="#7.2">   7.2 Diagnostics &lt;assert.h&gt;          . . . . . . .          .   .   .   .   .    .   .   .   .   .   .   185</a>
+<a href="#7.2.1">         7.2.1 Program diagnostics       . . . . . .          .   .   .   .   .    .   .   .   .   .   .   185</a>
+<a href="#7.3">   7.3 Complex arithmetic &lt;complex.h&gt;           . . .         .   .   .   .   .    .   .   .   .   .   .   187</a>
+<a href="#7.3.1">         7.3.1 Introduction . . . . . . . . . .               .   .   .   .   .    .   .   .   .   .   .   187</a>
+<a href="#7.3.2">         7.3.2 Conventions . . . . . . . . . .                .   .   .   .   .    .   .   .   .   .   .   188</a>
+<a href="#7.3.3">         7.3.3 Branch cuts . . . . . . . . . .                .   .   .   .   .    .   .   .   .   .   .   188</a>
+<a href="#7.3.4">         7.3.4 The CX_LIMITED_RANGE pragma                    .   .   .   .   .    .   .   .   .   .   .   188</a>
+<a href="#7.3.5">         7.3.5 Trigonometric functions . . . . .              .   .   .   .   .    .   .   .   .   .   .   189</a>
+<a href="#7.3.6">         7.3.6 Hyperbolic functions      . . . . . .          .   .   .   .   .    .   .   .   .   .   .   191</a>
+<a href="#7.3.7">         7.3.7 Exponential and logarithmic functions              .   .   .   .    .   .   .   .   .   .   193</a>
+<a href="#7.3.8">         7.3.8 Power and absolute-value functions             .   .   .   .   .    .   .   .   .   .   .   194</a>
+<a href="#7.3.9">         7.3.9 Manipulation functions      . . . . .          .   .   .   .   .    .   .   .   .   .   .   195</a>
+<a href="#7.4">   7.4 Character handling &lt;ctype.h&gt; . . . . .                 .   .   .   .   .    .   .   .   .   .   .   199</a>
+<a href="#7.4.1">         7.4.1 Character classification functions    .         .   .   .   .   .    .   .   .   .   .   .   199</a>
+<a href="#7.4.2">         7.4.2 Character case mapping functions     .         .   .   .   .   .    .   .   .   .   .   .   202</a>
+<a href="#7.5">   7.5 Errors &lt;errno.h&gt;         . . . . . . . . . .           .   .   .   .   .    .   .   .   .   .   .   204</a>
+<a href="#7.6">   7.6 Floating-point environment &lt;fenv.h&gt;        . .         .   .   .   .   .    .   .   .   .   .   .   205</a>
+<a href="#7.6.1">         7.6.1 The FENV_ACCESS pragma           . . .         .   .   .   .   .    .   .   .   .   .   .   207</a>
+<a href="#7.6.2">         7.6.2 Floating-point exceptions      . . . .         .   .   .   .   .    .   .   .   .   .   .   208</a>
+<a href="#7.6.3">         7.6.3 Rounding . . . . . . . . . . .                 .   .   .   .   .    .   .   .   .   .   .   211</a>
+<a href="#7.6.4">         7.6.4 Environment        . . . . . . . . .           .   .   .   .   .    .   .   .   .   .   .   212</a>
+<a href="#7.7">   7.7 Characteristics of floating types &lt;float.h&gt;             .   .   .   .   .    .   .   .   .   .   .   215</a>
+
+[page v]
+
+<a href="#7.8">     7.8    Format conversion of integer types &lt;inttypes.h&gt; . . . .           .   .   .   .   216</a>
+<a href="#7.8.1">            7.8.1    Macros for format specifiers      . . . . . . . . . .     .   .   .   .   216</a>
+<a href="#7.8.2">            7.8.2    Functions for greatest-width integer types   . . . . .   .   .   .   .   217</a>
+<a href="#7.9">     7.9    Alternative spellings &lt;iso646.h&gt; . . . . . . . . . . .            .   .   .   .   220</a>
+<a href="#7.10">     7.10   Sizes of integer types &lt;limits.h&gt;         . . . . . . . . . .     .   .   .   .   221</a>
+<a href="#7.11">     7.11   Localization &lt;locale.h&gt; . . . . . . . . . . . . . .               .   .   .   .   222</a>
+<a href="#7.11.1">            7.11.1 Locale control . . . . . . . . . . . . . . . .             .   .   .   .   223</a>
+<a href="#7.11.2">            7.11.2 Numeric formatting convention inquiry . . . . . .          .   .   .   .   224</a>
+<a href="#7.12">     7.12   Mathematics &lt;math.h&gt; . . . . . . . . . . . . . . .                .   .   .   .   230</a>
+<a href="#7.12.1">            7.12.1 Treatment of error conditions . . . . . . . . . .          .   .   .   .   232</a>
+<a href="#7.12.2">            7.12.2 The FP_CONTRACT pragma             . . . . . . . . . .     .   .   .   .   234</a>
+<a href="#7.12.3">            7.12.3 Classification macros       . . . . . . . . . . . . .       .   .   .   .   234</a>
+<a href="#7.12.4">            7.12.4 Trigonometric functions . . . . . . . . . . . .            .   .   .   .   237</a>
+<a href="#7.12.5">            7.12.5 Hyperbolic functions       . . . . . . . . . . . . .       .   .   .   .   239</a>
+<a href="#7.12.6">            7.12.6 Exponential and logarithmic functions        . . . . . .   .   .   .   .   241</a>
+<a href="#7.12.7">            7.12.7 Power and absolute-value functions         . . . . . . .   .   .   .   .   246</a>
+<a href="#7.12.8">            7.12.8 Error and gamma functions . . . . . . . . . . .            .   .   .   .   248</a>
+<a href="#7.12.9">            7.12.9 Nearest integer functions . . . . . . . . . . . .          .   .   .   .   250</a>
+<a href="#7.12.10">            7.12.10 Remainder functions       . . . . . . . . . . . . .       .   .   .   .   253</a>
+<a href="#7.12.11">            7.12.11 Manipulation functions       . . . . . . . . . . . .      .   .   .   .   254</a>
+<a href="#7.12.12">            7.12.12 Maximum, minimum, and positive difference functions           .   .   .   256</a>
+<a href="#7.12.13">            7.12.13 Floating multiply-add . . . . . . . . . . . . .           .   .   .   .   257</a>
+<a href="#7.12.14">            7.12.14 Comparison macros . . . . . . . . . . . . . .             .   .   .   .   258</a>
+<a href="#7.13">     7.13   Nonlocal jumps &lt;setjmp.h&gt;            . . . . . . . . . . . .      .   .   .   .   261</a>
+<a href="#7.13.1">            7.13.1 Save calling environment         . . . . . . . . . . .     .   .   .   .   261</a>
+<a href="#7.13.2">            7.13.2 Restore calling environment        . . . . . . . . . .     .   .   .   .   262</a>
+<a href="#7.14">     7.14   Signal handling &lt;signal.h&gt; . . . . . . . . . . . . .              .   .   .   .   264</a>
+<a href="#7.14.1">            7.14.1 Specify signal handling       . . . . . . . . . . . .      .   .   .   .   265</a>
+<a href="#7.14.2">            7.14.2 Send signal      . . . . . . . . . . . . . . . . .         .   .   .   .   266</a>
+<a href="#7.15">     7.15   Alignment &lt;stdalign.h&gt;            . . . . . . . . . . . . .       .   .   .   .   267</a>
+<a href="#7.16">     7.16   Variable arguments &lt;stdarg.h&gt;           . . . . . . . . . . .     .   .   .   .   268</a>
+<a href="#7.16.1">            7.16.1 Variable argument list access macros . . . . . . .         .   .   .   .   268</a>
+<a href="#7.17">     7.17   Atomics &lt;stdatomic.h&gt; . . . . . . . . . . . . . .                 .   .   .   .   272</a>
+<a href="#7.17.1">            7.17.1 Introduction . . . . . . . . . . . . . . . . .             .   .   .   .   272</a>
+<a href="#7.17.2">            7.17.2 Initialization      . . . . . . . . . . . . . . . .        .   .   .   .   273</a>
+<a href="#7.17.3">            7.17.3 Order and consistency . . . . . . . . . . . . .            .   .   .   .   274</a>
+<a href="#7.17.4">            7.17.4 Fences . . . . . . . . . . . . . . . . . . .               .   .   .   .   277</a>
+<a href="#7.17.5">            7.17.5 Lock-free property       . . . . . . . . . . . . . .       .   .   .   .   278</a>
+<a href="#7.17.6">            7.17.6 Atomic integer and address types         . . . . . . . .   .   .   .   .   279</a>
+<a href="#7.17.7">            7.17.7 Operations on atomic types . . . . . . . . . . .           .   .   .   .   281</a>
+<a href="#7.17.8">            7.17.8 Atomic flag type and operations . . . . . . . . .           .   .   .   .   284</a>
+<a href="#7.18">     7.18   Boolean type and values &lt;stdbool.h&gt;             . . . . . . . .   .   .   .   .   286</a>
+<a href="#7.19">     7.19   Common definitions &lt;stddef.h&gt; . . . . . . . . . . .                .   .   .   .   287</a>
+<a href="#7.20">     7.20   Integer types &lt;stdint.h&gt; . . . . . . . . . . . . . .              .   .   .   .   289</a>
+
+
+[page vi]
+
+<a href="#7.20.1">         7.20.1 Integer types      . . . . . . . . . . . .      .   .    .   .   .   .   .   .   289</a>
+<a href="#7.20.2">         7.20.2 Limits of specified-width integer types    . .   .   .    .   .   .   .   .   .   291</a>
+<a href="#7.20.3">         7.20.3 Limits of other integer types    . . . . . .    .   .    .   .   .   .   .   .   293</a>
+<a href="#7.20.4">         7.20.4 Macros for integer constants     . . . . . .    .   .    .   .   .   .   .   .   294</a>
+<a href="#7.21">  7.21   Input/output &lt;stdio.h&gt;         . . . . . . . . . .     .   .    .   .   .   .   .   .   296</a>
+<a href="#7.21.1">         7.21.1 Introduction . . . . . . . . . . . . .          .   .    .   .   .   .   .   .   296</a>
+<a href="#7.21.2">         7.21.2 Streams       . . . . . . . . . . . . . .       .   .    .   .   .   .   .   .   298</a>
+<a href="#7.21.3">         7.21.3 Files . . . . . . . . . . . . . . . .           .   .    .   .   .   .   .   .   300</a>
+<a href="#7.21.4">         7.21.4 Operations on files      . . . . . . . . . .     .   .    .   .   .   .   .   .   302</a>
+<a href="#7.21.5">         7.21.5 File access functions     . . . . . . . . .     .   .    .   .   .   .   .   .   304</a>
+<a href="#7.21.6">         7.21.6 Formatted input/output functions     . . . .    .   .    .   .   .   .   .   .   309</a>
+<a href="#7.21.7">         7.21.7 Character input/output functions . . . . .      .   .    .   .   .   .   .   .   330</a>
+<a href="#7.21.8">         7.21.8 Direct input/output functions    . . . . . .    .   .    .   .   .   .   .   .   334</a>
+<a href="#7.21.9">         7.21.9 File positioning functions     . . . . . . .    .   .    .   .   .   .   .   .   335</a>
+<a href="#7.21.10">         7.21.10 Error-handling functions . . . . . . . .       .   .    .   .   .   .   .   .   338</a>
+<a href="#7.22">  7.22   General utilities &lt;stdlib.h&gt;        . . . . . . . .    .   .    .   .   .   .   .   .   340</a>
+<a href="#7.22.1">         7.22.1 Numeric conversion functions . . . . . .        .   .    .   .   .   .   .   .   341</a>
+<a href="#7.22.2">         7.22.2 Pseudo-random sequence generation functions         .    .   .   .   .   .   .   346</a>
+<a href="#7.22.3">         7.22.3 Memory management functions . . . . .           .   .    .   .   .   .   .   .   347</a>
+<a href="#7.22.4">         7.22.4 Communication with the environment        . .   .   .    .   .   .   .   .   .   349</a>
+<a href="#7.22.5">         7.22.5 Searching and sorting utilities . . . . . .     .   .    .   .   .   .   .   .   353</a>
+<a href="#7.22.6">         7.22.6 Integer arithmetic functions     . . . . . .    .   .    .   .   .   .   .   .   355</a>
+<a href="#7.22.7">         7.22.7 Multibyte/wide character conversion functions       .    .   .   .   .   .   .   356</a>
+<a href="#7.22.8">         7.22.8 Multibyte/wide string conversion functions      .   .    .   .   .   .   .   .   358</a>
+<a href="#7.23">  7.23   String handling &lt;string.h&gt; . . . . . . . . .           .   .    .   .   .   .   .   .   360</a>
+<a href="#7.23.1">         7.23.1 String function conventions . . . . . . .       .   .    .   .   .   .   .   .   360</a>
+<a href="#7.23.2">         7.23.2 Copying functions       . . . . . . . . . .     .   .    .   .   .   .   .   .   360</a>
+<a href="#7.23.3">         7.23.3 Concatenation functions . . . . . . . .         .   .    .   .   .   .   .   .   362</a>
+<a href="#7.23.4">         7.23.4 Comparison functions . . . . . . . . .          .   .    .   .   .   .   .   .   363</a>
+<a href="#7.23.5">         7.23.5 Search functions      . . . . . . . . . . .     .   .    .   .   .   .   .   .   365</a>
+<a href="#7.23.6">         7.23.6 Miscellaneous functions . . . . . . . .         .   .    .   .   .   .   .   .   368</a>
+<a href="#7.24">  7.24   Type-generic math &lt;tgmath.h&gt;          . . . . . . .    .   .    .   .   .   .   .   .   370</a>
+<a href="#7.25">  7.25   Threads &lt;threads.h&gt;          . . . . . . . . . . .     .   .    .   .   .   .   .   .   373</a>
+<a href="#7.25.1">         7.25.1 Introduction . . . . . . . . . . . . .          .   .    .   .   .   .   .   .   373</a>
+<a href="#7.25.2">         7.25.2 Initialization functions . . . . . . . . .      .   .    .   .   .   .   .   .   375</a>
+<a href="#7.25.3">         7.25.3 Condition variable functions     . . . . . .    .   .    .   .   .   .   .   .   375</a>
+<a href="#7.25.4">         7.25.4 Mutex functions       . . . . . . . . . . .     .   .    .   .   .   .   .   .   377</a>
+<a href="#7.25.5">         7.25.5 Thread functions . . . . . . . . . . .          .   .    .   .   .   .   .   .   380</a>
+<a href="#7.25.6">         7.25.6 Thread-specific storage functions     . . . .    .   .    .   .   .   .   .   .   382</a>
+<a href="#7.25.7">         7.25.7 Time functions . . . . . . . . . . . .          .   .    .   .   .   .   .   .   384</a>
+<a href="#7.26">  7.26   Date and time &lt;time.h&gt;         . . . . . . . . . .     .   .    .   .   .   .   .   .   385</a>
+<a href="#7.26.1">         7.26.1 Components of time        . . . . . . . . .     .   .    .   .   .   .   .   .   385</a>
+<a href="#7.26.2">         7.26.2 Time manipulation functions      . . . . . .    .   .    .   .   .   .   .   .   386</a>
+<a href="#7.26.3">         7.26.3 Time conversion functions      . . . . . . .    .   .    .   .   .   .   .   .   388</a>
+
+
+[page vii]
+
+<a href="#7.27">   7.27 Unicode utilities &lt;uchar.h&gt; . . . . . . . . . . . . . .               . .     .   395</a>
+<a href="#7.27.1">        7.27.1 Restartable multibyte/wide character conversion functions        .     .   395</a>
+<a href="#7.28">   7.28 Extended multibyte and wide character utilities &lt;wchar.h&gt; . .         . .     .   399</a>
+<a href="#7.28.1">        7.28.1 Introduction . . . . . . . . . . . . . . . . . .               . .     .   399</a>
+<a href="#7.28.2">        7.28.2 Formatted wide character input/output functions       . . .    . .     .   400</a>
+<a href="#7.28.3">        7.28.3 Wide character input/output functions        . . . . . . .     . .     .   418</a>
+<a href="#7.28.4">        7.28.4 General wide string utilities     . . . . . . . . . . .        . .     .   422</a>
+<a href="#7.28.4.1">                 7.28.4.1 Wide string numeric conversion functions     . .    . .     .   423</a>
+<a href="#7.28.4.2">                 7.28.4.2 Wide string copying functions . . . . . . .         . .     .   427</a>
+<a href="#7.28.4.3">                 7.28.4.3 Wide string concatenation functions      . . . .    . .     .   429</a>
+<a href="#7.28.4.4">                 7.28.4.4 Wide string comparison functions      . . . . .     . .     .   430</a>
+<a href="#7.28.4.5">                 7.28.4.5 Wide string search functions      . . . . . . .     . .     .   432</a>
+<a href="#7.28.4.6">                 7.28.4.6 Miscellaneous functions      . . . . . . . . .      . .     .   436</a>
+<a href="#7.28.5">        7.28.5 Wide character time conversion functions       . . . . . .     . .     .   436</a>
+<a href="#7.28.6">        7.28.6 Extended multibyte/wide character conversion utilities .       . .     .   437</a>
+<a href="#7.28.6.1">                 7.28.6.1 Single-byte/wide character conversion functions     . .     .   438</a>
+<a href="#7.28.6.2">                 7.28.6.2 Conversion state functions     . . . . . . . .      . .     .   438</a>
+<a href="#7.28.6.3">                 7.28.6.3 Restartable multibyte/wide character conversion
+                           functions   . . . . . . . . . . . . . . .          . . . 439</a>
+<a href="#7.28.6.4">                 7.28.6.4 Restartable multibyte/wide string conversion
+                           functions   . . . . . . . . . . . . . . .          .   .   .   441</a>
+<a href="#7.29">   7.29 Wide character classification and mapping utilities &lt;wctype.h&gt;         .   .   .   444</a>
+<a href="#7.29.1">        7.29.1 Introduction . . . . . . . . . . . . . . . . . .               .   .   .   444</a>
+<a href="#7.29.2">        7.29.2 Wide character classification utilities . . . . . . . .         .   .   .   445</a>
+<a href="#7.29.2.1">                 7.29.2.1 Wide character classification functions     . . .    .   .   .   445</a>
+<a href="#7.29.2.2">                 7.29.2.2 Extensible wide character classification
+                           functions   . . . . . . . . . . . . . . .          . . . 448</a>
+<a href="#7.29.3">        7.29.3 Wide character case mapping utilities . . . . . . . .          . . . 450</a>
+<a href="#7.29.3.1">                 7.29.3.1 Wide character case mapping functions      . . .    . . . 450</a>
+<a href="#7.29.3.2">                 7.29.3.2 Extensible wide character case mapping
+                           functions   . . . . . . . . . . . . . . .          .   .   .   450</a>
+<a href="#7.30">   7.30 Future library directions    . . . . . . . . . . . . . . . .          .   .   .   452</a>
+<a href="#7.30.1">        7.30.1 Complex arithmetic &lt;complex.h&gt; . . . . . . . .                 .   .   .   452</a>
+<a href="#7.30.2">        7.30.2 Character handling &lt;ctype.h&gt;            . . . . . . . . .      .   .   .   452</a>
+<a href="#7.30.3">        7.30.3 Errors &lt;errno.h&gt;           . . . . . . . . . . . . . .         .   .   .   452</a>
+<a href="#7.30.4">        7.30.4 Format conversion of integer types &lt;inttypes.h&gt;            .   .   .   .   452</a>
+<a href="#7.30.5">        7.30.5 Localization &lt;locale.h&gt;           . . . . . . . . . . .        .   .   .   452</a>
+<a href="#7.30.6">        7.30.6 Signal handling &lt;signal.h&gt;           . . . . . . . . . .       .   .   .   452</a>
+<a href="#7.30.7">        7.30.7 Boolean type and values &lt;stdbool.h&gt;            . . . . . .     .   .   .   452</a>
+<a href="#7.30.8">        7.30.8 Integer types &lt;stdint.h&gt;          . . . . . . . . . . .        .   .   .   452</a>
+<a href="#7.30.9">        7.30.9 Input/output &lt;stdio.h&gt;          . . . . . . . . . . . .        .   .   .   453</a>
+<a href="#7.30.10">        7.30.10 General utilities &lt;stdlib.h&gt;        . . . . . . . . . .       .   .   .   453</a>
+<a href="#7.30.11">        7.30.11 String handling &lt;string.h&gt;          . . . . . . . . . .       .   .   .   453</a>
+
+
+
+[page viii]
+
+<a href="#7.30.12">        7.30.12 Extended multibyte and wide character utilities
+                &lt;wchar.h&gt;        . . . . . . . . . . . . . . . . . . . . 453</a>
+<a href="#7.30.13">        7.30.13 Wide character classification and mapping utilities
+                &lt;wctype.h&gt; . . . . . . . . . . . . . . . . . . . . 453</a>
+<a href="#A">Annex A (informative) Language syntax summary   . .       .   .   .   .    .   .   .   .   .   .   454</a>
+<a href="#A.1">  A.1 Lexical grammar       . . . . . . . . . . . .       .   .   .   .    .   .   .   .   .   .   454</a>
+<a href="#A.2">  A.2 Phrase structure grammar . . . . . . . . .          .   .   .   .    .   .   .   .   .   .   461</a>
+<a href="#A.3">  A.3 Preprocessing directives    . . . . . . . . .       .   .   .   .    .   .   .   .   .   .   469</a>
+<a href="#B">Annex B (informative) Library summary     . . . . . . . . . . . . .                    .   .   .   471</a>
+<a href="#B.1">  B.1 Diagnostics &lt;assert.h&gt;          . . . . . . . . . . . . . . .                    .   .   .   471</a>
+<a href="#B.2">  B.2 Complex &lt;complex.h&gt; . . . . . . . . . . . . . . . .                              .   .   .   471</a>
+<a href="#B.3">  B.3 Character handling &lt;ctype.h&gt; . . . . . . . . . . . . .                           .   .   .   473</a>
+<a href="#B.4">  B.4 Errors &lt;errno.h&gt;         . . . . . . . . . . . . . . . . . .                     .   .   .   473</a>
+<a href="#B.5">  B.5 Floating-point environment &lt;fenv.h&gt;          . . . . . . . . . .                 .   .   .   473</a>
+<a href="#B.6">  B.6 Characteristics of floating types &lt;float.h&gt; . . . . . . . .                       .   .   .   474</a>
+<a href="#B.7">  B.7 Format conversion of integer types &lt;inttypes.h&gt; . . . . .                        .   .   .   474</a>
+<a href="#B.8">  B.8 Alternative spellings &lt;iso646.h&gt; . . . . . . . . . . . .                         .   .   .   475</a>
+<a href="#B.9">  B.9 Sizes of integer types &lt;limits.h&gt;          . . . . . . . . . . .                 .   .   .   475</a>
+<a href="#B.10">  B.10 Localization &lt;locale.h&gt; . . . . . . . . . . . . . . .                           .   .   .   475</a>
+<a href="#B.11">  B.11 Mathematics &lt;math.h&gt; . . . . . . . . . . . . . . . .                            .   .   .   475</a>
+<a href="#B.12">  B.12 Nonlocal jumps &lt;setjmp.h&gt;          . . . . . . . . . . . . .                    .   .   .   480</a>
+<a href="#B.13">  B.13 Signal handling &lt;signal.h&gt; . . . . . . . . . . . . . .                          .   .   .   480</a>
+<a href="#B.14">  B.14 Alignment &lt;stdalign.h&gt;           . . . . . . . . . . . . . .                    .   .   .   481</a>
+<a href="#B.15">  B.15 Variable arguments &lt;stdarg.h&gt;         . . . . . . . . . . . .                   .   .   .   481</a>
+<a href="#B.16">  B.16 Atomics &lt;stdatomic.h&gt; . . . . . . . . . . . . . . .                             .   .   .   481</a>
+<a href="#B.17">  B.17 Boolean type and values &lt;stdbool.h&gt;           . . . . . . . . .                 .   .   .   483</a>
+<a href="#B.18">  B.18 Common definitions &lt;stddef.h&gt; . . . . . . . . . . . .                            .   .   .   483</a>
+<a href="#B.19">  B.19 Integer types &lt;stdint.h&gt; . . . . . . . . . . . . . . .                          .   .   .   483</a>
+<a href="#B.20">  B.20 Input/output &lt;stdio.h&gt;         . . . . . . . . . . . . . . .                    .   .   .   484</a>
+<a href="#B.21">  B.21 General utilities &lt;stdlib.h&gt;       . . . . . . . . . . . . .                    .   .   .   487</a>
+<a href="#B.22">  B.22 String handling &lt;string.h&gt; . . . . . . . . . . . . . .                          .   .   .   489</a>
+<a href="#B.23">  B.23 Type-generic math &lt;tgmath.h&gt;          . . . . . . . . . . . .                   .   .   .   491</a>
+<a href="#B.24">  B.24 Threads &lt;threads.h&gt;          . . . . . . . . . . . . . . . .                    .   .   .   491</a>
+<a href="#B.25">  B.25 Date and time &lt;time.h&gt;         . . . . . . . . . . . . . . .                    .   .   .   492</a>
+<a href="#B.26">  B.26 Unicode utilities &lt;uchar.h&gt; . . . . . . . . . . . . . .                         .   .   .   493</a>
+<a href="#B.27">  B.27 Extended multibyte/wide character utilities &lt;wchar.h&gt;     . . .                 .   .   .   493</a>
+<a href="#B.28">  B.28 Wide character classification and mapping utilities &lt;wctype.h&gt;                   .   .   .   498</a>
+<a href="#C">Annex C (informative) Sequence points     . . . . . . . . . . . . . . . . . 499</a>
+<a href="#D">Annex D (normative) Universal character names for identifiers . . . . . . . 500</a>
+<a href="#D.1">  D.1 Ranges of characters allowed       . . . . . . . . . . . . . . . . . 500</a>
+<a href="#D.2">  D.2 Ranges of characters disallowed initially . . . . . . . . . . . . . 500</a>
+<a href="#E">Annex E (informative) Implementation limits        . . . . . . . . . . . . . . 501</a>
+
+[page ix]
+
+<a href="#F">Annex F (normative) IEC 60559 floating-point arithmetic . . . . . .          . .     .   .   503</a>
+<a href="#F.1">  F.1 Introduction      . . . . . . . . . . . . . . . . . . . .             . .     .   .   503</a>
+<a href="#F.2">  F.2 Types . . . . . . . . . . . . . . . . . . . . . . .                   . .     .   .   503</a>
+<a href="#F.3">  F.3 Operators and functions       . . . . . . . . . . . . . . .           . .     .   .   504</a>
+<a href="#F.4">  F.4 Floating to integer conversion    . . . . . . . . . . . . .           . .     .   .   506</a>
+<a href="#F.5">  F.5 Binary-decimal conversion       . . . . . . . . . . . . . .           . .     .   .   506</a>
+<a href="#F.6">  F.6 The return statement . . . . . . . . . . . . . . . .                  . .     .   .   507</a>
+<a href="#F.7">  F.7 Contracted expressions . . . . . . . . . . . . . . . .                . .     .   .   507</a>
+<a href="#F.8">  F.8 Floating-point environment      . . . . . . . . . . . . . .           . .     .   .   507</a>
+<a href="#F.9">  F.9 Optimization . . . . . . . . . . . . . . . . . . . .                  . .     .   .   510</a>
+<a href="#F.10">  F.10 Mathematics &lt;math.h&gt; . . . . . . . . . . . . . . .                   . .     .   .   513</a>
+<a href="#F.10.1">        F.10.1 Trigonometric functions . . . . . . . . . . . .              . .     .   .   514</a>
+<a href="#F.10.2">        F.10.2 Hyperbolic functions     . . . . . . . . . . . . .           . .     .   .   516</a>
+<a href="#F.10.3">        F.10.3 Exponential and logarithmic functions    . . . . . .         . .     .   .   516</a>
+<a href="#F.10.4">        F.10.4 Power and absolute value functions     . . . . . . .         . .     .   .   520</a>
+<a href="#F.10.5">        F.10.5 Error and gamma functions . . . . . . . . . . .              . .     .   .   521</a>
+<a href="#F.10.6">        F.10.6 Nearest integer functions . . . . . . . . . . . .            . .     .   .   522</a>
+<a href="#F.10.7">        F.10.7 Remainder functions      . . . . . . . . . . . . .           . .     .   .   524</a>
+<a href="#F.10.8">        F.10.8 Manipulation functions     . . . . . . . . . . . .           . .     .   .   525</a>
+<a href="#F.10.9">        F.10.9 Maximum, minimum, and positive difference functions            .     .   .   526</a>
+<a href="#F.10.10">        F.10.10 Floating multiply-add . . . . . . . . . . . . .             . .     .   .   526</a>
+<a href="#F.10.11">        F.10.11 Comparison macros . . . . . . . . . . . . . .               . .     .   .   527</a>
+<a href="#G">Annex G (normative) IEC 60559-compatible complex arithmetic     .   .   .   .   .   .   .   528</a>
+<a href="#G.1">  G.1 Introduction     . . . . . . . . . . . . . . . . .        .   .   .   .   .   .   .   528</a>
+<a href="#G.2">  G.2 Types . . . . . . . . . . . . . . . . . . . .             .   .   .   .   .   .   .   528</a>
+<a href="#G.3">  G.3 Conventions      . . . . . . . . . . . . . . . . .        .   .   .   .   .   .   .   528</a>
+<a href="#G.4">  G.4 Conversions      . . . . . . . . . . . . . . . . .        .   .   .   .   .   .   .   529</a>
+<a href="#G.4.1">       G.4.1 Imaginary types     . . . . . . . . . . . .        .   .   .   .   .   .   .   529</a>
+<a href="#G.4.2">       G.4.2 Real and imaginary . . . . . . . . . . .           .   .   .   .   .   .   .   529</a>
+<a href="#G.4.3">       G.4.3 Imaginary and complex       . . . . . . . . .      .   .   .   .   .   .   .   529</a>
+<a href="#G.5">  G.5 Binary operators     . . . . . . . . . . . . . . .        .   .   .   .   .   .   .   529</a>
+<a href="#G.5.1">       G.5.1 Multiplicative operators    . . . . . . . . .      .   .   .   .   .   .   .   530</a>
+<a href="#G.5.2">       G.5.2 Additive operators     . . . . . . . . . . .       .   .   .   .   .   .   .   533</a>
+<a href="#G.6">  G.6 Complex arithmetic &lt;complex.h&gt;         . . . . . . .      .   .   .   .   .   .   .   533</a>
+<a href="#G.6.1">       G.6.1 Trigonometric functions . . . . . . . . .          .   .   .   .   .   .   .   535</a>
+<a href="#G.6.2">       G.6.2 Hyperbolic functions     . . . . . . . . . .       .   .   .   .   .   .   .   535</a>
+<a href="#G.6.3">       G.6.3 Exponential and logarithmic functions     . . .    .   .   .   .   .   .   .   539</a>
+<a href="#G.6.4">       G.6.4 Power and absolute-value functions      . . . .    .   .   .   .   .   .   .   540</a>
+<a href="#G.7">  G.7 Type-generic math &lt;tgmath.h&gt;         . . . . . . . .      .   .   .   .   .   .   .   541</a>
+<a href="#H">Annex H (informative) Language independent arithmetic . .   .   .   .   .   .   .   .   .   542</a>
+<a href="#H.1">  H.1 Introduction     . . . . . . . . . . . . . . . .      .   .   .   .   .   .   .   .   542</a>
+<a href="#H.2">  H.2 Types . . . . . . . . . . . . . . . . . . .           .   .   .   .   .   .   .   .   542</a>
+<a href="#H.3">  H.3 Notification      . . . . . . . . . . . . . . . .      .   .   .   .   .   .   .   .   546</a>
+
+
+[page x]
+
+<a href="#I">Annex I (informative) Common warnings         . . . . . . . . . . . . . . . . 548</a>
+<a href="#J">Annex J (informative) Portability issues    . . . .   .   .   .   .   .   .   .    .   .   .   .   .   .   550</a>
+<a href="#J.1">  J.1 Unspecified behavior . . . .           . . . .   .   .   .   .   .   .   .    .   .   .   .   .   .   550</a>
+<a href="#J.2">  J.2 Undefined behavior          . . . .    . . . .   .   .   .   .   .   .   .    .   .   .   .   .   .   553</a>
+<a href="#J.3">  J.3 Implementation-defined behavior          . . .   .   .   .   .   .   .   .    .   .   .   .   .   .   566</a>
+<a href="#J.4">  J.4 Locale-specific behavior         . .   . . . .   .   .   .   .   .   .   .    .   .   .   .   .   .   574</a>
+<a href="#J.5">  J.5 Common extensions          . . . .    . . . .   .   .   .   .   .   .   .    .   .   .   .   .   .   575</a>
+<a href="#K">Annex K (normative) Bounds-checking interfaces . . . . . . . . . .                             .   .   .   578</a>
+<a href="#K.1">  K.1 Background       . . . . . . . . . . . . . . . . . . . . .                               .   .   .   578</a>
+<a href="#K.2">  K.2 Scope . . . . . . . . . . . . . . . . . . . . . . . .                                    .   .   .   579</a>
+<a href="#K.3">  K.3 Library     . . . . . . . . . . . . . . . . . . . . . . .                                .   .   .   579</a>
+<a href="#K.3.1">       K.3.1 Introduction . . . . . . . . . . . . . . . . . .                                  .   .   .   579</a>
+<a href="#K.3.1.1">                K.3.1.1 Standard headers     . . . . . . . . . . . .                           .   .   .   579</a>
+<a href="#K.3.1.2">                K.3.1.2 Reserved identifiers     . . . . . . . . . . .                          .   .   .   580</a>
+<a href="#K.3.1.3">                K.3.1.3 Use of errno . . . . . . . . . . . . . .                               .   .   .   580</a>
+<a href="#K.3.1.4">                K.3.1.4 Runtime-constraint violations     . . . . . . .                        .   .   .   580</a>
+<a href="#K.3.2">       K.3.2 Errors &lt;errno.h&gt;           . . . . . . . . . . . . . .                            .   .   .   581</a>
+<a href="#K.3.3">       K.3.3 Common definitions &lt;stddef.h&gt;               . . . . . . . .                        .   .   .   581</a>
+<a href="#K.3.4">       K.3.4 Integer types &lt;stdint.h&gt;           . . . . . . . . . . .                          .   .   .   581</a>
+<a href="#K.3.5">       K.3.5 Input/output &lt;stdio.h&gt;          . . . . . . . . . . . .                           .   .   .   582</a>
+<a href="#K.3.5.1">                K.3.5.1 Operations on files      . . . . . . . . . . .                          .   .   .   582</a>
+<a href="#K.3.5.2">                K.3.5.2 File access functions . . . . . . . . . . .                            .   .   .   584</a>
+<a href="#K.3.5.3">                K.3.5.3 Formatted input/output functions . . . . . .                           .   .   .   587</a>
+<a href="#K.3.5.4">                K.3.5.4 Character input/output functions . . . . . .                           .   .   .   598</a>
+<a href="#K.3.6">       K.3.6 General utilities &lt;stdlib.h&gt;          . . . . . . . . . .                         .   .   .   600</a>
+<a href="#K.3.6.1">                K.3.6.1 Runtime-constraint handling       . . . . . . .                        .   .   .   600</a>
+<a href="#K.3.6.2">                K.3.6.2 Communication with the environment . . . .                             .   .   .   602</a>
+<a href="#K.3.6.3">                K.3.6.3 Searching and sorting utilities . . . . . . .                          .   .   .   603</a>
+<a href="#K.3.6.4">                K.3.6.4 Multibyte/wide character conversion functions                          .   .   .   606</a>
+<a href="#K.3.6.5">                K.3.6.5 Multibyte/wide string conversion functions . .                         .   .   .   607</a>
+<a href="#K.3.7">       K.3.7 String handling &lt;string.h&gt;            . . . . . . . . . .                         .   .   .   610</a>
+<a href="#K.3.7.1">                K.3.7.1 Copying functions       . . . . . . . . . . .                          .   .   .   610</a>
+<a href="#K.3.7.2">                K.3.7.2 Concatenation functions       . . . . . . . . .                        .   .   .   613</a>
+<a href="#K.3.7.3">                K.3.7.3 Search functions     . . . . . . . . . . . .                           .   .   .   616</a>
+<a href="#K.3.7.4">                K.3.7.4 Miscellaneous functions       . . . . . . . . .                        .   .   .   617</a>
+<a href="#K.3.8">       K.3.8 Date and time &lt;time.h&gt;          . . . . . . . . . . . .                           .   .   .   620</a>
+<a href="#K.3.8.1">                K.3.8.1 Components of time . . . . . . . . . . .                               .   .   .   620</a>
+<a href="#K.3.8.2">                K.3.8.2 Time conversion functions       . . . . . . . .                        .   .   .   620</a>
+<a href="#K.3.9">       K.3.9 Extended multibyte and wide character utilities
+                &lt;wchar.h&gt;        . . . . . . . . . . . . . . . . .                             . . . 623</a>
+<a href="#K.3.9.1">                K.3.9.1 Formatted wide character input/output functions                        . . . 624</a>
+<a href="#K.3.9.2">                K.3.9.2 General wide string utilities . . . . . . . .                          . . . 635</a>
+
+
+
+[page xi]
+
+<a href="#K.3.9.3">               K.3.9.3 Extended multibyte/wide character conversion
+                       utilities . . . . . . . . . . . . . . . . . . . 643</a>
+<a href="#L">Annex L (normative) Analyzability . .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   648</a>
+<a href="#L.1">  L.1 Scope . . . . . . . . . . .       .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   648</a>
+<a href="#L.2">  L.2 Definitions . . . . . . . . .      .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   648</a>
+<a href="#L.3">  L.3 Requirements . . . . . . . .      .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   649</a>
+<a href="#Bibliography">Bibliography   . . . . . . . . . . . . . . . . . . . . . . . . . . . 650</a>
+<a href="#Index">Index    . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 653</a>
+
+
+
+
+[<a name="#pxii" href="pxii">page xii</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 2. This International Standard was drafted in accordance with the fifth
+    edition (2004).
+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   Attention is drawn to the possibility that some of the elements of this document may be
+    the subject of patent rights. ISO and IEC shall not be held responsible for identifying any
+    or all such patent rights.
+5   This International Standard 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.
+6   This third edition cancels and replaces the second edition, ISO/IEC 9899:1999, as
+    corrected by ISO/IEC 9899:1999/Cor 1:2001, ISO/IEC 9899:1999/Cor 2:2004, and
+    ISO/IEC 9899:1999/Cor 3:2007. Major changes from the previous edition include:
+    -- conditional (optional) features (including some that were previously mandatory)
+    -- support for multiple threads of execution including an improved memory sequencing
+      model, atomic objects, and thread-local storage (<a href="#7.17">&lt;stdatomic.h&gt;</a> and
+      <a href="#7.25">&lt;threads.h&gt;</a>)
+    -- additional floating-point characteristic macros (<a href="#7.7">&lt;float.h&gt;</a>)
+    -- querying and specifying alignment of objects (<a href="#7.15">&lt;stdalign.h&gt;</a>, <a href="#7.22">&lt;stdlib.h&gt;</a>)
+    -- Unicode characters and           strings   (<a href="#7.27">&lt;uchar.h&gt;</a>)       (originally   specified    in
+      ISO/IEC TR 19769:2004)
+    -- type-generic expressions
+
+
+[<a name="#pxiii" href="pxiii">page xiii</a>] (<a href="#Contents">Contents</a>)
+
+    -- static assertions
+    -- anonymous structures and unions
+    -- no-return functions
+    -- macros to create complex numbers (<a href="#7.3">&lt;complex.h&gt;</a>)
+    -- support for opening files for exclusive access
+    -- removed the gets function (<a href="#7.21">&lt;stdio.h&gt;</a>)
+    -- added the aligned_alloc, at_quick_exit, and quick_exit functions
+      (<a href="#7.22">&lt;stdlib.h&gt;</a>)
+    -- (conditional) support for bounds-checking interfaces (originally specified in
+      ISO/IEC TR 24731-1:2007)
+    -- (conditional) support for analyzability
+7   Major changes in the second edition included:
+    -- 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.28">&lt;wchar.h&gt;</a> and <a href="#7.29">&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.24">&lt;tgmath.h&gt;</a>
+    -- the long long int type and library functions
+    -- 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
+
+
+
+[<a name="#pxiv" href="pxiv">page xiv</a>] (<a href="#Contents">Contents</a>)
+
+-- 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.20">&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.21">&lt;stdio.h&gt;</a> and <a href="#7.28">&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.21">&lt;stdio.h&gt;</a>
+-- boolean type in <a href="#7.18">&lt;stdbool.h&gt;</a>
+-- idempotent type qualifiers
+-- empty macro arguments
+-- 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
+
+
+[<a name="#pxv" href="pxv">page xv</a>] (<a href="#Contents">Contents</a>)
+
+    -- 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)
+8   Annexes D, F, G, K, and L form a normative part of this standard; annexes A, B, C, E, H, *
+    I, J, the bibliography, and the index are for information only. In accordance with Part 2 of
+    the ISO/IEC Directives, this foreword, the introduction, notes, footnotes, and examples
+    are also for information only.
+
+
+
+
+[<a name="#pxvi" href="pxvi">page xvi</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.30]) 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="#pxvii" href="pxvii">page xvii</a>] (<a href="#Contents">Contents</a>)
+
+
+
+[<a name="#pxviii" href="pxviii">page xviii</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;
+    -- all minimal requirements of a data-processing system that is capable of supporting a
+      conforming implementation.
+
+
+    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>)
+
+
+<a name="2" href="#2"><b>    2. Normative references</b></a>
+1   The following referenced documents are indispensable for the application of this
+    document. For dated references, only the edition cited applies. For undated references,
+    the latest edition of the referenced document (including any amendments) applies.
+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   memory location
+    either an object of scalar type, or a maximal sequence of adjacent bit-fields all having
+    nonzero width
+
+[<a name="#p5" href="p5">page 5</a>] (<a href="#Contents">Contents</a>)
+
+2   NOTE 1 Two threads of execution can update and access separate memory locations without interfering
+    with each other.
+
+3   NOTE 2 A bit-field and an adjacent non-bit-field member are in separate memory locations. The same
+    applies to two bit-fields, if one is declared inside a nested structure declaration and the other is not, or if the
+    two are separated by a zero-length bit-field declaration, or if they are separated by a non-bit-field member
+    declaration. It is not safe to concurrently update two non-atomic bit-fields in the same structure if all
+    members declared between them are also (non-zero-length) bit-fields, no matter what the sizes of those
+    intervening bit-fields happen to be.
+
+4   EXAMPLE        A structure declared as
+             struct {
+                   char a;
+                   int b:5, c:11, :0, d:8;
+                   struct { int ee:8; } e;
+             }
+    contains four separate memory locations: The member a, and bit-fields d and e.ee are each separate
+    memory locations, and can be modified concurrently without interfering with each other. The bit-fields b
+    and c together constitute the fourth memory location. The bit-fields b and c cannot be concurrently
+    modified, but b and a, for example, can be.
+
+<a name="3.15" href="#3.15"><b>    3.15</b></a>
+1   object
+    region of data storage in the execution environment, the contents of which can represent
+    values
+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.16" href="#3.16"><b>    3.16</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.17" href="#3.17"><b>    3.17</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.18" href="#3.18"><b>    3.18</b></a>
+1   runtime-constraint
+    requirement on a program when calling a library function
+2   NOTE 1 Despite the similar terms, a runtime-constraint is not a kind of constraint as defined by <a href="#3.8">3.8</a>, and
+    need not be diagnosed at translation time.
+
+3   NOTE 2 Implementations that support the extensions in <a href="#K">annex K</a> are required to verify that the runtime-
+    constraints for a library function are not violated by the program; see <a href="#K.3.1.4">K.3.1.4</a>.
+
+[<a name="#p6" href="p6">page 6</a>] (<a href="#Contents">Contents</a>)
+
+<a name="3.19" href="#3.19"><b>    3.19</b></a>
+1   value
+    precise meaning of the contents of an object when interpreted as having a specific type
+<a name="3.19.1" href="#3.19.1"><b>    3.19.1</b></a>
+1   implementation-defined value
+    unspecified value where each implementation documents how the choice is made
+<a name="3.19.2" href="#3.19.2"><b>    3.19.2</b></a>
+1   indeterminate value
+    either an unspecified value or a trap representation
+<a name="3.19.3" href="#3.19.3"><b>    3.19.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.19.4" href="#3.19.4"><b>    3.19.4</b></a>
+1   trap representation
+    an object representation that need not represent a value of the object type
+<a name="3.19.5" href="#3.19.5"><b>    3.19.5</b></a>
+1   perform a trap
+    interrupt execution of the program such that no further operations are performed
+2   NOTE In this International Standard, when the word ''trap'' is not immediately followed by
+    ''representation'', this is the intended usage.2)
+
+<a name="3.20" href="#3.20"><b>    3.20</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.21" href="#3.21"><b>    3.21</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.
+
+
+
+
+    2)   For example, ''Trapping or stopping (if supported) is disabled...'' (<a href="#F.8.2">F.8.2</a>). Note that fetching a trap
+         representation might perform a trap but is not required to (see <a href="#6.2.6.1">6.2.6.1</a>).
+
+[<a name="#p7" href="p7">page 7</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 or runtime-
+    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.3) 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;stdalign.h&gt;</a>, <a href="#7.16">&lt;stdarg.h&gt;</a>, <a href="#7.18">&lt;stdbool.h&gt;</a>,
+    <a href="#7.19">&lt;stddef.h&gt;</a>, and <a href="#7.20">&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.4)
+
+
+
+    3)   A strictly conforming program can use conditional features (see <a href="#6.10.8.3">6.10.8.3</a>) provided the use is guarded
+         by an appropriate conditional inclusion preprocessing directive using the related macro. For example:
+                 #ifdef __STDC_IEC_559__ /* FE_UPWARD defined */
+                    /* ... */
+                    fesetround(FE_UPWARD);
+                    /* ... */
+                 #endif
+
+    4)   This implies that a conforming implementation reserves no identifiers other than those explicitly
+         reserved in this International Standard.
+
+[<a name="#p8" href="p8">page 8</a>] (<a href="#Contents">Contents</a>)
+
+7   A conforming program is one that is acceptable to a conforming implementation.5)
+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>), alignment <a href="#7.15">&lt;stdalign.h&gt;</a> (<a href="#7.15">7.15</a>),
+    variable arguments <a href="#7.16">&lt;stdarg.h&gt;</a> (<a href="#7.16">7.16</a>), boolean type and values <a href="#7.18">&lt;stdbool.h&gt;</a>
+    (<a href="#7.18">7.18</a>), common definitions <a href="#7.19">&lt;stddef.h&gt;</a> (<a href="#7.19">7.19</a>), integer types <a href="#7.20">&lt;stdint.h&gt;</a> (<a href="#7.20">7.20</a>).
+
+
+
+
+    5)   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="#p9" href="p9">page 9</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.6)
+         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.
+
+
+
+    6)    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="#p10" href="p10">page 10</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 tokens7) 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.8)
+     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>).
+
+
+
+7)    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.
+8)    An implementation need not convert all non-corresponding source characters to the same execution
+      character.
+
+[<a name="#p11" href="p11">page 11</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.9)
+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.9">6.7.9</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.
+
+
+
+
+    9)   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="#p12" href="p12">page 12</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;10) 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).
+
+
+
+
+    10) 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="#p13" href="p13">page 13</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;11) 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.22.4.4">7.22.4.4</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,12) which are changes in the state of
+    the execution environment. Evaluation of an expression in general includes both value
+    computations and initiation of side effects. Value computation for an lvalue expression
+    includes determining the identity of the designated object.
+3   Sequenced before is an asymmetric, transitive, pair-wise relation between evaluations
+    executed by a single thread, which induces a partial order among those evaluations.
+    Given any two evaluations A and B, if A is sequenced before B, then the execution of A
+    shall precede the execution of B. (Conversely, if A is sequenced before B, then B is
+    sequenced after A.) If A is not sequenced before or after B, then A and B are
+    unsequenced. Evaluations A and B are indeterminately sequenced when A is sequenced
+    either before or after B, but it is unspecified which.13) The presence of a sequence point
+    between the evaluation of expressions A and B implies that every value computation and
+    side effect associated with A is sequenced before every value computation and side effect
+    associated with B. (A summary of the sequence points is given in <a href="#C">annex C</a>.)
+4   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
+
+    11) 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.
+    12) 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.
+    13) The executions of unsequenced evaluations can interleave. Indeterminately sequenced evaluations
+        cannot interleave, but can be executed in any order.
+
+[<a name="#p14" href="p14">page 14</a>] (<a href="#Contents">Contents</a>)
+
+     calling a function or accessing a volatile object).
+5    When the processing of the abstract machine is interrupted by receipt of a signal, the
+     values of objects that are neither lock-free atomic objects nor of type volatile
+     sig_atomic_t are unspecified, and the value of any object that is modified by the
+     handler that is neither a lock-free atomic object nor of type volatile
+     sig_atomic_t becomes undefined.
+6    The least requirements on a conforming implementation are:
+     -- Accesses to volatile objects are evaluated strictly according to the rules of the abstract
+       machine.
+     -- 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.21.3" href="#7.21.3"><b>       7.21.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.
+     This is the observable behavior of the program.
+7    What constitutes an interactive device is implementation-defined.
+8    More stringent correspondences between abstract and actual semantics may be defined by
+     each implementation.
+9    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.
+10   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.
+
+11   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.
+
+[<a name="#p15" href="p15">page 15</a>] (<a href="#Contents">Contents</a>)
+
+12   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 <a href="#2.0">2.0</a>, which has type double).
+
+13   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.
+
+14   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.9">F.9</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 * (<a href="#1.0">1.0</a> + y);
+              y = x / <a href="#5.0">5.0</a>;                //   not equivalent to y   = x * 0.2;
+
+15   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 name="#p16" href="p16">page 16</a>] (<a href="#Contents">Contents</a>)
+
+              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.
+
+16   EXAMPLE 7 The grouping of an expression does not completely determine its evaluation. In the
+     following fragment
+              #include <a href="#7.21">&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.21.3">7.21.3</a>).
+<a name="5.1.2.4" href="#5.1.2.4"><b>     5.1.2.4 Multi-threaded executions and data races</b></a>
+1    Under a hosted implementation, a program can have more than one thread of execution
+     (or thread) running concurrently. The execution of each thread proceeds as defined by
+     the remainder of this standard. The execution of the entire program consists of an
+     execution of all of its threads.14) Under a freestanding implementation, it is
+     implementation-defined whether a program can have more than one thread of execution.
+2    The value of an object visible to a thread T at a particular point is the initial value of the
+     object, a value stored in the object by T , or a value stored in the object by another thread,
+     according to the rules below.
+3    NOTE 1 In some cases, there may instead be undefined behavior. Much of this section is motivated by
+     the desire to support atomic operations with explicit and detailed visibility constraints. However, it also
+     implicitly supports a simpler view for more restricted programs.
+
+4    Two expression evaluations conflict if one of them modifies a memory location and the
+     other one reads or modifies the same memory location.
+
+
+
+
+     14) The execution can usually be viewed as an interleaving of all of the threads. However, some kinds of
+         atomic operations, for example, allow executions inconsistent with a simple interleaving as described
+         below.
+
+[<a name="#p17" href="p17">page 17</a>] (<a href="#Contents">Contents</a>)
+
+5    The library defines a number of atomic operations (<a href="#7.17">7.17</a>) and operations on mutexes
+     (<a href="#7.25.4">7.25.4</a>) that are specially identified as synchronization operations. These operations play
+     a special role in making assignments in one thread visible to another. A synchronization
+     operation on one or more memory locations is either an acquire operation, a release
+     operation, both an acquire and release operation, or a consume operation. A
+     synchronization operation without an associated memory location is a fence and can be
+     either an acquire fence, a release fence, or both an acquire and release fence. In addition,
+     there are relaxed atomic operations, which are not synchronization operations, and
+     atomic read-modify-write operations, which have special characteristics.
+6    NOTE 2 For example, a call that acquires a mutex will perform an acquire operation on the locations
+     composing the mutex. Correspondingly, a call that releases the same mutex will perform a release
+     operation on those same locations. Informally, performing a release operation on A forces prior side effects
+     on other memory locations to become visible to other threads that later perform an acquire or consume
+     operation on A. We do not include relaxed atomic operations as synchronization operations although, like
+     synchronization operations, they cannot contribute to data races.
+
+7    All modifications to a particular atomic object M occur in some particular total order,
+     called the modification order of M. If A and B are modifications of an atomic object M,
+     and A happens before B, then A shall precede B in the modification order of M, which is
+     defined below.
+8    NOTE 3     This states that the modification orders must respect the ''happens before'' relation.
+
+9    NOTE 4 There is a separate order for each atomic object. There is no requirement that these can be
+     combined into a single total order for all objects. In general this will be impossible since different threads
+     may observe modifications to different variables in inconsistent orders.
+
+10   A release sequence on an atomic object M is a maximal contiguous sub-sequence of side
+     effects in the modification order of M, where the first operation is a release and every
+     subsequent operation either is performed by the same thread that performed the release or
+     is an atomic read-modify-write operation.
+11   Certain library calls synchronize with other library calls performed by another thread. In
+     particular, an atomic operation A that performs a release operation on an object M
+     synchronizes with an atomic operation B that performs an acquire operation on M and
+     reads a value written by any side effect in the release sequence headed by A.
+12   NOTE 5 Except in the specified cases, reading a later value does not necessarily ensure visibility as
+     described below. Such a requirement would sometimes interfere with efficient implementation.
+
+13   NOTE 6 The specifications of the synchronization operations define when one reads the value written by
+     another. For atomic variables, the definition is clear. All operations on a given mutex occur in a single total
+     order. Each mutex acquisition ''reads the value written'' by the last mutex release.
+
+14   An evaluation A carries a dependency 15) to an evaluation B if:
+
+
+     15) The ''carries a dependency'' relation is a subset of the ''sequenced before'' relation, and is similarly
+         strictly intra-thread.
+
+[<a name="#p18" href="p18">page 18</a>] (<a href="#Contents">Contents</a>)
+
+     -- the value of A is used as an operand of B, unless:
+           o B is an invocation of the kill_dependency macro,
+
+           o A is the left operand of a &amp;&amp; or || operator,
+
+           o A is the left operand of a ? : operator, or
+
+           o A is the left operand of a , operator;
+         or
+     -- A writes a scalar object or bit-field M, B reads from M the value written by A, and A
+       is sequenced before B, or
+     -- for some evaluation X, A carries a dependency to X and X carries a dependency to B.
+15   An evaluation A is dependency-ordered before16) an evaluation B if:
+     -- A performs a release operation on an atomic object M, and B performs a consume
+       operation on M and reads a value written by any side effect in the release sequence
+       headed by A, or
+     -- for some evaluation X, A is dependency-ordered before X and X carries a
+       dependency to B.
+16   An evaluation A inter-thread happens before an evaluation B if A synchronizes with B, A
+     is dependency-ordered before B, or, for some evaluation X:
+     -- A synchronizes with X and X is sequenced before B,
+     -- A is sequenced before X and X inter-thread happens before B, or
+     -- A inter-thread happens before X and X inter-thread happens before B.
+17   NOTE 7 The ''inter-thread happens before'' relation describes arbitrary concatenations of ''sequenced
+     before'', ''synchronizes with'', and ''dependency-ordered before'' relationships, with two exceptions. The
+     first exception is that a concatenation is not permitted to end with ''dependency-ordered before'' followed
+     by ''sequenced before''. The reason for this limitation is that a consume operation participating in a
+     ''dependency-ordered before'' relationship provides ordering only with respect to operations to which this
+     consume operation actually carries a dependency. The reason that this limitation applies only to the end of
+     such a concatenation is that any subsequent release operation will provide the required ordering for a prior
+     consume operation. The second exception is that a concatenation is not permitted to consist entirely of
+     ''sequenced before''. The reasons for this limitation are (1) to permit ''inter-thread happens before'' to be
+     transitively closed and (2) the ''happens before'' relation, defined below, provides for relationships
+     consisting entirely of ''sequenced before''.
+
+18   An evaluation A happens before an evaluation B if A is sequenced before B or A inter-
+     thread happens before B.
+
+
+
+     16) The ''dependency-ordered before'' relation is analogous to the ''synchronizes with'' relation, but uses
+         release/consume in place of release/acquire.
+
+[<a name="#p19" href="p19">page 19</a>] (<a href="#Contents">Contents</a>)
+
+19   A visible side effect A on an object M with respect to a value computation B of M
+     satisfies the conditions:
+     -- A happens before B, and
+     -- there is no other side effect X to M such that A happens before X and X happens
+         before B.
+     The value of a non-atomic scalar object M, as determined by evaluation B, shall be the
+     value stored by the visible side effect A.
+20   NOTE 8 If there is ambiguity about which side effect to a non-atomic object is visible, then there is a data
+     race and the behavior is undefined.
+
+21   NOTE 9 This states that operations on ordinary variables are not visibly reordered. This is not actually
+     detectable without data races, but it is necessary to ensure that data races, as defined here, and with suitable
+     restrictions on the use of atomics, correspond to data races in a simple interleaved (sequentially consistent)
+     execution.
+
+22   The visible sequence of side effects on an atomic object M, with respect to a value
+     computation B of M, is a maximal contiguous sub-sequence of side effects in the
+     modification order of M, where the first side effect is visible with respect to B, and for
+     every subsequent side effect, it is not the case that B happens before it. The value of an
+     atomic object M, as determined by evaluation B, shall be the value stored by some
+     operation in the visible sequence of M with respect to B. Furthermore, if a value
+     computation A of an atomic object M happens before a value computation B of M, and
+     the value computed by A corresponds to the value stored by side effect X, then the value
+     computed by B shall either equal the value computed by A, or be the value stored by side
+     effect Y , where Y follows X in the modification order of M.
+23   NOTE 10 This effectively disallows compiler reordering of atomic operations to a single object, even if
+     both operations are ''relaxed'' loads. By doing so, we effectively make the ''cache coherence'' guarantee
+     provided by most hardware available to C atomic operations.
+
+24   NOTE 11 The visible sequence depends on the ''happens before'' relation, which in turn depends on the
+     values observed by loads of atomics, which we are restricting here. The intended reading is that there must
+     exist an association of atomic loads with modifications they observe that, together with suitably chosen
+     modification orders and the ''happens before'' relation derived as described above, satisfy the resulting
+     constraints as imposed here.
+
+25   The execution of a program contains a data race if it contains two conflicting actions in
+     different threads, at least one of which is not atomic, and neither happens before the
+     other. Any such data race results in undefined behavior.
+26   NOTE 12 It can be shown that programs that correctly use simple mutexes and
+     memory_order_seq_cst operations to prevent all data races, and use no other synchronization
+     operations, behave as though the operations executed by their constituent threads were simply interleaved,
+     with each value computation of an object being the last value stored in that interleaving. This is normally
+     referred to as ''sequential consistency''. However, this applies only to data-race-free programs, and data-
+     race-free programs cannot observe most program transformations that do not change single-threaded
+     program semantics. In fact, most single-threaded program transformations continue to be allowed, since
+     any program that behaves differently as a result must contain undefined behavior.
+
+[<a name="#p20" href="p20">page 20</a>] (<a href="#Contents">Contents</a>)
+
+27   NOTE 13 Compiler transformations that introduce assignments to a potentially shared memory location
+     that would not be modified by the abstract machine are generally precluded by this standard, since such an
+     assignment might overwrite another assignment by a different thread in cases in which an abstract machine
+     execution would not have encountered a data race. This includes implementations of data member
+     assignment that overwrite adjacent members in separate memory locations. We also generally preclude
+     reordering of atomic loads in cases in which the atomics in question may alias, since this may violate the
+     "visible sequence" rules.
+
+28   NOTE 14 Transformations that introduce a speculative read of a potentially shared memory location may
+     not preserve the semantics of the program as defined in this standard, since they potentially introduce a data
+     race. However, they are typically valid in the context of an optimizing compiler that targets a specific
+     machine with well-defined semantics for data races. They would be invalid for a hypothetical machine that
+     is not tolerant of races or provides hardware race detection.
+
+
+
+
+[<a name="#p21" href="p21">page 21</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="#p22" href="p22">page 22</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 sequences17)) 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.
+
+    17) 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="#p23" href="p23">page 23</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="#p24" href="p24">page 24</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.21.7.3">7.21.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:18)
+    -- 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 void 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
+
+
+    18) Implementations should avoid imposing fixed translation limits whenever possible.
+
+[<a name="#p25" href="p25">page 25</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)19)
+    -- 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 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.20">&lt;stdint.h&gt;</a>.
+    Forward references: integer types <a href="#7.20">&lt;stdint.h&gt;</a> (<a href="#7.20">7.20</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
+
+
+    19) See ''future language directions'' (<a href="#6.11.3">6.11.3</a>).
+
+[<a name="#p26" href="p26">page 26</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="#p27" href="p27">page 27</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.20) 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.21) 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
+
+
+    20) See <a href="#6.2.5">6.2.5</a>.
+    21) 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="#p28" href="p28">page 28</a>] (<a href="#Contents">Contents</a>)
+
+    arithmetic operand.22)
+4   An implementation may give zero and values that are not floating-point numbers (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 minimum range of representable values for a floating type is the most negative finite
+    floating-point number representable in that type through the most positive finite floating-
+    point number representable in that type. In addition, if negative infinity is representable
+    in a type, the range of that type is extended to all negative real numbers; likewise, if
+    positive infinity is representable in a type, the range of that type is extended to all positive
+    real numbers.
+6   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.21">&lt;stdio.h&gt;</a>, <a href="#7.22">&lt;stdlib.h&gt;</a>, and <a href="#7.28">&lt;wchar.h&gt;</a>. The implementation may state that the
+    accuracy is unknown.
+7   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.
+8   The rounding mode for floating-point addition is characterized by the implementation-
+    defined value of FLT_ROUNDS:23)
+          -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.
+
+
+    22) 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.
+    23) 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="#p29" href="p29">page 29</a>] (<a href="#Contents">Contents</a>)
+
+9    Except for assignment and cast (which remove all extra range and precision), the values
+     yielded by operators 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:24)
+            -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.
+10   The presence or absence of subnormal numbers is characterized by the implementation-
+     defined     values     of    FLT_HAS_SUBNORM,          DBL_HAS_SUBNORM,           and
+     LDBL_HAS_SUBNORM:
+            -1       indeterminable25)
+             0       absent26) (type does not support subnormal numbers)
+             1       present (type does support subnormal numbers)
+11   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
+
+
+
+
+     24) 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.
+     25) Characterization as indeterminable is intended if floating-point operations do not consistently interpret
+         subnormal representations as zero, nor as nonzero.
+     26) Characterization as absent is intended if no floating-point operations produce subnormal results from
+         non-subnormal inputs, even if the type format includes representations of subnormal numbers.
+
+[<a name="#p30" href="p30">page 30</a>] (<a href="#Contents">Contents</a>)
+
+-- 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 with p radix b digits
+  can be rounded to a floating-point number with n decimal digits and back again
+  without change to the value,
+       { p log10 b        if b is a power of 10
+       {
+       { [^1 + p log10 b^] otherwise
+   FLT_DECIMAL_DIG                                   6
+   DBL_DECIMAL_DIG                                  10
+   LDBL_DECIMAL_DIG                                 10
+-- 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,
+       { 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
+
+
+
+
+[<a name="#p31" href="p31">page 31</a>] (<a href="#Contents">Contents</a>)
+
+     -- 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
+12   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
+13   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
+          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
+
+
+
+
+[<a name="#p32" href="p32">page 32</a>] (<a href="#Contents">Contents</a>)
+
+     -- minimum positive floating-point number27)
+         FLT_TRUE_MIN                                       1E-37
+         DBL_TRUE_MIN                                       1E-37
+         LDBL_TRUE_MIN                                      1E-37
+     Recommended practice
+14   Conversion from (at least) double to decimal with DECIMAL_DIG digits and back
+     should be the identity function.
+15   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_DECIMAL_DIG                               9
+             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
+
+16   EXAMPLE 2 The following describes floating-point representations that also meet the requirements for
+     single-precision and double-precision numbers in IEC 60559,28) 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
+             FLT_DECIMAL_DIG                               9
+
+
+     27) If the presence or absence of subnormal numbers is indeterminable, then the value is intended to be a
+         positive number no greater than the minimum normalized positive number for the type.
+     28) 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="#p33" href="p33">page 33</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_TRUE_MIN          1.40129846E-45F               //   decimal constant
+        FLT_TRUE_MIN                0X1P-149F               //   hex constant
+        FLT_HAS_SUBNORM                     1
+        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_DECIMAL_DIG                    17
+        DBL_DIG                            15
+        DBL_MIN_EXP                     -1021
+        DBL_MIN      2.2250738585072014E-308                //   decimal constant
+        DBL_MIN                     0X1P-1022               //   hex constant
+        DBL_TRUE_MIN 4.9406564584124654E-324                //   decimal constant
+        DBL_TRUE_MIN                0X1P-1074               //   hex constant
+        DBL_HAS_SUBNORM                     1
+        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.28">&lt;wchar.h&gt;</a>
+(<a href="#7.28">7.28</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.22">&lt;stdlib.h&gt;</a>
+(<a href="#7.22">7.22</a>), input/output <a href="#7.21">&lt;stdio.h&gt;</a> (<a href="#7.21">7.21</a>), mathematics <a href="#7.12">&lt;math.h&gt;</a> (<a href="#7.12">7.12</a>).
+
+
+
+
+[<a name="#p34" href="p34">page 34</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="#p35" href="p35">page 35</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 end
+    strictly before 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.
+8   As a special case, a type name (which is not a declaration of an identifier) is considered to
+    have a scope that begins just after the place within the type name where the omitted
+    identifier would appear were it not omitted.
+    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>), macro replacement (<a href="#6.10.3">6.10.3</a>), name spaces of identifiers (<a href="#6.2.3">6.2.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.29) 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.30)
+
+
+
+    29) There is no linkage between different identifiers.
+
+[<a name="#p36" href="p36">page 36</a>] (<a href="#Contents">Contents</a>)
+
+4   For an identifier declared with the storage-class specifier extern in a scope in which a
+    prior declaration of that identifier is visible,31) 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 any32)
+      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>).
+
+    30) A function declaration can contain the storage-class specifier static only if it is at file scope; see
+<a name="6.7.1" href="#6.7.1"><b>        6.7.1.</b></a>
+    31) As specified in <a href="#6.2.1">6.2.1</a>, the later declaration might hide the prior declaration.
+    32) There is only one name space for tags even though three are possible.
+
+[<a name="#p37" href="p37">page 37</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 four storage
+    durations: static, thread, automatic, and allocated. Allocated storage is described in
+<a name="7.22.3" href="#7.22.3"><b>    7.22.3.</b></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,33) and retains
+    its last-stored value throughout its lifetime.34) 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 (or just past) reaches the end of its lifetime.
+3   An object whose identifier is declared without the storage-class specifier
+    _Thread_local, and either 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 the storage-class specifier _Thread_local
+    has thread storage duration. Its lifetime is the entire execution of the thread for which it
+    is created, and its stored value is initialized when the thread is started. There is a distinct
+    object per thread, and use of the declared name in an expression refers to the object
+    associated with the thread evaluating the expression. The result of attempting to
+    indirectly access an object with thread storage duration from a thread other than the one
+    with which the object is associated is implementation-defined.
+5   An object whose identifier is declared with no linkage and without the storage-class
+    specifier static has automatic storage duration, as do some compound literals. The
+    result of attempting to indirectly access an object with automatic storage duration from a
+    thread other than the one with which the object is associated is implementation-defined.
+6   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 or
+    compound literal is reached in the execution of the block; otherwise, the value becomes
+    indeterminate each time the declaration is reached.
+
+
+
+    33) 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.
+    34) In the case of a volatile object, the last store need not be explicit in the program.
+
+[<a name="#p38" href="p38">page 38</a>] (<a href="#Contents">Contents</a>)
+
+7   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.35) If the scope is entered recursively, a new instance of the object is created
+    each time. The initial value of the object is indeterminate.
+8   A non-lvalue expression with structure or union type, where the structure or union
+    contains a member with array type (including, recursively, members of all contained
+    structures and unions) refers to an object with automatic storage duration and temporary
+    lifetime.36) Its lifetime begins when the expression is evaluated and its initial value is the
+    value of the expression. Its lifetime ends when the evaluation of the containing full
+    expression or full declarator ends. Any attempt to modify an object with temporary
+    lifetime results in undefined behavior.
+    Forward references: array declarators (<a href="#6.7.6.2">6.7.6.2</a>), compound literals (<a href="#6.5.2.5">6.5.2.5</a>), declarators
+    (<a href="#6.7.6">6.7.6</a>), function calls (<a href="#6.5.2.2">6.5.2.2</a>), initialization (<a href="#6.7.9">6.7.9</a>), statements (<a href="#6.8">6.8</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 describe objects) and function types (types
+    that describe functions). At various points within a translation unit an object type may be
+    incomplete (lacking sufficient information to determine the size of objects of that type) or
+    complete (having sufficient information).37)
+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.38) The standard and extended
+    signed integer types are collectively called signed integer types.39)
+
+    35) 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.
+    36) The address of such an object is taken implicitly when an array member is accessed.
+    37) A type may be incomplete or complete throughout an entire translation unit, or it may change states at
+        different points within a translation unit.
+
+[<a name="#p39" href="p39">page 39</a>] (<a href="#Contents">Contents</a>)
+
+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.40)
+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.41) 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.42) 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.
+
+
+     38) 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>.
+     39) Therefore, any statement in this Standard about signed integer types also applies to the extended
+         signed integer types.
+     40) Therefore, any statement in this Standard about unsigned integer types also applies to the extended
+         unsigned integer types.
+     41) The same representation and alignment requirements are meant to imply interchangeability as
+         arguments to functions, return values from functions, and members of unions.
+     42) See ''future language directions'' (<a href="#6.11.1">6.11.1</a>).
+
+[<a name="#p40" href="p40">page 40</a>] (<a href="#Contents">Contents</a>)
+
+11   There are three complex types, designated as float _Complex, double
+     _Complex, and long double _Complex.43) (Complex types are a conditional
+     feature that implementations need not support; see <a href="#6.10.8.3">6.10.8.3</a>.) 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. The basic types are complete object types. Even if the
+     implementation defines two or more basic types to have the same representation, they are
+     nevertheless different types.44)
+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.45)
+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 object type that
+     cannot be completed.
+
+
+
+     43) A specification for imaginary types is in <a href="#G">annex G</a>.
+     44) 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>.
+     45) 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.
+
+[<a name="#p41" href="p41">page 41</a>] (<a href="#Contents">Contents</a>)
+
+20   Any number of derived types can be constructed from the object and function types, as
+     follows:
+     -- An array type describes a contiguously allocated nonempty set of objects with a
+       particular member object type, called the element type. The element type shall be
+       complete whenever the array type is specified. 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''.
+     -- A pointer type may be derived from a function type or an object 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''. A pointer type is a complete
+       object type.
+     -- An atomic type describes the type designated by the construct _Atomic ( type-
+       name ). (Atomic types are a conditional feature that implementations need not
+       support; see <a href="#6.10.8.3">6.10.8.3</a>.)
+     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.46)
+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
+
+
+     46) Note that aggregate type does not include union type because an object with union type can only
+         contain one member at a time.
+
+[<a name="#p42" href="p42">page 42</a>] (<a href="#Contents">Contents</a>)
+
+     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,47) 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.48) A derived type is not qualified by the
+     qualifiers (if any) of the type from which it is derived.
+27   Further, there is the _Atomic qualifier. The presence of the _Atomic qualifier
+     designates an atomic type. The size, representation, and alignment of an atomic type
+     need not be the same as those of the corresponding unqualified type. Therefore, this
+     Standard explicitly uses the phrase ''atomic, qualified or unqualified type'' whenever the
+     atomic version of a type is permitted along with the other qualified versions of a type.
+     The phrase ''qualified or unqualified type'', without specific mention of atomic, does not
+     include the atomic types.
+28   A pointer to void shall have the same representation and alignment requirements as a
+     pointer to a character type.48) Similarly, pointers to qualified or unqualified versions of
+     compatible types shall have the same representation and alignment requirements. All
+     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.
+29   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-
+
+
+     47) See <a href="#6.7.3">6.7.3</a> regarding qualified array and function types.
+     48) 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="#p43" href="p43">page 43</a>] (<a href="#Contents">Contents</a>)
+
+     qualified float'' and is a pointer to a qualified type.
+
+30   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.49)
+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.50) Such a representation is called
+     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.51) The value of a structure or union object is never a trap
+
+
+     49) 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.
+     50) 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.
+
+[<a name="#p44" href="p44">page 44</a>] (<a href="#Contents">Contents</a>)
+
+    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.52) 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.
+9   Loads and stores of objects with                            atomic       types     are     done      with
+    memory_order_seq_cst semantics.
+    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>), order and consistency (<a href="#7.17.3">7.17.3</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.53)
+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;
+    signed char shall not have any padding bits. 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
+
+    51) Thus, for example, structure assignment need not copy any padding bits.
+    52) 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.
+    53) 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="#p45" href="p45">page 45</a>] (<a href="#Contents">Contents</a>)
+
+    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 M ) (two's complement);
+    -- the sign bit has the value -(2 M - 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 operands that produce such a value;
+    -- the +, -, *, /, and % operators where one operand 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 operands that would produce such a value is undefined.
+5   The values of any padding bits are unspecified.54) 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
+    for signed integer types the width is one greater than the precision.
+
+
+
+
+    54) 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="#p46" href="p46">page 46</a>] (<a href="#Contents">Contents</a>)
+
+<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.6">6.7.6</a> for declarators.55) 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 completed anywhere within their
+    respective translation units, 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; if one member of the pair is
+    declared with an alignment specifier, the other is declared with an equivalent alignment
+    specifier; and if one member of the pair is declared with a name, the other 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 both types are array types, the following rules are applied:
+          o If one type is an array of known constant size, the composite type is an array of
+             that size.
+          o Otherwise, if one type is a variable length array whose size is specified by an
+             expression that is not evaluated, the behavior is undefined.
+          o Otherwise, if one type is a variable length array whose size is specified, the
+             composite type is a variable length array of that size.
+          o Otherwise, if one type is a variable length array of unspecified size, the composite
+             type is a variable length array of unspecified size.
+          o Otherwise, both types are arrays of unknown size and the composite type is an
+             array of unknown size.
+        The element type of the composite type is the composite type of the two element
+        types.
+    -- 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.
+
+
+    55) Two types need not be identical to be compatible.
+
+[<a name="#p47" href="p47">page 47</a>] (<a href="#Contents">Contents</a>)
+
+    -- 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,56) if the prior declaration specifies internal or
+    external linkage, the type of the identifier at the later declaration becomes the composite
+    type.
+    Forward references: array declarators (<a href="#6.7.6.2">6.7.6.2</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="6.2.8" href="#6.2.8"><b>    6.2.8 Alignment of objects</b></a>
+1   Complete object types have alignment requirements which place restrictions on the
+    addresses at which objects of that type may be allocated. An alignment is an
+    implementation-defined integer value representing the number of bytes between
+    successive addresses at which a given object can be allocated. An object type imposes an
+    alignment requirement on every object of that type: stricter alignment can be requested
+    using the _Alignas keyword.
+2   A fundamental alignment is represented by an alignment less than or equal to the greatest
+    alignment supported by the implementation in all contexts, which is equal to
+    alignof(max_align_t).
+3   An extended alignment is represented by an alignment greater than
+    alignof(max_align_t). It is implementation-defined whether any extended
+    alignments are supported and the contexts in which they are supported. A type having an
+    extended alignment requirement is an over-aligned type.57)
+4   Alignments are represented as values of the type size_t. Valid alignments include only
+    those values returned by an alignof expression for fundamental types, plus an
+    additional implementation-defined set of values, which may be empty. Every valid
+    alignment value shall be a nonnegative integral power of two.
+
+
+    56) As specified in <a href="#6.2.1">6.2.1</a>, the later declaration might hide the prior declaration.
+    57) Every over-aligned type is, or contains, a structure or union type with a member to which an extended
+        alignment has been applied.
+
+[<a name="#p48" href="p48">page 48</a>] (<a href="#Contents">Contents</a>)
+
+5   Alignments have an order from weaker to stronger or stricter alignments. Stricter
+    alignments have larger alignment values. An address that satisfies an alignment
+    requirement also satisfies any weaker valid alignment requirement.
+6   The alignment requirement of a complete type can be queried using an alignof
+    expression. The types char, signed char, and unsigned char shall have the
+    weakest alignment requirement.
+7   Comparing alignments is meaningful and provides the obvious results:
+    -- Two alignments are equal when their numeric values are equal.
+    -- Two alignments are different when their numeric values are not equal.
+    -- When an alignment is larger than another it represents a stricter alignment.
+
+
+
+
+[<a name="#p49" href="p49">page 49</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="#p50" href="p50">page 50</a>] (<a href="#Contents">Contents</a>)
+
+    -- An object or expression with an integer type (other than int or unsigned int)
+      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 (as restricted by the width, for a
+    bit-field), the value is converted to an int; otherwise, it is converted to an unsigned
+    int. These are called the integer promotions.58) 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.59)
+<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.60)
+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.61)
+
+
+    58) 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.
+    59) NaNs do not compare equal to 0 and thus convert to 1.
+    60) The rules describe arithmetic on the mathematical value, not the value of a given type of expression.
+    61) 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="#p51" href="p51">page 51</a>] (<a href="#Contents">Contents</a>)
+
+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
+    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. Results of some implicit
+    conversions (<a href="#6.3.1.8">6.3.1.8</a>, <a href="#6.8.6.4">6.8.6.4</a>) may be represented in greater precision and range than that
+    required by the new type.
+<a name="6.3.1.5" href="#6.3.1.5"><b>    6.3.1.5 Real floating types</b></a>
+1   When a value of real floating 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
+    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. Results of some implicit
+    conversions (<a href="#6.3.1.8">6.3.1.8</a>, <a href="#6.8.6.4">6.8.6.4</a>) may be represented in greater precision and range than that
+    required by the new type.
+<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
+
+[<a name="#p52" href="p52">page 52</a>] (<a href="#Contents">Contents</a>)
+
+           corresponding real type is long double.
+           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.62)
+           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.63)
+
+
+
+
+    62) 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).
+    63) The cast and assignment operators are still required to remove extra range and precision.
+
+[<a name="#p53" href="p53">page 53</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 other than void) that potentially
+    designates an object;64) 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); this is called lvalue conversion. If the lvalue has
+    qualified type, the value has the unqualified version of the type of the lvalue; additionally,
+    if the lvalue has atomic type, the value has the non-atomic 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. If the lvalue designates an
+    object of automatic storage duration that could have been declared with the register
+    storage class (never had its address taken), and that object is uninitialized (not declared
+    with an initializer and no assignment to it has been performed prior to use), 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 operator65) or the unary &amp; operator, a function designator with
+    type ''function returning type'' is converted to an expression that has type ''pointer to
+
+
+    64) 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.
+    65) 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="#p54" href="p54">page 54</a>] (<a href="#Contents">Contents</a>)
+
+    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.19">&lt;stddef.h&gt;</a> (<a href="#7.19">7.19</a>), initialization (<a href="#6.7.9">6.7.9</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>).
+    <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 object type. A pointer to
+    any 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.66) 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.67)
+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.
+
+
+
+
+    66) The macro NULL is defined in <a href="#7.19">&lt;stddef.h&gt;</a> (and other headers) as a null pointer constant; see <a href="#7.19">7.19</a>.
+    67) 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.
+
+[<a name="#p55" href="p55">page 55</a>] (<a href="#Contents">Contents</a>)
+
+7   A pointer to an object type may be converted to a pointer to a different object type. If the
+    resulting pointer is not correctly aligned68) for the referenced 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 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 referenced 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.20.1.4">7.20.1.4</a>), simple assignment (<a href="#6.5.16.1">6.5.16.1</a>).
+
+
+
+
+    68) 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="#p56" href="p56">page 56</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.69) 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.
+
+
+
+    69) 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="#p57" href="p57">page 57</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
+                   alignof                         goto                         union
+                   auto                            if                           unsigned
+                   break                           inline                       void
+                   case                            int                          volatile
+                   char                            long                         while
+                   const                           register                     _Alignas
+                   continue                        restrict                     _Atomic
+                   default                         return                       _Bool
+                   do                              short                        _Complex
+                   double                          signed                       _Generic
+                   else                            sizeof                       _Imaginary
+                   enum                            static                       _Noreturn
+                   extern                          struct                       _Static_assert
+                   float                           switch                       _Thread_local
+                   for                             typedef
+    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
+[<a name="#p58" href="p58">page 58</a>] (<a href="#Contents">Contents</a>)
+
+    specifying imaginary types.70)
+<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 D.1.71) The initial character
+    shall not be a universal character name designating a character whose encoding falls into
+    one of the ranges specified in <a href="#D.2">D.2</a>. 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.
+
+
+
+    70) One possible specification for imaginary types appears in <a href="#G">annex G</a>.
+    71) 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="#p59" href="p59">page 59</a>] (<a href="#Contents">Contents</a>)
+
+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.
+    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.72)
+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.21">&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>).
+
+
+
+
+    72) 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="#p60" href="p60">page 60</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.73)
+    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.74) Similarly, the universal
+    character name \unnnn designates the character whose four-digit short identifier is nnnn
+    (and whose eight-digit short identifier is 0000nnnn).
+
+
+
+
+    73) 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).
+
+    74) Short identifiers for characters were first specified in ISO/IEC 10646-1/AMD9:1997.
+
+[<a name="#p61" href="p61">page 61</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="#p62" href="p62">page 62</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="#p63" href="p63">page 63</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="#p64" href="p64">page 64</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="#p65" href="p65">page 65</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. All floating constants of the same source form75) shall
+    convert to the same internal format with the same value.
+    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.76)
+
+    75) <a href="#1.23">1.23</a>, 1.230, 123e-2, 123e-02, and 1.23L are all different source forms and thus need not
+        convert to the same internal format and value.
+    76) The specification for the library functions recommends more accurate conversion than required for
+        floating constants (see <a href="#7.22.1.3">7.22.1.3</a>).
+
+[<a name="#p66" href="p66">page 66</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 '
+                    u' c-char-sequence '
+                    U' 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
+
+
+
+
+[<a name="#p67" href="p67">page 67</a>] (<a href="#Contents">Contents</a>)
+
+           hexadecimal-escape-sequence:
+                 \x hexadecimal-digit
+                 hexadecimal-escape-sequence hexadecimal-digit
+    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, u, or U. 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.77)
+
+
+
+[<a name="#p68" href="p68">page 68</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 corresponding type:
+            Prefix      Corresponding Type
+            none       unsigned char
+            L          the unsigned type corresponding to wchar_t
+            u          char16_t
+            U          char32_t
+     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 prefixed by the letter L has type wchar_t, an integer type
+     defined in the <a href="#7.19">&lt;stddef.h&gt;</a> header; a wide character constant prefixed by the letter u or
+     U has type char16_t or char32_t, respectively, unsigned integer types defined in the
+     <a href="#7.27">&lt;uchar.h&gt;</a> header. The value of a wide character constant containing a single
+     multibyte character that maps to a single member of the extended execution character set
+     is the wide character corresponding to that multibyte character, as defined by the
+     mbtowc, mbrtoc16, or mbrtoc32 function as appropriate for its type, with an
+     implementation-defined current locale. The value of a wide character constant containing
+     more than one multibyte character or a single multibyte character that maps to multiple
+     members of the extended execution character set, 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.
+
+
+
+
+     77) 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="#p69" href="p69">page 69</a>] (<a href="#Contents">Contents</a>)
+
+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.19">&lt;stddef.h&gt;</a> (<a href="#7.19">7.19</a>), the mbtowc function
+     (<a href="#7.22.7.2">7.22.7.2</a>), Unicode utilities <a href="#7.27">&lt;uchar.h&gt;</a> (<a href="#7.27">7.27</a>).
+<a name="6.4.5" href="#6.4.5"><b>     6.4.5 String literals</b></a>
+     Syntax
+1             string-literal:
+                      encoding-prefixopt " s-char-sequenceopt "
+              encoding-prefix:
+                     u8
+                     u
+                     U
+                     L
+              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
+     Constraints
+2    A sequence of adjacent string literal tokens shall not include both a wide string literal and
+     a UTF-8 string literal.
+     Description
+3    A character string literal is a sequence of zero or more multibyte characters enclosed in
+     double-quotes, as in "xyz". A UTF-8 string literal is the same, except prefixed by u8.
+     A wide string literal is the same, except prefixed by the letter L, u, or U.
+4    The same considerations apply to each element of the sequence in a string literal as if it
+     were in an integer character constant (for a character or UTF-8 string literal) or a wide
+     character constant (for a wide string literal), except that the single-quote ' is
+     representable either by itself or by the escape sequence \', but the double-quote " shall
+[<a name="#p70" href="p70">page 70</a>] (<a href="#Contents">Contents</a>)
+
+    be represented by the escape sequence \".
+    Semantics
+5   In translation phase 6, the multibyte character sequences specified by any sequence of
+    adjacent character and identically-prefixed string literal tokens are concatenated into a
+    single multibyte character sequence. If any of the tokens has an encoding prefix, the
+    resulting multibyte character sequence is treated as having the same prefix; otherwise, it
+    is treated as a character string literal. Whether differently-prefixed wide string literal
+    tokens can be concatenated and, if so, the treatment of the resulting multibyte character
+    sequence are implementation-defined.
+6   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.78) 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 UTF-8 string literals, the array elements have type char, and are
+    initialized with the characters of the multibyte character sequence, as encoded in UTF-8.
+    For wide string literals prefixed by the letter L, the array elements have type wchar_t
+    and are initialized with the sequence of wide characters corresponding to the multibyte
+    character sequence, as defined by the mbstowcs function with an implementation-
+    defined current locale. For wide string literals prefixed by the letter u or U, the array
+    elements have type char16_t or char32_t, respectively, and are initialized with the
+    sequence of wide characters corresponding to the multibyte character sequence, as
+    defined by successive calls to the mbrtoc16, or mbrtoc32 function as appropriate for
+    its type, 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.
+7   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.
+8   EXAMPLE 1      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.
+
+9   EXAMPLE 2      Each of the sequences of adjacent string literal tokens
+
+
+
+    78) A 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="#p71" href="p71">page 71</a>] (<a href="#Contents">Contents</a>)
+
+             "a" "b" L"c"
+             "a" L"b" "c"
+             L"a" "b" L"c"
+             L"a" L"b" L"c"
+    is equivalent to the string literal
+             L"abc"
+    Likewise, each of the sequences
+             "a" "b" u"c"
+             "a" u"b" "c"
+             u"a" "b" u"c"
+             u"a" u"b" u"c"
+    is equivalent to
+             u"abc"
+
+    Forward references: common definitions <a href="#7.19">&lt;stddef.h&gt;</a> (<a href="#7.19">7.19</a>), the mbstowcs
+    function (<a href="#7.22.8.1">7.22.8.1</a>), Unicode utilities <a href="#7.27">&lt;uchar.h&gt;</a> (<a href="#7.27">7.27</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="#p72" href="p72">page 72</a>] (<a href="#Contents">Contents</a>)
+
+3   In all aspects of the language, the six tokens79)
+             &lt;:    :&gt;      &lt;%    %&gt;     %:     %:%:
+    behave, respectively, the same as the six tokens
+             [     ]       {     }      #      ##
+    except for their spelling.80)
+    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
+
+
+
+
+    79) These tokens are sometimes called ''digraphs''.
+    80) 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="#p73" href="p73">page 73</a>] (<a href="#Contents">Contents</a>)
+
+    sequence between the " delimiters, the behavior is undefined.81) Header name
+    preprocessing tokens are recognized only within #include preprocessing directives and
+    in implementation-defined locations within #pragma directives.82)
+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.
+
+
+    81) Thus, sequences of characters that resemble escape sequences cause undefined behavior.
+    82) 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="#p74" href="p74">page 74</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.83)
+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;
+
+
+
+
+    83) Thus, /* ... */ comments do not nest.
+
+[<a name="#p75" href="p75">page 75</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. The value computations of the operands of an operator
+    are sequenced before the value computation of the result of the operator.
+2   If a side effect on a scalar object is unsequenced relative to either a different side effect
+    on the same scalar object or a value computation using the value of the same scalar
+    object, the behavior is undefined. If there are multiple allowable orderings of the
+    subexpressions of an expression, the behavior is undefined if such an unsequenced side
+    effect occurs in any of the orderings.84)
+3   The grouping of operators and operands is indicated by the syntax.85) Except as specified
+    later, side effects and value computations of subexpressions are unsequenced.86)         *
+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.
+
+
+
+    84) This paragraph renders undefined statement expressions such as
+                  i = ++i + 1;
+                  a[i++] = i;
+         while allowing
+                  i = i + 1;
+                  a[i] = i;
+
+    85) 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.
+    86) In an expression that is evaluated more than once during the execution of a program, unsequenced and
+        indeterminately sequenced evaluations of its subexpressions need not be performed consistently in
+        different evaluations.
+
+[<a name="#p76" href="p76">page 76</a>] (<a href="#Contents">Contents</a>)
+
+6   The effective type of an object for an access to its stored value is the declared type of the
+    object, if any.87) 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
+    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:88)
+    -- 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 a single
+    operation, thereby omitting rounding errors implied by the source code and the
+    expression evaluation method.89) 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.90)
+    Forward references: the FP_CONTRACT pragma (<a href="#7.12.2">7.12.2</a>), copying functions (<a href="#7.23.2">7.23.2</a>).
+
+
+    87) Allocated objects have no declared type.
+    88) The intent of this list is to specify those circumstances in which an object may or may not be aliased.
+    89) The intermediate operations in the contracted expression are evaluated as if to infinite precision and
+        range, while the final operation is rounded to the format determined by the expression evaluation
+        method. A contracted expression might also omit the raising of floating-point exceptions.
+    90) 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="#p77" href="p77">page 77</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 )
+                    generic-selection
+    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).91)
+3   A constant is a primary expression. Its type depends on its form and value, as detailed in
+<a name="6.4.4" href="#6.4.4"><b>    6.4.4.</b></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.1.1" href="#6.5.1.1"><b>    6.5.1.1 Generic selection</b></a>
+    Syntax
+1            generic-selection:
+                    _Generic ( assignment-expression , generic-assoc-list )
+             generic-assoc-list:
+                    generic-association
+                    generic-assoc-list , generic-association
+             generic-association:
+                    type-name : assignment-expression
+                    default : assignment-expression
+    Constraints
+2   A generic selection shall have no more than one default generic association. The type
+    name in a generic association shall specify a complete object type other than a variably
+
+    91) Thus, an undeclared identifier is a violation of the syntax.
+
+[<a name="#p78" href="p78">page 78</a>] (<a href="#Contents">Contents</a>)
+
+    modified type. No two generic associations in the same generic selection shall specify
+    compatible types. The controlling expression of a generic selection shall have type
+    compatible with at most one of the types named in its generic association list. If a
+    generic selection has no default generic association, its controlling expression shall
+    have type compatible with exactly one of the types named in its generic association list.
+    Semantics
+3   The controlling expression of a generic selection is not evaluated. If a generic selection
+    has a generic association with a type name that is compatible with the type of the
+    controlling expression, then the result expression of the generic selection is the
+    expression in that generic association. Otherwise, the result expression of the generic
+    selection is the expression in the default generic association. None of the expressions
+    from any other generic association of the generic selection is evaluated.
+4   The type and value of a generic selection are identical to those of its result expression. It
+    is an lvalue, a function designator, or a void expression if its result expression is,
+    respectively, an lvalue, a function designator, or a void expression.
+5   EXAMPLE      The cbrt type-generic macro could be implemented as follows:
+             #define cbrt(X) _Generic((X),                                      \
+                                     long double: cbrtl,                        \
+                                     default: cbrt,                             \
+                                     float: cbrtf                               \
+                                     )(X)
+
+<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 , }
+             argument-expression-list:
+                   assignment-expression
+                   argument-expression-list , assignment-expression
+
+
+
+
+[<a name="#p79" href="p79">page 79</a>] (<a href="#Contents">Contents</a>)
+
+<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 complete 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 referenced (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.6.2">6.7.6.2</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 function92) shall have type pointer to function
+    returning void or returning a complete 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
+
+
+    92) Most often, this is the result of converting an identifier that is a function designator.
+
+[<a name="#p80" href="p80">page 80</a>] (<a href="#Contents">Contents</a>)
+
+    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 complete 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.93)
+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.         *
+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:
+    -- 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.
+
+
+
+    93) 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="#p81" href="p81">page 81</a>] (<a href="#Contents">Contents</a>)
+
+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   There is a sequence point after the evaluations of the function designator and the actual
+     arguments but before the actual call. Every evaluation in the calling function (including
+     other function calls) that is not otherwise specifically sequenced before or after the
+     execution of the body of the called function is indeterminately sequenced with respect to
+     the execution of the called function.94)
+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.6.3">6.7.6.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 an atomic, 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 atomic, qualified, or
+     unqualified structure'' or ''pointer to atomic, qualified, or unqualified union'', and the
+     second operand shall name a member of the type pointed to.
+     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,95) 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.
+
+     94) In other words, function executions do not ''interleave'' with each other.
+     95) If the member used to read 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.
+
+[<a name="#p82" href="p82">page 82</a>] (<a href="#Contents">Contents</a>)
+
+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.96) 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   Accessing a member of an atomic structure or union object results in undefined
+    behavior.97)
+6   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 completed 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.
+7   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.
+
+8   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
+
+
+
+
+    96) 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.
+    97) For example, a data race would occur if access to the entire structure or union in one thread conflicts
+        with access to a member from another thread, where at least one access is a modification. Members
+        can be safely accessed using a non-atomic object which is assigned to or from the atomic object.
+
+[<a name="#p83" href="p83">page 83</a>] (<a href="#Contents">Contents</a>)
+
+9   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="#p84" href="p84">page 84</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 atomic, 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. As a side effect, the
+    value of the operand object 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 value computation of the result is sequenced before the side effect of
+    updating the stored value of the operand. With respect to an indeterminately-sequenced
+    function call, the operation of postfix ++ is a single evaluation. Postfix ++ on an object
+    with atomic type is a read-modify-write operation with memory_order_seq_cst
+    memory order semantics.98)
+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 a complete object type or an array of unknown size, but not a
+    variable length array type.
+2   All the constraints for initializer lists in <a href="#6.7.9">6.7.9</a> also apply to compound literals.
+    Semantics
+3   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.99)
+
+
+    98) Where a pointer to an atomic object can be formed, this is equivalent to the following code sequence
+        where T is the type of E:
+                 T tmp;
+                 T result = E;
+                 do {
+                        tmp = result + 1;
+                 } while (!atomic_compare_exchange_strong(&amp;E, &amp;result, tmp));
+         with result being the result of the operation.
+
+[<a name="#p85" href="p85">page 85</a>] (<a href="#Contents">Contents</a>)
+
+4    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.9">6.7.9</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.
+5    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.
+6    All the semantic rules for initializer lists in <a href="#6.7.9">6.7.9</a> also apply to compound literals.100)
+7    String literals, and compound literals with const-qualified types, need not designate
+     distinct objects.101)
+8    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.
+
+9    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.
+
+10   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:
+
+
+
+     99) 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.
+     100) For example, subobjects without explicit initializers are initialized to zero.
+     101) This allows implementations to share storage for string literals and constant compound literals with
+          the same or overlapping representations.
+
+[<a name="#p86" href="p86">page 86</a>] (<a href="#Contents">Contents</a>)
+
+              drawline(&amp;(struct point){.x=1, .y=1},
+                    &amp;(struct point){.x=3, .y=4});
+
+11   EXAMPLE 4        A read-only compound literal can be specified through constructions like:
+              (const float []){1e0, 1e1, 1e2, 1e3, 1e4, 1e5, 1e6}
+
+12   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.
+
+13   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.
+
+14   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);
+
+15   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.
+16   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.7">6.7.7</a>), initialization (<a href="#6.7.9">6.7.9</a>).
+
+
+
+
+[<a name="#p87" href="p87">page 87</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 )
+                    alignof ( 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 atomic, 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
+
+[<a name="#p88" href="p88">page 88</a>] (<a href="#Contents">Contents</a>)
+
+    lvalue. Similarly, if the operand is the result of a [] operator, neither the &amp; operator nor
+    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.102)
+    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).
+
+
+
+    102) 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="#p89" href="p89">page 89</a>] (<a href="#Contents">Contents</a>)
+
+<a name="6.5.3.4" href="#6.5.3.4"><b>    6.5.3.4 The sizeof and alignof operators</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. The alignof operator shall not be applied to a function
+    type or an incomplete type.
+    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   The alignof operator yields the alignment requirement of its operand type. The result
+    is an integer constant. When applied to an array type, the result is the alignment
+    requirement of the element type.
+4   When sizeof is 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.103) 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.
+5   The value of the result of both operators is implementation-defined, and its type (an
+    unsigned integer type) is size_t, defined in <a href="#7.19">&lt;stddef.h&gt;</a> (and other headers).
+6   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.
+
+7   EXAMPLE 2      Another use of the sizeof operator is to compute the number of elements in an array:
+            sizeof array / sizeof array[0]
+
+8   EXAMPLE 3      In this example, the size of a variable length array is computed and returned from a
+    function:
+            #include <a href="#7.19">&lt;stddef.h&gt;</a>
+
+
+
+    103) 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="#p90" href="p90">page 90</a>] (<a href="#Contents">Contents</a>)
+
+             size_t fsize3(int n)
+             {
+                   char b[n+3];                  // variable length array
+                   return sizeof b;              // execution time sizeof
+             }
+             int main()
+             {
+                   size_t size;
+                   size = fsize3(10); // fsize3 returns 13
+                   return 0;
+             }
+
+    Forward references: common definitions <a href="#7.19">&lt;stddef.h&gt;</a> (<a href="#7.19">7.19</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.7">6.7.7</a>), array declarators (<a href="#6.7.6.2">6.7.6.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 atomic, 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.
+4   A pointer type shall not be converted to any floating type. A floating type shall not be
+    converted to any pointer type.
+    Semantics
+5   Preceding an expression by a parenthesized type name converts the value of the
+    expression to the named type. This construction is called a cast.104) A cast that specifies
+    no conversion has no effect on the type or value of an expression.
+6   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 and removes any extra range and
+    precision.
+    Forward references: equality operators (<a href="#6.5.9">6.5.9</a>), function declarators (including
+    prototypes) (<a href="#6.7.6.3">6.7.6.3</a>), simple assignment (<a href="#6.5.16.1">6.5.16.1</a>), type names (<a href="#6.7.7">6.7.7</a>).
+
+    104) 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="#p91" href="p91">page 91</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.105) If the quotient a/b is representable, the expression
+    (a/b)*b + a%b shall equal a; otherwise, the behavior of both a/b and a%b is
+    undefined.
+<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 a complete object type and the other shall have integer type. (Incrementing is
+    equivalent to adding 1.)
+3   For subtraction, one of the following shall hold:
+
+
+
+
+    105) This is often called ''truncation toward zero''.
+
+[<a name="#p92" href="p92">page 92</a>] (<a href="#Contents">Contents</a>)
+
+    -- both operands have arithmetic type;
+    -- both operands are pointers to qualified or unqualified versions of compatible complete
+      object types; or
+    -- the left operand is a pointer to a complete 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.19">&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
+
+[<a name="#p93" href="p93">page 93</a>] (<a href="#Contents">Contents</a>)
+
+     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
+     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.106)
+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.6.2">6.7.6.2</a>), common definitions <a href="#7.19">&lt;stddef.h&gt;</a>
+     (<a href="#7.19">7.19</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
+
+     106) 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="#p94" href="p94">page 94</a>] (<a href="#Contents">Contents</a>)
+
+    greater than or equal to the width of the promoted left operand, the behavior is undefined.
+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; or                                                            *
+    -- both operands are pointers to qualified or unqualified versions of compatible object
+      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 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
+    values compare greater than pointers to elements of the same array with lower subscript
+
+[<a name="#p95" href="p95">page 95</a>] (<a href="#Contents">Contents</a>)
+
+    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.107) 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 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.108) 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.
+
+
+
+    107) 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''.
+    108) 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="#p96" href="p96">page 96</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 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.109)
+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).
+
+
+
+
+    109) 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="#p97" href="p97">page 97</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="#p98" href="p98">page 98</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;
+    if the second operand is evaluated, there is a sequence point between the evaluations of
+    the first and second operands. 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; if the
+    second operand is evaluated, there is a sequence point between the evaluations of the first
+    and second operands. If the first operand compares unequal to 0, the second operand is
+    not evaluated.
+
+
+
+
+[<a name="#p99" href="p99">page 99</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 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 between its evaluation and the
+    evaluation of the second or third operand (whichever is evaluated). 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.110)                        *
+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 referenced 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
+    pointer to an appropriately qualified version of void.
+
+    110) A conditional expression does not yield an lvalue.
+
+[<a name="#p100" href="p100">page 100</a>] (<a href="#Contents">Contents</a>)
+
+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,111) but is not
+    an lvalue. The type of an assignment expression is the type the left operand would have
+    after lvalue conversion. The side effect of updating the stored value of the left operand is
+    sequenced after the value computations of the left and right operands. The evaluations of
+    the operands are unsequenced.
+
+
+
+
+    111) The implementation is permitted to read the object to determine the value but is not required to, even
+         when the object has volatile-qualified type.
+
+[<a name="#p101" href="p101">page 101</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:112)
+    -- the left operand has atomic, qualified, or unqualified arithmetic type, and the right has
+      arithmetic type;
+    -- the left operand has an atomic, qualified, or unqualified version of a structure or union
+      type compatible with the type of the right;
+    -- the left operand has atomic, qualified, or unqualified pointer type, and (considering
+      the type the left operand would have after lvalue conversion) 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;
+    -- the left operand has atomic, qualified, or unqualified pointer type, and (considering
+      the type the left operand would have after lvalue conversion) one operand is a pointer
+      to an object 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 an atomic, qualified, or unqualified pointer, and the right is a null
+      pointer constant; or
+    -- the left operand has type atomic, qualified, or unqualified _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
+
+
+
+
+    112) 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="#p102" href="p102">page 102</a>] (<a href="#Contents">Contents</a>)
+
+            int f(void);
+            char c;
+            /* ... */
+            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
+    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 an atomic, qualified, or
+    unqualified pointer to a complete object type, and the right shall have integer type; or the
+    left operand shall have atomic, qualified, or unqualified arithmetic type, and the right
+    shall have arithmetic type.
+2   For the other operators, the left operand shall have atomic, qualified, or unqualified
+    arithmetic type, and (considering the type the left operand would have after lvalue
+    conversion) 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 is equivalent to the simple assignment
+    expression E1 = E1 op (E2), except that the lvalue E1 is evaluated only once, and with
+    respect to an indeterminately-sequenced function call, the operation of a compound
+[<a name="#p103" href="p103">page 103</a>] (<a href="#Contents">Contents</a>)
+
+    assignment is a single evaluation. If E1 has an atomic type, compound assignment is a
+    read-modify-write operation with memory_order_seq_cst memory order
+    semantics.113)
+<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 between its evaluation and that of the right operand. Then the right
+    operand is evaluated; the result has its type and value.114)                        *
+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.9">6.7.9</a>).
+
+
+
+
+    113) Where a pointer to an atomic object can be formed, this is equivalent to the following code sequence
+         where T is the type of E1:
+                  T tmp = E1;
+                  T result;
+                  do {
+                        result = tmp op (E2);
+                  } while (!atomic_compare_exchange_strong(&amp;E1, &amp;tmp, result));
+          with result being the result of the operation.
+    114) A comma operator does not yield an lvalue.
+
+[<a name="#p104" href="p104">page 104</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.115)
+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.116)
+6   An integer constant expression117) 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,
+
+
+
+    115) The operand of a sizeof operator is usually not evaluated (<a href="#6.5.3.4">6.5.3.4</a>).
+    116) The use of evaluation formats as characterized by FLT_EVAL_METHOD also applies to evaluation in
+         the translation environment.
+    117) An integer constant expression is required in a number of contexts such as the size of a bit-field
+         member of a structure, the value of an enumeration constant, and the size of a non-variable length
+         array. 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="#p105" href="p105">page 105</a>] (<a href="#Contents">Contents</a>)
+
+     -- a null pointer constant,
+     -- an address constant, or
+     -- an address constant for a complete 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.118)
+     Forward references: array declarators (<a href="#6.7.6.2">6.7.6.2</a>), initialization (<a href="#6.7.9">6.7.9</a>).
+
+
+
+
+     118) Thus, in the following initialization,
+                    static int i = 2 || 1 / 0;
+           the expression is a valid integer constant expression with value one.
+
+[<a name="#p106" href="p106">page 106</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 ;
+                    static_assert-declaration
+             declaration-specifiers:
+                    storage-class-specifier declaration-specifiersopt
+                    type-specifier declaration-specifiersopt
+                    type-qualifier declaration-specifiersopt
+                    function-specifier declaration-specifiersopt
+                    alignment-specifier declaration-specifiersopt
+             init-declarator-list:
+                     init-declarator
+                     init-declarator-list , init-declarator
+             init-declarator:
+                     declarator
+                     declarator = initializer
+    Constraints
+2   A declaration other than a static_assert 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
+    that a typedef name can be redefined to denote the same type as it currently does and tags
+    may be redeclared 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;119)
+
+
+
+    119) Function definitions have a different syntax, described in <a href="#6.9.1">6.9.1</a>.
+
+[<a name="#p107" href="p107">page 107</a>] (<a href="#Contents">Contents</a>)
+
+    -- 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
+    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.6.3">6.7.6.3</a>) that is required to be complete.
+    Forward references: declarators (<a href="#6.7.6">6.7.6</a>), enumeration specifiers (<a href="#6.7.2.2">6.7.2.2</a>), initialization
+    (<a href="#6.7.9">6.7.9</a>), type names (<a href="#6.7.7">6.7.7</a>), type qualifiers (<a href="#6.7.3">6.7.3</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
+                    _Thread_local
+                    auto
+                    register
+    Constraints
+2   At most, one storage-class specifier may be given in the declaration specifiers in a
+    declaration, except that _Thread_local may appear with static or extern.120)
+3   In the declaration of an object with block scope, if the declaration specifiers include
+    _Thread_local, they shall also include either static or extern. If
+    _Thread_local appears in any declaration of an object, it shall be present in every
+    declaration of that object.
+    Semantics
+4   The typedef specifier is called a ''storage-class specifier'' for syntactic convenience
+    only; it is discussed in <a href="#6.7.8">6.7.8</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>.
+
+
+
+    120) See ''future language directions'' (<a href="#6.11.5">6.11.5</a>).
+
+[<a name="#p108" href="p108">page 108</a>] (<a href="#Contents">Contents</a>)
+
+5   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.121)
+6   The declaration of an identifier for a function that has block scope shall have no explicit
+    storage-class specifier other than extern.
+7   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.8">6.7.8</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
+                    atomic-type-specifier
+                    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
+
+
+    121) 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="#p109" href="p109">page 109</a>] (<a href="#Contents">Contents</a>)
+
+    type specifiers shall be one of the following multisets (delimited by commas, when there
+    is more than one multiset per item); 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
+    -- 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
+    -- atomic type specifier
+    -- struct or union specifier
+    -- enum specifier
+    -- typedef name
+3   The type specifier _Complex shall not be used if the implementation does not support
+    complex types (see <a href="#6.10.8.3">6.10.8.3</a>).
+
+
+
+
+[<a name="#p110" href="p110">page 110</a>] (<a href="#Contents">Contents</a>)
+
+    Semantics
+4   Specifiers for structures, unions, enumerations, and atomic types are discussed in <a href="#6.7.2.1">6.7.2.1</a>
+    through <a href="#6.7.2.4">6.7.2.4</a>. Declarations of typedef names are discussed in <a href="#6.7.8">6.7.8</a>. The
+    characteristics of the other types are discussed in <a href="#6.2.5">6.2.5</a>.
+5   Each of the comma-separated multisets 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: atomic type specifiers (<a href="#6.7.2.4">6.7.2.4</a>), 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.8">6.7.8</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-listopt ;
+                     static_assert-declaration
+             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 struct-declaration that does not declare an anonymous structure or anonymous union
+    shall contain a struct-declarator-list.
+
+
+[<a name="#p111" href="p111">page 111</a>] (<a href="#Contents">Contents</a>)
+
+3    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.
+4    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.122) If the value is
+     zero, the declaration shall have no declarator.
+5    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. It is
+     implementation-defined whether atomic types are permitted.
+     Semantics
+6    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.
+7    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.
+8    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, no anonymous structures, and no anonymous unions, the behavior is undefined.
+     The type is incomplete until immediately after the } that terminates the list, and complete
+     thereafter.
+9    A member of a structure or union may have any complete object type other than a
+     variably modified type.123) 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;124) its width is preceded by a colon.
+10   A bit-field is interpreted as having a signed or unsigned integer type consisting of the
+     specified number of bits.125) If the value 0 or 1 is stored into a nonzero-width bit-field of
+
+     122) While the number of bits in a _Bool object is at least CHAR_BIT, the width (number of sign and
+          value bits) of a _Bool may be just 1 bit.
+     123) A structure or union cannot 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>.
+     124) 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.
+
+[<a name="#p112" href="p112">page 112</a>] (<a href="#Contents">Contents</a>)
+
+     type _Bool, the value of the bit-field shall compare equal to the value stored; a _Bool
+     bit-field has the semantics of a _Bool.
+11   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.
+12   A bit-field declaration with no declarator, but only a colon and a width, indicates an
+     unnamed bit-field.126) 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.
+13   An unnamed member of structure type with no tag is called an anonymous structure; an
+     unnamed member of union type with no tag is called an anonymous union. The members
+     of an anonymous structure or union are considered to be members of the containing
+     structure or union. This applies recursively if the containing structure or union is also
+     anonymous.
+14   Each non-bit-field member of a structure or union object is aligned in an implementation-
+     defined manner appropriate to its type.
+15   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.
+16   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.
+17   There may be unnamed padding at the end of a structure or union.
+18   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,
+
+
+     125) 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.
+     126) An unnamed bit-field structure member is useful for padding to conform to externally imposed
+          layouts.
+
+[<a name="#p113" href="p113">page 113</a>] (<a href="#Contents">Contents</a>)
+
+     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.
+19   EXAMPLE 1       The following illustrates anonymous structures and unions:
+              struct v {
+                    union {      // anonymous union
+                           struct { int i, j; };    // anonymous structure
+                           struct { long k, l; } w;
+                    };
+                    int m;
+              } v1;
+              v1.i = 2;   // valid
+              v1.k = 3;   // invalid: inner structure is not anonymous
+              v1.w.k = 5; // valid
+
+20   EXAMPLE 2       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).
+21   Following the above declaration:
+              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.
+
+[<a name="#p114" href="p114">page 114</a>] (<a href="#Contents">Contents</a>)
+
+22   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.
+23   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;
+24   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
+25   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: declarators (<a href="#6.7.6">6.7.6</a>), tags (<a href="#6.7.2.3">6.7.2.3</a>).
+
+
+
+
+[<a name="#p115" href="p115">page 115</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.127) 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,128) but shall be
+    capable of representing the values of all the members of the enumeration. The
+    enumerated type is incomplete until immediately after the } that terminates the list of
+    enumerator declarations, and complete thereafter.
+
+
+
+
+    127) 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.
+    128) An implementation may delay the choice of which integer type until all enumeration constants have
+         been seen.
+
+[<a name="#p116" href="p116">page 116</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. Irrespective of whether there is a tag or what
+    other declarations of the type are in the same translation unit, the type is incomplete129)
+    until immediately after 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
+
+
+
+
+    129) 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="#p117" href="p117">page 117</a>] (<a href="#Contents">Contents</a>)
+
+              struct-or-union identifieropt { struct-declaration-list }
+     or
+              enum identifieropt { enumerator-list }
+     or
+              enum identifieropt { enumerator-list , }
+     declares a structure, union, or enumerated type. The list defines the structure content,
+     union content, or enumeration content. If an identifier is provided,130) 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.131)
+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.131)
+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
+
+
+
+
+     130) 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.
+     131) A similar construction with enum does not exist.
+
+[<a name="#p118" href="p118">page 118</a>] (<a href="#Contents">Contents</a>)
+
+              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:
+              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.6">6.7.6</a>), type definitions (<a href="#6.7.8">6.7.8</a>).
+<a name="6.7.2.4" href="#6.7.2.4"><b>     6.7.2.4 Atomic type specifiers</b></a>
+     Syntax
+1             atomic-type-specifier:
+                     _Atomic ( type-name )
+     Constraints
+2    Atomic type specifiers shall not be used if the implementation does not support atomic
+     types (see <a href="#6.10.8.3">6.10.8.3</a>).
+3    The type name in an atomic type specifier shall not refer to an array type, a function type,
+     an atomic type, or a qualified type.
+     Semantics
+4    The properties associated with atomic types are meaningful only for expressions that are
+     lvalues. If the _Atomic keyword is immediately followed by a left parenthesis, it is
+     interpreted as a type specifier (with a type name), not as a type qualifier.
+
+
+
+
+[<a name="#p119" href="p119">page 119</a>] (<a href="#Contents">Contents</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
+                    _Atomic
+    Constraints
+2   Types other than pointer types whose referenced type is an object type shall not be
+    restrict-qualified.
+3   The type modified by the _Atomic qualifier shall not be an array type or a function
+    type.
+    Semantics
+4   The properties associated with qualified types are meaningful only for expressions that
+    are lvalues.132)
+5   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. If other qualifiers appear along with the _Atomic qualifier in a specifier-qualifier-
+    list, the resulting type is the so-qualified atomic type.
+6   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.133)
+7   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
+
+
+
+
+    132) 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.
+    133) 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).
+
+[<a name="#p120" href="p120">page 120</a>] (<a href="#Contents">Contents</a>)
+
+     unknown factors mentioned previously.134) What constitutes an access to an object that
+     has volatile-qualified type is implementation-defined.
+8    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.135) 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).
+9    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.136)
+10   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.
+11   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.
+
+12   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 *''
+
+
+
+     134) 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.
+     135) 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.
+     136) Both of these can occur through the use of typedefs.
+
+[<a name="#p121" href="p121">page 121</a>] (<a href="#Contents">Contents</a>)
+
+13   EXAMPLE 3       The declaration
+              _Atomic volatile int *p;
+     specifies that p has the type ''pointer to volatile atomic int'', a pointer to a volatile-qualified atomic type.
+
+<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.137)
+     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
+     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.
+
+
+     137) 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="#p122" href="p122">page 122</a>] (<a href="#Contents">Contents</a>)
+
+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.
+             {
+                      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
+                      }
+             }
+
+
+
+
+[<a name="#p123" href="p123">page 123</a>] (<a href="#Contents">Contents</a>)
+
+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
+                     _Noreturn
+     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 or thread storage duration, and shall not contain a reference
+     to an identifier with internal linkage.
+4    In a hosted environment, no function specifier(s) shall appear in a declaration of main.
+     Semantics
+5    A function specifier may appear more than once; the behavior is the same as if it
+     appeared only once.
+6    A function declared with an inline function specifier is an inline function. Making a *
+     function an inline function suggests that calls to the function be as fast as possible.138)
+     The extent to which such suggestions are effective is implementation-defined.139)
+
+
+
+
+     138) 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.
+     139) For example, an implementation might never perform inline substitution, or might only perform inline
+          substitutions to calls in the scope of an inline declaration.
+
+[<a name="#p124" href="p124">page 124</a>] (<a href="#Contents">Contents</a>)
+
+7    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
+     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.140)
+8    A function declared with a _Noreturn function specifier shall not return to its caller.
+     Recommended practice
+9    The implementation should produce a diagnostic message for a function declared with a
+     _Noreturn function specifier that appears to be capable of returning to its caller.
+10   EXAMPLE 1 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 (<a href="#9.0">9.0</a> * t) / <a href="#5.0">5.0</a> + 32.0;
+              }
+              inline double cels(double t)
+              {
+                    return (<a href="#5.0">5.0</a> * (t - 32.0)) / <a href="#9.0">9.0</a>;
+              }
+              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);
+              }
+11   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.
+
+12   EXAMPLE 2
+
+
+
+
+     140) 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="#p125" href="p125">page 125</a>] (<a href="#Contents">Contents</a>)
+
+             _Noreturn void f () {
+                   abort(); // ok
+             }
+             _Noreturn void g (int i) { // causes undefined behavior if i &lt;= 0
+                   if (i &gt; 0) abort();
+             }
+
+    Forward references: function definitions (<a href="#6.9.1">6.9.1</a>).
+<a name="6.7.5" href="#6.7.5"><b>    6.7.5 Alignment specifier</b></a>
+    Syntax
+1            alignment-specifier:
+                   _Alignas ( type-name )
+                   _Alignas ( constant-expression )
+    Constraints
+2   An alignment attribute shall not be specified in a declaration of a typedef, or a bit-field, or
+    a function, or a parameter, or an object declared with the register storage-class
+    specifier.
+3   The constant expression shall be an integer constant expression. It shall evaluate to a
+    valid fundamental alignment, or to a valid extended alignment supported by the
+    implementation in the context in which it appears, or to zero.
+4   The combined effect of all alignment attributes in a declaration shall not specify an
+    alignment that is less strict than the alignment that would otherwise be required for the
+    type of the object or member being declared.
+    Semantics
+5   The first form is equivalent to _Alignas(alignof(type-name)).
+6   The alignment requirement of the declared object or member is taken to be the specified
+    alignment. An alignment specification of zero has no effect.141) When multiple
+    alignment specifiers occur in a declaration, the effective alignment requirement is the
+    strictest specified alignment.
+7   If the definition of an object has an alignment specifier, any other declaration of that
+    object shall either specify equivalent alignment or have no alignment specifier. If the
+    definition of an object does not have an alignment specifier, any other declaration of that
+    object shall also have no alignment specifier. If declarations of an object in different
+    translation units have different alignment specifiers, the behavior is undefined.
+
+
+
+    141) An alignment specification of zero also does not affect other alignment specifications in the same
+         declaration.
+
+[<a name="#p126" href="p126">page 126</a>] (<a href="#Contents">Contents</a>)
+
+<a name="6.7.6" href="#6.7.6"><b>    6.7.6 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="#p127" href="p127">page 127</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 void type, either
+    directly or via one or more typedefs.
+    Forward references: array declarators (<a href="#6.7.6.2">6.7.6.2</a>), type definitions (<a href="#6.7.8">6.7.8</a>).
+<a name="6.7.6.1" href="#6.7.6.1"><b>    6.7.6.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="#p128" href="p128">page 128</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.6.2" href="#6.7.6.2"><b>    6.7.6.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   If an identifier is declared as having a variably modified type, it shall be an ordinary
+    identifier (as defined in <a href="#6.2.3">6.2.3</a>), have no linkage, and have either block scope or function
+    prototype scope. If an identifier is declared to be an object with static or thread 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 ''.142)
+    (See <a href="#6.7.6.3">6.7.6.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 or type names with function prototype scope;143)
+
+    142) When several ''array of'' specifications are adjacent, a multidimensional array is declared.
+
+[<a name="#p129" href="p129">page 129</a>] (<a href="#Contents">Contents</a>)
+
+    such arrays are nonetheless complete types. If the size is an integer constant expression
+    and the element 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. (Variable length
+    arrays are a conditional feature that implementations need not support; see <a href="#6.10.8.3">6.10.8.3</a>.)
+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
+             }
+
+
+
+
+    143) Thus, * can be used only in function declarations that are not definitions (see <a href="#6.7.6.3">6.7.6.3</a>).
+
+[<a name="#p130" href="p130">page 130</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 _Thread_local, 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.6.3">6.7.6.3</a>), function definitions (<a href="#6.9.1">6.9.1</a>),
+     initialization (<a href="#6.7.9">6.7.9</a>).
+<a name="6.7.6.3" href="#6.7.6.3"><b>     6.7.6.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
+
+
+
+
+[<a name="#p131" href="p131">page 131</a>] (<a href="#Contents">Contents</a>)
+
+            D( parameter-type-list )
+     or
+            D( identifier-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 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.144)
+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.145)
+
+
+
+     144) The macros defined in the <a href="#7.16">&lt;stdarg.h&gt;</a> header (<a href="#7.16">7.16</a>) may be used to access arguments that
+          correspond to the ellipsis.
+
+[<a name="#p132" href="p132">page 132</a>] (<a href="#Contents">Contents</a>)
+
+15   For two function types to be compatible, both shall specify compatible return types.146)
+     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
+
+
+     145) See ''future language directions'' (<a href="#6.11.6">6.11.6</a>).
+     146) If both function types are ''old style'', parameter types are not compared.
+
+[<a name="#p133" href="p133">page 133</a>] (<a href="#Contents">Contents</a>)
+
+     additional arguments of any type.
+
+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.7">6.7.7</a>).
+
+
+
+
+[<a name="#p134" href="p134">page 134</a>] (<a href="#Contents">Contents</a>)
+
+<a name="6.7.7" href="#6.7.7"><b>    6.7.7 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.147)
+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.
+
+
+
+
+    147) 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="#p135" href="p135">page 135</a>] (<a href="#Contents">Contents</a>)
+
+<a name="6.7.8" href="#6.7.8"><b>    6.7.8 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.6">6.7.6</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="#p136" href="p136">page 136</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="#p137" href="p137">page 137</a>] (<a href="#Contents">Contents</a>)
+
+<a name="6.7.9" href="#6.7.9"><b>    6.7.9 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 a complete
+    object type that is not a variable length array type.
+4   All the expressions in an initializer for an object that has static or thread 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="#p138" href="p138">page 138</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 or thread 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,
+       and any padding is initialized to zero bits;
+     -- if it is a union, the first named member is initialized (recursively) according to these
+       rules, and any padding is initialized to zero bits;
+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 or UTF-8 string
+     literal, optionally enclosed in braces. Successive bytes of the 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 a qualified or unqualified version of
+     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.
+
+
+[<a name="#p139" href="p139">page 139</a>] (<a href="#Contents">Contents</a>)
+
+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
+     members in declaration order, and the first named member of a union.148) 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.149)
+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.150) 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;151)
+     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.
+
+
+
+     148) 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.
+     149) 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.
+     150) 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.
+     151) Any initializer for the subobject which is overridden and so not used to initialize that subobject might
+          not be evaluated at all.
+
+[<a name="#p140" href="p140">page 140</a>] (<a href="#Contents">Contents</a>)
+
+22   If an array of unknown size is initialized, its size is determined by the largest indexed
+     element with an explicit initializer. The array type is completed at the end of its
+     initializer list.
+23   The evaluations of the initialization list expressions are indeterminately sequenced with
+     respect to one another and thus the order in which any side effects occur is
+     unspecified.152)
+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 <a href="#5.0">5.0</a> + 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
+
+
+
+     152) In particular, the evaluation order need not be the same as the order of subobject initialization.
+
+[<a name="#p141" href="p141">page 141</a>] (<a href="#Contents">Contents</a>)
+
+     structures: w[0].a[0] is 1 and w[1].a[0] is 2; all the other elements are zero.
+
+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="#p142" href="p142">page 142</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.19">&lt;stddef.h&gt;</a> (<a href="#7.19">7.19</a>).
+
+
+
+
+[<a name="#p143" href="p143">page 143</a>] (<a href="#Contents">Contents</a>)
+
+<a name="6.7.10" href="#6.7.10"><b>    6.7.10 Static assertions</b></a>
+    Syntax
+1            static_assert-declaration:
+                     _Static_assert ( constant-expression , string-literal ) ;
+    Constraints
+2   The constant expression shall compare unequal to 0.
+    Semantics
+3   The constant expression shall be an integer constant expression. If the value of the
+    constant expression compares unequal to 0, the declaration has no effect. Otherwise, the
+    constraint is violated and the implementation shall produce a diagnostic message that
+    includes the text of the string literal, except that characters not in the basic source
+    character set are not required to appear in the message.
+    Forward references: diagnostics (<a href="#7.2">7.2</a>).
+
+
+
+
+[<a name="#p144" href="p144">page 144</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 that is not part of a compound
+    literal; 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. There is a sequence point between the evaluation of a full expression and the
+    evaluation of the next full expression to be evaluated.
+    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="#p145" href="p145">page 145</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.153)
+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);
+
+
+
+    153) Such as assignments, and function calls which have side effects.
+
+[<a name="#p146" href="p146">page 146</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="#p147" href="p147">page 147</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.154)
+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.
+
+
+
+
+    154) 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="#p148" href="p148">page 148</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.155)
+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.
+6   An iteration statement whose controlling expression is not a constant expression,156) that
+    performs no input/output operations, does not access volatile objects, and performs no
+    synchronization or atomic operations in its body, controlling expression, or (in the case of
+
+    155) 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.
+    156) An omitted controlling expression is replaced by a nonzero constant, which is a constant expression.
+
+[<a name="#p149" href="p149">page 149</a>] (<a href="#Contents">Contents</a>)
+
+    a for statement) its expression-3, may be assumed by the implementation to
+    terminate.157)
+<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.158)
+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 ;
+
+
+
+
+    157) This is intended to allow compiler transformations such as removal of empty loops even when
+         termination cannot be proven.
+    158) 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="#p150" href="p150">page 150</a>] (<a href="#Contents">Contents</a>)
+
+    Semantics
+2   A jump statement causes an unconditional jump to another place.
+<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.)
+            /* ... */
+            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="#p151" href="p151">page 151</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;.159)
+<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.
+
+
+
+    159) Following the contin: label is a null statement.
+
+[<a name="#p152" href="p152">page 152</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.160)
+4   EXAMPLE       In:
+            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();
+    there is no undefined behavior, although there would be if the assignment were done directly (without using
+    a function call to fetch the value).
+
+
+
+
+    160) 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 than implied by the type; a cast may be used to remove this extra range and precision.
+
+[<a name="#p153" href="p153">page 153</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.161)
+
+
+
+
+    161) Thus, if an identifier declared with external linkage is not used in an expression, there need be no
+         external definition for it.
+
+[<a name="#p154" href="p154">page 154</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.162)
+3   The return type of a function shall be void or a complete 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.
+
+
+
+    162) 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="#p155" href="p155">page 155</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,163) 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.6.3">6.7.6.3</a> for a parameter type list; the resulting type shall be a complete 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.164) 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:
+
+
+
+
+     163) See ''future language directions'' (<a href="#6.11.7">6.11.7</a>).
+     164) A parameter identifier cannot be redeclared in the function body except in an enclosed block.
+
+[<a name="#p156" href="p156">page 156</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="#p157" href="p157">page 157</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="#p158" href="p158">page 158</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="#p159" href="p159">page 159</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.165) A new-line character ends
+    the preprocessing directive even if it occurs within what would otherwise be an
+
+    165) 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="#p160" href="p160">page 160</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: identifiers (including those lexically identical to keywords) are interpreted as *
+    described below;166) and it may contain unary operator expressions of the form
+         defined identifier
+    or
+         defined ( identifier )
+    which evaluate to 1 if the identifier is currently defined as a macro name (that is, if it is
+
+
+    166) 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="#p161" href="p161">page 161</a>] (<a href="#Contents">Contents</a>)
+
+    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.20">&lt;stdint.h&gt;</a>.167) 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.168) Also, whether a
+    single-character character constant may have a negative value is implementation-defined.
+
+
+
+
+    167) 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.
+    168) 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)
+
+
+[<a name="#p162" href="p162">page 162</a>] (<a href="#Contents">Contents</a>)
+
+5   Preprocessing directives of the forms
+       # 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.169)
+    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.20.1.5">7.20.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
+       # 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
+
+
+    169) 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="#p163" href="p163">page 163</a>] (<a href="#Contents">Contents</a>)
+
+    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.170) 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.21">&lt;stdio.h&gt;</a>
+             #include "myprog.h"
+
+
+
+
+    170) 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="#p164" href="p164">page 164</a>] (<a href="#Contents">Contents</a>)
+
+8   EXAMPLE 2      This illustrates macro-replaced #include directives:
+              #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
+
+[<a name="#p165" href="p165">page 165</a>] (<a href="#Contents">Contents</a>)
+
+     for either form of macro.
+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 name171)
+     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,172) 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:
+
+
+     171) 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.
+     172) Despite the name, a non-directive is a preprocessing directive.
+
+[<a name="#p166" href="p166">page 166</a>] (<a href="#Contents">Contents</a>)
+
+    the variable arguments. The number of arguments so combined is such that, following
+    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="#p167" href="p167">page 167</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.173)
+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.
+
+
+    173) Placemarker preprocessing tokens do not appear in the syntax because they are temporary entities that
+         exist only within translation phase 4.
+
+[<a name="#p168" href="p168">page 168</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. The
+    resulting preprocessing token sequence is then 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="#p169" href="p169">page 169</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="#p170" href="p170">page 170</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="#p171" href="p171">page 171</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="#p172" href="p172">page 172</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)174) 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 forms175) 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>).
+
+
+
+
+    174) 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.
+    175) See ''future language directions'' (<a href="#6.11.8">6.11.8</a>).
+
+[<a name="#p173" href="p173">page 173</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 values of the predefined macros listed in the following subclauses176) (except for
+    __FILE__ and __LINE__) remain constant throughout the translation unit.
+2   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.
+3   The implementation shall not predefine the macro __cplusplus, nor shall it define it
+    in any standard header.
+    Forward references: standard headers (<a href="#7.1.2">7.1.2</a>).
+<a name="6.10.8.1" href="#6.10.8.1"><b>    6.10.8.1 Mandatory macros</b></a>
+1   The following macro names 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).177)
+    __LINE__ The presumed line number (within the current source file) of the current
+               source line (an integer constant).177)
+    __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.
+
+
+
+
+    176) See ''future language directions'' (<a href="#6.11.9">6.11.9</a>).
+    177) The presumed source file name and line number can be changed by the #line directive.
+
+[<a name="#p174" href="p174">page 174</a>] (<a href="#Contents">Contents</a>)
+
+    __STDC_VERSION__ The integer constant 201ymmL.178)
+    __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.
+    Forward references: the asctime function (<a href="#7.26.3.1">7.26.3.1</a>).
+<a name="6.10.8.2" href="#6.10.8.2"><b>    6.10.8.2 Environment macros</b></a>
+1   The following macro names are conditionally defined by the implementation:
+    __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. If some other encoding is used, the macro shall not be defined and
+              the actual encoding used is implementation-defined.
+    __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_UTF_16__ The integer constant 1, intended to indicate that values of type
+              char16_t are UTF-16 encoded. If some other encoding is used, the
+              macro shall not be defined and the actual encoding used is implementation-
+              defined.
+    __STDC_UTF_32__ The integer constant 1, intended to indicate that values of type
+              char32_t are UTF-32 encoded. If some other encoding is used, the
+              macro shall not be defined and the actual encoding used is implementation-
+              defined.
+    Forward references: common definitions (<a href="#7.19">7.19</a>), unicode utilities (<a href="#7.27">7.27</a>).
+
+
+
+
+    178) This macro was not specified in ISO/IEC 9899:1990 and was specified as 199409L in
+         ISO/IEC 9899/AMD1:1995 and as 199901L in ISO/IEC 9899:1999. 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="#p175" href="p175">page 175</a>] (<a href="#Contents">Contents</a>)
+
+<a name="6.10.8.3" href="#6.10.8.3"><b>    6.10.8.3 Conditional feature macros</b></a>
+1   The following macro names are conditionally defined by the implementation:
+    __STDC_ANALYZABLE__ The integer constant 1, intended to indicate conformance to
+              the specifications in <a href="#L">annex L</a> (Analyzability).
+    __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 <a href="#G">annex G</a> (IEC 60559 compatible complex
+              arithmetic).
+    __STDC_LIB_EXT1__ The integer constant 201ymmL, intended to indicate support
+              for the extensions defined in <a href="#K">annex K</a> (Bounds-checking interfaces).179)
+    __STDC_NO_COMPLEX__ The integer constant 1, intended to indicate that the
+              implementation does not support complex types or the <a href="#7.3">&lt;complex.h&gt;</a>
+              header.
+    __STDC_NO_THREADS__ The integer constant 1, intended to indicate that the
+              implementation does not support atomic types (including the _Atomic
+              type qualifier and the <a href="#7.17">&lt;stdatomic.h&gt;</a> header) or the <a href="#7.25">&lt;threads.h&gt;</a>
+              header.
+    __STDC_NO_VLA__ The integer constant 1, intended to indicate that the
+              implementation does not support variable length arrays or variably
+              modified types.
+2   An implementation that defines __STDC_NO_COMPLEX__ shall not define
+    __STDC_IEC_559_COMPLEX__.
+<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
+
+
+    179) 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="#p176" href="p176">page 176</a>] (<a href="#Contents">Contents</a>)
+
+    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:
+              _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="#p177" href="p177">page 177</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="#p178" href="p178">page 178</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.180) 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.181)
+    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>).
+
+
+
+
+    180) The functions that make use of the decimal-point character are the numeric conversion functions
+         (<a href="#7.22.1">7.22.1</a>, <a href="#7.28.4.1">7.28.4.1</a>) and the formatted input/output functions (<a href="#7.21.6">7.21.6</a>, <a href="#7.28.2">7.28.2</a>).
+    181) 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="#p179" href="p179">page 179</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,182)
+    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 are183)
+           <a href="#7.2">&lt;assert.h&gt;</a>             <a href="#7.9">&lt;iso646.h&gt;</a>              <a href="#7.16">&lt;stdarg.h&gt;</a>              <a href="#7.23">&lt;string.h&gt;</a>
+           <a href="#7.3">&lt;complex.h&gt;</a>            <a href="#7.10">&lt;limits.h&gt;</a>              <a href="#7.17">&lt;stdatomic.h&gt;</a>           <a href="#7.24">&lt;tgmath.h&gt;</a>
+           <a href="#7.4">&lt;ctype.h&gt;</a>              <a href="#7.11">&lt;locale.h&gt;</a>              <a href="#7.18">&lt;stdbool.h&gt;</a>             <a href="#7.25">&lt;threads.h&gt;</a>
+           <a href="#7.5">&lt;errno.h&gt;</a>              <a href="#7.12">&lt;math.h&gt;</a>                <a href="#7.19">&lt;stddef.h&gt;</a>              <a href="#7.26">&lt;time.h&gt;</a>
+           <a href="#7.6">&lt;fenv.h&gt;</a>               <a href="#7.13">&lt;setjmp.h&gt;</a>              <a href="#7.20">&lt;stdint.h&gt;</a>              <a href="#7.27">&lt;uchar.h&gt;</a>
+           <a href="#7.7">&lt;float.h&gt;</a>              <a href="#7.14">&lt;signal.h&gt;</a>              <a href="#7.21">&lt;stdio.h&gt;</a>               <a href="#7.28">&lt;wchar.h&gt;</a>
+           <a href="#7.8">&lt;inttypes.h&gt;</a>           <a href="#7.15">&lt;stdalign.h&gt;</a>            <a href="#7.22">&lt;stdlib.h&gt;</a>              <a href="#7.29">&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.
+
+
+
+
+    182) A header is not necessarily a source file, nor are the &lt; and &gt; delimited sequences in header names
+         necessarily valid source file names.
+    183) The headers <a href="#7.3">&lt;complex.h&gt;</a>, <a href="#7.17">&lt;stdatomic.h&gt;</a>, and <a href="#7.25">&lt;threads.h&gt;</a> are conditional features that
+         implementations need not support; see <a href="#6.10.8.3">6.10.8.3</a>.
+
+[<a name="#p180" href="p180">page 180</a>] (<a href="#Contents">Contents</a>)
+
+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>).
+<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) and errno are always reserved for use as identifiers with
+      external linkage.184)
+    -- 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.
+
+
+
+
+    184) The list of reserved identifiers with external linkage includes math_errhandling, setjmp,
+         va_copy, and va_end.
+
+[<a name="#p181" href="p181">page 181</a>] (<a href="#Contents">Contents</a>)
+
+<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
+    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.185) 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.186) 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.187) All object-like macros listed as expanding to
+
+
+    185) This means that an implementation shall provide an actual function for each library function, even if it
+         also provides a macro for that function.
+    186) Such macros might not contain the sequence points that the corresponding function calls do.
+    187) 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.
+
+[<a name="#p182" href="p182">page 182</a>] (<a href="#Contents">Contents</a>)
+
+    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 or thread storage duration.188)
+5   Unless explicitly stated otherwise in the detailed descriptions that follow, library
+    functions shall prevent data races as follows: A library function shall not directly or
+    indirectly access objects accessible by threads other than the current thread unless the
+    objects are accessed directly or indirectly via the function's arguments. A library
+    function shall not directly or indirectly modify objects accessible by threads other than
+    the current thread unless the objects are accessed directly or indirectly via the function's
+    non-const arguments.189) Implementations may share their own internal objects between
+    threads if the objects are not visible to users and are protected against data races.
+6   Unless otherwise specified, library functions shall perform all operations solely within the
+    current thread if those operations have effects that are visible to users.190)
+7   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.22">&lt;stdlib.h&gt;</a>
+                 const char *str;
+                 /* ... */
+                 i = atoi(str);
+    -- by use of its associated header (assuredly generating a true function reference)
+
+
+
+
+    188) Thus, a signal handler cannot, in general, call standard library functions.
+    189) This means, for example, that an implementation is not permitted to use a static object for internal
+         purposes without synchronization because it could cause a data race even in programs that do not
+         explicitly share objects between threads.
+    190) This allows implementations to parallelize operations if there are no visible side effects.
+
+[<a name="#p183" href="p183">page 183</a>] (<a href="#Contents">Contents</a>)
+
+            #include <a href="#7.22">&lt;stdlib.h&gt;</a>
+            #undef atoi
+            const char *str;
+            /* ... */
+            i = atoi(str);
+   or
+            #include <a href="#7.22">&lt;stdlib.h&gt;</a>
+            const char *str;
+            /* ... */
+            i = (atoi)(str);
+-- by explicit declaration
+            extern int atoi(const char *);
+            const char *str;
+            /* ... */
+            i = atoi(str);
+
+
+
+
+[<a name="#p184" href="p184">page 184</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 and static_assert macros 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.
+3   The macro
+            static_assert
+    expands to _Static_assert.
+<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.191) It
+    then calls the abort function.
+
+
+
+    191) The message written might be of the form:
+         Assertion failed: expression, function abc, file xyz, line nnn.
+
+
+[<a name="#p185" href="p185">page 185</a>] (<a href="#Contents">Contents</a>)
+
+    Returns
+3   The assert macro returns no value.
+    Forward references: the abort function (<a href="#7.22.4.1">7.22.4.1</a>).
+
+
+
+
+[<a name="#p186" href="p186">page 186</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.192)
+2   Implementations that define the macro __STDC_NO_COMPLEX__ need not provide
+    this header nor support any of its facilities.
+3   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.
+4   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.193)
+5   The macros
+             imaginary
+    and
+             _Imaginary_I
+    are defined if and only if the implementation supports imaginary types;194) if defined,
+    they expand to _Imaginary and a constant expression of type const float
+    _Imaginary with the value of the imaginary unit.
+6   The macro
+             I
+    expands to either _Imaginary_I or _Complex_I. If _Imaginary_I is not
+    defined, I shall expand to _Complex_I.
+7   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.
+
+    192) See ''future library directions'' (<a href="#7.30.1">7.30.1</a>).
+    193) The imaginary unit is a number i such that i 2 = -1.
+    194) A specification for imaginary types is in informative <a href="#G">annex G</a>.
+
+[<a name="#p187" href="p187">page 187</a>] (<a href="#Contents">Contents</a>)
+
+    Forward references: IEC 60559-compatible complex arithmetic (<a href="#G">annex G</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.195) The 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
+    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
+
+[<a name="#p188" href="p188">page 188</a>] (<a href="#Contents">Contents</a>)
+
+    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]
+
+    195) 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="#p189" href="p189">page 189</a>] (<a href="#Contents">Contents</a>)
+
+    along the real axis.
+<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.
+
+
+
+[<a name="#p190" href="p190">page 190</a>] (<a href="#Contents">Contents</a>)
+
+    Returns
+3   The csin functions return the complex sine value.
+<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 nonnegative 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);
+
+
+
+[<a name="#p191" href="p191">page 191</a>] (<a href="#Contents">Contents</a>)
+
+    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.
+    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="#p192" href="p192">page 192</a>] (<a href="#Contents">Contents</a>)
+
+<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);
+    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="#p193" href="p193">page 193</a>] (<a href="#Contents">Contents</a>)
+
+<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);
+    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);
+
+
+
+
+[<a name="#p194" href="p194">page 194</a>] (<a href="#Contents">Contents</a>)
+
+    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="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="#p195" href="p195">page 195</a>] (<a href="#Contents">Contents</a>)
+
+<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);
+    Description
+2   The cimag functions compute the imaginary part of z.196)
+    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 CMPLX macros</b></a>
+    Synopsis
+1          #include <a href="#7.3">&lt;complex.h&gt;</a>
+           double complex CMPLX(double x, double y);
+           float complex CMPLXF(float x, float y);
+           long double complex CMPLXL(long double x, long double y);
+    Description
+2   The CMPLX macros expand to an expression of the specified complex type, with the real
+    part having the (converted) value of x and the imaginary part having the (converted)
+    value of y.
+    Recommended practice
+3   The resulting expression should be suitable for use as an initializer for an object with
+    static or thread storage duration, provided both arguments are likewise suitable.
+    Returns
+4   The CMPLX macros return the complex value x + i y.
+5   NOTE    These macros act as if the implementation supported imaginary types and the definitions were:
+          #define CMPLX(x, y)  ((double complex)((double)(x) + \
+                                        _Imaginary_I * (double)(y)))
+          #define CMPLXF(x, y) ((float complex)((float)(x) + \
+                                        _Imaginary_I * (float)(y)))
+          #define CMPLXL(x, y) ((long double complex)((long double)(x) + \
+                                        _Imaginary_I * (long double)(y)))
+
+
+
+
+    196) For a variable z of complex type, z == creal(z) + cimag(z)*I.
+
+[<a name="#p196" href="p196">page 196</a>] (<a href="#Contents">Contents</a>)
+
+<a name="7.3.9.4" href="#7.3.9.4"><b>    7.3.9.4 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.5" href="#7.3.9.5"><b>    7.3.9.5 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.
+<a name="7.3.9.6" href="#7.3.9.6"><b>    7.3.9.6 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.197)
+
+
+[<a name="#p197" href="p197">page 197</a>] (<a href="#Contents">Contents</a>)
+
+    Returns
+3   The creal functions return the real part value.
+
+
+
+
+    197) For a variable z of complex type, z == creal(z) + cimag(z)*I.
+
+[<a name="#p198" href="p198">page 198</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.198) 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.199) All letters and digits are printing characters.
+    Forward references: EOF (<a href="#7.21.1">7.21.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
+
+
+
+    198) See ''future library directions'' (<a href="#7.30.2">7.30.2</a>).
+    199) 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="#p199" href="p199">page 199</a>] (<a href="#Contents">Contents</a>)
+
+    none of iscntrl, isdigit, ispunct, or isspace is true.200) 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);
+
+
+
+
+    200) The functions islower and isupper test true or false separately for each of these additional
+         characters; all four combinations are possible.
+
+[<a name="#p200" href="p200">page 200</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="#p201" href="p201">page 201</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="#p202" href="p202">page 202</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="#p203" href="p203">page 203</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 lvalue201) that has type int and thread local storage
+    duration, the value of which is set to a positive error number by several library functions.
+    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 in the initial thread is zero at program startup (the initial value of
+    errno in other threads is an indeterminate value), but is never set to zero by any library
+    function.202) 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,203) may also be specified by the implementation.
+
+
+
+
+    201) 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()).
+    202) 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.
+    203) See ''future library directions'' (<a href="#7.30.3">7.30.3</a>).
+
+[<a name="#p204" href="p204">page 204</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> defines several macros, and declares types and functions that
+    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.204) 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.205) 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   The floating-point environment has thread storage duration. The initial state for a
+    thread's floating-point environment is the current state of the floating-point environment
+    of the thread that creates it at the time of creation.
+3   Certain programming conventions support the intended model of use for the floating-
+    point environment:206)
+    -- 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.
+4   The type
+            fenv_t
+    represents the entire floating-point environment.
+5   The type
+            fexcept_t
+    represents the floating-point status flags collectively, including any status the
+    implementation associates with the flags.
+
+
+    204) 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. It is also
+         designed to facilitate code portability among all systems.
+    205) A floating-point status flag is not an object and can be set more than once within an expression.
+    206) 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="#p205" href="p205">page 205</a>] (<a href="#Contents">Contents</a>)
+
+6   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.207) 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.208)
+7   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.
+8   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.209)
+9   The macro
+
+
+
+    207) The implementation supports a floating-point 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.
+    208) The macros should be distinct powers of two.
+    209) 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="#p206" href="p206">page 206</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.
+10   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.210) 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.)
+
+
+
+
+     210) 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="#p207" href="p207">page 207</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.211)
+
+<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.212) 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.
+
+
+    211) 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.
+    212) 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="#p208" href="p208">page 208</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.213) The order in which these floating-point exceptions are
+    raised is unspecified, except as stated in <a href="#F.8.6">F.8.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.
+
+
+
+
+    213) 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.8.6">F.8.6</a> is in the same spirit.
+
+[<a name="#p209" href="p209">page 209</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.214)
+    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:
+
+
+
+
+    214) This mechanism allows testing several floating-point exceptions with just one function call.
+
+[<a name="#p210" href="p210">page 210</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="#p211" href="p211">page 211</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.215)
+
+[<a name="#p212" href="p212">page 212</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.
+
+
+
+
+    215) 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="#p213" href="p213">page 213</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)
+          {
+                #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;
+          }
+
+
+
+
+[<a name="#p214" href="p214">page 214</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="#p215" href="p215">page 215</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.20">&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.20">&lt;stdint.h&gt;</a>, it defines corresponding macros for conversion
+    specifiers for use with the formatted input/output functions.216)
+    Forward references: integer types <a href="#7.20">&lt;stdint.h&gt;</a> (<a href="#7.20">7.20</a>), formatted input/output
+    functions (<a href="#7.21.6">7.21.6</a>), formatted wide character input/output functions (<a href="#7.28.2">7.28.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 macros 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),217) followed by the conversion specifier, followed by a
+    name corresponding to a similar type name in <a href="#7.20.1">7.20.1</a>. In these names, N represents the
+    width of the type as described in <a href="#7.20.1">7.20.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
+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:
+
+
+
+    216) See ''future library directions'' (<a href="#7.30.4">7.30.4</a>).
+    217) 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="#p216" href="p216">page 216</a>] (<a href="#Contents">Contents</a>)
+
+           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.20">&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.28">&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.218)
+    Returns
+3   The imaxabs function returns the absolute value.
+
+
+
+
+    218) The absolute value of the most negative number cannot be represented in two's complement.
+
+[<a name="#p217" href="p217">page 217</a>] (<a href="#Contents">Contents</a>)
+
+<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.22.1.4">7.22.1.4</a>).
+
+
+
+
+[<a name="#p218" href="p218">page 218</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.19">&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.28.4.1.2">7.28.4.1.2</a>).
+
+
+
+
+[<a name="#p219" href="p219">page 219</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="#p220" href="p220">page 220</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="#p221" href="p221">page 221</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="#p222" href="p222">page 222</a>] (<a href="#Contents">Contents</a>)
+
+3   The macros defined are NULL (described in <a href="#7.19">7.19</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.219) Additional macro definitions, beginning
+    with the characters LC_ and an uppercase letter,220) 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 functions221) 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.
+
+    219) ISO/IEC 9945-2 specifies locale and charmap formats that may be used to specify locales for C.
+    220) See ''future library directions'' (<a href="#7.30.5">7.30.5</a>).
+    221) 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="#p223" href="p223">page 223</a>] (<a href="#Contents">Contents</a>)
+
+4   At program startup, the equivalent of
+            setlocale(LC_ALL, "C");
+    is executed.
+5   A call to the setlocale function may introduce a data race with other calls to the
+    setlocale function or with calls to functions that are affected by the current locale.
+    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.222)
+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.21.6">7.21.6</a>), multibyte/wide
+    character conversion functions (<a href="#7.22.7">7.22.7</a>), multibyte/wide string conversion functions
+    (<a href="#7.22.8">7.22.8</a>), numeric conversion functions (<a href="#7.22.1">7.22.1</a>), the strcoll function (<a href="#7.23.4.3">7.23.4.3</a>), the
+    strftime function (<a href="#7.26.3.5">7.26.3.5</a>), the strxfrm function (<a href="#7.23.4.5">7.23.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.
+
+
+
+    222) 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="#p224" href="p224">page 224</a>] (<a href="#Contents">Contents</a>)
+
+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
+    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.
+
+
+
+[<a name="#p225" href="p225">page 225</a>] (<a href="#Contents">Contents</a>)
+
+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.
+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="#p226" href="p226">page 226</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="#p227" href="p227">page 227</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="#p228" href="p228">page 228</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="#p229" href="p229">page 229</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.223)
+    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.224)
+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.225)
+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
+
+
+
+    223) 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.
+    224) 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.
+    225) HUGE_VAL, HUGE_VALF, and HUGE_VALL can be positive infinities in an implementation that
+         supports infinities.
+
+[<a name="#p230" href="p230">page 230</a>] (<a href="#Contents">Contents</a>)
+
+    translation time.226)
+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.227) 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.
+
+
+    226) In this case, using INFINITY will violate the constraint in <a href="#6.4.4">6.4.4</a> and thus require a diagnostic.
+    227) 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="#p231" href="p231">page 231</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 raising SIGFPE and without generating any of the
+    floating-point exceptions ''invalid'', ''divide-by-zero'', or ''overflow'' except to reflect
+    the result of the function.
+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.228) 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 pole error (also known as a singularity or infinitary) occurs if the
+    mathematical function has an exact infinite result as the finite input argument(s) are
+    approached in the limit (for example, log(0.0)). The description of each function lists
+    any required pole errors; an implementation may define additional pole errors, provided
+    that such errors are consistent with the mathematical definition of the function. On a pole
+    error, the function returns an implementation-defined value; if the integer expression
+
+
+    228) 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="#p232" href="p232">page 232</a>] (<a href="#Contents">Contents</a>)
+
+    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.
+4   Likewise, 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.
+5   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, then the function returns the value of the macro HUGE_VAL, 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 ''overflow'' floating-
+    point exception is raised.
+6   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.229) 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.
+7   If a domain, pole, or range error occurs and the integer expression
+    math_errhandling &amp; MATH_ERRNO is zero,230) then errno shall either be set to
+    the value corresponding to the error or left unmodified. If no such error occurs, errno
+    shall be left unmodified regardless of the setting of math_errhandling.
+
+
+
+
+    229) The term underflow here is intended to encompass both ''gradual underflow'' as in IEC 60559 and
+         also ''flush-to-zero'' underflow.
+    230) Math errors are being indicated by the floating-point exception flags rather than by errno.
+
+[<a name="#p233" href="p233">page 233</a>] (<a href="#Contents">Contents</a>)
+
+<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.
+<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.231)
+    Returns
+3   The fpclassify macro returns the value of the number classification macro
+    appropriate to the value of its argument.                                *
+
+
+    231) 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="#p234" href="p234">page 234</a>] (<a href="#Contents">Contents</a>)
+
+<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.
+    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.232)
+
+
+    232) 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="#p235" href="p235">page 235</a>] (<a href="#Contents">Contents</a>)
+
+    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);
+    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.233)
+    Returns
+3   The signbit macro returns a nonzero value if and only if the sign of its argument value
+    is negative.
+
+
+
+
+    233) 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="#p236" href="p236">page 236</a>] (<a href="#Contents">Contents</a>)
+
+<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.
+<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.
+
+
+
+
+[<a name="#p237" href="p237">page 237</a>] (<a href="#Contents">Contents</a>)
+
+    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="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).
+
+
+
+[<a name="#p238" href="p238">page 238</a>] (<a href="#Contents">Contents</a>)
+
+    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="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.
+
+
+[<a name="#p239" href="p239">page 239</a>] (<a href="#Contents">Contents</a>)
+
+    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 pole error may occur if the argument equals
+    -1 or +1.
+    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.
+[<a name="#p240" href="p240">page 240</a>] (<a href="#Contents">Contents</a>)
+
+    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.
+    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.
+
+[<a name="#p241" href="p241">page 241</a>] (<a href="#Contents">Contents</a>)
+
+    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);
+    Description
+2   The expm1 functions compute the base-e exponential of the argument, minus 1. A range
+    error occurs if x is too large.234)
+    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 or if the integral power of 2 is outside the range
+    of int, 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.
+
+
+
+
+    234) For small magnitude x, expm1(x) is expected to be more accurate than exp(x) - 1.
+
+[<a name="#p242" href="p242">page 242</a>] (<a href="#Contents">Contents</a>)
+
+<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.
+    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);
+
+
+
+[<a name="#p243" href="p243">page 243</a>] (<a href="#Contents">Contents</a>)
+
+    Description
+2   The log functions compute the base-e (natural) logarithm of x. A domain error occurs if
+    the argument is negative. A pole 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);
+    Description
+2   The log10 functions compute the base-10 (common) logarithm of x. A domain error
+    occurs if the argument is negative. A pole 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.235)
+    A domain error occurs if the argument is less than -1. A pole error may occur if the
+    argument equals -1.
+    Returns
+3   The log1p functions return loge (1 + x).
+
+
+
+
+    235) For small magnitude x, log1p(x) is expected to be more accurate than log(1 + x).
+
+[<a name="#p244" href="p244">page 244</a>] (<a href="#Contents">Contents</a>)
+
+<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 pole error may occur if the argument is zero.
+    Returns
+3   The log2 functions return log2 x.
+<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 pole 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
+[<a name="#p245" href="p245">page 245</a>] (<a href="#Contents">Contents</a>)
+
+    floating-point format) in the object pointed to by iptr.
+    Returns
+3   The modf functions return the signed fractional part of value.
+<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="#p246" href="p246">page 246</a>] (<a href="#Contents">Contents</a>)
+
+<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.
+    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 pole error may occur if x is
+    zero and y is less than zero.
+
+
+
+
+[<a name="#p247" href="p247">page 247</a>] (<a href="#Contents">Contents</a>)
+
+    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);
+    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
+3                                      2        x
+                                            (integral)       e-t dt.
+                                                      2
+    The erf functions return erf x =
+                                       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.
+[<a name="#p248" href="p248">page 248</a>] (<a href="#Contents">Contents</a>)
+
+    Returns
+3                                                       2       (inf)
+                                                            (integral)       e-t dt.
+                                                                      2
+    The erfc functions return erfc x = 1 - erf x =
+                                                     sqrt:pi
+                                                     -
+                                                     -      x
+
+<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 pole 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 pole error
+    may occur if x is a negative integer or zero. A range error occurs if the magnitude of x is
+    too large and may occur if the magnitude of x is too small.
+    Returns
+3   The tgamma functions return (Gamma)(x).
+
+
+
+
+[<a name="#p249" href="p249">page 249</a>] (<a href="#Contents">Contents</a>)
+
+<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.
+    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.
+
+
+
+
+[<a name="#p250" href="p250">page 250</a>] (<a href="#Contents">Contents</a>)
+
+    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.
+    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="#p251" href="p251">page 251</a>] (<a href="#Contents">Contents</a>)
+
+<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="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);
+
+
+[<a name="#p252" href="p252">page 252</a>] (<a href="#Contents">Contents</a>)
+
+    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="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.236)
+
+
+
+
+    236) ''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. If r = 0, its sign shall be that of x.'' This definition is applicable for *
+         all implementations.
+
+[<a name="#p253" href="p253">page 253</a>] (<a href="#Contents">Contents</a>)
+
+    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.
+<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="#p254" href="p254">page 254</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.22.1.3">7.22.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.237) 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.
+
+
+    237) The argument values are converted to the type of the function, even by a macro implementation of the
+         function.
+
+[<a name="#p255" href="p255">page 255</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.238)
+<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);
+
+
+
+    238) 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="#p256" href="p256">page 256</a>] (<a href="#Contents">Contents</a>)
+
+    Description
+2   The fmax functions determine the maximum numeric value of their arguments.239)
+    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.240)
+    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.
+
+
+
+
+    239) 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.10.9.2">F.10.9.2</a>.
+    240) The fmin functions are analogous to the fmax functions in their treatment of NaNs.
+
+[<a name="#p257" href="p257">page 257</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.241) 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 type242) (both arguments need not have the same type).243)
+<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);
+
+
+
+
+    241) 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.
+    242) If any argument is of integer type, or any other type that is not a real floating type, the behavior is
+         undefined.
+    243) Whether an argument represented in a format wider than its semantic type is converted to the semantic
+         type is unspecified.
+
+[<a name="#p258" href="p258">page 258</a>] (<a href="#Contents">Contents</a>)
+
+    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.
+    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="#p259" href="p259">page 259</a>] (<a href="#Contents">Contents</a>)
+
+<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).
+    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="#p260" href="p260">page 260</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.244)
+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
+
+
+    244) These functions are useful for dealing with unusual conditions encountered in a low-level function of
+         a program.
+
+[<a name="#p261" href="p261">page 261</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>
+             _Noreturn 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 execution245) 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 machine246)
+    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.
+
+
+
+
+    245) 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.
+    246) This includes, but is not limited to, the floating-point status flags and the state of open files.
+
+[<a name="#p262" href="p262">page 262</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="#p263" href="p263">page 263</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,247) 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.
+
+
+
+
+    247) See ''future library directions'' (<a href="#7.30.6">7.30.6</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="#p264" href="p264">page 264</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),248) 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 or thread
+    storage duration that is not a lock-free atomic object 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, the
+    quick_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.249)
+
+
+    248) This includes functions called indirectly via standard library functions (e.g., a SIGABRT handler
+         called via the abort function).
+    249) If any signal is generated by an asynchronous signal handler, the behavior is undefined.
+
+[<a name="#p265" href="p265">page 265</a>] (<a href="#Contents">Contents</a>)
+
+6   At program startup, the equivalent of
+           signal(sig, SIG_IGN);
+    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.22.4.1">7.22.4.1</a>), the exit function (<a href="#7.22.4.4">7.22.4.4</a>), the
+    _Exit function (<a href="#7.22.4.5">7.22.4.5</a>), the quick_exit function (<a href="#7.22.4.7">7.22.4.7</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="#p266" href="p266">page 266</a>] (<a href="#Contents">Contents</a>)
+
+<a name="7.15" href="#7.15"><b>    7.15 Alignment &lt;stdalign.h&gt;</b></a>
+1   The header <a href="#7.15">&lt;stdalign.h&gt;</a> defines two macros.
+2   The macro
+            alignas
+    expands to _Alignas.
+3   The remaining macro is suitable for use in #if preprocessing directives. It is
+            __alignas_is_defined
+    which expands to the integer constant 1.
+
+
+
+
+[<a name="#p267" href="p267">page 267</a>] (<a href="#Contents">Contents</a>)
+
+<a name="7.16" href="#7.16"><b>    7.16 Variable arguments &lt;stdarg.h&gt;</b></a>
+1   The header <a href="#7.16">&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 a complete 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.250)
+<a name="7.16.1" href="#7.16.1"><b>    7.16.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.16.1.1" href="#7.16.1.1"><b>    7.16.1.1 The va_arg macro</b></a>
+    Synopsis
+1           #include <a href="#7.16">&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
+
+    250) 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="#p268" href="p268">page 268</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.16.1.2" href="#7.16.1.2"><b>    7.16.1.2 The va_copy macro</b></a>
+    Synopsis
+1           #include <a href="#7.16">&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.16.1.3" href="#7.16.1.3"><b>    7.16.1.3 The va_end macro</b></a>
+    Synopsis
+1           #include <a href="#7.16">&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="#p269" href="p269">page 269</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.16.1.4" href="#7.16.1.4"><b>    7.16.1.4 The va_start macro</b></a>
+    Synopsis
+1           #include <a href="#7.16">&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.16">&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="#p270" href="p270">page 270</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.16">&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="#p271" href="p271">page 271</a>] (<a href="#Contents">Contents</a>)
+
+<a name="7.17" href="#7.17"><b>    7.17 Atomics &lt;stdatomic.h&gt;</b></a>
+<a name="7.17.1" href="#7.17.1"><b>    7.17.1 Introduction</b></a>
+1   The header <a href="#7.17">&lt;stdatomic.h&gt;</a> defines several macros and declares several types and
+    functions for performing atomic operations on data shared between threads.
+2   Implementations that define the macro __STDC_NO_THREADS__ need not provide
+    this header nor support any of its facilities.
+3   The macros defined are the atomic lock-free macros
+           ATOMIC_CHAR_LOCK_FREE
+           ATOMIC_CHAR16_T_LOCK_FREE
+           ATOMIC_CHAR32_T_LOCK_FREE
+           ATOMIC_WCHAR_T_LOCK_FREE
+           ATOMIC_SHORT_LOCK_FREE
+           ATOMIC_INT_LOCK_FREE
+           ATOMIC_LONG_LOCK_FREE
+           ATOMIC_LLONG_LOCK_FREE
+           ATOMIC_ADDRESS_LOCK_FREE
+    which indicate the lock-free property of the corresponding atomic types (both signed and
+    unsigned); and
+           ATOMIC_FLAG_INIT
+    which expands to an initializer for an object of type atomic_flag.
+4   The types include
+           memory_order
+    which is an enumerated type whose enumerators identify memory ordering constraints;
+           atomic_flag
+    which is a structure type representing a lock-free, primitive atomic flag;
+           atomic_bool
+    which is a structure type representing the atomic analog of the type _Bool;
+           atomic_address
+    which is a structure type representing the atomic analog of a pointer type; and several
+    atomic analogs of integer types.
+5   In the following operation definitions:
+    -- An A refers to one of the atomic types.
+
+
+[<a name="#p272" href="p272">page 272</a>] (<a href="#Contents">Contents</a>)
+
+    -- A C refers to its corresponding non-atomic type. The atomic_address atomic
+      type corresponds to the void * non-atomic type.
+    -- An M refers to the type of the other argument for arithmetic operations. For atomic
+      integer types, M is C. For atomic address types, M is ptrdiff_t.
+    -- The functions not ending in _explicit have the same semantics as the
+      corresponding _explicit function with memory_order_seq_cst for the
+      memory_order argument.
+6   NOTE Many operations are volatile-qualified. The ''volatile as device register'' semantics have not
+    changed in the standard. This qualification means that volatility is preserved when applying these
+    operations to volatile objects.
+
+<a name="7.17.2" href="#7.17.2"><b>    7.17.2 Initialization</b></a>
+<a name="7.17.2.1" href="#7.17.2.1"><b>    7.17.2.1 The ATOMIC_VAR_INIT macro</b></a>
+    Synopsis
+1           #include <a href="#7.17">&lt;stdatomic.h&gt;</a>
+            #define ATOMIC_VAR_INIT(C value)
+    Description
+2   The ATOMIC_VAR_INIT macro expands to a token sequence suitable for initializing an
+    atomic object of a type that is initialization-compatible with value. An atomic object
+    with automatic storage duration that is not explicitly initialized using
+    ATOMIC_VAR_INIT is initially in an indeterminate state; however, the default (zero)
+    initialization for objects with static or thread-local storage duration is guaranteed to
+    produce a valid state.
+3   Concurrent access to the variable being initialized, even via an atomic operation,
+    constitutes a data race.
+4   EXAMPLE
+            atomic_int guide = ATOMIC_VAR_INIT(42);
+
+<a name="7.17.2.2" href="#7.17.2.2"><b>    7.17.2.2 The atomic_init generic function</b></a>
+    Synopsis
+1           #include <a href="#7.17">&lt;stdatomic.h&gt;</a>
+            void atomic_init(volatile A *obj, C value);
+    Description
+2   The atomic_init generic function initializes the atomic object pointed to by obj to
+    the value value, while also initializing any additional state that the implementation
+    might need to carry for the atomic object.
+
+
+
+[<a name="#p273" href="p273">page 273</a>] (<a href="#Contents">Contents</a>)
+
+3   Although this function initializes an atomic object, it does not avoid data races;
+    concurrent access to the variable being initialized, even via an atomic operation,
+    constitutes a data race.
+    Returns
+4   The atomic_init generic function returns no value.
+5   EXAMPLE
+            atomic_int guide;
+            atomic_init(&amp;guide, 42);
+
+<a name="7.17.3" href="#7.17.3"><b>    7.17.3 Order and consistency</b></a>
+1   The enumerated type memory_order specifies the detailed regular (non-atomic)
+    memory synchronization operations as defined in <a href="#5.1.2.4">5.1.2.4</a> and may provide for operation
+    ordering. Its enumeration constants are as follows:
+            memory_order_relaxed
+            memory_order_consume
+            memory_order_acquire
+            memory_order_release
+            memory_order_acq_rel
+            memory_order_seq_cst
+2   For memory_order_relaxed, no operation orders memory.
+3   For       memory_order_release,       memory_order_acq_rel,             and
+    memory_order_seq_cst, a store operation performs a release operation on the
+    affected memory location.
+4   For       memory_order_acquire,       memory_order_acq_rel,             and
+    memory_order_seq_cst, a load operation performs an acquire operation on the
+    affected memory location.
+5   For memory_order_consume, a load operation performs a consume operation on the
+    affected memory location.
+6   For memory_order_seq_cst, there shall be a single total order S on all operations,
+    consistent with the ''happens before'' order and modification orders for all affected
+    locations, such that each memory_order_seq_cst operation that loads a value
+    observes either the last preceding modification according to this order S, or the result of
+    an operation that is not memory_order_seq_cst.
+7   NOTE 1 Although it is not explicitly required that S include lock operations, it can always be extended to
+    an order that does include lock and unlock operations, since the ordering between those is already included
+    in the ''happens before'' ordering.
+
+8   NOTE 2 Atomic operations specifying memory_order_relaxed are relaxed only with respect to
+    memory ordering. Implementations must still guarantee that any given atomic access to a particular atomic
+
+[<a name="#p274" href="p274">page 274</a>] (<a href="#Contents">Contents</a>)
+
+     object be indivisible with respect to all other atomic accesses to that object.
+
+9    For an atomic operation B that reads the value of an atomic object M, if there is a
+     memory_order_seq_cst fence X sequenced before B, then B observes either the
+     last memory_order_seq_cst modification of M preceding X in the total order S or
+     a later modification of M in its modification order.
+10   For atomic operations A and B on an atomic object M, where A modifies M and B takes
+     its value, if there is a memory_order_seq_cst fence X such that A is sequenced
+     before X and B follows X in S, then B observes either the effects of A or a later
+     modification of M in its modification order.
+11   For atomic operations A and B on an atomic object M, where A modifies M and B takes
+     its value, if there are memory_order_seq_cst fences X and Y such that A is
+     sequenced before X, Y is sequenced before B, and X precedes Y in S, then B observes
+     either the effects of A or a later modification of M in its modification order.
+12   Atomic read-modify-write operations shall always read the last value (in the modification
+     order) stored before the write associated with the read-modify-write operation.
+13   An atomic store shall only store a value that has been computed from constants and
+     program input values by a finite sequence of program evaluations, such that each
+     evaluation observes the values of variables as computed by the last prior assignment in
+     the sequence.251) The ordering of evaluations in this sequence shall be such that
+     -- If an evaluation B observes a value computed by A in a different thread, then B does
+       not happen before A.
+     -- If an evaluation A is included in the sequence, then all evaluations that assign to the
+       same variable and happen before A are also included.
+14   NOTE 3 The second requirement disallows ''out-of-thin-air'', or ''speculative'' stores of atomics when
+     relaxed atomics are used. Since unordered operations are involved, evaluations may appear in this
+     sequence out of thread order. For example, with x and y initially zero,
+              // Thread 1:
+              r1 = atomic_load_explicit(&amp;y, memory_order_relaxed);
+              atomic_store_explicit(&amp;x, r1, memory_order_relaxed);
+
+              // Thread 2:
+              r2 = atomic_load_explicit(&amp;x, memory_order_relaxed);
+              atomic_store_explicit(&amp;y, 42, memory_order_relaxed);
+     is allowed to produce r1 == 42 &amp;&amp; r2 == 42. The sequence of evaluations justifying this consists of:
+
+
+
+
+     251) Among other implications, atomic variables shall not decay.
+
+[<a name="#p275" href="p275">page 275</a>] (<a href="#Contents">Contents</a>)
+
+             atomic_store_explicit(&amp;y, 42,               memory_order_relaxed);
+             r1 = atomic_load_explicit(&amp;y,               memory_order_relaxed);
+             atomic_store_explicit(&amp;x, r1,               memory_order_relaxed);
+             r2 = atomic_load_explicit(&amp;x,               memory_order_relaxed);
+     On the other hand,
+             // Thread 1:
+             r1 = atomic_load_explicit(&amp;y, memory_order_relaxed);
+             atomic_store_explicit(&amp;x, r1, memory_order_relaxed);
+
+             // Thread 2:
+             r2 = atomic_load_explicit(&amp;x, memory_order_relaxed);
+             atomic_store_explicit(&amp;y, r2, memory_order_relaxed);
+     is not allowed to produce r1 == 42 &amp;&amp; r2 = 42, since there is no sequence of evaluations that results
+     in the computation of 42. In the absence of ''relaxed'' operations and read-modify-write operations with
+     weaker than memory_order_acq_rel ordering, the second requirement has no impact.
+
+     Recommended practice
+15   The requirements do not forbid r1 == 42 &amp;&amp; r2 == 42 in the following example,
+     with x and y initially zero:
+             // Thread 1:
+             r1 = atomic_load_explicit(&amp;x, memory_order_relaxed);
+             if (r1 == 42)
+                  atomic_store_explicit(&amp;y, r1, memory_order_relaxed);
+
+             // Thread 2:
+             r2 = atomic_load_explicit(&amp;y, memory_order_relaxed);
+             if (r2 == 42)
+                  atomic_store_explicit(&amp;x, 42, memory_order_relaxed);
+     However, this is not useful behavior, and implementations should not allow it.
+16   Implementations should make atomic stores visible to atomic loads within a reasonable
+     amount of time.
+<a name="7.17.3.1" href="#7.17.3.1"><b>     7.17.3.1 The kill_dependency macro</b></a>
+     Synopsis
+1            #include <a href="#7.17">&lt;stdatomic.h&gt;</a>
+             type kill_dependency(type y);
+     Description
+2    The kill_dependency macro terminates a dependency chain; the argument does not
+     carry a dependency to the return value.
+
+
+
+[<a name="#p276" href="p276">page 276</a>] (<a href="#Contents">Contents</a>)
+
+    Returns
+3   The kill_dependency macro returns the value of y.
+<a name="7.17.4" href="#7.17.4"><b>    7.17.4 Fences</b></a>
+1   This subclause introduces synchronization primitives called fences. Fences can have
+    acquire semantics, release semantics, or both. A fence with acquire semantics is called
+    an acquire fence; a fence with release semantics is called a release fence.
+2   A release fence A synchronizes with an acquire fence B if there exist atomic operations
+    X and Y , both operating on some atomic object M, such that A is sequenced before X, X
+    modifies M, Y is sequenced before B, and Y reads the value written by X or a value
+    written by any side effect in the hypothetical release sequence X would head if it were a
+    release operation.
+3   A release fence A synchronizes with an atomic operation B that performs an acquire
+    operation on an atomic object M if there exists an atomic operation X such that A is
+    sequenced before X, X modifies M, and B reads the value written by X or a value written
+    by any side effect in the hypothetical release sequence X would head if it were a release
+    operation.
+4   An atomic operation A that is a release operation on an atomic object M synchronizes
+    with an acquire fence B if there exists some atomic operation X on M such that X is
+    sequenced before B and reads the value written by A or a value written by any side effect
+    in the release sequence headed by A.
+<a name="7.17.4.1" href="#7.17.4.1"><b>    7.17.4.1 The atomic_thread_fence function</b></a>
+    Synopsis
+1           #include <a href="#7.17">&lt;stdatomic.h&gt;</a>
+            void atomic_thread_fence(memory_order order);
+    Description
+2   Depending on the value of order, this operation:
+    -- has no effects, if order == memory_order_relaxed;
+    -- is an acquire fence, if order == memory_order_acquire or order ==
+      memory_order_consume;
+    -- is a release fence, if order == memory_order_release;
+    -- is both an acquire fence              and   a    release   fence,    if   order     ==
+      memory_order_acq_rel;
+    -- is a sequentially consistent acquire and release fence, if order                    ==
+      memory_order_seq_cst.
+
+
+[<a name="#p277" href="p277">page 277</a>] (<a href="#Contents">Contents</a>)
+
+    Returns
+3   The atomic_thread_fence function returns no value.
+<a name="7.17.4.2" href="#7.17.4.2"><b>    7.17.4.2 The atomic_signal_fence function</b></a>
+    Synopsis
+1           #include <a href="#7.17">&lt;stdatomic.h&gt;</a>
+            void atomic_signal_fence(memory_order order);
+    Description
+2   Equivalent to atomic_thread_fence(order), except that ''synchronizes with''
+    relationships are established only between a thread and a signal handler executed in the
+    same thread.
+3   NOTE 1 The atomic_signal_fence function can be used to specify the order in which actions
+    performed by the thread become visible to the signal handler.
+
+4   NOTE 2 Compiler optimizations and reorderings of loads and stores are inhibited in the same way as with
+    atomic_thread_fence, but the hardware fence instructions that atomic_thread_fence would
+    have inserted are not emitted.
+
+    Returns
+5   The atomic_signal_fence function returns no value.
+<a name="7.17.5" href="#7.17.5"><b>    7.17.5 Lock-free property</b></a>
+1   The atomic lock-free macros indicate the lock-free property of integer and address atomic
+    types. A value of 0 indicates that the type is never lock-free; a value of 1 indicates that
+    the type is sometimes lock-free; a value of 2 indicates that the type is always lock-free.
+2   NOTE Operations that are lock-free should also be address-free. That is, atomic operations on the same
+    memory location via two different addresses will communicate atomically. The implementation should not
+    depend on any per-process state. This restriction enables communication via memory mapped into a
+    process more than once and memory shared between two processes.
+
+<a name="7.17.5.1" href="#7.17.5.1"><b>    7.17.5.1 The atomic_is_lock_free generic function</b></a>
+    Synopsis
+1           #include <a href="#7.17">&lt;stdatomic.h&gt;</a>
+            _Bool atomic_is_lock_free(atomic_type const volatile *obj);
+    Description
+2   The atomic_is_lock_free generic function indicates whether or not the object
+    pointed to by obj is lock-free. atomic_type can be any atomic type.
+    Returns
+3   The atomic_is_lock_free generic function returns nonzero (true) if and only if the
+    object's operations are lock-free. The result of a lock-free query on one object cannot be
+
+[<a name="#p278" href="p278">page 278</a>] (<a href="#Contents">Contents</a>)
+
+    inferred from the result of a lock-free query on another object.
+<a name="7.17.6" href="#7.17.6"><b>    7.17.6 Atomic integer and address types</b></a>
+1   For each line in the following table, the atomic type name is declared as the
+    corresponding direct type.
+
+
+
+
+[<a name="#p279" href="p279">page 279</a>] (<a href="#Contents">Contents</a>)
+
+               Atomic type name                              Direct type
+           atomic_char                           _Atomic    char
+           atomic_schar                          _Atomic    signed char
+           atomic_uchar                          _Atomic    unsigned char
+           atomic_short                          _Atomic    short
+           atomic_ushort                         _Atomic    unsigned short
+           atomic_int                            _Atomic    int
+           atomic_uint                           _Atomic    unsigned int
+           atomic_long                           _Atomic    long
+           atomic_ulong                          _Atomic    unsigned long
+           atomic_llong                          _Atomic    long long
+           atomic_ullong                         _Atomic    unsigned long long
+           atomic_char16_t                       _Atomic    char16_t
+           atomic_char32_t                       _Atomic    char32_t
+           atomic_wchar_t                        _Atomic    wchar_t
+           atomic_int_least8_t                   _Atomic    int_least8_t
+           atomic_uint_least8_t                  _Atomic    uint_least8_t
+           atomic_int_least16_t                  _Atomic    int_least16_t
+           atomic_uint_least16_t                 _Atomic    uint_least16_t
+           atomic_int_least32_t                  _Atomic    int_least32_t
+           atomic_uint_least32_t                 _Atomic    uint_least32_t
+           atomic_int_least64_t                  _Atomic    int_least64_t
+           atomic_uint_least64_t                 _Atomic    uint_least64_t
+           atomic_int_fast8_t                    _Atomic    int_fast8_t
+           atomic_uint_fast8_t                   _Atomic    uint_fast8_t
+           atomic_int_fast16_t                   _Atomic    int_fast16_t
+           atomic_uint_fast16_t                  _Atomic    uint_fast16_t
+           atomic_int_fast32_t                   _Atomic    int_fast32_t
+           atomic_uint_fast32_t                  _Atomic    uint_fast32_t
+           atomic_int_fast64_t                   _Atomic    int_fast64_t
+           atomic_uint_fast64_t                  _Atomic    uint_fast64_t
+           atomic_intptr_t                       _Atomic    intptr_t
+           atomic_uintptr_t                      _Atomic    uintptr_t
+           atomic_size_t                         _Atomic    size_t
+           atomic_ptrdiff_t                      _Atomic    ptrdiff_t
+           atomic_intmax_t                       _Atomic    intmax_t
+           atomic_uintmax_t                      _Atomic    uintmax_t
+2   The semantics of the operations on these types are defined in <a href="#7.17.7">7.17.7</a>.
+3   The atomic_bool type provides an atomic boolean.
+
+
+[<a name="#p280" href="p280">page 280</a>] (<a href="#Contents">Contents</a>)
+
+4   The atomic_address type provides atomic void * operations. The unit of
+    addition/subtraction shall be one byte.
+5   NOTE The representation of atomic integer and address types need not have the same size as their
+    corresponding regular types. They should have the same size whenever possible, as it eases effort required
+    to port existing code.
+
+<a name="7.17.7" href="#7.17.7"><b>    7.17.7 Operations on atomic types</b></a>
+1   There are only a few kinds of operations on atomic types, though there are many
+    instances of those kinds. This subclause specifies each general kind.
+<a name="7.17.7.1" href="#7.17.7.1"><b>    7.17.7.1 The atomic_store generic functions</b></a>
+    Synopsis
+1           #include <a href="#7.17">&lt;stdatomic.h&gt;</a>
+            void atomic_store(volatile A *object, C desired);
+            void atomic_store_explicit(volatile A *object,
+                 C desired, memory_order order);
+    Description
+2   The      order      argument    shall    not    be    memory_order_acquire,
+    memory_order_consume, nor memory_order_acq_rel. Atomically replace the
+    value pointed to by object with the value of desired. Memory is affected according
+    to the value of order.
+    Returns
+3   The atomic_store generic functions return no value.
+<a name="7.17.7.2" href="#7.17.7.2"><b>    7.17.7.2 The atomic_load generic functions</b></a>
+    Synopsis
+1           #include <a href="#7.17">&lt;stdatomic.h&gt;</a>
+            C atomic_load(volatile A *object);
+            C atomic_load_explicit(volatile A *object,
+                 memory_order order);
+    Description
+2   The order argument shall not be memory_order_release nor
+    memory_order_acq_rel. Memory is affected according to the value of order.
+    Returns
+    Atomically returns the value pointed to by object.
+
+
+
+
+[<a name="#p281" href="p281">page 281</a>] (<a href="#Contents">Contents</a>)
+
+<a name="7.17.7.3" href="#7.17.7.3"><b>    7.17.7.3 The atomic_exchange generic functions</b></a>
+    Synopsis
+1            #include <a href="#7.17">&lt;stdatomic.h&gt;</a>
+             C atomic_exchange(volatile A *object, C desired);
+             C atomic_exchange_explicit(volatile A *object,
+                  C desired, memory_order order);
+    Description
+2   Atomically replace the value pointed to by object with desired. Memory is affected
+    according to the value of order. These operations are read-modify-write operations
+    (<a href="#5.1.2.4">5.1.2.4</a>).
+    Returns
+3   Atomically returns the value pointed to by object immediately before the effects.
+<a name="7.17.7.4" href="#7.17.7.4"><b>    7.17.7.4 The atomic_compare_exchange generic functions</b></a>
+    Synopsis
+1            #include <a href="#7.17">&lt;stdatomic.h&gt;</a>
+             _Bool atomic_compare_exchange_strong(volatile A *object,
+                  C *expected, C desired);
+             _Bool atomic_compare_exchange_strong_explicit(
+                  volatile A *object, C *expected, C desired,
+                  memory_order success, memory_order failure);
+             _Bool atomic_compare_exchange_weak(volatile A *object,
+                  C *expected, C desired);
+             _Bool atomic_compare_exchange_weak_explicit(
+                  volatile A *object, C *expected, C desired,
+                  memory_order success, memory_order failure);
+    Description
+2   The failure argument shall not be memory_order_release nor
+    memory_order_acq_rel. The failure argument shall be no stronger than the
+    success argument. Atomically, compares the value pointed to by object for equality
+    with that in expected, and if true, replaces the value pointed to by object with
+    desired, and if false, updates the value in expected with the value pointed to by
+    object. Further, if the comparison is true, memory is affected according to the value of
+    success, and if the comparison is false, memory is affected according to the value of
+    failure. These operations are atomic read-modify-write operations (<a href="#5.1.2.4">5.1.2.4</a>).
+3   NOTE 1    The effect of the compare-and-exchange operations is
+
+
+
+
+[<a name="#p282" href="p282">page 282</a>] (<a href="#Contents">Contents</a>)
+
+             if (*object == *expected)
+                   *object = desired;
+             else
+                   *expected = *object;
+
+4   The weak compare-and-exchange operations may fail spuriously, that is, return zero
+    while leaving the value pointed to by expected unchanged.
+5   NOTE 2 This spurious failure enables implementation of compare-and-exchange on a broader class of
+    machines, e.g. load-locked store-conditional machines.
+
+6   EXAMPLE         A consequence of spurious failure is that nearly all uses of weak compare-and-exchange will
+    be in a loop.
+             exp = atomic_load(&amp;cur);
+             do {
+                   des = function(exp);
+             } while (!atomic_compare_exchange_weak(&amp;cur, &amp;exp, des));
+    When a compare-and-exchange is in a loop, the weak version will yield better performance on some
+    platforms. When a weak compare-and-exchange would require a loop and a strong one would not, the
+    strong one is preferable.
+
+    Returns
+7   The result of the comparison.
+<a name="7.17.7.5" href="#7.17.7.5"><b>    7.17.7.5 The atomic_fetch and modify generic functions</b></a>
+1   The following operations perform arithmetic and bitwise computations. All of these
+    operations are applicable to an object of any atomic integer type. Only addition and
+    subtraction are applicable to atomic_address. None of these operations is applicable
+    to atomic_bool. The key, operator, and computation correspondence is:
+     key            op          computation
+     add            +       addition
+     sub            -       subtraction
+     or             |       bitwise inclusive or
+     xor            ^       bitwise exclusive or
+     and            &amp;       bitwise and
+    Synopsis
+2            #include <a href="#7.17">&lt;stdatomic.h&gt;</a>
+             C atomic_fetch_key(volatile A *object, M operand);
+             C atomic_fetch_key_explicit(volatile A *object,
+                  M operand, memory_order order);
+    Description
+3   Atomically replaces the value pointed to by object with the result of the computation
+    applied to the value pointed to by object and the given operand. Memory is affected
+    according to the value of order. These operations are atomic read-modify-write
+[<a name="#p283" href="p283">page 283</a>] (<a href="#Contents">Contents</a>)
+
+    operations (<a href="#5.1.2.4">5.1.2.4</a>). For signed integer types, arithmetic is defined to use two's
+    complement representation with silent wrap-around on overflow; there are no undefined
+    results. For address types, the result may be an undefined address, but the operations
+    otherwise have no undefined behavior.
+    Returns
+4   Atomically, the value pointed to by object immediately before the effects.
+5   NOTE The operation of the atomic_fetch and modify generic functions are nearly equivalent to the
+    operation of the corresponding op= compound assignment operators. The only differences are that the
+    compound assignment operators are not guaranteed to operate atomically, and the value yielded by a
+    compound assignment operator is the updated value of the object, whereas the value returned by the
+    atomic_fetch and modify generic functions is the previous value of the atomic object.
+
+<a name="7.17.8" href="#7.17.8"><b>    7.17.8 Atomic flag type and operations</b></a>
+1   The atomic_flag type provides the classic test-and-set functionality. It has two
+    states, set and clear.
+2   Operations on an object of type atomic_flag shall be lock free.
+3   NOTE Hence the operations should also be address-free. No other type requires lock-free operations, so
+    the atomic_flag type is the minimum hardware-implemented type needed to conform to this
+    International standard. The remaining types can be emulated with atomic_flag, though with less than
+    ideal properties.
+
+4   The macro ATOMIC_FLAG_INIT may be used to initialize an atomic_flag to the
+    clear state. An atomic_flag that is not explicitly initialized with
+    ATOMIC_FLAG_INIT is initially in an indeterminate state.
+5   EXAMPLE
+            atomic_flag guard = ATOMIC_FLAG_INIT;
+
+<a name="7.17.8.1" href="#7.17.8.1"><b>    7.17.8.1 The atomic_flag_test_and_set functions</b></a>
+    Synopsis
+1           #include <a href="#7.17">&lt;stdatomic.h&gt;</a>
+            bool atomic_flag_test_and_set(
+                 volatile atomic_flag *object);
+            bool atomic_flag_test_and_set_explicit(
+                 volatile atomic_flag *object, memory_order order);
+    Description
+2   Atomically sets the value pointed to by object to true. Memory is affected according
+    to the value of order. These operations are atomic read-modify-write operations
+    (<a href="#5.1.2.4">5.1.2.4</a>).
+
+
+
+
+[<a name="#p284" href="p284">page 284</a>] (<a href="#Contents">Contents</a>)
+
+    Returns
+3   Atomically, the value of the object immediately before the effects.
+<a name="7.17.8.2" href="#7.17.8.2"><b>    7.17.8.2 The atomic_flag_clear functions</b></a>
+    Synopsis
+1           #include <a href="#7.17">&lt;stdatomic.h&gt;</a>
+            void atomic_flag_clear(volatile atomic_flag *object);
+            void atomic_flag_clear_explicit(
+                 volatile atomic_flag *object, memory_order order);
+    Description
+2   The order argument shall not be memory_order_acquire nor
+    memory_order_acq_rel. Atomically sets the value pointed to by object to false.
+    Memory is affected according to the value of order.
+    Returns
+3   The atomic_flag_clear functions return no value.
+
+
+
+
+[<a name="#p285" href="p285">page 285</a>] (<a href="#Contents">Contents</a>)
+
+<a name="7.18" href="#7.18"><b>    7.18 Boolean type and values &lt;stdbool.h&gt;</b></a>
+1   The header <a href="#7.18">&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.252)
+
+
+
+
+    252) See ''future library directions'' (<a href="#7.30.7">7.30.7</a>).
+
+[<a name="#p286" href="p286">page 286</a>] (<a href="#Contents">Contents</a>)
+
+<a name="7.19" href="#7.19"><b>    7.19 Common definitions &lt;stddef.h&gt;</b></a>
+1   The header <a href="#7.19">&lt;stddef.h&gt;</a> defines the following macros and declares the following types.
+    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;
+            max_align_t
+    which is an object type whose alignment is as great as is supported by the implementation
+    in all contexts; 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.
+
+[<a name="#p287" href="p287">page 287</a>] (<a href="#Contents">Contents</a>)
+
+Forward references: localization (<a href="#7.11">7.11</a>).
+
+
+
+
+[<a name="#p288" href="p288">page 288</a>] (<a href="#Contents">Contents</a>)
+
+<a name="7.20" href="#7.20"><b>    7.20 Integer types &lt;stdint.h&gt;</b></a>
+1   The header <a href="#7.20">&lt;stdint.h&gt;</a> declares sets of integer types having specified widths, and
+    defines corresponding sets of macros.253) 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,254) <a href="#7.20">&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.20">&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.20.1" href="#7.20.1"><b>    7.20.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).
+
+
+
+
+    253) See ''future library directions'' (<a href="#7.30.8">7.30.8</a>).
+    254) Some of these types may denote implementation-defined extended integer types.
+
+[<a name="#p289" href="p289">page 289</a>] (<a href="#Contents">Contents</a>)
+
+<a name="7.20.1.1" href="#7.20.1.1"><b>    7.20.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 such 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 and no
+    padding bits. Thus, uint24_t denotes such 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.20.1.2" href="#7.20.1.2"><b>    7.20.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.20.1.3" href="#7.20.1.3"><b>    7.20.1.3 Fastest minimum-width integer types</b></a>
+1   Each of the following types designates an integer type that is usually fastest255) 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 .
+
+
+
+
+    255) 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="#p290" href="p290">page 290</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.20.1.4" href="#7.20.1.4"><b>    7.20.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.20.1.5" href="#7.20.1.5"><b>    7.20.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.20.2" href="#7.20.2"><b>    7.20.2 Limits of specified-width integer types</b></a>
+1   The following object-like macros specify the minimum and maximum limits of the types *
+    declared in <a href="#7.20">&lt;stdint.h&gt;</a>. Each macro name corresponds to a similar type name in
+<a name="7.20.1" href="#7.20.1"><b>    7.20.1.</b></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
+    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="#p291" href="p291">page 291</a>] (<a href="#Contents">Contents</a>)
+
+<a name="7.20.2.1" href="#7.20.2.1"><b>    7.20.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.20.2.2" href="#7.20.2.2"><b>    7.20.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.20.2.3" href="#7.20.2.3"><b>    7.20.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.20.2.4" href="#7.20.2.4"><b>    7.20.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
+    -- maximum value of pointer-holding unsigned integer type
+       UINTPTR_MAX                                          216 - 1
+
+
+
+[<a name="#p292" href="p292">page 292</a>] (<a href="#Contents">Contents</a>)
+
+<a name="7.20.2.5" href="#7.20.2.5"><b>    7.20.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.20.3" href="#7.20.3"><b>    7.20.3 Limits of other integer types</b></a>
+1   The following object-like macros 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.256)
+    -- 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
+        WCHAR_MIN                                                   see below
+        WCHAR_MAX                                                   see below
+    -- limits of wint_t
+
+
+
+
+    256) A freestanding implementation need not provide all of these types.
+
+[<a name="#p293" href="p293">page 293</a>] (<a href="#Contents">Contents</a>)
+
+        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.19">7.19</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.257)
+5   If wint_t (see <a href="#7.28">7.28</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.20.4" href="#7.20.4"><b>    7.20.4 Macros for integer constants</b></a>
+1   The following function-like macros expand to integer constants suitable for initializing *
+    objects that have integer types corresponding to types defined in <a href="#7.20">&lt;stdint.h&gt;</a>. Each
+    macro name corresponds to a similar type name in <a href="#7.20.1.2">7.20.1.2</a> or <a href="#7.20.1.5">7.20.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.
+<a name="7.20.4.1" href="#7.20.4.1"><b>    7.20.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.
+
+
+
+
+    257) The values WCHAR_MIN and WCHAR_MAX do not necessarily correspond to members of the extended
+         character set.
+
+[<a name="#p294" href="p294">page 294</a>] (<a href="#Contents">Contents</a>)
+
+<a name="7.20.4.2" href="#7.20.4.2"><b>    7.20.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="#p295" href="p295">page 295</a>] (<a href="#Contents">Contents</a>)
+
+<a name="7.21" href="#7.21"><b>    7.21 Input/output &lt;stdio.h&gt;</b></a>
+<a name="7.21.1" href="#7.21.1"><b>    7.21.1 Introduction</b></a>
+1   The header <a href="#7.21">&lt;stdio.h&gt;</a> defines several macros, and declares three types and many
+    functions for performing input and output.
+2   The types declared are size_t (described in <a href="#7.19">7.19</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 a complete 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.19">7.19</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="#p296" href="p296">page 296</a>] (<a href="#Contents">Contents</a>)
+
+    guarantees can be opened;258)
+            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 minimum 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.28">&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.21.3">7.21.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.28">7.28</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.28">7.28</a> that perform
+      output from wide characters and wide strings: fputwc, fputws, putwc,
+      putwchar, fwprintf, wprintf, vfwprintf, and vwprintf.
+
+
+    258) 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="#p297" href="p297">page 297</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, printf, putc, putchar, puts, scanf, *
+      ungetc, vfprintf, vfscanf, vprintf, and vscanf.
+    Forward references: files (<a href="#7.21.3">7.21.3</a>), the fseek function (<a href="#7.21.9.2">7.21.9.2</a>), streams (<a href="#7.21.2">7.21.2</a>), the
+    tmpnam function (<a href="#7.21.4.4">7.21.4.4</a>), <a href="#7.28">&lt;wchar.h&gt;</a> (<a href="#7.28">7.28</a>).
+<a name="7.21.2" href="#7.21.2"><b>    7.21.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.259)
+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
+
+
+    259) 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="#p298" href="p298">page 298</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.)260)
+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.21.5.4">7.21.5.4</a>), the fwide function (<a href="#7.28.3.5">7.28.3.5</a>),
+    mbstate_t (<a href="#7.29.1">7.29.1</a>), the fgetpos function (<a href="#7.21.9.1">7.21.9.1</a>), the fsetpos function
+    (<a href="#7.21.9.3">7.21.9.3</a>).
+
+
+
+
+    260) The three predefined streams stdin, stdout, and stderr are unoriented at program startup.
+
+[<a name="#p299" href="p299">page 299</a>] (<a href="#Contents">Contents</a>)
+
+<a name="7.21.3" href="#7.21.3"><b>    7.21.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.21.5.3">7.21.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="#p300" href="p300">page 300</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.261)
+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)
+
+
+     261) 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="#p301" href="p301">page 301</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.22.4.4">7.22.4.4</a>), the fgetc function (<a href="#7.21.7.1">7.21.7.1</a>), the
+     fopen function (<a href="#7.21.5.3">7.21.5.3</a>), the fputc function (<a href="#7.21.7.3">7.21.7.3</a>), the setbuf function
+     (<a href="#7.21.5.5">7.21.5.5</a>), the setvbuf function (<a href="#7.21.5.6">7.21.5.6</a>), the fgetwc function (<a href="#7.28.3.1">7.28.3.1</a>), the
+     fputwc function (<a href="#7.28.3.3">7.28.3.3</a>), conversion state (<a href="#7.28.6">7.28.6</a>), the mbrtowc function
+     (<a href="#7.28.6.3.2">7.28.6.3.2</a>), the wcrtomb function (<a href="#7.28.6.3.3">7.28.6.3.3</a>).
+<a name="7.21.4" href="#7.21.4"><b>     7.21.4 Operations on files</b></a>
+<a name="7.21.4.1" href="#7.21.4.1"><b>     7.21.4.1 The remove function</b></a>
+     Synopsis
+1           #include <a href="#7.21">&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.21.4.2" href="#7.21.4.2"><b>     7.21.4.2 The rename function</b></a>
+     Synopsis
+1           #include <a href="#7.21">&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="#p302" href="p302">page 302</a>] (<a href="#Contents">Contents</a>)
+
+    Returns
+3   The rename function returns zero if the operation succeeds, nonzero if it fails,262) in
+    which case if the file existed previously it is still known by its original name.
+<a name="7.21.4.3" href="#7.21.4.3"><b>    7.21.4.3 The tmpfile function</b></a>
+    Synopsis
+1           #include <a href="#7.21">&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.21.5.3">7.21.5.3</a>).
+<a name="7.21.4.4" href="#7.21.4.4"><b>    7.21.4.4 The tmpnam function</b></a>
+    Synopsis
+1           #include <a href="#7.21">&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.263) The function is potentially capable of generating at
+
+
+    262) 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.
+    263) 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="#p303" href="p303">page 303</a>] (<a href="#Contents">Contents</a>)
+
+    least 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   Calls to the tmpnam function with a null pointer argument may introduce data races with
+    each other. 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.21.5" href="#7.21.5"><b>    7.21.5 File access functions</b></a>
+<a name="7.21.5.1" href="#7.21.5.1"><b>    7.21.5.1 The fclose function</b></a>
+    Synopsis
+1          #include <a href="#7.21">&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="#p304" href="p304">page 304</a>] (<a href="#Contents">Contents</a>)
+
+<a name="7.21.5.2" href="#7.21.5.2"><b>    7.21.5.2 The fflush function</b></a>
+    Synopsis
+1           #include <a href="#7.21">&lt;stdio.h&gt;</a>
+            int fflush(FILE *stream);
+    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.21.5.3">7.21.5.3</a>).
+<a name="7.21.5.3" href="#7.21.5.3"><b>    7.21.5.3 The fopen function</b></a>
+    Synopsis
+1           #include <a href="#7.21">&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.264)
+    r                     open text file for reading
+    w                     truncate to zero length or create text file for writing
+    wx                    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
+
+
+    264) 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.21.2">7.21.2</a>).
+
+[<a name="#p305" href="p305">page 305</a>] (<a href="#Contents">Contents</a>)
+
+    wbx               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
+    w+x               create text file for update
+    a+                append; open or create text file for update, writing at end-of-file
+    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
+    w+bx or wb+x      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 exclusive mode ('x' as the last character in the mode argument)
+    fails if the file already exists or cannot be created. Otherwise, the file is created with
+    exclusive (also known as non-shared) access to the extent that the underlying system
+    supports exclusive access.
+6   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.
+7   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.
+8   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
+9   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.21.9">7.21.9</a>).
+
+
+
+[<a name="#p306" href="p306">page 306</a>] (<a href="#Contents">Contents</a>)
+
+<a name="7.21.5.4" href="#7.21.5.4"><b>    7.21.5.4 The freopen function</b></a>
+    Synopsis
+1           #include <a href="#7.21">&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
+    as in the fopen function.265)
+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.21.5.5" href="#7.21.5.5"><b>    7.21.5.5 The setbuf function</b></a>
+    Synopsis
+1           #include <a href="#7.21">&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.
+
+
+
+
+    265) 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="#p307" href="p307">page 307</a>] (<a href="#Contents">Contents</a>)
+
+    Returns
+3   The setbuf function returns no value.
+    Forward references: the setvbuf function (<a href="#7.21.5.6">7.21.5.6</a>).
+<a name="7.21.5.6" href="#7.21.5.6"><b>    7.21.5.6 The setvbuf function</b></a>
+    Synopsis
+1           #include <a href="#7.21">&lt;stdio.h&gt;</a>
+            int setvbuf(FILE * restrict stream,
+                 char * restrict buf,
+                 int mode, size_t size);
+    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 function266) 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.
+
+
+
+
+    266) 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.
+
+[<a name="#p308" href="p308">page 308</a>] (<a href="#Contents">Contents</a>)
+
+<a name="7.21.6" href="#7.21.6"><b>    7.21.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.267)
+<a name="7.21.6.1" href="#7.21.6.1"><b>    7.21.6.1 The fprintf function</b></a>
+    Synopsis
+1            #include <a href="#7.21">&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
+    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.268)
+    -- 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
+
+
+    267) The fprintf functions perform writes to memory for the %n specifier.
+    268) Note that 0 is taken as a flag, not as the beginning of a field width.
+
+[<a name="#p309" href="p309">page 309</a>] (<a href="#Contents">Contents</a>)
+
+        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
+            specified.)269)
+    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
+
+
+    269) The results of all floating conversions of a negative zero, and of negative values that round to zero,
+         include a minus sign.
+
+[<a name="#p310" href="p310">page 310</a>] (<a href="#Contents">Contents</a>)
+
+              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.
+    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.
+
+
+[<a name="#p311" href="p311">page 311</a>] (<a href="#Contents">Contents</a>)
+
+    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.
+    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.270)
+    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
+
+
+    270) 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="#p312" href="p312">page 312</a>] (<a href="#Contents">Contents</a>)
+
+              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
+              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 character271) 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
+
+
+
+
+271) 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.
+
+[<a name="#p313" href="p313">page 313</a>] (<a href="#Contents">Contents</a>)
+
+              distinguish272) 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.273) Characters from the array are
+              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
+
+272) 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.
+273) No special provisions are made for multibyte characters.
+
+[<a name="#p314" href="p314">page 314</a>] (<a href="#Contents">Contents</a>)
+
+                    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.274)
+     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.275) 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.276) 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
+
+
+     274) Redundant shift sequences may result if multibyte characters have a state-dependent encoding.
+     275) See ''future library directions'' (<a href="#7.30.9">7.30.9</a>).
+     276) 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="#p315" href="p315">page 315</a>] (<a href="#Contents">Contents</a>)
+
+     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.21">&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(<a href="#1.0">1.0</a>));
+
+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.
+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.28.6">7.28.6</a>), the wcrtomb function (<a href="#7.28.6.3.3">7.28.6.3.3</a>).
+
+
+
+[<a name="#p316" href="p316">page 316</a>] (<a href="#Contents">Contents</a>)
+
+<a name="7.21.6.2" href="#7.21.6.2"><b>    7.21.6.2 The fscanf function</b></a>
+    Synopsis
+1           #include <a href="#7.21">&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).
+    -- 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. When all directives
+    have been executed, or 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
+
+[<a name="#p317" href="p317">page 317</a>] (<a href="#Contents">Contents</a>)
+
+     following steps:
+8    Input white-space characters (as specified by the isspace function) are skipped, unless
+     the specification includes a [, c, or n specifier.277)
+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.278)
+     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
+     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.
+
+
+
+     277) These white-space characters are not counted against a specified field width.
+     278) 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="#p318" href="p318">page 318</a>] (<a href="#Contents">Contents</a>)
+
+     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.
+     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.
+
+
+[<a name="#p319" href="p319">page 319</a>] (<a href="#Contents">Contents</a>)
+
+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).279)
+              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.279)
+              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.
+[             Matches a nonempty sequence of characters from a set of expected characters
+              (the scanset).279)
+              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
+
+279) 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="#p320" href="p320">page 320</a>] (<a href="#Contents">Contents</a>)
+
+                    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.
+     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.280)
+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.
+
+
+
+     280) See ''future library directions'' (<a href="#7.30.9">7.30.9</a>).
+
+[<a name="#p321" href="p321">page 321</a>] (<a href="#Contents">Contents</a>)
+
+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 the first conversion (if any) has completed. 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.21">&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.21">&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:
+              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.21">&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
+
+[<a name="#p322" href="p322">page 322</a>] (<a href="#Contents">Contents</a>)
+
+     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.21">&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:
+               #include <a href="#7.21">&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.21">&lt;stdio.h&gt;</a>
+               #include <a href="#7.19">&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:
+
+
+
+
+[<a name="#p323" href="p323">page 323</a>] (<a href="#Contents">Contents</a>)
+
+             #include <a href="#7.21">&lt;stdio.h&gt;</a>
+             #include <a href="#7.19">&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.21">&lt;stdio.h&gt;</a>
+             #include <a href="#7.19">&lt;stddef.h&gt;</a>
+             /* ... */
+             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.22.1.3">7.22.1.3</a>), the
+     strtol, strtoll, strtoul, and strtoull functions (<a href="#7.22.1.4">7.22.1.4</a>), conversion state
+     (<a href="#7.28.6">7.28.6</a>), the wcrtomb function (<a href="#7.28.6.3.3">7.28.6.3.3</a>).
+<a name="7.21.6.3" href="#7.21.6.3"><b>     7.21.6.3 The printf function</b></a>
+     Synopsis
+1            #include <a href="#7.21">&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.21.6.4" href="#7.21.6.4"><b>     7.21.6.4 The scanf function</b></a>
+     Synopsis
+1            #include <a href="#7.21">&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.
+
+
+
+[<a name="#p324" href="p324">page 324</a>] (<a href="#Contents">Contents</a>)
+
+    Returns
+3   The scanf function returns the value of the macro EOF if an input failure occurs before
+    the first conversion (if any) has completed. 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.21.6.5" href="#7.21.6.5"><b>    7.21.6.5 The snprintf function</b></a>
+    Synopsis
+1           #include <a href="#7.21">&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.
+    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.21.6.6" href="#7.21.6.6"><b>    7.21.6.6 The sprintf function</b></a>
+    Synopsis
+1           #include <a href="#7.21">&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="#p325" href="p325">page 325</a>] (<a href="#Contents">Contents</a>)
+
+<a name="7.21.6.7" href="#7.21.6.7"><b>    7.21.6.7 The sscanf function</b></a>
+    Synopsis
+1          #include <a href="#7.21">&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 the first conversion (if any) has completed. 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="7.21.6.8" href="#7.21.6.8"><b>    7.21.6.8 The vfprintf function</b></a>
+    Synopsis
+1          #include <a href="#7.16">&lt;stdarg.h&gt;</a>
+           #include <a href="#7.21">&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.281)
+    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.
+
+
+
+
+    281) 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="#p326" href="p326">page 326</a>] (<a href="#Contents">Contents</a>)
+
+            #include <a href="#7.16">&lt;stdarg.h&gt;</a>
+            #include <a href="#7.21">&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);
+            }
+
+<a name="7.21.6.9" href="#7.21.6.9"><b>    7.21.6.9 The vfscanf function</b></a>
+    Synopsis
+1           #include <a href="#7.16">&lt;stdarg.h&gt;</a>
+            #include <a href="#7.21">&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.281)
+    Returns
+3   The vfscanf function returns the value of the macro EOF if an input failure occurs
+    before the first conversion (if any) has completed. 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.21.6.10" href="#7.21.6.10"><b>    7.21.6.10 The vprintf function</b></a>
+    Synopsis
+1           #include <a href="#7.16">&lt;stdarg.h&gt;</a>
+            #include <a href="#7.21">&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
+
+[<a name="#p327" href="p327">page 327</a>] (<a href="#Contents">Contents</a>)
+
+    possibly subsequent va_arg calls). The vprintf function does not invoke the
+    va_end macro.281)
+    Returns
+3   The vprintf function returns the number of characters transmitted, or a negative value
+    if an output or encoding error occurred.
+<a name="7.21.6.11" href="#7.21.6.11"><b>    7.21.6.11 The vscanf function</b></a>
+    Synopsis
+1          #include <a href="#7.16">&lt;stdarg.h&gt;</a>
+           #include <a href="#7.21">&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.281)
+    Returns
+3   The vscanf function returns the value of the macro EOF if an input failure occurs
+    before the first conversion (if any) has completed. 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.21.6.12" href="#7.21.6.12"><b>    7.21.6.12 The vsnprintf function</b></a>
+    Synopsis
+1          #include <a href="#7.16">&lt;stdarg.h&gt;</a>
+           #include <a href="#7.21">&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.281) If copying takes place between objects that overlap, the behavior is
+    undefined.
+
+
+
+[<a name="#p328" href="p328">page 328</a>] (<a href="#Contents">Contents</a>)
+
+    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="7.21.6.13" href="#7.21.6.13"><b>    7.21.6.13 The vsprintf function</b></a>
+    Synopsis
+1           #include <a href="#7.16">&lt;stdarg.h&gt;</a>
+            #include <a href="#7.21">&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.281) 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.21.6.14" href="#7.21.6.14"><b>    7.21.6.14 The vsscanf function</b></a>
+    Synopsis
+1           #include <a href="#7.16">&lt;stdarg.h&gt;</a>
+            #include <a href="#7.21">&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.281)
+    Returns
+3   The vsscanf function returns the value of the macro EOF if an input failure occurs
+    before the first conversion (if any) has completed. Otherwise, the vsscanf function
+[<a name="#p329" href="p329">page 329</a>] (<a href="#Contents">Contents</a>)
+
+    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.21.7" href="#7.21.7"><b>    7.21.7 Character input/output functions</b></a>
+<a name="7.21.7.1" href="#7.21.7.1"><b>    7.21.7.1 The fgetc function</b></a>
+    Synopsis
+1           #include <a href="#7.21">&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.282)
+<a name="7.21.7.2" href="#7.21.7.2"><b>    7.21.7.2 The fgets function</b></a>
+    Synopsis
+1           #include <a href="#7.21">&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.
+
+    282) An end-of-file and a read error can be distinguished by use of the feof and ferror functions.
+
+[<a name="#p330" href="p330">page 330</a>] (<a href="#Contents">Contents</a>)
+
+<a name="7.21.7.3" href="#7.21.7.3"><b>    7.21.7.3 The fputc function</b></a>
+    Synopsis
+1           #include <a href="#7.21">&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.21.7.4" href="#7.21.7.4"><b>    7.21.7.4 The fputs function</b></a>
+    Synopsis
+1           #include <a href="#7.21">&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.21.7.5" href="#7.21.7.5"><b>    7.21.7.5 The getc function</b></a>
+    Synopsis
+1           #include <a href="#7.21">&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="#p331" href="p331">page 331</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.21.7.6" href="#7.21.7.6"><b>    7.21.7.6 The getchar function</b></a>
+    Synopsis
+1          #include <a href="#7.21">&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.21.7.7" href="#7.21.7.7"><b>    7.21.7.7 The putc function</b></a>
+    Synopsis
+1          #include <a href="#7.21">&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.21.7.8" href="#7.21.7.8"><b>    7.21.7.8 The putchar function</b></a>
+    Synopsis
+1          #include <a href="#7.21">&lt;stdio.h&gt;</a>
+           int putchar(int c);
+    Description
+2   The putchar function is equivalent to putc with the second argument stdout.
+
+
+[<a name="#p332" href="p332">page 332</a>] (<a href="#Contents">Contents</a>)
+
+    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.21.7.9" href="#7.21.7.9"><b>    7.21.7.9 The puts function</b></a>
+    Synopsis
+1           #include <a href="#7.21">&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="7.21.7.10" href="#7.21.7.10"><b>    7.21.7.10 The ungetc function</b></a>
+    Synopsis
+1           #include <a href="#7.21">&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.
+
+[<a name="#p333" href="p333">page 333</a>] (<a href="#Contents">Contents</a>)
+
+    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.283)
+    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.21.9">7.21.9</a>).
+<a name="7.21.8" href="#7.21.8"><b>    7.21.8 Direct input/output functions</b></a>
+<a name="7.21.8.1" href="#7.21.8.1"><b>    7.21.8.1 The fread function</b></a>
+    Synopsis
+1            #include <a href="#7.21">&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.
+
+
+
+
+    283) See ''future library directions'' (<a href="#7.30.9">7.30.9</a>).
+
+[<a name="#p334" href="p334">page 334</a>] (<a href="#Contents">Contents</a>)
+
+<a name="7.21.8.2" href="#7.21.8.2"><b>    7.21.8.2 The fwrite function</b></a>
+    Synopsis
+1           #include <a href="#7.21">&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.
+    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.21.9" href="#7.21.9"><b>    7.21.9 File positioning functions</b></a>
+<a name="7.21.9.1" href="#7.21.9.1"><b>    7.21.9.1 The fgetpos function</b></a>
+    Synopsis
+1           #include <a href="#7.21">&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.21.9.3">7.21.9.3</a>).
+
+
+
+
+[<a name="#p335" href="p335">page 335</a>] (<a href="#Contents">Contents</a>)
+
+<a name="7.21.9.2" href="#7.21.9.2"><b>    7.21.9.2 The fseek function</b></a>
+    Synopsis
+1          #include <a href="#7.21">&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.
+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.21.9.4">7.21.9.4</a>).
+<a name="7.21.9.3" href="#7.21.9.3"><b>    7.21.9.3 The fsetpos function</b></a>
+    Synopsis
+1          #include <a href="#7.21">&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
+
+[<a name="#p336" href="p336">page 336</a>] (<a href="#Contents">Contents</a>)
+
+    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.21.9.4" href="#7.21.9.4"><b>    7.21.9.4 The ftell function</b></a>
+    Synopsis
+1           #include <a href="#7.21">&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
+    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.21.9.5" href="#7.21.9.5"><b>    7.21.9.5 The rewind function</b></a>
+    Synopsis
+1           #include <a href="#7.21">&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="#p337" href="p337">page 337</a>] (<a href="#Contents">Contents</a>)
+
+<a name="7.21.10" href="#7.21.10"><b>    7.21.10 Error-handling functions</b></a>
+<a name="7.21.10.1" href="#7.21.10.1"><b>    7.21.10.1 The clearerr function</b></a>
+    Synopsis
+1          #include <a href="#7.21">&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="7.21.10.2" href="#7.21.10.2"><b>    7.21.10.2 The feof function</b></a>
+    Synopsis
+1          #include <a href="#7.21">&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.21.10.3" href="#7.21.10.3"><b>    7.21.10.3 The ferror function</b></a>
+    Synopsis
+1          #include <a href="#7.21">&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="#p338" href="p338">page 338</a>] (<a href="#Contents">Contents</a>)
+
+<a name="7.21.10.4" href="#7.21.10.4"><b>    7.21.10.4 The perror function</b></a>
+    Synopsis
+1           #include <a href="#7.21">&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.23.6.2">7.23.6.2</a>).
+
+
+
+
+[<a name="#p339" href="p339">page 339</a>] (<a href="#Contents">Contents</a>)
+
+<a name="7.22" href="#7.22"><b>    7.22 General utilities &lt;stdlib.h&gt;</b></a>
+1   The header <a href="#7.22">&lt;stdlib.h&gt;</a> declares five types and several functions of general utility, and
+    defines several macros.284)
+2   The types declared are size_t and wchar_t (both described in <a href="#7.19">7.19</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.19">7.19</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.
+
+
+
+
+    284) See ''future library directions'' (<a href="#7.30.10">7.30.10</a>).
+
+[<a name="#p340" href="p340">page 340</a>] (<a href="#Contents">Contents</a>)
+
+<a name="7.22.1" href="#7.22.1"><b>    7.22.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.22.1.1" href="#7.22.1.1"><b>    7.22.1.1 The atof function</b></a>
+    Synopsis
+1           #include <a href="#7.22">&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.22.1.3">7.22.1.3</a>).
+<a name="7.22.1.2" href="#7.22.1.2"><b>    7.22.1.2 The atoi, atol, and atoll functions</b></a>
+    Synopsis
+1           #include <a href="#7.22">&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.22.1.4">7.22.1.4</a>).
+
+
+
+[<a name="#p341" href="p341">page 341</a>] (<a href="#Contents">Contents</a>)
+
+<a name="7.22.1.3" href="#7.22.1.3"><b>    7.22.1.3 The strtod, strtof, and strtold functions</b></a>
+    Synopsis
+1          #include <a href="#7.22">&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="#p342" href="p342">page 342</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.285)
+    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.286) 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
+
+    285) 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.
+    286) An implementation may use the n-char sequence to determine extra information to be represented in
+         the NaN's significand.
+
+[<a name="#p343" href="p343">page 343</a>] (<a href="#Contents">Contents</a>)
+
+     stipulation that the error with respect to D should have a correct sign for the current
+     rounding direction.287)
+     Returns
+10   The functions return the converted value, if any. If no conversion could be performed,
+     zero is returned. If the correct value overflows and default rounding is in effect (<a href="#7.12.1">7.12.1</a>),
+     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.22.1.4" href="#7.22.1.4"><b>     7.22.1.4 The strtol, strtoll, strtoul, and strtoull functions</b></a>
+     Synopsis
+1            #include <a href="#7.22">&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
+
+
+     287) 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="#p344" href="p344">page 344</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="#p345" href="p345">page 345</a>] (<a href="#Contents">Contents</a>)
+
+<a name="7.22.2" href="#7.22.2"><b>    7.22.2 Pseudo-random sequence generation functions</b></a>
+<a name="7.22.2.1" href="#7.22.2.1"><b>    7.22.2.1 The rand function</b></a>
+    Synopsis
+1           #include <a href="#7.22">&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.288)
+3   The rand function is not required to avoid data races. 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.22.2.2" href="#7.22.2.2"><b>    7.22.2.2 The srand function</b></a>
+    Synopsis
+1           #include <a href="#7.22">&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.
+
+
+
+
+    288) There are no guarantees as to the quality of the random sequence produced and some implementations
+         are known to produce sequences with distressingly non-random low-order bits. Applications with
+         particular requirements should use a generator that is known to be sufficient for their needs.
+
+[<a name="#p346" href="p346">page 346</a>] (<a href="#Contents">Contents</a>)
+
+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
+            {
+                  next = next * 1103515245 + 12345;
+                  return (unsigned int)(next/65536) % 32768;
+            }
+            void srand(unsigned int seed)
+            {
+                  next = seed;
+            }
+
+<a name="7.22.3" href="#7.22.3"><b>    7.22.3 Memory management functions</b></a>
+1   The order and contiguity of storage allocated by successive calls to the
+    aligned_alloc, 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 with a fundamental alignment requirement 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.22.3.1" href="#7.22.3.1"><b>    7.22.3.1 The aligned_alloc function</b></a>
+    Synopsis
+1           #include <a href="#7.22">&lt;stdlib.h&gt;</a>
+            void *aligned_alloc(size_t alignment, size_t size);
+    Description
+2   The aligned_alloc function allocates space for an object whose alignment is
+    specified by alignment, whose size is specified by size, and whose value is
+    indeterminate. The value of alignment shall be a valid alignment supported by the
+    implementation and the value of size shall be an integral multiple of alignment.
+    Returns
+3   The aligned_alloc function returns either a null pointer or a pointer to the allocated
+    space.
+
+
+
+
+[<a name="#p347" href="p347">page 347</a>] (<a href="#Contents">Contents</a>)
+
+<a name="7.22.3.2" href="#7.22.3.2"><b>    7.22.3.2 The calloc function</b></a>
+    Synopsis
+1           #include <a href="#7.22">&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.289)
+    Returns
+3   The calloc function returns either a null pointer or a pointer to the allocated space.
+<a name="7.22.3.3" href="#7.22.3.3"><b>    7.22.3.3 The free function</b></a>
+    Synopsis
+1           #include <a href="#7.22">&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 a memory management
+    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.22.3.4" href="#7.22.3.4"><b>    7.22.3.4 The malloc function</b></a>
+    Synopsis
+1           #include <a href="#7.22">&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.
+
+
+
+
+    289) Note that this need not be the same as the representation of floating-point zero or a null pointer
+         constant.
+
+[<a name="#p348" href="p348">page 348</a>] (<a href="#Contents">Contents</a>)
+
+    Returns
+3   The malloc function returns either a null pointer or a pointer to the allocated space.
+<a name="7.22.3.5" href="#7.22.3.5"><b>    7.22.3.5 The realloc function</b></a>
+    Synopsis
+1           #include <a href="#7.22">&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 a memory
+    management 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="7.22.4" href="#7.22.4"><b>    7.22.4 Communication with the environment</b></a>
+<a name="7.22.4.1" href="#7.22.4.1"><b>    7.22.4.1 The abort function</b></a>
+    Synopsis
+1           #include <a href="#7.22">&lt;stdlib.h&gt;</a>
+            _Noreturn 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).
+
+
+
+
+[<a name="#p349" href="p349">page 349</a>] (<a href="#Contents">Contents</a>)
+
+    Returns
+3   The abort function does not return to its caller.
+<a name="7.22.4.2" href="#7.22.4.2"><b>    7.22.4.2 The atexit function</b></a>
+    Synopsis
+1          #include <a href="#7.22">&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.290)
+    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 at_quick_exit function (<a href="#7.22.4.3">7.22.4.3</a>), the exit function
+    (<a href="#7.22.4.4">7.22.4.4</a>).
+<a name="7.22.4.3" href="#7.22.4.3"><b>    7.22.4.3 The at_quick_exit function</b></a>
+    Synopsis
+1          #include <a href="#7.22">&lt;stdlib.h&gt;</a>
+           int at_quick_exit(void (*func)(void));
+    Description
+2   The at_quick_exit function registers the function pointed to by func, to be called
+    without arguments should quick_exit be called.291)
+    Environmental limits
+3   The implementation shall support the registration of at least 32 functions.
+    Returns
+4   The at_quick_exit function returns zero if the registration succeeds, nonzero if it
+    fails.
+    Forward references: the quick_exit function (<a href="#7.22.4.7">7.22.4.7</a>).
+
+
+    290) The atexit function registrations are distinct from the at_quick_exit registrations, so
+         applications may need to call both registration functions with the same argument.
+    291) The at_quick_exit function registrations are distinct from the atexit registrations, so
+         applications may need to call both registration functions with the same argument.
+
+[<a name="#p350" href="p350">page 350</a>] (<a href="#Contents">Contents</a>)
+
+<a name="7.22.4.4" href="#7.22.4.4"><b>    7.22.4.4 The exit function</b></a>
+    Synopsis
+1           #include <a href="#7.22">&lt;stdlib.h&gt;</a>
+            _Noreturn void exit(int status);
+    Description
+2   The exit function causes normal program termination to occur. No functions registered
+    by the at_quick_exit function are called. If a program calls the exit function
+    more than once, or calls the quick_exit function in addition to the exit function, the
+    behavior is undefined.
+3   First, all functions registered by the atexit function are called, in the reverse order of
+    their registration,292) 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.22.4.5" href="#7.22.4.5"><b>    7.22.4.5 The _Exit function</b></a>
+    Synopsis
+1           #include <a href="#7.22">&lt;stdlib.h&gt;</a>
+            _Noreturn 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, the
+    at_quick_exit 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
+
+
+    292) Each function is called as many times as it was registered, and in the correct order with respect to
+         other registered functions.
+
+[<a name="#p351" href="p351">page 351</a>] (<a href="#Contents">Contents</a>)
+
+    the exit function (<a href="#7.22.4.4">7.22.4.4</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.
+<a name="7.22.4.6" href="#7.22.4.6"><b>    7.22.4.6 The getenv function</b></a>
+    Synopsis
+1           #include <a href="#7.22">&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. The
+    getenv function need not avoid data races with other threads of execution that modify
+    the environment list.293)
+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.22.4.7" href="#7.22.4.7"><b>    7.22.4.7 The quick_exit function</b></a>
+    Synopsis
+1           #include <a href="#7.22">&lt;stdlib.h&gt;</a>
+            _Noreturn void quick_exit(int status);
+    Description
+2   The quick_exit function causes normal program termination to occur. No functions
+    registered by the atexit function or signal handlers registered by the signal function
+    are called. If a program calls the quick_exit function more than once, or calls the
+    exit function in addition to the quick_exit function, the behavior is undefined.
+3   The quick_exit function first calls all functions registered by the at_quick_exit
+    function, in the reverse order of their registration,294) except that a function is called after
+
+
+    293) Many implementations provide non-standard functions that modify the environment list.
+
+[<a name="#p352" href="p352">page 352</a>] (<a href="#Contents">Contents</a>)
+
+    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   Then control is returned to the host environment by means of the function call
+    _Exit(status).
+    Returns
+5   The quick_exit function cannot return to its caller.
+<a name="7.22.4.8" href="#7.22.4.8"><b>    7.22.4.8 The system function</b></a>
+    Synopsis
+1           #include <a href="#7.22">&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="7.22.5" href="#7.22.5"><b>    7.22.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.295) The first argument when called from bsearch
+    shall equal key.
+
+
+
+    294) Each function is called as many times as it was registered, and in the correct order with respect to
+         other registered functions.
+
+[<a name="#p353" href="p353">page 353</a>] (<a href="#Contents">Contents</a>)
+
+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.22.5.1" href="#7.22.5.1"><b>    7.22.5.1 The bsearch function</b></a>
+    Synopsis
+1            #include <a href="#7.22">&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
+    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.296)
+    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
+
+
+    295) 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
+
+    296) In practice, the entire array is sorted according to the comparison function.
+
+[<a name="#p354" href="p354">page 354</a>] (<a href="#Contents">Contents</a>)
+
+    matched is unspecified.
+<a name="7.22.5.2" href="#7.22.5.2"><b>    7.22.5.2 The qsort function</b></a>
+    Synopsis
+1           #include <a href="#7.22">&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.
+<a name="7.22.6" href="#7.22.6"><b>    7.22.6 Integer arithmetic functions</b></a>
+<a name="7.22.6.1" href="#7.22.6.1"><b>    7.22.6.1 The abs, labs and llabs functions</b></a>
+    Synopsis
+1           #include <a href="#7.22">&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.297)
+    Returns
+3   The abs, labs, and llabs, functions return the absolute value.
+
+
+
+
+    297) The absolute value of the most negative number cannot be represented in two's complement.
+
+[<a name="#p355" href="p355">page 355</a>] (<a href="#Contents">Contents</a>)
+
+<a name="7.22.6.2" href="#7.22.6.2"><b>    7.22.6.2 The div, ldiv, and lldiv functions</b></a>
+    Synopsis
+1            #include <a href="#7.22">&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.
+<a name="7.22.7" href="#7.22.7"><b>    7.22.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 at program startup and can be returned to that 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.298) Changing the LC_CTYPE
+    category causes the conversion state of these functions to be indeterminate.
+<a name="7.22.7.1" href="#7.22.7.1"><b>    7.22.7.1 The mblen function</b></a>
+    Synopsis
+1            #include <a href="#7.22">&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
+
+
+
+    298) 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="#p356" href="p356">page 356</a>] (<a href="#Contents">Contents</a>)
+
+            mbtowc((wchar_t *)0, (const char *)0, 0);
+            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.22.7.2">7.22.7.2</a>).
+<a name="7.22.7.2" href="#7.22.7.2"><b>    7.22.7.2 The mbtowc function</b></a>
+    Synopsis
+1           #include <a href="#7.22">&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="#p357" href="p357">page 357</a>] (<a href="#Contents">Contents</a>)
+
+<a name="7.22.7.3" href="#7.22.7.3"><b>    7.22.7.3 The wctomb function</b></a>
+    Synopsis
+1          #include <a href="#7.22">&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.
+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.22.8" href="#7.22.8"><b>    7.22.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.22.8.1" href="#7.22.8.1"><b>    7.22.8.1 The mbstowcs function</b></a>
+    Synopsis
+1          #include <a href="#7.22">&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
+[<a name="#p358" href="p358">page 358</a>] (<a href="#Contents">Contents</a>)
+
+    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.299)
+<a name="7.22.8.2" href="#7.22.8.2"><b>    7.22.8.2 The wcstombs function</b></a>
+    Synopsis
+1            #include <a href="#7.22">&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.299)
+
+
+
+
+    299) The array will not be null-terminated if the value returned is n.
+
+[<a name="#p359" href="p359">page 359</a>] (<a href="#Contents">Contents</a>)
+
+<a name="7.23" href="#7.23"><b>    7.23 String handling &lt;string.h&gt;</b></a>
+<a name="7.23.1" href="#7.23.1"><b>    7.23.1 String function conventions</b></a>
+1   The header <a href="#7.23">&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.300) The type is size_t and the macro is NULL (both described in
+<a name="7.19)" href="#7.19)"><b>    7.19). 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.23.2" href="#7.23.2"><b>    7.23.2 Copying functions</b></a>
+<a name="7.23.2.1" href="#7.23.2.1"><b>    7.23.2.1 The memcpy function</b></a>
+    Synopsis
+1            #include <a href="#7.23">&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.
+
+
+
+
+    300) See ''future library directions'' (<a href="#7.30.11">7.30.11</a>).
+
+[<a name="#p360" href="p360">page 360</a>] (<a href="#Contents">Contents</a>)
+
+<a name="7.23.2.2" href="#7.23.2.2"><b>    7.23.2.2 The memmove function</b></a>
+    Synopsis
+1           #include <a href="#7.23">&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.23.2.3" href="#7.23.2.3"><b>    7.23.2.3 The strcpy function</b></a>
+    Synopsis
+1           #include <a href="#7.23">&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.23.2.4" href="#7.23.2.4"><b>    7.23.2.4 The strncpy function</b></a>
+    Synopsis
+1           #include <a href="#7.23">&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="#p361" href="p361">page 361</a>] (<a href="#Contents">Contents</a>)
+
+    s1.301) 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.23.3" href="#7.23.3"><b>    7.23.3 Concatenation functions</b></a>
+<a name="7.23.3.1" href="#7.23.3.1"><b>    7.23.3.1 The strcat function</b></a>
+    Synopsis
+1            #include <a href="#7.23">&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.23.3.2" href="#7.23.3.2"><b>    7.23.3.2 The strncat function</b></a>
+    Synopsis
+1            #include <a href="#7.23">&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.302) If copying
+
+    301) 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.
+    302) Thus, the maximum number of characters that can end up in the array pointed to by s1 is
+         strlen(s1)+n+1.
+
+[<a name="#p362" href="p362">page 362</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.23.6.3">7.23.6.3</a>).
+<a name="7.23.4" href="#7.23.4"><b>    7.23.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.23.4.1" href="#7.23.4.1"><b>    7.23.4.1 The memcmp function</b></a>
+    Synopsis
+1           #include <a href="#7.23">&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.303)
+    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.23.4.2" href="#7.23.4.2"><b>    7.23.4.2 The strcmp function</b></a>
+    Synopsis
+1           #include <a href="#7.23">&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
+
+    303) 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="#p363" href="p363">page 363</a>] (<a href="#Contents">Contents</a>)
+
+    pointed to by s2.
+<a name="7.23.4.3" href="#7.23.4.3"><b>    7.23.4.3 The strcoll function</b></a>
+    Synopsis
+1          #include <a href="#7.23">&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.23.4.4" href="#7.23.4.4"><b>    7.23.4.4 The strncmp function</b></a>
+    Synopsis
+1          #include <a href="#7.23">&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.23.4.5" href="#7.23.4.5"><b>    7.23.4.5 The strxfrm function</b></a>
+    Synopsis
+1          #include <a href="#7.23">&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="#p364" href="p364">page 364</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.23.5" href="#7.23.5"><b>    7.23.5 Search functions</b></a>
+<a name="7.23.5.1" href="#7.23.5.1"><b>    7.23.5.1 The memchr function</b></a>
+    Synopsis
+1           #include <a href="#7.23">&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. The implementation shall behave as if it reads the characters sequentially
+    and stops as soon as a matching character is found.
+    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.23.5.2" href="#7.23.5.2"><b>    7.23.5.2 The strchr function</b></a>
+    Synopsis
+1           #include <a href="#7.23">&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.
+
+
+
+[<a name="#p365" href="p365">page 365</a>] (<a href="#Contents">Contents</a>)
+
+    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="7.23.5.3" href="#7.23.5.3"><b>    7.23.5.3 The strcspn function</b></a>
+    Synopsis
+1          #include <a href="#7.23">&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.23.5.4" href="#7.23.5.4"><b>    7.23.5.4 The strpbrk function</b></a>
+    Synopsis
+1          #include <a href="#7.23">&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.23.5.5" href="#7.23.5.5"><b>    7.23.5.5 The strrchr function</b></a>
+    Synopsis
+1          #include <a href="#7.23">&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.
+
+
+
+
+[<a name="#p366" href="p366">page 366</a>] (<a href="#Contents">Contents</a>)
+
+    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="7.23.5.6" href="#7.23.5.6"><b>    7.23.5.6 The strspn function</b></a>
+    Synopsis
+1           #include <a href="#7.23">&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.23.5.7" href="#7.23.5.7"><b>    7.23.5.7 The strstr function</b></a>
+    Synopsis
+1           #include <a href="#7.23">&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.23.5.8" href="#7.23.5.8"><b>    7.23.5.8 The strtok function</b></a>
+    Synopsis
+1           #include <a href="#7.23">&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.
+[<a name="#p367" href="p367">page 367</a>] (<a href="#Contents">Contents</a>)
+
+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
+    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 strtok function is not required to avoid data races. 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.23">&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.23.6" href="#7.23.6"><b>    7.23.6 Miscellaneous functions</b></a>
+<a name="7.23.6.1" href="#7.23.6.1"><b>    7.23.6.1 The memset function</b></a>
+    Synopsis
+1          #include <a href="#7.23">&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="#p368" href="p368">page 368</a>] (<a href="#Contents">Contents</a>)
+
+<a name="7.23.6.2" href="#7.23.6.2"><b>    7.23.6.2 The strerror function</b></a>
+    Synopsis
+1           #include <a href="#7.23">&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 strerror function is not required to avoid data races. 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.23.6.3" href="#7.23.6.3"><b>    7.23.6.3 The strlen function</b></a>
+    Synopsis
+1           #include <a href="#7.23">&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="#p369" href="p369">page 369</a>] (<a href="#Contents">Contents</a>)
+
+<a name="7.24" href="#7.24"><b>    7.24 Type-generic math &lt;tgmath.h&gt;</b></a>
+1   The header <a href="#7.24">&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.304) 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.305)
+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.
+
+
+
+
+    304) Like other function-like macros in Standard libraries, each type-generic macro can be suppressed to
+         make available the corresponding ordinary function.
+    305) 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="#p370" href="p370">page 370</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.
+
+
+
+
+[<a name="#p371" href="p371">page 371</a>] (<a href="#Contents">Contents</a>)
+
+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:
+           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.24">&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="#p372" href="p372">page 372</a>] (<a href="#Contents">Contents</a>)
+
+<a name="7.25" href="#7.25"><b>    7.25 Threads &lt;threads.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;threads.h&gt;</a> defines macros, and declares types, enumeration constants,
+    and functions that support multiple threads of execution.
+2   Implementations that define the macro __STDC_NO_THREADS__ need not provide
+    this header nor support any of its facilities.
+3   The macros are
+            ONCE_FLAG_INIT
+    which expands to a value that can be used to initialize an object of type once_flag;
+    and
+            TSS_DTOR_ITERATIONS
+    which expands to an integer constant expression representing the maximum number of
+    times that destructors will be called when a thread terminates.
+4   The types are
+            cnd_t
+    which is a complete object type that holds an identifier for a condition variable;
+            thrd_t
+    which is a complete object type that holds an identifier for a thread;
+            tss_t
+    which is a complete object type that holds an identifier for a thread-specific storage
+    pointer;
+            mtx_t
+    which is a complete object type that holds an identifier for a mutex;
+            tss_dtor_t
+    which is the function pointer type void (*)(void*), used for a destructor for a
+    thread-specific storage pointer;
+            thrd_start_t
+    which is the function pointer type int (*)(void*) that is passed to thrd_create
+    to create a new thread;
+            once_flag
+    which is a complete object type that holds a flag for use by call_once; and
+
+
+[<a name="#p373" href="p373">page 373</a>] (<a href="#Contents">Contents</a>)
+
+           xtime
+    which is a structure type that holds a time specified in seconds and nanoseconds. The
+    structure shall contain at least the following members, in any order.
+           time_t sec;
+           long nsec;
+5   The enumeration constants are
+           mtx_plain
+    which is passed to mtx_init to create a mutex object that supports neither timeout nor
+    test and return;
+           mtx_recursive
+    which is passed to mtx_init to create a mutex object that supports recursive locking;
+           mtx_timed
+    which is passed to mtx_init to create a mutex object that supports timeout;
+           mtx_try
+    which is passed to mtx_init to create a mutex object that supports test and return;
+           thrd_timeout
+    which is returned by a timed wait function to indicate that the time specified in the call
+    was reached without acquiring the requested resource;
+           thrd_success
+    which is returned by a function to indicate that the requested operation succeeded;
+           thrd_busy
+    which is returned by a function to indicate that the requested operation failed because a
+    resource requested by a test and return function is already in use;
+           thrd_error
+    which is returned by a function to indicate that the requested operation failed; and
+           thrd_nomem
+    which is returned by a function to indicate that the requested operation failed because it
+    was unable to allocate memory.
+
+
+
+
+[<a name="#p374" href="p374">page 374</a>] (<a href="#Contents">Contents</a>)
+
+<a name="7.25.2" href="#7.25.2"><b>    7.25.2 Initialization functions</b></a>
+<a name="7.25.2.1" href="#7.25.2.1"><b>    7.25.2.1 The call_once function</b></a>
+    Synopsis
+1           #include <a href="#7.25">&lt;threads.h&gt;</a>
+            void call_once(once_flag *flag, void (*func)(void));
+    Description
+2   The call_once function uses the once_flag pointed to by flag to ensure that
+    func is called exactly once, the first time the call_once function is called with that
+    value of flag. Completion of an effective call to the call_once function synchronizes
+    with all subsequent calls to the call_once function with the same value of flag.
+    Returns
+3   The call_once function returns no value.
+<a name="7.25.3" href="#7.25.3"><b>    7.25.3 Condition variable functions</b></a>
+<a name="7.25.3.1" href="#7.25.3.1"><b>    7.25.3.1 The cnd_broadcast function</b></a>
+    Synopsis
+1           #include <a href="#7.25">&lt;threads.h&gt;</a>
+            int cnd_broadcast(cnd_t *cond);
+    Description
+2   The cnd_broadcast function unblocks all of the threads that are blocked on the
+    condition variable pointed to by cond at the time of the call. If no threads are blocked
+    on the condition variable pointed to by cond at the time of the call, the function does
+    nothing.
+    Returns
+3   The cnd_broadcast function returns thrd_success on success, or thrd_error
+    if the request could not be honored.
+<a name="7.25.3.2" href="#7.25.3.2"><b>    7.25.3.2 The cnd_destroy function</b></a>
+    Synopsis
+1           #include <a href="#7.25">&lt;threads.h&gt;</a>
+            void cnd_destroy(cnd_t *cond);
+    Description
+2   The cnd_destroy function releases all resources used by the condition variable
+    pointed to by cond. The cnd_destroy function requires that no threads be blocked
+    waiting for the condition variable pointed to by cond.
+
+[<a name="#p375" href="p375">page 375</a>] (<a href="#Contents">Contents</a>)
+
+    Returns
+3   The cnd_destroy function returns no value.
+<a name="7.25.3.3" href="#7.25.3.3"><b>    7.25.3.3 The cnd_init function</b></a>
+    Synopsis
+1          #include <a href="#7.25">&lt;threads.h&gt;</a>
+           int cnd_init(cnd_t *cond);
+    Description
+2   The cnd_init function creates a condition variable. If it succeeds it sets the variable
+    pointed to by cond to a value that uniquely identifies the newly created condition
+    variable. A thread that calls cnd_wait on a newly created condition variable will
+    block.
+    Returns
+3   The cnd_init function returns thrd_success on success, or thrd_nomem if no
+    memory could be allocated for the newly created condition, or thrd_error if the
+    request could not be honored.
+<a name="7.25.3.4" href="#7.25.3.4"><b>    7.25.3.4 The cnd_signal function</b></a>
+    Synopsis
+1          #include <a href="#7.25">&lt;threads.h&gt;</a>
+           int cnd_signal(cnd_t *cond);
+    Description
+2   The cnd_signal function unblocks one of the threads that are blocked on the
+    condition variable pointed to by cond at the time of the call. If no threads are blocked
+    on the condition variable at the time of the call, the function does nothing and return
+    success.
+    Returns
+3   The cnd_signal function returns thrd_success on success or thrd_error if
+    the request could not be honored.
+<a name="7.25.3.5" href="#7.25.3.5"><b>    7.25.3.5 The cnd_timedwait function</b></a>
+    Synopsis
+1          #include <a href="#7.25">&lt;threads.h&gt;</a>
+           int cnd_timedwait(cnd_t *cond, mtx_t *mtx,
+                const xtime *xt);
+
+
+
+
+[<a name="#p376" href="p376">page 376</a>] (<a href="#Contents">Contents</a>)
+
+    Description
+2   The cnd_timedwait function atomically unlocks the mutex pointed to by mtx and
+    endeavors to block until the condition variable pointed to by cond is signaled by a call to
+    cnd_signal or to cnd_broadcast, or until after the time specified by the xtime
+    object pointed to by xt. When the calling thread becomes unblocked it locks the variable
+    pointed to by mtx before it returns. The cnd_timedwait function requires that the
+    mutex pointed to by mtx be locked by the calling thread.
+    Returns
+3   The cnd_timedwait function returns thrd_success upon success, or
+    thrd_timeout if the time specified in the call was reached without acquiring the
+    requested resource, or thrd_error if the request could not be honored.
+<a name="7.25.3.6" href="#7.25.3.6"><b>    7.25.3.6 The cnd_wait function</b></a>
+    Synopsis
+1           #include <a href="#7.25">&lt;threads.h&gt;</a>
+            int cnd_wait(cnd_t *cond, mtx_t *mtx);
+    Description
+2   The cnd_wait function atomically unlocks the mutex pointed to by mtx and endeavors
+    to block until the condition variable pointed to by cond is signaled by a call to
+    cnd_signal or to cnd_broadcast. When the calling thread becomes unblocked it
+    locks the mutex pointed to by mtx before it returns. If the mutex pointed to by mtx is
+    not locked by the calling thread, the cnd_wait function will act as if the abort
+    function is called.
+    Returns
+3   The cnd_wait function returns thrd_success on success or thrd_error if the
+    request could not be honored.
+<a name="7.25.4" href="#7.25.4"><b>    7.25.4 Mutex functions</b></a>
+<a name="7.25.4.1" href="#7.25.4.1"><b>    7.25.4.1 The mtx_destroy function</b></a>
+    Synopsis
+1           #include <a href="#7.25">&lt;threads.h&gt;</a>
+            void mtx_destroy(mtx_t *mtx);
+    Description
+2   The mtx_destroy function releases any resources used by the mutex pointed to by
+    mtx. No threads can be blocked waiting for the mutex pointed to by mtx.
+
+
+
+[<a name="#p377" href="p377">page 377</a>] (<a href="#Contents">Contents</a>)
+
+    Returns
+3   The mtx_destroy function returns no value.
+<a name="7.25.4.2" href="#7.25.4.2"><b>    7.25.4.2 The mtx_init function</b></a>
+    Synopsis
+1          #include <a href="#7.25">&lt;threads.h&gt;</a>
+           int mtx_init(mtx_t *mtx, int type);
+    Description
+2   The mtx_init function creates a mutex object with properties indicated by type,
+    which must have one of the six values:
+    mtx_plain for a simple non-recursive mutex,
+    mtx_timed for a non-recursive mutex that supports timeout,
+    mtx_try      for a non-recursive mutex that supports test and return,
+    mtx_plain | mtx_recursive for a simple recursive mutex,
+    mtx_timed | mtx_recursive for a recursive mutex that supports timeout, or
+    mtx_try | mtx_recursive for a recursive mutex that supports test and return.
+3   If the mtx_init function succeeds, it sets the mutex pointed to by mtx to a value that
+    uniquely identifies the newly created mutex.
+    Returns
+4   The mtx_init function returns thrd_success on success, or thrd_error if the
+    request could not be honored.
+<a name="7.25.4.3" href="#7.25.4.3"><b>    7.25.4.3 The mtx_lock function</b></a>
+    Synopsis
+1          #include <a href="#7.25">&lt;threads.h&gt;</a>
+           int mtx_lock(mtx_t *mtx);
+    Description
+2   The mtx_lock function blocks until it locks the mutex pointed to by mtx. If the mutex
+    is non-recursive, it shall not be locked by the calling thread. Prior calls to mtx_unlock
+    on the same mutex shall synchronize with this operation.
+    Returns
+3   The mtx_lock function returns thrd_success on success, or thrd_busy if the
+    resource requested is already in use, or thrd_error if the request could not be
+    honored.
+
+
+
+
+[<a name="#p378" href="p378">page 378</a>] (<a href="#Contents">Contents</a>)
+
+<a name="7.25.4.4" href="#7.25.4.4"><b>    7.25.4.4 The mtx_timedlock function</b></a>
+    Synopsis
+1           #include <a href="#7.25">&lt;threads.h&gt;</a>
+            int mtx_timedlock(mtx_t *mtx, const xtime *xt);
+    Description
+2   The mtx_timedlock function endeavors to block until it locks the mutex pointed to by
+    mtx or until the time specified by the xtime object xt has passed. The specified mutex
+    shall support timeout. If the operation succeeds, prior calls to mtx_unlock on the same
+    mutex shall synchronize with this operation.
+    Returns
+3   The mtx_timedlock function returns thrd_success on success, or thrd_busy
+    if the resource requested is already in use, or thrd_timeout if the time specified was
+    reached without acquiring the requested resource, or thrd_error if the request could
+    not be honored.
+<a name="7.25.4.5" href="#7.25.4.5"><b>    7.25.4.5 The mtx_trylock function</b></a>
+    Synopsis
+1           #include <a href="#7.25">&lt;threads.h&gt;</a>
+            int mtx_trylock(mtx_t *mtx);
+    Description
+2   The mtx_trylock function endeavors to lock the mutex pointed to by mtx. The
+    specified mutex shall support either test and return or timeout. If the mutex is already
+    locked, the function returns without blocking. If the operation succeeds, prior calls to
+    mtx_unlock on the same mutex shall synchronize with this operation.
+    Returns
+3   The mtx_trylock function returns thrd_success on success, or thrd_busy if
+    the resource requested is already in use, or thrd_error if the request could not be
+    honored.
+<a name="7.25.4.6" href="#7.25.4.6"><b>    7.25.4.6 The mtx_unlock function</b></a>
+    Synopsis
+1           #include <a href="#7.25">&lt;threads.h&gt;</a>
+            int mtx_unlock(mtx_t *mtx);
+    Description
+2   The mtx_unlock function unlocks the mutex pointed to by mtx. The mutex pointed to
+    by mtx shall be locked by the calling thread.
+
+[<a name="#p379" href="p379">page 379</a>] (<a href="#Contents">Contents</a>)
+
+    Returns
+3   The mtx_unlock function returns thrd_success on success or thrd_error if
+    the request could not be honored.
+<a name="7.25.5" href="#7.25.5"><b>    7.25.5 Thread functions</b></a>
+<a name="7.25.5.1" href="#7.25.5.1"><b>    7.25.5.1 The thrd_create function</b></a>
+    Synopsis
+1          #include <a href="#7.25">&lt;threads.h&gt;</a>
+           int thrd_create(thrd_t *thr, thrd_start_t func,
+                void *arg);
+    Description
+2   The thrd_create function creates a new thread executing func(arg). If the
+    thrd_create function succeeds, it sets the object pointed to by thr to the identifier of
+    the newly created thread. (A thread's identifier may be reused for a different thread once
+    the original thread has exited and either been detached or joined to another thread.) The
+    completion of the thrd_create function synchronizes with the beginning of the
+    execution of the new thread.
+    Returns
+3   The thrd_create function returns thrd_success on success, or thrd_nomem if
+    no memory could be allocated for the thread requested, or thrd_error if the request
+    could not be honored.
+<a name="7.25.5.2" href="#7.25.5.2"><b>    7.25.5.2 The thrd_current function</b></a>
+    Synopsis
+1          #include <a href="#7.25">&lt;threads.h&gt;</a>
+           thrd_t thrd_current(void);
+    Description
+2   The thrd_current function identifies the thread that called it.
+    Returns
+3   The thrd_current function returns the identifier of the thread that called it.
+<a name="7.25.5.3" href="#7.25.5.3"><b>    7.25.5.3 The thrd_detach function</b></a>
+    Synopsis
+1          #include <a href="#7.25">&lt;threads.h&gt;</a>
+           int thrd_detach(thrd_t thr);
+
+
+
+[<a name="#p380" href="p380">page 380</a>] (<a href="#Contents">Contents</a>)
+
+    Description
+2   The thrd_detach function tells the operating system to dispose of any resources
+    allocated to the thread identified by thr when that thread terminates. The thread
+    identified by thr shall not have been previously detached or joined with another thread.
+    Returns
+3   The thrd_detach function returns thrd_success on success or thrd_error if
+    the request could not be honored.
+<a name="7.25.5.4" href="#7.25.5.4"><b>    7.25.5.4 The thrd_equal function</b></a>
+    Synopsis
+1           #include <a href="#7.25">&lt;threads.h&gt;</a>
+            int thrd_equal(thrd_t thr0, thrd_t thr1);
+    Description
+2   The thrd_equal function will determine whether the thread identified by thr0 refers
+    to the thread identified by thr1.
+    Returns
+3   The thrd_equal function returns zero if the thread thr0 and the thread thr1 refer to
+    different threads. Otherwise the thrd_equal function returns a nonzero value.
+<a name="7.25.5.5" href="#7.25.5.5"><b>    7.25.5.5 The thrd_exit function</b></a>
+    Synopsis
+1           #include <a href="#7.25">&lt;threads.h&gt;</a>
+            void thrd_exit(int res);
+    Description
+2   The thrd_exit function terminates execution of the calling thread and sets its result
+    code to res.
+    Returns
+3   The thrd_exit function returns no value.
+<a name="7.25.5.6" href="#7.25.5.6"><b>    7.25.5.6 The thrd_join function</b></a>
+    Synopsis
+1           #include <a href="#7.25">&lt;threads.h&gt;</a>
+            int thrd_join(thrd_t thr, int *res);
+    Description
+2   The thrd_join function joins the thread identified by thr with the current thread by
+    blocking until the other thread has terminated. If the parameter res is not a null pointer,
+
+[<a name="#p381" href="p381">page 381</a>] (<a href="#Contents">Contents</a>)
+
+    it stores the thread's result code in the integer pointed to by res. The termination of the
+    other thread synchronizes with the completion of the thrd_join function. The thread
+    identified by thr shall not have been previously detached or joined with another thread.
+    Returns
+3   The thrd_join function returns thrd_success on success or thrd_error if the
+    request could not be honored.
+<a name="7.25.5.7" href="#7.25.5.7"><b>    7.25.5.7 The thrd_sleep function</b></a>
+    Synopsis
+1          #include <a href="#7.25">&lt;threads.h&gt;</a>
+           void thrd_sleep(const xtime *xt);
+    Description
+2   The thrd_sleep function suspends execution of the calling thread until after the time
+    specified by the xtime object pointed to by xt.
+    Returns
+3   The thrd_sleep function returns no value.
+<a name="7.25.5.8" href="#7.25.5.8"><b>    7.25.5.8 The thrd_yield function</b></a>
+    Synopsis
+1          #include <a href="#7.25">&lt;threads.h&gt;</a>
+           void thrd_yield(void);
+    Description
+2   The thrd_yield function endeavors to permit other threads to run, even if the current
+    thread would ordinarily continue to run.
+    Returns
+3   The thrd_yield function returns no value.
+<a name="7.25.6" href="#7.25.6"><b>    7.25.6 Thread-specific storage functions</b></a>
+<a name="7.25.6.1" href="#7.25.6.1"><b>    7.25.6.1 The tss_create function</b></a>
+    Synopsis
+1          #include <a href="#7.25">&lt;threads.h&gt;</a>
+           int tss_create(tss_t *key, tss_dtor_t dtor);
+    Description
+2   The tss_create function creates a thread-specific storage pointer with destructor
+    dtor, which may be null.
+
+
+[<a name="#p382" href="p382">page 382</a>] (<a href="#Contents">Contents</a>)
+
+    Returns
+3   If the tss_create function is successful, it sets the thread-specific storage pointed to
+    by key to a value that uniquely identifies the newly created pointer and returns
+    thrd_success; otherwise, thrd_error is returned and the thread-specific storage
+    pointed to by key is set to an undefined value.
+<a name="7.25.6.2" href="#7.25.6.2"><b>    7.25.6.2 The tss_delete function</b></a>
+    Synopsis
+1           #include <a href="#7.25">&lt;threads.h&gt;</a>
+            void tss_delete(tss_t key);
+    Description
+2   The tss_delete function releases any resources used by the thread-specific storage
+    identified by key.
+    Returns
+3   The tss_delete function returns no value.
+<a name="7.25.6.3" href="#7.25.6.3"><b>    7.25.6.3 The tss_get function</b></a>
+    Synopsis
+1           #include <a href="#7.25">&lt;threads.h&gt;</a>
+            void *tss_get(tss_t key);
+    Description
+2   The tss_get function returns the value for the current thread held in the thread-specific
+    storage identified by key.
+    Returns
+3   The tss_get function returns the value for the current thread if successful, or zero if
+    unsuccessful.
+<a name="7.25.6.4" href="#7.25.6.4"><b>    7.25.6.4 The tss_set function</b></a>
+    Synopsis
+1           #include <a href="#7.25">&lt;threads.h&gt;</a>
+            int tss_set(tss_t key, void *val);
+    Description
+2   The tss_set function sets the value for the current thread held in the thread-specific
+    storage identified by key to val.
+
+
+
+
+[<a name="#p383" href="p383">page 383</a>] (<a href="#Contents">Contents</a>)
+
+    Returns
+3   The tss_set function returns thrd_success on success or thrd_error if the
+    request could not be honored.
+<a name="7.25.7" href="#7.25.7"><b>    7.25.7 Time functions</b></a>
+<a name="7.25.7.1" href="#7.25.7.1"><b>    7.25.7.1 The xtime_get function</b></a>
+    Synopsis
+1           #include <a href="#7.25">&lt;threads.h&gt;</a>
+            int xtime_get(xtime *xt, int base);
+    Description
+2   The xtime_get function sets the xtime object pointed to by xt to hold the current
+    time based on the time base base.
+    Returns
+3   If the xtime_get function is successful it returns the nonzero value base, which must
+    be TIME_UTC; otherwise, it returns zero.306)
+
+
+
+
+    306) Although an xtime object describes times with nanosecond resolution, the actual resolution in an
+         xtime object is system dependent.
+
+[<a name="#p384" href="p384">page 384</a>] (<a href="#Contents">Contents</a>)
+
+<a name="7.26" href="#7.26"><b>    7.26 Date and time &lt;time.h&gt;</b></a>
+<a name="7.26.1" href="#7.26.1"><b>    7.26.1 Components of time</b></a>
+1   The header <a href="#7.26">&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.19">7.19</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.19">7.19</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.307)
+            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
+
+
+
+    307) The range [0, 60] for tm_sec allows for a positive leap second.
+
+[<a name="#p385" href="p385">page 385</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.26.2" href="#7.26.2"><b>    7.26.2 Time manipulation functions</b></a>
+<a name="7.26.2.1" href="#7.26.2.1"><b>    7.26.2.1 The clock function</b></a>
+    Synopsis
+1           #include <a href="#7.26">&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).308)
+<a name="7.26.2.2" href="#7.26.2.2"><b>    7.26.2.2 The difftime function</b></a>
+    Synopsis
+1           #include <a href="#7.26">&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.
+
+
+
+
+    308) 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="#p386" href="p386">page 386</a>] (<a href="#Contents">Contents</a>)
+
+<a name="7.26.2.3" href="#7.26.2.3"><b>    7.26.2.3 The mktime function</b></a>
+    Synopsis
+1           #include <a href="#7.26">&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.309) 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.21">&lt;stdio.h&gt;</a>
+            #include <a href="#7.26">&lt;time.h&gt;</a>
+            static const char *const wday[] = {
+                    "Sunday", "Monday", "Tuesday", "Wednesday",
+                    "Thursday", "Friday", "Saturday", "-unknown-"
+            };
+            struct tm time_str;
+            /* ... */
+
+
+
+
+    309) 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="#p387" href="p387">page 387</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.26.2.4" href="#7.26.2.4"><b>    7.26.2.4 The time function</b></a>
+    Synopsis
+1          #include <a href="#7.26">&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.26.3" href="#7.26.3"><b>    7.26.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 and the functions are not required to avoid data races. The
+    implementation shall behave as if no other library functions call these functions.
+<a name="7.26.3.1" href="#7.26.3.1"><b>    7.26.3.1 The asctime function</b></a>
+    Synopsis
+1          #include <a href="#7.26">&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="#p388" href="p388">page 388</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"
+         };
+         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;
+    }
+3   If any of the fields of the broken-down time contain values that are outside their normal
+    ranges,310) the behavior of the asctime function is undefined. Likewise, if the
+    calculated year exceeds four digits or is less than the year 1000, the behavior is
+    undefined.
+    Returns
+4   The asctime function returns a pointer to the string.
+<a name="7.26.3.2" href="#7.26.3.2"><b>    7.26.3.2 The ctime function</b></a>
+    Synopsis
+1           #include <a href="#7.26">&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))
+
+
+
+    310) See <a href="#7.26.1">7.26.1</a>.
+
+[<a name="#p389" href="p389">page 389</a>] (<a href="#Contents">Contents</a>)
+
+    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.26.3.4">7.26.3.4</a>).
+<a name="7.26.3.3" href="#7.26.3.3"><b>    7.26.3.3 The gmtime function</b></a>
+    Synopsis
+1          #include <a href="#7.26">&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.26.3.4" href="#7.26.3.4"><b>    7.26.3.4 The localtime function</b></a>
+    Synopsis
+1          #include <a href="#7.26">&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.26.3.5" href="#7.26.3.5"><b>    7.26.3.5 The strftime function</b></a>
+    Synopsis
+1          #include <a href="#7.26">&lt;time.h&gt;</a>
+           size_t strftime(char * restrict s,
+                size_t maxsize,
+                const char * restrict format,
+                const struct tm * restrict timeptr);
+
+
+
+
+[<a name="#p390" href="p390">page 390</a>] (<a href="#Contents">Contents</a>)
+
+    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
+    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.26.1">7.26.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.
+
+[<a name="#p391" href="p391">page 391</a>] (<a href="#Contents">Contents</a>)
+
+    %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]
+    %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.26.1">7.26.1</a>]
+    %X    is replaced by the locale's appropriate time representation. [all specified in <a href="#7.26.1">7.26.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.
+
+[<a name="#p392" href="p392">page 392</a>] (<a href="#Contents">Contents</a>)
+
+    %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.
+    %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''.
+[<a name="#p393" href="p393">page 393</a>] (<a href="#Contents">Contents</a>)
+
+    %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.
+    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="#p394" href="p394">page 394</a>] (<a href="#Contents">Contents</a>)
+
+<a name="7.27" href="#7.27"><b>    7.27 Unicode utilities &lt;uchar.h&gt;</b></a>
+1   The header <a href="#7.27">&lt;uchar.h&gt;</a> declares types and functions for manipulating Unicode
+    characters.
+2   The types declared are mbstate_t (described in <a href="#7.29.1">7.29.1</a>) and size_t (described in
+<a name="7.19);" href="#7.19);"><b>    7.19);</b></a>
+            char16_t
+    which is an unsigned integer type used for 16-bit characters and is the same type as
+    uint_least16_t (described in <a href="#7.20.1.2">7.20.1.2</a>); and
+            char32_t
+    which is an unsigned integer type used for 32-bit characters and is the same type as
+    uint_least32_t (also described in <a href="#7.20.1.2">7.20.1.2</a>).
+<a name="7.27.1" href="#7.27.1"><b>    7.27.1 Restartable multibyte/wide character conversion functions</b></a>
+1   These functions have a 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, which the functions alter as necessary. 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 functions are not required
+    to avoid data races in this case. The implementation behaves as if no library function
+    calls these functions with a null pointer for ps.
+<a name="7.27.1.1" href="#7.27.1.1"><b>    7.27.1.1 The mbrtoc16 function</b></a>
+    Synopsis
+1           #include <a href="#7.27">&lt;uchar.h&gt;</a>
+            size_t mbrtoc16(char16_t * restrict pc16,
+                 const char * restrict s, size_t n,
+                 mbstate_t * restrict ps);
+    Description
+2   If s is a null pointer, the mbrtoc16 function is equivalent to the call:
+                   mbrtoc16(NULL, "", 1, ps)
+    In this case, the values of the parameters pc16 and n are ignored.
+3   If s is not a null pointer, the mbrtoc16 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 values of the
+    corresponding wide characters and then, if pc16 is not a null pointer, stores the value of
+    the first (or only) such character in the object pointed to by pc16. Subsequent calls will
+[<a name="#p395" href="p395">page 395</a>] (<a href="#Contents">Contents</a>)
+
+    store successive wide characters without consuming any additional input until all the
+    characters have been stored. If the corresponding wide character is the null wide
+    character, the resulting state described is the initial conversion state.
+    Returns
+4   The mbrtoc16 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)(-3) if the next character resulting from a previous call has been stored (no
+                 bytes from the input have been consumed by this call).
+    (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).311)
+    (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.
+<a name="7.27.1.2" href="#7.27.1.2"><b>    7.27.1.2 The c16rtomb function</b></a>
+    Synopsis
+1           #include <a href="#7.27">&lt;uchar.h&gt;</a>
+            size_t c16rtomb(char * restrict s, char16_t c16,
+                 mbstate_t * restrict ps);
+    Description
+2   If s is a null pointer, the c16rtomb function is equivalent to the call
+                    c16rtomb(buf, L'\0', ps)
+    where buf is an internal buffer.
+3   If s is not a null pointer, the c16rtomb function determines the number of bytes needed
+    to represent the multibyte character that corresponds to the wide character given by c16
+    (including any shift sequences), and stores the multibyte character representation in the
+
+
+    311) 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="#p396" href="p396">page 396</a>] (<a href="#Contents">Contents</a>)
+
+    array whose first element is pointed to by s. At most MB_CUR_MAX bytes are stored. If
+    c16 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 c16rtomb function returns the number of bytes stored in the array object (including
+    any shift sequences). When c16 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.27.1.3" href="#7.27.1.3"><b>    7.27.1.3 The mbrtoc32 function</b></a>
+    Synopsis
+1           #include <a href="#7.27">&lt;uchar.h&gt;</a>
+            size_t mbrtoc32(char32_t * restrict pc32,
+                 const char * restrict s, size_t n,
+                 mbstate_t * restrict ps);
+    Description
+2   If s is a null pointer, the mbrtoc32 function is equivalent to the call:
+                    mbrtoc32(NULL, "", 1, ps)
+    In this case, the values of the parameters pc32 and n are ignored.
+3   If s is not a null pointer, the mbrtoc32 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 values of the
+    corresponding wide characters and then, if pc32 is not a null pointer, stores the value of
+    the first (or only) such character in the object pointed to by pc32. Subsequent calls will
+    store successive wide characters without consuming any additional input until all the
+    characters have been stored. If the corresponding wide character is the null wide
+    character, the resulting state described is the initial conversion state.
+    Returns
+4   The mbrtoc32 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.
+
+
+[<a name="#p397" href="p397">page 397</a>] (<a href="#Contents">Contents</a>)
+
+    (size_t)(-3) if the next character resulting from a previous call has been stored (no
+                 bytes from the input have been consumed by this call).
+    (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).312)
+    (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.
+<a name="7.27.1.4" href="#7.27.1.4"><b>    7.27.1.4 The c32rtomb function</b></a>
+    Synopsis
+1           #include <a href="#7.27">&lt;uchar.h&gt;</a>
+            size_t c32rtomb(char * restrict s, char32_t c32,
+                 mbstate_t * restrict ps);
+    Description
+2   If s is a null pointer, the c32rtomb function is equivalent to the call
+                    c32rtomb(buf, L'\0', ps)
+    where buf is an internal buffer.
+3   If s is not a null pointer, the c32rtomb function determines the number of bytes needed
+    to represent the multibyte character that corresponds to the wide character given by c32
+    (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
+    c32 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 c32rtomb function returns the number of bytes stored in the array object (including
+    any shift sequences). When c32 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.
+
+
+
+
+    312) 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="#p398" href="p398">page 398</a>] (<a href="#Contents">Contents</a>)
+
+<a name="7.28" href="#7.28"><b>    7.28 Extended multibyte and wide character utilities &lt;wchar.h&gt;</b></a>
+<a name="7.28.1" href="#7.28.1"><b>    7.28.1 Introduction</b></a>
+1   The header <a href="#7.28">&lt;wchar.h&gt;</a> defines four macros, and declares four data types, one tag, and
+    many functions.313)
+2   The types declared are wchar_t and size_t (both described in <a href="#7.19">7.19</a>);
+              mbstate_t
+    which is a complete 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);314) and
+             struct tm
+    which is declared as an incomplete structure type (the contents are described in <a href="#7.26.1">7.26.1</a>).
+3   The macros defined are NULL (described in <a href="#7.19">7.19</a>); WCHAR_MIN and WCHAR_MAX
+    (described in <a href="#7.20.3">7.20.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.315) 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;
+
+
+    313) See ''future library directions'' (<a href="#7.30.12">7.30.12</a>).
+    314) wchar_t and wint_t can be the same integer type.
+    315) The value of the macro WEOF may differ from that of EOF and need not be negative.
+
+[<a name="#p399" href="p399">page 399</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.28.2" href="#7.28.2"><b>    7.28.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.316)
+<a name="7.28.2.1" href="#7.28.2.1"><b>    7.28.2.1 The fwprintf function</b></a>
+    Synopsis
+1           #include <a href="#7.21">&lt;stdio.h&gt;</a>
+            #include <a href="#7.28">&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
+
+
+    316) The fwprintf functions perform writes to memory for the %n specifier.
+
+[<a name="#p400" href="p400">page 400</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.317)
+    -- 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.)318)
+    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,
+
+
+    317) Note that 0 is taken as a flag, not as the beginning of a field width.
+    318) The results of all floating conversions of a negative zero, and of negative values that round to zero,
+         include a minus sign.
+
+[<a name="#p401" href="p401">page 401</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="#p402" href="p402">page 402</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="#p403" href="p403">page 403</a>] (<a href="#Contents">Contents</a>)
+
+             nan, respectively.319)
+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 character320) 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
+
+
+319) 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.
+320) 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="#p404" href="p404">page 404</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
+             distinguish321) 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-
+
+321) 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="#p405" href="p405">page 405</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.322) 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.323) 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.
+
+     322) See ''future library directions'' (<a href="#7.30.12">7.30.12</a>).
+     323) 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="#p406" href="p406">page 406</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.21">&lt;stdio.h&gt;</a>
+             #include <a href="#7.28">&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(<a href="#1.0">1.0</a>));
+
+     Forward references:          the btowc function (<a href="#7.28.6.1.1">7.28.6.1.1</a>), the mbrtowc function
+     (<a href="#7.28.6.3.2">7.28.6.3.2</a>).
+<a name="7.28.2.2" href="#7.28.2.2"><b>     7.28.2.2 The fwscanf function</b></a>
+     Synopsis
+1            #include <a href="#7.21">&lt;stdio.h&gt;</a>
+             #include <a href="#7.28">&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="#p407" href="p407">page 407</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. When all directives
+     have been executed, or 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.324)
+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.325) 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
+
+
+     324) These white-space wide characters are not counted against a specified field width.
+     325) 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="#p408" href="p408">page 408</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="#p409" href="p409">page 409</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="#p410" href="p410">page 410</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="#p411" href="p411">page 411</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.326)
+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 the first conversion (if any) has completed. 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.21">&lt;stdio.h&gt;</a>
+              #include <a href="#7.28">&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);
+     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.21">&lt;stdio.h&gt;</a>
+              #include <a href="#7.28">&lt;wchar.h&gt;</a>
+              /* ... */
+              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.
+
+
+     326) See ''future library directions'' (<a href="#7.30.12">7.30.12</a>).
+
+[<a name="#p412" href="p412">page 412</a>] (<a href="#Contents">Contents</a>)
+
+    Forward references: the wcstod, wcstof, and wcstold functions (<a href="#7.28.4.1.1">7.28.4.1.1</a>), the
+    wcstol, wcstoll, wcstoul, and wcstoull functions (<a href="#7.28.4.1.2">7.28.4.1.2</a>), the wcrtomb
+    function (<a href="#7.28.6.3.3">7.28.6.3.3</a>).
+<a name="7.28.2.3" href="#7.28.2.3"><b>    7.28.2.3 The swprintf function</b></a>
+    Synopsis
+1           #include <a href="#7.28">&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.28.2.4" href="#7.28.2.4"><b>    7.28.2.4 The swscanf function</b></a>
+    Synopsis
+1           #include <a href="#7.28">&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 the first conversion (if any) has completed. 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="#p413" href="p413">page 413</a>] (<a href="#Contents">Contents</a>)
+
+<a name="7.28.2.5" href="#7.28.2.5"><b>    7.28.2.5 The vfwprintf function</b></a>
+    Synopsis
+1          #include <a href="#7.16">&lt;stdarg.h&gt;</a>
+           #include <a href="#7.21">&lt;stdio.h&gt;</a>
+           #include <a href="#7.28">&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.327)
+    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.16">&lt;stdarg.h&gt;</a>
+           #include <a href="#7.21">&lt;stdio.h&gt;</a>
+           #include <a href="#7.28">&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);
+           }
+
+
+
+
+    327) 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="#p414" href="p414">page 414</a>] (<a href="#Contents">Contents</a>)
+
+<a name="7.28.2.6" href="#7.28.2.6"><b>    7.28.2.6 The vfwscanf function</b></a>
+    Synopsis
+1           #include <a href="#7.16">&lt;stdarg.h&gt;</a>
+            #include <a href="#7.21">&lt;stdio.h&gt;</a>
+            #include <a href="#7.28">&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.327)
+    Returns
+3   The vfwscanf function returns the value of the macro EOF if an input failure occurs
+    before the first conversion (if any) has completed. 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.28.2.7" href="#7.28.2.7"><b>    7.28.2.7 The vswprintf function</b></a>
+    Synopsis
+1           #include <a href="#7.16">&lt;stdarg.h&gt;</a>
+            #include <a href="#7.28">&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.327)
+    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="#p415" href="p415">page 415</a>] (<a href="#Contents">Contents</a>)
+
+<a name="7.28.2.8" href="#7.28.2.8"><b>    7.28.2.8 The vswscanf function</b></a>
+    Synopsis
+1          #include <a href="#7.16">&lt;stdarg.h&gt;</a>
+           #include <a href="#7.28">&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.327)
+    Returns
+3   The vswscanf function returns the value of the macro EOF if an input failure occurs
+    before the first conversion (if any) has completed. 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.28.2.9" href="#7.28.2.9"><b>    7.28.2.9 The vwprintf function</b></a>
+    Synopsis
+1          #include <a href="#7.16">&lt;stdarg.h&gt;</a>
+           #include <a href="#7.28">&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.327)
+    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="#p416" href="p416">page 416</a>] (<a href="#Contents">Contents</a>)
+
+<a name="7.28.2.10" href="#7.28.2.10"><b>    7.28.2.10 The vwscanf function</b></a>
+    Synopsis
+1           #include <a href="#7.16">&lt;stdarg.h&gt;</a>
+            #include <a href="#7.28">&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.327)
+    Returns
+3   The vwscanf function returns the value of the macro EOF if an input failure occurs
+    before the first conversion (if any) has completed. 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.28.2.11" href="#7.28.2.11"><b>    7.28.2.11 The wprintf function</b></a>
+    Synopsis
+1           #include <a href="#7.28">&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.28.2.12" href="#7.28.2.12"><b>    7.28.2.12 The wscanf function</b></a>
+    Synopsis
+1           #include <a href="#7.28">&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="#p417" href="p417">page 417</a>] (<a href="#Contents">Contents</a>)
+
+    Returns
+3   The wscanf function returns the value of the macro EOF if an input failure occurs
+    before the first conversion (if any) has completed. 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.28.3" href="#7.28.3"><b>    7.28.3 Wide character input/output functions</b></a>
+<a name="7.28.3.1" href="#7.28.3.1"><b>    7.28.3.1 The fgetwc function</b></a>
+    Synopsis
+1           #include <a href="#7.21">&lt;stdio.h&gt;</a>
+            #include <a href="#7.28">&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.328)
+<a name="7.28.3.2" href="#7.28.3.2"><b>    7.28.3.2 The fgetws function</b></a>
+    Synopsis
+1           #include <a href="#7.21">&lt;stdio.h&gt;</a>
+            #include <a href="#7.28">&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
+
+
+    328) 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="#p418" href="p418">page 418</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.28.3.3" href="#7.28.3.3"><b>    7.28.3.3 The fputwc function</b></a>
+    Synopsis
+1           #include <a href="#7.21">&lt;stdio.h&gt;</a>
+            #include <a href="#7.28">&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.28.3.4" href="#7.28.3.4"><b>    7.28.3.4 The fputws function</b></a>
+    Synopsis
+1           #include <a href="#7.21">&lt;stdio.h&gt;</a>
+            #include <a href="#7.28">&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="#p419" href="p419">page 419</a>] (<a href="#Contents">Contents</a>)
+
+<a name="7.28.3.5" href="#7.28.3.5"><b>    7.28.3.5 The fwide function</b></a>
+    Synopsis
+1           #include <a href="#7.21">&lt;stdio.h&gt;</a>
+            #include <a href="#7.28">&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.329)
+    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.28.3.6" href="#7.28.3.6"><b>    7.28.3.6 The getwc function</b></a>
+    Synopsis
+1           #include <a href="#7.21">&lt;stdio.h&gt;</a>
+            #include <a href="#7.28">&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.28.3.7" href="#7.28.3.7"><b>    7.28.3.7 The getwchar function</b></a>
+    Synopsis
+1           #include <a href="#7.28">&lt;wchar.h&gt;</a>
+            wint_t getwchar(void);
+
+
+
+
+    329) If the orientation of the stream has already been determined, fwide does not change it.
+
+[<a name="#p420" href="p420">page 420</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.28.3.8" href="#7.28.3.8"><b>    7.28.3.8 The putwc function</b></a>
+    Synopsis
+1           #include <a href="#7.21">&lt;stdio.h&gt;</a>
+            #include <a href="#7.28">&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.28.3.9" href="#7.28.3.9"><b>    7.28.3.9 The putwchar function</b></a>
+    Synopsis
+1           #include <a href="#7.28">&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.28.3.10" href="#7.28.3.10"><b>    7.28.3.10 The ungetwc function</b></a>
+    Synopsis
+1           #include <a href="#7.21">&lt;stdio.h&gt;</a>
+            #include <a href="#7.28">&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="#p421" href="p421">page 421</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.28.4" href="#7.28.4"><b>    7.28.4 General wide string utilities</b></a>
+1   The header <a href="#7.28">&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="#p422" href="p422">page 422</a>] (<a href="#Contents">Contents</a>)
+
+<a name="7.28.4.1" href="#7.28.4.1"><b>    7.28.4.1 Wide string numeric conversion functions</b></a>
+<a name="7.28.4.1.1" href="#7.28.4.1.1"><b>    7.28.4.1.1 The wcstod, wcstof, and wcstold functions</b></a>
+    Synopsis
+1           #include <a href="#7.28">&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="#p423" href="p423">page 423</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.330) 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.331) 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.
+
+
+
+    330) 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.
+    331) An implementation may use the n-wchar sequence to determine extra information to be represented in
+         the NaN's significand.
+
+[<a name="#p424" href="p424">page 424</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.332)
+     Returns
+10   The functions return the converted value, if any. If no conversion could be performed,
+     zero is returned. If the correct value overflows and default rounding is in effect (<a href="#7.12.1">7.12.1</a>),
+     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.
+
+
+
+
+     332) 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="#p425" href="p425">page 425</a>] (<a href="#Contents">Contents</a>)
+
+<a name="7.28.4.1.2" href="#7.28.4.1.2"><b>    7.28.4.1.2 The wcstol, wcstoll, wcstoul, and wcstoull functions</b></a>
+    Synopsis
+1          #include <a href="#7.28">&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="#p426" href="p426">page 426</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.28.4.2" href="#7.28.4.2"><b>    7.28.4.2 Wide string copying functions</b></a>
+<a name="7.28.4.2.1" href="#7.28.4.2.1"><b>    7.28.4.2.1 The wcscpy function</b></a>
+    Synopsis
+1           #include <a href="#7.28">&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="#p427" href="p427">page 427</a>] (<a href="#Contents">Contents</a>)
+
+<a name="7.28.4.2.2" href="#7.28.4.2.2"><b>    7.28.4.2.2 The wcsncpy function</b></a>
+    Synopsis
+1            #include <a href="#7.28">&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.333)
+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.28.4.2.3" href="#7.28.4.2.3"><b>    7.28.4.2.3 The wmemcpy function</b></a>
+    Synopsis
+1            #include <a href="#7.28">&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.
+
+
+
+
+    333) 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="#p428" href="p428">page 428</a>] (<a href="#Contents">Contents</a>)
+
+<a name="7.28.4.2.4" href="#7.28.4.2.4"><b>    7.28.4.2.4 The wmemmove function</b></a>
+    Synopsis
+1           #include <a href="#7.28">&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.28.4.3" href="#7.28.4.3"><b>    7.28.4.3 Wide string concatenation functions</b></a>
+<a name="7.28.4.3.1" href="#7.28.4.3.1"><b>    7.28.4.3.1 The wcscat function</b></a>
+    Synopsis
+1           #include <a href="#7.28">&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.28.4.3.2" href="#7.28.4.3.2"><b>    7.28.4.3.2 The wcsncat function</b></a>
+    Synopsis
+1           #include <a href="#7.28">&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="#p429" href="p429">page 429</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.334)
+    Returns
+3   The wcsncat function returns the value of s1.
+<a name="7.28.4.4" href="#7.28.4.4"><b>    7.28.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.28.4.4.1" href="#7.28.4.4.1"><b>    7.28.4.4.1 The wcscmp function</b></a>
+    Synopsis
+1           #include <a href="#7.28">&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.28.4.4.2" href="#7.28.4.4.2"><b>    7.28.4.4.2 The wcscoll function</b></a>
+    Synopsis
+1           #include <a href="#7.28">&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
+
+
+    334) 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="#p430" href="p430">page 430</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.28.4.4.3" href="#7.28.4.4.3"><b>    7.28.4.4.3 The wcsncmp function</b></a>
+    Synopsis
+1           #include <a href="#7.28">&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.28.4.4.4" href="#7.28.4.4.4"><b>    7.28.4.4.4 The wcsxfrm function</b></a>
+    Synopsis
+1           #include <a href="#7.28">&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="#p431" href="p431">page 431</a>] (<a href="#Contents">Contents</a>)
+
+           1 + wcsxfrm(NULL, s, 0)
+
+<a name="7.28.4.4.5" href="#7.28.4.4.5"><b>    7.28.4.4.5 The wmemcmp function</b></a>
+    Synopsis
+1          #include <a href="#7.28">&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.28.4.5" href="#7.28.4.5"><b>    7.28.4.5 Wide string search functions</b></a>
+<a name="7.28.4.5.1" href="#7.28.4.5.1"><b>    7.28.4.5.1 The wcschr function</b></a>
+    Synopsis
+1          #include <a href="#7.28">&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.28.4.5.2" href="#7.28.4.5.2"><b>    7.28.4.5.2 The wcscspn function</b></a>
+    Synopsis
+1          #include <a href="#7.28">&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="#p432" href="p432">page 432</a>] (<a href="#Contents">Contents</a>)
+
+    Returns
+3   The wcscspn function returns the length of the segment.
+<a name="7.28.4.5.3" href="#7.28.4.5.3"><b>    7.28.4.5.3 The wcspbrk function</b></a>
+    Synopsis
+1           #include <a href="#7.28">&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.28.4.5.4" href="#7.28.4.5.4"><b>    7.28.4.5.4 The wcsrchr function</b></a>
+    Synopsis
+1           #include <a href="#7.28">&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.28.4.5.5" href="#7.28.4.5.5"><b>    7.28.4.5.5 The wcsspn function</b></a>
+    Synopsis
+1           #include <a href="#7.28">&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="#p433" href="p433">page 433</a>] (<a href="#Contents">Contents</a>)
+
+<a name="7.28.4.5.6" href="#7.28.4.5.6"><b>    7.28.4.5.6 The wcsstr function</b></a>
+    Synopsis
+1          #include <a href="#7.28">&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.28.4.5.7" href="#7.28.4.5.7"><b>    7.28.4.5.7 The wcstok function</b></a>
+    Synopsis
+1          #include <a href="#7.28">&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="#p434" href="p434">page 434</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.28">&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.28.4.5.8" href="#7.28.4.5.8"><b>    7.28.4.5.8 The wmemchr function</b></a>
+    Synopsis
+1           #include <a href="#7.28">&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="#p435" href="p435">page 435</a>] (<a href="#Contents">Contents</a>)
+
+<a name="7.28.4.6" href="#7.28.4.6"><b>    7.28.4.6 Miscellaneous functions</b></a>
+<a name="7.28.4.6.1" href="#7.28.4.6.1"><b>    7.28.4.6.1 The wcslen function</b></a>
+    Synopsis
+1          #include <a href="#7.28">&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.28.4.6.2" href="#7.28.4.6.2"><b>    7.28.4.6.2 The wmemset function</b></a>
+    Synopsis
+1          #include <a href="#7.28">&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.28.5" href="#7.28.5"><b>    7.28.5 Wide character time conversion functions</b></a>
+<a name="7.28.5.1" href="#7.28.5.1"><b>    7.28.5.1 The wcsftime function</b></a>
+    Synopsis
+1          #include <a href="#7.26">&lt;time.h&gt;</a>
+           #include <a href="#7.28">&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="#p436" href="p436">page 436</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.28.6" href="#7.28.6"><b>    7.28.6 Extended multibyte/wide character conversion utilities</b></a>
+1   The header <a href="#7.28">&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.28.6.3">7.28.6.3</a> and
+    <a href="#7.28.6.4">7.28.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.335)
+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 referenced object is
+    altered as needed to track the shift state, and the position within a multibyte character, for
+    the associated multibyte character sequence.
+
+
+
+
+    335) 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="#p437" href="p437">page 437</a>] (<a href="#Contents">Contents</a>)
+
+<a name="7.28.6.1" href="#7.28.6.1"><b>    7.28.6.1 Single-byte/wide character conversion functions</b></a>
+<a name="7.28.6.1.1" href="#7.28.6.1.1"><b>    7.28.6.1.1 The btowc function</b></a>
+    Synopsis
+1          #include <a href="#7.28">&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.28.6.1.2" href="#7.28.6.1.2"><b>    7.28.6.1.2 The wctob function</b></a>
+    Synopsis
+1          #include <a href="#7.28">&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.28.6.2" href="#7.28.6.2"><b>    7.28.6.2 Conversion state functions</b></a>
+<a name="7.28.6.2.1" href="#7.28.6.2.1"><b>    7.28.6.2.1 The mbsinit function</b></a>
+    Synopsis
+1          #include <a href="#7.28">&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 referenced
+    mbstate_t object describes an initial conversion state.
+
+
+
+[<a name="#p438" href="p438">page 438</a>] (<a href="#Contents">Contents</a>)
+
+    Returns
+3   The mbsinit function returns nonzero if ps is a null pointer or if the referenced object
+    describes an initial conversion state; otherwise, it returns zero.
+<a name="7.28.6.3" href="#7.28.6.3"><b>    7.28.6.3 Restartable multibyte/wide character conversion functions</b></a>
+1   These functions differ from the corresponding multibyte character functions of <a href="#7.22.7">7.22.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 functions are not required to avoid data
+    races in this case. 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.28.6.3.1" href="#7.28.6.3.1"><b>    7.28.6.3.1 The mbrlen function</b></a>
+    Synopsis
+1           #include <a href="#7.28">&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.28.6.3.2">7.28.6.3.2</a>).
+
+
+
+
+[<a name="#p439" href="p439">page 439</a>] (<a href="#Contents">Contents</a>)
+
+<a name="7.28.6.3.2" href="#7.28.6.3.2"><b>    7.28.6.3.2 The mbrtowc function</b></a>
+    Synopsis
+1           #include <a href="#7.28">&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).336)
+    (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.
+
+    336) 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="#p440" href="p440">page 440</a>] (<a href="#Contents">Contents</a>)
+
+<a name="7.28.6.3.3" href="#7.28.6.3.3"><b>    7.28.6.3.3 The wcrtomb function</b></a>
+    Synopsis
+1           #include <a href="#7.28">&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.28.6.4" href="#7.28.6.4"><b>    7.28.6.4 Restartable multibyte/wide string conversion functions</b></a>
+1   These functions differ from the corresponding multibyte string functions of <a href="#7.22.8">7.22.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 functions are not required to avoid data races in this
+    case. 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="#p441" href="p441">page 441</a>] (<a href="#Contents">Contents</a>)
+
+<a name="7.28.6.4.1" href="#7.28.6.4.1"><b>    7.28.6.4.1 The mbsrtowcs function</b></a>
+    Synopsis
+1            #include <a href="#7.28">&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.337) 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).
+
+
+
+
+    337) Thus, the value of len is ignored if dst is a null pointer.
+
+[<a name="#p442" href="p442">page 442</a>] (<a href="#Contents">Contents</a>)
+
+<a name="7.28.6.4.2" href="#7.28.6.4.2"><b>    7.28.6.4.2 The wcsrtombs function</b></a>
+    Synopsis
+1           #include <a href="#7.28">&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.338)
+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).
+
+
+
+
+    338) 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="#p443" href="p443">page 443</a>] (<a href="#Contents">Contents</a>)
+
+<a name="7.29" href="#7.29"><b>    7.29 Wide character classification and mapping utilities &lt;wctype.h&gt;</b></a>
+<a name="7.29.1" href="#7.29.1"><b>    7.29.1 Introduction</b></a>
+1   The header <a href="#7.29">&lt;wctype.h&gt;</a> defines one macro, and declares three data types and many
+    functions.339)
+2   The types declared are
+             wint_t
+    described in <a href="#7.28.1">7.28.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.28.1">7.28.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.
+
+
+
+
+    339) See ''future library directions'' (<a href="#7.30.13">7.30.13</a>).
+
+[<a name="#p444" href="p444">page 444</a>] (<a href="#Contents">Contents</a>)
+
+<a name="7.29.2" href="#7.29.2"><b>    7.29.2 Wide character classification utilities</b></a>
+1   The header <a href="#7.29">&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.29.2.1" href="#7.29.2.1"><b>    7.29.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.340)
+    Forward references: the wctob function (<a href="#7.28.6.1.2">7.28.6.1.2</a>).
+<a name="7.29.2.1.1" href="#7.29.2.1.1"><b>    7.29.2.1.1 The iswalnum function</b></a>
+    Synopsis
+1           #include <a href="#7.29">&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.29.2.1.2" href="#7.29.2.1.2"><b>    7.29.2.1.2 The iswalpha function</b></a>
+    Synopsis
+1           #include <a href="#7.29">&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
+
+    340) 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="#p445" href="p445">page 445</a>] (<a href="#Contents">Contents</a>)
+
+    wide characters for which none of iswcntrl, iswdigit, iswpunct, or iswspace
+    is true.341)
+<a name="7.29.2.1.3" href="#7.29.2.1.3"><b>    7.29.2.1.3 The iswblank function</b></a>
+    Synopsis
+1           #include <a href="#7.29">&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.29.2.1.4" href="#7.29.2.1.4"><b>    7.29.2.1.4 The iswcntrl function</b></a>
+    Synopsis
+1           #include <a href="#7.29">&lt;wctype.h&gt;</a>
+            int iswcntrl(wint_t wc);
+    Description
+2   The iswcntrl function tests for any control wide character.
+<a name="7.29.2.1.5" href="#7.29.2.1.5"><b>    7.29.2.1.5 The iswdigit function</b></a>
+    Synopsis
+1           #include <a href="#7.29">&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.29.2.1.6" href="#7.29.2.1.6"><b>    7.29.2.1.6 The iswgraph function</b></a>
+    Synopsis
+1           #include <a href="#7.29">&lt;wctype.h&gt;</a>
+            int iswgraph(wint_t wc);
+
+
+
+
+    341) The functions iswlower and iswupper test true or false separately for each of these additional
+         wide characters; all four combinations are possible.
+
+[<a name="#p446" href="p446">page 446</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.342)
+<a name="7.29.2.1.7" href="#7.29.2.1.7"><b>    7.29.2.1.7 The iswlower function</b></a>
+    Synopsis
+1           #include <a href="#7.29">&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.29.2.1.8" href="#7.29.2.1.8"><b>    7.29.2.1.8 The iswprint function</b></a>
+    Synopsis
+1           #include <a href="#7.29">&lt;wctype.h&gt;</a>
+            int iswprint(wint_t wc);
+    Description
+2   The iswprint function tests for any printing wide character.
+<a name="7.29.2.1.9" href="#7.29.2.1.9"><b>    7.29.2.1.9 The iswpunct function</b></a>
+    Synopsis
+1           #include <a href="#7.29">&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.342)
+<a name="7.29.2.1.10" href="#7.29.2.1.10"><b>    7.29.2.1.10 The iswspace function</b></a>
+    Synopsis
+1           #include <a href="#7.29">&lt;wctype.h&gt;</a>
+            int iswspace(wint_t wc);
+
+
+
+    342) 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="#p447" href="p447">page 447</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.29.2.1.11" href="#7.29.2.1.11"><b>    7.29.2.1.11 The iswupper function</b></a>
+    Synopsis
+1          #include <a href="#7.29">&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.29.2.1.12" href="#7.29.2.1.12"><b>    7.29.2.1.12 The iswxdigit function</b></a>
+    Synopsis
+1          #include <a href="#7.29">&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.29.2.2" href="#7.29.2.2"><b>    7.29.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.29.2.1">7.29.2.1</a>).
+<a name="7.29.2.2.1" href="#7.29.2.2.1"><b>    7.29.2.2.1 The iswctype function</b></a>
+    Synopsis
+1          #include <a href="#7.29">&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.29.2.1">7.29.2.1</a>) in the comment that follows the expression:
+
+
+[<a name="#p448" href="p448">page 448</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. If desc is zero, the iswctype
+    function returns zero (false).
+    Forward references: the wctype function (<a href="#7.29.2.2.2">7.29.2.2.2</a>).
+<a name="7.29.2.2.2" href="#7.29.2.2.2"><b>    7.29.2.2.2 The wctype function</b></a>
+    Synopsis
+1           #include <a href="#7.29">&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="#p449" href="p449">page 449</a>] (<a href="#Contents">Contents</a>)
+
+<a name="7.29.3" href="#7.29.3"><b>    7.29.3 Wide character case mapping utilities</b></a>
+1   The header <a href="#7.29">&lt;wctype.h&gt;</a> declares several functions useful for mapping wide characters.
+<a name="7.29.3.1" href="#7.29.3.1"><b>    7.29.3.1 Wide character case mapping functions</b></a>
+<a name="7.29.3.1.1" href="#7.29.3.1.1"><b>    7.29.3.1.1 The towlower function</b></a>
+    Synopsis
+1          #include <a href="#7.29">&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.29.3.1.2" href="#7.29.3.1.2"><b>    7.29.3.1.2 The towupper function</b></a>
+    Synopsis
+1          #include <a href="#7.29">&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.29.3.2" href="#7.29.3.2"><b>    7.29.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.29.3.1">7.29.3.1</a>).
+
+
+
+
+[<a name="#p450" href="p450">page 450</a>] (<a href="#Contents">Contents</a>)
+
+<a name="7.29.3.2.1" href="#7.29.3.2.1"><b>    7.29.3.2.1 The towctrans function</b></a>
+    Synopsis
+1           #include <a href="#7.29">&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.29.3.1">7.29.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. If desc is zero, the towctrans function returns the value of wc.
+<a name="7.29.3.2.2" href="#7.29.3.2.2"><b>    7.29.3.2.2 The wctrans function</b></a>
+    Synopsis
+1           #include <a href="#7.29">&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="#p451" href="p451">page 451</a>] (<a href="#Contents">Contents</a>)
+
+<a name="7.30" href="#7.30"><b>    7.30 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.30.1" href="#7.30.1"><b>    7.30.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.30.2" href="#7.30.2"><b>    7.30.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.30.3" href="#7.30.3"><b>    7.30.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.30.4" href="#7.30.4"><b>    7.30.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.30.5" href="#7.30.5"><b>    7.30.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.30.6" href="#7.30.6"><b>    7.30.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.30.7" href="#7.30.7"><b>    7.30.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.30.8" href="#7.30.8"><b>    7.30.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.20">&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.20">&lt;stdint.h&gt;</a> header.
+
+[<a name="#p452" href="p452">page 452</a>] (<a href="#Contents">Contents</a>)
+
+<a name="7.30.9" href="#7.30.9"><b>    7.30.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 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.30.10" href="#7.30.10"><b>    7.30.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.22">&lt;stdlib.h&gt;</a> header.
+<a name="7.30.11" href="#7.30.11"><b>    7.30.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.23">&lt;string.h&gt;</a> header.
+<a name="7.30.12" href="#7.30.12"><b>    7.30.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.28">&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.30.13" href="#7.30.13"><b>    7.30.13 Wide character classification and mapping utilities</b></a>
+    <a href="#7.29">&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.29">&lt;wctype.h&gt;</a> header.
+
+
+
+
+[<a name="#p453" href="p453">page 453</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="#p454" href="p454">page 454</a>] (<a href="#Contents">Contents</a>)
+
+<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
+              alignof                     goto                  union
+              auto                        if                    unsigned
+              break                       inline                void
+              case                        int                   volatile
+              char                        long                  while
+              const                       register              _Alignas
+              continue                    restrict              _Atomic
+              default                     return                _Bool
+              do                          short                 _Complex
+              double                      signed                _Generic
+              else                        sizeof                _Imaginary
+              enum                        static                _Noreturn
+              extern                      struct                _Static_assert
+              float                       switch                _Thread_local
+              for                         typedef
+<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="#p455" href="p455">page 455</a>] (<a href="#Contents">Contents</a>)
+
+<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 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 name="#p456" href="p456">page 456</a>] (<a href="#Contents">Contents</a>)
+
+(<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 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 name="#p457" href="p457">page 457</a>] (<a href="#Contents">Contents</a>)
+
+(<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 '
+              u' c-char-sequence '
+              U' c-char-sequence '
+(<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 name="#p458" href="p458">page 458</a>] (<a href="#Contents">Contents</a>)
+
+(<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:
+               encoding-prefixopt " s-char-sequenceopt "
+(<a href="#6.4.5">6.4.5</a>) encoding-prefix:
+              u8
+              u
+              U
+              L
+(<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="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="#p459" href="p459">page 459</a>] (<a href="#Contents">Contents</a>)
+
+<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="#p460" href="p460">page 460</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 )
+              generic-selection
+(<a href="#6.5.1.1">6.5.1.1</a>) generic-selection:
+              _Generic ( assignment-expression , generic-assoc-list )
+(<a href="#6.5.1.1">6.5.1.1</a>) generic-assoc-list:
+              generic-association
+              generic-assoc-list , generic-association
+(<a href="#6.5.1.1">6.5.1.1</a>) generic-association:
+              type-name : assignment-expression
+              default : assignment-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 )
+              alignof ( type-name )
+
+[<a name="#p461" href="p461">page 461</a>] (<a href="#Contents">Contents</a>)
+
+(<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 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 name="#p462" href="p462">page 462</a>] (<a href="#Contents">Contents</a>)
+
+(<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 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 ;
+               static_assert-declaration
+(<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
+               alignment-specifier declaration-specifiersopt
+(<a href="#6.7">6.7</a>) init-declarator-list:
+               init-declarator
+               init-declarator-list , init-declarator
+
+
+[<a name="#p463" href="p463">page 463</a>] (<a href="#Contents">Contents</a>)
+
+(<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
+              _Thread_local
+              auto
+              register
+(<a href="#6.7.2">6.7.2</a>) type-specifier:
+               void
+               char
+               short
+               int
+               long
+               float
+               double
+               signed
+               unsigned
+               _Bool
+               _Complex
+               atomic-type-specifier
+               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-listopt ;
+               static_assert-declaration
+
+[<a name="#p464" href="p464">page 464</a>] (<a href="#Contents">Contents</a>)
+
+(<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 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.2.4">6.7.2.4</a>) atomic-type-specifier:
+              _Atomic ( type-name )
+(<a href="#6.7.3">6.7.3</a>) type-qualifier:
+              const
+              restrict
+              volatile
+              _Atomic
+(<a href="#6.7.4">6.7.4</a>) function-specifier:
+               inline
+               _Noreturn
+(<a href="#6.7.5">6.7.5</a>) alignment-specifier:
+              _Alignas ( type-name )
+              _Alignas ( constant-expression )
+(<a href="#6.7.6">6.7.6</a>) declarator:
+              pointeropt direct-declarator
+
+
+
+[<a name="#p465" href="p465">page 465</a>] (<a href="#Contents">Contents</a>)
+
+(<a href="#6.7.6">6.7.6</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.6">6.7.6</a>) pointer:
+               * type-qualifier-listopt
+               * type-qualifier-listopt pointer
+(<a href="#6.7.6">6.7.6</a>) type-qualifier-list:
+              type-qualifier
+              type-qualifier-list type-qualifier
+(<a href="#6.7.6">6.7.6</a>) parameter-type-list:
+             parameter-list
+             parameter-list , ...
+(<a href="#6.7.6">6.7.6</a>) parameter-list:
+             parameter-declaration
+             parameter-list , parameter-declaration
+(<a href="#6.7.6">6.7.6</a>) parameter-declaration:
+             declaration-specifiers declarator
+             declaration-specifiers abstract-declaratoropt
+(<a href="#6.7.6">6.7.6</a>) identifier-list:
+               identifier
+               identifier-list , identifier
+(<a href="#6.7.7">6.7.7</a>) type-name:
+              specifier-qualifier-list abstract-declaratoropt
+(<a href="#6.7.7">6.7.7</a>) abstract-declarator:
+              pointer
+              pointeropt direct-abstract-declarator
+
+
+
+
+[<a name="#p466" href="p466">page 466</a>] (<a href="#Contents">Contents</a>)
+
+(<a href="#6.7.7">6.7.7</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.8">6.7.8</a>) typedef-name:
+              identifier
+(<a href="#6.7.9">6.7.9</a>) initializer:
+                assignment-expression
+                { initializer-list }
+                { initializer-list , }
+(<a href="#6.7.9">6.7.9</a>) initializer-list:
+                designationopt initializer
+                initializer-list , designationopt initializer
+(<a href="#6.7.9">6.7.9</a>) designation:
+              designator-list =
+(<a href="#6.7.9">6.7.9</a>) designator-list:
+              designator
+              designator-list designator
+(<a href="#6.7.9">6.7.9</a>) designator:
+              [ constant-expression ]
+              . identifier
+(<a href="#6.7.10">6.7.10</a>) static_assert-declaration:
+               _Static_assert ( constant-expression , string-literal ) ;
+
+
+
+
+[<a name="#p467" href="p467">page 467</a>] (<a href="#Contents">Contents</a>)
+
+<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 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="#p468" href="p468">page 468</a>] (<a href="#Contents">Contents</a>)
+
+<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 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 name="#p469" href="p469">page 469</a>] (<a href="#Contents">Contents</a>)
+
+(<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 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="#p470" href="p470">page 470</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
+        static_assert
+        void assert(scalar expression);
+<a name="B.2" href="#B.2"><b>B.2 Complex &lt;complex.h&gt;</b></a>
+        __STDC_NO_COMPLEX__           imaginary
+        complex                         _Imaginary_I
+        _Complex_I                      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);
+
+[<a name="#p471" href="p471">page 471</a>] (<a href="#Contents">Contents</a>)
+
+      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 CMPLX(double x, double y);
+      float complex CMPLXF(float x, float y);
+      long double complex CMPLXL(long double x, long double y);
+      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);
+
+[<a name="#p472" href="p472">page 472</a>] (<a href="#Contents">Contents</a>)
+
+        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="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
+        __STDC_WANT_LIB_EXT1__
+        errno_t
+<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);
+
+[<a name="#p473" href="p473">page 473</a>] (<a href="#Contents">Contents</a>)
+
+      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="B.6" href="#B.6"><b>B.6 Characteristics of floating types &lt;float.h&gt;</b></a>
+      FLT_ROUNDS              DBL_DIG                 FLT_MAX
+      FLT_EVAL_METHOD         LDBL_DIG                DBL_MAX
+      FLT_HAS_SUBNORM         FLT_MIN_EXP             LDBL_MAX
+      DBL_HAS_SUBNORM         DBL_MIN_EXP             FLT_EPSILON
+      LDBL_HAS_SUBNORM        LDBL_MIN_EXP            DBL_EPSILON
+      FLT_RADIX               FLT_MIN_10_EXP          LDBL_EPSILON
+      FLT_MANT_DIG            DBL_MIN_10_EXP          FLT_MIN
+      DBL_MANT_DIG            LDBL_MIN_10_EXP         DBL_MIN
+      LDBL_MANT_DIG           FLT_MAX_EXP             LDBL_MIN
+      FLT_DECIMAL_DIG         DBL_MAX_EXP             FLT_TRUE_MIN
+      DBL_DECIMAL_DIG         LDBL_MAX_EXP            DBL_TRUE_MIN
+      LDBL_DECIMAL_DIG        FLT_MAX_10_EXP          LDBL_TRUE_MIN
+      DECIMAL_DIG             DBL_MAX_10_EXP
+      FLT_DIG                 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);
+
+[<a name="#p474" href="p474">page 474</a>] (<a href="#Contents">Contents</a>)
+
+        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="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);
+[<a name="#p475" href="p475">page 475</a>] (<a href="#Contents">Contents</a>)
+
+      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);
+
+[<a name="#p476" href="p476">page 476</a>] (<a href="#Contents">Contents</a>)
+
+        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);
+
+[<a name="#p477" href="p477">page 477</a>] (<a href="#Contents">Contents</a>)
+
+      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);
+
+[<a name="#p478" href="p478">page 478</a>] (<a href="#Contents">Contents</a>)
+
+        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);
+
+[<a name="#p479" href="p479">page 479</a>] (<a href="#Contents">Contents</a>)
+
+      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);
+<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);
+      _Noreturn 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="#p480" href="p480">page 480</a>] (<a href="#Contents">Contents</a>)
+
+<a name="B.14" href="#B.14"><b>B.14 Alignment &lt;stdalign.h&gt;</b></a>
+        alignas
+        __alignas_is_defined
+<a name="B.15" href="#B.15"><b>B.15 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.16" href="#B.16"><b>B.16 Atomics &lt;stdatomic.h&gt;</b></a>
+        ATOMIC_CHAR_LOCK_FREE           atomic_uint
+        ATOMIC_CHAR16_T_LOCK_FREE       atomic_long
+        ATOMIC_CHAR32_T_LOCK_FREE       atomic_ulong
+        ATOMIC_WCHAR_T_LOCK_FREE        atomic_llong
+        ATOMIC_SHORT_LOCK_FREE          atomic_ullong
+        ATOMIC_INT_LOCK_FREE            atomic_char16_t
+        ATOMIC_LONG_LOCK_FREE           atomic_char32_t
+        ATOMIC_LLONG_LOCK_FREE          atomic_wchar_t
+        ATOMIC_ADDRESS_LOCK_FREE        atomic_int_least8_t
+        ATOMIC_FLAG_INIT                atomic_uint_least8_t
+        memory_order                    atomic_int_least16_t
+        atomic_flag                     atomic_uint_least16_t
+        atomic_bool                     atomic_int_least32_t
+        atomic_address                  atomic_uint_least32_t
+        memory_order_relaxed            atomic_int_least64_t
+        memory_order_consume            atomic_uint_least64_t
+        memory_order_acquire            atomic_int_fast8_t
+        memory_order_release            atomic_uint_fast8_t
+        memory_order_acq_rel            atomic_int_fast16_t
+        memory_order_seq_cst            atomic_uint_fast16_t
+        atomic_char                     atomic_int_fast32_t
+        atomic_schar                    atomic_uint_fast32_t
+        atomic_uchar                    atomic_int_fast64_t
+        atomic_short                    atomic_uint_fast64_t
+        atomic_ushort                   atomic_intptr_t
+        atomic_int                      atomic_uintptr_t
+
+
+
+[<a name="#p481" href="p481">page 481</a>] (<a href="#Contents">Contents</a>)
+
+      atomic_size_t                     atomic_intmax_t
+      atomic_ptrdiff_t                  atomic_uintmax_t
+      #define ATOMIC_VAR_INIT(C value)
+      void atomic_init(volatile A *obj, C value);
+      type kill_dependency(type y);
+      void atomic_thread_fence(memory_order order);
+      void atomic_signal_fence(memory_order order);
+      _Bool atomic_is_lock_free(atomic_type const volatile *obj);
+      void atomic_store(volatile A *object, C desired);
+      void atomic_store_explicit(volatile A *object,
+            C desired, memory_order order);
+      C atomic_load(volatile A *object);
+      C atomic_load_explicit(volatile A *object,
+            memory_order order);
+      C atomic_exchange(volatile A *object, C desired);
+      C atomic_exchange_explicit(volatile A *object,
+            C desired, memory_order order);
+      _Bool atomic_compare_exchange_strong(volatile A *object,
+            C *expected, C desired);
+      _Bool atomic_compare_exchange_strong_explicit(
+            volatile A *object, C *expected, C desired,
+            memory_order success, memory_order failure);
+      _Bool atomic_compare_exchange_weak(volatile A *object,
+            C *expected, C desired);
+      _Bool atomic_compare_exchange_weak_explicit(
+            volatile A *object, C *expected, C desired,
+            memory_order success, memory_order failure);
+      C atomic_fetch_key(volatile A *object, M operand);
+      C atomic_fetch_key_explicit(volatile A *object,
+            M operand, memory_order order);
+      bool atomic_flag_test_and_set(
+            volatile atomic_flag *object);
+      bool atomic_flag_test_and_set_explicit(
+            volatile atomic_flag *object, memory_order order);
+      void atomic_flag_clear(volatile atomic_flag *object);
+      void atomic_flag_clear_explicit(
+            volatile atomic_flag *object, memory_order order);
+
+
+
+
+[<a name="#p482" href="p482">page 482</a>] (<a href="#Contents">Contents</a>)
+
+<a name="B.17" href="#B.17"><b>B.17 Boolean type and values &lt;stdbool.h&gt;</b></a>
+        bool
+        true
+        false
+        __bool_true_false_are_defined
+<a name="B.18" href="#B.18"><b>B.18 Common definitions &lt;stddef.h&gt;</b></a>
+        ptrdiff_t       max_align_t       NULL
+        size_t          wchar_t
+        offsetof(type, member-designator)
+        __STDC_WANT_LIB_EXT1__
+        rsize_t
+<a name="B.19" href="#B.19"><b>B.19 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
+        __STDC_WANT_LIB_EXT1__
+        RSIZE_MAX
+
+
+
+
+[<a name="#p483" href="p483">page 483</a>] (<a href="#Contents">Contents</a>)
+
+<a name="B.20" href="#B.20"><b>B.20 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
+      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);
+
+[<a name="#p484" href="p484">page 484</a>] (<a href="#Contents">Contents</a>)
+
+        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);
+        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);
+        __STDC_WANT_LIB_EXT1__
+        L_tmpnam_s    TMP_MAX_S         errno_t          rsize_t
+        errno_t tmpfile_s(FILE * restrict * restrict streamptr);
+        errno_t tmpnam_s(char *s, rsize_t maxsize);
+
+
+
+[<a name="#p485" href="p485">page 485</a>] (<a href="#Contents">Contents</a>)
+
+      errno_t fopen_s(FILE * restrict * restrict streamptr,
+           const char * restrict filename,
+           const char * restrict mode);
+      errno_t freopen_s(FILE * restrict * restrict newstreamptr,
+           const char * restrict filename,
+           const char * restrict mode,
+           FILE * restrict stream);
+      int fprintf_s(FILE * restrict stream,
+           const char * restrict format, ...);
+      int fscanf_s(FILE * restrict stream,
+           const char * restrict format, ...);
+      int printf_s(const char * restrict format, ...);
+      int scanf_s(const char * restrict format, ...);
+      int snprintf_s(char * restrict s, rsize_t n,
+           const char * restrict format, ...);
+      int sprintf_s(char * restrict s, rsize_t n,
+           const char * restrict format, ...);
+      int sscanf_s(const char * restrict s,
+           const char * restrict format, ...);
+      int vfprintf_s(FILE * restrict stream,
+           const char * restrict format,
+           va_list arg);
+      int vfscanf_s(FILE * restrict stream,
+           const char * restrict format,
+           va_list arg);
+      int vprintf_s(const char * restrict format,
+           va_list arg);
+      int vscanf_s(const char * restrict format,
+           va_list arg);
+      int vsnprintf_s(char * restrict s, rsize_t n,
+           const char * restrict format,
+           va_list arg);
+      int vsprintf_s(char * restrict s, rsize_t n,
+           const char * restrict format,
+           va_list arg);
+      int vsscanf_s(const char * restrict s,
+           const char * restrict format,
+           va_list arg);
+      char *gets_s(char *s, rsize_t n);
+
+
+
+[<a name="#p486" href="p486">page 486</a>] (<a href="#Contents">Contents</a>)
+
+<a name="B.21" href="#B.21"><b>B.21 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
+        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 *aligned_alloc(size_t alignment, size_t size);
+        void *calloc(size_t nmemb, size_t size);
+        void free(void *ptr);
+        void *malloc(size_t size);
+        void *realloc(void *ptr, size_t size);
+        _Noreturn void abort(void);
+        int atexit(void (*func)(void));
+        int at_quick_exit(void (*func)(void));
+        _Noreturn void exit(int status);
+        _Noreturn void _Exit(int status);
+        char *getenv(const char *name);
+        _Noreturn void quick_exit(int status);
+        int system(const char *string);
+
+
+[<a name="#p487" href="p487">page 487</a>] (<a href="#Contents">Contents</a>)
+
+      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);
+      __STDC_WANT_LIB_EXT1__
+      errno_t
+      rsize_t
+      constraint_handler_t
+      constraint_handler_t set_constraint_handler_s(
+           constraint_handler_t handler);
+      void abort_handler_s(
+           const char * restrict msg,
+           void * restrict ptr,
+           errno_t error);
+      void ignore_handler_s(
+           const char * restrict msg,
+           void * restrict ptr,
+           errno_t error);
+      errno_t getenv_s(size_t * restrict len,
+                char * restrict value, rsize_t maxsize,
+                const char * restrict name);
+
+
+
+
+[<a name="#p488" href="p488">page 488</a>] (<a href="#Contents">Contents</a>)
+
+        void *bsearch_s(const void *key, const void *base,
+             rsize_t nmemb, rsize_t size,
+             int (*compar)(const void *k, const void *y,
+                             void *context),
+             void *context);
+        errno_t qsort_s(void *base, rsize_t nmemb, rsize_t size,
+             int (*compar)(const void *x, const void *y,
+                             void *context),
+             void *context);
+        errno_t wctomb_s(int * restrict status,
+             char * restrict s,
+             rsize_t smax,
+             wchar_t wc);
+        errno_t mbstowcs_s(size_t * restrict retval,
+             wchar_t * restrict dst, rsize_t dstmax,
+             const char * restrict src, rsize_t len);
+        errno_t wcstombs_s(size_t * restrict retval,
+             char * restrict dst, rsize_t dstmax,
+             const wchar_t * restrict src, rsize_t len);
+<a name="B.22" href="#B.22"><b>B.22 String handling &lt;string.h&gt;</b></a>
+        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);
+[<a name="#p489" href="p489">page 489</a>] (<a href="#Contents">Contents</a>)
+
+      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);
+      __STDC_WANT_LIB_EXT1__
+      errno_t
+      rsize_t
+      errno_t memcpy_s(void * restrict s1, rsize_t s1max,
+           const void * restrict s2, rsize_t n);
+      errno_t memmove_s(void *s1, rsize_t s1max,
+           const void *s2, rsize_t n);
+      errno_t strcpy_s(char * restrict s1,
+           rsize_t s1max,
+           const char * restrict s2);
+      errno_t strncpy_s(char * restrict s1,
+           rsize_t s1max,
+           const char * restrict s2,
+           rsize_t n);
+      errno_t strcat_s(char * restrict s1,
+           rsize_t s1max,
+           const char * restrict s2);
+      errno_t strncat_s(char * restrict s1,
+           rsize_t s1max,
+           const char * restrict s2,
+           rsize_t n);
+      char *strtok_s(char * restrict s1,
+           rsize_t * restrict s1max,
+           const char * restrict s2,
+           char ** restrict ptr);
+      errno_t memset_s(void *s, rsize_t smax, int c, rsize_t n)
+      errno_t strerror_s(char *s, rsize_t maxsize,
+           errno_t errnum);
+      size_t strerrorlen_s(errno_t errnum);
+
+[<a name="#p490" href="p490">page 490</a>] (<a href="#Contents">Contents</a>)
+
+        size_t strnlen_s(const char *s, size_t maxsize);
+<a name="B.23" href="#B.23"><b>B.23 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.24" href="#B.24"><b>B.24 Threads &lt;threads.h&gt;</b></a>
+        ONCE_FLAG_INIT                 mtx_plain
+        TSS_DTOR_ITERATIONS            mtx_recursive
+        cnd_t                          mtx_timed
+        thrd_t                         mtx_try
+        tss_t                          thrd_timeout
+        mtx_t                          thrd_success
+        tss_dtor_t                     thrd_busy
+        thrd_start_t                   thrd_error
+        once_flag                      thrd_nomem
+        xtime
+      void call_once(once_flag *flag, void (*func)(void));
+      int cnd_broadcast(cnd_t *cond);
+      void cnd_destroy(cnd_t *cond);
+      int cnd_init(cnd_t *cond);
+      int cnd_signal(cnd_t *cond);
+      int cnd_timedwait(cnd_t *cond, mtx_t *mtx,
+           const xtime *xt);
+      int cnd_wait(cnd_t *cond, mtx_t *mtx);
+      void mtx_destroy(mtx_t *mtx);
+      int mtx_init(mtx_t *mtx, int type);
+      int mtx_lock(mtx_t *mtx);
+[<a name="#p491" href="p491">page 491</a>] (<a href="#Contents">Contents</a>)
+
+      int mtx_timedlock(mtx_t *mtx, const xtime *xt);
+      int mtx_trylock(mtx_t *mtx);
+      int mtx_unlock(mtx_t *mtx);
+      int thrd_create(thrd_t *thr, thrd_start_t func,
+           void *arg);
+      thrd_t thrd_current(void);
+      int thrd_detach(thrd_t thr);
+      int thrd_equal(thrd_t thr0, thrd_t thr1);
+      void thrd_exit(int res);
+      int thrd_join(thrd_t thr, int *res);
+      void thrd_sleep(const xtime *xt);
+      void thrd_yield(void);
+      int tss_create(tss_t *key, tss_dtor_t dtor);
+      void tss_delete(tss_t key);
+      void *tss_get(tss_t key);
+      int tss_set(tss_t key, void *val);
+      int xtime_get(xtime *xt, int base);
+<a name="B.25" href="#B.25"><b>B.25 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);
+      __STDC_WANT_LIB_EXT1__
+      errno_t
+      rsize_t
+      errno_t asctime_s(char *s, rsize_t maxsize,
+           const struct tm *timeptr);
+
+
+
+[<a name="#p492" href="p492">page 492</a>] (<a href="#Contents">Contents</a>)
+
+        errno_t ctime_s(char *s, rsize_t maxsize,
+             const time_t *timer);
+        struct tm *gmtime_s(const time_t * restrict timer,
+             struct tm * restrict result);
+        struct tm *localtime_s(const time_t * restrict timer,
+             struct tm * restrict result);
+<a name="B.26" href="#B.26"><b>B.26 Unicode utilities &lt;uchar.h&gt;</b></a>
+        mbstate_t     size_t            char16_t         char32_t
+        size_t mbrtoc16(char16_t * restrict pc16,
+             const char * restrict s, size_t n,
+             mbstate_t * restrict ps);
+        size_t c16rtomb(char * restrict s, char16_t c16,
+             mbstate_t * restrict ps);
+        size_t mbrtoc32(char32_t * restrict pc32,
+             const char * restrict s, size_t n,
+             mbstate_t * restrict ps);
+        size_t c32rtomb(char * restrict s, char32_t c32,
+             mbstate_t * restrict ps);
+<a name="B.27" href="#B.27"><b>B.27 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, ...);
+        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);
+
+
+
+[<a name="#p493" href="p493">page 493</a>] (<a href="#Contents">Contents</a>)
+
+      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);
+
+
+
+[<a name="#p494" href="p494">page 494</a>] (<a href="#Contents">Contents</a>)
+
+        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);
+
+
+
+[<a name="#p495" href="p495">page 495</a>] (<a href="#Contents">Contents</a>)
+
+      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);
+      __STDC_WANT_LIB_EXT1__
+      errno_t
+      rsize_t
+      int fwprintf_s(FILE * restrict stream,
+           const wchar_t * restrict format, ...);
+      int fwscanf_s(FILE * restrict stream,
+           const wchar_t * restrict format, ...);
+      int snwprintf_s(wchar_t * restrict s,
+           rsize_t n,
+           const wchar_t * restrict format, ...);
+      int swprintf_s(wchar_t * restrict s, rsize_t n,
+           const wchar_t * restrict format, ...);
+      int swscanf_s(const wchar_t * restrict s,
+           const wchar_t * restrict format, ...);
+      int vfwprintf_s(FILE * restrict stream,
+           const wchar_t * restrict format,
+           va_list arg);
+      int vfwscanf_s(FILE * restrict stream,
+           const wchar_t * restrict format, va_list arg);
+      int vsnwprintf_s(wchar_t * restrict s,
+           rsize_t n,
+           const wchar_t * restrict format,
+           va_list arg);
+      int vswprintf_s(wchar_t * restrict s,
+           rsize_t n,
+           const wchar_t * restrict format,
+           va_list arg);
+      int vswscanf_s(const wchar_t * restrict s,
+           const wchar_t * restrict format,
+           va_list arg);
+
+
+
+[<a name="#p496" href="p496">page 496</a>] (<a href="#Contents">Contents</a>)
+
+        int vwprintf_s(const wchar_t * restrict format,
+             va_list arg);
+        int vwscanf_s(const wchar_t * restrict format,
+             va_list arg);
+        int wprintf_s(const wchar_t * restrict format, ...);
+        int wscanf_s(const wchar_t * restrict format, ...);
+        errno_t wcscpy_s(wchar_t * restrict s1,
+             rsize_t s1max,
+             const wchar_t * restrict s2);
+        errno_t wcsncpy_s(wchar_t * restrict s1,
+             rsize_t s1max,
+             const wchar_t * restrict s2,
+             rsize_t n);
+        errno_t wmemcpy_s(wchar_t * restrict s1,
+             rsize_t s1max,
+             const wchar_t * restrict s2,
+             rsize_t n);
+        errno_t wmemmove_s(wchar_t *s1, rsize_t s1max,
+             const wchar_t *s2, rsize_t n);
+        errno_t wcscat_s(wchar_t * restrict s1,
+             rsize_t s1max,
+             const wchar_t * restrict s2);
+        errno_t wcsncat_s(wchar_t * restrict s1,
+             rsize_t s1max,
+             const wchar_t * restrict s2,
+             rsize_t n);
+        wchar_t *wcstok_s(wchar_t * restrict s1,
+             rsize_t * restrict s1max,
+             const wchar_t * restrict s2,
+             wchar_t ** restrict ptr);
+        size_t wcsnlen_s(const wchar_t *s, size_t maxsize);
+        errno_t wcrtomb_s(size_t * restrict retval,
+             char * restrict s, rsize_t smax,
+             wchar_t wc, mbstate_t * restrict ps);
+        errno_t mbsrtowcs_s(size_t * restrict retval,
+             wchar_t * restrict dst, rsize_t dstmax,
+             const char ** restrict src, rsize_t len,
+             mbstate_t * restrict ps);
+
+
+
+
+[<a name="#p497" href="p497">page 497</a>] (<a href="#Contents">Contents</a>)
+
+      errno_t wcsrtombs_s(size_t * restrict retval,
+           char * restrict dst, rsize_t dstmax,
+           const wchar_t ** restrict src, rsize_t len,
+           mbstate_t * restrict ps);
+<a name="B.28" href="#B.28"><b>B.28 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);
+      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="#p498" href="p498">page 498</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>:
+    -- Between the evaluations of the function designator and actual arguments in a function
+      call and the actual call. (<a href="#6.5.2.2">6.5.2.2</a>).
+    -- Between the evaluations of the first and second operands 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>); comma , (<a href="#6.5.17">6.5.17</a>).                  *
+    -- Between the evaluations of the first operand of the conditional ? : operator and
+      whichever of the second and third operands is evaluated (<a href="#6.5.15">6.5.15</a>).
+    -- The end of a full declarator: declarators (<a href="#6.7.6">6.7.6</a>);
+    -- Between the evaluation of a full expression and the next full expression to be
+      evaluated. The following are full expressions: an initializer that is not part of a
+      compound literal (<a href="#6.7.9">6.7.9</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 (optional)
+      expressions of a for statement (<a href="#6.8.5.3">6.8.5.3</a>); the (optional) 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.21.6">7.21.6</a>, <a href="#7.28.2">7.28.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.22.5">7.22.5</a>).
+
+
+
+
+[<a name="#p499" href="p499">page 499</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.
+<a name="D.1" href="#D.1"><b>    D.1 Ranges of characters allowed</b></a>
+1   00A8, 00AA, 00AD, 00AF, 00B2-00B5, 00B7-00BA, 00BC-00BE, 00C0-00D6,
+    00D8-00F6, 00F8-00FF
+2   0100-167F, 1681-180D, 180F-1FFF
+3   200B-200D, 202A-202E, 203F-2040, 2054, 2060-206F
+4   2070-218F, 2460-24FF, 2776-2793, 2C00-2DFF, 2E80-2FFF
+5   3004-3007, 3021-302F, 3031-303F
+6   3040-D7FF
+7   F900-FD3D, FD40-FDCF, FDF0-FE44, FE47-FFFD
+8   10000-1FFFD, 20000-2FFFD, 30000-3FFFD, 40000-4FFFD, 50000-5FFFD,
+    60000-6FFFD, 70000-7FFFD, 80000-8FFFD, 90000-9FFFD, A0000-AFFFD,
+    B0000-BFFFD, C0000-CFFFD, D0000-DFFFD, E0000-EFFFD
+<a name="D.2" href="#D.2"><b>    D.2 Ranges of characters disallowed initially</b></a>
+1   0300-036F, 1DC0-1DFF, 20D0-20FF, FE20-FE2F
+
+
+
+
+[<a name="#p500" href="p500">page 500</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="#p501" href="p501">page 501</a>] (<a href="#Contents">Contents</a>)
+
+           #define    DLB_DECIMAL_DIG                                10
+           #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_DECIMAL_DIG                                 6
+           #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    LDLB_DECIMAL_DIG                               10
+           #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="#p502" href="p502">page 502</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.343)
+    Where a binding between the C language and IEC 60559 is indicated, the
+    IEC 60559-specified behavior is adopted by reference, unless stated otherwise. Since
+    negative and positive infinity are representable in IEC 60559 formats, all real numbers lie
+    within the range of representable values.
+<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,344) 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.345)
+
+
+
+
+    343) Implementations that do not define __STDC_IEC_559__ are not required to conform to these
+         specifications.
+    344) ''Extended'' is IEC 60559's double-extended data format. Extended refers to both the common 80-bit
+         and quadruple 128-bit IEC 60559 formats.
+    345) A non-IEC 60559 long double type is required to provide infinity and NaNs, as its values include
+         all double values.
+
+[<a name="#p503" href="p503">page 503</a>] (<a href="#Contents">Contents</a>)
+
+    Recommended practice
+2   The long double type should match an IEC 60559 extended format.
+<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.346) 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.22">&lt;stdlib.h&gt;</a>,
+
+
+    346) Since NaNs created by IEC 60559 operations are always quiet, quiet NaNs (along with infinities) are
+         sufficient for closure of the arithmetic.
+
+[<a name="#p504" href="p504">page 504</a>] (<a href="#Contents">Contents</a>)
+
+   <a href="#7.21">&lt;stdio.h&gt;</a>, and <a href="#7.28">&lt;wchar.h&gt;</a> provide IEC 60559 binary-decimal conversions. The
+   strtold function in <a href="#7.22">&lt;stdlib.h&gt;</a> provides the conv function recommended in the
+   Appendix to ANSI/IEEE 854.
+-- 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 fabs functions in <a href="#7.12">&lt;math.h&gt;</a> provide the abs function recommended in the
+  Appendix to IEC 60559.
+-- The unary minus (-) operator provides the unary 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
+
+[<a name="#p505" href="p505">page 505</a>] (<a href="#Contents">Contents</a>)
+
+        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.
+    -- 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 integer type is _Bool, <a href="#6.3.1.2">6.3.1.2</a> applies and no floating-point exceptions are raised
+    (even for NaN). Otherwise, 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. Otherwise, the resulting
+    value is determined by <a href="#6.3.1.4">6.3.1.4</a>. Conversion of an integral floating value that does not
+    exceed the range of the integer type raises no floating-point exceptions; whether
+    conversion of a non-integral floating value raises the ''inexact'' floating-point exception is
+    unspecified.347)
+<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.348)
+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.
+
+
+
+    347) 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>.
+    348) 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="#p506" href="p506">page 506</a>] (<a href="#Contents">Contents</a>)
+
+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.
+<a name="F.6" href="#F.6"><b>    F.6 The return statement</b></a>
+    If the return expression is evaluated in a floating-point format different from the return
+    type, the expression is converted as if by assignment349) to the return type of the function
+    and the resulting value is returned to the caller.
+<a name="F.7" href="#F.7"><b>    F.7 Contracted expressions</b></a>
+1   A contracted expression is correctly rounded (once) and 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 name="F.8" href="#F.8"><b>    F.8 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.350)
+<a name="F.8.1" href="#F.8.1"><b>    F.8.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.351)
+
+
+
+
+    349) Assignment removes any extra range and precision.
+    350) This specification does not require dynamic rounding precision nor trap enablement modes.
+    351) 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.9">F.9</a>).
+
+[<a name="#p507" href="p507">page 507</a>] (<a href="#Contents">Contents</a>)
+
+<a name="F.8.2" href="#F.8.2"><b>    F.8.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
+    floating-point exception, other than ''inexact'';352) the implementation should then
+    proceed with the translation of the program.
+<a name="F.8.3" href="#F.8.3"><b>    F.8.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.8.4" href="#F.8.4"><b>    F.8.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 or thread 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'').353)
+2   EXAMPLE
+
+
+
+    352) 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.
+    353) Where the state for the FENV_ACCESS pragma is ''on'', results of inexact expressions like <a href="#1.0">1.0</a>/3.0
+         are affected by rounding modes set at execution time, and expressions such as 0.0/0.0 and
+         <a href="#1.0">1.0</a>/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 = <a href="#1.0">1.0</a>/3.0;
+
+
+[<a name="#p508" href="p508">page 508</a>] (<a href="#Contents">Contents</a>)
+
+             #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
+    execution time.
+
+<a name="F.8.5" href="#F.8.5"><b>    F.8.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 or thread 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.354) 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
+
+
+
+    354) 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="#p509" href="p509">page 509</a>] (<a href="#Contents">Contents</a>)
+
+    their internal representations occur at translation time in all cases.
+
+<a name="F.8.6" href="#F.8.6"><b>    F.8.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.9" href="#F.9"><b>    F.9 Optimization</b></a>
+1   This section identifies code transformations that might subvert IEC 60559-specified
+    behavior, and others that do not.
+<a name="F.9.1" href="#F.9.1"><b>    F.9.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,
+[<a name="#p510" href="p510">page 510</a>] (<a href="#Contents">Contents</a>)
+
+    the preceding loop could be treated as
+             if (0 &lt; n) x + 1;
+<a name="F.9.2" href="#F.9.2"><b>    F.9.2 Expression transformations</b></a>
+1   x/2 (&lt;-&gt;) x 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 x and x/1 (-&gt;) x The expressions 1 x x, x/1, and x are equivalent (on IEC 60559
+                      machines, among others).355)
+    x/x (-&gt;) <a href="#1.0">1.0</a>             The expressions x/x and <a href="#1.0">1.0</a> 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).356)
+    x - x (-&gt;) 0.0           The expressions x - x and 0.0 are not equivalent if x is a NaN or
+                           infinite.
+    0 x x (-&gt;) 0.0           The expressions 0 x 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 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).
+
+    355) Strict support for signaling NaNs -- not required by this specification -- would invalidate these and
+         other transformations that remove arithmetic operators.
+    356) 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="#p511" href="p511">page 511</a>] (<a href="#Contents">Contents</a>)
+
+<a name="F.9.3" href="#F.9.3"><b>    F.9.3 Relational operators</b></a>
+1   x != x (-&gt;) false           The expression x != x is true if x is a NaN.
+    x = x (-&gt;) true            The expression 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
+             // calls g without raising ''invalid'' if a and b are unordered
+             if (isless(a,b))
+                     f();
+             else
+                     g();
+    but is equivalent to
+
+
+
+
+[<a name="#p512" href="p512">page 512</a>] (<a href="#Contents">Contents</a>)
+
+            if (!(a &lt; b))
+                  g();
+            else
+                  f();
+
+<a name="F.9.4" href="#F.9.4"><b>    F.9.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.8.4">F.8.4</a>
+    and <a href="#F.8.5">F.8.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,357) 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.10" href="#F.10"><b>    F.10 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
+    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.358)
+
+
+    357) 0 - 0 yields -0 instead of +0 just when the rounding direction is downward.
+    358) IEC 60559 allows different definitions of underflow. They all result in the same values, but differ on
+         when the floating-point exception is raised.
+
+[<a name="#p513" href="p513">page 513</a>] (<a href="#Contents">Contents</a>)
+
+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.359) Otherwise, as implied by <a href="#F.8.6">F.8.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.10.1" href="#F.10.1"><b>     F.10.1 Trigonometric functions</b></a>
+<a name="F.10.1.1" href="#F.10.1.1"><b>     F.10.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.
+<a name="F.10.1.2" href="#F.10.1.2"><b>     F.10.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.
+
+
+
+
+     359) It is intended that undeserved ''underflow'' and ''inexact'' floating-point exceptions are raised only if
+          avoiding them would be too costly.
+
+[<a name="#p514" href="p514">page 514</a>] (<a href="#Contents">Contents</a>)
+
+<a name="F.10.1.3" href="#F.10.1.3"><b>    F.10.1.3 The atan functions</b></a>
+1   -- atan((+-)0) returns (+-)0.
+    -- atan((+-)(inf)) returns (+-)pi /2.
+<a name="F.10.1.4" href="#F.10.1.4"><b>    F.10.1.4 The atan2 functions</b></a>
+1   -- atan2((+-)0, -0) returns (+-)pi .360)
+    -- 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.10.1.5" href="#F.10.1.5"><b>    F.10.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.10.1.6" href="#F.10.1.6"><b>    F.10.1.6 The sin functions</b></a>
+1   -- sin((+-)0) returns (+-)0.
+    -- sin((+-)(inf)) returns a NaN and raises the ''invalid'' floating-point exception.
+<a name="F.10.1.7" href="#F.10.1.7"><b>    F.10.1.7 The tan functions</b></a>
+1   -- tan((+-)0) returns (+-)0.
+    -- tan((+-)(inf)) returns a NaN and raises the ''invalid'' floating-point exception.
+
+
+
+
+    360) 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="#p515" href="p515">page 515</a>] (<a href="#Contents">Contents</a>)
+
+<a name="F.10.2" href="#F.10.2"><b>    F.10.2 Hyperbolic functions</b></a>
+<a name="F.10.2.1" href="#F.10.2.1"><b>    F.10.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.10.2.2" href="#F.10.2.2"><b>    F.10.2.2 The asinh functions</b></a>
+1   -- asinh((+-)0) returns (+-)0.
+    -- asinh((+-)(inf)) returns (+-)(inf).
+<a name="F.10.2.3" href="#F.10.2.3"><b>    F.10.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.10.2.4" href="#F.10.2.4"><b>    F.10.2.4 The cosh functions</b></a>
+1   -- cosh((+-)0) returns 1.
+    -- cosh((+-)(inf)) returns +(inf).
+<a name="F.10.2.5" href="#F.10.2.5"><b>    F.10.2.5 The sinh functions</b></a>
+1   -- sinh((+-)0) returns (+-)0.
+    -- sinh((+-)(inf)) returns (+-)(inf).
+<a name="F.10.2.6" href="#F.10.2.6"><b>    F.10.2.6 The tanh functions</b></a>
+1   -- tanh((+-)0) returns (+-)0.
+    -- tanh((+-)(inf)) returns (+-)1.
+<a name="F.10.3" href="#F.10.3"><b>    F.10.3 Exponential and logarithmic functions</b></a>
+<a name="F.10.3.1" href="#F.10.3.1"><b>    F.10.3.1 The exp functions</b></a>
+1   -- exp((+-)0) returns 1.
+    -- exp(-(inf)) returns +0.
+    -- exp(+(inf)) returns +(inf).
+
+
+
+
+[<a name="#p516" href="p516">page 516</a>] (<a href="#Contents">Contents</a>)
+
+<a name="F.10.3.2" href="#F.10.3.2"><b>    F.10.3.2 The exp2 functions</b></a>
+1   -- exp2((+-)0) returns 1.
+    -- exp2(-(inf)) returns +0.
+    -- exp2(+(inf)) returns +(inf).
+<a name="F.10.3.3" href="#F.10.3.3"><b>    F.10.3.3 The expm1 functions</b></a>
+1   -- expm1((+-)0) returns (+-)0.
+    -- expm1(-(inf)) returns -1.
+    -- expm1(+(inf)) returns +(inf).
+<a name="F.10.3.4" href="#F.10.3.4"><b>    F.10.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   When the radix of the argument is a power of 2, the returned value is exact and is
+    independent of the current rounding direction mode.
+4   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.10.3.5" href="#F.10.3.5"><b>    F.10.3.5 The ilogb functions</b></a>
+1   When the correct result is representable in the range of the return type, the returned value
+    is exact and is independent of the current rounding direction mode.
+2   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="#p517" href="p517">page 517</a>] (<a href="#Contents">Contents</a>)
+
+<a name="F.10.3.6" href="#F.10.3.6"><b>    F.10.3.6 The ldexp functions</b></a>
+1   On a binary system, ldexp(x, exp) is equivalent to scalbn(x, exp).
+<a name="F.10.3.7" href="#F.10.3.7"><b>    F.10.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.10.3.8" href="#F.10.3.8"><b>    F.10.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.10.3.9" href="#F.10.3.9"><b>    F.10.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.10.3.10" href="#F.10.3.10"><b>    F.10.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.10.3.11" href="#F.10.3.11"><b>    F.10.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).
+2   The returned value is exact and is independent of the current rounding direction mode.
+
+
+
+
+[<a name="#p518" href="p518">page 518</a>] (<a href="#Contents">Contents</a>)
+
+<a name="F.10.3.12" href="#F.10.3.12"><b>    F.10.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   The returned values are exact and are independent of the current rounding direction
+    mode.
+3   modf 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 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);
+            }
+<a name="F.10.3.13" href="#F.10.3.13"><b>    F.10.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).
+2   If the calculation does not overflow or underflow, the returned value is exact and
+    independent of the current rounding direction mode.
+
+
+
+
+[<a name="#p519" href="p519">page 519</a>] (<a href="#Contents">Contents</a>)
+
+<a name="F.10.4" href="#F.10.4"><b>    F.10.4 Power and absolute value functions</b></a>
+<a name="F.10.4.1" href="#F.10.4.1"><b>    F.10.4.1 The cbrt functions</b></a>
+1   -- cbrt((+-)0) returns (+-)0.
+    -- cbrt((+-)(inf)) returns (+-)(inf).
+<a name="F.10.4.2" href="#F.10.4.2"><b>    F.10.4.2 The fabs functions</b></a>
+1   -- fabs((+-)0) returns +0.
+    -- fabs((+-)(inf)) returns +(inf).
+2   The returned value is exact and is independent of the current rounding direction mode.
+<a name="F.10.4.3" href="#F.10.4.3"><b>    F.10.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.10.4.4" href="#F.10.4.4"><b>    F.10.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, finite, and not an odd integer.
+    -- pow((+-)0, -(inf)) returns +(inf) and may raise the ''divide-by-zero'' floating-point
+      exception.
+    -- 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.
+
+
+[<a name="#p520" href="p520">page 520</a>] (<a href="#Contents">Contents</a>)
+
+    -- 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="F.10.4.5" href="#F.10.4.5"><b>    F.10.4.5 The sqrt functions</b></a>
+1   sqrt is fully specified as a basic arithmetic operation in IEC 60559. The returned value
+    is dependent on the current rounding direction mode.
+<a name="F.10.5" href="#F.10.5"><b>    F.10.5 Error and gamma functions</b></a>
+<a name="F.10.5.1" href="#F.10.5.1"><b>    F.10.5.1 The erf functions</b></a>
+1   -- erf((+-)0) returns (+-)0.
+    -- erf((+-)(inf)) returns (+-)1.
+<a name="F.10.5.2" href="#F.10.5.2"><b>    F.10.5.2 The erfc functions</b></a>
+1   -- erfc(-(inf)) returns 2.
+    -- erfc(+(inf)) returns +0.
+<a name="F.10.5.3" href="#F.10.5.3"><b>    F.10.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.10.5.4" href="#F.10.5.4"><b>    F.10.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="#p521" href="p521">page 521</a>] (<a href="#Contents">Contents</a>)
+
+<a name="F.10.6" href="#F.10.6"><b>    F.10.6 Nearest integer functions</b></a>
+<a name="F.10.6.1" href="#F.10.6.1"><b>    F.10.6.1 The ceil functions</b></a>
+1   -- ceil((+-)0) returns (+-)0.
+    -- ceil((+-)(inf)) returns (+-)(inf).
+2   The returned value is independent of the current rounding direction mode.
+3   The double version of ceil 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 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;
+           }
+4   The ceil functions may, but are not required to, raise the ''inexact'' floating-point
+    exception for finite non-integer arguments, as this implementation does.
+<a name="F.10.6.2" href="#F.10.6.2"><b>    F.10.6.2 The floor functions</b></a>
+1   -- floor((+-)0) returns (+-)0.
+    -- floor((+-)(inf)) returns (+-)(inf).
+2   The returned value and is independent of the current rounding direction mode.
+3   See the sample implementation for ceil in <a href="#F.10.6.1">F.10.6.1</a>. The floor functions may, but are
+    not required to, raise the ''inexact'' floating-point exception for finite non-integer
+    arguments, as that implementation does.
+<a name="F.10.6.3" href="#F.10.6.3"><b>    F.10.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="#p522" href="p522">page 522</a>] (<a href="#Contents">Contents</a>)
+
+<a name="F.10.6.4" href="#F.10.6.4"><b>    F.10.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.10.6.5" href="#F.10.6.5"><b>    F.10.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="F.10.6.6" href="#F.10.6.6"><b>    F.10.6.6 The round functions</b></a>
+1   -- round((+-)0) returns (+-)0.
+    -- round((+-)(inf)) returns (+-)(inf).
+2   The returned value is independent of the current rounding direction mode.
+3   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 finite non-integer numeric arguments, as this implementation does.
+
+
+
+
+[<a name="#p523" href="p523">page 523</a>] (<a href="#Contents">Contents</a>)
+
+<a name="F.10.6.7" href="#F.10.6.7"><b>    F.10.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.10.6.8" href="#F.10.6.8"><b>    F.10.6.8 The trunc functions</b></a>
+1   The trunc functions use IEC 60559 rounding toward zero (regardless of the current
+    rounding direction). The returned value is exact.
+    -- trunc((+-)0) returns (+-)0.
+    -- trunc((+-)(inf)) returns (+-)(inf).
+2   The returned value is independent of the current rounding direction mode. The trunc
+    functions may, but are not required to, raise the ''inexact'' floating-point exception for
+    finite non-integer arguments.
+<a name="F.10.7" href="#F.10.7"><b>    F.10.7 Remainder functions</b></a>
+<a name="F.10.7.1" href="#F.10.7.1"><b>    F.10.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 (and neither is a NaN).
+    -- fmod(x, (+-)(inf)) returns x for x not infinite.
+2   When subnormal results are supported, the returned value is exact and is independent of
+    the current rounding direction mode.
+3   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="#p524" href="p524">page 524</a>] (<a href="#Contents">Contents</a>)
+
+<a name="F.10.7.2" href="#F.10.7.2"><b>    F.10.7.2 The remainder functions</b></a>
+1   The remainder functions are fully specified as a basic arithmetic operation in
+    IEC 60559.
+2   When subnormal results are supported, the returned value is exact and is independent of
+    the current rounding direction mode.
+<a name="F.10.7.3" href="#F.10.7.3"><b>    F.10.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.
+2   When subnormal results are supported, the returned value is exact and is independent of
+    the current rounding direction mode.
+<a name="F.10.8" href="#F.10.8"><b>    F.10.8 Manipulation functions</b></a>
+<a name="F.10.8.1" href="#F.10.8.1"><b>    F.10.8.1 The copysign functions</b></a>
+1   copysign is specified in the Appendix to IEC 60559.
+2   The returned value is exact and is independent of the current rounding direction mode.
+<a name="F.10.8.2" href="#F.10.8.2"><b>    F.10.8.2 The nan functions</b></a>
+1   All IEC 60559 implementations support quiet NaNs, in all floating formats.
+2   The returned value is exact and is independent of the current rounding direction mode.
+<a name="F.10.8.3" href="#F.10.8.3"><b>    F.10.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.
+2   Even though underflow or overflow can occur, the returned value is independent of the
+    current rounding direction mode.
+<a name="F.10.8.4" href="#F.10.8.4"><b>    F.10.8.4 The nexttoward functions</b></a>
+1   No additional requirements beyond those on nextafter.
+2   Even though underflow or overflow can occur, the returned value is independent of the
+    current rounding direction mode.
+
+
+
+
+[<a name="#p525" href="p525">page 525</a>] (<a href="#Contents">Contents</a>)
+
+<a name="F.10.9" href="#F.10.9"><b>    F.10.9 Maximum, minimum, and positive difference functions</b></a>
+<a name="F.10.9.1" href="#F.10.9.1"><b>    F.10.9.1 The fdim functions</b></a>
+1   No additional requirements.
+<a name="F.10.9.2" href="#F.10.9.2"><b>    F.10.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 returned value is exact and is independent of the current rounding direction mode.
+3   The body of the fmax function might be361)
+           { return (isgreaterequal(x, y) ||
+                isnan(y)) ? x : y; }
+<a name="F.10.9.3" href="#F.10.9.3"><b>    F.10.9.3 The fmin functions</b></a>
+1   The fmin functions are analogous to the fmax functions (see <a href="#F.10.9.2">F.10.9.2</a>).
+2   The returned value is exact and is independent of the current rounding direction mode.
+<a name="F.10.10" href="#F.10.10"><b>    F.10.10 Floating multiply-add</b></a>
+<a name="F.10.10.1" href="#F.10.10.1"><b>    F.10.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.
+
+
+
+
+    361) 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="#p526" href="p526">page 526</a>] (<a href="#Contents">Contents</a>)
+
+<a name="F.10.11" href="#F.10.11"><b>    F.10.11 Comparison macros</b></a>
+1   Relational operators and their corresponding comparison macros (<a href="#7.12.14">7.12.14</a>) produce
+    equivalent result values, even if argument values are represented in wider formats. Thus,
+    comparison macro arguments represented in formats wider than their semantic types are
+    not converted to the semantic types, unless the wide evaluation method converts operands
+    of relational operators to their semantic types. The standard wide evaluation methods
+    characterized by FLT_EVAL_METHOD equal to 1 or 2 (<a href="#5.2.4.2.2">5.2.4.2.2</a>), do not convert
+    operands of relational operators to their semantic types.
+
+
+
+
+[<a name="#p527" href="p527">page 527</a>] (<a href="#Contents">Contents</a>)
+
+<a name="G" href="#G"><b>                                           Annex G</b></a>
+                                          (normative)
+                   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. An implementation that defines *
+    __STDC_IEC_559_COMPLEX__ shall conform to the specifications in this annex.362)
+<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.
+
+
+
+
+    362) Implementations that do not define __STDC_IEC_559_COMPLEX__ are not required to conform
+         to these specifications.
+
+[<a name="#p528" href="p528">page 528</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,363) 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.
+
+
+
+
+    363) See <a href="#6.3.1.2">6.3.1.2</a>.
+
+[<a name="#p529" href="p529">page 529</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:364)
+    -- 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;
+
+
+
+
+    364) 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="#p530" href="p530">page 530</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) ? <a href="#1.0">1.0</a> : 0.0, a);
+                                    b = copysign(isinf(b) ? <a href="#1.0">1.0</a> : 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) ? <a href="#1.0">1.0</a> : 0.0, c);
+                                    d = copysign(isinf(d) ? <a href="#1.0">1.0</a> : 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="#p531" href="p531">page 531</a>] (<a href="#Contents">Contents</a>)
+
+                                      x = INFINITY * ( a * c - b * d );
+                                      y = INFINITY * ( a * d + b * c );
+                           }
+                     }
+                     return x + I * y;
+            }
+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 (logbw == INFINITY) {
+                          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) ? <a href="#1.0">1.0</a> : 0.0,                        a);
+                                 b = copysign(isinf(b) ? <a href="#1.0">1.0</a> : 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) ? <a href="#1.0">1.0</a> : 0.0,                        c);
+                                 d = copysign(isinf(d) ? <a href="#1.0">1.0</a> : 0.0,                        d);
+                                 x = 0.0 * ( a * c + b * d );
+                                 y = 0.0 * ( b * c - a * d );
+
+[<a name="#p532" href="p532">page 532</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="#p533" href="p533">page 533</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.10.365)
+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).
+
+
+
+
+    365) 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="#p534" href="p534">page 534</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="#p535" href="p535">page 535</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="#p536" href="p536">page 536</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="#p537" href="p537">page 537</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="#p538" href="p538">page 538</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="#p539" href="p539">page 539</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 also raise spurious floating-point exceptions.366)
+<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.
+
+
+
+
+    366) This allows cpow( z , c ) to be implemented as cexp(c      clog( z )) without precluding
+         implementations that treat special cases more carefully.
+
+[<a name="#p540" href="p540">page 540</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="#p541" href="p541">page 541</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.18">&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="#p542" href="p542">page 542</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="#p543" href="p543">page 543</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), <a href="#1.0">1.0</a>+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="#p544" href="p544">page 544</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="#p545" href="p545">page 545</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="#p546" href="p546">page 546</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 invoke a user's signal handler for
+    SIGFPE). 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 LIA-1 arithmetic exceptions,
+    if there is any signal raised for them.
+4   C supports signal handlers for SIGFPE and allows trapping of LIA-1 arithmetic
+    exceptions. When LIA-1 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="#p547" href="p547">page 547</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.8">6.7.8</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="#p548" href="p548">page 548</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="#p549" href="p549">page 549</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 values of bytes that correspond to union members other than the one last 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
+[<a name="#p550" href="p550">page 550</a>] (<a href="#Contents">Contents</a>)
+
+   operators (<a href="#6.5">6.5</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.6.2">6.7.6.2</a>).
+-- The order in which any side effects occur among the initialization list expressions in
+  an initializer (<a href="#6.7.9">6.7.9</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>).
+-- 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.8.6">F.8.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.10.3.5">F.10.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.10.6.5">F.10.6.5</a>).
+
+
+[<a name="#p551" href="p551">page 551</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 a comparison macro argument that is represented in a format wider than its
+  semantic type is converted to the semantic type (<a href="#7.12.14">7.12.14</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.16.1">7.16.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.21.6.1">7.21.6.1</a>, <a href="#7.28.2.1">7.28.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.21.7.10">7.21.7.10</a>, <a href="#7.28.3.10">7.28.3.10</a>).
+-- The details of the value stored by the fgetpos function (<a href="#7.21.9.1">7.21.9.1</a>).
+-- The details of the value returned by the ftell function for a text stream (<a href="#7.21.9.4">7.21.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.22.1.3">7.22.1.3</a>, <a href="#7.28.4.1.1">7.28.4.1.1</a>).
+-- The order and contiguity of storage allocated by successive calls to the calloc,
+  malloc, and realloc functions (<a href="#7.22.3">7.22.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.22.3">7.22.3</a>).
+-- Which of two elements that compare as equal is matched by the bsearch function
+  (<a href="#7.22.5.1">7.22.5.1</a>).
+-- The order of two elements that compare as equal in an array sorted by the qsort
+  function (<a href="#7.22.5.2">7.22.5.2</a>).
+-- The encoding of the calendar time returned by the time function (<a href="#7.26.2.4">7.26.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.26.3.5">7.26.3.5</a>, <a href="#7.28.5.1">7.28.5.1</a>).
+-- The conversion state after an encoding error occurs (<a href="#7.28.6.3.2">7.28.6.3.2</a>, <a href="#7.28.6.3.3">7.28.6.3.3</a>, <a href="#7.28.6.4.1">7.28.6.4.1</a>,
+  <a href="#7.28.6.4.2">7.28.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>).
+
+
+
+[<a name="#p552" href="p552">page 552</a>] (<a href="#Contents">Contents</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>).
+    -- 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.10">F.10</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.10">F.10</a>).
+    -- The exponent value stored by frexp for a NaN or infinity (<a href="#F.10.3.4">F.10.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.10.6.5">F.10.6.5</a>,
+      <a href="#F.10.6.7">F.10.6.7</a>).
+    -- The sign of one part of the complex result of several math functions for certain
+      special cases 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>).
+    -- The execution of a program contains a data race (<a href="#5.1.2.4">5.1.2.4</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>).
+
+
+
+[<a name="#p553" href="p553">page 553</a>] (<a href="#Contents">Contents</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.9">6.7.9</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 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 operands to certain operators are such that they 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>).
+-- A program requires the formation of a composite type from a variable length array
+  type whose size is specified by an expression that is not evaluated (<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 designating an object of automatic storage duration that could have been
+  declared with the register storage class is used in a context that requires the value
+  of the designated object, but the object is uninitialized. (<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 referenced
+  type (<a href="#6.3.2.3">6.3.2.3</a>).
+
+
+
+[<a name="#p554" href="p554">page 554</a>] (<a href="#Contents">Contents</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>).
+-- 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>).
+-- A side effect on a scalar object is unsequenced relative to either a different side effect
+  on the same scalar object or a value computation using the value of the same scalar
+  object (<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>).
+-- 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>).
+-- A member of an atomic structure or union is accessed (<a href="#6.5.2.3">6.5.2.3</a>).
+-- The operand of the unary * operator has an invalid value (<a href="#6.5.3.2">6.5.3.2</a>).
+
+
+[<a name="#p555" href="p555">page 555</a>] (<a href="#Contents">Contents</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>).
+-- 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 a complete 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
+
+[<a name="#p556" href="p556">page 556</a>] (<a href="#Contents">Contents</a>)
+
+   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, no anonymous
+  structures, and no anonymous unions (<a href="#6.7.2.1">6.7.2.1</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>).
+-- A function declared with a _Noreturn function specifier returns to its caller (<a href="#6.7.4">6.7.4</a>).
+-- The definition of an object has an alignment specifier and another declaration of that
+  object has a different alignment specifier (<a href="#6.7.5">6.7.5</a>).
+
+
+[<a name="#p557" href="p557">page 557</a>] (<a href="#Contents">Contents</a>)
+
+-- Declarations of an object in different translation units have different alignment
+  specifiers (<a href="#6.7.5">6.7.5</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.6.1">6.7.6.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.6.2">6.7.6.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.6.2">6.7.6.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.6.3">6.7.6.3</a>).
+-- A storage-class specifier or type qualifier modifies the keyword void as a function
+  parameter type list (<a href="#6.7.6.3">6.7.6.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
+  identifier list) (<a href="#6.7.6.3">6.7.6.3</a>).
+-- The value of an unnamed member of a structure or union is used (<a href="#6.7.9">6.7.9</a>).
+-- The initializer for a scalar is neither a single expression nor a single expression
+  enclosed in braces (<a href="#6.7.9">6.7.9</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.9">6.7.9</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.9">6.7.9</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 a complete 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>).
+
+[<a name="#p558" href="p558">page 558</a>] (<a href="#Contents">Contents</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>).
+-- 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 name="#p559" href="p559">page 559</a>] (<a href="#Contents">Contents</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
+  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.22.6.1">7.22.6.1</a>, <a href="#7.22.6.2">7.22.6.2</a>, <a href="#7.22.1">7.22.1</a>).
+
+[<a name="#p560" href="p560">page 560</a>] (<a href="#Contents">Contents</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 duration that does not have 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>).
+-- 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 or thread storage duration that is not a
+  lock-free atomic object 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, the quick_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.16">7.16</a>, <a href="#7.16.1.1">7.16.1.1</a>, <a href="#7.16.1.4">7.16.1.4</a>).
+
+[<a name="#p561" href="p561">page 561</a>] (<a href="#Contents">Contents</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.16">7.16</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.16.1">7.16.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.16.1">7.16.1</a>, <a href="#7.16.1.2">7.16.1.2</a>, <a href="#7.16.1.3">7.16.1.3</a>,
+  <a href="#7.16.1.4">7.16.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.16.1.1">7.16.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.16.1.1">7.16.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.16.1.2">7.16.1.2</a>, <a href="#7.16.1.4">7.16.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.16.1.4">7.16.1.4</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.19">7.19</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.20.4">7.20.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.21.2">7.21.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.21.2">7.21.2</a>).
+-- The value of a pointer to a FILE object is used after the associated file is closed
+  (<a href="#7.21.3">7.21.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.21.5.2">7.21.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.21.5.3">7.21.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
+[<a name="#p562" href="p562">page 562</a>] (<a href="#Contents">Contents</a>)
+
+   operation on an update stream is followed by an output operation with an intervening
+   call to a file positioning function (<a href="#7.21.5.3">7.21.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.21.5.6">7.21.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.21.6.1">7.21.6.1</a>,
+  <a href="#7.21.6.2">7.21.6.2</a>, <a href="#7.28.2.1">7.28.2.1</a>, <a href="#7.28.2.2">7.28.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.21.6.1">7.21.6.1</a>, <a href="#7.21.6.2">7.21.6.2</a>, <a href="#7.26.3.5">7.26.3.5</a>, <a href="#7.28.2.1">7.28.2.1</a>, <a href="#7.28.2.2">7.28.2.2</a>,
+  <a href="#7.28.5.1">7.28.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.21.6.1">7.21.6.1</a>, <a href="#7.28.2.1">7.28.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.21.6.1">7.21.6.1</a>, <a href="#7.28.2.1">7.28.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.21.6.1">7.21.6.1</a>, <a href="#7.28.2.1">7.28.2.1</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.21.6.1">7.21.6.1</a>,
+  <a href="#7.21.6.2">7.21.6.2</a>, <a href="#7.28.2.1">7.28.2.1</a>, <a href="#7.28.2.2">7.28.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.21.6.1">7.21.6.1</a>, <a href="#7.28.2.1">7.28.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.21.6.1">7.21.6.1</a>,
+  <a href="#7.21.6.2">7.21.6.2</a>, <a href="#7.28.2.1">7.28.2.1</a>, <a href="#7.28.2.2">7.28.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.21.6.1">7.21.6.1</a>,
+  <a href="#7.21.6.2">7.21.6.2</a>, <a href="#7.28.2.1">7.28.2.1</a>, <a href="#7.28.2.2">7.28.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.21.6.1">7.21.6.1</a>, <a href="#7.21.6.2">7.21.6.2</a>,
+  <a href="#7.26.3.5">7.26.3.5</a>, <a href="#7.28.2.1">7.28.2.1</a>, <a href="#7.28.2.2">7.28.2.2</a>, <a href="#7.28.5.1">7.28.5.1</a>).
+-- The number of characters transmitted by a formatted output function is greater than
+  INT_MAX (<a href="#7.21.6.1">7.21.6.1</a>, <a href="#7.21.6.3">7.21.6.3</a>, <a href="#7.21.6.8">7.21.6.8</a>, <a href="#7.21.6.10">7.21.6.10</a>).
+
+
+[<a name="#p563" href="p563">page 563</a>] (<a href="#Contents">Contents</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.21.6.2">7.21.6.2</a>, <a href="#7.28.2.2">7.28.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.21.6.2">7.21.6.2</a>, <a href="#7.28.2.2">7.28.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.21.6.2">7.21.6.2</a>, <a href="#7.28.2.2">7.28.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.21.6.2">7.21.6.2</a>, <a href="#7.28.2.2">7.28.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.21.6.8">7.21.6.8</a>, <a href="#7.21.6.9">7.21.6.9</a>, <a href="#7.21.6.10">7.21.6.10</a>, <a href="#7.21.6.11">7.21.6.11</a>, <a href="#7.21.6.12">7.21.6.12</a>, <a href="#7.21.6.13">7.21.6.13</a>, <a href="#7.21.6.14">7.21.6.14</a>,
+  <a href="#7.28.2.5">7.28.2.5</a>, <a href="#7.28.2.6">7.28.2.6</a>, <a href="#7.28.2.7">7.28.2.7</a>, <a href="#7.28.2.8">7.28.2.8</a>, <a href="#7.28.2.9">7.28.2.9</a>, <a href="#7.28.2.10">7.28.2.10</a>).
+-- The contents of the array supplied in a call to the fgets or fgetws function are
+  used after a read error occurred (<a href="#7.21.7.2">7.21.7.2</a>, <a href="#7.28.3.2">7.28.3.2</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.21.7.10">7.21.7.10</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.21.8.1">7.21.8.1</a>, <a href="#7.21.8.2">7.21.8.2</a>).
+-- A partial element read by a call to the fread function is used (<a href="#7.21.8.1">7.21.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.21.9.2">7.21.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.21.9.3">7.21.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.22.3">7.22.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.22.3">7.22.3</a>).
+
+
+[<a name="#p564" href="p564">page 564</a>] (<a href="#Contents">Contents</a>)
+
+-- The alignment requested of the aligned_alloc function is not valid or not
+  supported by the implementation, or the size requested is not an integral multiple of
+  the alignment (<a href="#7.22.3.1">7.22.3.1</a>).
+-- The pointer argument to the free or realloc function does not match a pointer
+  earlier returned by a memory management function, or the space has been deallocated
+  by a call to free or realloc (<a href="#7.22.3.3">7.22.3.3</a>, <a href="#7.22.3.5">7.22.3.5</a>).
+-- The value of the object allocated by the malloc function is used (<a href="#7.22.3.4">7.22.3.4</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.22.3.5">7.22.3.5</a>).
+-- The program calls the exit or quick_exit function more than once, or calls both
+  functions (<a href="#7.22.4.4">7.22.4.4</a>, <a href="#7.22.4.7">7.22.4.7</a>).
+-- During the call to a function registered with the atexit or at_quick_exit
+  function, a call is made to the longjmp function that would terminate the call to the
+  registered function (<a href="#7.22.4.4">7.22.4.4</a>, <a href="#7.22.4.7">7.22.4.7</a>).
+-- The string set up by the getenv or strerror function is modified by the program
+  (<a href="#7.22.4.6">7.22.4.6</a>, <a href="#7.23.6.2">7.23.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.22.4.8">7.22.4.8</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.22.5">7.22.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.22.5">7.22.5</a>).
+-- The array being searched by the bsearch function does not have its elements in
+  proper order (<a href="#7.22.5.1">7.22.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.22.7">7.22.7</a>).
+-- A string or wide string utility function is instructed to access an array beyond the end
+  of an object (<a href="#7.23.1">7.23.1</a>, <a href="#7.28.4">7.28.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.23.1">7.23.1</a>, <a href="#7.28.4">7.28.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.23.4.5">7.23.4.5</a>, <a href="#7.26.3.5">7.26.3.5</a>, <a href="#7.28.4.4.4">7.28.4.4.4</a>,
+  <a href="#7.28.5.1">7.28.5.1</a>).
+
+[<a name="#p565" href="p565">page 565</a>] (<a href="#Contents">Contents</a>)
+
+    -- The first argument in the very first call to the strtok or wcstok is a null pointer
+      (<a href="#7.23.5.8">7.23.5.8</a>, <a href="#7.28.4.5.7">7.28.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.24">7.24</a>).
+    -- A complex argument is supplied for a generic parameter of a type-generic macro that
+      has no corresponding complex function (<a href="#7.24">7.24</a>).
+    -- At least one field of the broken-down time passed to asctime contains a value
+      outside its normal range, or the calculated year exceeds four digits or is less than the
+      year 1000 (<a href="#7.26.3.1">7.26.3.1</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.28.2.11">7.28.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.28.4.5.7">7.28.4.5.7</a>).
+    -- An mbstate_t object is used inappropriately (<a href="#7.28.6">7.28.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.29.1">7.29.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.29.2.2.1">7.29.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.29.3.2.1">7.29.3.2.1</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="#p566" href="p566">page 566</a>] (<a href="#Contents">Contents</a>)
+
+<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>).
+    -- Whether a program can have more than one thread of execution in a freestanding
+      environment (<a href="#5.1.2.4">5.1.2.4</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.22.4.6">7.22.4.6</a>).
+    -- The manner of execution of the string by the system function (<a href="#7.22.4.8">7.22.4.8</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="#p567" href="p567">page 567</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 a single multibyte character that maps to multiple members of the extended
+      execution character set, 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>).
+    -- Whether differently-prefixed wide string literal tokens can be concatenated and, if so,
+      the treatment of the resulting multibyte character sequence (<a href="#6.4.5">6.4.5</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>).
+    -- The encoding of any of wchar_t, char16_t, and char32_t where the
+      corresponding  standard   encoding macro      (__STDC_ISO_10646__,
+      __STDC_UTF_16__, or __STDC_UTF_32__) is not defined (<a href="#6.10.8.2">6.10.8.2</a>).
+
+
+
+
+[<a name="#p568" href="p568">page 568</a>] (<a href="#Contents">Contents</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>).
+    -- 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.21">&lt;stdio.h&gt;</a>,
+      <a href="#7.22">&lt;stdlib.h&gt;</a>, and <a href="#7.28">&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="#p569" href="p569">page 569</a>] (<a href="#Contents">Contents</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="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 atomic types are permitted for bit-fields (<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>).
+
+
+[<a name="#p570" href="p570">page 570</a>] (<a href="#Contents">Contents</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>).
+    -- 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.1">6.10.8.1</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 or pole 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>).
+
+[<a name="#p571" href="p571">page 571</a>] (<a href="#Contents">Contents</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>).
+-- 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.19">7.19</a>).
+-- Whether the last line of a text stream requires a terminating new-line character
+  (<a href="#7.21.2">7.21.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.21.2">7.21.2</a>).
+-- The number of null characters that may be appended to data written to a binary
+  stream (<a href="#7.21.2">7.21.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.21.3">7.21.3</a>).
+-- Whether a write on a text stream causes the associated file to be truncated beyond that
+  point (<a href="#7.21.3">7.21.3</a>).
+-- The characteristics of file buffering (<a href="#7.21.3">7.21.3</a>).
+-- Whether a zero-length file actually exists (<a href="#7.21.3">7.21.3</a>).
+-- The rules for composing valid file names (<a href="#7.21.3">7.21.3</a>).
+-- Whether the same file can be simultaneously open multiple times (<a href="#7.21.3">7.21.3</a>).
+-- The nature and choice of encodings used for multibyte characters in files (<a href="#7.21.3">7.21.3</a>).
+-- The effect of the remove function on an open file (<a href="#7.21.4.1">7.21.4.1</a>).
+-- The effect if a file with the new name exists prior to a call to the rename function
+  (<a href="#7.21.4.2">7.21.4.2</a>).
+-- Whether an open temporary file is removed upon abnormal program termination
+  (<a href="#7.21.4.3">7.21.4.3</a>).
+-- Which changes of mode are permitted (if any), and under what circumstances
+  (<a href="#7.21.5.4">7.21.5.4</a>).
+
+[<a name="#p572" href="p572">page 572</a>] (<a href="#Contents">Contents</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.21.6.1">7.21.6.1</a>, <a href="#7.28.2.1">7.28.2.1</a>).
+-- The output for %p conversion in the fprintf or fwprintf function (<a href="#7.21.6.1">7.21.6.1</a>,
+  <a href="#7.28.2.1">7.28.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.21.6.2">7.21.6.2</a>, <a href="#7.28.2.1">7.28.2.1</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.21.6.2">7.21.6.2</a>, <a href="#7.28.2.2">7.28.2.2</a>).
+-- The value to which the macro errno is set by the fgetpos, fsetpos, or ftell
+  functions on failure (<a href="#7.21.9.1">7.21.9.1</a>, <a href="#7.21.9.3">7.21.9.3</a>, <a href="#7.21.9.4">7.21.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.22.1.3">7.22.1.3</a>, <a href="#7.28.4.1.1">7.28.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.22.1.3">7.22.1.3</a>, <a href="#7.28.4.1.1">7.28.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.22.3">7.22.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.22.4.1">7.22.4.1</a>, <a href="#7.22.4.5">7.22.4.5</a>).
+-- The termination status returned to the host environment by the abort, exit,
+  _Exit, or quick_exit function (<a href="#7.22.4.1">7.22.4.1</a>, <a href="#7.22.4.4">7.22.4.4</a>, <a href="#7.22.4.5">7.22.4.5</a>, <a href="#7.22.4.7">7.22.4.7</a>).
+-- The value returned by the system function when its argument is not a null pointer
+  (<a href="#7.22.4.8">7.22.4.8</a>).
+-- The local time zone and Daylight Saving Time (<a href="#7.26.1">7.26.1</a>).
+-- The range and precision of times representable in clock_t and time_t (<a href="#7.26">7.26</a>).
+-- The era for the clock function (<a href="#7.26.2.1">7.26.2.1</a>).
+-- The replacement string for the %Z specifier to the strftime, and wcsftime
+  functions in the "C" locale (<a href="#7.26.3.5">7.26.3.5</a>, <a href="#7.28.5.1">7.28.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.10">F.10</a>).
+
+
+
+
+[<a name="#p573" href="p573">page 573</a>] (<a href="#Contents">Contents</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.20">&lt;stdint.h&gt;</a> (<a href="#5.2.4.2">5.2.4.2</a>, <a href="#7.20.2">7.20.2</a>, <a href="#7.20.3">7.20.3</a>).
+    -- The result of attempting to indirectly access an object with automatic or thread
+      storage duration from a thread other than the one with which it is associated (<a href="#6.2.4">6.2.4</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>).
+    -- Whether any extended alignments are supported and the contexts in which they are
+      supported (<a href="#6.2.8">6.2.8</a>).
+    -- Valid alignment values other than those returned by an alignof expression for
+      fundamental types, if any (<a href="#6.2.8">6.2.8</a>).
+    -- The value of the result of the sizeof and alignof operators (<a href="#6.5.3.4">6.5.3.4</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.29.2">7.29.2</a>).
+    -- The set of control characters (<a href="#7.4">7.4</a>, <a href="#7.29.2">7.29.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.29.2.1.2">7.29.2.1.2</a>, <a href="#7.29.2.1.3">7.29.2.1.3</a>, <a href="#7.29.2.1.7">7.29.2.1.7</a>, <a href="#7.29.2.1.9">7.29.2.1.9</a>, <a href="#7.29.2.1.10">7.29.2.1.10</a>, <a href="#7.29.2.1.11">7.29.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.22.1">7.22.1</a>,
+      <a href="#7.28.4.1">7.28.4.1</a>).
+    -- The collation sequence of the execution character set (<a href="#7.23.4.3">7.23.4.3</a>, <a href="#7.28.4.4.2">7.28.4.4.2</a>).
+
+
+[<a name="#p574" href="p574">page 574</a>] (<a href="#Contents">Contents</a>)
+
+    -- The contents of the error message strings set up by the strerror function
+      (<a href="#7.23.6.2">7.23.6.2</a>).
+    -- The formats for time and date (<a href="#7.26.3.5">7.26.3.5</a>, <a href="#7.28.5.1">7.28.5.1</a>).
+    -- Character mappings that are supported by the towctrans function (<a href="#7.29.1">7.29.1</a>).
+    -- Character classifications that are supported by the iswctype function (<a href="#7.29.1">7.29.1</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="#p575" href="p575">page 575</a>] (<a href="#Contents">Contents</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="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="#p576" href="p576">page 576</a>] (<a href="#Contents">Contents</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.22.4.4">7.22.4.4</a>), the implementation
+    writes some diagnostics indicating the fact to the stderr stream, if it is still open,
+<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.21.2">7.21.2</a>).
+2   Additional file-opening modes may be specified by characters appended to the mode
+    argument of the fopen function (<a href="#7.21.5.3">7.21.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.21.7.10">7.21.7.10</a>,
+<a name="7.28.3.10)" href="#7.28.3.10)"><b>    7.28.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="#p577" href="p577">page 577</a>] (<a href="#Contents">Contents</a>)
+
+<a name="K" href="#K"><b>                                           Annex K</b></a>
+                                          (normative)
+                              Bounds-checking interfaces
+<a name="K.1" href="#K.1"><b>    K.1 Background</b></a>
+1   Traditionally, the C Library has contained many functions that trust the programmer to
+    provide output character arrays big enough to hold the result being produced. Not only
+    do these functions not check that the arrays are big enough, they frequently lack the
+    information needed to perform such checks. While it is possible to write safe, robust, and
+    error-free code using the existing library, the library tends to promote programming styles
+    that lead to mysterious failures if a result is too big for the provided array.
+2   A common programming style is to declare character arrays large enough to handle most
+    practical cases. However, if these arrays are not large enough to handle the resulting
+    strings, data can be written past the end of the array overwriting other data and program
+    structures. The program never gets any indication that a problem exists, and so never has
+    a chance to recover or to fail gracefully.
+3   Worse, this style of programming has compromised the security of computers and
+    networks. Buffer overflows can often be exploited to run arbitrary code with the
+    permissions of the vulnerable (defective) program.
+4   If the programmer writes runtime checks to verify lengths before calling library
+    functions, then those runtime checks frequently duplicate work done inside the library
+    functions, which discover string lengths as a side effect of doing their job.
+5   This annex provides alternative library functions that promote safer, more secure
+    programming. The alternative functions verify that output buffers are large enough for
+    the intended result and return a failure indicator if they are not. Data is never written past
+    the end of an array. All string results are null terminated.
+6   This annex also addresses another problem that complicates writing robust code:
+    functions that are not reentrant because they return pointers to static objects owned by the
+    function. Such functions can be troublesome since a previously returned result can
+    change if the function is called again, perhaps by another thread.
+
+
+
+
+[<a name="#p578" href="p578">page 578</a>] (<a href="#Contents">Contents</a>)
+
+<a name="K.2" href="#K.2"><b>    K.2 Scope</b></a>
+1   This annex specifies a series of optional extensions that can be useful in the mitigation of
+    security vulnerabilities in programs, and comprise new functions, macros, and types
+    declared or defined in existing standard headers.
+2   An implementation that defines __STDC_LIB_EXT1__ shall conform to the
+    specifications in this annex.367)
+3   Subclause <a href="#K.3">K.3</a> should be read as if it were merged into the parallel structure of named
+    subclauses of clause 7.
+<a name="K.3" href="#K.3"><b>    K.3 Library</b></a>
+<a name="K.3.1" href="#K.3.1"><b>    K.3.1 Introduction</b></a>
+<a name="K.3.1.1" href="#K.3.1.1"><b>    K.3.1.1 Standard headers</b></a>
+1   The functions, macros, and types declared or defined in <a href="#K.3">K.3</a> and its subclauses are not
+    declared or defined by their respective headers if __STDC_WANT_LIB_EXT1__ is
+    defined as a macro which expands to the integer constant 0 at the point in the source file
+    where the appropriate header is first included.
+2   The functions, macros, and types declared or defined in <a href="#K.3">K.3</a> and its subclauses are
+    declared and defined by their respective headers if __STDC_WANT_LIB_EXT1__ is
+    defined as a macro which expands to the integer constant 1 at the point in the source file
+    where the appropriate header is first included.368)
+3   It is implementation-defined whether the functions, macros, and types declared or defined
+    in <a href="#K.3">K.3</a> and its subclauses are declared or defined by their respective headers if
+    __STDC_WANT_LIB_EXT1__ is not defined as a macro at the point in the source file
+    where the appropriate header is first included.369)
+4   Within a preprocessing translation unit, __STDC_WANT_LIB_EXT1__ shall be
+    defined identically for all inclusions of any headers from subclause <a href="#K.3">K.3</a>. If
+    __STDC_WANT_LIB_EXT1__ is defined differently for any such inclusion, the
+    implementation shall issue a diagnostic as if a preprocessor error directive were used.
+
+
+    367) Implementations that do not define __STDC_LIB_EXT1__ are not required to conform to these
+         specifications.
+    368) Future revisions of this International Standard may define meanings for other values of
+         __STDC_WANT_LIB_EXT1__.
+    369) Subclause <a href="#7.1.3">7.1.3</a> reserves certain names and patterns of names that an implementation may use in
+         headers. All other names are not reserved, and a conforming implementation is not permitted to use
+         them. While some of the names defined in <a href="#K.3">K.3</a> and its subclauses are reserved, others are not. If an
+         unreserved name is defined in a header when __STDC_WANT_LIB_EXT1__ is defined as 0, the
+         implementation is not conforming.
+
+[<a name="#p579" href="p579">page 579</a>] (<a href="#Contents">Contents</a>)
+
+<a name="K.3.1.2" href="#K.3.1.2"><b>    K.3.1.2 Reserved identifiers</b></a>
+1   Each macro name in any of the following subclauses is reserved for use as specified if it
+    is defined by any of its associated headers when included; unless explicitly stated
+    otherwise (see <a href="#7.1.4">7.1.4</a>).
+2   All identifiers with external linkage in any of the following subclauses are reserved for
+    use as identifiers with external linkage if any of them are used by the program. None of
+    them are reserved if none of them are used.
+3   Each identifier with file scope listed in any of the following subclauses is reserved for use
+    as a macro name and as an identifier with file scope in the same name space if it is
+    defined by any of its associated headers when included.
+<a name="K.3.1.3" href="#K.3.1.3"><b>    K.3.1.3 Use of errno</b></a>
+1   An implementation may set errno for the functions defined in this annex, but is not
+    required to.
+<a name="K.3.1.4" href="#K.3.1.4"><b>    K.3.1.4 Runtime-constraint violations</b></a>
+1   Most functions in this annex include as part of their specification a list of runtime-
+    constraints. These runtime-constraints are requirements on the program using the
+    library.370)
+2   Implementations shall verify that the runtime-constraints for a function are not violated
+    by the program. If a runtime-constraint is violated, the implementation shall call the
+    currently registered runtime-constraint handler (see set_constraint_handler_s
+    in <a href="#7.22">&lt;stdlib.h&gt;</a>). Multiple runtime-constraint violations in the same call to a library
+    function result in only one call to the runtime-constraint handler. It is unspecified which
+    one of the multiple runtime-constraint violations cause the handler to be called.
+3   If the runtime-constraints section for a function states an action to be performed when a
+    runtime-constraint violation occurs, the function shall perform the action before calling
+    the runtime-constraint handler. If the runtime-constraints section lists actions that are
+    prohibited when a runtime-constraint violation occurs, then such actions are prohibited to
+    the function both before calling the handler and after the handler returns.
+4   The runtime-constraint handler might not return. If the handler does return, the library
+    function whose runtime-constraint was violated shall return some indication of failure as
+    given by the returns section in the function's specification.
+
+
+
+    370) Although runtime-constraints replace many cases of undefined behavior, undefined behavior still
+         exists in this annex. Implementations are free to detect any case of undefined behavior and treat it as a
+         runtime-constraint violation by calling the runtime-constraint handler. This license comes directly
+         from the definition of undefined behavior.
+
+[<a name="#p580" href="p580">page 580</a>] (<a href="#Contents">Contents</a>)
+
+<a name="K.3.2" href="#K.3.2"><b>    K.3.2 Errors &lt;errno.h&gt;</b></a>
+1   The header <a href="#7.5">&lt;errno.h&gt;</a> defines a type.
+2   The type is
+             errno_t
+    which is type int.371)
+<a name="K.3.3" href="#K.3.3"><b>    K.3.3 Common definitions &lt;stddef.h&gt;</b></a>
+1   The header <a href="#7.19">&lt;stddef.h&gt;</a> defines a type.
+2   The type is
+             rsize_t
+    which is the type size_t.372)
+<a name="K.3.4" href="#K.3.4"><b>    K.3.4 Integer types &lt;stdint.h&gt;</b></a>
+1   The header <a href="#7.20">&lt;stdint.h&gt;</a> defines a macro.
+2   The macro is
+             RSIZE_MAX
+    which expands to a value373) of type size_t. Functions that have parameters of type
+    rsize_t consider it a runtime-constraint violation if the values of those parameters are
+    greater than RSIZE_MAX.
+    Recommended practice
+3   Extremely large object sizes are frequently a sign that an object's size was calculated
+    incorrectly. For example, negative numbers appear as very large positive numbers when
+    converted to an unsigned type like size_t. Also, some implementations do not support
+    objects as large as the maximum value that can be represented by type size_t.
+4   For those reasons, it is sometimes beneficial to restrict the range of object sizes to detect
+    programming errors. For implementations targeting machines with large address spaces,
+    it is recommended that RSIZE_MAX be defined as the smaller of the size of the largest
+    object supported or (SIZE_MAX &gt;&gt; 1), even if this limit is smaller than the size of
+    some legitimate, but very large, objects. Implementations targeting machines with small
+    address spaces may wish to define RSIZE_MAX as SIZE_MAX, which means that there
+
+    371) As a matter of programming style, errno_t may be used as the type of something that deals only
+         with the values that might be found in errno. For example, a function which returns the value of
+         errno might be declared as having the return type errno_t.
+    372) See the description of the RSIZE_MAX macro in <a href="#7.20">&lt;stdint.h&gt;</a>.
+    373) The macro RSIZE_MAX need not expand to a constant expression.
+
+[<a name="#p581" href="p581">page 581</a>] (<a href="#Contents">Contents</a>)
+
+    is no object size that is considered a runtime-constraint violation.
+<a name="K.3.5" href="#K.3.5"><b>    K.3.5 Input/output &lt;stdio.h&gt;</b></a>
+1   The header <a href="#7.21">&lt;stdio.h&gt;</a> defines several macros and two types.
+2   The macros are
+           L_tmpnam_s
+    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_s
+    function;
+           TMP_MAX_S
+    which expands to an integer constant expression that is the maximum number of unique
+    file names that can be generated by the tmpnam_s function.
+3   The types are
+           errno_t
+    which is type int; and
+           rsize_t
+    which is the type size_t.
+<a name="K.3.5.1" href="#K.3.5.1"><b>    K.3.5.1 Operations on files</b></a>
+<a name="K.3.5.1.1" href="#K.3.5.1.1"><b>    K.3.5.1.1 The tmpfile_s function</b></a>
+    Synopsis
+1          #define __STDC_WANT_LIB_EXT1__ 1
+           #include <a href="#7.21">&lt;stdio.h&gt;</a>
+           errno_t tmpfile_s(FILE * restrict * restrict streamptr);
+    Runtime-constraints
+2   streamptr shall not be a null pointer.
+3   If there is a runtime-constraint violation, tmpfile_s does not attempt to create a file.
+    Description
+4   The tmpfile_s 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
+    with the meaning that mode has in the fopen_s function (including the mode's effect
+    on exclusive access and file permissions).
+
+
+[<a name="#p582" href="p582">page 582</a>] (<a href="#Contents">Contents</a>)
+
+5   If the file was created successfully, then the pointer to FILE pointed to by streamptr
+    will be set to the pointer to the object controlling the opened file. Otherwise, the pointer
+    to FILE pointed to by streamptr will be set to a null pointer.
+    Recommended practice
+    It should be possible to open at least TMP_MAX_S temporary files during the lifetime of
+    the program (this limit may be shared with tmpnam_s) 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
+6   The tmpfile_s function returns zero if it created the file. If it did not create the file or
+    there was a runtime-constraint violation, tmpfile_s returns a nonzero value.
+<a name="K.3.5.1.2" href="#K.3.5.1.2"><b>    K.3.5.1.2 The tmpnam_s function</b></a>
+    Synopsis
+1           #define __STDC_WANT_LIB_EXT1__ 1
+            #include <a href="#7.21">&lt;stdio.h&gt;</a>
+            errno_t tmpnam_s(char *s, rsize_t maxsize);
+    Runtime-constraints
+2   s shall not be a null pointer. maxsize shall be less than or equal to RSIZE_MAX.
+    maxsize shall be greater than the length of the generated file name string.
+    Description
+3   The tmpnam_s function generates a string that is a valid file name and that is not the
+    same as the name of an existing file.374) The function is potentially capable of generating
+    TMP_MAX_S different strings, but any or all of them may already be in use by existing
+    files and thus not be suitable return values. The lengths of these strings shall be less than
+    the value of the L_tmpnam_s macro.
+4   The tmpnam_s function generates a different string each time it is called.
+5   It is assumed that s points to an array of at least maxsize characters. This array will be
+    set to generated string, as specified below.
+
+
+
+    374) Files created using strings generated by the tmpnam_s 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. Implementations should take care in choosing the patterns
+         used for names returned by tmpnam_s. For example, making a thread id part of the names avoids the
+         race condition and possible conflict when multiple programs run simultaneously by the same user
+         generate the same temporary file names.
+
+[<a name="#p583" href="p583">page 583</a>] (<a href="#Contents">Contents</a>)
+
+6    The implementation shall behave as if no library function except tmpnam calls the
+     tmpnam_s function.375)
+     Recommended practice
+7    After a program obtains a file name using the tmpnam_s function and before the
+     program creates a file with that name, the possibility exists that someone else may create
+     a file with that same name. To avoid this race condition, the tmpfile_s function
+     should be used instead of tmpnam_s when possible. One situation that requires the use
+     of the tmpnam_s function is when the program needs to create a temporary directory
+     rather than a temporary file.
+     Returns
+8    If no suitable string can be generated, or if there is a runtime-constraint violation, the
+     tmpnam_s function writes a null character to s[0] (only if s is not null and maxsize
+     is greater than zero) and returns a nonzero value.
+9    Otherwise, the tmpnam_s function writes the string in the array pointed to by s and
+     returns zero.
+     Environmental limits
+10   The value of the macro TMP_MAX_S shall be at least 25.
+<a name="K.3.5.2" href="#K.3.5.2"><b>     K.3.5.2 File access functions</b></a>
+<a name="K.3.5.2.1" href="#K.3.5.2.1"><b>     K.3.5.2.1 The fopen_s function</b></a>
+     Synopsis
+1           #define __STDC_WANT_LIB_EXT1__ 1
+            #include <a href="#7.21">&lt;stdio.h&gt;</a>
+            errno_t fopen_s(FILE * restrict * restrict streamptr,
+                 const char * restrict filename,
+                 const char * restrict mode);
+     Runtime-constraints
+2    None of streamptr, filename, or mode shall be a null pointer.
+3    If there is a runtime-constraint violation, fopen_s does not attempt to open a file.
+     Furthermore, if streamptr is not a null pointer, fopen_s sets *streamptr to the
+     null pointer.
+
+
+
+
+     375) An implementation may have tmpnam call tmpnam_s (perhaps so there is only one naming
+          convention for temporary files), but this is not required.
+
+[<a name="#p584" href="p584">page 584</a>] (<a href="#Contents">Contents</a>)
+
+    Description
+4   The fopen_s function opens the file whose name is the string pointed to by
+    filename, and associates a stream with it.
+5   The mode string shall be as described for fopen, with the addition that modes starting
+    with the character 'w' or 'a' may be preceded by the character 'u', see below:
+    uw             truncate to zero length or create text file for writing, default
+                   permissions
+    uwx            create text file for writing, default permissions
+    ua             append; open or create text file for writing at end-of-file, default
+                   permissions
+    uwb            truncate to zero length or create binary file for writing, default
+                   permissions
+    uwbx           create binary file for writing, default permissions
+    uab            append; open or create binary file for writing at end-of-file, default
+                   permissions
+    uw+            truncate to zero length or create text file for update, default
+                   permissions
+    uw+x           create text file for update, default permissions
+    ua+            append; open or create text file for update, writing at end-of-file,
+                   default permissions
+    uw+b or uwb+   truncate to zero length or create binary file for update, default
+                   permissions
+    uw+bx or uwb+x create binary file for update, default permissions
+    ua+b or uab+   append; open or create binary file for update, writing at end-of-file,
+                   default permissions
+6   Opening a file with exclusive mode ('x' as the last character in the mode argument)
+    fails if the file already exists or cannot be created.
+7   To the extent that the underlying system supports the concepts, files opened for writing
+    shall be opened with exclusive (also known as non-shared) access. If the file is being
+    created, and the first character of the mode string is not 'u', to the extent that the
+    underlying system supports it, the file shall have a file permission that prevents other
+    users on the system from accessing the file. If the file is being created and first character
+    of the mode string is 'u', then by the time the file has been closed, it shall have the
+    system default file access permissions.376)
+8   If the file was opened successfully, then the pointer to FILE pointed to by streamptr
+    will be set to the pointer to the object controlling the opened file. Otherwise, the pointer
+
+
+    376) These are the same permissions that the file would have been created with by fopen.
+
+[<a name="#p585" href="p585">page 585</a>] (<a href="#Contents">Contents</a>)
+
+    to FILE pointed to by streamptr will be set to a null pointer.
+    Returns
+9   The fopen_s function returns zero if it opened the file. If it did not open the file or if
+    there was a runtime-constraint violation, fopen_s returns a nonzero value.
+<a name="K.3.5.2.2" href="#K.3.5.2.2"><b>    K.3.5.2.2 The freopen_s function</b></a>
+    Synopsis
+1          #define __STDC_WANT_LIB_EXT1__ 1
+           #include <a href="#7.21">&lt;stdio.h&gt;</a>
+           errno_t freopen_s(FILE * restrict * restrict newstreamptr,
+                const char * restrict filename,
+                const char * restrict mode,
+                FILE * restrict stream);
+    Runtime-constraints
+2   None of newstreamptr, mode, and stream shall be a null pointer.
+3   If there is a runtime-constraint violation, freopen_s neither attempts to close any file
+    associated with stream nor attempts to open a file. Furthermore, if newstreamptr is
+    not a null pointer, fopen_s sets *newstreamptr to the null pointer.
+    Description
+4   The freopen_s 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 has the same meaning as in the fopen_s function (including the mode's effect
+    on exclusive access and file permissions).
+5   If filename is a null pointer, the freopen_s 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.
+6   The freopen_s function first attempts to close any file that is associated with stream.
+    Failure to close the file is ignored. The error and end-of-file indicators for the stream are
+    cleared.
+7   If the file was opened successfully, then the pointer to FILE pointed to by
+    newstreamptr will be set to the value of stream. Otherwise, the pointer to FILE
+    pointed to by newstreamptr will be set to a null pointer.
+    Returns
+8   The freopen_s function returns zero if it opened the file. If it did not open the file or
+    there was a runtime-constraint violation, freopen_s returns a nonzero value.
+
+[<a name="#p586" href="p586">page 586</a>] (<a href="#Contents">Contents</a>)
+
+<a name="K.3.5.3" href="#K.3.5.3"><b>    K.3.5.3 Formatted input/output functions</b></a>
+1   Unless explicitly stated otherwise, if the execution of a function described in this
+    subclause causes copying to take place between objects that overlap, the objects take on
+    unspecified values.
+<a name="K.3.5.3.1" href="#K.3.5.3.1"><b>    K.3.5.3.1 The fprintf_s function</b></a>
+    Synopsis
+1            #define __STDC_WANT_LIB_EXT1__ 1
+             #include <a href="#7.21">&lt;stdio.h&gt;</a>
+             int fprintf_s(FILE * restrict stream,
+                  const char * restrict format, ...);
+    Runtime-constraints
+2   Neither stream nor format shall be a null pointer. The %n specifier377) (modified or
+    not by flags, field width, or precision) shall not appear in the string pointed to by
+    format. Any argument to fprintf_s corresponding to a %s specifier shall not be a
+    null pointer.
+3   If there is a runtime-constraint violation,378) the fprintf_s function does not attempt
+    to produce further output, and it is unspecified to what extent fprintf_s produced
+    output before discovering the runtime-constraint violation.
+    Description
+4   The fprintf_s function is equivalent to the fprintf function except for the explicit
+    runtime-constraints listed above.
+    Returns
+5   The fprintf_s function returns the number of characters transmitted, or a negative
+    value if an output error, encoding error, or runtime-constraint violation occurred.
+
+
+
+
+    377) It is not a runtime-constraint violation for the characters %n to appear in sequence in the string pointed
+         at by format when those characters are not a interpreted as a %n specifier. For example, if the entire
+         format string was %%n.
+    378) Because an implementation may treat any undefined behavior as a runtime-constraint violation, an
+         implementation may treat any unsupported specifiers in the string pointed to by format as a runtime-
+         constraint violation.
+
+[<a name="#p587" href="p587">page 587</a>] (<a href="#Contents">Contents</a>)
+
+<a name="K.3.5.3.2" href="#K.3.5.3.2"><b>    K.3.5.3.2 The fscanf_s function</b></a>
+    Synopsis
+1           #define __STDC_WANT_LIB_EXT1__ 1
+            #include <a href="#7.21">&lt;stdio.h&gt;</a>
+            int fscanf_s(FILE * restrict stream,
+                 const char * restrict format, ...);
+    Runtime-constraints
+2   Neither stream nor format shall be a null pointer. Any argument indirected though in
+    order to store converted input shall not be a null pointer.
+3   If there is a runtime-constraint violation,379) the fscanf_s function does not attempt to
+    perform further input, and it is unspecified to what extent fscanf_s performed input
+    before discovering the runtime-constraint violation.
+    Description
+4   The fscanf_s function is equivalent to fscanf except that the c, s, and [ conversion
+    specifiers apply to a pair of arguments (unless assignment suppression is indicated by a
+    *). The first of these arguments is the same as for fscanf. That argument is
+    immediately followed in the argument list by the second argument, which has type
+    rsize_t and gives the number of elements in the array pointed to by the first argument
+    of the pair. If the first argument points to a scalar object, it is considered to be an array of
+    one element.380)
+5   A matching failure occurs if the number of elements in a receiving object is insufficient to
+    hold the converted input (including any trailing null character).
+    Returns
+6   The fscanf_s function returns the value of the macro EOF if an input failure occurs
+    before any conversion or if there is a runtime-constraint violation. Otherwise, the
+
+    379) Because an implementation may treat any undefined behavior as a runtime-constraint violation, an
+         implementation may treat any unsupported specifiers in the string pointed to by format as a runtime-
+         constraint violation.
+    380) If the format is known at translation time, an implementation may issue a diagnostic for any argument
+         used to store the result from a c, s, or [ conversion specifier if that argument is not followed by an
+         argument of a type compatible with rsize_t. A limited amount of checking may be done if even if
+         the format is not known at translation time. For example, an implementation may issue a diagnostic
+         for each argument after format that has of type pointer to one of char, signed char,
+         unsigned char, or void that is not followed by an argument of a type compatible with
+         rsize_t. The diagnostic could warn that unless the pointer is being used with a conversion specifier
+         using the hh length modifier, a length argument must follow the pointer argument. Another useful
+         diagnostic could flag any non-pointer argument following format that did not have a type
+         compatible with rsize_t.
+
+[<a name="#p588" href="p588">page 588</a>] (<a href="#Contents">Contents</a>)
+
+    fscanf_s 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.
+7   EXAMPLE 1        The call:
+             #define __STDC_WANT_LIB_EXT1__ 1
+             #include <a href="#7.21">&lt;stdio.h&gt;</a>
+             /* ... */
+             int n, i; float x; char name[50];
+             n = fscanf_s(stdin, "%d%f%s", &amp;i, &amp;x, name, (rsize_t) 50);
+    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.
+
+8   EXAMPLE 2        The call:
+             #define __STDC_WANT_LIB_EXT1__ 1
+             #include <a href="#7.21">&lt;stdio.h&gt;</a>
+             /* ... */
+             int n; char s[5];
+             n = fscanf_s(stdin, "%s", s, sizeof s);
+    with the input line:
+             hello
+    will assign to n the value 0 since a matching failure occurred because the sequence hello\0 requires an
+    array of six characters to store it.
+
+<a name="K.3.5.3.3" href="#K.3.5.3.3"><b>    K.3.5.3.3 The printf_s function</b></a>
+    Synopsis
+1            #define __STDC_WANT_LIB_EXT1__ 1
+             #include <a href="#7.21">&lt;stdio.h&gt;</a>
+             int printf_s(const char * restrict format, ...);
+    Runtime-constraints
+2   format shall not be a null pointer. The %n specifier381) (modified or not by flags, field
+    width, or precision) shall not appear in the string pointed to by format. Any argument
+    to printf_s corresponding to a %s specifier shall not be a null pointer.
+3   If there is a runtime-constraint violation, the printf_s function does not attempt to
+    produce further output, and it is unspecified to what extent printf_s produced output
+    before discovering the runtime-constraint violation.
+
+
+    381) It is not a runtime-constraint violation for the characters %n to appear in sequence in the string pointed
+         at by format when those characters are not a interpreted as a %n specifier. For example, if the entire
+         format string was %%n.
+
+[<a name="#p589" href="p589">page 589</a>] (<a href="#Contents">Contents</a>)
+
+    Description
+4   The printf_s function is equivalent to the printf function except for the explicit
+    runtime-constraints listed above.
+    Returns
+5   The printf_s function returns the number of characters transmitted, or a negative
+    value if an output error, encoding error, or runtime-constraint violation occurred.
+<a name="K.3.5.3.4" href="#K.3.5.3.4"><b>    K.3.5.3.4 The scanf_s function</b></a>
+    Synopsis
+1          #define __STDC_WANT_LIB_EXT1__ 1
+           #include <a href="#7.21">&lt;stdio.h&gt;</a>
+           int scanf_s(const char * restrict format, ...);
+    Runtime-constraints
+2   format shall not be a null pointer. Any argument indirected though in order to store
+    converted input shall not be a null pointer.
+3   If there is a runtime-constraint violation, the scanf_s function does not attempt to
+    perform further input, and it is unspecified to what extent scanf_s performed input
+    before discovering the runtime-constraint violation.
+    Description
+4   The scanf_s function is equivalent to fscanf_s with the argument stdin
+    interposed before the arguments to scanf_s.
+    Returns
+5   The scanf_s function returns the value of the macro EOF if an input failure occurs
+    before any conversion or if there is a runtime-constraint violation. Otherwise, the
+    scanf_s 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="K.3.5.3.5" href="#K.3.5.3.5"><b>    K.3.5.3.5 The snprintf_s function</b></a>
+    Synopsis
+1          #define __STDC_WANT_LIB_EXT1__ 1
+           #include <a href="#7.21">&lt;stdio.h&gt;</a>
+           int snprintf_s(char * restrict s, rsize_t n,
+                const char * restrict format, ...);
+    Runtime-constraints
+2   Neither s nor format shall be a null pointer. n shall neither equal zero nor be greater
+    than RSIZE_MAX. The %n specifier382) (modified or not by flags, field width, or
+    precision) shall not appear in the string pointed to by format. Any argument to
+[<a name="#p590" href="p590">page 590</a>] (<a href="#Contents">Contents</a>)
+
+    snprintf_s corresponding to a %s specifier shall not be a null pointer. No encoding
+    error shall occur.
+3   If there is a runtime-constraint violation, then if s is not a null pointer and n is greater
+    than zero and less than RSIZE_MAX, then the snprintf_s function sets s[0] to the
+    null character.
+    Description
+4   The snprintf_s function is equivalent to the snprintf function except for the
+    explicit runtime-constraints listed above.
+5   The snprintf_s function, unlike sprintf_s, will truncate the result to fit within the
+    array pointed to by s.
+    Returns
+6   The snprintf_s 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 a runtime-constraint violation 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="K.3.5.3.6" href="#K.3.5.3.6"><b>    K.3.5.3.6 The sprintf_s function</b></a>
+    Synopsis
+1            #define __STDC_WANT_LIB_EXT1__ 1
+             #include <a href="#7.21">&lt;stdio.h&gt;</a>
+             int sprintf_s(char * restrict s, rsize_t n,
+                  const char * restrict format, ...);
+    Runtime-constraints
+2   Neither s nor format shall be a null pointer. n shall neither equal zero nor be greater
+    than RSIZE_MAX. The number of characters (including the trailing null) required for the
+    result to be written to the array pointed to by s shall not be greater than n. The %n
+    specifier383) (modified or not by flags, field width, or precision) shall not appear in the
+    string pointed to by format. Any argument to sprintf_s corresponding to a %s
+    specifier shall not be a null pointer. No encoding error shall occur.
+
+
+
+    382) It is not a runtime-constraint violation for the characters %n to appear in sequence in the string pointed
+         at by format when those characters are not a interpreted as a %n specifier. For example, if the entire
+         format string was %%n.
+    383) It is not a runtime-constraint violation for the characters %n to appear in sequence in the string pointed
+         at by format when those characters are not a interpreted as a %n specifier. For example, if the entire
+         format string was %%n.
+
+[<a name="#p591" href="p591">page 591</a>] (<a href="#Contents">Contents</a>)
+
+3   If there is a runtime-constraint violation, then if s is not a null pointer and n is greater
+    than zero and less than RSIZE_MAX, then the sprintf_s function sets s[0] to the
+    null character.
+    Description
+4   The sprintf_s function is equivalent to the sprintf function except for the
+    parameter n and the explicit runtime-constraints listed above.
+5   The sprintf_s function, unlike snprintf_s, treats a result too big for the array
+    pointed to by s as a runtime-constraint violation.
+    Returns
+6   If no runtime-constraint violation occurred, the sprintf_s function returns the number
+    of characters written in the array, not counting the terminating null character. If an
+    encoding error occurred, sprintf_s returns a negative value. If any other runtime-
+    constraint violation occurred, sprintf_s returns zero.
+<a name="K.3.5.3.7" href="#K.3.5.3.7"><b>    K.3.5.3.7 The sscanf_s function</b></a>
+    Synopsis
+1          #define __STDC_WANT_LIB_EXT1__ 1
+           #include <a href="#7.21">&lt;stdio.h&gt;</a>
+           int sscanf_s(const char * restrict s,
+                const char * restrict format, ...);
+    Runtime-constraints
+2   Neither s nor format shall be a null pointer. Any argument indirected though in order
+    to store converted input shall not be a null pointer.
+3   If there is a runtime-constraint violation, the sscanf_s function does not attempt to
+    perform further input, and it is unspecified to what extent sscanf_s performed input
+    before discovering the runtime-constraint violation.
+    Description
+4   The sscanf_s function is equivalent to fscanf_s, 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_s function. If copying
+    takes place between objects that overlap, the objects take on unspecified values.
+    Returns
+5   The sscanf_s function returns the value of the macro EOF if an input failure occurs
+    before any conversion or if there is a runtime-constraint violation. Otherwise, the
+    sscanf_s 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="#p592" href="p592">page 592</a>] (<a href="#Contents">Contents</a>)
+
+<a name="K.3.5.3.8" href="#K.3.5.3.8"><b>    K.3.5.3.8 The vfprintf_s function</b></a>
+    Synopsis
+1            #define __STDC_WANT_LIB_EXT1__ 1
+             #include <a href="#7.16">&lt;stdarg.h&gt;</a>
+             #include <a href="#7.21">&lt;stdio.h&gt;</a>
+             int vfprintf_s(FILE * restrict stream,
+                  const char * restrict format,
+                  va_list arg);
+    Runtime-constraints
+2   Neither stream nor format shall be a null pointer. The %n specifier384) (modified or
+    not by flags, field width, or precision) shall not appear in the string pointed to by
+    format. Any argument to vfprintf_s corresponding to a %s specifier shall not be a
+    null pointer.
+3   If there is a runtime-constraint violation, the vfprintf_s function does not attempt to
+    produce further output, and it is unspecified to what extent vfprintf_s produced
+    output before discovering the runtime-constraint violation.
+    Description
+4   The vfprintf_s function is equivalent to the vfprintf function except for the
+    explicit runtime-constraints listed above.
+    Returns
+5   The vfprintf_s function returns the number of characters transmitted, or a negative
+    value if an output error, encoding error, or runtime-constraint violation occurred.
+<a name="K.3.5.3.9" href="#K.3.5.3.9"><b>    K.3.5.3.9 The vfscanf_s function</b></a>
+    Synopsis
+1            #define __STDC_WANT_LIB_EXT1__ 1
+             #include <a href="#7.16">&lt;stdarg.h&gt;</a>
+             #include <a href="#7.21">&lt;stdio.h&gt;</a>
+             int vfscanf_s(FILE * restrict stream,
+                  const char * restrict format,
+                  va_list arg);
+
+
+
+
+    384) It is not a runtime-constraint violation for the characters %n to appear in sequence in the string pointed
+         at by format when those characters are not a interpreted as a %n specifier. For example, if the entire
+         format string was %%n.
+
+[<a name="#p593" href="p593">page 593</a>] (<a href="#Contents">Contents</a>)
+
+    Runtime-constraints
+2   Neither stream nor format shall be a null pointer. Any argument indirected though in
+    order to store converted input shall not be a null pointer.
+3   If there is a runtime-constraint violation, the vfscanf_s function does not attempt to
+    perform further input, and it is unspecified to what extent vfscanf_s performed input
+    before discovering the runtime-constraint violation.
+    Description
+4   The vfscanf_s function is equivalent to fscanf_s, 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_s function does not invoke the
+    va_end macro.385)
+    Returns
+5   The vfscanf_s function returns the value of the macro EOF if an input failure occurs
+    before any conversion or if there is a runtime-constraint violation. Otherwise, the
+    vfscanf_s 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="K.3.5.3.10" href="#K.3.5.3.10"><b>    K.3.5.3.10 The vprintf_s function</b></a>
+    Synopsis
+1            #define __STDC_WANT_LIB_EXT1__ 1
+             #include <a href="#7.16">&lt;stdarg.h&gt;</a>
+             #include <a href="#7.21">&lt;stdio.h&gt;</a>
+             int vprintf_s(const char * restrict format,
+                  va_list arg);
+    Runtime-constraints
+2   format shall not be a null pointer. The %n specifier386) (modified or not by flags, field
+    width, or precision) shall not appear in the string pointed to by format. Any argument
+    to vprintf_s corresponding to a %s specifier shall not be a null pointer.
+3   If there is a runtime-constraint violation, the vprintf_s function does not attempt to
+    produce further output, and it is unspecified to what extent vprintf_s produced output
+    before discovering the runtime-constraint violation.
+
+    385) As the functions vfprintf_s, vfscanf_s, vprintf_s, vscanf_s, vsnprintf_s,
+         vsprintf_s, and vsscanf_s invoke the va_arg macro, the value of arg after the return is
+         indeterminate.
+    386) It is not a runtime-constraint violation for the characters %n to appear in sequence in the string pointed
+         at by format when those characters are not a interpreted as a %n specifier. For example, if the entire
+         format string was %%n.
+
+[<a name="#p594" href="p594">page 594</a>] (<a href="#Contents">Contents</a>)
+
+    Description
+4   The vprintf_s function is equivalent to the vprintf function except for the explicit
+    runtime-constraints listed above.
+    Returns
+5   The vprintf_s function returns the number of characters transmitted, or a negative
+    value if an output error, encoding error, or runtime-constraint violation occurred.
+<a name="K.3.5.3.11" href="#K.3.5.3.11"><b>    K.3.5.3.11 The vscanf_s function</b></a>
+    Synopsis
+1           #define __STDC_WANT_LIB_EXT1__ 1
+            #include <a href="#7.16">&lt;stdarg.h&gt;</a>
+            #include <a href="#7.21">&lt;stdio.h&gt;</a>
+            int vscanf_s(const char * restrict format,
+                 va_list arg);
+    Runtime-constraints
+2   format shall not be a null pointer. Any argument indirected though in order to store
+    converted input shall not be a null pointer.
+3   If there is a runtime-constraint violation, the vscanf_s function does not attempt to
+    perform further input, and it is unspecified to what extent vscanf_s performed input
+    before discovering the runtime-constraint violation.
+    Description
+4   The vscanf_s function is equivalent to scanf_s, 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_s function does not invoke the
+    va_end macro.387)
+    Returns
+5   The vscanf_s function returns the value of the macro EOF if an input failure occurs
+    before any conversion or if there is a runtime-constraint violation. Otherwise, the
+    vscanf_s 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.
+
+
+
+
+    387) As the functions vfprintf_s, vfscanf_s, vprintf_s, vscanf_s, vsnprintf_s,
+         vsprintf_s, and vsscanf_s invoke the va_arg macro, the value of arg after the return is
+         indeterminate.
+
+[<a name="#p595" href="p595">page 595</a>] (<a href="#Contents">Contents</a>)
+
+<a name="K.3.5.3.12" href="#K.3.5.3.12"><b>    K.3.5.3.12 The vsnprintf_s function</b></a>
+    Synopsis
+1            #define __STDC_WANT_LIB_EXT1__ 1
+             #include <a href="#7.16">&lt;stdarg.h&gt;</a>
+             #include <a href="#7.21">&lt;stdio.h&gt;</a>
+             int vsnprintf_s(char * restrict s, rsize_t n,
+                  const char * restrict format,
+                  va_list arg);
+    Runtime-constraints
+2   Neither s nor format shall be a null pointer. n shall neither equal zero nor be greater
+    than RSIZE_MAX. The %n specifier388) (modified or not by flags, field width, or
+    precision) shall not appear in the string pointed to by format. Any argument to
+    vsnprintf_s corresponding to a %s specifier shall not be a null pointer. No encoding
+    error shall occur.
+3   If there is a runtime-constraint violation, then if s is not a null pointer and n is greater
+    than zero and less than RSIZE_MAX, then the vsnprintf_s function sets s[0] to the
+    null character.
+    Description
+4   The vsnprintf_s function is equivalent to the vsnprintf function except for the
+    explicit runtime-constraints listed above.
+5   The vsnprintf_s function, unlike vsprintf_s, will truncate the result to fit within
+    the array pointed to by s.
+    Returns
+6   The vsnprintf_s 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 a runtime-constraint violation occurred. Thus, the null-terminated
+    output has been completely written if and only if the returned value is nonnegative and
+    less than n.
+
+
+
+
+    388) It is not a runtime-constraint violation for the characters %n to appear in sequence in the string pointed
+         at by format when those characters are not a interpreted as a %n specifier. For example, if the entire
+         format string was %%n.
+
+[<a name="#p596" href="p596">page 596</a>] (<a href="#Contents">Contents</a>)
+
+<a name="K.3.5.3.13" href="#K.3.5.3.13"><b>    K.3.5.3.13 The vsprintf_s function</b></a>
+    Synopsis
+1            #define __STDC_WANT_LIB_EXT1__ 1
+             #include <a href="#7.16">&lt;stdarg.h&gt;</a>
+             #include <a href="#7.21">&lt;stdio.h&gt;</a>
+             int vsprintf_s(char * restrict s, rsize_t n,
+                  const char * restrict format,
+                  va_list arg);
+    Runtime-constraints
+2   Neither s nor format shall be a null pointer. n shall neither equal zero nor be greater
+    than RSIZE_MAX. The number of characters (including the trailing null) required for the
+    result to be written to the array pointed to by s shall not be greater than n. The %n
+    specifier389) (modified or not by flags, field width, or precision) shall not appear in the
+    string pointed to by format. Any argument to vsprintf_s corresponding to a %s
+    specifier shall not be a null pointer. No encoding error shall occur.
+3   If there is a runtime-constraint violation, then if s is not a null pointer and n is greater
+    than zero and less than RSIZE_MAX, then the vsprintf_s function sets s[0] to the
+    null character.
+    Description
+4   The vsprintf_s function is equivalent to the vsprintf function except for the
+    parameter n and the explicit runtime-constraints listed above.
+5   The vsprintf_s function, unlike vsnprintf_s, treats a result too big for the array
+    pointed to by s as a runtime-constraint violation.
+    Returns
+6   If no runtime-constraint violation occurred, the vsprintf_s function returns the
+    number of characters written in the array, not counting the terminating null character. If
+    an encoding error occurred, vsprintf_s returns a negative value. If any other
+    runtime-constraint violation occurred, vsprintf_s returns zero.
+
+
+
+
+    389) It is not a runtime-constraint violation for the characters %n to appear in sequence in the string pointed
+         at by format when those characters are not a interpreted as a %n specifier. For example, if the entire
+         format string was %%n.
+
+[<a name="#p597" href="p597">page 597</a>] (<a href="#Contents">Contents</a>)
+
+<a name="K.3.5.3.14" href="#K.3.5.3.14"><b>    K.3.5.3.14 The vsscanf_s function</b></a>
+    Synopsis
+1          #define __STDC_WANT_LIB_EXT1__ 1
+           #include <a href="#7.16">&lt;stdarg.h&gt;</a>
+           #include <a href="#7.21">&lt;stdio.h&gt;</a>
+           int vsscanf_s(const char * restrict s,
+                const char * restrict format,
+                va_list arg);
+    Runtime-constraints
+2   Neither s nor format shall be a null pointer. Any argument indirected though in order
+    to store converted input shall not be a null pointer.
+3   If there is a runtime-constraint violation, the vsscanf_s function does not attempt to
+    perform further input, and it is unspecified to what extent vsscanf_s performed input
+    before discovering the runtime-constraint violation.
+    Description
+4   The vsscanf_s function is equivalent to sscanf_s, 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_s function does not invoke the
+    va_end macro.390)
+    Returns
+5   The vsscanf_s function returns the value of the macro EOF if an input failure occurs
+    before any conversion or if there is a runtime-constraint violation. Otherwise, the
+    vscanf_s 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="K.3.5.4" href="#K.3.5.4"><b>    K.3.5.4 Character input/output functions</b></a>
+<a name="K.3.5.4.1" href="#K.3.5.4.1"><b>    K.3.5.4.1 The gets_s function</b></a>
+    Synopsis
+1          #define __STDC_WANT_LIB_EXT1__ 1
+           #include <a href="#7.21">&lt;stdio.h&gt;</a>
+           char *gets_s(char *s, rsize_t n);
+
+
+
+
+    390) As the functions vfprintf_s, vfscanf_s, vprintf_s, vscanf_s, vsnprintf_s,
+         vsprintf_s, and vsscanf_s invoke the va_arg macro, the value of arg after the return is
+         indeterminate.
+
+[<a name="#p598" href="p598">page 598</a>] (<a href="#Contents">Contents</a>)
+
+    Runtime-constraints
+2   s shall not be a null pointer. n shall neither be equal to zero nor be greater than
+    RSIZE_MAX. A new-line character, end-of-file, or read error shall occur within reading
+    n-1 characters from stdin.391)
+3   If there is a runtime-constraint violation, s[0] is set to the null character, and characters
+    are read and discarded from stdin until a new-line character is read, or end-of-file or a
+    read error occurs.
+    Description
+4   The gets_s function reads at most one less than the number of characters specified by n
+    from the stream pointed to by stdin, into the array pointed to by s. No additional
+    characters are read after a new-line character (which is discarded) or after end-of-file.
+    The discarded new-line character does not count towards number of characters read. A
+    null character is written immediately after the last character read into the array.
+5   If end-of-file is encountered and no characters have been read into the array, or if a read
+    error occurs during the operation, then s[0] is set to the null character, and the other
+    elements of s take unspecified values.
+    Recommended practice
+6   The fgets function allows properly-written programs to safely process input lines too
+    long to store in the result array. In general this requires that callers of fgets pay
+    attention to the presence or absence of a new-line character in the result array. Consider
+    using fgets (along with any needed processing based on new-line characters) instead of
+    gets_s.
+    Returns
+7   The gets_s function returns s if successful. If there was a runtime-constraint violation,
+    or if end-of-file is encountered and no characters have been read into the array, or if a
+    read error occurs during the operation, then a null pointer is returned.
+
+
+
+
+    391) The gets_s function, unlike the historical gets function, makes it a runtime-constraint violation for
+         a line of input to overflow the buffer to store it. Unlike the fgets function, gets_s maintains a
+         one-to-one relationship between input lines and successful calls to gets_s. Programs that use gets
+         expect such a relationship.
+
+[<a name="#p599" href="p599">page 599</a>] (<a href="#Contents">Contents</a>)
+
+<a name="K.3.6" href="#K.3.6"><b>    K.3.6 General utilities &lt;stdlib.h&gt;</b></a>
+1   The header <a href="#7.22">&lt;stdlib.h&gt;</a> defines three types.
+2   The types are
+            errno_t
+    which is type int; and
+            rsize_t
+    which is the type size_t; and
+            constraint_handler_t
+    which has the following definition
+            typedef void (*constraint_handler_t)(
+                 const char * restrict msg,
+                 void * restrict ptr,
+                 errno_t error);
+<a name="K.3.6.1" href="#K.3.6.1"><b>    K.3.6.1 Runtime-constraint handling</b></a>
+<a name="K.3.6.1.1" href="#K.3.6.1.1"><b>    K.3.6.1.1 The set_constraint_handler_s function</b></a>
+    Synopsis
+1           #define __STDC_WANT_LIB_EXT1__ 1
+            #include <a href="#7.22">&lt;stdlib.h&gt;</a>
+            constraint_handler_t set_constraint_handler_s(
+                 constraint_handler_t handler);
+    Description
+2   The set_constraint_handler_s function sets the runtime-constraint handler to
+    be handler. The runtime-constraint handler is the function to be called when a library
+    function detects a runtime-constraint violation. Only the most recent handler registered
+    with set_constraint_handler_s is called when a runtime-constraint violation
+    occurs.
+3   When the handler is called, it is passed the following arguments in the following order:
+       1.   A pointer to a character string describing the runtime-constraint violation.
+       2.   A null pointer or a pointer to an implementation defined object.
+       3.   If the function calling the handler has a return type declared as errno_t, the
+            return value of the function is passed. Otherwise, a positive value of type
+            errno_t is passed.
+
+
+
+[<a name="#p600" href="p600">page 600</a>] (<a href="#Contents">Contents</a>)
+
+4   The implementation has a default constraint handler that is used if no calls to the
+    set_constraint_handler_s function have been made. The behavior of the
+    default handler is implementation-defined, and it may cause the program to exit or abort.
+5   If the handler argument to set_constraint_handler_s is a null pointer, the
+    implementation default handler becomes the current constraint handler.
+    Returns
+6   The set_constraint_handler_s function returns a pointer to the previously
+    registered handler.392)
+<a name="K.3.6.1.2" href="#K.3.6.1.2"><b>    K.3.6.1.2 The abort_handler_s function</b></a>
+    Synopsis
+1           #define __STDC_WANT_LIB_EXT1__ 1
+            #include <a href="#7.22">&lt;stdlib.h&gt;</a>
+            void abort_handler_s(
+                 const char * restrict msg,
+                 void * restrict ptr,
+                 errno_t error);
+    Description
+2   A pointer to the abort_handler_s function shall be a suitable argument to the
+    set_constraint_handler_s function.
+3   The abort_handler_s function writes a message on the standard error stream in an
+    implementation-defined format. The message shall include the string pointed to by msg.
+    The abort_handler_s function then calls the abort function.393)
+    Returns
+4   The abort_handler_s function does not return to its caller.
+
+
+
+
+    392) If the previous handler was registered by calling set_constraint_handler_s with a null
+         pointer argument, a pointer to the implementation default handler is returned (not NULL).
+    393) Many implementations invoke a debugger when the abort function is called.
+
+[<a name="#p601" href="p601">page 601</a>] (<a href="#Contents">Contents</a>)
+
+<a name="K.3.6.1.3" href="#K.3.6.1.3"><b>    K.3.6.1.3 The ignore_handler_s function</b></a>
+    Synopsis
+1           #define __STDC_WANT_LIB_EXT1__ 1
+            #include <a href="#7.22">&lt;stdlib.h&gt;</a>
+            void ignore_handler_s(
+                 const char * restrict msg,
+                 void * restrict ptr,
+                 errno_t error);
+    Description
+2   A pointer to the ignore_handler_s function shall be a suitable argument to the
+    set_constraint_handler_s function.
+3   The ignore_handler_s function simply returns to its caller.394)
+    Returns
+4   The ignore_handler_s function returns no value.
+<a name="K.3.6.2" href="#K.3.6.2"><b>    K.3.6.2 Communication with the environment</b></a>
+<a name="K.3.6.2.1" href="#K.3.6.2.1"><b>    K.3.6.2.1 The getenv_s function</b></a>
+    Synopsis
+1           #define __STDC_WANT_LIB_EXT1__ 1
+            #include <a href="#7.22">&lt;stdlib.h&gt;</a>
+            errno_t getenv_s(size_t * restrict len,
+                       char * restrict value, rsize_t maxsize,
+                       const char * restrict name);
+    Runtime-constraints
+2   name shall not be a null pointer. maxsize shall neither equal zero nor be greater than
+    RSIZE_MAX. If maxsize is not equal to zero, then value shall not be a null pointer.
+3   If there is a runtime-constraint violation, the integer pointed to by len is set to 0 (if len
+    is not null), and the environment list is not searched.
+    Description
+4   The getenv_s function searches an environment list, provided by the host environment,
+    for a string that matches the string pointed to by name.
+
+
+    394) If the runtime-constraint handler is set to the ignore_handler_s function, any library function in
+         which a runtime-constraint violation occurs will return to its caller. The caller can determine whether
+         a runtime-constraint violation occurred based on the library function's specification (usually, the
+         library function returns a nonzero errno_t).
+
+[<a name="#p602" href="p602">page 602</a>] (<a href="#Contents">Contents</a>)
+
+5   If that name is found then getenv_s performs the following actions. If len is not a
+    null pointer, the length of the string associated with the matched list member is stored in
+    the integer pointed to by len. If the length of the associated string is less than maxsize,
+    then the associated string is copied to the array pointed to by value.
+6   If that name is not found then getenv_s performs the following actions. If len is not
+    a null pointer, zero is stored in the integer pointed to by len. If maxsize is greater than
+    zero, then value[0] is set to the null character.
+7   The set of environment names and the method for altering the environment list are
+    implementation-defined.
+    Returns
+8   The getenv_s function returns zero if the specified name is found and the associated
+    string was successfully stored in value. Otherwise, a nonzero value is returned.
+<a name="K.3.6.3" href="#K.3.6.3"><b>    K.3.6.3 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, if nmemb has the value zero on a call to that function, then the comparison
+    function is not called, a search finds no matching element, sorting performs no
+    rearrangement, and the pointer to the array may be null.
+2   The implementation shall ensure that the second argument of the comparison function
+    (when called from bsearch_s), or both arguments (when called from qsort_s), are
+    pointers to elements of the array.395) The first argument when called from bsearch_s
+    shall equal key.
+3   The comparison function shall not alter the contents of either the array or search key. The
+    implementation may reorder elements of the array between calls to the comparison
+    function, but shall not otherwise 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_s they shall define a total ordering on
+    the array, and for bsearch_s the same object shall always compare the same way with
+    the key.
+
+
+
+
+    395) That is, if the value passed is p, then the following expressions are always valid and nonzero:
+                  ((char *)p - (char *)base) % size == 0
+                  (char *)p &gt;= (char *)base
+                  (char *)p &lt; (char *)base + nmemb * size
+
+
+[<a name="#p603" href="p603">page 603</a>] (<a href="#Contents">Contents</a>)
+
+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="K.3.6.3.1" href="#K.3.6.3.1"><b>    K.3.6.3.1 The bsearch_s function</b></a>
+    Synopsis
+1            #define __STDC_WANT_LIB_EXT1__ 1
+             #include <a href="#7.22">&lt;stdlib.h&gt;</a>
+             void *bsearch_s(const void *key, const void *base,
+                  rsize_t nmemb, rsize_t size,
+                  int (*compar)(const void *k, const void *y,
+                                  void *context),
+                  void *context);
+    Runtime-constraints
+2   Neither nmemb nor size shall be greater than RSIZE_MAX. If nmemb is not equal to
+    zero, then none of key, base, or compar shall be a null pointer.
+3   If there is a runtime-constraint violation, the bsearch_s function does not search the
+    array.
+    Description
+4   The bsearch_s 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 size of each element of the array is specified by size.
+5   The comparison function pointed to by compar is called with three arguments. The first
+    two 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.396)
+    The third argument to the comparison function is the context argument passed to
+    bsearch_s. The sole use of context by bsearch_s is to pass it to the comparison
+    function.397)
+
+
+
+
+    396) In practice, this means that the entire array has been sorted according to the comparison function.
+    397) The context argument is for the use of the comparison function in performing its duties. For
+         example, it might specify a collating sequence used by the comparison function.
+
+[<a name="#p604" href="p604">page 604</a>] (<a href="#Contents">Contents</a>)
+
+    Returns
+6   The bsearch_s function returns a pointer to a matching element of the array, or a null
+    pointer if no match is found or there is a runtime-constraint violation. If two elements
+    compare as equal, which element is matched is unspecified.
+<a name="K.3.6.3.2" href="#K.3.6.3.2"><b>    K.3.6.3.2 The qsort_s function</b></a>
+    Synopsis
+1           #define __STDC_WANT_LIB_EXT1__ 1
+            #include <a href="#7.22">&lt;stdlib.h&gt;</a>
+            errno_t qsort_s(void *base, rsize_t nmemb, rsize_t size,
+                 int (*compar)(const void *x, const void *y,
+                                 void *context),
+                 void *context);
+    Runtime-constraints
+2   Neither nmemb nor size shall be greater than RSIZE_MAX. If nmemb is not equal to
+    zero, then neither base nor compar shall be a null pointer.
+3   If there is a runtime-constraint violation, the qsort_s function does not sort the array.
+    Description
+4   The qsort_s 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.
+5   The contents of the array are sorted into ascending order according to a comparison
+    function pointed to by compar, which is called with three arguments. The first two
+    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. The third argument to the comparison function is the
+    context argument passed to qsort_s. The sole use of context by qsort_s is to
+    pass it to the comparison function.398)
+6   If two elements compare as equal, their relative order in the resulting sorted array is
+    unspecified.
+    Returns
+7   The qsort_s function returns zero if there was no runtime-constraint violation.
+    Otherwise, a nonzero value is returned.
+
+
+
+
+    398) The context argument is for the use of the comparison function in performing its duties. For
+         example, it might specify a collating sequence used by the comparison function.
+
+[<a name="#p605" href="p605">page 605</a>] (<a href="#Contents">Contents</a>)
+
+<a name="K.3.6.4" href="#K.3.6.4"><b>    K.3.6.4 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 set the int pointed to by their status argument to a nonzero value if
+    encodings have state dependency, and zero otherwise.399) Changing the LC_CTYPE
+    category causes the conversion state of these functions to be indeterminate.
+<a name="K.3.6.4.1" href="#K.3.6.4.1"><b>    K.3.6.4.1 The wctomb_s function</b></a>
+    Synopsis
+1           #define __STDC_WANT_LIB_EXT1__ 1
+            #include <a href="#7.22">&lt;stdlib.h&gt;</a>
+            errno_t wctomb_s(int * restrict status,
+                 char * restrict s,
+                 rsize_t smax,
+                 wchar_t wc);
+    Runtime-constraints
+2   Let n denote the number of bytes needed to represent the multibyte character
+    corresponding to the wide character given by wc (including any shift sequences).
+3   If s is not a null pointer, then smax shall not be less than n, and smax shall not be
+    greater than RSIZE_MAX. If s is a null pointer, then smax shall equal zero.
+4   If there is a runtime-constraint violation, wctomb_s does not modify the int pointed to
+    by status, and if s is not a null pointer, no more than smax elements in the array
+    pointed to by s will be accessed.
+    Description
+5   The wctomb_s function determines n and stores the multibyte character representation
+    of wc in the array whose first element is pointed to by s (if s is not a null pointer). The
+    number of characters stored never exceeds MB_CUR_MAX or smax. 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.
+6   The implementation shall behave as if no library function calls the wctomb_s function.
+
+
+
+
+    399) 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="#p606" href="p606">page 606</a>] (<a href="#Contents">Contents</a>)
+
+7    If s is a null pointer, the wctomb_s function stores into the int pointed to by status a
+     nonzero or zero value, if multibyte character encodings, respectively, do or do not have
+     state-dependent encodings.
+8    If s is not a null pointer, the wctomb_s function stores into the int pointed to by
+     status either n or -1 if wc, respectively, does or does not correspond to a valid
+     multibyte character.
+9    In no case will the int pointed to by status be set to a value greater than the
+     MB_CUR_MAX macro.
+     Returns
+10   The wctomb_s function returns zero if successful, and a nonzero value if there was a
+     runtime-constraint violation or wc did not correspond to a valid multibyte character.
+<a name="K.3.6.5" href="#K.3.6.5"><b>     K.3.6.5 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="K.3.6.5.1" href="#K.3.6.5.1"><b>     K.3.6.5.1 The mbstowcs_s function</b></a>
+     Synopsis
+1            #include <a href="#7.22">&lt;stdlib.h&gt;</a>
+             errno_t mbstowcs_s(size_t * restrict retval,
+                  wchar_t * restrict dst, rsize_t dstmax,
+                  const char * restrict src, rsize_t len);
+     Runtime-constraints
+2    Neither retval nor src shall be a null pointer. If dst is not a null pointer, then
+     neither len nor dstmax shall be greater than RSIZE_MAX. If dst is a null pointer,
+     then dstmax shall equal zero. If dst is not a null pointer, then dstmax shall not equal
+     zero. If dst is not a null pointer and len is not less than dstmax, then a null character
+     shall occur within the first dstmax multibyte characters of the array pointed to by src.
+3    If there is a runtime-constraint violation, then mbstowcs_s does the following. If
+     retval is not a null pointer, then mbstowcs_s sets *retval to (size_t)(-1). If
+     dst is not a null pointer and dstmax is greater than zero and less than RSIZE_MAX,
+     then mbstowcs_s sets dst[0] to the null wide character.
+     Description
+4    The mbstowcs_s function converts a sequence of multibyte characters that begins in
+     the initial shift state from the array 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
+[<a name="#p607" href="p607">page 607</a>] (<a href="#Contents">Contents</a>)
+
+    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.400) If dst is not a null pointer and no null wide character was stored into the array
+    pointed to by dst, then dst[len] is set to the null wide character. Each conversion
+    takes place as if by a call to the mbrtowc function.
+5   Regardless of whether dst is or is not a null pointer, if the input conversion encounters a
+    sequence of bytes that do not form a valid multibyte character, an encoding error occurs:
+    the mbstowcs_s function stores the value (size_t)(-1) into *retval.
+    Otherwise, the mbstowcs_s function stores into *retval the number of multibyte
+    characters successfully converted, not including the terminating null character (if any).
+6   All elements following the terminating null wide character (if any) written by
+    mbstowcs_s in the array of dstmax wide characters pointed to by dst take
+    unspecified values when mbstowcs_s returns.401)
+7   If copying takes place between objects that overlap, the objects take on unspecified
+    values.
+    Returns
+8   The mbstowcs_s function returns zero if no runtime-constraint violation and no
+    encoding error occurred. Otherwise, a nonzero value is returned.
+<a name="K.3.6.5.2" href="#K.3.6.5.2"><b>    K.3.6.5.2 The wcstombs_s function</b></a>
+    Synopsis
+1            #include <a href="#7.22">&lt;stdlib.h&gt;</a>
+             errno_t wcstombs_s(size_t * restrict retval,
+                  char * restrict dst, rsize_t dstmax,
+                  const wchar_t * restrict src, rsize_t len);
+    Runtime-constraints
+2   Neither retval nor src shall be a null pointer. If dst is not a null pointer, then
+    neither len nor dstmax shall be greater than RSIZE_MAX. If dst is a null pointer,
+    then dstmax shall equal zero. If dst is not a null pointer, then dstmax shall not equal
+    zero. If dst is not a null pointer and len is not less than dstmax, then the conversion
+    shall have been stopped (see below) because a terminating null wide character was
+    reached or because an encoding error occurred.
+
+
+
+
+    400) Thus, the value of len is ignored if dst is a null pointer.
+    401) This allows an implementation to attempt converting the multibyte string before discovering a
+         terminating null character did not occur where required.
+
+[<a name="#p608" href="p608">page 608</a>] (<a href="#Contents">Contents</a>)
+
+3   If there is a runtime-constraint violation, then wcstombs_s does the following. If
+    retval is not a null pointer, then wcstombs_s sets *retval to (size_t)(-1). If
+    dst is not a null pointer and dstmax is greater than zero and less than RSIZE_MAX,
+    then wcstombs_s sets dst[0] to the null character.
+    Description
+4   The wcstombs_s function converts a sequence of wide characters from the array
+    pointed to by src into a sequence of corresponding multibyte characters that begins in
+    the initial shift state. 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;
+    -- (if dst is not a null pointer) when the next multibyte character would exceed the
+        limit of n total bytes to be stored into the array pointed to by dst. If the wide
+        character being converted is the null wide character, then n is the lesser of len or
+        dstmax. Otherwise, n is the lesser of len or dstmax-1.
+    If the conversion stops without converting a null wide character and dst is not a null
+    pointer, then a null character is stored into the array pointed to by dst immediately
+    following any multibyte characters already stored. Each conversion takes place as if by a
+    call to the wcrtomb function.402)
+5   Regardless of whether dst is or is not a null pointer, if the input conversion encounters a
+    wide character that does not correspond to a valid multibyte character, an encoding error
+    occurs: the wcstombs_s function stores the value (size_t)(-1) into *retval.
+    Otherwise, the wcstombs_s function stores into *retval the number of bytes in the
+    resulting multibyte character sequence, not including the terminating null character (if
+    any).
+6   All elements following the terminating null character (if any) written by wcstombs_s
+    in the array of dstmax elements pointed to by dst take unspecified values when
+    wcstombs_s returns.403)
+7   If copying takes place between objects that overlap, the objects take on unspecified
+    values.
+
+
+    402) 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. However, if
+         the conversion stops before a terminating null wide character has been reached, the result will be null
+         terminated, but might not end in the initial shift state.
+    403) When len is not less than dstmax, the implementation might fill the array before discovering a
+         runtime-constraint violation.
+
+[<a name="#p609" href="p609">page 609</a>] (<a href="#Contents">Contents</a>)
+
+    Returns
+8   The wcstombs_s function returns zero if no runtime-constraint violation and no
+    encoding error occurred. Otherwise, a nonzero value is returned.
+<a name="K.3.7" href="#K.3.7"><b>    K.3.7 String handling &lt;string.h&gt;</b></a>
+1   The header <a href="#7.23">&lt;string.h&gt;</a> defines two types.
+2   The types are
+           errno_t
+    which is type int; and
+           rsize_t
+    which is the type size_t.
+<a name="K.3.7.1" href="#K.3.7.1"><b>    K.3.7.1 Copying functions</b></a>
+<a name="K.3.7.1.1" href="#K.3.7.1.1"><b>    K.3.7.1.1 The memcpy_s function</b></a>
+    Synopsis
+1          #define __STDC_WANT_LIB_EXT1__ 1
+           #include <a href="#7.23">&lt;string.h&gt;</a>
+           errno_t memcpy_s(void * restrict s1, rsize_t s1max,
+                const void * restrict s2, rsize_t n);
+    Runtime-constraints
+2   Neither s1 nor s2 shall be a null pointer. Neither s1max nor n shall be greater than
+    RSIZE_MAX. n shall not be greater than s1max. Copying shall not take place between
+    objects that overlap.
+3   If there is a runtime-constraint violation, the memcpy_s function stores zeros in the first
+    s1max characters of the object pointed to by s1 if s1 is not a null pointer and s1max is
+    not greater than RSIZE_MAX.
+    Description
+4   The memcpy_s function copies n characters from the object pointed to by s2 into the
+    object pointed to by s1.
+    Returns
+5   The memcpy_s function returns zero if there was no runtime-constraint violation.
+    Otherwise, a nonzero value is returned.
+
+
+
+
+[<a name="#p610" href="p610">page 610</a>] (<a href="#Contents">Contents</a>)
+
+<a name="K.3.7.1.2" href="#K.3.7.1.2"><b>    K.3.7.1.2 The memmove_s function</b></a>
+    Synopsis
+1           #define __STDC_WANT_LIB_EXT1__ 1
+            #include <a href="#7.23">&lt;string.h&gt;</a>
+            errno_t memmove_s(void *s1, rsize_t s1max,
+                 const void *s2, rsize_t n);
+    Runtime-constraints
+2   Neither s1 nor s2 shall be a null pointer. Neither s1max nor n shall be greater than
+    RSIZE_MAX. n shall not be greater than s1max.
+3   If there is a runtime-constraint violation, the memmove_s function stores zeros in the
+    first s1max characters of the object pointed to by s1 if s1 is not a null pointer and
+    s1max is not greater than RSIZE_MAX.
+    Description
+4   The memmove_s function copies n characters from the object pointed to by s2 into the
+    object pointed to by s1. This 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 or s2, and then the n characters from the temporary
+    array are copied into the object pointed to by s1.
+    Returns
+5   The memmove_s function returns zero if there was no runtime-constraint violation.
+    Otherwise, a nonzero value is returned.
+<a name="K.3.7.1.3" href="#K.3.7.1.3"><b>    K.3.7.1.3 The strcpy_s function</b></a>
+    Synopsis
+1           #define __STDC_WANT_LIB_EXT1__ 1
+            #include <a href="#7.23">&lt;string.h&gt;</a>
+            errno_t strcpy_s(char * restrict s1,
+                 rsize_t s1max,
+                 const char * restrict s2);
+    Runtime-constraints
+2   Neither s1 nor s2 shall be a null pointer. s1max shall not be greater than RSIZE_MAX.
+    s1max shall not equal zero. s1max shall be greater than strnlen_s(s2, s1max).
+    Copying shall not take place between objects that overlap.
+3   If there is a runtime-constraint violation, then if s1 is not a null pointer and s1max is
+    greater than zero and not greater than RSIZE_MAX, then strcpy_s sets s1[0] to the
+    null character.
+
+[<a name="#p611" href="p611">page 611</a>] (<a href="#Contents">Contents</a>)
+
+    Description
+4   The strcpy_s function copies the string pointed to by s2 (including the terminating
+    null character) into the array pointed to by s1.
+5   All elements following the terminating null character (if any) written by strcpy_s in
+    the array of s1max characters pointed to by s1 take unspecified values when
+    strcpy_s returns.404)
+    Returns
+6   The strcpy_s function returns zero405) if there was no runtime-constraint violation.
+    Otherwise, a nonzero value is returned.
+<a name="K.3.7.1.4" href="#K.3.7.1.4"><b>    K.3.7.1.4 The strncpy_s function</b></a>
+    Synopsis
+1           #define __STDC_WANT_LIB_EXT1__ 1
+            #include <a href="#7.23">&lt;string.h&gt;</a>
+            errno_t strncpy_s(char * restrict s1,
+                 rsize_t s1max,
+                 const char * restrict s2,
+                 rsize_t n);
+    Runtime-constraints
+2   Neither s1 nor s2 shall be a null pointer. Neither s1max nor n shall be greater than
+    RSIZE_MAX. s1max shall not equal zero. If n is not less than s1max, then s1max
+    shall be greater than strnlen_s(s2, s1max). Copying shall not take place between
+    objects that overlap.
+3   If there is a runtime-constraint violation, then if s1 is not a null pointer and s1max is
+    greater than zero and not greater than RSIZE_MAX, then strncpy_s sets s1[0] to the
+    null character.
+    Description
+4   The strncpy_s function copies not more than n successive characters (characters that
+    follow a null character are not copied) from the array pointed to by s2 to the array
+    pointed to by s1. If no null character was copied from s2, then s1[n] is set to a null
+    character.
+
+
+    404) This allows an implementation to copy characters from s2 to s1 while simultaneously checking if
+         any of those characters are null. Such an approach might write a character to every element of s1
+         before discovering that the first element should be set to the null character.
+    405) A zero return value implies that all of the requested characters from the string pointed to by s2 fit
+         within the array pointed to by s1 and that the result in s1 is null terminated.
+
+[<a name="#p612" href="p612">page 612</a>] (<a href="#Contents">Contents</a>)
+
+5   All elements following the terminating null character (if any) written by strncpy_s in
+    the array of s1max characters pointed to by s1 take unspecified values when
+    strncpy_s returns.406)
+    Returns
+6   The strncpy_s function returns zero407) if there was no runtime-constraint violation.
+    Otherwise, a nonzero value is returned.
+7   EXAMPLE 1 The strncpy_s function can be used to copy a string without the danger that the result
+    will not be null terminated or that characters will be written past the end of the destination array.
+            #define __STDC_WANT_LIB_EXT1__ 1
+            #include <a href="#7.23">&lt;string.h&gt;</a>
+            /* ... */
+            char src1[100] = "hello";
+            char src2[7] = {'g', 'o', 'o', 'd', 'b', 'y', 'e'};
+            char dst1[6], dst2[5], dst3[5];
+            int r1, r2, r3;
+            r1 = strncpy_s(dst1, 6, src1, 100);
+            r2 = strncpy_s(dst2, 5, src2, 7);
+            r3 = strncpy_s(dst3, 5, src2, 4);
+    The first call will assign to r1 the value zero and to dst1 the sequence hello\0.
+    The second call will assign to r2 a nonzero value and to dst2 the sequence \0.
+    The third call will assign to r3 the value zero and to dst3 the sequence good\0.
+
+<a name="K.3.7.2" href="#K.3.7.2"><b>    K.3.7.2 Concatenation functions</b></a>
+<a name="K.3.7.2.1" href="#K.3.7.2.1"><b>    K.3.7.2.1 The strcat_s function</b></a>
+    Synopsis
+1           #define __STDC_WANT_LIB_EXT1__ 1
+            #include <a href="#7.23">&lt;string.h&gt;</a>
+            errno_t strcat_s(char * restrict s1,
+                 rsize_t s1max,
+                 const char * restrict s2);
+    Runtime-constraints
+2   Let m denote the value s1max - strnlen_s(s1, s1max) upon entry to
+    strcat_s.
+
+
+
+
+    406) This allows an implementation to copy characters from s2 to s1 while simultaneously checking if
+         any of those characters are null. Such an approach might write a character to every element of s1
+         before discovering that the first element should be set to the null character.
+    407) A zero return value implies that all of the requested characters from the string pointed to by s2 fit
+         within the array pointed to by s1 and that the result in s1 is null terminated.
+
+[<a name="#p613" href="p613">page 613</a>] (<a href="#Contents">Contents</a>)
+
+3   Neither s1 nor s2 shall be a null pointer. s1max shall not be greater than RSIZE_MAX.
+    s1max shall not equal zero. m shall not equal zero.408) m shall be greater than
+    strnlen_s(s2, m). Copying shall not take place between objects that overlap.
+4   If there is a runtime-constraint violation, then if s1 is not a null pointer and s1max is
+    greater than zero and not greater than RSIZE_MAX, then strcat_s sets s1[0] to the
+    null character.
+    Description
+5   The strcat_s 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
+    from s2 overwrites the null character at the end of s1.
+6   All elements following the terminating null character (if any) written by strcat_s in
+    the array of s1max characters pointed to by s1 take unspecified values when
+    strcat_s returns.409)
+    Returns
+7   The strcat_s function returns zero410) if there was no runtime-constraint violation.
+    Otherwise, a nonzero value is returned.
+<a name="K.3.7.2.2" href="#K.3.7.2.2"><b>    K.3.7.2.2 The strncat_s function</b></a>
+    Synopsis
+1           #define __STDC_WANT_LIB_EXT1__ 1
+            #include <a href="#7.23">&lt;string.h&gt;</a>
+            errno_t strncat_s(char * restrict s1,
+                 rsize_t s1max,
+                 const char * restrict s2,
+                 rsize_t n);
+    Runtime-constraints
+2   Let m denote the value s1max - strnlen_s(s1, s1max) upon entry to
+    strncat_s.
+3   Neither s1 nor s2 shall be a null pointer. Neither s1max nor n shall be greater than
+    RSIZE_MAX. s1max shall not equal zero. m shall not equal zero.411) If n is not less
+
+
+    408) Zero means that s1 was not null terminated upon entry to strcat_s.
+    409) This allows an implementation to append characters from s2 to s1 while simultaneously checking if
+         any of those characters are null. Such an approach might write a character to every element of s1
+         before discovering that the first element should be set to the null character.
+    410) A zero return value implies that all of the requested characters from the string pointed to by s2 were
+         appended to the string pointed to by s1 and that the result in s1 is null terminated.
+
+[<a name="#p614" href="p614">page 614</a>] (<a href="#Contents">Contents</a>)
+
+    than m, then m shall be greater than strnlen_s(s2, m). Copying shall not take
+    place between objects that overlap.
+4   If there is a runtime-constraint violation, then if s1 is not a null pointer and s1max is
+    greater than zero and not greater than RSIZE_MAX, then strncat_s sets s1[0] to the
+    null character.
+    Description
+5   The strncat_s function appends not more than n successive characters (characters
+    that follow a null character are not copied) from the array pointed to by s2 to the end of
+    the string pointed to by s1. The initial character from s2 overwrites the null character at
+    the end of s1. If no null character was copied from s2, then s1[s1max-m+n] is set to
+    a null character.
+6   All elements following the terminating null character (if any) written by strncat_s in
+    the array of s1max characters pointed to by s1 take unspecified values when
+    strncat_s returns.412)
+    Returns
+7   The strncat_s function returns zero413) if there was no runtime-constraint violation.
+    Otherwise, a nonzero value is returned.
+8   EXAMPLE 1 The strncat_s function can be used to copy a string without the danger that the result
+    will not be null terminated or that characters will be written past the end of the destination array.
+            #define __STDC_WANT_LIB_EXT1__ 1
+            #include <a href="#7.23">&lt;string.h&gt;</a>
+            /* ... */
+            char s1[100] = "good";
+            char s2[6] = "hello";
+            char s3[6] = "hello";
+            char s4[7] = "abc";
+            char s5[1000] = "bye";
+            int r1, r2, r3, r4;
+            r1 = strncat_s(s1, 100, s5, 1000);
+            r2 = strncat_s(s2, 6, "", 1);
+            r3 = strncat_s(s3, 6, "X", 2);
+            r4 = strncat_s(s4, 7, "defghijklmn", 3);
+    After the first call r1 will have the value zero and s1 will contain the sequence goodbye\0.
+
+
+
+    411) Zero means that s1 was not null terminated upon entry to strncat_s.
+    412) This allows an implementation to append characters from s2 to s1 while simultaneously checking if
+         any of those characters are null. Such an approach might write a character to every element of s1
+         before discovering that the first element should be set to the null character.
+    413) A zero return value implies that all of the requested characters from the string pointed to by s2 were
+         appended to the string pointed to by s1 and that the result in s1 is null terminated.
+
+[<a name="#p615" href="p615">page 615</a>] (<a href="#Contents">Contents</a>)
+
+    After the second call r2 will have the value zero and s2 will contain the sequence hello\0.
+    After the third call r3 will have a nonzero value and s3 will contain the sequence \0.
+    After the fourth call r4 will have the value zero and s4 will contain the sequence abcdef\0.
+
+<a name="K.3.7.3" href="#K.3.7.3"><b>    K.3.7.3 Search functions</b></a>
+<a name="K.3.7.3.1" href="#K.3.7.3.1"><b>    K.3.7.3.1 The strtok_s function</b></a>
+    Synopsis
+1           #define __STDC_WANT_LIB_EXT1__ 1
+            #include <a href="#7.23">&lt;string.h&gt;</a>
+            char *strtok_s(char * restrict s1,
+                 rsize_t * restrict s1max,
+                 const char * restrict s2,
+                 char ** restrict ptr);
+    Runtime-constraints
+2   None of s1max, s2, or ptr shall be a null pointer. If s1 is a null pointer, then *ptr
+    shall not be a null pointer. The value of *s1max shall not be greater than RSIZE_MAX.
+    The end of the token found shall occur within the first *s1max characters of s1 for the
+    first call, and shall occur within the first *s1max characters of where searching resumes
+    on subsequent calls.
+3   If there is a runtime-constraint violation, the strtok_s function does not indirect
+    through the s1 or s2 pointers, and does not store a value in the object pointed to by ptr.
+    Description
+4   A sequence of calls to the strtok_s 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 fourth argument points to a caller-provided char pointer into which the
+    strtok_s function stores information necessary for it to continue scanning the same
+    string.
+5   The first call in a sequence has a non-null first argument and s1max points to an object
+    whose value is the number of elements in the character array pointed to by the first
+    argument. The first call stores an initial value in the object pointed to by ptr and
+    updates the value pointed to by s1max to reflect the number of elements that remain in
+    relation to ptr. Subsequent calls in the sequence have a null first argument and the
+    objects pointed to by s1max and ptr are required to have the values stored by the
+    previous call in the sequence, which are then updated. The separator string pointed to by
+    s2 may be different from call to call.
+6   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_s
+    function returns a null pointer. If such a character is found, it is the start of the first token.
+[<a name="#p616" href="p616">page 616</a>] (<a href="#Contents">Contents</a>)
+
+7    The strtok_s function then searches from there for the first character in s1 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 in the same
+     string for a token return a null pointer. If such a character is found, it is overwritten by a
+     null character, which terminates the current token.
+8    In all cases, the strtok_s 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 character
+     (if any).
+     Returns
+9    The strtok_s function returns a pointer to the first character of a token, or a null
+     pointer if there is no token or there is a runtime-constraint violation.
+10   EXAMPLE
+             #define __STDC_WANT_LIB_EXT1__ 1
+             #include <a href="#7.23">&lt;string.h&gt;</a>
+             static char str1[] = "?a???b,,,#c";
+             static char str2[] = "\t \t";
+             char *t, *ptr1, *ptr2;
+             rsize_t max1 = sizeof(str1);
+             rsize_t max2 = sizeof(str2);
+             t   =   strtok_s(str1,   &amp;max1,   "?", &amp;ptr1);        //   t   points to the token "a"
+             t   =   strtok_s(NULL,   &amp;max1,   ",", &amp;ptr1);        //   t   points to the token "??b"
+             t   =   strtok_s(str2,   &amp;max2,   " \t", &amp;ptr2);      //   t   is a null pointer
+             t   =   strtok_s(NULL,   &amp;max1,   "#,", &amp;ptr1);       //   t   points to the token "c"
+             t   =   strtok_s(NULL,   &amp;max1,   "?", &amp;ptr1);        //   t   is a null pointer
+
+<a name="K.3.7.4" href="#K.3.7.4"><b>     K.3.7.4 Miscellaneous functions</b></a>
+<a name="K.3.7.4.1" href="#K.3.7.4.1"><b>     K.3.7.4.1 The memset_s function</b></a>
+     Synopsis
+1            #define __STDC_WANT_LIB_EXT1__ 1
+             #include <a href="#7.23">&lt;string.h&gt;</a>
+             errno_t memset_s(void *s, rsize_t smax, int c, rsize_t n)
+     Runtime-constraints
+2    s shall not be a null pointer. Neither smax nor n shall be greater than RSIZE_MAX. n
+     shall not be greater than smax.
+3    If there is a runtime-constraint violation, then if s is not a null pointer and smax is not
+     greater than RSIZE_MAX, the memset_s function stores the value of c (converted to an
+     unsigned char) into each of the first smax characters of the object pointed to by s.
+
+
+
+[<a name="#p617" href="p617">page 617</a>] (<a href="#Contents">Contents</a>)
+
+    Description
+4   The memset_s 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. Unlike memset, any call to
+    the memset_s function 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>). That is, any call to the memset_s function shall
+    assume that the memory indicated by s and n may be accessible in the future and thus
+    must contain the values indicated by c.
+    Returns
+5   The memset_s function returns zero if there was no runtime-constraint violation.
+    Otherwise, a nonzero value is returned.
+<a name="K.3.7.4.2" href="#K.3.7.4.2"><b>    K.3.7.4.2 The strerror_s function</b></a>
+    Synopsis
+1          #define __STDC_WANT_LIB_EXT1__ 1
+           #include <a href="#7.23">&lt;string.h&gt;</a>
+           errno_t strerror_s(char *s, rsize_t maxsize,
+                errno_t errnum);
+    Runtime-constraints
+2   s shall not be a null pointer. maxsize shall not be greater than RSIZE_MAX.
+    maxsize shall not equal zero.
+3   If there is a runtime-constraint violation, then the array (if any) pointed to by s is not
+    modified.
+    Description
+4   The strerror_s function maps the number in errnum to a locale-specific message
+    string. Typically, the values for errnum come from errno, but strerror_s shall
+    map any value of type int to a message.
+5   If the length of the desired string is less than maxsize, then the string is copied to the
+    array pointed to by s.
+6   Otherwise, if maxsize is greater than zero, then maxsize-1 characters are copied
+    from the string to the array pointed to by s and then s[maxsize-1] is set to the null
+    character. Then, if maxsize is greater than 3, then s[maxsize-2],
+    s[maxsize-3], and s[maxsize-4] are set to the character period (.).
+    Returns
+7   The strerror_s function returns zero if the length of the desired string was less than
+    maxsize and there was no runtime-constraint violation. Otherwise, the strerror_s
+    function returns a nonzero value.
+
+[<a name="#p618" href="p618">page 618</a>] (<a href="#Contents">Contents</a>)
+
+<a name="K.3.7.4.3" href="#K.3.7.4.3"><b>    K.3.7.4.3 The strerrorlen_s function</b></a>
+    Synopsis
+1           #define __STDC_WANT_LIB_EXT1__ 1
+            #include <a href="#7.23">&lt;string.h&gt;</a>
+            size_t strerrorlen_s(errno_t errnum);
+    Description
+2   The strerrorlen_s function calculates the length of the (untruncated) locale-specific
+    message string that the strerror_s function maps to errnum.
+    Returns
+3   The strerrorlen_s function returns the number of characters (not including the null
+    character) in the full message string.
+<a name="K.3.7.4.4" href="#K.3.7.4.4"><b>    K.3.7.4.4 The strnlen_s function</b></a>
+    Synopsis
+1           #define __STDC_WANT_LIB_EXT1__ 1
+            #include <a href="#7.23">&lt;string.h&gt;</a>
+            size_t strnlen_s(const char *s, size_t maxsize);
+    Description
+2   The strnlen_s function computes the length of the string pointed to by s.
+    Returns
+3   If s is a null pointer,414) then the strnlen_s function returns zero.
+4   Otherwise, the strnlen_s function returns the number of characters that precede the
+    terminating null character. If there is no null character in the first maxsize characters of
+    s then strnlen_s returns maxsize. At most the first maxsize characters of s shall
+    be accessed by strnlen_s.
+
+
+
+
+    414) Note that the strnlen_s function has no runtime-constraints. This lack of runtime-constraints
+         along with the values returned for a null pointer or an unterminated string argument make
+         strnlen_s useful in algorithms that gracefully handle such exceptional data.
+
+[<a name="#p619" href="p619">page 619</a>] (<a href="#Contents">Contents</a>)
+
+<a name="K.3.8" href="#K.3.8"><b>    K.3.8 Date and time &lt;time.h&gt;</b></a>
+1   The header <a href="#7.26">&lt;time.h&gt;</a> defines two types.
+2   The types are
+            errno_t
+    which is type int; and
+            rsize_t
+    which is the type size_t.
+<a name="K.3.8.1" href="#K.3.8.1"><b>    K.3.8.1 Components of time</b></a>
+1   A broken-down time is normalized if the values of the members of the tm structure are in
+    their normal rages.415)
+<a name="K.3.8.2" href="#K.3.8.2"><b>    K.3.8.2 Time conversion functions</b></a>
+1   Like the strftime function, the asctime_s and ctime_s functions do not return a
+    pointer to a static object, and other library functions are permitted to call them.
+<a name="K.3.8.2.1" href="#K.3.8.2.1"><b>    K.3.8.2.1 The asctime_s function</b></a>
+    Synopsis
+1           #define __STDC_WANT_LIB_EXT1__ 1
+            #include <a href="#7.26">&lt;time.h&gt;</a>
+            errno_t asctime_s(char *s, rsize_t maxsize,
+                 const struct tm *timeptr);
+    Runtime-constraints
+2   Neither s nor timeptr shall be a null pointer. maxsize shall not be less than 26 and
+    shall not be greater than RSIZE_MAX. The broken-down time pointed to by timeptr
+    shall be normalized. The calendar year represented by the broken-down time pointed to
+    by timeptr shall not be less than calendar year 0 and shall not be greater than calendar
+    year 9999.
+3   If there is a runtime-constraint violation, there is no attempt to convert the time, and
+    s[0] is set to a null character if s is not a null pointer and maxsize is not zero and is
+    not greater than RSIZE_MAX.
+    Description
+4   The asctime_s function converts the normalized broken-down time in the structure
+    pointed to by timeptr into a 26 character (including the null character) string in the
+
+
+    415) The normal ranges are defined in <a href="#7.26.1">7.26.1</a>.
+
+[<a name="#p620" href="p620">page 620</a>] (<a href="#Contents">Contents</a>)
+
+    form
+            Sun Sep 16 01:03:52 1973\n\0
+    The fields making up this string are (in order):
+       1.   The name of the day of the week represented by timeptr-&gt;tm_wday using the
+            following three character weekday names: Sun, Mon, Tue, Wed, Thu, Fri, and Sat.
+       2.   The character space.
+       3. The name of the month represented by timeptr-&gt;tm_mon using the following
+          three character month names: Jan, Feb, Mar, Apr, May, Jun, Jul, Aug, Sep, Oct,
+          Nov, and Dec.
+       4.   The character space.
+       5.   The value of timeptr-&gt;tm_mday as if printed using the fprintf format
+            "%2d".
+       6.   The character space.
+       7.   The value of timeptr-&gt;tm_hour as if printed using the fprintf format
+            "%.2d".
+       8.   The character colon.
+       9.   The value of timeptr-&gt;tm_min as if printed using the fprintf format
+            "%.2d".
+     10.    The character colon.
+     11.    The value of timeptr-&gt;tm_sec as if printed using the fprintf format
+            "%.2d".
+     12.    The character space.
+     13.    The value of timeptr-&gt;tm_year + 1900 as if printed using the fprintf
+            format "%4d".
+     14.    The character new line.
+     15.    The null character.
+    Recommended practice
+    The strftime function allows more flexible formatting and supports locale-specific
+    behavior. If you do not require the exact form of the result string produced by the
+    asctime_s function, consider using the strftime function instead.
+    Returns
+5   The asctime_s function returns zero if the time was successfully converted and stored
+    into the array pointed to by s. Otherwise, it returns a nonzero value.
+[<a name="#p621" href="p621">page 621</a>] (<a href="#Contents">Contents</a>)
+
+<a name="K.3.8.2.2" href="#K.3.8.2.2"><b>    K.3.8.2.2 The ctime_s function</b></a>
+    Synopsis
+1          #define __STDC_WANT_LIB_EXT1__ 1
+           #include <a href="#7.26">&lt;time.h&gt;</a>
+           errno_t ctime_s(char *s, rsize_t maxsize,
+                const time_t *timer);
+    Runtime-constraints
+2   Neither s nor timer shall be a null pointer. maxsize shall not be less than 26 and
+    shall not be greater than RSIZE_MAX.
+3   If there is a runtime-constraint violation, s[0] is set to a null character if s is not a null
+    pointer and maxsize is not equal zero and is not greater than RSIZE_MAX.
+    Description
+4   The ctime_s function converts the calendar time pointed to by timer to local time in
+    the form of a string. It is equivalent to
+           asctime_s(s, maxsize, localtime_s(timer))
+    Recommended practice
+    The strftime function allows more flexible formatting and supports locale-specific
+    behavior. If you do not require the exact form of the result string produced by the
+    ctime_s function, consider using the strftime function instead.
+    Returns
+5   The ctime_s function returns zero if the time was successfully converted and stored
+    into the array pointed to by s. Otherwise, it returns a nonzero value.
+<a name="K.3.8.2.3" href="#K.3.8.2.3"><b>    K.3.8.2.3 The gmtime_s function</b></a>
+    Synopsis
+1          #define __STDC_WANT_LIB_EXT1__ 1
+           #include <a href="#7.26">&lt;time.h&gt;</a>
+           struct tm *gmtime_s(const time_t * restrict timer,
+                struct tm * restrict result);
+    Runtime-constraints
+2   Neither timer nor result shall be a null pointer.
+3   If there is a runtime-constraint violation, there is no attempt to convert the time.
+    Description
+4   The gmtime_s function converts the calendar time pointed to by timer into a broken-
+    down time, expressed as UTC. The broken-down time is stored in the structure pointed
+[<a name="#p622" href="p622">page 622</a>] (<a href="#Contents">Contents</a>)
+
+    to by result.
+    Returns
+5   The gmtime_s function returns result, or a null pointer if the specified time cannot
+    be converted to UTC or there is a runtime-constraint violation.
+<a name="K.3.8.2.4" href="#K.3.8.2.4"><b>    K.3.8.2.4 The localtime_s function</b></a>
+    Synopsis
+1            #define __STDC_WANT_LIB_EXT1__ 1
+             #include <a href="#7.26">&lt;time.h&gt;</a>
+             struct tm *localtime_s(const time_t * restrict timer,
+                  struct tm * restrict result);
+    Runtime-constraints
+2   Neither timer nor result shall be a null pointer.
+3   If there is a runtime-constraint violation, there is no attempt to convert the time.
+    Description
+4   The localtime_s function converts the calendar time pointed to by timer into a
+    broken-down time, expressed as local time. The broken-down time is stored in the
+    structure pointed to by result.
+    Returns
+5   The localtime_s function returns result, or a null pointer if the specified time
+    cannot be converted to local time or there is a runtime-constraint violation.
+<a name="K.3.9" href="#K.3.9"><b>    K.3.9 Extended multibyte and wide character utilities &lt;wchar.h&gt;</b></a>
+1   The header <a href="#7.28">&lt;wchar.h&gt;</a> defines two types.
+2   The types are
+             errno_t
+    which is type int; and
+             rsize_t
+    which is the type size_t.
+3   Unless explicitly stated otherwise, if the execution of a function described in this
+    subclause causes copying to take place between objects that overlap, the objects take on
+    unspecified values.
+
+
+
+
+[<a name="#p623" href="p623">page 623</a>] (<a href="#Contents">Contents</a>)
+
+<a name="K.3.9.1" href="#K.3.9.1"><b>    K.3.9.1 Formatted wide character input/output functions</b></a>
+<a name="K.3.9.1.1" href="#K.3.9.1.1"><b>    K.3.9.1.1 The fwprintf_s function</b></a>
+    Synopsis
+1           #define __STDC_WANT_LIB_EXT1__ 1
+            #include <a href="#7.28">&lt;wchar.h&gt;</a>
+            int fwprintf_s(FILE * restrict stream,
+                 const wchar_t * restrict format, ...);
+    Runtime-constraints
+2   Neither stream nor format shall be a null pointer. The %n specifier416) (modified or
+    not by flags, field width, or precision) shall not appear in the wide string pointed to by
+    format. Any argument to fwprintf_s corresponding to a %s specifier shall not be a
+    null pointer.
+3   If there is a runtime-constraint violation, the fwprintf_s function does not attempt to
+    produce further output, and it is unspecified to what extent fwprintf_s produced
+    output before discovering the runtime-constraint violation.
+    Description
+4   The fwprintf_s function is equivalent to the fwprintf function except for the
+    explicit runtime-constraints listed above.
+    Returns
+5   The fwprintf_s function returns the number of wide characters transmitted, or a
+    negative value if an output error, encoding error, or runtime-constraint violation occurred.
+<a name="K.3.9.1.2" href="#K.3.9.1.2"><b>    K.3.9.1.2 The fwscanf_s function</b></a>
+    Synopsis
+1           #define __STDC_WANT_LIB_EXT1__ 1
+            #include <a href="#7.21">&lt;stdio.h&gt;</a>
+            #include <a href="#7.28">&lt;wchar.h&gt;</a>
+            int fwscanf_s(FILE * restrict stream,
+                 const wchar_t * restrict format, ...);
+    Runtime-constraints
+2   Neither stream nor format shall be a null pointer. Any argument indirected though in
+    order to store converted input shall not be a null pointer.
+
+
+    416) It is not a runtime-constraint violation for the wide characters %n to appear in sequence in the wide
+         string pointed at by format when those wide characters are not a interpreted as a %n specifier. For
+         example, if the entire format string was L"%%n".
+
+[<a name="#p624" href="p624">page 624</a>] (<a href="#Contents">Contents</a>)
+
+3   If there is a runtime-constraint violation, the fwscanf_s function does not attempt to
+    perform further input, and it is unspecified to what extent fwscanf_s performed input
+    before discovering the runtime-constraint violation.
+    Description
+4   The fwscanf_s function is equivalent to fwscanf except that the c, s, and [
+    conversion specifiers apply to a pair of arguments (unless assignment suppression is
+    indicated by a *). The first of these arguments is the same as for fwscanf. That
+    argument is immediately followed in the argument list by the second argument, which has
+    type size_t and gives the number of elements in the array pointed to by the first
+    argument of the pair. If the first argument points to a scalar object, it is considered to be
+    an array of one element.417)
+5   A matching failure occurs if the number of elements in a receiving object is insufficient to
+    hold the converted input (including any trailing null character).
+    Returns
+6   The fwscanf_s function returns the value of the macro EOF if an input failure occurs
+    before any conversion or if there is a runtime-constraint violation. Otherwise, the
+    fwscanf_s 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="K.3.9.1.3" href="#K.3.9.1.3"><b>    K.3.9.1.3 The snwprintf_s function</b></a>
+    Synopsis
+1           #define __STDC_WANT_LIB_EXT1__ 1
+            #include <a href="#7.28">&lt;wchar.h&gt;</a>
+            int snwprintf_s(wchar_t * restrict s,
+                 rsize_t n,
+                 const wchar_t * restrict format, ...);
+    Runtime-constraints
+2   Neither s nor format shall be a null pointer. n shall neither equal zero nor be greater
+    than RSIZE_MAX. The %n specifier418) (modified or not by flags, field width, or
+
+    417) If the format is known at translation time, an implementation may issue a diagnostic for any argument
+         used to store the result from a c, s, or [ conversion specifier if that argument is not followed by an
+         argument of a type compatible with rsize_t. A limited amount of checking may be done if even if
+         the format is not known at translation time. For example, an implementation may issue a diagnostic
+         for each argument after format that has of type pointer to one of char, signed char,
+         unsigned char, or void that is not followed by an argument of a type compatible with
+         rsize_t. The diagnostic could warn that unless the pointer is being used with a conversion specifier
+         using the hh length modifier, a length argument must follow the pointer argument. Another useful
+         diagnostic could flag any non-pointer argument following format that did not have a type
+         compatible with rsize_t.
+
+[<a name="#p625" href="p625">page 625</a>] (<a href="#Contents">Contents</a>)
+
+    precision) shall not appear in the wide string pointed to by format. Any argument to
+    snwprintf_s corresponding to a %s specifier shall not be a null pointer. No encoding
+    error shall occur.
+3   If there is a runtime-constraint violation, then if s is not a null pointer and n is greater
+    than zero and less than RSIZE_MAX, then the snwprintf_s function sets s[0] to the
+    null wide character.
+    Description
+4   The snwprintf_s function is equivalent to the swprintf function except for the
+    explicit runtime-constraints listed above.
+5   The snwprintf_s function, unlike swprintf_s, will truncate the result to fit within
+    the array pointed to by s.
+    Returns
+6   The snwprintf_s function returns the number of wide characters that would have
+    been written had n been sufficiently large, not counting the terminating wide null
+    character, or a negative value if a runtime-constraint violation 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="K.3.9.1.4" href="#K.3.9.1.4"><b>    K.3.9.1.4 The swprintf_s function</b></a>
+    Synopsis
+1           #define __STDC_WANT_LIB_EXT1__ 1
+            #include <a href="#7.28">&lt;wchar.h&gt;</a>
+            int swprintf_s(wchar_t * restrict s, rsize_t n,
+                 const wchar_t * restrict format, ...);
+    Runtime-constraints
+2   Neither s nor format shall be a null pointer. n shall neither equal zero nor be greater
+    than RSIZE_MAX. The number of wide characters (including the trailing null) required
+    for the result to be written to the array pointed to by s shall not be greater than n. The %n
+    specifier419) (modified or not by flags, field width, or precision) shall not appear in the
+    wide string pointed to by format. Any argument to swprintf_s corresponding to a
+    %s specifier shall not be a null pointer. No encoding error shall occur.
+
+
+    418) It is not a runtime-constraint violation for the wide characters %n to appear in sequence in the wide
+         string pointed at by format when those wide characters are not a interpreted as a %n specifier. For
+         example, if the entire format string was L"%%n".
+    419) It is not a runtime-constraint violation for the wide characters %n to appear in sequence in the wide
+         string pointed at by format when those wide characters are not a interpreted as a %n specifier. For
+         example, if the entire format string was L"%%n".
+
+[<a name="#p626" href="p626">page 626</a>] (<a href="#Contents">Contents</a>)
+
+3   If there is a runtime-constraint violation, then if s is not a null pointer and n is greater
+    than zero and less than RSIZE_MAX, then the swprintf_s function sets s[0] to the
+    null wide character.
+    Description
+4   The swprintf_s function is equivalent to the swprintf function except for the
+    explicit runtime-constraints listed above.
+5   The swprintf_s function, unlike snwprintf_s, treats a result too big for the array
+    pointed to by s as a runtime-constraint violation.
+    Returns
+6   If no runtime-constraint violation occurred, the swprintf_s function returns the
+    number of wide characters written in the array, not counting the terminating null wide
+    character. If an encoding error occurred or if n or more wide characters are requested to
+    be written, swprintf_s returns a negative value. If any other runtime-constraint
+    violation occurred, swprintf_s returns zero.
+<a name="K.3.9.1.5" href="#K.3.9.1.5"><b>    K.3.9.1.5 The swscanf_s function</b></a>
+    Synopsis
+1           #define __STDC_WANT_LIB_EXT1__ 1
+            #include <a href="#7.28">&lt;wchar.h&gt;</a>
+            int swscanf_s(const wchar_t * restrict s,
+                 const wchar_t * restrict format, ...);
+    Runtime-constraints
+2   Neither s nor format shall be a null pointer. Any argument indirected though in order
+    to store converted input shall not be a null pointer.
+3   If there is a runtime-constraint violation, the swscanf_s function does not attempt to
+    perform further input, and it is unspecified to what extent swscanf_s performed input
+    before discovering the runtime-constraint violation.
+    Description
+4   The swscanf_s function is equivalent to fwscanf_s, 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_s function.
+    Returns
+5   The swscanf_s function returns the value of the macro EOF if an input failure occurs
+    before any conversion or if there is a runtime-constraint violation. Otherwise, the
+    swscanf_s 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="#p627" href="p627">page 627</a>] (<a href="#Contents">Contents</a>)
+
+<a name="K.3.9.1.6" href="#K.3.9.1.6"><b>    K.3.9.1.6 The vfwprintf_s function</b></a>
+    Synopsis
+1           #define __STDC_WANT_LIB_EXT1__ 1
+            #include <a href="#7.16">&lt;stdarg.h&gt;</a>
+            #include <a href="#7.21">&lt;stdio.h&gt;</a>
+            #include <a href="#7.28">&lt;wchar.h&gt;</a>
+            int vfwprintf_s(FILE * restrict stream,
+                 const wchar_t * restrict format,
+                 va_list arg);
+    Runtime-constraints
+2   Neither stream nor format shall be a null pointer. The %n specifier420) (modified or
+    not by flags, field width, or precision) shall not appear in the wide string pointed to by
+    format. Any argument to vfwprintf_s corresponding to a %s specifier shall not be
+    a null pointer.
+3   If there is a runtime-constraint violation, the vfwprintf_s function does not attempt
+    to produce further output, and it is unspecified to what extent vfwprintf_s produced
+    output before discovering the runtime-constraint violation.
+    Description
+4   The vfwprintf_s function is equivalent to the vfwprintf function except for the
+    explicit runtime-constraints listed above.
+    Returns
+5   The vfwprintf_s function returns the number of wide characters transmitted, or a
+    negative value if an output error, encoding error, or runtime-constraint violation occurred.
+<a name="K.3.9.1.7" href="#K.3.9.1.7"><b>    K.3.9.1.7 The vfwscanf_s function</b></a>
+    Synopsis
+1           #define __STDC_WANT_LIB_EXT1__ 1
+            #include <a href="#7.16">&lt;stdarg.h&gt;</a>
+            #include <a href="#7.21">&lt;stdio.h&gt;</a>
+            #include <a href="#7.28">&lt;wchar.h&gt;</a>
+            int vfwscanf_s(FILE * restrict stream,
+                 const wchar_t * restrict format, va_list arg);
+
+
+
+    420) It is not a runtime-constraint violation for the wide characters %n to appear in sequence in the wide
+         string pointed at by format when those wide characters are not a interpreted as a %n specifier. For
+         example, if the entire format string was L"%%n".
+
+[<a name="#p628" href="p628">page 628</a>] (<a href="#Contents">Contents</a>)
+
+    Runtime-constraints
+2   Neither stream nor format shall be a null pointer. Any argument indirected though in
+    order to store converted input shall not be a null pointer.
+3   If there is a runtime-constraint violation, the vfwscanf_s function does not attempt to
+    perform further input, and it is unspecified to what extent vfwscanf_s performed input
+    before discovering the runtime-constraint violation.
+    Description
+4   The vfwscanf_s function is equivalent to fwscanf_s, 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_s function does not invoke the
+    va_end macro.421)
+    Returns
+5   The vfwscanf_s function returns the value of the macro EOF if an input failure occurs
+    before any conversion or if there is a runtime-constraint violation. Otherwise, the
+    vfwscanf_s 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="K.3.9.1.8" href="#K.3.9.1.8"><b>    K.3.9.1.8 The vsnwprintf_s function</b></a>
+    Synopsis
+1           #define __STDC_WANT_LIB_EXT1__ 1
+            #include <a href="#7.16">&lt;stdarg.h&gt;</a>
+            #include <a href="#7.28">&lt;wchar.h&gt;</a>
+            int vsnwprintf_s(wchar_t * restrict s,
+                 rsize_t n,
+                 const wchar_t * restrict format,
+                 va_list arg);
+    Runtime-constraints
+2   Neither s nor format shall be a null pointer. n shall neither equal zero nor be greater
+    than RSIZE_MAX. The %n specifier422) (modified or not by flags, field width, or
+    precision) shall not appear in the wide string pointed to by format. Any argument to
+    vsnwprintf_s corresponding to a %s specifier shall not be a null pointer. No
+    encoding error shall occur.
+
+    421) As the functions vfwscanf_s, vwscanf_s, and vswscanf_s invoke the va_arg macro, the
+         value of arg after the return is indeterminate.
+    422) It is not a runtime-constraint violation for the wide characters %n to appear in sequence in the wide
+         string pointed at by format when those wide characters are not a interpreted as a %n specifier. For
+         example, if the entire format string was L"%%n".
+
+[<a name="#p629" href="p629">page 629</a>] (<a href="#Contents">Contents</a>)
+
+3   If there is a runtime-constraint violation, then if s is not a null pointer and n is greater
+    than zero and less than RSIZE_MAX, then the vsnwprintf_s function sets s[0] to
+    the null wide character.
+    Description
+4   The vsnwprintf_s function is equivalent to the vswprintf function except for the
+    explicit runtime-constraints listed above.
+5   The vsnwprintf_s function, unlike vswprintf_s, will truncate the result to fit
+    within the array pointed to by s.
+    Returns
+6   The vsnwprintf_s function returns the number of wide characters that would have
+    been written had n been sufficiently large, not counting the terminating null character, or
+    a negative value if a runtime-constraint violation 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="K.3.9.1.9" href="#K.3.9.1.9"><b>    K.3.9.1.9 The vswprintf_s function</b></a>
+    Synopsis
+1           #define __STDC_WANT_LIB_EXT1__ 1
+            #include <a href="#7.16">&lt;stdarg.h&gt;</a>
+            #include <a href="#7.28">&lt;wchar.h&gt;</a>
+            int vswprintf_s(wchar_t * restrict s,
+                 rsize_t n,
+                 const wchar_t * restrict format,
+                 va_list arg);
+    Runtime-constraints
+2   Neither s nor format shall be a null pointer. n shall neither equal zero nor be greater
+    than RSIZE_MAX. The number of wide characters (including the trailing null) required
+    for the result to be written to the array pointed to by s shall not be greater than n. The %n
+    specifier423) (modified or not by flags, field width, or precision) shall not appear in the
+    wide string pointed to by format. Any argument to vswprintf_s corresponding to a
+    %s specifier shall not be a null pointer. No encoding error shall occur.
+3   If there is a runtime-constraint violation, then if s is not a null pointer and n is greater
+    than zero and less than RSIZE_MAX, then the vswprintf_s function sets s[0] to the
+    null wide character.
+
+    423) It is not a runtime-constraint violation for the wide characters %n to appear in sequence in the wide
+         string pointed at by format when those wide characters are not a interpreted as a %n specifier. For
+         example, if the entire format string was L"%%n".
+
+[<a name="#p630" href="p630">page 630</a>] (<a href="#Contents">Contents</a>)
+
+    Description
+4   The vswprintf_s function is equivalent to the vswprintf function except for the
+    explicit runtime-constraints listed above.
+5   The vswprintf_s function, unlike vsnwprintf_s, treats a result too big for the
+    array pointed to by s as a runtime-constraint violation.
+    Returns
+6   If no runtime-constraint violation occurred, the vswprintf_s function returns the
+    number of wide characters written in the array, not counting the terminating null wide
+    character. If an encoding error occurred or if n or more wide characters are requested to
+    be written, vswprintf_s returns a negative value. If any other runtime-constraint
+    violation occurred, vswprintf_s returns zero.
+<a name="K.3.9.1.10" href="#K.3.9.1.10"><b>    K.3.9.1.10 The vswscanf_s function</b></a>
+    Synopsis
+1           #define __STDC_WANT_LIB_EXT1__ 1
+            #include <a href="#7.16">&lt;stdarg.h&gt;</a>
+            #include <a href="#7.28">&lt;wchar.h&gt;</a>
+            int vswscanf_s(const wchar_t * restrict s,
+                 const wchar_t * restrict format,
+                 va_list arg);
+    Runtime-constraints
+2   Neither s nor format shall be a null pointer. Any argument indirected though in order
+    to store converted input shall not be a null pointer.
+3   If there is a runtime-constraint violation, the vswscanf_s function does not attempt to
+    perform further input, and it is unspecified to what extent vswscanf_s performed input
+    before discovering the runtime-constraint violation.
+    Description
+4   The vswscanf_s function is equivalent to swscanf_s, 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_s function does not invoke the
+    va_end macro.424)
+
+
+
+
+    424) As the functions vfwscanf_s, vwscanf_s, and vswscanf_s invoke the va_arg macro, the
+         value of arg after the return is indeterminate.
+
+[<a name="#p631" href="p631">page 631</a>] (<a href="#Contents">Contents</a>)
+
+    Returns
+5   The vswscanf_s function returns the value of the macro EOF if an input failure occurs
+    before any conversion or if there is a runtime-constraint violation. Otherwise, the
+    vswscanf_s 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="K.3.9.1.11" href="#K.3.9.1.11"><b>    K.3.9.1.11 The vwprintf_s function</b></a>
+    Synopsis
+1           #define __STDC_WANT_LIB_EXT1__ 1
+            #include <a href="#7.16">&lt;stdarg.h&gt;</a>
+            #include <a href="#7.28">&lt;wchar.h&gt;</a>
+            int vwprintf_s(const wchar_t * restrict format,
+                 va_list arg);
+    Runtime-constraints
+2   format shall not be a null pointer. The %n specifier425) (modified or not by flags, field
+    width, or precision) shall not appear in the wide string pointed to by format. Any
+    argument to vwprintf_s corresponding to a %s specifier shall not be a null pointer.
+3   If there is a runtime-constraint violation, the vwprintf_s function does not attempt to
+    produce further output, and it is unspecified to what extent vwprintf_s produced
+    output before discovering the runtime-constraint violation.
+    Description
+4   The vwprintf_s function is equivalent to the vwprintf function except for the
+    explicit runtime-constraints listed above.
+    Returns
+5   The vwprintf_s function returns the number of wide characters transmitted, or a
+    negative value if an output error, encoding error, or runtime-constraint violation occurred.
+
+
+
+
+    425) It is not a runtime-constraint violation for the wide characters %n to appear in sequence in the wide
+         string pointed at by format when those wide characters are not a interpreted as a %n specifier. For
+         example, if the entire format string was L"%%n".
+
+[<a name="#p632" href="p632">page 632</a>] (<a href="#Contents">Contents</a>)
+
+<a name="K.3.9.1.12" href="#K.3.9.1.12"><b>    K.3.9.1.12 The vwscanf_s function</b></a>
+    Synopsis
+1           #define __STDC_WANT_LIB_EXT1__ 1
+            #include <a href="#7.16">&lt;stdarg.h&gt;</a>
+            #include <a href="#7.28">&lt;wchar.h&gt;</a>
+            int vwscanf_s(const wchar_t * restrict format,
+                 va_list arg);
+    Runtime-constraints
+2   format shall not be a null pointer. Any argument indirected though in order to store
+    converted input shall not be a null pointer.
+3   If there is a runtime-constraint violation, the vwscanf_s function does not attempt to
+    perform further input, and it is unspecified to what extent vwscanf_s performed input
+    before discovering the runtime-constraint violation.
+    Description
+4   The vwscanf_s function is equivalent to wscanf_s, 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_s function does not invoke the
+    va_end macro.426)
+    Returns
+5   The vwscanf_s function returns the value of the macro EOF if an input failure occurs
+    before any conversion or if there is a runtime-constraint violation. Otherwise, the
+    vwscanf_s 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="K.3.9.1.13" href="#K.3.9.1.13"><b>    K.3.9.1.13 The wprintf_s function</b></a>
+    Synopsis
+1           #define __STDC_WANT_LIB_EXT1__ 1
+            #include <a href="#7.28">&lt;wchar.h&gt;</a>
+            int wprintf_s(const wchar_t * restrict format, ...);
+    Runtime-constraints
+2   format shall not be a null pointer. The %n specifier427) (modified or not by flags, field
+
+    426) As the functions vfwscanf_s, vwscanf_s, and vswscanf_s invoke the va_arg macro, the
+         value of arg after the return is indeterminate.
+    427) It is not a runtime-constraint violation for the wide characters %n to appear in sequence in the wide
+         string pointed at by format when those wide characters are not a interpreted as a %n specifier. For
+         example, if the entire format string was L"%%n".
+
+[<a name="#p633" href="p633">page 633</a>] (<a href="#Contents">Contents</a>)
+
+    width, or precision) shall not appear in the wide string pointed to by format. Any
+    argument to wprintf_s corresponding to a %s specifier shall not be a null pointer.
+3   If there is a runtime-constraint violation, the wprintf_s function does not attempt to
+    produce further output, and it is unspecified to what extent wprintf_s produced output
+    before discovering the runtime-constraint violation.
+    Description
+4   The wprintf_s function is equivalent to the wprintf function except for the explicit
+    runtime-constraints listed above.
+    Returns
+5   The wprintf_s function returns the number of wide characters transmitted, or a
+    negative value if an output error, encoding error, or runtime-constraint violation occurred.
+<a name="K.3.9.1.14" href="#K.3.9.1.14"><b>    K.3.9.1.14 The wscanf_s function</b></a>
+    Synopsis
+1          #define __STDC_WANT_LIB_EXT1__ 1
+           #include <a href="#7.28">&lt;wchar.h&gt;</a>
+           int wscanf_s(const wchar_t * restrict format, ...);
+    Runtime-constraints
+2   format shall not be a null pointer. Any argument indirected though in order to store
+    converted input shall not be a null pointer.
+3   If there is a runtime-constraint violation, the wscanf_s function does not attempt to
+    perform further input, and it is unspecified to what extent wscanf_s performed input
+    before discovering the runtime-constraint violation.
+    Description
+4   The wscanf_s function is equivalent to fwscanf_s with the argument stdin
+    interposed before the arguments to wscanf_s.
+    Returns
+5   The wscanf_s function returns the value of the macro EOF if an input failure occurs
+    before any conversion or if there is a runtime-constraint violation. Otherwise, the
+    wscanf_s 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="#p634" href="p634">page 634</a>] (<a href="#Contents">Contents</a>)
+
+<a name="K.3.9.2" href="#K.3.9.2"><b>    K.3.9.2 General wide string utilities</b></a>
+<a name="K.3.9.2.1" href="#K.3.9.2.1"><b>    K.3.9.2.1 Wide string copying functions</b></a>
+<a name="K.3.9.2.1.1" href="#K.3.9.2.1.1"><b>    K.3.9.2.1.1 The wcscpy_s function</b></a>
+    Synopsis
+1           #define __STDC_WANT_LIB_EXT1__ 1
+            #include <a href="#7.28">&lt;wchar.h&gt;</a>
+            errno_t wcscpy_s(wchar_t * restrict s1,
+                 rsize_t s1max,
+                 const wchar_t * restrict s2);
+    Runtime-constraints
+2   Neither s1 nor s2 shall be a null pointer. s1max shall not be greater than RSIZE_MAX.
+    s1max shall not equal zero. s1max shall be greater than wcsnlen_s(s2, s1max).
+    Copying shall not take place between objects that overlap.
+3   If there is a runtime-constraint violation, then if s1 is not a null pointer and s1max is
+    greater than zero and not greater than RSIZE_MAX, then wcscpy_s sets s1[0] to the
+    null wide character.
+    Description
+4   The wcscpy_s function copies the wide string pointed to by s2 (including the
+    terminating null wide character) into the array pointed to by s1.
+5   All elements following the terminating null wide character (if any) written by
+    wcscpy_s in the array of s1max wide characters pointed to by s1 take unspecified
+    values when wcscpy_s returns.428)
+    Returns
+6   The wcscpy_s function returns zero429) if there was no runtime-constraint violation.
+    Otherwise, a nonzero value is returned.
+
+
+
+
+    428) This allows an implementation to copy wide characters from s2 to s1 while simultaneously checking
+         if any of those wide characters are null. Such an approach might write a wide character to every
+         element of s1 before discovering that the first element should be set to the null wide character.
+    429) A zero return value implies that all of the requested wide characters from the string pointed to by s2
+         fit within the array pointed to by s1 and that the result in s1 is null terminated.
+
+[<a name="#p635" href="p635">page 635</a>] (<a href="#Contents">Contents</a>)
+
+<a name="K.3.9.2.1.2" href="#K.3.9.2.1.2"><b>     K.3.9.2.1.2 The wcsncpy_s function</b></a>
+     Synopsis
+7            #define __STDC_WANT_LIB_EXT1__ 1
+             #include <a href="#7.28">&lt;wchar.h&gt;</a>
+             errno_t wcsncpy_s(wchar_t * restrict s1,
+                  rsize_t s1max,
+                  const wchar_t * restrict s2,
+                  rsize_t n);
+     Runtime-constraints
+8    Neither s1 nor s2 shall be a null pointer. Neither s1max nor n shall be greater than
+     RSIZE_MAX. s1max shall not equal zero. If n is not less than s1max, then s1max
+     shall be greater than wcsnlen_s(s2, s1max). Copying shall not take place between
+     objects that overlap.
+9    If there is a runtime-constraint violation, then if s1 is not a null pointer and s1max is
+     greater than zero and not greater than RSIZE_MAX, then wcsncpy_s sets s1[0] to the
+     null wide character.
+     Description
+10   The wcsncpy_s function copies not more than n successive wide characters (wide
+     characters that follow a null wide character are not copied) from the array pointed to by
+     s2 to the array pointed to by s1. If no null wide character was copied from s2, then
+     s1[n] is set to a null wide character.
+11   All elements following the terminating null wide character (if any) written by
+     wcsncpy_s in the array of s1max wide characters pointed to by s1 take unspecified
+     values when wcsncpy_s returns.430)
+     Returns
+12   The wcsncpy_s function returns zero431) if there was no runtime-constraint violation.
+     Otherwise, a nonzero value is returned.
+13   EXAMPLE 1 The wcsncpy_s function can be used to copy a wide string without the danger that the
+     result will not be null terminated or that wide characters will be written past the end of the destination
+     array.
+
+
+
+
+     430) This allows an implementation to copy wide characters from s2 to s1 while simultaneously checking
+          if any of those wide characters are null. Such an approach might write a wide character to every
+          element of s1 before discovering that the first element should be set to the null wide character.
+     431) A zero return value implies that all of the requested wide characters from the string pointed to by s2
+          fit within the array pointed to by s1 and that the result in s1 is null terminated.
+
+[<a name="#p636" href="p636">page 636</a>] (<a href="#Contents">Contents</a>)
+
+             #define __STDC_WANT_LIB_EXT1__ 1
+             #include <a href="#7.28">&lt;wchar.h&gt;</a>
+             /* ... */
+             wchar_t src1[100] = L"hello";
+             wchar_t src2[7] = {L'g', L'o', L'o', L'd', L'b', L'y', L'e'};
+             wchar_t dst1[6], dst2[5], dst3[5];
+             int r1, r2, r3;
+             r1 = wcsncpy_s(dst1, 6, src1, 100);
+             r2 = wcsncpy_s(dst2, 5, src2, 7);
+             r3 = wcsncpy_s(dst3, 5, src2, 4);
+     The first call will assign to r1 the value zero and to dst1 the sequence of wide characters hello\0.
+     The second call will assign to r2 a nonzero value and to dst2 the sequence of wide characters \0.
+     The third call will assign to r3 the value zero and to dst3 the sequence of wide characters good\0.
+
+<a name="K.3.9.2.1.3" href="#K.3.9.2.1.3"><b>     K.3.9.2.1.3 The wmemcpy_s function</b></a>
+     Synopsis
+14           #define __STDC_WANT_LIB_EXT1__ 1
+             #include <a href="#7.28">&lt;wchar.h&gt;</a>
+             errno_t wmemcpy_s(wchar_t * restrict s1,
+                  rsize_t s1max,
+                  const wchar_t * restrict s2,
+                  rsize_t n);
+     Runtime-constraints
+15   Neither s1 nor s2 shall be a null pointer. Neither s1max nor n shall be greater than
+     RSIZE_MAX. n shall not be greater than s1max. Copying shall not take place between
+     objects that overlap.
+16   If there is a runtime-constraint violation, the wmemcpy_s function stores zeros in the
+     first s1max wide characters of the object pointed to by s1 if s1 is not a null pointer and
+     s1max is not greater than RSIZE_MAX.
+     Description
+17   The wmemcpy_s function copies n successive wide characters from the object pointed
+     to by s2 into the object pointed to by s1.
+     Returns
+18   The wmemcpy_s function returns zero if there was no runtime-constraint violation.
+     Otherwise, a nonzero value is returned.
+
+
+
+
+[<a name="#p637" href="p637">page 637</a>] (<a href="#Contents">Contents</a>)
+
+<a name="K.3.9.2.1.4" href="#K.3.9.2.1.4"><b>     K.3.9.2.1.4 The wmemmove_s function</b></a>
+     Synopsis
+19          #define __STDC_WANT_LIB_EXT1__ 1
+            #include <a href="#7.28">&lt;wchar.h&gt;</a>
+            errno_t wmemmove_s(wchar_t *s1, rsize_t s1max,
+                 const wchar_t *s2, rsize_t n);
+     Runtime-constraints
+20   Neither s1 nor s2 shall be a null pointer. Neither s1max nor n shall be greater than
+     RSIZE_MAX. n shall not be greater than s1max.
+21   If there is a runtime-constraint violation, the wmemmove_s function stores zeros in the
+     first s1max wide characters of the object pointed to by s1 if s1 is not a null pointer and
+     s1max is not greater than RSIZE_MAX.
+     Description
+22   The wmemmove_s function copies n successive wide characters from the object pointed
+     to by s2 into the object pointed to by s1. This 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
+23   The wmemmove_s function returns zero if there was no runtime-constraint violation.
+     Otherwise, a nonzero value is returned.
+<a name="K.3.9.2.2" href="#K.3.9.2.2"><b>     K.3.9.2.2 Wide string concatenation functions</b></a>
+<a name="K.3.9.2.2.1" href="#K.3.9.2.2.1"><b>     K.3.9.2.2.1 The wcscat_s function</b></a>
+     Synopsis
+1           #define __STDC_WANT_LIB_EXT1__ 1
+            #include <a href="#7.28">&lt;wchar.h&gt;</a>
+            errno_t wcscat_s(wchar_t * restrict s1,
+                 rsize_t s1max,
+                 const wchar_t * restrict s2);
+     Runtime-constraints
+2    Let m denote the value s1max - wcsnlen_s(s1, s1max) upon entry to
+     wcscat_s.
+3    Neither s1 nor s2 shall be a null pointer. s1max shall not be greater than RSIZE_MAX.
+     s1max shall not equal zero. m shall not equal zero.432) m shall be greater than
+     wcsnlen_s(s2, m). Copying shall not take place between objects that overlap.
+
+[<a name="#p638" href="p638">page 638</a>] (<a href="#Contents">Contents</a>)
+
+4    If there is a runtime-constraint violation, then if s1 is not a null pointer and s1max is
+     greater than zero and not greater than RSIZE_MAX, then wcscat_s sets s1[0] to the
+     null wide character.
+     Description
+5    The wcscat_s 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 from s2 overwrites the null wide character at the end of s1.
+6    All elements following the terminating null wide character (if any) written by
+     wcscat_s in the array of s1max wide characters pointed to by s1 take unspecified
+     values when wcscat_s returns.433)
+     Returns
+7    The wcscat_s function returns zero434) if there was no runtime-constraint violation.
+     Otherwise, a nonzero value is returned.
+<a name="K.3.9.2.2.2" href="#K.3.9.2.2.2"><b>     K.3.9.2.2.2 The wcsncat_s function</b></a>
+     Synopsis
+8             #define __STDC_WANT_LIB_EXT1__ 1
+              #include <a href="#7.28">&lt;wchar.h&gt;</a>
+              errno_t wcsncat_s(wchar_t * restrict s1,
+                   rsize_t s1max,
+                   const wchar_t * restrict s2,
+                   rsize_t n);
+     Runtime-constraints
+9    Let m denote the value s1max - wcsnlen_s(s1, s1max) upon entry to
+     wcsncat_s.
+10   Neither s1 nor s2 shall be a null pointer. Neither s1max nor n shall be greater than
+     RSIZE_MAX. s1max shall not equal zero. m shall not equal zero.435) If n is not less
+     than m, then m shall be greater than wcsnlen_s(s2, m). Copying shall not take
+     place between objects that overlap.
+
+
+     432) Zero means that s1 was not null terminated upon entry to wcscat_s.
+     433) This allows an implementation to append wide characters from s2 to s1 while simultaneously
+          checking if any of those wide characters are null. Such an approach might write a wide character to
+          every element of s1 before discovering that the first element should be set to the null wide character.
+     434) A zero return value implies that all of the requested wide characters from the wide string pointed to by
+          s2 were appended to the wide string pointed to by s1 and that the result in s1 is null terminated.
+     435) Zero means that s1 was not null terminated upon entry to wcsncat_s.
+
+[<a name="#p639" href="p639">page 639</a>] (<a href="#Contents">Contents</a>)
+
+11   If there is a runtime-constraint violation, then if s1 is not a null pointer and s1max is
+     greater than zero and not greater than RSIZE_MAX, then wcsncat_s sets s1[0] to the
+     null wide character.
+     Description
+12   The wcsncat_s function appends not more than n successive wide characters (wide
+     characters that follow a null wide character are not copied) from the array pointed to by
+     s2 to the end of the wide string pointed to by s1. The initial wide character from s2
+     overwrites the null wide character at the end of s1. If no null wide character was copied
+     from s2, then s1[s1max-m+n] is set to a null wide character.
+13   All elements following the terminating null wide character (if any) written by
+     wcsncat_s in the array of s1max wide characters pointed to by s1 take unspecified
+     values when wcsncat_s returns.436)
+     Returns
+14   The wcsncat_s function returns zero437) if there was no runtime-constraint violation.
+     Otherwise, a nonzero value is returned.
+15   EXAMPLE 1 The wcsncat_s function can be used to copy a wide string without the danger that the
+     result will not be null terminated or that wide characters will be written past the end of the destination
+     array.
+              #define __STDC_WANT_LIB_EXT1__ 1
+              #include <a href="#7.28">&lt;wchar.h&gt;</a>
+              /* ... */
+              wchar_t s1[100] = L"good";
+              wchar_t s2[6] = L"hello";
+              wchar_t s3[6] = L"hello";
+              wchar_t s4[7] = L"abc";
+              wchar_t s5[1000] = L"bye";
+              int r1, r2, r3, r4;
+              r1 = wcsncat_s(s1, 100, s5, 1000);
+              r2 = wcsncat_s(s2, 6, L"", 1);
+              r3 = wcsncat_s(s3, 6, L"X", 2);
+              r4 = wcsncat_s(s4, 7, L"defghijklmn", 3);
+     After the first call r1 will have the value zero and s1 will be the wide character sequence goodbye\0.
+     After the second call r2 will have the value zero and s2 will be the wide character sequence hello\0.
+     After the third call r3 will have a nonzero value and s3 will be the wide character sequence \0.
+     After the fourth call r4 will have the value zero and s4 will be the wide character sequence abcdef\0.
+
+
+
+
+     436) This allows an implementation to append wide characters from s2 to s1 while simultaneously
+          checking if any of those wide characters are null. Such an approach might write a wide character to
+          every element of s1 before discovering that the first element should be set to the null wide character.
+     437) A zero return value implies that all of the requested wide characters from the wide string pointed to by
+          s2 were appended to the wide string pointed to by s1 and that the result in s1 is null terminated.
+
+[<a name="#p640" href="p640">page 640</a>] (<a href="#Contents">Contents</a>)
+
+<a name="K.3.9.2.3" href="#K.3.9.2.3"><b>    K.3.9.2.3 Wide string search functions</b></a>
+<a name="K.3.9.2.3.1" href="#K.3.9.2.3.1"><b>    K.3.9.2.3.1 The wcstok_s function</b></a>
+    Synopsis
+1           #define __STDC_WANT_LIB_EXT1__ 1
+            #include <a href="#7.28">&lt;wchar.h&gt;</a>
+            wchar_t *wcstok_s(wchar_t * restrict s1,
+                 rsize_t * restrict s1max,
+                 const wchar_t * restrict s2,
+                 wchar_t ** restrict ptr);
+    Runtime-constraints
+2   None of s1max, s2, or ptr shall be a null pointer. If s1 is a null pointer, then *ptr
+    shall not be a null pointer. The value of *s1max shall not be greater than RSIZE_MAX.
+    The end of the token found shall occur within the first *s1max wide characters of s1 for
+    the first call, and shall occur within the first *s1max wide characters of where searching
+    resumes on subsequent calls.
+3   If there is a runtime-constraint violation, the wcstok_s function does not indirect
+    through the s1 or s2 pointers, and does not store a value in the object pointed to by ptr.
+    Description
+4   A sequence of calls to the wcstok_s 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 fourth argument points to a caller-provided wchar_t
+    pointer into which the wcstok_s function stores information necessary for it to
+    continue scanning the same wide string.
+5   The first call in a sequence has a non-null first argument and s1max points to an object
+    whose value is the number of elements in the wide character array pointed to by the first
+    argument. The first call stores an initial value in the object pointed to by ptr and
+    updates the value pointed to by s1max to reflect the number of elements that remain in
+    relation to ptr. Subsequent calls in the sequence have a null first argument and the
+    objects pointed to by s1max and ptr are required to have the values stored by the
+    previous call in the sequence, which are then updated. The separator wide string pointed
+    to by s2 may be different from call to call.
+6   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_s function returns a null pointer. If such a wide character is found, it is
+    the start of the first token.
+
+
+[<a name="#p641" href="p641">page 641</a>] (<a href="#Contents">Contents</a>)
+
+7    The wcstok_s function then searches from there for the first wide character in s1 that
+     is contained in the current separator wide string. If no such wide character is found, the
+     current token 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.
+8    In all cases, the wcstok_s 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
+9    The wcstok_s function returns a pointer to the first wide character of a token, or a null
+     pointer if there is no token or there is a runtime-constraint violation.
+10   EXAMPLE
+            #define __STDC_WANT_LIB_EXT1__ 1
+            #include <a href="#7.28">&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;
+            rsize_t max1 = wcslen(str1)+1;
+            rsize_t max2 = wcslen(str2)+1;
+            t   =   wcstok_s(str1,   &amp;max1,   "?", &amp;ptr1);        //   t   points to the token "a"
+            t   =   wcstok_s(NULL,   &amp;max1,   ",", &amp;ptr1);        //   t   points to the token "??b"
+            t   =   wcstok_s(str2,   &amp;max2,   " \t", &amp;ptr2);      //   t   is a null pointer
+            t   =   wcstok_s(NULL,   &amp;max1,   "#,", &amp;ptr1);       //   t   points to the token "c"
+            t   =   wcstok_s(NULL,   &amp;max1,   "?", &amp;ptr1);        //   t   is a null pointer
+
+<a name="K.3.9.2.4" href="#K.3.9.2.4"><b>     K.3.9.2.4 Miscellaneous functions</b></a>
+<a name="K.3.9.2.4.1" href="#K.3.9.2.4.1"><b>     K.3.9.2.4.1 The wcsnlen_s function</b></a>
+     Synopsis
+1           #define __STDC_WANT_LIB_EXT1__ 1
+            #include <a href="#7.28">&lt;wchar.h&gt;</a>
+            size_t wcsnlen_s(const wchar_t *s, size_t maxsize);
+     Description
+2    The wcsnlen_s function computes the length of the wide string pointed to by s.
+     Returns
+3    If s is a null pointer,438) then the wcsnlen_s function returns zero.
+4    Otherwise, the wcsnlen_s function returns the number of wide characters that precede
+     the terminating null wide character. If there is no null wide character in the first
+     maxsize wide characters of s then wcsnlen_s returns maxsize. At most the first
+
+[<a name="#p642" href="p642">page 642</a>] (<a href="#Contents">Contents</a>)
+
+    maxsize wide characters of s shall be accessed by wcsnlen_s.
+<a name="K.3.9.3" href="#K.3.9.3"><b>    K.3.9.3 Extended multibyte/wide character conversion utilities</b></a>
+<a name="K.3.9.3.1" href="#K.3.9.3.1"><b>    K.3.9.3.1 Restartable multibyte/wide character conversion functions</b></a>
+1   Unlike wcrtomb, wcrtomb_s does not permit the ps parameter (the pointer to the
+    conversion state) to be a null pointer.
+<a name="K.3.9.3.1.1" href="#K.3.9.3.1.1"><b>    K.3.9.3.1.1 The wcrtomb_s function</b></a>
+    Synopsis
+2           #include <a href="#7.28">&lt;wchar.h&gt;</a>
+            errno_t wcrtomb_s(size_t * restrict retval,
+                 char * restrict s, rsize_t smax,
+                 wchar_t wc, mbstate_t * restrict ps);
+    Runtime-constraints
+3   Neither retval nor ps shall be a null pointer. If s is not a null pointer, then smax
+    shall not equal zero and shall not be greater than RSIZE_MAX. If s is not a null pointer,
+    then smax shall be not be less than the number of bytes to be stored in the array pointed
+    to by s. If s is a null pointer, then smax shall equal zero.
+4   If there is a runtime-constraint violation, then wcrtomb_s does the following. If s is
+    not a null pointer and smax is greater than zero and not greater than RSIZE_MAX, then
+    wcrtomb_s sets s[0] to the null character. If retval is not a null pointer, then
+    wcrtomb_s sets *retval to (size_t)(-1).
+    Description
+5   If s is a null pointer, the wcrtomb_s function is equivalent to the call
+                    wcrtomb_s(&amp;retval, buf, sizeof buf, L'\0', ps)
+    where retval and buf are internal variables of the appropriate types, and the size of
+    buf is greater than MB_CUR_MAX.
+6   If s is not a null pointer, the wcrtomb_s 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.
+
+    438) Note that the wcsnlen_s function has no runtime-constraints. This lack of runtime-constraints
+         along with the values returned for a null pointer or an unterminated wide string argument make
+         wcsnlen_s useful in algorithms that gracefully handle such exceptional data.
+
+[<a name="#p643" href="p643">page 643</a>] (<a href="#Contents">Contents</a>)
+
+7   If wc does not correspond to a valid multibyte character, an encoding error occurs: the
+    wcrtomb_s function stores the value (size_t)(-1) into *retval and the
+    conversion state is unspecified. Otherwise, the wcrtomb_s function stores into
+    *retval the number of bytes (including any shift sequences) stored in the array pointed
+    to by s.
+    Returns
+8   The wcrtomb_s function returns zero if no runtime-constraint violation and no
+    encoding error occurred. Otherwise, a nonzero value is returned.
+<a name="K.3.9.3.2" href="#K.3.9.3.2"><b>    K.3.9.3.2 Restartable multibyte/wide string conversion functions</b></a>
+1   Unlike mbsrtowcs and wcsrtombs, mbsrtowcs_s and wcsrtombs_s do not
+    permit the ps parameter (the pointer to the conversion state) to be a null pointer.
+<a name="K.3.9.3.2.1" href="#K.3.9.3.2.1"><b>    K.3.9.3.2.1 The mbsrtowcs_s function</b></a>
+    Synopsis
+2          #include <a href="#7.28">&lt;wchar.h&gt;</a>
+           errno_t mbsrtowcs_s(size_t * restrict retval,
+                wchar_t * restrict dst, rsize_t dstmax,
+                const char ** restrict src, rsize_t len,
+                mbstate_t * restrict ps);
+    Runtime-constraints
+3   None of retval, src, *src, or ps shall be null pointers. If dst is not a null pointer,
+    then neither len nor dstmax shall be greater than RSIZE_MAX. If dst is a null
+    pointer, then dstmax shall equal zero. If dst is not a null pointer, then dstmax shall
+    not equal zero. If dst is not a null pointer and len is not less than dstmax, then a null
+    character shall occur within the first dstmax multibyte characters of the array pointed to
+    by *src.
+4   If there is a runtime-constraint violation, then mbsrtowcs_s does the following. If
+    retval is not a null pointer, then mbsrtowcs_s sets *retval to (size_t)(-1).
+    If dst is not a null pointer and dstmax is greater than zero and less than RSIZE_MAX,
+    then mbsrtowcs_s sets dst[0] to the null wide character.
+    Description
+5   The mbsrtowcs_s 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
+[<a name="#p644" href="p644">page 644</a>] (<a href="#Contents">Contents</a>)
+
+     characters have been stored into the array pointed to by dst.439) If dst is not a null
+     pointer and no null wide character was stored into the array pointed to by dst, then
+     dst[len] is set to the null wide character. Each conversion takes place as if by a call
+     to the mbrtowc function.
+6    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.
+7    Regardless of whether dst is or is not a null pointer, if the input conversion encounters a
+     sequence of bytes that do not form a valid multibyte character, an encoding error occurs:
+     the mbsrtowcs_s function stores the value (size_t)(-1) into *retval and the
+     conversion state is unspecified. Otherwise, the mbsrtowcs_s function stores into
+     *retval the number of multibyte characters successfully converted, not including the
+     terminating null character (if any).
+8    All elements following the terminating null wide character (if any) written by
+     mbsrtowcs_s in the array of dstmax wide characters pointed to by dst take
+     unspecified values when mbsrtowcs_s returns.440)
+9    If copying takes place between objects that overlap, the objects take on unspecified
+     values.
+     Returns
+10   The mbsrtowcs_s function returns zero if no runtime-constraint violation and no
+     encoding error occurred. Otherwise, a nonzero value is returned.
+<a name="K.3.9.3.2.2" href="#K.3.9.3.2.2"><b>     K.3.9.3.2.2 The wcsrtombs_s function</b></a>
+     Synopsis
+11            #include <a href="#7.28">&lt;wchar.h&gt;</a>
+              errno_t wcsrtombs_s(size_t * restrict retval,
+                   char * restrict dst, rsize_t dstmax,
+                   const wchar_t ** restrict src, rsize_t len,
+                   mbstate_t * restrict ps);
+
+
+
+
+     439) Thus, the value of len is ignored if dst is a null pointer.
+     440) This allows an implementation to attempt converting the multibyte string before discovering a
+          terminating null character did not occur where required.
+
+[<a name="#p645" href="p645">page 645</a>] (<a href="#Contents">Contents</a>)
+
+     Runtime-constraints
+12   None of retval, src, *src, or ps shall be null pointers. If dst is not a null pointer,
+     then neither len nor dstmax shall be greater than RSIZE_MAX. If dst is a null
+     pointer, then dstmax shall equal zero. If dst is not a null pointer, then dstmax shall
+     not equal zero. If dst is not a null pointer and len is not less than dstmax, then the
+     conversion shall have been stopped (see below) because a terminating null wide character
+     was reached or because an encoding error occurred.
+13   If there is a runtime-constraint violation, then wcsrtombs_s does the following. If
+     retval is not a null pointer, then wcsrtombs_s sets *retval to (size_t)(-1).
+     If dst is not a null pointer and dstmax is greater than zero and less than RSIZE_MAX,
+     then wcsrtombs_s sets dst[0] to the null character.
+     Description
+14   The wcsrtombs_s 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;
+     -- (if dst is not a null pointer) when the next multibyte character would exceed the
+         limit of n total bytes to be stored into the array pointed to by dst. If the wide
+         character being converted is the null wide character, then n is the lesser of len or
+         dstmax. Otherwise, n is the lesser of len or dstmax-1.
+     If the conversion stops without converting a null wide character and dst is not a null
+     pointer, then a null character is stored into the array pointed to by dst immediately
+     following any multibyte characters already stored. Each conversion takes place as if by a
+     call to the wcrtomb function.441)
+15   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.
+
+
+     441) 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. However, if
+          the conversion stops before a terminating null wide character has been reached, the result will be null
+          terminated, but might not end in the initial shift state.
+
+[<a name="#p646" href="p646">page 646</a>] (<a href="#Contents">Contents</a>)
+
+16   Regardless of whether dst is or is not a null pointer, if the input conversion encounters a
+     wide character that does not correspond to a valid multibyte character, an encoding error
+     occurs: the wcsrtombs_s function stores the value (size_t)(-1) into *retval
+     and the conversion state is unspecified. Otherwise, the wcsrtombs_s function stores
+     into *retval the number of bytes in the resulting multibyte character sequence, not
+     including the terminating null character (if any).
+17   All elements following the terminating null character (if any) written by wcsrtombs_s
+     in the array of dstmax elements pointed to by dst take unspecified values when
+     wcsrtombs_s returns.442)
+18   If copying takes place between objects that overlap, the objects take on unspecified
+     values.
+     Returns
+19   The wcsrtombs_s function returns zero if no runtime-constraint violation and no
+     encoding error occurred. Otherwise, a nonzero value is returned.
+
+
+
+
+     442) When len is not less than dstmax, the implementation might fill the array before discovering a
+          runtime-constraint violation.
+
+[<a name="#p647" href="p647">page 647</a>] (<a href="#Contents">Contents</a>)
+
+<a name="L" href="#L"><b>                                                Annex L</b></a>
+                                               (normative)
+                                            Analyzability
+<a name="L.1" href="#L.1"><b>    L.1 Scope</b></a>
+1   This annex specifies optional behavior that can aid in the analyzability of C programs.
+2   An implementation that defines __STDC_ANALYZABLE__ shall conform to the
+    specifications in this annex.443)
+<a name="L.2" href="#L.2"><b>    L.2 Definitions</b></a>
+<a name="L.2.1" href="#L.2.1"><b>    L.2.1</b></a>
+1   out-of-bounds store
+    an (attempted) access (<a href="#3.1">3.1</a>) that, at run time, for a given computational state, would
+    modify (or, for an object declared volatile, fetch) one or more bytes that lie outside
+    the bounds permitted by this Standard.
+<a name="L.2.2" href="#L.2.2"><b>    L.2.2</b></a>
+1   bounded undefined behavior
+    undefined behavior (<a href="#3.4.3">3.4.3</a>) that does not perform an out-of-bounds store.
+2   NOTE 1    The behavior might perform a trap.
+
+3   NOTE 2    Any values produced or stored might be indeterminate values.
+
+<a name="L.2.3" href="#L.2.3"><b>    L.2.3</b></a>
+1   critical undefined behavior
+    undefined behavior that is not bounded undefined behavior.
+2   NOTE     The behavior might perform an out-of-bounds store or perform a trap.
+
+
+
+
+    443) Implementations that do not define __STDC_ANALYZABLE__ are not required to conform to these
+         specifications.
+
+[<a name="#p648" href="p648">page 648</a>] (<a href="#Contents">Contents</a>)
+
+<a name="L.3" href="#L.3"><b>    L.3 Requirements</b></a>
+1   If the program performs a trap (<a href="#3.19.5">3.19.5</a>), the implementation is permitted to invoke a
+    runtime-constraint handler. Any such semantics are implementation-defined.
+2   All undefined behavior shall be limited to bounded undefined behavior, except for the
+    following which are permitted to result in critical undefined behavior:
+    -- An object is referred to outside of its lifetime (<a href="#6.2.4">6.2.4</a>).
+    -- An lvalue does not designate an object when evaluated (<a href="#6.3.2.1">6.3.2.1</a>).
+    -- A pointer is used to call a function whose type is not compatible with the referenced
+      type (<a href="#6.3.2.3">6.3.2.3</a>).
+    -- The operand of the unary * operator has an invalid value (<a href="#6.5.3.2">6.5.3.2</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>).
+    -- 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 value of a pointer that refers to space deallocated by a call to the free or realloc
+      function is used (<a href="#7.22.3">7.22.3</a>).
+    -- A string or wide string utility function is instructed to access an array beyond the end
+      of an object (<a href="#7.23.1">7.23.1</a>, <a href="#7.28.4">7.28.4</a>).
+
+
+
+
+[<a name="#p649" href="p649">page 649</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 9899:1999, Programming languages -- C.
+ 17.   ISO/IEC 9899:1999/Cor.1:2001, Technical Corrigendum 1.
+ 18.   ISO/IEC 9899:1999/Cor.2:2004, Technical Corrigendum 2.
+ 19.   ISO/IEC 9899:1999/Cor.3:2007, Technical Corrigendum 3.
+
+
+
+[<a name="#p650" href="p650">page 650</a>] (<a href="#Contents">Contents</a>)
+
+ 20.    ISO/IEC 9945-2:1993, Information technology -- Portable Operating System
+        Interface (POSIX) -- Part 2: Shell and Utilities.
+ 21.    ISO/IEC TR 10176:1998, Information technology -- Guidelines for the
+        preparation of programming language standards.
+ 22.    ISO/IEC 10646-1:1993, Information technology -- Universal Multiple-Octet
+        Coded Character Set (UCS) -- Part 1: Architecture and Basic Multilingual Plane.
+ 23.    ISO/IEC 10646-1/COR1:1996,         Technical       Corrigendum       1      to
+        ISO/IEC 10646-1:1993.
+ 24.    ISO/IEC 10646-1/COR2:1998,         Technical       Corrigendum       2      to
+        ISO/IEC 10646-1:1993.
+ 25.    ISO/IEC 10646-1/AMD1:1996, Amendment 1 to ISO/IEC 10646-1:1993
+        Transformation Format for 16 planes of group 00 (UTF-16).
+ 26.    ISO/IEC 10646-1/AMD2:1996, Amendment 2 to ISO/IEC 10646-1:1993 UCS
+        Transformation Format 8 (UTF-8).
+ 27.    ISO/IEC 10646-1/AMD3:1996, Amendment 3 to ISO/IEC 10646-1:1993.
+ 28.    ISO/IEC 10646-1/AMD4:1996, Amendment 4 to ISO/IEC 10646-1:1993.
+ 29.    ISO/IEC 10646-1/AMD5:1998, Amendment 5 to ISO/IEC 10646-1:1993 Hangul
+        syllables.
+ 30.    ISO/IEC 10646-1/AMD6:1997,       Amendment     6   to   ISO/IEC 10646-1:1993
+        Tibetan.
+ 31.    ISO/IEC 10646-1/AMD7:1997, Amendment 7 to ISO/IEC 10646-1:1993 33
+        additional characters.
+ 32.    ISO/IEC 10646-1/AMD8:1997, Amendment 8 to ISO/IEC 10646-1:1993.
+ 33.    ISO/IEC 10646-1/AMD9:1997,       Amendment     9   to   ISO/IEC 10646-1:1993
+        Identifiers for characters.
+ 34.    ISO/IEC 10646-1/AMD10:1998, Amendment 10 to ISO/IEC 10646-1:1993
+        Ethiopic.
+ 35.    ISO/IEC 10646-1/AMD11:1998, Amendment 11 to ISO/IEC 10646-1:1993
+        Unified Canadian Aboriginal Syllabics.
+ 36.    ISO/IEC 10646-1/AMD12:1998, Amendment 12 to ISO/IEC 10646-1:1993
+        Cherokee.
+ 37.    ISO/IEC 10967-1:1994, Information technology -- Language independent
+        arithmetic -- Part 1: Integer and floating point arithmetic.
+
+
+[<a name="#p651" href="p651">page 651</a>] (<a href="#Contents">Contents</a>)
+
+ 38.   ISO/IEC TR 19769:2004, Information technology -- Programming languages,
+       their environments and system software interfaces -- Extensions for the
+       programming language C to support new character data types.
+ 39.   ISO/IEC TR 24731-1:2007, Information technology -- Programming languages,
+       their environments and system software interfaces -- Extensions to the C library
+       -- Part 1: Bounds-checking interfaces.
+
+
+
+
+[<a name="#p652" href="p652">page 652</a>] (<a href="#Contents">Contents</a>)
+
+
+<a name="Index" href="#Index"><b>Index</b></a>
+[^ x ^], <a href="#3.20">3.20</a>                                                    , (comma operator), <a href="#5.1.2.4">5.1.2.4</a>, <a href="#6.5.17">6.5.17</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>,
+[_ x _], <a href="#3.21">3.21</a>                                                         <a href="#6.7.2.3">6.7.2.3</a>, <a href="#6.7.9">6.7.9</a>
+! (logical negation operator), <a href="#6.5.3.3">6.5.3.3</a>                         - (subtraction operator), <a href="#6.2.6.2">6.2.6.2</a>, <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>
+!= (inequality operator), <a href="#6.5.9">6.5.9</a>                                - (unary minus operator), <a href="#6.5.3.3">6.5.3.3</a>, <a href="#F.3">F.3</a>
+# operator, <a href="#6.10.3.2">6.10.3.2</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>
+# preprocessing directive, <a href="#6.10.7">6.10.7</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>
+# punctuator, <a href="#6.10">6.10</a>                                             -= (subtraction assignment operator), <a href="#6.5.16.2">6.5.16.2</a>
+## operator, <a href="#6.10.3.3">6.10.3.3</a>                                          -&gt; (structure/union pointer operator), <a href="#6.5.2.3">6.5.2.3</a>
+#define preprocessing directive, <a href="#6.10.3">6.10.3</a>                        . (structure/union member operator), <a href="#6.3.2.1">6.3.2.1</a>,
+#elif preprocessing directive, <a href="#6.10.1">6.10.1</a>                               <a href="#6.5.2.3">6.5.2.3</a>
+#else preprocessing directive, <a href="#6.10.1">6.10.1</a>                          . punctuator, <a href="#6.7.9">6.7.9</a>
+#endif 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.6.3">6.7.6.3</a>, <a href="#6.10.3">6.10.3</a>
+#error preprocessing directive, <a href="#4">4</a>, <a href="#6.10.5">6.10.5</a>                      / (division operator), <a href="#6.2.6.2">6.2.6.2</a>, <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>
+#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 delimiters), <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>                                             // (comment delimiter), <a href="#6.4.9">6.4.9</a>
+#ifdef preprocessing directive, <a href="#6.10.1">6.10.1</a>                         /= (division assignment operator), <a href="#6.5.16.2">6.5.16.2</a>
+#ifndef preprocessing directive, <a href="#6.10.1">6.10.1</a>                        : (colon punctuator), <a href="#6.7.2.1">6.7.2.1</a>
+#include preprocessing directive, <a href="#5.1.1.2">5.1.1.2</a>,                     :&gt; (alternative spelling of ]), <a href="#6.4.6">6.4.6</a>
+     <a href="#6.10.2">6.10.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>,
+#line preprocessing directive, <a href="#6.10.4">6.10.4</a>                               <a href="#6.8.5">6.8.5</a>, <a href="#6.8.6">6.8.6</a>
+#pragma preprocessing directive, <a href="#6.10.6">6.10.6</a>                        &lt; (less-than operator), <a href="#6.5.8">6.5.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>,               &lt;% (alternative spelling of {), <a href="#6.4.6">6.4.6</a>
+     <a href="#7.1.4">7.1.4</a>                                                     &lt;: (alternative spelling of [), <a href="#6.4.6">6.4.6</a>
+% (remainder operator), <a href="#6.2.6.2">6.2.6.2</a>, <a href="#6.5.5">6.5.5</a>                         &lt;&lt; (left-shift operator), <a href="#6.2.6.2">6.2.6.2</a>, <a href="#6.5.7">6.5.7</a>
+%: (alternative spelling of #), <a href="#6.4.6">6.4.6</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>
+%= (remainder assignment operator), <a href="#6.5.16.2">6.5.16.2</a>                   <a href="#7.2">&lt;assert.h&gt;</a> header, <a href="#7.2">7.2</a>
+%&gt; (alternative spelling of }), <a href="#6.4.6">6.4.6</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="#6.10.8.3">6.10.8.3</a>, <a href="#7.1.2">7.1.2</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.3">7.3</a>, <a href="#7.24">7.24</a>, <a href="#7.30.1">7.30.1</a>, <a href="#G.6">G.6</a>, <a href="#J.5.17">J.5.17</a>
+&amp; (bitwise AND operator), <a href="#6.2.6.2">6.2.6.2</a>, <a href="#6.5.10">6.5.10</a>                      <a href="#7.4">&lt;ctype.h&gt;</a> header, <a href="#7.4">7.4</a>, <a href="#7.30.2">7.30.2</a>
+&amp;&amp; (logical AND operator), <a href="#5.1.2.4">5.1.2.4</a>, <a href="#6.5.13">6.5.13</a>                     <a href="#7.5">&lt;errno.h&gt;</a> header, <a href="#7.5">7.5</a>, <a href="#7.30.3">7.30.3</a>, <a href="#K.3.2">K.3.2</a>
+&amp;= (bitwise AND assignment operator), <a href="#6.5.16.2">6.5.16.2</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>,
+' ' (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="#H">H</a>
+     <a href="#7.4.1.10">7.4.1.10</a>, <a href="#7.29.2.1.3">7.29.2.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.22.1.3">7.22.1.3</a>,
+( ) (cast operator), <a href="#6.5.4">6.5.4</a>                                          <a href="#7.28.4.1.1">7.28.4.1.1</a>
+( ) (function-call operator), <a href="#6.5.2.2">6.5.2.2</a>                          <a href="#7.8">&lt;inttypes.h&gt;</a> header, <a href="#7.8">7.8</a>, <a href="#7.30.4">7.30.4</a>
+( ) (parentheses punctuator), <a href="#6.7.6.3">6.7.6.3</a>, <a href="#6.8.4">6.8.4</a>, <a href="#6.8.5">6.8.5</a>            <a href="#7.9">&lt;iso646.h&gt;</a> header, <a href="#4">4</a>, <a href="#7.9">7.9</a>
+( ){ } (compound-literal operator), <a href="#6.5.2.5">6.5.2.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>
+* (asterisk punctuator), <a href="#6.7.6.1">6.7.6.1</a>, <a href="#6.7.6.2">6.7.6.2</a>                      <a href="#7.11">&lt;locale.h&gt;</a> header, <a href="#7.11">7.11</a>, <a href="#7.30.5">7.30.5</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="#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.24">7.24</a>, <a href="#F">F</a>,
+* (multiplication operator), <a href="#6.2.6.2">6.2.6.2</a>, <a href="#6.5.5">6.5.5</a>, <a href="#F.3">F.3</a>,                   <a href="#F.10">F.10</a>, <a href="#J.5.17">J.5.17</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.30.6">7.30.6</a>
++ (addition operator), <a href="#6.2.6.2">6.2.6.2</a>, <a href="#6.5.2.1">6.5.2.1</a>, <a href="#6.5.3.2">6.5.3.2</a>,              <a href="#7.15">&lt;stdalign.h&gt;</a> header, <a href="#4">4</a>, <a href="#7.15">7.15</a>
+     <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>                                         <a href="#7.16">&lt;stdarg.h&gt;</a> header, <a href="#4">4</a>, <a href="#6.7.6.3">6.7.6.3</a>, <a href="#7.16">7.16</a>
++ (unary plus operator), <a href="#6.5.3.3">6.5.3.3</a>                               <a href="#7.17">&lt;stdatomic.h&gt;</a> header, <a href="#6.10.8.3">6.10.8.3</a>, <a href="#7.1.2">7.1.2</a>, <a href="#7.17">7.17</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="#7.18">&lt;stdbool.h&gt;</a> header, <a href="#4">4</a>, <a href="#7.18">7.18</a>, <a href="#7.30.7">7.30.7</a>, <a href="#H">H</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.19">&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>,
++= (addition assignment operator), <a href="#6.5.16.2">6.5.16.2</a>
+[<a name="#p653" href="p653">page 653</a>] (<a href="#Contents">Contents</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.19">7.19</a>, <a href="#K.3.3">K.3.3</a>                      \x hexadecimal digits (hexadecimal-character
+<a href="#7.20">&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>,                       escape sequence), <a href="#6.4.4.4">6.4.4.4</a>
+     <a href="#7.20">7.20</a>, <a href="#7.30.8">7.30.8</a>, <a href="#K.3.3">K.3.3</a>, <a href="#K.3.4">K.3.4</a>                              ^ (bitwise exclusive OR operator), <a href="#6.2.6.2">6.2.6.2</a>, <a href="#6.5.11">6.5.11</a>
+<a href="#7.21">&lt;stdio.h&gt;</a> header, <a href="#5.2.4.2.2">5.2.4.2.2</a>, <a href="#7.21">7.21</a>, <a href="#7.30.9">7.30.9</a>, <a href="#F">F</a>,                ^= (bitwise exclusive OR assignment operator),
+     <a href="#K.3.5">K.3.5</a>                                                        <a href="#6.5.16.2">6.5.16.2</a>
+<a href="#7.22">&lt;stdlib.h&gt;</a> header, <a href="#5.2.4.2.2">5.2.4.2.2</a>, <a href="#7.22">7.22</a>, <a href="#7.30.10">7.30.10</a>, <a href="#F">F</a>,              __alignas_is_defined macro, <a href="#7.15">7.15</a>
+     <a href="#K.3.1.4">K.3.1.4</a>, <a href="#K.3.6">K.3.6</a>                                          __bool_true_false_are_defined
+<a href="#7.23">&lt;string.h&gt;</a> header, <a href="#7.23">7.23</a>, <a href="#7.30.11">7.30.11</a>, <a href="#K.3.7">K.3.7</a>                           macro, <a href="#7.18">7.18</a>
+<a href="#7.24">&lt;tgmath.h&gt;</a> header, <a href="#7.24">7.24</a>, <a href="#G.7">G.7</a>                                 __cplusplus macro, <a href="#6.10.8">6.10.8</a>
+<a href="#7.25">&lt;threads.h&gt;</a> header, <a href="#6.10.8.3">6.10.8.3</a>, <a href="#7.1.2">7.1.2</a>, <a href="#7.25">7.25</a>                    __DATE__ macro, <a href="#6.10.8.1">6.10.8.1</a>
+<a href="#7.26">&lt;time.h&gt;</a> header, <a href="#7.26">7.26</a>, <a href="#K.3.8">K.3.8</a>                                 __FILE__ macro, <a href="#6.10.8.1">6.10.8.1</a>, <a href="#7.2.1.1">7.2.1.1</a>
+<a href="#7.27">&lt;uchar.h&gt;</a> header, <a href="#6.4.4.4">6.4.4.4</a>, <a href="#6.4.5">6.4.5</a>, <a href="#7.27">7.27</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.28">&lt;wchar.h&gt;</a> header, <a href="#5.2.4.2.2">5.2.4.2.2</a>, <a href="#7.21.1">7.21.1</a>, <a href="#7.28">7.28</a>,                   __LINE__ macro, <a href="#6.10.8.1">6.10.8.1</a>, <a href="#7.2.1.1">7.2.1.1</a>
+     <a href="#7.30.12">7.30.12</a>, <a href="#F">F</a>, <a href="#K.3.9">K.3.9</a>                                       __STDC_, <a href="#6.11.9">6.11.9</a>
+<a href="#7.29">&lt;wctype.h&gt;</a> header, <a href="#7.29">7.29</a>, <a href="#7.30.13">7.30.13</a>                             __STDC__ macro, <a href="#6.10.8.1">6.10.8.1</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.9">6.7.9</a>               __STDC_ANALYZABLE__ macro, <a href="#6.10.8.3">6.10.8.3</a>, <a href="#L.1">L.1</a>
+= (simple assignment operator), <a href="#6.5.16.1">6.5.16.1</a>                     __STDC_HOSTED__ macro, <a href="#6.10.8.1">6.10.8.1</a>
+== (equality operator), <a href="#6.5.9">6.5.9</a>                                __STDC_IEC_559__ macro, <a href="#6.10.8.3">6.10.8.3</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.3">6.10.8.3</a>, <a href="#G.1">G.1</a>
+&gt;&gt; (right-shift operator), <a href="#6.2.6.2">6.2.6.2</a>, <a href="#6.5.7">6.5.7</a>                    __STDC_ISO_10646__ macro, <a href="#6.10.8.2">6.10.8.2</a>
+&gt;&gt;= (right-shift assignment operator), <a href="#6.5.16.2">6.5.16.2</a>              __STDC_LIB_EXT1__ macro, <a href="#6.10.8.3">6.10.8.3</a>, <a href="#K.2">K.2</a>
+? : (conditional operator), <a href="#5.1.2.4">5.1.2.4</a>, <a href="#6.5.15">6.5.15</a>                  __STDC_MB_MIGHT_NEQ_WC__ macro,
+?? (trigraph sequences), <a href="#5.2.1.1">5.2.1.1</a>                                  <a href="#6.10.8.2">6.10.8.2</a>, <a href="#7.19">7.19</a>
+[ ] (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>             __STDC_NO_COMPLEX__ macro, <a href="#6.10.8.3">6.10.8.3</a>,
+[ ] (brackets punctuator), <a href="#6.7.6.2">6.7.6.2</a>, <a href="#6.7.9">6.7.9</a>                         <a href="#7.3.1">7.3.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>             __STDC_NO_THREADS__ macro, <a href="#6.10.8.3">6.10.8.3</a>,
+\ (escape character), <a href="#6.4.4.4">6.4.4.4</a>                                     <a href="#7.17.1">7.17.1</a>, <a href="#7.25.1">7.25.1</a>
+\" (double-quote escape sequence), <a href="#6.4.4.4">6.4.4.4</a>,                  __STDC_NO_VLA__ macro, <a href="#6.10.8.3">6.10.8.3</a>
+     <a href="#6.4.5">6.4.5</a>, <a href="#6.10.9">6.10.9</a>                                           __STDC_UTF_16__ macro, <a href="#6.10.8.2">6.10.8.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>              __STDC_UTF_32__ macro, <a href="#6.10.8.2">6.10.8.2</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>            __STDC_VERSION__ macro, <a href="#6.10.8.1">6.10.8.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>                   __STDC_WANT_LIB_EXT1__ macro, <a href="#K.3.1.1">K.3.1.1</a>
+  padding of binary stream, <a href="#7.21.2">7.21.2</a>                           __TIME__ macro, <a href="#6.10.8.1">6.10.8.1</a>
+\? (question-mark escape sequence), <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>
+\a (alert escape sequence), <a href="#5.2.2">5.2.2</a>, <a href="#6.4.4.4">6.4.4.4</a>                   _Alignas, <a href="#6.7.5">6.7.5</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>               _Atomic type qualifier, <a href="#6.7.3">6.7.3</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>,              _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="#7.17.1">7.17.1</a>,
+     <a href="#7.4.1.10">7.4.1.10</a>                                                     <a href="#F.4">F.4</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>,               _Bool type conversions, <a href="#6.3.1.2">6.3.1.2</a>
+     <a href="#7.4.1.10">7.4.1.10</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>
+\octal digits (octal-character escape sequence),             _Complex_I macro, <a href="#7.3.1">7.3.1</a>
+     <a href="#6.4.4.4">6.4.4.4</a>                                                 _Exit function, <a href="#7.22.4.5">7.22.4.5</a>, <a href="#7.22.4.7">7.22.4.7</a>
+\r (carriage-return escape sequence), <a href="#5.2.2">5.2.2</a>,                 _Imaginary keyword, <a href="#G.2">G.2</a>
+     <a href="#6.4.4.4">6.4.4.4</a>, <a href="#7.4.1.10">7.4.1.10</a>                                       _Imaginary types, <a href="#7.3.1">7.3.1</a>, <a href="#G">G</a>
+\t (horizontal-tab escape sequence), <a href="#5.2.2">5.2.2</a>,                  _Imaginary_I macro, <a href="#7.3.1">7.3.1</a>, <a href="#G.6">G.6</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.29.2.1.3">7.29.2.1.3</a>                  _IOFBF macro, <a href="#7.21.1">7.21.1</a>, <a href="#7.21.5.5">7.21.5.5</a>, <a href="#7.21.5.6">7.21.5.6</a>
+\U (universal character names), <a href="#6.4.3">6.4.3</a>                        _IOLBF macro, <a href="#7.21.1">7.21.1</a>, <a href="#7.21.5.6">7.21.5.6</a>
+\u (universal character names), <a href="#6.4.3">6.4.3</a>                        _IONBF macro, <a href="#7.21.1">7.21.1</a>, <a href="#7.21.5.5">7.21.5.5</a>, <a href="#7.21.5.6">7.21.5.6</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>,           _Noreturn, <a href="#6.7.4">6.7.4</a>
+     <a href="#7.4.1.10">7.4.1.10</a>                                                _Pragma operator, <a href="#5.1.1.2">5.1.1.2</a>, <a href="#6.10.9">6.10.9</a>
+
+[<a name="#p654" href="p654">page 654</a>] (<a href="#Contents">Contents</a>)
+
+_Static_assert, <a href="#6.7.10">6.7.10</a>, <a href="#7.2">7.2</a>                                  allocated storage, order and contiguity, <a href="#7.22.3">7.22.3</a>
+_Thread_local storage-class specifier, <a href="#6.2.4">6.2.4</a>,                 and macro, <a href="#7.9">7.9</a>
+     <a href="#6.7.1">6.7.1</a>                                                   AND operators
+{ } (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.9">6.7.9</a>,               bitwise (&amp;), <a href="#6.2.6.2">6.2.6.2</a>, <a href="#6.5.10">6.5.10</a>
+     <a href="#6.8.2">6.8.2</a>                                                      bitwise assignment (&amp;=), <a href="#6.5.16.2">6.5.16.2</a>
+{ } (compound-literal operator), <a href="#6.5.2.5">6.5.2.5</a>                        logical (&amp;&amp;), <a href="#5.1.2.4">5.1.2.4</a>, <a href="#6.5.13">6.5.13</a>
+| (bitwise inclusive OR operator), <a href="#6.2.6.2">6.2.6.2</a>, <a href="#6.5.12">6.5.12</a>           and_eq macro, <a href="#7.9">7.9</a>
+|= (bitwise inclusive OR assignment operator),               anonymous structure, <a href="#6.7.2.1">6.7.2.1</a>
+     <a href="#6.5.16.2">6.5.16.2</a>                                                anonymous union, <a href="#6.7.2.1">6.7.2.1</a>
+|| (logical OR operator), <a href="#5.1.2.4">5.1.2.4</a>, <a href="#6.5.14">6.5.14</a>                    ANSI/IEEE 754, <a href="#F.1">F.1</a>
+~ (bitwise complement operator), <a href="#6.2.6.2">6.2.6.2</a>, <a href="#6.5.3.3">6.5.3.3</a>            ANSI/IEEE 854, <a href="#F.1">F.1</a>
+                                                             argc (main function parameter), <a href="#5.1.2.2.1">5.1.2.2.1</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.21.3">7.21.3</a>,                   argument, <a href="#3.3">3.3</a>
+      <a href="#7.22.4.1">7.22.4.1</a>, <a href="#7.25.3.6">7.25.3.6</a>, <a href="#K.3.6.1.2">K.3.6.1.2</a>                             array, <a href="#6.9.1">6.9.1</a>
+abort_handler_s function, <a href="#K.3.6.1.2">K.3.6.1.2</a>                             default promotions, <a href="#6.5.2.2">6.5.2.2</a>
+abs function, <a href="#7.22.6.1">7.22.6.1</a>                                          function, <a href="#6.5.2.2">6.5.2.2</a>, <a href="#6.9.1">6.9.1</a>
+absolute-value functions                                        macro, substitution, <a href="#6.10.3.1">6.10.3.1</a>
+   complex, <a href="#7.3.8">7.3.8</a>, <a href="#G.6.4">G.6.4</a>                                     argument, complex, <a href="#7.3.9.1">7.3.9.1</a>
+   integer, <a href="#7.8.2.1">7.8.2.1</a>, <a href="#7.22.6.1">7.22.6.1</a>                                argv (main function parameter), <a href="#5.1.2.2.1">5.1.2.2.1</a>
+   real, <a href="#7.12.7">7.12.7</a>, <a href="#F.10.4">F.10.4</a>                                      arithmetic constant expression, <a href="#6.6">6.6</a>
+abstract declarator, <a href="#6.7.7">6.7.7</a>                                   arithmetic conversions, usual, see usual arithmetic
+abstract machine, <a href="#5.1.2.3">5.1.2.3</a>                                          conversions
+access, <a href="#3.1">3.1</a>, <a href="#6.7.3">6.7.3</a>, <a href="#L.2.1">L.2.1</a>                                    arithmetic operators
+accuracy, see floating-point accuracy                            additive, <a href="#6.2.6.2">6.2.6.2</a>, <a href="#6.5.6">6.5.6</a>, <a href="#G.5.2">G.5.2</a>
+acos functions, <a href="#7.12.4.1">7.12.4.1</a>, <a href="#F.10.1.1">F.10.1.1</a>                              bitwise, <a href="#6.2.6.2">6.2.6.2</a>, <a href="#6.5.3.3">6.5.3.3</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>
+acos type-generic macro, <a href="#7.24">7.24</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>
+acosh functions, <a href="#7.12.5.1">7.12.5.1</a>, <a href="#F.10.2.1">F.10.2.1</a>                             multiplicative, <a href="#6.2.6.2">6.2.6.2</a>, <a href="#6.5.5">6.5.5</a>, <a href="#G.5.1">G.5.1</a>
+acosh type-generic macro, <a href="#7.24">7.24</a>                                  shift, <a href="#6.2.6.2">6.2.6.2</a>, <a href="#6.5.7">6.5.7</a>
+acquire fence, <a href="#7.17.4">7.17.4</a>                                           unary, <a href="#6.5.3.3">6.5.3.3</a>
+acquire operation, <a href="#5.1.2.4">5.1.2.4</a>                                   arithmetic types, <a href="#6.2.5">6.2.5</a>
+active position, <a href="#5.2.2">5.2.2</a>                                       arithmetic, pointer, <a href="#6.5.6">6.5.6</a>
+actual argument, <a href="#3.3">3.3</a>                                         array
+actual parameter (deprecated), <a href="#3.3">3.3</a>                              argument, <a href="#6.9.1">6.9.1</a>
+addition assignment operator (+=), <a href="#6.5.16.2">6.5.16.2</a>                     declarator, <a href="#6.7.6.2">6.7.6.2</a>
+addition operator (+), <a href="#6.2.6.2">6.2.6.2</a>, <a href="#6.5.2.1">6.5.2.1</a>, <a href="#6.5.3.2">6.5.3.2</a>,               initialization, <a href="#6.7.9">6.7.9</a>
+      <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>                                         multidimensional, <a href="#6.5.2.1">6.5.2.1</a>
+additive expressions, <a href="#6.5.6">6.5.6</a>, <a href="#G.5.2">G.5.2</a>                              parameter, <a href="#6.9.1">6.9.1</a>
+address constant, <a href="#6.6">6.6</a>                                           storage order, <a href="#6.5.2.1">6.5.2.1</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>                          subscript operator ([ ]), <a href="#6.5.2.1">6.5.2.1</a>, <a href="#6.5.3.2">6.5.3.2</a>
+address-free, <a href="#7.17.5">7.17.5</a>                                            subscripting, <a href="#6.5.2.1">6.5.2.1</a>
+aggregate initialization, <a href="#6.7.9">6.7.9</a>                                 type, <a href="#6.2.5">6.2.5</a>
+aggregate types, <a href="#6.2.5">6.2.5</a>                                          type conversion, <a href="#6.3.2.1">6.3.2.1</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>                      variable length, <a href="#6.7.6">6.7.6</a>, <a href="#6.7.6.2">6.7.6.2</a>, <a href="#6.10.8.3">6.10.8.3</a>
+aliasing, <a href="#6.5">6.5</a>                                                arrow operator (-&gt;), <a href="#6.5.2.3">6.5.2.3</a>
+alignas macro, <a href="#7.15">7.15</a>                                          as-if rule, <a href="#5.1.2.3">5.1.2.3</a>
+aligned_alloc function, <a href="#7.22.3">7.22.3</a>, <a href="#7.22.3.1">7.22.3.1</a>                     ASCII code set, <a href="#5.2.1.1">5.2.1.1</a>
+alignment, <a href="#3.2">3.2</a>, <a href="#6.2.8">6.2.8</a>, <a href="#7.22.3.1">7.22.3.1</a>                              asctime function, <a href="#7.26.3.1">7.26.3.1</a>
+   pointer, <a href="#6.2.5">6.2.5</a>, <a href="#6.3.2.3">6.3.2.3</a>                                   asctime_s function, <a href="#K.3.8.2">K.3.8.2</a>, <a href="#K.3.8.2.1">K.3.8.2.1</a>
+   structure/union member, <a href="#6.7.2.1">6.7.2.1</a>                           asin functions, <a href="#7.12.4.2">7.12.4.2</a>, <a href="#F.10.1.2">F.10.1.2</a>
+alignment specifier, <a href="#6.7.5">6.7.5</a>                                    asin type-generic macro, <a href="#7.24">7.24</a>, <a href="#G.7">G.7</a>
+alignof operator, <a href="#6.5.3">6.5.3</a>, <a href="#6.5.3.4">6.5.3.4</a>                             asinh functions, <a href="#7.12.5.2">7.12.5.2</a>, <a href="#F.10.2.2">F.10.2.2</a>
+
+[<a name="#p655" href="p655">page 655</a>] (<a href="#Contents">Contents</a>)
+
+asinh type-generic macro, <a href="#7.24">7.24</a>, <a href="#G.7">G.7</a>                           atomic_is_lock_free generic function,
+asm keyword, <a href="#J.5.10">J.5.10</a>                                               <a href="#7.17.5.1">7.17.5.1</a>
+assert macro, <a href="#7.2.1.1">7.2.1.1</a>                                         ATOMIC_LLONG_LOCK_FREE macro, <a href="#7.17.1">7.17.1</a>
+assert.h header, <a href="#7.2">7.2</a>                                          atomic_load generic functions, <a href="#7.17.7.2">7.17.7.2</a>
+assignment                                                    ATOMIC_LONG_LOCK_FREE macro, <a href="#7.17.1">7.17.1</a>
+   compound, <a href="#6.5.16.2">6.5.16.2</a>                                         ATOMIC_SHORT_LOCK_FREE macro, <a href="#7.17.1">7.17.1</a>
+   conversion, <a href="#6.5.16.1">6.5.16.1</a>                                       atomic_signal_fence function, <a href="#7.17.4.2">7.17.4.2</a>
+   expression, <a href="#6.5.16">6.5.16</a>                                         atomic_store generic functions, <a href="#7.17.7.1">7.17.7.1</a>
+   operators, <a href="#6.3.2.1">6.3.2.1</a>, <a href="#6.5.16">6.5.16</a>                                 atomic_thread_fence function, <a href="#7.17.4.1">7.17.4.1</a>
+   simple, <a href="#6.5.16.1">6.5.16.1</a>                                           ATOMIC_VAR_INIT macro, <a href="#7.17.2.1">7.17.2.1</a>
+associativity of operators, <a href="#6.5">6.5</a>                               ATOMIC_WCHAR_T_LOCK_FREE macro, <a href="#7.17.1">7.17.1</a>
+asterisk punctuator (*), <a href="#6.7.6.1">6.7.6.1</a>, <a href="#6.7.6.2">6.7.6.2</a>                     atomics header, <a href="#7.17">7.17</a>
+at_quick_exit function, <a href="#7.22.4.2">7.22.4.2</a>, <a href="#7.22.4.3">7.22.4.3</a>,                   auto storage-class specifier, <a href="#6.7.1">6.7.1</a>, <a href="#6.9">6.9</a>
+     <a href="#7.22.4.4">7.22.4.4</a>, <a href="#7.22.4.5">7.22.4.5</a>, <a href="#7.22.4.7">7.22.4.7</a>                             automatic storage duration, <a href="#5.2.3">5.2.3</a>, <a href="#6.2.4">6.2.4</a>
+atan functions, <a href="#7.12.4.3">7.12.4.3</a>, <a href="#F.10.1.3">F.10.1.3</a>
+atan type-generic macro, <a href="#7.24">7.24</a>, <a href="#G.7">G.7</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>
+atan2 functions, <a href="#7.12.4.4">7.12.4.4</a>, <a href="#F.10.1.4">F.10.1.4</a>                           backslash escape sequence (\\), <a href="#6.4.4.4">6.4.4.4</a>, <a href="#6.10.9">6.10.9</a>
+atan2 type-generic macro, <a href="#7.24">7.24</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>
+atanh functions, <a href="#7.12.5.3">7.12.5.3</a>, <a href="#F.10.2.3">F.10.2.3</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>
+atanh type-generic macro, <a href="#7.24">7.24</a>, <a href="#G.7">G.7</a>                           basic types, <a href="#6.2.5">6.2.5</a>
+atexit function, <a href="#7.22.4.2">7.22.4.2</a>, <a href="#7.22.4.3">7.22.4.3</a>, <a href="#7.22.4.4">7.22.4.4</a>,                behavior, <a href="#3.4">3.4</a>
+     <a href="#7.22.4.5">7.22.4.5</a>, <a href="#7.22.4.7">7.22.4.7</a>, <a href="#J.5.13">J.5.13</a>                               binary streams, <a href="#7.21.2">7.21.2</a>, <a href="#7.21.7.10">7.21.7.10</a>, <a href="#7.21.9.2">7.21.9.2</a>,
+atof function, <a href="#7.22.1">7.22.1</a>, <a href="#7.22.1.1">7.22.1.1</a>                                     <a href="#7.21.9.4">7.21.9.4</a>
+atoi function, <a href="#7.22.1">7.22.1</a>, <a href="#7.22.1.2">7.22.1.2</a>                               bit, <a href="#3.5">3.5</a>
+atol function, <a href="#7.22.1">7.22.1</a>, <a href="#7.22.1.2">7.22.1.2</a>                                  high order, <a href="#3.6">3.6</a>
+atoll function, <a href="#7.22.1">7.22.1</a>, <a href="#7.22.1.2">7.22.1.2</a>                                 low order, <a href="#3.6">3.6</a>
+atomic lock-free macros, <a href="#7.17.1">7.17.1</a>, <a href="#7.17.5">7.17.5</a>                       bit-field, <a href="#6.7.2.1">6.7.2.1</a>
+atomic operations, <a href="#5.1.2.4">5.1.2.4</a>                                    bitand macro, <a href="#7.9">7.9</a>
+atomic types, <a href="#5.1.2.3">5.1.2.3</a>, <a href="#6.2.5">6.2.5</a>, <a href="#6.2.6.1">6.2.6.1</a>, <a href="#6.3.2.1">6.3.2.1</a>,               bitor macro, <a href="#7.9">7.9</a>
+     <a href="#6.5.2.3">6.5.2.3</a>, <a href="#6.5.2.4">6.5.2.4</a>, <a href="#6.5.16.2">6.5.16.2</a>, <a href="#6.7.2.4">6.7.2.4</a>, <a href="#6.10.8.3">6.10.8.3</a>,           bitwise operators, <a href="#6.5">6.5</a>
+     <a href="#7.17.6">7.17.6</a>                                                      AND, <a href="#6.2.6.2">6.2.6.2</a>, <a href="#6.5.10">6.5.10</a>
+atomic_address type, <a href="#7.17.1">7.17.1</a>, <a href="#7.17.6">7.17.6</a>                              AND assignment (&amp;=), <a href="#6.5.16.2">6.5.16.2</a>
+ATOMIC_ADDRESS_LOCK_FREE macro, <a href="#7.17.1">7.17.1</a>                           complement (~), <a href="#6.2.6.2">6.2.6.2</a>, <a href="#6.5.3.3">6.5.3.3</a>
+atomic_bool type, <a href="#7.17.1">7.17.1</a>, <a href="#7.17.6">7.17.6</a>                                 exclusive OR, <a href="#6.2.6.2">6.2.6.2</a>, <a href="#6.5.11">6.5.11</a>
+ATOMIC_CHAR16_T_LOCK_FREE macro,                                 exclusive OR assignment (^=), <a href="#6.5.16.2">6.5.16.2</a>
+     <a href="#7.17.1">7.17.1</a>                                                      inclusive OR, <a href="#6.2.6.2">6.2.6.2</a>, <a href="#6.5.12">6.5.12</a>
+ATOMIC_CHAR32_T_LOCK_FREE macro,                                 inclusive OR assignment (|=), <a href="#6.5.16.2">6.5.16.2</a>
+     <a href="#7.17.1">7.17.1</a>                                                      shift, <a href="#6.2.6.2">6.2.6.2</a>, <a href="#6.5.7">6.5.7</a>
+ATOMIC_CHAR_LOCK_FREE macro, <a href="#7.17.1">7.17.1</a>                           blank character, <a href="#7.4.1.3">7.4.1.3</a>
+atomic_compare_exchange generic                               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>
+     functions, <a href="#7.17.7.4">7.17.7.4</a>                                      block scope, <a href="#6.2.1">6.2.1</a>
+atomic_exchange generic functions, <a href="#7.17.7.3">7.17.7.3</a>                   block structure, <a href="#6.2.1">6.2.1</a>
+atomic_fetch and modify generic functions,                    bold type convention, <a href="#6.1">6.1</a>
+     <a href="#7.17.7.5">7.17.7.5</a>                                                 bool macro, <a href="#7.18">7.18</a>
+atomic_flag type, <a href="#7.17.1">7.17.1</a>, <a href="#7.17.8">7.17.8</a>                              boolean type, <a href="#6.3.1.2">6.3.1.2</a>
+atomic_flag_clear functions, <a href="#7.17.8.2">7.17.8.2</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>
+ATOMIC_FLAG_INIT macro, <a href="#7.17.1">7.17.1</a>, <a href="#7.17.8">7.17.8</a>                        bounded undefined behavior, <a href="#L.2.2">L.2.2</a>
+atomic_flag_test_and_set functions,                           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.9">6.7.9</a>,
+     <a href="#7.17.8.1">7.17.8.1</a>                                                       <a href="#6.8.2">6.8.2</a>
+atomic_init generic function, <a href="#7.17.2.2">7.17.2.2</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>
+ATOMIC_INT_LOCK_FREE macro, <a href="#7.17.1">7.17.1</a>                            brackets punctuator ([ ]), <a href="#6.7.6.2">6.7.6.2</a>, <a href="#6.7.9">6.7.9</a>
+
+[<a name="#p656" href="p656">page 656</a>] (<a href="#Contents">Contents</a>)
+
+branch cuts, <a href="#7.3.3">7.3.3</a>                                                type-generic macro for, <a href="#7.24">7.24</a>
+break statement, <a href="#6.8.6.3">6.8.6.3</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>
+broken-down time, <a href="#7.26.1">7.26.1</a>, <a href="#7.26.2.3">7.26.2.3</a>, <a href="#7.26.3">7.26.3</a>,                       type-generic macro for, <a href="#7.24">7.24</a>
+     <a href="#7.26.3.1">7.26.3.1</a>, <a href="#7.26.3.3">7.26.3.3</a>, <a href="#7.26.3.4">7.26.3.4</a>, <a href="#7.26.3.5">7.26.3.5</a>,                   ceil functions, <a href="#7.12.9.1">7.12.9.1</a>, <a href="#F.10.6.1">F.10.6.1</a>
+     <a href="#K.3.8.2.1">K.3.8.2.1</a>, <a href="#K.3.8.2.3">K.3.8.2.3</a>, <a href="#K.3.8.2.4">K.3.8.2.4</a>                           ceil type-generic macro, <a href="#7.24">7.24</a>
+bsearch function, <a href="#7.22.5">7.22.5</a>, <a href="#7.22.5.1">7.22.5.1</a>                             cerf function, <a href="#7.30.1">7.30.1</a>
+bsearch_s function, <a href="#K.3.6.3">K.3.6.3</a>, <a href="#K.3.6.3.1">K.3.6.3.1</a>                         cerfc function, <a href="#7.30.1">7.30.1</a>
+btowc function, <a href="#7.28.6.1.1">7.28.6.1.1</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>
+BUFSIZ macro, <a href="#7.21.1">7.21.1</a>, <a href="#7.21.2">7.21.2</a>, <a href="#7.21.5.5">7.21.5.5</a>                            type-generic macro for, <a href="#7.24">7.24</a>
+byte, <a href="#3.6">3.6</a>, <a href="#6.5.3.4">6.5.3.4</a>                                             cexp2 function, <a href="#7.30.1">7.30.1</a>
+byte input/output functions, <a href="#7.21.1">7.21.1</a>                            cexpm1 function, <a href="#7.30.1">7.30.1</a>
+byte-oriented stream, <a href="#7.21.2">7.21.2</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>, <a href="#K.3.5.3.2">K.3.5.3.2</a>,
+                                                                     <a href="#K.3.9.1.2">K.3.9.1.2</a>
+C program, <a href="#5.1.1.1">5.1.1.1</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>,
+c16rtomb function, <a href="#7.27.1.2">7.27.1.2</a>                                          <a href="#6.3.1.8">6.3.1.8</a>
+c32rtomb function, <a href="#7.27.1.4">7.27.1.4</a>                                    char16_t type, <a href="#6.4.4.4">6.4.4.4</a>, <a href="#6.4.5">6.4.5</a>, <a href="#6.10.8.2">6.10.8.2</a>, <a href="#7.27">7.27</a>
+cabs functions, <a href="#7.3.8.1">7.3.8.1</a>, <a href="#G.6">G.6</a>                                   char32_t type, <a href="#6.4.4.4">6.4.4.4</a>, <a href="#6.4.5">6.4.5</a>, <a href="#6.10.8.2">6.10.8.2</a>, <a href="#7.27">7.27</a>
+  type-generic macro for, <a href="#7.24">7.24</a>                                 CHAR_BIT macro, <a href="#5.2.4.2.1">5.2.4.2.1</a>, <a href="#6.7.2.1">6.7.2.1</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>                              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>
+  type-generic macro for, <a href="#7.24">7.24</a>                                 CHAR_MIN macro, <a href="#5.2.4.2.1">5.2.4.2.1</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, <a href="#3.7">3.7</a>, <a href="#3.7.1">3.7.1</a>
+  type-generic macro for, <a href="#7.24">7.24</a>                                 character array initialization, <a href="#6.7.9">6.7.9</a>
+calendar time, <a href="#7.26.1">7.26.1</a>, <a href="#7.26.2.2">7.26.2.2</a>, <a href="#7.26.2.3">7.26.2.3</a>, <a href="#7.26.2.4">7.26.2.4</a>,           character case mapping functions, <a href="#7.4.2">7.4.2</a>
+      <a href="#7.26.3.2">7.26.3.2</a>, <a href="#7.26.3.3">7.26.3.3</a>, <a href="#7.26.3.4">7.26.3.4</a>, <a href="#K.3.8.2.2">K.3.8.2.2</a>,                    wide character, <a href="#7.29.3.1">7.29.3.1</a>
+      <a href="#K.3.8.2.3">K.3.8.2.3</a>, <a href="#K.3.8.2.4">K.3.8.2.4</a>                                           extensible, <a href="#7.29.3.2">7.29.3.2</a>
+call by value, <a href="#6.5.2.2">6.5.2.2</a>                                         character classification functions, <a href="#7.4.1">7.4.1</a>
+call_once function, <a href="#7.25.1">7.25.1</a>, <a href="#7.25.2.1">7.25.2.1</a>                              wide character, <a href="#7.29.2.1">7.29.2.1</a>
+calloc function, <a href="#7.22.3">7.22.3</a>, <a href="#7.22.3.2">7.22.3.2</a>                                    extensible, <a href="#7.29.2.2">7.29.2.2</a>
+carg functions, <a href="#7.3.9.1">7.3.9.1</a>, <a href="#G.6">G.6</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>
+carg type-generic macro, <a href="#7.24">7.24</a>, <a href="#G.7">G.7</a>                             character display semantics, <a href="#5.2.2">5.2.2</a>
+carriage-return escape sequence (\r), <a href="#5.2.2">5.2.2</a>,                   character handling header, <a href="#7.4">7.4</a>, <a href="#7.11.1.1">7.11.1.1</a>
+      <a href="#6.4.4.4">6.4.4.4</a>, <a href="#7.4.1.10">7.4.1.10</a>                                        character input/output functions, <a href="#7.21.7">7.21.7</a>, <a href="#K.3.5.4">K.3.5.4</a>
+carries a dependency, <a href="#5.1.2.4">5.1.2.4</a>                                     wide character, <a href="#7.28.3">7.28.3</a>
+case label, <a href="#6.8.1">6.8.1</a>, <a href="#6.8.4.2">6.8.4.2</a>                                     character sets, <a href="#5.2.1">5.2.1</a>
+case mapping functions                                         character string literal, see string literal
+  character, <a href="#7.4.2">7.4.2</a>                                             character type conversion, <a href="#6.3.1.1">6.3.1.1</a>
+  wide character, <a href="#7.29.3.1">7.29.3.1</a>                                     character types, <a href="#6.2.5">6.2.5</a>, <a href="#6.7.9">6.7.9</a>
+      extensible, <a href="#7.29.3.2">7.29.3.2</a>                                     cimag functions, <a href="#7.3.9.2">7.3.9.2</a>, <a href="#7.3.9.5">7.3.9.5</a>, <a href="#G.6">G.6</a>
+casin functions, <a href="#7.3.5.2">7.3.5.2</a>, <a href="#G.6">G.6</a>                                  cimag type-generic macro, <a href="#7.24">7.24</a>, <a href="#G.7">G.7</a>
+  type-generic macro for, <a href="#7.24">7.24</a>                                 cis function, <a href="#G.6">G.6</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>                             classification functions
+  type-generic macro for, <a href="#7.24">7.24</a>                                    character, <a href="#7.4.1">7.4.1</a>
+cast expression, <a href="#6.5.4">6.5.4</a>                                            floating-point, <a href="#7.12.3">7.12.3</a>
+cast operator (( )), <a href="#6.5.4">6.5.4</a>                                        wide character, <a href="#7.29.2.1">7.29.2.1</a>
+catan functions, <a href="#7.3.5.3">7.3.5.3</a>, <a href="#G.6">G.6</a>                                        extensible, <a href="#7.29.2.2">7.29.2.2</a>
+  type-generic macro for, <a href="#7.24">7.24</a>                                 clearerr function, <a href="#7.21.10.1">7.21.10.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>                             clgamma function, <a href="#7.30.1">7.30.1</a>
+  type-generic macro for, <a href="#7.24">7.24</a>                                 clock function, <a href="#7.26.2.1">7.26.2.1</a>
+cbrt functions, <a href="#7.12.7.1">7.12.7.1</a>, <a href="#F.10.4.1">F.10.4.1</a>                             clock_t type, <a href="#7.26.1">7.26.1</a>, <a href="#7.26.2.1">7.26.2.1</a>
+cbrt type-generic macro, <a href="#7.24">7.24</a>                                  CLOCKS_PER_SEC macro, <a href="#7.26.1">7.26.1</a>, <a href="#7.26.2.1">7.26.2.1</a>
+ccos functions, <a href="#7.3.5.4">7.3.5.4</a>, <a href="#G.6">G.6</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>
+
+[<a name="#p657" href="p657">page 657</a>] (<a href="#Contents">Contents</a>)
+
+  type-generic macro for, <a href="#7.24">7.24</a>                                  string, <a href="#7.23.3">7.23.3</a>, <a href="#K.3.7.2">K.3.7.2</a>
+clog10 function, <a href="#7.30.1">7.30.1</a>                                         wide string, <a href="#7.28.4.3">7.28.4.3</a>, <a href="#K.3.9.2.2">K.3.9.2.2</a>
+clog1p function, <a href="#7.30.1">7.30.1</a>                                       concatenation, preprocessing, see preprocessing
+clog2 function, <a href="#7.30.1">7.30.1</a>                                             concatenation
+CMPLX macros, <a href="#7.3.9.3">7.3.9.3</a>                                         conceptual models, <a href="#5.1">5.1</a>
+cnd_broadcast function, <a href="#7.25.3.1">7.25.3.1</a>, <a href="#7.25.3.5">7.25.3.5</a>,                   conditional features, <a href="#4">4</a>, <a href="#6.2.5">6.2.5</a>, <a href="#6.7.6.2">6.7.6.2</a>, <a href="#6.10.8.3">6.10.8.3</a>,
+     <a href="#7.25.3.6">7.25.3.6</a>                                                      <a href="#7.1.2">7.1.2</a>, <a href="#F.1">F.1</a>, <a href="#G.1">G.1</a>, <a href="#K.2">K.2</a>, <a href="#L.1">L.1</a>
+cnd_destroy function, <a href="#7.25.3.2">7.25.3.2</a>                                conditional inclusion, <a href="#6.10.1">6.10.1</a>
+cnd_init function, <a href="#7.25.3.3">7.25.3.3</a>                                   conditional operator (? :), <a href="#5.1.2.4">5.1.2.4</a>, <a href="#6.5.15">6.5.15</a>
+cnd_signal function, <a href="#7.25.3.4">7.25.3.4</a>, <a href="#7.25.3.5">7.25.3.5</a>,                      conflict, <a href="#5.1.2.4">5.1.2.4</a>
+     <a href="#7.25.3.6">7.25.3.6</a>                                                 conformance, <a href="#4">4</a>
+cnd_t type, <a href="#7.25.1">7.25.1</a>                                            conj functions, <a href="#7.3.9.4">7.3.9.4</a>, <a href="#G.6">G.6</a>
+cnd_timedwait function, <a href="#7.25.3.5">7.25.3.5</a>                              conj type-generic macro, <a href="#7.24">7.24</a>
+cnd_wait function, <a href="#7.25.3.3">7.25.3.3</a>, <a href="#7.25.3.6">7.25.3.6</a>                         const type qualifier, <a href="#6.7.3">6.7.3</a>
+collating sequences, <a href="#5.2.1">5.2.1</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>
+colon punctuator (:), <a href="#6.7.2.1">6.7.2.1</a>                                 constant expression, <a href="#6.6">6.6</a>, <a href="#F.8.4">F.8.4</a>
+comma operator (,), <a href="#5.1.2.4">5.1.2.4</a>, <a href="#6.5.17">6.5.17</a>                           constants, <a href="#6.4.4">6.4.4</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>,             as primary expression, <a href="#6.5.1">6.5.1</a>
+     <a href="#6.7.2.3">6.7.2.3</a>, <a href="#6.7.9">6.7.9</a>                                             character, <a href="#6.4.4.4">6.4.4.4</a>
+command processor, <a href="#7.22.4.8">7.22.4.8</a>                                     enumeration, <a href="#6.2.1">6.2.1</a>, <a href="#6.4.4.3">6.4.4.3</a>
+comment delimiters (/* */ and //), <a href="#6.4.9">6.4.9</a>                        floating, <a href="#6.4.4.2">6.4.4.2</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>                                   hexadecimal, <a href="#6.4.4.1">6.4.4.1</a>
+common extensions, <a href="#J.5">J.5</a>                                          integer, <a href="#6.4.4.1">6.4.4.1</a>
+common initial sequence, <a href="#6.5.2.3">6.5.2.3</a>                                octal, <a href="#6.4.4.1">6.4.4.1</a>
+common real type, <a href="#6.3.1.8">6.3.1.8</a>                                     constraint, <a href="#3.8">3.8</a>, <a href="#4">4</a>
+common warnings, <a href="#I">I</a>                                            constraint_handler_t type, <a href="#K.3.6">K.3.6</a>
+comparison functions, <a href="#7.22.5">7.22.5</a>, <a href="#7.22.5.1">7.22.5.1</a>, <a href="#7.22.5.2">7.22.5.2</a>,             consume operation, <a href="#5.1.2.4">5.1.2.4</a>
+     <a href="#K.3.6.3">K.3.6.3</a>, <a href="#K.3.6.3.1">K.3.6.3.1</a>, <a href="#K.3.6.3.2">K.3.6.3.2</a>                            content of structure/union/enumeration, <a href="#6.7.2.3">6.7.2.3</a>
+  string, <a href="#7.23.4">7.23.4</a>                                              contiguity of allocated storage, <a href="#7.22.3">7.22.3</a>
+  wide string, <a href="#7.28.4.4">7.28.4.4</a>                                       continue statement, <a href="#6.8.6.2">6.8.6.2</a>
+comparison macros, <a href="#7.12.14">7.12.14</a>                                    contracted expression, <a href="#6.5">6.5</a>, <a href="#7.12.2">7.12.2</a>, <a href="#F.7">F.7</a>
+comparison, pointer, <a href="#6.5.8">6.5.8</a>                                    control character, <a href="#5.2.1">5.2.1</a>, <a href="#7.4">7.4</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.6">6.7.6</a>                   control wide character, <a href="#7.29.2">7.29.2</a>
+compl macro, <a href="#7.9">7.9</a>                                              conversion, <a href="#6.3">6.3</a>
+complement operator (~), <a href="#6.2.6.2">6.2.6.2</a>, <a href="#6.5.3.3">6.5.3.3</a>                       arithmetic operands, <a href="#6.3.1">6.3.1</a>
+complete type, <a href="#6.2.5">6.2.5</a>                                            array argument, <a href="#6.9.1">6.9.1</a>
+complex macro, <a href="#7.3.1">7.3.1</a>                                            array parameter, <a href="#6.9.1">6.9.1</a>
+complex numbers, <a href="#6.2.5">6.2.5</a>, <a href="#G">G</a>                                       arrays, <a href="#6.3.2.1">6.3.2.1</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>                       boolean, <a href="#6.3.1.2">6.3.1.2</a>
+complex type domain, <a href="#6.2.5">6.2.5</a>                                      boolean, characters, and integers, <a href="#6.3.1.1">6.3.1.1</a>
+complex types, <a href="#6.2.5">6.2.5</a>, <a href="#6.7.2">6.7.2</a>, <a href="#6.10.8.3">6.10.8.3</a>, <a href="#G">G</a>                        by assignment, <a href="#6.5.16.1">6.5.16.1</a>
+complex.h header, <a href="#5.2.4.2.2">5.2.4.2.2</a>, <a href="#6.10.8.3">6.10.8.3</a>, <a href="#7.1.2">7.1.2</a>,                   by return statement, <a href="#6.8.6.4">6.8.6.4</a>
+     <a href="#7.3">7.3</a>, <a href="#7.24">7.24</a>, <a href="#7.30.1">7.30.1</a>, <a href="#G.6">G.6</a>, <a href="#J.5.17">J.5.17</a>                             complex types, <a href="#6.3.1.6">6.3.1.6</a>
+compliance, see conformance                                     explicit, <a href="#6.3">6.3</a>
+components of time, <a href="#7.26.1">7.26.1</a>, <a href="#K.3.8.1">K.3.8.1</a>                             function, <a href="#6.3.2.1">6.3.2.1</a>
+composite type, <a href="#6.2.7">6.2.7</a>                                           function argument, <a href="#6.5.2.2">6.5.2.2</a>, <a href="#6.9.1">6.9.1</a>
+compound assignment, <a href="#6.5.16.2">6.5.16.2</a>                                   function designators, <a href="#6.3.2.1">6.3.2.1</a>
+compound literals, <a href="#6.5.2.5">6.5.2.5</a>                                      function parameter, <a href="#6.9.1">6.9.1</a>
+compound statement, <a href="#6.8.2">6.8.2</a>                                       imaginary, <a href="#G.4.1">G.4.1</a>
+compound-literal operator (( ){ }), <a href="#6.5.2.5">6.5.2.5</a>                     imaginary and complex, <a href="#G.4.3">G.4.3</a>
+concatenation functions                                         implicit, <a href="#6.3">6.3</a>
+
+[<a name="#p658" href="p658">page 658</a>] (<a href="#Contents">Contents</a>)
+
+   lvalues, <a href="#6.3.2.1">6.3.2.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>
+   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.24">7.24</a>
+   real and complex, <a href="#6.3.1.7">6.3.1.7</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>
+   real and imaginary, <a href="#G.4.2">G.4.2</a>                                      type-generic macro for, <a href="#7.24">7.24</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>                  ctan functions, <a href="#7.3.5.6">7.3.5.6</a>, <a href="#G.6">G.6</a>
+   real floating types, <a href="#6.3.1.5">6.3.1.5</a>, <a href="#F.3">F.3</a>                               type-generic macro for, <a href="#7.24">7.24</a>
+   signed and unsigned integers, <a href="#6.3.1.3">6.3.1.3</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>
+   usual arithmetic, see usual arithmetic                         type-generic macro for, <a href="#7.24">7.24</a>
+         conversions                                            ctgamma function, <a href="#7.30.1">7.30.1</a>
+   void type, <a href="#6.3.2.2">6.3.2.2</a>                                           ctime function, <a href="#7.26.3.2">7.26.3.2</a>
+conversion functions                                            ctime_s function, <a href="#K.3.8.2">K.3.8.2</a>, <a href="#K.3.8.2.2">K.3.8.2.2</a>
+   multibyte/wide character, <a href="#7.22.7">7.22.7</a>, <a href="#K.3.6.4">K.3.6.4</a>                    ctype.h header, <a href="#7.4">7.4</a>, <a href="#7.30.2">7.30.2</a>
+      extended, <a href="#7.28.6">7.28.6</a>, <a href="#K.3.9.3">K.3.9.3</a>                                 current object, <a href="#6.7.9">6.7.9</a>
+      restartable, <a href="#7.27.1">7.27.1</a>, <a href="#7.28.6.3">7.28.6.3</a>, <a href="#K.3.9.3.1">K.3.9.3.1</a>                  CX_LIMITED_RANGE pragma, <a href="#6.10.6">6.10.6</a>, <a href="#7.3.4">7.3.4</a>
+   multibyte/wide string, <a href="#7.22.8">7.22.8</a>, <a href="#K.3.6.5">K.3.6.5</a>
+      restartable, <a href="#7.28.6.4">7.28.6.4</a>, <a href="#K.3.9.3.2">K.3.9.3.2</a>                          data race, <a href="#5.1.2.4">5.1.2.4</a>, <a href="#7.1.4">7.1.4</a>, <a href="#7.22.2.1">7.22.2.1</a>, <a href="#7.22.4.6">7.22.4.6</a>,
+   numeric, <a href="#7.8.2.3">7.8.2.3</a>, <a href="#7.22.1">7.22.1</a>                                          <a href="#7.23.5.8">7.23.5.8</a>, <a href="#7.23.6.2">7.23.6.2</a>, <a href="#7.26.3">7.26.3</a>, <a href="#7.27.1">7.27.1</a>, <a href="#7.28.6.3">7.28.6.3</a>,
+      wide string, <a href="#7.8.2.4">7.8.2.4</a>, <a href="#7.28.4.1">7.28.4.1</a>                                 <a href="#7.28.6.4">7.28.6.4</a>
+   single byte/wide character, <a href="#7.28.6.1">7.28.6.1</a>                         data stream, see streams
+   time, <a href="#7.26.3">7.26.3</a>, <a href="#K.3.8.2">K.3.8.2</a>                                        date and time header, <a href="#7.26">7.26</a>, <a href="#K.3.8">K.3.8</a>
+      wide character, <a href="#7.28.5">7.28.5</a>                                    Daylight Saving Time, <a href="#7.26.1">7.26.1</a>
+conversion specifier, <a href="#7.21.6.1">7.21.6.1</a>, <a href="#7.21.6.2">7.21.6.2</a>, <a href="#7.28.2.1">7.28.2.1</a>,              DBL_DECIMAL_DIG macro, <a href="#5.2.4.2.2">5.2.4.2.2</a>
+      <a href="#7.28.2.2">7.28.2.2</a>                                                  DBL_DIG macro, <a href="#5.2.4.2.2">5.2.4.2.2</a>
+conversion state, <a href="#7.22.7">7.22.7</a>, <a href="#7.27.1">7.27.1</a>, <a href="#7.27.1.1">7.27.1.1</a>,                     DBL_EPSILON macro, <a href="#5.2.4.2.2">5.2.4.2.2</a>
+      <a href="#7.27.1.2">7.27.1.2</a>, <a href="#7.27.1.3">7.27.1.3</a>, <a href="#7.27.1.4">7.27.1.4</a>, <a href="#7.28.6">7.28.6</a>,                     DBL_HAS_SUBNORM macro, <a href="#5.2.4.2.2">5.2.4.2.2</a>
+      <a href="#7.28.6.2.1">7.28.6.2.1</a>, <a href="#7.28.6.3">7.28.6.3</a>, <a href="#7.28.6.3.2">7.28.6.3.2</a>, <a href="#7.28.6.3.3">7.28.6.3.3</a>,             DBL_MANT_DIG macro, <a href="#5.2.4.2.2">5.2.4.2.2</a>
+      <a href="#7.28.6.4">7.28.6.4</a>, <a href="#7.28.6.4.1">7.28.6.4.1</a>, <a href="#7.28.6.4.2">7.28.6.4.2</a>, <a href="#K.3.6.4">K.3.6.4</a>,                DBL_MAX macro, <a href="#5.2.4.2.2">5.2.4.2.2</a>
+      <a href="#K.3.9.3.1">K.3.9.3.1</a>, <a href="#K.3.9.3.1.1">K.3.9.3.1.1</a>, <a href="#K.3.9.3.2">K.3.9.3.2</a>, <a href="#K.3.9.3.2.1">K.3.9.3.2.1</a>,           DBL_MAX_10_EXP macro, <a href="#5.2.4.2.2">5.2.4.2.2</a>
+      <a href="#K.3.9.3.2.2">K.3.9.3.2.2</a>                                               DBL_MAX_EXP macro, <a href="#5.2.4.2.2">5.2.4.2.2</a>
+conversion state functions, <a href="#7.28.6.2">7.28.6.2</a>                            DBL_MIN macro, <a href="#5.2.4.2.2">5.2.4.2.2</a>
+copying functions                                               DBL_MIN_10_EXP macro, <a href="#5.2.4.2.2">5.2.4.2.2</a>
+   string, <a href="#7.23.2">7.23.2</a>, <a href="#K.3.7.1">K.3.7.1</a>                                      DBL_MIN_EXP macro, <a href="#5.2.4.2.2">5.2.4.2.2</a>
+   wide string, <a href="#7.28.4.2">7.28.4.2</a>, <a href="#K.3.9.2.1">K.3.9.2.1</a>                             DBL_TRUE_MIN macro, <a href="#5.2.4.2.2">5.2.4.2.2</a>
+copysign functions, <a href="#7.3.9.5">7.3.9.5</a>, <a href="#7.12.11.1">7.12.11.1</a>, <a href="#F.3">F.3</a>,                    decimal constant, <a href="#6.4.4.1">6.4.4.1</a>
+      <a href="#F.10.8.1">F.10.8.1</a>                                                  decimal digit, <a href="#5.2.1">5.2.1</a>
+copysign type-generic macro, <a href="#7.24">7.24</a>                               decimal-point character, <a href="#7.1.1">7.1.1</a>, <a href="#7.11.2.1">7.11.2.1</a>
+correctly rounded result, <a href="#3.9">3.9</a>                                   DECIMAL_DIG macro, <a href="#5.2.4.2.2">5.2.4.2.2</a>, <a href="#7.21.6.1">7.21.6.1</a>,
+corresponding real type, <a href="#6.2.5">6.2.5</a>                                       <a href="#7.22.1.3">7.22.1.3</a>, <a href="#7.28.2.1">7.28.2.1</a>, <a href="#7.28.4.1.1">7.28.4.1.1</a>, <a href="#F.5">F.5</a>
+cos functions, <a href="#7.12.4.5">7.12.4.5</a>, <a href="#F.10.1.5">F.10.1.5</a>                               declaration specifiers, <a href="#6.7">6.7</a>
+cos type-generic macro, <a href="#7.24">7.24</a>, <a href="#G.7">G.7</a>                               declarations, <a href="#6.7">6.7</a>
+cosh functions, <a href="#7.12.5.4">7.12.5.4</a>, <a href="#F.10.2.4">F.10.2.4</a>                                function, <a href="#6.7.6.3">6.7.6.3</a>
+cosh type-generic macro, <a href="#7.24">7.24</a>, <a href="#G.7">G.7</a>                                pointer, <a href="#6.7.6.1">6.7.6.1</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>                                  structure/union, <a href="#6.7.2.1">6.7.2.1</a>
+   type-generic macro for, <a href="#7.24">7.24</a>                                   typedef, <a href="#6.7.8">6.7.8</a>
+cproj functions, <a href="#7.3.9.5">7.3.9.5</a>, <a href="#G.6">G.6</a>                                   declarator, <a href="#6.7.6">6.7.6</a>
+cproj type-generic macro, <a href="#7.24">7.24</a>                                    abstract, <a href="#6.7.7">6.7.7</a>
+creal functions, <a href="#7.3.9.6">7.3.9.6</a>, <a href="#G.6">G.6</a>                                   declarator type derivation, <a href="#6.2.5">6.2.5</a>, <a href="#6.7.6">6.7.6</a>
+creal type-generic macro, <a href="#7.24">7.24</a>, <a href="#G.7">G.7</a>                             decrement operators, see arithmetic operators,
+critical undefined behavior, <a href="#L.2.3">L.2.3</a>                                    increment and decrement
+csin functions, <a href="#7.3.5.5">7.3.5.5</a>, <a href="#G.6">G.6</a>                                    default argument promotions, <a href="#6.5.2.2">6.5.2.2</a>
+   type-generic macro for, <a href="#7.24">7.24</a>                                 default initialization, <a href="#6.7.9">6.7.9</a>
+
+[<a name="#p659" href="p659">page 659</a>] (<a href="#Contents">Contents</a>)
+
+default label, <a href="#6.8.1">6.8.1</a>, <a href="#6.8.4.2">6.8.4.2</a>                                  elif preprocessing directive, <a href="#6.10.1">6.10.1</a>
+define preprocessing directive, <a href="#6.10.3">6.10.3</a>                         ellipsis punctuator (...), <a href="#6.5.2.2">6.5.2.2</a>, <a href="#6.7.6.3">6.7.6.3</a>, <a href="#6.10.3">6.10.3</a>
+defined operator, <a href="#6.10.1">6.10.1</a>, <a href="#6.10.8">6.10.8</a>                               else preprocessing directive, <a href="#6.10.1">6.10.1</a>
+definition, <a href="#6.7">6.7</a>                                                 else statement, <a href="#6.8.4.1">6.8.4.1</a>
+   function, <a href="#6.9.1">6.9.1</a>                                             empty statement, <a href="#6.8.3">6.8.3</a>
+dependency-ordered before, <a href="#5.1.2.4">5.1.2.4</a>                             encoding error, <a href="#7.21.3">7.21.3</a>, <a href="#7.27.1.1">7.27.1.1</a>, <a href="#7.27.1.2">7.27.1.2</a>,
+derived declarator types, <a href="#6.2.5">6.2.5</a>                                      <a href="#7.27.1.3">7.27.1.3</a>, <a href="#7.27.1.4">7.27.1.4</a>, <a href="#7.28.3.1">7.28.3.1</a>, <a href="#7.28.3.3">7.28.3.3</a>,
+derived types, <a href="#6.2.5">6.2.5</a>                                                 <a href="#7.28.6.3.2">7.28.6.3.2</a>, <a href="#7.28.6.3.3">7.28.6.3.3</a>, <a href="#7.28.6.4.1">7.28.6.4.1</a>, <a href="#7.28.6.4.2">7.28.6.4.2</a>,
+designated initializer, <a href="#6.7.9">6.7.9</a>                                        <a href="#K.3.6.5.1">K.3.6.5.1</a>, <a href="#K.3.6.5.2">K.3.6.5.2</a>, <a href="#K.3.9.3.1.1">K.3.9.3.1.1</a>, <a href="#K.3.9.3.2.1">K.3.9.3.2.1</a>,
+destringizing, <a href="#6.10.9">6.10.9</a>                                                <a href="#K.3.9.3.2.2">K.3.9.3.2.2</a>
+device input/output, <a href="#5.1.2.3">5.1.2.3</a>                                   end-of-file, <a href="#7.28.1">7.28.1</a>
+diagnostic message, <a href="#3.10">3.10</a>, <a href="#5.1.1.3">5.1.1.3</a>                              end-of-file indicator, <a href="#7.21.1">7.21.1</a>, <a href="#7.21.5.3">7.21.5.3</a>, <a href="#7.21.7.1">7.21.7.1</a>,
+diagnostics, <a href="#5.1.1.3">5.1.1.3</a>                                                 <a href="#7.21.7.5">7.21.7.5</a>, <a href="#7.21.7.6">7.21.7.6</a>, <a href="#7.21.7.10">7.21.7.10</a>, <a href="#7.21.9.2">7.21.9.2</a>,
+diagnostics header, <a href="#7.2">7.2</a>                                              <a href="#7.21.9.3">7.21.9.3</a>, <a href="#7.21.10.1">7.21.10.1</a>, <a href="#7.21.10.2">7.21.10.2</a>, <a href="#7.28.3.1">7.28.3.1</a>,
+difftime function, <a href="#7.26.2.2">7.26.2.2</a>                                          <a href="#7.28.3.10">7.28.3.10</a>
+digit, <a href="#5.2.1">5.2.1</a>, <a href="#7.4">7.4</a>                                              end-of-file macro, see EOF macro
+digraphs, <a href="#6.4.6">6.4.6</a>                                                end-of-line indicator, <a href="#5.2.1">5.2.1</a>
+direct input/output functions, <a href="#7.21.8">7.21.8</a>                          endif preprocessing directive, <a href="#6.10.1">6.10.1</a>
+display device, <a href="#5.2.2">5.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>
+div function, <a href="#7.22.6.2">7.22.6.2</a>                                         enumerated type, <a href="#6.2.5">6.2.5</a>
+div_t type, <a href="#7.22">7.22</a>                                               enumeration, <a href="#6.2.5">6.2.5</a>, <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 constant, <a href="#6.2.1">6.2.1</a>, <a href="#6.4.4.3">6.4.4.3</a>
+division operator (/), <a href="#6.2.6.2">6.2.6.2</a>, <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>              enumeration content, <a href="#6.7.2.3">6.7.2.3</a>
+do statement, <a href="#6.8.5.2">6.8.5.2</a>                                          enumeration members, <a href="#6.7.2.2">6.7.2.2</a>
+documentation of implementation, <a href="#4">4</a>                             enumeration specifiers, <a href="#6.7.2.2">6.7.2.2</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>,            enumeration tag, <a href="#6.2.3">6.2.3</a>, <a href="#6.7.2.3">6.7.2.3</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>,                  enumerator, <a href="#6.7.2.2">6.7.2.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>,                environment, <a href="#5">5</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>,                  environment functions, <a href="#7.22.4">7.22.4</a>, <a href="#K.3.6.2">K.3.6.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>                environment list, <a href="#7.22.4.6">7.22.4.6</a>, <a href="#K.3.6.2.1">K.3.6.2.1</a>
+dot operator (.), <a href="#6.5.2.3">6.5.2.3</a>                                      environmental considerations, <a href="#5.2">5.2</a>
+double _Complex type, <a href="#6.2.5">6.2.5</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.21.2">7.21.2</a>,
+double _Complex type conversion, <a href="#6.3.1.6">6.3.1.6</a>,                            <a href="#7.21.3">7.21.3</a>, <a href="#7.21.4.4">7.21.4.4</a>, <a href="#7.21.6.1">7.21.6.1</a>, <a href="#7.22.2.1">7.22.2.1</a>, <a href="#7.22.4.2">7.22.4.2</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.22.4.3">7.22.4.3</a>, <a href="#7.28.2.1">7.28.2.1</a>, <a href="#K.3.5.1.2">K.3.5.1.2</a>
+double _Imaginary type, <a href="#G.2">G.2</a>                                    EOF macro, <a href="#7.4">7.4</a>, <a href="#7.21.1">7.21.1</a>, <a href="#7.21.5.1">7.21.5.1</a>, <a href="#7.21.5.2">7.21.5.2</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.21.6.2">7.21.6.2</a>,                        <a href="#7.21.6.2">7.21.6.2</a>, <a href="#7.21.6.7">7.21.6.7</a>, <a href="#7.21.6.9">7.21.6.9</a>, <a href="#7.21.6.11">7.21.6.11</a>,
+      <a href="#7.28.2.2">7.28.2.2</a>, <a href="#F.2">F.2</a>                                                  <a href="#7.21.6.14">7.21.6.14</a>, <a href="#7.21.7.1">7.21.7.1</a>, <a href="#7.21.7.3">7.21.7.3</a>, <a href="#7.21.7.4">7.21.7.4</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>,                   <a href="#7.21.7.5">7.21.7.5</a>, <a href="#7.21.7.6">7.21.7.6</a>, <a href="#7.21.7.8">7.21.7.8</a>, <a href="#7.21.7.9">7.21.7.9</a>,
+      <a href="#6.3.1.8">6.3.1.8</a>                                                        <a href="#7.21.7.10">7.21.7.10</a>, <a href="#7.28.1">7.28.1</a>, <a href="#7.28.2.2">7.28.2.2</a>, <a href="#7.28.2.4">7.28.2.4</a>,
+double-precision arithmetic, <a href="#5.1.2.3">5.1.2.3</a>                                 <a href="#7.28.2.6">7.28.2.6</a>, <a href="#7.28.2.8">7.28.2.8</a>, <a href="#7.28.2.10">7.28.2.10</a>, <a href="#7.28.2.12">7.28.2.12</a>,
+double-quote escape sequence (\"), <a href="#6.4.4.4">6.4.4.4</a>,                          <a href="#7.28.3.4">7.28.3.4</a>, <a href="#7.28.6.1.1">7.28.6.1.1</a>, <a href="#7.28.6.1.2">7.28.6.1.2</a>, <a href="#K.3.5.3.7">K.3.5.3.7</a>,
+      <a href="#6.4.5">6.4.5</a>, <a href="#6.10.9">6.10.9</a>                                                  <a href="#K.3.5.3.9">K.3.5.3.9</a>, <a href="#K.3.5.3.11">K.3.5.3.11</a>, <a href="#K.3.5.3.14">K.3.5.3.14</a>, <a href="#K.3.9.1.2">K.3.9.1.2</a>,
+double_t type, <a href="#7.12">7.12</a>, <a href="#J.5.6">J.5.6</a>                                           <a href="#K.3.9.1.5">K.3.9.1.5</a>, <a href="#K.3.9.1.7">K.3.9.1.7</a>, <a href="#K.3.9.1.10">K.3.9.1.10</a>, <a href="#K.3.9.1.12">K.3.9.1.12</a>,
+                                                                     <a href="#K.3.9.1.14">K.3.9.1.14</a>
+EDOM macro, <a href="#7.5">7.5</a>, <a href="#7.12.1">7.12.1</a>, see also domain error                 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.9">6.7.9</a>
+effective type, <a href="#6.5">6.5</a>                                            equal-to operator, see equality operator
+EILSEQ macro, <a href="#7.5">7.5</a>, <a href="#7.21.3">7.21.3</a>, <a href="#7.27.1.1">7.27.1.1</a>, <a href="#7.27.1.2">7.27.1.2</a>,                 equality expressions, <a href="#6.5.9">6.5.9</a>
+     <a href="#7.27.1.3">7.27.1.3</a>, <a href="#7.27.1.4">7.27.1.4</a>, <a href="#7.28.3.1">7.28.3.1</a>, <a href="#7.28.3.3">7.28.3.3</a>,                   equality operator (==), <a href="#6.5.9">6.5.9</a>
+     <a href="#7.28.6.3.2">7.28.6.3.2</a>, <a href="#7.28.6.3.3">7.28.6.3.3</a>, <a href="#7.28.6.4.1">7.28.6.4.1</a>, <a href="#7.28.6.4.2">7.28.6.4.2</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>,
+     see also encoding error                                         <a href="#7.22.1.3">7.22.1.3</a>, <a href="#7.22.1.4">7.22.1.4</a>, <a href="#7.28.4.1.1">7.28.4.1.1</a>, <a href="#7.28.4.1.2">7.28.4.1.2</a>, see
+element type, <a href="#6.2.5">6.2.5</a>                                                  also range error, pole error
+
+[<a name="#p660" href="p660">page 660</a>] (<a href="#Contents">Contents</a>)
+
+erf functions, <a href="#7.12.8.1">7.12.8.1</a>, <a href="#F.10.5.1">F.10.5.1</a>                               exp2 functions, <a href="#7.12.6.2">7.12.6.2</a>, <a href="#F.10.3.2">F.10.3.2</a>
+erf type-generic macro, <a href="#7.24">7.24</a>                                    exp2 type-generic macro, <a href="#7.24">7.24</a>
+erfc functions, <a href="#7.12.8.2">7.12.8.2</a>, <a href="#F.10.5.2">F.10.5.2</a>                              explicit conversion, <a href="#6.3">6.3</a>
+erfc type-generic macro, <a href="#7.24">7.24</a>                                   expm1 functions, <a href="#7.12.6.3">7.12.6.3</a>, <a href="#F.10.3.3">F.10.3.3</a>
+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>,               expm1 type-generic macro, <a href="#7.24">7.24</a>
+      <a href="#7.12.1">7.12.1</a>, <a href="#7.14.1.1">7.14.1.1</a>, <a href="#7.21.3">7.21.3</a>, <a href="#7.21.9.3">7.21.9.3</a>, <a href="#7.21.10.4">7.21.10.4</a>,            exponent part, <a href="#6.4.4.2">6.4.4.2</a>
+      <a href="#7.22.1">7.22.1</a>, <a href="#7.22.1.3">7.22.1.3</a>, <a href="#7.22.1.4">7.22.1.4</a>, <a href="#7.23.6.2">7.23.6.2</a>, <a href="#7.27.1.1">7.27.1.1</a>,           exponential functions
+      <a href="#7.27.1.2">7.27.1.2</a>, <a href="#7.27.1.3">7.27.1.3</a>, <a href="#7.27.1.4">7.27.1.4</a>, <a href="#7.28.3.1">7.28.3.1</a>,                     complex, <a href="#7.3.7">7.3.7</a>, <a href="#G.6.3">G.6.3</a>
+      <a href="#7.28.3.3">7.28.3.3</a>, <a href="#7.28.4.1.1">7.28.4.1.1</a>, <a href="#7.28.4.1.2">7.28.4.1.2</a>, <a href="#7.28.6.3.2">7.28.6.3.2</a>,               real, <a href="#7.12.6">7.12.6</a>, <a href="#F.10.3">F.10.3</a>
+      <a href="#7.28.6.3.3">7.28.6.3.3</a>, <a href="#7.28.6.4.1">7.28.6.4.1</a>, <a href="#7.28.6.4.2">7.28.6.4.2</a>, <a href="#J.5.17">J.5.17</a>,               expression, <a href="#6.5">6.5</a>
+      <a href="#K.3.1.3">K.3.1.3</a>, <a href="#K.3.7.4.2">K.3.7.4.2</a>                                          assignment, <a href="#6.5.16">6.5.16</a>
+errno.h header, <a href="#7.5">7.5</a>, <a href="#7.30.3">7.30.3</a>, <a href="#K.3.2">K.3.2</a>                                cast, <a href="#6.5.4">6.5.4</a>
+errno_t type, <a href="#K.3.2">K.3.2</a>, <a href="#K.3.5">K.3.5</a>, <a href="#K.3.6">K.3.6</a>, <a href="#K.3.6.1.1">K.3.6.1.1</a>,                     constant, <a href="#6.6">6.6</a>
+      <a href="#K.3.7">K.3.7</a>, <a href="#K.3.8">K.3.8</a>, <a href="#K.3.9">K.3.9</a>                                         evaluation, <a href="#5.1.2.3">5.1.2.3</a>
+error                                                             full, <a href="#6.8">6.8</a>
+   domain, see domain error                                       order of evaluation, see order of evaluation
+   encoding, see encoding error                                   parenthesized, <a href="#6.5.1">6.5.1</a>
+   pole, see pole error                                           primary, <a href="#6.5.1">6.5.1</a>
+   range, see range error                                         unary, <a href="#6.5.3">6.5.3</a>
+error conditions, <a href="#7.12.1">7.12.1</a>                                        expression statement, <a href="#6.8.3">6.8.3</a>
+error functions, <a href="#7.12.8">7.12.8</a>, <a href="#F.10.5">F.10.5</a>                                 extended alignment, <a href="#6.2.8">6.2.8</a>
+error indicator, <a href="#7.21.1">7.21.1</a>, <a href="#7.21.5.3">7.21.5.3</a>, <a href="#7.21.7.1">7.21.7.1</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>
+      <a href="#7.21.7.3">7.21.7.3</a>, <a href="#7.21.7.5">7.21.7.5</a>, <a href="#7.21.7.6">7.21.7.6</a>, <a href="#7.21.7.7">7.21.7.7</a>,                   extended characters, <a href="#5.2.1">5.2.1</a>
+      <a href="#7.21.7.8">7.21.7.8</a>, <a href="#7.21.9.2">7.21.9.2</a>, <a href="#7.21.10.1">7.21.10.1</a>, <a href="#7.21.10.3">7.21.10.3</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>,
+      <a href="#7.28.3.1">7.28.3.1</a>, <a href="#7.28.3.3">7.28.3.3</a>                                             <a href="#7.20">7.20</a>
+error preprocessing directive, <a href="#4">4</a>, <a href="#6.10.5">6.10.5</a>                        extended multibyte/wide character conversion
+error-handling functions, <a href="#7.21.10">7.21.10</a>, <a href="#7.23.6.2">7.23.6.2</a>,                         utilities, <a href="#7.28.6">7.28.6</a>, <a href="#K.3.9.3">K.3.9.3</a>
+      <a href="#K.3.7.4.2">K.3.7.4.2</a>, <a href="#K.3.7.4.3">K.3.7.4.3</a>                                      extensible wide character case mapping functions,
+escape character (\), <a href="#6.4.4.4">6.4.4.4</a>                                        <a href="#7.29.3.2">7.29.3.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>                 extensible wide character classification functions,
+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>                          <a href="#7.29.2.2">7.29.2.2</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.8.5">F.8.5</a>                        extern storage-class specifier, <a href="#6.2.2">6.2.2</a>, <a href="#6.7.1">6.7.1</a>
+evaluation of expression, <a href="#5.1.2.3">5.1.2.3</a>                               external definition, <a href="#6.9">6.9</a>
+evaluation order, see order of evaluation                       external identifiers, underscore, <a href="#7.1.3">7.1.3</a>
+exceptional condition, <a href="#6.5">6.5</a>                                      external linkage, <a href="#6.2.2">6.2.2</a>
+excess precision, <a href="#5.2.4.2.2">5.2.4.2.2</a>, <a href="#6.3.1.8">6.3.1.8</a>, <a href="#6.8.6.4">6.8.6.4</a>                   external name, <a href="#6.4.2.1">6.4.2.1</a>
+excess range, <a href="#5.2.4.2.2">5.2.4.2.2</a>, <a href="#6.3.1.8">6.3.1.8</a>, <a href="#6.8.6.4">6.8.6.4</a>                       external object definitions, <a href="#6.9.2">6.9.2</a>
+exclusive OR operators
+   bitwise (^), <a href="#6.2.6.2">6.2.6.2</a>, <a href="#6.5.11">6.5.11</a>                                 fabs functions, <a href="#7.12.7.2">7.12.7.2</a>, <a href="#F.3">F.3</a>, <a href="#F.10.4.2">F.10.4.2</a>
+   bitwise assignment (^=), <a href="#6.5.16.2">6.5.16.2</a>                            fabs type-generic macro, <a href="#7.24">7.24</a>, <a href="#G.7">G.7</a>
+executable program, <a href="#5.1.1.1">5.1.1.1</a>                                     false macro, <a href="#7.18">7.18</a>
+execution character set, <a href="#5.2.1">5.2.1</a>                                  fclose function, <a href="#7.21.5.1">7.21.5.1</a>
+execution environment, <a href="#5">5</a>, <a href="#5.1.2">5.1.2</a>, see also                       fdim functions, <a href="#7.12.12.1">7.12.12.1</a>, <a href="#F.10.9.1">F.10.9.1</a>
+      environmental limits                                      fdim type-generic macro, <a href="#7.24">7.24</a>
+execution sequence, <a href="#5.1.2.3">5.1.2.3</a>, <a href="#6.8">6.8</a>                                FE_ALL_EXCEPT macro, <a href="#7.6">7.6</a>
+exit function, <a href="#5.1.2.2.3">5.1.2.2.3</a>, <a href="#7.21.3">7.21.3</a>, <a href="#7.22">7.22</a>, <a href="#7.22.4.4">7.22.4.4</a>,               FE_DFL_ENV macro, <a href="#7.6">7.6</a>
+      <a href="#7.22.4.5">7.22.4.5</a>, <a href="#7.22.4.7">7.22.4.7</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_FAILURE macro, <a href="#7.22">7.22</a>, <a href="#7.22.4.4">7.22.4.4</a>                              FE_DOWNWARD macro, <a href="#7.6">7.6</a>, <a href="#F.3">F.3</a>
+EXIT_SUCCESS macro, <a href="#7.22">7.22</a>, <a href="#7.22.4.4">7.22.4.4</a>                              FE_INEXACT macro, <a href="#7.6">7.6</a>, <a href="#F.3">F.3</a>
+exp functions, <a href="#7.12.6.1">7.12.6.1</a>, <a href="#F.10.3.1">F.10.3.1</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>
+exp type-generic macro, <a href="#7.24">7.24</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>
+
+[<a name="#p661" href="p661">page 661</a>] (<a href="#Contents">Contents</a>)
+
+FE_TONEAREST macro, <a href="#7.6">7.6</a>, <a href="#F.3">F.3</a>                                 float _Complex type conversion, <a href="#6.3.1.6">6.3.1.6</a>,
+FE_TOWARDZERO macro, <a href="#7.6">7.6</a>, <a href="#F.3">F.3</a>                                     <a href="#6.3.1.7">6.3.1.7</a>, <a href="#6.3.1.8">6.3.1.8</a>
+FE_UNDERFLOW macro, <a href="#7.6">7.6</a>, <a href="#F.3">F.3</a>                                 float _Imaginary type, <a href="#G.2">G.2</a>
+FE_UPWARD macro, <a href="#7.6">7.6</a>, <a href="#F.3">F.3</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>
+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>                  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>,
+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>                 <a href="#6.3.1.8">6.3.1.8</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>                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.22.1.3">7.22.1.3</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>                            <a href="#7.28.4.1.1">7.28.4.1.1</a>
+feholdexcept function, <a href="#7.6.4.2">7.6.4.2</a>, <a href="#7.6.4.3">7.6.4.3</a>,                     float_t type, <a href="#7.12">7.12</a>, <a href="#J.5.6">J.5.6</a>
+     <a href="#7.6.4.4">7.6.4.4</a>, <a href="#F.3">F.3</a>                                            floating constant, <a href="#6.4.4.2">6.4.4.2</a>
+fence, <a href="#5.1.2.4">5.1.2.4</a>                                               floating suffix, f or <a href="#F">F</a>, <a href="#6.4.4.2">6.4.4.2</a>
+fences, <a href="#7.17.4">7.17.4</a>                                               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>,
+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>                <a href="#F.3">F.3</a>, <a href="#F.4">F.4</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.8">F.8</a>, <a href="#F.9">F.9</a>,                 floating types, <a href="#6.2.5">6.2.5</a>, <a href="#6.11.1">6.11.1</a>
+     <a href="#F.10">F.10</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>,
+fenv_t type, <a href="#7.6">7.6</a>                                                  <a href="#7.22.1.3">7.22.1.3</a>, <a href="#F.5">F.5</a>, see also contracted expression
+feof function, <a href="#7.21.10.2">7.21.10.2</a>                                     floating-point arithmetic functions, <a href="#7.12">7.12</a>, <a href="#F.10">F.10</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>                  floating-point classification functions, <a href="#7.12.3">7.12.3</a>
+ferror function, <a href="#7.21.10.3">7.21.10.3</a>                                   floating-point control mode, <a href="#7.6">7.6</a>, <a href="#F.8.6">F.8.6</a>
+fesetenv function, <a href="#7.6.4.3">7.6.4.3</a>, <a href="#F.3">F.3</a>                              floating-point environment, <a href="#7.6">7.6</a>, <a href="#F.8">F.8</a>, <a href="#F.8.6">F.8.6</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>                floating-point exception, <a href="#7.6">7.6</a>, <a href="#7.6.2">7.6.2</a>, <a href="#F.10">F.10</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>                       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>
+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>                   floating-point rounding mode, <a href="#5.2.4.2.2">5.2.4.2.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>                  floating-point status flag, <a href="#7.6">7.6</a>, <a href="#F.8.6">F.8.6</a>
+fexcept_t type, <a href="#7.6">7.6</a>, <a href="#F.3">F.3</a>                                     floor functions, <a href="#7.12.9.2">7.12.9.2</a>, <a href="#F.10.6.2">F.10.6.2</a>
+fflush function, <a href="#7.21.5.2">7.21.5.2</a>, <a href="#7.21.5.3">7.21.5.3</a>                          floor type-generic macro, <a href="#7.24">7.24</a>
+fgetc function, <a href="#7.21.1">7.21.1</a>, <a href="#7.21.3">7.21.3</a>, <a href="#7.21.7.1">7.21.7.1</a>,                    FLT_DECIMAL_DIG macro, <a href="#5.2.4.2.2">5.2.4.2.2</a>
+     <a href="#7.21.7.5">7.21.7.5</a>, <a href="#7.21.8.1">7.21.8.1</a>                                      FLT_DIG macro, <a href="#5.2.4.2.2">5.2.4.2.2</a>
+fgetpos function, <a href="#7.21.2">7.21.2</a>, <a href="#7.21.9.1">7.21.9.1</a>, <a href="#7.21.9.3">7.21.9.3</a>                 FLT_EPSILON macro, <a href="#5.2.4.2.2">5.2.4.2.2</a>
+fgets function, <a href="#7.21.1">7.21.1</a>, <a href="#7.21.7.2">7.21.7.2</a>, <a href="#K.3.5.4.1">K.3.5.4.1</a>                  FLT_EVAL_METHOD macro, <a href="#5.2.4.2.2">5.2.4.2.2</a>, <a href="#6.6">6.6</a>, <a href="#7.12">7.12</a>,
+fgetwc function, <a href="#7.21.1">7.21.1</a>, <a href="#7.21.3">7.21.3</a>, <a href="#7.28.3.1">7.28.3.1</a>,                        <a href="#F.10.11">F.10.11</a>
+     <a href="#7.28.3.6">7.28.3.6</a>                                                FLT_HAS_SUBNORM macro, <a href="#5.2.4.2.2">5.2.4.2.2</a>
+fgetws function, <a href="#7.21.1">7.21.1</a>, <a href="#7.28.3.2">7.28.3.2</a>                            FLT_MANT_DIG macro, <a href="#5.2.4.2.2">5.2.4.2.2</a>
+field width, <a href="#7.21.6.1">7.21.6.1</a>, <a href="#7.28.2.1">7.28.2.1</a>                               FLT_MAX macro, <a href="#5.2.4.2.2">5.2.4.2.2</a>
+file, <a href="#7.21.3">7.21.3</a>                                                  FLT_MAX_10_EXP macro, <a href="#5.2.4.2.2">5.2.4.2.2</a>
+  access functions, <a href="#7.21.5">7.21.5</a>, <a href="#K.3.5.2">K.3.5.2</a>                          FLT_MAX_EXP macro, <a href="#5.2.4.2.2">5.2.4.2.2</a>
+  name, <a href="#7.21.3">7.21.3</a>                                               FLT_MIN macro, <a href="#5.2.4.2.2">5.2.4.2.2</a>
+  operations, <a href="#7.21.4">7.21.4</a>, <a href="#K.3.5.1">K.3.5.1</a>                                FLT_MIN_10_EXP macro, <a href="#5.2.4.2.2">5.2.4.2.2</a>
+  position indicator, <a href="#7.21.1">7.21.1</a>, <a href="#7.21.2">7.21.2</a>, <a href="#7.21.3">7.21.3</a>,                FLT_MIN_EXP macro, <a href="#5.2.4.2.2">5.2.4.2.2</a>
+        <a href="#7.21.5.3">7.21.5.3</a>, <a href="#7.21.7.1">7.21.7.1</a>, <a href="#7.21.7.3">7.21.7.3</a>, <a href="#7.21.7.10">7.21.7.10</a>,             FLT_RADIX macro, <a href="#5.2.4.2.2">5.2.4.2.2</a>, <a href="#7.21.6.1">7.21.6.1</a>, <a href="#7.22.1.3">7.22.1.3</a>,
+        <a href="#7.21.8.1">7.21.8.1</a>, <a href="#7.21.8.2">7.21.8.2</a>, <a href="#7.21.9.1">7.21.9.1</a>, <a href="#7.21.9.2">7.21.9.2</a>,                   <a href="#7.28.2.1">7.28.2.1</a>, <a href="#7.28.4.1.1">7.28.4.1.1</a>
+        <a href="#7.21.9.3">7.21.9.3</a>, <a href="#7.21.9.4">7.21.9.4</a>, <a href="#7.21.9.5">7.21.9.5</a>, <a href="#7.28.3.1">7.28.3.1</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.28.3.3">7.28.3.3</a>, <a href="#7.28.3.10">7.28.3.10</a>                                  FLT_TRUE_MIN macro, <a href="#5.2.4.2.2">5.2.4.2.2</a>
+  positioning functions, <a href="#7.21.9">7.21.9</a>                              fma functions, <a href="#7.12">7.12</a>, <a href="#7.12.13.1">7.12.13.1</a>, <a href="#F.10.10.1">F.10.10.1</a>
+file scope, <a href="#6.2.1">6.2.1</a>, <a href="#6.9">6.9</a>                                        fma type-generic macro, <a href="#7.24">7.24</a>
+FILE type, <a href="#7.21.1">7.21.1</a>, <a href="#7.21.3">7.21.3</a>                                    fmax functions, <a href="#7.12.12.2">7.12.12.2</a>, <a href="#F.10.9.2">F.10.9.2</a>
+FILENAME_MAX macro, <a href="#7.21.1">7.21.1</a>                                   fmax type-generic macro, <a href="#7.24">7.24</a>
+flags, <a href="#7.21.6.1">7.21.6.1</a>, <a href="#7.28.2.1">7.28.2.1</a>, see also floating-point             fmin functions, <a href="#7.12.12.3">7.12.12.3</a>, <a href="#F.10.9.3">F.10.9.3</a>
+     status flag                                              fmin type-generic macro, <a href="#7.24">7.24</a>
+flexible array member, <a href="#6.7.2.1">6.7.2.1</a>                                fmod functions, <a href="#7.12.10.1">7.12.10.1</a>, <a href="#F.10.7.1">F.10.7.1</a>
+float _Complex type, <a href="#6.2.5">6.2.5</a>                                   fmod type-generic macro, <a href="#7.24">7.24</a>
+
+[<a name="#p662" href="p662">page 662</a>] (<a href="#Contents">Contents</a>)
+
+fopen function, <a href="#7.21.5.3">7.21.5.3</a>, <a href="#7.21.5.4">7.21.5.4</a>, <a href="#K.3.5.2.1">K.3.5.2.1</a>                       <a href="#K.3.5.3.7">K.3.5.3.7</a>, <a href="#K.3.5.3.9">K.3.5.3.9</a>
+FOPEN_MAX macro, <a href="#7.21.1">7.21.1</a>, <a href="#7.21.3">7.21.3</a>, <a href="#7.21.4.3">7.21.4.3</a>,                    fseek function, <a href="#7.21.1">7.21.1</a>, <a href="#7.21.5.3">7.21.5.3</a>, <a href="#7.21.7.10">7.21.7.10</a>,
+     <a href="#K.3.5.1.1">K.3.5.1.1</a>                                                      <a href="#7.21.9.2">7.21.9.2</a>, <a href="#7.21.9.4">7.21.9.4</a>, <a href="#7.21.9.5">7.21.9.5</a>, <a href="#7.28.3.10">7.28.3.10</a>
+fopen_s function, <a href="#K.3.5.1.1">K.3.5.1.1</a>, <a href="#K.3.5.2.1">K.3.5.2.1</a>,                       fsetpos function, <a href="#7.21.2">7.21.2</a>, <a href="#7.21.5.3">7.21.5.3</a>, <a href="#7.21.7.10">7.21.7.10</a>,
+     <a href="#K.3.5.2.2">K.3.5.2.2</a>                                                      <a href="#7.21.9.1">7.21.9.1</a>, <a href="#7.21.9.3">7.21.9.3</a>, <a href="#7.28.3.10">7.28.3.10</a>
+for statement, <a href="#6.8.5">6.8.5</a>, <a href="#6.8.5.3">6.8.5.3</a>                                 ftell function, <a href="#7.21.9.2">7.21.9.2</a>, <a href="#7.21.9.4">7.21.9.4</a>
+form-feed character, <a href="#5.2.1">5.2.1</a>, <a href="#6.4">6.4</a>                               full declarator, <a href="#6.7.6">6.7.6</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>,               full expression, <a href="#6.8">6.8</a>
+     <a href="#7.4.1.10">7.4.1.10</a>                                                 fully buffered stream, <a href="#7.21.3">7.21.3</a>
+formal argument (deprecated), <a href="#3.16">3.16</a>                            function
+formal parameter, <a href="#3.16">3.16</a>                                           argument, <a href="#6.5.2.2">6.5.2.2</a>, <a href="#6.9.1">6.9.1</a>
+formatted input/output functions, <a href="#7.11.1.1">7.11.1.1</a>, <a href="#7.21.6">7.21.6</a>,              body, <a href="#6.9.1">6.9.1</a>
+     <a href="#K.3.5.3">K.3.5.3</a>                                                     call, <a href="#6.5.2.2">6.5.2.2</a>
+   wide character, <a href="#7.28.2">7.28.2</a>, <a href="#K.3.9.1">K.3.9.1</a>                                  library, <a href="#7.1.4">7.1.4</a>
+fortran keyword, <a href="#J.5.9">J.5.9</a>                                           declarator, <a href="#6.7.6.3">6.7.6.3</a>, <a href="#6.11.6">6.11.6</a>
+forward reference, <a href="#3.11">3.11</a>                                          definition, <a href="#6.7.6.3">6.7.6.3</a>, <a href="#6.9.1">6.9.1</a>, <a href="#6.11.7">6.11.7</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                     designator, <a href="#6.3.2.1">6.3.2.1</a>
+     also contracted expression                                  image, <a href="#5.2.3">5.2.3</a>
+FP_FAST_FMA macro, <a href="#7.12">7.12</a>                                          inline, <a href="#6.7.4">6.7.4</a>
+FP_FAST_FMAF macro, <a href="#7.12">7.12</a>                                         library, <a href="#5.1.1.1">5.1.1.1</a>, <a href="#7.1.4">7.1.4</a>
+FP_FAST_FMAL macro, <a href="#7.12">7.12</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>
+FP_ILOGB0 macro, <a href="#7.12">7.12</a>, <a href="#7.12.6.5">7.12.6.5</a>                                  no-return, <a href="#6.7.4">6.7.4</a>
+FP_ILOGBNAN macro, <a href="#7.12">7.12</a>, <a href="#7.12.6.5">7.12.6.5</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>
+FP_INFINITE macro, <a href="#7.12">7.12</a>, <a href="#F.3">F.3</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>,
+FP_NAN macro, <a href="#7.12">7.12</a>, <a href="#F.3">F.3</a>                                                <a href="#6.7.6.3">6.7.6.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>
+FP_NORMAL macro, <a href="#7.12">7.12</a>, <a href="#F.3">F.3</a>                                       prototype scope, <a href="#6.2.1">6.2.1</a>, <a href="#6.7.6.2">6.7.6.2</a>
+FP_SUBNORMAL macro, <a href="#7.12">7.12</a>, <a href="#F.3">F.3</a>                                    recursive call, <a href="#6.5.2.2">6.5.2.2</a>
+FP_ZERO macro, <a href="#7.12">7.12</a>, <a href="#F.3">F.3</a>                                         return, <a href="#6.8.6.4">6.8.6.4</a>, <a href="#F.6">F.6</a>
+fpclassify macro, <a href="#7.12.3.1">7.12.3.1</a>, <a href="#F.3">F.3</a>                                  scope, <a href="#6.2.1">6.2.1</a>
+fpos_t type, <a href="#7.21.1">7.21.1</a>, <a href="#7.21.2">7.21.2</a>                                      type, <a href="#6.2.5">6.2.5</a>
+fprintf function, <a href="#7.8.1">7.8.1</a>, <a href="#7.21.1">7.21.1</a>, <a href="#7.21.6.1">7.21.6.1</a>,                       type conversion, <a href="#6.3.2.1">6.3.2.1</a>
+     <a href="#7.21.6.2">7.21.6.2</a>, <a href="#7.21.6.3">7.21.6.3</a>, <a href="#7.21.6.5">7.21.6.5</a>, <a href="#7.21.6.6">7.21.6.6</a>,                  function specifiers, <a href="#6.7.4">6.7.4</a>
+     <a href="#7.21.6.8">7.21.6.8</a>, <a href="#7.28.2.2">7.28.2.2</a>, <a href="#F.3">F.3</a>, <a href="#K.3.5.3.1">K.3.5.3.1</a>                       function type, <a href="#6.2.5">6.2.5</a>
+fprintf_s function, <a href="#K.3.5.3.1">K.3.5.3.1</a>                                 function-call operator (( )), <a href="#6.5.2.2">6.5.2.2</a>
+fputc function, <a href="#5.2.2">5.2.2</a>, <a href="#7.21.1">7.21.1</a>, <a href="#7.21.3">7.21.3</a>, <a href="#7.21.7.3">7.21.7.3</a>,              function-like macro, <a href="#6.10.3">6.10.3</a>
+     <a href="#7.21.7.7">7.21.7.7</a>, <a href="#7.21.8.2">7.21.8.2</a>                                       fundamental alignment, <a href="#6.2.8">6.2.8</a>
+fputs function, <a href="#7.21.1">7.21.1</a>, <a href="#7.21.7.4">7.21.7.4</a>                              future directions
+fputwc function, <a href="#7.21.1">7.21.1</a>, <a href="#7.21.3">7.21.3</a>, <a href="#7.28.3.3">7.28.3.3</a>,                       language, <a href="#6.11">6.11</a>
+     <a href="#7.28.3.8">7.28.3.8</a>                                                    library, <a href="#7.30">7.30</a>
+fputws function, <a href="#7.21.1">7.21.1</a>, <a href="#7.28.3.4">7.28.3.4</a>                             fwide function, <a href="#7.21.2">7.21.2</a>, <a href="#7.28.3.5">7.28.3.5</a>
+fread function, <a href="#7.21.1">7.21.1</a>, <a href="#7.21.8.1">7.21.8.1</a>                              fwprintf function, <a href="#7.8.1">7.8.1</a>, <a href="#7.21.1">7.21.1</a>, <a href="#7.21.6.2">7.21.6.2</a>,
+free function, <a href="#7.22.3.3">7.22.3.3</a>, <a href="#7.22.3.5">7.22.3.5</a>                                   <a href="#7.28.2.1">7.28.2.1</a>, <a href="#7.28.2.2">7.28.2.2</a>, <a href="#7.28.2.3">7.28.2.3</a>, <a href="#7.28.2.5">7.28.2.5</a>,
+freestanding execution environment, <a href="#4">4</a>, <a href="#5.1.2">5.1.2</a>,                       <a href="#7.28.2.11">7.28.2.11</a>, <a href="#K.3.9.1.1">K.3.9.1.1</a>
+     <a href="#5.1.2.1">5.1.2.1</a>                                                  fwprintf_s function, <a href="#K.3.9.1.1">K.3.9.1.1</a>
+freopen function, <a href="#7.21.2">7.21.2</a>, <a href="#7.21.5.4">7.21.5.4</a>                            fwrite function, <a href="#7.21.1">7.21.1</a>, <a href="#7.21.8.2">7.21.8.2</a>
+freopen_s function, <a href="#K.3.5.2.2">K.3.5.2.2</a>                                 fwscanf function, <a href="#7.8.1">7.8.1</a>, <a href="#7.21.1">7.21.1</a>, <a href="#7.28.2.2">7.28.2.2</a>,
+frexp functions, <a href="#7.12.6.4">7.12.6.4</a>, <a href="#F.10.3.4">F.10.3.4</a>                                 <a href="#7.28.2.4">7.28.2.4</a>, <a href="#7.28.2.6">7.28.2.6</a>, <a href="#7.28.2.12">7.28.2.12</a>, <a href="#7.28.3.10">7.28.3.10</a>,
+frexp type-generic macro, <a href="#7.24">7.24</a>                                      <a href="#K.3.9.1.2">K.3.9.1.2</a>
+fscanf function, <a href="#7.8.1">7.8.1</a>, <a href="#7.21.1">7.21.1</a>, <a href="#7.21.6.2">7.21.6.2</a>,                     fwscanf_s function, <a href="#K.3.9.1.2">K.3.9.1.2</a>, <a href="#K.3.9.1.5">K.3.9.1.5</a>,
+     <a href="#7.21.6.4">7.21.6.4</a>, <a href="#7.21.6.7">7.21.6.7</a>, <a href="#7.21.6.9">7.21.6.9</a>, <a href="#F.3">F.3</a>, <a href="#K.3.5.3.2">K.3.5.3.2</a>                   <a href="#K.3.9.1.7">K.3.9.1.7</a>, <a href="#K.3.9.1.14">K.3.9.1.14</a>
+fscanf_s function, <a href="#K.3.5.3.2">K.3.5.3.2</a>, <a href="#K.3.5.3.4">K.3.5.3.4</a>,
+
+[<a name="#p663" href="p663">page 663</a>] (<a href="#Contents">Contents</a>)
+
+gamma functions, <a href="#7.12.8">7.12.8</a>, <a href="#F.10.5">F.10.5</a>                               name spaces, <a href="#6.2.3">6.2.3</a>
+general utilities, <a href="#7.22">7.22</a>, <a href="#K.3.6">K.3.6</a>                                reserved, <a href="#6.4.1">6.4.1</a>, <a href="#7.1.3">7.1.3</a>, <a href="#K.3.1.2">K.3.1.2</a>
+  wide string, <a href="#7.28.4">7.28.4</a>, <a href="#K.3.9.2">K.3.9.2</a>                                 scope, <a href="#6.2.1">6.2.1</a>
+general wide string utilities, <a href="#7.28.4">7.28.4</a>, <a href="#K.3.9.2">K.3.9.2</a>                 type, <a href="#6.2.5">6.2.5</a>
+generic parameters, <a href="#7.24">7.24</a>                                    identifier list, <a href="#6.7.6">6.7.6</a>
+generic selection, <a href="#6.5.1.1">6.5.1.1</a>                                  identifier nondigit, <a href="#6.4.2.1">6.4.2.1</a>
+getc function, <a href="#7.21.1">7.21.1</a>, <a href="#7.21.7.5">7.21.7.5</a>, <a href="#7.21.7.6">7.21.7.6</a>                   IEC 559, <a href="#F.1">F.1</a>
+getchar function, <a href="#7.21.1">7.21.1</a>, <a href="#7.21.7.6">7.21.7.6</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.3">6.10.8.3</a>, <a href="#7.3.3">7.3.3</a>,
+getenv function, <a href="#7.22.4.6">7.22.4.6</a>                                         <a href="#7.6">7.6</a>, <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>,
+getenv_s function, <a href="#K.3.6.2.1">K.3.6.2.1</a>                                      <a href="#H.1">H.1</a>
+gets function, <a href="#K.3.5.4.1">K.3.5.4.1</a>                                    IEEE 754, <a href="#F.1">F.1</a>
+gets_s function, <a href="#K.3.5.4.1">K.3.5.4.1</a>                                  IEEE 854, <a href="#F.1">F.1</a>
+getwc function, <a href="#7.21.1">7.21.1</a>, <a href="#7.28.3.6">7.28.3.6</a>, <a href="#7.28.3.7">7.28.3.7</a>                  IEEE floating-point arithmetic standard, see
+getwchar function, <a href="#7.21.1">7.21.1</a>, <a href="#7.28.3.7">7.28.3.7</a>                               IEC 60559, ANSI/IEEE 754,
+gmtime function, <a href="#7.26.3.3">7.26.3.3</a>                                         ANSI/IEEE 854
+gmtime_s function, <a href="#K.3.8.2.3">K.3.8.2.3</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>,
+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>                             <a href="#6.10.1">6.10.1</a>, <a href="#7.1.4">7.1.4</a>
+graphic characters, <a href="#5.2.1">5.2.1</a>                                   if statement, <a href="#6.8.4.1">6.8.4.1</a>
+greater-than operator (&gt;), <a href="#6.5.8">6.5.8</a>                            ifdef preprocessing directive, <a href="#6.10.1">6.10.1</a>
+greater-than-or-equal-to operator (&gt;=), <a href="#6.5.8">6.5.8</a>               ifndef preprocessing directive, <a href="#6.10.1">6.10.1</a>
+                                                            ignore_handler_s function, <a href="#K.3.6.1.3">K.3.6.1.3</a>
+happens before, <a href="#5.1.2.4">5.1.2.4</a>                                     ilogb functions, <a href="#7.12">7.12</a>, <a href="#7.12.6.5">7.12.6.5</a>, <a href="#F.10.3.5">F.10.3.5</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           ilogb type-generic macro, <a href="#7.24">7.24</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>                            imaginary macro, <a href="#7.3.1">7.3.1</a>, <a href="#G.6">G.6</a>
+hexadecimal constant, <a href="#6.4.4.1">6.4.4.1</a>                               imaginary numbers, <a href="#G">G</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>                imaginary type domain, <a href="#G.2">G.2</a>
+hexadecimal prefix, <a href="#6.4.4.1">6.4.4.1</a>                                  imaginary types, <a href="#G">G</a>
+hexadecimal-character escape sequence                       imaxabs function, <a href="#7.8.2.1">7.8.2.1</a>
+     (\x hexadecimal digits), <a href="#6.4.4.4">6.4.4.4</a>                       imaxdiv function, <a href="#7.8">7.8</a>, <a href="#7.8.2.2">7.8.2.2</a>
+high-order bit, <a href="#3.6">3.6</a>                                         imaxdiv_t type, <a href="#7.8">7.8</a>
+horizontal-tab character, <a href="#5.2.1">5.2.1</a>, <a href="#6.4">6.4</a>                        implementation, <a href="#3.12">3.12</a>
+horizontal-tab escape sequence (\r), <a href="#7.29.2.1.3">7.29.2.1.3</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>,
+horizontal-tab escape sequence (\t), <a href="#5.2.2">5.2.2</a>,                       <a href="#6.7.6">6.7.6</a>, <a href="#6.8.4.2">6.8.4.2</a>, <a href="#E">E</a>, see also environmental
+     <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>                                   limits
+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>             implementation-defined behavior, <a href="#3.4.1">3.4.1</a>, <a href="#4">4</a>, <a href="#J.3">J.3</a>
+HUGE_VAL macro, <a href="#7.12">7.12</a>, <a href="#7.12.1">7.12.1</a>, <a href="#7.22.1.3">7.22.1.3</a>,                     implementation-defined value, <a href="#3.19.1">3.19.1</a>
+     <a href="#7.28.4.1.1">7.28.4.1.1</a>, <a href="#F.10">F.10</a>                                       implicit conversion, <a href="#6.3">6.3</a>
+HUGE_VALF macro, <a href="#7.12">7.12</a>, <a href="#7.12.1">7.12.1</a>, <a href="#7.22.1.3">7.22.1.3</a>,                    implicit initialization, <a href="#6.7.9">6.7.9</a>
+     <a href="#7.28.4.1.1">7.28.4.1.1</a>, <a href="#F.10">F.10</a>                                       include preprocessing directive, <a href="#5.1.1.2">5.1.1.2</a>, <a href="#6.10.2">6.10.2</a>
+HUGE_VALL macro, <a href="#7.12">7.12</a>, <a href="#7.12.1">7.12.1</a>, <a href="#7.22.1.3">7.22.1.3</a>,                    inclusive OR operators
+     <a href="#7.28.4.1.1">7.28.4.1.1</a>, <a href="#F.10">F.10</a>                                         bitwise (|), <a href="#6.2.6.2">6.2.6.2</a>, <a href="#6.5.12">6.5.12</a>
+hyperbolic functions                                           bitwise assignment (|=), <a href="#6.5.16.2">6.5.16.2</a>
+  complex, <a href="#7.3.6">7.3.6</a>, <a href="#G.6.2">G.6.2</a>                                     incomplete type, <a href="#6.2.5">6.2.5</a>
+  real, <a href="#7.12.5">7.12.5</a>, <a href="#F.10.2">F.10.2</a>                                      increment operators, see arithmetic operators,
+hypot functions, <a href="#7.12.7.3">7.12.7.3</a>, <a href="#F.10.4.3">F.10.4.3</a>                               increment and decrement
+hypot type-generic macro, <a href="#7.24">7.24</a>                              indeterminate value, <a href="#3.19.2">3.19.2</a>
+                                                            indeterminately sequenced, <a href="#5.1.2.3">5.1.2.3</a>, <a href="#6.5.2.2">6.5.2.2</a>,
+I macro, <a href="#7.3.1">7.3.1</a>, <a href="#7.3.9.5">7.3.9.5</a>, <a href="#G.6">G.6</a>                                      <a href="#6.5.2.4">6.5.2.4</a>, <a href="#6.5.16.2">6.5.16.2</a>, see also sequenced before,
+identifier, <a href="#6.4.2.1">6.4.2.1</a>, <a href="#6.5.1">6.5.1</a>                                         unsequenced
+   linkage, see linkage                                     indirection operator (*), <a href="#6.5.2.1">6.5.2.1</a>, <a href="#6.5.3.2">6.5.3.2</a>
+   maximum length, <a href="#6.4.2.1">6.4.2.1</a>                                  inequality operator (!=), <a href="#6.5.9">6.5.9</a>
+
+[<a name="#p664" href="p664">page 664</a>] (<a href="#Contents">Contents</a>)
+
+infinitary, <a href="#7.12.1">7.12.1</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.20">7.20</a>
+INFINITY macro, <a href="#7.3.9.5">7.3.9.5</a>, <a href="#7.12">7.12</a>, <a href="#F.2.1">F.2.1</a>                              inter-thread happens before, <a href="#5.1.2.4">5.1.2.4</a>
+initial position, <a href="#5.2.2">5.2.2</a>                                           interactive device, <a href="#5.1.2.3">5.1.2.3</a>, <a href="#7.21.3">7.21.3</a>, <a href="#7.21.5.3">7.21.5.3</a>
+initial shift state, <a href="#5.2.1.2">5.2.1.2</a>                                      internal linkage, <a href="#6.2.2">6.2.2</a>
+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.9">6.7.9</a>,            internal name, <a href="#6.4.2.1">6.4.2.1</a>
+      <a href="#F.8.5">F.8.5</a>                                                       interrupt, <a href="#5.2.3">5.2.3</a>
+   in blocks, <a href="#6.8">6.8</a>                                                 INTMAX_C macro, <a href="#7.20.4.2">7.20.4.2</a>
+initializer, <a href="#6.7.9">6.7.9</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.20.2.5">7.20.2.5</a>
+   permitted form, <a href="#6.6">6.6</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.20.2.5">7.20.2.5</a>
+   string literal, <a href="#6.3.2.1">6.3.2.1</a>                                        intmax_t type, <a href="#7.20.1.5">7.20.1.5</a>, <a href="#7.21.6.1">7.21.6.1</a>, <a href="#7.21.6.2">7.21.6.2</a>,
+inline, <a href="#6.7.4">6.7.4</a>                                                           <a href="#7.28.2.1">7.28.2.1</a>, <a href="#7.28.2.2">7.28.2.2</a>
+inner scope, <a href="#6.2.1">6.2.1</a>                                                INTN_C macros, <a href="#7.20.4.1">7.20.4.1</a>
+input failure, <a href="#7.28.2.6">7.28.2.6</a>, <a href="#7.28.2.8">7.28.2.8</a>, <a href="#7.28.2.10">7.28.2.10</a>,                     INTN_MAX macros, <a href="#7.20.2.1">7.20.2.1</a>
+      <a href="#K.3.5.3.2">K.3.5.3.2</a>, <a href="#K.3.5.3.4">K.3.5.3.4</a>, <a href="#K.3.5.3.7">K.3.5.3.7</a>, <a href="#K.3.5.3.9">K.3.5.3.9</a>,                 INTN_MIN macros, <a href="#7.20.2.1">7.20.2.1</a>
+      <a href="#K.3.5.3.11">K.3.5.3.11</a>, <a href="#K.3.5.3.14">K.3.5.3.14</a>, <a href="#K.3.9.1.2">K.3.9.1.2</a>, <a href="#K.3.9.1.5">K.3.9.1.5</a>,               intN_t types, <a href="#7.20.1.1">7.20.1.1</a>
+      <a href="#K.3.9.1.7">K.3.9.1.7</a>, <a href="#K.3.9.1.10">K.3.9.1.10</a>, <a href="#K.3.9.1.12">K.3.9.1.12</a>, <a href="#K.3.9.1.14">K.3.9.1.14</a>               INTPTR_MAX macro, <a href="#7.20.2.4">7.20.2.4</a>
+input/output functions                                            INTPTR_MIN macro, <a href="#7.20.2.4">7.20.2.4</a>
+   character, <a href="#7.21.7">7.21.7</a>, <a href="#K.3.5.4">K.3.5.4</a>                                     intptr_t type, <a href="#7.20.1.4">7.20.1.4</a>
+   direct, <a href="#7.21.8">7.21.8</a>                                                 inttypes.h header, <a href="#7.8">7.8</a>, <a href="#7.30.4">7.30.4</a>
+   formatted, <a href="#7.21.6">7.21.6</a>, <a href="#K.3.5.3">K.3.5.3</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>
+      wide character, <a href="#7.28.2">7.28.2</a>, <a href="#K.3.9.1">K.3.9.1</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>
+   wide character, <a href="#7.28.3">7.28.3</a>                                         isblank function, <a href="#7.4.1.3">7.4.1.3</a>
+      formatted, <a href="#7.28.2">7.28.2</a>, <a href="#K.3.9.1">K.3.9.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>,
+input/output header, <a href="#7.21">7.21</a>, <a href="#K.3.5">K.3.5</a>                                        <a href="#7.4.1.11">7.4.1.11</a>
+input/output, device, <a href="#5.1.2.3">5.1.2.3</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>,
+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>                       <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>
+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>,                   isfinite macro, <a href="#7.12.3.2">7.12.3.2</a>, <a href="#F.3">F.3</a>
+      <a href="#6.3.1.8">6.3.1.8</a>                                                     isgraph function, <a href="#7.4.1.6">7.4.1.6</a>
+INT_FASTN_MAX macros, <a href="#7.20.2.3">7.20.2.3</a>                                    isgreater macro, <a href="#7.12.14.1">7.12.14.1</a>, <a href="#F.3">F.3</a>
+INT_FASTN_MIN macros, <a href="#7.20.2.3">7.20.2.3</a>                                    isgreaterequal macro, <a href="#7.12.14.2">7.12.14.2</a>, <a href="#F.3">F.3</a>
+int_fastN_t types, <a href="#7.20.1.3">7.20.1.3</a>                                       isinf macro, <a href="#7.12.3.3">7.12.3.3</a>
+INT_LEASTN_MAX macros, <a href="#7.20.2.2">7.20.2.2</a>                                   isless macro, <a href="#7.12.14.3">7.12.14.3</a>, <a href="#F.3">F.3</a>
+INT_LEASTN_MIN macros, <a href="#7.20.2.2">7.20.2.2</a>                                   islessequal macro, <a href="#7.12.14.4">7.12.14.4</a>, <a href="#F.3">F.3</a>
+int_leastN_t types, <a href="#7.20.1.2">7.20.1.2</a>                                      islessgreater macro, <a href="#7.12.14.5">7.12.14.5</a>, <a href="#F.3">F.3</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>                          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>,
+INT_MIN macro, <a href="#5.2.4.2.1">5.2.4.2.1</a>, <a href="#7.12">7.12</a>                                          <a href="#7.4.2.2">7.4.2.2</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>,                   isnan macro, <a href="#7.12.3.4">7.12.3.4</a>, <a href="#F.3">F.3</a>
+      <a href="#7.22.6">7.22.6</a>                                                      isnormal macro, <a href="#7.12.3.5">7.12.3.5</a>
+integer character constant, <a href="#6.4.4.4">6.4.4.4</a>                               ISO 31-11, <a href="#2">2</a>, <a href="#3">3</a>
+integer constant, <a href="#6.4.4.1">6.4.4.1</a>                                         ISO 4217, <a href="#2">2</a>, <a href="#7.11.2.1">7.11.2.1</a>
+integer constant expression, <a href="#6.3.2.3">6.3.2.3</a>, <a href="#6.6">6.6</a>, <a href="#6.7.2.1">6.7.2.1</a>,               ISO 8601, <a href="#2">2</a>, <a href="#7.26.3.5">7.26.3.5</a>
+      <a href="#6.7.2.2">6.7.2.2</a>, <a href="#6.7.6.2">6.7.6.2</a>, <a href="#6.7.9">6.7.9</a>, <a href="#6.7.10">6.7.10</a>, <a href="#6.8.4.2">6.8.4.2</a>, <a href="#6.10.1">6.10.1</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.2">6.10.8.2</a>
+      <a href="#7.1.4">7.1.4</a>                                                       ISO/IEC 10976-1, <a href="#H.1">H.1</a>
+integer conversion rank, <a href="#6.3.1.1">6.3.1.1</a>                                  ISO/IEC 2382-1, <a href="#2">2</a>, <a href="#3">3</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>,                  ISO/IEC 646, <a href="#2">2</a>, <a href="#5.2.1.1">5.2.1.1</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.20.2">7.20.2</a>, <a href="#7.20.3">7.20.3</a>,           ISO/IEC 9945-2, <a href="#7.11">7.11</a>
+      <a href="#7.21.6.1">7.21.6.1</a>, <a href="#7.28.2.1">7.28.2.1</a>                                          iso646.h header, <a href="#4">4</a>, <a href="#7.9">7.9</a>                          *
+integer suffix, <a href="#6.4.4.1">6.4.4.1</a>                                            isprint function, <a href="#5.2.2">5.2.2</a>, <a href="#7.4.1.8">7.4.1.8</a>
+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>,               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>,
+      <a href="#F.3">F.3</a>, <a href="#F.4">F.4</a>                                                          <a href="#7.4.1.11">7.4.1.11</a>
+integer types, <a href="#6.2.5">6.2.5</a>, <a href="#7.20">7.20</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>,
+
+[<a name="#p665" href="p665">page 665</a>] (<a href="#Contents">Contents</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.21.6.2">7.21.6.2</a>, <a href="#7.22.1.3">7.22.1.3</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>
+      <a href="#7.22.1.4">7.22.1.4</a>, <a href="#7.28.2.2">7.28.2.2</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.23.4.3">7.23.4.3</a>,
+isunordered macro, <a href="#7.12.14.6">7.12.14.6</a>, <a href="#F.3">F.3</a>                                     <a href="#7.28.4.4.2">7.28.4.4.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>,                   LC_CTYPE macro, <a href="#7.11">7.11</a>, <a href="#7.11.1.1">7.11.1.1</a>, <a href="#7.22">7.22</a>, <a href="#7.22.7">7.22.7</a>,
+      <a href="#7.4.2.2">7.4.2.2</a>                                                         <a href="#7.22.8">7.22.8</a>, <a href="#7.28.6">7.28.6</a>, <a href="#7.29.1">7.29.1</a>, <a href="#7.29.2.2.1">7.29.2.2.1</a>, <a href="#7.29.2.2.2">7.29.2.2.2</a>,
+iswalnum function, <a href="#7.29.2.1.1">7.29.2.1.1</a>, <a href="#7.29.2.1.9">7.29.2.1.9</a>,                            <a href="#7.29.3.2.1">7.29.3.2.1</a>, <a href="#7.29.3.2.2">7.29.3.2.2</a>, <a href="#K.3.6.4">K.3.6.4</a>, <a href="#K.3.6.5">K.3.6.5</a>
+      <a href="#7.29.2.1.10">7.29.2.1.10</a>, <a href="#7.29.2.2.1">7.29.2.2.1</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>
+iswalpha function, <a href="#7.29.2.1.1">7.29.2.1.1</a>, <a href="#7.29.2.1.2">7.29.2.1.2</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.29.2.2.1">7.29.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.26.3.5">7.26.3.5</a>
+iswblank function, <a href="#7.29.2.1.3">7.29.2.1.3</a>, <a href="#7.29.2.2.1">7.29.2.2.1</a>                       lconv structure type, <a href="#7.11">7.11</a>
+iswcntrl function, <a href="#7.29.2.1.2">7.29.2.1.2</a>, <a href="#7.29.2.1.4">7.29.2.1.4</a>,                      LDBL_DECIMAL_DIG macro, <a href="#5.2.4.2.2">5.2.4.2.2</a>
+      <a href="#7.29.2.1.7">7.29.2.1.7</a>, <a href="#7.29.2.1.11">7.29.2.1.11</a>, <a href="#7.29.2.2.1">7.29.2.2.1</a>                       LDBL_DIG macro, <a href="#5.2.4.2.2">5.2.4.2.2</a>
+iswctype function, <a href="#7.29.2.2.1">7.29.2.2.1</a>, <a href="#7.29.2.2.2">7.29.2.2.2</a>                       LDBL_EPSILON macro, <a href="#5.2.4.2.2">5.2.4.2.2</a>
+iswdigit function, <a href="#7.29.2.1.1">7.29.2.1.1</a>, <a href="#7.29.2.1.2">7.29.2.1.2</a>,                      LDBL_HAS_SUBNORM macro, <a href="#5.2.4.2.2">5.2.4.2.2</a>
+      <a href="#7.29.2.1.5">7.29.2.1.5</a>, <a href="#7.29.2.1.7">7.29.2.1.7</a>, <a href="#7.29.2.1.11">7.29.2.1.11</a>, <a href="#7.29.2.2.1">7.29.2.2.1</a>           LDBL_MANT_DIG macro, <a href="#5.2.4.2.2">5.2.4.2.2</a>
+iswgraph function, <a href="#7.29.2.1">7.29.2.1</a>, <a href="#7.29.2.1.6">7.29.2.1.6</a>,                        LDBL_MAX macro, <a href="#5.2.4.2.2">5.2.4.2.2</a>
+      <a href="#7.29.2.1.10">7.29.2.1.10</a>, <a href="#7.29.2.2.1">7.29.2.2.1</a>                                   LDBL_MAX_10_EXP macro, <a href="#5.2.4.2.2">5.2.4.2.2</a>
+iswlower function, <a href="#7.29.2.1.2">7.29.2.1.2</a>, <a href="#7.29.2.1.7">7.29.2.1.7</a>,                      LDBL_MAX_EXP macro, <a href="#5.2.4.2.2">5.2.4.2.2</a>
+      <a href="#7.29.2.2.1">7.29.2.2.1</a>, <a href="#7.29.3.1.1">7.29.3.1.1</a>, <a href="#7.29.3.1.2">7.29.3.1.2</a>                        LDBL_MIN macro, <a href="#5.2.4.2.2">5.2.4.2.2</a>
+iswprint function, <a href="#7.29.2.1.6">7.29.2.1.6</a>, <a href="#7.29.2.1.8">7.29.2.1.8</a>,                      LDBL_MIN_10_EXP macro, <a href="#5.2.4.2.2">5.2.4.2.2</a>
+      <a href="#7.29.2.2.1">7.29.2.2.1</a>                                                LDBL_MIN_EXP macro, <a href="#5.2.4.2.2">5.2.4.2.2</a>
+iswpunct function, <a href="#7.29.2.1">7.29.2.1</a>, <a href="#7.29.2.1.2">7.29.2.1.2</a>,                        LDBL_TRUE_MIN macro, <a href="#5.2.4.2.2">5.2.4.2.2</a>
+      <a href="#7.29.2.1.7">7.29.2.1.7</a>, <a href="#7.29.2.1.9">7.29.2.1.9</a>, <a href="#7.29.2.1.10">7.29.2.1.10</a>,                      ldexp functions, <a href="#7.12.6.6">7.12.6.6</a>, <a href="#F.10.3.6">F.10.3.6</a>
+      <a href="#7.29.2.1.11">7.29.2.1.11</a>, <a href="#7.29.2.2.1">7.29.2.2.1</a>                                   ldexp type-generic macro, <a href="#7.24">7.24</a>
+iswspace function, <a href="#7.21.6.2">7.21.6.2</a>, <a href="#7.28.2.2">7.28.2.2</a>,                          ldiv function, <a href="#7.22.6.2">7.22.6.2</a>
+      <a href="#7.28.4.1.1">7.28.4.1.1</a>, <a href="#7.28.4.1.2">7.28.4.1.2</a>, <a href="#7.29.2.1.2">7.29.2.1.2</a>, <a href="#7.29.2.1.6">7.29.2.1.6</a>,           ldiv_t type, <a href="#7.22">7.22</a>
+      <a href="#7.29.2.1.7">7.29.2.1.7</a>, <a href="#7.29.2.1.9">7.29.2.1.9</a>, <a href="#7.29.2.1.10">7.29.2.1.10</a>,                      leading underscore in identifiers, <a href="#7.1.3">7.1.3</a>
+      <a href="#7.29.2.1.11">7.29.2.1.11</a>, <a href="#7.29.2.2.1">7.29.2.2.1</a>                                   left-shift assignment operator (&lt;&lt;=), <a href="#6.5.16.2">6.5.16.2</a>
+iswupper function, <a href="#7.29.2.1.2">7.29.2.1.2</a>, <a href="#7.29.2.1.11">7.29.2.1.11</a>,                     left-shift operator (&lt;&lt;), <a href="#6.2.6.2">6.2.6.2</a>, <a href="#6.5.7">6.5.7</a>
+      <a href="#7.29.2.2.1">7.29.2.2.1</a>, <a href="#7.29.3.1.1">7.29.3.1.1</a>, <a href="#7.29.3.1.2">7.29.3.1.2</a>                        length
+iswxdigit function, <a href="#7.29.2.1.12">7.29.2.1.12</a>, <a href="#7.29.2.2.1">7.29.2.2.1</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>
+isxdigit function, <a href="#7.4.1.12">7.4.1.12</a>, <a href="#7.11.1.1">7.11.1.1</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>
+italic type convention, <a href="#3">3</a>, <a href="#6.1">6.1</a>                                     identifier, <a href="#6.4.2.1">6.4.2.1</a>
+iteration statements, <a href="#6.8.5">6.8.5</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>
+                                                                length function, <a href="#7.22.7.1">7.22.7.1</a>, <a href="#7.23.6.3">7.23.6.3</a>, <a href="#7.28.4.6.1">7.28.4.6.1</a>,
+jmp_buf type, <a href="#7.13">7.13</a>                                                    <a href="#7.28.6.3.1">7.28.6.3.1</a>, <a href="#K.3.7.4.4">K.3.7.4.4</a>, <a href="#K.3.9.2.4.1">K.3.9.2.4.1</a>
+jump statements, <a href="#6.8.6">6.8.6</a>                                          length modifier, <a href="#7.21.6.1">7.21.6.1</a>, <a href="#7.21.6.2">7.21.6.2</a>, <a href="#7.28.2.1">7.28.2.1</a>,
+                                                                      <a href="#7.28.2.2">7.28.2.2</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>                             less-than operator (&lt;), <a href="#6.5.8">6.5.8</a>
+kill_dependency macro, <a href="#5.1.2.4">5.1.2.4</a>, <a href="#7.17.3.1">7.17.3.1</a>                        less-than-or-equal-to operator (&lt;=), <a href="#6.5.8">6.5.8</a>
+known constant size, <a href="#6.2.5">6.2.5</a>                                      letter, <a href="#5.2.1">5.2.1</a>, <a href="#7.4">7.4</a>
+                                                                lexical elements, <a href="#5.1.1.2">5.1.1.2</a>, <a href="#6.4">6.4</a>
+L_tmpnam macro, <a href="#7.21.1">7.21.1</a>, <a href="#7.21.4.4">7.21.4.4</a>                                lgamma functions, <a href="#7.12.8.3">7.12.8.3</a>, <a href="#F.10.5.3">F.10.5.3</a>
+L_tmpnam_s macro, <a href="#K.3.5">K.3.5</a>, <a href="#K.3.5.1.2">K.3.5.1.2</a>                              lgamma type-generic macro, <a href="#7.24">7.24</a>
+label name, <a href="#6.2.1">6.2.1</a>, <a href="#6.2.3">6.2.3</a>                                        library, <a href="#5.1.1.1">5.1.1.1</a>, <a href="#7">7</a>, <a href="#K.3">K.3</a>
+labeled statement, <a href="#6.8.1">6.8.1</a>                                           future directions, <a href="#7.30">7.30</a>
+labs function, <a href="#7.22.6.1">7.22.6.1</a>                                            summary, <a href="#B">B</a>
+language, <a href="#6">6</a>                                                        terms, <a href="#7.1.1">7.1.1</a>
+   future directions, <a href="#6.11">6.11</a>                                         use of functions, <a href="#7.1.4">7.1.4</a>
+   syntax summary, <a href="#A">A</a>                                            lifetime, <a href="#6.2.4">6.2.4</a>
+Latin alphabet, <a href="#5.2.1">5.2.1</a>, <a href="#6.4.2.1">6.4.2.1</a>                                  limits
+
+[<a name="#p666" href="p666">page 666</a>] (<a href="#Contents">Contents</a>)
+
+   environmental, see environmental 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>
+   implementation, see implementation limits               long double _Imaginary type, <a href="#G.2">G.2</a>
+   numerical, see numerical limits                         long double suffix, l or <a href="#L">L</a>, <a href="#6.4.4.2">6.4.4.2</a>
+   translation, see translation 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>,
+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>                      <a href="#7.21.6.1">7.21.6.1</a>, <a href="#7.21.6.2">7.21.6.2</a>, <a href="#7.28.2.1">7.28.2.1</a>, <a href="#7.28.2.2">7.28.2.2</a>, <a href="#F.2">F.2</a>
+line buffered stream, <a href="#7.21.3">7.21.3</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 number, <a href="#6.10.4">6.10.4</a>, <a href="#6.10.8.1">6.10.8.1</a>                                   <a href="#6.3.1.7">6.3.1.7</a>, <a href="#6.3.1.8">6.3.1.8</a>
+line preprocessing directive, <a href="#6.10.4">6.10.4</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.21.6.1">7.21.6.1</a>,
+lines, <a href="#5.1.1.2">5.1.1.2</a>, <a href="#7.21.2">7.21.2</a>                                          <a href="#7.21.6.2">7.21.6.2</a>, <a href="#7.28.2.1">7.28.2.1</a>, <a href="#7.28.2.2">7.28.2.2</a>
+   preprocessing directive, <a href="#6.10">6.10</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>,
+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.6.2">6.7.6.2</a>, <a href="#6.9">6.9</a>, <a href="#6.9.2">6.9.2</a>,                <a href="#6.3.1.4">6.3.1.4</a>, <a href="#6.3.1.8">6.3.1.8</a>
+      <a href="#6.11.2">6.11.2</a>                                               long integer suffix, l or <a href="#L">L</a>, <a href="#6.4.4.1">6.4.4.1</a>
+llabs function, <a href="#7.22.6.1">7.22.6.1</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>,
+lldiv function, <a href="#7.22.6.2">7.22.6.2</a>                                        <a href="#7.21.6.1">7.21.6.1</a>, <a href="#7.21.6.2">7.21.6.2</a>, <a href="#7.28.2.1">7.28.2.1</a>, <a href="#7.28.2.2">7.28.2.2</a>
+lldiv_t type, <a href="#7.22">7.22</a>                                         long long int type conversion, <a href="#6.3.1.1">6.3.1.1</a>,
+LLONG_MAX macro, <a href="#5.2.4.2.1">5.2.4.2.1</a>, <a href="#7.22.1.4">7.22.1.4</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>
+      <a href="#7.28.4.1.2">7.28.4.1.2</a>                                           long long integer suffix, ll or LL, <a href="#6.4.4.1">6.4.4.1</a>
+LLONG_MIN macro, <a href="#5.2.4.2.1">5.2.4.2.1</a>, <a href="#7.22.1.4">7.22.1.4</a>,                      LONG_MAX macro, <a href="#5.2.4.2.1">5.2.4.2.1</a>, <a href="#7.22.1.4">7.22.1.4</a>, <a href="#7.28.4.1.2">7.28.4.1.2</a>
+      <a href="#7.28.4.1.2">7.28.4.1.2</a>                                           LONG_MIN macro, <a href="#5.2.4.2.1">5.2.4.2.1</a>, <a href="#7.22.1.4">7.22.1.4</a>, <a href="#7.28.4.1.2">7.28.4.1.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.10.6.5">F.10.6.5</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.22.4.4">7.22.4.4</a>,
+llrint type-generic macro, <a href="#7.24">7.24</a>                                 <a href="#7.22.4.7">7.22.4.7</a>
+llround functions, <a href="#7.12.9.7">7.12.9.7</a>, <a href="#F.10.6.7">F.10.6.7</a>                      loop body, <a href="#6.8.5">6.8.5</a>
+llround type-generic macro, <a href="#7.24">7.24</a>                           low-order bit, <a href="#3.6">3.6</a>
+local time, <a href="#7.26.1">7.26.1</a>                                         lowercase letter, <a href="#5.2.1">5.2.1</a>
+locale, <a href="#3.4.2">3.4.2</a>                                              lrint functions, <a href="#7.12.9.5">7.12.9.5</a>, <a href="#F.3">F.3</a>, <a href="#F.10.6.5">F.10.6.5</a>
+locale-specific behavior, <a href="#3.4.2">3.4.2</a>, <a href="#J.4">J.4</a>                        lrint type-generic macro, <a href="#7.24">7.24</a>
+locale.h header, <a href="#7.11">7.11</a>, <a href="#7.30.5">7.30.5</a>                              lround functions, <a href="#7.12.9.7">7.12.9.7</a>, <a href="#F.10.6.7">F.10.6.7</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>                    lround type-generic macro, <a href="#7.24">7.24</a>
+localization, <a href="#7.11">7.11</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>,
+localtime function, <a href="#7.26.3.4">7.26.3.4</a>                                    <a href="#6.7.2.4">6.7.2.4</a>
+localtime_s function, <a href="#K.3.8.2.4">K.3.8.2.4</a>                            lvalue conversion, <a href="#6.3.2.1">6.3.2.1</a>, <a href="#6.5.16">6.5.16</a>, <a href="#6.5.16.1">6.5.16.1</a>,
+log functions, <a href="#7.12.6.7">7.12.6.7</a>, <a href="#F.10.3.7">F.10.3.7</a>                               <a href="#6.5.16.2">6.5.16.2</a>
+log type-generic macro, <a href="#7.24">7.24</a>
+log10 functions, <a href="#7.12.6.8">7.12.6.8</a>, <a href="#F.10.3.8">F.10.3.8</a>                        macro argument substitution, <a href="#6.10.3.1">6.10.3.1</a>
+log10 type-generic macro, <a href="#7.24">7.24</a>                             macro definition
+log1p functions, <a href="#7.12.6.9">7.12.6.9</a>, <a href="#F.10.3.9">F.10.3.9</a>                          library function, <a href="#7.1.4">7.1.4</a>
+log1p type-generic macro, <a href="#7.24">7.24</a>                             macro invocation, <a href="#6.10.3">6.10.3</a>
+log2 functions, <a href="#7.12.6.10">7.12.6.10</a>, <a href="#F.10.3.10">F.10.3.10</a>                       macro name, <a href="#6.10.3">6.10.3</a>
+log2 type-generic macro, <a href="#7.24">7.24</a>                                length, <a href="#5.2.4.1">5.2.4.1</a>
+logarithmic functions                                        predefined, <a href="#6.10.8">6.10.8</a>, <a href="#6.11.9">6.11.9</a>
+   complex, <a href="#7.3.7">7.3.7</a>, <a href="#G.6.3">G.6.3</a>                                     redefinition, <a href="#6.10.3">6.10.3</a>
+   real, <a href="#7.12.6">7.12.6</a>, <a href="#F.10.3">F.10.3</a>                                      scope, <a href="#6.10.3.5">6.10.3.5</a>
+logb functions, <a href="#7.12.6.11">7.12.6.11</a>, <a href="#F.3">F.3</a>, <a href="#F.10.3.11">F.10.3.11</a>                  macro parameter, <a href="#6.10.3">6.10.3</a>
+logb type-generic macro, <a href="#7.24">7.24</a>                              macro preprocessor, <a href="#6.10">6.10</a>
+logical operators                                          macro replacement, <a href="#6.10.3">6.10.3</a>
+   AND (&amp;&amp;), <a href="#5.1.2.4">5.1.2.4</a>, <a href="#6.5.13">6.5.13</a>                               magnitude, complex, <a href="#7.3.8.1">7.3.8.1</a>
+   negation (!), <a href="#6.5.3.3">6.5.3.3</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>,
+   OR (||), <a href="#5.1.2.4">5.1.2.4</a>, <a href="#6.5.14">6.5.14</a>                                     <a href="#7.21.3">7.21.3</a>
+logical source lines, <a href="#5.1.1.2">5.1.1.2</a>                              malloc function, <a href="#7.22.3">7.22.3</a>, <a href="#7.22.3.4">7.22.3.4</a>, <a href="#7.22.3.5">7.22.3.5</a>
+long double _Complex type, <a href="#6.2.5">6.2.5</a>                           manipulation functions
+long double _Complex type conversion,                        complex, <a href="#7.3.9">7.3.9</a>
+
+[<a name="#p667" href="p667">page 667</a>] (<a href="#Contents">Contents</a>)
+
+  real, <a href="#7.12.11">7.12.11</a>, <a href="#F.10.8">F.10.8</a>                                    modf functions, <a href="#7.12.6.12">7.12.6.12</a>, <a href="#F.10.3.12">F.10.3.12</a>
+matching failure, <a href="#7.28.2.6">7.28.2.6</a>, <a href="#7.28.2.8">7.28.2.8</a>, <a href="#7.28.2.10">7.28.2.10</a>,           modifiable lvalue, <a href="#6.3.2.1">6.3.2.1</a>
+     <a href="#K.3.9.1.7">K.3.9.1.7</a>, <a href="#K.3.9.1.10">K.3.9.1.10</a>, <a href="#K.3.9.1.12">K.3.9.1.12</a>                     modification order, <a href="#5.1.2.4">5.1.2.4</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.24">7.24</a>, <a href="#F">F</a>,              modulus functions, <a href="#7.12.6.12">7.12.6.12</a>
+     <a href="#F.10">F.10</a>, <a href="#J.5.17">J.5.17</a>                                          modulus, complex, <a href="#7.3.8.1">7.3.8.1</a>
+MATH_ERREXCEPT macro, <a href="#7.12">7.12</a>, <a href="#F.10">F.10</a>                           mtx_destroy function, <a href="#7.25.4.1">7.25.4.1</a>
+math_errhandling macro, <a href="#7.1.3">7.1.3</a>, <a href="#7.12">7.12</a>, <a href="#F.10">F.10</a>                  mtx_init function, <a href="#7.25.1">7.25.1</a>, <a href="#7.25.4.2">7.25.4.2</a>
+MATH_ERRNO macro, <a href="#7.12">7.12</a>                                     mtx_lock function, <a href="#7.25.4.3">7.25.4.3</a>
+max_align_t type, <a href="#7.19">7.19</a>                                     mtx_t type, <a href="#7.25.1">7.25.1</a>
+maximum functions, <a href="#7.12.12">7.12.12</a>, <a href="#F.10.9">F.10.9</a>                         mtx_timedlock function, <a href="#7.25.4.4">7.25.4.4</a>
+MB_CUR_MAX macro, <a href="#7.1.1">7.1.1</a>, <a href="#7.22">7.22</a>, <a href="#7.22.7.2">7.22.7.2</a>,                   mtx_trylock function, <a href="#7.25.4.5">7.25.4.5</a>
+     <a href="#7.22.7.3">7.22.7.3</a>, <a href="#7.27.1.2">7.27.1.2</a>, <a href="#7.27.1.4">7.27.1.4</a>, <a href="#7.28.6.3.3">7.28.6.3.3</a>,             mtx_unlock function, <a href="#7.25.4.3">7.25.4.3</a>, <a href="#7.25.4.4">7.25.4.4</a>,
+     <a href="#K.3.6.4.1">K.3.6.4.1</a>, <a href="#K.3.9.3.1.1">K.3.9.3.1.1</a>                                     <a href="#7.25.4.5">7.25.4.5</a>, <a href="#7.25.4.6">7.25.4.6</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.22">7.22</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>
+mblen function, <a href="#7.22.7.1">7.22.7.1</a>, <a href="#7.28.6.3">7.28.6.3</a>                         multibyte conversion functions
+mbrlen function, <a href="#7.28.6.3.1">7.28.6.3.1</a>                                  wide character, <a href="#7.22.7">7.22.7</a>, <a href="#K.3.6.4">K.3.6.4</a>
+mbrtoc16 function, <a href="#6.4.4.4">6.4.4.4</a>, <a href="#6.4.5">6.4.5</a>, <a href="#7.27.1.1">7.27.1.1</a>                     extended, <a href="#7.28.6">7.28.6</a>, <a href="#K.3.9.3">K.3.9.3</a>
+mbrtoc32 function, <a href="#6.4.4.4">6.4.4.4</a>, <a href="#6.4.5">6.4.5</a>, <a href="#7.27.1.3">7.27.1.3</a>                     restartable, <a href="#7.27.1">7.27.1</a>, <a href="#7.28.6.3">7.28.6.3</a>, <a href="#K.3.9.3.1">K.3.9.3.1</a>
+mbrtowc function, <a href="#7.21.3">7.21.3</a>, <a href="#7.21.6.1">7.21.6.1</a>, <a href="#7.21.6.2">7.21.6.2</a>,                wide string, <a href="#7.22.8">7.22.8</a>, <a href="#K.3.6.5">K.3.6.5</a>
+     <a href="#7.28.2.1">7.28.2.1</a>, <a href="#7.28.2.2">7.28.2.2</a>, <a href="#7.28.6.3.1">7.28.6.3.1</a>, <a href="#7.28.6.3.2">7.28.6.3.2</a>,                restartable, <a href="#7.28.6.4">7.28.6.4</a>, <a href="#K.3.9.3.2">K.3.9.3.2</a>
+     <a href="#7.28.6.4.1">7.28.6.4.1</a>, <a href="#K.3.6.5.1">K.3.6.5.1</a>, <a href="#K.3.9.3.2.1">K.3.9.3.2.1</a>                    multibyte string, <a href="#7.1.1">7.1.1</a>
+mbsinit function, <a href="#7.28.6.2.1">7.28.6.2.1</a>                               multibyte/wide character conversion functions,
+mbsrtowcs function, <a href="#7.28.6.4.1">7.28.6.4.1</a>, <a href="#K.3.9.3.2">K.3.9.3.2</a>                       <a href="#7.22.7">7.22.7</a>, <a href="#K.3.6.4">K.3.6.4</a>
+mbsrtowcs_s function, <a href="#K.3.9.3.2">K.3.9.3.2</a>, <a href="#K.3.9.3.2.1">K.3.9.3.2.1</a>                 extended, <a href="#7.28.6">7.28.6</a>, <a href="#K.3.9.3">K.3.9.3</a>
+mbstate_t type, <a href="#7.21.2">7.21.2</a>, <a href="#7.21.3">7.21.3</a>, <a href="#7.21.6.1">7.21.6.1</a>,                    restartable, <a href="#7.27.1">7.27.1</a>, <a href="#7.28.6.3">7.28.6.3</a>, <a href="#K.3.9.3.1">K.3.9.3.1</a>
+     <a href="#7.21.6.2">7.21.6.2</a>, <a href="#7.27">7.27</a>, <a href="#7.27.1">7.27.1</a>, <a href="#7.28.1">7.28.1</a>, <a href="#7.28.2.1">7.28.2.1</a>,             multibyte/wide string conversion functions,
+     <a href="#7.28.2.2">7.28.2.2</a>, <a href="#7.28.6">7.28.6</a>, <a href="#7.28.6.2.1">7.28.6.2.1</a>, <a href="#7.28.6.3">7.28.6.3</a>,                    <a href="#7.22.8">7.22.8</a>, <a href="#K.3.6.5">K.3.6.5</a>
+     <a href="#7.28.6.3.1">7.28.6.3.1</a>, <a href="#7.28.6.4">7.28.6.4</a>                                    restartable, <a href="#7.28.6.4">7.28.6.4</a>, <a href="#K.3.9.3.2">K.3.9.3.2</a>
+mbstowcs function, <a href="#6.4.5">6.4.5</a>, <a href="#7.22.8.1">7.22.8.1</a>, <a href="#7.28.6.4">7.28.6.4</a>               multidimensional array, <a href="#6.5.2.1">6.5.2.1</a>
+mbstowcs_s function, <a href="#K.3.6.5.1">K.3.6.5.1</a>                             multiplication assignment operator (*=), <a href="#6.5.16.2">6.5.16.2</a>
+mbtowc function, <a href="#6.4.4.4">6.4.4.4</a>, <a href="#7.22.7.1">7.22.7.1</a>, <a href="#7.22.7.2">7.22.7.2</a>,              multiplication operator (*), <a href="#6.2.6.2">6.2.6.2</a>, <a href="#6.5.5">6.5.5</a>, <a href="#F.3">F.3</a>,
+     <a href="#7.22.8.1">7.22.8.1</a>, <a href="#7.28.6.3">7.28.6.3</a>                                         <a href="#G.5.1">G.5.1</a>
+member access operators (. and -&gt;), <a href="#6.5.2.3">6.5.2.3</a>                multiplicative expressions, <a href="#6.5.5">6.5.5</a>, <a href="#G.5.1">G.5.1</a>
+member alignment, <a href="#6.7.2.1">6.7.2.1</a>
+memchr function, <a href="#7.23.5.1">7.23.5.1</a>                                  n-char sequence, <a href="#7.22.1.3">7.22.1.3</a>
+memcmp function, <a href="#7.23.4">7.23.4</a>, <a href="#7.23.4.1">7.23.4.1</a>                          n-wchar sequence, <a href="#7.28.4.1.1">7.28.4.1.1</a>
+memcpy function, <a href="#7.23.2.1">7.23.2.1</a>                                  name
+memcpy_s function, <a href="#K.3.7.1.1">K.3.7.1.1</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>
+memmove function, <a href="#7.23.2.2">7.23.2.2</a>                                   file, <a href="#7.21.3">7.21.3</a>
+memmove_s function, <a href="#K.3.7.1.2">K.3.7.1.2</a>                                internal, <a href="#5.2.4.1">5.2.4.1</a>, <a href="#6.4.2.1">6.4.2.1</a>
+memory location, <a href="#3.14">3.14</a>                                        label, <a href="#6.2.3">6.2.3</a>
+memory management functions, <a href="#7.22.3">7.22.3</a>                          structure/union member, <a href="#6.2.3">6.2.3</a>
+memory_order type, <a href="#7.17.1">7.17.1</a>, <a href="#7.17.3">7.17.3</a>                          name spaces, <a href="#6.2.3">6.2.3</a>
+memset function, <a href="#7.23.6.1">7.23.6.1</a>, <a href="#K.3.7.4.1">K.3.7.4.1</a>                       named label, <a href="#6.8.1">6.8.1</a>
+memset_s function, <a href="#K.3.7.4.1">K.3.7.4.1</a>                               NaN, <a href="#5.2.4.2.2">5.2.4.2.2</a>
+minimum functions, <a href="#7.12.12">7.12.12</a>, <a href="#F.10.9">F.10.9</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.10.8.2">F.10.8.2</a>
+minus operator, unary, <a href="#6.5.3.3">6.5.3.3</a>                             NAN macro, <a href="#7.12">7.12</a>, <a href="#F.2.1">F.2.1</a>
+miscellaneous functions                                    NDEBUG macro, <a href="#7.2">7.2</a>
+  string, <a href="#7.23.6">7.23.6</a>, <a href="#K.3.7.4">K.3.7.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>,
+  wide string, <a href="#7.28.4.6">7.28.4.6</a>, <a href="#K.3.9.2.4">K.3.9.2.4</a>                              <a href="#F.10.6.3">F.10.6.3</a>
+mktime function, <a href="#7.26.2.3">7.26.2.3</a>                                  nearbyint type-generic macro, <a href="#7.24">7.24</a>
+
+[<a name="#p668" href="p668">page 668</a>] (<a href="#Contents">Contents</a>)
+
+nearest integer functions, <a href="#7.12.9">7.12.9</a>, <a href="#F.10.6">F.10.6</a>                       operating system, <a href="#5.1.2.1">5.1.2.1</a>, <a href="#7.22.4.8">7.22.4.8</a>
+negation operator (!), <a href="#6.5.3.3">6.5.3.3</a>                                  operations on files, <a href="#7.21.4">7.21.4</a>, <a href="#K.3.5.1">K.3.5.1</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>                               operator, <a href="#6.4.6">6.4.6</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>           operators, <a href="#6.5">6.5</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>,                     additive, <a href="#6.2.6.2">6.2.6.2</a>, <a href="#6.5.6">6.5.6</a>
+     <a href="#7.4.1.10">7.4.1.10</a>                                                      alignof, <a href="#6.5.3.4">6.5.3.4</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>,                    assignment, <a href="#6.5.16">6.5.16</a>
+     <a href="#F.10.8.3">F.10.8.3</a>                                                      associativity, <a href="#6.5">6.5</a>
+nextafter type-generic macro, <a href="#7.24">7.24</a>                                 equality, <a href="#6.5.9">6.5.9</a>
+nexttoward functions, <a href="#7.12.11.4">7.12.11.4</a>, <a href="#F.3">F.3</a>, <a href="#F.10.8.4">F.10.8.4</a>                     multiplicative, <a href="#6.2.6.2">6.2.6.2</a>, <a href="#6.5.5">6.5.5</a>, <a href="#G.5.1">G.5.1</a>
+nexttoward type-generic macro, <a href="#7.24">7.24</a>                                postfix, <a href="#6.5.2">6.5.2</a>
+no linkage, <a href="#6.2.2">6.2.2</a>                                                  precedence, <a href="#6.5">6.5</a>
+no-return function, <a href="#6.7.4">6.7.4</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>
+non-stop floating-point control mode, <a href="#7.6.4.2">7.6.4.2</a>                       relational, <a href="#6.5.8">6.5.8</a>
+nongraphic characters, <a href="#5.2.2">5.2.2</a>, <a href="#6.4.4.4">6.4.4.4</a>                              shift, <a href="#6.5.7">6.5.7</a>
+nonlocal jumps header, <a href="#7.13">7.13</a>                                        sizeof, <a href="#6.5.3.4">6.5.3.4</a>
+norm, complex, <a href="#7.3.8.1">7.3.8.1</a>                                             unary, <a href="#6.5.3">6.5.3</a>
+normalized broken-down time, <a href="#K.3.8.1">K.3.8.1</a>, <a href="#K.3.8.2.1">K.3.8.2.1</a>                    unary arithmetic, <a href="#6.5.3.3">6.5.3.3</a>
+not macro, <a href="#7.9">7.9</a>                                                  optional features, see conditional features
+not-equal-to operator, see inequality operator                  or macro, <a href="#7.9">7.9</a>
+not_eq macro, <a href="#7.9">7.9</a>                                               OR operators
+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>                         bitwise exclusive (^), <a href="#6.2.6.2">6.2.6.2</a>, <a href="#6.5.11">6.5.11</a>
+  padding of binary stream, <a href="#7.21.2">7.21.2</a>                                 bitwise exclusive assignment (^=), <a href="#6.5.16.2">6.5.16.2</a>
+NULL macro, <a href="#7.11">7.11</a>, <a href="#7.19">7.19</a>, <a href="#7.21.1">7.21.1</a>, <a href="#7.22">7.22</a>, <a href="#7.23.1">7.23.1</a>,                      bitwise inclusive (|), <a href="#6.2.6.2">6.2.6.2</a>, <a href="#6.5.12">6.5.12</a>
+     <a href="#7.26.1">7.26.1</a>, <a href="#7.28.1">7.28.1</a>                                                bitwise inclusive assignment (|=), <a href="#6.5.16.2">6.5.16.2</a>
+null pointer, <a href="#6.3.2.3">6.3.2.3</a>                                              logical (||), <a href="#5.1.2.4">5.1.2.4</a>, <a href="#6.5.14">6.5.14</a>
+null pointer constant, <a href="#6.3.2.3">6.3.2.3</a>                                  or_eq macro, <a href="#7.9">7.9</a>
+null preprocessing directive, <a href="#6.10.7">6.10.7</a>                            order of allocated storage, <a href="#7.22.3">7.22.3</a>
+null statement, <a href="#6.8.3">6.8.3</a>                                           order of evaluation, <a href="#6.5">6.5</a>, <a href="#6.5.16">6.5.16</a>, <a href="#6.10.3.2">6.10.3.2</a>, <a href="#6.10.3.3">6.10.3.3</a>,
+null wide character, <a href="#7.1.1">7.1.1</a>                                            see also sequence points
+number classification macros, <a href="#7.12">7.12</a>, <a href="#7.12.3.1">7.12.3.1</a>                     ordinary identifier name space, <a href="#6.2.3">6.2.3</a>
+numeric conversion functions, <a href="#7.8.2.3">7.8.2.3</a>, <a href="#7.22.1">7.22.1</a>                   orientation of stream, <a href="#7.21.2">7.21.2</a>, <a href="#7.28.3.5">7.28.3.5</a>
+  wide string, <a href="#7.8.2.4">7.8.2.4</a>, <a href="#7.28.4.1">7.28.4.1</a>                                out-of-bounds store, <a href="#L.2.1">L.2.1</a>
+numerical limits, <a href="#5.2.4.2">5.2.4.2</a>                                       outer scope, <a href="#6.2.1">6.2.1</a>
+                                                                over-aligned, <a href="#6.2.8">6.2.8</a>
+object, <a href="#3.15">3.15</a>
+object representation, <a href="#6.2.6.1">6.2.6.1</a>                                  padding
+object type, <a href="#6.2.5">6.2.5</a>                                                binary stream, <a href="#7.21.2">7.21.2</a>
+object-like macro, <a href="#6.10.3">6.10.3</a>                                         bits, <a href="#6.2.6.2">6.2.6.2</a>, <a href="#7.20.1.1">7.20.1.1</a>
+observable behavior, <a href="#5.1.2.3">5.1.2.3</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>
+obsolescence, <a href="#6.11">6.11</a>, <a href="#7.30">7.30</a>                                        parameter, <a href="#3.16">3.16</a>
+octal constant, <a href="#6.4.4.1">6.4.4.1</a>                                           array, <a href="#6.9.1">6.9.1</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>                                     ellipsis, <a href="#6.7.6.3">6.7.6.3</a>, <a href="#6.10.3">6.10.3</a>
+octal-character escape sequence (\octal digits),                  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>
+     <a href="#6.4.4.4">6.4.4.4</a>                                                      macro, <a href="#6.10.3">6.10.3</a>
+offsetof macro, <a href="#7.19">7.19</a>                                              main function, <a href="#5.1.2.2.1">5.1.2.2.1</a>
+on-off switch, <a href="#6.10.6">6.10.6</a>                                             program, <a href="#5.1.2.2.1">5.1.2.2.1</a>
+once_flag type, <a href="#7.25.1">7.25.1</a>                                          parameter type list, <a href="#6.7.6.3">6.7.6.3</a>
+ONCE_FLAG_INIT macro, <a href="#7.25.1">7.25.1</a>                                    parentheses punctuator (( )), <a href="#6.7.6.3">6.7.6.3</a>, <a href="#6.8.4">6.8.4</a>, <a href="#6.8.5">6.8.5</a>
+ones' complement, <a href="#6.2.6.2">6.2.6.2</a>                                       parenthesized expression, <a href="#6.5.1">6.5.1</a>
+operand, <a href="#6.4.6">6.4.6</a>, <a href="#6.5">6.5</a>                                             parse state, <a href="#7.21.2">7.21.2</a>
+
+[<a name="#p669" href="p669">page 669</a>] (<a href="#Contents">Contents</a>)
+
+perform a trap, <a href="#3.19.5">3.19.5</a>                                        preprocessor, <a href="#6.10">6.10</a>
+permitted form of initializer, <a href="#6.6">6.6</a>                            PRIcFASTN macros, <a href="#7.8.1">7.8.1</a>
+perror function, <a href="#7.21.10.4">7.21.10.4</a>                                    PRIcLEASTN macros, <a href="#7.8.1">7.8.1</a>
+phase angle, complex, <a href="#7.3.9.1">7.3.9.1</a>                                 PRIcMAX macros, <a href="#7.8.1">7.8.1</a>
+physical source lines, <a href="#5.1.1.2">5.1.1.2</a>                                PRIcN macros, <a href="#7.8.1">7.8.1</a>
+placemarker, <a href="#6.10.3.3">6.10.3.3</a>                                         PRIcPTR macros, <a href="#7.8.1">7.8.1</a>
+plus operator, unary, <a href="#6.5.3.3">6.5.3.3</a>                                 primary expression, <a href="#6.5.1">6.5.1</a>
+pointer arithmetic, <a href="#6.5.6">6.5.6</a>                                     printf function, <a href="#7.21.1">7.21.1</a>, <a href="#7.21.6.3">7.21.6.3</a>, <a href="#7.21.6.10">7.21.6.10</a>,
+pointer comparison, <a href="#6.5.8">6.5.8</a>                                           <a href="#K.3.5.3.3">K.3.5.3.3</a>
+pointer declarator, <a href="#6.7.6.1">6.7.6.1</a>                                   printf_s function, <a href="#K.3.5.3.3">K.3.5.3.3</a>
+pointer operator (-&gt;), <a href="#6.5.2.3">6.5.2.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>
+pointer to function, <a href="#6.5.2.2">6.5.2.2</a>                                  printing wide character, <a href="#7.29.2">7.29.2</a>
+pointer type, <a href="#6.2.5">6.2.5</a>                                           program diagnostics, <a href="#7.2.1">7.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 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, null, <a href="#6.3.2.3">6.3.2.3</a>                                        program file, <a href="#5.1.1.1">5.1.1.1</a>
+pole 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.6.7">7.12.6.7</a>, <a href="#7.12.6.8">7.12.6.8</a>,             program image, <a href="#5.1.1.2">5.1.1.2</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>, <a href="#7.12.7.4">7.12.7.4</a>,                program name (argv[0]), <a href="#5.1.2.2.1">5.1.2.2.1</a>
+     <a href="#7.12.8.3">7.12.8.3</a>, <a href="#7.12.8.4">7.12.8.4</a>                                       program parameters, <a href="#5.1.2.2.1">5.1.2.2.1</a>
+portability, <a href="#4">4</a>, <a href="#J">J</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>
+position indicator, file, see file position indicator           program structure, <a href="#5.1.1.1">5.1.1.1</a>
+positive difference, <a href="#7.12.12.1">7.12.12.1</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>,
+positive difference functions, <a href="#7.12.12">7.12.12</a>, <a href="#F.10.9">F.10.9</a>                      <a href="#5.1.2.3">5.1.2.3</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>              program, conforming, <a href="#4">4</a>
+postfix expressions, <a href="#6.5.2">6.5.2</a>                                     program, strictly conforming, <a href="#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>              promotions
+pow functions, <a href="#7.12.7.4">7.12.7.4</a>, <a href="#F.10.4.4">F.10.4.4</a>                                default argument, <a href="#6.5.2.2">6.5.2.2</a>
+pow type-generic macro, <a href="#7.24">7.24</a>                                     integer, <a href="#5.1.2.3">5.1.2.3</a>, <a href="#6.3.1.1">6.3.1.1</a>
+power functions                                               prototype, see function prototype
+  complex, <a href="#7.3.8">7.3.8</a>, <a href="#G.6.4">G.6.4</a>                                       pseudo-random sequence functions, <a href="#7.22.2">7.22.2</a>
+  real, <a href="#7.12.7">7.12.7</a>, <a href="#F.10.4">F.10.4</a>                                        PTRDIFF_MAX macro, <a href="#7.20.3">7.20.3</a>
+pp-number, <a href="#6.4.8">6.4.8</a>                                              PTRDIFF_MIN macro, <a href="#7.20.3">7.20.3</a>
+pragma operator, <a href="#6.10.9">6.10.9</a>                                       ptrdiff_t type, <a href="#7.17.1">7.17.1</a>, <a href="#7.19">7.19</a>, <a href="#7.20.3">7.20.3</a>, <a href="#7.21.6.1">7.21.6.1</a>,
+pragma preprocessing directive, <a href="#6.10.6">6.10.6</a>, <a href="#6.11.8">6.11.8</a>                      <a href="#7.21.6.2">7.21.6.2</a>, <a href="#7.28.2.1">7.28.2.1</a>, <a href="#7.28.2.2">7.28.2.2</a>
+precedence of operators, <a href="#6.5">6.5</a>                                  punctuators, <a href="#6.4.6">6.4.6</a>
+precedence of syntax rules, <a href="#5.1.1.2">5.1.1.2</a>                           putc function, <a href="#7.21.1">7.21.1</a>, <a href="#7.21.7.7">7.21.7.7</a>, <a href="#7.21.7.8">7.21.7.8</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.21.6.1">7.21.6.1</a>, <a href="#7.28.2.1">7.28.2.1</a>               putchar function, <a href="#7.21.1">7.21.1</a>, <a href="#7.21.7.8">7.21.7.8</a>
+  excess, <a href="#5.2.4.2.2">5.2.4.2.2</a>, <a href="#6.3.1.8">6.3.1.8</a>, <a href="#6.8.6.4">6.8.6.4</a>                         puts function, <a href="#7.21.1">7.21.1</a>, <a href="#7.21.7.9">7.21.7.9</a>
+predefined macro names, <a href="#6.10.8">6.10.8</a>, <a href="#6.11.9">6.11.9</a>                         putwc function, <a href="#7.21.1">7.21.1</a>, <a href="#7.28.3.8">7.28.3.8</a>, <a href="#7.28.3.9">7.28.3.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>               putwchar function, <a href="#7.21.1">7.21.1</a>, <a href="#7.28.3.9">7.28.3.9</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>
+preprocessing concatenation, <a href="#6.10.3.3">6.10.3.3</a>                         qsort function, <a href="#7.22.5">7.22.5</a>, <a href="#7.22.5.2">7.22.5.2</a>
+preprocessing directives, <a href="#5.1.1.2">5.1.1.2</a>, <a href="#6.10">6.10</a>                       qsort_s function, <a href="#K.3.6.3">K.3.6.3</a>, <a href="#K.3.6.3.2">K.3.6.3.2</a>
+preprocessing file, <a href="#5.1.1.1">5.1.1.1</a>, <a href="#6.10">6.10</a>                              qualified types, <a href="#6.2.5">6.2.5</a>
+preprocessing numbers, <a href="#6.4">6.4</a>, <a href="#6.4.8">6.4.8</a>                             qualified version of type, <a href="#6.2.5">6.2.5</a>
+preprocessing operators                                       question-mark escape sequence (\?), <a href="#6.4.4.4">6.4.4.4</a>
+  #, <a href="#6.10.3.2">6.10.3.2</a>                                                 quick_exit function, <a href="#7.22.4.3">7.22.4.3</a>, <a href="#7.22.4.4">7.22.4.4</a>,
+  ##, <a href="#6.10.3.3">6.10.3.3</a>                                                     <a href="#7.22.4.7">7.22.4.7</a>
+  _Pragma, <a href="#5.1.1.2">5.1.1.2</a>, <a href="#6.10.9">6.10.9</a>                                    quiet NaN, <a href="#5.2.4.2.2">5.2.4.2.2</a>
+  defined, <a href="#6.10.1">6.10.1</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>                      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.22.4.1">7.22.4.1</a>
+preprocessing translation unit, <a href="#5.1.1.1">5.1.1.1</a>                       rand function, <a href="#7.22">7.22</a>, <a href="#7.22.2.1">7.22.2.1</a>, <a href="#7.22.2.2">7.22.2.2</a>
+
+[<a name="#p670" href="p670">page 670</a>] (<a href="#Contents">Contents</a>)
+
+RAND_MAX macro, <a href="#7.22">7.22</a>, <a href="#7.22.2.1">7.22.2.1</a>                               restrict-qualified type, <a href="#6.2.5">6.2.5</a>, <a href="#6.7.3">6.7.3</a>
+range                                                        return statement, <a href="#6.8.6.4">6.8.6.4</a>, <a href="#F.6">F.6</a>
+   excess, <a href="#5.2.4.2.2">5.2.4.2.2</a>, <a href="#6.3.1.8">6.3.1.8</a>, <a href="#6.8.6.4">6.8.6.4</a>                       rewind function, <a href="#7.21.5.3">7.21.5.3</a>, <a href="#7.21.7.10">7.21.7.10</a>, <a href="#7.21.9.5">7.21.9.5</a>,
+range error, <a href="#7.12.1">7.12.1</a>, <a href="#7.12.5.4">7.12.5.4</a>, <a href="#7.12.5.5">7.12.5.5</a>, <a href="#7.12.6.1">7.12.6.1</a>,                 <a href="#7.28.3.10">7.28.3.10</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>, <a href="#7.12.6.6">7.12.6.6</a>,                right-shift assignment operator (&gt;&gt;=), <a href="#6.5.16.2">6.5.16.2</a>
+      <a href="#7.12.6.13">7.12.6.13</a>, <a href="#7.12.7.3">7.12.7.3</a>, <a href="#7.12.7.4">7.12.7.4</a>, <a href="#7.12.8.2">7.12.8.2</a>,               right-shift operator (&gt;&gt;), <a href="#6.2.6.2">6.2.6.2</a>, <a href="#6.5.7">6.5.7</a>
+      <a href="#7.12.8.3">7.12.8.3</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.12.9.7">7.12.9.7</a>,                rint functions, <a href="#7.12.9.4">7.12.9.4</a>, <a href="#F.3">F.3</a>, <a href="#F.10.6.4">F.10.6.4</a>
+      <a href="#7.12.11.3">7.12.11.3</a>, <a href="#7.12.12.1">7.12.12.1</a>, <a href="#7.12.13.1">7.12.13.1</a>                        rint type-generic macro, <a href="#7.24">7.24</a>
+rank, see integer conversion rank                            round functions, <a href="#7.12.9.6">7.12.9.6</a>, <a href="#F.10.6.6">F.10.6.6</a>
+read-modify-write operations, <a href="#5.1.2.4">5.1.2.4</a>                        round type-generic macro, <a href="#7.24">7.24</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>,              rounding mode, floating point, <a href="#5.2.4.2.2">5.2.4.2.2</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>                                      RSIZE_MAX macro, <a href="#K.3.3">K.3.3</a>, <a href="#K.3.4">K.3.4</a>, <a href="#K.3.5.1.2">K.3.5.1.2</a>,
+real floating types, <a href="#6.2.5">6.2.5</a>                                          <a href="#K.3.5.3.5">K.3.5.3.5</a>, <a href="#K.3.5.3.6">K.3.5.3.6</a>, <a href="#K.3.5.3.12">K.3.5.3.12</a>, <a href="#K.3.5.3.13">K.3.5.3.13</a>,
+real type domain, <a href="#6.2.5">6.2.5</a>                                            <a href="#K.3.5.4.1">K.3.5.4.1</a>, <a href="#K.3.6.2.1">K.3.6.2.1</a>, <a href="#K.3.6.3.1">K.3.6.3.1</a>, <a href="#K.3.6.3.2">K.3.6.3.2</a>,
+real types, <a href="#6.2.5">6.2.5</a>                                                  <a href="#K.3.6.4.1">K.3.6.4.1</a>, <a href="#K.3.6.5.1">K.3.6.5.1</a>, <a href="#K.3.6.5.2">K.3.6.5.2</a>, <a href="#K.3.7.1.1">K.3.7.1.1</a>,
+real-floating, <a href="#7.12.3">7.12.3</a>                                               <a href="#K.3.7.1.2">K.3.7.1.2</a>, <a href="#K.3.7.1.3">K.3.7.1.3</a>, <a href="#K.3.7.1.4">K.3.7.1.4</a>, <a href="#K.3.7.2.1">K.3.7.2.1</a>,
+realloc function, <a href="#7.22.3">7.22.3</a>, <a href="#7.22.3.5">7.22.3.5</a>                                 <a href="#K.3.7.2.2">K.3.7.2.2</a>, <a href="#K.3.7.3.1">K.3.7.3.1</a>, <a href="#K.3.7.4.1">K.3.7.4.1</a>, <a href="#K.3.7.4.2">K.3.7.4.2</a>,
+recommended practice, <a href="#3.17">3.17</a>                                         <a href="#K.3.8.2.1">K.3.8.2.1</a>, <a href="#K.3.8.2.2">K.3.8.2.2</a>, <a href="#K.3.9.1.3">K.3.9.1.3</a>, <a href="#K.3.9.1.4">K.3.9.1.4</a>,
+recursion, <a href="#6.5.2.2">6.5.2.2</a>                                                 <a href="#K.3.9.1.8">K.3.9.1.8</a>, <a href="#K.3.9.1.9">K.3.9.1.9</a>, <a href="#K.3.9.2.1.1">K.3.9.2.1.1</a>, <a href="#K.3.9.2.1.2">K.3.9.2.1.2</a>,
+recursive function call, <a href="#6.5.2.2">6.5.2.2</a>                                   <a href="#K.3.9.2.1.3">K.3.9.2.1.3</a>, <a href="#K.3.9.2.1.4">K.3.9.2.1.4</a>, <a href="#K.3.9.2.2.1">K.3.9.2.2.1</a>,
+redefinition of macro, <a href="#6.10.3">6.10.3</a>                                       <a href="#K.3.9.2.2.2">K.3.9.2.2.2</a>, <a href="#K.3.9.2.3.1">K.3.9.2.3.1</a>, <a href="#K.3.9.3.1.1">K.3.9.3.1.1</a>,
+reentrancy, <a href="#5.1.2.3">5.1.2.3</a>, <a href="#5.2.3">5.2.3</a>                                         <a href="#K.3.9.3.2.1">K.3.9.3.2.1</a>, <a href="#K.3.9.3.2.2">K.3.9.3.2.2</a>
+   library functions, <a href="#7.1.4">7.1.4</a>                                  rsize_t type, <a href="#K.3.3">K.3.3</a>, <a href="#K.3.4">K.3.4</a>, <a href="#K.3.5">K.3.5</a>, <a href="#K.3.5.3.2">K.3.5.3.2</a>,
+referenced type, <a href="#6.2.5">6.2.5</a>                                             <a href="#K.3.6">K.3.6</a>, <a href="#K.3.7">K.3.7</a>, <a href="#K.3.8">K.3.8</a>, <a href="#K.3.9">K.3.9</a>, <a href="#K.3.9.1.2">K.3.9.1.2</a>
+register storage-class specifier, <a href="#6.7.1">6.7.1</a>, <a href="#6.9">6.9</a>                  runtime-constraint, <a href="#3.18">3.18</a>
+relational expressions, <a href="#6.5.8">6.5.8</a>                                Runtime-constraint handling functions, <a href="#K.3.6.1">K.3.6.1</a>
+relaxed atomic operations, <a href="#5.1.2.4">5.1.2.4</a>                           rvalue, <a href="#6.3.2.1">6.3.2.1</a>
+release fence, <a href="#7.17.4">7.17.4</a>
+release operation, <a href="#5.1.2.4">5.1.2.4</a>                                   same scope, <a href="#6.2.1">6.2.1</a>
+release sequence, <a href="#5.1.2.4">5.1.2.4</a>                                    save calling environment function, <a href="#7.13.1">7.13.1</a>
+reliability of data, interrupted, <a href="#5.1.2.3">5.1.2.3</a>                    scalar types, <a href="#6.2.5">6.2.5</a>
+remainder assignment operator (%=), <a href="#6.5.16.2">6.5.16.2</a>                 scalbln function, <a href="#7.12.6.13">7.12.6.13</a>, <a href="#F.3">F.3</a>, <a href="#F.10.3.13">F.10.3.13</a>
+remainder functions, <a href="#7.12.10">7.12.10</a>, <a href="#F.10.7">F.10.7</a>                         scalbln type-generic macro, <a href="#7.24">7.24</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>,              scalbn function, <a href="#7.12.6.13">7.12.6.13</a>, <a href="#F.3">F.3</a>, <a href="#F.10.3.13">F.10.3.13</a>
+      <a href="#F.10.7.2">F.10.7.2</a>                                               scalbn type-generic macro, <a href="#7.24">7.24</a>
+remainder operator (%), <a href="#6.2.6.2">6.2.6.2</a>, <a href="#6.5.5">6.5.5</a>                       scanf function, <a href="#7.21.1">7.21.1</a>, <a href="#7.21.6.4">7.21.6.4</a>, <a href="#7.21.6.11">7.21.6.11</a>
+remainder type-generic macro, <a href="#7.24">7.24</a>                           scanf_s function, <a href="#K.3.5.3.4">K.3.5.3.4</a>, <a href="#K.3.5.3.11">K.3.5.3.11</a>
+remove function, <a href="#7.21.4.1">7.21.4.1</a>, <a href="#7.21.4.4">7.21.4.4</a>, <a href="#K.3.5.1.2">K.3.5.1.2</a>               scanlist, <a href="#7.21.6.2">7.21.6.2</a>, <a href="#7.28.2.2">7.28.2.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.10.7.3">F.10.7.3</a>                   scanset, <a href="#7.21.6.2">7.21.6.2</a>, <a href="#7.28.2.2">7.28.2.2</a>
+remquo type-generic macro, <a href="#7.24">7.24</a>                              SCHAR_MAX macro, <a href="#5.2.4.2.1">5.2.4.2.1</a>
+rename function, <a href="#7.21.4.2">7.21.4.2</a>                                    SCHAR_MIN macro, <a href="#5.2.4.2.1">5.2.4.2.1</a>
+representations of types, <a href="#6.2.6">6.2.6</a>                              SCNcFASTN macros, <a href="#7.8.1">7.8.1</a>
+   pointer, <a href="#6.2.5">6.2.5</a>                                            SCNcLEASTN macros, <a href="#7.8.1">7.8.1</a>
+rescanning and replacement, <a href="#6.10.3.4">6.10.3.4</a>                         SCNcMAX macros, <a href="#7.8.1">7.8.1</a>
+reserved identifiers, <a href="#6.4.1">6.4.1</a>, <a href="#7.1.3">7.1.3</a>, <a href="#K.3.1.2">K.3.1.2</a>                   SCNcN macros, <a href="#7.8.1">7.8.1</a>
+restartable multibyte/wide character conversion              SCNcPTR macros, <a href="#7.8.1">7.8.1</a>
+      functions, <a href="#7.27.1">7.27.1</a>, <a href="#7.28.6.3">7.28.6.3</a>, <a href="#K.3.9.3.1">K.3.9.3.1</a>                 scope of identifier, <a href="#6.2.1">6.2.1</a>, <a href="#6.9.2">6.9.2</a>
+restartable multibyte/wide string conversion                 search functions
+      functions, <a href="#7.28.6.4">7.28.6.4</a>, <a href="#K.3.9.3.2">K.3.9.3.2</a>                           string, <a href="#7.23.5">7.23.5</a>, <a href="#K.3.7.3">K.3.7.3</a>
+restore calling environment function, <a href="#7.13.2">7.13.2</a>                   utility, <a href="#7.22.5">7.22.5</a>, <a href="#K.3.6.3">K.3.6.3</a>
+restrict type qualifier, <a href="#6.7.3">6.7.3</a>, <a href="#6.7.3.1">6.7.3.1</a>                         wide string, <a href="#7.28.4.5">7.28.4.5</a>, <a href="#K.3.9.2.3">K.3.9.2.3</a>
+
+[<a name="#p671" href="p671">page 671</a>] (<a href="#Contents">Contents</a>)
+
+SEEK_CUR macro, <a href="#7.21.1">7.21.1</a>, <a href="#7.21.9.2">7.21.9.2</a>                                 sign and magnitude, <a href="#6.2.6.2">6.2.6.2</a>
+SEEK_END macro, <a href="#7.21.1">7.21.1</a>, <a href="#7.21.9.2">7.21.9.2</a>                                 sign bit, <a href="#6.2.6.2">6.2.6.2</a>
+SEEK_SET macro, <a href="#7.21.1">7.21.1</a>, <a href="#7.21.9.2">7.21.9.2</a>                                 signal function, <a href="#7.14.1.1">7.14.1.1</a>, <a href="#7.22.4.5">7.22.4.5</a>, <a href="#7.22.4.7">7.22.4.7</a>
+selection statements, <a href="#6.8.4">6.8.4</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>
+self-referential structure, <a href="#6.7.2.3">6.7.2.3</a>                              signal handling functions, <a href="#7.14.1">7.14.1</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>,                   signal.h header, <a href="#7.14">7.14</a>, <a href="#7.30.6">7.30.6</a>
+      <a href="#6.8.5">6.8.5</a>, <a href="#6.8.6">6.8.6</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>
+separate compilation, <a href="#5.1.1.1">5.1.1.1</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>
+separate translation, <a href="#5.1.1.1">5.1.1.1</a>                                    signbit macro, <a href="#7.12.3.6">7.12.3.6</a>, <a href="#F.3">F.3</a>
+sequence points, <a href="#5.1.2.3">5.1.2.3</a>, <a href="#6.5.2.2">6.5.2.2</a>, <a href="#6.5.13">6.5.13</a>, <a href="#6.5.14">6.5.14</a>,               signed char type, <a href="#6.2.5">6.2.5</a>, <a href="#7.21.6.1">7.21.6.1</a>, <a href="#7.21.6.2">7.21.6.2</a>,
+      <a href="#6.5.15">6.5.15</a>, <a href="#6.5.17">6.5.17</a>, <a href="#6.7.3">6.7.3</a>, <a href="#6.7.3.1">6.7.3.1</a>, <a href="#6.7.6">6.7.6</a>, <a href="#6.8">6.8</a>,                     <a href="#7.28.2.1">7.28.2.1</a>, <a href="#7.28.2.2">7.28.2.2</a>, <a href="#K.3.5.3.2">K.3.5.3.2</a>, <a href="#K.3.9.1.2">K.3.9.1.2</a>
+      <a href="#7.1.4">7.1.4</a>, <a href="#7.21.6">7.21.6</a>, <a href="#7.22.5">7.22.5</a>, <a href="#7.28.2">7.28.2</a>, <a href="#C">C</a>, <a href="#K.3.6.3">K.3.6.3</a>                  signed character, <a href="#6.3.1.1">6.3.1.1</a>
+sequenced after, see sequenced before                            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>
+sequenced before, <a href="#5.1.2.3">5.1.2.3</a>, <a href="#6.5">6.5</a>, <a href="#6.5.2.2">6.5.2.2</a>, <a href="#6.5.2.4">6.5.2.4</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="#6.5.16">6.5.16</a>, see also indeterminately sequenced,                     <a href="#6.3.1.8">6.3.1.8</a>
+      unsequenced                                                signed types, <a href="#6.2.5">6.2.5</a>, <a href="#6.7.2">6.7.2</a>
+sequencing of statements, <a href="#6.8">6.8</a>                                    significand part, <a href="#6.4.4.2">6.4.4.2</a>
+set_constraint_handler_s function,                               SIGSEGV macro, <a href="#7.14">7.14</a>, <a href="#7.14.1.1">7.14.1.1</a>
+      <a href="#K.3.1.4">K.3.1.4</a>, <a href="#K.3.6.1.1">K.3.6.1.1</a>, <a href="#K.3.6.1.2">K.3.6.1.2</a>, <a href="#K.3.6.1.3">K.3.6.1.3</a>                   SIGTERM macro, <a href="#7.14">7.14</a>
+setbuf function, <a href="#7.21.3">7.21.3</a>, <a href="#7.21.5.1">7.21.5.1</a>, <a href="#7.21.5.5">7.21.5.5</a>                      simple assignment operator (=), <a href="#6.5.16.1">6.5.16.1</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>                          sin functions, <a href="#7.12.4.6">7.12.4.6</a>, <a href="#F.10.1.6">F.10.1.6</a>
+setjmp.h header, <a href="#7.13">7.13</a>                                            sin type-generic macro, <a href="#7.24">7.24</a>, <a href="#G.7">G.7</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>                           single-byte character, <a href="#3.7.1">3.7.1</a>, <a href="#5.2.1.2">5.2.1.2</a>
+setvbuf function, <a href="#7.21.1">7.21.1</a>, <a href="#7.21.3">7.21.3</a>, <a href="#7.21.5.1">7.21.5.1</a>,                      single-byte/wide character conversion functions,
+      <a href="#7.21.5.5">7.21.5.5</a>, <a href="#7.21.5.6">7.21.5.6</a>                                              <a href="#7.28.6.1">7.28.6.1</a>
+shall, <a href="#4">4</a>                                                         single-precision arithmetic, <a href="#5.1.2.3">5.1.2.3</a>
+shift expressions, <a href="#6.5.7">6.5.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>
+shift sequence, <a href="#7.1.1">7.1.1</a>                                            singularity, <a href="#7.12.1">7.12.1</a>
+shift states, <a href="#5.2.1.2">5.2.1.2</a>                                            sinh functions, <a href="#7.12.5.5">7.12.5.5</a>, <a href="#F.10.2.5">F.10.2.5</a>
+short identifier, character, <a href="#5.2.4.1">5.2.4.1</a>, <a href="#6.4.3">6.4.3</a>                       sinh type-generic macro, <a href="#7.24">7.24</a>, <a href="#G.7">G.7</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.21.6.1">7.21.6.1</a>,                 SIZE_MAX macro, <a href="#7.20.3">7.20.3</a>
+      <a href="#7.21.6.2">7.21.6.2</a>, <a href="#7.28.2.1">7.28.2.1</a>, <a href="#7.28.2.2">7.28.2.2</a>                               size_t type, <a href="#6.2.8">6.2.8</a>, <a href="#6.5.3.4">6.5.3.4</a>, <a href="#7.19">7.19</a>, <a href="#7.20.3">7.20.3</a>, <a href="#7.21.1">7.21.1</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>,                          <a href="#7.21.6.1">7.21.6.1</a>, <a href="#7.21.6.2">7.21.6.2</a>, <a href="#7.22">7.22</a>, <a href="#7.23.1">7.23.1</a>, <a href="#7.26.1">7.26.1</a>, <a href="#7.27">7.27</a>,
+      <a href="#6.3.1.4">6.3.1.4</a>, <a href="#6.3.1.8">6.3.1.8</a>                                                <a href="#7.28.1">7.28.1</a>, <a href="#7.28.2.1">7.28.2.1</a>, <a href="#7.28.2.2">7.28.2.2</a>, <a href="#K.3.3">K.3.3</a>, <a href="#K.3.4">K.3.4</a>,
+SHRT_MAX macro, <a href="#5.2.4.2.1">5.2.4.2.1</a>                                             <a href="#K.3.5">K.3.5</a>, <a href="#K.3.6">K.3.6</a>, <a href="#K.3.7">K.3.7</a>, <a href="#K.3.8">K.3.8</a>, <a href="#K.3.9">K.3.9</a>, <a href="#K.3.9.1.2">K.3.9.1.2</a>
+SHRT_MIN macro, <a href="#5.2.4.2.1">5.2.4.2.1</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>
+side effects, <a href="#5.1.2.3">5.1.2.3</a>, <a href="#6.2.6.1">6.2.6.1</a>, <a href="#6.3.2.2">6.3.2.2</a>, <a href="#6.5">6.5</a>, <a href="#6.5.2.4">6.5.2.4</a>,           snprintf function, <a href="#7.21.6.5">7.21.6.5</a>, <a href="#7.21.6.12">7.21.6.12</a>,
+      <a href="#6.5.16">6.5.16</a>, <a href="#6.7.9">6.7.9</a>, <a href="#6.8.3">6.8.3</a>, <a href="#7.6">7.6</a>, <a href="#7.6.1">7.6.1</a>, <a href="#7.21.7.5">7.21.7.5</a>,                     <a href="#K.3.5.3.5">K.3.5.3.5</a>
+      <a href="#7.21.7.7">7.21.7.7</a>, <a href="#7.28.3.6">7.28.3.6</a>, <a href="#7.28.3.8">7.28.3.8</a>, <a href="#F.8.1">F.8.1</a>, <a href="#F.9.1">F.9.1</a>,                snprintf_s function, <a href="#K.3.5.3.5">K.3.5.3.5</a>, <a href="#K.3.5.3.6">K.3.5.3.6</a>
+      <a href="#F.9.3">F.9.3</a>                                                      snwprintf_s function, <a href="#K.3.9.1.3">K.3.9.1.3</a>, <a href="#K.3.9.1.4">K.3.9.1.4</a>
+SIG_ATOMIC_MAX macro, <a href="#7.20.3">7.20.3</a>                                     sorting utility functions, <a href="#7.22.5">7.22.5</a>, <a href="#K.3.6.3">K.3.6.3</a>
+SIG_ATOMIC_MIN macro, <a href="#7.20.3">7.20.3</a>                                     source character set, <a href="#5.1.1.2">5.1.1.2</a>, <a href="#5.2.1">5.2.1</a>
+sig_atomic_t type, <a href="#5.1.2.3">5.1.2.3</a>, <a href="#7.14">7.14</a>, <a href="#7.14.1.1">7.14.1.1</a>,                      source file, <a href="#5.1.1.1">5.1.1.1</a>
+      <a href="#7.20.3">7.20.3</a>                                                        name, <a href="#6.10.4">6.10.4</a>, <a href="#6.10.8.1">6.10.8.1</a>
+SIG_DFL macro, <a href="#7.14">7.14</a>, <a href="#7.14.1.1">7.14.1.1</a>                                    source file inclusion, <a href="#6.10.2">6.10.2</a>
+SIG_ERR macro, <a href="#7.14">7.14</a>, <a href="#7.14.1.1">7.14.1.1</a>                                    source lines, <a href="#5.1.1.2">5.1.1.2</a>
+SIG_IGN macro, <a href="#7.14">7.14</a>, <a href="#7.14.1.1">7.14.1.1</a>                                    source text, <a href="#5.1.1.2">5.1.1.2</a>
+SIGABRT macro, <a href="#7.14">7.14</a>, <a href="#7.22.4.1">7.22.4.1</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>,
+SIGFPE macro, <a href="#7.12.1">7.12.1</a>, <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>                          <a href="#7.4.1.10">7.4.1.10</a>, <a href="#7.29.2.1.3">7.29.2.1.3</a>
+SIGILL macro, <a href="#7.14">7.14</a>, <a href="#7.14.1.1">7.14.1.1</a>                                     sprintf function, <a href="#7.21.6.6">7.21.6.6</a>, <a href="#7.21.6.13">7.21.6.13</a>, <a href="#K.3.5.3.6">K.3.5.3.6</a>
+SIGINT macro, <a href="#7.14">7.14</a>                                               sprintf_s function, <a href="#K.3.5.3.5">K.3.5.3.5</a>, <a href="#K.3.5.3.6">K.3.5.3.6</a>
+
+[<a name="#p672" href="p672">page 672</a>] (<a href="#Contents">Contents</a>)
+
+sqrt functions, <a href="#7.12.7.5">7.12.7.5</a>, <a href="#F.3">F.3</a>, <a href="#F.10.4.5">F.10.4.5</a>                         do, <a href="#6.8.5.2">6.8.5.2</a>
+sqrt type-generic macro, <a href="#7.24">7.24</a>                                   else, <a href="#6.8.4.1">6.8.4.1</a>
+srand function, <a href="#7.22.2.2">7.22.2.2</a>                                        expression, <a href="#6.8.3">6.8.3</a>
+sscanf function, <a href="#7.21.6.7">7.21.6.7</a>, <a href="#7.21.6.14">7.21.6.14</a>                            for, <a href="#6.8.5.3">6.8.5.3</a>
+sscanf_s function, <a href="#K.3.5.3.7">K.3.5.3.7</a>, <a href="#K.3.5.3.14">K.3.5.3.14</a>                        goto, <a href="#6.8.6.1">6.8.6.1</a>
+standard error stream, <a href="#7.21.1">7.21.1</a>, <a href="#7.21.3">7.21.3</a>, <a href="#7.21.10.4">7.21.10.4</a>                if, <a href="#6.8.4.1">6.8.4.1</a>
+standard headers, <a href="#4">4</a>, <a href="#7.1.2">7.1.2</a>                                      iteration, <a href="#6.8.5">6.8.5</a>
+   <a href="#7.2">&lt;assert.h&gt;</a>, <a href="#7.2">7.2</a>                                              jump, <a href="#6.8.6">6.8.6</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="#6.10.8.3">6.10.8.3</a>, <a href="#7.1.2">7.1.2</a>, <a href="#7.3">7.3</a>,                labeled, <a href="#6.8.1">6.8.1</a>
+        <a href="#7.24">7.24</a>, <a href="#7.30.1">7.30.1</a>, <a href="#G.6">G.6</a>, <a href="#J.5.17">J.5.17</a>                               null, <a href="#6.8.3">6.8.3</a>
+   <a href="#7.4">&lt;ctype.h&gt;</a>, <a href="#7.4">7.4</a>, <a href="#7.30.2">7.30.2</a>                                       return, <a href="#6.8.6.4">6.8.6.4</a>, <a href="#F.6">F.6</a>
+   <a href="#7.5">&lt;errno.h&gt;</a>, <a href="#7.5">7.5</a>, <a href="#7.30.3">7.30.3</a>, <a href="#K.3.2">K.3.2</a>                                selection, <a href="#6.8.4">6.8.4</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>                sequencing, <a href="#6.8">6.8</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.22.1.3">7.22.1.3</a>,                      switch, <a href="#6.8.4.2">6.8.4.2</a>
+        <a href="#7.28.4.1.1">7.28.4.1.1</a>                                              while, <a href="#6.8.5.1">6.8.5.1</a>
+   <a href="#7.8">&lt;inttypes.h&gt;</a>, <a href="#7.8">7.8</a>, <a href="#7.30.4">7.30.4</a>                                 static assertions, <a href="#6.7.10">6.7.10</a>
+   <a href="#7.9">&lt;iso646.h&gt;</a>, <a href="#4">4</a>, <a href="#7.9">7.9</a>                                        static storage duration, <a href="#6.2.4">6.2.4</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>                     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>
+   <a href="#7.11">&lt;locale.h&gt;</a>, <a href="#7.11">7.11</a>, <a href="#7.30.5">7.30.5</a>                                  static, in array declarators, <a href="#6.7.6.2">6.7.6.2</a>, <a href="#6.7.6.3">6.7.6.3</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.24">7.24</a>, <a href="#F">F</a>, <a href="#F.10">F.10</a>,            static_assert declaration, <a href="#6.7.10">6.7.10</a>
+        <a href="#J.5.17">J.5.17</a>                                               static_assert macro, <a href="#7.2">7.2</a>
+   <a href="#7.13">&lt;setjmp.h&gt;</a>, <a href="#7.13">7.13</a>                                          stdalign.h header, <a href="#4">4</a>, <a href="#7.15">7.15</a>
+   <a href="#7.14">&lt;signal.h&gt;</a>, <a href="#7.14">7.14</a>, <a href="#7.30.6">7.30.6</a>                                  stdarg.h header, <a href="#4">4</a>, <a href="#6.7.6.3">6.7.6.3</a>, <a href="#7.16">7.16</a>
+   <a href="#7.15">&lt;stdalign.h&gt;</a>, <a href="#4">4</a>, <a href="#7.15">7.15</a>                                     stdatomic.h header, <a href="#6.10.8.3">6.10.8.3</a>, <a href="#7.1.2">7.1.2</a>, <a href="#7.17">7.17</a>
+   <a href="#7.16">&lt;stdarg.h&gt;</a>, <a href="#4">4</a>, <a href="#6.7.6.3">6.7.6.3</a>, <a href="#7.16">7.16</a>                              stdbool.h header, <a href="#4">4</a>, <a href="#7.18">7.18</a>, <a href="#7.30.7">7.30.7</a>, <a href="#H">H</a>
+   <a href="#7.17">&lt;stdatomic.h&gt;</a>, <a href="#6.10.8.3">6.10.8.3</a>, <a href="#7.1.2">7.1.2</a>, <a href="#7.17">7.17</a>                      STDC, <a href="#6.10.6">6.10.6</a>, <a href="#6.11.8">6.11.8</a>
+   <a href="#7.18">&lt;stdbool.h&gt;</a>, <a href="#4">4</a>, <a href="#7.18">7.18</a>, <a href="#7.30.7">7.30.7</a>, <a href="#H">H</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>,
+   <a href="#7.19">&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>,                       <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.19">7.19</a>, <a href="#K.3.3">K.3.3</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.19">7.19</a>, <a href="#K.3.3">K.3.3</a>                   stderr macro, <a href="#7.21.1">7.21.1</a>, <a href="#7.21.2">7.21.2</a>, <a href="#7.21.3">7.21.3</a>
+   <a href="#7.20">&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.20">7.20</a>,                stdin macro, <a href="#7.21.1">7.21.1</a>, <a href="#7.21.2">7.21.2</a>, <a href="#7.21.3">7.21.3</a>, <a href="#7.21.6.4">7.21.6.4</a>,
+        <a href="#7.30.8">7.30.8</a>, <a href="#K.3.3">K.3.3</a>, <a href="#K.3.4">K.3.4</a>                                       <a href="#7.21.7.6">7.21.7.6</a>, <a href="#7.28.2.12">7.28.2.12</a>, <a href="#7.28.3.7">7.28.3.7</a>, <a href="#K.3.5.3.4">K.3.5.3.4</a>,
+   <a href="#7.21">&lt;stdio.h&gt;</a>, <a href="#5.2.4.2.2">5.2.4.2.2</a>, <a href="#7.21">7.21</a>, <a href="#7.30.9">7.30.9</a>, <a href="#F">F</a>, <a href="#K.3.5">K.3.5</a>                    <a href="#K.3.5.4.1">K.3.5.4.1</a>, <a href="#K.3.9.1.14">K.3.9.1.14</a>
+   <a href="#7.22">&lt;stdlib.h&gt;</a>, <a href="#5.2.4.2.2">5.2.4.2.2</a>, <a href="#7.22">7.22</a>, <a href="#7.30.10">7.30.10</a>, <a href="#F">F</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.20">7.20</a>,
+        <a href="#K.3.1.4">K.3.1.4</a>, <a href="#K.3.6">K.3.6</a>                                             <a href="#7.30.8">7.30.8</a>, <a href="#K.3.3">K.3.3</a>, <a href="#K.3.4">K.3.4</a>
+   <a href="#7.23">&lt;string.h&gt;</a>, <a href="#7.23">7.23</a>, <a href="#7.30.11">7.30.11</a>, <a href="#K.3.7">K.3.7</a>                          stdio.h header, <a href="#5.2.4.2.2">5.2.4.2.2</a>, <a href="#7.21">7.21</a>, <a href="#7.30.9">7.30.9</a>, <a href="#F">F</a>, <a href="#K.3.5">K.3.5</a>
+   <a href="#7.24">&lt;tgmath.h&gt;</a>, <a href="#7.24">7.24</a>, <a href="#G.7">G.7</a>                                     stdlib.h header, <a href="#5.2.4.2.2">5.2.4.2.2</a>, <a href="#7.22">7.22</a>, <a href="#7.30.10">7.30.10</a>, <a href="#F">F</a>,
+   <a href="#7.25">&lt;threads.h&gt;</a>, <a href="#6.10.8.3">6.10.8.3</a>, <a href="#7.1.2">7.1.2</a>, <a href="#7.25">7.25</a>                              <a href="#K.3.1.4">K.3.1.4</a>, <a href="#K.3.6">K.3.6</a>
+   <a href="#7.26">&lt;time.h&gt;</a>, <a href="#7.26">7.26</a>, <a href="#K.3.8">K.3.8</a>                                     stdout macro, <a href="#7.21.1">7.21.1</a>, <a href="#7.21.2">7.21.2</a>, <a href="#7.21.3">7.21.3</a>, <a href="#7.21.6.3">7.21.6.3</a>,
+   <a href="#7.27">&lt;uchar.h&gt;</a>, <a href="#6.4.4.4">6.4.4.4</a>, <a href="#6.4.5">6.4.5</a>, <a href="#7.27">7.27</a>                                 <a href="#7.21.7.8">7.21.7.8</a>, <a href="#7.21.7.9">7.21.7.9</a>, <a href="#7.28.2.11">7.28.2.11</a>, <a href="#7.28.3.9">7.28.3.9</a>
+   <a href="#7.28">&lt;wchar.h&gt;</a>, <a href="#5.2.4.2.2">5.2.4.2.2</a>, <a href="#7.21.1">7.21.1</a>, <a href="#7.28">7.28</a>, <a href="#7.30.12">7.30.12</a>,              storage duration, <a href="#6.2.4">6.2.4</a>
+        <a href="#F">F</a>, <a href="#K.3.9">K.3.9</a>                                             storage order of array, <a href="#6.5.2.1">6.5.2.1</a>
+   <a href="#7.29">&lt;wctype.h&gt;</a>, <a href="#7.29">7.29</a>, <a href="#7.30.13">7.30.13</a>                                 storage unit (bit-field), <a href="#6.2.6.1">6.2.6.1</a>, <a href="#6.7.2.1">6.7.2.1</a>
+standard input stream, <a href="#7.21.1">7.21.1</a>, <a href="#7.21.3">7.21.3</a>                        storage-class specifiers, <a href="#6.7.1">6.7.1</a>, <a href="#6.11.5">6.11.5</a>
+standard integer types, <a href="#6.2.5">6.2.5</a>                                strcat function, <a href="#7.23.3.1">7.23.3.1</a>
+standard output stream, <a href="#7.21.1">7.21.1</a>, <a href="#7.21.3">7.21.3</a>                       strcat_s function, <a href="#K.3.7.2.1">K.3.7.2.1</a>
+standard signed integer types, <a href="#6.2.5">6.2.5</a>                         strchr function, <a href="#7.23.5.2">7.23.5.2</a>
+state-dependent encoding, <a href="#5.2.1.2">5.2.1.2</a>, <a href="#7.22.7">7.22.7</a>, <a href="#K.3.6.4">K.3.6.4</a>           strcmp function, <a href="#7.23.4">7.23.4</a>, <a href="#7.23.4.2">7.23.4.2</a>
+statements, <a href="#6.8">6.8</a>                                              strcoll function, <a href="#7.11.1.1">7.11.1.1</a>, <a href="#7.23.4.3">7.23.4.3</a>, <a href="#7.23.4.5">7.23.4.5</a>
+   break, <a href="#6.8.6.3">6.8.6.3</a>                                            strcpy function, <a href="#7.23.2.3">7.23.2.3</a>
+   compound, <a href="#6.8.2">6.8.2</a>                                           strcpy_s function, <a href="#K.3.7.1.3">K.3.7.1.3</a>
+   continue, <a href="#6.8.6.2">6.8.6.2</a>                                         strcspn function, <a href="#7.23.5.3">7.23.5.3</a>
+
+[<a name="#p673" href="p673">page 673</a>] (<a href="#Contents">Contents</a>)
+
+streams, <a href="#7.21.2">7.21.2</a>, <a href="#7.22.4.4">7.22.4.4</a>                                                <a href="#7.22.1.4">7.22.1.4</a>, <a href="#7.28.2.2">7.28.2.2</a>
+   fully buffered, <a href="#7.21.3">7.21.3</a>                                          strtoull function, <a href="#7.8.2.3">7.8.2.3</a>, <a href="#7.22.1.2">7.22.1.2</a>, <a href="#7.22.1.4">7.22.1.4</a>
+   line buffered, <a href="#7.21.3">7.21.3</a>                                           strtoumax function, <a href="#7.8.2.3">7.8.2.3</a>
+   orientation, <a href="#7.21.2">7.21.2</a>                                             struct hack, see flexible array member
+   standard error, <a href="#7.21.1">7.21.1</a>, <a href="#7.21.3">7.21.3</a>                                  struct lconv, <a href="#7.11">7.11</a>
+   standard input, <a href="#7.21.1">7.21.1</a>, <a href="#7.21.3">7.21.3</a>                                  struct tm, <a href="#7.26.1">7.26.1</a>
+   standard output, <a href="#7.21.1">7.21.1</a>, <a href="#7.21.3">7.21.3</a>                                 structure
+   unbuffered, <a href="#7.21.3">7.21.3</a>                                                 arrow operator (-&gt;), <a href="#6.5.2.3">6.5.2.3</a>
+strerror function, <a href="#7.21.10.4">7.21.10.4</a>, <a href="#7.23.6.2">7.23.6.2</a>                                content, <a href="#6.7.2.3">6.7.2.3</a>
+strerror_s function, <a href="#K.3.7.4.2">K.3.7.4.2</a>, <a href="#K.3.7.4.3">K.3.7.4.3</a>                             dot operator (.), <a href="#6.5.2.3">6.5.2.3</a>
+strerrorlen_s function, <a href="#K.3.7.4.3">K.3.7.4.3</a>                                     initialization, <a href="#6.7.9">6.7.9</a>
+strftime function, <a href="#7.11.1.1">7.11.1.1</a>, <a href="#7.26.3">7.26.3</a>, <a href="#7.26.3.5">7.26.3.5</a>,                        member alignment, <a href="#6.7.2.1">6.7.2.1</a>
+      <a href="#7.28.5.1">7.28.5.1</a>, <a href="#K.3.8.2">K.3.8.2</a>, <a href="#K.3.8.2.1">K.3.8.2.1</a>, <a href="#K.3.8.2.2">K.3.8.2.2</a>                         member name space, <a href="#6.2.3">6.2.3</a>
+stricter, <a href="#6.2.8">6.2.8</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>
+strictly conforming program, <a href="#4">4</a>                                        pointer operator (-&gt;), <a href="#6.5.2.3">6.5.2.3</a>
+string, <a href="#7.1.1">7.1.1</a>                                                         specifier, <a href="#6.7.2.1">6.7.2.1</a>
+   comparison functions, <a href="#7.23.4">7.23.4</a>                                       tag, <a href="#6.2.3">6.2.3</a>, <a href="#6.7.2.3">6.7.2.3</a>
+   concatenation functions, <a href="#7.23.3">7.23.3</a>, <a href="#K.3.7.2">K.3.7.2</a>                           type, <a href="#6.2.5">6.2.5</a>, <a href="#6.7.2.1">6.7.2.1</a>
+   conversion functions, <a href="#7.11.1.1">7.11.1.1</a>                                  strxfrm function, <a href="#7.11.1.1">7.11.1.1</a>, <a href="#7.23.4.5">7.23.4.5</a>
+   copying functions, <a href="#7.23.2">7.23.2</a>, <a href="#K.3.7.1">K.3.7.1</a>                              subnormal floating-point numbers, <a href="#5.2.4.2.2">5.2.4.2.2</a>
+   library function conventions, <a href="#7.23.1">7.23.1</a>                            subscripting, <a href="#6.5.2.1">6.5.2.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.9">6.7.9</a>           subtraction assignment operator (-=), <a href="#6.5.16.2">6.5.16.2</a>
+   miscellaneous functions, <a href="#7.23.6">7.23.6</a>, <a href="#K.3.7.4">K.3.7.4</a>                        subtraction operator (-), <a href="#6.2.6.2">6.2.6.2</a>, <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>
+   numeric conversion functions, <a href="#7.8.2.3">7.8.2.3</a>, <a href="#7.22.1">7.22.1</a>                   suffix
+   search functions, <a href="#7.23.5">7.23.5</a>, <a href="#K.3.7.3">K.3.7.3</a>                                  floating constant, <a href="#6.4.4.2">6.4.4.2</a>
+string handling header, <a href="#7.23">7.23</a>, <a href="#K.3.7">K.3.7</a>                                   integer constant, <a href="#6.4.4.1">6.4.4.1</a>
+string.h header, <a href="#7.23">7.23</a>, <a href="#7.30.11">7.30.11</a>, <a href="#K.3.7">K.3.7</a>                              switch body, <a href="#6.8.4.2">6.8.4.2</a>
+stringizing, <a href="#6.10.3.2">6.10.3.2</a>, <a href="#6.10.9">6.10.9</a>                                      switch case label, <a href="#6.8.1">6.8.1</a>, <a href="#6.8.4.2">6.8.4.2</a>
+strlen function, <a href="#7.23.6.3">7.23.6.3</a>                                          switch default label, <a href="#6.8.1">6.8.1</a>, <a href="#6.8.4.2">6.8.4.2</a>
+strncat function, <a href="#7.23.3.2">7.23.3.2</a>                                         switch statement, <a href="#6.8.1">6.8.1</a>, <a href="#6.8.4.2">6.8.4.2</a>
+strncat_s function, <a href="#K.3.7.2.2">K.3.7.2.2</a>                                      swprintf function, <a href="#7.28.2.3">7.28.2.3</a>, <a href="#7.28.2.7">7.28.2.7</a>,
+strncmp function, <a href="#7.23.4">7.23.4</a>, <a href="#7.23.4.4">7.23.4.4</a>                                       <a href="#K.3.9.1.3">K.3.9.1.3</a>, <a href="#K.3.9.1.4">K.3.9.1.4</a>
+strncpy function, <a href="#7.23.2.4">7.23.2.4</a>                                         swprintf_s function, <a href="#K.3.9.1.3">K.3.9.1.3</a>, <a href="#K.3.9.1.4">K.3.9.1.4</a>
+strncpy_s function, <a href="#K.3.7.1.4">K.3.7.1.4</a>                                      swscanf function, <a href="#7.28.2.4">7.28.2.4</a>, <a href="#7.28.2.8">7.28.2.8</a>
+strnlen_s function, <a href="#K.3.7.4.4">K.3.7.4.4</a>                                      swscanf_s function, <a href="#K.3.9.1.5">K.3.9.1.5</a>, <a href="#K.3.9.1.10">K.3.9.1.10</a>
+stronger, <a href="#6.2.8">6.2.8</a>                                                    symbols, <a href="#3">3</a>
+strpbrk function, <a href="#7.23.5.4">7.23.5.4</a>                                         synchronization operation, <a href="#5.1.2.4">5.1.2.4</a>
+strrchr function, <a href="#7.23.5.5">7.23.5.5</a>                                         synchronize with, <a href="#5.1.2.4">5.1.2.4</a>
+strspn function, <a href="#7.23.5.6">7.23.5.6</a>                                          syntactic categories, <a href="#6.1">6.1</a>
+strstr function, <a href="#7.23.5.7">7.23.5.7</a>                                          syntax notation, <a href="#6.1">6.1</a>
+strtod function, <a href="#7.12.11.2">7.12.11.2</a>, <a href="#7.21.6.2">7.21.6.2</a>, <a href="#7.22.1.3">7.22.1.3</a>,                    syntax rule precedence, <a href="#5.1.1.2">5.1.1.2</a>
+      <a href="#7.28.2.2">7.28.2.2</a>, <a href="#F.3">F.3</a>                                                syntax summary, language, <a href="#A">A</a>
+strtof function, <a href="#7.12.11.2">7.12.11.2</a>, <a href="#7.22.1.3">7.22.1.3</a>, <a href="#F.3">F.3</a>                          system function, <a href="#7.22.4.8">7.22.4.8</a>
+strtoimax function, <a href="#7.8.2.3">7.8.2.3</a>
+strtok function, <a href="#7.23.5.8">7.23.5.8</a>                                          tab characters, <a href="#5.2.1">5.2.1</a>, <a href="#6.4">6.4</a>
+strtok_s function, <a href="#K.3.7.3.1">K.3.7.3.1</a>                                       tag compatibility, <a href="#6.2.7">6.2.7</a>
+strtol function, <a href="#7.8.2.3">7.8.2.3</a>, <a href="#7.21.6.2">7.21.6.2</a>, <a href="#7.22.1.2">7.22.1.2</a>,                      tag name space, <a href="#6.2.3">6.2.3</a>
+      <a href="#7.22.1.4">7.22.1.4</a>, <a href="#7.28.2.2">7.28.2.2</a>                                           tags, <a href="#6.7.2.3">6.7.2.3</a>
+strtold function, <a href="#7.12.11.2">7.12.11.2</a>, <a href="#7.22.1.3">7.22.1.3</a>, <a href="#F.3">F.3</a>                         tan functions, <a href="#7.12.4.7">7.12.4.7</a>, <a href="#F.10.1.7">F.10.1.7</a>
+strtoll function, <a href="#7.8.2.3">7.8.2.3</a>, <a href="#7.22.1.2">7.22.1.2</a>, <a href="#7.22.1.4">7.22.1.4</a>                      tan type-generic macro, <a href="#7.24">7.24</a>, <a href="#G.7">G.7</a>
+strtoul function, <a href="#7.8.2.3">7.8.2.3</a>, <a href="#7.21.6.2">7.21.6.2</a>, <a href="#7.22.1.2">7.22.1.2</a>,                     tanh functions, <a href="#7.12.5.6">7.12.5.6</a>, <a href="#F.10.2.6">F.10.2.6</a>
+
+[<a name="#p674" href="p674">page 674</a>] (<a href="#Contents">Contents</a>)
+
+tanh type-generic macro, <a href="#7.24">7.24</a>, <a href="#G.7">G.7</a>                            toupper function, <a href="#7.4.2.2">7.4.2.2</a>
+temporary lifetime, <a href="#6.2.4">6.2.4</a>                                     towctrans function, <a href="#7.29.3.2.1">7.29.3.2.1</a>, <a href="#7.29.3.2.2">7.29.3.2.2</a>
+tentative definition, <a href="#6.9.2">6.9.2</a>                                    towlower function, <a href="#7.29.3.1.1">7.29.3.1.1</a>, <a href="#7.29.3.2.1">7.29.3.2.1</a>
+terms, <a href="#3">3</a>                                                      towupper function, <a href="#7.29.3.1.2">7.29.3.1.2</a>, <a href="#7.29.3.2.1">7.29.3.2.1</a>
+text streams, <a href="#7.21.2">7.21.2</a>, <a href="#7.21.7.10">7.21.7.10</a>, <a href="#7.21.9.2">7.21.9.2</a>, <a href="#7.21.9.4">7.21.9.4</a>           translation environment, <a href="#5">5</a>, <a href="#5.1.1">5.1.1</a>
+tgamma functions, <a href="#7.12.8.4">7.12.8.4</a>, <a href="#F.10.5.4">F.10.5.4</a>                          translation limits, <a href="#5.2.4.1">5.2.4.1</a>
+tgamma type-generic macro, <a href="#7.24">7.24</a>                               translation phases, <a href="#5.1.1.2">5.1.1.2</a>
+tgmath.h header, <a href="#7.24">7.24</a>, <a href="#G.7">G.7</a>                                    translation unit, <a href="#5.1.1.1">5.1.1.1</a>, <a href="#6.9">6.9</a>
+thrd_create function, <a href="#7.25.1">7.25.1</a>, <a href="#7.25.5.1">7.25.5.1</a>                        trap, see perform a trap
+thrd_current function, <a href="#7.25.5.2">7.25.5.2</a>                               trap representation, <a href="#3.19.4">3.19.4</a>, <a href="#6.2.6.1">6.2.6.1</a>, <a href="#6.2.6.2">6.2.6.2</a>,
+thrd_detach function, <a href="#7.25.5.3">7.25.5.3</a>                                      <a href="#6.3.2.3">6.3.2.3</a>, <a href="#6.5.2.3">6.5.2.3</a>
+thrd_equal function, <a href="#7.25.5.4">7.25.5.4</a>                                 trigonometric functions
+thrd_exit function, <a href="#7.25.5.5">7.25.5.5</a>                                     complex, <a href="#7.3.5">7.3.5</a>, <a href="#G.6.1">G.6.1</a>
+thrd_join function, <a href="#7.25.5.6">7.25.5.6</a>                                     real, <a href="#7.12.4">7.12.4</a>, <a href="#F.10.1">F.10.1</a>
+thrd_sleep function, <a href="#7.25.5.7">7.25.5.7</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>
+thrd_start_t type, <a href="#7.25.1">7.25.1</a>                                     true macro, <a href="#7.18">7.18</a>
+thrd_t type, <a href="#7.25.1">7.25.1</a>                                           trunc functions, <a href="#7.12.9.8">7.12.9.8</a>, <a href="#F.10.6.8">F.10.6.8</a>
+thrd_yield function, <a href="#7.25.5.8">7.25.5.8</a>                                 trunc type-generic macro, <a href="#7.24">7.24</a>
+thread of execution, <a href="#5.1.2.4">5.1.2.4</a>, <a href="#7.1.4">7.1.4</a>, <a href="#7.6">7.6</a>, <a href="#7.22.4.6">7.22.4.6</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.21.3">7.21.3</a>, <a href="#7.21.5.3">7.21.5.3</a>
+thread storage duration, <a href="#6.2.4">6.2.4</a>, <a href="#7.6">7.6</a>                           truncation toward zero, <a href="#6.5.5">6.5.5</a>
+threads header, <a href="#7.25">7.25</a>                                          tss_create function, <a href="#7.25.6.1">7.25.6.1</a>
+threads.h header, <a href="#6.10.8.3">6.10.8.3</a>, <a href="#7.1.2">7.1.2</a>, <a href="#7.25">7.25</a>                       tss_delete function, <a href="#7.25.6.2">7.25.6.2</a>
+time                                                          TSS_DTOR_ITERATIONS macro, <a href="#7.25.1">7.25.1</a>
+   broken down, <a href="#7.26.1">7.26.1</a>, <a href="#7.26.2.3">7.26.2.3</a>, <a href="#7.26.3">7.26.3</a>, <a href="#7.26.3.1">7.26.3.1</a>,           tss_dtor_t type, <a href="#7.25.1">7.25.1</a>
+         <a href="#7.26.3.3">7.26.3.3</a>, <a href="#7.26.3.4">7.26.3.4</a>, <a href="#7.26.3.5">7.26.3.5</a>, <a href="#K.3.8.2.1">K.3.8.2.1</a>,             tss_get function, <a href="#7.25.6.3">7.25.6.3</a>
+         <a href="#K.3.8.2.3">K.3.8.2.3</a>, <a href="#K.3.8.2.4">K.3.8.2.4</a>                                 tss_set function, <a href="#7.25.6.4">7.25.6.4</a>
+   calendar, <a href="#7.26.1">7.26.1</a>, <a href="#7.26.2.2">7.26.2.2</a>, <a href="#7.26.2.3">7.26.2.3</a>, <a href="#7.26.2.4">7.26.2.4</a>,            tss_t type, <a href="#7.25.1">7.25.1</a>
+         <a href="#7.26.3.2">7.26.3.2</a>, <a href="#7.26.3.3">7.26.3.3</a>, <a href="#7.26.3.4">7.26.3.4</a>, <a href="#K.3.8.2.2">K.3.8.2.2</a>,             two's complement, <a href="#6.2.6.2">6.2.6.2</a>, <a href="#7.20.1.1">7.20.1.1</a>
+         <a href="#K.3.8.2.3">K.3.8.2.3</a>, <a href="#K.3.8.2.4">K.3.8.2.4</a>                                 type category, <a href="#6.2.5">6.2.5</a>
+   components, <a href="#7.26.1">7.26.1</a>, <a href="#K.3.8.1">K.3.8.1</a>                                type conversion, <a href="#6.3">6.3</a>
+   conversion functions, <a href="#7.26.3">7.26.3</a>, <a href="#K.3.8.2">K.3.8.2</a>                      type definitions, <a href="#6.7.8">6.7.8</a>
+      wide character, <a href="#7.28.5">7.28.5</a>                                  type domain, <a href="#6.2.5">6.2.5</a>, <a href="#G.2">G.2</a>
+   local, <a href="#7.26.1">7.26.1</a>                                              type names, <a href="#6.7.7">6.7.7</a>
+   manipulation functions, <a href="#7.26.2">7.26.2</a>                             type punning, <a href="#6.5.2.3">6.5.2.3</a>
+   normalized broken down, <a href="#K.3.8.1">K.3.8.1</a>, <a href="#K.3.8.2.1">K.3.8.2.1</a>                 type qualifiers, <a href="#6.7.3">6.7.3</a>
+time function, <a href="#7.26.2.4">7.26.2.4</a>                                       type specifiers, <a href="#6.7.2">6.7.2</a>
+time.h header, <a href="#7.26">7.26</a>, <a href="#K.3.8">K.3.8</a>                                    type-generic macro, <a href="#7.24">7.24</a>, <a href="#G.7">G.7</a>
+time_t type, <a href="#7.26.1">7.26.1</a>                                           typedef declaration, <a href="#6.7.8">6.7.8</a>
+TIME_UTC macro, <a href="#7.25.7.1">7.25.7.1</a>                                      typedef storage-class specifier, <a href="#6.7.1">6.7.1</a>, <a href="#6.7.8">6.7.8</a>
+tm structure type, <a href="#7.26.1">7.26.1</a>, <a href="#7.28.1">7.28.1</a>, <a href="#K.3.8.1">K.3.8.1</a>                    types, <a href="#6.2.5">6.2.5</a>
+TMP_MAX macro, <a href="#7.21.1">7.21.1</a>, <a href="#7.21.4.3">7.21.4.3</a>, <a href="#7.21.4.4">7.21.4.4</a>                        atomic, <a href="#5.1.2.3">5.1.2.3</a>, <a href="#6.2.5">6.2.5</a>, <a href="#6.2.6.1">6.2.6.1</a>, <a href="#6.3.2.1">6.3.2.1</a>, <a href="#6.5.2.3">6.5.2.3</a>,
+TMP_MAX_S macro, <a href="#K.3.5">K.3.5</a>, <a href="#K.3.5.1.1">K.3.5.1.1</a>, <a href="#K.3.5.1.2">K.3.5.1.2</a>                           <a href="#6.5.2.4">6.5.2.4</a>, <a href="#6.5.16.2">6.5.16.2</a>, <a href="#6.7.2.4">6.7.2.4</a>, <a href="#6.10.8.3">6.10.8.3</a>, <a href="#7.17.6">7.17.6</a>
+tmpfile function, <a href="#7.21.4.3">7.21.4.3</a>, <a href="#7.22.4.4">7.22.4.4</a>                             character, <a href="#6.7.9">6.7.9</a>
+tmpfile_s function, <a href="#K.3.5.1.1">K.3.5.1.1</a>, <a href="#K.3.5.1.2">K.3.5.1.2</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.6">6.7.6</a>
+tmpnam function, <a href="#7.21.1">7.21.1</a>, <a href="#7.21.4.3">7.21.4.3</a>, <a href="#7.21.4.4">7.21.4.4</a>,                     complex, <a href="#6.2.5">6.2.5</a>, <a href="#G">G</a>
+      <a href="#K.3.5.1.2">K.3.5.1.2</a>                                                  composite, <a href="#6.2.7">6.2.7</a>
+tmpnam_s function, <a href="#K.3.5">K.3.5</a>, <a href="#K.3.5.1.1">K.3.5.1.1</a>, <a href="#K.3.5.1.2">K.3.5.1.2</a>                   const qualified, <a href="#6.7.3">6.7.3</a>
+token, <a href="#5.1.1.2">5.1.1.2</a>, <a href="#6.4">6.4</a>, see also preprocessing tokens               conversions, <a href="#6.3">6.3</a>
+token concatenation, <a href="#6.10.3.3">6.10.3.3</a>                                    imaginary, <a href="#G">G</a>
+token pasting, <a href="#6.10.3.3">6.10.3.3</a>                                          restrict qualified, <a href="#6.7.3">6.7.3</a>
+tolower function, <a href="#7.4.2.1">7.4.2.1</a>                                        volatile qualified, <a href="#6.7.3">6.7.3</a>
+
+[<a name="#p675" href="p675">page 675</a>] (<a href="#Contents">Contents</a>)
+
+uchar.h header, <a href="#6.4.4.4">6.4.4.4</a>, <a href="#6.4.5">6.4.5</a>, <a href="#7.27">7.27</a>                      universal character name, <a href="#6.4.3">6.4.3</a>
+UCHAR_MAX macro, <a href="#5.2.4.2.1">5.2.4.2.1</a>                                unnormalized floating-point numbers, <a href="#5.2.4.2.2">5.2.4.2.2</a>
+UINT_FASTN_MAX macros, <a href="#7.20.2.3">7.20.2.3</a>                           unqualified type, <a href="#6.2.5">6.2.5</a>
+uint_fastN_t types, <a href="#7.20.1.3">7.20.1.3</a>                              unqualified version of type, <a href="#6.2.5">6.2.5</a>
+uint_least16_t type, <a href="#7.27">7.27</a>                                 unsequenced, <a href="#5.1.2.3">5.1.2.3</a>, <a href="#6.5">6.5</a>, <a href="#6.5.16">6.5.16</a>, see also
+uint_least32_t type, <a href="#7.27">7.27</a>                                       indeterminately sequenced, sequenced
+UINT_LEASTN_MAX macros, <a href="#7.20.2.2">7.20.2.2</a>                                before
+uint_leastN_t types, <a href="#7.20.1.2">7.20.1.2</a>                             unsigned char type, <a href="#K.3.5.3.2">K.3.5.3.2</a>, <a href="#K.3.9.1.2">K.3.9.1.2</a>
+UINT_MAX macro, <a href="#5.2.4.2.1">5.2.4.2.1</a>                                 unsigned integer suffix, u or <a href="#U">U</a>, <a href="#6.4.4.1">6.4.4.1</a>
+UINTMAX_C macro, <a href="#7.20.4.2">7.20.4.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>
+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.20.2.5">7.20.2.5</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>,
+uintmax_t type, <a href="#7.20.1.5">7.20.1.5</a>, <a href="#7.21.6.1">7.21.6.1</a>, <a href="#7.21.6.2">7.21.6.2</a>,                   <a href="#6.3.1.4">6.3.1.4</a>, <a href="#6.3.1.8">6.3.1.8</a>
+     <a href="#7.28.2.1">7.28.2.1</a>, <a href="#7.28.2.2">7.28.2.2</a>                                   unsigned types, <a href="#6.2.5">6.2.5</a>, <a href="#6.7.2">6.7.2</a>, <a href="#7.21.6.1">7.21.6.1</a>, <a href="#7.21.6.2">7.21.6.2</a>,
+UINTN_C macros, <a href="#7.20.4.1">7.20.4.1</a>                                        <a href="#7.28.2.1">7.28.2.1</a>, <a href="#7.28.2.2">7.28.2.2</a>
+UINTN_MAX macros, <a href="#7.20.2.1">7.20.2.1</a>                                unspecified behavior, <a href="#3.4.4">3.4.4</a>, <a href="#4">4</a>, <a href="#J.1">J.1</a>
+uintN_t types, <a href="#7.20.1.1">7.20.1.1</a>                                   unspecified value, <a href="#3.19.3">3.19.3</a>
+UINTPTR_MAX macro, <a href="#7.20.2.4">7.20.2.4</a>                               uppercase letter, <a href="#5.2.1">5.2.1</a>
+uintptr_t type, <a href="#7.20.1.4">7.20.1.4</a>                                  use of library functions, <a href="#7.1.4">7.1.4</a>
+ULLONG_MAX macro, <a href="#5.2.4.2.1">5.2.4.2.1</a>, <a href="#7.22.1.4">7.22.1.4</a>,                    USHRT_MAX macro, <a href="#5.2.4.2.1">5.2.4.2.1</a>
+     <a href="#7.28.4.1.2">7.28.4.1.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>,
+ULONG_MAX macro, <a href="#5.2.4.2.1">5.2.4.2.1</a>, <a href="#7.22.1.4">7.22.1.4</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>
+     <a href="#7.28.4.1.2">7.28.4.1.2</a>                                           UTF-16, <a href="#6.10.8.2">6.10.8.2</a>
+unary arithmetic operators, <a href="#6.5.3.3">6.5.3.3</a>                       UTF-32, <a href="#6.10.8.2">6.10.8.2</a>
+unary expression, <a href="#6.5.3">6.5.3</a>                                   UTF-8 string literal, see string literal
+unary minus operator (-), <a href="#6.5.3.3">6.5.3.3</a>, <a href="#F.3">F.3</a>                    utilities, general, <a href="#7.22">7.22</a>, <a href="#K.3.6">K.3.6</a>
+unary operators, <a href="#6.5.3">6.5.3</a>                                       wide string, <a href="#7.28.4">7.28.4</a>, <a href="#K.3.9.2">K.3.9.2</a>
+unary plus operator (+), <a href="#6.5.3.3">6.5.3.3</a>
+unbuffered stream, <a href="#7.21.3">7.21.3</a>                                 va_arg macro, <a href="#7.16">7.16</a>, <a href="#7.16.1">7.16.1</a>, <a href="#7.16.1.1">7.16.1.1</a>, <a href="#7.16.1.2">7.16.1.2</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.16.1.4">7.16.1.4</a>, <a href="#7.21.6.8">7.21.6.8</a>, <a href="#7.21.6.9">7.21.6.9</a>, <a href="#7.21.6.10">7.21.6.10</a>,
+     <a href="#7.1.4">7.1.4</a>                                                     <a href="#7.21.6.11">7.21.6.11</a>, <a href="#7.21.6.12">7.21.6.12</a>, <a href="#7.21.6.13">7.21.6.13</a>, <a href="#7.21.6.14">7.21.6.14</a>,
+undefined behavior, <a href="#3.4.3">3.4.3</a>, <a href="#4">4</a>, <a href="#J.2">J.2</a>                               <a href="#7.28.2.5">7.28.2.5</a>, <a href="#7.28.2.6">7.28.2.6</a>, <a href="#7.28.2.7">7.28.2.7</a>, <a href="#7.28.2.8">7.28.2.8</a>,
+underscore character, <a href="#6.4.2.1">6.4.2.1</a>                                  <a href="#7.28.2.9">7.28.2.9</a>, <a href="#7.28.2.10">7.28.2.10</a>, <a href="#K.3.5.3.9">K.3.5.3.9</a>, <a href="#K.3.5.3.11">K.3.5.3.11</a>,
+underscore, leading, in identifier, <a href="#7.1.3">7.1.3</a>                       <a href="#K.3.5.3.14">K.3.5.3.14</a>, <a href="#K.3.9.1.7">K.3.9.1.7</a>, <a href="#K.3.9.1.10">K.3.9.1.10</a>, <a href="#K.3.9.1.12">K.3.9.1.12</a>
+ungetc function, <a href="#7.21.1">7.21.1</a>, <a href="#7.21.7.10">7.21.7.10</a>, <a href="#7.21.9.2">7.21.9.2</a>,             va_copy macro, <a href="#7.1.3">7.1.3</a>, <a href="#7.16">7.16</a>, <a href="#7.16.1">7.16.1</a>, <a href="#7.16.1.1">7.16.1.1</a>,
+     <a href="#7.21.9.3">7.21.9.3</a>                                                  <a href="#7.16.1.2">7.16.1.2</a>, <a href="#7.16.1.3">7.16.1.3</a>
+ungetwc function, <a href="#7.21.1">7.21.1</a>, <a href="#7.28.3.10">7.28.3.10</a>                       va_end macro, <a href="#7.1.3">7.1.3</a>, <a href="#7.16">7.16</a>, <a href="#7.16.1">7.16.1</a>, <a href="#7.16.1.3">7.16.1.3</a>,
+Unicode, <a href="#7.27">7.27</a>, see also char16_t type,                         <a href="#7.16.1.4">7.16.1.4</a>, <a href="#7.21.6.8">7.21.6.8</a>, <a href="#7.21.6.9">7.21.6.9</a>, <a href="#7.21.6.10">7.21.6.10</a>,
+     char32_t type, wchar_t type                               <a href="#7.21.6.11">7.21.6.11</a>, <a href="#7.21.6.12">7.21.6.12</a>, <a href="#7.21.6.13">7.21.6.13</a>, <a href="#7.21.6.14">7.21.6.14</a>,
+Unicode required set, <a href="#6.10.8.2">6.10.8.2</a>                                 <a href="#7.28.2.5">7.28.2.5</a>, <a href="#7.28.2.6">7.28.2.6</a>, <a href="#7.28.2.7">7.28.2.7</a>, <a href="#7.28.2.8">7.28.2.8</a>,
+union                                                          <a href="#7.28.2.9">7.28.2.9</a>, <a href="#7.28.2.10">7.28.2.10</a>, <a href="#K.3.5.3.9">K.3.5.3.9</a>, <a href="#K.3.5.3.11">K.3.5.3.11</a>,
+  arrow operator (-&gt;), <a href="#6.5.2.3">6.5.2.3</a>                                 <a href="#K.3.5.3.14">K.3.5.3.14</a>, <a href="#K.3.9.1.7">K.3.9.1.7</a>, <a href="#K.3.9.1.10">K.3.9.1.10</a>, <a href="#K.3.9.1.12">K.3.9.1.12</a>
+  content, <a href="#6.7.2.3">6.7.2.3</a>                                        va_list type, <a href="#7.16">7.16</a>, <a href="#7.16.1.3">7.16.1.3</a>
+  dot operator (.), <a href="#6.5.2.3">6.5.2.3</a>                               va_start macro, <a href="#7.16">7.16</a>, <a href="#7.16.1">7.16.1</a>, <a href="#7.16.1.1">7.16.1.1</a>,
+  initialization, <a href="#6.7.9">6.7.9</a>                                        <a href="#7.16.1.2">7.16.1.2</a>, <a href="#7.16.1.3">7.16.1.3</a>, <a href="#7.16.1.4">7.16.1.4</a>, <a href="#7.21.6.8">7.21.6.8</a>,
+  member alignment, <a href="#6.7.2.1">6.7.2.1</a>                                    <a href="#7.21.6.9">7.21.6.9</a>, <a href="#7.21.6.10">7.21.6.10</a>, <a href="#7.21.6.11">7.21.6.11</a>, <a href="#7.21.6.12">7.21.6.12</a>,
+  member name space, <a href="#6.2.3">6.2.3</a>                                     <a href="#7.21.6.13">7.21.6.13</a>, <a href="#7.21.6.14">7.21.6.14</a>, <a href="#7.28.2.5">7.28.2.5</a>, <a href="#7.28.2.6">7.28.2.6</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>                        <a href="#7.28.2.7">7.28.2.7</a>, <a href="#7.28.2.8">7.28.2.8</a>, <a href="#7.28.2.9">7.28.2.9</a>, <a href="#7.28.2.10">7.28.2.10</a>,
+  pointer operator (-&gt;), <a href="#6.5.2.3">6.5.2.3</a>                               <a href="#K.3.5.3.9">K.3.5.3.9</a>, <a href="#K.3.5.3.11">K.3.5.3.11</a>, <a href="#K.3.5.3.14">K.3.5.3.14</a>, <a href="#K.3.9.1.7">K.3.9.1.7</a>,
+  specifier, <a href="#6.7.2.1">6.7.2.1</a>                                            <a href="#K.3.9.1.10">K.3.9.1.10</a>, <a href="#K.3.9.1.12">K.3.9.1.12</a>
+  tag, <a href="#6.2.3">6.2.3</a>, <a href="#6.7.2.3">6.7.2.3</a>                                     value, <a href="#3.19">3.19</a>
+  type, <a href="#6.2.5">6.2.5</a>, <a href="#6.7.2.1">6.7.2.1</a>                                    value bits, <a href="#6.2.6.2">6.2.6.2</a>
+
+[<a name="#p676" href="p676">page 676</a>] (<a href="#Contents">Contents</a>)
+
+variable arguments, <a href="#6.10.3">6.10.3</a>, <a href="#7.16">7.16</a>                             vswscanf function, <a href="#7.28.2.8">7.28.2.8</a>
+variable arguments header, <a href="#7.16">7.16</a>                              vswscanf_s function, <a href="#K.3.9.1.10">K.3.9.1.10</a>
+variable length array, <a href="#6.7.6">6.7.6</a>, <a href="#6.7.6.2">6.7.6.2</a>, <a href="#6.10.8.3">6.10.8.3</a>              vwprintf function, <a href="#7.21.1">7.21.1</a>, <a href="#7.28.2.9">7.28.2.9</a>, <a href="#K.3.9.1.11">K.3.9.1.11</a>
+variably modified type, <a href="#6.7.6">6.7.6</a>, <a href="#6.7.6.2">6.7.6.2</a>, <a href="#6.10.8.3">6.10.8.3</a>              vwprintf_s function, <a href="#K.3.9.1.11">K.3.9.1.11</a>
+vertical-tab character, <a href="#5.2.1">5.2.1</a>, <a href="#6.4">6.4</a>                           vwscanf function, <a href="#7.21.1">7.21.1</a>, <a href="#7.28.2.10">7.28.2.10</a>, <a href="#7.28.3.10">7.28.3.10</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>,           vwscanf_s function, <a href="#K.3.9.1.12">K.3.9.1.12</a>
+     <a href="#7.4.1.10">7.4.1.10</a>
+vfprintf function, <a href="#7.21.1">7.21.1</a>, <a href="#7.21.6.8">7.21.6.8</a>, <a href="#K.3.5.3.8">K.3.5.3.8</a>               warnings, <a href="#I">I</a>
+vfprintf_s function, <a href="#K.3.5.3.8">K.3.5.3.8</a>, <a href="#K.3.5.3.9">K.3.5.3.9</a>,                   wchar.h header, <a href="#5.2.4.2.2">5.2.4.2.2</a>, <a href="#7.21.1">7.21.1</a>, <a href="#7.28">7.28</a>, <a href="#7.30.12">7.30.12</a>,
+     <a href="#K.3.5.3.11">K.3.5.3.11</a>, <a href="#K.3.5.3.14">K.3.5.3.14</a>                                      <a href="#F">F</a>, <a href="#K.3.9">K.3.9</a>
+vfscanf function, <a href="#7.21.1">7.21.1</a>, <a href="#7.21.6.8">7.21.6.8</a>, <a href="#7.21.6.9">7.21.6.9</a>                 WCHAR_MAX macro, <a href="#7.20.3">7.20.3</a>, <a href="#7.28.1">7.28.1</a>
+vfscanf_s function, <a href="#K.3.5.3.9">K.3.5.3.9</a>, <a href="#K.3.5.3.11">K.3.5.3.11</a>,                   WCHAR_MIN macro, <a href="#7.20.3">7.20.3</a>, <a href="#7.28.1">7.28.1</a>
+     <a href="#K.3.5.3.14">K.3.5.3.14</a>                                              wchar_t type, <a href="#3.7.3">3.7.3</a>, <a href="#6.4.5">6.4.5</a>, <a href="#6.7.9">6.7.9</a>, <a href="#6.10.8.2">6.10.8.2</a>, <a href="#7.19">7.19</a>,
+vfwprintf function, <a href="#7.21.1">7.21.1</a>, <a href="#7.28.2.5">7.28.2.5</a>, <a href="#K.3.9.1.6">K.3.9.1.6</a>                  <a href="#7.20.3">7.20.3</a>, <a href="#7.21.6.1">7.21.6.1</a>, <a href="#7.21.6.2">7.21.6.2</a>, <a href="#7.22">7.22</a>, <a href="#7.28.1">7.28.1</a>,
+vfwprintf_s function, <a href="#K.3.9.1.6">K.3.9.1.6</a>                                  <a href="#7.28.2.1">7.28.2.1</a>, <a href="#7.28.2.2">7.28.2.2</a>
+vfwscanf function, <a href="#7.21.1">7.21.1</a>, <a href="#7.28.2.6">7.28.2.6</a>, <a href="#7.28.3.10">7.28.3.10</a>               wcrtomb function, <a href="#7.21.3">7.21.3</a>, <a href="#7.21.6.2">7.21.6.2</a>, <a href="#7.28.2.2">7.28.2.2</a>,
+vfwscanf_s function, <a href="#K.3.9.1.7">K.3.9.1.7</a>                                   <a href="#7.28.6.3.3">7.28.6.3.3</a>, <a href="#7.28.6.4.2">7.28.6.4.2</a>, <a href="#K.3.6.5.2">K.3.6.5.2</a>, <a href="#K.3.9.3.1">K.3.9.3.1</a>,
+visibility of identifier, <a href="#6.2.1">6.2.1</a>                                   <a href="#K.3.9.3.2.2">K.3.9.3.2.2</a>
+visible sequence of side effects, <a href="#5.1.2.4">5.1.2.4</a>                    wcrtomb_s function, <a href="#K.3.9.3.1">K.3.9.3.1</a>, <a href="#K.3.9.3.1.1">K.3.9.3.1.1</a>
+visible side effect, <a href="#5.1.2.4">5.1.2.4</a>                                 wcscat function, <a href="#7.28.4.3.1">7.28.4.3.1</a>
+VLA, see variable length array                               wcscat_s function, <a href="#K.3.9.2.2.1">K.3.9.2.2.1</a>
+void expression, <a href="#6.3.2.2">6.3.2.2</a>                                     wcschr function, <a href="#7.28.4.5.1">7.28.4.5.1</a>
+void function parameter, <a href="#6.7.6.3">6.7.6.3</a>                             wcscmp function, <a href="#7.28.4.4.1">7.28.4.4.1</a>, <a href="#7.28.4.4.4">7.28.4.4.4</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>, <a href="#K.3.5.3.2">K.3.5.3.2</a>,                 wcscoll function, <a href="#7.28.4.4.2">7.28.4.4.2</a>, <a href="#7.28.4.4.4">7.28.4.4.4</a>
+     <a href="#K.3.9.1.2">K.3.9.1.2</a>                                               wcscpy function, <a href="#7.28.4.2.1">7.28.4.2.1</a>
+void type conversion, <a href="#6.3.2.2">6.3.2.2</a>                                wcscpy_s function, <a href="#K.3.9.2.1.1">K.3.9.2.1.1</a>
+volatile storage, <a href="#5.1.2.3">5.1.2.3</a>                                    wcscspn function, <a href="#7.28.4.5.2">7.28.4.5.2</a>
+volatile type qualifier, <a href="#6.7.3">6.7.3</a>                                wcsftime function, <a href="#7.11.1.1">7.11.1.1</a>, <a href="#7.28.5.1">7.28.5.1</a>
+volatile-qualified type, <a href="#6.2.5">6.2.5</a>, <a href="#6.7.3">6.7.3</a>                         wcslen function, <a href="#7.28.4.6.1">7.28.4.6.1</a>
+vprintf function, <a href="#7.21.1">7.21.1</a>, <a href="#7.21.6.8">7.21.6.8</a>, <a href="#7.21.6.10">7.21.6.10</a>,               wcsncat function, <a href="#7.28.4.3.2">7.28.4.3.2</a>
+     <a href="#K.3.5.3.10">K.3.5.3.10</a>                                              wcsncat_s function, <a href="#K.3.9.2.2.2">K.3.9.2.2.2</a>
+vprintf_s function, <a href="#K.3.5.3.9">K.3.5.3.9</a>, <a href="#K.3.5.3.10">K.3.5.3.10</a>,                   wcsncmp function, <a href="#7.28.4.4.3">7.28.4.4.3</a>
+     <a href="#K.3.5.3.11">K.3.5.3.11</a>, <a href="#K.3.5.3.14">K.3.5.3.14</a>                                  wcsncpy function, <a href="#7.28.4.2.2">7.28.4.2.2</a>
+vscanf function, <a href="#7.21.1">7.21.1</a>, <a href="#7.21.6.8">7.21.6.8</a>, <a href="#7.21.6.11">7.21.6.11</a>                 wcsncpy_s function, <a href="#K.3.9.2.1.2">K.3.9.2.1.2</a>
+vscanf_s function, <a href="#K.3.5.3.9">K.3.5.3.9</a>, <a href="#K.3.5.3.11">K.3.5.3.11</a>,                    wcsnlen_s function, <a href="#K.3.9.2.4.1">K.3.9.2.4.1</a>
+     <a href="#K.3.5.3.14">K.3.5.3.14</a>                                              wcspbrk function, <a href="#7.28.4.5.3">7.28.4.5.3</a>
+vsnprintf function, <a href="#7.21.6.8">7.21.6.8</a>, <a href="#7.21.6.12">7.21.6.12</a>,                     wcsrchr function, <a href="#7.28.4.5.4">7.28.4.5.4</a>
+     <a href="#K.3.5.3.12">K.3.5.3.12</a>                                              wcsrtombs function, <a href="#7.28.6.4.2">7.28.6.4.2</a>, <a href="#K.3.9.3.2">K.3.9.3.2</a>
+vsnprintf_s function, <a href="#K.3.5.3.9">K.3.5.3.9</a>, <a href="#K.3.5.3.11">K.3.5.3.11</a>,                 wcsrtombs_s function, <a href="#K.3.9.3.2">K.3.9.3.2</a>, <a href="#K.3.9.3.2.2">K.3.9.3.2.2</a>
+     <a href="#K.3.5.3.12">K.3.5.3.12</a>, <a href="#K.3.5.3.13">K.3.5.3.13</a>, <a href="#K.3.5.3.14">K.3.5.3.14</a>                      wcsspn function, <a href="#7.28.4.5.5">7.28.4.5.5</a>
+vsnwprintf_s function, <a href="#K.3.9.1.8">K.3.9.1.8</a>, <a href="#K.3.9.1.9">K.3.9.1.9</a>                  wcsstr function, <a href="#7.28.4.5.6">7.28.4.5.6</a>
+vsprintf function, <a href="#7.21.6.8">7.21.6.8</a>, <a href="#7.21.6.13">7.21.6.13</a>,                      wcstod function, <a href="#7.21.6.2">7.21.6.2</a>, <a href="#7.28.2.2">7.28.2.2</a>
+     <a href="#K.3.5.3.13">K.3.5.3.13</a>                                              wcstod function, <a href="#7.28.4.1.1">7.28.4.1.1</a>
+vsprintf_s function, <a href="#K.3.5.3.9">K.3.5.3.9</a>, <a href="#K.3.5.3.11">K.3.5.3.11</a>,                  wcstof function, <a href="#7.28.4.1.1">7.28.4.1.1</a>
+     <a href="#K.3.5.3.12">K.3.5.3.12</a>, <a href="#K.3.5.3.13">K.3.5.3.13</a>, <a href="#K.3.5.3.14">K.3.5.3.14</a>                      wcstoimax function, <a href="#7.8.2.4">7.8.2.4</a>
+vsscanf function, <a href="#7.21.6.8">7.21.6.8</a>, <a href="#7.21.6.14">7.21.6.14</a>                        wcstok function, <a href="#7.28.4.5.7">7.28.4.5.7</a>
+vsscanf_s function, <a href="#K.3.5.3.9">K.3.5.3.9</a>, <a href="#K.3.5.3.11">K.3.5.3.11</a>,                   wcstok_s function, <a href="#K.3.9.2.3.1">K.3.9.2.3.1</a>
+     <a href="#K.3.5.3.14">K.3.5.3.14</a>                                              wcstol function, <a href="#7.8.2.4">7.8.2.4</a>, <a href="#7.21.6.2">7.21.6.2</a>, <a href="#7.28.2.2">7.28.2.2</a>,
+vswprintf function, <a href="#7.28.2.7">7.28.2.7</a>, <a href="#K.3.9.1.8">K.3.9.1.8</a>,                         <a href="#7.28.4.1.2">7.28.4.1.2</a>
+     <a href="#K.3.9.1.9">K.3.9.1.9</a>                                               wcstold function, <a href="#7.28.4.1.1">7.28.4.1.1</a>
+vswprintf_s function, <a href="#K.3.9.1.8">K.3.9.1.8</a>, <a href="#K.3.9.1.9">K.3.9.1.9</a>                   wcstoll function, <a href="#7.8.2.4">7.8.2.4</a>, <a href="#7.28.4.1.2">7.28.4.1.2</a>
+
+[<a name="#p677" href="p677">page 677</a>] (<a href="#Contents">Contents</a>)
+
+wcstombs function, <a href="#7.22.8.2">7.22.8.2</a>, <a href="#7.28.6.4">7.28.6.4</a>                           <a href="#7.29.1">7.29.1</a>
+wcstombs_s function, <a href="#K.3.6.5.2">K.3.6.5.2</a>                               wmemchr function, <a href="#7.28.4.5.8">7.28.4.5.8</a>
+wcstoul function, <a href="#7.8.2.4">7.8.2.4</a>, <a href="#7.21.6.2">7.21.6.2</a>, <a href="#7.28.2.2">7.28.2.2</a>,               wmemcmp function, <a href="#7.28.4.4.5">7.28.4.4.5</a>
+     <a href="#7.28.4.1.2">7.28.4.1.2</a>                                              wmemcpy function, <a href="#7.28.4.2.3">7.28.4.2.3</a>
+wcstoull function, <a href="#7.8.2.4">7.8.2.4</a>, <a href="#7.28.4.1.2">7.28.4.1.2</a>                       wmemcpy_s function, <a href="#K.3.9.2.1.3">K.3.9.2.1.3</a>
+wcstoumax function, <a href="#7.8.2.4">7.8.2.4</a>                                  wmemmove function, <a href="#7.28.4.2.4">7.28.4.2.4</a>
+wcsxfrm function, <a href="#7.28.4.4.4">7.28.4.4.4</a>                                 wmemmove_s function, <a href="#K.3.9.2.1.4">K.3.9.2.1.4</a>
+wctob function, <a href="#7.28.6.1.2">7.28.6.1.2</a>, <a href="#7.29.2.1">7.29.2.1</a>                         wmemset function, <a href="#7.28.4.6.2">7.28.4.6.2</a>
+wctomb function, <a href="#7.22.7.3">7.22.7.3</a>, <a href="#7.22.8.2">7.22.8.2</a>, <a href="#7.28.6.3">7.28.6.3</a>                wprintf function, <a href="#7.21.1">7.21.1</a>, <a href="#7.28.2.9">7.28.2.9</a>, <a href="#7.28.2.11">7.28.2.11</a>,
+wctomb_s function, <a href="#K.3.6.4.1">K.3.6.4.1</a>                                    <a href="#K.3.9.1.13">K.3.9.1.13</a>
+wctrans function, <a href="#7.29.3.2.1">7.29.3.2.1</a>, <a href="#7.29.3.2.2">7.29.3.2.2</a>                     wprintf_s function, <a href="#K.3.9.1.13">K.3.9.1.13</a>
+wctrans_t type, <a href="#7.29.1">7.29.1</a>, <a href="#7.29.3.2.2">7.29.3.2.2</a>                           wscanf function, <a href="#7.21.1">7.21.1</a>, <a href="#7.28.2.10">7.28.2.10</a>, <a href="#7.28.2.12">7.28.2.12</a>,
+wctype function, <a href="#7.29.2.2.1">7.29.2.2.1</a>, <a href="#7.29.2.2.2">7.29.2.2.2</a>                         <a href="#7.28.3.10">7.28.3.10</a>
+wctype.h header, <a href="#7.29">7.29</a>, <a href="#7.30.13">7.30.13</a>                               wscanf_s function, <a href="#K.3.9.1.12">K.3.9.1.12</a>, <a href="#K.3.9.1.14">K.3.9.1.14</a>
+wctype_t type, <a href="#7.29.1">7.29.1</a>, <a href="#7.29.2.2.2">7.29.2.2.2</a>
+weaker, <a href="#6.2.8">6.2.8</a>                                                xor macro, <a href="#7.9">7.9</a>
+WEOF macro, <a href="#7.28.1">7.28.1</a>, <a href="#7.28.3.1">7.28.3.1</a>, <a href="#7.28.3.3">7.28.3.3</a>, <a href="#7.28.3.6">7.28.3.6</a>,            xor_eq macro, <a href="#7.9">7.9</a>
+     <a href="#7.28.3.7">7.28.3.7</a>, <a href="#7.28.3.8">7.28.3.8</a>, <a href="#7.28.3.9">7.28.3.9</a>, <a href="#7.28.3.10">7.28.3.10</a>,                xtime type, <a href="#7.25.1">7.25.1</a>, <a href="#7.25.3.5">7.25.3.5</a>, <a href="#7.25.4.4">7.25.4.4</a>, <a href="#7.25.5.7">7.25.5.7</a>,
+     <a href="#7.28.6.1.1">7.28.6.1.1</a>, <a href="#7.29.1">7.29.1</a>                                          <a href="#7.25.7.1">7.25.7.1</a>
+while statement, <a href="#6.8.5.1">6.8.5.1</a>                                     xtime_get function, <a href="#7.25.7.1">7.25.7.1</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="#7.29.2.1.10">7.29.2.1.10</a>
+white-space characters, <a href="#6.4">6.4</a>
+wide character, <a href="#3.7.3">3.7.3</a>
+  case mapping functions, <a href="#7.29.3.1">7.29.3.1</a>
+     extensible, <a href="#7.29.3.2">7.29.3.2</a>
+  classification functions, <a href="#7.29.2.1">7.29.2.1</a>
+     extensible, <a href="#7.29.2.2">7.29.2.2</a>
+  constant, <a href="#6.4.4.4">6.4.4.4</a>
+  formatted input/output functions, <a href="#7.28.2">7.28.2</a>,
+        <a href="#K.3.9.1">K.3.9.1</a>
+  input functions, <a href="#7.21.1">7.21.1</a>
+  input/output functions, <a href="#7.21.1">7.21.1</a>, <a href="#7.28.3">7.28.3</a>
+  output functions, <a href="#7.21.1">7.21.1</a>
+  single-byte conversion functions, <a href="#7.28.6.1">7.28.6.1</a>
+wide string, <a href="#7.1.1">7.1.1</a>
+wide string comparison functions, <a href="#7.28.4.4">7.28.4.4</a>
+wide string concatenation functions, <a href="#7.28.4.3">7.28.4.3</a>,
+     <a href="#K.3.9.2.2">K.3.9.2.2</a>
+wide string copying functions, <a href="#7.28.4.2">7.28.4.2</a>, <a href="#K.3.9.2.1">K.3.9.2.1</a>
+wide string literal, see string literal
+wide string miscellaneous functions, <a href="#7.28.4.6">7.28.4.6</a>,
+     <a href="#K.3.9.2.4">K.3.9.2.4</a>
+wide string numeric conversion functions, <a href="#7.8.2.4">7.8.2.4</a>,
+     <a href="#7.28.4.1">7.28.4.1</a>
+wide string search functions, <a href="#7.28.4.5">7.28.4.5</a>, <a href="#K.3.9.2.3">K.3.9.2.3</a>
+wide-oriented stream, <a href="#7.21.2">7.21.2</a>
+width, <a href="#6.2.6.2">6.2.6.2</a>
+WINT_MAX macro, <a href="#7.20.3">7.20.3</a>
+WINT_MIN macro, <a href="#7.20.3">7.20.3</a>
+wint_t type, <a href="#7.20.3">7.20.3</a>, <a href="#7.21.6.1">7.21.6.1</a>, <a href="#7.28.1">7.28.1</a>, <a href="#7.28.2.1">7.28.2.1</a>,
+
+[<a name="#p678" href="p678">page 678</a>] (<a href="#Contents">Contents</a>)
+</pre></body></html>
diff --git a/n1548.txt b/n1548.txt
new file mode 100644 (file)
index 0000000..4f19064
--- /dev/null
+++ b/n1548.txt
@@ -0,0 +1,26904 @@
+N1548                    Committee Draft -- December 2, 2010          ISO/IEC 9899:201x
+
+
+
+
+INTERNATIONAL STANDARD                         (C)ISO/IEC              ISO/IEC 9899:201x
+
+
+
+
+Programming languages -- C
+
+
+                                       ABSTRACT
+
+
+
+                     (Cover sheet to be provided by ISO Secretariat.)
+
+This International Standard specifies the form and establishes the interpretation of
+programs expressed in the programming language C. Its purpose is to promote
+portability, reliability, maintainability, and efficient execution of C language programs on
+a variety of computing systems.
+
+Clauses are included that detail the C language itself and the contents of the C language
+execution library. Annexes summarize aspects of both of them, and enumerate factors
+that influence the portability of C programs.
+
+Although this International Standard is intended to guide knowledgeable C language
+programmers as well as implementors of C language translation systems, the document
+itself is not designed to serve as a tutorial.
+
+Recipients of this draft are invited to submit, with their comments, notification of any
+relevant patent rights of which they are aware and to provide supporting documentation.
+
+Changes from the previous draft (N1256) are indicated by ''diff marks'' in the right
+margin: deleted text is marked with ''*'', new or changed text with '' ''.
+
+
+
+
+[page i]
+
+
+
+[page ii]
+
+Contents
+Foreword       . . . . . . . . . . . . . . . . . . . . . . . . . . . . .                                 xiii
+Introduction    . . . . . . . . . . . . . . . . . . . . . . . . . . . . xvii
+1. Scope       . . . . . . . . . . . . . . . . . . . . . . . . . . . . .                                   1
+2. Normative references     . . . . . . . . . . . . . . . . . . . . . . .                                  2
+3. Terms, definitions, and symbols    . . . . . . . . . . . . . . . . . . .                                 3
+4. Conformance       . . . . . . . . . . . . . . . . . . . . . . . . . .                                   8
+5. Environment    . . . . . . . . . . .       . .   .   .   .   .   .   .   .    .   .   .   .   .   .    10
+   5.1 Conceptual models       . . . . . .    . .   .   .   .   .   .   .   .    .   .   .   .   .   .    10
+        5.1.1  Translation environment .      . .   .   .   .   .   .   .   .    .   .   .   .   .   .    10
+        5.1.2  Execution environments     .   . .   .   .   .   .   .   .   .    .   .   .   .   .   .    12
+   5.2 Environmental considerations    . .    . .   .   .   .   .   .   .   .    .   .   .   .   .   .    22
+        5.2.1  Character sets    . . . . .    . .   .   .   .   .   .   .   .    .   .   .   .   .   .    22
+        5.2.2  Character display semantics      .   .   .   .   .   .   .   .    .   .   .   .   .   .    24
+        5.2.3  Signals and interrupts . .     . .   .   .   .   .   .   .   .    .   .   .   .   .   .    25
+        5.2.4  Environmental limits    . .    . .   .   .   .   .   .   .   .    .   .   .   .   .   .    25
+6. Language . . . . . . . . . . . . . . . .             .   .   .   .   .   .    .   .   .   .   .   .    35
+   6.1 Notation . . . . . . . . . . . . . .             .   .   .   .   .   .    .   .   .   .   .   .    35
+   6.2 Concepts       . . . . . . . . . . . . .         .   .   .   .   .   .    .   .   .   .   .   .    35
+        6.2.1   Scopes of identifiers     . . . . .      .   .   .   .   .   .    .   .   .   .   .   .    35
+        6.2.2   Linkages of identifiers . . . . .        .   .   .   .   .   .    .   .   .   .   .   .    36
+        6.2.3   Name spaces of identifiers      . . .    .   .   .   .   .   .    .   .   .   .   .   .    37
+        6.2.4   Storage durations of objects     . .    .   .   .   .   .   .    .   .   .   .   .   .    38
+        6.2.5   Types       . . . . . . . . . . .       .   .   .   .   .   .    .   .   .   .   .   .    39
+        6.2.6   Representations of types . . . .        .   .   .   .   .   .    .   .   .   .   .   .    44
+        6.2.7   Compatible type and composite type          .   .   .   .   .    .   .   .   .   .   .    47
+        6.2.8   Alignment of objects     . . . . .      .   .   .   .   .   .    .   .   .   .   .   .    48
+   6.3 Conversions       . . . . . . . . . . . .        .   .   .   .   .   .    .   .   .   .   .   .    50
+        6.3.1   Arithmetic operands      . . . . .      .   .   .   .   .   .    .   .   .   .   .   .    50
+        6.3.2   Other operands       . . . . . . .      .   .   .   .   .   .    .   .   .   .   .   .    54
+   6.4 Lexical elements       . . . . . . . . . .       .   .   .   .   .   .    .   .   .   .   .   .    57
+        6.4.1   Keywords . . . . . . . . . .            .   .   .   .   .   .    .   .   .   .   .   .    58
+        6.4.2   Identifiers . . . . . . . . . .          .   .   .   .   .   .    .   .   .   .   .   .    59
+        6.4.3   Universal character names      . . .    .   .   .   .   .   .    .   .   .   .   .   .    61
+        6.4.4   Constants . . . . . . . . . .           .   .   .   .   .   .    .   .   .   .   .   .    62
+        6.4.5   String literals   . . . . . . . .       .   .   .   .   .   .    .   .   .   .   .   .    70
+        6.4.6   Punctuators . . . . . . . . .           .   .   .   .   .   .    .   .   .   .   .   .    72
+        6.4.7   Header names      . . . . . . . .       .   .   .   .   .   .    .   .   .   .   .   .    73
+        6.4.8   Preprocessing numbers        . . . .    .   .   .   .   .   .    .   .   .   .   .   .    74
+        6.4.9   Comments        . . . . . . . . .       .   .   .   .   .   .    .   .   .   .   .   .    75
+
+
+[page iii]
+
+     6.5  Expressions      . . . . . . . . . .     .   .   .   .   .   .   .   .   .   .   .   .   .   .    76
+          6.5.1   Primary expressions      . . .   .   .   .   .   .   .   .   .   .   .   .   .   .   .    78
+          6.5.2   Postfix operators . . . . .       .   .   .   .   .   .   .   .   .   .   .   .   .   .    79
+          6.5.3   Unary operators      . . . . .   .   .   .   .   .   .   .   .   .   .   .   .   .   .    88
+          6.5.4   Cast operators . . . . . .       .   .   .   .   .   .   .   .   .   .   .   .   .   .    91
+          6.5.5   Multiplicative operators   . .   .   .   .   .   .   .   .   .   .   .   .   .   .   .    92
+          6.5.6   Additive operators     . . . .   .   .   .   .   .   .   .   .   .   .   .   .   .   .    92
+          6.5.7   Bitwise shift operators . . .    .   .   .   .   .   .   .   .   .   .   .   .   .   .    94
+          6.5.8   Relational operators . . . .     .   .   .   .   .   .   .   .   .   .   .   .   .   .    95
+          6.5.9   Equality operators     . . . .   .   .   .   .   .   .   .   .   .   .   .   .   .   .    96
+          6.5.10 Bitwise AND operator . . .        .   .   .   .   .   .   .   .   .   .   .   .   .   .    97
+          6.5.11 Bitwise exclusive OR operator         .   .   .   .   .   .   .   .   .   .   .   .   .    98
+          6.5.12 Bitwise inclusive OR operator     .   .   .   .   .   .   .   .   .   .   .   .   .   .    98
+          6.5.13 Logical AND operator . . .        .   .   .   .   .   .   .   .   .   .   .   .   .   .    99
+          6.5.14 Logical OR operator       . . .   .   .   .   .   .   .   .   .   .   .   .   .   .   .    99
+          6.5.15 Conditional operator      . . .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   100
+          6.5.16 Assignment operators . . .        .   .   .   .   .   .   .   .   .   .   .   .   .   .   101
+          6.5.17 Comma operator . . . . .          .   .   .   .   .   .   .   .   .   .   .   .   .   .   104
+     6.6 Constant expressions . . . . . . .        .   .   .   .   .   .   .   .   .   .   .   .   .   .   105
+     6.7 Declarations      . . . . . . . . . .     .   .   .   .   .   .   .   .   .   .   .   .   .   .   107
+          6.7.1   Storage-class specifiers    . .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   108
+          6.7.2   Type specifiers . . . . . .       .   .   .   .   .   .   .   .   .   .   .   .   .   .   109
+          6.7.3   Type qualifiers . . . . . .       .   .   .   .   .   .   .   .   .   .   .   .   .   .   120
+          6.7.4   Function specifiers     . . . .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   124
+          6.7.5   Alignment specifier . . . .       .   .   .   .   .   .   .   .   .   .   .   .   .   .   126
+          6.7.6   Declarators     . . . . . . .    .   .   .   .   .   .   .   .   .   .   .   .   .   .   127
+          6.7.7   Type names . . . . . . .         .   .   .   .   .   .   .   .   .   .   .   .   .   .   135
+          6.7.8   Type definitions      . . . . .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   136
+          6.7.9   Initialization    . . . . . .    .   .   .   .   .   .   .   .   .   .   .   .   .   .   138
+          6.7.10 Static assertions     . . . . .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   144
+     6.8 Statements and blocks      . . . . . .    .   .   .   .   .   .   .   .   .   .   .   .   .   .   145
+          6.8.1   Labeled statements     . . . .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   145
+          6.8.2   Compound statement       . . .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   146
+          6.8.3   Expression and null statements       .   .   .   .   .   .   .   .   .   .   .   .   .   146
+          6.8.4   Selection statements     . . .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   147
+          6.8.5   Iteration statements . . . .     .   .   .   .   .   .   .   .   .   .   .   .   .   .   149
+          6.8.6   Jump statements      . . . . .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   150
+     6.9 External definitions      . . . . . . .    .   .   .   .   .   .   .   .   .   .   .   .   .   .   154
+          6.9.1   Function definitions . . . .      .   .   .   .   .   .   .   .   .   .   .   .   .   .   155
+          6.9.2   External object definitions   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   157
+     6.10 Preprocessing directives     . . . . .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   159
+          6.10.1 Conditional inclusion     . . .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   161
+          6.10.2 Source file inclusion      . . .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   163
+          6.10.3 Macro replacement . . . .         .   .   .   .   .   .   .   .   .   .   .   .   .   .   165
+
+
+[page iv]
+
+       6.10.4 Line control . . . . . .        .   .   .   .   .   .   .   .   .    .   .   .   .   .   .   172
+       6.10.5 Error directive . . . . .       .   .   .   .   .   .   .   .   .    .   .   .   .   .   .   173
+       6.10.6 Pragma directive . . . .        .   .   .   .   .   .   .   .   .    .   .   .   .   .   .   173
+       6.10.7 Null directive      . . . . .   .   .   .   .   .   .   .   .   .    .   .   .   .   .   .   174
+       6.10.8 Predefined macro names .         .   .   .   .   .   .   .   .   .    .   .   .   .   .   .   174
+       6.10.9 Pragma operator       . . . .   .   .   .   .   .   .   .   .   .    .   .   .   .   .   .   176
+  6.11 Future language directions     . . .   .   .   .   .   .   .   .   .   .    .   .   .   .   .   .   178
+       6.11.1 Floating types      . . . . .   .   .   .   .   .   .   .   .   .    .   .   .   .   .   .   178
+       6.11.2 Linkages of identifiers . .      .   .   .   .   .   .   .   .   .    .   .   .   .   .   .   178
+       6.11.3 External names        . . . .   .   .   .   .   .   .   .   .   .    .   .   .   .   .   .   178
+       6.11.4 Character escape sequences          .   .   .   .   .   .   .   .    .   .   .   .   .   .   178
+       6.11.5 Storage-class specifiers     .   .   .   .   .   .   .   .   .   .    .   .   .   .   .   .   178
+       6.11.6 Function declarators      . .   .   .   .   .   .   .   .   .   .    .   .   .   .   .   .   178
+       6.11.7 Function definitions . . .       .   .   .   .   .   .   .   .   .    .   .   .   .   .   .   178
+       6.11.8 Pragma directives       . . .   .   .   .   .   .   .   .   .   .    .   .   .   .   .   .   178
+       6.11.9 Predefined macro names .         .   .   .   .   .   .   .   .   .    .   .   .   .   .   .   178
+7. Library . . . . . . . . . . . . . . . . . .                .   .   .   .   .    .   .   .   .   .   .   179
+   7.1 Introduction     . . . . . . . . . . . . .             .   .   .   .   .    .   .   .   .   .   .   179
+         7.1.1 Definitions of terms . . . . . . .              .   .   .   .   .    .   .   .   .   .   .   179
+         7.1.2 Standard headers . . . . . . . .               .   .   .   .   .    .   .   .   .   .   .   180
+         7.1.3 Reserved identifiers . . . . . . .              .   .   .   .   .    .   .   .   .   .   .   181
+         7.1.4 Use of library functions    . . . . .          .   .   .   .   .    .   .   .   .   .   .   182
+   7.2 Diagnostics <assert.h>          . . . . . . .          .   .   .   .   .    .   .   .   .   .   .   185
+         7.2.1 Program diagnostics       . . . . . .          .   .   .   .   .    .   .   .   .   .   .   185
+   7.3 Complex arithmetic <complex.h>           . . .         .   .   .   .   .    .   .   .   .   .   .   187
+         7.3.1 Introduction . . . . . . . . . .               .   .   .   .   .    .   .   .   .   .   .   187
+         7.3.2 Conventions . . . . . . . . . .                .   .   .   .   .    .   .   .   .   .   .   188
+         7.3.3 Branch cuts . . . . . . . . . .                .   .   .   .   .    .   .   .   .   .   .   188
+         7.3.4 The CX_LIMITED_RANGE pragma                    .   .   .   .   .    .   .   .   .   .   .   188
+         7.3.5 Trigonometric functions . . . . .              .   .   .   .   .    .   .   .   .   .   .   189
+         7.3.6 Hyperbolic functions      . . . . . .          .   .   .   .   .    .   .   .   .   .   .   191
+         7.3.7 Exponential and logarithmic functions              .   .   .   .    .   .   .   .   .   .   193
+         7.3.8 Power and absolute-value functions             .   .   .   .   .    .   .   .   .   .   .   194
+         7.3.9 Manipulation functions      . . . . .          .   .   .   .   .    .   .   .   .   .   .   195
+   7.4 Character handling <ctype.h> . . . . .                 .   .   .   .   .    .   .   .   .   .   .   199
+         7.4.1 Character classification functions    .         .   .   .   .   .    .   .   .   .   .   .   199
+         7.4.2 Character case mapping functions     .         .   .   .   .   .    .   .   .   .   .   .   202
+   7.5 Errors <errno.h>         . . . . . . . . . .           .   .   .   .   .    .   .   .   .   .   .   204
+   7.6 Floating-point environment <fenv.h>        . .         .   .   .   .   .    .   .   .   .   .   .   205
+         7.6.1 The FENV_ACCESS pragma           . . .         .   .   .   .   .    .   .   .   .   .   .   207
+         7.6.2 Floating-point exceptions      . . . .         .   .   .   .   .    .   .   .   .   .   .   208
+         7.6.3 Rounding . . . . . . . . . . .                 .   .   .   .   .    .   .   .   .   .   .   211
+         7.6.4 Environment        . . . . . . . . .           .   .   .   .   .    .   .   .   .   .   .   212
+   7.7 Characteristics of floating types <float.h>             .   .   .   .   .    .   .   .   .   .   .   215
+
+[page v]
+
+     7.8    Format conversion of integer types <inttypes.h> . . . .           .   .   .   .   216
+            7.8.1    Macros for format specifiers      . . . . . . . . . .     .   .   .   .   216
+            7.8.2    Functions for greatest-width integer types   . . . . .   .   .   .   .   217
+     7.9    Alternative spellings <iso646.h> . . . . . . . . . . .            .   .   .   .   220
+     7.10   Sizes of integer types <limits.h>         . . . . . . . . . .     .   .   .   .   221
+     7.11   Localization <locale.h> . . . . . . . . . . . . . .               .   .   .   .   222
+            7.11.1 Locale control . . . . . . . . . . . . . . . .             .   .   .   .   223
+            7.11.2 Numeric formatting convention inquiry . . . . . .          .   .   .   .   224
+     7.12   Mathematics <math.h> . . . . . . . . . . . . . . .                .   .   .   .   230
+            7.12.1 Treatment of error conditions . . . . . . . . . .          .   .   .   .   232
+            7.12.2 The FP_CONTRACT pragma             . . . . . . . . . .     .   .   .   .   234
+            7.12.3 Classification macros       . . . . . . . . . . . . .       .   .   .   .   234
+            7.12.4 Trigonometric functions . . . . . . . . . . . .            .   .   .   .   237
+            7.12.5 Hyperbolic functions       . . . . . . . . . . . . .       .   .   .   .   239
+            7.12.6 Exponential and logarithmic functions        . . . . . .   .   .   .   .   241
+            7.12.7 Power and absolute-value functions         . . . . . . .   .   .   .   .   246
+            7.12.8 Error and gamma functions . . . . . . . . . . .            .   .   .   .   248
+            7.12.9 Nearest integer functions . . . . . . . . . . . .          .   .   .   .   250
+            7.12.10 Remainder functions       . . . . . . . . . . . . .       .   .   .   .   253
+            7.12.11 Manipulation functions       . . . . . . . . . . . .      .   .   .   .   254
+            7.12.12 Maximum, minimum, and positive difference functions           .   .   .   256
+            7.12.13 Floating multiply-add . . . . . . . . . . . . .           .   .   .   .   257
+            7.12.14 Comparison macros . . . . . . . . . . . . . .             .   .   .   .   258
+     7.13   Nonlocal jumps <setjmp.h>            . . . . . . . . . . . .      .   .   .   .   261
+            7.13.1 Save calling environment         . . . . . . . . . . .     .   .   .   .   261
+            7.13.2 Restore calling environment        . . . . . . . . . .     .   .   .   .   262
+     7.14   Signal handling <signal.h> . . . . . . . . . . . . .              .   .   .   .   264
+            7.14.1 Specify signal handling       . . . . . . . . . . . .      .   .   .   .   265
+            7.14.2 Send signal      . . . . . . . . . . . . . . . . .         .   .   .   .   266
+     7.15   Alignment <stdalign.h>            . . . . . . . . . . . . .       .   .   .   .   267
+     7.16   Variable arguments <stdarg.h>           . . . . . . . . . . .     .   .   .   .   268
+            7.16.1 Variable argument list access macros . . . . . . .         .   .   .   .   268
+     7.17   Atomics <stdatomic.h> . . . . . . . . . . . . . .                 .   .   .   .   272
+            7.17.1 Introduction . . . . . . . . . . . . . . . . .             .   .   .   .   272
+            7.17.2 Initialization      . . . . . . . . . . . . . . . .        .   .   .   .   273
+            7.17.3 Order and consistency . . . . . . . . . . . . .            .   .   .   .   274
+            7.17.4 Fences . . . . . . . . . . . . . . . . . . .               .   .   .   .   277
+            7.17.5 Lock-free property       . . . . . . . . . . . . . .       .   .   .   .   278
+            7.17.6 Atomic integer and address types         . . . . . . . .   .   .   .   .   279
+            7.17.7 Operations on atomic types . . . . . . . . . . .           .   .   .   .   281
+            7.17.8 Atomic flag type and operations . . . . . . . . .           .   .   .   .   284
+     7.18   Boolean type and values <stdbool.h>             . . . . . . . .   .   .   .   .   286
+     7.19   Common definitions <stddef.h> . . . . . . . . . . .                .   .   .   .   287
+     7.20   Integer types <stdint.h> . . . . . . . . . . . . . .              .   .   .   .   289
+
+
+[page vi]
+
+         7.20.1 Integer types      . . . . . . . . . . . .      .   .    .   .   .   .   .   .   289
+         7.20.2 Limits of specified-width integer types    . .   .   .    .   .   .   .   .   .   291
+         7.20.3 Limits of other integer types    . . . . . .    .   .    .   .   .   .   .   .   293
+         7.20.4 Macros for integer constants     . . . . . .    .   .    .   .   .   .   .   .   294
+  7.21   Input/output <stdio.h>         . . . . . . . . . .     .   .    .   .   .   .   .   .   296
+         7.21.1 Introduction . . . . . . . . . . . . .          .   .    .   .   .   .   .   .   296
+         7.21.2 Streams       . . . . . . . . . . . . . .       .   .    .   .   .   .   .   .   298
+         7.21.3 Files . . . . . . . . . . . . . . . .           .   .    .   .   .   .   .   .   300
+         7.21.4 Operations on files      . . . . . . . . . .     .   .    .   .   .   .   .   .   302
+         7.21.5 File access functions     . . . . . . . . .     .   .    .   .   .   .   .   .   304
+         7.21.6 Formatted input/output functions     . . . .    .   .    .   .   .   .   .   .   309
+         7.21.7 Character input/output functions . . . . .      .   .    .   .   .   .   .   .   330
+         7.21.8 Direct input/output functions    . . . . . .    .   .    .   .   .   .   .   .   334
+         7.21.9 File positioning functions     . . . . . . .    .   .    .   .   .   .   .   .   335
+         7.21.10 Error-handling functions . . . . . . . .       .   .    .   .   .   .   .   .   338
+  7.22   General utilities <stdlib.h>        . . . . . . . .    .   .    .   .   .   .   .   .   340
+         7.22.1 Numeric conversion functions . . . . . .        .   .    .   .   .   .   .   .   341
+         7.22.2 Pseudo-random sequence generation functions         .    .   .   .   .   .   .   346
+         7.22.3 Memory management functions . . . . .           .   .    .   .   .   .   .   .   347
+         7.22.4 Communication with the environment        . .   .   .    .   .   .   .   .   .   349
+         7.22.5 Searching and sorting utilities . . . . . .     .   .    .   .   .   .   .   .   353
+         7.22.6 Integer arithmetic functions     . . . . . .    .   .    .   .   .   .   .   .   355
+         7.22.7 Multibyte/wide character conversion functions       .    .   .   .   .   .   .   356
+         7.22.8 Multibyte/wide string conversion functions      .   .    .   .   .   .   .   .   358
+  7.23   String handling <string.h> . . . . . . . . .           .   .    .   .   .   .   .   .   360
+         7.23.1 String function conventions . . . . . . .       .   .    .   .   .   .   .   .   360
+         7.23.2 Copying functions       . . . . . . . . . .     .   .    .   .   .   .   .   .   360
+         7.23.3 Concatenation functions . . . . . . . .         .   .    .   .   .   .   .   .   362
+         7.23.4 Comparison functions . . . . . . . . .          .   .    .   .   .   .   .   .   363
+         7.23.5 Search functions      . . . . . . . . . . .     .   .    .   .   .   .   .   .   365
+         7.23.6 Miscellaneous functions . . . . . . . .         .   .    .   .   .   .   .   .   368
+  7.24   Type-generic math <tgmath.h>          . . . . . . .    .   .    .   .   .   .   .   .   370
+  7.25   Threads <threads.h>          . . . . . . . . . . .     .   .    .   .   .   .   .   .   373
+         7.25.1 Introduction . . . . . . . . . . . . .          .   .    .   .   .   .   .   .   373
+         7.25.2 Initialization functions . . . . . . . . .      .   .    .   .   .   .   .   .   375
+         7.25.3 Condition variable functions     . . . . . .    .   .    .   .   .   .   .   .   375
+         7.25.4 Mutex functions       . . . . . . . . . . .     .   .    .   .   .   .   .   .   377
+         7.25.5 Thread functions . . . . . . . . . . .          .   .    .   .   .   .   .   .   380
+         7.25.6 Thread-specific storage functions     . . . .    .   .    .   .   .   .   .   .   382
+         7.25.7 Time functions . . . . . . . . . . . .          .   .    .   .   .   .   .   .   384
+  7.26   Date and time <time.h>         . . . . . . . . . .     .   .    .   .   .   .   .   .   385
+         7.26.1 Components of time        . . . . . . . . .     .   .    .   .   .   .   .   .   385
+         7.26.2 Time manipulation functions      . . . . . .    .   .    .   .   .   .   .   .   386
+         7.26.3 Time conversion functions      . . . . . . .    .   .    .   .   .   .   .   .   388
+
+
+[page vii]
+
+   7.27 Unicode utilities <uchar.h> . . . . . . . . . . . . . .               . .     .   395
+        7.27.1 Restartable multibyte/wide character conversion functions        .     .   395
+   7.28 Extended multibyte and wide character utilities <wchar.h> . .         . .     .   399
+        7.28.1 Introduction . . . . . . . . . . . . . . . . . .               . .     .   399
+        7.28.2 Formatted wide character input/output functions       . . .    . .     .   400
+        7.28.3 Wide character input/output functions        . . . . . . .     . .     .   418
+        7.28.4 General wide string utilities     . . . . . . . . . . .        . .     .   422
+                 7.28.4.1 Wide string numeric conversion functions     . .    . .     .   423
+                 7.28.4.2 Wide string copying functions . . . . . . .         . .     .   427
+                 7.28.4.3 Wide string concatenation functions      . . . .    . .     .   429
+                 7.28.4.4 Wide string comparison functions      . . . . .     . .     .   430
+                 7.28.4.5 Wide string search functions      . . . . . . .     . .     .   432
+                 7.28.4.6 Miscellaneous functions      . . . . . . . . .      . .     .   436
+        7.28.5 Wide character time conversion functions       . . . . . .     . .     .   436
+        7.28.6 Extended multibyte/wide character conversion utilities .       . .     .   437
+                 7.28.6.1 Single-byte/wide character conversion functions     . .     .   438
+                 7.28.6.2 Conversion state functions     . . . . . . . .      . .     .   438
+                 7.28.6.3 Restartable multibyte/wide character conversion
+                           functions   . . . . . . . . . . . . . . .          . . . 439
+                 7.28.6.4 Restartable multibyte/wide string conversion
+                           functions   . . . . . . . . . . . . . . .          .   .   .   441
+   7.29 Wide character classification and mapping utilities <wctype.h>         .   .   .   444
+        7.29.1 Introduction . . . . . . . . . . . . . . . . . .               .   .   .   444
+        7.29.2 Wide character classification utilities . . . . . . . .         .   .   .   445
+                 7.29.2.1 Wide character classification functions     . . .    .   .   .   445
+                 7.29.2.2 Extensible wide character classification
+                           functions   . . . . . . . . . . . . . . .          . . . 448
+        7.29.3 Wide character case mapping utilities . . . . . . . .          . . . 450
+                 7.29.3.1 Wide character case mapping functions      . . .    . . . 450
+                 7.29.3.2 Extensible wide character case mapping
+                           functions   . . . . . . . . . . . . . . .          .   .   .   450
+   7.30 Future library directions    . . . . . . . . . . . . . . . .          .   .   .   452
+        7.30.1 Complex arithmetic <complex.h> . . . . . . . .                 .   .   .   452
+        7.30.2 Character handling <ctype.h>            . . . . . . . . .      .   .   .   452
+        7.30.3 Errors <errno.h>           . . . . . . . . . . . . . .         .   .   .   452
+        7.30.4 Format conversion of integer types <inttypes.h>            .   .   .   .   452
+        7.30.5 Localization <locale.h>           . . . . . . . . . . .        .   .   .   452
+        7.30.6 Signal handling <signal.h>           . . . . . . . . . .       .   .   .   452
+        7.30.7 Boolean type and values <stdbool.h>            . . . . . .     .   .   .   452
+        7.30.8 Integer types <stdint.h>          . . . . . . . . . . .        .   .   .   452
+        7.30.9 Input/output <stdio.h>          . . . . . . . . . . . .        .   .   .   453
+        7.30.10 General utilities <stdlib.h>        . . . . . . . . . .       .   .   .   453
+        7.30.11 String handling <string.h>          . . . . . . . . . .       .   .   .   453
+
+
+
+[page viii]
+
+        7.30.12 Extended multibyte and wide character utilities
+                <wchar.h>        . . . . . . . . . . . . . . . . . . . . 453
+        7.30.13 Wide character classification and mapping utilities
+                <wctype.h> . . . . . . . . . . . . . . . . . . . . 453
+Annex A (informative) Language syntax summary   . .       .   .   .   .    .   .   .   .   .   .   454
+  A.1 Lexical grammar       . . . . . . . . . . . .       .   .   .   .    .   .   .   .   .   .   454
+  A.2 Phrase structure grammar . . . . . . . . .          .   .   .   .    .   .   .   .   .   .   461
+  A.3 Preprocessing directives    . . . . . . . . .       .   .   .   .    .   .   .   .   .   .   469
+Annex B (informative) Library summary     . . . . . . . . . . . . .                    .   .   .   471
+  B.1 Diagnostics <assert.h>          . . . . . . . . . . . . . . .                    .   .   .   471
+  B.2 Complex <complex.h> . . . . . . . . . . . . . . . .                              .   .   .   471
+  B.3 Character handling <ctype.h> . . . . . . . . . . . . .                           .   .   .   473
+  B.4 Errors <errno.h>         . . . . . . . . . . . . . . . . . .                     .   .   .   473
+  B.5 Floating-point environment <fenv.h>          . . . . . . . . . .                 .   .   .   473
+  B.6 Characteristics of floating types <float.h> . . . . . . . .                       .   .   .   474
+  B.7 Format conversion of integer types <inttypes.h> . . . . .                        .   .   .   474
+  B.8 Alternative spellings <iso646.h> . . . . . . . . . . . .                         .   .   .   475
+  B.9 Sizes of integer types <limits.h>          . . . . . . . . . . .                 .   .   .   475
+  B.10 Localization <locale.h> . . . . . . . . . . . . . . .                           .   .   .   475
+  B.11 Mathematics <math.h> . . . . . . . . . . . . . . . .                            .   .   .   475
+  B.12 Nonlocal jumps <setjmp.h>          . . . . . . . . . . . . .                    .   .   .   480
+  B.13 Signal handling <signal.h> . . . . . . . . . . . . . .                          .   .   .   480
+  B.14 Alignment <stdalign.h>           . . . . . . . . . . . . . .                    .   .   .   481
+  B.15 Variable arguments <stdarg.h>         . . . . . . . . . . . .                   .   .   .   481
+  B.16 Atomics <stdatomic.h> . . . . . . . . . . . . . . .                             .   .   .   481
+  B.17 Boolean type and values <stdbool.h>           . . . . . . . . .                 .   .   .   483
+  B.18 Common definitions <stddef.h> . . . . . . . . . . . .                            .   .   .   483
+  B.19 Integer types <stdint.h> . . . . . . . . . . . . . . .                          .   .   .   483
+  B.20 Input/output <stdio.h>         . . . . . . . . . . . . . . .                    .   .   .   484
+  B.21 General utilities <stdlib.h>       . . . . . . . . . . . . .                    .   .   .   487
+  B.22 String handling <string.h> . . . . . . . . . . . . . .                          .   .   .   489
+  B.23 Type-generic math <tgmath.h>          . . . . . . . . . . . .                   .   .   .   491
+  B.24 Threads <threads.h>          . . . . . . . . . . . . . . . .                    .   .   .   491
+  B.25 Date and time <time.h>         . . . . . . . . . . . . . . .                    .   .   .   492
+  B.26 Unicode utilities <uchar.h> . . . . . . . . . . . . . .                         .   .   .   493
+  B.27 Extended multibyte/wide character utilities <wchar.h>     . . .                 .   .   .   493
+  B.28 Wide character classification and mapping utilities <wctype.h>                   .   .   .   498
+Annex C (informative) Sequence points     . . . . . . . . . . . . . . . . . 499
+Annex D (normative) Universal character names for identifiers . . . . . . . 500
+  D.1 Ranges of characters allowed       . . . . . . . . . . . . . . . . . 500
+  D.2 Ranges of characters disallowed initially . . . . . . . . . . . . . 500
+Annex E (informative) Implementation limits        . . . . . . . . . . . . . . 501
+
+[page ix]
+
+Annex F (normative) IEC 60559 floating-point arithmetic . . . . . .          . .     .   .   503
+  F.1 Introduction      . . . . . . . . . . . . . . . . . . . .             . .     .   .   503
+  F.2 Types . . . . . . . . . . . . . . . . . . . . . . .                   . .     .   .   503
+  F.3 Operators and functions       . . . . . . . . . . . . . . .           . .     .   .   504
+  F.4 Floating to integer conversion    . . . . . . . . . . . . .           . .     .   .   506
+  F.5 Binary-decimal conversion       . . . . . . . . . . . . . .           . .     .   .   506
+  F.6 The return statement . . . . . . . . . . . . . . . .                  . .     .   .   507
+  F.7 Contracted expressions . . . . . . . . . . . . . . . .                . .     .   .   507
+  F.8 Floating-point environment      . . . . . . . . . . . . . .           . .     .   .   507
+  F.9 Optimization . . . . . . . . . . . . . . . . . . . .                  . .     .   .   510
+  F.10 Mathematics <math.h> . . . . . . . . . . . . . . .                   . .     .   .   513
+        F.10.1 Trigonometric functions . . . . . . . . . . . .              . .     .   .   514
+        F.10.2 Hyperbolic functions     . . . . . . . . . . . . .           . .     .   .   516
+        F.10.3 Exponential and logarithmic functions    . . . . . .         . .     .   .   516
+        F.10.4 Power and absolute value functions     . . . . . . .         . .     .   .   520
+        F.10.5 Error and gamma functions . . . . . . . . . . .              . .     .   .   521
+        F.10.6 Nearest integer functions . . . . . . . . . . . .            . .     .   .   522
+        F.10.7 Remainder functions      . . . . . . . . . . . . .           . .     .   .   524
+        F.10.8 Manipulation functions     . . . . . . . . . . . .           . .     .   .   525
+        F.10.9 Maximum, minimum, and positive difference functions            .     .   .   526
+        F.10.10 Floating multiply-add . . . . . . . . . . . . .             . .     .   .   526
+        F.10.11 Comparison macros . . . . . . . . . . . . . .               . .     .   .   527
+Annex G (normative) IEC 60559-compatible complex arithmetic     .   .   .   .   .   .   .   528
+  G.1 Introduction     . . . . . . . . . . . . . . . . .        .   .   .   .   .   .   .   528
+  G.2 Types . . . . . . . . . . . . . . . . . . . .             .   .   .   .   .   .   .   528
+  G.3 Conventions      . . . . . . . . . . . . . . . . .        .   .   .   .   .   .   .   528
+  G.4 Conversions      . . . . . . . . . . . . . . . . .        .   .   .   .   .   .   .   529
+       G.4.1 Imaginary types     . . . . . . . . . . . .        .   .   .   .   .   .   .   529
+       G.4.2 Real and imaginary . . . . . . . . . . .           .   .   .   .   .   .   .   529
+       G.4.3 Imaginary and complex       . . . . . . . . .      .   .   .   .   .   .   .   529
+  G.5 Binary operators     . . . . . . . . . . . . . . .        .   .   .   .   .   .   .   529
+       G.5.1 Multiplicative operators    . . . . . . . . .      .   .   .   .   .   .   .   530
+       G.5.2 Additive operators     . . . . . . . . . . .       .   .   .   .   .   .   .   533
+  G.6 Complex arithmetic <complex.h>         . . . . . . .      .   .   .   .   .   .   .   533
+       G.6.1 Trigonometric functions . . . . . . . . .          .   .   .   .   .   .   .   535
+       G.6.2 Hyperbolic functions     . . . . . . . . . .       .   .   .   .   .   .   .   535
+       G.6.3 Exponential and logarithmic functions     . . .    .   .   .   .   .   .   .   539
+       G.6.4 Power and absolute-value functions      . . . .    .   .   .   .   .   .   .   540
+  G.7 Type-generic math <tgmath.h>         . . . . . . . .      .   .   .   .   .   .   .   541
+Annex H (informative) Language independent arithmetic . .   .   .   .   .   .   .   .   .   542
+  H.1 Introduction     . . . . . . . . . . . . . . . .      .   .   .   .   .   .   .   .   542
+  H.2 Types . . . . . . . . . . . . . . . . . . .           .   .   .   .   .   .   .   .   542
+  H.3 Notification      . . . . . . . . . . . . . . . .      .   .   .   .   .   .   .   .   546
+
+
+[page x]
+
+Annex I (informative) Common warnings         . . . . . . . . . . . . . . . . 548
+Annex J (informative) Portability issues    . . . .   .   .   .   .   .   .   .    .   .   .   .   .   .   550
+  J.1 Unspecified behavior . . . .           . . . .   .   .   .   .   .   .   .    .   .   .   .   .   .   550
+  J.2 Undefined behavior          . . . .    . . . .   .   .   .   .   .   .   .    .   .   .   .   .   .   553
+  J.3 Implementation-defined behavior          . . .   .   .   .   .   .   .   .    .   .   .   .   .   .   566
+  J.4 Locale-specific behavior         . .   . . . .   .   .   .   .   .   .   .    .   .   .   .   .   .   574
+  J.5 Common extensions          . . . .    . . . .   .   .   .   .   .   .   .    .   .   .   .   .   .   575
+Annex K (normative) Bounds-checking interfaces . . . . . . . . . .                             .   .   .   578
+  K.1 Background       . . . . . . . . . . . . . . . . . . . . .                               .   .   .   578
+  K.2 Scope . . . . . . . . . . . . . . . . . . . . . . . .                                    .   .   .   579
+  K.3 Library     . . . . . . . . . . . . . . . . . . . . . . .                                .   .   .   579
+       K.3.1 Introduction . . . . . . . . . . . . . . . . . .                                  .   .   .   579
+                K.3.1.1 Standard headers     . . . . . . . . . . . .                           .   .   .   579
+                K.3.1.2 Reserved identifiers     . . . . . . . . . . .                          .   .   .   580
+                K.3.1.3 Use of errno . . . . . . . . . . . . . .                               .   .   .   580
+                K.3.1.4 Runtime-constraint violations     . . . . . . .                        .   .   .   580
+       K.3.2 Errors <errno.h>           . . . . . . . . . . . . . .                            .   .   .   581
+       K.3.3 Common definitions <stddef.h>               . . . . . . . .                        .   .   .   581
+       K.3.4 Integer types <stdint.h>           . . . . . . . . . . .                          .   .   .   581
+       K.3.5 Input/output <stdio.h>          . . . . . . . . . . . .                           .   .   .   582
+                K.3.5.1 Operations on files      . . . . . . . . . . .                          .   .   .   582
+                K.3.5.2 File access functions . . . . . . . . . . .                            .   .   .   584
+                K.3.5.3 Formatted input/output functions . . . . . .                           .   .   .   587
+                K.3.5.4 Character input/output functions . . . . . .                           .   .   .   598
+       K.3.6 General utilities <stdlib.h>          . . . . . . . . . .                         .   .   .   600
+                K.3.6.1 Runtime-constraint handling       . . . . . . .                        .   .   .   600
+                K.3.6.2 Communication with the environment . . . .                             .   .   .   602
+                K.3.6.3 Searching and sorting utilities . . . . . . .                          .   .   .   603
+                K.3.6.4 Multibyte/wide character conversion functions                          .   .   .   606
+                K.3.6.5 Multibyte/wide string conversion functions . .                         .   .   .   607
+       K.3.7 String handling <string.h>            . . . . . . . . . .                         .   .   .   610
+                K.3.7.1 Copying functions       . . . . . . . . . . .                          .   .   .   610
+                K.3.7.2 Concatenation functions       . . . . . . . . .                        .   .   .   613
+                K.3.7.3 Search functions     . . . . . . . . . . . .                           .   .   .   616
+                K.3.7.4 Miscellaneous functions       . . . . . . . . .                        .   .   .   617
+       K.3.8 Date and time <time.h>          . . . . . . . . . . . .                           .   .   .   620
+                K.3.8.1 Components of time . . . . . . . . . . .                               .   .   .   620
+                K.3.8.2 Time conversion functions       . . . . . . . .                        .   .   .   620
+       K.3.9 Extended multibyte and wide character utilities
+                <wchar.h>        . . . . . . . . . . . . . . . . .                             . . . 623
+                K.3.9.1 Formatted wide character input/output functions                        . . . 624
+                K.3.9.2 General wide string utilities . . . . . . . .                          . . . 635
+
+
+
+[page xi]
+
+               K.3.9.3 Extended multibyte/wide character conversion
+                       utilities . . . . . . . . . . . . . . . . . . . 643
+Annex L (normative) Analyzability . .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   648
+  L.1 Scope . . . . . . . . . . .       .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   648
+  L.2 Definitions . . . . . . . . .      .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   648
+  L.3 Requirements . . . . . . . .      .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   649
+Bibliography   . . . . . . . . . . . . . . . . . . . . . . . . . . . 650
+Index    . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 653
+
+
+
+
+[page xii]
+
+    Foreword
+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 2. This International Standard was drafted in accordance with the fifth
+    edition (2004).
+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   Attention is drawn to the possibility that some of the elements of this document may be
+    the subject of patent rights. ISO and IEC shall not be held responsible for identifying any
+    or all such patent rights.
+5   This International Standard 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.
+6   This third edition cancels and replaces the second edition, ISO/IEC 9899:1999, as
+    corrected by ISO/IEC 9899:1999/Cor 1:2001, ISO/IEC 9899:1999/Cor 2:2004, and
+    ISO/IEC 9899:1999/Cor 3:2007. Major changes from the previous edition include:
+    -- conditional (optional) features (including some that were previously mandatory)
+    -- support for multiple threads of execution including an improved memory sequencing
+      model, atomic objects, and thread-local storage (<stdatomic.h> and
+      <threads.h>)
+    -- additional floating-point characteristic macros (<float.h>)
+    -- querying and specifying alignment of objects (<stdalign.h>, <stdlib.h>)
+    -- Unicode characters and           strings   (<uchar.h>)       (originally   specified    in
+      ISO/IEC TR 19769:2004)
+    -- type-generic expressions
+
+
+[page xiii]
+
+    -- static assertions
+    -- anonymous structures and unions
+    -- no-return functions
+    -- macros to create complex numbers (<complex.h>)
+    -- support for opening files for exclusive access
+    -- removed the gets function (<stdio.h>)
+    -- added the aligned_alloc, at_quick_exit, and quick_exit functions
+      (<stdlib.h>)
+    -- (conditional) support for bounds-checking interfaces (originally specified in
+      ISO/IEC TR 24731-1:2007)
+    -- (conditional) support for analyzability
+7   Major changes in the second edition included:
+    -- restricted character set support via digraphs and <iso646.h> (originally specified
+      in AMD1)
+    -- wide character library support in <wchar.h> and <wctype.h> (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 <complex.h>
+    -- type-generic math macros in <tgmath.h>
+    -- the long long int type and library functions
+    -- increased minimum translation limits
+    -- additional floating-point characteristics in <float.h>
+    -- 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
+
+
+
+[page xiv]
+
+-- compound literals
+-- designated initializers
+-- // comments
+-- extended integer types and library functions in <inttypes.h> and <stdint.h>
+-- 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 <stdio.h> and <wchar.h>
+-- additional math library functions in <math.h>
+-- treatment of error conditions by math library functions (math_errhandling)
+-- floating-point environment access in <fenv.h>
+-- 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 <stdio.h>
+-- boolean type in <stdbool.h>
+-- idempotent type qualifiers
+-- empty macro arguments
+-- 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
+
+
+[page xv]
+
+    -- 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)
+8   Annexes D, F, G, K, and L form a normative part of this standard; annexes A, B, C, E, H, *
+    I, J, the bibliography, and the index are for information only. In accordance with Part 2 of
+    the ISO/IEC Directives, this foreword, the introduction, notes, footnotes, and examples
+    are also for information only.
+
+
+
+
+[page xvi]
+
+    Introduction
+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.30]) 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.
+
+
+
+
+[page xvii]
+
+
+
+[page xviii]
+
+
+
+    Programming languages -- C
+
+
+
+    1. Scope
+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;
+    -- all minimal requirements of a data-processing system that is capable of supporting a
+      conforming implementation.
+
+
+    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.
+
+[page 1]
+
+
+    2. Normative references
+1   The following referenced documents are indispensable for the application of this
+    document. For dated references, only the edition cited applies. For undated references,
+    the latest edition of the referenced document (including any amendments) applies.
+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).
+
+
+
+
+[page 2]
+
+
+    3. Terms, definitions, and symbols
+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.
+    3.1
+1   access
+    <execution-time action> 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.
+
+    3.2
+1   alignment
+    requirement that objects of a particular type be located on storage boundaries with
+    addresses that are particular multiples of a byte address
+    3.3
+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
+    3.4
+1   behavior
+    external appearance or action
+    3.4.1
+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.
+
+    3.4.2
+1   locale-specific behavior
+    behavior that depends on local conventions of nationality, culture, and language that each
+    implementation documents
+
+
+[page 3]
+
+2   EXAMPLE An example of locale-specific behavior is whether the islower function returns true for
+    characters other than the 26 lowercase Latin letters.
+
+    3.4.3
+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.
+
+    3.4.4
+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.
+
+    3.5
+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.
+
+    3.6
+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.
+
+    3.7
+1   character
+    <abstract> member of a set of elements used for the organization, control, or
+    representation of data
+    3.7.1
+1   character
+    single-byte character
+    <C> bit representation that fits in a byte
+[page 4]
+
+    3.7.2
+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.
+
+    3.7.3
+1   wide character
+    bit representation that fits in an object of type wchar_t, capable of representing any
+    character in the current locale
+    3.8
+1   constraint
+    restriction, either syntactic or semantic, by which the exposition of language elements is
+    to be interpreted
+    3.9
+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
+    3.10
+1   diagnostic message
+    message belonging to an implementation-defined subset of the implementation's message
+    output
+    3.11
+1   forward reference
+    reference to a later subclause of this International Standard that contains additional
+    information relevant to this subclause
+    3.12
+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
+    3.13
+1   implementation limit
+    restriction imposed upon programs by the implementation
+    3.14
+1   memory location
+    either an object of scalar type, or a maximal sequence of adjacent bit-fields all having
+    nonzero width
+
+[page 5]
+
+2   NOTE 1 Two threads of execution can update and access separate memory locations without interfering
+    with each other.
+
+3   NOTE 2 A bit-field and an adjacent non-bit-field member are in separate memory locations. The same
+    applies to two bit-fields, if one is declared inside a nested structure declaration and the other is not, or if the
+    two are separated by a zero-length bit-field declaration, or if they are separated by a non-bit-field member
+    declaration. It is not safe to concurrently update two non-atomic bit-fields in the same structure if all
+    members declared between them are also (non-zero-length) bit-fields, no matter what the sizes of those
+    intervening bit-fields happen to be.
+
+4   EXAMPLE        A structure declared as
+             struct {
+                   char a;
+                   int b:5, c:11, :0, d:8;
+                   struct { int ee:8; } e;
+             }
+    contains four separate memory locations: The member a, and bit-fields d and e.ee are each separate
+    memory locations, and can be modified concurrently without interfering with each other. The bit-fields b
+    and c together constitute the fourth memory location. The bit-fields b and c cannot be concurrently
+    modified, but b and a, for example, can be.
+
+    3.15
+1   object
+    region of data storage in the execution environment, the contents of which can represent
+    values
+2   NOTE      When referenced, an object may be interpreted as having a particular type; see 6.3.2.1.
+
+    3.16
+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
+    3.17
+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
+    3.18
+1   runtime-constraint
+    requirement on a program when calling a library function
+2   NOTE 1 Despite the similar terms, a runtime-constraint is not a kind of constraint as defined by 3.8, and
+    need not be diagnosed at translation time.
+
+3   NOTE 2 Implementations that support the extensions in annex K are required to verify that the runtime-
+    constraints for a library function are not violated by the program; see K.3.1.4.
+
+[page 6]
+
+    3.19
+1   value
+    precise meaning of the contents of an object when interpreted as having a specific type
+    3.19.1
+1   implementation-defined value
+    unspecified value where each implementation documents how the choice is made
+    3.19.2
+1   indeterminate value
+    either an unspecified value or a trap representation
+    3.19.3
+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.
+
+    3.19.4
+1   trap representation
+    an object representation that need not represent a value of the object type
+    3.19.5
+1   perform a trap
+    interrupt execution of the program such that no further operations are performed
+2   NOTE In this International Standard, when the word ''trap'' is not immediately followed by
+    ''representation'', this is the intended usage.2)
+
+    3.20
+1   [^ x^]
+    ceiling of x: the least integer greater than or equal to x
+2   EXAMPLE       [^2.4^] is 3, [^-2.4^] is -2.
+
+    3.21
+1   [_ x_]
+    floor of x: the greatest integer less than or equal to x
+2   EXAMPLE       [_2.4_] is 2, [_-2.4_] is -3.
+
+
+
+
+    2)   For example, ''Trapping or stopping (if supported) is disabled...'' (F.8.2). Note that fetching a trap
+         representation might perform a trap but is not required to (see 6.2.6.1).
+
+[page 7]
+
+
+    4. Conformance
+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 or runtime-
+    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 5.1.2.3.
+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.3) 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 <float.h>,
+    <iso646.h>, <limits.h>, <stdalign.h>, <stdarg.h>, <stdbool.h>,
+    <stddef.h>, and <stdint.h>. A conforming implementation may have extensions
+    (including additional library functions), provided they do not alter the behavior of any
+    strictly conforming program.4)
+
+
+
+    3)   A strictly conforming program can use conditional features (see 6.10.8.3) provided the use is guarded
+         by an appropriate conditional inclusion preprocessing directive using the related macro. For example:
+                 #ifdef __STDC_IEC_559__ /* FE_UPWARD defined */
+                    /* ... */
+                    fesetround(FE_UPWARD);
+                    /* ... */
+                 #endif
+
+    4)   This implies that a conforming implementation reserves no identifiers other than those explicitly
+         reserved in this International Standard.
+
+[page 8]
+
+7   A conforming program is one that is acceptable to a conforming implementation.5)
+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 (6.10.1), error directive (6.10.5),
+    characteristics of floating types <float.h> (7.7), alternative spellings <iso646.h>
+    (7.9), sizes of integer types <limits.h> (7.10), alignment <stdalign.h> (7.15),
+    variable arguments <stdarg.h> (7.16), boolean type and values <stdbool.h>
+    (7.18), common definitions <stddef.h> (7.19), integer types <stdint.h> (7.20).
+
+
+
+
+    5)   Strictly conforming programs are intended to be maximally portable among conforming
+         implementations. Conforming programs may depend upon nonportable features of a conforming
+         implementation.
+
+[page 9]
+
+
+    5. Environment
+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.
+    5.1 Conceptual models
+    5.1.1 Translation environment
+    5.1.1.1 Program structure
+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 (6.2.2), external definitions (6.9),
+    preprocessing directives (6.10).
+    5.1.1.2 Translation phases
+1   The precedence among the syntax rules of translation is specified by the following
+    phases.6)
+         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.
+
+
+
+    6)    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.
+
+[page 10]
+
+     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 tokens7) 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 (6.10.3.3), 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.8)
+     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 (6.4.3), lexical elements (6.4),
+preprocessing directives (6.10), trigraph sequences (5.2.1.1), external definitions (6.9).
+
+
+
+7)    As described in 6.4, the process of dividing a source file's characters into preprocessing tokens is
+      context-dependent. For example, see the handling of < within a #include preprocessing directive.
+8)    An implementation need not convert all non-corresponding source characters to the same execution
+      character.
+
+[page 11]
+
+    5.1.1.3 Diagnostics
+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.9)
+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.
+
+    5.1.2 Execution environments
+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 (6.2.4), initialization (6.7.9).
+    5.1.2.1 Freestanding environment
+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.
+    5.1.2.2 Hosted environment
+1   A hosted environment need not be provided, but shall conform to the following
+    specifications if present.
+
+
+
+
+    9)   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.
+
+[page 12]
+
+    5.1.2.2.1 Program startup
+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;10) 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.
+    5.1.2.2.2 Program execution
+1   In a hosted environment, a program may use all the functions, macros, type definitions,
+    and objects described in the library clause (clause 7).
+
+
+
+
+    10) 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.
+
+[page 13]
+
+    5.1.2.2.3 Program termination
+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;11) 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 (7.1.1), the exit function (7.22.4.4).
+    5.1.2.3 Program execution
+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,12) which are changes in the state of
+    the execution environment. Evaluation of an expression in general includes both value
+    computations and initiation of side effects. Value computation for an lvalue expression
+    includes determining the identity of the designated object.
+3   Sequenced before is an asymmetric, transitive, pair-wise relation between evaluations
+    executed by a single thread, which induces a partial order among those evaluations.
+    Given any two evaluations A and B, if A is sequenced before B, then the execution of A
+    shall precede the execution of B. (Conversely, if A is sequenced before B, then B is
+    sequenced after A.) If A is not sequenced before or after B, then A and B are
+    unsequenced. Evaluations A and B are indeterminately sequenced when A is sequenced
+    either before or after B, but it is unspecified which.13) The presence of a sequence point
+    between the evaluation of expressions A and B implies that every value computation and
+    side effect associated with A is sequenced before every value computation and side effect
+    associated with B. (A summary of the sequence points is given in annex C.)
+4   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
+
+    11) In accordance with 6.2.4, 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.
+    12) 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 annex F for details. The floating-point
+        environment library <fenv.h> provides a programming facility for indicating when these side
+        effects matter, freeing the implementations in other cases.
+    13) The executions of unsequenced evaluations can interleave. Indeterminately sequenced evaluations
+        cannot interleave, but can be executed in any order.
+
+[page 14]
+
+     calling a function or accessing a volatile object).
+5    When the processing of the abstract machine is interrupted by receipt of a signal, the
+     values of objects that are neither lock-free atomic objects nor of type volatile
+     sig_atomic_t are unspecified, and the value of any object that is modified by the
+     handler that is neither a lock-free atomic object nor of type volatile
+     sig_atomic_t becomes undefined.
+6    The least requirements on a conforming implementation are:
+     -- Accesses to volatile objects are evaluated strictly according to the rules of the abstract
+       machine.
+     -- 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
+       7.21.3. 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.
+     This is the observable behavior of the program.
+7    What constitutes an interactive device is implementation-defined.
+8    More stringent correspondences between abstract and actual semantics may be defined by
+     each implementation.
+9    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.
+10   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.
+
+11   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.
+
+[page 15]
+
+12   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).
+
+13   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.
+
+14   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 F.9).
+              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;
+
+15   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
+
+
+[page 16]
+
+              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.
+
+16   EXAMPLE 7 The grouping of an expression does not completely determine its evaluation. In the
+     following fragment
+              #include <stdio.h>
+              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 (6.5), type qualifiers (6.7.3), statements (6.8), the
+     signal function (7.14), files (7.21.3).
+     5.1.2.4 Multi-threaded executions and data races
+1    Under a hosted implementation, a program can have more than one thread of execution
+     (or thread) running concurrently. The execution of each thread proceeds as defined by
+     the remainder of this standard. The execution of the entire program consists of an
+     execution of all of its threads.14) Under a freestanding implementation, it is
+     implementation-defined whether a program can have more than one thread of execution.
+2    The value of an object visible to a thread T at a particular point is the initial value of the
+     object, a value stored in the object by T , or a value stored in the object by another thread,
+     according to the rules below.
+3    NOTE 1 In some cases, there may instead be undefined behavior. Much of this section is motivated by
+     the desire to support atomic operations with explicit and detailed visibility constraints. However, it also
+     implicitly supports a simpler view for more restricted programs.
+
+4    Two expression evaluations conflict if one of them modifies a memory location and the
+     other one reads or modifies the same memory location.
+
+
+
+
+     14) The execution can usually be viewed as an interleaving of all of the threads. However, some kinds of
+         atomic operations, for example, allow executions inconsistent with a simple interleaving as described
+         below.
+
+[page 17]
+
+5    The library defines a number of atomic operations (7.17) and operations on mutexes
+     (7.25.4) that are specially identified as synchronization operations. These operations play
+     a special role in making assignments in one thread visible to another. A synchronization
+     operation on one or more memory locations is either an acquire operation, a release
+     operation, both an acquire and release operation, or a consume operation. A
+     synchronization operation without an associated memory location is a fence and can be
+     either an acquire fence, a release fence, or both an acquire and release fence. In addition,
+     there are relaxed atomic operations, which are not synchronization operations, and
+     atomic read-modify-write operations, which have special characteristics.
+6    NOTE 2 For example, a call that acquires a mutex will perform an acquire operation on the locations
+     composing the mutex. Correspondingly, a call that releases the same mutex will perform a release
+     operation on those same locations. Informally, performing a release operation on A forces prior side effects
+     on other memory locations to become visible to other threads that later perform an acquire or consume
+     operation on A. We do not include relaxed atomic operations as synchronization operations although, like
+     synchronization operations, they cannot contribute to data races.
+
+7    All modifications to a particular atomic object M occur in some particular total order,
+     called the modification order of M. If A and B are modifications of an atomic object M,
+     and A happens before B, then A shall precede B in the modification order of M, which is
+     defined below.
+8    NOTE 3     This states that the modification orders must respect the ''happens before'' relation.
+
+9    NOTE 4 There is a separate order for each atomic object. There is no requirement that these can be
+     combined into a single total order for all objects. In general this will be impossible since different threads
+     may observe modifications to different variables in inconsistent orders.
+
+10   A release sequence on an atomic object M is a maximal contiguous sub-sequence of side
+     effects in the modification order of M, where the first operation is a release and every
+     subsequent operation either is performed by the same thread that performed the release or
+     is an atomic read-modify-write operation.
+11   Certain library calls synchronize with other library calls performed by another thread. In
+     particular, an atomic operation A that performs a release operation on an object M
+     synchronizes with an atomic operation B that performs an acquire operation on M and
+     reads a value written by any side effect in the release sequence headed by A.
+12   NOTE 5 Except in the specified cases, reading a later value does not necessarily ensure visibility as
+     described below. Such a requirement would sometimes interfere with efficient implementation.
+
+13   NOTE 6 The specifications of the synchronization operations define when one reads the value written by
+     another. For atomic variables, the definition is clear. All operations on a given mutex occur in a single total
+     order. Each mutex acquisition ''reads the value written'' by the last mutex release.
+
+14   An evaluation A carries a dependency 15) to an evaluation B if:
+
+
+     15) The ''carries a dependency'' relation is a subset of the ''sequenced before'' relation, and is similarly
+         strictly intra-thread.
+
+[page 18]
+
+     -- the value of A is used as an operand of B, unless:
+           o B is an invocation of the kill_dependency macro,
+
+           o A is the left operand of a && or || operator,
+
+           o A is the left operand of a ? : operator, or
+
+           o A is the left operand of a , operator;
+         or
+     -- A writes a scalar object or bit-field M, B reads from M the value written by A, and A
+       is sequenced before B, or
+     -- for some evaluation X, A carries a dependency to X and X carries a dependency to B.
+15   An evaluation A is dependency-ordered before16) an evaluation B if:
+     -- A performs a release operation on an atomic object M, and B performs a consume
+       operation on M and reads a value written by any side effect in the release sequence
+       headed by A, or
+     -- for some evaluation X, A is dependency-ordered before X and X carries a
+       dependency to B.
+16   An evaluation A inter-thread happens before an evaluation B if A synchronizes with B, A
+     is dependency-ordered before B, or, for some evaluation X:
+     -- A synchronizes with X and X is sequenced before B,
+     -- A is sequenced before X and X inter-thread happens before B, or
+     -- A inter-thread happens before X and X inter-thread happens before B.
+17   NOTE 7 The ''inter-thread happens before'' relation describes arbitrary concatenations of ''sequenced
+     before'', ''synchronizes with'', and ''dependency-ordered before'' relationships, with two exceptions. The
+     first exception is that a concatenation is not permitted to end with ''dependency-ordered before'' followed
+     by ''sequenced before''. The reason for this limitation is that a consume operation participating in a
+     ''dependency-ordered before'' relationship provides ordering only with respect to operations to which this
+     consume operation actually carries a dependency. The reason that this limitation applies only to the end of
+     such a concatenation is that any subsequent release operation will provide the required ordering for a prior
+     consume operation. The second exception is that a concatenation is not permitted to consist entirely of
+     ''sequenced before''. The reasons for this limitation are (1) to permit ''inter-thread happens before'' to be
+     transitively closed and (2) the ''happens before'' relation, defined below, provides for relationships
+     consisting entirely of ''sequenced before''.
+
+18   An evaluation A happens before an evaluation B if A is sequenced before B or A inter-
+     thread happens before B.
+
+
+
+     16) The ''dependency-ordered before'' relation is analogous to the ''synchronizes with'' relation, but uses
+         release/consume in place of release/acquire.
+
+[page 19]
+
+19   A visible side effect A on an object M with respect to a value computation B of M
+     satisfies the conditions:
+     -- A happens before B, and
+     -- there is no other side effect X to M such that A happens before X and X happens
+         before B.
+     The value of a non-atomic scalar object M, as determined by evaluation B, shall be the
+     value stored by the visible side effect A.
+20   NOTE 8 If there is ambiguity about which side effect to a non-atomic object is visible, then there is a data
+     race and the behavior is undefined.
+
+21   NOTE 9 This states that operations on ordinary variables are not visibly reordered. This is not actually
+     detectable without data races, but it is necessary to ensure that data races, as defined here, and with suitable
+     restrictions on the use of atomics, correspond to data races in a simple interleaved (sequentially consistent)
+     execution.
+
+22   The visible sequence of side effects on an atomic object M, with respect to a value
+     computation B of M, is a maximal contiguous sub-sequence of side effects in the
+     modification order of M, where the first side effect is visible with respect to B, and for
+     every subsequent side effect, it is not the case that B happens before it. The value of an
+     atomic object M, as determined by evaluation B, shall be the value stored by some
+     operation in the visible sequence of M with respect to B. Furthermore, if a value
+     computation A of an atomic object M happens before a value computation B of M, and
+     the value computed by A corresponds to the value stored by side effect X, then the value
+     computed by B shall either equal the value computed by A, or be the value stored by side
+     effect Y , where Y follows X in the modification order of M.
+23   NOTE 10 This effectively disallows compiler reordering of atomic operations to a single object, even if
+     both operations are ''relaxed'' loads. By doing so, we effectively make the ''cache coherence'' guarantee
+     provided by most hardware available to C atomic operations.
+
+24   NOTE 11 The visible sequence depends on the ''happens before'' relation, which in turn depends on the
+     values observed by loads of atomics, which we are restricting here. The intended reading is that there must
+     exist an association of atomic loads with modifications they observe that, together with suitably chosen
+     modification orders and the ''happens before'' relation derived as described above, satisfy the resulting
+     constraints as imposed here.
+
+25   The execution of a program contains a data race if it contains two conflicting actions in
+     different threads, at least one of which is not atomic, and neither happens before the
+     other. Any such data race results in undefined behavior.
+26   NOTE 12 It can be shown that programs that correctly use simple mutexes and
+     memory_order_seq_cst operations to prevent all data races, and use no other synchronization
+     operations, behave as though the operations executed by their constituent threads were simply interleaved,
+     with each value computation of an object being the last value stored in that interleaving. This is normally
+     referred to as ''sequential consistency''. However, this applies only to data-race-free programs, and data-
+     race-free programs cannot observe most program transformations that do not change single-threaded
+     program semantics. In fact, most single-threaded program transformations continue to be allowed, since
+     any program that behaves differently as a result must contain undefined behavior.
+
+[page 20]
+
+27   NOTE 13 Compiler transformations that introduce assignments to a potentially shared memory location
+     that would not be modified by the abstract machine are generally precluded by this standard, since such an
+     assignment might overwrite another assignment by a different thread in cases in which an abstract machine
+     execution would not have encountered a data race. This includes implementations of data member
+     assignment that overwrite adjacent members in separate memory locations. We also generally preclude
+     reordering of atomic loads in cases in which the atomics in question may alias, since this may violate the
+     "visible sequence" rules.
+
+28   NOTE 14 Transformations that introduce a speculative read of a potentially shared memory location may
+     not preserve the semantics of the program as defined in this standard, since they potentially introduce a data
+     race. However, they are typically valid in the context of an optimizing compiler that targets a specific
+     machine with well-defined semantics for data races. They would be invalid for a hypothetical machine that
+     is not tolerant of races or provides hardware race detection.
+
+
+
+
+[page 21]
+
+    5.2 Environmental considerations
+    5.2.1 Character sets
+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
+            !    "   #      %   &   '    (    )    *    +    ,    -   .    /    :
+            ;    <   =      >   ?   [    \    ]    ^    _    {    |   }    ~
+    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 22]
+
+    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 (6.4.3), character constants (6.4.4.4),
+    preprocessing directives (6.10), string literals (6.4.5), comments (6.4.9), string (7.1.1).
+    5.2.1.1 Trigraph sequences
+1   Before any other processing takes place, each occurrence of one of the following
+    sequences of three characters (called trigraph sequences17)) is replaced with the
+    corresponding single character.
+           ??=      #                       ??)      ]                       ??!     |
+           ??(      [                       ??'      ^                       ??>     }
+           ??/      \                       ??<      {                       ??-     ~
+    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");
+
+    5.2.1.2 Multibyte characters
+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.
+
+    17) 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.
+
+[page 23]
+
+    -- 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.
+    5.2.2 Character display semantics
+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
+[page 24]
+
+         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 (7.4.1.8), the fputc function (7.21.7.3).
+    5.2.3 Signals and interrupts
+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.
+    5.2.4 Environmental limits
+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.
+    5.2.4.1 Translation limits
+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:18)
+    -- 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 void 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
+
+
+    18) Implementations should avoid imposing fixed translation limits whenever possible.
+
+[page 25]
+
+         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)19)
+    -- 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 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
+    5.2.4.2 Numerical limits
+1   An implementation is required to document all the limits specified in this subclause,
+    which are specified in the headers <limits.h> and <float.h>. Additional limits are
+    specified in <stdint.h>.
+    Forward references: integer types <stdint.h> (7.20).
+    5.2.4.2.1 Sizes of integer types <limits.h>
+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
+
+
+    19) See ''future language directions'' (6.11.3).
+
+[page 26]
+
+(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
+
+
+[page 27]
+
+    -- 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.20) The value UCHAR_MAX shall equal 2CHAR_BIT - 1.
+    Forward references: representations of types (6.2.6), conditional inclusion (6.10.1).
+    5.2.4.2.2 Characteristics of floating types <float.h>
+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.21) 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 > 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 <= e <= emax
+
+3   In addition to normalized floating-point numbers ( f 1 > 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 > 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
+
+
+    20) See 6.2.5.
+    21) 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.
+
+[page 28]
+
+    arithmetic operand.22)
+4   An implementation may give zero and values that are not floating-point numbers (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 minimum range of representable values for a floating type is the most negative finite
+    floating-point number representable in that type through the most positive finite floating-
+    point number representable in that type. In addition, if negative infinity is representable
+    in a type, the range of that type is extended to all negative real numbers; likewise, if
+    positive infinity is representable in a type, the range of that type is extended to all positive
+    real numbers.
+6   The accuracy of the floating-point operations (+, -, *, /) and of the library functions in
+    <math.h> and <complex.h> 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
+    <stdio.h>, <stdlib.h>, and <wchar.h>. The implementation may state that the
+    accuracy is unknown.
+7   All integer values in the <float.h> 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.
+8   The rounding mode for floating-point addition is characterized by the implementation-
+    defined value of FLT_ROUNDS:23)
+          -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.
+
+
+    22) 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.
+    23) Evaluation of FLT_ROUNDS correctly reflects any execution-time change of rounding mode through
+        the function fesetround in <fenv.h>.
+
+[page 29]
+
+9    Except for assignment and cast (which remove all extra range and precision), the values
+     yielded by operators 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:24)
+            -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.
+10   The presence or absence of subnormal numbers is characterized by the implementation-
+     defined     values     of    FLT_HAS_SUBNORM,          DBL_HAS_SUBNORM,           and
+     LDBL_HAS_SUBNORM:
+            -1       indeterminable25)
+             0       absent26) (type does not support subnormal numbers)
+             1       present (type does support subnormal numbers)
+11   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
+
+
+
+
+     24) 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.
+     25) Characterization as indeterminable is intended if floating-point operations do not consistently interpret
+         subnormal representations as zero, nor as nonzero.
+     26) Characterization as absent is intended if no floating-point operations produce subnormal results from
+         non-subnormal inputs, even if the type format includes representations of subnormal numbers.
+
+[page 30]
+
+-- 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 with p radix b digits
+  can be rounded to a floating-point number with n decimal digits and back again
+  without change to the value,
+       { p log10 b        if b is a power of 10
+       {
+       { [^1 + p log10 b^] otherwise
+   FLT_DECIMAL_DIG                                   6
+   DBL_DECIMAL_DIG                                  10
+   LDBL_DECIMAL_DIG                                 10
+-- 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,
+       { 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
+
+
+
+
+[page 31]
+
+     -- 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
+12   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
+13   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
+          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
+
+
+
+
+[page 32]
+
+     -- minimum positive floating-point number27)
+         FLT_TRUE_MIN                                       1E-37
+         DBL_TRUE_MIN                                       1E-37
+         LDBL_TRUE_MIN                                      1E-37
+     Recommended practice
+14   Conversion from (at least) double to decimal with DECIMAL_DIG digits and back
+     should be the identity function.
+15   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 <float.h> header for type
+     float:
+                        6
+           x = s16e    (Sum) f k 16-k ,
+                       k=1
+                                       -31 <= e <= +32
+
+             FLT_RADIX                                    16
+             FLT_MANT_DIG                                  6
+             FLT_EPSILON                     9.53674316E-07F
+             FLT_DECIMAL_DIG                               9
+             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
+
+16   EXAMPLE 2 The following describes floating-point representations that also meet the requirements for
+     single-precision and double-precision numbers in IEC 60559,28) and the appropriate values in a
+     <float.h> header for types float and double:
+                       24
+           x f = s2e   (Sum) f k 2-k ,
+                       k=1
+                                      -125 <= e <= +128
+
+                       53
+           x d = s2e   (Sum) f k 2-k ,
+                       k=1
+                                      -1021 <= e <= +1024
+
+             FLT_RADIX                                     2
+             DECIMAL_DIG                                  17
+             FLT_MANT_DIG                                 24
+             FLT_EPSILON                     1.19209290E-07F // decimal constant
+             FLT_EPSILON                            0X1P-23F // hex constant
+             FLT_DECIMAL_DIG                               9
+
+
+     27) If the presence or absence of subnormal numbers is indeterminable, then the value is intended to be a
+         positive number no greater than the minimum normalized positive number for the type.
+     28) 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.
+
+[page 33]
+
+        FLT_DIG                             6
+        FLT_MIN_EXP                      -125
+        FLT_MIN               1.17549435E-38F               //   decimal constant
+        FLT_MIN                     0X1P-126F               //   hex constant
+        FLT_TRUE_MIN          1.40129846E-45F               //   decimal constant
+        FLT_TRUE_MIN                0X1P-149F               //   hex constant
+        FLT_HAS_SUBNORM                     1
+        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_DECIMAL_DIG                    17
+        DBL_DIG                            15
+        DBL_MIN_EXP                     -1021
+        DBL_MIN      2.2250738585072014E-308                //   decimal constant
+        DBL_MIN                     0X1P-1022               //   hex constant
+        DBL_TRUE_MIN 4.9406564584124654E-324                //   decimal constant
+        DBL_TRUE_MIN                0X1P-1074               //   hex constant
+        DBL_HAS_SUBNORM                     1
+        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 (6.10.1), complex arithmetic
+<complex.h> (7.3), extended multibyte and wide character utilities <wchar.h>
+(7.28), floating-point environment <fenv.h> (7.6), general utilities <stdlib.h>
+(7.22), input/output <stdio.h> (7.21), mathematics <math.h> (7.12).
+
+
+
+
+[page 34]
+
+
+    6. Language
+    6.1 Notation
+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 annex A.
+    6.2 Concepts
+    6.2.1 Scopes of identifiers
+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
+
+[page 35]
+
+    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 end
+    strictly before 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.
+8   As a special case, a type name (which is not a declaration of an identifier) is considered to
+    have a scope that begins just after the place within the type name where the omitted
+    identifier would appear were it not omitted.
+    Forward references: declarations (6.7), function calls (6.5.2.2), function definitions
+    (6.9.1), identifiers (6.4.2), macro replacement (6.10.3), name spaces of identifiers (6.2.3),
+    source file inclusion (6.10.2), statements (6.8).
+    6.2.2 Linkages of identifiers
+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.29) 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.30)
+
+
+
+    29) There is no linkage between different identifiers.
+
+[page 36]
+
+4   For an identifier declared with the storage-class specifier extern in a scope in which a
+    prior declaration of that identifier is visible,31) 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 (6.7), expressions (6.5), external definitions (6.9),
+    statements (6.8).
+    6.2.3 Name spaces of identifiers
+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 any32)
+      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 -> operator);
+    -- all other identifiers, called ordinary identifiers (declared in ordinary declarators or as
+      enumeration constants).
+    Forward references: enumeration specifiers (6.7.2.2), labeled statements (6.8.1),
+    structure and union specifiers (6.7.2.1), structure and union members (6.5.2.3), tags
+    (6.7.2.3), the goto statement (6.8.6.1).
+
+    30) A function declaration can contain the storage-class specifier static only if it is at file scope; see
+        6.7.1.
+    31) As specified in 6.2.1, the later declaration might hide the prior declaration.
+    32) There is only one name space for tags even though three are possible.
+
+[page 37]
+
+    6.2.4 Storage durations of objects
+1   An object has a storage duration that determines its lifetime. There are four storage
+    durations: static, thread, automatic, and allocated. Allocated storage is described in
+    7.22.3.
+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,33) and retains
+    its last-stored value throughout its lifetime.34) 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 (or just past) reaches the end of its lifetime.
+3   An object whose identifier is declared without the storage-class specifier
+    _Thread_local, and either 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 the storage-class specifier _Thread_local
+    has thread storage duration. Its lifetime is the entire execution of the thread for which it
+    is created, and its stored value is initialized when the thread is started. There is a distinct
+    object per thread, and use of the declared name in an expression refers to the object
+    associated with the thread evaluating the expression. The result of attempting to
+    indirectly access an object with thread storage duration from a thread other than the one
+    with which the object is associated is implementation-defined.
+5   An object whose identifier is declared with no linkage and without the storage-class
+    specifier static has automatic storage duration, as do some compound literals. The
+    result of attempting to indirectly access an object with automatic storage duration from a
+    thread other than the one with which the object is associated is implementation-defined.
+6   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 or
+    compound literal is reached in the execution of the block; otherwise, the value becomes
+    indeterminate each time the declaration is reached.
+
+
+
+    33) 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.
+    34) In the case of a volatile object, the last store need not be explicit in the program.
+
+[page 38]
+
+7   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.35) If the scope is entered recursively, a new instance of the object is created
+    each time. The initial value of the object is indeterminate.
+8   A non-lvalue expression with structure or union type, where the structure or union
+    contains a member with array type (including, recursively, members of all contained
+    structures and unions) refers to an object with automatic storage duration and temporary
+    lifetime.36) Its lifetime begins when the expression is evaluated and its initial value is the
+    value of the expression. Its lifetime ends when the evaluation of the containing full
+    expression or full declarator ends. Any attempt to modify an object with temporary
+    lifetime results in undefined behavior.
+    Forward references: array declarators (6.7.6.2), compound literals (6.5.2.5), declarators
+    (6.7.6), function calls (6.5.2.2), initialization (6.7.9), statements (6.8).
+    6.2.5 Types
+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 describe objects) and function types (types
+    that describe functions). At various points within a translation unit an object type may be
+    incomplete (lacking sufficient information to determine the size of objects of that type) or
+    complete (having sufficient information).37)
+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 6.7.2.) There may also be
+    implementation-defined extended signed integer types.38) The standard and extended
+    signed integer types are collectively called signed integer types.39)
+
+    35) 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.
+    36) The address of such an object is taken implicitly when an array member is accessed.
+    37) A type may be incomplete or complete throughout an entire translation unit, or it may change states at
+        different points within a translation unit.
+
+[page 39]
+
+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 <limits.h>).
+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.40)
+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 6.3.1.1), 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.41) 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.42) 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.
+
+
+     38) Implementation-defined keywords shall have the form of an identifier reserved for any use as
+         described in 7.1.3.
+     39) Therefore, any statement in this Standard about signed integer types also applies to the extended
+         signed integer types.
+     40) Therefore, any statement in this Standard about unsigned integer types also applies to the extended
+         unsigned integer types.
+     41) The same representation and alignment requirements are meant to imply interchangeability as
+         arguments to functions, return values from functions, and members of unions.
+     42) See ''future language directions'' (6.11.1).
+
+[page 40]
+
+11   There are three complex types, designated as float _Complex, double
+     _Complex, and long double _Complex.43) (Complex types are a conditional
+     feature that implementations need not support; see 6.10.8.3.) 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. The basic types are complete object types. Even if the
+     implementation defines two or more basic types to have the same representation, they are
+     nevertheless different types.44)
+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.45)
+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 object type that
+     cannot be completed.
+
+
+
+     43) A specification for imaginary types is in annex G.
+     44) 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 7.1.3.
+     45) CHAR_MIN, defined in <limits.h>, 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.
+
+[page 41]
+
+20   Any number of derived types can be constructed from the object and function types, as
+     follows:
+     -- An array type describes a contiguously allocated nonempty set of objects with a
+       particular member object type, called the element type. The element type shall be
+       complete whenever the array type is specified. 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''.
+     -- A pointer type may be derived from a function type or an object 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''. A pointer type is a complete
+       object type.
+     -- An atomic type describes the type designated by the construct _Atomic ( type-
+       name ). (Atomic types are a conditional feature that implementations need not
+       support; see 6.10.8.3.)
+     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.46)
+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 6.7.2.3) is an incomplete
+
+
+     46) Note that aggregate type does not include union type because an object with union type can only
+         contain one member at a time.
+
+[page 42]
+
+     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,47) 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.48) A derived type is not qualified by the
+     qualifiers (if any) of the type from which it is derived.
+27   Further, there is the _Atomic qualifier. The presence of the _Atomic qualifier
+     designates an atomic type. The size, representation, and alignment of an atomic type
+     need not be the same as those of the corresponding unqualified type. Therefore, this
+     Standard explicitly uses the phrase ''atomic, qualified or unqualified type'' whenever the
+     atomic version of a type is permitted along with the other qualified versions of a type.
+     The phrase ''qualified or unqualified type'', without specific mention of atomic, does not
+     include the atomic types.
+28   A pointer to void shall have the same representation and alignment requirements as a
+     pointer to a character type.48) Similarly, pointers to qualified or unqualified versions of
+     compatible types shall have the same representation and alignment requirements. All
+     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.
+29   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-
+
+
+     47) See 6.7.3 regarding qualified array and function types.
+     48) The same representation and alignment requirements are meant to imply interchangeability as
+         arguments to functions, return values from functions, and members of unions.
+
+[page 43]
+
+     qualified float'' and is a pointer to a qualified type.
+
+30   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 (6.2.7), declarations (6.7).
+     6.2.6 Representations of types
+     6.2.6.1 General
+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.49)
+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.50) Such a representation is called
+     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.51) The value of a structure or union object is never a trap
+
+
+     49) 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.
+     50) 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.
+
+[page 44]
+
+    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.52) 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.
+9   Loads and stores of objects with                            atomic       types     are     done      with
+    memory_order_seq_cst semantics.
+    Forward references: declarations (6.7), expressions (6.5), lvalues, arrays, and function
+    designators (6.3.2.1), order and consistency (7.17.3).
+    6.2.6.2 Integer types
+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.53)
+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;
+    signed char shall not have any padding bits. 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 <= N ). If the sign bit is zero, it shall not affect
+
+    51) Thus, for example, structure assignment need not copy any padding bits.
+    52) 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(&x, &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.
+    53) 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.
+
+[page 45]
+
+    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 M ) (two's complement);
+    -- the sign bit has the value -(2 M - 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 &, |, ^, ~, <<, and >> operators with operands that produce such a value;
+    -- the +, -, *, /, and % operators where one operand 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 &, |, ^, ~, <<,
+    and >> operators with operands that would produce such a value is undefined.
+5   The values of any padding bits are unspecified.54) 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
+    for signed integer types the width is one greater than the precision.
+
+
+
+
+    54) 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.
+
+[page 46]
+
+    6.2.7 Compatible type and composite type
+1   Two types have compatible type if their types are the same. Additional rules for
+    determining whether two types are compatible are described in 6.7.2 for type specifiers,
+    in 6.7.3 for type qualifiers, and in 6.7.6 for declarators.55) 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 completed anywhere within their
+    respective translation units, 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; if one member of the pair is
+    declared with an alignment specifier, the other is declared with an equivalent alignment
+    specifier; and if one member of the pair is declared with a name, the other 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 both types are array types, the following rules are applied:
+          o If one type is an array of known constant size, the composite type is an array of
+             that size.
+          o Otherwise, if one type is a variable length array whose size is specified by an
+             expression that is not evaluated, the behavior is undefined.
+          o Otherwise, if one type is a variable length array whose size is specified, the
+             composite type is a variable length array of that size.
+          o Otherwise, if one type is a variable length array of unspecified size, the composite
+             type is a variable length array of unspecified size.
+          o Otherwise, both types are arrays of unknown size and the composite type is an
+             array of unknown size.
+        The element type of the composite type is the composite type of the two element
+        types.
+    -- 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.
+
+
+    55) Two types need not be identical to be compatible.
+
+[page 47]
+
+    -- 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,56) if the prior declaration specifies internal or
+    external linkage, the type of the identifier at the later declaration becomes the composite
+    type.
+    Forward references: array declarators (6.7.6.2).
+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]);
+
+    6.2.8 Alignment of objects
+1   Complete object types have alignment requirements which place restrictions on the
+    addresses at which objects of that type may be allocated. An alignment is an
+    implementation-defined integer value representing the number of bytes between
+    successive addresses at which a given object can be allocated. An object type imposes an
+    alignment requirement on every object of that type: stricter alignment can be requested
+    using the _Alignas keyword.
+2   A fundamental alignment is represented by an alignment less than or equal to the greatest
+    alignment supported by the implementation in all contexts, which is equal to
+    alignof(max_align_t).
+3   An extended alignment is represented by an alignment greater than
+    alignof(max_align_t). It is implementation-defined whether any extended
+    alignments are supported and the contexts in which they are supported. A type having an
+    extended alignment requirement is an over-aligned type.57)
+4   Alignments are represented as values of the type size_t. Valid alignments include only
+    those values returned by an alignof expression for fundamental types, plus an
+    additional implementation-defined set of values, which may be empty. Every valid
+    alignment value shall be a nonnegative integral power of two.
+
+
+    56) As specified in 6.2.1, the later declaration might hide the prior declaration.
+    57) Every over-aligned type is, or contains, a structure or union type with a member to which an extended
+        alignment has been applied.
+
+[page 48]
+
+5   Alignments have an order from weaker to stronger or stricter alignments. Stricter
+    alignments have larger alignment values. An address that satisfies an alignment
+    requirement also satisfies any weaker valid alignment requirement.
+6   The alignment requirement of a complete type can be queried using an alignof
+    expression. The types char, signed char, and unsigned char shall have the
+    weakest alignment requirement.
+7   Comparing alignments is meaningful and provides the obvious results:
+    -- Two alignments are equal when their numeric values are equal.
+    -- Two alignments are different when their numeric values are not equal.
+    -- When an alignment is larger than another it represents a stricter alignment.
+
+
+
+
+[page 49]
+
+    6.3 Conversions
+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 6.3.1.8 summarizes
+    the conversions performed by most ordinary operators; it is supplemented as required by
+    the discussion of each operator in 6.5.
+2   Conversion of an operand value to a compatible type causes no change to the value or the
+    representation.
+    Forward references: cast operators (6.5.4).
+    6.3.1 Arithmetic operands
+    6.3.1.1 Boolean, characters, and integers
+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 6.7.2.2).
+    -- 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:
+
+[page 50]
+
+    -- An object or expression with an integer type (other than int or unsigned int)
+      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 (as restricted by the width, for a
+    bit-field), the value is converted to an int; otherwise, it is converted to an unsigned
+    int. These are called the integer promotions.58) 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 (6.7.2.2), structure and union specifiers
+    (6.7.2.1).
+    6.3.1.2 Boolean type
+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.59)
+    6.3.1.3 Signed and unsigned integers
+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.60)
+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.
+    6.3.1.4 Real floating and integer
+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.61)
+
+
+    58) 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.
+    59) NaNs do not compare equal to 0 and thus convert to 1.
+    60) The rules describe arithmetic on the mathematical value, not the value of a given type of expression.
+    61) 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).
+
+[page 51]
+
+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
+    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. Results of some implicit
+    conversions (6.3.1.8, 6.8.6.4) may be represented in greater precision and range than that
+    required by the new type.
+    6.3.1.5 Real floating types
+1   When a value of real floating 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
+    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. Results of some implicit
+    conversions (6.3.1.8, 6.8.6.4) may be represented in greater precision and range than that
+    required by the new type.
+    6.3.1.6 Complex types
+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.
+    6.3.1.7 Real and complex
+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.
+    6.3.1.8 Usual arithmetic conversions
+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
+
+[page 52]
+
+           corresponding real type is long double.
+           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.62)
+           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.63)
+
+
+
+
+    62) 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).
+    63) The cast and assignment operators are still required to remove extra range and precision.
+
+[page 53]
+
+    6.3.2 Other operands
+    6.3.2.1 Lvalues, arrays, and function designators
+1   An lvalue is an expression (with an object type other than void) that potentially
+    designates an object;64) 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 & 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); this is called lvalue conversion. If the lvalue has
+    qualified type, the value has the unqualified version of the type of the lvalue; additionally,
+    if the lvalue has atomic type, the value has the non-atomic 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. If the lvalue designates an
+    object of automatic storage duration that could have been declared with the register
+    storage class (never had its address taken), and that object is uninitialized (not declared
+    with an initializer and no assignment to it has been performed prior to use), the behavior
+    is undefined.
+3   Except when it is the operand of the sizeof operator or the unary & 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 operator65) or the unary & operator, a function designator with
+    type ''function returning type'' is converted to an expression that has type ''pointer to
+
+
+    64) 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.
+    65) Because this conversion does not occur, the operand of the sizeof operator remains a function
+        designator and violates the constraint in 6.5.3.4.
+
+[page 54]
+
+    function returning type''.
+    Forward references: address and indirection operators (6.5.3.2), assignment operators
+    (6.5.16), common definitions <stddef.h> (7.19), initialization (6.7.9), postfix
+    increment and decrement operators (6.5.2.4), prefix increment and decrement operators
+    (6.5.3.1), the sizeof operator (6.5.3.4), structure and union members (6.5.2.3).
+    6.3.2.2 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.)
+    6.3.2.3 Pointers
+1   A pointer to void may be converted to or from a pointer to any object type. A pointer to
+    any 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.66) 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.67)
+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.
+
+
+
+
+    66) The macro NULL is defined in <stddef.h> (and other headers) as a null pointer constant; see 7.19.
+    67) 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.
+
+[page 55]
+
+7   A pointer to an object type may be converted to a pointer to a different object type. If the
+    resulting pointer is not correctly aligned68) for the referenced 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 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 referenced type,
+    the behavior is undefined.
+    Forward references: cast operators (6.5.4), equality operators (6.5.9), integer types
+    capable of holding object pointers (7.20.1.4), simple assignment (6.5.16.1).
+
+
+
+
+    68) 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.
+
+[page 56]
+
+    6.4 Lexical elements
+    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.69) 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 6.10, 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.
+
+
+
+    69) An additional category, placemarkers, is used internally in translation phase 4 (see 6.10.3.3); it cannot
+        occur in source files.
+
+[page 57]
+
+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 (6.4.4.4), comments (6.4.9), expressions (6.5),
+    floating constants (6.4.4.2), header names (6.4.7), macro replacement (6.10.3), postfix
+    increment and decrement operators (6.5.2.4), prefix increment and decrement operators
+    (6.5.3.1), preprocessing directives (6.10), preprocessing numbers (6.4.8), string literals
+    (6.4.5).
+    6.4.1 Keywords
+    Syntax
+1            keyword: one of
+                   alignof                         goto                         union
+                   auto                            if                           unsigned
+                   break                           inline                       void
+                   case                            int                          volatile
+                   char                            long                         while
+                   const                           register                     _Alignas
+                   continue                        restrict                     _Atomic
+                   default                         return                       _Bool
+                   do                              short                        _Complex
+                   double                          signed                       _Generic
+                   else                            sizeof                       _Imaginary
+                   enum                            static                       _Noreturn
+                   extern                          struct                       _Static_assert
+                   float                           switch                       _Thread_local
+                   for                             typedef
+    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
+[page 58]
+
+    specifying imaginary types.70)
+    6.4.2 Identifiers
+    6.4.2.1 General
+    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 6.2.1. 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 D.1.71) The initial character
+    shall not be a universal character name designating a character whose encoding falls into
+    one of the ranges specified in D.2. 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.
+
+
+
+    70) One possible specification for imaginary types appears in annex G.
+    71) 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.
+
+[page 59]
+
+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.
+    Implementation limits
+5   As discussed in 5.2.4.1, 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 (6.4.3), macro replacement (6.10.3).
+    6.4.2.2 Predefined identifiers
+    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.72)
+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 <stdio.h>
+             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 (6.9.1).
+
+
+
+
+    72) Since the name __func__ is reserved for any use by the implementation (7.1.3), if any other
+        identifier is explicitly declared using the name __func__, the behavior is undefined.
+
+[page 60]
+
+    6.4.3 Universal character names
+    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.73)
+    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.74) Similarly, the universal
+    character name \unnnn designates the character whose four-digit short identifier is nnnn
+    (and whose eight-digit short identifier is 0000nnnn).
+
+
+
+
+    73) 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).
+
+    74) Short identifiers for characters were first specified in ISO/IEC 10646-1/AMD9:1997.
+
+[page 61]
+
+    6.4.4 Constants
+    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.
+    6.4.4.1 Integer constants
+    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
+
+
+
+
+[page 62]
+
+            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.
+
+
+
+
+[page 63]
+
+                                                                     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.
+
+
+
+
+[page 64]
+
+    6.4.4.2 Floating constants
+    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
+
+[page 65]
+
+    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. All floating constants of the same source form75) shall
+    convert to the same internal format with the same value.
+    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.76)
+
+    75) 1.23, 1.230, 123e-2, 123e-02, and 1.23L are all different source forms and thus need not
+        convert to the same internal format and value.
+    76) The specification for the library functions recommends more accurate conversion than required for
+        floating constants (see 7.22.1.3).
+
+[page 66]
+
+    6.4.4.3 Enumeration constants
+    Syntax
+1            enumeration-constant:
+                   identifier
+    Semantics
+2   An identifier declared as an enumeration constant has type int.
+    Forward references: enumeration specifiers (6.7.2.2).
+    6.4.4.4 Character constants
+    Syntax
+1            character-constant:
+                    ' c-char-sequence '
+                    L' c-char-sequence '
+                    u' c-char-sequence '
+                    U' 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
+
+
+
+
+[page 67]
+
+           hexadecimal-escape-sequence:
+                 \x hexadecimal-digit
+                 hexadecimal-escape-sequence hexadecimal-digit
+    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, u, or U. 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.77)
+
+
+
+[page 68]
+
+     Constraints
+9    The value of an octal or hexadecimal escape sequence shall be in the range of
+     representable values for the corresponding type:
+            Prefix      Corresponding Type
+            none       unsigned char
+            L          the unsigned type corresponding to wchar_t
+            u          char16_t
+            U          char32_t
+     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 prefixed by the letter L has type wchar_t, an integer type
+     defined in the <stddef.h> header; a wide character constant prefixed by the letter u or
+     U has type char16_t or char32_t, respectively, unsigned integer types defined in the
+     <uchar.h> header. The value of a wide character constant containing a single
+     multibyte character that maps to a single member of the extended execution character set
+     is the wide character corresponding to that multibyte character, as defined by the
+     mbtowc, mbrtoc16, or mbrtoc32 function as appropriate for its type, with an
+     implementation-defined current locale. The value of a wide character constant containing
+     more than one multibyte character or a single multibyte character that maps to multiple
+     members of the extended execution character set, 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.
+
+
+
+
+     77) The semantics of these characters were discussed in 5.2.2. If any other character follows a backslash,
+         the result is not a token and a diagnostic is required. See ''future language directions'' (6.11.4).
+
+[page 69]
+
+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 <stddef.h> (7.19), the mbtowc function
+     (7.22.7.2), Unicode utilities <uchar.h> (7.27).
+     6.4.5 String literals
+     Syntax
+1             string-literal:
+                      encoding-prefixopt " s-char-sequenceopt "
+              encoding-prefix:
+                     u8
+                     u
+                     U
+                     L
+              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
+     Constraints
+2    A sequence of adjacent string literal tokens shall not include both a wide string literal and
+     a UTF-8 string literal.
+     Description
+3    A character string literal is a sequence of zero or more multibyte characters enclosed in
+     double-quotes, as in "xyz". A UTF-8 string literal is the same, except prefixed by u8.
+     A wide string literal is the same, except prefixed by the letter L, u, or U.
+4    The same considerations apply to each element of the sequence in a string literal as if it
+     were in an integer character constant (for a character or UTF-8 string literal) or a wide
+     character constant (for a wide string literal), except that the single-quote ' is
+     representable either by itself or by the escape sequence \', but the double-quote " shall
+[page 70]
+
+    be represented by the escape sequence \".
+    Semantics
+5   In translation phase 6, the multibyte character sequences specified by any sequence of
+    adjacent character and identically-prefixed string literal tokens are concatenated into a
+    single multibyte character sequence. If any of the tokens has an encoding prefix, the
+    resulting multibyte character sequence is treated as having the same prefix; otherwise, it
+    is treated as a character string literal. Whether differently-prefixed wide string literal
+    tokens can be concatenated and, if so, the treatment of the resulting multibyte character
+    sequence are implementation-defined.
+6   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.78) 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 UTF-8 string literals, the array elements have type char, and are
+    initialized with the characters of the multibyte character sequence, as encoded in UTF-8.
+    For wide string literals prefixed by the letter L, the array elements have type wchar_t
+    and are initialized with the sequence of wide characters corresponding to the multibyte
+    character sequence, as defined by the mbstowcs function with an implementation-
+    defined current locale. For wide string literals prefixed by the letter u or U, the array
+    elements have type char16_t or char32_t, respectively, and are initialized with the
+    sequence of wide characters corresponding to the multibyte character sequence, as
+    defined by successive calls to the mbrtoc16, or mbrtoc32 function as appropriate for
+    its type, 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.
+7   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.
+8   EXAMPLE 1      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.
+
+9   EXAMPLE 2      Each of the sequences of adjacent string literal tokens
+
+
+
+    78) A string literal need not be a string (see 7.1.1), because a null character may be embedded in it by a
+        \0 escape sequence.
+
+[page 71]
+
+             "a" "b" L"c"
+             "a" L"b" "c"
+             L"a" "b" L"c"
+             L"a" L"b" L"c"
+    is equivalent to the string literal
+             L"abc"
+    Likewise, each of the sequences
+             "a" "b" u"c"
+             "a" u"b" "c"
+             u"a" "b" u"c"
+             u"a" u"b" u"c"
+    is equivalent to
+             u"abc"
+
+    Forward references: common definitions <stddef.h> (7.19), the mbstowcs
+    function (7.22.8.1), Unicode utilities <uchar.h> (7.27).
+    6.4.6 Punctuators
+    Syntax
+1            punctuator: one of
+                    [ ] ( ) { } . ->
+                    ++ -- & * + - ~ !
+                    / % << >> < > <= >=                         ==    !=    ^    |   &&   ||
+                    ? : ; ...
+                    = *= /= %= += -= <<=                        >>=    &=       ^=   |=
+                    , # ##
+                    <: :> <% %> %: %:%:
+    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.
+
+
+
+
+[page 72]
+
+3   In all aspects of the language, the six tokens79)
+             <:    :>      <%    %>     %:     %:%:
+    behave, respectively, the same as the six tokens
+             [     ]       {     }      #      ##
+    except for their spelling.80)
+    Forward references: expressions (6.5), declarations (6.7), preprocessing directives
+    (6.10), statements (6.8).
+    6.4.7 Header names
+    Syntax
+1            header-name:
+                    < h-char-sequence >
+                    " 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 >
+             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 6.10.2.
+3   If the characters ', \, ", //, or /* occur in the sequence between the < and > delimiters,
+    the behavior is undefined. Similarly, if the characters ', \, //, or /* occur in the
+
+
+
+
+    79) These tokens are sometimes called ''digraphs''.
+    80) Thus [ and <: behave differently when ''stringized'' (see 6.10.3.2), but can otherwise be freely
+        interchanged.
+
+[page 73]
+
+    sequence between the " delimiters, the behavior is undefined.81) Header name
+    preprocessing tokens are recognized only within #include preprocessing directives and
+    in implementation-defined locations within #pragma directives.82)
+4   EXAMPLE       The following sequence of characters:
+             0x3<1/a.h>1e2
+             #include <1/a.h>
+             #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}{<}{1}{/}{a}{.}{h}{>}{1e2}
+             {#}{include} {<1/a.h>}
+             {#}{define} {const}{.}{member}{@}{$}
+
+    Forward references: source file inclusion (6.10.2).
+    6.4.8 Preprocessing numbers
+    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.
+
+
+    81) Thus, sequences of characters that resemble escape sequences cause undefined behavior.
+    82) For an example of a header name preprocessing token used in a #pragma directive, see 6.10.9.
+
+[page 74]
+
+    6.4.9 Comments
+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.83)
+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;
+
+
+
+
+    83) Thus, /* ... */ comments do not nest.
+
+[page 75]
+
+    6.5 Expressions
+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. The value computations of the operands of an operator
+    are sequenced before the value computation of the result of the operator.
+2   If a side effect on a scalar object is unsequenced relative to either a different side effect
+    on the same scalar object or a value computation using the value of the same scalar
+    object, the behavior is undefined. If there are multiple allowable orderings of the
+    subexpressions of an expression, the behavior is undefined if such an unsequenced side
+    effect occurs in any of the orderings.84)
+3   The grouping of operators and operands is indicated by the syntax.85) Except as specified
+    later, side effects and value computations of subexpressions are unsequenced.86)         *
+4   Some operators (the unary operator ~, and the binary operators <<, >>, &, ^, 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.
+
+
+
+    84) This paragraph renders undefined statement expressions such as
+                  i = ++i + 1;
+                  a[i++] = i;
+         while allowing
+                  i = i + 1;
+                  a[i] = i;
+
+    85) 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 (6.5.6) are those expressions defined in
+        6.5.1 through 6.5.6. The exceptions are cast expressions (6.5.4) as operands of unary operators
+        (6.5.3), and an operand contained between any of the following pairs of operators: grouping
+        parentheses () (6.5.1), subscripting brackets [] (6.5.2.1), function-call parentheses () (6.5.2.2), and
+        the conditional operator ? : (6.5.15).
+         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.
+    86) In an expression that is evaluated more than once during the execution of a program, unsequenced and
+        indeterminately sequenced evaluations of its subexpressions need not be performed consistently in
+        different evaluations.
+
+[page 76]
+
+6   The effective type of an object for an access to its stored value is the declared type of the
+    object, if any.87) 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
+    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:88)
+    -- 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 a single
+    operation, thereby omitting rounding errors implied by the source code and the
+    expression evaluation method.89) The FP_CONTRACT pragma in <math.h> provides a
+    way to disallow contracted expressions. Otherwise, whether and how expressions are
+    contracted is implementation-defined.90)
+    Forward references: the FP_CONTRACT pragma (7.12.2), copying functions (7.23.2).
+
+
+    87) Allocated objects have no declared type.
+    88) The intent of this list is to specify those circumstances in which an object may or may not be aliased.
+    89) The intermediate operations in the contracted expression are evaluated as if to infinite precision and
+        range, while the final operation is rounded to the format determined by the expression evaluation
+        method. A contracted expression might also omit the raising of floating-point exceptions.
+    90) 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.
+
+[page 77]
+
+    6.5.1 Primary expressions
+    Syntax
+1            primary-expression:
+                    identifier
+                    constant
+                    string-literal
+                    ( expression )
+                    generic-selection
+    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).91)
+3   A constant is a primary expression. Its type depends on its form and value, as detailed in
+    6.4.4.
+4   A string literal is a primary expression. It is an lvalue with type as detailed in 6.4.5.
+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 (6.7).
+    6.5.1.1 Generic selection
+    Syntax
+1            generic-selection:
+                    _Generic ( assignment-expression , generic-assoc-list )
+             generic-assoc-list:
+                    generic-association
+                    generic-assoc-list , generic-association
+             generic-association:
+                    type-name : assignment-expression
+                    default : assignment-expression
+    Constraints
+2   A generic selection shall have no more than one default generic association. The type
+    name in a generic association shall specify a complete object type other than a variably
+
+    91) Thus, an undeclared identifier is a violation of the syntax.
+
+[page 78]
+
+    modified type. No two generic associations in the same generic selection shall specify
+    compatible types. The controlling expression of a generic selection shall have type
+    compatible with at most one of the types named in its generic association list. If a
+    generic selection has no default generic association, its controlling expression shall
+    have type compatible with exactly one of the types named in its generic association list.
+    Semantics
+3   The controlling expression of a generic selection is not evaluated. If a generic selection
+    has a generic association with a type name that is compatible with the type of the
+    controlling expression, then the result expression of the generic selection is the
+    expression in that generic association. Otherwise, the result expression of the generic
+    selection is the expression in the default generic association. None of the expressions
+    from any other generic association of the generic selection is evaluated.
+4   The type and value of a generic selection are identical to those of its result expression. It
+    is an lvalue, a function designator, or a void expression if its result expression is,
+    respectively, an lvalue, a function designator, or a void expression.
+5   EXAMPLE      The cbrt type-generic macro could be implemented as follows:
+             #define cbrt(X) _Generic((X),                                      \
+                                     long double: cbrtl,                        \
+                                     default: cbrt,                             \
+                                     float: cbrtf                               \
+                                     )(X)
+
+    6.5.2 Postfix operators
+    Syntax
+1            postfix-expression:
+                    primary-expression
+                    postfix-expression [ expression ]
+                    postfix-expression ( argument-expression-listopt )
+                    postfix-expression . identifier
+                    postfix-expression -> identifier
+                    postfix-expression ++
+                    postfix-expression --
+                    ( type-name ) { initializer-list }
+                    ( type-name ) { initializer-list , }
+             argument-expression-list:
+                   assignment-expression
+                   argument-expression-list , assignment-expression
+
+
+
+
+[page 79]
+
+    6.5.2.1 Array subscripting
+    Constraints
+1   One of the expressions shall have type ''pointer to complete 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 >= 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 referenced (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 (6.5.6), address and indirection operators
+    (6.5.3.2), array declarators (6.7.6.2).
+    6.5.2.2 Function calls
+    Constraints
+1   The expression that denotes the called function92) shall have type pointer to function
+    returning void or returning a complete 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
+
+
+    92) Most often, this is the result of converting an identifier that is a function designator.
+
+[page 80]
+
+    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 complete 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.93)
+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 6.8.6.4. Otherwise, the function call has type void.         *
+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:
+    -- 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.
+
+
+
+    93) 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 6.9.1.
+
+[page 81]
+
+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   There is a sequence point after the evaluations of the function designator and the actual
+     arguments but before the actual call. Every evaluation in the calling function (including
+     other function calls) that is not otherwise specifically sequenced before or after the
+     execution of the body of the called function is indeterminately sequenced with respect to
+     the execution of the called function.94)
+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) (6.7.6.3), function
+     definitions (6.9.1), the return statement (6.8.6.4), simple assignment (6.5.16.1).
+     6.5.2.3 Structure and union members
+     Constraints
+1    The first operand of the . operator shall have an atomic, qualified, or unqualified
+     structure or union type, and the second operand shall name a member of that type.
+2    The first operand of the -> operator shall have type ''pointer to atomic, qualified, or
+     unqualified structure'' or ''pointer to atomic, qualified, or unqualified union'', and the
+     second operand shall name a member of the type pointed to.
+     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,95) 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.
+
+     94) In other words, function executions do not ''interleave'' with each other.
+     95) If the member used to read 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 6.2.6 (a process sometimes called ''type
+         punning''). This might be a trap representation.
+
+[page 82]
+
+4   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 of the object to
+    which the first expression points, and is an lvalue.96) 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   Accessing a member of an atomic structure or union object results in undefined
+    behavior.97)
+6   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 completed 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.
+7   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.
+
+8   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
+
+
+
+
+    96) If &E is a valid pointer expression (where & is the ''address-of '' operator, which generates a pointer to
+        its operand), the expression (&E)->MOS is the same as E.MOS.
+    97) For example, a data race would occur if access to the entire structure or union in one thread conflicts
+        with access to a member from another thread, where at least one access is a modification. Members
+        can be safely accessed using a non-atomic object which is assigned to or from the atomic object.
+
+[page 83]
+
+9   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 = 3.14;
+             /* ... */
+             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->m < 0)
+                           p2->m = -p2->m;
+                   return p1->m;
+             }
+             int g()
+             {
+                   union {
+                           struct t1 s1;
+                           struct t2 s2;
+                   } u;
+                   /* ... */
+                   return f(&u.s1, &u.s2);
+             }
+
+    Forward references: address and indirection operators (6.5.3.2), structure and union
+    specifiers (6.7.2.1).
+
+
+
+
+[page 84]
+
+    6.5.2.4 Postfix increment and decrement operators
+    Constraints
+1   The operand of the postfix increment or decrement operator shall have atomic, 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. As a side effect, the
+    value of the operand object 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 value computation of the result is sequenced before the side effect of
+    updating the stored value of the operand. With respect to an indeterminately-sequenced
+    function call, the operation of postfix ++ is a single evaluation. Postfix ++ on an object
+    with atomic type is a read-modify-write operation with memory_order_seq_cst
+    memory order semantics.98)
+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 (6.5.6), compound assignment (6.5.16.2).
+    6.5.2.5 Compound literals
+    Constraints
+1   The type name shall specify a complete object type or an array of unknown size, but not a
+    variable length array type.
+2   All the constraints for initializer lists in 6.7.9 also apply to compound literals.
+    Semantics
+3   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.99)
+
+
+    98) Where a pointer to an atomic object can be formed, this is equivalent to the following code sequence
+        where T is the type of E:
+                 T tmp;
+                 T result = E;
+                 do {
+                        tmp = result + 1;
+                 } while (!atomic_compare_exchange_strong(&E, &result, tmp));
+         with result being the result of the operation.
+
+[page 85]
+
+4    If the type name specifies an array of unknown size, the size is determined by the
+     initializer list as specified in 6.7.9, 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.
+5    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.
+6    All the semantic rules for initializer lists in 6.7.9 also apply to compound literals.100)
+7    String literals, and compound literals with const-qualified types, need not designate
+     distinct objects.101)
+8    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.
+
+9    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.
+
+10   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:
+
+
+
+     99) 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.
+     100) For example, subobjects without explicit initializers are initialized to zero.
+     101) This allows implementations to share storage for string literals and constant compound literals with
+          the same or overlapping representations.
+
+[page 86]
+
+              drawline(&(struct point){.x=1, .y=1},
+                    &(struct point){.x=3, .y=4});
+
+11   EXAMPLE 4        A read-only compound literal can be specified through constructions like:
+              (const float []){1e0, 1e1, 1e2, 1e3, 1e4, 1e5, 1e6}
+
+12   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.
+
+13   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.
+
+14   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, &endless_zeros};
+              eval(endless_zeros);
+
+15   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 = &((struct s){ j++ });
+                        if (j < 2) goto again;
+                        return p == q && q->i == 1;
+              }
+     The function f() always returns the value 1.
+16   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 (6.7.7), initialization (6.7.9).
+
+
+
+
+[page 87]
+
+    6.5.3 Unary operators
+    Syntax
+1            unary-expression:
+                    postfix-expression
+                    ++ unary-expression
+                    -- unary-expression
+                    unary-operator cast-expression
+                    sizeof unary-expression
+                    sizeof ( type-name )
+                    alignof ( type-name )
+             unary-operator: one of
+                    & * + - ~             !
+    6.5.3.1 Prefix increment and decrement operators
+    Constraints
+1   The operand of the prefix increment or decrement operator shall have atomic, 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 (6.5.6), compound assignment (6.5.16.2).
+    6.5.3.2 Address and indirection operators
+    Constraints
+1   The operand of the unary & 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 & 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 & 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
+
+[page 88]
+
+    lvalue. Similarly, if the operand is the result of a [] operator, neither the & operator nor
+    the unary * that is implied by the [] is evaluated and the result is as if the & 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.102)
+    Forward references: storage-class specifiers (6.7.1), structure and union specifiers
+    (6.7.2.1).
+    6.5.3.3 Unary arithmetic operators
+    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).
+
+
+
+    102) Thus, &*E is equivalent to E (even if E is a null pointer), and &(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 &
+         operator, *&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.
+
+[page 89]
+
+    6.5.3.4 The sizeof and alignof operators
+    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. The alignof operator shall not be applied to a function
+    type or an incomplete type.
+    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   The alignof operator yields the alignment requirement of its operand type. The result
+    is an integer constant. When applied to an array type, the result is the alignment
+    requirement of the element type.
+4   When sizeof is 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.103) 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.
+5   The value of the result of both operators is implementation-defined, and its type (an
+    unsigned integer type) is size_t, defined in <stddef.h> (and other headers).
+6   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.
+
+7   EXAMPLE 2      Another use of the sizeof operator is to compute the number of elements in an array:
+            sizeof array / sizeof array[0]
+
+8   EXAMPLE 3      In this example, the size of a variable length array is computed and returned from a
+    function:
+            #include <stddef.h>
+
+
+
+    103) When applied to a parameter declared to have array or function type, the sizeof operator yields the
+         size of the adjusted (pointer) type (see 6.9.1).
+
+[page 90]
+
+             size_t fsize3(int n)
+             {
+                   char b[n+3];                  // variable length array
+                   return sizeof b;              // execution time sizeof
+             }
+             int main()
+             {
+                   size_t size;
+                   size = fsize3(10); // fsize3 returns 13
+                   return 0;
+             }
+
+    Forward references: common definitions <stddef.h> (7.19), declarations (6.7),
+    structure and union specifiers (6.7.2.1), type names (6.7.7), array declarators (6.7.6.2).
+    6.5.4 Cast operators
+    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 atomic, 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
+    6.5.16.1, shall be specified by means of an explicit cast.
+4   A pointer type shall not be converted to any floating type. A floating type shall not be
+    converted to any pointer type.
+    Semantics
+5   Preceding an expression by a parenthesized type name converts the value of the
+    expression to the named type. This construction is called a cast.104) A cast that specifies
+    no conversion has no effect on the type or value of an expression.
+6   If the value of the expression is represented with greater precision or range than required
+    by the type named by the cast (6.3.1.8), then the cast specifies a conversion even if the
+    type of the expression is the same as the named type and removes any extra range and
+    precision.
+    Forward references: equality operators (6.5.9), function declarators (including
+    prototypes) (6.7.6.3), simple assignment (6.5.16.1), type names (6.7.7).
+
+    104) 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.
+
+[page 91]
+
+    6.5.5 Multiplicative operators
+    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.105) If the quotient a/b is representable, the expression
+    (a/b)*b + a%b shall equal a; otherwise, the behavior of both a/b and a%b is
+    undefined.
+    6.5.6 Additive operators
+    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 a complete object type and the other shall have integer type. (Incrementing is
+    equivalent to adding 1.)
+3   For subtraction, one of the following shall hold:
+
+
+
+
+    105) This is often called ''truncation toward zero''.
+
+[page 92]
+
+    -- both operands have arithmetic type;
+    -- both operands are pointers to qualified or unqualified versions of compatible complete
+      object types; or
+    -- the left operand is a pointer to a complete 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 <stddef.h> 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
+
+[page 93]
+
+     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
+     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.106)
+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 == &a[0]
+                       p += 1;                     //   p == &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 (6.7.6.2), common definitions <stddef.h>
+     (7.19).
+     6.5.7 Bitwise shift operators
+     Syntax
+1             shift-expression:
+                      additive-expression
+                      shift-expression << additive-expression
+                      shift-expression >> 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
+
+     106) 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.
+
+[page 94]
+
+    greater than or equal to the width of the promoted left operand, the behavior is undefined.
+4   The result of E1 << 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 >> 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.
+    6.5.8 Relational operators
+    Syntax
+1            relational-expression:
+                     shift-expression
+                     relational-expression   <    shift-expression
+                     relational-expression   >    shift-expression
+                     relational-expression   <=   shift-expression
+                     relational-expression   >=   shift-expression
+    Constraints
+2   One of the following shall hold:
+    -- both operands have real type; or                                                            *
+    -- both operands are pointers to qualified or unqualified versions of compatible object
+      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 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
+    values compare greater than pointers to elements of the same array with lower subscript
+
+[page 95]
+
+    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 < (less than), > (greater than), <= (less than or equal to), and >=
+    (greater than or equal to) shall yield 1 if the specified relation is true and 0 if it is
+    false.107) The result has type int.
+    6.5.9 Equality operators
+    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 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.108) 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.
+
+
+
+    107) The expression a<b<c is not interpreted as in ordinary mathematics. As the syntax indicates, it
+         means (a<b)<c; in other words, ''if a is less than b, compare 1 to c; otherwise, compare 0 to c''.
+    108) Because of the precedences, a<b == c<d is 1 whenever a<b and c<d have the same truth-value.
+
+[page 96]
+
+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 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.109)
+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.
+    6.5.10 Bitwise AND operator
+    Syntax
+1            AND-expression:
+                   equality-expression
+                   AND-expression & 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 & 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).
+
+
+
+
+    109) 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.
+
+[page 97]
+
+    6.5.11 Bitwise exclusive OR operator
+    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).
+    6.5.12 Bitwise inclusive OR operator
+    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).
+
+
+
+
+[page 98]
+
+    6.5.13 Logical AND operator
+    Syntax
+1            logical-AND-expression:
+                     inclusive-OR-expression
+                     logical-AND-expression && inclusive-OR-expression
+    Constraints
+2   Each of the operands shall have scalar type.
+    Semantics
+3   The && 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 & operator, the && operator guarantees left-to-right evaluation;
+    if the second operand is evaluated, there is a sequence point between the evaluations of
+    the first and second operands. If the first operand compares equal to 0, the second
+    operand is not evaluated.
+    6.5.14 Logical OR operator
+    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; if the
+    second operand is evaluated, there is a sequence point between the evaluations of the first
+    and second operands. If the first operand compares unequal to 0, the second operand is
+    not evaluated.
+
+
+
+
+[page 99]
+
+    6.5.15 Conditional operator
+    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 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 between its evaluation and the
+    evaluation of the second or third operand (whichever is evaluated). 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.110)                        *
+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 referenced 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
+    pointer to an appropriately qualified version of void.
+
+    110) A conditional expression does not yield an lvalue.
+
+[page 100]
+
+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 *
+
+    6.5.16 Assignment operators
+    Syntax
+1            assignment-expression:
+                    conditional-expression
+                    unary-expression assignment-operator assignment-expression
+             assignment-operator: one of
+                    = *= /= %= +=                       -=     <<=      >>=      &=     ^=     |=
+    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,111) but is not
+    an lvalue. The type of an assignment expression is the type the left operand would have
+    after lvalue conversion. The side effect of updating the stored value of the left operand is
+    sequenced after the value computations of the left and right operands. The evaluations of
+    the operands are unsequenced.
+
+
+
+
+    111) The implementation is permitted to read the object to determine the value but is not required to, even
+         when the object has volatile-qualified type.
+
+[page 101]
+
+    6.5.16.1 Simple assignment
+    Constraints
+1   One of the following shall hold:112)
+    -- the left operand has atomic, qualified, or unqualified arithmetic type, and the right has
+      arithmetic type;
+    -- the left operand has an atomic, qualified, or unqualified version of a structure or union
+      type compatible with the type of the right;
+    -- the left operand has atomic, qualified, or unqualified pointer type, and (considering
+      the type the left operand would have after lvalue conversion) 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;
+    -- the left operand has atomic, qualified, or unqualified pointer type, and (considering
+      the type the left operand would have after lvalue conversion) one operand is a pointer
+      to an object 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 an atomic, qualified, or unqualified pointer, and the right is a null
+      pointer constant; or
+    -- the left operand has type atomic, qualified, or unqualified _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
+
+
+
+
+    112) The asymmetric appearance of these constraints with respect to type qualifiers is due to the conversion
+         (specified in 6.3.2.1) 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).
+
+[page 102]
+
+            int f(void);
+            char c;
+            /* ... */
+            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
+    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 = &p;                  // constraint violation
+            *cpp = &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.
+
+    6.5.16.2 Compound assignment
+    Constraints
+1   For the operators += and -= only, either the left operand shall be an atomic, qualified, or
+    unqualified pointer to a complete object type, and the right shall have integer type; or the
+    left operand shall have atomic, qualified, or unqualified arithmetic type, and the right
+    shall have arithmetic type.
+2   For the other operators, the left operand shall have atomic, qualified, or unqualified
+    arithmetic type, and (considering the type the left operand would have after lvalue
+    conversion) 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 is equivalent to the simple assignment
+    expression E1 = E1 op (E2), except that the lvalue E1 is evaluated only once, and with
+    respect to an indeterminately-sequenced function call, the operation of a compound
+[page 103]
+
+    assignment is a single evaluation. If E1 has an atomic type, compound assignment is a
+    read-modify-write operation with memory_order_seq_cst memory order
+    semantics.113)
+    6.5.17 Comma operator
+    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 between its evaluation and that of the right operand. Then the right
+    operand is evaluated; the result has its type and value.114)                        *
+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 (6.7.9).
+
+
+
+
+    113) Where a pointer to an atomic object can be formed, this is equivalent to the following code sequence
+         where T is the type of E1:
+                  T tmp = E1;
+                  T result;
+                  do {
+                        result = tmp op (E2);
+                  } while (!atomic_compare_exchange_strong(&E1, &tmp, result));
+          with result being the result of the operation.
+    114) A comma operator does not yield an lvalue.
+
+[page 104]
+
+    6.6 Constant expressions
+    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.115)
+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.116)
+6   An integer constant expression117) 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,
+
+
+
+    115) The operand of a sizeof operator is usually not evaluated (6.5.3.4).
+    116) The use of evaluation formats as characterized by FLT_EVAL_METHOD also applies to evaluation in
+         the translation environment.
+    117) An integer constant expression is required in a number of contexts such as the size of a bit-field
+         member of a structure, the value of an enumeration constant, and the size of a non-variable length
+         array. Further constraints that apply to the integer constant expressions used in conditional-inclusion
+         preprocessing directives are discussed in 6.10.1.
+
+[page 105]
+
+     -- a null pointer constant,
+     -- an address constant, or
+     -- an address constant for a complete 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 & 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 -> operators, the address & 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.118)
+     Forward references: array declarators (6.7.6.2), initialization (6.7.9).
+
+
+
+
+     118) Thus, in the following initialization,
+                    static int i = 2 || 1 / 0;
+           the expression is a valid integer constant expression with value one.
+
+[page 106]
+
+    6.7 Declarations
+    Syntax
+1            declaration:
+                    declaration-specifiers init-declarator-listopt ;
+                    static_assert-declaration
+             declaration-specifiers:
+                    storage-class-specifier declaration-specifiersopt
+                    type-specifier declaration-specifiersopt
+                    type-qualifier declaration-specifiersopt
+                    function-specifier declaration-specifiersopt
+                    alignment-specifier declaration-specifiersopt
+             init-declarator-list:
+                     init-declarator
+                     init-declarator-list , init-declarator
+             init-declarator:
+                     declarator
+                     declarator = initializer
+    Constraints
+2   A declaration other than a static_assert 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
+    that a typedef name can be redefined to denote the same type as it currently does and tags
+    may be redeclared as specified in 6.7.2.3.
+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;119)
+
+
+
+    119) Function definitions have a different syntax, described in 6.9.1.
+
+[page 107]
+
+    -- 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
+    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 6.7.6.3) that is required to be complete.
+    Forward references: declarators (6.7.6), enumeration specifiers (6.7.2.2), initialization
+    (6.7.9), type names (6.7.7), type qualifiers (6.7.3).
+    6.7.1 Storage-class specifiers
+    Syntax
+1            storage-class-specifier:
+                    typedef
+                    extern
+                    static
+                    _Thread_local
+                    auto
+                    register
+    Constraints
+2   At most, one storage-class specifier may be given in the declaration specifiers in a
+    declaration, except that _Thread_local may appear with static or extern.120)
+3   In the declaration of an object with block scope, if the declaration specifiers include
+    _Thread_local, they shall also include either static or extern. If
+    _Thread_local appears in any declaration of an object, it shall be present in every
+    declaration of that object.
+    Semantics
+4   The typedef specifier is called a ''storage-class specifier'' for syntactic convenience
+    only; it is discussed in 6.7.8. The meanings of the various linkages and storage durations
+    were discussed in 6.2.2 and 6.2.4.
+
+
+
+    120) See ''future language directions'' (6.11.5).
+
+[page 108]
+
+5   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.121)
+6   The declaration of an identifier for a function that has block scope shall have no explicit
+    storage-class specifier other than extern.
+7   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 (6.7.8).
+    6.7.2 Type specifiers
+    Syntax
+1            type-specifier:
+                    void
+                    char
+                    short
+                    int
+                    long
+                    float
+                    double
+                    signed
+                    unsigned
+                    _Bool
+                    _Complex
+                    atomic-type-specifier
+                    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
+
+
+    121) 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 &
+         operator as discussed in 6.5.3.2) or implicitly (by converting an array name to a pointer as discussed in
+         6.3.2.1). Thus, the only operator that can be applied to an array declared with storage-class specifier
+         register is sizeof.
+
+[page 109]
+
+    type specifiers shall be one of the following multisets (delimited by commas, when there
+    is more than one multiset per item); 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
+    -- 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
+    -- atomic type specifier
+    -- struct or union specifier
+    -- enum specifier
+    -- typedef name
+3   The type specifier _Complex shall not be used if the implementation does not support
+    complex types (see 6.10.8.3).
+
+
+
+
+[page 110]
+
+    Semantics
+4   Specifiers for structures, unions, enumerations, and atomic types are discussed in 6.7.2.1
+    through 6.7.2.4. Declarations of typedef names are discussed in 6.7.8. The
+    characteristics of the other types are discussed in 6.2.5.
+5   Each of the comma-separated multisets 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: atomic type specifiers (6.7.2.4), enumeration specifiers (6.7.2.2),
+    structure and union specifiers (6.7.2.1), tags (6.7.2.3), type definitions (6.7.8).
+    6.7.2.1 Structure and union specifiers
+    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-listopt ;
+                     static_assert-declaration
+             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 struct-declaration that does not declare an anonymous structure or anonymous union
+    shall contain a struct-declarator-list.
+
+
+[page 111]
+
+3    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.
+4    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.122) If the value is
+     zero, the declaration shall have no declarator.
+5    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. It is
+     implementation-defined whether atomic types are permitted.
+     Semantics
+6    As discussed in 6.2.5, 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.
+7    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.
+8    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, no anonymous structures, and no anonymous unions, the behavior is undefined.
+     The type is incomplete until immediately after the } that terminates the list, and complete
+     thereafter.
+9    A member of a structure or union may have any complete object type other than a
+     variably modified type.123) 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;124) its width is preceded by a colon.
+10   A bit-field is interpreted as having a signed or unsigned integer type consisting of the
+     specified number of bits.125) If the value 0 or 1 is stored into a nonzero-width bit-field of
+
+     122) While the number of bits in a _Bool object is at least CHAR_BIT, the width (number of sign and
+          value bits) of a _Bool may be just 1 bit.
+     123) A structure or union cannot contain a member with a variably modified type because member names
+          are not ordinary identifiers as defined in 6.2.3.
+     124) The unary & (address-of) operator cannot be applied to a bit-field object; thus, there are no pointers to
+          or arrays of bit-field objects.
+
+[page 112]
+
+     type _Bool, the value of the bit-field shall compare equal to the value stored; a _Bool
+     bit-field has the semantics of a _Bool.
+11   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.
+12   A bit-field declaration with no declarator, but only a colon and a width, indicates an
+     unnamed bit-field.126) 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.
+13   An unnamed member of structure type with no tag is called an anonymous structure; an
+     unnamed member of union type with no tag is called an anonymous union. The members
+     of an anonymous structure or union are considered to be members of the containing
+     structure or union. This applies recursively if the containing structure or union is also
+     anonymous.
+14   Each non-bit-field member of a structure or union object is aligned in an implementation-
+     defined manner appropriate to its type.
+15   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.
+16   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.
+17   There may be unnamed padding at the end of a structure or union.
+18   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,
+
+
+     125) As specified in 6.7.2 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.
+     126) An unnamed bit-field structure member is useful for padding to conform to externally imposed
+          layouts.
+
+[page 113]
+
+     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 ->) 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.
+19   EXAMPLE 1       The following illustrates anonymous structures and unions:
+              struct v {
+                    union {      // anonymous union
+                           struct { int i, j; };    // anonymous structure
+                           struct { long k, l; } w;
+                    };
+                    int m;
+              } v1;
+              v1.i = 2;   // valid
+              v1.k = 3;   // invalid: inner structure is not anonymous
+              v1.w.k = 5; // valid
+
+20   EXAMPLE 2       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).
+21   Following the above declaration:
+              struct s t1 = { 0 };                         //   valid
+              struct s t2 = { 1, { 4.2 }};                 //   invalid
+              t1.n = 4;                                    //   valid
+              t1.d[0] = 4.2;                               //   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) >= offsetof(struct s, d) + sizeof (double)
+     in which case the assignment would be legitimate. Nevertheless, it cannot appear in strictly conforming
+     code.
+
+[page 114]
+
+22   After the further declaration:
+              struct ss { int n; };
+     the expressions:
+              sizeof (struct s) >= sizeof (struct ss)
+              sizeof (struct s) >= offsetof(struct s, d)
+     are always equal to 1.
+23   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;
+24   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 = &(s1->d[0]);          //   valid
+              *dp = 42;                  //   valid
+              dp = &(s2->d[0]);          //   valid
+              *dp = 42;                  //   undefined behavior
+25   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: declarators (6.7.6), tags (6.7.2.3).
+
+
+
+
+[page 115]
+
+    6.7.2.2 Enumeration specifiers
+    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.127) 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,128) but shall be
+    capable of representing the values of all the members of the enumeration. The
+    enumerated type is incomplete until immediately after the } that terminates the list of
+    enumerator declarations, and complete thereafter.
+
+
+
+
+    127) 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.
+    128) An implementation may delay the choice of which integer type until all enumeration constants have
+         been seen.
+
+[page 116]
+
+5   EXAMPLE       The following fragment:
+             enum hue { chartreuse, burgundy, claret=20, winedark };
+             enum hue col, *cp;
+             col = claret;
+             cp = &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 (6.7.2.3).
+    6.7.2.3 Tags
+    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. Irrespective of whether there is a tag or what
+    other declarations of the type are in the same translation unit, the type is incomplete129)
+    until immediately after 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
+
+
+
+
+    129) 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 6.2.5.) The specification has to be complete before such a function is called or defined.
+
+[page 117]
+
+              struct-or-union identifieropt { struct-declaration-list }
+     or
+              enum identifieropt { enumerator-list }
+     or
+              enum identifieropt { enumerator-list , }
+     declares a structure, union, or enumerated type. The list defines the structure content,
+     union content, or enumeration content. If an identifier is provided,130) 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.131)
+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.131)
+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
+
+
+
+
+     130) 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.
+     131) A similar construction with enum does not exist.
+
+[page 118]
+
+              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->left refers to the left struct tnode pointer of the object to
+     which sp points; the expression s.right->count designates the count member of the right struct
+     tnode pointed to from s.
+11   The following alternative formulation uses the typedef mechanism:
+              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 (6.7.6), type definitions (6.7.8).
+     6.7.2.4 Atomic type specifiers
+     Syntax
+1             atomic-type-specifier:
+                     _Atomic ( type-name )
+     Constraints
+2    Atomic type specifiers shall not be used if the implementation does not support atomic
+     types (see 6.10.8.3).
+3    The type name in an atomic type specifier shall not refer to an array type, a function type,
+     an atomic type, or a qualified type.
+     Semantics
+4    The properties associated with atomic types are meaningful only for expressions that are
+     lvalues. If the _Atomic keyword is immediately followed by a left parenthesis, it is
+     interpreted as a type specifier (with a type name), not as a type qualifier.
+
+
+
+
+[page 119]
+
+    6.7.3 Type qualifiers
+    Syntax
+1            type-qualifier:
+                    const
+                    restrict
+                    volatile
+                    _Atomic
+    Constraints
+2   Types other than pointer types whose referenced type is an object type shall not be
+    restrict-qualified.
+3   The type modified by the _Atomic qualifier shall not be an array type or a function
+    type.
+    Semantics
+4   The properties associated with qualified types are meaningful only for expressions that
+    are lvalues.132)
+5   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. If other qualifiers appear along with the _Atomic qualifier in a specifier-qualifier-
+    list, the resulting type is the so-qualified atomic type.
+6   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.133)
+7   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 5.1.2.3. 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
+
+
+
+
+    132) 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.
+    133) 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).
+
+[page 120]
+
+     unknown factors mentioned previously.134) What constitutes an access to an object that
+     has volatile-qualified type is implementation-defined.
+8    An object that is accessed through a restrict-qualified pointer has a special association
+     with that pointer. This association, defined in 6.7.3.1 below, requires that all accesses to
+     that object use, directly or indirectly, the value of that particular pointer.135) 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).
+9    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.136)
+10   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.
+11   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.
+
+12   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 = &ncs.mem;       //    valid
+              pi = &cs.mem;        //    violates type constraints for =
+              pci = &cs.mem;       //    valid
+              pi = a[0];           //    invalid: a[0] has type ''const int *''
+
+
+
+     134) 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.
+     135) 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.
+     136) Both of these can occur through the use of typedefs.
+
+[page 121]
+
+13   EXAMPLE 3       The declaration
+              _Atomic volatile int *p;
+     specifies that p has the type ''pointer to volatile atomic int'', a pointer to a volatile-qualified atomic type.
+
+     6.7.3.1 Formal definition of restrict
+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.137)
+     Note that ''based'' is defined only for expressions with pointer types.
+4    During each execution of B, let L be any lvalue that has &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
+     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.
+
+
+     137) 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.
+
+[page 122]
+
+8    EXAMPLE 2       The function parameter declarations in the following example
+             void f(int n, int * restrict p, int * restrict q)
+             {
+                   while (n-- > 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 < 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.
+             {
+                      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
+                      }
+             }
+
+
+
+
+[page 123]
+
+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;
+              }
+
+     6.7.4 Function specifiers
+     Syntax
+1             function-specifier:
+                     inline
+                     _Noreturn
+     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 or thread storage duration, and shall not contain a reference
+     to an identifier with internal linkage.
+4    In a hosted environment, no function specifier(s) shall appear in a declaration of main.
+     Semantics
+5    A function specifier may appear more than once; the behavior is the same as if it
+     appeared only once.
+6    A function declared with an inline function specifier is an inline function. Making a *
+     function an inline function suggests that calls to the function be as fast as possible.138)
+     The extent to which such suggestions are effective is implementation-defined.139)
+
+
+
+
+     138) 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.
+     139) For example, an implementation might never perform inline substitution, or might only perform inline
+          substitutions to calls in the scope of an inline declaration.
+
+[page 124]
+
+7    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
+     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.140)
+8    A function declared with a _Noreturn function specifier shall not return to its caller.
+     Recommended practice
+9    The implementation should produce a diagnostic message for a function declared with a
+     _Noreturn function specifier that appears to be capable of returning to its caller.
+10   EXAMPLE 1 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);
+              }
+11   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 6.9); the inline definition and the external
+     definition are distinct and either may be used for the call.
+
+12   EXAMPLE 2
+
+
+
+
+     140) 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.
+
+[page 125]
+
+             _Noreturn void f () {
+                   abort(); // ok
+             }
+             _Noreturn void g (int i) { // causes undefined behavior if i <= 0
+                   if (i > 0) abort();
+             }
+
+    Forward references: function definitions (6.9.1).
+    6.7.5 Alignment specifier
+    Syntax
+1            alignment-specifier:
+                   _Alignas ( type-name )
+                   _Alignas ( constant-expression )
+    Constraints
+2   An alignment attribute shall not be specified in a declaration of a typedef, or a bit-field, or
+    a function, or a parameter, or an object declared with the register storage-class
+    specifier.
+3   The constant expression shall be an integer constant expression. It shall evaluate to a
+    valid fundamental alignment, or to a valid extended alignment supported by the
+    implementation in the context in which it appears, or to zero.
+4   The combined effect of all alignment attributes in a declaration shall not specify an
+    alignment that is less strict than the alignment that would otherwise be required for the
+    type of the object or member being declared.
+    Semantics
+5   The first form is equivalent to _Alignas(alignof(type-name)).
+6   The alignment requirement of the declared object or member is taken to be the specified
+    alignment. An alignment specification of zero has no effect.141) When multiple
+    alignment specifiers occur in a declaration, the effective alignment requirement is the
+    strictest specified alignment.
+7   If the definition of an object has an alignment specifier, any other declaration of that
+    object shall either specify equivalent alignment or have no alignment specifier. If the
+    definition of an object does not have an alignment specifier, any other declaration of that
+    object shall also have no alignment specifier. If declarations of an object in different
+    translation units have different alignment specifiers, the behavior is undefined.
+
+
+
+    141) An alignment specification of zero also does not affect other alignment specifications in the same
+         declaration.
+
+[page 126]
+
+    6.7.6 Declarators
+    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
+[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.
+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 5.2.4.1, an implementation may limit the number of pointer, array, and
+    function declarators that modify an arithmetic, structure, union, or void type, either
+    directly or via one or more typedefs.
+    Forward references: array declarators (6.7.6.2), type definitions (6.7.8).
+    6.7.6.1 Pointer declarators
+    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''.
+
+
+
+
+[page 128]
+
+             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''.
+
+    6.7.6.2 Array declarators
+    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   If an identifier is declared as having a variably modified type, it shall be an ordinary
+    identifier (as defined in 6.2.3), have no linkage, and have either block scope or function
+    prototype scope. If an identifier is declared to be an object with static or thread 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 ''.142)
+    (See 6.7.6.3 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 or type names with function prototype scope;143)
+
+    142) When several ''array of'' specifications are adjacent, a multidimensional array is declared.
+
+[page 129]
+
+    such arrays are nonetheless complete types. If the size is an integer constant expression
+    and the element 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. (Variable length
+    arrays are a conditional feature that implementations need not support; see 6.10.8.3.)
+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
+             }
+
+
+
+
+    143) Thus, * can be used only in function declarations that are not definitions (see 6.7.6.3).
+
+[page 130]
+
+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 _Thread_local, 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] = &B;                   //   valid: q is a static block pointer to VLA
+             }
+
+     Forward references:          function declarators (6.7.6.3), function definitions (6.9.1),
+     initialization (6.7.9).
+     6.7.6.3 Function declarators (including prototypes)
+     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
+
+
+
+
+[page 131]
+
+            D( parameter-type-list )
+     or
+            D( identifier-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 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 6.3.2.1.
+9    If the list terminates with an ellipsis (, ...), no information about the number or types
+     of the parameters after the comma is supplied.144)
+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.145)
+
+
+
+     144) The macros defined in the <stdarg.h> header (7.16) may be used to access arguments that
+          correspond to the ellipsis.
+
+[page 132]
+
+15   For two function types to be compatible, both shall specify compatible return types.146)
+     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
+
+
+     145) See ''future language directions'' (6.11.6).
+     146) If both function types are ''old style'', parameter types are not compared.
+
+[page 133]
+
+     additional arguments of any type.
+
+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, 2.17);
+                     return 0;
+               }
+               void addscalar(int n, int m,
+                     double a[n][n*m+300], double x)
+               {
+                     for (int i = 0; i < n; i++)
+                           for (int j = 0, k = n*m+300; j < 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 (6.9.1), type names (6.7.7).
+
+
+
+
+[page 134]
+
+    6.7.7 Type names
+    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.147)
+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.
+
+
+
+
+    147) 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.
+
+[page 135]
+
+    6.7.8 Type definitions
+    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 6.7.6. 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.
+
+
+
+
+[page 136]
+
+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 < n;               i++)
+                         a[i-1] = b[i];
+             }
+
+
+
+
+[page 137]
+
+    6.7.9 Initialization
+    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 a complete
+    object type that is not a variable length array type.
+4   All the expressions in an initializer for an object that has static or thread 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.
+[page 138]
+
+     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 or thread 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,
+       and any padding is initialized to zero bits;
+     -- if it is a union, the first named member is initialized (recursively) according to these
+       rules, and any padding is initialized to zero bits;
+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 or UTF-8 string
+     literal, optionally enclosed in braces. Successive bytes of the 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 a qualified or unqualified version of
+     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.
+
+
+[page 139]
+
+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
+     members in declaration order, and the first named member of a union.148) 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.149)
+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.150) 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;151)
+     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.
+
+
+
+     148) 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.
+     149) 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.
+     150) 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.
+     151) Any initializer for the subobject which is overridden and so not used to initialize that subobject might
+          not be evaluated at all.
+
+[page 140]
+
+22   If an array of unknown size is initialized, its size is determined by the largest indexed
+     element with an explicit initializer. The array type is completed at the end of its
+     initializer list.
+23   The evaluations of the initialization list expressions are indeterminately sequenced with
+     respect to one another and thus the order in which any side effects occur is
+     unspecified.152)
+24   EXAMPLE 1       Provided that <complex.h> has been #included, the declarations
+              int i = 3.5;
+              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
+
+
+
+     152) In particular, the evaluation order need not be the same as the order of subobject initialization.
+
+[page 141]
+
+     structures: w[0].a[0] is 1 and w[1].a[0] is 2; all the other elements are zero.
+
+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.
+
+[page 142]
+
+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 <stddef.h> (7.19).
+
+
+
+
+[page 143]
+
+    6.7.10 Static assertions
+    Syntax
+1            static_assert-declaration:
+                     _Static_assert ( constant-expression , string-literal ) ;
+    Constraints
+2   The constant expression shall compare unequal to 0.
+    Semantics
+3   The constant expression shall be an integer constant expression. If the value of the
+    constant expression compares unequal to 0, the declaration has no effect. Otherwise, the
+    constraint is violated and the implementation shall produce a diagnostic message that
+    includes the text of the string literal, except that characters not in the basic source
+    character set are not required to appear in the message.
+    Forward references: diagnostics (7.2).
+
+
+
+
+[page 144]
+
+    6.8 Statements and blocks
+    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 that is not part of a compound
+    literal; 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. There is a sequence point between the evaluation of a full expression and the
+    evaluation of the next full expression to be evaluated.
+    Forward references: expression and null statements (6.8.3), selection statements
+    (6.8.4), iteration statements (6.8.5), the return statement (6.8.6.4).
+    6.8.1 Labeled statements
+    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.
+
+[page 145]
+
+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 (6.8.6.1), the switch statement (6.8.4.2).
+    6.8.2 Compound statement
+    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.
+    6.8.3 Expression and null statements
+    Syntax
+1            expression-statement:
+                    expressionopt ;
+    Semantics
+2   The expression in an expression statement is evaluated as a void expression for its side
+    effects.153)
+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);
+
+
+
+    153) Such as assignments, and function calls which have side effects.
+
+[page 146]
+
+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 (6.8.5).
+    6.8.4 Selection statements
+    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.
+    6.8.4.1 The if statement
+    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
+
+
+[page 147]
+
+    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.
+    6.8.4.2 The switch statement
+    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.154)
+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 5.2.4.1, the implementation may limit the number of case values in a
+    switch statement.
+
+
+
+
+    154) 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.
+
+[page 148]
+
+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.
+
+    6.8.5 Iteration statements
+    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.155)
+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.
+6   An iteration statement whose controlling expression is not a constant expression,156) that
+    performs no input/output operations, does not access volatile objects, and performs no
+    synchronization or atomic operations in its body, controlling expression, or (in the case of
+
+    155) 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.
+    156) An omitted controlling expression is replaced by a nonzero constant, which is a constant expression.
+
+[page 149]
+
+    a for statement) its expression-3, may be assumed by the implementation to
+    terminate.157)
+    6.8.5.1 The while statement
+1   The evaluation of the controlling expression takes place before each execution of the loop
+    body.
+    6.8.5.2 The do statement
+1   The evaluation of the controlling expression takes place after each execution of the loop
+    body.
+    6.8.5.3 The for statement
+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.158)
+2   Both clause-1 and expression-3 can be omitted. An omitted expression-2 is replaced by a
+    nonzero constant.
+    6.8.6 Jump statements
+    Syntax
+1            jump-statement:
+                    goto identifier ;
+                    continue ;
+                    break ;
+                    return expressionopt ;
+
+
+
+
+    157) This is intended to allow compiler transformations such as removal of empty loops even when
+         termination cannot be proven.
+    158) 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.
+
+[page 150]
+
+    Semantics
+2   A jump statement causes an unconditional jump to another place.
+    6.8.6.1 The goto statement
+    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.)
+            /* ... */
+            goto first_time;
+            for (;;) {
+                    // determine next operation
+                    /* ... */
+                    if (need to reinitialize) {
+                            // reinitialize-only code
+                            /* ... */
+                    first_time:
+                            // general initialization code
+                            /* ... */
+                            continue;
+                    }
+                    // handle other operations
+                    /* ... */
+            }
+
+
+
+
+[page 151]
+
+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] = 4.4;
+            lab3:
+                  a[j] = 3.3;
+                  goto lab4;                   // valid: going WITHIN scope of VLA.
+                  a[j] = 5.5;
+            lab4:
+                  a[j] = 6.6;
+            }
+            goto lab4;                         // invalid: going INTO scope of VLA.
+
+    6.8.6.2 The continue statement
+    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;.159)
+    6.8.6.3 The break statement
+    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.
+
+
+
+    159) Following the contin: label is a null statement.
+
+[page 152]
+
+    6.8.6.4 The return statement
+    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.160)
+4   EXAMPLE       In:
+            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();
+    there is no undefined behavior, although there would be if the assignment were done directly (without using
+    a function call to fetch the value).
+
+
+
+
+    160) The return statement is not an assignment. The overlap restriction of subclause 6.5.16.1 does not
+         apply to the case of function return. The representation of floating-point values may have wider range
+         or precision than implied by the type; a cast may be used to remove this extra range and precision.
+
+[page 153]
+
+    6.9 External definitions
+    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 5.1.1.1, 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
+    6.7, 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.161)
+
+
+
+
+    161) Thus, if an identifier declared with external linkage is not used in an expression, there need be no
+         external definition for it.
+
+[page 154]
+
+    6.9.1 Function definitions
+    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.162)
+3   The return type of a function shall be void or a complete 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.
+
+
+
+    162) 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
+
+
+[page 155]
+
+     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,163) 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 6.7.6.3 for a parameter type list; the resulting type shall be a complete 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.164) 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 > 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 > b ? a : b; }
+     is the function body. The following similar definition uses the identifier-list form for the parameter
+     declarations:
+
+
+
+
+     163) See ''future language directions'' (6.11.7).
+     164) A parameter identifier cannot be redeclared in the function body except in an enclosed block.
+
+[page 156]
+
+              extern int max(a, b)
+              int a, b;
+              {
+                    return a > 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)(); ...                   */
+              }
+
+     6.9.2 External object definitions
+     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.
+
+
+
+
+[page 157]
+
+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;                      // 6.2.2 renders undefined, linkage disagreement
+             int   i3;                      // valid tentative definition, refers to previous
+             int   i4;                      // valid tentative definition, refers to previous
+             int   i5;                      // 6.2.2 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.
+
+
+
+
+[page 158]
+
+    6.10 Preprocessing directives
+    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
+
+
+
+
+[page 159]
+
+             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.165) A new-line character ends
+    the preprocessing directive even if it occurs within what would otherwise be an
+
+    165) 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 6.10.3.2, for example).
+
+[page 160]
+
+    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 (6.10.1), 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 <file.h>
+    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.
+
+    6.10.1 Conditional inclusion
+    Constraints
+1   The expression that controls conditional inclusion shall be an integer constant expression
+    except that: identifiers (including those lexically identical to keywords) are interpreted as *
+    described below;166) and it may contain unary operator expressions of the form
+         defined identifier
+    or
+         defined ( identifier )
+    which evaluate to 1 if the identifier is currently defined as a macro name (that is, if it is
+
+
+    166) 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.
+
+[page 161]
+
+    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 (6.4).
+    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 6.6. 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 <stdint.h>.167) 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.168) Also, whether a
+    single-character character constant may have a negative value is implementation-defined.
+
+
+
+
+    167) 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.
+    168) 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)
+
+
+[page 162]
+
+5   Preprocessing directives of the forms
+       # 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.169)
+    Forward references: macro replacement (6.10.3), source file inclusion (6.10.2), largest
+    integer types (7.20.1.5).
+    6.10.2 Source file inclusion
+    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 <h-char-sequence> new-line
+    searches a sequence of implementation-defined places for a header identified uniquely by
+    the specified sequence between the < and > 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
+       # 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
+
+
+    169) 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.
+
+[page 163]
+
+    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 <h-char-sequence> new-line
+    with the identical contained sequence (including > 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.170) The method by which a sequence of preprocessing tokens
+    between a < and a > 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 (6.4.2.1) 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 5.2.4.1).
+7   EXAMPLE 1       The most common uses of #include preprocessing directives are as in the following:
+             #include <stdio.h>
+             #include "myprog.h"
+
+
+
+
+    170) Note that adjacent string literals are not concatenated into a single string literal (see the translation
+         phases in 5.1.1.2); thus, an expansion that results in two string literals is an invalid directive.
+
+[page 164]
+
+8   EXAMPLE 2      This illustrates macro-replaced #include directives:
+              #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 (6.10.3).
+    6.10.3 Macro replacement
+    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
+
+[page 165]
+
+     for either form of macro.
+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 name171)
+     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,172) 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:
+
+
+     171) Since, by macro-replacement time, all character constants and string literals are preprocessing tokens,
+          not sequences possibly containing identifier-like subsequences (see 5.1.1.2, translation phases), they
+          are never scanned for macro names or parameters.
+     172) Despite the name, a non-directive is a preprocessing directive.
+
+[page 166]
+
+    the variable arguments. The number of arguments so combined is such that, following
+    merger, the number of arguments is one more than the number of parameters in the macro
+    definition (excluding the ...).
+    6.10.3.1 Argument substitution
+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.
+    6.10.3.2 The # operator
+    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.
+
+
+
+
+[page 167]
+
+    6.10.3.3 The ## operator
+    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.173)
+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.
+
+
+    173) Placemarker preprocessing tokens do not appear in the syntax because they are temporary entities that
+         exist only within translation phase 4.
+
+[page 168]
+
+    6.10.3.4 Rescanning and further replacement
+1   After all parameters in the replacement list have been substituted and # and ##
+    processing has taken place, all placemarker preprocessing tokens are removed. The
+    resulting preprocessing token sequence is then 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 6.10.9 below.
+    6.10.3.5 Scope of macro definitions
+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) > (b) ? (a) : (b))
+    The parentheses ensure that the arguments and the resulting expression are bound properly.
+
+
+
+
+[page 169]
+
+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) & 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)) & 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
+
+
+
+
+[page 170]
+
+             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>y, "x is %d but y is %d", x, y);
+
+
+[page 171]
+
+    results in
+             fprintf(stderr, "Flag" );
+             fprintf(stderr, "X = %d\n", x );
+             puts( "The first, second, and third items." );
+             ((x>y)?puts("x>y"):
+                         printf("x is %d but y is %d", x, y));
+
+    6.10.4 Line control
+    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 (5.1.1.2) 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.
+
+
+
+
+[page 172]
+
+    6.10.5 Error directive
+    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.
+    6.10.6 Pragma directive
+    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)174) 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 forms175) 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 (7.12.2), the FENV_ACCESS pragma
+    (7.6.1), the CX_LIMITED_RANGE pragma (7.3.4).
+
+
+
+
+    174) 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.
+    175) See ''future language directions'' (6.11.8).
+
+[page 173]
+
+    6.10.7 Null directive
+    Semantics
+1   A preprocessing directive of the form
+       # new-line
+    has no effect.
+    6.10.8 Predefined macro names
+1   The values of the predefined macros listed in the following subclauses176) (except for
+    __FILE__ and __LINE__) remain constant throughout the translation unit.
+2   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.
+3   The implementation shall not predefine the macro __cplusplus, nor shall it define it
+    in any standard header.
+    Forward references: standard headers (7.1.2).
+    6.10.8.1 Mandatory macros
+1   The following macro names 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).177)
+    __LINE__ The presumed line number (within the current source file) of the current
+               source line (an integer constant).177)
+    __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.
+
+
+
+
+    176) See ''future language directions'' (6.11.9).
+    177) The presumed source file name and line number can be changed by the #line directive.
+
+[page 174]
+
+    __STDC_VERSION__ The integer constant 201ymmL.178)
+    __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.
+    Forward references: the asctime function (7.26.3.1).
+    6.10.8.2 Environment macros
+1   The following macro names are conditionally defined by the implementation:
+    __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. If some other encoding is used, the macro shall not be defined and
+              the actual encoding used is implementation-defined.
+    __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_UTF_16__ The integer constant 1, intended to indicate that values of type
+              char16_t are UTF-16 encoded. If some other encoding is used, the
+              macro shall not be defined and the actual encoding used is implementation-
+              defined.
+    __STDC_UTF_32__ The integer constant 1, intended to indicate that values of type
+              char32_t are UTF-32 encoded. If some other encoding is used, the
+              macro shall not be defined and the actual encoding used is implementation-
+              defined.
+    Forward references: common definitions (7.19), unicode utilities (7.27).
+
+
+
+
+    178) This macro was not specified in ISO/IEC 9899:1990 and was specified as 199409L in
+         ISO/IEC 9899/AMD1:1995 and as 199901L in ISO/IEC 9899:1999. The intention is that this will
+         remain an integer constant of type long int that is increased with each revision of this International
+         Standard.
+
+[page 175]
+
+    6.10.8.3 Conditional feature macros
+1   The following macro names are conditionally defined by the implementation:
+    __STDC_ANALYZABLE__ The integer constant 1, intended to indicate conformance to
+              the specifications in annex L (Analyzability).
+    __STDC_IEC_559__ The integer constant 1, intended to indicate conformance to the
+              specifications in annex F (IEC 60559 floating-point arithmetic).
+    __STDC_IEC_559_COMPLEX__ The integer constant 1, intended to indicate
+              adherence to the specifications in annex G (IEC 60559 compatible complex
+              arithmetic).
+    __STDC_LIB_EXT1__ The integer constant 201ymmL, intended to indicate support
+              for the extensions defined in annex K (Bounds-checking interfaces).179)
+    __STDC_NO_COMPLEX__ The integer constant 1, intended to indicate that the
+              implementation does not support complex types or the <complex.h>
+              header.
+    __STDC_NO_THREADS__ The integer constant 1, intended to indicate that the
+              implementation does not support atomic types (including the _Atomic
+              type qualifier and the <stdatomic.h> header) or the <threads.h>
+              header.
+    __STDC_NO_VLA__ The integer constant 1, intended to indicate that the
+              implementation does not support variable length arrays or variably
+              modified types.
+2   An implementation that defines __STDC_NO_COMPLEX__ shall not define
+    __STDC_IEC_559_COMPLEX__.
+    6.10.9 Pragma operator
+    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
+
+
+    179) The intention is that this will remain an integer constant of type long int that is increased with
+         each revision of this International Standard.
+
+[page 176]
+
+    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:
+              _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 )
+
+
+
+
+[page 177]
+
+    6.11 Future language directions
+    6.11.1 Floating types
+1   Future standardization may include additional floating-point types, including those with
+    greater range, precision, or both than long double.
+    6.11.2 Linkages of identifiers
+1   Declaring an identifier with internal linkage at file scope without the static storage-
+    class specifier is an obsolescent feature.
+    6.11.3 External names
+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.
+    6.11.4 Character escape sequences
+1   Lowercase letters as escape sequences are reserved for future standardization. Other
+    characters may be used in extensions.
+    6.11.5 Storage-class specifiers
+1   The placement of a storage-class specifier other than at the beginning of the declaration
+    specifiers in a declaration is an obsolescent feature.
+    6.11.6 Function declarators
+1   The use of function declarators with empty parentheses (not prototype-format parameter
+    type declarators) is an obsolescent feature.
+    6.11.7 Function definitions
+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.
+    6.11.8 Pragma directives
+1   Pragmas whose first preprocessing token is STDC are reserved for future standardization.
+    6.11.9 Predefined macro names
+1   Macro names beginning with __STDC_ are reserved for future standardization.
+
+
+
+
+[page 178]
+
+
+    7. Library
+    7.1 Introduction
+    7.1.1 Definitions of terms
+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.180) 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 5.2.1.2). A shift sequence shall not have a
+    corresponding wide character; it is instead taken to be an adjunct to an adjacent multibyte
+    character.181)
+    Forward references: character handling (7.4), the setlocale function (7.11.1.1).
+
+
+
+
+    180) The functions that make use of the decimal-point character are the numeric conversion functions
+         (7.22.1, 7.28.4.1) and the formatted input/output functions (7.21.6, 7.28.2).
+    181) 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.
+
+[page 179]
+
+    7.1.2 Standard headers
+1   Each library function is declared, with a type that includes a prototype, in a header,182)
+    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 are183)
+           <assert.h>             <iso646.h>              <stdarg.h>              <string.h>
+           <complex.h>            <limits.h>              <stdatomic.h>           <tgmath.h>
+           <ctype.h>              <locale.h>              <stdbool.h>             <threads.h>
+           <errno.h>              <math.h>                <stddef.h>              <time.h>
+           <fenv.h>               <setjmp.h>              <stdint.h>              <uchar.h>
+           <float.h>              <signal.h>              <stdio.h>               <wchar.h>
+           <inttypes.h>           <stdalign.h>            <stdlib.h>              <wctype.h>
+3   If a file with the same name as one of the above < and > 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 <assert.h> depends on the definition of NDEBUG (see 7.2). 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.
+
+
+
+
+    182) A header is not necessarily a source file, nor are the < and > delimited sequences in header names
+         necessarily valid source file names.
+    183) The headers <complex.h>, <stdatomic.h>, and <threads.h> are conditional features that
+         implementations need not support; see 6.10.8.3.
+
+[page 180]
+
+7   A summary of the contents of the standard headers is given in annex B.
+    Forward references: diagnostics (7.2).
+    7.1.3 Reserved identifiers
+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 7.1.4).
+    -- All identifiers with external linkage in any of the following subclauses (including the
+      future library directions) and errno are always reserved for use as identifiers with
+      external linkage.184)
+    -- 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 7.1.4), 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.
+
+
+
+
+    184) The list of reserved identifiers with external linkage includes math_errhandling, setjmp,
+         va_copy, and va_end.
+
+[page 181]
+
+    7.1.4 Use of library functions
+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
+    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.185) 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.186) 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.187) All object-like macros listed as expanding to
+
+
+    185) This means that an implementation shall provide an actual function for each library function, even if it
+         also provides a macro for that function.
+    186) Such macros might not contain the sequence points that the corresponding function calls do.
+    187) 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.
+
+[page 182]
+
+    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 or thread storage duration.188)
+5   Unless explicitly stated otherwise in the detailed descriptions that follow, library
+    functions shall prevent data races as follows: A library function shall not directly or
+    indirectly access objects accessible by threads other than the current thread unless the
+    objects are accessed directly or indirectly via the function's arguments. A library
+    function shall not directly or indirectly modify objects accessible by threads other than
+    the current thread unless the objects are accessed directly or indirectly via the function's
+    non-const arguments.189) Implementations may share their own internal objects between
+    threads if the objects are not visible to users and are protected against data races.
+6   Unless otherwise specified, library functions shall perform all operations solely within the
+    current thread if those operations have effects that are visible to users.190)
+7   EXAMPLE        The function atoi may be used in any of several ways:
+    -- by use of its associated header (possibly generating a macro expansion)
+                 #include <stdlib.h>
+                 const char *str;
+                 /* ... */
+                 i = atoi(str);
+    -- by use of its associated header (assuredly generating a true function reference)
+
+
+
+
+    188) Thus, a signal handler cannot, in general, call standard library functions.
+    189) This means, for example, that an implementation is not permitted to use a static object for internal
+         purposes without synchronization because it could cause a data race even in programs that do not
+         explicitly share objects between threads.
+    190) This allows implementations to parallelize operations if there are no visible side effects.
+
+[page 183]
+
+            #include <stdlib.h>
+            #undef atoi
+            const char *str;
+            /* ... */
+            i = atoi(str);
+   or
+            #include <stdlib.h>
+            const char *str;
+            /* ... */
+            i = (atoi)(str);
+-- by explicit declaration
+            extern int atoi(const char *);
+            const char *str;
+            /* ... */
+            i = atoi(str);
+
+
+
+
+[page 184]
+
+    7.2 Diagnostics <assert.h>
+1   The header <assert.h> defines the assert and static_assert macros and
+    refers to another macro,
+            NDEBUG
+    which is not defined by <assert.h>. If NDEBUG is defined as a macro name at the
+    point in the source file where <assert.h> 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
+    <assert.h> 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.
+3   The macro
+            static_assert
+    expands to _Static_assert.
+    7.2.1 Program diagnostics
+    7.2.1.1 The assert macro
+    Synopsis
+1           #include <assert.h>
+            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.191) It
+    then calls the abort function.
+
+
+
+    191) The message written might be of the form:
+         Assertion failed: expression, function abc, file xyz, line nnn.
+
+
+[page 185]
+
+    Returns
+3   The assert macro returns no value.
+    Forward references: the abort function (7.22.4.1).
+
+
+
+
+[page 186]
+
+    7.3 Complex arithmetic <complex.h>
+    7.3.1 Introduction
+1   The header <complex.h> defines macros and declares functions that support complex
+    arithmetic.192)
+2   Implementations that define the macro __STDC_NO_COMPLEX__ need not provide
+    this header nor support any of its facilities.
+3   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.
+4   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.193)
+5   The macros
+             imaginary
+    and
+             _Imaginary_I
+    are defined if and only if the implementation supports imaginary types;194) if defined,
+    they expand to _Imaginary and a constant expression of type const float
+    _Imaginary with the value of the imaginary unit.
+6   The macro
+             I
+    expands to either _Imaginary_I or _Complex_I. If _Imaginary_I is not
+    defined, I shall expand to _Complex_I.
+7   Notwithstanding the provisions of 7.1.3, a program may undefine and perhaps then
+    redefine the macros complex, imaginary, and I.
+
+    192) See ''future library directions'' (7.30.1).
+    193) The imaginary unit is a number i such that i 2 = -1.
+    194) A specification for imaginary types is in informative annex G.
+
+[page 187]
+
+    Forward references: IEC 60559-compatible complex arithmetic (annex G).
+    7.3.2 Conventions
+1   Values are interpreted as radians, not degrees. An implementation may set errno but is
+    not required to.
+    7.3.3 Branch cuts
+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 annex G, 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 annex F) 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.
+    7.3.4 The CX_LIMITED_RANGE pragma
+    Synopsis
+1          #include <complex.h>
+           #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.195) The 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
+    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
+
+[page 188]
+
+    compound statement. If this pragma is used in any other context, the behavior is
+    undefined. The default state for the pragma is ''off''.
+    7.3.5 Trigonometric functions
+    7.3.5.1 The cacos functions
+    Synopsis
+1           #include <complex.h>
+            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.
+    7.3.5.2 The casin functions
+    Synopsis
+1           #include <complex.h>
+            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]
+
+    195) 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.
+
+[page 189]
+
+    along the real axis.
+    7.3.5.3 The catan functions
+    Synopsis
+1          #include <complex.h>
+           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.
+    7.3.5.4 The ccos functions
+    Synopsis
+1          #include <complex.h>
+           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.
+    7.3.5.5 The csin functions
+    Synopsis
+1          #include <complex.h>
+           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.
+
+
+
+[page 190]
+
+    Returns
+3   The csin functions return the complex sine value.
+    7.3.5.6 The ctan functions
+    Synopsis
+1           #include <complex.h>
+            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.
+    7.3.6 Hyperbolic functions
+    7.3.6.1 The cacosh functions
+    Synopsis
+1           #include <complex.h>
+            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 nonnegative values along the real axis and in the interval [-ipi , +ipi ] along the
+    imaginary axis.
+    7.3.6.2 The casinh functions
+    Synopsis
+1           #include <complex.h>
+            double complex casinh(double complex z);
+            float complex casinhf(float complex z);
+            long double complex casinhl(long double complex z);
+
+
+
+[page 191]
+
+    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.
+    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.
+    7.3.6.3 The catanh functions
+    Synopsis
+1          #include <complex.h>
+           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.
+    7.3.6.4 The ccosh functions
+    Synopsis
+1          #include <complex.h>
+           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.
+
+
+
+
+[page 192]
+
+    7.3.6.5 The csinh functions
+    Synopsis
+1           #include <complex.h>
+            double complex csinh(double complex z);
+            float complex csinhf(float complex z);
+            long double complex csinhl(long double complex z);
+    Description
+2   The csinh functions compute the complex hyperbolic sine of z.
+    Returns
+3   The csinh functions return the complex hyperbolic sine value.
+    7.3.6.6 The ctanh functions
+    Synopsis
+1           #include <complex.h>
+            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.
+    7.3.7 Exponential and logarithmic functions
+    7.3.7.1 The cexp functions
+    Synopsis
+1           #include <complex.h>
+            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.
+
+
+
+[page 193]
+
+    7.3.7.2 The clog functions
+    Synopsis
+1          #include <complex.h>
+           double complex clog(double complex z);
+           float complex clogf(float complex z);
+           long double complex clogl(long double complex z);
+    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.
+    7.3.8 Power and absolute-value functions
+    7.3.8.1 The cabs functions
+    Synopsis
+1          #include <complex.h>
+           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.
+    7.3.8.2 The cpow functions
+    Synopsis
+1          #include <complex.h>
+           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);
+
+
+
+
+[page 194]
+
+    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.
+    7.3.8.3 The csqrt functions
+    Synopsis
+1           #include <complex.h>
+            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).
+    7.3.9 Manipulation functions
+    7.3.9.1 The carg functions
+    Synopsis
+1           #include <complex.h>
+            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 ].
+
+
+
+
+[page 195]
+
+    7.3.9.2 The cimag functions
+    Synopsis
+1          #include <complex.h>
+           double cimag(double complex z);
+           float cimagf(float complex z);
+           long double cimagl(long double complex z);
+    Description
+2   The cimag functions compute the imaginary part of z.196)
+    Returns
+3   The cimag functions return the imaginary part value (as a real).
+    7.3.9.3 The CMPLX macros
+    Synopsis
+1          #include <complex.h>
+           double complex CMPLX(double x, double y);
+           float complex CMPLXF(float x, float y);
+           long double complex CMPLXL(long double x, long double y);
+    Description
+2   The CMPLX macros expand to an expression of the specified complex type, with the real
+    part having the (converted) value of x and the imaginary part having the (converted)
+    value of y.
+    Recommended practice
+3   The resulting expression should be suitable for use as an initializer for an object with
+    static or thread storage duration, provided both arguments are likewise suitable.
+    Returns
+4   The CMPLX macros return the complex value x + i y.
+5   NOTE    These macros act as if the implementation supported imaginary types and the definitions were:
+          #define CMPLX(x, y)  ((double complex)((double)(x) + \
+                                        _Imaginary_I * (double)(y)))
+          #define CMPLXF(x, y) ((float complex)((float)(x) + \
+                                        _Imaginary_I * (float)(y)))
+          #define CMPLXL(x, y) ((long double complex)((long double)(x) + \
+                                        _Imaginary_I * (long double)(y)))
+
+
+
+
+    196) For a variable z of complex type, z == creal(z) + cimag(z)*I.
+
+[page 196]
+
+    7.3.9.4 The conj functions
+    Synopsis
+1           #include <complex.h>
+            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.
+    7.3.9.5 The cproj functions
+    Synopsis
+1           #include <complex.h>
+            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.
+    7.3.9.6 The creal functions
+    Synopsis
+1           #include <complex.h>
+            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.197)
+
+
+[page 197]
+
+    Returns
+3   The creal functions return the real part value.
+
+
+
+
+    197) For a variable z of complex type, z == creal(z) + cimag(z)*I.
+
+[page 198]
+
+    7.4 Character handling <ctype.h>
+1   The header <ctype.h> declares several functions useful for classifying and mapping
+    characters.198) 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.199) All letters and digits are printing characters.
+    Forward references: EOF (7.21.1), localization (7.11).
+    7.4.1 Character classification functions
+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.
+    7.4.1.1 The isalnum function
+    Synopsis
+1            #include <ctype.h>
+             int isalnum(int c);
+    Description
+2   The isalnum function tests for any character for which isalpha or isdigit is true.
+    7.4.1.2 The isalpha function
+    Synopsis
+1            #include <ctype.h>
+             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
+
+
+
+    198) See ''future library directions'' (7.30.2).
+    199) 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).
+
+[page 199]
+
+    none of iscntrl, isdigit, ispunct, or isspace is true.200) In the "C" locale,
+    isalpha returns true only for the characters for which isupper or islower is true.
+    7.4.1.3 The isblank function
+    Synopsis
+1           #include <ctype.h>
+            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.
+    7.4.1.4 The iscntrl function
+    Synopsis
+1           #include <ctype.h>
+            int iscntrl(int c);
+    Description
+2   The iscntrl function tests for any control character.
+    7.4.1.5 The isdigit function
+    Synopsis
+1           #include <ctype.h>
+            int isdigit(int c);
+    Description
+2   The isdigit function tests for any decimal-digit character (as defined in 5.2.1).
+    7.4.1.6 The isgraph function
+    Synopsis
+1           #include <ctype.h>
+            int isgraph(int c);
+
+
+
+
+    200) The functions islower and isupper test true or false separately for each of these additional
+         characters; all four combinations are possible.
+
+[page 200]
+
+    Description
+2   The isgraph function tests for any printing character except space (' ').
+    7.4.1.7 The islower function
+    Synopsis
+1           #include <ctype.h>
+            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 5.2.1).
+    7.4.1.8 The isprint function
+    Synopsis
+1           #include <ctype.h>
+            int isprint(int c);
+    Description
+2   The isprint function tests for any printing character including space (' ').
+    7.4.1.9 The ispunct function
+    Synopsis
+1           #include <ctype.h>
+            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.
+    7.4.1.10 The isspace function
+    Synopsis
+1           #include <ctype.h>
+            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
+
+[page 201]
+
+    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.
+    7.4.1.11 The isupper function
+    Synopsis
+1          #include <ctype.h>
+           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 5.2.1).
+    7.4.1.12 The isxdigit function
+    Synopsis
+1          #include <ctype.h>
+           int isxdigit(int c);
+    Description
+2   The isxdigit function tests for any hexadecimal-digit character (as defined in 6.4.4.1).
+    7.4.2 Character case mapping functions
+    7.4.2.1 The tolower function
+    Synopsis
+1          #include <ctype.h>
+           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.
+
+
+
+
+[page 202]
+
+    7.4.2.2 The toupper function
+    Synopsis
+1           #include <ctype.h>
+            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.
+
+
+
+
+[page 203]
+
+    7.5 Errors <errno.h>
+1   The header <errno.h> 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 lvalue201) that has type int and thread local storage
+    duration, the value of which is set to a positive error number by several library functions.
+    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 in the initial thread is zero at program startup (the initial value of
+    errno in other threads is an indeterminate value), but is never set to zero by any library
+    function.202) 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,203) may also be specified by the implementation.
+
+
+
+
+    201) 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()).
+    202) 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.
+    203) See ''future library directions'' (7.30.3).
+
+[page 204]
+
+    7.6 Floating-point environment <fenv.h>
+1   The header <fenv.h> defines several macros, and declares types and functions that
+    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.204) 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.205) 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   The floating-point environment has thread storage duration. The initial state for a
+    thread's floating-point environment is the current state of the floating-point environment
+    of the thread that creates it at the time of creation.
+3   Certain programming conventions support the intended model of use for the floating-
+    point environment:206)
+    -- 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.
+4   The type
+            fenv_t
+    represents the entire floating-point environment.
+5   The type
+            fexcept_t
+    represents the floating-point status flags collectively, including any status the
+    implementation associates with the flags.
+
+
+    204) 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. It is also
+         designed to facilitate code portability among all systems.
+    205) A floating-point status flag is not an object and can be set more than once within an expression.
+    206) 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.
+
+[page 205]
+
+6   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.207) 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.208)
+7   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.
+8   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.209)
+9   The macro
+
+
+
+    207) The implementation supports a floating-point exception if there are circumstances where a call to at
+         least one of the functions in 7.6.2, using the macro as the appropriate argument, will succeed. It is not
+         necessary for all the functions to succeed all the time.
+    208) The macros should be distinct powers of two.
+    209) Even though the rounding direction macros may expand to constants corresponding to the values of
+         FLT_ROUNDS, they are not required to do so.
+
+[page 206]
+
+              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
+     <fenv.h> functions that manage the floating-point environment.
+10   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.
+     7.6.1 The FENV_ACCESS pragma
+     Synopsis
+1             #include <fenv.h>
+              #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.210) 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.)
+
+
+
+
+     210) 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.
+
+[page 207]
+
+3   EXAMPLE
+            #include <fenv.h>
+            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.211)
+
+    7.6.2 Floating-point exceptions
+1   The following functions provide access to the floating-point status flags.212) 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.
+    7.6.2.1 The feclearexcept function
+    Synopsis
+1           #include <fenv.h>
+            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.
+
+
+    211) 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.
+    212) 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.
+
+[page 208]
+
+    7.6.2.2 The fegetexceptflag function
+    Synopsis
+1            #include <fenv.h>
+             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.
+    7.6.2.3 The feraiseexcept function
+    Synopsis
+1            #include <fenv.h>
+             int feraiseexcept(int excepts);
+    Description
+2   The feraiseexcept function attempts to raise the supported floating-point exceptions
+    represented by its argument.213) The order in which these floating-point exceptions are
+    raised is unspecified, except as stated in F.8.6. 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.
+
+
+
+
+    213) 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 F.8.6 is in the same spirit.
+
+[page 209]
+
+    7.6.2.4 The fesetexceptflag function
+    Synopsis
+1           #include <fenv.h>
+            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.
+    7.6.2.5 The fetestexcept function
+    Synopsis
+1           #include <fenv.h>
+            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.214)
+    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:
+
+
+
+
+    214) This mechanism allows testing several floating-point exceptions with just one function call.
+
+[page 210]
+
+            #include <fenv.h>
+            /* ... */
+            {
+                    #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 & FE_INVALID) f();
+                    if (set_excepts & FE_OVERFLOW) g();
+                    /* ... */
+            }
+
+    7.6.3 Rounding
+1   The fegetround and fesetround functions provide control of rounding direction
+    modes.
+    7.6.3.1 The fegetround function
+    Synopsis
+1           #include <fenv.h>
+            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.
+    7.6.3.2 The fesetround function
+    Synopsis
+1           #include <fenv.h>
+            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.
+
+
+[page 211]
+
+4   EXAMPLE Save, set, and restore the rounding direction. Report an error and abort if setting the
+    rounding direction fails.
+           #include <fenv.h>
+           #include <assert.h>
+           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);
+                 /* ... */
+           }
+
+    7.6.4 Environment
+1   The functions in this section manage the floating-point environment -- status flags and
+    control modes -- as one entity.
+    7.6.4.1 The fegetenv function
+    Synopsis
+1          #include <fenv.h>
+           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.
+    7.6.4.2 The feholdexcept function
+    Synopsis
+1          #include <fenv.h>
+           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.215)
+
+[page 212]
+
+    Returns
+3   The feholdexcept function returns zero if and only if non-stop floating-point
+    exception handling was successfully installed.
+    7.6.4.3 The fesetenv function
+    Synopsis
+1           #include <fenv.h>
+            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.
+    7.6.4.4 The feupdateenv function
+    Synopsis
+1           #include <fenv.h>
+            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.
+
+
+
+
+    215) 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.
+
+[page 213]
+
+4   EXAMPLE   Hide spurious underflow floating-point exceptions:
+          #include <fenv.h>
+          double f(double x)
+          {
+                #pragma STDC FENV_ACCESS ON
+                double result;
+                fenv_t save_env;
+                if (feholdexcept(&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(&save_env))
+                      return /* indication of an environmental problem */;
+                return result;
+          }
+
+
+
+
+[page 214]
+
+    7.7 Characteristics of floating types <float.h>
+1   The header <float.h> 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 5.2.4.2.2.
+
+
+
+
+[page 215]
+
+    7.8 Format conversion of integer types <inttypes.h>
+1   The header <inttypes.h> includes the header <stdint.h> 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 <stdint.h>, it defines corresponding macros for conversion
+    specifiers for use with the formatted input/output functions.216)
+    Forward references: integer types <stdint.h> (7.20), formatted input/output
+    functions (7.21.6), formatted wide character input/output functions (7.28.2).
+    7.8.1 Macros for format specifiers
+1   Each of the following object-like macros 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),217) followed by the conversion specifier, followed by a
+    name corresponding to a similar type name in 7.20.1. In these names, N represents the
+    width of the type as described in 7.20.1. 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
+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:
+
+
+
+    216) See ''future library directions'' (7.30.4).
+    217) 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.
+
+[page 216]
+
+           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 <stdint.h>, 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 <inttypes.h>
+            #include <wchar.h>
+            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;
+            }
+
+    7.8.2 Functions for greatest-width integer types
+    7.8.2.1 The imaxabs function
+    Synopsis
+1           #include <inttypes.h>
+            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.218)
+    Returns
+3   The imaxabs function returns the absolute value.
+
+
+
+
+    218) The absolute value of the most negative number cannot be represented in two's complement.
+
+[page 217]
+
+    7.8.2.2 The imaxdiv function
+    Synopsis
+1          #include <inttypes.h>
+           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.
+    7.8.2.3 The strtoimax and strtoumax functions
+    Synopsis
+1          #include <inttypes.h>
+           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
+    (7.22.1.4).
+
+
+
+
+[page 218]
+
+    7.8.2.4 The wcstoimax and wcstoumax functions
+    Synopsis
+1           #include <stddef.h>           // for wchar_t
+            #include <inttypes.h>
+            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
+    (7.28.4.1.2).
+
+
+
+
+[page 219]
+
+    7.9 Alternative spellings <iso646.h>
+1   The header <iso646.h> defines the following eleven macros (on the left) that expand
+    to the corresponding tokens (on the right):
+          and           &&
+          and_eq        &=
+          bitand        &
+          bitor         |
+          compl         ~
+          not           !
+          not_eq        !=
+          or            ||
+          or_eq         |=
+          xor           ^
+          xor_eq        ^=
+
+
+
+
+[page 220]
+
+    7.10 Sizes of integer types <limits.h>
+1   The header <limits.h> 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 5.2.4.2.1.
+
+
+
+
+[page 221]
+
+    7.11 Localization <locale.h>
+1   The header <locale.h> 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 7.11.2.1. 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
+
+
+
+
+[page 222]
+
+3   The macros defined are NULL (described in 7.19); 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.219) Additional macro definitions, beginning
+    with the characters LC_ and an uppercase letter,220) may also be specified by the
+    implementation.
+    7.11.1 Locale control
+    7.11.1.1 The setlocale function
+    Synopsis
+1            #include <locale.h>
+             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 functions221) 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.
+
+    219) ISO/IEC 9945-2 specifies locale and charmap formats that may be used to specify locales for C.
+    220) See ''future library directions'' (7.30.5).
+    221) The only functions in 7.4 whose behavior is not affected by the current locale are isdigit and
+         isxdigit.
+
+[page 223]
+
+4   At program startup, the equivalent of
+            setlocale(LC_ALL, "C");
+    is executed.
+5   A call to the setlocale function may introduce a data race with other calls to the
+    setlocale function or with calls to functions that are affected by the current locale.
+    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.222)
+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 (7.21.6), multibyte/wide
+    character conversion functions (7.22.7), multibyte/wide string conversion functions
+    (7.22.8), numeric conversion functions (7.22.1), the strcoll function (7.23.4.3), the
+    strftime function (7.26.3.5), the strxfrm function (7.23.4.5).
+    7.11.2 Numeric formatting convention inquiry
+    7.11.2.1 The localeconv function
+    Synopsis
+1           #include <locale.h>
+            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.
+
+
+
+    222) The implementation shall arrange to encode in a string the various categories due to a heterogeneous
+         locale when category has the value LC_ALL.
+
+[page 224]
+
+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
+    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.
+
+
+
+[page 225]
+
+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.
+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.
+[page 226]
+
+    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.
+
+
+[page 227]
+
+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
+
+
+
+
+[page 228]
+
+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         (1.25$)            (1.25 $)            (1.25$)
+                                          1         +1.25$             +1.25 $             + 1.25$
+                                          2         1.25$+             1.25 $+             1.25$ +
+                                          3         1.25+$             1.25 +$             1.25+ $
+                                          4         1.25$+             1.25 $+             1.25$ +
+
+                     1                    0         ($1.25)            ($ 1.25)            ($1.25)
+                                          1         +$1.25             +$ 1.25             + $1.25
+                                          2         $1.25+             $ 1.25+             $1.25 +
+                                          3         +$1.25             +$ 1.25             + $1.25
+                                          4         $+1.25             $+ 1.25             $ +1.25
+
+
+
+
+[page 229]
+
+    7.12 Mathematics <math.h>
+1   The header <math.h> 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.223)
+    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.224)
+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.225)
+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
+
+
+
+    223) Particularly on systems with wide expression evaluation, a <math.h> function might pass arguments
+         and return values in wider format than the synopsis prototype indicates.
+    224) 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.
+    225) HUGE_VAL, HUGE_VALF, and HUGE_VALL can be positive infinities in an implementation that
+         supports infinities.
+
+[page 230]
+
+    translation time.226)
+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.227) 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.
+
+
+    226) In this case, using INFINITY will violate the constraint in 6.4.4 and thus require a diagnostic.
+    227) 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.
+
+[page 231]
+
+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 & MATH_ERREXCEPT can be nonzero, the implementation
+    shall define the macros FE_DIVBYZERO, FE_INVALID, and FE_OVERFLOW in
+    <fenv.h>.
+    7.12.1 Treatment of error conditions
+1   The behavior of each of the functions in <math.h> 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 raising SIGFPE and without generating any of the
+    floating-point exceptions ''invalid'', ''divide-by-zero'', or ''overflow'' except to reflect
+    the result of the function.
+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.228) On a
+    domain error, the function returns an implementation-defined value; if the integer
+    expression math_errhandling & MATH_ERRNO is nonzero, the integer expression
+    errno acquires the value EDOM; if the integer expression math_errhandling &
+    MATH_ERREXCEPT is nonzero, the ''invalid'' floating-point exception is raised.
+3   Similarly, a pole error (also known as a singularity or infinitary) occurs if the
+    mathematical function has an exact infinite result as the finite input argument(s) are
+    approached in the limit (for example, log(0.0)). The description of each function lists
+    any required pole errors; an implementation may define additional pole errors, provided
+    that such errors are consistent with the mathematical definition of the function. On a pole
+    error, the function returns an implementation-defined value; if the integer expression
+
+
+    228) 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.
+
+[page 232]
+
+    math_errhandling & MATH_ERRNO is nonzero, the integer expression errno
+    acquires the value ERANGE; if the integer expression math_errhandling &
+    MATH_ERREXCEPT is nonzero, the ''divide-by-zero'' floating-point exception is raised.
+4   Likewise, 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.
+5   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, then the function returns the value of the macro HUGE_VAL, 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 & MATH_ERRNO is nonzero,
+    the integer expression errno acquires the value ERANGE; if the integer expression
+    math_errhandling & MATH_ERREXCEPT is nonzero, the ''overflow'' floating-
+    point exception is raised.
+6   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.229) 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 & MATH_ERRNO is nonzero, whether errno acquires the
+    value    ERANGE       is    implementation-defined;     if   the  integer   expression
+    math_errhandling & MATH_ERREXCEPT is nonzero, whether the ''underflow''
+    floating-point exception is raised is implementation-defined.
+7   If a domain, pole, or range error occurs and the integer expression
+    math_errhandling & MATH_ERRNO is zero,230) then errno shall either be set to
+    the value corresponding to the error or left unmodified. If no such error occurs, errno
+    shall be left unmodified regardless of the setting of math_errhandling.
+
+
+
+
+    229) The term underflow here is intended to encompass both ''gradual underflow'' as in IEC 60559 and
+         also ''flush-to-zero'' underflow.
+    230) Math errors are being indicated by the floating-point exception flags rather than by errno.
+
+[page 233]
+
+    7.12.2 The FP_CONTRACT pragma
+    Synopsis
+1            #include <math.h>
+             #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 (6.5). 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.
+    7.12.3 Classification macros
+1   In the synopses in this subclause, real-floating indicates that the argument shall be an
+    expression of real floating type.
+    7.12.3.1 The fpclassify macro
+    Synopsis
+1            #include <math.h>
+             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.231)
+    Returns
+3   The fpclassify macro returns the value of the number classification macro
+    appropriate to the value of its argument.                                *
+
+
+    231) 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.
+
+[page 234]
+
+    7.12.3.2 The isfinite macro
+    Synopsis
+1           #include <math.h>
+            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.
+    Returns
+3   The isfinite macro returns a nonzero value if and only if its argument has a finite
+    value.
+    7.12.3.3 The isinf macro
+    Synopsis
+1           #include <math.h>
+            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.
+    7.12.3.4 The isnan macro
+    Synopsis
+1           #include <math.h>
+            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.232)
+
+
+    232) 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.
+
+[page 235]
+
+    Returns
+3   The isnan macro returns a nonzero value if and only if its argument has a NaN value.
+    7.12.3.5 The isnormal macro
+    Synopsis
+1           #include <math.h>
+            int isnormal(real-floating x);
+    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.
+    7.12.3.6 The signbit macro
+    Synopsis
+1           #include <math.h>
+            int signbit(real-floating x);
+    Description
+2   The signbit macro determines whether the sign of its argument value is negative.233)
+    Returns
+3   The signbit macro returns a nonzero value if and only if the sign of its argument value
+    is negative.
+
+
+
+
+    233) The signbit macro reports the sign of all values, including infinities, zeros, and NaNs. If zero is
+         unsigned, it is treated as positive.
+
+[page 236]
+
+    7.12.4 Trigonometric functions
+    7.12.4.1 The acos functions
+    Synopsis
+1           #include <math.h>
+            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.
+    7.12.4.2 The asin functions
+    Synopsis
+1           #include <math.h>
+            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.
+    7.12.4.3 The atan functions
+    Synopsis
+1           #include <math.h>
+            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.
+
+
+
+
+[page 237]
+
+    Returns
+3   The atan functions return arctan x in the interval [-pi /2, +pi /2] radians.
+    7.12.4.4 The atan2 functions
+    Synopsis
+1          #include <math.h>
+           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.
+    7.12.4.5 The cos functions
+    Synopsis
+1          #include <math.h>
+           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.
+    7.12.4.6 The sin functions
+    Synopsis
+1          #include <math.h>
+           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).
+
+
+
+[page 238]
+
+    Returns
+3   The sin functions return sin x.
+    7.12.4.7 The tan functions
+    Synopsis
+1           #include <math.h>
+            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.
+    7.12.5 Hyperbolic functions
+    7.12.5.1 The acosh functions
+    Synopsis
+1           #include <math.h>
+            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)].
+    7.12.5.2 The asinh functions
+    Synopsis
+1           #include <math.h>
+            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.
+
+
+[page 239]
+
+    Returns
+3   The asinh functions return arsinh x.
+    7.12.5.3 The atanh functions
+    Synopsis
+1          #include <math.h>
+           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 pole error may occur if the argument equals
+    -1 or +1.
+    Returns
+3   The atanh functions return artanh x.
+    7.12.5.4 The cosh functions
+    Synopsis
+1          #include <math.h>
+           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.
+    7.12.5.5 The sinh functions
+    Synopsis
+1          #include <math.h>
+           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.
+[page 240]
+
+    Returns
+3   The sinh functions return sinh x.
+    7.12.5.6 The tanh functions
+    Synopsis
+1           #include <math.h>
+            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.
+    Returns
+3   The tanh functions return tanh x.
+    7.12.6 Exponential and logarithmic functions
+    7.12.6.1 The exp functions
+    Synopsis
+1           #include <math.h>
+            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 .
+    7.12.6.2 The exp2 functions
+    Synopsis
+1           #include <math.h>
+            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.
+
+[page 241]
+
+    Returns
+3   The exp2 functions return 2x .
+    7.12.6.3 The expm1 functions
+    Synopsis
+1           #include <math.h>
+            double expm1(double x);
+            float expm1f(float x);
+            long double expm1l(long double x);
+    Description
+2   The expm1 functions compute the base-e exponential of the argument, minus 1. A range
+    error occurs if x is too large.234)
+    Returns
+3   The expm1 functions return ex - 1.
+    7.12.6.4 The frexp functions
+    Synopsis
+1           #include <math.h>
+            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 or if the integral power of 2 is outside the range
+    of int, 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.
+
+
+
+
+    234) For small magnitude x, expm1(x) is expected to be more accurate than exp(x) - 1.
+
+[page 242]
+
+    7.12.6.5 The ilogb functions
+    Synopsis
+1           #include <math.h>
+            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.
+    Returns
+3   The ilogb functions return the exponent of x as a signed int value.
+    Forward references: the logb functions (7.12.6.11).
+    7.12.6.6 The ldexp functions
+    Synopsis
+1           #include <math.h>
+            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 .
+    7.12.6.7 The log functions
+    Synopsis
+1           #include <math.h>
+            double log(double x);
+            float logf(float x);
+            long double logl(long double x);
+
+
+
+[page 243]
+
+    Description
+2   The log functions compute the base-e (natural) logarithm of x. A domain error occurs if
+    the argument is negative. A pole error may occur if the argument is zero.
+    Returns
+3   The log functions return loge x.
+    7.12.6.8 The log10 functions
+    Synopsis
+1           #include <math.h>
+            double log10(double x);
+            float log10f(float x);
+            long double log10l(long double x);
+    Description
+2   The log10 functions compute the base-10 (common) logarithm of x. A domain error
+    occurs if the argument is negative. A pole error may occur if the argument is zero.
+    Returns
+3   The log10 functions return log10 x.
+    7.12.6.9 The log1p functions
+    Synopsis
+1           #include <math.h>
+            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.235)
+    A domain error occurs if the argument is less than -1. A pole error may occur if the
+    argument equals -1.
+    Returns
+3   The log1p functions return loge (1 + x).
+
+
+
+
+    235) For small magnitude x, log1p(x) is expected to be more accurate than log(1 + x).
+
+[page 244]
+
+    7.12.6.10 The log2 functions
+    Synopsis
+1           #include <math.h>
+            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 pole error may occur if the argument is zero.
+    Returns
+3   The log2 functions return log2 x.
+    7.12.6.11 The logb functions
+    Synopsis
+1           #include <math.h>
+            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 <= x x FLT_RADIX-logb(x) < FLT_RADIX
+    A domain error or pole error may occur if the argument is zero.
+    Returns
+3   The logb functions return the signed exponent of x.
+    7.12.6.12 The modf functions
+    Synopsis
+1           #include <math.h>
+            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
+[page 245]
+
+    floating-point format) in the object pointed to by iptr.
+    Returns
+3   The modf functions return the signed fractional part of value.
+    7.12.6.13 The scalbn and scalbln functions
+    Synopsis
+1          #include <math.h>
+           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 .
+    7.12.7 Power and absolute-value functions
+    7.12.7.1 The cbrt functions
+    Synopsis
+1          #include <math.h>
+           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 .
+
+
+
+
+[page 246]
+
+    7.12.7.2 The fabs functions
+    Synopsis
+1           #include <math.h>
+            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.
+    Returns
+3   The fabs functions return | x |.
+    7.12.7.3 The hypot functions
+    Synopsis
+1           #include <math.h>
+            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 .
+                               -
+                               -----
+    7.12.7.4 The pow functions
+    Synopsis
+1           #include <math.h>
+            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 pole error may occur if x is
+    zero and y is less than zero.
+
+
+
+
+[page 247]
+
+    Returns
+3   The pow functions return xy .
+    7.12.7.5 The sqrt functions
+    Synopsis
+1          #include <math.h>
+           double sqrt(double x);
+           float sqrtf(float x);
+           long double sqrtl(long double x);
+    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.
+                              -
+                              -
+    7.12.8 Error and gamma functions
+    7.12.8.1 The erf functions
+    Synopsis
+1          #include <math.h>
+           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
+3                                      2        x
+                                            (integral)       e-t dt.
+                                                      2
+    The erf functions return erf x =
+                                       sqrt:pi
+                                       -
+                                       -    0
+
+    7.12.8.2 The erfc functions
+    Synopsis
+1          #include <math.h>
+           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.
+[page 248]
+
+    Returns
+3                                                       2       (inf)
+                                                            (integral)       e-t dt.
+                                                                      2
+    The erfc functions return erfc x = 1 - erf x =
+                                                     sqrt:pi
+                                                     -
+                                                     -      x
+
+    7.12.8.3 The lgamma functions
+    Synopsis
+1           #include <math.h>
+            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 pole error may occur if x is a negative integer
+    or zero.
+    Returns
+3   The lgamma functions return loge | (Gamma)(x) |.
+    7.12.8.4 The tgamma functions
+    Synopsis
+1           #include <math.h>
+            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 pole error
+    may occur if x is a negative integer or zero. A range error occurs if the magnitude of x is
+    too large and may occur if the magnitude of x is too small.
+    Returns
+3   The tgamma functions return (Gamma)(x).
+
+
+
+
+[page 249]
+
+    7.12.9 Nearest integer functions
+    7.12.9.1 The ceil functions
+    Synopsis
+1          #include <math.h>
+           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.
+    Returns
+3   The ceil functions return [^x^], expressed as a floating-point number.
+    7.12.9.2 The floor functions
+    Synopsis
+1          #include <math.h>
+           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.
+    7.12.9.3 The nearbyint functions
+    Synopsis
+1          #include <math.h>
+           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.
+
+
+
+
+[page 250]
+
+    Returns
+3   The nearbyint functions return the rounded integer value.
+    7.12.9.4 The rint functions
+    Synopsis
+1           #include <math.h>
+            double rint(double x);
+            float rintf(float x);
+            long double rintl(long double x);
+    Description
+2   The rint functions differ from the nearbyint functions (7.12.9.3) only in that the
+    rint functions may raise the ''inexact'' floating-point exception if the result differs in
+    value from the argument.
+    Returns
+3   The rint functions return the rounded integer value.
+    7.12.9.5 The lrint and llrint functions
+    Synopsis
+1           #include <math.h>
+            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.
+
+
+
+
+[page 251]
+
+    7.12.9.6 The round functions
+    Synopsis
+1          #include <math.h>
+           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.
+    7.12.9.7 The lround and llround functions
+    Synopsis
+1          #include <math.h>
+           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.
+    7.12.9.8 The trunc functions
+    Synopsis
+1          #include <math.h>
+           double trunc(double x);
+           float truncf(float x);
+           long double truncl(long double x);
+
+
+[page 252]
+
+    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.
+    7.12.10 Remainder functions
+    7.12.10.1 The fmod functions
+    Synopsis
+1            #include <math.h>
+             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.
+    7.12.10.2 The remainder functions
+    Synopsis
+1            #include <math.h>
+             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.236)
+
+
+
+
+    236) ''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. If r = 0, its sign shall be that of x.'' This definition is applicable for *
+         all implementations.
+
+[page 253]
+
+    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.
+    7.12.10.3 The remquo functions
+    Synopsis
+1          #include <math.h>
+           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.
+    7.12.11 Manipulation functions
+    7.12.11.1 The copysign functions
+    Synopsis
+1          #include <math.h>
+           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.
+
+
+
+[page 254]
+
+    7.12.11.2 The nan functions
+    Synopsis
+1           #include <math.h>
+            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 (7.22.1.3).
+    7.12.11.3 The nextafter functions
+    Synopsis
+1           #include <math.h>
+            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.237) 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.
+
+
+    237) The argument values are converted to the type of the function, even by a macro implementation of the
+         function.
+
+[page 255]
+
+    7.12.11.4 The nexttoward functions
+    Synopsis
+1           #include <math.h>
+            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.238)
+    7.12.12 Maximum, minimum, and positive difference functions
+    7.12.12.1 The fdim functions
+    Synopsis
+1           #include <math.h>
+            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 > y
+          {
+          {+0     if x <= y
+    A range error may occur.
+    Returns
+3   The fdim functions return the positive difference value.
+    7.12.12.2 The fmax functions
+    Synopsis
+1           #include <math.h>
+            double fmax(double x, double y);
+            float fmaxf(float x, float y);
+            long double fmaxl(long double x, long double y);
+
+
+
+    238) 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.
+
+[page 256]
+
+    Description
+2   The fmax functions determine the maximum numeric value of their arguments.239)
+    Returns
+3   The fmax functions return the maximum numeric value of their arguments.
+    7.12.12.3 The fmin functions
+    Synopsis
+1           #include <math.h>
+            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.240)
+    Returns
+3   The fmin functions return the minimum numeric value of their arguments.
+    7.12.13 Floating multiply-add
+    7.12.13.1 The fma functions
+    Synopsis
+1           #include <math.h>
+            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.
+
+
+
+
+    239) 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 F.10.9.2.
+    240) The fmin functions are analogous to the fmax functions in their treatment of NaNs.
+
+[page 257]
+
+    7.12.14 Comparison macros
+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.241) 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 type242) (both arguments need not have the same type).243)
+    7.12.14.1 The isgreater macro
+    Synopsis
+1            #include <math.h>
+             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) > (y); however,
+    unlike (x) > (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) > (y).
+    7.12.14.2 The isgreaterequal macro
+    Synopsis
+1            #include <math.h>
+             int isgreaterequal(real-floating x, real-floating y);
+
+
+
+
+    241) 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.
+    242) If any argument is of integer type, or any other type that is not a real floating type, the behavior is
+         undefined.
+    243) Whether an argument represented in a format wider than its semantic type is converted to the semantic
+         type is unspecified.
+
+[page 258]
+
+    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) >= (y); however, unlike (x) >= (y), isgreaterequal(x, y) does
+    not raise the ''invalid'' floating-point exception when x and y are unordered.
+    Returns
+3   The isgreaterequal macro returns the value of (x) >= (y).
+    7.12.14.3 The isless macro
+    Synopsis
+1           #include <math.h>
+            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) < (y); however,
+    unlike (x) < (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) < (y).
+    7.12.14.4 The islessequal macro
+    Synopsis
+1           #include <math.h>
+            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) <= (y); however, unlike (x) <= (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) <= (y).
+
+
+
+
+[page 259]
+
+    7.12.14.5 The islessgreater macro
+    Synopsis
+1          #include <math.h>
+           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) < (y) || (x) > (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).
+    Returns
+3   The islessgreater macro returns the value of (x) < (y) || (x) > (y).
+    7.12.14.6 The isunordered macro
+    Synopsis
+1          #include <math.h>
+           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.
+
+
+
+
+[page 260]
+
+    7.13 Nonlocal jumps <setjmp.h>
+1   The header <setjmp.h> defines the macro setjmp, and declares one function and
+    one type, for bypassing the normal function call and return discipline.244)
+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.
+    7.13.1 Save calling environment
+    7.13.1.1 The setjmp macro
+    Synopsis
+1           #include <setjmp.h>
+            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
+
+
+    244) These functions are useful for dealing with unusual conditions encountered in a low-level function of
+         a program.
+
+[page 261]
+
+        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.
+    7.13.2 Restore calling environment
+    7.13.2.1 The longjmp function
+    Synopsis
+1            #include <setjmp.h>
+             _Noreturn 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 execution245) 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 machine246)
+    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.
+
+
+
+
+    245) 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.
+    246) This includes, but is not limited to, the floating-point status flags and the state of open files.
+
+[page 262]
+
+        #include <setjmp.h>
+        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
+        }
+
+
+
+
+[page 263]
+
+    7.14 Signal handling <signal.h>
+1   The header <signal.h> 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,247) 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.
+
+
+
+
+    247) See ''future library directions'' (7.30.6). The names of the signal numbers reflect the following terms
+         (respectively): abort, floating-point exception, illegal instruction, interrupt, segmentation violation,
+         and termination.
+
+[page 264]
+
+    7.14.1 Specify signal handling
+    7.14.1.1 The signal function
+    Synopsis
+1           #include <signal.h>
+            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),248) 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 or thread
+    storage duration that is not a lock-free atomic object 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, the
+    quick_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.249)
+
+
+    248) This includes functions called indirectly via standard library functions (e.g., a SIGABRT handler
+         called via the abort function).
+    249) If any signal is generated by an asynchronous signal handler, the behavior is undefined.
+
+[page 265]
+
+6   At program startup, the equivalent of
+           signal(sig, SIG_IGN);
+    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 (7.22.4.1), the exit function (7.22.4.4), the
+    _Exit function (7.22.4.5), the quick_exit function (7.22.4.7).
+    7.14.2 Send signal
+    7.14.2.1 The raise function
+    Synopsis
+1          #include <signal.h>
+           int raise(int sig);
+    Description
+2   The raise function carries out the actions described in 7.14.1.1 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.
+
+
+
+
+[page 266]
+
+    7.15 Alignment <stdalign.h>
+1   The header <stdalign.h> defines two macros.
+2   The macro
+            alignas
+    expands to _Alignas.
+3   The remaining macro is suitable for use in #if preprocessing directives. It is
+            __alignas_is_defined
+    which expands to the integer constant 1.
+
+
+
+
+[page 267]
+
+    7.16 Variable arguments <stdarg.h>
+1   The header <stdarg.h> 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 6.9.1, 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 a complete 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.250)
+    7.16.1 Variable argument list access macros
+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.
+    7.16.1.1 The va_arg macro
+    Synopsis
+1           #include <stdarg.h>
+            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
+
+    250) 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.
+
+[page 268]
+
+    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.
+    7.16.1.2 The va_copy macro
+    Synopsis
+1           #include <stdarg.h>
+            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.
+    7.16.1.3 The va_end macro
+    Synopsis
+1           #include <stdarg.h>
+            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
+
+[page 269]
+
+    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.
+    7.16.1.4 The va_start macro
+    Synopsis
+1           #include <stdarg.h>
+            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 <stdarg.h>
+            #define MAXARGS   31
+            void f1(int n_ptrs, ...)
+            {
+                  va_list ap;
+                  char *array[MAXARGS];
+                  int ptr_no = 0;
+
+
+
+
+[page 270]
+
+                      if (n_ptrs > MAXARGS)
+                            n_ptrs = MAXARGS;
+                      va_start(ap, n_ptrs);
+                      while (ptr_no < 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 <stdarg.h>
+             #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 > MAXARGS)
+                         n_ptrs = MAXARGS;
+                   va_start(ap, f4_after);
+                   while (ptr_no < 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 < n_ptrs)
+                            array[ptr_no++] = va_arg(ap_save, char *);
+                      va_end(ap_save);
+                      f4(n_ptrs, array);
+             }
+
+
+
+
+[page 271]
+
+    7.17 Atomics <stdatomic.h>
+    7.17.1 Introduction
+1   The header <stdatomic.h> defines several macros and declares several types and
+    functions for performing atomic operations on data shared between threads.
+2   Implementations that define the macro __STDC_NO_THREADS__ need not provide
+    this header nor support any of its facilities.
+3   The macros defined are the atomic lock-free macros
+           ATOMIC_CHAR_LOCK_FREE
+           ATOMIC_CHAR16_T_LOCK_FREE
+           ATOMIC_CHAR32_T_LOCK_FREE
+           ATOMIC_WCHAR_T_LOCK_FREE
+           ATOMIC_SHORT_LOCK_FREE
+           ATOMIC_INT_LOCK_FREE
+           ATOMIC_LONG_LOCK_FREE
+           ATOMIC_LLONG_LOCK_FREE
+           ATOMIC_ADDRESS_LOCK_FREE
+    which indicate the lock-free property of the corresponding atomic types (both signed and
+    unsigned); and
+           ATOMIC_FLAG_INIT
+    which expands to an initializer for an object of type atomic_flag.
+4   The types include
+           memory_order
+    which is an enumerated type whose enumerators identify memory ordering constraints;
+           atomic_flag
+    which is a structure type representing a lock-free, primitive atomic flag;
+           atomic_bool
+    which is a structure type representing the atomic analog of the type _Bool;
+           atomic_address
+    which is a structure type representing the atomic analog of a pointer type; and several
+    atomic analogs of integer types.
+5   In the following operation definitions:
+    -- An A refers to one of the atomic types.
+
+
+[page 272]
+
+    -- A C refers to its corresponding non-atomic type. The atomic_address atomic
+      type corresponds to the void * non-atomic type.
+    -- An M refers to the type of the other argument for arithmetic operations. For atomic
+      integer types, M is C. For atomic address types, M is ptrdiff_t.
+    -- The functions not ending in _explicit have the same semantics as the
+      corresponding _explicit function with memory_order_seq_cst for the
+      memory_order argument.
+6   NOTE Many operations are volatile-qualified. The ''volatile as device register'' semantics have not
+    changed in the standard. This qualification means that volatility is preserved when applying these
+    operations to volatile objects.
+
+    7.17.2 Initialization
+    7.17.2.1 The ATOMIC_VAR_INIT macro
+    Synopsis
+1           #include <stdatomic.h>
+            #define ATOMIC_VAR_INIT(C value)
+    Description
+2   The ATOMIC_VAR_INIT macro expands to a token sequence suitable for initializing an
+    atomic object of a type that is initialization-compatible with value. An atomic object
+    with automatic storage duration that is not explicitly initialized using
+    ATOMIC_VAR_INIT is initially in an indeterminate state; however, the default (zero)
+    initialization for objects with static or thread-local storage duration is guaranteed to
+    produce a valid state.
+3   Concurrent access to the variable being initialized, even via an atomic operation,
+    constitutes a data race.
+4   EXAMPLE
+            atomic_int guide = ATOMIC_VAR_INIT(42);
+
+    7.17.2.2 The atomic_init generic function
+    Synopsis
+1           #include <stdatomic.h>
+            void atomic_init(volatile A *obj, C value);
+    Description
+2   The atomic_init generic function initializes the atomic object pointed to by obj to
+    the value value, while also initializing any additional state that the implementation
+    might need to carry for the atomic object.
+
+
+
+[page 273]
+
+3   Although this function initializes an atomic object, it does not avoid data races;
+    concurrent access to the variable being initialized, even via an atomic operation,
+    constitutes a data race.
+    Returns
+4   The atomic_init generic function returns no value.
+5   EXAMPLE
+            atomic_int guide;
+            atomic_init(&guide, 42);
+
+    7.17.3 Order and consistency
+1   The enumerated type memory_order specifies the detailed regular (non-atomic)
+    memory synchronization operations as defined in 5.1.2.4 and may provide for operation
+    ordering. Its enumeration constants are as follows:
+            memory_order_relaxed
+            memory_order_consume
+            memory_order_acquire
+            memory_order_release
+            memory_order_acq_rel
+            memory_order_seq_cst
+2   For memory_order_relaxed, no operation orders memory.
+3   For       memory_order_release,       memory_order_acq_rel,             and
+    memory_order_seq_cst, a store operation performs a release operation on the
+    affected memory location.
+4   For       memory_order_acquire,       memory_order_acq_rel,             and
+    memory_order_seq_cst, a load operation performs an acquire operation on the
+    affected memory location.
+5   For memory_order_consume, a load operation performs a consume operation on the
+    affected memory location.
+6   For memory_order_seq_cst, there shall be a single total order S on all operations,
+    consistent with the ''happens before'' order and modification orders for all affected
+    locations, such that each memory_order_seq_cst operation that loads a value
+    observes either the last preceding modification according to this order S, or the result of
+    an operation that is not memory_order_seq_cst.
+7   NOTE 1 Although it is not explicitly required that S include lock operations, it can always be extended to
+    an order that does include lock and unlock operations, since the ordering between those is already included
+    in the ''happens before'' ordering.
+
+8   NOTE 2 Atomic operations specifying memory_order_relaxed are relaxed only with respect to
+    memory ordering. Implementations must still guarantee that any given atomic access to a particular atomic
+
+[page 274]
+
+     object be indivisible with respect to all other atomic accesses to that object.
+
+9    For an atomic operation B that reads the value of an atomic object M, if there is a
+     memory_order_seq_cst fence X sequenced before B, then B observes either the
+     last memory_order_seq_cst modification of M preceding X in the total order S or
+     a later modification of M in its modification order.
+10   For atomic operations A and B on an atomic object M, where A modifies M and B takes
+     its value, if there is a memory_order_seq_cst fence X such that A is sequenced
+     before X and B follows X in S, then B observes either the effects of A or a later
+     modification of M in its modification order.
+11   For atomic operations A and B on an atomic object M, where A modifies M and B takes
+     its value, if there are memory_order_seq_cst fences X and Y such that A is
+     sequenced before X, Y is sequenced before B, and X precedes Y in S, then B observes
+     either the effects of A or a later modification of M in its modification order.
+12   Atomic read-modify-write operations shall always read the last value (in the modification
+     order) stored before the write associated with the read-modify-write operation.
+13   An atomic store shall only store a value that has been computed from constants and
+     program input values by a finite sequence of program evaluations, such that each
+     evaluation observes the values of variables as computed by the last prior assignment in
+     the sequence.251) The ordering of evaluations in this sequence shall be such that
+     -- If an evaluation B observes a value computed by A in a different thread, then B does
+       not happen before A.
+     -- If an evaluation A is included in the sequence, then all evaluations that assign to the
+       same variable and happen before A are also included.
+14   NOTE 3 The second requirement disallows ''out-of-thin-air'', or ''speculative'' stores of atomics when
+     relaxed atomics are used. Since unordered operations are involved, evaluations may appear in this
+     sequence out of thread order. For example, with x and y initially zero,
+              // Thread 1:
+              r1 = atomic_load_explicit(&y, memory_order_relaxed);
+              atomic_store_explicit(&x, r1, memory_order_relaxed);
+
+              // Thread 2:
+              r2 = atomic_load_explicit(&x, memory_order_relaxed);
+              atomic_store_explicit(&y, 42, memory_order_relaxed);
+     is allowed to produce r1 == 42 && r2 == 42. The sequence of evaluations justifying this consists of:
+
+
+
+
+     251) Among other implications, atomic variables shall not decay.
+
+[page 275]
+
+             atomic_store_explicit(&y, 42,               memory_order_relaxed);
+             r1 = atomic_load_explicit(&y,               memory_order_relaxed);
+             atomic_store_explicit(&x, r1,               memory_order_relaxed);
+             r2 = atomic_load_explicit(&x,               memory_order_relaxed);
+     On the other hand,
+             // Thread 1:
+             r1 = atomic_load_explicit(&y, memory_order_relaxed);
+             atomic_store_explicit(&x, r1, memory_order_relaxed);
+
+             // Thread 2:
+             r2 = atomic_load_explicit(&x, memory_order_relaxed);
+             atomic_store_explicit(&y, r2, memory_order_relaxed);
+     is not allowed to produce r1 == 42 && r2 = 42, since there is no sequence of evaluations that results
+     in the computation of 42. In the absence of ''relaxed'' operations and read-modify-write operations with
+     weaker than memory_order_acq_rel ordering, the second requirement has no impact.
+
+     Recommended practice
+15   The requirements do not forbid r1 == 42 && r2 == 42 in the following example,
+     with x and y initially zero:
+             // Thread 1:
+             r1 = atomic_load_explicit(&x, memory_order_relaxed);
+             if (r1 == 42)
+                  atomic_store_explicit(&y, r1, memory_order_relaxed);
+
+             // Thread 2:
+             r2 = atomic_load_explicit(&y, memory_order_relaxed);
+             if (r2 == 42)
+                  atomic_store_explicit(&x, 42, memory_order_relaxed);
+     However, this is not useful behavior, and implementations should not allow it.
+16   Implementations should make atomic stores visible to atomic loads within a reasonable
+     amount of time.
+     7.17.3.1 The kill_dependency macro
+     Synopsis
+1            #include <stdatomic.h>
+             type kill_dependency(type y);
+     Description
+2    The kill_dependency macro terminates a dependency chain; the argument does not
+     carry a dependency to the return value.
+
+
+
+[page 276]
+
+    Returns
+3   The kill_dependency macro returns the value of y.
+    7.17.4 Fences
+1   This subclause introduces synchronization primitives called fences. Fences can have
+    acquire semantics, release semantics, or both. A fence with acquire semantics is called
+    an acquire fence; a fence with release semantics is called a release fence.
+2   A release fence A synchronizes with an acquire fence B if there exist atomic operations
+    X and Y , both operating on some atomic object M, such that A is sequenced before X, X
+    modifies M, Y is sequenced before B, and Y reads the value written by X or a value
+    written by any side effect in the hypothetical release sequence X would head if it were a
+    release operation.
+3   A release fence A synchronizes with an atomic operation B that performs an acquire
+    operation on an atomic object M if there exists an atomic operation X such that A is
+    sequenced before X, X modifies M, and B reads the value written by X or a value written
+    by any side effect in the hypothetical release sequence X would head if it were a release
+    operation.
+4   An atomic operation A that is a release operation on an atomic object M synchronizes
+    with an acquire fence B if there exists some atomic operation X on M such that X is
+    sequenced before B and reads the value written by A or a value written by any side effect
+    in the release sequence headed by A.
+    7.17.4.1 The atomic_thread_fence function
+    Synopsis
+1           #include <stdatomic.h>
+            void atomic_thread_fence(memory_order order);
+    Description
+2   Depending on the value of order, this operation:
+    -- has no effects, if order == memory_order_relaxed;
+    -- is an acquire fence, if order == memory_order_acquire or order ==
+      memory_order_consume;
+    -- is a release fence, if order == memory_order_release;
+    -- is both an acquire fence              and   a    release   fence,    if   order     ==
+      memory_order_acq_rel;
+    -- is a sequentially consistent acquire and release fence, if order                    ==
+      memory_order_seq_cst.
+
+
+[page 277]
+
+    Returns
+3   The atomic_thread_fence function returns no value.
+    7.17.4.2 The atomic_signal_fence function
+    Synopsis
+1           #include <stdatomic.h>
+            void atomic_signal_fence(memory_order order);
+    Description
+2   Equivalent to atomic_thread_fence(order), except that ''synchronizes with''
+    relationships are established only between a thread and a signal handler executed in the
+    same thread.
+3   NOTE 1 The atomic_signal_fence function can be used to specify the order in which actions
+    performed by the thread become visible to the signal handler.
+
+4   NOTE 2 Compiler optimizations and reorderings of loads and stores are inhibited in the same way as with
+    atomic_thread_fence, but the hardware fence instructions that atomic_thread_fence would
+    have inserted are not emitted.
+
+    Returns
+5   The atomic_signal_fence function returns no value.
+    7.17.5 Lock-free property
+1   The atomic lock-free macros indicate the lock-free property of integer and address atomic
+    types. A value of 0 indicates that the type is never lock-free; a value of 1 indicates that
+    the type is sometimes lock-free; a value of 2 indicates that the type is always lock-free.
+2   NOTE Operations that are lock-free should also be address-free. That is, atomic operations on the same
+    memory location via two different addresses will communicate atomically. The implementation should not
+    depend on any per-process state. This restriction enables communication via memory mapped into a
+    process more than once and memory shared between two processes.
+
+    7.17.5.1 The atomic_is_lock_free generic function
+    Synopsis
+1           #include <stdatomic.h>
+            _Bool atomic_is_lock_free(atomic_type const volatile *obj);
+    Description
+2   The atomic_is_lock_free generic function indicates whether or not the object
+    pointed to by obj is lock-free. atomic_type can be any atomic type.
+    Returns
+3   The atomic_is_lock_free generic function returns nonzero (true) if and only if the
+    object's operations are lock-free. The result of a lock-free query on one object cannot be
+
+[page 278]
+
+    inferred from the result of a lock-free query on another object.
+    7.17.6 Atomic integer and address types
+1   For each line in the following table, the atomic type name is declared as the
+    corresponding direct type.
+
+
+
+
+[page 279]
+
+               Atomic type name                              Direct type
+           atomic_char                           _Atomic    char
+           atomic_schar                          _Atomic    signed char
+           atomic_uchar                          _Atomic    unsigned char
+           atomic_short                          _Atomic    short
+           atomic_ushort                         _Atomic    unsigned short
+           atomic_int                            _Atomic    int
+           atomic_uint                           _Atomic    unsigned int
+           atomic_long                           _Atomic    long
+           atomic_ulong                          _Atomic    unsigned long
+           atomic_llong                          _Atomic    long long
+           atomic_ullong                         _Atomic    unsigned long long
+           atomic_char16_t                       _Atomic    char16_t
+           atomic_char32_t                       _Atomic    char32_t
+           atomic_wchar_t                        _Atomic    wchar_t
+           atomic_int_least8_t                   _Atomic    int_least8_t
+           atomic_uint_least8_t                  _Atomic    uint_least8_t
+           atomic_int_least16_t                  _Atomic    int_least16_t
+           atomic_uint_least16_t                 _Atomic    uint_least16_t
+           atomic_int_least32_t                  _Atomic    int_least32_t
+           atomic_uint_least32_t                 _Atomic    uint_least32_t
+           atomic_int_least64_t                  _Atomic    int_least64_t
+           atomic_uint_least64_t                 _Atomic    uint_least64_t
+           atomic_int_fast8_t                    _Atomic    int_fast8_t
+           atomic_uint_fast8_t                   _Atomic    uint_fast8_t
+           atomic_int_fast16_t                   _Atomic    int_fast16_t
+           atomic_uint_fast16_t                  _Atomic    uint_fast16_t
+           atomic_int_fast32_t                   _Atomic    int_fast32_t
+           atomic_uint_fast32_t                  _Atomic    uint_fast32_t
+           atomic_int_fast64_t                   _Atomic    int_fast64_t
+           atomic_uint_fast64_t                  _Atomic    uint_fast64_t
+           atomic_intptr_t                       _Atomic    intptr_t
+           atomic_uintptr_t                      _Atomic    uintptr_t
+           atomic_size_t                         _Atomic    size_t
+           atomic_ptrdiff_t                      _Atomic    ptrdiff_t
+           atomic_intmax_t                       _Atomic    intmax_t
+           atomic_uintmax_t                      _Atomic    uintmax_t
+2   The semantics of the operations on these types are defined in 7.17.7.
+3   The atomic_bool type provides an atomic boolean.
+
+
+[page 280]
+
+4   The atomic_address type provides atomic void * operations. The unit of
+    addition/subtraction shall be one byte.
+5   NOTE The representation of atomic integer and address types need not have the same size as their
+    corresponding regular types. They should have the same size whenever possible, as it eases effort required
+    to port existing code.
+
+    7.17.7 Operations on atomic types
+1   There are only a few kinds of operations on atomic types, though there are many
+    instances of those kinds. This subclause specifies each general kind.
+    7.17.7.1 The atomic_store generic functions
+    Synopsis
+1           #include <stdatomic.h>
+            void atomic_store(volatile A *object, C desired);
+            void atomic_store_explicit(volatile A *object,
+                 C desired, memory_order order);
+    Description
+2   The      order      argument    shall    not    be    memory_order_acquire,
+    memory_order_consume, nor memory_order_acq_rel. Atomically replace the
+    value pointed to by object with the value of desired. Memory is affected according
+    to the value of order.
+    Returns
+3   The atomic_store generic functions return no value.
+    7.17.7.2 The atomic_load generic functions
+    Synopsis
+1           #include <stdatomic.h>
+            C atomic_load(volatile A *object);
+            C atomic_load_explicit(volatile A *object,
+                 memory_order order);
+    Description
+2   The order argument shall not be memory_order_release nor
+    memory_order_acq_rel. Memory is affected according to the value of order.
+    Returns
+    Atomically returns the value pointed to by object.
+
+
+
+
+[page 281]
+
+    7.17.7.3 The atomic_exchange generic functions
+    Synopsis
+1            #include <stdatomic.h>
+             C atomic_exchange(volatile A *object, C desired);
+             C atomic_exchange_explicit(volatile A *object,
+                  C desired, memory_order order);
+    Description
+2   Atomically replace the value pointed to by object with desired. Memory is affected
+    according to the value of order. These operations are read-modify-write operations
+    (5.1.2.4).
+    Returns
+3   Atomically returns the value pointed to by object immediately before the effects.
+    7.17.7.4 The atomic_compare_exchange generic functions
+    Synopsis
+1            #include <stdatomic.h>
+             _Bool atomic_compare_exchange_strong(volatile A *object,
+                  C *expected, C desired);
+             _Bool atomic_compare_exchange_strong_explicit(
+                  volatile A *object, C *expected, C desired,
+                  memory_order success, memory_order failure);
+             _Bool atomic_compare_exchange_weak(volatile A *object,
+                  C *expected, C desired);
+             _Bool atomic_compare_exchange_weak_explicit(
+                  volatile A *object, C *expected, C desired,
+                  memory_order success, memory_order failure);
+    Description
+2   The failure argument shall not be memory_order_release nor
+    memory_order_acq_rel. The failure argument shall be no stronger than the
+    success argument. Atomically, compares the value pointed to by object for equality
+    with that in expected, and if true, replaces the value pointed to by object with
+    desired, and if false, updates the value in expected with the value pointed to by
+    object. Further, if the comparison is true, memory is affected according to the value of
+    success, and if the comparison is false, memory is affected according to the value of
+    failure. These operations are atomic read-modify-write operations (5.1.2.4).
+3   NOTE 1    The effect of the compare-and-exchange operations is
+
+
+
+
+[page 282]
+
+             if (*object == *expected)
+                   *object = desired;
+             else
+                   *expected = *object;
+
+4   The weak compare-and-exchange operations may fail spuriously, that is, return zero
+    while leaving the value pointed to by expected unchanged.
+5   NOTE 2 This spurious failure enables implementation of compare-and-exchange on a broader class of
+    machines, e.g. load-locked store-conditional machines.
+
+6   EXAMPLE         A consequence of spurious failure is that nearly all uses of weak compare-and-exchange will
+    be in a loop.
+             exp = atomic_load(&cur);
+             do {
+                   des = function(exp);
+             } while (!atomic_compare_exchange_weak(&cur, &exp, des));
+    When a compare-and-exchange is in a loop, the weak version will yield better performance on some
+    platforms. When a weak compare-and-exchange would require a loop and a strong one would not, the
+    strong one is preferable.
+
+    Returns
+7   The result of the comparison.
+    7.17.7.5 The atomic_fetch and modify generic functions
+1   The following operations perform arithmetic and bitwise computations. All of these
+    operations are applicable to an object of any atomic integer type. Only addition and
+    subtraction are applicable to atomic_address. None of these operations is applicable
+    to atomic_bool. The key, operator, and computation correspondence is:
+     key            op          computation
+     add            +       addition
+     sub            -       subtraction
+     or             |       bitwise inclusive or
+     xor            ^       bitwise exclusive or
+     and            &       bitwise and
+    Synopsis
+2            #include <stdatomic.h>
+             C atomic_fetch_key(volatile A *object, M operand);
+             C atomic_fetch_key_explicit(volatile A *object,
+                  M operand, memory_order order);
+    Description
+3   Atomically replaces the value pointed to by object with the result of the computation
+    applied to the value pointed to by object and the given operand. Memory is affected
+    according to the value of order. These operations are atomic read-modify-write
+[page 283]
+
+    operations (5.1.2.4). For signed integer types, arithmetic is defined to use two's
+    complement representation with silent wrap-around on overflow; there are no undefined
+    results. For address types, the result may be an undefined address, but the operations
+    otherwise have no undefined behavior.
+    Returns
+4   Atomically, the value pointed to by object immediately before the effects.
+5   NOTE The operation of the atomic_fetch and modify generic functions are nearly equivalent to the
+    operation of the corresponding op= compound assignment operators. The only differences are that the
+    compound assignment operators are not guaranteed to operate atomically, and the value yielded by a
+    compound assignment operator is the updated value of the object, whereas the value returned by the
+    atomic_fetch and modify generic functions is the previous value of the atomic object.
+
+    7.17.8 Atomic flag type and operations
+1   The atomic_flag type provides the classic test-and-set functionality. It has two
+    states, set and clear.
+2   Operations on an object of type atomic_flag shall be lock free.
+3   NOTE Hence the operations should also be address-free. No other type requires lock-free operations, so
+    the atomic_flag type is the minimum hardware-implemented type needed to conform to this
+    International standard. The remaining types can be emulated with atomic_flag, though with less than
+    ideal properties.
+
+4   The macro ATOMIC_FLAG_INIT may be used to initialize an atomic_flag to the
+    clear state. An atomic_flag that is not explicitly initialized with
+    ATOMIC_FLAG_INIT is initially in an indeterminate state.
+5   EXAMPLE
+            atomic_flag guard = ATOMIC_FLAG_INIT;
+
+    7.17.8.1 The atomic_flag_test_and_set functions
+    Synopsis
+1           #include <stdatomic.h>
+            bool atomic_flag_test_and_set(
+                 volatile atomic_flag *object);
+            bool atomic_flag_test_and_set_explicit(
+                 volatile atomic_flag *object, memory_order order);
+    Description
+2   Atomically sets the value pointed to by object to true. Memory is affected according
+    to the value of order. These operations are atomic read-modify-write operations
+    (5.1.2.4).
+
+
+
+
+[page 284]
+
+    Returns
+3   Atomically, the value of the object immediately before the effects.
+    7.17.8.2 The atomic_flag_clear functions
+    Synopsis
+1           #include <stdatomic.h>
+            void atomic_flag_clear(volatile atomic_flag *object);
+            void atomic_flag_clear_explicit(
+                 volatile atomic_flag *object, memory_order order);
+    Description
+2   The order argument shall not be memory_order_acquire nor
+    memory_order_acq_rel. Atomically sets the value pointed to by object to false.
+    Memory is affected according to the value of order.
+    Returns
+3   The atomic_flag_clear functions return no value.
+
+
+
+
+[page 285]
+
+    7.18 Boolean type and values <stdbool.h>
+1   The header <stdbool.h> 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 7.1.3, a program may undefine and perhaps then
+    redefine the macros bool, true, and false.252)
+
+
+
+
+    252) See ''future library directions'' (7.30.7).
+
+[page 286]
+
+    7.19 Common definitions <stddef.h>
+1   The header <stddef.h> defines the following macros and declares the following types.
+    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;
+            max_align_t
+    which is an object type whose alignment is as great as is supported by the implementation
+    in all contexts; 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 &(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.
+
+[page 287]
+
+Forward references: localization (7.11).
+
+
+
+
+[page 288]
+
+    7.20 Integer types <stdint.h>
+1   The header <stdint.h> declares sets of integer types having specified widths, and
+    defines corresponding sets of macros.253) 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,254) <stdint.h> shall
+    declare that typedef name and define the associated macros. Conversely, for each type
+    described herein that the implementation does not provide, <stdint.h> 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'').
+    7.20.1 Integer types
+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 6.2.5; 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).
+
+
+
+
+    253) See ''future library directions'' (7.30.8).
+    254) Some of these types may denote implementation-defined extended integer types.
+
+[page 289]
+
+    7.20.1.1 Exact-width integer types
+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 such 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 and no
+    padding bits. Thus, uint24_t denotes such 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.
+    7.20.1.2 Minimum-width integer types
+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.
+    7.20.1.3 Fastest minimum-width integer types
+1   Each of the following types designates an integer type that is usually fastest255) 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 .
+
+
+
+
+    255) 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.
+
+[page 290]
+
+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.
+    7.20.1.4 Integer types capable of holding object pointers
+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.
+    7.20.1.5 Greatest-width integer types
+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.
+    7.20.2 Limits of specified-width integer types
+1   The following object-like macros specify the minimum and maximum limits of the types *
+    declared in <stdint.h>. Each macro name corresponds to a similar type name in
+    7.20.1.
+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
+    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.
+
+[page 291]
+
+    7.20.2.1 Limits of exact-width integer types
+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
+    7.20.2.2 Limits of minimum-width integer types
+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
+    7.20.2.3 Limits of fastest minimum-width integer types
+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
+    7.20.2.4 Limits of integer types capable of holding object pointers
+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
+    -- maximum value of pointer-holding unsigned integer type
+       UINTPTR_MAX                                          216 - 1
+
+
+
+[page 292]
+
+    7.20.2.5 Limits of greatest-width integer types
+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
+    7.20.3 Limits of other integer types
+1   The following object-like macros 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.256)
+    -- 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
+        WCHAR_MIN                                                   see below
+        WCHAR_MAX                                                   see below
+    -- limits of wint_t
+
+
+
+
+    256) A freestanding implementation need not provide all of these types.
+
+[page 293]
+
+        WINT_MIN                                              see below
+        WINT_MAX                                              see below
+3   If sig_atomic_t (see 7.14) 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 7.19) 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.257)
+5   If wint_t (see 7.28) 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.
+    7.20.4 Macros for integer constants
+1   The following function-like macros expand to integer constants suitable for initializing *
+    objects that have integer types corresponding to types defined in <stdint.h>. Each
+    macro name corresponds to a similar type name in 7.20.1.2 or 7.20.1.5.
+2   The argument in any instance of these macros shall be an unsuffixed integer constant (as
+    defined in 6.4.4.1) 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.
+    7.20.4.1 Macros for minimum-width integer constants
+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.
+
+
+
+
+    257) The values WCHAR_MIN and WCHAR_MAX do not necessarily correspond to members of the extended
+         character set.
+
+[page 294]
+
+    7.20.4.2 Macros for greatest-width integer constants
+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)
+
+
+
+
+[page 295]
+
+    7.21 Input/output <stdio.h>
+    7.21.1 Introduction
+1   The header <stdio.h> defines several macros, and declares three types and many
+    functions for performing input and output.
+2   The types declared are size_t (described in 7.19);
+           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 a complete 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 7.19);
+           _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
+
+
+
+[page 296]
+
+    guarantees can be opened;258)
+            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 minimum 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 <wchar.h> 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 7.21.3.
+5   The input/output functions are given the following collective terms:
+    -- The wide character input functions -- those functions described in 7.28 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 7.28 that perform
+      output from wide characters and wide strings: fputwc, fputws, putwc,
+      putwchar, fwprintf, wprintf, vfwprintf, and vwprintf.
+
+
+    258) 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.
+
+[page 297]
+
+    -- 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, printf, putc, putchar, puts, scanf, *
+      ungetc, vfprintf, vfscanf, vprintf, and vscanf.
+    Forward references: files (7.21.3), the fseek function (7.21.9.2), streams (7.21.2), the
+    tmpnam function (7.21.4.4), <wchar.h> (7.28).
+    7.21.2 Streams
+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.259)
+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
+
+
+    259) 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.
+
+[page 298]
+
+    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.)260)
+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 (7.21.5.4), the fwide function (7.28.3.5),
+    mbstate_t (7.29.1), the fgetpos function (7.21.9.1), the fsetpos function
+    (7.21.9.3).
+
+
+
+
+    260) The three predefined streams stdin, stdout, and stderr are unoriented at program startup.
+
+[page 299]
+
+    7.21.3 Files
+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 7.21.5.3. 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.
+
+[page 300]
+
+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.261)
+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)
+
+
+     261) 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.
+
+[page 301]
+
+     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 (7.22.4.4), the fgetc function (7.21.7.1), the
+     fopen function (7.21.5.3), the fputc function (7.21.7.3), the setbuf function
+     (7.21.5.5), the setvbuf function (7.21.5.6), the fgetwc function (7.28.3.1), the
+     fputwc function (7.28.3.3), conversion state (7.28.6), the mbrtowc function
+     (7.28.6.3.2), the wcrtomb function (7.28.6.3.3).
+     7.21.4 Operations on files
+     7.21.4.1 The remove function
+     Synopsis
+1           #include <stdio.h>
+            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.
+     7.21.4.2 The rename function
+     Synopsis
+1           #include <stdio.h>
+            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.
+
+
+
+
+[page 302]
+
+    Returns
+3   The rename function returns zero if the operation succeeds, nonzero if it fails,262) in
+    which case if the file existed previously it is still known by its original name.
+    7.21.4.3 The tmpfile function
+    Synopsis
+1           #include <stdio.h>
+            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 (7.21.5.3).
+    7.21.4.4 The tmpnam function
+    Synopsis
+1           #include <stdio.h>
+            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.263) The function is potentially capable of generating at
+
+
+    262) 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.
+    263) 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.
+
+[page 303]
+
+    least 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   Calls to the tmpnam function with a null pointer argument may introduce data races with
+    each other. 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.
+    7.21.5 File access functions
+    7.21.5.1 The fclose function
+    Synopsis
+1          #include <stdio.h>
+           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.
+
+
+
+
+[page 304]
+
+    7.21.5.2 The fflush function
+    Synopsis
+1           #include <stdio.h>
+            int fflush(FILE *stream);
+    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 (7.21.5.3).
+    7.21.5.3 The fopen function
+    Synopsis
+1           #include <stdio.h>
+            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.264)
+    r                     open text file for reading
+    w                     truncate to zero length or create text file for writing
+    wx                    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
+
+
+    264) 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 7.21.2).
+
+[page 305]
+
+    wbx               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
+    w+x               create text file for update
+    a+                append; open or create text file for update, writing at end-of-file
+    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
+    w+bx or wb+x      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 exclusive mode ('x' as the last character in the mode argument)
+    fails if the file already exists or cannot be created. Otherwise, the file is created with
+    exclusive (also known as non-shared) access to the extent that the underlying system
+    supports exclusive access.
+6   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.
+7   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.
+8   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
+9   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 (7.21.9).
+
+
+
+[page 306]
+
+    7.21.5.4 The freopen function
+    Synopsis
+1           #include <stdio.h>
+            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
+    as in the fopen function.265)
+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.
+    7.21.5.5 The setbuf function
+    Synopsis
+1           #include <stdio.h>
+            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.
+
+
+
+
+    265) 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.
+
+[page 307]
+
+    Returns
+3   The setbuf function returns no value.
+    Forward references: the setvbuf function (7.21.5.6).
+    7.21.5.6 The setvbuf function
+    Synopsis
+1           #include <stdio.h>
+            int setvbuf(FILE * restrict stream,
+                 char * restrict buf,
+                 int mode, size_t size);
+    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 function266) 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.
+
+
+
+
+    266) 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.
+
+[page 308]
+
+    7.21.6 Formatted input/output functions
+1   The formatted input/output functions shall behave as if there is a sequence point after the
+    actions associated with each specifier.267)
+    7.21.6.1 The fprintf function
+    Synopsis
+1            #include <stdio.h>
+             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
+    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.268)
+    -- 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
+
+
+    267) The fprintf functions perform writes to memory for the %n specifier.
+    268) Note that 0 is taken as a flag, not as the beginning of a field width.
+
+[page 309]
+
+        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
+            specified.)269)
+    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
+
+
+    269) The results of all floating conversions of a negative zero, and of negative values that round to zero,
+         include a minus sign.
+
+[page 310]
+
+              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.
+    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.
+
+
+[page 311]
+
+    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.
+    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.270)
+    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
+
+
+    270) When applied to infinite and NaN values, the -, +, and space flag characters have their usual meaning;
+         the # and 0 flag characters have no effect.
+
+[page 312]
+
+              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 > X >= -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 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 character271) 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
+
+
+
+
+271) 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.
+
+[page 313]
+
+              distinguish272) 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.273) Characters from the array are
+              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
+
+272) The precision p is sufficient to distinguish values of the source type if 16 p-1 > 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.
+273) No special provisions are made for multibyte characters.
+
+[page 314]
+
+                    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.274)
+     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.275) 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.276) 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 < U, both having DECIMAL_DIG significant digits; the value
+
+
+     274) Redundant shift sequences may result if multibyte characters have a state-dependent encoding.
+     275) See ''future library directions'' (7.30.9).
+     276) 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.
+
+[page 315]
+
+     of the resultant decimal string D should satisfy L <= D <= 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 <math.h>
+              #include <stdio.h>
+              /* ... */
+              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.
+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", &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 (7.28.6), the wcrtomb function (7.28.6.3.3).
+
+
+
+[page 316]
+
+    7.21.6.2 The fscanf function
+    Synopsis
+1           #include <stdio.h>
+            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).
+    -- 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. When all directives
+    have been executed, or 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
+
+[page 317]
+
+     following steps:
+8    Input white-space characters (as specified by the isspace function) are skipped, unless
+     the specification includes a [, c, or n specifier.277)
+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.278)
+     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
+     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.
+
+
+
+     277) These white-space characters are not counted against a specified field width.
+     278) 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.
+
+[page 318]
+
+     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.
+     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.
+
+
+[page 319]
+
+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).279)
+              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.279)
+              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.
+[             Matches a nonempty sequence of characters from a set of expected characters
+              (the scanset).279)
+              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
+
+279) 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.
+
+[page 320]
+
+                    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.
+     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.280)
+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.
+
+
+
+     280) See ''future library directions'' (7.30.9).
+
+[page 321]
+
+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 the first conversion (if any) has completed. 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 <stdio.h>
+              /* ... */
+              int n, i; float x; char name[50];
+              n = fscanf(stdin, "%d%f%s", &i, &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 <stdio.h>
+              /* ... */
+              int i; float x; char name[50];
+              fscanf(stdin, "%2d%f%*d %[0123456789]", &i, &x, name);
+     with input:
+              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 <stdio.h>
+              /* ... */
+              int count; float quant; char units[21], item[21];
+              do {
+                      count = fscanf(stdin, "%f%20s of %20s", &quant, units, item);
+                      fscanf(stdin,"%*[^\n]");
+              } while (!feof(stdin) && !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
+
+[page 322]
+
+     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 <stdio.h>
+               /* ... */
+               int d1, d2, n1, n2, i;
+               i = sscanf("123", "%d%n%n%d", &d1, &n1, &n2, &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:
+               #include <stdio.h>
+               /* ... */
+               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 <stdio.h>
+               #include <stddef.h>
+               /* ... */
+               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:
+
+
+
+
+[page 323]
+
+             #include <stdio.h>
+             #include <stddef.h>
+             /* ... */
+             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 <stdio.h>
+             #include <stddef.h>
+             /* ... */
+             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 (7.22.1.3), the
+     strtol, strtoll, strtoul, and strtoull functions (7.22.1.4), conversion state
+     (7.28.6), the wcrtomb function (7.28.6.3.3).
+     7.21.6.3 The printf function
+     Synopsis
+1            #include <stdio.h>
+             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.
+     7.21.6.4 The scanf function
+     Synopsis
+1            #include <stdio.h>
+             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.
+
+
+
+[page 324]
+
+    Returns
+3   The scanf function returns the value of the macro EOF if an input failure occurs before
+    the first conversion (if any) has completed. 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.
+    7.21.6.5 The snprintf function
+    Synopsis
+1           #include <stdio.h>
+            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.
+    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.
+    7.21.6.6 The sprintf function
+    Synopsis
+1           #include <stdio.h>
+            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.
+
+[page 325]
+
+    7.21.6.7 The sscanf function
+    Synopsis
+1          #include <stdio.h>
+           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 the first conversion (if any) has completed. 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.
+    7.21.6.8 The vfprintf function
+    Synopsis
+1          #include <stdarg.h>
+           #include <stdio.h>
+           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.281)
+    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.
+
+
+
+
+    281) 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.
+
+[page 326]
+
+            #include <stdarg.h>
+            #include <stdio.h>
+            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);
+            }
+
+    7.21.6.9 The vfscanf function
+    Synopsis
+1           #include <stdarg.h>
+            #include <stdio.h>
+            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.281)
+    Returns
+3   The vfscanf function returns the value of the macro EOF if an input failure occurs
+    before the first conversion (if any) has completed. 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.
+    7.21.6.10 The vprintf function
+    Synopsis
+1           #include <stdarg.h>
+            #include <stdio.h>
+            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
+
+[page 327]
+
+    possibly subsequent va_arg calls). The vprintf function does not invoke the
+    va_end macro.281)
+    Returns
+3   The vprintf function returns the number of characters transmitted, or a negative value
+    if an output or encoding error occurred.
+    7.21.6.11 The vscanf function
+    Synopsis
+1          #include <stdarg.h>
+           #include <stdio.h>
+           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.281)
+    Returns
+3   The vscanf function returns the value of the macro EOF if an input failure occurs
+    before the first conversion (if any) has completed. 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.
+    7.21.6.12 The vsnprintf function
+    Synopsis
+1          #include <stdarg.h>
+           #include <stdio.h>
+           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.281) If copying takes place between objects that overlap, the behavior is
+    undefined.
+
+
+
+[page 328]
+
+    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.
+    7.21.6.13 The vsprintf function
+    Synopsis
+1           #include <stdarg.h>
+            #include <stdio.h>
+            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.281) 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.
+    7.21.6.14 The vsscanf function
+    Synopsis
+1           #include <stdarg.h>
+            #include <stdio.h>
+            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.281)
+    Returns
+3   The vsscanf function returns the value of the macro EOF if an input failure occurs
+    before the first conversion (if any) has completed. Otherwise, the vsscanf function
+[page 329]
+
+    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.
+    7.21.7 Character input/output functions
+    7.21.7.1 The fgetc function
+    Synopsis
+1           #include <stdio.h>
+            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.282)
+    7.21.7.2 The fgets function
+    Synopsis
+1           #include <stdio.h>
+            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.
+
+    282) An end-of-file and a read error can be distinguished by use of the feof and ferror functions.
+
+[page 330]
+
+    7.21.7.3 The fputc function
+    Synopsis
+1           #include <stdio.h>
+            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.
+    7.21.7.4 The fputs function
+    Synopsis
+1           #include <stdio.h>
+            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.
+    7.21.7.5 The getc function
+    Synopsis
+1           #include <stdio.h>
+            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.
+
+
+
+
+[page 331]
+
+    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.
+    7.21.7.6 The getchar function
+    Synopsis
+1          #include <stdio.h>
+           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.                                                                       *
+    7.21.7.7 The putc function
+    Synopsis
+1          #include <stdio.h>
+           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.
+    7.21.7.8 The putchar function
+    Synopsis
+1          #include <stdio.h>
+           int putchar(int c);
+    Description
+2   The putchar function is equivalent to putc with the second argument stdout.
+
+
+[page 332]
+
+    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.
+    7.21.7.9 The puts function
+    Synopsis
+1           #include <stdio.h>
+            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.
+    7.21.7.10 The ungetc function
+    Synopsis
+1           #include <stdio.h>
+            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.
+
+[page 333]
+
+    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.283)
+    Returns
+6   The ungetc function returns the character pushed back after conversion, or EOF if the
+    operation fails.
+    Forward references: file positioning functions (7.21.9).
+    7.21.8 Direct input/output functions
+    7.21.8.1 The fread function
+    Synopsis
+1            #include <stdio.h>
+             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.
+
+
+
+
+    283) See ''future library directions'' (7.30.9).
+
+[page 334]
+
+    7.21.8.2 The fwrite function
+    Synopsis
+1           #include <stdio.h>
+            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.
+    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.
+    7.21.9 File positioning functions
+    7.21.9.1 The fgetpos function
+    Synopsis
+1           #include <stdio.h>
+            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 (7.21.9.3).
+
+
+
+
+[page 335]
+
+    7.21.9.2 The fseek function
+    Synopsis
+1          #include <stdio.h>
+           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.
+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 (7.21.9.4).
+    7.21.9.3 The fsetpos function
+    Synopsis
+1          #include <stdio.h>
+           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
+
+[page 336]
+
+    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.
+    7.21.9.4 The ftell function
+    Synopsis
+1           #include <stdio.h>
+            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
+    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.
+    7.21.9.5 The rewind function
+    Synopsis
+1           #include <stdio.h>
+            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.
+
+
+
+
+[page 337]
+
+    7.21.10 Error-handling functions
+    7.21.10.1 The clearerr function
+    Synopsis
+1          #include <stdio.h>
+           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.
+    7.21.10.2 The feof function
+    Synopsis
+1          #include <stdio.h>
+           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.
+    7.21.10.3 The ferror function
+    Synopsis
+1          #include <stdio.h>
+           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.
+
+
+
+
+[page 338]
+
+    7.21.10.4 The perror function
+    Synopsis
+1           #include <stdio.h>
+            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 (7.23.6.2).
+
+
+
+
+[page 339]
+
+    7.22 General utilities <stdlib.h>
+1   The header <stdlib.h> declares five types and several functions of general utility, and
+    defines several macros.284)
+2   The types declared are size_t and wchar_t (both described in 7.19),
+             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 7.19);
+             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.
+
+
+
+
+    284) See ''future library directions'' (7.30.10).
+
+[page 340]
+
+    7.22.1 Numeric conversion functions
+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.
+    7.22.1.1 The atof function
+    Synopsis
+1           #include <stdlib.h>
+            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 (7.22.1.3).
+    7.22.1.2 The atoi, atol, and atoll functions
+    Synopsis
+1           #include <stdlib.h>
+            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
+    (7.22.1.4).
+
+
+
+[page 341]
+
+    7.22.1.3 The strtod, strtof, and strtold functions
+    Synopsis
+1          #include <stdlib.h>
+           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 6.4.4.2;
+    -- 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 6.4.4.2;
+    -- 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 6.4.4.2, except that the
+[page 342]
+
+    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.285)
+    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.286) 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
+    <float.h>) 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 <= D <= 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
+
+    285) 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 F.5); 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.
+    286) An implementation may use the n-char sequence to determine extra information to be represented in
+         the NaN's significand.
+
+[page 343]
+
+     stipulation that the error with respect to D should have a correct sign for the current
+     rounding direction.287)
+     Returns
+10   The functions return the converted value, if any. If no conversion could be performed,
+     zero is returned. If the correct value overflows and default rounding is in effect (7.12.1),
+     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 (7.12.1), 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.
+     7.22.1.4 The strtol, strtoll, strtoul, and strtoull functions
+     Synopsis
+1            #include <stdlib.h>
+             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
+
+
+     287) DECIMAL_DIG, defined in <float.h>, 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.
+
+[page 344]
+
+    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 6.4.4.1, 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 6.4.4.1. 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.
+
+
+
+
+[page 345]
+
+    7.22.2 Pseudo-random sequence generation functions
+    7.22.2.1 The rand function
+    Synopsis
+1           #include <stdlib.h>
+            int rand(void);
+    Description
+2   The rand function computes a sequence of pseudo-random integers in the range 0 to
+    RAND_MAX.288)
+3   The rand function is not required to avoid data races. 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.
+    7.22.2.2 The srand function
+    Synopsis
+1           #include <stdlib.h>
+            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.
+
+
+
+
+    288) There are no guarantees as to the quality of the random sequence produced and some implementations
+         are known to produce sequences with distressingly non-random low-order bits. Applications with
+         particular requirements should use a generator that is known to be sufficient for their needs.
+
+[page 346]
+
+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
+            {
+                  next = next * 1103515245 + 12345;
+                  return (unsigned int)(next/65536) % 32768;
+            }
+            void srand(unsigned int seed)
+            {
+                  next = seed;
+            }
+
+    7.22.3 Memory management functions
+1   The order and contiguity of storage allocated by successive calls to the
+    aligned_alloc, 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 with a fundamental alignment requirement 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.
+    7.22.3.1 The aligned_alloc function
+    Synopsis
+1           #include <stdlib.h>
+            void *aligned_alloc(size_t alignment, size_t size);
+    Description
+2   The aligned_alloc function allocates space for an object whose alignment is
+    specified by alignment, whose size is specified by size, and whose value is
+    indeterminate. The value of alignment shall be a valid alignment supported by the
+    implementation and the value of size shall be an integral multiple of alignment.
+    Returns
+3   The aligned_alloc function returns either a null pointer or a pointer to the allocated
+    space.
+
+
+
+
+[page 347]
+
+    7.22.3.2 The calloc function
+    Synopsis
+1           #include <stdlib.h>
+            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.289)
+    Returns
+3   The calloc function returns either a null pointer or a pointer to the allocated space.
+    7.22.3.3 The free function
+    Synopsis
+1           #include <stdlib.h>
+            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 a memory management
+    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.
+    7.22.3.4 The malloc function
+    Synopsis
+1           #include <stdlib.h>
+            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.
+
+
+
+
+    289) Note that this need not be the same as the representation of floating-point zero or a null pointer
+         constant.
+
+[page 348]
+
+    Returns
+3   The malloc function returns either a null pointer or a pointer to the allocated space.
+    7.22.3.5 The realloc function
+    Synopsis
+1           #include <stdlib.h>
+            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 a memory
+    management 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.
+    7.22.4 Communication with the environment
+    7.22.4.1 The abort function
+    Synopsis
+1           #include <stdlib.h>
+            _Noreturn 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).
+
+
+
+
+[page 349]
+
+    Returns
+3   The abort function does not return to its caller.
+    7.22.4.2 The atexit function
+    Synopsis
+1          #include <stdlib.h>
+           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.290)
+    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 at_quick_exit function (7.22.4.3), the exit function
+    (7.22.4.4).
+    7.22.4.3 The at_quick_exit function
+    Synopsis
+1          #include <stdlib.h>
+           int at_quick_exit(void (*func)(void));
+    Description
+2   The at_quick_exit function registers the function pointed to by func, to be called
+    without arguments should quick_exit be called.291)
+    Environmental limits
+3   The implementation shall support the registration of at least 32 functions.
+    Returns
+4   The at_quick_exit function returns zero if the registration succeeds, nonzero if it
+    fails.
+    Forward references: the quick_exit function (7.22.4.7).
+
+
+    290) The atexit function registrations are distinct from the at_quick_exit registrations, so
+         applications may need to call both registration functions with the same argument.
+    291) The at_quick_exit function registrations are distinct from the atexit registrations, so
+         applications may need to call both registration functions with the same argument.
+
+[page 350]
+
+    7.22.4.4 The exit function
+    Synopsis
+1           #include <stdlib.h>
+            _Noreturn void exit(int status);
+    Description
+2   The exit function causes normal program termination to occur. No functions registered
+    by the at_quick_exit function are called. If a program calls the exit function
+    more than once, or calls the quick_exit function in addition to the exit function, the
+    behavior is undefined.
+3   First, all functions registered by the atexit function are called, in the reverse order of
+    their registration,292) 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.
+    7.22.4.5 The _Exit function
+    Synopsis
+1           #include <stdlib.h>
+            _Noreturn 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, the
+    at_quick_exit 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
+
+
+    292) Each function is called as many times as it was registered, and in the correct order with respect to
+         other registered functions.
+
+[page 351]
+
+    the exit function (7.22.4.4). 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.
+    7.22.4.6 The getenv function
+    Synopsis
+1           #include <stdlib.h>
+            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. The
+    getenv function need not avoid data races with other threads of execution that modify
+    the environment list.293)
+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.
+    7.22.4.7 The quick_exit function
+    Synopsis
+1           #include <stdlib.h>
+            _Noreturn void quick_exit(int status);
+    Description
+2   The quick_exit function causes normal program termination to occur. No functions
+    registered by the atexit function or signal handlers registered by the signal function
+    are called. If a program calls the quick_exit function more than once, or calls the
+    exit function in addition to the quick_exit function, the behavior is undefined.
+3   The quick_exit function first calls all functions registered by the at_quick_exit
+    function, in the reverse order of their registration,294) except that a function is called after
+
+
+    293) Many implementations provide non-standard functions that modify the environment list.
+
+[page 352]
+
+    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   Then control is returned to the host environment by means of the function call
+    _Exit(status).
+    Returns
+5   The quick_exit function cannot return to its caller.
+    7.22.4.8 The system function
+    Synopsis
+1           #include <stdlib.h>
+            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.
+    7.22.5 Searching and sorting utilities
+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 7.1.4.
+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.295) The first argument when called from bsearch
+    shall equal key.
+
+
+
+    294) Each function is called as many times as it was registered, and in the correct order with respect to
+         other registered functions.
+
+[page 353]
+
+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.
+    7.22.5.1 The bsearch function
+    Synopsis
+1            #include <stdlib.h>
+             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
+    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.296)
+    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
+
+
+    295) That is, if the value passed is p, then the following expressions are always nonzero:
+                  ((char *)p - (char *)base) % size == 0
+                  (char *)p >= (char *)base
+                  (char *)p < (char *)base + nmemb * size
+
+    296) In practice, the entire array is sorted according to the comparison function.
+
+[page 354]
+
+    matched is unspecified.
+    7.22.5.2 The qsort function
+    Synopsis
+1           #include <stdlib.h>
+            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.
+    7.22.6 Integer arithmetic functions
+    7.22.6.1 The abs, labs and llabs functions
+    Synopsis
+1           #include <stdlib.h>
+            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.297)
+    Returns
+3   The abs, labs, and llabs, functions return the absolute value.
+
+
+
+
+    297) The absolute value of the most negative number cannot be represented in two's complement.
+
+[page 355]
+
+    7.22.6.2 The div, ldiv, and lldiv functions
+    Synopsis
+1            #include <stdlib.h>
+             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.
+    7.22.7 Multibyte/wide character conversion functions
+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 at program startup and can be returned to that 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.298) Changing the LC_CTYPE
+    category causes the conversion state of these functions to be indeterminate.
+    7.22.7.1 The mblen function
+    Synopsis
+1            #include <stdlib.h>
+             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
+
+
+
+    298) 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.
+
+[page 356]
+
+            mbtowc((wchar_t *)0, (const char *)0, 0);
+            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 (7.22.7.2).
+    7.22.7.2 The mbtowc function
+    Synopsis
+1           #include <stdlib.h>
+            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.
+
+
+[page 357]
+
+    7.22.7.3 The wctomb function
+    Synopsis
+1          #include <stdlib.h>
+           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.
+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.
+    7.22.8 Multibyte/wide string conversion functions
+1   The behavior of the multibyte string functions is affected by the LC_CTYPE category of
+    the current locale.
+    7.22.8.1 The mbstowcs function
+    Synopsis
+1          #include <stdlib.h>
+           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
+[page 358]
+
+    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.299)
+    7.22.8.2 The wcstombs function
+    Synopsis
+1            #include <stdlib.h>
+             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.299)
+
+
+
+
+    299) The array will not be null-terminated if the value returned is n.
+
+[page 359]
+
+    7.23 String handling <string.h>
+    7.23.1 String function conventions
+1   The header <string.h> 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.300) The type is size_t and the macro is NULL (both described in
+    7.19). 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.
+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 7.1.4. 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).
+    7.23.2 Copying functions
+    7.23.2.1 The memcpy function
+    Synopsis
+1            #include <string.h>
+             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.
+
+
+
+
+    300) See ''future library directions'' (7.30.11).
+
+[page 360]
+
+    7.23.2.2 The memmove function
+    Synopsis
+1           #include <string.h>
+            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.
+    7.23.2.3 The strcpy function
+    Synopsis
+1           #include <string.h>
+            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.
+    7.23.2.4 The strncpy function
+    Synopsis
+1           #include <string.h>
+            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
+
+
+
+
+[page 361]
+
+    s1.301) 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.
+    7.23.3 Concatenation functions
+    7.23.3.1 The strcat function
+    Synopsis
+1            #include <string.h>
+             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.
+    7.23.3.2 The strncat function
+    Synopsis
+1            #include <string.h>
+             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.302) If copying
+
+    301) 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.
+    302) Thus, the maximum number of characters that can end up in the array pointed to by s1 is
+         strlen(s1)+n+1.
+
+[page 362]
+
+    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 (7.23.6.3).
+    7.23.4 Comparison functions
+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.
+    7.23.4.1 The memcmp function
+    Synopsis
+1           #include <string.h>
+            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.303)
+    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.
+    7.23.4.2 The strcmp function
+    Synopsis
+1           #include <string.h>
+            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
+
+    303) 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.
+
+[page 363]
+
+    pointed to by s2.
+    7.23.4.3 The strcoll function
+    Synopsis
+1          #include <string.h>
+           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.
+    7.23.4.4 The strncmp function
+    Synopsis
+1          #include <string.h>
+           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.
+    7.23.4.5 The strxfrm function
+    Synopsis
+1          #include <string.h>
+           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
+
+[page 364]
+
+    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)
+
+    7.23.5 Search functions
+    7.23.5.1 The memchr function
+    Synopsis
+1           #include <string.h>
+            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. The implementation shall behave as if it reads the characters sequentially
+    and stops as soon as a matching character is found.
+    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.
+    7.23.5.2 The strchr function
+    Synopsis
+1           #include <string.h>
+            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.
+
+
+
+[page 365]
+
+    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.
+    7.23.5.3 The strcspn function
+    Synopsis
+1          #include <string.h>
+           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.
+    7.23.5.4 The strpbrk function
+    Synopsis
+1          #include <string.h>
+           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.
+    7.23.5.5 The strrchr function
+    Synopsis
+1          #include <string.h>
+           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.
+
+
+
+
+[page 366]
+
+    Returns
+3   The strrchr function returns a pointer to the character, or a null pointer if c does not
+    occur in the string.
+    7.23.5.6 The strspn function
+    Synopsis
+1           #include <string.h>
+            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.
+    7.23.5.7 The strstr function
+    Synopsis
+1           #include <string.h>
+            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.
+    7.23.5.8 The strtok function
+    Synopsis
+1           #include <string.h>
+            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.
+[page 367]
+
+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
+    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 strtok function is not required to avoid data races. 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 <string.h>
+           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
+
+    7.23.6 Miscellaneous functions
+    7.23.6.1 The memset function
+    Synopsis
+1          #include <string.h>
+           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.
+
+
+
+[page 368]
+
+    7.23.6.2 The strerror function
+    Synopsis
+1           #include <string.h>
+            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 strerror function is not required to avoid data races. 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.
+    7.23.6.3 The strlen function
+    Synopsis
+1           #include <string.h>
+            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.
+
+
+
+
+[page 369]
+
+    7.24 Type-generic math <tgmath.h>
+1   The header <tgmath.h> includes the headers <math.h> and <complex.h> and
+    defines several type-generic macros.
+2   Of the <math.h> and <complex.h> 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.304) 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.305)
+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 <math.h> for which there is a function in
+    <complex.h> 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 <math.h>. The
+    corresponding type-generic macro for fabs and cabs is fabs.
+
+
+
+
+    304) Like other function-like macros in Standard libraries, each type-generic macro can be suppressed to
+         make available the corresponding ordinary function.
+    305) If the type of the argument is not compatible with the type of the parameter for the selected function,
+         the behavior is undefined.
+
+[page 370]
+
+             <math.h>         <complex.h>              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 <math.h> without a c-prefixed counterpart in
+    <complex.h> (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.
+
+
+
+
+[page 371]
+
+6   For each unsuffixed function in <complex.h> that is not a c-prefixed counterpart to a
+    function in <math.h>, the corresponding type-generic macro has the same name as the
+    function. These type-generic macros are:
+           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 <tgmath.h>
+            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)
+
+
+
+
+[page 372]
+
+    7.25 Threads <threads.h>
+    7.25.1 Introduction
+1   The header <threads.h> defines macros, and declares types, enumeration constants,
+    and functions that support multiple threads of execution.
+2   Implementations that define the macro __STDC_NO_THREADS__ need not provide
+    this header nor support any of its facilities.
+3   The macros are
+            ONCE_FLAG_INIT
+    which expands to a value that can be used to initialize an object of type once_flag;
+    and
+            TSS_DTOR_ITERATIONS
+    which expands to an integer constant expression representing the maximum number of
+    times that destructors will be called when a thread terminates.
+4   The types are
+            cnd_t
+    which is a complete object type that holds an identifier for a condition variable;
+            thrd_t
+    which is a complete object type that holds an identifier for a thread;
+            tss_t
+    which is a complete object type that holds an identifier for a thread-specific storage
+    pointer;
+            mtx_t
+    which is a complete object type that holds an identifier for a mutex;
+            tss_dtor_t
+    which is the function pointer type void (*)(void*), used for a destructor for a
+    thread-specific storage pointer;
+            thrd_start_t
+    which is the function pointer type int (*)(void*) that is passed to thrd_create
+    to create a new thread;
+            once_flag
+    which is a complete object type that holds a flag for use by call_once; and
+
+
+[page 373]
+
+           xtime
+    which is a structure type that holds a time specified in seconds and nanoseconds. The
+    structure shall contain at least the following members, in any order.
+           time_t sec;
+           long nsec;
+5   The enumeration constants are
+           mtx_plain
+    which is passed to mtx_init to create a mutex object that supports neither timeout nor
+    test and return;
+           mtx_recursive
+    which is passed to mtx_init to create a mutex object that supports recursive locking;
+           mtx_timed
+    which is passed to mtx_init to create a mutex object that supports timeout;
+           mtx_try
+    which is passed to mtx_init to create a mutex object that supports test and return;
+           thrd_timeout
+    which is returned by a timed wait function to indicate that the time specified in the call
+    was reached without acquiring the requested resource;
+           thrd_success
+    which is returned by a function to indicate that the requested operation succeeded;
+           thrd_busy
+    which is returned by a function to indicate that the requested operation failed because a
+    resource requested by a test and return function is already in use;
+           thrd_error
+    which is returned by a function to indicate that the requested operation failed; and
+           thrd_nomem
+    which is returned by a function to indicate that the requested operation failed because it
+    was unable to allocate memory.
+
+
+
+
+[page 374]
+
+    7.25.2 Initialization functions
+    7.25.2.1 The call_once function
+    Synopsis
+1           #include <threads.h>
+            void call_once(once_flag *flag, void (*func)(void));
+    Description
+2   The call_once function uses the once_flag pointed to by flag to ensure that
+    func is called exactly once, the first time the call_once function is called with that
+    value of flag. Completion of an effective call to the call_once function synchronizes
+    with all subsequent calls to the call_once function with the same value of flag.
+    Returns
+3   The call_once function returns no value.
+    7.25.3 Condition variable functions
+    7.25.3.1 The cnd_broadcast function
+    Synopsis
+1           #include <threads.h>
+            int cnd_broadcast(cnd_t *cond);
+    Description
+2   The cnd_broadcast function unblocks all of the threads that are blocked on the
+    condition variable pointed to by cond at the time of the call. If no threads are blocked
+    on the condition variable pointed to by cond at the time of the call, the function does
+    nothing.
+    Returns
+3   The cnd_broadcast function returns thrd_success on success, or thrd_error
+    if the request could not be honored.
+    7.25.3.2 The cnd_destroy function
+    Synopsis
+1           #include <threads.h>
+            void cnd_destroy(cnd_t *cond);
+    Description
+2   The cnd_destroy function releases all resources used by the condition variable
+    pointed to by cond. The cnd_destroy function requires that no threads be blocked
+    waiting for the condition variable pointed to by cond.
+
+[page 375]
+
+    Returns
+3   The cnd_destroy function returns no value.
+    7.25.3.3 The cnd_init function
+    Synopsis
+1          #include <threads.h>
+           int cnd_init(cnd_t *cond);
+    Description
+2   The cnd_init function creates a condition variable. If it succeeds it sets the variable
+    pointed to by cond to a value that uniquely identifies the newly created condition
+    variable. A thread that calls cnd_wait on a newly created condition variable will
+    block.
+    Returns
+3   The cnd_init function returns thrd_success on success, or thrd_nomem if no
+    memory could be allocated for the newly created condition, or thrd_error if the
+    request could not be honored.
+    7.25.3.4 The cnd_signal function
+    Synopsis
+1          #include <threads.h>
+           int cnd_signal(cnd_t *cond);
+    Description
+2   The cnd_signal function unblocks one of the threads that are blocked on the
+    condition variable pointed to by cond at the time of the call. If no threads are blocked
+    on the condition variable at the time of the call, the function does nothing and return
+    success.
+    Returns
+3   The cnd_signal function returns thrd_success on success or thrd_error if
+    the request could not be honored.
+    7.25.3.5 The cnd_timedwait function
+    Synopsis
+1          #include <threads.h>
+           int cnd_timedwait(cnd_t *cond, mtx_t *mtx,
+                const xtime *xt);
+
+
+
+
+[page 376]
+
+    Description
+2   The cnd_timedwait function atomically unlocks the mutex pointed to by mtx and
+    endeavors to block until the condition variable pointed to by cond is signaled by a call to
+    cnd_signal or to cnd_broadcast, or until after the time specified by the xtime
+    object pointed to by xt. When the calling thread becomes unblocked it locks the variable
+    pointed to by mtx before it returns. The cnd_timedwait function requires that the
+    mutex pointed to by mtx be locked by the calling thread.
+    Returns
+3   The cnd_timedwait function returns thrd_success upon success, or
+    thrd_timeout if the time specified in the call was reached without acquiring the
+    requested resource, or thrd_error if the request could not be honored.
+    7.25.3.6 The cnd_wait function
+    Synopsis
+1           #include <threads.h>
+            int cnd_wait(cnd_t *cond, mtx_t *mtx);
+    Description
+2   The cnd_wait function atomically unlocks the mutex pointed to by mtx and endeavors
+    to block until the condition variable pointed to by cond is signaled by a call to
+    cnd_signal or to cnd_broadcast. When the calling thread becomes unblocked it
+    locks the mutex pointed to by mtx before it returns. If the mutex pointed to by mtx is
+    not locked by the calling thread, the cnd_wait function will act as if the abort
+    function is called.
+    Returns
+3   The cnd_wait function returns thrd_success on success or thrd_error if the
+    request could not be honored.
+    7.25.4 Mutex functions
+    7.25.4.1 The mtx_destroy function
+    Synopsis
+1           #include <threads.h>
+            void mtx_destroy(mtx_t *mtx);
+    Description
+2   The mtx_destroy function releases any resources used by the mutex pointed to by
+    mtx. No threads can be blocked waiting for the mutex pointed to by mtx.
+
+
+
+[page 377]
+
+    Returns
+3   The mtx_destroy function returns no value.
+    7.25.4.2 The mtx_init function
+    Synopsis
+1          #include <threads.h>
+           int mtx_init(mtx_t *mtx, int type);
+    Description
+2   The mtx_init function creates a mutex object with properties indicated by type,
+    which must have one of the six values:
+    mtx_plain for a simple non-recursive mutex,
+    mtx_timed for a non-recursive mutex that supports timeout,
+    mtx_try      for a non-recursive mutex that supports test and return,
+    mtx_plain | mtx_recursive for a simple recursive mutex,
+    mtx_timed | mtx_recursive for a recursive mutex that supports timeout, or
+    mtx_try | mtx_recursive for a recursive mutex that supports test and return.
+3   If the mtx_init function succeeds, it sets the mutex pointed to by mtx to a value that
+    uniquely identifies the newly created mutex.
+    Returns
+4   The mtx_init function returns thrd_success on success, or thrd_error if the
+    request could not be honored.
+    7.25.4.3 The mtx_lock function
+    Synopsis
+1          #include <threads.h>
+           int mtx_lock(mtx_t *mtx);
+    Description
+2   The mtx_lock function blocks until it locks the mutex pointed to by mtx. If the mutex
+    is non-recursive, it shall not be locked by the calling thread. Prior calls to mtx_unlock
+    on the same mutex shall synchronize with this operation.
+    Returns
+3   The mtx_lock function returns thrd_success on success, or thrd_busy if the
+    resource requested is already in use, or thrd_error if the request could not be
+    honored.
+
+
+
+
+[page 378]
+
+    7.25.4.4 The mtx_timedlock function
+    Synopsis
+1           #include <threads.h>
+            int mtx_timedlock(mtx_t *mtx, const xtime *xt);
+    Description
+2   The mtx_timedlock function endeavors to block until it locks the mutex pointed to by
+    mtx or until the time specified by the xtime object xt has passed. The specified mutex
+    shall support timeout. If the operation succeeds, prior calls to mtx_unlock on the same
+    mutex shall synchronize with this operation.
+    Returns
+3   The mtx_timedlock function returns thrd_success on success, or thrd_busy
+    if the resource requested is already in use, or thrd_timeout if the time specified was
+    reached without acquiring the requested resource, or thrd_error if the request could
+    not be honored.
+    7.25.4.5 The mtx_trylock function
+    Synopsis
+1           #include <threads.h>
+            int mtx_trylock(mtx_t *mtx);
+    Description
+2   The mtx_trylock function endeavors to lock the mutex pointed to by mtx. The
+    specified mutex shall support either test and return or timeout. If the mutex is already
+    locked, the function returns without blocking. If the operation succeeds, prior calls to
+    mtx_unlock on the same mutex shall synchronize with this operation.
+    Returns
+3   The mtx_trylock function returns thrd_success on success, or thrd_busy if
+    the resource requested is already in use, or thrd_error if the request could not be
+    honored.
+    7.25.4.6 The mtx_unlock function
+    Synopsis
+1           #include <threads.h>
+            int mtx_unlock(mtx_t *mtx);
+    Description
+2   The mtx_unlock function unlocks the mutex pointed to by mtx. The mutex pointed to
+    by mtx shall be locked by the calling thread.
+
+[page 379]
+
+    Returns
+3   The mtx_unlock function returns thrd_success on success or thrd_error if
+    the request could not be honored.
+    7.25.5 Thread functions
+    7.25.5.1 The thrd_create function
+    Synopsis
+1          #include <threads.h>
+           int thrd_create(thrd_t *thr, thrd_start_t func,
+                void *arg);
+    Description
+2   The thrd_create function creates a new thread executing func(arg). If the
+    thrd_create function succeeds, it sets the object pointed to by thr to the identifier of
+    the newly created thread. (A thread's identifier may be reused for a different thread once
+    the original thread has exited and either been detached or joined to another thread.) The
+    completion of the thrd_create function synchronizes with the beginning of the
+    execution of the new thread.
+    Returns
+3   The thrd_create function returns thrd_success on success, or thrd_nomem if
+    no memory could be allocated for the thread requested, or thrd_error if the request
+    could not be honored.
+    7.25.5.2 The thrd_current function
+    Synopsis
+1          #include <threads.h>
+           thrd_t thrd_current(void);
+    Description
+2   The thrd_current function identifies the thread that called it.
+    Returns
+3   The thrd_current function returns the identifier of the thread that called it.
+    7.25.5.3 The thrd_detach function
+    Synopsis
+1          #include <threads.h>
+           int thrd_detach(thrd_t thr);
+
+
+
+[page 380]
+
+    Description
+2   The thrd_detach function tells the operating system to dispose of any resources
+    allocated to the thread identified by thr when that thread terminates. The thread
+    identified by thr shall not have been previously detached or joined with another thread.
+    Returns
+3   The thrd_detach function returns thrd_success on success or thrd_error if
+    the request could not be honored.
+    7.25.5.4 The thrd_equal function
+    Synopsis
+1           #include <threads.h>
+            int thrd_equal(thrd_t thr0, thrd_t thr1);
+    Description
+2   The thrd_equal function will determine whether the thread identified by thr0 refers
+    to the thread identified by thr1.
+    Returns
+3   The thrd_equal function returns zero if the thread thr0 and the thread thr1 refer to
+    different threads. Otherwise the thrd_equal function returns a nonzero value.
+    7.25.5.5 The thrd_exit function
+    Synopsis
+1           #include <threads.h>
+            void thrd_exit(int res);
+    Description
+2   The thrd_exit function terminates execution of the calling thread and sets its result
+    code to res.
+    Returns
+3   The thrd_exit function returns no value.
+    7.25.5.6 The thrd_join function
+    Synopsis
+1           #include <threads.h>
+            int thrd_join(thrd_t thr, int *res);
+    Description
+2   The thrd_join function joins the thread identified by thr with the current thread by
+    blocking until the other thread has terminated. If the parameter res is not a null pointer,
+
+[page 381]
+
+    it stores the thread's result code in the integer pointed to by res. The termination of the
+    other thread synchronizes with the completion of the thrd_join function. The thread
+    identified by thr shall not have been previously detached or joined with another thread.
+    Returns
+3   The thrd_join function returns thrd_success on success or thrd_error if the
+    request could not be honored.
+    7.25.5.7 The thrd_sleep function
+    Synopsis
+1          #include <threads.h>
+           void thrd_sleep(const xtime *xt);
+    Description
+2   The thrd_sleep function suspends execution of the calling thread until after the time
+    specified by the xtime object pointed to by xt.
+    Returns
+3   The thrd_sleep function returns no value.
+    7.25.5.8 The thrd_yield function
+    Synopsis
+1          #include <threads.h>
+           void thrd_yield(void);
+    Description
+2   The thrd_yield function endeavors to permit other threads to run, even if the current
+    thread would ordinarily continue to run.
+    Returns
+3   The thrd_yield function returns no value.
+    7.25.6 Thread-specific storage functions
+    7.25.6.1 The tss_create function
+    Synopsis
+1          #include <threads.h>
+           int tss_create(tss_t *key, tss_dtor_t dtor);
+    Description
+2   The tss_create function creates a thread-specific storage pointer with destructor
+    dtor, which may be null.
+
+
+[page 382]
+
+    Returns
+3   If the tss_create function is successful, it sets the thread-specific storage pointed to
+    by key to a value that uniquely identifies the newly created pointer and returns
+    thrd_success; otherwise, thrd_error is returned and the thread-specific storage
+    pointed to by key is set to an undefined value.
+    7.25.6.2 The tss_delete function
+    Synopsis
+1           #include <threads.h>
+            void tss_delete(tss_t key);
+    Description
+2   The tss_delete function releases any resources used by the thread-specific storage
+    identified by key.
+    Returns
+3   The tss_delete function returns no value.
+    7.25.6.3 The tss_get function
+    Synopsis
+1           #include <threads.h>
+            void *tss_get(tss_t key);
+    Description
+2   The tss_get function returns the value for the current thread held in the thread-specific
+    storage identified by key.
+    Returns
+3   The tss_get function returns the value for the current thread if successful, or zero if
+    unsuccessful.
+    7.25.6.4 The tss_set function
+    Synopsis
+1           #include <threads.h>
+            int tss_set(tss_t key, void *val);
+    Description
+2   The tss_set function sets the value for the current thread held in the thread-specific
+    storage identified by key to val.
+
+
+
+
+[page 383]
+
+    Returns
+3   The tss_set function returns thrd_success on success or thrd_error if the
+    request could not be honored.
+    7.25.7 Time functions
+    7.25.7.1 The xtime_get function
+    Synopsis
+1           #include <threads.h>
+            int xtime_get(xtime *xt, int base);
+    Description
+2   The xtime_get function sets the xtime object pointed to by xt to hold the current
+    time based on the time base base.
+    Returns
+3   If the xtime_get function is successful it returns the nonzero value base, which must
+    be TIME_UTC; otherwise, it returns zero.306)
+
+
+
+
+    306) Although an xtime object describes times with nanosecond resolution, the actual resolution in an
+         xtime object is system dependent.
+
+[page 384]
+
+    7.26 Date and time <time.h>
+    7.26.1 Components of time
+1   The header <time.h> 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 7.19); 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 7.19);
+            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.307)
+            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
+
+
+
+    307) The range [0, 60] for tm_sec allows for a positive leap second.
+
+[page 385]
+
+    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.
+    7.26.2 Time manipulation functions
+    7.26.2.1 The clock function
+    Synopsis
+1           #include <time.h>
+            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).308)
+    7.26.2.2 The difftime function
+    Synopsis
+1           #include <time.h>
+            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.
+
+
+
+
+    308) 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.
+
+[page 386]
+
+    7.26.2.3 The mktime function
+    Synopsis
+1           #include <time.h>
+            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.309) 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 <stdio.h>
+            #include <time.h>
+            static const char *const wday[] = {
+                    "Sunday", "Monday", "Tuesday", "Wednesday",
+                    "Thursday", "Friday", "Saturday", "-unknown-"
+            };
+            struct tm time_str;
+            /* ... */
+
+
+
+
+    309) 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.
+
+[page 387]
+
+           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(&time_str) == (time_t)(-1))
+                 time_str.tm_wday = 7;
+           printf("%s\n", wday[time_str.tm_wday]);
+
+    7.26.2.4 The time function
+    Synopsis
+1          #include <time.h>
+           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.
+    7.26.3 Time conversion functions
+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 and the functions are not required to avoid data races. The
+    implementation shall behave as if no other library functions call these functions.
+    7.26.3.1 The asctime function
+    Synopsis
+1          #include <time.h>
+           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
+
+[page 388]
+
+    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"
+         };
+         static char result[26];
+            sprintf(result, "%.3s %.3s%3d %.2d:%.2d:%.2d %d\n",
+                 wday_name[timeptr->tm_wday],
+                 mon_name[timeptr->tm_mon],
+                 timeptr->tm_mday, timeptr->tm_hour,
+                 timeptr->tm_min, timeptr->tm_sec,
+                 1900 + timeptr->tm_year);
+            return result;
+    }
+3   If any of the fields of the broken-down time contain values that are outside their normal
+    ranges,310) the behavior of the asctime function is undefined. Likewise, if the
+    calculated year exceeds four digits or is less than the year 1000, the behavior is
+    undefined.
+    Returns
+4   The asctime function returns a pointer to the string.
+    7.26.3.2 The ctime function
+    Synopsis
+1           #include <time.h>
+            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))
+
+
+
+    310) See 7.26.1.
+
+[page 389]
+
+    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 (7.26.3.4).
+    7.26.3.3 The gmtime function
+    Synopsis
+1          #include <time.h>
+           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.
+    7.26.3.4 The localtime function
+    Synopsis
+1          #include <time.h>
+           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.
+    7.26.3.5 The strftime function
+    Synopsis
+1          #include <time.h>
+           size_t strftime(char * restrict s,
+                size_t maxsize,
+                const char * restrict format,
+                const struct tm * restrict timeptr);
+
+
+
+
+[page 390]
+
+    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
+    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 7.26.1]
+    %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.
+
+[page 391]
+
+    %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]
+    %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 7.26.1]
+    %X    is replaced by the locale's appropriate time representation. [all specified in 7.26.1]
+    %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.
+
+[page 392]
+
+    %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.
+    %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''.
+[page 393]
+
+    %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.
+    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.
+
+
+
+
+[page 394]
+
+    7.27 Unicode utilities <uchar.h>
+1   The header <uchar.h> declares types and functions for manipulating Unicode
+    characters.
+2   The types declared are mbstate_t (described in 7.29.1) and size_t (described in
+    7.19);
+            char16_t
+    which is an unsigned integer type used for 16-bit characters and is the same type as
+    uint_least16_t (described in 7.20.1.2); and
+            char32_t
+    which is an unsigned integer type used for 32-bit characters and is the same type as
+    uint_least32_t (also described in 7.20.1.2).
+    7.27.1 Restartable multibyte/wide character conversion functions
+1   These functions have a 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, which the functions alter as necessary. 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 functions are not required
+    to avoid data races in this case. The implementation behaves as if no library function
+    calls these functions with a null pointer for ps.
+    7.27.1.1 The mbrtoc16 function
+    Synopsis
+1           #include <uchar.h>
+            size_t mbrtoc16(char16_t * restrict pc16,
+                 const char * restrict s, size_t n,
+                 mbstate_t * restrict ps);
+    Description
+2   If s is a null pointer, the mbrtoc16 function is equivalent to the call:
+                   mbrtoc16(NULL, "", 1, ps)
+    In this case, the values of the parameters pc16 and n are ignored.
+3   If s is not a null pointer, the mbrtoc16 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 values of the
+    corresponding wide characters and then, if pc16 is not a null pointer, stores the value of
+    the first (or only) such character in the object pointed to by pc16. Subsequent calls will
+[page 395]
+
+    store successive wide characters without consuming any additional input until all the
+    characters have been stored. If the corresponding wide character is the null wide
+    character, the resulting state described is the initial conversion state.
+    Returns
+4   The mbrtoc16 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)(-3) if the next character resulting from a previous call has been stored (no
+                 bytes from the input have been consumed by this call).
+    (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).311)
+    (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.
+    7.27.1.2 The c16rtomb function
+    Synopsis
+1           #include <uchar.h>
+            size_t c16rtomb(char * restrict s, char16_t c16,
+                 mbstate_t * restrict ps);
+    Description
+2   If s is a null pointer, the c16rtomb function is equivalent to the call
+                    c16rtomb(buf, L'\0', ps)
+    where buf is an internal buffer.
+3   If s is not a null pointer, the c16rtomb function determines the number of bytes needed
+    to represent the multibyte character that corresponds to the wide character given by c16
+    (including any shift sequences), and stores the multibyte character representation in the
+
+
+    311) 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).
+
+[page 396]
+
+    array whose first element is pointed to by s. At most MB_CUR_MAX bytes are stored. If
+    c16 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 c16rtomb function returns the number of bytes stored in the array object (including
+    any shift sequences). When c16 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.
+    7.27.1.3 The mbrtoc32 function
+    Synopsis
+1           #include <uchar.h>
+            size_t mbrtoc32(char32_t * restrict pc32,
+                 const char * restrict s, size_t n,
+                 mbstate_t * restrict ps);
+    Description
+2   If s is a null pointer, the mbrtoc32 function is equivalent to the call:
+                    mbrtoc32(NULL, "", 1, ps)
+    In this case, the values of the parameters pc32 and n are ignored.
+3   If s is not a null pointer, the mbrtoc32 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 values of the
+    corresponding wide characters and then, if pc32 is not a null pointer, stores the value of
+    the first (or only) such character in the object pointed to by pc32. Subsequent calls will
+    store successive wide characters without consuming any additional input until all the
+    characters have been stored. If the corresponding wide character is the null wide
+    character, the resulting state described is the initial conversion state.
+    Returns
+4   The mbrtoc32 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.
+
+
+[page 397]
+
+    (size_t)(-3) if the next character resulting from a previous call has been stored (no
+                 bytes from the input have been consumed by this call).
+    (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).312)
+    (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.
+    7.27.1.4 The c32rtomb function
+    Synopsis
+1           #include <uchar.h>
+            size_t c32rtomb(char * restrict s, char32_t c32,
+                 mbstate_t * restrict ps);
+    Description
+2   If s is a null pointer, the c32rtomb function is equivalent to the call
+                    c32rtomb(buf, L'\0', ps)
+    where buf is an internal buffer.
+3   If s is not a null pointer, the c32rtomb function determines the number of bytes needed
+    to represent the multibyte character that corresponds to the wide character given by c32
+    (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
+    c32 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 c32rtomb function returns the number of bytes stored in the array object (including
+    any shift sequences). When c32 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.
+
+
+
+
+    312) 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).
+
+[page 398]
+
+    7.28 Extended multibyte and wide character utilities <wchar.h>
+    7.28.1 Introduction
+1   The header <wchar.h> defines four macros, and declares four data types, one tag, and
+    many functions.313)
+2   The types declared are wchar_t and size_t (both described in 7.19);
+              mbstate_t
+    which is a complete 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);314) and
+             struct tm
+    which is declared as an incomplete structure type (the contents are described in 7.26.1).
+3   The macros defined are NULL (described in 7.19); WCHAR_MIN and WCHAR_MAX
+    (described in 7.20.3); 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.315) 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;
+
+
+    313) See ''future library directions'' (7.30.12).
+    314) wchar_t and wint_t can be the same integer type.
+    315) The value of the macro WEOF may differ from that of EOF and need not be negative.
+
+[page 399]
+
+    -- 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.
+    7.28.2 Formatted wide character input/output functions
+1   The formatted wide character input/output functions shall behave as if there is a sequence
+    point after the actions associated with each specifier.316)
+    7.28.2.1 The fwprintf function
+    Synopsis
+1           #include <stdio.h>
+            #include <wchar.h>
+            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
+
+
+    316) The fwprintf functions perform writes to memory for the %n specifier.
+
+[page 400]
+
+        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.317)
+    -- 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.)318)
+    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,
+
+
+    317) Note that 0 is taken as a flag, not as the beginning of a field width.
+    318) The results of all floating conversions of a negative zero, and of negative values that round to zero,
+         include a minus sign.
+
+[page 401]
+
+              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.
+
+[page 402]
+
+    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
+
+[page 403]
+
+             nan, respectively.319)
+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 > X >= -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 character320) 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
+
+
+319) 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.
+320) 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.
+
+[page 404]
+
+             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
+             distinguish321) 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-
+
+321) The precision p is sufficient to distinguish values of the source type if 16 p-1 > 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.
+
+[page 405]
+
+                    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.322) 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.323) 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 < U, both having DECIMAL_DIG significant digits; the value
+     of the resultant decimal string D should satisfy L <= D <= 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.
+
+     322) See ''future library directions'' (7.30.12).
+     323) 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.
+
+[page 406]
+
+     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 <math.h>
+             #include <stdio.h>
+             #include <wchar.h>
+             /* ... */
+             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 (7.28.6.1.1), the mbrtowc function
+     (7.28.6.3.2).
+     7.28.2.2 The fwscanf function
+     Synopsis
+1            #include <stdio.h>
+             #include <wchar.h>
+             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).
+
+
+
+[page 407]
+
+     -- 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. When all directives
+     have been executed, or 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.324)
+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.325) 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
+
+
+     324) These white-space wide characters are not counted against a specified field width.
+     325) 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.
+
+[page 408]
+
+     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
+
+[page 409]
+
+          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
+
+[page 410]
+
+            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
+[page 411]
+
+                    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.326)
+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 the first conversion (if any) has completed. 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 <stdio.h>
+              #include <wchar.h>
+              /* ... */
+              int n, i; float x; wchar_t name[50];
+              n = fwscanf(stdin, L"%d%f%ls", &i, &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 <stdio.h>
+              #include <wchar.h>
+              /* ... */
+              int i; float x; double y;
+              fwscanf(stdin, L"%2d%f%*d %lf", &i, &x, &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.
+
+
+     326) See ''future library directions'' (7.30.12).
+
+[page 412]
+
+    Forward references: the wcstod, wcstof, and wcstold functions (7.28.4.1.1), the
+    wcstol, wcstoll, wcstoul, and wcstoull functions (7.28.4.1.2), the wcrtomb
+    function (7.28.6.3.3).
+    7.28.2.3 The swprintf function
+    Synopsis
+1           #include <wchar.h>
+            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.
+    7.28.2.4 The swscanf function
+    Synopsis
+1           #include <wchar.h>
+            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 the first conversion (if any) has completed. 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 413]
+
+    7.28.2.5 The vfwprintf function
+    Synopsis
+1          #include <stdarg.h>
+           #include <stdio.h>
+           #include <wchar.h>
+           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.327)
+    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 <stdarg.h>
+           #include <stdio.h>
+           #include <wchar.h>
+           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);
+           }
+
+
+
+
+    327) As the functions vfwprintf, vswprintf, vfwscanf, vwprintf, vwscanf, and vswscanf
+         invoke the va_arg macro, the value of arg after the return is indeterminate.
+
+[page 414]
+
+    7.28.2.6 The vfwscanf function
+    Synopsis
+1           #include <stdarg.h>
+            #include <stdio.h>
+            #include <wchar.h>
+            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.327)
+    Returns
+3   The vfwscanf function returns the value of the macro EOF if an input failure occurs
+    before the first conversion (if any) has completed. 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.
+    7.28.2.7 The vswprintf function
+    Synopsis
+1           #include <stdarg.h>
+            #include <wchar.h>
+            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.327)
+    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.
+
+
+[page 415]
+
+    7.28.2.8 The vswscanf function
+    Synopsis
+1          #include <stdarg.h>
+           #include <wchar.h>
+           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.327)
+    Returns
+3   The vswscanf function returns the value of the macro EOF if an input failure occurs
+    before the first conversion (if any) has completed. 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.
+    7.28.2.9 The vwprintf function
+    Synopsis
+1          #include <stdarg.h>
+           #include <wchar.h>
+           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.327)
+    Returns
+3   The vwprintf function returns the number of wide characters transmitted, or a negative
+    value if an output or encoding error occurred.
+
+
+
+
+[page 416]
+
+    7.28.2.10 The vwscanf function
+    Synopsis
+1           #include <stdarg.h>
+            #include <wchar.h>
+            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.327)
+    Returns
+3   The vwscanf function returns the value of the macro EOF if an input failure occurs
+    before the first conversion (if any) has completed. 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.
+    7.28.2.11 The wprintf function
+    Synopsis
+1           #include <wchar.h>
+            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.
+    7.28.2.12 The wscanf function
+    Synopsis
+1           #include <wchar.h>
+            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.
+
+
+[page 417]
+
+    Returns
+3   The wscanf function returns the value of the macro EOF if an input failure occurs
+    before the first conversion (if any) has completed. 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.
+    7.28.3 Wide character input/output functions
+    7.28.3.1 The fgetwc function
+    Synopsis
+1           #include <stdio.h>
+            #include <wchar.h>
+            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.328)
+    7.28.3.2 The fgetws function
+    Synopsis
+1           #include <stdio.h>
+            #include <wchar.h>
+            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
+
+
+    328) 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.
+
+[page 418]
+
+    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.
+    7.28.3.3 The fputwc function
+    Synopsis
+1           #include <stdio.h>
+            #include <wchar.h>
+            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.
+    7.28.3.4 The fputws function
+    Synopsis
+1           #include <stdio.h>
+            #include <wchar.h>
+            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.
+
+[page 419]
+
+    7.28.3.5 The fwide function
+    Synopsis
+1           #include <stdio.h>
+            #include <wchar.h>
+            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.329)
+    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.
+    7.28.3.6 The getwc function
+    Synopsis
+1           #include <stdio.h>
+            #include <wchar.h>
+            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.
+    7.28.3.7 The getwchar function
+    Synopsis
+1           #include <wchar.h>
+            wint_t getwchar(void);
+
+
+
+
+    329) If the orientation of the stream has already been determined, fwide does not change it.
+
+[page 420]
+
+    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.
+    7.28.3.8 The putwc function
+    Synopsis
+1           #include <stdio.h>
+            #include <wchar.h>
+            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.
+    7.28.3.9 The putwchar function
+    Synopsis
+1           #include <wchar.h>
+            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.
+    7.28.3.10 The ungetwc function
+    Synopsis
+1           #include <stdio.h>
+            #include <wchar.h>
+            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
+
+[page 421]
+
+    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.
+    7.28.4 General wide string utilities
+1   The header <wchar.h> 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 7.1.4. 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 422]
+
+    7.28.4.1 Wide string numeric conversion functions
+    7.28.4.1.1 The wcstod, wcstof, and wcstold functions
+    Synopsis
+1           #include <wchar.h>
+            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 6.4.4.2;
+    -- 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
+      6.4.4.2;
+    -- 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.
+[page 423]
+
+    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
+    6.4.4.2, 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.330) 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.331) 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.
+
+
+
+    330) 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 F.5); 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.
+    331) An implementation may use the n-wchar sequence to determine extra information to be represented in
+         the NaN's significand.
+
+[page 424]
+
+9    If the subject sequence has the decimal form and at most DECIMAL_DIG (defined in
+     <float.h>) 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 <= D <= 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.332)
+     Returns
+10   The functions return the converted value, if any. If no conversion could be performed,
+     zero is returned. If the correct value overflows and default rounding is in effect (7.12.1),
+     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 (7.12.1), 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.
+
+
+
+
+     332) DECIMAL_DIG, defined in <float.h>, 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.
+
+[page 425]
+
+    7.28.4.1.2 The wcstol, wcstoll, wcstoul, and wcstoull functions
+    Synopsis
+1          #include <wchar.h>
+           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 6.4.4.1,
+    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 426]
+
+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 6.4.4.1. 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.
+    7.28.4.2 Wide string copying functions
+    7.28.4.2.1 The wcscpy function
+    Synopsis
+1           #include <wchar.h>
+            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.
+
+
+[page 427]
+
+    7.28.4.2.2 The wcsncpy function
+    Synopsis
+1            #include <wchar.h>
+             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.333)
+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.
+    7.28.4.2.3 The wmemcpy function
+    Synopsis
+1            #include <wchar.h>
+             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.
+
+
+
+
+    333) 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.
+
+[page 428]
+
+    7.28.4.2.4 The wmemmove function
+    Synopsis
+1           #include <wchar.h>
+            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.
+    7.28.4.3 Wide string concatenation functions
+    7.28.4.3.1 The wcscat function
+    Synopsis
+1           #include <wchar.h>
+            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.
+    7.28.4.3.2 The wcsncat function
+    Synopsis
+1           #include <wchar.h>
+            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
+
+[page 429]
+
+    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.334)
+    Returns
+3   The wcsncat function returns the value of s1.
+    7.28.4.4 Wide string comparison functions
+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.
+    7.28.4.4.1 The wcscmp function
+    Synopsis
+1           #include <wchar.h>
+            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.
+    7.28.4.4.2 The wcscoll function
+    Synopsis
+1           #include <wchar.h>
+            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
+
+
+    334) Thus, the maximum number of wide characters that can end up in the array pointed to by s1 is
+         wcslen(s1)+n+1.
+
+[page 430]
+
+    wide string pointed to by s2 when both are interpreted as appropriate to the current
+    locale.
+    7.28.4.4.3 The wcsncmp function
+    Synopsis
+1           #include <wchar.h>
+            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.
+    7.28.4.4.4 The wcsxfrm function
+    Synopsis
+1           #include <wchar.h>
+            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:
+
+
+[page 431]
+
+           1 + wcsxfrm(NULL, s, 0)
+
+    7.28.4.4.5 The wmemcmp function
+    Synopsis
+1          #include <wchar.h>
+           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.
+    7.28.4.5 Wide string search functions
+    7.28.4.5.1 The wcschr function
+    Synopsis
+1          #include <wchar.h>
+           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.
+    7.28.4.5.2 The wcscspn function
+    Synopsis
+1          #include <wchar.h>
+           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.
+
+
+
+[page 432]
+
+    Returns
+3   The wcscspn function returns the length of the segment.
+    7.28.4.5.3 The wcspbrk function
+    Synopsis
+1           #include <wchar.h>
+            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.
+    7.28.4.5.4 The wcsrchr function
+    Synopsis
+1           #include <wchar.h>
+            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.
+    7.28.4.5.5 The wcsspn function
+    Synopsis
+1           #include <wchar.h>
+            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.
+
+
+[page 433]
+
+    7.28.4.5.6 The wcsstr function
+    Synopsis
+1          #include <wchar.h>
+           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.
+    7.28.4.5.7 The wcstok function
+    Synopsis
+1          #include <wchar.h>
+           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
+[page 434]
+
+    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 <wchar.h>
+            static wchar_t str1[] = L"?a???b,,,#c";
+            static wchar_t str2[] = L"\t \t";
+            wchar_t *t, *ptr1, *ptr2;
+            t   =   wcstok(str1,   L"?", &ptr1);         //   t   points to the token L"a"
+            t   =   wcstok(NULL,   L",", &ptr1);         //   t   points to the token L"??b"
+            t   =   wcstok(str2,   L" \t", &ptr2);       //   t   is a null pointer
+            t   =   wcstok(NULL,   L"#,", &ptr1);        //   t   points to the token L"c"
+            t   =   wcstok(NULL,   L"?", &ptr1);         //   t   is a null pointer
+
+    7.28.4.5.8 The wmemchr function
+    Synopsis
+1           #include <wchar.h>
+            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.
+
+
+
+
+[page 435]
+
+    7.28.4.6 Miscellaneous functions
+    7.28.4.6.1 The wcslen function
+    Synopsis
+1          #include <wchar.h>
+           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.
+    7.28.4.6.2 The wmemset function
+    Synopsis
+1          #include <wchar.h>
+           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.
+    7.28.5 Wide character time conversion functions
+    7.28.5.1 The wcsftime function
+    Synopsis
+1          #include <time.h>
+           #include <wchar.h>
+           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.
+
+
+[page 436]
+
+    -- 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.
+    7.28.6 Extended multibyte/wide character conversion utilities
+1   The header <wchar.h> 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'', 7.28.6.3 and
+    7.28.6.4 -- 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.335)
+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 referenced object is
+    altered as needed to track the shift state, and the position within a multibyte character, for
+    the associated multibyte character sequence.
+
+
+
+
+    335) 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.
+
+[page 437]
+
+    7.28.6.1 Single-byte/wide character conversion functions
+    7.28.6.1.1 The btowc function
+    Synopsis
+1          #include <wchar.h>                                                                        *
+           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.
+    7.28.6.1.2 The wctob function
+    Synopsis
+1          #include <wchar.h>                                                                        *
+           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.
+    7.28.6.2 Conversion state functions
+    7.28.6.2.1 The mbsinit function
+    Synopsis
+1          #include <wchar.h>
+           int mbsinit(const mbstate_t *ps);
+    Description
+2   If ps is not a null pointer, the mbsinit function determines whether the referenced
+    mbstate_t object describes an initial conversion state.
+
+
+
+[page 438]
+
+    Returns
+3   The mbsinit function returns nonzero if ps is a null pointer or if the referenced object
+    describes an initial conversion state; otherwise, it returns zero.
+    7.28.6.3 Restartable multibyte/wide character conversion functions
+1   These functions differ from the corresponding multibyte character functions of 7.22.7
+    (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 functions are not required to avoid data
+    races in this case. 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.
+    7.28.6.3.1 The mbrlen function
+    Synopsis
+1           #include <wchar.h>
+            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 : &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 (7.28.6.3.2).
+
+
+
+
+[page 439]
+
+    7.28.6.3.2 The mbrtowc function
+    Synopsis
+1           #include <wchar.h>
+            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).336)
+    (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.
+
+    336) 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).
+
+[page 440]
+
+    7.28.6.3.3 The wcrtomb function
+    Synopsis
+1           #include <wchar.h>
+            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.
+    7.28.6.4 Restartable multibyte/wide string conversion functions
+1   These functions differ from the corresponding multibyte string functions of 7.22.8
+    (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 functions are not required to avoid data races in this
+    case. 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.
+
+
+
+
+[page 441]
+
+    7.28.6.4.1 The mbsrtowcs function
+    Synopsis
+1            #include <wchar.h>
+             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.337) 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).
+
+
+
+
+    337) Thus, the value of len is ignored if dst is a null pointer.
+
+[page 442]
+
+    7.28.6.4.2 The wcsrtombs function
+    Synopsis
+1           #include <wchar.h>
+            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.338)
+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).
+
+
+
+
+    338) 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.
+
+[page 443]
+
+    7.29 Wide character classification and mapping utilities <wctype.h>
+    7.29.1 Introduction
+1   The header <wctype.h> defines one macro, and declares three data types and many
+    functions.339)
+2   The types declared are
+             wint_t
+    described in 7.28.1;
+             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 7.28.1).
+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.
+
+
+
+
+    339) See ''future library directions'' (7.30.13).
+
+[page 444]
+
+    7.29.2 Wide character classification utilities
+1   The header <wctype.h> 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.
+    7.29.2.1 Wide character classification functions
+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 7.4.1 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.340)
+    Forward references: the wctob function (7.28.6.1.2).
+    7.29.2.1.1 The iswalnum function
+    Synopsis
+1           #include <wctype.h>
+            int iswalnum(wint_t wc);
+    Description
+2   The iswalnum function tests for any wide character for which iswalpha or
+    iswdigit is true.
+    7.29.2.1.2 The iswalpha function
+    Synopsis
+1           #include <wctype.h>
+            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
+
+    340) 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)
+         && iswspace(wc) is true, but not both.
+
+[page 445]
+
+    wide characters for which none of iswcntrl, iswdigit, iswpunct, or iswspace
+    is true.341)
+    7.29.2.1.3 The iswblank function
+    Synopsis
+1           #include <wctype.h>
+            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.
+    7.29.2.1.4 The iswcntrl function
+    Synopsis
+1           #include <wctype.h>
+            int iswcntrl(wint_t wc);
+    Description
+2   The iswcntrl function tests for any control wide character.
+    7.29.2.1.5 The iswdigit function
+    Synopsis
+1           #include <wctype.h>
+            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 5.2.1).
+    7.29.2.1.6 The iswgraph function
+    Synopsis
+1           #include <wctype.h>
+            int iswgraph(wint_t wc);
+
+
+
+
+    341) The functions iswlower and iswupper test true or false separately for each of these additional
+         wide characters; all four combinations are possible.
+
+[page 446]
+
+    Description
+2   The iswgraph function tests for any wide character for which iswprint is true and
+    iswspace is false.342)
+    7.29.2.1.7 The iswlower function
+    Synopsis
+1           #include <wctype.h>
+            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.
+    7.29.2.1.8 The iswprint function
+    Synopsis
+1           #include <wctype.h>
+            int iswprint(wint_t wc);
+    Description
+2   The iswprint function tests for any printing wide character.
+    7.29.2.1.9 The iswpunct function
+    Synopsis
+1           #include <wctype.h>
+            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.342)
+    7.29.2.1.10 The iswspace function
+    Synopsis
+1           #include <wctype.h>
+            int iswspace(wint_t wc);
+
+
+
+    342) Note that the behavior of the iswgraph and iswpunct functions may differ from their
+         corresponding functions in 7.4.1 with respect to printing, white-space, single-byte execution
+         characters other than ' '.
+
+[page 447]
+
+    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.
+    7.29.2.1.11 The iswupper function
+    Synopsis
+1          #include <wctype.h>
+           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.
+    7.29.2.1.12 The iswxdigit function
+    Synopsis
+1          #include <wctype.h>
+           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 6.4.4.1).
+    7.29.2.2 Extensible wide character classification functions
+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 (7.29.2.1).
+    7.29.2.2.1 The iswctype function
+    Synopsis
+1          #include <wctype.h>
+           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 (7.29.2.1) in the comment that follows the expression:
+
+
+[page 448]
+
+            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. If desc is zero, the iswctype
+    function returns zero (false).
+    Forward references: the wctype function (7.29.2.2.2).
+    7.29.2.2.2 The wctype function
+    Synopsis
+1           #include <wctype.h>
+            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.
+
+
+
+
+[page 449]
+
+    7.29.3 Wide character case mapping utilities
+1   The header <wctype.h> declares several functions useful for mapping wide characters.
+    7.29.3.1 Wide character case mapping functions
+    7.29.3.1.1 The towlower function
+    Synopsis
+1          #include <wctype.h>
+           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.
+    7.29.3.1.2 The towupper function
+    Synopsis
+1          #include <wctype.h>
+           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.
+    7.29.3.2 Extensible wide character case mapping functions
+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 (7.29.3.1).
+
+
+
+
+[page 450]
+
+    7.29.3.2.1 The towctrans function
+    Synopsis
+1           #include <wctype.h>
+            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 (7.29.3.1) 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. If desc is zero, the towctrans function returns the value of wc.
+    7.29.3.2.2 The wctrans function
+    Synopsis
+1           #include <wctype.h>
+            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.
+
+
+
+
+[page 451]
+
+    7.30 Future library directions
+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.
+    7.30.1 Complex arithmetic <complex.h>
+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
+    <complex.h> header.
+    7.30.2 Character handling <ctype.h>
+1   Function names that begin with either is or to, and a lowercase letter may be added to
+    the declarations in the <ctype.h> header.
+    7.30.3 Errors <errno.h>
+1   Macros that begin with E and a digit or E and an uppercase letter may be added to the
+    declarations in the <errno.h> header.
+    7.30.4 Format conversion of integer types <inttypes.h>
+1   Macro names beginning with PRI or SCN followed by any lowercase letter or X may be
+    added to the macros defined in the <inttypes.h> header.
+    7.30.5 Localization <locale.h>
+1   Macros that begin with LC_ and an uppercase letter may be added to the definitions in
+    the <locale.h> header.
+    7.30.6 Signal handling <signal.h>
+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 <signal.h> header.
+    7.30.7 Boolean type and values <stdbool.h>
+1   The ability to undefine and perhaps then redefine the macros bool, true, and false is
+    an obsolescent feature.
+    7.30.8 Integer types <stdint.h>
+1   Typedef names beginning with int or uint and ending with _t may be added to the
+    types defined in the <stdint.h> header. Macro names beginning with INT or UINT
+    and ending with _MAX, _MIN, or _C may be added to the macros defined in the
+    <stdint.h> header.
+
+[page 452]
+
+    7.30.9 Input/output <stdio.h>
+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 use of ungetc on a binary stream where the file position indicator is zero prior to *
+    the call is an obsolescent feature.
+    7.30.10 General utilities <stdlib.h>
+1   Function names that begin with str and a lowercase letter may be added to the
+    declarations in the <stdlib.h> header.
+    7.30.11 String handling <string.h>
+1   Function names that begin with str, mem, or wcs and a lowercase letter may be added
+    to the declarations in the <string.h> header.
+    7.30.12 Extended multibyte and wide character utilities <wchar.h>
+1   Function names that begin with wcs and a lowercase letter may be added to the
+    declarations in the <wchar.h> 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.
+    7.30.13 Wide character classification and mapping utilities
+    <wctype.h>
+1   Function names that begin with is or to and a lowercase letter may be added to the
+    declarations in the <wctype.h> header.
+
+
+
+
+[page 453]
+
+                                                 Annex A
+                                               (informative)
+                                Language syntax summary
+1   NOTE   The notation is described in 6.1.
+
+    A.1 Lexical grammar
+    A.1.1 Lexical elements
+    (6.4) token:
+                   keyword
+                   identifier
+                   constant
+                   string-literal
+                   punctuator
+    (6.4) preprocessing-token:
+                  header-name
+                  identifier
+                  pp-number
+                  character-constant
+                  string-literal
+                  punctuator
+                  each non-white-space character that cannot be one of the above
+
+
+
+
+[page 454]
+
+A.1.2 Keywords
+(6.4.1) keyword: one of
+              alignof                     goto                  union
+              auto                        if                    unsigned
+              break                       inline                void
+              case                        int                   volatile
+              char                        long                  while
+              const                       register              _Alignas
+              continue                    restrict              _Atomic
+              default                     return                _Bool
+              do                          short                 _Complex
+              double                      signed                _Generic
+              else                        sizeof                _Imaginary
+              enum                        static                _Noreturn
+              extern                      struct                _Static_assert
+              float                       switch                _Thread_local
+              for                         typedef
+A.1.3 Identifiers
+(6.4.2.1) identifier:
+               identifier-nondigit
+               identifier identifier-nondigit
+               identifier digit
+(6.4.2.1) identifier-nondigit:
+               nondigit
+               universal-character-name
+               other implementation-defined characters
+(6.4.2.1) 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
+(6.4.2.1) digit: one of
+               0 1 2         3    4   5    6   7   8    9
+
+
+
+
+[page 455]
+
+A.1.4 Universal character names
+(6.4.3) universal-character-name:
+              \u hex-quad
+              \U hex-quad hex-quad
+(6.4.3) hex-quad:
+              hexadecimal-digit hexadecimal-digit
+                           hexadecimal-digit hexadecimal-digit
+A.1.5 Constants
+(6.4.4) constant:
+              integer-constant
+              floating-constant
+              enumeration-constant
+              character-constant
+(6.4.4.1) integer-constant:
+               decimal-constant integer-suffixopt
+               octal-constant integer-suffixopt
+               hexadecimal-constant integer-suffixopt
+(6.4.4.1) decimal-constant:
+              nonzero-digit
+              decimal-constant digit
+(6.4.4.1) octal-constant:
+               0
+               octal-constant octal-digit
+(6.4.4.1) hexadecimal-constant:
+              hexadecimal-prefix hexadecimal-digit
+              hexadecimal-constant hexadecimal-digit
+(6.4.4.1) hexadecimal-prefix: one of
+              0x 0X
+(6.4.4.1) nonzero-digit: one of
+              1 2 3 4 5              6      7   8   9
+(6.4.4.1) octal-digit: one of
+               0 1 2 3           4   5      6   7
+
+
+
+
+[page 456]
+
+(6.4.4.1) 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
+(6.4.4.1) integer-suffix:
+               unsigned-suffix long-suffixopt
+               unsigned-suffix long-long-suffix
+               long-suffix unsigned-suffixopt
+               long-long-suffix unsigned-suffixopt
+(6.4.4.1) unsigned-suffix: one of
+               u U
+(6.4.4.1) long-suffix: one of
+               l L
+(6.4.4.1) long-long-suffix: one of
+               ll LL
+(6.4.4.2) floating-constant:
+               decimal-floating-constant
+               hexadecimal-floating-constant
+(6.4.4.2) decimal-floating-constant:
+              fractional-constant exponent-partopt floating-suffixopt
+              digit-sequence exponent-part floating-suffixopt
+(6.4.4.2) hexadecimal-floating-constant:
+              hexadecimal-prefix hexadecimal-fractional-constant
+                            binary-exponent-part floating-suffixopt
+              hexadecimal-prefix hexadecimal-digit-sequence
+                            binary-exponent-part floating-suffixopt
+(6.4.4.2) fractional-constant:
+               digit-sequenceopt . digit-sequence
+               digit-sequence .
+(6.4.4.2) exponent-part:
+              e signopt digit-sequence
+              E signopt digit-sequence
+(6.4.4.2) sign: one of
+               + -
+
+
+
+[page 457]
+
+(6.4.4.2) digit-sequence:
+               digit
+               digit-sequence digit
+(6.4.4.2) hexadecimal-fractional-constant:
+              hexadecimal-digit-sequenceopt .
+                             hexadecimal-digit-sequence
+              hexadecimal-digit-sequence .
+(6.4.4.2) binary-exponent-part:
+               p signopt digit-sequence
+               P signopt digit-sequence
+(6.4.4.2) hexadecimal-digit-sequence:
+              hexadecimal-digit
+              hexadecimal-digit-sequence hexadecimal-digit
+(6.4.4.2) floating-suffix: one of
+               f l F L
+(6.4.4.3) enumeration-constant:
+              identifier
+(6.4.4.4) character-constant:
+              ' c-char-sequence '
+              L' c-char-sequence '
+              u' c-char-sequence '
+              U' c-char-sequence '
+(6.4.4.4) c-char-sequence:
+               c-char
+               c-char-sequence c-char
+(6.4.4.4) c-char:
+               any member of the source character set except
+                            the single-quote ', backslash \, or new-line character
+               escape-sequence
+(6.4.4.4) escape-sequence:
+              simple-escape-sequence
+              octal-escape-sequence
+              hexadecimal-escape-sequence
+              universal-character-name
+
+
+
+
+[page 458]
+
+(6.4.4.4) simple-escape-sequence: one of
+              \' \" \? \\
+              \a \b \f \n \r \t                   \v
+(6.4.4.4) octal-escape-sequence:
+               \ octal-digit
+               \ octal-digit octal-digit
+               \ octal-digit octal-digit octal-digit
+(6.4.4.4) hexadecimal-escape-sequence:
+              \x hexadecimal-digit
+              hexadecimal-escape-sequence hexadecimal-digit
+A.1.6 String literals
+(6.4.5) string-literal:
+               encoding-prefixopt " s-char-sequenceopt "
+(6.4.5) encoding-prefix:
+              u8
+              u
+              U
+              L
+(6.4.5) s-char-sequence:
+               s-char
+               s-char-sequence s-char
+(6.4.5) s-char:
+               any member of the source character set except
+                            the double-quote ", backslash \, or new-line character
+               escape-sequence
+A.1.7 Punctuators
+(6.4.6) punctuator: one of
+              [ ] ( ) { } . ->
+              ++ -- & * + - ~ !
+              / % << >> < > <= >=                      ==    !=    ^    |   &&   ||
+              ? : ; ...
+              = *= /= %= += -= <<=                     >>=    &=       ^=   |=
+              , # ##
+              <: :> <% %> %: %:%:
+
+
+
+
+[page 459]
+
+A.1.8 Header names
+(6.4.7) header-name:
+              < h-char-sequence >
+              " q-char-sequence "
+(6.4.7) h-char-sequence:
+              h-char
+              h-char-sequence h-char
+(6.4.7) h-char:
+              any member of the source character set except
+                           the new-line character and >
+(6.4.7) q-char-sequence:
+              q-char
+              q-char-sequence q-char
+(6.4.7) q-char:
+              any member of the source character set except
+                           the new-line character and "
+A.1.9 Preprocessing numbers
+(6.4.8) 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   .
+
+
+
+
+[page 460]
+
+A.2 Phrase structure grammar
+A.2.1 Expressions
+(6.5.1) primary-expression:
+              identifier
+              constant
+              string-literal
+              ( expression )
+              generic-selection
+(6.5.1.1) generic-selection:
+              _Generic ( assignment-expression , generic-assoc-list )
+(6.5.1.1) generic-assoc-list:
+              generic-association
+              generic-assoc-list , generic-association
+(6.5.1.1) generic-association:
+              type-name : assignment-expression
+              default : assignment-expression
+(6.5.2) postfix-expression:
+              primary-expression
+              postfix-expression [ expression ]
+              postfix-expression ( argument-expression-listopt )
+              postfix-expression . identifier
+              postfix-expression -> identifier
+              postfix-expression ++
+              postfix-expression --
+              ( type-name ) { initializer-list }
+              ( type-name ) { initializer-list , }
+(6.5.2) argument-expression-list:
+             assignment-expression
+             argument-expression-list , assignment-expression
+(6.5.3) unary-expression:
+              postfix-expression
+              ++ unary-expression
+              -- unary-expression
+              unary-operator cast-expression
+              sizeof unary-expression
+              sizeof ( type-name )
+              alignof ( type-name )
+
+[page 461]
+
+(6.5.3) unary-operator: one of
+              & * + - ~                !
+(6.5.4) cast-expression:
+               unary-expression
+               ( type-name ) cast-expression
+(6.5.5) multiplicative-expression:
+               cast-expression
+               multiplicative-expression * cast-expression
+               multiplicative-expression / cast-expression
+               multiplicative-expression % cast-expression
+(6.5.6) additive-expression:
+               multiplicative-expression
+               additive-expression + multiplicative-expression
+               additive-expression - multiplicative-expression
+(6.5.7) shift-expression:
+                additive-expression
+                shift-expression << additive-expression
+                shift-expression >> additive-expression
+(6.5.8) relational-expression:
+               shift-expression
+               relational-expression   <    shift-expression
+               relational-expression   >    shift-expression
+               relational-expression   <=   shift-expression
+               relational-expression   >=   shift-expression
+(6.5.9) equality-expression:
+               relational-expression
+               equality-expression == relational-expression
+               equality-expression != relational-expression
+(6.5.10) AND-expression:
+             equality-expression
+             AND-expression & equality-expression
+(6.5.11) exclusive-OR-expression:
+              AND-expression
+              exclusive-OR-expression ^ AND-expression
+
+
+
+
+[page 462]
+
+(6.5.12) inclusive-OR-expression:
+               exclusive-OR-expression
+               inclusive-OR-expression | exclusive-OR-expression
+(6.5.13) logical-AND-expression:
+              inclusive-OR-expression
+              logical-AND-expression && inclusive-OR-expression
+(6.5.14) logical-OR-expression:
+              logical-AND-expression
+              logical-OR-expression || logical-AND-expression
+(6.5.15) conditional-expression:
+              logical-OR-expression
+              logical-OR-expression ? expression : conditional-expression
+(6.5.16) assignment-expression:
+              conditional-expression
+              unary-expression assignment-operator assignment-expression
+(6.5.16) assignment-operator: one of
+              = *= /= %= +=                -=    <<=    >>=      &=    ^=   |=
+(6.5.17) expression:
+              assignment-expression
+              expression , assignment-expression
+(6.6) constant-expression:
+              conditional-expression
+A.2.2 Declarations
+(6.7) declaration:
+               declaration-specifiers init-declarator-listopt ;
+               static_assert-declaration
+(6.7) declaration-specifiers:
+               storage-class-specifier declaration-specifiersopt
+               type-specifier declaration-specifiersopt
+               type-qualifier declaration-specifiersopt
+               function-specifier declaration-specifiersopt
+               alignment-specifier declaration-specifiersopt
+(6.7) init-declarator-list:
+               init-declarator
+               init-declarator-list , init-declarator
+
+
+[page 463]
+
+(6.7) init-declarator:
+               declarator
+               declarator = initializer
+(6.7.1) storage-class-specifier:
+              typedef
+              extern
+              static
+              _Thread_local
+              auto
+              register
+(6.7.2) type-specifier:
+               void
+               char
+               short
+               int
+               long
+               float
+               double
+               signed
+               unsigned
+               _Bool
+               _Complex
+               atomic-type-specifier
+               struct-or-union-specifier
+               enum-specifier
+               typedef-name
+(6.7.2.1) struct-or-union-specifier:
+               struct-or-union identifieropt { struct-declaration-list }
+               struct-or-union identifier
+(6.7.2.1) struct-or-union:
+               struct
+               union
+(6.7.2.1) struct-declaration-list:
+               struct-declaration
+               struct-declaration-list struct-declaration
+(6.7.2.1) struct-declaration:
+               specifier-qualifier-list struct-declarator-listopt ;
+               static_assert-declaration
+
+[page 464]
+
+(6.7.2.1) specifier-qualifier-list:
+               type-specifier specifier-qualifier-listopt
+               type-qualifier specifier-qualifier-listopt
+(6.7.2.1) struct-declarator-list:
+               struct-declarator
+               struct-declarator-list , struct-declarator
+(6.7.2.1) struct-declarator:
+               declarator
+               declaratoropt : constant-expression
+(6.7.2.2) enum-specifier:
+              enum identifieropt { enumerator-list }
+              enum identifieropt { enumerator-list , }
+              enum identifier
+(6.7.2.2) enumerator-list:
+              enumerator
+              enumerator-list , enumerator
+(6.7.2.2) enumerator:
+              enumeration-constant
+              enumeration-constant = constant-expression
+(6.7.2.4) atomic-type-specifier:
+              _Atomic ( type-name )
+(6.7.3) type-qualifier:
+              const
+              restrict
+              volatile
+              _Atomic
+(6.7.4) function-specifier:
+               inline
+               _Noreturn
+(6.7.5) alignment-specifier:
+              _Alignas ( type-name )
+              _Alignas ( constant-expression )
+(6.7.6) declarator:
+              pointeropt direct-declarator
+
+
+
+[page 465]
+
+(6.7.6) 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 )
+(6.7.6) pointer:
+               * type-qualifier-listopt
+               * type-qualifier-listopt pointer
+(6.7.6) type-qualifier-list:
+              type-qualifier
+              type-qualifier-list type-qualifier
+(6.7.6) parameter-type-list:
+             parameter-list
+             parameter-list , ...
+(6.7.6) parameter-list:
+             parameter-declaration
+             parameter-list , parameter-declaration
+(6.7.6) parameter-declaration:
+             declaration-specifiers declarator
+             declaration-specifiers abstract-declaratoropt
+(6.7.6) identifier-list:
+               identifier
+               identifier-list , identifier
+(6.7.7) type-name:
+              specifier-qualifier-list abstract-declaratoropt
+(6.7.7) abstract-declarator:
+              pointer
+              pointeropt direct-abstract-declarator
+
+
+
+
+[page 466]
+
+(6.7.7) 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 )
+(6.7.8) typedef-name:
+              identifier
+(6.7.9) initializer:
+                assignment-expression
+                { initializer-list }
+                { initializer-list , }
+(6.7.9) initializer-list:
+                designationopt initializer
+                initializer-list , designationopt initializer
+(6.7.9) designation:
+              designator-list =
+(6.7.9) designator-list:
+              designator
+              designator-list designator
+(6.7.9) designator:
+              [ constant-expression ]
+              . identifier
+(6.7.10) static_assert-declaration:
+               _Static_assert ( constant-expression , string-literal ) ;
+
+
+
+
+[page 467]
+
+A.2.3 Statements
+(6.8) statement:
+              labeled-statement
+              compound-statement
+              expression-statement
+              selection-statement
+              iteration-statement
+              jump-statement
+(6.8.1) labeled-statement:
+               identifier : statement
+               case constant-expression : statement
+               default : statement
+(6.8.2) compound-statement:
+             { block-item-listopt }
+(6.8.2) block-item-list:
+               block-item
+               block-item-list block-item
+(6.8.2) block-item:
+               declaration
+               statement
+(6.8.3) expression-statement:
+              expressionopt ;
+(6.8.4) selection-statement:
+               if ( expression ) statement
+               if ( expression ) statement else statement
+               switch ( expression ) statement
+(6.8.5) iteration-statement:
+                while ( expression ) statement
+                do statement while ( expression ) ;
+                for ( expressionopt ; expressionopt ; expressionopt ) statement
+                for ( declaration expressionopt ; expressionopt ) statement
+(6.8.6) jump-statement:
+              goto identifier ;
+              continue ;
+              break ;
+              return expressionopt ;
+
+[page 468]
+
+A.2.4 External definitions
+(6.9) translation-unit:
+               external-declaration
+               translation-unit external-declaration
+(6.9) external-declaration:
+               function-definition
+               declaration
+(6.9.1) function-definition:
+               declaration-specifiers declarator declaration-listopt compound-statement
+(6.9.1) declaration-list:
+              declaration
+              declaration-list declaration
+A.3 Preprocessing directives
+(6.10) preprocessing-file:
+              groupopt
+(6.10) group:
+                group-part
+                group group-part
+(6.10) group-part:
+              if-section
+              control-line
+              text-line
+              # non-directive
+(6.10) if-section:
+                if-group elif-groupsopt else-groupopt endif-line
+(6.10) if-group:
+               # if     constant-expression new-line groupopt
+               # ifdef identifier new-line groupopt
+               # ifndef identifier new-line groupopt
+(6.10) elif-groups:
+               elif-group
+               elif-groups elif-group
+(6.10) elif-group:
+               # elif       constant-expression new-line groupopt
+
+
+[page 469]
+
+(6.10) else-group:
+               # else        new-line groupopt
+(6.10) endif-line:
+               # endif       new-line
+(6.10) 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
+(6.10) text-line:
+               pp-tokensopt new-line
+(6.10) non-directive:
+              pp-tokens new-line
+(6.10) lparen:
+                 a ( character not immediately preceded by white-space
+(6.10) replacement-list:
+              pp-tokensopt
+(6.10) pp-tokens:
+              preprocessing-token
+              pp-tokens preprocessing-token
+(6.10) new-line:
+              the new-line character
+
+
+
+
+[page 470]
+
+                               Annex B
+                             (informative)
+                         Library summary
+B.1 Diagnostics <assert.h>
+        NDEBUG
+        static_assert
+        void assert(scalar expression);
+B.2 Complex <complex.h>
+        __STDC_NO_COMPLEX__           imaginary
+        complex                         _Imaginary_I
+        _Complex_I                      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);
+
+[page 471]
+
+      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 CMPLX(double x, double y);
+      float complex CMPLXF(float x, float y);
+      long double complex CMPLXL(long double x, long double y);
+      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);
+
+[page 472]
+
+        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);
+B.3 Character handling <ctype.h>
+        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);
+B.4 Errors <errno.h>
+        EDOM           EILSEQ            ERANGE           errno
+        __STDC_WANT_LIB_EXT1__
+        errno_t
+B.5 Floating-point environment <fenv.h>
+        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);
+
+[page 473]
+
+      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);
+B.6 Characteristics of floating types <float.h>
+      FLT_ROUNDS              DBL_DIG                 FLT_MAX
+      FLT_EVAL_METHOD         LDBL_DIG                DBL_MAX
+      FLT_HAS_SUBNORM         FLT_MIN_EXP             LDBL_MAX
+      DBL_HAS_SUBNORM         DBL_MIN_EXP             FLT_EPSILON
+      LDBL_HAS_SUBNORM        LDBL_MIN_EXP            DBL_EPSILON
+      FLT_RADIX               FLT_MIN_10_EXP          LDBL_EPSILON
+      FLT_MANT_DIG            DBL_MIN_10_EXP          FLT_MIN
+      DBL_MANT_DIG            LDBL_MIN_10_EXP         DBL_MIN
+      LDBL_MANT_DIG           FLT_MAX_EXP             LDBL_MIN
+      FLT_DECIMAL_DIG         DBL_MAX_EXP             FLT_TRUE_MIN
+      DBL_DECIMAL_DIG         LDBL_MAX_EXP            DBL_TRUE_MIN
+      LDBL_DECIMAL_DIG        FLT_MAX_10_EXP          LDBL_TRUE_MIN
+      DECIMAL_DIG             DBL_MAX_10_EXP
+      FLT_DIG                 LDBL_MAX_10_EXP
+B.7 Format conversion of integer types <inttypes.h>
+      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);
+
+[page 474]
+
+        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);
+B.8 Alternative spellings <iso646.h>
+        and            bitor             not_eq           xor
+        and_eq         compl             or               xor_eq
+        bitand         not               or_eq
+B.9 Sizes of integer types <limits.h>
+        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
+B.10 Localization <locale.h>
+        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);
+B.11 Mathematics <math.h>
+        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);
+[page 475]
+
+      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);
+
+[page 476]
+
+        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);
+
+[page 477]
+
+      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);
+
+[page 478]
+
+        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);
+
+[page 479]
+
+      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);
+B.12 Nonlocal jumps <setjmp.h>
+      jmp_buf
+      int setjmp(jmp_buf env);
+      _Noreturn void longjmp(jmp_buf env, int val);
+B.13 Signal handling <signal.h>
+      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);
+
+
+
+
+[page 480]
+
+B.14 Alignment <stdalign.h>
+        alignas
+        __alignas_is_defined
+B.15 Variable arguments <stdarg.h>
+        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);
+B.16 Atomics <stdatomic.h>
+        ATOMIC_CHAR_LOCK_FREE           atomic_uint
+        ATOMIC_CHAR16_T_LOCK_FREE       atomic_long
+        ATOMIC_CHAR32_T_LOCK_FREE       atomic_ulong
+        ATOMIC_WCHAR_T_LOCK_FREE        atomic_llong
+        ATOMIC_SHORT_LOCK_FREE          atomic_ullong
+        ATOMIC_INT_LOCK_FREE            atomic_char16_t
+        ATOMIC_LONG_LOCK_FREE           atomic_char32_t
+        ATOMIC_LLONG_LOCK_FREE          atomic_wchar_t
+        ATOMIC_ADDRESS_LOCK_FREE        atomic_int_least8_t
+        ATOMIC_FLAG_INIT                atomic_uint_least8_t
+        memory_order                    atomic_int_least16_t
+        atomic_flag                     atomic_uint_least16_t
+        atomic_bool                     atomic_int_least32_t
+        atomic_address                  atomic_uint_least32_t
+        memory_order_relaxed            atomic_int_least64_t
+        memory_order_consume            atomic_uint_least64_t
+        memory_order_acquire            atomic_int_fast8_t
+        memory_order_release            atomic_uint_fast8_t
+        memory_order_acq_rel            atomic_int_fast16_t
+        memory_order_seq_cst            atomic_uint_fast16_t
+        atomic_char                     atomic_int_fast32_t
+        atomic_schar                    atomic_uint_fast32_t
+        atomic_uchar                    atomic_int_fast64_t
+        atomic_short                    atomic_uint_fast64_t
+        atomic_ushort                   atomic_intptr_t
+        atomic_int                      atomic_uintptr_t
+
+
+
+[page 481]
+
+      atomic_size_t                     atomic_intmax_t
+      atomic_ptrdiff_t                  atomic_uintmax_t
+      #define ATOMIC_VAR_INIT(C value)
+      void atomic_init(volatile A *obj, C value);
+      type kill_dependency(type y);
+      void atomic_thread_fence(memory_order order);
+      void atomic_signal_fence(memory_order order);
+      _Bool atomic_is_lock_free(atomic_type const volatile *obj);
+      void atomic_store(volatile A *object, C desired);
+      void atomic_store_explicit(volatile A *object,
+            C desired, memory_order order);
+      C atomic_load(volatile A *object);
+      C atomic_load_explicit(volatile A *object,
+            memory_order order);
+      C atomic_exchange(volatile A *object, C desired);
+      C atomic_exchange_explicit(volatile A *object,
+            C desired, memory_order order);
+      _Bool atomic_compare_exchange_strong(volatile A *object,
+            C *expected, C desired);
+      _Bool atomic_compare_exchange_strong_explicit(
+            volatile A *object, C *expected, C desired,
+            memory_order success, memory_order failure);
+      _Bool atomic_compare_exchange_weak(volatile A *object,
+            C *expected, C desired);
+      _Bool atomic_compare_exchange_weak_explicit(
+            volatile A *object, C *expected, C desired,
+            memory_order success, memory_order failure);
+      C atomic_fetch_key(volatile A *object, M operand);
+      C atomic_fetch_key_explicit(volatile A *object,
+            M operand, memory_order order);
+      bool atomic_flag_test_and_set(
+            volatile atomic_flag *object);
+      bool atomic_flag_test_and_set_explicit(
+            volatile atomic_flag *object, memory_order order);
+      void atomic_flag_clear(volatile atomic_flag *object);
+      void atomic_flag_clear_explicit(
+            volatile atomic_flag *object, memory_order order);
+
+
+
+
+[page 482]
+
+B.17 Boolean type and values <stdbool.h>
+        bool
+        true
+        false
+        __bool_true_false_are_defined
+B.18 Common definitions <stddef.h>
+        ptrdiff_t       max_align_t       NULL
+        size_t          wchar_t
+        offsetof(type, member-designator)
+        __STDC_WANT_LIB_EXT1__
+        rsize_t
+B.19 Integer types <stdint.h>
+        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
+        __STDC_WANT_LIB_EXT1__
+        RSIZE_MAX
+
+
+
+
+[page 483]
+
+B.20 Input/output <stdio.h>
+      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);
+
+[page 484]
+
+        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);
+        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);
+        __STDC_WANT_LIB_EXT1__
+        L_tmpnam_s    TMP_MAX_S         errno_t          rsize_t
+        errno_t tmpfile_s(FILE * restrict * restrict streamptr);
+        errno_t tmpnam_s(char *s, rsize_t maxsize);
+
+
+
+[page 485]
+
+      errno_t fopen_s(FILE * restrict * restrict streamptr,
+           const char * restrict filename,
+           const char * restrict mode);
+      errno_t freopen_s(FILE * restrict * restrict newstreamptr,
+           const char * restrict filename,
+           const char * restrict mode,
+           FILE * restrict stream);
+      int fprintf_s(FILE * restrict stream,
+           const char * restrict format, ...);
+      int fscanf_s(FILE * restrict stream,
+           const char * restrict format, ...);
+      int printf_s(const char * restrict format, ...);
+      int scanf_s(const char * restrict format, ...);
+      int snprintf_s(char * restrict s, rsize_t n,
+           const char * restrict format, ...);
+      int sprintf_s(char * restrict s, rsize_t n,
+           const char * restrict format, ...);
+      int sscanf_s(const char * restrict s,
+           const char * restrict format, ...);
+      int vfprintf_s(FILE * restrict stream,
+           const char * restrict format,
+           va_list arg);
+      int vfscanf_s(FILE * restrict stream,
+           const char * restrict format,
+           va_list arg);
+      int vprintf_s(const char * restrict format,
+           va_list arg);
+      int vscanf_s(const char * restrict format,
+           va_list arg);
+      int vsnprintf_s(char * restrict s, rsize_t n,
+           const char * restrict format,
+           va_list arg);
+      int vsprintf_s(char * restrict s, rsize_t n,
+           const char * restrict format,
+           va_list arg);
+      int vsscanf_s(const char * restrict s,
+           const char * restrict format,
+           va_list arg);
+      char *gets_s(char *s, rsize_t n);
+
+
+
+[page 486]
+
+B.21 General utilities <stdlib.h>
+        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 *aligned_alloc(size_t alignment, size_t size);
+        void *calloc(size_t nmemb, size_t size);
+        void free(void *ptr);
+        void *malloc(size_t size);
+        void *realloc(void *ptr, size_t size);
+        _Noreturn void abort(void);
+        int atexit(void (*func)(void));
+        int at_quick_exit(void (*func)(void));
+        _Noreturn void exit(int status);
+        _Noreturn void _Exit(int status);
+        char *getenv(const char *name);
+        _Noreturn void quick_exit(int status);
+        int system(const char *string);
+
+
+[page 487]
+
+      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);
+      __STDC_WANT_LIB_EXT1__
+      errno_t
+      rsize_t
+      constraint_handler_t
+      constraint_handler_t set_constraint_handler_s(
+           constraint_handler_t handler);
+      void abort_handler_s(
+           const char * restrict msg,
+           void * restrict ptr,
+           errno_t error);
+      void ignore_handler_s(
+           const char * restrict msg,
+           void * restrict ptr,
+           errno_t error);
+      errno_t getenv_s(size_t * restrict len,
+                char * restrict value, rsize_t maxsize,
+                const char * restrict name);
+
+
+
+
+[page 488]
+
+        void *bsearch_s(const void *key, const void *base,
+             rsize_t nmemb, rsize_t size,
+             int (*compar)(const void *k, const void *y,
+                             void *context),
+             void *context);
+        errno_t qsort_s(void *base, rsize_t nmemb, rsize_t size,
+             int (*compar)(const void *x, const void *y,
+                             void *context),
+             void *context);
+        errno_t wctomb_s(int * restrict status,
+             char * restrict s,
+             rsize_t smax,
+             wchar_t wc);
+        errno_t mbstowcs_s(size_t * restrict retval,
+             wchar_t * restrict dst, rsize_t dstmax,
+             const char * restrict src, rsize_t len);
+        errno_t wcstombs_s(size_t * restrict retval,
+             char * restrict dst, rsize_t dstmax,
+             const wchar_t * restrict src, rsize_t len);
+B.22 String handling <string.h>
+        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);
+[page 489]
+
+      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);
+      __STDC_WANT_LIB_EXT1__
+      errno_t
+      rsize_t
+      errno_t memcpy_s(void * restrict s1, rsize_t s1max,
+           const void * restrict s2, rsize_t n);
+      errno_t memmove_s(void *s1, rsize_t s1max,
+           const void *s2, rsize_t n);
+      errno_t strcpy_s(char * restrict s1,
+           rsize_t s1max,
+           const char * restrict s2);
+      errno_t strncpy_s(char * restrict s1,
+           rsize_t s1max,
+           const char * restrict s2,
+           rsize_t n);
+      errno_t strcat_s(char * restrict s1,
+           rsize_t s1max,
+           const char * restrict s2);
+      errno_t strncat_s(char * restrict s1,
+           rsize_t s1max,
+           const char * restrict s2,
+           rsize_t n);
+      char *strtok_s(char * restrict s1,
+           rsize_t * restrict s1max,
+           const char * restrict s2,
+           char ** restrict ptr);
+      errno_t memset_s(void *s, rsize_t smax, int c, rsize_t n)
+      errno_t strerror_s(char *s, rsize_t maxsize,
+           errno_t errnum);
+      size_t strerrorlen_s(errno_t errnum);
+
+[page 490]
+
+        size_t strnlen_s(const char *s, size_t maxsize);
+B.23 Type-generic math <tgmath.h>
+        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
+B.24 Threads <threads.h>
+        ONCE_FLAG_INIT                 mtx_plain
+        TSS_DTOR_ITERATIONS            mtx_recursive
+        cnd_t                          mtx_timed
+        thrd_t                         mtx_try
+        tss_t                          thrd_timeout
+        mtx_t                          thrd_success
+        tss_dtor_t                     thrd_busy
+        thrd_start_t                   thrd_error
+        once_flag                      thrd_nomem
+        xtime
+      void call_once(once_flag *flag, void (*func)(void));
+      int cnd_broadcast(cnd_t *cond);
+      void cnd_destroy(cnd_t *cond);
+      int cnd_init(cnd_t *cond);
+      int cnd_signal(cnd_t *cond);
+      int cnd_timedwait(cnd_t *cond, mtx_t *mtx,
+           const xtime *xt);
+      int cnd_wait(cnd_t *cond, mtx_t *mtx);
+      void mtx_destroy(mtx_t *mtx);
+      int mtx_init(mtx_t *mtx, int type);
+      int mtx_lock(mtx_t *mtx);
+[page 491]
+
+      int mtx_timedlock(mtx_t *mtx, const xtime *xt);
+      int mtx_trylock(mtx_t *mtx);
+      int mtx_unlock(mtx_t *mtx);
+      int thrd_create(thrd_t *thr, thrd_start_t func,
+           void *arg);
+      thrd_t thrd_current(void);
+      int thrd_detach(thrd_t thr);
+      int thrd_equal(thrd_t thr0, thrd_t thr1);
+      void thrd_exit(int res);
+      int thrd_join(thrd_t thr, int *res);
+      void thrd_sleep(const xtime *xt);
+      void thrd_yield(void);
+      int tss_create(tss_t *key, tss_dtor_t dtor);
+      void tss_delete(tss_t key);
+      void *tss_get(tss_t key);
+      int tss_set(tss_t key, void *val);
+      int xtime_get(xtime *xt, int base);
+B.25 Date and time <time.h>
+      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);
+      __STDC_WANT_LIB_EXT1__
+      errno_t
+      rsize_t
+      errno_t asctime_s(char *s, rsize_t maxsize,
+           const struct tm *timeptr);
+
+
+
+[page 492]
+
+        errno_t ctime_s(char *s, rsize_t maxsize,
+             const time_t *timer);
+        struct tm *gmtime_s(const time_t * restrict timer,
+             struct tm * restrict result);
+        struct tm *localtime_s(const time_t * restrict timer,
+             struct tm * restrict result);
+B.26 Unicode utilities <uchar.h>
+        mbstate_t     size_t            char16_t         char32_t
+        size_t mbrtoc16(char16_t * restrict pc16,
+             const char * restrict s, size_t n,
+             mbstate_t * restrict ps);
+        size_t c16rtomb(char * restrict s, char16_t c16,
+             mbstate_t * restrict ps);
+        size_t mbrtoc32(char32_t * restrict pc32,
+             const char * restrict s, size_t n,
+             mbstate_t * restrict ps);
+        size_t c32rtomb(char * restrict s, char32_t c32,
+             mbstate_t * restrict ps);
+B.27 Extended multibyte/wide character utilities <wchar.h>
+        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);
+
+
+
+[page 493]
+
+      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);
+
+
+
+[page 494]
+
+        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);
+
+
+
+[page 495]
+
+      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);
+      __STDC_WANT_LIB_EXT1__
+      errno_t
+      rsize_t
+      int fwprintf_s(FILE * restrict stream,
+           const wchar_t * restrict format, ...);
+      int fwscanf_s(FILE * restrict stream,
+           const wchar_t * restrict format, ...);
+      int snwprintf_s(wchar_t * restrict s,
+           rsize_t n,
+           const wchar_t * restrict format, ...);
+      int swprintf_s(wchar_t * restrict s, rsize_t n,
+           const wchar_t * restrict format, ...);
+      int swscanf_s(const wchar_t * restrict s,
+           const wchar_t * restrict format, ...);
+      int vfwprintf_s(FILE * restrict stream,
+           const wchar_t * restrict format,
+           va_list arg);
+      int vfwscanf_s(FILE * restrict stream,
+           const wchar_t * restrict format, va_list arg);
+      int vsnwprintf_s(wchar_t * restrict s,
+           rsize_t n,
+           const wchar_t * restrict format,
+           va_list arg);
+      int vswprintf_s(wchar_t * restrict s,
+           rsize_t n,
+           const wchar_t * restrict format,
+           va_list arg);
+      int vswscanf_s(const wchar_t * restrict s,
+           const wchar_t * restrict format,
+           va_list arg);
+
+
+
+[page 496]
+
+        int vwprintf_s(const wchar_t * restrict format,
+             va_list arg);
+        int vwscanf_s(const wchar_t * restrict format,
+             va_list arg);
+        int wprintf_s(const wchar_t * restrict format, ...);
+        int wscanf_s(const wchar_t * restrict format, ...);
+        errno_t wcscpy_s(wchar_t * restrict s1,
+             rsize_t s1max,
+             const wchar_t * restrict s2);
+        errno_t wcsncpy_s(wchar_t * restrict s1,
+             rsize_t s1max,
+             const wchar_t * restrict s2,
+             rsize_t n);
+        errno_t wmemcpy_s(wchar_t * restrict s1,
+             rsize_t s1max,
+             const wchar_t * restrict s2,
+             rsize_t n);
+        errno_t wmemmove_s(wchar_t *s1, rsize_t s1max,
+             const wchar_t *s2, rsize_t n);
+        errno_t wcscat_s(wchar_t * restrict s1,
+             rsize_t s1max,
+             const wchar_t * restrict s2);
+        errno_t wcsncat_s(wchar_t * restrict s1,
+             rsize_t s1max,
+             const wchar_t * restrict s2,
+             rsize_t n);
+        wchar_t *wcstok_s(wchar_t * restrict s1,
+             rsize_t * restrict s1max,
+             const wchar_t * restrict s2,
+             wchar_t ** restrict ptr);
+        size_t wcsnlen_s(const wchar_t *s, size_t maxsize);
+        errno_t wcrtomb_s(size_t * restrict retval,
+             char * restrict s, rsize_t smax,
+             wchar_t wc, mbstate_t * restrict ps);
+        errno_t mbsrtowcs_s(size_t * restrict retval,
+             wchar_t * restrict dst, rsize_t dstmax,
+             const char ** restrict src, rsize_t len,
+             mbstate_t * restrict ps);
+
+
+
+
+[page 497]
+
+      errno_t wcsrtombs_s(size_t * restrict retval,
+           char * restrict dst, rsize_t dstmax,
+           const wchar_t ** restrict src, rsize_t len,
+           mbstate_t * restrict ps);
+B.28 Wide character classification and mapping utilities <wctype.h>
+      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);
+
+
+
+
+[page 498]
+
+                                          Annex C
+                                        (informative)
+                                      Sequence points
+1   The following are the sequence points described in 5.1.2.3:
+    -- Between the evaluations of the function designator and actual arguments in a function
+      call and the actual call. (6.5.2.2).
+    -- Between the evaluations of the first and second operands of the following operators:
+      logical AND && (6.5.13); logical OR || (6.5.14); comma , (6.5.17).                  *
+    -- Between the evaluations of the first operand of the conditional ? : operator and
+      whichever of the second and third operands is evaluated (6.5.15).
+    -- The end of a full declarator: declarators (6.7.6);
+    -- Between the evaluation of a full expression and the next full expression to be
+      evaluated. The following are full expressions: an initializer that is not part of a
+      compound literal (6.7.9); the expression in an expression statement (6.8.3); the
+      controlling expression of a selection statement (if or switch) (6.8.4); the
+      controlling expression of a while or do statement (6.8.5); each of the (optional)
+      expressions of a for statement (6.8.5.3); the (optional) expression in a return
+      statement (6.8.6.4).
+    -- Immediately before a library function returns (7.1.4).
+    -- After the actions associated with each formatted input/output function conversion
+      specifier (7.21.6, 7.28.2).
+    -- 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 (7.22.5).
+
+
+
+
+[page 499]
+
+                                         Annex D
+                                        (normative)
+                   Universal character names for identifiers
+1   This clause lists the hexadecimal code values that are valid in universal character names
+    in identifiers.
+    D.1 Ranges of characters allowed
+1   00A8, 00AA, 00AD, 00AF, 00B2-00B5, 00B7-00BA, 00BC-00BE, 00C0-00D6,
+    00D8-00F6, 00F8-00FF
+2   0100-167F, 1681-180D, 180F-1FFF
+3   200B-200D, 202A-202E, 203F-2040, 2054, 2060-206F
+4   2070-218F, 2460-24FF, 2776-2793, 2C00-2DFF, 2E80-2FFF
+5   3004-3007, 3021-302F, 3031-303F
+6   3040-D7FF
+7   F900-FD3D, FD40-FDCF, FDF0-FE44, FE47-FFFD
+8   10000-1FFFD, 20000-2FFFD, 30000-3FFFD, 40000-4FFFD, 50000-5FFFD,
+    60000-6FFFD, 70000-7FFFD, 80000-8FFFD, 90000-9FFFD, A0000-AFFFD,
+    B0000-BFFFD, C0000-CFFFD, D0000-DFFFD, E0000-EFFFD
+    D.2 Ranges of characters disallowed initially
+1   0300-036F, 1DC0-1DFF, 20D0-20FF, FE20-FE2F
+
+
+
+
+[page 500]
+
+                                         Annex E
+                                       (informative)
+                                Implementation limits
+1   The contents of the header <limits.h> 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 5.2.4.2.1.
+            #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 <float.h> 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 5.2.4.2.2.
+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:
+[page 501]
+
+           #define    DLB_DECIMAL_DIG                                10
+           #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_DECIMAL_DIG                                 6
+           #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    LDLB_DECIMAL_DIG                               10
+           #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
+
+
+
+
+[page 502]
+
+                                               Annex F
+                                              (normative)
+                          IEC 60559 floating-point arithmetic
+    F.1 Introduction
+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.343)
+    Where a binding between the C language and IEC 60559 is indicated, the
+    IEC 60559-specified behavior is adopted by reference, unless stated otherwise. Since
+    negative and positive infinity are representable in IEC 60559 formats, all real numbers lie
+    within the range of representable values.
+    F.2 Types
+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,344) 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.345)
+
+
+
+
+    343) Implementations that do not define __STDC_IEC_559__ are not required to conform to these
+         specifications.
+    344) ''Extended'' is IEC 60559's double-extended data format. Extended refers to both the common 80-bit
+         and quadruple 128-bit IEC 60559 formats.
+    345) A non-IEC 60559 long double type is required to provide infinity and NaNs, as its values include
+         all double values.
+
+[page 503]
+
+    Recommended practice
+2   The long double type should match an IEC 60559 extended format.
+    F.2.1 Infinities, signed zeros, and NaNs
+1   This specification does not define the behavior of signaling NaNs.346) It generally uses
+    the term NaN to denote quiet NaNs. The NAN and INFINITY macros and the nan
+    functions in <math.h> provide designations for IEC 60559 NaNs and infinities.
+    F.3 Operators and functions
+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 <math.h> provide the IEC 60559 square root operation.
+    -- The remainder functions in <math.h> provide the IEC 60559 remainder
+      operation. The remquo functions in <math.h> provide the same operation but
+      with additional information.
+    -- The rint functions in <math.h> provide the IEC 60559 operation that rounds a
+      floating-point number to an integer value (in the same precision). The nearbyint
+      functions in <math.h> 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 <math.h> 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 <stdlib.h>,
+
+
+    346) Since NaNs created by IEC 60559 operations are always quiet, quiet NaNs (along with infinities) are
+         sufficient for closure of the arithmetic.
+
+[page 504]
+
+   <stdio.h>, and <wchar.h> provide IEC 60559 binary-decimal conversions. The
+   strtold function in <stdlib.h> provides the conv function recommended in the
+   Appendix to ANSI/IEEE 854.
+-- 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 <math.h>
+  supplement the language operators to address this need. The islessgreater and
+  isunordered macros provide respectively a quiet version of the <> predicate and
+  the unordered predicate recommended in the Appendix to IEC 60559.
+-- The feclearexcept, feraiseexcept, and fetestexcept functions in
+  <fenv.h> provide the facility to test and alter the IEC 60559 floating-point
+  exception status flags. The fegetexceptflag and fesetexceptflag
+  functions in <fenv.h> 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 <fenv.h>.
+-- The fegetround and fesetround functions in <fenv.h> provide the facility
+  to select among the IEC 60559 directed rounding modes represented by the rounding
+  direction macros in <fenv.h> (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
+  <fenv.h> provide a facility to manage the floating-point environment, comprising
+  the IEC 60559 status flags and control modes.
+-- The copysign functions in <math.h> provide the copysign function
+  recommended in the Appendix to IEC 60559.
+-- The fabs functions in <math.h> provide the abs function recommended in the
+  Appendix to IEC 60559.
+-- The unary minus (-) operator provides the unary minus (-) operation recommended
+  in the Appendix to IEC 60559.
+-- The scalbn and scalbln functions in <math.h> provide the scalb function
+  recommended in the Appendix to IEC 60559.
+-- The logb functions in <math.h> 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 <math.h> provide the nextafter
+  function recommended in the Appendix to IEC 60559 (but with a minor change to
+
+[page 505]
+
+        better handle signed zeros).
+    -- The isfinite macro in <math.h> provides the finite function recommended in
+      the Appendix to IEC 60559.
+    -- The isnan macro in <math.h> provides the isnan function recommended in the
+      Appendix to IEC 60559.
+    -- The signbit macro and the fpclassify macro in <math.h>, 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 7.12.3 do not distinguish signaling from quiet NaNs).
+    F.4 Floating to integer conversion
+1   If the integer type is _Bool, 6.3.1.2 applies and no floating-point exceptions are raised
+    (even for NaN). Otherwise, 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. Otherwise, the resulting
+    value is determined by 6.3.1.4. Conversion of an integral floating value that does not
+    exceed the range of the integer type raises no floating-point exceptions; whether
+    conversion of a non-integral floating value raises the ''inexact'' floating-point exception is
+    unspecified.347)
+    F.5 Binary-decimal conversion
+1   Conversion from the widest supported IEC 60559 format to decimal with
+    DECIMAL_DIG digits and back is the identity function.348)
+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.
+
+
+
+    347) 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
+         <math.h>.
+    348) 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.)
+
+[page 506]
+
+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.
+    F.6 The return statement
+    If the return expression is evaluated in a floating-point format different from the return
+    type, the expression is converted as if by assignment349) to the return type of the function
+    and the resulting value is returned to the caller.
+    F.7 Contracted expressions
+1   A contracted expression is correctly rounded (once) and 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.                                    *
+    F.8 Floating-point environment
+1   The floating-point environment defined in <fenv.h> 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.350)
+    F.8.1 Environment management
+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
+    <fenv.h>) is ''on'', these changes to the floating-point state are treated as side effects
+    which respect sequence points.351)
+
+
+
+
+    349) Assignment removes any extra range and precision.
+    350) This specification does not require dynamic rounding precision nor trap enablement modes.
+    351) 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 F.9).
+
+[page 507]
+
+    F.8.2 Translation
+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
+    floating-point exception, other than ''inexact'';352) the implementation should then
+    proceed with the translation of the program.
+    F.8.3 Execution
+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.
+    F.8.4 Constant expressions
+1   An arithmetic constant expression of floating type, other than one in an initializer for an
+    object that has static or thread 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'').353)
+2   EXAMPLE
+
+
+
+    352) 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.
+    353) 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;
+
+
+[page 508]
+
+             #include <fenv.h>
+             #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
+    execution time.
+
+    F.8.5 Initialization
+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 or thread storage duration is done (as if) at
+    translation time.
+2   EXAMPLE
+             #include <fenv.h>
+             #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.354) 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
+
+
+
+    354) 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.
+
+[page 509]
+
+    their internal representations occur at translation time in all cases.
+
+    F.8.6 Changing the environment
+1   Operations defined in 6.5 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 <fenv.h> 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''.
+    F.9 Optimization
+1   This section identifies code transformations that might subvert IEC 60559-specified
+    behavior, and others that do not.
+    F.9.1 Global transformations
+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 <fenv.h>
+             #pragma STDC FENV_ACCESS ON
+             void f(double x)
+             {
+                  /* ... */
+                  for (i = 0; i < 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 >= 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 (> 1) may vary from what the source code expresses. Thus,
+[page 510]
+
+    the preceding loop could be treated as
+             if (0 < n) x + 1;
+    F.9.2 Expression transformations
+1   x/2 (<->) x 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 x and x/1 (->) x The expressions 1 x x, x/1, and x are equivalent (on IEC 60559
+                      machines, among others).355)
+    x/x (->) 1.0             The expressions x/x and 1.0 are not equivalent if x can be zero,
+                           infinite, or NaN.
+    x - y (<->) x + (-y)       The expressions x - y, x + (-y), and (-y) + x are equivalent (on
+                           IEC 60559 machines, among others).
+    x - y (<->) -(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).356)
+    x - x (->) 0.0           The expressions x - x and 0.0 are not equivalent if x is a NaN or
+                           infinite.
+    0 x x (->) 0.0           The expressions 0 x x and 0.0 are not equivalent if x is a NaN,
+                           infinite, or -0.
+    x+0(->) 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(->) 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 might be zero.
+    -x (<->) 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).
+
+    355) Strict support for signaling NaNs -- not required by this specification -- would invalidate these and
+         other transformations that remove arithmetic operators.
+    356) 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.
+
+[page 511]
+
+    F.9.3 Relational operators
+1   x != x (->) false           The expression x != x is true if x is a NaN.
+    x = x (->) true            The expression x = x is false if x is a NaN.
+    x < y (->) isless(x,y) (and similarly for <=, >, >=) 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 < b)
+                     f();
+             else
+                     g();
+    is not equivalent to
+             // calls f and raises ''invalid'' if a and b are unordered
+             if (a >= 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
+             // calls g without raising ''invalid'' if a and b are unordered
+             if (isless(a,b))
+                     f();
+             else
+                     g();
+    but is equivalent to
+
+
+
+
+[page 512]
+
+            if (!(a < b))
+                  g();
+            else
+                  f();
+
+    F.9.4 Constant arithmetic
+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 F.8.4
+    and F.8.5.) 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,357) 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.
+    F.10 Mathematics <math.h>
+1   This subclause contains specifications of <math.h> 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 <math.h> are covered directly or indirectly by
+    IEC 60559. The functions that IEC 60559 specifies directly are identified in F.3. The
+    other functions in <math.h> 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 & 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
+    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.358)
+
+
+    357) 0 - 0 yields -0 instead of +0 just when the rounding direction is downward.
+    358) IEC 60559 allows different definitions of underflow. They all result in the same values, but differ on
+         when the floating-point exception is raised.
+
+[page 513]
+
+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.359) Otherwise, as implied by F.8.6, the <math.h> 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 <math.h>.
+     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.
+     F.10.1 Trigonometric functions
+     F.10.1.1 The acos functions
+1    -- acos(1) returns +0.
+     -- acos(x) returns a NaN and raises the ''invalid'' floating-point exception for
+       | x | > 1.
+     F.10.1.2 The asin functions
+1    -- asin((+-)0) returns (+-)0.
+     -- asin(x) returns a NaN and raises the ''invalid'' floating-point exception for
+       | x | > 1.
+
+
+
+
+     359) It is intended that undeserved ''underflow'' and ''inexact'' floating-point exceptions are raised only if
+          avoiding them would be too costly.
+
+[page 514]
+
+    F.10.1.3 The atan functions
+1   -- atan((+-)0) returns (+-)0.
+    -- atan((+-)(inf)) returns (+-)pi /2.
+    F.10.1.4 The atan2 functions
+1   -- atan2((+-)0, -0) returns (+-)pi .360)
+    -- atan2((+-)0, +0) returns (+-)0.
+    -- atan2((+-)0, x) returns (+-)pi for x < 0.
+    -- atan2((+-)0, x) returns (+-)0 for x > 0.
+    -- atan2(y, (+-)0) returns -pi /2 for y < 0.
+    -- atan2(y, (+-)0) returns pi /2 for y > 0.
+    -- atan2((+-)y, -(inf)) returns (+-)pi for finite y > 0.
+    -- atan2((+-)y, +(inf)) returns (+-)0 for finite y > 0.
+    -- atan2((+-)(inf), x) returns (+-)pi /2 for finite x.
+    -- atan2((+-)(inf), -(inf)) returns (+-)3pi /4.
+    -- atan2((+-)(inf), +(inf)) returns (+-)pi /4.
+    F.10.1.5 The cos functions
+1   -- cos((+-)0) returns 1.
+    -- cos((+-)(inf)) returns a NaN and raises the ''invalid'' floating-point exception.
+    F.10.1.6 The sin functions
+1   -- sin((+-)0) returns (+-)0.
+    -- sin((+-)(inf)) returns a NaN and raises the ''invalid'' floating-point exception.
+    F.10.1.7 The tan functions
+1   -- tan((+-)0) returns (+-)0.
+    -- tan((+-)(inf)) returns a NaN and raises the ''invalid'' floating-point exception.
+
+
+
+
+    360) atan2(0, 0) does not raise the ''invalid'' floating-point exception, nor does atan2( y , 0) raise
+         the ''divide-by-zero'' floating-point exception.
+
+[page 515]
+
+    F.10.2 Hyperbolic functions
+    F.10.2.1 The acosh functions
+1   -- acosh(1) returns +0.
+    -- acosh(x) returns a NaN and raises the ''invalid'' floating-point exception for x < 1.
+    -- acosh(+(inf)) returns +(inf).
+    F.10.2.2 The asinh functions
+1   -- asinh((+-)0) returns (+-)0.
+    -- asinh((+-)(inf)) returns (+-)(inf).
+    F.10.2.3 The atanh functions
+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 | > 1.
+    F.10.2.4 The cosh functions
+1   -- cosh((+-)0) returns 1.
+    -- cosh((+-)(inf)) returns +(inf).
+    F.10.2.5 The sinh functions
+1   -- sinh((+-)0) returns (+-)0.
+    -- sinh((+-)(inf)) returns (+-)(inf).
+    F.10.2.6 The tanh functions
+1   -- tanh((+-)0) returns (+-)0.
+    -- tanh((+-)(inf)) returns (+-)1.
+    F.10.3 Exponential and logarithmic functions
+    F.10.3.1 The exp functions
+1   -- exp((+-)0) returns 1.
+    -- exp(-(inf)) returns +0.
+    -- exp(+(inf)) returns +(inf).
+
+
+
+
+[page 516]
+
+    F.10.3.2 The exp2 functions
+1   -- exp2((+-)0) returns 1.
+    -- exp2(-(inf)) returns +0.
+    -- exp2(+(inf)) returns +(inf).
+    F.10.3.3 The expm1 functions
+1   -- expm1((+-)0) returns (+-)0.
+    -- expm1(-(inf)) returns -1.
+    -- expm1(+(inf)) returns +(inf).
+    F.10.3.4 The frexp functions
+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   When the radix of the argument is a power of 2, the returned value is exact and is
+    independent of the current rounding direction mode.
+4   On a binary system, the body of the frexp function might be
+            {
+                   *exp = (value == 0) ? 0 : (int)(1 + logb(value));
+                   return scalbn(value, -(*exp));
+            }
+    F.10.3.5 The ilogb functions
+1   When the correct result is representable in the range of the return type, the returned value
+    is exact and is independent of the current rounding direction mode.
+2   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 517]
+
+    F.10.3.6 The ldexp functions
+1   On a binary system, ldexp(x, exp) is equivalent to scalbn(x, exp).
+    F.10.3.7 The log functions
+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 < 0.
+    -- log(+(inf)) returns +(inf).
+    F.10.3.8 The log10 functions
+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 < 0.
+    -- log10(+(inf)) returns +(inf).
+    F.10.3.9 The log1p functions
+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 < -1.
+    -- log1p(+(inf)) returns +(inf).
+    F.10.3.10 The log2 functions
+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 < 0.
+    -- log2(+(inf)) returns +(inf).
+    F.10.3.11 The logb functions
+1   -- logb((+-)0) returns -(inf) and raises the ''divide-by-zero'' floating-point exception.
+    -- logb((+-)(inf)) returns +(inf).
+2   The returned value is exact and is independent of the current rounding direction mode.
+
+
+
+
+[page 518]
+
+    F.10.3.12 The modf functions
+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   The returned values are exact and are independent of the current rounding direction
+    mode.
+3   modf behaves as though implemented by
+            #include <math.h>
+            #include <fenv.h>
+            #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);
+            }
+    F.10.3.13 The scalbn and scalbln functions
+1   -- scalbn((+-)0, n) returns (+-)0.
+    -- scalbn(x, 0) returns x.
+    -- scalbn((+-)(inf), n) returns (+-)(inf).
+2   If the calculation does not overflow or underflow, the returned value is exact and
+    independent of the current rounding direction mode.
+
+
+
+
+[page 519]
+
+    F.10.4 Power and absolute value functions
+    F.10.4.1 The cbrt functions
+1   -- cbrt((+-)0) returns (+-)0.
+    -- cbrt((+-)(inf)) returns (+-)(inf).
+    F.10.4.2 The fabs functions
+1   -- fabs((+-)0) returns +0.
+    -- fabs((+-)(inf)) returns +(inf).
+2   The returned value is exact and is independent of the current rounding direction mode.
+    F.10.4.3 The hypot functions
+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.
+    F.10.4.4 The pow functions
+1   -- pow((+-)0, y) returns (+-)(inf) and raises the ''divide-by-zero'' floating-point exception
+      for y an odd integer < 0.
+    -- pow((+-)0, y) returns +(inf) and raises the ''divide-by-zero'' floating-point exception
+      for y < 0, finite, and not an odd integer.
+    -- pow((+-)0, -(inf)) returns +(inf) and may raise the ''divide-by-zero'' floating-point
+      exception.
+    -- pow((+-)0, y) returns (+-)0 for y an odd integer > 0.
+    -- pow((+-)0, y) returns +0 for y > 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 < 0 and finite non-integer y.
+    -- pow(x, -(inf)) returns +(inf) for | x | < 1.
+    -- pow(x, -(inf)) returns +0 for | x | > 1.
+    -- pow(x, +(inf)) returns +0 for | x | < 1.
+    -- pow(x, +(inf)) returns +(inf) for | x | > 1.
+
+
+[page 520]
+
+    -- pow(-(inf), y) returns -0 for y an odd integer < 0.
+    -- pow(-(inf), y) returns +0 for y < 0 and not an odd integer.
+    -- pow(-(inf), y) returns -(inf) for y an odd integer > 0.
+    -- pow(-(inf), y) returns +(inf) for y > 0 and not an odd integer.
+    -- pow(+(inf), y) returns +0 for y < 0.
+    -- pow(+(inf), y) returns +(inf) for y > 0.
+    F.10.4.5 The sqrt functions
+1   sqrt is fully specified as a basic arithmetic operation in IEC 60559. The returned value
+    is dependent on the current rounding direction mode.
+    F.10.5 Error and gamma functions
+    F.10.5.1 The erf functions
+1   -- erf((+-)0) returns (+-)0.
+    -- erf((+-)(inf)) returns (+-)1.
+    F.10.5.2 The erfc functions
+1   -- erfc(-(inf)) returns 2.
+    -- erfc(+(inf)) returns +0.
+    F.10.5.3 The lgamma functions
+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).
+    F.10.5.4 The tgamma functions
+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).
+
+
+
+[page 521]
+
+    F.10.6 Nearest integer functions
+    F.10.6.1 The ceil functions
+1   -- ceil((+-)0) returns (+-)0.
+    -- ceil((+-)(inf)) returns (+-)(inf).
+2   The returned value is independent of the current rounding direction mode.
+3   The double version of ceil behaves as though implemented by
+           #include <math.h>
+           #include <fenv.h>
+           #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;
+           }
+4   The ceil functions may, but are not required to, raise the ''inexact'' floating-point
+    exception for finite non-integer arguments, as this implementation does.
+    F.10.6.2 The floor functions
+1   -- floor((+-)0) returns (+-)0.
+    -- floor((+-)(inf)) returns (+-)(inf).
+2   The returned value and is independent of the current rounding direction mode.
+3   See the sample implementation for ceil in F.10.6.1. The floor functions may, but are
+    not required to, raise the ''inexact'' floating-point exception for finite non-integer
+    arguments, as that implementation does.
+    F.10.6.3 The nearbyint functions
+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).
+
+
+
+[page 522]
+
+    F.10.6.4 The rint functions
+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.
+    F.10.6.5 The lrint and llrint functions
+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.
+    F.10.6.6 The round functions
+1   -- round((+-)0) returns (+-)0.
+    -- round((+-)(inf)) returns (+-)(inf).
+2   The returned value is independent of the current rounding direction mode.
+3   The double version of round behaves as though implemented by
+            #include <math.h>
+            #include <fenv.h>
+            #pragma STDC FENV_ACCESS ON
+            double round(double x)
+            {
+                 double result;
+                 fenv_t save_env;
+                 feholdexcept(&save_env);
+                 result = rint(x);
+                 if (fetestexcept(FE_INEXACT)) {
+                      fesetround(FE_TOWARDZERO);
+                      result = rint(copysign(0.5 + fabs(x), x));
+                 }
+                 feupdateenv(&save_env);
+                 return result;
+            }
+    The round functions may, but are not required to, raise the ''inexact'' floating-point
+    exception for finite non-integer numeric arguments, as this implementation does.
+
+
+
+
+[page 523]
+
+    F.10.6.7 The lround and llround functions
+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.
+    F.10.6.8 The trunc functions
+1   The trunc functions use IEC 60559 rounding toward zero (regardless of the current
+    rounding direction). The returned value is exact.
+    -- trunc((+-)0) returns (+-)0.
+    -- trunc((+-)(inf)) returns (+-)(inf).
+2   The returned value is independent of the current rounding direction mode. The trunc
+    functions may, but are not required to, raise the ''inexact'' floating-point exception for
+    finite non-integer arguments.
+    F.10.7 Remainder functions
+    F.10.7.1 The fmod functions
+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 (and neither is a NaN).
+    -- fmod(x, (+-)(inf)) returns x for x not infinite.
+2   When subnormal results are supported, the returned value is exact and is independent of
+    the current rounding direction mode.
+3   The double version of fmod behaves as though implemented by
+           #include <math.h>
+           #include <fenv.h>
+           #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);
+           }
+
+
+
+
+[page 524]
+
+    F.10.7.2 The remainder functions
+1   The remainder functions are fully specified as a basic arithmetic operation in
+    IEC 60559.
+2   When subnormal results are supported, the returned value is exact and is independent of
+    the current rounding direction mode.
+    F.10.7.3 The remquo functions
+1   The remquo functions follow the specifications for the remainder functions. They
+    have no further specifications special to IEC 60559 implementations.
+2   When subnormal results are supported, the returned value is exact and is independent of
+    the current rounding direction mode.
+    F.10.8 Manipulation functions
+    F.10.8.1 The copysign functions
+1   copysign is specified in the Appendix to IEC 60559.
+2   The returned value is exact and is independent of the current rounding direction mode.
+    F.10.8.2 The nan functions
+1   All IEC 60559 implementations support quiet NaNs, in all floating formats.
+2   The returned value is exact and is independent of the current rounding direction mode.
+    F.10.8.3 The nextafter functions
+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.
+2   Even though underflow or overflow can occur, the returned value is independent of the
+    current rounding direction mode.
+    F.10.8.4 The nexttoward functions
+1   No additional requirements beyond those on nextafter.
+2   Even though underflow or overflow can occur, the returned value is independent of the
+    current rounding direction mode.
+
+
+
+
+[page 525]
+
+    F.10.9 Maximum, minimum, and positive difference functions
+    F.10.9.1 The fdim functions
+1   No additional requirements.
+    F.10.9.2 The fmax functions
+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 returned value is exact and is independent of the current rounding direction mode.
+3   The body of the fmax function might be361)
+           { return (isgreaterequal(x, y) ||
+                isnan(y)) ? x : y; }
+    F.10.9.3 The fmin functions
+1   The fmin functions are analogous to the fmax functions (see F.10.9.2).
+2   The returned value is exact and is independent of the current rounding direction mode.
+    F.10.10 Floating multiply-add
+    F.10.10.1 The fma functions
+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.
+
+
+
+
+    361) 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.
+
+[page 526]
+
+    F.10.11 Comparison macros
+1   Relational operators and their corresponding comparison macros (7.12.14) produce
+    equivalent result values, even if argument values are represented in wider formats. Thus,
+    comparison macro arguments represented in formats wider than their semantic types are
+    not converted to the semantic types, unless the wide evaluation method converts operands
+    of relational operators to their semantic types. The standard wide evaluation methods
+    characterized by FLT_EVAL_METHOD equal to 1 or 2 (5.2.4.2.2), do not convert
+    operands of relational operators to their semantic types.
+
+
+
+
+[page 527]
+
+                                           Annex G
+                                          (normative)
+                   IEC 60559-compatible complex arithmetic
+    G.1 Introduction
+1   This annex supplements annex F to specify complex arithmetic for compatibility with
+    IEC 60559 real floating-point arithmetic. An implementation that defines *
+    __STDC_IEC_559_COMPLEX__ shall conform to the specifications in this annex.362)
+    G.2 Types
+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.
+    G.3 Conventions
+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.
+
+
+
+
+    362) Implementations that do not define __STDC_IEC_559_COMPLEX__ are not required to conform
+         to these specifications.
+
+[page 528]
+
+    G.4 Conversions
+    G.4.1 Imaginary types
+1   Conversions among imaginary types follow rules analogous to those for real floating
+    types.
+    G.4.2 Real and imaginary
+1   When a value of imaginary type is converted to a real type other than _Bool,363) 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.
+    G.4.3 Imaginary and complex
+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.
+    G.5 Binary operators
+1   The following subclauses supplement 6.5 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 G.5.1), but is
+    not completely determined.
+
+
+
+
+    363) See 6.3.1.2.
+
+[page 529]
+
+    G.5.1 Multiplicative operators
+    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:364)
+    -- 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;
+
+
+
+
+    364) 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'').
+
+[page 530]
+
+    -- 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 G.6).
+             #include <math.h>
+             #include <complex.h>
+             /* 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) && 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 && (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) {
+
+[page 531]
+
+                                      x = INFINITY * ( a * c - b * d );
+                                      y = INFINITY * ( a * d + b * c );
+                           }
+                     }
+                     return x + I * y;
+            }
+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 <math.h>
+            #include <complex.h>
+            /* 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 (logbw == INFINITY) {
+                          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) && isnan(y)) {
+                           if ((denom == 0.0) &&
+                                 (!isnan(a) || !isnan(b))) {
+                                 x = copysign(INFINITY, c) * a;
+                                 y = copysign(INFINITY, c) * b;
+                           }
+                           else if ((isinf(a) || isinf(b)) &&
+                                 isfinite(c) && 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) &&
+                                 isfinite(a) && 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 );
+
+[page 532]
+
+                           }
+                     }
+                     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.
+
+    G.5.2 Additive operators
+    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)
+    G.6 Complex arithmetic <complex.h>
+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 7.3). Notwithstanding
+    the provisions of 7.1.3, a program may undefine and then perhaps redefine the macro
+    imaginary.
+2   This subclause contains specifications for the <complex.h> 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 533]
+
+    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.10.365)
+5   The functions cimag, conj, cproj, and creal are fully specified for all
+    implementations, including IEC 60559 ones, in 7.3.9. 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 annex F):
+            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).
+
+
+
+
+    365) As noted in G.3, a complex value with at least one infinite part is regarded as an infinity even if its
+         other part is a NaN.
+
+[page 534]
+
+    G.6.1 Trigonometric functions
+    G.6.1.1 The cacos functions
+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.
+    G.6.2 Hyperbolic functions
+    G.6.2.1 The cacosh functions
+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.
+
+
+[page 535]
+
+    -- 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.
+    G.6.2.2 The casinh functions
+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.
+    G.6.2.3 The catanh functions
+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.
+
+[page 536]
+
+    -- 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.
+    G.6.2.4 The ccosh functions
+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.
+    G.6.2.5 The csinh functions
+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).
+[page 537]
+
+    -- 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.
+    G.6.2.6 The ctanh functions
+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.
+
+
+
+
+[page 538]
+
+    G.6.3 Exponential and logarithmic functions
+    G.6.3.1 The cexp functions
+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.
+    G.6.3.2 The clog functions
+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.
+
+[page 539]
+
+    -- 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.
+    G.6.4 Power and absolute-value functions
+    G.6.4.1 The cpow functions
+1   The cpow functions raise floating-point exceptions if appropriate for the calculation of
+    the parts of the result, and may also raise spurious floating-point exceptions.366)
+    G.6.4.2 The csqrt functions
+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.
+
+
+
+
+    366) This allows cpow( z , c ) to be implemented as cexp(c      clog( z )) without precluding
+         implementations that treat special cases more carefully.
+
+[page 540]
+
+    G.7 Type-generic math <tgmath.h>
+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)
+
+
+
+
+[page 541]
+
+                                          Annex H
+                                        (informative)
+                        Language independent arithmetic
+    H.1 Introduction
+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 (annex F) in that it covers integer and diverse floating-point arithmetics.
+    H.2 Types
+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 5.2.8).
+    H.2.1 Boolean type
+1   The LIA-1 data type Boolean is implemented by the C data type bool with values of
+    true and false, all from <stdbool.h>.
+    H.2.2 Integer types
+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.
+
+
+
+
+[page 542]
+
+    H.2.2.1 Integer operations
+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 < y
+    leqI           x <= y
+    gtrI           x > y
+    geqI           x >= y
+    where x and y are expressions of the same integer type.
+    H.2.3 Floating-point types
+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 annex F) along with IEC 60559 status flags and traps has LIA-1
+    conformant types.
+    H.2.3.1 Floating-point parameters
+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:
+
+
+[page 543]
+
+    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
+    H.2.3.2 Floating-point operations
+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, &y), modf(x, &y), modfl(x, &y)
+    fractpartF    modff(x, &y), modf(x, &y), modfl(x, &y)
+    eqF           x == y
+    neqF          x != y
+    lssF          x < y
+    leqF          x <= y
+    gtrF          x > y
+    geqF          x >= 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.
+    H.2.3.3 Rounding styles
+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
+
+
+[page 544]
+
+    nearest       FLT_ROUNDS == 1
+    other         FLT_ROUNDS != 0 && 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.
+    H.2.4 Type conversions
+1   The LIA-1 type conversions are the following type casts:
+    cvtI' (->) I     (int)i, (long int)i, (long long int)i,
+                  (unsigned int)i, (unsigned long int)i,
+                  (unsigned long long int)i
+    cvtF (->) I      (int)x, (long int)x, (long long int)x,
+                  (unsigned int)x, (unsigned long int)x,
+                  (unsigned long long int)x
+    cvtI (->) F      (float)i, (double)i, (long double)i
+    cvtF' (->) 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 <= (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.
+
+
+
+
+[page 545]
+
+    H.3 Notification
+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.
+    H.3.1 Notification alternatives
+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.
+    H.3.1.1 Indicators
+1   C's <fenv.h> 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
+[page 546]
+
+    and ''hard to ignore'' message (see LIA-1 subclause 6.1.2)
+5   LIA-1 does not make the distinction between floating-point and integer for ''undefined''.
+    This documentation makes that distinction because <fenv.h> covers only the floating-
+    point indicators.
+    H.3.1.2 Traps
+1   C is compatible with LIA-1's trap requirements for arithmetic operations, but not for
+    math library functions (which are not permitted to invoke a user's signal handler for
+    SIGFPE). An implementation can provide an alternative of notification through
+    termination with a ''hard-to-ignore'' message (see LIA-1 subclause 6.1.3).
+2   LIA-1 does not require that traps be precise.
+3   C does require that SIGFPE be the signal corresponding to LIA-1 arithmetic exceptions,
+    if there is any signal raised for them.
+4   C supports signal handlers for SIGFPE and allows trapping of LIA-1 arithmetic
+    exceptions. When LIA-1 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 547]
+
+                                           Annex I
+                                        (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 (6.2.1, 6.7.2.3).
+    -- A block with initialization of an object that has automatic storage duration is jumped
+      into (6.2.4).
+    -- 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 (6.3).
+    -- A hexadecimal floating constant cannot be represented exactly in its evaluation format
+      (6.4.4.2).
+    -- An integer character constant includes more than one character or a wide character
+      constant includes more than one multibyte character (6.4.4.4).
+    -- The characters /* are found in a comment (6.4.7).
+    -- An ''unordered'' binary operator (not comma, &&, 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 (6.5).
+    -- A function is called but no prototype has been supplied (6.5.2.2).
+    -- 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 (6.5.2.2).
+    -- An object is defined but not used (6.7).
+    -- 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
+      (6.7.2.2).
+    -- An aggregate has a partly bracketed initialization (6.7.8).
+    -- A statement cannot be reached (6.8).
+    -- A statement with no apparent effect is encountered (6.8).
+    -- A constant expression is used as the controlling expression of a selection statement
+      (6.8.4).
+[page 548]
+
+-- An incorrectly formed preprocessing group is encountered while skipping a
+  preprocessing group (6.10.1).
+-- An unrecognized #pragma directive is encountered (6.10.6).
+
+
+
+
+[page 549]
+
+                                            Annex J
+                                         (informative)
+                                      Portability issues
+1   This annex collects some information about portability that appears in this International
+    Standard.
+    J.1 Unspecified behavior
+1   The following are unspecified:
+    -- The manner and timing of static initialization (5.1.2).
+    -- The termination status returned to the hosted environment if the return type of main
+      is not compatible with int (5.1.2.2.3).
+    -- The behavior of the display device if a printing character is written when the active
+      position is at the final position of a line (5.2.2).
+    -- The behavior of the display device if a backspace character is written when the active
+      position is at the initial position of a line (5.2.2).
+    -- 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 (5.2.2).
+    -- 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 (5.2.2).
+    -- How an extended source character that does not correspond to a universal character
+      name counts toward the significant initial characters in an external identifier (5.2.4.1).
+    -- Many aspects of the representations of types (6.2.6).
+    -- The value of padding bytes when storing values in structures or unions (6.2.6.1).
+    -- The values of bytes that correspond to union members other than the one last stored
+      into (6.2.6.1).
+    -- The representation used when storing a value in an object that has more than one
+      object representation for that value (6.2.6.1).
+    -- The values of any padding bits in integer representations (6.2.6.2).
+    -- Whether certain operators can generate negative zeros and whether a negative zero
+      becomes a normal zero when stored in an object (6.2.6.2).
+    -- Whether two string literals result in distinct arrays (6.4.5).
+    -- The order in which subexpressions are evaluated and the order in which side effects
+      take place, except as specified for the function-call (), &&, ||, ? :, and comma
+[page 550]
+
+   operators (6.5).
+-- The order in which the function designator, arguments, and subexpressions within the
+  arguments are evaluated in a function call (6.5.2.2).
+-- The order of side effects among compound literal initialization list expressions
+  (6.5.2.5).
+-- The order in which the operands of an assignment operator are evaluated (6.5.16).
+-- The alignment of the addressable storage unit allocated to hold a bit-field (6.7.2.1).
+-- Whether a call to an inline function uses the inline definition or the external definition
+  of the function (6.7.4).
+-- 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 (6.7.6.2).
+-- The order in which any side effects occur among the initialization list expressions in
+  an initializer (6.7.9).
+-- The layout of storage for function parameters (6.9.1).
+-- 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 (6.10.3).
+-- The order in which # and ## operations are evaluated during macro substitution
+  (6.10.3.2, 6.10.3.3).
+-- 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'' (7.6.1).
+-- The order in which feraiseexcept raises floating-point exceptions, except as
+  stated in F.8.6 (7.6.2.3).
+-- Whether math_errhandling is a macro or an identifier with external linkage
+  (7.12).
+-- The results of the frexp functions when the specified value is not a floating-point
+  number (7.12.6.4).
+-- The numeric result of the ilogb functions when the correct value is outside the
+  range of the return type (7.12.6.5, F.10.3.5).
+-- The result of rounding when the value is out of range (7.12.9.5, 7.12.9.7, F.10.6.5).
+
+
+[page 551]
+
+-- The value stored by the remquo functions in the object pointed to by quo when y is
+  zero (7.12.10.3).
+-- Whether a comparison macro argument that is represented in a format wider than its
+  semantic type is converted to the semantic type (7.12.14).
+-- Whether setjmp is a macro or an identifier with external linkage (7.13).
+-- Whether va_copy and va_end are macros or identifiers with external linkage
+  (7.16.1).
+-- The hexadecimal digit before the decimal point when a non-normalized floating-point
+  number is printed with an a or A conversion specifier (7.21.6.1, 7.28.2.1).
+-- 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 (7.21.7.10, 7.28.3.10).
+-- The details of the value stored by the fgetpos function (7.21.9.1).
+-- The details of the value returned by the ftell function for a text stream (7.21.9.4).
+-- 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
+  (7.22.1.3, 7.28.4.1.1).
+-- The order and contiguity of storage allocated by successive calls to the calloc,
+  malloc, and realloc functions (7.22.3).
+-- The amount of storage allocated by a successful call to the calloc, malloc, or
+  realloc function when 0 bytes was requested (7.22.3).
+-- Which of two elements that compare as equal is matched by the bsearch function
+  (7.22.5.1).
+-- The order of two elements that compare as equal in an array sorted by the qsort
+  function (7.22.5.2).
+-- The encoding of the calendar time returned by the time function (7.26.2.4).
+-- The characters stored by the strftime or wcsftime function if any of the time
+  values being converted is outside the normal range (7.26.3.5, 7.28.5.1).
+-- The conversion state after an encoding error occurs (7.28.6.3.2, 7.28.6.3.3, 7.28.6.4.1,
+  7.28.6.4.2,
+-- The resulting value when the ''invalid'' floating-point exception is raised during
+  IEC 60559 floating to integer conversion (F.4).
+
+
+
+[page 552]
+
+    -- Whether conversion of non-integer IEC 60559 floating values to integer raises the
+      ''inexact'' floating-point exception (F.4).
+    -- Whether or when library functions in <math.h> raise the ''inexact'' floating-point
+      exception in an IEC 60559 conformant implementation (F.10).
+    -- Whether or when library functions in <math.h> raise an undeserved ''underflow''
+      floating-point exception in an IEC 60559 conformant implementation (F.10).
+    -- The exponent value stored by frexp for a NaN or infinity (F.10.3.4).
+    -- The numeric result returned by the lrint, llrint, lround, and llround
+      functions if the rounded value is outside the range of the return type (F.10.6.5,
+      F.10.6.7).
+    -- The sign of one part of the complex result of several math functions for certain
+      special cases in IEC 60559 compatible implementations (G.6.1.1, G.6.2.2, G.6.2.3,
+      G.6.2.4, G.6.2.5, G.6.2.6, G.6.3.1, G.6.4.2).
+    J.2 Undefined behavior
+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 (5.1.1.2).
+    -- Token concatenation produces a character sequence matching the syntax of a
+      universal character name (5.1.1.2).
+    -- A program in a hosted environment does not define a function named main using one
+      of the specified forms (5.1.2.2.1).
+    -- The execution of a program contains a data race (5.1.2.4).
+    -- 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 (5.2.1).
+    -- 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 (5.2.1.2).
+    -- The same identifier has both internal and external linkage in the same translation unit
+      (6.2.2).
+    -- An object is referred to outside of its lifetime (6.2.4).
+
+
+
+[page 553]
+
+-- The value of a pointer to an object whose lifetime has ended is used (6.2.4).
+-- The value of an object with automatic storage duration is used while it is
+  indeterminate (6.2.4, 6.7.9, 6.8).
+-- A trap representation is read by an lvalue expression that does not have character type
+  (6.2.6.1).
+-- 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 (6.2.6.1).
+-- The operands to certain operators are such that they could produce a negative zero
+  result, but the implementation does not support negative zeros (6.2.6.2).
+-- Two declarations of the same object or function specify types that are not compatible
+  (6.2.7).
+-- A program requires the formation of a composite type from a variable length array
+  type whose size is specified by an expression that is not evaluated (6.2.7).
+-- Conversion to or from an integer type produces a value outside the range that can be
+  represented (6.3.1.4).
+-- Demotion of one real floating type to another produces a value outside the range that
+  can be represented (6.3.1.5).
+-- An lvalue does not designate an object when evaluated (6.3.2.1).
+-- A non-array lvalue with an incomplete type is used in a context that requires the value
+  of the designated object (6.3.2.1).
+-- An lvalue designating an object of automatic storage duration that could have been
+  declared with the register storage class is used in a context that requires the value
+  of the designated object, but the object is uninitialized. (6.3.2.1).
+-- 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 (6.3.2.1).
+-- 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 (6.3.2.2).
+-- Conversion of a pointer to an integer type produces a value outside the range that can
+  be represented (6.3.2.3).
+-- Conversion between two pointer types produces a result that is incorrectly aligned
+  (6.3.2.3).
+-- A pointer is used to call a function whose type is not compatible with the referenced
+  type (6.3.2.3).
+
+
+
+[page 554]
+
+-- An unmatched ' or " character is encountered on a logical source line during
+  tokenization (6.4).
+-- A reserved keyword token is used in translation phase 7 or 8 for some purpose other
+  than as a keyword (6.4.1).
+-- A universal character name in an identifier does not designate a character whose
+  encoding falls into one of the specified ranges (6.4.2.1).
+-- The initial character of an identifier is a universal character name designating a digit
+  (6.4.2.1).
+-- Two identifiers differ only in nonsignificant characters (6.4.2.1).
+-- The identifier __func__ is explicitly declared (6.4.2.2).
+-- The program attempts to modify a string literal (6.4.5).
+-- The characters ', \, ", //, or /* occur in the sequence between the < and >
+  delimiters, or the characters ', \, //, or /* occur in the sequence between the "
+  delimiters, in a header name preprocessing token (6.4.7).
+-- A side effect on a scalar object is unsequenced relative to either a different side effect
+  on the same scalar object or a value computation using the value of the same scalar
+  object (6.5).
+-- An exceptional condition occurs during the evaluation of an expression (6.5).
+-- An object has its stored value accessed other than by an lvalue of an allowable type
+  (6.5).
+-- For a call to a function without a function prototype in scope, the number of *
+  arguments does not equal the number of parameters (6.5.2.2).
+-- 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 (6.5.2.2).
+-- 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)
+  (6.5.2.2).
+-- 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 (6.5.2.2).
+-- A member of an atomic structure or union is accessed (6.5.2.3).
+-- The operand of the unary * operator has an invalid value (6.5.3.2).
+
+
+[page 555]
+
+-- A pointer is converted to other than an integer or pointer type (6.5.4).
+-- The value of the second operand of the / or % operator is zero (6.5.5).
+-- 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 (6.5.6).
+-- 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 (6.5.6).
+-- Pointers that do not point into, or just beyond, the same array object are subtracted
+  (6.5.6).
+-- 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]) (6.5.6).
+-- The result of subtracting two pointers is not representable in an object of type
+  ptrdiff_t (6.5.6).
+-- An expression is shifted by a negative number or by an amount greater than or equal
+  to the width of the promoted expression (6.5.7).
+-- 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 (6.5.7).
+-- Pointers that do not point to the same aggregate or union (nor just beyond the same
+  array object) are compared using relational operators (6.5.8).
+-- An object is assigned to an inexactly overlapping object or to an exactly overlapping
+  object with incompatible type (6.5.16.1).
+-- 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 (6.6).
+-- 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 a complete object type plus or minus an integer
+  constant expression (6.6).
+-- 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
+
+[page 556]
+
+   operators) other than conversions of arithmetic types to arithmetic types (6.6).
+-- The value of an object is accessed by an array-subscript [], member-access . or ->,
+  address &, or indirection * operator or a pointer cast in creating an address constant
+  (6.6).
+-- 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 (6.7).
+-- A function is declared at block scope with an explicit storage-class specifier other
+  than extern (6.7.1).
+-- A structure or union is defined as containing no named members, no anonymous
+  structures, and no anonymous unions (6.7.2.1).
+-- 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
+  (6.7.2.1).
+-- 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
+  (6.7.2.3).
+-- An attempt is made to modify an object defined with a const-qualified type through
+  use of an lvalue with non-const-qualified type (6.7.3).
+-- 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 (6.7.3).
+-- The specification of a function type includes any type qualifiers (6.7.3).                        *
+-- Two qualified types that are required to be compatible do not have the identically
+  qualified version of a compatible type (6.7.3).
+-- 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 (6.7.3.1).
+-- 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 (6.7.3.1).
+-- A function with external linkage is declared with an inline function specifier, but is
+  not also defined in the same translation unit (6.7.4).
+-- A function declared with a _Noreturn function specifier returns to its caller (6.7.4).
+-- The definition of an object has an alignment specifier and another declaration of that
+  object has a different alignment specifier (6.7.5).
+
+
+[page 557]
+
+-- Declarations of an object in different translation units have different alignment
+  specifiers (6.7.5).
+-- Two pointer types that are required to be compatible are not identically qualified, or
+  are not pointers to compatible types (6.7.6.1).
+-- The size expression in an array declaration is not a constant expression and evaluates
+  at program execution time to a nonpositive value (6.7.6.2).
+-- 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 (6.7.6.2).
+-- 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 (6.7.6.3).
+-- A storage-class specifier or type qualifier modifies the keyword void as a function
+  parameter type list (6.7.6.3).
+-- 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
+  identifier list) (6.7.6.3).
+-- The value of an unnamed member of a structure or union is used (6.7.9).
+-- The initializer for a scalar is neither a single expression nor a single expression
+  enclosed in braces (6.7.9).
+-- 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 (6.7.9).
+-- 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 (6.7.9).
+-- 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 (6.9).
+-- A function definition includes an identifier list, but the types of the parameters are not
+  declared in a following declaration list (6.9.1).
+-- An adjusted parameter type in a function definition is not a complete object type
+  (6.9.1).
+-- A function that accepts a variable number of arguments is defined without a
+  parameter type list that ends with the ellipsis notation (6.9.1).
+
+[page 558]
+
+-- The } that terminates a function is reached, and the value of the function call is used
+  by the caller (6.9.1).
+-- An identifier for an object with internal linkage and an incomplete type is declared
+  with a tentative definition (6.9.2).
+-- 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 (6.10.1).
+-- The #include preprocessing directive that results after expansion does not match
+  one of the two header name forms (6.10.2).
+-- The character sequence in an #include preprocessing directive does not start with a
+  letter (6.10.2).
+-- There are sequences of preprocessing tokens within the list of macro arguments that
+  would otherwise act as preprocessing directives (6.10.3).
+-- The result of the preprocessing operator # is not a valid character string literal
+  (6.10.3.2).
+-- The result of the preprocessing operator ## is not a valid preprocessing token
+  (6.10.3.3).
+-- 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 (6.10.4).
+-- A non-STDC #pragma preprocessing directive that is documented as causing
+  translation failure or some other form of undefined behavior is encountered (6.10.6).
+-- A #pragma STDC preprocessing directive does not match one of the well-defined
+  forms (6.10.6).
+-- The name of a predefined macro, or the identifier defined, is the subject of a
+  #define or #undef preprocessing directive (6.10.8).
+-- 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 (7.1.2).
+-- A header is included within an external declaration or definition (7.1.2).
+-- 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
+  (7.1.2).
+
+[page 559]
+
+-- A standard header is included while a macro is defined with the same name as a
+  keyword (7.1.2).
+-- The program attempts to declare a library function itself, rather than via a standard
+  header, but the declaration does not have external linkage (7.1.2).
+-- The program declares or defines a reserved identifier, other than as allowed by 7.1.4
+  (7.1.3).
+-- The program removes the definition of a macro whose name begins with an
+  underscore and either an uppercase letter or another underscore (7.1.3).
+-- An argument to a library function has an invalid value or a type not expected by a
+  function with variable number of arguments (7.1.4).
+-- The pointer passed to a library function array parameter does not have a value such
+  that all address computations and object accesses are valid (7.1.4).
+-- The macro definition of assert is suppressed in order to access an actual function
+  (7.2).
+-- The argument to the assert macro does not have a scalar type (7.2).
+-- 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
+  declarations and statements inside a compound statement (7.3.4, 7.6.1, 7.12.2).
+-- The value of an argument to a character handling function is neither equal to the value
+  of EOF nor representable as an unsigned char (7.4).
+-- A macro definition of errno is suppressed in order to access an actual object, or the
+  program defines an identifier with the name errno (7.5).
+-- 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'' (7.6.1).
+-- 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 (7.6.2).
+-- 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 (7.6.2.4).
+-- The argument to fesetenv or feupdateenv is neither an object set by a call to
+  fegetenv or feholdexcept, nor is it an environment macro (7.6.4.3, 7.6.4.4).
+-- The value of the result of an integer arithmetic or conversion function cannot be
+  represented (7.8.2.1, 7.8.2.2, 7.8.2.3, 7.8.2.4, 7.22.6.1, 7.22.6.2, 7.22.1).
+
+[page 560]
+
+-- The program modifies the string pointed to by the value returned by the setlocale
+  function (7.11.1.1).
+-- The program modifies the structure pointed to by the value returned by the
+  localeconv function (7.11.2.1).
+-- A macro definition of math_errhandling is suppressed or the program defines
+  an identifier with the name math_errhandling (7.12).
+-- An argument to a floating-point classification or comparison macro is not of real
+  floating type (7.12.3, 7.12.14).
+-- 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 (7.13).
+-- An invocation of the setjmp macro occurs other than in an allowed context
+  (7.13.2.1).
+-- The longjmp function is invoked to restore a nonexistent environment (7.13.2.1).
+-- After a longjmp, there is an attempt to access the value of an object of automatic
+  storage duration that does not have 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 (7.13.2.1).
+-- The program specifies an invalid pointer to a signal handler function (7.14.1.1).
+-- A signal handler returns when the signal corresponded to a computational exception
+  (7.14.1.1).
+-- A signal occurs as the result of calling the abort or raise function, and the signal
+  handler calls the raise function (7.14.1.1).
+-- 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 or thread storage duration that is not a
+  lock-free atomic object 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, the quick_exit function, or the
+  signal function (for the same signal number) (7.14.1.1).
+-- 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 (7.14.1.1).
+-- A signal is generated by an asynchronous signal handler (7.14.1.1).
+-- 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 (7.16, 7.16.1.1, 7.16.1.4).
+
+[page 561]
+
+-- 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 (7.16).
+-- 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 (7.16.1).
+-- 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 (7.16.1, 7.16.1.2, 7.16.1.3,
+  7.16.1.4).
+-- 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 * (7.16.1.1).
+-- 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 (7.16.1.1).
+-- 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 (7.16.1.2, 7.16.1.4).
+-- 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 (7.16.1.4).
+-- 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 (7.19).
+-- 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 (7.20.4).
+-- 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 (7.21.2).
+-- Use is made of any portion of a file beyond the most recent wide character written to
+  a wide-oriented stream (7.21.2).
+-- The value of a pointer to a FILE object is used after the associated file is closed
+  (7.21.3).
+-- The stream for the fflush function points to an input stream or to an update stream
+  in which the most recent operation was input (7.21.5.2).
+-- 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 (7.21.5.3).
+-- 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
+[page 562]
+
+   operation on an update stream is followed by an output operation with an intervening
+   call to a file positioning function (7.21.5.3).
+-- An attempt is made to use the contents of the array that was supplied in a call to the
+  setvbuf function (7.21.5.6).
+-- 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 (7.21.6.1,
+  7.21.6.2, 7.28.2.1, 7.28.2.2).
+-- 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 (7.21.6.1, 7.21.6.2, 7.26.3.5, 7.28.2.1, 7.28.2.2,
+  7.28.5.1).
+-- In a call to one of the formatted output functions, a precision appears with a
+  conversion specifier other than those described (7.21.6.1, 7.28.2.1).
+-- 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 (7.21.6.1, 7.28.2.1).
+-- A conversion specification for a formatted output function uses a # or 0 flag with a
+  conversion specifier other than those described (7.21.6.1, 7.28.2.1).
+-- A conversion specification for one of the formatted input/output functions uses a
+  length modifier with a conversion specifier other than those described (7.21.6.1,
+  7.21.6.2, 7.28.2.1, 7.28.2.2).
+-- 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) (7.21.6.1, 7.28.2.1).
+-- 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 (7.21.6.1,
+  7.21.6.2, 7.28.2.1, 7.28.2.2).
+-- A % conversion specifier is encountered by one of the formatted input/output
+  functions, but the complete conversion specification is not exactly %% (7.21.6.1,
+  7.21.6.2, 7.28.2.1, 7.28.2.2).
+-- An invalid conversion specification is found in the format for one of the formatted
+  input/output functions, or the strftime or wcsftime function (7.21.6.1, 7.21.6.2,
+  7.26.3.5, 7.28.2.1, 7.28.2.2, 7.28.5.1).
+-- The number of characters transmitted by a formatted output function is greater than
+  INT_MAX (7.21.6.1, 7.21.6.3, 7.21.6.8, 7.21.6.10).
+
+
+[page 563]
+
+-- 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 (7.21.6.2, 7.28.2.2).
+-- 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
+  [) (7.21.6.2, 7.28.2.2).
+-- 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 (7.21.6.2, 7.28.2.2).
+-- 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 (7.21.6.2, 7.28.2.2).
+-- 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 (7.21.6.8, 7.21.6.9, 7.21.6.10, 7.21.6.11, 7.21.6.12, 7.21.6.13, 7.21.6.14,
+  7.28.2.5, 7.28.2.6, 7.28.2.7, 7.28.2.8, 7.28.2.9, 7.28.2.10).
+-- The contents of the array supplied in a call to the fgets or fgetws function are
+  used after a read error occurred (7.21.7.2, 7.28.3.2).
+-- 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 (7.21.7.10).
+-- The file position indicator for a stream is used after an error occurred during a call to
+  the fread or fwrite function (7.21.8.1, 7.21.8.2).
+-- A partial element read by a call to the fread function is used (7.21.8.1).
+-- 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 (7.21.9.2).
+-- 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
+  (7.21.9.3).
+-- 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 (7.22.3).
+-- The value of a pointer that refers to space deallocated by a call to the free or
+  realloc function is used (7.22.3).
+
+
+[page 564]
+
+-- The alignment requested of the aligned_alloc function is not valid or not
+  supported by the implementation, or the size requested is not an integral multiple of
+  the alignment (7.22.3.1).
+-- The pointer argument to the free or realloc function does not match a pointer
+  earlier returned by a memory management function, or the space has been deallocated
+  by a call to free or realloc (7.22.3.3, 7.22.3.5).
+-- The value of the object allocated by the malloc function is used (7.22.3.4).
+-- The value of any bytes in a new object allocated by the realloc function beyond
+  the size of the old object are used (7.22.3.5).
+-- The program calls the exit or quick_exit function more than once, or calls both
+  functions (7.22.4.4, 7.22.4.7).
+-- During the call to a function registered with the atexit or at_quick_exit
+  function, a call is made to the longjmp function that would terminate the call to the
+  registered function (7.22.4.4, 7.22.4.7).
+-- The string set up by the getenv or strerror function is modified by the program
+  (7.22.4.6, 7.23.6.2).
+-- A command is executed through the system function in a way that is documented as
+  causing termination or some other form of undefined behavior (7.22.4.8).
+-- A searching or sorting utility function is called with an invalid pointer argument, even
+  if the number of elements is zero (7.22.5).
+-- 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 (7.22.5).
+-- The array being searched by the bsearch function does not have its elements in
+  proper order (7.22.5.1).
+-- The current conversion state is used by a multibyte/wide character conversion
+  function after changing the LC_CTYPE category (7.22.7).
+-- A string or wide string utility function is instructed to access an array beyond the end
+  of an object (7.23.1, 7.28.4).
+-- A string or wide string utility function is called with an invalid pointer argument, even
+  if the length is zero (7.23.1, 7.28.4).
+-- 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 (7.23.4.5, 7.26.3.5, 7.28.4.4.4,
+  7.28.5.1).
+
+[page 565]
+
+    -- The first argument in the very first call to the strtok or wcstok is a null pointer
+      (7.23.5.8, 7.28.4.5.7).
+    -- The type of an argument to a type-generic macro is not compatible with the type of
+      the corresponding parameter of the selected function (7.24).
+    -- A complex argument is supplied for a generic parameter of a type-generic macro that
+      has no corresponding complex function (7.24).
+    -- At least one field of the broken-down time passed to asctime contains a value
+      outside its normal range, or the calculated year exceeds four digits or is less than the
+      year 1000 (7.26.3.1).
+    -- 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 (7.28.2.11).
+    -- 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 (7.28.4.5.7).
+    -- An mbstate_t object is used inappropriately (7.28.6).
+    -- 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 (7.29.1).
+    -- 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
+      (7.29.2.2.1).
+    -- 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
+      (7.29.3.2.1).
+    J.3 Implementation-defined behavior
+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:
+
+
+
+
+[page 566]
+
+    J.3.1 Translation
+1   -- How a diagnostic is identified (3.10, 5.1.1.3).
+    -- Whether each nonempty sequence of white-space characters other than new-line is
+      retained or replaced by one space character in translation phase 3 (5.1.1.2).
+    J.3.2 Environment
+1   -- The mapping between physical source file multibyte characters and the source
+      character set in translation phase 1 (5.1.1.2).
+    -- The name and type of the function called at program startup in a freestanding
+      environment (5.1.2.1).
+    -- The effect of program termination in a freestanding environment (5.1.2.1).
+    -- An alternative manner in which the main function may be defined (5.1.2.2.1).
+    -- The values given to the strings pointed to by the argv argument to main (5.1.2.2.1).
+    -- What constitutes an interactive device (5.1.2.3).
+    -- Whether a program can have more than one thread of execution in a freestanding
+      environment (5.1.2.4).
+    -- The set of signals, their semantics, and their default handling (7.14).
+    -- Signal values other than SIGFPE, SIGILL, and SIGSEGV that correspond to a
+      computational exception (7.14.1.1).
+    -- Signals for which the equivalent of signal(sig, SIG_IGN); is executed at
+      program startup (7.14.1.1).
+    -- The set of environment names and the method for altering the environment list used
+      by the getenv function (7.22.4.6).
+    -- The manner of execution of the string by the system function (7.22.4.8).
+    J.3.3 Identifiers
+1   -- Which additional multibyte characters may appear in identifiers and their
+      correspondence to universal character names (6.4.2).
+    -- The number of significant initial characters in an identifier (5.2.4.1, 6.4.2).
+
+
+
+
+[page 567]
+
+    J.3.4 Characters
+1   -- The number of bits in a byte (3.6).
+    -- The values of the members of the execution character set (5.2.1).
+    -- The unique value of the member of the execution character set produced for each of
+      the standard alphabetic escape sequences (5.2.2).
+    -- The value of a char object into which has been stored any character other than a
+      member of the basic execution character set (6.2.5).
+    -- Which of signed char or unsigned char has the same range, representation,
+      and behavior as ''plain'' char (6.2.5, 6.3.1.1).
+    -- The mapping of members of the source character set (in character constants and string
+      literals) to members of the execution character set (6.4.4.4, 5.1.1.2).
+    -- 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 (6.4.4.4).
+    -- The value of a wide character constant containing more than one multibyte character
+      or a single multibyte character that maps to multiple members of the extended
+      execution character set, or containing a multibyte character or escape sequence not
+      represented in the extended execution character set (6.4.4.4).
+    -- 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 (6.4.4.4).
+    -- Whether differently-prefixed wide string literal tokens can be concatenated and, if so,
+      the treatment of the resulting multibyte character sequence (6.4.5).
+    -- The current locale used to convert a wide string literal into corresponding wide
+      character codes (6.4.5).
+    -- The value of a string literal containing a multibyte character or escape sequence not
+      represented in the execution character set (6.4.5).
+    -- The encoding of any of wchar_t, char16_t, and char32_t where the
+      corresponding  standard   encoding macro      (__STDC_ISO_10646__,
+      __STDC_UTF_16__, or __STDC_UTF_32__) is not defined (6.10.8.2).
+
+
+
+
+[page 568]
+
+    J.3.5 Integers
+1   -- Any extended integer types that exist in the implementation (6.2.5).
+    -- 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 (6.2.6.2).
+    -- The rank of any extended integer type relative to another extended integer type with
+      the same precision (6.3.1.1).
+    -- 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 (6.3.1.3).
+    -- The results of some bitwise operations on signed integers (6.5).
+    J.3.6 Floating point
+1   -- The accuracy of the floating-point operations and of the library functions in
+      <math.h> and <complex.h> that return floating-point results (5.2.4.2.2).
+    -- The accuracy of the conversions between floating-point internal representations and
+      string representations performed by the library functions in <stdio.h>,
+      <stdlib.h>, and <wchar.h> (5.2.4.2.2).
+    -- The rounding behaviors characterized by non-standard values of FLT_ROUNDS
+      (5.2.4.2.2).
+    -- The evaluation methods characterized by non-standard negative values of
+      FLT_EVAL_METHOD (5.2.4.2.2).
+    -- The direction of rounding when an integer is converted to a floating-point number that
+      cannot exactly represent the original value (6.3.1.4).
+    -- The direction of rounding when a floating-point number is converted to a narrower
+      floating-point number (6.3.1.5).
+    -- 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 (6.4.4.2).
+    -- Whether and how floating expressions are contracted when not disallowed by the
+      FP_CONTRACT pragma (6.5).
+    -- The default state for the FENV_ACCESS pragma (7.6.1).
+    -- Additional floating-point exceptions, rounding           modes,     environments,   and
+      classifications, and their macro names (7.6, 7.12).
+    -- The default state for the FP_CONTRACT pragma (7.12.2).
+
+
+[page 569]
+
+    J.3.7 Arrays and pointers
+1   -- The result of converting a pointer to an integer or vice versa (6.3.2.3).
+    -- The size of the result of subtracting two pointers to elements of the same array
+      (6.5.6).
+    J.3.8 Hints
+1   -- The extent to which suggestions made by using the register storage-class
+      specifier are effective (6.7.1).
+    -- The extent to which suggestions made by using the inline function specifier are
+      effective (6.7.4).
+    J.3.9 Structures, unions, enumerations, and bit-fields
+1   -- Whether a ''plain'' int bit-field is treated as a signed int bit-field or as an
+      unsigned int bit-field (6.7.2, 6.7.2.1).
+    -- Allowable bit-field types other than _Bool, signed int, and unsigned int
+      (6.7.2.1).
+    -- Whether atomic types are permitted for bit-fields (6.7.2.1).
+    -- Whether a bit-field can straddle a storage-unit boundary (6.7.2.1).
+    -- The order of allocation of bit-fields within a unit (6.7.2.1).
+    -- The alignment of non-bit-field members of structures (6.7.2.1). This should present
+      no problem unless binary data written by one implementation is read by another.
+    -- The integer type compatible with each enumerated type (6.7.2.2).
+    J.3.10 Qualifiers
+1   -- What constitutes an access to an object that has volatile-qualified type (6.7.3).
+    J.3.11 Preprocessing directives
+1   -- The locations within #pragma directives where header name preprocessing tokens
+      are recognized (6.4, 6.4.7).
+    -- How sequences in both forms of header names are mapped to headers or external
+      source file names (6.4.7).
+    -- 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 (6.10.1).
+    -- Whether the value of a single-character character constant in a constant expression
+      that controls conditional inclusion may have a negative value (6.10.1).
+
+
+[page 570]
+
+    -- The places that are searched for an included < > delimited header, and how the places
+      are specified or the header is identified (6.10.2).
+    -- How the named source file is searched for in an included " " delimited header
+      (6.10.2).
+    -- The method by which preprocessing tokens (possibly resulting from macro
+      expansion) in a #include directive are combined into a header name (6.10.2).
+    -- The nesting limit for #include processing (6.10.2).
+    -- Whether the # operator inserts a \ character before the \ character that begins a
+      universal character name in a character constant or string literal (6.10.3.2).
+    -- The behavior on each recognized non-STDC #pragma directive (6.10.6).
+    -- The definitions for __DATE__ and __TIME__ when respectively, the date and
+      time of translation are not available (6.10.8.1).
+    J.3.12 Library functions
+1   -- Any library facilities available to a freestanding program, other than the minimal set
+      required by clause 4 (5.1.2.1).
+    -- The format of the diagnostic printed by the assert macro (7.2.1.1).
+    -- The representation of the floating-point               status   flags   stored   by   the
+      fegetexceptflag function (7.6.2.2).
+    -- Whether the feraiseexcept function raises the ''inexact'' floating-point
+      exception in addition to the ''overflow'' or ''underflow'' floating-point exception
+      (7.6.2.3).
+    -- Strings other than "C" and "" that may be passed as the second argument to the
+      setlocale function (7.11.1.1).
+    -- The types defined for float_t and double_t when the value of the
+      FLT_EVAL_METHOD macro is less than 0 (7.12).
+    -- Domain errors for the mathematics functions, other than those required by this
+      International Standard (7.12.1).
+    -- The values returned by the mathematics functions on domain errors or pole errors
+      (7.12.1).
+    -- 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 & MATH_ERRNO is nonzero, and whether the ''underflow''
+      floating-point exception is raised when the integer expression math_errhandling
+      & MATH_ERREXCEPT is nonzero. (7.12.1).
+
+[page 571]
+
+-- Whether a domain error occurs or zero is returned when an fmod function has a
+  second argument of zero (7.12.10.1).
+-- Whether a domain error occurs or zero is returned when a remainder function has
+  a second argument of zero (7.12.10.2).
+-- The base-2 logarithm of the modulus used by the remquo functions in reducing the
+  quotient (7.12.10.3).
+-- Whether a domain error occurs or zero is returned when a remquo function has a
+  second argument of zero (7.12.10.3).
+-- 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 (7.14.1.1).
+-- The null pointer constant to which the macro NULL expands (7.19).
+-- Whether the last line of a text stream requires a terminating new-line character
+  (7.21.2).
+-- Whether space characters that are written out to a text stream immediately before a
+  new-line character appear when read in (7.21.2).
+-- The number of null characters that may be appended to data written to a binary
+  stream (7.21.2).
+-- Whether the file position indicator of an append-mode stream is initially positioned at
+  the beginning or end of the file (7.21.3).
+-- Whether a write on a text stream causes the associated file to be truncated beyond that
+  point (7.21.3).
+-- The characteristics of file buffering (7.21.3).
+-- Whether a zero-length file actually exists (7.21.3).
+-- The rules for composing valid file names (7.21.3).
+-- Whether the same file can be simultaneously open multiple times (7.21.3).
+-- The nature and choice of encodings used for multibyte characters in files (7.21.3).
+-- The effect of the remove function on an open file (7.21.4.1).
+-- The effect if a file with the new name exists prior to a call to the rename function
+  (7.21.4.2).
+-- Whether an open temporary file is removed upon abnormal program termination
+  (7.21.4.3).
+-- Which changes of mode are permitted (if any), and under what circumstances
+  (7.21.5.4).
+
+[page 572]
+
+-- The style used to print an infinity or NaN, and the meaning of any n-char or n-wchar
+  sequence printed for a NaN (7.21.6.1, 7.28.2.1).
+-- The output for %p conversion in the fprintf or fwprintf function (7.21.6.1,
+  7.28.2.1).
+-- 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 (7.21.6.2, 7.28.2.1).
+-- The set of sequences matched by a %p conversion and the interpretation of the
+  corresponding input item in the fscanf or fwscanf function (7.21.6.2, 7.28.2.2).
+-- The value to which the macro errno is set by the fgetpos, fsetpos, or ftell
+  functions on failure (7.21.9.1, 7.21.9.3, 7.21.9.4).
+-- 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 (7.22.1.3, 7.28.4.1.1).
+-- Whether or not the strtod, strtof, strtold, wcstod, wcstof, or wcstold
+  function sets errno to ERANGE when underflow occurs (7.22.1.3, 7.28.4.1.1).
+-- Whether the calloc, malloc, and realloc functions return a null pointer or a
+  pointer to an allocated object when the size requested is zero (7.22.3).
+-- 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
+  (7.22.4.1, 7.22.4.5).
+-- The termination status returned to the host environment by the abort, exit,
+  _Exit, or quick_exit function (7.22.4.1, 7.22.4.4, 7.22.4.5, 7.22.4.7).
+-- The value returned by the system function when its argument is not a null pointer
+  (7.22.4.8).
+-- The local time zone and Daylight Saving Time (7.26.1).
+-- The range and precision of times representable in clock_t and time_t (7.26).
+-- The era for the clock function (7.26.2.1).
+-- The replacement string for the %Z specifier to the strftime, and wcsftime
+  functions in the "C" locale (7.26.3.5, 7.28.5.1).
+-- Whether the functions in <math.h> honor the rounding direction mode in an
+  IEC 60559 conformant implementation, unless explicitly specified otherwise (F.10).
+
+
+
+
+[page 573]
+
+    J.3.13 Architecture
+1   -- The values or expressions assigned to the macros specified in the headers
+      <float.h>, <limits.h>, and <stdint.h> (5.2.4.2, 7.20.2, 7.20.3).
+    -- The result of attempting to indirectly access an object with automatic or thread
+      storage duration from a thread other than the one with which it is associated (6.2.4).
+    -- The number, order, and encoding of bytes in any object (when not explicitly specified
+      in this International Standard) (6.2.6.1).
+    -- Whether any extended alignments are supported and the contexts in which they are
+      supported (6.2.8).
+    -- Valid alignment values other than those returned by an alignof expression for
+      fundamental types, if any (6.2.8).
+    -- The value of the result of the sizeof and alignof operators (6.5.3.4).
+    J.4 Locale-specific behavior
+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 (5.2.1).
+    -- The presence, meaning, and representation of additional multibyte characters in the
+      execution character set beyond the basic character set (5.2.1.2).
+    -- The shift states used for the encoding of multibyte characters (5.2.1.2).
+    -- The direction of writing of successive printing characters (5.2.2).
+    -- The decimal-point character (7.1.1).
+    -- The set of printing characters (7.4, 7.29.2).
+    -- The set of control characters (7.4, 7.29.2).
+    -- The sets of characters tested for by the isalpha, isblank, islower, ispunct,
+      isspace, isupper, iswalpha, iswblank, iswlower, iswpunct,
+      iswspace, or iswupper functions (7.4.1.2, 7.4.1.3, 7.4.1.7, 7.4.1.9, 7.4.1.10,
+      7.4.1.11, 7.29.2.1.2, 7.29.2.1.3, 7.29.2.1.7, 7.29.2.1.9, 7.29.2.1.10, 7.29.2.1.11).
+    -- The native environment (7.11.1.1).
+    -- Additional subject sequences accepted by the numeric conversion functions (7.22.1,
+      7.28.4.1).
+    -- The collation sequence of the execution character set (7.23.4.3, 7.28.4.4.2).
+
+
+[page 574]
+
+    -- The contents of the error message strings set up by the strerror function
+      (7.23.6.2).
+    -- The formats for time and date (7.26.3.5, 7.28.5.1).
+    -- Character mappings that are supported by the towctrans function (7.29.1).
+    -- Character classifications that are supported by the iswctype function (7.29.1).
+    J.5 Common extensions
+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.
+    J.5.1 Environment arguments
+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
+    (5.1.2.2.1).
+    J.5.2 Specialized identifiers
+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 (6.4.2).
+    J.5.3 Lengths and cases of identifiers
+1   All characters in identifiers (with or without external linkage) are significant (6.4.2).
+    J.5.4 Scopes of identifiers
+1   A function identifier, or the identifier of an object the declaration of which contains the
+    keyword extern, has file scope (6.2.1).
+    J.5.5 Writable string literals
+1   String literals are modifiable (in which case, identical string literals should denote distinct
+    objects) (6.4.5).
+
+
+
+
+[page 575]
+
+    J.5.6 Other arithmetic types
+1   Additional arithmetic types, such as __int128 or double double, and their
+    appropriate conversions are defined (6.2.5, 6.3.1). 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.
+    J.5.7 Function pointer casts
+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 (6.5.4).
+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) (6.5.4).
+    J.5.8 Extended bit-field types
+1   A bit-field may be declared with a type other than _Bool, unsigned int, or
+    signed int, with an appropriate maximum width (6.7.2.1).
+    J.5.9 The fortran keyword
+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 (6.7.4).
+    J.5.10 The asm keyword
+1   The asm keyword may be used to insert assembly language directly into the translator
+    output (6.8). The most common implementation is via a statement of the form:
+           asm ( character-string-literal );
+    J.5.11 Multiple external definitions
+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 (6.9.2).
+    J.5.12 Predefined macro names
+1   Macro names that do not begin with an underscore, describing the translation and
+    execution environments, are defined by the implementation before translation begins
+    (6.10.8).
+
+
+
+
+[page 576]
+
+    J.5.13 Floating-point status flags
+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 7.22.4.4), the implementation
+    writes some diagnostics indicating the fact to the stderr stream, if it is still open,
+    J.5.14 Extra arguments for signal handlers
+1   Handlers for specific signals are called with extra arguments in addition to the signal
+    number (7.14.1.1).
+    J.5.15 Additional stream types and file-opening modes
+1   Additional mappings from files to streams are supported (7.21.2).
+2   Additional file-opening modes may be specified by characters appended to the mode
+    argument of the fopen function (7.21.5.3).
+    J.5.16 Defined file position indicator
+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 (7.21.7.10,
+    7.28.3.10).
+    J.5.17 Math error reporting
+1   Functions declared in <complex.h> and <math.h> raise SIGFPE to report errors
+    instead of, or in addition to, setting errno or raising floating-point exceptions (7.3,
+    7.12).
+
+
+
+
+[page 577]
+
+                                           Annex K
+                                          (normative)
+                              Bounds-checking interfaces
+    K.1 Background
+1   Traditionally, the C Library has contained many functions that trust the programmer to
+    provide output character arrays big enough to hold the result being produced. Not only
+    do these functions not check that the arrays are big enough, they frequently lack the
+    information needed to perform such checks. While it is possible to write safe, robust, and
+    error-free code using the existing library, the library tends to promote programming styles
+    that lead to mysterious failures if a result is too big for the provided array.
+2   A common programming style is to declare character arrays large enough to handle most
+    practical cases. However, if these arrays are not large enough to handle the resulting
+    strings, data can be written past the end of the array overwriting other data and program
+    structures. The program never gets any indication that a problem exists, and so never has
+    a chance to recover or to fail gracefully.
+3   Worse, this style of programming has compromised the security of computers and
+    networks. Buffer overflows can often be exploited to run arbitrary code with the
+    permissions of the vulnerable (defective) program.
+4   If the programmer writes runtime checks to verify lengths before calling library
+    functions, then those runtime checks frequently duplicate work done inside the library
+    functions, which discover string lengths as a side effect of doing their job.
+5   This annex provides alternative library functions that promote safer, more secure
+    programming. The alternative functions verify that output buffers are large enough for
+    the intended result and return a failure indicator if they are not. Data is never written past
+    the end of an array. All string results are null terminated.
+6   This annex also addresses another problem that complicates writing robust code:
+    functions that are not reentrant because they return pointers to static objects owned by the
+    function. Such functions can be troublesome since a previously returned result can
+    change if the function is called again, perhaps by another thread.
+
+
+
+
+[page 578]
+
+    K.2 Scope
+1   This annex specifies a series of optional extensions that can be useful in the mitigation of
+    security vulnerabilities in programs, and comprise new functions, macros, and types
+    declared or defined in existing standard headers.
+2   An implementation that defines __STDC_LIB_EXT1__ shall conform to the
+    specifications in this annex.367)
+3   Subclause K.3 should be read as if it were merged into the parallel structure of named
+    subclauses of clause 7.
+    K.3 Library
+    K.3.1 Introduction
+    K.3.1.1 Standard headers
+1   The functions, macros, and types declared or defined in K.3 and its subclauses are not
+    declared or defined by their respective headers if __STDC_WANT_LIB_EXT1__ is
+    defined as a macro which expands to the integer constant 0 at the point in the source file
+    where the appropriate header is first included.
+2   The functions, macros, and types declared or defined in K.3 and its subclauses are
+    declared and defined by their respective headers if __STDC_WANT_LIB_EXT1__ is
+    defined as a macro which expands to the integer constant 1 at the point in the source file
+    where the appropriate header is first included.368)
+3   It is implementation-defined whether the functions, macros, and types declared or defined
+    in K.3 and its subclauses are declared or defined by their respective headers if
+    __STDC_WANT_LIB_EXT1__ is not defined as a macro at the point in the source file
+    where the appropriate header is first included.369)
+4   Within a preprocessing translation unit, __STDC_WANT_LIB_EXT1__ shall be
+    defined identically for all inclusions of any headers from subclause K.3. If
+    __STDC_WANT_LIB_EXT1__ is defined differently for any such inclusion, the
+    implementation shall issue a diagnostic as if a preprocessor error directive were used.
+
+
+    367) Implementations that do not define __STDC_LIB_EXT1__ are not required to conform to these
+         specifications.
+    368) Future revisions of this International Standard may define meanings for other values of
+         __STDC_WANT_LIB_EXT1__.
+    369) Subclause 7.1.3 reserves certain names and patterns of names that an implementation may use in
+         headers. All other names are not reserved, and a conforming implementation is not permitted to use
+         them. While some of the names defined in K.3 and its subclauses are reserved, others are not. If an
+         unreserved name is defined in a header when __STDC_WANT_LIB_EXT1__ is defined as 0, the
+         implementation is not conforming.
+
+[page 579]
+
+    K.3.1.2 Reserved identifiers
+1   Each macro name in any of the following subclauses is reserved for use as specified if it
+    is defined by any of its associated headers when included; unless explicitly stated
+    otherwise (see 7.1.4).
+2   All identifiers with external linkage in any of the following subclauses are reserved for
+    use as identifiers with external linkage if any of them are used by the program. None of
+    them are reserved if none of them are used.
+3   Each identifier with file scope listed in any of the following subclauses is reserved for use
+    as a macro name and as an identifier with file scope in the same name space if it is
+    defined by any of its associated headers when included.
+    K.3.1.3 Use of errno
+1   An implementation may set errno for the functions defined in this annex, but is not
+    required to.
+    K.3.1.4 Runtime-constraint violations
+1   Most functions in this annex include as part of their specification a list of runtime-
+    constraints. These runtime-constraints are requirements on the program using the
+    library.370)
+2   Implementations shall verify that the runtime-constraints for a function are not violated
+    by the program. If a runtime-constraint is violated, the implementation shall call the
+    currently registered runtime-constraint handler (see set_constraint_handler_s
+    in <stdlib.h>). Multiple runtime-constraint violations in the same call to a library
+    function result in only one call to the runtime-constraint handler. It is unspecified which
+    one of the multiple runtime-constraint violations cause the handler to be called.
+3   If the runtime-constraints section for a function states an action to be performed when a
+    runtime-constraint violation occurs, the function shall perform the action before calling
+    the runtime-constraint handler. If the runtime-constraints section lists actions that are
+    prohibited when a runtime-constraint violation occurs, then such actions are prohibited to
+    the function both before calling the handler and after the handler returns.
+4   The runtime-constraint handler might not return. If the handler does return, the library
+    function whose runtime-constraint was violated shall return some indication of failure as
+    given by the returns section in the function's specification.
+
+
+
+    370) Although runtime-constraints replace many cases of undefined behavior, undefined behavior still
+         exists in this annex. Implementations are free to detect any case of undefined behavior and treat it as a
+         runtime-constraint violation by calling the runtime-constraint handler. This license comes directly
+         from the definition of undefined behavior.
+
+[page 580]
+
+    K.3.2 Errors <errno.h>
+1   The header <errno.h> defines a type.
+2   The type is
+             errno_t
+    which is type int.371)
+    K.3.3 Common definitions <stddef.h>
+1   The header <stddef.h> defines a type.
+2   The type is
+             rsize_t
+    which is the type size_t.372)
+    K.3.4 Integer types <stdint.h>
+1   The header <stdint.h> defines a macro.
+2   The macro is
+             RSIZE_MAX
+    which expands to a value373) of type size_t. Functions that have parameters of type
+    rsize_t consider it a runtime-constraint violation if the values of those parameters are
+    greater than RSIZE_MAX.
+    Recommended practice
+3   Extremely large object sizes are frequently a sign that an object's size was calculated
+    incorrectly. For example, negative numbers appear as very large positive numbers when
+    converted to an unsigned type like size_t. Also, some implementations do not support
+    objects as large as the maximum value that can be represented by type size_t.
+4   For those reasons, it is sometimes beneficial to restrict the range of object sizes to detect
+    programming errors. For implementations targeting machines with large address spaces,
+    it is recommended that RSIZE_MAX be defined as the smaller of the size of the largest
+    object supported or (SIZE_MAX >> 1), even if this limit is smaller than the size of
+    some legitimate, but very large, objects. Implementations targeting machines with small
+    address spaces may wish to define RSIZE_MAX as SIZE_MAX, which means that there
+
+    371) As a matter of programming style, errno_t may be used as the type of something that deals only
+         with the values that might be found in errno. For example, a function which returns the value of
+         errno might be declared as having the return type errno_t.
+    372) See the description of the RSIZE_MAX macro in <stdint.h>.
+    373) The macro RSIZE_MAX need not expand to a constant expression.
+
+[page 581]
+
+    is no object size that is considered a runtime-constraint violation.
+    K.3.5 Input/output <stdio.h>
+1   The header <stdio.h> defines several macros and two types.
+2   The macros are
+           L_tmpnam_s
+    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_s
+    function;
+           TMP_MAX_S
+    which expands to an integer constant expression that is the maximum number of unique
+    file names that can be generated by the tmpnam_s function.
+3   The types are
+           errno_t
+    which is type int; and
+           rsize_t
+    which is the type size_t.
+    K.3.5.1 Operations on files
+    K.3.5.1.1 The tmpfile_s function
+    Synopsis
+1          #define __STDC_WANT_LIB_EXT1__ 1
+           #include <stdio.h>
+           errno_t tmpfile_s(FILE * restrict * restrict streamptr);
+    Runtime-constraints
+2   streamptr shall not be a null pointer.
+3   If there is a runtime-constraint violation, tmpfile_s does not attempt to create a file.
+    Description
+4   The tmpfile_s 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
+    with the meaning that mode has in the fopen_s function (including the mode's effect
+    on exclusive access and file permissions).
+
+
+[page 582]
+
+5   If the file was created successfully, then the pointer to FILE pointed to by streamptr
+    will be set to the pointer to the object controlling the opened file. Otherwise, the pointer
+    to FILE pointed to by streamptr will be set to a null pointer.
+    Recommended practice
+    It should be possible to open at least TMP_MAX_S temporary files during the lifetime of
+    the program (this limit may be shared with tmpnam_s) 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
+6   The tmpfile_s function returns zero if it created the file. If it did not create the file or
+    there was a runtime-constraint violation, tmpfile_s returns a nonzero value.
+    K.3.5.1.2 The tmpnam_s function
+    Synopsis
+1           #define __STDC_WANT_LIB_EXT1__ 1
+            #include <stdio.h>
+            errno_t tmpnam_s(char *s, rsize_t maxsize);
+    Runtime-constraints
+2   s shall not be a null pointer. maxsize shall be less than or equal to RSIZE_MAX.
+    maxsize shall be greater than the length of the generated file name string.
+    Description
+3   The tmpnam_s function generates a string that is a valid file name and that is not the
+    same as the name of an existing file.374) The function is potentially capable of generating
+    TMP_MAX_S different strings, but any or all of them may already be in use by existing
+    files and thus not be suitable return values. The lengths of these strings shall be less than
+    the value of the L_tmpnam_s macro.
+4   The tmpnam_s function generates a different string each time it is called.
+5   It is assumed that s points to an array of at least maxsize characters. This array will be
+    set to generated string, as specified below.
+
+
+
+    374) Files created using strings generated by the tmpnam_s 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. Implementations should take care in choosing the patterns
+         used for names returned by tmpnam_s. For example, making a thread id part of the names avoids the
+         race condition and possible conflict when multiple programs run simultaneously by the same user
+         generate the same temporary file names.
+
+[page 583]
+
+6    The implementation shall behave as if no library function except tmpnam calls the
+     tmpnam_s function.375)
+     Recommended practice
+7    After a program obtains a file name using the tmpnam_s function and before the
+     program creates a file with that name, the possibility exists that someone else may create
+     a file with that same name. To avoid this race condition, the tmpfile_s function
+     should be used instead of tmpnam_s when possible. One situation that requires the use
+     of the tmpnam_s function is when the program needs to create a temporary directory
+     rather than a temporary file.
+     Returns
+8    If no suitable string can be generated, or if there is a runtime-constraint violation, the
+     tmpnam_s function writes a null character to s[0] (only if s is not null and maxsize
+     is greater than zero) and returns a nonzero value.
+9    Otherwise, the tmpnam_s function writes the string in the array pointed to by s and
+     returns zero.
+     Environmental limits
+10   The value of the macro TMP_MAX_S shall be at least 25.
+     K.3.5.2 File access functions
+     K.3.5.2.1 The fopen_s function
+     Synopsis
+1           #define __STDC_WANT_LIB_EXT1__ 1
+            #include <stdio.h>
+            errno_t fopen_s(FILE * restrict * restrict streamptr,
+                 const char * restrict filename,
+                 const char * restrict mode);
+     Runtime-constraints
+2    None of streamptr, filename, or mode shall be a null pointer.
+3    If there is a runtime-constraint violation, fopen_s does not attempt to open a file.
+     Furthermore, if streamptr is not a null pointer, fopen_s sets *streamptr to the
+     null pointer.
+
+
+
+
+     375) An implementation may have tmpnam call tmpnam_s (perhaps so there is only one naming
+          convention for temporary files), but this is not required.
+
+[page 584]
+
+    Description
+4   The fopen_s function opens the file whose name is the string pointed to by
+    filename, and associates a stream with it.
+5   The mode string shall be as described for fopen, with the addition that modes starting
+    with the character 'w' or 'a' may be preceded by the character 'u', see below:
+    uw             truncate to zero length or create text file for writing, default
+                   permissions
+    uwx            create text file for writing, default permissions
+    ua             append; open or create text file for writing at end-of-file, default
+                   permissions
+    uwb            truncate to zero length or create binary file for writing, default
+                   permissions
+    uwbx           create binary file for writing, default permissions
+    uab            append; open or create binary file for writing at end-of-file, default
+                   permissions
+    uw+            truncate to zero length or create text file for update, default
+                   permissions
+    uw+x           create text file for update, default permissions
+    ua+            append; open or create text file for update, writing at end-of-file,
+                   default permissions
+    uw+b or uwb+   truncate to zero length or create binary file for update, default
+                   permissions
+    uw+bx or uwb+x create binary file for update, default permissions
+    ua+b or uab+   append; open or create binary file for update, writing at end-of-file,
+                   default permissions
+6   Opening a file with exclusive mode ('x' as the last character in the mode argument)
+    fails if the file already exists or cannot be created.
+7   To the extent that the underlying system supports the concepts, files opened for writing
+    shall be opened with exclusive (also known as non-shared) access. If the file is being
+    created, and the first character of the mode string is not 'u', to the extent that the
+    underlying system supports it, the file shall have a file permission that prevents other
+    users on the system from accessing the file. If the file is being created and first character
+    of the mode string is 'u', then by the time the file has been closed, it shall have the
+    system default file access permissions.376)
+8   If the file was opened successfully, then the pointer to FILE pointed to by streamptr
+    will be set to the pointer to the object controlling the opened file. Otherwise, the pointer
+
+
+    376) These are the same permissions that the file would have been created with by fopen.
+
+[page 585]
+
+    to FILE pointed to by streamptr will be set to a null pointer.
+    Returns
+9   The fopen_s function returns zero if it opened the file. If it did not open the file or if
+    there was a runtime-constraint violation, fopen_s returns a nonzero value.
+    K.3.5.2.2 The freopen_s function
+    Synopsis
+1          #define __STDC_WANT_LIB_EXT1__ 1
+           #include <stdio.h>
+           errno_t freopen_s(FILE * restrict * restrict newstreamptr,
+                const char * restrict filename,
+                const char * restrict mode,
+                FILE * restrict stream);
+    Runtime-constraints
+2   None of newstreamptr, mode, and stream shall be a null pointer.
+3   If there is a runtime-constraint violation, freopen_s neither attempts to close any file
+    associated with stream nor attempts to open a file. Furthermore, if newstreamptr is
+    not a null pointer, fopen_s sets *newstreamptr to the null pointer.
+    Description
+4   The freopen_s 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 has the same meaning as in the fopen_s function (including the mode's effect
+    on exclusive access and file permissions).
+5   If filename is a null pointer, the freopen_s 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.
+6   The freopen_s function first attempts to close any file that is associated with stream.
+    Failure to close the file is ignored. The error and end-of-file indicators for the stream are
+    cleared.
+7   If the file was opened successfully, then the pointer to FILE pointed to by
+    newstreamptr will be set to the value of stream. Otherwise, the pointer to FILE
+    pointed to by newstreamptr will be set to a null pointer.
+    Returns
+8   The freopen_s function returns zero if it opened the file. If it did not open the file or
+    there was a runtime-constraint violation, freopen_s returns a nonzero value.
+
+[page 586]
+
+    K.3.5.3 Formatted input/output functions
+1   Unless explicitly stated otherwise, if the execution of a function described in this
+    subclause causes copying to take place between objects that overlap, the objects take on
+    unspecified values.
+    K.3.5.3.1 The fprintf_s function
+    Synopsis
+1            #define __STDC_WANT_LIB_EXT1__ 1
+             #include <stdio.h>
+             int fprintf_s(FILE * restrict stream,
+                  const char * restrict format, ...);
+    Runtime-constraints
+2   Neither stream nor format shall be a null pointer. The %n specifier377) (modified or
+    not by flags, field width, or precision) shall not appear in the string pointed to by
+    format. Any argument to fprintf_s corresponding to a %s specifier shall not be a
+    null pointer.
+3   If there is a runtime-constraint violation,378) the fprintf_s function does not attempt
+    to produce further output, and it is unspecified to what extent fprintf_s produced
+    output before discovering the runtime-constraint violation.
+    Description
+4   The fprintf_s function is equivalent to the fprintf function except for the explicit
+    runtime-constraints listed above.
+    Returns
+5   The fprintf_s function returns the number of characters transmitted, or a negative
+    value if an output error, encoding error, or runtime-constraint violation occurred.
+
+
+
+
+    377) It is not a runtime-constraint violation for the characters %n to appear in sequence in the string pointed
+         at by format when those characters are not a interpreted as a %n specifier. For example, if the entire
+         format string was %%n.
+    378) Because an implementation may treat any undefined behavior as a runtime-constraint violation, an
+         implementation may treat any unsupported specifiers in the string pointed to by format as a runtime-
+         constraint violation.
+
+[page 587]
+
+    K.3.5.3.2 The fscanf_s function
+    Synopsis
+1           #define __STDC_WANT_LIB_EXT1__ 1
+            #include <stdio.h>
+            int fscanf_s(FILE * restrict stream,
+                 const char * restrict format, ...);
+    Runtime-constraints
+2   Neither stream nor format shall be a null pointer. Any argument indirected though in
+    order to store converted input shall not be a null pointer.
+3   If there is a runtime-constraint violation,379) the fscanf_s function does not attempt to
+    perform further input, and it is unspecified to what extent fscanf_s performed input
+    before discovering the runtime-constraint violation.
+    Description
+4   The fscanf_s function is equivalent to fscanf except that the c, s, and [ conversion
+    specifiers apply to a pair of arguments (unless assignment suppression is indicated by a
+    *). The first of these arguments is the same as for fscanf. That argument is
+    immediately followed in the argument list by the second argument, which has type
+    rsize_t and gives the number of elements in the array pointed to by the first argument
+    of the pair. If the first argument points to a scalar object, it is considered to be an array of
+    one element.380)
+5   A matching failure occurs if the number of elements in a receiving object is insufficient to
+    hold the converted input (including any trailing null character).
+    Returns
+6   The fscanf_s function returns the value of the macro EOF if an input failure occurs
+    before any conversion or if there is a runtime-constraint violation. Otherwise, the
+
+    379) Because an implementation may treat any undefined behavior as a runtime-constraint violation, an
+         implementation may treat any unsupported specifiers in the string pointed to by format as a runtime-
+         constraint violation.
+    380) If the format is known at translation time, an implementation may issue a diagnostic for any argument
+         used to store the result from a c, s, or [ conversion specifier if that argument is not followed by an
+         argument of a type compatible with rsize_t. A limited amount of checking may be done if even if
+         the format is not known at translation time. For example, an implementation may issue a diagnostic
+         for each argument after format that has of type pointer to one of char, signed char,
+         unsigned char, or void that is not followed by an argument of a type compatible with
+         rsize_t. The diagnostic could warn that unless the pointer is being used with a conversion specifier
+         using the hh length modifier, a length argument must follow the pointer argument. Another useful
+         diagnostic could flag any non-pointer argument following format that did not have a type
+         compatible with rsize_t.
+
+[page 588]
+
+    fscanf_s 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.
+7   EXAMPLE 1        The call:
+             #define __STDC_WANT_LIB_EXT1__ 1
+             #include <stdio.h>
+             /* ... */
+             int n, i; float x; char name[50];
+             n = fscanf_s(stdin, "%d%f%s", &i, &x, name, (rsize_t) 50);
+    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.
+
+8   EXAMPLE 2        The call:
+             #define __STDC_WANT_LIB_EXT1__ 1
+             #include <stdio.h>
+             /* ... */
+             int n; char s[5];
+             n = fscanf_s(stdin, "%s", s, sizeof s);
+    with the input line:
+             hello
+    will assign to n the value 0 since a matching failure occurred because the sequence hello\0 requires an
+    array of six characters to store it.
+
+    K.3.5.3.3 The printf_s function
+    Synopsis
+1            #define __STDC_WANT_LIB_EXT1__ 1
+             #include <stdio.h>
+             int printf_s(const char * restrict format, ...);
+    Runtime-constraints
+2   format shall not be a null pointer. The %n specifier381) (modified or not by flags, field
+    width, or precision) shall not appear in the string pointed to by format. Any argument
+    to printf_s corresponding to a %s specifier shall not be a null pointer.
+3   If there is a runtime-constraint violation, the printf_s function does not attempt to
+    produce further output, and it is unspecified to what extent printf_s produced output
+    before discovering the runtime-constraint violation.
+
+
+    381) It is not a runtime-constraint violation for the characters %n to appear in sequence in the string pointed
+         at by format when those characters are not a interpreted as a %n specifier. For example, if the entire
+         format string was %%n.
+
+[page 589]
+
+    Description
+4   The printf_s function is equivalent to the printf function except for the explicit
+    runtime-constraints listed above.
+    Returns
+5   The printf_s function returns the number of characters transmitted, or a negative
+    value if an output error, encoding error, or runtime-constraint violation occurred.
+    K.3.5.3.4 The scanf_s function
+    Synopsis
+1          #define __STDC_WANT_LIB_EXT1__ 1
+           #include <stdio.h>
+           int scanf_s(const char * restrict format, ...);
+    Runtime-constraints
+2   format shall not be a null pointer. Any argument indirected though in order to store
+    converted input shall not be a null pointer.
+3   If there is a runtime-constraint violation, the scanf_s function does not attempt to
+    perform further input, and it is unspecified to what extent scanf_s performed input
+    before discovering the runtime-constraint violation.
+    Description
+4   The scanf_s function is equivalent to fscanf_s with the argument stdin
+    interposed before the arguments to scanf_s.
+    Returns
+5   The scanf_s function returns the value of the macro EOF if an input failure occurs
+    before any conversion or if there is a runtime-constraint violation. Otherwise, the
+    scanf_s 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.
+    K.3.5.3.5 The snprintf_s function
+    Synopsis
+1          #define __STDC_WANT_LIB_EXT1__ 1
+           #include <stdio.h>
+           int snprintf_s(char * restrict s, rsize_t n,
+                const char * restrict format, ...);
+    Runtime-constraints
+2   Neither s nor format shall be a null pointer. n shall neither equal zero nor be greater
+    than RSIZE_MAX. The %n specifier382) (modified or not by flags, field width, or
+    precision) shall not appear in the string pointed to by format. Any argument to
+[page 590]
+
+    snprintf_s corresponding to a %s specifier shall not be a null pointer. No encoding
+    error shall occur.
+3   If there is a runtime-constraint violation, then if s is not a null pointer and n is greater
+    than zero and less than RSIZE_MAX, then the snprintf_s function sets s[0] to the
+    null character.
+    Description
+4   The snprintf_s function is equivalent to the snprintf function except for the
+    explicit runtime-constraints listed above.
+5   The snprintf_s function, unlike sprintf_s, will truncate the result to fit within the
+    array pointed to by s.
+    Returns
+6   The snprintf_s 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 a runtime-constraint violation occurred. Thus, the null-terminated
+    output has been completely written if and only if the returned value is nonnegative and
+    less than n.
+    K.3.5.3.6 The sprintf_s function
+    Synopsis
+1            #define __STDC_WANT_LIB_EXT1__ 1
+             #include <stdio.h>
+             int sprintf_s(char * restrict s, rsize_t n,
+                  const char * restrict format, ...);
+    Runtime-constraints
+2   Neither s nor format shall be a null pointer. n shall neither equal zero nor be greater
+    than RSIZE_MAX. The number of characters (including the trailing null) required for the
+    result to be written to the array pointed to by s shall not be greater than n. The %n
+    specifier383) (modified or not by flags, field width, or precision) shall not appear in the
+    string pointed to by format. Any argument to sprintf_s corresponding to a %s
+    specifier shall not be a null pointer. No encoding error shall occur.
+
+
+
+    382) It is not a runtime-constraint violation for the characters %n to appear in sequence in the string pointed
+         at by format when those characters are not a interpreted as a %n specifier. For example, if the entire
+         format string was %%n.
+    383) It is not a runtime-constraint violation for the characters %n to appear in sequence in the string pointed
+         at by format when those characters are not a interpreted as a %n specifier. For example, if the entire
+         format string was %%n.
+
+[page 591]
+
+3   If there is a runtime-constraint violation, then if s is not a null pointer and n is greater
+    than zero and less than RSIZE_MAX, then the sprintf_s function sets s[0] to the
+    null character.
+    Description
+4   The sprintf_s function is equivalent to the sprintf function except for the
+    parameter n and the explicit runtime-constraints listed above.
+5   The sprintf_s function, unlike snprintf_s, treats a result too big for the array
+    pointed to by s as a runtime-constraint violation.
+    Returns
+6   If no runtime-constraint violation occurred, the sprintf_s function returns the number
+    of characters written in the array, not counting the terminating null character. If an
+    encoding error occurred, sprintf_s returns a negative value. If any other runtime-
+    constraint violation occurred, sprintf_s returns zero.
+    K.3.5.3.7 The sscanf_s function
+    Synopsis
+1          #define __STDC_WANT_LIB_EXT1__ 1
+           #include <stdio.h>
+           int sscanf_s(const char * restrict s,
+                const char * restrict format, ...);
+    Runtime-constraints
+2   Neither s nor format shall be a null pointer. Any argument indirected though in order
+    to store converted input shall not be a null pointer.
+3   If there is a runtime-constraint violation, the sscanf_s function does not attempt to
+    perform further input, and it is unspecified to what extent sscanf_s performed input
+    before discovering the runtime-constraint violation.
+    Description
+4   The sscanf_s function is equivalent to fscanf_s, 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_s function. If copying
+    takes place between objects that overlap, the objects take on unspecified values.
+    Returns
+5   The sscanf_s function returns the value of the macro EOF if an input failure occurs
+    before any conversion or if there is a runtime-constraint violation. Otherwise, the
+    sscanf_s 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 592]
+
+    K.3.5.3.8 The vfprintf_s function
+    Synopsis
+1            #define __STDC_WANT_LIB_EXT1__ 1
+             #include <stdarg.h>
+             #include <stdio.h>
+             int vfprintf_s(FILE * restrict stream,
+                  const char * restrict format,
+                  va_list arg);
+    Runtime-constraints
+2   Neither stream nor format shall be a null pointer. The %n specifier384) (modified or
+    not by flags, field width, or precision) shall not appear in the string pointed to by
+    format. Any argument to vfprintf_s corresponding to a %s specifier shall not be a
+    null pointer.
+3   If there is a runtime-constraint violation, the vfprintf_s function does not attempt to
+    produce further output, and it is unspecified to what extent vfprintf_s produced
+    output before discovering the runtime-constraint violation.
+    Description
+4   The vfprintf_s function is equivalent to the vfprintf function except for the
+    explicit runtime-constraints listed above.
+    Returns
+5   The vfprintf_s function returns the number of characters transmitted, or a negative
+    value if an output error, encoding error, or runtime-constraint violation occurred.
+    K.3.5.3.9 The vfscanf_s function
+    Synopsis
+1            #define __STDC_WANT_LIB_EXT1__ 1
+             #include <stdarg.h>
+             #include <stdio.h>
+             int vfscanf_s(FILE * restrict stream,
+                  const char * restrict format,
+                  va_list arg);
+
+
+
+
+    384) It is not a runtime-constraint violation for the characters %n to appear in sequence in the string pointed
+         at by format when those characters are not a interpreted as a %n specifier. For example, if the entire
+         format string was %%n.
+
+[page 593]
+
+    Runtime-constraints
+2   Neither stream nor format shall be a null pointer. Any argument indirected though in
+    order to store converted input shall not be a null pointer.
+3   If there is a runtime-constraint violation, the vfscanf_s function does not attempt to
+    perform further input, and it is unspecified to what extent vfscanf_s performed input
+    before discovering the runtime-constraint violation.
+    Description
+4   The vfscanf_s function is equivalent to fscanf_s, 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_s function does not invoke the
+    va_end macro.385)
+    Returns
+5   The vfscanf_s function returns the value of the macro EOF if an input failure occurs
+    before any conversion or if there is a runtime-constraint violation. Otherwise, the
+    vfscanf_s 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.
+    K.3.5.3.10 The vprintf_s function
+    Synopsis
+1            #define __STDC_WANT_LIB_EXT1__ 1
+             #include <stdarg.h>
+             #include <stdio.h>
+             int vprintf_s(const char * restrict format,
+                  va_list arg);
+    Runtime-constraints
+2   format shall not be a null pointer. The %n specifier386) (modified or not by flags, field
+    width, or precision) shall not appear in the string pointed to by format. Any argument
+    to vprintf_s corresponding to a %s specifier shall not be a null pointer.
+3   If there is a runtime-constraint violation, the vprintf_s function does not attempt to
+    produce further output, and it is unspecified to what extent vprintf_s produced output
+    before discovering the runtime-constraint violation.
+
+    385) As the functions vfprintf_s, vfscanf_s, vprintf_s, vscanf_s, vsnprintf_s,
+         vsprintf_s, and vsscanf_s invoke the va_arg macro, the value of arg after the return is
+         indeterminate.
+    386) It is not a runtime-constraint violation for the characters %n to appear in sequence in the string pointed
+         at by format when those characters are not a interpreted as a %n specifier. For example, if the entire
+         format string was %%n.
+
+[page 594]
+
+    Description
+4   The vprintf_s function is equivalent to the vprintf function except for the explicit
+    runtime-constraints listed above.
+    Returns
+5   The vprintf_s function returns the number of characters transmitted, or a negative
+    value if an output error, encoding error, or runtime-constraint violation occurred.
+    K.3.5.3.11 The vscanf_s function
+    Synopsis
+1           #define __STDC_WANT_LIB_EXT1__ 1
+            #include <stdarg.h>
+            #include <stdio.h>
+            int vscanf_s(const char * restrict format,
+                 va_list arg);
+    Runtime-constraints
+2   format shall not be a null pointer. Any argument indirected though in order to store
+    converted input shall not be a null pointer.
+3   If there is a runtime-constraint violation, the vscanf_s function does not attempt to
+    perform further input, and it is unspecified to what extent vscanf_s performed input
+    before discovering the runtime-constraint violation.
+    Description
+4   The vscanf_s function is equivalent to scanf_s, 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_s function does not invoke the
+    va_end macro.387)
+    Returns
+5   The vscanf_s function returns the value of the macro EOF if an input failure occurs
+    before any conversion or if there is a runtime-constraint violation. Otherwise, the
+    vscanf_s 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.
+
+
+
+
+    387) As the functions vfprintf_s, vfscanf_s, vprintf_s, vscanf_s, vsnprintf_s,
+         vsprintf_s, and vsscanf_s invoke the va_arg macro, the value of arg after the return is
+         indeterminate.
+
+[page 595]
+
+    K.3.5.3.12 The vsnprintf_s function
+    Synopsis
+1            #define __STDC_WANT_LIB_EXT1__ 1
+             #include <stdarg.h>
+             #include <stdio.h>
+             int vsnprintf_s(char * restrict s, rsize_t n,
+                  const char * restrict format,
+                  va_list arg);
+    Runtime-constraints
+2   Neither s nor format shall be a null pointer. n shall neither equal zero nor be greater
+    than RSIZE_MAX. The %n specifier388) (modified or not by flags, field width, or
+    precision) shall not appear in the string pointed to by format. Any argument to
+    vsnprintf_s corresponding to a %s specifier shall not be a null pointer. No encoding
+    error shall occur.
+3   If there is a runtime-constraint violation, then if s is not a null pointer and n is greater
+    than zero and less than RSIZE_MAX, then the vsnprintf_s function sets s[0] to the
+    null character.
+    Description
+4   The vsnprintf_s function is equivalent to the vsnprintf function except for the
+    explicit runtime-constraints listed above.
+5   The vsnprintf_s function, unlike vsprintf_s, will truncate the result to fit within
+    the array pointed to by s.
+    Returns
+6   The vsnprintf_s 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 a runtime-constraint violation occurred. Thus, the null-terminated
+    output has been completely written if and only if the returned value is nonnegative and
+    less than n.
+
+
+
+
+    388) It is not a runtime-constraint violation for the characters %n to appear in sequence in the string pointed
+         at by format when those characters are not a interpreted as a %n specifier. For example, if the entire
+         format string was %%n.
+
+[page 596]
+
+    K.3.5.3.13 The vsprintf_s function
+    Synopsis
+1            #define __STDC_WANT_LIB_EXT1__ 1
+             #include <stdarg.h>
+             #include <stdio.h>
+             int vsprintf_s(char * restrict s, rsize_t n,
+                  const char * restrict format,
+                  va_list arg);
+    Runtime-constraints
+2   Neither s nor format shall be a null pointer. n shall neither equal zero nor be greater
+    than RSIZE_MAX. The number of characters (including the trailing null) required for the
+    result to be written to the array pointed to by s shall not be greater than n. The %n
+    specifier389) (modified or not by flags, field width, or precision) shall not appear in the
+    string pointed to by format. Any argument to vsprintf_s corresponding to a %s
+    specifier shall not be a null pointer. No encoding error shall occur.
+3   If there is a runtime-constraint violation, then if s is not a null pointer and n is greater
+    than zero and less than RSIZE_MAX, then the vsprintf_s function sets s[0] to the
+    null character.
+    Description
+4   The vsprintf_s function is equivalent to the vsprintf function except for the
+    parameter n and the explicit runtime-constraints listed above.
+5   The vsprintf_s function, unlike vsnprintf_s, treats a result too big for the array
+    pointed to by s as a runtime-constraint violation.
+    Returns
+6   If no runtime-constraint violation occurred, the vsprintf_s function returns the
+    number of characters written in the array, not counting the terminating null character. If
+    an encoding error occurred, vsprintf_s returns a negative value. If any other
+    runtime-constraint violation occurred, vsprintf_s returns zero.
+
+
+
+
+    389) It is not a runtime-constraint violation for the characters %n to appear in sequence in the string pointed
+         at by format when those characters are not a interpreted as a %n specifier. For example, if the entire
+         format string was %%n.
+
+[page 597]
+
+    K.3.5.3.14 The vsscanf_s function
+    Synopsis
+1          #define __STDC_WANT_LIB_EXT1__ 1
+           #include <stdarg.h>
+           #include <stdio.h>
+           int vsscanf_s(const char * restrict s,
+                const char * restrict format,
+                va_list arg);
+    Runtime-constraints
+2   Neither s nor format shall be a null pointer. Any argument indirected though in order
+    to store converted input shall not be a null pointer.
+3   If there is a runtime-constraint violation, the vsscanf_s function does not attempt to
+    perform further input, and it is unspecified to what extent vsscanf_s performed input
+    before discovering the runtime-constraint violation.
+    Description
+4   The vsscanf_s function is equivalent to sscanf_s, 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_s function does not invoke the
+    va_end macro.390)
+    Returns
+5   The vsscanf_s function returns the value of the macro EOF if an input failure occurs
+    before any conversion or if there is a runtime-constraint violation. Otherwise, the
+    vscanf_s 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.
+    K.3.5.4 Character input/output functions
+    K.3.5.4.1 The gets_s function
+    Synopsis
+1          #define __STDC_WANT_LIB_EXT1__ 1
+           #include <stdio.h>
+           char *gets_s(char *s, rsize_t n);
+
+
+
+
+    390) As the functions vfprintf_s, vfscanf_s, vprintf_s, vscanf_s, vsnprintf_s,
+         vsprintf_s, and vsscanf_s invoke the va_arg macro, the value of arg after the return is
+         indeterminate.
+
+[page 598]
+
+    Runtime-constraints
+2   s shall not be a null pointer. n shall neither be equal to zero nor be greater than
+    RSIZE_MAX. A new-line character, end-of-file, or read error shall occur within reading
+    n-1 characters from stdin.391)
+3   If there is a runtime-constraint violation, s[0] is set to the null character, and characters
+    are read and discarded from stdin until a new-line character is read, or end-of-file or a
+    read error occurs.
+    Description
+4   The gets_s function reads at most one less than the number of characters specified by n
+    from the stream pointed to by stdin, into the array pointed to by s. No additional
+    characters are read after a new-line character (which is discarded) or after end-of-file.
+    The discarded new-line character does not count towards number of characters read. A
+    null character is written immediately after the last character read into the array.
+5   If end-of-file is encountered and no characters have been read into the array, or if a read
+    error occurs during the operation, then s[0] is set to the null character, and the other
+    elements of s take unspecified values.
+    Recommended practice
+6   The fgets function allows properly-written programs to safely process input lines too
+    long to store in the result array. In general this requires that callers of fgets pay
+    attention to the presence or absence of a new-line character in the result array. Consider
+    using fgets (along with any needed processing based on new-line characters) instead of
+    gets_s.
+    Returns
+7   The gets_s function returns s if successful. If there was a runtime-constraint violation,
+    or if end-of-file is encountered and no characters have been read into the array, or if a
+    read error occurs during the operation, then a null pointer is returned.
+
+
+
+
+    391) The gets_s function, unlike the historical gets function, makes it a runtime-constraint violation for
+         a line of input to overflow the buffer to store it. Unlike the fgets function, gets_s maintains a
+         one-to-one relationship between input lines and successful calls to gets_s. Programs that use gets
+         expect such a relationship.
+
+[page 599]
+
+    K.3.6 General utilities <stdlib.h>
+1   The header <stdlib.h> defines three types.
+2   The types are
+            errno_t
+    which is type int; and
+            rsize_t
+    which is the type size_t; and
+            constraint_handler_t
+    which has the following definition
+            typedef void (*constraint_handler_t)(
+                 const char * restrict msg,
+                 void * restrict ptr,
+                 errno_t error);
+    K.3.6.1 Runtime-constraint handling
+    K.3.6.1.1 The set_constraint_handler_s function
+    Synopsis
+1           #define __STDC_WANT_LIB_EXT1__ 1
+            #include <stdlib.h>
+            constraint_handler_t set_constraint_handler_s(
+                 constraint_handler_t handler);
+    Description
+2   The set_constraint_handler_s function sets the runtime-constraint handler to
+    be handler. The runtime-constraint handler is the function to be called when a library
+    function detects a runtime-constraint violation. Only the most recent handler registered
+    with set_constraint_handler_s is called when a runtime-constraint violation
+    occurs.
+3   When the handler is called, it is passed the following arguments in the following order:
+       1.   A pointer to a character string describing the runtime-constraint violation.
+       2.   A null pointer or a pointer to an implementation defined object.
+       3.   If the function calling the handler has a return type declared as errno_t, the
+            return value of the function is passed. Otherwise, a positive value of type
+            errno_t is passed.
+
+
+
+[page 600]
+
+4   The implementation has a default constraint handler that is used if no calls to the
+    set_constraint_handler_s function have been made. The behavior of the
+    default handler is implementation-defined, and it may cause the program to exit or abort.
+5   If the handler argument to set_constraint_handler_s is a null pointer, the
+    implementation default handler becomes the current constraint handler.
+    Returns
+6   The set_constraint_handler_s function returns a pointer to the previously
+    registered handler.392)
+    K.3.6.1.2 The abort_handler_s function
+    Synopsis
+1           #define __STDC_WANT_LIB_EXT1__ 1
+            #include <stdlib.h>
+            void abort_handler_s(
+                 const char * restrict msg,
+                 void * restrict ptr,
+                 errno_t error);
+    Description
+2   A pointer to the abort_handler_s function shall be a suitable argument to the
+    set_constraint_handler_s function.
+3   The abort_handler_s function writes a message on the standard error stream in an
+    implementation-defined format. The message shall include the string pointed to by msg.
+    The abort_handler_s function then calls the abort function.393)
+    Returns
+4   The abort_handler_s function does not return to its caller.
+
+
+
+
+    392) If the previous handler was registered by calling set_constraint_handler_s with a null
+         pointer argument, a pointer to the implementation default handler is returned (not NULL).
+    393) Many implementations invoke a debugger when the abort function is called.
+
+[page 601]
+
+    K.3.6.1.3 The ignore_handler_s function
+    Synopsis
+1           #define __STDC_WANT_LIB_EXT1__ 1
+            #include <stdlib.h>
+            void ignore_handler_s(
+                 const char * restrict msg,
+                 void * restrict ptr,
+                 errno_t error);
+    Description
+2   A pointer to the ignore_handler_s function shall be a suitable argument to the
+    set_constraint_handler_s function.
+3   The ignore_handler_s function simply returns to its caller.394)
+    Returns
+4   The ignore_handler_s function returns no value.
+    K.3.6.2 Communication with the environment
+    K.3.6.2.1 The getenv_s function
+    Synopsis
+1           #define __STDC_WANT_LIB_EXT1__ 1
+            #include <stdlib.h>
+            errno_t getenv_s(size_t * restrict len,
+                       char * restrict value, rsize_t maxsize,
+                       const char * restrict name);
+    Runtime-constraints
+2   name shall not be a null pointer. maxsize shall neither equal zero nor be greater than
+    RSIZE_MAX. If maxsize is not equal to zero, then value shall not be a null pointer.
+3   If there is a runtime-constraint violation, the integer pointed to by len is set to 0 (if len
+    is not null), and the environment list is not searched.
+    Description
+4   The getenv_s function searches an environment list, provided by the host environment,
+    for a string that matches the string pointed to by name.
+
+
+    394) If the runtime-constraint handler is set to the ignore_handler_s function, any library function in
+         which a runtime-constraint violation occurs will return to its caller. The caller can determine whether
+         a runtime-constraint violation occurred based on the library function's specification (usually, the
+         library function returns a nonzero errno_t).
+
+[page 602]
+
+5   If that name is found then getenv_s performs the following actions. If len is not a
+    null pointer, the length of the string associated with the matched list member is stored in
+    the integer pointed to by len. If the length of the associated string is less than maxsize,
+    then the associated string is copied to the array pointed to by value.
+6   If that name is not found then getenv_s performs the following actions. If len is not
+    a null pointer, zero is stored in the integer pointed to by len. If maxsize is greater than
+    zero, then value[0] is set to the null character.
+7   The set of environment names and the method for altering the environment list are
+    implementation-defined.
+    Returns
+8   The getenv_s function returns zero if the specified name is found and the associated
+    string was successfully stored in value. Otherwise, a nonzero value is returned.
+    K.3.6.3 Searching and sorting utilities
+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, if nmemb has the value zero on a call to that function, then the comparison
+    function is not called, a search finds no matching element, sorting performs no
+    rearrangement, and the pointer to the array may be null.
+2   The implementation shall ensure that the second argument of the comparison function
+    (when called from bsearch_s), or both arguments (when called from qsort_s), are
+    pointers to elements of the array.395) The first argument when called from bsearch_s
+    shall equal key.
+3   The comparison function shall not alter the contents of either the array or search key. The
+    implementation may reorder elements of the array between calls to the comparison
+    function, but shall not otherwise 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_s they shall define a total ordering on
+    the array, and for bsearch_s the same object shall always compare the same way with
+    the key.
+
+
+
+
+    395) That is, if the value passed is p, then the following expressions are always valid and nonzero:
+                  ((char *)p - (char *)base) % size == 0
+                  (char *)p >= (char *)base
+                  (char *)p < (char *)base + nmemb * size
+
+
+[page 603]
+
+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.
+    K.3.6.3.1 The bsearch_s function
+    Synopsis
+1            #define __STDC_WANT_LIB_EXT1__ 1
+             #include <stdlib.h>
+             void *bsearch_s(const void *key, const void *base,
+                  rsize_t nmemb, rsize_t size,
+                  int (*compar)(const void *k, const void *y,
+                                  void *context),
+                  void *context);
+    Runtime-constraints
+2   Neither nmemb nor size shall be greater than RSIZE_MAX. If nmemb is not equal to
+    zero, then none of key, base, or compar shall be a null pointer.
+3   If there is a runtime-constraint violation, the bsearch_s function does not search the
+    array.
+    Description
+4   The bsearch_s 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 size of each element of the array is specified by size.
+5   The comparison function pointed to by compar is called with three arguments. The first
+    two 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.396)
+    The third argument to the comparison function is the context argument passed to
+    bsearch_s. The sole use of context by bsearch_s is to pass it to the comparison
+    function.397)
+
+
+
+
+    396) In practice, this means that the entire array has been sorted according to the comparison function.
+    397) The context argument is for the use of the comparison function in performing its duties. For
+         example, it might specify a collating sequence used by the comparison function.
+
+[page 604]
+
+    Returns
+6   The bsearch_s function returns a pointer to a matching element of the array, or a null
+    pointer if no match is found or there is a runtime-constraint violation. If two elements
+    compare as equal, which element is matched is unspecified.
+    K.3.6.3.2 The qsort_s function
+    Synopsis
+1           #define __STDC_WANT_LIB_EXT1__ 1
+            #include <stdlib.h>
+            errno_t qsort_s(void *base, rsize_t nmemb, rsize_t size,
+                 int (*compar)(const void *x, const void *y,
+                                 void *context),
+                 void *context);
+    Runtime-constraints
+2   Neither nmemb nor size shall be greater than RSIZE_MAX. If nmemb is not equal to
+    zero, then neither base nor compar shall be a null pointer.
+3   If there is a runtime-constraint violation, the qsort_s function does not sort the array.
+    Description
+4   The qsort_s 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.
+5   The contents of the array are sorted into ascending order according to a comparison
+    function pointed to by compar, which is called with three arguments. The first two
+    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. The third argument to the comparison function is the
+    context argument passed to qsort_s. The sole use of context by qsort_s is to
+    pass it to the comparison function.398)
+6   If two elements compare as equal, their relative order in the resulting sorted array is
+    unspecified.
+    Returns
+7   The qsort_s function returns zero if there was no runtime-constraint violation.
+    Otherwise, a nonzero value is returned.
+
+
+
+
+    398) The context argument is for the use of the comparison function in performing its duties. For
+         example, it might specify a collating sequence used by the comparison function.
+
+[page 605]
+
+    K.3.6.4 Multibyte/wide character conversion functions
+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 set the int pointed to by their status argument to a nonzero value if
+    encodings have state dependency, and zero otherwise.399) Changing the LC_CTYPE
+    category causes the conversion state of these functions to be indeterminate.
+    K.3.6.4.1 The wctomb_s function
+    Synopsis
+1           #define __STDC_WANT_LIB_EXT1__ 1
+            #include <stdlib.h>
+            errno_t wctomb_s(int * restrict status,
+                 char * restrict s,
+                 rsize_t smax,
+                 wchar_t wc);
+    Runtime-constraints
+2   Let n denote the number of bytes needed to represent the multibyte character
+    corresponding to the wide character given by wc (including any shift sequences).
+3   If s is not a null pointer, then smax shall not be less than n, and smax shall not be
+    greater than RSIZE_MAX. If s is a null pointer, then smax shall equal zero.
+4   If there is a runtime-constraint violation, wctomb_s does not modify the int pointed to
+    by status, and if s is not a null pointer, no more than smax elements in the array
+    pointed to by s will be accessed.
+    Description
+5   The wctomb_s function determines n and stores the multibyte character representation
+    of wc in the array whose first element is pointed to by s (if s is not a null pointer). The
+    number of characters stored never exceeds MB_CUR_MAX or smax. 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.
+6   The implementation shall behave as if no library function calls the wctomb_s function.
+
+
+
+
+    399) 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.
+
+[page 606]
+
+7    If s is a null pointer, the wctomb_s function stores into the int pointed to by status a
+     nonzero or zero value, if multibyte character encodings, respectively, do or do not have
+     state-dependent encodings.
+8    If s is not a null pointer, the wctomb_s function stores into the int pointed to by
+     status either n or -1 if wc, respectively, does or does not correspond to a valid
+     multibyte character.
+9    In no case will the int pointed to by status be set to a value greater than the
+     MB_CUR_MAX macro.
+     Returns
+10   The wctomb_s function returns zero if successful, and a nonzero value if there was a
+     runtime-constraint violation or wc did not correspond to a valid multibyte character.
+     K.3.6.5 Multibyte/wide string conversion functions
+1    The behavior of the multibyte string functions is affected by the LC_CTYPE category of
+     the current locale.
+     K.3.6.5.1 The mbstowcs_s function
+     Synopsis
+1            #include <stdlib.h>
+             errno_t mbstowcs_s(size_t * restrict retval,
+                  wchar_t * restrict dst, rsize_t dstmax,
+                  const char * restrict src, rsize_t len);
+     Runtime-constraints
+2    Neither retval nor src shall be a null pointer. If dst is not a null pointer, then
+     neither len nor dstmax shall be greater than RSIZE_MAX. If dst is a null pointer,
+     then dstmax shall equal zero. If dst is not a null pointer, then dstmax shall not equal
+     zero. If dst is not a null pointer and len is not less than dstmax, then a null character
+     shall occur within the first dstmax multibyte characters of the array pointed to by src.
+3    If there is a runtime-constraint violation, then mbstowcs_s does the following. If
+     retval is not a null pointer, then mbstowcs_s sets *retval to (size_t)(-1). If
+     dst is not a null pointer and dstmax is greater than zero and less than RSIZE_MAX,
+     then mbstowcs_s sets dst[0] to the null wide character.
+     Description
+4    The mbstowcs_s function converts a sequence of multibyte characters that begins in
+     the initial shift state from the array 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
+[page 607]
+
+    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.400) If dst is not a null pointer and no null wide character was stored into the array
+    pointed to by dst, then dst[len] is set to the null wide character. Each conversion
+    takes place as if by a call to the mbrtowc function.
+5   Regardless of whether dst is or is not a null pointer, if the input conversion encounters a
+    sequence of bytes that do not form a valid multibyte character, an encoding error occurs:
+    the mbstowcs_s function stores the value (size_t)(-1) into *retval.
+    Otherwise, the mbstowcs_s function stores into *retval the number of multibyte
+    characters successfully converted, not including the terminating null character (if any).
+6   All elements following the terminating null wide character (if any) written by
+    mbstowcs_s in the array of dstmax wide characters pointed to by dst take
+    unspecified values when mbstowcs_s returns.401)
+7   If copying takes place between objects that overlap, the objects take on unspecified
+    values.
+    Returns
+8   The mbstowcs_s function returns zero if no runtime-constraint violation and no
+    encoding error occurred. Otherwise, a nonzero value is returned.
+    K.3.6.5.2 The wcstombs_s function
+    Synopsis
+1            #include <stdlib.h>
+             errno_t wcstombs_s(size_t * restrict retval,
+                  char * restrict dst, rsize_t dstmax,
+                  const wchar_t * restrict src, rsize_t len);
+    Runtime-constraints
+2   Neither retval nor src shall be a null pointer. If dst is not a null pointer, then
+    neither len nor dstmax shall be greater than RSIZE_MAX. If dst is a null pointer,
+    then dstmax shall equal zero. If dst is not a null pointer, then dstmax shall not equal
+    zero. If dst is not a null pointer and len is not less than dstmax, then the conversion
+    shall have been stopped (see below) because a terminating null wide character was
+    reached or because an encoding error occurred.
+
+
+
+
+    400) Thus, the value of len is ignored if dst is a null pointer.
+    401) This allows an implementation to attempt converting the multibyte string before discovering a
+         terminating null character did not occur where required.
+
+[page 608]
+
+3   If there is a runtime-constraint violation, then wcstombs_s does the following. If
+    retval is not a null pointer, then wcstombs_s sets *retval to (size_t)(-1). If
+    dst is not a null pointer and dstmax is greater than zero and less than RSIZE_MAX,
+    then wcstombs_s sets dst[0] to the null character.
+    Description
+4   The wcstombs_s function converts a sequence of wide characters from the array
+    pointed to by src into a sequence of corresponding multibyte characters that begins in
+    the initial shift state. 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;
+    -- (if dst is not a null pointer) when the next multibyte character would exceed the
+        limit of n total bytes to be stored into the array pointed to by dst. If the wide
+        character being converted is the null wide character, then n is the lesser of len or
+        dstmax. Otherwise, n is the lesser of len or dstmax-1.
+    If the conversion stops without converting a null wide character and dst is not a null
+    pointer, then a null character is stored into the array pointed to by dst immediately
+    following any multibyte characters already stored. Each conversion takes place as if by a
+    call to the wcrtomb function.402)
+5   Regardless of whether dst is or is not a null pointer, if the input conversion encounters a
+    wide character that does not correspond to a valid multibyte character, an encoding error
+    occurs: the wcstombs_s function stores the value (size_t)(-1) into *retval.
+    Otherwise, the wcstombs_s function stores into *retval the number of bytes in the
+    resulting multibyte character sequence, not including the terminating null character (if
+    any).
+6   All elements following the terminating null character (if any) written by wcstombs_s
+    in the array of dstmax elements pointed to by dst take unspecified values when
+    wcstombs_s returns.403)
+7   If copying takes place between objects that overlap, the objects take on unspecified
+    values.
+
+
+    402) 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. However, if
+         the conversion stops before a terminating null wide character has been reached, the result will be null
+         terminated, but might not end in the initial shift state.
+    403) When len is not less than dstmax, the implementation might fill the array before discovering a
+         runtime-constraint violation.
+
+[page 609]
+
+    Returns
+8   The wcstombs_s function returns zero if no runtime-constraint violation and no
+    encoding error occurred. Otherwise, a nonzero value is returned.
+    K.3.7 String handling <string.h>
+1   The header <string.h> defines two types.
+2   The types are
+           errno_t
+    which is type int; and
+           rsize_t
+    which is the type size_t.
+    K.3.7.1 Copying functions
+    K.3.7.1.1 The memcpy_s function
+    Synopsis
+1          #define __STDC_WANT_LIB_EXT1__ 1
+           #include <string.h>
+           errno_t memcpy_s(void * restrict s1, rsize_t s1max,
+                const void * restrict s2, rsize_t n);
+    Runtime-constraints
+2   Neither s1 nor s2 shall be a null pointer. Neither s1max nor n shall be greater than
+    RSIZE_MAX. n shall not be greater than s1max. Copying shall not take place between
+    objects that overlap.
+3   If there is a runtime-constraint violation, the memcpy_s function stores zeros in the first
+    s1max characters of the object pointed to by s1 if s1 is not a null pointer and s1max is
+    not greater than RSIZE_MAX.
+    Description
+4   The memcpy_s function copies n characters from the object pointed to by s2 into the
+    object pointed to by s1.
+    Returns
+5   The memcpy_s function returns zero if there was no runtime-constraint violation.
+    Otherwise, a nonzero value is returned.
+
+
+
+
+[page 610]
+
+    K.3.7.1.2 The memmove_s function
+    Synopsis
+1           #define __STDC_WANT_LIB_EXT1__ 1
+            #include <string.h>
+            errno_t memmove_s(void *s1, rsize_t s1max,
+                 const void *s2, rsize_t n);
+    Runtime-constraints
+2   Neither s1 nor s2 shall be a null pointer. Neither s1max nor n shall be greater than
+    RSIZE_MAX. n shall not be greater than s1max.
+3   If there is a runtime-constraint violation, the memmove_s function stores zeros in the
+    first s1max characters of the object pointed to by s1 if s1 is not a null pointer and
+    s1max is not greater than RSIZE_MAX.
+    Description
+4   The memmove_s function copies n characters from the object pointed to by s2 into the
+    object pointed to by s1. This 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 or s2, and then the n characters from the temporary
+    array are copied into the object pointed to by s1.
+    Returns
+5   The memmove_s function returns zero if there was no runtime-constraint violation.
+    Otherwise, a nonzero value is returned.
+    K.3.7.1.3 The strcpy_s function
+    Synopsis
+1           #define __STDC_WANT_LIB_EXT1__ 1
+            #include <string.h>
+            errno_t strcpy_s(char * restrict s1,
+                 rsize_t s1max,
+                 const char * restrict s2);
+    Runtime-constraints
+2   Neither s1 nor s2 shall be a null pointer. s1max shall not be greater than RSIZE_MAX.
+    s1max shall not equal zero. s1max shall be greater than strnlen_s(s2, s1max).
+    Copying shall not take place between objects that overlap.
+3   If there is a runtime-constraint violation, then if s1 is not a null pointer and s1max is
+    greater than zero and not greater than RSIZE_MAX, then strcpy_s sets s1[0] to the
+    null character.
+
+[page 611]
+
+    Description
+4   The strcpy_s function copies the string pointed to by s2 (including the terminating
+    null character) into the array pointed to by s1.
+5   All elements following the terminating null character (if any) written by strcpy_s in
+    the array of s1max characters pointed to by s1 take unspecified values when
+    strcpy_s returns.404)
+    Returns
+6   The strcpy_s function returns zero405) if there was no runtime-constraint violation.
+    Otherwise, a nonzero value is returned.
+    K.3.7.1.4 The strncpy_s function
+    Synopsis
+1           #define __STDC_WANT_LIB_EXT1__ 1
+            #include <string.h>
+            errno_t strncpy_s(char * restrict s1,
+                 rsize_t s1max,
+                 const char * restrict s2,
+                 rsize_t n);
+    Runtime-constraints
+2   Neither s1 nor s2 shall be a null pointer. Neither s1max nor n shall be greater than
+    RSIZE_MAX. s1max shall not equal zero. If n is not less than s1max, then s1max
+    shall be greater than strnlen_s(s2, s1max). Copying shall not take place between
+    objects that overlap.
+3   If there is a runtime-constraint violation, then if s1 is not a null pointer and s1max is
+    greater than zero and not greater than RSIZE_MAX, then strncpy_s sets s1[0] to the
+    null character.
+    Description
+4   The strncpy_s function copies not more than n successive characters (characters that
+    follow a null character are not copied) from the array pointed to by s2 to the array
+    pointed to by s1. If no null character was copied from s2, then s1[n] is set to a null
+    character.
+
+
+    404) This allows an implementation to copy characters from s2 to s1 while simultaneously checking if
+         any of those characters are null. Such an approach might write a character to every element of s1
+         before discovering that the first element should be set to the null character.
+    405) A zero return value implies that all of the requested characters from the string pointed to by s2 fit
+         within the array pointed to by s1 and that the result in s1 is null terminated.
+
+[page 612]
+
+5   All elements following the terminating null character (if any) written by strncpy_s in
+    the array of s1max characters pointed to by s1 take unspecified values when
+    strncpy_s returns.406)
+    Returns
+6   The strncpy_s function returns zero407) if there was no runtime-constraint violation.
+    Otherwise, a nonzero value is returned.
+7   EXAMPLE 1 The strncpy_s function can be used to copy a string without the danger that the result
+    will not be null terminated or that characters will be written past the end of the destination array.
+            #define __STDC_WANT_LIB_EXT1__ 1
+            #include <string.h>
+            /* ... */
+            char src1[100] = "hello";
+            char src2[7] = {'g', 'o', 'o', 'd', 'b', 'y', 'e'};
+            char dst1[6], dst2[5], dst3[5];
+            int r1, r2, r3;
+            r1 = strncpy_s(dst1, 6, src1, 100);
+            r2 = strncpy_s(dst2, 5, src2, 7);
+            r3 = strncpy_s(dst3, 5, src2, 4);
+    The first call will assign to r1 the value zero and to dst1 the sequence hello\0.
+    The second call will assign to r2 a nonzero value and to dst2 the sequence \0.
+    The third call will assign to r3 the value zero and to dst3 the sequence good\0.
+
+    K.3.7.2 Concatenation functions
+    K.3.7.2.1 The strcat_s function
+    Synopsis
+1           #define __STDC_WANT_LIB_EXT1__ 1
+            #include <string.h>
+            errno_t strcat_s(char * restrict s1,
+                 rsize_t s1max,
+                 const char * restrict s2);
+    Runtime-constraints
+2   Let m denote the value s1max - strnlen_s(s1, s1max) upon entry to
+    strcat_s.
+
+
+
+
+    406) This allows an implementation to copy characters from s2 to s1 while simultaneously checking if
+         any of those characters are null. Such an approach might write a character to every element of s1
+         before discovering that the first element should be set to the null character.
+    407) A zero return value implies that all of the requested characters from the string pointed to by s2 fit
+         within the array pointed to by s1 and that the result in s1 is null terminated.
+
+[page 613]
+
+3   Neither s1 nor s2 shall be a null pointer. s1max shall not be greater than RSIZE_MAX.
+    s1max shall not equal zero. m shall not equal zero.408) m shall be greater than
+    strnlen_s(s2, m). Copying shall not take place between objects that overlap.
+4   If there is a runtime-constraint violation, then if s1 is not a null pointer and s1max is
+    greater than zero and not greater than RSIZE_MAX, then strcat_s sets s1[0] to the
+    null character.
+    Description
+5   The strcat_s 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
+    from s2 overwrites the null character at the end of s1.
+6   All elements following the terminating null character (if any) written by strcat_s in
+    the array of s1max characters pointed to by s1 take unspecified values when
+    strcat_s returns.409)
+    Returns
+7   The strcat_s function returns zero410) if there was no runtime-constraint violation.
+    Otherwise, a nonzero value is returned.
+    K.3.7.2.2 The strncat_s function
+    Synopsis
+1           #define __STDC_WANT_LIB_EXT1__ 1
+            #include <string.h>
+            errno_t strncat_s(char * restrict s1,
+                 rsize_t s1max,
+                 const char * restrict s2,
+                 rsize_t n);
+    Runtime-constraints
+2   Let m denote the value s1max - strnlen_s(s1, s1max) upon entry to
+    strncat_s.
+3   Neither s1 nor s2 shall be a null pointer. Neither s1max nor n shall be greater than
+    RSIZE_MAX. s1max shall not equal zero. m shall not equal zero.411) If n is not less
+
+
+    408) Zero means that s1 was not null terminated upon entry to strcat_s.
+    409) This allows an implementation to append characters from s2 to s1 while simultaneously checking if
+         any of those characters are null. Such an approach might write a character to every element of s1
+         before discovering that the first element should be set to the null character.
+    410) A zero return value implies that all of the requested characters from the string pointed to by s2 were
+         appended to the string pointed to by s1 and that the result in s1 is null terminated.
+
+[page 614]
+
+    than m, then m shall be greater than strnlen_s(s2, m). Copying shall not take
+    place between objects that overlap.
+4   If there is a runtime-constraint violation, then if s1 is not a null pointer and s1max is
+    greater than zero and not greater than RSIZE_MAX, then strncat_s sets s1[0] to the
+    null character.
+    Description
+5   The strncat_s function appends not more than n successive characters (characters
+    that follow a null character are not copied) from the array pointed to by s2 to the end of
+    the string pointed to by s1. The initial character from s2 overwrites the null character at
+    the end of s1. If no null character was copied from s2, then s1[s1max-m+n] is set to
+    a null character.
+6   All elements following the terminating null character (if any) written by strncat_s in
+    the array of s1max characters pointed to by s1 take unspecified values when
+    strncat_s returns.412)
+    Returns
+7   The strncat_s function returns zero413) if there was no runtime-constraint violation.
+    Otherwise, a nonzero value is returned.
+8   EXAMPLE 1 The strncat_s function can be used to copy a string without the danger that the result
+    will not be null terminated or that characters will be written past the end of the destination array.
+            #define __STDC_WANT_LIB_EXT1__ 1
+            #include <string.h>
+            /* ... */
+            char s1[100] = "good";
+            char s2[6] = "hello";
+            char s3[6] = "hello";
+            char s4[7] = "abc";
+            char s5[1000] = "bye";
+            int r1, r2, r3, r4;
+            r1 = strncat_s(s1, 100, s5, 1000);
+            r2 = strncat_s(s2, 6, "", 1);
+            r3 = strncat_s(s3, 6, "X", 2);
+            r4 = strncat_s(s4, 7, "defghijklmn", 3);
+    After the first call r1 will have the value zero and s1 will contain the sequence goodbye\0.
+
+
+
+    411) Zero means that s1 was not null terminated upon entry to strncat_s.
+    412) This allows an implementation to append characters from s2 to s1 while simultaneously checking if
+         any of those characters are null. Such an approach might write a character to every element of s1
+         before discovering that the first element should be set to the null character.
+    413) A zero return value implies that all of the requested characters from the string pointed to by s2 were
+         appended to the string pointed to by s1 and that the result in s1 is null terminated.
+
+[page 615]
+
+    After the second call r2 will have the value zero and s2 will contain the sequence hello\0.
+    After the third call r3 will have a nonzero value and s3 will contain the sequence \0.
+    After the fourth call r4 will have the value zero and s4 will contain the sequence abcdef\0.
+
+    K.3.7.3 Search functions
+    K.3.7.3.1 The strtok_s function
+    Synopsis
+1           #define __STDC_WANT_LIB_EXT1__ 1
+            #include <string.h>
+            char *strtok_s(char * restrict s1,
+                 rsize_t * restrict s1max,
+                 const char * restrict s2,
+                 char ** restrict ptr);
+    Runtime-constraints
+2   None of s1max, s2, or ptr shall be a null pointer. If s1 is a null pointer, then *ptr
+    shall not be a null pointer. The value of *s1max shall not be greater than RSIZE_MAX.
+    The end of the token found shall occur within the first *s1max characters of s1 for the
+    first call, and shall occur within the first *s1max characters of where searching resumes
+    on subsequent calls.
+3   If there is a runtime-constraint violation, the strtok_s function does not indirect
+    through the s1 or s2 pointers, and does not store a value in the object pointed to by ptr.
+    Description
+4   A sequence of calls to the strtok_s 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 fourth argument points to a caller-provided char pointer into which the
+    strtok_s function stores information necessary for it to continue scanning the same
+    string.
+5   The first call in a sequence has a non-null first argument and s1max points to an object
+    whose value is the number of elements in the character array pointed to by the first
+    argument. The first call stores an initial value in the object pointed to by ptr and
+    updates the value pointed to by s1max to reflect the number of elements that remain in
+    relation to ptr. Subsequent calls in the sequence have a null first argument and the
+    objects pointed to by s1max and ptr are required to have the values stored by the
+    previous call in the sequence, which are then updated. The separator string pointed to by
+    s2 may be different from call to call.
+6   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_s
+    function returns a null pointer. If such a character is found, it is the start of the first token.
+[page 616]
+
+7    The strtok_s function then searches from there for the first character in s1 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 in the same
+     string for a token return a null pointer. If such a character is found, it is overwritten by a
+     null character, which terminates the current token.
+8    In all cases, the strtok_s 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 character
+     (if any).
+     Returns
+9    The strtok_s function returns a pointer to the first character of a token, or a null
+     pointer if there is no token or there is a runtime-constraint violation.
+10   EXAMPLE
+             #define __STDC_WANT_LIB_EXT1__ 1
+             #include <string.h>
+             static char str1[] = "?a???b,,,#c";
+             static char str2[] = "\t \t";
+             char *t, *ptr1, *ptr2;
+             rsize_t max1 = sizeof(str1);
+             rsize_t max2 = sizeof(str2);
+             t   =   strtok_s(str1,   &max1,   "?", &ptr1);        //   t   points to the token "a"
+             t   =   strtok_s(NULL,   &max1,   ",", &ptr1);        //   t   points to the token "??b"
+             t   =   strtok_s(str2,   &max2,   " \t", &ptr2);      //   t   is a null pointer
+             t   =   strtok_s(NULL,   &max1,   "#,", &ptr1);       //   t   points to the token "c"
+             t   =   strtok_s(NULL,   &max1,   "?", &ptr1);        //   t   is a null pointer
+
+     K.3.7.4 Miscellaneous functions
+     K.3.7.4.1 The memset_s function
+     Synopsis
+1            #define __STDC_WANT_LIB_EXT1__ 1
+             #include <string.h>
+             errno_t memset_s(void *s, rsize_t smax, int c, rsize_t n)
+     Runtime-constraints
+2    s shall not be a null pointer. Neither smax nor n shall be greater than RSIZE_MAX. n
+     shall not be greater than smax.
+3    If there is a runtime-constraint violation, then if s is not a null pointer and smax is not
+     greater than RSIZE_MAX, the memset_s function stores the value of c (converted to an
+     unsigned char) into each of the first smax characters of the object pointed to by s.
+
+
+
+[page 617]
+
+    Description
+4   The memset_s 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. Unlike memset, any call to
+    the memset_s function shall be evaluated strictly according to the rules of the abstract
+    machine as described in (5.1.2.3). That is, any call to the memset_s function shall
+    assume that the memory indicated by s and n may be accessible in the future and thus
+    must contain the values indicated by c.
+    Returns
+5   The memset_s function returns zero if there was no runtime-constraint violation.
+    Otherwise, a nonzero value is returned.
+    K.3.7.4.2 The strerror_s function
+    Synopsis
+1          #define __STDC_WANT_LIB_EXT1__ 1
+           #include <string.h>
+           errno_t strerror_s(char *s, rsize_t maxsize,
+                errno_t errnum);
+    Runtime-constraints
+2   s shall not be a null pointer. maxsize shall not be greater than RSIZE_MAX.
+    maxsize shall not equal zero.
+3   If there is a runtime-constraint violation, then the array (if any) pointed to by s is not
+    modified.
+    Description
+4   The strerror_s function maps the number in errnum to a locale-specific message
+    string. Typically, the values for errnum come from errno, but strerror_s shall
+    map any value of type int to a message.
+5   If the length of the desired string is less than maxsize, then the string is copied to the
+    array pointed to by s.
+6   Otherwise, if maxsize is greater than zero, then maxsize-1 characters are copied
+    from the string to the array pointed to by s and then s[maxsize-1] is set to the null
+    character. Then, if maxsize is greater than 3, then s[maxsize-2],
+    s[maxsize-3], and s[maxsize-4] are set to the character period (.).
+    Returns
+7   The strerror_s function returns zero if the length of the desired string was less than
+    maxsize and there was no runtime-constraint violation. Otherwise, the strerror_s
+    function returns a nonzero value.
+
+[page 618]
+
+    K.3.7.4.3 The strerrorlen_s function
+    Synopsis
+1           #define __STDC_WANT_LIB_EXT1__ 1
+            #include <string.h>
+            size_t strerrorlen_s(errno_t errnum);
+    Description
+2   The strerrorlen_s function calculates the length of the (untruncated) locale-specific
+    message string that the strerror_s function maps to errnum.
+    Returns
+3   The strerrorlen_s function returns the number of characters (not including the null
+    character) in the full message string.
+    K.3.7.4.4 The strnlen_s function
+    Synopsis
+1           #define __STDC_WANT_LIB_EXT1__ 1
+            #include <string.h>
+            size_t strnlen_s(const char *s, size_t maxsize);
+    Description
+2   The strnlen_s function computes the length of the string pointed to by s.
+    Returns
+3   If s is a null pointer,414) then the strnlen_s function returns zero.
+4   Otherwise, the strnlen_s function returns the number of characters that precede the
+    terminating null character. If there is no null character in the first maxsize characters of
+    s then strnlen_s returns maxsize. At most the first maxsize characters of s shall
+    be accessed by strnlen_s.
+
+
+
+
+    414) Note that the strnlen_s function has no runtime-constraints. This lack of runtime-constraints
+         along with the values returned for a null pointer or an unterminated string argument make
+         strnlen_s useful in algorithms that gracefully handle such exceptional data.
+
+[page 619]
+
+    K.3.8 Date and time <time.h>
+1   The header <time.h> defines two types.
+2   The types are
+            errno_t
+    which is type int; and
+            rsize_t
+    which is the type size_t.
+    K.3.8.1 Components of time
+1   A broken-down time is normalized if the values of the members of the tm structure are in
+    their normal rages.415)
+    K.3.8.2 Time conversion functions
+1   Like the strftime function, the asctime_s and ctime_s functions do not return a
+    pointer to a static object, and other library functions are permitted to call them.
+    K.3.8.2.1 The asctime_s function
+    Synopsis
+1           #define __STDC_WANT_LIB_EXT1__ 1
+            #include <time.h>
+            errno_t asctime_s(char *s, rsize_t maxsize,
+                 const struct tm *timeptr);
+    Runtime-constraints
+2   Neither s nor timeptr shall be a null pointer. maxsize shall not be less than 26 and
+    shall not be greater than RSIZE_MAX. The broken-down time pointed to by timeptr
+    shall be normalized. The calendar year represented by the broken-down time pointed to
+    by timeptr shall not be less than calendar year 0 and shall not be greater than calendar
+    year 9999.
+3   If there is a runtime-constraint violation, there is no attempt to convert the time, and
+    s[0] is set to a null character if s is not a null pointer and maxsize is not zero and is
+    not greater than RSIZE_MAX.
+    Description
+4   The asctime_s function converts the normalized broken-down time in the structure
+    pointed to by timeptr into a 26 character (including the null character) string in the
+
+
+    415) The normal ranges are defined in 7.26.1.
+
+[page 620]
+
+    form
+            Sun Sep 16 01:03:52 1973\n\0
+    The fields making up this string are (in order):
+       1.   The name of the day of the week represented by timeptr->tm_wday using the
+            following three character weekday names: Sun, Mon, Tue, Wed, Thu, Fri, and Sat.
+       2.   The character space.
+       3. The name of the month represented by timeptr->tm_mon using the following
+          three character month names: Jan, Feb, Mar, Apr, May, Jun, Jul, Aug, Sep, Oct,
+          Nov, and Dec.
+       4.   The character space.
+       5.   The value of timeptr->tm_mday as if printed using the fprintf format
+            "%2d".
+       6.   The character space.
+       7.   The value of timeptr->tm_hour as if printed using the fprintf format
+            "%.2d".
+       8.   The character colon.
+       9.   The value of timeptr->tm_min as if printed using the fprintf format
+            "%.2d".
+     10.    The character colon.
+     11.    The value of timeptr->tm_sec as if printed using the fprintf format
+            "%.2d".
+     12.    The character space.
+     13.    The value of timeptr->tm_year + 1900 as if printed using the fprintf
+            format "%4d".
+     14.    The character new line.
+     15.    The null character.
+    Recommended practice
+    The strftime function allows more flexible formatting and supports locale-specific
+    behavior. If you do not require the exact form of the result string produced by the
+    asctime_s function, consider using the strftime function instead.
+    Returns
+5   The asctime_s function returns zero if the time was successfully converted and stored
+    into the array pointed to by s. Otherwise, it returns a nonzero value.
+[page 621]
+
+    K.3.8.2.2 The ctime_s function
+    Synopsis
+1          #define __STDC_WANT_LIB_EXT1__ 1
+           #include <time.h>
+           errno_t ctime_s(char *s, rsize_t maxsize,
+                const time_t *timer);
+    Runtime-constraints
+2   Neither s nor timer shall be a null pointer. maxsize shall not be less than 26 and
+    shall not be greater than RSIZE_MAX.
+3   If there is a runtime-constraint violation, s[0] is set to a null character if s is not a null
+    pointer and maxsize is not equal zero and is not greater than RSIZE_MAX.
+    Description
+4   The ctime_s function converts the calendar time pointed to by timer to local time in
+    the form of a string. It is equivalent to
+           asctime_s(s, maxsize, localtime_s(timer))
+    Recommended practice
+    The strftime function allows more flexible formatting and supports locale-specific
+    behavior. If you do not require the exact form of the result string produced by the
+    ctime_s function, consider using the strftime function instead.
+    Returns
+5   The ctime_s function returns zero if the time was successfully converted and stored
+    into the array pointed to by s. Otherwise, it returns a nonzero value.
+    K.3.8.2.3 The gmtime_s function
+    Synopsis
+1          #define __STDC_WANT_LIB_EXT1__ 1
+           #include <time.h>
+           struct tm *gmtime_s(const time_t * restrict timer,
+                struct tm * restrict result);
+    Runtime-constraints
+2   Neither timer nor result shall be a null pointer.
+3   If there is a runtime-constraint violation, there is no attempt to convert the time.
+    Description
+4   The gmtime_s function converts the calendar time pointed to by timer into a broken-
+    down time, expressed as UTC. The broken-down time is stored in the structure pointed
+[page 622]
+
+    to by result.
+    Returns
+5   The gmtime_s function returns result, or a null pointer if the specified time cannot
+    be converted to UTC or there is a runtime-constraint violation.
+    K.3.8.2.4 The localtime_s function
+    Synopsis
+1            #define __STDC_WANT_LIB_EXT1__ 1
+             #include <time.h>
+             struct tm *localtime_s(const time_t * restrict timer,
+                  struct tm * restrict result);
+    Runtime-constraints
+2   Neither timer nor result shall be a null pointer.
+3   If there is a runtime-constraint violation, there is no attempt to convert the time.
+    Description
+4   The localtime_s function converts the calendar time pointed to by timer into a
+    broken-down time, expressed as local time. The broken-down time is stored in the
+    structure pointed to by result.
+    Returns
+5   The localtime_s function returns result, or a null pointer if the specified time
+    cannot be converted to local time or there is a runtime-constraint violation.
+    K.3.9 Extended multibyte and wide character utilities <wchar.h>
+1   The header <wchar.h> defines two types.
+2   The types are
+             errno_t
+    which is type int; and
+             rsize_t
+    which is the type size_t.
+3   Unless explicitly stated otherwise, if the execution of a function described in this
+    subclause causes copying to take place between objects that overlap, the objects take on
+    unspecified values.
+
+
+
+
+[page 623]
+
+    K.3.9.1 Formatted wide character input/output functions
+    K.3.9.1.1 The fwprintf_s function
+    Synopsis
+1           #define __STDC_WANT_LIB_EXT1__ 1
+            #include <wchar.h>
+            int fwprintf_s(FILE * restrict stream,
+                 const wchar_t * restrict format, ...);
+    Runtime-constraints
+2   Neither stream nor format shall be a null pointer. The %n specifier416) (modified or
+    not by flags, field width, or precision) shall not appear in the wide string pointed to by
+    format. Any argument to fwprintf_s corresponding to a %s specifier shall not be a
+    null pointer.
+3   If there is a runtime-constraint violation, the fwprintf_s function does not attempt to
+    produce further output, and it is unspecified to what extent fwprintf_s produced
+    output before discovering the runtime-constraint violation.
+    Description
+4   The fwprintf_s function is equivalent to the fwprintf function except for the
+    explicit runtime-constraints listed above.
+    Returns
+5   The fwprintf_s function returns the number of wide characters transmitted, or a
+    negative value if an output error, encoding error, or runtime-constraint violation occurred.
+    K.3.9.1.2 The fwscanf_s function
+    Synopsis
+1           #define __STDC_WANT_LIB_EXT1__ 1
+            #include <stdio.h>
+            #include <wchar.h>
+            int fwscanf_s(FILE * restrict stream,
+                 const wchar_t * restrict format, ...);
+    Runtime-constraints
+2   Neither stream nor format shall be a null pointer. Any argument indirected though in
+    order to store converted input shall not be a null pointer.
+
+
+    416) It is not a runtime-constraint violation for the wide characters %n to appear in sequence in the wide
+         string pointed at by format when those wide characters are not a interpreted as a %n specifier. For
+         example, if the entire format string was L"%%n".
+
+[page 624]
+
+3   If there is a runtime-constraint violation, the fwscanf_s function does not attempt to
+    perform further input, and it is unspecified to what extent fwscanf_s performed input
+    before discovering the runtime-constraint violation.
+    Description
+4   The fwscanf_s function is equivalent to fwscanf except that the c, s, and [
+    conversion specifiers apply to a pair of arguments (unless assignment suppression is
+    indicated by a *). The first of these arguments is the same as for fwscanf. That
+    argument is immediately followed in the argument list by the second argument, which has
+    type size_t and gives the number of elements in the array pointed to by the first
+    argument of the pair. If the first argument points to a scalar object, it is considered to be
+    an array of one element.417)
+5   A matching failure occurs if the number of elements in a receiving object is insufficient to
+    hold the converted input (including any trailing null character).
+    Returns
+6   The fwscanf_s function returns the value of the macro EOF if an input failure occurs
+    before any conversion or if there is a runtime-constraint violation. Otherwise, the
+    fwscanf_s 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.
+    K.3.9.1.3 The snwprintf_s function
+    Synopsis
+1           #define __STDC_WANT_LIB_EXT1__ 1
+            #include <wchar.h>
+            int snwprintf_s(wchar_t * restrict s,
+                 rsize_t n,
+                 const wchar_t * restrict format, ...);
+    Runtime-constraints
+2   Neither s nor format shall be a null pointer. n shall neither equal zero nor be greater
+    than RSIZE_MAX. The %n specifier418) (modified or not by flags, field width, or
+
+    417) If the format is known at translation time, an implementation may issue a diagnostic for any argument
+         used to store the result from a c, s, or [ conversion specifier if that argument is not followed by an
+         argument of a type compatible with rsize_t. A limited amount of checking may be done if even if
+         the format is not known at translation time. For example, an implementation may issue a diagnostic
+         for each argument after format that has of type pointer to one of char, signed char,
+         unsigned char, or void that is not followed by an argument of a type compatible with
+         rsize_t. The diagnostic could warn that unless the pointer is being used with a conversion specifier
+         using the hh length modifier, a length argument must follow the pointer argument. Another useful
+         diagnostic could flag any non-pointer argument following format that did not have a type
+         compatible with rsize_t.
+
+[page 625]
+
+    precision) shall not appear in the wide string pointed to by format. Any argument to
+    snwprintf_s corresponding to a %s specifier shall not be a null pointer. No encoding
+    error shall occur.
+3   If there is a runtime-constraint violation, then if s is not a null pointer and n is greater
+    than zero and less than RSIZE_MAX, then the snwprintf_s function sets s[0] to the
+    null wide character.
+    Description
+4   The snwprintf_s function is equivalent to the swprintf function except for the
+    explicit runtime-constraints listed above.
+5   The snwprintf_s function, unlike swprintf_s, will truncate the result to fit within
+    the array pointed to by s.
+    Returns
+6   The snwprintf_s function returns the number of wide characters that would have
+    been written had n been sufficiently large, not counting the terminating wide null
+    character, or a negative value if a runtime-constraint violation occurred. Thus, the null-
+    terminated output has been completely written if and only if the returned value is
+    nonnegative and less than n.
+    K.3.9.1.4 The swprintf_s function
+    Synopsis
+1           #define __STDC_WANT_LIB_EXT1__ 1
+            #include <wchar.h>
+            int swprintf_s(wchar_t * restrict s, rsize_t n,
+                 const wchar_t * restrict format, ...);
+    Runtime-constraints
+2   Neither s nor format shall be a null pointer. n shall neither equal zero nor be greater
+    than RSIZE_MAX. The number of wide characters (including the trailing null) required
+    for the result to be written to the array pointed to by s shall not be greater than n. The %n
+    specifier419) (modified or not by flags, field width, or precision) shall not appear in the
+    wide string pointed to by format. Any argument to swprintf_s corresponding to a
+    %s specifier shall not be a null pointer. No encoding error shall occur.
+
+
+    418) It is not a runtime-constraint violation for the wide characters %n to appear in sequence in the wide
+         string pointed at by format when those wide characters are not a interpreted as a %n specifier. For
+         example, if the entire format string was L"%%n".
+    419) It is not a runtime-constraint violation for the wide characters %n to appear in sequence in the wide
+         string pointed at by format when those wide characters are not a interpreted as a %n specifier. For
+         example, if the entire format string was L"%%n".
+
+[page 626]
+
+3   If there is a runtime-constraint violation, then if s is not a null pointer and n is greater
+    than zero and less than RSIZE_MAX, then the swprintf_s function sets s[0] to the
+    null wide character.
+    Description
+4   The swprintf_s function is equivalent to the swprintf function except for the
+    explicit runtime-constraints listed above.
+5   The swprintf_s function, unlike snwprintf_s, treats a result too big for the array
+    pointed to by s as a runtime-constraint violation.
+    Returns
+6   If no runtime-constraint violation occurred, the swprintf_s function returns the
+    number of wide characters written in the array, not counting the terminating null wide
+    character. If an encoding error occurred or if n or more wide characters are requested to
+    be written, swprintf_s returns a negative value. If any other runtime-constraint
+    violation occurred, swprintf_s returns zero.
+    K.3.9.1.5 The swscanf_s function
+    Synopsis
+1           #define __STDC_WANT_LIB_EXT1__ 1
+            #include <wchar.h>
+            int swscanf_s(const wchar_t * restrict s,
+                 const wchar_t * restrict format, ...);
+    Runtime-constraints
+2   Neither s nor format shall be a null pointer. Any argument indirected though in order
+    to store converted input shall not be a null pointer.
+3   If there is a runtime-constraint violation, the swscanf_s function does not attempt to
+    perform further input, and it is unspecified to what extent swscanf_s performed input
+    before discovering the runtime-constraint violation.
+    Description
+4   The swscanf_s function is equivalent to fwscanf_s, 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_s function.
+    Returns
+5   The swscanf_s function returns the value of the macro EOF if an input failure occurs
+    before any conversion or if there is a runtime-constraint violation. Otherwise, the
+    swscanf_s 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 627]
+
+    K.3.9.1.6 The vfwprintf_s function
+    Synopsis
+1           #define __STDC_WANT_LIB_EXT1__ 1
+            #include <stdarg.h>
+            #include <stdio.h>
+            #include <wchar.h>
+            int vfwprintf_s(FILE * restrict stream,
+                 const wchar_t * restrict format,
+                 va_list arg);
+    Runtime-constraints
+2   Neither stream nor format shall be a null pointer. The %n specifier420) (modified or
+    not by flags, field width, or precision) shall not appear in the wide string pointed to by
+    format. Any argument to vfwprintf_s corresponding to a %s specifier shall not be
+    a null pointer.
+3   If there is a runtime-constraint violation, the vfwprintf_s function does not attempt
+    to produce further output, and it is unspecified to what extent vfwprintf_s produced
+    output before discovering the runtime-constraint violation.
+    Description
+4   The vfwprintf_s function is equivalent to the vfwprintf function except for the
+    explicit runtime-constraints listed above.
+    Returns
+5   The vfwprintf_s function returns the number of wide characters transmitted, or a
+    negative value if an output error, encoding error, or runtime-constraint violation occurred.
+    K.3.9.1.7 The vfwscanf_s function
+    Synopsis
+1           #define __STDC_WANT_LIB_EXT1__ 1
+            #include <stdarg.h>
+            #include <stdio.h>
+            #include <wchar.h>
+            int vfwscanf_s(FILE * restrict stream,
+                 const wchar_t * restrict format, va_list arg);
+
+
+
+    420) It is not a runtime-constraint violation for the wide characters %n to appear in sequence in the wide
+         string pointed at by format when those wide characters are not a interpreted as a %n specifier. For
+         example, if the entire format string was L"%%n".
+
+[page 628]
+
+    Runtime-constraints
+2   Neither stream nor format shall be a null pointer. Any argument indirected though in
+    order to store converted input shall not be a null pointer.
+3   If there is a runtime-constraint violation, the vfwscanf_s function does not attempt to
+    perform further input, and it is unspecified to what extent vfwscanf_s performed input
+    before discovering the runtime-constraint violation.
+    Description
+4   The vfwscanf_s function is equivalent to fwscanf_s, 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_s function does not invoke the
+    va_end macro.421)
+    Returns
+5   The vfwscanf_s function returns the value of the macro EOF if an input failure occurs
+    before any conversion or if there is a runtime-constraint violation. Otherwise, the
+    vfwscanf_s 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.
+    K.3.9.1.8 The vsnwprintf_s function
+    Synopsis
+1           #define __STDC_WANT_LIB_EXT1__ 1
+            #include <stdarg.h>
+            #include <wchar.h>
+            int vsnwprintf_s(wchar_t * restrict s,
+                 rsize_t n,
+                 const wchar_t * restrict format,
+                 va_list arg);
+    Runtime-constraints
+2   Neither s nor format shall be a null pointer. n shall neither equal zero nor be greater
+    than RSIZE_MAX. The %n specifier422) (modified or not by flags, field width, or
+    precision) shall not appear in the wide string pointed to by format. Any argument to
+    vsnwprintf_s corresponding to a %s specifier shall not be a null pointer. No
+    encoding error shall occur.
+
+    421) As the functions vfwscanf_s, vwscanf_s, and vswscanf_s invoke the va_arg macro, the
+         value of arg after the return is indeterminate.
+    422) It is not a runtime-constraint violation for the wide characters %n to appear in sequence in the wide
+         string pointed at by format when those wide characters are not a interpreted as a %n specifier. For
+         example, if the entire format string was L"%%n".
+
+[page 629]
+
+3   If there is a runtime-constraint violation, then if s is not a null pointer and n is greater
+    than zero and less than RSIZE_MAX, then the vsnwprintf_s function sets s[0] to
+    the null wide character.
+    Description
+4   The vsnwprintf_s function is equivalent to the vswprintf function except for the
+    explicit runtime-constraints listed above.
+5   The vsnwprintf_s function, unlike vswprintf_s, will truncate the result to fit
+    within the array pointed to by s.
+    Returns
+6   The vsnwprintf_s function returns the number of wide characters that would have
+    been written had n been sufficiently large, not counting the terminating null character, or
+    a negative value if a runtime-constraint violation occurred. Thus, the null-terminated
+    output has been completely written if and only if the returned value is nonnegative and
+    less than n.
+    K.3.9.1.9 The vswprintf_s function
+    Synopsis
+1           #define __STDC_WANT_LIB_EXT1__ 1
+            #include <stdarg.h>
+            #include <wchar.h>
+            int vswprintf_s(wchar_t * restrict s,
+                 rsize_t n,
+                 const wchar_t * restrict format,
+                 va_list arg);
+    Runtime-constraints
+2   Neither s nor format shall be a null pointer. n shall neither equal zero nor be greater
+    than RSIZE_MAX. The number of wide characters (including the trailing null) required
+    for the result to be written to the array pointed to by s shall not be greater than n. The %n
+    specifier423) (modified or not by flags, field width, or precision) shall not appear in the
+    wide string pointed to by format. Any argument to vswprintf_s corresponding to a
+    %s specifier shall not be a null pointer. No encoding error shall occur.
+3   If there is a runtime-constraint violation, then if s is not a null pointer and n is greater
+    than zero and less than RSIZE_MAX, then the vswprintf_s function sets s[0] to the
+    null wide character.
+
+    423) It is not a runtime-constraint violation for the wide characters %n to appear in sequence in the wide
+         string pointed at by format when those wide characters are not a interpreted as a %n specifier. For
+         example, if the entire format string was L"%%n".
+
+[page 630]
+
+    Description
+4   The vswprintf_s function is equivalent to the vswprintf function except for the
+    explicit runtime-constraints listed above.
+5   The vswprintf_s function, unlike vsnwprintf_s, treats a result too big for the
+    array pointed to by s as a runtime-constraint violation.
+    Returns
+6   If no runtime-constraint violation occurred, the vswprintf_s function returns the
+    number of wide characters written in the array, not counting the terminating null wide
+    character. If an encoding error occurred or if n or more wide characters are requested to
+    be written, vswprintf_s returns a negative value. If any other runtime-constraint
+    violation occurred, vswprintf_s returns zero.
+    K.3.9.1.10 The vswscanf_s function
+    Synopsis
+1           #define __STDC_WANT_LIB_EXT1__ 1
+            #include <stdarg.h>
+            #include <wchar.h>
+            int vswscanf_s(const wchar_t * restrict s,
+                 const wchar_t * restrict format,
+                 va_list arg);
+    Runtime-constraints
+2   Neither s nor format shall be a null pointer. Any argument indirected though in order
+    to store converted input shall not be a null pointer.
+3   If there is a runtime-constraint violation, the vswscanf_s function does not attempt to
+    perform further input, and it is unspecified to what extent vswscanf_s performed input
+    before discovering the runtime-constraint violation.
+    Description
+4   The vswscanf_s function is equivalent to swscanf_s, 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_s function does not invoke the
+    va_end macro.424)
+
+
+
+
+    424) As the functions vfwscanf_s, vwscanf_s, and vswscanf_s invoke the va_arg macro, the
+         value of arg after the return is indeterminate.
+
+[page 631]
+
+    Returns
+5   The vswscanf_s function returns the value of the macro EOF if an input failure occurs
+    before any conversion or if there is a runtime-constraint violation. Otherwise, the
+    vswscanf_s 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.
+    K.3.9.1.11 The vwprintf_s function
+    Synopsis
+1           #define __STDC_WANT_LIB_EXT1__ 1
+            #include <stdarg.h>
+            #include <wchar.h>
+            int vwprintf_s(const wchar_t * restrict format,
+                 va_list arg);
+    Runtime-constraints
+2   format shall not be a null pointer. The %n specifier425) (modified or not by flags, field
+    width, or precision) shall not appear in the wide string pointed to by format. Any
+    argument to vwprintf_s corresponding to a %s specifier shall not be a null pointer.
+3   If there is a runtime-constraint violation, the vwprintf_s function does not attempt to
+    produce further output, and it is unspecified to what extent vwprintf_s produced
+    output before discovering the runtime-constraint violation.
+    Description
+4   The vwprintf_s function is equivalent to the vwprintf function except for the
+    explicit runtime-constraints listed above.
+    Returns
+5   The vwprintf_s function returns the number of wide characters transmitted, or a
+    negative value if an output error, encoding error, or runtime-constraint violation occurred.
+
+
+
+
+    425) It is not a runtime-constraint violation for the wide characters %n to appear in sequence in the wide
+         string pointed at by format when those wide characters are not a interpreted as a %n specifier. For
+         example, if the entire format string was L"%%n".
+
+[page 632]
+
+    K.3.9.1.12 The vwscanf_s function
+    Synopsis
+1           #define __STDC_WANT_LIB_EXT1__ 1
+            #include <stdarg.h>
+            #include <wchar.h>
+            int vwscanf_s(const wchar_t * restrict format,
+                 va_list arg);
+    Runtime-constraints
+2   format shall not be a null pointer. Any argument indirected though in order to store
+    converted input shall not be a null pointer.
+3   If there is a runtime-constraint violation, the vwscanf_s function does not attempt to
+    perform further input, and it is unspecified to what extent vwscanf_s performed input
+    before discovering the runtime-constraint violation.
+    Description
+4   The vwscanf_s function is equivalent to wscanf_s, 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_s function does not invoke the
+    va_end macro.426)
+    Returns
+5   The vwscanf_s function returns the value of the macro EOF if an input failure occurs
+    before any conversion or if there is a runtime-constraint violation. Otherwise, the
+    vwscanf_s 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.
+    K.3.9.1.13 The wprintf_s function
+    Synopsis
+1           #define __STDC_WANT_LIB_EXT1__ 1
+            #include <wchar.h>
+            int wprintf_s(const wchar_t * restrict format, ...);
+    Runtime-constraints
+2   format shall not be a null pointer. The %n specifier427) (modified or not by flags, field
+
+    426) As the functions vfwscanf_s, vwscanf_s, and vswscanf_s invoke the va_arg macro, the
+         value of arg after the return is indeterminate.
+    427) It is not a runtime-constraint violation for the wide characters %n to appear in sequence in the wide
+         string pointed at by format when those wide characters are not a interpreted as a %n specifier. For
+         example, if the entire format string was L"%%n".
+
+[page 633]
+
+    width, or precision) shall not appear in the wide string pointed to by format. Any
+    argument to wprintf_s corresponding to a %s specifier shall not be a null pointer.
+3   If there is a runtime-constraint violation, the wprintf_s function does not attempt to
+    produce further output, and it is unspecified to what extent wprintf_s produced output
+    before discovering the runtime-constraint violation.
+    Description
+4   The wprintf_s function is equivalent to the wprintf function except for the explicit
+    runtime-constraints listed above.
+    Returns
+5   The wprintf_s function returns the number of wide characters transmitted, or a
+    negative value if an output error, encoding error, or runtime-constraint violation occurred.
+    K.3.9.1.14 The wscanf_s function
+    Synopsis
+1          #define __STDC_WANT_LIB_EXT1__ 1
+           #include <wchar.h>
+           int wscanf_s(const wchar_t * restrict format, ...);
+    Runtime-constraints
+2   format shall not be a null pointer. Any argument indirected though in order to store
+    converted input shall not be a null pointer.
+3   If there is a runtime-constraint violation, the wscanf_s function does not attempt to
+    perform further input, and it is unspecified to what extent wscanf_s performed input
+    before discovering the runtime-constraint violation.
+    Description
+4   The wscanf_s function is equivalent to fwscanf_s with the argument stdin
+    interposed before the arguments to wscanf_s.
+    Returns
+5   The wscanf_s function returns the value of the macro EOF if an input failure occurs
+    before any conversion or if there is a runtime-constraint violation. Otherwise, the
+    wscanf_s 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 634]
+
+    K.3.9.2 General wide string utilities
+    K.3.9.2.1 Wide string copying functions
+    K.3.9.2.1.1 The wcscpy_s function
+    Synopsis
+1           #define __STDC_WANT_LIB_EXT1__ 1
+            #include <wchar.h>
+            errno_t wcscpy_s(wchar_t * restrict s1,
+                 rsize_t s1max,
+                 const wchar_t * restrict s2);
+    Runtime-constraints
+2   Neither s1 nor s2 shall be a null pointer. s1max shall not be greater than RSIZE_MAX.
+    s1max shall not equal zero. s1max shall be greater than wcsnlen_s(s2, s1max).
+    Copying shall not take place between objects that overlap.
+3   If there is a runtime-constraint violation, then if s1 is not a null pointer and s1max is
+    greater than zero and not greater than RSIZE_MAX, then wcscpy_s sets s1[0] to the
+    null wide character.
+    Description
+4   The wcscpy_s function copies the wide string pointed to by s2 (including the
+    terminating null wide character) into the array pointed to by s1.
+5   All elements following the terminating null wide character (if any) written by
+    wcscpy_s in the array of s1max wide characters pointed to by s1 take unspecified
+    values when wcscpy_s returns.428)
+    Returns
+6   The wcscpy_s function returns zero429) if there was no runtime-constraint violation.
+    Otherwise, a nonzero value is returned.
+
+
+
+
+    428) This allows an implementation to copy wide characters from s2 to s1 while simultaneously checking
+         if any of those wide characters are null. Such an approach might write a wide character to every
+         element of s1 before discovering that the first element should be set to the null wide character.
+    429) A zero return value implies that all of the requested wide characters from the string pointed to by s2
+         fit within the array pointed to by s1 and that the result in s1 is null terminated.
+
+[page 635]
+
+     K.3.9.2.1.2 The wcsncpy_s function
+     Synopsis
+7            #define __STDC_WANT_LIB_EXT1__ 1
+             #include <wchar.h>
+             errno_t wcsncpy_s(wchar_t * restrict s1,
+                  rsize_t s1max,
+                  const wchar_t * restrict s2,
+                  rsize_t n);
+     Runtime-constraints
+8    Neither s1 nor s2 shall be a null pointer. Neither s1max nor n shall be greater than
+     RSIZE_MAX. s1max shall not equal zero. If n is not less than s1max, then s1max
+     shall be greater than wcsnlen_s(s2, s1max). Copying shall not take place between
+     objects that overlap.
+9    If there is a runtime-constraint violation, then if s1 is not a null pointer and s1max is
+     greater than zero and not greater than RSIZE_MAX, then wcsncpy_s sets s1[0] to the
+     null wide character.
+     Description
+10   The wcsncpy_s function copies not more than n successive wide characters (wide
+     characters that follow a null wide character are not copied) from the array pointed to by
+     s2 to the array pointed to by s1. If no null wide character was copied from s2, then
+     s1[n] is set to a null wide character.
+11   All elements following the terminating null wide character (if any) written by
+     wcsncpy_s in the array of s1max wide characters pointed to by s1 take unspecified
+     values when wcsncpy_s returns.430)
+     Returns
+12   The wcsncpy_s function returns zero431) if there was no runtime-constraint violation.
+     Otherwise, a nonzero value is returned.
+13   EXAMPLE 1 The wcsncpy_s function can be used to copy a wide string without the danger that the
+     result will not be null terminated or that wide characters will be written past the end of the destination
+     array.
+
+
+
+
+     430) This allows an implementation to copy wide characters from s2 to s1 while simultaneously checking
+          if any of those wide characters are null. Such an approach might write a wide character to every
+          element of s1 before discovering that the first element should be set to the null wide character.
+     431) A zero return value implies that all of the requested wide characters from the string pointed to by s2
+          fit within the array pointed to by s1 and that the result in s1 is null terminated.
+
+[page 636]
+
+             #define __STDC_WANT_LIB_EXT1__ 1
+             #include <wchar.h>
+             /* ... */
+             wchar_t src1[100] = L"hello";
+             wchar_t src2[7] = {L'g', L'o', L'o', L'd', L'b', L'y', L'e'};
+             wchar_t dst1[6], dst2[5], dst3[5];
+             int r1, r2, r3;
+             r1 = wcsncpy_s(dst1, 6, src1, 100);
+             r2 = wcsncpy_s(dst2, 5, src2, 7);
+             r3 = wcsncpy_s(dst3, 5, src2, 4);
+     The first call will assign to r1 the value zero and to dst1 the sequence of wide characters hello\0.
+     The second call will assign to r2 a nonzero value and to dst2 the sequence of wide characters \0.
+     The third call will assign to r3 the value zero and to dst3 the sequence of wide characters good\0.
+
+     K.3.9.2.1.3 The wmemcpy_s function
+     Synopsis
+14           #define __STDC_WANT_LIB_EXT1__ 1
+             #include <wchar.h>
+             errno_t wmemcpy_s(wchar_t * restrict s1,
+                  rsize_t s1max,
+                  const wchar_t * restrict s2,
+                  rsize_t n);
+     Runtime-constraints
+15   Neither s1 nor s2 shall be a null pointer. Neither s1max nor n shall be greater than
+     RSIZE_MAX. n shall not be greater than s1max. Copying shall not take place between
+     objects that overlap.
+16   If there is a runtime-constraint violation, the wmemcpy_s function stores zeros in the
+     first s1max wide characters of the object pointed to by s1 if s1 is not a null pointer and
+     s1max is not greater than RSIZE_MAX.
+     Description
+17   The wmemcpy_s function copies n successive wide characters from the object pointed
+     to by s2 into the object pointed to by s1.
+     Returns
+18   The wmemcpy_s function returns zero if there was no runtime-constraint violation.
+     Otherwise, a nonzero value is returned.
+
+
+
+
+[page 637]
+
+     K.3.9.2.1.4 The wmemmove_s function
+     Synopsis
+19          #define __STDC_WANT_LIB_EXT1__ 1
+            #include <wchar.h>
+            errno_t wmemmove_s(wchar_t *s1, rsize_t s1max,
+                 const wchar_t *s2, rsize_t n);
+     Runtime-constraints
+20   Neither s1 nor s2 shall be a null pointer. Neither s1max nor n shall be greater than
+     RSIZE_MAX. n shall not be greater than s1max.
+21   If there is a runtime-constraint violation, the wmemmove_s function stores zeros in the
+     first s1max wide characters of the object pointed to by s1 if s1 is not a null pointer and
+     s1max is not greater than RSIZE_MAX.
+     Description
+22   The wmemmove_s function copies n successive wide characters from the object pointed
+     to by s2 into the object pointed to by s1. This 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
+23   The wmemmove_s function returns zero if there was no runtime-constraint violation.
+     Otherwise, a nonzero value is returned.
+     K.3.9.2.2 Wide string concatenation functions
+     K.3.9.2.2.1 The wcscat_s function
+     Synopsis
+1           #define __STDC_WANT_LIB_EXT1__ 1
+            #include <wchar.h>
+            errno_t wcscat_s(wchar_t * restrict s1,
+                 rsize_t s1max,
+                 const wchar_t * restrict s2);
+     Runtime-constraints
+2    Let m denote the value s1max - wcsnlen_s(s1, s1max) upon entry to
+     wcscat_s.
+3    Neither s1 nor s2 shall be a null pointer. s1max shall not be greater than RSIZE_MAX.
+     s1max shall not equal zero. m shall not equal zero.432) m shall be greater than
+     wcsnlen_s(s2, m). Copying shall not take place between objects that overlap.
+
+[page 638]
+
+4    If there is a runtime-constraint violation, then if s1 is not a null pointer and s1max is
+     greater than zero and not greater than RSIZE_MAX, then wcscat_s sets s1[0] to the
+     null wide character.
+     Description
+5    The wcscat_s 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 from s2 overwrites the null wide character at the end of s1.
+6    All elements following the terminating null wide character (if any) written by
+     wcscat_s in the array of s1max wide characters pointed to by s1 take unspecified
+     values when wcscat_s returns.433)
+     Returns
+7    The wcscat_s function returns zero434) if there was no runtime-constraint violation.
+     Otherwise, a nonzero value is returned.
+     K.3.9.2.2.2 The wcsncat_s function
+     Synopsis
+8             #define __STDC_WANT_LIB_EXT1__ 1
+              #include <wchar.h>
+              errno_t wcsncat_s(wchar_t * restrict s1,
+                   rsize_t s1max,
+                   const wchar_t * restrict s2,
+                   rsize_t n);
+     Runtime-constraints
+9    Let m denote the value s1max - wcsnlen_s(s1, s1max) upon entry to
+     wcsncat_s.
+10   Neither s1 nor s2 shall be a null pointer. Neither s1max nor n shall be greater than
+     RSIZE_MAX. s1max shall not equal zero. m shall not equal zero.435) If n is not less
+     than m, then m shall be greater than wcsnlen_s(s2, m). Copying shall not take
+     place between objects that overlap.
+
+
+     432) Zero means that s1 was not null terminated upon entry to wcscat_s.
+     433) This allows an implementation to append wide characters from s2 to s1 while simultaneously
+          checking if any of those wide characters are null. Such an approach might write a wide character to
+          every element of s1 before discovering that the first element should be set to the null wide character.
+     434) A zero return value implies that all of the requested wide characters from the wide string pointed to by
+          s2 were appended to the wide string pointed to by s1 and that the result in s1 is null terminated.
+     435) Zero means that s1 was not null terminated upon entry to wcsncat_s.
+
+[page 639]
+
+11   If there is a runtime-constraint violation, then if s1 is not a null pointer and s1max is
+     greater than zero and not greater than RSIZE_MAX, then wcsncat_s sets s1[0] to the
+     null wide character.
+     Description
+12   The wcsncat_s function appends not more than n successive wide characters (wide
+     characters that follow a null wide character are not copied) from the array pointed to by
+     s2 to the end of the wide string pointed to by s1. The initial wide character from s2
+     overwrites the null wide character at the end of s1. If no null wide character was copied
+     from s2, then s1[s1max-m+n] is set to a null wide character.
+13   All elements following the terminating null wide character (if any) written by
+     wcsncat_s in the array of s1max wide characters pointed to by s1 take unspecified
+     values when wcsncat_s returns.436)
+     Returns
+14   The wcsncat_s function returns zero437) if there was no runtime-constraint violation.
+     Otherwise, a nonzero value is returned.
+15   EXAMPLE 1 The wcsncat_s function can be used to copy a wide string without the danger that the
+     result will not be null terminated or that wide characters will be written past the end of the destination
+     array.
+              #define __STDC_WANT_LIB_EXT1__ 1
+              #include <wchar.h>
+              /* ... */
+              wchar_t s1[100] = L"good";
+              wchar_t s2[6] = L"hello";
+              wchar_t s3[6] = L"hello";
+              wchar_t s4[7] = L"abc";
+              wchar_t s5[1000] = L"bye";
+              int r1, r2, r3, r4;
+              r1 = wcsncat_s(s1, 100, s5, 1000);
+              r2 = wcsncat_s(s2, 6, L"", 1);
+              r3 = wcsncat_s(s3, 6, L"X", 2);
+              r4 = wcsncat_s(s4, 7, L"defghijklmn", 3);
+     After the first call r1 will have the value zero and s1 will be the wide character sequence goodbye\0.
+     After the second call r2 will have the value zero and s2 will be the wide character sequence hello\0.
+     After the third call r3 will have a nonzero value and s3 will be the wide character sequence \0.
+     After the fourth call r4 will have the value zero and s4 will be the wide character sequence abcdef\0.
+
+
+
+
+     436) This allows an implementation to append wide characters from s2 to s1 while simultaneously
+          checking if any of those wide characters are null. Such an approach might write a wide character to
+          every element of s1 before discovering that the first element should be set to the null wide character.
+     437) A zero return value implies that all of the requested wide characters from the wide string pointed to by
+          s2 were appended to the wide string pointed to by s1 and that the result in s1 is null terminated.
+
+[page 640]
+
+    K.3.9.2.3 Wide string search functions
+    K.3.9.2.3.1 The wcstok_s function
+    Synopsis
+1           #define __STDC_WANT_LIB_EXT1__ 1
+            #include <wchar.h>
+            wchar_t *wcstok_s(wchar_t * restrict s1,
+                 rsize_t * restrict s1max,
+                 const wchar_t * restrict s2,
+                 wchar_t ** restrict ptr);
+    Runtime-constraints
+2   None of s1max, s2, or ptr shall be a null pointer. If s1 is a null pointer, then *ptr
+    shall not be a null pointer. The value of *s1max shall not be greater than RSIZE_MAX.
+    The end of the token found shall occur within the first *s1max wide characters of s1 for
+    the first call, and shall occur within the first *s1max wide characters of where searching
+    resumes on subsequent calls.
+3   If there is a runtime-constraint violation, the wcstok_s function does not indirect
+    through the s1 or s2 pointers, and does not store a value in the object pointed to by ptr.
+    Description
+4   A sequence of calls to the wcstok_s 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 fourth argument points to a caller-provided wchar_t
+    pointer into which the wcstok_s function stores information necessary for it to
+    continue scanning the same wide string.
+5   The first call in a sequence has a non-null first argument and s1max points to an object
+    whose value is the number of elements in the wide character array pointed to by the first
+    argument. The first call stores an initial value in the object pointed to by ptr and
+    updates the value pointed to by s1max to reflect the number of elements that remain in
+    relation to ptr. Subsequent calls in the sequence have a null first argument and the
+    objects pointed to by s1max and ptr are required to have the values stored by the
+    previous call in the sequence, which are then updated. The separator wide string pointed
+    to by s2 may be different from call to call.
+6   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_s function returns a null pointer. If such a wide character is found, it is
+    the start of the first token.
+
+
+[page 641]
+
+7    The wcstok_s function then searches from there for the first wide character in s1 that
+     is contained in the current separator wide string. If no such wide character is found, the
+     current token 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.
+8    In all cases, the wcstok_s 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
+9    The wcstok_s function returns a pointer to the first wide character of a token, or a null
+     pointer if there is no token or there is a runtime-constraint violation.
+10   EXAMPLE
+            #define __STDC_WANT_LIB_EXT1__ 1
+            #include <wchar.h>
+            static wchar_t str1[] = L"?a???b,,,#c";
+            static wchar_t str2[] = L"\t \t";
+            wchar_t *t, *ptr1, *ptr2;
+            rsize_t max1 = wcslen(str1)+1;
+            rsize_t max2 = wcslen(str2)+1;
+            t   =   wcstok_s(str1,   &max1,   "?", &ptr1);        //   t   points to the token "a"
+            t   =   wcstok_s(NULL,   &max1,   ",", &ptr1);        //   t   points to the token "??b"
+            t   =   wcstok_s(str2,   &max2,   " \t", &ptr2);      //   t   is a null pointer
+            t   =   wcstok_s(NULL,   &max1,   "#,", &ptr1);       //   t   points to the token "c"
+            t   =   wcstok_s(NULL,   &max1,   "?", &ptr1);        //   t   is a null pointer
+
+     K.3.9.2.4 Miscellaneous functions
+     K.3.9.2.4.1 The wcsnlen_s function
+     Synopsis
+1           #define __STDC_WANT_LIB_EXT1__ 1
+            #include <wchar.h>
+            size_t wcsnlen_s(const wchar_t *s, size_t maxsize);
+     Description
+2    The wcsnlen_s function computes the length of the wide string pointed to by s.
+     Returns
+3    If s is a null pointer,438) then the wcsnlen_s function returns zero.
+4    Otherwise, the wcsnlen_s function returns the number of wide characters that precede
+     the terminating null wide character. If there is no null wide character in the first
+     maxsize wide characters of s then wcsnlen_s returns maxsize. At most the first
+
+[page 642]
+
+    maxsize wide characters of s shall be accessed by wcsnlen_s.
+    K.3.9.3 Extended multibyte/wide character conversion utilities
+    K.3.9.3.1 Restartable multibyte/wide character conversion functions
+1   Unlike wcrtomb, wcrtomb_s does not permit the ps parameter (the pointer to the
+    conversion state) to be a null pointer.
+    K.3.9.3.1.1 The wcrtomb_s function
+    Synopsis
+2           #include <wchar.h>
+            errno_t wcrtomb_s(size_t * restrict retval,
+                 char * restrict s, rsize_t smax,
+                 wchar_t wc, mbstate_t * restrict ps);
+    Runtime-constraints
+3   Neither retval nor ps shall be a null pointer. If s is not a null pointer, then smax
+    shall not equal zero and shall not be greater than RSIZE_MAX. If s is not a null pointer,
+    then smax shall be not be less than the number of bytes to be stored in the array pointed
+    to by s. If s is a null pointer, then smax shall equal zero.
+4   If there is a runtime-constraint violation, then wcrtomb_s does the following. If s is
+    not a null pointer and smax is greater than zero and not greater than RSIZE_MAX, then
+    wcrtomb_s sets s[0] to the null character. If retval is not a null pointer, then
+    wcrtomb_s sets *retval to (size_t)(-1).
+    Description
+5   If s is a null pointer, the wcrtomb_s function is equivalent to the call
+                    wcrtomb_s(&retval, buf, sizeof buf, L'\0', ps)
+    where retval and buf are internal variables of the appropriate types, and the size of
+    buf is greater than MB_CUR_MAX.
+6   If s is not a null pointer, the wcrtomb_s 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.
+
+    438) Note that the wcsnlen_s function has no runtime-constraints. This lack of runtime-constraints
+         along with the values returned for a null pointer or an unterminated wide string argument make
+         wcsnlen_s useful in algorithms that gracefully handle such exceptional data.
+
+[page 643]
+
+7   If wc does not correspond to a valid multibyte character, an encoding error occurs: the
+    wcrtomb_s function stores the value (size_t)(-1) into *retval and the
+    conversion state is unspecified. Otherwise, the wcrtomb_s function stores into
+    *retval the number of bytes (including any shift sequences) stored in the array pointed
+    to by s.
+    Returns
+8   The wcrtomb_s function returns zero if no runtime-constraint violation and no
+    encoding error occurred. Otherwise, a nonzero value is returned.
+    K.3.9.3.2 Restartable multibyte/wide string conversion functions
+1   Unlike mbsrtowcs and wcsrtombs, mbsrtowcs_s and wcsrtombs_s do not
+    permit the ps parameter (the pointer to the conversion state) to be a null pointer.
+    K.3.9.3.2.1 The mbsrtowcs_s function
+    Synopsis
+2          #include <wchar.h>
+           errno_t mbsrtowcs_s(size_t * restrict retval,
+                wchar_t * restrict dst, rsize_t dstmax,
+                const char ** restrict src, rsize_t len,
+                mbstate_t * restrict ps);
+    Runtime-constraints
+3   None of retval, src, *src, or ps shall be null pointers. If dst is not a null pointer,
+    then neither len nor dstmax shall be greater than RSIZE_MAX. If dst is a null
+    pointer, then dstmax shall equal zero. If dst is not a null pointer, then dstmax shall
+    not equal zero. If dst is not a null pointer and len is not less than dstmax, then a null
+    character shall occur within the first dstmax multibyte characters of the array pointed to
+    by *src.
+4   If there is a runtime-constraint violation, then mbsrtowcs_s does the following. If
+    retval is not a null pointer, then mbsrtowcs_s sets *retval to (size_t)(-1).
+    If dst is not a null pointer and dstmax is greater than zero and less than RSIZE_MAX,
+    then mbsrtowcs_s sets dst[0] to the null wide character.
+    Description
+5   The mbsrtowcs_s 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
+[page 644]
+
+     characters have been stored into the array pointed to by dst.439) If dst is not a null
+     pointer and no null wide character was stored into the array pointed to by dst, then
+     dst[len] is set to the null wide character. Each conversion takes place as if by a call
+     to the mbrtowc function.
+6    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.
+7    Regardless of whether dst is or is not a null pointer, if the input conversion encounters a
+     sequence of bytes that do not form a valid multibyte character, an encoding error occurs:
+     the mbsrtowcs_s function stores the value (size_t)(-1) into *retval and the
+     conversion state is unspecified. Otherwise, the mbsrtowcs_s function stores into
+     *retval the number of multibyte characters successfully converted, not including the
+     terminating null character (if any).
+8    All elements following the terminating null wide character (if any) written by
+     mbsrtowcs_s in the array of dstmax wide characters pointed to by dst take
+     unspecified values when mbsrtowcs_s returns.440)
+9    If copying takes place between objects that overlap, the objects take on unspecified
+     values.
+     Returns
+10   The mbsrtowcs_s function returns zero if no runtime-constraint violation and no
+     encoding error occurred. Otherwise, a nonzero value is returned.
+     K.3.9.3.2.2 The wcsrtombs_s function
+     Synopsis
+11            #include <wchar.h>
+              errno_t wcsrtombs_s(size_t * restrict retval,
+                   char * restrict dst, rsize_t dstmax,
+                   const wchar_t ** restrict src, rsize_t len,
+                   mbstate_t * restrict ps);
+
+
+
+
+     439) Thus, the value of len is ignored if dst is a null pointer.
+     440) This allows an implementation to attempt converting the multibyte string before discovering a
+          terminating null character did not occur where required.
+
+[page 645]
+
+     Runtime-constraints
+12   None of retval, src, *src, or ps shall be null pointers. If dst is not a null pointer,
+     then neither len nor dstmax shall be greater than RSIZE_MAX. If dst is a null
+     pointer, then dstmax shall equal zero. If dst is not a null pointer, then dstmax shall
+     not equal zero. If dst is not a null pointer and len is not less than dstmax, then the
+     conversion shall have been stopped (see below) because a terminating null wide character
+     was reached or because an encoding error occurred.
+13   If there is a runtime-constraint violation, then wcsrtombs_s does the following. If
+     retval is not a null pointer, then wcsrtombs_s sets *retval to (size_t)(-1).
+     If dst is not a null pointer and dstmax is greater than zero and less than RSIZE_MAX,
+     then wcsrtombs_s sets dst[0] to the null character.
+     Description
+14   The wcsrtombs_s 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;
+     -- (if dst is not a null pointer) when the next multibyte character would exceed the
+         limit of n total bytes to be stored into the array pointed to by dst. If the wide
+         character being converted is the null wide character, then n is the lesser of len or
+         dstmax. Otherwise, n is the lesser of len or dstmax-1.
+     If the conversion stops without converting a null wide character and dst is not a null
+     pointer, then a null character is stored into the array pointed to by dst immediately
+     following any multibyte characters already stored. Each conversion takes place as if by a
+     call to the wcrtomb function.441)
+15   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.
+
+
+     441) 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. However, if
+          the conversion stops before a terminating null wide character has been reached, the result will be null
+          terminated, but might not end in the initial shift state.
+
+[page 646]
+
+16   Regardless of whether dst is or is not a null pointer, if the input conversion encounters a
+     wide character that does not correspond to a valid multibyte character, an encoding error
+     occurs: the wcsrtombs_s function stores the value (size_t)(-1) into *retval
+     and the conversion state is unspecified. Otherwise, the wcsrtombs_s function stores
+     into *retval the number of bytes in the resulting multibyte character sequence, not
+     including the terminating null character (if any).
+17   All elements following the terminating null character (if any) written by wcsrtombs_s
+     in the array of dstmax elements pointed to by dst take unspecified values when
+     wcsrtombs_s returns.442)
+18   If copying takes place between objects that overlap, the objects take on unspecified
+     values.
+     Returns
+19   The wcsrtombs_s function returns zero if no runtime-constraint violation and no
+     encoding error occurred. Otherwise, a nonzero value is returned.
+
+
+
+
+     442) When len is not less than dstmax, the implementation might fill the array before discovering a
+          runtime-constraint violation.
+
+[page 647]
+
+                                                Annex L
+                                               (normative)
+                                            Analyzability
+    L.1 Scope
+1   This annex specifies optional behavior that can aid in the analyzability of C programs.
+2   An implementation that defines __STDC_ANALYZABLE__ shall conform to the
+    specifications in this annex.443)
+    L.2 Definitions
+    L.2.1
+1   out-of-bounds store
+    an (attempted) access (3.1) that, at run time, for a given computational state, would
+    modify (or, for an object declared volatile, fetch) one or more bytes that lie outside
+    the bounds permitted by this Standard.
+    L.2.2
+1   bounded undefined behavior
+    undefined behavior (3.4.3) that does not perform an out-of-bounds store.
+2   NOTE 1    The behavior might perform a trap.
+
+3   NOTE 2    Any values produced or stored might be indeterminate values.
+
+    L.2.3
+1   critical undefined behavior
+    undefined behavior that is not bounded undefined behavior.
+2   NOTE     The behavior might perform an out-of-bounds store or perform a trap.
+
+
+
+
+    443) Implementations that do not define __STDC_ANALYZABLE__ are not required to conform to these
+         specifications.
+
+[page 648]
+
+    L.3 Requirements
+1   If the program performs a trap (3.19.5), the implementation is permitted to invoke a
+    runtime-constraint handler. Any such semantics are implementation-defined.
+2   All undefined behavior shall be limited to bounded undefined behavior, except for the
+    following which are permitted to result in critical undefined behavior:
+    -- An object is referred to outside of its lifetime (6.2.4).
+    -- An lvalue does not designate an object when evaluated (6.3.2.1).
+    -- A pointer is used to call a function whose type is not compatible with the referenced
+      type (6.3.2.3).
+    -- The operand of the unary * operator has an invalid value (6.5.3.2).
+    -- 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 (6.5.6).
+    -- An argument to a library function has an invalid value or a type not expected by a
+      function with variable number of arguments (7.1.4).
+    -- The value of a pointer that refers to space deallocated by a call to the free or realloc
+      function is used (7.22.3).
+    -- A string or wide string utility function is instructed to access an array beyond the end
+      of an object (7.23.1, 7.28.4).
+
+
+
+
+[page 649]
+
+
+                                  Bibliography
+  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&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 9899:1999, Programming languages -- C.
+ 17.   ISO/IEC 9899:1999/Cor.1:2001, Technical Corrigendum 1.
+ 18.   ISO/IEC 9899:1999/Cor.2:2004, Technical Corrigendum 2.
+ 19.   ISO/IEC 9899:1999/Cor.3:2007, Technical Corrigendum 3.
+
+
+
+[page 650]
+
+ 20.    ISO/IEC 9945-2:1993, Information technology -- Portable Operating System
+        Interface (POSIX) -- Part 2: Shell and Utilities.
+ 21.    ISO/IEC TR 10176:1998, Information technology -- Guidelines for the
+        preparation of programming language standards.
+ 22.    ISO/IEC 10646-1:1993, Information technology -- Universal Multiple-Octet
+        Coded Character Set (UCS) -- Part 1: Architecture and Basic Multilingual Plane.
+ 23.    ISO/IEC 10646-1/COR1:1996,         Technical       Corrigendum       1      to
+        ISO/IEC 10646-1:1993.
+ 24.    ISO/IEC 10646-1/COR2:1998,         Technical       Corrigendum       2      to
+        ISO/IEC 10646-1:1993.
+ 25.    ISO/IEC 10646-1/AMD1:1996, Amendment 1 to ISO/IEC 10646-1:1993
+        Transformation Format for 16 planes of group 00 (UTF-16).
+ 26.    ISO/IEC 10646-1/AMD2:1996, Amendment 2 to ISO/IEC 10646-1:1993 UCS
+        Transformation Format 8 (UTF-8).
+ 27.    ISO/IEC 10646-1/AMD3:1996, Amendment 3 to ISO/IEC 10646-1:1993.
+ 28.    ISO/IEC 10646-1/AMD4:1996, Amendment 4 to ISO/IEC 10646-1:1993.
+ 29.    ISO/IEC 10646-1/AMD5:1998, Amendment 5 to ISO/IEC 10646-1:1993 Hangul
+        syllables.
+ 30.    ISO/IEC 10646-1/AMD6:1997,       Amendment     6   to   ISO/IEC 10646-1:1993
+        Tibetan.
+ 31.    ISO/IEC 10646-1/AMD7:1997, Amendment 7 to ISO/IEC 10646-1:1993 33
+        additional characters.
+ 32.    ISO/IEC 10646-1/AMD8:1997, Amendment 8 to ISO/IEC 10646-1:1993.
+ 33.    ISO/IEC 10646-1/AMD9:1997,       Amendment     9   to   ISO/IEC 10646-1:1993
+        Identifiers for characters.
+ 34.    ISO/IEC 10646-1/AMD10:1998, Amendment 10 to ISO/IEC 10646-1:1993
+        Ethiopic.
+ 35.    ISO/IEC 10646-1/AMD11:1998, Amendment 11 to ISO/IEC 10646-1:1993
+        Unified Canadian Aboriginal Syllabics.
+ 36.    ISO/IEC 10646-1/AMD12:1998, Amendment 12 to ISO/IEC 10646-1:1993
+        Cherokee.
+ 37.    ISO/IEC 10967-1:1994, Information technology -- Language independent
+        arithmetic -- Part 1: Integer and floating point arithmetic.
+
+
+[page 651]
+
+ 38.   ISO/IEC TR 19769:2004, Information technology -- Programming languages,
+       their environments and system software interfaces -- Extensions for the
+       programming language C to support new character data types.
+ 39.   ISO/IEC TR 24731-1:2007, Information technology -- Programming languages,
+       their environments and system software interfaces -- Extensions to the C library
+       -- Part 1: Bounds-checking interfaces.
+
+
+
+
+[page 652]
+
+
+Index
+[^ x ^], 3.20                                                    , (comma operator), 5.1.2.4, 6.5.17
+                                                               , (comma punctuator), 6.5.2, 6.7, 6.7.2.1, 6.7.2.2,
+[_ x _], 3.21                                                         6.7.2.3, 6.7.9
+! (logical negation operator), 6.5.3.3                         - (subtraction operator), 6.2.6.2, 6.5.6, F.3, G.5.2
+!= (inequality operator), 6.5.9                                - (unary minus operator), 6.5.3.3, F.3
+# operator, 6.10.3.2                                           -- (postfix decrement operator), 6.3.2.1, 6.5.2.4
+# preprocessing directive, 6.10.7                              -- (prefix decrement operator), 6.3.2.1, 6.5.3.1
+# punctuator, 6.10                                             -= (subtraction assignment operator), 6.5.16.2
+## operator, 6.10.3.3                                          -> (structure/union pointer operator), 6.5.2.3
+#define preprocessing directive, 6.10.3                        . (structure/union member operator), 6.3.2.1,
+#elif preprocessing directive, 6.10.1                               6.5.2.3
+#else preprocessing directive, 6.10.1                          . punctuator, 6.7.9
+#endif preprocessing directive, 6.10.1                         ... (ellipsis punctuator), 6.5.2.2, 6.7.6.3, 6.10.3
+#error preprocessing directive, 4, 6.10.5                      / (division operator), 6.2.6.2, 6.5.5, F.3, G.5.1
+#if preprocessing directive, 5.2.4.2.1, 5.2.4.2.2,             /* */ (comment delimiters), 6.4.9
+     6.10.1, 7.1.4                                             // (comment delimiter), 6.4.9
+#ifdef preprocessing directive, 6.10.1                         /= (division assignment operator), 6.5.16.2
+#ifndef preprocessing directive, 6.10.1                        : (colon punctuator), 6.7.2.1
+#include preprocessing directive, 5.1.1.2,                     :> (alternative spelling of ]), 6.4.6
+     6.10.2                                                    ; (semicolon punctuator), 6.7, 6.7.2.1, 6.8.3,
+#line preprocessing directive, 6.10.4                               6.8.5, 6.8.6
+#pragma preprocessing directive, 6.10.6                        < (less-than operator), 6.5.8
+#undef preprocessing directive, 6.10.3.5, 7.1.3,               <% (alternative spelling of {), 6.4.6
+     7.1.4                                                     <: (alternative spelling of [), 6.4.6
+% (remainder operator), 6.2.6.2, 6.5.5                         << (left-shift operator), 6.2.6.2, 6.5.7
+%: (alternative spelling of #), 6.4.6                          <<= (left-shift assignment operator), 6.5.16.2
+%:%: (alternative spelling of ##), 6.4.6                       <= (less-than-or-equal-to operator), 6.5.8
+%= (remainder assignment operator), 6.5.16.2                   <assert.h> header, 7.2
+%> (alternative spelling of }), 6.4.6                          <complex.h> header, 5.2.4.2.2, 6.10.8.3, 7.1.2,
+& (address operator), 6.3.2.1, 6.5.3.2                              7.3, 7.24, 7.30.1, G.6, J.5.17
+& (bitwise AND operator), 6.2.6.2, 6.5.10                      <ctype.h> header, 7.4, 7.30.2
+&& (logical AND operator), 5.1.2.4, 6.5.13                     <errno.h> header, 7.5, 7.30.3, K.3.2
+&= (bitwise AND assignment operator), 6.5.16.2                 <fenv.h> header, 5.1.2.3, 5.2.4.2.2, 7.6, 7.12, F,
+' ' (space character), 5.1.1.2, 5.2.1, 6.4, 7.4.1.3,                H
+     7.4.1.10, 7.29.2.1.3                                      <float.h> header, 4, 5.2.4.2.2, 7.7, 7.22.1.3,
+( ) (cast operator), 6.5.4                                          7.28.4.1.1
+( ) (function-call operator), 6.5.2.2                          <inttypes.h> header, 7.8, 7.30.4
+( ) (parentheses punctuator), 6.7.6.3, 6.8.4, 6.8.5            <iso646.h> header, 4, 7.9
+( ){ } (compound-literal operator), 6.5.2.5                    <limits.h> header, 4, 5.2.4.2.1, 6.2.5, 7.10
+* (asterisk punctuator), 6.7.6.1, 6.7.6.2                      <locale.h> header, 7.11, 7.30.5
+* (indirection operator), 6.5.2.1, 6.5.3.2                     <math.h> header, 5.2.4.2.2, 6.5, 7.12, 7.24, F,
+* (multiplication operator), 6.2.6.2, 6.5.5, F.3,                   F.10, J.5.17
+     G.5.1                                                     <setjmp.h> header, 7.13
+*= (multiplication assignment operator), 6.5.16.2              <signal.h> header, 7.14, 7.30.6
++ (addition operator), 6.2.6.2, 6.5.2.1, 6.5.3.2,              <stdalign.h> header, 4, 7.15
+     6.5.6, F.3, G.5.2                                         <stdarg.h> header, 4, 6.7.6.3, 7.16
++ (unary plus operator), 6.5.3.3                               <stdatomic.h> header, 6.10.8.3, 7.1.2, 7.17
+++ (postfix increment operator), 6.3.2.1, 6.5.2.4               <stdbool.h> header, 4, 7.18, 7.30.7, H
+++ (prefix increment operator), 6.3.2.1, 6.5.3.1                <stddef.h> header, 4, 6.3.2.1, 6.3.2.3, 6.4.4.4,
++= (addition assignment operator), 6.5.16.2
+[page 653]
+
+     6.4.5, 6.5.3.4, 6.5.6, 7.19, K.3.3                      \x hexadecimal digits (hexadecimal-character
+<stdint.h> header, 4, 5.2.4.2, 6.10.1, 7.8,                       escape sequence), 6.4.4.4
+     7.20, 7.30.8, K.3.3, K.3.4                              ^ (bitwise exclusive OR operator), 6.2.6.2, 6.5.11
+<stdio.h> header, 5.2.4.2.2, 7.21, 7.30.9, F,                ^= (bitwise exclusive OR assignment operator),
+     K.3.5                                                        6.5.16.2
+<stdlib.h> header, 5.2.4.2.2, 7.22, 7.30.10, F,              __alignas_is_defined macro, 7.15
+     K.3.1.4, K.3.6                                          __bool_true_false_are_defined
+<string.h> header, 7.23, 7.30.11, K.3.7                           macro, 7.18
+<tgmath.h> header, 7.24, G.7                                 __cplusplus macro, 6.10.8
+<threads.h> header, 6.10.8.3, 7.1.2, 7.25                    __DATE__ macro, 6.10.8.1
+<time.h> header, 7.26, K.3.8                                 __FILE__ macro, 6.10.8.1, 7.2.1.1
+<uchar.h> header, 6.4.4.4, 6.4.5, 7.27                       __func__ identifier, 6.4.2.2, 7.2.1.1
+<wchar.h> header, 5.2.4.2.2, 7.21.1, 7.28,                   __LINE__ macro, 6.10.8.1, 7.2.1.1
+     7.30.12, F, K.3.9                                       __STDC_, 6.11.9
+<wctype.h> header, 7.29, 7.30.13                             __STDC__ macro, 6.10.8.1
+= (equal-sign punctuator), 6.7, 6.7.2.2, 6.7.9               __STDC_ANALYZABLE__ macro, 6.10.8.3, L.1
+= (simple assignment operator), 6.5.16.1                     __STDC_HOSTED__ macro, 6.10.8.1
+== (equality operator), 6.5.9                                __STDC_IEC_559__ macro, 6.10.8.3, F.1
+> (greater-than operator), 6.5.8                             __STDC_IEC_559_COMPLEX__ macro,
+>= (greater-than-or-equal-to operator), 6.5.8                     6.10.8.3, G.1
+>> (right-shift operator), 6.2.6.2, 6.5.7                    __STDC_ISO_10646__ macro, 6.10.8.2
+>>= (right-shift assignment operator), 6.5.16.2              __STDC_LIB_EXT1__ macro, 6.10.8.3, K.2
+? : (conditional operator), 5.1.2.4, 6.5.15                  __STDC_MB_MIGHT_NEQ_WC__ macro,
+?? (trigraph sequences), 5.2.1.1                                  6.10.8.2, 7.19
+[ ] (array subscript operator), 6.5.2.1, 6.5.3.2             __STDC_NO_COMPLEX__ macro, 6.10.8.3,
+[ ] (brackets punctuator), 6.7.6.2, 6.7.9                         7.3.1
+\ (backslash character), 5.1.1.2, 5.2.1, 6.4.4.4             __STDC_NO_THREADS__ macro, 6.10.8.3,
+\ (escape character), 6.4.4.4                                     7.17.1, 7.25.1
+\" (double-quote escape sequence), 6.4.4.4,                  __STDC_NO_VLA__ macro, 6.10.8.3
+     6.4.5, 6.10.9                                           __STDC_UTF_16__ macro, 6.10.8.2
+\\ (backslash escape sequence), 6.4.4.4, 6.10.9              __STDC_UTF_32__ macro, 6.10.8.2
+\' (single-quote escape sequence), 6.4.4.4, 6.4.5            __STDC_VERSION__ macro, 6.10.8.1
+\0 (null character), 5.2.1, 6.4.4.4, 6.4.5                   __STDC_WANT_LIB_EXT1__ macro, K.3.1.1
+  padding of binary stream, 7.21.2                           __TIME__ macro, 6.10.8.1
+\? (question-mark escape sequence), 6.4.4.4                  __VA_ARGS__ identifier, 6.10.3, 6.10.3.1
+\a (alert escape sequence), 5.2.2, 6.4.4.4                   _Alignas, 6.7.5
+\b (backspace escape sequence), 5.2.2, 6.4.4.4               _Atomic type qualifier, 6.7.3
+\f (form-feed escape sequence), 5.2.2, 6.4.4.4,              _Bool type, 6.2.5, 6.3.1.1, 6.3.1.2, 6.7.2, 7.17.1,
+     7.4.1.10                                                     F.4
+\n (new-line escape sequence), 5.2.2, 6.4.4.4,               _Bool type conversions, 6.3.1.2
+     7.4.1.10                                                _Complex types, 6.2.5, 6.7.2, 7.3.1, G
+\octal digits (octal-character escape sequence),             _Complex_I macro, 7.3.1
+     6.4.4.4                                                 _Exit function, 7.22.4.5, 7.22.4.7
+\r (carriage-return escape sequence), 5.2.2,                 _Imaginary keyword, G.2
+     6.4.4.4, 7.4.1.10                                       _Imaginary types, 7.3.1, G
+\t (horizontal-tab escape sequence), 5.2.2,                  _Imaginary_I macro, 7.3.1, G.6
+     6.4.4.4, 7.4.1.3, 7.4.1.10, 7.29.2.1.3                  _IOFBF macro, 7.21.1, 7.21.5.5, 7.21.5.6
+\U (universal character names), 6.4.3                        _IOLBF macro, 7.21.1, 7.21.5.6
+\u (universal character names), 6.4.3                        _IONBF macro, 7.21.1, 7.21.5.5, 7.21.5.6
+\v (vertical-tab escape sequence), 5.2.2, 6.4.4.4,           _Noreturn, 6.7.4
+     7.4.1.10                                                _Pragma operator, 5.1.1.2, 6.10.9
+
+[page 654]
+
+_Static_assert, 6.7.10, 7.2                                  allocated storage, order and contiguity, 7.22.3
+_Thread_local storage-class specifier, 6.2.4,                 and macro, 7.9
+     6.7.1                                                   AND operators
+{ } (braces punctuator), 6.7.2.2, 6.7.2.3, 6.7.9,               bitwise (&), 6.2.6.2, 6.5.10
+     6.8.2                                                      bitwise assignment (&=), 6.5.16.2
+{ } (compound-literal operator), 6.5.2.5                        logical (&&), 5.1.2.4, 6.5.13
+| (bitwise inclusive OR operator), 6.2.6.2, 6.5.12           and_eq macro, 7.9
+|= (bitwise inclusive OR assignment operator),               anonymous structure, 6.7.2.1
+     6.5.16.2                                                anonymous union, 6.7.2.1
+|| (logical OR operator), 5.1.2.4, 6.5.14                    ANSI/IEEE 754, F.1
+~ (bitwise complement operator), 6.2.6.2, 6.5.3.3            ANSI/IEEE 854, F.1
+                                                             argc (main function parameter), 5.1.2.2.1
+abort function, 7.2.1.1, 7.14.1.1, 7.21.3,                   argument, 3.3
+      7.22.4.1, 7.25.3.6, K.3.6.1.2                             array, 6.9.1
+abort_handler_s function, K.3.6.1.2                             default promotions, 6.5.2.2
+abs function, 7.22.6.1                                          function, 6.5.2.2, 6.9.1
+absolute-value functions                                        macro, substitution, 6.10.3.1
+   complex, 7.3.8, G.6.4                                     argument, complex, 7.3.9.1
+   integer, 7.8.2.1, 7.22.6.1                                argv (main function parameter), 5.1.2.2.1
+   real, 7.12.7, F.10.4                                      arithmetic constant expression, 6.6
+abstract declarator, 6.7.7                                   arithmetic conversions, usual, see usual arithmetic
+abstract machine, 5.1.2.3                                          conversions
+access, 3.1, 6.7.3, L.2.1                                    arithmetic operators
+accuracy, see floating-point accuracy                            additive, 6.2.6.2, 6.5.6, G.5.2
+acos functions, 7.12.4.1, F.10.1.1                              bitwise, 6.2.6.2, 6.5.3.3, 6.5.10, 6.5.11, 6.5.12
+acos type-generic macro, 7.24                                   increment and decrement, 6.5.2.4, 6.5.3.1
+acosh functions, 7.12.5.1, F.10.2.1                             multiplicative, 6.2.6.2, 6.5.5, G.5.1
+acosh type-generic macro, 7.24                                  shift, 6.2.6.2, 6.5.7
+acquire fence, 7.17.4                                           unary, 6.5.3.3
+acquire operation, 5.1.2.4                                   arithmetic types, 6.2.5
+active position, 5.2.2                                       arithmetic, pointer, 6.5.6
+actual argument, 3.3                                         array
+actual parameter (deprecated), 3.3                              argument, 6.9.1
+addition assignment operator (+=), 6.5.16.2                     declarator, 6.7.6.2
+addition operator (+), 6.2.6.2, 6.5.2.1, 6.5.3.2,               initialization, 6.7.9
+      6.5.6, F.3, G.5.2                                         multidimensional, 6.5.2.1
+additive expressions, 6.5.6, G.5.2                              parameter, 6.9.1
+address constant, 6.6                                           storage order, 6.5.2.1
+address operator (&), 6.3.2.1, 6.5.3.2                          subscript operator ([ ]), 6.5.2.1, 6.5.3.2
+address-free, 7.17.5                                            subscripting, 6.5.2.1
+aggregate initialization, 6.7.9                                 type, 6.2.5
+aggregate types, 6.2.5                                          type conversion, 6.3.2.1
+alert escape sequence (\a), 5.2.2, 6.4.4.4                      variable length, 6.7.6, 6.7.6.2, 6.10.8.3
+aliasing, 6.5                                                arrow operator (->), 6.5.2.3
+alignas macro, 7.15                                          as-if rule, 5.1.2.3
+aligned_alloc function, 7.22.3, 7.22.3.1                     ASCII code set, 5.2.1.1
+alignment, 3.2, 6.2.8, 7.22.3.1                              asctime function, 7.26.3.1
+   pointer, 6.2.5, 6.3.2.3                                   asctime_s function, K.3.8.2, K.3.8.2.1
+   structure/union member, 6.7.2.1                           asin functions, 7.12.4.2, F.10.1.2
+alignment specifier, 6.7.5                                    asin type-generic macro, 7.24, G.7
+alignof operator, 6.5.3, 6.5.3.4                             asinh functions, 7.12.5.2, F.10.2.2
+
+[page 655]
+
+asinh type-generic macro, 7.24, G.7                           atomic_is_lock_free generic function,
+asm keyword, J.5.10                                               7.17.5.1
+assert macro, 7.2.1.1                                         ATOMIC_LLONG_LOCK_FREE macro, 7.17.1
+assert.h header, 7.2                                          atomic_load generic functions, 7.17.7.2
+assignment                                                    ATOMIC_LONG_LOCK_FREE macro, 7.17.1
+   compound, 6.5.16.2                                         ATOMIC_SHORT_LOCK_FREE macro, 7.17.1
+   conversion, 6.5.16.1                                       atomic_signal_fence function, 7.17.4.2
+   expression, 6.5.16                                         atomic_store generic functions, 7.17.7.1
+   operators, 6.3.2.1, 6.5.16                                 atomic_thread_fence function, 7.17.4.1
+   simple, 6.5.16.1                                           ATOMIC_VAR_INIT macro, 7.17.2.1
+associativity of operators, 6.5                               ATOMIC_WCHAR_T_LOCK_FREE macro, 7.17.1
+asterisk punctuator (*), 6.7.6.1, 6.7.6.2                     atomics header, 7.17
+at_quick_exit function, 7.22.4.2, 7.22.4.3,                   auto storage-class specifier, 6.7.1, 6.9
+     7.22.4.4, 7.22.4.5, 7.22.4.7                             automatic storage duration, 5.2.3, 6.2.4
+atan functions, 7.12.4.3, F.10.1.3
+atan type-generic macro, 7.24, G.7                            backslash character (\), 5.1.1.2, 5.2.1, 6.4.4.4
+atan2 functions, 7.12.4.4, F.10.1.4                           backslash escape sequence (\\), 6.4.4.4, 6.10.9
+atan2 type-generic macro, 7.24                                backspace escape sequence (\b), 5.2.2, 6.4.4.4
+atanh functions, 7.12.5.3, F.10.2.3                           basic character set, 3.6, 3.7.2, 5.2.1
+atanh type-generic macro, 7.24, G.7                           basic types, 6.2.5
+atexit function, 7.22.4.2, 7.22.4.3, 7.22.4.4,                behavior, 3.4
+     7.22.4.5, 7.22.4.7, J.5.13                               binary streams, 7.21.2, 7.21.7.10, 7.21.9.2,
+atof function, 7.22.1, 7.22.1.1                                     7.21.9.4
+atoi function, 7.22.1, 7.22.1.2                               bit, 3.5
+atol function, 7.22.1, 7.22.1.2                                  high order, 3.6
+atoll function, 7.22.1, 7.22.1.2                                 low order, 3.6
+atomic lock-free macros, 7.17.1, 7.17.5                       bit-field, 6.7.2.1
+atomic operations, 5.1.2.4                                    bitand macro, 7.9
+atomic types, 5.1.2.3, 6.2.5, 6.2.6.1, 6.3.2.1,               bitor macro, 7.9
+     6.5.2.3, 6.5.2.4, 6.5.16.2, 6.7.2.4, 6.10.8.3,           bitwise operators, 6.5
+     7.17.6                                                      AND, 6.2.6.2, 6.5.10
+atomic_address type, 7.17.1, 7.17.6                              AND assignment (&=), 6.5.16.2
+ATOMIC_ADDRESS_LOCK_FREE macro, 7.17.1                           complement (~), 6.2.6.2, 6.5.3.3
+atomic_bool type, 7.17.1, 7.17.6                                 exclusive OR, 6.2.6.2, 6.5.11
+ATOMIC_CHAR16_T_LOCK_FREE macro,                                 exclusive OR assignment (^=), 6.5.16.2
+     7.17.1                                                      inclusive OR, 6.2.6.2, 6.5.12
+ATOMIC_CHAR32_T_LOCK_FREE macro,                                 inclusive OR assignment (|=), 6.5.16.2
+     7.17.1                                                      shift, 6.2.6.2, 6.5.7
+ATOMIC_CHAR_LOCK_FREE macro, 7.17.1                           blank character, 7.4.1.3
+atomic_compare_exchange generic                               block, 6.8, 6.8.2, 6.8.4, 6.8.5
+     functions, 7.17.7.4                                      block scope, 6.2.1
+atomic_exchange generic functions, 7.17.7.3                   block structure, 6.2.1
+atomic_fetch and modify generic functions,                    bold type convention, 6.1
+     7.17.7.5                                                 bool macro, 7.18
+atomic_flag type, 7.17.1, 7.17.8                              boolean type, 6.3.1.2
+atomic_flag_clear functions, 7.17.8.2                         boolean type conversion, 6.3.1.1, 6.3.1.2
+ATOMIC_FLAG_INIT macro, 7.17.1, 7.17.8                        bounded undefined behavior, L.2.2
+atomic_flag_test_and_set functions,                           braces punctuator ({ }), 6.7.2.2, 6.7.2.3, 6.7.9,
+     7.17.8.1                                                       6.8.2
+atomic_init generic function, 7.17.2.2                        brackets operator ([ ]), 6.5.2.1, 6.5.3.2
+ATOMIC_INT_LOCK_FREE macro, 7.17.1                            brackets punctuator ([ ]), 6.7.6.2, 6.7.9
+
+[page 656]
+
+branch cuts, 7.3.3                                                type-generic macro for, 7.24
+break statement, 6.8.6.3                                       ccosh functions, 7.3.6.4, G.6.2.4
+broken-down time, 7.26.1, 7.26.2.3, 7.26.3,                       type-generic macro for, 7.24
+     7.26.3.1, 7.26.3.3, 7.26.3.4, 7.26.3.5,                   ceil functions, 7.12.9.1, F.10.6.1
+     K.3.8.2.1, K.3.8.2.3, K.3.8.2.4                           ceil type-generic macro, 7.24
+bsearch function, 7.22.5, 7.22.5.1                             cerf function, 7.30.1
+bsearch_s function, K.3.6.3, K.3.6.3.1                         cerfc function, 7.30.1
+btowc function, 7.28.6.1.1                                     cexp functions, 7.3.7.1, G.6.3.1
+BUFSIZ macro, 7.21.1, 7.21.2, 7.21.5.5                            type-generic macro for, 7.24
+byte, 3.6, 6.5.3.4                                             cexp2 function, 7.30.1
+byte input/output functions, 7.21.1                            cexpm1 function, 7.30.1
+byte-oriented stream, 7.21.2                                   char type, 6.2.5, 6.3.1.1, 6.7.2, K.3.5.3.2,
+                                                                     K.3.9.1.2
+C program, 5.1.1.1                                             char type conversion, 6.3.1.1, 6.3.1.3, 6.3.1.4,
+c16rtomb function, 7.27.1.2                                          6.3.1.8
+c32rtomb function, 7.27.1.4                                    char16_t type, 6.4.4.4, 6.4.5, 6.10.8.2, 7.27
+cabs functions, 7.3.8.1, G.6                                   char32_t type, 6.4.4.4, 6.4.5, 6.10.8.2, 7.27
+  type-generic macro for, 7.24                                 CHAR_BIT macro, 5.2.4.2.1, 6.7.2.1
+cacos functions, 7.3.5.1, G.6.1.1                              CHAR_MAX macro, 5.2.4.2.1, 7.11.2.1
+  type-generic macro for, 7.24                                 CHAR_MIN macro, 5.2.4.2.1
+cacosh functions, 7.3.6.1, G.6.2.1                             character, 3.7, 3.7.1
+  type-generic macro for, 7.24                                 character array initialization, 6.7.9
+calendar time, 7.26.1, 7.26.2.2, 7.26.2.3, 7.26.2.4,           character case mapping functions, 7.4.2
+      7.26.3.2, 7.26.3.3, 7.26.3.4, K.3.8.2.2,                    wide character, 7.29.3.1
+      K.3.8.2.3, K.3.8.2.4                                           extensible, 7.29.3.2
+call by value, 6.5.2.2                                         character classification functions, 7.4.1
+call_once function, 7.25.1, 7.25.2.1                              wide character, 7.29.2.1
+calloc function, 7.22.3, 7.22.3.2                                    extensible, 7.29.2.2
+carg functions, 7.3.9.1, G.6                                   character constant, 5.1.1.2, 5.2.1, 6.4.4.4
+carg type-generic macro, 7.24, G.7                             character display semantics, 5.2.2
+carriage-return escape sequence (\r), 5.2.2,                   character handling header, 7.4, 7.11.1.1
+      6.4.4.4, 7.4.1.10                                        character input/output functions, 7.21.7, K.3.5.4
+carries a dependency, 5.1.2.4                                     wide character, 7.28.3
+case label, 6.8.1, 6.8.4.2                                     character sets, 5.2.1
+case mapping functions                                         character string literal, see string literal
+  character, 7.4.2                                             character type conversion, 6.3.1.1
+  wide character, 7.29.3.1                                     character types, 6.2.5, 6.7.9
+      extensible, 7.29.3.2                                     cimag functions, 7.3.9.2, 7.3.9.5, G.6
+casin functions, 7.3.5.2, G.6                                  cimag type-generic macro, 7.24, G.7
+  type-generic macro for, 7.24                                 cis function, G.6
+casinh functions, 7.3.6.2, G.6.2.2                             classification functions
+  type-generic macro for, 7.24                                    character, 7.4.1
+cast expression, 6.5.4                                            floating-point, 7.12.3
+cast operator (( )), 6.5.4                                        wide character, 7.29.2.1
+catan functions, 7.3.5.3, G.6                                        extensible, 7.29.2.2
+  type-generic macro for, 7.24                                 clearerr function, 7.21.10.1
+catanh functions, 7.3.6.3, G.6.2.3                             clgamma function, 7.30.1
+  type-generic macro for, 7.24                                 clock function, 7.26.2.1
+cbrt functions, 7.12.7.1, F.10.4.1                             clock_t type, 7.26.1, 7.26.2.1
+cbrt type-generic macro, 7.24                                  CLOCKS_PER_SEC macro, 7.26.1, 7.26.2.1
+ccos functions, 7.3.5.4, G.6                                   clog functions, 7.3.7.2, G.6.3.2
+
+[page 657]
+
+  type-generic macro for, 7.24                                  string, 7.23.3, K.3.7.2
+clog10 function, 7.30.1                                         wide string, 7.28.4.3, K.3.9.2.2
+clog1p function, 7.30.1                                       concatenation, preprocessing, see preprocessing
+clog2 function, 7.30.1                                             concatenation
+CMPLX macros, 7.3.9.3                                         conceptual models, 5.1
+cnd_broadcast function, 7.25.3.1, 7.25.3.5,                   conditional features, 4, 6.2.5, 6.7.6.2, 6.10.8.3,
+     7.25.3.6                                                      7.1.2, F.1, G.1, K.2, L.1
+cnd_destroy function, 7.25.3.2                                conditional inclusion, 6.10.1
+cnd_init function, 7.25.3.3                                   conditional operator (? :), 5.1.2.4, 6.5.15
+cnd_signal function, 7.25.3.4, 7.25.3.5,                      conflict, 5.1.2.4
+     7.25.3.6                                                 conformance, 4
+cnd_t type, 7.25.1                                            conj functions, 7.3.9.4, G.6
+cnd_timedwait function, 7.25.3.5                              conj type-generic macro, 7.24
+cnd_wait function, 7.25.3.3, 7.25.3.6                         const type qualifier, 6.7.3
+collating sequences, 5.2.1                                    const-qualified type, 6.2.5, 6.3.2.1, 6.7.3
+colon punctuator (:), 6.7.2.1                                 constant expression, 6.6, F.8.4
+comma operator (,), 5.1.2.4, 6.5.17                           constants, 6.4.4
+comma punctuator (,), 6.5.2, 6.7, 6.7.2.1, 6.7.2.2,             as primary expression, 6.5.1
+     6.7.2.3, 6.7.9                                             character, 6.4.4.4
+command processor, 7.22.4.8                                     enumeration, 6.2.1, 6.4.4.3
+comment delimiters (/* */ and //), 6.4.9                        floating, 6.4.4.2
+comments, 5.1.1.2, 6.4, 6.4.9                                   hexadecimal, 6.4.4.1
+common extensions, J.5                                          integer, 6.4.4.1
+common initial sequence, 6.5.2.3                                octal, 6.4.4.1
+common real type, 6.3.1.8                                     constraint, 3.8, 4
+common warnings, I                                            constraint_handler_t type, K.3.6
+comparison functions, 7.22.5, 7.22.5.1, 7.22.5.2,             consume operation, 5.1.2.4
+     K.3.6.3, K.3.6.3.1, K.3.6.3.2                            content of structure/union/enumeration, 6.7.2.3
+  string, 7.23.4                                              contiguity of allocated storage, 7.22.3
+  wide string, 7.28.4.4                                       continue statement, 6.8.6.2
+comparison macros, 7.12.14                                    contracted expression, 6.5, 7.12.2, F.7
+comparison, pointer, 6.5.8                                    control character, 5.2.1, 7.4
+compatible type, 6.2.7, 6.7.2, 6.7.3, 6.7.6                   control wide character, 7.29.2
+compl macro, 7.9                                              conversion, 6.3
+complement operator (~), 6.2.6.2, 6.5.3.3                       arithmetic operands, 6.3.1
+complete type, 6.2.5                                            array argument, 6.9.1
+complex macro, 7.3.1                                            array parameter, 6.9.1
+complex numbers, 6.2.5, G                                       arrays, 6.3.2.1
+complex type conversion, 6.3.1.6, 6.3.1.7                       boolean, 6.3.1.2
+complex type domain, 6.2.5                                      boolean, characters, and integers, 6.3.1.1
+complex types, 6.2.5, 6.7.2, 6.10.8.3, G                        by assignment, 6.5.16.1
+complex.h header, 5.2.4.2.2, 6.10.8.3, 7.1.2,                   by return statement, 6.8.6.4
+     7.3, 7.24, 7.30.1, G.6, J.5.17                             complex types, 6.3.1.6
+compliance, see conformance                                     explicit, 6.3
+components of time, 7.26.1, K.3.8.1                             function, 6.3.2.1
+composite type, 6.2.7                                           function argument, 6.5.2.2, 6.9.1
+compound assignment, 6.5.16.2                                   function designators, 6.3.2.1
+compound literals, 6.5.2.5                                      function parameter, 6.9.1
+compound statement, 6.8.2                                       imaginary, G.4.1
+compound-literal operator (( ){ }), 6.5.2.5                     imaginary and complex, G.4.3
+concatenation functions                                         implicit, 6.3
+
+[page 658]
+
+   lvalues, 6.3.2.1                                             csinh functions, 7.3.6.5, G.6.2.5
+   pointer, 6.3.2.1, 6.3.2.3                                      type-generic macro for, 7.24
+   real and complex, 6.3.1.7                                    csqrt functions, 7.3.8.3, G.6.4.2
+   real and imaginary, G.4.2                                      type-generic macro for, 7.24
+   real floating and integer, 6.3.1.4, F.3, F.4                  ctan functions, 7.3.5.6, G.6
+   real floating types, 6.3.1.5, F.3                               type-generic macro for, 7.24
+   signed and unsigned integers, 6.3.1.3                        ctanh functions, 7.3.6.6, G.6.2.6
+   usual arithmetic, see usual arithmetic                         type-generic macro for, 7.24
+         conversions                                            ctgamma function, 7.30.1
+   void type, 6.3.2.2                                           ctime function, 7.26.3.2
+conversion functions                                            ctime_s function, K.3.8.2, K.3.8.2.2
+   multibyte/wide character, 7.22.7, K.3.6.4                    ctype.h header, 7.4, 7.30.2
+      extended, 7.28.6, K.3.9.3                                 current object, 6.7.9
+      restartable, 7.27.1, 7.28.6.3, K.3.9.3.1                  CX_LIMITED_RANGE pragma, 6.10.6, 7.3.4
+   multibyte/wide string, 7.22.8, K.3.6.5
+      restartable, 7.28.6.4, K.3.9.3.2                          data race, 5.1.2.4, 7.1.4, 7.22.2.1, 7.22.4.6,
+   numeric, 7.8.2.3, 7.22.1                                          7.23.5.8, 7.23.6.2, 7.26.3, 7.27.1, 7.28.6.3,
+      wide string, 7.8.2.4, 7.28.4.1                                 7.28.6.4
+   single byte/wide character, 7.28.6.1                         data stream, see streams
+   time, 7.26.3, K.3.8.2                                        date and time header, 7.26, K.3.8
+      wide character, 7.28.5                                    Daylight Saving Time, 7.26.1
+conversion specifier, 7.21.6.1, 7.21.6.2, 7.28.2.1,              DBL_DECIMAL_DIG macro, 5.2.4.2.2
+      7.28.2.2                                                  DBL_DIG macro, 5.2.4.2.2
+conversion state, 7.22.7, 7.27.1, 7.27.1.1,                     DBL_EPSILON macro, 5.2.4.2.2
+      7.27.1.2, 7.27.1.3, 7.27.1.4, 7.28.6,                     DBL_HAS_SUBNORM macro, 5.2.4.2.2
+      7.28.6.2.1, 7.28.6.3, 7.28.6.3.2, 7.28.6.3.3,             DBL_MANT_DIG macro, 5.2.4.2.2
+      7.28.6.4, 7.28.6.4.1, 7.28.6.4.2, K.3.6.4,                DBL_MAX macro, 5.2.4.2.2
+      K.3.9.3.1, K.3.9.3.1.1, K.3.9.3.2, K.3.9.3.2.1,           DBL_MAX_10_EXP macro, 5.2.4.2.2
+      K.3.9.3.2.2                                               DBL_MAX_EXP macro, 5.2.4.2.2
+conversion state functions, 7.28.6.2                            DBL_MIN macro, 5.2.4.2.2
+copying functions                                               DBL_MIN_10_EXP macro, 5.2.4.2.2
+   string, 7.23.2, K.3.7.1                                      DBL_MIN_EXP macro, 5.2.4.2.2
+   wide string, 7.28.4.2, K.3.9.2.1                             DBL_TRUE_MIN macro, 5.2.4.2.2
+copysign functions, 7.3.9.5, 7.12.11.1, F.3,                    decimal constant, 6.4.4.1
+      F.10.8.1                                                  decimal digit, 5.2.1
+copysign type-generic macro, 7.24                               decimal-point character, 7.1.1, 7.11.2.1
+correctly rounded result, 3.9                                   DECIMAL_DIG macro, 5.2.4.2.2, 7.21.6.1,
+corresponding real type, 6.2.5                                       7.22.1.3, 7.28.2.1, 7.28.4.1.1, F.5
+cos functions, 7.12.4.5, F.10.1.5                               declaration specifiers, 6.7
+cos type-generic macro, 7.24, G.7                               declarations, 6.7
+cosh functions, 7.12.5.4, F.10.2.4                                function, 6.7.6.3
+cosh type-generic macro, 7.24, G.7                                pointer, 6.7.6.1
+cpow functions, 7.3.8.2, G.6.4.1                                  structure/union, 6.7.2.1
+   type-generic macro for, 7.24                                   typedef, 6.7.8
+cproj functions, 7.3.9.5, G.6                                   declarator, 6.7.6
+cproj type-generic macro, 7.24                                    abstract, 6.7.7
+creal functions, 7.3.9.6, G.6                                   declarator type derivation, 6.2.5, 6.7.6
+creal type-generic macro, 7.24, G.7                             decrement operators, see arithmetic operators,
+critical undefined behavior, L.2.3                                    increment and decrement
+csin functions, 7.3.5.5, G.6                                    default argument promotions, 6.5.2.2
+   type-generic macro for, 7.24                                 default initialization, 6.7.9
+
+[page 659]
+
+default label, 6.8.1, 6.8.4.2                                  elif preprocessing directive, 6.10.1
+define preprocessing directive, 6.10.3                         ellipsis punctuator (...), 6.5.2.2, 6.7.6.3, 6.10.3
+defined operator, 6.10.1, 6.10.8                               else preprocessing directive, 6.10.1
+definition, 6.7                                                 else statement, 6.8.4.1
+   function, 6.9.1                                             empty statement, 6.8.3
+dependency-ordered before, 5.1.2.4                             encoding error, 7.21.3, 7.27.1.1, 7.27.1.2,
+derived declarator types, 6.2.5                                      7.27.1.3, 7.27.1.4, 7.28.3.1, 7.28.3.3,
+derived types, 6.2.5                                                 7.28.6.3.2, 7.28.6.3.3, 7.28.6.4.1, 7.28.6.4.2,
+designated initializer, 6.7.9                                        K.3.6.5.1, K.3.6.5.2, K.3.9.3.1.1, K.3.9.3.2.1,
+destringizing, 6.10.9                                                K.3.9.3.2.2
+device input/output, 5.1.2.3                                   end-of-file, 7.28.1
+diagnostic message, 3.10, 5.1.1.3                              end-of-file indicator, 7.21.1, 7.21.5.3, 7.21.7.1,
+diagnostics, 5.1.1.3                                                 7.21.7.5, 7.21.7.6, 7.21.7.10, 7.21.9.2,
+diagnostics header, 7.2                                              7.21.9.3, 7.21.10.1, 7.21.10.2, 7.28.3.1,
+difftime function, 7.26.2.2                                          7.28.3.10
+digit, 5.2.1, 7.4                                              end-of-file macro, see EOF macro
+digraphs, 6.4.6                                                end-of-line indicator, 5.2.1
+direct input/output functions, 7.21.8                          endif preprocessing directive, 6.10.1
+display device, 5.2.2                                          enum type, 6.2.5, 6.7.2, 6.7.2.2
+div function, 7.22.6.2                                         enumerated type, 6.2.5
+div_t type, 7.22                                               enumeration, 6.2.5, 6.7.2.2
+division assignment operator (/=), 6.5.16.2                    enumeration constant, 6.2.1, 6.4.4.3
+division operator (/), 6.2.6.2, 6.5.5, F.3, G.5.1              enumeration content, 6.7.2.3
+do statement, 6.8.5.2                                          enumeration members, 6.7.2.2
+documentation of implementation, 4                             enumeration specifiers, 6.7.2.2
+domain error, 7.12.1, 7.12.4.1, 7.12.4.2, 7.12.4.4,            enumeration tag, 6.2.3, 6.7.2.3
+      7.12.5.1, 7.12.5.3, 7.12.6.5, 7.12.6.7,                  enumerator, 6.7.2.2
+      7.12.6.8, 7.12.6.9, 7.12.6.10, 7.12.6.11,                environment, 5
+      7.12.7.4, 7.12.7.5, 7.12.8.4, 7.12.9.5,                  environment functions, 7.22.4, K.3.6.2
+      7.12.9.7, 7.12.10.1, 7.12.10.2, 7.12.10.3                environment list, 7.22.4.6, K.3.6.2.1
+dot operator (.), 6.5.2.3                                      environmental considerations, 5.2
+double _Complex type, 6.2.5                                    environmental limits, 5.2.4, 7.13.1.1, 7.21.2,
+double _Complex type conversion, 6.3.1.6,                            7.21.3, 7.21.4.4, 7.21.6.1, 7.22.2.1, 7.22.4.2,
+      6.3.1.7, 6.3.1.8                                               7.22.4.3, 7.28.2.1, K.3.5.1.2
+double _Imaginary type, G.2                                    EOF macro, 7.4, 7.21.1, 7.21.5.1, 7.21.5.2,
+double type, 6.2.5, 6.4.4.2, 6.7.2, 7.21.6.2,                        7.21.6.2, 7.21.6.7, 7.21.6.9, 7.21.6.11,
+      7.28.2.2, F.2                                                  7.21.6.14, 7.21.7.1, 7.21.7.3, 7.21.7.4,
+double type conversion, 6.3.1.4, 6.3.1.5, 6.3.1.7,                   7.21.7.5, 7.21.7.6, 7.21.7.8, 7.21.7.9,
+      6.3.1.8                                                        7.21.7.10, 7.28.1, 7.28.2.2, 7.28.2.4,
+double-precision arithmetic, 5.1.2.3                                 7.28.2.6, 7.28.2.8, 7.28.2.10, 7.28.2.12,
+double-quote escape sequence (\"), 6.4.4.4,                          7.28.3.4, 7.28.6.1.1, 7.28.6.1.2, K.3.5.3.7,
+      6.4.5, 6.10.9                                                  K.3.5.3.9, K.3.5.3.11, K.3.5.3.14, K.3.9.1.2,
+double_t type, 7.12, J.5.6                                           K.3.9.1.5, K.3.9.1.7, K.3.9.1.10, K.3.9.1.12,
+                                                                     K.3.9.1.14
+EDOM macro, 7.5, 7.12.1, see also domain error                 equal-sign punctuator (=), 6.7, 6.7.2.2, 6.7.9
+effective type, 6.5                                            equal-to operator, see equality operator
+EILSEQ macro, 7.5, 7.21.3, 7.27.1.1, 7.27.1.2,                 equality expressions, 6.5.9
+     7.27.1.3, 7.27.1.4, 7.28.3.1, 7.28.3.3,                   equality operator (==), 6.5.9
+     7.28.6.3.2, 7.28.6.3.3, 7.28.6.4.1, 7.28.6.4.2,           ERANGE macro, 7.5, 7.8.2.3, 7.8.2.4, 7.12.1,
+     see also encoding error                                         7.22.1.3, 7.22.1.4, 7.28.4.1.1, 7.28.4.1.2, see
+element type, 6.2.5                                                  also range error, pole error
+
+[page 660]
+
+erf functions, 7.12.8.1, F.10.5.1                               exp2 functions, 7.12.6.2, F.10.3.2
+erf type-generic macro, 7.24                                    exp2 type-generic macro, 7.24
+erfc functions, 7.12.8.2, F.10.5.2                              explicit conversion, 6.3
+erfc type-generic macro, 7.24                                   expm1 functions, 7.12.6.3, F.10.3.3
+errno macro, 7.1.3, 7.3.2, 7.5, 7.8.2.3, 7.8.2.4,               expm1 type-generic macro, 7.24
+      7.12.1, 7.14.1.1, 7.21.3, 7.21.9.3, 7.21.10.4,            exponent part, 6.4.4.2
+      7.22.1, 7.22.1.3, 7.22.1.4, 7.23.6.2, 7.27.1.1,           exponential functions
+      7.27.1.2, 7.27.1.3, 7.27.1.4, 7.28.3.1,                     complex, 7.3.7, G.6.3
+      7.28.3.3, 7.28.4.1.1, 7.28.4.1.2, 7.28.6.3.2,               real, 7.12.6, F.10.3
+      7.28.6.3.3, 7.28.6.4.1, 7.28.6.4.2, J.5.17,               expression, 6.5
+      K.3.1.3, K.3.7.4.2                                          assignment, 6.5.16
+errno.h header, 7.5, 7.30.3, K.3.2                                cast, 6.5.4
+errno_t type, K.3.2, K.3.5, K.3.6, K.3.6.1.1,                     constant, 6.6
+      K.3.7, K.3.8, K.3.9                                         evaluation, 5.1.2.3
+error                                                             full, 6.8
+   domain, see domain error                                       order of evaluation, see order of evaluation
+   encoding, see encoding error                                   parenthesized, 6.5.1
+   pole, see pole error                                           primary, 6.5.1
+   range, see range error                                         unary, 6.5.3
+error conditions, 7.12.1                                        expression statement, 6.8.3
+error functions, 7.12.8, F.10.5                                 extended alignment, 6.2.8
+error indicator, 7.21.1, 7.21.5.3, 7.21.7.1,                    extended character set, 3.7.2, 5.2.1, 5.2.1.2
+      7.21.7.3, 7.21.7.5, 7.21.7.6, 7.21.7.7,                   extended characters, 5.2.1
+      7.21.7.8, 7.21.9.2, 7.21.10.1, 7.21.10.3,                 extended integer types, 6.2.5, 6.3.1.1, 6.4.4.1,
+      7.28.3.1, 7.28.3.3                                             7.20
+error preprocessing directive, 4, 6.10.5                        extended multibyte/wide character conversion
+error-handling functions, 7.21.10, 7.23.6.2,                         utilities, 7.28.6, K.3.9.3
+      K.3.7.4.2, K.3.7.4.3                                      extensible wide character case mapping functions,
+escape character (\), 6.4.4.4                                        7.29.3.2
+escape sequences, 5.2.1, 5.2.2, 6.4.4.4, 6.11.4                 extensible wide character classification functions,
+evaluation format, 5.2.4.2.2, 6.4.4.2, 7.12                          7.29.2.2
+evaluation method, 5.2.4.2.2, 6.5, F.8.5                        extern storage-class specifier, 6.2.2, 6.7.1
+evaluation of expression, 5.1.2.3                               external definition, 6.9
+evaluation order, see order of evaluation                       external identifiers, underscore, 7.1.3
+exceptional condition, 6.5                                      external linkage, 6.2.2
+excess precision, 5.2.4.2.2, 6.3.1.8, 6.8.6.4                   external name, 6.4.2.1
+excess range, 5.2.4.2.2, 6.3.1.8, 6.8.6.4                       external object definitions, 6.9.2
+exclusive OR operators
+   bitwise (^), 6.2.6.2, 6.5.11                                 fabs functions, 7.12.7.2, F.3, F.10.4.2
+   bitwise assignment (^=), 6.5.16.2                            fabs type-generic macro, 7.24, G.7
+executable program, 5.1.1.1                                     false macro, 7.18
+execution character set, 5.2.1                                  fclose function, 7.21.5.1
+execution environment, 5, 5.1.2, see also                       fdim functions, 7.12.12.1, F.10.9.1
+      environmental limits                                      fdim type-generic macro, 7.24
+execution sequence, 5.1.2.3, 6.8                                FE_ALL_EXCEPT macro, 7.6
+exit function, 5.1.2.2.3, 7.21.3, 7.22, 7.22.4.4,               FE_DFL_ENV macro, 7.6
+      7.22.4.5, 7.22.4.7                                        FE_DIVBYZERO macro, 7.6, 7.12, F.3
+EXIT_FAILURE macro, 7.22, 7.22.4.4                              FE_DOWNWARD macro, 7.6, F.3
+EXIT_SUCCESS macro, 7.22, 7.22.4.4                              FE_INEXACT macro, 7.6, F.3
+exp functions, 7.12.6.1, F.10.3.1                               FE_INVALID macro, 7.6, 7.12, F.3
+exp type-generic macro, 7.24                                    FE_OVERFLOW macro, 7.6, 7.12, F.3
+
+[page 661]
+
+FE_TONEAREST macro, 7.6, F.3                                 float _Complex type conversion, 6.3.1.6,
+FE_TOWARDZERO macro, 7.6, F.3                                     6.3.1.7, 6.3.1.8
+FE_UNDERFLOW macro, 7.6, F.3                                 float _Imaginary type, G.2
+FE_UPWARD macro, 7.6, F.3                                    float type, 6.2.5, 6.4.4.2, 6.7.2, F.2
+feclearexcept function, 7.6.2, 7.6.2.1, F.3                  float type conversion, 6.3.1.4, 6.3.1.5, 6.3.1.7,
+fegetenv function, 7.6.4.1, 7.6.4.3, 7.6.4.4, F.3                 6.3.1.8
+fegetexceptflag function, 7.6.2, 7.6.2.2, F.3                float.h header, 4, 5.2.4.2.2, 7.7, 7.22.1.3,
+fegetround function, 7.6, 7.6.3.1, F.3                            7.28.4.1.1
+feholdexcept function, 7.6.4.2, 7.6.4.3,                     float_t type, 7.12, J.5.6
+     7.6.4.4, F.3                                            floating constant, 6.4.4.2
+fence, 5.1.2.4                                               floating suffix, f or F, 6.4.4.2
+fences, 7.17.4                                               floating type conversion, 6.3.1.4, 6.3.1.5, 6.3.1.7,
+fenv.h header, 5.1.2.3, 5.2.4.2.2, 7.6, 7.12, F, H                F.3, F.4
+FENV_ACCESS pragma, 6.10.6, 7.6.1, F.8, F.9,                 floating types, 6.2.5, 6.11.1
+     F.10                                                    floating-point accuracy, 5.2.4.2.2, 6.4.4.2, 6.5,
+fenv_t type, 7.6                                                  7.22.1.3, F.5, see also contracted expression
+feof function, 7.21.10.2                                     floating-point arithmetic functions, 7.12, F.10
+feraiseexcept function, 7.6.2, 7.6.2.3, F.3                  floating-point classification functions, 7.12.3
+ferror function, 7.21.10.3                                   floating-point control mode, 7.6, F.8.6
+fesetenv function, 7.6.4.3, F.3                              floating-point environment, 7.6, F.8, F.8.6
+fesetexceptflag function, 7.6.2, 7.6.2.4, F.3                floating-point exception, 7.6, 7.6.2, F.10
+fesetround function, 7.6, 7.6.3.2, F.3                       floating-point number, 5.2.4.2.2, 6.2.5
+fetestexcept function, 7.6.2, 7.6.2.5, F.3                   floating-point rounding mode, 5.2.4.2.2
+feupdateenv function, 7.6.4.2, 7.6.4.4, F.3                  floating-point status flag, 7.6, F.8.6
+fexcept_t type, 7.6, F.3                                     floor functions, 7.12.9.2, F.10.6.2
+fflush function, 7.21.5.2, 7.21.5.3                          floor type-generic macro, 7.24
+fgetc function, 7.21.1, 7.21.3, 7.21.7.1,                    FLT_DECIMAL_DIG macro, 5.2.4.2.2
+     7.21.7.5, 7.21.8.1                                      FLT_DIG macro, 5.2.4.2.2
+fgetpos function, 7.21.2, 7.21.9.1, 7.21.9.3                 FLT_EPSILON macro, 5.2.4.2.2
+fgets function, 7.21.1, 7.21.7.2, K.3.5.4.1                  FLT_EVAL_METHOD macro, 5.2.4.2.2, 6.6, 7.12,
+fgetwc function, 7.21.1, 7.21.3, 7.28.3.1,                        F.10.11
+     7.28.3.6                                                FLT_HAS_SUBNORM macro, 5.2.4.2.2
+fgetws function, 7.21.1, 7.28.3.2                            FLT_MANT_DIG macro, 5.2.4.2.2
+field width, 7.21.6.1, 7.28.2.1                               FLT_MAX macro, 5.2.4.2.2
+file, 7.21.3                                                  FLT_MAX_10_EXP macro, 5.2.4.2.2
+  access functions, 7.21.5, K.3.5.2                          FLT_MAX_EXP macro, 5.2.4.2.2
+  name, 7.21.3                                               FLT_MIN macro, 5.2.4.2.2
+  operations, 7.21.4, K.3.5.1                                FLT_MIN_10_EXP macro, 5.2.4.2.2
+  position indicator, 7.21.1, 7.21.2, 7.21.3,                FLT_MIN_EXP macro, 5.2.4.2.2
+        7.21.5.3, 7.21.7.1, 7.21.7.3, 7.21.7.10,             FLT_RADIX macro, 5.2.4.2.2, 7.21.6.1, 7.22.1.3,
+        7.21.8.1, 7.21.8.2, 7.21.9.1, 7.21.9.2,                   7.28.2.1, 7.28.4.1.1
+        7.21.9.3, 7.21.9.4, 7.21.9.5, 7.28.3.1,              FLT_ROUNDS macro, 5.2.4.2.2, 7.6, F.3
+        7.28.3.3, 7.28.3.10                                  FLT_TRUE_MIN macro, 5.2.4.2.2
+  positioning functions, 7.21.9                              fma functions, 7.12, 7.12.13.1, F.10.10.1
+file scope, 6.2.1, 6.9                                        fma type-generic macro, 7.24
+FILE type, 7.21.1, 7.21.3                                    fmax functions, 7.12.12.2, F.10.9.2
+FILENAME_MAX macro, 7.21.1                                   fmax type-generic macro, 7.24
+flags, 7.21.6.1, 7.28.2.1, see also floating-point             fmin functions, 7.12.12.3, F.10.9.3
+     status flag                                              fmin type-generic macro, 7.24
+flexible array member, 6.7.2.1                                fmod functions, 7.12.10.1, F.10.7.1
+float _Complex type, 6.2.5                                   fmod type-generic macro, 7.24
+
+[page 662]
+
+fopen function, 7.21.5.3, 7.21.5.4, K.3.5.2.1                       K.3.5.3.7, K.3.5.3.9
+FOPEN_MAX macro, 7.21.1, 7.21.3, 7.21.4.3,                    fseek function, 7.21.1, 7.21.5.3, 7.21.7.10,
+     K.3.5.1.1                                                      7.21.9.2, 7.21.9.4, 7.21.9.5, 7.28.3.10
+fopen_s function, K.3.5.1.1, K.3.5.2.1,                       fsetpos function, 7.21.2, 7.21.5.3, 7.21.7.10,
+     K.3.5.2.2                                                      7.21.9.1, 7.21.9.3, 7.28.3.10
+for statement, 6.8.5, 6.8.5.3                                 ftell function, 7.21.9.2, 7.21.9.4
+form-feed character, 5.2.1, 6.4                               full declarator, 6.7.6
+form-feed escape sequence (\f), 5.2.2, 6.4.4.4,               full expression, 6.8
+     7.4.1.10                                                 fully buffered stream, 7.21.3
+formal argument (deprecated), 3.16                            function
+formal parameter, 3.16                                           argument, 6.5.2.2, 6.9.1
+formatted input/output functions, 7.11.1.1, 7.21.6,              body, 6.9.1
+     K.3.5.3                                                     call, 6.5.2.2
+   wide character, 7.28.2, K.3.9.1                                  library, 7.1.4
+fortran keyword, J.5.9                                           declarator, 6.7.6.3, 6.11.6
+forward reference, 3.11                                          definition, 6.7.6.3, 6.9.1, 6.11.7
+FP_CONTRACT pragma, 6.5, 6.10.6, 7.12.2, see                     designator, 6.3.2.1
+     also contracted expression                                  image, 5.2.3
+FP_FAST_FMA macro, 7.12                                          inline, 6.7.4
+FP_FAST_FMAF macro, 7.12                                         library, 5.1.1.1, 7.1.4
+FP_FAST_FMAL macro, 7.12                                         name length, 5.2.4.1, 6.4.2.1, 6.11.3
+FP_ILOGB0 macro, 7.12, 7.12.6.5                                  no-return, 6.7.4
+FP_ILOGBNAN macro, 7.12, 7.12.6.5                                parameter, 5.1.2.2.1, 6.5.2.2, 6.7, 6.9.1
+FP_INFINITE macro, 7.12, F.3                                     prototype, 5.1.2.2.1, 6.2.1, 6.2.7, 6.5.2.2, 6.7,
+FP_NAN macro, 7.12, F.3                                                6.7.6.3, 6.9.1, 6.11.6, 6.11.7, 7.1.2, 7.12
+FP_NORMAL macro, 7.12, F.3                                       prototype scope, 6.2.1, 6.7.6.2
+FP_SUBNORMAL macro, 7.12, F.3                                    recursive call, 6.5.2.2
+FP_ZERO macro, 7.12, F.3                                         return, 6.8.6.4, F.6
+fpclassify macro, 7.12.3.1, F.3                                  scope, 6.2.1
+fpos_t type, 7.21.1, 7.21.2                                      type, 6.2.5
+fprintf function, 7.8.1, 7.21.1, 7.21.6.1,                       type conversion, 6.3.2.1
+     7.21.6.2, 7.21.6.3, 7.21.6.5, 7.21.6.6,                  function specifiers, 6.7.4
+     7.21.6.8, 7.28.2.2, F.3, K.3.5.3.1                       function type, 6.2.5
+fprintf_s function, K.3.5.3.1                                 function-call operator (( )), 6.5.2.2
+fputc function, 5.2.2, 7.21.1, 7.21.3, 7.21.7.3,              function-like macro, 6.10.3
+     7.21.7.7, 7.21.8.2                                       fundamental alignment, 6.2.8
+fputs function, 7.21.1, 7.21.7.4                              future directions
+fputwc function, 7.21.1, 7.21.3, 7.28.3.3,                       language, 6.11
+     7.28.3.8                                                    library, 7.30
+fputws function, 7.21.1, 7.28.3.4                             fwide function, 7.21.2, 7.28.3.5
+fread function, 7.21.1, 7.21.8.1                              fwprintf function, 7.8.1, 7.21.1, 7.21.6.2,
+free function, 7.22.3.3, 7.22.3.5                                   7.28.2.1, 7.28.2.2, 7.28.2.3, 7.28.2.5,
+freestanding execution environment, 4, 5.1.2,                       7.28.2.11, K.3.9.1.1
+     5.1.2.1                                                  fwprintf_s function, K.3.9.1.1
+freopen function, 7.21.2, 7.21.5.4                            fwrite function, 7.21.1, 7.21.8.2
+freopen_s function, K.3.5.2.2                                 fwscanf function, 7.8.1, 7.21.1, 7.28.2.2,
+frexp functions, 7.12.6.4, F.10.3.4                                 7.28.2.4, 7.28.2.6, 7.28.2.12, 7.28.3.10,
+frexp type-generic macro, 7.24                                      K.3.9.1.2
+fscanf function, 7.8.1, 7.21.1, 7.21.6.2,                     fwscanf_s function, K.3.9.1.2, K.3.9.1.5,
+     7.21.6.4, 7.21.6.7, 7.21.6.9, F.3, K.3.5.3.2                   K.3.9.1.7, K.3.9.1.14
+fscanf_s function, K.3.5.3.2, K.3.5.3.4,
+
+[page 663]
+
+gamma functions, 7.12.8, F.10.5                               name spaces, 6.2.3
+general utilities, 7.22, K.3.6                                reserved, 6.4.1, 7.1.3, K.3.1.2
+  wide string, 7.28.4, K.3.9.2                                 scope, 6.2.1
+general wide string utilities, 7.28.4, K.3.9.2                 type, 6.2.5
+generic parameters, 7.24                                    identifier list, 6.7.6
+generic selection, 6.5.1.1                                  identifier nondigit, 6.4.2.1
+getc function, 7.21.1, 7.21.7.5, 7.21.7.6                   IEC 559, F.1
+getchar function, 7.21.1, 7.21.7.6                          IEC 60559, 2, 5.1.2.3, 5.2.4.2.2, 6.10.8.3, 7.3.3,
+getenv function, 7.22.4.6                                         7.6, 7.6.4.2, 7.12.1, 7.12.10.2, 7.12.14, F, G,
+getenv_s function, K.3.6.2.1                                      H.1
+gets function, K.3.5.4.1                                    IEEE 754, F.1
+gets_s function, K.3.5.4.1                                  IEEE 854, F.1
+getwc function, 7.21.1, 7.28.3.6, 7.28.3.7                  IEEE floating-point arithmetic standard, see
+getwchar function, 7.21.1, 7.28.3.7                               IEC 60559, ANSI/IEEE 754,
+gmtime function, 7.26.3.3                                         ANSI/IEEE 854
+gmtime_s function, K.3.8.2.3                                if preprocessing directive, 5.2.4.2.1, 5.2.4.2.2,
+goto statement, 6.2.1, 6.8.1, 6.8.6.1                             6.10.1, 7.1.4
+graphic characters, 5.2.1                                   if statement, 6.8.4.1
+greater-than operator (>), 6.5.8                            ifdef preprocessing directive, 6.10.1
+greater-than-or-equal-to operator (>=), 6.5.8               ifndef preprocessing directive, 6.10.1
+                                                            ignore_handler_s function, K.3.6.1.3
+happens before, 5.1.2.4                                     ilogb functions, 7.12, 7.12.6.5, F.10.3.5
+header, 5.1.1.1, 7.1.2, see also standard headers           ilogb type-generic macro, 7.24
+header names, 6.4, 6.4.7, 6.10.2                            imaginary macro, 7.3.1, G.6
+hexadecimal constant, 6.4.4.1                               imaginary numbers, G
+hexadecimal digit, 6.4.4.1, 6.4.4.2, 6.4.4.4                imaginary type domain, G.2
+hexadecimal prefix, 6.4.4.1                                  imaginary types, G
+hexadecimal-character escape sequence                       imaxabs function, 7.8.2.1
+     (\x hexadecimal digits), 6.4.4.4                       imaxdiv function, 7.8, 7.8.2.2
+high-order bit, 3.6                                         imaxdiv_t type, 7.8
+horizontal-tab character, 5.2.1, 6.4                        implementation, 3.12
+horizontal-tab escape sequence (\r), 7.29.2.1.3             implementation limit, 3.13, 4, 5.2.4.2, 6.4.2.1,
+horizontal-tab escape sequence (\t), 5.2.2,                       6.7.6, 6.8.4.2, E, see also environmental
+     6.4.4.4, 7.4.1.3, 7.4.1.10                                   limits
+hosted execution environment, 4, 5.1.2, 5.1.2.2             implementation-defined behavior, 3.4.1, 4, J.3
+HUGE_VAL macro, 7.12, 7.12.1, 7.22.1.3,                     implementation-defined value, 3.19.1
+     7.28.4.1.1, F.10                                       implicit conversion, 6.3
+HUGE_VALF macro, 7.12, 7.12.1, 7.22.1.3,                    implicit initialization, 6.7.9
+     7.28.4.1.1, F.10                                       include preprocessing directive, 5.1.1.2, 6.10.2
+HUGE_VALL macro, 7.12, 7.12.1, 7.22.1.3,                    inclusive OR operators
+     7.28.4.1.1, F.10                                         bitwise (|), 6.2.6.2, 6.5.12
+hyperbolic functions                                           bitwise assignment (|=), 6.5.16.2
+  complex, 7.3.6, G.6.2                                     incomplete type, 6.2.5
+  real, 7.12.5, F.10.2                                      increment operators, see arithmetic operators,
+hypot functions, 7.12.7.3, F.10.4.3                               increment and decrement
+hypot type-generic macro, 7.24                              indeterminate value, 3.19.2
+                                                            indeterminately sequenced, 5.1.2.3, 6.5.2.2,
+I macro, 7.3.1, 7.3.9.5, G.6                                      6.5.2.4, 6.5.16.2, see also sequenced before,
+identifier, 6.4.2.1, 6.5.1                                         unsequenced
+   linkage, see linkage                                     indirection operator (*), 6.5.2.1, 6.5.3.2
+   maximum length, 6.4.2.1                                  inequality operator (!=), 6.5.9
+
+[page 664]
+
+infinitary, 7.12.1                                                    extended, 6.2.5, 6.3.1.1, 6.4.4.1, 7.20
+INFINITY macro, 7.3.9.5, 7.12, F.2.1                              inter-thread happens before, 5.1.2.4
+initial position, 5.2.2                                           interactive device, 5.1.2.3, 7.21.3, 7.21.5.3
+initial shift state, 5.2.1.2                                      internal linkage, 6.2.2
+initialization, 5.1.2, 6.2.4, 6.3.2.1, 6.5.2.5, 6.7.9,            internal name, 6.4.2.1
+      F.8.5                                                       interrupt, 5.2.3
+   in blocks, 6.8                                                 INTMAX_C macro, 7.20.4.2
+initializer, 6.7.9                                                INTMAX_MAX macro, 7.8.2.3, 7.8.2.4, 7.20.2.5
+   permitted form, 6.6                                            INTMAX_MIN macro, 7.8.2.3, 7.8.2.4, 7.20.2.5
+   string literal, 6.3.2.1                                        intmax_t type, 7.20.1.5, 7.21.6.1, 7.21.6.2,
+inline, 6.7.4                                                           7.28.2.1, 7.28.2.2
+inner scope, 6.2.1                                                INTN_C macros, 7.20.4.1
+input failure, 7.28.2.6, 7.28.2.8, 7.28.2.10,                     INTN_MAX macros, 7.20.2.1
+      K.3.5.3.2, K.3.5.3.4, K.3.5.3.7, K.3.5.3.9,                 INTN_MIN macros, 7.20.2.1
+      K.3.5.3.11, K.3.5.3.14, K.3.9.1.2, K.3.9.1.5,               intN_t types, 7.20.1.1
+      K.3.9.1.7, K.3.9.1.10, K.3.9.1.12, K.3.9.1.14               INTPTR_MAX macro, 7.20.2.4
+input/output functions                                            INTPTR_MIN macro, 7.20.2.4
+   character, 7.21.7, K.3.5.4                                     intptr_t type, 7.20.1.4
+   direct, 7.21.8                                                 inttypes.h header, 7.8, 7.30.4
+   formatted, 7.21.6, K.3.5.3                                     isalnum function, 7.4.1.1, 7.4.1.9, 7.4.1.10
+      wide character, 7.28.2, K.3.9.1                             isalpha function, 7.4.1.1, 7.4.1.2
+   wide character, 7.28.3                                         isblank function, 7.4.1.3
+      formatted, 7.28.2, K.3.9.1                                  iscntrl function, 7.4.1.2, 7.4.1.4, 7.4.1.7,
+input/output header, 7.21, K.3.5                                        7.4.1.11
+input/output, device, 5.1.2.3                                     isdigit function, 7.4.1.1, 7.4.1.2, 7.4.1.5,
+int type, 6.2.5, 6.3.1.1, 6.3.1.3, 6.4.4.1, 6.7.2                       7.4.1.7, 7.4.1.11, 7.11.1.1
+int type conversion, 6.3.1.1, 6.3.1.3, 6.3.1.4,                   isfinite macro, 7.12.3.2, F.3
+      6.3.1.8                                                     isgraph function, 7.4.1.6
+INT_FASTN_MAX macros, 7.20.2.3                                    isgreater macro, 7.12.14.1, F.3
+INT_FASTN_MIN macros, 7.20.2.3                                    isgreaterequal macro, 7.12.14.2, F.3
+int_fastN_t types, 7.20.1.3                                       isinf macro, 7.12.3.3
+INT_LEASTN_MAX macros, 7.20.2.2                                   isless macro, 7.12.14.3, F.3
+INT_LEASTN_MIN macros, 7.20.2.2                                   islessequal macro, 7.12.14.4, F.3
+int_leastN_t types, 7.20.1.2                                      islessgreater macro, 7.12.14.5, F.3
+INT_MAX macro, 5.2.4.2.1, 7.12, 7.12.6.5                          islower function, 7.4.1.2, 7.4.1.7, 7.4.2.1,
+INT_MIN macro, 5.2.4.2.1, 7.12                                          7.4.2.2
+integer arithmetic functions, 7.8.2.1, 7.8.2.2,                   isnan macro, 7.12.3.4, F.3
+      7.22.6                                                      isnormal macro, 7.12.3.5
+integer character constant, 6.4.4.4                               ISO 31-11, 2, 3
+integer constant, 6.4.4.1                                         ISO 4217, 2, 7.11.2.1
+integer constant expression, 6.3.2.3, 6.6, 6.7.2.1,               ISO 8601, 2, 7.26.3.5
+      6.7.2.2, 6.7.6.2, 6.7.9, 6.7.10, 6.8.4.2, 6.10.1,           ISO/IEC 10646, 2, 6.4.2.1, 6.4.3, 6.10.8.2
+      7.1.4                                                       ISO/IEC 10976-1, H.1
+integer conversion rank, 6.3.1.1                                  ISO/IEC 2382-1, 2, 3
+integer promotions, 5.1.2.3, 5.2.4.2.1, 6.3.1.1,                  ISO/IEC 646, 2, 5.2.1.1
+      6.5.2.2, 6.5.3.3, 6.5.7, 6.8.4.2, 7.20.2, 7.20.3,           ISO/IEC 9945-2, 7.11
+      7.21.6.1, 7.28.2.1                                          iso646.h header, 4, 7.9                          *
+integer suffix, 6.4.4.1                                            isprint function, 5.2.2, 7.4.1.8
+integer type conversion, 6.3.1.1, 6.3.1.3, 6.3.1.4,               ispunct function, 7.4.1.2, 7.4.1.7, 7.4.1.9,
+      F.3, F.4                                                          7.4.1.11
+integer types, 6.2.5, 7.20                                        isspace function, 7.4.1.2, 7.4.1.7, 7.4.1.9,
+
+[page 665]
+
+      7.4.1.10, 7.4.1.11, 7.21.6.2, 7.22.1.3,                   LC_ALL macro, 7.11, 7.11.1.1, 7.11.2.1
+      7.22.1.4, 7.28.2.2                                        LC_COLLATE macro, 7.11, 7.11.1.1, 7.23.4.3,
+isunordered macro, 7.12.14.6, F.3                                     7.28.4.4.2
+isupper function, 7.4.1.2, 7.4.1.11, 7.4.2.1,                   LC_CTYPE macro, 7.11, 7.11.1.1, 7.22, 7.22.7,
+      7.4.2.2                                                         7.22.8, 7.28.6, 7.29.1, 7.29.2.2.1, 7.29.2.2.2,
+iswalnum function, 7.29.2.1.1, 7.29.2.1.9,                            7.29.3.2.1, 7.29.3.2.2, K.3.6.4, K.3.6.5
+      7.29.2.1.10, 7.29.2.2.1                                   LC_MONETARY macro, 7.11, 7.11.1.1, 7.11.2.1
+iswalpha function, 7.29.2.1.1, 7.29.2.1.2,                      LC_NUMERIC macro, 7.11, 7.11.1.1, 7.11.2.1
+      7.29.2.2.1                                                LC_TIME macro, 7.11, 7.11.1.1, 7.26.3.5
+iswblank function, 7.29.2.1.3, 7.29.2.2.1                       lconv structure type, 7.11
+iswcntrl function, 7.29.2.1.2, 7.29.2.1.4,                      LDBL_DECIMAL_DIG macro, 5.2.4.2.2
+      7.29.2.1.7, 7.29.2.1.11, 7.29.2.2.1                       LDBL_DIG macro, 5.2.4.2.2
+iswctype function, 7.29.2.2.1, 7.29.2.2.2                       LDBL_EPSILON macro, 5.2.4.2.2
+iswdigit function, 7.29.2.1.1, 7.29.2.1.2,                      LDBL_HAS_SUBNORM macro, 5.2.4.2.2
+      7.29.2.1.5, 7.29.2.1.7, 7.29.2.1.11, 7.29.2.2.1           LDBL_MANT_DIG macro, 5.2.4.2.2
+iswgraph function, 7.29.2.1, 7.29.2.1.6,                        LDBL_MAX macro, 5.2.4.2.2
+      7.29.2.1.10, 7.29.2.2.1                                   LDBL_MAX_10_EXP macro, 5.2.4.2.2
+iswlower function, 7.29.2.1.2, 7.29.2.1.7,                      LDBL_MAX_EXP macro, 5.2.4.2.2
+      7.29.2.2.1, 7.29.3.1.1, 7.29.3.1.2                        LDBL_MIN macro, 5.2.4.2.2
+iswprint function, 7.29.2.1.6, 7.29.2.1.8,                      LDBL_MIN_10_EXP macro, 5.2.4.2.2
+      7.29.2.2.1                                                LDBL_MIN_EXP macro, 5.2.4.2.2
+iswpunct function, 7.29.2.1, 7.29.2.1.2,                        LDBL_TRUE_MIN macro, 5.2.4.2.2
+      7.29.2.1.7, 7.29.2.1.9, 7.29.2.1.10,                      ldexp functions, 7.12.6.6, F.10.3.6
+      7.29.2.1.11, 7.29.2.2.1                                   ldexp type-generic macro, 7.24
+iswspace function, 7.21.6.2, 7.28.2.2,                          ldiv function, 7.22.6.2
+      7.28.4.1.1, 7.28.4.1.2, 7.29.2.1.2, 7.29.2.1.6,           ldiv_t type, 7.22
+      7.29.2.1.7, 7.29.2.1.9, 7.29.2.1.10,                      leading underscore in identifiers, 7.1.3
+      7.29.2.1.11, 7.29.2.2.1                                   left-shift assignment operator (<<=), 6.5.16.2
+iswupper function, 7.29.2.1.2, 7.29.2.1.11,                     left-shift operator (<<), 6.2.6.2, 6.5.7
+      7.29.2.2.1, 7.29.3.1.1, 7.29.3.1.2                        length
+iswxdigit function, 7.29.2.1.12, 7.29.2.2.1                        external name, 5.2.4.1, 6.4.2.1, 6.11.3
+isxdigit function, 7.4.1.12, 7.11.1.1                              function name, 5.2.4.1, 6.4.2.1, 6.11.3
+italic type convention, 3, 6.1                                     identifier, 6.4.2.1
+iteration statements, 6.8.5                                        internal name, 5.2.4.1, 6.4.2.1
+                                                                length function, 7.22.7.1, 7.23.6.3, 7.28.4.6.1,
+jmp_buf type, 7.13                                                    7.28.6.3.1, K.3.7.4.4, K.3.9.2.4.1
+jump statements, 6.8.6                                          length modifier, 7.21.6.1, 7.21.6.2, 7.28.2.1,
+                                                                      7.28.2.2
+keywords, 6.4.1, G.2, J.5.9, J.5.10                             less-than operator (<), 6.5.8
+kill_dependency macro, 5.1.2.4, 7.17.3.1                        less-than-or-equal-to operator (<=), 6.5.8
+known constant size, 6.2.5                                      letter, 5.2.1, 7.4
+                                                                lexical elements, 5.1.1.2, 6.4
+L_tmpnam macro, 7.21.1, 7.21.4.4                                lgamma functions, 7.12.8.3, F.10.5.3
+L_tmpnam_s macro, K.3.5, K.3.5.1.2                              lgamma type-generic macro, 7.24
+label name, 6.2.1, 6.2.3                                        library, 5.1.1.1, 7, K.3
+labeled statement, 6.8.1                                           future directions, 7.30
+labs function, 7.22.6.1                                            summary, B
+language, 6                                                        terms, 7.1.1
+   future directions, 6.11                                         use of functions, 7.1.4
+   syntax summary, A                                            lifetime, 6.2.4
+Latin alphabet, 5.2.1, 6.4.2.1                                  limits
+
+[page 666]
+
+   environmental, see environmental limits                      6.3.1.6, 6.3.1.7, 6.3.1.8
+   implementation, see implementation limits               long double _Imaginary type, G.2
+   numerical, see numerical limits                         long double suffix, l or L, 6.4.4.2
+   translation, see translation limits                     long double type, 6.2.5, 6.4.4.2, 6.7.2,
+limits.h header, 4, 5.2.4.2.1, 6.2.5, 7.10                      7.21.6.1, 7.21.6.2, 7.28.2.1, 7.28.2.2, F.2
+line buffered stream, 7.21.3                               long double type conversion, 6.3.1.4, 6.3.1.5,
+line number, 6.10.4, 6.10.8.1                                   6.3.1.7, 6.3.1.8
+line preprocessing directive, 6.10.4                       long int type, 6.2.5, 6.3.1.1, 6.7.2, 7.21.6.1,
+lines, 5.1.1.2, 7.21.2                                          7.21.6.2, 7.28.2.1, 7.28.2.2
+   preprocessing directive, 6.10                           long int type conversion, 6.3.1.1, 6.3.1.3,
+linkage, 6.2.2, 6.7, 6.7.4, 6.7.6.2, 6.9, 6.9.2,                6.3.1.4, 6.3.1.8
+      6.11.2                                               long integer suffix, l or L, 6.4.4.1
+llabs function, 7.22.6.1                                   long long int type, 6.2.5, 6.3.1.1, 6.7.2,
+lldiv function, 7.22.6.2                                        7.21.6.1, 7.21.6.2, 7.28.2.1, 7.28.2.2
+lldiv_t type, 7.22                                         long long int type conversion, 6.3.1.1,
+LLONG_MAX macro, 5.2.4.2.1, 7.22.1.4,                           6.3.1.3, 6.3.1.4, 6.3.1.8
+      7.28.4.1.2                                           long long integer suffix, ll or LL, 6.4.4.1
+LLONG_MIN macro, 5.2.4.2.1, 7.22.1.4,                      LONG_MAX macro, 5.2.4.2.1, 7.22.1.4, 7.28.4.1.2
+      7.28.4.1.2                                           LONG_MIN macro, 5.2.4.2.1, 7.22.1.4, 7.28.4.1.2
+llrint functions, 7.12.9.5, F.3, F.10.6.5                  longjmp function, 7.13.1.1, 7.13.2.1, 7.22.4.4,
+llrint type-generic macro, 7.24                                 7.22.4.7
+llround functions, 7.12.9.7, F.10.6.7                      loop body, 6.8.5
+llround type-generic macro, 7.24                           low-order bit, 3.6
+local time, 7.26.1                                         lowercase letter, 5.2.1
+locale, 3.4.2                                              lrint functions, 7.12.9.5, F.3, F.10.6.5
+locale-specific behavior, 3.4.2, J.4                        lrint type-generic macro, 7.24
+locale.h header, 7.11, 7.30.5                              lround functions, 7.12.9.7, F.10.6.7
+localeconv function, 7.11.1.1, 7.11.2.1                    lround type-generic macro, 7.24
+localization, 7.11                                         lvalue, 6.3.2.1, 6.5.1, 6.5.2.4, 6.5.3.1, 6.5.16,
+localtime function, 7.26.3.4                                    6.7.2.4
+localtime_s function, K.3.8.2.4                            lvalue conversion, 6.3.2.1, 6.5.16, 6.5.16.1,
+log functions, 7.12.6.7, F.10.3.7                               6.5.16.2
+log type-generic macro, 7.24
+log10 functions, 7.12.6.8, F.10.3.8                        macro argument substitution, 6.10.3.1
+log10 type-generic macro, 7.24                             macro definition
+log1p functions, 7.12.6.9, F.10.3.9                          library function, 7.1.4
+log1p type-generic macro, 7.24                             macro invocation, 6.10.3
+log2 functions, 7.12.6.10, F.10.3.10                       macro name, 6.10.3
+log2 type-generic macro, 7.24                                length, 5.2.4.1
+logarithmic functions                                        predefined, 6.10.8, 6.11.9
+   complex, 7.3.7, G.6.3                                     redefinition, 6.10.3
+   real, 7.12.6, F.10.3                                      scope, 6.10.3.5
+logb functions, 7.12.6.11, F.3, F.10.3.11                  macro parameter, 6.10.3
+logb type-generic macro, 7.24                              macro preprocessor, 6.10
+logical operators                                          macro replacement, 6.10.3
+   AND (&&), 5.1.2.4, 6.5.13                               magnitude, complex, 7.3.8.1
+   negation (!), 6.5.3.3                                   main function, 5.1.2.2.1, 5.1.2.2.3, 6.7.3.1, 6.7.4,
+   OR (||), 5.1.2.4, 6.5.14                                     7.21.3
+logical source lines, 5.1.1.2                              malloc function, 7.22.3, 7.22.3.4, 7.22.3.5
+long double _Complex type, 6.2.5                           manipulation functions
+long double _Complex type conversion,                        complex, 7.3.9
+
+[page 667]
+
+  real, 7.12.11, F.10.8                                    modf functions, 7.12.6.12, F.10.3.12
+matching failure, 7.28.2.6, 7.28.2.8, 7.28.2.10,           modifiable lvalue, 6.3.2.1
+     K.3.9.1.7, K.3.9.1.10, K.3.9.1.12                     modification order, 5.1.2.4
+math.h header, 5.2.4.2.2, 6.5, 7.12, 7.24, F,              modulus functions, 7.12.6.12
+     F.10, J.5.17                                          modulus, complex, 7.3.8.1
+MATH_ERREXCEPT macro, 7.12, F.10                           mtx_destroy function, 7.25.4.1
+math_errhandling macro, 7.1.3, 7.12, F.10                  mtx_init function, 7.25.1, 7.25.4.2
+MATH_ERRNO macro, 7.12                                     mtx_lock function, 7.25.4.3
+max_align_t type, 7.19                                     mtx_t type, 7.25.1
+maximum functions, 7.12.12, F.10.9                         mtx_timedlock function, 7.25.4.4
+MB_CUR_MAX macro, 7.1.1, 7.22, 7.22.7.2,                   mtx_trylock function, 7.25.4.5
+     7.22.7.3, 7.27.1.2, 7.27.1.4, 7.28.6.3.3,             mtx_unlock function, 7.25.4.3, 7.25.4.4,
+     K.3.6.4.1, K.3.9.3.1.1                                     7.25.4.5, 7.25.4.6
+MB_LEN_MAX macro, 5.2.4.2.1, 7.1.1, 7.22                   multibyte character, 3.7.2, 5.2.1.2, 6.4.4.4
+mblen function, 7.22.7.1, 7.28.6.3                         multibyte conversion functions
+mbrlen function, 7.28.6.3.1                                  wide character, 7.22.7, K.3.6.4
+mbrtoc16 function, 6.4.4.4, 6.4.5, 7.27.1.1                     extended, 7.28.6, K.3.9.3
+mbrtoc32 function, 6.4.4.4, 6.4.5, 7.27.1.3                     restartable, 7.27.1, 7.28.6.3, K.3.9.3.1
+mbrtowc function, 7.21.3, 7.21.6.1, 7.21.6.2,                wide string, 7.22.8, K.3.6.5
+     7.28.2.1, 7.28.2.2, 7.28.6.3.1, 7.28.6.3.2,                restartable, 7.28.6.4, K.3.9.3.2
+     7.28.6.4.1, K.3.6.5.1, K.3.9.3.2.1                    multibyte string, 7.1.1
+mbsinit function, 7.28.6.2.1                               multibyte/wide character conversion functions,
+mbsrtowcs function, 7.28.6.4.1, K.3.9.3.2                       7.22.7, K.3.6.4
+mbsrtowcs_s function, K.3.9.3.2, K.3.9.3.2.1                 extended, 7.28.6, K.3.9.3
+mbstate_t type, 7.21.2, 7.21.3, 7.21.6.1,                    restartable, 7.27.1, 7.28.6.3, K.3.9.3.1
+     7.21.6.2, 7.27, 7.27.1, 7.28.1, 7.28.2.1,             multibyte/wide string conversion functions,
+     7.28.2.2, 7.28.6, 7.28.6.2.1, 7.28.6.3,                    7.22.8, K.3.6.5
+     7.28.6.3.1, 7.28.6.4                                    restartable, 7.28.6.4, K.3.9.3.2
+mbstowcs function, 6.4.5, 7.22.8.1, 7.28.6.4               multidimensional array, 6.5.2.1
+mbstowcs_s function, K.3.6.5.1                             multiplication assignment operator (*=), 6.5.16.2
+mbtowc function, 6.4.4.4, 7.22.7.1, 7.22.7.2,              multiplication operator (*), 6.2.6.2, 6.5.5, F.3,
+     7.22.8.1, 7.28.6.3                                         G.5.1
+member access operators (. and ->), 6.5.2.3                multiplicative expressions, 6.5.5, G.5.1
+member alignment, 6.7.2.1
+memchr function, 7.23.5.1                                  n-char sequence, 7.22.1.3
+memcmp function, 7.23.4, 7.23.4.1                          n-wchar sequence, 7.28.4.1.1
+memcpy function, 7.23.2.1                                  name
+memcpy_s function, K.3.7.1.1                                 external, 5.2.4.1, 6.4.2.1, 6.11.3
+memmove function, 7.23.2.2                                   file, 7.21.3
+memmove_s function, K.3.7.1.2                                internal, 5.2.4.1, 6.4.2.1
+memory location, 3.14                                        label, 6.2.3
+memory management functions, 7.22.3                          structure/union member, 6.2.3
+memory_order type, 7.17.1, 7.17.3                          name spaces, 6.2.3
+memset function, 7.23.6.1, K.3.7.4.1                       named label, 6.8.1
+memset_s function, K.3.7.4.1                               NaN, 5.2.4.2.2
+minimum functions, 7.12.12, F.10.9                         nan functions, 7.12.11.2, F.2.1, F.10.8.2
+minus operator, unary, 6.5.3.3                             NAN macro, 7.12, F.2.1
+miscellaneous functions                                    NDEBUG macro, 7.2
+  string, 7.23.6, K.3.7.4                                  nearbyint functions, 7.12.9.3, 7.12.9.4, F.3,
+  wide string, 7.28.4.6, K.3.9.2.4                              F.10.6.3
+mktime function, 7.26.2.3                                  nearbyint type-generic macro, 7.24
+
+[page 668]
+
+nearest integer functions, 7.12.9, F.10.6                       operating system, 5.1.2.1, 7.22.4.8
+negation operator (!), 6.5.3.3                                  operations on files, 7.21.4, K.3.5.1
+negative zero, 6.2.6.2, 7.12.11.1                               operator, 6.4.6
+new-line character, 5.1.1.2, 5.2.1, 6.4, 6.10, 6.10.4           operators, 6.5
+new-line escape sequence (\n), 5.2.2, 6.4.4.4,                     additive, 6.2.6.2, 6.5.6
+     7.4.1.10                                                      alignof, 6.5.3.4
+nextafter functions, 7.12.11.3, 7.12.11.4, F.3,                    assignment, 6.5.16
+     F.10.8.3                                                      associativity, 6.5
+nextafter type-generic macro, 7.24                                 equality, 6.5.9
+nexttoward functions, 7.12.11.4, F.3, F.10.8.4                     multiplicative, 6.2.6.2, 6.5.5, G.5.1
+nexttoward type-generic macro, 7.24                                postfix, 6.5.2
+no linkage, 6.2.2                                                  precedence, 6.5
+no-return function, 6.7.4                                          preprocessing, 6.10.1, 6.10.3.2, 6.10.3.3, 6.10.9
+non-stop floating-point control mode, 7.6.4.2                       relational, 6.5.8
+nongraphic characters, 5.2.2, 6.4.4.4                              shift, 6.5.7
+nonlocal jumps header, 7.13                                        sizeof, 6.5.3.4
+norm, complex, 7.3.8.1                                             unary, 6.5.3
+normalized broken-down time, K.3.8.1, K.3.8.2.1                    unary arithmetic, 6.5.3.3
+not macro, 7.9                                                  optional features, see conditional features
+not-equal-to operator, see inequality operator                  or macro, 7.9
+not_eq macro, 7.9                                               OR operators
+null character (\0), 5.2.1, 6.4.4.4, 6.4.5                         bitwise exclusive (^), 6.2.6.2, 6.5.11
+  padding of binary stream, 7.21.2                                 bitwise exclusive assignment (^=), 6.5.16.2
+NULL macro, 7.11, 7.19, 7.21.1, 7.22, 7.23.1,                      bitwise inclusive (|), 6.2.6.2, 6.5.12
+     7.26.1, 7.28.1                                                bitwise inclusive assignment (|=), 6.5.16.2
+null pointer, 6.3.2.3                                              logical (||), 5.1.2.4, 6.5.14
+null pointer constant, 6.3.2.3                                  or_eq macro, 7.9
+null preprocessing directive, 6.10.7                            order of allocated storage, 7.22.3
+null statement, 6.8.3                                           order of evaluation, 6.5, 6.5.16, 6.10.3.2, 6.10.3.3,
+null wide character, 7.1.1                                            see also sequence points
+number classification macros, 7.12, 7.12.3.1                     ordinary identifier name space, 6.2.3
+numeric conversion functions, 7.8.2.3, 7.22.1                   orientation of stream, 7.21.2, 7.28.3.5
+  wide string, 7.8.2.4, 7.28.4.1                                out-of-bounds store, L.2.1
+numerical limits, 5.2.4.2                                       outer scope, 6.2.1
+                                                                over-aligned, 6.2.8
+object, 3.15
+object representation, 6.2.6.1                                  padding
+object type, 6.2.5                                                binary stream, 7.21.2
+object-like macro, 6.10.3                                         bits, 6.2.6.2, 7.20.1.1
+observable behavior, 5.1.2.3                                      structure/union, 6.2.6.1, 6.7.2.1
+obsolescence, 6.11, 7.30                                        parameter, 3.16
+octal constant, 6.4.4.1                                           array, 6.9.1
+octal digit, 6.4.4.1, 6.4.4.4                                     ellipsis, 6.7.6.3, 6.10.3
+octal-character escape sequence (\octal digits),                  function, 6.5.2.2, 6.7, 6.9.1
+     6.4.4.4                                                      macro, 6.10.3
+offsetof macro, 7.19                                              main function, 5.1.2.2.1
+on-off switch, 6.10.6                                             program, 5.1.2.2.1
+once_flag type, 7.25.1                                          parameter type list, 6.7.6.3
+ONCE_FLAG_INIT macro, 7.25.1                                    parentheses punctuator (( )), 6.7.6.3, 6.8.4, 6.8.5
+ones' complement, 6.2.6.2                                       parenthesized expression, 6.5.1
+operand, 6.4.6, 6.5                                             parse state, 7.21.2
+
+[page 669]
+
+perform a trap, 3.19.5                                        preprocessor, 6.10
+permitted form of initializer, 6.6                            PRIcFASTN macros, 7.8.1
+perror function, 7.21.10.4                                    PRIcLEASTN macros, 7.8.1
+phase angle, complex, 7.3.9.1                                 PRIcMAX macros, 7.8.1
+physical source lines, 5.1.1.2                                PRIcN macros, 7.8.1
+placemarker, 6.10.3.3                                         PRIcPTR macros, 7.8.1
+plus operator, unary, 6.5.3.3                                 primary expression, 6.5.1
+pointer arithmetic, 6.5.6                                     printf function, 7.21.1, 7.21.6.3, 7.21.6.10,
+pointer comparison, 6.5.8                                           K.3.5.3.3
+pointer declarator, 6.7.6.1                                   printf_s function, K.3.5.3.3
+pointer operator (->), 6.5.2.3                                printing character, 5.2.2, 7.4, 7.4.1.8
+pointer to function, 6.5.2.2                                  printing wide character, 7.29.2
+pointer type, 6.2.5                                           program diagnostics, 7.2.1
+pointer type conversion, 6.3.2.1, 6.3.2.3                     program execution, 5.1.2.2.2, 5.1.2.3
+pointer, null, 6.3.2.3                                        program file, 5.1.1.1
+pole error, 7.12.1, 7.12.5.3, 7.12.6.7, 7.12.6.8,             program image, 5.1.1.2
+     7.12.6.9, 7.12.6.10, 7.12.6.11, 7.12.7.4,                program name (argv[0]), 5.1.2.2.1
+     7.12.8.3, 7.12.8.4                                       program parameters, 5.1.2.2.1
+portability, 4, J                                             program startup, 5.1.2, 5.1.2.1, 5.1.2.2.1
+position indicator, file, see file position indicator           program structure, 5.1.1.1
+positive difference, 7.12.12.1                                program termination, 5.1.2, 5.1.2.1, 5.1.2.2.3,
+positive difference functions, 7.12.12, F.10.9                      5.1.2.3
+postfix decrement operator (--), 6.3.2.1, 6.5.2.4              program, conforming, 4
+postfix expressions, 6.5.2                                     program, strictly conforming, 4
+postfix increment operator (++), 6.3.2.1, 6.5.2.4              promotions
+pow functions, 7.12.7.4, F.10.4.4                                default argument, 6.5.2.2
+pow type-generic macro, 7.24                                     integer, 5.1.2.3, 6.3.1.1
+power functions                                               prototype, see function prototype
+  complex, 7.3.8, G.6.4                                       pseudo-random sequence functions, 7.22.2
+  real, 7.12.7, F.10.4                                        PTRDIFF_MAX macro, 7.20.3
+pp-number, 6.4.8                                              PTRDIFF_MIN macro, 7.20.3
+pragma operator, 6.10.9                                       ptrdiff_t type, 7.17.1, 7.19, 7.20.3, 7.21.6.1,
+pragma preprocessing directive, 6.10.6, 6.11.8                      7.21.6.2, 7.28.2.1, 7.28.2.2
+precedence of operators, 6.5                                  punctuators, 6.4.6
+precedence of syntax rules, 5.1.1.2                           putc function, 7.21.1, 7.21.7.7, 7.21.7.8
+precision, 6.2.6.2, 6.3.1.1, 7.21.6.1, 7.28.2.1               putchar function, 7.21.1, 7.21.7.8
+  excess, 5.2.4.2.2, 6.3.1.8, 6.8.6.4                         puts function, 7.21.1, 7.21.7.9
+predefined macro names, 6.10.8, 6.11.9                         putwc function, 7.21.1, 7.28.3.8, 7.28.3.9
+prefix decrement operator (--), 6.3.2.1, 6.5.3.1               putwchar function, 7.21.1, 7.28.3.9
+prefix increment operator (++), 6.3.2.1, 6.5.3.1
+preprocessing concatenation, 6.10.3.3                         qsort function, 7.22.5, 7.22.5.2
+preprocessing directives, 5.1.1.2, 6.10                       qsort_s function, K.3.6.3, K.3.6.3.2
+preprocessing file, 5.1.1.1, 6.10                              qualified types, 6.2.5
+preprocessing numbers, 6.4, 6.4.8                             qualified version of type, 6.2.5
+preprocessing operators                                       question-mark escape sequence (\?), 6.4.4.4
+  #, 6.10.3.2                                                 quick_exit function, 7.22.4.3, 7.22.4.4,
+  ##, 6.10.3.3                                                     7.22.4.7
+  _Pragma, 5.1.1.2, 6.10.9                                    quiet NaN, 5.2.4.2.2
+  defined, 6.10.1
+preprocessing tokens, 5.1.1.2, 6.4, 6.10                      raise function, 7.14, 7.14.1.1, 7.14.2.1, 7.22.4.1
+preprocessing translation unit, 5.1.1.1                       rand function, 7.22, 7.22.2.1, 7.22.2.2
+
+[page 670]
+
+RAND_MAX macro, 7.22, 7.22.2.1                               restrict-qualified type, 6.2.5, 6.7.3
+range                                                        return statement, 6.8.6.4, F.6
+   excess, 5.2.4.2.2, 6.3.1.8, 6.8.6.4                       rewind function, 7.21.5.3, 7.21.7.10, 7.21.9.5,
+range error, 7.12.1, 7.12.5.4, 7.12.5.5, 7.12.6.1,                 7.28.3.10
+      7.12.6.2, 7.12.6.3, 7.12.6.5, 7.12.6.6,                right-shift assignment operator (>>=), 6.5.16.2
+      7.12.6.13, 7.12.7.3, 7.12.7.4, 7.12.8.2,               right-shift operator (>>), 6.2.6.2, 6.5.7
+      7.12.8.3, 7.12.8.4, 7.12.9.5, 7.12.9.7,                rint functions, 7.12.9.4, F.3, F.10.6.4
+      7.12.11.3, 7.12.12.1, 7.12.13.1                        rint type-generic macro, 7.24
+rank, see integer conversion rank                            round functions, 7.12.9.6, F.10.6.6
+read-modify-write operations, 5.1.2.4                        round type-generic macro, 7.24
+real floating type conversion, 6.3.1.4, 6.3.1.5,              rounding mode, floating point, 5.2.4.2.2
+      6.3.1.7, F.3, F.4                                      RSIZE_MAX macro, K.3.3, K.3.4, K.3.5.1.2,
+real floating types, 6.2.5                                          K.3.5.3.5, K.3.5.3.6, K.3.5.3.12, K.3.5.3.13,
+real type domain, 6.2.5                                            K.3.5.4.1, K.3.6.2.1, K.3.6.3.1, K.3.6.3.2,
+real types, 6.2.5                                                  K.3.6.4.1, K.3.6.5.1, K.3.6.5.2, K.3.7.1.1,
+real-floating, 7.12.3                                               K.3.7.1.2, K.3.7.1.3, K.3.7.1.4, K.3.7.2.1,
+realloc function, 7.22.3, 7.22.3.5                                 K.3.7.2.2, K.3.7.3.1, K.3.7.4.1, K.3.7.4.2,
+recommended practice, 3.17                                         K.3.8.2.1, K.3.8.2.2, K.3.9.1.3, K.3.9.1.4,
+recursion, 6.5.2.2                                                 K.3.9.1.8, K.3.9.1.9, K.3.9.2.1.1, K.3.9.2.1.2,
+recursive function call, 6.5.2.2                                   K.3.9.2.1.3, K.3.9.2.1.4, K.3.9.2.2.1,
+redefinition of macro, 6.10.3                                       K.3.9.2.2.2, K.3.9.2.3.1, K.3.9.3.1.1,
+reentrancy, 5.1.2.3, 5.2.3                                         K.3.9.3.2.1, K.3.9.3.2.2
+   library functions, 7.1.4                                  rsize_t type, K.3.3, K.3.4, K.3.5, K.3.5.3.2,
+referenced type, 6.2.5                                             K.3.6, K.3.7, K.3.8, K.3.9, K.3.9.1.2
+register storage-class specifier, 6.7.1, 6.9                  runtime-constraint, 3.18
+relational expressions, 6.5.8                                Runtime-constraint handling functions, K.3.6.1
+relaxed atomic operations, 5.1.2.4                           rvalue, 6.3.2.1
+release fence, 7.17.4
+release operation, 5.1.2.4                                   same scope, 6.2.1
+release sequence, 5.1.2.4                                    save calling environment function, 7.13.1
+reliability of data, interrupted, 5.1.2.3                    scalar types, 6.2.5
+remainder assignment operator (%=), 6.5.16.2                 scalbln function, 7.12.6.13, F.3, F.10.3.13
+remainder functions, 7.12.10, F.10.7                         scalbln type-generic macro, 7.24
+remainder functions, 7.12.10.2, 7.12.10.3, F.3,              scalbn function, 7.12.6.13, F.3, F.10.3.13
+      F.10.7.2                                               scalbn type-generic macro, 7.24
+remainder operator (%), 6.2.6.2, 6.5.5                       scanf function, 7.21.1, 7.21.6.4, 7.21.6.11
+remainder type-generic macro, 7.24                           scanf_s function, K.3.5.3.4, K.3.5.3.11
+remove function, 7.21.4.1, 7.21.4.4, K.3.5.1.2               scanlist, 7.21.6.2, 7.28.2.2
+remquo functions, 7.12.10.3, F.3, F.10.7.3                   scanset, 7.21.6.2, 7.28.2.2
+remquo type-generic macro, 7.24                              SCHAR_MAX macro, 5.2.4.2.1
+rename function, 7.21.4.2                                    SCHAR_MIN macro, 5.2.4.2.1
+representations of types, 6.2.6                              SCNcFASTN macros, 7.8.1
+   pointer, 6.2.5                                            SCNcLEASTN macros, 7.8.1
+rescanning and replacement, 6.10.3.4                         SCNcMAX macros, 7.8.1
+reserved identifiers, 6.4.1, 7.1.3, K.3.1.2                   SCNcN macros, 7.8.1
+restartable multibyte/wide character conversion              SCNcPTR macros, 7.8.1
+      functions, 7.27.1, 7.28.6.3, K.3.9.3.1                 scope of identifier, 6.2.1, 6.9.2
+restartable multibyte/wide string conversion                 search functions
+      functions, 7.28.6.4, K.3.9.3.2                           string, 7.23.5, K.3.7.3
+restore calling environment function, 7.13.2                   utility, 7.22.5, K.3.6.3
+restrict type qualifier, 6.7.3, 6.7.3.1                         wide string, 7.28.4.5, K.3.9.2.3
+
+[page 671]
+
+SEEK_CUR macro, 7.21.1, 7.21.9.2                                 sign and magnitude, 6.2.6.2
+SEEK_END macro, 7.21.1, 7.21.9.2                                 sign bit, 6.2.6.2
+SEEK_SET macro, 7.21.1, 7.21.9.2                                 signal function, 7.14.1.1, 7.22.4.5, 7.22.4.7
+selection statements, 6.8.4                                      signal handler, 5.1.2.3, 5.2.3, 7.14.1.1, 7.14.2.1
+self-referential structure, 6.7.2.3                              signal handling functions, 7.14.1
+semicolon punctuator (;), 6.7, 6.7.2.1, 6.8.3,                   signal.h header, 7.14, 7.30.6
+      6.8.5, 6.8.6                                               signaling NaN, 5.2.4.2.2, F.2.1
+separate compilation, 5.1.1.1                                    signals, 5.1.2.3, 5.2.3, 7.14.1
+separate translation, 5.1.1.1                                    signbit macro, 7.12.3.6, F.3
+sequence points, 5.1.2.3, 6.5.2.2, 6.5.13, 6.5.14,               signed char type, 6.2.5, 7.21.6.1, 7.21.6.2,
+      6.5.15, 6.5.17, 6.7.3, 6.7.3.1, 6.7.6, 6.8,                     7.28.2.1, 7.28.2.2, K.3.5.3.2, K.3.9.1.2
+      7.1.4, 7.21.6, 7.22.5, 7.28.2, C, K.3.6.3                  signed character, 6.3.1.1
+sequenced after, see sequenced before                            signed integer types, 6.2.5, 6.3.1.3, 6.4.4.1
+sequenced before, 5.1.2.3, 6.5, 6.5.2.2, 6.5.2.4,                signed type conversion, 6.3.1.1, 6.3.1.3, 6.3.1.4,
+      6.5.16, see also indeterminately sequenced,                     6.3.1.8
+      unsequenced                                                signed types, 6.2.5, 6.7.2
+sequencing of statements, 6.8                                    significand part, 6.4.4.2
+set_constraint_handler_s function,                               SIGSEGV macro, 7.14, 7.14.1.1
+      K.3.1.4, K.3.6.1.1, K.3.6.1.2, K.3.6.1.3                   SIGTERM macro, 7.14
+setbuf function, 7.21.3, 7.21.5.1, 7.21.5.5                      simple assignment operator (=), 6.5.16.1
+setjmp macro, 7.1.3, 7.13.1.1, 7.13.2.1                          sin functions, 7.12.4.6, F.10.1.6
+setjmp.h header, 7.13                                            sin type-generic macro, 7.24, G.7
+setlocale function, 7.11.1.1, 7.11.2.1                           single-byte character, 3.7.1, 5.2.1.2
+setvbuf function, 7.21.1, 7.21.3, 7.21.5.1,                      single-byte/wide character conversion functions,
+      7.21.5.5, 7.21.5.6                                              7.28.6.1
+shall, 4                                                         single-precision arithmetic, 5.1.2.3
+shift expressions, 6.5.7                                         single-quote escape sequence (\'), 6.4.4.4, 6.4.5
+shift sequence, 7.1.1                                            singularity, 7.12.1
+shift states, 5.2.1.2                                            sinh functions, 7.12.5.5, F.10.2.5
+short identifier, character, 5.2.4.1, 6.4.3                       sinh type-generic macro, 7.24, G.7
+short int type, 6.2.5, 6.3.1.1, 6.7.2, 7.21.6.1,                 SIZE_MAX macro, 7.20.3
+      7.21.6.2, 7.28.2.1, 7.28.2.2                               size_t type, 6.2.8, 6.5.3.4, 7.19, 7.20.3, 7.21.1,
+short int type conversion, 6.3.1.1, 6.3.1.3,                          7.21.6.1, 7.21.6.2, 7.22, 7.23.1, 7.26.1, 7.27,
+      6.3.1.4, 6.3.1.8                                                7.28.1, 7.28.2.1, 7.28.2.2, K.3.3, K.3.4,
+SHRT_MAX macro, 5.2.4.2.1                                             K.3.5, K.3.6, K.3.7, K.3.8, K.3.9, K.3.9.1.2
+SHRT_MIN macro, 5.2.4.2.1                                        sizeof operator, 6.3.2.1, 6.5.3, 6.5.3.4
+side effects, 5.1.2.3, 6.2.6.1, 6.3.2.2, 6.5, 6.5.2.4,           snprintf function, 7.21.6.5, 7.21.6.12,
+      6.5.16, 6.7.9, 6.8.3, 7.6, 7.6.1, 7.21.7.5,                     K.3.5.3.5
+      7.21.7.7, 7.28.3.6, 7.28.3.8, F.8.1, F.9.1,                snprintf_s function, K.3.5.3.5, K.3.5.3.6
+      F.9.3                                                      snwprintf_s function, K.3.9.1.3, K.3.9.1.4
+SIG_ATOMIC_MAX macro, 7.20.3                                     sorting utility functions, 7.22.5, K.3.6.3
+SIG_ATOMIC_MIN macro, 7.20.3                                     source character set, 5.1.1.2, 5.2.1
+sig_atomic_t type, 5.1.2.3, 7.14, 7.14.1.1,                      source file, 5.1.1.1
+      7.20.3                                                        name, 6.10.4, 6.10.8.1
+SIG_DFL macro, 7.14, 7.14.1.1                                    source file inclusion, 6.10.2
+SIG_ERR macro, 7.14, 7.14.1.1                                    source lines, 5.1.1.2
+SIG_IGN macro, 7.14, 7.14.1.1                                    source text, 5.1.1.2
+SIGABRT macro, 7.14, 7.22.4.1                                    space character (' '), 5.1.1.2, 5.2.1, 6.4, 7.4.1.3,
+SIGFPE macro, 7.12.1, 7.14, 7.14.1.1, J.5.17                          7.4.1.10, 7.29.2.1.3
+SIGILL macro, 7.14, 7.14.1.1                                     sprintf function, 7.21.6.6, 7.21.6.13, K.3.5.3.6
+SIGINT macro, 7.14                                               sprintf_s function, K.3.5.3.5, K.3.5.3.6
+
+[page 672]
+
+sqrt functions, 7.12.7.5, F.3, F.10.4.5                         do, 6.8.5.2
+sqrt type-generic macro, 7.24                                   else, 6.8.4.1
+srand function, 7.22.2.2                                        expression, 6.8.3
+sscanf function, 7.21.6.7, 7.21.6.14                            for, 6.8.5.3
+sscanf_s function, K.3.5.3.7, K.3.5.3.14                        goto, 6.8.6.1
+standard error stream, 7.21.1, 7.21.3, 7.21.10.4                if, 6.8.4.1
+standard headers, 4, 7.1.2                                      iteration, 6.8.5
+   <assert.h>, 7.2                                              jump, 6.8.6
+   <complex.h>, 5.2.4.2.2, 6.10.8.3, 7.1.2, 7.3,                labeled, 6.8.1
+        7.24, 7.30.1, G.6, J.5.17                               null, 6.8.3
+   <ctype.h>, 7.4, 7.30.2                                       return, 6.8.6.4, F.6
+   <errno.h>, 7.5, 7.30.3, K.3.2                                selection, 6.8.4
+   <fenv.h>, 5.1.2.3, 5.2.4.2.2, 7.6, 7.12, F, H                sequencing, 6.8
+   <float.h>, 4, 5.2.4.2.2, 7.7, 7.22.1.3,                      switch, 6.8.4.2
+        7.28.4.1.1                                              while, 6.8.5.1
+   <inttypes.h>, 7.8, 7.30.4                                 static assertions, 6.7.10
+   <iso646.h>, 4, 7.9                                        static storage duration, 6.2.4
+   <limits.h>, 4, 5.2.4.2.1, 6.2.5, 7.10                     static storage-class specifier, 6.2.2, 6.2.4, 6.7.1
+   <locale.h>, 7.11, 7.30.5                                  static, in array declarators, 6.7.6.2, 6.7.6.3
+   <math.h>, 5.2.4.2.2, 6.5, 7.12, 7.24, F, F.10,            static_assert declaration, 6.7.10
+        J.5.17                                               static_assert macro, 7.2
+   <setjmp.h>, 7.13                                          stdalign.h header, 4, 7.15
+   <signal.h>, 7.14, 7.30.6                                  stdarg.h header, 4, 6.7.6.3, 7.16
+   <stdalign.h>, 4, 7.15                                     stdatomic.h header, 6.10.8.3, 7.1.2, 7.17
+   <stdarg.h>, 4, 6.7.6.3, 7.16                              stdbool.h header, 4, 7.18, 7.30.7, H
+   <stdatomic.h>, 6.10.8.3, 7.1.2, 7.17                      STDC, 6.10.6, 6.11.8
+   <stdbool.h>, 4, 7.18, 7.30.7, H                           stddef.h header, 4, 6.3.2.1, 6.3.2.3, 6.4.4.4,
+   <stddef.h>, 4, 6.3.2.1, 6.3.2.3, 6.4.4.4,                       6.4.5, 6.5.3.4, 6.5.6, 7.19, K.3.3
+        6.4.5, 6.5.3.4, 6.5.6, 7.19, K.3.3                   stderr macro, 7.21.1, 7.21.2, 7.21.3
+   <stdint.h>, 4, 5.2.4.2, 6.10.1, 7.8, 7.20,                stdin macro, 7.21.1, 7.21.2, 7.21.3, 7.21.6.4,
+        7.30.8, K.3.3, K.3.4                                       7.21.7.6, 7.28.2.12, 7.28.3.7, K.3.5.3.4,
+   <stdio.h>, 5.2.4.2.2, 7.21, 7.30.9, F, K.3.5                    K.3.5.4.1, K.3.9.1.14
+   <stdlib.h>, 5.2.4.2.2, 7.22, 7.30.10, F,                  stdint.h header, 4, 5.2.4.2, 6.10.1, 7.8, 7.20,
+        K.3.1.4, K.3.6                                             7.30.8, K.3.3, K.3.4
+   <string.h>, 7.23, 7.30.11, K.3.7                          stdio.h header, 5.2.4.2.2, 7.21, 7.30.9, F, K.3.5
+   <tgmath.h>, 7.24, G.7                                     stdlib.h header, 5.2.4.2.2, 7.22, 7.30.10, F,
+   <threads.h>, 6.10.8.3, 7.1.2, 7.25                              K.3.1.4, K.3.6
+   <time.h>, 7.26, K.3.8                                     stdout macro, 7.21.1, 7.21.2, 7.21.3, 7.21.6.3,
+   <uchar.h>, 6.4.4.4, 6.4.5, 7.27                                 7.21.7.8, 7.21.7.9, 7.28.2.11, 7.28.3.9
+   <wchar.h>, 5.2.4.2.2, 7.21.1, 7.28, 7.30.12,              storage duration, 6.2.4
+        F, K.3.9                                             storage order of array, 6.5.2.1
+   <wctype.h>, 7.29, 7.30.13                                 storage unit (bit-field), 6.2.6.1, 6.7.2.1
+standard input stream, 7.21.1, 7.21.3                        storage-class specifiers, 6.7.1, 6.11.5
+standard integer types, 6.2.5                                strcat function, 7.23.3.1
+standard output stream, 7.21.1, 7.21.3                       strcat_s function, K.3.7.2.1
+standard signed integer types, 6.2.5                         strchr function, 7.23.5.2
+state-dependent encoding, 5.2.1.2, 7.22.7, K.3.6.4           strcmp function, 7.23.4, 7.23.4.2
+statements, 6.8                                              strcoll function, 7.11.1.1, 7.23.4.3, 7.23.4.5
+   break, 6.8.6.3                                            strcpy function, 7.23.2.3
+   compound, 6.8.2                                           strcpy_s function, K.3.7.1.3
+   continue, 6.8.6.2                                         strcspn function, 7.23.5.3
+
+[page 673]
+
+streams, 7.21.2, 7.22.4.4                                                7.22.1.4, 7.28.2.2
+   fully buffered, 7.21.3                                          strtoull function, 7.8.2.3, 7.22.1.2, 7.22.1.4
+   line buffered, 7.21.3                                           strtoumax function, 7.8.2.3
+   orientation, 7.21.2                                             struct hack, see flexible array member
+   standard error, 7.21.1, 7.21.3                                  struct lconv, 7.11
+   standard input, 7.21.1, 7.21.3                                  struct tm, 7.26.1
+   standard output, 7.21.1, 7.21.3                                 structure
+   unbuffered, 7.21.3                                                 arrow operator (->), 6.5.2.3
+strerror function, 7.21.10.4, 7.23.6.2                                content, 6.7.2.3
+strerror_s function, K.3.7.4.2, K.3.7.4.3                             dot operator (.), 6.5.2.3
+strerrorlen_s function, K.3.7.4.3                                     initialization, 6.7.9
+strftime function, 7.11.1.1, 7.26.3, 7.26.3.5,                        member alignment, 6.7.2.1
+      7.28.5.1, K.3.8.2, K.3.8.2.1, K.3.8.2.2                         member name space, 6.2.3
+stricter, 6.2.8                                                       member operator (.), 6.3.2.1, 6.5.2.3
+strictly conforming program, 4                                        pointer operator (->), 6.5.2.3
+string, 7.1.1                                                         specifier, 6.7.2.1
+   comparison functions, 7.23.4                                       tag, 6.2.3, 6.7.2.3
+   concatenation functions, 7.23.3, K.3.7.2                           type, 6.2.5, 6.7.2.1
+   conversion functions, 7.11.1.1                                  strxfrm function, 7.11.1.1, 7.23.4.5
+   copying functions, 7.23.2, K.3.7.1                              subnormal floating-point numbers, 5.2.4.2.2
+   library function conventions, 7.23.1                            subscripting, 6.5.2.1
+   literal, 5.1.1.2, 5.2.1, 6.3.2.1, 6.4.5, 6.5.1, 6.7.9           subtraction assignment operator (-=), 6.5.16.2
+   miscellaneous functions, 7.23.6, K.3.7.4                        subtraction operator (-), 6.2.6.2, 6.5.6, F.3, G.5.2
+   numeric conversion functions, 7.8.2.3, 7.22.1                   suffix
+   search functions, 7.23.5, K.3.7.3                                  floating constant, 6.4.4.2
+string handling header, 7.23, K.3.7                                   integer constant, 6.4.4.1
+string.h header, 7.23, 7.30.11, K.3.7                              switch body, 6.8.4.2
+stringizing, 6.10.3.2, 6.10.9                                      switch case label, 6.8.1, 6.8.4.2
+strlen function, 7.23.6.3                                          switch default label, 6.8.1, 6.8.4.2
+strncat function, 7.23.3.2                                         switch statement, 6.8.1, 6.8.4.2
+strncat_s function, K.3.7.2.2                                      swprintf function, 7.28.2.3, 7.28.2.7,
+strncmp function, 7.23.4, 7.23.4.4                                       K.3.9.1.3, K.3.9.1.4
+strncpy function, 7.23.2.4                                         swprintf_s function, K.3.9.1.3, K.3.9.1.4
+strncpy_s function, K.3.7.1.4                                      swscanf function, 7.28.2.4, 7.28.2.8
+strnlen_s function, K.3.7.4.4                                      swscanf_s function, K.3.9.1.5, K.3.9.1.10
+stronger, 6.2.8                                                    symbols, 3
+strpbrk function, 7.23.5.4                                         synchronization operation, 5.1.2.4
+strrchr function, 7.23.5.5                                         synchronize with, 5.1.2.4
+strspn function, 7.23.5.6                                          syntactic categories, 6.1
+strstr function, 7.23.5.7                                          syntax notation, 6.1
+strtod function, 7.12.11.2, 7.21.6.2, 7.22.1.3,                    syntax rule precedence, 5.1.1.2
+      7.28.2.2, F.3                                                syntax summary, language, A
+strtof function, 7.12.11.2, 7.22.1.3, F.3                          system function, 7.22.4.8
+strtoimax function, 7.8.2.3
+strtok function, 7.23.5.8                                          tab characters, 5.2.1, 6.4
+strtok_s function, K.3.7.3.1                                       tag compatibility, 6.2.7
+strtol function, 7.8.2.3, 7.21.6.2, 7.22.1.2,                      tag name space, 6.2.3
+      7.22.1.4, 7.28.2.2                                           tags, 6.7.2.3
+strtold function, 7.12.11.2, 7.22.1.3, F.3                         tan functions, 7.12.4.7, F.10.1.7
+strtoll function, 7.8.2.3, 7.22.1.2, 7.22.1.4                      tan type-generic macro, 7.24, G.7
+strtoul function, 7.8.2.3, 7.21.6.2, 7.22.1.2,                     tanh functions, 7.12.5.6, F.10.2.6
+
+[page 674]
+
+tanh type-generic macro, 7.24, G.7                            toupper function, 7.4.2.2
+temporary lifetime, 6.2.4                                     towctrans function, 7.29.3.2.1, 7.29.3.2.2
+tentative definition, 6.9.2                                    towlower function, 7.29.3.1.1, 7.29.3.2.1
+terms, 3                                                      towupper function, 7.29.3.1.2, 7.29.3.2.1
+text streams, 7.21.2, 7.21.7.10, 7.21.9.2, 7.21.9.4           translation environment, 5, 5.1.1
+tgamma functions, 7.12.8.4, F.10.5.4                          translation limits, 5.2.4.1
+tgamma type-generic macro, 7.24                               translation phases, 5.1.1.2
+tgmath.h header, 7.24, G.7                                    translation unit, 5.1.1.1, 6.9
+thrd_create function, 7.25.1, 7.25.5.1                        trap, see perform a trap
+thrd_current function, 7.25.5.2                               trap representation, 3.19.4, 6.2.6.1, 6.2.6.2,
+thrd_detach function, 7.25.5.3                                      6.3.2.3, 6.5.2.3
+thrd_equal function, 7.25.5.4                                 trigonometric functions
+thrd_exit function, 7.25.5.5                                     complex, 7.3.5, G.6.1
+thrd_join function, 7.25.5.6                                     real, 7.12.4, F.10.1
+thrd_sleep function, 7.25.5.7                                 trigraph sequences, 5.1.1.2, 5.2.1.1
+thrd_start_t type, 7.25.1                                     true macro, 7.18
+thrd_t type, 7.25.1                                           trunc functions, 7.12.9.8, F.10.6.8
+thrd_yield function, 7.25.5.8                                 trunc type-generic macro, 7.24
+thread of execution, 5.1.2.4, 7.1.4, 7.6, 7.22.4.6            truncation, 6.3.1.4, 7.12.9.8, 7.21.3, 7.21.5.3
+thread storage duration, 6.2.4, 7.6                           truncation toward zero, 6.5.5
+threads header, 7.25                                          tss_create function, 7.25.6.1
+threads.h header, 6.10.8.3, 7.1.2, 7.25                       tss_delete function, 7.25.6.2
+time                                                          TSS_DTOR_ITERATIONS macro, 7.25.1
+   broken down, 7.26.1, 7.26.2.3, 7.26.3, 7.26.3.1,           tss_dtor_t type, 7.25.1
+         7.26.3.3, 7.26.3.4, 7.26.3.5, K.3.8.2.1,             tss_get function, 7.25.6.3
+         K.3.8.2.3, K.3.8.2.4                                 tss_set function, 7.25.6.4
+   calendar, 7.26.1, 7.26.2.2, 7.26.2.3, 7.26.2.4,            tss_t type, 7.25.1
+         7.26.3.2, 7.26.3.3, 7.26.3.4, K.3.8.2.2,             two's complement, 6.2.6.2, 7.20.1.1
+         K.3.8.2.3, K.3.8.2.4                                 type category, 6.2.5
+   components, 7.26.1, K.3.8.1                                type conversion, 6.3
+   conversion functions, 7.26.3, K.3.8.2                      type definitions, 6.7.8
+      wide character, 7.28.5                                  type domain, 6.2.5, G.2
+   local, 7.26.1                                              type names, 6.7.7
+   manipulation functions, 7.26.2                             type punning, 6.5.2.3
+   normalized broken down, K.3.8.1, K.3.8.2.1                 type qualifiers, 6.7.3
+time function, 7.26.2.4                                       type specifiers, 6.7.2
+time.h header, 7.26, K.3.8                                    type-generic macro, 7.24, G.7
+time_t type, 7.26.1                                           typedef declaration, 6.7.8
+TIME_UTC macro, 7.25.7.1                                      typedef storage-class specifier, 6.7.1, 6.7.8
+tm structure type, 7.26.1, 7.28.1, K.3.8.1                    types, 6.2.5
+TMP_MAX macro, 7.21.1, 7.21.4.3, 7.21.4.4                        atomic, 5.1.2.3, 6.2.5, 6.2.6.1, 6.3.2.1, 6.5.2.3,
+TMP_MAX_S macro, K.3.5, K.3.5.1.1, K.3.5.1.2                           6.5.2.4, 6.5.16.2, 6.7.2.4, 6.10.8.3, 7.17.6
+tmpfile function, 7.21.4.3, 7.22.4.4                             character, 6.7.9
+tmpfile_s function, K.3.5.1.1, K.3.5.1.2                         compatible, 6.2.7, 6.7.2, 6.7.3, 6.7.6
+tmpnam function, 7.21.1, 7.21.4.3, 7.21.4.4,                     complex, 6.2.5, G
+      K.3.5.1.2                                                  composite, 6.2.7
+tmpnam_s function, K.3.5, K.3.5.1.1, K.3.5.1.2                   const qualified, 6.7.3
+token, 5.1.1.2, 6.4, see also preprocessing tokens               conversions, 6.3
+token concatenation, 6.10.3.3                                    imaginary, G
+token pasting, 6.10.3.3                                          restrict qualified, 6.7.3
+tolower function, 7.4.2.1                                        volatile qualified, 6.7.3
+
+[page 675]
+
+uchar.h header, 6.4.4.4, 6.4.5, 7.27                      universal character name, 6.4.3
+UCHAR_MAX macro, 5.2.4.2.1                                unnormalized floating-point numbers, 5.2.4.2.2
+UINT_FASTN_MAX macros, 7.20.2.3                           unqualified type, 6.2.5
+uint_fastN_t types, 7.20.1.3                              unqualified version of type, 6.2.5
+uint_least16_t type, 7.27                                 unsequenced, 5.1.2.3, 6.5, 6.5.16, see also
+uint_least32_t type, 7.27                                       indeterminately sequenced, sequenced
+UINT_LEASTN_MAX macros, 7.20.2.2                                before
+uint_leastN_t types, 7.20.1.2                             unsigned char type, K.3.5.3.2, K.3.9.1.2
+UINT_MAX macro, 5.2.4.2.1                                 unsigned integer suffix, u or U, 6.4.4.1
+UINTMAX_C macro, 7.20.4.2                                 unsigned integer types, 6.2.5, 6.3.1.3, 6.4.4.1
+UINTMAX_MAX macro, 7.8.2.3, 7.8.2.4, 7.20.2.5             unsigned type conversion, 6.3.1.1, 6.3.1.3,
+uintmax_t type, 7.20.1.5, 7.21.6.1, 7.21.6.2,                   6.3.1.4, 6.3.1.8
+     7.28.2.1, 7.28.2.2                                   unsigned types, 6.2.5, 6.7.2, 7.21.6.1, 7.21.6.2,
+UINTN_C macros, 7.20.4.1                                        7.28.2.1, 7.28.2.2
+UINTN_MAX macros, 7.20.2.1                                unspecified behavior, 3.4.4, 4, J.1
+uintN_t types, 7.20.1.1                                   unspecified value, 3.19.3
+UINTPTR_MAX macro, 7.20.2.4                               uppercase letter, 5.2.1
+uintptr_t type, 7.20.1.4                                  use of library functions, 7.1.4
+ULLONG_MAX macro, 5.2.4.2.1, 7.22.1.4,                    USHRT_MAX macro, 5.2.4.2.1
+     7.28.4.1.2                                           usual arithmetic conversions, 6.3.1.8, 6.5.5, 6.5.6,
+ULONG_MAX macro, 5.2.4.2.1, 7.22.1.4,                           6.5.8, 6.5.9, 6.5.10, 6.5.11, 6.5.12, 6.5.15
+     7.28.4.1.2                                           UTF-16, 6.10.8.2
+unary arithmetic operators, 6.5.3.3                       UTF-32, 6.10.8.2
+unary expression, 6.5.3                                   UTF-8 string literal, see string literal
+unary minus operator (-), 6.5.3.3, F.3                    utilities, general, 7.22, K.3.6
+unary operators, 6.5.3                                       wide string, 7.28.4, K.3.9.2
+unary plus operator (+), 6.5.3.3
+unbuffered stream, 7.21.3                                 va_arg macro, 7.16, 7.16.1, 7.16.1.1, 7.16.1.2,
+undef preprocessing directive, 6.10.3.5, 7.1.3,                7.16.1.4, 7.21.6.8, 7.21.6.9, 7.21.6.10,
+     7.1.4                                                     7.21.6.11, 7.21.6.12, 7.21.6.13, 7.21.6.14,
+undefined behavior, 3.4.3, 4, J.2                               7.28.2.5, 7.28.2.6, 7.28.2.7, 7.28.2.8,
+underscore character, 6.4.2.1                                  7.28.2.9, 7.28.2.10, K.3.5.3.9, K.3.5.3.11,
+underscore, leading, in identifier, 7.1.3                       K.3.5.3.14, K.3.9.1.7, K.3.9.1.10, K.3.9.1.12
+ungetc function, 7.21.1, 7.21.7.10, 7.21.9.2,             va_copy macro, 7.1.3, 7.16, 7.16.1, 7.16.1.1,
+     7.21.9.3                                                  7.16.1.2, 7.16.1.3
+ungetwc function, 7.21.1, 7.28.3.10                       va_end macro, 7.1.3, 7.16, 7.16.1, 7.16.1.3,
+Unicode, 7.27, see also char16_t type,                         7.16.1.4, 7.21.6.8, 7.21.6.9, 7.21.6.10,
+     char32_t type, wchar_t type                               7.21.6.11, 7.21.6.12, 7.21.6.13, 7.21.6.14,
+Unicode required set, 6.10.8.2                                 7.28.2.5, 7.28.2.6, 7.28.2.7, 7.28.2.8,
+union                                                          7.28.2.9, 7.28.2.10, K.3.5.3.9, K.3.5.3.11,
+  arrow operator (->), 6.5.2.3                                 K.3.5.3.14, K.3.9.1.7, K.3.9.1.10, K.3.9.1.12
+  content, 6.7.2.3                                        va_list type, 7.16, 7.16.1.3
+  dot operator (.), 6.5.2.3                               va_start macro, 7.16, 7.16.1, 7.16.1.1,
+  initialization, 6.7.9                                        7.16.1.2, 7.16.1.3, 7.16.1.4, 7.21.6.8,
+  member alignment, 6.7.2.1                                    7.21.6.9, 7.21.6.10, 7.21.6.11, 7.21.6.12,
+  member name space, 6.2.3                                     7.21.6.13, 7.21.6.14, 7.28.2.5, 7.28.2.6,
+  member operator (.), 6.3.2.1, 6.5.2.3                        7.28.2.7, 7.28.2.8, 7.28.2.9, 7.28.2.10,
+  pointer operator (->), 6.5.2.3                               K.3.5.3.9, K.3.5.3.11, K.3.5.3.14, K.3.9.1.7,
+  specifier, 6.7.2.1                                            K.3.9.1.10, K.3.9.1.12
+  tag, 6.2.3, 6.7.2.3                                     value, 3.19
+  type, 6.2.5, 6.7.2.1                                    value bits, 6.2.6.2
+
+[page 676]
+
+variable arguments, 6.10.3, 7.16                             vswscanf function, 7.28.2.8
+variable arguments header, 7.16                              vswscanf_s function, K.3.9.1.10
+variable length array, 6.7.6, 6.7.6.2, 6.10.8.3              vwprintf function, 7.21.1, 7.28.2.9, K.3.9.1.11
+variably modified type, 6.7.6, 6.7.6.2, 6.10.8.3              vwprintf_s function, K.3.9.1.11
+vertical-tab character, 5.2.1, 6.4                           vwscanf function, 7.21.1, 7.28.2.10, 7.28.3.10
+vertical-tab escape sequence (\v), 5.2.2, 6.4.4.4,           vwscanf_s function, K.3.9.1.12
+     7.4.1.10
+vfprintf function, 7.21.1, 7.21.6.8, K.3.5.3.8               warnings, I
+vfprintf_s function, K.3.5.3.8, K.3.5.3.9,                   wchar.h header, 5.2.4.2.2, 7.21.1, 7.28, 7.30.12,
+     K.3.5.3.11, K.3.5.3.14                                      F, K.3.9
+vfscanf function, 7.21.1, 7.21.6.8, 7.21.6.9                 WCHAR_MAX macro, 7.20.3, 7.28.1
+vfscanf_s function, K.3.5.3.9, K.3.5.3.11,                   WCHAR_MIN macro, 7.20.3, 7.28.1
+     K.3.5.3.14                                              wchar_t type, 3.7.3, 6.4.5, 6.7.9, 6.10.8.2, 7.19,
+vfwprintf function, 7.21.1, 7.28.2.5, K.3.9.1.6                  7.20.3, 7.21.6.1, 7.21.6.2, 7.22, 7.28.1,
+vfwprintf_s function, K.3.9.1.6                                  7.28.2.1, 7.28.2.2
+vfwscanf function, 7.21.1, 7.28.2.6, 7.28.3.10               wcrtomb function, 7.21.3, 7.21.6.2, 7.28.2.2,
+vfwscanf_s function, K.3.9.1.7                                   7.28.6.3.3, 7.28.6.4.2, K.3.6.5.2, K.3.9.3.1,
+visibility of identifier, 6.2.1                                   K.3.9.3.2.2
+visible sequence of side effects, 5.1.2.4                    wcrtomb_s function, K.3.9.3.1, K.3.9.3.1.1
+visible side effect, 5.1.2.4                                 wcscat function, 7.28.4.3.1
+VLA, see variable length array                               wcscat_s function, K.3.9.2.2.1
+void expression, 6.3.2.2                                     wcschr function, 7.28.4.5.1
+void function parameter, 6.7.6.3                             wcscmp function, 7.28.4.4.1, 7.28.4.4.4
+void type, 6.2.5, 6.3.2.2, 6.7.2, K.3.5.3.2,                 wcscoll function, 7.28.4.4.2, 7.28.4.4.4
+     K.3.9.1.2                                               wcscpy function, 7.28.4.2.1
+void type conversion, 6.3.2.2                                wcscpy_s function, K.3.9.2.1.1
+volatile storage, 5.1.2.3                                    wcscspn function, 7.28.4.5.2
+volatile type qualifier, 6.7.3                                wcsftime function, 7.11.1.1, 7.28.5.1
+volatile-qualified type, 6.2.5, 6.7.3                         wcslen function, 7.28.4.6.1
+vprintf function, 7.21.1, 7.21.6.8, 7.21.6.10,               wcsncat function, 7.28.4.3.2
+     K.3.5.3.10                                              wcsncat_s function, K.3.9.2.2.2
+vprintf_s function, K.3.5.3.9, K.3.5.3.10,                   wcsncmp function, 7.28.4.4.3
+     K.3.5.3.11, K.3.5.3.14                                  wcsncpy function, 7.28.4.2.2
+vscanf function, 7.21.1, 7.21.6.8, 7.21.6.11                 wcsncpy_s function, K.3.9.2.1.2
+vscanf_s function, K.3.5.3.9, K.3.5.3.11,                    wcsnlen_s function, K.3.9.2.4.1
+     K.3.5.3.14                                              wcspbrk function, 7.28.4.5.3
+vsnprintf function, 7.21.6.8, 7.21.6.12,                     wcsrchr function, 7.28.4.5.4
+     K.3.5.3.12                                              wcsrtombs function, 7.28.6.4.2, K.3.9.3.2
+vsnprintf_s function, K.3.5.3.9, K.3.5.3.11,                 wcsrtombs_s function, K.3.9.3.2, K.3.9.3.2.2
+     K.3.5.3.12, K.3.5.3.13, K.3.5.3.14                      wcsspn function, 7.28.4.5.5
+vsnwprintf_s function, K.3.9.1.8, K.3.9.1.9                  wcsstr function, 7.28.4.5.6
+vsprintf function, 7.21.6.8, 7.21.6.13,                      wcstod function, 7.21.6.2, 7.28.2.2
+     K.3.5.3.13                                              wcstod function, 7.28.4.1.1
+vsprintf_s function, K.3.5.3.9, K.3.5.3.11,                  wcstof function, 7.28.4.1.1
+     K.3.5.3.12, K.3.5.3.13, K.3.5.3.14                      wcstoimax function, 7.8.2.4
+vsscanf function, 7.21.6.8, 7.21.6.14                        wcstok function, 7.28.4.5.7
+vsscanf_s function, K.3.5.3.9, K.3.5.3.11,                   wcstok_s function, K.3.9.2.3.1
+     K.3.5.3.14                                              wcstol function, 7.8.2.4, 7.21.6.2, 7.28.2.2,
+vswprintf function, 7.28.2.7, K.3.9.1.8,                         7.28.4.1.2
+     K.3.9.1.9                                               wcstold function, 7.28.4.1.1
+vswprintf_s function, K.3.9.1.8, K.3.9.1.9                   wcstoll function, 7.8.2.4, 7.28.4.1.2
+
+[page 677]
+
+wcstombs function, 7.22.8.2, 7.28.6.4                           7.29.1
+wcstombs_s function, K.3.6.5.2                               wmemchr function, 7.28.4.5.8
+wcstoul function, 7.8.2.4, 7.21.6.2, 7.28.2.2,               wmemcmp function, 7.28.4.4.5
+     7.28.4.1.2                                              wmemcpy function, 7.28.4.2.3
+wcstoull function, 7.8.2.4, 7.28.4.1.2                       wmemcpy_s function, K.3.9.2.1.3
+wcstoumax function, 7.8.2.4                                  wmemmove function, 7.28.4.2.4
+wcsxfrm function, 7.28.4.4.4                                 wmemmove_s function, K.3.9.2.1.4
+wctob function, 7.28.6.1.2, 7.29.2.1                         wmemset function, 7.28.4.6.2
+wctomb function, 7.22.7.3, 7.22.8.2, 7.28.6.3                wprintf function, 7.21.1, 7.28.2.9, 7.28.2.11,
+wctomb_s function, K.3.6.4.1                                    K.3.9.1.13
+wctrans function, 7.29.3.2.1, 7.29.3.2.2                     wprintf_s function, K.3.9.1.13
+wctrans_t type, 7.29.1, 7.29.3.2.2                           wscanf function, 7.21.1, 7.28.2.10, 7.28.2.12,
+wctype function, 7.29.2.2.1, 7.29.2.2.2                         7.28.3.10
+wctype.h header, 7.29, 7.30.13                               wscanf_s function, K.3.9.1.12, K.3.9.1.14
+wctype_t type, 7.29.1, 7.29.2.2.2
+weaker, 6.2.8                                                xor macro, 7.9
+WEOF macro, 7.28.1, 7.28.3.1, 7.28.3.3, 7.28.3.6,            xor_eq macro, 7.9
+     7.28.3.7, 7.28.3.8, 7.28.3.9, 7.28.3.10,                xtime type, 7.25.1, 7.25.3.5, 7.25.4.4, 7.25.5.7,
+     7.28.6.1.1, 7.29.1                                          7.25.7.1
+while statement, 6.8.5.1                                     xtime_get function, 7.25.7.1
+white space, 5.1.1.2, 6.4, 6.10, 7.4.1.10,
+     7.29.2.1.10
+white-space characters, 6.4
+wide character, 3.7.3
+  case mapping functions, 7.29.3.1
+     extensible, 7.29.3.2
+  classification functions, 7.29.2.1
+     extensible, 7.29.2.2
+  constant, 6.4.4.4
+  formatted input/output functions, 7.28.2,
+        K.3.9.1
+  input functions, 7.21.1
+  input/output functions, 7.21.1, 7.28.3
+  output functions, 7.21.1
+  single-byte conversion functions, 7.28.6.1
+wide string, 7.1.1
+wide string comparison functions, 7.28.4.4
+wide string concatenation functions, 7.28.4.3,
+     K.3.9.2.2
+wide string copying functions, 7.28.4.2, K.3.9.2.1
+wide string literal, see string literal
+wide string miscellaneous functions, 7.28.4.6,
+     K.3.9.2.4
+wide string numeric conversion functions, 7.8.2.4,
+     7.28.4.1
+wide string search functions, 7.28.4.5, K.3.9.2.3
+wide-oriented stream, 7.21.2
+width, 6.2.6.2
+WINT_MAX macro, 7.20.3
+WINT_MIN macro, 7.20.3
+wint_t type, 7.20.3, 7.21.6.1, 7.28.1, 7.28.2.1,
+
+[page 678]