The Embedded C++ specification

Version WP-AM-003, Copyright(C) 13, Oct. 1999 by the Embedded C++ Technical Committee

1 Scope

This document defines the specification of EC++, a subset of C++ for embedded systems programming, based on ISO/IEC 14882-1998. Here is a summary of the specification of EC++.

2.1 Phases of translation

Omit universal character name.
Because EC++ omits templates, templates locating(phase 8) no longer makes sense.

2.2 Character sets

Omit universal character name.
Omit basic execution wide-character set, execution wide-character set and null wide character.

2.10 Identifiers

Omit universal character name.
The word 'standard libraries' means 'EC++ libraries'.

2.11 Keywords

The C++ keywords from Table 3 shown below are not included in EC++, but are still reserved.
========================================================================
     +-----------------------------------------------------------+
     |catch         export     reinterpret_cast  throw   typename|
     |const_cast    mutable    static_cast       try     using   |
     |dynamic_cast  namespace  template          typeid  wchar_t |
     +-----------------------------------------------------------+
========================================================================

2.13 Literals

The word 'International Standard' means 'EC++ specification'. (footnote 21)

2.13.2 Character literals

Omit universal character name.

2.13.4 String literals

Omit universal character name.

3 Basic concepts

Omit template or namespace entities. <3rd par.>
Omit template names. <6th par.>

3.1 Declarations and definitions

Omit using-declaration and using-directive. <2nd par.>
Omit examples of namespace definition and using declaration. <3rd par.>
The word 'standard library' means 'EC++ library'. <4th par.'s example>

3.2 One definition rule

Omit template definition. <1st par.>
Because EC++ omits runtime type identification, the description related to typeid no longer makes sense. <2nd and 4th par.>
The word 'standard library' means 'EC++ library'. <3rd par.>
Because EC++ omits runtime type identification, the descriptions related to dynamic_cast no longer makes sense. <4th par.>
Although EC++ omits new style casts, static_cast semantics still make sense. <4th par.>
Because EC++ omits templates, the descriptions related to template no longer makes sense. <5th par.>

3.3 Declarative regions and scopes

Because EC++ omits namespaces, there are no using-directives. <3rd par.>
Because EC++ omits templates, there are no function templates nor class templates. <4th par.>

3.3.1 Point of declaration

Because EC++ omits namespaces, namespace scope means global scope. <5th and 6th par.>
Because EC++ omits templates, the 7th paragraph no longer makes sense.

3.3.2 Local scope

Because EC++ omits exceptions, a function never has a function try-block. <2nd par.>
Because EC++ omits exceptions, the 3rd paragraph no longer makes sense.

3.3.5 Namespace scope

Omit this whole subsection.

3.3.7 Name hiding

Because EC++ omits namespaces, the 4th paragraph no longer makes sense.

3.4 Name look up

Because EC++ omits namespaces, there are no namespace-names. <1st par.>

3.4.1 Unqualified name lookup

Because EC++ omits namespaces, the 2nd, 5th and 6th paragraphs no longer make sense.
Because EC++ omits namespaces, omit the description related to user-declared namespace. <4th par.>
Because EC++ omits namespaces, the latter half no longer makes sense. <footnote 28>
Because EC++ omits namespaces, the 4th items no longer makes sense. <7th par.>
Because EC++ omits namespaces, the latter half no longer makes sense. <footnote 30>
Because EC++ omits namespaces, the 5th items no longer makes sense. <8th par.>
Because EC++ omits namespaces, there are no namespace member function definitions. <9th par.>
Because EC++ omits templates, omit the description related to template. <10th par.>
Because EC++ omits namespaces, namespace scope means global scope. <11th par.>
Because EC++ omits exceptions and templates, the 13th and 14th paragraphs no longer make sense.

3.4.2 Argument-dependent name lookup

Because EC++ omits templates, there is no template argument. <1st and 2nd par.>
Because EC++ omits namespaces, there is no associated namespaces. <2nd par.>
Because EC++ omits templates, the 8th item no longer makes sense. <2nd par.>
Because EC++ omits namespaces, the 3rd paragraph no longer makes sense.

3.4.3 Qualified name lookup

Because EC++ omits namespaces, namespace name never be referred to after :: scope resolution operator. <1st par.>
Because EC++ omits namespaces, namespace scope means global scope. <3rd and 5th par.>
Because EC++ omits namespaces, there is no using-directive. <4th par.>

3.4.3.1 Class members

Because EC++ omits templates, the 3rd item no longer makes sense. <1st par.>

3.4.3.2 Namespace members

Omit this whole subsection.

3.4.5 Class member access

Because EC++ omits templates, the 1st paragraph no longer makes sense.
Because EC++ omits namespaces, there is no namespace-name. <4th and 5th par.>
Because EC++ omits multiple inheritances, the 4th paragraph's example no longer makes sense.
Because EC++ omits templates, the 6th paragraph no longer makes sense.

3.4.6 Using-directives and namespace aliases

Omit this whole subsection.

3.5 Program and linkage

Because EC++ omits templates and namespaces, the descriptions related to template or namespace no longer make sense. <2nd, 3rd, 4th, 6th, 7th, 8th and 9th par.>

3.6.1 Main function

Because EC++ omits namespaces, namespace scope means global scope.

3.6.2 Initialization of non-local objects

Because EC++ omits namespaces, namespace scope means global scope.
Because EC++ omits exceptions, the 4th paragraph no longer makes sense.

3.6.3 Termination

Because EC++ omits namespaces, namespace scope means global scope. <1st par.>

3.7.3 Dynamic storage duration

Because EC++ omits exceptions, so allocation and deallocation functions are as follows:
========================================================================
      void* operator new(size_t);
      void* operator new[](size_t);
      void operator delete(void*);
      void operator delete[](void*);
========================================================================
Because EC++ omits namespaces, std::size_t means size_t(global scope). <2nd par.>
Because EC++ omits exceptions, there is no std::bad_alloc. <2nd par.>

3.7.3.1 Allocation functions

Because EC++ omits namespaces, namespace scope means global scope. <1st par.>
Because EC++ omits templates, an allocation function never be a function template. <1st par.>
Because EC++ omits exceptions, an allocation function never throws an exception. <3rd par.>
The word 'standard library' means 'EC++ library'. <4th par.>
Because EC++ omits runtime type identification and exceptions, there is no type_info nor throw expression. <4th par.>

3.7.3.2 Deallocation functions

Because EC++ omits namespaces, namespace scope means global scope. <1st par.>
Because EC++ omits namespaces, std::size_t means size_t(global scope). <2nd par.>
Because EC++ omits exceptions, a deallocation function never be an instance of a function template <2nd par.>
The word 'standard library' means 'EC++ library'. <3rd and 4th par.>
Because EC++ omits exceptions, there is no operator new[](size_t, const std::nothrow_t&). <3rd par.>

3.8 Object Lifetime

The word 'International Standard' means 'EC++ specification'. <3rd par.>
Because EC++ omits runtime type identification, pointer never be used as the operand of a dynamic_cast. <5th par.>
Although EC++ omits new style casts, static_cast semantics still make sense. <5th and 6th par.>
Because EC++ omits runtime type identification, a lvalue never be used as the operand of a dynamic_cast nor typeid. <6th par.>
Because EC++ omits exceptions, the block is never exited with an exception. <8th par.>

3.9.1 Fundamental types

The word 'International Standard' means 'EC++ specification'. <6th and 7th par.>
Omit standard template numeric_limits. <8th par.>
Because EC++ omits runtime type identification, an expression never be the operand of typeid. <9th par.>

3.9.3 CV-qualifiers

Because EC++ omits mutable, all members are non-mutable. <3rd par.>
The word 'International Standard' means 'EC++ specification'. <5th par.>

3.10 Lvalues and rvalues

Because EC++ omits mutable, class type never has a mutable component. <13th par.>

4.2 Array-to-pointer conversion

Omit wide string literal and wchar_t. <2nd par.>

4.10 Pointer conversions

Because EC++ omits multiple inheritances, there is no ambiguous base class. <3rd par.>

4.11 Pointer to member conversions

Because EC++ omits multiple inheritances, there is no ambiguous base class. <2nd par.>

5 Expressions

The word 'Standard' means 'EC++ specifications'. <3rd par.>

5.1 Primary expressions

Because EC++ omits namespaces, there is no using-directive, and namespace scope means global scope. <4th par.>
Because EC++ omits templates, so the reduction rule for 'unqualified-id' and 'nested-name-specifier' are as follows:
========================================================================
    unqualified-id:
            identifier
            operator-function-id
            conversion-function-id
            ~ class-name
    nested-name-specifier:
            class-or-namespace-name :: nested-name-specifier_opt
========================================================================
On the reduction rule 'qualified-id : nested-name-specifier template_opt unqualified-id', template_opt is always NULL reduction.
On the reduction rule 'class-or-namespace-name', class-or-namespace-name is always class-name.
Because EC++ omits templates, a qualified-id never includes template keywords.
Because EC++ omits namespaces, the 8th paragraph no longer makes sense.
Because EC++ omits templates, the 11th paragraph no longer makes sense.

5.2 Postfix expressions

Because EC++ omits runtime type identification, so the reduction rule for 'postfix-expression' and 'pseudo-destructor-name' are as follows:
========================================================================
    postfix-expression:
            primary-expression
            postfix-expression [ expression ]
            postfix-expression ( expression-list_opt )
            simple-type-specifier ( expression-list_opt )
            postfix-expression . template_opt id-expression
            postfix-expression -> template_opt id-expression
            postfix-expression . pseudo-destructor-name
            postfix-expression -> pseudo-destructor-name
            postfix-expression ++
            postfix-expression --

    pseudo-destructor-name:
            ::_opt nested-name-specifier_opt type-name :: ~ type-name
            ::_opt nested-name-specifier_opt ~ type-name
========================================================================
On the reduction rule 'postfix-expression : postfix-expression . template_opt ::_opt id-expression', template_opt is always NULL reduction.
On the reduction rule 'postfix-expression : postfix-expression -> template_opt ::_opt id-expression', template_opt is always NULL reduction.

5.2.2 Function call

Because EC++ omits exceptions, constructor and destructor never throw an exception. <4th par.>
Although EC++ omits new style casts, const_cast semantics still makes sense. <5th par.>

5.2.5 Class member access

Because EC++ omits templates, postfix-expression never includes template keyword. <1st par.>
Because EC++ omits mutable, the type of E1.E2 is always 'cq12 vq12 T'. <4th par.>

5.2.7 Dynamic cast

Because EC++ omits runtime type identification, this whole subsection no longer makes sense.

5.2.8 Type identification

Because EC++ omits runtime type identification, this whole subsection no longer makes sense.

5.2.9 Static cast

Although EC++ omits new style casts, this whole subsection still makes sense to explain semantics of old style cast.

5.2.10 Reinterpret cast

Although EC++ omits new style casts, this whole subsection still makes sense to explain semantics of old style cast.

5.2.11 Const cast

Although EC++ omits new style casts, this whole subsection still makes sense to explain semantics of old style cast.

5.3.1 Unary operators

Because EC++ omits mutable, the last note no longer makes sense. <2nd par.>

5.3.3 Sizeof

Because EC++ omits multiple inheritances, there is no virtual base classes. <footnote 70>
The word 'standard header' means 'EC++ header'. <6th par.>

5.3.4 New

Because EC++ omits exceptions, new expression never terminate by throwing an exception. <8th par.>
Because EC++ omits namespaces, std::size_t means size_t(global scope). <10th and 12th par.>
Because EC++ omits exceptions, allocation expression never throws an exception, and the behavior is undefined when allocation function fails to allocate storage. <13th par.>
Because EC++ omits exceptions, the 17th paragraph no longer makes sense.
Because EC++ omits exceptions, allocation function never exits using an exception. <21th par.>

5.4 Explicit type conversion(cast notation)

Although EC++ omits new style casts, this whole subsection still makes sense to explain semantics of old style cast.

5.5 Pointer-to-member operators

Because EC++ omits mutable, there is no pointer to member that refers to a mutable member. <5th par.>

5.16 Conditional operator

Because EC++ omits exceptions, conditional operator never has a throw-expression operands. <2nd par.>

5.17 Assignment operators

Because EC++ omits exceptions, so the reduction rule for 'assignment-expression' is as follows:
========================================================================
    assignment-expression:
        conditional-expression
        logical-or-expression assignment-operator assignment-expression
========================================================================

5.19 Constant expressions

Because EC++ omits templates, integral constant-expression never involves non-type template parameters of integral. <1st par.>
Because EC++ omits templates, address constant-expression's pointer never be created using a non-type template parameter of pointer type. <4th par.>
Because EC++ omits runtime type identification, there is no dynamic_cast. <4th and 5th par.>
Because EC++ omits templates, there is no template parameter. <5th par.>

6 Statements

Because EC++ omits exceptions, so the reduction rule for 'statement' is as follows:
========================================================================
    statement:
            labeled-statement
            expression-statement
            compound-statement
            selection-statement
            iteration-statement
            jump-statement
            declaration-statement
========================================================================

6.7 Declaration statement

Because EC++ omits namespaces, namespace scope means global scope. <4th par.>
Because EC++ omits exceptions, initialization never exits by throwing an exception. <4th par.>

6.8 Ambiguity resolution

Because EC++ omits templates, there are no class templates nor template parameters. <3rd par.>

7 Declarations

Because EC++ omits templates and namespaces, so the reduction rules for 'declaration' and 'block-declaration' are as follows:
========================================================================
    declaration:
            block-declaration
            function-definition
            linkage-specification

    block-declaration:
            simple-declaration
            asm-definition
========================================================================

7.1.1 Storage class specifiers

Because EC++ omits mutable, so the reduction rule for 'storage-class-specifier' is as follows:
========================================================================
    storage-class-specifier:
            auto
            register
            static
            extern
========================================================================
Because EC++ omits templates, there is no explicit specialization nor explicit instantiation. <1st par.>
Because EC++ omits namespaces, namespace scope means global scope. <6th par.>
Because EC++ omits mutable, descriptions related to mutable no longer makes sense. <8th and 9th par.>

7.1.5 Type specifiers

Because EC++ omits templates, redundant cv-qualifiers are not introduced through the use of template type arguments. <1st par.>

7.1.5.1 The cv-qualifiers

Because EC++ omits namespaces, namespace scope means global scope. <1st par.>
Because EC++ omits mutable, all attempt to modify a const object during its lifetime results in undefined behavior. <4th par.>
Because EC++ omits new style casts, the 5th paragraph's example is as follows:
========================================================================
    const int ci = 3;               // cv-qualified (initialized as required)
    ci = 4;                         // ill-formed: attempt to modify const

    int i = 2;                      // not cv-qualified
    const int* cip;                 // pointer to const int
    cip = &i;                       // OK: cv-qualified access path to unqualified
    *cip = 4;                       // ill-formed: attempt to modify through ptr to const

    int* ip;
    ip = (int*)(cip);               // cast needed to convert const int* to int*
    *ip = 4;                        // defined: *ip points to i, a non-const object

    const int* ciq = new const int (3);     // initialized as required
    int* iq = (int*)(ciq);                  // cast required
    *iq = 4;                                // undefined: modifies a const object
========================================================================
Because EC++ omits mutable and runtime type identifications, the 6th paragraph's example no longer makes sense.

7.1.5.2 Simple type specifiers

Because EC++ omits templates, so the reduction rule for 'simple-type-specifier' is as follows:
========================================================================
    simple-type-specifier:
            ::_opt nested-name-specifier_opt type-name
            char
            bool
            short
            int
            long
            signed
            unsigned
            float
            double 
========================================================================

7.1.5.3 Elaborated type specifiers

