+contents, +header links, bold forward ref
[c-standard] / ann2html.sh
1 #!/bin/sh
2
3 export LC_ALL=C
4 awk '
5 BEGIN {
6         noteid = 1
7         sid = 1
8         ss[sid] = "<pre>"
9 }
10
11 {
12         gsub(/\&/, "\\&amp;")
13         gsub(/</, "\\&lt;")
14         gsub(/>/, "\\&gt;")
15 }
16
17 /^@sect Contents/ {
18         ss[sid] = ss[sid] "</pre>\n"
19         seencontents = 1
20         level = 0
21 }
22
23 seencontents && !seenfore && /^[^@]/ {
24         id = $1
25         if (id ~ /Annex/)
26                 id = $2
27         sub(/\.$/, "", id)
28
29         s = $0
30         if (!sub(/ +\. .*/, "", s)) {
31                 getline
32                 sub(/^ */, " ")
33                 s = s $0
34                 sub(/ +\. .*/, "", s)
35         }
36
37         if (match(s, /&lt;[a-zA-Z0-9_]*\.h&gt;/)) {
38                 h = substr($0,RSTART,RLENGTH)
39                 if (!(h in header))
40                         header[h] = id
41         }
42
43         s = "<a href=\"#" id "\">" s "</a>\n"
44
45         s = "<li>" s
46         n = split(id, a, /\./)
47         while (n > level) {
48                 s = "<ul>\n" s
49                 level++
50         }
51         while (n < level) {
52                 s = "</ul>\n" s
53                 level--
54         }
55         ss[sid] = ss[sid] s
56         next
57 }
58
59 /^@sect Foreword/ {
60         while (level--)
61                 ss[sid] = ss[sid] "</ul>\n"
62         seenfore = 1
63 }
64
65 /^@sect Index/ {
66         seenindex = 1
67 }
68
69 /^@title/ {
70         if (!seencontents) {
71                 ss[sid] = ss[sid] "</pre>\n"
72         }
73         sid++
74         getline
75         ss[sid] = ss[sid] "<h1>" $0 "</h1>\n"
76         title = $0
77         if (!seencontents) {
78                 ss[sid] = ss[sid] "<pre>\n"
79         }
80         next
81 }
82
83 /^@sect/ {
84         sid++
85         slevel = split($2,a,/\./)+1
86         if (slevel > 5)
87                 slevel = 5
88         sect = $2
89         getline
90         # todo hX, back to top
91         ss[sid] = sprintf("<a name=\"%s\" href=\"#%s\"><h%s>%s</h%s></a>\n", sect, sect, slevel, $0, slevel)
92         if ($0 == "Index")
93                 ss[sid] = ss[sid] "<pre>\n"
94         next
95 }
96
97 /^@ul/ {
98         ss[sid] = ss[sid] "<ul>\n"
99         next
100 }
101 /^@end ul/ {
102         ss[sid] = ss[sid] "</ul>\n"
103         next
104 }
105 /^@ol/ {
106         ss[sid] = ss[sid] "<ol>\n"
107         next
108 }
109 /^@end ol/ {
110         ss[sid] = ss[sid] "</ol>\n"
111         next
112 }
113
114 /^@li/ {
115         ss[sid] = ss[sid] "<li>"
116         next
117 }
118
119 /^@pre/ {
120         pre = "<pre>"
121         next
122 }
123
124 /^@end pre/ {
125         if (!pre)
126                 next
127         pre = pre "</pre>\n"
128         if (nn)
129                 note[nn] = note[nn] "\n" pre
130         else
131                 ss[sid] = ss[sid] pre
132         pre = ""
133         next
134 }
135
136 /^@note/ {
137         nn = $2+0
138         note[nn] = ""
139         next
140 }
141
142 /^@page/ {
143         nn = 0
144         p = $2
145         getline
146         i = $2
147         ss[sid] = ss[sid] "<!--page " p " indent " i "-->\n"
148         next
149 }
150
151 /^@para/ {
152         ss[sid] = ss[sid] "<p><!--para " $2 "-->\n"
153         next
154 }
155
156 /^ *(Syntax|Semantics|Description|Constraints|Synopsis|Returns)$/ {
157         ss[sid] = ss[sid] "<h6>" $0 "</h6>\n"
158         next
159 }
160
161 !seenfore {
162         ss[sid] = ss[sid] $0 "\n"
163         next
164 }
165
166 {
167         s = $0
168         p = ""
169         if (seenindex)
170                 r = " [A-Z1-9][0-9.]*"
171         else
172                 r = "[ ([][A-Z1-9]\\.[0-9.]*[0-9]"
173         # hack
174         s = " " s
175         while (match(s, r)) {
176                 p = p substr(s,1,RSTART)
177                 m = substr(s,RSTART+1,RLENGTH-1)
178                 if (m ~ /\.0$/ || m ~ /[4-9][0-9]/ || m ~ /[0-3][0-9][0-9]/ ||
179                     substr(s,RSTART+RLENGTH,1) ~ /[a-zA-Z_\-]/)
180                         p = p m
181                 else
182                         p = p "<a href=\"#" m "\">" m "</a>"
183                 s = substr(s,RSTART+RLENGTH)
184         }
185         s = p s
186         p = ""
187         while (match(s, /[Aa]nnex [A-Z]/)) {
188                 p = p substr(s,1,RSTART-1)
189                 m = substr(s,RSTART,RLENGTH)
190                 p = p "<a href=\"#" substr(m,RLENGTH,1) "\">" m "</a>"
191                 s = substr(s,RSTART+RLENGTH)
192         }
193         s = p s
194         p = ""
195         while (match(s, /&lt;[a-zA-Z0-9_]*\.h&gt;/)) {
196                 p = p substr(s,1,RSTART-1)
197                 m = substr(s,RSTART,RLENGTH)
198                 if (m in header)
199                         p = p "<a href=\"#" header[m] "\">" m "</a>"
200                 else
201                         p = p m
202                 s = substr(s,RSTART+RLENGTH)
203         }
204         s = p s
205         p = ""
206         while (match(s, noteid "\\)")) {
207                 if (noteid==1 && s !~ /\.1\)/)
208                         break
209                 p = p substr(s,1,RSTART-1)
210                 p = p "<sup><a href=\"#note" noteid "\"><b>" noteid ")</b></a></sup>"
211                 snote[sid] = snote[sid] " " noteid
212                 noteid++
213                 s = substr(s,RSTART+RLENGTH)
214         }
215         s = p s
216         sub(/^ *Forward references/, "<p><b>&</b>", s)
217         if (pre)
218                 pre = pre "\n" s
219         else if (nn)
220                 note[nn] = note[nn] s "\n"
221         else
222                 ss[sid] = ss[sid] s "\n"
223 }
224
225 END {
226         ss[sid] = ss[sid] "</pre>"
227
228         print "<html><head><title>C</title></head><body>"
229
230         for (i = 1; i <= sid; i++) {
231                 print ss[i]
232 #               if (slev[i] < 4)
233                 n = split(snote[i],a)
234                 if (n > 0) {
235                         s = "<h6>footnotes</h6>\n"
236                         for (j = 1; j <= n; j++) {
237                                 s = s "<p><a name=\"note" a[j] "\">" a[j] ")</a>" note[a[j]+0] "\n"
238                         }
239                         print s
240                 }
241         }
242
243         print "</body></html>"
244 }'