| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910 |
- #!/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()
|