Hex Artifact Content
Not logged in

Artifact f2a4e1c86429ae8ba35187a8876af1d20ed1d78a:

File tools/cvs2fossil/lib/rcsparser.tcl part of check-in [860f533e98] - Bringing back in the old parser for rcs archives. by aku on 2007-10-06 18:28:33. Also file tools/lib/rcsparser.tcl part of check-in [f6f5c902e6] - Bugfix for 3852590ce6. Make the use of cache files in the rcs parser actually dependent on the user option. by aku on 2007-09-26 07:06:45.

0000: 23 20 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  # --------------
0010: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
0020: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
0030: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
0040: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a  ---------------.
0050: 23 20 54 6f 6f 6c 20 70 61 63 6b 61 67 65 73 2e  # Tool packages.
0060: 20 50 61 72 73 69 6e 67 20 52 43 53 20 66 69 6c   Parsing RCS fil
0070: 65 73 2e 0a 23 0a 23 20 53 6f 6d 65 20 6f 66 20  es..#.# Some of 
0080: 74 68 65 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20  the information 
0090: 69 6e 20 52 43 53 20 66 69 6c 65 73 20 69 73 20  in RCS files is 
00a0: 73 6b 69 70 70 65 64 20 6f 76 65 72 2c 20 6d 6f  skipped over, mo
00b0: 73 74 0a 23 20 69 6d 70 6f 72 74 61 6e 74 6c 79  st.# importantly
00c0: 20 74 68 65 20 61 63 74 75 61 6c 20 64 65 6c 74   the actual delt
00d0: 61 20 74 65 78 74 73 2e 20 54 68 65 20 75 73 65  a texts. The use
00e0: 72 73 20 6f 66 20 74 68 69 73 20 70 61 72 73 65  rs of this parse
00f0: 72 20 6e 65 65 64 0a 23 20 6f 6e 6c 79 20 74 68  r need.# only th
0100: 65 20 6d 65 74 61 2d 64 61 74 61 20 61 62 6f 75  e meta-data abou
0110: 74 20 77 68 65 6e 20 72 65 76 69 73 69 6f 6e 73  t when revisions
0120: 20 77 65 72 65 20 61 64 64 65 64 2c 20 74 68 65   were added, the
0130: 20 74 72 65 65 0a 23 20 28 62 72 61 6e 63 68 69   tree.# (branchi
0140: 6e 67 29 20 73 74 72 75 63 74 75 72 65 2c 20 63  ng) structure, c
0150: 6f 6d 6d 69 74 20 6d 65 73 73 61 67 65 73 2e 0a  ommit messages..
0160: 23 0a 23 20 54 68 65 20 70 61 72 73 65 72 20 69  #.# The parser i
0170: 73 20 62 61 73 65 64 20 6f 6e 20 52 65 63 75 72  s based on Recur
0180: 73 69 76 65 20 44 65 73 63 65 6e 74 2e 0a 0a 23  sive Descent...#
0190: 20 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d   ---------------
01a0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
01b0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
01c0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
01d0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 23  --------------.#
01e0: 20 52 65 71 75 69 72 65 6d 65 6e 74 73 0a 0a 70   Requirements..p
01f0: 61 63 6b 61 67 65 20 72 65 71 75 69 72 65 20 54  ackage require T
0200: 63 6c 20 38 2e 34 0a 70 61 63 6b 61 67 65 20 72  cl 8.4.package r
0210: 65 71 75 69 72 65 20 66 69 6c 65 75 74 69 6c 20  equire fileutil 
0220: 20 20 20 20 20 20 3b 20 23 20 54 63 6c 6c 69 62        ; # Tcllib
0230: 20 28 63 61 74 29 0a 70 61 63 6b 61 67 65 20 72   (cat).package r
0240: 65 71 75 69 72 65 20 76 63 3a 3a 74 6f 6f 6c 73  equire vc::tools
0250: 3a 3a 6c 6f 67 20 3b 20 23 20 55 73 65 72 20 66  ::log ; # User f
0260: 65 65 64 62 61 63 6b 0a 0a 6e 61 6d 65 73 70 61  eedback..namespa
0270: 63 65 20 65 76 61 6c 20 3a 3a 76 63 3a 3a 72 63  ce eval ::vc::rc
0280: 73 3a 3a 70 61 72 73 65 72 20 7b 0a 20 20 20 20  s::parser {.    
0290: 76 63 3a 3a 74 6f 6f 6c 73 3a 3a 6c 6f 67 3a 3a  vc::tools::log::
02a0: 73 79 73 74 65 6d 20 72 63 73 0a 20 20 20 20 6e  system rcs.    n
02b0: 61 6d 65 73 70 61 63 65 20 69 6d 70 6f 72 74 20  amespace import 
02c0: 3a 3a 76 63 3a 3a 74 6f 6f 6c 73 3a 3a 6c 6f 67  ::vc::tools::log
02d0: 3a 3a 2a 0a 7d 0a 0a 23 20 2d 2d 2d 2d 2d 2d 2d  ::*.}..# -------
02e0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
02f0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
0300: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
0310: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
0320: 2d 2d 2d 2d 2d 2d 0a 23 20 41 50 49 0a 0a 23 20  ------.# API..# 
0330: 76 63 3a 3a 72 63 73 3a 3a 70 61 72 73 65 72 3a  vc::rcs::parser:
0340: 3a 70 72 6f 63 65 73 73 20 66 69 6c 65 0a 23 0a  :process file.#.
0350: 23 20 50 61 72 73 65 73 20 74 68 65 20 72 63 73  # Parses the rcs
0360: 20 66 69 6c 65 20 61 6e 64 20 72 65 74 75 72 6e   file and return
0370: 73 20 61 20 64 69 63 74 69 6f 6e 61 72 79 20 63  s a dictionary c
0380: 6f 6e 74 61 69 6e 69 6e 67 20 74 68 65 20 6d 65  ontaining the me
0390: 74 61 0a 23 20 64 61 74 61 2e 20 54 68 65 20 66  ta.# data. The f
03a0: 6f 6c 6c 6f 77 69 6e 67 20 6b 65 79 73 20 61 72  ollowing keys ar
03b0: 65 20 75 73 65 64 0a 23 0a 23 20 4b 65 79 09 09  e used.#.# Key..
03c0: 4d 65 61 6e 69 6e 67 0a 23 20 2d 2d 2d 09 09 2d  Meaning.# ---..-
03d0: 2d 2d 2d 2d 2d 2d 0a 23 20 27 68 65 61 64 27 09  ------.# 'head'.
03e0: 68 65 61 64 20 72 65 76 69 73 69 6f 6e 0a 23 20  head revision.# 
03f0: 27 62 72 61 6e 63 68 27 09 3f 0a 23 20 27 73 79  'branch'.?.# 'sy
0400: 6d 62 6f 6c 27 09 64 69 63 74 20 28 73 79 6d 62  mbol'.dict (symb
0410: 6f 6c 20 2d 3e 20 72 65 76 69 73 69 6f 6e 29 0a  ol -> revision).
0420: 23 20 27 6c 6f 63 6b 27 09 64 69 63 74 20 28 73  # 'lock'.dict (s
0430: 79 6d 62 6f 6c 20 2d 3e 20 72 65 76 69 73 69 6f  ymbol -> revisio
0440: 6e 29 0a 23 20 27 63 6f 6d 6d 65 6e 74 27 09 66  n).# 'comment'.f
0450: 69 6c 65 20 63 6f 6d 6d 65 6e 74 0a 23 20 27 65  ile comment.# 'e
0460: 78 70 61 6e 64 27 09 3f 0a 23 20 27 64 61 74 65  xpand'.?.# 'date
0470: 27 09 64 69 63 74 20 28 72 65 76 69 73 69 6f 6e  '.dict (revision
0480: 20 2d 3e 20 64 61 74 65 29 0a 23 20 27 61 75 74   -> date).# 'aut
0490: 68 6f 72 27 09 64 69 63 74 20 28 72 65 76 69 73  hor'.dict (revis
04a0: 69 6f 6e 20 2d 3e 20 61 75 74 68 6f 72 29 0a 23  ion -> author).#
04b0: 20 27 73 74 61 74 65 27 09 64 69 63 74 20 28 72   'state'.dict (r
04c0: 65 76 69 73 69 6f 6e 20 2d 3e 20 73 74 61 74 65  evision -> state
04d0: 29 0a 23 20 27 70 61 72 65 6e 74 27 09 64 69 63  ).# 'parent'.dic
04e0: 74 20 28 72 65 76 69 73 69 6f 6e 20 2d 3e 20 70  t (revision -> p
04f0: 61 72 65 6e 74 20 72 65 76 69 73 69 6f 6e 29 0a  arent revision).
0500: 23 20 27 63 6f 6d 6d 69 74 27 09 64 69 63 74 20  # 'commit'.dict 
0510: 28 72 65 76 69 73 69 6f 6e 20 2d 3e 20 63 6f 6d  (revision -> com
0520: 6d 69 74 20 6d 65 73 73 61 67 65 29 0a 23 0a 23  mit message).#.#
0530: 20 54 68 65 20 73 74 61 74 65 20 27 64 65 61 64   The state 'dead
0540: 27 20 68 61 73 20 73 70 65 63 69 61 6c 20 6d 65  ' has special me
0550: 61 6e 69 6e 67 2c 20 74 68 65 20 75 73 65 72 20  aning, the user 
0560: 73 68 6f 75 6c 64 20 6b 6e 6f 77 20 74 68 61 74  should know that
0570: 2e 0a 0a 23 20 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ...# -----------
0580: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
0590: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
05a0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
05b0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
05c0: 2d 2d 0a 23 20 41 50 49 20 49 6d 70 6c 65 6d 65  --.# API Impleme
05d0: 6e 74 61 74 69 6f 6e 0a 0a 70 72 6f 63 20 3a 3a  ntation..proc ::
05e0: 76 63 3a 3a 72 63 73 3a 3a 70 61 72 73 65 72 3a  vc::rcs::parser:
05f0: 3a 63 6f 6e 66 69 67 75 72 65 20 7b 6b 65 79 20  :configure {key 
0600: 76 61 6c 75 65 7d 20 7b 0a 20 20 20 20 76 61 72  value} {.    var
0610: 69 61 62 6c 65 20 63 61 63 68 65 0a 20 20 20 20  iable cache.    
0620: 73 77 69 74 63 68 20 2d 65 78 61 63 74 20 2d 2d  switch -exact --
0630: 20 24 6b 65 79 20 7b 0a 09 2d 63 61 63 68 65 20   $key {..-cache 
0640: 20 7b 0a 09 20 20 20 20 73 65 74 20 63 61 63 68   {..    set cach
0650: 65 20 24 76 61 6c 75 65 0a 09 7d 0a 09 64 65 66  e $value..}..def
0660: 61 75 6c 74 20 7b 0a 09 20 20 20 20 72 65 74 75  ault {..    retu
0670: 72 6e 20 2d 63 6f 64 65 20 65 72 72 6f 72 20 22  rn -code error "
0680: 55 6e 6b 6e 6f 77 6e 20 73 77 69 74 63 68 20 24  Unknown switch $
0690: 6b 65 79 2c 20 65 78 70 65 63 74 65 64 20 6f 6e  key, expected on
06a0: 65 20 6f 66 20 2d 63 61 63 68 65 22 0a 09 7d 0a  e of -cache"..}.
06b0: 20 20 20 20 7d 0a 20 20 20 20 72 65 74 75 72 6e      }.    return
06c0: 0a 7d 0a 0a 70 72 6f 63 20 3a 3a 76 63 3a 3a 72  .}..proc ::vc::r
06d0: 63 73 3a 3a 70 61 72 73 65 72 3a 3a 70 72 6f 63  cs::parser::proc
06e0: 65 73 73 20 7b 70 61 74 68 7d 20 7b 0a 20 20 20  ess {path} {.   
06f0: 20 76 61 72 69 61 62 6c 65 20 63 61 63 68 65 0a   variable cache.
0700: 0a 20 20 20 20 69 66 20 7b 21 24 63 61 63 68 65  .    if {!$cache
0710: 7d 20 7b 0a 09 72 65 74 75 72 6e 20 5b 50 72 6f  } {..return [Pro
0720: 63 65 73 73 20 24 70 61 74 68 5d 0a 20 20 20 20  cess $path].    
0730: 7d 0a 0a 20 20 20 20 73 65 74 20 63 61 63 68 65  }..    set cache
0740: 66 69 6c 65 20 5b 43 61 63 68 65 20 24 70 61 74  file [Cache $pat
0750: 68 5d 0a 20 20 20 20 69 66 20 7b 0a 09 5b 66 69  h].    if {..[fi
0760: 6c 65 20 65 78 69 73 74 73 20 24 63 61 63 68 65  le exists $cache
0770: 66 69 6c 65 5d 20 26 26 0a 09 28 5b 66 69 6c 65  file] &&..([file
0780: 20 6d 74 69 6d 65 20 24 63 61 63 68 65 66 69 6c   mtime $cachefil
0790: 65 5d 20 3e 20 5b 66 69 6c 65 20 6d 74 69 6d 65  e] > [file mtime
07a0: 20 24 70 61 74 68 5d 29 0a 20 20 20 20 7d 20 7b   $path]).    } {
07b0: 0a 09 23 20 55 73 65 20 70 72 65 70 61 72 73 65  ..# Use preparse
07c0: 64 20 64 61 74 61 20 69 66 20 6e 6f 74 20 69 6e  d data if not in
07d0: 76 61 6c 69 64 61 74 65 64 20 62 79 20 63 68 61  validated by cha
07e0: 6e 67 65 73 20 74 6f 20 74 68 65 0a 09 23 20 61  nges to the..# a
07f0: 72 63 68 69 76 65 20 74 68 65 79 20 61 72 65 20  rchive they are 
0800: 64 65 72 69 76 65 64 20 66 72 6f 6d 2e 0a 09 77  derived from...w
0810: 72 69 74 65 20 34 20 72 63 73 20 7b 4c 6f 61 64  rite 4 rcs {Load
0820: 20 70 72 65 70 61 72 73 65 64 20 64 61 74 61 20   preparsed data 
0830: 62 6c 6f 63 6b 7d 0a 09 72 65 74 75 72 6e 20 5b  block}..return [
0840: 66 69 6c 65 75 74 69 6c 3a 3a 63 61 74 20 2d 65  fileutil::cat -e
0850: 6e 63 6f 64 69 6e 67 20 62 69 6e 61 72 79 20 24  ncoding binary $
0860: 63 61 63 68 65 66 69 6c 65 5d 0a 20 20 20 20 7d  cachefile].    }
0870: 0a 0a 20 20 20 20 73 65 74 20 72 65 73 20 5b 50  ..    set res [P
0880: 72 6f 63 65 73 73 20 24 70 61 74 68 5d 0a 0a 20  rocess $path].. 
0890: 20 20 20 23 20 53 61 76 65 20 70 61 72 73 65 20     # Save parse 
08a0: 72 65 73 75 6c 74 20 66 6f 72 20 71 75 69 63 6b  result for quick
08b0: 20 70 69 63 6b 75 70 20 62 79 20 66 75 74 75 72   pickup by futur
08c0: 65 20 72 75 6e 73 2e 0a 20 20 20 20 66 69 6c 65  e runs..    file
08d0: 75 74 69 6c 3a 3a 77 72 69 74 65 46 69 6c 65 20  util::writeFile 
08e0: 24 63 61 63 68 65 66 69 6c 65 20 24 72 65 73 0a  $cachefile $res.
08f0: 0a 20 20 20 20 72 65 74 75 72 6e 20 24 72 65 73  .    return $res
0900: 0a 7d 0a 0a 23 20 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  .}..# ----------
0910: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
0920: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
0930: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
0940: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
0950: 2d 2d 2d 0a 0a 70 72 6f 63 20 3a 3a 76 63 3a 3a  ---..proc ::vc::
0960: 72 63 73 3a 3a 70 61 72 73 65 72 3a 3a 50 72 6f  rcs::parser::Pro
0970: 63 65 73 73 20 7b 70 61 74 68 7d 20 7b 0a 20 20  cess {path} {.  
0980: 20 20 73 65 74 20 64 61 74 61 20 5b 66 69 6c 65    set data [file
0990: 75 74 69 6c 3a 3a 63 61 74 20 2d 65 6e 63 6f 64  util::cat -encod
09a0: 69 6e 67 20 62 69 6e 61 72 79 20 24 70 61 74 68  ing binary $path
09b0: 5d 0a 20 20 20 20 61 72 72 61 79 20 73 65 74 20  ].    array set 
09c0: 72 65 73 20 7b 7d 0a 20 20 20 20 73 65 74 20 72  res {}.    set r
09d0: 65 73 28 73 69 7a 65 29 20 5b 66 69 6c 65 20 73  es(size) [file s
09e0: 69 7a 65 20 24 70 61 74 68 5d 0a 20 20 20 20 73  ize $path].    s
09f0: 65 74 20 72 65 73 28 64 6f 6e 65 29 20 30 0a 20  et res(done) 0. 
0a00: 20 20 20 73 65 74 20 72 65 73 28 6e 73 69 7a 65     set res(nsize
0a10: 29 20 5b 73 74 72 69 6e 67 20 6c 65 6e 67 74 68  ) [string length
0a20: 20 24 72 65 73 28 73 69 7a 65 29 5d 0a 0a 20 20   $res(size)]..  
0a30: 20 20 41 64 6d 69 6e 0a 20 20 20 20 44 65 6c 74    Admin.    Delt
0a40: 61 73 0a 20 20 20 20 44 65 73 63 72 69 70 74 69  as.    Descripti
0a50: 6f 6e 0a 20 20 20 20 44 65 6c 74 61 54 65 78 74  on.    DeltaText
0a60: 73 0a 0a 20 20 20 20 23 20 52 65 6d 6f 76 65 20  s..    # Remove 
0a70: 70 61 72 73 65 72 20 73 74 61 74 65 0a 20 20 20  parser state.   
0a80: 20 63 61 74 63 68 20 7b 75 6e 73 65 74 20 72 65   catch {unset re
0a90: 73 28 69 64 29 7d 0a 20 20 20 20 63 61 74 63 68  s(id)}.    catch
0aa0: 20 7b 75 6e 73 65 74 20 72 65 73 28 6c 61 73 74   {unset res(last
0ab0: 76 61 6c 29 7d 0a 20 20 20 20 75 6e 73 65 74 20  val)}.    unset 
0ac0: 72 65 73 28 73 69 7a 65 29 0a 20 20 20 20 75 6e  res(size).    un
0ad0: 73 65 74 20 72 65 73 28 6e 73 69 7a 65 29 0a 20  set res(nsize). 
0ae0: 20 20 20 75 6e 73 65 74 20 72 65 73 28 64 6f 6e     unset res(don
0af0: 65 29 0a 0a 20 20 20 20 72 65 74 75 72 6e 20 5b  e)..    return [
0b00: 61 72 72 61 79 20 67 65 74 20 72 65 73 5d 0a 7d  array get res].}
0b10: 0a 0a 70 72 6f 63 20 3a 3a 76 63 3a 3a 72 63 73  ..proc ::vc::rcs
0b20: 3a 3a 70 61 72 73 65 72 3a 3a 43 61 63 68 65 20  ::parser::Cache 
0b30: 7b 70 61 74 68 7d 20 7b 0a 20 20 20 20 72 65 74  {path} {.    ret
0b40: 75 72 6e 20 24 7b 70 61 74 68 7d 2c 2c 70 72 65  urn ${path},,pre
0b50: 70 61 72 73 65 64 0a 7d 0a 0a 23 20 2d 2d 2d 2d  parsed.}..# ----
0b60: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
0b70: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
0b80: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
0b90: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
0ba0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 23 20 49 6e 74 65  ---------.# Inte
0bb0: 72 6e 61 6c 20 2d 20 52 65 63 75 72 73 69 76 65  rnal - Recursive
0bc0: 20 44 65 73 63 65 6e 74 20 66 75 6e 63 74 69 6f   Descent functio
0bd0: 6e 73 20 69 6d 70 6c 65 6d 65 6e 74 69 6e 67 20  ns implementing 
0be0: 74 68 65 20 73 79 6e 74 61 78 2e 0a 0a 70 72 6f  the syntax...pro
0bf0: 63 20 3a 3a 76 63 3a 3a 72 63 73 3a 3a 70 61 72  c ::vc::rcs::par
0c00: 73 65 72 3a 3a 41 64 6d 69 6e 20 7b 7d 20 7b 0a  ser::Admin {} {.
0c10: 20 20 20 20 75 70 76 61 72 20 31 20 64 61 74 61      upvar 1 data
0c20: 20 64 61 74 61 20 72 65 73 20 72 65 73 0a 20 20   data res res.  
0c30: 20 20 48 65 61 64 20 3b 20 42 72 61 6e 63 68 20    Head ; Branch 
0c40: 3b 20 41 63 63 65 73 73 20 3b 20 53 79 6d 62 6f  ; Access ; Symbo
0c50: 6c 73 20 3b 20 4c 6f 63 6b 73 20 3b 20 53 74 72  ls ; Locks ; Str
0c60: 69 63 74 20 3b 20 43 6f 6d 6d 65 6e 74 20 3b 20  ict ; Comment ; 
0c70: 45 78 70 61 6e 64 0a 20 20 20 20 72 65 74 75 72  Expand.    retur
0c80: 6e 0a 7d 0a 0a 70 72 6f 63 20 3a 3a 76 63 3a 3a  n.}..proc ::vc::
0c90: 72 63 73 3a 3a 70 61 72 73 65 72 3a 3a 44 65 6c  rcs::parser::Del
0ca0: 74 61 73 20 7b 7d 20 7b 0a 20 20 20 20 75 70 76  tas {} {.    upv
0cb0: 61 72 20 31 20 64 61 74 61 20 64 61 74 61 20 72  ar 1 data data r
0cc0: 65 73 20 72 65 73 0a 20 20 20 20 77 68 69 6c 65  es res.    while
0cd0: 20 7b 5b 4e 75 6d 20 30 5d 7d 20 7b 20 49 73 49   {[Num 0]} { IsI
0ce0: 64 65 6e 74 20 3b 20 44 61 74 65 20 3b 20 41 75  dent ; Date ; Au
0cf0: 74 68 6f 72 20 3b 20 53 74 61 74 65 20 3b 20 42  thor ; State ; B
0d00: 72 61 6e 63 68 65 73 20 3b 20 4e 65 78 74 52 65  ranches ; NextRe
0d10: 76 20 7d 0a 20 20 20 20 72 65 74 75 72 6e 0a 7d  v }.    return.}
0d20: 0a 0a 70 72 6f 63 20 3a 3a 76 63 3a 3a 72 63 73  ..proc ::vc::rcs
0d30: 3a 3a 70 61 72 73 65 72 3a 3a 44 65 73 63 72 69  ::parser::Descri
0d40: 70 74 69 6f 6e 20 7b 7d 20 7b 0a 20 20 20 20 75  ption {} {.    u
0d50: 70 76 61 72 20 31 20 64 61 74 61 20 64 61 74 61  pvar 1 data data
0d60: 20 72 65 73 20 72 65 73 0a 20 20 20 20 4c 69 74   res res.    Lit
0d70: 65 72 61 6c 20 64 65 73 63 0a 20 20 20 20 53 74  eral desc.    St
0d80: 72 69 6e 67 20 31 0a 20 20 20 20 44 65 66 20 64  ring 1.    Def d
0d90: 65 73 63 0a 20 20 20 20 72 65 74 75 72 6e 0a 7d  esc.    return.}
0da0: 0a 0a 70 72 6f 63 20 3a 3a 76 63 3a 3a 72 63 73  ..proc ::vc::rcs
0db0: 3a 3a 70 61 72 73 65 72 3a 3a 44 65 6c 74 61 54  ::parser::DeltaT
0dc0: 65 78 74 73 20 7b 7d 20 7b 0a 20 20 20 20 75 70  exts {} {.    up
0dd0: 76 61 72 20 31 20 64 61 74 61 20 64 61 74 61 20  var 1 data data 
0de0: 72 65 73 20 72 65 73 0a 20 20 20 20 77 68 69 6c  res res.    whil
0df0: 65 20 7b 5b 4e 75 6d 20 30 5d 7d 20 7b 20 49 73  e {[Num 0]} { Is
0e00: 49 64 65 6e 74 20 3b 20 4c 6f 67 20 3b 20 54 65  Ident ; Log ; Te
0e10: 78 74 20 7d 0a 20 20 20 20 72 65 74 75 72 6e 0a  xt }.    return.
0e20: 7d 0a 0a 70 72 6f 63 20 3a 3a 76 63 3a 3a 72 63  }..proc ::vc::rc
0e30: 73 3a 3a 70 61 72 73 65 72 3a 3a 48 65 61 64 20  s::parser::Head 
0e40: 7b 7d 20 7b 0a 20 20 20 20 75 70 76 61 72 20 31  {} {.    upvar 1
0e50: 20 64 61 74 61 20 64 61 74 61 20 72 65 73 20 72   data data res r
0e60: 65 73 0a 20 20 20 20 4c 69 74 65 72 61 6c 20 68  es.    Literal h
0e70: 65 61 64 20 3b 20 4e 75 6d 20 31 20 3b 20 4c 69  ead ; Num 1 ; Li
0e80: 74 65 72 61 6c 20 5c 3b 0a 20 20 20 20 44 65 66  teral \;.    Def
0e90: 20 68 65 61 64 0a 20 20 20 20 72 65 74 75 72 6e   head.    return
0ea0: 0a 7d 0a 0a 70 72 6f 63 20 3a 3a 76 63 3a 3a 72  .}..proc ::vc::r
0eb0: 63 73 3a 3a 70 61 72 73 65 72 3a 3a 42 72 61 6e  cs::parser::Bran
0ec0: 63 68 20 7b 7d 20 7b 0a 20 20 20 20 75 70 76 61  ch {} {.    upva
0ed0: 72 20 31 20 64 61 74 61 20 64 61 74 61 20 72 65  r 1 data data re
0ee0: 73 20 72 65 73 0a 20 20 20 20 69 66 20 7b 21 5b  s res.    if {![
0ef0: 4c 69 74 65 72 61 6c 20 62 72 61 6e 63 68 20 30  Literal branch 0
0f00: 5d 7d 20 72 65 74 75 72 6e 20 3b 20 4e 75 6d 20  ]} return ; Num 
0f10: 31 20 3b 20 4c 69 74 65 72 61 6c 20 5c 3b 0a 20  1 ; Literal \;. 
0f20: 20 20 20 44 65 66 20 62 72 61 6e 63 68 0a 20 20     Def branch.  
0f30: 20 20 72 65 74 75 72 6e 0a 7d 0a 0a 70 72 6f 63    return.}..proc
0f40: 20 3a 3a 76 63 3a 3a 72 63 73 3a 3a 70 61 72 73   ::vc::rcs::pars
0f50: 65 72 3a 3a 41 63 63 65 73 73 20 7b 7d 20 7b 0a  er::Access {} {.
0f60: 20 20 20 20 75 70 76 61 72 20 31 20 64 61 74 61      upvar 1 data
0f70: 20 64 61 74 61 20 72 65 73 20 72 65 73 0a 20 20   data res res.  
0f80: 20 20 4c 69 74 65 72 61 6c 20 61 63 63 65 73 73    Literal access
0f90: 20 3b 20 4c 69 74 65 72 61 6c 20 5c 3b 0a 20 20   ; Literal \;.  
0fa0: 20 20 72 65 74 75 72 6e 0a 7d 0a 0a 70 72 6f 63    return.}..proc
0fb0: 20 3a 3a 76 63 3a 3a 72 63 73 3a 3a 70 61 72 73   ::vc::rcs::pars
0fc0: 65 72 3a 3a 53 79 6d 62 6f 6c 73 20 7b 7d 20 7b  er::Symbols {} {
0fd0: 0a 20 20 20 20 75 70 76 61 72 20 31 20 64 61 74  .    upvar 1 dat
0fe0: 61 20 64 61 74 61 20 72 65 73 20 72 65 73 0a 20  a data res res. 
0ff0: 20 20 20 4c 69 74 65 72 61 6c 20 73 79 6d 62 6f     Literal symbo
1000: 6c 73 0a 20 20 20 20 77 68 69 6c 65 20 7b 5b 49  ls.    while {[I
1010: 64 65 6e 74 5d 7d 20 7b 20 4e 75 6d 20 31 20 3b  dent]} { Num 1 ;
1020: 20 4d 61 70 20 73 79 6d 62 6f 6c 20 7d 0a 20 20   Map symbol }.  
1030: 20 20 4c 69 74 65 72 61 6c 20 5c 3b 0a 20 20 20    Literal \;.   
1040: 20 72 65 74 75 72 6e 0a 7d 0a 0a 70 72 6f 63 20   return.}..proc 
1050: 3a 3a 76 63 3a 3a 72 63 73 3a 3a 70 61 72 73 65  ::vc::rcs::parse
1060: 72 3a 3a 4c 6f 63 6b 73 20 7b 7d 20 7b 0a 20 20  r::Locks {} {.  
1070: 20 20 75 70 76 61 72 20 31 20 64 61 74 61 20 64    upvar 1 data d
1080: 61 74 61 20 72 65 73 20 72 65 73 0a 20 20 20 20  ata res res.    
1090: 4c 69 74 65 72 61 6c 20 6c 6f 63 6b 73 0a 20 20  Literal locks.  
10a0: 20 20 77 68 69 6c 65 20 7b 5b 49 64 65 6e 74 5d    while {[Ident]
10b0: 7d 20 7b 20 4e 75 6d 20 31 20 3b 20 4d 61 70 20  } { Num 1 ; Map 
10c0: 6c 6f 63 6b 20 7d 0a 20 20 20 20 4c 69 74 65 72  lock }.    Liter
10d0: 61 6c 20 5c 3b 0a 20 20 20 20 72 65 74 75 72 6e  al \;.    return
10e0: 0a 7d 0a 0a 70 72 6f 63 20 3a 3a 76 63 3a 3a 72  .}..proc ::vc::r
10f0: 63 73 3a 3a 70 61 72 73 65 72 3a 3a 53 74 72 69  cs::parser::Stri
1100: 63 74 20 7b 7d 20 7b 0a 20 20 20 20 75 70 76 61  ct {} {.    upva
1110: 72 20 31 20 64 61 74 61 20 64 61 74 61 20 72 65  r 1 data data re
1120: 73 20 72 65 73 0a 20 20 20 20 69 66 20 7b 21 5b  s res.    if {![
1130: 4c 69 74 65 72 61 6c 20 73 74 72 69 63 74 20 30  Literal strict 0
1140: 5d 7d 20 72 65 74 75 72 6e 20 3b 20 4c 69 74 65  ]} return ; Lite
1150: 72 61 6c 20 5c 3b 0a 20 20 20 20 72 65 74 75 72  ral \;.    retur
1160: 6e 0a 7d 0a 0a 70 72 6f 63 20 3a 3a 76 63 3a 3a  n.}..proc ::vc::
1170: 72 63 73 3a 3a 70 61 72 73 65 72 3a 3a 43 6f 6d  rcs::parser::Com
1180: 6d 65 6e 74 20 7b 7d 20 7b 0a 20 20 20 20 75 70  ment {} {.    up
1190: 76 61 72 20 31 20 64 61 74 61 20 64 61 74 61 20  var 1 data data 
11a0: 72 65 73 20 72 65 73 0a 20 20 20 20 69 66 20 7b  res res.    if {
11b0: 21 5b 4c 69 74 65 72 61 6c 20 63 6f 6d 6d 65 6e  ![Literal commen
11c0: 74 20 30 5d 7d 20 72 65 74 75 72 6e 20 3b 0a 20  t 0]} return ;. 
11d0: 20 20 20 69 66 20 7b 21 5b 53 74 72 69 6e 67 20     if {![String 
11e0: 30 5d 7d 20 72 65 74 75 72 6e 20 3b 0a 20 20 20  0]} return ;.   
11f0: 20 4c 69 74 65 72 61 6c 20 5c 3b 0a 20 20 20 20   Literal \;.    
1200: 44 65 66 20 63 6f 6d 6d 65 6e 74 0a 20 20 20 20  Def comment.    
1210: 72 65 74 75 72 6e 0a 7d 0a 0a 70 72 6f 63 20 3a  return.}..proc :
1220: 3a 76 63 3a 3a 72 63 73 3a 3a 70 61 72 73 65 72  :vc::rcs::parser
1230: 3a 3a 45 78 70 61 6e 64 20 7b 7d 20 7b 0a 20 20  ::Expand {} {.  
1240: 20 20 75 70 76 61 72 20 31 20 64 61 74 61 20 64    upvar 1 data d
1250: 61 74 61 20 72 65 73 20 72 65 73 0a 20 20 20 20  ata res res.    
1260: 69 66 20 7b 21 5b 4c 69 74 65 72 61 6c 20 65 78  if {![Literal ex
1270: 70 61 6e 64 20 30 5d 7d 20 72 65 74 75 72 6e 20  pand 0]} return 
1280: 3b 0a 20 20 20 20 69 66 20 7b 21 5b 53 74 72 69  ;.    if {![Stri
1290: 6e 67 20 30 5d 7d 20 72 65 74 75 72 6e 20 3b 0a  ng 0]} return ;.
12a0: 20 20 20 20 4c 69 74 65 72 61 6c 20 5c 3b 0a 20      Literal \;. 
12b0: 20 20 20 44 65 66 20 65 78 70 61 6e 64 0a 20 20     Def expand.  
12c0: 20 20 72 65 74 75 72 6e 0a 7d 0a 0a 70 72 6f 63    return.}..proc
12d0: 20 3a 3a 76 63 3a 3a 72 63 73 3a 3a 70 61 72 73   ::vc::rcs::pars
12e0: 65 72 3a 3a 44 61 74 65 20 7b 7d 20 7b 0a 20 20  er::Date {} {.  
12f0: 20 20 75 70 76 61 72 20 31 20 64 61 74 61 20 64    upvar 1 data d
1300: 61 74 61 20 72 65 73 20 72 65 73 0a 20 20 20 20  ata res res.    
1310: 4c 69 74 65 72 61 6c 20 64 61 74 65 20 3b 20 4e  Literal date ; N
1320: 75 6d 20 31 20 3b 20 4c 69 74 65 72 61 6c 20 5c  um 1 ; Literal \
1330: 3b 0a 0a 20 20 20 20 66 6f 72 65 61 63 68 20 7b  ;..    foreach {
1340: 79 72 20 6d 6f 20 64 79 20 68 20 6d 20 73 7d 20  yr mo dy h m s} 
1350: 5b 73 70 6c 69 74 20 24 72 65 73 28 6c 61 73 74  [split $res(last
1360: 76 61 6c 29 20 2e 5d 20 62 72 65 61 6b 0a 20 20  val) .] break.  
1370: 20 20 69 66 20 7b 24 79 72 20 3c 20 31 30 30 7d    if {$yr < 100}
1380: 20 7b 69 6e 63 72 20 79 72 20 31 39 30 30 7d 0a   {incr yr 1900}.
1390: 20 20 20 20 73 65 74 20 72 65 73 28 6c 61 73 74      set res(last
13a0: 76 61 6c 29 20 5b 6a 6f 69 6e 20 5b 6c 69 73 74  val) [join [list
13b0: 20 24 79 72 20 24 6d 6f 20 24 64 79 20 24 68 20   $yr $mo $dy $h 
13c0: 24 6d 20 24 73 5d 20 2e 5d 0a 20 20 20 20 4d 61  $m $s] .].    Ma
13d0: 70 20 64 61 74 65 0a 20 20 20 20 72 65 74 75 72  p date.    retur
13e0: 6e 0a 7d 0a 0a 70 72 6f 63 20 3a 3a 76 63 3a 3a  n.}..proc ::vc::
13f0: 72 63 73 3a 3a 70 61 72 73 65 72 3a 3a 41 75 74  rcs::parser::Aut
1400: 68 6f 72 20 7b 7d 20 7b 0a 20 20 20 20 75 70 76  hor {} {.    upv
1410: 61 72 20 31 20 64 61 74 61 20 64 61 74 61 20 72  ar 1 data data r
1420: 65 73 20 72 65 73 0a 20 20 20 20 4c 69 74 65 72  es res.    Liter
1430: 61 6c 20 61 75 74 68 6f 72 20 3b 20 53 6b 69 70  al author ; Skip
1440: 20 3b 20 4c 69 74 65 72 61 6c 20 5c 3b 20 3b 20   ; Literal \; ; 
1450: 4d 61 70 20 61 75 74 68 6f 72 0a 20 20 20 20 72  Map author.    r
1460: 65 74 75 72 6e 0a 7d 0a 0a 70 72 6f 63 20 3a 3a  eturn.}..proc ::
1470: 76 63 3a 3a 72 63 73 3a 3a 70 61 72 73 65 72 3a  vc::rcs::parser:
1480: 3a 53 74 61 74 65 20 7b 7d 20 7b 0a 20 20 20 20  :State {} {.    
1490: 75 70 76 61 72 20 31 20 64 61 74 61 20 64 61 74  upvar 1 data dat
14a0: 61 20 72 65 73 20 72 65 73 0a 20 20 20 20 4c 69  a res res.    Li
14b0: 74 65 72 61 6c 20 73 74 61 74 65 20 3b 20 53 6b  teral state ; Sk
14c0: 69 70 20 3b 20 4c 69 74 65 72 61 6c 20 5c 3b 20  ip ; Literal \; 
14d0: 3b 20 4d 61 70 20 73 74 61 74 65 0a 20 20 20 20  ; Map state.    
14e0: 72 65 74 75 72 6e 0a 7d 0a 0a 70 72 6f 63 20 3a  return.}..proc :
14f0: 3a 76 63 3a 3a 72 63 73 3a 3a 70 61 72 73 65 72  :vc::rcs::parser
1500: 3a 3a 42 72 61 6e 63 68 65 73 20 7b 7d 20 7b 0a  ::Branches {} {.
1510: 20 20 20 20 75 70 76 61 72 20 31 20 64 61 74 61      upvar 1 data
1520: 20 64 61 74 61 20 72 65 73 20 72 65 73 0a 20 20   data res res.  
1530: 20 20 4c 69 74 65 72 61 6c 20 62 72 61 6e 63 68    Literal branch
1540: 65 73 20 3b 20 53 6b 69 70 20 3b 20 4c 69 74 65  es ; Skip ; Lite
1550: 72 61 6c 20 5c 3b 0a 20 20 20 20 72 65 74 75 72  ral \;.    retur
1560: 6e 0a 7d 0a 0a 70 72 6f 63 20 3a 3a 76 63 3a 3a  n.}..proc ::vc::
1570: 72 63 73 3a 3a 70 61 72 73 65 72 3a 3a 4e 65 78  rcs::parser::Nex
1580: 74 52 65 76 20 7b 7d 20 7b 0a 20 20 20 20 75 70  tRev {} {.    up
1590: 76 61 72 20 31 20 64 61 74 61 20 64 61 74 61 20  var 1 data data 
15a0: 72 65 73 20 72 65 73 0a 20 20 20 20 4c 69 74 65  res res.    Lite
15b0: 72 61 6c 20 6e 65 78 74 20 3b 20 53 6b 69 70 20  ral next ; Skip 
15c0: 3b 20 4c 69 74 65 72 61 6c 20 5c 3b 20 3b 20 4d  ; Literal \; ; M
15d0: 61 70 20 70 61 72 65 6e 74 0a 20 20 20 20 72 65  ap parent.    re
15e0: 74 75 72 6e 0a 7d 0a 0a 70 72 6f 63 20 3a 3a 76  turn.}..proc ::v
15f0: 63 3a 3a 72 63 73 3a 3a 70 61 72 73 65 72 3a 3a  c::rcs::parser::
1600: 4c 6f 67 20 7b 7d 20 7b 0a 20 20 20 20 75 70 76  Log {} {.    upv
1610: 61 72 20 31 20 64 61 74 61 20 64 61 74 61 20 72  ar 1 data data r
1620: 65 73 20 72 65 73 0a 20 20 20 20 4c 69 74 65 72  es res.    Liter
1630: 61 6c 20 6c 6f 67 20 3b 20 53 74 72 69 6e 67 20  al log ; String 
1640: 31 20 3b 20 4d 61 70 20 63 6f 6d 6d 69 74 0a 20  1 ; Map commit. 
1650: 20 20 20 72 65 74 75 72 6e 0a 7d 0a 0a 70 72 6f     return.}..pro
1660: 63 20 3a 3a 76 63 3a 3a 72 63 73 3a 3a 70 61 72  c ::vc::rcs::par
1670: 73 65 72 3a 3a 54 65 78 74 20 7b 7d 20 7b 0a 20  ser::Text {} {. 
1680: 20 20 20 75 70 76 61 72 20 31 20 64 61 74 61 20     upvar 1 data 
1690: 64 61 74 61 20 72 65 73 20 72 65 73 0a 20 20 20  data res res.   
16a0: 20 4c 69 74 65 72 61 6c 20 74 65 78 74 20 3b 20   Literal text ; 
16b0: 53 74 72 69 6e 67 20 31 0a 20 20 20 20 72 65 74  String 1.    ret
16c0: 75 72 6e 0a 7d 0a 0a 23 20 2d 2d 2d 2d 2d 2d 2d  urn.}..# -------
16d0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
16e0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
16f0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
1700: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
1710: 2d 2d 2d 2d 2d 2d 0a 23 20 49 6e 74 65 72 6e 61  ------.# Interna
1720: 6c 20 2d 20 4c 65 78 69 63 6f 67 72 61 70 68 69  l - Lexicographi
1730: 63 61 6c 20 63 6f 6d 6d 61 6e 64 73 20 61 6e 64  cal commands and
1740: 20 64 61 74 61 20 61 71 75 69 73 69 74 69 6f 6e   data aquisition
1750: 20 70 72 65 70 61 72 61 74 69 6f 6e 0a 0a 70 72   preparation..pr
1760: 6f 63 20 3a 3a 76 63 3a 3a 72 63 73 3a 3a 70 61  oc ::vc::rcs::pa
1770: 72 73 65 72 3a 3a 49 64 65 6e 74 20 7b 7d 20 7b  rser::Ident {} {
1780: 0a 20 20 20 20 75 70 76 61 72 20 31 20 64 61 74  .    upvar 1 dat
1790: 61 20 64 61 74 61 20 72 65 73 20 72 65 73 0a 0a  a data res res..
17a0: 20 20 20 20 23 70 75 74 73 20 49 40 3f 3c 5b 73      #puts I@?<[s
17b0: 74 72 69 6e 67 20 72 61 6e 67 65 20 24 64 61 74  tring range $dat
17c0: 61 20 30 20 31 30 5d 2e 2e 2e 3e 0a 0a 20 20 20  a 0 10]...>..   
17d0: 20 69 66 20 7b 5b 72 65 67 65 78 70 20 2d 69 6e   if {[regexp -in
17e0: 64 69 63 65 73 20 2d 2d 20 7b 5e 5c 73 2a 3b 5c  dices -- {^\s*;\
17f0: 73 2a 7d 20 24 64 61 74 61 5d 7d 20 7b 0a 09 72  s*} $data]} {..r
1800: 65 74 75 72 6e 20 30 0a 20 20 20 20 7d 20 65 6c  eturn 0.    } el
1810: 73 65 69 66 20 7b 21 5b 72 65 67 65 78 70 20 2d  seif {![regexp -
1820: 69 6e 64 69 63 65 73 20 2d 2d 20 7b 5e 5c 73 2a  indices -- {^\s*
1830: 28 5b 5e 3a 5d 2a 29 5c 73 2a 3a 5c 73 2a 7d 20  ([^:]*)\s*:\s*} 
1840: 24 64 61 74 61 20 6d 61 74 63 68 20 76 61 6c 5d  $data match val]
1850: 7d 20 7b 0a 09 72 65 74 75 72 6e 20 30 0a 20 20  } {..return 0.  
1860: 20 20 7d 0a 0a 20 20 20 20 47 65 74 20 24 76 61    }..    Get $va
1870: 6c 20 3b 20 49 73 49 64 65 6e 74 0a 20 20 20 20  l ; IsIdent.    
1880: 4e 65 78 74 0a 20 20 20 20 72 65 74 75 72 6e 20  Next.    return 
1890: 31 0a 7d 0a 0a 70 72 6f 63 20 3a 3a 76 63 3a 3a  1.}..proc ::vc::
18a0: 72 63 73 3a 3a 70 61 72 73 65 72 3a 3a 4c 69 74  rcs::parser::Lit
18b0: 65 72 61 6c 20 7b 6e 61 6d 65 20 7b 72 65 71 75  eral {name {requ
18c0: 69 72 65 64 20 31 7d 7d 20 7b 0a 20 20 20 20 75  ired 1}} {.    u
18d0: 70 76 61 72 20 31 20 64 61 74 61 20 64 61 74 61  pvar 1 data data
18e0: 20 72 65 73 20 72 65 73 0a 20 20 20 20 69 66 20   res res.    if 
18f0: 7b 21 5b 72 65 67 65 78 70 20 2d 69 6e 64 69 63  {![regexp -indic
1900: 65 73 20 2d 2d 20 22 5e 5c 5c 73 2a 24 6e 61 6d  es -- "^\\s*$nam
1910: 65 5c 5c 73 2a 22 20 24 64 61 74 61 20 6d 61 74  e\\s*" $data mat
1920: 63 68 5d 7d 20 7b 0a 09 69 66 20 7b 24 72 65 71  ch]} {..if {$req
1930: 75 69 72 65 64 7d 20 7b 0a 09 20 20 20 20 72 65  uired} {..    re
1940: 74 75 72 6e 20 2d 63 6f 64 65 20 65 72 72 6f 72  turn -code error
1950: 20 22 45 78 70 65 63 74 65 64 20 27 24 6e 61 6d   "Expected '$nam
1960: 65 27 20 40 20 27 5b 73 74 72 69 6e 67 20 72 61  e' @ '[string ra
1970: 6e 67 65 20 24 64 61 74 61 20 30 20 33 30 5d 2e  nge $data 0 30].
1980: 2e 2e 27 22 0a 09 7d 0a 09 72 65 74 75 72 6e 20  ..'"..}..return 
1990: 30 0a 20 20 20 20 7d 0a 0a 20 20 20 20 4e 65 78  0.    }..    Nex
19a0: 74 0a 20 20 20 20 72 65 74 75 72 6e 20 31 0a 7d  t.    return 1.}
19b0: 0a 0a 70 72 6f 63 20 3a 3a 76 63 3a 3a 72 63 73  ..proc ::vc::rcs
19c0: 3a 3a 70 61 72 73 65 72 3a 3a 53 74 72 69 6e 67  ::parser::String
19d0: 20 7b 7b 72 65 71 75 69 72 65 64 20 31 7d 7d 20   {{required 1}} 
19e0: 7b 0a 20 20 20 20 75 70 76 61 72 20 31 20 64 61  {.    upvar 1 da
19f0: 74 61 20 64 61 74 61 20 72 65 73 20 72 65 73 0a  ta data res res.
1a00: 0a 20 20 20 20 69 66 20 7b 21 5b 72 65 67 65 78  .    if {![regex
1a10: 70 20 2d 69 6e 64 69 63 65 73 20 2d 2d 20 7b 5e  p -indices -- {^
1a20: 5c 73 2a 40 28 28 5b 5e 40 5d 2a 28 40 40 29 2a  \s*@(([^@]*(@@)*
1a30: 29 2a 29 40 5c 73 2a 7d 20 24 64 61 74 61 20 6d  )*)@\s*} $data m
1a40: 61 74 63 68 20 76 61 6c 5d 7d 20 7b 0a 09 69 66  atch val]} {..if
1a50: 20 7b 24 72 65 71 75 69 72 65 64 7d 20 7b 0a 09   {$required} {..
1a60: 20 20 20 20 72 65 74 75 72 6e 20 2d 63 6f 64 65      return -code
1a70: 20 65 72 72 6f 72 20 22 45 78 70 65 63 74 65 64   error "Expected
1a80: 20 73 74 72 69 6e 67 20 40 20 27 5b 73 74 72 69   string @ '[stri
1a90: 6e 67 20 72 61 6e 67 65 20 24 64 61 74 61 20 30  ng range $data 0
1aa0: 20 33 30 5d 2e 2e 2e 27 22 0a 09 7d 0a 09 72 65   30]...'"..}..re
1ab0: 74 75 72 6e 20 30 0a 20 20 20 20 7d 0a 0a 20 20  turn 0.    }..  
1ac0: 20 20 47 65 74 20 24 76 61 6c 0a 20 20 20 20 4e    Get $val.    N
1ad0: 65 78 74 0a 20 20 20 20 72 65 74 75 72 6e 20 31  ext.    return 1
1ae0: 0a 7d 0a 0a 70 72 6f 63 20 3a 3a 76 63 3a 3a 72  .}..proc ::vc::r
1af0: 63 73 3a 3a 70 61 72 73 65 72 3a 3a 4e 75 6d 20  cs::parser::Num 
1b00: 7b 72 65 71 75 69 72 65 64 7d 20 7b 0a 20 20 20  {required} {.   
1b10: 20 75 70 76 61 72 20 31 20 64 61 74 61 20 64 61   upvar 1 data da
1b20: 74 61 20 72 65 73 20 72 65 73 0a 20 20 20 20 69  ta res res.    i
1b30: 66 20 7b 21 5b 72 65 67 65 78 70 20 2d 69 6e 64  f {![regexp -ind
1b40: 69 63 65 73 20 2d 2d 20 7b 5e 5c 73 2a 28 28 5c  ices -- {^\s*((\
1b50: 64 7c 5c 2e 29 2b 29 5c 73 2a 7d 20 24 64 61 74  d|\.)+)\s*} $dat
1b60: 61 20 6d 61 74 63 68 20 76 61 6c 5d 7d 20 7b 0a  a match val]} {.
1b70: 09 69 66 20 7b 24 72 65 71 75 69 72 65 64 7d 20  .if {$required} 
1b80: 7b 0a 09 20 20 20 20 72 65 74 75 72 6e 20 2d 63  {..    return -c
1b90: 6f 64 65 20 65 72 72 6f 72 20 22 45 78 70 65 63  ode error "Expec
1ba0: 74 65 64 20 69 64 20 40 20 27 5b 73 74 72 69 6e  ted id @ '[strin
1bb0: 67 20 72 61 6e 67 65 20 24 64 61 74 61 20 30 20  g range $data 0 
1bc0: 33 30 5d 2e 2e 2e 27 22 0a 09 7d 0a 09 72 65 74  30]...'"..}..ret
1bd0: 75 72 6e 20 30 0a 20 20 20 20 7d 0a 0a 20 20 20  urn 0.    }..   
1be0: 20 47 65 74 20 24 76 61 6c 0a 20 20 20 20 4e 65   Get $val.    Ne
1bf0: 78 74 0a 20 20 20 20 72 65 74 75 72 6e 20 31 0a  xt.    return 1.
1c00: 7d 0a 0a 70 72 6f 63 20 3a 3a 76 63 3a 3a 72 63  }..proc ::vc::rc
1c10: 73 3a 3a 70 61 72 73 65 72 3a 3a 53 6b 69 70 20  s::parser::Skip 
1c20: 7b 7d 20 7b 0a 20 20 20 20 75 70 76 61 72 20 31  {} {.    upvar 1
1c30: 20 64 61 74 61 20 64 61 74 61 20 72 65 73 20 72   data data res r
1c40: 65 73 0a 20 20 20 20 72 65 67 65 78 70 20 2d 69  es.    regexp -i
1c50: 6e 64 69 63 65 73 20 2d 2d 20 7b 5e 5c 73 2a 28  ndices -- {^\s*(
1c60: 5b 5e 3b 5d 2a 29 5c 73 2a 7d 20 24 64 61 74 61  [^;]*)\s*} $data
1c70: 20 6d 61 74 63 68 20 76 61 6c 0a 20 20 20 20 47   match val.    G
1c80: 65 74 20 24 76 61 6c 0a 20 20 20 20 4e 65 78 74  et $val.    Next
1c90: 0a 20 20 20 20 72 65 74 75 72 6e 0a 7d 0a 0a 23  .    return.}..#
1ca0: 20 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d   ---------------
1cb0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
1cc0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
1cd0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
1ce0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 23  --------------.#
1cf0: 20 49 6e 74 65 72 6e 61 6c 20 2d 20 44 61 74 61   Internal - Data
1d00: 20 61 71 75 69 73 69 74 69 6f 6e 0a 0a 70 72 6f   aquisition..pro
1d10: 63 20 3a 3a 76 63 3a 3a 72 63 73 3a 3a 70 61 72  c ::vc::rcs::par
1d20: 73 65 72 3a 3a 44 65 66 20 7b 6b 65 79 7d 20 7b  ser::Def {key} {
1d30: 0a 20 20 20 20 75 70 76 61 72 20 31 20 64 61 74  .    upvar 1 dat
1d40: 61 20 64 61 74 61 20 72 65 73 20 72 65 73 0a 20  a data res res. 
1d50: 20 20 20 73 65 74 20 72 65 73 28 24 6b 65 79 29     set res($key)
1d60: 20 24 72 65 73 28 6c 61 73 74 76 61 6c 29 0a 20   $res(lastval). 
1d70: 20 20 20 75 6e 73 65 74 20 72 65 73 28 6c 61 73     unset res(las
1d80: 74 76 61 6c 29 0a 20 20 20 20 72 65 74 75 72 6e  tval).    return
1d90: 0a 7d 0a 0a 70 72 6f 63 20 3a 3a 76 63 3a 3a 72  .}..proc ::vc::r
1da0: 63 73 3a 3a 70 61 72 73 65 72 3a 3a 4d 61 70 20  cs::parser::Map 
1db0: 7b 6b 65 79 7d 20 7b 0a 20 20 20 20 75 70 76 61  {key} {.    upva
1dc0: 72 20 31 20 64 61 74 61 20 64 61 74 61 20 72 65  r 1 data data re
1dd0: 73 20 72 65 73 0a 20 20 20 20 6c 61 70 70 65 6e  s res.    lappen
1de0: 64 20 72 65 73 28 24 6b 65 79 29 20 24 72 65 73  d res($key) $res
1df0: 28 69 64 29 20 24 72 65 73 28 6c 61 73 74 76 61  (id) $res(lastva
1e00: 6c 29 0a 20 20 20 20 23 70 75 74 73 20 4d 61 70  l).    #puts Map
1e10: 28 24 72 65 73 28 69 64 29 29 3d 28 24 72 65 73  ($res(id))=($res
1e20: 28 6c 61 73 74 76 61 6c 29 29 0a 20 20 20 20 75  (lastval)).    u
1e30: 6e 73 65 74 20 72 65 73 28 6c 61 73 74 76 61 6c  nset res(lastval
1e40: 29 0a 20 20 20 20 23 75 6e 73 65 74 20 72 65 73  ).    #unset res
1e50: 28 69 64 29 3b 23 4b 65 65 70 20 69 64 20 66 6f  (id);#Keep id fo
1e60: 72 20 61 64 64 69 74 69 6f 6e 61 6c 20 6d 61 70  r additional map
1e70: 70 69 6e 67 73 2e 0a 20 20 20 20 72 65 74 75 72  pings..    retur
1e80: 6e 0a 7d 0a 0a 70 72 6f 63 20 3a 3a 76 63 3a 3a  n.}..proc ::vc::
1e90: 72 63 73 3a 3a 70 61 72 73 65 72 3a 3a 49 73 49  rcs::parser::IsI
1ea0: 64 65 6e 74 20 7b 7d 20 7b 0a 20 20 20 20 75 70  dent {} {.    up
1eb0: 76 61 72 20 31 20 64 61 74 61 20 64 61 74 61 20  var 1 data data 
1ec0: 72 65 73 20 72 65 73 0a 20 20 20 20 73 65 74 20  res res.    set 
1ed0: 72 65 73 28 69 64 29 20 24 72 65 73 28 6c 61 73  res(id) $res(las
1ee0: 74 76 61 6c 29 0a 20 20 20 20 75 6e 73 65 74 20  tval).    unset 
1ef0: 72 65 73 28 6c 61 73 74 76 61 6c 29 0a 20 20 20  res(lastval).   
1f00: 20 72 65 74 75 72 6e 0a 7d 0a 0a 70 72 6f 63 20   return.}..proc 
1f10: 3a 3a 76 63 3a 3a 72 63 73 3a 3a 70 61 72 73 65  ::vc::rcs::parse
1f20: 72 3a 3a 47 65 74 20 7b 76 61 6c 7d 20 7b 0a 20  r::Get {val} {. 
1f30: 20 20 20 75 70 76 61 72 20 31 20 64 61 74 61 20     upvar 1 data 
1f40: 64 61 74 61 20 72 65 73 20 72 65 73 0a 20 20 20  data res res.   
1f50: 20 66 6f 72 65 61 63 68 20 7b 73 20 65 7d 20 24   foreach {s e} $
1f60: 76 61 6c 20 62 72 65 61 6b 0a 20 20 20 20 73 65  val break.    se
1f70: 74 20 72 65 73 28 6c 61 73 74 76 61 6c 29 20 5b  t res(lastval) [
1f80: 73 74 72 69 6e 67 20 72 61 6e 67 65 20 24 64 61  string range $da
1f90: 74 61 20 24 73 20 24 65 5d 0a 20 20 20 20 23 70  ta $s $e].    #p
1fa0: 75 74 73 20 47 7c 24 72 65 73 28 6c 61 73 74 76  uts G|$res(lastv
1fb0: 61 6c 29 0a 20 20 20 20 72 65 74 75 72 6e 0a 7d  al).    return.}
1fc0: 0a 0a 70 72 6f 63 20 3a 3a 76 63 3a 3a 72 63 73  ..proc ::vc::rcs
1fd0: 3a 3a 70 61 72 73 65 72 3a 3a 4e 65 78 74 20 7b  ::parser::Next {
1fe0: 7d 20 7b 0a 20 20 20 20 75 70 76 61 72 20 31 20  } {.    upvar 1 
1ff0: 6d 61 74 63 68 20 6d 61 74 63 68 20 64 61 74 61  match match data
2000: 20 64 61 74 61 20 72 65 73 20 72 65 73 0a 20 20   data res res.  
2010: 20 20 66 6f 72 65 61 63 68 20 7b 73 20 65 7d 20    foreach {s e} 
2020: 24 6d 61 74 63 68 20 62 72 65 61 6b 20 3b 20 69  $match break ; i
2030: 6e 63 72 20 65 0a 20 20 20 20 73 65 74 20 64 61  ncr e.    set da
2040: 74 61 20 5b 73 74 72 69 6e 67 20 72 61 6e 67 65  ta [string range
2050: 20 24 64 61 74 61 20 24 65 20 65 6e 64 5d 0a 20   $data $e end]. 
2060: 20 20 20 73 65 74 20 72 65 73 28 64 6f 6e 65 29     set res(done)
2070: 20 5b 65 78 70 72 20 7b 24 72 65 73 28 73 69 7a   [expr {$res(siz
2080: 65 29 20 2d 20 5b 73 74 72 69 6e 67 20 6c 65 6e  e) - [string len
2090: 67 74 68 20 24 64 61 74 61 5d 7d 5d 0a 0a 20 20  gth $data]}]..  
20a0: 20 20 70 72 6f 67 72 65 73 73 20 32 20 72 63 73    progress 2 rcs
20b0: 20 24 72 65 73 28 64 6f 6e 65 29 20 24 72 65 73   $res(done) $res
20c0: 28 73 69 7a 65 29 0a 20 20 20 20 72 65 74 75 72  (size).    retur
20d0: 6e 0a 7d 0a 0a 23 20 2d 2d 2d 2d 2d 2d 2d 2d 2d  n.}..# ---------
20e0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
20f0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
2100: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
2110: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
2120: 2d 2d 2d 2d 0a 0a 6e 61 6d 65 73 70 61 63 65 20  ----..namespace 
2130: 65 76 61 6c 20 3a 3a 76 63 3a 3a 72 63 73 3a 3a  eval ::vc::rcs::
2140: 70 61 72 73 65 72 20 7b 0a 20 20 20 20 76 61 72  parser {.    var
2150: 69 61 62 6c 65 20 63 61 63 68 65 20 30 20 3b 20  iable cache 0 ; 
2160: 23 20 4e 6f 20 72 65 73 75 6c 74 20 63 61 63 68  # No result cach
2170: 69 6e 67 20 62 79 20 64 65 66 61 75 6c 74 2e 0a  ing by default..
2180: 0a 20 20 20 20 6e 61 6d 65 73 70 61 63 65 20 65  .    namespace e
2190: 78 70 6f 72 74 20 70 72 6f 63 65 73 73 20 63 6f  xport process co
21a0: 6e 66 69 67 75 72 65 0a 7d 0a 0a 23 20 2d 2d 2d  nfigure.}..# ---
21b0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
21c0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
21d0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
21e0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
21f0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 23 20 52 65 61  ----------.# Rea
2200: 64 79 0a 0a 70 61 63 6b 61 67 65 20 70 72 6f 76  dy..package prov
2210: 69 64 65 20 76 63 3a 3a 72 63 73 3a 3a 70 61 72  ide vc::rcs::par
2220: 73 65 72 20 31 2e 30 0a 72 65 74 75 72 6e 0a     ser 1.0.return.