home *** CD-ROM | disk | FTP | other *** search
/ Source Code 1992 March / Source_Code_CD-ROM_Walnut_Creek_March_1992.iso / usenet / altsrcs / 3 / 3582 < prev    next >
Text File  |  1991-07-02  |  20KB  |  732 lines

  1. Newsgroups: alt.sources
  2. From: goer@ellis.uchicago.edu (Richard L. Goerwitz)
  3. Subject: kjv browser, part 8 of 11
  4. Message-ID: <1991Jul3.065222.28343@midway.uchicago.edu>
  5. Date: Wed, 3 Jul 1991 06:52:22 GMT
  6.  
  7. ---- Cut Here and feed the following to sh ----
  8. #!/bin/sh
  9. # this is bibleref.08 (part 8 of a multipart archive)
  10. # do not concatenate these parts, unpack them in order with /bin/sh
  11. # file findre.icn continued
  12. #
  13. if test ! -r _shar_seq_.tmp; then
  14.     echo 'Please unpack part 1 first!'
  15.     exit 1
  16. fi
  17. (read Scheck
  18.  if test "$Scheck" != 8; then
  19.     echo Please unpack part "$Scheck" next!
  20.     exit 1
  21.  else
  22.     exit 0
  23.  fi
  24. ) < _shar_seq_.tmp || exit 1
  25. if test ! -f _shar_wnt_.tmp; then
  26.     echo 'x - still skipping findre.icn'
  27. else
  28. echo 'x - continuing file findre.icn'
  29. sed 's/^X//' << 'SHAR_EOF' >> 'findre.icn' &&
  30. X            tmp := tab(many('*?+')) | &null
  31. X            if upto('*?',\tmp)
  32. X            then put(token_list,-ord("*"))
  33. X            else put(token_list,-ord("+"))
  34. X            }
  35. X            "?"    : {
  36. X            tmp := tab(many('*?+')) | &null
  37. X            if upto('*+',\tmp)
  38. X            then put(token_list,-ord("*"))
  39. X            else put(token_list,-ord("?"))
  40. X            }
  41. X            "("    : {
  42. X            tab(many('*+?'))
  43. X            put(token_list,-ord("("))
  44. X            }
  45. X            default: {
  46. X            put(token_list,-ord(chr))
  47. X            }
  48. X        }
  49. X        }
  50. X        else {
  51. X        case chr of {
  52. X            # More egrep compatibility stuff.
  53. X            "["    : {
  54. X            b_loc := find("[") | *&subject+1
  55. X            every next_one := find("]",,,b_loc)
  56. X            \next_one ~= &pos | err_out(s,2,chr)
  57. X            put(token_list,-ord(chr))
  58. X            }
  59. X                    "]"    : {
  60. X            if &pos = (\next_one+1)
  61. X            then put(token_list,-ord(chr)) &
  62. X                 next_one := &null
  63. X            else put(token_list,ord(chr))
  64. X            }
  65. X            default: put(token_list,ord(chr))
  66. X        }
  67. X        }
  68. X    }
  69. X    }
  70. X
  71. X    token_list := UnMetaBrackets(token_list)
  72. X
  73. X    fixed_length_token_list := list(*token_list)
  74. X    every i := 1 to *token_list
  75. X    do fixed_length_token_list[i] := token_list[i]
  76. X    return fixed_length_token_list
  77. X
  78. Xend
  79. X
  80. X
  81. X
  82. Xprocedure UnMetaBrackets(l)
  83. X
  84. X    # Since brackets delineate a cset, it doesn't make
  85. X    # any sense to have metacharacters inside of them.
  86. X    # UnMetaBrackets makes sure there are no metacharac-
  87. X    # ters inside of the braces.
  88. X
  89. X    local tmplst, i, Lb, Rb
  90. X
  91. X    tmplst := list(); i := 0
  92. X    Lb := -ord("[")
  93. X    Rb := -ord("]")
  94. X
  95. X    while (i +:= 1) <= *l do {
  96. X    if l[i] = Lb then {
  97. X        put(tmplst,l[i])
  98. X        until l[i +:= 1] = Rb
  99. X        do put(tmplst,abs(l[i]))
  100. X        put(tmplst,l[i])
  101. X    }
  102. X    else put(tmplst,l[i])
  103. X    }
  104. X    return tmplst
  105. X
  106. Xend
  107. X
  108. X
  109. X
  110. Xprocedure MakeFSTN(l,INI,FIN)
  111. X
  112. X    # MakeFSTN recursively descends through the tree structure
  113. X    # implied by the tokenized string, l, recording in (global)
  114. X    # fstn_table a list of operations to be performed, and the
  115. X    # initial and final states which apply to them.
  116. X
  117. X    local i, inter, inter2, tmp, Op, Arg
  118. X    static Lp, Rp, Sl, Lb, Rb, Caret_inside, Dot, Dollar, Caret_outside
  119. X    # global biggest_nonmeta_str, slash_present, parends_present
  120. X    initial {
  121. X    Lp := -ord("("); Rp := -ord(")")
  122. X    Sl := -ord("|")
  123. X    Lb := -ord("["); Rb := -ord("]"); Caret_inside := ord("^")
  124. X    Dot := -ord("."); Dollar := -ord("$"); Caret_outside := -ord("^")
  125. X    }
  126. X
  127. X    /INI := 1 & state_table := table() &
  128. X    NextState("new") & biggest_nonmeta_str := ""
  129. X    /FIN := 0
  130. X
  131. X    # I haven't bothered to test for empty lists everywhere.
  132. X    if *l = 0 then {
  133. X    /state_table[INI] := []
  134. X    put(state_table[INI],o_a_s(zSucceed,&null,FIN))
  135. X    return
  136. X    }
  137. X
  138. X    # HUNT DOWN THE SLASH (ALTERNATION OPERATOR)
  139. X    every i := 1 to *l do {
  140. X    if l[i] = Sl & tab_bal(l,Lp,Rp) = i then {
  141. X        if i = 1 then err_out(l,2,char(abs(l[i]))) else {
  142. X        /slash_present := "yes"
  143. X        inter := NextState()
  144. X        inter2:= NextState()
  145. X        MakeFSTN(l[1:i],inter2,FIN)
  146. X        MakeFSTN(l[i+1:0],inter,FIN)
  147. X        /state_table[INI] := []
  148. X        put(state_table[INI],o_a_s(apply_FSTN,inter2,0))
  149. X        put(state_table[INI],o_a_s(apply_FSTN,inter,0))
  150. X        return
  151. X        }
  152. X    }
  153. X    }
  154. X
  155. X    # HUNT DOWN PARENTHESES
  156. X    if l[1] = Lp then {
  157. X    i := tab_bal(l,Lp,Rp) | err_out(l,2,"(")
  158. X    inter := NextState()
  159. X    if any('*+?',char(abs(0 > l[i+1]))) then {
  160. X        case l[i+1] of {
  161. X        -ord("*")   : {
  162. X            /state_table[INI] := []
  163. X            put(state_table[INI],o_a_s(apply_FSTN,inter,0))
  164. X            MakeFSTN(l[2:i],INI,INI)
  165. X            MakeFSTN(l[i+2:0],inter,FIN)
  166. X            return
  167. X        }
  168. X        -ord("+")   : {
  169. X            inter2 := NextState()
  170. X            /state_table[inter2] := []
  171. X            MakeFSTN(l[2:i],INI,inter2)
  172. X            put(state_table[inter2],o_a_s(apply_FSTN,inter,0))
  173. X            MakeFSTN(l[2:i],inter2,inter2)
  174. X            MakeFSTN(l[i+2:0],inter,FIN)
  175. X            return
  176. X        }
  177. X        -ord("?")   : {
  178. X            /state_table[INI] := []
  179. X            put(state_table[INI],o_a_s(apply_FSTN,inter,0))
  180. X            MakeFSTN(l[2:i],INI,inter)
  181. X            MakeFSTN(l[i+2:0],inter,FIN)
  182. X            return
  183. X        }
  184. X        }
  185. X    }
  186. X    else {
  187. X        MakeFSTN(l[2:i],INI,inter)
  188. X        MakeFSTN(l[i+1:0],inter,FIN)
  189. X        return
  190. X    }
  191. X    }
  192. X    else {     # I.E. l[1] NOT = Lp (left parenthesis as -ord("("))
  193. X    every i := 1 to *l do {
  194. X        case l[i] of {
  195. X        Lp     : {
  196. X            inter := NextState()
  197. X            MakeFSTN(l[1:i],INI,inter)
  198. X            /parends_present := "yes"
  199. X            MakeFSTN(l[i:0],inter,FIN)
  200. X            return
  201. X        }
  202. X        Rp     : err_out(l,2,")")
  203. X        }
  204. X    }
  205. X    }
  206. X
  207. X    # NOW, HUNT DOWN BRACKETS
  208. X    if l[1] = Lb then {
  209. X    i := tab_bal(l,Lb,Rb) | err_out(l,2,"[")
  210. X    inter := NextState()
  211. X    tmp := ""; every tmp ||:= char(l[2 to i-1])
  212. X    if Caret_inside = l[2]
  213. X    then tmp := ~cset(Expand(tmp[2:0]))
  214. X    else tmp :=  cset(Expand(tmp))
  215. X    if any('*+?',char(abs(0 > l[i+1]))) then {
  216. X        case l[i+1] of {
  217. X        -ord("*")   : {
  218. X            /state_table[INI] := []
  219. X            put(state_table[INI],o_a_s(apply_FSTN,inter,0))
  220. X            put(state_table[INI],o_a_s(any,tmp,INI))
  221. X            MakeFSTN(l[i+2:0],inter,FIN)
  222. X            return
  223. X        }
  224. X        -ord("+")   : {
  225. X            inter2 := NextState()
  226. X            /state_table[INI] := []
  227. X            put(state_table[INI],o_a_s(any,tmp,inter2))
  228. X            /state_table[inter2] := []
  229. X            put(state_table[inter2],o_a_s(apply_FSTN,inter,0))
  230. X            put(state_table[inter2],o_a_s(any,tmp,inter2))
  231. X            MakeFSTN(l[i+2:0],inter,FIN)
  232. X            return
  233. X        }
  234. X        -ord("?")   : {
  235. X            /state_table[INI] := []
  236. X            put(state_table[INI],o_a_s(apply_FSTN,inter,0))
  237. X            put(state_table[INI],o_a_s(any,tmp,inter))
  238. X            MakeFSTN(l[i+2:0],inter,FIN)
  239. X            return
  240. X        }
  241. X        }
  242. X    }
  243. X    else {
  244. X        /state_table[INI] := []
  245. X        put(state_table[INI],o_a_s(any,tmp,inter))
  246. X        MakeFSTN(l[i+1:0],inter,FIN)
  247. X        return
  248. X    }
  249. X    }
  250. X    else {           # I.E. l[1] not = Lb
  251. X    every i := 1 to *l do {
  252. X        case l[i] of {
  253. X        Lb     : {
  254. X            inter := NextState()
  255. X            MakeFSTN(l[1:i],INI,inter)
  256. X            MakeFSTN(l[i:0],inter,FIN)
  257. X            return
  258. X        }
  259. X        Rb     : err_out(l,2,"]")
  260. X        }
  261. X    }
  262. X    }
  263. X
  264. X    # FIND INITIAL SEQUENCES OF POSITIVE INTEGERS, CONCATENATE THEM
  265. X    if i := match_positive_ints(l) then {
  266. X    inter := NextState()
  267. X    tmp := Ints2String(l[1:i])
  268. X    # if a slash has been encountered already, forget optimizing
  269. X        # in this way; if parends are present, too, then forget it,
  270. X        # unless we are at the beginning or end of the input string
  271. X    if  INI = 1 | FIN = 2 | /parends_present &
  272. X        /slash_present & *tmp > *biggest_nonmeta_str
  273. X    then biggest_nonmeta_str := tmp
  274. X    /state_table[INI] := []
  275. X    put(state_table[INI],o_a_s(match,tmp,inter))
  276. X    MakeFSTN(l[i:0],inter,FIN)
  277. X    return
  278. X    }
  279. X
  280. X    # OKAY, CLEAN UP ALL THE JUNK THAT'S LEFT
  281. X    i := 0
  282. X    while (i +:= 1) <= *l do {
  283. X    case l[i] of {
  284. X        Dot          : { Op := any;   Arg := &cset }
  285. X        Dollar       : { Op := pos;   Arg := 0     }
  286. X        Caret_outside: { Op := pos;   Arg := 1     }
  287. X        default      : { Op := match; Arg := char(0 < l[i]) }
  288. X    } | err_out(l,2,char(abs(l[i])))
  289. X    inter := NextState()
  290. X    if any('*+?',char(abs(0 > l[i+1]))) then {
  291. X        case l[i+1] of {
  292. X        -ord("*")   : {
  293. X            /state_table[INI] := []
  294. X            put(state_table[INI],o_a_s(apply_FSTN,inter,0))
  295. X            put(state_table[INI],o_a_s(Op,Arg,INI))
  296. X            MakeFSTN(l[i+2:0],inter,FIN)
  297. X            return
  298. X        }
  299. X        -ord("+")   : {
  300. X            inter2 := NextState()
  301. X            /state_table[INI] := []
  302. X            put(state_table[INI],o_a_s(Op,Arg,inter2))
  303. X            /state_table[inter2] := []
  304. X            put(state_table[inter2],o_a_s(apply_FSTN,inter,0))
  305. X            put(state_table[inter2],o_a_s(Op,Arg,inter2))
  306. X            MakeFSTN(l[i+2:0],inter,FIN)
  307. X            return
  308. X        }
  309. X        -ord("?")   : {
  310. X            /state_table[INI] := []
  311. X            put(state_table[INI],o_a_s(apply_FSTN,inter,0))
  312. X            put(state_table[INI],o_a_s(Op,Arg,inter))
  313. X            MakeFSTN(l[i+2:0],inter,FIN)
  314. X            return
  315. X        }
  316. X        }
  317. X    }
  318. X    else {
  319. X        /state_table[INI] := []
  320. X        put(state_table[INI],o_a_s(Op,Arg,inter))
  321. X        MakeFSTN(l[i+1:0],inter,FIN)
  322. X        return
  323. X    }
  324. X    }
  325. X
  326. X    # WE SHOULD NOW BE DONE INSERTING EVERYTHING INTO state_table
  327. X    # IF WE GET TO HERE, WE'VE PARSED INCORRECTLY!
  328. X    err_out(l,4)
  329. X
  330. Xend
  331. X
  332. X
  333. X
  334. Xprocedure NextState(new)
  335. X    static nextstate
  336. X    if \new then nextstate := 1
  337. X    else nextstate +:= 1
  338. X    return nextstate
  339. Xend
  340. X
  341. X
  342. X
  343. Xprocedure err_out(x,i,elem)
  344. X    writes(&errout,"Error number ",i," parsing ",image(x)," at ")
  345. X    if \elem 
  346. X    then write(&errout,image(elem),".")
  347. X    else write(&errout,"(?).")
  348. X    exit(i)
  349. Xend
  350. X
  351. X
  352. X
  353. Xprocedure zSucceed()
  354. X    return .&pos
  355. Xend
  356. X
  357. X
  358. X
  359. Xprocedure Expand(s)
  360. X
  361. X    local s2, c1, c2
  362. X
  363. X    s2 := ""
  364. X    s ? {
  365. X    s2 ||:= ="^"
  366. X    s2 ||:= ="-"
  367. X    while s2 ||:= tab(find("-")-1) do {
  368. X        if (c1 := move(1), ="-",
  369. X        c2 := move(1),
  370. X        c1 << c2)
  371. X        then every s2 ||:= char(ord(c1) to ord(c2))
  372. X        else s2 ||:= 1(move(2), not(pos(0))) | err_out(s,2,"-")
  373. X    }
  374. X    s2 ||:= tab(0)
  375. X    }
  376. X    return s2
  377. X
  378. Xend
  379. X
  380. X
  381. X
  382. Xprocedure tab_bal(l,i1,i2)
  383. X
  384. X    local i, i1_count, i2_count
  385. X
  386. X    i := 0
  387. X    i1_count := 0; i2_count := 0
  388. X    while (i +:= 1) <= *l do {
  389. X    case l[i] of {
  390. X        i1  : i1_count +:= 1
  391. X        i2  : i2_count +:= 1
  392. X    }
  393. X    if i1_count = i2_count
  394. X    then suspend i
  395. X    }
  396. X
  397. Xend
  398. X
  399. X
  400. Xprocedure match_positive_ints(l)
  401. X    
  402. X    # Matches the longest sequence of positive integers in l,
  403. X    # beginning at l[1], which neither contains, nor is fol-
  404. X    # lowed by a negative integer.  Returns the first position
  405. X    # after the match.  Hence, given [55, 55, 55, -42, 55],
  406. X    # match_positive_ints will return 3.  [55, -42] will cause
  407. X    # it to fail rather than return 1 (NOTE WELL!).
  408. X
  409. X    local i
  410. X
  411. X    every i := 1 to *l do {
  412. X    if l[i] < 0
  413. X    then return (3 < i) - 1 | fail
  414. X    }
  415. X    return *l + 1
  416. X
  417. Xend
  418. X
  419. X
  420. Xprocedure Ints2String(l)
  421. X
  422. X    local tmp
  423. X
  424. X    tmp := ""
  425. X    every tmp ||:= char(!l)
  426. X    return tmp
  427. X
  428. Xend
  429. X
  430. X
  431. Xprocedure StripChar(s,s2)
  432. X
  433. X    local tmp
  434. X
  435. X    if find(s2,s) then {
  436. X    tmp := ""
  437. X    s ? {
  438. X        while tmp ||:= tab(find("s2"))
  439. X        do tab(many(cset(s2)))
  440. X        tmp ||:= tab(0)
  441. X    }
  442. X    }
  443. X    return \tmp | s
  444. X
  445. Xend
  446. SHAR_EOF
  447. echo 'File findre.icn is complete' &&
  448. true || echo 'restore of findre.icn failed'
  449. rm -f _shar_wnt_.tmp
  450. fi
  451. # ============= kjv2rtv.icn ==============
  452. if test -f 'kjv2rtv.icn' -a X"$1" != X"-c"; then
  453.     echo 'x - skipping kjv2rtv.icn (File already exists)'
  454.     rm -f _shar_wnt_.tmp
  455. else
  456. > _shar_wnt_.tmp
  457. echo 'x - extracting kjv2rtv.icn (Text)'
  458. sed 's/^X//' << 'SHAR_EOF' > 'kjv2rtv.icn' &&
  459. X############################################################################
  460. X#
  461. X#    Name:     kjv2rtv.icn
  462. X#
  463. X#    Title:     kjv2rtv  (KJV -> retrieve format converter)
  464. X#
  465. X#    Author:     Richard L. Goerwitz
  466. X#
  467. X#    Version: 1.5
  468. X#
  469. X############################################################################
  470. X#
  471. X#  Program for converting PD KJV biblical texts into retrieve format.
  472. X#  Reads standard input.  Writes reformatted text to standard output.
  473. X#  Assumes the specific PC-SIG KJV format for input files.  If you
  474. X#  have a KJV text that has been "tampered" with, this program may not
  475. X#  work correctly.  And then again....
  476. X#
  477. X############################################################################
  478. X#
  479. X#  Links: complete.icn ./convertr.icn ./name2num.icn
  480. X#
  481. X############################################################################
  482. X
  483. X
  484. Xprocedure main()
  485. X
  486. X    local line, bitmap, verse
  487. X
  488. X    # While you can read lines from stdin...
  489. X    while line := read() do {
  490. X
  491. X    # ...scan them for book ch:vs references, and output these in
  492. X    # retrieve format, along with corresponding text.
  493. X    line ? {
  494. X
  495. X        # Housekeeping.
  496. X        pos(0) & next    # skip past empty lines
  497. X        ="\x1F"        # tab past ASCII 31 (if present)
  498. X        tab(many('\t '))    # tab past whitespace (if present)
  499. X
  500. X        # If the next line begins with a book ch:vs reference,
  501. X        # then write out the text of the preceding verse (if in
  502. X        # fact there *was* a preceding verse).  Finally, write out
  503. X        # the new book ch:vs reference (in retrieve format).
  504. X        if bitmap := convertr(tab(find("  "))) then {
  505. X        write(REplace("" ~== trim(\verse, '\t \x0D'), "  ", " "))
  506. X        write("::", bitmap)
  507. X        tab(many(' \t'))
  508. X        verse := trim(tab(0), '\t \x0D')
  509. X        } else {
  510. X        # Dump the (rest of) the line onto verse.
  511. X        verse ||:= " " || ("" ~== trim(tab(0), '\t \x0D'))
  512. X        }
  513. X    }
  514. X    }
  515. X    # Flush the "verse" buffer.
  516. X    write(REplace("" ~== trim(\verse, '\t \x0D'), "  ", " "))
  517. X
  518. X    exit(0)
  519. X
  520. Xend
  521. X
  522. X
  523. X#
  524. X# From strings.icn in the IPL (written by Ralph Griswold).
  525. X#
  526. Xprocedure REplace(s1,s2,s3)
  527. X
  528. X    local result, i
  529. X    result := ""
  530. X    i := *s2
  531. X
  532. X    s1 ? {
  533. X    while result ||:= tab(find(s2)) do {
  534. X        result ||:= s3
  535. X        move(i)
  536. X    }
  537. X    return result || tab(0)
  538. X    }
  539. X
  540. Xend
  541. SHAR_EOF
  542. true || echo 'restore of kjv2rtv.icn failed'
  543. rm -f _shar_wnt_.tmp
  544. fi
  545. # ============= convertr.icn ==============
  546. if test -f 'convertr.icn' -a X"$1" != X"-c"; then
  547.     echo 'x - skipping convertr.icn (File already exists)'
  548.     rm -f _shar_wnt_.tmp
  549. else
  550. > _shar_wnt_.tmp
  551. echo 'x - extracting convertr.icn (Text)'
  552. sed 's/^X//' << 'SHAR_EOF' > 'convertr.icn' &&
  553. X############################################################################
  554. X#
  555. X#    Name:     convertr.icn
  556. X#
  557. X#    Title:     convert KJV book chap:verse reference to a 
  558. X#                writable bitmap suitable for a retrieve text-base
  559. X#                file
  560. X#
  561. X#    Author:     Richard L. Goerwitz
  562. X#
  563. X#    Version: 1.3
  564. X#
  565. X############################################################################
  566. X#
  567. X#  Links: complete.icn, ./name2num.icn
  568. X#
  569. X############################################################################
  570. X
  571. Xprocedure convertr(s)
  572. X
  573. X    local bitmap, bookname, book_numeric, len, no
  574. X
  575. X    no       := 2
  576. X    len      := 8
  577. X    bookname := ""
  578. X    bitmap   := 0
  579. X
  580. X    s ? {
  581. X
  582. X    # Find book name, convert it to an integer.
  583. X    bookname ||:= tab(any('1234'));    tab(many(' '))
  584. X    bookname ||:= tab(many(&letters++&digits)) | fail
  585. X    book_numeric :=  name2num(bookname) | fail
  586. X    bitmap := book_numeric || ":"
  587. X    
  588. X    # Get book and verse fields.  Tack them onto bitmap.
  589. X    while tab(upto(&digits)) do {
  590. X        no -:= 1
  591. X        # If no goes below 0 then we have too many fields for the
  592. X        # file named in arg 2.
  593. X        bitmap ||:= tab(many(&digits)) || ":"
  594. X    }
  595. X    no ~= 0 & stop("convertr:  impossible reference ",image(&subject))
  596. X    }
  597. X
  598. X    # If the current no is not 0, then we have either too
  599. X    # many or too few fields.
  600. X    no = 0 | fail
  601. X
  602. X    return trim(bitmap, ':')
  603. X
  604. Xend
  605. SHAR_EOF
  606. true || echo 'restore of convertr.icn failed'
  607. rm -f _shar_wnt_.tmp
  608. fi
  609. # ============= makeind.icn ==============
  610. if test -f 'makeind.icn' -a X"$1" != X"-c"; then
  611.     echo 'x - skipping makeind.icn (File already exists)'
  612.     rm -f _shar_wnt_.tmp
  613. else
  614. > _shar_wnt_.tmp
  615. echo 'x - extracting makeind.icn (Text)'
  616. sed 's/^X//' << 'SHAR_EOF' > 'makeind.icn' &&
  617. X############################################################################
  618. X#
  619. X#    Name:     makeind.icn
  620. X#
  621. X#    Title:     makeind.icn
  622. X#
  623. X#    Author:     Richard L. Goerwitz
  624. X#
  625. X#    Version: 1.24
  626. X#
  627. X############################################################################
  628. X#
  629. X#  This file, makeind.icn, compiles into an indexing program which
  630. X#  creates a series of files offering the user rapid access to
  631. X#  individual elements (usually words) within a text file.  Access is
  632. X#  gained through a set of basic retrieval utilities contained in the
  633. X#  file retrieve.icn, bmp2text.icn, retrops.icn, and others included
  634. X#  with this package.  In order to be indexable, files must interleave
  635. X#  string coded bitfield-style designators with text in the following
  636. X#  manner:
  637. X#
  638. X#  ::001:001:001
  639. X#  This is text.
  640. X#  ::001:001:002
  641. X#  This is more text.
  642. X#
  643. X#  The lines beginning with :: (a double colon) mark bitfield-style
  644. X#  location-designators.  Location designators are strings with digit
  645. X#  fields of fixed number and length separated either by nothing (as
  646. X#  in, say 001001002), or better yet by non-digits (e.g. 001:001:002).
  647. X#  NOTE WELL: The bitmaps must come in ascending order.  For example,
  648. X#  if we assume three-field bitmaps, 002:001:014 would come before
  649. X#  003:001:013.  If your file is not sorted properly, then use the
  650. X#  utility, sorttxt provided as a part of this distribution.
  651. X#
  652. X#  usage:  makeind -f filename -m int -n int [-l int] [-s]
  653. X#
  654. X#  When calling makeind, you must specify the filename to be indexed
  655. X#  (-f filename), the maximum field value (-m max-value; e.g. if
  656. X#  fields can go from 0 to 255, then -m 255 would be used), and the
  657. X#  number of fields (-n field-number).  The -s switch directs makeind
  658. X#  to create a case-sensitive index.  The default is case-insensitive.
  659. X#  -l [int] tells makeind to create a .LIM file, which is only needed
  660. X#  if you want to retrieve text by location marker, and not just via
  661. X#  the index (for this, you'll need something to translate human-
  662. X#  readable references into retrieve's native format).
  663. X#
  664. X#  BUGS: This indexing routine is going to eat up a _tremendous_
  665. X#  amount of memory when used on large files, since every token in the
  666. X#  input file gets its own entry in wordtbl, and each entry gets a set
  667. X#  as its corresponding key.  If you don't have the memory, then you
  668. X#  could use strings instead of sets (the insert routines will be just
  669. X#  a tiny bit more complicated).  Intermediate files could also be
  670. X#  used.  Drop me a line if you want help.  Otherwise, make sure you
  671. X#  have at *least* two megabytes core for every megabyte of text in
  672. X#  the file you wish to index (or else a very, very good virtual
  673. X#  memory management system).
  674. X#
  675. X#  NOTE: The -S [field-sep] option is currently disabled because using
  676. X#  it slows things down drastically.  If you want to be able to
  677. X#  specify what separator to use when breaking files down into
  678. X#  individual words, consult ./gettokens.icn.
  679. X#
  680. X############################################################################
  681. X#
  682. X#  Links: options.icn, codeobj.icn, ./indexutl.icn ./gettokens.icn
  683. X#
  684. X#  See also: retrieve.icn, bmp2text.icn, expandrf.icn
  685. X#
  686. X############################################################################
  687. X
  688. X# IPL files to be linked in at compile time.
  689. Xlink options, codeobj
  690. X
  691. X# Global variable (for OS-dependencies).
  692. X# global IS            # declared in indexutl.icn
  693. X
  694. X# Is is a record containing vital information on an indexed file, such
  695. X# as the field separator, the string-length of fields, etc.  I've re-
  696. X# moved the record declaration from this file, and placed it in index-
  697. X# utl.icn.
  698. X# record is(FS, s_len, len, no, is_case_sensitive, r_field)
  699. X
  700. X#
  701. X# Main procedure.
  702. X#
  703. Xprocedure main(a)
  704. X
  705. X    local usage, opt_table, fname, rollover_field, index_fname,
  706. X    bitmap_fname, upto_field, bofname, bitmap_offset_table,
  707. X    out_IS, limits_fname
  708. X    # global IS            # IS contains stats for file being indexed
  709. X
  710. X    #
  711. X    # Initialize global OS-related parameters, such as the directory
  712. X    # separator (_slash) and the maximum permissible filename length
  713. X    # minus four (to make room for extensions makeind tacks on).
  714. X    #
  715. X    initialize_os_params()
  716. X
  717. X    #
  718. X    # Read in and check command argument list.  Insert FS and no
  719. X    # parameters into (global) record IS.  Calculate s_len, len, and
  720. X    # bitmap_length parameters as well.  Returns table of options
  721. SHAR_EOF
  722. true || echo 'restore of makeind.icn failed'
  723. fi
  724. echo 'End of  part 8'
  725. echo 'File makeind.icn is continued in part 9'
  726. echo 9 > _shar_seq_.tmp
  727. exit 0
  728. -- 
  729.  
  730.    -Richard L. Goerwitz              goer%sophist@uchicago.bitnet
  731.    goer@sophist.uchicago.edu         rutgers!oddjob!gide!sophist!goer
  732.