home *** CD-ROM | disk | FTP | other *** search
/ Usenet 1994 October / usenetsourcesnewsgroupsinfomagicoctober1994disk2.iso / misc / volume20 / bibleref / part06 < prev    next >
Text File  |  1991-07-18  |  33KB  |  940 lines

  1. Newsgroups: comp.sources.misc
  2. From: Richard Goerwitz <goer@midway.uchicago.edu>
  3. Subject:  v20i104:  bibleref - Word and passage retrievals from King James Bible, Part06/07
  4. Message-ID: <1991Jul18.030251.29545@sparky.IMD.Sterling.COM>
  5. X-Md4-Signature: eeed538a32f9ba2956fa44ac0932c322
  6. Date: Thu, 18 Jul 1991 03:02:51 GMT
  7. Approved: kent@sparky.imd.sterling.com
  8.  
  9. Submitted-by: Richard Goerwitz <goer@midway.uchicago.edu>
  10. Posting-number: Volume 20, Issue 104
  11. Archive-name: bibleref/part06
  12. Environment: ICON, UNIX
  13.  
  14. ---- Cut Here and feed the following to sh ----
  15. #!/bin/sh
  16. # this is bibleref.06 (part 6 of a multipart archive)
  17. # do not concatenate these parts, unpack them in order with /bin/sh
  18. # file convertr.icn continued
  19. #
  20. if test ! -r _shar_seq_.tmp; then
  21.     echo 'Please unpack part 1 first!'
  22.     exit 1
  23. fi
  24. (read Scheck
  25.  if test "$Scheck" != 6; then
  26.     echo Please unpack part "$Scheck" next!
  27.     exit 1
  28.  else
  29.     exit 0
  30.  fi
  31. ) < _shar_seq_.tmp || exit 1
  32. if test ! -f _shar_wnt_.tmp; then
  33.     echo 'x - still skipping convertr.icn'
  34. else
  35. echo 'x - continuing file convertr.icn'
  36. sed 's/^X//' << 'SHAR_EOF' >> 'convertr.icn' &&
  37. X#
  38. X#    Author:     Richard L. Goerwitz
  39. X#
  40. X#    Version: 1.3
  41. X#
  42. X############################################################################
  43. X#
  44. X#  Links: complete.icn, ./name2num.icn
  45. X#
  46. X############################################################################
  47. X
  48. Xprocedure convertr(s)
  49. X
  50. X    local bitmap, bookname, book_numeric, len, no
  51. X
  52. X    no       := 2
  53. X    len      := 8
  54. X    bookname := ""
  55. X    bitmap   := 0
  56. X
  57. X    s ? {
  58. X
  59. X    # Find book name, convert it to an integer.
  60. X    bookname ||:= tab(any('1234'));    tab(many(' '))
  61. X    bookname ||:= tab(many(&letters++&digits)) | fail
  62. X    book_numeric :=  name2num(bookname) | fail
  63. X    bitmap := book_numeric || ":"
  64. X    
  65. X    # Get book and verse fields.  Tack them onto bitmap.
  66. X    while tab(upto(&digits)) do {
  67. X        no -:= 1
  68. X        # If no goes below 0 then we have too many fields for the
  69. X        # file named in arg 2.
  70. X        bitmap ||:= tab(many(&digits)) || ":"
  71. X    }
  72. X    no ~= 0 & stop("convertr:  impossible reference ",image(&subject))
  73. X    }
  74. X
  75. X    # If the current no is not 0, then we have either too
  76. X    # many or too few fields.
  77. X    no = 0 | fail
  78. X
  79. X    return trim(bitmap, ':')
  80. X
  81. Xend
  82. SHAR_EOF
  83. echo 'File convertr.icn is complete' &&
  84. true || echo 'restore of convertr.icn failed'
  85. rm -f _shar_wnt_.tmp
  86. fi
  87. # ============= makeind.icn ==============
  88. if test -f 'makeind.icn' -a X"$1" != X"-c"; then
  89.     echo 'x - skipping makeind.icn (File already exists)'
  90.     rm -f _shar_wnt_.tmp
  91. else
  92. > _shar_wnt_.tmp
  93. echo 'x - extracting makeind.icn (Text)'
  94. sed 's/^X//' << 'SHAR_EOF' > 'makeind.icn' &&
  95. X############################################################################
  96. X#
  97. X#    Name:     makeind.icn
  98. X#
  99. X#    Title:     makeind.icn
  100. X#
  101. X#    Author:     Richard L. Goerwitz
  102. X#
  103. X#    Version: 1.28
  104. X#
  105. X############################################################################
  106. X#
  107. X#  This file, makeind.icn, compiles into an indexing program which
  108. X#  creates a series of files offering the user rapid access to
  109. X#  individual elements (usually words) within a text file.  Access is
  110. X#  gained through a set of basic retrieval utilities contained in the
  111. X#  file retrieve.icn, bmp2text.icn, retrops.icn, and others included
  112. X#  with this package.  In order to be indexable, files must interleave
  113. X#  string coded bitfield-style designators with text in the following
  114. X#  manner:
  115. X#
  116. X#  ::001:001:001
  117. X#  This is text.
  118. X#  ::001:001:002
  119. X#  This is more text.
  120. X#
  121. X#  The lines beginning with :: (a double colon) mark bitfield-style
  122. X#  location-designators.  Location designators are strings with digit
  123. X#  fields of fixed number and length separated either by nothing (as
  124. X#  in, say 001001002), or better yet by non-digits (e.g. 001:001:002).
  125. X#  NOTE WELL: The bitmaps must come in ascending order.  For example,
  126. X#  if we assume three-field bitmaps, 002:001:014 would come before
  127. X#  003:001:013.  If your file is not sorted properly, then use the
  128. X#  utility, sorttxt provided as a part of this distribution.
  129. X#
  130. X#  usage:  makeind -f filename -m int -n int [-l int] [-s]
  131. X#
  132. X#  When calling makeind, you must specify the filename to be indexed
  133. X#  (-f filename), the maximum field value (-m max-value; e.g. if
  134. X#  fields can go from 0 to 255, then -m 255 would be used), and the
  135. X#  number of fields (-n field-number).  The -s switch directs makeind
  136. X#  to create a case-sensitive index.  The default is case-insensitive.
  137. X#  -l [int] tells makeind to create a .LIM file, which is only needed
  138. X#  if you want to retrieve text by location marker, and not just via
  139. X#  the index (for this, you'll need something to translate human-
  140. X#  readable references into retrieve's native format).
  141. X#
  142. X#  BUGS: This indexing routine is going to eat up a _tremendous_
  143. X#  amount of memory when used on large files, since every token in the
  144. X#  input file gets its own entry in wordtbl, and each entry gets a set
  145. X#  as its corresponding key.  If you don't have the memory, then you
  146. X#  could use strings instead of sets (the insert routines will be just
  147. X#  a tiny bit more complicated).  Intermediate files could also be
  148. X#  used.  Drop me a line if you want help.  Otherwise, make sure you
  149. X#  have at *least* two megabytes core for every megabyte of text in
  150. X#  the file you wish to index (or else a very, very good virtual
  151. X#  memory management system).
  152. X#
  153. X#  NOTE: The -S [field-sep] option is currently disabled because using
  154. X#  it slows things down drastically.  If you want to be able to
  155. X#  specify what separator to use when breaking files down into
  156. X#  individual words, consult ./gettokens.icn.
  157. X#
  158. X############################################################################
  159. X#
  160. X#  Links: options.icn, codeobj.icn, ./indexutl.icn ./gettokens.icn
  161. X#
  162. X#  See also: retrieve.icn, bmp2text.icn, expandrf.icn
  163. X#
  164. X############################################################################
  165. X
  166. X# IPL files to be linked in at compile time.
  167. Xlink options, codeobj
  168. X
  169. X# Global variable (for OS-dependencies).
  170. X# global IS            # declared in indexutl.icn
  171. X
  172. X# Is is a record containing vital information on an indexed file, such
  173. X# as the field separator, the string-length of fields, etc.  I've re-
  174. X# moved the record declaration from this file, and placed it in index-
  175. X# utl.icn.
  176. X# record is(FS, s_len, len, no, is_case_sensitive, r_field)
  177. X
  178. X#
  179. X# Main procedure.
  180. X#
  181. Xprocedure main(a)
  182. X
  183. X    local usage, opt_table, fname, rollover_field, index_fname,
  184. X    bitmap_fname, upto_field, bofname, bitmap_offset_table,
  185. X    out_IS, limits_fname
  186. X    # global IS            # IS contains stats for file being indexed
  187. X
  188. X    #
  189. X    # Initialize global OS-related parameters, such as the directory
  190. X    # separator (_slash) and the maximum permissible filename length
  191. X    # minus four (to make room for extensions makeind tacks on).
  192. X    #
  193. X    initialize_os_params()
  194. X
  195. X    #
  196. X    # Read in and check command argument list.  Insert FS and no
  197. X    # parameters into (global) record IS.  Calculate s_len, len, and
  198. X    # bitmap_length parameters as well.  Returns table of options
  199. X    # (keys are option letters).
  200. X    #
  201. X    usage:= "usage: makeind -f filename -m int -n int [-l int] [-s]"
  202. X    opt_table := initialize_IS(a)
  203. X    fname := \opt_table["f"]                | stop(usage)
  204. X    rollover_field := opt_table["l"]            # (optional)
  205. X
  206. X    #
  207. X    # Begin the process of tokenizing, recording token locations, and
  208. X    # of storing this information in two separate files.
  209. X    #
  210. X    # Read input file, making a table of words and their locations.
  211. X    index_table  := create_index(fname)
  212. X
  213. X    #
  214. X    # Write keys to one file, with pointers into another file
  215. X    # containing the bitmaps for each key.
  216. X    #
  217. X    index_fname  := dir_name(fname)||create_fname(fname, "IND")
  218. X    bitmap_fname := dir_name(fname)||create_fname(fname, "BMP")
  219. X    write_tokens_and_offsets(index_fname, bitmap_fname, index_table)
  220. X
  221. X    #
  222. X    # Re-open fname and store the locations for each chunk of text
  223. X    # marked by a ::location marker.  This could certainly be
  224. X    # incorporated into the indexing routines, but only at the great
  225. X    # expense of clarity.
  226. X    #
  227. X    upto_field := 1 < (IS.no * 2) / 3 | 1
  228. X    bofname := dir_name(fname)||create_fname(fname, "OFS")
  229. X    bitmap_offset_table := 
  230. X    store_bitmaps_and_offsets(fname, upto_field)
  231. X    # store in .OFS file
  232. X    write_bitmaps_and_offsets(bofname, bitmap_offset_table, upto_field)
  233. X
  234. X    #
  235. X    # Re-open fname again, and store the pre-rollover bitmaps in the
  236. X    # .LIM file.  Obviously this procedure could be stuffed into
  237. X    # another one above (e.g. store_bitmaps_and_offsets()).
  238. X    #
  239. X    if \rollover_field then {
  240. X    #
  241. X    # Let's say we are using the Bible as our text, and we want to
  242. X    # create all the bitmaps for Genesis 1:9-2:10.  We need to know
  243. X    # what verse chapter 1 goes up to.  By supplying makeind
  244. X    # with a "-l 3" argument, you are telling it to store this in-
  245. X    # formation for later use by expandrf().
  246. X    #
  247. X    limits_fname := dir_name(fname)||create_fname(fname, "LIM")
  248. X    write_limits(limits_fname, fname, rollover_field)
  249. X    IS.r_field := rollover_field
  250. X    }
  251. X
  252. X    #
  253. X    # Write IS record to the .IS file.
  254. X    #
  255. X    out_IS := open(dir_name(fname)||create_fname(fname, "IS"), "w") |
  256. X    abort("makeind","can't open .IS file",2)
  257. X    writes(out_IS, encode(IS))
  258. X    close(out_IS)
  259. X
  260. X    # All is well.  Exit with zero status.
  261. X    exit(0)
  262. X
  263. Xend
  264. X
  265. X
  266. X#
  267. X# initialize_IS
  268. X#
  269. X# Sets up main parameters for the current index file, such as the
  270. X# field separator to be used in tokenizing the file, the string and
  271. X# bit lengths of bitmap fields, the number of fields, and the size of
  272. X# the actual bitmaps (in bytes) as written to disk (comes out to the
  273. X# smallest multiple of eight greater than the field length times the
  274. X# field number.  The marker length has to be set in the main
  275. X# procedure, so initialize_IS leaves it null for now.
  276. X#
  277. Xprocedure initialize_IS(a)
  278. X
  279. X    local usage, fname, opt_table
  280. X    # global IS
  281. X
  282. X    usage:="usage: makeind -f filename -m int -n int [-l int] [-s]"
  283. X
  284. X    IS := is()            # set up some IS fields
  285. X    opt_table := options(a, "f:m:n+sS:l+")
  286. X    3 <= *opt_table <= 6            | stop(usage)
  287. X    IS.no := \opt_table["n"]            | stop(usage)
  288. X    IS.FS := \opt_table["S"] | "['.]?[^-0-9A-Za-z']+'?"
  289. X    IS.is_case_sensitive := opt_table["s"]      # normally is &null
  290. X
  291. X    #
  292. X    # Calculate string representation length for fields, as well as
  293. X    # the number of bits required for their integer representation.
  294. X    # I.e. if the opt_table["m"] value is 99, this will take two chars to
  295. X    # represent as a string ("99"), but 7 binary "digits" to represent
  296. X    # internally as a base-two integer.
  297. X    #
  298. X    IS.s_len := *string(opt_table["m"])
  299. X    IS.len := *exbase10(opt_table["m"], 2)
  300. X
  301. X    return opt_table
  302. X
  303. Xend
  304. X
  305. X
  306. X#
  307. X# create_index
  308. X#
  309. X# Creates a table containing all tokens in the file fname, with the
  310. X# set of each token's locations recorded as values for those tokens.
  311. X# IS.FS is a nawk-style field separator regular expression.
  312. X# If &null, defaults to ~(&digits++&letters).  IS.s_len
  313. X# is the location marker string-representation field length.  Index_
  314. X# stats.len is the number of binary digits needed for an
  315. X# integer representation of a given field.  IS.no is
  316. X# the number of fields.
  317. X# 
  318. Xprocedure create_index(fname)
  319. X
  320. X    local intext, wordtbl, line, bitmap, token
  321. X
  322. X    intext := open(fname) |
  323. X    abort("create_index","can't open index file, "||fname, 9)
  324. X    wordtbl := table()
  325. X    # Dummy key to hold all bitmaps in the text.
  326. X    insert(wordtbl, "", set())
  327. X
  328. X    while line := read(intext) do {
  329. X    line ? {
  330. X        if ="::" then {
  331. X        bitmap := digits_2_bitmap(tab(0)) # in indexutl.icn
  332. X        # Insert every bitmap into the dummy entry for "".
  333. X        # This gives us quick access later on to every bitmap in
  334. X        # the text.
  335. X        insert(wordtbl[""], bitmap)
  336. X        } else {
  337. X        # gettokens() resides in a separate file, gettokens.icn
  338. X        every token := gettokens(IS.is_case_sensitive) do {
  339. X            /wordtbl[token] := set()
  340. X            insert(wordtbl[token], \bitmap) |
  341. X            abort("create_index","text before location-marker",8)
  342. X        }
  343. X        }
  344. X    }
  345. X    }
  346. X    \line | abort("create_index", "empty input file, "||fname, 8)
  347. X    close(intext)
  348. X    return wordtbl
  349. X
  350. Xend
  351. X
  352. X
  353. X#
  354. X# write_tokens_and_offsets
  355. X#
  356. X# Writes to one file a list of all tokens collected from the input
  357. X# file, one to a line, followed by a tab, and then a byte offset into
  358. X# another file where the bitmaps for that token are kept.
  359. X#
  360. X#     token tab offset
  361. X#
  362. X# A seek to "offset" in the bitmap file will put you at the start of a
  363. X# block of bitmaps.
  364. X#
  365. Xprocedure write_tokens_and_offsets(index_fname, bitmap_fname, t)
  366. X
  367. X    local outtokens, outbitmaps, index_lst, i, bitmap_length,
  368. X    how_many_bitmaps, bytes_needed, inverse_signal, inverse_set
  369. X
  370. X    outtokens := open(index_fname, "w") |
  371. X    abort("write_tokens_and_offsets","can't open "||index_fname,6)
  372. X    outbitmaps := open(bitmap_fname, "w") |
  373. X    abort("write_tokens_and_offsets","can't open "||bitmap_fname,5)
  374. X    # Calculate the length of bitmaps (must be the smallest multiple of
  375. X    # 8 >= (IS.len * IS.no)).
  376. X    bitmap_length := ((IS.len * IS.no) <= seq(0,8))
  377. X    index_lst := sort(t, 3)
  378. X    bits_needed := 24        # bytes needed to hold no of bitmaps for keys
  379. X    inverse_signal := 8388608    # 24th bit, which signals inverse storage
  380. X
  381. X    every i := 1 to *index_lst-1 by 2 do {
  382. X
  383. X    # Write token to index file with the offset of that token's
  384. X    # bitmaps in the bitmap file.
  385. X    write(outtokens, index_lst[i], "\t", where(outbitmaps))
  386. X
  387. X    # Now write the bitmaps for the above token to the bitmap file.
  388. X    # First write out the number of bitmaps in this block.  Two bytes
  389. X    # are allotted to hold this count (15 bits).  If the number of
  390. X    # bitmaps for the current token exceeds 3/5 of the total number
  391. X    # of bitmaps for the entire file, then add bits_needed-1 to the
  392. X    # number.  That is, set the highest bit to 1.
  393. X    how_many_bitmaps := *index_lst[i+1]
  394. X    if how_many_bitmaps > (inverse_signal-1) then {        # just in case
  395. X        abort("write_tokens_and_offsets",
  396. X          "too many bitmaps for"||index_lst[i], bits_needed)
  397. X    }
  398. X    # "" is a dummy key containing all the bitmaps in the text.
  399. X    # If the number of bitmaps for any key other than "" exceeds
  400. X    # 3/5 that of "", then store those bitmaps where the key does
  401. X    # NOT occur, rather than those where it does!  This is what
  402. X    # I've called the "inverse" storage method, and inverse_signal
  403. X    # provides the indicator that this method has been used.
  404. X    if index_lst[i] ~== "" &
  405. X        how_many_bitmaps >= integer(*t[""] * 0.60)
  406. X    then {
  407. X        inverse_set := (index_lst[2] -- index_lst[i+1])
  408. X        how_many_bitmaps :=    ior(*inverse_set, inverse_signal)
  409. X        write_int(outbitmaps, how_many_bitmaps, bits_needed)
  410. X        every write_int(outbitmaps, !inverse_set, bitmap_length)
  411. X    } else {
  412. X        # ...otherwise (if we have a reasonable number of keys), don't
  413. X        # bother inverting the sense of the stored bitmaps.
  414. X        write_int(outbitmaps, how_many_bitmaps, bits_needed)
  415. X        # Having written the bitmap count, now write the bitmaps proper
  416. X        # to the bitmap file.
  417. X        if index_lst[i] == ""
  418. X        then
  419. X          # Bitmaps for "" are guaranteed to be sorted.
  420. X          every write_int(outbitmaps, !sort(index_lst[i+1]), bitmap_length)
  421. X        else
  422. X          every write_int(outbitmaps, !index_lst[i+1], bitmap_length)
  423. X    }
  424. X    }
  425. X
  426. X    # Close files.  Return number of keys processed (any better ideas??)
  427. X    every close(outtokens | outbitmaps)
  428. X    return *index_lst / 2    # return number of keys in index file
  429. X
  430. Xend
  431. X
  432. X
  433. X
  434. X#
  435. X# store_bitmaps_and_offsets
  436. X#
  437. X# Runs through the file called fname, finding all the location
  438. X# markers, and recording the offset of the text they precede.  Writes
  439. X# bitmap : offset pairs to a .ofs file.  Note that the full bitmap is
  440. X# not stored.  Rather only the first upto_field fields are stored.
  441. X# Normally upto_field = IS.no - 1.
  442. X#
  443. Xprocedure store_bitmaps_and_offsets(fname, upto_field)
  444. X
  445. X    local intext, current_location, last_major_division,
  446. X    major_division, bitmap_offset_table
  447. X
  448. X    intext := open(fname) |
  449. X    abort("store_bitmaps_and_offsets","can't open "||fname,5)
  450. X    bitmap_offset_table := table()
  451. X
  452. X    while (current_location := where(intext), line := read(intext)) do {
  453. X    line ? {
  454. X        if ="::" then {
  455. X        major_division := 
  456. X            ishift(digits_2_bitmap(tab(0)), # in indexutl.icn
  457. X               -((IS.no - upto_field) * IS.len))
  458. X        if \last_major_division = major_division then
  459. X            next
  460. X        else {
  461. X            insert(
  462. X            bitmap_offset_table, major_division, current_location)
  463. X            last_major_division := major_division
  464. X        }        
  465. X        }
  466. X    }
  467. X    }
  468. X    
  469. X    return bitmap_offset_table
  470. X
  471. Xend
  472. X
  473. X
  474. X#
  475. X# write_bitmaps_and_offsets
  476. X#
  477. X# Does the actual writing of bitmaps and offsets to a file.  Receives
  478. X# a table of bitmaps cut down to upto_field fields.  Shinking the
  479. X# bitmaps lessens the size of the resulting file, but requires a bit
  480. X# more I/O when it comes time to look something up.
  481. X#
  482. Xprocedure write_bitmaps_and_offsets(bofname, t, upto_field)
  483. X
  484. X    local outtext, tmp_list, i, offset_length,
  485. X    block_size, stored_bitmap_length
  486. X
  487. X    outtext := open(bofname, "w") |
  488. X    abort("write_bitmaps_and_offsets","can't open "||bofname,5)
  489. X    stored_bitmap_length := ((IS.len * upto_field) <= seq(0,8))
  490. X    tmp_list := sort(t, 3)
  491. X
  492. X    every i := 1 to *tmp_list-1 by 2 do {
  493. X
  494. X    # Number of bits needed to hold offset.
  495. X    offset_length := (*exbase10(tmp_list[i+1], 2) <= seq(0,8))
  496. X    # Number of bytes needed to hold bitmap and offset (both).
  497. X    block_size := (stored_bitmap_length + offset_length) / 8
  498. X
  499. X    # We could just code the length of the offset, since the bitmap's
  500. X    # length is fixed (and known).  Seems better to code the block's
  501. X    # total length just in case something gets screwed up.  An 8-bit
  502. X    # limit means the bitmap+offset length cannot exceed 2^9-1 (255)
  503. X    # characters.
  504. X    if block_size > 255 then
  505. X        abort("write_bitmaps_and_offsets","bitmap+offset too big",15)
  506. X    write_int(outtext, block_size, 8)
  507. X    write_int(outtext, tmp_list[i], stored_bitmap_length)
  508. X    write_int(outtext, tmp_list[i+1], offset_length)
  509. X
  510. X    }
  511. X
  512. X    return
  513. X
  514. Xend
  515. X
  516. X
  517. X#
  518. X# write_limits
  519. X#
  520. X# Writes out the bitmaps that will be needed in order for expandrf()
  521. X# to be able to know when the rollover field rolls over.
  522. X#
  523. Xprocedure  write_limits(out_fname, in_fname, r_field)
  524. X
  525. X    local in, out, shift_bits_out, bitmap_length, bitmaps_read,
  526. X     line, bitmap, short_bitmap, old_bitmap
  527. X
  528. X    in := open(in_fname) |
  529. X    abort("write_limits","can't open "||in_fname,5)
  530. X    out := open(out_fname, "w") |
  531. X    abort("write_limits","can't open "||out_fname,5)
  532. X    r_field <= IS.no |
  533. X    abort("write_limits","-l value should not exceed that of -n",50)
  534. X    shift_bits_out := -(((IS.no-r_field)+ 1) * IS.len)
  535. X    bitmap_length := ((IS.len * IS.no) <= seq(0,8))
  536. X    bitmaps_read := 0
  537. X
  538. X    while line := read(in) do {
  539. X    line ? {
  540. X        if ="::" then {
  541. X        bitmaps_read +:= 1
  542. X        bitmap := digits_2_bitmap(tab(0)) # in indexutl.icn
  543. X        short_bitmap := ishift(bitmap, shift_bits_out)
  544. X        if ishift(\old_bitmap, shift_bits_out) ~== short_bitmap
  545. X        then write_int(out, old_bitmap, bitmap_length)
  546. X        old_bitmap := bitmap
  547. X        }
  548. X    }
  549. X    }
  550. X
  551. X    write_int(out, \old_bitmap, bitmap_length)
  552. X    every close(in | out)
  553. X    return bitmaps_read
  554. X            
  555. Xend
  556. SHAR_EOF
  557. true || echo 'restore of makeind.icn failed'
  558. rm -f _shar_wnt_.tmp
  559. fi
  560. # ============= gettokens.icn ==============
  561. if test -f 'gettokens.icn' -a X"$1" != X"-c"; then
  562.     echo 'x - skipping gettokens.icn (File already exists)'
  563.     rm -f _shar_wnt_.tmp
  564. else
  565. > _shar_wnt_.tmp
  566. echo 'x - extracting gettokens.icn (Text)'
  567. sed 's/^X//' << 'SHAR_EOF' > 'gettokens.icn' &&
  568. X############################################################################
  569. X#
  570. X#    Name:     gettokens.icn
  571. X#
  572. X#    Title:     get tokens from text-base file
  573. X#
  574. X#    Author:     Richard L. Goerwitz
  575. X#
  576. X#    Version: 1.2
  577. X#
  578. X############################################################################
  579. X#
  580. X#  Tokenizing routine used by makeind.icn to create index.
  581. X#
  582. X############################################################################
  583. X#
  584. X#  See also: ./makeind.icn
  585. X#
  586. X#############################################################################
  587. X
  588. X# declared in ./indexutl.icn (q.v.)
  589. X# global IS
  590. X#
  591. X# One idea for gettokens, good for small indices.  Uses field separator
  592. X# (IS.FS).  Also uses (slow) findre.  Farther below is a less flexible
  593. X# version of gettokens which runs faster.
  594. X#
  595. X#procedure gettokens(is_case_sensitive)
  596. X#
  597. X#    # Used within a scanning expression.  Returns tokens in
  598. X#    # &subject[&pos:0] (&pos normally = 1).  Tokens are stretches of
  599. X#    # text separated by the IS.FS field separator.  This
  600. X#    # field separator is a nawk style FS regular expression.  If null,
  601. X#    # it gets defined as ~(&digits++&letters).
  602. X#
  603. X#    local token
  604. X#    static non_alphanums
  605. X#    initial non_alphanums := ~(&digits ++ &letters ++ '-')
  606. X#
  607. X#    /IS.FS := non_alphanums
  608. X#    
  609. X#    while token := tab(findre(IS.FS)) do {
  610. X#    tab(__endpoint)
  611. X#    tab(many('\''))        # unfortunate by-product of findre's weakness
  612. X#    if \is_case_sensitive
  613. X#    then suspend "" ~== trim(token,'\t ')
  614. X#    else suspend map("" ~== trim(token,'\t '))
  615. X#    }
  616. X#
  617. X#    # Return the rest of &subject.  Even though we're not tabbing
  618. X#    # upto FS, this is normally what the user intends.
  619. X#    if \is_case_sensitive
  620. X#    then return "" ~== trim(tab(0),'\t ')
  621. X#    else return map("" ~== trim(tab(0),'\t '))
  622. X#
  623. X#end
  624. X
  625. Xprocedure gettokens(is_case_sensitive)
  626. X
  627. X    # Used within a scanning expression.  Returns tokens in
  628. X    # &subject[&pos:0] (&pos normally = 1).  Tokens are stretches of
  629. X    # text separated by an optional apostrophe or dash, then any
  630. X    # stretch of non-alphanumeric characters, then an optional apos-
  631. X    # trophe.
  632. X
  633. X    local token
  634. X    static alphanums, wordchars
  635. X    initial {
  636. X    alphanums := &digits ++ &letters ++ '-'
  637. X    wordchars := alphanums ++ '\''
  638. X    }
  639. X
  640. X    tab(upto(alphanums))
  641. X    while token := tab(many(wordchars)) do {
  642. X    if \is_case_sensitive
  643. X    then suspend "" ~== trim(token,'\t \'-')
  644. X    else suspend map("" ~== trim(token,'\t \'-'))
  645. X    tab(upto(alphanums))
  646. X    }
  647. X
  648. Xend
  649. SHAR_EOF
  650. true || echo 'restore of gettokens.icn failed'
  651. rm -f _shar_wnt_.tmp
  652. fi
  653. # ============= Makefile.dist ==============
  654. if test -f 'Makefile.dist' -a X"$1" != X"-c"; then
  655.     echo 'x - skipping Makefile.dist (File already exists)'
  656.     rm -f _shar_wnt_.tmp
  657. else
  658. > _shar_wnt_.tmp
  659. echo 'x - extracting Makefile.dist (Text)'
  660. sed 's/^X//' << 'SHAR_EOF' > 'Makefile.dist' &&
  661. X##########################################################################
  662. X#
  663. X#  Makefile.dist for bibleref.
  664. X#
  665. X##########################################################################
  666. X#
  667. X#  User-modifiable section.  Read carefully!  You will almost
  668. X#  certainly have to change some settings here.
  669. X#
  670. X
  671. X#
  672. X# Destination directory for binaries; library directory for auxiliary
  673. X# files.  Owner and group for public executables.  Leave the trailing
  674. X# slash off of directory names.
  675. X#
  676. XDESTDIR = /usr/local/bin
  677. X# DESTDIR = $(HOME)/bin
  678. XLIBDIR = /usr/local/lib/$(PROGNAME)
  679. X# LIBDIR = $(HOME)/$(PROGNAME)
  680. X# LIBDIR = /usr/local/share/lib/$(PROGNAME)
  681. XOWNER = root #bin
  682. XGROUP = root #bin
  683. X
  684. X#
  685. X# Name of your icon compiler and compiler flags.
  686. X#
  687. XICONC = /usr/icon/v8/bin/icont
  688. XIFLAGS = -Sc 200 -Sg 400 -Si 2000 -Sn 3000 -SF 30
  689. X
  690. X#
  691. X# Names of KJV files as packaged in the PC-SIG disk set (19 discs).
  692. X# Mine were snarfed from helens.stanford.edu (36.0.2.99) as kjv.tar.Z.
  693. X# You will need to link these to the current directory.  Please don't
  694. X# copy them all over, or if you do, be sure to delete them afterwards.
  695. X# They aren't needed after you are done indexing.
  696. X#
  697. XRAWFILES = gen.txt exo.txt lev.txt num.txt deu.txt jos.txt jdg.txt \
  698. X    rth.txt sa1.txt sa2.txt ki1.txt ki2.txt ch1.txt ch2.txt \
  699. X    ezr.txt neh.txt est.txt job.txt psa.txt pro.txt ecc.txt \
  700. X    son.txt isa.txt jer.txt lam.txt eze.txt dan.txt hos.txt \
  701. X    joe.txt amo.txt oba.txt jon.txt mic.txt nah.txt hab.txt \
  702. X    zep.txt hag.txt zec.txt mal.txt mat.txt mar.txt luk.txt \
  703. X    joh.txt act.txt rom.txt co1.txt co2.txt gal.txt eph.txt \
  704. X    phi.txt col.txt th1.txt th2.txt ti1.txt ti2.txt tit.txt \
  705. X    phm.txt heb.txt jam.txt pe1.txt pe2.txt jo1.txt jo2.txt \
  706. X    jo3.txt jud.txt rev.txt
  707. X#
  708. X# If you have your KJV in a single file, that's fine.  Just be sure
  709. X# the books are in their correct order (as above), and are in the PC-SIG
  710. X# disk-set format.
  711. X# RAWFILES = ./kjv.Z
  712. X
  713. X#
  714. X# If you've compressed your KJV file(s), use zcat; otherwise use cat.
  715. X#
  716. XCAT = cat
  717. X# CAT = zcat
  718. X
  719. X#
  720. X# Change these only if you're pretty sure of what you're doing.
  721. X#
  722. XSHELL = /bin/sh
  723. XMAKE = make
  724. X
  725. X
  726. X###########################################################################
  727. X#
  728. X#  Don't change anything below this line.
  729. X#
  730. X
  731. XRTVFILE = kjv.rtv
  732. X
  733. XCONVERTER = kjv2rtv
  734. XCONVERTSRC = $(CONVERTER).icn convertr.icn name2num.icn complete.icn
  735. X
  736. XINDEXER = makeind
  737. XINDEXSRC = $(INDEXER).icn gettokens.icn indexutl.icn
  738. X
  739. XDUMMY_FILE = index.done
  740. XPROGNAME = bibleref
  741. X
  742. XSEARCHSRC = $(PROGNAME).icn ref2bmap.icn name2num.icn convertb.icn \
  743. X    listutil.icn passutil.icn readfile.icn srchutil.icn complete.icn \
  744. X    ipause.icn rewrap.icn binsrch.icn bmp2text.icn initfile.icn \
  745. X    retrieve.icn indexutl.icn retrops.icn whatnext.icn iolib.icn \
  746. X    iscreen.icn findre.icn version.icn
  747. X
  748. Xall: $(DUMMY_FILE) $(PROGNAME)
  749. X
  750. X$(DUMMY_FILE):
  751. X    @echo ""
  752. X    @echo "This may take a while (about 1 minute/MB on a Sun4)."
  753. X    @echo ""
  754. X    @sleep 2
  755. X    $(ICONC) $(IFLAGS) -o $(CONVERTER) $(CONVERTSRC)
  756. X    $(CAT) $(RAWFILES) | $(CONVERTER) > $(RTVFILE)
  757. X    @echo ""
  758. X    @echo "This may take a long time (c. 20 min./MB on a Sun4)."
  759. X    @echo "Kids, don't even *think* of trying this at home."
  760. X    @echo ""
  761. X    @sleep 2
  762. X    $(ICONC) $(IFLAGS) -o $(INDEXER) $(INDEXSRC)
  763. X    $(INDEXER) -f $(RTVFILE) -m 200 -n 3 -l 3
  764. X    touch $(DUMMY_FILE)
  765. X
  766. X$(PROGNAME): $(SEARCHSRC)
  767. X    $(ICONC) $(IFLAGS) -o $(PROGNAME) $(SEARCHSRC)
  768. X
  769. X$(PROGNAME).icn: $(PROGNAME).src
  770. X    sed "s|/usr/local/lib/bibleref/kjv.rtv|$(LIBDIR)/$(RTVFILE)|" $(PROGNAME).src > $(PROGNAME).icn
  771. X
  772. X$(CONVERTER): $(CONVERTSRC)
  773. X    $(ICONC) $(IFLAGS) -o $(CONVERTER) $(CONVERTSRC)
  774. X
  775. X$(INDEXER): $(INDEXSRC)
  776. X    $(ICONC) $(IFLAGS) -o $(INDEXER) $(INDEXSRC)
  777. X
  778. X
  779. X##########################################################################
  780. X#
  781. X#  Pseudo-target names (install, clean, clobber)
  782. X#
  783. X#
  784. X
  785. X# Pessimistic assumptions regarding the environment (in particular,
  786. X# I don't assume you have the BSD "install" shell script).
  787. Xinstall: all
  788. X    -test -d $(DESTDIR) || mkdir $(DESTDIR) && chmod 755 $(DESTDIR)
  789. X    cp $(PROGNAME) $(DESTDIR)/$(PROGNAME)
  790. X    chgrp $(GROUP) $(DESTDIR)/$(PROGNAME)
  791. X    chown $(OWNER) $(DESTDIR)/$(PROGNAME)
  792. X    -test -d $(LIBDIR) || mkdir $(LIBDIR) && chmod 755 $(LIBDIR)
  793. X    mv xxx* $(RTVFILE) $(LIBDIR)/
  794. X    chgrp $(GROUP) $(LIBDIR)
  795. X    chown $(OWNER) $(LIBDIR)
  796. X    chgrp $(GROUP) $(LIBDIR)/xxx* $(LIBDIR)/$(RTVFILE)
  797. X    chown $(OWNER) $(LIBDIR)/xxx* $(LIBDIR)/$(RTVFILE)
  798. X    @echo ""
  799. X    @echo "Done."
  800. X    @echo ""
  801. X
  802. X#
  803. X# For storing the pre-indexed files.  All that needs to be done here
  804. X# is to unpack the archive on another machine, and make $(PROGNAME).
  805. X#
  806. X#tar: all
  807. X#    tar -cf ./$(PROGNAME).tar $(PROGNAME).src $(DUMMY_FILE) $(AUXILSRC) \
  808. X#        Makefile.dist README
  809. X
  810. X#
  811. X# Cleanup
  812. X#
  813. Xclean:
  814. X    rm -f $(CONVERTER) $(INDEXER) $(PROGNAME)
  815. X
  816. X# Be careful; use this target, and you'll be back to square one.
  817. Xclobber: clean
  818. X    @echo "Okay, you asked for it."
  819. X    rm -f $(RAWFILES) xxx*.??? $(RTVFILE) $(DUMMY_FILE) $(PROGNAME).icn
  820. SHAR_EOF
  821. true || echo 'restore of Makefile.dist failed'
  822. rm -f _shar_wnt_.tmp
  823. fi
  824. # ============= README ==============
  825. if test -f 'README' -a X"$1" != X"-c"; then
  826.     echo 'x - skipping README (File already exists)'
  827.     rm -f _shar_wnt_.tmp
  828. else
  829. > _shar_wnt_.tmp
  830. echo 'x - extracting README (Text)'
  831. sed 's/^X//' << 'SHAR_EOF' > 'README' &&
  832. X--------
  833. X
  834. X
  835. XProgram:  Bibleref
  836. XLanguage: Icon
  837. XPurpose:  Perform word and passage-based retrievals on the King
  838. X      James Bible
  839. X
  840. XFiles: bibleref.src convertb.icn convertr.icn listutil.icn
  841. X       name2num.icn passutil.icn readfile.icn ref2bmap.icn
  842. X       srchutil.icn
  843. X
  844. X
  845. X--------
  846. X
  847. X
  848. XOverview:
  849. X
  850. X    This package, Bibleref, offers simple tools for word and
  851. Xpassage-based access to the King James Bible on UNIX platforms.
  852. XBibleref is fast, and easy to install (assuming you possess a suitable
  853. XKing James Bible text and a sufficiently powerful machine).  It will
  854. Xalso run with stock terminals - even nasty old ones that leave magic
  855. Xcookies on your screen.  Bibleref will, however, put a significant
  856. Xdent in your mass storage resources.  Along with the 4-5 megabytes of
  857. XKing James Bible text, you'll need to house some 2 megabytes of
  858. Xindices, and also the 150k icode file (more if you compile, rather
  859. Xthan interpret).  In-core requirements start at about 800k, and go up
  860. Xfrom there (if your searches are complex enough, you could easily eat
  861. Xup two or three megabytes).  In brief: Bibleref has a large appetite
  862. Xfor memory.  Once set up, though, it can operate with fairly minimal
  863. Ximpact on the CPU.
  864. X    With Bibleref, you can perform most of the more basic,
  865. Xlow-level functions commercial Bible browsing packages offer (and
  866. Xperhaps a few not found in some of the commercial packages).  You can,
  867. Xfor example,
  868. X
  869. X    -  retrieve any passage in the Bible instantaneously
  870. X    -  move forward or backward relative to the retrieved passage
  871. X    -  search the entire Bible for words and/or word-patterns
  872. X    -  search for word co-occurrences (or the absence thereof)
  873. X    -  save passages and/or passage-lists for use with an editor
  874. X
  875. XAlthough this program is hardly the product of any major research
  876. Xeffort :-), it should prove sophisticated enough for quick lookup of
  877. Xpassages whose precise location you have forgotten, for research on
  878. Xsermons and Bible study classes, and for general topical perusal of
  879. Xthe biblical text.
  880. X
  881. X
  882. X--------
  883. X
  884. X
  885. XInstallation:
  886. X
  887. X    To install Bibleref, you'll need to get a hold of the King
  888. XJames Bible text as packaged in the PC-SIG disk set (19 disks), which
  889. Xis available from wsmr-simtel20.army.mil.  I happen to have gotten my
  890. Xtexts (very similar to the PC-SIG version) from helens.stanford.edu
  891. X(36.0.2.99; kjv.tar.Z).  These ones work as well.  There are a number
  892. Xof KJV texts floating around which are derivative of the PC-SIG disk
  893. Xset.  Only ones which have not been edited too severely will work,
  894. Xunmodified, with the stock Bibleref installation program.
  895. X    Once you've gotten a hold of the PC-SIG King James Bible text,
  896. Xlocate the Makefile.dist file included with this package and read it.
  897. XCopy it to "Makefile."  If you find you must modify any of the
  898. Xuser-configurable sections, then edit it as you see fit.  Pay special
  899. Xattention to the DESTDIR and LIBDIR targets.  Also, be sure to change
  900. XUSER and GROUP targets to an appropriate value for your machine (in
  901. Xmost cases root or bin; if the executables will be private, then use
  902. Xyour login ID and default group ID).  Finally, check to be certain
  903. Xthat the correct names are used for your raw King James Bible file(s),
  904. Xand that the target CAT is set to either "cat" or "zcat," depending on
  905. Xwhether you have compressed the raw files or not.
  906. X    Assuming you've modified the Makefile correctly, you can then
  907. Xsimply type "make."  After this, you might as well go off and have
  908. Xdinner or something.  Better yet, go to bed.  The entire reformatting,
  909. Xcollating, and indexing process takes as many as a three or four hours
  910. Xon a medium-range workstation.  Don't even *think* of indexing on a
  911. Xsystem with less than 8 meg of core memory and a lot of swap space.
  912. XThe main setup program may, for a brief while, swallow up as much as
  913. X16 megabytes of your precious RAM.  If you are really savvy about Icon
  914. Xstorage management, you can try setting your regions to have larger
  915. Xvalues than the defaults.  This won't cause the indexing program to
  916. Xtake up any less RAM.  It may, however, decrease the amount of time it
  917. Xtakes to index.
  918. X    Once you've gotten past the indexing "hump" (which I might
  919. Xre-code in C some time, if I have an open week), you are free to
  920. Xinstall.  Su root first, if you plan on making the executables public,
  921. Xthen "make install."
  922. X    Please note that Bibleref assumes the existence on your
  923. Xsystem, not only of Icon interpreter or compiler, but also of an
  924. Xup-to-date Icon Program Library.  There are several routines included
  925. Xin the IPL which Bibleref uses.
  926. SHAR_EOF
  927. true || echo 'restore of README failed'
  928. fi
  929. echo 'End of  part 6'
  930. echo 'File README is continued in part 7'
  931. echo 7 > _shar_seq_.tmp
  932. exit 0
  933.  
  934. exit 0 # Just in case...
  935. -- 
  936. Kent Landfield                   INTERNET: kent@sparky.IMD.Sterling.COM
  937. Sterling Software, IMD           UUCP:     uunet!sparky!kent
  938. Phone:    (402) 291-8300         FAX:      (402) 291-4362
  939. Please send comp.sources.misc-related mail to kent@uunet.uu.net.
  940.