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