Because EC++ omits runtime type identification and templates, so the reduction rule for 'elaborated-type-specifier' is as follows:
========================================================================
    elaborated-type-specifier:
            class-key ::_opt nested-name-specifier_opt identifier
            enum ::_opt nested-name-specifier_opt identifier
========================================================================
Because EC++ omits templates, there is no template type-parameter nor class template. <2nd par.>

7.3 Namespaces

Omit this whole section.

7.5 Linkage specifications

Because EC++ omits namespaces, namespace scope means global scope, and there are no namespace names that qualify the function name. <4th and 6th par.>
Because EC++ omits namespaces, the 6th paragraph's example no longer makes sense.

8 Declarators

In the reduction rule 'direct-declarator : direct-declarator ( parameter-declaration-clause ) cv-qualifier-seq_opt exception-specification_opt', exception-specification_opt is always NULL reduction. <4th par.>

8.1 Type names

Because EC++ omits runtime type identification, there is no typeid expression. <1st par.>
In the reduction rule 'direct-abstract-declarator : direct-abstract-declarator_opt ( parameter-declaration-clause ) cv-qualifier-seq_opt exception-specification_opt', exception-specification_opt is always NULL reduction. <1st par.>

8.2 Ambiguity resolution

Because EC++ omits templates, the 4th paragraph's example no longer makes sense.

8.3 Meaning of declarators

Because EC++ omits templates, there are no declarations of template specializations nor partial specializations. <1st par.>
Because EC++ omits namespaces, there is no namespace. <1st par.>
Because EC++ omits mutable, mutable specifier never applies to each declarator-id in a init-declarator-list. <2nd par.>

8.3.2 References

Because EC++ omits templates, there is no template type argument. <1st par.>

8.3.5 Functions

Because EC++ omits exceptions, in the form 'D1 ( parameter-declaration-clause ) cv-qualifier-seq_opt exception-specification_opt', exception-specification_opt is always NULL reduction. <1st par.>
The word 'standard header' means 'EC++ header'. <2nd par.>
Because EC++ omits exceptions, there is no exception specification. <4th par.>

8.3.6 Default arguments

Because EC++ omits templates, default argument expression is never specified in a template parameter. <3rd par.>
Because EC++ omits templates, all function is non-template function. <4th par.>
Because EC++ omits templates, there are no function templates nor class templates. <5th par.>
Because EC++ omits namespaces, there is no namespace and function declaration is never introduced by way of a using-declaration. <9th par.>

8.4 Function definitions

Because EC++ omits exceptions, so the reduction rule for 'function-definition' is as follows:
========================================================================
    function-definition:
        decl-specifier-seq_opt declarator ctor-initializer_opt function-body
========================================================================
In the function-definition syntax 'D1 ( parameter-declaration-clause ) cv-qualifier-seq_opt exception-specification_opt', exception-specification_opt is always NULL reduction. <1st par.>
Because EC++ omits namespaces, a function shall be defined only in global scope or class scope. <1st par.>

8.5 Initializers

Because EC++ omits namespaces, namespace scope means global scope. <2nd par.>
Because EC++ omits exceptions, there is no initialization that occurs in throwing an exception and handling an exception. <12th par.>
Because EC++ omits new style casts, direct-initialization never includes static_cast expression. <12th par.>

8.5.3 References

Because EC++ omits multiple inheritances, there is no ambiguous base class. <4th par.>

9 Classes

Because EC++ omits templates, so the reduction rules for 'class-name' and 'class-head' are as follows:
========================================================================
    class-name:
        identifier
    class-head:
        class-key identifier_opt base-clause_opt
        class-key nested-name-specifier identifier base-clause_opt
========================================================================

9.2 Class members

Because EC++ omits templates, so the reduction rule for 'member-declaration' is as follows:
========================================================================
    member-declarations:
        decl-specifier-seq_opt member-declarator-list_opt ;
        function-definition ;_opt
        ::_opt nested-name-specifier template_opt unqualified-id ;
        using-declaration
========================================================================
On the reduction rule 'member-declarations : ::_opt nested-name-specifier template_opt unqualified-id ;', template_opt is always NULL reduction.
Because EC++ omits templates, there is no member class template. <1st par.>
Because EC++ omits multiple inheritances, there is no virtual base classes. <12th par.>
Although EC++ omits new style casts, reinterpret_cast semantics still make sense. <17th par.>

9.3 Member functions

Because EC++ omits namespaces, namespace scope means global scope. <2nd and 3rd par.>
Because EC++ omits templates, there are no explicit specializations of template member functions. <2nd par.>

9.4 Static members

Because EC++ omits namespaces, namespace scope means global scope. <4th par.>

9.4.2 Static data members

Because EC++ omits namespaces, namespace scope means global scope. <2nd, 4th and 6th par.>
Because EC++ omits mutable, the 8th paragraph no longer makes sense.

9.5 Unions

Because EC++ omits namespaces, namespace scope means global scope. <3rd par.>

9.7 Nested class declarations

Because EC++ omits namespaces, namespace scope means global scope. <2nd and 3rd par.>

10 Derived classes

Because EC++ omits multiple inheritances, so the reduction rules for 'base-specifier-list' and 'base-specifier' are as follows:
========================================================================
    base-specifier-list:
            base-specifier
    base-specifier:
            ::_opt nested-name-specifier_opt class-name
========================================================================
Because EC++ omits multiple inheritances, there is no ambiguous base class. <1st par.>

10.1 Multiple base classes

Omit this whole section.

10.2 Member name lookup

Because EC++ omits multiple inheritances, there is no ambiguity.
Omit using-declaration for introducing base class member.
Because EC++ omits multiple inheritances, most examples no longer make sense.
Because EC++ omits multiple inheritances, the descriptions related to virtual base classes no longer make sense.

10.3 Virtual functions

Omit using-declaration for introducing base class member.
Because EC++ omits multiple inheritances, examples using multiple inheritances or virtual inheritances no longer make sense.

11 Member access control

Omit using-declarations for access control. <3rd par.>
Because EC++ omits templates, there are no function templates nor class templates. <7th par.>

11.3 Access declarations

Omit this whole section.

11.4 Friends

Because EC++ omits namespaces, namespace scope means global scope. <5th par.>

11.7 Multiple access

Omit this whole section.

12.1 Constructors

Because EC++ omits multiple inheritances, the condition that trivial constructor shall not have virtual base classes no longer makes sense. <5th par.>
Because EC++ omits exceptions, an implicitly-declared default constructor never has an exception-specification. <7th par.>

12.2 Temporary objects

Because EC++ omits exceptions, temporaries are never created at throwing an exception and entering a handler. <1st par.>
Because EC++ omits exceptions, the evaluation never ends in throwing an exception. <3rd par.>

12.3 Conversions

Because EC++ omits multiple inheritances, there are no ambiguous user-defined conversions. <2nd par.>

12.3.1 Conversion by constructor

Because EC++ omits new style cast, the last example of 2nd paragraph no longer makes sense.

12.4 Destructors

Because EC++ omits exceptions, an implicitly-declared destructor never has an exception-specification. <5th par.>
Because EC++ omits multiple inheritances, most derived class's destructor never calls the destructors for X's virtual base classes. <6th par.>
Because EC++ omits exceptions, there is no situation due to the handling of exceptions. <10th par.>

12.5 Free store

Because EC++ omits multiple inheritances, there is no lookup ambiguity. <4th par.>

12.6.2 Initializing bases and members

Because EC++ omits multiple inheritances, there are no virtual base classes.
Because EC++ omits multiple inheritances, the 2nd paragraph's examples no longer make sense.
Because EC++ omits multiple inheritances, so the 3rd paragraph's example is as follows:
========================================================================
    struct B { B(int); /* ... */ };
    struct D : B {
        D(int);
        B b;
        const int c;
    }
    D::D(int a) : B(a+1), c(a+3), b(a+4)
    { /* ... */ }
    D d(10);
========================================================================
Because EC++ omits multiple inheritances, the 2nd item no longer makes sense. <5th par.>
Because EC++ omits multiple inheritances, the 6th paragraph no longer makes sense.
Because EC++ omits runtime type identification, there is no typeid operator nor dynamic_cast operator. <8th and 9th par.>

12.7 Construction and destruction

Because EC++ omits multiple inheritances, omit the example using multiple inheritances and virtual inheritances.
Because EC++ omits runtime type identification, the 4th, 5th and 6th paragraphs no longer make sense.

12.8 Copying class objects

Because EC++ omits templates, there is no template constructor. <2nd and 3rd par. and footnote 106>
Because EC++ omits multiple inheritances, the condition that trivial copy constructor shall not have virtual base classes is no longer necessary. <6th par.>
Because EC++ omits multiple inheritances, there is no ambiguous copy constructor. <7th par.>
Because EC++ omits multiple inheritances, there is no virtual base classes. <7th and 8th par.>
Because EC++ omits exceptions, an implicitly-declared copy constructor never has an exception-specification. <7th par.>
Because EC++ omits templates, there is no template copy assignment operator. <9th par. and footnote 109>
Because EC++ omits using declaration, there is no assignment operator that brings in from a base class. <10th par.>
Because EC++ omits multiple inheritances, the condition that trivial copy assignment operator shall not have virtual base classes is no longer necessary. <11th par.>
Because EC++ omits exceptions, an implicitly-declared copy assignment operator never has an exception-specification. <12th par.>
Because EC++ omits multiple inheritances, the order in the base-specifier-list no longer makes sense. <13th par.>
Because EC++ omits multiple inheritances, the 13th paragraph's second topic no longer makes sense.

13.1 Overloadable declarations

There is no using-declaration nor using-directives. <1st par.>
Because EC++ omits templates, there is no member function template declaration. <2nd par.>

13.3.1 Candidate functions and argument lists

There is no non-conversion functions introduced by a using-declaration. <4th par.>
Because EC++ omits templates, the 7th paragraph no longer makes sense.

13.3.1.1 Function call syntax

Because EC++ omits templates, postfix-expression never is the name of a function template. <1st par.>

13.3.1.1.1 Call to named function

Because EC++ omits namespaces, there is no using-directive, and namespace scope means global scope. <footnote 116>.

13.3.1.2 Operators in expressions

Because EC++ omits templates, all non-member candidate is non-template. <3rd par.>

13.3.3 Best Viable Function

Because EC++ omits templates, the 2nd and 3rd definitions that decide which is a better function no longer make sense. <1st par.>

13.3.3.1.2 User-defined conversion sequences

Because EC++ omits templates, the 3rd paragraph no longer makes sense.

13.4 Address of overloaded function

Because EC++ omits templates, there is no template name. <1st par.>
Because EC++ omits templates, the 2nd and 4th paragraph no longer make sense.

14 Templates

Omit this whole chapter.

15 Exception handling

Omit this whole chapter.

16.8 Predefined macro names

The word 'standard' means 'EC++ specification'. <footnote 143>
The name '__embedded_cplusplus' is defined when compiling a EC++ translation unit.

17 Library introduction

Not include locales, containers and iterators. Omit exception processing. <2nd par.>
Omit predefined exception classes. <3rd par.> Replace the 4th paragraph, as follows:
========================================================================
4  The  strings  components  provide support for manipulating text
   represented as sequences of type  char.
========================================================================
Omit the containers and iterators. <5th par.>
Omit numeric algorithms. Omit the valarray components. <6th par.>
Omit locales and iterators. <7th par.>

17.1.2 character

This whole subsection is as follows:
========================================================================
    character means only char objects in Embedded C++ Standard library.
========================================================================

17.1.3 character container type

Omit this whole subsection.

17.1.5 component

This whole subsection is as follows:
========================================================================
     a group of library entities directly related as members,
     parameters,  or  return  types.   For  example,  the class string
     and the non-member functions that  operate  on strings are referred to
     as the  string component.
========================================================================

17.1.8 iostream class templates

This whole subsection is as follows:
========================================================================
class defined in clause 27.
========================================================================

17.1.11 narrow-oriented iostream classes

This whole subsection is as follows:
========================================================================
classes in Embedded C++ Standard library and The traditional iostream
classes are regarded as the narrow-oriented iostream classes (27.3.1).
========================================================================

17.1.12 NTCTS

Omit this whole subsection.

17.1.16 repositional stream

Omit this whole subsection.

17.1.18 traits class

Omit this whole subsection.

17.1.19 wide-oriented iostream classes

Omit this whole subsection.

17.3.1 Structure of each subclause

Omit 22th, 23th and 24th clauses from Table 10.

17.3.1.2 Requirements

Omit the 1st item of the list '- Template arguments'. <1st par.>
Omit containers and iterators from the 3rd item of the list. <1st par.>
Omit the 2nd and 3rd statements. <4th par.>
Omit the 2nd and 5th paragraphs.

17.3.1.3 Specifications

Omit the 3rd item of the list 'Restrictions on template arguments, if any'. <1st par.>
The 5th item of the list 'Throws: ...' in the 3rd paragraph is as follows:
========================================================================
   -  Throws: the  conditions that would cause the undefined behavior
========================================================================

17.3.2.1 Type descriptions

Omit the 1st paragraph.

17.3.2.1.2 Bitmask types

The 2nd paragraphs is as follows:
========================================================================
The bitmasks can be written:

     enum bitmask {
       V0 = 1 << 0,V1 = 1 << 1,V2 = 1 << 2, V3 = 1 << 3, .....
     };

     static const bitmask C0(V0);
     static const bitmask C1(V1);
     static const bitmask C2(V2);
     static const bitmask C3(V3);
       .....

     bitmask& operator&=(bitmask& X, bitmask Y) { X = bitmask(X & Y); return X;}
     bitmask& operator|=(bitmask& X, bitmask Y) { X = bitmask(X | Y); return X;}
     bitmask& operator^=(bitmask& X, bitmask Y) { X = bitmask(X ^ Y); return X;}
     bitmask  operator& (bitmask  X, bitmask Y) { return bitmask(X & Y);}
     bitmask  operator| (bitmask  X, bitmask Y) { return bitmask(X | Y);}
     bitmask  operator^ (bitmask  X, bitmask Y) { return bitmask(X ^ Y);}
     bitmask  operator~ (bitmask  X)            { return (bitmask)~X;}
========================================================================

17.3.2.1.3 Character sequences

Omit the statement preceded by 'which is' in the 2nd item. <1st par.>

17.3.2.1.3.2 Multibyte strings

Not include libraries for multibyte strings.

17.3.2.1.3.3 Wide-character sequences

Not include libraries for wide-character strings.

17.4.1.1 Library contents

Omit 'Templates' from the 1st paragraph. Omit the 2nd paragraph.

17.4.1.2 Headers

Omit headers <algorithm>, <bitset>,<deque>, <exception>, <fstream>, <functional>,<iterator>, <limits>, <list>, <locale>, <map>, <memory>, <numeric>,<queue>, <set>, <sstream>, <stack>, <stdexcept>, <typeinfo>, <utility>,<valarray> and <vector> from Table 11.
Table 11 is as follows:
========================================================================
     +-----------------------------------------------------------------+
     |               <complex>        <istream>                        |
     |               <iomanip>        <new>                            |
     |               <ios>            <ostream>                        |
     |               <iosfwd>         <streambuf>                      |
     |               <iostream>       <string>                         |
     +-----------------------------------------------------------------+
========================================================================
Omit headers <cassert>, <clocale>,<csignal>,<ctime>,<cwchar> and <cwctype> from Table 12.
Table 12 is as follows:
========================================================================
            +--------------------------------------------------+
            |<cctype>  <ciso646> <csetjmp> <cstdio>            |
            |<cerrno>  <climits> <cstdarg> <cstdlib>           |
            |<cfloat>  <cmath>   <cstdef> <cstring>            |
            +--------------------------------------------------+
========================================================================
Because EC++ omits namespaces, namespace scope means global scope. <4th par.>
Omit macro 'assert'. <5th par.>
Because EC++ omits namespaces, namespace scope means global scope in footnote 160).

