summaryrefslogtreecommitdiffstats
path: root/.vim/doc/crefvim.txt
diff options
context:
space:
mode:
Diffstat (limited to '.vim/doc/crefvim.txt')
-rwxr-xr-x.vim/doc/crefvim.txt14112
1 files changed, 14112 insertions, 0 deletions
diff --git a/.vim/doc/crefvim.txt b/.vim/doc/crefvim.txt
new file mode 100755
index 0000000..8fea502
--- /dev/null
+++ b/.vim/doc/crefvim.txt
@@ -0,0 +1,14112 @@
+*crefvim.txt* C-Reference Manual for Vim
+ Vim version 6.0
+
+
+ *crefvim* *C-Reference*
+ C-Reference for Vim
+ ======================
+ Version 1.0.3
+ 27. Nov. 2004
+
+ (c) 2002-2004 by Christian Habermann
+ christian (at) habermann-net (point) de
+
+
+ "The GNU C Library Reference Manual" is
+ copyright (c) 1993 - 2002 by the
+ Free Software Foundation, Inc.
+
+
+ See |crefvimdoc| for further information on the project CRefVim.
+ See |crvdoc-copyright| for copyright and licenses.
+
+
+ Table of C o n t e n t s:
+
+ Introduction..................|crv-intro|
+
+ Chapter I LANGUAGE......................|crv-language|
+ I.1 Characters..................|crv-lngChar|
+ I.1.1 Allowed Characters........|crv-lngAllowedChar|
+ I.1.2 Comment...................|crv-lngComment|
+ I.1.3 Escape-Sequences..........|crv-lngEscSeq|
+
+ I.2 Keywords....................|crv-keywords|
+
+ I.3 Operators...................|crv-operators|
+ I.3.1 Overview..................|crv-opOverview|
+ I.3.2 Arithmetic................|crv-opArithmetic|
+ I.3.3 Logical...................|crv-opLogical|
+ I.3.4 Relational................|crv-opRelational|
+ I.3.5 Bitwise...................|crv-opBitwise|
+ I.3.6 Assignments...............|crv-opAssigns|
+ I.3.7 Others....................|crv-opOthers|
+ I.3.7.1 Size of.................|crv-opSizeOf|
+ I.3.7.2 Address of..............|crv-opAddress|
+ I.3.7.3 Contents of.............|crv-opContents|
+ I.3.7.4 Conditional.............|crv-opConditional|
+ I.3.7.5 Series..................|crv-opSeries|
+ I.3.7.6 Type Cast...............|crv-opTypeCast|
+ I.3.7.7 Struct/Union Selectors..|crv-opStructUnionSel|
+ I.3.7.8 Array Selector..........|crv-opArraySel|
+ I.3.7.9 Parentheses.............|crv-opParenth|
+ I.3.8 Precedence................|crv-opPrecedence|
+
+ I.4 Punctuators.................|crv-punctuators|
+
+ I.5 Datatypes...................|crv-datatypes|
+ I.5.1 Overview..................|crv-dtOverview|
+ I.5.1.1 Type Specifiers.........|crv-dtTypeSpecifiers|
+ I.5.1.2 Type Grouping...........|crv-dtTypeGrouping|
+ I.5.2 Sizes and Ranges..........|crv-dtSizeRange|
+ I.5.2 Formats...................|crv-dtFormats|
+ I.5.2.1 Integer.................|crv-dtFormatsInt|
+ I.5.2.2 Floating-Point..........|crv-dtFormatsFloat|
+ I.5.2.2.1 Basics................|crv-dtFormatsFPBasics|
+ I.5.2.2.2 Types.................|crv-dtFormatsFPTypes|
+ I.5.3 void Type.................|crv-dtVoid|
+ I.5.4 Arrays....................|crv-dtArrays|
+ I.5.5 Structures................|crv-dtStructurs|
+ I.5.6 Unions....................|crv-dtUnions|
+ I.5.7 Bit-Fields................|crv-dtBitFields|
+ I.5.8 Enumerated Tags...........|crv-dtEnumerate|
+ I.5.9 Strings...................|crv-dtStrings|
+ I.5.10 Type Definitions..........|crv-dtTypeDef|
+ I.5.11 Storage Classes...........|crv-dtStorageClasses|
+ I.5.12 Qualifiers................|crv-dtQualifiers|
+ I.5.13 Pointers..................|crv-dtPointers|
+ I.5.13.1 Variables...............|crv-dtPtrVars|
+ I.5.13.2 Functions...............|crv-dtPtrFuncs|
+ I.5.13.3 Arithmetics.............|crv-dtPtrArithmetics|
+ I.5.14 Type Cast.................|crv-dtTypeCast|
+ I.5.14.1 Explicit................|crv-dtTypeCastExpl|
+ I.5.14.2 Implicit................|crv-dtTypeCastImpl|
+ I.5.15 Constants.................|crv-dtConstants|
+ I.5.15.1 Integer.................|crv-dtConstInt|
+ I.5.15.2 Floating-Point..........|crv-dtConstFloat|
+ I.5.15.3 Character...............|crv-dtConstChar|
+
+ I.6 Statements..................|crv-statements|
+ I.6.1 if-else...................|crv-stIfElse|
+ I.6.2 switch....................|crv-stSwitch|
+ I.6.3 while Loop................|crv-stWhile|
+ I.6.4 do-while Loop.............|crv-stDoWhile|
+ I.6.5 for Loop..................|crv-stFor|
+ I.6.6 break.....................|crv-stBreak|
+ I.6.7 continue..................|crv-stContinue|
+ I.6.8 goto......................|crv-stGoto|
+ I.6.9 return....................|crv-stReturn|
+ I.6.10 Null Statement............|crv-stNull|
+
+ I.7 Functions...................|crv-functions|
+ I.7.1 Definition................|crv-fuDefinition|
+ I.7.2 Protoype..................|crv-fuPrototype|
+ I.7.3 Conversion................|crv-fuConversion|
+ I.7.4 Storage Classes...........|crv-fuStorageClasses|
+ I.7.5 Specifier.................|crv-fuSpecifier|
+ I.7.6 main()....................|crv-fuMain|
+
+ I.8 Preprocessor................|crv-preprocessor|
+ I.8.1 Macros....................|crv-preMacros|
+ I.8.1.1 Definition #define......|crv-preMacDef|
+ I.8.1.2 Cancellation #undef.....|crv-preMacCancel|
+ I.8.1.3 # Operator..............|crv-preMac#Operator|
+ I.8.1.4 ## Operator.............|crv-preMac##Operator|
+ I.8.1.5 Predefined Macros.......|crv-preMacPredefined|
+ I.8.2 Conditional Compilation...|crv-preConditional|
+ I.8.2.1 defined Operator........|crv-preCondDefined|
+ I.8.2.2 #if Directive...........|crv-preCondIf|
+ I.8.2.3 #ifdef Directive........|crv-preCondIfdef|
+ I.8.2.4 #ifndef Directive.......|crv-preCondIfndef|
+ I.8.2.5 #else Directive.........|crv-preCondElse|
+ I.8.2.6 #elif Directive.........|crv-preCondElif|
+ I.8.2.7 #endif Directive........|crv-preCondEndif|
+ I.8.3 File Inclusion #include...|crv-preSourceInc|
+ I.8.4 Line Control #line........|crv-preLine|
+ I.8.5 Error Directive #error....|crv-preError|
+ I.8.6 Pragma Directive #pragma..|crv-prePragma|
+ I.8.7 Null Directive #..........|crv-preNull|
+
+
+ Chapter II STANDARD C LIBRARY............|crv-stdCLib|
+ II.1 Standard Headers............|crv-libHeaders|
+
+ II.2 <assert.h> Diagnostics......|crv-libAssertH|
+
+ II.3 <complex.h> Complex Math....|crv-libComplexH|
+ II.3.1 Macros....................|crv-libCHMac|
+ II.3.2 Pragmas...................|crv-libCHPrag|
+ II.3.3 Trigonometric.............|crv-libCHTrig|
+ II.3.4 Hyperbolic................|crv-libCHHyper|
+ II.3.5 Exponential & Logarithmic.|crv-libCHExpLog|
+ II.3.6 Power & Absolute..........|crv-libCHPower|
+ II.3.7 Manipulating..............|crv-libCHMani|
+
+ II.4 <ctype.h> Character.........|crv-libCtypeH|
+ II.4.1 Character Handling........|crv-libCharHandling|
+ II.4.2 Character Mapping.........|crv-libCharMapping|
+
+ II.5 <errno.h> Error Codes.......|crv-libErrnoH|
+
+ II.6 <fenv.h> FPU Status.........|crv-libFenvH|
+ II.6.1 Pragmas...................|crv-libFHPrag|
+ II.6.2 Exceptions................|crv-libFHExceptions|
+ II.6.3 Rounding..................|crv-libFHRounding|
+ II.6.4 Environment...............|crv-libFHEnv|
+
+ II.7 <float.h> Floating Point....|crv-libFloatH|
+
+ II.8 <inttypes.h> Absolute Value.|crv-libInttypesH|
+
+ II.9 <iso646.h> Alternatives.....|crv-libIso646H|
+
+ II.10 <limits.h> Limits of Int....|crv-libLimitsH|
+ II.10.1 Range of Integer Types....|crv-libLHRange|
+ II.10.2 Width of Type.............|crv-libLHWidth|
+ II.10.3 Conversion and Properties.|crv-libLHConv|
+
+ II.11 <local.h> Localization......|crv-libLocalH|
+ II.11.1 Categories................|crv-libLocHCat|
+ II.11.2 Standard Locales..........|crv-libLocHLoc|
+ II.11.3 Information Structure.....|crv-libLocHInfo|
+ II.11.4 Functions.................|crv-libLocHFunc|
+
+ II.12 <math.h> Mathematics........|crv-libMathH|
+ II.12.1 Error Conditions..........|crv-libMHErr|
+ II.12.2 Classification Macros.....|crv-libMHClass|
+ II.12.3 Comparison Macros.........|crv-libMHCmp|
+ II.12.4 Trigonometric.............|crv-libMHTrig|
+ II.12.5 Hyperbolic................|crv-libMHHyper|
+ II.12.6 Exponential & Logarithmic.|crv-libMHExpLog|
+ II.12.7 Power & Absolute..........|crv-libMHPower|
+ II.12.8 Error & Gamma.............|crv-libMHErrGam|
+ II.12.9 Nearest Integer...........|crv-libMHNear|
+ II.12.10 Remainder.................|crv-libMHRem|
+ II.12.11 Manipulating..............|crv-libMHMani|
+ II.12.12 Miscellaneous.............|crv-libMHMisc|
+
+ II.13 <setjmp.h> Nonlocal Jumps...|crv-libSetjmpH|
+
+ II.14 <signal.h> Signal Handling..|crv-libSignalH|
+ II.14.1 Types.....................|crv-libSHTyp|
+ II.14.2 Signals...................|crv-libSHSig|
+ II.14.3 Functions.................|crv-libSHFunc|
+
+ II.15 <stdarg.h> Arguments........|crv-libStdargH|
+
+ II.16 <stdbool.h> Boolean Type....|crv-libStdboolH|
+
+ II.17 <stddef.h> Definitions......|crv-libStddefH|
+
+ II.18 <stdint.h> Integer Type.....|crv-libStdintH|
+ II.18.1 Integer Types.............|crv-libSdHType|
+ II.18.1.1 Exact-Width.............|crv-libSdHTExact|
+ II.18.1.2 Minimum-Width...........|crv-libSdHTMin|
+ II.18.1.3 Fastest Minimum-Width...|crv-libSdHTFast|
+ II.18.1.4 Greatest-Width..........|crv-libSdHTGreat|
+ II.18.1.5 Hold Pointer............|crv-libSdHTPtr|
+ II.18.2 Limits....................|crv-libSdHTLim|
+ II.18.2.1 Exact-Width.............|crv-libSdHLExact|
+ II.18.2.2 Minimum-Width...........|crv-libSdHLMin|
+ II.18.2.3 Fastest Minimum-Width...|crv-libSdHLFast|
+ II.18.2.4 Greatest-Width..........|crv-libSdHLGreat|
+ II.18.2.5 Others..................|crv-libSdHLOther|
+ II.18.2.6 Hold Pointer............|crv-libSdHLPtr|
+ II.18.3 Macros....................|crv-libSdHMac|
+
+ II.19 <stdio.h> Input/Output......|crv-libStdioH|
+ II.19.1 Types.....................|crv-libSIOHType|
+ II.19.2 Macros....................|crv-libSIOHMac|
+ II.19.3 Streams and Files.........|crv-libSIOHStrmFile|
+ II.19.4 File Operations...........|crv-libSIOHFOp|
+ II.19.5 File Access...............|crv-libSIOHFAcc|
+ II.19.6 Formatted Input/Output....|crv-libSIOHIO|
+ II.19.6.1 Format Control..........|crv-libSIOHIOFormat|
+ II.19.6.1.1 Output, printf()......|crv-libSIOHIOFout|
+ II.19.6.1.2 Input, scanf()........|crv-libSIOHIOFin|
+ II.19.6.2 Functions...............|crv-libSIOHIOFunc|
+ II.19.7 Character Input/Output....|crv-libSIOHCIO|
+ II.19.8 Direct Input/Output.......|crv-libSIOHDIO|
+ II.19.9 File Positioning..........|crv-libSIOHFPos|
+ II.19.10 Error Handling............|crv-libSIOHErr|
+
+ II.20 <stdlib.h> Utilities........|crv-libStdlibH|
+ II.20.1 Types.....................|crv-libSLHType|
+ II.20.2 Macros....................|crv-libSLHMac|
+ II.20.3 Numeric Conversion........|crv-libSLHnum|
+ II.20.4 Pseudo-Random.............|crv-libSLHrand|
+ II.20.5 Memory Management.........|crv-libSLHmem|
+ II.20.6 Communication.............|crv-libSLHcom|
+ II.20.7 Searching and Sorting.....|crv-libSLHsearch|
+ II.20.8 Integer Arithmetic........|crv-libSLHintarith|
+ II.20.9 Multibyte/Wide Character..|crv-libSLHmulchar|
+ II.20.10 Multibyte/Wide String.....|crv-libSLHmulstrng|
+
+ II.21 <string.h> String...........|crv-libStringH|
+ II.21.1 Types.....................|crv-libSRHType|
+ II.21.2 Macros....................|crv-libSRHMac|
+ II.21.3 Copying...................|crv-libSRHCopy|
+ II.21.4 Concatenation.............|crv-libSRHConcat|
+ II.21.5 Comparison................|crv-libSRHCmp|
+ II.21.6 Search....................|crv-libSRHSearch|
+ II.21.7 Miscellaneous.............|crv-libSRHMisc|
+
+ II.22 <tgmath.h> Type-Generic.....|crv-libTgmathH|
+
+ II.23 <time.h> Date and Time......|crv-libTimeH|
+ II.23.1 Types.....................|crv-libTHType|
+ II.23.2 Macros....................|crv-libTHMac|
+ II.23.3 Time Manipulation.........|crv-libTHMani|
+ II.23.4 Time Conversion...........|crv-libTHConv|
+
+ II.24 <wchar.h> Wide Utilities....|crv-libWcharH|
+ II.24.1 Types.....................|crv-libWCHType|
+ II.24.2 Macros....................|crv-libWCHMac|
+ II.24.3 Formatted Input/Output....|crv-libWCHIO|
+ II.24.4 Character Input/Output....|crv-libWCHCIO|
+ II.24.5 String Utilities..........|crv-libWCHStrng|
+ II.24.5.1 Numeric Conversions.....|crv-libWCHNum|
+ II.24.5.2 Copying.................|crv-libWCHCopy|
+ II.24.5.3 Concatenation...........|crv-libWCHConcat|
+ II.24.5.4 Comparison..............|crv-libWCHCmp|
+ II.24.5.5 Search..................|crv-libWCHSearch|
+ II.24.5.6 Miscellaneous...........|crv-libWCHMisc|
+ II.24.6 Time Conversions..........|crv-libWCHTimeConv|
+ II.24.7 Character Conversions.....|crv-libWCHCharConv|
+
+ II.25 <wctype.h> Wide Character...|crv-libWctypeH|
+ II.25.1 Types.....................|crv-libWTHType|
+ II.25.2 Macros....................|crv-libWTHMac|
+ II.25.3 Classification............|crv-libWTHClass|
+ II.25.3.1 Wide Character..........|crv-libWTHCwide|
+ II.25.3.2 Extensible Wide Char....|crv-libWTHCextens|
+ II.25.4 Mapping...................|crv-libWTHMap|
+ II.25.4.1 Wide Character..........|crv-libWTHMwide|
+ II.25.4.2 Extensible Wide Char....|crv-libWTHMextens|
+
+
+ Appendix A GLOSSARY............................|crv-glossary|
+ B BIBLIOGRAPHY........................|crv-bibliography|
+ C COPYRIGHT & LICENSES................|crvdoc-copyright|
+ C.1 GNU General Public License........|crvdoc-licGPL|
+ C.2 GNU Free Documentation License....|crvdoc-licFDL|
+ C.3 GNU Lesser General Public License.|crvdoc-licLGPL|
+ C.4 Free Software Needs Free
+ Documentation.....................|crvdoc-licFreeDoc|
+ D AUTHOR..............................|crvdoc-author|
+ E CREDITS.............................|crvdoc-credits|
+ F HISTORY.............................|crvdoc-history|
+
+
+Happy viming...
+
+
+==============================================================================
+Introduction *crv-intro*
+==============================================================================
+
+
+This document is a C-reference manual. It is NOT a tutorial on how to write
+C programs. It is simply a quick reference to the standard C programming
+language and its standard library functions.
+The language description is based on the standard ISO/IEC 9899:1999(E), second
+edition. But this reference does not contain all information from this
+standard, it tries to reflect only the most important information.
+
+DISCLAIMER: All efforts have been taken to make sure that all information
+ in this document is correct, but no guarantee is implied or
+ intended.
+
+This C-reference manual is designed to be best viewed with Vim and syntax-
+highlighting enabled. Furthermore when using Vim it's possible to navigate
+through this document by tags. Vim is a very powerful text-editor available
+for close to all platforms.
+
+This C-reference is divided into two chapters and an appendix. The first
+chapter deals mainly with the language. The second chapter shows the
+functions of the standard C library. The appendix includes a glossary and
+other items of interest.
+
+
+
+
+
+==============================================================================
+Chapter I LANGUAGE *crv-language*
+==============================================================================
+
+
+
+==============================================================================
+I.1 Characters *crv-lngChar*
+
+
+------------------------------------------------------------------------------
+I.1.1 Allowed Characters *crv-lngAllowedChar*
+
+In a C source code the following characters are allowed:
+
+ Digits: 0...9
+ Letters: a-z A-Z
+ Others: ! " # & ' + - * / % , . : ; < = > ? \ ^ _ | ~
+ parentheses ( )
+ brackets [ ]
+ braces { }
+ space, tabulator, form feed
+
+ Trigraphs: ??= # ??) ] ??! | *crv-trigraph*
+ ??( [ ??' ^ ??> }
+ ??/ \ ??< { ??- ~
+ If a trigraph sequence is found in the source code it is
+ replaced with the corresponding single character. This allows
+ to enter some special symbols on platforms not providing these
+ symbols.
+
+
+------------------------------------------------------------------------------
+I.1.2 Comment *crv-lngComment*
+
+There are two types of comments:
+ - block comment $/*...*/$
+ - line comment $//$
+
+Block Comment: *crv-lngBlockComment*
+ A block comment starts with $/*$ and ends with $*/$. All characters between
+ start and end are treated as comment. Nesting is not allowed.
+
+Line Comment: *crv-lngLineComment*
+ A line comment starts with $//$ and ends at the next new-line character
+ (new-line character is not included).
+
+
+
+------------------------------------------------------------------------------
+I.1.3 Escape-Sequences *crv-lngEscSeq*
+
+
+ Escape Sequence | Name | Meaning
+ ----------------+-----------------+------------------------------------------
+ \' | | single quote '
+ \" | | double quote "
+ \? | | question mark ?
+ \\ | | backslash \
+ | |
+ \a | Alert | produces an audible or visible alert
+ \b | Backspace | moves cursor back one position
+ \f | Form Feed | moves cursor to start of next page
+ \n | New Line | moves cursor to start of next line
+ \r | Carriage Return | moves cursor to start of current line
+ \t | horiz. tabulator| moves cursor to next horiz. tab. position
+ \v | vert. tabulator | moves cursor to next vert. tab. position
+ | |
+ \0octal-digits | | octal character
+ \xhex-digits | | hexadecimal character
+ | |
+ \0 | null character | character with the value 0
+ | |
+ \<cr> | | concatenates actual line with next one
+ | | (backslash immediately followed by a
+ | | new-line)
+
+
+
+==============================================================================
+I.2 Keywords *crv-keywords*
+
+Keywords are words with a special meaning in C. They must not be used for any
+other purposes. Keywords are case sensitive.
+
+
+ Keyword | Description
+ ---------------+----------------------------
+ $ auto $| storage-class specifier
+ $ break $| statement
+ $ case $| label
+ $ char $| type
+ $ const $| type qualifier
+ $ continue $| statement
+ $ default $| label
+ $ do $| statement
+ $ double $| type
+ $ else $| statement
+ $ enum $| type
+ $ extern $| storage-class specifier
+ $ float $| type
+ $ for $| statement
+ $ goto $| statement
+ $ if $| statement
+ $ inline $| function specifier
+ $ int $| type
+ $ long $| type
+ $ register $| storage-class specifier
+ $ restrict $| type qualifier
+ $ return $| statement
+ $ short $| type
+ $ signed $| type
+ $ sizeof $| operator
+ $ static $| storage-class specifier
+ $ struct $| specifier
+ $ switch $| statement
+ $ typedef $| declaration
+ $ union $| specifier
+ $ unsigned $| type
+ $ void $| type
+ $ volatile $| type qualifier
+ $ while $| statement
+ $ _Bool $| type
+ $ _Complex $| type
+ $ _Imaginary $| type
+
+
+
+
+==============================================================================
+I.3 Operators *crv-operators*
+
+
+------------------------------------------------------------------------------
+I.3.1 Overview *crv-opOverview*
+
+
+ Operator | Usage | Description
+ --------------+-----------------+-------------------------------------------
+ | |
+ |crv-opArithmetic|
+Arithmetic~
+$ +$[unary] |$+operand $| positive sign, same like$operand$
+$ -$[unary] |$-operand $| negation of$operand$
+ | |
+$ +$[binary] |$expr1 + expr2 $| addition
+$ -$[binary] |$expr1 - expr2 $| substraction
+$ / $ |$expr1 / expr2 $| division
+$ * $ |$expr1 * expr2 $| multiplication
+$ % $ |$expr1 % expr2 $| modulo
+$ --$[postfix] |$operand-- $|$operand$before decrementing by 1
+$ --$[prefix] |$--operand $|$operand$after decrementing by 1
+$ ++$[postfix] |$operand++ $|$operand$before incrementing by 1
+$ ++$[prefix] |$++operand $|$operand$after incrementing by 1
+ | |
+ |crv-opLogical|
+Logical~
+$ && $ |$expr1 && expr2 $| logical AND
+$ || $ |$expr1 || expr2 $| logical OR
+$ ! $ |$!expr1 $| logical NOT
+ | |
+ |crv-opRelational|
+Relational~
+$ ==$ |$expr1 == expr2 $| compare for equal
+$ !=$ |$expr1 != expr2 $| compare for not equal
+$ > $ |$expr1 > expr2 $| compare for "greater than"
+$ < $ |$expr1 < expr2 $| compare for "less than"
+$ >=$ |$expr1 >= expr2 $| compare for "greater than or equal"
+$ <=$ |$expr1 <= expr2 $| compare for "less than or equal"
+ | |
+ |crv-opBitwise|
+Bitwise~
+$ & $ |$expr1 & expr2 $| bitwise AND
+$ | $ |$expr1 | expr2 $| bitwise OR
+$ ^ $ |$expr1 ^ expr2 $| bitwise XOR
+$ << $ |$expr1 << expr2 $| shift bits to left
+$ >> $ |$expr1 >> expr2 $| shift bits to right
+$ ~ $ |$~expr1 $| one's complement
+ | |
+ |crv-opAssigns|
+Assignment~
+$ = $ |$expr1 = expr2 $| assignment
+$ *= $ |$expr1 *= expr2 $|$expr1 = expr1 * expr2 $
+$ /= $ |$expr1 /= expr2 $|$expr1 = expr1 / expr2 $
+$ %= $ |$expr1 %= expr2 $|$expr1 = expr1 % expr2 $
+$ += $ |$expr1 += expr2 $|$expr1 = expr1 + expr2 $
+$ -= $ |$expr1 -= expr2 $|$expr1 = expr1 - expr2 $
+$ <<=$ |$expr1 <<= expr2$|$expr1 = expr1 << expr2 $
+$ >>=$ |$expr1 >>= expr2$|$expr1 = expr1 >> expr2 $
+$ &= $ |$expr1 &= expr2 $|$expr1 = expr1 & expr2 $
+$ ^= $ |$expr1 ^= expr2 $|$expr1 = expr1 ^ expr2 $
+$ |= $ |$expr1 |= expr2 $|$expr1 = expr1 | expr2 $
+ | |
+ |crv-opOthers|
+Others~
+$ sizeof $ |$sizeof a $| size of element$a$in bytes
+$ & $ |$&expr1 $| address of$expr1$
+$ * $ |$*expr1 $| contents of$expr1$, $expr1$is a pointer
+$ ?: $ |$a?expr1:expr2 $| conditional operator$a!=0:expr1 else expr2$
+$ , $ |$expr1,expr2 $| comma operator
+$(type-name)$ |$(float)expr1 $| explicit type cast
+$ . $ |$a.b $| struct/union selector,$a$is struct/union
+$ -> $ |$a->b $| struct/union selector,$a$is pointer to
+ | | struct/union
+$ [] $ |$a[0] $| array selector
+$ () $ |$(a + b) * c $| group operators or
+ |$func() $| declare functions
+ | |
+ --------------+-----------------+-------------------------------------------
+
+
+The sections below give further information on operators.
+
+
+------------------------------------------------------------------------------
+I.3.2 Arithmetic *crv-opArithmetic*
+
+$+operand$ *crv-opPosSign*
+----------
+positive sign
+
+Examples: >
+ a = +15;
+ a = +b;
+ func(3.12E+3);
+
+
+$-operand$ *crv-opNegSign*
+----------
+negative sign, negation
+
+Examples: >
+ a = -15;
+ a = -a;
+
+
+$expr1 + expr2$ *crv-opAdd*
+---------------
+This adds the two expressions.
+
+Examples: >
+ a = b + c;
+ a = b + 42;
+ a = func(b + c);
+
+
+$expr1 - expr2$ *crv-opSub*
+---------------
+Substract$expr2$from$expr1$.
+
+Examples: >
+ a = b - c;
+ a = b - 42;
+ a = func(b - c);
+
+
+$expr1 / expr2$ *crv-opDivide*
+---------------
+Divide$expr1$by$expr2$.
+If$expr2$is 0, behavior is undefined.
+
+Examples: >
+ a = b / c;
+ a = b / 42;
+ a = func(c / 3);
+
+
+$expr1 * expr2$ *crv-opMultiply*
+---------------
+Multiply$expr1$by$expr2$.
+
+Examples: >
+ a = b * c;
+ a = b * 42;
+ a = func(c * 3);
+
+
+$expr1 % expr2$ *crv-opModulo*
+---------------
+Modulo operator. The result is the value of the remainder after
+dividing$expr1$by$expr2$.
+Both expressions must be integer types (char, short, int, long...,
+signed or unsigned).
+If$expr2$is 0, behavior is undefined.
+
+Examples: >
+ a = 0 % 3; // result = 0
+ a = 1 % 3; // result = 1
+ a = 2 % 3; // result = 2
+ a = 3 % 3; // result = 0
+ a = 4 % 3; // result = 1
+ a = 5 % 3; // result = 2
+ a = 6 % 3; // result = 0
+ a = 7 % 3; // result = 1
+ a = 7 % (-3); // result = 1
+ a = (-7) % 3; // result = -1
+ a = (-7) % (-3); // result = -1
+
+ a = b % c;
+ func(a % c);
+
+
+$operand--$ *crv-opPostDec*
+-----------
+This is a postfix operation (unary operator after operand).
+$operand$will be decremented by 1 AFTER the expression is
+evaluated.
+The value 1 of the appropriate type is subtracted.
+So e.g. integer and float can be used as$operand$.
+
+Example: >
+ int nA;
+ float fA;
+
+ nA = 3;
+ printf("%d", nA--); // output 3
+ printf("%d", nA); // output 2
+
+ fA = 3.2f;
+ fA--;
+ printf("%f", fA); // output 2.2
+
+
+$--operand$ *crv-opPreDec*
+-----------
+This is a prefix operation (unary operator before operand).
+$operand$will be decremented by 1 BEFORE the expression is
+evaluated.
+The value 1 of the appropriate type is subtracted.
+So e.g. integer and float can be used as$operand$.
+
+Example: >
+ int nA;
+ float fA;
+
+ nA = 3;
+ printf("%d", --nA); // output 2
+ printf("%d", nA); // output 2
+
+ fA = 3.2f;
+ --fA;
+ printf("%f", fA); // output 2.2
+
+
+$operand++$ *crv-opPostInc*
+-----------
+This is a postfix operation (unary operator after operand).
+$operand$will be incremented by 1 AFTER the expression is
+evaluated.
+The value 1 of the appropriate type is added. So e.g.
+integer and float can be used as$operand$.
+
+Example: >
+ int nA;
+ float fA;
+
+ nA = 3;
+ printf("%d", nA++); // output 3
+ printf("%d", nA); // output 4
+
+ fA = 3.2f;
+ fA++;
+ printf("%f", fA); // output 4.2
+
+
+$++operand$ *crv-PreInc*
+-----------
+This is a prefix operation (unary operator before operand).
+$operand$will be incremented by 1 BEFORE the expression is
+evaluated.
+The value 1 of the appropriate type is added. So e.g.
+integer and float can be used as$operand$.
+
+Example: >
+ int nA;
+ float fA;
+
+ nA = 3;
+ printf("%d", ++nA); // output 4
+ printf("%d", nA); // output 4
+
+ fA = 3.2f;
+ ++fA;
+ printf("%f", fA); // output 4.2
+
+
+
+------------------------------------------------------------------------------
+I.3.3 Logical *crv-opLogical*
+
+An expression is FALSE if its value is 0, else it is TRUE.
+
+ATTENTION: This means TRUE is defined as unequal to 0. So never assume any
+value for TRUE, TRUE's value depends on implementation.
+
+
+$expr1 && expr2$ *crv-opLogAnd*
+----------------
+This is the logical AND.
+The expression is TRUE if both$expr1$AND$expr2$are TRUE - else it is FALSE.
+If$expr1$is equal 0,$expr2$is not evaluated.
+The result has type$int$.
+
+ $expr1$|$expr2$ || result
+ --------+--------++--------
+ 0 | 0 || 0
+ 0 | >=1 || 0
+ >=1 | 0 || 0
+ >=1 | >=1 || >=1
+
+
+$expr1 || expr2$ *crv-opLogOr*
+----------------
+This is the logical OR.
+The expression is TRUE if either$expr1$OR$expr2$is TRUE - else it is FALSE.
+If$expr1$is unequal 0,$expr2$is not evaluated.
+The result has type$int$.
+
+ $expr1$|$expr2$ || result
+ --------+--------++--------
+ 0 | 0 || 0
+ 0 | >=1 || >=1
+ >=1 | 0 || >=1
+ >=1 | >=1 || >=1
+
+
+$!expr1$ *crv-opLogNot*
+--------
+This is the logical NOT.
+The expression is TRUE if$expr1$is FALSE. The expression is FALSE if$expr1$is
+TRUE.
+The result has type$int$.
+
+ $expr1$|| result
+ ------++--------
+ 0 || >=1
+ >=1 || 0
+
+
+
+------------------------------------------------------------------------------
+I.3.4 Relational *crv-opRelational*
+
+$expr1 == expr2$ *crv-opRelEqual*
+----------------
+Equality operator. The result is 1 if operands are equal. The result is
+0 if operands are unequal.
+The result has type$int$.
+
+Example: >
+ int x, a, b;
+
+ a = 1;
+ b = 2;
+
+ if (a == 1)
+ {
+ printf("a is equal to 1");
+ }
+
+ x = a == b;
+ printf("%d", x); // output is 0, since a != b
+
+
+$expr1 != expr2$ *crv-opRelUnequal*
+----------------
+Unequality operator. The result is 1 if operands are unequal. The result is
+0 if operands are equal.
+The result has type$int$.
+
+Example: >
+ int x, a, b;
+
+ a = 1;
+ b = 2;
+
+ if (a != b)
+ {
+ printf("a is unequal to b");
+ }
+
+ x = a != b;
+ printf("%d", x); // output is 1, since a != b
+
+
+$expr1 > expr2$ *crv-opRelGT*
+---------------
+"greater than" operator. The result is 1 if value of$expr1$is greater than
+value of $expr2$, else result is 0.
+The result has type$int$.
+
+Example: >
+ int x, a, b;
+
+ a = 5;
+ b = 2;
+
+ if (a > b)
+ {
+ printf("a is greater than b");
+ }
+
+ x = a > b;
+ printf("%d", x); // output is 1, since a > b
+
+
+$expr1 < expr2$ *crv-opRelLT*
+---------------
+"less than" operator. The result is 1 if value of$expr1$is less than
+value of$expr2$, else result is 0.
+The result has type$int$.
+
+Example: >
+ int x, a, b;
+
+ a = 1;
+ b = 2;
+
+ if (a < b)
+ {
+ printf("a is less than b");
+ }
+
+ x = a < b;
+ printf("%d", x); // output is 1, since a < b
+
+
+$expr1 >= expr2$ *crv-opRelGTE*
+----------------
+"greater than or equal to" operator. The result is 1 if value of$expr1$is
+greater than or equal to value of$expr2$, else result is 0.
+The result has type$int$.
+
+Example: >
+ int x, a, b;
+
+ a = 1;
+ b = 1;
+
+ if (a >= b)
+ {
+ printf("a is greater than or equal to b");
+ }
+
+ a = 1; b = 2;
+ x = a >= b;
+ printf("%d", x); // output is 0, since a < b
+
+
+$expr1 <= expr2$ *crv-opRelLTE*
+----------------
+"less than or equal to" operator. The result is 1 if value of$expr1$is
+less than or equal to value of$expr2$, else result is 0.
+The result has type$int$.
+
+Example: >
+ int x, a, b;
+
+ a = 1;
+ b = 2;
+
+ if (a <= b)
+ {
+ printf("a is less than or equal to b");
+ }
+
+ x = a <= b;
+ printf("%d", x); // output is 1, since a <= b
+
+
+
+------------------------------------------------------------------------------
+I.3.5 Bitwise *crv-opBitwise*
+
+$expr1 & expr2$ *crv-opBitAnd*
+---------------
+Bitwise AND operator. This operator does a bitwise AND on the values
+of$expr1$and$expr2$.
+The result is a value the same size as the expressions.
+
+ $expr1$ | $expr2$ || result
+ n-th Bit | n-th Bit || n-th Bit
+ ----------+-----------++----------
+ 0 | 0 || 0
+ 0 | 1 || 0
+ 1 | 0 || 0
+ 1 | 1 || 1
+
+Example: >
+ int a, b;
+
+ b = 0x81;
+ a = b & 0xF0;
+ // value of a is: 0x80
+
+
+$expr1 | expr2$ *crv-opBitOr*
+---------------
+Bitwise OR operator. This operator does a bitwise OR on the values
+of$expr1$and$expr2$.
+The result is a value the same size as the expressions.
+
+ $expr1$ | $expr2$ || result
+ n-th Bit | n-th Bit || n-th Bit
+ ----------+-----------++----------
+ 0 | 0 || 0
+ 0 | 1 || 1
+ 1 | 0 || 1
+ 1 | 1 || 1
+
+Example: >
+ int a, b;
+
+ b = 0x81;
+ a = b | 0xF0;
+ // value of a is: 0xF1
+
+
+$expr1 ^ expr2$ *crv-opBitXor*
+---------------
+Bitwise XOR operator. This operator does a bitwise XOR on the values
+of$expr1$and$expr2$.
+The result is a value the same size as the expressions.
+
+ $expr1$ | $expr2$ || result
+ n-th Bit | n-th Bit || n-th Bit
+ ----------+-----------++----------
+ 0 | 0 || 0
+ 0 | 1 || 1
+ 1 | 0 || 1
+ 1 | 1 || 0
+
+Example: >
+ int a, b;
+
+ b = 0x81;
+ a = b ^ 0xF0;
+ // value of a is: 0x71
+
+
+$expr1 << expr2$ *crv-opBitLeftShift*
+----------------
+Bitwise left-shift operator. The result is$expr1$left-shifted$expr2$bit
+positions, vacated bits are filled with 0.
+
+IF$expr1$is an unsigned type the value of the result is:
+ $expr1$* 2^($expr2$) modulo (1 + maximum value representable in resulting
+ type)
+ELSE
+ IF$expr1$is a signed type and has a nonnegative value and
+ $expr1$* 2^($expr2$) is representable in the result type then the
+ result is:
+ $expr1$* 2^($expr2$)
+ ELSE
+ behavior is undefined
+
+Both expressions must be integer types (char, short, int, long...,
+signed or unsigned).
+The result has the type of$expr1$.
+If the value of$expr2$is negative or is greater than or equal to the
+width of$expr1$, the behavior is implementation specific.
+
+Example: >
+ int a, b, c;
+
+ a = 3;
+ b = 2;
+ c = a << b;
+ // value of c is 12
+
+
+$expr1 >> expr2$ *crv-opBitRightShift*
+----------------
+Bitwise right-shift operator. The result is$expr1$right-shifted$expr2$
+bit positions.
+
+If$expr1$has an unsigned type or if$expr1$has a signed type and a nonnegative
+value, the result is:
+ $expr1$/ 2^($expr2$)
+
+If$expr1$has a signed type and a negative value, the result is implementation
+specific. Many compilers set vacated bits to 1.
+
+Example: >
+ int a, b, c;
+
+ a = 17;
+ b = 2;
+ c = a >> b;
+ // value of c is 4
+
+
+$~expr1$ *crv-opBitCompl*
+--------
+Bitwise one's complement. A bit in the result is set if the corresponding bit
+in$expr1$is not set. A bit in the result is cleared if the corresponding bit
+in$expr1$is set.
+
+The expression must has an integer type (char, short, int, long...,
+signed or unsigned). The result has the type of$expr1$.
+
+Example: >
+ int a, b;
+
+ a = 0xF0;
+ b = ~a;
+ // value of b is 0x0F
+
+
+
+------------------------------------------------------------------------------
+I.3.6 Assignments *crv-opAssigns*
+
+
+$expr1 = expr2$ *crv-opAsAssign*
+---------------
+The value of$expr2$is assigned to$expr1$.
+
+Example: >
+ int a, b;
+
+ a = 2;
+ b = 3;
+ b = a * b;
+
+
+$expr1 *= expr2$ *crv-opAsMul*
+----------------
+Assign$expr1$the value of$expr1$multiplied by$expr2$.
+
+Same as: $expr1 = expr1 * expr2$
+
+see |crv-opMultiply|
+
+Example: >
+ int a, b;
+
+ a = 2;
+ b = 3;
+ a *= b;
+ // a has value 6
+
+
+$expr1 /= expr2$ *crv-opAsDiv*
+----------------
+Assign$expr1$the value of$expr1$divided by$expr2$.
+
+Same as: $expr1 = expr1 / expr2$
+
+see |crv-opDivide|
+
+Example: >
+ int a, b;
+
+ a = 6;
+ b = 3;
+ a /= b;
+ // a has value 2
+
+
+$expr1 %= expr2$ *crv-opAsModulo*
+----------------
+Assign$expr1$the remainder after dividing$expr1$by$expr2$.
+
+Same as: $expr1 = expr1 % expr2$
+
+see |crv-opModulo|
+
+Example: >
+ int a, b;
+
+ a = 6;
+ b = 3;
+ a %= b;
+ // a has value 0
+
+
+$expr1 += expr2$ *crv-opAsAdd*
+----------------
+Assign$expr1$the value of the sum of$expr1$and$expr2$.
+
+Same as: $expr1 = expr1 + expr2$
+
+see |crv-opAdd|
+
+Example: >
+ int a, b;
+
+ a = 6;
+ b = 3;
+ a += b;
+ // a has value 9
+
+
+
+$expr1 -= expr2$ *crv-opAsSub*
+----------------
+Assign$expr1$the value of$expr2$substracted by$expr1$.
+
+Same as: $expr1 = expr1 - expr2$
+
+see |crv-opSub|
+
+Example: >
+ int a, b;
+
+ a = 6;
+ b = 4;
+ a -= b;
+ // a has value 2
+
+
+$expr1 <<= expr2$ *crv-opAsLeftShift*
+-----------------
+Assign$expr1$the value of$expr1$left-shifted by$expr2$bit positions.
+
+Same as: $expr1 = expr1 << expr2$
+
+see |crv-opBitLeftShift|
+
+Example: >
+ int a, b;
+
+ a = 6;
+ b = 2;
+ a <<= b;
+ // a has value 24
+
+
+$expr1 >>= expr2$ *op-opAsRightShift*
+-----------------
+Assign$expr1$the value of$expr1$right-shifted by$expr2$bit positions.
+
+Same as: $expr1 = expr1 >> expr2$
+
+see |crv-opBitRightShift|
+
+Example: >
+ int a, b;
+
+ a = 6;
+ b = 1;
+ a >>= b;
+ // a has value 3
+
+
+$expr1 &= expr2$ *opAsBitAnd*
+----------------
+Assign$expr1$the value of the bitwise AND of$expr1$and$expr2$.
+
+Same as: $expr1 = expr1 & expr2$
+
+see |crv-opBitAnd|
+
+Example: >
+ int a, b;
+
+ a = 0x81;
+ b = 0x0F;
+ a &= b;
+ // a has value 0x01
+
+
+$expr1 ^= expr2$ *opAsBitXor*
+----------------
+Assign$expr1$the value of the bitwise XOR of$expr1$and$expr2$.
+
+Same as: $expr1 = expr1 ^ expr2$
+
+see |crv-opBitXor|
+
+Example: >
+ int a, b;
+
+ a = 0x81;
+ b = 0x0F;
+ a &= b;
+ // a has value 0x01
+
+
+$expr1 |= expr2$ *opAsBitOr*
+----------------
+Assign$expr1$the value of the bitwise OR of$expr1$and$expr2$.
+
+Same as: $expr1 = expr1 | expr2$
+
+see |crv-opBitOr|
+
+Example: >
+ int a, b;
+
+ a = 0x81;
+ b = 0x0F;
+ a |= b;
+ // a has value 0x8F
+
+
+
+------------------------------------------------------------------------------
+I.3.7 Others *crv-opOthers*
+
+I.3.7.1 Size of *crv-opSizeOf*
+----------------
+Operator: $sizeof$ *crv-sizeof*
+Declaration:
+ $size_t sizeof expression$
+ or
+ $size_t sizeof (type-name)$
+
+The$sizeof$operator yields the size of its operand (number of bytes).
+The operand is either an expression or a name of a type. The name of type
+must be in parenthesis.
+The result has type$size_t$which is an unsigned integer type (unsigned int,
+unsigned long,.... implementation specific).
+
+The result for$char$,$unsigned char$,$signed char$or a typedef of them is 1.
+For arrays the result is the total number of bytes used by the object.
+For structures or unions the result is the total number of bytes in the
+object including pad-bytes added by the compiler for alignment.
+
+Examples: >
+ char a[7];
+ printf("%d", sizeof a ); // prints 7
+ printf("%d", sizeof a[0] ); // prints 1
+
+ printf("%d", sizeof(float) ); // prints 4
+
+ --------
+
+ struct Test {
+ char ch;
+ float f;
+ } tst;
+
+ printf("%d", sizeof(tst) ); // print 8 (impl. specific)
+ printf("%d", sizeof(struct Test) ); // print 8 (impl. specific)
+
+
+
+I.3.7.2 Address of *crv-opAddress*
+-------------------
+Syntax: $&operand$
+
+The$&$operator returns the address of its operand. If the operand has type
+"type" the result has type "pointer to type".
+
+Operand can be:
+ - a data type that is not register nor bit-fields
+ - function designator
+ - the result of$[]$operator
+ - the result of$*$operator
+
+
+Example: >
+ int a, *ptr;
+
+ a = 3;
+ ptr = &a; // assign address of a to prt
+
+ printf("a: value = %d, address = %p", a, ptr);
+
+
+I.3.7.3 Contents of *crv-opContents*
+--------------------
+Syntax: $*operand$
+
+The$*$operator refers to the value of the object a pointer points to.
+The operand must be a pointer type.
+If the operand has type "pointer to type" the result has type "type".
+
+Example: >
+ int a, b, *ptr;
+
+ ptr = &a; // assign address of a to prt
+ *ptr = 5 // set value of object ptr points to to 5 (object is a)
+ b = *ptr; // assign value of object pointer ptr points to to b
+
+
+I.3.7.4 Conditional *crv-opConditional*
+--------------------
+Syntax: $expr1 ? expr2 : expr3$
+
+At first$expr1$is evaluated. If$expr1$is unequal 0,$expr2$is evaluated.
+If$expr1$is equal 0,$expr3$is evaluated.
+
+The result of the conditional operator is either the value of$expr2$or$expr3$,
+whichever is evaluated. The type of the result is:
+ - If$expr2$and$expr3$have the same type, the result has that type.
+ - If$expr2$and$expr3$have different types, the result has the type
+ that would be determined by the usual arithmetic conversions, were they
+ applied to$expr2$and$expr3$.
+
+Example: >
+ int a, b, max;
+
+ a = 2;
+ b = 5;
+
+ max = a > b ? a : b; // get maximum of a and b
+
+ a == 2 ? FuncA() : FuncB(); // call FuncA() if a == 2, else call FuncB()
+
+
+I.3.7.5 Series *crv-opSeries*
+---------------
+Syntax: $expr1, expr2$
+
+The comma operator$,$ allows to put two separate expressions where one is
+required.
+At first$expr1$is evaluated. Then$expr2$is evaluated. The result of the
+comma operator has the value and type of$expr2$.
+
+It is allowed to nest expressions.
+
+Example: >
+ int i, j, k;
+
+ for (i=0, j=15, k=2; i < 5; i++, j--)
+ {
+ ....
+ }
+
+ func(3, (i=3, i+6), k); // second parameter has value 9 and type int
+
+
+
+I.3.7.6 Type Cast *crv-opTypeCast*
+------------------
+Syntax: $(type-name)expr1$
+
+The type cast operator converts the value of$expr1$to$type-name$.
+
+Examples: >
+ int a, b;
+ float f;
+
+ a = 5;
+ b = 10;
+
+ f = a / b;
+ // f has value 0, integer division
+
+ f = (float)a / (float)b;
+ // f has value 0.5
+
+
+I.3.7.7 Struct/Union Selectors *crv-opStructUnionSel*
+-------------------------------
+- Struct/Union: $expr1.identifier$
+The$.$operator selects a member of a structure or union.
+$expr1$has the type of a structure or union.
+
+
+- Pointer to Struct/Union: $expr1->identifier$
+The$->$operator selects a member of a structure or union.
+$expr1$has the type of "pointer to structure" or
+"pointer to union".
+
+Examples: >
+ struct Example {
+ int element1;
+ float element2;
+ } expl;
+
+ struct Example *ptr;
+
+ ptr = &expl;
+
+ expl.element1 = 2;
+ ptr->element2 = 42.0f;
+
+
+I.3.7.8 Array Selector *crv-opArraySel*
+-----------------------
+Syntax: $expr1[expr2]...[exprN]$
+
+Selects an element of an array. First element has index 0.
+
+Examples: >
+ int a[3] = {1,2,3};
+ int b[2][3] = { {1,2,3}, {4,5,6}};
+
+ printf("%d\n", b[1][0]); // output 4
+
+ a[2] = 0; // array a contains {1,2,0}
+
+
+I.3.7.9 Parentheses *crv-opParenth*
+--------------------
+Operator:$()$
+
+The parentheses-operator is used for:
+
+- group expressions
+ $a = (b + 2) * c$
+
+- declare functions
+ $a = func(b, c + 1)$
+
+- explicit type-cast (see |crv-opTypeCast|)
+
+- statements like
+ $if (...)$
+ $for (...)$
+ $while(...)$
+ ....
+
+
+------------------------------------------------------------------------------
+I.3.8 Precedence *crv-opPrecedence*
+
+The precedence defines which operator is done before other ones
+(e.g.$a + b * c$: at first the multiplication is done then the addition).
+The following table shows the order of precedence, operators at the top have
+highest precedence.
+
+
+ Operator | Associativity
+ ---------------------------------------+----------------
+$ () [] -> . $| left to right
+$ ! ~ ++ -- + - (type-name) * & sizeof $| right to left (unary operators)
+$ * / % $| left to right
+$ + - $| left to right
+$ << >> $| left to right
+$ < <= > >= $| left to right
+$ == != $| left to right
+$ & $| left to right
+$ ^ $| left to right
+$ | $| left to right
+$ && $| left to right
+$ || $| left to right
+$ ?: $| right to left
+$ = += -= /= *= %= >>= <<= &= |= ^= $| right to left
+$ , $| left to right
+
+
+If operators have the same order of precedence, the associativity defines
+the order in which operators are done:
+E.g.
+ $ a - b - c$
+is done as
+ $(a - b) - c$
+(from left to right)
+
+
+NOTE: Precedence and associativity define which operator is done before
+other ones. But the order of evaluation of subexpressions is unspecified,
+except from function-call$()$,$&&$,$||$,$?:$and$,$. The order in which side
+effects take place is unspecified too.
+
+ Example:
+ $a = b + c * d;$
+
+ Because of the precedence a compiler has to calculate$c*d$and has
+ to add$b$and has to assign the result of that whole expression to$a$.
+ This is defined in the C standard. But a compiler is free to take e.g.
+ $b$and save it, then take$c$and then$d$and do$c*d$, add the saved value
+ of$b$and assign result to$a$. Or do any other order of evaluating the
+ subexpressions.
+ There are just a few operators that force compilers to a specified
+ sequence of evaluating subexpressions (see paragraph above).
+
+ But of course the order of evaluating subexpressions can be relevant:
+ Example: >
+ int a = 4;
+ int b;
+
+ b = ((a=2) * (a*=3)); // b either 12 or 24?
+ // a either 2 or 6? compiler specific
+<
+ If the compiler takes first the expression$(a=2)$and then$(a*=3)$the
+ result will be 12. But if the compiler takes first$(a*=3)$and then
+ $(a=2)$the result will be 24.
+
+ NOTE: Never ever write code that depends on the order of evaluating
+ expressions.
+
+
+
+
+==============================================================================
+I.4 Punctuators *crv-punctuators*
+
+Punctuators are special characters, they are not operands or identifiers.
+They have their own semantic and syntactic.
+
+ Punctuator | Example | Description
+ ------------+------------------------+---------------------------------------
+$ < > $| <stdio.h> | header name
+$ [ ] $| n = a[3]; | array delimiter
+$ ( ) $| func(a, b); | function parameter list or
+ | | expression grouping
+$ { } $| char ch[2]={'a', 'b'}; | function body, initializer list,
+ | | compound statement
+$ * $| int *ptr; | pointer declaration
+$ # $| #include | preprocessor directive
+$ , $| char ch[2]={'a', 'b'}; | argument list separator
+$ : $| label: | label
+$ ; $| a = b + c; | end of statement
+$ ... $| func(int a, ...) | variable length of argument list
+$ = $| int n = 2; | declaration initializer
+$ ' ' $| char ch = 'a'; | character constant
+$ " " $| char ch[] = "abc"; | string constant or header file name
+
+
+
+
+==============================================================================
+I.5 Datatypes *crv-datatypes*
+
+
+------------------------------------------------------------------------------
+I.5.1 Overview *crv-dtOverview*
+
+I.5.1.1 Type Specifiers *crv-dtTypeSpecifiers*
+------------------------
+To specify a datatype in standard C the following type-specifiers are
+allowed:
+
+ $void $
+ $char $ *crv-char*
+ $short $ *crv-short*
+ $int $ *crv-int*
+ $long $ *crv-long*
+ $float $ *crv-float*
+ $double $ *crv-double*
+ $signed $ *crv-signed*
+ $unsigned $ *crv-unsigned*
+ $_Bool $ *crv-_Bool*
+ $_Complex $ *crv-_Complex*
+ $_Imaginary$ *crv-_Imaginary*
+ $struct $
+ $union $
+ $enum $
+ $typedef-name$
+
+
+Type specifiers can be combined, the whole set of possible type specifiers is
+viewed in the table below. Specifiers given in the same row have the same
+meaning.
+
+
+ Type Specifier | Description
+ =========================+==================================================
+$void $| empty or NULL value
+ -------------------------+--------------------------------------------------
+$char $| store member of basic character set
+$signed char $|
+ -------------------------+--------------------------------------------------
+$unsigned char $| same as char, but unsigned values only
+ -------------------------+--------------------------------------------------
+$short $| defines a short signed integer
+$short int $|
+$signed short $|
+$signed short int $|
+ -------------------------+--------------------------------------------------
+$unsigned short $| same as short, but unsigned values only
+$unsigned short int $|
+ -------------------------+--------------------------------------------------
+$int $| defines a signed integer
+$signed $|
+$signed int $|
+ -------------------------+--------------------------------------------------
+$unsigned $| same as int, but unsigned values only
+$unsigned int $|
+ -------------------------+--------------------------------------------------
+$long $| defines a long signed integer
+$long int $|
+$signed long $|
+$signed long int $|
+ -------------------------+--------------------------------------------------
+$unsigned long $| same as long, but unsigned values only
+$unsigned long int $|
+ -------------------------+--------------------------------------------------
+$long long $| defines a long long signed integer
+$long long int $|
+$signed long long $|
+$signed long long int $|
+ -------------------------+--------------------------------------------------
+$unsigned long long $| same as long long, but unsigned values only
+$unsigned long long int $|
+ -------------------------+--------------------------------------------------
+$float $| defines a floating-point number
+ -------------------------+--------------------------------------------------
+$double $| defines a more accurate floating-point number
+ | than float
+ -------------------------+--------------------------------------------------
+$long double $| defines a more accurate floating-point number
+ | than double
+ -------------------------+--------------------------------------------------
+$_Bool $| defines a Bool-integer (0 or 1 only)
+ -------------------------+--------------------------------------------------
+$float _Complex $| defines a complex number with floating
+ -------------------------+--------------------------------------------------
+$double _Complex $| defines a complex number more accurate
+ | than the float type
+ -------------------------+--------------------------------------------------
+$long double _Complex $| defines a complex number more accurate than
+ | the double type
+ -------------------------+--------------------------------------------------
+$float _Imaginary $| defines an imaginary number with floating
+ -------------------------+--------------------------------------------------
+$double _Imaginary $| defines an imaginary number more accurate
+ | than the float type
+ -------------------------+--------------------------------------------------
+$long double _Imaginary $| defines an imaginary number more accurate than
+ | the double type
+ -------------------------+--------------------------------------------------
+$struct $| defines a set of elements that have possibly
+ | different datatypes (unlike an array)
+ -------------------------+--------------------------------------------------
+$union $| defines a set of elements that have possibly
+ | different datatypes and use the same overlapping
+ | memory (total size is size of biggest element)
+ -------------------------+--------------------------------------------------
+$enum $| defines a set of named integer constant values
+ -------------------------+--------------------------------------------------
+$typedef-name $| a new named type defined with the$typedef$
+ | keyword, the new type is a synonym for one of the
+ | types listed above
+ =========================+==================================================
+
+
+
+I.5.1.2 Type Grouping *crv-dtTypeGrouping*
+----------------------
+
+The types can be grouped in this way:
+
+
+ TYPE
+ |
+ -------------------+-----------+-------------
+ | | |
+ | | |
+ ------- SCALAR ----- AGGREGATE $void$
+ | | |
+ | | +-------------
+ | | | |
+ - ARITHMETIC --- $pointers$ ARRAY STRUCTURE
+ | | | |
+ | | | |
+INTEGER - FLOATING -+----------- $array$ -$struct$-
+ | | | | | |
+ | | | | | |
+ | REAL COMPLEX IMAGINARY $union bit-field$
+ | | | |
+ | | | $_Imaginary$(1)
+ | | | |
+ | | | +-------+---------
+ | | | | | |
+ | | | $float double long double$
+ | | |
+ | | |
+ | | $_Complex$(1)
+ | | |
+ | | +-------+---------
+ | | | | |
+ | | $float double long double$
+ | |
+ | |
+ | +-------+---------
+ | | | |
+ | $float double long double$
+ |
+ |
+ +-----------------+---------------+---------
+ | | | |
+$char short enum _Bool$
+$signed/unsigned int $
+$ long $
+$ long long $
+$ signed/unsigned $
+
+
+ (1): implementation of these datatypes is not required
+
+
+The basic types are type char, signed/unsigned integer types and floating
+types.
+
+
+
+
+------------------------------------------------------------------------------
+I.5.2 Sizes and Ranges *crv-dtSizeRange*
+
+
+The C standard defines the basic types as having a "at least" size.
+
+ Type | Size/Range
+ ============+===================================================
+$char $| large enough to store any member of the basic
+ | character set
+ ------------+---------------------------------------------------
+$short $| same as int or smaller range
+ ------------+---------------------------------------------------
+$int $| has the natural size suggested by the architecture
+ | of the execution environment
+ ------------+---------------------------------------------------
+$long $| same as int or greater range
+ ------------+---------------------------------------------------
+$long long $| same as long or greater range
+ ------------+---------------------------------------------------
+$float $| IEEE-754 floating-point standard, single format
+ ------------+--------------------------------------------------
+$double $| IEEE-754 floating-point standard, double format
+ ------------+---------------------------------------------------
+$long double$| shall have more precision than double and at
+ | least the range of double
+ ------------+---------------------------------------------------
+$_Bool $| large enough to store values 0 and 1
+ ============+===================================================
+
+
+
+Common - but not guaranteed - values are:
+
+
+ Type | Size/Range
+ | 16-bit Architecture 32-bit Architecture
+ ============+================================================================
+$char $| 8 bit
+ | 0...255
+ | -128...127
+ ------------+----------------------------------------------------------------
+$short $| 16 bit
+ | 0...65535
+ | -32768...32767
+ ------------+----------------------------------------------------------------
+$int $| 16 bit | 32 bit
+ | 0...65535 | 0...4,294,967,295
+ | -32768...32767 | -2,147,483,648...2,147,483,647
+ ------------+----------------------------------------------------------------
+$long $| 32 bit
+ | 0...4,294,967,295
+ | -2,147,483,648...2,147,483,647
+ ------------+----------------------------------------------------------------
+$long long $| 64 bit
+ | 0...18,446,744,073,709,551,615
+ | -9,223,372,036,854,775,808...9,223,372,036,854,775,807
+ ------------+----------------------------------------------------------------
+$float $| 32 bit
+ | magnitudes: 1.175494351e-38...3.402823466e+38
+ | significant digits: >= 6
+ | given x, next is: x * (1 + 1.192092896e-7)
+ ------------+----------------------------------------------------------------
+$double $| 64 bits
+ | magnitudes: 2.2250738585072014e-308...1.7976931348623158e+308
+ | significant digits: >= 15
+ | given x, next is: x * (1 + 2.2204460492503131e-16)
+ ------------+----------------------------------------------------------------
+$long double$| 96 bits, 80 bits used
+ | magnitudes: 3.36210314311209351e-4932 1.18973149535723177e+4932
+ | significant digits: >= 18
+ | given x, next is: x * (1 + 1.08420217248550443e-19)
+ ------------+----------------------------------------------------------------
+$_Bool $| 16 bit | 32 bit
+ | 0, 1 | 0, 1
+ ============+================================================================
+
+
+
+
+------------------------------------------------------------------------------
+I.5.2 Formats *crv-dtFormats*
+
+I.5.2.1 Integer *crv-dtFormatsInt*
+----------------
+
+Integer values are represented as binary numbers (base 2).
+
+The range of unsinged integer types is 0...2^(N-1), whereas N is the size
+of the integer type (8, 16, 32, 64 bit...).
+
+Value = bitN*2^(N-1) + ... + bit3*2^3 + bit2*2^2 + bit1*2^1 + bit0*2^0
+
+N is the most significant bit, 0 the least significant.
+
+For signed integer values one bit is used as sign, commonly the most
+significant bit.
+If sign bit is 0, the representation is the same as for unsigned integer.
+If sign bit is 1, a negative value is represented. There are three
+possibilities to represent a negative value:
+
+ - Sign-Magnitude *crv-signMagnitude*
+ --------------
+ Sign bit 0: the rest is a positive number
+ Sign bit 1: the rest is a negative number
+ E.g.:
+ 0000 1001 = +9
+ 1000 1001 = -9
+
+ Attributs:
+ +0 and -0 exists
+ Range: -2^(N-1) - 1 ... 2^(N-1) - 1 (e.g. 8bit: -127 ... +127)
+ adding, subtracting, dividing, multiplying needs extra logic
+ conversion from positive to negative values and vice versa is simple
+
+ - One's Complement *crv-onesComplement*
+ ----------------
+ The negative value is obtained by inverting all bits of the corresponding
+ positive value.
+ The most significant bit is the sign bit. Positive values have sign bit 0,
+ negative values have sign bit 1.
+
+ Attributs:
+ +0 and -0 exists
+ Range: -2^(N-1) - 1 ... 2^(N-1) - 1 (e.g. 8bit: -127 ... +127)
+ conversion from positive to negative values and vice versa is simple
+ adding can be done directly, subtracting can be converted to adding
+ multiplication needs extra logic for sign
+
+ - Two's Complement *crv-twosComplement*
+ ----------------
+ The negative value is obtained by inverting all bits of the corresponding
+ positive value and adding 1.
+ The most significant bit is the sign bit. Positive values have sign bit 0,
+ negative values have sign bit 1.
+
+ Attributs:
+ only one 0 exists
+ Range: -2^(N-1) ... 2^(N-1) - 1, asymetric (e.g. 8bit: -128 ... +127)
+ adding and multiplying is straight forward
+ sign extension when promoting is simple (repeat sign bit on the left)
+
+Which method is used to represent negative values is implementation specific,
+commonly the two's complement is used.
+
+
+Beneath decimal numbers (base 10), octal (base 8) and hexadecimal (base 16)
+numbers can be used in standard C.
+
+Octal numbers start with a 0 (zero), hexadecimal start with a 0x (zero x).
+Opposed to decimal numbers, conversions from and to binary is easier with
+octal and hexadecimal numbers.
+Octal groups 3 bits, one digit has range 0...7.
+Hexadecimal groups 4 bits, one digit has range 0...9, A...F.
+
+Examples:
+ Bit
+ 15 14 13 12 11 10 9 8 | 7 6 5 4 3 2 1 0
+ --------------------------------------------------
+ 1 1 1 0 1 0 0 1 0 1 0 1 1 0 0 1
+ | | | | |
+octal: 1 | 6 | 4 | 5 | 3 | 1 = 0164531
+
+
+ Bit
+ 15 14 13 12 11 10 9 8 | 7 6 5 4 3 2 1 0
+ --------------------------------------------------
+ 1 1 1 0 1 0 0 1 0 1 0 1 1 0 0 1
+ | | |
+hex: E | 9 | 5 | 9 = 0xE959
+
+
+
+
+I.5.2.2 Floating-Point *crv-dtFormatsFloat*
+-----------------------
+
+I.5.2.2.1 Basics *crv-dtFormatsFPBasics*
+-----------------
+In standard C floating values are represented as described in the floating-
+point standard IEC 60559 (previously IEEE-754).
+NOTE: The standard does not define bit-positions!
+
+Generally a floating pointer number consists of four parts:
+ - sign
+ - mantissa
+ - radix
+ - exponent
+
+ ---------------------------------------------- ~
+ | value = sign * mantissa * radix^(exponent) |~
+ ---------------------------------------------- ~
+
+The sign is +1 or -1. The mantissa holds the significant digits of a
+floating-point number and is always positive.
+The exponent indicates the positive or negative power of the radix. To
+be able to get positive and negative exponents a bias is added to the
+actual exponent.
+
+A number can be expressed in many different ways, e.g.:
+ 3.0: 3.0 * 10^0
+ 0.03 * 10^2
+ 300 * 10^(-2)
+ .....
+
+To maximize the quantity of representable numbers, floating-point numbers
+are typically stored in a normalized form.
+A normalized floating-point number has a mantissa that's leftmost digit
+is non-zero. To normalize the mantissa is shifted left until the leftmost
+digit is non-zero, the exponent is reduced by the number of shifts.
+The normalized form of the number 3.0 would be:
+ 3.0 * 10^0
+A mantissa of a floating-point number fulfils the following equation:
+
+ 1/radix <= mantissa < 1~
+
+If this equation is not fulfilled, the floating-point number is called
+denormalized.
+
+For bias 2 an optimization is available and exploited: for normalized
+floating-point numbers the leftmost bit of the mantissa is always 1.
+This bit don't need to be stored explicitly. We can assume it to be 1 so that
+we get an extra bit to increase resolution (e.g. for float we have a 23 bit
+mantissa, but a 24 bit resolution).
+
+
+Special Values: *crv-dtFormatsFPValues*
+---------------
+There are some special values explained below.
+
+ Zero: *crv-dtFormatsFPZero*
+ -----
+ All exponent and mantissa bits are set to 0. The sign bit can be set or
+ cleared, so that +0 and -0 is possible. Both are treated as 0.0.
+
+ Note: There is no way to represent the value 0.0 in the format described
+ above. Because of normalization the leading digit must be unequal 0.
+
+ Infinity: *crv-dtFormatsFPInfinity*
+ ---------
+ Infinity is signaled by all bits of exponent set and all bits of mantissa
+ cleared. The sign bit denotes +infinity and -infinity.
+ Infinity allows to handle overflows.
+
+ NaN (Not a Number): *crv-dtFormatsFPNaN*
+ -------------------
+ NaN is used to signal that the value is not a real number. NaN is denoted
+ by all exponent bits set and the mantissa != 0.
+ There are two types of NaN: Signalling NaN and Quiet NaN
+ Both indicates that something went wrong.
+
+ Signalling NaN:
+ The most significant mantissa bit cleared denotes a signalling NaN.
+ A signalling NaN denotes an invalid operation (e.g. division by zero).
+
+ Quiet NaN:
+ The most significant mantissa bit set denotes a quiet NaN.
+ A quiet NaN is set, if the result of an operation is not mathematically
+ defined.
+
+ Denormalized: *crv-dtFormatsFPSDenorm*
+ -------------
+ If the exponent is 0 and the mantissa is unequal 0, then the value is a
+ denormalized number. A denormalized number has no assumed 1 in the
+ mantissa.
+
+
+
+Special Operations: *crv-dtFormatsFPOp*
+-------------------
+
+ Operation | Result
+ -------------------------+------------
+ n / +-infinity | 0
+ +-nonzero / 0 | +-infinity
+ +-infinity * +-infinity | +-infinity
+ infinity + infinity | infinity
+ infinity - infinity | NaN
+ +-infinity / +-infinity | NaN
+ +-infinity * 0 | NaN
+ +-0 / +-0 | NaN
+
+
+
+I.5.2.2.2 Types *crv-dtFormatsFPTypes*
+----------------
+Below commonly used floating-point formats are described. The bit positions
+are not defined in standards, neither in standard C nor in IEEE-754.
+
+The radix is 2, so that the formula to get the value of a floating-point
+number is:
+
+ ------------------------------------------ ~
+ | value = sign * mantissa * 2^(exponent) |~
+ ------------------------------------------ ~
+
+Float: *crv-dtFormatsFPFloat*
+------
+ Radix: 2
+ Sign: 1 bit, = 0 positive, = 1 negative
+ Exponent: 8 bit, bias 127
+ Mantissa: 23 bit, 24 bit resolution
+ Total Size: 32 bit
+ Range: 1.175494351e-38...3.402823466e+38
+ Precision: >= 6 (number of digital digits of precision)
+ (see also |crv-dtSizeRange|)
+
+ Bit: 31 30 23 22 0
+ s eeeeeeee mmmmmmmmmmmmmmmmmmmmmmm
+
+ s: signe
+ e: exponent
+ m: mantissa
+
+ Examples:
+ s eeeeeeee mmmmmmmmmmmmmmmmmmmmmmm
+ 0.75 = 0 01111110 10000000000000000000000
+ |___________
+ |
+ e = 126 - 127 = -1 |
+ m = 1 (assume MSB 1) + 1/(2^1)
+ = 1.5
+ value = 1.5 * 2^(-1) = 0.75
+
+ s eeeeeeee mmmmmmmmmmmmmmmmmmmmmmm
+ 12.75 = 0 10000010 10011000000000000000000
+ | ||____________________________
+ | |____________________ |
+ |___________ | |
+ | | |
+ e = 130 - 127 = 3 | | |
+ m = 1 (assume MSB 1) + 1/(2^1) + 1/(2^4) + 1/(2^5)
+ = 1.59375
+ value = 1.59375 * 2^3 = 12.75
+
+ denormalized:
+ s eeeeeeee mmmmmmmmmmmmmmmmmmmmmmm
+ 1.46936...e-39 = 0 0000000 01000000000000000000000
+ |________
+ |
+ e = 0 - 127 = -127 |
+ m = 0 (no assumed MSB 1) + 1/(2^2)
+ = 0.25
+ value = 0.25 * 2^(-127) = 1.4693679385278594e-39
+
+Double: *crv-dtFormatsFPDouble*
+-------
+ Radix: 2
+ Sign: 1 bit, = 0 positive, = 1 negative
+ Exponent: 11 bit, bias 1023
+ Mantissa: 52 bit, 53 bit resolution
+ Total Size: 64 bit
+ Range: 2.2250738585072014e-308...1.7976931348623158e+308
+ Precision: >= 15 (number of digital digits of precision)
+ (see also |crv-dtSizeRange|)
+
+ Bit: 63 62 52 51 0
+ s eeeeeeeeeee mmmmmmmm...mmmmmmmmmmmm
+
+ s: signe
+ e: exponent
+ m: mantissa
+
+
+Long Double: *crv-dtFormatsFPLDouble*
+------------
+ Radix: 2
+ Sign: 1 bit, = 0 positive, = 1 negative
+ Exponent: 15 bit, bias 16383
+ Mantissa: 64 bit, 64 bit resolution(!), no assumed 1 in MSB
+ Total Size: 92 bit, 80 bit used
+ Range: 3.36210314311209351e-4932...1.18973149535723177e+4932
+ Precision: >= 18 (number of digital digits of precision)
+ (see also |crv-dtSizeRange|)
+
+ Bit: 79 78 64 63 0
+ s eeeeeeeeeeeeeee mmmmmmmm...mmmmmmmmmmmm
+
+ s: signe
+ e: exponent
+ m: mantissa
+
+
+------------------------------------------------------------------------------
+I.5.3 void Type *crv-dtVoid*
+ *crv-void*
+The$void$type specifies an empty or NULL type. This is used to:
+ - signify that a function does not return a value
+ - specify a function prototype with no arguments
+ - indicate a generic pointer
+ A generic pointer can point to any object type. No type cast is
+ necessary.
+
+Examples:
+ - function with no return value >
+ void Func(int n)
+ {
+ ...
+ }
+<
+ - function with no arguments >
+ int Func (void)
+ {
+ ...
+ }
+<
+ - generic pointer >
+ int i;
+ long l;
+ void *ptr;
+
+ ptr = &i;
+ ptr = &l;
+<
+
+
+
+------------------------------------------------------------------------------
+I.5.4 Arrays *crv-dtArrays*
+
+Syntax:
+$storage-class-specifier type-specifier declarator[constant-expression$or$*];$
+
+$storage-class-specifier$,$constant-expression$and$*$are optional
+
+Arrays are used to group data types of the same type. An array can be of any
+data type, except$void$.
+
+When addressing an index within this array, indexing starts at 0 and ends
+at array-size(in elements) - 1.
+
+An array has only one dimension. To get a multidemsional array an array of
+array(s) can be declared.
+The elements of arrays are stored in increasing addresses so that the
+rightmost subscript varies most rapidly.
+Example: $int n[2][3];$
+ the elements are stored in this sequence:
+ n[0][0], n[0][1], n[0][2], n[1][0], n[1][1], n[1][2]
+
+ It can be initialized with:
+ $int n[2][3] = { {0, 1, 2}, {3, 4, 5} };$
+
+
+Complete Array Type Declaration *crv-dtCompleteArrayDecl*
+-------------------------------
+
+A complete array type declaration is a declaration of an array with known
+size. The number of elements an array stores is specified at declaration.
+
+E.g.: $int array[2];$
+
+The number of elements must be a constant value of >= 1 or a$*$.
+
+If a$*$is specified then the array type is a variable-length array type of
+unspecified size, which can be used only in declarations with function
+prototype scope.
+
+
+Incomplete Array Type Declaration *drv-dtIncompleteArrayDecl*
+---------------------------------
+
+It is possible to declare an array of unknown size by omitting the size-
+information at declaration. This sort of array declaration is called
+incomplete array declaration. The size of an incomplete array declaration must
+be specified elsewhere, so that the array type itself is complete.
+
+Incomplete array type declaration is useful for:
+ - When initializing at declaration. E.g.: >
+ char name1[] = "bert"; // end of string (0x00) is added automatically
+ char name2[] = {'b', 'e', 'r', 't', '\0'};
+<
+ The size of both arrays is 5 bytes. The initialization does complete the
+ array type.
+
+ - To reference to an external defined array with known size: >
+ extern array[];
+
+ int main(void)
+ {
+ array[0] = 42;
+ ....
+ }
+<
+ To work with this array, its size must be known of course.
+
+ - For function parameter incomplete array type declaration can be used in the
+ function's declaration. E.g. >
+ void func(int array[])
+ {
+ array[0] = 2;
+ }
+<
+ A pointer must be passed to this function!
+
+
+Initialization of Arrays *drv-dtArrayInit*
+------------------------
+
+Arrays can be initialized at definition time. It is allowed to initialized
+less or all elements of a array. If less are initialized the remaining
+elements are set to 0 automatically.
+
+ Initialize all elements of the array, e.g.:
+ $int a[2] = {1, 2};$
+
+ Initialize the first elements, the rest is set to 0:
+ $int a[5] = {1, 2, 3};$
+ Not allowed is to initialize more elements as the array can store:
+ $int a[5] = {1, 2, 3, 4, 5, 6}; // ERROR at compilation time$
+
+ Initialize multidimensional arrays:
+ $int b[2][3] = { {0, 1, 2}, {3, 4, 5} };$
+
+ Initialize incomplete arrays:
+ $char name1[] = "bert"; // end-of-string (0x00) is added$
+ $char name2[] = {'b', 'e', 'r', 't', '\0'};$
+
+ Attention when assigning strings to arrays:
+ The end-of-string (0x00) is added only if the string fits into array:
+ $char ch[3] = "abc" // no end-of-string (0x00) is added here!$
+ $char ch[4] = "abc" // end-of-string is added$
+ $char ch[] = "abc" // end-of-string is added, array gets dimension of 4$
+
+
+
+------------------------------------------------------------------------------
+I.5.5 Structures *crv-dtStructurs*
+ *crv-struct*
+Syntax:
+ $struct$structur-name${$
+ $variables,...$
+ $}$structur-variable,...$;$
+
+
+Structures are used to group heterogenous data. The elements (members) of a
+structure can be of different data types (opposed to arrays). All data types
+are allowed, except$void$type.
+The member names must be unique within a structure, but the same names can be
+used in nested structures.
+A structure cannot contain instances of themselves, but can have pointers
+to instances of themselves as members.
+
+The members are stored sequentially in increasing addresses. The first member
+is at the starting address of a structure. But a compiler is free to add
+pad-bytes for alignment. So the total size of a structure may differ from the
+sum of member-sizes.
+A pointer to a structure points to the starting address of the structure,
+there the first member is stored.
+
+To access a member of a structure, the structure selector$.$is used. To access
+a member of a structure a pointer points to$->$is used.
+
+A structure can be passed by value to functions and returned by value by
+functions. Allowed operators with structures are$=$and$sizeof$.
+
+
+Declaration *crv-dtStructDef*
+-----------
+To declare a structure the 'structur-variable' is omitted, e.g.: >
+ struct myStruct {
+ int n;
+ char *name;
+ long counter;
+ };
+No variable is generated here, it's the declaration of a structure with
+name myStruct. To get an object do:
+$ struct myStruct ms;$
+
+
+Definition *crv-dtStructDecl*
+----------
+A definition can be done in several ways:
+
+ - If a structure is declared already, a definition is done this way:
+ $struct Person pers;$
+ perss is the object generated
+
+ - Declaration and definition can be done both, e.g.: >
+ struct Person {
+ int age;
+ char *name;
+ } pers1;
+< An object pers1 is generated. 'structur-variable' can be a comma-
+ separated list of variables, e.g.: >
+ struct Person {
+ int age;
+ char *name;
+ } pers1, pers2, pers3;
+< The objects pers1, pers2 and pers3 are generated.
+
+ Further definitions can be done via:
+ $struct Person pers4;$
+ because a 'structure-name' was specified above.
+
+ - Only definition, no 'struct-name' specified, e.g.: >
+ struct {
+ int age;
+ char *name;
+ } pers1;
+< An object pers1 is generated.
+
+
+Initialization *crv-dtStructInit*
+--------------
+Structures can be initialized at definition time. It is allowed to initialized
+less or all members of a structure. If less are initialized the remaining
+elements are set to 0 automatically.
+
+Examples: >
+ struct Person {
+ int age;
+ char *name;
+ } pers1 = {42, "Sting"};
+<or >
+ struct Person pers2 = {42, "Sting"};
+
+
+Accessing *crv-dtStructAccess*
+---------
+A member of a structure can be accessed via$.$,e.g.: >
+ myStruct.age = 42;
+ myStruct.anotherStruct.n = 3;
+
+A member of a structure a pointer points to can be accessed via$->$, e.g.: >
+ myStructPtr->age = 42;
+ myStructPtr->anotherStruct.n = 3;
+
+
+------------------------------------------------------------------------------
+I.5.6 Unions *crv-dtUnions*
+ *crv-union*
+Syntax:
+ $union$union-name${$
+ $variables,...$
+ $}$union-variable,...$;$
+
+
+A union is used to store objects of different data types at the same location
+in memory. All members of a union have offset 0 to the start address of the
+union. Enough space is allocated only for the largest member in the union.
+
+For members all data types are allowed, except$void$type. The member names
+must be unique within a union, but the same names can be used in nested
+unions. A union cannot contain instances of themselves, but can have pointers
+to instances of themselves as members.
+
+A pointer to a union points to the starting address of the union.
+
+To access a member of a union, the union selector$.$is used. To access a
+member of a union a pointer points to$->$is used.
+
+A union can be passed by value to functions and returned by value by
+functions. Allowed operators with unions are$=$and$sizeof$.
+
+
+Declaration *crv-dtUnionDef*
+-----------
+To declare a union the 'union-variable' is omitted, e.g.: >
+ union Integers {
+ char c;
+ short s;
+ int n;
+ long l;
+ };
+No variable is generated here, it's the declaration of a union with name
+Integers. To get an object do:
+$ union Integers ints;$
+
+
+Definition *crv-dtUnionDecl*
+----------
+A definition can be done in several ways:
+
+ - If a union is declared already, a definition is done this way:
+ $union Integers ints;$
+ ints is the object generated
+
+ - Declaration and definition can be done both, e.g.: >
+ union Integers {
+ char c;
+ short s;
+ int n;
+ long l;
+ } ints1;
+< An object ints1 is generated. 'union-variable' can be a comma-
+ separated list of variables, e.g.: >
+ union Integers {
+ char c;
+ short s;
+ int n;
+ long l;
+ } ints1, ints2, ints3;
+< The objects ints1, ints2 and ints3 are generated.
+
+ Forther definitions can be done via:
+ $union Integers ints;$
+ because a 'union-name' was specified above.
+
+ - Only definition, no 'union-name' specified, e.g.: >
+ union {
+ char c;
+ short s;
+ int n;
+ long l;
+ } ints1;
+< An object ints1 is generated.
+
+
+Initialization *crv-dtUnionInit*
+--------------
+Unions can be initialized at definition time, but only the first member can
+be given an initializer.
+
+Examples: >
+ union Integers {
+ char c;
+ short s;
+ int n;
+ long l;
+ } ints1 = {'a'};
+<or >
+ union Integers ints2 = {'a'};
+
+
+Accessing *crv-dtUnionAccess*
+---------
+A member of a union can be accessed via$.$,e.g.: >
+ myUnion.age = 42;
+ myUnion.anotherUnion.n = 3;
+
+A member of a union a pointer points to can be accessed via$->$, e.g.: >
+ myUnionPtr->age = 42;
+ myUnionPtr->anotherUnion.n = 3;
+
+
+
+------------------------------------------------------------------------------
+I.5.7 Bit-Fields *crv-dtBitFields*
+
+Syntax:
+ $type-specifier identifier:constant-expression$
+
+A member of a structure or union can be declared to consist of a specified
+number of bits. Such a member is called a bit-field.
+A bit-field can be of type$_Bool$,$signed int$,$unsigned int$or of some other
+implementation specific type. The specified number of bits for a bit-field
+must be small enough to be stored in its type.
+
+Sequences of bit-fields are packed as tightly as possible, they are assigned
+from low-order to high-order bit.
+If in a sequence of bit-fields a further bit-field is specified, and this
+bit-field does not fit into the remaining bits, it's implementation-specific
+whether this bit-field is put into the next unit or overlaps adjacent units.
+
+A bit-field can be closed in two ways:
+ - specify a data-type !=$bit-field$, a following bit-field will be started
+ in a new unit at low-order bit
+ - specify a bit-field with size 0, a following bit-field will be started
+ in a new unit at low-order bit
+
+For padding it is possible to declare a bit-field without identifier
+(e.g. :10).
+
+Pointers to bit-field are not possible.
+
+Examples: >
+ struct BitField {
+ unsigned int a:2;
+ unsigned int :3; // leave 3 bits free
+ unsigned int b:4;
+ unsigned int :0; // force to start new unit
+
+ unsigned int c:4:
+ unsigned int c:1;
+
+ long lng;
+
+ unsigned int d:2; // start a new unit since the previous type is
+ // not a bit-field
+ };
+<
+ also possible would be >
+ struct BitField {
+ unsigend int a:2,
+ :3, // leave 3 bits free
+ b:4,
+ :0, // force to start new unit
+
+ c:4,
+ c:1;
+
+ long lng;
+
+ int d:2; // start a new unit since the previous type is
+ // not a bit-field
+ };
+
+
+Accessing a bit-field is done this way: >
+ struct BitField {
+ unsigend int a:2,
+ b:3;
+ } bf;
+
+ bf.a = 3;
+ bf.b = 0;
+
+
+
+------------------------------------------------------------------------------
+I.5.8 Enumerated Tags *crv-dtEnumerate*
+ *crv-enum*
+Syntax:
+ $enum identifier{enumerator-list} declarator;$
+
+
+An enumeration type is a user-defined integer type. The possible values of
+this type are defined in the$enumerator-list$. The elements of this list are
+symbolic representations of constant integers.
+Each element of the$enumerator-list$gets the value of the previous plus 1.
+The first element gets the value 0. Alternatively values can be assigned to
+the elements.
+
+All this could be achieved by using$#define$too. The advantage of enumeration
+types is that debuggers can view values of enumeration type objects
+symbolically.
+
+
+Examples:
+ $enum color {red, yellow, green};$
+
+ $color$is a new integer type that can have the values$red$(=0),$yellow$(=1)
+ and$green$(=2).
+
+Assignment can be done this way: >
+ color col;
+ col = red;
+
+To assign values to the constants do:
+ $enum color {red=10, yellow, green=20, white};$
+
+ $color$is a new integer type that can have the values$red$(=10),$yellow$
+ (=11),$green$(=20) and$white$(=21).
+
+
+
+------------------------------------------------------------------------------
+I.5.9 Strings *crv-dtStrings*
+
+In C a string is an array of characters encapsulated in double quotes. At
+the end of the string an end-of-string (0x00} is appended.
+
+Example: >
+ char strng[] = "this is a string";
+
+
+
+------------------------------------------------------------------------------
+I.5.10 Type Definitions *crv-dtTypeDef*
+
+A type definition is used to define a type synonym for a data type.
+Type definitions are just aliases. The compiler replaces a type definition
+by its assigned type.
+
+Type definitions can apply to variables or functions.
+
+Type definitions provide:
+ - It is possible to replace a lengthy and/or confusing type definition
+ by an expressive one.
+ - Type definitions can simplify the process of changing the type of
+ variables. Example:
+ $typedef short coordinate;$
+ If you notice that$short$is too small for your needs, simply change it:
+ $typedef long coordinate;$
+ and all variables of the type$coordinate$will have the new type$long$.
+
+Example for data type: >
+ typedef int * pointerToInt;
+
+ pointerToInt iPtr; // is identical to: int *iPtr;
+
+Example for function: >
+ typedef int calculate(int a, int b); // function returns int, and gets
+ // two ints
+ calculate sum; // declarate functions
+ calculate dif;
+
+ int sum(int a, int b) // definition: parameters and return type
+ { // must be according to the typedef
+ return a + b;
+ }
+
+ int dif(int a, int b)
+ {
+ return a - b;
+ }
+
+
+
+------------------------------------------------------------------------------
+I.5.11 Storage Classes *crv-dtStorageClasses*
+
+A storage class defines the scope and lifetime of a variable or function.
+ see |crv-gloScope|, |crv-gloLifetime|
+
+ Storage Class |
+ Specifier | Description
+ ---------------+------------------------------------------------------------
+ $ auto $| default, local variable has local lifetime
+ $ static $| local variable, but maintained during program execution
+ $ extern $| indicates that a variable is defined outside of the current
+ | file, no variable is created by this
+ $ register $| request to access variable as fast as possible (normally
+ | this means to store an object in a CPU register)
+ $ typedef $| creates an alias name for a basic or derived data type
+ none, in | a global variable is defined
+ file scope |
+
+
+
+$auto$ *crv-auto*
+------
+The$auto$class specifies a local variable with local lifetime. The storage of
+a variable is created upon entry to the block defining the variable, and is
+destroyed when exiting the block.
+
+The contents of a new defined$auto$object is undefined.
+
+This class can only be declared at the beginning of a block { ... }.
+If no storage class if given, this is the default.
+
+Example: >
+ int main(void)
+ {
+ int a; // auto can be omitted, it's the default
+ auto int b;
+ auto long c = 10L; // initializer can be used
+
+ ....
+ }
+
+
+$static$ *crv-static*
+--------
+The$static$class specifies that an object is maintained during the whole
+program execution, but it's accessable only within its scope (block or file).
+Several objects with the same identifier can co-exist, as long as they have
+different scopes.
+
+A$static$object can be declared anywhere a declaration is allowed.
+
+The contents of a new$static$object is initialized, arithmetic members are
+set to 0, pointer members are set to NULL. If an initializer is given, the
+object is initialized only once at program start. Its contents is preserved
+after leaving object's scope.
+
+Example: >
+ int TestFunction ()
+ {
+ static int b; // initialized with 0 automatically
+ static long c = 10L; // initializer can be used
+
+ if (c == 10L)
+ {
+ b++;
+ c++;
+ }
+ .... // next time calling b will be 1 and c will be 11
+ }
+
+
+$register$ *crv-register*
+----------
+The$register$class suggests the compiler to minimize access time for
+a variable. Normally this means to assign the value to a register.
+The compiler is free to do so or not.
+The lifetime is the same as for$auto$.
+
+The$register$class is the only storage class specifier that can
+be used for function parameters too.
+
+Example: >
+ int TestFunction (register int a)
+ {
+ register int b;
+ ...
+ }
+
+
+$extern$ *crv-extern*
+--------
+Using$extern$in a declaration brings the named object into the current scope,
+the object must be a global one. This is used to access objects that are
+defined out of the current file (linkage ->|crv-gloLinkage|).
+
+No new variable is generated, it is just a link to an existing one.
+
+Example: >
+ File 1: File 2:
+ ------- -------
+ int globVar2 = 42; extern int globVar2;
+
+ int main(void) void TestFunc(void)
+ { {
+ .... globVar2 = 3;
+ } ...
+ }
+
+
+$typedef$ *crv-typedef*
+---------
+The$typedef$is used to create an alias for a basic or derived (array, struct,
+union) data type.
+Actually$typedef$isn't a real storage class, but in standard C it is defined
+to be one.
+No new variable is generated.
+For further information see |crv-dtTypeDef|.
+
+
+Global Variable
+---------------
+A global variable is defined when the definition is within file scope and
+no storage class specifier is given.
+
+A global object is initialized, arithmetic members are set to 0, pointer
+members are set to null pointer, in unions the first named member is
+initialized according to this rules. An initializer can be given.
+
+To access a global variable from outside of its scope, declare this
+variable with$extern$class in the new scope.
+
+Example: >
+ File 1: File 2:
+ ------- -------
+ int globVar; extern int globVar2;
+
+ int globVar2 = 42;
+
+ int main(void) void TestFunc(void)
+ { {
+ .... globVar2 = 3;
+ } ...
+ }
+
+
+------------------------------------------------------------------------------
+I.5.12 Qualifiers *crv-dtQualifiers*
+
+The type qualifiers allow to set further attributes of data types.
+
+ Type Qualifier | Description
+ ----------------+------------------------------------------------------------
+ $ const $| no write access to a variable
+ $ restrict $| only for pointers: gives compiler better possibilities for
+ | optimizations
+ $ volatile $| disable compiler optimization for a variable
+
+
+
+$const$ *crv-const*
+-------
+The$const$type qualifier is used to qualify an object as not modifiable. This
+means no write access is allowed to this object after initialization.
+The$const$qualifier can be used for any data type and together with$volatile$.
+
+When$const$is used to qualify an aggregate type (array, struct, union) all
+members are$const$. When$const$is used to qualify a member of an aggregate
+only that member is$const$.
+
+NOTE: Attempting to change a$const$object using a pointer to a non-$const$
+object causes unpredictable behavior.
+
+Example: >
+ const a = 5; // a = 5 and a is not modifiable
+
+ const struct Test {
+ int b;
+ char *title;
+ } test; // all members of test are const
+
+ const int *ptr; // pointer to a constant integer type
+ // pointer is allowed to change, contents not
+
+ int *const ptr; // constant pointer; pointer is not allowed to change
+ // contents is allowed to change
+
+ const int *const ptr; // both pointer and contents are not allowed
+ // to change
+
+
+$restrict$ *crv-restrict*
+----------
+The$restrict$qualifier can only be used for pointers. It indicates that the
+compiler is allowed to make optimizations when dealing with this pointer.
+
+Normally compilers can do very less optimizations to pointers because the
+compiler cannot determine whether or not two pointers point to the same
+object. So the compiler must suppress various optimizations.
+
+The user guarantees that none of the$restrict$qualified pointers do
+point to the same object. So the compiler can do further optimizations
+for these pointers.
+
+
+$volatile$ *crv-volatile*
+----------
+The$volatile$qualifier indicates that the value of an object can possibly be
+changed outside of compiler's control (e.g. changes done by other processes,
+hardware registers of mikrocontrollers,...). The$volatile$qualifier forces
+the compiler to take this into account. The compiler must access the object
+always from memory and most optimizations can't be done.
+
+The$volatile$qualifier can be used for any data type and together with$const$
+qualifier.
+When$volatile$is used to qualify an aggregate type (array, struct, union) all
+members are$volatile$. When$volatile$is used to qualify a member of an
+aggregate only that member is$volatile$.
+
+Example: >
+ volatile int a;
+
+ int main(void)
+ {
+ ....
+ }
+
+
+Hint: When type casting a volatile variable, the volatile qualifier will be
+ lost if it is omitted in the type cast operator.
+
+Example: >
+ volatile int ptrA;
+ long ptrB;
+
+ ...
+
+ ptrA = (int *)ptrB; // ATTENTION: after this, ptrA is no
+ // longer volatile!
+
+ ptrA = (volatile int *)ptrB; // ptrA is still volatile
+
+
+
+
+
+
+------------------------------------------------------------------------------
+I.5.13 Pointers *crv-dtPointers*
+
+A pointer contains the address of a variable of stated type, function or
+memory area.
+
+A pointer can have a special value indicating that the pointer points to
+nowhere. Such a pointer is called null pointer, its value is NULL.
+A pointer of type$void$can be used to point to an object of any type.
+A pointer can point to pointers.
+
+A pointer is declared using the$*$punctuator. The operator$*$is used to
+dereference a pointer in order to have access to the contents of the object
+the pointer points to.
+
+
+I.5.13.1 Variables *crv-dtPtrVars*
+-------------------
+To assign the address of a variable to a pointer the address operator$&$is
+used. To dereference the$*$operator is used.
+
+Example simple pointer: >
+ int n = 3;
+ int *ptr; // define pointer of type int
+
+ ptr = &n; // pointer points to n
+ *ptr = 4; // assign object pointer points to value 4 (=> n=4)
+
+Example pointer to pointer: >
+ int n = 3;
+ int *ptr1; // pointer to int
+ int **ptr2; // pointer to pointer to int
+
+ ptr1 = &n; // pointer ptr1 points to int n
+ ptr2 = &ptr1; // pointer ptr2 points to pointer to int n
+ **ptr2 = 4; // dereference pointer to pointer and assign 4 (n = 4)
+
+A pointer can be set to a fix address this way (not standard C): >
+ int *ptr;
+
+ ptr = (int *)42000;
+
+
+Pointer and Arrays
+------------------
+Example pointer to array: >
+ int n[2];
+ int *ptr;
+
+ ptr = &n[0];
+ ptr = n; // is equivalent to ptr = &n[0]
+
+Example array of pointers: >
+ int *ptrs[3]; // array of pointers to int
+ int n1 = 1, n2 = 2, n3 = 3;
+
+ ptrs[0] = &n1;
+ ptrs[1] = &n2;
+ ptrs[2] = ptrs[0];
+
+
+Pointer to String
+-----------------
+A sequence of characters encapsulated with double quotes is a pointer to
+const character.
+Example: >
+ char *ptr;
+
+ ptr = "string";
+
+
+
+I.5.13.2 Functions *crv-dtPtrFuncs*
+-------------------
+A pointer can point to a function and the function can be called via pointer.
+
+A function pointer is defined in a similar way as a function prototype, the
+function name is replaced with$(*pointer-name)$.
+
+Example: >
+ int (*funcPtr)(int a, int b); // define a function pointer "funcPtr"
+
+ funcPtr = anyFunction; // assign function to pointer
+
+ c = funcPtr(2, 3); // call via function pointer
+
+
+Example: >
+ int sum(int a, int b)
+ {
+ return a + b;
+ }
+
+
+ int (*funcPtr)(int a, int b); // define a function pointer
+
+ int main(void)
+ {
+ int a;
+
+ funcPtr = sum; // assign function to pointer
+
+ a = funcPtr(2, 3); // same as a = sum(2, 3);
+
+ printf("%d\n", a); // 5 is printed
+ }
+
+
+Example, call function at absolut address: >
+
+ // call a function of type int Func(int nNumOf)
+ // located at address 0x42000
+
+ // typedefs make usage of function pointers a little bit clearer
+
+ typedef int (*FuncPtr)( int nNumOf );
+
+
+ int main(void)
+ {
+ FuncPtr func1;
+
+ ...
+
+ func1 = (FuncPtr)0x42000; // assign address to function pointer
+
+ result = func1( n ); // call function func1 points to
+ }
+
+
+
+
+I.5.13.3 Arithmetics *crv-dtPtrArithmetics*
+---------------------
+
+Some operators are allowed to be used on pointers.
+
+
+Relational Operators
+--------------------
+The relational operators$==$,$!=$,$>$,$<$,$>=$,$<=$are allowed if both
+operands are pointers of the same type and both pointers point to an element
+of the same array or to the first element after that array.
+
+The operators$==$and$!=$are allowed in any case if one of the operands is a
+null pointer (NULL).
+
+
+Negation
+--------
+The logic negation$!$is allowed.
+The negation of a null pointer (value NULL) is an integer value 1. The
+negation of a pointer not equal NULL is an integer value 0.
+
+
+Increasing and Decreasing
+-------------------------
+Increasing or decreasing of pointers of type$void$is not allowed, because the
+size of the object a$void$pointer points to is unknown.
+
+For other pointer types it is allowed to add / subtract an integer value.
+If an integer value N is added to a pointer the pointer points to the Nth
+element located after the element the pointer pointed to before adding.
+If an integer value N is subtracted from a pointer the pointer points to the
+Nth element located before the element the pointer pointed to before
+subtracting.
+
+Allowed operations: >
+ pointer + integer-value
+ pointer - integer-value
+ pointer++
+ pointer--
+ ++pointer
+ --pointer
+
+
+Subtraction
+-----------
+Pointers can be subtracted. Both pointers must not be of type$void$.
+Both pointers must be of the same type and must point to an element of the
+same array or to the first element after that array.
+
+The operation$pointer1 - pointer2$returns the number of elements separating
+them (negative value if pointer1 < pointer2).
+
+
+Assignments
+-----------
+Assignments of pointers are of course allowed. The pointers must be of the
+same type (if needed a type cast is to be done).
+
+Compound assignments are allowed as long as the requirements for increasing,
+decreasing and subtracting are fulfilled.
+
+Allowed assignments: >
+ pointer1 = pointer2
+ pointer += integer-value
+ pointer -= integer-value
+ pointer1 -= pointer2
+
+------------------------------------------------------------------------------
+I.5.14 Type Cast *crv-dtTypeCast*
+
+Type cast is an operation that converts the type of an operand into another
+type. There are two types of casts, explicit and implicit.
+
+
+I.5.14.1 Explicit *crv-dtTypeCastExpl*
+------------------
+The explicit type cast is done with the type cast operator$(type-name)$.
+Example: >
+ int main(void)
+ {
+ int nVar = 42;
+ float fVar;
+
+ fVar = (float)nVar;
+ }
+
+
+I.5.14.2 Implicit *crv-dtTypeCastImpl*
+------------------
+Implicit type casts are done by the compiler according to well defined rules.
+
+A compiler does an implicit type cast:
+ - When two or more operands of different types appear in an expression.
+ - When arguments are passed to a function that do not conform to the
+ parameters declared in a function prototype.
+
+
+When a floating-type operand is converted to an integer, the fractional part
+is discarded.
+
+
+ - If either operand is not of arithmetic type, no conversion is performed.
+
+ - If either operand has type$long double$, the other operand is converted
+ to$long double$.
+
+ - Otherwise, if either operand has type$double$, the other operand is
+ converted to$double$.
+
+ - Otherwise, if either operand has type$float$, the other operand is
+ converted to$float$.
+
+ - Otherwise the following rules apply:
+
+ - If both operands have signed integer types or both operands have
+ unsigned integer types the operand with the type of lesser 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 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.
+
+
+Ranking is $long long$>$long$>$int$>$short$>$char$>$bit-field$
+ no matter whether singed or unsigned
+
+
+
+------------------------------------------------------------------------------
+I.5.15 Constants *crv-dtConstants*
+
+Beneath$enum$there are three categories of constants in C, they are described
+below.
+
+
+I.5.15.1 Integer *crv-dtConstInt*
+-----------------
+
+An integer constant can be specified in decimal, hexadecimal or octal. A
+suffix can be added to specify a constant's type.
+
+Decimal~
+To specify a decimal constant, the first digit must be a 1...9. For the
+following digits the characters 0...9 are allowed.
+
+Hexadecimal~
+To specify a hexadecimal constant, a prefix 0x or 0X must be in front of the
+hexadecimal number. For hex-numbers the characters 0...9, a-f and A-F are
+allowed.
+
+Octal~
+To specify an octal constant the first digit must be a 0 (zero). For the
+following digits the characters 0...7 are allowed.
+
+
+Type~
+The type of an integer constant is the first of the corresponding list
+in which its value can be represented:
+
+ | | 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$ | |
+ and$ll$or$LL$|$unsigned long long int$|$unsigned long long int$
+ -------------+------------------------+------------------------
+
+
+I.5.15.2 Floating-Point *crv-dtConstFloat*
+------------------------
+A floating constant has a significant part that may be followed by an exponent
+part and a suffix that specifies its type.
+
+If a floating constant has no suffix, its type is$double$. If suffix is$f$or
+$F$it has type$float$. If suffix is$l$or$L$its type is$long double$.
+
+ Example | Value | Type
+ -----------+---------+-------------
+ .0 | 0.00000 | double
+ 1. | 1.00000 | double
+ 2.23 | 2.23000 | double
+ 2e2 | 200.000 | double
+ 2.e2 | 200.000 | double
+ 2.0e2 | 200.000 | double
+ 2.0e+2 | 200.000 | double
+ 2.0e-2 | 0.02000 | double
+ 3.4f | 3.40000 | float
+ 3.4l | 3.40000 | long double
+
+
+
+I.5.15.3 Character *crv-dtConstChar*
+-------------------
+A character constant is any character from the source character set enclosed
+in apostrophes.
+See escape sequences (-> |crv-lngEscSeq|) for special characters.
+
+Examples: >
+ char a;
+
+ a = 'd';
+ a = '\x2F';
+
+
+
+==============================================================================
+I.6 Statements *crv-statements*
+
+
+------------------------------------------------------------------------------
+I.6.1 if-else *crv-stIfElse*
+ *crv-if* *crv-else*
+Syntax: $if (expr1)$
+ $ statement1$
+ $else$
+ $ statement2$
+
+
+If$expr1$is not equal to 0,$statement1$is done. If$expr1$is equal to 0,
+$statement2$is done. The$else$-part is optional.
+
+
+------------------------------------------------------------------------------
+I.6.2 switch *crv-stSwitch*
+ *crv-switch* *crv-case* *crv-default*
+Syntax: $switch (expr1) {$
+ $ case constant-expression1:$
+ $ statement1$
+ $ ...$
+ $ default:$
+ $ statementN$
+ $}$
+
+
+Both$case$and$default$-part are optional.
+
+If$expr1$is equal to one of the$constant-expressions$in the$case$labels,
+the according $statement$is executed. The$default$-part is entered,
+if$expr1$is not equal to one of the$constant-expressions$of the$case$labels.
+
+If a$statement$is done, the following$statements$are done until the end of
+the$switch$statement is reached or a$break$is done.
+
+There can be several$case$labels, but only one$default$label. The order is
+arbitrary.
+
+
+
+------------------------------------------------------------------------------
+I.6.3 while Loop *crv-stWhile*
+ *crv-while*
+Syntax: $while (expr1)$
+ $ statement$
+
+
+The$while$statement provides an iterative loop.
+The loop body ($statement$) is executed as long as$expr1$is true (!=0). If
+$expr1$is false (=0) the loop is finished.
+The expression$expr1$is evaluated before$statement$is executed.
+
+
+------------------------------------------------------------------------------
+I.6.4 do-while Loop *crv-stDoWhile*
+ *crv-do*
+Syntax: $do$
+ $ statement$
+ $while (expr1);$
+
+
+The$do-while$statement provides an iterative loop.
+The loop body ($statement$) is executed as long as$expr1$is true (!=0). If
+$expr1$is false (=0) the loop is finished.
+The expression$expr1$is evaluated after$statement$is executed (opposed to
+$while$-loop).
+
+
+------------------------------------------------------------------------------
+I.6.5 for Loop *crv-stFor*
+ *crv-for*
+Syntax: $for (expr1; expr2; expr3)$
+ $ statement$
+
+The expressions$expr1$,$expr2$and$expr3$are optional.
+
+
+The$for$statement provides an iterative loop.
+
+$expr1$: This expression is evaluated once before the first execution of the
+ loop body. Usually this is used to initialize variables used in the
+ loop body (e.g. loop counter).
+
+$expr2$: The loop body ($statement$) is executed as long as$expr2$is true
+ (!=0). If$expr2$is false (=0) the loop is finished.
+ If$expr2$is omitted, the expression is always true (infinite loop).
+
+$expr3$: This expression is evaluated after each iteration.
+
+The expression$expr2$is evaluated before$statement$is executed.
+
+
+------------------------------------------------------------------------------
+I.6.6 break *crv-stBreak*
+ *crv-break*
+Syntax: $break;$
+
+
+The$break$statement is used to immediately terminate the execution of the
+enclosing$switch$,$for$,$while$or$do-while$statement.
+
+
+------------------------------------------------------------------------------
+I.6.7 continue *crv-stContinue*
+ *crv-continue*
+Syntax: $continue;$
+
+
+The$continue$statement is used to immediately jump to the end of the
+enclosing$for$,$while$or$do-while$statement.
+
+
+------------------------------------------------------------------------------
+I.6.8 goto *crv-stGoto*
+ *crv-goto*
+Syntax: $goto identifier;$
+
+
+The$goto$statement causes an unconditional jump to a labeled statement
+that is specified by$identifier$. The labeled statement must be in the scope
+of the function containing the$goto$statement.
+
+A$goto$statement is not allowed to jump past any declaration of objects.
+Apart from this jumping into other blocks is allowed.
+
+
+------------------------------------------------------------------------------
+I.6.9 return *crv-stReturn*
+ *crv-return*
+Syntax: $return expr1;$
+
+$expr1$is optional
+
+
+The$return$statement terminates execution of the current function and returns
+control to its caller. If present,$expr1$is evaluated and its value is
+returned to the calling function. If the type of$expr1$is not the same as
+the type of the function, implicit type cast is done.
+
+A$return$statement can appear anywhere in a function, several$return$
+statements are allowed.
+
+For functions of type$void$either a return without$expr1$must be given or
+no$return$statement ($return;$and the enclosing$}$of the function are treated
+as the same).
+
+
+------------------------------------------------------------------------------
+I.6.10 Null Statement *crv-stNull*
+
+Syntax: $;$
+
+
+A null statement performs no operation. A null statement is used in situations
+where the grammar of C requires a statement, but the program needs no
+operation.
+
+Usage:
+ - supply an empty loop body
+ Example: >
+ char *strngPtr;
+
+ while (*stngPtr++ != 'a') // search first 'a' in string
+ ;
+<
+ - set a label just before the closing$}$
+ Example: >
+ ....
+ }
+ end_loop: ;
+ }
+
+
+
+
+==============================================================================
+I.7 Functions *crv-functions*
+
+
+------------------------------------------------------------------------------
+I.7.1 Definition *crv-fuDefinition*
+
+ $return-type function-name(parameter-list, ...) {$
+ $ statement...$
+ $}$
+
+ $return-type$ type of value returned by function
+ $function-name$ name of function
+ $parameter-list$ list of parameters passed to function
+
+
+The$return-type$is the type the function returns. It can be any type except
+array types or function types. If no value is returned,$void$must be used.
+If$return-type$is omitted,$int$is assumed.
+
+The$function-name$is the identifier under that a function can be called
+(see |crv-gloIdentifier| for valid names).
+
+The$parameter-list$specifies the parameters a function expects when called.
+A function can have no parameter, a specific number of parameters or
+a variable number of parameters.
+
+ - No Parameter
+ --------------
+ $parameter-list$must be$void$
+ Example: >
+ int Func(void)
+ {
+ ...
+ return 0;
+ }
+<
+ - One or More Parameters
+ ------------------------
+ $parameter-list$is a comma separated list of parameter specifications.
+ Each parameter must be specified this way: $type-name identifier$
+ $type-name$ : type of the parameter, if omitted$int$is used
+ $identifier$: identifier under which this parameter can be referenced
+ within the function
+ Example: >
+ int Func(char ch, int cntr)
+ {
+ if ( (ch == 'q') || (cntr == 42) )
+ exit(0);
+
+ return 0;
+ }
+<
+ - Variable Number of Parameters *crv-fuDefVarPara*
+ -------------------------------
+ $parameter-list$is a comma separated list of parameter specifications
+ ending with an ellipsis ($,...$).
+ Functions declared in$<stdarg.h>$can be used to access arguments.
+
+ Example: >
+ #include <stdarg.h>
+ #include <stdio.h>
+
+
+ void Func(int numOfArgs, ...)
+ {
+ int n;
+ va_list ap;
+
+ va_start(ap, numOfArgs); // initialize
+
+ for (n = 0; n < numOfArgs; n++)
+ printf("%d ", va_arg(ap, int)); // get next argument, type is int
+
+ printf("\n");
+
+ va_end(ap); // finish
+ }
+
+
+ int main(void)
+ {
+ Func(1, 100); // output is 100
+ Func(2, 100, 101); // output is 100 101
+ Func(3, 100, 101, 102); // output is 100 101 102
+ }
+<
+
+A parameter can be of any type. But parameters of array type or function type
+are converted automatically to pointers.
+Example: >
+ #include <stdio.h>
+
+
+ int Func2()
+ {
+ return 3;
+ }
+
+
+ void Func1(int n[3], int (*func)(void))
+ {
+ n[0] = 1;
+ n[1] = 2;
+ n[2] = func();
+ }
+
+ int main(void)
+ {
+ int n[3] = {5, 5, 5};
+
+ Func1(n, Func2);
+
+ printf("%d %d %d\n", n[0], n[1], n[2]); // output is 1 2 3
+
+ }
+<
+
+The only allowed storage class for a parameter is$register$.
+All kinds of type qualifiers are allowed for parameters.
+
+Arguments are passed by value, that means that a function receives a copy
+of the argument's value.
+The order of evaluation of arguments is not specified.
+
+
+
+------------------------------------------------------------------------------
+I.7.2 Prototype *crv-fuPrototype*
+
+ $return-type function-name(parameter-list, ...);$
+
+
+If a function is used before it's defined then it must be prototyped, so
+that the compiler knows about return type and parameter types of the function,
+else$int$is assumed for return type and parameter types.
+
+A prototype is identical to the function header with the addition of an
+ending$;$. Function prototypes need not use parameter identifiers. Only the
+types are required.
+
+Normally prototyping occurs at the beginning of a source code file or in a
+header file.
+
+
+Example: >
+ int Func(char ch);
+
+
+ int main(void)
+ {
+ if (Func1('q') == 2)
+ {
+ ....
+ }
+ }
+
+
+ int Func(char ch)
+ {
+ ...
+ }
+<
+
+
+------------------------------------------------------------------------------
+I.7.3 Conversion *crv-fuConversion*
+
+
+If a function is called the arguments must be of the same types as specified
+in prototype. If not, conversions are done.
+
+Example: >
+ void Func(int n, char c, long l);
+
+ int main(void)
+ {
+ char chr;
+ long a;
+ int b;
+
+ ...
+
+ Func(chr, a, b); // chr is converted to type int
+ // a is converted to type char
+ // b is converted to type long
+ }
+<
+
+If no prototype is in scope when calling a function the following conversions
+are done on the arguments:
+ - An argument of type$float$is converted to type$double$.
+ - If an$int$can represent all values of the original type, the value is
+ converted to an$int$. Otherwise it is converted to an$unsigned int$.
+ For most compilers this means: an argument of type$char$,$unsigned char$,
+ $short$,$unsigned short$is converted to type$int$.
+
+This is called "argument promotion".
+
+No other conversions are performed on arguments.
+
+
+------------------------------------------------------------------------------
+I.7.4 Storage Classes *crv-fuStorageClasses*
+
+Implicitly functions do have the storage class$extern$. To limit the scope of
+a function to a file$static$can be used.
+
+Example$extern$: >
+ File 1 File 2
+ ------ ------
+
+ int GetSolution(void) extern int GetSolution(void);
+ {
+ return 42;
+ } void Func(void)
+ {
+ if (GetSolution() == 42)
+ int main(void) {
+ { ...
+ if (GetSolution() != 42) }
+ { }
+ ...
+ }
+ }
+<
+
+Example$static$: >
+ File
+ ----
+
+ static int GetSolution(void) // can only be referenced within same file
+ {
+ return 42;
+ }
+
+
+ int main(void)
+ {
+ if (GetSolution() == 42)
+ {
+ ...
+ }
+ }
+<
+
+
+------------------------------------------------------------------------------
+I.7.5 Specifier *crv-fuSpecifier*
+ *crv-inline*
+
+A function declared with an$inline$specifier is an inline function. This
+suggests that calls to the function be as fast as possible. The extend to
+which this suggestion is taken into account is implementation specific.
+
+Normally$inline$means that the call to the function is replaced by the
+function body. As a result of this there is no overhead for calling, but at
+the expense of code size, since each call of the inline function is replaced
+by it's function body.
+
+For$main()$the$inline$specifier is not allowed.
+
+Example: >
+
+ inline int Func(void)
+ {
+ ...
+ return 42;
+ }
+
+
+ int main(void)
+ {
+ int a;
+
+ a = Func();
+ ...
+ }
+<
+
+
+
+------------------------------------------------------------------------------
+I.7.6 main() *crv-fuMain*
+
+A program begins by calling the$main()$function and ends by exiting
+the$main()$function. There is no prototype required for$main()$.
+
+$main()$can be defined in two ways, either with no parameter
+
+$ int main(void)$
+$ {$
+$ statements$
+$ }$
+
+or with two parameters
+
+$ int main(int argc, char *argv[])$
+$ {$
+$ statements$
+$ }$
+
+The return type is type$int$.
+
+The parameters do not have to be named$argc$and$argv$, but it is a common way
+to do so.
+
+Parameter$argc$is a nonnegative integer. If the value of$argc$is greater than
+zero, the string pointed to by$argv[0]$is the program name. If the value
+of$argc$is greater than one, the strings pointed to by$argv[1]$through
+$argv[argc - 1]$represent the program parameters.
+
+
+
+==============================================================================
+I.8 Preprocessor *crv-preprocessor*
+
+A preprocessor is the first pass of a compiler. It does perform macro
+substitution, inclusion of files, conditional compilation and provides the
+ability to pass control directives to the compiler.
+
+A C-preprocessor directive is invoked by a$#$. Opposed to a C-statement a
+C-preprocessor directive is NOT terminated by a semicolon ($;$), instead of
+it is terminated by the new-line. To span a directive over several lines
+the "line-escape"$\$can be used (see |crv-lngEscSeq|).
+Example: >
+ #define MEAS_CYCLES (3 \
+ + \
+ 1)
+<
+is synonymical to: >
+ #define MEAS_CYCLES (3 + 1)
+
+
+A C-preprocessor directive can be placed anywhere in a source file. The
+directive is active from the line of invocation up to the end of source file.
+
+
+In the following sections possible preprocessor directives and preprocessor
+operators are described.
+
+
+
+------------------------------------------------------------------------------
+I.8.1 Macros *crv-preMacros*
+
+A macro is an identifier that is equated to a text or symbolic expression
+to which it is to be expanded by the preprocessor.
+
+ *crv-preMacObj* *crv-preMacFunc*
+There are two types of macros: macros without parameters, they are called
+object-like macros and macros with parameters, they are called function-like
+macros.
+
+When using a macro each subsequent occurrence of the macro$identifier$within
+source-file is replaced by its$replacement-list$, unless the macro occurs
+inside of a comment, a literal string or a character constant.
+
+A macro definition lasts until end of the source-file or until a corresponding
+$#undef$is encountered.
+
+Macros can be nested.
+
+
+NOTE: It is not a good programming style to specify macro arguments that
+use side effects. Macro parameters can be used several times within a macro,
+that can cause unexpected behaviour.
+Example: >
+ #define MIN(a, b) ( (a < b) ? a : b )
+
+ MIN(val1++, val2)
+<
+ would be replaced: >
+ ( (val1++ < val2) ? val1++ : val2 )
+
+
+
+I.8.1.1 Definition #define *crv-preMacDef*
+---------------------------
+ *crv-#define*
+Syntax Object-Like Macro:
+ $#define identifier replacement-list newline$
+
+Syntax Function-Like Macro:
+ $#define identifier(identifier-list) replacement-list newline$
+
+
+Example of an object-like macro: >
+ #define CONST_ADD 42
+ #define FOREVER for(;;)
+
+ int main(void)
+ {
+ int a = 0;
+
+ FOREVER
+ {
+ a += CONST_ADD;
+ ...
+ }
+ }
+<
+Example of a function-like macro: >
+ #define MIN(a, b) ( (a < b) ? a : b )
+
+ int main(void)
+ {
+ int x1, x2, x;
+
+ x1 = 2;
+ x2 = 5;
+
+ x = MIN(x1, x2);
+ }
+<
+Example of a nested macro: >
+ #define CONST1 ( 35 + CONST2 )
+ #define COSNT2 7
+<
+
+
+I.8.1.2 Cancellation #undef *crv-preMacCancel*
+----------------------------
+Syntax: $#undef identifier newline$ *crv-#undef*
+
+A macro specified by$identifier$is no longer a macro name. If$identifier$is
+currently no macro, this directive is ignored.
+
+Example: >
+ #define CONST 5
+
+ int main(void)
+ {
+ ...
+ a = CONST;
+ ...
+
+ #undef CONST
+
+ a = CONST; // will cause an error at compilation time
+ }
+<
+
+
+I.8.1.3 # Operator *crv-preMac#Operator*
+-------------------
+ *crv-#*
+The preprocessor operator$#$converts an argument of a function-like macro to a
+string literal.
+
+Example: >
+ #define PRINT1(var) printf("Value of "#var" is: %d\n", var)
+ #define PRINT2(var) printf("Value of %s is: %d\n", #var, var)
+
+ int main(void)
+ {
+ int a = 2;
+ int b = 3;
+
+ PRINT1(a); // prints: Value of a is: 2
+ PRINT2(b); // prints: Value of b is: 3
+ }
+
+
+
+I.8.1.4 ## Operator *crv-preMac##Operator*
+--------------------
+ *crv-##*
+The preprocessor operator$##$concatenates two tokens.
+
+Example: >
+ #define PRINT(prefix, postfix) printf("Value is: %d\n", prefix ## postfix)
+
+ int main(void)
+ {
+ int varCar = 2;
+ int varHouse = 3;
+
+ PRINT(var, Car); // prints: Value is: 2
+ PRINT(var, House); // prints: Value is: 3
+ }
+
+
+
+I.8.1.5 Predefined Macros *crv-preMacPredefined*
+--------------------------
+
+There is a set of predefined macro names. They are not allowed to be changed.
+ *crv-__DATA__*
+$__DATA__$ This macro is evaluated to a string literal representing the
+ date when compilation of the current source-file began. Its
+ form is "Mmm dd yyyy". The names of the months are the same as
+ those generated by the$asctime()$function.
+ *crv-__FILE__*
+$__FILE__$ This macro is evaluated to a string literal representing the
+ name of the current source-file.
+ *crv-__LINE__*
+$__LINE__$ This macro is evaluated to a decimal constant representing the
+ current line number.
+ *crv-__STDC__*
+$__STDC__$ The integer constant 1. Used to indicate if this is a standard
+ C compiler.
+
+$__STDC_HOSTED__$ *crv-__STDC_HOSTED__*
+ This macro is evaluated to an integer constant value. If 1
+ the compiler is hosted, if 0 it is not.
+
+$__STDC_VERSION__$ *crv-__STDC_VERSION__*
+ This macro is evaluated to a$long int$value that belongs to the
+ revision of the International C Standard.
+ *crv-__TIME__*
+$__TIME__$ This macro is evaluated to a string literal representing the
+ time when compilation of the current source-file began. Its
+ form is "hh:mm:ss", the same as what is generated the$asctime()$
+ function.
+
+
+Furthermore the compiler conditionally provides the following macros:
+
+$__STDC_IEC_559__$ *crv-__STDC_IEC_559__*
+ The integer constant 1. Used to indicate if this C compiler is
+ conform to the floating-point standard IEC 60559.
+
+$__STDC_IEC_559_COMPLEX__$ *crv-__STDC_IEC_559_COMPLEX__*
+ The integer constant 1. Used to indicate if this C compiler's
+ complex arithmetic is conform to the floating-point standard
+ IEC 60559.
+
+$__STDC_ISO_10646__$ *crv-__STDC_ISO10646__*
+ This macro is evaluated to a$long int$constant value of the
+ form yyyymm. Its intention is to indicate that values of
+ $wchar_t$are the coded representations of the characters defined
+ by ISO/IEC 10646. The year/month refers to the ISO/IEC 10646
+ including amendments and corrections this implementation is
+ conform to.
+
+
+
+------------------------------------------------------------------------------
+I.8.2 Conditional Compilation *crv-preConditional*
+
+There are preprocessor directives that allow to control which part of a
+source-code is to be or is not to be translated (conditional compilation).
+
+
+I.8.2.1 defined Operator *crv-preCondDefined*
+-------------------------
+ *crv-defined*
+Syntax: $defined identifier$
+ or$defined (identifier)$
+
+
+The$defined$operator evaluates to 1 if$identifier$is defined, else it
+evaluates to 0.$identifier$is a macro name.
+
+$defined$operators can be combined in any logical expression using logical
+operators (see |crv-opLogical|).
+$defined$is allowed to be used in the expression of an$#if$or$#elif$directive.
+
+
+Example: >
+ #if defined(MACRO1) || (defined(MACRO2) && !defined(MACRO3))
+ ...
+ #endif
+
+
+I.8.2.2 #if Directive *crv-preCondIf*
+----------------------
+ *crv-#if*
+Syntax: $#if constant-expression newline$
+
+
+This preprocessor directive checks whether the constant expression evaluates
+to nonzero. If so, the source-code between$#if$and the corresponding$#endif$,
+$#else$or$#elif$is passed to compiler, else it's skipped.
+
+The constant expression may be a$defined$operator, a macro name or any
+constant integer expression. Not allowed are type-casts, keywords or
+expressions that need memory ($++$,$--$...).
+If a macro name used in the constant expression does not exist, it's treated
+as zero.
+
+Example: >
+ #if defined(MACRO1) || (defined(MACRO2) && !defined(MACRO3))
+ ...
+ #endif
+
+ #if (CONST_VALUE + 5 == 8)
+ ... // its value is 8
+ #else
+ ... // its value is not 8
+ #endif
+
+
+
+I.8.2.3 #ifdef Directive *crv-preCondIfdef*
+-------------------------
+ *crv-#ifdef*
+Syntax: $#ifdef identifier newline$
+
+
+This preprocessor directive checks whether the identifier is currently
+defined. If so, the source-code between$#ifdef$and the corresponding$#endif$,
+$#else$or$#elif$is passed to compiler, else it's skipped.
+
+Example: >
+ #define DEBUG 1
+
+ #ifdef DEBUG
+ ... // that is passed to the compiler
+ #endif
+
+
+
+I.8.2.4 #ifndef Directive *crv-preCondIfndef*
+--------------------------
+ *crv-#ifndef*
+Syntax: $#ifndef identifier newline$
+
+
+This preprocessor directive checks whether the identifier is currently not
+defined. If so, the source-code between$#ifndef$and the corresponding$#endif$,
+$#else$or$#elif$is passed to compiler, else it's skipped.
+
+Example: >
+ #define DEBUG 1
+
+ #ifndef DEBUG
+ ... // that is not passed to the compiler
+ #endif
+
+
+
+I.8.2.5 #else Directive *crv-preCondElse*
+------------------------
+ *crv-#else*
+Syntax: $#else newline$
+
+
+This directive is used together with$#if$,$#ifdef$or$#ifndef$. If the "if"
+does not evaluate to nonzero, the source code between the matching$else$and
+the$endif$is passed to compiler.
+
+Example: >
+ #define DEBUG 1
+
+ #ifndef DEBUG
+ ... // that is not passed to the compiler
+ #else
+ ... // that is passed to the compiler
+ #endif
+
+
+
+I.8.2.6 #elif Directive *crv-preCondElif*
+------------------------
+ *crv-#elif*
+Syntax: $#elif constant-expression newline$
+
+
+This directive provides an else-if statement. It can be used together
+with$#if$,$#ifdef$,$#ifndef$or another$#elif$. If the corresponding "if" does
+not evaluate to nonzero the$#elif$'s constant expression is tested to be
+nonzero. If so, the source-code between$#elif$and the matching$#else$,$#elif$
+or$#endif$is passed to the compiler, else not.
+
+See |crv-preCondIf| for further information on the constant expression.
+
+Example: >
+ #if (CONST_VALUE + 5 == 8)
+ ... // its value is 8
+ #elif (CONST_VALUE + 5 == 9)
+ ... // its value is 9
+ #endif
+
+
+
+I.8.2.7 #endif Directive *crv-preCondEndif*
+-------------------------
+ *crv-#endif*
+Syntax: $#endif newline$
+
+
+This directive is used to finish one of this directives:$#if$,$#ifdef$,
+$#ifndef$,$elif$or$else$.
+
+
+Example: >
+ #ifdef DEBUG
+ ...
+ #endif
+
+
+
+------------------------------------------------------------------------------
+I.8.3 File Inclusion #include *crv-preSourceInc*
+ *crv-#include*
+Syntax: $#include "filename" newline$ (1)
+ $#include <filename> newline$ (2)
+ $#include macro-name newline$ (3)
+
+
+This preprocessor directive causes the replacement of that directive by the
+entire contents of the file specified by$filename$.
+
+Files enclosed in <...> are searched in an implementation-defined manner.
+Files enclosed in quotes "..." are searched in an implementation-defined
+manner too, if a file is not found it is searched in the same way like
+files enclosed in <...>.
+
+In general, form (1) is used to include user files whereas form (2) is used
+to include standard library files.
+
+This directive does support macro replacement (form (3)).
+
+Nesting is allowed, an included file may itself contain$#include$directives.
+But nesting easy leads to the situation that files are included several times,
+which would waste time and may cause compilation errors. There is a standard
+way to prevent that a file is included twice due to nesting. It is called
+"wrapper #ifndef". Do the following in included files to avoid processing
+them twice: >
+ // file foo.h
+
+ #ifndef _FOO_H_
+ #define _FOO_H_
+
+ ... the entire file
+
+ #endif // #endif of _FOO_H_
+
+
+Example: >
+ #include <stdio.h>
+
+ #include "galer.h"
+
+
+ #define HEADER_FILE "datatype.h"
+
+ #include HEADER_FILE
+
+
+
+
+------------------------------------------------------------------------------
+I.8.4 Line Control #line *crv-preLine*
+ *crv-#line*
+Syntax: $#line digit-sequence newline$ (1)
+ $#line digit-sequence "filename" newline$ (2)
+ $#line macro-names newline$ (3)
+
+
+This preprocessor directive allows to change the current line number and/or
+the name of the current source-code file.
+
+The$#line$directive gives the next line in source-code a new line-number.
+The line numbers of the subsequent lines are derived from this number by
+incrementing for each new line.
+The new line-number is specified by$digit-sequence$. Line numbers must be
+in the range of 1 to 2147483647.
+
+Furthermore for the current source-code file a new filename can be specified
+($filename$).
+
+Form (1) can be used to set a new line number. Form (2) can be used to set
+both, a new line number and a new filename.
+In form (3) the macro-names are expanded, the result must match either
+form (1) or (2). Its then processed appropriate.
+
+The$#line$directive effects the predefined macros$#__LINE__$and$#__FILE__$.
+
+Example: >
+ #line 1000 "GALer.c"
+or >
+ #define NEW_LINE_NUMBER 1000
+ #define SOURCE "GALer.c"
+
+ #line NEW_LINE_NUMBER SOURCE
+ printf("%d %s\n", __LINE__, __FILE__); // result is: 1000 GALer.c
+
+
+
+------------------------------------------------------------------------------
+I.8.5 Error Directive #error *crv-preError*
+ *crv-#error*
+Syntax: $#error message newline$
+
+ $message$is optional
+
+
+This preprocessor directive causes the compiler to print a diagnostic message
+that includes$message$and cancel compilation.
+
+Example: >
+ #if defined UNIX
+ ...
+ #elif defined LINUX
+ ...
+ #elif
+ #error Error: no system specified
+ #endif
+<
+ If neither UNIX nor LINUX is defined, the compiler prints an error message:
+ "Error: no system specified" and cancels compilation.
+
+
+
+------------------------------------------------------------------------------
+I.8.6 Pragma Directive #pragma *crv-prePragma*
+ *crv-#pragma*
+Syntax: $#pragma directive newline$
+
+
+This preprocessor directive provides further control over the compiler. Which
+$#pragma$directives an implementation provides is implementation specific.
+If a$#pragma$directive is not known by the implementation, it is ignored.
+
+
+Example: >
+ #pragma Int16 // use 16 bit integer for this file
+
+ #pragma DISABLE_WARNING_32 // disable warning 32 for this file
+ ... do stuff that would cause a warning 32
+ #pragma ENABLE_WARNING_32
+
+
+
+
+------------------------------------------------------------------------------
+I.8.7 Null Directive # *crv-preNull*
+
+Syntax: $# newline$
+
+The preprocessor directive of the form$# newline$has no effect.
+
+
+
+
+
+
+==============================================================================
+Chapter II STANDARD C LIBRARY *crv-stdCLib*
+==============================================================================
+
+The C language provides no built-in facilities for performing such common
+operations as input/output, memory management, string manipulation, and the
+like. Instead, these facilities are defined in a standard C library which can
+be linked to program.
+Subject of this chapter is the standard C library as specified by the ISO C
+standard.
+
+
+==============================================================================
+II.1 Standard Headers *crv-libHeaders*
+
+Below is an alphabetically sorted list of all header files of the standard C
+library.
+
+ Header | Short Description
+ --------------+-----------------------------------------------------------
+ $<assert.h> $| diagnostics.............................|crv-libAssertH|
+ $<complex.h> $| complex arithmetic......................|crv-libComplexH|
+ $<ctype.h> $| character handling......................|crv-libCtypeH|
+ $<errno.h> $| error codes.............................|crv-libErrnoH|
+ $<fenv.h> $| floating point environment..............|crv-libFenvH|
+ $<float.h> $| characteristics of floating point types.|crv-libFloatH|
+ $<inttypes.h>$| format conversion of integer types......|crv-libInttypesH|
+ $<iso646.h> $| alternative spelling....................|crv-libIso646H|
+ $<limits.h> $| sizes of integer types..................|crv-libLimitsH|
+ $<local.h> $| localization............................|crv-libLocalH|
+ $<math.h> $| mathematics.............................|crv-libMathH|
+ $<setjmp.h> $| nonlocal jumps..........................|crv-libSetjmpH|
+ $<signal.h> $| signal handling.........................|crv-libSignalH|
+ $<stdarg.h> $| variable arguments......................|crv-libStdargH|
+ $<stdbool.h> $| boolean type and values.................|crv-libStdboolH|
+ $<stddef.h> $| common definitions......................|crv-libStddefH|
+ $<stdint.h> $| integer types...........................|crv-libStdintH|
+ $<stdio.h> $| input / output..........................|crv-libStdioH|
+ $<stdlib.h> $| general utilities.......................|crv-libStdlibH|
+ $<string.h> $| string handling.........................|crv-libStringH|
+ $<tgmath.h> $| type-generic math.......................|crv-libTgmathH|
+ $<time.h> $| date and time...........................|crv-libTimeH|
+ $<wchar.h> $| extended multibyte and wide.............|crv-libWcharH|
+ | character utilities
+ $<wctype.h> $| wide character classification and.......|crv-libWctypeH|
+ | mapping utilities
+
+
+
+==============================================================================
+II.2 <assert.h> Diagnostics *crv-libAssertH*
+
+ Quicklink:
+ $assert()$ Macro |crv-assert|
+ $NDEBUG$ Macro |crv-NDEBUG|
+
+
+assert() Macro *crv-assert* *crv-NDEBUG*
+--------------
+Synopsis~
+ $#include <assert.h>$
+ $void assert (int expression);$
+
+Return~
+ none
+
+Description~
+The macro$assert()$tests the value of$expression$. If it is false (zero),
+the$assert()$macro writes the following information on the standard error
+stream:
+ - text of argument
+ - name of source file
+ - line number
+ - name of the enclosing function
+The format of output is implementation-defined. After writing this information
+the program is terminated by calling the$abort()$function.
+
+If the macro$NDEBUG$is defined before including$<assert.h>$,$assert()$is
+defined as follows:
+ $#define assert(ignore) ((void)0)$
+This means that the macro has no effect,$expression$is even not evaluated.
+
+Note: The assert facility is designed for detecting internal inconsistency;
+it is not suitable for reporting invalid input or improper usage by the user
+of the program.
+
+
+
+
+==============================================================================
+II.3 <complex.h> Complex Math *crv-libComplexH*
+
+This header file defines macros and declares functions that allow to do
+complex arithmetic.
+
+Quicklink:
+ $_Complex_I$ Macro |crv-_Complex_I|
+ $_Imaginary_I$ Macro |crv-_Imaginary_I|
+ $cabs()$ Func |crv-cabs|
+ $cabsf()$ Func |crv-cabsf|
+ $cabsl()$ Func |crv-cabsl|
+ $cacos()$ Func |crv-cacos|
+ $cacosf()$ Func |crv-cacosf|
+ $cacosl()$ Func |crv-cacosl|
+ $casin()$ Func |crv-casin|
+ $casinf()$ Func |crv-casinf|
+ $casinl()$ Func |crv-casinl|
+ $catan()$ Func |crv-catan|
+ $catanf()$ Func |crv-catanf|
+ $catanl()$ Func |crv-catanl|
+ $cacosh()$ Func |crv-cacosh|
+ $cacoshf()$ Func |crv-cacoshf|
+ $cacoshl()$ Func |crv-cacoshl|
+ $carg()$ Func |crv-carg|
+ $cargf()$ Func |crv-cargf|
+ $cargl()$ Func |crv-cargl|
+ $casinh()$ Func |crv-casinh|
+ $casinhf()$ Func |crv-casinhf|
+ $casinhl()$ Func |crv-casinhl|
+ $catanh()$ Func |crv-catanh|
+ $catanhf()$ Func |crv-catanhf|
+ $catanhl()$ Func |crv-catanhl|
+ $ccos()$ Func |crv-ccos|
+ $ccosf()$ Func |crv-ccosf|
+ $ccosl()$ Func |crv-ccosl|
+ $ccosh()$ Func |crv-ccosh|
+ $ccoshf()$ Func |crv-ccoshf|
+ $ccoshl()$ Func |crv-ccoshl|
+ $cexp()$ Func |crv-cexp|
+ $cexpf()$ Func |crv-cexpf|
+ $cexpl()$ Func |crv-cexpl|
+ $cimag()$ Func |crv-cimag|
+ $cimagf()$ Func |crv-cimagf|
+ $cimagl()$ Func |crv-cimagl|
+ $clog()$ Func |crv-clog|
+ $clogf()$ Func |crv-clogf|
+ $clogl()$ Func |crv-clogl|
+ $conj()$ Func |crv-conj|
+ $conjf()$ Func |crv-conjf|
+ $conjl()$ Func |crv-conjl|
+ $cpow()$ Func |crv-cpow|
+ $cpowf()$ Func |crv-cpowf|
+ $cpowl()$ Func |crv-cpowl|
+ $cproj()$ Func |crv-cproj|
+ $cprojf()$ Func |crv-cprojf|
+ $cprojl()$ Func |crv-cprojl|
+ $creal()$ Func |crv-creal|
+ $crealf()$ Func |crv-crealf|
+ $creall()$ Func |crv-creall|
+ $csinh()$ Func |crv-csinh|
+ $csin()$ Func |crv-csin|
+ $csinf()$ Func |crv-csinf|
+ $csinl()$ Func |crv-csinl|
+ $csinh()$ Func |crv-csinh|
+ $csinhf()$ Func |crv-csinhf|
+ $csinhl()$ Func |crv-csinhl|
+ $csqrt()$ Func |crv-csqrt|
+ $csqrtf()$ Func |crv-csqrtf|
+ $csqrtl()$ Func |crv-csqrtl|
+ $ctan()$ Func |crv-ctan|
+ $ctanf()$ Func |crv-ctanf|
+ $ctanl()$ Func |crv-ctanl|
+ $ctanh()$ Func |crv-ctanh|
+ $ctanhf()$ Func |crv-ctanhf|
+ $ctanhl()$ Func |crv-ctanhl|
+ $complex$ Macro |crv-complex|
+ $CX_LIMITED_RANGE$ Pragma |crv-CX_LIMITED_RANGE|
+ $I$ Macro |crv-I|
+ $imaginary$ Macro |crv-imaginary|
+
+
+------------------------------------------------------------------------------
+II.3.1 Macros *crv-libCHMac*
+
+
+_Complex_I Macro *crv-_Complex_I*
+----------------
+This macro expands to$const float _Complex$with the complex number "0+1i".
+
+
+_Imaginary_I Macro *crv-_Imaginary_I*
+------------------
+This macro is defined only if the compiler supports imaginary types.
+If defined, it expands to$_Imaginary$and a constant expression of the type
+$const float _Imaginary$with the value "0+1i".
+
+
+complex Macro *crv-complex*
+-------------
+This macro expands to$_Complex$.
+
+
+I Macro *crv-I*
+-------
+This macro either expands to$_Imaginary_I$or$_Complex_I$. If$_Imaginary_I$is
+not defined$I$expands to$_Complex_I$.
+
+
+imaginary Macro *crv-imaginary*
+---------------
+This macro is defined only if the compiler supports imaginary types.
+If defined, it expands to$_Imaginary$and a constant expression of the type
+$const float _Imaginary$with the value "0+1i".
+
+
+
+------------------------------------------------------------------------------
+II.3.2 Pragmas *crv-libCHPrag*
+
+
+CX_LIMITED_RANGE Pragma *crv-CX_LIMITED_RANGE*
+-----------------------
+Synopsis~
+ $#include <complex.h>$
+ $#pragma STDC CX_LIMITED_RANGE on/off-switch$
+
+ $on/off-switch$is$ON$,$OFF$or$DEFAULT$
+
+Description~
+Complex arithmetic is problematic because of their treatment of infinities
+and because of undue overflow and underflow.
+If this pragma is on the compiler is informed that the usual mathematical
+formulas can be used. If on, the compiler can use this formulas:
+ (x + iy)x(u + iv) = (xu - yv) + i(yu + xv)
+
+ (x + iy) / ( u + iv) = [(xu + yv) + i(yu - xv)] / (u^2 + v^2)
+
+ -----------
+ | x + iy | = \| x^2 + y^2
+
+When inside a compound statement, the pragma takes effect from its occurrence
+until end of compound statement or until the next$CX_LIMITED_RANGE$is
+encountered; at the end of a compound statement the state of the pragma is
+restored to its state just before entering that compound statement.
+When outside a compound statement, the pragma takes effect from its occurrence
+until end of source-file or until the next$CX_LIMITED_RANGE$is encountered.
+The default state of this pragma is off.
+
+
+
+------------------------------------------------------------------------------
+II.3.3 Trigonometric *crv-libCHTrig*
+
+
+cacos() Functions *crv-cacos* *crv-cacosf* *crv-cacosl*
+-----------------
+Synopsis~
+ $#include <complex.h>$
+ $double complex cacos(double complex z);$
+ $float complex cacosf(float complex z);$
+ $long double complex cacosl(long double complex z);$
+
+Return~
+return complex arc cosine of z in radians
+Values: imaginary is unbounded, real is in the interval [0, PI]
+
+Description~
+These functions compute the complex arc cosine of z, with branch cuts outside
+the interval [-1, +1] along real axis.
+
+
+
+casin() Functions *crv-casin* *crv-casinf* *crv-casinl*
+-----------------
+Synopsis~
+ $#include <complex.h>$
+ $double complex casin(double complex z);$
+ $float complex casinf(float complex z);$
+ $long double complex casinl(long double complex z);$
+
+Return~
+return complex arc sine of z in radians
+Range: imaginary is unbounded, real is in the interval [-PI/2, +PI/2]
+
+Description~
+These functions compute the complex arc sine of z, with branch cuts outside
+the interval [-1, +1] along real axis
+
+
+
+catan() Functions *crv-catan* *crv-catanf* *crv-catanl*
+-----------------
+Synopsis~
+ $#include <complex.h>$
+ $double complex catan(double complex z);$
+ $float complex catanf(float complex z);$
+ $long double complex catanl(long double complex z);$
+
+Return~
+return complex arc tangent of z in radians
+Range: imaginary is unbounded, real is in the interval [-PI/2, +PI/2]
+
+Description~
+These functions compute the complex arc tangent of z, with branch cuts outside
+the interval [-i, +i] along imaginary axis.
+
+
+
+ccos() Functions *crv-ccos* *crv-ccosf* *crv-ccosl*
+----------------
+Synopsis~
+ $#include <complex.h>$
+ $double complex ccos(double complex z);$
+ $float complex ccosf(float complex z);$
+ $long double complex ccosl(long double complex z);$
+
+Return~
+return complex cosine of z
+
+Description~
+These functions compute the complex cosine of z.
+The mathematical definition of the complex cosine is:
+ cos(z) = 1/2 * (exp(z*i) + exp(-z*i))
+
+
+
+csin() Functions *crv-csin* *crv-csinf* *crv-csinl*
+----------------
+Synopsis~
+ $#include <complex.h>$
+ $double complex csin(double complex z);$
+ $float complex csinf(float complex z);$
+ $long double complex csinl(long double complex z);$
+
+Return~
+return complex sine of z
+
+Description~
+These functions compute the complex sine of z.
+The mathematical definition of the complex sine is:
+ sin(z) = 1/(2*i) * (exp(z*i) - exp(-z*i))
+
+
+
+ctan() Functions *crv-ctan* *crv-ctanf* *crv-ctanl*
+----------------
+Synopsis~
+ $#include <complex.h>$
+ $double complex ctan(double complex z);$
+ $float complex ctanf(float complex z);$
+ $long double complex ctanl(long double complex z);$
+
+Return~
+return complex tangent of z
+
+Description~
+These functions compute the complex tangent of z.
+The mathematical definition of the complex tangent is:
+ tan(z) = -i * (exp(z*i) - exp(-z*i)) / (exp(z*i) + exp(-z*i))
+
+NOTE: The complex tangent has poles at PI/2 + 2n, where n is an integer.
+$ctan()$may signal overflow if z is too close to a pole.
+
+
+
+------------------------------------------------------------------------------
+II.3.4 Hyperbolic *crv-libCHHyper*
+
+
+cacosh() Functions *crv-cacosh* *crv-cacoshf* *crv-cacoshl*
+------------------
+Synopsis~
+ $#include <complex.h>$
+ $double complex cacosh(double complex z);$
+ $float complex cacoshf(float complex z);$
+ $long double complex cacoshl(long double complex z);$
+
+Return~
+return complex arc hyperbolic cosine of z
+Range: real is >= 0, imaginary is [-iPI, +iPI]
+
+Description~
+These functions compute the complex arc hyperbolic cosine of z.
+Domain: real of z >= 1
+
+
+
+casinh() Functions *crv-casinh* *crv-casinhf* *crv-casinhl*
+------------------
+Synopsis~
+ $#include <complex.h>$
+ $double complex casinh(double complex z);$
+ $float complex casinhf(float complex z);$
+ $long double complex casinhl(long double complex z);$
+
+Return~
+return complex arc hyperbolic sine of z
+Range: real is unbounded, imaginary is [-iPI/2, +iPI/2]
+
+Description~
+These functions compute the complex arc hyperbolic sine of z.
+Domain: imaginary in range [-i, +i]
+
+
+
+catanh() Functions *crv-catanh* *crv-catanhf* *crv-catanhl*
+------------------
+Synopsis~
+ $#include <complex.h>$
+ $double complex catanh(double complex z);$
+ $float complex catanhf(float complex z);$
+ $long double complex catanhl(long double complex z);$
+
+Return~
+return complex arc hyperbolic tangent of z
+Range: imaginary is unbounded, real is [-PI/2, +PI/2]
+
+Description~
+These functions compute the complex arc hyperbolic tangent of z.
+Domain: real in range [-1, +1]
+
+
+
+ccosh() Functions *crv-ccosh* *crv-ccosfh* *crv-ccoslh*
+-----------------
+Synopsis~
+ $#include <complex.h>$
+ $double complex ccosh(double complex z);$
+ $float complex ccoshf(float complex z);$
+ $long double complex ccoshl(long double complex z);$
+
+Return~
+return complex hyperbolic cosine of z
+
+Description~
+These functions compute the complex hyperbolic cosine of z.
+The mathematical definition of the complex hyperbolic cosine is:
+ cosh(z) = 1/2 * (exp(z) + exp(-z))
+
+
+
+csinh() Functions *crv-csinh* *crv-csinhf* *crv-csinhl*
+-----------------
+Synopsis~
+ $#include <complex.h>$
+ $double complex csinh(double complex z);$
+ $float complex csinhf(float complex z);$
+ $long double complex csinhl(long double complex z);$
+
+Return~
+return complex hyperbolic sine of z
+
+Description~
+These functions compute the complex hyperbolic sine of z.
+The mathematical definition of the complex hyperbolic sine is:
+ sinh(z) = 1/2 * (exp(z) - exp(-z)) / 2
+
+
+
+ctanh() Functions *crv-ctanh* *crv-ctanhf* *crv-ctanhl*
+-----------------
+Synopsis~
+ $#include <complex.h>$
+ $double complex ctanh(double complex z);$
+ $float complex ctanhf(float complex z);$
+ $long double complex ctanhl(long double complex z);$
+
+Return~
+return complex hyperbolic tangent of z
+
+Description~
+These functions compute the complex hyperbolic tangent of z.
+The mathematical definition of the complex hyperbolic tangent is:
+ tanh(z) = sinh(z) / cosh(z)
+
+
+
+------------------------------------------------------------------------------
+II.3.5 Exponential & Logarithmic *crv-libCHExpLog*
+
+
+cexp() Functions *crv-cexp* *crv-cexpf* *crv-cexpl*
+----------------
+Synopsis~
+ $#include <complex.h>$
+ $double complex cexp(double complex z);$
+ $float complex cexpf(float complex z);$
+ $long double complex cexpl(long double complex z);$
+
+Return~
+return complex base e exponential of z
+
+Description~
+These functions compute e (the base of natural logarithms) raised to the power
+of z. Mathematically, this corresponds to the value
+
+ exp(z) = exp(creal(z)) * (cos(cimag(z)) + I * sin(cimag(z)))
+
+
+
+clog() Functions *crv-clog* *crv-clogf* *crv-clogl*
+----------------
+Synopsis~
+ $#include <complex.h>$
+ $double complex clog(double complex z);$
+ $float complex clogf(float complex z);$
+ $long double complex clogl(long double complex z);$
+
+Return~
+return complex natural logarithm of z
+Range: real > 0
+
+Description~
+These functions compute the complex natural logarithm of z (base e).
+Domain: imaginary is [-iPI, +iPI], real is unbounded
+
+The mathematical definition is:
+ log(z) = log(cabs(z)) + I * carg(z)
+
+
+
+------------------------------------------------------------------------------
+II.3.6 Power & Absolute *crv-libCHPower*
+
+
+cabs() Functions *crv-cabs* *crv-cabsf* *crv-cabsl*
+----------------
+Synopsis~
+ $#include <complex.h>$
+ $double cabs(double complex z);$
+ $float cabsf(float complex z);$
+ $long double cabsl(long double complex z);$
+
+Return~
+return absolute value of z
+
+Description~
+These functions compute the absolute value of the complex number z.
+
+ ------------------------
+ absolute value = \|creal(z)^2 + cimag(z)^2
+
+
+
+cpow() Functions *crv-cpow* *crv-cpowf* *crv-cpowl*
+----------------
+Synopsis~
+ $#include <complex.h>$
+ $double complex cpow(double complex base, double complex power);$
+ $float complex cpowf(float complex base, double complex power);$
+ $long double complex cpowl(long double complex base,$
+ $ long doubl complex power);$
+
+Return~
+return complex power of z
+
+Description~
+These functions compute the complex power function x^y
+($base$raised to the power$power$).
+
+This is equivalent to:
+ exp(y * log(x))
+
+
+
+csqrt() Functions *crv-csqrt* *crv-csqrtf* *crv-csqrtl*
+-----------------
+Synopsis~
+ $#include <complex.h>$
+ $double complex csqrt(double complex z);$
+ $float complex csqrtf(float complex z);$
+ $long double complex csqrtl(long double complex z);$
+
+Return~
+return complex square root of z
+Range: real >= 0
+
+Description~
+These functions compute the complex square root of z.
+Domain: imaginary unbounded, real >= 0
+
+
+
+------------------------------------------------------------------------------
+II.3.7 Manipulating *crv-libCHMani*
+
+
+carg() Functions *crv-carg* *crv-cargf* *crv-cargl*
+----------------
+Synopsis~
+ $#include <complex.h>$
+ $double carg(double complex z);$
+ $float cargf(float complex z);$
+ $long double cargl(long double complex z);$
+
+Return~
+return argument of z
+Range: [-PI, +PI]
+
+Description~
+These functions compute the argument of the complex number z.
+The argument of a complex number is the angle in the complex plane between the
+positive real axis and a line passing through zero and the number.
+Domain: branch cut along the positive real axis
+
+
+
+cimag() Functions *crv-cimag* *crv-cimagf* *crv-cimagl*
+-----------------
+Synopsis~
+ $#include <complex.h>$
+ $double cimag(double complex z);$
+ $float cimagf(float complex z);$
+ $long double cimagl(long double complex z);$
+
+Return~
+return imaginary part of z
+
+Description~
+These functions compute the imaginary part of the complex number z.
+
+
+
+conj() Functions *crv-conj* *crv-conjf* *crv-conjl*
+----------------
+Synopsis~
+ $#include <complex.h>$
+ $double complex conj(double complex z);$
+ $float complex conjf(float complex z);$
+ $long double complex conjl(long double complex z);$
+
+Return~
+return complex conjugate value of z
+
+Description~
+These functions compute the complex conjugate of the complex number z.
+The conjugate of a complex number has the same real part and a negated
+imaginary part. In other words, conj(a + bi) = a + -bi.
+
+
+
+cproj() Functions *crv-cproj* *crv-cprojf* *crv-cprojl*
+-----------------
+Synopsis~
+ $#include <complex.h>$
+ $double complex cproj(double complex z);$
+ $float complex cprojf(float complex z);$
+ $long double complex cprojl(long double complex z);$
+
+Return~
+return value of projection onto the Riemann sphere
+
+Description~
+These functions compute the projection of the complex value z onto the Riemann
+sphere. Values with a infinite imaginary part are projected to positive
+infinity on the real axis, even if the real part is NaN. If the real part is
+infinite, the result is equivalent to
+ INFINITY + I * copysign (0.0, cimag(z))
+
+
+
+creal() Functions *crv-creal* *crv-crealf* *crv-creall*
+-----------------
+Synopsis~
+ $#include <complex.h>$
+ $double creal(double complex z);$
+ $float crealf(float complex z);$
+ $long double creall(long double complex z);$
+
+Return~
+return real part of z
+
+Description~
+These functions compute the real part of the complex number z.
+
+
+
+
+==============================================================================
+II.4 <ctype.h> Character *crv-libCtypeH*
+
+
+This header declares functions useful for case mapping and classifying
+characters.
+
+Quicklink:
+ $isalnum()$ Func |crv-isalnum|
+ $isalpha()$ Func |crv-isalpha|
+ $isblank()$ Func |crv-isblank|
+ $iscntrl()$ Func |crv-iscntrl|
+ $isdigit()$ Func |crv-isdigit|
+ $isgraph()$ Func |crv-isgraph|
+ $islower()$ Func |crv-islower|
+ $isprint()$ Func |crv-isprint|
+ $ispunct()$ Func |crv-ispunct|
+ $isspace()$ Func |crv-isspace|
+ $isupper()$ Func |crv-isupper|
+ $isxdigit()$ Func |crv-isxdigit|
+ $tolower()$ Func |crv-tolower|
+ $toupper()$ Func |crv-toupper|
+
+
+
+------------------------------------------------------------------------------
+II.4.1 Character Handling *crv-libCharHandling*
+
+Each of the functions in this section tests for membership in a particular
+class of characters; each has a name starting with is. Each of them takes
+one argument, which is a character to test, and returns an int which is
+treated as a boolean value. The character argument is passed as an int,
+and it may be the constant value EOF instead of a real character.
+
+The attributes of any given character can vary between locales.
+
+
+$int isalnum(int c);$ *crv-isalnum*
+ Returns true if c is an alphanumeric character (a letter or number); in
+ other words, if either$isalpha$or$isdigit$is true of a character, then
+ $isalnum$ is also true.
+
+
+$int isalpha(int c);$ *crv-isalpha*
+ Returns true if c is an alphabetic character (a letter). If$islower$or
+ $isupper$is true of a character, then$isalpha$is also true.
+ It returns also true, if c is one of a local-specific set of characters for
+ which none of$iscntrl$,$isdigt$,$ispunct$ or$isspcace$is true.
+
+ In some locales, there may be additional characters for which isalpha
+ is true - letters which are neither upper case nor lower case. But in
+ the standard C locale, there are no such additional characters.
+
+
+$int isblank(int c);$ *crv-isblank*
+ Returns true if c is a blank character; that is, a space or a tab.
+
+
+$int iscntrl(int c);$ *crv-iscntrl*
+ Returns true if c is a control character (that is, a character that is
+ not a printing character).
+
+
+$int isdigit(int c);$ *crv-isdigit*
+ Returns true if c is a decimal digit (0 through 9).
+
+
+$int isgraph(int c);$ *crv-isgraph*
+ Returns true if c is a graphic character; that is any printing character
+ except a space character.
+
+
+$int islower(int c);$ *crv-islower*
+ Returns true if c is a lower-case letter or is one of a local-specific set
+ of characters for which none of$iscntrl$,$isdigt$,$ispunct$ or$isspcace$is
+ true.
+
+
+$int isprint(int c);$ *crv-isprint*
+ Returns true if c is a printing character. Printing characters include
+ all the graphic characters, plus the space (' ') character.
+
+
+$int ispunct(int c);$ *crv-ispunct*
+ Returns true if c is a punctuation character. This means any printing
+ character for that is neither$isalnum$nor$isspace$is true (no
+ alphanumeric and no space character).
+
+
+$int isspace(int c);$ *crv-isspace*
+ Returns true if c is a whitespace character. In the standard "C" locale,
+ $isspace$returns true for only the standard whitespace characters:
+ ' ' space
+ '\f' formfeed
+ '\n' newline
+ '\r' carriage return
+ '\t' horizontal tab
+ '\v' vertical tab
+
+
+$int isupper(int c);$ *crv-isupper*
+ Returns true if c is an upper-case letter or is one of a local-specific set
+ of characters for which none of$iscntrl$,$isdigt$,$ispunct$ or$isspcace$is
+ true.
+
+
+$int isxdigit(int c);$ *crv-isxdigit*
+ Returns true if c is a hexadecimal digit. Hexadecimal digits include the
+ normal decimal digits 0 through 9 and the letters A through F and
+ a through f.
+
+
+
+
+------------------------------------------------------------------------------
+II.4.2 Character Mapping *crv-libCharMapping*
+
+This section explains the functions for performing case mappings on
+characters.
+These functions take one argument of type int, which is the character to
+convert, and return the converted character as an int. If the conversion is
+not applicable to the argument given, the argument is returned unchanged.
+
+
+$int tolower(int c);$ *crv-tolower*
+ If c is an upper-case letter,$tolower$returns the corresponding lower-case
+ letter. If c is not an upper-case letter, c is returned unchanged.
+
+$int toupper(int c);$ *crv-toupper*
+ If c is a lower-case letter,$toupper$returns the corresponding upper-case
+ letter. If c is not an lower-case letter, c is returned unchanged.
+
+
+
+
+==============================================================================
+II.5 <errno.h> Error Codes *crv-libErrnoH*
+
+This header file defines macros used for reporting of error conditions.
+All macros expand to integer constant expressions of type$int$with distinct
+positive values.
+
+Additional macro definitions may be specified by the implementation. They
+begin with E followed by digits or begin with E followed by uppercase letters.
+
+
+EDOM Macro *crv-EDOM*
+----------
+Domain error; used by mathematical functions when an argument value does not
+fall into the domain over which the function is defined.
+
+
+EILSEQ Macro *crv-EILSEQ*
+------------
+While decoding a multibyte character the function came along an invalid or an
+incomplete sequence of bytes or the given wide character is invalid.
+
+
+ERANGE Macro *crv-ERANGE*
+------------
+Range error; used by mathematical functions when the result value is not
+representable because of overflow or underflow.
+
+
+errno Macro/Variable *crv-errno*
+--------------------
+$errno$is either a macro or an external variable of type int (implementation-
+defined).
+
+The$errno$variable is used for holding implementation-defined error codes
+reported by library routines. See above for error code macros specified by the
+standard C language.
+The value of$errno$is set to 0 at program startup, but is never set to 0
+by any library function. Therefore,$errno$should be set to 0 before calling a
+library function and then inspected afterward.
+
+
+
+
+------------------------------------------------------------------------------
+II.6 <fenv.h> FPU Status *crv-libFenvH*
+
+This header declares types, macros and functions to provide access to the
+floating-point environment (floating-point status word and control modes).
+
+Quicklink:
+ $FE_ALL_EXCEPT$ Macro |crv-FE_ALL_EXCEPT|
+ $FE_DIVBYZERO$ Macro |crv-FE_DIVBYZERO|
+ $FE_DOWNWARD$ Macro |crv-FE_DOWNWARD|
+ $FE_INEXACT$ Macro |crv-FE_INEXACT|
+ $FE_INVALID$ Macro |crv-FE_INVALID|
+ $FE_OVERFLOW$ Macro |crv-FE_OVERFLOW|
+ $FE_TONEAREST$ Macro |crv-FE_TONEAREST|
+ $FE_TOWARDZERO$ Macro |crv-FE_TOWARDZERO|
+ $FE_UNDERFLOW$ Macro |crv-FE_UNDERFLOW|
+ $FE_UPWARD$ Macro |crv-FE_UPWARD|
+ $FENV_ACCESS$ Pragma |crv-FENV_ACCESS|
+ $feclearexcept()$ Func |crv-feclearexcept|
+ $fegetenv()$ Func |crv-fegetenv|
+ $fegetexceptflag()$ Func |crv-fegetexceptflag|
+ $fegetround()$ Func |crv-fegetround|
+ $feholdexcept()$ Func |crv-feholdexcept|
+ $feraiseexcept()$ Func |crv-feraiseexcept|
+ $fesetenv()$ Func |crv-fesetenv|
+ $fesetexceptflag()$ Func |crv-fesetexceptflag|
+ $fesetround()$ Func |crv-fesetround|
+ $fetestexcept()$ Func |crv-fetestexcept|
+ $feupdateenv()$ Func |crv-feupdateenv|
+
+
+
+------------------------------------------------------------------------------
+II.6.1 Pragmas *crv-libFHPrag*
+
+FENV_ACCESS Pragma *crv-FENV_ACCESS*
+------------------
+Synopsis~
+ $#include <fenv.h>$
+ $#pragma STDC FENV_ACCESS on/off-switch$
+
+ $on/off-switch$is$ON$,$OFF$or$DEFAULT$
+
+Description~
+This pragma provides a means to inform the compiler when a program might
+access the floating-point environment (FPU or software emulation of FP) to
+test status flags or run under non-default control modes. An "off"-state
+signals that a program does not test status flags and does not run under
+non-default control modes. Knowing this the compiler can do better
+optimization that could subvert flag tests or mode changes.
+
+When inside a compound statement, the pragma takes effect from its occurrence
+until end of compound statement or until the next$FENV_ACCESS$is encountered;
+at the end of a compound statement the state of the pragma is restored to its
+state just before entering that compound statement.
+When outside a compound statement, the pragma takes effect from its occurrence
+until end of source-file or until the next$FENV_ACCESS$is encountered.
+The default state of this pragma is implementation-defined.
+
+
+
+------------------------------------------------------------------------------
+II.6.2 Exceptions *crv-libFHExceptions*
+
+The following functions allow to query and manipulate the floating-point
+status word. They can be used to check for untrapped exceptions when it's
+convenient, rather than worrying about them in the middle of a calculation.
+
+The macros below represent the various IEEE 754 exceptions. Not all FPUs
+report all the different exceptions. Each constant is defined if and only if
+the FPU compiling for supports that exception.$#ifdef$can be used to test for
+FPU support.
+Additional macro definitions may be specified by the implementation. They
+begin with FE_ followed by uppercase letters.
+
+
+FE_INEXACT Macro *crv-FE_INEXACT*
+----------------
+The inexact exception.
+
+
+FE_DIVBYZERO Macro *crv-FE_DIVBYZERO*
+------------------
+The divide by zero exception.
+
+
+FE_UNDERFLOW Macro *crv-FE_UNDERFLOW*
+------------------
+The underflow exception.
+
+
+FE_OVERFLOW Macro *crv-FE_OVERFLOW*
+-----------------
+The overflow exception.
+
+
+FE_INVALID Macro *crv-FE_INVALID*
+----------------
+The invalid exception.
+
+
+FE_ALL_EXCEPT Macro *crv-FE_ALL_EXCEPT*
+-------------------
+This macro is the bitwise OR of all exception macros which are supported by
+the FP implementation.
+
+
+feclearexcept() Function *crv-feclearexcept*
+------------------------
+Synopsis~
+ $#include <fenv.h>$
+ $int feclearexcept(int excepts);$
+
+Return~
+zero in case the operation was successful, otherwise a non-zero value
+
+Description~
+This function clears all of the supported exception flags indicated by
+$excepts$.
+
+
+fegetexceptflag() Function *crv-fegetexceptflag*
+--------------------------
+Synopsis~
+ $#include <fenv.h>$
+ $int fegetexceptflag(fexcept_t *flagp, int excepts);$
+
+Return~
+zero in case the operation was successful, otherwise a non-zero value
+
+Description~
+This function attempts to store in the variable pointed to by$flagp$an
+implementation-defined value representing the current setting of the
+exception flags indicated by$excepts$.
+
+
+feraiseexcept() Function *crv-feraiseexcept*
+------------------------
+Synopsis~
+ $#include <fenv.h>$
+ $int feraiseexcept(int excepts);$
+
+Return~
+zero in case the operation was successful, otherwise a non-zero value
+
+Description~
+This function attempts to raises the supported exceptions indicated by
+$excepts$. If more than one exception bit in$excepts$is set the order in which
+the exceptions are raised is undefined except that overflow ($FE_OVERFLOW$) or
+underflow ($FE_UNDERFLOW$) are raised before inexact ($FE_INEXACT$). Whether
+for overflow or underflow the inexact exception is also raised is also
+implementation dependent.
+
+
+fesetexceptflag() Function *crv-fesetexceptflag*
+--------------------------
+Synopsis~
+ $#include <fenv.h>$
+ $int fesetexceptflag(fexcept_t *flagp, int excepts);$
+
+Return~
+zero in case the operation was successful, otherwise a non-zero value
+
+Description~
+This function attempts to restore the flags for the exceptions indicated by
+$excepts$to the values stored in the variable pointed to by $flagp$.
+
+
+fetestexcept() Function *crv-fetestexcept*
+-----------------------
+Synopsis~
+ $#include <fenv.h>$
+ $int fetestexcept(int excepts);$
+
+Return~
+flags which are set
+
+Description~
+Test whether the exception flags indicated by the parameter$except$are
+currently set. If any of them are, a nonzero value is returned which specifies
+which exceptions are set. Otherwise the result is zero.
+
+
+
+------------------------------------------------------------------------------
+II.6.3 Rounding *crv-libFHRounding*
+
+Floating-point calculations are carried out internally with extra precision,
+and then rounded to fit into the destination type. This ensures that results
+are as precise as the input data. IEEE 754 defines four possible rounding
+modes:
+
+- Round to nearest
+ This is the default mode. It should be used unless there is a specific need
+ for one of the others. In this mode results are rounded to the nearest
+ representable value. If the result is midway between two representable
+ values, the even representable is chosen. Even here means the lowest-order
+ bit is zero. This rounding mode prevents statistical bias and guarantees
+ numeric stability: round-off errors in a lengthy calculation will remain
+ smaller than half of$FLT_EPSILON$.
+
+- Round toward plus Infinity
+ All results are rounded to the smallest representable value which is greater
+ than the result.
+
+- Round toward minus Infinity
+ All results are rounded to the largest representable value which is less
+ than the result.
+
+- Round toward zero
+ All results are rounded to the largest representable value whose magnitude
+ is less than that of the result. In other words, if the result is negative
+ it is rounded up; if it is positive, it is rounded down.
+
+For examples of effects see |crv-FLT_ROUNDS|.
+
+$<fenv.h>$defines constants which you can use to refer to the various rounding
+modes. Each one will be defined if and only if the FPU supports the
+corresponding rounding mode.
+
+
+FE_TONEAREST Macro *crv-FE_TONEAREST*
+------------------
+Round to nearest.
+
+
+FE_UPWARD Macro *crv-FE_UPWARD*
+---------------
+Round toward +&infin;.
+
+
+FE_DOWNWARD Macro *crv-FE_DOWNWARD*
+-----------------
+Round toward -&infin;.
+
+
+FE_TOWARDZERO Macro *crv-FE_TOWARDZERO*
+-------------------
+Round toward zero.
+
+
+Underflow is an unusual case. Normally, IEEE 754 floating point numbers are
+always normalized. Numbers smaller than 2^r (where r is the minimum exponent
+cannot be represented as normalized numbers. Rounding all such numbers to zero
+or 2^r would cause some algorithms to fail at 0. Therefore, they are left in
+denormalized form. That produces loss of precision, since some bits of the
+mantissa are stolen to indicate the decimal point.
+
+If a result is too small to be represented as a denormalized number, it is
+rounded to zero. However, the sign of the result is preserved; if the
+calculation was negative, the result is negative zero. Negative zero can also
+result from some operations on infinity, such as 4/-&infin;. Negative zero
+behaves identically to zero except when the copysign or signbit functions are
+used to check the sign bit directly.
+
+
+At any time one of the above four rounding modes is selected. The following
+functions allow to get and set the rounding modes:
+
+
+fegetround() Function *crv-fegetround*
+---------------------
+Synopsis~
+ $#include <fenv.h>$
+ $int fegetround(void);$
+
+Return~
+currently selected rounding mode
+
+Description~
+Returns the currently selected rounding mode, represented by one of the values
+of the defined rounding mode macros.
+
+
+fesetround() Function *crv-fesetround*
+---------------------
+Synopsis~
+ $#include <fenv.h>$
+ $int fesetround(int round);$
+
+Return~
+zero if it changed the rounding mode, a nonzero value if the mode is not
+supported
+
+Description~
+Changes the currently selected rounding mode to$round$. If$round$does not
+correspond to one of the supported rounding modes nothing is changed.
+
+You should avoid changing the rounding mode if possible. It can be an
+expensive operation; also, some hardware requires you to compile your
+program differently for it to work. The resulting code may run slower. See
+your compiler documentation for details.
+
+
+
+
+------------------------------------------------------------------------------
+II.6.4 Environment *crv-libFHEnv*
+
+The functions in this section manage the floating-point environment.
+
+ *crv-fentv_t*
+The functions to save and restore the floating-point environment all use a
+variable of type$fenv_t$to store information. This type is defined in
+$<fenv.h>$. Its size and contents are implementation-defined. This variable
+should not be manipulated directly.
+
+
+fegetenv() Function *crv-fegetenv*
+-------------------
+Synopsis~
+ $#include <fenv.h>$
+ $int fegetenv(fenv_t *envp);$
+
+Return~
+zero in case the operation was successful, otherwise a non-zero value
+
+Description~
+Store the floating-point environment in the variable pointed to by$envp$.
+
+
+feholdexcept() Function *crv-feholdexcept*
+-----------------------
+Synopsis~
+ $#include <fenv.h>$
+ $int feholdexcept(fenv_t *envp);$
+
+Return~
+zero in case the operation was successful, otherwise a non-zero value
+
+Description~
+Store the current floating-point environment in the object pointed to by
+$envp$. Then clear all exception flags, and set the FPU to trap no exceptions.
+Not all FPUs support trapping no exceptions; if$feholdexcept$cannot set this
+mode, it returns nonzero value.
+
+
+fesetenv() Function *crv-fesetenv*
+-------------------
+Synopsis~
+ $#include <fenv.h>$
+ $int fesetenv(const fenv_t *envp);$
+
+Return~
+zero in case the operation was successful, otherwise a non-zero value
+
+Description~
+Set the floating-point environment to that described by$envp$.
+
+
+feupdateenv() Function *crv-feupdateenv*
+----------------------
+Synopsis~
+ $#include <fenv.h>$
+ $int feupdateenv(const fenv_t *envp);$
+
+Return~
+zero in case the operation was successful, otherwise a non-zero value
+
+Description~
+Like$fesetenv()$, this function sets the floating-point environment to that
+described by$envp$. However, if any exceptions were flagged in the status word
+before$feupdateenv()$was called, they remain flagged after the call. In other
+words, after$feupdateenv()$is called, the status word is the bitwise OR of the
+previous status word and the one saved in$envp$.
+
+
+
+
+==============================================================================
+II.7 <float.h> Floating Point *crv-libFloatH*
+
+This header file defines several macros that expand to various
+implementation-specific limits and parameters describing floating-point
+properties.
+NOTE: The values are platform- and implementation-specific.The ISO C standard
+specifies minimum and maximum values for most of these parameters.
+
+Macro names starting with FLT_ refer to the float type, while names beginning
+with DBL_ refer to the double type and names beginning with LDBL_ refer to the
+long double type.
+
+Quicklink:
+ $FLT_DIG $ Macro |crv-FLT_DIG|
+ $FLT_EPSILON $ Macro |crv-FLT_EPSILON|
+ $FLT_MANT_DIG $ Macro |crv-FLT_MANT_DIG|
+ $FLT_MAX $ Macro |crv-FLT_MAX|
+ $FLT_MAX_10_EXP $ Macro |crv-FLT_MAX_10_EXP|
+ $FLT_MAX_EXP $ Macro |crv-FLT_MAX_EXP|
+ $FLT_MIN $ Macro |crv-FLT_MIN|
+ $FLT_MIN_10_EXP $Macro |crv-FLT_MIN_10_EXP|
+ $FLT_MIN_EXP $ Macro |crv-FLT_MIN_EXP|
+ $FLT_RADIX $ Macro |crv-FLT_RADIX|
+ $FLT_ROUNDS $ Macro |crv-FLT_ROUNDS|
+ $DBL_DIG $ Macro |crv-DBL_DIG|
+ $DBL_EPSILON $ Macro |crv-DBL_EPSILON|
+ $DBL_MANT_DIG $ Macro |crv-DBL_MANT_DIG|
+ $DBL_MAX $ Macro |crv-DBL_MAX|
+ $DBL_MAX_10_EXP $ Macro |crv-DBL_MAX_10_EXP|
+ $DBL_MAX_EXP $ Macro |crv-DBL_MAX_EXP|
+ $DBL_MIN $ Macro |crv-DBL_MIN|
+ $DBL_MIN_10_EXP $Macro |crv-DBL_MIN_10_EXP|
+ $DBL_MIN_EXP $ Macro |crv-DBL_MIN_EXP|
+ $LDBL_DIG $ Macro |crv-LDBL_DIG|
+ $LDBL_EPSILON $ Macro |crv-LDBL_EPSILON|
+ $LDBL_MANT_DIG $ Macro |crv-LDBL_MANT_DIG|
+ $LDBL_MAX $ Macro |crv-LDBL_MAX|
+ $LDBL_MAX_10_EXP$ Macro |crv-LDBL_MAX_10_EXP|
+ $LDBL_MAX_EXP $ Macro |crv-LDBL_MAX_EXP|
+ $LDBL_MIN $ Macro |crv-LDBL_MIN|
+ $LDBL_MIN_10_EXP $Macro |crv-LDBL_MIN_10_EXP|
+ $LDBL_MIN_EXP $ Macro |crv-LDBL_MIN_EXP|
+
+
+
+FLT_ROUNDS Macro *crv-FLT_ROUNDS*
+----------------
+This value characterizes the rounding mode for floating point addition. The
+following values indicate standard rounding modes:
+
+ Value | Mode
+ --------+----------------------------------------------------------------
+ -1 | the mode is indeterminable
+ 0 | rounding is towards zero, see |crv-libFHRounding|
+ 1 | rounding is to the nearest number, see |crv-libFHRounding|
+ 2 | rounding is towards positive infinity, see |crv-libFHRounding|
+ 3 | rounding is towards negative infinity, see |crv-libFHRounding|
+
+Any other value represents a machine-dependent nonstandard rounding mode.
+
+On most machines, the value is 1, in accordance with the IEEE standard for
+floating point.
+
+Here is a table showing how certain values round for each possible value
+of$FLT_ROUNDS$, if the other aspects of the representation match the IEEE
+single-precision standard:
+
+ Value | 0 | 1 | 2 | 3
+ ------------+------+-------------+-------------+-------------
+ 1.00000003 | 1.0 | 1.0 | 1.00000012 | 1.0
+ 1.00000007 | 1.0 | 1.00000012 | 1.00000012 | 1.0
+ -1.00000003 | -1.0 | -1.0 | -1.0 | -1.00000012
+ -1.00000007 | -1.0 | -1.00000012 | -1.0 | -1.00000012
+
+
+
+FLT_RADIX Macro *crv-FLT_RADIX*
+---------------
+This is the value of the base, or radix, of the exponent representation. In
+the very most times the value is 2 (except IBM 360 and derivatives).
+
+
+FLT_MANT_DIG Macro *crv-FLT_MANT_DIG*
+DBL_MANT_DIG Macro *crv-DBL_MANT_DIG*
+LDBL_MANT_DIG Macro *crv-LDBL_MANT_DIG*
+------------------
+This is the number of base-$FLT_RADIX$digits in the floating point mantissa.
+
+
+FLT_DIG Macro *crv-FLT_DIG*
+DBL_DIG Macro *crv-DBL_DIG*
+LDBL_DIG Macro *crv-LDBL_DIG*
+--------------
+This is the number of decimal digits of precision.
+To satisfy standard C, the values supposed to be at least:
+ FLT_DIG >= 6
+ DBL_DIG >= 10
+ LDBL_DIG >= 10
+
+Technically, if p and b are the precision and base (respectively) for the
+representation, then the decimal precision q is the maximum number of decimal
+digits such that any floating point number with q base 10 digits can be
+rounded to a floating point number with p base b digits and back again,
+without change to the q decimal digits.
+
+
+FLT_MIN_EXP Macro *crv-FLT_MIN_EXP*
+DBL_MIN_EXP Macro *crv-DBL_MIN_EXP*
+LDBL_MIN_EXP Macro *crv-LDBL_MIN_EXP*
+------------------
+This is the minimum negative integer value for an exponent in base$FLT_RADIX$.
+
+
+FLT_MIN_10_EXP Macro *crv-FLT_MIN_10_EXP*
+DBL_MIN_10_EXP Macro *crv-DBL_MIN_10_EXP*
+LDBL_MIN_10_EXP Macro *crv-LDBL_MIN_10_EXP*
+---------------------
+This is the minimum negative integer value for an exponent in base 10.
+To satisfy standard C, the values supposed to be at least:
+ FLT_MIN_10_EXP <= -37
+ DBL_MIN_10_EXP <= -37
+ LDBL_MIN_10_EXP <= -37
+
+
+FLT_MAX_EXP Macro *crv-FLT_MAX_EXP*
+DBL_MAX_EXP Macro *crv-DBL_MAX_EXP*
+LDBL_MAX_EXP Macro *crv-LDBL_MAX_EXP*
+------------------
+This is the maximum integer value for an exponent in base$FLT_RADIX$.
+
+
+FLT_MAX_10_EXP Macro *crv-FLT_MAX_10_EXP*
+DBL_MAX_10_EXP Macro *crv-DBL_MAX_10_EXP*
+LDBL_MAX_10_EXP Macro *crv-LDBL_MAX_10_EXP*
+---------------------
+This is the maximum integer value for an exponent in base 10.
+To satisfy standard C, the values supposed to be at least:
+ FLT_MAX_10_EXP >= -37
+ DBL_MAX_10_EXP >= -37
+ LDBL_MAX_10_EXP >= -37
+
+
+
+FLT_MAX Macro *crv-FLT_MAX*
+DBL_MAX Macro *crv-DBL_MAX*
+LDBL_MAX Macro *crv-LDBL_MAX*
+--------------
+The value is the maximum finite number representable.
+To satisfy standard C, the values supposed to be at least:
+ FLT_MAX >= 1E+37
+ DBL_MAX >= 1E+37
+ LDBL_MAX >= 1E+37
+
+The smallest representable number is -FLT_MAX, -DBL_MAX, -LDBL_MAX.
+
+
+FLT_MIN Macro *crv-FLT_MIN*
+DBL_MIN Macro *crv-DBL_MIN*
+LDBL_MIN Macro *crv-LDBL_MIN*
+--------------
+The value is the minimum number representable.
+To satisfy standard C, the values supposed to be at least:
+ FLT_MIN <= 1E-37
+ DBL_MIN <= 1E-37
+ LDBL_MIN <= 1E-37
+
+
+FLT_EPSILON Macro *crv-FLT_EPSILON*
+DBL_EPSILON Macro *crv-DBL_EPSILON*
+LDBL_EPSILON Macro *crv-LDBL_EPSILON*
+------------------
+This is the maximum positive floating point number such that
+1.0 +$FLT_EPSILON$!= 1.0 is true (least significant digit representable).
+
+To satisfy standard C, the values supposed to be at least:
+ FLT_EPSILON >= 1E-5
+ DBL_EPSILON >= 1E-9
+ LDBL_EPSILON >= 1E-9
+
+
+
+==============================================================================
+II.8 <inttypes.h> Absolute Value *crv-libInttypesH*
+
+This header extends the$<stdint.h>$header (->|crv-libStdintH|). It provides
+macros for format conversion of integer types and provides functions for
+manipulating greatest-width integer types.
+
+Quicklink:
+ $imaxdiv_t$ Type |crv-imaxdiv_t|
+ $imaxabs$ Func |crv-imaxabs|
+ $imaxdiv$ Func |crv-imaxdiv|
+
+ $PRIdN$ Macro |crv-PRIdN|
+ $PRIdLEASTN$ Macro |crv-PRIdLEASTN|
+ $PRIdFASTN$ Macro |crv-PRIdFASTN|
+ $PRIdMAX$ Macro |crv-PRIdMAX|
+ $PRIdPTR$ Macro |crv-PRIdPTR|
+
+ $PRIiN$ Macro |crv-PRIiN|
+ $PRIiLEASTN$ Macro |crv-PRIiLEASTN|
+ $PRIiFASTN$ Macro |crv-PRIiFASTN|
+ $PRIiMAX$ Macro |crv-PRIiMAX|
+ $PRIiPTR$ Macro |crv-PRIiPTR|
+
+ $PRIoN$ Macro |crv-PRIoN|
+ $PRIoLEASTN$ Macro |crv-PRIoLEASTN|
+ $PRIoFASTN$ Macro |crv-PRIoFASTN|
+ $PRIoMAX$ Macro |crv-PRIoMAX|
+ $PRIoPTR$ Macro |crv-PRIoPTR|
+
+ $PRIuN$ Macro |crv-PRIuN|
+ $PRIuLEASTN$ Macro |crv-PRIuLEASTN|
+ $PRIuFASTN$ Macro |crv-PRIuFASTN|
+ $PRIuMAX$ Macro |crv-PRIuMAX|
+ $PRIuPTR$ Macro |crv-PRIuPTR|
+
+ $PRIxN$ Macro |crv-PRIxN|
+ $PRIxLEASTN$ Macro |crv-PRIxLEASTN|
+ $PRIxFASTN$ Macro |crv-PRIxFASTN|
+ $PRIxMAX$ Macro |crv-PRIxMAX|
+ $PRIxPTR$ Macro |crv-PRIxPTR|
+
+ $PRIXN$ Macro |crv-PRIXN|
+ $PRIXLEASTN$ Macro |crv-PRIXLEASTN|
+ $PRIXFASTN$ Macro |crv-PRIXFASTN|
+ $PRIXMAX$ Macro |crv-PRIXMAX|
+ $PRIXPTR$ Macro |crv-PRIXPTR|
+
+ $SCNdN$ Macro |crv-SCNdN|
+ $SCNdLEASTN$ Macro |crv-SCNdLEASTN|
+ $SCNdFASTN$ Macro |crv-SCNdFASTN|
+ $SCNdMAX$ Macro |crv-SCNdMAX|
+ $SCNdPTR$ Macro |crv-SCNdPTR|
+
+ $SCNiN$ Macro |crv-SCNiN|
+ $SCNiLEASTN$ Macro |crv-SCNiLEASTN|
+ $SCNiFASTN$ Macro |crv-SCNiFASTN|
+ $SCNiMAX$ Macro |crv-SCNiMAX|
+ $SCNiPTR$ Macro |crv-SCNiPTR|
+
+ $SCNoN$ Macro |crv-SCNoN|
+ $SCNoLEASTN$ Macro |crv-SCNoLEASTN|
+ $SCNoFASTN$ Macro |crv-SCNoFASTN|
+ $SCNoMAX$ Macro |crv-SCNoMAX|
+ $SCNoPTR$ Macro |crv-SCNoPTR|
+
+ $SCNuN$ Macro |crv-SCNuN|
+ $SCNuLEASTN$ Macro |crv-SCNuLEASTN|
+ $SCNuFASTN$ Macro |crv-SCNuFASTN|
+ $SCNuMAX$ Macro |crv-SCNuMAX|
+ $SCNuPTR$ Macro |crv-SCNuPTR|
+
+ $SCNxN$ Macro |crv-SCNxN|
+ $SCNxLEASTN$ Macro |crv-SCNxLEASTN|
+ $SCNxFASTN$ Macro |crv-SCNxFASTN|
+ $SCNxMAX$ Macro |crv-SCNxMAX|
+ $SCNxPTR$ Macro |crv-SCNxPTR|
+
+ $strtoimax$ Func |crv-strtoimax|
+ $strtoumax$ Func |crv-strtoumax|
+ $wcstoimax$ Func |crv-wcstoimax|
+ $wcstoumax$ Func |crv-wcstoumax|
+
+
+Macros *crv-__STDC_FORMAT_MACROS*
+------
+The following macros expand to a string (in most cases a single character)
+containing a conversion specifier suitable for use within format arguments
+of formated input/output functions, like$printf()$or$scanf()$.
+They are only defined when$__STDC_FORMAT_MACROS$is defined before including
+$<inttypes.h>$.
+For each type declared in$<stdint.h>$, corresponding macros for conversion
+specifiers for use with the formatted input/output functions are defined.
+
+The macro names have a prefix PRI for the printf family or SCN for the
+scanf family functions followed by the conversion specifier, followed by name
+that is similar to the type name this macro is for, followed by a number N.
+The number N represents the width of the type as specified in$<stdint.h>.$
+
+Example: The macro$PRIxFAST32$can be used in a format string to print an
+integer value of type$int_fast32_t$in hexedecimal format ('x').
+
+Usage see example below.
+
+
+Format Specifiers for ..printf
+------------------------------
+
+Signed Integers:
+$PRIdN$ width N, decimal notation *crv-PRIdN*
+$PRIdLEASTN$ minimum width N, decimal notation *crv-PRIdLEASTN*
+$PRIdFASTN$ width N, fast to operate with, decimal not. *crv-PRIdFASTN*
+$PRIdMAX$ type$intmax_t$, decimal notation *crv-PRIdMAX*
+$PRIdPTR$ type$intptr_t$, decimal notation *crv-PRIdPTR*
+
+$PRIiN$ width N, decimal notation *crv-PRIiN*
+$PRIiLEASTN$ minimum width N, decimal notation *crv-PRIiLEASTN*
+$PRIiFASTN$ width N, fast to operate with, decimal not. *crv-PRIiFASTN*
+$PRIiMAX$ type$intmax_t$, decimal notation *crv-PRIiMAX*
+$PRIiPTR$ type$intptr_t$, decimal notation *crv-PRIiPTR*
+
+Unsigned Integers:
+$PRIoN$ width N, octal notation *crv-PRIoN*
+$PRIoLEASTN$ minimum width N, octal notation *crv-PRIoLEASTN*
+$PRIoFASTN$ width N, fast to operate with, octal not. *crv-PRIoFASTN*
+$PRIoMAX$ type$intmax_t$, octal notation *crv-PRIoMAX*
+$PRIoPTR$ type$intptr_t$, octal notation *crv-PRIoPTR*
+
+$PRIuN$ width N, decimal notation *crv-PRIuN*
+$PRIuLEASTN$ minimum width N, decimal notation *crv-PRIuLEASTN*
+$PRIuFASTN$ width N, fast to operate with, decimal not. *crv-PRIuFASTN*
+$PRIuMAX$ type$intmax_t$, decimal notation *crv-PRIuMAX*
+$PRIuPTR$ type$intptr_t$, decimal notation *crv-PRIuPTR*
+
+$PRIxN$ width N, lowercase hex. notation *crv-PRIxN*
+$PRIxLEASTN$ minimum width N, lowercase hex. notation *crv-PRIxLEASTN*
+$PRIxFASTN$ width N, fast operation, lowercase hex. not *crv-PRIxFASTN*
+$PRIxMAX$ type$intmax_t$, lowercase hex. notation *crv-PRIxMAX*
+$PRIxPTR$ type$intptr_t$, lowercase hex. notation *crv-PRIxPTR*
+
+$PRIXN$ width N, uppercase hex. notation *crv-PRIXN*
+$PRIXLEASTN$ minimum width N, uppercase hex. notation *crv-PRIXLEASTN*
+$PRIXFASTN$ width N, fast operation, uppercase hex. not. *crv-PRIXFASTN*
+$PRIXMAX$ type$intmax_t$, uppercase hex. notation *crv-PRIXMAX*
+$PRIXPTR$ type$intptr_t$, uppercase hex. notation *crv-PRIXPTR*
+
+
+Format Specifiers for ..scanf
+-----------------------------
+
+Signed Integers:
+$SCNdN$ width N, decimal notation *crv-SCNdN*
+$SCNdLEASTN$ minimum width N, decimal notation *crv-SCNdLEASTN*
+$SCNdFASTN$ width N, fast to operate with, decimal not. *crv-SCNdFASTN*
+$SCNdMAX$ type$intmax_t$, decimal notation *crv-SCNdMAX*
+$SCNdPTR$ type$intptr_t$, decimal notation *crv-SCNdPTR*
+
+$SCNiN$ width N, decimal notation *crv-SCNiN*
+$SCNiLEASTN$ minimum width N, decimal notation *crv-SCNiLEASTN*
+$SCNiFASTN$ width N, fast to operate with, decimal not. *crv-SCNiFASTN*
+$SCNiMAX$ type$intmax_t$, decimal notation *crv-SCNiMAX*
+$SCNiPTR$ type$intptr_t$, decimal notation *crv-SCNiPTR*
+
+Unsigned Integers:
+$SCNoN$ width N, octal notation *crv-SCNoN*
+$SCNoLEASTN$ minimum width N, octal notation *crv-SCNoLEASTN*
+$SCNoFASTN$ width N, fast to operate with, octal not. *crv-SCNoFASTN*
+$SCNoMAX$ type$intmax_t$, octal notation *crv-SCNoMAX*
+$SCNoPTR$ type$intptr_t$, octal notation *crv-SCNoPTR*
+
+$SCNuN$ width N, decimal notation *crv-SCNuN*
+$SCNuLEASTN$ minimum width N, decimal notation *crv-SCNuLEASTN*
+$SCNuFASTN$ width N, fast to operate with, decimal not. *crv-SCNuFASTN*
+$SCNuMAX$ type$intmax_t$, decimal notation *crv-SCNuMAX*
+$SCNuPTR$ type$intptr_t$, decimal notation *crv-SCNuPTR*
+
+$SCNxN$ width N, hex. notation *crv-SCNxN*
+$SCNxLEASTN$ minimum width N, hex. notation *crv-SCNxLEASTN*
+$SCNxFASTN$ width N, fast operation, hex. not *crv-SCNxFASTN*
+$SCNxMAX$ type$intmax_t$, hex. notation *crv-SCNxMAX*
+$SCNxPTR$ type$intptr_t$, hex. notation *crv-SCNxPTR*
+
+
+Example: >
+ #define __STDC_FORMAT_MACROS
+
+ #include <inttypes.h>
+ #include <stdio.h>
+
+ int main(void)
+ {
+ int16_t n = -123;
+
+ printf("Value is %4" PRIu16 "\n", n);
+ }
+
+
+
+imaxdiv_t Type *crv-imaxdiv_t*
+--------------
+This is a structure type used to hold the result returned by the$imaxdiv()$
+function. It holds both, the quotient and the remainder from the division.
+
+
+
+imaxabs() Function *crv-imaxabs*
+-------------------
+Synopsis~
+ $#include <inttypes.h>$
+ $intmax_t imaxabs(intmax_t j);$
+
+Return~
+absolute value of$j$
+
+Description~
+This function computes the absolute value of an integer$j$.
+
+
+
+imaxdiv() Function *crv-imaxdiv*
+-------------------
+Synopsis~
+ $#include <inttypes.h>$
+ $intdiv_t imaxdiv(intmax_t numerator, intmax_t denominator );$
+
+Return~
+returns result of division and modulo operation, both stored in$intdiv_t$
+structur
+
+Description~
+This functions computes$numerator / denominator$and$numerator % denominator$in
+a single operation.
+
+
+
+strtoimax() Function *crv-strtoimax*
+--------------------
+Synopsis~
+ $#include <inttypes.h>$
+ $intmax_t strtoimax(const char *restrict string, char **restrict tailptr,$
+ $int base);$
+
+Return~
+converted value
+
+Description~
+This function ("string-to-imax") converts the initial part of$string$to a
+signed integer, which is returned as a value of type$intmax_t$.
+See$strol()$for description of parameters (|crv-libstrtol|).
+
+
+
+strtoumax() Function *crv-strtoumax*
+--------------------
+Synopsis~
+ $#include <inttypes.h>$
+ $uintmax_t strtoumax(const char *restrict string, char **restrict tailptr,$
+ $int base);$
+
+Return~
+converted value
+
+Description~
+This function ("string-to-umax") converts the initial part of$string$to a
+signed integer, which is returned as a value of type$uintmax_t$.
+See$stroul()$for description of parameters (|crv-libstrtoul|).
+
+
+
+wcstoimax() Function *crv-wcstoimax*
+--------------------
+Synopsis~
+ $#include <stddef.h> // for wchar_t$
+ $#include <inttypes.h>$
+ $wchar_t wcstoimax(const wchar_t *restrict string,$
+ $wchar_t **restrict tailptr, int base);$
+
+Return~
+converted value
+
+Description~
+This function is equivalent to the$strtoimax()$function in nearly all aspects
+but handles wide character strings (see |crv-libstrtoimax| for further
+information).
+
+
+
+wcstoumax() Function *crv-wcstoumax*
+--------------------
+Synopsis~
+ $#include <stddef.h> // for wchar_t$
+ $#include <inttypes.h>$
+ $wchar_t wcstoimax(const wchar_t *restrict string,$
+ $wchar_t **restrict tailptr, int base);$
+
+Return~
+converted value
+
+Description~
+This function is equivalent to the$strtoumax()$function in nearly all aspects
+but handles wide character strings (see |crv-libstrtoumax| for further
+information).
+
+
+
+==============================================================================
+II.9 <iso646.h> Alternatives *crv-libIso646H*
+
+This header defines some macros. They can be used for alternative spellings.
+
+ Macro | Expands to
+ ----------+------------
+ $and$ | $&&$
+ $and_eq$ | $&=$
+ $bitand$ | $&$
+ $bitor$ | $|$
+ $compl$ | $~$
+ $not$ | $!$
+ $not_eq$ | $!=$
+ $or$ | $||$
+ $or_eq$ | $|=$
+ $xor$ | $^$
+ $xor_eq$ | $^=$
+
+
+
+==============================================================================
+II.10 <limits.h> Limits of Integer Types *crv-libLimitsH*
+
+This header file defines several macros that expand to various limits and
+parameters of the integer types.
+NOTE: The values are platform- and implementation-specific.The ISO C standard
+specifies minimum and maximum values for most of these parameters.
+
+The macros of this header can be grouped in:
+ - range of integer type
+ - width of type
+ - selection of conversion and its properties
+
+
+Quicklink:
+ $CHAR_BIT$ Macro |crv-CHAR_BIT|
+ $CHAR_MAX$ Macro |crv-CHAR_MAX|
+ $CHAR_MIN$ Macro |crv-CHAR_MIN|
+ $INT_MAX$ Macro |crv-INT_MAX|
+ $INT_MIN$ Macro |crv-INT_MIN|
+ $LONG_LONG_MAX$ Macro |crv-LONG_LONG_MAX|
+ $LONG_LONG_MIN$ Macro |crv-LONG_LONG_MIN|
+ $LONG_MAX$ Macro |crv-LONG_MAX|
+ $LONG_MIN$ Macro |crv-LONG_MIN|
+ $MB_LEN_MAX$ Macro |crv-MB_LEN_MAX|
+ $SCHAR_MAX$ Macro |crv-SCHAR_MAX|
+ $SCHAR_MIN$ Macro |crv-SCHAR_MIN|
+ $SHRT_MAX$ Macro |crv-SHRT_MAX|
+ $SHRT_MIN$ Macro |crv-SHRT_MIN|
+ $UCHAR_MAX$ Macro |crv-UCHAR_MAX|
+ $UINT_MAX$ Macro |crv-UINT_MAX|
+ $ULONG_LONG_MAX$Macro |crv-ULONG_LONG_MAX|
+ $ULONG_MAX$ Macro |crv-ULONG_MAX|
+ $USHRT_MAX$ Macro |crv-USHRT_MAX|
+
+
+------------------------------------------------------------------------------
+II.10.1 Range of Integer Type *crv-libLHRange*
+
+Each signed integer type has a pair of macros which give the smallest and
+largest values that it can hold. Each unsigned integer type has one such
+macro, for the maximum value; the minimum value is, of course, zero.
+
+The values of these macros are all integer constant expressions. The MAX and
+MIN macros for$char$and$short int$types have values of type$int$. The MAX and
+MIN macros for the other types have values of the same type described by
+the macro - thus,$ULONG_MAX$has type$unsigned long int$.
+
+SCHAR_MIN Macro *crv-SCHAR_MIN*
+SCHAR_MAX Macro *crv-SCHAR_MAX*
+---------------
+minimum / maximum value that can be represented by a$signed char$
+
+
+UCHAR_MAX Macro *crv-UCHAR_MAX*
+---------------
+maximum value that can be represented by an$unsigned char$
+
+
+CHAR_MIN Macro *crv-CHAR_MIN*
+CHAR_MAX Macro *crv-CHAR_MAX*
+--------------
+minimum / maximum value that can be represented by a$char$
+
+
+SHRT_MIN Macro *crv-SHRT_MIN*
+SHRT_MAX Macro *crv-SHRT_MAX*
+--------------
+minimum / maximum value that can be represented by a$signed short int$
+
+
+USHRT_MAX Macro *crv-USHRT_MAX*
+---------------
+maximum value that can be represented by an$unsigned short int$
+
+
+INT_MIN Macro *crv-INT_MIN*
+INT_MAX Macro *crv-INT_MAX*
+-------------
+minimum / maximum value that can be represented by a$signed int$
+
+UINT_MAX Macro *crv-UINT_MAX*
+--------------
+maximum value that can be represented by an$unsigned int$
+
+
+LONG_MIN Macro *crv-LONG_MIN*
+LONG_MAX Macro *crv-LONG_MAX*
+--------------
+minimum / maximum value that can be represented by a$signed long int$
+
+
+ULONG_MAX Macro *crv-ULONG_MAX*
+---------------
+maximum value that can be represented by an$unsigned long int$
+
+
+LONG_LONG_MIN Macro *crv-LONG_LONG_MIN*
+LONG_LONG_MAX Macro *crv-LONG_LONG_MAX*
+-------------------
+minimum / maximum value that can be represented by a$signed long long int$
+
+
+ULONG_LONG_MAX Macro *crv-ULONG_LONG_MAX*
+--------------------
+maximum value that can be represented by an$unsigned long long int$
+
+
+
+
+------------------------------------------------------------------------------
+II.10.2 Width of Type *crv-libLHWidth*
+
+CHAR_BIT Macro *crv-CHAR_BIT*
+--------------
+this is the number of bits in a$char$- eight, on most systems. The value
+has type$int$.
+
+
+
+------------------------------------------------------------------------------
+II.10.3 Conversion and Properties *crv-libLHConv*
+
+A characteristic of each multibyte character set is the maximum number of
+bytes that can be necessary to represent one character. This information
+is quite important when writing code that uses the conversion functions.
+
+MB_LEN_MAX Macro *crv-MB_LEN_MAX*
+----------------
+Specifies the maximum number of bytes in the multibyte sequence for a single
+character in any of the supported locales. This is a compile-time constant.
+
+
+
+
+==============================================================================
+II.11 <local.h> Localization *crv-libLocalH*
+
+This header defines macros and declares functions for setting local specific
+things.
+
+Quicklink:
+ $LC_ALL$ Macro |crv-LC_ALL|
+ $LC_COLLATE$ Macro |crv-LC_COLLATE|
+ $LC_CTYPE$ Macro |crv-LC_CTYPE|
+ $LC_MONETARY$ Macro |crv-LC_MONETARY|
+ $LC_NUMERIC$ Macro |crv-LC_NUMERIC|
+ $lconf$ Type |crv-lconf|
+ $localeconf()$ Func |crv-localeconv|
+ $setlocale()$ Func |crv-setlocale|
+
+
+------------------------------------------------------------------------------
+II.11.1 Categories *crv-libLocHCat*
+
+The purposes that locales serve are grouped into categories, so that a user
+or a program can choose the locale for each category independently.
+The following macro names are both an environment variable that
+a user can set, and a macro name that can be used as an argument
+to$setlocale()$.
+Additional macro definitions beginning with LC_ followed by uppercase letters
+my be specified by the compiler.
+
+
+LC_COLLATE Macro *crv-LC_COLLATE*
+----------------
+This category applies to collation of strings (functions$strcoll()$and
+$strxfrm()$).
+
+
+LC_CTYPE Macro *crv-LC_CTYPE*
+--------------
+This category applies to classification and conversion of characters, and to
+multibyte and wide characters.
+
+
+LC_MONETARY Macro *crv-LC_MONETARY*
+-----------------
+This category applies to formatting monetary values.
+
+
+LC_NUMERIC Macro *crv-LC_NUMERIC*
+----------------
+This category applies to formatting numeric values that are not monetary.
+
+
+LC_ALL Macro *crv-LC_ALL*
+------------
+This is not an environment variable; it is only a macro that can be use with
+$setlocale()$to set a single locale for all purposes. Setting this environment
+variable overwrites all selections by the other LC_* variables.
+
+
+
+------------------------------------------------------------------------------
+II.11.2 Standard Locales *crv-libLocHLoc*
+
+There are two standard locales:
+
+"C"
+This is the standard C locale. The attributes and behavior it provides are
+specified in the ISO C standard. This is the default.
+For "C" the members of the$lconf$structure have the following values: >
+ char *decimal_point // "."
+ char *mon_decimal_point // ""
+ char *thousands_sep // ""
+ char *mon_thousands_sep // ""
+ char *grouping // ""
+ char *mon_grouping // ""
+ char int_frac_digits // CHAR_MAX
+ char frac_digits // CHAR_MAX
+ char *currency_symbol // ""
+ char *int_curr_symbol // ""
+ char p_cs_precedes // CHAR_MAX
+ char n_cs_precedes // CHAR_MAX
+ char int_p_cs_precedes // CHAR_MAX
+ char int_n_cs_precedes // CHAR_MAX
+ char p_sep_by_space // CHAR_MAX
+ char n_sep_by_space // CHAR_MAX
+ char int_p_sep_by_space // CHAR_MAX
+ char int_n_sep_by_space // CHAR_MAX
+ char *positive_sign // ""
+ char *negative_sign // ""
+ char p_sign_posn // CHAR_MAX
+ char n_sign_posn // CHAR_MAX
+ char int_p_sign_posn // CHAR_MAX
+ char int_n_sign_posn // CHAR_MAX
+An empty string or$CHAR_MAX$indicates that the value is not available
+in this local.
+
+""
+The empty name says to select a locale based on environment variables,
+see categories (|crv-libLocHCat|).
+
+
+
+------------------------------------------------------------------------------
+II.11.3 Information Structure *crv-libLocHInfo*
+
+
+lconf Type *crv-lconf*
+----------
+$lconf$is a structure giving information about numeric and monetary notation.
+According to standard C this structure must have at least the following
+elements.
+If a member of the structure has type$char$, and the value is$CHAR_MAX$,
+it means that the current locale has no value for that parameter.
+
+
+$char *decimal_point$ *crv-decimal_point*
+$char *mon_decimal_point$ *crv-mon_decimal_point*
+These are the decimal-point separators used in formatting non-monetary and
+monetary quantities, respectively.
+
+
+$char *thousands_sep$ *crv-thousands_sep*
+$char *mon_thousands_sep$ *crv-mon_thousands_sep*
+These are the separators used to delimit groups of digits to the left of the
+decimal point in formatting non-monetary and monetary quantities,
+respectively.
+
+
+$char *grouping$ *crv-grouping*
+$char *mon_grouping$ *crv-mon_grouping*
+These are strings that specify how to group the digits to the left of the
+decimal point.$grouping$applies to non-monetary quantities and$mon_grouping$
+applies to monetary quantities. Use either$thousands_sep$or$mon_thousands_sep$
+to separate the digit groups.
+
+Each member of these strings is to be interpreted as an integer value of type
+$char$. Successive numbers (from left to right) give the sizes of successive
+groups (from right to left, starting at the decimal point.) The last member
+is either 0, in which case the previous member is used over and over again
+for all the remaining groups, or$CHAR_MAX$, in which case there is no more
+grouping - or, put another way, any remaining digits form one large group
+without separators.
+
+For example, if grouping is "\04\03\02", the correct grouping for the number
+123456787654321 is 12, 34, 56, 78, 765, 4321. This uses a group of 4 digits
+at the end, preceded by a group of 3 digits, preceded by groups of 2 digits
+(as many as needed). With a separator of ,, the number would be printed as
+12,34,56,78,765,4321.
+
+A value of "\03" indicates repeated groups of three digits, as normally used
+in the U.S.
+
+
+$char int_frac_digits$ *crv-int_frac_digits*
+$char frac_digits$ *crv-frac_digits*
+These are small integers indicating how many fractional digits (to the right
+of the decimal point) should be displayed in a monetary value in international
+and local formats, respectively.
+
+
+$char *currency_symbol$ *crv-currency_symbol*
+The local currency symbol for the selected locale.
+
+
+$char *int_curr_symbol$ *crv-int_curr_symbol*
+The international currency symbol for the selected locale. The value should
+normally consist of a three-letter abbreviation.
+
+
+$char p_cs_precedes$ *crv-p_cs_precedes*
+$char n_cs_precedes$ *crv-n_cs_precedes*
+$char int_p_cs_precedes$ *crv-int_p_cs_precedes*
+$char int_n_cs_precedes$ *crv-int_n_cs_precedes*
+These members are 1 if the$currency_symbol$or$int_curr_symbol$strings should
+precede the value of a monetary amount, or 0 if the strings should follow
+the value. The$p_cs_precedes$and$int_p_cs_precedes$members apply to positive
+amounts (or zero), and the$n_cs_precedes$and$int_n_cs_precedes$members apply
+to negative amounts.
+The members with the$int_ prefix$apply to the$int_curr_symbol$while the other
+two apply to$currency_symbol$.
+
+
+$char p_sep_by_space$ *crv-p_sep_by_space*
+$char n_sep_by_space$ *crv-n_sep_by_space*
+$char int_p_sep_by_space$ *crv-int_p_sep_by_space*
+$char int_n_sep_by_space$ *crv-int_n_sep_by_space*
+These members are 1 if a space should appear between the$currency_symbol$
+or$int_curr_symbol$strings and the amount, or 0 if no space should appear.
+The$p_sep_by_space$and$int_p_sep_by_space$members apply to positive amounts
+(or zero), and the$n_sep_by_space$and$int_n_sep_by_space$members apply to
+negative amounts.
+The members with the$int_ prefix$apply to the$int_curr_symbol$while the other
+two apply to$currency_symbol$. There is one specialty with
+the$int_curr_symbol$though. Since all legal values contain a space at the
+end the string one either$printf()$this space (if the currency symbol must
+appear in front and must be separated) or one has to avoid printing this
+character at all (especially when at the end of the string).
+
+
+$char *positive_sign$ *crv-positive_sign*
+$char *negative_sign$ *crv-negative_sign*
+These are strings used to indicate positive (or zero) and negative monetary
+quantities, respectively.
+
+
+$char p_sign_posn$ *crv-p_sign_posn*
+$char n_sign_posn$ *crv-n_sign_posn*
+$char int_p_sign_posn$ *crv-int_p_sign_posn*
+$char int_n_sign_posn$ *crv-int_n_sign_posn*
+These members are small integers that indicate how to position the sign for
+nonnegative and negative monetary quantities, respectively. (The string used
+by the sign is what was specified with$positive_sign$or$negative_sign$.)
+The possible values are as follows:
+
+0 The currency symbol and quantity should be surrounded by parentheses.
+
+1 Print the sign string before the quantity and currency symbol.
+
+2 Print the sign string after the quantity and currency symbol.
+
+3 Print the sign string right before the currency symbol.
+
+4 Print the sign string right after the currency symbol.
+
+CHAR_MAX "Unspecified". Both members have this value in the standard C
+locale.
+
+The members with the$int_ prefix$apply to the$int_curr_symbol$while the other
+two apply to$currency_symbol$.
+
+
+
+------------------------------------------------------------------------------
+II.11.4 Functions *crv-libLocHFunc*
+
+
+setlocale() Function *crv-setlocale*
+--------------------
+Synopsis~
+ $#include <locale.h>$
+ $char *setlocale(int category, const char *locale);$
+
+Return~
+see description
+
+Description~
+This function sets the current locale for category$category$to$locale$.
+
+If category is$ LC_ALL$, this specifies the locale for all purposes. The other
+possible values of$category$specify an single purpose
+(see Categories |crv-libLocHCat| ).
+
+This function can also be used to find out the current locale by passing a null
+pointer as the$locale$argument. In this case, a string is returned that is the
+name of the locale currently selected for category$category$.
+
+The string returned should not be modified.
+
+When the current locale for category$LC_ALL$is read, the value encodes the
+entire combination of selected locales for all categories.
+
+It is not guaranteed that the returned pointer remains valid over time, so a
+copy must be made.
+
+When the$locale$argument is not a null pointer, the string returned reflects
+the newly-modified locale.
+
+If an empty string for$locale$is specified, this means to read the appropriate
+environment variable and use its value to select the locale for$category$.
+
+If a nonempty string is given for$locale$, then the locale of that name is
+used if possible.
+
+If an invalid locale name is specified,$setlocale()$returns a null pointer
+and leaves the current locale unchanged.
+
+
+
+localeconf() Function *crv-localeconv*
+---------------------
+Synopsis~
+ $#include <locale.h>$
+ $struct lconv *localeconv(void);$
+
+Return~
+pointer to structure$lconv$, representing the current local settings
+
+Description~
+This function returns a pointer to the structure$lconv$whose components
+contain information about how numeric and monetary values should be
+formatted in the current locale.
+
+
+
+
+==============================================================================
+II.12 <math.h> Mathematics *crv-libMathH*
+
+This header file defines macros and declares functions that allow to do
+mathematics.
+
+Quicklink:
+ $acos()$ Func |crv-acos|
+ $acosf()$ Func |crv-acosf|
+ $acosh()$ Func |crv-acosh|
+ $acoshf()$ Func |crv-acoshf|
+ $acoshl()$ Func |crv-acoshl|
+ $acosl()$ Func |crv-acosl|
+ $asin()$ Func |crv-asin|
+ $asinf()$ Func |crv-asinf|
+ $asinh()$ Func |crv-asinh|
+ $asinhf()$ Func |crv-asinhf|
+ $asinhl()$ Func |crv-asinhl|
+ $asinl()$ Func |crv-asinl|
+ $atan()$ Func |crv-atan|
+ $atanf()$ Func |crv-atanf|
+ $atanh()$ Func |crv-atanh|
+ $atanhf()$ Func |crv-atanhf|
+ $atanhl()$ Func |crv-atanhl|
+ $atanl()$ Func |crv-atanl|
+ $atan2()$ Func |crv-atan2|
+ $atan2f()$ Func |crv-atan2f|
+ $atan2l()$ Func |crv-atan2l|
+ $cbrt()$ Func |crv-cbrt|
+ $cbrtf()$ Func |crv-cbrtf|
+ $cbrtl()$ Func |crv-cbrtl|
+ $ceil()$ Func |crv-ceil|
+ $ceilf()$ Func |crv-ceilf|
+ $ceill()$ Func |crv-ceill|
+ $copysign()$ Func |crv-copysign|
+ $copysignf()$ Func |crv-copysignf|
+ $copysignl()$ Func |crv-copysignl|
+ $cos()$ Func |crv-cos|
+ $cosf()$ Func |crv-cosf|
+ $cosh()$ Func |crv-cosh|
+ $coshf()$ Func |crv-coshf|
+ $coshl()$ Func |crv-coshl|
+ $cosl()$ Func |crv-cosl|
+ $erf()$ Func |crv-erf|
+ $erff()$ Func |crv-erff|
+ $erfl()$ Func |crv-erfl|
+ $erfc()$ Func |crv-erfc|
+ $erfcf()$ Func |crv-erfcf|
+ $erfcl()$ Func |crv-erfcl|
+ $exp2()$ Func |crv-exp2|
+ $exp2f()$ Func |crv-exp2f|
+ $exp2l()$ Func |crv-exp2l|
+ $exp()$ Func |crv-exp|
+ $expf()$ Func |crv-expf|
+ $expl()$ Func |crv-expl|
+ $expm1()$ Func |crv-expm1|
+ $expm1f()$ Func |crv-expm1f|
+ $expm1l()$ Func |crv-expm1l|
+ $fabs()$ Func |crv-fabs|
+ $fabsf()$ Func |crv-fabsf|
+ $fabsl()$ Func |crv-fabsl|
+ $fdim()$ Func |crv-fdim|
+ $fdimf()$ Func |crv-fdimf|
+ $fdiml()$ Func |crv-fdiml|
+ $floor()$ Func |crv-floor|
+ $floorf()$ Func |crv-floorf|
+ $floorl()$ Func |crv-floorl|
+ $fmin()$ Func |crv-fmin|
+ $fminf()$ Func |crv-fminf|
+ $fminl()$ Func |crv-fminl|
+ $fma()$ Func |crv-fma|
+ $fmaf()$ Func |crv-fmaf|
+ $fmal()$ Func |crv-fmal|
+ $fmax()$ Func |crv-fmax|
+ $fmaxf()$ Func |crv-fmaxf|
+ $fmaxl()$ Func |crv-fmaxl|
+ $fmod()$ Func |crv-fmod|
+ $fmodf()$ Func |crv-fmodf|
+ $fmodl()$ Func |crv-fmodl|
+ $FP_FAST_FMA$ Macro |crv-FP_FAST_FMA|
+ $FP_FAST_FMAF$ Macro |crv-FP_FAST_FMAF|
+ $FP_FAST_FMAL$ Macro |crv-FP_FAST_FMAL|
+ $FP_ILOGB0$ Macro |crv-FP_ILOGB0|
+ $FP_ILOGBNAN$ Macro |crv-FP_ILOGBNAN|
+ $frexp()$ Func |crv-frexp|
+ $frexpf()$ Func |crv-frexpf|
+ $frexpl()$ Func |crv-frexpl|
+ $hypot()$ Func |crv-hypot|
+ $hypotf()$ Func |crv-hypotf|
+ $hypotl()$ Func |crv-hypotl|
+ $ilogb()$ Func |crv-ilogb|
+ $ilogbf()$ Func |crv-ilogbf|
+ $ilogbl()$ Func |crv-ilogbl|
+ $isfinite()$ Macro |crv-isfinite|
+ $isgreater()$ Macro |crv-isgreater|
+ $isgreaterequal()$Macro |crv-isgreaterequal|
+ $isinf()$ Macro |crv-isinf|
+ $isless()$ Macro |crv-isless|
+ $islessequal()$ Macro |crv-islessequal|
+ $islessgreater()$ Macro |crv-islessgreater|
+ $isnan()$ Macro |crv-isnan|
+ $isnormal()$ Macro |crv-isnormal|
+ $isunordered()$ Macro |crv-isunordered|
+ $ldexp()$ Func |crv-ldexp|
+ $ldexpf()$ Func |crv-ldexpf|
+ $ldexpl()$ Func |crv-ldexpl|
+ $lgamma()$ Func |crv-lgamma|
+ $lgammaf()$ Func |crv-lgammaf|
+ $lgammal()$ Func |crv-lgammal|
+ $log()$ Func |crv-log|
+ $logf()$ Func |crv-logf|
+ $logl()$ Func |crv-logl|
+ $log10()$ Func |crv-log10|
+ $log10f()$ Func |crv-log10f|
+ $log10l()$ Func |crv-log10l|
+ $log1p()$ Func |crv-log1p|
+ $log1pf()$ Func |crv-log1pf|
+ $log1pl()$ Func |crv-log1pl|
+ $log2()$ Func |crv-log2|
+ $log2f()$ Func |crv-log2f|
+ $log2l()$ Func |crv-log2l|
+ $logb()$ Func |crv-logb|
+ $logbf()$ Func |crv-logbf|
+ $logbl()$ Func |crv-logbl|
+ $lrint()$ Func |crv-lrint|
+ $lrintf()$ Func |crv-lrintf|
+ $lrintl()$ Func |crv-lrintl|
+ $llrint()$ Func |crv-llrint|
+ $llrintf()$ Func |crv-llrintf|
+ $llrintl()$ Func |crv-llrintl|
+ $lround()$ Func |crv-lround|
+ $lroundf()$ Func |crv-lroundf|
+ $lroundl()$ Func |crv-lroundl|
+ $llround()$ Func |crv-llround|
+ $llroundf()$ Func |crv-llroundf|
+ $llroundl()$ Func |crv-llroundl|
+ $modf()$ Func |crv-modf|
+ $modff()$ Func |crv-modff|
+ $modfl()$ Func |crv-modfl|
+ $nan()$ Func |crv-nan|
+ $nanf()$ Func |crv-nanf|
+ $nanl()$ Func |crv-nanl|
+ $nearbyint()$ Func |crv-nearbyint|
+ $nearbyintf()$ Func |crv-nearbyintf|
+ $nearbyintl()$ Func |crv-nearbyintl|
+ $nextafter()$ Func |crv-nextafter|
+ $nextafterf()$ Func |crv-nextafterf|
+ $nextafterl()$ Func |crv-nextafterl|
+ $nexttoward()$ Func |crv-nexttoward|
+ $nexttowardf()$ Func |crv-nexttowardf|
+ $nexttowardl()$ Func |crv-nexttowardl|
+ $pow()$ Func |crv-pow|
+ $powf()$ Func |crv-powf|
+ $powl()$ Func |crv-powl|
+ $remainder()$ Func |crv-remainder|
+ $remainderf()$ Func |crv-remainderf|
+ $remainderl()$ Func |crv-remainderl|
+ $remquo()$ Func |crv-remquo|
+ $remquof()$ Func |crv-remquof|
+ $remquol()$ Func |crv-remquol|
+ $rint()$ Func |crv-rint|
+ $rintf()$ Func |crv-rintf|
+ $rintl()$ Func |crv-rintl|
+ $round()$ Func |crv-round|
+ $roundf()$ Func |crv-roundf|
+ $roundl()$ Func |crv-roundl|
+ $scalbn()$ Func |crv-scalbn|
+ $scalbnf()$ Func |crv-scalbnf|
+ $scalbnl()$ Func |crv-scalbnl|
+ $scalbln()$ Func |crv-scalbln|
+ $scalblnf()$ Func |crv-scalblnf|
+ $scalblnl()$ Func |crv-scalblnl|
+ $signbit()$ Macro |crv-signbit|
+ $signgam$ Var |crv-signgam|
+ $sin()$ Func |crv-sin|
+ $sinf() $ Func |crv-sinf|
+ $sinh()$ Func |crv-sinh|
+ $sinhf()$ Func |crv-sinhf|
+ $sinhl()$ Func |crv-sinhl|
+ $sinl()$ Func |crv-sinl|
+ $sqrt()$ Func |crv-sqrt|
+ $sqrtf()$ Func |crv-sqrtf|
+ $sqrtl()$ Func |crv-sqrtl|
+ $tan()$ Func |crv-tan|
+ $tanf()$ Func |crv-tanf|
+ $tanh()$ Func |crv-tanh|
+ $tanhf()$ Func |crv-tanhf|
+ $tanhl()$ Func |crv-tanhl|
+ $tanl()$ Func |crv-tanl|
+ $tgamma()$ Func |crv-tgamma|
+ $tgammaf()$ Func |crv-tgammaf|
+ $tgammal()$ Func |crv-tgammal|
+ $trunc()$ Func |crv-trunc|
+ $truncf()$ Func |crv-truncf|
+ $truncl()$ Func |crv-truncl|
+
+
+
+------------------------------------------------------------------------------
+II.12.1 Error Conditions *crv-libMHErr*
+
+All functions declared in$<math.h>$do handle errors in a very similar way.
+
+If an argument is outside the domain over a function is defined a domain
+error occurs, then$errno$is set to$EDOM$. The value that the function returns
+is implementation specific.
+
+If the result of a function cannot be represented in the type of return value,
+a range error occurs.
+If the result overflows, the function returns the value of the macro
+$HUGE_VAL$, with the same sign as the correct value of the function;
+$errno$is set to$ERANGE$.
+
+If the result underflows, the function returns 0; whether or not$errno$is
+set to$ERANGE$is implementation-defined.
+
+
+HUGE_VAL Macro *crv-HUGE_VAL*
+HUGE_VALF Macro *crv-HUGE_VALF*
+HUGE_VALL Macro *crv-HUGE_VALL*
+---------------
+This macro expands to a positive$double$constant. On machines that use
+IEEE 754 floating point format,$HUGE_VAL$is infinity. On other machines,
+it's typically the largest positive number that can be represented.
+$HUGE_VALF$and$HUGE_VALL$are the analogs for$float$and$long double$.
+
+
+
+------------------------------------------------------------------------------
+II.12.2 Classification Macros *crv-libMHClass*
+
+
+fpclassify() Macro *crv-fpclassify*
+------------------
+Synopsis~
+ $#include <math.h>$
+ $int fpclassify(float-type x;$
+
+Return~
+FP_NAN
+The floating-point number x is "Not a Number"
+
+FP_INFINITE
+The value of x is either plus or minus infinity.
+
+FP_ZERO
+The value of x is zero.
+
+FP_SUBNORMAL
+Numbers whose absolute value is too small to be represented in the normal
+format are represented in an alternate, denormalized format
+(see |crv-dtFormatsFPBasics|)
+
+FP_NORMAL
+This value is returned for all other values of x. It indicates that there
+is nothing special about the number.
+
+Description~
+This is a generic macro which works on all floating-point types.
+It classifies its argument as NaN, infinite, normal, subnormal, zero or into
+another implementation-defined category.
+
+
+
+isfinite() Macro *crv-isfinite*
+----------------
+Synopsis~
+ $#include <math.h>$
+ $int isfinite(float-type x);$
+
+Return~
+0: x is not finite
+else x is finite
+
+Description~
+This is a generic macro which works on all floating-point types.
+This macro returns a nonzero value if x is finite: not plus or minus infinity,
+and not NaN. It is equivalent to
+ $(fpclassify (x) != FP_NAN && fpclassify (x) != FP_INFINITE)$
+
+
+
+isnormal() Macro *crv-isnormal*
+----------------
+Synopsis~
+ $#include <math.h>$
+ $int isnormal(float-type x);$
+
+Return~
+0: x is not normal
+else x is normal
+
+Description~
+This is a generic macro which works on all floating-point types.
+This macro returns a nonzero value if x is finite and normalized.
+It is equivalent to
+ $(fpclassify (x) == FP_NORMAL)$
+
+
+
+isnan() Macro *crv-isnan*
+-------------
+Synopsis~
+ $#include <math.h>$
+ $int isnan(float-type x);$
+
+Return~
+0: x is not NaN
+else x is NaN
+
+Description~
+This is a generic macro which works on all floating-point types.
+This macro returns a nonzero value if x is NaN. It is equivalent to
+ $(fpclassify (x) == FP_NAN)$
+
+
+
+isinf() Macro *crv-isinf*
+-------------
+Synopsis~
+ $#include <math.h>$
+ $int isinf(float-type x);$
+
+Return~
+0: x is not infinite
+else x is infinite
+
+Description~
+This is a generic macro which works on all floating-point types.
+This macro returns a nonzero value if x is infinte. It is equivalent to
+ $(fpclassify (x) == FP_INFINITE)$
+~
+
+
+
+------------------------------------------------------------------------------
+II.12.3 Comparison Macros *crv-libMHCmp*
+
+All macros below are generic macros that work on all floating-point types.
+
+
+isgreater() Macro *crv-isgreater*
+-----------------
+Synopsis~
+ $#include <math.h>$
+ $int isgreater(float-type x, float-type y);$
+
+Return~
+0: x is not greater y
+else x is greater y
+
+Description~
+This macro determines whether the argument x is greater than y.
+It is equivalent to (x) > (y), but no exception is raised if x or y are NaN.
+
+
+
+isgreaterequal() Macro *crv-isgreaterequal*
+----------------------
+Synopsis~
+ $#include <math.h>$
+ $int isgreaterequal(float-type x, float-type y);$
+
+Return~
+0: x is not greater or equal y
+else x is greater or equal y
+
+Description~
+This macro determines whether the argument x is greater than or equal to y.
+It is equivalent to (x) >= (y), but no exception is raised if x or y are NaN.
+
+
+
+isless() Macro *crv-isless*
+--------------
+Synopsis~
+ $#include <math.h>$
+ $int isless(float-type x, float-type y);$
+
+Return~
+0: x is not less y
+else x is less y
+
+Description~
+This macro determines whether the argument x is less than y. It is equivalent
+to (x) < (y), but no exception is raised if x or y are NaN.
+
+
+
+islessequal() Macro *crv-islessequal*
+-------------------
+Synopsis~
+ $#include <math.h>$
+ $int islessequal(float-type x, float-type y);$
+
+Return~
+0: x is not less or equal y
+else x is less or equal y
+
+Description~
+This macro determines whether the argument x is less than or equal to y. It is
+equivalent to (x) <= (y), but no exception is raised if x or y are NaN.
+
+
+
+islessgreater() Macro *crv-islessgreater*
+---------------------
+Synopsis~
+ $#include <math.h>$
+ $int islessgreater(float-type x, float-type y);$
+
+Return~
+0: x is not less or greater y
+else x is less or greater y
+
+Description~
+This macro determines whether the argument x is less or greater than y. It is
+equivalent to (x) < (y) || (x) > (y) (although it only evaluates x and y
+once), but no exception is raised if x or y are NaN.
+This macro is not equivalent to x != y, because that expression is true if x
+or y are NaN.
+
+
+
+isunordered() Macro *crv-isunordered*
+-------------------
+Synopsis~
+ $#include <math.h>$
+ $int isunordered(float-type x, float-type y);$
+
+Return~
+0: x and y are not unordered
+else x or y is unordered
+
+Description~
+This macro determines whether its arguments are unordered. In other words,
+it is true if x or y are NaN, and false otherwise.
+
+
+
+------------------------------------------------------------------------------
+II.12.4 Trigonometric *crv-libMHTrig*
+
+
+asin() Functions *crv-asin* *crv-asinf* *crv-asinl*
+----------------
+Synopsis~
+ $#include <math.h>$
+ $double asin(double x);$
+ $float asinf(float x);$
+ $long double asinl(long double x);$
+
+Return~
+range -PI/2...+PI/2
+
+Description~
+These functions compute the arc sine of x. The value is in units of radians.
+The arc sine function is defined mathematically only over the domain -1 to 1.
+If x is outside the domain, asin signals a domain error.
+
+
+
+acos() Functions *crv-acos* *crv-acosf* *crv-acosl*
+----------------
+Synopsis~
+ $#include <math.h>$
+ $double acos(double x);$
+ $float acosf(float x);$
+ $long double acosl(long double x);$
+
+Return~
+range 0...PI
+
+Description~
+These functions compute the arc cosine of x. The value is in units of radians.
+The arc cosine function is defined mathematically only over the domain -1 to
+1. If x is outside the domain, acos signals a domain error.
+
+
+atan() Functions *crv-atan* *crv-atanf* *crv-atanl*
+----------------
+Synopsis~
+ $#include <math.h>$
+ $double atan(double x);$
+ $float atanf(float x);$
+ $long double atanl(long double x);$
+
+Return~
+range -PI/2...+PI/2
+
+Description~
+These functions compute the arc tangent of x. The value is in units of
+radians.
+
+
+atan2() Functions *crv-atan2* *crv-atan2f* *crv-atan2l*
+-----------------
+Synopsis~
+ $#include <math.h>$
+ $double atan2(double x);$
+ $float atan2f(float x);$
+ $long double atan2l(long double x);$
+
+Return~
+range -PI...+PI
+If both x and y are zero, atan2 returns zero.
+
+Description~
+This function computes the arc tangent of y/x, but the signs of both arguments
+are used to determine the quadrant of the result, and x is permitted to be
+zero. The return value is given in radians.
+
+If x and y are coordinates of a point in the plane, atan2 returns the signed
+angle between the line from the origin to that point and the x-axis.
+Thus, atan2 is useful for converting Cartesian coordinates to polar
+coordinates.
+
+
+
+sin() Functions *crv-sin* *crv-sinf* *crv-sinl*
+---------------
+Synopsis~
+ $#include <math.h>$
+ $double sin(double x);$
+ $float sinf(float x);$
+ $long double sinl(long double x);$
+
+Return~
+range -1...+1
+
+Description~
+These functions return the sine of x, where x is given in radians.
+
+
+cos() Functions *crv-cos* *crv-cosf* *crv-cosl*
+---------------
+Synopsis~
+ $#include <math.h>$
+ $double cos(double x);$
+ $float cosf(float x);$
+ $long double cosl(long double x);$
+
+Return~
+range -1...+1
+
+Description~
+These functions return the cosine of x, where x is given in radians.
+
+
+tan() Functions *crv-tan* *crv-tanf* *crv-tanl*
+---------------
+Synopsis~
+ $#include <math.h>$
+ $double tan(double x);$
+ $float tanf(float x);$
+ $long double tanl(long double x);$
+
+Return~
+tangent of x
+
+Description~
+These functions return the tangent of x, where x is given in radians.
+Mathematically, the tangent function has singularities at odd multiples of
+PI/2. If the argument x is too close to one of these singularities,$tan()$
+will signal overflow.
+
+
+
+------------------------------------------------------------------------------
+II.12.5 Hyperbolic *crv-libMHHyper*
+
+
+sinh() Functions *crv-sinh* *crv-sinhf* *crv-sinhl*
+----------------
+Synopsis~
+ $#include <math.h>$
+ $double sinh(double x);$
+ $float sinhf(float x);$
+ $long double sinhl(long double x);$
+
+Return~
+hyperbolic sine of x
+
+Description~
+These functions return the hyperbolic sine of x, defined mathematically as
+(exp(x) - exp(-x)) / 2. They may signal overflow if x is too large.
+
+
+
+cosh() Functions *crv-cosh* *crv-coshf* *crv-coshl*
+----------------
+Synopsis~
+ $#include <math.h>$
+ $double cosh(double x);$
+ $float coshf(float x);$
+ $long double coshl(long double x);$
+
+Return~
+hyperbolic cosine of x
+
+Description~
+These function return the hyperbolic cosine of x, defined mathematically as
+(exp(x) + exp(-x)) / 2. They may signal overflow if x is too large.
+
+
+
+tanh() Functions *crv-tanh* *crv-tanhf* *crv-tanhl*
+----------------
+Synopsis~
+ $#include <math.h>$
+ $double tanh(double x);$
+ $float tanhf(float x);$
+ $long double tanhl(long double x);$
+
+Return~
+hyperbolic tangent of x
+
+Description~
+These functions return the hyperbolic tangent of x, defined mathematically as
+sinh(x) / cosh(x). They may signal overflow if x is too large.
+
+
+
+asinh() Functions *crv-asinh* *crv-asinhf* *crv-asinhl*
+-----------------
+Synopsis~
+ $#include <math.h>$
+ $double asinh(double x);$
+ $float asinhf(float x);$
+ $long double asinhl(long double x);$
+
+Return~
+inverse hyperbolic sine of x
+
+Description~
+These functions return the inverse hyperbolic sine of x.
+
+
+
+acosh() Functions *crv-acosh* *crv-acoshf* *crv-acoshl*
+-----------------
+Synopsis~
+ $#include <math.h>$
+ $double acosh(double x);$
+ $float acoshf(float x);$
+ $long double acoshl(long double x);$
+
+Return~
+inverse hyperbolic cosine of x
+
+Description~
+These functions return the inverse hyperbolic cosine of x. If x is less than
+1, acosh signals a domain error.
+
+
+
+atanh() Functions *crv-atanh* *crv-atanhf* *crv-atanhl*
+-----------------
+Synopsis~
+ $#include <math.h>$
+ $double atanh(double x);$
+ $float atanhf(float x);$
+ $long double atanhl(long double x);$
+
+Return~
+inverse hyperbolic tangent of x
+
+Description~
+These functions return the inverse hyperbolic tangent of x. If the absolute
+value of x is greater than 1,$atanh()$signals a domain error; if it is
+equal to 1, it returns infinity.
+
+
+
+
+------------------------------------------------------------------------------
+II.12.6 Exponential & Logarithmic *crv-libMHExpLog*
+
+
+
+exp() Functions *crv-exp* *crv-expf* *crv-expl*
+---------------
+Synopsis~
+ $#include <math.h>$
+ $double exp(double x);$
+ $float expf(float x);$
+ $long double expl(long double x);$
+
+Return~
+e^x
+
+Description~
+These functions compute e (the base of natural logarithms) raised to the
+power x. If the magnitude of the result is too large to be representable,
+$exp()$signals overflow.
+
+
+
+exp2() Functions *crv-exp2* *crv-exp2f* *crv-exp2l*
+----------------
+Synopsis~
+ $#include <math.h>$
+ $double exp2(double x);$
+ $float exp2f(float x);$
+ $long double exp2l(long double x);$
+
+Return~
+2^x
+
+Description~
+These functions compute 2 raised to the power x. Mathematically,$exp2(x)$is
+the same as exp(x * log(2)).
+
+
+
+expm1() Functions *crv-expm1* *crv-expm1f* *crv-expm1l*
+-----------------
+Synopsis~
+ $#include <math.h>$
+ $double expm1(double x);$
+ $float expm1f(float x);$
+ $long double expm1l(long double x);$
+
+Return~
+exp(x)-1
+
+Description~
+These functions return a value equivalent to exp(x) - 1. They are computed in a
+way that is accurate even if x is near zero - a case where exp(x) - 1 would be
+inaccurate owing to subtraction of two numbers that are nearly equal.
+
+
+
+
+ilogb() Functions *crv-ilogb* *crv-ilogbf* *crv-ilogbl*
+-----------------
+Synopsis~
+ $#include <math.h>$
+ $int ilogb(double x);$
+ $int ilogbf(float x);$
+ $int ilogbl(long double x);$
+
+Return~
+
+
+Description~
+These functions are equivalent to the corresponding logb() functions except
+that they return signed integer values. Since integers cannot represent
+infinity and NaN,$ilogb()$instead returns an integer that can't be the
+exponent of a normal floating-point number, the macros are:
+
+FP_ILOGB0 Macro *crv-FP_ILOGB0*
+ $ilogb()$returns this value if its argument is 0. The numeric value is
+ either$INT_MIN$or$-INT_MAX$.
+
+FP_ILOGBNAN Macro *crv-FP_ILOGBNAN*
+ $ilogb()$returns this value if its argument is NaN. The numeric value is
+ either$INT_MIN$or$INT_MAX$.
+
+
+
+log() Functions *crv-log* *crv-logf* *crv-logl*
+---------------
+Synopsis~
+ $#include <math.h>$
+ $double log(double x);$
+ $float logf(float x);$
+ $long double logl(long double x);$
+
+Return~
+see description
+
+Description~
+These functions compute the natural logarithm of x. If x is negative,$log()$
+signals a domain error. If x is zero, it returns negative infinity;
+if x is too close to zero, it may signal overflow.
+
+
+
+log10() Functions *crv-log10* *crv-log10f* *crv-log10l*
+-----------------
+Synopsis~
+ $#include <math.h>$
+ $double log10(double x);$
+ $float log10f(float x);$
+ $long double log10l(long double x);$
+
+Return~
+base-10 logarithm of x
+
+Description~
+These functions return the base-10 logarithm of x.
+ $log10(x)$equals$log(x) / log(10)$
+
+
+
+log1p() Functions *crv-log1p* *crv-log1pf* *crv-log1pl*
+------------------
+Synopsis~
+ $#include <math.h>$
+ $double log1p(double x);$
+ $float log1pf(float x);$
+ $long double log1pl(long double x);$
+
+Return~
+log(1+x)
+
+Description~
+These functions returns a value equivalent to log(1 + x). They are computed
+in a way that is accurate even if x is near zero.
+
+
+
+log2() Functions *crv-log2* *crv-log2f* *crv-log2l*
+----------------
+Synopsis~
+ $#include <math.h>$
+ $double log2(double x);$
+ $float log2f(float x);$
+ $long double log2l(long double x);$
+
+Return~
+base-2 logarithm of x
+
+Description~
+These functions return the base-2 logarithm of x.
+ $log2(x)$equals$log(x) / log(2)$
+
+
+
+logb() Functions *crv-logb* *crv-logbf* *crv-logbl*
+----------------
+Synopsis~
+ $#include <math.h>$
+ $double log2(double x);$
+ $float log2f(float x);$
+ $long double log2l(long double x);$
+
+Return~
+see description
+
+Description~
+These functions extract the exponent of x and return it as a floating-point
+value. If FLT_RADIX is two,$logb()$is equal to$floor(log2 (x))$, except it's
+probably faster.
+If x is denormalized,$logb()$returns the exponent x would have if it were
+normalized. If x is infinity (positive or negative),$logb()$returns &infin;.
+If x is zero,$logb()$returns &infin;. It does not signal.
+
+
+
+
+frexp() Functions *crv-frexp* *crv-frexpf* *crv-frexpl*
+-----------------
+Synopsis~
+ $#include <math.h>$
+ $double frexp(double x, int *exponent);$
+ $float frexpf(float x, int *exponent);$
+ $long double frexpl(long double x, int *exponent);$
+
+Return~
+see description
+
+Description~
+These functions are used to split the number value into a normalized fraction
+and an exponent.
+If the argument value is not zero, the return value is value times a power
+of two, and is always in the range 1/2 (inclusive) to 1 (exclusive). The
+corresponding exponent is stored in *exponent; the return value multiplied
+by 2 raised to this exponent equals the original number value.
+
+For example,$frexp(12.8, &exponent)$returns 0.8 and stores 4 in exponent.
+
+If value is zero, then the return value is zero and zero is stored in
+*exponent.
+
+
+
+ldexp() Functions *crv-ldexp* *crv-ldexpf* *crv-ldexpl*
+-----------------
+Synopsis~
+ $#include <math.h>$
+ $double ldexp(double x, int exponent);$
+ $float ldexpf(float x, int exponent);$
+ $long double ldexpl(long double x, int exponent);$
+
+Return~
+see description
+
+Description~
+These functions return the result of multiplying the floating-point number
+value by 2 raised to the power exponent.
+(It can be used to reassemble floating-point numbers that were taken apart
+by$frexp()$) .
+For example,$ldexp(0.8, 4)$returns 12.8.
+
+
+
+modf() Functions *crv-modf* *crv-modff* *crv-modfl*
+----------------
+Synopsis~
+ $#include <math.h>$
+ $double modf(double x, double *intpart);$
+ $float modff(float x, float *intpart);$
+ $long double modfl(long double x, long double *intpart);$
+
+Return~
+stores the integer part in *intpart, and returns the fractional part
+
+Description~
+These functions break the argument value into an integer part and a fractional
+part (between -1 and 1, exclusive). Their sum equals value. Each of the parts
+has the same sign as value, and the integer part is always rounded toward zero.
+
+Example:$modf(2.5, &intpart)$returns 0.5 and stores 2.0 into intpart.
+
+
+
+scalbn() Functions *crv-scalbn* *crv-scalbnf* *crv-scalbnl*
+------------------
+Synopsis~
+ $#include <math.h>$
+ $double scalbn(double x, int n);$
+ $float scalbnf(float x, int n);$
+ $long double scalbnl(long double x, int n);$
+
+Return~
+x*FLT_RADIX^n
+
+Description~
+These functions compute x * FLT_RADIX^n efficiently (commonly FLT_RADIX is 2).
+n is of type$int$, for type$long int$see$scalbln()$.
+
+
+
+scalbln() Functions *crv-scalbln* *crv-scalblnf* *crv-scalblnl*
+-------------------
+Synopsis~
+ $#include <math.h>$
+ $double scalbln(double x, long int n);$
+ $float scalblnf(float x, long int n);$
+ $long double scalblnl(long double x, long int n);$
+
+Return~
+x*FLT_RADIX^n
+
+Description~
+These functions compute x * FLT_RADIX^n efficiently (commonly FLT_RADIX is 2).
+n is of type$long int$, for type$int$see$scalbn()$.
+
+
+
+------------------------------------------------------------------------------
+II.12.7 Power & Absolute *crv-libMHPower*
+
+
+cbrt() Functions *crv-cbrt* *crv-cbrtf* *crv-cbrtl*
+----------------
+Synopsis~
+ $#include <math.h>$
+ $double cbrt(double x);$
+ $float cbrtf(float x);$
+ $long double cbrtl(long double x);$
+
+Return~
+cube root of x
+
+Description~
+These functions return the cube root of x. They cannot fail; every
+representable real value has a representable real cube root.
+
+
+
+fabs() Functions *crv-fabs* *crv-fabsf* *crv-fabsl*
+----------------
+Synopsis~
+ $#include <math.h>$
+ $double fabs(double x);$
+ $float fabsf(float x);$
+ $long double fabsl(long double x);$
+
+Return~
+absolute of x
+
+Description~
+This function returns the absolute value of the floating-point number x.
+
+
+hypot() Functions *crv-hypot* *crv-hypotf* *crv-hypotl*
+-----------------
+Synopsis~
+ $#include <math.h>$
+ $double hypot(double x, double y);$
+ $float hypotf(float x, float y);$
+ $long double hypotl(long double x, long double y);$
+
+Return~
+sqrt(x*x + y*y)
+
+Description~
+These functions return sqrt(x*x + y*y).
+Normally this function is faster and more accurate than the direct formula.
+
+
+
+pow() Functions *crv-pow* *crv-powf* *crv-powl*
+---------------
+Synopsis~
+ $#include <math.h>$
+ $double pow(double x, double y);$
+ $float powf(float x, float y);$
+ $long double powl(long double x, long double y);$
+
+Return~
+x^y
+
+Description~
+These are general exponentiation functions, returning base raised to power
+(x^y).
+
+Mathematically,$pow()$would return a complex number when base is negative and
+power is not an integral value.$pow$can't do that, so instead it signals a
+domain error.$pow$may also underflow or overflow the destination type.
+
+
+
+sqrt() Functions *crv-sqrt* *crv-sqrtf* *crv-sqrtl*
+----------------
+Synopsis~
+ $#include <math.h>$
+ $double sqrt(double x);$
+ $float sqrtf(float x);$
+ $long double sqrtl(long double x);$
+
+Return~
+sqrt(x)
+
+Description~
+These functions return the nonnegative square root of x.
+If x is negative,$sqrt()$signals a domain error. Mathematically, it should
+return a complex number.
+
+
+
+
+------------------------------------------------------------------------------
+II.12.8 Error & Gamma *crv-libMHErrGam*
+
+
+erf() Functions *crv-erf* *crv-erff* *crv-erfl*
+---------------
+Synopsis~
+ $#include <math.h>$
+ $double erf(double x);$
+ $float erff(float x);$
+ $long double erfl(long double x);$
+
+Return~
+error function of x
+
+Description~
+$erf()$returns the error function of x. The error function is defined as
+ erf(x) = 2/sqrt(pi) * integral from 0 to x of exp(-t^2) dt
+
+
+erfc() Functions *crv-erfc* *crv-erfcf* *crv-erfcl*
+----------------
+Synopsis~
+ $#include <math.h>$
+ $double erf(double x);$
+ $float erff(float x);$
+ $long double erfl(long double x);$
+
+Return~
+1 - error function of x
+
+Description~
+$erfc()$returns 1.0 -$erf(x)$, but computed in a fashion that avoids
+round-off error when x is large.
+
+
+lgamma() Functions *crv-lgamma* *crv-lgammaf* *crv-lgammal*
+------------------
+Synopsis~
+ $#include <math.h>$
+ $double lgamma(double x);$
+ $float lgammaf(float x);$
+ $long double lgammal(long double x);$
+
+Return~
+see description
+
+Description~
+$lgamma()$returns the natural logarithm of the absolute value of the gamma
+function of x. The gamma function is defined as
+
+ gamma(x) = integral from 0 to &infin; of t^(x-1) e^-t dt
+
+ *crv-signgam*
+The sign of the gamma function is stored in the global variable$signgam$,
+which is declared in$<math.h>$. It is 1 if the intermediate result was
+positive or zero, or -1 if it was negative.
+
+To compute the real gamma function $tgamma()$can be used or the values as
+can be computed as follows:
+
+ lgam = lgamma(x);
+ gam = signgam*exp(lgam);
+
+
+The gamma function has singularities at the non-positive integers.$lgamma()$
+will raise the zero divide exception if evaluated at a singularity.
+
+
+
+tgamma() Functions *crv-tgamma* *crv-tgammaf* *crv-tgammal*
+------------------
+Synopsis~
+ $#include <math.h>$
+ $double tgamma(double x);$
+ $float tgammaf(float x);$
+ $long double tgammal(long double x);$
+
+Return~
+see description
+
+Description~
+$tgamma()$applies the gamma function to x. The gamma function is defined as
+ gamma (x) = integral from 0 to &infin; of t^(x-1) e^-t dt
+
+
+
+
+------------------------------------------------------------------------------
+II.12.9 Nearest Integer *crv-libMHNear*
+
+
+ceil() Functions *crv-ceil* *crv-ceilf* *crv-ceill*
+----------------
+Synopsis~
+ $#include <math.h>$
+ $double ceil(double x);$
+ $float ceilf(float x);$
+ $long double ceill(long double x);$
+
+Return~
+x rounded upwards
+
+Description~
+These functions round x upwards to the nearest integer, returning that value
+as a double. Thus, ceil(1.5)$ is 2.0.
+
+
+
+floor() Functions *crv-floor* *crv-floorf* *crv-floorl*
+-----------------
+Synopsis~
+ $#include <math.h>$
+ $double floor(double x);$
+ $float floorf(float x);$
+ $long double floorl(long double x);$
+
+Return~
+x rounded downwards
+
+Description~
+These functions round x downwards to the nearest integer, returning that value
+as a double. Thus,$floor(1.5)$is 1.0 and$floor(-1.5)$is -2.0.
+
+
+
+trunc() Functions *crv-trunc* *crv-truncf* *crv-truncl*
+-----------------
+Synopsis~
+ $#include <math.h>$
+ $double trunc(double x);$
+ $float truncf(float x);$
+ $long double truncl(long double x);$
+
+Return~
+x rounded towards zero
+
+Description~
+These functions round x towards zero to the nearest integer (returned in
+floating-point format). Thus,$trunc(1.5)$is 1.0 and$trunc(-1.5)$is -1.0.
+
+
+
+rint() Functions *crv-rint* *crv-rintf* *crv-rintl*
+----------------
+Synopsis~
+ $#include <math.h>$
+ $double rint(double x);$
+ $float rintf(float x);$
+ $long double rintl(long double x);$
+
+Return~
+x rounded according to rounding mode
+
+Description~
+These functions round x to an integer value according to the current rounding
+mode (for modes see "II.6.3 Rounding" |crv-libFHRounding|). The default
+rounding mode is to round to the nearest integer.
+If x was not initially an integer, these functions raise the inexact
+exception.
+
+
+ *crv-nearbyint*
+nearbyint() Functions *crv-nearbyintf* *crv-nearbyintl*
+---------------------
+Synopsis~
+ $#include <math.h>$
+ $double nearbyint(double x);$
+ $float nearbyintf(float x);$
+ $long double nearbyintl(long double x);$
+
+Return~
+x rounded according to rounding mode
+
+Description~
+These functions return the same value as the$rint()$functions, but do not
+raise the inexact exception if x is not an integer.
+
+
+
+round() Functions *crv-round* *crv-roundf* *crv-roundl*
+-----------------
+Synopsis~
+ $#include <math.h>$
+ $double round(double x);$
+ $float roundf(float x);$
+ $long double roundl(long double x);$
+
+Return~
+see description
+
+Description~
+These functions are similar to$rint()$, but they round halfway cases away from
+zero instead of to the nearest even integer.
+
+
+
+lrint() Functions *crv-lrint* *crv-lrintf* *crv-lrintl*
+-----------------
+Synopsis~
+ $#include <math.h>$
+ $long int lrint(double x);$
+ $long int lrintf(float x);$
+ $long int lrintl(long double x);$
+
+Return~
+x rounded according to rounding mode
+
+Description~
+These functions are just like$rint()$, but they return a$long int$instead of
+a floating-point number.
+
+
+
+llrint() Functions *crv-llrint* *crv-llrintf* *crv-llrintl*
+------------------
+Synopsis~
+ $#include <math.h>$
+ $long long int llrint(double x);$
+ $long long int llrintf(float x);$
+ $long long int llrintl(long double x);$
+
+Return~
+x rounded according to rounding mode
+
+Description~
+These functions are just like$rint()$, but they return a$long long int$instead
+of a floating-point number.
+
+
+
+lround() Functions *crv-lround* *crv-lroundf* *crv-lroundl*
+------------------
+Synopsis~
+ $#include <math.h>$
+ $long int lround(double x);$
+ $long int lroundf(float x);$
+ $long int lroundl(long double x);$
+
+Return~
+x rounded
+
+Description~
+These functions are just like$round()$, but they return a$long int$instead of
+a floating-point number.
+
+
+
+llround() Functions *crv-llround* *crv-llroundf* *crv-llroundl*
+-------------------
+Synopsis~
+ $#include <math.h>$
+ $long long int llround(double x);$
+ $long long int llroundf(float x);$
+ $long long int llroundl(long double x);$
+
+Return~
+x rounded
+
+Description~
+These functions are just like$round()$, but they return a$long long int$
+instead of a floating-point number.
+
+
+
+------------------------------------------------------------------------------
+II.12.10 Remainder *crv-libMHRem*
+
+
+fmod() Functions *crv-fmod* *crv-fmodf* *crv-fmodl*
+----------------
+Synopsis~
+ $#include <math.h>$
+ $double fmod(double x, double y);$
+ $float fmodf(float x, float y);$
+ $long double fmodl(long double x, long double y);$
+
+Return~
+see description
+
+Description~
+These functions compute the remainder from the division of x by. Specifically,
+the return value is x - n*y, where n is the quotient of x divided by y,
+rounded towards zero to an integer. Thus,$fmod(6.5, 2.3)$ returns 1.9, which
+is 6.5 minus 4.6.
+The result has the same sign as x and has magnitude less than the magnitude
+of y.
+If y is zero,$fmod()$signals a domain error.
+
+
+ *crv-remainder*
+remainder() Functions *crv-remainderf* *crv-remainderl*
+---------------------
+Synopsis~
+ $#include <math.h>$
+ $double remainder(double x, double y);$
+ $float remainderf(float x, float y);$
+ $long double remainderl(long double x, long double y);$
+
+Return~
+see description
+
+Description~
+These functions are like$fmod()$except that they rounds the internal quotient
+n to the nearest integer instead of towards zero to an integer.
+For example,$remainder(6.5, 2.3)$returns -0.4, which is 6.5 minus 6.9.
+
+The absolute value of the result is less than or equal to half the absolute
+value of y. The difference between$fmod(x, y)$and$remainder(x, y)$is always
+either y, -y, or zero.
+If denominator is zero,$remainder()$signals a domain error.
+
+
+
+remquo() Functions *crv-remquo* *crv-remquof* *crv-remquol*
+------------------
+Synopsis~
+ $#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);$
+
+Return~
+see description
+
+Description~
+These functions compute the same remainder as the$remainder()$functions.
+In *quo they store a value whose sign is the singe of x/y and whose
+magnitude is congruent modulo 2^n to the magnitude of the integral quotient
+of x/y, where n is an implementation-defined integer greater or equal to 3.
+
+
+
+------------------------------------------------------------------------------
+II.12.11 Manipulating *crv-libMHMani*
+
+
+ *crv-copysign*
+copysign() Functions *crv-copysignf* *crv-copysignl*
+--------------------
+Synopsis~
+ $#include <math.h>$
+ $double copysign(double x, double y);$
+ $float copysignf(float x, float y);$
+ $long double copysignl(long double x, long double y);$
+
+Return~
+x with sign of y
+
+Description~
+These functions return x but with the sign of y. They work even if x or y are
+NaN or zero. Both of these can carry a sign (although not all implementations
+support it).
+$copysign()$never raises an exception.
+
+
+
+signbit() Macro *crv-signbit*
+---------------
+Synopsis~
+ $#include <math.h>$
+ $int signbit(float-type x);$
+
+Return~
+0: x has no negative sign
+else x has negative sign
+
+Description~
+This is a generic macro which works on all floating-point types.
+This macro returns a nonzero value if x is negative.
+This is not the same as x < 0.0, because IEEE 754 floating point allows zero
+to be signed. The comparison -0.0 < 0.0 is false, but$signbit(-0.0)$ will
+return a nonzero value.
+
+
+ *crv-nextafter*
+nextafter() Functions *crv-nextafterf* *crv-nextafterl*
+---------------------
+Synopsis~
+ $#include <math.h>$
+ $double nextafter(double x, double y);$
+ $float nextafterf(float x, float y);$
+ $long double nextafetl(long double x, long double y);$
+
+Return~
+see description
+
+Description~
+These functions return the next representable neighbor of x in the direction
+towards y. The size of the step between x and the result depends on the type
+of the result. If x = y the function simply returns y. If either value is
+NaN, NaN is returned. Otherwise a value corresponding to the value of the
+least significant bit in the mantissa is added or subtracted, depending on
+the direction.
+$nextafter()$will signal overflow or underflow if the result goes outside of
+the range of normalized numbers.
+
+
+ *crv-nexttoward*
+nexttoward() Functions *crv-nexttowardf* *crv-nexttowardl*
+----------------------
+Synopsis~
+ $#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);$
+
+Return~
+see description
+
+Description~
+These functions are identical to the corresponding versions of$nextafter()$
+except that their second argument is a long double.
+
+
+
+nan() Functions *crv-nan* *crv-nanf* *crv-nanl*
+---------------
+Synopsis~
+ $#include <math.h>$
+ $double nan(const char *tagp);$
+ $float nanf(const char *tagp);$
+ $long double nanl(const char *tagp);$
+
+Return~
+NaN
+
+Description~
+These functions return a representation of NaN, provided that NaN is supported
+by the target platform.$nan("n-char-sequence")$is equivalent to
+$strtod("NAN(n-char-sequence)")$.
+
+The argument tagp is used in an unspecified manner. On IEEE 754 systems, there
+are many representations of NaN, and tagp selects one. On other systems it may
+do nothing.
+
+
+
+
+------------------------------------------------------------------------------
+II.12.12 Miscellaneous *crv-libMHMisc*
+
+
+fdim() Functions *crv-fdim* *crv-fdimf* *crv-fdiml*
+----------------
+Synopsis~
+ $#include <math.h>$
+ $double fdim(double x, double y);$
+ $float fdimf(float x, float y);$
+ $long double fdiml(long double x, long double y);$
+
+Return~
+positive difference
+
+Description~
+These functions return the positive difference between x and y. The positive
+difference is x - y if x is greater than y, and 0 otherwise.
+If x, y, or both are NaN, NaN is returned.
+
+
+
+fmin() Functions *crv-fmin* *crv-fminf* *crv-fminl*
+----------------
+Synopsis~
+ $#include <math.h>$
+ $double fmin(double x, double y);$
+ $float fminf(float x, float y);$
+ $long double fminl(long double x, long double y);$
+
+Return~
+minimum of x and y
+
+Description~
+These functions return the lesser of the two values x and y. It is similar to
+the expression ((x) < (y) ? (x) : (y)) except that x and y are only evaluated
+once.
+If an argument is NaN, the other argument is returned. If both arguments are
+NaN, NaN is returned.
+
+
+
+fmax() Functions *crv-fmax* *crv-fmaxf* *crv-fmaxl*
+----------------
+Synopsis~
+ $#include <math.h>$
+ $double fmax(double x, double y);$
+ $float fmaxf(float x, float y);$
+ $long double fmaxl(long double x, long double y);$
+
+Return~
+maximum of x and y
+
+Description~
+These functions return the greater of the two values x and y.
+If an argument is NaN, the other argument is returned. If both arguments are
+NaN, NaN is returned.
+
+
+
+fma() Functions *crv-fma* *crv-fmaf* *crv-fmal*
+----------------
+Synopsis~
+ $#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);$
+
+Return~
+
+Description~
+These functions perform floating-point multiply-add. This is the operation
+(x * y) + z, but the intermediate result is not rounded to the destination
+type. This can sometimes improve the precision of a calculation.
+
+This function was introduced because some processors have a special
+instruction to perform multiply-add. The C compiler cannot use it directly,
+because the expression x*y + z is defined to round the intermediate result.
+$fma()$lets you choose when you want to round only once.
+
+ *crv-FP_FAST_FMA*
+ *crv-FP_FAST_FMAF* *crv-FP_FAST_FMAL*
+On processors which do not implement multiply-add in hardware,$fma$can be
+very slow since it must avoid intermediate rounding.
+math.h defines the symbols$FP_FAST_FMA$,$FP_FAST_FMAF$, and$FP_FAST_FMAL$ when
+the corresponding version of$fma()$is no slower than the expression x*y + z.
+
+
+
+
+==============================================================================
+II.13 <setjmp.h> Nonlocal Jumps *crv-libSetjmpH*
+
+This header file provides a function, a macro and a data type to perform
+nonlocal exits. Typically this is used to do an intermediate return from a
+nested function call.
+
+Quicklink:
+ $jmp_buf$ Type |crv-libjmp_buf|
+ $longjmp()$ Func |crv-liblongjmp|
+ $setjmp()$ Macro |crv-libsetjmp|
+
+
+
+jmp_buf Type *crv-jmp_buf*
+------------
+Objects of type$jmp_buf$hold the state information to be restored by a
+nonlocal exit. The contents of a$jmp_buf$identify a specific place to return
+to.
+
+
+
+setjmp() Macro *crv-setjmp*
+--------------
+Synopsis~
+ $#include <setjmp.h>$
+ $int setjmp(jmp_buf state);$
+
+Return~
+0: if normally executed
+!=0: value passed to$longjmp()$
+
+Description~
+When called normally,$setjmp()$stores information about the execution state of
+the program in$state$and returns zero. If$longjmp()$is later used to perform
+a nonlocal exit to this state,$setjmp()$returns a nonzero value.
+
+Calls to$setjmp()$are safe in only the following contexts:
+ - As the test expression of a selection or iteration statement (such as$if,$
+ $switch$, or$while$).
+ - As one operand of a equality or comparison operator that appears as the
+ test expression of a selection or iteration statement. The other operand
+ must be an integer constant expression.
+ - As the operand of a unary ! operator, that appears as the test expression
+ of a selection or iteration statement.
+ - By itself as an expression statement.
+
+Return points are valid only during the dynamic extent of the function that
+called$setjmp()$to establish them. If returned via$longjmp()$to a return point
+that was established in a function that has already returned, unpredictable
+and disastrous things are likely to happen.
+
+
+
+longjmp() Function *crv-longjmp*
+------------------
+Synopsis~
+ $#include <setjmp.h>$
+ $void longjmp(jmp_buf state, int value);$
+
+Return~
+none
+
+Description~
+This function restores current execution to the state saved in$state$, and
+continues execution from the call to$setjmp()$that established that return
+point. Returning from$setjmp()$by means of$longjmp()$returns the value
+argument that was passed to$longjmp()$, rather than 0.
+(But if value is given as 0, setjmp returns 1).
+
+
+
+==============================================================================
+II.14 <signal.h> Signal Handling *crv-libSignalH*
+
+This header file defines macros and declares functions for handling signals.
+
+Quicklink:
+ $rais()$ Func |crv-rais|
+ $sig_atomic_t$ Type |crv-sig_atomic_t|
+ $SIG_DFL$ Macro |crv-SIG_DFL|
+ $SIG_ERR$ Macro |crv-SIG_ERR|
+ $SIG_IGN$ Macro |crv-SIG_IGN|
+ $SIGABRT$ Macro |crv-SIGABRT|
+ $SIGFPE$ Macro |crv-SIGFPE|
+ $SIGILL$ Macro |crv-SIGILL|
+ $SIGINT$ Macro |crv-SIGINT|
+ $signal()$ Func |crv-signal|
+ $SIGSEGV$ Macro |crv-SIGSEGV|
+ $SIGTERM$ Macro |crv-SIGTERM|
+
+
+
+------------------------------------------------------------------------------
+II.14.1 Types *crv-libSHTyp*
+
+sig_atomic_t Type *crv-sig_atomic_t*
+-----------------
+This is an integer data type. Objects of this type are always accessed
+atomically. Reading and writing this data type is guaranteed to happen in a
+single instruction, so there's no way for a handler to run "in the middle"
+of an access.
+The type sig_atomic_t is always an integer data type, but which one it is,
+and how many bits it contains, may vary from machine to machine.
+
+
+
+------------------------------------------------------------------------------
+II.14.2 Signals *crv-libSHSig*
+
+Valid signals are:
+
+ Signal | Description
+ -----------+---------------------------------------------------
+ $SIGABRT$ | abnormal termination (e.g. call of$abort()$) *crv-SIGABRT*
+ $SIGFPE$ | arithmetic error (e.g. division by zero, *crv-SIGFPE*
+ | overflow)
+ $SIGILL$ | illegal instruction *crv-SIGILL*
+ $SIGINT$ | interactive attention signal (e.g. interrupt) *crv-SIGINT*
+ $SIGSEGV$ | invalid access to storage *crv-SIGSEGV*
+ $SIGTERM$ | termination request sent to the program *crv-SIGTERM*
+
+Other signals my be specified by the compiler.
+
+It depends on the machine whether this signals are generated by the system
+itself.$raise()$function can be used to send them.
+
+
+
+------------------------------------------------------------------------------
+II.14.3 Functions *crv-libSHFunc*
+
+
+signal() Function *crv-signal*
+-----------------
+Synopsis~
+ $#include <signal.h>$
+ $void (*signal(int sig, void (*handler)(int)))(int);$
+
+Return~
+- pointer to previous handler, if call was successful
+-$SIG_ERR$, if call failed
+
+Description~
+This function chooses one of three ways in which receipt of the signal$sig$is
+to be handled, these ways are:
+ *crv-SIG_DFL* *crv-SIG_IGN*
+ - If the value of$handler$is$SIG_DFL$, default handling for that signal
+ occurs.
+ - If the value of$handler$is$SIG_IGN$, the signal is ignored.
+ - If the value of$handler$points to a function, that function is called
+ with the argument of the type of signal.
+
+For valid signals see II.14.2 (|crv-libSHSig|).
+ *crv-SIG_ERR*
+If the call to signal is successful, then it returns a pointer to the previous
+signal handler for the specified signal type. If the call fails, then$SIG_ERR$
+is returned and$errno$is set to a positive value.
+
+
+
+rais() Function *crv-rais*
+---------------
+Synopsis~
+ $#include <signal.h>$
+ $int raise(int signum);$
+
+Return~
+0: signal sent successfully
+else: failed
+
+Description~
+The raise function sends the signal$signum$to the calling process.
+About the only reason for failure would be if the value of signum is invalid.
+
+
+
+
+------------------------------------------------------------------------------
+II.15 <stdarg.h> Arguments *crv-libStdargH*
+
+This header files defines macros which allow to handle functions with an
+unknown number of arguments.
+See |crv-fuDefVarPara| for an example.
+
+Quicklink:
+ $va_arg()$ Macro |crv-libva_arg|
+ $va_copy()$ Macro |crv-libva_copy|
+ $va_end()$ Macro |crv-libva_end|
+ $va_list$ Type |crv-libva_list|
+ $va_start()$ Macro |crv-libva_start|
+
+
+va_list Type *crv-va_list*
+------------
+This type is used for argument pointer variables.
+
+
+va_start() Macro *crv-va_start*
+----------------
+Synopsis~
+ $#include <signal.h>$
+ $void va_start(va_list ap, last-required);$
+
+Return~
+none
+
+Description~
+This macro initializes the argument pointer variable ap to point to the first
+of the optional arguments of the current function; last-required must be the
+last required argument to the function.
+
+
+
+va_arg() Macro *crv-va_arg*
+--------------
+Synopsis~
+ $#include <signal.h>$
+ $type va_arg(va_list ap, type);$
+
+Return~
+value of next argument
+
+Description~
+This macro returns the value of the next optional argument, and modifies the
+value of ap to point to the subsequent argument. Thus, successive uses of
+$va_arg()$return successive optional arguments.
+
+The type of the value returned by$va_arg()$is$type$as specified in the call.
+
+
+
+va_end() Macro *crv-va_end*
+--------------
+Synopsis~
+ $#include <signal.h>$
+ $void va_end(va_list ap);$
+
+Return~
+none
+
+Description~
+This ends the use of ap. After a$va_end()$call, further$va_arg()$calls with
+the same ap may not work.$va_end()$should be invoked before returning from the
+function in which$va_start()$was invoked with the same ap argument.
+
+
+
+va_copy() Macro *crv-va_copy*
+---------------
+Synopsis~
+ $#include <signal.h>$
+ $void va_copy (va_list dest, va_list src);$
+
+Return~
+none
+
+Description~
+The$va_copy()$macro allows copying of objects of type$va_list$even if this is
+not an integral type.
+The copies can be used to parse the list of parameters more than once.
+
+
+
+
+==============================================================================
+II.16 <stdbool.h> Boolean Type *crv-libStdboolH*
+
+
+bool Macro *crv-bool*
+----------
+expands to$_Bool$
+
+
+true Macro *crv-true*
+----------
+expands to integer constant 1
+
+
+false Macro *crv-false*
+-----------
+expands to integer constant 0
+
+
+__bool_true_false_are_defined Macro *crv-__bool_true_false_are_defined*
+-----------------------------------
+expands to integer constant 1
+
+
+
+
+==============================================================================
+II.17 <stddef.h> Definitions *crv-libStddefH*
+
+This header file defines some macros and types (some of them are also defined
+in other header files).
+
+Quicklink:
+ $prtdiff_t$ Type |crv-prtdiff_t|
+ $size_t$ Type |crv-size_t|
+ $wchar_t$ Type |crv-wchar_t|
+ $NULL$ Macro |crv-NULL|
+ $offsetof()$ Macro |crv-offsetof|
+
+
+prtdiff_t Type *crv-prtdiff_t*
+--------------
+This is the signed integer type of the result of subtracting two pointers.
+For example, with the declaration$char *p1, *p2;$, the expression$p2 - p1$is
+of type$ptrdiff_t$.
+
+
+size_t Type *crv-size_t*
+-----------
+This is an unsigned integer type used to represent the sizes of objects.
+Also declared in$<stdlib.h>$, see |crv-size_t2|.
+Also declared in$<string.h>$, see |crv-size_t3|.
+Also declared in$<time.h>$, see |crv-size_t4|.
+Also declared in$<stdio.h>$, see |crv-size_t5|;
+Also declared in$<wchar.h>$, see |crv-size_t6|.
+
+
+wchar_t Type *crv-wchar_t*
+------------
+This data type is used as the base type for wide character strings.
+It's range of values can represent distinct codes for all members of the
+largest extended character set specified among the supported locales.
+Also declared in$<stdlib.h>$, see |crv-libwchar_t2|.
+Also declared in$<wchar.h>$, see |crv-libwchar_t3|.
+
+
+NULL Macro *crv-NULL*
+----------
+Expands to an implementation-defined null pointer constant.
+Also defined in$<stdlib.h>$, see |crv-NULL2|.
+Also defined in$<string.h>$, see |crv-NULL3|.
+Also defined in$<time.h>$, see |crv-NULL4|.
+Also defined in$<stdio.h>$, see |crv-NULL5|.
+Also defined in$<wchar.h>$, see |crv-NULL6|.
+
+
+
+offsetof() Macro *crv-offsetof*
+----------------
+Synopsis~
+ $#include <stddef.h>$
+ $size_t offsetof (type, member);$
+
+Return~
+offset of$member$in structure$type$
+
+Description~
+This expands to an integer constant expression that is the offset of the
+structure member named$member$in the structure type$type$.
+
+
+
+==============================================================================
+II.18 <stdint.h> Integer Type *crv-libStdintH*
+
+This header file declares a set of integer types having specified widths and
+defines a set of macros to handle them.
+
+Types are defined in the following categories:
+ - integer types with a certain exact width
+ - integer types having at least a certain width
+ - fastest integer types having at least a certain width
+ - integer types wide enough to hold pointers
+ - integer types having greatest width
+
+
+------------------------------------------------------------------------------
+II.18.1 Integer Types *crv-libSdHType*
+
+II.18.1.1 Exact-Width *crv-libSdHTExact*
+----------------------
+There are integer types representing exactly N bits. The general form is:
+intN_t (signed width N bits width)
+uintN_t (unsigned width N bits width)
+
+Common types are:
+ $int8_t$ $uint8_t$ *crv-int8_t* *crv-uint8_t*
+ $int16_t$ $uint16_t$ *crv-int16_t* *crv-uint16_t*
+ $int32_t$ $uint32_t$ *crv-int32_t* *crv-uint32_t*
+ $int64_t$ $uint64_t$ *crv-int64_t* *crv-uint64_t*
+These types are optional. The compiler is free to declare others (e.g.
+$int24_t$).
+
+
+II.18.1.2 Minimum-Width *crv-libSdHTMin*
+-----------------------
+There are integer types with at least N bits width. The general form is:
+int_leastN_t (signed with at least N bits width)
+uint_leastN_t (unsigned with at least N bits width)
+
+Common types are:
+ $int_least8_t$ $uint_least8_t$ *crv-int_least8_t*
+ *crv-uint_least8_t*
+ $int_least16_t$ $uint_least16_t$ *crv-int_least16_t*
+ *crv-uint_least16_t*
+ $int_least32_t$ $uint_least32_t$ *crv-int_least32_t*
+ *crv-uint_least32_t*
+ $int_least64_t$ $uint_least64_t$ *crv-int_least64_t*
+ *crv-uint_least64_t*
+
+These types are required. Others may be declared by the compiler.
+
+
+II.18.1.3 Fastest Minimum-Width *crv-libSdHTFast*
+-------------------------------
+These integer types allow the fastest access while having at least N bits.
+The general form is:
+int_fastN_t (fast signed with at least N bits width)
+uint_fastN_t (fast unsigned with at least N bits width)
+
+Common types are:
+ $int_fast8_t$ $uint_fast8_t$ *crv-int_fast8_t*
+ *crv-uint_fast8_t*
+ $int_fast16_t$ $uint_fast16_t$ *crv-int_fast16_t*
+ *crv-uint_fast16_t*
+ $int_fast32_t$ $uint_fast32_t$ *crv-int_fast32_t*
+ *crv-uint_fast32_t*
+ $int_fast64_t$ $uint_fast64_t$ *crv-int_fast64_t*
+ *crv-uint_fast64_t*
+
+These types are required. Others may be declared by the compiler.
+
+
+II.18.1.4 Greatest-Width *crv-libSdHTGreat*
+------------------------
+These integer types have the widest range possible on the platform on which
+they are being used.
+ $intmax_t$ (signed) *crv-intmax_t*
+ $uintmax_t$ (unsigned) *crv-uintmax_t*
+These types are required.
+
+
+II.18.1.5 Hold Pointer *crv-libSdHTPtr*
+----------------------
+These integer types are wide enough to store a pointer of type$void$.
+ $intptr_t$ (signed) *crv-intptr_t*
+ $uintptr_t$ (unsigned) *crv-uintptr_t*
+
+These types are optional.
+
+
+
+------------------------------------------------------------------------------
+II.18.2 Limits *crv-libSdHTLim*
+ *crv-__STDC_LIMIT_MACROS*
+The following macros specify the minimum and maximum of the types declared
+in$<stdint.h>$. They are defined only if$__STDC_LIMIT_MACROS$is defined before
+including$<stdint.h>$.
+
+II.18.2.1 Exact-Width *crv-libSdHLExact*
+---------------------
+Signed integer minimum:
+ INTN_MIN, N is the number of bits
+ Value: -2^(N-1)
+ Common macros:
+ $INT8_MIN$ *crv-INT8_MIN*
+ $INT16_MIN$ *crv-INT16_MIN*
+ $INT32_MIN$ *crv-INT32_MIN*
+ $INT64_MIN$ *crv-INT64_MIN*
+
+Signed integer maximum:
+ INTN_MAX, N is the number of bits
+ Value: 2^(N-1) - 1
+ Common macros:
+ $INT8_MAX$ *crv-INT8_MAX*
+ $INT16_MAX$ *crv-INT16_MAX*
+ $INT32_MAX$ *crv-INT32_MAX*
+ $INT64_MAX$ *crv-INT64_MAX*
+
+Unsigned integer minimum:
+ is always 0
+
+Unsigned integer maximum:
+ UINTN_MAX, N is the number of bits
+ Value: 2^N - 1
+ Common macros:
+ $UINT8_MAX$ *crv-UINT8_MAX*
+ $UINT16_MAX$ *crv-UINT16_MAX*
+ $UINT32_MAX$ *crv-UINT32_MAX*
+ $UINT64_MAX$ *crv-UINT64_MAX*
+
+
+
+II.18.2.2 Minimum-Width *crv-libSdHLMin*
+-----------------------
+Signed integer minimum:
+ INT_LEASTN_MIN, N is the number of bits
+ Value: <= -2^(N-1)
+ Common macros:
+ $INT_LEAST8_MIN$ *crv-INT_LEAST8_MIN*
+ $INT_LEAST16_MIN$ *crv-INT_LEAST16_MIN*
+ $INT_LEAST32_MIN$ *crv-INT_LEAST32_MIN*
+ $INT_LEAST64_MIN$ *crv-INT_LEAST64_MIN*
+
+Signed integer maximum:
+ INT_LEASTN_MAX, N is the number of bits
+ Value: >= 2^(N-1) - 1
+ Common macros:
+ $INT_LEAST8_MAX$ *crv-INT_LEAST8_MAX*
+ $INT_LEAST16_MAX$ *crv-INT_LEAST16_MAX*
+ $INT_LEAST32_MAX$ *crv-INT_LEAST32_MAX*
+ $INT_LEAST64_MAX$ *crv-INT_LEAST64_MAX*
+
+Unsigned integer minimum:
+ is always 0
+
+Unsigned integer maximum:
+ UINT_LEASTN_MAX, N is the number of bits
+ Value: >= 2^N - 1
+ Common macros:
+ $UINT_LEAST8_MAX$ *crv-UINT_LEAST8_MAX*
+ $UINT_LEAST16_MAX$ *crv-UINT_LEAST16_MAX*
+ $UINT_LEAST32_MAX$ *crv-UINT_LEAST32_MAX*
+ $UINT_LEAST64_MAX$ *crv-UINT_LEAST64_MAX*
+
+
+
+II.18.2.3 Fastest Minimum-Width *crv-libSdHLFast*
+-------------------------------
+Signed integer minimum:
+ INT_FASTN_MIN, N is the number of bits
+ Value: <= -2^(N-1)
+ Common macros:
+ $INT_FAST8_MIN$ *crv-INT_FAST8_MIN*
+ $INT_FAST16_MIN$ *crv-INT_FAST16_MIN*
+ $INT_FAST32_MIN$ *crv-INT_FAST32_MIN*
+ $INT_FAST64_MIN$ *crv-INT_FAST64_MIN*
+
+Signed integer maximum:
+ INT_FASTN_MAX, N is the number of bits
+ Value: >= 2^(N-1) - 1
+ Common macros:
+ $INT_FAST8_MAX$ *crv-INT_FAST8_MAX*
+ $INT_FAST16_MAX$ *crv-INT_FAST16_MAX*
+ $INT_FAST32_MAX$ *crv-INT_FAST32_MAX*
+ $INT_FAST64_MAX$ *crv-INT_FAST64_MAX*
+
+Unsigned integer minimum:
+ is always 0
+
+Unsigned integer maximum:
+ UINT_FASTN_MAX, N is the number of bits
+ Value: >= 2^N - 1
+ Common macros:
+ $UINT_FAST8_MAX$ *crv-UINT_FAST8_MAX*
+ $UINT_FAST16_MAX$ *crv-UINT_FAST16_MAX*
+ $UINT_FAST32_MAX$ *crv-UINT_FAST32_MAX*
+ $UINT_FAST64_MAX$ *crv-UINT_FAST64_MAX*
+
+
+
+II.18.2.4 Greatest-Width *crv-libSdHLGreat*
+------------------------
+Minimum value of greatest-width signed integer type:
+$ INTMAX_MIN$ <= -(2^63) *crv-INTMAX_MIN*
+
+Maximum value of greatest-width signed integer type:
+$ INTMAX_MAX$ >= 2^63 - 1 *crv-INTMAX_MAX*
+
+Minimum value of greatest-width unsigned integer type:
+ 0
+Maximum value of greatest-width unsigned integer type:
+$ UINTMAX_MAX$ >= 2^64 - 1 *crv-UINTMAX_MAX*
+
+
+
+II.18.2.5 Hold Pointer *crv-libSdHLPtr*
+----------------------
+Minimum value of pointer holding signed integer type:
+ $INTPTR_MIN$ <= -(2^15) *crv-INTPTR_MIN*
+
+Maximum value of pointer holding signed integer type:
+ $INTPTR_MAX$ >= 2^15 - 1 *crv-INTPTR_MAX*
+
+Minimum value of pointer holding unsigned integer type:
+ 0
+
+Maximum value of pointer holding unsigned integer type:
+ $UINTPTR_MAX$ >= 2^16 - 1 *crv-UINTPTR_MAX*
+
+
+
+II.18.2.6 Others *crv-libSdHLOther*
+----------------
+Limits of$ptrdiff_t$:
+ $PTRDIFF_MIN$ *crv-PTRDIFF_MIN*
+ $PTRDIFF_MAX$ *crv-PTRDIFF_MAX*
+
+Limits of$sig_atomic_t$:
+ $SIG_ATOMIC_MIN$ *crv-SIG_ATOMIC_MIN*
+ $SIG_ATOMIC_MAX$ *crv-SIG_ATOMIC_MAX*
+
+Limits of$size_t$:
+ $SIZE_MAX$ *crv-SIZE_MAX*
+
+Limits of$wchar_t$:
+ $WCHAR_MIN$ *crv-WCHAR_MIN*
+ $WCHAR_MAX$ *crv-WCHAR_MAX*
+ Also defined in$<wctype.h>$, see |crv-libWCHAR_MIN2|, |crv-libWCHAR_MAX2|.
+
+Limits of$wint_t$:
+ $WINT_MIN$ *crv-WINT_MIN*
+ $WINT_MAX$ *crv-WINT_MAX*
+
+
+
+-----------------------------------------------------------------------------
+II.18.3 Macros *crv-libSdHMac*
+
+
+INTMAX_C() Macro *crv-INTMAX_C*
+----------------
+Synopsis~
+ $#include <stdint.h>$
+ $INTMAX_C(val);$
+
+Description~
+expands to an integer constant value$val$of type$intmax_t$
+
+
+UINTMAX_C() Macro *crv-UINTMAX_C*
+-----------------
+Synopsis~
+ $#include <stdint.h>$
+ $UINTMAX_C(val);$
+
+Description~
+expands to an integer constant value$val$of type$uintmax_t$
+
+
+ *crv-INT8_C* *crv-INT16_C*
+INTN_C() Macro *crv-INT32_C* *crv-INT64_C*
+--------------
+Synopsis~
+ $#include <stdint.h>$
+ $INT8_C(val);$
+ $INT16_C(val);$
+ $INT32_C(val);$
+ $INT64_C(val);$
+
+Description~
+expands to an integer constant value$val$of type$int_leastN_t$(N number of
+bits)
+
+
+ *crv-UINT8_C* *crv-UINT16_C*
+UINTN_C() Macro *crv-UINT32_C* *crv-UINT64_C*
+---------------
+Synopsis~
+ $#include <stdint.h>$
+ $UINT8_C(val);$
+ $UINT16_C(val);$
+ $UINT32_C(val);$
+ $UINT64_C(val);$
+
+Description~
+expands to an integer constant value$val$of type$uint_leastN_t$(N number of
+bits)
+
+
+
+
+==============================================================================
+II.19 <stdio.h> Input/Output *crv-libStdioH*
+
+This header file declares types, macros and functions to perform input/output
+operations.
+
+
+------------------------------------------------------------------------------
+II.19.1 Types *crv-libSIOHType*
+
+Quicklink:
+ $size_t$ Type |crv-size_t5|
+ $FILE$ Type |crv-FILE|
+ $fpos_t$ Type |crv-fpos_t|
+
+
+size_t Type *crv-size_t5*
+-----------
+This is an unsigned integer type used to represent the sizes of objects.
+Also declared in$<stddef.h>$, see |crv-size_t|.
+Also declared in$<string.h>$, see |crv-size_t2|.
+Also declared in$<stdlib.h>$, see |crv-size_t3|.
+Also declared in$<time.h>$, see |crv-size_t4|.
+Also declared in$<wchar.h>$, see |crv-size_t6|.
+
+
+FILE Type *crv-FILE*
+---------
+This is the data type used to represent stream objects. A FILE object holds
+all of the internal state information about the connection to the associated
+file.
+
+
+fpos_t Type *crv-fpos_t*
+-----------
+This is the type of an object that can encode information about the file
+position of a stream.
+
+
+
+
+------------------------------------------------------------------------------
+II.19.2 Macros *crv-libSIOHMac*
+
+Quicklink:
+ $_IOFBF$ Macro |crv-_IOFBF|
+ $_IOLBF$ Macro |crv-_IOLBF|
+ $_IONBF$ Macro |crv-_IONBF|
+ $BUFSIZ$ Macro |crv-BUFSIZ|
+ $BUFSIZ$ Macro |crv-BUFSIZ|
+ $FOPEN_MAX$ Macro |crv-FOPEN_MAX|
+ $FILENAME_MAX$ Macro |crv-FILENAME_MAX|
+ $L_tmpnam$ Macro |crv-L_tmpnam|
+ $NULL$ Macro |crv-NULL5|
+ $SEEK_SET$ Macro |crv-SEEK_SET|
+ $SEEK_CUR$ Macro |crv-SEEK_CUR|
+ $SEEK_END$ Macro |crv-SEEK_END|
+ $stderr$ Macro |crv-stderr|
+ $stdin$ Macro |crv-stdin|
+ $stdout$ Macro |crv-stdout|
+
+
+
+NULL Macro *crv-NULL5*
+----------
+Expands to an implementation-defined null pointer constant.
+Also defined in$<stddef.h>$, see |crv-libNULL|.
+Also defined in$<stdlib.h>$, see |crv-libNULL2|.
+Also defined in$<string.h>$, see |crv-libNULL3|.
+Also defined in$<time.h>$, see |crv-libNULL4|.
+Also defined in$<wchar.h>$, see |crv-libNULL6|.
+
+
+
+_IOFBF Macro *crv-_IOFBF*
+_IOLBF Macro *crv-_IOLBF*
+_IONBF Macro *crv-_IONBF*
+------------
+This macros expand to an constant integer expression that can be used as the
+mode argument to the$setvbuf()$function.
+
+ $_IOFBF$ specifies that the stream should be fully buffered
+ $_IOLBF$ specifies that the stream should be line buffered
+ $_IONBF$ specifies that the stream should be unbuffered
+
+
+
+BUFSIZ Macro *crv-BUFSIZ*
+------------
+The value of this macro is an integer constant expression that is good to use
+for the size argument to$setvbuf()$. This value is guaranteed to be at least
+256.
+
+
+
+EOF Macro *crv-EOF*
+---------
+This is returned by a number of narrow stream functions to indicate an
+end-of-file condition, or some other error situation.
+
+
+
+FOPEN_MAX Macro *crv-FOPEN_MAX*
+---------------
+The value of this macro is an integer constant expression that represents the
+minimum number of streams that the implementation guarantees can be open
+simultaneously.
+
+
+
+FILENAME_MAX Macro *crv-FILENAME_MAX*
+------------------
+The value of this macro is an integer constant expression that represents
+the maximum length of a file name string.
+
+
+
+L_tmpnam Macro *crv-L_tmpnam*
+--------------
+The value of this macro is an integer constant expression that represents the
+minimum size of a string large enough to hold a file name generated by the
+$tmpnam()$function.
+
+
+
+
+SEEK_SET Macro *crv-SEEK_SET*
+SEEK_CUR Macro *crv-SEEK_CUR*
+SEEK_END Macro *crv-SEEK_END*
+--------------
+These are integer constants which are used as the whence argument to the
+fseek() or fseeko() functions.
+
+ $SEEK_SET$ specifies that the offset provided is relative to the beginning
+ of the file
+ $SEEK_CUR$ specifies that the offset provided is relative to the current
+ file position
+ $SEEK_END$ specifies that the offset provided is relative to the end of the
+ file
+
+
+TMP_MAX Macro *crv-TMP_MAX*
+-------------
+This is the maximum number of unique filenames that the function$tmpnam()$can
+generate.
+
+
+
+stderr Macro *crv-stderr*
+stdin Macro *crv-stdin*
+stdout Macro *crv-stdout*
+------------
+These macros expand to pointers to$FILE$types which correspond to the standard
+error, standard input and standard output streams. These streams are text
+streams.
+
+The standard input stream is the normal source of input for the program.
+The standard output stream is the normal source of output from the program.
+The standard error stream is used for error messages and diagnostics issued
+by the program.
+
+
+
+------------------------------------------------------------------------------
+II.19.3 Streams and Files *crv-libSIOHStrmFile*
+
+Streams provide a higher-level interface between program and input/output
+device. There are two types of streams: text and binary streams.
+
+Text and binary streams differ in several ways:
+
+ - The data read from a text stream is divided into lines which are
+ terminated by newline ('\n') characters, while a binary stream is simply a
+ long series of characters.
+ A text stream might on some systems fail to handle lines more than 254
+ characters long (including the terminating newline character).
+
+ - On some systems, text files can contain only printing characters,
+ horizontal tab characters, and newlines, and so text streams may not
+ support other characters. However, binary streams can handle any character
+ value.
+
+ - Space characters that are written immediately preceding a newline
+ character in a text stream may disappear when the file is read in again.
+
+ - More generally, there need not be a one-to-one mapping between characters
+ that are read from or written to a text stream, and the characters in the
+ actual file.
+
+Binary streams transfers data without changing (1:1 copy).
+
+On some systems text and binary streams use different file formats, the only
+way to read or write "an ordinary file of text" that can work with other
+text-oriented programs is through a text stream.
+
+At startup of a program there are three text streams available: standard
+input, standard output and standard error. See |crv-libstdout| for further
+information.
+
+
+Files are associated with streams. A file must be opened to be used. One of
+the attributes of an open file is its file position that keeps track of where
+in the file the next character is to be read or written.
+The file position is normally set to the beginning of the file when it is
+opened, and each time a character is read or written, the file position is
+incremented, so access to the file is normally sequential.
+
+Ordinary files permit read or write operations at any position within the
+file. Some other kinds of files may also permit this. Files which do permit
+this are sometimes referred to as random-access files. The file position
+can be changed using the$fseek()$function on a stream.
+
+Streams that are opened for append access are treated specially for output:
+output to such files is always appended sequentially to the end of the
+file, regardless of the file position. However, the file position is still
+used to control where in the file reading is done.
+
+Each opening of a file creates a separate file position. Thus, if a file is
+opened twice - even in the same program - two streams with independent
+file positions are generated.
+
+
+An open file must be closed,$fclose()$can be used to do that. If$main()$
+returns or$exit()$is called, all opened files are closed automatically.
+Other path to program termination (e.g.$abort()$) do not need to close
+files (dependes on compiler).
+
+
+
+------------------------------------------------------------------------------
+II.19.4 File Operations *crv-libSIOHFOp*
+
+
+remove() Function *crv-remove*
+-----------------
+Synopsis~
+ $#include <stdio.h>$
+ $int remove(const char *file_name);$
+
+Return~
+0: successful
+nonzero: failed
+
+Description~
+Remove the file (unlink it) with name$*file$points to. Any subsequent attempt
+to open it again will fail. If the file is currently open, then the result is
+implementation-defined.
+
+
+
+rename() Function *crv-rename*
+-----------------
+Synopsis~
+ $#include <stdio.h>$
+ $int rename(const char *oldname, const char *newname);$
+
+Return~
+0: successful
+else: failed
+
+Description~
+This function renames the file$oldname$to$newname$. The file formerly
+accessible under the name$oldname$is afterwards accessible as$newname$instead.
+If the new file exists before renaming, then the result is
+implementation-defined.
+
+
+
+tmpfile() Function *crv-tmpfile*
+------------------
+Synopsis~
+ $#include <stdio.h>$
+ $FILE *tmpfile(void);$
+
+Return~
+NULL: failed
+else: pointer to stream of the created file
+
+Description~
+This function creates a temporary binary file for update mode, as if by
+calling$fopen()$with mode "wb+". The file is deleted automatically when it is
+closed or when the program terminates.
+
+
+
+tmpnam() Function *crv-tmpnam*
+-----------------
+Synopsis~
+ $#include <stdio.h>$
+ $char *tmpnam(char *result);$
+
+Return~
+NULL: failed
+else: pointer to name of file
+
+Description~
+This function constructs and returns a valid file name that does not refer to
+any existing file. If the$result$argument is a null pointer, the return value
+is a pointer to an internal static string, which might be modified by
+subsequent calls. Otherwise, the$result$argument should be a pointer to an
+array of at least$L_tmpnam$characters, and the result is written into that
+array. In this case the value of the argument is returned.
+Each call of$tmpnam()$generates a different name, up to$TMP_MAX$times.
+
+
+
+
+------------------------------------------------------------------------------
+II.19.5 File Access *crv-libSIOHFAcc*
+
+
+fclose() Function *crv-fclose*
+-----------------
+Synopsis~
+ $#include <stdio.h>$
+ $int fclose(FILE *stream);$
+
+Return~
+0: success
+EOF: failed
+
+Description~
+This function causes$stream$to be closed and the connection to the
+corresponding file to be broken. Any buffered output is written and any
+buffered input is discarded.
+
+
+
+fflush() Function *crv-fflush*
+-----------------
+Synopsis~
+ $#include <stdio.h>$
+ $int fflush(FILE *stream);$
+
+Return~
+0: success
+EOF: failed
+
+Description~
+This function causes any buffered output on$stream$to be delivered to the
+file. If$stream$is a null pointer, then$fflush()$causes buffered output on all
+open output streams to be flushed.
+
+
+
+fopen() Function *crv-fopen*
+----------------
+Synopsis~
+ $#include <stdio.h>$
+ $FILE *fopen(const char *file_name, const char *opentype);$
+
+Return~
+NULL: failed
+else: pointer to stream of opened file
+
+Description~
+This function opens a stream for I/O to the file$file_name$, and returns a
+pointer to the stream.
+The$opentype$argument is a string that controls how the file is opened and
+specifies attributes of the resulting stream. It must begin with one of the
+following sequences of characters, other may follow (implementation-defined):
+
+ Mode | Description
+ ------------+--------------------------------------------------------------
+ $r$ | open text file for reading
+ $w$ | truncate to zero length or create text file for writing
+ $a$ | append; open or create text file for writing at end-of-file
+ $rb$ | open binary file for reading
+ $wb$ | truncate to zero length or create binary file for writing
+ $ab$ | append; open or create binary file for writing at end-of-file
+ $r+$ | open text file for reading and writing
+ $w+$ | truncate to zero length or create text file for reading and
+ | writing
+ $a+$ | append; open or create text file for reading and writing,
+ | writing at end-of-file
+ $r+b or rb+$| open binary file for reading and writing
+ $w+b or wb+$| truncate to zero length or create binary file for reading
+ | and writing
+ $a+b or ab+$| append; open or create binary file for reading and writing,
+ | writing at end-of-file
+
+
+
+
+freopen() Function *crv-freopen*
+------------------
+Synopsis~
+ $#include <stdio.h>$
+ $FILE *freopen(const char *file_name, const char *opentype, FILE *stream);$
+
+Return~
+NULL: failed
+else: pointer to stream of opened file
+
+Description~
+This function is like a combination of$fclose()$and$fopen()$. It first closes
+the stream referred to by$stream$, ignoring any errors that are detected in
+the process. Then the file named by$file_name$is opened with mode$opentype$as
+for$fopen()$, and associated with the same stream object$stream$.
+
+This is traditionally been used to connect a standard stream such as$stdin$
+with a file.
+
+
+
+setbuf() Function *crv-setbuf*
+-----------------
+Synopsis~
+ $#include <stdio.h>$
+ $void setbuf(FILE *stream, char *buf);$
+
+Return~
+none
+
+Description~
+If$buf$is a null pointer, the effect of this function is equivalent to calling
+$setvbuf()$with a mode argument of$_IONBF$. Otherwise, it is equivalent to
+calling$setvbuf()$with$buf$, and a mode of$_IOFBF$and a size argument of
+$BUFSIZ$.
+
+This function is provided for compatibility with old code; use$setvbuf()$in
+all new programs.
+
+
+
+setvbuf() Function *crv-setvbuf*
+------------------
+Synopsis~
+ $#include <stdio.h>$
+ $int setvbuf(FILE *stream, char *buf, int mode, size_t size);$
+
+Return~
+0: success
+nonzero: failed
+
+Description~
+This function is used to specify that the stream$stream$should have the
+buffering mode$mode$, which can be:
+
+$_IOFBF$ full buffering |crv-lib_IOFBF|
+$_IOLBF$ line buffering |crv-lib_IOLBF|
+$_IONBF$ unbuffered input/output |crv-lib_IONBF|
+
+If a null pointer as the$buf$argument is specified, then$setvbuf()$allocates
+a buffer itself. This buffer will be freed when closing the stream.
+
+Otherwise,$buf$should be a character array that can hold at least$size$
+characters. This space should not be freed as long as the stream remains open
+and this array remains its buffer.
+
+
+
+
+------------------------------------------------------------------------------
+II.19.6 Formatted Input/Output *crv-libSIOHIO*
+
+
+II.19.6.1 Format Control *crv-libSIOHIOFormat*
+------------------------
+
+II.19.6.1.1 Output, printf() *crv-libSIOHIOFout*
+-----------------------------
+The family of printf() functions write output to a stream, under control of
+the format string. The format specifies how subsequent arguments are converted
+to output.
+A format string for output has the following syntax:
+ $%[flags][width][.precision][modifier]type$
+
+[flags] control convertion (optional)
+[width] number of characters to output (optional)
+[.precision] precision of number (optional)
+[modifier] overrides size (type) of argument (optional)
+[type] type of conversion (required)
+
+
+[flag] control convertion (optional)
+
+ zero or more flags may be specified
+
+ flag | Description
+ -------+---------------------------------------------------------------------
+ $-$ | value is left-justified (default is right-justified)
+ $+$ | forces to show sign of value (+ or -)
+ | default is to show only - for negative values, overrules space
+ space | print " " in front of positive value, print - for negative value
+ $#$ | convert to alternative form:
+ | $o$ increase precision to force the first digit to be a zero
+ |
+ | $x$or$X$ nonzero result will have prefix "0x" or "0X"
+ |
+ | $a$,$A$,
+ | $e$,$E$,
+ | $f$,$F$,
+ | $g$or$G$ result will always have decimal point
+ |
+ | $g$or$G$ trailing zeros are not removed
+ |
+ $0$ | for $d, i, o, u, x, X, a, A, e, E, f, F, g, G$conversions leading
+ | zeros are used to pad to the field width instead of spaces
+
+
+[width] number of characters to output (optional)
+ This is a decimal integer specifying the minimum field width. If the normal
+ conversion produces fewer characters than this, the field is padded with
+ spaces to the specified width. If the normal conversion produces more
+ characters than this, the field is not truncated. Normally, the output is
+ right-justified within the field.
+ A field width of$*$may be specified. This means that the next argument
+ in the argument list (before the actual value to be printed) is used as the
+ field width. The value must be an integer of type$int$. If the value is
+ negative, this means to set the$-$flag and to use the absolute value as
+ the field width.
+
+[.precision] precision of number (optional)
+ The precision specifies the number of digits to be written for the numeric
+ conversions. If the precision is specified, it consists of a period ($.$)
+ followed optionally by a decimal integer (which defaults to zero if
+ omitted).
+
+ A precision of$*$may be specified. This means that the next argument
+ in the argument list (before the actual value to be printed) is used as the
+ precision. The value must be an integer of type$int$, and is ignored if it
+ is negative.
+ If$*$is specified for both the field width and precision, the field width
+ argument precedes the precision argument.
+
+
+ precision | Description
+ -----------+-----------------------------------------------------------------
+ (none) | default precision:
+ | 1 for$d, i, o, u, x, X$types. Precision gives the minimum number
+ | of digits to appear.
+ | 6 for$f, F, e, E$types. Precision gives the number of digits to
+ | appear after decimal point.
+ | For$g, G$types all digits are printed.
+ | For$s$type all characters of the string are printed, not
+ | including the terminating null character.
+ | For$a, A$and$FLT_RADIX$of 2: precision is sufficient for an
+ | exact representation of the value.
+ | For$a, A$and$FLT_RADIX$not equal to 2: precision is sufficient
+ | to distinguish values of type$double$.
+ |
+ $.$or$.0$ | For$d, i, o, u, x, X$types the default precision is used, unless
+ | the value is 0, then no characters are printed.
+ | For$f, F, e, E$types no decimal-point and no decimal-digits are
+ | printed..
+ | For$g, G$types precision is assumed to be 1.
+ | For$s$type nothing is printed.
+ | For$a, A$types no decimal-point and no decimal-digits appear.
+ |
+ $.N$ | For$d, i, o, u, x, X$types. At least N digits appear, if
+ | necessary output is expanded with leading zeros.
+ | For$f, F, e, E$types. N digits appear after decimal point.
+ | For$g, G$types N digits are printed.
+ | For$s$type a maximum of N characters of the string are printed,
+ | not including the terminating null character.
+ | For$a, A$types N specifies the number of digits after decimal
+ | point.
+ |
+
+
+
+[modifier] overrides size (type) of argument (optional)
+ The modifier character is used to specify the data type of the corresponding
+ argument if it differs from the default type.
+
+
+ modifier | Description
+ ----------+------------------------------------------------------------------
+ $hh$ | Specifies that the argument is a$signed char$or$unsigned char$,
+ | as appropriate. A$char$argument is converted to an$int$or
+ |$unsigned int$by the default argument promotions anyway, but this
+ | modifier says to convert it back to a$char$again.
+ |
+ $h$ | Specifies that the argument is a$short int$or$unsigned short int$
+ | as appropriate. A$short$argument is converted to an$int$or
+ |$unsigned int$by the default argument promotions anyway, but this
+ | modifier says to convert it back to a$short$again.
+ |
+ $l$ | Specifies that the argument is a$long int$or$unsigned long int$,
+ | as appropriate. Two l characters is like the L modifier, below
+ | If used with$%c$or$%s$the corresponding parameter is considered
+ | as a wide character or wide character string respectively.
+ |
+ $ll$ | Specifies that a following$d, i, o, u, x, X$applies to a
+ |$long long int$or$unsigned long long int$argument; or that a
+ |$n$applies to a pointer to$long long int$.
+ |
+ $L$ | Specifies that a following$a, A, e, E, f, F, g, G$conversion
+ | specifier applies to a$long double$argument.
+ |
+ $j$ | Specifies that a following$d, i, o, u, x, X$applies to$intmax_t$
+ | or$uintmax_t$, or that a following$n$applies to pointer to
+ |$intmax_t$.
+ |
+ $t$ | Specifies that a following$d, i, o, u, x, X$applies to a
+ |$ptrdiff_t$or the corresponding unsigned integer type argument;
+ | or that a$n$applies to a pointer to a$ptrdiff_t$argument.
+ |
+ $z$ | Specifies that the following$d, i, o, u, x, X$applies to a
+ |$size_t$or the corresponding singed integer type argument;
+ | or that a$n$applies to a pointer to a signed integer type
+ | corresponding to$size_t$argument.
+
+
+[type] type of conversion (required)
+
+ The conversion specifier specifies the conversion to be applied.
+
+ type | Description
+ --------+------------------------------------------------------------------
+ $ d, i$ | type$signed int$, output decicmal, style [-]dddd
+ $o$ | type$unsigned int$, output octal, style: dddd
+ $u$ | type$unsigned int$, output decimal, style dddd
+ $x$ | type$unsigned int$, output hexadecimal, style dddd using a...f
+ $X$ | type$unsigned int$, output hexadecimal, style dddd using A...F
+ $f, F$ | type$double$, output decimal, style [-]ddd.ddd
+ $e$ | type$double$, output decimal, style [-]d.ddde+/-dd
+ $E$ | type$double$, output decimal, style [-]d.dddE+/-dd
+ $g$ | type$double$, printed as type$e$if exponent is less than -4
+ | or greater than or equal to the precision. Otherwise$f$is used.
+ $G$ | type$double$, printed as type$E$if exponent is less than -4
+ | or greater than or equal to the precision. Otherwise$F$is used.
+ $a$ | type$double$, style [-]0xh.hhhhp+/-d
+ | h: hexadecimal digit 0...9, a...f
+ | d: decimal digit
+ $A$ | type$double$, style [-]0Xh.hhhhP+/-d
+ | h: hexadecimal digit 0...9, A...F
+ | d: decimal digit
+ $c$ | no$l$modifier: type$char$, single character is printed
+ | with$l$modifier: type$wchar_t$, single character is printed
+ $s$ | no$l$modifier: pointer to array of$char$, string is printed
+ | with$l$modifier: pointer to array of$char$, string is printed
+ $p$ | type pointer to$void$, value of pointer is printed in an
+ | implementation-defined way
+ $n$ | argument is a pointer to$signed int$into which is written the
+ | number of characters written to the output stream so far
+ $%$ | a % is printed
+
+
+
+
+II.19.6.1.2 Input, scanf() *crv-libSIOHIOFin*
+---------------------------
+The family of scanf() functions read input from a stream, under control of
+the format string. The format specifies how the input is to be stored in
+the appropriate variable(s).
+A white-space character may match with any whitespace character (space, tab,
+carriage return, new line, vertical tab, or formfeed).
+Other characters in the format string that are not part of conversion
+specifications must match characters in the input stream exactly; if this is
+not the case, a matching failure occurs and scanning is stopped.
+
+A format string for input has the following syntax:
+ $%[*][width][modifier]type$
+
+[*] assignment suppressor (optional)
+[width] maximum number of characters to be read (optional)
+[modifier] overrides size (type) of argument (optional)
+[type] type of conversion (required)
+
+
+[*] assignment suppressor (optional)
+ The assignment suppressor$*$says to ignore the text read for this
+ specification. When scanf() finds a conversion specification that uses this
+ flag, it reads input as directed by the rest of the conversion
+ specification, but it discards this input, does not use a pointer argument,
+ and does not increment the count of successful assignments.
+
+
+[width] maximum number of characters to be read (optional)
+ This is a decimal integer that specifies the maximum field width. Reading of
+ characters from the input stream stops either when this maximum is reached
+ or when a non-matching character is found, whichever happens first. Then
+ what was read so far is converted and stored in the variable.
+
+ Most conversions discard initial whitespace characters (those that don't are
+ explicitly documented), and these discarded characters don't count towards
+ the maximum field width. String input conversions store a null character
+ to mark the end of the input; the maximum field width does not include this
+ terminator.
+
+
+[modifier] overrides size (type) of argument (optional)
+ The modifier character is used to specify the data type of the corresponding
+ argument if it differs from the default type.
+
+
+ modifier | Description
+ ----------+------------------------------------------------------------------
+ $hh$ | Specifies that a following$d, i, o, u, x, X, n$conversion applies
+ | to an argument with type pointer to$signed char$or
+ | $unsigned char$
+ |
+ $h$ | Specifies that a following$d, i, o, u, x, X, n$conversion applies
+ | to an argument with type pointer to$short int$or$unsigned short$.
+ |
+ $l$ | Specifies that a following$d, i, o, u, x, X, n$conversion applies
+ | to an argument with type pointer to$long int$or
+ |$unsigned long int$; or that a following$a, A, e, E, f, F, g, G$
+ | converstion applies to an argument with type pointer to$double$;
+ | or that a following$c, s, [$conversion applies to an argument
+ | with type pointer to$wchar_t$.
+ |
+ $ll$ | Specifies that a following$d, i, o, u, x, X, n$argument applies
+ | to an argument with type pointer to$long long int$or
+ | $unsigned long long int$.
+ |
+ $L$ | Specifies that a following$a, A, e, E, f, F, g, G$conversion
+ | applies to an argument of type pointer to$long double$argument.
+ |
+ $j$ | Specifies that a following$d, i, o, u, x, X, n$conversion applies
+ | to an argument with type pointer to$intmax_t$or$uintmax_t$.
+ |
+ $t$ | Specifies that a following$d, i, o, u, x, X, n$conversion applies
+ | to an argument of type pointer to$ptrdiff_t$or the corresponding
+ | unsigned integer type.
+ |
+ $z$ | Specifies that a following$d, i, o, u, x, X, n$conversion applies
+ | to an argument of type pointer to$size_t$or the corresponding
+ | singed integer type.
+
+
+
+[type] type of conversion (required)
+
+ The conversion specifier specifies the conversion to be applied.
+
+ type | Description
+ --------+--------------------------------------------------------------------
+ $ d $ | type$signed int$, matches an optionally signed integer written
+ | in decimal
+ |
+ $i$ | type$signed int$, matches an optionally signed integer in any of
+ | the formats that the C language defines for specifying an integer
+ | constant. The based used depends on the first two characters:
+ | - first character 1...9, then base 10 (decimal)
+ | - first digit 0, followed by 0..7, then base 8 (octal)
+ | - first digit 0, followed by x or X, then base 16 (hexadecimal)
+ |
+ $o$ | type$unsigned int$, matches octal numbers (digits 0...7 only)
+ |
+ $u$ | type$unsigned int$, matches decimal numbers (digits 0...9 only)
+ |
+ $x, X$ | type$unsigned int$, matches hexadecimal numbers (characters 0...9,
+ | a-f, A-F only). The number may be prefixed with 0x or 0X.
+ |
+ $f, F$ | matches an optionally signed floating point number
+ $e, E$ |
+ $g, G$ |
+ $a, A$ |
+ |
+ $c$ | Matches a string of one or more characters; the number of
+ | characters read is controlled by the maximum field width given for
+ | the conversion. No null character is appended.
+ | no$l$modifier: argument is of type pointer to array of$char$
+ | with$l$modifier: argument is of type pointer to array of$wchar_t$
+ |
+ $s$ | Matches a sequence of non-white-space characters. A null
+ | character is appended.
+ | no$l$modifier: argument is of type pointer to array of$char$
+ | with$l$modifier: argument is of type pointer to array of$wchar_t$
+ |
+ $ [...]$| Matches a nonempty sequence of characters from a set of expected
+ | characters enclosed in brackets [...] (scanset). If the first
+ | character is a circumflex (^), the selection is inverted, in that
+ | case the scanset contains all characters that do NOT appear in the
+ | list between [^ and ].
+ | A null character is appended.
+ | no$l$modifier: argument is of type pointer to array of$char$
+ | with$l$modifier: argument is of type pointer to array of$wchar_t$
+ |
+ $p$ | Matches a pointer value in the same implementation-defined format
+ | used by the$%p$output conversion for printf().
+ |
+ $n$ | No input is consumed. It records the number of characters read so
+ | far by this call. Argument is a pointer to$signed int$into which is
+ | written the number of characters read from the input stream so far.
+ |
+ $%$ | Matches a single %. No conversion or assignment occurs.
+
+
+
+
+II.19.6.2 Functions *crv-libSIOHIOFunc*
+-------------------
+
+Quicklink
+ $printf()$ Func |crv-printf|
+ $fprintf()$ Func |crv-fprintf|
+ $sprintf()$ Func |crv-sprintf|
+ $snprintf()$ Func |crv-snprintf|
+ $vfprintf()$ Func |crv-vfprintf|
+ $vprintf()$ Func |crv-vprintf|
+ $vsprintf()$ Func |crv-vsprintf|
+ $vsnprintf()$Func |crv-vsnprintf|
+
+ $fscanf()$ Func |crv-fscanf|
+ $scanf()$ Func |crv-scanf|
+ $sscanf()$ Func |crv-sscanf|
+ $vfscanf()$ Func |crv-vfscanf|
+ $vscanf()$ Func |crv-vscanf|
+ $vsscanf()$ Func |crv-vsscanf|
+
+
+
+printf() Function *crv-printf*
+-----------------
+Synopsis~
+ $#include <stdio.h>$
+ $int printf(const char *format, ...);$
+
+Return~
+<0: output error occurred
+>= 0: number of transmitted characters
+
+Description~
+This function prints the optional arguments under the control of the format
+string$format$to the standard output stream$stdout$.
+For format string see |crv-libSIOHIOFout|.
+
+
+
+fprintf() Function *crv-fprintf*
+------------------
+Synopsis~
+ $#include <stdio.h>$
+ $int fprintf(FILE *stream, const char *format, ...);$
+
+Return~
+<0: output error occurred
+>= 0: number of transmitted characters
+
+Description~
+This function is equivalent to$printf()$, except that the output is written
+to the stream$stream$instead of$stdout$.
+
+
+
+sprintf() Function *crv-sprintf*
+------------------
+Synopsis~
+ $#include <stdio.h>$
+ $int sprintf(char *s, const char *format, ...);$
+
+Return~
+<0: error occurred
+number of characters stored in array, not including terminating null character
+
+Description~
+This is like$printf()$, except that the output is stored in the character
+array$s$instead of written to a stream. A null character is written to mark
+the end of the string.
+
+
+
+snprintf() Function *crv-snprintf*
+-------------------
+Synopsis~
+ $#include <stdio.h>$
+ $int snprintf(char *s, size_t size, const char *format, ...);$
+
+Return~
+<0: error occurred
+The return value is the number of characters which would be generated for the
+given input, excluding the trailing null. If this value is greater or equal
+to$size$, not all characters from the result have been stored in$s$.
+
+Description~
+This function is similar to$sprintf()$, except that the$size$argument
+specifies the maximum number of characters to produce. The trailing null
+character is counted towards this limit.
+
+
+
+vprintf() Function *crv-vprintf*
+------------------
+Synopsis~
+ $#include <stdarg.h>$
+ $#include <stdio.h>$
+ $int vprintf(const char *format, va_list ap);$
+
+Return~
+<0: output error occurred
+>= 0: number of transmitted characters
+
+Description~
+This function is similar to$printf()$except that, instead of taking a variable
+number of arguments directly, it takes an argument list pointer$ap$, which
+must have been initialized by the$va_start()$macro. The$vprintf()$function
+does not invoke the$va_end()$macro.
+
+
+
+vfprintf() Function *crv-vfprintf*
+-------------------
+Synopsis~
+ $#include <stdarg.h>$
+ $#include <stdio.h>$
+ $int vfprintf(FILE *stream, const char *format, va_list ap);$
+
+Return~
+<0: output error occurred
+>= 0: number of transmitted characters
+
+Description~
+This function is similar to$fprintf()$except that, instead of taking a
+variable number of arguments directly, it takes an argument list pointer$ap$,
+which must have been initialized by the$va_start()$macro. The$vfprintf()$
+function does not invoke the$va_end()$macro.
+
+
+
+vsprintf() Function *crv-vsprintf*
+-------------------
+Synopsis~
+ $#include <stdarg.h>$
+ $#include <stdio.h>$
+ $int vsnprintf(char *s, size_t size, const char *format, va_list ap);$
+
+Return~
+<0: error occurred
+number of characters stored in array, not including terminating null character
+
+Description~
+This function is similar to$sprintf()$except that, instead of taking a
+variable number of arguments directly, it takes an argument list pointer$ap$,
+which must have been initialized by the$va_start()$macro. The$vsprintf()$
+function does not invoke the$va_end()$macro.
+
+
+
+vsnprintf() Function *crv-vsnprintf*
+--------------------
+Synopsis~
+ $#include <stdarg.h>$
+ $#include <stdio.h>$
+ $int vsnprintf(char *s, size_t size, const char *format, va_list ap);$
+
+Return~
+<0: error occurred
+The return value is the number of characters which would be generated for the
+given input, excluding the trailing null. If this value is greater or equal
+to$size$, not all characters from the result have been stored in$s$.
+
+Description~
+This function is similar to$snprintf()$except that, instead of taking a
+variable number of arguments directly, it takes an argument list pointer$ap$,
+which must have been initialized by the$va_start()$macro. The$vsnprintf()$
+function does not invoke the$va_end()$macro.
+
+
+
+scanf() Function *crv-scanf*
+----------------
+Synopsis~
+ $#include <stdio.h>$
+ $int scanf(const char *format, ...);$
+
+Return~
+The return value is the number of successful assignments. If there is a match
+error, this number can be fewer than provided. If an input error occurs
+before any matches are performed, then$EOF$is returned.
+
+Description~
+This function reads formatted input from the standard input stream$stdin$under
+the control of the format string$format$. The optional arguments are pointers
+to the places which receive the resulting values.
+For format string see |crv-libSIOHIOFin|.
+
+
+
+fscanf() Function *crv-fscanf*
+-----------------
+Synopsis~
+ $#include <stdio.h>$
+ $int fscanf(FILE *stream, const char *format, ...);$
+
+Return~
+
+Description~
+This function is equivalent to$scanf()$, except that the input is read from
+the stream$stream$instead of$stdin$.
+
+
+
+sscanf() Function *crv-sscanf*
+-----------------
+Synopsis~
+ $#include <stdio.h>$
+ $int sscanf(const char *s, const char *format, ...);$
+
+Return~
+
+Description~
+This function is similar to$scanf()$, except that the characters are taken
+from the null-terminated string$s$instead of from$stdin$. Reaching the end of
+the string is treated as an end-of-file condition.
+
+
+vscanf() Function *crv-vscanf*
+-----------------
+Synopsis~
+ $#include <stdio.h>$
+ $int vscanf(const char *format, va_list ap);$
+
+Return~
+
+Description~
+This function is similar to$scanf()$except that, instead of taking a
+variable number of arguments directly, it takes an argument list pointer$ap$,
+which must have been initialized by the$va_start()$macro. The$vscanf()$
+function does not invoke the$va_end()$macro.
+
+
+
+vfscanf() Function *crv-vfscanf*
+------------------
+Synopsis~
+ $#include <stdio.h>$
+ $int vfscanf(FILE *stream, const char *format, va_list ap);$
+
+Return~
+
+Description~
+This function is similar to$fscanf()$except that, instead of taking a
+variable number of arguments directly, it takes an argument list pointer$ap$,
+which must have been initialized by the$va_start()$macro. The$vfscanf()$
+function does not invoke the$va_end()$macro.
+
+
+
+vsscanf() Function *crv-vsscanf*
+------------------
+Synopsis~
+ $#include <stdio.h>$
+ $int vsscanf(const char *s, const char *format, va_list ap);$
+
+Return~
+
+Description~
+This function is similar to$sscanf()$except that, instead of taking a
+variable number of arguments directly, it takes an argument list pointer$ap$,
+which must have been initialized by the$va_start()$macro. The$vsscanf()$
+function does not invoke the$va_end()$macro.
+
+
+
+
+
+------------------------------------------------------------------------------
+II.19.7 Character Input/Output *crv-libSIOHCIO*
+
+This section describes functions for performing character-oriented input and
+output.
+
+Quicklink:
+ $fgetc()$ Func |crv-fgetc|
+ $fgets()$ Func |crv-fgets|
+ $fputc()$ Func |crv-fputc|
+ $fputs()$ Func |crv-fputs|
+ $getc()$ Macro |crv-getc|
+ $getchar()$ Func |crv-getchar|
+ $gets()$ Func |crv-gets|
+ $putc()$ Macro |crv-putc|
+ $putchar()$ Func |crv-putchar|
+ $puts()$ Func |crv-puts|
+ $ungetc()$ Func |crv-ungetc|
+
+
+
+fgetc() Function *crv-fgetc*
+----------------
+Synopsis~
+ $#include <stdio.h>$
+ $int fgetc(FILE *stream);$
+
+Return~
+character read from stream
+error or end-of-file:$EOF$
+
+Description~
+This function reads the next character as an$unsigned char$from the stream
+$stream$and returns its value, converted to an$int$. If an end-of-file
+condition or read error occurs,$EOF$is returned instead.
+
+
+
+fgets() Function *crv-fgets*
+----------------
+Synopsis~
+ $#include <stdio.h>$
+ $char *fgets(char *s, int count, FILE *stream);$
+
+Return~
+If the system is already at end of file when fgets() is called, then the
+contents of the array$s$are unchanged and a null pointer is returned.
+A null pointer is also returned if a read error occurs. Otherwise, the
+return value is the pointer$s$.
+
+Description~
+This function reads characters from the stream$stream$up to and including a
+newline character and stores them in the string$s$, adding a null character
+to mark the end of the string.$count$characters must be supplied worth of
+space in$s$, but the number of characters read is at most$count$- 1.
+The extra character space is used to hold the null character at the end of
+the string.
+
+
+
+getc() Macro *crv-getc*
+------------
+Synopsis~
+ $#include <stdio.h>$
+ $int getc(FILE *stream);$
+
+Return~
+character read from stream
+error or end-of-file:$EOF$
+
+Description~
+This is just like$fgetc()$, except that it is permissible (and typical) for
+it to be implemented as a macro that evaluates the stream argument more
+than once.$getc()$is often highly optimized, so it is usually the best
+function to use to read a single character.
+
+
+
+getchar() Function *crv-getchar*
+------------------
+Synopsis~
+ $#include <stdio.h>$
+ $int getchar(void);$
+
+Return~
+character read from stream
+error or end-of-file:$EOF$
+
+Description~
+This function is equivalent to$getc()$with$stdin$as the value of the stream
+argument.
+
+
+
+gets() Function *crv-gets*
+---------------
+Synopsis~
+ $#include <stdio.h>$
+ $char *gets(char *s);$
+
+Return~
+If$gets()$encounters a read error or end-of-file, it returns a null pointer;
+otherwise it returns$s$.
+
+Description~
+This function reads characters from the stream$stdin$up to the next newline
+character, and stores them in the string$s$. The newline character is
+discarded (note that this differs from the behavior of$fgets()$, which copies
+the newline character into the string).
+
+
+
+ungetc() Function *crv-ungetc*
+-----------------
+Synopsis~
+ $#include <stdio.h>$
+ $int ungetc(int c, FILE *stream);$
+
+Return~
+$c$pushed back after conversion or$EOF$if the operation fails
+
+Description~
+This function pushes back the character$c$onto the input stream$stream$. So
+the next input from$stream$will read$c$before anything else.
+
+If$c$is$EOF$,$ungetc()$does nothing and just returns$EOF$. This allows to
+call$ungetc()$with the return value of$getc()$without needing to check for an
+error from$getc()$.
+
+The character that is pushed back doesn't have to be the same as the last
+character that was actually read from the stream. In fact, it isn't necessary
+to actually read any characters from the stream before unreading them with
+$ungetc()$. But that is a strange way to write a program; usually$ungetc()$
+is used only to unread a character that was just read from the same stream.
+
+Pushing back characters doesn't alter the file; only the internal buffering
+for the stream is affected. If a file positioning function (such as$fseek()$,
+$fseeko()$ or$rewind()$) is called, any pending pushed-back characters are
+discarded.
+
+Unreading a character on a stream that is at end of file clears the
+end-of-file indicator for the stream, because it makes the character of
+input available. After reading that character, trying to read again will
+encounter end of file.
+
+
+
+fputc() Function *crv-fputc*
+----------------
+Synopsis~
+ $#include <stdio.h>$
+ $int fputc(int c, FILE *stream);$
+
+Return~
+$EOF$is returned if a write error occurs; otherwise the character$c$is
+returned
+
+Description~
+This function converts the character$c$to type$unsigned char$, and writes it
+to the stream$stream$.
+
+
+
+fputs() Function *crv-fputs*
+----------------
+Synopsis~
+ $#include <stdio.h>$
+ $int fputs(const char *s, FILE *stream);$
+
+Return~
+This function returns$EOF$if a write error occurs, and otherwise a
+non-negative value.
+
+Description~
+This function writes the string$s$to the stream$stream$. The terminating
+null character is not written. This function does not add a newline character,
+either. It outputs only the characters in the string.
+
+
+
+putc() Macro *crv-putc*
+------------
+Synopsis~
+ $#include <stdio.h>$
+ $int putc(int c, FILE *stream);$
+
+Return~
+This function returns$EOF$if a write error occurs, and otherwise the
+character written.
+
+Description~
+This is just like$fputc()$, except that most systems implement it as a
+macro, making it faster. One consequence is that it may evaluate the stream
+argument more than once, which is an exception to the general rule for
+macros.$putc()$is usually the best function to use for writing a single
+character.
+
+
+
+putchar() Function *crv-putchar*
+------------------
+Synopsis~
+ $#include <stdio.h>$
+ $int putchar(int c);$
+
+Return~
+This function returns$EOF$if a write error occurs, and otherwise the
+character written.
+
+Description~
+This function is equivalent to$putc()$with$stdout$as the value of the stream
+argument.
+
+
+
+puts() Function *crv-puts*
+---------------
+Synopsis~
+ $#include <stdio.h>$
+ $int puts(const char *s);$
+
+Return~
+This function returns$EOF$if a write error occurs, and otherwise a
+non-negative value.
+
+Description~
+This function writes the string$s$to the stream$stdout$followed by a newline.
+The terminating null character of the string is not written. (Note that
+$fputs()$does not write a newline as this function does.)
+
+$puts()$is the most convenient function for printing simple messages.
+
+
+
+------------------------------------------------------------------------------
+II.19.8 Direct Input/Output *crv-libSIOHDIO*
+
+This section describes how to do input and output operations on blocks of
+data. This functions can be used to read and write binary data, as well as to
+read and write text in fixed-size blocks instead of by characters or lines.
+
+Binary files are typically used to read and write blocks of data in the same
+format as is used to represent the data in a running program. In other words,
+arbitrary blocks of memory--not just character or string objects--can be
+written to a binary file, and meaningfully read in again by the same program.
+
+Storing data in binary form is often considerably more efficient than using
+the formatted I/O functions. Also, for floating-point numbers, the binary form
+avoids possible loss of precision in the conversion process. On the other
+hand, binary files can't be examined or modified easily using many standard
+file utilities (such as text editors), and are not portable between
+different implementations of the language, or different kinds of computers.
+
+
+fread() Function *crv-fread*
+----------------
+Synopsis~
+ $#include <stdio.h>$
+ $size_t fread(void *data, size_t size, size_t count, FILE *stream);$
+
+Return~
+It returns the number of objects actually read, which might be less than
+$count$if a read error occurs or the end of the file is reached. This
+function returns a value of zero (and doesn't read anything) if
+either$size$or$count$is zero.
+If$fread()$encounters end of file in the middle of an object, it returns
+the number of complete objects read, and discards the partial object.
+Therefore, the stream remains at the actual end of the file.
+
+Description~
+This function reads up to$count$objects of size$size$into the array$data$,
+from the stream$stream$.
+
+
+fwrite() Function *crv-fwrite*
+-----------------
+Synopsis~
+ $#include <stdio.h>$
+ $size_t fwrite(const void *data, size_t size, size_t count, FILE *stream);$
+
+Return~
+The return value is normally$count$, if the call succeeds.
+Any other value indicates some sort of error, such as running out of space.
+
+Description~
+This function writes up to count objects of size$size$from the array$data$,
+to the stream$stream$.
+
+
+
+
+------------------------------------------------------------------------------
+II.19.9 File Positioning *crv-libSIOHFPos*
+
+The file position of a stream describes where in the file the stream is
+currently reading or writing. I/O on the stream advances the file position
+through the file.
+
+Quicklink:
+ $fgetpos()$ Func |crv-fgetpos|
+ $fseek()$ Func |crv-fseek|
+ $fsetpos()$ Func |crv-fsetpos|
+ $ftell()$ Func |crv-ftell|
+ $rewind()$ Func |crv-rewind|
+
+
+
+fgetpos() Function *crv-fgetpos*
+------------------
+Synopsis~
+ $#include <stdio.h>$
+ $int fgetpos(FILE *stream, fpos_t *position);$
+
+Return~
+If successful,$fgetpos()$ returns zero; otherwise it returns a nonzero value
+and stores an implementation-defined positive value in$errno$.
+
+Description~
+This function stores the value of the file position indicator for the stream
+$stream$in the$fpos_t$object pointed to by$position$.
+
+
+
+fseek() Function *crv-fseek*
+----------------
+Synopsis~
+ $#include <stdio.h>$
+ $int fseek(FILE *stream, long int offset, int whence);$
+
+Return~
+0 if successful,
+else failed
+
+Description~
+This function is used to change the file position of the stream$stream$. The
+value of$whence$must be one of the constants$SEEK_SET$,$SEEK_CUR$, or
+$SEEK_END$, to indicate whether the offset is relative to the beginning of the
+file, the current file position, or the end of the file, respectively.
+
+
+
+fsetpos() Function *crv-fsetpos*
+------------------
+Synopsis~
+ $#include <stdio.h>$
+ $int fsetpos(FILE *stream, const fpos_t *position);$
+
+Return~
+If successful,$fsetpos()$clears the end-of-file indicator on the stream,
+discards any characters that were "pushed back" by the use of$ungetc()$, and
+returns a value of zero.
+Otherwise, it returns a nonzero value and stores an implementation-defined
+positive value in$errno$.
+
+Description~
+This function sets the file position indicator for the stream$stream$to the
+position$position$, which must have been set by a previous call to$fgetpos()$
+on the same stream.
+
+
+
+ftell() Function *crv-ftell*
+----------------
+Synopsis~
+ $#include <stdio.h>$
+ $long int ftell(FILE *stream);$
+
+Return~
+This function can fail if the stream doesn't support file positioning, or if
+the file position can't be represented in a$long int$, and possibly for other
+reasons as well. If a failure occurs, a value of -1L is returned and an
+implementation-defined positive value is stored in$errno$.
+
+Description~
+This function returns the current file position of the stream$stream$.
+
+
+
+rewind() Function *crv-rewind*
+-----------------
+Synopsis~
+ $#include <stdio.h>$
+ $void rewind(FILE *stream);$
+
+Return~
+none
+
+Description~
+This function positions the stream$stream$at the beginning of the file. It is
+equivalent to calling$fseek()$on the stream with an offset argument of 0L and a
+whence argument of$SEEK_SET$, except that the return value is discarded and the
+error indicator for the stream is reset.
+
+
+
+
+------------------------------------------------------------------------------
+II.19.10 Error Handling *crv-libSIOHErr*
+
+Quicklink:
+ $clearerr()$ Func |crv-libclearerr|
+ $feof()$ Func |crv-libfeof|
+ $ferror()$ Func |crv-libferror|
+ $perror()$ Func |crv-libperror|
+
+
+
+clearerr() Function *crv-clearerr*
+-------------------
+Synopsis~
+ $#include <stdio.h>$
+ $void clearerr(FILE *stream);$
+
+Return~
+none
+
+Description~
+This function clears the end-of-file and error indicators for the stream
+$stream$.
+The file positioning functions also clear the end-of-file indicator for the
+stream.
+
+
+
+feof() Function *crv-feof*
+---------------
+Synopsis~
+ $#include <stdio.h>$
+ $int feof(FILE *stream);$
+
+Return~
+0: no EOF
+else: EOF
+
+Description~
+This function returns nonzero if and only if the end-of-file indicator for the
+stream$stream$ is set.
+
+
+
+ferror() Function *crv-ferror*
+-----------------
+Synopsis~
+ $#include <stdio.h>$
+ $int ferror(FILE *stream);$
+
+Return~
+0: no error
+else: error indicator is set
+
+Description~
+This function returns nonzero if and only if the error indicator for the
+stream $stream$is set, indicating that an error has occurred on a previous
+operation on the stream.
+
+
+
+perror() Function *crv-perror*
+-----------------
+Synopsis~
+ $#include <stdio.h>$
+ $void perror(const char *msg);$
+
+Return~
+none
+
+Description~
+This function prints an error message to the stream$stderr$. The orientation
+of$stderr$is not changed.
+
+If$perror()$is called with a message that is either a null pointer or an empty
+string,$perror()$just prints the error message corresponding to$errno$, adding
+a trailing newline.
+
+If it's called with a non-null message argument, then$perror()$prefixes its
+output with this string. It adds a colon and a space character to separate the
+message from the error string corresponding to$errno$.
+
+
+
+
+==============================================================================
+II.20 <stdlib.h> Utilities *crv-libStdlibH*
+
+This header file declares types, macros and functions of general utility.
+
+
+
+------------------------------------------------------------------------------
+II.20.1 Types *crv-libSLHType*
+
+Quicklink:
+ $dif_t$ Type |crv-libdif_t|
+ $ldif_t$ Type |crv-libldif_t|
+ $lldif_t$ Type |crv-liblldif_t|
+ $size_t$ Type |crv-libsize_t2|
+ $wchar_t$ Type |crv-libwchar_t2|
+
+
+
+dif_t Type *crv-dif_t*
+----------
+This is a structure type used to hold the result returned by the$div()$
+function. It has the following members:
+ $int quot$: The quotient from the division.
+ $int rem$ : The remainder from the division.
+
+
+ldif_t Type *crv-ldif_t*
+-----------
+This is a structure type used to hold the result returned by the$ldiv()$
+function. It has the following members:
+ $long int quot$: The quotient from the division.
+ $long int rem$ : The remainder from the division.
+
+
+lldif_t Type *crv-lldif_t*
+------------
+This is a structure type used to hold the result returned by the$ldiv()$
+function. It has the following members:
+ $long long int quot$: The quotient from the division.
+ $long long int rem$ : The remainder from the division.
+
+
+size_t Type *crv-size_t2*
+-----------
+This is an unsigned integer type used to represent the sizes of objects.
+Also declared in$<stddef.h>$, see |crv-libsize_t|.
+Also declared in$<string.h>$, see |crv-libsize_t3|.
+Also declared in$<time.h>$, see |crv-libsize_t4|.
+Also declared in$<stdio.h>$, see |crv-libsize_t5|.
+Also declared in$<wchar.h>$, see |crv-libsize_t6|.
+
+
+wchar_t Type *crv-wchar_t2*
+------------
+This data type is used as the base type for wide character strings.
+It's range of values can represent distinct codes for all members of the
+largest extended character set specified among the supported locales.
+Also declared in$<stddef.h>$, see |crv-libwchar_t|.
+Also declared in$<wchar.h>$, see |crv-libwchar_t3|.
+
+
+
+
+------------------------------------------------------------------------------
+II.20.2 Macros *crv-libSLHMac*
+
+Quicklink:
+ $EXIT_SUCCESS$ Macro |crv-libEXIT_SUCCESS|
+ $EXIT_FAILURE$ Macro |crv-libEXIT_FAILURE|
+ $MB_CUR_MAX$ Macro |crv-libMB_CUR_MAX|
+ $NULL$ Macro |crv-libNULL2|
+ $RAND_MAX$ Macro |crv-libRAND_MAX|
+
+
+
+RAND_MAX Macro *crv-RAND_MAX*
+--------------
+The value of this macro is an integer constant representing the largest value
+the rand function can return. Its value is implementation-defined, but at
+least 32767.
+
+
+
+EXIT_SUCCESS Macro *crv-EXIT_SUCCESS*
+------------------
+This macro can be used with the$exit()$function to indicate successful program
+completion.
+
+
+
+EXIT_FAILURE Macro *crv-EXIT_FAILURE*
+------------------
+This macro can be used with the$exit()$function to indicate unsuccessful
+program completion in a general sense.
+
+
+
+NULL Macro *crv-NULL2*
+----------
+Expands to an implementation-defined null pointer constant.
+Also defined in$<stddef.h>$, see |crv-NULL|.
+Also defined in$<string.h>$, see |crv-NULL3|.
+Also defined in$<time.h>$, see |crv-NULL4|.
+Also defined in$<stdio.h>$, see |crv-NULL5|.
+Also defined in$<wchar.h>$, see |crv-NULL6|.
+
+
+
+MB_CUR_MAX Macro *crv-MB_CUR_MAX*
+----------------
+This macro expands into a positive integer expression that is the maximum
+number of bytes in a multibyte character in the current locale. The value
+is never greater than$MB_LEN_MAX$.
+
+
+
+
+------------------------------------------------------------------------------
+II.20.3 Numeric Conversion *crv-libSLHnum*
+
+Quicklink:
+ $atof()$ Func |crv-atof|
+ $atoi()$ Func |crv-atoi|
+ $atol()$ Func |crv-atol|
+ $atoll()$ Func |crv-atoll|
+ $strtod()$ Func |crv-strtod|
+ $strtof()$ Func |crv-strtof|
+ $strtol()$ Func |crv-strtol|
+ $strtold()$ Func |crv-strtold|
+ $strtoll()$ Func |crv-strtoll|
+ $stroul()$ Func |crv-stroul|
+ $strtoull()$Func |crv-strtoull|
+
+
+
+atof() Function *crv-atof*
+---------------
+Synopsis~
+ $#include <stdlib.h>$
+ $double atof(const char *string);$
+
+Return~
+result of conversion
+
+Description~
+This function converts the initial portion of the string$string$to a$double$
+representation. This function is similar to the$strtod()$function, except that
+it need not detect overflow and underflow errors.
+The atof function is provided mostly for compatibility with existing code;
+using$strtod()$is more robust.
+
+
+
+atol() Function *crv-atol*
+---------------
+Synopsis~
+ $#include <stdlib.h>$
+ $long int atol(const char *string);$
+
+Return~
+result of conversion
+
+Description~
+This function converts the string$string$to an$long int$value.
+This function is similar to the$strtol()$function with a base argument of 10,
+except that it need not detect overflow errors. The$atol()$function is
+provided mostly for compatibility with existing code; using$strtol()$is more
+robust.
+
+
+
+atoi() Function *crv-atoi*
+---------------
+Synopsis~
+ $#include <stdlib.h>$
+ $int atoi(const char *string);$
+
+Return~
+result of conversion
+
+Description~
+This function converts the string$string$to an$int$value.
+The$atoi()$function is considered obsolete; use$strtol()$instead.
+
+
+
+atoll() Function *crv-atoll*
+----------------
+Synopsis~
+ $#include <stdlib.h>$
+ $long long int atoll(const char *string);$
+
+Return~
+result of conversion
+
+Description~
+This function converts the string$string$to an$long long int$value.
+The$atoll()$function was introduced in ISO C99. It is obsolete (despite having
+just been added); use$strtoll()$instead.
+
+
+
+
+strtol() Function *crv-strtol*
+-----------------
+Synopsis~
+ $#include <stdlib.h>$
+ $long int strtol(const char *restrict string, char **restrict tailptr,$
+ $int base);$
+
+Return~
+no error: value of conversion
+no conversion: 0 is returned
+out of range: result is$LONG_MAX$or$LONG_MIN$(according to sign),
+ $ errno$is set to$ERANGE$
+
+Description~
+The$strtol()$("string-to-long") function converts the initial part of string to
+a signed integer, which is returned as a value of type$long int$.
+
+This function attempts to decompose$string$as follows:
+
+ - A (possibly empty) sequence of whitespace characters. Which characters are
+ whitespace is determined by the$isspace()$function. These are discarded.
+ - An optional plus or minus sign (+ or -).
+ - A nonempty sequence of digits in the radix specified by$base$.
+ If$base$is zero, decimal radix is assumed unless the series of digits
+ begins with 0 (specifying octal radix), or 0x or 0X (specifying
+ hexadecimal radix); in other words, the same syntax used for integer
+ constants in C.
+ Otherwise$base$must have a value between 2 and 36. If$base$is 16, the
+ digits may optionally be preceded by 0x or 0X. If$base$has no legal value
+ the value returned is 0l and the global variable$errno$is set to$EINVAL$.
+ - Any remaining characters in the string. If$tailptr$is not a null pointer,
+ $strtol()$stores a pointer to this tail in$*tailptr$.
+
+If the string is empty, contains only whitespace, or does not contain an
+initial substring that has the expected syntax for an integer in the specified
+$base$, no conversion is performed. In this case,$strtol()$returns a value of
+zero and the value stored in$*tailptr$is the value of$string$.
+
+In a locale other than the standard "C" locale, this function may recognize
+additional implementation-dependent syntax.
+
+Checking for errors by examining the return value of$strtol()$should not be
+done, because the string might be a valid representation of 0l,$LONG_MAX$,
+or$LONG_MIN$. Instead, check whether$tailptr$points to what is expected after
+the number (e.g. '\0' if the string should end after the number). $errno$needs
+also to be cleared before the call and checked afterwards, in case there was
+overflow.
+
+
+
+strtoll() Function *crv-strtoll*
+------------------
+Synopsis~
+ $#include <stdlib.h>$
+ $long long int strtoll(const char *restrict string, char **restrict tailptr,$
+ $int base);$
+
+Return~
+no error: value of conversion
+no conversion: 0 is returned
+out of range: result is$LONG_LONG_MAX$or$LONG_LONG_MIN$(according to sign),
+ $errno$is set to$ERANGE$
+
+Description~
+This function is like$strtol()$except that it returns a$long long int$value,
+and accepts numbers with a correspondingly larger range.
+
+
+
+stroul() Function *crv-stroul*
+-----------------
+Synopsis~
+ $#include <stdlib.h>$
+ $unsigned long int strtoul(const char *retrict string,$
+ $char **restrict tailptr, int base);$
+
+Return~
+no error: value of conversion
+no conversion: 0 is returned
+out of range: result is$ULONG_MAX$,$errno$is set to$ERANGE$
+
+Description~
+The$strtoul()$("string-to-unsigned-long") function is like$strtol()$except it
+converts to an$unsigned long int$value. The syntax is the same as described
+for$strtol$.
+
+
+
+strtoull() Function *crv-strtoull*
+-------------------
+Synopsis~
+ $#include <stdlib.h>$
+ $unsigned long long int strtoull(const char *restrict string,$
+ $char **restrict tailptr, int base);$
+
+Return~
+no error: value of conversion
+no conversion: 0 is returned
+out of range: result is$ULONG_LONG_MAX$,$errno$is set to$ERANGE$
+
+Description~
+This function is like$strtol()$except that it returns an
+$unsigned long long int$value, and accepts numbers with a correspondingly
+larger range.
+
+
+
+
+strtod() Function *crv-strtod*
+-----------------
+Synopsis~
+ $#include <stdlib.h>$
+ $double strtod(const char *restrict string, char **restrict tailptr);$
+
+Return~
+no error: value of conversion
+no conversion: 0 is returned
+out of range: result is $-HUGE_VAL$or$+HUGH_VAL$(according to sign),
+ $errno$is set to$ERANGE$
+
+Description~
+The$strtod()$("string-to-double") function converts the initial part of string
+to a floating-point number, which is returned as a value of type$double$.
+
+This function attempts to decompose$string$as follows:
+
+ - A (possibly empty) sequence of whitespace characters. Which characters are
+ whitespace is determined by the$isspace()$function. These are discarded.
+ - An optional plus or minus sign (+ or -).
+ - A floating point number in decimal or hexadecimal format. The decimal
+ format is:
+ o A nonempty sequence of digits optionally containing a decimal-point
+ character - normally, but it depends on the locale.
+ o An optional exponent part, consisting of a character e or E, an
+ optional sign, and a sequence of digits.
+
+ The hexadecimal format is as follows:
+ o A 0x or 0X followed by a nonempty sequence of hexadecimal digits
+ optionally containing a decimal-point character - normally, but it
+ depends on the locale.
+ o An optional binary-exponent part, consisting of a character p or P,
+ an optional sign, and a sequence of digits.
+
+ - Any remaining characters in the string. If$tailptr$is not a null pointer,
+ a pointer to this tail of the string is stored in$*tailptr$.
+
+If the string is empty, contains only whitespace, or does not contain an
+initial substring that has the expected syntax for a floating-point number, no
+conversion is performed. In this case,$strtod()$returns a value of zero
+and the value returned in$*tailptr$is the value of$string$.
+
+In a locale other than the standard "C", this function may recognize
+additional locale-dependent syntax.
+
+If the string has valid syntax for a floating-point number but the value
+is outside the range of a$double$,$strtod()$will signal overflow or
+underflow as described in II.12.1 Error Conditions (|crv-libMHErr|).
+
+$strtod()$recognizes four special input strings. The strings "inf"
+and "infinity" are converted to &infin;, or to the largest representable
+value if the floating-point format doesn't support infinities. You can
+prepend a "+" or "-" to specify the sign. Case is ignored when scanning
+these strings.
+
+The strings "nan" and "nan(chars...)" are converted to NaN. Again, case is
+ignored. If chars... are provided, they are used in some unspecified fashion
+to select a particular representation of NaN (there can be several).
+
+Since zero is a valid result as well as the value returned on error, you
+should check for errors in the same way as for$strtol()$, by examining
+$errno$and$tailptr$.
+
+
+
+strtof() Function *crv-strtof*
+-----------------
+Synopsis~
+ $#include <stdlib.h>$
+ $float strtof(const char *string, char **tailptr);$
+
+Return~
+no error: value of conversion
+no conversion: 0 is returned
+out of range: result is $-HUGE_VALF$or$+HUGH_VALF$(according to sign),
+ $errno$is set to$ERANGE$
+
+Description~
+This function is analogous to$strtod()$, but return$float$values respectively;
+it reports errors in the same way.
+
+
+
+strtold() Function *crv-strtold*
+------------------
+Synopsis~
+ $#include <stdlib.h>$
+ $long double strtold(const char *string, char **tailptr);$
+
+Return~
+no error: value of conversion
+no conversion: 0 is returned
+out of range: result is $-HUGE_VALL$or$+HUGH_VALL$(according to sign),
+ $errno$is set to$ERANGE$
+
+Description~
+This function is analogous to$strtod()$, but return$long double$values
+respectively; it reports errors in the same way.
+
+
+
+
+------------------------------------------------------------------------------
+II.20.4 Pseudo-Random *crv-libSLHrand*
+
+This section describes the random number functions.
+
+Quicklink:
+ $rand()$ Func |crv-rand|
+ $srand()$ Func |crv-srand|
+
+
+
+rand() Function *crv-rand*
+---------------
+Synopsis~
+ $#include <stdlib.h>$
+ $int rand(void);$
+
+Return~
+pseudo-random number
+
+Description~
+This function returns the next pseudo-random number in the series. The value
+ranges from 0 to$RAND_MAX$.
+
+
+
+srand() Function *crv-srand*
+----------------
+Synopsis~
+ $#include <stdlib.h>$
+ $void srand(unsigned int seed);$
+
+Return~
+none
+
+Description~
+This function establishes$seed$as the seed for a new series of pseudo-random
+numbers.
+If$rand()$is called before a seed has been established with$srand()$, it uses
+the value 1 as a default seed.
+
+To produce a different pseudo-random series each time program starts, do
+$srand (time (0))$.
+
+
+
+
+------------------------------------------------------------------------------
+II.20.5 Memory Management *crv-libSLHmem*
+
+Quicklink:
+ $calloc()$ Func |crv-calloc|
+ $free()$ Func |crv-free|
+ $malloc()$ Func |crv-malloc|
+ $realloc()$Func |crv-realloc|
+
+
+calloc() Function *crv-calloc*
+-----------------
+Synopsis~
+ $#include <stdlib.h>$
+ $void *calloc(size_t count, size_t eltsize);$
+
+Return~
+pointer to allocated space or null pointer, if failed
+
+Description~
+This function allocates a block long enough to contain a vector of$count$
+elements, each of size$eltsize$. Its contents are cleared to zero before
+$calloc()$returns.
+
+
+
+free() Function *crv-free*
+----------------
+Synopsis~
+ $#include <stdlib.h>$
+ $void free(void *ptr);$
+
+Return~
+none
+
+Description~
+This function deallocates the block of memory pointed at by$ptr$that was
+allocated by$calloc()$,$malloc()$or$realloc()$.
+It is allowed for$ptr$to be a null pointer.
+
+
+
+malloc() Function *crv-malloc*
+-----------------
+Synopsis~
+ $#include <stdlib.h>$
+ $void *malloc(size_t size);$
+
+Return~
+pointer to allocated space or null pointer, if failed
+
+Description~
+This function returns a pointer to a newly allocated block$size$bytes long.
+The contents of the block is undefined.
+
+
+
+realloc() Function *crv-realloc*
+------------------
+Synopsis~
+ $#include <stdlib.h>$
+ $void *realloc(void *ptr, size_t newsize);$
+
+Return~
+pointer to new block or null pointer, if failed
+
+Description~
+This function changes the size of the block whose address is$ptr$to be
+$newsize$.
+Since the space after the end of the block may be in use,$realloc()$may find
+it necessary to copy the block to a new address where more free space is
+available. If the block needs to be moved,$realloc()$copies the old contents.
+
+If a null pointer is passed for$ptr$,$realloc()$behaves just like
+$malloc(newsize)$.
+If memory for the new block cannot be allocated the old block is not
+deallocated and its value is unchanged.
+
+
+
+
+------------------------------------------------------------------------------
+II.20.6 Communication *crv-libSLHcom*
+
+Quicklink:
+ $_Exit()$ Func |crv-_Exit|
+ $abort()$ Func |crv-abort|
+ $atexit()$ Func |crv-atexit|
+ $exit()$ Func |crv-exit|
+ $getenv()$ Func |crv-getenv|
+ $system()$ Func |crv-system|
+
+
+
+abort() Function *crv-abort*
+----------------
+Synopsis~
+ $#include <stdlib.h>$
+ $void abort(void);$
+
+Return~
+this function does not return to its caller
+
+Description~
+This function causes abnormal program termination. This does not execute
+cleanup functions registered with$atexit()$. This function actually terminates
+the process by raising a SIGABRT signal.
+
+
+
+atexit() Function *crv-atexit*
+-----------------
+Synopsis~
+ $#include <stdlib.h>$
+ $int atexit(void (*function) (void));$
+
+Return~
+0: successful
+else: failed to register function
+
+Description~
+This function registers the function$function$to be called at normal program
+termination. The$function$is called with no arguments.
+
+
+
+exit() Function *crv-exit*
+---------------
+Synopsis~
+ $#include <stdlib.h>$
+ $void exit(int status);$
+
+Return~
+this function does not return to its caller
+
+Description~
+This function tells the system that the program is done, which causes it to
+terminate the process. The value of$status$is returned to the environment.
+
+Normal termination causes the following actions:
+ - Functions that were registered with the$atexit()$function are called in
+ the reverse order of their registration. This mechanism allows the
+ application to specify its own "cleanup" actions to be performed at
+ program termination.
+ - All open streams are closed, writing out any buffered output data.
+ In addition, temporary files opened with the$tmpfile()$function are
+ removed.
+ - Control is returned to the host environment. If$status$is zero or
+ $EXIT_SUCCESS$, then this signifies a successful termination. If$status$
+ is$EXIT_FAILURE$, then this signifies an unsuccessful termination.
+ Other values are implementation-defined.
+
+
+
+_Exit() Function *crv-_Exit*
+----------------
+Synopsis~
+ $#include <stdlib.h>$
+ $void _Exit(int status);$
+
+Return~
+this function does not return to its caller
+
+Description~
+This function is the primitive for causing a process to terminate with status
+$status$. Calling this function does not execute cleanup functions registered
+with$atexit()$.
+
+Termination causes the following actions:
+ - All open streams are closed, writing out any buffered output data.
+ In addition, temporary files opened with the$tmpfile()$function are
+ removed.
+ - Control is returned to the host environment. If$status$is zero or
+ $EXIT_SUCCESS$, then this signifies a successful termination. If$status$
+ is$EXIT_FAILURE$, then this signifies an unsuccessful termination.
+ Other values are implementation-defined.
+
+
+
+getenv() Function *crv-getenv*
+------------------
+Synopsis~
+ $#include <stdlib.h>$
+ $char * getenv(const char *name);$
+
+Return~
+null pointer: environment variable not found
+else: pointer to string representing the value of the environment
+ variable
+Description~
+This function returns a string that is the value of the environment variable
+$name$. This string must not be modified.
+
+
+
+system() Function *crv-system*
+-----------------
+Synopsis~
+ $#include <stdlib.h>$
+ $int system(const char *command);$
+
+Return~
+If the$command$argument is a null pointer, a return value of zero indicates
+that no command processor is available.
+If the$command$argument is not a null pointer and the$system()$function does
+return, it returns an implementation-defined value.
+
+Description~
+This function executes$command$as a shell command (shell = command processor).
+If$command$is a null pointer, the$system()$function determines whether the
+host environment has a command processor.
+
+
+
+
+------------------------------------------------------------------------------
+II.20.7 Searching and Sorting *crv-libSLHsearch*
+
+Quicklink:
+ $bsearch()$ Func |crv-bsearch|
+ $qsort()$ Func |crv-qsort|
+
+
+bsearch() Function *crv-bsearch*
+------------------
+Synopsis~
+ $#include <stdlib.h>$
+ $void *bsearch(const void *key, const void *array, size_t count,$
+ $size_t size, int (* compare)(const void *, const void *));$
+
+Return~
+The return value is a pointer to the matching array element, or a null pointer
+if no match is found. If the array contains more than one element that
+matches, the one that is returned is unspecified.
+
+Description~
+This function ("binary-search") searches the sorted array$array$for an object
+that is equivalent to$key$. The array contains$count$elements, each of which
+is of size$size$bytes.
+
+The$compare$function is used to perform the comparison. This function is
+called with two pointer arguments and should return an integer less than,
+equal to, or greater than zero corresponding to whether its first argument
+is considered less than, equal to, or greater than its second argument. The
+elements of the$array$must already be sorted in ascending order according to
+this comparison function.
+
+
+
+qsort() Function *crv-qsort*
+----------------
+Synopsis~
+ $#include <stdlib.h>$
+ $void qsort(void *array, size_t count, size_t size,$
+ $int (* compare)(const void *, const void *));$
+
+Return~
+none
+
+Description~
+This function sorts the array$array$. The array contains$count$elements, each
+of which is of size$size$.
+
+The$compare$function is used to perform the comparison on the array elements.
+This function is called with two pointer arguments and should return an
+integer less than, equal to, or greater than zero corresponding to whether its
+first argument is considered less than, equal to, or greater than its second
+argument.
+
+If two objects compare as equal, their order after sorting is unpredictable.
+That is to say, the sorting is not stable. This can make a difference when
+the comparison considers only part of the elements. Two elements with the
+same sort key may differ in other respects.
+
+
+
+
+------------------------------------------------------------------------------
+II.20.8 Integer Arithmetic *crv-libSLHintarith*
+
+Quicklink:
+ $abs()$ Func |crv-abs|
+ $labs()$ Func |crv-labs|
+ $llabs()$ Func |crv-llabs|
+ $div()$ Func |crv-div|
+ $ldiv()$ Func |crv-ldiv|
+ $lldiv()$ Func |crv-lldiv|
+
+
+
+abs() Function *crv-abs*
+--------------
+Synopsis~
+ $#include <stdlib.h>$
+ $int abs(int number);$
+
+Return~
+absolute value
+
+Description~
+Evaluates the absolute value of$number$.
+
+
+
+labs() Function *crv-labs*
+---------------
+Synopsis~
+ $#include <stdlib.h>$
+ $long int labs(long int number);$
+
+Return~
+absolute value
+
+Description~
+Evaluates the absolute value of$number$.
+
+
+
+llabs() Function *crv-llabs*
+----------------
+Synopsis~
+ $#include <stdlib.h>$
+ $long long int labs(long long int number);$
+
+Return~
+absolute value
+
+Description~
+Evaluates the absolute value of$number$.
+
+
+
+div() Function *crv-div*
+--------------
+Synopsis~
+ $#include <stdlib.h>$
+ $div_t div(int numerator, int denominator);$
+
+Return~
+return the result in a structure of type$div_t$
+If the result cannot be represented (as in a division by zero), the
+behavior is undefined.
+
+Description~
+This function computes the quotient and remainder from the division of
+$numerator$by$denominator$.
+
+
+
+ldiv() Function *crv-ldiv*
+---------------
+Synopsis~
+ $#include <stdlib.h>$
+ $ldiv_t ldiv(long int numerator, long int denominator);$
+
+Return~
+return the result in a structure of type$ldiv_t$
+If the result cannot be represented (as in a division by zero), the
+behavior is undefined.
+
+Description~
+This function computes the quotient and remainder from the division of
+$numerator$by$denominator$.
+
+
+
+lldiv() Function *crv-lldiv*
+----------------
+Synopsis~
+ $#include <stdlib.h>$
+ $lldiv_t lldiv(long long int numerator, long long int denominator);$
+
+Return~
+return the result in a structure of type$lldiv_t$
+If the result cannot be represented (as in a division by zero), the
+behavior is undefined.
+
+Description~
+This function computes the quotient and remainder from the division of
+$numerator$by$denominator$.
+
+
+
+
+------------------------------------------------------------------------------
+II.20.9 Multibyte/Wide Character *crv-libSLHmulchar*
+
+Quicklink:
+ $mblen()$ Func |crv-mblen|
+ $mbtowc()$ Func |crv-mbtowc|
+ $wctomb()$ Func |crv-wctomb|
+
+
+
+mblen() Function *crv-mblen*
+----------------
+Synopsis~
+ $#include <stdlib.h>$
+ $int mblen(const char *string, size_t size);$
+
+Return~
+see description
+
+Description~
+The$mblen()$function with a non-null string argument returns the number of
+bytes that make up the multibyte character beginning at$string$, never
+examining more than$size$bytes.
+
+The return value of$mblen()$distinguishes three possibilities: the first$size$
+bytes at$string$start with valid multibyte characters, they start with an
+invalid byte sequence or just part of a character, or$string$points to an
+empty string (a null character).
+
+For a valid multibyte character,$mblen()$returns the number of bytes in that
+character (always at least 1 and never more than$size$). For an invalid byte
+sequence,$mblen()$returns -1. For an empty string, it returns 0.
+
+If the multibyte character code uses shift characters, then$mblen()$maintains
+and updates a shift state as it scans. If$mblen()$is called with a null
+pointer for$string$, that initializes the shift state to its standard initial
+value. It also returns a nonzero value if the multibyte character code in use
+actually has a shift state.
+
+
+
+mbtowc() Function *crv-mbtowc*
+-----------------
+Synopsis~
+ $#include <stdlib.h>$
+ $int mbtowc(wchar_t *restrict result, const char *restrict string,$
+ $size_t size);$
+
+Return~
+see description
+
+Description~
+The$mbtowc()$("multibyte to wide character") function when called with
+non-null$string$converts the first multibyte character beginning at$string$to
+its corresponding wide character code. It stores the result in$*result$.
+$mbtowc()$never examines more than$size$bytes.
+
+$mbtowc()$with non-null$string$distinguishes three possibilities: the first
+size bytes at$string$start with valid multibyte characters, they start with
+an invalid byte sequence or just part of a character, or string points to an
+empty string (a null character).
+
+For a valid multibyte character,$mbtowc()$converts it to a wide character and
+stores that in$*result$, and returns the number of bytes in that character
+(always at least 1 and never more than$size$).
+
+For an invalid byte sequence,$mbtowc()$returns -1. For an empty string, it
+returns 0, also storing '\0' in$*result$.
+
+If the multibyte character code uses shift characters, then$mbtowc()$
+maintains and updates a shift state as it scans. If$mbtowc()$is called with a
+null pointer for$string$, that initializes the shift state to its standard
+initial value. It also returns nonzero if the multibyte character code in use
+actually has a shift state.
+
+
+
+wctomb() Function *crv-wctomb*
+-----------------
+Synopsis~
+ $#include <stdlib.h>$
+ $int wctomb(char *string, wchar_t wchar);$
+
+Return~
+see description
+
+Description~
+The$wctomb()$("wide character to multibyte") function converts the wide
+character code$wchar$to its corresponding multibyte character sequence, and
+stores the result in bytes starting at$string$. At most$MB_CUR_MAX$characters
+are stored.
+
+$wctomb()$with non-null string distinguishes three possibilities for$wchar$: a
+valid wide character code (one that can be translated to a multibyte
+character), an invalid code, and L'\0'.
+
+Given a valid code,$wctomb()$converts it to a multibyte character, storing the
+bytes starting at$string$. Then it returns the number of bytes in that
+character (always at least 1 and never more than$MB_CUR_MAX$).
+
+If$wchar$is an invalid wide character code,$wctomb()$returns -1. If$wchar$is
+L'\0', it returns 0, also storing '\0' in$*string$.
+
+If the multibyte character code uses shift characters, then$wctomb()$maintains
+and updates a shift state as it scans. If$wctomb()$is called with a null
+pointer for$string$, that initializes the shift state to its standard initial
+value. It also returns nonzero if the multibyte character code in use
+actually has a shift state.
+
+
+
+
+------------------------------------------------------------------------------
+II.20.10 Multibyte/Wide String *crv-libSLHmulstrng*
+
+Quicklink:
+$mbstowcs()$ Func |crv-mbstowcs|
+$wcstombs()$ Func |crv-wcstombs|
+
+
+
+mbstowcs() Function *crv-mbstowcs*
+-------------------
+Synopsis~
+ $#include <stdlib.h>$
+ $size_t mbstowcs(wchar_t *wstring, const char *string, size_t size);$
+
+Return~
+see description
+
+Description~
+The$mbstowcs()$("multibyte string to wide character string") function converts
+the null-terminated string of multibyte characters$string$to an array of wide
+character codes, storing not more than$size$wide characters into the array
+beginning at$wstring$. The terminating null character counts towards the size,
+so if$size$is less than the actual number of wide characters resulting from
+$string$, no terminating null character is stored.
+
+The conversion of characters from$string$begins in the initial shift state.
+
+If an invalid multibyte character sequence is found, the$mbstowcs()$function
+returns a value of -1. Otherwise, it returns the number of wide characters
+stored in the array$wstring$. This number does not include the terminating
+null character, which is present if the number is less than$size$.
+
+
+
+wcstombs() Function *crv-wcstombs*
+-------------------
+Synopsis~
+ $#include <stdlib.h>$
+ $size_t wcstombs(char *string, const wchar_t *wstring, size_t size);$
+
+Return~
+see description
+
+Description~
+The$wcstombs()$("wide character string to multibyte string") function converts
+the null-terminated wide character array$wstring$into a string containing
+multibyte characters, storing not more than$size$bytes starting at$string$,
+followed by a terminating null character if there is room.
+
+The conversion of characters begins in the initial shift state.
+
+The terminating null character counts towards the size, so if$size$is less
+than or equal to the number of bytes needed in$wstring$, no terminating null
+character is stored.
+
+If a code that does not correspond to a valid multibyte character is found,
+the$wcstombs()$function returns a value of -1. Otherwise, the return value is
+the number of bytes stored in the array$string$. This number does not include
+the terminating null character, which is present if the number is less than
+$size$.
+
+
+
+==============================================================================
+II.21 <string.h> String *crv-libStringH*
+
+
+
+------------------------------------------------------------------------------
+II.21.1 Types *crv-libSRHType*
+
+size_t Type *crv-size_t3*
+-----------
+This is an unsigned integer type used to represent the sizes of objects.
+Also declared in$<stddef.h>$, see |crv-size_t|.
+Also declared in$<stdlib.h>$, see |crv-size_t2|.
+Also declared in$<time.h>$, see |crv-size_t4|.
+Also declared in$<stdio.h>$, see |crv-size_t5|.
+Also declared in$<wchar.h>$, see |crv-size_t6|.
+
+
+
+
+------------------------------------------------------------------------------
+II.21.2 Macros *crv-libSRHMac*
+
+NULL Macro *crv-NULL3*
+----------
+Expands to an implementation-defined null pointer constant.
+Also defined in$<stddef.h>$, see |crv-NULL|.
+Also defined in$<stdlib.h>$, see |crv-NULL2|.
+Also defined in$<time.h>$, see |crv-NULL4|.
+Also defined in$<stdio.h>$, see |crv-NULL5|.
+Also defined in$<wchar.h>$, see |crv-NULL6|.
+
+
+
+
+
+------------------------------------------------------------------------------
+II.21.3 Copying *crv-libSRHCopy*
+
+The functions described in this section can be used to copy the contents of
+strings and arrays.
+
+Quicklink:
+ $memcpy()$ Func |crv-memcpy|
+ $memmove()$ Func |crv-memmove|
+ $strcpy()$ Func |crv-strcpy|
+ $strncpy()$ Func |crv-strncpy|
+
+
+
+memcpy() Function *crv-memcpy*
+-----------------
+Synopsis~
+ $#include <string.h>$
+ $void *memcpy(void *restrict to, const void *restrict from, size_t size);$
+
+Return~
+value of$to$
+
+Description~
+This function copies$size$bytes from the object beginning at$from$into the
+object beginning at$to$. The behavior of this function is undefined if the two
+arrays$to$and$from$overlap; $memmove()$can be used instead if overlapping is
+possible.
+
+
+
+memmove() Function *crv-memmove*
+------------------
+Synopsis~
+ $#include <string.h>$
+ $void *memmove(void *to, const void *from, size_t size);$
+
+Return~
+value of$to$
+
+Description~
+This function copies the$size$bytes at$from$into the$size$bytes at$to$, even
+if those two blocks of space overlap. In the case of overlap,$memmove()$is
+careful to copy the original values of the bytes in the block at$from$,
+including those bytes which also belong to the block at$to$.
+
+
+
+strcpy() Function *crv-strcpy*
+-----------------
+Synopsis~
+ $#include <string.h>$
+ $char *strcpy(char *restrict to, const char *restrict from);$
+
+Return~
+value of$to$
+
+Description~
+This copies characters from the string$from$(up to and including the
+terminating null character) into the string$to$. Like$memcpy()$, this function
+has undefined results if the strings overlap.
+
+
+
+strncpy() Function *crv-strncpy*
+------------------
+Synopsis~
+ $#include <string.h>$
+ $char *strncpy(char *restrict to, const char *restrict from, size_t size);$
+
+Return~
+value of$to$
+
+Description~
+This function is similar to$strcpy()$but always copies exactly$size$characters
+into$to$.
+
+If the length of$from$is more than$size$, then$strncpy()$copies just the first
+size characters. In this case there is no null terminator written into$to$.
+
+If the length of$from$is less than$size$, then$strncpy()$copies all of$from$,
+followed by enough null characters to add up to$size$characters in all.
+
+The behavior of$strncpy()$is undefined if the strings overlap.
+
+NOTE: Using$strncpy()$as opposed to$strcpy()$is a way to avoid bugs relating
+to writing past the end of the allocated space for$to$. However, it can also
+make your program much slower in one common case: copying a string which is
+probably small into a potentially large buffer. In this case, size may be
+large, and when it is,$strncpy()$ will waste a considerable amount of time
+copying null characters.
+
+
+
+
+------------------------------------------------------------------------------
+II.21.4 Concatenation *crv-libSRHConcat*
+
+Quicklink:
+ $strcat()$ Func |crv-strcat|
+ $strncat()$ Func |crv-strncat|
+
+
+strcat() Function *crv-strcat*
+-----------------
+Synopsis~
+ $#include <string.h>$
+ $char *strcat(char *restrict to, const char *restrict from);$
+
+Return~
+value of$to$
+
+Description~
+This function is similar to$strcpy()$, except that the characters from$from$
+are concatenated or appended to the end of$to$, instead of overwriting it.
+That is, the first character from$from$overwrites the null character marking
+the end of$to$.
+This function has undefined results if the strings overlap.
+
+
+
+strncat() Function *crv-strncat*
+------------------
+Synopsis~
+ $#include <string.h>$
+ $char *strncat(char *restrict to, const char *restrict from, size_t size);$
+
+Return~
+value of$to$
+
+Description~
+This function is like$strcat()$except that not more than$size$characters from
+$from$are appended to the end of$to$. A single null character is also always
+appended to$to$, so the total allocated size of$to$must be at least
+$size + 1$bytes longer than its initial length.
+The behavior of this function is undefined if the strings overlap.
+
+
+
+
+------------------------------------------------------------------------------
+II.21.5 Comparison *crv-libSRHCmp*
+
+Quicklink:
+ $memcmp()$ Func |crv-memcmp|
+ $strcmp()$ Func |crv-strcmp|
+ $strcoll()$ Func |crv-strcoll|
+ $strncmp()$ Func |crv-strncmp|
+ $strxfrm()$ Func |crv-strxfrm|
+
+
+
+memcmp() Function *crv-memcmp*
+-----------------
+Synopsis~
+ $#include <string.h>$
+ $int memcmp(const void *a1, const void *a2, size_t size);$
+
+Return~
+The value returned is greater than, equal to, or less than zero, accordingly
+as the object pointed to by$a1$is greater than, equal to, or less than the
+object pointed to by$a2$.
+
+Description~
+This function compares the$size$bytes of memory beginning at$a1$against the
+$size$bytes of memory beginning at$a2$.
+
+
+
+strcmp() Function *crv-strcmp*
+-----------------
+Synopsis~
+ $#include <string.h>$
+ $int strcmp(const char *s1, const char *s2);$
+
+Return~
+The value returned is 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$.
+
+Description~
+This function compares the string$s1$against$s2$.
+
+
+
+strcoll() Function *crv-strcoll*
+------------------
+Synopsis~
+ $#include <string.h>$
+ $int strcoll(const char *s1, const char *s2);$
+
+Return~
+The value returned is 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$.
+
+
+Description~
+This function is similar to$strcmp()$but uses the collating sequence of the
+current locale for collation (the$LC_COLLATE$locale).
+
+
+
+strncmp() Function *crv-strncmp*
+------------------
+Synopsis~
+ $#include <string.h>$
+ $int strncmp(const char *s1, const char *s2, size_t size);$
+
+Return~
+The value returned is 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$.
+
+Description~
+This function is the similar to$strcmp()$, except that no more than$size$wide
+characters are compared. In other words, if the two strings are the same in
+their first$size$wide characters, the return value is zero.
+
+
+
+strxfrm() Function *crv-strxfrm*
+------------------
+Synopsis~
+ $#include <string.h>$
+ $size_t strxfrm(char *restrict to, const char *restrict from, size_t size);$
+
+Return~
+The return value is the length of the entire transformed string.
+This value is not affected by the value of$size$, but if it is greater or
+equal than$size$, it means that the transformed string did not entirely fit
+in the array$to$. In this case, only as much of the string as actually fits
+was stored.
+
+Description~
+This function transforms the string$from$using the collation transformation
+determined by the locale currently selected for collation, and stores the
+transformed string in the array$to$. Up to$size$characters (including a
+terminating null character) are stored.
+
+If$size$is zero, no characters are stored in$to$. In this case,$strxfrm()$
+simply returns the number of characters that would be the length of the
+transformed string.
+This is useful for determining what size the allocated array should be.
+It does not matter what$to$is if$size$is zero;$to$may even be a null pointer.
+
+The transformed string may be longer than the original string, and it may
+also be shorter.
+
+The behavior is undefined if the strings$to$and$from$overlap.
+
+
+
+
+------------------------------------------------------------------------------
+II.21.6 Search *crv-libSRHSearch*
+
+This section describes library functions which perform various kinds of
+searching operations on strings and arrays.
+
+Quicklink:
+ $memchr()$ Func |crv-memchr|
+ $strchr()$ Func |crv-strchr|
+ $strcspn()$ Func |crv-strcspn|
+ $strpbrk()$ Func |crv-strpbrk|
+ $strrchr()$ Func |crv-strrchr|
+ $strspn()$ Func |crv-strspn|
+ $strstr()$ Func |crv-strstr|
+ $strtok()$ Func |crv-strtok|
+
+
+
+
+memchr() Function *crv-memchr*
+-----------------
+Synopsis~
+ $#include <string.h>$
+ $void *memchr(const void *block, int c, size_t size);$
+
+Return~
+pointer to the located byte, or null pointer if no match was found
+
+Description~
+This function finds the first occurrence of the byte$c$(converted to an
+$unsigned char$) in the initial$size$bytes of the object beginning at$block$.
+
+
+
+strchr() Function *crv-strchr*
+-----------------
+Synopsis~
+ $#include <string.h>$
+ $char *strchr(const char *string, int c);$
+
+Return~
+pointer to the located byte, or null pointer if no match was found
+
+Description~
+This function finds the first occurrence of the character$c$(converted to a
+$char$) in the null-terminated string beginning at$string$.
+
+
+
+strcspn() Function *crv-strcspn*
+------------------
+Synopsis~
+ $#include <string.h>$
+ $size_t strcspn(const char *string, const char *stopset);$
+
+Return~
+length of substring
+
+Description~
+The$strcspn()$("string complement span") function returns the length of the
+initial substring of$string$that consists entirely of characters that are not
+members of the set specified by the string$stopset$.
+(In other words, it returns the offset of the first character in$string$that
+is a member of the set$stopset$.)
+
+
+
+strpbrk() Function *crv-strpbrk*
+------------------
+Synopsis~
+ $#include <string.h>$
+ $char *strpbrk(const char *string, const char *stopset);$
+
+Return~
+returns a pointer to the character, or null pointer if no such character
+is found
+
+Description~
+The$strpbrk()$("string pointer break") function is related to$strcspn()$,
+except that it returns a pointer to the first character in$string$that is a
+member of the set$stopset$instead of the length of the initial substring.
+
+
+
+strrchr() Function *crv-strrchr*
+------------------
+Synopsis~
+ $#include <string.h>$
+ $char *strrchr(const char *string, int c);$
+
+Return~
+pointer to the located byte, or null pointer if no match was found
+
+Description~
+The function$strrchr()$is like$strchr()$, except that it searches backwards
+from the end of the string$string$(instead of forwards from the front).
+
+
+
+strspn() Function *crv-strspn*
+-----------------
+Synopsis~
+ $#include <string.h>$
+ $size_t strspn(const char *string, const char *skipset);$
+
+Return~
+length of substring
+
+Description~
+The$strspn()$("string span") function returns the length of the initial
+substring of$string$that consists entirely of characters that are members of
+the set specified by the string$skipset$. The order of the characters in
+$skipset$is not important.
+
+
+
+strstr() Function *crv-strstr*
+-----------------
+Synopsis~
+ $#include <string.h>$
+ $char *strstr(const char *haystack, const char *needle);$
+
+Return~
+It returns a pointer into the string$haystack$that is the first character of
+the substring, or a null pointer if no match was found. If$needle$is an empty
+string, the function returns$haystack$.
+
+Description~
+This is like$strchr()$, except that it searches$haystack$for a substring
+$needle$rather than just a single character.
+
+
+
+strtok() Function *crv-strtok*
+-----------------
+Synopsis~
+ $#include <string.h>$
+ $char *strtok(char *restrict newstring, const char *restrict delimiters);$
+
+Return~
+see description
+
+Description~
+A string can be split into tokens by making a series of calls to the function
+$strtok()$.
+
+The string to be split up is passed as the$newstring$argument on the first
+call only. The$strtok()$function uses this to set up some internal state
+information. Subsequent calls to get additional tokens from the same string
+are indicated by passing a null pointer as the$newstring$argument. Calling
+$strtok()$with another non-null$newstring$argument reinitializes the state
+information. It is guaranteed that no other library function ever calls
+$strtok()$behind your back (which would mess up this internal state
+information).
+
+The$delimiters$argument is a string that specifies a set of delimiters that
+may surround the token being extracted. All the initial characters that are
+members of this set are discarded. The first character that is not a member
+of this set of delimiters marks the beginning of the next token. The end of
+the token is found by looking for the next character that is a member of the
+$delimiter$set. This character in the original string$newstring$is
+overwritten by a null character, and the pointer to the beginning of the token
+in$newstring$ is returned.
+
+On the next call to$strtok()$, the searching begins at the next character
+beyond the one that marked the end of the previous token.
+Note that the set of delimiters$delimiters$do not have to be the same on every
+call in a series of calls to$strtok()$.
+
+If the end of the string$newstring$is reached, or if the remainder of$string$
+consists only of delimiter characters,$strtok()$returns a null pointer.
+
+Note that "character" is here used in the sense of byte. In a string using a
+multibyte character encoding (abstract) character consisting of more than one
+byte are not treated as an entity. Each byte is treated separately. The
+function is not locale-dependent.
+
+
+
+
+------------------------------------------------------------------------------
+II.21.7 Miscellaneous *crv-libSRHMisc*
+
+Quicklink:
+ $memset()$ Func |crv-memset|
+ $strerror()$ Func |crv-strerror|
+ $strlen()$ Func |crv-strlen|
+
+
+
+memset() Function *crv-memset*
+-----------------
+Synopsis~
+ $#include <string.h>$
+ $void *memset(void *block, int c, size_t size);$
+
+Return~
+value of$block$
+
+Description~
+This function copies the value of$c$(converted to an$unsigned char$) into each
+of the first$size$bytes of the object beginning at$block$.
+
+
+
+strerror() Function *crv-strerror*
+-------------------
+Synopsis~
+ $#include <string.h>$
+ $char *strerror(int errnum);$
+
+Return~
+The return value is a pointer to error message, which string should not be
+modified. Also, if subsequent calls to$strerror()$are done, the string might
+be overwritten. But it's guaranteed that no library function ever calls
+$strerror()$.
+
+Description~
+This function maps the error code specified by the$errnum$argument to a
+descriptive error message string.
+The value$errnum$normally comes from the variable$errno$.
+
+
+
+strlen() Function *crv-strlen*
+-----------------
+Synopsis~
+ $#include <string.h>$
+ $size_t strlen(const char *s);$
+
+Return~
+length of string
+
+Description~
+The$strlen()$function returns the length of the null-terminated string$s$in bytes.
+
+
+
+
+==============================================================================
+II.22 <tgmath.h> Type-Generic *crv-libTgmathH*
+
+This header file includes$<math.h>$and$<complex.h>$and defines several
+type-generic macros.
+
+A type-generic macro expands to a function according to the type of the
+macro's parameter(s).
+E.g. there is a type-generic macro$fabs(parameter)$.This macro expands to:
+ -$fabs()$ if$parameter$is of type$double$
+ -$fabsf()$ if$parameter$is of type$float$
+ -$fabsl()$ if$parameter$is of type$long double$
+ -$cabs()$ if$parameter$is of type$double complex$
+ -$cabsf()$ if$parameter$is of type$float complex$
+ -$cabsl()$ if$parameter$is of type$long double complex$
+
+For each function declared in$<math.h>$and$<complex.h>$which has no f ($float$)
+or l ($long double$) suffix, and which has one or more parameters of type
+$double$a type-generic macro is defined (except for$mdof()$).
+
+For each function declared in$<math.h>$which has no suffix and for which there
+is a corresponding function in$<complex.h>$with prefix c, a type-generic macro
+is defined for both functions that has the name of the function declared
+in$<math.h>$.
+
+The type-generic macros determine the real type as follows:
+ - if any parameter is of type$long double$, the type determined is
+ $long double$
+ - otherwise, if any parameter is of type$double$or is of integer type, the
+ determined type is$double$
+ - otherwise, the type determined is$float$
+
+
+
+
+==============================================================================
+II.23 <time.h> Date and Time *crv-libTimeH*
+
+This header defines macros and declares types and functions for manipulating
+time.
+
+
+
+------------------------------------------------------------------------------
+II.23.1 Types *crv-libTHType*
+
+Quicklink:
+ $size_t$ Type |crv-size_t4|
+ $clock_t$ Type |crv-clock_t|
+ $time_t$ Type |crv-time_t|
+ $tm$ Type |crv-tm|
+
+
+
+size_t Type *crv-size_t4*
+-----------
+This is an unsigned integer type used to represent the sizes of objects.
+Also declared in$<stddef.h>$, see |crv-size_t|.
+Also declared in$<stdlib.h>$, see |crv-size_t2|.
+Also declared in$<string.h>$, see |crv-size_t3|.
+Also declared in$<stdio.h>$, see |crv-size_t5|.
+Also declared in$<wchar.h>$, see |crv-size_t6|.
+
+
+
+clock_t Type *crv-clock_t*
+------------
+This is the type of the value returned by the$clock()$function. Values of
+type$clock_t$are numbers of clock ticks.
+
+
+
+time_t Type *crv-time_t*
+-----------
+This is the data type used to represent simple time. Sometimes, it also
+represents an elapsed time. When interpreted as a calendar time value, it
+represents the number of seconds elapsed since 00:00:00 on January 1, 1970,
+Coordinated Universal Time. (This calendar time is sometimes referred to as
+the epoch.).
+
+NOTE: A simple time has no concept of local time zone. Calendar Time T
+is the same instant in time regardless of where on the globe the computer is.
+
+
+
+struct tm Type *crv-tm*
+--------------
+This is the data type used to represent a broken-down time. The structure
+contains at least the following members, which can appear in any order.
+
+$int tm_sec$
+ This is the number of full seconds since the top of the minute (normally
+ in the range 0 through 59, but the actual upper limit is 60, to allow for
+ leap seconds if leap second support is available).
+
+$int tm_min$
+ This is the number of full minutes since the top of the hour (in the range
+ 0 through 59).
+
+$int tm_hour$
+ This is the number of full hours past midnight (in the range 0 through 23).
+
+$int tm_mday$
+ This is the ordinal day of the month (in the range 1 through 31).
+
+$int tm_mon$
+ This is the number of full calendar months since the beginning of the year
+ (in the range 0 through 11).
+
+$int tm_year$
+ This is the number of full calendar years since 1900.
+
+$int tm_wday$
+ This is the number of full days since Sunday (in the range 0 through 6).
+
+$int tm_yday$
+ This is the number of full days since the beginning of the year (in the
+ range 0 through 365).
+
+$int tm_isdst$
+ This is a flag that indicates whether Daylight Saving Time is (or was, or
+ will be) in effect at the time described. The value is positive if
+ Daylight Saving Time is in effect, zero if it is not, and negative if the
+ information is not available.
+
+Also declared in$<wchar.h>$, see |crv-tm2|.
+
+
+
+
+------------------------------------------------------------------------------
+II.23.2 Macros *crv-libTHMac*
+
+Quicklink:
+$CLOCKS_PER_SEC$ Macro |crv-CLOCKS_PER_SEC|
+$NULL$ Macro |crv-NULL4|
+
+
+
+NULL Macro *crv-NULL4*
+----------
+Expands to an implementation-defined null pointer constant.
+Also defined in$<stddef.h>$, see |crv-NULL|.
+Also defined in$<stdlib.h>$, see |crv-NULL2|.
+Also defined in$<string.h>$, see |crv-NULL3|.
+Also defined in$<stdio.h>$, see |crv-NULL5|.
+Also defined in$<wchar.h>$, see |crv-NULL6|.
+
+
+
+CLOCKS_PER_SEC Macro *crv-CLOCKS_PER_SEC*
+--------------------
+The value of this macro is the number of clock ticks per second measured by
+the$clock()$function.
+
+
+
+------------------------------------------------------------------------------
+II.23.3 Time Manipulation *crv-libTHMani*
+
+Quicklink:
+ $clock()$ Func |crv-clock|
+ $difftime()$ Func |crv-difftime|
+ $mktime()$ Func |crv-mktime|
+ $time()$ Func |crv-time|
+
+
+
+clock() Function *crv-clock*
+----------------
+Synopsis~
+ $#include <time.h>$
+ $clock_t clock(void);$
+
+Return~
+CPU time ot (clock_t)(-1) if an error occurred
+
+Description~
+This function returns the calling process' current CPU time. If the CPU time
+is not available or cannot be represented, clock returns the value
+(clock_t)(-1).
+Time in seconds can be determined by dividing the result of$clock()$by
+$CLOCKS_PER_SECOND$.
+
+
+
+difftime() Function *crv-difftime*
+-------------------
+Synopsis~
+ $#include <time.h>$
+ $double difftime(time_t time1, time_t time0);$
+
+Return~
+seconds elapsed
+
+Description~
+This function returns the number of seconds of elapsed time between calendar
+time$time1$and calendar time$time0$, as a value of type$double$. The
+difference ignores leap seconds unless leap second support is enabled.
+
+
+
+mktime() Function *crv-mktime*
+-----------------
+Synopsis~
+ $#include <time.h>$
+ $time_t mktime(struct tm *brokentime);$
+
+Return~
+Simple time, or if the specified broken-down time cannot be represented as a
+simple time,$mktime()$returns a value of (time_t)(-1) and does not modify the
+contents of$brokentime$.
+
+Description~
+The$mktime()$function is used to convert a broken-down time structure to a
+simple time representation. It also "normalizes" the contents of the
+broken-down time structure, by filling in the day of week and day of year
+based on the other date and time components.
+
+The$mktime()$function ignores the specified contents of the$tm_wday$and
+$tm_yday$members of the broken-down time structure. It uses the values of the
+other components to determine the calendar time; it's permissible for these
+components to have unnormalized values outside their normal ranges. The last
+thing that$mktime()$does is adjust the components of the brokentime structure
+(including the$tm_wday$and$tm_yday$).
+
+
+
+time() Function *crv-time*
+---------------
+Synopsis~
+ $#include <time.h>$
+ $time_t time(time_t *result);$
+
+Return~
+current calenar time or if the current calendar time is not available,
+the value (time_t)(-1)
+
+Description~
+The$time()$function returns the current calendar time as a value of type
+$time_t$. If the argument$result$is not a null pointer, the calendar time
+value is also stored in$*result$.
+
+
+
+
+------------------------------------------------------------------------------
+II.23.4 Time Conversion *crv-libTHConv*
+
+Quicklink:
+ $asctime()$ Func |crv-asctime|
+ $ctime()$ Func |crv-ctime|
+ $gmtime()$ Func |crv-gmtime|
+ $localtime()$ Func |crv-localtime|
+ $strftime()$ Func |crv-strftime|
+
+
+
+asctime() Function *crv-asctime*
+------------------
+Synopsis~
+ $#include <time.h>$
+ $char *asctime(const struct tm *brokentime);$
+
+Return~
+The return value points to a statically allocated string, which might be
+overwritten by subsequent calls to$asctime()$or$ctime$. But no other library
+function overwrites the contents of this string.
+
+Description~
+This function converts the broken-down time value that$brokentime$points to
+into a string in a standard format:
+ "Tue May 21 13:46:22 1991\n"
+
+The abbreviations for the days of week are: Sun, Mon, Tue, Wed, Thu, Fri, and
+Sat.
+
+The abbreviations for the months are: Jan, Feb, Mar, Apr, May, Jun, Jul, Aug,
+Sep, Oct, Nov, and Dec.
+
+
+
+ctime() Function *crv-ctime*
+----------------
+Synopsis~
+ $#include <time.h>$
+ $char *ctime(const time_t *time);$
+
+Return~
+The return value points to a statically allocated string, which might be
+overwritten by subsequent calls to$asctime()$or$ctime$. But no other library
+function overwrites the contents of this string.
+
+Description~
+The$ctime()$function is similar to$asctime()$, except that calendar time
+is specified as a$time_t$simple time value rather than in broken-down local
+time format. It is equivalent to:
+ $asctime (localtime (time))$
+
+
+
+gmtime() Function *crv-gmtime*
+-----------------
+Synopsis~
+ $#include <time.h>$
+ $struct tm *gmtime(const time_t *time);$
+
+Return~
+returns pointer to the broken-down time, or a null pointer if the specified
+time cannot be converted to UTC
+
+Description~
+This function is similar to$localtime()$, except that the broken-down time is
+expressed as Coordinated Universal Time (UTC) (formerly called Greenwich Mean
+Time (GMT)) rather than relative to a local time zone.
+
+
+
+localtime() Function *crv-localtime*
+--------------------
+Synopsis~
+ $#include <time.h>$
+ $struct tm *localtime (const time_t *time);$
+
+Return~
+returns pointer to the broken-down time, or a null pointer if the specified
+time cannot be converted to local time
+
+Description~
+The$localtime()$function converts the simple time pointed to by$time$to
+broken-down time representation, expressed relative to the user's specified
+time zone.
+
+
+
+strftime() Function *crv-strftime*
+-------------------
+Synopsis~
+ $#include <time.h>$
+ $size_t strftime(char *s, size_t size, const char *format,$
+ $const struct tm *brokentime;$
+
+Return~
+number of characters placed in$s$, not including the terminating null
+character
+if this number is greater than$size$, zero is returned
+
+Description~
+This function is similar to the$sprintf()$function, but the conversion
+specifications that can appear in the format$format$are specialized for
+printing components of the date and time$brokentime$according to the locale
+currently specified for time conversion.
+
+Ordinary characters appearing in the format are copied to the output
+string$s$; this can include multibyte character sequences. Conversion
+specifiers are introduced by a$%$character, followed by an optional
+modifier. The modifier extensions are:
+
+ - E Use the locale's alternate representation for date and time. This
+ modifier applies to the$%c, %C, %x, %X, %y, %Y$format specifiers.
+ - O Use the locale's alternate numeric symbols for numbers. This modifier
+ applies only to numeric format specifiers.
+
+
+If the format supports the modifier but no alternate representation is
+available, it is ignored.
+
+The conversion specifier ends with a format specifier taken from the following
+list. The whole % sequence is replaced in the output string as follows:
+
+$%a$ The abbreviated weekday name according to the current locale.
+$%A$ The full weekday name according to the current locale.
+$%b$ The abbreviated month name according to the current locale.
+$%B$ The full month name according to the current locale.
+$%c$ The preferred calendar time representation for the current locale.
+$%C$ The century of the year. This is equivalent to the greatest integer
+ not greater than the year divided by 100.
+$%d$ The day of the month as a decimal number (range 01 through 31).
+$%D$ The date using the format$%m/%d/%y$.
+$%e$ The day of the month like with %d, but padded with blank (range 1
+ through 31).
+$%F$ The date using the format$%Y-%m-%d$.
+$%g$ The year corresponding to the ISO week number, but without the century
+ (range 00 through 99). This has the same format and value as$%y$,
+ except that if the ISO week number (see$%V$) belongs to the previous
+ or next year, that year is used instead.
+$%G$ The year corresponding to the ISO week number. This has the same format
+ and value as$%Y$, except that if the ISO week number (see %V) belongs
+ to the previous or next year, that year is used instead.
+$%h$ The abbreviated month name according to the current locale. The action
+ is the same as for$%b$.
+$%H$ The hour as a decimal number, using a 24-hour clock (range 00 through
+ 23).
+$%I$ The hour as a decimal number, using a 12-hour clock (range 01 through
+ 12).
+$%j$ The day of the year as a decimal number (range 001 through 366).
+$%k$ The hour as a decimal number, using a 24-hour clock like$%H$, but padded
+ with blank (range 0 through 23).
+$%l$ The hour as a decimal number, using a 12-hour clock like$%I$, but padded
+ with blank (range 1 through 12).
+$%m$ The month as a decimal number (range 01 through 12).
+$%M$ The minute as a decimal number (range 00 through 59).
+$%n$ A single \n (newline) character.
+$%p$ Either AM or PM, according to the given time value; or the corresponding
+ strings for the current locale. Noon is treated as PM and midnight as AM.
+$%r$ The complete calendar time using the AM/PM format of the current locale.
+$%R$ The hour and minute in decimal numbers using the format$%H:%M$.
+$%S$ The seconds as a decimal number (range 00 through 60).
+$%t$ A single \t (tabulator) character.
+$%T$ The time of day using decimal numbers using the format$%H:%M:%S$.
+$%u$ The day of the week as a decimal number (range 1 through 7), Monday
+ being 1.
+$%U$ The week number of the current year as a decimal number (range 00 through
+ 53), starting with the first Sunday as the first day of the first week.
+ Days preceding the first Sunday in the year are considered to be in week
+ 00.
+$%V$ The ISO 8601:1988 week number as a decimal number (range 01 through 53).
+ ISO weeks start with Monday and end with Sunday. Week 01 of a year is the
+ first week which has the majority of its days in that year; this is
+ equivalent to the week containing the year's first Thursday, and it is
+ also equivalent to the week containing January 4. Week 01 of a year can
+ contain days from the previous year. The week before week 01 of a year
+ is the last week (52 or 53) of the previous year even if it contains days
+ from the new year.
+$%w$ The day of the week as a decimal number (range 0 through 6), Sunday
+ being 0.
+$%W$ The week number of the current year as a decimal number (range 00 through
+ 53), starting with the first Monday as the first day of the first week.
+ All days preceding the first Monday in the year are considered to be in
+ week 00.
+$%x$ The preferred date representation for the current locale.
+$%X$ The preferred time of day representation for the current locale.
+$%y$ The year without a century as a decimal number (range 00 through 99).
+ This is equivalent to the year modulo 100.
+$%Y$ The year as a decimal number, using the Gregorian calendar. Years before
+ the year 1 are numbered 0, -1, and so on.
+$%z$ RFC 822/ISO 8601:1988 style numeric time zone (e.g., -0600 or +0100), or
+ nothing if no time zone is determinable.
+ A full RFC 822 timestamp is generated by the format
+ $"%a, %d %b %Y %H:%M:%S %z"$ (or the equivalent$"%a, %d %b %Y %T %z"$).
+$%Z$ The time zone abbreviation (empty if the time zone can't be determined).
+$%%$ A literal % character.
+
+
+The$size$parameter can be used to specify the maximum number of characters to
+be stored in the array$s$, including the terminating null character. If the
+formatted time requires more than$size$characters,$strftime()$returns zero
+and the contents of the array$s$are undefined. Otherwise the return value
+indicates the number of characters placed in the array$s$, not including
+the terminating null character.
+
+Warning: This convention for the return value which is prescribed in ISO C
+can lead to problems in some situations. For certain format strings and
+certain locales the output really can be the empty string and this cannot
+be discovered by testing the return value only. E.g., in most locales the
+AM/PM time format is not supported (most of the world uses the 24 hour
+time representation). In such locales$"%p"$will return the empty string,
+i.e., the return value is zero. To detect situations like this something
+similar to the following code should be used:
+>
+ buf[0] = '\1';
+ len = strftime (buf, bufsize, format, tp);
+ if (len == 0 && buf[0] != '\0')
+ {
+ /* Something went wrong in the strftime call. */
+ ...
+ }
+
+
+If$s$is a null pointer,$strftime()$does not actually write anything, but
+instead returns the number of characters it would have written.
+
+
+
+
+==============================================================================
+II.24 <wchar.h> Wide Utilities *crv-libWcharH*
+
+
+------------------------------------------------------------------------------
+II.24.1 Types *crv-libWCHType*
+
+Quicklink:
+ $mbstate_t$ Type |crv-mbstate_t|
+ $tm$ Type |crv-tm2|
+ $size_t$ Type |crv-size_t6|
+ $wchar_t$ Type |crv-wchar_t3|
+ $wint_t$ Type |crv-wint_t2|
+
+
+
+mbstate_t Type *crv-mbstate_t*
+--------------
+A variable of type$mbstate_t$can contain all the information about the shift
+state needed from one call to a conversion function to another.
+
+
+struct tm Type *crv-tm2*
+--------------
+Also declared in$<time.h>$, for description see |crv-tm|.
+
+
+size_t Type *crv-size_t6*
+-----------
+This is an unsigned integer type used to represent the sizes of objects.
+Also declared in$<stddef.h>$, see |crv-size_t|.
+Also declared in$<stdlib.h>$, see |crv-size_t2|.
+Also declared in$<string.h>$, see |crv-size_t3|.
+Also declared in$<time.h>$, see |crv-size_t4|.
+Also declared in$<stdio.h>$, see |crv-size_t5|.
+
+
+wchar_t Type *crv-wchar_t3*
+------------
+This data type is used as the base type for wide character strings.
+It's range of values can represent distinct codes for all members of the
+largest extended character set specified among the supported locales.
+Also declared in$<stddef.h>$, see |crv-wchar_t|.
+Also declared in$<stdlib.h>$, see |crv-wchar_t2|.
+
+
+wint_t Type *crv-wint_t2*
+-----------
+This is a data type used for parameters and variables that contain a single
+wide character.
+Also declared in$<wctype.h>$, see |crv-wint_t|.
+
+
+
+
+------------------------------------------------------------------------------
+II.24.2 Macros *crv-libWCHMac*
+
+Quicklink:
+ $NULL$ Macro |crv-NULL6|
+ $WCHAR_MIN$ Macro |crv-WCHAR_MIN2|
+ $WCHAR_MAX$ Macro |crv-WCHAR_MAX2|
+ $WEOF$ Macro |crv-WEOF2|
+
+
+NULL Macro *crv-NULL6*
+----------
+Expands to an implementation-defined null pointer constant.
+Also defined in$<stddef.h>$, see |crv-NULL|.
+Also defined in$<stdlib.h>$, see |crv-NULL2|.
+Also defined in$<string.h>$, see |crv-NULL3|.
+Also defined in$<time.h>$, see |crv-NULL4|.
+Also defined in$<stdio.h>$, see |crv-NULL5|.
+
+
+WCHAR_MIN Macro *crv-WCHAR_MIN2*
+WCHAR_MAX Macro *crv-WCHAR_MAX2*
+---------------
+Minimum and maximum value representable by an object of type$wchar_t$.
+Also defined in$<wctype.h>$, see |crv-libWCHAR_MIN|, |crv-libWCHAR_MAX|.
+
+
+WEOF Macro *crv-WEOF2*
+----------
+This macro expands to an expression of type$wint_t$that is returned by a
+number of wide stream functions to indicate an end-of-file condition, or some
+other error situation.
+Also declared in$<wctype.t>$, see |crv-libWEOF|.
+
+
+
+
+------------------------------------------------------------------------------
+II.24.3 Formatted Input/Output *crv-libWCHIO*
+
+Quicklink:
+ $fwprintf()$ Func |crv-fwprintf|
+ $swprintf()$ Func |crv-swprintf|
+ $wprintf()$ Func |crv-wprintf|
+ $wscanf()$ Func |crv-wscanf|
+ $fwscanf()$ Func |crv-fwscanf|
+ $swscanf()$ Func |crv-swscanf|
+ $vfwprintf()$ Func |crv-vfwprintf|
+ $vswprintf()$ Func |crv-vswprintf|
+ $vwprintf()$ Func |crv-vwprintf|
+ $vfwscanf()$ Func |crv-vfwscanf|
+ $vswscanf()$ Func |crv-vswscanf|
+ $vwscanf()$ Func |crv-vwscanf|
+
+
+
+wprintf() Function *crv-wprintf*
+------------------
+Synopsis~
+ $#include <wchar.h>$
+ $int wprintf(const wchar_t *format, ...);$
+
+Return~
+<0: output error occurred
+>= 0: number of transmitted characters
+
+Description~
+This function prints the optional arguments under the control of the wide
+format string$format$to the standard output stream$stdout$.
+For format string see |crv-libSIOHIOFout|.
+
+
+
+fwprintf() Function *crv-fwprintf*
+-------------------
+Synopsis~
+ $#include <stdio.h>$
+ $#include <wchar.h>$
+ $int fwprintf(FILE *stream, const wchar_t *format, ...);$
+
+Return~
+<0: output error occurred
+>= 0: number of transmitted characters
+
+Description~
+This function is just like$wprintf()$, except that the output is written to
+the stream$stream$instead of standard output stream$stdout$.
+
+
+
+swprintf() Function *crv-swprintf*
+-------------------
+Synopsis~
+ $#include <wchar.h>$
+ $int swprintf(wchar_t *s, size_t size, const wchar_t *format, ...);$
+
+Return~
+The return value is the number of characters generated for the given input,
+excluding the trailing null. If not all output fits into the provided
+buffer or an error occurred a negative value is returned.
+
+Description~
+This is like$wprintf()$, except that the output is stored in the wide
+character array$s$instead of written to a stream. A null wide character is
+written to mark the end of the string. The$size$argument specifies the maximum
+number of characters to produce. The trailing null character is counted
+towards this limit.
+
+
+
+vwprintf() Function *crv-vwprintf*
+-------------------
+Synopsis~
+ $#include <stdarg.h>$
+ $#include <wchar.h>$
+ $int vwprintf(const wchar_t *format, va_list ap);$
+
+Return~
+
+Description~
+This function is similar to$wprintf()$except that, instead of taking a
+variable number of arguments directly, it takes an argument list pointer$ap$.
+
+
+
+vfwprintf() Function *crv-vfwprintf*
+--------------------
+Synopsis~
+ $#include <stdarg.h>$
+ $#include <stdio.h>$
+ $#include <wchar.h>$
+ $int vfwprintf(FILE *stream, const wchar_t *format, va_list ap);$
+
+Return~
+
+Description~
+This is the equivalent of$fwprintf()$with the variable argument list specified
+directly as for$vwprintf()$.
+
+
+
+vswprintf() Function *crv-vswprintf*
+--------------------
+Synopsis~
+ $#include <stdarg.h>$
+ $#include <stdio.h>$
+ $#include <wchar.h>$
+ $int vswprintf(wchar_t *s, size_t size, const wchar_t *format, va_list ap);$
+
+Return~
+
+Description~
+This is the equivalent of$swprintf()$with the variable argument list specified
+directly as for$vwprintf()$.
+
+
+
+wscanf() Function *crv-wscanf*
+-----------------
+Synopsis~
+ $#include <wchar.h>$
+ $int wscanf(const wchar_t *format, ...);$
+
+Return~
+The return value is normally the number of successful assignments. If an
+end-of-file condition is detected before any matches are performed, including
+matches against whitespace and literal characters in the template, then$WEOF$
+is returned.
+
+Description~
+The$wscanf()$function reads formatted input from the stream$stdin$under the
+control of the format string$format$. The optional arguments are pointers to
+the places which receive the resulting values.
+For format string see |crv-libSIOHIOFin|.
+
+
+
+fwscanf() Function *crv-fwscanf*
+------------------
+Synopsis~
+ $#include <stdio.h>$
+ $#include <wchar.h>$
+ $int fwscanf(FILE *stream, const wchar_t *format, ...);$
+
+Return~
+
+Description~
+This function is just like$wscanf()$, except that the input is read from the
+stream$stream$instead of$stdin$.
+
+
+
+swscanf() Function *crv-swscanf*
+------------------
+Synopsis~
+ $#include <wchar.h>$
+ $int swscanf (const wchar_t *ws, const char *format, ...);$
+
+Return~
+
+Description~
+This is like$wscanf()$, except that the characters are taken from the
+null-terminated string$ws$instead of from a$stream$. Reaching the end of the
+string is treated as an end-of-file condition.
+
+The behavior of this function is undefined if copying takes place between
+objects that overlap.
+
+
+
+vwscanf() Function *crv-vwscanf*
+------------------
+Synopsis~
+ $#include <stdarg.h>$
+ $#include <wchar.h>$
+ $int vwscanf(const wchar_t *format, va_list ap);$
+
+Return~
+
+Description~
+This function is similar to$wscanf()$, but instead of taking a variable number
+of arguments directly, it takes an argument list pointer ap of type$va_list$.
+
+
+
+vfwscanf() Function *crv-vfwscanf*
+-------------------
+Synopsis~
+ $#include <stdarg.h>$
+ $#include <stdio.h>$
+ $#include <wchar.h>$
+ $int vfwscanf(FILE *stream, const wchar_t *format, va_list ap);$
+
+Return~
+
+Description~
+This is the equivalent of$fwscanf()$with the variable argument list specified
+directly as for$vwscanf()$.
+
+
+
+vswscanf() Function *crv-vswscanf*
+-------------------
+Synopsis~
+ $#include <stdarg.h>$
+ $#include <wchar.h>$
+ $int vswscanf(const wchar_t *s, const wchar_t *format, va_list ap);$
+
+Return~
+
+Description~
+This is the equivalent of$swscanf()$with the variable argument list specified
+directly as for$vwscanf()$.
+
+
+
+
+------------------------------------------------------------------------------
+II.24.4 Character Input/Output *crv-libWCHCIO*
+
+Quicklink:
+ $fgetwc()$ Func |crv-fgetwc|
+ $fgetws()$ Func |crv-fgetws|
+ $getwc()$ Macro |crv-getwc|
+ $getwchar()$ Macro |crv-getwchar|
+ $ungetwc()$ Func |crv-ungetwc|
+ $fputwc()$ Func |crv-fputwc|
+ $fputws()$ Func |crv-fputws|
+ $putwc()$ Macro |crv-putwc|
+ $putwchar()$ Macro |crv-putwchar|
+ $fwide()$ Func |crv-fwide|
+
+
+
+fgetwc() Function *crv-fgetwc*
+-----------------
+Synopsis~
+ $#include <stdio.h>$
+ $#include <wchar.h>$
+ $wint_t fgetwc(FILE *stream);$
+
+Return~
+wide character read from stream, or$WEOF$if an error or an end-of-file
+condition occurred
+
+Description~
+This function reads the next wide character from the stream$stream$and returns
+its value.
+
+
+
+fgetws() Function *crv-fgetws*
+-----------------
+Synopsis~
+ $#include <stdio.h>$
+ $#include <wchar.h>$
+ $wchar_t *fgetws(wchar_t *ws, int count, FILE *stream);$
+
+Return~
+If the system is already at end of file when$fgetws()$is called, then the
+contents of the array$ws$are unchanged and a null pointer is returned. A null
+pointer is also returned if a read error occurs. Otherwise, the return value
+is the pointer$ws$.
+
+Description~
+This function reads wide characters from the stream$stream$up to and including
+a newline character and stores them in the string$ws$, adding a null wide
+character to mark the end of the string.$count$wide characters worth of space
+in$ws$must be supplied, but the number of characters read is at most
+$count - 1$. The extra character space is used to hold the null wide character
+at the end of the string.
+
+
+
+getwc() Macro *crv-getwc*
+-------------
+Synopsis~
+ $#include <stdio.h>$
+ $#include <wchar.h>$
+ $wint_t getwc(FILE *stream);$
+
+Return~
+wide character read from stream, or$WEOF$if an error or an end-of-file
+condition occurred
+
+Description~
+This is just like$fgetwc()$, except that it is permissible for it to be
+implemented as a macro that evaluates the$stream$argument more than once.
+$getwc()$can be highly optimized, so it is usually the best function to use
+to read a single wide character.
+
+
+
+getwchar() Macro *crv-getwchar*
+----------------
+Synopsis~
+ $#include <wchar.h>$
+ $wint_t getwchar(void);$
+
+Return~
+wide character read from stream, or$WEOF$if an error or an end-of-file
+condition occurred
+
+Description~
+This function is equivalent to$getwc()$with$stdin$as the value of the stream
+argument.
+
+
+
+ungetwc() Function *crv-ungetwc*
+------------------
+Synopsis~
+ $#include <stdio.h>$
+ $#include <wchar.h>$
+ $wint_t ungetwc(wint_t wc, FILE *stream);$
+
+Return~
+
+Description~
+The$ungetwc()$function behaves just like$ungetc()$just that it pushes back a
+wide character.
+
+
+
+fputwc() Function *crv-fputwc*
+-----------------
+Synopsis~
+ $#include <stdio.h>$
+ $#include <wchar.h>$
+ $wint_t fputwc(wchar_t wc, FILE *stream);$
+
+Return~
+$WEOF$is returned if a write error occurs; otherwise the character$wc$is
+returned
+
+Description~
+This function writes the wide character$wc$to the stream$stream$.
+
+
+
+fputws() Function *crv-fputws*
+-----------------
+Synopsis~
+ $#include <stdio.h>$
+ $#include <wchar.h>$
+ $int fputws(const wchar_t *ws, FILE *stream);$
+
+Return~
+$WEOF$is returned if a write error occurs, otherwise a non-negative value
+
+Description~
+The function$fputws()$writes the wide character string$ws$to the stream
+$stream$. The terminating null character is not written. This function does
+not add a newline character, either. It outputs only the characters in the
+string.
+
+
+
+putwc() Macro *crv-putwc*
+-------------
+Synopsis~
+ $#include <stdio.h>$
+ $#include <wchar.h>$
+ $wint_t putwc(wchar_t wc, FILE *stream);$
+
+Return~
+$WEOF$is returned if a write error occurs; otherwise the character$wc$is
+returned
+
+Description~
+This is just like$fputwc()$, except that it can be implement as a macro,
+making it faster. One consequence is that it may evaluate the$stream$argument
+more than once, which is an exception to the general rule for macros.$putwc()$
+is usually the best function to use for writing a single wide character.
+
+
+
+putwchar() Macro *crv-putwchar*
+----------------
+Synopsis~
+ $#include <wchar.h>$
+ $wint_t putwchar(wchar_t wc);$
+
+Return~
+$WEOF$is returned if a write error occurs; otherwise the character$wc$is
+returned
+
+Description~
+The$putwchar()$function is equivalent to$putwc()$with$stdout$as the value
+of the stream argument.
+
+
+
+fwide() Function *crv-fwide*
+----------------
+Synopsis~
+ $#include <stdio.h>$
+ $#include <wchar.h>$
+ $int fwide(FILE *stream, int mode);$
+
+Return~
+The$fwide()$function returns a negative value, zero, or a positive value if
+the stream is narrow, not at all, or wide oriented respectively.
+
+Description~
+The$fwide()$function can be used to set and query the state of the orientation
+of the stream$stream$. If the$mode$parameter has a positive value the streams
+get wide oriented, for negative values narrow oriented. It is not possible
+to overwrite previous orientations with$fwide()$. I.e., if the stream$stream$
+was already oriented before the call nothing is done.
+
+If$mode$is zero the current orientation state is queried and nothing is
+changed.
+
+
+
+
+------------------------------------------------------------------------------
+II.24.5 String Utilities *crv-libWCHStrng*
+
+
+II.24.5.1 Numeric Conversions *crv-libWCHNum*
+------------------------------
+
+Quicklink:
+ $wcstod()$ Func |crv-wcstod|
+ $wcstof()$ Func |crv-wcstof|
+ $wcstold()$ Func |crv-wcstold|
+ $wcstol()$ Func |crv-wcstol|
+ $wcstoll()$ Func |crv-wcstoll|
+ $wcstoul()$ Func |crv-wcstoul|
+ $wcstoull()$ Func |crv-wcstoull|
+
+
+
+wcstod() Function *crv-wcstod*
+wcstof() Function *crv-wcstof*
+wcstold() Function *crv-wcstold*
+------------------
+Synopsis~
+ $#include <wchar.h>$
+ $double wcstod(const wchar_t *restrict string, wchar_t **restrict tailptr);$
+ $float wcstof(const wchar_t *string, wchar_t **tailptr);$
+ $long double wcstold(const wchar_t *string, wchar_t **tailptr);$
+
+Description~
+The$wcstod()$,$wcstof()$, and$wcstol()$functions are equivalent in nearly all
+aspect to the$strtod()$,$strtof()$, and$strtold()$functions but it handles
+wide character string.
+
+
+
+wcstol() Function *crv-wcstol*
+wcstoll() Function *crv-wcstoll*
+wcstoul() Function *crv-wcstoul*
+wcstoull() Function *crv-wcstoull*
+-------------------
+Synopsis~
+ $#include <wchar.h>$
+ $long int wcstol(const wchar_t *restrict string,$
+ $wchar_t **restrict tailptr, int base);$
+ $long long int wcstoll(const wchar_t *restrict string,$
+ $wchar_t **restrict tailptr, int base);$
+ $unsigned long int wcstoul(const wchar_t *restrict string,$
+ $wchar_t **restrict tailptr, int base);$
+ $unsigned long long int wcstoull(const wchar_t *restrict string,$
+ $wchar_t **restrict tailptr, int base);$
+
+Description~
+The$wcstol()$,$wcstoll()$,$wcstoul()$,$wcstoull()$functions are equivalent in
+nearly all aspectes to$strtol()$,$strstoll()$,$strtoul()$,$strtoull()$
+functions but handels wide character string.
+
+
+
+
+II.24.5.2 Copying *crv-libWCHCopy*
+------------------
+
+Quicklink:
+ $wcscpy()$ Func |crv-wcscpy|
+ $wcsncpy()$ Func |crv-wcsncpy|
+ $wmemcpy()$ Func |crv-wmemcpy|
+ $wmemmove()$ Func |crv-wmemmove|
+
+
+wcscpy() Function *crv-wcscpy*
+-----------------
+Synopsis~
+ $#include <wchar.h>$
+ $wchar_t *wcscpy(wchar_t *restrict wto, const wchar_t *restrict wfrom);$
+
+Return~
+value is the value of$wto$
+
+Description~
+This copies wide characters from the string$wfrom$(up to and including the
+terminating null wide character) into the string$wto$. Like$wmemcpy()$, this
+function has undefined results if the strings overlap.
+
+
+
+wcsncpy() Function *crv-wcsncpy*
+------------------
+Synopsis~
+ $#include <wchar.h>$
+ $wchar_t *wcsncpy(wchar_t *restrict wto, const wchar_t *restrict wfrom,$
+ $size_t size);$
+
+Return~
+value is the value of$wto$
+
+Description~
+This function is similar to$wcscpy()$but always copies exactly$size$wide
+characters into$wto$.
+
+If the length of$wfrom$is more than$size$, then$wcsncpy()$copies just the
+first$size$wide characters. Note that in this case there is no null
+terminator written into$wto$.
+
+If the length of$wfrom$is less than$size$, then$wcsncpy()$copies all of
+$wfrom$, followed by enough null wide characters to add up to$size$wide
+characters in all.
+
+The behavior of$wcsncpy()$is undefined if the strings overlap.
+
+
+
+wmemcpy() Function *crv-wmemcpy*
+------------------
+Synopsis~
+ $#include <wchar.h>$
+ $wchar_t *wmemcpy(wchar_t *restrict wto, const wchar_t *restruct wfrom,$
+ $size_t size);$
+
+Return~
+value is the value of$wto$
+
+Description~
+The$wmemcpy()$function copies$size$wide characters from the object beginning
+at$wfrom$into the object beginning at$wto$. The behavior of this function is
+undefined if the two arrays$wto$and$wfrom$overlap; use$wmemmove()$instead if
+overlapping is possible.
+
+
+
+wmemmove() Function *crv-wmemmove*
+-------------------
+Synopsis~
+ $#include <wchar.h>$
+ $wchar_t *wmemmove(wchar *wto, const wchar_t *wfrom, size_t size);$
+
+Return~
+value is the value of$wto$
+
+Description~
+This function copies the$size$wide characters at$wfrom$into the$size$wide
+characters at$wto$, even if those two blocks of space overlap. In the case of
+overlap,$memmove()$is careful to copy the original values of the wide
+characters in the block at$wfrom$, including those wide characters which also
+belong to the block at$wto$.
+
+
+
+
+II.24.5.3 Concatenation *crv-libWCHConcat*
+------------------------
+
+Quicklink:
+ $wcscat()$ Func |crv-wcscat|
+ $wcsncat()$ Func |crv-wcsncat|
+
+
+wcscat() Function *crv-wcscat*
+-----------------
+Synopsis~
+ $#include <wchar.h>$
+ $wchar_t *wcscat(wchar_t *restrict wto, const wchar_t *restrict wfrom);$
+
+Return~
+value is the value of$wto$
+
+Description~
+The$wcscat()$function is similar to$wcscpy()$, except that the characters
+fromw$from$are concatenated or appended to the end of$wto$, instead of
+overwriting it. That is, the first character from$wfrom$overwrites the null
+character marking the end of$wto$.
+
+
+
+wcsncat() Function *crv-wcsncat*
+------------------
+Synopsis~
+ $#include <wchar.h>$
+ $wchar_t *wcsncat(wchar_t *restrict wto, const wchar_t *restrict wfrom,$
+ $size_t size);$
+
+Return~
+value is the value of$wto$
+
+Description~
+This function is like$wcscat()$except that not more than$size$characters
+from$from$are appended to the end of$wto$. A single null character is also
+always appended to$wto$, so the total allocated size of$wto$ must be at least
+$size + 1$bytes longer than its initial length.
+
+
+
+
+II.24.5.4 Comparison *crv-libWCHCmp*
+---------------------
+
+Quicklink:
+ $wcscmp()$ Func |crv-wcscmp|
+ $wcscoll()$ Func |crv-wcscoll|
+ $wcsncmp()$ Func |crv-wcsncmp|
+ $wcsxfrm()$ Func |crv-wcsxfrm|
+ $wmemcmp()$ Func |crv-wmemcmp|
+
+
+
+wcscmp() Function *crv-wcscmp*
+-----------------
+Synopsis~
+ $#include <wchar.h>$
+ $int wcscmp(const wchar_t *ws1, const wchar_t *ws2);$
+
+Return~
+The value returned is greater than, equal to, or less than zero, accordingly
+as the string pointed to by$ws1$is greater than, equal to, or less than the
+string pointed to by$ws2$.
+
+A consequence of the ordering used by$wcscmp()$is that if$ws1$is an initial
+substring of$ws2$, then$ws1$is considered to be "less than"$ws2$.
+
+Description~
+The$wcscmp()$function compares the wide character string$ws1$against$ws2$.
+
+
+
+wcscoll() Function *crv-wcscoll*
+------------------
+Synopsis~
+ $#include <wchar.h>$
+ $int wcscoll(const wchar_t *ws1, const wchar_t *ws2);$
+
+Return~
+The value returned is greater than, equal to, or less than zero, accordingly
+as the string pointed to by$ws1$is greater than, equal to, or less than the
+string pointed to by$ws2$.
+
+Description~
+The$wcscoll()$function is similar to$wcscmp()$but uses the collating sequence
+of the current locale for collation (the$LC_COLLATE$locale).
+
+
+
+wcsncmp() Function *crv-wcsncmp*
+------------------
+Synopsis~
+ $#include <wchar.h>$
+ $int wcsncmp(const wchar_t *ws1, const wchar_t *ws2, size_t size);$
+
+Return~
+The value returned is greater than, equal to, or less than zero, accordingly
+as the string pointed to by$ws1$is greater than, equal to, or less than the
+string pointed to by$ws2$.
+
+Description~
+This function is the similar to$wcscmp()$, except that no more than$size$wide
+characters are compared. In other words, if the two strings are the same in
+their first$size$wide characters, the return value is zero.
+
+
+
+wcsxfrm() Function *crv-wcsxfrm*
+------------------
+Synopsis~
+ $#include <wchar.h>$
+ $size_t wcsxfrm(wchar_t *restrict wto, const wchar_t *wfrom, size_t size);$
+
+Description~
+This function is the similar to$strxfrm()$but handles wide characters.
+See |crv-libstrxfrm| for further information on$strxfrm()$.
+
+
+
+wmemcmp() Function *crv-wmemcmp*
+------------------
+Synopsis~
+ $#include <wchar.h>$
+ $int wmemcmp(const wchar_t *a1, const wchar_t *a2, size_t size);$
+
+Return~
+The value returned is greater than, equal to, or less than zero, accordingly
+as the string pointed to by$a1$is greater than, equal to, or less than the
+string pointed to by$a2$.
+
+Description~
+The function$wmemcmp()$compares the$size$wide characters beginning at$a1$
+against the$size$wide characters beginning at$a2$.
+
+
+
+
+II.24.5.5 Search *crv-libWCHSearch*
+-----------------
+
+Quicklink:
+ $wcschr()$ Func |crv-wcschr|
+ $wcscspn()$ Func |crv-wcscspn|
+ $wcspbrk()$ Func |crv-wcspbrk|
+ $wcsrchr()$ Func |crv-wcsrchr|
+ $wcsspn()$ Func |crv-wcsspn|
+ $wcsstr()$ Func |crv-wcsstr|
+ $wcstok()$ Func |crv-wcstok|
+ $wmemchr()$ Func |crv-wmemchr|
+
+
+
+wcschr() Function *crv-wcschr*
+-----------------
+Synopsis~
+ $#include <wchar.h>$
+ $wchar_t * wcschr(const wchar_t *wstring, int wc);$
+
+Description~
+This function is the similar to$strchr()$but handles wide character.
+
+
+
+wcscspn() Function *crv-wcscspn*
+------------------
+Synopsis~
+ $#include <wchar.h>$
+ $size_t wcscspn(const wchar_t *wstring, const wchar_t *stopset);$
+
+Description~
+This function is the similar to$strspn()$but handles wide character.
+
+
+
+wcspbrk() Function *crv-wcspbrk*
+------------------
+Synopsis~
+ $#include <wchar.h>$
+ $wchar_t *wcspbrk (const wchar_t *wstring, const wchar_t *stopset);$
+
+Description~
+This function is the similar to$strpbrk()$but handles wide character.
+
+
+
+wcsrchr() Function *crv-wcsrchr*
+------------------
+Synopsis~
+ $#include <wchar.h>$
+ $wchar_t *wcsrchr (const wchar_t *wstring, wchar_t c);$
+
+Description~
+This function is the similar to$strrchr()$but handles wide character.
+
+
+
+wcsspn() Function *crv-wcsspn*
+-----------------
+Synopsis~
+ $#include <wchar.h>$
+ $size_t wcsspn(const wchar_t *wstring, const wchar_t *skipset);$
+
+Description~
+This function is the similar to$strspn()$but handles wide character.
+
+
+
+wcsstr() Function *crv-wcsstr*
+-----------------
+Synopsis~
+ $#include <wchar.h>$
+ $wchar_t *wcsstr(const wchar_t *haystack, const wchar_t *needle);$
+
+Description~
+This function is the similar to$strstr()$but handles wide character.
+
+
+
+wcstok() Function *crv-wcstok*
+-----------------
+Synopsis~
+ $#include <wchar.h>$
+ $wchar_t *wcstok(wchar_t *newstring, const char *delimiters);$
+
+Description~
+This function is the similar to$strtok()$but handles wide character.
+
+
+
+wmemchr() Function *crv-wmemchr*
+------------------
+Synopsis~
+ $#include <wchar.h>$
+ $wchar_t *wmemchr(const wchar_t *block, wchar_t wc, size_t size);$
+
+Description~
+This function is the similar to$memchr()$but handles wide character.
+
+
+
+
+II.24.5.6 Miscellaneous *crv-libWCHMisc*
+------------------------
+
+Quicklink:
+ $wmemset()$ Func |crv-wmemset|
+ $wcslen()$ Func |crv-wcslen|
+
+
+
+wcslen() Function *crv-wcslen*
+-----------------
+Synopsis~
+ $#include <wchar.h>$
+ $size_t wcslen(const wchar_t *ws);$
+
+Description~
+This function is the similar to$strlen()$but handles wide character.
+
+
+
+wmemset() Function *crv-wmemset*
+------------------
+Synopsis~
+ $#include <wchar.h>$
+ $wchar_t *wmemset(wchar_t *block, wchar_t wc, size_t size);$
+
+Description~
+This function is the similar to$memset()$but handles wide character.
+
+
+
+
+------------------------------------------------------------------------------
+II.24.6 Time Conversions *crv-libWCHTimeConv*
+
+Quicklink:
+ $wcsftime()$ Func |crv-wcsftime|
+
+
+
+wcsftime() Function *crv-wcsftime*
+-------------------
+Synopsis~
+ $#include <time.h>$
+ $#include <wchar.h>$
+ $size_t wcsftime(wchar_t *s, size_t size, const wchar_t *template,$
+ $const struct tm *brokentime);$
+
+Description~
+This function is the similar to$strftime()$but handles wide character.
+
+
+
+
+------------------------------------------------------------------------------
+II.24.7 Character Conversions *crv-libWCHCharConv*
+
+Quicklink:
+ $btowc()$ Func |crv-btowc|
+ $wctob()$ Func |crv-wctob|
+ $mbsinit()$ Func |crv-mbsinit|
+ $mbrlen()$ Fucn |crv-mbrlen|
+ $mbrtowc()$ Func |crv-mbrtowc|
+ $wcrtomb()$ Func |crv-wcrtomb|
+ $mbsrtowc()$ Func |crv-mbsrtowc|
+ $wcsrtombs()$ Func |crv-wcsrtombs|
+
+
+
+btowc() Function *crv-btowc*
+----------------
+Synopsis~
+ $#include <stdio.h>$
+ $#include <wchar.h>$
+ $wint_t btowc(int c);$
+
+Return~
+If ($unsigned char$)$c$is no valid single byte multibyte character or if$c$
+is$EOF$, the function returns$WEOF$. Otherwise the wide character
+representation of$c$is returned.
+
+Description~
+The$btowc()$function ("byte to wide character") converts a valid single byte
+character$c$in the initial shift state into the wide character equivalent
+using the conversion rules from the currently selected locale of the$LC_CTYPE$
+category.
+
+
+
+wctob() Function *crv-wctob*
+----------------
+Synopsis~
+ $#include <stdio.h>$
+ $#include <wchar.h>$
+ $int wctob(wint_t c);$
+
+Return~
+If the multibyte representation for this character in the initial state is
+exactly one byte long, the return value of this function is this character.
+Otherwise the return value is$EOF$.
+
+Description~
+The$wctob()$function ("wide character to byte") takes as the parameter a valid
+wide character.
+
+
+
+mbsinit() Function *crv-mbsinit*
+------------------
+Synopsis~
+ $#include <wchar.h>$
+ $int mbsinit(const mbstate_t *ps);$
+
+Return~
+If$ps$is a null pointer or the object is in the initial state the return value
+is nonzero. Otherwise it is zero.
+
+Description~
+The$mbsinit()$function determines whether the state object pointed to by$ps$is
+in the initial state.
+
+
+
+mbrlen() Fucntion *crv-mbrlen*
+-----------------
+Synopsis~
+ $#include <wchar.h>$
+ $size_t mbrlen(const char *restrict s, size_t n, mbstate_t *ps);$
+
+Return~
+see description
+
+Description~
+The$mbrlen()$function ("multibyte restartable length") computes the number of
+at most$n$bytes starting at$s$, which form the next valid and complete
+multibyte character.
+
+If the next multibyte character corresponds to the NUL wide character, the
+return value is 0. If the next$n$bytes form a valid multibyte character, the
+number of bytes belonging to this multibyte character byte sequence is
+returned.
+
+If the the first$n$bytes possibly form a valid multibyte character but the
+character is incomplete, the return value is$(size_t) - 2$. Otherwise the
+multibyte character sequence is invalid and the return value
+is$(size_t) - 1$.
+
+The multibyte sequence is interpreted in the state represented by the object
+pointed to by$ps$. If$ps$ is a null pointer, a state object local
+to$mbrlen()$is used.
+
+
+
+mbrtowc() Function *crv-mbrtowc*
+------------------
+Synopsis~
+ $#include <wchar.h>$
+ $size_t mbrtowc(wchar_t *restrict pwc, const char *restrict s,$
+ $size_t n, mbstate_t *restrict ps);$
+
+Return~
+see description
+
+Description~
+The$mbrtowc()$function ("multibyte restartable to wide character") converts
+the next multibyte character in the string pointed to by$s$into a wide
+character and stores it in the wide character string pointed to by$pwc$. The
+conversion is performed according to the locale currently selected for
+the$LC_CTYPE$category. If the conversion for the character set used in the
+locale requires a state, the multibyte string is interpreted in the state
+represented by the object pointed to by$ps$. If$ps$is a null pointer, a
+static, internal state variable used only by the$mbrtowc()$function is used.
+
+If the next multibyte character corresponds to the NUL wide character, the
+return value of the function is 0 and the state object is afterwards in the
+initial state. If the next$n$or fewer bytes form a correct multibyte
+character, the return value is the number of bytes starting from$s$that form
+the multibyte character. The conversion state is updated according to the
+bytes consumed in the conversion. In both cases the wide character (either
+the L'\0' or the one found in the conversion) is stored in the string
+pointed to by$pwc$if$pwc$is not null.
+
+If the first$n$bytes of the multibyte string possibly form a valid multibyte
+character but there are more than$n$bytes needed to complete it, the return
+value of the function is$(size_t) - 2$and no value is stored. Please note
+that this can happen even if$n$has a value greater than or equal
+to$MB_CUR_MAX$since the input might contain redundant shift sequences.
+
+If the first$n$bytes of the multibyte string cannot possibly form a valid
+multibyte character, no value is stored, the global variable$errno$is set to
+the value$EILSEQ$, and the function returns$(size_t) - 1$. The conversion
+state is afterwards undefined.
+
+
+
+wcrtomb() Function *crv-wcrtomb*
+-----------------
+Synopsis~
+ $#include <stdio.h>$
+ $#include <wchar.h>$
+ $size_t wcrtomb(char *restrict s, wchar_t wc, mbstate_t *restrict ps);$
+
+Return~
+see description
+
+Description~
+The$wcrtomb()$function ("wide character restartable to multibyte") converts a
+single wide character into a multibyte string corresponding to that wide
+character.
+
+If$s$is a null pointer, the function resets the state stored in the objects
+pointed to by$ps$(or the internal$mbstate_t$object) to the initial state. This
+can also be achieved by a call like this:
+
+ $wcrtombs(temp_buf, L'\0', ps)$
+
+since, if$s$is a null pointer,$wcrtomb()$performs as if it writes into an
+internal buffer, which is guaranteed to be large enough.
+
+If$wc$is the NUL wide character,$wcrtomb()$emits, if necessary, a shift
+sequence to get the state$ps$into the initial state followed by a single
+$NULL$byte, which is stored in the string$s$.
+
+Otherwise a byte sequence (possibly including shift sequences) is written into
+the string$s$. This only happens if$wc$is a valid wide character. If$wc$is no
+valid wide character, nothing is stored in the strings$s$,$errno$is set
+to$EILSEQ$, the conversion state in$ps$is undefined and the return value
+is$(size_t) - 1$.
+
+If no error occurred the function returns the number of bytes stored in the
+string$s$. This includes all bytes representing shift sequences.
+
+
+
+mbsrtowc() Function *crv-mbsrtowc*
+-------------------
+Synopsis~
+ $#include <stdio.h>$
+ $#include <wchar.h>$
+ $size_t mbsrtowcs(wchar_t *restrict dst, const char **restrict src,$
+ $size_t len, mbstate_t *restrict ps);$
+
+Return~
+see description
+
+Description~
+The$mbsrtowcs()$function ("multibyte string restartable to wide character
+string") converts an NUL-terminated multibyte character string at$*src$into an
+equivalent wide character string, including the NUL wide character at the end.
+The conversion is started using the state information from the object pointed
+to by$ps$or from an internal object of$mbsrtowcs()$if$ps$is a null pointer.
+Before returning, the state object is updated to match the state after the
+last converted character. The state is the initial state if the terminating
+NUL byte is reached and converted.
+
+If$dst$is not a null pointer, the result is stored in the array pointed to
+by$dst$; otherwise, the conversion result is not available since it is stored
+in an internal buffer.
+
+If$len$wide characters are stored in the array$dst$before reaching the end of
+the input string, the conversion stops and$len$is returned. If$dst$is a null
+pointer,$len$is never checked.
+
+Another reason for a premature return from the function call is if the input
+string contains an invalid multibyte sequence. In this case the global
+variable$errno$is set to$EILSEQ$and the function returns$(size_t) - 1$.
+
+In all other cases the function returns the number of wide characters
+converted during this call. If$dst$is not null,$mbsrtowcs()$stores in the
+pointer pointed to by$src$either a null pointer (if the NUL byte in the
+input string was reached) or the address of the byte following the last
+converted multibyte character.
+
+
+
+wcsrtombs() Function *crv-wcsrtombs*
+--------------------
+Synopsis~
+ $#include <stdio.h>$
+ $#include <wchar.h>$
+ $size_t wcsrtombs(char *restrict dst, const wchar_t **restrict src,$
+ $size_t len, mbstate_t *restrict ps);$
+
+Return~
+see description
+
+Description~
+The$wcsrtombs()$function ("wide character string restartable to multibyte
+string") converts the NUL-terminated wide character string at$*src$ into an
+equivalent multibyte character string and stores the result in the array
+pointed to by$dst$. The NUL wide character is also converted. The conversion
+starts in the state described in the object pointed to by$ps$or by a state
+object locally to$wcsrtombs()$in case$ps$is a null pointer. If$dst$is a
+null pointer, the conversion is performed as usual but the result is not
+available. If all characters of the input string were successfully converted
+and if$dst$is not a null pointer, the pointer pointed to by$src$gets assigned
+a null pointer.
+
+If one of the wide characters in the input string has no valid multibyte
+character equivalent, the conversion stops early, sets the global variable
+$errno$to$EILSEQ$, and returns$(size_t) - 1$.
+
+Another reason for a premature stop is if$dst$is not a null pointer and the
+next converted character would require more than$len$bytes in total to the
+array$dst$. In this case (and if$dest$is not a null pointer) the pointer
+pointed to by$src$is assigned a value pointing to the wide character right
+after the last one successfully converted.
+
+Except in the case of an encoding error the return value of the$wcsrtombs()$
+function is the number of bytes in all the multibyte character sequences
+stored in$dst$. Before returning the state in the object pointed to by$ps$
+(or the internal object in case$ps$is a null pointer) is updated to reflect
+the state after the last conversion. The state is the initial shift state
+in case the terminating NUL wide character was converted.
+
+
+
+
+==============================================================================
+II.25 <wctype.h> Wide Character *crv-libWctypeH*
+
+In this section wide character classification and mapping utilities are
+described.
+
+
+------------------------------------------------------------------------------
+II.25.1 Types *crv-libWTHType*
+
+Quicklink:
+ $wctrans_t$ Type |crv-wctrans_t|
+ $wctype_t$ Type |crv-wctype_t|
+ $wint_t$ Type |crv-wint_t|
+
+
+
+wint_t Type *crv-wint_t*
+-----------
+This is a data type used for parameters and variables that contain a single
+wide character.
+Also declared in$<wchar.h>$, see |crv-libwint_t2|.
+
+
+
+wctrans_t Type *crv-wctrans_t*
+--------------
+This data type is defined as a scalar type which can hold a value representing
+the locale-dependent character mapping. There is no way to construct such a
+value apart from using the return value of the$wctrans()$function.
+
+
+
+wctype_t Type *crv-wctype_t*
+-------------
+This type can hold a value which represents a character class. The only
+defined way to generate such a value is by using the$wctype()$function.
+
+
+
+
+------------------------------------------------------------------------------
+II.25.2 Macros *crv-libWTHMac*
+
+
+WEOF Macro *crv-WEOF*
+----------
+This macro expands to an expression of type$wint_t$that is returned by a
+number of wide stream functions to indicate an end-of-file condition, or some
+other error situation.
+Also declared in$<wchar.t>$, see |crv-WEOF2|.
+
+
+
+------------------------------------------------------------------------------
+II.25.3 Classification *crv-libWTHClass*
+
+
+II.25.3.1 Wide Character *crv-libWTHCwide*
+-------------------------
+
+Quicklink:
+ $iswalnum()$ Func |crv-iswalnum|
+ $iswalpha()$ Func |crv-iswalpha|
+ $iswblank()$ Func |crv-iswblank|
+ $iswcntrl()$ Func |crv-iswcntrl|
+ $iswdigit()$ Func |crv-iswdigit|
+ $iswgraph()$ Func |crv-iswgraph|
+ $iswlower()$ Func |crv-iswlower|
+ $iswprint()$ Func |crv-iswprint|
+ $iswpunct()$ Func |crv-iswpunct|
+ $iswspace()$ Func |crv-iswspace|
+ $iswupper()$ Func |crv-iswupper|
+ $iswxdigit()$ Func |crv-iswxdigit|
+
+
+
+iswalnum() Function *crv-iswalnum*
+-------------------
+Synopsis~
+ $#include <wctype.h>$
+ $int iswalnum(wint_t wc);$
+
+Description~
+This function returns a nonzero value if$wc$is an alphanumeric character (a
+letter or number); in other words, if either$iswalpha()$or$iswdigit()$is true
+of a character, then$iswalnum()$is also true.
+
+
+
+iswalpha() Function *crv-iswalpha*
+-------------------
+Synopsis~
+ $#include <wctype.h>$
+ $int iswalpha(wint_t wc);$
+
+Description~
+Returns true if$wc$is an alphabetic character (a letter). If$iswlower()$or
+$iswupper()$is true of a character, then$iswalpha()$is also true.
+
+
+
+iswblank() Function *crv-iswblank*
+-------------------
+Synopsis~
+ $#include <wctype.h>$
+ $int iswblank(wint_t wc);$
+
+Description~
+Returns true if$wc$is a blank character; that is, a space or a tab.
+
+
+
+iswcntrl() Function *crv-iswcntrl*
+-------------------
+Synopsis~
+ $#include <wctype.h>$
+ $int iswcntrl(wint_t wc);$
+
+Description~
+Returns true if$wc$is a control character (that is, a character that is not a
+printing character).
+
+
+
+iswdigit() Function *crv-iswdigit*
+-------------------
+Synopsis~
+ $#include <wctype.h>$
+ $int iswdigit(wint_t wc);$
+
+Description~
+Returns true if$wc$is a digit (e.g., 0 through 9). Please note that this
+function does not only return a nonzero value for decimal digits, but for
+all kinds of digits.
+
+
+
+iswgraph() Function *crv-iswgraph*
+-------------------
+Synopsis~
+ $#include <wctype.h>$
+ $int iswgraph(wint_t wc);$
+
+Description~
+Returns true if$wc$is a graphic character; that is, a character that has a
+glyph associated with it. The whitespace characters are not considered
+graphic.
+In other words: returns true if$iswprint()$is true and if$iswspace()$is false.
+
+
+
+iswlower() Function *crv-iswlower*
+-------------------
+Synopsis~
+ $#include <wctype.h>$
+ $int iswlower(wint_t wc);$
+
+Description~
+Returns true if$wc$is a lower-case letter.
+
+
+
+iswprint() Function *crv-iswprint*
+-------------------
+Synopsis~
+ $#include <wctype.h>$
+ $int iswprint(wint_t wc);$
+
+Description~
+Returns true if$wc$is a printing character. Printing characters include all
+the graphic characters, plus the space (" ") character.
+
+
+
+iswpunct() Function *crv-iswpunct*
+-------------------
+Synopsis~
+ $#include <wctype.h>$
+ $int iswpunct(wint_t wc);$
+
+Description~
+Returns true if$wc$is a punctuation character. This means any printing
+character that is not alphanumeric or a space character.
+
+
+
+iswspace() Function *crv-iswspace*
+-------------------
+Synopsis~
+ $#include <wctype.h>$
+ $int iswspace(wint_t wc);$
+
+Description~
+Returns true if$wc$is a whitespace character. In the standard "C" locale,
+$iswspace()$returns true for only the standard whitespace characters:
+
+ $L' '$ space
+ $L'\f'$ formfeed
+ $L'\n'$ newline
+ $L'\r'$ carriage return
+ $L'\t'$ horizontal tab
+ $L'\v'$ vertical tab
+
+
+
+iswupper() Function *crv-iswupper*
+-------------------
+Synopsis~
+ $#include <wctype.h>$
+ $int iswupper(wint_t wc);$
+
+Description~
+Returns true if$wc$is an upper-case letter.
+
+
+
+iswxdigit() Function *crv-iswxdigit*
+--------------------
+Synopsis~
+ $#include <wctype.h>$
+ $int iswxdigit(wint_t wc);$
+
+Description~
+Returns true if$wc$is a hexadecimal digit. Hexadecimal digits include the
+normal decimal digits 0 through 9 and the letters A through F and a through f.
+
+
+
+
+
+II.25.3.2 Extensible Wide Char *crv-libWTHCextens*
+-------------------------------
+
+Quicklink:
+ $iswctype()$ Func |crv-iswctype|
+ $wctype()$ Func |crv-wctype|
+
+
+iswctype() Function *crv-iswctype*
+-------------------
+Synopsis~
+ $#include <wctype.h>$
+ $int iswctype(wint_t wc, wctype_t desc);$
+
+Description~
+This function returns a nonzero value if$wc$is in the character class
+specified by$desc$.$desc$must previously be returned by a successful call
+to$wctype()$.
+
+
+
+wctype() Function *crv-wctype*
+-----------------
+Synopsis~
+ $#include <wctype.h>$
+ $wctype_t wctype(const char *property);$
+
+Description~
+The$wctype()$returns a value representing a class of wide characters which is
+identified by the string$property$. Beside some standard properties each
+locale can define its own ones. In case no$property$with the given name is
+known for the current locale selected for the$LC_CTYPE$category, the function
+returns zero.
+
+The properties known in every locale are:
+$"alnum"$
+$"alpha"$
+$"cntrl"$
+$"digit"$
+$"graph"$
+$"lower"$
+$"print"$
+$"punct"$
+$"space"$
+$"upper"$
+$"xdigit"$
+
+
+
+------------------------------------------------------------------------------
+II.25.4 Mapping *crv-libWTHMap*
+
+
+II.25.4.1 Wide Character *crv-libWTHMwide*
+-------------------------
+
+Quicklink:
+ $towlower()$ Func |crv-towlower|
+ $towupper()$ Func |crv-towupper|
+
+
+
+towlower() Function *crv-towlower*
+-------------------
+Synopsis~
+ $#include <wctype.h>$
+ $wint_t towlower(wint_t wc);$
+
+Return~
+lower-case letter
+
+Description~
+If$wc$is an upper-case letter,$towlower()$returns the corresponding lower-case
+letter. Otherwise$wc$is returned unchanged.
+
+
+
+towupper() Function *crv-towupper*
+-------------------
+Synopsis~
+ $#include <wctype.h>$
+ $wint_t towupper(wint_t wc);$
+
+Return~
+upper-case letter
+
+Description~
+If$wc$is a lower-case letter,$towupper()$returns the corresponding upper-case
+letter. Otherwise$wc$is returned unchanged.
+
+
+
+
+II.25.4.2 Extensible Wide Char *crv-libWTHMextens*
+-------------------------------
+
+Quicklink:
+ $towctrans()$ Func |crv-towctrans|
+ $wctrans()$ Func |crv-wctrans|
+
+
+
+towctrans() Function *crv-towctrans*
+--------------------
+Synopsis~
+ $#include <wctype.h>$
+ $wint_t towctrans(wint_t wc, wctrans_t desc);$
+
+Return~
+mapped value of$wc$
+
+Description~
+This function maps the input character$wc$according to the rules of the
+mapping for which$desc$is a descriptor, and returns the value it finds.$desc$
+must be obtained by a successful call to$wctrans()$.
+
+
+
+wctrans() Function *crv-wctrans*
+------------------
+Synopsis~
+ $#include <wctype.h>$
+ $wctrans_t wctrans(const char *property);$
+
+Return~
+0: mapping unknown
+else: mapping known
+
+Description~
+This function has to be used to find out whether a named mapping is defined in
+the current locale selected for the$LC_CTYPE$category. If the returned value
+is non-zero, it can be used afterwards in calls to$towctrans()$. If the return
+value is zero no such mapping is known in the current locale.
+
+Beside locale-specific mappings there are two mappings which are guaranteed
+to be available in every locale:
+$"tolower"$
+$"toupper"$
+
+
+
+
+==============================================================================
+Appendix A GLOSSARY *crv-glossary*
+
+
+ *crv-gloAlignment*
+Alignment Requirement that objects of a particular type be located on
+ storage boundaries with addresses that are particular
+ multiples of a byte address.
+
+ *crv-gloArgument*
+Argument An argument is an expression in a comma-separated list bounded
+ by parentheses in a function call or macro invocation.
+
+ *crv-gloArray*
+Array Set of elements that have the same data type.
+
+ *crv-gloBinary*
+Binary see Operator |crv-gloOperator|
+
+ *crv-gloBlock*
+Block C statements enclosed within braces ({...})
+
+ *crv-gloCompState*
+Compound A compound statement is a block (see |crv-gloBlock|)
+Statement
+ *crv-gloDataType*
+Data Type see Type |crv-gloType|
+
+ *crv-gloDeclaration*
+Declaration A C construct that associates the attributes of a variable,
+ type or function with a name. A declaration does not need
+ memory, opposed to a definition (-> Definition).
+
+ Example:
+>
+ struct MeasVar {
+ int nCntr;
+ int nNumOfCycles;
+ float fResult;
+ };
+<
+ *crv-gloDefinition*
+Definition A C construct that specifies the name, formal parameters, body
+ and return type of a function or that initializes and allocates
+ storage for a variable. A definition needs memory, opposed
+ to a declaration (-> Declaration).
+
+ Example:
+>
+ struct MeasVar mv;
+<
+ *crv-gloExpression*
+Expression An expression is a sequence of operators and operands that
+ specifies computation of a value or that designates an object
+ or function.
+ See |crv-gloOperand|, |crv-gloOperator|
+
+
+False / True see |crv-gloTrueFalse|
+
+ *crv-gloIdentifier*
+Identifier An identifier is a name of a variable, function, macro...
+ Valid identifiers consists of uppercase and lowercase Latin
+ letters [a-z], [A-Z] and digits [0-9] and the underscore _.
+ They must start with a letter or underscore and must be
+ different to keywords.
+
+ *crv-gloLifetime*
+Lifetime The lifetime of a variable is the portion of program execution
+ during which storage is guaranteed to be reserved for it.
+ Throughout its lifetime a variable exists, has a fix address
+ and retains its last assigned value.
+
+ *crv-gloLinkage*
+Linkage Linkage is used to extend the scope of a variable or function
+ to the actual context. The keyword$extern$is used for that.
+
+ *crv-gloLvalue*
+lvalue A lvalue is an epxression that describes the location of an
+ object. The location is the object's lvalue. The object's rvalue
+ is the value stored at the location described by the lvalue.
+
+ *crv-gloLvalueMod*
+lvalue, A modifiable lvalue is an expression representing an object that
+modifialbe can be changed.
+ A lvalue is a modifiable lvalue if:
+ - it has no array type
+ - it has no incomplete type
+ - it has no$const$type
+ - it has struct or union type and no$const$member
+
+ *crv-gloMacro*
+Macro An identifier that is equated to a text or symbolic expression
+ to which it is to be expanded by the preprocessor.
+
+ *crv-gloObject*
+Object An area of memory used by a variable, the contents represents
+ values.
+
+ *crv-gloOperand*
+Operand Parameter of an operator.
+ Example:
+ $a = b * c$
+
+ $*$is the operator, $a$and$b$are the operands
+ $b * c$is an expression
+
+ *crv-gloOperator*
+Operator An operator is used with operands to build an expression.
+ Example:
+ $a = b * c$
+
+ $*$is the operator, $a$and$b$are the operands
+ $b * c$is an expression
+
+ An operator with two operands is called binary *crv-gloOpBinary*
+ e.g. *, /, +, ...
+ An operator with one operand is called unary. *crv-gloOpUnary*
+ e.g. - (sign), ++, --, ....
+
+ *crv-gloParameter*
+Parameter A parameter is the value that is passed to a function or macro.
+ In principle there are two ways parameters can be passed:
+ - By Value
+ This means that the function/macro works with a copy of
+ the parameter. Thus the value of the parameter can be
+ changed within the function/macro, but from caller's
+ view the parameter will keep its original value.
+ - By Reference
+ This means that the function/macro works with the
+ original parameter. Thus a caller of a function/macro
+ will "see" changes done to the parameter within
+ the function/macro.
+ C always uses pass by value. Use pointers to simulate a pass
+ by reference.
+
+ *crv-gloPointer*
+Pointer A variable that contains the address of a C element (variable,
+ structure, function) or memory area.
+
+ *crv-gloPreprocessor*
+Preprocessor A preprocessor is the first pass of a compiler. It does:
+ - read include files
+ - expand macros
+ - replace defines by their contents
+ - pass control directives to the compiler
+
+ *crv-gloPromote*
+Promote Promoting is a type cast from a "lower" type to a "higher"
+ type, e.g. from int to long.
+
+ *crv-gloPrototype*
+Prototype A function prototype is a declaration of a function that declares
+ the types of its parameters.
+
+ *crv-gloRvalue*
+rvalue A rvalue is the value of an expression.
+ See also lvalue |crv-gloLvalue|.
+
+ *crv-gloScope*
+Scope Scope is the visibility of a C element (variable, function)
+ within a program. The scope are the sections of a program where
+ an element can be referenced by name. The scope of an element
+ may be limited to file, function or block.
+ The scope of an element is determined from where it is defined.
+ If it is defined outside of a block, it has file scope.
+ If it is defined within a function prototype, it has function
+ scope.
+ If it is defined within a block, it has block scope.
+
+ *crv-gloSemantics*
+Semantics The relationships between symbols and their meanings.
+
+ *crv-gloSideEffect*
+Side-Effect During evaluation of an expression the value of a variable is
+ changed. Example:
+>
+ b = (a = 2) * (a *= 3)
+<
+ NOTE: To keep a program maintainable and readable don't use
+ side-effects.
+
+ *crv-gloSignExtension*
+Sign- Sign-extension is the filling of the left most bits with the
+Extension state of the sign-bit when shifting right or when promoting.
+
+ *crv-gloStatement*
+Statement A statement is an expression followed by a semicolon.
+ see |crv-gloExpression|
+
+ *crv-gloStructure*
+Structure A set of elements that have possibly different data types. A
+ structure groups them together.
+
+ *crv-gloSyntax*
+Syntax A syntax describes the structure and order of the elements
+ of a language statement. In other words: it specifies how words
+ and symbols are put together to form a program.
+
+ Example for Syntax versus Semantics:
+ The syntax rules of a human language could be:
+ - each word must be build with the characters a-z or A-Z
+ - words are separated by at least one space (" ").
+ - words must start either with an upper or lower character,
+ the following characters must be lower ones
+ - a sentence consists of words
+ - the first word of a sentence must start with an upper
+ character, the others with a lower one
+ - a sentence ends with a point (.)
+
+ Following these rules, this would be a valid sentence:
+ "The weather is fine today."
+
+ But this one would also be a syntactically correct
+ sentence:
+ "Thkds sdfasd ksdf dsf dfklsflsd."
+
+ The semantics of a language connects words with meanings.
+ Thus the second sentence is a semantically incorrect sentence.
+
+ So a language is defined by its semantics AND syntax.
+ The syntax defines how to form words and the semantics gives
+ words a meaning.
+
+ *crv-gloToken*
+Token Tokens are the minimal lexical elements of a programming
+ language. A token can be a keyword, an identifier, a constant,
+ a string literal, an operator or a punctuator.
+
+ *crv-gloTrueFalse*
+True / False In standard C an expression is FALSE if its value is 0, else
+ it is TRUE. The value of a logical TRUE is implementation
+ specific.
+ So never do something like
+ $if (IsWindowOpen() == TRUE)$
+ instead of this do
+ $if (IsWindowOpen())$
+ or
+ $if (IsWindowOpen() != FALSE)$
+
+ *crv-gloType*
+Type The meaning of a value stored in an object or returned by a
+ function is determined by its type.
+
+ *crv-gloTypeIncomplete*
+Type, An incomplete type describes an object but lacks information to
+incomplete determine its size.
+ E.g. an array type of unknown size is an incomplete type.
+
+ *crv-gloTypeCast*
+Type Cast A type cast is an operation in which an operand of one type is
+ converted to another type. In C the cast operator
+ is$(type-name)$.
+ Example:
+>
+ int main(void)
+ {
+ int nVar = 42;
+ float fVar;
+
+ fVar = (float)nVar;
+ }
+<
+ *crv-gloUnary*
+Unary see Operator |crv-gloOperator|
+
+ *crv-gloVariable*
+Variable Is the symbolic representation of a memory area.
+
+ *crv-gloWhiteSpace*
+White-Space A space, tab, carriage return, new line, vertical tab, or
+ formfeed character.
+
+
+
+==============================================================================
+Appendix B BIBLIOGRAPHY *crv-bibliography*
+
+[1] "Erfolgreich programmieren mit C", 1. Auflage, 1985
+ J. Anton Illik
+ SYBEX Verlag GmbH, Duesseldorf (Germany)
+
+[2] "Softwareentwicklung in C", 3. September 2001
+ Klaus Schmaranz
+ Springer Verlag
+
+[3] "The GNU C Library Reference Manual", for Version 2.2.x of the GNU C
+ Library, Edition 0.10, last updated 2001-07-06
+ Copyright (C) 1993, 1994, 1995, 1996, 1997, 1998, 1999, 2001, 2002
+ Free Software Foundation, Inc.
+
+[4] ISO/IEC 9899:1999(E)
+ International Standard
+ Programming languages - C
+ Published by American National Standards Institute
+
+
+
+==============================================================================
+For Appendix C COPYRIGHT & LICENSES go to |crvdoc-copyright|
+
+
+==============================================================================
+For Appendix D AUTHOR go to |crvdoc-author|
+
+
+==============================================================================
+For Appendix E CREDITS go to |crvdoc-credits|
+
+
+==============================================================================
+For Appendix F HISTORY go to |crvdoc-history|
+
+
+
+------------------------------------------------------------------------------
+ vim:tw=78:ts=4:ft=help:norl: