Hex Artifact Content
Not logged in

Artifact 93e4a1e5a55baba7b897dd6af2745f374b18af15:

File tools/cvs2fossil/lib/rcsparser.tcl part of check-in [38b967dcf5] - Merge aku's CVS import changes into the main line. Fix a small bug in diff.c. by drh on 2007-11-17 00:29:42. Also file tools/cvs2fossil/lib/rcsparser.tcl part of check-in [fa643aa91d] - Disabled check for control characters in the log message. Allowing this for the moment, lets see if we run into trouble later on. Further reworked the check of symbol names, disallow forward slashs only at end. Found legal tags containing forward slashs in the middle. by aku on 2007-10-24 07:54:01.

0000: 23 23 20 2d 2a 2d 20 74 63 6c 20 2d 2a 2d 0a 23  ## -*- tcl -*-.#
0010: 20 23 20 23 23 20 23 23 23 20 23 23 23 23 23 20   # ## ### ##### 
0020: 23 23 23 23 23 23 23 23 20 23 23 23 23 23 23 23  ######## #######
0030: 23 23 23 23 23 23 20 23 23 23 23 23 23 23 23 23  ###### #########
0040: 23 23 23 23 23 23 23 23 23 23 23 23 0a 23 23 20  ############.## 
0050: 43 6f 70 79 72 69 67 68 74 20 28 63 29 20 32 30  Copyright (c) 20
0060: 30 37 20 41 6e 64 72 65 61 73 20 4b 75 70 72 69  07 Andreas Kupri
0070: 65 73 2e 0a 23 0a 23 20 54 68 69 73 20 73 6f 66  es..#.# This sof
0080: 74 77 61 72 65 20 69 73 20 6c 69 63 65 6e 73 65  tware is license
0090: 64 20 61 73 20 64 65 73 63 72 69 62 65 64 20 69  d as described i
00a0: 6e 20 74 68 65 20 66 69 6c 65 20 4c 49 43 45 4e  n the file LICEN
00b0: 53 45 2c 20 77 68 69 63 68 0a 23 20 79 6f 75 20  SE, which.# you 
00c0: 73 68 6f 75 6c 64 20 68 61 76 65 20 72 65 63 65  should have rece
00d0: 69 76 65 64 20 61 73 20 70 61 72 74 20 6f 66 20  ived as part of 
00e0: 74 68 69 73 20 64 69 73 74 72 69 62 75 74 69 6f  this distributio
00f0: 6e 2e 0a 23 0a 23 20 54 68 69 73 20 73 6f 66 74  n..#.# This soft
0100: 77 61 72 65 20 63 6f 6e 73 69 73 74 73 20 6f 66  ware consists of
0110: 20 76 6f 6c 75 6e 74 61 72 79 20 63 6f 6e 74 72   voluntary contr
0120: 69 62 75 74 69 6f 6e 73 20 6d 61 64 65 20 62 79  ibutions made by
0130: 20 6d 61 6e 79 0a 23 20 69 6e 64 69 76 69 64 75   many.# individu
0140: 61 6c 73 2e 20 20 46 6f 72 20 65 78 61 63 74 20  als.  For exact 
0150: 63 6f 6e 74 72 69 62 75 74 69 6f 6e 20 68 69 73  contribution his
0160: 74 6f 72 79 2c 20 73 65 65 20 74 68 65 20 72 65  tory, see the re
0170: 76 69 73 69 6f 6e 0a 23 20 68 69 73 74 6f 72 79  vision.# history
0180: 20 61 6e 64 20 6c 6f 67 73 2c 20 61 76 61 69 6c   and logs, avail
0190: 61 62 6c 65 20 61 74 20 68 74 74 70 3a 2f 2f 66  able at http://f
01a0: 6f 73 73 69 6c 2d 73 63 6d 2e 68 77 61 63 69 2e  ossil-scm.hwaci.
01b0: 63 6f 6d 2f 66 6f 73 73 69 6c 0a 23 20 23 20 23  com/fossil.# # #
01c0: 23 20 23 23 23 20 23 23 23 23 23 20 23 23 23 23  # ### ##### ####
01d0: 23 23 23 23 20 23 23 23 23 23 23 23 23 23 23 23  #### ###########
01e0: 23 23 20 23 23 23 23 23 23 23 23 23 23 23 23 23  ## #############
01f0: 23 23 23 23 23 23 23 23 0a 0a 23 20 41 20 74 6f  ########..# A to
0200: 6f 6c 20 70 61 63 6b 61 67 65 2c 20 70 72 6f 76  ol package, prov
0210: 69 64 65 73 20 61 20 70 61 72 73 65 72 20 66 6f  ides a parser fo
0220: 72 20 52 43 53 20 61 72 63 68 69 76 65 20 66 69  r RCS archive fi
0230: 6c 65 73 2e 20 54 68 69 73 20 70 61 72 73 65 72  les. This parser
0240: 0a 23 20 69 73 20 69 6d 70 6c 65 6d 65 6e 74 65  .# is implemente
0250: 64 20 76 69 61 20 72 65 63 75 72 73 69 76 65 20  d via recursive 
0260: 64 65 73 63 65 6e 74 2e 20 49 74 20 69 73 20 6e  descent. It is n
0270: 6f 74 20 6f 6e 6c 79 20 67 69 76 65 6e 20 61 20  ot only given a 
0280: 66 69 6c 65 20 74 6f 0a 23 20 70 72 6f 63 65 73  file to.# proces
0290: 73 2c 20 62 75 74 20 61 6c 73 6f 20 61 20 27 73  s, but also a 's
02a0: 69 6e 6b 27 2c 20 61 6e 20 6f 62 6a 65 63 74 20  ink', an object 
02b0: 69 74 20 63 61 6c 6c 73 20 6f 75 74 20 74 6f 20  it calls out to 
02c0: 61 74 20 69 6d 70 6f 72 74 61 6e 74 0a 23 20 70  at important.# p
02d0: 6c 61 63 65 73 20 6f 66 20 74 68 65 20 70 61 72  laces of the par
02e0: 73 69 6e 67 20 70 72 6f 63 65 73 73 20 74 6f 20  sing process to 
02f0: 65 69 74 68 65 72 20 73 69 67 6e 61 6c 20 61 6e  either signal an
0300: 20 65 76 65 6e 74 20 61 6e 64 2f 6f 72 0a 23 20   event and/or.# 
0310: 63 6f 6e 76 65 79 20 67 61 74 68 65 72 65 64 20  convey gathered 
0320: 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 74 6f 20 69  information to i
0330: 74 2e 20 54 68 65 20 73 69 6e 6b 20 69 73 20 72  t. The sink is r
0340: 65 73 70 6f 6e 73 69 62 6c 65 20 66 6f 72 20 74  esponsible for t
0350: 68 65 0a 23 20 61 63 74 75 61 6c 20 70 72 6f 63  he.# actual proc
0360: 65 73 73 69 6e 67 20 6f 66 20 74 68 65 20 64 61  essing of the da
0370: 74 61 20 69 6e 20 77 68 61 74 65 76 65 72 20 77  ta in whatever w
0380: 61 79 20 69 74 20 64 65 73 69 72 65 73 2e 0a 0a  ay it desires...
0390: 23 20 23 20 23 23 20 23 23 23 20 23 23 23 23 23  # # ## ### #####
03a0: 20 23 23 23 23 23 23 23 23 20 23 23 23 23 23 23   ######## ######
03b0: 23 23 23 23 23 23 23 20 23 23 23 23 23 23 23 23  ####### ########
03c0: 23 23 23 23 23 23 23 23 23 23 23 23 23 0a 23 23  #############.##
03d0: 20 52 65 71 75 69 72 65 6d 65 6e 74 73 0a 0a 70   Requirements..p
03e0: 61 63 6b 61 67 65 20 72 65 71 75 69 72 65 20 54  ackage require T
03f0: 63 6c 20 38 2e 34 20 20 20 20 20 20 20 20 20 20  cl 8.4          
0400: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0410: 20 20 20 3b 20 23 20 52 65 71 75 69 72 65 64 20     ; # Required 
0420: 72 75 6e 74 69 6d 65 2e 0a 70 61 63 6b 61 67 65  runtime..package
0430: 20 72 65 71 75 69 72 65 20 73 6e 69 74 20 20 20   require snit   
0440: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0450: 20 20 20 20 20 20 20 20 20 20 20 20 20 3b 20 23               ; #
0460: 20 4f 4f 20 73 79 73 74 65 6d 2e 0a 70 61 63 6b   OO system..pack
0470: 61 67 65 20 72 65 71 75 69 72 65 20 66 69 6c 65  age require file
0480: 75 74 69 6c 20 20 20 20 20 20 20 20 20 20 20 20  util            
0490: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
04a0: 3b 20 23 20 46 69 6c 65 20 75 74 69 6c 69 74 69  ; # File utiliti
04b0: 65 73 2e 0a 70 61 63 6b 61 67 65 20 72 65 71 75  es..package requ
04c0: 69 72 65 20 76 63 3a 3a 74 6f 6f 6c 73 3a 3a 6c  ire vc::tools::l
04d0: 6f 67 20 20 20 20 20 20 20 20 20 20 20 20 20 20  og              
04e0: 20 20 20 20 20 20 20 20 3b 20 23 20 55 73 65 72          ; # User
04f0: 20 66 65 65 64 62 61 63 6b 2e 0a 70 61 63 6b 61   feedback..packa
0500: 67 65 20 72 65 71 75 69 72 65 20 73 74 72 75 63  ge require struc
0510: 74 3a 3a 6c 69 73 74 20 20 20 20 20 20 20 20 20  t::list         
0520: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 3b                 ;
0530: 20 23 20 41 64 76 61 6e 63 65 64 20 6c 69 73 74   # Advanced list
0540: 20 6f 70 73 2e 0a 0a 23 20 23 20 23 23 20 23 23   ops...# # ## ##
0550: 23 20 23 23 23 23 23 20 23 23 23 23 23 23 23 23  # ##### ########
0560: 20 23 23 23 23 23 23 23 23 23 23 23 23 23 20 23   ############# #
0570: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
0580: 23 23 23 23 0a 23 23 20 0a 0a 73 6e 69 74 3a 3a  ####.## ..snit::
0590: 74 79 70 65 20 3a 3a 76 63 3a 3a 72 63 73 3a 3a  type ::vc::rcs::
05a0: 70 61 72 73 65 72 20 7b 0a 20 20 20 20 23 20 23  parser {.    # #
05b0: 20 23 23 20 23 23 23 20 23 23 23 23 23 20 23 23   ## ### ##### ##
05c0: 23 23 23 23 23 23 20 23 23 23 23 23 23 23 23 23  ###### #########
05d0: 23 23 23 23 0a 20 20 20 20 23 23 20 50 75 62 6c  ####.    ## Publ
05e0: 69 63 20 41 50 49 0a 0a 20 20 20 20 74 79 70 65  ic API..    type
05f0: 6d 65 74 68 6f 64 20 70 72 6f 63 65 73 73 20 7b  method process {
0600: 70 61 74 68 20 73 69 6e 6b 7d 20 7b 0a 09 49 6e  path sink} {..In
0610: 69 74 69 61 6c 69 7a 65 20 24 70 61 74 68 20 24  itialize $path $
0620: 73 69 6e 6b 0a 09 43 61 6c 6c 20 62 65 67 69 6e  sink..Call begin
0630: 0a 09 41 64 6d 69 6e 20 3b 20 44 65 6c 74 61 73  ..Admin ; Deltas
0640: 20 3b 20 44 65 73 63 72 69 70 74 69 6f 6e 20 3b   ; Description ;
0650: 20 44 65 6c 74 61 54 65 78 74 73 0a 09 43 61 6c   DeltaTexts..Cal
0660: 6c 20 64 6f 6e 65 0a 09 72 65 74 75 72 6e 0a 20  l done..return. 
0670: 20 20 20 7d 0a 0a 20 20 20 20 23 20 23 20 23 23     }..    # # ##
0680: 20 23 23 23 20 23 23 23 23 23 20 23 23 23 23 23   ### ##### #####
0690: 23 23 23 20 23 23 23 23 23 23 23 23 23 23 23 23  ### ############
06a0: 23 0a 20 20 20 20 23 23 20 49 6e 74 65 72 6e 61  #.    ## Interna
06b0: 6c 20 6d 65 74 68 6f 64 73 2c 20 72 65 63 75 72  l methods, recur
06c0: 73 69 76 65 20 64 65 73 63 65 6e 74 2c 20 73 79  sive descent, sy
06d0: 6e 74 61 63 74 69 63 61 6c 20 70 72 6f 63 65 73  ntactical proces
06e0: 73 69 6e 67 0a 0a 20 20 20 20 70 72 6f 63 20 41  sing..    proc A
06f0: 64 6d 69 6e 20 7b 7d 20 7b 0a 09 48 65 61 64 20  dmin {} {..Head 
0700: 3b 20 50 72 69 6e 63 69 70 61 6c 42 72 61 6e 63  ; PrincipalBranc
0710: 68 20 3b 20 41 63 63 65 73 73 20 3b 20 53 79 6d  h ; Access ; Sym
0720: 62 6f 6c 73 0a 09 4c 6f 63 6b 73 20 3b 20 53 74  bols..Locks ; St
0730: 72 69 63 74 6e 65 73 73 20 3b 20 46 69 6c 65 43  rictness ; FileC
0740: 6f 6d 6d 65 6e 74 20 3b 20 45 78 70 61 6e 64 0a  omment ; Expand.
0750: 09 43 61 6c 6c 20 61 64 6d 69 6e 64 6f 6e 65 0a  .Call admindone.
0760: 09 72 65 74 75 72 6e 0a 20 20 20 20 7d 0a 0a 20  .return.    }.. 
0770: 20 20 20 23 20 23 20 23 23 20 23 23 23 20 23 23     # # ## ### ##
0780: 23 23 23 20 23 23 23 23 23 23 23 23 20 23 23 23  ### ######## ###
0790: 23 23 23 23 23 23 23 23 23 23 0a 0a 20 20 20 20  ##########..    
07a0: 70 72 6f 63 20 48 65 61 64 20 7b 7d 20 7b 0a 09  proc Head {} {..
07b0: 52 65 71 75 69 72 65 64 4c 69 74 65 72 61 6c 20  RequiredLiteral 
07c0: 68 65 61 64 0a 09 52 65 71 75 69 72 65 64 4e 75  head..RequiredNu
07d0: 6d 62 65 72 20 2d 3e 20 68 65 61 64 0a 09 53 65  mber -> head..Se
07e0: 6d 69 63 6f 6c 6f 6e 0a 09 43 61 6c 6c 20 73 65  micolon..Call se
07f0: 74 68 65 61 64 20 24 68 65 61 64 0a 09 72 65 74  thead $head..ret
0800: 75 72 6e 0a 20 20 20 20 7d 0a 0a 20 20 20 20 70  urn.    }..    p
0810: 72 6f 63 20 50 72 69 6e 63 69 70 61 6c 42 72 61  roc PrincipalBra
0820: 6e 63 68 20 7b 7d 20 7b 0a 09 69 66 20 7b 21 5b  nch {} {..if {![
0830: 4f 70 74 69 6f 6e 61 6c 4c 69 74 65 72 61 6c 20  OptionalLiteral 
0840: 62 72 61 6e 63 68 5d 7d 20 72 65 74 75 72 6e 0a  branch]} return.
0850: 09 52 65 71 75 69 72 65 64 4e 75 6d 62 65 72 20  .RequiredNumber 
0860: 2d 3e 20 62 72 61 6e 63 68 0a 09 53 65 6d 69 63  -> branch..Semic
0870: 6f 6c 6f 6e 0a 09 43 61 6c 6c 20 73 65 74 70 72  olon..Call setpr
0880: 69 6e 63 69 70 61 6c 62 72 61 6e 63 68 20 24 62  incipalbranch $b
0890: 72 61 6e 63 68 0a 09 72 65 74 75 72 6e 0a 20 20  ranch..return.  
08a0: 20 20 7d 0a 0a 20 20 20 20 70 72 6f 63 20 41 63    }..    proc Ac
08b0: 63 65 73 73 20 7b 7d 20 7b 0a 09 52 65 71 75 69  cess {} {..Requi
08c0: 72 65 64 4c 69 74 65 72 61 6c 20 61 63 63 65 73  redLiteral acces
08d0: 73 20 3b 0a 09 53 65 6d 69 63 6f 6c 6f 6e 0a 09  s ;..Semicolon..
08e0: 72 65 74 75 72 6e 0a 20 20 20 20 7d 0a 0a 20 20  return.    }..  
08f0: 20 20 70 72 6f 63 20 53 79 6d 62 6f 6c 73 20 7b    proc Symbols {
0900: 7d 20 7b 0a 09 52 65 71 75 69 72 65 64 4c 69 74  } {..RequiredLit
0910: 65 72 61 6c 20 73 79 6d 62 6f 6c 73 0a 09 77 68  eral symbols..wh
0920: 69 6c 65 20 7b 5b 49 64 65 6e 74 20 2d 3e 20 73  ile {[Ident -> s
0930: 79 6d 62 6f 6c 5d 7d 20 7b 0a 09 20 20 20 20 69  ymbol]} {..    i
0940: 66 20 7b 0a 09 09 21 5b 72 65 67 65 78 70 20 7b  f {...![regexp {
0950: 5e 5c 64 2a 5b 5e 2c 2e 3a 3b 40 24 5d 28 5b 5e  ^\d*[^,.:;@$]([^
0960: 2c 2e 3a 3b 40 24 5d 2a 5c 64 2a 29 2a 24 7d 20  ,.:;@$]*\d*)*$} 
0970: 24 73 79 6d 62 6f 6c 5d 20 7c 7c 0a 09 09 5b 73  $symbol] ||...[s
0980: 74 72 69 6e 67 20 6d 61 74 63 68 20 2a 2f 20 24  tring match */ $
0990: 73 79 6d 62 6f 6c 5d 0a 09 20 20 20 20 7d 20 7b  symbol]..    } {
09a0: 0a 09 09 52 65 77 69 6e 64 0a 09 09 42 61 64 20  ...Rewind...Bad 
09b0: 7b 73 79 6d 62 6f 6c 20 6e 61 6d 65 7d 0a 09 20  {symbol name}.. 
09c0: 20 20 20 7d 0a 09 20 20 20 20 52 65 71 75 69 72     }..    Requir
09d0: 65 64 4e 75 6d 62 65 72 20 2d 3e 20 72 65 76 0a  edNumber -> rev.
09e0: 09 20 20 20 20 43 61 6c 6c 20 64 65 66 74 61 67  .    Call deftag
09f0: 20 24 73 79 6d 62 6f 6c 20 24 72 65 76 0a 09 7d   $symbol $rev..}
0a00: 0a 09 53 65 6d 69 63 6f 6c 6f 6e 0a 09 72 65 74  ..Semicolon..ret
0a10: 75 72 6e 0a 20 20 20 20 7d 0a 0a 20 20 20 20 70  urn.    }..    p
0a20: 72 6f 63 20 4c 6f 63 6b 73 20 7b 7d 20 7b 0a 09  roc Locks {} {..
0a30: 23 20 4e 6f 74 20 73 61 76 69 6e 67 20 6c 6f 63  # Not saving loc
0a40: 6b 73 2e 0a 09 52 65 71 75 69 72 65 64 4c 69 74  ks...RequiredLit
0a50: 65 72 61 6c 20 6c 6f 63 6b 73 0a 09 77 68 69 6c  eral locks..whil
0a60: 65 20 7b 5b 49 64 65 6e 74 20 2d 3e 20 73 79 6d  e {[Ident -> sym
0a70: 62 6f 6c 5d 7d 20 7b 0a 09 20 20 20 20 52 65 71  bol]} {..    Req
0a80: 75 69 72 65 64 4e 75 6d 62 65 72 20 2d 3e 20 6c  uiredNumber -> l
0a90: 0a 09 7d 0a 09 53 65 6d 69 63 6f 6c 6f 6e 0a 09  ..}..Semicolon..
0aa0: 72 65 74 75 72 6e 0a 20 20 20 20 7d 0a 0a 20 20  return.    }..  
0ab0: 20 20 70 72 6f 63 20 53 74 72 69 63 74 6e 65 73    proc Strictnes
0ac0: 73 20 7b 7d 20 7b 0a 09 23 20 4e 6f 74 20 73 61  s {} {..# Not sa
0ad0: 76 69 6e 67 20 73 74 72 69 63 74 6e 65 73 73 0a  ving strictness.
0ae0: 09 69 66 20 7b 21 5b 4f 70 74 69 6f 6e 61 6c 4c  .if {![OptionalL
0af0: 69 74 65 72 61 6c 20 73 74 72 69 63 74 5d 7d 20  iteral strict]} 
0b00: 72 65 74 75 72 6e 0a 09 53 65 6d 69 63 6f 6c 6f  return..Semicolo
0b10: 6e 0a 09 72 65 74 75 72 6e 0a 20 20 20 20 7d 0a  n..return.    }.
0b20: 0a 20 20 20 20 70 72 6f 63 20 46 69 6c 65 43 6f  .    proc FileCo
0b30: 6d 6d 65 6e 74 20 7b 7d 20 7b 0a 09 69 66 20 7b  mment {} {..if {
0b40: 21 5b 4f 70 74 69 6f 6e 61 6c 4c 69 74 65 72 61  ![OptionalLitera
0b50: 6c 20 63 6f 6d 6d 65 6e 74 5d 7d 20 72 65 74 75  l comment]} retu
0b60: 72 6e 0a 09 69 66 20 7b 21 5b 4f 70 74 69 6f 6e  rn..if {![Option
0b70: 61 6c 53 74 72 69 6e 67 20 2d 3e 20 63 5d 7d 20  alString -> c]} 
0b80: 72 65 74 75 72 6e 0a 09 53 65 6d 69 63 6f 6c 6f  return..Semicolo
0b90: 6e 0a 09 43 61 6c 6c 20 73 65 74 63 6f 6d 6d 65  n..Call setcomme
0ba0: 6e 74 20 24 63 0a 09 72 65 74 75 72 6e 0a 20 20  nt $c..return.  
0bb0: 20 20 7d 0a 0a 20 20 20 20 70 72 6f 63 20 45 78    }..    proc Ex
0bc0: 70 61 6e 64 20 7b 7d 20 7b 0a 09 23 20 4e 6f 74  pand {} {..# Not
0bd0: 20 73 61 76 69 6e 67 20 65 78 70 61 6e 64 65 64   saving expanded
0be0: 20 6b 65 79 77 6f 72 64 73 0a 09 69 66 20 7b 21   keywords..if {!
0bf0: 5b 4f 70 74 69 6f 6e 61 6c 4c 69 74 65 72 61 6c  [OptionalLiteral
0c00: 20 65 78 70 61 6e 64 5d 7d 20 72 65 74 75 72 6e   expand]} return
0c10: 0a 09 69 66 20 7b 21 5b 4f 70 74 69 6f 6e 61 6c  ..if {![Optional
0c20: 53 74 72 69 6e 67 20 2d 3e 20 64 75 6d 6d 79 5d  String -> dummy]
0c30: 7d 20 72 65 74 75 72 6e 0a 09 53 65 6d 69 63 6f  } return..Semico
0c40: 6c 6f 6e 0a 09 72 65 74 75 72 6e 0a 20 20 20 20  lon..return.    
0c50: 7d 0a 0a 20 20 20 20 23 20 23 20 23 23 20 23 23  }..    # # ## ##
0c60: 23 20 23 23 23 23 23 20 23 23 23 23 23 23 23 23  # ##### ########
0c70: 20 23 23 23 23 23 23 23 23 23 23 23 23 23 0a 0a   #############..
0c80: 20 20 20 20 70 72 6f 63 20 44 65 6c 74 61 73 20      proc Deltas 
0c90: 7b 7d 20 7b 0a 09 73 65 74 20 6f 6b 20 5b 4f 70  {} {..set ok [Op
0ca0: 74 69 6f 6e 61 6c 4e 75 6d 62 65 72 20 2d 3e 20  tionalNumber -> 
0cb0: 72 65 76 5d 0a 09 77 68 69 6c 65 20 7b 24 6f 6b  rev]..while {$ok
0cc0: 7d 20 7b 0a 09 20 20 20 20 44 61 74 65 20 20 20  } {..    Date   
0cd0: 20 20 2d 3e 20 64 0a 09 20 20 20 20 41 75 74 68    -> d..    Auth
0ce0: 6f 72 20 20 20 2d 3e 20 61 0a 09 20 20 20 20 53  or   -> a..    S
0cf0: 74 61 74 65 20 20 20 20 2d 3e 20 73 0a 09 20 20  tate    -> s..  
0d00: 20 20 42 72 61 6e 63 68 65 73 20 2d 3e 20 62 0a    Branches -> b.
0d10: 09 20 20 20 20 4e 65 78 74 52 65 76 20 20 2d 3e  .    NextRev  ->
0d20: 20 6e 0a 09 20 20 20 20 43 61 6c 6c 20 64 65 66   n..    Call def
0d30: 20 24 72 65 76 20 24 64 20 24 61 20 24 73 20 24   $rev $d $a $s $
0d40: 6e 20 24 62 0a 0a 09 20 20 20 20 23 20 43 68 65  n $b...    # Che
0d50: 63 6b 20 69 66 20 74 68 69 73 20 69 73 20 66 6f  ck if this is fo
0d60: 6c 6c 6f 77 65 64 20 62 79 20 61 20 72 65 76 69  llowed by a revi
0d70: 73 69 6f 6e 20 6e 75 6d 62 65 72 20 6f 72 20 74  sion number or t
0d80: 68 65 0a 09 20 20 20 20 23 20 6c 69 74 65 72 61  he..    # litera
0d90: 6c 20 27 64 65 73 63 27 2e 20 49 66 20 6e 65 69  l 'desc'. If nei
0da0: 74 68 65 72 20 77 65 20 63 6f 6e 73 75 6d 65 20  ther we consume 
0db0: 77 68 61 74 65 76 65 72 20 69 73 20 74 68 65 72  whatever is ther
0dc0: 65 0a 09 20 20 20 20 23 20 75 6e 74 69 6c 20 74  e..    # until t
0dd0: 68 65 20 6e 65 78 74 20 73 65 6d 69 63 6f 6c 6f  he next semicolo
0de0: 6e 2c 20 61 73 20 69 74 20 68 61 73 20 74 6f 20  n, as it has to 
0df0: 62 65 20 61 20 27 6e 65 77 0a 09 20 20 20 20 23  be a 'new..    #
0e00: 20 70 68 72 61 73 65 27 2e 20 4f 74 68 65 72 77   phrase'. Otherw
0e10: 69 73 65 2c 20 66 6f 72 20 61 20 72 65 76 69 73  ise, for a revis
0e20: 69 6f 6e 20 6e 75 6d 62 65 72 20 77 65 20 6c 6f  ion number we lo
0e30: 6f 70 20 62 61 63 6b 0a 09 20 20 20 20 23 20 61  op back..    # a
0e40: 6e 64 20 63 6f 6e 73 75 6d 65 20 74 68 61 74 20  nd consume that 
0e50: 72 65 76 69 73 69 6f 6e 2c 20 61 6e 64 20 6c 61  revision, and la
0e60: 73 74 6c 79 20 66 6f 72 20 27 64 65 73 63 27 20  stly for 'desc' 
0e70: 77 65 20 73 74 6f 70 0a 09 20 20 20 20 23 20 63  we stop..    # c
0e80: 6f 6d 70 6c 65 74 65 6c 79 20 61 73 20 74 68 69  ompletely as thi
0e90: 73 20 73 69 67 6e 61 6c 73 20 74 68 65 20 65 6e  s signals the en
0ea0: 64 20 6f 66 20 74 68 65 20 72 65 76 69 73 69 6f  d of the revisio
0eb0: 6e 20 74 72 65 65 0a 09 20 20 20 20 23 20 61 6e  n tree..    # an
0ec0: 64 20 74 68 65 20 62 65 67 69 6e 6e 69 6e 67 20  d the beginning 
0ed0: 6f 66 20 74 68 65 20 64 65 6c 74 61 73 2e 0a 0a  of the deltas...
0ee0: 09 20 20 20 20 77 68 69 6c 65 20 7b 31 7d 20 7b  .    while {1} {
0ef0: 0a 09 09 73 65 74 20 6f 6b 20 5b 4f 70 74 69 6f  ...set ok [Optio
0f00: 6e 61 6c 4e 75 6d 62 65 72 20 2d 3e 20 72 65 76  nalNumber -> rev
0f10: 5d 0a 09 09 69 66 20 7b 24 6f 6b 7d 20 62 72 65  ]...if {$ok} bre
0f20: 61 6b 0a 0a 09 09 69 66 20 7b 5b 4c 69 74 65 72  ak....if {[Liter
0f30: 61 6c 50 65 65 6b 20 64 65 73 63 5d 7d 20 7b 0a  alPeek desc]} {.
0f40: 09 09 20 20 20 20 73 65 74 20 6f 6b 20 30 0a 09  ..    set ok 0..
0f50: 09 20 20 20 20 62 72 65 61 6b 0a 09 09 7d 0a 0a  .    break...}..
0f60: 09 09 41 6e 79 74 68 69 6e 67 20 2d 3e 20 64 75  ..Anything -> du
0f70: 6d 6d 79 0a 09 09 53 65 6d 69 63 6f 6c 6f 6e 0a  mmy...Semicolon.
0f80: 09 20 20 20 20 7d 0a 09 7d 0a 09 43 61 6c 6c 20  .    }..}..Call 
0f90: 64 65 66 64 6f 6e 65 0a 09 72 65 74 75 72 6e 0a  defdone..return.
0fa0: 20 20 20 20 7d 0a 0a 20 20 20 20 23 20 23 20 23      }..    # # #
0fb0: 23 20 23 23 23 20 23 23 23 23 23 20 23 23 23 23  # ### ##### ####
0fc0: 23 23 23 23 20 23 23 23 23 23 23 23 23 23 23 23  #### ###########
0fd0: 23 23 0a 0a 20 20 20 20 70 72 6f 63 20 44 61 74  ##..    proc Dat
0fe0: 65 20 7b 5f 20 64 76 7d 20 7b 0a 09 75 70 76 61  e {_ dv} {..upva
0ff0: 72 20 31 20 24 64 76 20 64 0a 09 52 65 71 75 69  r 1 $dv d..Requi
1000: 72 65 64 4c 69 74 65 72 61 6c 20 64 61 74 65 0a  redLiteral date.
1010: 09 52 65 71 75 69 72 65 64 4e 75 6d 62 65 72 20  .RequiredNumber 
1020: 2d 3e 20 64 0a 09 53 65 6d 69 63 6f 6c 6f 6e 0a  -> d..Semicolon.
1030: 0a 09 73 74 72 75 63 74 3a 3a 6c 69 73 74 20 61  ..struct::list a
1040: 73 73 69 67 6e 20 5b 73 70 6c 69 74 20 24 64 20  ssign [split $d 
1050: 2e 5d 20 79 65 61 72 20 6d 6f 6e 74 68 20 64 61  .] year month da
1060: 79 20 68 6f 75 72 20 6d 69 6e 20 73 65 63 0a 09  y hour min sec..
1070: 69 66 20 7b 24 79 65 61 72 20 3c 20 31 30 30 7d  if {$year < 100}
1080: 20 7b 69 6e 63 72 20 79 65 61 72 20 31 39 30 30   {incr year 1900
1090: 7d 0a 09 73 65 74 20 64 20 5b 63 6c 6f 63 6b 20  }..set d [clock 
10a0: 73 63 61 6e 20 22 24 7b 79 65 61 72 7d 2d 24 7b  scan "${year}-${
10b0: 6d 6f 6e 74 68 7d 2d 24 7b 64 61 79 7d 20 24 7b  month}-${day} ${
10c0: 68 6f 75 72 7d 3a 24 7b 6d 69 6e 7d 3a 24 7b 73  hour}:${min}:${s
10d0: 65 63 7d 22 5d 0a 09 72 65 74 75 72 6e 0a 20 20  ec}"]..return.  
10e0: 20 20 7d 0a 0a 20 20 20 20 70 72 6f 63 20 41 75    }..    proc Au
10f0: 74 68 6f 72 20 7b 5f 20 61 76 7d 20 7b 0a 09 75  thor {_ av} {..u
1100: 70 76 61 72 20 31 20 24 61 76 20 61 0a 09 52 65  pvar 1 $av a..Re
1110: 71 75 69 72 65 64 4c 69 74 65 72 61 6c 20 61 75  quiredLiteral au
1120: 74 68 6f 72 0a 09 41 6e 79 74 68 69 6e 67 20 2d  thor..Anything -
1130: 3e 20 61 0a 09 53 65 6d 69 63 6f 6c 6f 6e 0a 09  > a..Semicolon..
1140: 72 65 74 75 72 6e 0a 20 20 20 20 7d 0a 0a 20 20  return.    }..  
1150: 20 20 70 72 6f 63 20 53 74 61 74 65 20 7b 5f 20    proc State {_ 
1160: 73 76 7d 20 7b 0a 09 75 70 76 61 72 20 31 20 24  sv} {..upvar 1 $
1170: 73 76 20 73 0a 09 52 65 71 75 69 72 65 64 4c 69  sv s..RequiredLi
1180: 74 65 72 61 6c 20 73 74 61 74 65 0a 09 41 6e 79  teral state..Any
1190: 74 68 69 6e 67 20 2d 3e 20 73 0a 09 53 65 6d 69  thing -> s..Semi
11a0: 63 6f 6c 6f 6e 0a 09 72 65 74 75 72 6e 0a 20 20  colon..return.  
11b0: 20 20 7d 0a 0a 20 20 20 20 70 72 6f 63 20 42 72    }..    proc Br
11c0: 61 6e 63 68 65 73 20 7b 5f 20 62 76 7d 20 7b 0a  anches {_ bv} {.
11d0: 09 75 70 76 61 72 20 31 20 24 62 76 20 62 0a 09  .upvar 1 $bv b..
11e0: 52 65 71 75 69 72 65 64 4c 69 74 65 72 61 6c 20  RequiredLiteral 
11f0: 62 72 61 6e 63 68 65 73 0a 09 41 6e 79 74 68 69  branches..Anythi
1200: 6e 67 20 2d 3e 20 62 0a 09 53 65 6d 69 63 6f 6c  ng -> b..Semicol
1210: 6f 6e 0a 09 72 65 74 75 72 6e 0a 20 20 20 20 7d  on..return.    }
1220: 0a 0a 20 20 20 20 70 72 6f 63 20 4e 65 78 74 52  ..    proc NextR
1230: 65 76 20 7b 5f 20 6e 76 7d 20 7b 0a 09 75 70 76  ev {_ nv} {..upv
1240: 61 72 20 31 20 24 6e 76 20 6e 0a 09 52 65 71 75  ar 1 $nv n..Requ
1250: 69 72 65 64 4c 69 74 65 72 61 6c 20 6e 65 78 74  iredLiteral next
1260: 0a 09 41 6e 79 74 68 69 6e 67 20 2d 3e 20 6e 0a  ..Anything -> n.
1270: 09 53 65 6d 69 63 6f 6c 6f 6e 0a 09 72 65 74 75  .Semicolon..retu
1280: 72 6e 0a 20 20 20 20 7d 0a 0a 20 20 20 20 23 20  rn.    }..    # 
1290: 23 20 23 23 20 23 23 23 20 23 23 23 23 23 20 23  # ## ### ##### #
12a0: 23 23 23 23 23 23 23 20 23 23 23 23 23 23 23 23  ####### ########
12b0: 23 23 23 23 23 0a 0a 20 20 20 20 70 72 6f 63 20  #####..    proc 
12c0: 44 65 73 63 72 69 70 74 69 6f 6e 20 7b 7d 20 7b  Description {} {
12d0: 0a 09 75 70 76 61 72 20 31 20 64 61 74 61 20 64  ..upvar 1 data d
12e0: 61 74 61 20 72 65 73 20 72 65 73 0a 09 52 65 71  ata res res..Req
12f0: 75 69 72 65 64 4c 69 74 65 72 61 6c 20 64 65 73  uiredLiteral des
1300: 63 0a 09 52 65 71 75 69 72 65 64 53 74 72 69 6e  c..RequiredStrin
1310: 67 20 2d 3e 20 64 0a 09 43 61 6c 6c 20 73 65 74  g -> d..Call set
1320: 64 65 73 63 20 24 64 0a 09 72 65 74 75 72 6e 0a  desc $d..return.
1330: 20 20 20 20 7d 0a 0a 20 20 20 20 23 20 23 20 23      }..    # # #
1340: 23 20 23 23 23 20 23 23 23 23 23 20 23 23 23 23  # ### ##### ####
1350: 23 23 23 23 20 23 23 23 23 23 23 23 23 23 23 23  #### ###########
1360: 23 23 0a 0a 20 20 20 20 70 72 6f 63 20 44 65 6c  ##..    proc Del
1370: 74 61 54 65 78 74 73 20 7b 7d 20 7b 0a 09 77 68  taTexts {} {..wh
1380: 69 6c 65 20 7b 5b 4f 70 74 69 6f 6e 61 6c 4e 75  ile {[OptionalNu
1390: 6d 62 65 72 20 2d 3e 20 72 65 76 5d 7d 20 7b 0a  mber -> rev]} {.
13a0: 09 20 20 20 20 52 65 71 75 69 72 65 64 4c 69 74  .    RequiredLit
13b0: 65 72 61 6c 20 6c 6f 67 0a 09 20 20 20 20 52 65  eral log..    Re
13c0: 71 75 69 72 65 64 53 74 72 69 6e 67 20 20 20 20  quiredString    
13d0: 20 20 2d 3e 20 63 6d 73 67 0a 09 20 20 20 20 69    -> cmsg..    i
13e0: 66 20 7b 5b 72 65 67 65 78 70 20 7b 5b 5c 30 30  f {[regexp {[\00
13f0: 30 2d 5c 30 31 30 5c 30 31 33 5c 30 31 34 5c 30  0-\010\013\014\0
1400: 31 36 2d 5c 30 33 37 5d 7d 20 24 63 6d 73 67 5d  16-\037]} $cmsg]
1410: 7d 20 7b 0a 09 09 23 52 65 77 69 6e 64 0a 09 09  } {...#Rewind...
1420: 23 42 61 64 20 22 6c 6f 67 20 6d 65 73 73 61 67  #Bad "log messag
1430: 65 20 66 6f 72 20 24 72 65 76 20 63 6f 6e 74 61  e for $rev conta
1440: 69 6e 73 20 61 74 20 6c 65 61 73 74 20 6f 6e 65  ins at least one
1450: 20 63 6f 6e 74 72 6f 6c 20 63 68 61 72 61 63 74   control charact
1460: 65 72 22 0a 09 20 20 20 20 7d 0a 0a 09 20 20 20  er"..    }...   
1470: 20 52 65 71 75 69 72 65 64 4c 69 74 65 72 61 6c   RequiredLiteral
1480: 20 74 65 78 74 0a 09 20 20 20 20 52 65 71 75 69   text..    Requi
1490: 72 65 64 53 74 72 69 6e 67 52 61 6e 67 65 20 2d  redStringRange -
14a0: 3e 20 64 65 6c 74 61 0a 09 20 20 20 20 43 61 6c  > delta..    Cal
14b0: 6c 20 65 78 74 65 6e 64 20 24 72 65 76 20 24 63  l extend $rev $c
14c0: 6d 73 67 20 24 64 65 6c 74 61 0a 09 7d 0a 09 72  msg $delta..}..r
14d0: 65 74 75 72 6e 0a 20 20 20 20 7d 0a 0a 20 20 20  eturn.    }..   
14e0: 20 23 20 23 20 23 23 20 23 23 23 20 23 23 23 23   # # ## ### ####
14f0: 23 20 23 23 23 23 23 23 23 23 20 23 23 23 23 23  # ######## #####
1500: 23 23 23 23 23 23 23 23 0a 20 20 20 20 23 23 20  ########.    ## 
1510: 49 6e 74 65 72 6e 61 6c 20 6d 65 74 68 6f 64 73  Internal methods
1520: 2c 20 6c 65 78 69 6f 67 72 61 70 68 69 63 61 6c  , lexiographical
1530: 20 70 72 6f 63 65 73 73 69 6e 67 0a 0a 20 20 20   processing..   
1540: 20 70 72 6f 63 20 53 65 6d 69 63 6f 6c 6f 6e 20   proc Semicolon 
1550: 7b 7d 20 7b 0a 09 3a 3a 76 61 72 69 61 62 6c 65  {} {..::variable
1560: 20 6d 79 64 61 74 61 0a 09 3a 3a 76 61 72 69 61   mydata..::varia
1570: 62 6c 65 20 6d 79 70 6f 73 0a 0a 09 73 65 74 20  ble mypos...set 
1580: 6f 6b 20 5b 72 65 67 65 78 70 20 2d 73 74 61 72  ok [regexp -star
1590: 74 20 24 6d 79 70 6f 73 20 2d 69 6e 64 69 63 65  t $mypos -indice
15a0: 73 20 2d 2d 20 7b 5c 41 5c 73 2a 3b 5c 73 2a 7d  s -- {\A\s*;\s*}
15b0: 20 24 6d 79 64 61 74 61 20 6d 61 74 63 68 5d 0a   $mydata match].
15c0: 09 69 66 20 7b 21 24 6f 6b 7d 20 7b 20 45 78 70  .if {!$ok} { Exp
15d0: 65 63 74 65 64 20 27 3b 27 20 7d 0a 0a 09 53 6b  ected ';' }...Sk
15e0: 69 70 4f 76 65 72 20 6d 61 74 63 68 0a 09 72 65  ipOver match..re
15f0: 74 75 72 6e 0a 20 20 20 20 7d 0a 0a 20 20 20 20  turn.    }..    
1600: 70 72 6f 63 20 52 65 71 75 69 72 65 64 4c 69 74  proc RequiredLit
1610: 65 72 61 6c 20 7b 6e 61 6d 65 7d 20 7b 0a 09 3a  eral {name} {..:
1620: 3a 76 61 72 69 61 62 6c 65 20 6d 79 64 61 74 61  :variable mydata
1630: 0a 09 3a 3a 76 61 72 69 61 62 6c 65 20 6d 79 70  ..::variable myp
1640: 6f 73 0a 0a 09 73 65 74 20 70 61 74 74 65 72 6e  os...set pattern
1650: 20 22 5c 5c 41 5c 5c 73 2a 24 6e 61 6d 65 5c 5c   "\\A\\s*$name\\
1660: 73 2a 22 0a 09 73 65 74 20 6f 6b 20 5b 72 65 67  s*"..set ok [reg
1670: 65 78 70 20 2d 73 74 61 72 74 20 24 6d 79 70 6f  exp -start $mypo
1680: 73 20 2d 69 6e 64 69 63 65 73 20 2d 2d 20 24 70  s -indices -- $p
1690: 61 74 74 65 72 6e 20 24 6d 79 64 61 74 61 20 6d  attern $mydata m
16a0: 61 74 63 68 5d 0a 09 69 66 20 7b 21 24 6f 6b 7d  atch]..if {!$ok}
16b0: 20 7b 20 45 78 70 65 63 74 65 64 20 27 24 6e 61   { Expected '$na
16c0: 6d 65 27 20 7d 0a 0a 09 53 6b 69 70 4f 76 65 72  me' }...SkipOver
16d0: 20 6d 61 74 63 68 0a 09 72 65 74 75 72 6e 0a 20   match..return. 
16e0: 20 20 20 7d 0a 0a 20 20 20 20 70 72 6f 63 20 4f     }..    proc O
16f0: 70 74 69 6f 6e 61 6c 4c 69 74 65 72 61 6c 20 7b  ptionalLiteral {
1700: 6e 61 6d 65 7d 20 7b 0a 09 3a 3a 76 61 72 69 61  name} {..::varia
1710: 62 6c 65 20 6d 79 64 61 74 61 0a 09 3a 3a 76 61  ble mydata..::va
1720: 72 69 61 62 6c 65 20 6d 79 70 6f 73 0a 0a 09 73  riable mypos...s
1730: 65 74 20 70 61 74 74 65 72 6e 20 22 5c 5c 41 5c  et pattern "\\A\
1740: 5c 73 2a 24 6e 61 6d 65 5c 5c 73 2a 22 0a 09 73  \s*$name\\s*"..s
1750: 65 74 20 6f 6b 20 5b 72 65 67 65 78 70 20 2d 73  et ok [regexp -s
1760: 74 61 72 74 20 24 6d 79 70 6f 73 20 2d 69 6e 64  tart $mypos -ind
1770: 69 63 65 73 20 2d 2d 20 24 70 61 74 74 65 72 6e  ices -- $pattern
1780: 20 24 6d 79 64 61 74 61 20 6d 61 74 63 68 5d 0a   $mydata match].
1790: 09 69 66 20 7b 21 24 6f 6b 7d 20 7b 20 72 65 74  .if {!$ok} { ret
17a0: 75 72 6e 20 30 20 7d 0a 0a 09 53 6b 69 70 4f 76  urn 0 }...SkipOv
17b0: 65 72 20 6d 61 74 63 68 0a 09 72 65 74 75 72 6e  er match..return
17c0: 20 31 0a 20 20 20 20 7d 0a 0a 20 20 20 20 70 72   1.    }..    pr
17d0: 6f 63 20 4c 69 74 65 72 61 6c 50 65 65 6b 20 7b  oc LiteralPeek {
17e0: 6e 61 6d 65 7d 20 7b 0a 09 3a 3a 76 61 72 69 61  name} {..::varia
17f0: 62 6c 65 20 6d 79 64 61 74 61 0a 09 3a 3a 76 61  ble mydata..::va
1800: 72 69 61 62 6c 65 20 6d 79 70 6f 73 0a 0a 09 73  riable mypos...s
1810: 65 74 20 70 61 74 74 65 72 6e 20 22 5c 5c 41 5c  et pattern "\\A\
1820: 5c 73 2a 24 6e 61 6d 65 5c 5c 73 2a 22 0a 09 73  \s*$name\\s*"..s
1830: 65 74 20 6f 6b 20 5b 72 65 67 65 78 70 20 2d 73  et ok [regexp -s
1840: 74 61 72 74 20 24 6d 79 70 6f 73 20 2d 69 6e 64  tart $mypos -ind
1850: 69 63 65 73 20 2d 2d 20 24 70 61 74 74 65 72 6e  ices -- $pattern
1860: 20 24 6d 79 64 61 74 61 20 6d 61 74 63 68 5d 0a   $mydata match].
1870: 09 69 66 20 7b 21 24 6f 6b 7d 20 7b 20 72 65 74  .if {!$ok} { ret
1880: 75 72 6e 20 30 20 7d 0a 0a 09 23 20 4e 4f 20 2d  urn 0 }...# NO -
1890: 20 53 6b 69 70 4f 76 65 72 20 6d 61 74 63 68 20   SkipOver match 
18a0: 2d 20 4f 6e 6c 79 20 6c 6f 6f 6b 69 6e 67 20 61  - Only looking a
18b0: 68 65 61 64 20 68 65 72 65 2e 0a 09 72 65 74 75  head here...retu
18c0: 72 6e 20 31 0a 20 20 20 20 7d 0a 0a 20 20 20 20  rn 1.    }..    
18d0: 70 72 6f 63 20 52 65 71 75 69 72 65 64 4e 75 6d  proc RequiredNum
18e0: 62 65 72 20 7b 5f 20 76 7d 20 7b 0a 09 75 70 76  ber {_ v} {..upv
18f0: 61 72 20 31 20 24 76 20 76 61 6c 75 65 0a 09 3a  ar 1 $v value..:
1900: 3a 76 61 72 69 61 62 6c 65 20 6d 79 64 61 74 61  :variable mydata
1910: 0a 09 3a 3a 76 61 72 69 61 62 6c 65 20 6d 79 70  ..::variable myp
1920: 6f 73 0a 0a 09 73 65 74 20 70 61 74 74 65 72 6e  os...set pattern
1930: 20 7b 5c 41 5c 73 2a 28 28 5c 64 7c 5c 2e 29 2b   {\A\s*((\d|\.)+
1940: 29 5c 73 2a 7d 0a 09 73 65 74 20 6f 6b 20 5b 72  )\s*}..set ok [r
1950: 65 67 65 78 70 20 2d 73 74 61 72 74 20 24 6d 79  egexp -start $my
1960: 70 6f 73 20 2d 69 6e 64 69 63 65 73 20 2d 2d 20  pos -indices -- 
1970: 24 70 61 74 74 65 72 6e 20 24 6d 79 64 61 74 61  $pattern $mydata
1980: 20 6d 61 74 63 68 20 76 5d 0a 09 69 66 20 7b 21   match v]..if {!
1990: 24 6f 6b 7d 20 7b 20 45 78 70 65 63 74 65 64 20  $ok} { Expected 
19a0: 69 64 20 7d 0a 0a 09 45 78 74 72 61 63 74 20 24  id }...Extract $
19b0: 76 20 2d 3e 20 76 61 6c 75 65 0a 09 53 6b 69 70  v -> value..Skip
19c0: 4f 76 65 72 20 6d 61 74 63 68 0a 09 72 65 74 75  Over match..retu
19d0: 72 6e 0a 20 20 20 20 7d 0a 0a 20 20 20 20 70 72  rn.    }..    pr
19e0: 6f 63 20 4f 70 74 69 6f 6e 61 6c 4e 75 6d 62 65  oc OptionalNumbe
19f0: 72 20 7b 5f 20 76 7d 20 7b 0a 09 75 70 76 61 72  r {_ v} {..upvar
1a00: 20 31 20 24 76 20 76 61 6c 75 65 0a 09 3a 3a 76   1 $v value..::v
1a10: 61 72 69 61 62 6c 65 20 6d 79 64 61 74 61 0a 09  ariable mydata..
1a20: 3a 3a 76 61 72 69 61 62 6c 65 20 6d 79 70 6f 73  ::variable mypos
1a30: 0a 0a 09 73 65 74 20 70 61 74 74 65 72 6e 20 7b  ...set pattern {
1a40: 5c 41 5c 73 2a 28 28 5c 64 7c 5c 2e 29 2b 29 5c  \A\s*((\d|\.)+)\
1a50: 73 2a 7d 0a 09 73 65 74 20 6f 6b 20 5b 72 65 67  s*}..set ok [reg
1a60: 65 78 70 20 2d 73 74 61 72 74 20 24 6d 79 70 6f  exp -start $mypo
1a70: 73 20 2d 69 6e 64 69 63 65 73 20 2d 2d 20 24 70  s -indices -- $p
1a80: 61 74 74 65 72 6e 20 24 6d 79 64 61 74 61 20 6d  attern $mydata m
1a90: 61 74 63 68 20 76 5d 0a 09 69 66 20 7b 21 24 6f  atch v]..if {!$o
1aa0: 6b 7d 20 7b 20 72 65 74 75 72 6e 20 30 20 7d 0a  k} { return 0 }.
1ab0: 0a 09 45 78 74 72 61 63 74 20 24 76 20 2d 3e 20  ..Extract $v -> 
1ac0: 76 61 6c 75 65 0a 09 53 6b 69 70 4f 76 65 72 20  value..SkipOver 
1ad0: 6d 61 74 63 68 0a 09 72 65 74 75 72 6e 20 31 0a  match..return 1.
1ae0: 20 20 20 20 7d 0a 0a 20 20 20 20 70 72 6f 63 20      }..    proc 
1af0: 52 65 71 75 69 72 65 64 53 74 72 69 6e 67 20 7b  RequiredString {
1b00: 5f 20 76 7d 20 7b 0a 09 75 70 76 61 72 20 31 20  _ v} {..upvar 1 
1b10: 24 76 20 76 61 6c 75 65 0a 09 3a 3a 76 61 72 69  $v value..::vari
1b20: 61 62 6c 65 20 6d 79 64 61 74 61 0a 09 3a 3a 76  able mydata..::v
1b30: 61 72 69 61 62 6c 65 20 6d 79 70 6f 73 0a 0a 09  ariable mypos...
1b40: 73 65 74 20 6f 6b 20 5b 72 65 67 65 78 70 20 2d  set ok [regexp -
1b50: 73 74 61 72 74 20 24 6d 79 70 6f 73 20 2d 69 6e  start $mypos -in
1b60: 64 69 63 65 73 20 2d 2d 20 7b 5c 41 5c 73 2a 40  dices -- {\A\s*@
1b70: 28 28 5b 5e 40 5d 2a 28 40 40 29 2a 29 2a 29 40  (([^@]*(@@)*)*)@
1b80: 5c 73 2a 7d 20 24 6d 79 64 61 74 61 20 6d 61 74  \s*} $mydata mat
1b90: 63 68 20 76 5d 0a 09 69 66 20 7b 21 24 6f 6b 7d  ch v]..if {!$ok}
1ba0: 20 7b 20 45 78 70 65 63 74 65 64 20 73 74 72 69   { Expected stri
1bb0: 6e 67 20 7d 0a 0a 09 45 78 74 72 61 63 74 20 24  ng }...Extract $
1bc0: 76 20 2d 3e 20 76 61 6c 75 65 0a 09 73 65 74 20  v -> value..set 
1bd0: 76 61 6c 75 65 20 5b 73 74 72 69 6e 67 20 6d 61  value [string ma
1be0: 70 20 7b 40 40 20 40 7d 20 24 76 61 6c 75 65 5d  p {@@ @} $value]
1bf0: 0a 09 53 6b 69 70 4f 76 65 72 20 6d 61 74 63 68  ..SkipOver match
1c00: 0a 09 72 65 74 75 72 6e 0a 20 20 20 20 7d 0a 0a  ..return.    }..
1c10: 20 20 20 20 70 72 6f 63 20 52 65 71 75 69 72 65      proc Require
1c20: 64 53 74 72 69 6e 67 52 61 6e 67 65 20 7b 5f 20  dStringRange {_ 
1c30: 76 7d 20 7b 0a 09 75 70 76 61 72 20 31 20 24 76  v} {..upvar 1 $v
1c40: 20 76 61 6c 75 65 0a 09 3a 3a 76 61 72 69 61 62   value..::variab
1c50: 6c 65 20 6d 79 64 61 74 61 0a 09 3a 3a 76 61 72  le mydata..::var
1c60: 69 61 62 6c 65 20 6d 79 70 6f 73 0a 0a 09 73 65  iable mypos...se
1c70: 74 20 6f 6b 20 5b 72 65 67 65 78 70 20 2d 73 74  t ok [regexp -st
1c80: 61 72 74 20 24 6d 79 70 6f 73 20 2d 69 6e 64 69  art $mypos -indi
1c90: 63 65 73 20 2d 2d 20 7b 5c 41 5c 73 2a 40 28 28  ces -- {\A\s*@((
1ca0: 5b 5e 40 5d 2a 28 40 40 29 2a 29 2a 29 40 5c 73  [^@]*(@@)*)*)@\s
1cb0: 2a 7d 20 24 6d 79 64 61 74 61 20 6d 61 74 63 68  *} $mydata match
1cc0: 20 76 61 6c 75 65 5d 0a 09 69 66 20 7b 21 24 6f   value]..if {!$o
1cd0: 6b 7d 20 7b 20 45 78 70 65 63 74 65 64 20 73 74  k} { Expected st
1ce0: 72 69 6e 67 20 7d 0a 0a 09 53 6b 69 70 4f 76 65  ring }...SkipOve
1cf0: 72 20 6d 61 74 63 68 0a 09 72 65 74 75 72 6e 0a  r match..return.
1d00: 20 20 20 20 7d 0a 0a 20 20 20 20 70 72 6f 63 20      }..    proc 
1d10: 4f 70 74 69 6f 6e 61 6c 53 74 72 69 6e 67 20 7b  OptionalString {
1d20: 5f 20 76 7d 20 7b 0a 09 75 70 76 61 72 20 31 20  _ v} {..upvar 1 
1d30: 24 76 20 76 61 6c 75 65 0a 09 3a 3a 76 61 72 69  $v value..::vari
1d40: 61 62 6c 65 20 6d 79 64 61 74 61 0a 09 3a 3a 76  able mydata..::v
1d50: 61 72 69 61 62 6c 65 20 6d 79 70 6f 73 0a 0a 09  ariable mypos...
1d60: 73 65 74 20 6f 6b 20 5b 72 65 67 65 78 70 20 2d  set ok [regexp -
1d70: 73 74 61 72 74 20 24 6d 79 70 6f 73 20 2d 69 6e  start $mypos -in
1d80: 64 69 63 65 73 20 2d 2d 20 7b 5c 41 5c 73 2a 40  dices -- {\A\s*@
1d90: 28 28 5b 5e 40 5d 2a 28 40 40 29 2a 29 2a 29 40  (([^@]*(@@)*)*)@
1da0: 5c 73 2a 7d 20 24 6d 79 64 61 74 61 20 6d 61 74  \s*} $mydata mat
1db0: 63 68 20 76 5d 0a 09 69 66 20 7b 21 24 6f 6b 7d  ch v]..if {!$ok}
1dc0: 20 7b 20 72 65 74 75 72 6e 20 30 20 7d 0a 0a 09   { return 0 }...
1dd0: 45 78 74 72 61 63 74 20 24 76 20 2d 3e 20 76 61  Extract $v -> va
1de0: 6c 75 65 0a 09 73 65 74 20 76 61 6c 75 65 20 5b  lue..set value [
1df0: 73 74 72 69 6e 67 20 6d 61 70 20 7b 40 40 20 40  string map {@@ @
1e00: 7d 20 24 76 61 6c 75 65 5d 0a 09 53 6b 69 70 4f  } $value]..SkipO
1e10: 76 65 72 20 6d 61 74 63 68 0a 09 72 65 74 75 72  ver match..retur
1e20: 6e 20 31 0a 20 20 20 20 7d 0a 0a 20 20 20 20 70  n 1.    }..    p
1e30: 72 6f 63 20 49 64 65 6e 74 20 7b 5f 20 76 7d 20  roc Ident {_ v} 
1e40: 7b 0a 09 75 70 76 61 72 20 31 20 24 76 20 76 61  {..upvar 1 $v va
1e50: 6c 75 65 0a 09 3a 3a 76 61 72 69 61 62 6c 65 20  lue..::variable 
1e60: 6d 79 64 61 74 61 0a 09 3a 3a 76 61 72 69 61 62  mydata..::variab
1e70: 6c 65 20 6d 79 70 6f 73 0a 0a 09 73 65 74 20 6f  le mypos...set o
1e80: 6b 20 5b 72 65 67 65 78 70 20 2d 73 74 61 72 74  k [regexp -start
1e90: 20 24 6d 79 70 6f 73 20 2d 69 6e 64 69 63 65 73   $mypos -indices
1ea0: 20 2d 2d 20 7b 5c 41 5c 73 2a 3b 5c 73 2a 7d 20   -- {\A\s*;\s*} 
1eb0: 24 6d 79 64 61 74 61 5d 0a 09 69 66 20 7b 24 6f  $mydata]..if {$o
1ec0: 6b 7d 20 7b 20 72 65 74 75 72 6e 20 30 20 7d 0a  k} { return 0 }.
1ed0: 0a 09 73 65 74 20 6f 6b 20 5b 72 65 67 65 78 70  ..set ok [regexp
1ee0: 20 2d 73 74 61 72 74 20 24 6d 79 70 6f 73 20 2d   -start $mypos -
1ef0: 69 6e 64 69 63 65 73 20 2d 2d 20 7b 5c 41 5c 73  indices -- {\A\s
1f00: 2a 28 5b 5e 3a 5d 2a 29 5c 73 2a 3a 5c 73 2a 7d  *([^:]*)\s*:\s*}
1f10: 20 24 6d 79 64 61 74 61 20 6d 61 74 63 68 20 76   $mydata match v
1f20: 5d 0a 09 69 66 20 7b 21 24 6f 6b 7d 20 7b 20 72  ]..if {!$ok} { r
1f30: 65 74 75 72 6e 20 30 20 7d 0a 0a 09 45 78 74 72  eturn 0 }...Extr
1f40: 61 63 74 20 24 76 20 2d 3e 20 76 61 6c 75 65 0a  act $v -> value.
1f50: 09 53 6b 69 70 4f 76 65 72 20 6d 61 74 63 68 0a  .SkipOver match.
1f60: 09 72 65 74 75 72 6e 20 31 0a 20 20 20 20 7d 0a  .return 1.    }.
1f70: 0a 20 20 20 20 70 72 6f 63 20 41 6e 79 74 68 69  .    proc Anythi
1f80: 6e 67 20 7b 5f 20 76 7d 20 7b 0a 09 75 70 76 61  ng {_ v} {..upva
1f90: 72 20 31 20 24 76 20 76 61 6c 75 65 0a 09 3a 3a  r 1 $v value..::
1fa0: 76 61 72 69 61 62 6c 65 20 6d 79 64 61 74 61 0a  variable mydata.
1fb0: 09 3a 3a 76 61 72 69 61 62 6c 65 20 6d 79 70 6f  .::variable mypo
1fc0: 73 0a 0a 09 72 65 67 65 78 70 20 2d 73 74 61 72  s...regexp -star
1fd0: 74 20 24 6d 79 70 6f 73 20 2d 69 6e 64 69 63 65  t $mypos -indice
1fe0: 73 20 2d 2d 20 7b 5c 41 5c 73 2a 28 5b 5e 3b 5d  s -- {\A\s*([^;]
1ff0: 2a 29 5c 73 2a 7d 20 24 6d 79 64 61 74 61 20 6d  *)\s*} $mydata m
2000: 61 74 63 68 20 76 0a 0a 09 45 78 74 72 61 63 74  atch v...Extract
2010: 20 24 76 20 2d 3e 20 76 61 6c 75 65 0a 09 53 6b   $v -> value..Sk
2020: 69 70 4f 76 65 72 20 6d 61 74 63 68 0a 09 72 65  ipOver match..re
2030: 74 75 72 6e 0a 20 20 20 20 7d 0a 0a 20 20 20 20  turn.    }..    
2040: 23 20 23 20 23 23 20 23 23 23 20 23 23 23 23 23  # # ## ### #####
2050: 20 23 23 23 23 23 23 23 23 20 23 23 23 23 23 23   ######## ######
2060: 23 23 23 23 23 23 23 0a 20 20 20 20 23 23 20 49  #######.    ## I
2070: 6e 74 65 72 6e 61 6c 20 6d 65 74 68 6f 64 73 2c  nternal methods,
2080: 20 69 6e 70 75 74 20 68 61 6e 64 6c 69 6e 67 0a   input handling.
2090: 0a 20 20 20 20 70 72 6f 63 20 45 78 74 72 61 63  .    proc Extrac
20a0: 74 20 7b 72 61 6e 67 65 20 5f 20 76 7d 20 7b 0a  t {range _ v} {.
20b0: 09 75 70 76 61 72 20 31 20 24 76 20 76 61 6c 75  .upvar 1 $v valu
20c0: 65 0a 09 3a 3a 76 61 72 69 61 62 6c 65 20 6d 79  e..::variable my
20d0: 64 61 74 61 0a 09 73 74 72 75 63 74 3a 3a 6c 69  data..struct::li
20e0: 73 74 20 61 73 73 69 67 6e 20 24 72 61 6e 67 65  st assign $range
20f0: 20 73 20 65 0a 09 73 65 74 20 76 61 6c 75 65 20   s e..set value 
2100: 5b 73 74 72 69 6e 67 20 72 61 6e 67 65 20 24 6d  [string range $m
2110: 79 64 61 74 61 20 24 73 20 24 65 5d 0a 09 72 65  ydata $s $e]..re
2120: 74 75 72 6e 0a 20 20 20 20 7d 0a 0a 20 20 20 20  turn.    }..    
2130: 70 72 6f 63 20 53 6b 69 70 4f 76 65 72 20 7b 6d  proc SkipOver {m
2140: 76 7d 20 7b 0a 09 23 20 4e 6f 74 65 3a 20 54 68  v} {..# Note: Th
2150: 65 20 69 6e 64 69 63 65 73 20 61 72 65 20 61 62  e indices are ab
2160: 73 6f 6c 75 74 65 21 2c 20 6e 6f 74 20 72 65 6c  solute!, not rel
2170: 61 74 69 76 65 20 74 6f 20 74 68 65 20 73 74 61  ative to the sta
2180: 72 74 0a 09 23 20 6c 6f 63 61 74 69 6f 6e 2e 0a  rt..# location..
2190: 09 75 70 76 61 72 20 31 20 24 6d 76 20 6d 61 74  .upvar 1 $mv mat
21a0: 63 68 0a 09 3a 3a 76 61 72 69 61 62 6c 65 20 6d  ch..::variable m
21b0: 79 70 6f 73 0a 09 3a 3a 76 61 72 69 61 62 6c 65  ypos..::variable
21c0: 20 6d 79 73 69 7a 65 0a 09 3a 3a 76 61 72 69 61   mysize..::varia
21d0: 62 6c 65 20 6d 79 6c 61 73 74 70 6f 73 0a 0a 09  ble mylastpos...
21e0: 73 74 72 75 63 74 3a 3a 6c 69 73 74 20 61 73 73  struct::list ass
21f0: 69 67 6e 20 24 6d 61 74 63 68 20 73 20 65 0a 09  ign $match s e..
2200: 23 70 75 74 73 20 22 3c 24 73 20 24 65 3e 20 5b  #puts "<$s $e> [
2210: 69 6e 66 6f 20 6c 65 76 65 6c 20 2d 31 5d 22 0a  info level -1]".
2220: 0a 09 73 65 74 20 20 6d 79 6c 61 73 74 70 6f 73  ..set  mylastpos
2230: 20 24 6d 79 70 6f 73 0a 09 73 65 74 20 20 6d 79   $mypos..set  my
2240: 70 6f 73 20 24 65 0a 09 69 6e 63 72 20 6d 79 70  pos $e..incr myp
2250: 6f 73 0a 0a 09 6c 6f 67 20 70 72 6f 67 72 65 73  os...log progres
2260: 73 20 32 20 72 63 73 20 24 6d 79 70 6f 73 20 24  s 2 rcs $mypos $
2270: 6d 79 73 69 7a 65 0a 09 23 70 75 74 73 20 24 6d  mysize..#puts $m
2280: 79 70 6f 73 2f 24 6d 79 73 69 7a 65 0a 09 72 65  ypos/$mysize..re
2290: 74 75 72 6e 0a 20 20 20 20 7d 0a 0a 20 20 20 20  turn.    }..    
22a0: 70 72 6f 63 20 52 65 77 69 6e 64 20 7b 7d 20 7b  proc Rewind {} {
22b0: 0a 09 3a 3a 76 61 72 69 61 62 6c 65 20 6d 79 70  ..::variable myp
22c0: 6f 73 0a 09 3a 3a 76 61 72 69 61 62 6c 65 20 6d  os..::variable m
22d0: 79 6c 61 73 74 70 6f 73 0a 0a 09 73 65 74 20 20  ylastpos...set  
22e0: 6d 79 70 6f 73 20 24 6d 79 6c 61 73 74 70 6f 73  mypos $mylastpos
22f0: 0a 09 72 65 74 75 72 6e 0a 20 20 20 20 7d 0a 0a  ..return.    }..
2300: 20 20 20 20 70 72 6f 63 20 45 78 70 65 63 74 65      proc Expecte
2310: 64 20 7b 78 7d 20 7b 0a 09 3a 3a 76 61 72 69 61  d {x} {..::varia
2320: 62 6c 65 20 6d 79 64 61 74 61 0a 09 3a 3a 76 61  ble mydata..::va
2330: 72 69 61 62 6c 65 20 6d 79 70 6f 73 0a 09 73 65  riable mypos..se
2340: 74 20 65 20 24 6d 79 70 6f 73 20 3b 20 69 6e 63  t e $mypos ; inc
2350: 72 20 65 20 33 30 0a 09 72 65 74 75 72 6e 20 2d  r e 30..return -
2360: 63 6f 64 65 20 65 72 72 6f 72 20 2d 65 72 72 6f  code error -erro
2370: 72 63 6f 64 65 20 76 63 3a 3a 72 63 73 3a 3a 70  rcode vc::rcs::p
2380: 61 72 73 65 72 20 5c 0a 09 20 20 20 20 22 45 78  arser \..    "Ex
2390: 70 65 63 74 65 64 20 24 78 20 40 20 27 5b 73 74  pected $x @ '[st
23a0: 72 69 6e 67 20 72 61 6e 67 65 20 24 6d 79 64 61  ring range $myda
23b0: 74 61 20 24 6d 79 70 6f 73 20 24 65 5d 2e 2e 2e  ta $mypos $e]...
23c0: 27 22 20 0a 20 20 20 20 7d 0a 0a 20 20 20 20 70  '" .    }..    p
23d0: 72 6f 63 20 42 61 64 20 7b 78 7d 20 7b 0a 09 3a  roc Bad {x} {..:
23e0: 3a 76 61 72 69 61 62 6c 65 20 6d 79 64 61 74 61  :variable mydata
23f0: 0a 09 3a 3a 76 61 72 69 61 62 6c 65 20 6d 79 70  ..::variable myp
2400: 6f 73 0a 09 73 65 74 20 65 20 24 6d 79 70 6f 73  os..set e $mypos
2410: 20 3b 20 69 6e 63 72 20 65 20 33 30 0a 09 72 65   ; incr e 30..re
2420: 74 75 72 6e 20 2d 63 6f 64 65 20 65 72 72 6f 72  turn -code error
2430: 20 2d 65 72 72 6f 72 63 6f 64 65 20 76 63 3a 3a   -errorcode vc::
2440: 72 63 73 3a 3a 70 61 72 73 65 72 20 5c 0a 09 20  rcs::parser \.. 
2450: 20 20 20 22 42 61 64 20 24 78 20 40 20 27 5b 73     "Bad $x @ '[s
2460: 74 72 69 6e 67 20 72 61 6e 67 65 20 24 6d 79 64  tring range $myd
2470: 61 74 61 20 24 6d 79 70 6f 73 20 24 65 5d 2e 2e  ata $mypos $e]..
2480: 2e 27 22 20 0a 20 20 20 20 7d 0a 0a 20 20 20 20  .'" .    }..    
2490: 23 20 23 20 23 23 20 23 23 23 20 23 23 23 23 23  # # ## ### #####
24a0: 20 23 23 23 23 23 23 23 23 20 23 23 23 23 23 23   ######## ######
24b0: 23 23 23 23 23 23 23 0a 20 20 20 20 23 23 20 53  #######.    ## S
24c0: 65 74 75 70 2c 20 63 61 6c 6c 62 61 63 6b 73 2e  etup, callbacks.
24d0: 0a 0a 20 20 20 20 70 72 6f 63 20 49 6e 69 74 69  ..    proc Initi
24e0: 61 6c 69 7a 65 20 7b 70 61 74 68 20 73 69 6e 6b  alize {path sink
24f0: 7d 20 7b 0a 09 3a 3a 76 61 72 69 61 62 6c 65 20  } {..::variable 
2500: 6d 79 70 6f 73 20 20 30 0a 09 3a 3a 76 61 72 69  mypos  0..::vari
2510: 61 62 6c 65 20 6d 79 64 61 74 61 20 5b 66 69 6c  able mydata [fil
2520: 65 75 74 69 6c 3a 3a 63 61 74 20 2d 65 6e 63 6f  eutil::cat -enco
2530: 64 69 6e 67 20 62 69 6e 61 72 79 20 24 70 61 74  ding binary $pat
2540: 68 5d 0a 09 3a 3a 76 61 72 69 61 62 6c 65 20 6d  h]..::variable m
2550: 79 73 69 7a 65 20 5b 66 69 6c 65 20 73 69 7a 65  ysize [file size
2560: 20 24 70 61 74 68 5d 0a 09 3a 3a 76 61 72 69 61   $path]..::varia
2570: 62 6c 65 20 6d 79 73 69 6e 6b 20 24 73 69 6e 6b  ble mysink $sink
2580: 0a 09 72 65 74 75 72 6e 0a 20 20 20 20 7d 0a 0a  ..return.    }..
2590: 20 20 20 20 70 72 6f 63 20 43 61 6c 6c 20 7b 61      proc Call {a
25a0: 72 67 73 7d 20 7b 0a 09 3a 3a 76 61 72 69 61 62  rgs} {..::variab
25b0: 6c 65 20 6d 79 73 69 6e 6b 0a 09 73 65 74 20 63  le mysink..set c
25c0: 6d 64 20 24 6d 79 73 69 6e 6b 0a 09 66 6f 72 65  md $mysink..fore
25d0: 61 63 68 20 61 20 24 61 72 67 73 20 7b 20 6c 61  ach a $args { la
25e0: 70 70 65 6e 64 20 63 6d 64 20 24 61 20 7d 0a 09  ppend cmd $a }..
25f0: 65 76 61 6c 20 24 63 6d 64 0a 09 72 65 74 75 72  eval $cmd..retur
2600: 6e 0a 20 20 20 20 7d 0a 0a 20 20 20 20 23 20 23  n.    }..    # #
2610: 20 23 23 20 23 23 23 20 23 23 23 23 23 20 23 23   ## ### ##### ##
2620: 23 23 23 23 23 23 20 23 23 23 23 23 23 23 23 23  ###### #########
2630: 23 23 23 23 0a 20 20 20 20 23 23 20 43 6f 6e 66  ####.    ## Conf
2640: 69 67 75 72 61 74 69 6f 6e 0a 0a 20 20 20 20 74  iguration..    t
2650: 79 70 65 76 61 72 69 61 62 6c 65 20 6d 79 64 61  ypevariable myda
2660: 74 61 20 7b 7d 20 3b 20 23 20 52 63 73 20 61 72  ta {} ; # Rcs ar
2670: 63 68 69 76 65 20 63 6f 6e 74 65 6e 74 73 20 74  chive contents t
2680: 6f 20 70 72 6f 63 65 73 73 0a 20 20 20 20 74 79  o process.    ty
2690: 70 65 76 61 72 69 61 62 6c 65 20 6d 79 73 69 7a  pevariable mysiz
26a0: 65 20 30 20 20 3b 20 23 20 4c 65 6e 67 74 68 20  e 0  ; # Length 
26b0: 6f 66 20 63 6f 6e 74 65 6e 74 73 0a 20 20 20 20  of contents.    
26c0: 74 79 70 65 76 61 72 69 61 62 6c 65 20 6d 79 73  typevariable mys
26d0: 69 6e 6b 20 7b 7d 20 3b 20 23 20 53 69 6e 6b 20  ink {} ; # Sink 
26e0: 74 6f 20 72 65 70 6f 72 74 20 74 6f 0a 0a 20 20  to report to..  
26f0: 20 20 70 72 61 67 6d 61 20 2d 68 61 73 69 6e 73    pragma -hasins
2700: 74 61 6e 63 65 73 20 20 20 6e 6f 20 3b 20 23 20  tances   no ; # 
2710: 73 69 6e 67 6c 65 74 6f 6e 0a 20 20 20 20 70 72  singleton.    pr
2720: 61 67 6d 61 20 2d 68 61 73 74 79 70 65 69 6e 66  agma -hastypeinf
2730: 6f 20 20 20 20 6e 6f 20 3b 20 23 20 6e 6f 20 69  o    no ; # no i
2740: 6e 74 72 6f 73 70 65 63 74 69 6f 6e 0a 20 20 20  ntrospection.   
2750: 20 70 72 61 67 6d 61 20 2d 68 61 73 74 79 70 65   pragma -hastype
2760: 64 65 73 74 72 6f 79 20 6e 6f 20 3b 20 23 20 69  destroy no ; # i
2770: 6d 6d 6f 72 74 61 6c 0a 0a 20 20 20 20 23 20 23  mmortal..    # #
2780: 20 23 23 20 23 23 23 20 23 23 23 23 23 20 23 23   ## ### ##### ##
2790: 23 23 23 23 23 23 20 23 23 23 23 23 23 23 23 23  ###### #########
27a0: 23 23 23 23 0a 7d 0a 0a 6e 61 6d 65 73 70 61 63  ####.}..namespac
27b0: 65 20 65 76 61 6c 20 3a 3a 76 63 3a 3a 72 63 73  e eval ::vc::rcs
27c0: 20 7b 0a 20 20 20 20 6e 61 6d 65 73 70 61 63 65   {.    namespace
27d0: 20 65 78 70 6f 72 74 20 70 61 72 73 65 72 0a 20   export parser. 
27e0: 20 20 20 6e 61 6d 65 73 70 61 63 65 20 65 76 61     namespace eva
27f0: 6c 20 70 61 72 73 65 72 20 7b 0a 09 6e 61 6d 65  l parser {..name
2800: 73 70 61 63 65 20 69 6d 70 6f 72 74 20 3a 3a 76  space import ::v
2810: 63 3a 3a 74 6f 6f 6c 73 3a 3a 6c 6f 67 0a 09 6c  c::tools::log..l
2820: 6f 67 20 72 65 67 69 73 74 65 72 20 72 63 73 0a  og register rcs.
2830: 20 20 20 20 7d 0a 7d 0a 0a 23 20 23 20 23 23 20      }.}..# # ## 
2840: 23 23 23 20 23 23 23 23 23 20 23 23 23 23 23 23  ### ##### ######
2850: 23 23 20 23 23 23 23 23 23 23 23 23 23 23 23 23  ## #############
2860: 20 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23   ###############
2870: 23 23 23 23 23 23 0a 23 23 20 52 65 61 64 79 0a  ######.## Ready.
2880: 0a 70 61 63 6b 61 67 65 20 70 72 6f 76 69 64 65  .package provide
2890: 20 76 63 3a 3a 72 63 73 3a 3a 70 61 72 73 65 72   vc::rcs::parser
28a0: 20 31 2e 30 0a 72 65 74 75 72 6e 0a               1.0.return.