17.4.1.3 Freestanding implementations

Omit subclauses 18.2, 18.5 and 18.6 from Table 13.

17.4.2.1 Headers

Omit the statement preceded by 'except'. <2nd par.>

17.4.3.1 Reserved names

Omit the 1st paragraph.

17.4.3.1.2 Global names

Omit footnote 165.

17.4.3.4 Replacement functions

Omit 'operator new(size_t, std::nothrow_t&)', 'operator new[](size_t, std::nothrow_t&)', 'operator delete(void *, std::nothrow_t&)' and 'operator delete(void *,std::nothrow_t&)' from the list. <2nd par.>

17.4.3.5 Handler functions

Omit both 'unexpected_handler' and 'terminate_handler' from the list. <1st par.>
Similarly omit both 'set_unexpected' and 'set_terminate' from the list. <2nd par.>
Omit ', and 18.6, Exception handling' from the 'SEE ALSO'.

17.4.3.6 Other functions

The 1st paragraph is as follows:
========================================================================
1  In certain cases (replacement functions, handler functions, operations
   on  types  used  in standard library components),  the C++ Standard
   library depends  on  components  supplied  by  a  C++
   program.   If  these  components  do  not meet their requirements, the
   Standard places no requirements on the implementation.
========================================================================
Omit the 3rd , 4th and last cases from the list. <2nd par.>

17.4.3.8 Required paragraph

This whole subsection is as follows:
========================================================================
1  Violation of the preconditions specified in  a  function's    Required
   behavior paragraph results in undefined behavior.
========================================================================

17.4.4 Conforming implementations

Omit ', and exceptions (17.3.4.8)' from the 1st paragraph.

17.4.4.7 Derived classes

A base class is never described as virtual. <2nd par.>

17.4.4.8 Restrictions on exception handling

Omit this whole subsection.

18 Language support library

Omit functions supporting start and termination of a C++ program, dynamic type identification and exception processing. <2nd par.>
Omit headers <limits>, <typeinfo>, <exception>, <ctime> and <csignal> from the Table 14.

18.2.1 Numeric limits

Omit this whole subsection.

18.3 Start and termination

Omit this whole section.

18.4 Dynamic memory management

In 'Header <new> synopsis', omit namespace 'std', namespace specifier, exception specification, struct 'nothrow_t', class 'bad_alloc' and operators 'new' and 'delete' with argument of struct 'nothrow_t'.
'Header <new> synopsis' is as follows:
========================================================================
   Header <new> synopsis

     typedef void (*new_handler)();
     new_handler set_new_handler(new_handler new_P);

     void * operator new(size_t size);
     void   operator delete(void * ptr);
     void * operator new[](size_t);
     void   operator delete[](void * ptr);

     void * operator new(size_t size,void * ptr);
     void * operator new[](size_t size,void * ptr);
     void   operator delete(void * ptr, void *);
     void   operator delete[](void * ptr,void *);
========================================================================

18.4.1.1 Single-object forms

Declaration of function 'void *operator new(std::size_t size) throw(bad_alloc)' and the 3rd and 4th paragraphs is as follows:
========================================================================
   void* operator new(size_t size);

3  Required behavior:
     Return a non-null pointer to suitably aligned storage(3.7.3), or 
     else the behavior is undefined. This requirement is binding on a
     replacement version of this function.

4  Default behavior:

   --Executes  a  loop:  Within  the loop, the function first attempts to
     allocate the requested storage.  Whether the attempt involves a call
     to the Standard C library function malloc is unspecified.

   --Returns  a  pointer  to the allocated storage if the attempt is suc-
     cessful.  Otherwise, if the last argument to set_new_handler() was a
     null pointer, the behavior is undefined.

   --Otherwise, the function calls the current new_handler. If the called
     function  returns,  the  loop  repeats.

   --The  loop terminates when an attempt to allocate the requested stor-
     age is successful or when a called  new_handler  function  does  not
     return.
========================================================================
Omit declaration of function 'void *operator new(std::size_t size, const std::nothrow_t&) throw()' and the 5th,6th,7th,8th and 9th paragraphs.
Declaration of function 'void operator delete(void * ptr) throw()' and the 12th paragraph is as follows:
========================================================================
   void operator delete(void* ptr);
12 Required behavior: accept a value of ptr that is null or that was returned by an ear- lier call to the default operator new(size_t). ========================================================================
Omit declaration of function 'void operator delete(void *ptr, const std::nothrow_t&) throw()'.

18.4.1.2 Array forms

Declaration of function 'void *operator new[](std::size_t size) throw(bad_alloc)' is as follows:
========================================================================
   void* operator new[](size_t size);
========================================================================
Omit declaration of function 'void *operator new[](std::size_t size, const std::nothrow_t&) throw()' and the 5th,6th,7th and 8th paragraphs.
Declaration of function 'void operator delete[](void *ptr) throw()', the 11th and 12th paragraphs is as follows:
========================================================================
   void operator delete[](void* ptr);

11 Required behavior:  accept a value of ptr that is  null  or  that  was
     returned  by  an  earlier  call  to  operator new[](size_t).

12 Default behavior:

   --For a null value of ptr, does nothing.

   --Any  other  value of ptr shall be a value returned earlier by a call
     to the default operator new[](size_t).212) For such a non-null value
     of ptr, reclaims storage  allocated  by  the  earlier  call  to  the
     default operator new[].
========================================================================
Omit declaration of function 'void operator delete[](void *ptr, const std::nothrow_t&) throw()'.

18.4.1.3 Placement forms

Omit namespace specifiers and exception specifications from each 'new' or 'delete' declaration. <whole par.>

18.4.2.1 Class bad_alloc

Omit this whole subsection.

18.4.2.2 Type new_handler

The 2nd and 3rd paragraphs is as follows:
========================================================================
2  Required behavior:
     A new_handler shall perform one of the following:

   --make more storage available for allocation and then return;

   --otherwise the behavior is undefined.
3  Default behavior:
     The implementation's default new_handler is undefined.
========================================================================

18.4.2.3 set_new_handler

Omit exception specification of function 'set_new_handler'.

18.5 Type identification

Omit this whole section.

18.6 Exception handling

Omit this whole section.

18.7 Other runtime support

Omit system clock, signal handling and runtime environment. <1st par.>
Omit Table 21, Table 22 and Table 23.

19 Diagnostics library

Include only a global variable for error number codes. <2nd par.>
Omit headers <stdexcept> and <cassert> from the Table 24.

19.1 Exception classes

Omit this whole section.

19.2 Assertions

Omit this whole section.

20 General utilities library

Include only dynamic memory management utilities. <2nd par.>
Omit headers <utility>, <functional>, <memory> and <ctime> from the Table 27.

20.1 Requirements

Omit this whole section.

20.2 Utility components

Omit this whole section.

20.3 Function objects

Omit this whole section.

20.4 Memory

Omit 'Header <memory> synopsis'.

20.4.1 The default allocator

Omit this whole subsection.

20.4.2 Raw storage iterator

Omit this whole subsection.

20.4.3 Temporary buffers

Omit this whole subsection.

20.4.4 Specialized algorithms

Omit this whole subsection.

20.4.5 Template class auto_ptr

Omit this whole subsection.

20.5 Date and time

Omit this whole section.

21 Strings library

Omit the 1st paragraph.
Omit a character traits class. <2nd par.>
Omit headers <cwctype> and <cwchar> from the Table 36.

21.1 Character traits

Omit this whole section.

21.2 String classes

In 'Header <string> synopsis', omit namespace 'std', template class 'basic_string' and template functions.
Instead, introduce class 'string' for char type and functions for class 'string' to 'Header <string> synopsis'.
Omit the 1st and 2nd paragraphs.
Replace all 'charT' by 'char'.
This whole section is as follows:
========================================================================
     Header <string> synopsis

     // 21.3, string:
     class string;

     string operator + (const string &lhs,const string &rhs);
     string operator + (const char *lhs,const string &rhs);
     string operator + (char lhs,const string &rhs);
     string operator + (const string &lhs,const char *rhs);
     string operator + (const string &lhs,char rhs);

     bool operator == (const string &lhs,const string &rhs);
     bool operator == (const char *lhs,const string &rhs);
     bool operator == (const string &lhs,const char *rhs);
     bool operator != (const string &lhs,const string &rhs);
     bool operator != (const char *lhs,const string &rhs);
     bool operator != (const string &lhs,const char *rhs);

     bool operator < (const string &lhs,const string &rhs);
     bool operator < (const string &lhs,const char *rhs);
     bool operator < (const char *lhs,const string &rhs);
     bool operator > (const string &lhs,const string &rhs);
     bool operator > (const string &lhs,const char *rhs);
     bool operator > (const char *lhs,const string &rhs);

     bool operator <= (const string &lhs,const string &rhs);
     bool operator <= (const string &lhs,const char *rhs);
     bool operator <= (const char *lhs,const string &rhs);
     bool operator >= (const string &lhs,const string &rhs);
     bool operator >= (const string &lhs,const char *rhs);
     bool operator >= (const char *lhs,const string &rhs);

     // 21.3.7.8:
     void swap(string &lhs, string &rhs);

     istream & operator >> (istream &is,string &str);
     ostream & operator << (ostream &os,const string &str);
     istream & getline (istream &is,string &str,char delim);
     istream & getline (istream &is,string &str);
========================================================================

21.3 Template class basic_string

Replace the title of this section by 'Class string'.
Replace all 'charT' in this section by 'char'.
The 1st paragraph is as follows:
========================================================================
1  For a  char  type ,  the   class    string
   describes  objects  that  can store a sequence consisting of a varying
   number of arbitrary char objects (clause21).  The first element of  the
   sequence is at position zero.  Such a sequence is also called a string
   if the given char type is clear from context. Storage for the
   string is allocated and freed as necessary by the member functions  of
   class  string.
========================================================================
Omit the 2nd and 4th paragraphs.
Omit template class 'basic_string'. Instead introduce class 'string'.
Omit member functions 'get_allocator','rbegin' and 'rend'.
Replace all 'size_type' in declaration of class 'string' by 'size_t'.
Declaration of class 'string' is as follows:
========================================================================
     class string {
     public:
     // types:
       typedef implementation defined             iterator;       // See 23.1
       typedef implementation defined             const_iterator; // See 23.1

       static const size_t npos = -1;

     // 21.3.1 construct/copy/destroy:
       explicit string(void);
       string(const string& str, size_t pos = 0, size_t n = npos);
       string(const char* s, size_t n);
       string(const char* s);
       string(size_t n, char c);
      ~string();
       string& operator=(const string& str);
       string& operator=(const char* s);
       string& operator=(char c);

     // 21.3.2 iterators:
       iterator       begin();
       const_iterator begin() const;
       iterator       end();
       const_iterator end() const;

     // 21.3.3 capacity:
       size_t size() const;
       size_t length() const;
       size_t max_size() const;
       void resize(size_t n, char c);
       void resize(size_t n);
       size_t capacity() const;
       void reserve(size_t res_arg = 0);
       void clear();
       bool empty() const;

     // 21.3.4 element access:
       const char & operator[](size_t pos) const;
       char &       operator[](size_t pos);
       const char & at(size_t n) const;
       char &       at(size_t n);

     // 21.3.5 modifiers:
       string& operator+=(const string& str);
       string& operator+=(const char* s);
       string& operator+=(char c);
       string& append(const string& str);
       string& append(const string& str, size_t pos, size_t n);
       string& append(const char* s, size_t n);
       string& append(const char* s);
       string& append(size_t n, char c);

       string& assign(const string&);
       string& assign(const string& str, size_t pos, size_t n);
       string& assign(const char* s, size_t n);
       string& assign(const char* s);
       string& assign(size_t n, char c);

       string& insert(size_t pos1, const string& str);
       string& insert(size_t pos1, const string& str,
                           size_t pos2, size_t n);
       string& insert(size_t pos, const char* s, size_t n);
       string& insert(size_t pos, const char* s);
       string& insert(size_t pos, size_t n, char c);
       iterator insert(iterator p, char c);
       void     insert(iterator p, size_t n, char c);

       string& erase(size_t pos = 0, size_t n = npos);
       iterator erase(iterator position);
       iterator erase(iterator first, iterator last);

       string& replace(size_t pos1, size_t n1, const string& str);
       string& replace(size_t pos1, size_t n1, const string& str,
                            size_t pos2, size_t n2);
       string& replace(size_t pos, size_t n1, const char* s, size_t n2);
       string& replace(size_t pos, size_t n1, const char* s);
       string& replace(size_t pos, size_t n1, size_t n2, char c);
       string& replace(iterator i1, iterator i2, const string& str);
       string& replace(iterator i1, iterator i2, const char* s, size_t n);
       string& replace(iterator i1, iterator i2, const char* s);
       string& replace(iterator i1, iterator i2, size_t n, char c);

       size_t copy(char* s, size_t n, size_t pos = 0) const;
       void swap(string&);

     // 21.3.6 string operations:
       const char* c_str() const;  // explicit
       const char* data() const;

       size_t find (const string& str, size_t pos = 0) const;
       size_t find (const char* s, size_t pos, size_t n) const;
       size_t find (const char* s, size_t pos = 0) const;
       size_t find (char c, size_t pos = 0) const;
       size_t rfind(const string& str, size_t pos = npos) const;
       size_t rfind(const char* s, size_t pos, size_t n) const;
       size_t rfind(const char* s, size_t pos = npos) const;
       size_t rfind(char c, size_t pos = npos) const;

       size_t find_first_of(const string& str, size_t pos = 0) const;
       size_t find_first_of(const char* s, size_t pos, size_t n) const;
       size_t find_first_of(const char* s, size_t pos = 0) const;
       size_t find_first_of(char c, size_t pos = 0) const;
       size_t find_last_of (const string& str, size_t pos = npos) const;
       size_t find_last_of (const char* s, size_t pos, size_t n) const;
       size_t find_last_of (const char* s, size_t pos = npos) const;
       size_t find_last_of (char c, size_t pos = npos) const;

       size_t find_first_not_of(const string& str, size_t pos = 0) const;
       size_t find_first_not_of(const char* s, size_t pos, size_t n) const;
       size_t find_first_not_of(const char* s, size_t pos = 0) const;
       size_t find_first_not_of(char c, size_t pos = 0) const;
       size_t find_last_not_of (const string& str, size_t pos = npos) const;
       size_t find_last_not_of (const char* s, size_t pos, size_t n) const;
       size_t find_last_not_of (const char* s, size_t pos = npos) const;
       size_t find_last_not_of (char c, size_t pos = npos) const;

       string substr(size_t pos = 0, size_t n = npos) const;
       int compare(const string& str) const;
       int compare(size_t pos1, size_t n1, const string& str) const;
       int compare(size_t pos1, size_t n1, const string& str,
                   size_t pos2, size_t n2) const;
       int compare(const char* s) const;
       int compare(size_t pos1, size_t n1,
                   const char* s, size_t n2 = npos) const;
     };
========================================================================

21.3.1 basic_string constructors

Replace the title of this subsection by 'string constructors'.
Replace all 'basic_string' in this subsection by 'string'.
Replace all 'size_type' in this subsection by 'size_t'.
Omit the 1st paragraph.
Omit the sixth constructor with argument 'InputIterator'.
Replace all 'traits::length()' in this subsection by '::strlen()'.
Replace all 'charT' by 'char'.
Regarding the first constructor, as follows:
========================================================================
   explicit string(void);
========================================================================
Replace the title of Table 38 by 'string() effects'.
Regarding the second constructor, declaration and the 4th paragraph is as follows:
========================================================================
   string(const string& str, size_t pos = 0, size_t n = npos);

4  Throws:
     if pos > str.size(), then the behavior is undefined.
