Documentation Source Text

Hex Artifact Content
Login

Artifact 787a1c433c85cf1310f2e3b1c96555948db7c1e3:


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 42 45 47 49  db eval {.  BEGI
01f0: 4e 3b 0a 20 20 44 45 4c 45 54 45 20 46 52 4f 4d  N;.  DELETE FROM
0200: 20 72 65 71 75 69 72 65 6d 65 6e 74 3b 0a 20 20   requirement;.  
0210: 44 45 4c 45 54 45 20 46 52 4f 4d 20 72 65 71 73  DELETE FROM reqs
0220: 72 63 3b 0a 7d 0a 0a 23 20 45 78 74 72 61 63 74  rc;.}..# Extract
0230: 20 72 65 71 75 69 72 65 6d 65 6e 74 20 74 65 78   requirement tex
0240: 74 20 66 72 6f 6d 20 61 6c 6c 20 6f 66 20 74 68  t from all of th
0250: 65 20 48 54 4d 4c 20 66 69 6c 65 73 20 69 6e 20  e HTML files in 
0260: 24 66 69 6c 65 6c 69 73 74 0a 23 0a 23 20 52 65  $filelist.#.# Re
0270: 71 75 69 72 65 6d 65 6e 74 73 20 74 65 78 74 20  quirements text 
0280: 69 73 20 74 65 78 74 20 62 65 74 77 65 65 6e 20  is text between 
0290: 22 5e 22 20 61 6e 64 20 22 2e 22 20 6f 72 20 62  "^" and "." or b
02a0: 65 74 77 65 65 6e 20 22 5e 28 22 20 61 6e 64 20  etween "^(" and 
02b0: 22 29 5e 22 2e 0a 23 20 52 65 71 75 69 72 65 6d  ")^"..# Requirem
02c0: 65 6e 74 20 74 65 78 74 20 69 73 20 6e 6f 72 6d  ent text is norm
02d0: 61 6c 69 7a 65 64 20 62 79 20 72 65 6d 6f 76 69  alized by removi
02e0: 6e 67 20 61 6c 6c 20 48 54 4d 4c 20 6d 61 72 6b  ng all HTML mark
02f0: 75 70 2c 20 72 65 6d 6f 76 69 6e 67 0a 23 20 61  up, removing.# a
0300: 6c 6c 20 77 68 69 74 65 73 70 61 63 65 20 66 72  ll whitespace fr
0310: 6f 6d 20 74 68 65 20 62 65 67 69 6e 6e 69 6e 67  om the beginning
0320: 20 61 6e 64 20 65 6e 64 2c 20 61 6e 64 20 63 6f   and end, and co
0330: 6e 76 65 72 74 69 6e 67 20 61 6c 6c 20 69 6e 74  nverting all int
0340: 65 72 6e 61 6c 0a 23 20 77 68 69 74 65 73 70 61  ernal.# whitespa
0350: 63 65 20 73 65 71 75 65 6e 63 65 73 20 69 6e 74  ce sequences int
0360: 6f 20 61 20 73 69 6e 67 6c 65 20 73 70 61 63 65  o a single space
0370: 20 63 68 61 72 61 63 74 65 72 2e 0a 23 0a 23 20   character..#.# 
0380: 53 79 6e 74 61 78 20 64 69 61 67 72 61 6d 73 20  Syntax diagrams 
0390: 61 72 65 20 63 6f 6e 73 69 64 65 72 65 64 20 74  are considered t
03a0: 68 65 69 72 20 6f 77 6e 20 72 65 71 75 69 72 65  heir own require
03b0: 6d 65 6e 74 20 69 66 20 74 68 65 79 20 61 72 65  ment if they are
03c0: 0a 23 20 65 6d 62 65 64 64 65 64 20 75 73 69 6e  .# embedded usin
03d0: 67 20 6d 61 72 6b 75 70 20 6f 66 20 74 68 65 20  g markup of the 
03e0: 66 6f 6c 6c 6f 77 69 6e 67 20 70 61 74 74 65 72  following patter
03f0: 3a 0a 23 0a 23 20 20 20 20 3c 69 6d 67 20 61 6c  :.#.#    <img al
0400: 74 3d 22 73 79 6e 74 61 78 20 64 69 61 67 72 61  t="syntax diagra
0410: 6d 20 4e 41 4d 45 22 20 73 72 63 3d 22 46 49 4c  m NAME" src="FIL
0420: 45 4e 41 4d 45 2e 67 69 66 22 3e 0a 23 0a 23 20  ENAME.gif">.#.# 
0430: 54 68 65 20 72 65 71 75 69 72 65 6d 65 6e 74 20  The requirement 
0440: 74 61 62 6c 65 20 6f 66 20 74 68 65 20 64 6f 63  table of the doc
0450: 69 6e 66 6f 2e 64 62 20 69 73 20 70 6f 70 75 6c  info.db is popul
0460: 61 74 65 64 20 77 69 74 68 20 72 65 71 75 69 72  ated with requir
0470: 65 6d 65 6e 74 0a 23 20 69 6e 66 6f 72 6d 61 74  ement.# informat
0480: 69 6f 6e 2e 20 20 53 65 65 20 74 68 65 20 73 63  ion.  See the sc
0490: 68 65 6d 61 2e 74 63 6c 20 73 6f 75 72 63 65 20  hema.tcl source 
04a0: 66 69 6c 65 20 66 6f 72 20 61 20 64 65 66 69 6e  file for a defin
04b0: 69 74 69 6f 6e 20 6f 66 20 74 68 65 0a 23 20 72  ition of the.# r
04c0: 65 71 75 69 72 6d 65 6e 74 20 74 61 62 6c 65 2e  equirment table.
04d0: 0a 23 0a 70 75 74 73 20 2d 6e 6f 6e 65 77 6c 69  .#.puts -nonewli
04e0: 6e 65 20 22 53 63 61 6e 6e 69 6e 67 20 64 6f 63  ne "Scanning doc
04f0: 75 6d 65 6e 74 61 74 69 6f 6e 20 66 6f 72 20 74  umentation for t
0500: 65 73 74 61 62 6c 65 20 73 74 61 74 65 6d 65 6e  estable statemen
0510: 74 73 22 0a 66 6c 75 73 68 20 73 74 64 6f 75 74  ts".flush stdout
0520: 0a 66 6f 72 65 61 63 68 20 66 69 6c 65 20 24 66  .foreach file $f
0530: 69 6c 65 6c 69 73 74 20 7b 0a 20 20 69 66 20 7b  ilelist {.  if {
0540: 24 66 69 6c 65 3d 3d 22 64 6f 63 2f 66 69 6c 65  $file=="doc/file
0550: 66 6f 72 6d 61 74 2e 68 74 6d 6c 22 20 0a 20 20  format.html" .  
0560: 20 20 20 20 20 20 26 26 20 5b 6c 73 65 61 72 63        && [lsearc
0570: 68 20 24 66 69 6c 65 6c 69 73 74 20 64 6f 63 2f  h $filelist doc/
0580: 66 69 6c 65 66 6f 72 6d 61 74 32 2e 68 74 6d 6c  fileformat2.html
0590: 5d 3e 3d 30 7d 20 7b 0a 20 20 20 20 63 6f 6e 74  ]>=0} {.    cont
05a0: 69 6e 75 65 0a 20 20 7d 0a 20 20 70 75 74 73 20  inue.  }.  puts 
05b0: 2d 6e 6f 6e 65 77 6c 69 6e 65 20 2e 0a 20 20 23  -nonewline ..  #
05c0: 20 70 75 74 73 20 22 24 66 69 6c 65 2e 2e 2e 22   puts "$file..."
05d0: 0a 20 20 66 6c 75 73 68 20 73 74 64 6f 75 74 0a  .  flush stdout.
05e0: 20 20 73 65 74 20 69 6e 20 5b 6f 70 65 6e 20 24    set in [open $
05f0: 66 69 6c 65 5d 0a 20 20 73 65 74 20 78 20 5b 72  file].  set x [r
0600: 65 61 64 20 24 69 6e 20 5b 66 69 6c 65 20 73 69  ead $in [file si
0610: 7a 65 20 24 66 69 6c 65 5d 5d 0a 20 20 63 6c 6f  ze $file]].  clo
0620: 73 65 20 24 69 6e 0a 20 20 73 65 74 20 6f 72 69  se $in.  set ori
0630: 67 5f 78 20 24 78 0a 20 20 73 65 74 20 6f 72 69  g_x $x.  set ori
0640: 67 6c 65 6e 20 5b 73 74 72 69 6e 67 20 6c 65 6e  glen [string len
0650: 67 74 68 20 24 78 5d 0a 20 20 72 65 67 73 75 62  gth $x].  regsub
0660: 20 7b 5e 64 6f 63 2f 7d 20 24 66 69 6c 65 20 7b   {^doc/} $file {
0670: 7d 20 73 72 63 66 69 6c 65 0a 20 20 73 65 74 20  } srcfile.  set 
0680: 73 65 71 6e 6f 20 30 0a 20 20 77 68 69 6c 65 20  seqno 0.  while 
0690: 7b 5b 73 74 72 69 6e 67 20 6c 65 6e 67 74 68 20  {[string length 
06a0: 24 78 5d 3e 30 20 26 26 20 5b 72 65 67 73 75 62  $x]>0 && [regsub
06b0: 20 7b 5e 2e 2a 3f 5c 5e 7d 20 24 78 20 7b 7d 20   {^.*?\^} $x {} 
06c0: 6e 78 5d 7d 20 7b 0a 20 20 20 20 73 65 74 20 63  nx]} {.    set c
06d0: 20 5b 73 74 72 69 6e 67 20 69 6e 64 65 78 20 24   [string index $
06e0: 6e 78 20 30 5d 0a 20 20 20 20 73 65 74 20 73 65  nx 0].    set se
06f0: 71 6e 6f 20 5b 65 78 70 72 20 7b 24 6f 72 69 67  qno [expr {$orig
0700: 6c 65 6e 20 2d 20 5b 73 74 72 69 6e 67 20 6c 65  len - [string le
0710: 6e 67 74 68 20 24 6e 78 5d 7d 5d 0a 20 20 20 20  ngth $nx]}].    
0720: 73 65 74 20 72 65 71 20 7b 7d 0a 20 20 20 20 69  set req {}.    i
0730: 66 20 7b 24 63 3d 3d 22 28 22 7d 20 7b 0a 20 20  f {$c=="("} {.  
0740: 20 20 20 20 72 65 67 65 78 70 20 7b 5e 5c 28 28      regexp {^\((
0750: 28 5b 5e 3c 5d 7c 3c 2e 2b 3f 3e 29 2a 3f 29 5c  ([^<]|<.+?>)*?)\
0760: 29 5c 5e 7d 20 24 6e 78 20 61 6c 6c 20 72 65 71  )\^} $nx all req
0770: 0a 20 20 20 20 20 20 72 65 67 73 75 62 20 7b 5e  .      regsub {^
0780: 5c 28 28 28 5b 5e 3c 5d 7c 3c 2e 2b 3f 3e 29 2a  \((([^<]|<.+?>)*
0790: 3f 29 5c 29 5c 5e 7d 20 24 6e 78 20 7b 7d 20 6e  ?)\)\^} $nx {} n
07a0: 78 0a 20 20 20 20 7d 20 65 6c 73 65 20 7b 0a 20  x.    } else {. 
07b0: 20 20 20 20 20 72 65 67 65 78 70 20 7b 5e 28 5b       regexp {^([
07c0: 5e 3c 5d 7c 3c 2e 2b 3f 3e 29 2a 3f 5c 2e 7d 20  ^<]|<.+?>)*?\.} 
07d0: 24 6e 78 20 72 65 71 0a 20 20 20 20 20 20 72 65  $nx req.      re
07e0: 67 73 75 62 20 7b 5e 28 5b 5e 3c 5d 7c 3c 2e 2b  gsub {^([^<]|<.+
07f0: 3f 3e 29 2a 3f 5c 2e 7d 20 24 6e 78 20 7b 7d 20  ?>)*?\.} $nx {} 
0800: 6e 78 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 20  nx.    }.    if 
0810: 7b 24 72 65 71 3d 3d 22 22 7d 20 7b 0a 20 20 20  {$req==""} {.   
0820: 20 20 20 70 75 74 73 20 22 24 73 72 63 66 69 6c     puts "$srcfil
0830: 65 3a 20 62 61 64 20 72 65 71 75 69 72 65 6d 65  e: bad requireme
0840: 6e 74 3a 20 5b 73 74 72 69 6e 67 20 72 61 6e 67  nt: [string rang
0850: 65 20 24 6e 78 20 30 20 34 30 5d 2e 2e 2e 22 0a  e $nx 0 40]...".
0860: 20 20 20 20 20 20 73 65 74 20 78 20 24 6e 78 0a        set x $nx.
0870: 20 20 20 20 20 20 63 6f 6e 74 69 6e 75 65 0a 20        continue. 
0880: 20 20 20 7d 0a 20 20 20 20 73 65 74 20 6f 72 69     }.    set ori
0890: 67 20 5b 73 74 72 69 6e 67 20 74 72 69 6d 20 24  g [string trim $
08a0: 72 65 71 5d 0a 20 20 20 20 72 65 67 73 75 62 20  req].    regsub 
08b0: 2d 61 6c 6c 20 7b 3c 2e 2b 3f 3e 7d 20 24 6f 72  -all {<.+?>} $or
08c0: 69 67 20 7b 7d 20 72 65 71 0a 20 20 20 20 72 65  ig {} req.    re
08d0: 67 73 75 62 20 2d 61 6c 6c 20 7b 5c 73 2b 7d 20  gsub -all {\s+} 
08e0: 5b 73 74 72 69 6e 67 20 74 72 69 6d 20 24 72 65  [string trim $re
08f0: 71 5d 20 7b 20 7d 20 72 65 71 0a 20 20 20 20 73  q] { } req.    s
0900: 65 74 20 72 65 71 20 5b 73 74 72 69 6e 67 20 6d  et req [string m
0910: 61 70 20 7b 26 6c 74 3b 20 3c 20 26 67 74 3b 20  ap {&lt; < &gt; 
0920: 3e 20 26 23 39 31 3b 20 5b 20 26 23 39 33 3b 20  > &#91; [ &#93; 
0930: 5d 20 26 61 6d 70 3b 20 26 7d 20 24 72 65 71 5d  ] &amp; &} $req]
0940: 0a 20 20 20 20 73 65 74 20 72 65 71 20 5b 73 74  .    set req [st
0950: 72 69 6e 67 20 74 72 69 6d 20 24 72 65 71 5d 0a  ring trim $req].
0960: 20 20 20 20 73 65 74 20 72 65 71 6e 6f 20 52 2d      set reqno R-
0970: 5b 6d 64 35 2d 31 30 78 38 20 24 72 65 71 5d 0a  [md5-10x8 $req].
0980: 20 20 20 20 64 62 20 65 76 61 6c 20 7b 53 45 4c      db eval {SEL
0990: 45 43 54 20 73 72 63 66 69 6c 65 20 41 53 20 73  ECT srcfile AS s
09a0: 32 2c 20 72 65 71 74 65 78 74 20 61 73 20 72 32  2, reqtext as r2
09b0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 46 52  .             FR
09c0: 4f 4d 20 72 65 71 75 69 72 65 6d 65 6e 74 20 57  OM requirement W
09d0: 48 45 52 45 20 72 65 71 6e 6f 3d 24 72 65 71 6e  HERE reqno=$reqn
09e0: 6f 7d 20 7b 0a 20 20 20 20 20 20 70 75 74 73 20  o} {.      puts 
09f0: 22 24 73 72 63 66 69 6c 65 3a 20 64 75 70 6c 69  "$srcfile: dupli
0a00: 63 61 74 65 20 5b 73 74 72 69 6e 67 20 72 61 6e  cate [string ran
0a10: 67 65 20 24 72 65 71 6e 6f 20 30 20 31 32 5d 20  ge $reqno 0 12] 
0a20: 69 6e 20 24 73 32 3a 20 5c 5b 24 72 32 5c 5d 22  in $s2: \[$r2\]"
0a30: 0a 20 20 20 20 7d 0a 20 20 20 20 64 62 20 65 76  .    }.    db ev
0a40: 61 6c 20 7b 0a 20 20 20 20 20 20 49 4e 53 45 52  al {.      INSER
0a50: 54 20 4f 52 20 49 47 4e 4f 52 45 20 49 4e 54 4f  T OR IGNORE INTO
0a60: 20 72 65 71 75 69 72 65 6d 65 6e 74 0a 20 20 20   requirement.   
0a70: 20 20 20 20 20 20 20 20 20 20 20 28 72 65 71 6e             (reqn
0a80: 6f 2c 20 72 65 71 74 65 78 74 2c 20 6f 72 69 67  o, reqtext, orig
0a90: 74 65 78 74 2c 20 72 65 71 69 6d 61 67 65 2c 73  text, reqimage,s
0aa0: 72 63 66 69 6c 65 2c 73 72 63 73 65 71 29 0a 20  rcfile,srcseq). 
0ab0: 20 20 20 20 20 20 20 56 41 4c 55 45 53 28 24 72         VALUES($r
0ac0: 65 71 6e 6f 2c 24 72 65 71 2c 20 20 20 20 24 6f  eqno,$req,    $o
0ad0: 72 69 67 2c 20 20 20 20 30 2c 20 20 20 20 20 20  rig,    0,      
0ae0: 24 73 72 63 66 69 6c 65 2c 24 73 65 71 6e 6f 29  $srcfile,$seqno)
0af0: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 64 62 20 65  ;.    }.    db e
0b00: 76 61 6c 20 7b 0a 20 20 20 20 20 20 49 4e 53 45  val {.      INSE
0b10: 52 54 20 4f 52 20 49 47 4e 4f 52 45 20 49 4e 54  RT OR IGNORE INT
0b20: 4f 20 72 65 71 73 72 63 28 73 72 63 66 69 6c 65  O reqsrc(srcfile
0b30: 2c 20 73 72 63 73 65 71 2c 20 72 65 71 6e 6f 29  , srcseq, reqno)
0b40: 0a 20 20 20 20 20 20 56 41 4c 55 45 53 28 24 73  .      VALUES($s
0b50: 72 63 66 69 6c 65 2c 20 24 73 65 71 6e 6f 2c 20  rcfile, $seqno, 
0b60: 24 72 65 71 6e 6f 29 0a 20 20 20 20 7d 0a 20 20  $reqno).    }.  
0b70: 20 20 73 65 74 20 78 20 24 6e 78 0a 20 20 7d 0a    set x $nx.  }.
0b80: 20 20 73 65 74 20 78 20 24 6f 72 69 67 5f 78 0a    set x $orig_x.
0b90: 20 20 75 6e 73 65 74 20 6f 72 69 67 5f 78 0a 20    unset orig_x. 
0ba0: 20 77 68 69 6c 65 20 7b 5b 73 74 72 69 6e 67 20   while {[string 
0bb0: 6c 65 6e 67 74 68 20 24 78 5d 3e 30 20 0a 20 20  length $x]>0 .  
0bc0: 20 20 20 26 26 20 5b 72 65 67 65 78 70 20 7b 5e     && [regexp {^
0bd0: 28 2e 2b 3f 29 28 3c 69 6d 67 20 61 6c 74 3d 22  (.+?)(<img alt="
0be0: 73 79 6e 74 61 78 20 64 69 61 67 72 61 6d 20 2e  syntax diagram .
0bf0: 2a 29 24 7d 20 24 78 20 61 6c 6c 20 70 72 65 66  *)$} $x all pref
0c00: 69 78 20 73 75 66 66 69 78 5d 7d 20 7b 0a 20 20  ix suffix]} {.  
0c10: 20 20 73 65 74 20 78 20 24 73 75 66 66 69 78 0a    set x $suffix.
0c20: 20 20 20 20 73 65 74 20 73 65 71 6e 6f 20 5b 65      set seqno [e
0c30: 78 70 72 20 7b 24 6f 72 69 67 6c 65 6e 20 2d 20  xpr {$origlen - 
0c40: 5b 73 74 72 69 6e 67 20 6c 65 6e 67 74 68 20 24  [string length $
0c50: 78 5d 7d 5d 0a 20 20 20 20 69 66 20 7b 5b 72 65  x]}].    if {[re
0c60: 67 65 78 70 20 5c 0a 20 20 20 20 20 20 20 20 20  gexp \.         
0c70: 20 20 7b 3c 69 6d 67 20 61 6c 74 3d 22 28 73 79    {<img alt="(sy
0c80: 6e 74 61 78 20 64 69 61 67 72 61 6d 20 5b 2d 61  ntax diagram [-a
0c90: 2d 7a 5d 2b 29 22 20 73 72 63 3d 22 5b 2e 2f 5d  -z]+)" src="[./]
0ca0: 2a 28 5b 2d 2e 2f 61 2d 7a 5d 2b 5c 2e 67 69 66  *([-./a-z]+\.gif
0cb0: 29 22 7d 20 5c 0a 20 20 20 20 20 20 20 20 20 20  )"} \.          
0cc0: 20 24 78 20 61 6c 6c 20 6e 61 6d 65 20 69 6d 61   $x all name ima
0cd0: 67 65 5d 7d 20 7b 0a 20 20 20 20 20 20 23 70 75  ge]} {.      #pu
0ce0: 74 73 20 22 44 49 41 47 52 41 4d 3a 20 24 66 69  ts "DIAGRAM: $fi
0cf0: 6c 65 20 24 6e 61 6d 65 20 24 69 6d 61 67 65 20  le $name $image 
0d00: 24 73 65 71 6e 6f 22 0a 20 20 20 20 20 20 73 65  $seqno".      se
0d10: 74 20 72 65 71 20 24 6e 61 6d 65 0a 20 20 20 20  t req $name.    
0d20: 20 20 73 65 74 20 6f 72 69 67 20 22 3c 69 6d 67    set orig "<img
0d30: 20 73 72 63 3d 5c 22 24 69 6d 61 67 65 5c 22 3e   src=\"$image\">
0d40: 22 0a 20 20 20 20 20 20 69 66 20 7b 21 5b 66 69  ".      if {![fi
0d50: 6c 65 20 65 78 69 73 74 73 20 64 6f 63 2f 24 69  le exists doc/$i
0d60: 6d 61 67 65 5d 7d 20 7b 0a 20 20 20 20 20 20 20  mage]} {.       
0d70: 20 70 75 74 73 20 73 74 64 65 72 72 20 22 4e 6f   puts stderr "No
0d80: 20 73 75 63 68 20 69 6d 61 67 65 3a 20 64 6f 63   such image: doc
0d90: 2f 24 69 6d 61 67 65 22 0a 20 20 20 20 20 20 20  /$image".       
0da0: 20 63 6f 6e 74 69 6e 75 65 0a 20 20 20 20 20 20   continue.      
0db0: 7d 0a 20 20 20 20 20 20 73 65 74 20 72 65 71 6e  }.      set reqn
0dc0: 6f 20 52 2d 5b 6d 64 35 66 69 6c 65 2d 31 30 78  o R-[md5file-10x
0dd0: 38 20 64 6f 63 2f 24 69 6d 61 67 65 5d 0a 0a 20  8 doc/$image].. 
0de0: 20 20 20 20 20 69 66 20 7b 5b 73 74 72 69 6e 67       if {[string
0df0: 20 6d 61 74 63 68 20 2a 73 79 6e 74 61 78 2f 2a   match *syntax/*
0e00: 2e 68 74 6d 6c 20 24 73 72 63 66 69 6c 65 5d 7d  .html $srcfile]}
0e10: 20 7b 0a 20 20 20 20 20 20 20 20 64 62 20 65 76   {.        db ev
0e20: 61 6c 20 7b 44 45 4c 45 54 45 20 46 52 4f 4d 20  al {DELETE FROM 
0e30: 72 65 71 75 69 72 65 6d 65 6e 74 20 57 48 45 52  requirement WHER
0e40: 45 20 72 65 71 6e 6f 3d 24 72 65 71 6e 6f 7d 0a  E reqno=$reqno}.
0e50: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 64 62        }.      db
0e60: 20 65 76 61 6c 20 7b 0a 20 20 20 20 20 20 20 20   eval {.        
0e70: 49 4e 53 45 52 54 20 4f 52 20 49 47 4e 4f 52 45  INSERT OR IGNORE
0e80: 20 49 4e 54 4f 20 72 65 71 75 69 72 65 6d 65 6e   INTO requiremen
0e90: 74 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  t.              
0ea0: 20 20 28 72 65 71 6e 6f 2c 20 72 65 71 74 65 78    (reqno, reqtex
0eb0: 74 2c 20 6f 72 69 67 74 65 78 74 2c 20 72 65 71  t, origtext, req
0ec0: 69 6d 61 67 65 2c 73 72 63 66 69 6c 65 2c 73 72  image,srcfile,sr
0ed0: 63 73 65 71 29 0a 20 20 20 20 20 20 20 20 20 20  cseq).          
0ee0: 56 41 4c 55 45 53 28 24 72 65 71 6e 6f 2c 24 72  VALUES($reqno,$r
0ef0: 65 71 2c 20 20 20 20 24 6f 72 69 67 2c 20 20 20  eq,    $orig,   
0f00: 20 31 2c 20 20 20 20 20 20 24 73 72 63 66 69 6c   1,      $srcfil
0f10: 65 2c 24 73 65 71 6e 6f 29 3b 0a 20 20 20 20 20  e,$seqno);.     
0f20: 20 7d 0a 20 20 20 20 20 20 64 62 20 65 76 61 6c   }.      db eval
0f30: 20 7b 0a 20 20 20 20 20 20 20 20 49 4e 53 45 52   {.        INSER
0f40: 54 20 4f 52 20 49 47 4e 4f 52 45 20 49 4e 54 4f  T OR IGNORE INTO
0f50: 20 72 65 71 73 72 63 28 73 72 63 66 69 6c 65 2c   reqsrc(srcfile,
0f60: 20 73 72 63 73 65 71 2c 20 72 65 71 6e 6f 29 0a   srcseq, reqno).
0f70: 20 20 20 20 20 20 20 20 56 41 4c 55 45 53 28 24          VALUES($
0f80: 73 72 63 66 69 6c 65 2c 24 73 65 71 6e 6f 2c 24  srcfile,$seqno,$
0f90: 72 65 71 6e 6f 29 0a 20 20 20 20 20 20 7d 0a 20  reqno).      }. 
0fa0: 20 20 20 7d 0a 20 20 7d 0a 7d 0a 64 62 20 65 76     }.  }.}.db ev
0fb0: 61 6c 20 43 4f 4d 4d 49 54 0a 73 65 74 20 63 6e  al COMMIT.set cn
0fc0: 74 20 5b 64 62 20 6f 6e 65 20 7b 53 45 4c 45 43  t [db one {SELEC
0fd0: 54 20 63 6f 75 6e 74 28 2a 29 20 46 52 4f 4d 20  T count(*) FROM 
0fe0: 72 65 71 75 69 72 65 6d 65 6e 74 7d 5d 0a 73 65  requirement}].se
0ff0: 74 20 65 76 63 6e 74 20 5b 64 62 20 6f 6e 65 20  t evcnt [db one 
1000: 7b 0a 20 20 53 45 4c 45 43 54 20 63 6f 75 6e 74  {.  SELECT count
1010: 28 2a 29 20 46 52 4f 4d 20 72 65 71 75 69 72 65  (*) FROM require
1020: 6d 65 6e 74 20 57 48 45 52 45 20 72 65 71 6e 6f  ment WHERE reqno
1030: 20 49 4e 20 28 53 45 4c 45 43 54 20 72 65 71 6e   IN (SELECT reqn
1040: 6f 20 46 52 4f 4d 20 65 76 69 64 65 6e 63 65 29  o FROM evidence)
1050: 0a 7d 5d 0a 73 65 74 20 65 76 70 63 74 20 5b 66  .}].set evpct [f
1060: 6f 72 6d 61 74 20 7b 25 2e 31 66 25 25 7d 20 5b  ormat {%.1f%%} [
1070: 65 78 70 72 20 7b 24 65 76 63 6e 74 2a 31 30 30  expr {$evcnt*100
1080: 2e 30 2f 24 63 6e 74 7d 5d 5d 0a 70 75 74 73 20  .0/$cnt}]].puts 
1090: 22 5c 6e 46 6f 75 6e 64 20 24 63 6e 74 20 74 65  "\nFound $cnt te
10a0: 73 74 61 62 6c 65 20 73 74 61 74 65 6d 65 6e 74  stable statement
10b0: 73 2e 20 45 76 69 64 65 6e 63 65 20 65 78 69 73  s. Evidence exis
10c0: 74 73 20 66 6f 72 20 24 65 76 63 6e 74 20 6f 72  ts for $evcnt or
10d0: 20 24 65 76 70 63 74 22 0a 0a 23 20 52 65 70 6f   $evpct"..# Repo
10e0: 72 74 20 61 6c 6c 20 65 76 69 64 65 6e 63 65 20  rt all evidence 
10f0: 66 6f 72 20 77 68 69 63 68 20 74 68 65 72 65 20  for which there 
1100: 69 73 20 6e 6f 20 63 6f 72 72 65 73 70 6f 6e 64  is no correspond
1110: 69 6e 67 20 72 65 71 75 69 72 65 6d 65 6e 74 2e  ing requirement.
1120: 0a 23 20 53 75 63 68 20 65 76 69 64 65 6e 63 65  .# Such evidence
1130: 20 69 73 20 70 72 6f 62 61 62 6c 79 20 22 73 74   is probably "st
1140: 61 6c 65 22 20 2d 20 74 68 65 20 72 65 71 75 69  ale" - the requi
1150: 72 65 6d 65 6e 74 20 74 65 78 74 20 68 61 73 20  rement text has 
1160: 63 68 61 6e 67 65 64 20 62 75 74 0a 23 20 74 68  changed but.# th
1170: 65 20 65 76 69 64 65 6e 63 65 20 74 65 78 74 20  e evidence text 
1180: 64 69 64 20 6e 6f 74 2e 0a 23 0a 64 62 20 65 76  did not..#.db ev
1190: 61 6c 20 7b 0a 20 20 53 45 4c 45 43 54 20 72 65  al {.  SELECT re
11a0: 71 6e 6f 2c 20 73 72 63 66 69 6c 65 2c 20 73 72  qno, srcfile, sr
11b0: 63 6c 69 6e 65 20 46 52 4f 4d 20 65 76 69 64 65  cline FROM evide
11c0: 6e 63 65 0a 20 20 20 57 48 45 52 45 20 72 65 71  nce.   WHERE req
11d0: 6e 6f 20 4e 4f 54 20 49 4e 20 28 53 45 4c 45 43  no NOT IN (SELEC
11e0: 54 20 72 65 71 6e 6f 20 46 52 4f 4d 20 72 65 71  T reqno FROM req
11f0: 75 69 72 65 6d 65 6e 74 29 0a 7d 20 7b 0a 20 20  uirement).} {.  
1200: 70 75 74 73 20 22 45 52 52 4f 52 3a 20 73 74 61  puts "ERROR: sta
1210: 6c 65 20 65 76 69 64 65 6e 63 65 20 61 74 20 24  le evidence at $
1220: 73 72 63 66 69 6c 65 3a 24 73 72 63 6c 69 6e 65  srcfile:$srcline
1230: 20 2d 20 24 72 65 71 6e 6f 22 0a 7d 0a 0a 0a 23   - $reqno".}...#
1240: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
1250: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
1260: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
1270: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
1280: 23 23 23 23 23 23 23 0a 23 20 48 65 61 64 65 72  #######.# Header
1290: 20 6f 75 74 70 75 74 20 72 6f 75 74 69 6e 65 20   output routine 
12a0: 61 64 61 70 74 65 64 20 66 72 6f 6d 20 77 72 61  adapted from wra
12b0: 70 2e 74 63 6c 2e 20 20 4b 65 65 70 20 74 68 65  p.tcl.  Keep the
12c0: 20 74 77 6f 20 69 6e 20 73 79 6e 63 2e 0a 23 0a   two in sync..#.
12d0: 23 20 68 64 5f 70 75 74 73 69 6e 34 20 69 73 20  # hd_putsin4 is 
12e0: 6c 69 6b 65 20 70 75 74 73 20 65 78 63 65 70 74  like puts except
12f0: 20 74 68 61 74 20 69 74 20 72 65 6d 6f 76 65 73   that it removes
1300: 20 74 68 65 20 66 69 72 73 74 20 34 20 69 6e 64   the first 4 ind
1310: 65 6e 74 61 74 69 6f 6e 0a 23 20 63 68 61 72 61  entation.# chara
1320: 63 74 65 72 73 20 66 72 6f 6d 20 65 61 63 68 20  cters from each 
1330: 6c 69 6e 65 2e 20 20 49 74 20 61 6c 73 6f 20 64  line.  It also d
1340: 6f 65 73 20 76 61 72 69 61 62 6c 65 20 73 75 62  oes variable sub
1350: 73 74 69 74 75 74 69 6f 6e 20 69 6e 0a 23 20 74  stitution in.# t
1360: 68 65 20 6e 61 6d 65 73 70 61 63 65 20 6f 66 20  he namespace of 
1370: 69 74 73 20 63 61 6c 6c 69 6e 67 20 70 72 6f 63  its calling proc
1380: 65 64 75 72 65 2e 0a 23 0a 70 72 6f 63 20 70 75  edure..#.proc pu
1390: 74 73 69 6e 34 20 7b 66 64 20 74 65 78 74 7d 20  tsin4 {fd text} 
13a0: 7b 0a 20 20 72 65 67 73 75 62 20 2d 61 6c 6c 20  {.  regsub -all 
13b0: 22 5c 6e 20 20 20 20 22 20 24 74 65 78 74 20 5c  "\n    " $text \
13c0: 6e 20 74 65 78 74 0a 20 20 70 75 74 73 20 24 66  n text.  puts $f
13d0: 64 20 5b 75 70 6c 65 76 65 6c 20 31 20 5b 6c 69  d [uplevel 1 [li
13e0: 73 74 20 73 75 62 73 74 20 2d 6e 6f 62 61 63 6b  st subst -noback
13f0: 20 2d 6e 6f 63 6f 6d 20 24 74 65 78 74 5d 5d 0a   -nocom $text]].
1400: 7d 0a 0a 23 20 41 20 70 72 6f 63 65 64 75 72 65  }..# A procedure
1410: 20 74 6f 20 77 72 69 74 65 20 74 68 65 20 63 6f   to write the co
1420: 6d 6d 6f 6e 20 68 65 61 64 65 72 20 66 6f 75 6e  mmon header foun
1430: 64 20 6f 6e 20 65 76 65 72 79 20 48 54 4d 4c 20  d on every HTML 
1440: 66 69 6c 65 20 6f 6e 0a 23 20 74 68 65 20 53 51  file on.# the SQ
1450: 4c 69 74 65 20 77 65 62 73 69 74 65 2e 0a 23 0a  Lite website..#.
1460: 70 72 6f 63 20 77 72 69 74 65 5f 68 65 61 64 65  proc write_heade
1470: 72 20 7b 70 61 74 68 20 66 64 20 74 69 74 6c 65  r {path fd title
1480: 7d 20 7b 0a 20 20 70 75 74 73 20 24 66 64 20 7b  } {.  puts $fd {
1490: 3c 21 44 4f 43 54 59 50 45 20 48 54 4d 4c 20 50  <!DOCTYPE HTML P
14a0: 55 42 4c 49 43 20 22 2d 2f 2f 57 33 43 2f 2f 44  UBLIC "-//W3C//D
14b0: 54 44 20 48 54 4d 4c 20 34 2e 30 31 2f 2f 45 4e  TD HTML 4.01//EN
14c0: 22 20 22 68 74 74 70 3a 2f 2f 77 77 77 2e 77 33  " "http://www.w3
14d0: 2e 6f 72 67 2f 54 52 2f 68 74 6d 6c 34 2f 73 74  .org/TR/html4/st
14e0: 72 69 63 74 2e 64 74 64 22 3e 7d 0a 20 20 70 75  rict.dtd">}.  pu
14f0: 74 73 20 24 66 64 20 7b 3c 68 74 6d 6c 3e 3c 68  ts $fd {<html><h
1500: 65 61 64 3e 7d 0a 20 20 70 75 74 73 20 24 66 64  ead>}.  puts $fd
1510: 20 22 3c 74 69 74 6c 65 3e 24 74 69 74 6c 65 3c   "<title>$title<
1520: 2f 74 69 74 6c 65 3e 22 0a 20 20 70 75 74 73 69  /title>".  putsi
1530: 6e 34 20 24 66 64 20 7b 3c 73 74 79 6c 65 20 74  n4 $fd {<style t
1540: 79 70 65 3d 22 74 65 78 74 2f 63 73 73 22 3e 0a  ype="text/css">.
1550: 20 20 20 20 62 6f 64 79 20 7b 0a 20 20 20 20 20      body {.     
1560: 20 20 20 6d 61 72 67 69 6e 3a 20 61 75 74 6f 3b     margin: auto;
1570: 0a 20 20 20 20 20 20 20 20 66 6f 6e 74 2d 66 61  .        font-fa
1580: 6d 69 6c 79 3a 20 56 65 72 64 61 6e 61 2c 20 73  mily: Verdana, s
1590: 61 6e 73 2d 73 65 72 69 66 3b 0a 20 20 20 20 20  ans-serif;.     
15a0: 20 20 20 70 61 64 64 69 6e 67 3a 20 38 70 78 20     padding: 8px 
15b0: 31 25 3b 0a 20 20 20 20 7d 0a 20 20 20 20 0a 20  1%;.    }.    . 
15c0: 20 20 20 61 20 7b 20 63 6f 6c 6f 72 3a 20 23 30     a { color: #0
15d0: 34 34 61 36 34 20 7d 0a 20 20 20 20 61 3a 76 69  44a64 }.    a:vi
15e0: 73 69 74 65 64 20 7b 20 63 6f 6c 6f 72 3a 20 23  sited { color: #
15f0: 37 33 34 35 35 39 20 7d 0a 20 20 20 20 0a 20 20  734559 }.    .  
1600: 20 20 2e 6c 6f 67 6f 20 7b 20 70 6f 73 69 74 69    .logo { positi
1610: 6f 6e 3a 61 62 73 6f 6c 75 74 65 3b 20 6d 61 72  on:absolute; mar
1620: 67 69 6e 3a 33 70 78 3b 20 7d 0a 20 20 20 20 2e  gin:3px; }.    .
1630: 74 61 67 6c 69 6e 65 20 7b 0a 20 20 20 20 20 20  tagline {.      
1640: 66 6c 6f 61 74 3a 72 69 67 68 74 3b 0a 20 20 20  float:right;.   
1650: 20 20 20 74 65 78 74 2d 61 6c 69 67 6e 3a 72 69     text-align:ri
1660: 67 68 74 3b 0a 20 20 20 20 20 20 66 6f 6e 74 2d  ght;.      font-
1670: 73 74 79 6c 65 3a 69 74 61 6c 69 63 3b 0a 20 20  style:italic;.  
1680: 20 20 20 20 77 69 64 74 68 3a 32 34 30 70 78 3b      width:240px;
1690: 0a 20 20 20 20 20 20 6d 61 72 67 69 6e 3a 31 32  .      margin:12
16a0: 70 78 3b 0a 20 20 20 20 20 20 6d 61 72 67 69 6e  px;.      margin
16b0: 2d 74 6f 70 3a 35 38 70 78 3b 0a 20 20 20 20 7d  -top:58px;.    }
16c0: 0a 20 20 20 20 0a 20 20 20 20 2e 6d 65 6e 75 62  .    .    .menub
16d0: 61 72 20 7b 0a 20 20 20 20 20 20 63 6c 65 61 72  ar {.      clear
16e0: 3a 20 62 6f 74 68 3b 0a 20 20 20 20 20 20 62 6f  : both;.      bo
16f0: 72 64 65 72 2d 72 61 64 69 75 73 3a 20 38 70 78  rder-radius: 8px
1700: 3b 0a 20 20 20 20 20 20 62 61 63 6b 67 72 6f 75  ;.      backgrou
1710: 6e 64 3a 20 23 30 34 34 61 36 34 3b 0a 20 20 20  nd: #044a64;.   
1720: 20 20 20 70 61 64 64 69 6e 67 3a 20 30 70 78 3b     padding: 0px;
1730: 0a 20 20 20 20 20 20 6d 61 72 67 69 6e 3a 20 30  .      margin: 0
1740: 70 78 3b 0a 20 20 20 20 20 20 63 65 6c 6c 2d 73  px;.      cell-s
1750: 70 61 63 69 6e 67 3a 20 30 70 78 3b 0a 20 20 20  pacing: 0px;.   
1760: 20 7d 20 20 20 20 0a 20 20 20 20 2e 74 6f 6f 6c   }    .    .tool
1770: 62 61 72 20 7b 0a 20 20 20 20 20 20 74 65 78 74  bar {.      text
1780: 2d 61 6c 69 67 6e 3a 20 63 65 6e 74 65 72 3b 0a  -align: center;.
1790: 20 20 20 20 20 20 6c 69 6e 65 2d 68 65 69 67 68        line-heigh
17a0: 74 3a 20 31 2e 36 65 6d 3b 0a 20 20 20 20 20 20  t: 1.6em;.      
17b0: 6d 61 72 67 69 6e 3a 20 30 3b 0a 20 20 20 20 20  margin: 0;.     
17c0: 20 70 61 64 64 69 6e 67 3a 20 30 70 78 20 38 70   padding: 0px 8p
17d0: 78 3b 0a 20 20 20 20 7d 0a 20 20 20 20 2e 74 6f  x;.    }.    .to
17e0: 6f 6c 62 61 72 20 61 20 7b 20 63 6f 6c 6f 72 3a  olbar a { color:
17f0: 20 77 68 69 74 65 3b 20 74 65 78 74 2d 64 65 63   white; text-dec
1800: 6f 72 61 74 69 6f 6e 3a 20 6e 6f 6e 65 3b 20 70  oration: none; p
1810: 61 64 64 69 6e 67 3a 20 36 70 78 20 31 32 70 78  adding: 6px 12px
1820: 3b 20 7d 0a 20 20 20 20 2e 74 6f 6f 6c 62 61 72  ; }.    .toolbar
1830: 20 61 3a 76 69 73 69 74 65 64 20 7b 20 63 6f 6c   a:visited { col
1840: 6f 72 3a 20 77 68 69 74 65 3b 20 7d 0a 20 20 20  or: white; }.   
1850: 20 2e 74 6f 6f 6c 62 61 72 20 61 3a 68 6f 76 65   .toolbar a:hove
1860: 72 20 7b 20 63 6f 6c 6f 72 3a 20 23 30 34 34 61  r { color: #044a
1870: 36 34 3b 20 62 61 63 6b 67 72 6f 75 6e 64 3a 20  64; background: 
1880: 77 68 69 74 65 3b 20 7d 0a 20 20 20 20 0a 20 20  white; }.    .  
1890: 20 20 2e 63 6f 6e 74 65 6e 74 20 20 20 20 7b 20    .content    { 
18a0: 6d 61 72 67 69 6e 3a 20 35 25 3b 20 7d 0a 20 20  margin: 5%; }.  
18b0: 20 20 2e 63 6f 6e 74 65 6e 74 20 64 74 20 7b 20    .content dt { 
18c0: 66 6f 6e 74 2d 77 65 69 67 68 74 3a 62 6f 6c 64  font-weight:bold
18d0: 3b 20 7d 0a 20 20 20 20 2e 63 6f 6e 74 65 6e 74  ; }.    .content
18e0: 20 64 64 20 7b 20 6d 61 72 67 69 6e 2d 62 6f 74   dd { margin-bot
18f0: 74 6f 6d 3a 20 32 35 70 78 3b 20 6d 61 72 67 69  tom: 25px; margi
1900: 6e 2d 6c 65 66 74 3a 32 30 25 3b 20 7d 0a 20 20  n-left:20%; }.  
1910: 20 20 2e 63 6f 6e 74 65 6e 74 20 75 6c 20 7b 20    .content ul { 
1920: 70 61 64 64 69 6e 67 3a 30 70 78 3b 20 70 61 64  padding:0px; pad
1930: 64 69 6e 67 2d 6c 65 66 74 3a 20 31 35 70 78 3b  ding-left: 15px;
1940: 20 6d 61 72 67 69 6e 3a 30 70 78 3b 20 7d 0a 0a   margin:0px; }..
1950: 20 20 20 20 2f 2a 20 54 65 78 74 20 77 69 74 68      /* Text with
1960: 69 6e 20 63 6f 6c 6f 72 65 64 20 62 6f 78 65 73  in colored boxes
1970: 2e 0a 20 20 20 20 2a 2a 20 20 65 76 65 72 72 20  ..    **  everr 
1980: 69 73 20 72 65 64 2e 20 20 65 76 6f 6b 20 69 73  is red.  evok is
1990: 20 67 72 65 65 6e 2e 20 65 76 6e 69 6c 20 69 73   green. evnil is
19a0: 20 77 68 69 74 65 20 2a 2f 0a 20 20 20 20 2e 65   white */.    .e
19b0: 76 65 72 72 20 7b 0a 20 20 20 20 20 20 66 6f 6e  verr {.      fon
19c0: 74 2d 66 61 6d 69 6c 79 3a 20 6d 6f 6e 6f 73 70  t-family: monosp
19d0: 61 63 65 3b 0a 20 20 20 20 20 20 66 6f 6e 74 2d  ace;.      font-
19e0: 73 74 79 6c 65 3a 20 6e 6f 72 6d 61 6c 3b 0a 20  style: normal;. 
19f0: 20 20 20 20 20 62 61 63 6b 67 72 6f 75 6e 64 3a       background:
1a00: 20 23 66 66 61 30 61 30 3b 0a 20 20 20 20 20 20   #ffa0a0;.      
1a10: 62 6f 72 64 65 72 2d 73 74 79 6c 65 3a 20 73 6f  border-style: so
1a20: 6c 69 64 3b 0a 20 20 20 20 20 20 62 6f 72 64 65  lid;.      borde
1a30: 72 2d 77 69 64 74 68 3a 20 32 70 78 3b 0a 20 20  r-width: 2px;.  
1a40: 20 20 20 20 62 6f 72 64 65 72 2d 63 6f 6c 6f 72      border-color
1a50: 3a 20 23 61 30 30 30 30 30 3b 0a 20 20 20 20 20  : #a00000;.     
1a60: 20 70 61 64 64 69 6e 67 3a 20 30 70 78 20 35 70   padding: 0px 5p
1a70: 78 20 30 70 78 20 35 70 78 3b 0a 20 20 20 20 7d  x 0px 5px;.    }
1a80: 0a 20 20 20 20 2e 65 76 6f 6b 20 7b 0a 20 20 20  .    .evok {.   
1a90: 20 20 20 66 6f 6e 74 2d 66 61 6d 69 6c 79 3a 20     font-family: 
1aa0: 6d 6f 6e 6f 73 70 61 63 65 3b 0a 20 20 20 20 20  monospace;.     
1ab0: 20 66 6f 6e 74 2d 73 74 79 6c 65 3a 20 6e 6f 72   font-style: nor
1ac0: 6d 61 6c 3b 0a 20 20 20 20 20 20 62 61 63 6b 67  mal;.      backg
1ad0: 72 6f 75 6e 64 3a 20 23 61 30 66 66 61 30 3b 0a  round: #a0ffa0;.
1ae0: 20 20 20 20 20 20 62 6f 72 64 65 72 2d 73 74 79        border-sty
1af0: 6c 65 3a 20 73 6f 6c 69 64 3b 0a 20 20 20 20 20  le: solid;.     
1b00: 20 62 6f 72 64 65 72 2d 77 69 64 74 68 3a 20 32   border-width: 2
1b10: 70 78 3b 0a 20 20 20 20 20 20 62 6f 72 64 65 72  px;.      border
1b20: 2d 63 6f 6c 6f 72 3a 20 23 30 30 61 30 30 30 3b  -color: #00a000;
1b30: 0a 20 20 20 20 20 20 70 61 64 64 69 6e 67 3a 20  .      padding: 
1b40: 30 70 78 20 35 70 78 20 30 70 78 20 35 70 78 3b  0px 5px 0px 5px;
1b50: 0a 20 20 20 20 7d 0a 20 20 20 20 2e 65 76 6c 30  .    }.    .evl0
1b60: 20 7b 0a 20 20 20 20 20 20 66 6f 6e 74 2d 66 61   {.      font-fa
1b70: 6d 69 6c 79 3a 20 6d 6f 6e 6f 73 70 61 63 65 3b  mily: monospace;
1b80: 0a 20 20 20 20 20 20 66 6f 6e 74 2d 73 74 79 6c  .      font-styl
1b90: 65 3a 20 6e 6f 72 6d 61 6c 3b 0a 20 20 20 20 20  e: normal;.     
1ba0: 20 62 61 63 6b 67 72 6f 75 6e 64 3a 20 23 66 66   background: #ff
1bb0: 66 66 66 66 3b 0a 20 20 20 20 20 20 62 6f 72 64  ffff;.      bord
1bc0: 65 72 2d 73 74 79 6c 65 3a 20 73 6f 6c 69 64 3b  er-style: solid;
1bd0: 0a 20 20 20 20 20 20 62 6f 72 64 65 72 2d 77 69  .      border-wi
1be0: 64 74 68 3a 20 32 70 78 3b 0a 20 20 20 20 20 20  dth: 2px;.      
1bf0: 62 6f 72 64 65 72 2d 63 6f 6c 6f 72 3a 20 23 30  border-color: #0
1c00: 30 36 30 63 30 3b 0a 20 20 20 20 20 20 70 61 64  060c0;.      pad
1c10: 64 69 6e 67 3a 20 30 70 78 20 35 70 78 20 30 70  ding: 0px 5px 0p
1c20: 78 20 35 70 78 3b 0a 20 20 20 20 7d 0a 20 20 20  x 5px;.    }.   
1c30: 20 2e 65 76 6c 31 20 7b 0a 20 20 20 20 20 20 66   .evl1 {.      f
1c40: 6f 6e 74 2d 66 61 6d 69 6c 79 3a 20 6d 6f 6e 6f  ont-family: mono
1c50: 73 70 61 63 65 3b 0a 20 20 20 20 20 20 66 6f 6e  space;.      fon
1c60: 74 2d 73 74 79 6c 65 3a 20 6e 6f 72 6d 61 6c 3b  t-style: normal;
1c70: 0a 20 20 20 20 20 20 62 61 63 6b 67 72 6f 75 6e  .      backgroun
1c80: 64 3a 20 23 63 30 66 30 66 66 3b 0a 20 20 20 20  d: #c0f0ff;.    
1c90: 20 20 62 6f 72 64 65 72 2d 73 74 79 6c 65 3a 20    border-style: 
1ca0: 73 6f 6c 69 64 3b 0a 20 20 20 20 20 20 62 6f 72  solid;.      bor
1cb0: 64 65 72 2d 77 69 64 74 68 3a 20 32 70 78 3b 0a  der-width: 2px;.
1cc0: 20 20 20 20 20 20 62 6f 72 64 65 72 2d 63 6f 6c        border-col
1cd0: 6f 72 3a 20 23 30 30 36 30 63 30 3b 0a 20 20 20  or: #0060c0;.   
1ce0: 20 20 20 70 61 64 64 69 6e 67 3a 20 30 70 78 20     padding: 0px 
1cf0: 35 70 78 20 30 70 78 20 35 70 78 3b 0a 20 20 20  5px 0px 5px;.   
1d00: 20 7d 0a 20 20 20 20 2e 65 76 6c 32 20 7b 0a 20   }.    .evl2 {. 
1d10: 20 20 20 20 20 66 6f 6e 74 2d 66 61 6d 69 6c 79       font-family
1d20: 3a 20 6d 6f 6e 6f 73 70 61 63 65 3b 0a 20 20 20  : monospace;.   
1d30: 20 20 20 66 6f 6e 74 2d 73 74 79 6c 65 3a 20 6e     font-style: n
1d40: 6f 72 6d 61 6c 3b 0a 20 20 20 20 20 20 62 61 63  ormal;.      bac
1d50: 6b 67 72 6f 75 6e 64 3a 20 23 39 30 63 37 66 65  kground: #90c7fe
1d60: 3b 0a 20 20 20 20 20 20 62 6f 72 64 65 72 2d 73  ;.      border-s
1d70: 74 79 6c 65 3a 20 73 6f 6c 69 64 3b 0a 20 20 20  tyle: solid;.   
1d80: 20 20 20 62 6f 72 64 65 72 2d 77 69 64 74 68 3a     border-width:
1d90: 20 32 70 78 3b 0a 20 20 20 20 20 20 62 6f 72 64   2px;.      bord
1da0: 65 72 2d 63 6f 6c 6f 72 3a 20 23 30 30 36 30 63  er-color: #0060c
1db0: 30 3b 0a 20 20 20 20 20 20 70 61 64 64 69 6e 67  0;.      padding
1dc0: 3a 20 30 70 78 20 35 70 78 20 30 70 78 20 35 70  : 0px 5px 0px 5p
1dd0: 78 3b 0a 20 20 20 20 7d 0a 20 20 20 20 2e 65 76  x;.    }.    .ev
1de0: 6c 33 20 7b 0a 20 20 20 20 20 20 66 6f 6e 74 2d  l3 {.      font-
1df0: 66 61 6d 69 6c 79 3a 20 6d 6f 6e 6f 73 70 61 63  family: monospac
1e00: 65 3b 0a 20 20 20 20 20 20 66 6f 6e 74 2d 73 74  e;.      font-st
1e10: 79 6c 65 3a 20 6e 6f 72 6d 61 6c 3b 0a 20 20 20  yle: normal;.   
1e20: 20 20 20 62 61 63 6b 67 72 6f 75 6e 64 3a 20 23     background: #
1e30: 34 30 61 30 66 66 3b 0a 20 20 20 20 20 20 62 6f  40a0ff;.      bo
1e40: 72 64 65 72 2d 73 74 79 6c 65 3a 20 73 6f 6c 69  rder-style: soli
1e50: 64 3b 0a 20 20 20 20 20 20 62 6f 72 64 65 72 2d  d;.      border-
1e60: 77 69 64 74 68 3a 20 32 70 78 3b 0a 20 20 20 20  width: 2px;.    
1e70: 20 20 62 6f 72 64 65 72 2d 63 6f 6c 6f 72 3a 20    border-color: 
1e80: 23 30 30 36 30 63 30 3b 0a 20 20 20 20 20 20 70  #0060c0;.      p
1e90: 61 64 64 69 6e 67 3a 20 30 70 78 20 35 70 78 20  adding: 0px 5px 
1ea0: 30 70 78 20 35 70 78 3b 0a 20 20 20 20 7d 0a 20  0px 5px;.    }. 
1eb0: 20 20 20 2e 65 76 6e 69 6c 20 7b 0a 20 20 20 20     .evnil {.    
1ec0: 20 20 66 6f 6e 74 2d 66 61 6d 69 6c 79 3a 20 6d    font-family: m
1ed0: 6f 6e 6f 73 70 61 63 65 3b 0a 20 20 20 20 20 20  onospace;.      
1ee0: 66 6f 6e 74 2d 73 74 79 6c 65 3a 20 6e 6f 72 6d  font-style: norm
1ef0: 61 6c 3b 0a 20 20 20 20 20 20 62 6f 72 64 65 72  al;.      border
1f00: 2d 73 74 79 6c 65 3a 20 73 6f 6c 69 64 3b 0a 20  -style: solid;. 
1f10: 20 20 20 20 20 62 6f 72 64 65 72 2d 77 69 64 74       border-widt
1f20: 68 3a 20 31 70 78 3b 0a 20 20 20 20 20 20 70 61  h: 1px;.      pa
1f30: 64 64 69 6e 67 3a 20 30 70 78 20 35 70 78 20 30  dding: 0px 5px 0
1f40: 70 78 20 35 70 78 3b 0a 20 20 20 20 7d 0a 20 20  px 5px;.    }.  
1f50: 20 20 2e 65 76 20 7b 0a 20 20 20 20 20 20 66 6f    .ev {.      fo
1f60: 6e 74 2d 66 61 6d 69 6c 79 3a 20 6d 6f 6e 6f 73  nt-family: monos
1f70: 70 61 63 65 3b 0a 20 20 20 20 20 20 70 61 64 64  pace;.      padd
1f80: 69 6e 67 3a 20 30 70 78 20 35 70 78 20 30 70 78  ing: 0px 5px 0px
1f90: 20 35 70 78 3b 0a 20 20 20 20 7d 0a 20 20 20 20   5px;.    }.    
1fa0: 0a 0a 20 20 20 20 3c 2f 73 74 79 6c 65 3e 0a 20  ..    </style>. 
1fb0: 20 20 20 3c 6d 65 74 61 20 68 74 74 70 2d 65 71     <meta http-eq
1fc0: 75 69 76 3d 22 63 6f 6e 74 65 6e 74 2d 74 79 70  uiv="content-typ
1fd0: 65 22 20 63 6f 6e 74 65 6e 74 3d 22 74 65 78 74  e" content="text
1fe0: 2f 68 74 6d 6c 3b 20 63 68 61 72 73 65 74 3d 55  /html; charset=U
1ff0: 54 46 2d 38 22 3e 0a 20 20 7d 0a 20 20 70 75 74  TF-8">.  }.  put
2000: 73 20 24 66 64 20 7b 3c 2f 68 65 61 64 3e 7d 0a  s $fd {</head>}.
2010: 20 20 69 66 20 7b 5b 66 69 6c 65 20 65 78 69 73    if {[file exis
2020: 74 73 20 44 52 41 46 54 5d 7d 20 7b 0a 20 20 20  ts DRAFT]} {.   
2030: 20 73 65 74 20 74 61 67 6c 69 6e 65 20 7b 3c 66   set tagline {<f
2040: 6f 6e 74 20 73 69 7a 65 3d 22 36 22 20 63 6f 6c  ont size="6" col
2050: 6f 72 3d 22 72 65 64 22 3e 2a 2a 2a 20 44 52 41  or="red">*** DRA
2060: 46 54 20 2a 2a 2a 3c 2f 66 6f 6e 74 3e 7d 0a 20  FT ***</font>}. 
2070: 20 7d 20 65 6c 73 65 20 7b 0a 20 20 20 20 73 65   } else {.    se
2080: 74 20 74 61 67 6c 69 6e 65 20 7b 53 6d 61 6c 6c  t tagline {Small
2090: 2e 20 46 61 73 74 2e 20 52 65 6c 69 61 62 6c 65  . Fast. Reliable
20a0: 2e 3c 62 72 3e 43 68 6f 6f 73 65 20 61 6e 79 20  .<br>Choose any 
20b0: 74 68 72 65 65 2e 7d 0a 20 20 7d 0a 20 20 70 75  three.}.  }.  pu
20c0: 74 73 69 6e 34 20 24 66 64 20 7b 3c 62 6f 64 79  tsin4 $fd {<body
20d0: 3e 0a 20 20 20 20 3c 64 69 76 3e 3c 21 2d 2d 20  >.    <div><!-- 
20e0: 63 6f 6e 74 61 69 6e 65 72 20 64 69 76 20 74 6f  container div to
20f0: 20 73 61 74 69 73 66 79 20 76 61 6c 69 64 61 74   satisfy validat
2100: 6f 72 20 2d 2d 3e 0a 20 20 20 20 0a 20 20 20 20  or -->.    .    
2110: 3c 61 20 68 72 65 66 3d 22 24 7b 70 61 74 68 7d  <a href="${path}
2120: 69 6e 64 65 78 2e 68 74 6d 6c 22 3e 0a 20 20 20  index.html">.   
2130: 20 3c 69 6d 67 20 63 6c 61 73 73 3d 22 6c 6f 67   <img class="log
2140: 6f 22 20 73 72 63 3d 22 24 7b 70 61 74 68 7d 69  o" src="${path}i
2150: 6d 61 67 65 73 2f 73 71 6c 69 74 65 33 37 30 5f  mages/sqlite370_
2160: 62 61 6e 6e 65 72 2e 67 69 66 22 20 61 6c 74 3d  banner.gif" alt=
2170: 22 53 51 4c 69 74 65 20 4c 6f 67 6f 22 0a 20 20  "SQLite Logo".  
2180: 20 20 20 62 6f 72 64 65 72 3d 22 30 22 3e 3c 2f     border="0"></
2190: 61 3e 0a 20 20 20 20 3c 64 69 76 3e 3c 21 2d 2d  a>.    <div><!--
21a0: 20 49 45 20 68 61 63 6b 20 74 6f 20 70 72 65 76   IE hack to prev
21b0: 65 6e 74 20 64 69 73 61 70 70 65 61 72 69 6e 67  ent disappearing
21c0: 20 6c 6f 67 6f 2d 2d 3e 3c 2f 64 69 76 3e 0a 20   logo--></div>. 
21d0: 20 20 20 3c 64 69 76 20 63 6c 61 73 73 3d 22 74     <div class="t
21e0: 61 67 6c 69 6e 65 22 3e 24 7b 74 61 67 6c 69 6e  agline">${taglin
21f0: 65 7d 3c 2f 64 69 76 3e 0a 0a 20 20 20 20 3c 74  e}</div>..    <t
2200: 61 62 6c 65 20 77 69 64 74 68 3d 31 30 30 25 20  able width=100% 
2210: 63 6c 61 73 73 3d 22 6d 65 6e 75 62 61 72 22 3e  class="menubar">
2220: 3c 74 72 3e 3c 74 64 3e 0a 20 20 20 20 20 20 3c  <tr><td>.      <
2230: 64 69 76 20 63 6c 61 73 73 3d 22 74 6f 6f 6c 62  div class="toolb
2240: 61 72 22 3e 0a 20 20 20 20 20 20 20 20 3c 61 20  ar">.        <a 
2250: 68 72 65 66 3d 22 24 7b 70 61 74 68 7d 61 62 6f  href="${path}abo
2260: 75 74 2e 68 74 6d 6c 22 3e 41 62 6f 75 74 3c 2f  ut.html">About</
2270: 61 3e 0a 20 20 20 20 20 20 20 20 3c 61 20 68 72  a>.        <a hr
2280: 65 66 3d 22 24 7b 70 61 74 68 7d 64 6f 63 73 2e  ef="${path}docs.
2290: 68 74 6d 6c 22 3e 44 6f 63 75 6d 65 6e 74 61 74  html">Documentat
22a0: 69 6f 6e 3c 2f 61 3e 0a 20 20 20 20 20 20 20 20  ion</a>.        
22b0: 3c 61 20 68 72 65 66 3d 22 24 7b 70 61 74 68 7d  <a href="${path}
22c0: 64 6f 77 6e 6c 6f 61 64 2e 68 74 6d 6c 22 3e 44  download.html">D
22d0: 6f 77 6e 6c 6f 61 64 3c 2f 61 3e 0a 20 20 20 20  ownload</a>.    
22e0: 20 20 20 20 3c 61 20 68 72 65 66 3d 22 24 7b 70      <a href="${p
22f0: 61 74 68 7d 63 6f 70 79 72 69 67 68 74 2e 68 74  ath}copyright.ht
2300: 6d 6c 22 3e 4c 69 63 65 6e 73 65 3c 2f 61 3e 0a  ml">License</a>.
2310: 20 20 20 20 20 20 20 20 3c 61 20 68 72 65 66 3d          <a href=
2320: 22 24 7b 70 61 74 68 7d 73 75 70 70 6f 72 74 2e  "${path}support.
2330: 68 74 6d 6c 22 3e 53 75 70 70 6f 72 74 3c 2f 61  html">Support</a
2340: 3e 0a 20 20 20 20 20 20 20 20 3c 61 20 68 72 65  >.        <a hre
2350: 66 3d 22 68 74 74 70 3a 2f 2f 77 77 77 2e 68 77  f="http://www.hw
2360: 61 63 69 2e 63 6f 6d 2f 73 77 2f 73 71 6c 69 74  aci.com/sw/sqlit
2370: 65 2f 70 72 6f 73 75 70 70 6f 72 74 2e 68 74 6d  e/prosupport.htm
2380: 6c 22 3e 50 75 72 63 68 61 73 65 3c 2f 61 3e 0a  l">Purchase</a>.
2390: 20 20 20 20 20 20 3c 2f 64 69 76 3e 0a 20 20 20        </div>.   
23a0: 20 3c 2f 74 64 3e 3c 2f 74 72 3e 3c 2f 74 61 62   </td></tr></tab
23b0: 6c 65 3e 0a 20 20 7d 0a 7d 0a 23 20 45 6e 64 20  le>.  }.}.# End 
23c0: 6f 66 20 63 6f 64 65 20 63 6f 70 69 65 64 20 6f  of code copied o
23d0: 75 74 20 6f 66 20 77 72 61 70 2e 74 63 6c 0a 23  ut of wrap.tcl.#
23e0: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
23f0: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
2400: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
2410: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
2420: 23 23 23 23 23 23 23 23 23 23 23 23 23 0a 0a 23  #############..#
2430: 20 47 65 6e 65 72 61 74 65 20 74 68 65 20 72 65   Generate the re
2440: 71 75 69 72 65 6d 65 6e 74 73 20 74 72 61 63 65  quirements trace
2450: 61 62 69 6c 69 74 79 20 6d 61 74 72 69 78 2e 0a  ability matrix..
2460: 23 0a 70 75 74 73 20 22 47 65 6e 65 72 61 74 69  #.puts "Generati
2470: 6e 67 20 72 65 71 75 69 72 65 6d 65 6e 74 73 20  ng requirements 
2480: 6d 61 74 72 69 78 2e 2e 2e 22 0a 66 6c 75 73 68  matrix...".flush
2490: 20 73 74 64 6f 75 74 0a 73 65 74 20 6f 75 74 20   stdout.set out 
24a0: 5b 6f 70 65 6e 20 64 6f 63 2f 6d 61 74 72 69 78  [open doc/matrix
24b0: 2f 6d 61 74 72 69 78 2e 68 74 6d 6c 20 77 5d 0a  /matrix.html w].
24c0: 77 72 69 74 65 5f 68 65 61 64 65 72 20 2e 2e 2f  write_header ../
24d0: 20 24 6f 75 74 20 7b 53 51 4c 69 74 65 20 52 65   $out {SQLite Re
24e0: 71 75 69 72 65 6d 65 6e 74 73 20 4d 61 74 72 69  quirements Matri
24f0: 78 20 49 6e 64 65 78 7d 0a 70 75 74 73 20 24 6f  x Index}.puts $o
2500: 75 74 20 22 3c 68 31 20 61 6c 69 67 6e 3d 63 65  ut "<h1 align=ce
2510: 6e 74 65 72 3e 53 51 4c 69 74 65 20 52 65 71 75  nter>SQLite Requ
2520: 69 72 65 6d 65 6e 74 73 20 4d 61 74 72 69 78 20  irements Matrix 
2530: 49 6e 64 65 78 3c 2f 68 31 3e 22 0a 70 75 74 73  Index</h1>".puts
2540: 20 24 6f 75 74 20 22 3c 74 61 62 6c 65 20 62 6f   $out "<table bo
2550: 72 64 65 72 3d 30 20 61 6c 69 67 6e 3d 63 65 6e  rder=0 align=cen
2560: 74 65 72 3e 22 0a 73 65 74 20 73 72 63 6c 69 73  ter>".set srclis
2570: 74 20 5b 64 62 20 65 76 61 6c 20 7b 53 45 4c 45  t [db eval {SELE
2580: 43 54 20 44 49 53 54 49 4e 43 54 20 73 72 63 66  CT DISTINCT srcf
2590: 69 6c 65 20 46 52 4f 4d 20 72 65 71 75 69 72 65  ile FROM require
25a0: 6d 65 6e 74 20 4f 52 44 45 52 20 42 59 20 31 7d  ment ORDER BY 1}
25b0: 5d 0a 73 65 74 20 72 6f 77 63 6e 74 20 30 0a 73  ].set rowcnt 0.s
25c0: 65 74 20 63 6f 6c 75 6d 6e 5f 74 69 74 6c 65 73  et column_titles
25d0: 20 7b 3c 74 72 3e 3c 74 68 3e 3c 74 68 3e 74 63   {<tr><th><th>tc
25e0: 6c 3c 74 68 3e 73 6c 74 3c 74 68 3e 74 68 33 3c  l<th>slt<th>th3<
25f0: 74 68 3e 73 72 63 3c 74 68 3e 61 6e 79 3c 74 68  th>src<th>any<th
2600: 3e 3c 74 68 3e 3c 2f 74 72 3e 7d 0a 73 65 74 20  ><th></tr>}.set 
2610: 74 6f 74 61 6c 28 74 63 6c 29 20 30 0a 73 65 74  total(tcl) 0.set
2620: 20 74 6f 74 61 6c 28 74 68 33 29 20 30 0a 73 65   total(th3) 0.se
2630: 74 20 74 6f 74 61 6c 28 73 72 63 29 20 30 0a 73  t total(src) 0.s
2640: 65 74 20 74 6f 74 61 6c 28 73 6c 74 29 20 30 0a  et total(slt) 0.
2650: 73 65 74 20 74 6f 74 61 6c 28 61 6e 79 29 20 30  set total(any) 0
2660: 0a 73 65 74 20 74 6f 74 61 6c 28 61 6c 6c 29 20  .set total(all) 
2670: 30 0a 0a 66 6f 72 65 61 63 68 20 73 72 63 66 69  0..foreach srcfi
2680: 6c 65 20 24 73 72 63 6c 69 73 74 20 7b 0a 20 20  le $srclist {.  
2690: 69 66 20 7b 24 72 6f 77 63 6e 74 25 32 30 3d 3d  if {$rowcnt%20==
26a0: 30 7d 20 7b 70 75 74 73 20 24 6f 75 74 20 24 63  0} {puts $out $c
26b0: 6f 6c 75 6d 6e 5f 74 69 74 6c 65 73 7d 0a 20 20  olumn_titles}.  
26c0: 69 6e 63 72 20 72 6f 77 63 6e 74 0a 20 20 64 62  incr rowcnt.  db
26d0: 20 65 76 61 6c 20 7b 0a 20 20 20 20 43 52 45 41   eval {.    CREA
26e0: 54 45 20 54 45 4d 50 20 54 41 42 4c 45 20 49 46  TE TEMP TABLE IF
26f0: 20 4e 4f 54 20 45 58 49 53 54 53 20 73 72 63 72   NOT EXISTS srcr
2700: 65 71 28 72 65 71 6e 6f 20 54 45 58 54 20 50 52  eq(reqno TEXT PR
2710: 49 4d 41 52 59 20 4b 45 59 20 4f 4e 20 43 4f 4e  IMARY KEY ON CON
2720: 46 4c 49 43 54 20 49 47 4e 4f 52 45 29 3b 0a 20  FLICT IGNORE);. 
2730: 20 20 20 44 45 4c 45 54 45 20 46 52 4f 4d 20 73     DELETE FROM s
2740: 72 63 72 65 71 3b 0a 20 20 20 20 49 4e 53 45 52  rcreq;.    INSER
2750: 54 20 49 4e 54 4f 20 73 72 63 72 65 71 20 53 45  T INTO srcreq SE
2760: 4c 45 43 54 20 72 65 71 6e 6f 20 46 52 4f 4d 20  LECT reqno FROM 
2770: 72 65 71 75 69 72 65 6d 65 6e 74 20 57 48 45 52  requirement WHER
2780: 45 20 73 72 63 66 69 6c 65 3d 24 73 72 63 66 69  E srcfile=$srcfi
2790: 6c 65 3b 0a 20 20 7d 0a 20 20 73 65 74 20 74 6f  le;.  }.  set to
27a0: 74 61 6c 63 6e 74 20 5b 64 62 20 6f 6e 65 20 7b  talcnt [db one {
27b0: 53 45 4c 45 43 54 20 63 6f 75 6e 74 28 2a 29 20  SELECT count(*) 
27c0: 46 52 4f 4d 20 73 72 63 72 65 71 7d 5d 0a 20 20  FROM srcreq}].  
27d0: 69 6e 63 72 20 74 6f 74 61 6c 28 61 6c 6c 29 20  incr total(all) 
27e0: 24 74 6f 74 61 6c 63 6e 74 0a 20 20 70 75 74 73  $totalcnt.  puts
27f0: 20 24 6f 75 74 20 22 3c 74 72 3e 3c 74 64 3e 3c   $out "<tr><td><
2800: 61 20 68 72 65 66 3d 5c 22 24 73 72 63 66 69 6c  a href=\"$srcfil
2810: 65 5c 22 3e 24 73 72 63 66 69 6c 65 3c 2f 61 3e  e\">$srcfile</a>
2820: 3c 2f 74 64 3e 22 0a 20 20 73 65 74 20 65 76 28  </td>".  set ev(
2830: 74 63 6c 29 20 30 0a 20 20 73 65 74 20 65 76 28  tcl) 0.  set ev(
2840: 74 68 33 29 20 30 0a 20 20 73 65 74 20 65 76 28  th3) 0.  set ev(
2850: 73 72 63 29 20 30 0a 20 20 73 65 74 20 65 76 28  src) 0.  set ev(
2860: 73 6c 74 29 20 30 0a 20 20 73 65 74 20 65 76 28  slt) 0.  set ev(
2870: 61 6e 79 29 20 30 0a 20 20 64 62 20 65 76 61 6c  any) 0.  db eval
2880: 20 7b 0a 20 20 20 20 53 45 4c 45 43 54 20 63 6f   {.    SELECT co
2890: 75 6e 74 28 64 69 73 74 69 6e 63 74 20 72 65 71  unt(distinct req
28a0: 6e 6f 29 20 41 53 20 63 6e 74 2c 20 73 72 63 63  no) AS cnt, srcc
28b0: 6c 61 73 73 20 0a 20 20 20 20 20 20 46 52 4f 4d  lass .      FROM
28c0: 20 65 76 69 64 65 6e 63 65 0a 20 20 20 20 20 57   evidence.     W
28d0: 48 45 52 45 20 72 65 71 6e 6f 20 49 4e 20 73 72  HERE reqno IN sr
28e0: 63 72 65 71 0a 20 20 20 20 20 47 52 4f 55 50 20  creq.     GROUP 
28f0: 42 59 20 73 72 63 63 6c 61 73 73 0a 20 20 7d 20  BY srcclass.  } 
2900: 7b 0a 20 20 20 20 73 65 74 20 65 76 28 24 73 72  {.    set ev($sr
2910: 63 63 6c 61 73 73 29 20 24 63 6e 74 0a 20 20 20  cclass) $cnt.   
2920: 20 69 6e 63 72 20 74 6f 74 61 6c 28 24 73 72 63   incr total($src
2930: 63 6c 61 73 73 29 20 24 63 6e 74 0a 20 20 7d 0a  class) $cnt.  }.
2940: 20 20 64 62 20 65 76 61 6c 20 7b 0a 20 20 20 20    db eval {.    
2950: 53 45 4c 45 43 54 20 63 6f 75 6e 74 28 64 69 73  SELECT count(dis
2960: 74 69 6e 63 74 20 72 65 71 6e 6f 29 20 41 53 20  tinct reqno) AS 
2970: 63 6e 74 0a 20 20 20 20 20 20 46 52 4f 4d 20 65  cnt.      FROM e
2980: 76 69 64 65 6e 63 65 0a 20 20 20 20 20 57 48 45  vidence.     WHE
2990: 52 45 20 72 65 71 6e 6f 20 49 4e 20 73 72 63 72  RE reqno IN srcr
29a0: 65 71 0a 20 20 7d 20 7b 0a 20 20 20 20 73 65 74  eq.  } {.    set
29b0: 20 65 76 28 61 6e 79 29 20 24 63 6e 74 0a 20 20   ev(any) $cnt.  
29c0: 20 20 69 6e 63 72 20 74 6f 74 61 6c 28 61 6e 79    incr total(any
29d0: 29 20 24 63 6e 74 0a 20 20 7d 0a 20 20 66 6f 72  ) $cnt.  }.  for
29e0: 65 61 63 68 20 73 72 63 63 6c 61 73 73 20 7b 74  each srcclass {t
29f0: 63 6c 20 73 6c 74 20 74 68 33 20 73 72 63 20 61  cl slt th3 src a
2a00: 6e 79 7d 20 7b 0a 20 20 20 20 73 65 74 20 63 6e  ny} {.    set cn
2a10: 74 20 24 65 76 28 24 73 72 63 63 6c 61 73 73 29  t $ev($srcclass)
2a20: 0a 20 20 20 20 69 66 20 7b 24 63 6e 74 3d 3d 24  .    if {$cnt==$
2a30: 74 6f 74 61 6c 63 6e 74 7d 20 7b 0a 20 20 20 20  totalcnt} {.    
2a40: 20 20 73 65 74 20 63 78 20 65 76 6f 6b 0a 20 20    set cx evok.  
2a50: 20 20 7d 20 65 6c 73 65 69 66 20 7b 24 63 6e 74    } elseif {$cnt
2a60: 3e 3d 30 2e 37 35 2a 24 74 6f 74 61 6c 63 6e 74  >=0.75*$totalcnt
2a70: 7d 20 7b 0a 20 20 20 20 20 20 73 65 74 20 63 78  } {.      set cx
2a80: 20 65 76 6c 33 0a 20 20 20 20 7d 20 65 6c 73 65   evl3.    } else
2a90: 69 66 20 7b 24 63 6e 74 3e 3d 30 2e 35 2a 24 74  if {$cnt>=0.5*$t
2aa0: 6f 74 61 6c 63 6e 74 7d 20 7b 0a 20 20 20 20 20  otalcnt} {.     
2ab0: 20 73 65 74 20 63 78 20 65 76 6c 32 0a 20 20 20   set cx evl2.   
2ac0: 20 7d 20 65 6c 73 65 69 66 20 7b 24 63 6e 74 3e   } elseif {$cnt>
2ad0: 3d 30 2e 32 35 2a 24 74 6f 74 61 6c 63 6e 74 7d  =0.25*$totalcnt}
2ae0: 20 7b 0a 20 20 20 20 20 20 73 65 74 20 63 78 20   {.      set cx 
2af0: 65 76 6c 31 0a 20 20 20 20 7d 20 65 6c 73 65 69  evl1.    } elsei
2b00: 66 20 7b 24 63 6e 74 3e 30 7d 20 7b 0a 20 20 20  f {$cnt>0} {.   
2b10: 20 20 20 73 65 74 20 63 78 20 65 76 6c 30 0a 20     set cx evl0. 
2b20: 20 20 20 7d 20 65 6c 73 65 20 7b 0a 20 20 20 20     } else {.    
2b30: 20 20 73 65 74 20 63 78 20 65 76 6e 69 6c 0a 20    set cx evnil. 
2b40: 20 20 20 7d 0a 20 20 20 20 73 65 74 20 61 6d 74     }.    set amt
2b50: 20 5b 66 6f 72 6d 61 74 20 7b 25 33 64 2f 25 2d   [format {%3d/%-
2b60: 33 64 7d 20 24 63 6e 74 20 24 74 6f 74 61 6c 63  3d} $cnt $totalc
2b70: 6e 74 5d 0a 20 20 20 20 73 65 74 20 61 6d 74 20  nt].    set amt 
2b80: 5b 73 74 72 69 6e 67 20 6d 61 70 20 7b 7b 20 7d  [string map {{ }
2b90: 20 7b 26 6e 62 73 70 3b 7d 7d 20 24 61 6d 74 5d   {&nbsp;}} $amt]
2ba0: 0a 20 20 20 20 70 75 74 73 20 24 6f 75 74 20 22  .    puts $out "
2bb0: 3c 74 64 3e 3c 63 69 74 65 20 63 6c 61 73 73 3d  <td><cite class=
2bc0: 24 63 78 3e 24 61 6d 74 3c 2f 63 69 74 65 3e 3c  $cx>$amt</cite><
2bd0: 2f 74 64 3e 22 0a 20 20 7d 0a 20 20 72 65 67 73  /td>".  }.  regs
2be0: 75 62 20 2d 61 6c 6c 20 7b 5b 5e 61 2d 7a 41 2d  ub -all {[^a-zA-
2bf0: 5a 30 2d 39 5d 7d 20 5b 66 69 6c 65 20 74 61 69  Z0-9]} [file tai
2c00: 6c 20 5b 66 69 6c 65 20 72 6f 6f 74 20 24 73 72  l [file root $sr
2c10: 63 66 69 6c 65 5d 5d 20 5f 20 64 6f 63 69 64 0a  cfile]] _ docid.
2c20: 20 20 70 75 74 73 20 24 6f 75 74 20 22 3c 74 64    puts $out "<td
2c30: 3e 3c 61 20 68 72 65 66 3d 5c 22 6d 61 74 72 69  ><a href=\"matri
2c40: 78 5f 73 24 64 6f 63 69 64 2e 68 74 6d 6c 5c 22  x_s$docid.html\"
2c50: 3e 73 75 6d 6d 61 72 79 3c 2f 61 3e 3c 2f 74 64  >summary</a></td
2c60: 3e 22 0a 20 20 70 75 74 73 20 24 6f 75 74 20 22  >".  puts $out "
2c70: 3c 74 64 3e 3c 61 20 68 72 65 66 3d 5c 22 6d 61  <td><a href=\"ma
2c80: 74 72 69 78 5f 64 24 64 6f 63 69 64 2e 68 74 6d  trix_d$docid.htm
2c90: 6c 5c 22 3e 64 65 74 61 69 6c 73 3c 2f 61 3e 3c  l\">details</a><
2ca0: 2f 74 64 3e 3c 2f 74 72 3e 5c 6e 22 0a 7d 0a 69  /td></tr>\n".}.i
2cb0: 66 20 7b 24 72 6f 77 63 6e 74 25 32 30 21 3d 31  f {$rowcnt%20!=1
2cc0: 7d 20 7b 70 75 74 73 20 24 6f 75 74 20 24 63 6f  } {puts $out $co
2cd0: 6c 75 6d 6e 5f 74 69 74 6c 65 73 7d 0a 70 75 74  lumn_titles}.put
2ce0: 73 20 24 6f 75 74 20 22 3c 74 72 3e 3c 74 64 3e  s $out "<tr><td>
2cf0: 4f 76 65 72 61 6c 6c 20 43 6f 76 65 72 61 67 65  Overall Coverage
2d00: 22 0a 73 65 74 20 74 6f 74 61 6c 63 6e 74 20 24  ".set totalcnt $
2d10: 74 6f 74 61 6c 28 61 6c 6c 29 0a 66 6f 72 65 61  total(all).forea
2d20: 63 68 20 73 72 63 63 6c 61 73 73 20 7b 74 63 6c  ch srcclass {tcl
2d30: 20 73 6c 74 20 74 68 33 20 73 72 63 20 61 6e 79   slt th3 src any
2d40: 7d 20 7b 0a 20 20 73 65 74 20 63 6e 74 20 24 74  } {.  set cnt $t
2d50: 6f 74 61 6c 28 24 73 72 63 63 6c 61 73 73 29 0a  otal($srcclass).
2d60: 20 20 69 66 20 7b 24 63 6e 74 3d 3d 24 74 6f 74    if {$cnt==$tot
2d70: 61 6c 63 6e 74 7d 20 7b 0a 20 20 20 20 73 65 74  alcnt} {.    set
2d80: 20 63 78 20 65 76 6f 6b 0a 20 20 7d 20 65 6c 73   cx evok.  } els
2d90: 65 69 66 20 7b 24 63 6e 74 3e 3d 30 2e 37 35 2a  eif {$cnt>=0.75*
2da0: 24 74 6f 74 61 6c 63 6e 74 7d 20 7b 0a 20 20 20  $totalcnt} {.   
2db0: 20 73 65 74 20 63 78 20 65 76 6c 33 0a 20 20 7d   set cx evl3.  }
2dc0: 20 65 6c 73 65 69 66 20 7b 24 63 6e 74 3e 3d 30   elseif {$cnt>=0
2dd0: 2e 35 2a 24 74 6f 74 61 6c 63 6e 74 7d 20 7b 0a  .5*$totalcnt} {.
2de0: 20 20 20 20 73 65 74 20 63 78 20 65 76 6c 32 0a      set cx evl2.
2df0: 20 20 7d 20 65 6c 73 65 69 66 20 7b 24 63 6e 74    } elseif {$cnt
2e00: 3e 3d 30 2e 32 35 2a 24 74 6f 74 61 6c 63 6e 74  >=0.25*$totalcnt
2e10: 7d 20 7b 0a 20 20 20 20 73 65 74 20 63 78 20 65  } {.    set cx e
2e20: 76 6c 31 0a 20 20 7d 20 65 6c 73 65 69 66 20 7b  vl1.  } elseif {
2e30: 24 63 6e 74 3e 30 7d 20 7b 0a 20 20 20 20 73 65  $cnt>0} {.    se
2e40: 74 20 63 78 20 65 76 6c 30 0a 20 20 7d 20 65 6c  t cx evl0.  } el
2e50: 73 65 20 7b 0a 20 20 20 20 73 65 74 20 63 78 20  se {.    set cx 
2e60: 65 76 6e 69 6c 0a 20 20 7d 0a 20 20 73 65 74 20  evnil.  }.  set 
2e70: 61 6d 74 20 5b 66 6f 72 6d 61 74 20 7b 25 35 2e  amt [format {%5.
2e80: 31 66 25 25 20 7d 20 5b 65 78 70 72 20 7b 28 24  1f%% } [expr {($
2e90: 63 6e 74 2a 31 30 30 2e 30 29 2f 24 74 6f 74 61  cnt*100.0)/$tota
2ea0: 6c 63 6e 74 7d 5d 5d 0a 20 20 73 65 74 20 61 6d  lcnt}]].  set am
2eb0: 74 20 5b 73 74 72 69 6e 67 20 6d 61 70 20 7b 7b  t [string map {{
2ec0: 20 7d 20 7b 26 6e 62 73 70 3b 7d 7d 20 24 61 6d   } {&nbsp;}} $am
2ed0: 74 5d 0a 20 20 70 75 74 73 20 24 6f 75 74 20 22  t].  puts $out "
2ee0: 3c 74 64 3e 3c 63 69 74 65 20 63 6c 61 73 73 3d  <td><cite class=
2ef0: 24 63 78 3e 24 61 6d 74 3c 2f 63 69 74 65 3e 3c  $cx>$amt</cite><
2f00: 2f 74 64 3e 22 0a 7d 0a 70 75 74 73 20 24 6f 75  /td>".}.puts $ou
2f10: 74 20 3c 2f 74 61 62 6c 65 3e 0a 63 6c 6f 73 65  t </table>.close
2f20: 20 24 6f 75 74 0a 0a 23 20 53 70 6c 69 74 20 61   $out..# Split a
2f30: 20 6c 6f 6e 67 20 73 74 72 69 6e 67 20 6f 66 20   long string of 
2f40: 74 65 78 74 20 61 74 20 73 70 61 63 65 73 20 73  text at spaces s
2f50: 6f 20 74 68 61 74 20 6e 6f 20 6c 69 6e 65 20 65  o that no line e
2f60: 78 63 65 65 64 73 20 37 30 0a 23 20 63 68 61 72  xceeds 70.# char
2f70: 61 63 74 65 72 73 2e 20 20 53 65 6e 64 20 74 68  acters.  Send th
2f80: 65 20 72 65 73 75 6c 74 20 74 6f 20 24 6f 75 74  e result to $out
2f90: 2e 0a 23 0a 70 72 6f 63 20 77 72 61 70 5f 69 6e  ..#.proc wrap_in
2fa0: 5f 63 6f 6d 6d 65 6e 74 20 7b 6f 75 74 20 70 72  _comment {out pr
2fb0: 65 66 69 78 20 74 78 74 7d 20 7b 0a 20 20 77 68  efix txt} {.  wh
2fc0: 69 6c 65 20 7b 5b 73 74 72 69 6e 67 20 6c 65 6e  ile {[string len
2fd0: 67 74 68 20 24 74 78 74 5d 3e 37 30 7d 20 7b 0a  gth $txt]>70} {.
2fe0: 20 20 20 20 73 65 74 20 62 72 65 61 6b 20 5b 73      set break [s
2ff0: 74 72 69 6e 67 20 6c 61 73 74 20 7b 20 7d 20 24  tring last { } $
3000: 74 78 74 20 37 30 5d 0a 20 20 20 20 69 66 20 7b  txt 70].    if {
3010: 24 62 72 65 61 6b 20 3d 3d 20 30 7d 20 7b 0a 20  $break == 0} {. 
3020: 20 20 20 20 20 73 65 74 20 62 72 65 61 6b 20 5b       set break [
3030: 73 74 72 69 6e 67 20 66 69 72 73 74 20 7b 20 7d  string first { }
3040: 20 24 74 78 74 5d 0a 20 20 20 20 7d 0a 20 20 20   $txt].    }.   
3050: 20 69 66 20 7b 24 62 72 65 61 6b 3e 30 7d 20 7b   if {$break>0} {
3060: 0a 20 20 20 20 20 20 70 75 74 73 20 24 6f 75 74  .      puts $out
3070: 20 22 24 70 72 65 66 69 78 20 5b 73 74 72 69 6e   "$prefix [strin
3080: 67 20 72 61 6e 67 65 20 24 74 78 74 20 30 20 5b  g range $txt 0 [
3090: 65 78 70 72 20 7b 24 62 72 65 61 6b 2d 31 7d 5d  expr {$break-1}]
30a0: 5d 22 0a 20 20 20 20 20 20 73 65 74 20 74 78 74  ]".      set txt
30b0: 20 5b 73 74 72 69 6e 67 20 74 72 69 6d 20 5b 73   [string trim [s
30c0: 74 72 69 6e 67 20 72 61 6e 67 65 20 24 74 78 74  tring range $txt
30d0: 20 24 62 72 65 61 6b 20 65 6e 64 5d 5d 0a 20 20   $break end]].  
30e0: 20 20 7d 20 65 6c 73 65 20 7b 0a 20 20 20 20 20    } else {.     
30f0: 20 70 75 74 73 20 24 6f 75 74 20 22 24 70 72 65   puts $out "$pre
3100: 66 69 78 20 24 74 78 74 22 0a 20 20 20 20 20 20  fix $txt".      
3110: 72 65 74 75 72 6e 0a 20 20 20 20 7d 0a 20 20 7d  return.    }.  }
3120: 0a 20 20 70 75 74 73 20 24 6f 75 74 20 22 24 70  .  puts $out "$p
3130: 72 65 66 69 78 20 24 74 78 74 22 0a 7d 0a 0a 0a  refix $txt".}...
3140: 0a 23 20 44 65 74 61 69 6c 20 6d 61 74 72 69 78  .# Detail matrix
3150: 65 73 20 66 6f 72 20 65 61 63 68 20 64 6f 63 75  es for each docu
3160: 6d 65 6e 74 2e 0a 23 0a 66 6f 72 65 61 63 68 20  ment..#.foreach 
3170: 73 72 63 66 69 6c 65 20 24 73 72 63 6c 69 73 74  srcfile $srclist
3180: 20 7b 0a 20 20 72 65 67 73 75 62 20 2d 61 6c 6c   {.  regsub -all
3190: 20 7b 5b 5e 61 2d 7a 41 2d 5a 30 2d 39 5d 7d 20   {[^a-zA-Z0-9]} 
31a0: 5b 66 69 6c 65 20 74 61 69 6c 20 5b 66 69 6c 65  [file tail [file
31b0: 20 72 6f 6f 74 20 24 73 72 63 66 69 6c 65 5d 5d   root $srcfile]]
31c0: 20 5f 20 64 6f 63 69 64 0a 20 20 73 65 74 20 66   _ docid.  set f
31d0: 6e 20 6d 61 74 72 69 78 5f 64 24 64 6f 63 69 64  n matrix_d$docid
31e0: 2e 68 74 6d 6c 0a 20 20 73 65 74 20 6d 61 74 72  .html.  set matr
31f0: 69 78 6e 61 6d 65 28 24 73 72 63 66 69 6c 65 29  ixname($srcfile)
3200: 20 24 66 6e 0a 20 20 73 65 74 20 6f 75 74 20 5b   $fn.  set out [
3210: 6f 70 65 6e 20 64 6f 63 2f 6d 61 74 72 69 78 2f  open doc/matrix/
3220: 24 66 6e 20 77 5d 0a 20 20 72 65 67 73 75 62 20  $fn w].  regsub 
3230: 7b 5e 64 6f 63 2f 7d 20 24 73 72 63 66 69 6c 65  {^doc/} $srcfile
3240: 20 7b 7d 20 62 61 73 65 6e 61 6d 65 0a 20 20 77   {} basename.  w
3250: 72 69 74 65 5f 68 65 61 64 65 72 20 2e 2e 2f 20  rite_header ../ 
3260: 24 6f 75 74 20 22 53 51 4c 69 74 65 20 52 65 71  $out "SQLite Req
3270: 75 69 72 65 6d 65 6e 74 20 4d 61 74 72 69 78 3a  uirement Matrix:
3280: 20 5b 66 69 6c 65 20 74 61 69 6c 20 24 73 72 63   [file tail $src
3290: 66 69 6c 65 5d 22 0a 20 20 70 75 74 73 20 24 6f  file]".  puts $o
32a0: 75 74 20 22 3c 68 31 20 61 6c 69 67 6e 3d 63 65  ut "<h1 align=ce
32b0: 6e 74 65 72 3e 53 51 4c 69 74 65 20 52 65 71 75  nter>SQLite Requ
32c0: 69 72 65 6d 65 6e 74 20 4d 61 74 72 69 78 20 44  irement Matrix D
32d0: 65 74 61 69 6c 73 3c 62 72 3e 22 0a 20 20 70 75  etails<br>".  pu
32e0: 74 73 20 24 6f 75 74 20 22 5b 66 69 6c 65 20 74  ts $out "[file t
32f0: 61 69 6c 20 24 73 72 63 66 69 6c 65 5d 3c 2f 68  ail $srcfile]</h
3300: 31 3e 22 0a 20 20 70 75 74 73 20 24 6f 75 74 20  1>".  puts $out 
3310: 22 3c 68 32 3e 3c 61 20 68 72 65 66 3d 5c 22 6d  "<h2><a href=\"m
3320: 61 74 72 69 78 2e 68 74 6d 6c 5c 22 3e 49 6e 64  atrix.html\">Ind
3330: 65 78 3c 2f 61 3e 22 0a 20 20 70 75 74 73 20 24  ex</a>".  puts $
3340: 6f 75 74 20 22 3c 61 20 68 72 65 66 3d 5c 22 6d  out "<a href=\"m
3350: 61 74 72 69 78 5f 73 24 64 6f 63 69 64 2e 68 74  atrix_s$docid.ht
3360: 6d 6c 5c 22 3e 53 75 6d 6d 61 72 79 3c 2f 61 3e  ml\">Summary</a>
3370: 22 0a 20 20 70 75 74 73 20 24 6f 75 74 20 22 3c  ".  puts $out "<
3380: 61 20 68 72 65 66 3d 5c 22 24 62 61 73 65 6e 61  a href=\"$basena
3390: 6d 65 5c 22 3e 4d 61 72 6b 75 70 3c 2f 61 3e 22  me\">Markup</a>"
33a0: 0a 20 20 70 75 74 73 20 24 6f 75 74 20 22 3c 61  .  puts $out "<a
33b0: 20 68 72 65 66 3d 5c 22 2e 2e 2f 24 62 61 73 65   href=\"../$base
33c0: 6e 61 6d 65 5c 22 3e 4f 72 69 67 69 6e 61 6c 3c  name\">Original<
33d0: 2f 61 3e 3c 2f 68 32 3e 22 0a 0a 20 20 64 62 20  /a></h2>"..  db 
33e0: 65 76 61 6c 20 7b 0a 20 20 20 20 53 45 4c 45 43  eval {.    SELEC
33f0: 54 20 72 65 71 75 69 72 65 6d 65 6e 74 2e 72 65  T requirement.re
3400: 71 6e 6f 2c 20 72 65 71 69 6d 61 67 65 2c 20 6f  qno, reqimage, o
3410: 72 69 67 74 65 78 74 2c 20 72 65 71 74 65 78 74  rigtext, reqtext
3420: 2c 0a 20 20 20 20 20 20 20 20 20 20 20 43 41 53  ,.           CAS
3430: 45 20 57 48 45 4e 20 72 65 71 75 69 72 65 6d 65  E WHEN requireme
3440: 6e 74 2e 73 72 63 66 69 6c 65 21 3d 24 73 72 63  nt.srcfile!=$src
3450: 66 69 6c 65 20 54 48 45 4e 20 72 65 71 75 69 72  file THEN requir
3460: 65 6d 65 6e 74 2e 73 72 63 66 69 6c 65 20 45 4e  ement.srcfile EN
3470: 44 20 41 53 20 63 61 6e 6f 6e 69 63 61 6c 0a 20  D AS canonical. 
3480: 20 20 20 20 20 46 52 4f 4d 20 72 65 71 75 69 72       FROM requir
3490: 65 6d 65 6e 74 2c 20 72 65 71 73 72 63 0a 20 20  ement, reqsrc.  
34a0: 20 20 20 57 48 45 52 45 20 72 65 71 73 72 63 2e     WHERE reqsrc.
34b0: 73 72 63 66 69 6c 65 3d 24 73 72 63 66 69 6c 65  srcfile=$srcfile
34c0: 0a 20 20 20 20 20 20 20 41 4e 44 20 72 65 71 73  .       AND reqs
34d0: 72 63 2e 72 65 71 6e 6f 3d 72 65 71 75 69 72 65  rc.reqno=require
34e0: 6d 65 6e 74 2e 72 65 71 6e 6f 0a 20 20 20 20 20  ment.reqno.     
34f0: 4f 52 44 45 52 20 42 59 20 72 65 71 73 72 63 2e  ORDER BY reqsrc.
3500: 73 72 63 73 65 71 0a 20 20 7d 20 7b 0a 20 20 20  srcseq.  } {.   
3510: 20 70 75 74 73 20 24 6f 75 74 20 22 3c 68 72 3e   puts $out "<hr>
3520: 3c 61 20 6e 61 6d 65 3d 5c 22 24 72 65 71 6e 6f  <a name=\"$reqno
3530: 5c 22 3e 3c 2f 61 3e 22 0a 20 20 20 20 70 75 74  \"></a>".    put
3540: 73 20 24 6f 75 74 20 22 3c 70 3e 3c 61 20 68 72  s $out "<p><a hr
3550: 65 66 3d 5c 22 24 62 61 73 65 6e 61 6d 65 23 24  ef=\"$basename#$
3560: 72 65 71 6e 6f 5c 22 3e 24 72 65 71 6e 6f 3c 2f  reqno\">$reqno</
3570: 61 3e 22 0a 0a 20 20 20 20 73 65 74 20 65 76 28  a>"..    set ev(
3580: 74 63 6c 29 20 30 0a 20 20 20 20 73 65 74 20 65  tcl) 0.    set e
3590: 76 28 73 6c 74 29 20 30 0a 20 20 20 20 73 65 74  v(slt) 0.    set
35a0: 20 65 76 28 74 68 33 29 20 30 0a 20 20 20 20 73   ev(th3) 0.    s
35b0: 65 74 20 65 76 28 73 72 63 29 20 30 0a 20 20 20  et ev(src) 0.   
35c0: 20 64 62 20 65 76 61 6c 20 7b 0a 20 20 20 20 20   db eval {.     
35d0: 20 53 45 4c 45 43 54 20 63 6f 75 6e 74 28 2a 29   SELECT count(*)
35e0: 20 41 53 20 63 6e 74 2c 20 73 72 63 63 6c 61 73   AS cnt, srcclas
35f0: 73 20 0a 20 20 20 20 20 20 20 20 46 52 4f 4d 20  s .        FROM 
3600: 65 76 69 64 65 6e 63 65 0a 20 20 20 20 20 20 20  evidence.       
3610: 57 48 45 52 45 20 72 65 71 6e 6f 3d 24 72 65 71  WHERE reqno=$req
3620: 6e 6f 0a 20 20 20 20 20 20 20 47 52 4f 55 50 20  no.       GROUP 
3630: 42 59 20 73 72 63 63 6c 61 73 73 0a 20 20 20 20  BY srcclass.    
3640: 7d 20 7b 0a 20 20 20 20 20 20 73 65 74 20 65 76  } {.      set ev
3650: 28 24 73 72 63 63 6c 61 73 73 29 20 24 63 6e 74  ($srcclass) $cnt
3660: 0a 20 20 20 20 7d 0a 20 20 20 20 73 65 74 20 70  .    }.    set p
3670: 72 6f 6f 66 28 24 72 65 71 6e 6f 29 20 30 0a 20  roof($reqno) 0. 
3680: 20 20 20 66 6f 72 65 61 63 68 20 73 72 63 63 6c     foreach srccl
3690: 61 73 73 20 7b 74 63 6c 20 73 6c 74 20 74 68 33  ass {tcl slt th3
36a0: 20 73 72 63 7d 20 7b 0a 20 20 20 20 20 20 73 65   src} {.      se
36b0: 74 20 63 6e 74 20 24 65 76 28 24 73 72 63 63 6c  t cnt $ev($srccl
36c0: 61 73 73 29 0a 20 20 20 20 20 20 69 66 20 7b 24  ass).      if {$
36d0: 63 6e 74 7d 20 7b 0a 20 20 20 20 20 20 20 20 73  cnt} {.        s
36e0: 65 74 20 63 78 20 65 76 6f 6b 0a 20 20 20 20 20  et cx evok.     
36f0: 20 20 20 69 6e 63 72 20 70 72 6f 6f 66 28 24 72     incr proof($r
3700: 65 71 6e 6f 29 0a 20 20 20 20 20 20 7d 20 65 6c  eqno).      } el
3710: 73 65 20 7b 0a 20 20 20 20 20 20 20 20 73 65 74  se {.        set
3720: 20 63 78 20 65 76 6e 69 6c 0a 20 20 20 20 20 20   cx evnil.      
3730: 7d 0a 20 20 20 20 20 20 70 75 74 73 20 24 6f 75  }.      puts $ou
3740: 74 20 22 3c 63 69 74 65 20 63 6c 61 73 73 3d 24  t "<cite class=$
3750: 63 78 3e 24 73 72 63 63 6c 61 73 73 3c 2f 63 69  cx>$srcclass</ci
3760: 74 65 3e 22 0a 20 20 20 20 7d 0a 20 20 20 20 70  te>".    }.    p
3770: 75 74 73 20 24 6f 75 74 20 22 3c 2f 70 3e 22 0a  uts $out "</p>".
3780: 20 20 20 20 69 66 20 7b 24 63 61 6e 6f 6e 69 63      if {$canonic
3790: 61 6c 21 3d 22 22 7d 20 7b 0a 20 20 20 20 20 20  al!=""} {.      
37a0: 70 75 74 73 20 24 6f 75 74 20 22 3c 70 3e 43 61  puts $out "<p>Ca
37b0: 6e 6f 6e 69 63 61 6c 20 75 73 61 67 65 3a 20 3c  nonical usage: <
37c0: 61 20 68 72 65 66 3d 27 24 63 61 6e 6f 6e 69 63  a href='$canonic
37d0: 61 6c 27 3e 24 63 61 6e 6f 6e 69 63 61 6c 3c 2f  al'>$canonical</
37e0: 61 3e 3c 2f 70 3e 22 0a 20 20 20 20 7d 0a 20 20  a></p>".    }.  
37f0: 20 20 73 65 74 20 6f 72 69 67 20 5b 73 74 72 69    set orig [stri
3800: 6e 67 20 6d 61 70 20 2d 6e 6f 63 61 73 65 20 7b  ng map -nocase {
3810: 3c 64 74 3e 20 7b 7d 20 3c 2f 64 74 3e 20 7b 7d  <dt> {} </dt> {}
3820: 20 3c 64 64 3e 20 7b 7d 20 3c 2f 64 64 3e 20 7b   <dd> {} </dd> {
3830: 7d 7d 20 24 6f 72 69 67 74 65 78 74 5d 0a 20 20  }} $origtext].  
3840: 20 20 70 75 74 73 20 24 6f 75 74 20 22 3c 70 3e    puts $out "<p>
3850: 24 6f 72 69 67 3c 2f 70 3e 22 0a 20 20 20 20 73  $orig</p>".    s
3860: 65 74 20 73 65 70 20 3c 70 3e 0a 0a 20 20 20 20  et sep <p>..    
3870: 64 62 20 65 76 61 6c 20 7b 0a 20 20 20 20 20 20  db eval {.      
3880: 53 45 4c 45 43 54 20 73 72 63 63 61 74 20 7c 7c  SELECT srccat ||
3890: 20 27 2f 27 20 7c 7c 20 73 72 63 66 69 6c 65 20   '/' || srcfile 
38a0: 7c 7c 20 27 3a 27 20 7c 7c 20 73 72 63 6c 69 6e  || ':' || srclin
38b0: 65 20 41 53 20 78 2c 20 75 72 6c 0a 20 20 20 20  e AS x, url.    
38c0: 20 20 20 20 46 52 4f 4d 20 65 76 69 64 65 6e 63      FROM evidenc
38d0: 65 0a 20 20 20 20 20 20 20 57 48 45 52 45 20 72  e.       WHERE r
38e0: 65 71 6e 6f 3d 24 72 65 71 6e 6f 0a 20 20 20 20  eqno=$reqno.    
38f0: 20 20 20 4f 52 44 45 52 20 42 59 20 78 3b 0a 20     ORDER BY x;. 
3900: 20 20 20 7d 20 7b 0a 20 20 20 20 20 20 69 66 20     } {.      if 
3910: 7b 24 75 72 6c 21 3d 22 22 7d 20 7b 0a 20 20 20  {$url!=""} {.   
3920: 20 20 20 20 20 70 75 74 73 20 24 6f 75 74 20 22       puts $out "
3930: 24 73 65 70 3c 61 20 68 72 65 66 3d 5c 22 24 75  $sep<a href=\"$u
3940: 72 6c 5c 22 3e 24 78 3c 2f 61 3e 22 0a 20 20 20  rl\">$x</a>".   
3950: 20 20 20 7d 20 65 6c 73 65 20 7b 0a 20 20 20 20     } else {.    
3960: 20 20 20 20 70 75 74 73 20 24 6f 75 74 20 22 24      puts $out "$
3970: 73 65 70 24 78 22 0a 20 20 20 20 20 20 7d 0a 20  sep$x".      }. 
3980: 20 20 20 20 20 73 65 74 20 73 65 70 20 22 26 6e       set sep "&n
3990: 62 73 70 3b 26 6e 62 73 70 3b 22 0a 20 20 20 20  bsp;&nbsp;".    
39a0: 7d 0a 0a 20 20 20 20 23 20 47 65 6e 65 72 61 74  }..    # Generat
39b0: 65 20 74 65 78 74 20 73 75 69 74 61 62 6c 65 20  e text suitable 
39c0: 66 6f 72 20 63 6f 70 79 2d 70 61 73 74 65 20 69  for copy-paste i
39d0: 6e 74 6f 20 73 6f 75 72 63 65 20 64 6f 63 75 6d  nto source docum
39e0: 65 6e 74 73 20 61 73 0a 20 20 20 20 23 20 65 76  ents as.    # ev
39f0: 69 64 65 6e 63 65 20 74 68 61 74 20 74 68 65 20  idence that the 
3a00: 72 65 71 75 69 72 65 6d 65 6e 74 20 69 73 20 73  requirement is s
3a10: 61 74 69 73 66 69 65 64 2e 0a 20 20 20 20 23 0a  atisfied..    #.
3a20: 20 20 20 20 73 65 74 20 61 62 62 72 65 76 20 5b      set abbrev [
3a30: 73 74 72 69 6e 67 20 72 61 6e 67 65 20 24 72 65  string range $re
3a40: 71 6e 6f 20 30 20 31 32 5d 0a 20 20 20 20 70 75  qno 0 12].    pu
3a50: 74 73 20 24 6f 75 74 20 22 3c 70 72 65 3e 2f 2a  ts $out "<pre>/*
3a60: 20 49 4d 50 3a 20 24 61 62 62 72 65 76 20 2a 2f   IMP: $abbrev */
3a70: 3c 2f 70 72 65 3e 22 0a 20 20 20 20 69 66 20 7b  </pre>".    if {
3a80: 5b 72 65 67 65 78 70 20 7b 5e 73 79 6e 74 61 78  [regexp {^syntax
3a90: 20 64 69 61 67 72 61 6d 20 7d 20 24 72 65 71 74   diagram } $reqt
3aa0: 65 78 74 5d 7d 20 7b 0a 20 20 20 20 20 20 70 75  ext]} {.      pu
3ab0: 74 73 20 24 6f 75 74 20 22 3c 70 72 65 3e 23 20  ts $out "<pre># 
3ac0: 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20 24 61 62  EVIDENCE-OF: $ab
3ad0: 62 72 65 76 20 2d 2d 20 24 72 65 71 74 65 78 74  brev -- $reqtext
3ae0: 3c 2f 70 72 65 3e 22 0a 20 20 20 20 7d 20 65 6c  </pre>".    } el
3af0: 73 65 20 7b 0a 20 20 20 20 20 20 70 75 74 73 20  se {.      puts 
3b00: 24 6f 75 74 20 22 3c 70 72 65 3e 22 0a 20 20 20  $out "<pre>".   
3b10: 20 20 20 77 72 61 70 5f 69 6e 5f 63 6f 6d 6d 65     wrap_in_comme
3b20: 6e 74 20 24 6f 75 74 20 23 20 5c 0a 20 20 20 20  nt $out # \.    
3b30: 20 20 20 20 20 22 45 56 49 44 45 4e 43 45 2d 4f       "EVIDENCE-O
3b40: 46 3a 20 24 61 62 62 72 65 76 20 5b 73 74 72 69  F: $abbrev [stri
3b50: 6e 67 20 6d 61 70 20 7b 26 20 26 61 6d 70 3b 20  ng map {& &amp; 
3b60: 3c 20 26 6c 74 3b 20 3e 20 26 67 74 3b 7d 20 24  < &lt; > &gt;} $
3b70: 72 65 71 74 65 78 74 5d 22 0a 20 20 20 20 20 20  reqtext]".      
3b80: 70 75 74 73 20 24 6f 75 74 20 22 3c 2f 70 72 65  puts $out "</pre
3b90: 3e 22 0a 20 20 20 20 7d 0a 0a 20 20 7d 0a 20 20  >".    }..  }.  
3ba0: 63 6c 6f 73 65 20 24 6f 75 74 0a 7d 0a 0a 23 20  close $out.}..# 
3bb0: 53 75 6d 6d 61 72 79 20 6d 61 74 72 69 78 65 73  Summary matrixes
3bc0: 20 66 6f 72 20 65 61 63 68 20 64 6f 63 75 6d 65   for each docume
3bd0: 6e 74 2e 0a 23 0a 66 6f 72 65 61 63 68 20 73 72  nt..#.foreach sr
3be0: 63 66 69 6c 65 20 24 73 72 63 6c 69 73 74 20 7b  cfile $srclist {
3bf0: 0a 20 20 73 65 74 20 68 61 73 5f 72 65 71 28 24  .  set has_req($
3c00: 73 72 63 66 69 6c 65 29 20 31 0a 20 20 72 65 67  srcfile) 1.  reg
3c10: 73 75 62 20 2d 61 6c 6c 20 7b 5b 5e 61 2d 7a 41  sub -all {[^a-zA
3c20: 2d 5a 30 2d 39 5d 7d 20 5b 66 69 6c 65 20 74 61  -Z0-9]} [file ta
3c30: 69 6c 20 5b 66 69 6c 65 20 72 6f 6f 74 20 24 73  il [file root $s
3c40: 72 63 66 69 6c 65 5d 5d 20 5f 20 64 6f 63 69 64  rcfile]] _ docid
3c50: 0a 20 20 73 65 74 20 66 6e 20 6d 61 74 72 69 78  .  set fn matrix
3c60: 5f 73 24 64 6f 63 69 64 2e 68 74 6d 6c 0a 20 20  _s$docid.html.  
3c70: 73 65 74 20 6f 75 74 20 5b 6f 70 65 6e 20 64 6f  set out [open do
3c80: 63 2f 6d 61 74 72 69 78 2f 24 66 6e 20 77 5d 0a  c/matrix/$fn w].
3c90: 20 20 72 65 67 73 75 62 20 7b 5e 64 6f 63 2f 7d    regsub {^doc/}
3ca0: 20 24 73 72 63 66 69 6c 65 20 7b 7d 20 62 61 73   $srcfile {} bas
3cb0: 65 6e 61 6d 65 0a 20 20 77 72 69 74 65 5f 68 65  ename.  write_he
3cc0: 61 64 65 72 20 2e 2e 2f 20 24 6f 75 74 20 22 53  ader ../ $out "S
3cd0: 51 4c 69 74 65 20 52 65 71 75 69 72 65 6d 65 6e  QLite Requiremen
3ce0: 74 20 4d 61 74 72 69 78 3a 20 5b 66 69 6c 65 20  t Matrix: [file 
3cf0: 74 61 69 6c 20 24 73 72 63 66 69 6c 65 5d 22 0a  tail $srcfile]".
3d00: 20 20 70 75 74 73 20 24 6f 75 74 20 22 3c 68 31    puts $out "<h1
3d10: 20 61 6c 69 67 6e 3d 63 65 6e 74 65 72 3e 53 51   align=center>SQ
3d20: 4c 69 74 65 20 52 65 71 75 69 72 65 6d 65 6e 74  Lite Requirement
3d30: 20 4d 61 74 72 69 78 20 53 75 6d 6d 61 72 79 3c   Matrix Summary<
3d40: 62 72 3e 22 0a 20 20 70 75 74 73 20 24 6f 75 74  br>".  puts $out
3d50: 20 22 5b 66 69 6c 65 20 74 61 69 6c 20 24 73 72   "[file tail $sr
3d60: 63 66 69 6c 65 5d 3c 2f 68 31 3e 22 0a 20 20 70  cfile]</h1>".  p
3d70: 75 74 73 20 24 6f 75 74 20 22 3c 68 32 20 61 6c  uts $out "<h2 al
3d80: 69 67 6e 3d 63 65 6e 74 65 72 3e 3c 61 20 68 72  ign=center><a hr
3d90: 65 66 3d 5c 22 6d 61 74 72 69 78 2e 68 74 6d 6c  ef=\"matrix.html
3da0: 5c 22 3e 49 6e 64 65 78 3c 2f 61 3e 22 0a 20 20  \">Index</a>".  
3db0: 70 75 74 73 20 24 6f 75 74 20 22 3c 61 20 68 72  puts $out "<a hr
3dc0: 65 66 3d 5c 22 6d 61 74 72 69 78 5f 64 24 64 6f  ef=\"matrix_d$do
3dd0: 63 69 64 2e 68 74 6d 6c 5c 22 3e 44 65 74 61 69  cid.html\">Detai
3de0: 6c 73 3c 2f 61 3e 3c 2f 68 32 3e 22 0a 20 20 70  ls</a></h2>".  p
3df0: 75 74 73 20 24 6f 75 74 20 7b 3c 74 61 62 6c 65  uts $out {<table
3e00: 20 61 6c 69 67 6e 3d 63 65 6e 74 65 72 3e 7d 0a   align=center>}.
3e10: 0a 20 20 64 62 20 65 76 61 6c 20 7b 0a 20 20 20  .  db eval {.   
3e20: 20 53 45 4c 45 43 54 20 72 65 71 6e 6f 2c 20 72   SELECT reqno, r
3e30: 65 71 69 6d 61 67 65 2c 20 6f 72 69 67 74 65 78  eqimage, origtex
3e40: 74 0a 20 20 20 20 20 20 46 52 4f 4d 20 72 65 71  t.      FROM req
3e50: 75 69 72 65 6d 65 6e 74 0a 20 20 20 20 20 57 48  uirement.     WH
3e60: 45 52 45 20 73 72 63 66 69 6c 65 3d 24 73 72 63  ERE srcfile=$src
3e70: 66 69 6c 65 0a 20 20 20 20 20 4f 52 44 45 52 20  file.     ORDER 
3e80: 42 59 20 73 72 63 73 65 71 0a 20 20 7d 20 7b 0a  BY srcseq.  } {.
3e90: 20 20 20 20 70 75 74 73 20 24 6f 75 74 20 22 3c      puts $out "<
3ea0: 74 72 3e 3c 74 64 3e 3c 61 20 63 6c 61 73 73 3d  tr><td><a class=
3eb0: 65 76 20 68 72 65 66 3d 5c 22 24 62 61 73 65 6e  ev href=\"$basen
3ec0: 61 6d 65 23 24 72 65 71 6e 6f 5c 22 3e 24 72 65  ame#$reqno\">$re
3ed0: 71 6e 6f 3c 2f 61 3e 3c 2f 74 64 3e 22 0a 0a 20  qno</a></td>".. 
3ee0: 20 20 20 73 65 74 20 65 76 28 74 63 6c 29 20 30     set ev(tcl) 0
3ef0: 0a 20 20 20 20 73 65 74 20 65 76 28 73 6c 74 29  .    set ev(slt)
3f00: 20 30 0a 20 20 20 20 73 65 74 20 65 76 28 74 68   0.    set ev(th
3f10: 33 29 20 30 0a 20 20 20 20 73 65 74 20 65 76 28  3) 0.    set ev(
3f20: 73 72 63 29 20 30 0a 20 20 20 20 64 62 20 65 76  src) 0.    db ev
3f30: 61 6c 20 7b 0a 20 20 20 20 20 20 53 45 4c 45 43  al {.      SELEC
3f40: 54 20 63 6f 75 6e 74 28 2a 29 20 41 53 20 63 6e  T count(*) AS cn
3f50: 74 2c 20 73 72 63 63 6c 61 73 73 20 0a 20 20 20  t, srcclass .   
3f60: 20 20 20 20 20 46 52 4f 4d 20 65 76 69 64 65 6e       FROM eviden
3f70: 63 65 0a 20 20 20 20 20 20 20 57 48 45 52 45 20  ce.       WHERE 
3f80: 72 65 71 6e 6f 3d 24 72 65 71 6e 6f 0a 20 20 20  reqno=$reqno.   
3f90: 20 20 20 20 47 52 4f 55 50 20 42 59 20 73 72 63      GROUP BY src
3fa0: 63 6c 61 73 73 0a 20 20 20 20 7d 20 7b 0a 20 20  class.    } {.  
3fb0: 20 20 20 20 73 65 74 20 65 76 28 24 73 72 63 63      set ev($srcc
3fc0: 6c 61 73 73 29 20 24 63 6e 74 0a 20 20 20 20 7d  lass) $cnt.    }
3fd0: 0a 20 20 20 20 73 65 74 20 70 72 6f 6f 66 28 24  .    set proof($
3fe0: 72 65 71 6e 6f 29 20 30 0a 20 20 20 20 66 6f 72  reqno) 0.    for
3ff0: 65 61 63 68 20 73 72 63 63 6c 61 73 73 20 7b 74  each srcclass {t
4000: 63 6c 20 73 6c 74 20 74 68 33 20 73 72 63 7d 20  cl slt th3 src} 
4010: 7b 0a 20 20 20 20 20 20 73 65 74 20 63 6e 74 20  {.      set cnt 
4020: 24 65 76 28 24 73 72 63 63 6c 61 73 73 29 0a 20  $ev($srcclass). 
4030: 20 20 20 20 20 69 66 20 7b 24 63 6e 74 7d 20 7b       if {$cnt} {
4040: 0a 20 20 20 20 20 20 20 20 73 65 74 20 63 78 20  .        set cx 
4050: 65 76 6f 6b 0a 20 20 20 20 20 20 20 20 69 6e 63  evok.        inc
4060: 72 20 70 72 6f 6f 66 28 24 72 65 71 6e 6f 29 0a  r proof($reqno).
4070: 20 20 20 20 20 20 7d 20 65 6c 73 65 20 7b 0a 20        } else {. 
4080: 20 20 20 20 20 20 20 73 65 74 20 63 78 20 65 76         set cx ev
4090: 6e 69 6c 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  nil.      }.    
40a0: 20 20 70 75 74 73 20 24 6f 75 74 20 22 3c 74 64    puts $out "<td
40b0: 3e 3c 63 69 74 65 20 63 6c 61 73 73 3d 24 63 78  ><cite class=$cx
40c0: 3e 24 73 72 63 63 6c 61 73 73 3c 2f 63 69 74 65  >$srcclass</cite
40d0: 3e 3c 2f 74 64 3e 22 0a 20 20 20 20 7d 0a 20 20  ></td>".    }.  
40e0: 20 20 70 75 74 73 20 24 6f 75 74 20 22 3c 2f 74    puts $out "</t
40f0: 64 3e 22 0a 20 20 7d 0a 20 20 70 75 74 73 20 24  d>".  }.  puts $
4100: 6f 75 74 20 7b 3c 2f 74 61 62 6c 65 3e 7d 0a 20  out {</table>}. 
4110: 20 63 6c 6f 73 65 20 24 6f 75 74 0a 7d 0a 0a 23   close $out.}..#
4120: 20 54 72 61 6e 73 6c 61 74 65 20 64 6f 63 75 6d   Translate docum
4130: 65 6e 74 61 74 69 6f 6e 20 74 6f 20 73 68 6f 77  entation to show
4140: 20 72 65 71 75 69 72 65 6d 65 6e 74 73 20 77 69   requirements wi
4150: 74 68 20 6c 69 6e 6b 73 20 74 6f 20 74 68 65 20  th links to the 
4160: 6d 61 74 72 69 78 2e 0a 23 0a 70 75 74 73 20 2d  matrix..#.puts -
4170: 6e 6f 6e 65 77 6c 69 6e 65 20 22 54 72 61 6e 73  nonewline "Trans
4180: 6c 61 74 69 6e 67 20 64 6f 63 75 6d 65 6e 74 61  lating documenta
4190: 74 69 6f 6e 22 0a 66 6c 75 73 68 20 73 74 64 6f  tion".flush stdo
41a0: 75 74 0a 66 6f 72 65 61 63 68 20 66 69 6c 65 20  ut.foreach file 
41b0: 24 66 69 6c 65 6c 69 73 74 20 7b 0a 20 20 70 75  $filelist {.  pu
41c0: 74 73 20 2d 6e 6f 6e 65 77 6c 69 6e 65 20 2e 0a  ts -nonewline ..
41d0: 20 20 23 20 70 75 74 73 20 24 66 69 6c 65 0a 20    # puts $file. 
41e0: 20 66 6c 75 73 68 20 73 74 64 6f 75 74 0a 20 20   flush stdout.  
41f0: 72 65 67 73 75 62 20 7b 5e 64 6f 63 2f 7d 20 24  regsub {^doc/} $
4200: 66 69 6c 65 20 7b 7d 20 62 61 73 65 6e 61 6d 65  file {} basename
4210: 0a 20 20 73 65 74 20 6f 75 74 66 69 6c 65 20 64  .  set outfile d
4220: 6f 63 2f 6d 61 74 72 69 78 2f 24 62 61 73 65 6e  oc/matrix/$basen
4230: 61 6d 65 0a 20 20 69 66 20 7b 21 5b 69 6e 66 6f  ame.  if {![info
4240: 20 65 78 69 73 74 73 20 6d 61 74 72 69 78 6e 61   exists matrixna
4250: 6d 65 28 24 62 61 73 65 6e 61 6d 65 29 5d 7d 20  me($basename)]} 
4260: 7b 0a 20 20 20 20 66 69 6c 65 20 63 6f 70 79 20  {.    file copy 
4270: 2d 66 6f 72 63 65 20 24 66 69 6c 65 20 24 6f 75  -force $file $ou
4280: 74 66 69 6c 65 0a 20 20 20 20 63 6f 6e 74 69 6e  tfile.    contin
4290: 75 65 0a 20 20 7d 0a 20 20 73 65 74 20 69 6e 20  ue.  }.  set in 
42a0: 5b 6f 70 65 6e 20 24 66 69 6c 65 5d 0a 20 20 73  [open $file].  s
42b0: 65 74 20 78 20 5b 72 65 61 64 20 24 69 6e 20 5b  et x [read $in [
42c0: 66 69 6c 65 20 73 69 7a 65 20 24 66 69 6c 65 5d  file size $file]
42d0: 5d 0a 20 20 63 6c 6f 73 65 20 24 69 6e 0a 20 20  ].  close $in.  
42e0: 69 66 20 7b 5b 72 65 67 65 78 70 20 2f 20 24 62  if {[regexp / $b
42f0: 61 73 65 6e 61 6d 65 5d 7d 20 7b 0a 20 20 20 20  asename]} {.    
4300: 73 65 74 20 6d 61 74 72 69 78 70 61 74 68 20 2e  set matrixpath .
4310: 2e 2f 24 6d 61 74 72 69 78 6e 61 6d 65 28 24 62  ./$matrixname($b
4320: 61 73 65 6e 61 6d 65 29 0a 20 20 7d 20 65 6c 73  asename).  } els
4330: 65 20 7b 0a 20 20 20 20 73 65 74 20 6d 61 74 72  e {.    set matr
4340: 69 78 70 61 74 68 20 24 6d 61 74 72 69 78 6e 61  ixpath $matrixna
4350: 6d 65 28 24 62 61 73 65 6e 61 6d 65 29 0a 20 20  me($basename).  
4360: 7d 0a 20 20 73 65 74 20 6f 75 74 20 7b 7d 0a 20  }.  set out {}. 
4370: 20 77 68 69 6c 65 20 7b 5b 73 74 72 69 6e 67 20   while {[string 
4380: 6c 65 6e 67 74 68 20 24 78 5d 3e 30 20 26 26 20  length $x]>0 && 
4390: 5b 73 65 74 20 6e 20 5b 73 74 72 69 6e 67 20 66  [set n [string f
43a0: 69 72 73 74 20 5e 20 24 78 5d 5d 3e 3d 30 7d 20  irst ^ $x]]>=0} 
43b0: 7b 0a 20 20 20 20 69 6e 63 72 20 6e 20 2d 31 0a  {.    incr n -1.
43c0: 20 20 20 20 73 65 74 20 70 72 65 66 69 78 20 5b      set prefix [
43d0: 73 74 72 69 6e 67 20 72 61 6e 67 65 20 24 78 20  string range $x 
43e0: 30 20 24 6e 5d 0a 20 20 20 20 61 70 70 65 6e 64  0 $n].    append
43f0: 20 6f 75 74 20 24 70 72 65 66 69 78 0a 20 20 20   out $prefix.   
4400: 20 73 65 74 20 6e 20 5b 73 74 72 69 6e 67 20 6c   set n [string l
4410: 65 6e 67 74 68 20 24 70 72 65 66 69 78 5d 0a 20  ength $prefix]. 
4420: 20 20 20 73 65 74 20 6e 78 20 5b 73 74 72 69 6e     set nx [strin
4430: 67 20 72 61 6e 67 65 20 24 78 20 5b 65 78 70 72  g range $x [expr
4440: 20 7b 24 6e 2b 31 7d 5d 20 65 6e 64 5d 0a 20 20   {$n+1}] end].  
4450: 20 20 73 65 74 20 63 20 5b 73 74 72 69 6e 67 20    set c [string 
4460: 69 6e 64 65 78 20 24 6e 78 20 30 5d 0a 20 20 20  index $nx 0].   
4470: 20 69 66 20 7b 24 63 3d 3d 22 28 22 7d 20 7b 0a   if {$c=="("} {.
4480: 20 20 20 20 20 20 72 65 67 65 78 70 20 7b 5e 5c        regexp {^\
4490: 28 28 28 5b 5e 3c 5d 7c 3c 2e 2b 3f 3e 29 2a 3f  ((([^<]|<.+?>)*?
44a0: 29 5c 29 5c 5e 7d 20 24 6e 78 20 61 6c 6c 20 72  )\)\^} $nx all r
44b0: 65 71 0a 20 20 20 20 20 20 72 65 67 73 75 62 20  eq.      regsub 
44c0: 7b 5e 5c 28 28 28 5b 5e 3c 5d 7c 3c 2e 2b 3f 3e  {^\((([^<]|<.+?>
44d0: 29 2a 3f 29 5c 29 5c 5e 7d 20 24 6e 78 20 7b 7d  )*?)\)\^} $nx {}
44e0: 20 6e 78 0a 20 20 20 20 7d 20 65 6c 73 65 20 7b   nx.    } else {
44f0: 0a 20 20 20 20 20 20 72 65 67 65 78 70 20 7b 5e  .      regexp {^
4500: 28 5b 5e 3c 5d 7c 3c 2e 2b 3f 3e 29 2a 3f 5c 2e  ([^<]|<.+?>)*?\.
4510: 7d 20 24 6e 78 20 72 65 71 0a 20 20 20 20 20 20  } $nx req.      
4520: 72 65 67 73 75 62 20 7b 5e 28 5b 5e 3c 5d 7c 3c  regsub {^([^<]|<
4530: 2e 2b 3f 3e 29 2a 3f 5c 2e 7d 20 24 6e 78 20 7b  .+?>)*?\.} $nx {
4540: 7d 20 6e 78 0a 20 20 20 20 7d 0a 20 20 20 20 73  } nx.    }.    s
4550: 65 74 20 6f 72 69 67 20 5b 73 74 72 69 6e 67 20  et orig [string 
4560: 74 72 69 6d 20 24 72 65 71 5d 0a 20 20 20 20 72  trim $req].    r
4570: 65 67 73 75 62 20 2d 61 6c 6c 20 7b 3c 2e 2b 3f  egsub -all {<.+?
4580: 3e 7d 20 24 6f 72 69 67 20 7b 7d 20 72 65 71 0a  >} $orig {} req.
4590: 20 20 20 20 72 65 67 73 75 62 20 2d 61 6c 6c 20      regsub -all 
45a0: 7b 5c 73 2b 7d 20 5b 73 74 72 69 6e 67 20 74 72  {\s+} [string tr
45b0: 69 6d 20 24 72 65 71 5d 20 7b 20 7d 20 72 65 71  im $req] { } req
45c0: 0a 20 20 20 20 73 65 74 20 72 65 71 20 5b 73 74  .    set req [st
45d0: 72 69 6e 67 20 6d 61 70 20 7b 26 6c 74 3b 20 3c  ring map {&lt; <
45e0: 20 26 67 74 3b 20 3e 20 26 23 39 31 3b 20 5b 20   &gt; > &#91; [ 
45f0: 26 23 39 33 3b 20 5d 20 26 61 6d 70 3b 20 26 7d  &#93; ] &amp; &}
4600: 20 24 72 65 71 5d 0a 20 20 20 20 73 65 74 20 72   $req].    set r
4610: 65 71 20 5b 73 74 72 69 6e 67 20 74 72 69 6d 20  eq [string trim 
4620: 24 72 65 71 5d 0a 20 20 20 20 73 65 74 20 72 6e  $req].    set rn
4630: 6f 20 52 2d 5b 6d 64 35 2d 31 30 78 38 20 24 72  o R-[md5-10x8 $r
4640: 65 71 5d 0a 20 20 20 20 73 65 74 20 73 68 6f 72  eq].    set shor
4650: 74 72 6e 6f 20 5b 73 74 72 69 6e 67 20 72 61 6e  trno [string ran
4660: 67 65 20 24 72 6e 6f 20 30 20 31 32 5d 0a 20 20  ge $rno 0 12].  
4670: 20 20 61 70 70 65 6e 64 20 6f 75 74 20 22 3c 61    append out "<a
4680: 20 6e 61 6d 65 3d 5c 22 24 72 6e 6f 5c 22 3e 3c   name=\"$rno\"><
4690: 2f 61 3e 3c 66 6f 6e 74 20 63 6f 6c 6f 72 3d 5c  /a><font color=\
46a0: 22 62 6c 75 65 5c 22 3e 3c 62 3e 5c 6e 22 0a 20  "blue\"><b>\n". 
46b0: 20 20 20 73 65 74 20 6c 69 6e 6b 20 22 3c 61 20     set link "<a 
46c0: 68 72 65 66 3d 5c 22 24 6d 61 74 72 69 78 70 61  href=\"$matrixpa
46d0: 74 68 23 24 72 6e 6f 5c 22 20 73 74 79 6c 65 3d  th#$rno\" style=
46e0: 5c 22 63 6f 6c 6f 72 3a 20 23 30 30 30 30 66 66  \"color: #0000ff
46f0: 5c 22 3e 22 0a 20 20 20 20 61 70 70 65 6e 64 20  \">".    append 
4700: 6f 75 74 20 22 24 6c 69 6e 6b 24 73 68 6f 72 74  out "$link$short
4710: 72 6e 6f 3c 2f 61 3e 3a 5c 5b 3c 2f 62 3e 3c 2f  rno</a>:\[</b></
4720: 66 6f 6e 74 3e 22 0a 20 20 20 20 69 66 20 7b 21  font>".    if {!
4730: 5b 69 6e 66 6f 20 65 78 69 73 74 73 20 70 72 6f  [info exists pro
4740: 6f 66 28 24 72 6e 6f 29 5d 7d 20 7b 0a 20 20 20  of($rno)]} {.   
4750: 20 20 20 73 65 74 20 63 6c 72 20 72 65 64 0a 20     set clr red. 
4760: 20 20 20 7d 20 65 6c 73 65 69 66 20 7b 24 70 72     } elseif {$pr
4770: 6f 6f 66 28 24 72 6e 6f 29 3e 3d 32 7d 20 7b 0a  oof($rno)>=2} {.
4780: 20 20 20 20 20 20 73 65 74 20 63 6c 72 20 67 72        set clr gr
4790: 65 65 6e 0a 20 20 20 20 7d 20 65 6c 73 65 69 66  een.    } elseif
47a0: 20 7b 24 70 72 6f 6f 66 28 24 72 6e 6f 29 3d 3d   {$proof($rno)==
47b0: 31 7d 20 7b 0a 20 20 20 20 20 20 73 65 74 20 63  1} {.      set c
47c0: 6c 72 20 6f 72 61 6e 67 65 0a 20 20 20 20 7d 20  lr orange.    } 
47d0: 65 6c 73 65 20 7b 0a 20 20 20 20 20 20 73 65 74  else {.      set
47e0: 20 63 6c 72 20 72 65 64 0a 20 20 20 20 7d 0a 20   clr red.    }. 
47f0: 20 20 20 61 70 70 65 6e 64 20 6f 75 74 20 22 3c     append out "<
4800: 66 6f 6e 74 20 63 6f 6c 6f 72 3d 5c 22 24 63 6c  font color=\"$cl
4810: 72 5c 22 3e 24 6f 72 69 67 3c 2f 66 6f 6e 74 3e  r\">$orig</font>
4820: 5c 6e 22 0a 20 20 20 20 61 70 70 65 6e 64 20 6f  \n".    append o
4830: 75 74 20 22 3c 66 6f 6e 74 20 63 6f 6c 6f 72 3d  ut "<font color=
4840: 5c 22 62 6c 75 65 5c 22 3e 3c 62 3e 5c 5d 3c 2f  \"blue\"><b>\]</
4850: 62 3e 3c 2f 66 6f 6e 74 3e 5c 6e 22 0a 20 20 20  b></font>\n".   
4860: 20 73 65 74 20 78 20 24 6e 78 0a 20 20 7d 0a 20   set x $nx.  }. 
4870: 20 61 70 70 65 6e 64 20 6f 75 74 20 24 78 0a 20   append out $x. 
4880: 20 73 65 74 20 78 20 24 6f 75 74 0a 20 20 73 65   set x $out.  se
4890: 74 20 6f 75 74 20 7b 7d 0a 20 20 77 68 69 6c 65  t out {}.  while
48a0: 20 7b 5b 73 74 72 69 6e 67 20 6c 65 6e 67 74 68   {[string length
48b0: 20 24 78 5d 3e 30 20 0a 20 20 20 20 20 26 26 20   $x]>0 .     && 
48c0: 5b 72 65 67 65 78 70 20 7b 5e 28 2e 2b 3f 29 28  [regexp {^(.+?)(
48d0: 3c 69 6d 67 20 61 6c 74 3d 22 73 79 6e 74 61 78  <img alt="syntax
48e0: 20 64 69 61 67 72 61 6d 20 2e 2a 29 24 7d 20 24   diagram .*)$} $
48f0: 78 20 61 6c 6c 20 70 72 65 66 69 78 20 73 75 66  x all prefix suf
4900: 66 69 78 5d 7d 20 7b 0a 20 20 20 20 61 70 70 65  fix]} {.    appe
4910: 6e 64 20 6f 75 74 20 24 70 72 65 66 69 78 0a 20  nd out $prefix. 
4920: 20 20 20 73 65 74 20 78 20 24 73 75 66 66 69 78     set x $suffix
4930: 0a 20 20 20 20 69 66 20 7b 5b 72 65 67 65 78 70  .    if {[regexp
4940: 20 5c 0a 20 20 20 20 20 20 20 20 20 20 20 7b 3c   \.           {<
4950: 69 6d 67 20 61 6c 74 3d 22 28 73 79 6e 74 61 78  img alt="(syntax
4960: 20 64 69 61 67 72 61 6d 20 5b 2d 61 2d 7a 5d 2b   diagram [-a-z]+
4970: 29 22 20 73 72 63 3d 22 28 5b 2d 2e 2f 61 2d 7a  )" src="([-./a-z
4980: 5d 2b 5c 2e 67 69 66 29 22 7d 20 5c 0a 20 20 20  ]+\.gif)"} \.   
4990: 20 20 20 20 20 20 20 20 24 78 20 61 6c 6c 20 6e          $x all n
49a0: 61 6d 65 20 69 6d 61 67 65 5d 7d 20 7b 0a 20 20  ame image]} {.  
49b0: 20 20 20 20 23 70 75 74 73 20 22 44 49 41 47 52      #puts "DIAGR
49c0: 41 4d 3a 20 24 66 69 6c 65 20 24 6e 61 6d 65 20  AM: $file $name 
49d0: 24 69 6d 61 67 65 22 0a 20 20 20 20 20 20 73 65  $image".      se
49e0: 74 20 72 65 71 20 24 6e 61 6d 65 0a 20 20 20 20  t req $name.    
49f0: 20 20 72 65 67 73 75 62 20 7b 5e 28 5c 2e 5c 2e    regsub {^(\.\.
4a00: 2f 29 2b 7d 20 24 69 6d 61 67 65 20 7b 7d 20 69  /)+} $image {} i
4a10: 6d 67 32 0a 20 20 20 20 20 20 73 65 74 20 72 6e  mg2.      set rn
4a20: 6f 20 52 2d 5b 6d 64 35 66 69 6c 65 2d 31 30 78  o R-[md5file-10x
4a30: 38 20 64 6f 63 2f 24 69 6d 67 32 5d 0a 20 20 20  8 doc/$img2].   
4a40: 20 20 20 73 65 74 20 73 68 6f 72 74 72 6e 6f 20     set shortrno 
4a50: 5b 73 74 72 69 6e 67 20 72 61 6e 67 65 20 24 72  [string range $r
4a60: 6e 6f 20 30 20 31 32 5d 0a 20 20 20 20 20 20 61  no 0 12].      a
4a70: 70 70 65 6e 64 20 6f 75 74 20 22 3c 61 20 6e 61  ppend out "<a na
4a80: 6d 65 3d 5c 22 24 72 6e 6f 5c 22 3e 3c 2f 61 3e  me=\"$rno\"></a>
4a90: 3c 66 6f 6e 74 20 63 6f 6c 6f 72 3d 5c 22 62 6c  <font color=\"bl
4aa0: 75 65 5c 22 3e 3c 62 3e 22 0a 20 20 20 20 20 20  ue\"><b>".      
4ab0: 73 65 74 20 6c 69 6e 6b 20 22 3c 61 20 68 72 65  set link "<a hre
4ac0: 66 3d 5c 22 24 6d 61 74 72 69 78 70 61 74 68 23  f=\"$matrixpath#
4ad0: 24 72 6e 6f 5c 22 20 73 74 79 6c 65 3d 5c 22 63  $rno\" style=\"c
4ae0: 6f 6c 6f 72 3a 20 23 30 30 30 30 66 66 5c 22 3e  olor: #0000ff\">
4af0: 22 0a 20 20 20 20 20 20 61 70 70 65 6e 64 20 6f  ".      append o
4b00: 75 74 20 22 24 6c 69 6e 6b 24 73 68 6f 72 74 72  ut "$link$shortr
4b10: 6e 6f 3c 2f 61 3e 3a 5c 5b 3c 2f 62 3e 3c 2f 66  no</a>:\[</b></f
4b20: 6f 6e 74 3e 5c 6e 22 0a 20 20 20 20 20 20 69 66  ont>\n".      if
4b30: 20 7b 24 70 72 6f 6f 66 28 24 72 6e 6f 29 3e 3d   {$proof($rno)>=
4b40: 32 7d 20 7b 0a 20 20 20 20 20 20 20 20 73 65 74  2} {.        set
4b50: 20 63 6c 72 20 67 72 65 65 6e 0a 20 20 20 20 20   clr green.     
4b60: 20 7d 20 65 6c 73 65 69 66 20 7b 24 70 72 6f 6f   } elseif {$proo
4b70: 66 28 24 72 6e 6f 29 3d 3d 31 7d 20 7b 0a 20 20  f($rno)==1} {.  
4b80: 20 20 20 20 20 20 73 65 74 20 63 6c 72 20 6f 72        set clr or
4b90: 61 6e 67 65 0a 20 20 20 20 20 20 7d 20 65 6c 73  ange.      } els
4ba0: 65 20 7b 0a 20 20 20 20 20 20 20 20 73 65 74 20  e {.        set 
4bb0: 63 6c 72 20 72 65 64 0a 20 20 20 20 20 20 7d 0a  clr red.      }.
4bc0: 20 20 20 20 20 20 61 70 70 65 6e 64 20 6f 75 74        append out
4bd0: 20 22 3c 69 6d 67 20 62 6f 72 64 65 72 3d 33 20   "<img border=3 
4be0: 73 74 79 6c 65 3d 5c 22 62 6f 72 64 65 72 2d 63  style=\"border-c
4bf0: 6f 6c 6f 72 3a 20 24 63 6c 72 5c 22 20 73 72 63  olor: $clr\" src
4c00: 3d 5c 22 24 69 6d 61 67 65 5c 22 3e 22 0a 20 20  =\"$image\">".  
4c10: 20 20 20 20 61 70 70 65 6e 64 20 6f 75 74 20 22      append out "
4c20: 3c 66 6f 6e 74 20 63 6f 6c 6f 72 3d 5c 22 62 6c  <font color=\"bl
4c30: 75 65 5c 22 3e 3c 62 3e 5c 5d 3c 2f 62 3e 3c 2f  ue\"><b>\]</b></
4c40: 66 6f 6e 74 3e 5c 6e 22 0a 20 20 20 20 20 20 72  font>\n".      r
4c50: 65 67 73 75 62 20 7b 2e 2b 3f 3e 7d 20 24 78 20  egsub {.+?>} $x 
4c60: 7b 7d 20 78 0a 20 20 20 20 7d 0a 20 20 7d 0a 20  {} x.    }.  }. 
4c70: 20 61 70 70 65 6e 64 20 6f 75 74 20 24 78 0a 20   append out $x. 
4c80: 20 73 65 74 20 6f 75 74 66 64 20 5b 6f 70 65 6e   set outfd [open
4c90: 20 24 6f 75 74 66 69 6c 65 20 77 5d 0a 20 20 70   $outfile w].  p
4ca0: 75 74 73 20 2d 6e 6f 6e 65 77 6c 69 6e 65 20 24  uts -nonewline $
4cb0: 6f 75 74 66 64 20 24 6f 75 74 0a 20 20 63 6c 6f  outfd $out.  clo
4cc0: 73 65 20 24 6f 75 74 66 64 0a 7d 0a 70 75 74 73  se $outfd.}.puts
4cd0: 20 22 22 0a                                       "".