#!/bin/sh delay=0 noindex=0 for i do case $i in -delay) delay=1 ;; -noindex) noindex=1 ;; *) echo "This can't happen -- $i passed to toascii" 1>&2 ; exit 1 ;; esac done awkfile=$(mktemp) textfile=$(mktemp) tagsfile=$(mktemp) export awkfile textfile tagsfile trap 'rm -f $awkfile $textfile $tagsfile' 0 1 2 10 14 15 nawk 'BEGIN { textfile=ENVIRON["textfile"] tagsfile=ENVIRON["tagsfile"] } /^@begin code/ { ++secno } /^@xref label/ { print $3, secno >tagsfile } /^@((begin|end) (docs|code))/ { print >textfile } /^@(text|nl|defn|use)/ { print >textfile } /^@xref (ref|notused)/ { print >textfile } /^@xref (begin|end)(defs|uses)/ { print >textfile } /^@xref (def|use)item/ { print >textfile} /^@xref ((begin|end)chunks)|(chunk(begin|use|defn|end))/ { print >textfile } /^@index (begin|end)(defs|uses)/ { print >textfile } /^@index (is(us|defin)ed)|((def|use)item)/ { print >textfile } /^@index ((begin|end)index)|(entry(begin|use|defn|end))/ { print >textfile }' nawk 'BEGIN { textfile = ENVIRON["textfile"] tagsfile = ENVIRON["tagsfile"] tfmt="detex | fmt -79" cfmt="expand -4 | fold -75 | sed \"s/^/ /\"" xfmt="fold -75 | sed \"s/^/ /\"" zfmt="cat" while (getline 0) tag[$1] = $2 close(tagsfile) } /^@begin docs/ { out = tfmt } /^@end docs/ { close(out) } /^@begin code/ { out = cfmt; code = 1; ++secno } /^@end code/ { endcode(); close(out); printf "\n" } /^@text/ { printf "%s", substr($0, 7) | out } /^@nl/ { # printf "(->%s)", formatname(out) | out ; printf "\n" | out } /^@xref ref/ { lastxrefref = tag[substr($0, 11)] } /^@defn/ { name = convquote(substr($0, 7)) printf "\n### %d ### %s%s=", secno, chunkname(name, lastxrefref), defn[name] defn[name] = "+" } /^@use/ { name = convquote(substr($0, 6)) printf "%s", chunkname(name, lastxrefref) | out } /^@xref begindefs/ { endcode() printf "This definition continued in" | out } /^@xref beginuses/ { endcode() printf "This code used in" | out } /^@xref notused/ { endcode() print "This code not used in this document." | out } /^@xref (def|use)item/ { addlist(tag[$3]) } /^@xref end(defs|uses)/ { printlist() } $0 ~ /^@index begindefs/ && !noindex { endcode() print "Defines:" | out } $0 ~ /^@index isused/ && !noindex { if (tag[$3] != lastxrefref) addlist(tag[$3]) } $0 ~ /^@index defitem/ && !noindex { printf " %s,", $3 | out if (nlist == 0) printf " not used in this document.\n" | out else { printf " used in" | out; printlist() } } $0 ~ /^@index beginuses/ && !noindex { endcode(); printf "Uses" | out } $0 ~ /^@index isdefined/ && !noindex { lastuse = tag[$3] } $0 ~ /^@index useitem/ && !noindex { addlist(sprintf("%s %s", $3, lastuse)) } $0 ~ /^@index enduses/ && !noindex { printlist() } /^@xref beginchunks/ { close(out); out = zfmt print "List of code chunks\n" | out } /^@xref chunkbegin/ { name = convquote(substr($0, length($3) + 19)) printf "%s\n", chunkname(name, tag[$3]) | out } /^@xref chunkuse/ { addlist(tag[$3]) } /^@xref chunkdefn/ { } /^@xref chunkend/ { if (nlist == 0) print " Not used in this document." | out else { printf " Used in" | out; printlist() } } /^@xref endchunks/ { } $0 ~ /^@index beginindex/ && !noindex { print "\nList of identifiers (defini" \ "tion in parentheses)\n" | out } $0 ~ /^@index entrybegin/ && !noindex { name = substr($0, length($3 + 19)) lastdefn = tag[$3] printf "%s: ", $4 | out } $0 ~ /^@index entryuse/ && !noindex { addlist(tag[$3]) } $0 ~ /^@index entrydefn/ && !noindex { } $0 ~ /^@index entryend/ && !noindex { for (i = 1; i <= nlist; i++) if (list[i] == lastdefn) sub(/.*/, "(&)", list[i]) if (nlist == 0) print "Not used." | out else printlist() } $0 ~ /^@index endindex/ && !noindex { } /^@fatal / { exit 1 } END { close(out) } function endcode() { if (code == 1) { code = 0 close(out) out = xfmt printf "\n" | out } } function addlist(s, i) { for (i = 1; i <= nlist; i++) if (s == list[i]) return list[++nlist] = s } function printlist( i) { if (nlist == 1) printf " %s.\n", list[1] | out else if (nlist == 2) printf " %s and %s.\n", list[1], list[2] | out else { for (i = 1; i < nlist; i++) printf " %s,", list[i] | out printf " and %s.\n", list[nlist] | out } for (i in list) delete list[i] nlist = 0 } function convquote(s) { gsub(/\[\[|\]\]/, "", s); return s } function chunkname(name, number) { if (number == 0) return sprintf("<%s>", name) else return sprintf("<%s %d>", name, number) }' noindex=$noindex $textfile exit $?