========================================================================
Replace the title of Table 39 by 'string(string,size_t,size_t) effects'.
Regarding the third constructor, declaration and the 7th paragraph is as follows:
========================================================================
   string(const char* s, size_t n);

7  Throws: if n == pos, then the behavior is undefined.
========================================================================
Replace the title of Table 40 by 'string(const char*,size_t) effects'.
Regarding the forth constructor, as follows:
========================================================================
   string(const char* s);
========================================================================
Replace the title of Table 41 by 'string(const char*) effects'.
Replace 'char-like' by 'char'.
Regarding the fifth constructor, declaration and the 13th paragraph is as follows:
========================================================================
   string(size_t n, char c);

13 Throws:
     if n == npos, then the behavior is undefined.
========================================================================
Replace the title of Table 42 by 'string(size_t,char) effects'. Regarding the first assignment operator, as follows:
========================================================================
   string&  operator=(const string& str);
========================================================================
Replace the title of Table 43 by 'operator=(const string&) effects'.
Replace 'traits::length()' by '::strlen()'. <19th par.>
The other assignment operators is as follows:
========================================================================
   string&  operator=(const char* s);

18 Returns:
     *this = string(s).
19 Notes:
     Uses ::strlen().

   string& operator=(char c);

20 Returns:
     *this = string(1,c).
========================================================================

21.3.2 basic_string iterator support

Replace the title of this subsection by 'string iterator support'.
Omit member functions 'rbegin' and 'rend'.

21.3.3 basic_string capacity

Replace the title of this subsection by 'string capacity'.
Replace all 'size_type' by 'size_t'.
Replace all 'charT' by 'char'.
Replace 'traits::length()' by '::strlen()'.
Replace 'char-like' by 'char'. <1st par.>
Omit the 4th paragraph and footnote 218. Replace 'basic_string' by 'string'. <10th par.>
Regarding the 1st function 'resize', the 5th paragraph is as follows:
========================================================================
5  Throws:
     if n > max_size(), then the behavior is undefined.
========================================================================
Regarding the 3rd function 'reserve', the 12th paragraph is as follows:
========================================================================
5  Throws:
     if reg_arg > max_size(), then the behavior is undefined.
========================================================================

21.3.4 basic_string element access

Replace the title of this subsection by 'string element access'.
Replace 'traits::eos()' by '\0'. <2nd par.>
Replace all 'size_type' by 'size_t'.
Declaration of functions and the 4th paragraph is as follows:
========================================================================
   const char & operator[](size_t pos) const;
   char &       operator[](size_t pos);

   const char & at(size_t n) const;
   char &       at(size_t n);

4  Throws:
     if pos >= size(), then the behavior is undefined.
========================================================================

21.3.5 basic_string modifiers

Replace the title of this subsection by 'string modifiers'.

21.3.5.1 basic_string::operator+=

Replace the title of this subsection by 'string::operator+='.
Replace 'traits::length()' by '::strlen()'.
Replace all 'charT' by 'char'.
This whole subsection is as follows:
========================================================================
   string&   operator+=(const string& str);

1  Returns:  append(str).

   string& operator+=(const char* s);

2  Returns:  *this += string(s).
3  Notes:  Uses ::strlen().

   string& operator+=(char c);

4  Returns:  *this += string(1,c).
========================================================================

21.3.5.2 basic_string::append

Replace the title of this subsection by 'string::append'.
Omit the last member function 'append'.
Replace 'traits::length()' by '::strlen()'. <8th par.>
Replace all 'charT' by 'char' and all 'size_type' by 'size_t'.
Declarations of each function and the 3rd,4th,6th,7th,8th and 9th paragraphs is as follows:
========================================================================
   string& append(const string& str);

   string& append(const string& str, size_t pos, size_t n);

3  Throws:   if  pos > str.size(), then the behavior is undefined.
4  Effects:  Determines the effective length rlen of the string to append
     as the smaller of n and  str.size() - pos.  If  size() >= npos - rlen,
     then the behavior is undefined.
     Otherwise, the function replaces the string  controlled  by    *this
     with  a string of length  size() + rlen whose first  size() elements
     are a copy of the original string controlled by    *this  and  whose
     remaining  elements are a copy of the initial elements of the string
     controlled by str beginning at position pos.

   string& append(const char* s, size_t n);

6  Returns:   append(string(s,n)).

   string& append(const char* s);

7  Returns:   append(string(s)).
8  Notes:  Uses  ::strlen().

   string& append(size_t n, char c);

9  Returns:   append(string(n,c)).
========================================================================

21.3.5.3 basic_string::assign

Replace the title of this subsection by 'string::assign'.
Omit the last member function 'assign'.
Replace 'traits::length()' by '::strlen()'. <8th par.>
Replace all 'charT' by 'char' and all 'size_type' by 'size_t'.
Replace declarations of each function and the 3rd,6th,7th,8th and 9th paragraphs, as follows:
========================================================================
   string& assign(const string& str);

   string& assign(const string& str, size_t pos, size_t n);

3  Throws:   if  pos > str.size(), then the behavior is undefined.

   string& assign(const char* s, size_t n);

6  Returns:   assign(string(s,n)).

   string& assign(const char* s);

7  Returns:   assign(string(s)).
8  Notes:  Uses  ::strlen().

   string& assign(size_t n, char c);

9  Returns:   assign(string(n,c)).
========================================================================

21.3.5.4 basic_string::insert

Replace the title of this subsection by 'string::insert'.
Omit the last member function 'insert'. Replace 'traits::length()' by '::strlen()'. <8th par.>
Replace all 'charT' by 'char' and all 'size_type' by 'size_t'.
Declarations of each function and the 3rd,4th,6th,7th,8th and 9th paragraphs is as follows:
========================================================================
   string& insert(size_t pos1, const string& str);

   string& insert(size_t pos1, const string& str, size_t pos2, size_t n);

3  Throws:   if  pos1 > size() or  pos2 > str.size(), the behavior is
     undefined.
4  Effects:  Determines the effective length rlen of the string to insert
     as  the  smaller  of  n  and    str.size()  -  pos2.   Then  the
     behavior is undefined if  size() >= npos - rlen.
     Otherwise, the function replaces the string  controlled  by    *this
     with a string of length  size() + rlen whose first pos1 elements are
     a copy of the initial elements of the original string controlled by
     *this,  whose  next  rlen elements are a copy of the elements of the
     string controlled by str  beginning  at  position  pos2,  and  whose
     remaining  elements  are  a  copy  of  the remaining elements of the
     original string controlled by  *this.

   string& insert(size_t pos, const char* s, size_t n);

6  Returns:   insert(pos,string(s,n)).

   string& insert(size_t pos, const char* s);

7  Returns:   insert(pos,string(s)).
8  Notes:  Uses  ::strlen().

   string& insert(size_t pos, size_t n, char c);

9  Returns:   insert(pos,string(n,c)).

   iterator insert(iterator p, char c);

   void insert(iterator p, size_t n, char c);
========================================================================

21.3.5.5 basic_string::erase

Replace the title of this subsection by 'string::erase'.
Replace all 'size_type' by 'size_t'.
Declarations of each function and the 2nd paragraph is as follows:
========================================================================
   string& erase(size_t pos = 0, size_t n = npos);

2  Throws:   if pos   > size(), then the behavior is undefined.

   iterator erase(iterator p);

   iterator erase(iterator first, iterator last);
========================================================================

21.3.5.6 basic_string::replace

Replace the title of this subsection by 'string::replace'.
Omit the last member function 'replace'. Replace 'traits::length()' by '::strlen()'. <9th and 18th par.>
Replace all 'charT' by 'char' and all 'size_type' by 'size_t'.
Declarations of each function and the 3rd,4th,5th,7th,8th,9th, 10th,15th,17th,18th and 19th paragraphs is as follows:
========================================================================
   string& replace(size_t pos1, size_t n1, const string& str);

   string& replace(size_t pos1, size_t n1,
             const string& str, size_t pos2, size_t n2);

3  Throws:   if  pos1 > size() or  pos2 > str.size(), then the behavior
     is undefined.
4  Effects:  Determines the effective length xlen of  the  string  to  be
     removed as the smaller of n1 and  size() - pos1.  It also determines
     the effective length rlen of  the  string  to  be  inserted  as  the
     smaller of n2 and  str.size() - pos2 .
5  Throws:   If  size() - xlen >= npos - rlen, then the behavior is undefined.
     Otherwise, the function replaces the string  controlled  by    *this
     with  a  string  of  length    size() - xlen + rlen whose first pos1
     elements are a copy of the initial elements of the  original  string
     controlled  by    *this,  whose next rlen elements are a copy of the
     initial elements of  the  string  controlled  by  str  beginning  at
     position  pos2,  and  whose  remaining  elements  are  a copy of the
     elements of the original string controlled by   *this  beginning  at
     position  pos1 + xlen.

   string& replace(size_t pos, size_t n1, const char* s, size_t n2);

7  Returns:   replace(pos,n1,string(s,n2)).

   string& replace(size_t pos, size_t n1, const char* s);

8  Returns:   replace(pos,n1,string(s)).
9  Notes:  Uses  ::strlen().

   string& replace(size_t pos, size_t n1, size_t n2, char c);

10 Returns:   replace(pos,n1,string(n2,c)).

   string& replace(iterator i1, iterator i2, const string& str);

   string& replace(iterator i1, iterator i2, const char* s, size_t n);

15 Returns:   replace(i1,i2,string(s,n)).

   string& replace(iterator i1, iterator i2, const char* s);

17 Returns:   replace(i1,i2,string(s)).
18 Notes:  Length change:  ::strlen(s) - (i2 - i1).
     Uses  ::strlen().

   string& replace(iterator i1, iterator i2, size_t n, char c);

19 Returns:   replace(i1,i2,string(n,c)).
========================================================================

21.3.5.7 basic_string::copy

Replace the title of this subsection by 'string::copy'.
Replace 'charT' by 'char' and all 'size_type' by 'size_t'.
Declaration of 'copy' and the 2nd paragraph is as follows:
========================================================================
   size_t copy(char* s, size_t n, size_t pos = 0) const;

2  Throws:  if pos > size(), then the behavior is undefined.
========================================================================

21.3.5.8 basic_string::swap

Replace the title of this subsection by 'string::swap'.
Replace only declaration of 'swap', as follows:
========================================================================
   void swap(string& s);
========================================================================

21.3.6 basic_string string operations

Replace the title of this subsection by 'string string operations'.
Omit member function 'get_allocator'.
Replace all 'charT' by 'char'.
Replace all 'basic_string' by 'string'.

21.3.6.1 basic_string::find

Replace the title of this subsection by 'string::find'.
Omit the 3rd paragraph.
Replace 'traits::length()' by '::strlen()'. <6th par.>
Replace all 'charT' by 'char' and all 'size_type' by 'size_t'.
Declarations of each function and the 4th,5th,6th and 7th paragraphs is as follows:
========================================================================
   size_t find(const string& str, size_t pos = 0) const;

   size_t find(const char* s, size_t pos, size_t n) const;

4  Returns:   find(string(s,n),pos).

   size_t find(const char* s, size_t pos = 0) const;

5  Returns:   find(string(s),pos).
6  Notes:  Uses  ::strlen().

   size_t find(char c, size_t pos = 0) const;

7  Returns:   find(string(1,c),pos).
========================================================================

21.3.6.2 basic_string::rfind

Replace the title of this subsection by 'string::rfind'.
Omit the 3rd paragraph.
Replace 'traits::length()' by '::strlen()'. <6th par.>
Replace all 'charT' by 'char' and all 'size_type' by 'size_t'.
Declarations of each function and the 4th,5th,6th and 7th paragraphs is as follows:
========================================================================
   size_t rfind(const string& str, size_t pos = npos) const;

   size_t rfind(const char* s, size_t pos, size_t n) const;

4  Returns:   rfind(string(s,n),pos).

   size_t rfind(const char* s, size_t pos = npos) const;

5  Returns:   rfind(string(s),pos).
6  Notes:  Uses  ::strlen().

   size_t rfind(char c, size_t pos = npos) const;

7  Returns:   rfind(string(1,c),pos).
========================================================================

21.3.6.3 basic_string::find_first_of

Replace the title of this subsection by 'string::find_first_of'.
Omit the 3rd paragraph.
Replace 'traits::length()' by '::strlen()'. <6th par.>
Replace all 'charT' by 'char' and all 'size_type' by 'size_t'.
Declarations of each function and the 4th,5th,6th and 7th paragraphs is as follows:
========================================================================
   size_t find_first_of(const string& str, size_t pos = 0) const;

   size_t find_first_of(const char* s, size_t pos, size_t n) const;

4  Returns:
     find_first_of(string(s,n),pos).

   size_t find_first_of(const char* s, size_t pos = 0) const;

5  Returns:   find_first_of(string(s),pos).
6  Notes:  Uses  ::strlen().

   size_t find_first_of(char c, size_t pos = 0) const;

7  Returns:
     find_first_of(string(1,c),pos).
========================================================================

21.3.6.4 basic_string::find_last_of

Replace the title of this subsection by 'string::find_last_of'.
Omit the 3rd paragraph.
Replace 'traits::length()' by '::strlen()'. <6th par.>
Replace all 'charT' by 'char' and all 'size_type' by 'size_t'.
Declarations of each function and the 4th,5th,6th and 7th paragraphs is as follows:
========================================================================
   size_t find_last_of(const string& str, size_t pos = npos) const;

   size_t find_last_of(const char* s, size_t pos, size_t n) const;

4  Returns:
     find_last_of(string(s,n),pos).

   size_t find_last_of(const char* s, size_t pos = npos) const;

5  Returns:   find_last_of(string(s),pos).
6  Notes:  Uses  ::strlen().

   size_t find_last_of(char c, size_t pos = npos) const;

7  Returns:
     find_last_of(string(1,c),pos).
========================================================================

21.3.6.5 basic_string::find_first_not_of

Replace the title of this subsection by 'string::find_first_not_of'.
Omit the 3rd paragraph.
Replace 'traits::length()' by '::strlen()'. <6th par.>
Replace all 'charT' by 'char' and all 'size_type' by 'size_t'.
Declarations of each function and the 4th,5th,6th and 7th paragraphs is as follows:
========================================================================
   size_t find_first_not_of(const string& str, size_t pos = 0) const;

   size_t find_first_not_of(const char* s, size_t pos, size_t n) const;

4  Returns:
     find_first_not_of(string(s,n),pos).

   size_t find_first_not_of(const char* s, size_t pos = 0) const;

5  Returns:
     find_first_not_of(string(s),pos).
6  Notes:  Uses  ::strlen().

   size_ find_first_not_of(char c, size_t pos = 0) const;

7  Returns:
     find_first_not_of(string(1,c),pos).
========================================================================

21.3.6.6 basic_string::find_last_not_of

Replace the title of this subsection by 'string::find_last_not_of'.
Omit the 3rd paragraph.
Replace 'traits::length()' by '::strlen()'. <6th par.>
Replace all 'charT' by 'char' and all 'size_type' by 'size_t'.
Declarations of each function and the 4th,5th,6th and 7th paragraphs is as follows:
========================================================================
   size_t find_last_not_of(const string& str, size_t pos = npos) const;

   size_t find_last_not_of(const char* s, size_t pos, size_t n) const;

4  Returns:
     find_last_not_of(string(s,n),pos).

   size_t find_last_not_of(const char* s, size_t pos = npos) const;

5  Returns:
     find_last_not_of(string(s),pos).
6  Notes:  Uses  ::strlen().

   size_t find_last_not_of(char c, size_t pos = npos) const;

7  Returns:
     find_last_not_of(string(1,c),pos).
========================================================================

21.3.6.7 basic_string::substr

