Documentation Source Text

Hex Artifact Content
Login

Artifact 11bbf831d56651c4a151bcd12eef40e810843ab7:


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 73 63 61 6e 73 20 73 6f 75 72 63 65 20 63 6f   scans source co
0030: 64 65 20 61 6e 64 20 73 63 72 69 70 74 73 20 77  de and scripts w
0040: 72 69 74 74 65 6e 20 69 6e 20 43 2c 20 54 43 4c  ritten in C, TCL
0050: 2c 20 61 6e 64 20 53 51 4c 0a 23 20 6c 6f 6f 6b  , and SQL.# look
0060: 69 6e 67 20 66 6f 72 20 63 6f 6d 6d 65 6e 74 73  ing for comments
0070: 20 74 68 61 74 20 69 6e 64 69 63 61 74 65 20 74   that indicate t
0080: 68 61 74 20 74 68 65 20 73 63 72 69 70 74 20 70  hat the script p
0090: 72 6f 76 69 64 65 73 20 65 76 69 64 65 6e 63 65  rovides evidence
00a0: 20 6f 72 0a 23 20 70 72 6f 6f 66 20 6f 72 20 61   or.# proof or a
00b0: 6e 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e  n implementation
00c0: 20 66 6f 72 20 73 74 61 74 65 6d 65 6e 74 73 20   for statements 
00d0: 69 6e 20 74 68 65 20 64 6f 63 75 6d 65 6e 74 61  in the documenta
00e0: 74 69 6f 6e 2e 20 20 52 65 63 6f 72 64 73 0a 23  tion.  Records.#
00f0: 20 6f 66 20 74 68 69 73 20 65 76 69 64 65 6e 63   of this evidenc
0100: 65 20 61 72 65 20 77 72 69 74 74 65 6e 20 69 6e  e are written in
0110: 74 6f 20 74 68 65 20 64 6f 63 69 6e 66 6f 2e 64  to the docinfo.d
0120: 62 20 53 51 4c 69 74 65 20 64 61 74 61 62 61 73  b SQLite databas
0130: 65 20 66 69 6c 65 0a 23 20 69 6e 74 6f 20 74 68  e file.# into th
0140: 65 20 65 76 69 64 65 6e 63 65 20 74 61 62 6c 65  e evidence table
0150: 2e 0a 23 0a 23 20 54 68 65 20 73 6f 75 72 63 65  ..#.# The source
0160: 20 63 6f 6d 6d 65 6e 74 73 20 63 6f 6d 65 20 69   comments come i
0170: 6e 20 73 65 76 65 72 61 6c 20 66 6f 72 6d 73 2e  n several forms.
0180: 20 20 54 68 65 20 6d 6f 73 74 20 63 6f 6d 6d 6f    The most commo
0190: 6e 20 69 73 20 61 20 63 6f 6d 6d 65 6e 74 0a 23  n is a comment.#
01a0: 20 74 68 61 74 20 62 65 74 77 65 65 6e 73 20 61   that betweens a
01b0: 74 20 74 68 65 20 6c 65 66 74 20 6d 61 72 67 69  t the left margi
01c0: 6e 20 77 69 74 68 20 22 2a 2a 22 20 6f 72 20 22  n with "**" or "
01d0: 2f 2a 22 20 61 6e 64 20 77 69 74 68 20 6f 6e 65  /*" and with one
01e0: 20 6f 66 20 74 68 65 0a 23 20 66 6f 6c 6c 6f 77   of the.# follow
01f0: 69 6e 67 20 6b 65 79 77 6f 72 64 73 3a 0a 23 0a  ing keywords:.#.
0200: 23 20 20 20 20 20 45 56 3a 0a 23 20 20 20 20 20  #     EV:.#     
0210: 45 56 49 44 45 4e 43 45 2d 4f 46 3a 0a 23 20 20  EVIDENCE-OF:.#  
0220: 20 20 20 49 4d 50 3a 0a 23 20 20 20 20 20 49 4d     IMP:.#     IM
0230: 50 4c 45 4d 45 4e 54 41 54 49 4f 4e 3a 0a 23 20  PLEMENTATION:.# 
0240: 20 20 20 20 41 4e 41 4c 59 53 49 53 2d 4f 46 3a      ANALYSIS-OF:
0250: 0a 23 0a 23 20 46 6f 6c 6c 6f 77 69 6e 67 20 74  .#.# Following t
0260: 68 65 20 6b 65 79 77 6f 72 64 20 69 73 20 65 69  he keyword is ei
0270: 74 68 65 72 20 61 20 72 65 71 75 69 72 65 6d 65  ther a requireme
0280: 6e 74 20 6e 75 6d 62 65 72 20 6f 66 20 74 68 65  nt number of the
0290: 20 66 6f 72 6d 3a 0a 23 0a 23 20 20 20 20 20 52   form:.#.#     R
02a0: 2d 30 30 30 30 30 2d 30 30 30 30 30 2d 30 30 30  -00000-00000-000
02b0: 30 30 2d 30 30 30 30 30 2d 30 30 30 30 30 2d 30  00-00000-00000-0
02c0: 30 30 30 30 2d 30 30 30 30 30 2d 30 30 30 30 30  0000-00000-00000
02d0: 0a 23 0a 23 20 4f 72 20 61 20 70 72 65 66 69 78  .#.# Or a prefix
02e0: 20 6f 66 20 73 75 63 68 20 61 20 72 65 71 75 69   of such a requi
02f0: 72 65 6d 65 6e 74 20 28 75 73 75 61 6c 6c 79 20  rement (usually 
0300: 74 68 65 20 66 69 72 73 74 20 74 77 6f 20 35 2d  the first two 5-
0310: 64 69 67 69 74 20 67 72 6f 75 70 73 20 0a 23 20  digit groups .# 
0320: 73 75 66 66 69 63 65 29 20 61 6e 64 2f 6f 72 20  suffice) and/or 
0330: 74 68 65 20 6f 72 69 67 69 6e 61 6c 20 74 65 78  the original tex
0340: 74 20 6f 66 20 74 68 65 20 72 65 71 75 69 72 65  t of the require
0350: 6d 65 6e 74 2e 20 20 4f 72 69 67 69 6e 61 6c 20  ment.  Original 
0360: 74 65 78 74 20 63 61 6e 20 0a 23 20 63 6f 6e 74  text can .# cont
0370: 69 6e 75 65 20 6f 6e 74 6f 20 73 75 62 73 65 71  inue onto subseq
0380: 75 65 6e 74 20 6c 69 6e 65 73 2e 20 20 54 68 65  uent lines.  The
0390: 20 74 65 78 74 20 69 73 20 74 65 72 6d 69 6e 61   text is termina
03a0: 74 65 64 20 62 79 20 61 20 62 6c 61 6e 6b 20 6c  ted by a blank l
03b0: 69 6e 65 0a 23 20 6f 72 20 62 79 20 74 68 65 20  ine.# or by the 
03c0: 65 6e 64 20 6f 66 20 74 68 65 20 63 6f 6d 6d 65  end of the comme
03d0: 6e 74 2e 20 20 49 66 20 62 6f 74 68 20 74 68 65  nt.  If both the
03e0: 20 72 65 71 75 69 72 65 6d 65 6e 74 20 6e 75 6d   requirement num
03f0: 62 65 72 20 61 6e 64 20 74 68 65 0a 23 20 74 65  ber and the.# te
0400: 78 74 20 61 72 65 20 70 72 6f 76 69 64 65 64 2c  xt are provided,
0410: 20 74 68 69 73 20 73 63 72 69 70 74 20 76 65 72   this script ver
0420: 69 66 69 65 73 20 74 68 61 74 20 74 68 65 79 20  ifies that they 
0430: 63 6f 72 72 65 73 70 6f 6e 64 2e 0a 23 0a 23 20  correspond..#.# 
0440: 54 68 65 20 72 65 71 75 69 72 65 6d 65 6e 74 20  The requirement 
0450: 6e 75 6d 62 65 72 20 63 61 6e 20 62 65 20 66 6f  number can be fo
0460: 6c 6c 6f 77 65 64 20 62 79 20 61 20 63 6f 6d 6d  llowed by a comm
0470: 65 6e 74 20 74 68 61 74 20 69 73 20 6e 6f 74 20  ent that is not 
0480: 74 68 65 0a 23 20 6f 72 69 67 69 6e 61 6c 20 72  the.# original r
0490: 65 71 75 69 72 65 6d 65 6e 74 20 74 65 78 74 2e  equirement text.
04a0: 20 20 54 68 69 73 20 69 73 20 64 6f 6e 65 20 77    This is done w
04b0: 68 65 6e 20 74 68 65 20 6f 72 69 67 69 6e 61 6c  hen the original
04c0: 20 72 65 71 75 69 72 65 6d 65 6e 74 0a 23 20 74   requirement.# t
04d0: 65 78 74 20 69 73 20 61 6e 20 69 6d 61 67 65 20  ext is an image 
04e0: 6f 72 20 69 73 20 74 6f 6f 20 6c 6f 6e 67 20 74  or is too long t
04f0: 68 65 20 62 65 20 70 72 61 63 74 69 63 61 6c 20  he be practical 
0500: 69 6e 20 61 20 63 6f 6d 6d 65 6e 74 20 62 75 74  in a comment but
0510: 20 6f 6e 65 0a 23 20 73 74 69 6c 6c 20 77 61 6e   one.# still wan
0520: 74 73 20 73 6f 6d 65 74 68 69 6e 67 20 69 6e 20  ts something in 
0530: 74 68 65 20 63 6f 6d 6d 65 6e 74 20 74 6f 20 67  the comment to g
0540: 69 76 65 20 61 20 63 6c 75 65 20 74 6f 20 74 68  ive a clue to th
0550: 65 20 72 65 61 64 65 72 20 77 68 61 74 0a 23 20  e reader what.# 
0560: 74 68 65 20 72 65 71 75 69 72 65 6d 65 6e 74 20  the requirement 
0570: 69 73 20 61 62 6f 75 74 2e 20 20 46 6f 72 20 65  is about.  For e
0580: 78 61 6d 70 6c 65 3a 0a 23 0a 23 20 20 20 20 23  xample:.#.#    #
0590: 20 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d   EVIDENCE-OF: R-
05a0: 34 31 34 34 38 2d 35 34 34 36 35 20 2d 2d 20 73  41448-54465 -- s
05b0: 79 6e 74 61 78 20 64 69 61 67 72 61 6d 20 69 6e  yntax diagram in
05c0: 73 65 72 74 2d 73 74 6d 74 0a 23 0a 23 20 54 68  sert-stmt.#.# Th
05d0: 65 20 22 2d 2d 22 20 66 6f 6c 6c 6f 77 69 6e 67  e "--" following
05e0: 20 74 68 65 20 72 65 71 75 69 72 65 6d 65 6e 74   the requirement
05f0: 20 6e 75 6d 62 65 72 20 69 73 20 77 68 61 74 20   number is what 
0600: 69 64 65 6e 74 69 66 69 65 73 20 74 68 65 0a 23  identifies the.#
0610: 20 66 6f 6c 6c 6f 77 2d 6f 6e 20 74 65 78 74 20   follow-on text 
0620: 61 73 20 61 20 63 6f 6d 6d 65 6e 74 20 72 61 74  as a comment rat
0630: 68 65 72 20 74 68 61 6e 20 72 65 71 75 69 72 65  her than require
0640: 6d 65 6e 74 20 74 65 78 74 2e 0a 23 0a 23 20 54  ment text..#.# T
0650: 68 65 20 73 65 63 6f 6e 64 20 66 6f 72 6d 20 6f  he second form o
0660: 66 20 74 68 65 20 73 6f 75 72 63 65 20 63 6f 6d  f the source com
0670: 6d 65 6e 74 73 20 61 72 65 20 73 69 6e 67 6c 65  ments are single
0680: 2d 6c 69 6e 65 20 63 6f 6d 6d 65 6e 74 73 20 74  -line comments t
0690: 68 61 74 0a 23 20 66 6f 6c 6c 6f 77 20 74 68 65  hat.# follow the
06a0: 73 65 20 74 65 6d 70 6c 61 74 65 73 3a 0a 23 0a  se templates:.#.
06b0: 23 20 20 20 20 20 2f 2a 20 52 2d 30 30 30 30 30  #     /* R-00000
06c0: 2d 30 30 30 30 30 2e 2e 2e 20 2a 2f 0a 23 20 20  -00000... */.#  
06d0: 20 20 20 2f 2a 20 45 56 3a 20 52 2d 30 30 30 30     /* EV: R-0000
06e0: 30 2d 30 30 30 30 30 2e 2e 2e 20 2a 2f 0a 23 20  0-00000... */.# 
06f0: 20 20 20 20 2f 2a 20 49 4d 50 3a 20 52 2d 30 30      /* IMP: R-00
0700: 30 30 30 2d 30 30 30 30 30 2e 2e 2e 20 2a 2f 0a  000-00000... */.
0710: 23 0a 23 20 54 68 65 20 63 6f 6d 6d 65 6e 74 20  #.# The comment 
0720: 6d 75 73 74 20 63 6f 6e 74 61 69 6e 20 61 20 72  must contain a r
0730: 65 71 75 69 72 65 6d 65 6e 74 20 6e 75 6d 62 65  equirement numbe
0740: 72 20 6f 72 20 72 65 71 75 69 72 65 6d 65 6e 74  r or requirement
0750: 20 6e 75 6d 62 65 72 0a 23 20 70 72 65 66 69 78   number.# prefix
0760: 2e 20 20 54 68 65 20 54 59 50 45 20 6f 66 20 74  .  The TYPE of t
0770: 68 69 73 20 63 6f 6d 6d 65 6e 74 20 69 73 20 22  his comment is "
0780: 61 73 73 65 72 74 22 20 69 66 20 69 74 20 66 6f  assert" if it fo
0790: 6c 6c 6f 77 73 20 61 6e 20 22 61 73 73 65 72 74  llows an "assert
07a0: 28 29 22 0a 23 20 6d 61 63 72 6f 20 6f 72 20 22  ()".# macro or "
07b0: 74 65 73 74 63 61 73 65 22 20 69 66 20 69 74 20  testcase" if it 
07c0: 66 6f 6c 6c 6f 77 73 20 61 20 22 74 65 73 74 63  follows a "testc
07d0: 61 73 65 28 29 22 20 6d 61 63 72 6f 2c 20 6f 72  ase()" macro, or
07e0: 20 22 65 76 69 64 65 6e 63 65 22 20 69 66 0a 23   "evidence" if.#
07f0: 20 74 68 65 20 22 45 56 3a 22 20 74 65 6d 70 6c   the "EV:" templ
0800: 61 74 65 20 69 73 20 75 73 65 64 20 6f 72 20 22  ate is used or "
0810: 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 22 20  implementation" 
0820: 69 66 20 74 68 65 20 22 49 4d 50 3a 22 20 74 65  if the "IMP:" te
0830: 6d 70 6c 61 74 65 20 69 73 0a 23 20 75 73 65 64  mplate is.# used
0840: 2c 20 6f 74 68 65 72 77 69 73 65 20 22 69 6d 70  , otherwise "imp
0850: 6c 65 6d 65 6e 74 61 74 69 6f 6e 22 2e 0a 23 0a  lementation"..#.
0860: 23 0a 23 20 43 4f 4d 4d 41 4e 44 20 4c 49 4e 45  #.# COMMAND LINE
0870: 3a 0a 23 0a 23 20 55 73 65 20 61 73 20 66 6f 6c  :.#.# Use as fol
0880: 6c 6f 77 73 3a 0a 23 0a 23 20 20 20 20 20 74 63  lows:.#.#     tc
0890: 6c 73 68 20 73 63 61 6e 5f 74 65 73 74 5f 63 61  lsh scan_test_ca
08a0: 73 65 73 2e 74 63 6c 20 53 52 43 43 41 54 20 44  ses.tcl SRCCAT D
08b0: 49 52 2f 2a 2e 74 65 73 74 20 20 3e 3e 6f 75 74  IR/*.test  >>out
08c0: 70 75 74 2e 74 78 74 0a 23 0a 23 20 54 68 65 20  put.txt.#.# The 
08d0: 53 52 43 43 41 54 20 61 72 67 75 6d 65 6e 74 20  SRCCAT argument 
08e0: 73 70 65 63 69 66 69 65 73 20 74 68 65 20 73 6f  specifies the so
08f0: 75 72 63 65 20 66 69 6c 65 20 63 61 74 65 67 6f  urce file catego
0900: 72 79 2e 0a 23 0a 23 23 23 23 23 23 23 23 23 23  ry..#.##########
0910: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
0920: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
0930: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
0940: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
0950: 23 23 23 23 0a 23 0a 73 65 74 20 53 52 43 43 41  ####.#.set SRCCA
0960: 54 20 5b 6c 69 6e 64 65 78 20 24 61 72 67 76 20  T [lindex $argv 
0970: 30 5d 0a 69 66 20 7b 24 53 52 43 43 41 54 3d 3d  0].if {$SRCCAT==
0980: 22 2d 72 65 73 65 74 22 7d 20 7b 0a 20 20 73 65  "-reset"} {.  se
0990: 74 20 52 45 53 45 54 20 31 0a 20 20 73 65 74 20  t RESET 1.  set 
09a0: 61 72 67 76 20 5b 6c 72 61 6e 67 65 20 24 61 72  argv [lrange $ar
09b0: 67 76 20 31 20 65 6e 64 5d 0a 20 20 73 65 74 20  gv 1 end].  set 
09c0: 53 52 43 43 41 54 20 5b 6c 69 6e 64 65 78 20 24  SRCCAT [lindex $
09d0: 61 72 67 76 20 30 5d 0a 7d 20 65 6c 73 65 20 7b  argv 0].} else {
09e0: 0a 20 20 73 65 74 20 52 45 53 45 54 20 30 0a 7d  .  set RESET 0.}
09f0: 0a 72 65 67 73 75 62 20 7b 2f 2e 2a 7d 20 24 53  .regsub {/.*} $S
0a00: 52 43 43 41 54 20 7b 7d 20 53 52 43 43 4c 41 53  RCCAT {} SRCCLAS
0a10: 53 0a 73 65 74 20 46 49 4c 45 4c 49 53 54 20 5b  S.set FILELIST [
0a20: 6c 72 61 6e 67 65 20 24 61 72 67 76 20 31 20 65  lrange $argv 1 e
0a30: 6e 64 5d 0a 73 71 6c 69 74 65 33 20 64 62 20 64  nd].sqlite3 db d
0a40: 6f 63 69 6e 66 6f 2e 64 62 0a 0a 70 72 6f 63 20  ocinfo.db..proc 
0a50: 6f 75 74 70 75 74 5f 6f 6e 65 5f 72 65 63 6f 72  output_one_recor
0a60: 64 20 7b 7d 20 7b 0a 20 20 67 6c 6f 62 61 6c 20  d {} {.  global 
0a70: 66 69 6c 65 6e 61 6d 65 20 6c 69 6e 65 6e 75 6d  filename linenum
0a80: 62 65 72 20 74 79 70 65 20 72 65 71 75 69 72 65  ber type require
0a90: 6d 65 6e 74 20 53 52 43 43 41 54 20 53 52 43 43  ment SRCCAT SRCC
0aa0: 4c 41 53 53 0a 20 20 72 65 67 73 75 62 20 2d 61  LASS.  regsub -a
0ab0: 6c 6c 20 7b 5c 73 2b 7d 20 5b 73 74 72 69 6e 67  ll {\s+} [string
0ac0: 20 74 72 69 6d 20 24 72 65 71 75 69 72 65 6d 65   trim $requireme
0ad0: 6e 74 5d 20 7b 20 7d 20 72 65 71 75 69 72 65 6d  nt] { } requirem
0ae0: 65 6e 74 0a 20 20 72 65 67 73 75 62 20 2d 61 6c  ent.  regsub -al
0af0: 6c 20 7b 5c 73 3f 5c 2a 2f 24 7d 20 24 72 65 71  l {\s?\*/$} $req
0b00: 75 69 72 65 6d 65 6e 74 20 7b 7d 20 72 65 71 75  uirement {} requ
0b10: 69 72 65 6d 65 6e 74 0a 20 20 69 66 20 7b 21 5b  irement.  if {![
0b20: 72 65 67 65 78 70 20 7b 28 52 2d 5b 2d 5c 64 5d  regexp {(R-[-\d]
0b30: 2b 29 5c 73 2a 28 2e 2a 29 7d 20 24 72 65 71 75  +)\s*(.*)} $requ
0b40: 69 72 65 6d 65 6e 74 20 61 6c 6c 20 72 65 71 6e  irement all reqn
0b50: 6f 20 72 65 71 74 65 78 74 5d 7d 20 7b 0a 20 20  o reqtext]} {.  
0b60: 20 20 72 65 74 75 72 6e 0a 20 20 7d 0a 20 20 69    return.  }.  i
0b70: 66 20 7b 5b 73 74 72 69 6e 67 20 72 61 6e 67 65  f {[string range
0b80: 20 24 72 65 71 74 65 78 74 20 30 20 32 5d 3d 3d   $reqtext 0 2]==
0b90: 22 2d 2d 20 22 7d 20 7b 73 65 74 20 72 65 71 74  "-- "} {set reqt
0ba0: 65 78 74 20 7b 7d 7d 0a 20 20 69 66 20 7b 24 72  ext {}}.  if {$r
0bb0: 65 71 74 65 78 74 21 3d 22 22 7d 20 7b 0a 20 20  eqtext!=""} {.  
0bc0: 20 20 73 65 74 20 6e 72 65 71 6e 6f 20 52 2d 5b    set nreqno R-[
0bd0: 6d 64 35 2d 31 30 78 38 20 24 72 65 71 74 65 78  md5-10x8 $reqtex
0be0: 74 5d 0a 20 20 20 20 69 66 20 7b 5b 73 74 72 69  t].    if {[stri
0bf0: 6e 67 20 6d 61 74 63 68 20 24 72 65 71 6e 6f 2a  ng match $reqno*
0c00: 20 24 6e 72 65 71 6e 6f 5d 7d 20 7b 0a 20 20 20   $nreqno]} {.   
0c10: 20 20 20 73 65 74 20 72 65 71 6e 6f 20 24 6e 72     set reqno $nr
0c20: 65 71 6e 6f 0a 20 20 20 20 7d 20 65 6c 73 65 20  eqno.    } else 
0c30: 7b 0a 20 20 20 20 20 20 70 75 74 73 20 73 74 64  {.      puts std
0c40: 65 72 72 20 22 24 66 69 6c 65 6e 61 6d 65 3a 24  err "$filename:$
0c50: 6c 69 6e 65 6e 75 6d 62 65 72 3a 20 72 65 71 75  linenumber: requ
0c60: 69 72 65 6d 65 6e 74 20 6e 75 6d 62 65 72 20 6d  irement number m
0c70: 69 73 6d 61 74 63 68 3b 5c 0a 20 20 20 20 20 20  ismatch;\.      
0c80: 20 20 20 20 20 20 20 20 20 20 20 20 20 24 72 65               $re
0c90: 71 6e 6f 20 73 68 6f 75 6c 64 20 62 65 20 24 6e  qno should be $n
0ca0: 72 65 71 6e 6f 22 0a 20 20 20 20 7d 0a 20 20 7d  reqno".    }.  }
0cb0: 20 65 6c 73 65 69 66 20 7b 5b 73 74 72 69 6e 67   elseif {[string
0cc0: 20 6c 65 6e 67 74 68 20 24 72 65 71 6e 6f 5d 3c   length $reqno]<
0cd0: 34 39 7d 20 7b 0a 20 20 20 20 64 62 20 65 76 61  49} {.    db eva
0ce0: 6c 20 7b 0a 20 20 20 20 20 20 53 45 4c 45 43 54  l {.      SELECT
0cf0: 20 72 65 71 6e 6f 20 41 53 20 6e 72 65 71 6e 6f   reqno AS nreqno
0d00: 20 46 52 4f 4d 20 72 65 71 75 69 72 65 6d 65 6e   FROM requiremen
0d10: 74 0a 20 20 20 20 20 20 20 57 48 45 52 45 20 72  t.       WHERE r
0d20: 65 71 6e 6f 3e 3d 24 72 65 71 6e 6f 0a 20 20 20  eqno>=$reqno.   
0d30: 20 20 20 20 20 20 41 4e 44 20 72 65 71 6e 6f 20        AND reqno 
0d40: 47 4c 4f 42 20 24 72 65 71 6e 6f 20 7c 7c 20 27  GLOB $reqno || '
0d50: 2a 27 0a 20 20 20 20 7d 20 7b 0a 20 20 20 20 20  *'.    } {.     
0d60: 20 73 65 74 20 72 65 71 6e 6f 20 24 6e 72 65 71   set reqno $nreq
0d70: 6e 6f 0a 20 20 20 20 20 20 62 72 65 61 6b 0a 20  no.      break. 
0d80: 20 20 20 7d 0a 20 20 7d 0a 20 20 73 65 74 20 66     }.  }.  set f
0d90: 6e 20 5b 66 69 6c 65 20 74 61 69 6c 20 24 66 69  n [file tail $fi
0da0: 6c 65 6e 61 6d 65 5d 0a 20 20 64 62 20 65 76 61  lename].  db eva
0db0: 6c 20 7b 0a 20 20 20 20 52 45 50 4c 41 43 45 20  l {.    REPLACE 
0dc0: 49 4e 54 4f 20 65 76 69 64 65 6e 63 65 0a 20 20  INTO evidence.  
0dd0: 20 20 20 20 20 20 20 20 28 72 65 71 6e 6f 2c 20          (reqno, 
0de0: 20 72 65 71 74 65 78 74 2c 20 20 65 76 74 79 70   reqtext,  evtyp
0df0: 65 2c 20 73 72 63 63 6c 61 73 73 2c 20 20 73 72  e, srcclass,  sr
0e00: 63 63 61 74 2c 20 20 73 72 63 66 69 6c 65 2c 20  ccat,  srcfile, 
0e10: 73 72 63 6c 69 6e 65 29 0a 20 20 20 20 56 41 4c  srcline).    VAL
0e20: 55 45 53 28 24 72 65 71 6e 6f 2c 20 24 72 65 71  UES($reqno, $req
0e30: 74 65 78 74 2c 20 24 74 79 70 65 2c 20 20 24 53  text, $type,  $S
0e40: 52 43 43 4c 41 53 53 2c 20 24 53 52 43 43 41 54  RCCLASS, $SRCCAT
0e50: 2c 20 24 66 6e 2c 20 20 20 20 20 24 6c 69 6e 65  , $fn,     $line
0e60: 6e 75 6d 62 65 72 29 3b 0a 20 20 7d 0a 20 20 73  number);.  }.  s
0e70: 65 74 20 6c 69 6e 65 6e 75 6d 62 65 72 20 30 0a  et linenumber 0.
0e80: 7d 0a 0a 23 20 52 65 67 75 6c 61 72 20 65 78 70  }..# Regular exp
0e90: 72 65 73 73 69 6f 6e 20 75 73 65 64 20 74 6f 20  ression used to 
0ea0: 6c 6f 63 61 74 65 20 74 68 65 20 62 65 67 69 6e  locate the begin
0eb0: 6e 69 6e 67 20 6f 66 20 61 6e 20 65 76 69 64 65  ning of an evide
0ec0: 6e 63 65 20 6d 61 72 6b 2e 0a 23 0a 73 65 74 20  nce mark..#.set 
0ed0: 72 65 20 7b 5e 5c 73 2a 28 2f 5c 2a 7c 5c 2a 5c  re {^\s*(/\*|\*\
0ee0: 2a 7c 23 29 20 28 45 56 7c 45 56 49 44 45 4e 43  *|#) (EV|EVIDENC
0ef0: 45 2d 4f 46 7c 49 4d 50 7c 49 4d 50 4c 45 4d 45  E-OF|IMP|IMPLEME
0f00: 4e 54 41 54 49 4f 4e 2d 4f 46 7c 41 4e 41 4c 59  NTATION-OF|ANALY
0f10: 53 49 53 2d 4f 46 29 3a 20 7d 0a 0a 64 62 20 74  SIS-OF): }..db t
0f20: 72 61 6e 73 61 63 74 69 6f 6e 20 7b 0a 20 20 69  ransaction {.  i
0f30: 66 20 7b 24 52 45 53 45 54 7d 20 7b 0a 20 20 20  f {$RESET} {.   
0f40: 20 64 62 20 65 76 61 6c 20 7b 44 45 4c 45 54 45   db eval {DELETE
0f50: 20 46 52 4f 4d 20 65 76 69 64 65 6e 63 65 7d 0a   FROM evidence}.
0f60: 20 20 7d 0a 20 20 66 6f 72 65 61 63 68 20 73 6f    }.  foreach so
0f70: 75 72 63 65 66 69 6c 65 20 24 46 49 4c 45 4c 49  urcefile $FILELI
0f80: 53 54 20 7b 0a 20 20 20 20 73 65 74 20 66 69 6c  ST {.    set fil
0f90: 65 6e 61 6d 65 20 24 73 6f 75 72 63 65 66 69 6c  ename $sourcefil
0fa0: 65 0a 20 20 20 20 73 65 74 20 69 6e 20 5b 6f 70  e.    set in [op
0fb0: 65 6e 20 24 73 6f 75 72 63 65 66 69 6c 65 5d 0a  en $sourcefile].
0fc0: 20 20 20 20 73 65 74 20 6c 69 6e 65 6e 6f 20 30      set lineno 0
0fd0: 0a 20 20 20 20 73 65 74 20 6c 69 6e 65 6e 75 6d  .    set linenum
0fe0: 62 65 72 20 30 0a 20 20 20 20 77 68 69 6c 65 20  ber 0.    while 
0ff0: 7b 21 5b 65 6f 66 20 24 69 6e 5d 7d 20 7b 0a 20  {![eof $in]} {. 
1000: 20 20 20 20 20 69 6e 63 72 20 6c 69 6e 65 6e 6f       incr lineno
1010: 0a 20 20 20 20 20 20 73 65 74 20 6c 69 6e 65 20  .      set line 
1020: 5b 67 65 74 73 20 24 69 6e 5d 0a 20 20 20 20 20  [gets $in].     
1030: 20 69 66 20 7b 5b 72 65 67 65 78 70 20 24 72 65   if {[regexp $re
1040: 20 24 6c 69 6e 65 20 61 6c 6c 20 6d 61 72 6b 20   $line all mark 
1050: 74 70 5d 7d 20 7b 0a 20 20 20 20 20 20 20 20 69  tp]} {.        i
1060: 66 20 7b 24 6c 69 6e 65 6e 75 6d 62 65 72 3e 30  f {$linenumber>0
1070: 7d 20 6f 75 74 70 75 74 5f 6f 6e 65 5f 72 65 63  } output_one_rec
1080: 6f 72 64 0a 20 20 20 20 20 20 20 20 73 65 74 20  ord.        set 
1090: 6c 69 6e 65 6e 75 6d 62 65 72 20 24 6c 69 6e 65  linenumber $line
10a0: 6e 6f 0a 20 20 20 20 20 20 20 20 69 66 20 7b 5b  no.        if {[
10b0: 73 74 72 69 6e 67 20 69 6e 64 65 78 20 24 74 70  string index $tp
10c0: 20 30 5d 3d 3d 22 45 22 7d 20 7b 0a 20 20 20 20   0]=="E"} {.    
10d0: 20 20 20 20 20 20 73 65 74 20 74 79 70 65 20 65        set type e
10e0: 76 69 64 65 6e 63 65 0a 20 20 20 20 20 20 20 20  vidence.        
10f0: 7d 20 65 6c 73 65 20 7b 0a 20 20 20 20 20 20 20  } else {.       
1100: 20 20 20 73 65 74 20 74 79 70 65 20 69 6d 70 6c     set type impl
1110: 65 6d 65 6e 74 61 74 69 6f 6e 0a 20 20 20 20 20  ementation.     
1120: 20 20 20 7d 0a 20 20 20 20 20 20 20 20 72 65 67     }.        reg
1130: 65 78 70 20 7b 5b 5e 3a 5d 2b 3a 5c 73 2b 28 2e  exp {[^:]+:\s+(.
1140: 2a 29 24 7d 20 24 6c 69 6e 65 20 61 6c 6c 20 72  *)$} $line all r
1150: 65 71 75 69 72 65 6d 65 6e 74 0a 20 20 20 20 20  equirement.     
1160: 20 20 20 73 65 74 20 72 65 71 75 69 72 65 6d 65     set requireme
1170: 6e 74 20 5b 73 74 72 69 6e 67 20 74 72 69 6d 20  nt [string trim 
1180: 24 72 65 71 75 69 72 65 6d 65 6e 74 5d 0a 20 20  $requirement].  
1190: 20 20 20 20 20 20 63 6f 6e 74 69 6e 75 65 0a 20        continue. 
11a0: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 20       }.      if 
11b0: 7b 24 6c 69 6e 65 6e 75 6d 62 65 72 3e 30 7d 20  {$linenumber>0} 
11c0: 7b 0a 20 20 20 20 20 20 20 20 69 66 20 7b 5b 72  {.        if {[r
11d0: 65 67 65 78 70 20 7b 5e 5c 73 2a 28 5c 2a 5c 2a  egexp {^\s*(\*\*
11e0: 7c 23 29 5c 73 2b 28 5b 5e 5c 73 5d 2e 2a 29 24  |#)\s+([^\s].*)$
11f0: 7d 20 24 6c 69 6e 65 20 61 6c 6c 20 63 6f 6d 6d  } $line all comm
1200: 61 72 6b 20 74 61 69 6c 5d 7d 20 7b 0a 20 20 20  ark tail]} {.   
1210: 20 20 20 20 20 20 20 61 70 70 65 6e 64 20 72 65         append re
1220: 71 75 69 72 65 6d 65 6e 74 20 22 20 5b 73 74 72  quirement " [str
1230: 69 6e 67 20 74 72 69 6d 20 24 74 61 69 6c 5d 22  ing trim $tail]"
1240: 0a 20 20 20 20 20 20 20 20 20 20 63 6f 6e 74 69  .          conti
1250: 6e 75 65 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  nue.        }.  
1260: 20 20 20 20 20 20 6f 75 74 70 75 74 5f 6f 6e 65        output_one
1270: 5f 72 65 63 6f 72 64 0a 20 20 20 20 20 20 7d 0a  _record.      }.
1280: 20 20 20 20 20 20 69 66 20 7b 5b 72 65 67 65 78        if {[regex
1290: 70 20 7b 2f 5c 2a 20 28 45 56 3a 20 7c 49 4d 50  p {/\* (EV: |IMP
12a0: 3a 20 7c 29 28 52 2d 5c 64 5b 2d 5c 64 5d 2b 5c  : |)(R-\d[-\d]+\
12b0: 64 29 20 5c 2a 2f 7d 20 24 6c 69 6e 65 20 61 6c  d) \*/} $line al
12c0: 6c 20 74 70 20 72 6e 6f 5d 7d 20 7b 0a 20 20 20  l tp rno]} {.   
12d0: 20 20 20 20 20 73 65 74 20 6c 69 6e 65 6e 75 6d       set linenum
12e0: 62 65 72 20 24 6c 69 6e 65 6e 6f 0a 20 20 20 20  ber $lineno.    
12f0: 20 20 20 20 69 66 20 7b 24 74 70 3d 3d 22 45 56      if {$tp=="EV
1300: 3a 20 22 7d 20 7b 0a 20 20 20 20 20 20 20 20 20  : "} {.         
1310: 20 73 65 74 20 74 79 70 65 20 65 76 69 64 65 6e   set type eviden
1320: 63 65 0a 20 20 20 20 20 20 20 20 7d 20 65 6c 73  ce.        } els
1330: 65 69 66 20 7b 24 74 70 3d 3d 22 49 4d 50 3a 22  eif {$tp=="IMP:"
1340: 7d 20 7b 0a 20 20 20 20 20 20 20 20 20 20 73 65  } {.          se
1350: 74 20 74 79 70 65 20 69 6d 70 6c 65 6d 65 6e 74  t type implement
1360: 61 74 69 6f 6e 0a 20 20 20 20 20 20 20 20 7d 20  ation.        } 
1370: 65 6c 73 65 69 66 20 7b 5b 72 65 67 65 78 70 20  elseif {[regexp 
1380: 7b 61 73 73 65 72 74 5c 28 7d 20 24 6c 69 6e 65  {assert\(} $line
1390: 5d 7d 20 7b 0a 20 20 20 20 20 20 20 20 20 20 73  ]} {.          s
13a0: 65 74 20 74 79 70 65 20 61 73 73 65 72 74 0a 20  et type assert. 
13b0: 20 20 20 20 20 20 20 7d 20 65 6c 73 65 69 66 20         } elseif 
13c0: 7b 5b 72 65 67 65 78 70 20 7b 74 65 73 74 63 61  {[regexp {testca
13d0: 73 65 5c 28 7d 20 24 6c 69 6e 65 5d 7d 20 7b 0a  se\(} $line]} {.
13e0: 20 20 20 20 20 20 20 20 20 20 73 65 74 20 74 79            set ty
13f0: 70 65 20 74 65 73 74 63 61 73 65 0a 20 20 20 20  pe testcase.    
1400: 20 20 20 20 7d 20 65 6c 73 65 20 7b 0a 20 20 20      } else {.   
1410: 20 20 20 20 20 20 20 73 65 74 20 74 79 70 65 20         set type 
1420: 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 0a 20  implementation. 
1430: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
1440: 20 73 65 74 20 72 65 71 75 69 72 65 6d 65 6e 74   set requirement
1450: 20 24 72 6e 6f 0a 20 20 20 20 20 20 20 20 6f 75   $rno.        ou
1460: 74 70 75 74 5f 6f 6e 65 5f 72 65 63 6f 72 64 0a  tput_one_record.
1470: 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
1480: 20 20 63 6c 6f 73 65 20 24 69 6e 0a 20 20 7d 0a    close $in.  }.
1490: 7d 0a                                            }.