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.