#!/bin/sh export LC_ALL=C awk ' BEGIN { noteid = 1 sid = 1 ss[sid] = "
" } function esc() { gsub(/\&/, "\\&") gsub(/, "\\<") gsub(/>/, "\\>") } { esc() } !title && /^[^@]/ { title = $0 gsub(/ +/, " ", title) gsub(/Committee Draft --/, "", title) } /^@sect Contents/ { ss[sid] = ss[sid] "\n" seencontents = 1 level = 0 } seencontents && !seenfore && /^[^@]/ { id = $1 if (id ~ /Annex/) id = $2 sub(/\.$/, "", id) s = $0 if (!sub(/ +\. .*/, "", s)) { getline esc() sub(/^ */, " ") s = s $0 sub(/ +\. .*/, "", s) } if (match(s, /<[a-zA-Z0-9_]*\.h>/)) { h = substr($0,RSTART,RLENGTH) if (!(h in header)) header[h] = id } s = "" s "\n" s = "
\n" } next } /^@sect 3\./ { markdef = 1 } /^@sect/ { sid++ slevel = split($2,a,/\./)+1 if (slevel > 5) slevel = 5 sect = $2 getline esc() # todo hX, back to top ss[sid] = sprintf("%s \n", slevel, sect, sect, $0, slevel) if ($0 == "Index") ss[sid] = ss[sid] "\n" next } /^@ul/ { ss[sid] = ss[sid] "
" next } /^@end pre/ { if (!pre) next pre = pre "\n\n" if (nn) note[nn] = note[nn] "\n" pre else ss[sid] = ss[sid] pre pre = "" next } /^@note/ { nn = $2+0 note[nn] = "" next } /^@page/ { nn = 0 p = $2 getline ss[sid] = ss[sid] "\n" next } /^@para/ { ss[sid] = ss[sid] "
\n" next } /^ ?(Syntax|Semantics|Description|Constraints|Synopsis|Returns|Recommended practice|Implementation limits|Environmental limits)$/ { ss[sid] = ss[sid] "
" $0 "\n" next } !seenfore { ss[sid] = ss[sid] $0 "\n" next } { s = $0 p = "" if (seenindex) r = " [A-Z1-9][0-9.]*" else r = "[ ([][A-Z1-9]\\.[0-9.]*[0-9]" # hack s = " " s while (match(s, r)) { p = p substr(s,1,RSTART) m = substr(s,RSTART+1,RLENGTH-1) if (m ~ /\.0$/ || m ~ /[4-9][0-9]/ || m ~ /[0-3][0-9][0-9]/ || substr(s,RSTART+RLENGTH,1) ~ /[a-zA-Z_\-]/) p = p m else p = p "" m "" s = substr(s,RSTART+RLENGTH) } s = p s p = "" while (match(s, /[Aa]nnex [A-Z]/)) { p = p substr(s,1,RSTART-1) m = substr(s,RSTART,RLENGTH) p = p "" m "" s = substr(s,RSTART+RLENGTH) } s = p s p = "" while (match(s, /<[a-zA-Z0-9_]*\.h>/)) { p = p substr(s,1,RSTART-1) m = substr(s,RSTART,RLENGTH) if (m in header) p = p "" m "" else p = p m s = substr(s,RSTART+RLENGTH) } s = p s p = "" # TODO: false positives.. while (match(s, /[a-z]opt[ )"]/)) s = substr(s,1,RSTART) "opt" substr(s,RSTART+RLENGTH-1) if (match(s, /[a-z]opt$/)) s = substr(s,1,RSTART) "opt" for (;;) { while (match(s, noteid-1 "\\)")) { p = p substr(s,1,RSTART-1) p = p "" noteid-1 ")" s = substr(s,RSTART+RLENGTH) } if (!match(s, noteid "\\)")) break if (noteid==1 && s !~ /\.1\)/) break p = p substr(s,1,RSTART-1) p = p "" noteid ")" snote[sid] = snote[sid] " " noteid noteid++ s = substr(s,RSTART+RLENGTH) } s = p s sub(/^ *Forward references/, "
&", s)
if (markdef) {
s = "" s "
"
markdef = 0
}
if (pre)
pre = pre "\n" s
else if (nn)
note[nn] = note[nn] s "\n"
else
ss[sid] = ss[sid] s "\n"
}
END {
ss[sid] = ss[sid] ""
print "
Footnotes\n" for (j = 1; j <= n; j++) { s = s "
" a[j] ")" note[a[j]+0] "\n" } print s } print "
Contents" } print "" }'