Documentation Source Text

Hex Artifact Content
Login

Artifact 40823c296ecee01dad7f30afcc15b5da4d4cc022:


0000: 23 21 2f 75 73 72 2f 62 69 6e 2f 74 63 6c 73 68  #!/usr/bin/tclsh
0010: 0a 23 0a 23 20 54 68 69 73 20 73 63 72 69 70 74  .#.# This script
0020: 20 70 72 6f 63 65 73 73 65 73 20 72 61 77 20 64   processes raw d
0030: 6f 63 75 6d 65 6e 74 61 74 69 6f 6e 20 73 6f 75  ocumentation sou
0040: 72 63 65 20 74 65 78 74 20 69 6e 74 6f 20 69 74  rce text into it
0050: 73 20 66 69 6e 61 6c 20 66 6f 72 6d 20 0a 23 20  s final form .# 
0060: 66 6f 72 20 64 69 73 70 6c 61 79 2e 20 20 54 68  for display.  Th
0070: 65 20 70 72 6f 63 65 73 73 69 6e 67 20 61 63 74  e processing act
0080: 69 6f 6e 73 20 61 72 65 20 64 65 73 63 72 69 62  ions are describ
0090: 65 64 20 62 65 6c 6f 77 2e 0a 23 0a 23 20 49 6e  ed below..#.# In
00a0: 76 6f 6b 65 20 74 68 69 73 20 63 6f 6d 6d 61 6e  voke this comman
00b0: 64 20 61 73 20 66 6f 6c 6c 6f 77 73 3a 0a 23 0a  d as follows:.#.
00c0: 23 20 20 20 20 20 20 20 74 63 6c 73 68 20 77 72  #       tclsh wr
00d0: 61 70 2e 74 63 6c 20 24 28 44 4f 43 29 20 24 28  ap.tcl $(DOC) $(
00e0: 53 52 43 29 20 24 28 44 45 53 54 29 20 73 6f 75  SRC) $(DEST) sou
00f0: 72 63 65 31 2e 69 6e 20 73 6f 75 72 63 65 32 2e  rce1.in source2.
0100: 69 6e 20 2e 2e 2e 0a 23 0a 23 20 54 68 65 20 24  in ....#.# The $
0110: 28 44 4f 43 29 20 61 6e 64 20 24 28 53 52 43 29  (DOC) and $(SRC)
0120: 20 76 61 6c 75 65 73 20 61 72 65 20 74 68 65 20   values are the 
0130: 6e 61 6d 65 73 20 6f 66 20 64 69 72 65 63 74 6f  names of directo
0140: 72 69 65 73 20 63 6f 6e 74 61 69 6e 69 6e 67 0a  ries containing.
0150: 23 20 74 68 65 20 64 6f 63 75 6d 65 6e 74 61 74  # the documentat
0160: 69 6f 6e 20 73 6f 75 72 63 65 20 61 6e 64 20 70  ion source and p
0170: 72 6f 67 72 61 6d 20 73 6f 75 72 63 65 2e 20 20  rogram source.  
0180: 24 28 44 45 53 54 29 20 69 73 20 74 68 65 20 6e  $(DEST) is the n
0190: 61 6d 65 20 6f 66 0a 23 20 6f 66 20 74 68 65 20  ame of.# of the 
01a0: 64 69 72 65 63 74 6f 72 79 20 77 68 65 72 65 20  directory where 
01b0: 67 65 6e 65 72 61 74 65 64 20 48 54 4d 4c 20 69  generated HTML i
01c0: 73 20 77 72 69 74 74 65 6e 2e 20 20 73 6f 75 72  s written.  sour
01d0: 63 65 4e 2e 69 6e 20 69 73 20 74 68 65 0a 23 20  ceN.in is the.# 
01e0: 69 6e 70 75 74 20 66 69 6c 65 20 74 6f 20 62 65  input file to be
01f0: 20 70 72 6f 63 65 73 73 65 64 2e 20 20 54 68 65   processed.  The
0200: 20 6f 75 74 70 75 74 20 69 73 20 73 6f 75 72 63   output is sourc
0210: 65 4e 2e 68 74 6d 6c 20 69 6e 20 74 68 65 0a 23  eN.html in the.#
0220: 20 24 28 44 45 53 54 29 20 64 69 72 65 63 74 6f   $(DEST) directo
0230: 72 79 2e 0a 23 0a 23 20 43 68 61 6e 67 65 73 20  ry..#.# Changes 
0240: 6d 61 64 65 20 74 6f 20 74 68 65 20 73 6f 75 72  made to the sour
0250: 63 65 20 66 69 6c 65 73 3a 0a 23 0a 23 20 20 20  ce files:.#.#   
0260: 20 20 2a 20 20 41 6e 20 61 70 70 72 6f 70 72 69    *  An appropri
0270: 61 74 65 20 68 65 61 64 65 72 20 28 63 6f 6e 74  ate header (cont
0280: 61 69 6e 69 6e 67 20 74 68 65 20 53 51 4c 69 74  aining the SQLit
0290: 65 20 6c 6f 67 6f 20 61 6e 64 20 73 74 61 6e 64  e logo and stand
02a0: 61 72 64 0a 23 20 20 20 20 20 20 20 20 6d 65 6e  ard.#        men
02b0: 75 20 62 61 72 29 20 69 73 20 70 72 65 70 65 6e  u bar) is prepen
02c0: 64 65 64 20 74 6f 20 74 68 65 20 66 69 6c 65 2e  ded to the file.
02d0: 20 20 0a 23 0a 23 20 20 20 20 20 2a 20 20 41 6e    .#.#     *  An
02e0: 79 20 3c 74 69 74 6c 65 3e 2e 2e 2e 3c 2f 74 69  y <title>...</ti
02f0: 74 6c 65 3e 20 69 6e 20 74 68 65 20 69 6e 70 75  tle> in the inpu
0300: 74 20 69 73 20 6d 6f 76 65 64 20 69 6e 74 6f 20  t is moved into 
0310: 74 68 65 20 70 72 65 70 65 6e 64 65 64 0a 23 20  the prepended.# 
0320: 20 20 20 20 20 20 20 68 65 61 64 65 72 2e 0a 23         header..#
0330: 0a 23 20 20 20 20 20 2a 20 20 41 6e 20 61 70 70  .#     *  An app
0340: 72 6f 70 72 69 61 74 65 20 66 6f 6f 74 65 72 20  ropriate footer 
0350: 69 73 20 61 70 70 65 6e 64 65 64 2e 0a 23 0a 23  is appended..#.#
0360: 20 20 20 20 20 2a 20 20 53 63 72 69 70 74 73 20       *  Scripts 
0370: 77 69 74 68 69 6e 20 3c 74 63 6c 3e 2e 2e 2e 3c  within <tcl>...<
0380: 2f 74 63 6c 3e 20 61 72 65 20 65 76 61 6c 75 61  /tcl> are evalua
0390: 74 65 64 2e 20 20 4f 75 74 70 75 74 20 74 68 61  ted.  Output tha
03a0: 74 0a 23 20 20 20 20 20 20 20 20 69 73 20 65 6d  t.#        is em
03b0: 69 74 74 65 64 20 66 72 6f 6d 20 74 68 65 73 65  itted from these
03c0: 20 73 63 72 69 70 74 73 20 62 79 20 22 68 64 5f   scripts by "hd_
03d0: 70 75 74 73 22 20 6f 72 20 22 68 64 5f 72 65 73  puts" or "hd_res
03e0: 6f 6c 76 65 22 0a 23 20 20 20 20 20 20 20 20 70  olve".#        p
03f0: 72 6f 63 65 64 75 72 65 73 20 61 70 70 65 61 72  rocedures appear
0400: 73 20 69 6e 20 70 6c 61 63 65 20 6f 66 20 74 68  s in place of th
0410: 65 20 6f 72 69 67 69 6e 61 6c 20 73 63 72 69 70  e original scrip
0420: 74 2e 0a 23 0a 23 20 20 20 20 20 2a 20 20 48 79  t..#.#     *  Hy
0430: 70 65 72 6c 69 6e 6b 73 20 77 69 74 68 69 6e 20  perlinks within 
0440: 5b 2e 2e 2e 5d 20 61 72 65 20 72 65 73 6f 6c 76  [...] are resolv
0450: 65 64 2e 0a 23 0a 23 20 41 20 74 77 6f 2d 70 61  ed..#.# A two-pa
0460: 73 73 20 61 6c 67 6f 72 69 74 68 6d 20 69 73 20  ss algorithm is 
0470: 75 73 65 64 2e 20 20 54 68 65 20 66 69 72 73 74  used.  The first
0480: 20 70 61 73 73 20 63 6f 6c 6c 65 63 74 73 20 74   pass collects t
0490: 68 65 20 6e 61 6d 65 73 20 6f 66 0a 23 20 68 79  he names of.# hy
04a0: 70 65 72 6c 69 6e 6b 20 74 61 72 67 65 74 73 2c  perlink targets,
04b0: 20 72 65 71 75 69 72 65 6d 65 6e 74 73 20 74 65   requirements te
04c0: 78 74 2c 20 61 6e 64 20 6f 74 68 65 72 20 67 6c  xt, and other gl
04d0: 6f 62 61 6c 20 69 6e 66 6f 72 6d 61 74 69 6f 6e  obal information
04e0: 2e 0a 23 20 54 68 65 20 73 65 63 6f 6e 64 20 70  ..# The second p
04f0: 61 73 73 20 75 73 65 73 20 74 68 65 20 64 61 74  ass uses the dat
0500: 61 20 67 61 74 68 65 72 65 64 20 6f 6e 20 74 68  a gathered on th
0510: 65 20 66 69 72 73 74 20 70 61 73 73 20 74 6f 20  e first pass to 
0520: 67 65 6e 65 72 61 74 65 0a 23 20 74 68 65 20 66  generate.# the f
0530: 69 6e 61 6c 20 6f 75 74 70 75 74 2e 0a 23 0a 73  inal output..#.s
0540: 65 74 20 44 4f 43 20 5b 6c 69 6e 64 65 78 20 24  et DOC [lindex $
0550: 61 72 67 76 20 30 5d 0a 73 65 74 20 53 52 43 20  argv 0].set SRC 
0560: 5b 6c 69 6e 64 65 78 20 24 61 72 67 76 20 31 5d  [lindex $argv 1]
0570: 0a 73 65 74 20 44 45 53 54 20 5b 6c 69 6e 64 65  .set DEST [linde
0580: 78 20 24 61 72 67 76 20 32 5d 0a 73 65 74 20 48  x $argv 2].set H
0590: 4f 4d 45 44 49 52 20 5b 70 77 64 5d 20 20 20 20  OMEDIR [pwd]    
05a0: 20 20 20 20 20 20 20 20 3b 23 20 41 6c 73 6f 20          ;# Also 
05b0: 72 65 6d 65 6d 62 65 72 20 6f 75 72 20 68 6f 6d  remember our hom
05c0: 65 20 64 69 72 65 63 74 6f 72 79 2e 0a 0a 73 6f  e directory...so
05d0: 75 72 63 65 20 5b 66 69 6c 65 20 64 69 72 6e 61  urce [file dirna
05e0: 6d 65 20 5b 69 6e 66 6f 20 73 63 72 69 70 74 5d  me [info script]
05f0: 5d 2f 70 61 67 65 73 2f 66 61 6e 63 79 66 6f 72  ]/pages/fancyfor
0600: 6d 61 74 2e 74 63 6c 0a 73 6f 75 72 63 65 20 5b  mat.tcl.source [
0610: 66 69 6c 65 20 64 69 72 6e 61 6d 65 20 5b 69 6e  file dirname [in
0620: 66 6f 20 73 63 72 69 70 74 5d 5d 2f 64 6f 63 75  fo script]]/docu
0630: 6d 65 6e 74 5f 68 65 61 64 65 72 2e 74 63 6c 0a  ment_header.tcl.
0640: 73 6f 75 72 63 65 20 5b 66 69 6c 65 20 64 69 72  source [file dir
0650: 6e 61 6d 65 20 5b 69 6e 66 6f 20 73 63 72 69 70  name [info scrip
0660: 74 5d 5d 2f 63 6f 6d 6d 6f 6e 5f 6c 69 6e 6b 73  t]]/common_links
0670: 2e 74 63 6c 0a 0a 23 20 4f 70 65 6e 20 74 68 65  .tcl..# Open the
0680: 20 53 51 4c 69 74 65 20 64 61 74 61 62 61 73 65   SQLite database
0690: 2e 0a 23 0a 73 71 6c 69 74 65 33 20 64 62 20 64  ..#.sqlite3 db d
06a0: 6f 63 69 6e 66 6f 2e 64 62 0a 64 62 20 65 76 61  ocinfo.db.db eva
06b0: 6c 20 7b 0a 20 20 41 54 54 41 43 48 20 27 68 69  l {.  ATTACH 'hi
06c0: 73 74 6f 72 79 2e 64 62 27 20 41 53 20 68 69 73  story.db' AS his
06d0: 74 6f 72 79 3b 0a 20 20 42 45 47 49 4e 3b 0a 20  tory;.  BEGIN;. 
06e0: 20 44 45 4c 45 54 45 20 46 52 4f 4d 20 6c 69 6e   DELETE FROM lin
06f0: 6b 3b 0a 20 20 44 45 4c 45 54 45 20 46 52 4f 4d  k;.  DELETE FROM
0700: 20 6b 65 79 77 6f 72 64 3b 0a 20 20 44 45 4c 45   keyword;.  DELE
0710: 54 45 20 46 52 4f 4d 20 66 72 61 67 6d 65 6e 74  TE FROM fragment
0720: 3b 0a 20 20 44 45 4c 45 54 45 20 46 52 4f 4d 20  ;.  DELETE FROM 
0730: 70 61 67 65 3b 0a 20 20 44 52 4f 50 20 54 41 42  page;.  DROP TAB
0740: 4c 45 20 49 46 20 45 58 49 53 54 53 20 65 78 70  LE IF EXISTS exp
0750: 61 67 65 3b 0a 7d 0a 0a 23 20 4c 6f 61 64 20 74  age;.}..# Load t
0760: 68 65 20 73 79 6e 74 61 78 20 64 69 61 67 72 61  he syntax diagra
0770: 6d 20 6c 69 6e 6b 61 67 65 20 64 61 74 61 0a 23  m linkage data.#
0780: 0a 73 6f 75 72 63 65 20 24 44 4f 43 2f 61 72 74  .source $DOC/art
0790: 2f 73 79 6e 74 61 78 2f 73 79 6e 74 61 78 5f 6c  /syntax/syntax_l
07a0: 69 6e 6b 61 67 65 2e 74 63 6c 0a 0a 23 20 55 74  inkage.tcl..# Ut
07b0: 69 6c 69 74 79 20 70 72 6f 63 20 74 68 61 74 20  ility proc that 
07c0: 72 65 6d 6f 76 65 73 20 65 78 63 65 73 73 20 6c  removes excess l
07d0: 65 61 64 69 6e 67 20 77 68 69 74 65 73 70 61 63  eading whitespac
07e0: 65 2e 0a 23 0a 70 72 6f 63 20 68 64 5f 74 72 69  e..#.proc hd_tri
07f0: 6d 20 7b 74 78 74 7d 20 7b 0a 20 20 72 65 67 73  m {txt} {.  regs
0800: 75 62 20 2d 61 6c 6c 20 7b 5c 6e 5c 73 2b 7d 20  ub -all {\n\s+} 
0810: 24 74 78 74 20 22 5c 6e 22 20 74 78 74 0a 20 20  $txt "\n" txt.  
0820: 72 65 67 73 75 62 20 2d 61 6c 6c 20 7b 5c 73 2b  regsub -all {\s+
0830: 5c 6e 7d 20 24 74 78 74 20 22 5c 6e 22 20 74 78  \n} $txt "\n" tx
0840: 74 0a 20 20 72 65 74 75 72 6e 20 5b 73 74 72 69  t.  return [stri
0850: 6e 67 20 74 72 69 6d 20 24 74 78 74 5d 0a 7d 0a  ng trim $txt].}.
0860: 0a 23 20 54 68 69 73 20 69 73 20 74 68 65 20 66  .# This is the f
0870: 69 72 73 74 2d 70 61 73 73 20 69 6d 70 6c 65 6d  irst-pass implem
0880: 65 6e 74 61 74 69 6f 6e 20 6f 66 20 70 72 6f 63  entation of proc
0890: 65 64 75 72 65 20 74 68 61 74 20 72 65 6e 64 65  edure that rende
08a0: 72 73 0a 23 20 68 79 70 65 72 6c 69 6e 6b 73 2e  rs.# hyperlinks.
08b0: 20 20 44 6f 20 6e 6f 74 20 65 76 65 6e 20 62 6f    Do not even bo
08c0: 74 68 65 72 20 74 72 79 69 6e 67 20 74 6f 20 64  ther trying to d
08d0: 6f 20 61 6e 79 74 68 69 6e 67 20 64 75 72 69 6e  o anything durin
08e0: 67 20 74 68 65 0a 23 20 66 69 72 73 74 20 70 61  g the.# first pa
08f0: 73 73 2e 20 20 57 65 20 68 61 76 65 20 74 6f 20  ss.  We have to 
0900: 63 6f 6c 6c 65 63 74 20 6b 65 79 77 6f 72 64 20  collect keyword 
0910: 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 62 65 66 6f  information befo
0920: 72 65 20 74 68 65 0a 23 20 68 79 70 65 72 6c 69  re the.# hyperli
0930: 6e 6b 73 20 61 72 65 20 6d 65 61 6e 69 6e 67 66  nks are meaningf
0940: 75 6c 2e 20 20 0a 23 0a 70 72 6f 63 20 68 64 5f  ul.  .#.proc hd_
0950: 72 65 73 6f 6c 76 65 20 7b 74 65 78 74 7d 20 7b  resolve {text} {
0960: 0a 20 20 68 64 5f 70 75 74 73 20 24 74 65 78 74  .  hd_puts $text
0970: 0a 7d 0a 0a 23 20 54 68 69 73 20 69 73 20 74 68  .}..# This is th
0980: 65 20 73 65 63 6f 6e 64 2d 70 61 73 73 20 69 6d  e second-pass im
0990: 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 6f 66 20  plementation of 
09a0: 74 68 65 20 70 72 6f 63 65 64 75 72 65 20 74 68  the procedure th
09b0: 61 74 0a 23 20 72 65 6e 64 65 72 73 20 68 79 70  at.# renders hyp
09c0: 65 72 6c 69 6e 6b 73 2e 20 20 43 6f 6e 76 65 72  erlinks.  Conver
09d0: 74 20 61 6c 6c 20 68 79 70 65 72 6c 69 6e 6b 73  t all hyperlinks
09e0: 20 69 6e 20 24 74 65 78 74 20 69 6e 74 6f 20 0a   in $text into .
09f0: 23 20 61 70 70 72 6f 70 72 69 61 74 65 20 3c 61  # appropriate <a
0a00: 20 68 72 65 66 3d 22 22 3e 20 6d 61 72 6b 75 70   href=""> markup
0a10: 2e 0a 23 0a 23 20 4c 69 6e 6b 73 20 74 6f 20 6b  ..#.# Links to k
0a20: 65 79 77 6f 72 64 73 20 77 69 74 68 69 6e 20 74  eywords within t
0a30: 68 65 20 73 61 6d 65 20 6d 61 69 6e 20 66 69 6c  he same main fil
0a40: 65 20 61 72 65 20 72 65 73 6f 6c 76 65 64 20 75  e are resolved u
0a50: 73 69 6e 67 0a 23 20 24 3a 3a 6c 6c 69 6e 6b 28  sing.# $::llink(
0a60: 29 20 69 66 20 70 6f 73 73 69 62 6c 65 2e 20 20  ) if possible.  
0a70: 41 6c 6c 20 6f 74 68 65 72 20 6c 69 6e 6b 73 20  All other links 
0a80: 61 6e 64 20 6c 69 6e 6b 73 20 74 68 61 74 20 63  and links that c
0a90: 6f 75 6c 64 0a 23 20 6e 6f 74 20 62 65 20 72 65  ould.# not be re
0aa0: 73 6f 6c 76 65 64 20 75 73 69 6e 67 20 24 3a 3a  solved using $::
0ab0: 6c 6c 69 6e 6b 28 29 20 61 72 65 20 72 65 73 6f  llink() are reso
0ac0: 6c 76 65 64 20 75 73 69 6e 67 20 24 3a 3a 67 6c  lved using $::gl
0ad0: 69 6e 6b 28 29 2e 0a 23 20 0a 70 72 6f 63 20 68  ink()..# .proc h
0ae0: 64 5f 72 65 73 6f 6c 76 65 5f 32 6e 64 70 61 73  d_resolve_2ndpas
0af0: 73 20 7b 74 65 78 74 7d 20 7b 0a 20 20 72 65 67  s {text} {.  reg
0b00: 73 75 62 20 2d 61 6c 6c 20 7b 3c 79 79 74 65 72  sub -all {<yyter
0b10: 6d 3e 7d 20 24 74 65 78 74 20 7b 3c 73 70 61 6e  m>} $text {<span
0b20: 20 63 6c 61 73 73 3d 27 79 79 74 65 72 6d 27 3e   class='yyterm'>
0b30: 7d 20 74 65 78 74 0a 20 20 72 65 67 73 75 62 20  } text.  regsub 
0b40: 2d 61 6c 6c 20 7b 3c 2f 79 79 74 65 72 6d 3e 7d  -all {</yyterm>}
0b50: 20 24 74 65 78 74 20 7b 3c 2f 73 70 61 6e 3e 7d   $text {</span>}
0b60: 20 74 65 78 74 0a 20 20 72 65 67 73 75 62 20 2d   text.  regsub -
0b70: 61 6c 6c 20 7b 5c 5b 28 2e 2a 3f 29 5c 5d 7d 20  all {\[(.*?)\]} 
0b80: 24 74 65 78 74 20 5c 0a 20 20 20 20 20 20 22 5c  $text \.      "\
0b90: 31 37 35 3b 20 68 64 5f 72 65 73 6f 6c 76 65 5f  175; hd_resolve_
0ba0: 6f 6e 65 20 5c 31 37 33 5c 5c 31 5c 31 37 35 3b  one \173\\1\175;
0bb0: 20 68 64 5f 70 75 74 73 20 5c 31 37 33 22 20 74   hd_puts \173" t
0bc0: 65 78 74 0a 20 20 65 76 61 6c 20 22 68 64 5f 70  ext.  eval "hd_p
0bd0: 75 74 73 20 5c 31 37 33 24 74 65 78 74 5c 31 37  uts \173$text\17
0be0: 35 22 0a 7d 0a 70 72 6f 63 20 68 64 5f 72 65 73  5".}.proc hd_res
0bf0: 6f 6c 76 65 5f 6f 6e 65 20 7b 78 7d 20 7b 0a 20  olve_one {x} {. 
0c00: 20 69 66 20 7b 5b 73 74 72 69 6e 67 20 69 73 20   if {[string is 
0c10: 69 6e 74 65 67 65 72 20 24 78 5d 7d 20 7b 0a 20  integer $x]} {. 
0c20: 20 20 20 68 64 5f 70 75 74 73 20 5c 5b 24 78 5c     hd_puts \[$x\
0c30: 5d 0a 20 20 20 20 72 65 74 75 72 6e 0a 20 20 7d  ].    return.  }
0c40: 0a 20 20 73 65 74 20 78 32 20 5b 73 70 6c 69 74  .  set x2 [split
0c50: 20 24 78 20 7c 5d 0a 20 20 73 65 74 20 6b 77 20   $x |].  set kw 
0c60: 5b 73 74 72 69 6e 67 20 74 72 69 6d 20 5b 6c 69  [string trim [li
0c70: 6e 64 65 78 20 24 78 32 20 30 5d 5d 0a 20 20 69  ndex $x2 0]].  i
0c80: 66 20 7b 5b 6c 6c 65 6e 67 74 68 20 24 78 32 5d  f {[llength $x2]
0c90: 3d 3d 31 7d 20 7b 0a 20 20 20 20 73 65 74 20 63  ==1} {.    set c
0ca0: 6f 6e 74 65 6e 74 20 24 6b 77 0a 20 20 20 20 72  ontent $kw.    r
0cb0: 65 67 73 75 62 20 7b 5c 28 5b 5e 29 5d 2a 5c 29  egsub {\([^)]*\)
0cc0: 7d 20 24 63 6f 6e 74 65 6e 74 20 7b 7d 20 6b 77  } $content {} kw
0cd0: 0a 20 20 20 20 69 66 20 7b 21 5b 72 65 67 65 78  .    if {![regex
0ce0: 70 20 7b 5e 68 74 74 70 7d 20 24 6b 77 5d 7d 20  p {^http} $kw]} 
0cf0: 7b 72 65 67 73 75 62 20 7b 3d 2e 2a 7d 20 24 6b  {regsub {=.*} $k
0d00: 77 20 7b 7d 20 6b 77 7d 0a 20 20 7d 20 65 6c 73  w {} kw}.  } els
0d10: 65 20 7b 0a 20 20 20 20 73 65 74 20 63 6f 6e 74  e {.    set cont
0d20: 65 6e 74 20 5b 73 74 72 69 6e 67 20 74 72 69 6d  ent [string trim
0d30: 20 5b 6c 69 6e 64 65 78 20 24 78 32 20 31 5d 5d   [lindex $x2 1]]
0d40: 0a 20 20 7d 0a 20 20 69 66 20 7b 21 5b 72 65 67  .  }.  if {![reg
0d50: 65 78 70 20 7b 5e 68 74 74 70 73 3f 3a 7d 20 24  exp {^https?:} $
0d60: 6b 77 5d 7d 20 7b 0a 20 20 20 20 72 65 67 73 75  kw]} {.    regsu
0d70: 62 20 2d 61 6c 6c 20 7b 5b 5e 61 2d 7a 41 2d 5a  b -all {[^a-zA-Z
0d80: 30 2d 39 5f 2e 23 2f 20 2d 5d 7d 20 24 6b 77 20  0-9_.#/ -]} $kw 
0d90: 7b 7d 20 6b 77 0a 20 20 7d 0a 20 20 67 6c 6f 62  {} kw.  }.  glob
0da0: 61 6c 20 68 64 20 6c 6c 69 6e 6b 20 67 6c 69 6e  al hd llink glin
0db0: 6b 20 62 61 63 6b 6c 69 6e 6b 0a 20 20 69 66 20  k backlink.  if 
0dc0: 7b 24 68 64 28 65 6e 61 62 6c 65 2d 6d 61 69 6e  {$hd(enable-main
0dd0: 29 7d 20 7b 0a 20 20 20 20 73 65 74 20 66 6e 20  )} {.    set fn 
0de0: 24 68 64 28 66 6e 2d 6d 61 69 6e 29 0a 20 20 20  $hd(fn-main).   
0df0: 20 69 66 20 7b 5b 72 65 67 65 78 70 20 7b 5e 68   if {[regexp {^h
0e00: 74 74 70 73 3f 3a 7d 20 24 6b 77 5d 7d 20 7b 0a  ttps?:} $kw]} {.
0e10: 20 20 20 20 20 20 70 75 74 73 20 2d 6e 6f 6e 65        puts -none
0e20: 77 6c 69 6e 65 20 24 68 64 28 6d 61 69 6e 29 20  wline $hd(main) 
0e30: 5c 0a 20 20 20 20 20 20 20 20 22 3c 61 20 68 72  \.        "<a hr
0e40: 65 66 3d 5c 22 24 6b 77 5c 22 3e 24 63 6f 6e 74  ef=\"$kw\">$cont
0e50: 65 6e 74 3c 2f 61 3e 22 0a 20 20 20 20 7d 20 65  ent</a>".    } e
0e60: 6c 73 65 69 66 20 7b 5b 72 65 67 65 78 70 20 7b  lseif {[regexp {
0e70: 5e 5b 54 74 5d 69 63 6b 65 74 20 23 28 5c 64 2b  ^[Tt]icket #(\d+
0e80: 29 24 7d 20 24 6b 77 20 61 6c 6c 20 74 6b 74 69  )$} $kw all tkti
0e90: 64 5d 7d 20 7b 0a 20 20 20 20 20 20 73 65 74 20  d]} {.      set 
0ea0: 75 72 6c 20 68 74 74 70 3a 2f 2f 77 77 77 2e 73  url http://www.s
0eb0: 71 6c 69 74 65 2e 6f 72 67 2f 63 76 73 74 72 61  qlite.org/cvstra
0ec0: 63 2f 74 6b 74 76 69 65 77 3f 74 6e 3d 24 74 6b  c/tktview?tn=$tk
0ed0: 74 69 64 0a 20 20 20 20 20 20 70 75 74 73 20 2d  tid.      puts -
0ee0: 6e 6f 6e 65 77 6c 69 6e 65 20 24 68 64 28 6d 61  nonewline $hd(ma
0ef0: 69 6e 29 20 5c 0a 20 20 20 20 20 20 20 20 22 3c  in) \.        "<
0f00: 61 20 68 72 65 66 3d 5c 22 24 75 72 6c 5c 22 3e  a href=\"$url\">
0f10: 24 63 6f 6e 74 65 6e 74 3c 2f 61 3e 22 0a 20 20  $content</a>".  
0f20: 20 20 7d 20 65 6c 73 65 69 66 20 7b 5b 69 6e 66    } elseif {[inf
0f30: 6f 20 65 78 69 73 74 73 20 6c 6c 69 6e 6b 28 24  o exists llink($
0f40: 66 6e 3a 24 6b 77 29 5d 7d 20 7b 0a 20 20 20 20  fn:$kw)]} {.    
0f50: 20 20 70 75 74 73 20 2d 6e 6f 6e 65 77 6c 69 6e    puts -nonewlin
0f60: 65 20 24 68 64 28 6d 61 69 6e 29 20 5c 0a 20 20  e $hd(main) \.  
0f70: 20 20 20 20 20 20 22 3c 61 20 68 72 65 66 3d 5c        "<a href=\
0f80: 22 24 68 64 28 72 6f 6f 74 70 61 74 68 2d 6d 61  "$hd(rootpath-ma
0f90: 69 6e 29 24 6c 6c 69 6e 6b 28 24 66 6e 3a 24 6b  in)$llink($fn:$k
0fa0: 77 29 5c 22 3e 24 63 6f 6e 74 65 6e 74 3c 2f 61  w)\">$content</a
0fb0: 3e 22 0a 20 20 20 20 7d 20 65 6c 73 65 69 66 20  >".    } elseif 
0fc0: 7b 5b 69 6e 66 6f 20 65 78 69 73 74 73 20 67 6c  {[info exists gl
0fd0: 69 6e 6b 28 24 6b 77 29 5d 7d 20 7b 0a 20 20 20  ink($kw)]} {.   
0fe0: 20 20 20 70 75 74 73 20 2d 6e 6f 6e 65 77 6c 69     puts -nonewli
0ff0: 6e 65 20 24 68 64 28 6d 61 69 6e 29 20 5c 0a 20  ne $hd(main) \. 
1000: 20 20 20 20 20 20 20 22 3c 61 20 68 72 65 66 3d         "<a href=
1010: 5c 22 24 68 64 28 72 6f 6f 74 70 61 74 68 2d 6d  \"$hd(rootpath-m
1020: 61 69 6e 29 24 67 6c 69 6e 6b 28 24 6b 77 29 5c  ain)$glink($kw)\
1030: 22 3e 24 63 6f 6e 74 65 6e 74 3c 2f 61 3e 22 0a  ">$content</a>".
1040: 20 20 20 20 7d 20 65 6c 73 65 69 66 20 7b 5b 72      } elseif {[r
1050: 65 67 65 78 70 20 7b 5c 2e 67 69 66 24 7d 20 24  egexp {\.gif$} $
1060: 6b 77 5d 7d 20 7b 0a 20 20 20 20 20 20 70 75 74  kw]} {.      put
1070: 73 20 2d 6e 6f 6e 65 77 6c 69 6e 65 20 24 68 64  s -nonewline $hd
1080: 28 6d 61 69 6e 29 20 5c 0a 20 20 20 20 20 20 20  (main) \.       
1090: 20 22 3c 69 6d 67 20 73 72 63 3d 5c 22 24 68 64   "<img src=\"$hd
10a0: 28 72 6f 6f 74 70 61 74 68 2d 6d 61 69 6e 29 69  (rootpath-main)i
10b0: 6d 61 67 65 73 2f 24 6b 77 5c 22 3e 22 0a 20 20  mages/$kw\">".  
10c0: 20 20 7d 20 65 6c 73 65 20 7b 0a 20 20 20 20 20    } else {.     
10d0: 20 70 75 74 73 20 73 74 64 65 72 72 20 22 45 52   puts stderr "ER
10e0: 52 4f 52 3a 20 75 6e 6b 6e 6f 77 6e 20 68 79 70  ROR: unknown hyp
10f0: 65 72 6c 69 6e 6b 20 74 61 72 67 65 74 3a 20 24  erlink target: $
1100: 6b 77 22 0a 20 20 20 20 20 20 70 75 74 73 20 2d  kw".      puts -
1110: 6e 6f 6e 65 77 6c 69 6e 65 20 24 68 64 28 6d 61  nonewline $hd(ma
1120: 69 6e 29 20 22 3c 66 6f 6e 74 20 63 6f 6c 6f 72  in) "<font color
1130: 3d 5c 22 72 65 64 5c 22 3e 24 63 6f 6e 74 65 6e  =\"red\">$conten
1140: 74 3c 2f 66 6f 6e 74 3e 22 0a 20 20 20 20 7d 0a  t</font>".    }.
1150: 20 20 20 20 69 66 20 7b 24 68 64 28 66 72 61 67      if {$hd(frag
1160: 6d 65 6e 74 29 21 3d 22 22 7d 20 7b 0a 20 20 20  ment)!=""} {.   
1170: 20 20 20 6c 61 70 70 65 6e 64 20 62 61 63 6b 6c     lappend backl
1180: 69 6e 6b 28 24 6b 77 29 20 24 66 6e 23 24 68 64  ink($kw) $fn#$hd
1190: 28 66 72 61 67 6d 65 6e 74 29 0a 20 20 20 20 7d  (fragment).    }
11a0: 20 65 6c 73 65 20 7b 0a 20 20 20 20 20 20 6c 61   else {.      la
11b0: 70 70 65 6e 64 20 62 61 63 6b 6c 69 6e 6b 28 24  ppend backlink($
11c0: 6b 77 29 20 24 66 6e 0a 20 20 20 20 7d 0a 20 20  kw) $fn.    }.  
11d0: 7d 0a 20 20 69 66 20 7b 24 68 64 28 65 6e 61 62  }.  if {$hd(enab
11e0: 6c 65 2d 61 75 78 29 7d 20 7b 0a 20 20 20 20 69  le-aux)} {.    i
11f0: 66 20 7b 5b 72 65 67 65 78 70 20 7b 5e 68 74 74  f {[regexp {^htt
1200: 70 73 3f 3a 7d 20 24 6b 77 5d 7d 20 7b 0a 20 20  ps?:} $kw]} {.  
1210: 20 20 20 20 70 75 74 73 20 2d 6e 6f 6e 65 77 6c      puts -nonewl
1220: 69 6e 65 20 24 68 64 28 61 75 78 29 20 5c 0a 20  ine $hd(aux) \. 
1230: 20 20 20 20 20 20 20 22 3c 61 20 68 72 65 66 3d         "<a href=
1240: 5c 22 24 6b 77 5c 22 3e 24 63 6f 6e 74 65 6e 74  \"$kw\">$content
1250: 3c 2f 61 3e 22 0a 20 20 20 20 7d 20 65 6c 73 65  </a>".    } else
1260: 69 66 20 7b 5b 72 65 67 65 78 70 20 7b 5e 5b 54  if {[regexp {^[T
1270: 74 5d 69 63 6b 65 74 20 23 28 5c 64 2b 29 24 7d  t]icket #(\d+)$}
1280: 20 24 6b 77 20 61 6c 6c 20 74 6b 74 69 64 5d 7d   $kw all tktid]}
1290: 20 7b 0a 20 20 20 20 20 20 73 65 74 20 75 72 6c   {.      set url
12a0: 20 68 74 74 70 3a 2f 2f 77 77 77 2e 73 71 6c 69   http://www.sqli
12b0: 74 65 2e 6f 72 67 2f 63 76 73 74 72 61 63 2f 74  te.org/cvstrac/t
12c0: 6b 74 76 69 65 77 3f 74 6e 3d 24 74 6b 74 69 64  ktview?tn=$tktid
12d0: 0a 20 20 20 20 20 20 70 75 74 73 20 2d 6e 6f 6e  .      puts -non
12e0: 65 77 6c 69 6e 65 20 24 68 64 28 61 75 78 29 20  ewline $hd(aux) 
12f0: 5c 0a 20 20 20 20 20 20 20 20 22 3c 61 20 68 72  \.        "<a hr
1300: 65 66 3d 5c 22 24 75 72 6c 5c 22 3e 24 63 6f 6e  ef=\"$url\">$con
1310: 74 65 6e 74 3c 2f 61 3e 22 0a 20 20 20 20 7d 20  tent</a>".    } 
1320: 65 6c 73 65 69 66 20 7b 5b 69 6e 66 6f 20 65 78  elseif {[info ex
1330: 69 73 74 73 20 67 6c 69 6e 6b 28 24 6b 77 29 5d  ists glink($kw)]
1340: 7d 20 7b 0a 20 20 20 20 20 20 70 75 74 73 20 2d  } {.      puts -
1350: 6e 6f 6e 65 77 6c 69 6e 65 20 24 68 64 28 61 75  nonewline $hd(au
1360: 78 29 20 5c 0a 20 20 20 20 20 20 20 20 22 3c 61  x) \.        "<a
1370: 20 68 72 65 66 3d 5c 22 24 68 64 28 72 6f 6f 74   href=\"$hd(root
1380: 70 61 74 68 2d 61 75 78 29 24 67 6c 69 6e 6b 28  path-aux)$glink(
1390: 24 6b 77 29 5c 22 3e 24 63 6f 6e 74 65 6e 74 3c  $kw)\">$content<
13a0: 2f 61 3e 22 0a 20 20 20 20 7d 20 65 6c 73 65 69  /a>".    } elsei
13b0: 66 20 7b 5b 72 65 67 65 78 70 20 7b 5c 2e 67 69  f {[regexp {\.gi
13c0: 66 24 7d 20 24 6b 77 5d 7d 20 7b 0a 20 20 20 20  f$} $kw]} {.    
13d0: 20 20 70 75 74 73 20 2d 6e 6f 6e 65 77 6c 69 6e    puts -nonewlin
13e0: 65 20 24 68 64 28 6d 61 69 6e 29 20 5c 0a 20 20  e $hd(main) \.  
13f0: 20 20 20 20 20 20 22 3c 69 6d 67 20 73 72 63 3d        "<img src=
1400: 5c 22 24 68 64 28 72 6f 6f 74 70 61 74 68 2d 61  \"$hd(rootpath-a
1410: 75 78 29 69 6d 61 67 65 73 2f 24 6b 77 5c 22 3e  ux)images/$kw\">
1420: 22 0a 20 20 20 20 7d 20 65 6c 73 65 20 7b 0a 20  ".    } else {. 
1430: 20 20 20 20 20 70 75 74 73 20 73 74 64 65 72 72       puts stderr
1440: 20 22 45 52 52 4f 52 3a 20 75 6e 6b 6e 6f 77 6e   "ERROR: unknown
1450: 20 68 79 70 65 72 6c 69 6e 6b 20 74 61 72 67 65   hyperlink targe
1460: 74 3a 20 24 6b 77 22 0a 20 20 20 20 20 20 70 75  t: $kw".      pu
1470: 74 73 20 2d 6e 6f 6e 65 77 6c 69 6e 65 20 24 68  ts -nonewline $h
1480: 64 28 61 75 78 29 20 22 3c 66 6f 6e 74 20 63 6f  d(aux) "<font co
1490: 6c 6f 72 3d 5c 22 72 65 64 5c 22 3e 24 63 6f 6e  lor=\"red\">$con
14a0: 74 65 6e 74 3c 2f 66 6f 6e 74 3e 22 0a 20 20 20  tent</font>".   
14b0: 20 7d 0a 20 20 20 20 69 66 20 7b 24 68 64 28 61   }.    if {$hd(a
14c0: 75 78 2d 66 72 61 67 6d 65 6e 74 29 21 3d 22 22  ux-fragment)!=""
14d0: 7d 20 7b 0a 20 20 20 20 20 20 6c 61 70 70 65 6e  } {.      lappen
14e0: 64 20 62 61 63 6b 6c 69 6e 6b 28 24 6b 77 29 20  d backlink($kw) 
14f0: 24 68 64 28 66 6e 2d 61 75 78 29 23 24 68 64 28  $hd(fn-aux)#$hd(
1500: 61 75 78 2d 66 72 61 67 6d 65 6e 74 29 0a 20 20  aux-fragment).  
1510: 20 20 7d 20 65 6c 73 65 20 7b 0a 20 20 20 20 20    } else {.     
1520: 20 6c 61 70 70 65 6e 64 20 62 61 63 6b 6c 69 6e   lappend backlin
1530: 6b 28 24 6b 77 29 20 24 68 64 28 66 6e 2d 61 75  k($kw) $hd(fn-au
1540: 78 29 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a  x).    }.  }.}..
1550: 0a 23 20 43 6f 6e 76 65 72 74 20 74 68 65 20 6b  .# Convert the k
1560: 65 79 77 6f 72 64 20 24 6b 77 20 69 6e 74 6f 20  eyword $kw into 
1570: 61 6e 20 61 70 70 72 6f 70 72 69 61 74 65 20 72  an appropriate r
1580: 65 6c 61 74 69 76 65 20 55 52 49 0a 23 20 54 68  elative URI.# Th
1590: 69 73 20 69 73 20 61 20 68 65 6c 70 65 72 20 72  is is a helper r
15a0: 6f 75 74 69 6e 65 20 74 6f 20 68 64 5f 6c 69 73  outine to hd_lis
15b0: 74 5f 6f 66 5f 6c 69 6e 6b 73 0a 23 0a 70 72 6f  t_of_links.#.pro
15c0: 63 20 68 64 5f 6b 65 79 77 6f 72 64 5f 74 6f 5f  c hd_keyword_to_
15d0: 75 72 69 20 7b 6b 77 7d 20 7b 0a 20 20 67 6c 6f  uri {kw} {.  glo
15e0: 62 61 6c 20 68 64 20 6c 6c 69 6e 6b 20 67 6c 69  bal hd llink gli
15f0: 6e 6b 0a 20 20 69 66 20 7b 5b 73 74 72 69 6e 67  nk.  if {[string
1600: 20 6d 61 74 63 68 20 7b 2a 2e 68 74 6d 6c 7d 20   match {*.html} 
1610: 24 6b 77 5d 7d 20 7b 72 65 74 75 72 6e 20 24 6b  $kw]} {return $k
1620: 77 7d 0a 20 20 69 66 20 7b 24 68 64 28 65 6e 61  w}.  if {$hd(ena
1630: 62 6c 65 2d 6d 61 69 6e 29 7d 20 7b 0a 20 20 20  ble-main)} {.   
1640: 20 73 65 74 20 66 6e 20 24 68 64 28 66 6e 2d 6d   set fn $hd(fn-m
1650: 61 69 6e 29 0a 20 20 20 20 73 65 74 20 72 65 73  ain).    set res
1660: 20 22 22 0a 20 20 20 20 69 66 20 7b 5b 69 6e 66   "".    if {[inf
1670: 6f 20 65 78 69 73 74 73 20 6c 6c 69 6e 6b 28 24  o exists llink($
1680: 66 6e 3a 24 6b 77 29 5d 7d 20 7b 0a 20 20 20 20  fn:$kw)]} {.    
1690: 20 20 73 65 74 20 72 65 73 20 22 24 68 64 28 72    set res "$hd(r
16a0: 6f 6f 74 70 61 74 68 2d 6d 61 69 6e 29 24 6c 6c  ootpath-main)$ll
16b0: 69 6e 6b 28 24 66 6e 3a 24 6b 77 29 22 0a 20 20  ink($fn:$kw)".  
16c0: 20 20 7d 20 65 6c 73 65 69 66 20 7b 5b 69 6e 66    } elseif {[inf
16d0: 6f 20 65 78 69 73 74 73 20 67 6c 69 6e 6b 28 24  o exists glink($
16e0: 6b 77 29 5d 7d 20 7b 0a 20 20 20 20 20 20 73 65  kw)]} {.      se
16f0: 74 20 72 65 73 20 22 24 68 64 28 72 6f 6f 74 70  t res "$hd(rootp
1700: 61 74 68 2d 6d 61 69 6e 29 24 67 6c 69 6e 6b 28  ath-main)$glink(
1710: 24 6b 77 29 22 0a 20 20 20 20 7d 0a 20 20 20 20  $kw)".    }.    
1720: 69 66 20 7b 24 72 65 73 21 3d 22 22 7d 20 7b 0a  if {$res!=""} {.
1730: 20 20 20 20 20 20 69 66 20 7b 24 68 64 28 66 72        if {$hd(fr
1740: 61 67 6d 65 6e 74 29 21 3d 22 22 7d 20 7b 0a 20  agment)!=""} {. 
1750: 20 20 20 20 20 20 20 6c 61 70 70 65 6e 64 20 62         lappend b
1760: 61 63 6b 6c 69 6e 6b 28 24 6b 77 29 20 24 66 6e  acklink($kw) $fn
1770: 23 24 68 64 28 66 72 61 67 6d 65 6e 74 29 0a 20  #$hd(fragment). 
1780: 20 20 20 20 20 7d 20 65 6c 73 65 20 7b 0a 20 20       } else {.  
1790: 20 20 20 20 20 20 6c 61 70 70 65 6e 64 20 62 61        lappend ba
17a0: 63 6b 6c 69 6e 6b 28 24 6b 77 29 20 24 66 6e 0a  cklink($kw) $fn.
17b0: 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
17c0: 20 20 72 65 74 75 72 6e 20 24 72 65 73 0a 20 20    return $res.  
17d0: 7d 0a 20 20 69 66 20 7b 24 68 64 28 65 6e 61 62  }.  if {$hd(enab
17e0: 6c 65 2d 61 75 78 29 7d 20 7b 0a 20 20 20 20 69  le-aux)} {.    i
17f0: 66 20 7b 5b 69 6e 66 6f 20 65 78 69 73 74 73 20  f {[info exists 
1800: 67 6c 69 6e 6b 28 24 6b 77 29 5d 7d 20 7b 0a 20  glink($kw)]} {. 
1810: 20 20 20 20 20 69 66 20 7b 24 68 64 28 61 75 78       if {$hd(aux
1820: 2d 66 72 61 67 6d 65 6e 74 29 21 3d 22 22 7d 20  -fragment)!=""} 
1830: 7b 0a 20 20 20 20 20 20 20 20 6c 61 70 70 65 6e  {.        lappen
1840: 64 20 62 61 63 6b 6c 69 6e 6b 28 24 6b 77 29 20  d backlink($kw) 
1850: 24 68 64 28 66 6e 2d 61 75 78 29 23 24 68 64 28  $hd(fn-aux)#$hd(
1860: 61 75 78 2d 66 72 61 67 6d 65 6e 74 29 0a 20 20  aux-fragment).  
1870: 20 20 20 20 7d 20 65 6c 73 65 20 7b 0a 20 20 20      } else {.   
1880: 20 20 20 20 20 6c 61 70 70 65 6e 64 20 62 61 63       lappend bac
1890: 6b 6c 69 6e 6b 28 24 6b 77 29 20 24 68 64 28 66  klink($kw) $hd(f
18a0: 6e 2d 61 75 78 29 0a 20 20 20 20 20 20 7d 0a 20  n-aux).      }. 
18b0: 20 20 20 20 20 72 65 74 75 72 6e 20 24 68 64 28       return $hd(
18c0: 72 6f 6f 74 70 61 74 68 2d 61 75 78 29 24 67 6c  rootpath-aux)$gl
18d0: 69 6e 6b 28 24 6b 77 29 0a 20 20 20 20 7d 0a 20  ink($kw).    }. 
18e0: 20 7d 0a 20 20 72 65 74 75 72 6e 20 22 22 0a 7d   }.  return "".}
18f0: 0a 0a 23 20 47 65 6e 65 72 61 74 65 20 61 20 4a  ..# Generate a J
1900: 61 76 61 73 63 72 69 70 74 20 74 61 62 6c 65 20  avascript table 
1910: 63 6f 6e 74 61 69 6e 69 6e 67 20 74 68 65 20 55  containing the U
1920: 52 4c 20 61 6e 64 20 4c 61 62 65 6c 20 66 72 6f  RL and Label fro
1930: 6d 20 24 6c 78 0a 23 20 54 68 69 73 20 69 73 20  m $lx.# This is 
1940: 61 20 68 65 6c 70 65 72 20 72 6f 75 74 69 6e 65  a helper routine
1950: 20 66 6f 72 20 68 64 5f 6c 69 73 74 5f 6f 66 5f   for hd_list_of_
1960: 6c 69 6e 6b 73 2e 0a 23 0a 70 72 6f 63 20 68 64  links..#.proc hd
1970: 5f 6c 69 73 74 5f 6f 66 5f 6c 69 6e 6b 73 5f 6a  _list_of_links_j
1980: 61 76 61 73 63 72 69 70 74 20 7b 6c 78 7d 20 7b  avascript {lx} {
1990: 0a 20 20 73 65 74 20 73 65 70 20 7b 5b 7d 0a 20  .  set sep {[}. 
19a0: 20 66 6f 72 65 61 63 68 20 65 6e 74 72 79 20 24   foreach entry $
19b0: 6c 78 20 7b 0a 20 20 20 20 66 6f 72 65 61 63 68  lx {.    foreach
19c0: 20 7b 6c 69 6e 6b 20 6c 61 62 65 6c 20 73 7d 20   {link label s} 
19d0: 24 65 6e 74 72 79 20 62 72 65 61 6b 0a 20 20 20  $entry break.   
19e0: 20 73 65 74 20 75 72 6c 20 5b 68 64 5f 6b 65 79   set url [hd_key
19f0: 77 6f 72 64 5f 74 6f 5f 75 72 69 20 24 6c 69 6e  word_to_uri $lin
1a00: 6b 5d 0a 20 20 20 20 68 64 5f 70 75 74 73 20 22  k].    hd_puts "
1a10: 24 7b 73 65 70 7d 7b 5c 22 75 5c 22 3a 5c 22 24  ${sep}{\"u\":\"$
1a20: 75 72 6c 5c 22 2c 5c 22 78 5c 22 3a 5c 22 24 6c  url\",\"x\":\"$l
1a30: 61 62 65 6c 5c 22 2c 5c 22 73 5c 22 3a 24 73 7d  abel\",\"s\":$s}
1a40: 22 0a 20 20 20 20 73 65 74 20 73 65 70 20 22 2c  ".    set sep ",
1a50: 5c 6e 22 0a 20 20 7d 0a 20 20 68 64 5f 70 75 74  \n".  }.  hd_put
1a60: 73 6e 6c 20 22 5c 5d 3b 22 0a 7d 0a 0a 23 20 4f  snl "\];".}..# O
1a70: 75 74 70 75 74 20 48 54 4d 4c 2f 4a 53 20 74 68  utput HTML/JS th
1a80: 61 74 20 64 69 73 70 6c 61 79 73 20 74 68 65 20  at displays the 
1a90: 6c 69 73 74 20 24 6c 78 20 69 6e 20 6d 75 6c 74  list $lx in mult
1aa0: 69 70 6c 65 20 63 6f 6c 75 6d 6e 73 0a 23 20 75  iple columns.# u
1ab0: 6e 64 65 72 20 74 68 65 20 61 73 73 75 6d 70 74  nder the assumpt
1ac0: 69 6f 6e 20 74 68 61 74 20 65 61 63 68 20 63 6f  ion that each co
1ad0: 6c 75 6d 6e 20 69 73 20 24 77 20 70 69 78 65 6c  lumn is $w pixel
1ae0: 73 20 77 69 64 65 2e 20 20 54 68 65 0a 23 20 6e  s wide.  The.# n
1af0: 75 6d 62 65 72 20 6f 66 20 63 6f 6c 75 6d 6e 73  umber of columns
1b00: 20 61 75 74 6f 6d 61 74 69 63 61 6c 6c 79 20 61   automatically a
1b10: 64 6a 75 73 74 73 20 74 6f 20 66 69 6c 6c 20 74  djusts to fill t
1b20: 68 65 20 61 76 61 69 6c 61 62 6c 65 0a 23 20 73  he available.# s
1b30: 63 72 65 65 6e 20 77 69 64 74 68 2e 0a 23 0a 23  creen width..#.#
1b40: 20 49 66 20 24 74 69 74 6c 65 20 69 73 20 6e 6f   If $title is no
1b50: 74 20 61 6e 20 65 6d 70 74 79 20 73 74 72 69 6e  t an empty strin
1b60: 67 2c 20 74 68 65 6e 20 69 74 20 69 73 20 75 73  g, then it is us
1b70: 65 64 20 61 73 20 61 20 74 69 74 6c 65 20 66 6f  ed as a title fo
1b80: 72 0a 23 20 74 68 65 20 6c 69 73 74 20 6f 66 20  r.# the list of 
1b90: 6c 69 6e 6b 73 0a 23 0a 23 20 24 6c 78 20 69 73  links.#.# $lx is
1ba0: 20 61 20 6c 69 73 74 20 6f 66 20 74 72 69 70 6c   a list of tripl
1bb0: 65 73 2e 20 20 45 61 63 68 20 74 72 69 70 6c 65  es.  Each triple
1bc0: 20 69 73 20 7b 4b 45 59 57 4f 52 44 20 4c 41 42   is {KEYWORD LAB
1bd0: 45 4c 20 53 7d 2e 20 20 54 68 65 0a 23 20 53 20  EL S}.  The.# S 
1be0: 64 65 74 65 72 6d 69 6e 65 73 20 61 20 73 75 66  determines a suf
1bf0: 66 69 78 20 61 64 64 65 64 20 74 6f 20 65 61 63  fix added to eac
1c00: 68 20 6c 69 73 74 20 65 6c 65 6d 65 6e 74 3a 0a  h list element:.
1c10: 23 0a 23 20 20 20 20 30 3a 20 20 20 20 20 41 64  #.#    0:     Ad
1c20: 64 20 6e 6f 74 68 69 6e 67 20 28 74 68 65 20 64  d nothing (the d
1c30: 65 66 61 75 6c 74 20 61 6e 64 20 63 6f 6d 6d 6f  efault and commo
1c40: 6e 20 63 61 73 65 29 0a 23 20 20 20 20 31 3a 20  n case).#    1: 
1c50: 20 20 20 20 41 64 64 20 74 68 65 20 22 28 65 78      Add the "(ex
1c60: 70 29 22 20 73 75 66 66 69 78 0a 23 20 20 20 20  p)" suffix.#    
1c70: 32 3a 20 20 20 20 20 53 74 72 69 6b 65 20 74 68  2:     Strike th
1c80: 72 6f 75 67 68 20 74 68 65 20 74 65 78 74 20 61  rough the text a
1c90: 6e 64 20 64 6f 20 6e 6f 74 20 68 79 70 65 72 6c  nd do not hyperl
1ca0: 69 6e 6b 0a 23 20 20 20 20 33 3a 20 20 20 20 20  ink.#    3:     
1cb0: 53 74 72 69 6b 65 20 74 68 72 6f 75 67 68 20 74  Strike through t
1cc0: 68 65 20 74 65 78 74 20 61 6e 64 20 61 64 64 20  he text and add 
1cd0: 26 73 75 70 31 0a 23 20 20 20 20 34 3a 20 20 20  &sup1.#    4:   
1ce0: 20 20 41 64 64 20 26 73 75 70 32 0a 23 20 20 20    Add &sup2.#   
1cf0: 20 35 3a 20 20 20 20 20 41 64 64 20 26 73 75 70   5:     Add &sup
1d00: 33 0a 23 0a 70 72 6f 63 20 68 64 5f 6c 69 73 74  3.#.proc hd_list
1d10: 5f 6f 66 5f 6c 69 6e 6b 73 20 7b 74 69 74 6c 65  _of_links {title
1d20: 20 77 20 6c 78 7d 20 7b 0a 20 20 67 6c 6f 62 61   w lx} {.  globa
1d30: 6c 20 6c 69 73 74 63 6f 75 6e 74 20 68 64 0a 20  l listcount hd. 
1d40: 20 69 66 20 7b 21 5b 69 6e 66 6f 20 65 78 69 73   if {![info exis
1d50: 74 73 20 6c 69 73 74 63 6f 75 6e 74 5d 7d 20 7b  ts listcount]} {
1d60: 0a 20 20 20 20 73 65 74 20 6c 69 73 74 63 6f 75  .    set listcou
1d70: 6e 74 20 31 0a 20 20 7d 20 65 6c 73 65 20 7b 0a  nt 1.  } else {.
1d80: 20 20 20 20 69 6e 63 72 20 6c 69 73 74 63 6f 75      incr listcou
1d90: 6e 74 0a 20 20 7d 0a 20 20 73 65 74 20 74 78 20  nt.  }.  set tx 
1da0: 6c 69 73 74 74 61 62 24 6c 69 73 74 63 6f 75 6e  listtab$listcoun
1db0: 74 0a 20 20 73 65 74 20 76 78 20 6c 69 73 74 69  t.  set vx listi
1dc0: 74 65 6d 73 24 6c 69 73 74 63 6f 75 6e 74 0a 20  tems$listcount. 
1dd0: 20 68 64 5f 70 75 74 73 20 22 3c 73 74 79 6c 65   hd_puts "<style
1de0: 3e 5c 6e 23 24 74 78 20 74 72 20 74 64 20 7b 76  >\n#$tx tr td {v
1df0: 65 72 74 69 63 61 6c 2d 61 6c 69 67 6e 3a 74 6f  ertical-align:to
1e00: 70 3b 7d 5c 6e 22 0a 20 20 68 64 5f 70 75 74 73  p;}\n".  hd_puts
1e10: 20 22 3c 2f 73 74 79 6c 65 3e 5c 6e 22 0a 20 20   "</style>\n".  
1e20: 68 64 5f 70 75 74 73 6e 6c 20 22 3c 74 61 62 6c  hd_putsnl "<tabl
1e30: 65 20 69 64 3d 27 24 74 78 27 20 77 69 64 74 68  e id='$tx' width
1e40: 3d 27 31 30 30 25 27 3e 3c 2f 74 61 62 6c 65 3e  ='100%'></table>
1e50: 22 0a 20 20 68 64 5f 70 75 74 73 6e 6c 20 22 3c  ".  hd_putsnl "<
1e60: 73 63 72 69 70 74 3e 22 0a 20 20 68 64 5f 70 75  script>".  hd_pu
1e70: 74 73 20 22 76 61 72 20 24 76 78 20 3d 20 22 0a  ts "var $vx = ".
1e80: 20 20 69 66 20 7b 24 68 64 28 65 6e 61 62 6c 65    if {$hd(enable
1e90: 2d 6d 61 69 6e 29 20 26 26 20 24 68 64 28 65 6e  -main) && $hd(en
1ea0: 61 62 6c 65 2d 61 75 78 29 7d 20 7b 0a 20 20 20  able-aux)} {.   
1eb0: 20 73 65 74 20 68 64 28 65 6e 61 62 6c 65 2d 6d   set hd(enable-m
1ec0: 61 69 6e 29 20 30 0a 20 20 20 20 68 64 5f 6c 69  ain) 0.    hd_li
1ed0: 73 74 5f 6f 66 5f 6c 69 6e 6b 73 5f 6a 61 76 61  st_of_links_java
1ee0: 73 63 72 69 70 74 20 24 6c 78 0a 20 20 20 20 73  script $lx.    s
1ef0: 65 74 20 68 64 28 65 6e 61 62 6c 65 2d 6d 61 69  et hd(enable-mai
1f00: 6e 29 20 31 0a 20 20 20 20 73 65 74 20 68 64 28  n) 1.    set hd(
1f10: 65 6e 61 62 6c 65 2d 61 75 78 29 20 30 0a 20 20  enable-aux) 0.  
1f20: 20 20 68 64 5f 6c 69 73 74 5f 6f 66 5f 6c 69 6e    hd_list_of_lin
1f30: 6b 73 5f 6a 61 76 61 73 63 72 69 70 74 20 24 6c  ks_javascript $l
1f40: 78 0a 20 20 20 20 73 65 74 20 68 64 28 65 6e 61  x.    set hd(ena
1f50: 62 6c 65 2d 61 75 78 29 20 31 0a 20 20 7d 20 65  ble-aux) 1.  } e
1f60: 6c 73 65 20 7b 0a 20 20 20 20 68 64 5f 6c 69 73  lse {.    hd_lis
1f70: 74 5f 6f 66 5f 6c 69 6e 6b 73 5f 6a 61 76 61 73  t_of_links_javas
1f80: 63 72 69 70 74 20 24 6c 78 0a 20 20 7d 0a 20 20  cript $lx.  }.  
1f90: 68 64 5f 70 75 74 73 6e 6c 20 22 76 61 72 20 6a  hd_putsnl "var j
1fa0: 20 3d 20 30 3b 22 0a 20 20 68 64 5f 70 75 74 73   = 0;".  hd_puts
1fb0: 6e 6c 20 22 76 61 72 20 77 20 3d 20 4d 61 74 68  nl "var w = Math
1fc0: 2e 6d 61 78 28 64 6f 63 75 6d 65 6e 74 2e 64 6f  .max(document.do
1fd0: 63 75 6d 65 6e 74 45 6c 65 6d 65 6e 74 2e 63 6c  cumentElement.cl
1fe0: 69 65 6e 74 57 69 64 74 68 2c 20 5c 0a 20 20 20  ientWidth, \.   
1ff0: 20 20 20 20 20 20 20 20 20 20 77 69 6e 64 6f 77            window
2000: 2e 69 6e 6e 65 72 57 69 64 74 68 20 7c 7c 20 30  .innerWidth || 0
2010: 29 3b 22 0a 20 20 68 64 5f 70 75 74 73 6e 6c 20  );".  hd_putsnl 
2020: 22 76 61 72 20 6e 43 6f 6c 20 3d 20 4d 61 74 68  "var nCol = Math
2030: 2e 66 6c 6f 6f 72 28 77 2f 24 77 29 3b 22 0a 20  .floor(w/$w);". 
2040: 20 68 64 5f 70 75 74 73 6e 6c 20 22 69 66 28 6e   hd_putsnl "if(n
2050: 43 6f 6c 3c 3d 30 29 20 6e 43 6f 6c 3d 31 3b 22  Col<=0) nCol=1;"
2060: 0a 20 20 68 64 5f 70 75 74 73 6e 6c 20 22 76 61  .  hd_putsnl "va
2070: 72 20 6e 52 6f 77 20 3d 20 4d 61 74 68 2e 63 65  r nRow = Math.ce
2080: 69 6c 28 28 24 76 78 2e 6c 65 6e 67 74 68 2b 31  il(($vx.length+1
2090: 29 2f 6e 43 6f 6c 29 3b 22 0a 20 20 69 66 20 7b  )/nCol);".  if {
20a0: 24 74 69 74 6c 65 21 3d 22 22 7d 20 7b 0a 20 20  $title!=""} {.  
20b0: 20 20 68 64 5f 70 75 74 73 6e 6c 20 22 76 61 72    hd_putsnl "var
20c0: 20 68 3d 5c 22 3c 74 72 3e 3c 74 64 20 63 6f 6c   h=\"<tr><td col
20d0: 73 70 61 6e 3d 5c 22 2b 6e 43 6f 6c 3b 22 0a 20  span=\"+nCol;". 
20e0: 20 20 20 68 64 5f 70 75 74 73 6e 6c 20 22 68 20     hd_putsnl "h 
20f0: 2b 3d 20 5c 22 3e 24 74 69 74 6c 65 3c 2f 74 64  += \">$title</td
2100: 3e 3c 2f 74 72 3e 3c 74 72 3e 3c 74 64 3e 3c 75  ></tr><tr><td><u
2110: 6c 20 63 6c 61 73 73 3d 27 6d 75 6c 74 69 63 6f  l class='multico
2120: 6c 5f 6c 69 73 74 27 3e 5c 22 22 0a 20 20 7d 20  l_list'>\"".  } 
2130: 65 6c 73 65 20 7b 0a 20 20 20 20 68 64 5f 70 75  else {.    hd_pu
2140: 74 73 6e 6c 20 22 76 61 72 20 68 3d 5c 22 3c 74  tsnl "var h=\"<t
2150: 72 3e 3c 74 64 3e 3c 75 6c 20 63 6c 61 73 73 3d  r><td><ul class=
2160: 27 6d 75 6c 74 69 63 6f 6c 5f 6c 69 73 74 27 3e  'multicol_list'>
2170: 5c 22 22 0a 20 20 7d 0a 20 20 68 64 5f 70 75 74  \"".  }.  hd_put
2180: 73 6e 6c 20 22 76 61 72 20 65 61 22 0a 20 20 68  snl "var ea".  h
2190: 64 5f 70 75 74 73 6e 6c 20 22 66 6f 72 28 76 61  d_putsnl "for(va
21a0: 72 20 69 3d 30 3b 20 69 3c 24 76 78 2e 6c 65 6e  r i=0; i<$vx.len
21b0: 67 74 68 3b 20 69 2b 2b 29 7b 22 0a 20 20 68 64  gth; i++){".  hd
21c0: 5f 70 75 74 73 6e 6c 20 22 20 20 69 66 28 20 28  _putsnl "  if( (
21d0: 2b 2b 6a 29 3e 6e 52 6f 77 20 29 7b 22 0a 20 20  ++j)>nRow ){".  
21e0: 68 64 5f 70 75 74 73 6e 6c 20 22 20 20 20 20 68  hd_putsnl "    h
21f0: 20 2b 3d 20 5c 22 3c 2f 75 6c 3e 3c 2f 74 64 3e   += \"</ul></td>
2200: 5c 5c 6e 3c 74 64 3e 3c 75 6c 20 63 6c 61 73 73  \\n<td><ul class
2210: 3d 27 6d 75 6c 74 69 63 6f 6c 5f 6c 69 73 74 27  ='multicol_list'
2220: 3e 5c 5c 6e 5c 22 3b 22 0a 20 20 68 64 5f 70 75  >\\n\";".  hd_pu
2230: 74 73 6e 6c 20 22 20 20 20 20 6a 20 3d 20 31 3b  tsnl "    j = 1;
2240: 22 0a 20 20 68 64 5f 70 75 74 73 6e 6c 20 22 20  ".  hd_putsnl " 
2250: 20 7d 22 0a 20 20 68 64 5f 70 75 74 73 6e 6c 20   }".  hd_putsnl 
2260: 22 20 20 69 66 28 24 76 78 5c 5b 69 5c 5d 2e 75  "  if($vx\[i\].u
2270: 3d 3d 5c 22 5c 22 20 7c 7c 20 24 76 78 5c 5b 69  ==\"\" || $vx\[i
2280: 5c 5d 2e 73 3d 3d 32 29 7b 22 0a 20 20 68 64 5f  \].s==2){".  hd_
2290: 70 75 74 73 6e 6c 20 22 20 20 20 20 68 20 2b 3d  putsnl "    h +=
22a0: 20 5c 22 3c 6c 69 3e 5c 22 22 0a 20 20 68 64 5f   \"<li>\"".  hd_
22b0: 70 75 74 73 6e 6c 20 22 20 20 20 20 65 61 20 3d  putsnl "    ea =
22c0: 20 5c 22 5c 22 22 0a 20 20 68 64 5f 70 75 74 73   \"\"".  hd_puts
22d0: 6e 6c 20 22 20 20 7d 65 6c 73 65 7b 22 0a 20 20  nl "  }else{".  
22e0: 68 64 5f 70 75 74 73 6e 6c 20 22 20 20 20 20 68  hd_putsnl "    h
22f0: 20 2b 3d 20 5c 22 3c 6c 69 3e 3c 61 20 68 72 65   += \"<li><a hre
2300: 66 3d 27 5c 22 3b 22 0a 20 20 68 64 5f 70 75 74  f='\";".  hd_put
2310: 73 6e 6c 20 22 20 20 20 20 68 20 2b 3d 20 24 76  snl "    h += $v
2320: 78 5c 5b 69 5c 5d 2e 75 3b 22 0a 20 20 68 64 5f  x\[i\].u;".  hd_
2330: 70 75 74 73 6e 6c 20 22 20 20 20 20 68 20 2b 3d  putsnl "    h +=
2340: 20 5c 22 27 3e 5c 22 3b 22 0a 20 20 68 64 5f 70   \"'>\";".  hd_p
2350: 75 74 73 6e 6c 20 22 20 20 20 20 65 61 20 3d 20  utsnl "    ea = 
2360: 5c 22 3c 2f 61 3e 5c 22 22 0a 20 20 68 64 5f 70  \"</a>\"".  hd_p
2370: 75 74 73 6e 6c 20 22 20 20 7d 22 0a 20 20 68 64  utsnl "  }".  hd
2380: 5f 70 75 74 73 6e 6c 20 22 20 20 69 66 28 24 76  _putsnl "  if($v
2390: 78 5c 5b 69 5c 5d 2e 73 3d 3d 32 20 7c 7c 20 24  x\[i\].s==2 || $
23a0: 76 78 5c 5b 69 5c 5d 2e 73 3d 3d 33 29 20 68 20  vx\[i\].s==3) h 
23b0: 2b 3d 20 5c 22 3c 73 3e 5c 22 22 0a 20 20 68 64  += \"<s>\"".  hd
23c0: 5f 70 75 74 73 6e 6c 20 22 20 20 68 20 2b 3d 20  _putsnl "  h += 
23d0: 24 76 78 5c 5b 69 5c 5d 2e 78 3b 22 0a 20 20 68  $vx\[i\].x;".  h
23e0: 64 5f 70 75 74 73 6e 6c 20 22 20 20 69 66 28 24  d_putsnl "  if($
23f0: 76 78 5c 5b 69 5c 5d 2e 73 3d 3d 32 20 7c 7c 20  vx\[i\].s==2 || 
2400: 24 76 78 5c 5b 69 5c 5d 2e 73 3d 3d 33 29 20 68  $vx\[i\].s==3) h
2410: 20 2b 3d 20 5c 22 3c 2f 73 3e 5c 22 22 0a 20 20   += \"</s>\"".  
2420: 68 64 5f 70 75 74 73 6e 6c 20 22 20 20 68 20 2b  hd_putsnl "  h +
2430: 3d 20 65 61 22 0a 20 20 68 64 5f 70 75 74 73 6e  = ea".  hd_putsn
2440: 6c 20 22 20 20 69 66 28 24 76 78 5c 5b 69 5c 5d  l "  if($vx\[i\]
2450: 2e 73 3d 3d 31 29 20 68 20 2b 3d 20 5c 22 3c 73  .s==1) h += \"<s
2460: 6d 61 6c 6c 3e 3c 69 3e 28 65 78 70 29 3c 2f 69  mall><i>(exp)</i
2470: 3e 3c 2f 73 6d 61 6c 6c 3e 5c 5c 6e 5c 22 3b 22  ></small>\\n\";"
2480: 0a 20 20 68 64 5f 70 75 74 73 6e 6c 20 22 20 20  .  hd_putsnl "  
2490: 69 66 28 24 76 78 5c 5b 69 5c 5d 2e 73 3d 3d 33  if($vx\[i\].s==3
24a0: 29 20 68 20 2b 3d 20 5c 22 26 73 75 70 31 5c 5c  ) h += \"&sup1\\
24b0: 6e 5c 22 3b 22 0a 20 20 68 64 5f 70 75 74 73 6e  n\";".  hd_putsn
24c0: 6c 20 22 20 20 69 66 28 24 76 78 5c 5b 69 5c 5d  l "  if($vx\[i\]
24d0: 2e 73 3d 3d 34 29 20 68 20 2b 3d 20 5c 22 26 73  .s==4) h += \"&s
24e0: 75 70 32 5c 5c 6e 5c 22 3b 22 0a 20 20 68 64 5f  up2\\n\";".  hd_
24f0: 70 75 74 73 6e 6c 20 22 20 20 69 66 28 24 76 78  putsnl "  if($vx
2500: 5c 5b 69 5c 5d 2e 73 3d 3d 35 29 20 68 20 2b 3d  \[i\].s==5) h +=
2510: 20 5c 22 26 73 75 70 33 5c 5c 6e 5c 22 3b 22 0a   \"&sup3\\n\";".
2520: 20 20 68 64 5f 70 75 74 73 6e 6c 20 22 7d 22 0a    hd_putsnl "}".
2530: 20 20 68 64 5f 70 75 74 73 6e 6c 20 22 64 6f 63    hd_putsnl "doc
2540: 75 6d 65 6e 74 2e 67 65 74 45 6c 65 6d 65 6e 74  ument.getElement
2550: 42 79 49 64 28 5c 22 24 74 78 5c 22 29 2e 69 6e  ById(\"$tx\").in
2560: 6e 65 72 48 54 4d 4c 20 3d 20 68 3b 22 0a 20 20  nerHTML = h;".  
2570: 68 64 5f 70 75 74 73 6e 6c 20 22 3c 2f 73 63 72  hd_putsnl "</scr
2580: 69 70 74 3e 22 0a 7d 0a 0a 23 20 52 65 63 6f 72  ipt>".}..# Recor
2590: 64 20 74 68 65 20 66 61 63 74 20 74 68 61 74 20  d the fact that 
25a0: 61 6c 6c 20 6b 65 79 77 6f 72 64 73 20 67 69 76  all keywords giv
25b0: 65 6e 20 69 6e 20 74 68 65 20 61 72 67 75 6d 65  en in the argume
25c0: 6e 74 20 6c 69 73 74 20 73 68 6f 75 6c 64 0a 23  nt list should.#
25d0: 20 63 61 75 73 65 20 61 20 6a 75 6d 70 20 74 6f   cause a jump to
25e0: 20 74 68 65 20 63 75 72 72 65 6e 74 20 6c 6f 63   the current loc
25f0: 61 74 69 6f 6e 20 69 6e 20 74 68 65 20 63 75 72  ation in the cur
2600: 72 65 6e 74 20 66 69 6c 65 2e 0a 23 0a 23 20 49  rent file..#.# I
2610: 66 20 6f 6e 6c 79 20 74 68 65 20 6d 61 69 6e 20  f only the main 
2620: 6f 75 74 70 75 74 20 66 69 6c 65 20 69 73 20 6f  output file is o
2630: 70 65 6e 2c 20 74 68 65 6e 20 61 6c 6c 20 72 65  pen, then all re
2640: 66 65 72 65 6e 63 65 73 20 74 6f 20 74 68 65 0a  ferences to the.
2650: 23 20 6b 65 79 77 6f 72 64 20 6a 75 6d 70 20 74  # keyword jump t
2660: 6f 20 74 68 65 20 6d 61 69 6e 20 6f 75 74 70 75  o the main outpu
2670: 74 20 66 69 6c 65 2e 20 20 49 66 20 62 6f 74 68  t file.  If both
2680: 20 6d 61 69 6e 20 61 6e 64 20 61 75 78 20 61 72   main and aux ar
2690: 65 0a 23 20 6f 70 65 6e 20 74 68 65 6e 20 72 65  e.# open then re
26a0: 66 65 72 65 6e 63 65 73 20 66 72 6f 6d 20 77 69  ferences from wi
26b0: 74 68 69 6e 20 74 68 65 20 6d 61 69 6e 20 66 69  thin the main fi
26c0: 6c 65 20 6a 75 6d 70 20 74 6f 20 74 68 65 20 6d  le jump to the m
26d0: 61 69 6e 20 66 69 6c 65 0a 23 20 61 6e 64 20 61  ain file.# and a
26e0: 6c 6c 20 6f 74 68 65 72 20 72 65 66 65 72 65 6e  ll other referen
26f0: 63 65 73 20 6a 75 6d 70 20 74 6f 20 74 68 65 20  ces jump to the 
2700: 61 75 78 69 6c 69 61 72 79 20 66 69 6c 65 2e 0a  auxiliary file..
2710: 23 0a 23 20 54 68 69 73 20 70 72 6f 63 65 64 75  #.# This procedu
2720: 72 65 20 69 73 20 6f 6e 6c 79 20 61 63 74 69 76  re is only activ
2730: 65 20 64 75 72 69 6e 67 20 74 68 65 20 66 69 72  e during the fir
2740: 73 74 20 70 61 73 73 20 77 68 65 6e 20 77 65 20  st pass when we 
2750: 61 72 65 0a 23 20 63 6f 6c 6c 65 63 74 69 6e 67  are.# collecting
2760: 20 68 79 70 65 72 6c 69 6e 6b 20 69 6e 66 6f 72   hyperlink infor
2770: 6d 61 74 69 6f 6e 2e 20 20 54 68 69 73 20 70 72  mation.  This pr
2780: 6f 63 65 64 75 72 65 20 69 73 20 72 65 64 65 66  ocedure is redef
2790: 69 6e 65 64 20 74 6f 0a 23 20 62 65 20 61 20 6e  ined to.# be a n
27a0: 6f 2d 6f 70 20 62 65 66 6f 72 65 20 74 68 65 20  o-op before the 
27b0: 73 74 61 72 74 20 6f 66 20 74 68 65 20 73 65 63  start of the sec
27c0: 6f 6e 64 20 70 61 73 73 2e 0a 23 0a 70 72 6f 63  ond pass..#.proc
27d0: 20 68 64 5f 6b 65 79 77 6f 72 64 73 20 7b 61 72   hd_keywords {ar
27e0: 67 73 7d 20 7b 0a 20 20 67 6c 6f 62 61 6c 20 67  gs} {.  global g
27f0: 6c 69 6e 6b 20 6c 6c 69 6e 6b 20 68 64 0a 20 20  link llink hd.  
2800: 69 66 20 7b 24 68 64 28 66 72 61 67 6d 65 6e 74  if {$hd(fragment
2810: 29 3d 3d 22 22 7d 20 7b 0a 20 20 20 20 73 65 74  )==""} {.    set
2820: 20 6c 75 72 6c 20 24 68 64 28 66 6e 2d 6d 61 69   lurl $hd(fn-mai
2830: 6e 29 0a 20 20 7d 20 65 6c 73 65 20 7b 0a 20 20  n).  } else {.  
2840: 20 20 73 65 74 20 6c 75 72 6c 20 22 23 24 68 64    set lurl "#$hd
2850: 28 66 72 61 67 6d 65 6e 74 29 22 0a 20 20 7d 0a  (fragment)".  }.
2860: 20 20 73 65 74 20 66 6e 20 24 68 64 28 66 6e 2d    set fn $hd(fn-
2870: 6d 61 69 6e 29 0a 20 20 69 66 20 7b 5b 69 6e 66  main).  if {[inf
2880: 6f 20 65 78 69 73 74 73 20 68 64 28 61 75 78 29  o exists hd(aux)
2890: 5d 7d 20 7b 0a 20 20 20 20 73 65 74 20 67 75 72  ]} {.    set gur
28a0: 6c 20 24 68 64 28 66 6e 2d 61 75 78 29 0a 20 20  l $hd(fn-aux).  
28b0: 20 20 69 66 20 7b 24 68 64 28 61 75 78 2d 66 72    if {$hd(aux-fr
28c0: 61 67 6d 65 6e 74 29 21 3d 22 22 7d 20 7b 0a 20  agment)!=""} {. 
28d0: 20 20 20 20 20 61 70 70 65 6e 64 20 67 75 72 6c       append gurl
28e0: 20 22 23 24 68 64 28 61 75 78 2d 66 72 61 67 6d   "#$hd(aux-fragm
28f0: 65 6e 74 29 22 0a 20 20 20 20 7d 0a 20 20 7d 20  ent)".    }.  } 
2900: 65 6c 73 65 20 7b 0a 20 20 20 20 73 65 74 20 67  else {.    set g
2910: 75 72 6c 20 7b 7d 0a 20 20 20 20 69 66 20 7b 24  url {}.    if {$
2920: 68 64 28 66 72 61 67 6d 65 6e 74 29 21 3d 22 22  hd(fragment)!=""
2930: 7d 20 7b 0a 20 20 20 20 20 20 73 65 74 20 6c 75  } {.      set lu
2940: 72 6c 20 24 68 64 28 66 6e 2d 6d 61 69 6e 29 23  rl $hd(fn-main)#
2950: 24 68 64 28 66 72 61 67 6d 65 6e 74 29 0a 20 20  $hd(fragment).  
2960: 20 20 7d 0a 20 20 7d 0a 20 20 73 65 74 20 6f 76    }.  }.  set ov
2970: 65 72 72 69 64 65 5f 66 6c 61 67 20 30 0a 20 20  erride_flag 0.  
2980: 66 6f 72 65 61 63 68 20 61 20 24 61 72 67 73 20  foreach a $args 
2990: 7b 0a 20 20 20 20 69 66 20 7b 5b 72 65 67 65 78  {.    if {[regex
29a0: 70 20 7b 5e 2d 2b 28 2e 2a 29 7d 20 24 61 20 61  p {^-+(.*)} $a a
29b0: 6c 6c 20 70 61 72 61 6d 5d 20 26 26 20 21 5b 72  ll param] && ![r
29c0: 65 67 65 78 70 20 7b 5e 2d 44 7d 20 24 61 5d 7d  egexp {^-D} $a]}
29d0: 20 7b 0a 20 20 20 20 20 20 73 77 69 74 63 68 20   {.      switch 
29e0: 24 70 61 72 61 6d 20 7b 0a 20 20 20 20 20 20 20  $param {.       
29f0: 20 22 6f 76 65 72 72 69 64 65 22 20 7b 0a 20 20   "override" {.  
2a00: 20 20 20 20 20 20 20 20 20 73 65 74 20 6f 76 65           set ove
2a10: 72 72 69 64 65 5f 66 6c 61 67 20 31 0a 20 20 20  rride_flag 1.   
2a20: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 64       }.        d
2a30: 65 66 61 75 6c 74 20 7b 0a 20 20 20 20 20 20 20  efault {.       
2a40: 20 20 20 20 70 75 74 73 20 73 74 64 65 72 72 20      puts stderr 
2a50: 22 45 52 52 4f 52 3a 20 75 6e 6b 6e 6f 77 6e 20  "ERROR: unknown 
2a60: 70 61 72 61 6d 65 74 65 72 3a 20 24 61 22 0a 20  parameter: $a". 
2a70: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d         }.      }
2a80: 0a 20 20 20 20 20 20 63 6f 6e 74 69 6e 75 65 0a  .      continue.
2a90: 20 20 20 20 7d 0a 20 20 20 20 69 66 20 7b 5b 72      }.    if {[r
2aa0: 65 67 65 78 70 20 7b 5e 5c 2a 7d 20 24 61 5d 7d  egexp {^\*} $a]}
2ab0: 20 7b 0a 20 20 20 20 20 20 73 65 74 20 76 69 73   {.      set vis
2ac0: 69 62 6c 65 20 30 0a 20 20 20 20 20 20 73 65 74  ible 0.      set
2ad0: 20 61 20 5b 73 74 72 69 6e 67 20 72 61 6e 67 65   a [string range
2ae0: 20 24 61 20 31 20 65 6e 64 5d 0a 20 20 20 20 7d   $a 1 end].    }
2af0: 20 65 6c 73 65 20 7b 0a 20 20 20 20 20 20 73 65   else {.      se
2b00: 74 20 76 69 73 69 62 6c 65 20 31 0a 20 20 20 20  t visible 1.    
2b10: 7d 0a 20 20 20 20 72 65 67 73 75 62 20 2d 61 6c  }.    regsub -al
2b20: 6c 20 7b 5b 5e 61 2d 7a 41 2d 5a 30 2d 39 5f 2e  l {[^a-zA-Z0-9_.
2b30: 23 2f 20 2d 5d 7d 20 24 61 20 7b 7d 20 6b 77 0a  #/ -]} $a {} kw.
2b40: 20 20 20 20 69 66 20 7b 5b 69 6e 66 6f 20 65 78      if {[info ex
2b50: 69 73 74 73 20 67 6c 69 6e 6b 28 24 6b 77 29 5d  ists glink($kw)]
2b60: 7d 20 7b 0a 20 20 20 20 20 20 69 66 20 7b 5b 69  } {.      if {[i
2b70: 6e 66 6f 20 65 78 69 73 74 73 20 68 64 28 61 75  nfo exists hd(au
2b80: 78 29 5d 20 26 26 20 24 67 6c 69 6e 6b 28 24 6b  x)] && $glink($k
2b90: 77 29 3d 3d 24 68 64 28 66 6e 2d 61 75 78 29 7d  w)==$hd(fn-aux)}
2ba0: 20 7b 0a 20 20 20 20 20 20 20 20 64 62 20 65 76   {.        db ev
2bb0: 61 6c 20 7b 44 45 4c 45 54 45 20 46 52 4f 4d 20  al {DELETE FROM 
2bc0: 6b 65 79 77 6f 72 64 20 57 48 45 52 45 20 6b 77  keyword WHERE kw
2bd0: 3d 24 6b 77 7d 0a 20 20 20 20 20 20 7d 20 65 6c  =$kw}.      } el
2be0: 73 65 69 66 20 7b 24 6f 76 65 72 72 69 64 65 5f  seif {$override_
2bf0: 66 6c 61 67 3d 3d 30 7d 20 7b 0a 20 20 20 20 20  flag==0} {.     
2c00: 20 20 20 70 75 74 73 20 73 74 64 65 72 72 20 22     puts stderr "
2c10: 57 41 52 4e 49 4e 47 3a 20 64 75 70 6c 69 63 61  WARNING: duplica
2c20: 74 65 20 6b 65 79 77 6f 72 64 20 5c 22 24 6b 77  te keyword \"$kw
2c30: 5c 22 20 2d 20 24 67 6c 69 6e 6b 28 24 6b 77 29  \" - $glink($kw)
2c40: 20 61 6e 64 20 24 6c 75 72 6c 22 0a 20 20 20 20   and $lurl".    
2c50: 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 69 66    }.    }.    if
2c60: 20 7b 24 67 75 72 6c 3d 3d 22 22 7d 20 7b 0a 20   {$gurl==""} {. 
2c70: 20 20 20 20 20 73 65 74 20 67 6c 69 6e 6b 28 24       set glink($
2c80: 6b 77 29 20 24 6c 75 72 6c 0a 20 20 20 20 20 20  kw) $lurl.      
2c90: 64 62 20 65 76 61 6c 20 7b 49 4e 53 45 52 54 20  db eval {INSERT 
2ca0: 4f 52 20 49 47 4e 4f 52 45 20 49 4e 54 4f 20 6b  OR IGNORE INTO k
2cb0: 65 79 77 6f 72 64 28 6b 77 2c 66 72 61 67 6d 65  eyword(kw,fragme
2cc0: 6e 74 2c 69 6e 64 65 78 4b 77 29 20 0a 20 20 20  nt,indexKw) .   
2cd0: 20 20 20 20 20 20 20 20 20 20 20 20 20 56 41 4c               VAL
2ce0: 55 45 53 28 24 61 2c 24 6c 75 72 6c 2c 24 76 69  UES($a,$lurl,$vi
2cf0: 73 69 62 6c 65 29 7d 0a 20 20 20 20 7d 20 65 6c  sible)}.    } el
2d00: 73 65 20 7b 0a 20 20 20 20 20 20 73 65 74 20 67  se {.      set g
2d10: 6c 69 6e 6b 28 24 6b 77 29 20 24 67 75 72 6c 0a  link($kw) $gurl.
2d20: 20 20 20 20 20 20 73 65 74 20 6c 6c 69 6e 6b 28        set llink(
2d30: 24 66 6e 3a 24 6b 77 29 20 24 6c 75 72 6c 0a 20  $fn:$kw) $lurl. 
2d40: 20 20 20 20 20 64 62 20 65 76 61 6c 20 7b 49 4e       db eval {IN
2d50: 53 45 52 54 20 4f 52 20 49 47 4e 4f 52 45 20 49  SERT OR IGNORE I
2d60: 4e 54 4f 20 6b 65 79 77 6f 72 64 28 6b 77 2c 66  NTO keyword(kw,f
2d70: 72 61 67 6d 65 6e 74 2c 69 6e 64 65 78 4b 77 29  ragment,indexKw)
2d80: 20 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20   .              
2d90: 20 20 56 41 4c 55 45 53 28 24 61 2c 24 67 75 72    VALUES($a,$gur
2da0: 6c 2c 24 76 69 73 69 62 6c 65 29 7d 0a 20 20 20  l,$visible)}.   
2db0: 20 7d 0a 20 20 7d 0a 7d 0a 0a 23 20 53 74 61 72   }.  }.}..# Star
2dc0: 74 20 61 20 6e 65 77 20 66 72 61 67 6d 65 6e 74  t a new fragment
2dd0: 20 69 6e 20 74 68 65 20 6d 61 69 6e 20 66 69 6c   in the main fil
2de0: 65 2e 20 20 47 69 76 65 20 74 68 65 20 6e 65 77  e.  Give the new
2df0: 20 66 72 61 67 6d 65 6e 74 20 74 68 65 0a 23 20   fragment the.# 
2e00: 69 6e 64 69 63 61 74 65 64 20 6e 61 6d 65 2e 20  indicated name. 
2e10: 20 41 6e 79 20 6b 65 79 77 6f 72 64 73 20 64 65   Any keywords de
2e20: 66 69 6e 65 64 20 61 66 74 65 72 20 74 68 69 73  fined after this
2e30: 20 70 6f 69 6e 74 20 77 69 6c 6c 20 72 65 66 65   point will refe
2e40: 72 0a 23 20 74 6f 20 74 68 65 20 66 72 61 67 6d  r.# to the fragm
2e50: 65 6e 74 2c 20 6e 6f 74 20 74 6f 20 74 68 65 20  ent, not to the 
2e60: 62 65 67 69 6e 6e 69 6e 67 20 6f 66 20 74 68 65  beginning of the
2e70: 20 66 69 6c 65 2e 0a 23 0a 70 72 6f 63 20 68 64   file..#.proc hd
2e80: 5f 66 72 61 67 6d 65 6e 74 20 7b 6e 61 6d 65 20  _fragment {name 
2e90: 61 72 67 73 7d 20 7b 0a 20 20 67 6c 6f 62 61 6c  args} {.  global
2ea0: 20 68 64 0a 20 20 73 65 74 20 68 64 28 66 72 61   hd.  set hd(fra
2eb0: 67 6d 65 6e 74 29 20 24 6e 61 6d 65 0a 20 20 70  gment) $name.  p
2ec0: 75 74 73 20 24 68 64 28 6d 61 69 6e 29 20 22 3c  uts $hd(main) "<
2ed0: 61 20 6e 61 6d 65 3d 5c 22 24 6e 61 6d 65 5c 22  a name=\"$name\"
2ee0: 3e 3c 2f 61 3e 22 0a 20 20 69 66 20 7b 24 68 64  ></a>".  if {$hd
2ef0: 28 65 6e 61 62 6c 65 2d 61 75 78 29 7d 20 7b 0a  (enable-aux)} {.
2f00: 20 20 20 20 70 75 74 73 20 24 68 64 28 61 75 78      puts $hd(aux
2f10: 29 20 22 3c 61 20 6e 61 6d 65 3d 5c 22 24 6e 61  ) "<a name=\"$na
2f20: 6d 65 5c 22 3e 3c 2f 61 3e 22 0a 20 20 20 20 73  me\"></a>".    s
2f30: 65 74 20 68 64 28 61 75 78 2d 66 72 61 67 6d 65  et hd(aux-fragme
2f40: 6e 74 29 20 24 6e 61 6d 65 0a 20 20 7d 0a 20 20  nt) $name.  }.  
2f50: 65 76 61 6c 20 68 64 5f 6b 65 79 77 6f 72 64 73  eval hd_keywords
2f60: 20 24 61 72 67 73 0a 7d 0a 0a 23 20 57 72 69 74   $args.}..# Writ
2f70: 65 20 72 61 77 20 6f 75 74 70 75 74 20 74 6f 20  e raw output to 
2f80: 62 6f 74 68 20 74 68 65 20 6d 61 69 6e 20 66 69  both the main fi
2f90: 6c 65 20 61 6e 64 20 74 68 65 20 61 75 78 69 6c  le and the auxil
2fa0: 69 61 72 79 2e 20 20 4f 6e 6c 79 20 77 72 69 74  iary.  Only writ
2fb0: 65 0a 23 20 74 6f 20 66 69 6c 65 73 20 74 68 61  e.# to files tha
2fc0: 74 20 61 72 65 20 65 6e 61 62 6c 65 64 2e 0a 23  t are enabled..#
2fd0: 0a 70 72 6f 63 20 68 64 5f 70 75 74 73 20 7b 74  .proc hd_puts {t
2fe0: 65 78 74 7d 20 7b 0a 20 20 67 6c 6f 62 61 6c 20  ext} {.  global 
2ff0: 68 64 0a 20 20 69 66 20 7b 24 68 64 28 65 6e 61  hd.  if {$hd(ena
3000: 62 6c 65 2d 6d 61 69 6e 29 7d 20 7b 0a 20 20 20  ble-main)} {.   
3010: 20 73 65 74 20 66 6e 20 24 68 64 28 66 6e 2d 6d   set fn $hd(fn-m
3020: 61 69 6e 29 0a 20 20 20 20 70 75 74 73 20 2d 6e  ain).    puts -n
3030: 6f 6e 65 77 6c 69 6e 65 20 24 68 64 28 6d 61 69  onewline $hd(mai
3040: 6e 29 20 24 74 65 78 74 0a 20 20 7d 0a 20 20 69  n) $text.  }.  i
3050: 66 20 7b 24 68 64 28 65 6e 61 62 6c 65 2d 61 75  f {$hd(enable-au
3060: 78 29 7d 20 7b 0a 20 20 20 20 73 65 74 20 66 6e  x)} {.    set fn
3070: 20 24 68 64 28 66 6e 2d 61 75 78 29 0a 20 20 20   $hd(fn-aux).   
3080: 20 70 75 74 73 20 2d 6e 6f 6e 65 77 6c 69 6e 65   puts -nonewline
3090: 20 24 68 64 28 61 75 78 29 20 24 74 65 78 74 0a   $hd(aux) $text.
30a0: 20 20 7d 0a 20 20 0a 20 20 23 20 4f 75 72 20 70    }.  .  # Our p
30b0: 61 67 65 6c 69 6e 6b 20 70 72 6f 63 65 73 73 69  agelink processi
30c0: 6e 67 20 62 61 73 65 64 20 6f 66 66 20 74 68 65  ng based off the
30d0: 20 67 6c 6f 62 61 6c 73 0a 20 20 23 20 6c 6c 69   globals.  # lli
30e0: 6e 6b 2c 20 67 6c 69 6e 6b 2c 20 61 6e 64 20 62  nk, glink, and b
30f0: 61 63 6b 6c 69 6e 6b 20 67 65 6e 65 72 61 74 65  acklink generate
3100: 64 20 64 75 72 69 6e 67 20 68 64 5f 72 65 73 6f  d during hd_reso
3110: 6c 76 65 0a 20 20 23 20 70 72 6f 63 65 73 73 69  lve.  # processi
3120: 6e 67 20 64 6f 65 73 6e 27 74 20 63 61 74 63 68  ng doesn't catch
3130: 20 6c 69 6e 6b 73 20 6f 75 74 70 75 74 74 65 64   links outputted
3140: 20 64 69 72 65 63 74 6c 79 0a 20 20 23 20 77 69   directly.  # wi
3150: 74 68 20 68 64 5f 70 75 74 73 2e 20 20 54 68 69  th hd_puts.  Thi
3160: 73 20 63 6f 64 65 20 61 74 74 65 6d 70 74 73 20  s code attempts 
3170: 74 6f 20 61 64 64 20 74 68 6f 73 65 20 6c 69 6e  to add those lin
3180: 6b 73 20 74 6f 0a 20 20 23 20 6f 75 72 20 70 61  ks to.  # our pa
3190: 67 65 6c 69 6e 6b 20 61 72 72 61 79 2e 0a 20 20  gelink array..  
31a0: 67 6c 6f 62 61 6c 20 70 61 67 65 6c 69 6e 6b 0a  global pagelink.
31b0: 20 20 73 65 74 20 72 65 66 73 20 5b 72 65 67 65    set refs [rege
31c0: 78 70 20 2d 61 6c 6c 20 2d 69 6e 6c 69 6e 65 20  xp -all -inline 
31d0: 7b 68 72 65 66 3d 5c 22 28 2e 2a 3f 29 5c 22 7d  {href=\"(.*?)\"}
31e0: 20 24 74 65 78 74 5d 0a 20 20 66 6f 72 65 61 63   $text].  foreac
31f0: 68 20 7b 68 72 65 66 20 72 65 66 7d 20 24 72 65  h {href ref} $re
3200: 66 73 20 7b 0a 20 20 20 20 72 65 67 73 75 62 20  fs {.    regsub 
3210: 7b 23 2e 2a 7d 20 24 72 65 66 20 7b 7d 20 72 65  {#.*} $ref {} re
3220: 66 32 0a 20 20 20 20 72 65 67 73 75 62 20 7b 68  f2.    regsub {h
3230: 74 74 70 3a 5c 2f 5c 2f 77 77 77 5c 2e 73 71 6c  ttp:\/\/www\.sql
3240: 69 74 65 5c 2e 6f 72 67 5c 2f 7d 20 24 72 65 66  ite\.org\/} $ref
3250: 32 20 7b 7d 20 72 65 66 33 0a 20 20 20 20 72 65  2 {} ref3.    re
3260: 67 73 75 62 20 7b 5c 2e 5c 2e 5c 2f 7d 20 24 72  gsub {\.\.\/} $r
3270: 65 66 33 20 7b 7d 20 72 65 66 34 0a 20 20 20 20  ef3 {} ref4.    
3280: 69 66 20 7b 5b 72 65 67 65 78 70 20 7b 5e 68 74  if {[regexp {^ht
3290: 74 70 7d 20 24 72 65 66 34 5d 7d 20 63 6f 6e 74  tp} $ref4]} cont
32a0: 69 6e 75 65 0a 20 20 20 20 69 66 20 7b 24 72 65  inue.    if {$re
32b0: 66 34 3d 3d 22 22 7d 20 63 6f 6e 74 69 6e 75 65  f4==""} continue
32c0: 0a 20 20 20 20 69 66 20 7b 5b 72 65 67 65 78 70  .    if {[regexp
32d0: 20 7b 5c 2e 68 74 6d 6c 24 7d 20 24 72 65 66 34   {\.html$} $ref4
32e0: 5d 7d 20 7b 0a 20 20 20 20 20 20 6c 61 70 70 65  ]} {.      lappe
32f0: 6e 64 20 70 61 67 65 6c 69 6e 6b 28 24 72 65 66  nd pagelink($ref
3300: 34 29 20 24 66 6e 0a 20 20 20 20 7d 0a 20 20 7d  4) $fn.    }.  }
3310: 0a 7d 0a 70 72 6f 63 20 68 64 5f 70 75 74 73 6e  .}.proc hd_putsn
3320: 6c 20 7b 74 65 78 74 7d 20 7b 0a 20 20 68 64 5f  l {text} {.  hd_
3330: 70 75 74 73 20 24 74 65 78 74 5c 6e 0a 7d 0a 0a  puts $text\n.}..
3340: 23 20 45 6e 61 62 6c 65 20 6f 72 20 64 69 73 61  # Enable or disa
3350: 62 6c 65 20 74 68 65 20 6d 61 69 6e 20 6f 75 74  ble the main out
3360: 70 75 74 20 66 69 6c 65 2e 0a 23 0a 70 72 6f 63  put file..#.proc
3370: 20 68 64 5f 65 6e 61 62 6c 65 5f 6d 61 69 6e 20   hd_enable_main 
3380: 7b 62 6f 6f 6c 65 61 6e 7d 20 7b 0a 20 20 67 6c  {boolean} {.  gl
3390: 6f 62 61 6c 20 68 64 0a 20 20 73 65 74 20 68 64  obal hd.  set hd
33a0: 28 65 6e 61 62 6c 65 2d 6d 61 69 6e 29 20 24 62  (enable-main) $b
33b0: 6f 6f 6c 65 61 6e 0a 7d 0a 0a 23 20 45 6e 61 62  oolean.}..# Enab
33c0: 6c 65 20 6f 72 20 64 69 73 61 62 6c 65 20 74 68  le or disable th
33d0: 65 20 61 75 78 69 6c 69 61 72 79 20 6f 75 74 70  e auxiliary outp
33e0: 75 74 20 66 69 6c 65 2e 0a 23 0a 70 72 6f 63 20  ut file..#.proc 
33f0: 68 64 5f 65 6e 61 62 6c 65 5f 61 75 78 20 7b 62  hd_enable_aux {b
3400: 6f 6f 6c 65 61 6e 7d 20 7b 0a 20 20 67 6c 6f 62  oolean} {.  glob
3410: 61 6c 20 68 64 0a 20 20 73 65 74 20 68 64 28 65  al hd.  set hd(e
3420: 6e 61 62 6c 65 2d 61 75 78 29 20 24 62 6f 6f 6c  nable-aux) $bool
3430: 65 61 6e 0a 7d 0a 73 65 74 20 68 64 28 65 6e 61  ean.}.set hd(ena
3440: 62 6c 65 2d 61 75 78 29 20 30 0a 0a 23 20 4f 70  ble-aux) 0..# Op
3450: 65 6e 20 74 68 65 20 6d 61 69 6e 20 6f 75 74 70  en the main outp
3460: 75 74 20 66 69 6c 65 2e 20 20 24 66 69 6c 65 6e  ut file.  $filen
3470: 61 6d 65 20 69 73 20 72 65 6c 61 74 69 76 65 20  ame is relative 
3480: 74 6f 20 24 3a 3a 44 45 53 54 2e 20 20 0a 23 0a  to $::DEST.  .#.
3490: 70 72 6f 63 20 68 64 5f 6f 70 65 6e 5f 6d 61 69  proc hd_open_mai
34a0: 6e 20 7b 66 69 6c 65 6e 61 6d 65 7d 20 7b 0a 20  n {filename} {. 
34b0: 20 67 6c 6f 62 61 6c 20 68 64 20 44 45 53 54 0a   global hd DEST.
34c0: 20 20 68 64 5f 63 6c 6f 73 65 5f 6d 61 69 6e 0a    hd_close_main.
34d0: 20 20 73 65 74 20 68 64 28 66 6e 2d 6d 61 69 6e    set hd(fn-main
34e0: 29 20 24 66 69 6c 65 6e 61 6d 65 0a 20 20 73 65  ) $filename.  se
34f0: 74 20 68 64 28 72 6f 6f 74 70 61 74 68 2d 6d 61  t hd(rootpath-ma
3500: 69 6e 29 20 5b 68 64 5f 72 6f 6f 74 70 61 74 68  in) [hd_rootpath
3510: 20 24 66 69 6c 65 6e 61 6d 65 5d 0a 20 20 73 65   $filename].  se
3520: 74 20 68 64 28 6d 61 69 6e 29 20 5b 6f 70 65 6e  t hd(main) [open
3530: 20 24 44 45 53 54 2f 24 66 69 6c 65 6e 61 6d 65   $DEST/$filename
3540: 20 77 5d 0a 20 20 73 65 74 20 68 64 28 65 6e 61   w].  set hd(ena
3550: 62 6c 65 2d 6d 61 69 6e 29 20 31 0a 20 20 73 65  ble-main) 1.  se
3560: 74 20 68 64 28 65 6e 61 62 6c 65 2d 61 75 78 29  t hd(enable-aux)
3570: 20 30 0a 20 20 73 65 74 20 68 64 28 66 72 61 67   0.  set hd(frag
3580: 6d 65 6e 74 29 20 7b 7d 0a 20 20 67 6c 6f 62 61  ment) {}.  globa
3590: 6c 20 70 61 67 65 6c 69 6e 6b 0a 20 20 6c 61 70  l pagelink.  lap
35a0: 70 65 6e 64 20 70 61 67 65 6c 69 6e 6b 28 24 66  pend pagelink($f
35b0: 69 6c 65 6e 61 6d 65 29 20 24 66 69 6c 65 6e 61  ilename) $filena
35c0: 6d 65 0a 7d 0a 0a 23 20 49 66 20 24 66 69 6c 65  me.}..# If $file
35d0: 6e 61 6d 65 20 69 73 20 61 20 70 61 74 68 20 66  name is a path f
35e0: 72 6f 6d 20 24 3a 3a 44 45 53 54 20 74 6f 20 61  rom $::DEST to a
35f0: 20 66 69 6c 65 2c 20 72 65 74 75 72 6e 20 61 20   file, return a 
3600: 70 61 74 68 0a 23 20 66 72 6f 6d 20 74 68 65 20  path.# from the 
3610: 64 69 72 65 63 74 6f 72 79 20 63 6f 6e 74 61 69  directory contai
3620: 6e 69 6e 67 20 24 66 69 6c 65 6e 61 6d 65 20 62  ning $filename b
3630: 61 63 6b 20 74 6f 20 74 68 65 20 64 69 72 65 63  ack to the direc
3640: 74 6f 72 79 20 24 3a 3a 44 45 53 54 2e 0a 23 0a  tory $::DEST..#.
3650: 70 72 6f 63 20 68 64 5f 72 6f 6f 74 70 61 74 68  proc hd_rootpath
3660: 20 7b 66 69 6c 65 6e 61 6d 65 7d 20 7b 0a 20 20   {filename} {.  
3670: 73 65 74 20 75 70 20 7b 7d 0a 20 20 73 65 74 20  set up {}.  set 
3680: 6e 20 5b 6c 6c 65 6e 67 74 68 20 5b 73 70 6c 69  n [llength [spli
3690: 74 20 24 66 69 6c 65 6e 61 6d 65 20 2f 5d 5d 0a  t $filename /]].
36a0: 20 20 69 66 20 7b 24 6e 3c 3d 31 7d 20 7b 0a 20    if {$n<=1} {. 
36b0: 20 20 20 72 65 74 75 72 6e 20 7b 7d 0a 20 20 7d     return {}.  }
36c0: 20 65 6c 73 65 20 7b 0a 20 20 20 20 72 65 74 75   else {.    retu
36d0: 72 6e 20 5b 73 74 72 69 6e 67 20 72 65 70 65 61  rn [string repea
36e0: 74 20 2e 2e 2f 20 5b 65 78 70 72 20 7b 24 6e 2d  t ../ [expr {$n-
36f0: 31 7d 5d 5d 0a 20 20 7d 0a 7d 0a 0a 23 20 43 6c  1}]].  }.}..# Cl
3700: 6f 73 65 20 74 68 65 20 6d 61 69 6e 20 6f 75 74  ose the main out
3710: 70 75 74 20 66 69 6c 65 2e 0a 23 0a 70 72 6f 63  put file..#.proc
3720: 20 68 64 5f 63 6c 6f 73 65 5f 6d 61 69 6e 20 7b   hd_close_main {
3730: 7d 20 7b 0a 20 20 67 6c 6f 62 61 6c 20 68 64 0a  } {.  global hd.
3740: 20 20 68 64 5f 63 6c 6f 73 65 5f 61 75 78 0a 20    hd_close_aux. 
3750: 20 69 66 20 7b 5b 69 6e 66 6f 20 65 78 69 73 74   if {[info exist
3760: 73 20 68 64 28 6d 61 69 6e 29 5d 7d 20 7b 0a 20  s hd(main)]} {. 
3770: 20 20 20 70 75 74 73 20 24 68 64 28 6d 61 69 6e     puts $hd(main
3780: 29 20 24 68 64 28 66 6f 6f 74 65 72 29 0a 20 20  ) $hd(footer).  
3790: 20 20 63 6c 6f 73 65 20 24 68 64 28 6d 61 69 6e    close $hd(main
37a0: 29 0a 20 20 20 20 75 6e 73 65 74 20 68 64 28 6d  ).    unset hd(m
37b0: 61 69 6e 29 0a 20 20 7d 0a 7d 0a 0a 23 20 4f 70  ain).  }.}..# Op
37c0: 65 6e 20 74 68 65 20 61 75 78 69 6c 69 61 72 79  en the auxiliary
37d0: 20 6f 75 74 70 75 74 20 66 69 6c 65 2e 0a 23 0a   output file..#.
37e0: 23 20 4d 6f 73 74 20 64 6f 63 75 6d 65 6e 74 73  # Most documents
37f0: 20 68 61 76 65 20 6f 6e 6c 79 20 61 20 6d 61 69   have only a mai
3800: 6e 20 66 69 6c 65 20 61 6e 64 20 6e 6f 20 61 75  n file and no au
3810: 78 69 6c 69 61 72 79 2e 20 20 48 6f 77 65 76 65  xiliary.  Howeve
3820: 72 2c 20 73 6f 6d 65 0a 23 20 6c 61 72 67 65 20  r, some.# large 
3830: 64 6f 63 75 6d 65 6e 74 73 20 61 72 65 20 62 72  documents are br
3840: 6f 6b 65 6e 20 75 70 20 69 6e 74 6f 20 73 6d 61  oken up into sma
3850: 6c 6c 65 72 20 70 69 65 63 65 73 20 77 68 65 72  ller pieces wher
3860: 65 20 65 61 63 68 20 73 6d 61 6c 6c 65 72 20 70  e each smaller p
3870: 69 65 63 65 0a 23 20 69 73 20 61 6e 20 61 75 78  iece.# is an aux
3880: 69 6c 69 61 72 79 20 66 69 6c 65 2e 20 20 54 68  iliary file.  Th
3890: 65 72 65 20 77 69 6c 6c 20 74 79 70 69 63 61 6c  ere will typical
38a0: 6c 79 20 62 65 20 65 69 74 68 65 72 20 6d 61 6e  ly be either man
38b0: 79 20 61 75 78 69 6c 69 61 72 79 20 66 69 6c 65  y auxiliary file
38c0: 73 0a 23 20 6f 72 20 6e 6f 20 61 75 78 69 6c 69  s.# or no auxili
38d0: 61 72 79 20 66 69 6c 65 73 20 61 73 73 6f 63 69  ary files associ
38e0: 61 74 65 64 20 77 69 74 68 20 65 61 63 68 20 6d  ated with each m
38f0: 61 69 6e 20 66 69 6c 65 2e 0a 23 0a 70 72 6f 63  ain file..#.proc
3900: 20 68 64 5f 6f 70 65 6e 5f 61 75 78 20 7b 66 69   hd_open_aux {fi
3910: 6c 65 6e 61 6d 65 7d 20 7b 0a 20 20 67 6c 6f 62  lename} {.  glob
3920: 61 6c 20 68 64 20 44 45 53 54 0a 20 20 68 64 5f  al hd DEST.  hd_
3930: 63 6c 6f 73 65 5f 61 75 78 0a 20 20 73 65 74 20  close_aux.  set 
3940: 68 64 28 66 6e 2d 61 75 78 29 20 24 66 69 6c 65  hd(fn-aux) $file
3950: 6e 61 6d 65 0a 20 20 73 65 74 20 68 64 28 72 6f  name.  set hd(ro
3960: 6f 74 70 61 74 68 2d 61 75 78 29 20 5b 68 64 5f  otpath-aux) [hd_
3970: 72 6f 6f 74 70 61 74 68 20 24 66 69 6c 65 6e 61  rootpath $filena
3980: 6d 65 5d 0a 20 20 73 65 74 20 68 64 28 61 75 78  me].  set hd(aux
3990: 29 20 5b 6f 70 65 6e 20 24 44 45 53 54 2f 24 66  ) [open $DEST/$f
39a0: 69 6c 65 6e 61 6d 65 20 77 5d 0a 20 20 73 65 74  ilename w].  set
39b0: 20 68 64 28 65 6e 61 62 6c 65 2d 61 75 78 29 20   hd(enable-aux) 
39c0: 31 0a 20 20 73 65 74 20 68 64 28 61 75 78 2d 66  1.  set hd(aux-f
39d0: 72 61 67 6d 65 6e 74 29 20 7b 7d 0a 20 20 67 6c  ragment) {}.  gl
39e0: 6f 62 61 6c 20 70 61 67 65 6c 69 6e 6b 0a 20 20  obal pagelink.  
39f0: 6c 61 70 70 65 6e 64 20 70 61 67 65 6c 69 6e 6b  lappend pagelink
3a00: 28 24 66 69 6c 65 6e 61 6d 65 29 20 24 66 69 6c  ($filename) $fil
3a10: 65 6e 61 6d 65 0a 7d 0a 0a 23 20 43 6c 6f 73 65  ename.}..# Close
3a20: 20 74 68 65 20 61 75 78 69 6c 69 61 72 79 20 6f   the auxiliary o
3a30: 75 74 70 75 74 20 66 69 6c 65 0a 23 0a 70 72 6f  utput file.#.pro
3a40: 63 20 68 64 5f 63 6c 6f 73 65 5f 61 75 78 20 7b  c hd_close_aux {
3a50: 7d 20 7b 0a 20 20 67 6c 6f 62 61 6c 20 68 64 0a  } {.  global hd.
3a60: 20 20 69 66 20 7b 5b 69 6e 66 6f 20 65 78 69 73    if {[info exis
3a70: 74 73 20 68 64 28 61 75 78 29 5d 7d 20 7b 0a 20  ts hd(aux)]} {. 
3a80: 20 20 20 70 75 74 73 20 24 68 64 28 61 75 78 29     puts $hd(aux)
3a90: 20 24 68 64 28 66 6f 6f 74 65 72 29 0a 20 20 20   $hd(footer).   
3aa0: 20 63 6c 6f 73 65 20 24 68 64 28 61 75 78 29 0a   close $hd(aux).
3ab0: 20 20 20 20 75 6e 73 65 74 20 68 64 28 61 75 78      unset hd(aux
3ac0: 29 0a 20 20 20 20 73 65 74 20 68 64 28 65 6e 61  ).    set hd(ena
3ad0: 62 6c 65 2d 61 75 78 29 20 30 0a 20 20 20 20 73  ble-aux) 0.    s
3ae0: 65 74 20 68 64 28 65 6e 61 62 6c 65 2d 6d 61 69  et hd(enable-mai
3af0: 6e 29 20 31 0a 20 20 7d 0a 7d 0a 0a 0a 23 20 68  n) 1.  }.}...# h
3b00: 64 5f 70 75 74 73 69 6e 34 20 69 73 20 6c 69 6b  d_putsin4 is lik
3b10: 65 20 70 75 74 73 20 65 78 63 65 70 74 20 74 68  e puts except th
3b20: 61 74 20 69 74 20 72 65 6d 6f 76 65 73 20 74 68  at it removes th
3b30: 65 20 66 69 72 73 74 20 34 20 69 6e 64 65 6e 74  e first 4 indent
3b40: 61 74 69 6f 6e 0a 23 20 63 68 61 72 61 63 74 65  ation.# characte
3b50: 72 73 20 66 72 6f 6d 20 65 61 63 68 20 6c 69 6e  rs from each lin
3b60: 65 2e 20 20 49 74 20 61 6c 73 6f 20 64 6f 65 73  e.  It also does
3b70: 20 76 61 72 69 61 62 6c 65 20 73 75 62 73 74 69   variable substi
3b80: 74 75 74 69 6f 6e 20 69 6e 0a 23 20 74 68 65 20  tution in.# the 
3b90: 6e 61 6d 65 73 70 61 63 65 20 6f 66 20 69 74 73  namespace of its
3ba0: 20 63 61 6c 6c 69 6e 67 20 70 72 6f 63 65 64 75   calling procedu
3bb0: 72 65 2e 0a 23 0a 70 72 6f 63 20 70 75 74 73 69  re..#.proc putsi
3bc0: 6e 34 20 7b 66 64 20 74 65 78 74 7d 20 7b 0a 20  n4 {fd text} {. 
3bd0: 20 72 65 67 73 75 62 20 2d 61 6c 6c 20 22 5c 6e   regsub -all "\n
3be0: 20 20 20 20 22 20 24 74 65 78 74 20 5c 6e 20 74      " $text \n t
3bf0: 65 78 74 0a 20 20 70 75 74 73 20 24 66 64 20 5b  ext.  puts $fd [
3c00: 75 70 6c 65 76 65 6c 20 31 20 5b 6c 69 73 74 20  uplevel 1 [list 
3c10: 73 75 62 73 74 20 2d 6e 6f 62 61 63 6b 20 2d 6e  subst -noback -n
3c20: 6f 63 6f 6d 20 24 74 65 78 74 5d 5d 0a 7d 0a 0a  ocom $text]].}..
3c30: 23 20 52 65 74 75 72 6e 20 61 20 67 6c 6f 62 61  # Return a globa
3c40: 6c 6c 79 20 75 6e 69 71 75 65 20 6f 62 6a 65 63  lly unique objec
3c50: 74 20 69 64 0a 23 0a 73 65 74 20 68 64 5f 69 64  t id.#.set hd_id
3c60: 5f 63 6f 75 6e 74 65 72 20 30 0a 70 72 6f 63 20  _counter 0.proc 
3c70: 68 64 5f 69 64 20 7b 7d 20 7b 0a 20 20 67 6c 6f  hd_id {} {.  glo
3c80: 62 61 6c 20 68 64 5f 69 64 5f 63 6f 75 6e 74 65  bal hd_id_counte
3c90: 72 0a 20 20 69 6e 63 72 20 68 64 5f 69 64 5f 63  r.  incr hd_id_c
3ca0: 6f 75 6e 74 65 72 0a 20 20 72 65 74 75 72 6e 20  ounter.  return 
3cb0: 78 24 68 64 5f 69 64 5f 63 6f 75 6e 74 65 72 0a  x$hd_id_counter.
3cc0: 7d 0a 0a 23 20 41 20 70 72 6f 63 65 64 75 72 65  }..# A procedure
3cd0: 20 74 6f 20 77 72 69 74 65 20 74 68 65 20 63 6f   to write the co
3ce0: 6d 6d 6f 6e 20 68 65 61 64 65 72 20 66 6f 75 6e  mmon header foun
3cf0: 64 20 6f 6e 20 65 76 65 72 79 20 48 54 4d 4c 20  d on every HTML 
3d00: 66 69 6c 65 20 6f 6e 0a 23 20 74 68 65 20 53 51  file on.# the SQ
3d10: 4c 69 74 65 20 77 65 62 73 69 74 65 2e 0a 23 0a  Lite website..#.
3d20: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
3d30: 23 23 23 23 23 0a 23 20 4e 4f 54 45 3a 20 20 54  #####.# NOTE:  T
3d40: 68 69 73 20 63 6f 64 65 20 69 73 20 63 6f 70 69  his code is copi
3d50: 65 64 20 61 6e 64 20 72 65 75 73 65 64 20 69 6e  ed and reused in
3d60: 20 6d 61 74 72 69 78 2e 74 63 6c 2e 20 20 57 68   matrix.tcl.  Wh
3d70: 65 6e 20 6d 61 6b 69 6e 67 0a 23 20 63 68 61 6e  en making.# chan
3d80: 67 65 73 20 74 6f 20 74 68 69 73 20 69 6d 70 6c  ges to this impl
3d90: 65 6d 65 6e 74 61 74 69 6f 6e 2c 20 62 65 20 73  ementation, be s
3da0: 75 72 65 20 74 6f 20 61 6c 73 6f 20 63 68 61 6e  ure to also chan
3db0: 67 65 20 6d 61 74 72 69 78 2e 74 63 6c 2e 0a 23  ge matrix.tcl..#
3dc0: 0a 70 72 6f 63 20 68 64 5f 68 65 61 64 65 72 20  .proc hd_header 
3dd0: 7b 74 69 74 6c 65 20 7b 73 72 63 66 69 6c 65 20  {title {srcfile 
3de0: 7b 7d 7d 7d 20 7b 0a 20 20 67 6c 6f 62 61 6c 20  {}}} {.  global 
3df0: 68 64 0a 20 20 73 65 74 20 73 61 76 65 64 5f 65  hd.  set saved_e
3e00: 6e 61 62 6c 65 20 24 68 64 28 65 6e 61 62 6c 65  nable $hd(enable
3e10: 2d 6d 61 69 6e 29 0a 20 20 69 66 20 7b 24 73 72  -main).  if {$sr
3e20: 63 66 69 6c 65 3d 3d 22 22 7d 20 7b 0a 20 20 20  cfile==""} {.   
3e30: 20 73 65 74 20 66 64 20 24 68 64 28 61 75 78 29   set fd $hd(aux)
3e40: 0a 20 20 20 20 73 65 74 20 70 61 74 68 20 24 68  .    set path $h
3e50: 64 28 72 6f 6f 74 70 61 74 68 2d 61 75 78 29 0a  d(rootpath-aux).
3e60: 20 20 7d 20 65 6c 73 65 20 7b 0a 20 20 20 20 73    } else {.    s
3e70: 65 74 20 66 64 20 24 68 64 28 6d 61 69 6e 29 0a  et fd $hd(main).
3e80: 20 20 20 20 73 65 74 20 70 61 74 68 20 24 68 64      set path $hd
3e90: 28 72 6f 6f 74 70 61 74 68 2d 6d 61 69 6e 29 0a  (rootpath-main).
3ea0: 20 20 7d 0a 0a 20 20 70 75 74 73 20 24 66 64 20    }..  puts $fd 
3eb0: 5b 64 6f 63 75 6d 65 6e 74 5f 68 65 61 64 65 72  [document_header
3ec0: 20 24 74 69 74 6c 65 20 24 70 61 74 68 5d 0a 20   $title $path]. 
3ed0: 20 69 66 20 7b 24 73 72 63 66 69 6c 65 21 3d 22   if {$srcfile!="
3ee0: 22 7d 20 7b 0a 20 20 20 20 69 66 20 7b 5b 66 69  "} {.    if {[fi
3ef0: 6c 65 20 65 78 69 73 74 73 20 44 52 41 46 54 5d  le exists DRAFT]
3f00: 7d 20 7b 0a 20 20 20 20 20 20 73 65 74 20 68 64  } {.      set hd
3f10: 28 66 6f 6f 74 65 72 29 20 5b 68 64 5f 74 72 69  (footer) [hd_tri
3f20: 6d 20 7b 0a 20 20 20 20 20 20 20 20 3c 70 20 61  m {.        <p a
3f30: 6c 69 67 6e 3d 22 63 65 6e 74 65 72 22 3e 3c 66  lign="center"><f
3f40: 6f 6e 74 20 73 69 7a 65 3d 22 36 22 20 63 6f 6c  ont size="6" col
3f50: 6f 72 3d 22 72 65 64 22 3e 2a 2a 2a 20 44 52 41  or="red">*** DRA
3f60: 46 54 20 2a 2a 2a 3c 2f 66 6f 6e 74 3e 3c 2f 70  FT ***</font></p
3f70: 3e 0a 20 20 20 20 20 20 7d 5d 0a 20 20 20 20 7d  >.      }].    }
3f80: 20 65 6c 73 65 20 7b 0a 20 20 20 20 20 20 73 65   else {.      se
3f90: 74 20 68 64 28 66 6f 6f 74 65 72 29 20 7b 7d 0a  t hd(footer) {}.
3fa0: 20 20 20 20 7d 0a 20 20 7d 20 65 6c 73 65 20 7b      }.  } else {
3fb0: 0a 20 20 20 20 73 65 74 20 68 64 28 65 6e 61 62  .    set hd(enab
3fc0: 6c 65 2d 6d 61 69 6e 29 20 24 73 61 76 65 64 5f  le-main) $saved_
3fd0: 65 6e 61 62 6c 65 0a 20 20 7d 0a 7d 0a 0a 23 20  enable.  }.}..# 
3fe0: 49 6e 73 65 72 74 20 61 20 62 75 62 62 6c 65 20  Insert a bubble 
3ff0: 73 79 6e 74 61 78 20 64 69 61 67 72 61 6d 20 69  syntax diagram i
4000: 6e 74 6f 20 74 68 65 20 6f 75 74 70 75 74 2e 0a  nto the output..
4010: 23 0a 70 72 6f 63 20 42 75 62 62 6c 65 44 69 61  #.proc BubbleDia
4020: 67 72 61 6d 20 7b 6e 61 6d 65 20 7b 61 6e 6f 6e  gram {name {anon
4030: 79 6d 6f 75 73 5f 66 6c 61 67 20 30 7d 7d 20 7b  ymous_flag 0}} {
4040: 0a 20 20 67 6c 6f 62 61 6c 20 68 64 0a 0a 20 20  .  global hd..  
4050: 23 69 66 20 7b 21 24 61 6e 6f 6e 79 6d 6f 75 73  #if {!$anonymous
4060: 5f 66 6c 61 67 7d 20 7b 0a 20 20 23 20 20 68 64  _flag} {.  #  hd
4070: 5f 72 65 73 6f 6c 76 65 20 22 3c 68 34 3e 5c 5b  _resolve "<h4>\[
4080: 24 6e 61 6d 65 3a 5c 5d 3c 2f 68 34 3e 22 0a 20  $name:\]</h4>". 
4090: 20 23 7d 0a 20 20 68 64 5f 72 65 73 6f 6c 76 65   #}.  hd_resolve
40a0: 20 22 3c 70 3e 3c 62 3e 5c 5b 24 6e 61 6d 65 3a   "<p><b>\[$name:
40b0: 5c 5d 3c 2f 62 3e 3c 2f 70 3e 22 0a 20 20 73 65  \]</b></p>".  se
40c0: 74 20 61 6c 74 20 22 61 6c 74 3d 5c 22 73 79 6e  t alt "alt=\"syn
40d0: 74 61 78 20 64 69 61 67 72 61 6d 20 24 6e 61 6d  tax diagram $nam
40e0: 65 5c 22 22 0a 20 20 69 66 20 7b 24 68 64 28 65  e\"".  if {$hd(e
40f0: 6e 61 62 6c 65 2d 6d 61 69 6e 29 7d 20 7b 0a 20  nable-main)} {. 
4100: 20 20 20 70 75 74 73 20 24 68 64 28 6d 61 69 6e     puts $hd(main
4110: 29 20 22 3c 64 69 76 20 63 6c 61 73 73 3d 27 69  ) "<div class='i
4120: 6d 67 63 6f 6e 74 61 69 6e 65 72 27 3e 5c 6e 5c  mgcontainer'>\n\
4130: 0a 20 20 20 20 20 20 20 20 3c 69 6d 67 20 24 61  .        <img $a
4140: 6c 74 20 73 72 63 3d 5c 22 24 68 64 28 72 6f 6f  lt src=\"$hd(roo
4150: 74 70 61 74 68 2d 6d 61 69 6e 29 69 6d 61 67 65  tpath-main)image
4160: 73 2f 73 79 6e 74 61 78 2f 24 6e 61 6d 65 2e 67  s/syntax/$name.g
4170: 69 66 5c 22 3e 3c 2f 69 6d 67 3e 5c 6e 5c 0a 20  if\"></img>\n\. 
4180: 20 20 20 20 20 20 20 3c 2f 64 69 76 3e 22 0a 20         </div>". 
4190: 20 7d 0a 20 20 69 66 20 7b 24 68 64 28 65 6e 61   }.  if {$hd(ena
41a0: 62 6c 65 2d 61 75 78 29 7d 20 7b 0a 20 20 20 20  ble-aux)} {.    
41b0: 70 75 74 73 20 24 68 64 28 61 75 78 29 20 22 3c  puts $hd(aux) "<
41c0: 64 69 76 20 63 6c 61 73 73 3d 27 69 6d 67 63 6f  div class='imgco
41d0: 6e 74 61 69 6e 65 72 27 3e 5c 6e 5c 0a 20 20 20  ntainer'>\n\.   
41e0: 20 20 20 20 20 3c 69 6d 67 20 24 61 6c 74 20 73       <img $alt s
41f0: 72 63 3d 5c 22 24 68 64 28 72 6f 6f 74 70 61 74  rc=\"$hd(rootpat
4200: 68 2d 61 75 78 29 69 6d 61 67 65 73 2f 73 79 6e  h-aux)images/syn
4210: 74 61 78 2f 24 6e 61 6d 65 2e 67 69 66 5c 22 3e  tax/$name.gif\">
4220: 3c 2f 69 6d 67 3e 5c 6e 5c 0a 20 20 20 20 20 20  </img>\n\.      
4230: 20 20 3c 2f 64 69 76 3e 22 0a 20 20 7d 0a 7d 0a    </div>".  }.}.
4240: 70 72 6f 63 20 48 69 64 64 65 6e 42 75 62 62 6c  proc HiddenBubbl
4250: 65 44 69 61 67 72 61 6d 20 7b 6e 61 6d 65 7d 20  eDiagram {name} 
4260: 7b 0a 20 20 67 6c 6f 62 61 6c 20 68 64 0a 20 20  {.  global hd.  
4270: 73 65 74 20 61 6c 74 20 22 61 6c 74 3d 5c 22 73  set alt "alt=\"s
4280: 79 6e 74 61 78 20 64 69 61 67 72 61 6d 20 24 6e  yntax diagram $n
4290: 61 6d 65 5c 22 22 0a 20 20 68 64 5f 72 65 73 6f  ame\"".  hd_reso
42a0: 6c 76 65 20 22 3c 70 3e 3c 62 3e 5c 5b 24 6e 61  lve "<p><b>\[$na
42b0: 6d 65 3a 5c 5d 3c 2f 62 3e 20 22 0a 20 20 69 66  me:\]</b> ".  if
42c0: 20 7b 24 68 64 28 65 6e 61 62 6c 65 2d 6d 61 69   {$hd(enable-mai
42d0: 6e 29 7d 20 7b 0a 20 20 20 20 73 65 74 20 61 20  n)} {.    set a 
42e0: 5b 68 64 5f 69 64 5d 0a 20 20 20 20 73 65 74 20  [hd_id].    set 
42f0: 62 20 5b 68 64 5f 69 64 5d 0a 20 20 20 20 70 75  b [hd_id].    pu
4300: 74 73 20 24 68 64 28 6d 61 69 6e 29 20 5c 0a 20  ts $hd(main) \. 
4310: 20 20 20 20 22 3c 62 75 74 74 6f 6e 20 69 64 3d      "<button id=
4320: 27 24 61 27 20 6f 6e 63 6c 69 63 6b 3d 27 68 69  '$a' onclick='hi
4330: 64 65 6f 72 73 68 6f 77 28 5c 22 24 61 5c 22 2c  deorshow(\"$a\",
4340: 5c 22 24 62 5c 22 29 27 3e 73 68 6f 77 3c 2f 62  \"$b\")'>show</b
4350: 75 74 74 6f 6e 3e 5c 0a 20 20 20 20 20 20 3c 2f  utton>\.      </
4360: 70 3e 5c 6e 5c 0a 20 20 20 20 20 20 3c 64 69 76  p>\n\.      <div
4370: 20 69 64 3d 27 24 62 27 20 73 74 79 6c 65 3d 27   id='$b' style='
4380: 64 69 73 70 6c 61 79 3a 6e 6f 6e 65 3b 27 20 63  display:none;' c
4390: 6c 61 73 73 3d 27 69 6d 67 63 6f 6e 74 61 69 6e  lass='imgcontain
43a0: 65 72 27 3e 5c 6e 5c 0a 20 20 20 20 20 20 3c 69  er'>\n\.      <i
43b0: 6d 67 20 24 61 6c 74 20 73 72 63 3d 5c 22 24 68  mg $alt src=\"$h
43c0: 64 28 72 6f 6f 74 70 61 74 68 2d 6d 61 69 6e 29  d(rootpath-main)
43d0: 69 6d 61 67 65 73 2f 73 79 6e 74 61 78 2f 24 6e  images/syntax/$n
43e0: 61 6d 65 2e 67 69 66 5c 22 3e 3c 2f 69 6d 67 3e  ame.gif\"></img>
43f0: 5c 6e 5c 0a 20 20 20 20 20 20 3c 2f 64 69 76 3e  \n\.      </div>
4400: 22 0a 20 20 7d 0a 20 20 69 66 20 7b 24 68 64 28  ".  }.  if {$hd(
4410: 65 6e 61 62 6c 65 2d 61 75 78 29 7d 20 7b 0a 20  enable-aux)} {. 
4420: 20 20 20 73 65 74 20 61 20 5b 68 64 5f 69 64 5d     set a [hd_id]
4430: 0a 20 20 20 20 73 65 74 20 62 20 5b 68 64 5f 69  .    set b [hd_i
4440: 64 5d 0a 20 20 20 20 70 75 74 73 20 24 68 64 28  d].    puts $hd(
4450: 61 75 78 29 20 5c 0a 20 20 20 20 20 22 3c 62 75  aux) \.     "<bu
4460: 74 74 6f 6e 20 69 64 3d 27 24 61 27 20 6f 6e 63  tton id='$a' onc
4470: 6c 69 63 6b 3d 27 68 69 64 65 6f 72 73 68 6f 77  lick='hideorshow
4480: 28 5c 22 24 61 5c 22 2c 5c 22 24 62 5c 22 29 27  (\"$a\",\"$b\")'
4490: 3e 73 68 6f 77 3c 2f 62 75 74 74 6f 6e 3e 5c 0a  >show</button>\.
44a0: 20 20 20 20 20 20 3c 2f 70 3e 5c 6e 5c 0a 20 20        </p>\n\.  
44b0: 20 20 20 20 3c 64 69 76 20 69 64 3d 27 24 62 27      <div id='$b'
44c0: 20 73 74 79 6c 65 3d 27 64 69 73 70 6c 61 79 3a   style='display:
44d0: 6e 6f 6e 65 3b 27 20 63 6c 61 73 73 3d 27 69 6d  none;' class='im
44e0: 67 63 6f 6e 74 61 69 6e 65 72 27 3e 5c 6e 5c 0a  gcontainer'>\n\.
44f0: 20 20 20 20 20 20 3c 69 6d 67 20 24 61 6c 74 20        <img $alt 
4500: 73 72 63 3d 5c 22 24 68 64 28 72 6f 6f 74 70 61  src=\"$hd(rootpa
4510: 74 68 2d 61 75 78 29 69 6d 61 67 65 73 2f 73 79  th-aux)images/sy
4520: 6e 74 61 78 2f 24 6e 61 6d 65 2e 67 69 66 5c 22  ntax/$name.gif\"
4530: 3e 3c 2f 69 6d 67 3e 5c 6e 5c 0a 20 20 20 20 20  ></img>\n\.     
4540: 20 3c 2f 64 69 76 3e 22 0a 20 20 7d 0a 7d 0a 70   </div>".  }.}.p
4550: 72 6f 63 20 52 65 63 75 72 73 69 76 65 42 75 62  roc RecursiveBub
4560: 62 6c 65 44 69 61 67 72 61 6d 5f 68 65 6c 70 65  bleDiagram_helpe
4570: 72 20 7b 63 6c 61 73 73 20 6e 61 6d 65 20 6f 70  r {class name op
4580: 65 6e 6c 69 73 74 20 65 78 63 6c 75 64 65 7d 20  enlist exclude} 
4590: 7b 0a 20 20 67 6c 6f 62 61 6c 20 68 64 20 73 79  {.  global hd sy
45a0: 6e 74 61 78 5f 6c 69 6e 6b 61 67 65 0a 20 20 73  ntax_linkage.  s
45b0: 65 74 20 61 6c 74 20 22 61 6c 74 3d 5c 22 73 79  et alt "alt=\"sy
45c0: 6e 74 61 78 20 64 69 61 67 72 61 6d 20 24 6e 61  ntax diagram $na
45d0: 6d 65 5c 22 22 0a 20 20 68 64 5f 72 65 73 6f 6c  me\"".  hd_resol
45e0: 76 65 20 22 3c 70 3e 3c 62 3e 5c 5b 24 6e 61 6d  ve "<p><b>\[$nam
45f0: 65 3a 5c 5d 3c 2f 62 3e 5c 6e 22 0a 20 20 73 65  e:\]</b>\n".  se
4600: 74 20 61 20 5b 68 64 5f 69 64 5d 0a 20 20 73 65  t a [hd_id].  se
4610: 74 20 62 20 5b 68 64 5f 69 64 5d 0a 20 20 73 65  t b [hd_id].  se
4620: 74 20 6f 70 65 6e 66 6c 61 67 20 30 0a 20 20 73  t openflag 0.  s
4630: 65 74 20 6f 70 65 6e 32 20 7b 7d 0a 20 20 66 6f  et open2 {}.  fo
4640: 72 65 61 63 68 20 78 20 24 6f 70 65 6e 6c 69 73  reach x $openlis
4650: 74 20 7b 0a 20 20 20 20 69 66 20 7b 24 78 3d 3d  t {.    if {$x==
4660: 24 6e 61 6d 65 7d 20 7b 0a 20 20 20 20 20 20 73  $name} {.      s
4670: 65 74 20 6f 70 65 6e 66 6c 61 67 20 31 0a 20 20  et openflag 1.  
4680: 20 20 7d 20 65 6c 73 65 20 7b 0a 20 20 20 20 20    } else {.     
4690: 20 6c 61 70 70 65 6e 64 20 6f 70 65 6e 32 20 24   lappend open2 $
46a0: 78 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 69 66  x.    }.  }.  if
46b0: 20 7b 24 6f 70 65 6e 66 6c 61 67 7d 20 7b 0a 20   {$openflag} {. 
46c0: 20 20 20 70 75 74 73 20 24 68 64 28 24 63 6c 61     puts $hd($cla
46d0: 73 73 29 20 5c 0a 20 20 20 20 20 20 22 3c 62 75  ss) \.      "<bu
46e0: 74 74 6f 6e 20 69 64 3d 27 24 61 27 20 6f 6e 63  tton id='$a' onc
46f0: 6c 69 63 6b 3d 27 68 69 64 65 6f 72 73 68 6f 77  lick='hideorshow
4700: 28 5c 22 24 61 5c 22 2c 5c 22 24 62 5c 22 29 27  (\"$a\",\"$b\")'
4710: 3e 68 69 64 65 3c 2f 62 75 74 74 6f 6e 3e 3c 2f  >hide</button></
4720: 70 3e 5c 6e 5c 0a 20 20 20 20 20 20 20 3c 64 69  p>\n\.       <di
4730: 76 20 69 64 3d 27 24 62 27 20 63 6c 61 73 73 3d  v id='$b' class=
4740: 27 69 6d 67 63 6f 6e 74 61 69 6e 65 72 27 3e 5c  'imgcontainer'>\
4750: 6e 5c 0a 20 20 20 20 20 20 20 3c 69 6d 67 20 24  n\.       <img $
4760: 61 6c 74 20 73 72 63 3d 5c 22 24 68 64 28 72 6f  alt src=\"$hd(ro
4770: 6f 74 70 61 74 68 2d 24 63 6c 61 73 73 29 69 6d  otpath-$class)im
4780: 61 67 65 73 2f 73 79 6e 74 61 78 2f 24 6e 61 6d  ages/syntax/$nam
4790: 65 2e 67 69 66 5c 22 20 2f 3e 22 0a 20 20 7d 20  e.gif\" />".  } 
47a0: 65 6c 73 65 20 7b 0a 20 20 20 20 70 75 74 73 20  else {.    puts 
47b0: 24 68 64 28 24 63 6c 61 73 73 29 20 5c 0a 20 20  $hd($class) \.  
47c0: 20 20 20 20 22 3c 62 75 74 74 6f 6e 20 69 64 3d      "<button id=
47d0: 27 24 61 27 20 6f 6e 63 6c 69 63 6b 3d 27 68 69  '$a' onclick='hi
47e0: 64 65 6f 72 73 68 6f 77 28 5c 22 24 61 5c 22 2c  deorshow(\"$a\",
47f0: 5c 22 24 62 5c 22 29 27 3e 73 68 6f 77 3c 2f 62  \"$b\")'>show</b
4800: 75 74 74 6f 6e 3e 3c 2f 70 3e 5c 6e 5c 0a 20 20  utton></p>\n\.  
4810: 20 20 20 20 20 3c 64 69 76 20 69 64 3d 27 24 62       <div id='$b
4820: 27 20 73 74 79 6c 65 3d 27 64 69 73 70 6c 61 79  ' style='display
4830: 3a 6e 6f 6e 65 3b 27 20 63 6c 61 73 73 3d 27 69  :none;' class='i
4840: 6d 67 63 6f 6e 74 61 69 6e 65 72 27 3e 5c 6e 5c  mgcontainer'>\n\
4850: 0a 20 20 20 20 20 20 20 3c 69 6d 67 20 24 61 6c  .       <img $al
4860: 74 20 73 72 63 3d 5c 22 24 68 64 28 72 6f 6f 74  t src=\"$hd(root
4870: 70 61 74 68 2d 24 63 6c 61 73 73 29 69 6d 61 67  path-$class)imag
4880: 65 73 2f 73 79 6e 74 61 78 2f 24 6e 61 6d 65 2e  es/syntax/$name.
4890: 67 69 66 5c 22 20 2f 3e 22 0a 20 20 7d 0a 20 20  gif\" />".  }.  
48a0: 69 66 20 7b 5b 69 6e 66 6f 20 65 78 69 73 74 73  if {[info exists
48b0: 20 73 79 6e 74 61 78 5f 6c 69 6e 6b 61 67 65 28   syntax_linkage(
48c0: 24 6e 61 6d 65 29 5d 7d 20 7b 0a 20 20 20 20 66  $name)]} {.    f
48d0: 6f 72 65 61 63 68 20 7b 63 78 20 70 78 7d 20 24  oreach {cx px} $
48e0: 73 79 6e 74 61 78 5f 6c 69 6e 6b 61 67 65 28 24  syntax_linkage($
48f0: 6e 61 6d 65 29 20 62 72 65 61 6b 0a 20 20 20 20  name) break.    
4900: 66 6f 72 65 61 63 68 20 63 20 24 63 78 20 7b 0a  foreach c $cx {.
4910: 20 20 20 20 20 20 69 66 20 7b 5b 6c 73 65 61 72        if {[lsear
4920: 63 68 20 24 65 78 63 6c 75 64 65 20 24 63 5d 3e  ch $exclude $c]>
4930: 3d 30 7d 20 63 6f 6e 74 69 6e 75 65 0a 20 20 20  =0} continue.   
4940: 20 20 20 52 65 63 75 72 73 69 76 65 42 75 62 62     RecursiveBubb
4950: 6c 65 44 69 61 67 72 61 6d 5f 68 65 6c 70 65 72  leDiagram_helper
4960: 20 24 63 6c 61 73 73 20 24 63 20 24 6f 70 65 6e   $class $c $open
4970: 32 20 5b 63 6f 6e 63 61 74 20 24 65 78 63 6c 75  2 [concat $exclu
4980: 64 65 20 24 63 78 5d 0a 20 20 20 20 7d 20 20 0a  de $cx].    }  .
4990: 20 20 7d 0a 20 20 70 75 74 73 20 24 68 64 28 24    }.  puts $hd($
49a0: 63 6c 61 73 73 29 20 22 3c 2f 64 69 76 3e 22 0a  class) "</div>".
49b0: 7d 0a 70 72 6f 63 20 52 65 63 75 72 73 69 76 65  }.proc Recursive
49c0: 42 75 62 62 6c 65 44 69 61 67 72 61 6d 20 7b 61  BubbleDiagram {a
49d0: 72 67 73 7d 20 7b 0a 20 20 67 6c 6f 62 61 6c 20  rgs} {.  global 
49e0: 68 64 0a 20 20 73 65 74 20 73 68 6f 77 20 31 0a  hd.  set show 1.
49f0: 20 20 73 65 74 20 61 32 20 7b 7d 0a 20 20 66 6f    set a2 {}.  fo
4a00: 72 65 61 63 68 20 6e 61 6d 65 20 24 61 72 67 73  reach name $args
4a10: 20 7b 0a 20 20 20 20 69 66 20 7b 24 6e 61 6d 65   {.    if {$name
4a20: 3d 3d 22 2d 2d 69 6e 69 74 69 61 6c 6c 79 2d 68  =="--initially-h
4a30: 69 64 64 65 6e 22 7d 20 7b 0a 20 20 20 20 20 20  idden"} {.      
4a40: 73 65 74 20 73 68 6f 77 20 30 0a 20 20 20 20 7d  set show 0.    }
4a50: 20 65 6c 73 65 20 7b 0a 20 20 20 20 20 20 6c 61   else {.      la
4a60: 70 70 65 6e 64 20 61 32 20 24 6e 61 6d 65 0a 20  ppend a2 $name. 
4a70: 20 20 20 7d 0a 20 20 7d 0a 20 20 69 66 20 7b 24     }.  }.  if {$
4a80: 73 68 6f 77 7d 20 7b 0a 20 20 20 20 73 65 74 20  show} {.    set 
4a90: 73 68 6f 77 6c 69 73 74 20 24 61 32 0a 20 20 7d  showlist $a2.  }
4aa0: 20 65 6c 73 65 20 7b 0a 20 20 20 20 73 65 74 20   else {.    set 
4ab0: 73 68 6f 77 6c 69 73 74 20 7b 7d 0a 20 20 7d 0a  showlist {}.  }.
4ac0: 20 20 73 65 74 20 6e 61 6d 65 20 5b 6c 69 6e 64    set name [lind
4ad0: 65 78 20 24 61 32 20 30 5d 0a 20 20 69 66 20 7b  ex $a2 0].  if {
4ae0: 24 68 64 28 65 6e 61 62 6c 65 2d 6d 61 69 6e 29  $hd(enable-main)
4af0: 7d 20 7b 0a 20 20 20 20 52 65 63 75 72 73 69 76  } {.    Recursiv
4b00: 65 42 75 62 62 6c 65 44 69 61 67 72 61 6d 5f 68  eBubbleDiagram_h
4b10: 65 6c 70 65 72 20 6d 61 69 6e 20 24 6e 61 6d 65  elper main $name
4b20: 20 24 73 68 6f 77 6c 69 73 74 20 24 6e 61 6d 65   $showlist $name
4b30: 0a 20 20 7d 0a 20 20 69 66 20 7b 24 68 64 28 65  .  }.  if {$hd(e
4b40: 6e 61 62 6c 65 2d 61 75 78 29 7d 20 7b 0a 20 20  nable-aux)} {.  
4b50: 20 20 52 65 63 75 72 73 69 76 65 42 75 62 62 6c    RecursiveBubbl
4b60: 65 44 69 61 67 72 61 6d 5f 68 65 6c 70 65 72 20  eDiagram_helper 
4b70: 61 75 78 20 24 6e 61 6d 65 20 24 73 68 6f 77 6c  aux $name $showl
4b80: 69 73 74 20 24 6e 61 6d 65 0a 20 20 7d 0a 7d 0a  ist $name.  }.}.
4b90: 0a 0a 0a 23 20 49 6e 73 65 72 74 20 61 20 53 65  ...# Insert a Se
4ba0: 65 20 41 6c 73 6f 20 6c 69 6e 65 20 66 6f 72 20  e Also line for 
4bb0: 72 65 6c 61 74 65 64 20 62 75 62 62 6c 65 0a 0a  related bubble..
4bc0: 23 20 52 65 63 6f 72 64 20 61 20 72 65 71 75 69  # Record a requi
4bd0: 72 65 6d 65 6e 74 2e 20 20 54 68 69 73 20 70 72  rement.  This pr
4be0: 6f 63 65 64 75 72 65 20 69 73 20 61 63 74 69 76  ocedure is activ
4bf0: 65 20 6f 6e 6c 79 20 66 6f 72 20 74 68 65 20 66  e only for the f
4c00: 69 72 73 74 0a 23 20 70 61 73 73 2e 20 20 54 68  irst.# pass.  Th
4c10: 69 73 20 70 72 6f 63 65 64 75 72 65 20 62 65 63  is procedure bec
4c20: 6f 6d 65 73 20 61 20 6e 6f 2d 6f 70 20 66 6f 72  omes a no-op for
4c30: 20 74 68 65 20 73 65 63 6f 6e 64 20 70 61 73 73   the second pass
4c40: 2e 20 20 44 75 72 69 6e 67 0a 23 20 74 68 65 20  .  During.# the 
4c50: 73 65 63 6f 6e 64 20 70 61 73 73 2c 20 72 65 71  second pass, req
4c60: 75 69 72 65 6d 65 6e 74 73 20 6c 69 73 74 69 6e  uirements listin
4c70: 67 20 72 65 70 6f 72 74 20 67 65 6e 65 72 61 74  g report generat
4c80: 6f 72 73 20 63 61 6e 20 75 73 65 20 74 68 65 0a  ors can use the.
4c90: 23 20 64 61 74 61 20 61 63 63 75 6d 75 6c 61 74  # data accumulat
4ca0: 65 64 20 64 75 72 69 6e 67 20 74 68 65 20 66 69  ed during the fi
4cb0: 72 73 74 20 70 61 73 73 20 74 6f 20 63 6f 6e 73  rst pass to cons
4cc0: 74 72 75 63 74 20 74 68 65 69 72 20 72 65 70 6f  truct their repo
4cd0: 72 74 73 2e 0a 23 0a 23 20 49 66 20 74 68 65 20  rts..#.# If the 
4ce0: 22 76 65 72 62 61 74 69 6d 22 20 61 72 67 75 6d  "verbatim" argum
4cf0: 65 6e 74 20 69 73 20 74 72 75 65 2c 20 74 68 65  ent is true, the
4d00: 6e 20 74 68 65 20 72 65 71 75 69 72 65 6d 65 6e  n the requiremen
4d10: 74 20 74 65 78 74 20 69 73 0a 23 20 72 65 6e 64  t text is.# rend
4d20: 65 72 65 64 20 61 73 20 69 73 2e 20 20 49 6e 20  ered as is.  In 
4d30: 6f 74 68 65 72 20 77 6f 72 64 73 2c 20 74 68 65  other words, the
4d40: 20 72 65 71 75 69 72 65 6d 65 6e 74 20 74 65 78   requirement tex
4d50: 74 20 69 73 20 61 73 73 75 6d 65 64 20 74 6f 0a  t is assumed to.
4d60: 23 20 62 65 20 76 61 6c 69 64 20 48 54 4d 4c 20  # be valid HTML 
4d70: 77 69 74 68 20 61 6c 6c 20 68 79 70 65 72 6c 69  with all hyperli
4d80: 6e 6b 73 20 61 6c 72 65 61 64 79 20 72 65 73 6f  nks already reso
4d90: 6c 76 65 64 2e 20 20 49 66 20 74 68 65 20 22 76  lved.  If the "v
4da0: 65 72 62 61 74 69 6d 22 0a 23 20 61 72 67 75 6d  erbatim".# argum
4db0: 65 6e 74 20 69 73 20 66 61 6c 73 65 20 28 74 68  ent is false (th
4dc0: 65 20 64 65 66 61 75 6c 74 29 20 74 68 65 6e 20  e default) then 
4dd0: 74 68 65 20 72 65 71 75 69 72 65 6d 65 6e 74 20  the requirement 
4de0: 74 65 78 74 20 69 73 20 72 65 6e 64 65 72 65 64  text is rendered
4df0: 0a 23 20 75 73 69 6e 67 20 68 64 5f 72 65 6e 64  .# using hd_rend
4e00: 65 72 20 77 68 69 63 68 20 77 69 6c 6c 20 66 69  er which will fi
4e10: 6e 64 20 61 6e 20 65 78 70 61 6e 64 20 68 79 70  nd an expand hyp
4e20: 65 72 6c 69 6e 6b 73 20 77 69 74 68 69 6e 20 74  erlinks within t
4e30: 68 65 20 74 65 78 74 2e 0a 23 0a 23 20 54 68 65  he text..#.# The
4e40: 20 22 63 6f 6d 6d 65 6e 74 22 20 61 72 67 75 6d   "comment" argum
4e50: 65 6e 74 20 69 73 20 6e 6f 6e 2d 62 69 6e 64 69  ent is non-bindi
4e60: 6e 67 20 63 6f 6d 6d 65 6e 74 61 72 79 20 61 6e  ng commentary an
4e70: 64 20 65 78 70 6c 61 6e 61 74 69 6f 6e 20 74 68  d explanation th
4e80: 61 74 0a 23 20 61 63 63 6f 6d 70 61 6e 69 65 73  at.# accompanies
4e90: 20 74 68 65 20 72 65 71 75 69 72 65 6d 65 6e 74   the requirement
4ea0: 2e 0a 23 0a 70 72 6f 63 20 68 64 5f 72 65 71 75  ..#.proc hd_requ
4eb0: 69 72 65 6d 65 6e 74 20 7b 69 64 20 74 65 78 74  irement {id text
4ec0: 20 64 65 72 69 76 65 64 66 72 6f 6d 20 63 6f 6d   derivedfrom com
4ed0: 6d 65 6e 74 7d 20 7b 0a 20 20 67 6c 6f 62 61 6c  ment} {.  global
4ee0: 20 41 4c 4c 52 45 51 20 41 4c 4c 52 45 51 5f 44   ALLREQ ALLREQ_D
4ef0: 45 52 49 56 45 44 46 52 4f 4d 20 41 4c 4c 52 45  ERIVEDFROM ALLRE
4f00: 51 5f 43 4f 4d 0a 20 20 69 66 20 7b 5b 69 6e 66  Q_COM.  if {[inf
4f10: 6f 20 65 78 69 73 74 73 20 41 4c 4c 52 45 51 28  o exists ALLREQ(
4f20: 24 69 64 29 5d 7d 20 7b 0a 20 20 20 20 70 75 74  $id)]} {.    put
4f30: 73 20 73 74 64 65 72 72 20 22 64 75 70 6c 69 63  s stderr "duplic
4f40: 61 74 65 20 72 65 71 75 69 72 65 6d 65 6e 74 20  ate requirement 
4f50: 6c 61 62 65 6c 3a 20 24 69 64 22 0a 20 20 7d 0a  label: $id".  }.
4f60: 20 20 73 65 74 20 41 4c 4c 52 45 51 5f 44 45 52    set ALLREQ_DER
4f70: 49 56 45 44 46 52 4f 4d 28 24 69 64 29 20 24 64  IVEDFROM($id) $d
4f80: 65 72 69 76 65 64 66 72 6f 6d 0a 20 20 73 65 74  erivedfrom.  set
4f90: 20 41 4c 4c 52 45 51 28 24 69 64 29 20 24 74 65   ALLREQ($id) $te
4fa0: 78 74 0a 20 20 73 65 74 20 41 4c 4c 52 45 51 5f  xt.  set ALLREQ_
4fb0: 43 4f 4d 28 24 69 64 29 20 24 63 6f 6d 6d 65 6e  COM($id) $commen
4fc0: 74 0a 7d 0a 0a 23 20 52 65 61 64 20 61 20 62 6c  t.}..# Read a bl
4fd0: 6f 63 6b 20 6f 66 20 72 65 71 75 69 72 65 6d 65  ock of requireme
4fe0: 6e 74 73 20 66 72 6f 6d 20 61 6e 20 41 53 43 49  nts from an ASCI
4ff0: 49 20 74 65 78 74 20 66 69 6c 65 2e 20 20 53 74  I text file.  St
5000: 6f 72 65 20 74 68 65 0a 23 20 69 6e 66 6f 72 6d  ore the.# inform
5010: 61 74 69 6f 6e 20 6f 62 74 61 69 6e 65 64 20 69  ation obtained i
5020: 6e 20 61 20 67 6c 6f 62 61 6c 20 76 61 72 69 61  n a global varia
5030: 62 6c 65 20 6e 61 6d 65 64 20 62 79 20 74 68 65  ble named by the
5040: 20 73 65 63 6f 6e 64 20 70 61 72 61 6d 65 74 65   second paramete
5050: 72 2e 0a 23 0a 70 72 6f 63 20 68 64 5f 72 65 61  r..#.proc hd_rea
5060: 64 5f 72 65 71 75 69 72 65 6d 65 6e 74 5f 66 69  d_requirement_fi
5070: 6c 65 20 7b 66 69 6c 65 6e 61 6d 65 20 76 61 72  le {filename var
5080: 6e 61 6d 65 7d 20 7b 0a 20 20 67 6c 6f 62 61 6c  name} {.  global
5090: 20 68 64 5f 72 65 71 5f 72 64 72 0a 20 20 68 64   hd_req_rdr.  hd
50a0: 5f 72 65 73 65 74 5f 72 65 71 75 69 72 65 6d 65  _reset_requireme
50b0: 6e 74 5f 72 65 61 64 65 72 0a 20 20 73 65 74 20  nt_reader.  set 
50c0: 69 6e 20 5b 6f 70 65 6e 20 24 66 69 6c 65 6e 61  in [open $filena
50d0: 6d 65 5d 0a 20 20 77 68 69 6c 65 20 7b 21 5b 65  me].  while {![e
50e0: 6f 66 20 24 69 6e 5d 7d 20 7b 0a 20 20 20 20 73  of $in]} {.    s
50f0: 65 74 20 6c 69 6e 65 20 5b 67 65 74 73 20 24 69  et line [gets $i
5100: 6e 5d 0a 20 20 20 20 69 66 20 7b 5b 72 65 67 65  n].    if {[rege
5110: 78 70 20 7b 5e 28 48 4c 52 7c 55 4e 44 45 46 7c  xp {^(HLR|UNDEF|
5120: 53 59 53 52 45 51 29 20 2b 28 5b 4c 48 53 55 5d  SYSREQ) +([LHSU]
5130: 5c 64 2b 29 20 2a 28 2e 2a 29 7d 20 24 6c 69 6e  \d+) *(.*)} $lin
5140: 65 20 61 6c 6c 20 74 79 70 65 20 72 6e 20 64 66  e all type rn df
5150: 5d 7d 20 7b 0a 20 20 20 20 20 20 68 64 5f 61 64  ]} {.      hd_ad
5160: 64 5f 6f 6e 65 5f 72 65 71 75 69 72 65 6d 65 6e  d_one_requiremen
5170: 74 20 24 76 61 72 6e 61 6d 65 0a 20 20 20 20 20  t $varname.     
5180: 20 73 65 74 20 68 64 5f 72 65 71 5f 72 64 72 28   set hd_req_rdr(
5190: 72 6e 29 20 24 72 6e 0a 20 20 20 20 20 20 73 65  rn) $rn.      se
51a0: 74 20 68 64 5f 72 65 71 5f 72 64 72 28 64 65 72  t hd_req_rdr(der
51b0: 69 76 65 64 29 20 24 64 66 0a 20 20 20 20 7d 20  ived) $df.    } 
51c0: 65 6c 73 65 69 66 20 7b 5b 73 74 72 69 6e 67 20  elseif {[string 
51d0: 74 72 69 6d 20 24 6c 69 6e 65 5d 3d 3d 22 22 7d  trim $line]==""}
51e0: 20 7b 0a 20 20 20 20 20 20 69 66 20 7b 24 68 64   {.      if {$hd
51f0: 5f 72 65 71 5f 72 64 72 28 62 6f 64 79 29 3d 3d  _req_rdr(body)==
5200: 22 22 7d 20 7b 0a 20 20 20 20 20 20 20 20 73 65  ""} {.        se
5210: 74 20 68 64 5f 72 65 71 5f 72 64 72 28 62 6f 64  t hd_req_rdr(bod
5220: 79 29 20 24 68 64 5f 72 65 71 5f 72 64 72 28 63  y) $hd_req_rdr(c
5230: 6f 6d 6d 65 6e 74 29 0a 20 20 20 20 20 20 20 20  omment).        
5240: 73 65 74 20 68 64 5f 72 65 71 5f 72 64 72 28 63  set hd_req_rdr(c
5250: 6f 6d 6d 65 6e 74 29 20 7b 7d 0a 20 20 20 20 20  omment) {}.     
5260: 20 7d 20 65 6c 73 65 20 7b 0a 20 20 20 20 20 20   } else {.      
5270: 20 20 61 70 70 65 6e 64 20 68 64 5f 72 65 71 5f    append hd_req_
5280: 72 64 72 28 63 6f 6d 6d 65 6e 74 29 20 5c 6e 0a  rdr(comment) \n.
5290: 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 20 65 6c        }.    } el
52a0: 73 65 20 7b 0a 20 20 20 20 20 20 61 70 70 65 6e  se {.      appen
52b0: 64 20 68 64 5f 72 65 71 5f 72 64 72 28 63 6f 6d  d hd_req_rdr(com
52c0: 6d 65 6e 74 29 20 24 6c 69 6e 65 5c 6e 0a 20 20  ment) $line\n.  
52d0: 20 20 7d 0a 20 20 7d 0a 20 20 68 64 5f 61 64 64    }.  }.  hd_add
52e0: 5f 6f 6e 65 5f 72 65 71 75 69 72 65 6d 65 6e 74  _one_requirement
52f0: 20 24 76 61 72 6e 61 6d 65 0a 20 20 63 6c 6f 73   $varname.  clos
5300: 65 20 24 69 6e 0a 20 20 0a 7d 0a 70 72 6f 63 20  e $in.  .}.proc 
5310: 68 64 5f 72 65 73 65 74 5f 72 65 71 75 69 72 65  hd_reset_require
5320: 6d 65 6e 74 5f 72 65 61 64 65 72 20 7b 7d 20 7b  ment_reader {} {
5330: 0a 20 20 67 6c 6f 62 61 6c 20 68 64 5f 72 65 71  .  global hd_req
5340: 5f 72 64 72 0a 20 20 73 65 74 20 68 64 5f 72 65  _rdr.  set hd_re
5350: 71 5f 72 64 72 28 72 6e 29 20 7b 7d 0a 20 20 73  q_rdr(rn) {}.  s
5360: 65 74 20 68 64 5f 72 65 71 5f 72 64 72 28 63 6f  et hd_req_rdr(co
5370: 6d 6d 65 6e 74 29 20 7b 7d 0a 20 20 73 65 74 20  mment) {}.  set 
5380: 68 64 5f 72 65 71 5f 72 64 72 28 62 6f 64 79 29  hd_req_rdr(body)
5390: 20 7b 7d 0a 20 20 73 65 74 20 68 64 5f 72 65 71   {}.  set hd_req
53a0: 5f 72 64 72 28 64 65 72 69 76 65 64 29 20 7b 7d  _rdr(derived) {}
53b0: 0a 7d 0a 70 72 6f 63 20 68 64 5f 61 64 64 5f 6f  .}.proc hd_add_o
53c0: 6e 65 5f 72 65 71 75 69 72 65 6d 65 6e 74 20 7b  ne_requirement {
53d0: 76 61 72 6e 61 6d 65 7d 20 7b 0a 20 20 67 6c 6f  varname} {.  glo
53e0: 62 61 6c 20 68 64 5f 72 65 71 5f 72 64 72 0a 20  bal hd_req_rdr. 
53f0: 20 73 65 74 20 72 6e 20 24 68 64 5f 72 65 71 5f   set rn $hd_req_
5400: 72 64 72 28 72 6e 29 0a 20 20 69 66 20 7b 24 72  rdr(rn).  if {$r
5410: 6e 21 3d 22 22 7d 20 7b 0a 20 20 20 20 69 66 20  n!=""} {.    if 
5420: 7b 24 68 64 5f 72 65 71 5f 72 64 72 28 62 6f 64  {$hd_req_rdr(bod
5430: 79 29 3d 3d 22 22 7d 20 7b 0a 20 20 20 20 20 20  y)==""} {.      
5440: 73 65 74 20 68 64 5f 72 65 71 5f 72 64 72 28 62  set hd_req_rdr(b
5450: 6f 64 79 29 20 24 68 64 5f 72 65 71 5f 72 64 72  ody) $hd_req_rdr
5460: 28 63 6f 6d 6d 65 6e 74 29 0a 20 20 20 20 20 20  (comment).      
5470: 73 65 74 20 68 64 5f 72 65 71 5f 72 64 72 28 63  set hd_req_rdr(c
5480: 6f 6d 6d 65 6e 74 29 20 7b 7d 0a 20 20 20 20 7d  omment) {}.    }
5490: 0a 20 20 20 20 73 65 74 20 62 20 5b 73 74 72 69  .    set b [stri
54a0: 6e 67 20 74 72 69 6d 20 24 68 64 5f 72 65 71 5f  ng trim $hd_req_
54b0: 72 64 72 28 62 6f 64 79 29 5d 0a 20 20 20 20 73  rdr(body)].    s
54c0: 65 74 20 63 20 5b 73 74 72 69 6e 67 20 74 72 69  et c [string tri
54d0: 6d 20 24 68 64 5f 72 65 71 5f 72 64 72 28 63 6f  m $hd_req_rdr(co
54e0: 6d 6d 65 6e 74 29 5d 0a 20 20 20 20 73 65 74 20  mment)].    set 
54f0: 3a 3a 24 7b 76 61 72 6e 61 6d 65 7d 28 24 72 6e  ::${varname}($rn
5500: 29 20 5b 6c 69 73 74 20 24 68 64 5f 72 65 71 5f  ) [list $hd_req_
5510: 72 64 72 28 64 65 72 69 76 65 64 29 20 24 62 20  rdr(derived) $b 
5520: 24 63 5d 0a 20 20 20 20 6c 61 70 70 65 6e 64 20  $c].    lappend 
5530: 3a 3a 24 7b 76 61 72 6e 61 6d 65 7d 28 2a 29 20  ::${varname}(*) 
5540: 24 72 6e 0a 20 20 7d 0a 20 20 68 64 5f 72 65 73  $rn.  }.  hd_res
5550: 65 74 5f 72 65 71 75 69 72 65 6d 65 6e 74 5f 72  et_requirement_r
5560: 65 61 64 65 72 0a 7d 0a 0a 23 20 46 69 72 73 74  eader.}..# First
5570: 20 70 61 73 73 2e 20 20 50 72 6f 63 65 73 73 20   pass.  Process 
5580: 61 6c 6c 20 66 69 6c 65 73 2e 20 20 42 75 74 20  all files.  But 
5590: 64 6f 20 6e 6f 74 20 72 65 6e 64 65 72 20 68 79  do not render hy
55a0: 70 65 72 6c 69 6e 6b 73 2e 0a 23 20 4d 65 72 65  perlinks..# Mere
55b0: 6c 79 20 63 6f 6c 6c 65 63 74 20 6b 65 79 77 6f  ly collect keywo
55c0: 72 64 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 73  rd information s
55d0: 6f 20 74 68 61 74 20 68 79 70 65 72 6c 69 6e 6b  o that hyperlink
55e0: 73 20 63 61 6e 20 62 65 0a 23 20 63 6f 72 72 65  s can be.# corre
55f0: 63 74 6c 79 20 72 65 6e 64 65 72 65 64 20 6f 6e  ctly rendered on
5600: 20 74 68 65 20 73 65 63 6f 6e 64 20 70 61 73 73   the second pass
5610: 2e 0a 23 0a 66 6f 72 65 61 63 68 20 69 6e 66 69  ..#.foreach infi
5620: 6c 65 20 5b 6c 72 61 6e 67 65 20 24 61 72 67 76  le [lrange $argv
5630: 20 33 20 65 6e 64 5d 20 7b 0a 20 20 63 64 20 24   3 end] {.  cd $
5640: 48 4f 4d 45 44 49 52 0a 20 20 70 75 74 73 20 22  HOMEDIR.  puts "
5650: 50 72 6f 63 65 73 73 69 6e 67 20 24 69 6e 66 69  Processing $infi
5660: 6c 65 22 0a 20 20 73 65 74 20 66 64 20 5b 6f 70  le".  set fd [op
5670: 65 6e 20 24 69 6e 66 69 6c 65 20 72 5d 0a 20 20  en $infile r].  
5680: 73 65 74 20 69 6e 20 5b 72 65 61 64 20 24 66 64  set in [read $fd
5690: 5d 0a 20 20 63 6c 6f 73 65 20 24 66 64 0a 20 20  ].  close $fd.  
56a0: 69 66 20 7b 5b 72 65 67 65 78 70 20 7b 3c 28 66  if {[regexp {<(f
56b0: 61 6e 63 79 5f 66 6f 72 6d 61 74 7c 74 61 62 6c  ancy_format|tabl
56c0: 65 5f 6f 66 5f 63 6f 6e 74 65 6e 74 73 29 3e 7d  e_of_contents)>}
56d0: 20 24 69 6e 5d 7d 20 7b 20 73 65 74 20 69 6e 20   $in]} { set in 
56e0: 5b 61 64 64 74 6f 63 20 24 69 6e 5d 20 7d 0a 20  [addtoc $in] }. 
56f0: 20 73 65 74 20 74 69 74 6c 65 20 7b 4e 6f 20 54   set title {No T
5700: 69 74 6c 65 7d 0a 20 20 72 65 67 65 78 70 20 7b  itle}.  regexp {
5710: 3c 74 69 74 6c 65 3e 28 5b 5e 5c 6e 5d 2a 29 3c  <title>([^\n]*)<
5720: 2f 74 69 74 6c 65 3e 7d 20 24 69 6e 20 61 6c 6c  /title>} $in all
5730: 20 74 69 74 6c 65 0a 20 20 72 65 67 73 75 62 20   title.  regsub 
5740: 7b 3c 74 69 74 6c 65 3e 5b 5e 5c 6e 5d 2a 3c 2f  {<title>[^\n]*</
5750: 74 69 74 6c 65 3e 7d 20 24 69 6e 20 7b 7d 20 69  title>} $in {} i
5760: 6e 0a 20 20 73 65 74 20 6f 75 74 66 69 6c 65 20  n.  set outfile 
5770: 5b 66 69 6c 65 20 72 6f 6f 74 20 5b 66 69 6c 65  [file root [file
5780: 20 74 61 69 6c 20 24 69 6e 66 69 6c 65 5d 5d 2e   tail $infile]].
5790: 68 74 6d 6c 0a 20 20 68 64 5f 6f 70 65 6e 5f 6d  html.  hd_open_m
57a0: 61 69 6e 20 24 6f 75 74 66 69 6c 65 0a 20 20 64  ain $outfile.  d
57b0: 62 20 65 76 61 6c 20 7b 0a 20 20 20 20 49 4e 53  b eval {.    INS
57c0: 45 52 54 20 49 4e 54 4f 20 70 61 67 65 28 66 69  ERT INTO page(fi
57d0: 6c 65 6e 61 6d 65 2c 70 61 67 65 74 69 74 6c 65  lename,pagetitle
57e0: 29 0a 20 20 20 20 56 41 4c 55 45 53 28 24 6f 75  ).    VALUES($ou
57f0: 74 66 69 6c 65 2c 24 74 69 74 6c 65 29 3b 0a 20  tfile,$title);. 
5800: 20 7d 0a 20 20 73 65 74 20 68 28 70 61 67 65 69   }.  set h(pagei
5810: 64 29 20 5b 64 62 20 6c 61 73 74 5f 69 6e 73 65  d) [db last_inse
5820: 72 74 5f 72 6f 77 69 64 5d 0a 20 20 68 64 5f 68  rt_rowid].  hd_h
5830: 65 61 64 65 72 20 24 74 69 74 6c 65 20 24 69 6e  eader $title $in
5840: 66 69 6c 65 0a 20 20 72 65 67 73 75 62 20 2d 61  file.  regsub -a
5850: 6c 6c 20 7b 3c 74 63 6c 3e 7d 20 24 69 6e 20 22  ll {<tcl>} $in "
5860: 5c 31 37 35 3b 20 65 76 61 6c 20 5c 31 37 33 22  \175; eval \173"
5870: 20 69 6e 0a 20 20 72 65 67 73 75 62 20 2d 61 6c   in.  regsub -al
5880: 6c 20 7b 3c 2f 74 63 6c 3e 7d 20 24 69 6e 20 22  l {</tcl>} $in "
5890: 5c 31 37 35 3b 20 68 64 5f 70 75 74 73 20 5c 31  \175; hd_puts \1
58a0: 37 33 22 20 69 6e 0a 20 20 65 76 61 6c 20 22 68  73" in.  eval "h
58b0: 64 5f 70 75 74 73 20 5c 31 37 33 24 69 6e 5c 31  d_puts \173$in\1
58c0: 37 35 22 0a 20 20 63 64 20 24 3a 3a 48 4f 4d 45  75".  cd $::HOME
58d0: 44 49 52 0a 20 20 68 64 5f 63 6c 6f 73 65 5f 6d  DIR.  hd_close_m
58e0: 61 69 6e 0a 7d 0a 0a 23 20 53 65 63 6f 6e 64 20  ain.}..# Second 
58f0: 70 61 73 73 2e 20 20 50 72 6f 63 65 73 73 20 61  pass.  Process a
5900: 6c 6c 20 66 69 6c 65 73 20 61 67 61 69 6e 2e 20  ll files again. 
5910: 20 54 68 69 73 20 74 69 6d 65 20 72 65 6e 64 65   This time rende
5920: 72 20 68 79 70 65 72 6c 69 6e 6b 73 0a 23 20 61  r hyperlinks.# a
5930: 63 63 6f 72 64 69 6e 67 20 74 6f 20 74 68 65 20  ccording to the 
5940: 6b 65 79 77 6f 72 64 20 69 6e 66 6f 72 6d 61 74  keyword informat
5950: 69 6f 6e 20 63 6f 6c 6c 65 63 74 65 64 20 6f 6e  ion collected on
5960: 20 74 68 65 20 66 69 72 73 74 20 70 61 73 73 2e   the first pass.
5970: 0a 23 0a 70 72 6f 63 20 68 64 5f 6b 65 79 77 6f  .#.proc hd_keywo
5980: 72 64 73 20 7b 61 72 67 73 7d 20 7b 7d 0a 72 65  rds {args} {}.re
5990: 6e 61 6d 65 20 68 64 5f 72 65 73 6f 6c 76 65 20  name hd_resolve 
59a0: 7b 7d 0a 72 65 6e 61 6d 65 20 68 64 5f 72 65 73  {}.rename hd_res
59b0: 6f 6c 76 65 5f 32 6e 64 70 61 73 73 20 68 64 5f  olve_2ndpass hd_
59c0: 72 65 73 6f 6c 76 65 0a 70 72 6f 63 20 68 64 5f  resolve.proc hd_
59d0: 72 65 71 75 69 72 65 6d 65 6e 74 20 7b 61 72 67  requirement {arg
59e0: 73 7d 20 7b 7d 0a 73 65 74 20 66 6f 6f 74 65 72  s} {}.set footer
59f0: 74 63 6c 20 5b 66 69 6c 65 20 6e 6f 72 6d 61 6c  tcl [file normal
5a00: 69 7a 65 20 5b 66 69 6c 65 20 6a 6f 69 6e 20 24  ize [file join $
5a10: 3a 3a 44 4f 43 20 70 61 67 65 73 20 66 6f 6f 74  ::DOC pages foot
5a20: 65 72 2e 74 63 6c 5d 5d 0a 66 6f 72 65 61 63 68  er.tcl]].foreach
5a30: 20 69 6e 66 69 6c 65 20 5b 6c 72 61 6e 67 65 20   infile [lrange 
5a40: 24 61 72 67 76 20 33 20 65 6e 64 5d 20 7b 0a 20  $argv 3 end] {. 
5a50: 20 63 64 20 24 48 4f 4d 45 44 49 52 0a 20 20 70   cd $HOMEDIR.  p
5a60: 75 74 73 20 22 50 72 6f 63 65 73 73 69 6e 67 20  uts "Processing 
5a70: 24 69 6e 66 69 6c 65 22 0a 20 20 73 65 74 20 66  $infile".  set f
5a80: 64 20 5b 6f 70 65 6e 20 24 69 6e 66 69 6c 65 20  d [open $infile 
5a90: 72 5d 0a 20 20 73 65 74 20 69 6e 20 5b 72 65 61  r].  set in [rea
5aa0: 64 20 24 66 64 5d 0a 20 20 63 6c 6f 73 65 20 24  d $fd].  close $
5ab0: 66 64 0a 20 20 69 66 20 7b 5b 72 65 67 65 78 70  fd.  if {[regexp
5ac0: 20 7b 3c 28 66 61 6e 63 79 5f 66 6f 72 6d 61 74   {<(fancy_format
5ad0: 7c 74 61 62 6c 65 5f 6f 66 5f 63 6f 6e 74 65 6e  |table_of_conten
5ae0: 74 73 29 3e 7d 20 24 69 6e 5d 7d 20 7b 20 73 65  ts)>} $in]} { se
5af0: 74 20 69 6e 20 5b 61 64 64 74 6f 63 20 24 69 6e  t in [addtoc $in
5b00: 5d 20 7d 0a 20 20 73 65 74 20 74 69 74 6c 65 20  ] }.  set title 
5b10: 7b 4e 6f 20 54 69 74 6c 65 7d 0a 20 20 72 65 67  {No Title}.  reg
5b20: 65 78 70 20 7b 3c 74 69 74 6c 65 3e 28 5b 5e 5c  exp {<title>([^\
5b30: 6e 5d 2a 29 3c 2f 74 69 74 6c 65 3e 7d 20 24 69  n]*)</title>} $i
5b40: 6e 20 61 6c 6c 20 74 69 74 6c 65 0a 20 20 72 65  n all title.  re
5b50: 67 73 75 62 20 7b 3c 74 69 74 6c 65 3e 5b 5e 5c  gsub {<title>[^\
5b60: 6e 5d 2a 3c 2f 74 69 74 6c 65 3e 7d 20 24 69 6e  n]*</title>} $in
5b70: 20 7b 7d 20 69 6e 0a 20 20 73 65 74 20 6f 75 74   {} in.  set out
5b80: 66 69 6c 65 20 5b 66 69 6c 65 20 72 6f 6f 74 20  file [file root 
5b90: 5b 66 69 6c 65 20 74 61 69 6c 20 24 69 6e 66 69  [file tail $infi
5ba0: 6c 65 5d 5d 2e 68 74 6d 6c 0a 20 20 68 64 5f 6f  le]].html.  hd_o
5bb0: 70 65 6e 5f 6d 61 69 6e 20 24 6f 75 74 66 69 6c  pen_main $outfil
5bc0: 65 0a 20 20 68 64 5f 68 65 61 64 65 72 20 24 74  e.  hd_header $t
5bd0: 69 74 6c 65 20 24 69 6e 66 69 6c 65 0a 20 20 72  itle $infile.  r
5be0: 65 67 73 75 62 20 2d 61 6c 6c 20 7b 3c 74 63 6c  egsub -all {<tcl
5bf0: 3e 7d 20 24 69 6e 20 22 5c 31 37 35 3b 20 65 76  >} $in "\175; ev
5c00: 61 6c 20 5c 31 37 33 22 20 69 6e 0a 20 20 72 65  al \173" in.  re
5c10: 67 73 75 62 20 2d 61 6c 6c 20 7b 3c 2f 74 63 6c  gsub -all {</tcl
5c20: 3e 7d 20 24 69 6e 20 22 5c 31 37 35 3b 20 68 64  >} $in "\175; hd
5c30: 5f 72 65 73 6f 6c 76 65 20 5c 31 37 33 22 20 69  _resolve \173" i
5c40: 6e 0a 20 20 65 76 61 6c 20 22 68 64 5f 72 65 73  n.  eval "hd_res
5c50: 6f 6c 76 65 20 5c 31 37 33 24 69 6e 5c 31 37 35  olve \173$in\175
5c60: 22 0a 20 20 23 20 73 6f 75 72 63 65 20 24 66 6f  ".  # source $fo
5c70: 6f 74 65 72 74 63 6c 0a 20 20 63 64 20 24 3a 3a  otertcl.  cd $::
5c80: 48 4f 4d 45 44 49 52 0a 20 20 68 64 5f 63 6c 6f  HOMEDIR.  hd_clo
5c90: 73 65 5f 6d 61 69 6e 0a 7d 0a 0a 23 20 47 65 6e  se_main.}..# Gen
5ca0: 65 72 61 74 65 20 61 20 64 6f 63 75 6d 65 6e 74  erate a document
5cb0: 20 73 68 6f 77 69 6e 67 20 74 68 65 20 68 79 70   showing the hyp
5cc0: 65 72 6c 69 6e 6b 20 6b 65 79 77 6f 72 64 73 20  erlink keywords 
5cd0: 61 6e 64 20 74 68 65 69 72 0a 23 20 74 61 72 67  and their.# targ
5ce0: 65 74 73 2e 0a 23 0a 68 64 5f 6f 70 65 6e 5f 6d  ets..#.hd_open_m
5cf0: 61 69 6e 20 64 6f 63 5f 6b 65 79 77 6f 72 64 5f  ain doc_keyword_
5d00: 63 72 6f 73 73 72 65 66 2e 68 74 6d 6c 0a 68 64  crossref.html.hd
5d10: 5f 68 65 61 64 65 72 20 7b 4b 65 79 77 6f 72 64  _header {Keyword
5d20: 20 43 72 6f 73 73 72 65 66 65 72 65 6e 63 65 7d   Crossreference}
5d30: 20 24 44 4f 43 2f 77 72 61 70 2e 74 63 6c 0a 68   $DOC/wrap.tcl.h
5d40: 64 5f 70 75 74 73 20 22 3c 75 6c 3e 22 0a 66 6f  d_puts "<ul>".fo
5d50: 72 65 61 63 68 20 78 20 5b 6c 73 6f 72 74 20 2d  reach x [lsort -
5d60: 64 69 63 74 20 5b 61 72 72 61 79 20 6e 61 6d 65  dict [array name
5d70: 73 20 67 6c 69 6e 6b 5d 5d 20 7b 0a 20 20 73 65  s glink]] {.  se
5d80: 74 20 79 20 24 67 6c 69 6e 6b 28 24 78 29 0a 20  t y $glink($x). 
5d90: 20 68 64 5f 70 75 74 73 20 22 3c 6c 69 3e 24 78   hd_puts "<li>$x
5da0: 20 2d 20 3c 61 20 68 72 65 66 3d 5c 22 24 79 5c   - <a href=\"$y\
5db0: 22 3e 24 79 3c 2f 61 3e 3c 2f 6c 69 3e 22 0a 20  ">$y</a></li>". 
5dc0: 20 6c 61 70 70 65 6e 64 20 72 65 76 67 6c 69 6e   lappend revglin
5dd0: 6b 28 24 79 29 20 24 78 0a 7d 0a 68 64 5f 70 75  k($y) $x.}.hd_pu
5de0: 74 73 20 22 3c 2f 75 6c 3e 22 0a 68 64 5f 63 6c  ts "</ul>".hd_cl
5df0: 6f 73 65 5f 6d 61 69 6e 0a 0a 68 64 5f 6f 70 65  ose_main..hd_ope
5e00: 6e 5f 6d 61 69 6e 20 64 6f 63 5f 74 61 72 67 65  n_main doc_targe
5e10: 74 5f 63 72 6f 73 73 72 65 66 2e 68 74 6d 6c 0a  t_crossref.html.
5e20: 68 64 5f 68 65 61 64 65 72 20 7b 54 61 72 67 65  hd_header {Targe
5e30: 74 20 43 72 6f 73 73 72 65 66 65 72 65 6e 63 65  t Crossreference
5e40: 7d 20 24 44 4f 43 2f 77 72 61 70 2e 74 63 6c 0a  } $DOC/wrap.tcl.
5e50: 68 64 5f 70 75 74 73 6e 6c 20 22 3c 75 6c 3e 22  hd_putsnl "<ul>"
5e60: 0a 66 6f 72 65 61 63 68 20 79 20 5b 6c 73 6f 72  .foreach y [lsor
5e70: 74 20 5b 61 72 72 61 79 20 6e 61 6d 65 73 20 72  t [array names r
5e80: 65 76 67 6c 69 6e 6b 5d 5d 20 7b 0a 20 20 68 64  evglink]] {.  hd
5e90: 5f 70 75 74 73 6e 6c 20 22 3c 6c 69 3e 3c 61 20  _putsnl "<li><a 
5ea0: 68 72 65 66 3d 5c 22 24 79 5c 22 3e 24 79 3c 2f  href=\"$y\">$y</
5eb0: 61 3e 20 26 72 61 72 72 3b 20 5b 6c 73 6f 72 74  a> &rarr; [lsort
5ec0: 20 24 72 65 76 67 6c 69 6e 6b 28 24 79 29 5d 3c   $revglink($y)]<
5ed0: 2f 6c 69 3e 22 0a 7d 0a 68 64 5f 70 75 74 73 6e  /li>".}.hd_putsn
5ee0: 6c 20 22 3c 2f 75 6c 3e 22 0a 68 64 5f 63 6c 6f  l "</ul>".hd_clo
5ef0: 73 65 5f 6d 61 69 6e 0a 0a 68 64 5f 6f 70 65 6e  se_main..hd_open
5f00: 5f 6d 61 69 6e 20 64 6f 63 5f 62 61 63 6b 6c 69  _main doc_backli
5f10: 6e 6b 5f 63 72 6f 73 73 72 65 66 2e 68 74 6d 6c  nk_crossref.html
5f20: 0a 68 64 5f 68 65 61 64 65 72 20 7b 42 61 63 6b  .hd_header {Back
5f30: 6c 69 6e 6b 20 43 72 6f 73 73 72 65 66 65 72 65  link Crossrefere
5f40: 6e 63 65 7d 20 24 44 4f 43 2f 77 72 61 70 2e 74  nce} $DOC/wrap.t
5f50: 63 6c 0a 68 64 5f 70 75 74 73 20 22 3c 75 6c 3e  cl.hd_puts "<ul>
5f60: 22 0a 66 6f 72 65 61 63 68 20 6b 77 20 5b 6c 73  ".foreach kw [ls
5f70: 6f 72 74 20 2d 6e 6f 63 61 73 65 20 5b 61 72 72  ort -nocase [arr
5f80: 61 79 20 6e 61 6d 65 73 20 62 61 63 6b 6c 69 6e  ay names backlin
5f90: 6b 5d 5d 20 7b 0a 20 20 68 64 5f 70 75 74 73 20  k]] {.  hd_puts 
5fa0: 22 3c 6c 69 3e 24 6b 77 20 26 72 61 72 72 3b 22  "<li>$kw &rarr;"
5fb0: 0a 20 20 73 65 74 20 70 72 65 76 20 7b 7d 0a 20  .  set prev {}. 
5fc0: 20 66 6f 72 65 61 63 68 20 72 65 66 20 5b 6c 73   foreach ref [ls
5fd0: 6f 72 74 20 24 62 61 63 6b 6c 69 6e 6b 28 24 6b  ort $backlink($k
5fe0: 77 29 5d 20 7b 0a 20 20 20 20 69 66 20 7b 24 72  w)] {.    if {$r
5ff0: 65 66 3d 3d 24 70 72 65 76 7d 20 63 6f 6e 74 69  ef==$prev} conti
6000: 6e 75 65 0a 20 20 20 20 73 65 74 20 70 72 65 76  nue.    set prev
6010: 20 24 72 65 66 0a 20 20 20 20 68 64 5f 70 75 74   $ref.    hd_put
6020: 73 6e 6c 20 22 20 20 3c 61 20 68 72 65 66 3d 5c  snl "  <a href=\
6030: 22 24 72 65 66 5c 22 3e 24 72 65 66 3c 2f 61 3e  "$ref\">$ref</a>
6040: 22 0a 20 20 7d 0a 7d 0a 68 64 5f 70 75 74 73 6e  ".  }.}.hd_putsn
6050: 6c 20 22 3c 2f 75 6c 3e 22 0a 68 64 5f 63 6c 6f  l "</ul>".hd_clo
6060: 73 65 5f 6d 61 69 6e 0a 0a 68 64 5f 6f 70 65 6e  se_main..hd_open
6070: 5f 6d 61 69 6e 20 64 6f 63 5f 70 61 67 65 6c 69  _main doc_pageli
6080: 6e 6b 5f 63 72 6f 73 73 72 65 66 2e 68 74 6d 6c  nk_crossref.html
6090: 0a 68 64 5f 68 65 61 64 65 72 20 7b 50 61 67 65  .hd_header {Page
60a0: 6c 69 6e 6b 20 43 72 6f 73 73 72 65 66 65 72 65  link Crossrefere
60b0: 6e 63 65 7d 20 24 44 4f 43 2f 77 72 61 70 2e 74  nce} $DOC/wrap.t
60c0: 63 6c 0a 68 64 5f 70 75 74 73 20 22 3c 70 3e 4b  cl.hd_puts "<p>K
60d0: 65 79 3a 20 54 61 72 67 65 74 5f 50 61 67 65 20  ey: Target_Page 
60e0: 26 72 61 72 72 3b 20 70 61 67 65 73 20 74 68 61  &rarr; pages tha
60f0: 74 20 68 61 76 65 20 68 79 70 65 72 6c 69 6e 6b  t have hyperlink
6100: 73 20 74 6f 20 74 68 65 20 74 61 72 67 65 74 20  s to the target 
6110: 70 61 67 65 2e 3c 2f 70 3e 22 0a 68 64 5f 70 75  page.</p>".hd_pu
6120: 74 73 20 22 3c 70 3e 50 61 67 65 73 20 6d 61 74  ts "<p>Pages mat
6130: 63 68 69 6e 67 20 28 6e 65 77 73 7c 63 68 61 6e  ching (news|chan
6140: 67 65 73 7c 72 65 6c 65 61 73 65 6c 6f 67 7c 5c  ges|releaselog|\
6150: 5b 30 2d 39 5d 74 6f 5c 5b 30 2d 39 5d 7c 26 23  [0-9]to\[0-9]|&#
6160: 39 34 3b 64 6f 63 5f 2e 2a 5f 63 72 6f 73 73 72  94;doc_.*_crossr
6170: 65 66 29 20 61 72 65 20 73 6b 69 70 70 65 64 2e  ef) are skipped.
6180: 3c 2f 70 3e 22 0a 68 64 5f 70 75 74 73 20 22 3c  </p>".hd_puts "<
6190: 75 6c 3e 22 0a 66 6f 72 65 61 63 68 20 79 20 5b  ul>".foreach y [
61a0: 6c 73 6f 72 74 20 5b 61 72 72 61 79 20 6e 61 6d  lsort [array nam
61b0: 65 73 20 72 65 76 67 6c 69 6e 6b 5d 5d 20 7b 0a  es revglink]] {.
61c0: 20 20 72 65 67 73 75 62 20 7b 23 2e 2a 7d 20 24    regsub {#.*} $
61d0: 79 20 7b 7d 20 79 32 0a 20 20 66 6f 72 65 61 63  y {} y2.  foreac
61e0: 68 20 6b 77 20 5b 6c 73 6f 72 74 20 24 72 65 76  h kw [lsort $rev
61f0: 67 6c 69 6e 6b 28 24 79 29 5d 20 7b 0a 20 20 20  glink($y)] {.   
6200: 20 69 66 20 7b 5b 69 6e 66 6f 20 65 78 69 73 74   if {[info exist
6210: 73 20 62 61 63 6b 6c 69 6e 6b 28 24 6b 77 29 5d  s backlink($kw)]
6220: 7d 20 7b 0a 20 20 20 20 20 20 66 6f 72 65 61 63  } {.      foreac
6230: 68 20 72 65 66 20 5b 6c 73 6f 72 74 20 24 62 61  h ref [lsort $ba
6240: 63 6b 6c 69 6e 6b 28 24 6b 77 29 5d 20 7b 0a 20  cklink($kw)] {. 
6250: 20 20 20 20 20 20 20 72 65 67 73 75 62 20 7b 23         regsub {#
6260: 2e 2a 7d 20 24 72 65 66 20 7b 7d 20 72 65 66 32  .*} $ref {} ref2
6270: 0a 20 20 20 20 20 20 20 20 6c 61 70 70 65 6e 64  .        lappend
6280: 20 70 61 67 65 6c 69 6e 6b 28 24 79 32 29 20 24   pagelink($y2) $
6290: 72 65 66 32 0a 20 20 20 20 20 20 7d 0a 20 20 20  ref2.      }.   
62a0: 20 7d 0a 20 20 7d 0a 7d 0a 66 6f 72 65 61 63 68   }.  }.}.foreach
62b0: 20 79 20 5b 6c 73 6f 72 74 20 5b 61 72 72 61 79   y [lsort [array
62c0: 20 6e 61 6d 65 73 20 70 61 67 65 6c 69 6e 6b 5d   names pagelink]
62d0: 5d 20 7b 0a 20 20 69 66 20 7b 5b 72 65 67 65 78  ] {.  if {[regex
62e0: 70 20 7b 28 6e 65 77 73 7c 63 68 61 6e 67 65 73  p {(news|changes
62f0: 7c 72 65 6c 65 61 73 65 6c 6f 67 7c 5b 30 2d 39  |releaselog|[0-9
6300: 5d 74 6f 5b 30 2d 39 5d 7c 5e 64 6f 63 5f 2e 2a  ]to[0-9]|^doc_.*
6310: 5f 63 72 6f 73 73 72 65 66 29 7d 20 24 79 5d 7d  _crossref)} $y]}
6320: 20 63 6f 6e 74 69 6e 75 65 0a 20 20 68 64 5f 70   continue.  hd_p
6330: 75 74 73 6e 6c 20 22 3c 6c 69 3e 3c 61 20 68 72  utsnl "<li><a hr
6340: 65 66 3d 5c 22 24 79 5c 22 3e 24 79 3c 2f 61 3e  ef=\"$y\">$y</a>
6350: 20 26 72 61 72 72 3b 20 22 0a 20 20 73 65 74 20   &rarr; ".  set 
6360: 70 72 65 76 20 7b 7d 0a 20 20 66 6f 72 65 61 63  prev {}.  foreac
6370: 68 20 72 65 66 20 5b 6c 73 6f 72 74 20 24 70 61  h ref [lsort $pa
6380: 67 65 6c 69 6e 6b 28 24 79 29 5d 20 7b 0a 20 20  gelink($y)] {.  
6390: 20 20 69 66 20 7b 24 72 65 66 3d 3d 24 70 72 65    if {$ref==$pre
63a0: 76 7d 20 63 6f 6e 74 69 6e 75 65 0a 20 20 20 20  v} continue.    
63b0: 69 66 20 7b 24 72 65 66 3d 3d 24 79 7d 20 63 6f  if {$ref==$y} co
63c0: 6e 74 69 6e 75 65 0a 20 20 20 20 69 66 20 7b 5b  ntinue.    if {[
63d0: 72 65 67 65 78 70 20 7b 28 6e 65 77 73 7c 63 68  regexp {(news|ch
63e0: 61 6e 67 65 73 7c 72 65 6c 65 61 73 65 6c 6f 67  anges|releaselog
63f0: 7c 5b 30 2d 39 5d 74 6f 5b 30 2d 39 5d 7c 5e 64  |[0-9]to[0-9]|^d
6400: 6f 63 5f 2e 2a 5f 63 72 6f 73 73 72 65 66 29 7d  oc_.*_crossref)}
6410: 20 24 72 65 66 5d 7d 20 63 6f 6e 74 69 6e 75 65   $ref]} continue
6420: 0a 20 20 20 20 68 64 5f 70 75 74 73 20 22 3c 61  .    hd_puts "<a
6430: 20 68 72 65 66 3d 5c 22 24 72 65 66 5c 22 3e 24   href=\"$ref\">$
6440: 72 65 66 3c 2f 61 3e 20 22 0a 20 20 20 20 73 65  ref</a> ".    se
6450: 74 20 70 72 65 76 20 24 72 65 66 0a 20 20 7d 0a  t prev $ref.  }.
6460: 20 20 68 64 5f 70 75 74 73 6e 6c 20 22 3c 2f 6c    hd_putsnl "</l
6470: 69 3e 22 0a 7d 0a 68 64 5f 70 75 74 73 20 22 3c  i>".}.hd_puts "<
6480: 2f 75 6c 3e 22 0a 68 64 5f 63 6c 6f 73 65 5f 6d  /ul>".hd_close_m
6490: 61 69 6e 0a 64 62 20 65 76 61 6c 20 43 4f 4d 4d  ain.db eval COMM
64a0: 49 54 0a 0a 70 75 74 73 20 22 57 72 69 74 69 6e  IT..puts "Writin
64b0: 67 20 67 6c 69 6e 6b 20 61 6e 64 20 6c 6c 69 6e  g glink and llin
64c0: 6b 20 61 72 72 61 79 73 20 74 6f 20 27 64 6f 63  k arrays to 'doc
64d0: 5f 76 61 72 64 75 6d 70 2e 74 78 74 27 22 0a 73  _vardump.txt'".s
64e0: 65 74 20 66 64 20 5b 6f 70 65 6e 20 64 6f 63 5f  et fd [open doc_
64f0: 76 61 72 64 75 6d 70 2e 74 78 74 20 77 62 5d 0a  vardump.txt wb].
6500: 66 6f 72 65 61 63 68 20 61 20 7b 67 6c 69 6e 6b  foreach a {glink
6510: 20 6c 6c 69 6e 6b 7d 20 7b 0a 20 20 66 6f 72 65   llink} {.  fore
6520: 61 63 68 20 76 20 5b 6c 73 6f 72 74 20 5b 61 72  ach v [lsort [ar
6530: 72 61 79 20 6e 61 6d 65 73 20 24 61 5d 5d 20 7b  ray names $a]] {
6540: 0a 20 20 20 20 70 75 74 73 20 24 66 64 20 22 73  .    puts $fd "s
6550: 65 74 20 24 7b 61 7d 28 24 76 29 20 5b 6c 69 73  et ${a}($v) [lis
6560: 74 20 5b 73 65 74 20 24 7b 61 7d 28 24 76 29 5d  t [set ${a}($v)]
6570: 5d 22 0a 20 20 7d 0a 7d 0a 63 6c 6f 73 65 20 24  ]".  }.}.close $
6580: 66 64 0a                                         fd.