Hex Artifact Content
Not logged in

Artifact de1194a8ed6a5a793a376b007854bd9ae28cb2fd:

File tools/cvs2fossil/lib/rcsparser.tcl part of check-in [be891232a2] - Extended rcs parser to tag errors which are syntax errors in the RCS archive. Extended pass handling to capture trouble and distinguish between internal problems and syntax errors. by aku on 2007-10-12 05:57:53.

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 52  ymbol]} {..    R
0940: 65 71 75 69 72 65 64 4e 75 6d 62 65 72 20 2d 3e  equiredNumber ->
0950: 20 72 65 76 0a 09 20 20 20 20 43 61 6c 6c 20 64   rev..    Call d
0960: 65 66 74 61 67 20 24 73 79 6d 62 6f 6c 20 24 72  eftag $symbol $r
0970: 65 76 0a 09 7d 0a 09 53 65 6d 69 63 6f 6c 6f 6e  ev..}..Semicolon
0980: 0a 09 72 65 74 75 72 6e 0a 20 20 20 20 7d 0a 0a  ..return.    }..
0990: 20 20 20 20 70 72 6f 63 20 4c 6f 63 6b 73 20 7b      proc Locks {
09a0: 7d 20 7b 0a 09 23 20 4e 6f 74 20 73 61 76 69 6e  } {..# Not savin
09b0: 67 20 6c 6f 63 6b 73 2e 0a 09 52 65 71 75 69 72  g locks...Requir
09c0: 65 64 4c 69 74 65 72 61 6c 20 6c 6f 63 6b 73 0a  edLiteral locks.
09d0: 09 77 68 69 6c 65 20 7b 5b 49 64 65 6e 74 20 2d  .while {[Ident -
09e0: 3e 20 73 79 6d 62 6f 6c 5d 7d 20 7b 0a 09 20 20  > symbol]} {..  
09f0: 20 20 52 65 71 75 69 72 65 64 4e 75 6d 62 65 72    RequiredNumber
0a00: 20 2d 3e 20 6c 0a 09 7d 0a 09 53 65 6d 69 63 6f   -> l..}..Semico
0a10: 6c 6f 6e 0a 09 72 65 74 75 72 6e 0a 20 20 20 20  lon..return.    
0a20: 7d 0a 0a 20 20 20 20 70 72 6f 63 20 53 74 72 69  }..    proc Stri
0a30: 63 74 6e 65 73 73 20 7b 7d 20 7b 0a 09 23 20 4e  ctness {} {..# N
0a40: 6f 74 20 73 61 76 69 6e 67 20 73 74 72 69 63 74  ot saving strict
0a50: 6e 65 73 73 0a 09 69 66 20 7b 21 5b 4f 70 74 69  ness..if {![Opti
0a60: 6f 6e 61 6c 4c 69 74 65 72 61 6c 20 73 74 72 69  onalLiteral stri
0a70: 63 74 5d 7d 20 72 65 74 75 72 6e 0a 09 53 65 6d  ct]} return..Sem
0a80: 69 63 6f 6c 6f 6e 0a 09 72 65 74 75 72 6e 0a 20  icolon..return. 
0a90: 20 20 20 7d 0a 0a 20 20 20 20 70 72 6f 63 20 46     }..    proc F
0aa0: 69 6c 65 43 6f 6d 6d 65 6e 74 20 7b 7d 20 7b 0a  ileComment {} {.
0ab0: 09 69 66 20 7b 21 5b 4f 70 74 69 6f 6e 61 6c 4c  .if {![OptionalL
0ac0: 69 74 65 72 61 6c 20 63 6f 6d 6d 65 6e 74 5d 7d  iteral comment]}
0ad0: 20 72 65 74 75 72 6e 0a 09 69 66 20 7b 21 5b 4f   return..if {![O
0ae0: 70 74 69 6f 6e 61 6c 53 74 72 69 6e 67 20 2d 3e  ptionalString ->
0af0: 20 63 5d 7d 20 72 65 74 75 72 6e 0a 09 53 65 6d   c]} return..Sem
0b00: 69 63 6f 6c 6f 6e 0a 09 43 61 6c 6c 20 73 65 74  icolon..Call set
0b10: 63 6f 6d 6d 65 6e 74 20 24 63 0a 09 72 65 74 75  comment $c..retu
0b20: 72 6e 0a 20 20 20 20 7d 0a 0a 20 20 20 20 70 72  rn.    }..    pr
0b30: 6f 63 20 45 78 70 61 6e 64 20 7b 7d 20 7b 0a 09  oc Expand {} {..
0b40: 23 20 4e 6f 74 20 73 61 76 69 6e 67 20 65 78 70  # Not saving exp
0b50: 61 6e 64 65 64 20 6b 65 79 77 6f 72 64 73 0a 09  anded keywords..
0b60: 69 66 20 7b 21 5b 4f 70 74 69 6f 6e 61 6c 4c 69  if {![OptionalLi
0b70: 74 65 72 61 6c 20 65 78 70 61 6e 64 5d 7d 20 72  teral expand]} r
0b80: 65 74 75 72 6e 0a 09 69 66 20 7b 21 5b 4f 70 74  eturn..if {![Opt
0b90: 69 6f 6e 61 6c 53 74 72 69 6e 67 20 2d 3e 20 64  ionalString -> d
0ba0: 75 6d 6d 79 5d 7d 20 72 65 74 75 72 6e 0a 09 53  ummy]} return..S
0bb0: 65 6d 69 63 6f 6c 6f 6e 0a 09 72 65 74 75 72 6e  emicolon..return
0bc0: 0a 20 20 20 20 7d 0a 0a 20 20 20 20 23 20 23 20  .    }..    # # 
0bd0: 23 23 20 23 23 23 20 23 23 23 23 23 20 23 23 23  ## ### ##### ###
0be0: 23 23 23 23 23 20 23 23 23 23 23 23 23 23 23 23  ##### ##########
0bf0: 23 23 23 0a 0a 20 20 20 20 70 72 6f 63 20 44 65  ###..    proc De
0c00: 6c 74 61 73 20 7b 7d 20 7b 0a 09 77 68 69 6c 65  ltas {} {..while
0c10: 20 7b 5b 4f 70 74 69 6f 6e 61 6c 4e 75 6d 62 65   {[OptionalNumbe
0c20: 72 20 2d 3e 20 72 65 76 5d 7d 20 7b 0a 09 20 20  r -> rev]} {..  
0c30: 20 20 44 61 74 65 20 20 20 20 20 2d 3e 20 64 0a    Date     -> d.
0c40: 09 20 20 20 20 41 75 74 68 6f 72 20 20 20 2d 3e  .    Author   ->
0c50: 20 61 0a 09 20 20 20 20 53 74 61 74 65 20 20 20   a..    State   
0c60: 20 2d 3e 20 73 0a 09 20 20 20 20 42 72 61 6e 63   -> s..    Branc
0c70: 68 65 73 20 2d 3e 20 62 0a 09 20 20 20 20 4e 65  hes -> b..    Ne
0c80: 78 74 52 65 76 20 20 2d 3e 20 6e 0a 09 20 20 20  xtRev  -> n..   
0c90: 20 43 61 6c 6c 20 64 65 66 20 24 72 65 76 20 24   Call def $rev $
0ca0: 64 20 24 61 20 24 73 20 24 6e 20 24 62 0a 09 7d  d $a $s $n $b..}
0cb0: 0a 09 72 65 74 75 72 6e 0a 20 20 20 20 7d 0a 0a  ..return.    }..
0cc0: 20 20 20 20 23 20 23 20 23 23 20 23 23 23 20 23      # # ## ### #
0cd0: 23 23 23 23 20 23 23 23 23 23 23 23 23 20 23 23  #### ######## ##
0ce0: 23 23 23 23 23 23 23 23 23 23 23 0a 0a 20 20 20  ###########..   
0cf0: 20 70 72 6f 63 20 44 61 74 65 20 7b 5f 20 64 76   proc Date {_ dv
0d00: 7d 20 7b 0a 09 75 70 76 61 72 20 31 20 24 64 76  } {..upvar 1 $dv
0d10: 20 64 0a 09 52 65 71 75 69 72 65 64 4c 69 74 65   d..RequiredLite
0d20: 72 61 6c 20 64 61 74 65 0a 09 52 65 71 75 69 72  ral date..Requir
0d30: 65 64 4e 75 6d 62 65 72 20 2d 3e 20 64 0a 09 53  edNumber -> d..S
0d40: 65 6d 69 63 6f 6c 6f 6e 0a 0a 09 73 74 72 75 63  emicolon...struc
0d50: 74 3a 3a 6c 69 73 74 20 61 73 73 69 67 6e 20 5b  t::list assign [
0d60: 73 70 6c 69 74 20 24 64 20 2e 5d 20 79 65 61 72  split $d .] year
0d70: 20 6d 6f 6e 74 68 20 64 61 79 20 68 6f 75 72 20   month day hour 
0d80: 6d 69 6e 20 73 65 63 0a 09 69 66 20 7b 24 79 65  min sec..if {$ye
0d90: 61 72 20 3c 20 31 30 30 7d 20 7b 69 6e 63 72 20  ar < 100} {incr 
0da0: 79 65 61 72 20 31 39 30 30 7d 0a 09 73 65 74 20  year 1900}..set 
0db0: 64 20 5b 63 6c 6f 63 6b 20 73 63 61 6e 20 22 24  d [clock scan "$
0dc0: 7b 79 65 61 72 7d 2d 24 7b 6d 6f 6e 74 68 7d 2d  {year}-${month}-
0dd0: 24 7b 64 61 79 7d 20 24 7b 68 6f 75 72 7d 3a 24  ${day} ${hour}:$
0de0: 7b 6d 69 6e 7d 3a 24 7b 73 65 63 7d 22 5d 0a 09  {min}:${sec}"]..
0df0: 72 65 74 75 72 6e 0a 20 20 20 20 7d 0a 0a 20 20  return.    }..  
0e00: 20 20 70 72 6f 63 20 41 75 74 68 6f 72 20 7b 5f    proc Author {_
0e10: 20 61 76 7d 20 7b 0a 09 75 70 76 61 72 20 31 20   av} {..upvar 1 
0e20: 24 61 76 20 61 0a 09 52 65 71 75 69 72 65 64 4c  $av a..RequiredL
0e30: 69 74 65 72 61 6c 20 61 75 74 68 6f 72 0a 09 41  iteral author..A
0e40: 6e 79 74 68 69 6e 67 20 2d 3e 20 61 0a 09 53 65  nything -> a..Se
0e50: 6d 69 63 6f 6c 6f 6e 0a 09 72 65 74 75 72 6e 0a  micolon..return.
0e60: 20 20 20 20 7d 0a 0a 20 20 20 20 70 72 6f 63 20      }..    proc 
0e70: 53 74 61 74 65 20 7b 5f 20 73 76 7d 20 7b 0a 09  State {_ sv} {..
0e80: 75 70 76 61 72 20 31 20 24 73 76 20 73 0a 09 52  upvar 1 $sv s..R
0e90: 65 71 75 69 72 65 64 4c 69 74 65 72 61 6c 20 73  equiredLiteral s
0ea0: 74 61 74 65 0a 09 41 6e 79 74 68 69 6e 67 20 2d  tate..Anything -
0eb0: 3e 20 73 0a 09 53 65 6d 69 63 6f 6c 6f 6e 0a 09  > s..Semicolon..
0ec0: 72 65 74 75 72 6e 0a 20 20 20 20 7d 0a 0a 20 20  return.    }..  
0ed0: 20 20 70 72 6f 63 20 42 72 61 6e 63 68 65 73 20    proc Branches 
0ee0: 7b 5f 20 62 76 7d 20 7b 0a 09 75 70 76 61 72 20  {_ bv} {..upvar 
0ef0: 31 20 24 62 76 20 62 0a 09 52 65 71 75 69 72 65  1 $bv b..Require
0f00: 64 4c 69 74 65 72 61 6c 20 62 72 61 6e 63 68 65  dLiteral branche
0f10: 73 0a 09 41 6e 79 74 68 69 6e 67 20 2d 3e 20 62  s..Anything -> b
0f20: 0a 09 53 65 6d 69 63 6f 6c 6f 6e 0a 09 72 65 74  ..Semicolon..ret
0f30: 75 72 6e 0a 20 20 20 20 7d 0a 0a 20 20 20 20 70  urn.    }..    p
0f40: 72 6f 63 20 4e 65 78 74 52 65 76 20 7b 5f 20 6e  roc NextRev {_ n
0f50: 76 7d 20 7b 0a 09 75 70 76 61 72 20 31 20 24 6e  v} {..upvar 1 $n
0f60: 76 20 6e 0a 09 52 65 71 75 69 72 65 64 4c 69 74  v n..RequiredLit
0f70: 65 72 61 6c 20 6e 65 78 74 0a 09 41 6e 79 74 68  eral next..Anyth
0f80: 69 6e 67 20 2d 3e 20 6e 0a 09 53 65 6d 69 63 6f  ing -> n..Semico
0f90: 6c 6f 6e 0a 09 72 65 74 75 72 6e 0a 20 20 20 20  lon..return.    
0fa0: 7d 0a 0a 20 20 20 20 23 20 23 20 23 23 20 23 23  }..    # # ## ##
0fb0: 23 20 23 23 23 23 23 20 23 23 23 23 23 23 23 23  # ##### ########
0fc0: 20 23 23 23 23 23 23 23 23 23 23 23 23 23 0a 0a   #############..
0fd0: 20 20 20 20 70 72 6f 63 20 44 65 73 63 72 69 70      proc Descrip
0fe0: 74 69 6f 6e 20 7b 7d 20 7b 0a 09 75 70 76 61 72  tion {} {..upvar
0ff0: 20 31 20 64 61 74 61 20 64 61 74 61 20 72 65 73   1 data data res
1000: 20 72 65 73 0a 09 52 65 71 75 69 72 65 64 4c 69   res..RequiredLi
1010: 74 65 72 61 6c 20 64 65 73 63 0a 09 52 65 71 75  teral desc..Requ
1020: 69 72 65 64 53 74 72 69 6e 67 20 2d 3e 20 64 0a  iredString -> d.
1030: 09 43 61 6c 6c 20 73 65 74 64 65 73 63 20 24 64  .Call setdesc $d
1040: 0a 09 72 65 74 75 72 6e 0a 20 20 20 20 7d 0a 0a  ..return.    }..
1050: 20 20 20 20 23 20 23 20 23 23 20 23 23 23 20 23      # # ## ### #
1060: 23 23 23 23 20 23 23 23 23 23 23 23 23 20 23 23  #### ######## ##
1070: 23 23 23 23 23 23 23 23 23 23 23 0a 0a 20 20 20  ###########..   
1080: 20 70 72 6f 63 20 44 65 6c 74 61 54 65 78 74 73   proc DeltaTexts
1090: 20 7b 7d 20 7b 0a 09 77 68 69 6c 65 20 7b 5b 4f   {} {..while {[O
10a0: 70 74 69 6f 6e 61 6c 4e 75 6d 62 65 72 20 2d 3e  ptionalNumber ->
10b0: 20 72 65 76 5d 7d 20 7b 0a 09 20 20 20 20 52 65   rev]} {..    Re
10c0: 71 75 69 72 65 64 4c 69 74 65 72 61 6c 20 6c 6f  quiredLiteral lo
10d0: 67 0a 09 20 20 20 20 52 65 71 75 69 72 65 64 53  g..    RequiredS
10e0: 74 72 69 6e 67 20 20 20 20 20 20 2d 3e 20 63 6d  tring      -> cm
10f0: 73 67 0a 09 20 20 20 20 52 65 71 75 69 72 65 64  sg..    Required
1100: 4c 69 74 65 72 61 6c 20 74 65 78 74 0a 09 20 20  Literal text..  
1110: 20 20 52 65 71 75 69 72 65 64 53 74 72 69 6e 67    RequiredString
1120: 52 61 6e 67 65 20 2d 3e 20 64 65 6c 74 61 0a 09  Range -> delta..
1130: 20 20 20 20 43 61 6c 6c 20 65 78 74 65 6e 64 20      Call extend 
1140: 24 72 65 76 20 24 63 6d 73 67 20 24 64 65 6c 74  $rev $cmsg $delt
1150: 61 0a 09 7d 0a 09 72 65 74 75 72 6e 0a 20 20 20  a..}..return.   
1160: 20 7d 0a 0a 20 20 20 20 23 20 23 20 23 23 20 23   }..    # # ## #
1170: 23 23 20 23 23 23 23 23 20 23 23 23 23 23 23 23  ## ##### #######
1180: 23 20 23 23 23 23 23 23 23 23 23 23 23 23 23 0a  # #############.
1190: 20 20 20 20 23 23 20 49 6e 74 65 72 6e 61 6c 20      ## Internal 
11a0: 6d 65 74 68 6f 64 73 2c 20 6c 65 78 69 6f 67 72  methods, lexiogr
11b0: 61 70 68 69 63 61 6c 20 70 72 6f 63 65 73 73 69  aphical processi
11c0: 6e 67 0a 0a 20 20 20 20 70 72 6f 63 20 53 65 6d  ng..    proc Sem
11d0: 69 63 6f 6c 6f 6e 20 7b 7d 20 7b 0a 09 3a 3a 76  icolon {} {..::v
11e0: 61 72 69 61 62 6c 65 20 6d 79 64 61 74 61 0a 09  ariable mydata..
11f0: 3a 3a 76 61 72 69 61 62 6c 65 20 6d 79 70 6f 73  ::variable mypos
1200: 0a 0a 09 73 65 74 20 6f 6b 20 5b 72 65 67 65 78  ...set ok [regex
1210: 70 20 2d 73 74 61 72 74 20 24 6d 79 70 6f 73 20  p -start $mypos 
1220: 2d 69 6e 64 69 63 65 73 20 2d 2d 20 7b 5c 41 5c  -indices -- {\A\
1230: 73 2a 3b 5c 73 2a 7d 20 24 6d 79 64 61 74 61 20  s*;\s*} $mydata 
1240: 6d 61 74 63 68 5d 0a 09 69 66 20 7b 21 24 6f 6b  match]..if {!$ok
1250: 7d 20 7b 20 45 78 70 65 63 74 65 64 20 27 3b 27  } { Expected ';'
1260: 20 7d 0a 0a 09 53 6b 69 70 4f 76 65 72 20 6d 61   }...SkipOver ma
1270: 74 63 68 0a 09 72 65 74 75 72 6e 0a 20 20 20 20  tch..return.    
1280: 7d 0a 0a 20 20 20 20 70 72 6f 63 20 52 65 71 75  }..    proc Requ
1290: 69 72 65 64 4c 69 74 65 72 61 6c 20 7b 6e 61 6d  iredLiteral {nam
12a0: 65 7d 20 7b 0a 09 3a 3a 76 61 72 69 61 62 6c 65  e} {..::variable
12b0: 20 6d 79 64 61 74 61 0a 09 3a 3a 76 61 72 69 61   mydata..::varia
12c0: 62 6c 65 20 6d 79 70 6f 73 0a 0a 09 73 65 74 20  ble mypos...set 
12d0: 70 61 74 74 65 72 6e 20 22 5c 5c 41 5c 5c 73 2a  pattern "\\A\\s*
12e0: 24 6e 61 6d 65 5c 5c 73 2a 22 0a 09 73 65 74 20  $name\\s*"..set 
12f0: 6f 6b 20 5b 72 65 67 65 78 70 20 2d 73 74 61 72  ok [regexp -star
1300: 74 20 24 6d 79 70 6f 73 20 2d 69 6e 64 69 63 65  t $mypos -indice
1310: 73 20 2d 2d 20 24 70 61 74 74 65 72 6e 20 24 6d  s -- $pattern $m
1320: 79 64 61 74 61 20 6d 61 74 63 68 5d 0a 09 69 66  ydata match]..if
1330: 20 7b 21 24 6f 6b 7d 20 7b 20 45 78 70 65 63 74   {!$ok} { Expect
1340: 65 64 20 27 24 6e 61 6d 65 27 20 7d 0a 0a 09 53  ed '$name' }...S
1350: 6b 69 70 4f 76 65 72 20 6d 61 74 63 68 0a 09 72  kipOver match..r
1360: 65 74 75 72 6e 0a 20 20 20 20 7d 0a 0a 20 20 20  eturn.    }..   
1370: 20 70 72 6f 63 20 4f 70 74 69 6f 6e 61 6c 4c 69   proc OptionalLi
1380: 74 65 72 61 6c 20 7b 6e 61 6d 65 7d 20 7b 0a 09  teral {name} {..
1390: 3a 3a 76 61 72 69 61 62 6c 65 20 6d 79 64 61 74  ::variable mydat
13a0: 61 0a 09 3a 3a 76 61 72 69 61 62 6c 65 20 6d 79  a..::variable my
13b0: 70 6f 73 0a 0a 09 73 65 74 20 70 61 74 74 65 72  pos...set patter
13c0: 6e 20 22 5c 5c 41 5c 5c 73 2a 24 6e 61 6d 65 5c  n "\\A\\s*$name\
13d0: 5c 73 2a 22 0a 09 73 65 74 20 6f 6b 20 5b 72 65  \s*"..set ok [re
13e0: 67 65 78 70 20 2d 73 74 61 72 74 20 24 6d 79 70  gexp -start $myp
13f0: 6f 73 20 2d 69 6e 64 69 63 65 73 20 2d 2d 20 24  os -indices -- $
1400: 70 61 74 74 65 72 6e 20 24 6d 79 64 61 74 61 20  pattern $mydata 
1410: 6d 61 74 63 68 5d 0a 09 69 66 20 7b 21 24 6f 6b  match]..if {!$ok
1420: 7d 20 7b 20 72 65 74 75 72 6e 20 30 20 7d 0a 0a  } { return 0 }..
1430: 09 53 6b 69 70 4f 76 65 72 20 6d 61 74 63 68 0a  .SkipOver match.
1440: 09 72 65 74 75 72 6e 20 31 0a 20 20 20 20 7d 0a  .return 1.    }.
1450: 0a 20 20 20 20 70 72 6f 63 20 52 65 71 75 69 72  .    proc Requir
1460: 65 64 4e 75 6d 62 65 72 20 7b 5f 20 76 7d 20 7b  edNumber {_ v} {
1470: 0a 09 75 70 76 61 72 20 31 20 24 76 20 76 61 6c  ..upvar 1 $v val
1480: 75 65 0a 09 3a 3a 76 61 72 69 61 62 6c 65 20 6d  ue..::variable m
1490: 79 64 61 74 61 0a 09 3a 3a 76 61 72 69 61 62 6c  ydata..::variabl
14a0: 65 20 6d 79 70 6f 73 0a 0a 09 73 65 74 20 70 61  e mypos...set pa
14b0: 74 74 65 72 6e 20 7b 5c 41 5c 73 2a 28 28 5c 64  ttern {\A\s*((\d
14c0: 7c 5c 2e 29 2b 29 5c 73 2a 7d 0a 09 73 65 74 20  |\.)+)\s*}..set 
14d0: 6f 6b 20 5b 72 65 67 65 78 70 20 2d 73 74 61 72  ok [regexp -star
14e0: 74 20 24 6d 79 70 6f 73 20 2d 69 6e 64 69 63 65  t $mypos -indice
14f0: 73 20 2d 2d 20 24 70 61 74 74 65 72 6e 20 24 6d  s -- $pattern $m
1500: 79 64 61 74 61 20 6d 61 74 63 68 20 76 5d 0a 09  ydata match v]..
1510: 69 66 20 7b 21 24 6f 6b 7d 20 7b 20 45 78 70 65  if {!$ok} { Expe
1520: 63 74 65 64 20 69 64 20 7d 0a 0a 09 45 78 74 72  cted id }...Extr
1530: 61 63 74 20 24 76 20 2d 3e 20 76 61 6c 75 65 0a  act $v -> value.
1540: 09 53 6b 69 70 4f 76 65 72 20 6d 61 74 63 68 0a  .SkipOver match.
1550: 09 72 65 74 75 72 6e 0a 20 20 20 20 7d 0a 0a 20  .return.    }.. 
1560: 20 20 20 70 72 6f 63 20 4f 70 74 69 6f 6e 61 6c     proc Optional
1570: 4e 75 6d 62 65 72 20 7b 5f 20 76 7d 20 7b 0a 09  Number {_ v} {..
1580: 75 70 76 61 72 20 31 20 24 76 20 76 61 6c 75 65  upvar 1 $v value
1590: 0a 09 3a 3a 76 61 72 69 61 62 6c 65 20 6d 79 64  ..::variable myd
15a0: 61 74 61 0a 09 3a 3a 76 61 72 69 61 62 6c 65 20  ata..::variable 
15b0: 6d 79 70 6f 73 0a 0a 09 73 65 74 20 70 61 74 74  mypos...set patt
15c0: 65 72 6e 20 7b 5c 41 5c 73 2a 28 28 5c 64 7c 5c  ern {\A\s*((\d|\
15d0: 2e 29 2b 29 5c 73 2a 7d 0a 09 73 65 74 20 6f 6b  .)+)\s*}..set ok
15e0: 20 5b 72 65 67 65 78 70 20 2d 73 74 61 72 74 20   [regexp -start 
15f0: 24 6d 79 70 6f 73 20 2d 69 6e 64 69 63 65 73 20  $mypos -indices 
1600: 2d 2d 20 24 70 61 74 74 65 72 6e 20 24 6d 79 64  -- $pattern $myd
1610: 61 74 61 20 6d 61 74 63 68 20 76 5d 0a 09 69 66  ata match v]..if
1620: 20 7b 21 24 6f 6b 7d 20 7b 20 72 65 74 75 72 6e   {!$ok} { return
1630: 20 30 20 7d 0a 0a 09 45 78 74 72 61 63 74 20 24   0 }...Extract $
1640: 76 20 2d 3e 20 76 61 6c 75 65 0a 09 53 6b 69 70  v -> value..Skip
1650: 4f 76 65 72 20 6d 61 74 63 68 0a 09 72 65 74 75  Over match..retu
1660: 72 6e 20 31 0a 20 20 20 20 7d 0a 0a 20 20 20 20  rn 1.    }..    
1670: 70 72 6f 63 20 52 65 71 75 69 72 65 64 53 74 72  proc RequiredStr
1680: 69 6e 67 20 7b 5f 20 76 7d 20 7b 0a 09 75 70 76  ing {_ v} {..upv
1690: 61 72 20 31 20 24 76 20 76 61 6c 75 65 0a 09 3a  ar 1 $v value..:
16a0: 3a 76 61 72 69 61 62 6c 65 20 6d 79 64 61 74 61  :variable mydata
16b0: 0a 09 3a 3a 76 61 72 69 61 62 6c 65 20 6d 79 70  ..::variable myp
16c0: 6f 73 0a 0a 09 73 65 74 20 6f 6b 20 5b 72 65 67  os...set ok [reg
16d0: 65 78 70 20 2d 73 74 61 72 74 20 24 6d 79 70 6f  exp -start $mypo
16e0: 73 20 2d 69 6e 64 69 63 65 73 20 2d 2d 20 7b 5c  s -indices -- {\
16f0: 41 5c 73 2a 40 28 28 5b 5e 40 5d 2a 28 40 40 29  A\s*@(([^@]*(@@)
1700: 2a 29 2a 29 40 5c 73 2a 7d 20 24 6d 79 64 61 74  *)*)@\s*} $mydat
1710: 61 20 6d 61 74 63 68 20 76 5d 0a 09 69 66 20 7b  a match v]..if {
1720: 21 24 6f 6b 7d 20 7b 20 45 78 70 65 63 74 65 64  !$ok} { Expected
1730: 20 73 74 72 69 6e 67 20 7d 0a 0a 09 45 78 74 72   string }...Extr
1740: 61 63 74 20 24 76 20 2d 3e 20 76 61 6c 75 65 0a  act $v -> value.
1750: 09 73 65 74 20 76 61 6c 75 65 20 5b 73 74 72 69  .set value [stri
1760: 6e 67 20 6d 61 70 20 7b 40 40 20 40 7d 20 24 76  ng map {@@ @} $v
1770: 61 6c 75 65 5d 0a 09 53 6b 69 70 4f 76 65 72 20  alue]..SkipOver 
1780: 6d 61 74 63 68 0a 09 72 65 74 75 72 6e 0a 20 20  match..return.  
1790: 20 20 7d 0a 0a 20 20 20 20 70 72 6f 63 20 52 65    }..    proc Re
17a0: 71 75 69 72 65 64 53 74 72 69 6e 67 52 61 6e 67  quiredStringRang
17b0: 65 20 7b 5f 20 76 7d 20 7b 0a 09 75 70 76 61 72  e {_ v} {..upvar
17c0: 20 31 20 24 76 20 76 61 6c 75 65 0a 09 3a 3a 76   1 $v value..::v
17d0: 61 72 69 61 62 6c 65 20 6d 79 64 61 74 61 0a 09  ariable mydata..
17e0: 3a 3a 76 61 72 69 61 62 6c 65 20 6d 79 70 6f 73  ::variable mypos
17f0: 0a 0a 09 73 65 74 20 6f 6b 20 5b 72 65 67 65 78  ...set ok [regex
1800: 70 20 2d 73 74 61 72 74 20 24 6d 79 70 6f 73 20  p -start $mypos 
1810: 2d 69 6e 64 69 63 65 73 20 2d 2d 20 7b 5c 41 5c  -indices -- {\A\
1820: 73 2a 40 28 28 5b 5e 40 5d 2a 28 40 40 29 2a 29  s*@(([^@]*(@@)*)
1830: 2a 29 40 5c 73 2a 7d 20 24 6d 79 64 61 74 61 20  *)@\s*} $mydata 
1840: 6d 61 74 63 68 20 76 61 6c 75 65 5d 0a 09 69 66  match value]..if
1850: 20 7b 21 24 6f 6b 7d 20 7b 20 45 78 70 65 63 74   {!$ok} { Expect
1860: 65 64 20 73 74 72 69 6e 67 20 7d 0a 0a 09 53 6b  ed string }...Sk
1870: 69 70 4f 76 65 72 20 6d 61 74 63 68 0a 09 72 65  ipOver match..re
1880: 74 75 72 6e 0a 20 20 20 20 7d 0a 0a 20 20 20 20  turn.    }..    
1890: 70 72 6f 63 20 4f 70 74 69 6f 6e 61 6c 53 74 72  proc OptionalStr
18a0: 69 6e 67 20 7b 5f 20 76 7d 20 7b 0a 09 75 70 76  ing {_ v} {..upv
18b0: 61 72 20 31 20 24 76 20 76 61 6c 75 65 0a 09 3a  ar 1 $v value..:
18c0: 3a 76 61 72 69 61 62 6c 65 20 6d 79 64 61 74 61  :variable mydata
18d0: 0a 09 3a 3a 76 61 72 69 61 62 6c 65 20 6d 79 70  ..::variable myp
18e0: 6f 73 0a 0a 09 73 65 74 20 6f 6b 20 5b 72 65 67  os...set ok [reg
18f0: 65 78 70 20 2d 73 74 61 72 74 20 24 6d 79 70 6f  exp -start $mypo
1900: 73 20 2d 69 6e 64 69 63 65 73 20 2d 2d 20 7b 5c  s -indices -- {\
1910: 41 5c 73 2a 40 28 28 5b 5e 40 5d 2a 28 40 40 29  A\s*@(([^@]*(@@)
1920: 2a 29 2a 29 40 5c 73 2a 7d 20 24 6d 79 64 61 74  *)*)@\s*} $mydat
1930: 61 20 6d 61 74 63 68 20 76 5d 0a 09 69 66 20 7b  a match v]..if {
1940: 21 24 6f 6b 7d 20 7b 20 72 65 74 75 72 6e 20 30  !$ok} { return 0
1950: 20 7d 0a 0a 09 45 78 74 72 61 63 74 20 24 76 20   }...Extract $v 
1960: 2d 3e 20 76 61 6c 75 65 0a 09 73 65 74 20 76 61  -> value..set va
1970: 6c 75 65 20 5b 73 74 72 69 6e 67 20 6d 61 70 20  lue [string map 
1980: 7b 40 40 20 40 7d 20 24 76 61 6c 75 65 5d 0a 09  {@@ @} $value]..
1990: 53 6b 69 70 4f 76 65 72 20 6d 61 74 63 68 0a 09  SkipOver match..
19a0: 72 65 74 75 72 6e 20 31 0a 20 20 20 20 7d 0a 0a  return 1.    }..
19b0: 20 20 20 20 70 72 6f 63 20 49 64 65 6e 74 20 7b      proc Ident {
19c0: 5f 20 76 7d 20 7b 0a 09 75 70 76 61 72 20 31 20  _ v} {..upvar 1 
19d0: 24 76 20 76 61 6c 75 65 0a 09 3a 3a 76 61 72 69  $v value..::vari
19e0: 61 62 6c 65 20 6d 79 64 61 74 61 0a 09 3a 3a 76  able mydata..::v
19f0: 61 72 69 61 62 6c 65 20 6d 79 70 6f 73 0a 0a 09  ariable mypos...
1a00: 73 65 74 20 6f 6b 20 5b 72 65 67 65 78 70 20 2d  set ok [regexp -
1a10: 73 74 61 72 74 20 24 6d 79 70 6f 73 20 2d 69 6e  start $mypos -in
1a20: 64 69 63 65 73 20 2d 2d 20 7b 5c 41 5c 73 2a 3b  dices -- {\A\s*;
1a30: 5c 73 2a 7d 20 24 6d 79 64 61 74 61 5d 0a 09 69  \s*} $mydata]..i
1a40: 66 20 7b 24 6f 6b 7d 20 7b 20 72 65 74 75 72 6e  f {$ok} { return
1a50: 20 30 20 7d 0a 0a 09 73 65 74 20 6f 6b 20 5b 72   0 }...set ok [r
1a60: 65 67 65 78 70 20 2d 73 74 61 72 74 20 24 6d 79  egexp -start $my
1a70: 70 6f 73 20 2d 69 6e 64 69 63 65 73 20 2d 2d 20  pos -indices -- 
1a80: 7b 5c 41 5c 73 2a 28 5b 5e 3a 5d 2a 29 5c 73 2a  {\A\s*([^:]*)\s*
1a90: 3a 5c 73 2a 7d 20 24 6d 79 64 61 74 61 20 6d 61  :\s*} $mydata ma
1aa0: 74 63 68 20 76 5d 0a 09 69 66 20 7b 21 24 6f 6b  tch v]..if {!$ok
1ab0: 7d 20 7b 20 72 65 74 75 72 6e 20 30 20 7d 0a 0a  } { return 0 }..
1ac0: 09 45 78 74 72 61 63 74 20 24 76 20 2d 3e 20 76  .Extract $v -> v
1ad0: 61 6c 75 65 0a 09 53 6b 69 70 4f 76 65 72 20 6d  alue..SkipOver m
1ae0: 61 74 63 68 0a 09 72 65 74 75 72 6e 20 31 0a 20  atch..return 1. 
1af0: 20 20 20 7d 0a 0a 20 20 20 20 70 72 6f 63 20 41     }..    proc A
1b00: 6e 79 74 68 69 6e 67 20 7b 5f 20 76 7d 20 7b 0a  nything {_ v} {.
1b10: 09 75 70 76 61 72 20 31 20 24 76 20 76 61 6c 75  .upvar 1 $v valu
1b20: 65 0a 09 3a 3a 76 61 72 69 61 62 6c 65 20 6d 79  e..::variable my
1b30: 64 61 74 61 0a 09 3a 3a 76 61 72 69 61 62 6c 65  data..::variable
1b40: 20 6d 79 70 6f 73 0a 0a 09 72 65 67 65 78 70 20   mypos...regexp 
1b50: 2d 73 74 61 72 74 20 24 6d 79 70 6f 73 20 2d 69  -start $mypos -i
1b60: 6e 64 69 63 65 73 20 2d 2d 20 7b 5c 41 5c 73 2a  ndices -- {\A\s*
1b70: 28 5b 5e 3b 5d 2a 29 5c 73 2a 7d 20 24 6d 79 64  ([^;]*)\s*} $myd
1b80: 61 74 61 20 6d 61 74 63 68 20 76 0a 0a 09 45 78  ata match v...Ex
1b90: 74 72 61 63 74 20 24 76 20 2d 3e 20 76 61 6c 75  tract $v -> valu
1ba0: 65 0a 09 53 6b 69 70 4f 76 65 72 20 6d 61 74 63  e..SkipOver matc
1bb0: 68 0a 09 72 65 74 75 72 6e 0a 20 20 20 20 7d 0a  h..return.    }.
1bc0: 0a 20 20 20 20 23 20 23 20 23 23 20 23 23 23 20  .    # # ## ### 
1bd0: 23 23 23 23 23 20 23 23 23 23 23 23 23 23 20 23  ##### ######## #
1be0: 23 23 23 23 23 23 23 23 23 23 23 23 0a 20 20 20  ############.   
1bf0: 20 23 23 20 49 6e 74 65 72 6e 61 6c 20 6d 65 74   ## Internal met
1c00: 68 6f 64 73 2c 20 69 6e 70 75 74 20 68 61 6e 64  hods, input hand
1c10: 6c 69 6e 67 0a 0a 20 20 20 20 70 72 6f 63 20 45  ling..    proc E
1c20: 78 74 72 61 63 74 20 7b 72 61 6e 67 65 20 5f 20  xtract {range _ 
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 73 74 72 75 63  le mydata..struc
1c60: 74 3a 3a 6c 69 73 74 20 61 73 73 69 67 6e 20 24  t::list assign $
1c70: 72 61 6e 67 65 20 73 20 65 0a 09 73 65 74 20 76  range s e..set v
1c80: 61 6c 75 65 20 5b 73 74 72 69 6e 67 20 72 61 6e  alue [string ran
1c90: 67 65 20 24 6d 79 64 61 74 61 20 24 73 20 24 65  ge $mydata $s $e
1ca0: 5d 0a 09 72 65 74 75 72 6e 0a 20 20 20 20 7d 0a  ]..return.    }.
1cb0: 0a 20 20 20 20 70 72 6f 63 20 53 6b 69 70 4f 76  .    proc SkipOv
1cc0: 65 72 20 7b 6d 76 7d 20 7b 0a 09 23 20 4e 6f 74  er {mv} {..# Not
1cd0: 65 3a 20 54 68 65 20 69 6e 64 69 63 65 73 20 61  e: The indices a
1ce0: 72 65 20 61 62 73 6f 6c 75 74 65 21 2c 20 6e 6f  re absolute!, no
1cf0: 74 20 72 65 6c 61 74 69 76 65 20 74 6f 20 74 68  t relative to th
1d00: 65 20 73 74 61 72 74 0a 09 23 20 6c 6f 63 61 74  e start..# locat
1d10: 69 6f 6e 2e 0a 09 75 70 76 61 72 20 31 20 24 6d  ion...upvar 1 $m
1d20: 76 20 6d 61 74 63 68 0a 09 3a 3a 76 61 72 69 61  v match..::varia
1d30: 62 6c 65 20 6d 79 70 6f 73 0a 09 3a 3a 76 61 72  ble mypos..::var
1d40: 69 61 62 6c 65 20 6d 79 73 69 7a 65 0a 0a 09 73  iable mysize...s
1d50: 74 72 75 63 74 3a 3a 6c 69 73 74 20 61 73 73 69  truct::list assi
1d60: 67 6e 20 24 6d 61 74 63 68 20 73 20 65 0a 09 23  gn $match s e..#
1d70: 70 75 74 73 20 22 3c 24 73 20 24 65 3e 20 5b 69  puts "<$s $e> [i
1d80: 6e 66 6f 20 6c 65 76 65 6c 20 2d 31 5d 22 0a 0a  nfo level -1]"..
1d90: 09 73 65 74 20 20 6d 79 70 6f 73 20 24 65 0a 09  .set  mypos $e..
1da0: 69 6e 63 72 20 6d 79 70 6f 73 0a 0a 09 6c 6f 67  incr mypos...log
1db0: 20 70 72 6f 67 72 65 73 73 20 32 20 72 63 73 20   progress 2 rcs 
1dc0: 24 6d 79 70 6f 73 20 24 6d 79 73 69 7a 65 0a 09  $mypos $mysize..
1dd0: 23 70 75 74 73 20 24 6d 79 70 6f 73 2f 24 6d 79  #puts $mypos/$my
1de0: 73 69 7a 65 0a 09 72 65 74 75 72 6e 0a 20 20 20  size..return.   
1df0: 20 7d 0a 0a 20 20 20 20 70 72 6f 63 20 45 78 70   }..    proc Exp
1e00: 65 63 74 65 64 20 7b 78 7d 20 7b 0a 09 3a 3a 76  ected {x} {..::v
1e10: 61 72 69 61 62 6c 65 20 6d 79 64 61 74 61 0a 09  ariable mydata..
1e20: 3a 3a 76 61 72 69 61 62 6c 65 20 6d 79 70 6f 73  ::variable mypos
1e30: 0a 09 73 65 74 20 65 20 24 6d 79 70 6f 73 20 3b  ..set e $mypos ;
1e40: 20 69 6e 63 72 20 65 20 33 30 0a 09 72 65 74 75   incr e 30..retu
1e50: 72 6e 20 2d 63 6f 64 65 20 65 72 72 6f 72 20 2d  rn -code error -
1e60: 65 72 72 6f 72 63 6f 64 65 20 76 63 3a 3a 72 63  errorcode vc::rc
1e70: 73 3a 3a 70 61 72 73 65 72 20 5c 0a 09 20 20 20  s::parser \..   
1e80: 20 22 45 78 70 65 63 74 65 64 20 24 78 20 40 20   "Expected $x @ 
1e90: 27 5b 73 74 72 69 6e 67 20 72 61 6e 67 65 20 24  '[string range $
1ea0: 6d 79 64 61 74 61 20 24 6d 79 70 6f 73 20 24 65  mydata $mypos $e
1eb0: 5d 2e 2e 2e 27 22 20 0a 20 20 20 20 7d 0a 0a 20  ]...'" .    }.. 
1ec0: 20 20 20 23 20 23 20 23 23 20 23 23 23 20 23 23     # # ## ### ##
1ed0: 23 23 23 20 23 23 23 23 23 23 23 23 20 23 23 23  ### ######## ###
1ee0: 23 23 23 23 23 23 23 23 23 23 0a 20 20 20 20 23  ##########.    #
1ef0: 23 20 53 65 74 75 70 2c 20 63 61 6c 6c 62 61 63  # Setup, callbac
1f00: 6b 73 2e 0a 0a 20 20 20 20 70 72 6f 63 20 49 6e  ks...    proc In
1f10: 69 74 69 61 6c 69 7a 65 20 7b 70 61 74 68 20 73  itialize {path s
1f20: 69 6e 6b 7d 20 7b 0a 09 3a 3a 76 61 72 69 61 62  ink} {..::variab
1f30: 6c 65 20 6d 79 70 6f 73 20 20 30 0a 09 3a 3a 76  le mypos  0..::v
1f40: 61 72 69 61 62 6c 65 20 6d 79 64 61 74 61 20 5b  ariable mydata [
1f50: 66 69 6c 65 75 74 69 6c 3a 3a 63 61 74 20 2d 65  fileutil::cat -e
1f60: 6e 63 6f 64 69 6e 67 20 62 69 6e 61 72 79 20 24  ncoding binary $
1f70: 70 61 74 68 5d 0a 09 3a 3a 76 61 72 69 61 62 6c  path]..::variabl
1f80: 65 20 6d 79 73 69 7a 65 20 5b 66 69 6c 65 20 73  e mysize [file s
1f90: 69 7a 65 20 24 70 61 74 68 5d 0a 09 3a 3a 76 61  ize $path]..::va
1fa0: 72 69 61 62 6c 65 20 6d 79 73 69 6e 6b 20 24 73  riable mysink $s
1fb0: 69 6e 6b 0a 09 72 65 74 75 72 6e 0a 20 20 20 20  ink..return.    
1fc0: 7d 0a 0a 20 20 20 20 70 72 6f 63 20 43 61 6c 6c  }..    proc Call
1fd0: 20 7b 61 72 67 73 7d 20 7b 0a 09 3a 3a 76 61 72   {args} {..::var
1fe0: 69 61 62 6c 65 20 6d 79 73 69 6e 6b 0a 09 73 65  iable mysink..se
1ff0: 74 20 63 6d 64 20 24 6d 79 73 69 6e 6b 0a 09 66  t cmd $mysink..f
2000: 6f 72 65 61 63 68 20 61 20 24 61 72 67 73 20 7b  oreach a $args {
2010: 20 6c 61 70 70 65 6e 64 20 63 6d 64 20 24 61 20   lappend cmd $a 
2020: 7d 0a 09 65 76 61 6c 20 24 63 6d 64 0a 09 72 65  }..eval $cmd..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 43  #######.    ## C
2070: 6f 6e 66 69 67 75 72 61 74 69 6f 6e 0a 0a 20 20  onfiguration..  
2080: 20 20 74 79 70 65 76 61 72 69 61 62 6c 65 20 6d    typevariable m
2090: 79 64 61 74 61 20 7b 7d 20 3b 20 23 20 52 63 73  ydata {} ; # Rcs
20a0: 20 61 72 63 68 69 76 65 20 63 6f 6e 74 65 6e 74   archive content
20b0: 73 20 74 6f 20 70 72 6f 63 65 73 73 0a 20 20 20  s to process.   
20c0: 20 74 79 70 65 76 61 72 69 61 62 6c 65 20 6d 79   typevariable my
20d0: 73 69 7a 65 20 30 20 20 3b 20 23 20 4c 65 6e 67  size 0  ; # Leng
20e0: 74 68 20 6f 66 20 63 6f 6e 74 65 6e 74 73 0a 20  th of contents. 
20f0: 20 20 20 74 79 70 65 76 61 72 69 61 62 6c 65 20     typevariable 
2100: 6d 79 73 69 6e 6b 20 7b 7d 20 3b 20 23 20 53 69  mysink {} ; # Si
2110: 6e 6b 20 74 6f 20 72 65 70 6f 72 74 20 74 6f 0a  nk to report to.
2120: 0a 20 20 20 20 70 72 61 67 6d 61 20 2d 68 61 73  .    pragma -has
2130: 69 6e 73 74 61 6e 63 65 73 20 20 20 6e 6f 20 3b  instances   no ;
2140: 20 23 20 73 69 6e 67 6c 65 74 6f 6e 0a 20 20 20   # singleton.   
2150: 20 70 72 61 67 6d 61 20 2d 68 61 73 74 79 70 65   pragma -hastype
2160: 69 6e 66 6f 20 20 20 20 6e 6f 20 3b 20 23 20 6e  info    no ; # n
2170: 6f 20 69 6e 74 72 6f 73 70 65 63 74 69 6f 6e 0a  o introspection.
2180: 20 20 20 20 70 72 61 67 6d 61 20 2d 68 61 73 74      pragma -hast
2190: 79 70 65 64 65 73 74 72 6f 79 20 6e 6f 20 3b 20  ypedestroy no ; 
21a0: 23 20 69 6d 6d 6f 72 74 61 6c 0a 0a 20 20 20 20  # immortal..    
21b0: 23 20 23 20 23 23 20 23 23 23 20 23 23 23 23 23  # # ## ### #####
21c0: 20 23 23 23 23 23 23 23 23 20 23 23 23 23 23 23   ######## ######
21d0: 23 23 23 23 23 23 23 0a 7d 0a 0a 6e 61 6d 65 73  #######.}..names
21e0: 70 61 63 65 20 65 76 61 6c 20 3a 3a 76 63 3a 3a  pace eval ::vc::
21f0: 72 63 73 20 7b 0a 20 20 20 20 6e 61 6d 65 73 70  rcs {.    namesp
2200: 61 63 65 20 65 78 70 6f 72 74 20 70 61 72 73 65  ace export parse
2210: 72 0a 20 20 20 20 6e 61 6d 65 73 70 61 63 65 20  r.    namespace 
2220: 65 76 61 6c 20 70 61 72 73 65 72 20 7b 0a 09 6e  eval parser {..n
2230: 61 6d 65 73 70 61 63 65 20 69 6d 70 6f 72 74 20  amespace import 
2240: 3a 3a 76 63 3a 3a 74 6f 6f 6c 73 3a 3a 6c 6f 67  ::vc::tools::log
2250: 0a 09 6c 6f 67 20 72 65 67 69 73 74 65 72 20 72  ..log register r
2260: 63 73 0a 20 20 20 20 7d 0a 7d 0a 0a 23 20 23 20  cs.    }.}..# # 
2270: 23 23 20 23 23 23 20 23 23 23 23 23 20 23 23 23  ## ### ##### ###
2280: 23 23 23 23 23 20 23 23 23 23 23 23 23 23 23 23  ##### ##########
2290: 23 23 23 20 23 23 23 23 23 23 23 23 23 23 23 23  ### ############
22a0: 23 23 23 23 23 23 23 23 23 0a 23 23 20 52 65 61  #########.## Rea
22b0: 64 79 0a 0a 70 61 63 6b 61 67 65 20 70 72 6f 76  dy..package prov
22c0: 69 64 65 20 76 63 3a 3a 72 63 73 3a 3a 70 61 72  ide vc::rcs::par
22d0: 73 65 72 20 31 2e 30 0a 72 65 74 75 72 6e 0a     ser 1.0.return.