Artifact ec0acbb634f5b9fbd8184f8f6f3d43cdf9dc5080:
File
tools/lib/rcsparser.tcl
part of check-in
[df91d389d5]
- First semi-complete app for import from CVS. Trunk only, wholesale only.
by
aku on
2007-09-04 05:36:56.
0000: 0a 23 20 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 2d ----------------
0050: 0a 23 20 50 61 72 73 65 20 52 43 53 20 66 69 6c .# Parse RCS fil
0060: 65 73 20 28 2c 76 29 20 2d 20 69 67 6e 6f 72 65 es (,v) - ignore
0070: 20 74 68 65 20 64 65 6c 74 61 73 20 2d 20 77 65 the deltas - we
0080: 20 6e 65 65 64 20 6f 6e 6c 79 20 74 68 65 20 63 need only the c
0090: 6f 6d 6d 69 74 20 6d 65 73 73 61 67 65 73 0a 23 ommit messages.#
00a0: 20 52 65 63 75 72 73 69 76 65 20 44 65 73 63 65 Recursive Desce
00b0: 6e 74 20 50 61 72 73 65 72 0a 0a 23 20 2d 2d 2d nt Parser..# ---
00c0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
00d0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
00e0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
00f0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
0100: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 23 20 52 65 71 ----------.# Req
0110: 75 69 72 65 6d 65 6e 74 73 0a 0a 70 61 63 6b 61 uirements..packa
0120: 67 65 20 72 65 71 75 69 72 65 20 54 63 6c 20 38 ge require Tcl 8
0130: 2e 34 0a 70 61 63 6b 61 67 65 20 72 65 71 75 69 .4.package requi
0140: 72 65 20 66 69 6c 65 75 74 69 6c 20 3b 20 23 20 re fileutil ; #
0150: 54 63 6c 6c 69 62 20 28 63 61 74 29 0a 0a 6e 61 Tcllib (cat)..na
0160: 6d 65 73 70 61 63 65 20 65 76 61 6c 20 3a 3a 72 mespace eval ::r
0170: 63 73 70 61 72 73 65 72 20 7b 7d 0a 0a 23 20 2d csparser {}..# -
0180: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
0190: 2d 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 0a 23 20 41 ------------.# A
01d0: 50 49 0a 0a 70 72 6f 63 20 3a 3a 72 63 73 70 61 PI..proc ::rcspa
01e0: 72 73 65 72 3a 3a 66 65 65 64 62 61 63 6b 20 7b rser::feedback {
01f0: 6c 6f 67 63 6d 64 7d 20 7b 0a 20 20 20 20 76 61 logcmd} {. va
0200: 72 69 61 62 6c 65 20 6c 63 20 24 6c 6f 67 63 6d riable lc $logcm
0210: 64 0a 20 20 20 20 72 65 74 75 72 6e 0a 7d 0a 0a d. return.}..
0220: 70 72 6f 63 20 3a 3a 72 63 73 70 61 72 73 65 72 proc ::rcsparser
0230: 3a 3a 70 72 6f 63 65 73 73 20 7b 70 61 74 68 7d ::process {path}
0240: 20 7b 0a 20 20 20 20 73 65 74 20 64 61 74 61 20 {. set data
0250: 5b 66 69 6c 65 75 74 69 6c 3a 3a 63 61 74 20 2d [fileutil::cat -
0260: 65 6e 63 6f 64 69 6e 67 20 62 69 6e 61 72 79 20 encoding binary
0270: 24 70 61 74 68 5d 0a 20 20 20 20 61 72 72 61 79 $path]. array
0280: 20 73 65 74 20 72 65 73 20 7b 7d 0a 20 20 20 20 set res {}.
0290: 73 65 74 20 72 65 73 28 73 69 7a 65 29 20 5b 66 set res(size) [f
02a0: 69 6c 65 20 73 69 7a 65 20 24 70 61 74 68 5d 0a ile size $path].
02b0: 20 20 20 20 73 65 74 20 72 65 73 28 64 6f 6e 65 set res(done
02c0: 29 20 30 0a 20 20 20 20 73 65 74 20 72 65 73 28 ) 0. set res(
02d0: 6e 73 69 7a 65 29 20 5b 73 74 72 69 6e 67 20 6c nsize) [string l
02e0: 65 6e 67 74 68 20 24 72 65 73 28 73 69 7a 65 29 ength $res(size)
02f0: 5d 0a 0a 20 20 20 20 41 64 6d 69 6e 0a 20 20 20 ].. Admin.
0300: 20 44 65 6c 74 61 73 0a 20 20 20 20 44 65 73 63 Deltas. Desc
0310: 72 69 70 74 69 6f 6e 0a 20 20 20 20 44 65 6c 74 ription. Delt
0320: 61 54 65 78 74 73 0a 0a 20 20 20 20 46 65 65 64 aTexts.. Feed
0330: 62 61 63 6b 20 5c 72 0a 0a 20 20 20 20 23 20 52 back \r.. # R
0340: 65 6d 6f 76 65 20 70 61 72 73 65 72 20 73 74 61 emove parser sta
0350: 74 65 0a 20 20 20 20 63 61 74 63 68 20 7b 75 6e te. catch {un
0360: 73 65 74 20 72 65 73 28 69 64 29 7d 0a 20 20 20 set res(id)}.
0370: 20 63 61 74 63 68 20 7b 75 6e 73 65 74 20 72 65 catch {unset re
0380: 73 28 6c 61 73 74 76 61 6c 29 7d 0a 20 20 20 20 s(lastval)}.
0390: 75 6e 73 65 74 20 72 65 73 28 73 69 7a 65 29 0a unset res(size).
03a0: 20 20 20 20 75 6e 73 65 74 20 72 65 73 28 6e 73 unset res(ns
03b0: 69 7a 65 29 0a 20 20 20 20 75 6e 73 65 74 20 72 ize). unset r
03c0: 65 73 28 64 6f 6e 65 29 0a 0a 20 20 20 20 23 20 es(done).. #
03d0: 72 65 73 3a 20 27 68 65 61 64 27 20 20 20 20 2d res: 'head' -
03e0: 3e 20 68 65 61 64 20 72 65 76 69 73 69 6f 6e 0a > head revision.
03f0: 20 20 20 20 23 20 20 20 20 20 20 27 62 72 61 6e # 'bran
0400: 63 68 27 20 20 2d 3e 20 3f 0a 20 20 20 20 23 20 ch' -> ?. #
0410: 20 20 20 20 20 27 73 79 6d 62 6f 6c 27 20 20 2d 'symbol' -
0420: 3e 20 28 73 79 6d 20 2d 3e 20 72 65 76 69 73 69 > (sym -> revisi
0430: 6f 6e 29 0a 20 20 20 20 23 20 20 20 20 20 20 27 on). # '
0440: 6c 6f 63 6b 27 20 20 20 20 2d 3e 20 28 73 79 6d lock' -> (sym
0450: 20 2d 3e 20 72 65 76 69 73 69 6f 6e 29 0a 20 20 -> revision).
0460: 20 20 23 20 20 20 20 20 20 27 63 6f 6d 6d 65 6e # 'commen
0470: 74 27 20 2d 3e 20 66 69 6c 65 20 63 6f 6d 6d 65 t' -> file comme
0480: 6e 74 0a 20 20 20 20 23 20 20 20 20 20 20 27 65 nt. # 'e
0490: 78 70 61 6e 64 27 20 20 2d 3e 20 3f 0a 20 20 20 xpand' -> ?.
04a0: 20 23 20 20 20 20 20 20 27 64 61 74 65 27 20 20 # 'date'
04b0: 20 20 2d 3e 20 28 72 65 76 69 73 69 6f 6e 20 2d -> (revision -
04c0: 3e 20 64 61 74 65 29 0a 20 20 20 20 23 20 20 20 > date). #
04d0: 20 20 20 27 61 75 74 68 6f 72 27 20 20 2d 3e 20 'author' ->
04e0: 28 72 65 76 69 73 69 6f 6e 20 2d 3e 20 61 75 74 (revision -> aut
04f0: 68 6f 72 29 0a 20 20 20 20 23 20 20 20 20 20 20 hor). #
0500: 27 73 74 61 74 65 27 20 20 20 2d 3e 20 28 72 65 'state' -> (re
0510: 76 69 73 69 6f 6e 20 2d 3e 20 73 74 61 74 65 29 vision -> state)
0520: 0a 20 20 20 20 23 20 20 20 20 20 20 27 70 61 72 . # 'par
0530: 65 6e 74 27 20 20 2d 3e 20 28 72 65 76 69 73 69 ent' -> (revisi
0540: 6f 6e 20 2d 3e 20 70 61 72 65 6e 74 20 72 65 76 on -> parent rev
0550: 69 73 69 6f 6e 29 0a 20 20 20 20 23 20 20 20 20 ision). #
0560: 20 20 27 63 6f 6d 6d 69 74 27 20 20 2d 3e 20 28 'commit' -> (
0570: 72 65 76 69 73 69 6f 6e 20 2d 3e 20 63 6f 6d 6d revision -> comm
0580: 69 74 20 6d 65 73 73 61 67 65 29 0a 0a 20 20 20 it message)..
0590: 20 72 65 74 75 72 6e 20 5b 61 72 72 61 79 20 67 return [array g
05a0: 65 74 20 72 65 73 5d 0a 7d 0a 0a 23 20 2d 2d 2d et res].}..# ---
05b0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
05c0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
05d0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
05e0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
05f0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 23 20 49 6e 74 ----------.# Int
0600: 65 72 6e 61 6c 20 68 65 6c 70 65 72 20 63 6f 6d ernal helper com
0610: 6d 61 6e 64 73 0a 0a 70 72 6f 63 20 3a 3a 72 63 mands..proc ::rc
0620: 73 70 61 72 73 65 72 3a 3a 41 64 6d 69 6e 20 7b sparser::Admin {
0630: 7d 20 7b 0a 20 20 20 20 75 70 76 61 72 20 31 20 } {. upvar 1
0640: 64 61 74 61 20 64 61 74 61 20 72 65 73 20 72 65 data data res re
0650: 73 0a 20 20 20 20 48 65 61 64 20 3b 20 42 72 61 s. Head ; Bra
0660: 6e 63 68 20 3b 20 41 63 63 65 73 73 20 3b 20 53 nch ; Access ; S
0670: 79 6d 62 6f 6c 73 20 3b 20 4c 6f 63 6b 73 20 3b ymbols ; Locks ;
0680: 20 53 74 72 69 63 74 20 3b 20 43 6f 6d 6d 65 6e Strict ; Commen
0690: 74 20 3b 20 45 78 70 61 6e 64 0a 20 20 20 20 72 t ; Expand. r
06a0: 65 74 75 72 6e 0a 7d 0a 0a 70 72 6f 63 20 3a 3a eturn.}..proc ::
06b0: 72 63 73 70 61 72 73 65 72 3a 3a 44 65 6c 74 61 rcsparser::Delta
06c0: 73 20 7b 7d 20 7b 0a 20 20 20 20 75 70 76 61 72 s {} {. upvar
06d0: 20 31 20 64 61 74 61 20 64 61 74 61 20 72 65 73 1 data data res
06e0: 20 72 65 73 0a 20 20 20 20 77 68 69 6c 65 20 7b res. while {
06f0: 5b 4e 75 6d 20 30 5d 7d 20 7b 20 49 73 49 64 65 [Num 0]} { IsIde
0700: 6e 74 20 3b 20 44 61 74 65 20 3b 20 41 75 74 68 nt ; Date ; Auth
0710: 6f 72 20 3b 20 53 74 61 74 65 20 3b 20 42 72 61 or ; State ; Bra
0720: 6e 63 68 65 73 20 3b 20 4e 65 78 74 52 65 76 20 nches ; NextRev
0730: 7d 0a 20 20 20 20 72 65 74 75 72 6e 0a 7d 0a 0a }. return.}..
0740: 70 72 6f 63 20 3a 3a 72 63 73 70 61 72 73 65 72 proc ::rcsparser
0750: 3a 3a 44 65 73 63 72 69 70 74 69 6f 6e 20 7b 7d ::Description {}
0760: 20 7b 0a 20 20 20 20 75 70 76 61 72 20 31 20 64 {. upvar 1 d
0770: 61 74 61 20 64 61 74 61 20 72 65 73 20 72 65 73 ata data res res
0780: 0a 20 20 20 20 4c 69 74 65 72 61 6c 20 64 65 73 . Literal des
0790: 63 0a 20 20 20 20 53 74 72 69 6e 67 20 31 0a 20 c. String 1.
07a0: 20 20 20 44 65 66 20 64 65 73 63 0a 20 20 20 20 Def desc.
07b0: 72 65 74 75 72 6e 0a 7d 0a 0a 70 72 6f 63 20 3a return.}..proc :
07c0: 3a 72 63 73 70 61 72 73 65 72 3a 3a 44 65 6c 74 :rcsparser::Delt
07d0: 61 54 65 78 74 73 20 7b 7d 20 7b 0a 20 20 20 20 aTexts {} {.
07e0: 75 70 76 61 72 20 31 20 64 61 74 61 20 64 61 74 upvar 1 data dat
07f0: 61 20 72 65 73 20 72 65 73 0a 20 20 20 20 77 68 a res res. wh
0800: 69 6c 65 20 7b 5b 4e 75 6d 20 30 5d 7d 20 7b 20 ile {[Num 0]} {
0810: 49 73 49 64 65 6e 74 20 3b 20 4c 6f 67 20 3b 20 IsIdent ; Log ;
0820: 54 65 78 74 20 7d 0a 20 20 20 20 72 65 74 75 72 Text }. retur
0830: 6e 0a 7d 0a 0a 70 72 6f 63 20 3a 3a 72 63 73 70 n.}..proc ::rcsp
0840: 61 72 73 65 72 3a 3a 48 65 61 64 20 7b 7d 20 7b arser::Head {} {
0850: 0a 20 20 20 20 75 70 76 61 72 20 31 20 64 61 74 . upvar 1 dat
0860: 61 20 64 61 74 61 20 72 65 73 20 72 65 73 0a 20 a data res res.
0870: 20 20 20 4c 69 74 65 72 61 6c 20 68 65 61 64 20 Literal head
0880: 3b 20 4e 75 6d 20 31 20 3b 20 4c 69 74 65 72 61 ; Num 1 ; Litera
0890: 6c 20 5c 3b 0a 20 20 20 20 44 65 66 20 68 65 61 l \;. Def hea
08a0: 64 0a 20 20 20 20 72 65 74 75 72 6e 0a 7d 0a 0a d. return.}..
08b0: 70 72 6f 63 20 3a 3a 72 63 73 70 61 72 73 65 72 proc ::rcsparser
08c0: 3a 3a 42 72 61 6e 63 68 20 7b 7d 20 7b 0a 20 20 ::Branch {} {.
08d0: 20 20 75 70 76 61 72 20 31 20 64 61 74 61 20 64 upvar 1 data d
08e0: 61 74 61 20 72 65 73 20 72 65 73 0a 20 20 20 20 ata res res.
08f0: 69 66 20 7b 21 5b 4c 69 74 65 72 61 6c 20 62 72 if {![Literal br
0900: 61 6e 63 68 20 30 5d 7d 20 72 65 74 75 72 6e 20 anch 0]} return
0910: 3b 20 4e 75 6d 20 31 20 3b 20 4c 69 74 65 72 61 ; Num 1 ; Litera
0920: 6c 20 5c 3b 0a 20 20 20 20 44 65 66 20 62 72 61 l \;. Def bra
0930: 6e 63 68 0a 20 20 20 20 72 65 74 75 72 6e 0a 7d nch. return.}
0940: 0a 0a 70 72 6f 63 20 3a 3a 72 63 73 70 61 72 73 ..proc ::rcspars
0950: 65 72 3a 3a 41 63 63 65 73 73 20 7b 7d 20 7b 0a er::Access {} {.
0960: 20 20 20 20 75 70 76 61 72 20 31 20 64 61 74 61 upvar 1 data
0970: 20 64 61 74 61 20 72 65 73 20 72 65 73 0a 20 20 data res res.
0980: 20 20 4c 69 74 65 72 61 6c 20 61 63 63 65 73 73 Literal access
0990: 20 3b 20 4c 69 74 65 72 61 6c 20 5c 3b 0a 20 20 ; Literal \;.
09a0: 20 20 72 65 74 75 72 6e 0a 7d 0a 0a 70 72 6f 63 return.}..proc
09b0: 20 3a 3a 72 63 73 70 61 72 73 65 72 3a 3a 53 79 ::rcsparser::Sy
09c0: 6d 62 6f 6c 73 20 7b 7d 20 7b 0a 20 20 20 20 75 mbols {} {. u
09d0: 70 76 61 72 20 31 20 64 61 74 61 20 64 61 74 61 pvar 1 data data
09e0: 20 72 65 73 20 72 65 73 0a 20 20 20 20 4c 69 74 res res. Lit
09f0: 65 72 61 6c 20 73 79 6d 62 6f 6c 73 0a 20 20 20 eral symbols.
0a00: 20 77 68 69 6c 65 20 7b 5b 49 64 65 6e 74 5d 7d while {[Ident]}
0a10: 20 7b 20 4e 75 6d 20 31 20 3b 20 4d 61 70 20 73 { Num 1 ; Map s
0a20: 79 6d 62 6f 6c 20 7d 0a 20 20 20 20 4c 69 74 65 ymbol }. Lite
0a30: 72 61 6c 20 5c 3b 0a 20 20 20 20 72 65 74 75 72 ral \;. retur
0a40: 6e 0a 7d 0a 0a 70 72 6f 63 20 3a 3a 72 63 73 70 n.}..proc ::rcsp
0a50: 61 72 73 65 72 3a 3a 4c 6f 63 6b 73 20 7b 7d 20 arser::Locks {}
0a60: 7b 0a 20 20 20 20 75 70 76 61 72 20 31 20 64 61 {. upvar 1 da
0a70: 74 61 20 64 61 74 61 20 72 65 73 20 72 65 73 0a ta data res res.
0a80: 20 20 20 20 4c 69 74 65 72 61 6c 20 6c 6f 63 6b Literal lock
0a90: 73 0a 20 20 20 20 77 68 69 6c 65 20 7b 5b 49 64 s. while {[Id
0aa0: 65 6e 74 5d 7d 20 7b 20 4e 75 6d 20 31 20 3b 20 ent]} { Num 1 ;
0ab0: 4d 61 70 20 6c 6f 63 6b 20 7d 0a 20 20 20 20 4c Map lock }. L
0ac0: 69 74 65 72 61 6c 20 5c 3b 0a 20 20 20 20 72 65 iteral \;. re
0ad0: 74 75 72 6e 0a 7d 0a 0a 70 72 6f 63 20 3a 3a 72 turn.}..proc ::r
0ae0: 63 73 70 61 72 73 65 72 3a 3a 53 74 72 69 63 74 csparser::Strict
0af0: 20 7b 7d 20 7b 0a 20 20 20 20 75 70 76 61 72 20 {} {. upvar
0b00: 31 20 64 61 74 61 20 64 61 74 61 20 72 65 73 20 1 data data res
0b10: 72 65 73 0a 20 20 20 20 69 66 20 7b 21 5b 4c 69 res. if {![Li
0b20: 74 65 72 61 6c 20 73 74 72 69 63 74 20 30 5d 7d teral strict 0]}
0b30: 20 72 65 74 75 72 6e 20 3b 20 4c 69 74 65 72 61 return ; Litera
0b40: 6c 20 5c 3b 0a 20 20 20 20 72 65 74 75 72 6e 0a l \;. return.
0b50: 7d 0a 0a 70 72 6f 63 20 3a 3a 72 63 73 70 61 72 }..proc ::rcspar
0b60: 73 65 72 3a 3a 43 6f 6d 6d 65 6e 74 20 7b 7d 20 ser::Comment {}
0b70: 7b 0a 20 20 20 20 75 70 76 61 72 20 31 20 64 61 {. upvar 1 da
0b80: 74 61 20 64 61 74 61 20 72 65 73 20 72 65 73 0a ta data res res.
0b90: 20 20 20 20 69 66 20 7b 21 5b 4c 69 74 65 72 61 if {![Litera
0ba0: 6c 20 63 6f 6d 6d 65 6e 74 20 30 5d 7d 20 72 65 l comment 0]} re
0bb0: 74 75 72 6e 20 3b 0a 20 20 20 20 69 66 20 7b 21 turn ;. if {!
0bc0: 5b 53 74 72 69 6e 67 20 30 5d 7d 20 72 65 74 75 [String 0]} retu
0bd0: 72 6e 20 3b 0a 20 20 20 20 4c 69 74 65 72 61 6c rn ;. Literal
0be0: 20 5c 3b 0a 20 20 20 20 44 65 66 20 63 6f 6d 6d \;. Def comm
0bf0: 65 6e 74 0a 20 20 20 20 72 65 74 75 72 6e 0a 7d ent. return.}
0c00: 0a 0a 70 72 6f 63 20 3a 3a 72 63 73 70 61 72 73 ..proc ::rcspars
0c10: 65 72 3a 3a 45 78 70 61 6e 64 20 7b 7d 20 7b 0a er::Expand {} {.
0c20: 20 20 20 20 75 70 76 61 72 20 31 20 64 61 74 61 upvar 1 data
0c30: 20 64 61 74 61 20 72 65 73 20 72 65 73 0a 20 20 data res res.
0c40: 20 20 69 66 20 7b 21 5b 4c 69 74 65 72 61 6c 20 if {![Literal
0c50: 65 78 70 61 6e 64 20 30 5d 7d 20 72 65 74 75 72 expand 0]} retur
0c60: 6e 20 3b 0a 20 20 20 20 69 66 20 7b 21 5b 53 74 n ;. if {![St
0c70: 72 69 6e 67 20 30 5d 7d 20 72 65 74 75 72 6e 20 ring 0]} return
0c80: 3b 0a 20 20 20 20 4c 69 74 65 72 61 6c 20 5c 3b ;. Literal \;
0c90: 0a 20 20 20 20 44 65 66 20 65 78 70 61 6e 64 0a . Def expand.
0ca0: 20 20 20 20 72 65 74 75 72 6e 0a 7d 0a 0a 70 72 return.}..pr
0cb0: 6f 63 20 3a 3a 72 63 73 70 61 72 73 65 72 3a 3a oc ::rcsparser::
0cc0: 44 61 74 65 20 7b 7d 20 7b 0a 20 20 20 20 75 70 Date {} {. up
0cd0: 76 61 72 20 31 20 64 61 74 61 20 64 61 74 61 20 var 1 data data
0ce0: 72 65 73 20 72 65 73 0a 20 20 20 20 4c 69 74 65 res res. Lite
0cf0: 72 61 6c 20 64 61 74 65 20 3b 20 4e 75 6d 20 31 ral date ; Num 1
0d00: 20 3b 20 4c 69 74 65 72 61 6c 20 5c 3b 0a 0a 20 ; Literal \;..
0d10: 20 20 20 66 6f 72 65 61 63 68 20 7b 79 72 20 6d foreach {yr m
0d20: 6f 20 64 79 20 68 20 6d 20 73 7d 20 5b 73 70 6c o dy h m s} [spl
0d30: 69 74 20 24 72 65 73 28 6c 61 73 74 76 61 6c 29 it $res(lastval)
0d40: 20 2e 5d 20 62 72 65 61 6b 0a 20 20 20 20 69 66 .] break. if
0d50: 20 7b 24 79 72 20 3c 20 31 30 30 7d 20 7b 69 6e {$yr < 100} {in
0d60: 63 72 20 79 72 20 31 39 30 30 7d 0a 20 20 20 20 cr yr 1900}.
0d70: 73 65 74 20 72 65 73 28 6c 61 73 74 76 61 6c 29 set res(lastval)
0d80: 20 5b 6a 6f 69 6e 20 5b 6c 69 73 74 20 24 79 72 [join [list $yr
0d90: 20 24 6d 6f 20 24 64 79 20 24 68 20 24 6d 20 24 $mo $dy $h $m $
0da0: 73 5d 20 2e 5d 0a 20 20 20 20 4d 61 70 20 64 61 s] .]. Map da
0db0: 74 65 0a 20 20 20 20 72 65 74 75 72 6e 0a 7d 0a te. return.}.
0dc0: 0a 70 72 6f 63 20 3a 3a 72 63 73 70 61 72 73 65 .proc ::rcsparse
0dd0: 72 3a 3a 41 75 74 68 6f 72 20 7b 7d 20 7b 0a 20 r::Author {} {.
0de0: 20 20 20 75 70 76 61 72 20 31 20 64 61 74 61 20 upvar 1 data
0df0: 64 61 74 61 20 72 65 73 20 72 65 73 0a 20 20 20 data res res.
0e00: 20 4c 69 74 65 72 61 6c 20 61 75 74 68 6f 72 20 Literal author
0e10: 3b 20 53 6b 69 70 20 3b 20 4c 69 74 65 72 61 6c ; Skip ; Literal
0e20: 20 5c 3b 20 3b 20 4d 61 70 20 61 75 74 68 6f 72 \; ; Map author
0e30: 0a 20 20 20 20 72 65 74 75 72 6e 0a 7d 0a 0a 70 . return.}..p
0e40: 72 6f 63 20 3a 3a 72 63 73 70 61 72 73 65 72 3a roc ::rcsparser:
0e50: 3a 53 74 61 74 65 20 7b 7d 20 7b 0a 20 20 20 20 :State {} {.
0e60: 75 70 76 61 72 20 31 20 64 61 74 61 20 64 61 74 upvar 1 data dat
0e70: 61 20 72 65 73 20 72 65 73 0a 20 20 20 20 4c 69 a res res. Li
0e80: 74 65 72 61 6c 20 73 74 61 74 65 20 3b 20 53 6b teral state ; Sk
0e90: 69 70 20 3b 20 4c 69 74 65 72 61 6c 20 5c 3b 20 ip ; Literal \;
0ea0: 3b 20 4d 61 70 20 73 74 61 74 65 0a 20 20 20 20 ; Map state.
0eb0: 72 65 74 75 72 6e 0a 7d 0a 0a 70 72 6f 63 20 3a return.}..proc :
0ec0: 3a 72 63 73 70 61 72 73 65 72 3a 3a 42 72 61 6e :rcsparser::Bran
0ed0: 63 68 65 73 20 7b 7d 20 7b 0a 20 20 20 20 75 70 ches {} {. up
0ee0: 76 61 72 20 31 20 64 61 74 61 20 64 61 74 61 20 var 1 data data
0ef0: 72 65 73 20 72 65 73 0a 20 20 20 20 4c 69 74 65 res res. Lite
0f00: 72 61 6c 20 62 72 61 6e 63 68 65 73 20 3b 20 53 ral branches ; S
0f10: 6b 69 70 20 3b 20 4c 69 74 65 72 61 6c 20 5c 3b kip ; Literal \;
0f20: 0a 20 20 20 20 72 65 74 75 72 6e 0a 7d 0a 0a 70 . return.}..p
0f30: 72 6f 63 20 3a 3a 72 63 73 70 61 72 73 65 72 3a roc ::rcsparser:
0f40: 3a 4e 65 78 74 52 65 76 20 7b 7d 20 7b 0a 20 20 :NextRev {} {.
0f50: 20 20 75 70 76 61 72 20 31 20 64 61 74 61 20 64 upvar 1 data d
0f60: 61 74 61 20 72 65 73 20 72 65 73 0a 20 20 20 20 ata res res.
0f70: 4c 69 74 65 72 61 6c 20 6e 65 78 74 20 3b 20 53 Literal next ; S
0f80: 6b 69 70 20 3b 20 4c 69 74 65 72 61 6c 20 5c 3b kip ; Literal \;
0f90: 20 3b 20 4d 61 70 20 70 61 72 65 6e 74 0a 20 20 ; Map parent.
0fa0: 20 20 72 65 74 75 72 6e 0a 7d 0a 0a 70 72 6f 63 return.}..proc
0fb0: 20 3a 3a 72 63 73 70 61 72 73 65 72 3a 3a 4c 6f ::rcsparser::Lo
0fc0: 67 20 7b 7d 20 7b 0a 20 20 20 20 75 70 76 61 72 g {} {. upvar
0fd0: 20 31 20 64 61 74 61 20 64 61 74 61 20 72 65 73 1 data data res
0fe0: 20 72 65 73 0a 20 20 20 20 4c 69 74 65 72 61 6c res. Literal
0ff0: 20 6c 6f 67 20 3b 20 53 74 72 69 6e 67 20 31 20 log ; String 1
1000: 3b 20 4d 61 70 20 63 6f 6d 6d 69 74 0a 20 20 20 ; Map commit.
1010: 20 72 65 74 75 72 6e 0a 7d 0a 0a 70 72 6f 63 20 return.}..proc
1020: 3a 3a 72 63 73 70 61 72 73 65 72 3a 3a 54 65 78 ::rcsparser::Tex
1030: 74 20 7b 7d 20 7b 0a 20 20 20 20 75 70 76 61 72 t {} {. upvar
1040: 20 31 20 64 61 74 61 20 64 61 74 61 20 72 65 73 1 data data res
1050: 20 72 65 73 0a 20 20 20 20 4c 69 74 65 72 61 6c res. Literal
1060: 20 74 65 78 74 20 3b 20 53 74 72 69 6e 67 20 31 text ; String 1
1070: 0a 20 20 20 20 72 65 74 75 72 6e 0a 7d 0a 0a 23 . return.}..#
1080: 20 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ---------------
1090: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
10a0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
10b0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
10c0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 0a --------------..
10d0: 70 72 6f 63 20 3a 3a 72 63 73 70 61 72 73 65 72 proc ::rcsparser
10e0: 3a 3a 49 64 65 6e 74 20 7b 7d 20 7b 0a 20 20 20 ::Ident {} {.
10f0: 20 75 70 76 61 72 20 31 20 64 61 74 61 20 64 61 upvar 1 data da
1100: 74 61 20 72 65 73 20 72 65 73 0a 0a 20 20 20 20 ta res res..
1110: 23 70 75 74 73 20 49 40 3f 3c 5b 73 74 72 69 6e #puts I@?<[strin
1120: 67 20 72 61 6e 67 65 20 24 64 61 74 61 20 30 20 g range $data 0
1130: 31 30 5d 2e 2e 2e 3e 0a 0a 20 20 20 20 69 66 20 10]...>.. if
1140: 7b 5b 72 65 67 65 78 70 20 2d 69 6e 64 69 63 65 {[regexp -indice
1150: 73 20 2d 2d 20 7b 5e 5c 73 2a 3b 5c 73 2a 7d 20 s -- {^\s*;\s*}
1160: 24 64 61 74 61 5d 7d 20 7b 0a 09 72 65 74 75 72 $data]} {..retur
1170: 6e 20 30 0a 20 20 20 20 7d 20 65 6c 73 65 69 66 n 0. } elseif
1180: 20 7b 21 5b 72 65 67 65 78 70 20 2d 69 6e 64 69 {![regexp -indi
1190: 63 65 73 20 2d 2d 20 7b 5e 5c 73 2a 28 5b 5e 3a ces -- {^\s*([^:
11a0: 5d 2a 29 5c 73 2a 3a 5c 73 2a 7d 20 24 64 61 74 ]*)\s*:\s*} $dat
11b0: 61 20 6d 61 74 63 68 20 76 61 6c 5d 7d 20 7b 0a a match val]} {.
11c0: 09 72 65 74 75 72 6e 20 30 0a 20 20 20 20 7d 0a .return 0. }.
11d0: 0a 20 20 20 20 47 65 74 20 24 76 61 6c 20 3b 20 . Get $val ;
11e0: 49 73 49 64 65 6e 74 0a 20 20 20 20 4e 65 78 74 IsIdent. Next
11f0: 0a 20 20 20 20 72 65 74 75 72 6e 20 31 0a 7d 0a . return 1.}.
1200: 0a 70 72 6f 63 20 3a 3a 72 63 73 70 61 72 73 65 .proc ::rcsparse
1210: 72 3a 3a 4c 69 74 65 72 61 6c 20 7b 6e 61 6d 65 r::Literal {name
1220: 20 7b 72 65 71 75 69 72 65 64 20 31 7d 7d 20 7b {required 1}} {
1230: 0a 20 20 20 20 75 70 76 61 72 20 31 20 64 61 74 . upvar 1 dat
1240: 61 20 64 61 74 61 20 72 65 73 20 72 65 73 0a 20 a data res res.
1250: 20 20 20 69 66 20 7b 21 5b 72 65 67 65 78 70 20 if {![regexp
1260: 2d 69 6e 64 69 63 65 73 20 2d 2d 20 22 5e 5c 5c -indices -- "^\\
1270: 73 2a 24 6e 61 6d 65 5c 5c 73 2a 22 20 24 64 61 s*$name\\s*" $da
1280: 74 61 20 6d 61 74 63 68 5d 7d 20 7b 0a 09 69 66 ta match]} {..if
1290: 20 7b 24 72 65 71 75 69 72 65 64 7d 20 7b 0a 09 {$required} {..
12a0: 20 20 20 20 72 65 74 75 72 6e 20 2d 63 6f 64 65 return -code
12b0: 20 65 72 72 6f 72 20 22 45 78 70 65 63 74 65 64 error "Expected
12c0: 20 27 24 6e 61 6d 65 27 20 40 20 27 5b 73 74 72 '$name' @ '[str
12d0: 69 6e 67 20 72 61 6e 67 65 20 24 64 61 74 61 20 ing range $data
12e0: 30 20 33 30 5d 2e 2e 2e 27 22 0a 09 7d 0a 09 72 0 30]...'"..}..r
12f0: 65 74 75 72 6e 20 30 0a 20 20 20 20 7d 0a 0a 20 eturn 0. }..
1300: 20 20 20 4e 65 78 74 0a 20 20 20 20 72 65 74 75 Next. retu
1310: 72 6e 20 31 0a 7d 0a 0a 70 72 6f 63 20 3a 3a 72 rn 1.}..proc ::r
1320: 63 73 70 61 72 73 65 72 3a 3a 53 74 72 69 6e 67 csparser::String
1330: 20 7b 7b 72 65 71 75 69 72 65 64 20 31 7d 7d 20 {{required 1}}
1340: 7b 0a 20 20 20 20 75 70 76 61 72 20 31 20 64 61 {. upvar 1 da
1350: 74 61 20 64 61 74 61 20 72 65 73 20 72 65 73 0a ta data res res.
1360: 0a 20 20 20 20 69 66 20 7b 21 5b 72 65 67 65 78 . if {![regex
1370: 70 20 2d 69 6e 64 69 63 65 73 20 2d 2d 20 7b 5e p -indices -- {^
1380: 5c 73 2a 40 28 28 5b 5e 40 5d 2a 28 40 40 29 2a \s*@(([^@]*(@@)*
1390: 29 2a 29 40 5c 73 2a 7d 20 24 64 61 74 61 20 6d )*)@\s*} $data m
13a0: 61 74 63 68 20 76 61 6c 5d 7d 20 7b 0a 09 69 66 atch val]} {..if
13b0: 20 7b 24 72 65 71 75 69 72 65 64 7d 20 7b 0a 09 {$required} {..
13c0: 20 20 20 20 72 65 74 75 72 6e 20 2d 63 6f 64 65 return -code
13d0: 20 65 72 72 6f 72 20 22 45 78 70 65 63 74 65 64 error "Expected
13e0: 20 73 74 72 69 6e 67 20 40 20 27 5b 73 74 72 69 string @ '[stri
13f0: 6e 67 20 72 61 6e 67 65 20 24 64 61 74 61 20 30 ng range $data 0
1400: 20 33 30 5d 2e 2e 2e 27 22 0a 09 7d 0a 09 72 65 30]...'"..}..re
1410: 74 75 72 6e 20 30 0a 20 20 20 20 7d 0a 0a 20 20 turn 0. }..
1420: 20 20 47 65 74 20 24 76 61 6c 0a 20 20 20 20 4e Get $val. N
1430: 65 78 74 0a 20 20 20 20 72 65 74 75 72 6e 20 31 ext. return 1
1440: 0a 7d 0a 0a 70 72 6f 63 20 3a 3a 72 63 73 70 61 .}..proc ::rcspa
1450: 72 73 65 72 3a 3a 4e 75 6d 20 7b 72 65 71 75 69 rser::Num {requi
1460: 72 65 64 7d 20 7b 0a 20 20 20 20 75 70 76 61 72 red} {. upvar
1470: 20 31 20 64 61 74 61 20 64 61 74 61 20 72 65 73 1 data data res
1480: 20 72 65 73 0a 20 20 20 20 69 66 20 7b 21 5b 72 res. if {![r
1490: 65 67 65 78 70 20 2d 69 6e 64 69 63 65 73 20 2d egexp -indices -
14a0: 2d 20 7b 5e 5c 73 2a 28 28 5c 64 7c 5c 2e 29 2b - {^\s*((\d|\.)+
14b0: 29 5c 73 2a 7d 20 24 64 61 74 61 20 6d 61 74 63 )\s*} $data matc
14c0: 68 20 76 61 6c 5d 7d 20 7b 0a 09 69 66 20 7b 24 h val]} {..if {$
14d0: 72 65 71 75 69 72 65 64 7d 20 7b 0a 09 20 20 20 required} {..
14e0: 20 72 65 74 75 72 6e 20 2d 63 6f 64 65 20 65 72 return -code er
14f0: 72 6f 72 20 22 45 78 70 65 63 74 65 64 20 69 64 ror "Expected id
1500: 20 40 20 27 5b 73 74 72 69 6e 67 20 72 61 6e 67 @ '[string rang
1510: 65 20 24 64 61 74 61 20 30 20 33 30 5d 2e 2e 2e e $data 0 30]...
1520: 27 22 0a 09 7d 0a 09 72 65 74 75 72 6e 20 30 0a '"..}..return 0.
1530: 20 20 20 20 7d 0a 0a 20 20 20 20 47 65 74 20 24 }.. Get $
1540: 76 61 6c 0a 20 20 20 20 4e 65 78 74 0a 20 20 20 val. Next.
1550: 20 72 65 74 75 72 6e 20 31 0a 7d 0a 0a 70 72 6f return 1.}..pro
1560: 63 20 3a 3a 72 63 73 70 61 72 73 65 72 3a 3a 53 c ::rcsparser::S
1570: 6b 69 70 20 7b 7d 20 7b 0a 20 20 20 20 75 70 76 kip {} {. upv
1580: 61 72 20 31 20 64 61 74 61 20 64 61 74 61 20 72 ar 1 data data r
1590: 65 73 20 72 65 73 0a 20 20 20 20 72 65 67 65 78 es res. regex
15a0: 70 20 2d 69 6e 64 69 63 65 73 20 2d 2d 20 7b 5e p -indices -- {^
15b0: 5c 73 2a 28 5b 5e 3b 5d 2a 29 5c 73 2a 7d 20 24 \s*([^;]*)\s*} $
15c0: 64 61 74 61 20 6d 61 74 63 68 20 76 61 6c 0a 20 data match val.
15d0: 20 20 20 47 65 74 20 24 76 61 6c 0a 20 20 20 20 Get $val.
15e0: 4e 65 78 74 0a 20 20 20 20 72 65 74 75 72 6e 0a Next. return.
15f0: 7d 0a 0a 70 72 6f 63 20 3a 3a 72 63 73 70 61 72 }..proc ::rcspar
1600: 73 65 72 3a 3a 44 65 66 20 7b 6b 65 79 7d 20 7b ser::Def {key} {
1610: 0a 20 20 20 20 75 70 76 61 72 20 31 20 64 61 74 . upvar 1 dat
1620: 61 20 64 61 74 61 20 72 65 73 20 72 65 73 0a 20 a data res res.
1630: 20 20 20 73 65 74 20 72 65 73 28 24 6b 65 79 29 set res($key)
1640: 20 24 72 65 73 28 6c 61 73 74 76 61 6c 29 0a 20 $res(lastval).
1650: 20 20 20 75 6e 73 65 74 20 72 65 73 28 6c 61 73 unset res(las
1660: 74 76 61 6c 29 0a 20 20 20 20 72 65 74 75 72 6e tval). return
1670: 0a 7d 0a 0a 70 72 6f 63 20 3a 3a 72 63 73 70 61 .}..proc ::rcspa
1680: 72 73 65 72 3a 3a 4d 61 70 20 7b 6b 65 79 7d 20 rser::Map {key}
1690: 7b 0a 20 20 20 20 75 70 76 61 72 20 31 20 64 61 {. upvar 1 da
16a0: 74 61 20 64 61 74 61 20 72 65 73 20 72 65 73 0a ta data res res.
16b0: 20 20 20 20 6c 61 70 70 65 6e 64 20 72 65 73 28 lappend res(
16c0: 24 6b 65 79 29 20 24 72 65 73 28 69 64 29 20 24 $key) $res(id) $
16d0: 72 65 73 28 6c 61 73 74 76 61 6c 29 0a 20 20 20 res(lastval).
16e0: 20 23 70 75 74 73 20 4d 61 70 28 24 72 65 73 28 #puts Map($res(
16f0: 69 64 29 29 3d 28 24 72 65 73 28 6c 61 73 74 76 id))=($res(lastv
1700: 61 6c 29 29 0a 20 20 20 20 75 6e 73 65 74 20 72 al)). unset r
1710: 65 73 28 6c 61 73 74 76 61 6c 29 0a 20 20 20 20 es(lastval).
1720: 23 75 6e 73 65 74 20 72 65 73 28 69 64 29 3b 23 #unset res(id);#
1730: 4b 65 65 70 20 69 64 20 66 6f 72 20 61 64 64 69 Keep id for addi
1740: 74 69 6f 6e 61 6c 20 6d 61 70 70 69 6e 67 73 2e tional mappings.
1750: 0a 20 20 20 20 72 65 74 75 72 6e 0a 7d 0a 0a 70 . return.}..p
1760: 72 6f 63 20 3a 3a 72 63 73 70 61 72 73 65 72 3a roc ::rcsparser:
1770: 3a 49 73 49 64 65 6e 74 20 7b 7d 20 7b 0a 20 20 :IsIdent {} {.
1780: 20 20 75 70 76 61 72 20 31 20 64 61 74 61 20 64 upvar 1 data d
1790: 61 74 61 20 72 65 73 20 72 65 73 0a 20 20 20 20 ata res res.
17a0: 73 65 74 20 72 65 73 28 69 64 29 20 24 72 65 73 set res(id) $res
17b0: 28 6c 61 73 74 76 61 6c 29 0a 20 20 20 20 75 6e (lastval). un
17c0: 73 65 74 20 72 65 73 28 6c 61 73 74 76 61 6c 29 set res(lastval)
17d0: 0a 20 20 20 20 72 65 74 75 72 6e 0a 7d 0a 0a 70 . return.}..p
17e0: 72 6f 63 20 3a 3a 72 63 73 70 61 72 73 65 72 3a roc ::rcsparser:
17f0: 3a 47 65 74 20 7b 76 61 6c 7d 20 7b 0a 20 20 20 :Get {val} {.
1800: 20 75 70 76 61 72 20 31 20 64 61 74 61 20 64 61 upvar 1 data da
1810: 74 61 20 72 65 73 20 72 65 73 0a 20 20 20 20 66 ta res res. f
1820: 6f 72 65 61 63 68 20 7b 73 20 65 7d 20 24 76 61 oreach {s e} $va
1830: 6c 20 62 72 65 61 6b 0a 20 20 20 20 73 65 74 20 l break. set
1840: 72 65 73 28 6c 61 73 74 76 61 6c 29 20 5b 73 74 res(lastval) [st
1850: 72 69 6e 67 20 72 61 6e 67 65 20 24 64 61 74 61 ring range $data
1860: 20 24 73 20 24 65 5d 0a 20 20 20 20 23 70 75 74 $s $e]. #put
1870: 73 20 47 7c 24 72 65 73 28 6c 61 73 74 76 61 6c s G|$res(lastval
1880: 29 0a 20 20 20 20 72 65 74 75 72 6e 0a 7d 0a 0a ). return.}..
1890: 70 72 6f 63 20 3a 3a 72 63 73 70 61 72 73 65 72 proc ::rcsparser
18a0: 3a 3a 4e 65 78 74 20 7b 7d 20 7b 0a 20 20 20 20 ::Next {} {.
18b0: 75 70 76 61 72 20 31 20 6d 61 74 63 68 20 6d 61 upvar 1 match ma
18c0: 74 63 68 20 64 61 74 61 20 64 61 74 61 20 72 65 tch data data re
18d0: 73 20 72 65 73 0a 20 20 20 20 66 6f 72 65 61 63 s res. foreac
18e0: 68 20 7b 73 20 65 7d 20 24 6d 61 74 63 68 20 62 h {s e} $match b
18f0: 72 65 61 6b 20 3b 20 69 6e 63 72 20 65 0a 20 20 reak ; incr e.
1900: 20 20 73 65 74 20 64 61 74 61 20 5b 73 74 72 69 set data [stri
1910: 6e 67 20 72 61 6e 67 65 20 24 64 61 74 61 20 24 ng range $data $
1920: 65 20 65 6e 64 5d 0a 20 20 20 20 73 65 74 20 72 e end]. set r
1930: 65 73 28 64 6f 6e 65 29 20 5b 65 78 70 72 20 7b es(done) [expr {
1940: 24 72 65 73 28 73 69 7a 65 29 20 2d 20 5b 73 74 $res(size) - [st
1950: 72 69 6e 67 20 6c 65 6e 67 74 68 20 24 64 61 74 ring length $dat
1960: 61 5d 7d 5d 0a 0a 20 20 20 20 46 65 65 64 62 61 a]}].. Feedba
1970: 63 6b 20 22 5c 72 20 20 20 20 5b 66 6f 72 6d 61 ck "\r [forma
1980: 74 20 22 25 24 72 65 73 28 6e 73 69 7a 65 29 73 t "%$res(nsize)s
1990: 22 20 24 72 65 73 28 64 6f 6e 65 29 5d 2f 24 72 " $res(done)]/$r
19a0: 65 73 28 73 69 7a 65 29 20 22 0a 20 20 20 20 72 es(size) ". r
19b0: 65 74 75 72 6e 0a 7d 0a 0a 23 20 2d 2d 2d 2d 2d eturn.}..# -----
19c0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
19d0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
19e0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
19f0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
1a00: 2d 2d 2d 2d 2d 2d 2d 2d 0a 0a 6e 61 6d 65 73 70 --------..namesp
1a10: 61 63 65 20 65 76 61 6c 20 3a 3a 72 63 73 70 61 ace eval ::rcspa
1a20: 72 73 65 72 20 7b 0a 20 20 20 20 76 61 72 69 61 rser {. varia
1a30: 62 6c 65 20 6c 63 20 3a 3a 72 63 73 3a 3a 4e 6f ble lc ::rcs::No
1a40: 70 0a 7d 0a 0a 70 72 6f 63 20 3a 3a 72 63 73 70 p.}..proc ::rcsp
1a50: 61 72 73 65 72 3a 3a 46 65 65 64 62 61 63 6b 20 arser::Feedback
1a60: 7b 74 65 78 74 7d 20 7b 0a 20 20 20 20 76 61 72 {text} {. var
1a70: 69 61 62 6c 65 20 6c 63 0a 20 20 20 20 75 70 6c iable lc. upl
1a80: 65 76 65 6c 20 23 30 20 5b 6c 69 6e 73 65 72 74 evel #0 [linsert
1a90: 20 24 6c 63 20 65 6e 64 20 69 6e 66 6f 20 24 74 $lc end info $t
1aa0: 65 78 74 5d 0a 20 20 20 20 72 65 74 75 72 6e 0a ext]. return.
1ab0: 7d 0a 0a 70 72 6f 63 20 3a 3a 72 63 73 70 61 72 }..proc ::rcspar
1ac0: 73 65 72 3a 3a 4e 6f 70 20 7b 61 72 67 73 7d 20 ser::Nop {args}
1ad0: 7b 7d 0a 0a 23 20 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d {}..# ----------
1ae0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
1af0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
1b00: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
1b10: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
1b20: 2d 2d 2d 0a 23 20 52 65 61 64 79 0a 0a 70 61 63 ---.# Ready..pac
1b30: 6b 61 67 65 20 70 72 6f 76 69 64 65 20 72 63 73 kage provide rcs
1b40: 70 61 72 73 65 72 20 31 2e 30 0a 72 65 74 75 72 parser 1.0.retur
1b50: 6e 0a n.