Replace the title of this subsection by 'string::substr'.
Replace both 'size_type' by 'size_t'.
Declarations of 'substr' and the 2nd and 4th paragraphs is as follows:
========================================================================
   string substr(size_t pos = 0, size_t n = npos) const;

2  Throws:   if  pos > size(), then the behavior is undefined.

4  Returns:   string(data()+pos,rlen).
========================================================================

21.3.6.8 basic_string::compare

Replace the title of this subsection by 'string::compare'.
Replace 'traits::compare()' by '::memcmp()'. <1st par.>
Replace all 'charT' by 'char' and all 'size_type' by 'size_t'.
Declarations of each function and the 1st,3rd,4th,5th and 6th paragraphs is as follows:
========================================================================
   int compare(const string& str) const

1  Effects:  Determines the effective length   rlen  of  the  strings  to
     compare  as  the  smallest of  size() and  str.size().  The function
     then compares the two strings by  calling    ::memcmp(data(),
     str.data(), rlen).

   int compare(size_t pos1, size_t n1, const string& str) const;

3  Returns:   string(*this,pos1,n1).compare(str) .

   int compare(size_t pos1, size_t n1, const string& str,
               size_t pos2, size_t n2) const;

4  Returns:   string(*this,pos1,n1).compare(string(str,pos2,n2)) .

   int compare(const char *s) const;

5  Returns:   this->compare(string(s)).

   int compare(size_t pos, size_t n1, char *s, size_t n2 = npos) const;

6  Returns:   string(*this,pos,n1).compare(string(s,n2))
========================================================================

21.3.7 basic_string non-member functions

Replace the title of this subsection by 'string non-member functions'.

21.3.7.1 operator+

Replace 'traits::length()' by '::strlen()'. <3rd and 6th par.>
Replace all 'charT' by 'char'.
This whole subsection is as follows:
========================================================================
   string operator+(const string& lhs, const string& rhs);

1  Returns:   string(lhs).append(rhs)

   string operator+(const char* lhs, const string& rhs);

2  Returns:   string(lhs) + rhs.
3  Notes:  Uses  ::strlen().

   string operator+(char lhs, const string& rhs);

4  Returns:   string(1,lhs) + rhs.

   string operator+(const string& lhs, const char* rhs);

5  Returns:   lhs + string(rhs).
6  Notes:  Uses  ::strlen().

   string operator+(const string& lhs, char rhs);

7  Returns:   lhs + string(1,rhs).
========================================================================

21.3.7.2 operator==

Replace 'traits::length()' by '::strlen()'. <4th par.>
Replace all 'charT' by 'char'.
Declarations of each function and the 2nd,3rd and 4th paragraphs is as follows:
========================================================================
   bool operator==(const string& lhs, const string& rhs);

   bool operator==(const char* lhs, const string& rhs);

2  Returns:   string(lhs) == rhs.

   bool operator==(const string& lhs, const char* rhs);

3  Returns:   lhs == string(rhs).
4  Notes:  Uses  ::strlen().
========================================================================

21.3.7.3 operator!=

Replace 'traits::length()' by '::strlen()'. <4th par.>
Replace all 'charT' by 'char'.
Declaration of each functions and the 2nd,3rd and 4th paragraphs is as follows:
========================================================================
   bool operator!=(const string& lhs, const string& rhs);

   bool operator!=(const char* lhs, const string& rhs);

2  Returns:   string(lhs) != rhs.

   bool operator!=(const string& lhs, const char* rhs);

3  Returns:   lhs != string(rhs).
4  Notes:  Uses  ::strlen().
========================================================================

21.3.7.4 operator<

Replace all 'charT' by 'char'.
Declarations of each function and the 2nd and 3rd paragraphs is as follows:
========================================================================
   bool operator< (const string& lhs, const string& rhs);

   bool operator< (const char* lhs, const string& rhs);

2  Returns:   string(lhs) < rhs.

   bool operator< (const string& lhs, const char* rhs);

3  Returns:   lhs < string(rhs).
========================================================================

21.3.7.5 operator>

Replace all 'charT' by 'char'.
Declarations of each function and the 2nd and 3rd paragraphs is as follows:
========================================================================
   bool operator> (const string& lhs, const string& rhs);

   bool operator> (const char* lhs, const string& rhs);

2  Returns:   string(lhs) > rhs.

   bool operator> (const string& lhs, const char* rhs);

3  Returns:   lhs > string(rhs).
========================================================================

21.3.7.6 operator<=

Replace all 'charT' by 'char'.
Declarations of each function and the 2nd and 3rd paragraphs is as follows:
========================================================================
   bool operator<=(const string& lhs, const string& rhs);

   bool operator<=(const char* lhs, const string& rhs);

2  Returns:   string(lhs) <= rhs.

   bool operator<=(const string& lhs, const char* rhs);
========================================================================

21.3.7.7 operator>=

Replace all 'charT' by 'char'.
Declarations of each function and the 2nd and 3rd paragraphs is as follows:
========================================================================
   bool operator>=(const string& lhs, const string& rhs);

   bool operator>=(const char* lhs, const string& rhs);

2  Returns:   string(lhs) >= rhs.

   bool operator>=(const string& lhs, const char* rhs);

3  Returns:   lhs >= string(rhs).
========================================================================

21.3.7.8 swap

Only declaration of 'swap' is as follows:
========================================================================
   void swap(string& lhs, string& rhs);
========================================================================

21.3.7.9 Inserters and extractors

Replace 'charT' by 'char'.
This whole subsection is as follows:
========================================================================
   21.3.7.9  Inserters and extractors                     [lib.string.io]

   istream& operator>>(istream& is, string& str);

1  Effects:  Begins by constructing a  sentry  object  k  as  if  k  were
     constructed  by typename istream::sentry  k(is).   If
     bool(k) is true, it calls  str.erase() and then extracts  characters
     from  is  and appends them to str as if by calling  str.append(1,c).
     If  is.width() is  greater  than  zero,  the  maximum  number  n  of
     characters  appended is  is.width(); otherwise n is  str.max_size().
     Characters are extracted and appended until  any  of  the  following
     occurs:

   -  n characters are stored;

   - end-of-file occurs on the input sequence;

   -  isspace(c) is true for the next available input character
     c.
2  After the last character (if any) is extracted,  is.width(0) is
   called and the  sentry object k is destroyed.
3  Returns:   is

   ostream& operator<<(ostream& os, const string& str);

4  Effects:  Begins by constructing a  sentry  object  k  as  if  k  were
     constructed  by    ostream::sentry  k(os).   If bool(k) is true,
     inserts characters as if by  calling os.rdbuf()->sputn(str.data(), n);
     then  calls    os.width(0).   If  the  call
     to  sputn fails, calls  os.setstate(ios_base::failbit).
5  Returns:   os

   istream& getline(istream& is, string& str, char delim);

