|  | #!/usr/bin/env python | 
|  |  | 
|  | import os | 
|  | import re | 
|  | import time | 
|  | from pprint import pprint | 
|  |  | 
|  | ### | 
|  |  | 
|  | c99URL = 'http://www.open-std.org/jtc1/sc22/wg14/www/docs/n1124.pdf' | 
|  | c99TOC = [('Foreword', 'xi'), | 
|  | ('Introduction', 'xiv'), | 
|  | ('1. Scope', '1'), | 
|  | ('2. Normative references', '2'), | 
|  | ('3. Terms, definitions, and symbols', '3'), | 
|  | ('4. Conformance', '7'), | 
|  | ('5. Environment', '9'), | 
|  | ('5.1 Conceptual models', '9'), | 
|  | ('5.1.1 Translation environment', '9'), | 
|  | ('5.1.2 Execution environments', '11'), | 
|  | ('5.2 Environmental considerations', '17'), | 
|  | ('5.2.1 Character sets', '17'), | 
|  | ('5.2.2 Character display semantics', '19'), | 
|  | ('5.2.3 Signals and interrupts', '20'), | 
|  | ('5.2.4 Environmental limits', '20'), | 
|  | ('6. Language', '29'), | 
|  | ('6.1 Notation', '29'), | 
|  | ('6.2 Concepts', '29'), | 
|  | ('6.2.1 Scopes of identifiers', '29'), | 
|  | ('6.2.2 Linkages of identifiers', '30'), | 
|  | ('6.2.3 Name spaces of identifiers', '31'), | 
|  | ('6.2.4 Storage durations of objects', '32'), | 
|  | ('6.2.5 Types', '33'), | 
|  | ('6.2.6 Representations of types', '37'), | 
|  | ('6.2.7 Compatible type and composite type', '40'), | 
|  | ('6.3 Conversions', '42'), | 
|  | ('6.3.1 Arithmetic operands', '42'), | 
|  | ('6.3.2 Other operands', '46'), | 
|  | ('6.4 Lexical elements', '49'), | 
|  | ('6.4.1 Keywords', '50'), | 
|  | ('6.4.2 Identifiers', '51'), | 
|  | ('6.4.3 Universal character names', '53'), | 
|  | ('6.4.4 Constants', '54'), | 
|  | ('6.4.5 String literals', '62'), | 
|  | ('6.4.6 Punctuators', '63'), | 
|  | ('6.4.7 Header names', '64'), | 
|  | ('6.4.8 Preprocessing numbers', '65'), | 
|  | ('6.4.9 Comments', '66'), | 
|  | ('6.5 Expressions', '67'), | 
|  | ('6.5.1 Primary expressions', '69'), | 
|  | ('6.5.2 Postfix operators', '69'), | 
|  | ('6.5.3 Unary operators', '78'), | 
|  | ('6.5.4 Cast operators', '81'), | 
|  | ('6.5.5 Multiplicative operators', '82'), | 
|  | ('6.5.6 Additive operators', '82'), | 
|  | ('6.5.7 Bitwise shift operators', '84'), | 
|  | ('6.5.8 Relational operators', '85'), | 
|  | ('6.5.9 Equality operators', '86'), | 
|  | ('6.5.10 Bitwise AND operator', '87'), | 
|  | ('6.5.11 Bitwise exclusive OR operator', '88'), | 
|  | ('6.5.12 Bitwise inclusive OR operator', '88'), | 
|  | ('6.5.13 Logical AND operator', '89'), | 
|  | ('6.5.14 Logical OR operator', '89'), | 
|  | ('6.5.15 Conditional operator', '90'), | 
|  | ('6.5.16 Assignment operators', '91'), | 
|  | ('6.5.17 Comma operator', '94'), | 
|  | ('6.6 Constant expressions', '95'), | 
|  | ('6.7 Declarations', '97'), | 
|  | ('6.7.1 Storage-class specifiers', '98'), | 
|  | ('6.7.2 Type specifiers', '99'), | 
|  | ('6.7.3 Type qualifiers', '108'), | 
|  | ('6.7.4 Function specifiers', '112'), | 
|  | ('6.7.5 Declarators', '114'), | 
|  | ('6.7.6 Type names', '122'), | 
|  | ('6.7.7 Type definitions', '123'), | 
|  | ('6.7.8 Initialization', '125'), | 
|  | ('6.8 Statements and blocks', '131'), | 
|  | ('6.8.1 Labeled statements', '131'), | 
|  | ('6.8.2 Compound statement', '132'), | 
|  | ('6.8.3 Expression and null statements', '132'), | 
|  | ('6.8.4 Selection statements', '133'), | 
|  | ('6.8.5 Iteration statements', '135'), | 
|  | ('6.8.6 Jump statements', '136'), | 
|  | ('6.9 External definitions', '140'), | 
|  | ('6.9.1 Function definitions', '141'), | 
|  | ('6.9.2 External object definitions', '143'), | 
|  | ('6.10 Preprocessing directives', '145'), | 
|  | ('6.10.1 Conditional inclusion', '147'), | 
|  | ('6.10.2 Source file inclusion', '149'), | 
|  | ('6.10.3 Macro replacement', '151'), | 
|  | ('6.10.4 Line control', '158'), | 
|  | ('6.10.5 Error directive', '159'), | 
|  | ('6.10.6 Pragma directive', '159'), | 
|  | ('6.10.7 Null directive', '160'), | 
|  | ('6.10.8 Predefined macro names', '160'), | 
|  | ('6.10.9 Pragma operator', '161'), | 
|  | ('6.11 Future language directions', '163'), | 
|  | ('6.11.1 Floating types', '163'), | 
|  | ('6.11.2 Linkages of identifiers', '163'), | 
|  | ('6.11.3 External names', '163'), | 
|  | ('6.11.4 Character escape sequences', '163'), | 
|  | ('6.11.5 Storage-class specifiers', '163'), | 
|  | ('6.11.6 Function declarators', '163'), | 
|  | ('6.11.7 Function definitions', '163'), | 
|  | ('6.11.8 Pragma directives', '163'), | 
|  | ('6.11.9 Predefined macro names', '163'), | 
|  | ('7. Library', '164'), | 
|  | ('7.1 Introduction', '164'), | 
|  | ('7.1.1 Definitions of terms', '164'), | 
|  | ('7.1.2 Standard headers', '165'), | 
|  | ('7.1.3 Reserved identifiers', '166'), | 
|  | ('7.1.4 Use of library functions', '166'), | 
|  | ('7.2 Diagnostics <assert.h>', '169'), | 
|  | ('7.2.1 Program diagnostics', '169'), | 
|  | ('7.3 Complex arithmetic <complex.h>', '170'), | 
|  | ('7.3.1 Introduction', '170'), | 
|  | ('7.3.2 Conventions', '170'), | 
|  | ('7.3.3 Branch cuts', '171'), | 
|  | ('7.3.4 The CX_LIMITED_RANGE pragma', '171'), | 
|  | ('7.3.5 Trigonometric functions', '172'), | 
|  | ('7.3.6 Hyperbolic functions', '174'), | 
|  | ('7.3.7 Exponential and logarithmic functions', '176'), | 
|  | ('7.3.8 Power and absolute-value functions', '177'), | 
|  | ('7.3.9 Manipulation functions', '178'), | 
|  | ('7.4 Character handling <ctype.h>', '181'), | 
|  | ('7.4.1 Character classification functions', '181'), | 
|  | ('7.4.2 Character case mapping functions', '184'), | 
|  | ('7.5 Errors <errno.h>', '186'), | 
|  | ('7.6 Floating-point environment <fenv.h>', '187'), | 
|  | ('7.6.1 The FENV_ACCESS pragma', '189'), | 
|  | ('7.6.2 Floating-point exceptions', '190'), | 
|  | ('7.6.3 Rounding', '193'), | 
|  | ('7.6.4 Environment', '194'), | 
|  | ('7.7 Characteristics of floating types <float.h>', '197'), | 
|  | ('7.8 Format conversion of integer types <inttypes.h>', '198'), | 
|  | ('7.8.1 Macros for format specifiers', '198'), | 
|  | ('7.8.2 Functions for greatest-width integer types', '199'), | 
|  | ('7.9 Alternative spellings <iso646.h>', '202'), | 
|  | ('7.10 Sizes of integer types <limits.h>', '203'), | 
|  | ('7.11 Localization <locale.h>', '204'), | 
|  | ('7.11.1 Locale control', '205'), | 
|  | ('7.11.2 Numeric formatting convention inquiry', '206'), | 
|  | ('7.12 Mathematics <math.h>', '212'), | 
|  | ('7.12.1 Treatment of error conditions', '214'), | 
|  | ('7.12.2 The FP_CONTRACT pragma', '215'), | 
|  | ('7.12.3 Classification macros', '216'), | 
|  | ('7.12.4 Trigonometric functions', '218'), | 
|  | ('7.12.5 Hyperbolic functions', '221'), | 
|  | ('7.12.6 Exponential and logarithmic functions', '223'), | 
|  | ('7.12.7 Power and absolute-value functions', '228'), | 
|  | ('7.12.8 Error and gamma functions', '230'), | 
|  | ('7.12.9 Nearest integer functions', '231'), | 
|  | ('7.12.10 Remainder functions', '235'), | 
|  | ('7.12.11 Manipulation functions', '236'), | 
|  | ('7.12.12 Maximum, minimum, and positive difference functions', '238'), | 
|  | ('7.12.13 Floating multiply-add', '239'), | 
|  | ('7.12.14 Comparison macros', '240'), | 
|  | ('7.13 Nonlocal jumps <setjmp.h>', '243'), | 
|  | ('7.13.1 Save calling environment', '243'), | 
|  | ('7.13.2 Restore calling environment', '244'), | 
|  | ('7.14 Signal handling <signal.h>', '246'), | 
|  | ('7.14.1 Specify signal handling', '247'), | 
|  | ('7.14.2 Send signal', '248'), | 
|  | ('7.15 Variable arguments <stdarg.h>', '249'), | 
|  | ('7.15.1 Variable argument list access macros', '249'), | 
|  | ('7.16 Boolean type and values <stdbool.h>', '253'), | 
|  | ('7.17 Common definitions <stddef.h>', '254'), | 
|  | ('7.18 Integer types <stdint.h>', '255'), | 
|  | ('7.18.1 Integer types', '255'), | 
|  | ('7.18.2 Limits of specified-width integer types', '257'), | 
|  | ('7.18.3 Limits of other integer types', '259'), | 
|  | ('7.18.4 Macros for integer constants', '260'), | 
|  | ('7.19 Input/output <stdio.h>', '262'), | 
|  | ('7.19.1 Introduction', '262'), | 
|  | ('7.19.2 Streams', '264'), | 
|  | ('7.19.3 Files', '266'), | 
|  | ('7.19.4 Operations on files', '268'), | 
|  | ('7.19.5 File access functions', '270'), | 
|  | ('7.19.6 Formatted input/output functions', '274'), | 
|  | ('7.19.7 Character input/output functions', '296'), | 
|  | ('7.19.8 Direct input/output functions', '301'), | 
|  | ('7.19.9 File positioning functions', '302'), | 
|  | ('7.19.10 Error-handling functions', '304'), | 
|  | ('7.20 General utilities <stdlib.h>', '306'), | 
|  | ('7.20.1 Numeric conversion functions', '307'), | 
|  | ('7.20.2 Pseudo-random sequence generation functions', '312'), | 
|  | ('7.20.3 Memory management functions', '313'), | 
|  | ('7.20.4 Communication with the environment', '315'), | 
|  | ('7.20.5 Searching and sorting utilities', '318'), | 
|  | ('7.20.6 Integer arithmetic functions', '320'), | 
|  | ('7.20.7 Multibyte/wide character conversion functions', '321'), | 
|  | ('7.20.8 Multibyte/wide string conversion functions', '323'), | 
|  | ('7.21 String handling <string.h>', '325'), | 
|  | ('7.21.1 String function conventions', '325'), | 
|  | ('7.21.2 Copying functions', '325'), | 
|  | ('7.21.3 Concatenation functions', '327'), | 
|  | ('7.21.4 Comparison functions', '328'), | 
|  | ('7.21.5 Search functions', '330'), | 
|  | ('7.21.6 Miscellaneous functions', '333'), | 
|  | ('7.22 Type-generic math <tgmath.h>', '335'), | 
|  | ('7.23 Date and time <time.h>', '338'), | 
|  | ('7.23.1 Components of time', '338'), | 
|  | ('7.23.2 Time manipulation functions', '339'), | 
|  | ('7.23.3 Time conversion functions', '341'), | 
|  | ('7.24 Extended multibyte and wide character utilities <wchar.h>', '348'), | 
|  | ('7.24.1 Introduction', '348'), | 
|  | ('7.24.2 Formatted wide character input/output functions', '349'), | 
|  | ('7.24.3 Wide character input/output functions', '367'), | 
|  | ('7.24.4 General wide string utilities', '371'), | 
|  | ('7.24.5 Wide character time conversion functions', '385'), | 
|  | ('7.24.6 Extended multibyte/wide character conversion utilities', '386'), | 
|  | ('7.25 Wide character classification and mapping utilities <wctype.h>', | 
|  | '393'), | 
|  | ('7.25.1 Introduction', '393'), | 
|  | ('7.25.2 Wide character classification utilities', '394'), | 
|  | ('7.25.3 Wide character case mapping utilities', '399'), | 
|  | ('7.26 Future library directions', '401'), | 
|  | ('7.26.1 Complex arithmetic <complex.h>', '401'), | 
|  | ('7.26.2 Character handling <ctype.h>', '401'), | 
|  | ('7.26.3 Errors <errno.h>', '401'), | 
|  | ('7.26.4 Format conversion of integer types <inttypes.h>', '401'), | 
|  | ('7.26.5 Localization <locale.h>', '401'), | 
|  | ('7.26.6 Signal handling <signal.h>', '401'), | 
|  | ('7.26.7 Boolean type and values <stdbool.h>', '401'), | 
|  | ('7.26.8 Integer types <stdint.h>', '401'), | 
|  | ('7.26.9 Input/output <stdio.h>', '402'), | 
|  | ('7.26.10 General utilities <stdlib.h>', '402'), | 
|  | ('7.26.11 String handling <string.h>', '402'), | 
|  | ('<wchar.h>', '402'), | 
|  | ('<wctype.h>', '402'), | 
|  | ('Annex A (informative) Language syntax summary', '403'), | 
|  | ('A.1 Lexical grammar', '403'), | 
|  | ('A.2 Phrase structure grammar', '409'), | 
|  | ('A.3 Preprocessing directives', '416'), | 
|  | ('Annex B (informative) Library summary', '418'), | 
|  | ('B.1 Diagnostics <assert.h>', '418'), | 
|  | ('B.2 Complex <complex.h>', '418'), | 
|  | ('B.3 Character handling <ctype.h>', '420'), | 
|  | ('B.4 Errors <errno.h>', '420'), | 
|  | ('B.5 Floating-point environment <fenv.h>', '420'), | 
|  | ('B.6 Characteristics of floating types <float.h>', '421'), | 
|  | ('B.7 Format conversion of integer types <inttypes.h>', '421'), | 
|  | ('B.8 Alternative spellings <iso646.h>', '422'), | 
|  | ('B.9 Sizes of integer types <limits.h>', '422'), | 
|  | ('B.10 Localization <locale.h>', '422'), | 
|  | ('B.11 Mathematics <math.h>', '422'), | 
|  | ('B.12 Nonlocal jumps <setjmp.h>', '427'), | 
|  | ('B.13 Signal handling <signal.h>', '427'), | 
|  | ('B.14 Variable arguments <stdarg.h>', '427'), | 
|  | ('B.15 Boolean type and values <stdbool.h>', '427'), | 
|  | ('B.16 Common definitions <stddef.h>', '428'), | 
|  | ('B.17 Integer types <stdint.h>', '428'), | 
|  | ('B.18 Input/output <stdio.h>', '428'), | 
|  | ('B.19 General utilities <stdlib.h>', '430'), | 
|  | ('B.20 String handling <string.h>', '432'), | 
|  | ('B.21 Type-generic math <tgmath.h>', '433'), | 
|  | ('B.22 Date and time <time.h>', '433'), | 
|  | ('B.23 Extended multibyte/wide character utilities <wchar.h>', '434'), | 
|  | ('B.24 Wide character classification and mapping utilities <wctype.h>', | 
|  | '436'), | 
|  | ('Annex C (informative) Sequence points', '438'), | 
|  | ('Annex D (normative) Universal character names for identifiers', '439'), | 
|  | ('Annex E (informative) Implementation limits', '441'), | 
|  | ('Annex F (normative) IEC 60559 floating-point arithmetic', '443'), | 
|  | ('F.1 Introduction', '443'), | 
|  | ('F.2 Types', '443'), | 
|  | ('F.3 Operators and functions', '444'), | 
|  | ('F.4 Floating to integer conversion', '446'), | 
|  | ('F.5 Binary-decimal conversion', '446'), | 
|  | ('F.6 Contracted expressions', '447'), | 
|  | ('F.7 Floating-point environment', '447'), | 
|  | ('F.8 Optimization', '450'), | 
|  | ('F.9 Mathematics <math.h>', '453'), | 
|  | ('Annex G (informative) IEC 60559-compatible complex arithmetic', '466'), | 
|  | ('G.1 Introduction', '466'), | 
|  | ('G.2 Types', '466'), | 
|  | ('G.3 Conventions', '466'), | 
|  | ('G.4 Conversions', '467'), | 
|  | ('G.5 Binary operators', '467'), | 
|  | ('G.6 Complex arithmetic <complex.h>', '471'), | 
|  | ('G.7 Type-generic math <tgmath.h>', '479'), | 
|  | ('Annex H (informative) Language independent arithmetic', '480'), | 
|  | ('H.1 Introduction', '480'), | 
|  | ('H.2 Types', '480'), | 
|  | ('H.3 Notification', '484'), | 
|  | ('Annex I (informative) Common warnings', '486'), | 
|  | ('Annex J (informative) Portability issues', '488'), | 
|  | ('J.1 Unspecified behavior', '488'), | 
|  | ('J.2 Undefined behavior', '491'), | 
|  | ('J.3 Implementation-defined behavior', '504'), | 
|  | ('J.4 Locale-specific behavior', '511'), | 
|  | ('J.5 Common extensions', '512'), | 
|  | ('Bibliography', '515'), | 
|  | ('Index', '517')] | 
|  |  | 
|  | cXXURL = 'http://open-std.org/jtc1/sc22/wg21/docs/papers/2008/n2723.pdf' | 
|  | cXXTOC = [('Contents', 'ii'), | 
|  | ('List of Tables', 'ix'), | 
|  | ('1 General', '1'), | 
|  | ('1.1 Scope', '1'), | 
|  | ('1.2 Normative references', '1'), | 
|  | ('1.3 Definitions', '2'), | 
|  | ('1.4 Implementation compliance', '4'), | 
|  | ('1.5 Structure of this International Standard', '5'), | 
|  | ('1.6 Syntax notation', '5'), | 
|  | ('1.7 The C++ memory model', '6'), | 
|  | ('1.8 The C++ object model', '6'), | 
|  | ('1.9 Program execution', '7'), | 
|  | ('1.10 Multi-threaded executions and data races', '10'), | 
|  | ('1.11 Acknowledgments', '13'), | 
|  | ('2 Lexical conventions', '15'), | 
|  | ('2.1 Phases of translation', '15'), | 
|  | ('2.2 Character sets', '16'), | 
|  | ('2.3 Trigraph sequences', '17'), | 
|  | ('2.4 Preprocessing tokens', '17'), | 
|  | ('2.5 Alternative tokens', '18'), | 
|  | ('2.6 Tokens', '19'), | 
|  | ('2.7 Comments', '19'), | 
|  | ('2.8 Header names', '19'), | 
|  | ('2.9 Preprocessing numbers', '20'), | 
|  | ('2.10 Identifiers', '20'), | 
|  | ('2.11 Keywords', '20'), | 
|  | ('2.12 Operators and punctuators', '21'), | 
|  | ('2.13 Literals', '21'), | 
|  | ('3 Basic concepts', '29'), | 
|  | ('3.1 Declarations and definitions', '29'), | 
|  | ('3.2 One definition rule', '31'), | 
|  | ('3.3 Declarative regions and scopes', '33'), | 
|  | ('3.4 Name lookup', '38'), | 
|  | ('3.5 Program and linkage', '51'), | 
|  | ('3.6 Start and termination', '54'), | 
|  | ('3.7 Storage duration', '58'), | 
|  | ('3.8 Object Lifetime', '62'), | 
|  | ('3.9 Types', '65'), | 
|  | ('3.10 Lvalues and rvalues', '70'), | 
|  | ('3.11 Alignment', '72'), | 
|  | ('4 Standard conversions', '73'), | 
|  | ('4.1 Lvalue-to-rvalue conversion', '74'), | 
|  | ('4.2 Array-to-pointer conversion', '74'), | 
|  | ('4.3 Function-to-pointer conversion', '74'), | 
|  | ('4.4 Qualification conversions', '74'), | 
|  | ('4.5 Integral promotions', '75'), | 
|  | ('4.6 Floating point promotion', '76'), | 
|  | ('4.7 Integral conversions', '76'), | 
|  | ('4.8 Floating point conversions', '76'), | 
|  | ('4.9 Floating-integral conversions', '77'), | 
|  | ('4.10 Pointer conversions', '77'), | 
|  | ('4.11 Pointer to member conversions', '77'), | 
|  | ('4.12 Boolean conversions', '78'), | 
|  | ('4.13 Integer conversion rank', '78'), | 
|  | ('5 Expressions', '79'), | 
|  | ('5.1 Primary expressions', '80'), | 
|  | ('5.2 Postfix expressions', '85'), | 
|  | ('5.3 Unary expressions', '96'), | 
|  | ('5.4 Explicit type conversion (cast notation)', '104'), | 
|  | ('5.5 Pointer-to-member operators', '105'), | 
|  | ('5.6 Multiplicative operators', '106'), | 
|  | ('5.7 Additive operators', '106'), | 
|  | ('5.8 Shift operators', '107'), | 
|  | ('5.9 Relational operators', '108'), | 
|  | ('5.10 Equality operators', '109'), | 
|  | ('5.11 Bitwise AND operator', '110'), | 
|  | ('5.12 Bitwise exclusive OR operator', '110'), | 
|  | ('5.13 Bitwise inclusive OR operator', '110'), | 
|  | ('5.14 Logical AND operator', '110'), | 
|  | ('5.15 Logical OR operator', '110'), | 
|  | ('5.16 Conditional operator', '111'), | 
|  | ('5.17 Assignment and compound assignment operators', '112'), | 
|  | ('5.18 Comma operator', '113'), | 
|  | ('5.19 Constant expressions', '113'), | 
|  | ('6 Statements', '116'), | 
|  | ('6.1 Labeled statement', '116'), | 
|  | ('6.2 Expression statement', '116'), | 
|  | ('6.3 Compound statement or block', '116'), | 
|  | ('6.4 Selection statements', '117'), | 
|  | ('6.5 Iteration statements', '118'), | 
|  | ('6.6 Jump statements', '121'), | 
|  | ('6.7 Declaration statement', '122'), | 
|  | ('6.8 Ambiguity resolution', '123'), | 
|  | ('7 Declarations', '125'), | 
|  | ('7.1 Specifiers', '126'), | 
|  | ('7.2 Enumeration declarations', '140'), | 
|  | ('7.3 Namespaces', '143'), | 
|  | ('7.4 The asm declaration', '156'), | 
|  | ('7.5 Linkage specifications', '156'), | 
|  | ('8 Declarators', '160'), | 
|  | ('8.1 Type names', '161'), | 
|  | ('8.2 Ambiguity resolution', '161'), | 
|  | ('8.3 Meaning of declarators', '163'), | 
|  | ('8.4 Function definitions', '175'), | 
|  | ('8.5 Initializers', '177'), | 
|  | ('9 Classes', '191'), | 
|  | ('9.1 Class names', '193'), | 
|  | ('9.2 Class members', '194'), | 
|  | ('9.3 Member functions', '197'), | 
|  | ('9.4 Static members', '200'), | 
|  | ('9.5 Unions', '202'), | 
|  | ('9.6 Bit-fields', '203'), | 
|  | ('9.7 Nested class declarations', '204'), | 
|  | ('9.8 Local class declarations', '205'), | 
|  | ('9.9 Nested type names', '206'), | 
|  | ('10 Derived classes', '207'), | 
|  | ('10.1 Multiple base classes', '208'), | 
|  | ('10.2 Member name lookup', '210'), | 
|  | ('10.3 Virtual functions', '213'), | 
|  | ('10.4 Abstract classes', '217'), | 
|  | ('11 Member access control', '219'), | 
|  | ('11.1 Access specifiers', '221'), | 
|  | ('11.2 Accessibility of base classes and base class members', '222'), | 
|  | ('11.3 Access declarations', '224'), | 
|  | ('11.4 Friends', '225'), | 
|  | ('11.5 Protected member access', '228'), | 
|  | ('11.6 Access to virtual functions', '229'), | 
|  | ('11.7 Multiple access', '230'), | 
|  | ('11.8 Nested classes', '230'), | 
|  | ('12 Special member functions', '231'), | 
|  | ('12.1 Constructors', '231'), | 
|  | ('12.2 Temporary objects', '233'), | 
|  | ('12.3 Conversions', '235'), | 
|  | ('12.4 Destructors', '238'), | 
|  | ('12.5 Free store', '240'), | 
|  | ('12.6 Initialization', '242'), | 
|  | ('12.7 Construction and destruction', '247'), | 
|  | ('12.8 Copying class objects', '250'), | 
|  | ('12.9 Inheriting Constructors', '255'), | 
|  | ('13 Overloading', '259'), | 
|  | ('13.1 Overloadable declarations', '259'), | 
|  | ('13.2 Declaration matching', '261'), | 
|  | ('13.3 Overload resolution', '262'), | 
|  | ('13.4 Address of overloaded function', '281'), | 
|  | ('13.5 Overloaded operators', '282'), | 
|  | ('13.6 Built-in operators', '286'), | 
|  | ('14 Templates', '290'), | 
|  | ('14.1 Template parameters', '291'), | 
|  | ('14.2 Names of template specializations', '294'), | 
|  | ('14.3 Template arguments', '296'), | 
|  | ('14.4 Type equivalence', '302'), | 
|  | ('14.5 Template declarations', '303'), | 
|  | ('14.6 Name resolution', '318'), | 
|  | ('14.7 Template instantiation and specialization', '331'), | 
|  | ('14.8 Function template specializations', '343'), | 
|  | ('15 Exception handling', '363'), | 
|  | ('15.1 Throwing an exception', '364'), | 
|  | ('15.2 Constructors and destructors', '366'), | 
|  | ('15.3 Handling an exception', '366'), | 
|  | ('15.4 Exception specifications', '368'), | 
|  | ('15.5 Special functions', '371'), | 
|  | ('15.6 Exceptions and access', '372'), | 
|  | ('16 Preprocessing directives', '373'), | 
|  | ('16.1 Conditional inclusion', '375'), | 
|  | ('16.2 Source file inclusion', '376'), | 
|  | ('16.3 Macro replacement', '377'), | 
|  | ('16.4 Line control', '382'), | 
|  | ('16.5 Error directive', '383'), | 
|  | ('16.6 Pragma directive', '383'), | 
|  | ('16.7 Null directive', '383'), | 
|  | ('16.8 Predefined macro names', '383'), | 
|  | ('16.9 Pragma operator', '384'), | 
|  | ('17 Library introduction', '386'), | 
|  | ('17.1 General', '386'), | 
|  | ('17.2 Overview', '386'), | 
|  | ('17.3 Definitions', '386'), | 
|  | ('17.4 Additional definitions', '390'), | 
|  | ('17.5 Method of description (Informative)', '390'), | 
|  | ('17.6 Library-wide requirements', '396'), | 
|  | ('18 Language support library', '407'), | 
|  | ('18.1 Types', '407'), | 
|  | ('18.2 Implementation properties', '408'), | 
|  | ('18.3 Integer types', '417'), | 
|  | ('18.4 Start and termination', '418'), | 
|  | ('18.5 Dynamic memory management', '420'), | 
|  | ('18.6 Type identification', '424'), | 
|  | ('18.7 Exception handling', '427'), | 
|  | ('18.8 Initializer lists', '432'), | 
|  | ('18.9 Other runtime support', '434'), | 
|  | ('19 Diagnostics library', '435'), | 
|  | ('19.1 Exception classes', '435'), | 
|  | ('19.2 Assertions', '439'), | 
|  | ('19.3 Error numbers', '440'), | 
|  | ('19.4 System error support', '440'), | 
|  | ('20 General utilities library', '452'), | 
|  | ('20.1 Requirements', '452'), | 
|  | ('20.2 Utility components', '457'), | 
|  | ('20.3 Compile-time rational arithmetic', '463'), | 
|  | ('20.4 Tuples', '465'), | 
|  | ('20.5 Metaprogramming and type traits', '473'), | 
|  | ('20.6 Function objects', '486'), | 
|  | ('20.7 Memory', '509'), | 
|  | ('20.8 Time utilities', '548'), | 
|  | ('20.9 Date and time functions', '562'), | 
|  | ('21 Strings library', '563'), | 
|  | ('21.1 Character traits', '563'), | 
|  | ('21.2 String classes', '569'), | 
|  | ('21.3 Class template basic_string', '572'), | 
|  | ('21.4 Numeric Conversions', '599'), | 
|  | ('21.5 Null-terminated sequence utilities', '600'), | 
|  | ('22 Localization library', '604'), | 
|  | ('22.1 Locales', '604'), | 
|  | ('22.2 Standard locale categories', '617'), | 
|  | ('22.3 Standard code conversion facets', '657'), | 
|  | ('22.4 C Library Locales', '659'), | 
|  | ('23 Containers library', '660'), | 
|  | ('23.1 Container requirements', '660'), | 
|  | ('23.2 Sequence containers', '681'), | 
|  | ('23.3 Associative containers', '719'), | 
|  | ('23.4 Unordered associative containers', '744'), | 
|  | ('24 Iterators library', '759'), | 
|  | ('24.1 Iterator requirements', '759'), | 
|  | ('24.2 Header <iterator> synopsis', '764'), | 
|  | ('24.3 Iterator primitives', '767'), | 
|  | ('24.4 Predefined iterators', '770'), | 
|  | ('24.5 Stream iterators', '784'), | 
|  | ('25 Algorithms library', '792'), | 
|  | ('25.1 Non-modifying sequence operations', '802'), | 
|  | ('25.2 Mutating sequence operations', '806'), | 
|  | ('25.3 Sorting and related operations', '815'), | 
|  | ('25.4 C library algorithms', '829'), | 
|  | ('26 Numerics library', '831'), | 
|  | ('26.1 Numeric type requirements', '831'), | 
|  | ('26.2 The floating-point environment', '832'), | 
|  | ('26.3 Complex numbers', '833'), | 
|  | ('26.4 Random number generation', '842'), | 
|  | ('26.5 Numeric arrays', '884'), | 
|  | ('26.6 Generalized numeric operations', '904'), | 
|  | ('26.7 C Library', '907'), | 
|  | ('27 Input/output library', '912'), | 
|  | ('27.1 Iostreams requirements', '912'), | 
|  | ('27.2 Forward declarations', '912'), | 
|  | ('27.3 Standard iostream objects', '915'), | 
|  | ('27.4 Iostreams base classes', '916'), | 
|  | ('27.5 Stream buffers', '934'), | 
|  | ('27.6 Formatting and manipulators', '944'), | 
|  | ('27.7 String-based streams', '972'), | 
|  | ('27.8 File-based streams', '984'), | 
|  | ('28 Regular expressions library', '1000'), | 
|  | ('28.1 Definitions', '1000'), | 
|  | ('28.2 Requirements', '1000'), | 
|  | ('28.3 Regular expressions summary', '1002'), | 
|  | ('28.4 Header <regex> synopsis', '1003'), | 
|  | ('28.5 Namespace std::regex_constants', '1009'), | 
|  | ('28.6 Class regex_error', '1012'), | 
|  | ('28.7 Class template regex_traits', '1012'), | 
|  | ('28.8 Class template basic_regex', '1015'), | 
|  | ('28.9 Class template sub_match', '1020'), | 
|  | ('28.10Class template match_results', '1025'), | 
|  | ('28.11Regular expression algorithms', '1029'), | 
|  | ('28.12Regular expression Iterators', '1033'), | 
|  | ('28.13Modified ECMAScript regular expression grammar', '1039'), | 
|  | ('29 Atomic operations library', '1042'), | 
|  | ('29.1 Order and Consistency', '1044'), | 
|  | ('29.2 Lock-free Property', '1046'), | 
|  | ('29.3 Atomic Types', '1046'), | 
|  | ('29.4 Operations on Atomic Types', '1051'), | 
|  | ('29.5 Flag Type and Operations', '1054'), | 
|  | ('30 Thread support library', '1057'), | 
|  | ('30.1 Requirements', '1057'), | 
|  | ('30.2 Threads', '1058'), | 
|  | ('30.3 Mutual exclusion', '1063'), | 
|  | ('30.4 Condition variables', '1077'), | 
|  | ('A Grammar summary', '1085'), | 
|  | ('A.1 Keywords', '1085'), | 
|  | ('A.2 Lexical conventions', '1085'), | 
|  | ('A.3 Basic concepts', '1089'), | 
|  | ('A.4 Expressions', '1090'), | 
|  | ('A.5 Statements', '1093'), | 
|  | ('A.6 Declarations', '1094'), | 
|  | ('A.7 Declarators', '1097'), | 
|  | ('A.8 Classes', '1098'), | 
|  | ('A.9 Derived classes', '1099'), | 
|  | ('A.10 Special member functions', '1099'), | 
|  | ('A.11 Overloading', '1100'), | 
|  | ('A.12 Templates', '1100'), | 
|  | ('A.13 Exception handling', '1101'), | 
|  | ('A.14 Preprocessing directives', '1101'), | 
|  | ('B Implementation quantities', '1103'), | 
|  | ('C Compatibility', '1105'), | 
|  | ('C.1 C++ and ISO C', '1105'), | 
|  | ('C.2 Standard C library', '1114'), | 
|  | ('D Compatibility features', '1119'), | 
|  | ('D.1 Increment operator with bool operand', '1119'), | 
|  | ('D.2 static keyword', '1119'), | 
|  | ('D.3 Access declarations', '1119'), | 
|  | ('D.4 Implicit conversion from const strings', '1119'), | 
|  | ('D.5 C standard library headers', '1119'), | 
|  | ('D.6 Old iostreams members', '1120'), | 
|  | ('D.7 char* streams', '1121'), | 
|  | ('D.8 Binders', '1130'), | 
|  | ('D.9 auto_ptr', '1132'), | 
|  | ('E Universal-character-names', '1135'), | 
|  | ('F Cross references', '1137'), | 
|  | ('Index', '1153')] | 
|  |  | 
|  | kDocuments = { | 
|  | 'C99' : (c99URL, c99TOC, 12), | 
|  | 'C++' : (cXXURL, cXXTOC, 12), | 
|  | } | 
|  |  | 
|  | def findClosestTOCEntry(data, target): | 
|  | # FIXME: Fix for named spec references | 
|  | if isinstance(target[0],str): | 
|  | return ('.'.join(target),'<named>',1) | 
|  |  | 
|  | offset = data[2] | 
|  | best = None | 
|  | for (name,page) in data[1]: | 
|  | if ' ' in name: | 
|  | section,name = name.split(' ',1) | 
|  | if section == 'Annex': | 
|  | section,name = name.split(' ',1) | 
|  | section = 'Annex '+section | 
|  | else: | 
|  | section = None | 
|  | try: | 
|  | page = int(page) + offset | 
|  | except: | 
|  | page = 1 | 
|  | try: | 
|  | spec = SpecIndex.fromstring(section) | 
|  | except: | 
|  | spec = None | 
|  |  | 
|  | # Meh, could be better... | 
|  | if spec is not None: | 
|  | dist = spec - target | 
|  | if best is None or dist < best[0]: | 
|  | best = (dist, (section, name, page)) | 
|  | return best[1] | 
|  |  | 
|  | # What a hack. Slow to boot. | 
|  | doxyLineRefRE = re.compile(r"<a name=\"l([0-9]+)\"></a>") | 
|  | def findClosestLineReference(clangRoot, doxyName, target): | 
|  | try: | 
|  | f = open(os.path.join(clangRoot, 'docs', 'doxygen', 'html', doxyName)) | 
|  | except: | 
|  | return None | 
|  |  | 
|  | best = None | 
|  | for m in doxyLineRefRE.finditer(f.read()): | 
|  | line = int(m.group(1), 10) | 
|  | dist = abs(line - target) | 
|  | if best is None or dist < best[0]: | 
|  | best = (dist,'l'+m.group(1)) | 
|  | f.close() | 
|  | if best is not None: | 
|  | return best[1] | 
|  | return None | 
|  |  | 
|  | ### | 
|  |  | 
|  | nameAndSpecRefRE = re.compile(r"(C99|C90|C\+\+|H\&S) ((([0-9]+)(\.[0-9]+)*|\[[^]]+\])(p[0-9]+)?)") | 
|  | loneSpecRefRE = re.compile(r" (([0-9]+)(\.[0-9]+){2,100}(p[0-9]+)?)") | 
|  | def scanFile(path, filename): | 
|  | try: | 
|  | f = open(path) | 
|  | except IOError: | 
|  | print >>sys.stderr,'WARNING: Unable to open:',path | 
|  | return | 
|  |  | 
|  | for i,ln in enumerate(f): | 
|  | ignore = set() | 
|  | for m in nameAndSpecRefRE.finditer(ln): | 
|  | section = m.group(2) | 
|  | name = m.group(1) | 
|  | if section.endswith('.'): | 
|  | section = section[:-1] | 
|  | yield RefItem(name, section, filename, path, i+1) | 
|  | ignore.add(section) | 
|  | for m in loneSpecRefRE.finditer(ln): | 
|  | section = m.group(1) | 
|  | if section.endswith('.'): | 
|  | section = section[:-1] | 
|  | if section not in ignore: | 
|  | yield RefItem(None, section, filename, path, i+1) | 
|  |  | 
|  | ### | 
|  |  | 
|  | class SpecIndex: | 
|  | @staticmethod | 
|  | def fromstring(str): | 
|  | # Check for named sections | 
|  | if str[0] == '[': | 
|  | assert ']' in str | 
|  | secs = str[1:str.index(']')].split('.') | 
|  | tail = str[str.index(']')+1:] | 
|  | if tail: | 
|  | assert tail[0] == 'p' | 
|  | paragraph = int(tail[1:]) | 
|  | else: | 
|  | paragraph = None | 
|  | indices = secs | 
|  | else: | 
|  | secs = str.split('.') | 
|  | paragraph = None | 
|  | if 'p' in secs[-1]: | 
|  | secs[-1],p = secs[-1].split('p',1) | 
|  | paragraph = int(p) | 
|  | indices = map(int, secs) | 
|  | return SpecIndex(indices, paragraph) | 
|  |  | 
|  | def __init__(self, indices, paragraph=None): | 
|  | assert len(indices)>0 | 
|  | self.indices = tuple(indices) | 
|  | self.paragraph = paragraph | 
|  |  | 
|  | def __str__(self): | 
|  | s =  '.'.join(map(str,self.indices)) | 
|  | if self.paragraph is not None: | 
|  | s += '.p%d'%(self.paragraph,) | 
|  | return s | 
|  |  | 
|  | def __repr__(self): | 
|  | return 'SpecIndex(%s, %s)'%(self.indices, self.paragraph) | 
|  |  | 
|  | def __cmp__(self, b): | 
|  | return cmp((self.indices,self.paragraph), | 
|  | (b.indices,b.paragraph)) | 
|  |  | 
|  | def __hash__(self): | 
|  | return hash((self.indices,self.paragraph)) | 
|  |  | 
|  | def __sub__(self, indices): | 
|  | def sub(a,b): | 
|  | a = a or 0 | 
|  | b = b or 0 | 
|  | return abs(a-b) | 
|  | return map(sub,self.indices,indices) | 
|  |  | 
|  | class RefItem: | 
|  | def __init__(self, name, section, filename, path, line): | 
|  | self.name = name | 
|  | self.section = SpecIndex.fromstring(section) | 
|  | self.filename = filename | 
|  | self.path = path | 
|  | self.line = line | 
|  |  | 
|  | def __str__(self): | 
|  | if self.name is not None: | 
|  | return '%s %s'%(self.name, self.section) | 
|  | else: | 
|  | return '--- %s'%(self.section,) | 
|  |  | 
|  | def __repr__(self): | 
|  | return 'RefItem(%s, %r, "%s", "%s", %d)'%(self.name, | 
|  | self.section, | 
|  | self.filename, | 
|  | self.path, | 
|  | self.line) | 
|  |  | 
|  | def __cmp__(self, b): | 
|  | return cmp((self.name,self.section,self.filename,self.path,self.line), | 
|  | (b.name,b.section,self.filename,self.path,self.line)) | 
|  |  | 
|  | def __hash__(self): | 
|  | return hash((self.name,self.section,self.filename,self.path,self.line)) | 
|  |  | 
|  | ### | 
|  |  | 
|  | def sorted(l): | 
|  | l = list(l) | 
|  | l.sort() | 
|  | return l | 
|  |  | 
|  | def getRevision(path): | 
|  | import subprocess | 
|  | p = subprocess.Popen(['svn', 'info', path], | 
|  | stdin=open('/dev/null','r'), | 
|  | stdout=subprocess.PIPE) | 
|  | for ln in p.stdout.read(1024).split('\n'): | 
|  | if ln.startswith('Revision:'): | 
|  | return ln.split(':',1)[1].strip() | 
|  | return None | 
|  |  | 
|  | def buildRefTree(references): | 
|  | root = (None, {}, []) | 
|  |  | 
|  | def getNode(keys): | 
|  | if not keys: | 
|  | return root | 
|  | key,parent = keys[-1],getNode(keys[:-1]) | 
|  | node = parent[1].get(key) | 
|  | if node is None: | 
|  | parent[1][key] = node = (key, {}, []) | 
|  | return node | 
|  |  | 
|  | for ref in references: | 
|  | n = getNode((ref.name,) + ref.section.indices) | 
|  | n[2].append(ref) | 
|  |  | 
|  | def flatten((key, children, data)): | 
|  | children = sorted(map(flatten,children.values())) | 
|  | return (key, children, sorted(data)) | 
|  |  | 
|  | return flatten(root) | 
|  |  | 
|  | def preorder(node,parents=(),first=True): | 
|  | (key,children,data) = node | 
|  | if first: | 
|  | yield parents+(node,) | 
|  | for c in children: | 
|  | for item in preorder(c, parents+(node,)): | 
|  | yield item | 
|  |  | 
|  | def main(): | 
|  | global options | 
|  | from optparse import OptionParser | 
|  | parser = OptionParser("usage: %prog [options] CLANG_ROOT <output-dir>") | 
|  | parser.add_option("", "--debug", dest="debug", | 
|  | help="Print extra debugging output", | 
|  | action="store_true", | 
|  | default=False) | 
|  | (opts, args) = parser.parse_args() | 
|  |  | 
|  | if len(args) != 2: | 
|  | parser.error("incorrect number of arguments") | 
|  |  | 
|  | references = [] | 
|  | root,outputDir = args | 
|  | if os.path.isdir(root): | 
|  | for (dirpath, dirnames, filenames) in os.walk(root): | 
|  | for filename in filenames: | 
|  | name,ext = os.path.splitext(filename) | 
|  | if ext in ('.c', '.cpp', '.h', '.def'): | 
|  | fullpath = os.path.join(dirpath, filename) | 
|  | references.extend(list(scanFile(fullpath, filename))) | 
|  | else: | 
|  | references.extend(list(scanFile(root, root))) | 
|  |  | 
|  | refTree = buildRefTree(references) | 
|  |  | 
|  | specs = {} | 
|  | for ref in references: | 
|  | spec = specs[ref.name] = specs.get(ref.name,{}) | 
|  | items = spec[ref.section] = spec.get(ref.section,[]) | 
|  | items.append(ref) | 
|  |  | 
|  | print 'Found %d references.'%(len(references),) | 
|  |  | 
|  | if opts.debug: | 
|  | pprint(refTree) | 
|  |  | 
|  | referencesPath = os.path.join(outputDir,'references.html') | 
|  | print 'Writing: %s'%(referencesPath,) | 
|  | f = open(referencesPath,'w') | 
|  | print >>f, '<html><head><title>clang: Specification References</title></head>' | 
|  | print >>f, '<body>' | 
|  | print >>f, '\t<h2>Specification References</h2>' | 
|  | for i,node in enumerate(refTree[1]): | 
|  | specName = node[0] or 'Unknown' | 
|  | print >>f, '<a href="#spec%d">%s</a><br>'%(i,specName) | 
|  | for i,node in enumerate(refTree[1]): | 
|  | specName = node[0] or 'Unknown' | 
|  | print >>f, '<hr>' | 
|  | print >>f, '<a name="spec%d">'%(i,) | 
|  | print >>f, '<h3>Document: %s</h3>'%(specName or 'Unknown',) | 
|  | print >>f, '<table border="1" cellspacing="2" width="80%">' | 
|  | print >>f, '<tr><th width="20%">Name</th><th>References</th></tr>' | 
|  | docData = kDocuments.get(specName) | 
|  | for path in preorder(node,first=False): | 
|  | if not path[-1][2]: | 
|  | continue | 
|  | components = '.'.join([str(p[0]) for p in path[1:]]) | 
|  | print >>f, '\t<tr>' | 
|  | tocEntry = None | 
|  | if docData is not None: | 
|  | tocEntry = findClosestTOCEntry(docData, [p[0] for p in path[1:]]) | 
|  | if tocEntry is not None: | 
|  | section,name,page = tocEntry | 
|  | # If section is exact print the TOC name | 
|  | if page is not None: | 
|  | linkStr = '<a href="%s#page=%d">%s</a> (pg.%d)'%(docData[0],page,components,page) | 
|  | else: | 
|  | linkStr = components | 
|  | if section == components: | 
|  | print >>f, '\t\t<td valign=top>%s<br>%s</td>'%(linkStr,name) | 
|  | else: | 
|  | print >>f, '\t\t<td valign=top>%s</td>'%(linkStr,) | 
|  | else: | 
|  | print >>f, '\t\t<td valign=top>%s</td>'%(components,) | 
|  | print >>f, '\t\t<td valign=top>' | 
|  | for item in path[-1][2]: | 
|  | # XXX total hack | 
|  | relativePath = item.path[len(root):] | 
|  | if relativePath.startswith('/'): | 
|  | relativePath = relativePath[1:] | 
|  | # XXX this is broken, how does doxygen mangle w/ multiple | 
|  | # refs? Can we just read its map? | 
|  | filename = os.path.basename(relativePath) | 
|  | doxyName = '%s-source.html'%(filename.replace('.','_8'),) | 
|  | # Grrr, why can't doxygen write line number references. | 
|  | lineReference = findClosestLineReference(root,doxyName,item.line) | 
|  | if lineReference is not None: | 
|  | linkStr = 'http://clang.llvm.org/doxygen/%s#%s'%(doxyName,lineReference) | 
|  | else: | 
|  | linkStr = 'http://clang.llvm.org/doxygen/%s'%(doxyName,) | 
|  | if item.section.paragraph is not None: | 
|  | paraText = ' (p%d)'%(item.section.paragraph,) | 
|  | else: | 
|  | paraText = '' | 
|  | print >>f,'<a href="%s">%s:%d</a>%s<br>'%(linkStr,relativePath,item.line,paraText) | 
|  | print >>f, '\t\t</td>' | 
|  | print >>f, '\t</tr>' | 
|  | print >>f, '</table>' | 
|  | print >>f, '<hr>' | 
|  | print >>f, 'Generated: %s<br>'%(time.strftime('%Y-%m-%d %H:%M'),) | 
|  | print >>f, 'SVN Revision: %s'%(getRevision(root),) | 
|  | print >>f, '</body>' | 
|  | f.close() | 
|  |  | 
|  | if __name__=='__main__': | 
|  | main() |