Relay-Version: version B 2.10 5/3/83; site utzoo.UUCP Posting-Version: version B 2.10.2 9/18/84; site rochester.UUCP Path: utzoo!watmath!clyde!burl!ulysses!allegra!mit-eddie!think!harvard!seismo!rochester!lee From: lee@rochester.UUCP (Lee Moore) Newsgroups: net.text,net.sources.bugs Subject: Re: one way to get an index in troff Message-ID: <11389@rochester.UUCP> Date: Thu, 5-Sep-85 15:08:46 EDT Article-I.D.: rocheste.11389 Posted: Thu Sep 5 15:08:46 1985 Date-Received: Sat, 7-Sep-85 05:56:22 EDT References: <10990@rochester.UUCP> Distribution: net Organization: U. of Rochester, CS Dept. Lines: 154 Xref: watmath net.text:597 net.sources.bugs:470 This is a follow-up to the troff indexing article I posted last month. A couple people have had some problems with it. The major problem is that the Icon programs were written in an older version of the language. I have updated these programs so that they will compile under the most recent version. They are included below. The other problem is a typo in the sort command. Where I said: sort +1n +0n -1n .... I should have said: sort +1 +0n -1n Now, it won't try to sort the index items numerically, only the page numbers. lee ------------------------------------------ #!/bin/sh # This is a shell archive, meaning: # 1. Remove everything above the #!/bin/sh line. # 2. Save the resulting text in a file. # 3. Execute the file with /bin/sh (not csh) to create the files: # block.icn # fixindex.icn # This archive created: Thu Sep 5 15:06:55 1985 export PATH; PATH=/bin:$PATH if test -f 'block.icn' then echo shar: over-writing existing file "'block.icn'" fi cat << \SHAR_EOF > 'block.icn' # # Seperate index entries where the first letter of the entry # changes. Produce a ".LB" at the break point. Provide # the macro with the new letter # procedure main() local doubleQuote, line, oldFirstChar, firstChar doubleQuote := cset("\"") oldFirstChar := "" # read until end of file while line := read() do { line ? { tab(upto(doubleQuote)) | write("can't find double q") move(1) firstChar := &subject[&pos] } # are the first two letters different? if firstChar ~== oldFirstChar then { write(".LB ", firstChar) } oldFirstChar := firstChar write(line) } end SHAR_EOF if test -f 'fixindex.icn' then echo shar: over-writing existing file "'fixindex.icn'" fi cat << \SHAR_EOF > 'fixindex.icn' # transform raw index entries into new macros # # features include: merging page numbers and suppressing duplicates # sorting out major headings from minor # # the (pre-sorted) input is of the form # # record LineState(PageNum, Major, Minor) procedure main() local pageList, old, new old := LineState() new := LineState() split(old) | return pageList := old.PageNum if old.Minor ~== "" then write(".Ib \"", old.Major, "\"") while split(new) do { if old.Major == new.Major then if old.Minor == new.Minor then { if old.PageNum ~= new.PageNum then pageList ||:= "," || new.PageNum } else { WriteEntry(old, pageList) pageList := new.PageNum } else { WriteEntry(old, pageList) pageList := new.PageNum if new.Minor ~== "" then write(".Ib \"", new.Major, "\"") } AssignRecord(new, old) } # new -> old WriteEntry(old, pageList) end procedure split(state) static tabChar, digits initial { tabChar := cset("\t"); digits := cset("0123456789") } read() | fail ? { state.PageNum := tab(many(digits)) tab(many(tabChar)) state.Major := tab(upto(tabChar)) | tab(0) tab(many(tabChar)) state.Minor := tab(0) } return end procedure WriteEntry(state, pageList) if state.Minor == "" then write(".I> \"", state.Major, "\" \"", pageList, "\"") else write(".I< \"", state.Major, "\" \"", state.Minor, "\" \"", pageList, "\"") end procedure AssignRecord(a, b) b.Major := a.Major b.Minor := a.Minor b.PageNum := a.PageNum end SHAR_EOF # End of shell archive exit 0 -- TCP/IP: lee@rochester.arpa UUCP: {decvax, allegra, seismo, cmcl2}!rochester!lee XNS: Lee Moore:CS:Univ Rochester Phone: +1 (716) 275-7747, -5671 Physical: 43 01' 40'' N, 77 37' 49'' W