+contents, +header links, bold forward ref
[c-standard.git] / ann2html.sh
blob18e441475eef472cebfcf05afb66c68515689f4b
1 #!/bin/sh
3 export LC_ALL=C
4 awk '
5 BEGIN {
6 noteid = 1
7 sid = 1
8 ss[sid] = "<pre>"
12 gsub(/\&/, "\\&amp;")
13 gsub(/</, "\\&lt;")
14 gsub(/>/, "\\&gt;")
17 /^@sect Contents/ {
18 ss[sid] = ss[sid] "</pre>\n"
19 seencontents = 1
20 level = 0
23 seencontents && !seenfore && /^[^@]/ {
24 id = $1
25 if (id ~ /Annex/)
26 id = $2
27 sub(/\.$/, "", id)
29 s = $0
30 if (!sub(/ +\. .*/, "", s)) {
31 getline
32 sub(/^ */, " ")
33 s = s $0
34 sub(/ +\. .*/, "", s)
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
43 s = "<a href=\"#" id "\">" s "</a>\n"
45 s = "<li>" s
46 n = split(id, a, /\./)
47 while (n > level) {
48 s = "<ul>\n" s
49 level++
51 while (n < level) {
52 s = "</ul>\n" s
53 level--
55 ss[sid] = ss[sid] s
56 next
59 /^@sect Foreword/ {
60 while (level--)
61 ss[sid] = ss[sid] "</ul>\n"
62 seenfore = 1
65 /^@sect Index/ {
66 seenindex = 1
69 /^@title/ {
70 if (!seencontents) {
71 ss[sid] = ss[sid] "</pre>\n"
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"
80 next
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
97 /^@ul/ {
98 ss[sid] = ss[sid] "<ul>\n"
99 next
101 /^@end ul/ {
102 ss[sid] = ss[sid] "</ul>\n"
103 next
105 /^@ol/ {
106 ss[sid] = ss[sid] "<ol>\n"
107 next
109 /^@end ol/ {
110 ss[sid] = ss[sid] "</ol>\n"
111 next
114 /^@li/ {
115 ss[sid] = ss[sid] "<li>"
116 next
119 /^@pre/ {
120 pre = "<pre>"
121 next
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
136 /^@note/ {
137 nn = $2+0
138 note[nn] = ""
139 next
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
151 /^@para/ {
152 ss[sid] = ss[sid] "<p><!--para " $2 "-->\n"
153 next
156 /^ *(Syntax|Semantics|Description|Constraints|Synopsis|Returns)$/ {
157 ss[sid] = ss[sid] "<h6>" $0 "</h6>\n"
158 next
161 !seenfore {
162 ss[sid] = ss[sid] $0 "\n"
163 next
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)
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)
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)
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)
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"
225 END {
226 ss[sid] = ss[sid] "</pre>"
228 print "<html><head><title>C</title></head><body>"
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"
239 print s
243 print "</body></html>"