1ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao#!/usr/bin/env python
2ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao
3ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liaoimport os
4ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liaoimport re
5ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liaoimport time
6ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liaofrom pprint import pprint
7ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao
8ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao###
9ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao
10ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liaoc99URL = 'http://www.open-std.org/jtc1/sc22/wg14/www/docs/n1124.pdf'
11ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liaoc99TOC = [('Foreword', 'xi'),
12ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao('Introduction', 'xiv'),
13ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao('1. Scope', '1'),
14ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao('2. Normative references', '2'),
15ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao('3. Terms, definitions, and symbols', '3'),
16ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao('4. Conformance', '7'),
17ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao('5. Environment', '9'),
18ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao('5.1 Conceptual models', '9'),
19ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao('5.1.1 Translation environment', '9'),
20ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao('5.1.2 Execution environments', '11'),
21ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao('5.2 Environmental considerations', '17'),
22ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao('5.2.1 Character sets', '17'),
23ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao('5.2.2 Character display semantics', '19'),
24ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao('5.2.3 Signals and interrupts', '20'),
25ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao('5.2.4 Environmental limits', '20'),
26ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao('6. Language', '29'),
27ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao('6.1 Notation', '29'),
28ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao('6.2 Concepts', '29'),
29ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao('6.2.1 Scopes of identifiers', '29'),
30ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao('6.2.2 Linkages of identifiers', '30'),
31ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao('6.2.3 Name spaces of identifiers', '31'),
32ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao('6.2.4 Storage durations of objects', '32'),
33ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao('6.2.5 Types', '33'),
34ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao('6.2.6 Representations of types', '37'),
35ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao('6.2.7 Compatible type and composite type', '40'),
36ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao('6.3 Conversions', '42'),
37ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao('6.3.1 Arithmetic operands', '42'),
38ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao('6.3.2 Other operands', '46'),
39ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao('6.4 Lexical elements', '49'),
40ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao('6.4.1 Keywords', '50'),
41ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao('6.4.2 Identifiers', '51'),
42ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao('6.4.3 Universal character names', '53'),
43ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao('6.4.4 Constants', '54'),
44ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao('6.4.5 String literals', '62'),
45ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao('6.4.6 Punctuators', '63'),
46ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao('6.4.7 Header names', '64'),
47ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao('6.4.8 Preprocessing numbers', '65'),
48ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao('6.4.9 Comments', '66'),
49ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao('6.5 Expressions', '67'),
50ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao('6.5.1 Primary expressions', '69'),
51ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao('6.5.2 Postfix operators', '69'),
52ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao('6.5.3 Unary operators', '78'),
53ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao('6.5.4 Cast operators', '81'),
54ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao('6.5.5 Multiplicative operators', '82'),
55ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao('6.5.6 Additive operators', '82'),
56ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao('6.5.7 Bitwise shift operators', '84'),
57ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao('6.5.8 Relational operators', '85'),
58ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao('6.5.9 Equality operators', '86'),
59ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao('6.5.10 Bitwise AND operator', '87'),
60ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao('6.5.11 Bitwise exclusive OR operator', '88'),
61ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao('6.5.12 Bitwise inclusive OR operator', '88'),
62ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao('6.5.13 Logical AND operator', '89'),
63ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao('6.5.14 Logical OR operator', '89'),
64ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao('6.5.15 Conditional operator', '90'),
65ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao('6.5.16 Assignment operators', '91'),
66ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao('6.5.17 Comma operator', '94'),
67ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao('6.6 Constant expressions', '95'),
68ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao('6.7 Declarations', '97'),
69ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao('6.7.1 Storage-class specifiers', '98'),
70ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao('6.7.2 Type specifiers', '99'),
71ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao('6.7.3 Type qualifiers', '108'),
72ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao('6.7.4 Function specifiers', '112'),
73ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao('6.7.5 Declarators', '114'),
74ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao('6.7.6 Type names', '122'),
75ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao('6.7.7 Type definitions', '123'),
76ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao('6.7.8 Initialization', '125'),
77ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao('6.8 Statements and blocks', '131'),
78ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao('6.8.1 Labeled statements', '131'),
79ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao('6.8.2 Compound statement', '132'),
80ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao('6.8.3 Expression and null statements', '132'),
81ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao('6.8.4 Selection statements', '133'),
82ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao('6.8.5 Iteration statements', '135'),
83ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao('6.8.6 Jump statements', '136'),
84ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao('6.9 External definitions', '140'),
85ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao('6.9.1 Function definitions', '141'),
86ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao('6.9.2 External object definitions', '143'),
87ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao('6.10 Preprocessing directives', '145'),
88ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao('6.10.1 Conditional inclusion', '147'),
89ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao('6.10.2 Source file inclusion', '149'),
90ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao('6.10.3 Macro replacement', '151'),
91ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao('6.10.4 Line control', '158'),
92ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao('6.10.5 Error directive', '159'),
93ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao('6.10.6 Pragma directive', '159'),
94ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao('6.10.7 Null directive', '160'),
95ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao('6.10.8 Predefined macro names', '160'),
96ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao('6.10.9 Pragma operator', '161'),
97ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao('6.11 Future language directions', '163'),
98ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao('6.11.1 Floating types', '163'),
99ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao('6.11.2 Linkages of identifiers', '163'),
100ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao('6.11.3 External names', '163'),
101ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao('6.11.4 Character escape sequences', '163'),
102ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao('6.11.5 Storage-class specifiers', '163'),
103ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao('6.11.6 Function declarators', '163'),
104ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao('6.11.7 Function definitions', '163'),
105ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao('6.11.8 Pragma directives', '163'),
106ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao('6.11.9 Predefined macro names', '163'),
107ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao('7. Library', '164'),
108ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao('7.1 Introduction', '164'),
109ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao('7.1.1 Definitions of terms', '164'),
110ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao('7.1.2 Standard headers', '165'),
111ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao('7.1.3 Reserved identifiers', '166'),
112ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao('7.1.4 Use of library functions', '166'),
113ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao('7.2 Diagnostics <assert.h>', '169'),
114ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao('7.2.1 Program diagnostics', '169'),
115ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao('7.3 Complex arithmetic <complex.h>', '170'),
116ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao('7.3.1 Introduction', '170'),
117ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao('7.3.2 Conventions', '170'),
118ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao('7.3.3 Branch cuts', '171'),
119ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao('7.3.4 The CX_LIMITED_RANGE pragma', '171'),
120ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao('7.3.5 Trigonometric functions', '172'),
121ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao('7.3.6 Hyperbolic functions', '174'),
122ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao('7.3.7 Exponential and logarithmic functions', '176'),
123ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao('7.3.8 Power and absolute-value functions', '177'),
124ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao('7.3.9 Manipulation functions', '178'),
125ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao('7.4 Character handling <ctype.h>', '181'),
126ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao('7.4.1 Character classification functions', '181'),
127ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao('7.4.2 Character case mapping functions', '184'),
128ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao('7.5 Errors <errno.h>', '186'),
129ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao('7.6 Floating-point environment <fenv.h>', '187'),
130ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao('7.6.1 The FENV_ACCESS pragma', '189'),
131ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao('7.6.2 Floating-point exceptions', '190'),
132ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao('7.6.3 Rounding', '193'),
133ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao('7.6.4 Environment', '194'),
134ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao('7.7 Characteristics of floating types <float.h>', '197'),
135ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao('7.8 Format conversion of integer types <inttypes.h>', '198'),
136ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao('7.8.1 Macros for format specifiers', '198'),
137ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao('7.8.2 Functions for greatest-width integer types', '199'),
138ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao('7.9 Alternative spellings <iso646.h>', '202'),
139ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao('7.10 Sizes of integer types <limits.h>', '203'),
140ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao('7.11 Localization <locale.h>', '204'),
141ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao('7.11.1 Locale control', '205'),
142ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao('7.11.2 Numeric formatting convention inquiry', '206'),
143ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao('7.12 Mathematics <math.h>', '212'),
144ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao('7.12.1 Treatment of error conditions', '214'),
145ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao('7.12.2 The FP_CONTRACT pragma', '215'),
146ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao('7.12.3 Classification macros', '216'),
147ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao('7.12.4 Trigonometric functions', '218'),
148ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao('7.12.5 Hyperbolic functions', '221'),
149ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao('7.12.6 Exponential and logarithmic functions', '223'),
150ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao('7.12.7 Power and absolute-value functions', '228'),
151ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao('7.12.8 Error and gamma functions', '230'),
152ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao('7.12.9 Nearest integer functions', '231'),
153ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao('7.12.10 Remainder functions', '235'),
154ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao('7.12.11 Manipulation functions', '236'),
155ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao('7.12.12 Maximum, minimum, and positive difference functions', '238'),
156ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao('7.12.13 Floating multiply-add', '239'),
157ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao('7.12.14 Comparison macros', '240'),
158ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao('7.13 Nonlocal jumps <setjmp.h>', '243'),
159ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao('7.13.1 Save calling environment', '243'),
160ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao('7.13.2 Restore calling environment', '244'),
161ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao('7.14 Signal handling <signal.h>', '246'),
162ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao('7.14.1 Specify signal handling', '247'),
163ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao('7.14.2 Send signal', '248'),
164ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao('7.15 Variable arguments <stdarg.h>', '249'),
165ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao('7.15.1 Variable argument list access macros', '249'),
166ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao('7.16 Boolean type and values <stdbool.h>', '253'),
167ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao('7.17 Common definitions <stddef.h>', '254'),
168ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao('7.18 Integer types <stdint.h>', '255'),
169ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao('7.18.1 Integer types', '255'),
170ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao('7.18.2 Limits of specified-width integer types', '257'),
171ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao('7.18.3 Limits of other integer types', '259'),
172ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao('7.18.4 Macros for integer constants', '260'),
173ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao('7.19 Input/output <stdio.h>', '262'),
174ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao('7.19.1 Introduction', '262'),
175ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao('7.19.2 Streams', '264'),
176ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao('7.19.3 Files', '266'),
177ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao('7.19.4 Operations on files', '268'),
178ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao('7.19.5 File access functions', '270'),
179ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao('7.19.6 Formatted input/output functions', '274'),
180ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao('7.19.7 Character input/output functions', '296'),
181ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao('7.19.8 Direct input/output functions', '301'),
182ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao('7.19.9 File positioning functions', '302'),
183ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao('7.19.10 Error-handling functions', '304'),
184ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao('7.20 General utilities <stdlib.h>', '306'),
185ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao('7.20.1 Numeric conversion functions', '307'),
186ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao('7.20.2 Pseudo-random sequence generation functions', '312'),
187ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao('7.20.3 Memory management functions', '313'),
188ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao('7.20.4 Communication with the environment', '315'),
189ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao('7.20.5 Searching and sorting utilities', '318'),
190ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao('7.20.6 Integer arithmetic functions', '320'),
191ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao('7.20.7 Multibyte/wide character conversion functions', '321'),
192ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao('7.20.8 Multibyte/wide string conversion functions', '323'),
193ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao('7.21 String handling <string.h>', '325'),
194ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao('7.21.1 String function conventions', '325'),
195ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao('7.21.2 Copying functions', '325'),
196ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao('7.21.3 Concatenation functions', '327'),
197ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao('7.21.4 Comparison functions', '328'),
198ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao('7.21.5 Search functions', '330'),
199ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao('7.21.6 Miscellaneous functions', '333'),
200ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao('7.22 Type-generic math <tgmath.h>', '335'),
201ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao('7.23 Date and time <time.h>', '338'),
202ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao('7.23.1 Components of time', '338'),
203ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao('7.23.2 Time manipulation functions', '339'),
204ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao('7.23.3 Time conversion functions', '341'),
205ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao('7.24 Extended multibyte and wide character utilities <wchar.h>', '348'),
206ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao('7.24.1 Introduction', '348'),
207ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao('7.24.2 Formatted wide character input/output functions', '349'),
208ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao('7.24.3 Wide character input/output functions', '367'),
209ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao('7.24.4 General wide string utilities', '371'),
210ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao('7.24.5 Wide character time conversion functions', '385'),
211ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao('7.24.6 Extended multibyte/wide character conversion utilities', '386'),
212ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao('7.25 Wide character classification and mapping utilities <wctype.h>',
213ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao  '393'),
214ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao('7.25.1 Introduction', '393'),
215ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao('7.25.2 Wide character classification utilities', '394'),
216ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao('7.25.3 Wide character case mapping utilities', '399'),
217ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao('7.26 Future library directions', '401'),
218ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao('7.26.1 Complex arithmetic <complex.h>', '401'),
219ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao('7.26.2 Character handling <ctype.h>', '401'),
220ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao('7.26.3 Errors <errno.h>', '401'),
221ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao('7.26.4 Format conversion of integer types <inttypes.h>', '401'),
222ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao('7.26.5 Localization <locale.h>', '401'),
223ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao('7.26.6 Signal handling <signal.h>', '401'),
224ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao('7.26.7 Boolean type and values <stdbool.h>', '401'),
225ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao('7.26.8 Integer types <stdint.h>', '401'),
226ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao('7.26.9 Input/output <stdio.h>', '402'),
227ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao('7.26.10 General utilities <stdlib.h>', '402'),
228ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao('7.26.11 String handling <string.h>', '402'),
229ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao('<wchar.h>', '402'),
230ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao('<wctype.h>', '402'),
231ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao('Annex A (informative) Language syntax summary', '403'),
232ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao('A.1 Lexical grammar', '403'),
233ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao('A.2 Phrase structure grammar', '409'),
234ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao('A.3 Preprocessing directives', '416'),
235ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao('Annex B (informative) Library summary', '418'),
236ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao('B.1 Diagnostics <assert.h>', '418'),
237ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao('B.2 Complex <complex.h>', '418'),
238ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao('B.3 Character handling <ctype.h>', '420'),
239ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao('B.4 Errors <errno.h>', '420'),
240ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao('B.5 Floating-point environment <fenv.h>', '420'),
241ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao('B.6 Characteristics of floating types <float.h>', '421'),
242ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao('B.7 Format conversion of integer types <inttypes.h>', '421'),
243ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao('B.8 Alternative spellings <iso646.h>', '422'),
244ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao('B.9 Sizes of integer types <limits.h>', '422'),
245ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao('B.10 Localization <locale.h>', '422'),
246ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao('B.11 Mathematics <math.h>', '422'),
247ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao('B.12 Nonlocal jumps <setjmp.h>', '427'),
248ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao('B.13 Signal handling <signal.h>', '427'),
249ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao('B.14 Variable arguments <stdarg.h>', '427'),
250ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao('B.15 Boolean type and values <stdbool.h>', '427'),
251ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao('B.16 Common definitions <stddef.h>', '428'),
252ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao('B.17 Integer types <stdint.h>', '428'),
253ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao('B.18 Input/output <stdio.h>', '428'),
254ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao('B.19 General utilities <stdlib.h>', '430'),
255ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao('B.20 String handling <string.h>', '432'),
256ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao('B.21 Type-generic math <tgmath.h>', '433'),
257ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao('B.22 Date and time <time.h>', '433'),
258ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao('B.23 Extended multibyte/wide character utilities <wchar.h>', '434'),
259ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao('B.24 Wide character classification and mapping utilities <wctype.h>',
260ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao  '436'),
261ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao('Annex C (informative) Sequence points', '438'),
262ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao('Annex D (normative) Universal character names for identifiers', '439'),
263ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao('Annex E (informative) Implementation limits', '441'),
264ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao('Annex F (normative) IEC 60559 floating-point arithmetic', '443'),
265ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao('F.1 Introduction', '443'),
266ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao('F.2 Types', '443'),
267ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao('F.3 Operators and functions', '444'),
268ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao('F.4 Floating to integer conversion', '446'),
269ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao('F.5 Binary-decimal conversion', '446'),
270ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao('F.6 Contracted expressions', '447'),
271ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao('F.7 Floating-point environment', '447'),
272ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao('F.8 Optimization', '450'),
273ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao('F.9 Mathematics <math.h>', '453'),
274ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao('Annex G (informative) IEC 60559-compatible complex arithmetic', '466'),
275ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao('G.1 Introduction', '466'),
276ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao('G.2 Types', '466'),
277ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao('G.3 Conventions', '466'),
278ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao('G.4 Conversions', '467'),
279ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao('G.5 Binary operators', '467'),
280ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao('G.6 Complex arithmetic <complex.h>', '471'),
281ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao('G.7 Type-generic math <tgmath.h>', '479'),
282ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao('Annex H (informative) Language independent arithmetic', '480'),
283ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao('H.1 Introduction', '480'),
284ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao('H.2 Types', '480'),
285ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao('H.3 Notification', '484'),
286ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao('Annex I (informative) Common warnings', '486'),
287ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao('Annex J (informative) Portability issues', '488'),
288ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao('J.1 Unspecified behavior', '488'),
289ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao('J.2 Undefined behavior', '491'),
290ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao('J.3 Implementation-defined behavior', '504'),
291ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao('J.4 Locale-specific behavior', '511'),
292ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao('J.5 Common extensions', '512'),
293ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao('Bibliography', '515'),
294ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao('Index', '517')]
295ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao
296ea285162342df160e7860e26528bc7110bc6c0cdShih-wei LiaocXXURL = 'http://open-std.org/jtc1/sc22/wg21/docs/papers/2008/n2723.pdf'
297ea285162342df160e7860e26528bc7110bc6c0cdShih-wei LiaocXXTOC = [('Contents', 'ii'),
298ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao('List of Tables', 'ix'),
299ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao('1 General', '1'),
300ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao('1.1 Scope', '1'),
301ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao('1.2 Normative references', '1'),
302ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao('1.3 Definitions', '2'),
303ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao('1.4 Implementation compliance', '4'),
304ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao('1.5 Structure of this International Standard', '5'),
305ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao('1.6 Syntax notation', '5'),
306ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao('1.7 The C++ memory model', '6'),
307ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao('1.8 The C++ object model', '6'),
308ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao('1.9 Program execution', '7'),
309ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao('1.10 Multi-threaded executions and data races', '10'),
310ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao('1.11 Acknowledgments', '13'),
311ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao('2 Lexical conventions', '15'),
312ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao('2.1 Phases of translation', '15'),
313ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao('2.2 Character sets', '16'),
314ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao('2.3 Trigraph sequences', '17'),
315ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao('2.4 Preprocessing tokens', '17'),
316ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao('2.5 Alternative tokens', '18'),
317ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao('2.6 Tokens', '19'),
318ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao('2.7 Comments', '19'),
319ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao('2.8 Header names', '19'),
320ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao('2.9 Preprocessing numbers', '20'),
321ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao('2.10 Identifiers', '20'),
322ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao('2.11 Keywords', '20'),
323ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao('2.12 Operators and punctuators', '21'),
324ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao('2.13 Literals', '21'),
325ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao('3 Basic concepts', '29'),
326ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao('3.1 Declarations and definitions', '29'),
327ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao('3.2 One definition rule', '31'),
328ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao('3.3 Declarative regions and scopes', '33'),
329ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao('3.4 Name lookup', '38'),
330ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao('3.5 Program and linkage', '51'),
331ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao('3.6 Start and termination', '54'),
332ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao('3.7 Storage duration', '58'),
333ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao('3.8 Object Lifetime', '62'),
334ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao('3.9 Types', '65'),
335ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao('3.10 Lvalues and rvalues', '70'),
336ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao('3.11 Alignment', '72'),
337ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao('4 Standard conversions', '73'),
338ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao('4.1 Lvalue-to-rvalue conversion', '74'),
339ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao('4.2 Array-to-pointer conversion', '74'),
340ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao('4.3 Function-to-pointer conversion', '74'),
341ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao('4.4 Qualification conversions', '74'),
342ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao('4.5 Integral promotions', '75'),
343ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao('4.6 Floating point promotion', '76'),
344ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao('4.7 Integral conversions', '76'),
345ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao('4.8 Floating point conversions', '76'),
346ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao('4.9 Floating-integral conversions', '77'),
347ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao('4.10 Pointer conversions', '77'),
348ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao('4.11 Pointer to member conversions', '77'),
349ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao('4.12 Boolean conversions', '78'),
350ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao('4.13 Integer conversion rank', '78'),
351ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao('5 Expressions', '79'),
352ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao('5.1 Primary expressions', '80'),
353ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao('5.2 Postfix expressions', '85'),
354ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao('5.3 Unary expressions', '96'),
355ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao('5.4 Explicit type conversion (cast notation)', '104'),
356ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao('5.5 Pointer-to-member operators', '105'),
357ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao('5.6 Multiplicative operators', '106'),
358ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao('5.7 Additive operators', '106'),
359ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao('5.8 Shift operators', '107'),
360ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao('5.9 Relational operators', '108'),
361ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao('5.10 Equality operators', '109'),
362ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao('5.11 Bitwise AND operator', '110'),
363ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao('5.12 Bitwise exclusive OR operator', '110'),
364ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao('5.13 Bitwise inclusive OR operator', '110'),
365ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao('5.14 Logical AND operator', '110'),
366ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao('5.15 Logical OR operator', '110'),
367ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao('5.16 Conditional operator', '111'),
368ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao('5.17 Assignment and compound assignment operators', '112'),
369ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao('5.18 Comma operator', '113'),
370ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao('5.19 Constant expressions', '113'),
371ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao('6 Statements', '116'),
372ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao('6.1 Labeled statement', '116'),
373ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao('6.2 Expression statement', '116'),
374ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao('6.3 Compound statement or block', '116'),
375ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao('6.4 Selection statements', '117'),
376ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao('6.5 Iteration statements', '118'),
377ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao('6.6 Jump statements', '121'),
378ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao('6.7 Declaration statement', '122'),
379ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao('6.8 Ambiguity resolution', '123'),
380ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao('7 Declarations', '125'),
381ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao('7.1 Specifiers', '126'),
382ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao('7.2 Enumeration declarations', '140'),
383ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao('7.3 Namespaces', '143'),
384ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao('7.4 The asm declaration', '156'),
385ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao('7.5 Linkage specifications', '156'),
386ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao('8 Declarators', '160'),
387ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao('8.1 Type names', '161'),
388ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao('8.2 Ambiguity resolution', '161'),
389ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao('8.3 Meaning of declarators', '163'),
390ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao('8.4 Function definitions', '175'),
391ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao('8.5 Initializers', '177'),
392ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao('9 Classes', '191'),
393ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao('9.1 Class names', '193'),
394ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao('9.2 Class members', '194'),
395ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao('9.3 Member functions', '197'),
396ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao('9.4 Static members', '200'),
397ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao('9.5 Unions', '202'),
398ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao('9.6 Bit-fields', '203'),
399ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao('9.7 Nested class declarations', '204'),
400ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao('9.8 Local class declarations', '205'),
401ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao('9.9 Nested type names', '206'),
402ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao('10 Derived classes', '207'),
403ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao('10.1 Multiple base classes', '208'),
404ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao('10.2 Member name lookup', '210'),
405ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao('10.3 Virtual functions', '213'),
406ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao('10.4 Abstract classes', '217'),
407ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao('11 Member access control', '219'),
408ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao('11.1 Access specifiers', '221'),
409ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao('11.2 Accessibility of base classes and base class members', '222'),
410ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao('11.3 Access declarations', '224'),
411ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao('11.4 Friends', '225'),
412ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao('11.5 Protected member access', '228'),
413ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao('11.6 Access to virtual functions', '229'),
414ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao('11.7 Multiple access', '230'),
415ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao('11.8 Nested classes', '230'),
416ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao('12 Special member functions', '231'),
417ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao('12.1 Constructors', '231'),
418ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao('12.2 Temporary objects', '233'),
419ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao('12.3 Conversions', '235'),
420ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao('12.4 Destructors', '238'),
421ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao('12.5 Free store', '240'),
422ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao('12.6 Initialization', '242'),
423ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao('12.7 Construction and destruction', '247'),
424ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao('12.8 Copying class objects', '250'),
425ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao('12.9 Inheriting Constructors', '255'),
426ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao('13 Overloading', '259'),
427ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao('13.1 Overloadable declarations', '259'),
428ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao('13.2 Declaration matching', '261'),
429ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao('13.3 Overload resolution', '262'),
430ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao('13.4 Address of overloaded function', '281'),
431ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao('13.5 Overloaded operators', '282'),
432ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao('13.6 Built-in operators', '286'),
433ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao('14 Templates', '290'),
434ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao('14.1 Template parameters', '291'),
435ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao('14.2 Names of template specializations', '294'),
436ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao('14.3 Template arguments', '296'),
437ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao('14.4 Type equivalence', '302'),
438ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao('14.5 Template declarations', '303'),
439ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao('14.6 Name resolution', '318'),
440ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao('14.7 Template instantiation and specialization', '331'),
441ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao('14.8 Function template specializations', '343'),
442ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao('15 Exception handling', '363'),
443ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao('15.1 Throwing an exception', '364'),
444ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao('15.2 Constructors and destructors', '366'),
445ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao('15.3 Handling an exception', '366'),
446ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao('15.4 Exception specifications', '368'),
447ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao('15.5 Special functions', '371'),
448ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao('15.6 Exceptions and access', '372'),
449ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao('16 Preprocessing directives', '373'),
450ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao('16.1 Conditional inclusion', '375'),
451ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao('16.2 Source file inclusion', '376'),
452ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao('16.3 Macro replacement', '377'),
453ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao('16.4 Line control', '382'),
454ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao('16.5 Error directive', '383'),
455ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao('16.6 Pragma directive', '383'),
456ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao('16.7 Null directive', '383'),
457ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao('16.8 Predefined macro names', '383'),
458ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao('16.9 Pragma operator', '384'),
459ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao('17 Library introduction', '386'),
460ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao('17.1 General', '386'),
461ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao('17.2 Overview', '386'),
462ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao('17.3 Definitions', '386'),
463ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao('17.4 Additional definitions', '390'),
464ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao('17.5 Method of description (Informative)', '390'),
465ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao('17.6 Library-wide requirements', '396'),
466ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao('18 Language support library', '407'),
467ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao('18.1 Types', '407'),
468ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao('18.2 Implementation properties', '408'),
469ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao('18.3 Integer types', '417'),
470ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao('18.4 Start and termination', '418'),
471ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao('18.5 Dynamic memory management', '420'),
472ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao('18.6 Type identification', '424'),
473ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao('18.7 Exception handling', '427'),
474ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao('18.8 Initializer lists', '432'),
475ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao('18.9 Other runtime support', '434'),
476ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao('19 Diagnostics library', '435'),
477ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao('19.1 Exception classes', '435'),
478ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao('19.2 Assertions', '439'),
479ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao('19.3 Error numbers', '440'),
480ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao('19.4 System error support', '440'),
481ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao('20 General utilities library', '452'),
482ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao('20.1 Requirements', '452'),
483ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao('20.2 Utility components', '457'),
484ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao('20.3 Compile-time rational arithmetic', '463'),
485ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao('20.4 Tuples', '465'),
486ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao('20.5 Metaprogramming and type traits', '473'),
487ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao('20.6 Function objects', '486'),
488ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao('20.7 Memory', '509'),
489ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao('20.8 Time utilities', '548'),
490ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao('20.9 Date and time functions', '562'),
491ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao('21 Strings library', '563'),
492ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao('21.1 Character traits', '563'),
493ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao('21.2 String classes', '569'),
494ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao('21.3 Class template basic_string', '572'),
495ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao('21.4 Numeric Conversions', '599'),
496ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao('21.5 Null-terminated sequence utilities', '600'),
497ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao('22 Localization library', '604'),
498ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao('22.1 Locales', '604'),
499ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao('22.2 Standard locale categories', '617'),
500ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao('22.3 Standard code conversion facets', '657'),
501ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao('22.4 C Library Locales', '659'),
502ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao('23 Containers library', '660'),
503ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao('23.1 Container requirements', '660'),
504ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao('23.2 Sequence containers', '681'),
505ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao('23.3 Associative containers', '719'),
506ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao('23.4 Unordered associative containers', '744'),
507ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao('24 Iterators library', '759'),
508ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao('24.1 Iterator requirements', '759'),
509ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao('24.2 Header <iterator> synopsis', '764'),
510ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao('24.3 Iterator primitives', '767'),
511ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao('24.4 Predefined iterators', '770'),
512ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao('24.5 Stream iterators', '784'),
513ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao('25 Algorithms library', '792'),
514ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao('25.1 Non-modifying sequence operations', '802'),
515ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao('25.2 Mutating sequence operations', '806'),
516ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao('25.3 Sorting and related operations', '815'),
517ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao('25.4 C library algorithms', '829'),
518ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao('26 Numerics library', '831'),
519ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao('26.1 Numeric type requirements', '831'),
520ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao('26.2 The floating-point environment', '832'),
521ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao('26.3 Complex numbers', '833'),
522ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao('26.4 Random number generation', '842'),
523ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao('26.5 Numeric arrays', '884'),
524ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao('26.6 Generalized numeric operations', '904'),
525ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao('26.7 C Library', '907'),
526ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao('27 Input/output library', '912'),
527ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao('27.1 Iostreams requirements', '912'),
528ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao('27.2 Forward declarations', '912'),
529ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao('27.3 Standard iostream objects', '915'),
530ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao('27.4 Iostreams base classes', '916'),
531ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao('27.5 Stream buffers', '934'),
532ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao('27.6 Formatting and manipulators', '944'),
533ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao('27.7 String-based streams', '972'),
534ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao('27.8 File-based streams', '984'),
535ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao('28 Regular expressions library', '1000'),
536ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao('28.1 Definitions', '1000'),
537ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao('28.2 Requirements', '1000'),
538ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao('28.3 Regular expressions summary', '1002'),
539ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao('28.4 Header <regex> synopsis', '1003'),
540ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao('28.5 Namespace std::regex_constants', '1009'),
541ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao('28.6 Class regex_error', '1012'),
542ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao('28.7 Class template regex_traits', '1012'),
543ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao('28.8 Class template basic_regex', '1015'),
544ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao('28.9 Class template sub_match', '1020'),
545ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao('28.10Class template match_results', '1025'),
546ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao('28.11Regular expression algorithms', '1029'),
547ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao('28.12Regular expression Iterators', '1033'),
548ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao('28.13Modified ECMAScript regular expression grammar', '1039'),
549ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao('29 Atomic operations library', '1042'),
550ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao('29.1 Order and Consistency', '1044'),
551ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao('29.2 Lock-free Property', '1046'),
552ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao('29.3 Atomic Types', '1046'),
553ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao('29.4 Operations on Atomic Types', '1051'),
554ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao('29.5 Flag Type and Operations', '1054'),
555ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao('30 Thread support library', '1057'),
556ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao('30.1 Requirements', '1057'),
557ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao('30.2 Threads', '1058'),
558ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao('30.3 Mutual exclusion', '1063'),
559ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao('30.4 Condition variables', '1077'),
560ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao('A Grammar summary', '1085'),
561ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao('A.1 Keywords', '1085'),
562ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao('A.2 Lexical conventions', '1085'),
563ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao('A.3 Basic concepts', '1089'),
564ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao('A.4 Expressions', '1090'),
565ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao('A.5 Statements', '1093'),
566ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao('A.6 Declarations', '1094'),
567ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao('A.7 Declarators', '1097'),
568ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao('A.8 Classes', '1098'),
569ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao('A.9 Derived classes', '1099'),
570ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao('A.10 Special member functions', '1099'),
571ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao('A.11 Overloading', '1100'),
572ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao('A.12 Templates', '1100'),
573ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao('A.13 Exception handling', '1101'),
574ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao('A.14 Preprocessing directives', '1101'),
575ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao('B Implementation quantities', '1103'),
576ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao('C Compatibility', '1105'),
577ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao('C.1 C++ and ISO C', '1105'),
578ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao('C.2 Standard C library', '1114'),
579ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao('D Compatibility features', '1119'),
580ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao('D.1 Increment operator with bool operand', '1119'),
581ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao('D.2 static keyword', '1119'),
582ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao('D.3 Access declarations', '1119'),
583ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao('D.4 Implicit conversion from const strings', '1119'),
584ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao('D.5 C standard library headers', '1119'),
585ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao('D.6 Old iostreams members', '1120'),
586ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao('D.7 char* streams', '1121'),
587ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao('D.8 Binders', '1130'),
588ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao('D.9 auto_ptr', '1132'),
589ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao('E Universal-character-names', '1135'),
590ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao('F Cross references', '1137'),
591ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao('Index', '1153')]
592ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao
593ea285162342df160e7860e26528bc7110bc6c0cdShih-wei LiaokDocuments = {
594ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao    'C99' : (c99URL, c99TOC, 12),
595ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao    'C++' : (cXXURL, cXXTOC, 12),
596ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao}
597ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao
598ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liaodef findClosestTOCEntry(data, target):
599ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao    # FIXME: Fix for named spec references
600ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao    if isinstance(target[0],str):
601ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao        return ('.'.join(target),'<named>',1)
602ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao
603ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao    offset = data[2]
604ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao    best = None
605ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao    for (name,page) in data[1]:
606ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao        if ' ' in name:
607ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao            section,name = name.split(' ',1)
608ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao            if section == 'Annex':
609ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao                section,name = name.split(' ',1)
610ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao                section = 'Annex '+section
611ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao        else:
612ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao            section = None
613ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao        try:
614ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao            page = int(page) + offset
615ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao        except:
616ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao            page = 1
617ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao        try:
618ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao            spec = SpecIndex.fromstring(section)
619ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao        except:
620ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao            spec = None
621ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao
622ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao        # Meh, could be better...
623ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao        if spec is not None:
624ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao            dist = spec - target
625ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao            if best is None or dist < best[0]:
626ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao                best = (dist, (section, name, page))
627ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao    return best[1]
628ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao
629ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao# What a hack. Slow to boot.
630ea285162342df160e7860e26528bc7110bc6c0cdShih-wei LiaodoxyLineRefRE = re.compile(r"<a name=\"l([0-9]+)\"></a>")
631ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liaodef findClosestLineReference(clangRoot, doxyName, target):
632ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao    try:
633ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao        f = open(os.path.join(clangRoot, 'docs', 'doxygen', 'html', doxyName))
634ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao    except:
635ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao        return None
636ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao    
637ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao    best = None
638ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao    for m in doxyLineRefRE.finditer(f.read()):
639ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao        line = int(m.group(1), 10)
640ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao        dist = abs(line - target)
641ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao        if best is None or dist < best[0]:
642ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao            best = (dist,'l'+m.group(1))
643ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao    f.close()
644ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao    if best is not None:
645ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao        return best[1]
646ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao    return None
647ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao
648ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao###
649ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao
650ea285162342df160e7860e26528bc7110bc6c0cdShih-wei LiaonameAndSpecRefRE = re.compile(r"(C99|C90|C\+\+|H\&S) ((([0-9]+)(\.[0-9]+)*|\[[^]]+\])(p[0-9]+)?)")
651ea285162342df160e7860e26528bc7110bc6c0cdShih-wei LiaoloneSpecRefRE = re.compile(r" (([0-9]+)(\.[0-9]+){2,100}(p[0-9]+)?)")
652ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liaodef scanFile(path, filename):
653ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao    try:
654ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao        f = open(path)
655ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao    except IOError:
656ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao        print >>sys.stderr,'WARNING: Unable to open:',path
657ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao        return
658ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao
659ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao    for i,ln in enumerate(f):
660ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao        ignore = set()
661ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao        for m in nameAndSpecRefRE.finditer(ln):
662ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao            section = m.group(2)
663ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao            name = m.group(1)
664ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao            if section.endswith('.'):
665ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao                section = section[:-1]
666ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao            yield RefItem(name, section, filename, path, i+1)
667ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao            ignore.add(section)
668ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao        for m in loneSpecRefRE.finditer(ln):
669ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao            section = m.group(1)
670ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao            if section.endswith('.'):
671ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao                section = section[:-1]
672ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao            if section not in ignore:
673ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao                yield RefItem(None, section, filename, path, i+1)
674ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao
675ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao###
676ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao
677ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liaoclass SpecIndex:
678ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao    @staticmethod
679ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao    def fromstring(str):
680ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao        # Check for named sections
681ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao        if str[0] == '[':
682ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao            assert ']' in str
683ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao            secs = str[1:str.index(']')].split('.')
684ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao            tail = str[str.index(']')+1:]
685ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao            if tail:
686ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao                assert tail[0] == 'p'
687ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao                paragraph = int(tail[1:])
688ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao            else:
689ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao                paragraph = None
690ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao            indices = secs
691ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao        else:
692ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao            secs = str.split('.')
693ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao            paragraph = None
694ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao            if 'p' in secs[-1]:
695ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao                secs[-1],p = secs[-1].split('p',1)
696ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao                paragraph = int(p)
697ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao            indices = map(int, secs)
698ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao        return SpecIndex(indices, paragraph)
699ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao
700ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao    def __init__(self, indices, paragraph=None):
701ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao        assert len(indices)>0
702ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao        self.indices = tuple(indices)
703ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao        self.paragraph = paragraph
704ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao
705ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao    def __str__(self):
706ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao        s =  '.'.join(map(str,self.indices))
707ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao        if self.paragraph is not None:
708ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao            s += '.p%d'%(self.paragraph,)
709ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao        return s                            
710ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao
711ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao    def __repr__(self):
712ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao        return 'SpecIndex(%s, %s)'%(self.indices, self.paragraph)
713ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao
714ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao    def __cmp__(self, b):
715ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao        return cmp((self.indices,self.paragraph),
716ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao                   (b.indices,b.paragraph))
717ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao
718ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao    def __hash__(self):
719ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao        return hash((self.indices,self.paragraph))
720ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao
721ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao    def __sub__(self, indices):
722ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao        def sub(a,b):
723ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao            a = a or 0
724ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao            b = b or 0
725ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao            return abs(a-b)
726ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao        return map(sub,self.indices,indices)
727ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao
728ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liaoclass RefItem:
729ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao    def __init__(self, name, section, filename, path, line):
730ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao        self.name = name
731ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao        self.section = SpecIndex.fromstring(section)
732ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao        self.filename = filename
733ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao        self.path = path
734ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao        self.line = line
735ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao    
736ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao    def __str__(self):
737ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao        if self.name is not None:
738ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao            return '%s %s'%(self.name, self.section)
739ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao        else:
740ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao            return '--- %s'%(self.section,)
741ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao
742ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao    def __repr__(self):
743ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao        return 'RefItem(%s, %r, "%s", "%s", %d)'%(self.name, 
744ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao                                              self.section,
745ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao                                              self.filename,
746ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao                                              self.path,
747ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao                                              self.line)
748ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao
749ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao    def __cmp__(self, b):
750ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao        return cmp((self.name,self.section,self.filename,self.path,self.line),
751ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao                   (b.name,b.section,self.filename,self.path,self.line))
752ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao
753ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao    def __hash__(self):
754ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao        return hash((self.name,self.section,self.filename,self.path,self.line))
755ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao
756ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao###
757ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao
758ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liaodef sorted(l):
759ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao    l = list(l)
760ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao    l.sort()
761ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao    return l
762ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao
763ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liaodef getRevision(path):
764ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao    import subprocess
765ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao    p = subprocess.Popen(['svn', 'info', path],
766ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao                         stdin=open('/dev/null','r'), 
767ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao                         stdout=subprocess.PIPE)
768ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao    for ln in p.stdout.read(1024).split('\n'):
769ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao        if ln.startswith('Revision:'):
770ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao            return ln.split(':',1)[1].strip()
771ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao    return None
772ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao
773ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liaodef buildRefTree(references):
774ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao    root = (None, {}, [])
775ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao
776ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao    def getNode(keys):
777ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao        if not keys:
778ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao            return root
779ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao        key,parent = keys[-1],getNode(keys[:-1])
780ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao        node = parent[1].get(key)
781ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao        if node is None:
782ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao            parent[1][key] = node = (key, {}, [])
783ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao        return node
784ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao            
785ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao    for ref in references:
786ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao        n = getNode((ref.name,) + ref.section.indices)
787ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao        n[2].append(ref)
788ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao
789ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao    def flatten((key, children, data)):
790ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao        children = sorted(map(flatten,children.values()))
791ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao        return (key, children, sorted(data))
792ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao
793ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao    return flatten(root)
794ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao
795ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liaodef preorder(node,parents=(),first=True):
796ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao    (key,children,data) = node
797ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao    if first:
798ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao        yield parents+(node,)
799ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao    for c in children:
800ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao        for item in preorder(c, parents+(node,)):
801ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao            yield item
802ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao
803ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liaodef main():
804ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao    global options
805ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao    from optparse import OptionParser
806ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao    parser = OptionParser("usage: %prog [options] CLANG_ROOT <output-dir>")
807ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao    parser.add_option("", "--debug", dest="debug",
808ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao                      help="Print extra debugging output",
809ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao                      action="store_true",
810ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao                      default=False)    
811ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao    (opts, args) = parser.parse_args()
812ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao
813ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao    if len(args) != 2:
814ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao        parser.error("incorrect number of arguments")
815ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao
816ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao    references = []
817ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao    root,outputDir = args
818ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao    if os.path.isdir(root):
819ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao        for (dirpath, dirnames, filenames) in os.walk(root):
820ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao            for filename in filenames:
821ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao                name,ext = os.path.splitext(filename)
822ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao                if ext in ('.c', '.cpp', '.h', '.def'):
823ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao                    fullpath = os.path.join(dirpath, filename)                
824ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao                    references.extend(list(scanFile(fullpath, filename)))
825ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao    else:
826ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao        references.extend(list(scanFile(root, root)))
827ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao
828ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao    refTree = buildRefTree(references)
829ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao
830ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao    specs = {}
831ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao    for ref in references:
832ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao        spec = specs[ref.name] = specs.get(ref.name,{})
833ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao        items = spec[ref.section] = spec.get(ref.section,[])
834ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao        items.append(ref)
835ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao
836ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao    print 'Found %d references.'%(len(references),)
837ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao
838ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao    if opts.debug:
839ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao        pprint(refTree)
840ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao
841ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao    referencesPath = os.path.join(outputDir,'references.html')
842ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao    print 'Writing: %s'%(referencesPath,)
843ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao    f = open(referencesPath,'w')   
844ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao    print >>f, '<html><head><title>clang: Specification References</title></head>'
845ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao    print >>f, '<body>'
846ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao    print >>f, '\t<h2>Specification References</h2>'
847ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao    for i,node in enumerate(refTree[1]):
848ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao        specName = node[0] or 'Unknown'
849ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao        print >>f, '<a href="#spec%d">%s</a><br>'%(i,specName)
850ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao    for i,node in enumerate(refTree[1]):
851ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao        specName = node[0] or 'Unknown'
852ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao        print >>f, '<hr>'
853ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao        print >>f, '<a name="spec%d">'%(i,)
854ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao        print >>f, '<h3>Document: %s</h3>'%(specName or 'Unknown',)
855ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao        print >>f, '<table border="1" cellspacing="2" width="80%">'
856ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao        print >>f, '<tr><th width="20%">Name</th><th>References</th></tr>'
857ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao        docData = kDocuments.get(specName)
858ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao        for path in preorder(node,first=False):
859ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao            if not path[-1][2]:
860ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao                continue
861ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao            components = '.'.join([str(p[0]) for p in path[1:]])
862ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao            print >>f, '\t<tr>'
863ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao            tocEntry = None            
864ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao            if docData is not None:
865ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao                tocEntry = findClosestTOCEntry(docData, [p[0] for p in path[1:]])
866ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao            if tocEntry is not None:
867ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao                section,name,page = tocEntry
868ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao                # If section is exact print the TOC name
869ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao                if page is not None:
870ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao                    linkStr = '<a href="%s#page=%d">%s</a> (pg.%d)'%(docData[0],page,components,page)
871ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao                else:
872ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao                    linkStr = components
873ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao                if section == components:
874ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao                    print >>f, '\t\t<td valign=top>%s<br>%s</td>'%(linkStr,name)
875ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao                else:
876ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao                    print >>f, '\t\t<td valign=top>%s</td>'%(linkStr,)
877ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao            else:
878ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao                print >>f, '\t\t<td valign=top>%s</td>'%(components,)
879ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao            print >>f, '\t\t<td valign=top>'
880ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao            for item in path[-1][2]:
881ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao                # XXX total hack
882ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao                relativePath = item.path[len(root):]
883ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao                if relativePath.startswith('/'):
884ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao                    relativePath = relativePath[1:]
885ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao                # XXX this is broken, how does doxygen mangle w/ multiple
886ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao                # refs? Can we just read its map?
887ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao                filename = os.path.basename(relativePath)
888ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao                doxyName = '%s-source.html'%(filename.replace('.','_8'),)
889ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao                # Grrr, why can't doxygen write line number references.
890ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao                lineReference = findClosestLineReference(root,doxyName,item.line)
891ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao                if lineReference is not None:
892ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao                    linkStr = 'http://clang.llvm.org/doxygen/%s#%s'%(doxyName,lineReference)
893ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao                else:
894ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao                    linkStr = 'http://clang.llvm.org/doxygen/%s'%(doxyName,)
895ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao                if item.section.paragraph is not None:
896ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao                    paraText = '&nbsp;(p%d)'%(item.section.paragraph,)
897ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao                else:
898ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao                    paraText = ''
899ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao                print >>f,'<a href="%s">%s:%d</a>%s<br>'%(linkStr,relativePath,item.line,paraText)
900ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao            print >>f, '\t\t</td>'
901ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao            print >>f, '\t</tr>'
902ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao        print >>f, '</table>'
903ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao    print >>f, '<hr>'
904ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao    print >>f, 'Generated: %s<br>'%(time.strftime('%Y-%m-%d %H:%M'),)
905ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao    print >>f, 'SVN Revision: %s'%(getRevision(root),)
906ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao    print >>f, '</body>'
907ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao    f.close()
908ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao    
909ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liaoif __name__=='__main__':
910ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao   main()
911