#!/bin/sh
export LC_ALL=C
awk '
BEGIN {
noteid = 1
sid = 1
ss[sid] = "
"
}
{
gsub(/\&/, "\\&")
gsub(/, "\\<")
gsub(/>/, "\\>")
}
!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
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 = "" s
n = split(id, a, /\./)
while (n > level) {
s = "\n" s
level++
}
while (n < level) {
s = "
\n" s
level--
}
ss[sid] = ss[sid] s
next
}
/^@sect Foreword/ {
while (level--)
ss[sid] = ss[sid] "\n"
seenfore = 1
}
/^@sect Index/ {
seenindex = 1
}
/^@title/ {
if (!seencontents) {
ss[sid] = ss[sid] "\n"
}
sid++
getline
ss[sid] = ss[sid] "" $0 "
\n"
if (!seencontents) {
ss[sid] = ss[sid] "\n"
}
next
}
/^@sect 3\./ {
markdef = 1
}
/^@sect/ {
sid++
slevel = split($2,a,/\./)+1
if (slevel > 5)
slevel = 5
sect = $2
getline
# 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] "
\n"
next
}
/^@end ul/ {
ss[sid] = ss[sid] "
\n"
next
}
/^@ol/ {
ss[sid] = ss[sid] "\n"
next
}
/^@end ol/ {
ss[sid] = ss[sid] "
\n"
next
}
/^@li/ {
ss[sid] = ss[sid] ""
next
}
/^@pre/ {
pre = ""
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 "
" title ""
for (i = 1; i <= sid; i++) {
print ss[i]
n = split(snote[i],a)
if (n > 0) {
s = "footnotes
\n"
for (j = 1; j <= n; j++) {
s = s "" a[j] ")" note[a[j]+0] "\n"
}
print s
}
}
print ""
}'