6  Effects:  Begins by constructing  a    sentry  object  k  as  if  by
     typename istream::sentry k(is,true).  If  bool(k) is true, it
     calls  str.erase() and then extracts characters from is and  appends
     them  to  str  as  if  by  calling  str.append(1,c) until any of the
     following occurs:

   - end-of-file occurs on the  input  sequence  (in  which  case,  the
     getline function calls  is.setstate(ios_base::eofbit)).

   -  c == delim for the next available input  character    c  (in  which
     case,  c is extracted but not appended) (27.4.4.3)

   -  str.max_size() characters are stored (in which case,  the  function
     calls  is.setstate(ios_base::failbit) (27.4.4.3)

7  The conditions are tested in the order shown.  In any case, after  the
   last character is extracted, the  sentry object k is destroyed.

8  If   the   function   extracts    no    characters,    it    calls
   is.setstate(ios_base::failbit).
9  Returns:  is.

   istream& getline(istream& is, string& str)

10 Returns:   getline(is,str,'\n')
========================================================================

21.4 Null-terminated sequence utilities

Omit headers <cwctype> and <cwchar>.
Omit functions 'strcoll','strerror' and 'strxfrm' from header <cstring>.
Omit functions 'mblen','mbstowcs','mbtowc','wctomb' and 'wcstombs' from header <sctdlib>.

22 Localization library

Omit this whole chapter.

23 Containers library

Omit this whole chapter.

24 Iterators library

Omit this whole chapter.

25 Algorithms library

Omit containers. <1st par.>
Include only algorithms from the ISO C library. <2nd par.>
Omit header <algorithm> from the Table 78.
Omit 'Header <algorithm> synopsis' and the 3rd,4th,5th,6th,7th,8th and 9th paragraphs.

25.1 Non-modifying sequence operations

Omit this whole section.

25.2 Mutating sequence operations

Omit this whole section.

25.3 Sorting and related operations

Omit this whole section.

26 Numerics library

Include only complex number types and facilities included from the ISO C library. <2nd par.>
Omit headers <valarray> and <numeric> from the Table 80.

26.1 Numeric type requirements

Omit this whole section.

26.2 Complex numbers

The 1st paragraph is as follows:
========================================================================
1  The header <complex> defines 'float_complex', 'double_complex', and
   numerous  functions for them.
========================================================================
Omit the 2nd paragraph.

26.2.1 Header <complex> synopsis

Omit namespace 'std' and template class 'complex'.
Instead introduce 'float_complex' for float type and 'double_complex' for double type.
This whole subsection is as follows:
========================================================================
     class float_complex;
     class double_complex;

     // 26.2.6 operators:
     float_complex operator+(const float_complex&, const float_complex&);
     float_complex operator+(const float_complex&, const float&);
     float_complex operator+(const float&, const float_complex&);
     float_complex operator-(const float_complex&, const float_complex&);
     float_complex operator-(const float_complex&, const float&);
     float_complex operator-(const float&, const float_complex&);
     float_complex operator*(const float_complex&, const float_complex&);
     float_complex operator*(const float_complex&, const float&);
     float_complex operator*(const float&, const float_complex&);
     float_complex operator/(const float_complex&, const float_complex&);
     float_complex operator/(const float_complex&, const float&);
     float_complex operator/(const float&, const float_complex&);
     float_complex operator+(const float_complex&);
     float_complex operator-(const float_complex&);
     bool operator==(const float_complex&, const float_complex&);
     bool operator==(const float_complex&, const float&);
     bool operator==(const float&, const float_complex&);
     bool operator!=(const float_complex&, const float_complex&);
     bool operator!=(const float_complex&, const float&);
     bool operator!=(const float&, const float_complex&);
     istream&  operator>>(istream&, float_complex&);
     ostream&  operator<<(ostream&, const float_complex&);

     double_complex operator+(const double_complex&, const double_complex&);
     double_complex operator+(const double_complex&, const double&);
     double_complex operator+(const double&, const double_complex&);
     double_complex operator-(const double_complex&, const double_complex&);
     double_complex operator-(const double_complex&, const double&);
     double_complex operator-(const double&, const double_complex&);
     double_complex operator*(const double_complex&, const double_complex&);
     double_complex operator*(const double_complex&, const double&);
     double_complex operator*(const double&, const double_complex&);
     double_complex operator/(const double_complex&, const double_complex&);
     double_complex operator/(const double_complex&, const double&);
     double_complex operator/(const double&, const double_complex&);
     double_complex operator+(const double_complex&);
     double_complex operator-(const double_complex&);
     bool operator==(const double_complex&, const double_complex&);
     bool operator==(const double_complex&, const double&);
     bool operator==(const double&, const double_complex&);
     bool operator!=(const double_complex&, const double_complex&);
     bool operator!=(const double_complex&, const double&);
     bool operator!=(const double&, const double_complex&);
     istream&  operator>>(istream&, double_complex&);
     ostream&  operator<<(ostream&, const double_complex&);

     // 26.2.7 values:
     float real(const float_complex&);
     float imag(const float_complex&);
     float abs(const float_complex&);
     float arg(const float_complex&);
     float norm(const float_complex&);
     float_complex conj(const float_complex&);
     float_complex polar(const float&, const float&);

     double real(const double_complex&);
     double imag(const double_complex&);
     double abs(const double_complex&);
     double arg(const double_complex&);
     double norm(const double_complex&);
     double_complex conj(const double_complex&);
     double_complex polar(const double&, const double&);

     // 26.2.8 transcendentals:
     float_complex cos  (const float_complex&);
     float_complex cosh (const float_complex&);
     float_complex exp  (const float_complex&);
     float_complex log  (const float_complex&);
     float_complex log10(const float_complex&);

     float_complex pow(const float_complex&, int);
     float_complex pow(const float_complex&, const float&);
     float_complex pow(const float_complex&, const float_complex&);
     float_complex pow(const float&, const float_complex&);
     float_complex sin  (const float_complex&);
     float_complex sinh (const float_complex&);
     float_complex sqrt (const float_complex&);
     float_complex tan  (const float_complex&);
     float_complex tanh (const float_complex&);

     double_complex cos  (const double_complex&);
     double_complex cosh (const double_complex&);
     double_complex exp  (const double_complex&);
     double_complex log  (const double_complex&);
     double_complex log10(const double_complex&);

     double_complex pow(const double_complex&, int);
     double_complex pow(const double_complex&, const double&);
     double_complex pow(const double_complex&, const double_complex&);
     double_complex pow(const double&, const double_complex&);
     double_complex sin  (const double_complex&);
     double_complex sinh (const double_complex&);
     double_complex sqrt (const double_complex&);
     double_complex tan  (const double_complex&);
     double_complex tanh (const double_complex&);
========================================================================

26.2.2 Template class complex

Omit this whole subsection.

26.2.3 complex specializations

Replace 'complex<float>' by 'float_complex'.
Replace 'complex<double>' by 'double_complex'.
This whole subsection is as follows:
========================================================================
     class float_complex {
     public:
       typedef float value_type;

       float_complex(float re = 0.0f, float im = 0.0f);
       explicit float_complex(const double_complex&);
       float real() const;
       float imag() const;

       float_complex& operator= (float);
       float_complex& operator+=(float);
       float_complex& operator-=(float);
       float_complex& operator*=(float);
       float_complex& operator/=(float);

       float_complex& operator=(const float_complex&);
       float_complex& operator+=(const float_complex&);
       float_complex& operator-=(const float_complex&);
       float_complex& operator*=(const float_complex&);
       float_complex& operator/=(const float_complex&);
     };
     class double_complex {
     public:
       typedef double value_type;

       double_complex(double re = 0.0, double im = 0.0);
       double_complex(const float_complex&);
       double real() const;
       double imag() const;

       double_complex& operator= (double);
       double_complex& operator+=(double);
       double_complex& operator-=(double);
       double_complex& operator*=(double);
       double_complex& operator/=(double);

       double_complex& operator=(const double_complex&);
       double_complex& operator+=(const double_complex&);
       double_complex& operator-=(const double_complex&);
       double_complex& operator*=(const double_complex&);
       double_complex& operator/=(const double_complex&);
     };
========================================================================

26.2.4 complex member functions

This whole subsection is as follows:
========================================================================
   float_complex(float re = 0.0f, float im = 0.0f);
   double_complex(double re = 0.0, double im = 0.0);

   Effects:
1    Constructs an object of class float_complex, double_complex.

2  Postcondition: real() == re  && imag() == im.
========================================================================

26.2.5 complex member operators

Only declarations of each function is as follows:
========================================================================
   float_complex& operator+=(float rhs);
   double_complex& operator+=(double rhs);

   float_complex& operator-=(float rhs);
   double_complex& operator-=(double rhs);

   float_complex& operator*=(float rhs);
   double_complex& operator*=(double rhs);

   float_complex& operator/=(float rhs);
   double_complex& operator/=(double rhs);

   float_complex& operator+=(const float_complex& rhs);
   double_complex& operator+=(const double_complex& rhs);

   float_complex& operator-=(const float_complex& rhs);
   double_complex& operator-=(const double_complex& rhs);

   float_complex& operator*=(const float_complex& rhs);
   double_complex& operator*=(const double_complex& rhs);

   float_complex& operator/=(const float_complex& rhs);
   double_complex& operator/=(const double_complex& rhs);
========================================================================

26.2.6 complex non-member operations

This whole subsection is as follows:
========================================================================
   float_complex operator+(const float_complex& lhs);
   double_complex operator+(const double_complex& lhs);

1  Notes:  unary operator.
2  Returns:   float_complex(lhs), for float_complex,
              double_complex(lhs), for double_complex.

   float_complex operator+(const float_complex& lhs, const float_complex& rhs);
   float_complex operator+(const float_complex& lhs, const float& rhs);
   float_complex operator+(const float& lhs, const float_complex& rhs);

   double_complex operator+(const double_complex& lhs, const double_complex& rhs);
   double_complex operator+(const double_complex& lhs, const double& rhs);
   double_complex operator+(const double& lhs, const double_complex& rhs);

3  Returns:   float_complex(lhs) += rhs, for float_complex,
              double_complex(lhs) += rhs, for double_complex.

   float_complex operator-(const float_complex& lhs);
   double_complex operator-(const double_complex& lhs);

4  Notes:  unary operator.
5  Returns:   float_complex(-lhs.real(),-lhs.imag()), for float_complex,
              double_complex(-lhs.real(),-lhs.imag()), for double_complex.

   float_complex operator-(const float_complex& lhs, const float_complex& rhs);
   float_complex operator-(const float_complex& lhs, const float& rhs);
   float_complex operator-(const float& lhs, const float_complex& rhs);

   double_complex operator-(const double_complex& lhs, const double_complex& rhs);
   double_complex operator-(const double_complex& lhs, const double& rhs);
   double_complex operator-(const double& lhs, const double_complex& rhs);

6  Returns:   float_complex(lhs) -= rhs, for float_complex,
              double_complex(lhs) -= rhs, for double_complex.

   float_complex operator*(const float_complex& lhs, const float_complex& rhs);
   float_complex operator*(const float_complex& lhs, const float& rhs);
   float_complex operator*(const float& lhs, const float_complex& rhs);

   double_complex operator*(const double_complex& lhs, const double_complex& rhs);
   double_complex operator*(const double_complex& lhs, const double& rhs);
   double_complex operator*(const double& lhs, const double_complex& rhs);

7  Returns:   float_complex(lhs) *= rhs, for float_complex,
              double_complex(lhs) *= rhs, for double_complex.

   float_complex operator/(const float_complex& lhs, const float_complex& rhs);
   float_complex operator/(const float_complex& lhs, const float& rhs);
   float_complex operator/(const float& lhs, const float_complex& rhs);

   double_complex operator/(const double_complex& lhs, const double_complex& rhs);
   double_complex operator/(const double_complex& lhs, const double& rhs);
   double_complex operator/(const double& lhs, const double_complex& rhs);

8  Returns:   float_complex(lhs) /= rhs, for float_complex,
              double_complex(lhs) /= rhs, for double_complex.

   bool operator==(const float_complex& lhs, const float_complex& rhs);
   bool operator==(const float_complex& lhs, const float& rhs);
   bool operator==(const float& lhs, const float_complex& rhs);

   bool operator==(const double_complex& lhs, const double_complex& rhs);
   bool operator==(const double_complex& lhs, const double& rhs);
   bool operator==(const double& lhs, const double_complex& rhs);

9  Returns:   lhs.real() == rhs.real() && lhs.imag() == rhs.imag().
10 Notes:  For float_complex, the imaginary part is assumed to be  float(),
     or 0.0f, for the float arguments.
           For double_complex, the imaginary part is assumed to be
     double(), or 0.0, for the double arguments.

   bool operator!=(const float_complex& lhs, const float_complex& rhs);
   bool operator!=(const float_complex& lhs, const float& rhs);
   bool operator!=(const float& lhs, const float_complex& rhs);

   bool operator!=(const double_complex& lhs, const double_complex& rhs);
   bool operator!=(const double_complex& lhs, const double& rhs);
   bool operator!=(const double& lhs, const double_complex& rhs);

11 Returns:   rhs.real() != lhs.real() || rhs.imag() != lhs.imag().

   istream&  operator>>(istream& is, float_complex& x);
   istream&  operator>>(istream& is, double_complex& x);

12 Effects:  Extracts a complex number x of the form:    u,    (u),  or
     (u,v),  where    u  is  the  real  part and  v is the imaginary part.    
13 Requires:  The input values be convertible to  float for float_complex,
     and to double for double_complex.
     If bad input is encountered, calls  is.setstate(ios::failbit).
14 Returns:  is.

   ostream&  operator<<(ostream& o, const float_complex& x);
   ostream&  operator<<(ostream& o, const double_complex& x);

15 Returns:  o << '(' << x.real() << "," << x.imag() << ')' << ends.
========================================================================

26.2.7 complex value operations

Declarations of each operator is as follows:
========================================================================
   float real(const float_complex& x);
   double real(const double_complex& x);

   float imag(const float_complex& x);
   double imag(const double_complex& x);

   float abs(const float_complex& x);
   double abs(const double_complex& x);

   float arg(const float_complex& x);
   double arg(const double_complex& x);

   float norm(const float_complex& x);
   double norm(const double_complex& x);

   float_complex conj(const float_complex& x);
   double_complex conj(const double_complex& x);

   float_complex polar(const float& rho, const float& theta = 0.0f);
   double_complex polar(const double& rho, const double& theta = 0.0);
========================================================================

26.2.8 complex transcendentals

Declarations of each function is as follows:
========================================================================
   float_complex cos(const float_complex& x);
   double_complex cos(const double_complex& x);

   float_complex cosh(const float_complex& x);
   double_complex cosh(const double_complex& x);

   float_complex exp(const float_complex& x);
   double_complex exp(const double_complex& x);

   float_complex log(const float_complex& x);
   double_complex log(const double_complex& x);

   float_complex log10(const float_complex& x);
   double_complex log10(const double_complex& x);

   float_complex pow(const float_complex& x, int y);
   float_complex pow(const float_complex& x, const float_complex& y);
   float_complex pow  (const float_complex& x, const float& y);
   float_complex pow  (const float& x, const float_complex& y);
   double_complex pow(const double_complex& x, int y);
   double_complex pow(const double_complex& x, const double_complex& y);
   double_complex pow  (const double_complex& x, const double& y);
   double_complex pow  (const double& x, const double_complex& y);

   float_complex sin  (const float_complex& x);
   double_complex sin  (const double_complex& x);

   float_complex sinh (const float_complex& x);
   double_complex sinh (const double_complex& x);

   float_complex sqrt (const float_complex& x);
   double_complex sqrt (const double_complex& x);

   float_complex tan  (const float_complex& x);
   double_complex tan  (const double_complex& x);

   float_complex tanh (const float_complex& x);
   double_complex tanh (const double_complex& x);
========================================================================

26.3 Numeric arrays

Omit this whole section.

26.4 Generalized numeric operations

Omit this whole section.

27 Input/output library

Omit headers <sstream>, <fstream> and <cwchar> from the Table 83.

27.1 Iostreams requirements

Omit this whole section.

27.2 Forward declarations

In 'Header <iosfwd> synopsis', omit namespace 'std'.
Omit template class char_traits.
Omit template classes 'allocator' 'basic_ios' ,'basic_streambuf', 'basic_istream', 'basic_ostream' and 'basic_iostream'.
Omit template classes 'basic_stringbuf', 'basic_istringstream', 'basic_ostringstream', 'basic_stringstream', 'basic_filebuf', 'basic_ifstream', 'basic_ofstream', 'basic_fstream', 'basic_istreambuf_iterator' and 'basic_ostreambuf_iterator'.
Omit types 'wios', 'iostream', 'stringbuf', 'istringstream', 'ostringstream','stringstream', 'filebuf', 'ifstream', 'ofstream', 'fstream','wstreambuf', 'wistream', 'wostream', 'wiostream', 'wstringbuf','wistringstream', 'wostringstream', 'wstringstream', 'wfilebuf','wifstream', 'wofstream' and 'wfstream'.
Omit template class 'fpos'.
Omit types 'streampos' and 'wstreampos'.
Omit the 1st,3rd,4th,5th,6th,7th,8th,9th and 10th paragraphs.
This whole section is as follows:
========================================================================
   Header <iosfwd> synopsis

     class ios;
     class streambuf;
     class istream;
     class ostream;

   [Note:

1  The class  ios serves as a  base  class    for    the    classes
   istream, ostream,  and  classes  derived   from   them.

    -end note]
========================================================================

27.3 Standard iostream objects

In 'Header <iostream> synopsis', omit namespace 'std'.
Not include classes 'cerr', 'clog', 'wcin', 'wcout', 'wcerr' and 'wclog'. Omit the 2nd paragraph..
This whole section is as follows:
========================================================================
   Header <iostream> synopsis

   extern istream cin;
   extern ostream cout;

1  The header <iostream> declares objects that associate objects with the
   standard C streams provided for by the functions declared in <cstdio>.
========================================================================

27.3.1 Narrow stream objects

Omit objects 'cerr' and 'clog'. <4th,5th and 6th par.>

27.3.2 Wide stream objects

Omit this whole subsection.

27.4 Iostreams base classes

Omit namespace 'std', template classes 'fpos', 'basic_ios'.
Instead introduce class 'ios'.
This whole section is as follows:
========================================================================
   #include <iosfwd>

     typedef OFF_T  streamoff;
     typedef SZ_T streamsize;

     class ios_base;
     class ios;

   // 27.4.6, manipulators:
     ios_base& boolalpha  (ios_base& str);
     ios_base& noboolalpha(ios_base& str);
     ios_base& showbase   (ios_base& str);
     ios_base& noshowbase (ios_base& str);
     ios_base& showpoint  (ios_base& str);
     ios_base& noshowpoint(ios_base& str);
     ios_base& showpos    (ios_base& str);
     ios_base& noshowpos  (ios_base& str);
     ios_base& skipws     (ios_base& str);
     ios_base& noskipws   (ios_base& str);
     ios_base& uppercase  (ios_base& str);
     ios_base& nouppercase(ios_base& str);
   // 27.4.6.2 adjustfield:
     ios_base& internal   (ios_base& str);
     ios_base& left       (ios_base& str);
     ios_base& right      (ios_base& str);
   // 27.4.6.3 basefield:
     ios_base& dec        (ios_base& str);
     ios_base& hex        (ios_base& str);
     ios_base& oct        (ios_base& str);
   // 27.4.6.4 floatfield:
     ios_base& fixed      (ios_base& str);
     ios_base& scientific (ios_base& str);
========================================================================

27.4.2 Class ios_base

In declaration of class 'ios_base', omit namespace 'std', class 'failure', member functions 'imbue' and 'getloc'.
Omit the description '--a class failure derived from exception;'. <1st par.>

27.4.2.1.1 Class ios_base::failure

Omit this whole subsection.

27.4.2.1.6 Class ios_base::Init

Omit namespace 'std'.

27.4.2.3 ios_base locale functions

Omit this whole subsection.

27.4.2.4 ios_base static members

The description of 'Returns:' is as follows:
========================================================================
  1  Returns: true  if  the standard  iostream  objects(27.3) are
     synchronized and otherwise returns false. The first time it is called,
     the function returns true.
========================================================================

27.4.2.5 ios_base storage functions

Omit exception throwing. <2nd and 4th par.>

27.4.2.6 ios_base callbacks

Omit call of the function 'imbue()'. <1st par.>
Omit the 2nd paragraph.

27.4.3 Template class fpos

Omit this whole subsection.

27.4.4 Template class basic_ios

Replace the title of this subsection by 'Class ios'.
Omit namespace specifier.
Omit template classes 'basic_ios','basic_ostream' and 'basic_streambuf'. Instead introduce class 'ios','ostream' and 'streambuf'.
Omit functions 'ios::imbue','ios::narrow' and 'ios::widen'.
Replace all 'char_type' by 'char'.
This whole subsection is as follows:
========================================================================
     class ios : public ios_base {
     public:
     // Types:
       typedef INT_T int_type;
       typedef POS_T pos_type;
       typedef OFF_T off_type;

       operator void*() const;
       bool operator!() const;
       iostate rdstate() const;
       void clear(iostate state = goodbit);
       void setstate(iostate state);
       bool good() const;
       bool eof()  const;
       bool fail() const;
       bool bad()  const;

       iostate exceptions() const;
       void exceptions(iostate except);

     // 27.4.4.1 Constructor/destructor:
       explicit ios(streambuf* sb);
       virtual ~ios();

     // 27.4.4.2 Members:
       ostream* tie() const;
       ostream* tie(ostream* tiestr);
       streambuf* rdbuf() const;
       streambuf* rdbuf(streambuf* sb);
       ios& copyfmt(const ios& rhs);
       char fill() const;
       char fill(char ch);

     protected:
       ios();
       void init(streambuf* sb);
     private:
       ios(const ios&);   // not defined
       ios & operator=(const ios&); // not defined
     };
========================================================================

27.4.4.1 basic_ios constructors

Replace the title of this subsection by 'ios constructors'.
Constructors is as follows:
========================================================================
   explicit ios(streambuf* sb);

1  Effects:
     Constructs an object of class ios, assigning initial values to
     its member objects by calling init(sb).

   ios();

2  Effects:  Constructs an object of class  basic_ios (27.4.2.7)  leaving
     its  member objects uninitialized. The object must be initialized by
     calling its  init member function. If it is destroyed before it  has
     been initialized the behavior is undefined.

   void init(streambuf *sb);
========================================================================
Table 89 is as follows:
========================================================================
          _________________________________________________________
         |   Element                       Value                  |
         |________________________________________________________|
         | rdbuf()        sb                                      |
         | tie()          0                                       |
         | rdstate()      goodbit if sb is  not  a  null  pointer,|
         |                otherwise badbit.                       |
         | exceptions()   goodbit                                 |
         | flags()        skipws | dec                            |
         | width()        0                                       |
         | precision()    6                                       |
         | fill()         ' '                                     |
         | iarray         a null pointer                          |
         | parray         a null pointer                          |
         |________________________________________________________|

========================================================================

27.4.4.2 Member functions

Omit member functions 'imbue','narrow' and 'widen'. Replace all 'char_type' by 'char'. Declarations of function 'tie','rbuf','fill' and 'copyfmt' is as follows:
========================================================================
   ostream* tie() const;

   ostream* tie(ostream* tiestr);

   streambuf* rdbuf() const;

   streambuf* rdbuf(streambuf* sb);

   char fill() const;

   char fill(char ch);

   ios& copyfmt(const ios& rhs);
========================================================================

27.4.4.3 basic_ios iostate flags functions

Replace the title of this subsection by 'ios iostate flags functions'.
The description of functions 'clear','setstate' and 'exceptions(void)' is as follows:
========================================================================
   void clear(iostate state = goodbit);

4  Postcondition:  If  rdbuf()!=0 then  state ==  rdstate();  otherwise
     rdstate()==state|ios_base::badbit.
5  Effects:
     If  (rdstate()  & exceptions()) == 0, returns.  Otherwise, the
     behavior is undefined.

   void setstate(iostate state);

6  Effects:
     Calls clear(rdstate() | state).

   iostate exceptions() const;

11 Returns:  A mask that determines what elements set in  rdstate() cause
     undefined behavior.
========================================================================

27.5 Stream buffers

In 'Header <streambuf> synopsis', omit namespace 'std' and template class 'basic_streambuf'.
Instead introduce class 'streambuf' for char type to 'Header <streambuf> synopsis'.
Not include 'wstreambuf'.
'Header <streambuf> synopsis' is as follows:
========================================================================
   Header <streambuf> synopsis

   class streambuf;
========================================================================

27.5.2 Template class basic_streambuf<charT,traits>

Replace the title of this subsection by 'Class streambuf'.
In declaration of class 'streambuf', omit namespace 'std', template class 'basic_streambuf' and functions 'streambuf::pubimbue', 'streambuf::getloc' and 'streambuf::imbue'.
Instead introduce class 'streambuf' for char type to declaration of class 'basic_streambuf'.
In declaration of class 'streambuf', replace all 'char_type' by 'char' and 'traits::eof()' by 'EOF'.
Omit the 2nd and 3rd paragraphs.
This whole subsection is as follows:
========================================================================
     class streambuf {
     public:
     // Types:
       typedef INT_T int_type;
       typedef POS_T pos_type;
       typedef OFF_T off_type;
       virtual ~streambuf();

     // 27.5.2.2.2 buffer and positioning:
       streambuf*  pubsetbuf(char* s, streamsize n);
       pos_type pubseekoff(off_type off, ios_base::seekdir way,
                  ios_base::openmode which = ios_base::in | ios_base::out);
       pos_type pubseekpos(pos_type sp,
                  ios_base::openmode which = ios_base::in | ios_base::out);
       int      pubsync();

     // Get and put areas:
     // 27.5.2.2.3 Get area:
       streamsize  in_avail();
       int_type snextc();
       int_type sbumpc();
       int_type sgetc();
       streamsize sgetn(char* s, streamsize n);
     // 27.5.2.2.4 Putback:
       int_type sputbackc(char c);
       int_type sungetc();
     // 27.5.2.2.5 Put area:
       int_type sputc(char c);
       streamsize sputn(const char* s, streamsize n);
     protected:
       streambuf();
     // 27.5.2.3.1 Get area:
       char* eback() const;
       char* gptr()  const;
       char* egptr() const;
       void       gbump(int n);
       void       setg(char* gbeg, char* gnext, char* gend);
     // 27.5.2.3.2 Put area:
       char* pbase() const;
       char* pptr() const;
       char* epptr() const;
       void       pbump(int n);
       void       setp(char* pbeg, char* pend);
     // 27.5.2.4 virtual functions:
     // 27.5.2.4.2 Buffer management and positioning:
       virtual streambuf*  setbuf(char* s, streamsize n);
       virtual pos_type seekoff(off_type off, ios_base::seekdir way,
                 ios_base::openmode which = ios_base::in | ios_base::out);
       virtual pos_type seekpos(pos_type sp,
                 ios_base::openmode which = ios_base::in | ios_base::out);
       virtual int      sync();
     // 27.5.2.4.3 Get area:
       virtual int        showmanyc();
       virtual streamsize xsgetn(char* s, streamsize n);
       virtual int_type   underflow();
       virtual int_type   uflow();
     // 27.5.2.4.4 Putback:
       virtual int_type   pbackfail(int_type c = EOF);
     // 27.5.2.2.5 Put area:
       virtual streamsize xsputn(const char* s, streamsize n);
       virtual int_type   overflow (int_type c = EOF);
     };

1  The class streambuf serves as an abstract
   base class for deriving various  stream  buffers  whose  objects  each

   control two character sequences:

   --a character input sequence;

   --a character output sequence.
========================================================================

27.5.2.1 basic_streambuf constructors

Replace the title of this subsection by 'streambuf constructors'.
This whole subsection is as follows:
========================================================================
   streambuf();

1  Effects:
     Constructs  an  object  of  class  streambuf and  initializes:273)

   --all its pointer member objects to null pointers,

   __________________________
   273) The default constructor is protected for class    streambuf
   to assure that only objects for classes derived from this class may be
   constructed.
