Documentation Source Text

Hex Artifact Content
Login

Artifact 3b2b86a7008af4abceec20906bba08bb0b3a6439c140ba8cc83254995e4ed6be:


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 67 65 6e 65 72 61 74 65 73 20 74 68 65 20 72   generates the r
0030: 65 71 75 69 72 65 6d 65 6e 74 73 20 74 72 61 63  equirements trac
0040: 65 61 62 69 6c 69 74 79 20 6d 61 74 72 69 78 20  eability matrix 
0050: 61 6e 64 20 64 6f 65 73 0a 23 20 6f 74 68 65 72  and does.# other
0060: 20 70 72 6f 63 65 73 73 69 6e 67 20 72 65 6c 61   processing rela
0070: 74 65 64 20 74 6f 20 72 65 71 75 69 72 65 6d 65  ted to requireme
0080: 6e 74 73 20 61 6e 64 20 63 6f 76 65 72 61 67 65  nts and coverage
0090: 20 61 6e 61 6c 79 73 69 73 2e 0a 23 0a 0a 23 20   analysis..#..# 
00a0: 47 65 74 20 61 20 6c 69 73 74 20 6f 66 20 73 6f  Get a list of so
00b0: 75 72 63 65 20 48 54 4d 4c 20 66 69 6c 65 73 2e  urce HTML files.
00c0: 0a 23 0a 73 65 74 20 66 69 6c 65 6c 69 73 74 20  .#.set filelist 
00d0: 5b 6c 73 6f 72 74 20 5b 67 6c 6f 62 20 2d 6e 6f  [lsort [glob -no
00e0: 63 6f 6d 70 6c 61 69 6e 20 64 6f 63 2f 2a 2e 68  complain doc/*.h
00f0: 74 6d 6c 20 64 6f 63 2f 63 33 72 65 66 2f 2a 2e  tml doc/c3ref/*.
0100: 68 74 6d 6c 20 64 6f 63 2f 73 79 6e 74 61 78 2f  html doc/syntax/
0110: 2a 2e 68 74 6d 6c 5d 5d 0a 66 6f 72 65 61 63 68  *.html]].foreach
0120: 20 65 78 63 6c 75 64 65 20 7b 64 6f 63 2f 63 61   exclude {doc/ca
0130: 70 69 33 72 65 66 2e 68 74 6d 6c 20 64 6f 63 2f  pi3ref.html doc/
0140: 63 68 61 6e 67 65 73 2e 68 74 6d 6c 7d 20 7b 0a  changes.html} {.
0150: 20 20 73 65 74 20 69 20 5b 6c 73 65 61 72 63 68    set i [lsearch
0160: 20 24 66 69 6c 65 6c 69 73 74 20 24 65 78 63 6c   $filelist $excl
0170: 75 64 65 5d 0a 20 20 73 65 74 20 66 69 6c 65 6c  ude].  set filel
0180: 69 73 74 20 5b 6c 72 65 70 6c 61 63 65 20 24 66  ist [lreplace $f
0190: 69 6c 65 6c 69 73 74 20 24 69 20 24 69 5d 0a 7d  ilelist $i $i].}
01a0: 0a 0a 23 20 49 6e 69 74 69 61 6c 69 7a 65 20 74  ..# Initialize t
01b0: 68 65 20 64 61 74 61 62 61 73 65 20 63 6f 6e 6e  he database conn
01c0: 65 63 74 69 6f 6e 2e 0a 23 0a 73 71 6c 69 74 65  ection..#.sqlite
01d0: 33 20 64 62 20 64 6f 63 69 6e 66 6f 2e 64 62 0a  3 db docinfo.db.
01e0: 64 62 20 65 76 61 6c 20 7b 0a 20 20 41 54 54 41  db eval {.  ATTA
01f0: 43 48 20 27 68 69 73 74 6f 72 79 2e 64 62 27 20  CH 'history.db' 
0200: 41 53 20 68 69 73 74 6f 72 79 3b 0a 20 20 43 52  AS history;.  CR
0210: 45 41 54 45 20 54 41 42 4c 45 20 49 46 20 4e 4f  EATE TABLE IF NO
0220: 54 20 45 58 49 53 54 53 20 68 69 73 74 6f 72 79  T EXISTS history
0230: 2e 61 6c 6c 72 65 71 28 0a 20 20 20 20 72 65 71  .allreq(.    req
0240: 6e 6f 20 54 45 58 54 20 50 52 49 4d 41 52 59 20  no TEXT PRIMARY 
0250: 4b 45 59 2c 20 20 2d 2d 20 45 78 3a 20 52 2d 31  KEY,  -- Ex: R-1
0260: 32 33 34 35 2d 36 37 38 39 30 2d 2e 2e 2e 0a 20  2345-67890-.... 
0270: 20 20 20 72 65 71 69 6d 61 67 65 20 42 4f 4f 4c     reqimage BOOL
0280: 45 41 4e 2c 20 20 20 20 20 20 20 20 2d 2d 20 54  EAN,        -- T
0290: 72 75 65 20 66 6f 72 20 61 6e 20 69 6d 61 67 65  rue for an image
02a0: 20 72 65 71 75 69 72 65 6d 65 6e 74 0a 20 20 20   requirement.   
02b0: 20 72 65 71 74 65 78 74 20 54 45 58 54 2c 20 20   reqtext TEXT,  
02c0: 20 20 20 20 20 20 20 20 20 20 2d 2d 20 4e 6f 72            -- Nor
02d0: 6d 61 6c 69 7a 65 64 20 74 65 78 74 20 6f 66 20  malized text of 
02e0: 72 65 71 75 69 72 65 6d 65 6e 74 20 6f 72 20 69  requirement or i
02f0: 6d 61 67 65 20 66 69 6c 65 6e 61 6d 65 0a 20 20  mage filename.  
0300: 20 20 73 72 63 66 69 6c 65 20 54 45 58 54 20 20    srcfile TEXT  
0310: 20 20 20 20 20 20 20 20 20 20 20 2d 2d 20 44 6f             -- Do
0320: 63 75 6d 65 6e 74 20 66 72 6f 6d 20 77 68 69 63  cument from whic
0330: 68 20 65 78 74 72 61 63 74 65 64 0a 20 20 29 3b  h extracted.  );
0340: 0a 20 20 42 45 47 49 4e 3b 0a 20 20 44 45 4c 45  .  BEGIN;.  DELE
0350: 54 45 20 46 52 4f 4d 20 72 65 71 75 69 72 65 6d  TE FROM requirem
0360: 65 6e 74 3b 0a 20 20 44 45 4c 45 54 45 20 46 52  ent;.  DELETE FR
0370: 4f 4d 20 72 65 71 73 72 63 3b 0a 7d 0a 0a 23 20  OM reqsrc;.}..# 
0380: 45 78 74 72 61 63 74 20 72 65 71 75 69 72 65 6d  Extract requirem
0390: 65 6e 74 20 74 65 78 74 20 66 72 6f 6d 20 61 6c  ent text from al
03a0: 6c 20 6f 66 20 74 68 65 20 48 54 4d 4c 20 66 69  l of the HTML fi
03b0: 6c 65 73 20 69 6e 20 24 66 69 6c 65 6c 69 73 74  les in $filelist
03c0: 0a 23 0a 23 20 52 65 71 75 69 72 65 6d 65 6e 74  .#.# Requirement
03d0: 73 20 74 65 78 74 20 69 73 20 74 65 78 74 20 62  s text is text b
03e0: 65 74 77 65 65 6e 20 22 5e 22 20 61 6e 64 20 22  etween "^" and "
03f0: 2e 22 20 6f 72 20 62 65 74 77 65 65 6e 20 22 5e  ." or between "^
0400: 28 22 20 61 6e 64 20 22 29 5e 22 2e 0a 23 20 52  (" and ")^"..# R
0410: 65 71 75 69 72 65 6d 65 6e 74 20 74 65 78 74 20  equirement text 
0420: 69 73 20 6e 6f 72 6d 61 6c 69 7a 65 64 20 62 79  is normalized by
0430: 20 72 65 6d 6f 76 69 6e 67 20 61 6c 6c 20 48 54   removing all HT
0440: 4d 4c 20 6d 61 72 6b 75 70 2c 20 72 65 6d 6f 76  ML markup, remov
0450: 69 6e 67 0a 23 20 61 6c 6c 20 77 68 69 74 65 73  ing.# all whites
0460: 70 61 63 65 20 66 72 6f 6d 20 74 68 65 20 62 65  pace from the be
0470: 67 69 6e 6e 69 6e 67 20 61 6e 64 20 65 6e 64 2c  ginning and end,
0480: 20 61 6e 64 20 63 6f 6e 76 65 72 74 69 6e 67 20   and converting 
0490: 61 6c 6c 20 69 6e 74 65 72 6e 61 6c 0a 23 20 77  all internal.# w
04a0: 68 69 74 65 73 70 61 63 65 20 73 65 71 75 65 6e  hitespace sequen
04b0: 63 65 73 20 69 6e 74 6f 20 61 20 73 69 6e 67 6c  ces into a singl
04c0: 65 20 73 70 61 63 65 20 63 68 61 72 61 63 74 65  e space characte
04d0: 72 2e 0a 23 0a 23 20 53 79 6e 74 61 78 20 64 69  r..#.# Syntax di
04e0: 61 67 72 61 6d 73 20 61 72 65 20 63 6f 6e 73 69  agrams are consi
04f0: 64 65 72 65 64 20 74 68 65 69 72 20 6f 77 6e 20  dered their own 
0500: 72 65 71 75 69 72 65 6d 65 6e 74 20 69 66 20 74  requirement if t
0510: 68 65 79 20 61 72 65 0a 23 20 65 6d 62 65 64 64  hey are.# embedd
0520: 65 64 20 75 73 69 6e 67 20 6d 61 72 6b 75 70 20  ed using markup 
0530: 6f 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67  of the following
0540: 20 70 61 74 74 65 72 3a 0a 23 0a 23 20 20 20 20   patter:.#.#    
0550: 3c 69 6d 67 20 61 6c 74 3d 22 73 79 6e 74 61 78  <img alt="syntax
0560: 20 64 69 61 67 72 61 6d 20 4e 41 4d 45 22 20 73   diagram NAME" s
0570: 72 63 3d 22 46 49 4c 45 4e 41 4d 45 2e 67 69 66  rc="FILENAME.gif
0580: 22 3e 0a 23 0a 23 20 54 68 65 20 72 65 71 75 69  ">.#.# The requi
0590: 72 65 6d 65 6e 74 20 74 61 62 6c 65 20 6f 66 20  rement table of 
05a0: 74 68 65 20 64 6f 63 69 6e 66 6f 2e 64 62 20 69  the docinfo.db i
05b0: 73 20 70 6f 70 75 6c 61 74 65 64 20 77 69 74 68  s populated with
05c0: 20 72 65 71 75 69 72 65 6d 65 6e 74 0a 23 20 69   requirement.# i
05d0: 6e 66 6f 72 6d 61 74 69 6f 6e 2e 20 20 53 65 65  nformation.  See
05e0: 20 74 68 65 20 73 63 68 65 6d 61 2e 74 63 6c 20   the schema.tcl 
05f0: 73 6f 75 72 63 65 20 66 69 6c 65 20 66 6f 72 20  source file for 
0600: 61 20 64 65 66 69 6e 69 74 69 6f 6e 20 6f 66 20  a definition of 
0610: 74 68 65 0a 23 20 72 65 71 75 69 72 6d 65 6e 74  the.# requirment
0620: 20 74 61 62 6c 65 2e 0a 23 0a 70 75 74 73 20 2d   table..#.puts -
0630: 6e 6f 6e 65 77 6c 69 6e 65 20 22 53 63 61 6e 6e  nonewline "Scann
0640: 69 6e 67 20 64 6f 63 75 6d 65 6e 74 61 74 69 6f  ing documentatio
0650: 6e 20 66 6f 72 20 74 65 73 74 61 62 6c 65 20 73  n for testable s
0660: 74 61 74 65 6d 65 6e 74 73 22 0a 66 6c 75 73 68  tatements".flush
0670: 20 73 74 64 6f 75 74 0a 66 6f 72 65 61 63 68 20   stdout.foreach 
0680: 66 69 6c 65 20 24 66 69 6c 65 6c 69 73 74 20 7b  file $filelist {
0690: 0a 20 20 69 66 20 7b 24 66 69 6c 65 3d 3d 22 64  .  if {$file=="d
06a0: 6f 63 2f 66 69 6c 65 66 6f 72 6d 61 74 2e 68 74  oc/fileformat.ht
06b0: 6d 6c 22 20 0a 20 20 20 20 20 20 20 20 26 26 20  ml" .        && 
06c0: 5b 6c 73 65 61 72 63 68 20 24 66 69 6c 65 6c 69  [lsearch $fileli
06d0: 73 74 20 64 6f 63 2f 66 69 6c 65 66 6f 72 6d 61  st doc/fileforma
06e0: 74 32 2e 68 74 6d 6c 5d 3e 3d 30 7d 20 7b 0a 20  t2.html]>=0} {. 
06f0: 20 20 20 63 6f 6e 74 69 6e 75 65 0a 20 20 7d 0a     continue.  }.
0700: 20 20 69 66 20 7b 5b 6c 73 65 61 72 63 68 20 7b    if {[lsearch {
0710: 64 6f 63 2f 63 68 72 6f 6e 6f 6c 6f 67 79 2e 68  doc/chronology.h
0720: 74 6d 6c 20 64 6f 63 2f 72 65 71 75 69 72 65 6d  tml doc/requirem
0730: 65 6e 74 73 2e 68 74 6d 6c 7d 20 24 66 69 6c 65  ents.html} $file
0740: 5d 3e 3d 30 7d 20 7b 0a 20 20 20 20 63 6f 6e 74  ]>=0} {.    cont
0750: 69 6e 75 65 0a 20 20 7d 0a 20 20 70 75 74 73 20  inue.  }.  puts 
0760: 2d 6e 6f 6e 65 77 6c 69 6e 65 20 2e 0a 20 20 23  -nonewline ..  #
0770: 20 70 75 74 73 20 22 24 66 69 6c 65 2e 2e 2e 22   puts "$file..."
0780: 0a 20 20 66 6c 75 73 68 20 73 74 64 6f 75 74 0a  .  flush stdout.
0790: 20 20 73 65 74 20 69 6e 20 5b 6f 70 65 6e 20 24    set in [open $
07a0: 66 69 6c 65 5d 0a 20 20 73 65 74 20 78 20 5b 72  file].  set x [r
07b0: 65 61 64 20 24 69 6e 20 5b 66 69 6c 65 20 73 69  ead $in [file si
07c0: 7a 65 20 24 66 69 6c 65 5d 5d 0a 20 20 63 6c 6f  ze $file]].  clo
07d0: 73 65 20 24 69 6e 0a 20 20 73 65 74 20 6f 72 69  se $in.  set ori
07e0: 67 5f 78 20 24 78 0a 20 20 73 65 74 20 6f 72 69  g_x $x.  set ori
07f0: 67 6c 65 6e 20 5b 73 74 72 69 6e 67 20 6c 65 6e  glen [string len
0800: 67 74 68 20 24 78 5d 0a 20 20 72 65 67 73 75 62  gth $x].  regsub
0810: 20 7b 5e 64 6f 63 2f 7d 20 24 66 69 6c 65 20 7b   {^doc/} $file {
0820: 7d 20 73 72 63 66 69 6c 65 0a 20 20 73 65 74 20  } srcfile.  set 
0830: 73 65 71 6e 6f 20 30 0a 20 20 77 68 69 6c 65 20  seqno 0.  while 
0840: 7b 5b 73 74 72 69 6e 67 20 6c 65 6e 67 74 68 20  {[string length 
0850: 24 78 5d 3e 30 20 26 26 20 5b 72 65 67 73 75 62  $x]>0 && [regsub
0860: 20 7b 5e 2e 2a 3f 5c 5e 7d 20 24 78 20 7b 7d 20   {^.*?\^} $x {} 
0870: 6e 78 5d 7d 20 7b 0a 20 20 20 20 73 65 74 20 63  nx]} {.    set c
0880: 20 5b 73 74 72 69 6e 67 20 69 6e 64 65 78 20 24   [string index $
0890: 6e 78 20 30 5d 0a 20 20 20 20 73 65 74 20 73 65  nx 0].    set se
08a0: 71 6e 6f 20 5b 65 78 70 72 20 7b 24 6f 72 69 67  qno [expr {$orig
08b0: 6c 65 6e 20 2d 20 5b 73 74 72 69 6e 67 20 6c 65  len - [string le
08c0: 6e 67 74 68 20 24 6e 78 5d 7d 5d 0a 20 20 20 20  ngth $nx]}].    
08d0: 73 65 74 20 72 65 71 20 7b 7d 0a 20 20 20 20 69  set req {}.    i
08e0: 66 20 7b 24 63 3d 3d 22 28 22 7d 20 7b 0a 20 20  f {$c=="("} {.  
08f0: 20 20 20 20 72 65 67 65 78 70 20 7b 5e 5c 28 28      regexp {^\((
0900: 28 5b 5e 3c 5d 7c 3c 2e 2b 3f 3e 29 2a 3f 29 5c  ([^<]|<.+?>)*?)\
0910: 29 5c 5e 7d 20 24 6e 78 20 61 6c 6c 20 72 65 71  )\^} $nx all req
0920: 0a 20 20 20 20 20 20 72 65 67 73 75 62 20 7b 5e  .      regsub {^
0930: 5c 28 28 28 5b 5e 3c 5d 7c 3c 2e 2b 3f 3e 29 2a  \((([^<]|<.+?>)*
0940: 3f 29 5c 29 5c 5e 7d 20 24 6e 78 20 7b 7d 20 6e  ?)\)\^} $nx {} n
0950: 78 0a 20 20 20 20 7d 20 65 6c 73 65 20 7b 0a 20  x.    } else {. 
0960: 20 20 20 20 20 72 65 67 65 78 70 20 7b 5e 28 5b       regexp {^([
0970: 5e 3c 5d 7c 3c 2e 2b 3f 3e 29 2a 3f 5c 2e 7d 20  ^<]|<.+?>)*?\.} 
0980: 24 6e 78 20 72 65 71 0a 20 20 20 20 20 20 72 65  $nx req.      re
0990: 67 73 75 62 20 7b 5e 28 5b 5e 3c 5d 7c 3c 2e 2b  gsub {^([^<]|<.+
09a0: 3f 3e 29 2a 3f 5c 2e 7d 20 24 6e 78 20 7b 7d 20  ?>)*?\.} $nx {} 
09b0: 6e 78 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 20  nx.    }.    if 
09c0: 7b 24 72 65 71 3d 3d 22 22 7d 20 7b 0a 20 20 20  {$req==""} {.   
09d0: 20 20 20 70 75 74 73 20 22 24 73 72 63 66 69 6c     puts "$srcfil
09e0: 65 3a 20 62 61 64 20 72 65 71 75 69 72 65 6d 65  e: bad requireme
09f0: 6e 74 3a 20 5b 73 74 72 69 6e 67 20 72 61 6e 67  nt: [string rang
0a00: 65 20 24 6e 78 20 30 20 34 30 5d 2e 2e 2e 22 0a  e $nx 0 40]...".
0a10: 20 20 20 20 20 20 73 65 74 20 78 20 24 6e 78 0a        set x $nx.
0a20: 20 20 20 20 20 20 63 6f 6e 74 69 6e 75 65 0a 20        continue. 
0a30: 20 20 20 7d 0a 20 20 20 20 73 65 74 20 6f 72 69     }.    set ori
0a40: 67 20 5b 73 74 72 69 6e 67 20 74 72 69 6d 20 24  g [string trim $
0a50: 72 65 71 5d 0a 20 20 20 20 72 65 67 73 75 62 20  req].    regsub 
0a60: 2d 61 6c 6c 20 7b 3c 2e 2b 3f 3e 7d 20 24 6f 72  -all {<.+?>} $or
0a70: 69 67 20 7b 7d 20 72 65 71 0a 20 20 20 20 72 65  ig {} req.    re
0a80: 67 73 75 62 20 2d 61 6c 6c 20 7b 5c 73 2b 7d 20  gsub -all {\s+} 
0a90: 5b 73 74 72 69 6e 67 20 74 72 69 6d 20 24 72 65  [string trim $re
0aa0: 71 5d 20 7b 20 7d 20 72 65 71 0a 20 20 20 20 73  q] { } req.    s
0ab0: 65 74 20 72 65 71 20 5b 73 74 72 69 6e 67 20 6d  et req [string m
0ac0: 61 70 20 7b 26 6c 74 3b 20 3c 20 26 67 74 3b 20  ap {&lt; < &gt; 
0ad0: 3e 20 26 23 39 31 3b 20 5b 20 26 23 39 33 3b 20  > &#91; [ &#93; 
0ae0: 5d 20 26 61 6d 70 3b 20 26 7d 20 24 72 65 71 5d  ] &amp; &} $req]
0af0: 0a 20 20 20 20 73 65 74 20 72 65 71 20 5b 73 74  .    set req [st
0b00: 72 69 6e 67 20 74 72 69 6d 20 24 72 65 71 5d 0a  ring trim $req].
0b10: 20 20 20 20 73 65 74 20 72 65 71 6e 6f 20 52 2d      set reqno R-
0b20: 5b 6d 64 35 2d 31 30 78 38 20 24 72 65 71 5d 0a  [md5-10x8 $req].
0b30: 20 20 20 20 64 62 20 65 76 61 6c 20 7b 53 45 4c      db eval {SEL
0b40: 45 43 54 20 73 72 63 66 69 6c 65 20 41 53 20 73  ECT srcfile AS s
0b50: 32 2c 20 72 65 71 74 65 78 74 20 61 73 20 72 32  2, reqtext as r2
0b60: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 46 52  .             FR
0b70: 4f 4d 20 72 65 71 75 69 72 65 6d 65 6e 74 20 57  OM requirement W
0b80: 48 45 52 45 20 72 65 71 6e 6f 3d 24 72 65 71 6e  HERE reqno=$reqn
0b90: 6f 7d 20 7b 0a 20 20 20 20 20 20 70 75 74 73 20  o} {.      puts 
0ba0: 22 24 73 72 63 66 69 6c 65 3a 20 64 75 70 6c 69  "$srcfile: dupli
0bb0: 63 61 74 65 20 5b 73 74 72 69 6e 67 20 72 61 6e  cate [string ran
0bc0: 67 65 20 24 72 65 71 6e 6f 20 30 20 31 32 5d 20  ge $reqno 0 12] 
0bd0: 69 6e 20 24 73 32 3a 20 5c 5b 24 72 32 5c 5d 22  in $s2: \[$r2\]"
0be0: 0a 20 20 20 20 7d 0a 20 20 20 20 64 62 20 65 76  .    }.    db ev
0bf0: 61 6c 20 7b 0a 20 20 20 20 20 20 49 4e 53 45 52  al {.      INSER
0c00: 54 20 4f 52 20 49 47 4e 4f 52 45 20 49 4e 54 4f  T OR IGNORE INTO
0c10: 20 72 65 71 75 69 72 65 6d 65 6e 74 0a 20 20 20   requirement.   
0c20: 20 20 20 20 20 20 20 20 20 20 20 28 72 65 71 6e             (reqn
0c30: 6f 2c 20 72 65 71 74 65 78 74 2c 20 6f 72 69 67  o, reqtext, orig
0c40: 74 65 78 74 2c 20 72 65 71 69 6d 61 67 65 2c 73  text, reqimage,s
0c50: 72 63 66 69 6c 65 2c 73 72 63 73 65 71 29 0a 20  rcfile,srcseq). 
0c60: 20 20 20 20 20 20 20 56 41 4c 55 45 53 28 24 72         VALUES($r
0c70: 65 71 6e 6f 2c 24 72 65 71 2c 20 20 20 20 24 6f  eqno,$req,    $o
0c80: 72 69 67 2c 20 20 20 20 30 2c 20 20 20 20 20 20  rig,    0,      
0c90: 24 73 72 63 66 69 6c 65 2c 24 73 65 71 6e 6f 29  $srcfile,$seqno)
0ca0: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 64 62 20 65  ;.    }.    db e
0cb0: 76 61 6c 20 7b 0a 20 20 20 20 20 20 49 4e 53 45  val {.      INSE
0cc0: 52 54 20 4f 52 20 49 47 4e 4f 52 45 20 49 4e 54  RT OR IGNORE INT
0cd0: 4f 20 72 65 71 73 72 63 28 73 72 63 66 69 6c 65  O reqsrc(srcfile
0ce0: 2c 20 73 72 63 73 65 71 2c 20 72 65 71 6e 6f 29  , srcseq, reqno)
0cf0: 0a 20 20 20 20 20 20 56 41 4c 55 45 53 28 24 73  .      VALUES($s
0d00: 72 63 66 69 6c 65 2c 20 24 73 65 71 6e 6f 2c 20  rcfile, $seqno, 
0d10: 24 72 65 71 6e 6f 29 0a 20 20 20 20 7d 0a 20 20  $reqno).    }.  
0d20: 20 20 64 62 20 65 76 61 6c 20 7b 0a 20 20 20 20    db eval {.    
0d30: 20 20 49 4e 53 45 52 54 20 4f 52 20 49 47 4e 4f    INSERT OR IGNO
0d40: 52 45 20 49 4e 54 4f 20 61 6c 6c 72 65 71 28 72  RE INTO allreq(r
0d50: 65 71 6e 6f 2c 72 65 71 69 6d 61 67 65 2c 72 65  eqno,reqimage,re
0d60: 71 74 65 78 74 2c 73 72 63 66 69 6c 65 29 0a 20  qtext,srcfile). 
0d70: 20 20 20 20 20 20 20 56 41 4c 55 45 53 28 24 72         VALUES($r
0d80: 65 71 6e 6f 2c 30 2c 24 72 65 71 2c 24 73 72 63  eqno,0,$req,$src
0d90: 66 69 6c 65 29 3b 0a 20 20 20 20 7d 0a 20 20 20  file);.    }.   
0da0: 20 73 65 74 20 78 20 24 6e 78 0a 20 20 7d 0a 20   set x $nx.  }. 
0db0: 20 73 65 74 20 78 20 24 6f 72 69 67 5f 78 0a 20   set x $orig_x. 
0dc0: 20 75 6e 73 65 74 20 6f 72 69 67 5f 78 0a 20 20   unset orig_x.  
0dd0: 77 68 69 6c 65 20 7b 5b 73 74 72 69 6e 67 20 6c  while {[string l
0de0: 65 6e 67 74 68 20 24 78 5d 3e 30 20 0a 20 20 20  ength $x]>0 .   
0df0: 20 20 26 26 20 5b 72 65 67 65 78 70 20 7b 5e 28    && [regexp {^(
0e00: 2e 2b 3f 29 28 3c 69 6d 67 20 61 6c 74 3d 22 73  .+?)(<img alt="s
0e10: 79 6e 74 61 78 20 64 69 61 67 72 61 6d 20 2e 2a  yntax diagram .*
0e20: 29 24 7d 20 24 78 20 61 6c 6c 20 70 72 65 66 69  )$} $x all prefi
0e30: 78 20 73 75 66 66 69 78 5d 7d 20 7b 0a 20 20 20  x suffix]} {.   
0e40: 20 73 65 74 20 78 20 24 73 75 66 66 69 78 0a 20   set x $suffix. 
0e50: 20 20 20 73 65 74 20 73 65 71 6e 6f 20 5b 65 78     set seqno [ex
0e60: 70 72 20 7b 24 6f 72 69 67 6c 65 6e 20 2d 20 5b  pr {$origlen - [
0e70: 73 74 72 69 6e 67 20 6c 65 6e 67 74 68 20 24 78  string length $x
0e80: 5d 7d 5d 0a 20 20 20 20 69 66 20 7b 5b 72 65 67  ]}].    if {[reg
0e90: 65 78 70 20 5c 0a 20 20 20 20 20 20 20 20 20 20  exp \.          
0ea0: 20 7b 3c 69 6d 67 20 61 6c 74 3d 22 28 73 79 6e   {<img alt="(syn
0eb0: 74 61 78 20 64 69 61 67 72 61 6d 20 5b 2d 61 2d  tax diagram [-a-
0ec0: 7a 5d 2b 29 22 20 73 72 63 3d 22 5b 2e 2f 5d 2a  z]+)" src="[./]*
0ed0: 28 5b 2d 2e 2f 61 2d 7a 5d 2b 5c 2e 67 69 66 29  ([-./a-z]+\.gif)
0ee0: 22 7d 20 5c 0a 20 20 20 20 20 20 20 20 20 20 20  "} \.           
0ef0: 24 78 20 61 6c 6c 20 6e 61 6d 65 20 69 6d 61 67  $x all name imag
0f00: 65 5d 7d 20 7b 0a 20 20 20 20 20 20 23 70 75 74  e]} {.      #put
0f10: 73 20 22 44 49 41 47 52 41 4d 3a 20 24 66 69 6c  s "DIAGRAM: $fil
0f20: 65 20 24 6e 61 6d 65 20 24 69 6d 61 67 65 20 24  e $name $image $
0f30: 73 65 71 6e 6f 22 0a 20 20 20 20 20 20 73 65 74  seqno".      set
0f40: 20 72 65 71 20 24 6e 61 6d 65 0a 20 20 20 20 20   req $name.     
0f50: 20 73 65 74 20 6f 72 69 67 20 22 3c 69 6d 67 20   set orig "<img 
0f60: 73 72 63 3d 5c 22 24 69 6d 61 67 65 5c 22 3e 22  src=\"$image\">"
0f70: 0a 20 20 20 20 20 20 69 66 20 7b 21 5b 66 69 6c  .      if {![fil
0f80: 65 20 65 78 69 73 74 73 20 64 6f 63 2f 24 69 6d  e exists doc/$im
0f90: 61 67 65 5d 7d 20 7b 0a 20 20 20 20 20 20 20 20  age]} {.        
0fa0: 70 75 74 73 20 73 74 64 65 72 72 20 22 4e 6f 20  puts stderr "No 
0fb0: 73 75 63 68 20 69 6d 61 67 65 3a 20 64 6f 63 2f  such image: doc/
0fc0: 24 69 6d 61 67 65 22 0a 20 20 20 20 20 20 20 20  $image".        
0fd0: 63 6f 6e 74 69 6e 75 65 0a 20 20 20 20 20 20 7d  continue.      }
0fe0: 0a 20 20 20 20 20 20 73 65 74 20 72 65 71 6e 6f  .      set reqno
0ff0: 20 52 2d 5b 6d 64 35 66 69 6c 65 2d 31 30 78 38   R-[md5file-10x8
1000: 20 64 6f 63 2f 24 69 6d 61 67 65 5d 0a 0a 20 20   doc/$image]..  
1010: 20 20 20 20 69 66 20 7b 5b 73 74 72 69 6e 67 20      if {[string 
1020: 6d 61 74 63 68 20 2a 73 79 6e 74 61 78 2f 2a 2e  match *syntax/*.
1030: 68 74 6d 6c 20 24 73 72 63 66 69 6c 65 5d 7d 20  html $srcfile]} 
1040: 7b 0a 20 20 20 20 20 20 20 20 64 62 20 65 76 61  {.        db eva
1050: 6c 20 7b 44 45 4c 45 54 45 20 46 52 4f 4d 20 72  l {DELETE FROM r
1060: 65 71 75 69 72 65 6d 65 6e 74 20 57 48 45 52 45  equirement WHERE
1070: 20 72 65 71 6e 6f 3d 24 72 65 71 6e 6f 7d 0a 20   reqno=$reqno}. 
1080: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 64 62 20       }.      db 
1090: 65 76 61 6c 20 7b 0a 20 20 20 20 20 20 20 20 49  eval {.        I
10a0: 4e 53 45 52 54 20 4f 52 20 49 47 4e 4f 52 45 20  NSERT OR IGNORE 
10b0: 49 4e 54 4f 20 72 65 71 75 69 72 65 6d 65 6e 74  INTO requirement
10c0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
10d0: 20 28 72 65 71 6e 6f 2c 20 72 65 71 74 65 78 74   (reqno, reqtext
10e0: 2c 20 6f 72 69 67 74 65 78 74 2c 20 72 65 71 69  , origtext, reqi
10f0: 6d 61 67 65 2c 73 72 63 66 69 6c 65 2c 73 72 63  mage,srcfile,src
1100: 73 65 71 29 0a 20 20 20 20 20 20 20 20 20 20 56  seq).          V
1110: 41 4c 55 45 53 28 24 72 65 71 6e 6f 2c 24 72 65  ALUES($reqno,$re
1120: 71 2c 20 20 20 20 24 6f 72 69 67 2c 20 20 20 20  q,    $orig,    
1130: 31 2c 20 20 20 20 20 20 24 73 72 63 66 69 6c 65  1,      $srcfile
1140: 2c 24 73 65 71 6e 6f 29 3b 0a 20 20 20 20 20 20  ,$seqno);.      
1150: 7d 0a 20 20 20 20 20 20 64 62 20 65 76 61 6c 20  }.      db eval 
1160: 7b 0a 20 20 20 20 20 20 20 20 49 4e 53 45 52 54  {.        INSERT
1170: 20 4f 52 20 49 47 4e 4f 52 45 20 49 4e 54 4f 20   OR IGNORE INTO 
1180: 72 65 71 73 72 63 28 73 72 63 66 69 6c 65 2c 20  reqsrc(srcfile, 
1190: 73 72 63 73 65 71 2c 20 72 65 71 6e 6f 29 0a 20  srcseq, reqno). 
11a0: 20 20 20 20 20 20 20 56 41 4c 55 45 53 28 24 73         VALUES($s
11b0: 72 63 66 69 6c 65 2c 24 73 65 71 6e 6f 2c 24 72  rcfile,$seqno,$r
11c0: 65 71 6e 6f 29 0a 20 20 20 20 20 20 7d 0a 20 20  eqno).      }.  
11d0: 20 20 20 20 64 62 20 65 76 61 6c 20 7b 0a 20 20      db eval {.  
11e0: 20 20 20 20 20 20 49 4e 53 45 52 54 20 4f 52 20        INSERT OR 
11f0: 49 47 4e 4f 52 45 20 49 4e 54 4f 20 61 6c 6c 72  IGNORE INTO allr
1200: 65 71 28 72 65 71 6e 6f 2c 20 72 65 71 69 6d 61  eq(reqno, reqima
1210: 67 65 2c 20 72 65 71 74 65 78 74 2c 20 73 72 63  ge, reqtext, src
1220: 66 69 6c 65 29 0a 20 20 20 20 20 20 20 20 20 20  file).          
1230: 56 41 4c 55 45 53 28 24 72 65 71 6e 6f 2c 31 2c  VALUES($reqno,1,
1240: 24 72 65 71 2c 24 73 72 63 66 69 6c 65 29 3b 0a  $req,$srcfile);.
1250: 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
1260: 7d 0a 7d 0a 64 62 20 65 76 61 6c 20 43 4f 4d 4d  }.}.db eval COMM
1270: 49 54 0a 73 65 74 20 63 6e 74 20 5b 64 62 20 6f  IT.set cnt [db o
1280: 6e 65 20 7b 53 45 4c 45 43 54 20 63 6f 75 6e 74  ne {SELECT count
1290: 28 2a 29 20 46 52 4f 4d 20 72 65 71 75 69 72 65  (*) FROM require
12a0: 6d 65 6e 74 7d 5d 0a 73 65 74 20 65 76 63 6e 74  ment}].set evcnt
12b0: 20 5b 64 62 20 6f 6e 65 20 7b 0a 20 20 53 45 4c   [db one {.  SEL
12c0: 45 43 54 20 63 6f 75 6e 74 28 2a 29 20 46 52 4f  ECT count(*) FRO
12d0: 4d 20 72 65 71 75 69 72 65 6d 65 6e 74 20 57 48  M requirement WH
12e0: 45 52 45 20 72 65 71 6e 6f 20 49 4e 20 28 53 45  ERE reqno IN (SE
12f0: 4c 45 43 54 20 72 65 71 6e 6f 20 46 52 4f 4d 20  LECT reqno FROM 
1300: 65 76 69 64 65 6e 63 65 29 0a 7d 5d 0a 73 65 74  evidence).}].set
1310: 20 65 76 70 63 74 20 5b 66 6f 72 6d 61 74 20 7b   evpct [format {
1320: 25 2e 31 66 25 25 7d 20 5b 65 78 70 72 20 7b 24  %.1f%%} [expr {$
1330: 65 76 63 6e 74 2a 31 30 30 2e 30 2f 24 63 6e 74  evcnt*100.0/$cnt
1340: 7d 5d 5d 0a 70 75 74 73 20 22 5c 6e 46 6f 75 6e  }]].puts "\nFoun
1350: 64 20 24 63 6e 74 20 74 65 73 74 61 62 6c 65 20  d $cnt testable 
1360: 73 74 61 74 65 6d 65 6e 74 73 2e 20 45 76 69 64  statements. Evid
1370: 65 6e 63 65 20 65 78 69 73 74 73 20 66 6f 72 20  ence exists for 
1380: 24 65 76 63 6e 74 20 6f 72 20 24 65 76 70 63 74  $evcnt or $evpct
1390: 22 0a 0a 23 20 52 65 70 6f 72 74 20 61 6c 6c 20  "..# Report all 
13a0: 65 76 69 64 65 6e 63 65 20 66 6f 72 20 77 68 69  evidence for whi
13b0: 63 68 20 74 68 65 72 65 20 69 73 20 6e 6f 20 63  ch there is no c
13c0: 6f 72 72 65 73 70 6f 6e 64 69 6e 67 20 72 65 71  orresponding req
13d0: 75 69 72 65 6d 65 6e 74 2e 0a 23 20 53 75 63 68  uirement..# Such
13e0: 20 65 76 69 64 65 6e 63 65 20 69 73 20 70 72 6f   evidence is pro
13f0: 62 61 62 6c 79 20 22 73 74 61 6c 65 22 20 2d 20  bably "stale" - 
1400: 74 68 65 20 72 65 71 75 69 72 65 6d 65 6e 74 20  the requirement 
1410: 74 65 78 74 20 68 61 73 20 63 68 61 6e 67 65 64  text has changed
1420: 20 62 75 74 0a 23 20 74 68 65 20 65 76 69 64 65   but.# the evide
1430: 6e 63 65 20 74 65 78 74 20 64 69 64 20 6e 6f 74  nce text did not
1440: 2e 0a 23 0a 64 62 20 65 76 61 6c 20 7b 0a 20 20  ..#.db eval {.  
1450: 53 45 4c 45 43 54 20 72 65 71 6e 6f 2c 20 73 72  SELECT reqno, sr
1460: 63 66 69 6c 65 2c 20 73 72 63 6c 69 6e 65 20 46  cfile, srcline F
1470: 52 4f 4d 20 65 76 69 64 65 6e 63 65 0a 20 20 20  ROM evidence.   
1480: 57 48 45 52 45 20 72 65 71 6e 6f 20 4e 4f 54 20  WHERE reqno NOT 
1490: 49 4e 20 28 53 45 4c 45 43 54 20 72 65 71 6e 6f  IN (SELECT reqno
14a0: 20 46 52 4f 4d 20 72 65 71 75 69 72 65 6d 65 6e   FROM requiremen
14b0: 74 29 0a 7d 20 7b 0a 20 20 70 75 74 73 20 22 45  t).} {.  puts "E
14c0: 52 52 4f 52 3a 20 73 74 61 6c 65 20 65 76 69 64  RROR: stale evid
14d0: 65 6e 63 65 20 61 74 20 24 73 72 63 66 69 6c 65  ence at $srcfile
14e0: 3a 24 73 72 63 6c 69 6e 65 20 2d 20 24 72 65 71  :$srcline - $req
14f0: 6e 6f 22 0a 20 20 64 62 20 65 76 61 6c 20 7b 53  no".  db eval {S
1500: 45 4c 45 43 54 20 72 65 71 74 65 78 74 2c 20 73  ELECT reqtext, s
1510: 72 63 66 69 6c 65 20 41 53 20 73 72 63 78 20 46  rcfile AS srcx F
1520: 52 4f 4d 20 61 6c 6c 72 65 71 20 57 48 45 52 45  ROM allreq WHERE
1530: 20 72 65 71 6e 6f 20 47 4c 4f 42 20 28 24 72 65   reqno GLOB ($re
1540: 71 6e 6f 7c 7c 27 2a 27 29 7d 20 7b 0a 20 20 20  qno||'*')} {.   
1550: 20 70 75 74 73 20 22 2e 2e 2e 20 69 6e 20 24 73   puts "... in $s
1560: 72 63 78 3a 20 5c 22 24 72 65 71 74 65 78 74 5c  rcx: \"$reqtext\
1570: 22 22 0a 20 20 7d 0a 7d 0a 0a 0a 23 23 23 23 23  "".  }.}...#####
1580: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
1590: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
15a0: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
15b0: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
15c0: 23 23 23 0a 23 20 48 65 61 64 65 72 20 6f 75 74  ###.# Header out
15d0: 70 75 74 20 72 6f 75 74 69 6e 65 20 61 64 61 70  put routine adap
15e0: 74 65 64 20 66 72 6f 6d 20 77 72 61 70 2e 74 63  ted from wrap.tc
15f0: 6c 2e 20 20 4b 65 65 70 20 74 68 65 20 74 77 6f  l.  Keep the two
1600: 20 69 6e 20 73 79 6e 63 2e 0a 23 0a 23 20 68 64   in sync..#.# hd
1610: 5f 70 75 74 73 69 6e 34 20 69 73 20 6c 69 6b 65  _putsin4 is like
1620: 20 70 75 74 73 20 65 78 63 65 70 74 20 74 68 61   puts except tha
1630: 74 20 69 74 20 72 65 6d 6f 76 65 73 20 74 68 65  t it removes the
1640: 20 66 69 72 73 74 20 34 20 69 6e 64 65 6e 74 61   first 4 indenta
1650: 74 69 6f 6e 0a 23 20 63 68 61 72 61 63 74 65 72  tion.# character
1660: 73 20 66 72 6f 6d 20 65 61 63 68 20 6c 69 6e 65  s from each line
1670: 2e 20 20 49 74 20 61 6c 73 6f 20 64 6f 65 73 20  .  It also does 
1680: 76 61 72 69 61 62 6c 65 20 73 75 62 73 74 69 74  variable substit
1690: 75 74 69 6f 6e 20 69 6e 0a 23 20 74 68 65 20 6e  ution in.# the n
16a0: 61 6d 65 73 70 61 63 65 20 6f 66 20 69 74 73 20  amespace of its 
16b0: 63 61 6c 6c 69 6e 67 20 70 72 6f 63 65 64 75 72  calling procedur
16c0: 65 2e 0a 23 0a 70 72 6f 63 20 70 75 74 73 69 6e  e..#.proc putsin
16d0: 34 20 7b 66 64 20 74 65 78 74 7d 20 7b 0a 20 20  4 {fd text} {.  
16e0: 72 65 67 73 75 62 20 2d 61 6c 6c 20 22 5c 6e 20  regsub -all "\n 
16f0: 20 20 20 22 20 24 74 65 78 74 20 5c 6e 20 74 65     " $text \n te
1700: 78 74 0a 20 20 70 75 74 73 20 24 66 64 20 5b 75  xt.  puts $fd [u
1710: 70 6c 65 76 65 6c 20 31 20 5b 6c 69 73 74 20 73  plevel 1 [list s
1720: 75 62 73 74 20 2d 6e 6f 62 61 63 6b 20 2d 6e 6f  ubst -noback -no
1730: 63 6f 6d 20 24 74 65 78 74 5d 5d 0a 7d 0a 0a 23  com $text]].}..#
1740: 20 41 20 70 72 6f 63 65 64 75 72 65 20 74 6f 20   A procedure to 
1750: 77 72 69 74 65 20 74 68 65 20 63 6f 6d 6d 6f 6e  write the common
1760: 20 68 65 61 64 65 72 20 66 6f 75 6e 64 20 6f 6e   header found on
1770: 20 65 76 65 72 79 20 48 54 4d 4c 20 66 69 6c 65   every HTML file
1780: 20 6f 6e 0a 23 20 74 68 65 20 53 51 4c 69 74 65   on.# the SQLite
1790: 20 77 65 62 73 69 74 65 2e 0a 23 0a 70 72 6f 63   website..#.proc
17a0: 20 77 72 69 74 65 5f 68 65 61 64 65 72 20 7b 70   write_header {p
17b0: 61 74 68 20 66 64 20 74 69 74 6c 65 7d 20 7b 0a  ath fd title} {.
17c0: 20 20 70 75 74 73 20 24 66 64 20 7b 3c 21 44 4f    puts $fd {<!DO
17d0: 43 54 59 50 45 20 48 54 4d 4c 20 50 55 42 4c 49  CTYPE HTML PUBLI
17e0: 43 20 22 2d 2f 2f 57 33 43 2f 2f 44 54 44 20 48  C "-//W3C//DTD H
17f0: 54 4d 4c 20 34 2e 30 31 2f 2f 45 4e 22 20 22 68  TML 4.01//EN" "h
1800: 74 74 70 3a 2f 2f 77 77 77 2e 77 33 2e 6f 72 67  ttp://www.w3.org
1810: 2f 54 52 2f 68 74 6d 6c 34 2f 73 74 72 69 63 74  /TR/html4/strict
1820: 2e 64 74 64 22 3e 7d 0a 20 20 70 75 74 73 20 24  .dtd">}.  puts $
1830: 66 64 20 7b 3c 68 74 6d 6c 3e 3c 68 65 61 64 3e  fd {<html><head>
1840: 7d 0a 20 20 70 75 74 73 20 24 66 64 20 22 3c 74  }.  puts $fd "<t
1850: 69 74 6c 65 3e 24 74 69 74 6c 65 3c 2f 74 69 74  itle>$title</tit
1860: 6c 65 3e 22 0a 20 20 70 75 74 73 69 6e 34 20 24  le>".  putsin4 $
1870: 66 64 20 7b 3c 73 74 79 6c 65 20 74 79 70 65 3d  fd {<style type=
1880: 22 74 65 78 74 2f 63 73 73 22 3e 0a 20 20 20 20  "text/css">.    
1890: 62 6f 64 79 20 7b 0a 20 20 20 20 20 20 20 20 6d  body {.        m
18a0: 61 72 67 69 6e 3a 20 61 75 74 6f 3b 0a 20 20 20  argin: auto;.   
18b0: 20 20 20 20 20 66 6f 6e 74 2d 66 61 6d 69 6c 79       font-family
18c0: 3a 20 56 65 72 64 61 6e 61 2c 20 73 61 6e 73 2d  : Verdana, sans-
18d0: 73 65 72 69 66 3b 0a 20 20 20 20 20 20 20 20 70  serif;.        p
18e0: 61 64 64 69 6e 67 3a 20 38 70 78 20 31 25 3b 0a  adding: 8px 1%;.
18f0: 20 20 20 20 7d 0a 20 20 20 20 0a 20 20 20 20 61      }.    .    a
1900: 20 7b 20 63 6f 6c 6f 72 3a 20 23 30 34 34 61 36   { color: #044a6
1910: 34 20 7d 0a 20 20 20 20 61 3a 76 69 73 69 74 65  4 }.    a:visite
1920: 64 20 7b 20 63 6f 6c 6f 72 3a 20 23 37 33 34 35  d { color: #7345
1930: 35 39 20 7d 0a 20 20 20 20 0a 20 20 20 20 2e 6c  59 }.    .    .l
1940: 6f 67 6f 20 7b 20 70 6f 73 69 74 69 6f 6e 3a 61  ogo { position:a
1950: 62 73 6f 6c 75 74 65 3b 20 6d 61 72 67 69 6e 3a  bsolute; margin:
1960: 33 70 78 3b 20 7d 0a 20 20 20 20 2e 74 61 67 6c  3px; }.    .tagl
1970: 69 6e 65 20 7b 0a 20 20 20 20 20 20 66 6c 6f 61  ine {.      floa
1980: 74 3a 72 69 67 68 74 3b 0a 20 20 20 20 20 20 74  t:right;.      t
1990: 65 78 74 2d 61 6c 69 67 6e 3a 72 69 67 68 74 3b  ext-align:right;
19a0: 0a 20 20 20 20 20 20 66 6f 6e 74 2d 73 74 79 6c  .      font-styl
19b0: 65 3a 69 74 61 6c 69 63 3b 0a 20 20 20 20 20 20  e:italic;.      
19c0: 77 69 64 74 68 3a 32 34 30 70 78 3b 0a 20 20 20  width:240px;.   
19d0: 20 20 20 6d 61 72 67 69 6e 3a 31 32 70 78 3b 0a     margin:12px;.
19e0: 20 20 20 20 20 20 6d 61 72 67 69 6e 2d 74 6f 70        margin-top
19f0: 3a 35 38 70 78 3b 0a 20 20 20 20 7d 0a 20 20 20  :58px;.    }.   
1a00: 20 0a 20 20 20 20 2e 6d 65 6e 75 62 61 72 20 7b   .    .menubar {
1a10: 0a 20 20 20 20 20 20 63 6c 65 61 72 3a 20 62 6f  .      clear: bo
1a20: 74 68 3b 0a 20 20 20 20 20 20 62 6f 72 64 65 72  th;.      border
1a30: 2d 72 61 64 69 75 73 3a 20 38 70 78 3b 0a 20 20  -radius: 8px;.  
1a40: 20 20 20 20 62 61 63 6b 67 72 6f 75 6e 64 3a 20      background: 
1a50: 23 30 34 34 61 36 34 3b 0a 20 20 20 20 20 20 70  #044a64;.      p
1a60: 61 64 64 69 6e 67 3a 20 30 70 78 3b 0a 20 20 20  adding: 0px;.   
1a70: 20 20 20 6d 61 72 67 69 6e 3a 20 30 70 78 3b 0a     margin: 0px;.
1a80: 20 20 20 20 20 20 63 65 6c 6c 2d 73 70 61 63 69        cell-spaci
1a90: 6e 67 3a 20 30 70 78 3b 0a 20 20 20 20 7d 20 20  ng: 0px;.    }  
1aa0: 20 20 0a 20 20 20 20 2e 74 6f 6f 6c 62 61 72 20    .    .toolbar 
1ab0: 7b 0a 20 20 20 20 20 20 74 65 78 74 2d 61 6c 69  {.      text-ali
1ac0: 67 6e 3a 20 63 65 6e 74 65 72 3b 0a 20 20 20 20  gn: center;.    
1ad0: 20 20 6c 69 6e 65 2d 68 65 69 67 68 74 3a 20 31    line-height: 1
1ae0: 2e 36 65 6d 3b 0a 20 20 20 20 20 20 6d 61 72 67  .6em;.      marg
1af0: 69 6e 3a 20 30 3b 0a 20 20 20 20 20 20 70 61 64  in: 0;.      pad
1b00: 64 69 6e 67 3a 20 30 70 78 20 38 70 78 3b 0a 20  ding: 0px 8px;. 
1b10: 20 20 20 7d 0a 20 20 20 20 2e 74 6f 6f 6c 62 61     }.    .toolba
1b20: 72 20 61 20 7b 20 63 6f 6c 6f 72 3a 20 77 68 69  r a { color: whi
1b30: 74 65 3b 20 74 65 78 74 2d 64 65 63 6f 72 61 74  te; text-decorat
1b40: 69 6f 6e 3a 20 6e 6f 6e 65 3b 20 70 61 64 64 69  ion: none; paddi
1b50: 6e 67 3a 20 36 70 78 20 31 32 70 78 3b 20 7d 0a  ng: 6px 12px; }.
1b60: 20 20 20 20 2e 74 6f 6f 6c 62 61 72 20 61 3a 76      .toolbar a:v
1b70: 69 73 69 74 65 64 20 7b 20 63 6f 6c 6f 72 3a 20  isited { color: 
1b80: 77 68 69 74 65 3b 20 7d 0a 20 20 20 20 2e 74 6f  white; }.    .to
1b90: 6f 6c 62 61 72 20 61 3a 68 6f 76 65 72 20 7b 20  olbar a:hover { 
1ba0: 63 6f 6c 6f 72 3a 20 23 30 34 34 61 36 34 3b 20  color: #044a64; 
1bb0: 62 61 63 6b 67 72 6f 75 6e 64 3a 20 77 68 69 74  background: whit
1bc0: 65 3b 20 7d 0a 20 20 20 20 0a 20 20 20 20 2e 63  e; }.    .    .c
1bd0: 6f 6e 74 65 6e 74 20 20 20 20 7b 20 6d 61 72 67  ontent    { marg
1be0: 69 6e 3a 20 35 25 3b 20 7d 0a 20 20 20 20 2e 63  in: 5%; }.    .c
1bf0: 6f 6e 74 65 6e 74 20 64 74 20 7b 20 66 6f 6e 74  ontent dt { font
1c00: 2d 77 65 69 67 68 74 3a 62 6f 6c 64 3b 20 7d 0a  -weight:bold; }.
1c10: 20 20 20 20 2e 63 6f 6e 74 65 6e 74 20 64 64 20      .content dd 
1c20: 7b 20 6d 61 72 67 69 6e 2d 62 6f 74 74 6f 6d 3a  { margin-bottom:
1c30: 20 32 35 70 78 3b 20 6d 61 72 67 69 6e 2d 6c 65   25px; margin-le
1c40: 66 74 3a 32 30 25 3b 20 7d 0a 20 20 20 20 2e 63  ft:20%; }.    .c
1c50: 6f 6e 74 65 6e 74 20 75 6c 20 7b 20 70 61 64 64  ontent ul { padd
1c60: 69 6e 67 3a 30 70 78 3b 20 70 61 64 64 69 6e 67  ing:0px; padding
1c70: 2d 6c 65 66 74 3a 20 31 35 70 78 3b 20 6d 61 72  -left: 15px; mar
1c80: 67 69 6e 3a 30 70 78 3b 20 7d 0a 0a 20 20 20 20  gin:0px; }..    
1c90: 2f 2a 20 54 65 78 74 20 77 69 74 68 69 6e 20 63  /* Text within c
1ca0: 6f 6c 6f 72 65 64 20 62 6f 78 65 73 2e 0a 20 20  olored boxes..  
1cb0: 20 20 2a 2a 20 20 65 76 65 72 72 20 69 73 20 72    **  everr is r
1cc0: 65 64 2e 20 20 65 76 6f 6b 20 69 73 20 67 72 65  ed.  evok is gre
1cd0: 65 6e 2e 20 65 76 6e 69 6c 20 69 73 20 77 68 69  en. evnil is whi
1ce0: 74 65 20 2a 2f 0a 20 20 20 20 2e 65 76 65 72 72  te */.    .everr
1cf0: 20 7b 0a 20 20 20 20 20 20 66 6f 6e 74 2d 66 61   {.      font-fa
1d00: 6d 69 6c 79 3a 20 6d 6f 6e 6f 73 70 61 63 65 3b  mily: monospace;
1d10: 0a 20 20 20 20 20 20 66 6f 6e 74 2d 73 74 79 6c  .      font-styl
1d20: 65 3a 20 6e 6f 72 6d 61 6c 3b 0a 20 20 20 20 20  e: normal;.     
1d30: 20 62 61 63 6b 67 72 6f 75 6e 64 3a 20 23 66 66   background: #ff
1d40: 61 30 61 30 3b 0a 20 20 20 20 20 20 62 6f 72 64  a0a0;.      bord
1d50: 65 72 2d 73 74 79 6c 65 3a 20 73 6f 6c 69 64 3b  er-style: solid;
1d60: 0a 20 20 20 20 20 20 62 6f 72 64 65 72 2d 77 69  .      border-wi
1d70: 64 74 68 3a 20 32 70 78 3b 0a 20 20 20 20 20 20  dth: 2px;.      
1d80: 62 6f 72 64 65 72 2d 63 6f 6c 6f 72 3a 20 23 61  border-color: #a
1d90: 30 30 30 30 30 3b 0a 20 20 20 20 20 20 70 61 64  00000;.      pad
1da0: 64 69 6e 67 3a 20 30 70 78 20 35 70 78 20 30 70  ding: 0px 5px 0p
1db0: 78 20 35 70 78 3b 0a 20 20 20 20 7d 0a 20 20 20  x 5px;.    }.   
1dc0: 20 2e 65 76 6f 6b 20 7b 0a 20 20 20 20 20 20 66   .evok {.      f
1dd0: 6f 6e 74 2d 66 61 6d 69 6c 79 3a 20 6d 6f 6e 6f  ont-family: mono
1de0: 73 70 61 63 65 3b 0a 20 20 20 20 20 20 66 6f 6e  space;.      fon
1df0: 74 2d 73 74 79 6c 65 3a 20 6e 6f 72 6d 61 6c 3b  t-style: normal;
1e00: 0a 20 20 20 20 20 20 62 61 63 6b 67 72 6f 75 6e  .      backgroun
1e10: 64 3a 20 23 61 30 66 66 61 30 3b 0a 20 20 20 20  d: #a0ffa0;.    
1e20: 20 20 62 6f 72 64 65 72 2d 73 74 79 6c 65 3a 20    border-style: 
1e30: 73 6f 6c 69 64 3b 0a 20 20 20 20 20 20 62 6f 72  solid;.      bor
1e40: 64 65 72 2d 77 69 64 74 68 3a 20 32 70 78 3b 0a  der-width: 2px;.
1e50: 20 20 20 20 20 20 62 6f 72 64 65 72 2d 63 6f 6c        border-col
1e60: 6f 72 3a 20 23 30 30 61 30 30 30 3b 0a 20 20 20  or: #00a000;.   
1e70: 20 20 20 70 61 64 64 69 6e 67 3a 20 30 70 78 20     padding: 0px 
1e80: 35 70 78 20 30 70 78 20 35 70 78 3b 0a 20 20 20  5px 0px 5px;.   
1e90: 20 7d 0a 20 20 20 20 2e 65 76 6c 30 20 7b 0a 20   }.    .evl0 {. 
1ea0: 20 20 20 20 20 66 6f 6e 74 2d 66 61 6d 69 6c 79       font-family
1eb0: 3a 20 6d 6f 6e 6f 73 70 61 63 65 3b 0a 20 20 20  : monospace;.   
1ec0: 20 20 20 66 6f 6e 74 2d 73 74 79 6c 65 3a 20 6e     font-style: n
1ed0: 6f 72 6d 61 6c 3b 0a 20 20 20 20 20 20 62 61 63  ormal;.      bac
1ee0: 6b 67 72 6f 75 6e 64 3a 20 23 66 66 66 66 66 66  kground: #ffffff
1ef0: 3b 0a 20 20 20 20 20 20 62 6f 72 64 65 72 2d 73  ;.      border-s
1f00: 74 79 6c 65 3a 20 73 6f 6c 69 64 3b 0a 20 20 20  tyle: solid;.   
1f10: 20 20 20 62 6f 72 64 65 72 2d 77 69 64 74 68 3a     border-width:
1f20: 20 32 70 78 3b 0a 20 20 20 20 20 20 62 6f 72 64   2px;.      bord
1f30: 65 72 2d 63 6f 6c 6f 72 3a 20 23 30 30 36 30 63  er-color: #0060c
1f40: 30 3b 0a 20 20 20 20 20 20 70 61 64 64 69 6e 67  0;.      padding
1f50: 3a 20 30 70 78 20 35 70 78 20 30 70 78 20 35 70  : 0px 5px 0px 5p
1f60: 78 3b 0a 20 20 20 20 7d 0a 20 20 20 20 2e 65 76  x;.    }.    .ev
1f70: 6c 31 20 7b 0a 20 20 20 20 20 20 66 6f 6e 74 2d  l1 {.      font-
1f80: 66 61 6d 69 6c 79 3a 20 6d 6f 6e 6f 73 70 61 63  family: monospac
1f90: 65 3b 0a 20 20 20 20 20 20 66 6f 6e 74 2d 73 74  e;.      font-st
1fa0: 79 6c 65 3a 20 6e 6f 72 6d 61 6c 3b 0a 20 20 20  yle: normal;.   
1fb0: 20 20 20 62 61 63 6b 67 72 6f 75 6e 64 3a 20 23     background: #
1fc0: 63 30 66 30 66 66 3b 0a 20 20 20 20 20 20 62 6f  c0f0ff;.      bo
1fd0: 72 64 65 72 2d 73 74 79 6c 65 3a 20 73 6f 6c 69  rder-style: soli
1fe0: 64 3b 0a 20 20 20 20 20 20 62 6f 72 64 65 72 2d  d;.      border-
1ff0: 77 69 64 74 68 3a 20 32 70 78 3b 0a 20 20 20 20  width: 2px;.    
2000: 20 20 62 6f 72 64 65 72 2d 63 6f 6c 6f 72 3a 20    border-color: 
2010: 23 30 30 36 30 63 30 3b 0a 20 20 20 20 20 20 70  #0060c0;.      p
2020: 61 64 64 69 6e 67 3a 20 30 70 78 20 35 70 78 20  adding: 0px 5px 
2030: 30 70 78 20 35 70 78 3b 0a 20 20 20 20 7d 0a 20  0px 5px;.    }. 
2040: 20 20 20 2e 65 76 6c 32 20 7b 0a 20 20 20 20 20     .evl2 {.     
2050: 20 66 6f 6e 74 2d 66 61 6d 69 6c 79 3a 20 6d 6f   font-family: mo
2060: 6e 6f 73 70 61 63 65 3b 0a 20 20 20 20 20 20 66  nospace;.      f
2070: 6f 6e 74 2d 73 74 79 6c 65 3a 20 6e 6f 72 6d 61  ont-style: norma
2080: 6c 3b 0a 20 20 20 20 20 20 62 61 63 6b 67 72 6f  l;.      backgro
2090: 75 6e 64 3a 20 23 39 30 63 37 66 65 3b 0a 20 20  und: #90c7fe;.  
20a0: 20 20 20 20 62 6f 72 64 65 72 2d 73 74 79 6c 65      border-style
20b0: 3a 20 73 6f 6c 69 64 3b 0a 20 20 20 20 20 20 62  : solid;.      b
20c0: 6f 72 64 65 72 2d 77 69 64 74 68 3a 20 32 70 78  order-width: 2px
20d0: 3b 0a 20 20 20 20 20 20 62 6f 72 64 65 72 2d 63  ;.      border-c
20e0: 6f 6c 6f 72 3a 20 23 30 30 36 30 63 30 3b 0a 20  olor: #0060c0;. 
20f0: 20 20 20 20 20 70 61 64 64 69 6e 67 3a 20 30 70       padding: 0p
2100: 78 20 35 70 78 20 30 70 78 20 35 70 78 3b 0a 20  x 5px 0px 5px;. 
2110: 20 20 20 7d 0a 20 20 20 20 2e 65 76 6c 33 20 7b     }.    .evl3 {
2120: 0a 20 20 20 20 20 20 66 6f 6e 74 2d 66 61 6d 69  .      font-fami
2130: 6c 79 3a 20 6d 6f 6e 6f 73 70 61 63 65 3b 0a 20  ly: monospace;. 
2140: 20 20 20 20 20 66 6f 6e 74 2d 73 74 79 6c 65 3a       font-style:
2150: 20 6e 6f 72 6d 61 6c 3b 0a 20 20 20 20 20 20 62   normal;.      b
2160: 61 63 6b 67 72 6f 75 6e 64 3a 20 23 34 30 61 30  ackground: #40a0
2170: 66 66 3b 0a 20 20 20 20 20 20 62 6f 72 64 65 72  ff;.      border
2180: 2d 73 74 79 6c 65 3a 20 73 6f 6c 69 64 3b 0a 20  -style: solid;. 
2190: 20 20 20 20 20 62 6f 72 64 65 72 2d 77 69 64 74       border-widt
21a0: 68 3a 20 32 70 78 3b 0a 20 20 20 20 20 20 62 6f  h: 2px;.      bo
21b0: 72 64 65 72 2d 63 6f 6c 6f 72 3a 20 23 30 30 36  rder-color: #006
21c0: 30 63 30 3b 0a 20 20 20 20 20 20 70 61 64 64 69  0c0;.      paddi
21d0: 6e 67 3a 20 30 70 78 20 35 70 78 20 30 70 78 20  ng: 0px 5px 0px 
21e0: 35 70 78 3b 0a 20 20 20 20 7d 0a 20 20 20 20 2e  5px;.    }.    .
21f0: 65 76 6e 69 6c 20 7b 0a 20 20 20 20 20 20 66 6f  evnil {.      fo
2200: 6e 74 2d 66 61 6d 69 6c 79 3a 20 6d 6f 6e 6f 73  nt-family: monos
2210: 70 61 63 65 3b 0a 20 20 20 20 20 20 66 6f 6e 74  pace;.      font
2220: 2d 73 74 79 6c 65 3a 20 6e 6f 72 6d 61 6c 3b 0a  -style: normal;.
2230: 20 20 20 20 20 20 62 6f 72 64 65 72 2d 73 74 79        border-sty
2240: 6c 65 3a 20 73 6f 6c 69 64 3b 0a 20 20 20 20 20  le: solid;.     
2250: 20 62 6f 72 64 65 72 2d 77 69 64 74 68 3a 20 31   border-width: 1
2260: 70 78 3b 0a 20 20 20 20 20 20 70 61 64 64 69 6e  px;.      paddin
2270: 67 3a 20 30 70 78 20 35 70 78 20 30 70 78 20 35  g: 0px 5px 0px 5
2280: 70 78 3b 0a 20 20 20 20 7d 0a 20 20 20 20 2e 65  px;.    }.    .e
2290: 76 20 7b 0a 20 20 20 20 20 20 66 6f 6e 74 2d 66  v {.      font-f
22a0: 61 6d 69 6c 79 3a 20 6d 6f 6e 6f 73 70 61 63 65  amily: monospace
22b0: 3b 0a 20 20 20 20 20 20 70 61 64 64 69 6e 67 3a  ;.      padding:
22c0: 20 30 70 78 20 35 70 78 20 30 70 78 20 35 70 78   0px 5px 0px 5px
22d0: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 0a 0a 20 20  ;.    }.    ..  
22e0: 20 20 3c 2f 73 74 79 6c 65 3e 0a 20 20 20 20 3c    </style>.    <
22f0: 6d 65 74 61 20 68 74 74 70 2d 65 71 75 69 76 3d  meta http-equiv=
2300: 22 63 6f 6e 74 65 6e 74 2d 74 79 70 65 22 20 63  "content-type" c
2310: 6f 6e 74 65 6e 74 3d 22 74 65 78 74 2f 68 74 6d  ontent="text/htm
2320: 6c 3b 20 63 68 61 72 73 65 74 3d 55 54 46 2d 38  l; charset=UTF-8
2330: 22 3e 0a 20 20 7d 0a 20 20 70 75 74 73 20 24 66  ">.  }.  puts $f
2340: 64 20 7b 3c 2f 68 65 61 64 3e 7d 0a 20 20 69 66  d {</head>}.  if
2350: 20 7b 5b 66 69 6c 65 20 65 78 69 73 74 73 20 44   {[file exists D
2360: 52 41 46 54 5d 7d 20 7b 0a 20 20 20 20 73 65 74  RAFT]} {.    set
2370: 20 74 61 67 6c 69 6e 65 20 7b 3c 66 6f 6e 74 20   tagline {<font 
2380: 73 69 7a 65 3d 22 36 22 20 63 6f 6c 6f 72 3d 22  size="6" color="
2390: 72 65 64 22 3e 2a 2a 2a 20 44 52 41 46 54 20 2a  red">*** DRAFT *
23a0: 2a 2a 3c 2f 66 6f 6e 74 3e 7d 0a 20 20 7d 20 65  **</font>}.  } e
23b0: 6c 73 65 20 7b 0a 20 20 20 20 73 65 74 20 74 61  lse {.    set ta
23c0: 67 6c 69 6e 65 20 7b 53 6d 61 6c 6c 2e 20 46 61  gline {Small. Fa
23d0: 73 74 2e 20 52 65 6c 69 61 62 6c 65 2e 3c 62 72  st. Reliable.<br
23e0: 3e 43 68 6f 6f 73 65 20 61 6e 79 20 74 68 72 65  >Choose any thre
23f0: 65 2e 7d 0a 20 20 7d 0a 20 20 70 75 74 73 69 6e  e.}.  }.  putsin
2400: 34 20 24 66 64 20 7b 3c 62 6f 64 79 3e 0a 20 20  4 $fd {<body>.  
2410: 20 20 3c 64 69 76 3e 3c 21 2d 2d 20 63 6f 6e 74    <div><!-- cont
2420: 61 69 6e 65 72 20 64 69 76 20 74 6f 20 73 61 74  ainer div to sat
2430: 69 73 66 79 20 76 61 6c 69 64 61 74 6f 72 20 2d  isfy validator -
2440: 2d 3e 0a 20 20 20 20 0a 20 20 20 20 3c 61 20 68  ->.    .    <a h
2450: 72 65 66 3d 22 24 7b 70 61 74 68 7d 69 6e 64 65  ref="${path}inde
2460: 78 2e 68 74 6d 6c 22 3e 0a 20 20 20 20 3c 69 6d  x.html">.    <im
2470: 67 20 63 6c 61 73 73 3d 22 6c 6f 67 6f 22 20 73  g class="logo" s
2480: 72 63 3d 22 24 7b 70 61 74 68 7d 69 6d 61 67 65  rc="${path}image
2490: 73 2f 73 71 6c 69 74 65 33 37 30 5f 62 61 6e 6e  s/sqlite370_bann
24a0: 65 72 2e 67 69 66 22 20 61 6c 74 3d 22 53 51 4c  er.gif" alt="SQL
24b0: 69 74 65 20 4c 6f 67 6f 22 0a 20 20 20 20 20 62  ite Logo".     b
24c0: 6f 72 64 65 72 3d 22 30 22 3e 3c 2f 61 3e 0a 20  order="0"></a>. 
24d0: 20 20 20 3c 64 69 76 3e 3c 21 2d 2d 20 49 45 20     <div><!-- IE 
24e0: 68 61 63 6b 20 74 6f 20 70 72 65 76 65 6e 74 20  hack to prevent 
24f0: 64 69 73 61 70 70 65 61 72 69 6e 67 20 6c 6f 67  disappearing log
2500: 6f 2d 2d 3e 3c 2f 64 69 76 3e 0a 20 20 20 20 3c  o--></div>.    <
2510: 64 69 76 20 63 6c 61 73 73 3d 22 74 61 67 6c 69  div class="tagli
2520: 6e 65 22 3e 24 7b 74 61 67 6c 69 6e 65 7d 3c 2f  ne">${tagline}</
2530: 64 69 76 3e 0a 0a 20 20 20 20 3c 74 61 62 6c 65  div>..    <table
2540: 20 77 69 64 74 68 3d 31 30 30 25 20 63 6c 61 73   width=100% clas
2550: 73 3d 22 6d 65 6e 75 62 61 72 22 3e 3c 74 72 3e  s="menubar"><tr>
2560: 3c 74 64 3e 0a 20 20 20 20 20 20 3c 64 69 76 20  <td>.      <div 
2570: 63 6c 61 73 73 3d 22 74 6f 6f 6c 62 61 72 22 3e  class="toolbar">
2580: 0a 20 20 20 20 20 20 20 20 3c 61 20 68 72 65 66  .        <a href
2590: 3d 22 24 7b 70 61 74 68 7d 61 62 6f 75 74 2e 68  ="${path}about.h
25a0: 74 6d 6c 22 3e 41 62 6f 75 74 3c 2f 61 3e 0a 20  tml">About</a>. 
25b0: 20 20 20 20 20 20 20 3c 61 20 68 72 65 66 3d 22         <a href="
25c0: 24 7b 70 61 74 68 7d 64 6f 63 73 2e 68 74 6d 6c  ${path}docs.html
25d0: 22 3e 44 6f 63 75 6d 65 6e 74 61 74 69 6f 6e 3c  ">Documentation<
25e0: 2f 61 3e 0a 20 20 20 20 20 20 20 20 3c 61 20 68  /a>.        <a h
25f0: 72 65 66 3d 22 24 7b 70 61 74 68 7d 64 6f 77 6e  ref="${path}down
2600: 6c 6f 61 64 2e 68 74 6d 6c 22 3e 44 6f 77 6e 6c  load.html">Downl
2610: 6f 61 64 3c 2f 61 3e 0a 20 20 20 20 20 20 20 20  oad</a>.        
2620: 3c 61 20 68 72 65 66 3d 22 24 7b 70 61 74 68 7d  <a href="${path}
2630: 63 6f 70 79 72 69 67 68 74 2e 68 74 6d 6c 22 3e  copyright.html">
2640: 4c 69 63 65 6e 73 65 3c 2f 61 3e 0a 20 20 20 20  License</a>.    
2650: 20 20 20 20 3c 61 20 68 72 65 66 3d 22 24 7b 70      <a href="${p
2660: 61 74 68 7d 73 75 70 70 6f 72 74 2e 68 74 6d 6c  ath}support.html
2670: 22 3e 53 75 70 70 6f 72 74 3c 2f 61 3e 0a 20 20  ">Support</a>.  
2680: 20 20 20 20 20 20 3c 61 20 68 72 65 66 3d 22 68        <a href="h
2690: 74 74 70 3a 2f 2f 77 77 77 2e 68 77 61 63 69 2e  ttp://www.hwaci.
26a0: 63 6f 6d 2f 73 77 2f 73 71 6c 69 74 65 2f 70 72  com/sw/sqlite/pr
26b0: 6f 73 75 70 70 6f 72 74 2e 68 74 6d 6c 22 3e 50  osupport.html">P
26c0: 75 72 63 68 61 73 65 3c 2f 61 3e 0a 20 20 20 20  urchase</a>.    
26d0: 20 20 3c 2f 64 69 76 3e 0a 20 20 20 20 3c 2f 74    </div>.    </t
26e0: 64 3e 3c 2f 74 72 3e 3c 2f 74 61 62 6c 65 3e 0a  d></tr></table>.
26f0: 20 20 7d 0a 7d 0a 23 20 45 6e 64 20 6f 66 20 63    }.}.# End of c
2700: 6f 64 65 20 63 6f 70 69 65 64 20 6f 75 74 20 6f  ode copied out o
2710: 66 20 77 72 61 70 2e 74 63 6c 0a 23 23 23 23 23  f wrap.tcl.#####
2720: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
2730: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
2740: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
2750: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
2760: 23 23 23 23 23 23 23 23 23 0a 0a 23 20 47 65 6e  #########..# Gen
2770: 65 72 61 74 65 20 74 68 65 20 72 65 71 75 69 72  erate the requir
2780: 65 6d 65 6e 74 73 20 74 72 61 63 65 61 62 69 6c  ements traceabil
2790: 69 74 79 20 6d 61 74 72 69 78 2e 0a 23 0a 70 75  ity matrix..#.pu
27a0: 74 73 20 22 47 65 6e 65 72 61 74 69 6e 67 20 72  ts "Generating r
27b0: 65 71 75 69 72 65 6d 65 6e 74 73 20 6d 61 74 72  equirements matr
27c0: 69 78 2e 2e 2e 22 0a 66 6c 75 73 68 20 73 74 64  ix...".flush std
27d0: 6f 75 74 0a 73 65 74 20 6f 75 74 20 5b 6f 70 65  out.set out [ope
27e0: 6e 20 64 6f 63 2f 6d 61 74 72 69 78 2f 6d 61 74  n doc/matrix/mat
27f0: 72 69 78 2e 68 74 6d 6c 20 77 5d 0a 77 72 69 74  rix.html w].writ
2800: 65 5f 68 65 61 64 65 72 20 2e 2e 2f 20 24 6f 75  e_header ../ $ou
2810: 74 20 7b 53 51 4c 69 74 65 20 52 65 71 75 69 72  t {SQLite Requir
2820: 65 6d 65 6e 74 73 20 4d 61 74 72 69 78 20 49 6e  ements Matrix In
2830: 64 65 78 7d 0a 70 75 74 73 20 24 6f 75 74 20 22  dex}.puts $out "
2840: 3c 68 31 20 61 6c 69 67 6e 3d 63 65 6e 74 65 72  <h1 align=center
2850: 3e 53 51 4c 69 74 65 20 52 65 71 75 69 72 65 6d  >SQLite Requirem
2860: 65 6e 74 73 20 4d 61 74 72 69 78 20 49 6e 64 65  ents Matrix Inde
2870: 78 3c 2f 68 31 3e 22 0a 70 75 74 73 20 24 6f 75  x</h1>".puts $ou
2880: 74 20 22 3c 74 61 62 6c 65 20 62 6f 72 64 65 72  t "<table border
2890: 3d 30 20 61 6c 69 67 6e 3d 63 65 6e 74 65 72 3e  =0 align=center>
28a0: 22 0a 73 65 74 20 73 72 63 6c 69 73 74 20 5b 64  ".set srclist [d
28b0: 62 20 65 76 61 6c 20 7b 53 45 4c 45 43 54 20 44  b eval {SELECT D
28c0: 49 53 54 49 4e 43 54 20 73 72 63 66 69 6c 65 20  ISTINCT srcfile 
28d0: 46 52 4f 4d 20 72 65 71 75 69 72 65 6d 65 6e 74  FROM requirement
28e0: 20 4f 52 44 45 52 20 42 59 20 31 7d 5d 0a 73 65   ORDER BY 1}].se
28f0: 74 20 72 6f 77 63 6e 74 20 30 0a 73 65 74 20 63  t rowcnt 0.set c
2900: 6f 6c 75 6d 6e 5f 74 69 74 6c 65 73 20 7b 3c 74  olumn_titles {<t
2910: 72 3e 3c 74 68 3e 3c 74 68 3e 74 63 6c 3c 74 68  r><th><th>tcl<th
2920: 3e 73 6c 74 3c 74 68 3e 74 68 33 3c 74 68 3e 73  >slt<th>th3<th>s
2930: 72 63 3c 74 68 3e 61 6e 79 3c 74 68 3e 3c 74 68  rc<th>any<th><th
2940: 3e 3c 2f 74 72 3e 7d 0a 73 65 74 20 74 6f 74 61  ></tr>}.set tota
2950: 6c 28 74 63 6c 29 20 30 0a 73 65 74 20 74 6f 74  l(tcl) 0.set tot
2960: 61 6c 28 74 68 33 29 20 30 0a 73 65 74 20 74 6f  al(th3) 0.set to
2970: 74 61 6c 28 73 72 63 29 20 30 0a 73 65 74 20 74  tal(src) 0.set t
2980: 6f 74 61 6c 28 73 6c 74 29 20 30 0a 73 65 74 20  otal(slt) 0.set 
2990: 74 6f 74 61 6c 28 61 6e 79 29 20 30 0a 73 65 74  total(any) 0.set
29a0: 20 74 6f 74 61 6c 28 61 6c 6c 29 20 30 0a 0a 66   total(all) 0..f
29b0: 6f 72 65 61 63 68 20 73 72 63 66 69 6c 65 20 24  oreach srcfile $
29c0: 73 72 63 6c 69 73 74 20 7b 0a 20 20 69 66 20 7b  srclist {.  if {
29d0: 24 72 6f 77 63 6e 74 25 32 30 3d 3d 30 7d 20 7b  $rowcnt%20==0} {
29e0: 70 75 74 73 20 24 6f 75 74 20 24 63 6f 6c 75 6d  puts $out $colum
29f0: 6e 5f 74 69 74 6c 65 73 7d 0a 20 20 69 6e 63 72  n_titles}.  incr
2a00: 20 72 6f 77 63 6e 74 0a 20 20 64 62 20 65 76 61   rowcnt.  db eva
2a10: 6c 20 7b 0a 20 20 20 20 43 52 45 41 54 45 20 54  l {.    CREATE T
2a20: 45 4d 50 20 54 41 42 4c 45 20 49 46 20 4e 4f 54  EMP TABLE IF NOT
2a30: 20 45 58 49 53 54 53 20 73 72 63 72 65 71 28 72   EXISTS srcreq(r
2a40: 65 71 6e 6f 20 54 45 58 54 20 50 52 49 4d 41 52  eqno TEXT PRIMAR
2a50: 59 20 4b 45 59 20 4f 4e 20 43 4f 4e 46 4c 49 43  Y KEY ON CONFLIC
2a60: 54 20 49 47 4e 4f 52 45 29 3b 0a 20 20 20 20 44  T IGNORE);.    D
2a70: 45 4c 45 54 45 20 46 52 4f 4d 20 73 72 63 72 65  ELETE FROM srcre
2a80: 71 3b 0a 20 20 20 20 49 4e 53 45 52 54 20 49 4e  q;.    INSERT IN
2a90: 54 4f 20 73 72 63 72 65 71 20 53 45 4c 45 43 54  TO srcreq SELECT
2aa0: 20 72 65 71 6e 6f 20 46 52 4f 4d 20 72 65 71 75   reqno FROM requ
2ab0: 69 72 65 6d 65 6e 74 20 57 48 45 52 45 20 73 72  irement WHERE sr
2ac0: 63 66 69 6c 65 3d 24 73 72 63 66 69 6c 65 3b 0a  cfile=$srcfile;.
2ad0: 20 20 7d 0a 20 20 73 65 74 20 74 6f 74 61 6c 63    }.  set totalc
2ae0: 6e 74 20 5b 64 62 20 6f 6e 65 20 7b 53 45 4c 45  nt [db one {SELE
2af0: 43 54 20 63 6f 75 6e 74 28 2a 29 20 46 52 4f 4d  CT count(*) FROM
2b00: 20 73 72 63 72 65 71 7d 5d 0a 20 20 69 6e 63 72   srcreq}].  incr
2b10: 20 74 6f 74 61 6c 28 61 6c 6c 29 20 24 74 6f 74   total(all) $tot
2b20: 61 6c 63 6e 74 0a 20 20 70 75 74 73 20 24 6f 75  alcnt.  puts $ou
2b30: 74 20 22 3c 74 72 3e 3c 74 64 3e 3c 61 20 68 72  t "<tr><td><a hr
2b40: 65 66 3d 5c 22 24 73 72 63 66 69 6c 65 5c 22 3e  ef=\"$srcfile\">
2b50: 24 73 72 63 66 69 6c 65 3c 2f 61 3e 3c 2f 74 64  $srcfile</a></td
2b60: 3e 22 0a 20 20 73 65 74 20 65 76 28 74 63 6c 29  >".  set ev(tcl)
2b70: 20 30 0a 20 20 73 65 74 20 65 76 28 74 68 33 29   0.  set ev(th3)
2b80: 20 30 0a 20 20 73 65 74 20 65 76 28 73 72 63 29   0.  set ev(src)
2b90: 20 30 0a 20 20 73 65 74 20 65 76 28 73 6c 74 29   0.  set ev(slt)
2ba0: 20 30 0a 20 20 73 65 74 20 65 76 28 61 6e 79 29   0.  set ev(any)
2bb0: 20 30 0a 20 20 64 62 20 65 76 61 6c 20 7b 0a 20   0.  db eval {. 
2bc0: 20 20 20 53 45 4c 45 43 54 20 63 6f 75 6e 74 28     SELECT count(
2bd0: 64 69 73 74 69 6e 63 74 20 72 65 71 6e 6f 29 20  distinct reqno) 
2be0: 41 53 20 63 6e 74 2c 20 73 72 63 63 6c 61 73 73  AS cnt, srcclass
2bf0: 20 0a 20 20 20 20 20 20 46 52 4f 4d 20 65 76 69   .      FROM evi
2c00: 64 65 6e 63 65 0a 20 20 20 20 20 57 48 45 52 45  dence.     WHERE
2c10: 20 72 65 71 6e 6f 20 49 4e 20 73 72 63 72 65 71   reqno IN srcreq
2c20: 0a 20 20 20 20 20 47 52 4f 55 50 20 42 59 20 73  .     GROUP BY s
2c30: 72 63 63 6c 61 73 73 0a 20 20 7d 20 7b 0a 20 20  rcclass.  } {.  
2c40: 20 20 73 65 74 20 65 76 28 24 73 72 63 63 6c 61    set ev($srccla
2c50: 73 73 29 20 24 63 6e 74 0a 20 20 20 20 69 6e 63  ss) $cnt.    inc
2c60: 72 20 74 6f 74 61 6c 28 24 73 72 63 63 6c 61 73  r total($srcclas
2c70: 73 29 20 24 63 6e 74 0a 20 20 7d 0a 20 20 64 62  s) $cnt.  }.  db
2c80: 20 65 76 61 6c 20 7b 0a 20 20 20 20 53 45 4c 45   eval {.    SELE
2c90: 43 54 20 63 6f 75 6e 74 28 64 69 73 74 69 6e 63  CT count(distinc
2ca0: 74 20 72 65 71 6e 6f 29 20 41 53 20 63 6e 74 0a  t reqno) AS cnt.
2cb0: 20 20 20 20 20 20 46 52 4f 4d 20 65 76 69 64 65        FROM evide
2cc0: 6e 63 65 0a 20 20 20 20 20 57 48 45 52 45 20 72  nce.     WHERE r
2cd0: 65 71 6e 6f 20 49 4e 20 73 72 63 72 65 71 0a 20  eqno IN srcreq. 
2ce0: 20 7d 20 7b 0a 20 20 20 20 73 65 74 20 65 76 28   } {.    set ev(
2cf0: 61 6e 79 29 20 24 63 6e 74 0a 20 20 20 20 69 6e  any) $cnt.    in
2d00: 63 72 20 74 6f 74 61 6c 28 61 6e 79 29 20 24 63  cr total(any) $c
2d10: 6e 74 0a 20 20 7d 0a 20 20 66 6f 72 65 61 63 68  nt.  }.  foreach
2d20: 20 73 72 63 63 6c 61 73 73 20 7b 74 63 6c 20 73   srcclass {tcl s
2d30: 6c 74 20 74 68 33 20 73 72 63 20 61 6e 79 7d 20  lt th3 src any} 
2d40: 7b 0a 20 20 20 20 73 65 74 20 63 6e 74 20 24 65  {.    set cnt $e
2d50: 76 28 24 73 72 63 63 6c 61 73 73 29 0a 20 20 20  v($srcclass).   
2d60: 20 69 66 20 7b 24 63 6e 74 3d 3d 24 74 6f 74 61   if {$cnt==$tota
2d70: 6c 63 6e 74 7d 20 7b 0a 20 20 20 20 20 20 73 65  lcnt} {.      se
2d80: 74 20 63 78 20 65 76 6f 6b 0a 20 20 20 20 7d 20  t cx evok.    } 
2d90: 65 6c 73 65 69 66 20 7b 24 63 6e 74 3e 3d 30 2e  elseif {$cnt>=0.
2da0: 37 35 2a 24 74 6f 74 61 6c 63 6e 74 7d 20 7b 0a  75*$totalcnt} {.
2db0: 20 20 20 20 20 20 73 65 74 20 63 78 20 65 76 6c        set cx evl
2dc0: 33 0a 20 20 20 20 7d 20 65 6c 73 65 69 66 20 7b  3.    } elseif {
2dd0: 24 63 6e 74 3e 3d 30 2e 35 2a 24 74 6f 74 61 6c  $cnt>=0.5*$total
2de0: 63 6e 74 7d 20 7b 0a 20 20 20 20 20 20 73 65 74  cnt} {.      set
2df0: 20 63 78 20 65 76 6c 32 0a 20 20 20 20 7d 20 65   cx evl2.    } e
2e00: 6c 73 65 69 66 20 7b 24 63 6e 74 3e 3d 30 2e 32  lseif {$cnt>=0.2
2e10: 35 2a 24 74 6f 74 61 6c 63 6e 74 7d 20 7b 0a 20  5*$totalcnt} {. 
2e20: 20 20 20 20 20 73 65 74 20 63 78 20 65 76 6c 31       set cx evl1
2e30: 0a 20 20 20 20 7d 20 65 6c 73 65 69 66 20 7b 24  .    } elseif {$
2e40: 63 6e 74 3e 30 7d 20 7b 0a 20 20 20 20 20 20 73  cnt>0} {.      s
2e50: 65 74 20 63 78 20 65 76 6c 30 0a 20 20 20 20 7d  et cx evl0.    }
2e60: 20 65 6c 73 65 20 7b 0a 20 20 20 20 20 20 73 65   else {.      se
2e70: 74 20 63 78 20 65 76 6e 69 6c 0a 20 20 20 20 7d  t cx evnil.    }
2e80: 0a 20 20 20 20 73 65 74 20 61 6d 74 20 5b 66 6f  .    set amt [fo
2e90: 72 6d 61 74 20 7b 25 33 64 2f 25 2d 33 64 7d 20  rmat {%3d/%-3d} 
2ea0: 24 63 6e 74 20 24 74 6f 74 61 6c 63 6e 74 5d 0a  $cnt $totalcnt].
2eb0: 20 20 20 20 73 65 74 20 61 6d 74 20 5b 73 74 72      set amt [str
2ec0: 69 6e 67 20 6d 61 70 20 7b 7b 20 7d 20 7b 26 6e  ing map {{ } {&n
2ed0: 62 73 70 3b 7d 7d 20 24 61 6d 74 5d 0a 20 20 20  bsp;}} $amt].   
2ee0: 20 70 75 74 73 20 24 6f 75 74 20 22 3c 74 64 3e   puts $out "<td>
2ef0: 3c 63 69 74 65 20 63 6c 61 73 73 3d 24 63 78 3e  <cite class=$cx>
2f00: 24 61 6d 74 3c 2f 63 69 74 65 3e 3c 2f 74 64 3e  $amt</cite></td>
2f10: 22 0a 20 20 7d 0a 20 20 72 65 67 73 75 62 20 2d  ".  }.  regsub -
2f20: 61 6c 6c 20 7b 5b 5e 61 2d 7a 41 2d 5a 30 2d 39  all {[^a-zA-Z0-9
2f30: 5d 7d 20 5b 66 69 6c 65 20 74 61 69 6c 20 5b 66  ]} [file tail [f
2f40: 69 6c 65 20 72 6f 6f 74 20 24 73 72 63 66 69 6c  ile root $srcfil
2f50: 65 5d 5d 20 5f 20 64 6f 63 69 64 0a 20 20 70 75  e]] _ docid.  pu
2f60: 74 73 20 24 6f 75 74 20 22 3c 74 64 3e 3c 61 20  ts $out "<td><a 
2f70: 68 72 65 66 3d 5c 22 6d 61 74 72 69 78 5f 73 24  href=\"matrix_s$
2f80: 64 6f 63 69 64 2e 68 74 6d 6c 5c 22 3e 73 75 6d  docid.html\">sum
2f90: 6d 61 72 79 3c 2f 61 3e 3c 2f 74 64 3e 22 0a 20  mary</a></td>". 
2fa0: 20 70 75 74 73 20 24 6f 75 74 20 22 3c 74 64 3e   puts $out "<td>
2fb0: 3c 61 20 68 72 65 66 3d 5c 22 6d 61 74 72 69 78  <a href=\"matrix
2fc0: 5f 64 24 64 6f 63 69 64 2e 68 74 6d 6c 5c 22 3e  _d$docid.html\">
2fd0: 64 65 74 61 69 6c 73 3c 2f 61 3e 3c 2f 74 64 3e  details</a></td>
2fe0: 3c 2f 74 72 3e 5c 6e 22 0a 7d 0a 69 66 20 7b 24  </tr>\n".}.if {$
2ff0: 72 6f 77 63 6e 74 25 32 30 21 3d 31 7d 20 7b 70  rowcnt%20!=1} {p
3000: 75 74 73 20 24 6f 75 74 20 24 63 6f 6c 75 6d 6e  uts $out $column
3010: 5f 74 69 74 6c 65 73 7d 0a 70 75 74 73 20 24 6f  _titles}.puts $o
3020: 75 74 20 22 3c 74 72 3e 3c 74 64 3e 4f 76 65 72  ut "<tr><td>Over
3030: 61 6c 6c 20 43 6f 76 65 72 61 67 65 22 0a 73 65  all Coverage".se
3040: 74 20 74 6f 74 61 6c 63 6e 74 20 24 74 6f 74 61  t totalcnt $tota
3050: 6c 28 61 6c 6c 29 0a 66 6f 72 65 61 63 68 20 73  l(all).foreach s
3060: 72 63 63 6c 61 73 73 20 7b 74 63 6c 20 73 6c 74  rcclass {tcl slt
3070: 20 74 68 33 20 73 72 63 20 61 6e 79 7d 20 7b 0a   th3 src any} {.
3080: 20 20 73 65 74 20 63 6e 74 20 24 74 6f 74 61 6c    set cnt $total
3090: 28 24 73 72 63 63 6c 61 73 73 29 0a 20 20 69 66  ($srcclass).  if
30a0: 20 7b 24 63 6e 74 3d 3d 24 74 6f 74 61 6c 63 6e   {$cnt==$totalcn
30b0: 74 7d 20 7b 0a 20 20 20 20 73 65 74 20 63 78 20  t} {.    set cx 
30c0: 65 76 6f 6b 0a 20 20 7d 20 65 6c 73 65 69 66 20  evok.  } elseif 
30d0: 7b 24 63 6e 74 3e 3d 30 2e 37 35 2a 24 74 6f 74  {$cnt>=0.75*$tot
30e0: 61 6c 63 6e 74 7d 20 7b 0a 20 20 20 20 73 65 74  alcnt} {.    set
30f0: 20 63 78 20 65 76 6c 33 0a 20 20 7d 20 65 6c 73   cx evl3.  } els
3100: 65 69 66 20 7b 24 63 6e 74 3e 3d 30 2e 35 2a 24  eif {$cnt>=0.5*$
3110: 74 6f 74 61 6c 63 6e 74 7d 20 7b 0a 20 20 20 20  totalcnt} {.    
3120: 73 65 74 20 63 78 20 65 76 6c 32 0a 20 20 7d 20  set cx evl2.  } 
3130: 65 6c 73 65 69 66 20 7b 24 63 6e 74 3e 3d 30 2e  elseif {$cnt>=0.
3140: 32 35 2a 24 74 6f 74 61 6c 63 6e 74 7d 20 7b 0a  25*$totalcnt} {.
3150: 20 20 20 20 73 65 74 20 63 78 20 65 76 6c 31 0a      set cx evl1.
3160: 20 20 7d 20 65 6c 73 65 69 66 20 7b 24 63 6e 74    } elseif {$cnt
3170: 3e 30 7d 20 7b 0a 20 20 20 20 73 65 74 20 63 78  >0} {.    set cx
3180: 20 65 76 6c 30 0a 20 20 7d 20 65 6c 73 65 20 7b   evl0.  } else {
3190: 0a 20 20 20 20 73 65 74 20 63 78 20 65 76 6e 69  .    set cx evni
31a0: 6c 0a 20 20 7d 0a 20 20 73 65 74 20 61 6d 74 20  l.  }.  set amt 
31b0: 5b 66 6f 72 6d 61 74 20 7b 25 35 2e 31 66 25 25  [format {%5.1f%%
31c0: 20 7d 20 5b 65 78 70 72 20 7b 28 24 63 6e 74 2a   } [expr {($cnt*
31d0: 31 30 30 2e 30 29 2f 24 74 6f 74 61 6c 63 6e 74  100.0)/$totalcnt
31e0: 7d 5d 5d 0a 20 20 73 65 74 20 61 6d 74 20 5b 73  }]].  set amt [s
31f0: 74 72 69 6e 67 20 6d 61 70 20 7b 7b 20 7d 20 7b  tring map {{ } {
3200: 26 6e 62 73 70 3b 7d 7d 20 24 61 6d 74 5d 0a 20  &nbsp;}} $amt]. 
3210: 20 70 75 74 73 20 24 6f 75 74 20 22 3c 74 64 3e   puts $out "<td>
3220: 3c 63 69 74 65 20 63 6c 61 73 73 3d 24 63 78 3e  <cite class=$cx>
3230: 24 61 6d 74 3c 2f 63 69 74 65 3e 3c 2f 74 64 3e  $amt</cite></td>
3240: 22 0a 7d 0a 70 75 74 73 20 24 6f 75 74 20 3c 2f  ".}.puts $out </
3250: 74 61 62 6c 65 3e 0a 63 6c 6f 73 65 20 24 6f 75  table>.close $ou
3260: 74 0a 0a 23 20 53 70 6c 69 74 20 61 20 6c 6f 6e  t..# Split a lon
3270: 67 20 73 74 72 69 6e 67 20 6f 66 20 74 65 78 74  g string of text
3280: 20 61 74 20 73 70 61 63 65 73 20 73 6f 20 74 68   at spaces so th
3290: 61 74 20 6e 6f 20 6c 69 6e 65 20 65 78 63 65 65  at no line excee
32a0: 64 73 20 37 30 0a 23 20 63 68 61 72 61 63 74 65  ds 70.# characte
32b0: 72 73 2e 20 20 53 65 6e 64 20 74 68 65 20 72 65  rs.  Send the re
32c0: 73 75 6c 74 20 74 6f 20 24 6f 75 74 2e 0a 23 0a  sult to $out..#.
32d0: 70 72 6f 63 20 77 72 61 70 5f 69 6e 5f 63 6f 6d  proc wrap_in_com
32e0: 6d 65 6e 74 20 7b 6f 75 74 20 70 72 65 66 69 78  ment {out prefix
32f0: 20 74 78 74 7d 20 7b 0a 20 20 77 68 69 6c 65 20   txt} {.  while 
3300: 7b 5b 73 74 72 69 6e 67 20 6c 65 6e 67 74 68 20  {[string length 
3310: 24 74 78 74 5d 3e 37 30 7d 20 7b 0a 20 20 20 20  $txt]>70} {.    
3320: 73 65 74 20 62 72 65 61 6b 20 5b 73 74 72 69 6e  set break [strin
3330: 67 20 6c 61 73 74 20 7b 20 7d 20 24 74 78 74 20  g last { } $txt 
3340: 37 30 5d 0a 20 20 20 20 69 66 20 7b 24 62 72 65  70].    if {$bre
3350: 61 6b 20 3d 3d 20 30 7d 20 7b 0a 20 20 20 20 20  ak == 0} {.     
3360: 20 73 65 74 20 62 72 65 61 6b 20 5b 73 74 72 69   set break [stri
3370: 6e 67 20 66 69 72 73 74 20 7b 20 7d 20 24 74 78  ng first { } $tx
3380: 74 5d 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 20  t].    }.    if 
3390: 7b 24 62 72 65 61 6b 3e 30 7d 20 7b 0a 20 20 20  {$break>0} {.   
33a0: 20 20 20 70 75 74 73 20 24 6f 75 74 20 22 24 70     puts $out "$p
33b0: 72 65 66 69 78 20 5b 73 74 72 69 6e 67 20 72 61  refix [string ra
33c0: 6e 67 65 20 24 74 78 74 20 30 20 5b 65 78 70 72  nge $txt 0 [expr
33d0: 20 7b 24 62 72 65 61 6b 2d 31 7d 5d 5d 22 0a 20   {$break-1}]]". 
33e0: 20 20 20 20 20 73 65 74 20 74 78 74 20 5b 73 74       set txt [st
33f0: 72 69 6e 67 20 74 72 69 6d 20 5b 73 74 72 69 6e  ring trim [strin
3400: 67 20 72 61 6e 67 65 20 24 74 78 74 20 24 62 72  g range $txt $br
3410: 65 61 6b 20 65 6e 64 5d 5d 0a 20 20 20 20 7d 20  eak end]].    } 
3420: 65 6c 73 65 20 7b 0a 20 20 20 20 20 20 70 75 74  else {.      put
3430: 73 20 24 6f 75 74 20 22 24 70 72 65 66 69 78 20  s $out "$prefix 
3440: 24 74 78 74 22 0a 20 20 20 20 20 20 72 65 74 75  $txt".      retu
3450: 72 6e 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 70  rn.    }.  }.  p
3460: 75 74 73 20 24 6f 75 74 20 22 24 70 72 65 66 69  uts $out "$prefi
3470: 78 20 24 74 78 74 22 0a 7d 0a 0a 0a 0a 23 20 44  x $txt".}....# D
3480: 65 74 61 69 6c 20 6d 61 74 72 69 78 65 73 20 66  etail matrixes f
3490: 6f 72 20 65 61 63 68 20 64 6f 63 75 6d 65 6e 74  or each document
34a0: 2e 0a 23 0a 66 6f 72 65 61 63 68 20 73 72 63 66  ..#.foreach srcf
34b0: 69 6c 65 20 24 73 72 63 6c 69 73 74 20 7b 0a 20  ile $srclist {. 
34c0: 20 72 65 67 73 75 62 20 2d 61 6c 6c 20 7b 5b 5e   regsub -all {[^
34d0: 61 2d 7a 41 2d 5a 30 2d 39 5d 7d 20 5b 66 69 6c  a-zA-Z0-9]} [fil
34e0: 65 20 74 61 69 6c 20 5b 66 69 6c 65 20 72 6f 6f  e tail [file roo
34f0: 74 20 24 73 72 63 66 69 6c 65 5d 5d 20 5f 20 64  t $srcfile]] _ d
3500: 6f 63 69 64 0a 20 20 73 65 74 20 66 6e 20 6d 61  ocid.  set fn ma
3510: 74 72 69 78 5f 64 24 64 6f 63 69 64 2e 68 74 6d  trix_d$docid.htm
3520: 6c 0a 20 20 73 65 74 20 6d 61 74 72 69 78 6e 61  l.  set matrixna
3530: 6d 65 28 24 73 72 63 66 69 6c 65 29 20 24 66 6e  me($srcfile) $fn
3540: 0a 20 20 73 65 74 20 6f 75 74 20 5b 6f 70 65 6e  .  set out [open
3550: 20 64 6f 63 2f 6d 61 74 72 69 78 2f 24 66 6e 20   doc/matrix/$fn 
3560: 77 5d 0a 20 20 72 65 67 73 75 62 20 7b 5e 64 6f  w].  regsub {^do
3570: 63 2f 7d 20 24 73 72 63 66 69 6c 65 20 7b 7d 20  c/} $srcfile {} 
3580: 62 61 73 65 6e 61 6d 65 0a 20 20 77 72 69 74 65  basename.  write
3590: 5f 68 65 61 64 65 72 20 2e 2e 2f 20 24 6f 75 74  _header ../ $out
35a0: 20 22 53 51 4c 69 74 65 20 52 65 71 75 69 72 65   "SQLite Require
35b0: 6d 65 6e 74 20 4d 61 74 72 69 78 3a 20 5b 66 69  ment Matrix: [fi
35c0: 6c 65 20 74 61 69 6c 20 24 73 72 63 66 69 6c 65  le tail $srcfile
35d0: 5d 22 0a 20 20 70 75 74 73 20 24 6f 75 74 20 22  ]".  puts $out "
35e0: 3c 68 31 20 61 6c 69 67 6e 3d 63 65 6e 74 65 72  <h1 align=center
35f0: 3e 53 51 4c 69 74 65 20 52 65 71 75 69 72 65 6d  >SQLite Requirem
3600: 65 6e 74 20 4d 61 74 72 69 78 20 44 65 74 61 69  ent Matrix Detai
3610: 6c 73 3c 62 72 3e 22 0a 20 20 70 75 74 73 20 24  ls<br>".  puts $
3620: 6f 75 74 20 22 5b 66 69 6c 65 20 74 61 69 6c 20  out "[file tail 
3630: 24 73 72 63 66 69 6c 65 5d 3c 2f 68 31 3e 22 0a  $srcfile]</h1>".
3640: 20 20 70 75 74 73 20 24 6f 75 74 20 22 3c 68 32    puts $out "<h2
3650: 3e 3c 61 20 68 72 65 66 3d 5c 22 6d 61 74 72 69  ><a href=\"matri
3660: 78 2e 68 74 6d 6c 5c 22 3e 49 6e 64 65 78 3c 2f  x.html\">Index</
3670: 61 3e 22 0a 20 20 70 75 74 73 20 24 6f 75 74 20  a>".  puts $out 
3680: 22 3c 61 20 68 72 65 66 3d 5c 22 6d 61 74 72 69  "<a href=\"matri
3690: 78 5f 73 24 64 6f 63 69 64 2e 68 74 6d 6c 5c 22  x_s$docid.html\"
36a0: 3e 53 75 6d 6d 61 72 79 3c 2f 61 3e 22 0a 20 20  >Summary</a>".  
36b0: 70 75 74 73 20 24 6f 75 74 20 22 3c 61 20 68 72  puts $out "<a hr
36c0: 65 66 3d 5c 22 24 62 61 73 65 6e 61 6d 65 5c 22  ef=\"$basename\"
36d0: 3e 4d 61 72 6b 75 70 3c 2f 61 3e 22 0a 20 20 70  >Markup</a>".  p
36e0: 75 74 73 20 24 6f 75 74 20 22 3c 61 20 68 72 65  uts $out "<a hre
36f0: 66 3d 5c 22 2e 2e 2f 24 62 61 73 65 6e 61 6d 65  f=\"../$basename
3700: 5c 22 3e 4f 72 69 67 69 6e 61 6c 3c 2f 61 3e 3c  \">Original</a><
3710: 2f 68 32 3e 22 0a 0a 20 20 64 62 20 65 76 61 6c  /h2>"..  db eval
3720: 20 7b 0a 20 20 20 20 53 45 4c 45 43 54 20 72 65   {.    SELECT re
3730: 71 75 69 72 65 6d 65 6e 74 2e 72 65 71 6e 6f 2c  quirement.reqno,
3740: 20 72 65 71 69 6d 61 67 65 2c 20 6f 72 69 67 74   reqimage, origt
3750: 65 78 74 2c 20 72 65 71 74 65 78 74 2c 0a 20 20  ext, reqtext,.  
3760: 20 20 20 20 20 20 20 20 20 43 41 53 45 20 57 48           CASE WH
3770: 45 4e 20 72 65 71 75 69 72 65 6d 65 6e 74 2e 73  EN requirement.s
3780: 72 63 66 69 6c 65 21 3d 24 73 72 63 66 69 6c 65  rcfile!=$srcfile
3790: 20 54 48 45 4e 20 72 65 71 75 69 72 65 6d 65 6e   THEN requiremen
37a0: 74 2e 73 72 63 66 69 6c 65 20 45 4e 44 20 41 53  t.srcfile END AS
37b0: 20 63 61 6e 6f 6e 69 63 61 6c 0a 20 20 20 20 20   canonical.     
37c0: 20 46 52 4f 4d 20 72 65 71 75 69 72 65 6d 65 6e   FROM requiremen
37d0: 74 2c 20 72 65 71 73 72 63 0a 20 20 20 20 20 57  t, reqsrc.     W
37e0: 48 45 52 45 20 72 65 71 73 72 63 2e 73 72 63 66  HERE reqsrc.srcf
37f0: 69 6c 65 3d 24 73 72 63 66 69 6c 65 0a 20 20 20  ile=$srcfile.   
3800: 20 20 20 20 41 4e 44 20 72 65 71 73 72 63 2e 72      AND reqsrc.r
3810: 65 71 6e 6f 3d 72 65 71 75 69 72 65 6d 65 6e 74  eqno=requirement
3820: 2e 72 65 71 6e 6f 0a 20 20 20 20 20 4f 52 44 45  .reqno.     ORDE
3830: 52 20 42 59 20 72 65 71 73 72 63 2e 73 72 63 73  R BY reqsrc.srcs
3840: 65 71 0a 20 20 7d 20 7b 0a 20 20 20 20 70 75 74  eq.  } {.    put
3850: 73 20 24 6f 75 74 20 22 3c 68 72 3e 3c 61 20 6e  s $out "<hr><a n
3860: 61 6d 65 3d 5c 22 24 72 65 71 6e 6f 5c 22 3e 3c  ame=\"$reqno\"><
3870: 2f 61 3e 22 0a 20 20 20 20 70 75 74 73 20 24 6f  /a>".    puts $o
3880: 75 74 20 22 3c 70 3e 3c 61 20 68 72 65 66 3d 5c  ut "<p><a href=\
3890: 22 24 62 61 73 65 6e 61 6d 65 23 24 72 65 71 6e  "$basename#$reqn
38a0: 6f 5c 22 3e 24 72 65 71 6e 6f 3c 2f 61 3e 22 0a  o\">$reqno</a>".
38b0: 0a 20 20 20 20 73 65 74 20 65 76 28 74 63 6c 29  .    set ev(tcl)
38c0: 20 30 0a 20 20 20 20 73 65 74 20 65 76 28 73 6c   0.    set ev(sl
38d0: 74 29 20 30 0a 20 20 20 20 73 65 74 20 65 76 28  t) 0.    set ev(
38e0: 74 68 33 29 20 30 0a 20 20 20 20 73 65 74 20 65  th3) 0.    set e
38f0: 76 28 73 72 63 29 20 30 0a 20 20 20 20 64 62 20  v(src) 0.    db 
3900: 65 76 61 6c 20 7b 0a 20 20 20 20 20 20 53 45 4c  eval {.      SEL
3910: 45 43 54 20 63 6f 75 6e 74 28 2a 29 20 41 53 20  ECT count(*) AS 
3920: 63 6e 74 2c 20 73 72 63 63 6c 61 73 73 20 0a 20  cnt, srcclass . 
3930: 20 20 20 20 20 20 20 46 52 4f 4d 20 65 76 69 64         FROM evid
3940: 65 6e 63 65 0a 20 20 20 20 20 20 20 57 48 45 52  ence.       WHER
3950: 45 20 72 65 71 6e 6f 3d 24 72 65 71 6e 6f 0a 20  E reqno=$reqno. 
3960: 20 20 20 20 20 20 47 52 4f 55 50 20 42 59 20 73        GROUP BY s
3970: 72 63 63 6c 61 73 73 0a 20 20 20 20 7d 20 7b 0a  rcclass.    } {.
3980: 20 20 20 20 20 20 73 65 74 20 65 76 28 24 73 72        set ev($sr
3990: 63 63 6c 61 73 73 29 20 24 63 6e 74 0a 20 20 20  cclass) $cnt.   
39a0: 20 7d 0a 20 20 20 20 73 65 74 20 70 72 6f 6f 66   }.    set proof
39b0: 28 24 72 65 71 6e 6f 29 20 30 0a 20 20 20 20 66  ($reqno) 0.    f
39c0: 6f 72 65 61 63 68 20 73 72 63 63 6c 61 73 73 20  oreach srcclass 
39d0: 7b 74 63 6c 20 73 6c 74 20 74 68 33 20 73 72 63  {tcl slt th3 src
39e0: 7d 20 7b 0a 20 20 20 20 20 20 73 65 74 20 63 6e  } {.      set cn
39f0: 74 20 24 65 76 28 24 73 72 63 63 6c 61 73 73 29  t $ev($srcclass)
3a00: 0a 20 20 20 20 20 20 69 66 20 7b 24 63 6e 74 7d  .      if {$cnt}
3a10: 20 7b 0a 20 20 20 20 20 20 20 20 73 65 74 20 63   {.        set c
3a20: 78 20 65 76 6f 6b 0a 20 20 20 20 20 20 20 20 69  x evok.        i
3a30: 6e 63 72 20 70 72 6f 6f 66 28 24 72 65 71 6e 6f  ncr proof($reqno
3a40: 29 0a 20 20 20 20 20 20 7d 20 65 6c 73 65 20 7b  ).      } else {
3a50: 0a 20 20 20 20 20 20 20 20 73 65 74 20 63 78 20  .        set cx 
3a60: 65 76 6e 69 6c 0a 20 20 20 20 20 20 7d 0a 20 20  evnil.      }.  
3a70: 20 20 20 20 70 75 74 73 20 24 6f 75 74 20 22 3c      puts $out "<
3a80: 63 69 74 65 20 63 6c 61 73 73 3d 24 63 78 3e 24  cite class=$cx>$
3a90: 73 72 63 63 6c 61 73 73 3c 2f 63 69 74 65 3e 22  srcclass</cite>"
3aa0: 0a 20 20 20 20 7d 0a 20 20 20 20 70 75 74 73 20  .    }.    puts 
3ab0: 24 6f 75 74 20 22 3c 2f 70 3e 22 0a 20 20 20 20  $out "</p>".    
3ac0: 69 66 20 7b 24 63 61 6e 6f 6e 69 63 61 6c 21 3d  if {$canonical!=
3ad0: 22 22 7d 20 7b 0a 20 20 20 20 20 20 70 75 74 73  ""} {.      puts
3ae0: 20 24 6f 75 74 20 22 3c 70 3e 43 61 6e 6f 6e 69   $out "<p>Canoni
3af0: 63 61 6c 20 75 73 61 67 65 3a 20 3c 61 20 68 72  cal usage: <a hr
3b00: 65 66 3d 27 24 63 61 6e 6f 6e 69 63 61 6c 27 3e  ef='$canonical'>
3b10: 24 63 61 6e 6f 6e 69 63 61 6c 3c 2f 61 3e 3c 2f  $canonical</a></
3b20: 70 3e 22 0a 20 20 20 20 7d 0a 20 20 20 20 73 65  p>".    }.    se
3b30: 74 20 6f 72 69 67 20 5b 73 74 72 69 6e 67 20 6d  t orig [string m
3b40: 61 70 20 2d 6e 6f 63 61 73 65 20 7b 3c 64 74 3e  ap -nocase {<dt>
3b50: 20 7b 7d 20 3c 2f 64 74 3e 20 7b 7d 20 3c 64 64   {} </dt> {} <dd
3b60: 3e 20 7b 7d 20 3c 2f 64 64 3e 20 7b 7d 7d 20 24  > {} </dd> {}} $
3b70: 6f 72 69 67 74 65 78 74 5d 0a 20 20 20 20 70 75  origtext].    pu
3b80: 74 73 20 24 6f 75 74 20 22 3c 70 3e 24 6f 72 69  ts $out "<p>$ori
3b90: 67 3c 2f 70 3e 22 0a 20 20 20 20 73 65 74 20 73  g</p>".    set s
3ba0: 65 70 20 3c 70 3e 0a 0a 20 20 20 20 64 62 20 65  ep <p>..    db e
3bb0: 76 61 6c 20 7b 0a 20 20 20 20 20 20 53 45 4c 45  val {.      SELE
3bc0: 43 54 20 73 72 63 63 61 74 20 7c 7c 20 27 2f 27  CT srccat || '/'
3bd0: 20 7c 7c 20 73 72 63 66 69 6c 65 20 7c 7c 20 27   || srcfile || '
3be0: 3a 27 20 7c 7c 20 73 72 63 6c 69 6e 65 20 41 53  :' || srcline AS
3bf0: 20 78 2c 20 75 72 6c 0a 20 20 20 20 20 20 20 20   x, url.        
3c00: 46 52 4f 4d 20 65 76 69 64 65 6e 63 65 0a 20 20  FROM evidence.  
3c10: 20 20 20 20 20 57 48 45 52 45 20 72 65 71 6e 6f       WHERE reqno
3c20: 3d 24 72 65 71 6e 6f 0a 20 20 20 20 20 20 20 4f  =$reqno.       O
3c30: 52 44 45 52 20 42 59 20 78 3b 0a 20 20 20 20 7d  RDER BY x;.    }
3c40: 20 7b 0a 20 20 20 20 20 20 69 66 20 7b 24 75 72   {.      if {$ur
3c50: 6c 21 3d 22 22 7d 20 7b 0a 20 20 20 20 20 20 20  l!=""} {.       
3c60: 20 70 75 74 73 20 24 6f 75 74 20 22 24 73 65 70   puts $out "$sep
3c70: 3c 61 20 68 72 65 66 3d 5c 22 24 75 72 6c 5c 22  <a href=\"$url\"
3c80: 3e 24 78 3c 2f 61 3e 22 0a 20 20 20 20 20 20 7d  >$x</a>".      }
3c90: 20 65 6c 73 65 20 7b 0a 20 20 20 20 20 20 20 20   else {.        
3ca0: 70 75 74 73 20 24 6f 75 74 20 22 24 73 65 70 24  puts $out "$sep$
3cb0: 78 22 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  x".      }.     
3cc0: 20 73 65 74 20 73 65 70 20 22 26 6e 62 73 70 3b   set sep "&nbsp;
3cd0: 26 6e 62 73 70 3b 22 0a 20 20 20 20 7d 0a 0a 20  &nbsp;".    }.. 
3ce0: 20 20 20 23 20 47 65 6e 65 72 61 74 65 20 74 65     # Generate te
3cf0: 78 74 20 73 75 69 74 61 62 6c 65 20 66 6f 72 20  xt suitable for 
3d00: 63 6f 70 79 2d 70 61 73 74 65 20 69 6e 74 6f 20  copy-paste into 
3d10: 73 6f 75 72 63 65 20 64 6f 63 75 6d 65 6e 74 73  source documents
3d20: 20 61 73 0a 20 20 20 20 23 20 65 76 69 64 65 6e   as.    # eviden
3d30: 63 65 20 74 68 61 74 20 74 68 65 20 72 65 71 75  ce that the requ
3d40: 69 72 65 6d 65 6e 74 20 69 73 20 73 61 74 69 73  irement is satis
3d50: 66 69 65 64 2e 0a 20 20 20 20 23 0a 20 20 20 20  fied..    #.    
3d60: 73 65 74 20 61 62 62 72 65 76 20 5b 73 74 72 69  set abbrev [stri
3d70: 6e 67 20 72 61 6e 67 65 20 24 72 65 71 6e 6f 20  ng range $reqno 
3d80: 30 20 31 32 5d 0a 20 20 20 20 70 75 74 73 20 24  0 12].    puts $
3d90: 6f 75 74 20 22 3c 70 72 65 3e 2f 2a 20 49 4d 50  out "<pre>/* IMP
3da0: 3a 20 24 61 62 62 72 65 76 20 2a 2f 3c 2f 70 72  : $abbrev */</pr
3db0: 65 3e 22 0a 20 20 20 20 69 66 20 7b 5b 72 65 67  e>".    if {[reg
3dc0: 65 78 70 20 7b 5e 73 79 6e 74 61 78 20 64 69 61  exp {^syntax dia
3dd0: 67 72 61 6d 20 7d 20 24 72 65 71 74 65 78 74 5d  gram } $reqtext]
3de0: 7d 20 7b 0a 20 20 20 20 20 20 70 75 74 73 20 24  } {.      puts $
3df0: 6f 75 74 20 22 3c 70 72 65 3e 23 20 45 56 49 44  out "<pre># EVID
3e00: 45 4e 43 45 2d 4f 46 3a 20 24 61 62 62 72 65 76  ENCE-OF: $abbrev
3e10: 20 2d 2d 20 24 72 65 71 74 65 78 74 3c 2f 70 72   -- $reqtext</pr
3e20: 65 3e 22 0a 20 20 20 20 7d 20 65 6c 73 65 20 7b  e>".    } else {
3e30: 0a 20 20 20 20 20 20 70 75 74 73 20 24 6f 75 74  .      puts $out
3e40: 20 22 3c 70 72 65 3e 22 0a 20 20 20 20 20 20 77   "<pre>".      w
3e50: 72 61 70 5f 69 6e 5f 63 6f 6d 6d 65 6e 74 20 24  rap_in_comment $
3e60: 6f 75 74 20 23 20 5c 0a 20 20 20 20 20 20 20 20  out # \.        
3e70: 20 22 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20 24   "EVIDENCE-OF: $
3e80: 61 62 62 72 65 76 20 5b 73 74 72 69 6e 67 20 6d  abbrev [string m
3e90: 61 70 20 7b 26 20 26 61 6d 70 3b 20 3c 20 26 6c  ap {& &amp; < &l
3ea0: 74 3b 20 3e 20 26 67 74 3b 7d 20 24 72 65 71 74  t; > &gt;} $reqt
3eb0: 65 78 74 5d 22 0a 20 20 20 20 20 20 70 75 74 73  ext]".      puts
3ec0: 20 24 6f 75 74 20 22 3c 2f 70 72 65 3e 22 0a 20   $out "</pre>". 
3ed0: 20 20 20 7d 0a 0a 20 20 7d 0a 20 20 63 6c 6f 73     }..  }.  clos
3ee0: 65 20 24 6f 75 74 0a 7d 0a 0a 23 20 53 75 6d 6d  e $out.}..# Summ
3ef0: 61 72 79 20 6d 61 74 72 69 78 65 73 20 66 6f 72  ary matrixes for
3f00: 20 65 61 63 68 20 64 6f 63 75 6d 65 6e 74 2e 0a   each document..
3f10: 23 0a 66 6f 72 65 61 63 68 20 73 72 63 66 69 6c  #.foreach srcfil
3f20: 65 20 24 73 72 63 6c 69 73 74 20 7b 0a 20 20 73  e $srclist {.  s
3f30: 65 74 20 68 61 73 5f 72 65 71 28 24 73 72 63 66  et has_req($srcf
3f40: 69 6c 65 29 20 31 0a 20 20 72 65 67 73 75 62 20  ile) 1.  regsub 
3f50: 2d 61 6c 6c 20 7b 5b 5e 61 2d 7a 41 2d 5a 30 2d  -all {[^a-zA-Z0-
3f60: 39 5d 7d 20 5b 66 69 6c 65 20 74 61 69 6c 20 5b  9]} [file tail [
3f70: 66 69 6c 65 20 72 6f 6f 74 20 24 73 72 63 66 69  file root $srcfi
3f80: 6c 65 5d 5d 20 5f 20 64 6f 63 69 64 0a 20 20 73  le]] _ docid.  s
3f90: 65 74 20 66 6e 20 6d 61 74 72 69 78 5f 73 24 64  et fn matrix_s$d
3fa0: 6f 63 69 64 2e 68 74 6d 6c 0a 20 20 73 65 74 20  ocid.html.  set 
3fb0: 6f 75 74 20 5b 6f 70 65 6e 20 64 6f 63 2f 6d 61  out [open doc/ma
3fc0: 74 72 69 78 2f 24 66 6e 20 77 5d 0a 20 20 72 65  trix/$fn w].  re
3fd0: 67 73 75 62 20 7b 5e 64 6f 63 2f 7d 20 24 73 72  gsub {^doc/} $sr
3fe0: 63 66 69 6c 65 20 7b 7d 20 62 61 73 65 6e 61 6d  cfile {} basenam
3ff0: 65 0a 20 20 77 72 69 74 65 5f 68 65 61 64 65 72  e.  write_header
4000: 20 2e 2e 2f 20 24 6f 75 74 20 22 53 51 4c 69 74   ../ $out "SQLit
4010: 65 20 52 65 71 75 69 72 65 6d 65 6e 74 20 4d 61  e Requirement Ma
4020: 74 72 69 78 3a 20 5b 66 69 6c 65 20 74 61 69 6c  trix: [file tail
4030: 20 24 73 72 63 66 69 6c 65 5d 22 0a 20 20 70 75   $srcfile]".  pu
4040: 74 73 20 24 6f 75 74 20 22 3c 68 31 20 61 6c 69  ts $out "<h1 ali
4050: 67 6e 3d 63 65 6e 74 65 72 3e 53 51 4c 69 74 65  gn=center>SQLite
4060: 20 52 65 71 75 69 72 65 6d 65 6e 74 20 4d 61 74   Requirement Mat
4070: 72 69 78 20 53 75 6d 6d 61 72 79 3c 62 72 3e 22  rix Summary<br>"
4080: 0a 20 20 70 75 74 73 20 24 6f 75 74 20 22 5b 66  .  puts $out "[f
4090: 69 6c 65 20 74 61 69 6c 20 24 73 72 63 66 69 6c  ile tail $srcfil
40a0: 65 5d 3c 2f 68 31 3e 22 0a 20 20 70 75 74 73 20  e]</h1>".  puts 
40b0: 24 6f 75 74 20 22 3c 68 32 20 61 6c 69 67 6e 3d  $out "<h2 align=
40c0: 63 65 6e 74 65 72 3e 3c 61 20 68 72 65 66 3d 5c  center><a href=\
40d0: 22 6d 61 74 72 69 78 2e 68 74 6d 6c 5c 22 3e 49  "matrix.html\">I
40e0: 6e 64 65 78 3c 2f 61 3e 22 0a 20 20 70 75 74 73  ndex</a>".  puts
40f0: 20 24 6f 75 74 20 22 3c 61 20 68 72 65 66 3d 5c   $out "<a href=\
4100: 22 6d 61 74 72 69 78 5f 64 24 64 6f 63 69 64 2e  "matrix_d$docid.
4110: 68 74 6d 6c 5c 22 3e 44 65 74 61 69 6c 73 3c 2f  html\">Details</
4120: 61 3e 3c 2f 68 32 3e 22 0a 20 20 70 75 74 73 20  a></h2>".  puts 
4130: 24 6f 75 74 20 7b 3c 74 61 62 6c 65 20 61 6c 69  $out {<table ali
4140: 67 6e 3d 63 65 6e 74 65 72 3e 7d 0a 0a 20 20 64  gn=center>}..  d
4150: 62 20 65 76 61 6c 20 7b 0a 20 20 20 20 53 45 4c  b eval {.    SEL
4160: 45 43 54 20 72 65 71 6e 6f 2c 20 72 65 71 69 6d  ECT reqno, reqim
4170: 61 67 65 2c 20 6f 72 69 67 74 65 78 74 0a 20 20  age, origtext.  
4180: 20 20 20 20 46 52 4f 4d 20 72 65 71 75 69 72 65      FROM require
4190: 6d 65 6e 74 0a 20 20 20 20 20 57 48 45 52 45 20  ment.     WHERE 
41a0: 73 72 63 66 69 6c 65 3d 24 73 72 63 66 69 6c 65  srcfile=$srcfile
41b0: 0a 20 20 20 20 20 4f 52 44 45 52 20 42 59 20 73  .     ORDER BY s
41c0: 72 63 73 65 71 0a 20 20 7d 20 7b 0a 20 20 20 20  rcseq.  } {.    
41d0: 70 75 74 73 20 24 6f 75 74 20 22 3c 74 72 3e 3c  puts $out "<tr><
41e0: 74 64 3e 3c 61 20 63 6c 61 73 73 3d 65 76 20 68  td><a class=ev h
41f0: 72 65 66 3d 5c 22 24 62 61 73 65 6e 61 6d 65 23  ref=\"$basename#
4200: 24 72 65 71 6e 6f 5c 22 3e 24 72 65 71 6e 6f 3c  $reqno\">$reqno<
4210: 2f 61 3e 3c 2f 74 64 3e 22 0a 0a 20 20 20 20 73  /a></td>"..    s
4220: 65 74 20 65 76 28 74 63 6c 29 20 30 0a 20 20 20  et ev(tcl) 0.   
4230: 20 73 65 74 20 65 76 28 73 6c 74 29 20 30 0a 20   set ev(slt) 0. 
4240: 20 20 20 73 65 74 20 65 76 28 74 68 33 29 20 30     set ev(th3) 0
4250: 0a 20 20 20 20 73 65 74 20 65 76 28 73 72 63 29  .    set ev(src)
4260: 20 30 0a 20 20 20 20 64 62 20 65 76 61 6c 20 7b   0.    db eval {
4270: 0a 20 20 20 20 20 20 53 45 4c 45 43 54 20 63 6f  .      SELECT co
4280: 75 6e 74 28 2a 29 20 41 53 20 63 6e 74 2c 20 73  unt(*) AS cnt, s
4290: 72 63 63 6c 61 73 73 20 0a 20 20 20 20 20 20 20  rcclass .       
42a0: 20 46 52 4f 4d 20 65 76 69 64 65 6e 63 65 0a 20   FROM evidence. 
42b0: 20 20 20 20 20 20 57 48 45 52 45 20 72 65 71 6e        WHERE reqn
42c0: 6f 3d 24 72 65 71 6e 6f 0a 20 20 20 20 20 20 20  o=$reqno.       
42d0: 47 52 4f 55 50 20 42 59 20 73 72 63 63 6c 61 73  GROUP BY srcclas
42e0: 73 0a 20 20 20 20 7d 20 7b 0a 20 20 20 20 20 20  s.    } {.      
42f0: 73 65 74 20 65 76 28 24 73 72 63 63 6c 61 73 73  set ev($srcclass
4300: 29 20 24 63 6e 74 0a 20 20 20 20 7d 0a 20 20 20  ) $cnt.    }.   
4310: 20 73 65 74 20 70 72 6f 6f 66 28 24 72 65 71 6e   set proof($reqn
4320: 6f 29 20 30 0a 20 20 20 20 66 6f 72 65 61 63 68  o) 0.    foreach
4330: 20 73 72 63 63 6c 61 73 73 20 7b 74 63 6c 20 73   srcclass {tcl s
4340: 6c 74 20 74 68 33 20 73 72 63 7d 20 7b 0a 20 20  lt th3 src} {.  
4350: 20 20 20 20 73 65 74 20 63 6e 74 20 24 65 76 28      set cnt $ev(
4360: 24 73 72 63 63 6c 61 73 73 29 0a 20 20 20 20 20  $srcclass).     
4370: 20 69 66 20 7b 24 63 6e 74 7d 20 7b 0a 20 20 20   if {$cnt} {.   
4380: 20 20 20 20 20 73 65 74 20 63 78 20 65 76 6f 6b       set cx evok
4390: 0a 20 20 20 20 20 20 20 20 69 6e 63 72 20 70 72  .        incr pr
43a0: 6f 6f 66 28 24 72 65 71 6e 6f 29 0a 20 20 20 20  oof($reqno).    
43b0: 20 20 7d 20 65 6c 73 65 20 7b 0a 20 20 20 20 20    } else {.     
43c0: 20 20 20 73 65 74 20 63 78 20 65 76 6e 69 6c 0a     set cx evnil.
43d0: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 70 75        }.      pu
43e0: 74 73 20 24 6f 75 74 20 22 3c 74 64 3e 3c 63 69  ts $out "<td><ci
43f0: 74 65 20 63 6c 61 73 73 3d 24 63 78 3e 24 73 72  te class=$cx>$sr
4400: 63 63 6c 61 73 73 3c 2f 63 69 74 65 3e 3c 2f 74  cclass</cite></t
4410: 64 3e 22 0a 20 20 20 20 7d 0a 20 20 20 20 70 75  d>".    }.    pu
4420: 74 73 20 24 6f 75 74 20 22 3c 2f 74 64 3e 22 0a  ts $out "</td>".
4430: 20 20 7d 0a 20 20 70 75 74 73 20 24 6f 75 74 20    }.  puts $out 
4440: 7b 3c 2f 74 61 62 6c 65 3e 7d 0a 20 20 63 6c 6f  {</table>}.  clo
4450: 73 65 20 24 6f 75 74 0a 7d 0a 0a 23 20 54 72 61  se $out.}..# Tra
4460: 6e 73 6c 61 74 65 20 64 6f 63 75 6d 65 6e 74 61  nslate documenta
4470: 74 69 6f 6e 20 74 6f 20 73 68 6f 77 20 72 65 71  tion to show req
4480: 75 69 72 65 6d 65 6e 74 73 20 77 69 74 68 20 6c  uirements with l
4490: 69 6e 6b 73 20 74 6f 20 74 68 65 20 6d 61 74 72  inks to the matr
44a0: 69 78 2e 0a 23 0a 70 75 74 73 20 2d 6e 6f 6e 65  ix..#.puts -none
44b0: 77 6c 69 6e 65 20 22 54 72 61 6e 73 6c 61 74 69  wline "Translati
44c0: 6e 67 20 64 6f 63 75 6d 65 6e 74 61 74 69 6f 6e  ng documentation
44d0: 22 0a 66 6c 75 73 68 20 73 74 64 6f 75 74 0a 66  ".flush stdout.f
44e0: 6f 72 65 61 63 68 20 66 69 6c 65 20 24 66 69 6c  oreach file $fil
44f0: 65 6c 69 73 74 20 7b 0a 20 20 70 75 74 73 20 2d  elist {.  puts -
4500: 6e 6f 6e 65 77 6c 69 6e 65 20 2e 0a 20 20 23 20  nonewline ..  # 
4510: 70 75 74 73 20 24 66 69 6c 65 0a 20 20 66 6c 75  puts $file.  flu
4520: 73 68 20 73 74 64 6f 75 74 0a 20 20 72 65 67 73  sh stdout.  regs
4530: 75 62 20 7b 5e 64 6f 63 2f 7d 20 24 66 69 6c 65  ub {^doc/} $file
4540: 20 7b 7d 20 62 61 73 65 6e 61 6d 65 0a 20 20 73   {} basename.  s
4550: 65 74 20 6f 75 74 66 69 6c 65 20 64 6f 63 2f 6d  et outfile doc/m
4560: 61 74 72 69 78 2f 24 62 61 73 65 6e 61 6d 65 0a  atrix/$basename.
4570: 20 20 69 66 20 7b 21 5b 69 6e 66 6f 20 65 78 69    if {![info exi
4580: 73 74 73 20 6d 61 74 72 69 78 6e 61 6d 65 28 24  sts matrixname($
4590: 62 61 73 65 6e 61 6d 65 29 5d 7d 20 7b 0a 20 20  basename)]} {.  
45a0: 20 20 66 69 6c 65 20 63 6f 70 79 20 2d 66 6f 72    file copy -for
45b0: 63 65 20 24 66 69 6c 65 20 24 6f 75 74 66 69 6c  ce $file $outfil
45c0: 65 0a 20 20 20 20 63 6f 6e 74 69 6e 75 65 0a 20  e.    continue. 
45d0: 20 7d 0a 20 20 73 65 74 20 69 6e 20 5b 6f 70 65   }.  set in [ope
45e0: 6e 20 24 66 69 6c 65 5d 0a 20 20 73 65 74 20 78  n $file].  set x
45f0: 20 5b 72 65 61 64 20 24 69 6e 20 5b 66 69 6c 65   [read $in [file
4600: 20 73 69 7a 65 20 24 66 69 6c 65 5d 5d 0a 20 20   size $file]].  
4610: 63 6c 6f 73 65 20 24 69 6e 0a 20 20 69 66 20 7b  close $in.  if {
4620: 5b 72 65 67 65 78 70 20 2f 20 24 62 61 73 65 6e  [regexp / $basen
4630: 61 6d 65 5d 7d 20 7b 0a 20 20 20 20 73 65 74 20  ame]} {.    set 
4640: 6d 61 74 72 69 78 70 61 74 68 20 2e 2e 2f 24 6d  matrixpath ../$m
4650: 61 74 72 69 78 6e 61 6d 65 28 24 62 61 73 65 6e  atrixname($basen
4660: 61 6d 65 29 0a 20 20 7d 20 65 6c 73 65 20 7b 0a  ame).  } else {.
4670: 20 20 20 20 73 65 74 20 6d 61 74 72 69 78 70 61      set matrixpa
4680: 74 68 20 24 6d 61 74 72 69 78 6e 61 6d 65 28 24  th $matrixname($
4690: 62 61 73 65 6e 61 6d 65 29 0a 20 20 7d 0a 20 20  basename).  }.  
46a0: 73 65 74 20 6f 75 74 20 7b 7d 0a 20 20 77 68 69  set out {}.  whi
46b0: 6c 65 20 7b 5b 73 74 72 69 6e 67 20 6c 65 6e 67  le {[string leng
46c0: 74 68 20 24 78 5d 3e 30 20 26 26 20 5b 73 65 74  th $x]>0 && [set
46d0: 20 6e 20 5b 73 74 72 69 6e 67 20 66 69 72 73 74   n [string first
46e0: 20 5e 20 24 78 5d 5d 3e 3d 30 7d 20 7b 0a 20 20   ^ $x]]>=0} {.  
46f0: 20 20 69 6e 63 72 20 6e 20 2d 31 0a 20 20 20 20    incr n -1.    
4700: 73 65 74 20 70 72 65 66 69 78 20 5b 73 74 72 69  set prefix [stri
4710: 6e 67 20 72 61 6e 67 65 20 24 78 20 30 20 24 6e  ng range $x 0 $n
4720: 5d 0a 20 20 20 20 61 70 70 65 6e 64 20 6f 75 74  ].    append out
4730: 20 24 70 72 65 66 69 78 0a 20 20 20 20 73 65 74   $prefix.    set
4740: 20 6e 20 5b 73 74 72 69 6e 67 20 6c 65 6e 67 74   n [string lengt
4750: 68 20 24 70 72 65 66 69 78 5d 0a 20 20 20 20 73  h $prefix].    s
4760: 65 74 20 6e 78 20 5b 73 74 72 69 6e 67 20 72 61  et nx [string ra
4770: 6e 67 65 20 24 78 20 5b 65 78 70 72 20 7b 24 6e  nge $x [expr {$n
4780: 2b 31 7d 5d 20 65 6e 64 5d 0a 20 20 20 20 73 65  +1}] end].    se
4790: 74 20 63 20 5b 73 74 72 69 6e 67 20 69 6e 64 65  t c [string inde
47a0: 78 20 24 6e 78 20 30 5d 0a 20 20 20 20 69 66 20  x $nx 0].    if 
47b0: 7b 24 63 3d 3d 22 28 22 7d 20 7b 0a 20 20 20 20  {$c=="("} {.    
47c0: 20 20 72 65 67 65 78 70 20 7b 5e 5c 28 28 28 5b    regexp {^\((([
47d0: 5e 3c 5d 7c 3c 2e 2b 3f 3e 29 2a 3f 29 5c 29 5c  ^<]|<.+?>)*?)\)\
47e0: 5e 7d 20 24 6e 78 20 61 6c 6c 20 72 65 71 0a 20  ^} $nx all req. 
47f0: 20 20 20 20 20 72 65 67 73 75 62 20 7b 5e 5c 28       regsub {^\(
4800: 28 28 5b 5e 3c 5d 7c 3c 2e 2b 3f 3e 29 2a 3f 29  (([^<]|<.+?>)*?)
4810: 5c 29 5c 5e 7d 20 24 6e 78 20 7b 7d 20 6e 78 0a  \)\^} $nx {} nx.
4820: 20 20 20 20 7d 20 65 6c 73 65 20 7b 0a 20 20 20      } else {.   
4830: 20 20 20 72 65 67 65 78 70 20 7b 5e 28 5b 5e 3c     regexp {^([^<
4840: 5d 7c 3c 2e 2b 3f 3e 29 2a 3f 5c 2e 7d 20 24 6e  ]|<.+?>)*?\.} $n
4850: 78 20 72 65 71 0a 20 20 20 20 20 20 72 65 67 73  x req.      regs
4860: 75 62 20 7b 5e 28 5b 5e 3c 5d 7c 3c 2e 2b 3f 3e  ub {^([^<]|<.+?>
4870: 29 2a 3f 5c 2e 7d 20 24 6e 78 20 7b 7d 20 6e 78  )*?\.} $nx {} nx
4880: 0a 20 20 20 20 7d 0a 20 20 20 20 73 65 74 20 6f  .    }.    set o
4890: 72 69 67 20 5b 73 74 72 69 6e 67 20 74 72 69 6d  rig [string trim
48a0: 20 24 72 65 71 5d 0a 20 20 20 20 72 65 67 73 75   $req].    regsu
48b0: 62 20 2d 61 6c 6c 20 7b 3c 2e 2b 3f 3e 7d 20 24  b -all {<.+?>} $
48c0: 6f 72 69 67 20 7b 7d 20 72 65 71 0a 20 20 20 20  orig {} req.    
48d0: 72 65 67 73 75 62 20 2d 61 6c 6c 20 7b 5c 73 2b  regsub -all {\s+
48e0: 7d 20 5b 73 74 72 69 6e 67 20 74 72 69 6d 20 24  } [string trim $
48f0: 72 65 71 5d 20 7b 20 7d 20 72 65 71 0a 20 20 20  req] { } req.   
4900: 20 73 65 74 20 72 65 71 20 5b 73 74 72 69 6e 67   set req [string
4910: 20 6d 61 70 20 7b 26 6c 74 3b 20 3c 20 26 67 74   map {&lt; < &gt
4920: 3b 20 3e 20 26 23 39 31 3b 20 5b 20 26 23 39 33  ; > &#91; [ &#93
4930: 3b 20 5d 20 26 61 6d 70 3b 20 26 7d 20 24 72 65  ; ] &amp; &} $re
4940: 71 5d 0a 20 20 20 20 73 65 74 20 72 65 71 20 5b  q].    set req [
4950: 73 74 72 69 6e 67 20 74 72 69 6d 20 24 72 65 71  string trim $req
4960: 5d 0a 20 20 20 20 73 65 74 20 72 6e 6f 20 52 2d  ].    set rno R-
4970: 5b 6d 64 35 2d 31 30 78 38 20 24 72 65 71 5d 0a  [md5-10x8 $req].
4980: 20 20 20 20 73 65 74 20 73 68 6f 72 74 72 6e 6f      set shortrno
4990: 20 5b 73 74 72 69 6e 67 20 72 61 6e 67 65 20 24   [string range $
49a0: 72 6e 6f 20 30 20 31 32 5d 0a 20 20 20 20 61 70  rno 0 12].    ap
49b0: 70 65 6e 64 20 6f 75 74 20 22 3c 61 20 6e 61 6d  pend out "<a nam
49c0: 65 3d 5c 22 24 72 6e 6f 5c 22 3e 3c 2f 61 3e 3c  e=\"$rno\"></a><
49d0: 66 6f 6e 74 20 63 6f 6c 6f 72 3d 5c 22 62 6c 75  font color=\"blu
49e0: 65 5c 22 3e 3c 62 3e 5c 6e 22 0a 20 20 20 20 73  e\"><b>\n".    s
49f0: 65 74 20 6c 69 6e 6b 20 22 3c 61 20 68 72 65 66  et link "<a href
4a00: 3d 5c 22 24 6d 61 74 72 69 78 70 61 74 68 23 24  =\"$matrixpath#$
4a10: 72 6e 6f 5c 22 20 73 74 79 6c 65 3d 5c 22 63 6f  rno\" style=\"co
4a20: 6c 6f 72 3a 20 23 30 30 30 30 66 66 5c 22 3e 22  lor: #0000ff\">"
4a30: 0a 20 20 20 20 61 70 70 65 6e 64 20 6f 75 74 20  .    append out 
4a40: 22 24 6c 69 6e 6b 24 73 68 6f 72 74 72 6e 6f 3c  "$link$shortrno<
4a50: 2f 61 3e 3a 5c 5b 3c 2f 62 3e 3c 2f 66 6f 6e 74  /a>:\[</b></font
4a60: 3e 22 0a 20 20 20 20 69 66 20 7b 21 5b 69 6e 66  >".    if {![inf
4a70: 6f 20 65 78 69 73 74 73 20 70 72 6f 6f 66 28 24  o exists proof($
4a80: 72 6e 6f 29 5d 7d 20 7b 0a 20 20 20 20 20 20 73  rno)]} {.      s
4a90: 65 74 20 63 6c 72 20 72 65 64 0a 20 20 20 20 7d  et clr red.    }
4aa0: 20 65 6c 73 65 69 66 20 7b 24 70 72 6f 6f 66 28   elseif {$proof(
4ab0: 24 72 6e 6f 29 3e 3d 32 7d 20 7b 0a 20 20 20 20  $rno)>=2} {.    
4ac0: 20 20 73 65 74 20 63 6c 72 20 67 72 65 65 6e 0a    set clr green.
4ad0: 20 20 20 20 7d 20 65 6c 73 65 69 66 20 7b 24 70      } elseif {$p
4ae0: 72 6f 6f 66 28 24 72 6e 6f 29 3d 3d 31 7d 20 7b  roof($rno)==1} {
4af0: 0a 20 20 20 20 20 20 73 65 74 20 63 6c 72 20 6f  .      set clr o
4b00: 72 61 6e 67 65 0a 20 20 20 20 7d 20 65 6c 73 65  range.    } else
4b10: 20 7b 0a 20 20 20 20 20 20 73 65 74 20 63 6c 72   {.      set clr
4b20: 20 72 65 64 0a 20 20 20 20 7d 0a 20 20 20 20 61   red.    }.    a
4b30: 70 70 65 6e 64 20 6f 75 74 20 22 3c 66 6f 6e 74  ppend out "<font
4b40: 20 63 6f 6c 6f 72 3d 5c 22 24 63 6c 72 5c 22 3e   color=\"$clr\">
4b50: 24 6f 72 69 67 3c 2f 66 6f 6e 74 3e 5c 6e 22 0a  $orig</font>\n".
4b60: 20 20 20 20 61 70 70 65 6e 64 20 6f 75 74 20 22      append out "
4b70: 3c 66 6f 6e 74 20 63 6f 6c 6f 72 3d 5c 22 62 6c  <font color=\"bl
4b80: 75 65 5c 22 3e 3c 62 3e 5c 5d 3c 2f 62 3e 3c 2f  ue\"><b>\]</b></
4b90: 66 6f 6e 74 3e 5c 6e 22 0a 20 20 20 20 73 65 74  font>\n".    set
4ba0: 20 78 20 24 6e 78 0a 20 20 7d 0a 20 20 61 70 70   x $nx.  }.  app
4bb0: 65 6e 64 20 6f 75 74 20 24 78 0a 20 20 73 65 74  end out $x.  set
4bc0: 20 78 20 24 6f 75 74 0a 20 20 73 65 74 20 6f 75   x $out.  set ou
4bd0: 74 20 7b 7d 0a 20 20 77 68 69 6c 65 20 7b 5b 73  t {}.  while {[s
4be0: 74 72 69 6e 67 20 6c 65 6e 67 74 68 20 24 78 5d  tring length $x]
4bf0: 3e 30 20 0a 20 20 20 20 20 26 26 20 5b 72 65 67  >0 .     && [reg
4c00: 65 78 70 20 7b 5e 28 2e 2b 3f 29 28 3c 69 6d 67  exp {^(.+?)(<img
4c10: 20 61 6c 74 3d 22 73 79 6e 74 61 78 20 64 69 61   alt="syntax dia
4c20: 67 72 61 6d 20 2e 2a 29 24 7d 20 24 78 20 61 6c  gram .*)$} $x al
4c30: 6c 20 70 72 65 66 69 78 20 73 75 66 66 69 78 5d  l prefix suffix]
4c40: 7d 20 7b 0a 20 20 20 20 61 70 70 65 6e 64 20 6f  } {.    append o
4c50: 75 74 20 24 70 72 65 66 69 78 0a 20 20 20 20 73  ut $prefix.    s
4c60: 65 74 20 78 20 24 73 75 66 66 69 78 0a 20 20 20  et x $suffix.   
4c70: 20 69 66 20 7b 5b 72 65 67 65 78 70 20 5c 0a 20   if {[regexp \. 
4c80: 20 20 20 20 20 20 20 20 20 20 7b 3c 69 6d 67 20            {<img 
4c90: 61 6c 74 3d 22 28 73 79 6e 74 61 78 20 64 69 61  alt="(syntax dia
4ca0: 67 72 61 6d 20 5b 2d 61 2d 7a 5d 2b 29 22 20 73  gram [-a-z]+)" s
4cb0: 72 63 3d 22 28 5b 2d 2e 2f 61 2d 7a 5d 2b 5c 2e  rc="([-./a-z]+\.
4cc0: 67 69 66 29 22 7d 20 5c 0a 20 20 20 20 20 20 20  gif)"} \.       
4cd0: 20 20 20 20 24 78 20 61 6c 6c 20 6e 61 6d 65 20      $x all name 
4ce0: 69 6d 61 67 65 5d 7d 20 7b 0a 20 20 20 20 20 20  image]} {.      
4cf0: 23 70 75 74 73 20 22 44 49 41 47 52 41 4d 3a 20  #puts "DIAGRAM: 
4d00: 24 66 69 6c 65 20 24 6e 61 6d 65 20 24 69 6d 61  $file $name $ima
4d10: 67 65 22 0a 20 20 20 20 20 20 73 65 74 20 72 65  ge".      set re
4d20: 71 20 24 6e 61 6d 65 0a 20 20 20 20 20 20 72 65  q $name.      re
4d30: 67 73 75 62 20 7b 5e 28 5c 2e 5c 2e 2f 29 2b 7d  gsub {^(\.\./)+}
4d40: 20 24 69 6d 61 67 65 20 7b 7d 20 69 6d 67 32 0a   $image {} img2.
4d50: 20 20 20 20 20 20 73 65 74 20 72 6e 6f 20 52 2d        set rno R-
4d60: 5b 6d 64 35 66 69 6c 65 2d 31 30 78 38 20 64 6f  [md5file-10x8 do
4d70: 63 2f 24 69 6d 67 32 5d 0a 20 20 20 20 20 20 73  c/$img2].      s
4d80: 65 74 20 73 68 6f 72 74 72 6e 6f 20 5b 73 74 72  et shortrno [str
4d90: 69 6e 67 20 72 61 6e 67 65 20 24 72 6e 6f 20 30  ing range $rno 0
4da0: 20 31 32 5d 0a 20 20 20 20 20 20 61 70 70 65 6e   12].      appen
4db0: 64 20 6f 75 74 20 22 3c 61 20 6e 61 6d 65 3d 5c  d out "<a name=\
4dc0: 22 24 72 6e 6f 5c 22 3e 3c 2f 61 3e 3c 66 6f 6e  "$rno\"></a><fon
4dd0: 74 20 63 6f 6c 6f 72 3d 5c 22 62 6c 75 65 5c 22  t color=\"blue\"
4de0: 3e 3c 62 3e 22 0a 20 20 20 20 20 20 73 65 74 20  ><b>".      set 
4df0: 6c 69 6e 6b 20 22 3c 61 20 68 72 65 66 3d 5c 22  link "<a href=\"
4e00: 24 6d 61 74 72 69 78 70 61 74 68 23 24 72 6e 6f  $matrixpath#$rno
4e10: 5c 22 20 73 74 79 6c 65 3d 5c 22 63 6f 6c 6f 72  \" style=\"color
4e20: 3a 20 23 30 30 30 30 66 66 5c 22 3e 22 0a 20 20  : #0000ff\">".  
4e30: 20 20 20 20 61 70 70 65 6e 64 20 6f 75 74 20 22      append out "
4e40: 24 6c 69 6e 6b 24 73 68 6f 72 74 72 6e 6f 3c 2f  $link$shortrno</
4e50: 61 3e 3a 5c 5b 3c 2f 62 3e 3c 2f 66 6f 6e 74 3e  a>:\[</b></font>
4e60: 5c 6e 22 0a 20 20 20 20 20 20 69 66 20 7b 24 70  \n".      if {$p
4e70: 72 6f 6f 66 28 24 72 6e 6f 29 3e 3d 32 7d 20 7b  roof($rno)>=2} {
4e80: 0a 20 20 20 20 20 20 20 20 73 65 74 20 63 6c 72  .        set clr
4e90: 20 67 72 65 65 6e 0a 20 20 20 20 20 20 7d 20 65   green.      } e
4ea0: 6c 73 65 69 66 20 7b 24 70 72 6f 6f 66 28 24 72  lseif {$proof($r
4eb0: 6e 6f 29 3d 3d 31 7d 20 7b 0a 20 20 20 20 20 20  no)==1} {.      
4ec0: 20 20 73 65 74 20 63 6c 72 20 6f 72 61 6e 67 65    set clr orange
4ed0: 0a 20 20 20 20 20 20 7d 20 65 6c 73 65 20 7b 0a  .      } else {.
4ee0: 20 20 20 20 20 20 20 20 73 65 74 20 63 6c 72 20          set clr 
4ef0: 72 65 64 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  red.      }.    
4f00: 20 20 61 70 70 65 6e 64 20 6f 75 74 20 22 3c 69    append out "<i
4f10: 6d 67 20 62 6f 72 64 65 72 3d 33 20 73 74 79 6c  mg border=3 styl
4f20: 65 3d 5c 22 62 6f 72 64 65 72 2d 63 6f 6c 6f 72  e=\"border-color
4f30: 3a 20 24 63 6c 72 5c 22 20 73 72 63 3d 5c 22 24  : $clr\" src=\"$
4f40: 69 6d 61 67 65 5c 22 3e 22 0a 20 20 20 20 20 20  image\">".      
4f50: 61 70 70 65 6e 64 20 6f 75 74 20 22 3c 66 6f 6e  append out "<fon
4f60: 74 20 63 6f 6c 6f 72 3d 5c 22 62 6c 75 65 5c 22  t color=\"blue\"
4f70: 3e 3c 62 3e 5c 5d 3c 2f 62 3e 3c 2f 66 6f 6e 74  ><b>\]</b></font
4f80: 3e 5c 6e 22 0a 20 20 20 20 20 20 72 65 67 73 75  >\n".      regsu
4f90: 62 20 7b 2e 2b 3f 3e 7d 20 24 78 20 7b 7d 20 78  b {.+?>} $x {} x
4fa0: 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 61 70 70  .    }.  }.  app
4fb0: 65 6e 64 20 6f 75 74 20 24 78 0a 20 20 73 65 74  end out $x.  set
4fc0: 20 6f 75 74 66 64 20 5b 6f 70 65 6e 20 24 6f 75   outfd [open $ou
4fd0: 74 66 69 6c 65 20 77 5d 0a 20 20 70 75 74 73 20  tfile w].  puts 
4fe0: 2d 6e 6f 6e 65 77 6c 69 6e 65 20 24 6f 75 74 66  -nonewline $outf
4ff0: 64 20 24 6f 75 74 0a 20 20 63 6c 6f 73 65 20 24  d $out.  close $
5000: 6f 75 74 66 64 0a 7d 0a 70 75 74 73 20 22 22 0a  outfd.}.puts "".