|
|
1.1 root 1: # transform raw index entries into new macros
2: #
3: # features include: merging page numbers and suppressing duplicates
4: # sorting out major headings from minor
5: #
6: # the (pre-sorted) input is of the form
7: # <page-number><tab><major name><tab><minor name>
8: #
9:
10:
11: record LineState(PageNum, Major, Minor)
12:
13: procedure main()
14: local pageList, old, new
15:
16: old := LineState()
17: new := LineState()
18: split(old) | return
19: pageList := old.PageNum
20:
21: if old.Minor ~== "" then
22: write(".Ib \"", old.Major, "\"")
23:
24: while split(new) do {
25: if old.Major == new.Major then
26: if old.Minor == new.Minor then {
27: if old.PageNum ~= new.PageNum then
28: pageList ||:= "," || new.PageNum }
29: else {
30: WriteEntry(old, pageList)
31: pageList := new.PageNum }
32: else {
33: WriteEntry(old, pageList)
34: pageList := new.PageNum
35:
36: if new.Minor ~== "" then
37: write(".Ib \"", new.Major, "\"") }
38:
39: AssignRecord(new, old) } # new -> old
40:
41: WriteEntry(old, pageList)
42: end
43:
44:
45: procedure split(state)
46: static tabChar,
47: digits
48: initial { tabChar := cset("\t");
49: digits := cset("0123456789") }
50:
51: read() | fail ? {
52: state.PageNum := tab(many(digits))
53: tab(many(tabChar))
54: state.Major := tab(upto(tabChar)) | tab(0)
55: tab(many(tabChar))
56: state.Minor := tab(0) }
57:
58: return
59: end
60:
61:
62: procedure WriteEntry(state, pageList)
63: if state.Minor == "" then
64: write(".I> \"", state.Major, "\" \"", pageList, "\"")
65: else
66: write(".I< \"", state.Major, "\" \"", state.Minor,
67: "\" \"", pageList, "\"")
68: end
69:
70:
71: procedure AssignRecord(a, b)
72: b.Major := a.Major
73: b.Minor := a.Minor
74: b.PageNum := a.PageNum
75: end
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.