File:  [CSRG BSD Unix] / 43BSD / contrib / X / doc / Xlib / fixindex.icn
Revision 1.1.1.1 (vendor branch): download - view: text, annotated - select for diffs
Tue Apr 24 16:12:55 2018 UTC (8 years, 1 month ago) by root
Branches: MAIN, BSD
CVS tags: HEAD, BSD43
BSD 4.3

# 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
#	<page-number><tab><major name><tab><minor name>
#


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

unix.superglobalmegacorp.com

This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.