========================================================================

27.5.2.2 basic_streambuf public member functions

Replace the title of this subsection by 'streambuf public member functions'.

27.5.2.2.1 Locales

Omit this whole subsection.

27.5.2.2.2 Buffer management and positioning

Replace 'char_type' by 'char'.
Declarations of each function is as follows:
========================================================================
   streambuf* pubsetbuf(char* s, streamsize n);

   pos_type pubseekoff(off_type off, ios_base::seekdir way,
                  ios_base::openmode which = ios_base::in | ios_base::out);

   pos_type pubseekpos(pos_type sp,
                  ios_base::openmode which = ios_base::in | ios_base::out);

   int pubsync();
========================================================================

27.5.2.2.3 Get area

Replace all 'traits::eof()' in member function 'snextc' by 'EOF'.
Replace 'traits::to_int_type()' in member function 'sbumpc' and 'sgetc' by functional cast 'int_type()'.

27.5.2.2.4 Putback

Replace 'char_type' in member function 'sputbackc' by 'char'.
Replace 'traits::eq(c,gptr[-1])' in member function 'sputbackc' by 'c == gptr[-1]'.
Replace 'traits::to_int_type()' in member functions 'sputbackc' and 'sungetc' by functional cast 'int_type()'.

27.5.2.2.5 Put area

Replace 'char_type' in member function 'sputn' by 'char'.
Replace 'traits::to_int_type()' in member function 'sputc' by functional cast 'int_type()'.

27.5.2.3 basic_streambuf protected member functions

Replace the title of this subsection by 'streambuf protected member functions'.

27.5.2.3.1 Get area access

Replace all 'char_type' by 'char'.

27.5.2.3.2 Put area access

Replace all 'char_type' by 'char'.

27.5.2.4 basic_streambuf virtual functions

Replace the title of this subsection by 'streambuf virtual functions'.

27.5.2.4.1 Locales

Omit this whole subsection.

27.5.2.4.2 Buffer management and positioning

Replace all 'basic_streambuf' in this subsection by 'streambuf'.
Replace 'char_type' by 'char'.
Only declaration of function 'setbuf' is as follows:
========================================================================
   streambuf* setbuf(char* s, streamsize n);
========================================================================

27.5.2.4.3 Get area

Replace all 'traits::eof()' in this whole subsection by 'EOF'.
Replace all 'basic_streambuf' in this whole subsection by 'streambuf'.
Footnote 275) is as follows:
========================================================================
   259) The intention is not only that the calls will not return
    EOF but that they will return ``immediately.''
========================================================================
Replace 'char_type' in member function 'xsgetn' by 'char'.
Replace all 'traits::to_int_type()' in this subsection by functional cast 'int_type()'.

27.5.2.4.4 Putback

Replace 'basic_streambuf' by 'streambuf'. <1st par.>
Replace 'traits::eq(*gptr(),traits::to_char_type(c))' by '*gptr() == c'. <1st par.>
Replace both 'traits::eq_int_type(c,traits::eof())' in the 1st paragraph by 'c == EOF'. Replace all 'traits::eof()' by 'EOF'.

27.5.2.4.5 Put area

Replace all 'traits::eof()' by 'EOF'.
Replace 'basic_streambuf' in footnote 277) by 'streambuf'.
Replace all 'traits::eq_int_type(c,traits::eof())' in this subsection by 'c == EOF'.
Replace 'traits::not_eof(c)' in footnote 278) by 'c if c != EOF, otherwise a value f such that f == EOF is false'.
The 6th paragraph is as follows:
========================================================================
6  Returns:
     EOF or undefined if the function fails.
     Otherwise, returns some value other than EOF  to  indicate
     success.262)
========================================================================

27.6 Formatting and manipulators

In 'Header <istream> synopsis', omit namespace 'std' and template class 'basic_istream'.
Instead introduce class 'istream' for char type to 'Header <istream> synopsis'.
Replace 'charT' by 'char'.
In 'Header <ostream> synopsis', omit namespace 'std' and template class 'basic_ostream'.
Instead introduce class 'ostream' for char type to 'Header <ostream> synopsis'.
Not include classes 'wistream' and 'wostream'.
In 'Header <iomanip> synopsis', omit namespace 'std'.
This whole section is as follows:
========================================================================
   Header <istream> synopsis

     class istream;
     istream& ws(istream& is);

   Header <ostream> synopsis

     class ostream;
     ostream& endl(ostream& os);
     ostream& ends(ostream& os);
     ostream& flush(ostream& os);

   Header <iomanip> synopsis

       // Types T1, T2, ... are unspecified
       // implementation types
       T1 resetiosflags(ios_base::fmtflags mask);
       T2 setiosflags  (ios_base::fmtflags mask);
       T3 setbase(int base);
       T4 setfill(char c);
       T5 setprecision(int n);
       T6 setw(int n);
========================================================================

27.6.1.1 Template class basic_istream

Replace the title of this subsection by 'Class istream'.
In declaration of class 'istream', omit namespace 'std'.
In declaration of class 'istream', omit template classes 'basic_istream','basic_streambuf' and 'basic_ios'. Instead introduce classes 'istream','streambuf' and 'ios' for char type to declaration of class 'istream'.
In declaration of class 'istream', replace 'ios' class virtual inheritance by non-virtual inheritance.
In declaration of class 'istream', replace all 'char_type' by 'char', all 'traits::eof()' by 'EOF', and 'charT' by 'char'.
Declaration of class 'istream' is as follows:
========================================================================
     class istream : public ios {
     public:
     // Types (inherited from ios):
       typedef INT_T int_type;
       typedef POS_T pos_type;
       typedef OFF_T off_type;

     // 27.6.1.1.1 Constructor/destructor:
       explicit istream(streambuf* sb);
       virtual ~istream();

     // 27.6.1.1.2 Prefix/suffix:
       class sentry;

     // 27.6.1.2 Formatted input:
       istream& operator>> (istream& (*pf)(istream&));
       istream& operator>> (ios& (*pf)(ios&));
       istream& operator>> (ios_base& (*pf)(ios_base&));


       istream& operator>>(bool& n);
       istream& operator>>(short& n);
       istream& operator>>(unsigned short& n);
       istream& operator>>(int& n);
       istream& operator>>(unsigned int& n);
       istream& operator>>(long& n);
       istream& operator>>(unsigned long& n);
       istream& operator>>(float& f);
       istream& operator>>(double& f);
       istream& operator>>(long double& f);
       istream& operator>>(void*& p);
       istream& operator>>(streambuf* sb);


     // 27.6.1.3 Unformatted input:
       streamsize gcount() const;
       int_type get();
       istream& get(char& c);
       istream& get(char* s, streamsize n);
       istream& get(char* s, streamsize n, char delim);
       istream& get(streambuf& sb);
       istream& get(streambuf& sb, char delim);


       istream& getline(char* s, streamsize n);
       istream& getline(char* s, streamsize n, char delim);

       istream& ignore(streamsize n = 1, int_type delim = EOF);
       int_type peek();
       istream& read    (char* s, streamsize n);
       streamsize readsome(char* s, streamsize n);


       istream& putback(char c);
       istream& unget();
       int sync();

       pos_type tellg();
       istream& seekg(pos_type);
       istream& seekg(off_type, ios_base::seekdir);
     };

     // 27.6.1.2.3 character extraction templates:
     istream& operator>>(istream&, char&);
     istream& operator>>(istream&, unsigned char&);
     istream& operator>>(istream&, signed char&);

     istream& operator>>(istream&, char*);
     istream& operator>>(istream&, unsigned char*);
     istream& operator>>(istream&, signed char*);
========================================================================
Replace 'basic_istream' by 'istream'. <1st par.>
Omit the 4th paragraph.
Replace 'traits::eof()' by 'EOF'. <3rd par.>
The 3rd paragraph is as follows:
========================================================================
3  If  rdbuf()->sbumpc() or   rdbuf()->sgetc()  returns  EOF,
   then  the  input  function,  except  as  explicitly  noted  otherwise,
   completes its actions and does  setstate(eofbit).
========================================================================

27.6.1.1.1 basic_istream constructors

Replace the title of this subsection by 'istream constructors'.
Replace 'basic_istream' by 'istream'. <1st and 3rd par.>
Replace 'basic_ios::init(sb)' by 'ios::init(sb)'. <1st par.>
Declarations of constructor and destructor is as follows:
========================================================================
   explicit istream(streambuf* sb);

   virtual ~istream();
========================================================================

27.6.1.1.2 Class basic_istream::sentry

Replace the title of this subsection by 'class istream::sentry'.
In declaration of class 'sentry', omit namespace 'std'.
Replace template class 'basic_istream' by class 'istream'.
Declaration of class 'istream::sentry' is as follows:
========================================================================
     class istream::sentry {
       bool ok_; // exposition only
      public:
       explicit sentry(istream& is, bool noskipws = false);
       ~sentry();
       operator bool() const { return ok_; }
      private:
       sentry(const sentry&); // not defined
       setry & operator=(const sentry&); // not defined
     };
========================================================================
Declaration of constructor is as follows:
========================================================================
   explicit sentry(istream& is, bool noskipws = false);
========================================================================
Omit the 4th paragraph.
Omit exception throwing. <5th par.>
Replace 'traits::eof()' by 'EOF'. <6th par.>
The 6th paragraph is as follows:
========================================================================
6  [Example: A typical implementation of the   sentry  constructor  might
   include code such as:

   istream::sentry(istream& is, bool noskipws = false) {
       ...
       int_type c;
       while ((c = is.rdbuf()->snextc()) != EOF) {
         if (!isspace(c)) {
           is.rdbuf()->sputbackc (c);
           break;
         }
       }
       ...
    }

    -end example]
========================================================================

27.6.1.2.1 Common requirements

The 1st paragraph is as follows:
========================================================================
1  Each formatted input function  begins  execution  by  constructing  an
   object  of  class  sentry with the  noskipws (second) argument  false.
   If the  sentry object returns  true, when converted to a value of type
     bool,  the  function endeavors to obtain the requested input.
   If  (exception()&badbit)!= 0 then the behavior is undefined.
   In any case, the formatted input function destructs the
   sentry object.  If undefined behavior has not happened thrown it
   returns  *this
========================================================================

27.6.1.2.2 Arithmetic Extractors

Omit paragraphs except function declarations.

27.6.1.2.3 basic_istream::operator>>

Replace the title of this subsection by 'istream::operator>>'.
Replace 'char_type' by 'char'. <6th par.>
Replace all 'charT' by 'char'.
In footnote 282), replace 'ws(basic_istream&)' by 'ws(istream&)'.
Declarations of each function is as follows:
========================================================================
   istream& operator>>(istream& (*pf)(istream&))

   istream& operator>>(ios& (*pf)(ios&));

   istream& operator>>(ios_base& (*pf)(ios_base&));

   istream& operator>>(istream& in, char* s);
   istream& operator>>(istream& in, unsigned char* s);
   istream& operator>>(istream& in, signed char* s);

   istream& operator>>(istream& in, char& c);
   istream& operator>>(istream& in, unsigned char& c);
   istream& operator>>(istream& in, signed char& c);

   istream& operator>>(streambuf* sb);
========================================================================
Replace 'traits::eos()' by '\0'. <7th par.> The 7th paragraph is as follows:
========================================================================

7  Characters are extracted and stored until any of the following occurs:

   -  n-1 characters are stored;

   - end of file occurs on the input sequence;

   -  isspace(c) is true for the next available input character c.

   - A null byte ('\0') in the next position, which may be the
     first position if no characters were extracted.

    operator>> then calls  width(0).
========================================================================
Omit exception throwing. <8th par.>
The 12th and 13th paragraphs is as follows:
========================================================================
12 Effects:  If sb is null, calls  setstate(failbit).
     Extracts characters from  *this  and  inserts  them  in  the  output
     sequence  controlled  by  sb.  Characters are extracted and inserted
     until any of the following occurs:

   - end-of-file occurs on the input sequence;

   - inserting in the output sequence fails (in which case the  character
     to be inserted is not extracted);
13   If the function inserts no characters, it calls   setstate(failbit).
========================================================================
Omit exception throwing. <13th par.>

27.6.1.3 Unformatted input functions

Replace 'traits::eof()' in this whole subsection by 'EOF'.
Replace all 'char_type' in this whole subsection by 'char'.
The 1st paragraph is as follows:
========================================================================
1  Each unformatted input function begins execution  by  constructing  an
   object  of  class  sentry with the default argument  noskipws (second)
   argument  true.  If the  sentry object returns  true,  when  converted
   to  a  value  of  type    bool,  the  function endeavors to obtain the
   requested input. If
   (exception()&badbit)!= 0 then the behavior is undefined. It also counts
   the number of characters extracted.  If undefined behavior has not
   happened  it  ends  by  storing  the  count in a member object and
   returning the  value specified.  In any event the  sentry object is
   destroyed  before leaving the unformatted input function.
========================================================================
Regarding the 1st and 2nd member function 'get', the 3rd and 5th paragraphs is as follows:
========================================================================
   int_type get();

3  Effects:
     Extracts  a  character c, if one is available.  Otherwise, the func-
     tion calls  setstate(failbit).

   istream& get(char &c);

5  Effects:
     Extracts a character, if one is available, and assigns it to  c.269)
     Otherwise,  the  function  calls  setstate(failbit).
========================================================================
Regarding the 3rd member function 'get', the 8th paragraph is as follows:
========================================================================
   istream& get(char*  s, streamsize n, char delim);

8  If  the  function  stores  no  characters,  it calls setstate(failbit).
   In any
   case,  it  then stores a null character into the next successive loca-
   tion of the array.
========================================================================
The 4th member function 'get' is as follows:
========================================================================
   istream& get(char *s, streamsize n)

10 Effects: Calls get(s,n,'\n');
11 Returns: Value returned by the call.
========================================================================
Regarding the 5th member function 'get', the 12th and 13th paragraphs is as follows:
========================================================================
   istream& get(streambuf& sb, char delim);

12 Effects:
     Extracts characters and inserts them in  the  output  sequence  con-
     trolled by sb.  Characters are extracted and inserted until any
     of the following occurs:

   --end-of-file occurs on the input sequence;

   --inserting in the output sequence fails (in which case the  character
     to be inserted is not extracted);

   --c == delim for the next available input character c (in which case c
     is not extracted);

13 If  the  function  inserts  no characters, it calls setstate(failbit).
========================================================================
The 6th member function 'get' is as follows:
========================================================================
   istream& get(streambuf& sb);

15 Effects: Calls get(s,n,'\n');
16 Returns: Value returned by the call.
========================================================================
Regarding the 1st member function 'getline', the 19th,20th and 22th paragraphs is as follows:
========================================================================
   istream& getline(char* s, streamsize n, char delim);

19 If  the  function  extracts  no characters, it calls setstate(failbit).

20 In  any  case,  it  then stores a null character 
   into the next successive location of the array.

22 [Example:

     #include <iostream>

     int main()
     {
       const int line_buffer_size = 100;

       char buffer[line_buffer_size];
       int line_number = 0;
       while (cin.getline(buffer, line_buffer_size) || cin.gcount()) {
         int count = cin.gcount();
         if (cin.eof())
           cout << "Partial final line";   // cin.fail() is false
         else if (cin.fail()) {
           cout << "Partial long line";
           cin.clear(cin.rdstate() & ~ios::failbit);
         } else {
           count--;        // Don't include newline in count
           cout << "Line " << ++line_number;
         }
         cout << " (" << count << " chars): " << buffer << endl;
       }
     }
    --end example]
========================================================================
The 2nd member function 'getline' is as follows:
========================================================================
   istream& getline(char *s, streamsize n);

23 Returns: getline(s,n,'\n');
========================================================================
Regarding member function 'ignore', the 24th paragraph is as follows:
========================================================================
   istream&  ignore(int n = 1, int_type delim = EOF);

24 Effects:
     Extracts characters and discards  them.   Characters  are  extracted
     until any of the following occurs:

   --if n  != INT_MAX, n characters are
     extracted

   --end-of-file occurs on the input sequence (in which case the function
     calls    setstate(eofbit).

   --c == delim for the next available input character c (in which case c
     is extracted).
========================================================================
Regarding member function 'read', the 28th paragraph is as follows:
========================================================================
   istream& read(char* s, streamsize n);

28 Effects:
     Extracts characters and stores them into successive locations of  an
     array whose first element is designated  by  s.291)  Characters  are
     extracted and stored until either of the following occurs:

   --n characters are stored;

   --end-of-file occurs on the input sequence (in which case the function
     calls   setstate(failbit).
========================================================================
Regarding member function 'readsome', the 30th paragraph is as follows:
========================================================================
   streamsize readsome(char* s, streamsize n);

30 Effects:  If  !good() calls   setstate(failbit), and return.
     Otherwise  extracts characters and stores
     them into successive locations of an array whose  first  element  is
     designated   by   s.    If     rdbuf()->in_avail()  ==  -1,  calls
     setstate(eofbit), and extracts no characters;

   - If  rdbuf()->in_avail() == 0, extracts no characters

   - If  rdbuf()->in_avail() > 0, extracts  min(rdbuf()->in_avail(),n)).
  
========================================================================
 
Regarding member functions 'putback','unget' and 'sync', the 32th,34th and 36th paragraphs is as follows:
========================================================================
   istream& putback(char c);


32 Effects:  If  !good() calls   setstate(failbit), and return.
     If    rdbuf()  is not null, calls  rdbuf->sputbackc() . If  rdbuf() is
     null,  or  if    sputback()  returns   EOF,   calls
     setstate(badbit).

   istream& unget();

34 Effects:  If  !good() calls   setstate(failbit), and return.
     If   rdbuf() is not null, calls  rdbuf()->sungetc().  If   rdbuf()  is
     null,  or  if    sungetc()  returns  EOF,   calls      
     setstate(badbit).

   int sync();

36 Effects:  If  rdbuf() is a null  pointer,  returns  -1  .   Otherwise,
     calls    rdbuf()->pubsync()  and, if that function returns -1 calls
     setstate(badbit), and
     returns  EOF.  Otherwise, returns zero.
========================================================================
Regarding the other member functions, as follows:
========================================================================
   streamsize gcount() const;

   int_type peek();

   pos_type tellg();

   istream& seekg(pos_type pos);

   istream& seekg(off_type& off, ios_base::seekdir dir);
========================================================================

27.6.1.4 Standard basic_istream manipulators

Replace the title of this subsection by 'Standard istream manipulators'.
Only declaration of function 'ws' is as follows:
========================================================================
       istream& ws(istream& is);
========================================================================

27.6.1.5 Template class basic_iostream

Omit this whole subsection.

27.6.2.1 Template class basic_ostream

Replace the title of this subsection by 'Class ostream'.
In declaration of class 'ostream', omit namespace 'std'.
In declaration of class 'ostream', omit template classes 'basic_istream', 'basic_streambuf' and 'basic_ios'.
Instead introduce classes 'ostream','streambuf' and 'ios' for char type to declaration of class 'ostream'.
In declaration of class 'ostream', replace 'ios' class virtual inheritance by non-virtual inheritance.
In declaration of class 'ostream', replace 'char_type' by 'char'.
Declaration of class 'ostream' is as follows:
========================================================================
     class ostream : public ios {
     public:
     // Types (inherited from ios):
    // typedef INT_T int_type;
    // typedef POS_T pos_type;
    // typedef OFF_T off_type;

     // 27.6.2.2 Constructor/destructor:
       explicit ostream(streambuf* sb);
       virtual ~ostream();

     // 27.6.2.3 Prefix/suffix:
       class sentry;

     // 27.6.2.5 Formatted output:
       ostream& operator<< (ostream& (*pf)(ostream&));
       ostream& operator<< (ios& (*pf)(ios&));
       ostream& operator<< (ios_base& (*pf)(ios_base&));


       ostream& operator<<(bool n);
       ostream& operator<<(short n);
       ostream& operator<<(unsigned short n);
       ostream& operator<<(int n);
       ostream& operator<<(unsigned int n);
       ostream& operator<<(long n);
       ostream& operator<<(unsigned long n);
       ostream& operator<<(float f);
       ostream& operator<<(double f);
       ostream& operator<<(long double f);
       ostream& operator<<(const void* p);
       ostream& operator<<(streambuf* sb);


     // 27.6.2.6 Unformatted output:
       ostream& put(char c);
       ostream& write(const char* s, streamsize n);
       ostream& flush();

     // 27.6.2.4 seeks:
       pos_type tellp();
       ostream& seekp(pos_type);
       ostream& seekp(off_type, ios_base::seekdir);
     };


     // 27.6.2.5.4 character inserters
     ostream& operator<<(ostream&, char);
     // signed and unsigned
     ostream& operator<<(ostream&, signed char);
     ostream& operator<<(ostream&, unsigned char);

     ostream& operator<<(ostream&, const char*);
     //  signed and unsigned
     ostream& operator<<(ostream&, const signed char*);
     ostream& operator<<(ostream&, const unsigned char*);
========================================================================
Replace 'basic_ostream' by 'ostream'. <1st and 2nd par.>
Omit the 3rd paragraph.

27.6.2.2 basic_ostream constructors

Replace the title of this subsection by 'ostream constructors'.
Replace 'basic_ostream' by 'ostream'. <1st and 3rd par.>
Replace 'basic_ios<charT,traits>::init(sb)' by 'ios::init(sb)'. <1st par.>
Declarations of constructor and destructor is as follows:
========================================================================
   explicit ostream(streambuf* sb);

   virtual ~ostream();
========================================================================

27.6.2.3 Class basic_ostream::sentry

Replace the title of this subsection by 'class ostream::sentry'.
In declaration of class 'sentry', omit namespace 'std'.
Replace template class 'basic_ostream' by class 'ostream'.
Declaration of class 'ostream::sentry' is as follows:
========================================================================
     class ostream::sentry {
       bool ok_; // exposition only
      public:
       explicit sentry(ostream& os);
       ~sentry();
       operator bool() { return ok_; }
      private:
       sentry(const sentry&);       // not defined
       sentry& operator=(const sentry&);    // not defined
     };
========================================================================
Declaration of constructor is as follows:
========================================================================
   explicit sentry(ostream& os);
========================================================================
Omit exception throwing. <3rd par.>

27.6.2.4 basic_ostream seek members

Only declarations of member function 'seekp' is as follows:
========================================================================
   ostream& seekp(pos_type& pos);

   ostream& seekp(off_type& off, ios_base::seekdir dir);
========================================================================

27.6.2.5.1 Common requirements

The 1st paragraph is as follows:
========================================================================
1  Each formatted output function begins  execution  by  constructing  an
   object  of class  sentry.  If this object returns  true when converted
   to a value of type  bool,  the  function  endeavors  to  generate  the
   requested  output.  If the generation fails, then the formatted output
   function does  setstate(ios::failbit).
   If  (exception()&badbit)!= 0  then  the behavior is undefined.
   In any case, the
   sentry  object  is  destroyed  before  leaving  the  formatted  output
   function.   If  undefined behavior has not happened , the result of the
   formatted  output function is  *this.
========================================================================

27.6.2.5.2 Arithmetic Inserters

Omit the 1st and 2nd paragraphs.

27.6.2.5.3 basic_ostream::operator<<

Replace the title of this subsection by 'ostream::operator<<'.
In footnote 295), replace 'endl(basic_ostream&)' by 'endl(ostream&)'.
Declarations of each function is as follows:
========================================================================
   ostream& operator<<(ostream& (*pf)(ostream&));

   ostream& operator<<(ios& (*pf)(ios&));

   ostream& operator<<(ios_base& (*pf)(ios_base&));

   ostream& operator<<(streambuf *sp);
========================================================================
Omit exception throwing. <6th par.> The 7th and 8th paragraphs is as follows:
========================================================================
7  Gets characters from sb and inserts them in   *this.   Characters  are
   read from sb and inserted until any of the following occurs:

   - end-of-file occurs on the input sequence;

   - inserting in the output sequence fails (in which case the  character
     to be inserted is not extracted);

8  If the function inserts no characters,  it  calls    setstate(failbit).
========================================================================

27.6.2.5.4 Character inserter template functions

Replace the title of this subsection by 'Character inserter functions'.
Replace 'traits::length()' by '::strlen()'. <4th par.>
This whole subsection is as follows:
========================================================================
   ostream& operator<<(ostream& out,  char c);
     // signed and unsigned
   ostream& operator<<(ostream& out,  signed char c);
   ostream& operator<<(ostream& out,  unsigned char c);

1  Effects:   Behaves  like  an  formatted  inserter  (as  described   in
     27.6.2.5.1)  of  out.   After a  sentry object is constructed it insert
     characters.  The  character  to be inserted is  c.
     width(0)  is  called.   The  insertion  character is inserted into
     out.
2  Returns:   out

   ostream& operator<<(ostream& out,  const char* s);
   ostream& operator<<(ostream& out,  const signed char* s);
   ostream& operator<<(ostream& out,  const unsigned char* s);

3  Requires:  s is non-null.
4  Effects:   Behaves  like  an  formatted  inserter  (as  described   in
     27.6.2.5.1)  of  out.   After a  sentry object is constructed it insert
     characters.  The number of characters starting at s to  be  inserted
     is    ::strlen(s).   
     The  ::strlen(s) characters starting at s is inserted into out.
     Calls  width(0).
5  Returns:   out
========================================================================

27.6.2.6 Unformatted output functions

Omit exception throwing. <3rd, 5th and 7th par.>
Replace all 'char_type' by 'char'.
Declarations of each function is as follows:
========================================================================
   ostream& put(char c);

   ostream& write(const char* s, streamsize n);

   ostream& flush();
========================================================================

27.6.2.7 Standard basic_ostream manipulators

Replace the title of this subsection by 'Standard ostream manipulators'.
Replace 'charT()' by '\0'. <3rd par.>
This whole subsection is as follows:
========================================================================
     ostream& endl(ostream& os);

1  Effects:  Calls os.put(os.widen('\n')), then  os.flush().
2  Returns:  os.300)

     ostream& ends(ostream& os);

3  Effects:  Inserts a null character into the output  sequence:  calls
     os.put('\0').
4  Returns:  os.

     ostream& flush(ostream& os);

5  Effects:  Calls  os.flush().
6  Returns:  os.
========================================================================

27.6.3 Standard manipulators

Replace 'basic_ostream' by 'ostream'. <3rd,4th,5th,6th,7th and 8th par.>
Replace 'basic_istream' by 'istream'. <3rd,4th,5th,6th,7th and 8th par.>
Replace 'char_type' and 'charT' by 'char'.
Only 'setfill' function's specification is as follows:
========================================================================
   smanip setfill(char c);

6  Returns:  An object s of unspecified type such that  if
     out  is  (or is derived from)  ostream and c has
     type  char then the expression  out<<s behaves as  if    f(s)  were
     called, where f can be defined as:

     ios& f(ios& str, char c)
       { // set fill character
         str.fill(c);
         return str;
       }
========================================================================

27.7 String streams

Omit this whole section.

27.8.1 File streams

Omit this whole subsection.

27.8.2 C Library files

In 'Header <cstdio>', reserve only macros 'EOF' and 'NULL', type 'size_t' and functions 'getchar', 'gets', 'printf', 'putchar', 'puts', 'scanf', 'sprintf','sscanf','vprintf' and 'vsprintf'.
Table 94 is as follows:
========================================================================
   +--------------------------------------------------------------------+
   |    Type                                   Name(s)                  |
   +--------------------------------------------------------------------+
   |Macros:                                                             |
   |EOF                  NULL <cstdio>                                  |
   +--------------------------------------------------------------------+
   |Types:               size_t <cstdio>                                |
   +--------------------------------------------------------------------+
   |Functions:                                                          |
   |getchar              puts                  vprintf                  |
   |gets                 scanf                 vsprintf                 |
   |printf               sprintf                                        |
   |putchar              sscanf                                         |
   +--------------------------------------------------------------------+
========================================================================