tDOM

Hex Artifact Content
Login

Hex Artifact Content

Artifact a3efca3d0f095cfdeddc3e67734b9d79567b0fd1:


0000: 23 20 46 65 61 74 75 72 65 73 20 63 6f 76 65 72  # Features cover
0010: 65 64 3a 20 73 74 61 63 6b 65 64 20 68 61 6e 64  ed: stacked hand
0020: 6c 65 72 2c 20 74 64 6f 6d 20 63 6f 6d 6d 61 6e  ler, tdom comman
0030: 64 0a 23 0a 23 20 54 68 69 73 20 66 69 6c 65 20  d.#.# This file 
0040: 63 6f 6e 74 61 69 6e 73 20 61 20 63 6f 6c 6c 65  contains a colle
0050: 63 74 69 6f 6e 20 6f 66 20 74 65 73 74 73 20 66  ction of tests f
0060: 6f 72 20 75 73 69 6e 67 20 73 65 76 65 72 61 6c  or using several
0070: 20 68 61 6e 64 6c 65 72 20 73 63 72 69 70 74 73   handler scripts
0080: 0a 23 20 66 6f 72 20 61 6e 20 65 76 65 6e 74 2c  .# for an event,
0090: 20 61 6e 64 20 74 68 65 20 6d 69 78 65 64 20 75   and the mixed u
00a0: 73 61 67 65 20 6f 66 20 74 63 6c 20 68 61 6e 64  sage of tcl hand
00b0: 6c 65 72 20 73 63 72 69 70 74 73 20 61 6e 64 20  ler scripts and 
00c0: 43 20 63 6f 64 65 64 0a 23 20 70 61 72 73 65 72  C coded.# parser
00d0: 20 65 78 74 65 6e 73 69 6f 6e 73 2e 0a 23 0a 23   extensions..#.#
00e0: 20 43 6f 70 79 72 69 67 68 74 20 28 63 29 20 32   Copyright (c) 2
00f0: 30 30 32 20 52 6f 6c 66 20 41 64 65 2e 0a 23 0a  002 Rolf Ade..#.
0100: 23 20 52 43 53 3a 20 40 28 23 29 20 24 49 64 24  # RCS: @(#) $Id$
0110: 0a 0a 73 6f 75 72 63 65 20 5b 66 69 6c 65 20 6a  ..source [file j
0120: 6f 69 6e 20 5b 66 69 6c 65 20 64 69 72 20 5b 69  oin [file dir [i
0130: 6e 66 6f 20 73 63 72 69 70 74 5d 5d 20 6c 6f 61  nfo script]] loa
0140: 64 74 64 6f 6d 2e 74 63 6c 5d 0a 0a 70 72 6f 63  dtdom.tcl]..proc
0150: 20 43 6f 75 6e 74 20 7b 61 72 67 73 7d 20 7b 0a   Count {args} {.
0160: 20 20 20 20 69 66 20 7b 21 5b 69 6e 66 6f 20 65      if {![info e
0170: 78 69 73 74 73 20 3a 3a 63 6f 75 6e 74 5d 7d 20  xists ::count]} 
0180: 7b 0a 20 20 20 20 20 20 20 20 73 65 74 20 3a 3a  {.        set ::
0190: 63 6f 75 6e 74 20 31 0a 20 20 20 20 7d 20 65 6c  count 1.    } el
01a0: 73 65 20 7b 0a 20 20 20 20 20 20 20 20 69 6e 63  se {.        inc
01b0: 72 20 3a 3a 63 6f 75 6e 74 0a 20 20 20 20 7d 0a  r ::count.    }.
01c0: 7d 0a 0a 70 72 6f 63 20 43 68 61 72 43 6f 75 6e  }..proc CharCoun
01d0: 74 20 7b 6e 61 6d 65 20 61 72 67 73 7d 20 7b 0a  t {name args} {.
01e0: 20 20 20 20 69 66 20 7b 21 5b 69 6e 66 6f 20 65      if {![info e
01f0: 78 69 73 74 73 20 3a 3a 63 68 61 72 63 6f 75 6e  xists ::charcoun
0200: 74 5d 7d 20 7b 0a 20 20 20 20 20 20 20 20 73 65  t]} {.        se
0210: 74 20 3a 3a 63 68 61 72 63 6f 75 6e 74 20 5b 73  t ::charcount [s
0220: 74 72 69 6e 67 20 6c 65 6e 67 74 68 20 24 6e 61  tring length $na
0230: 6d 65 5d 0a 20 20 20 20 7d 20 65 6c 73 65 20 7b  me].    } else {
0240: 0a 20 20 20 20 20 20 20 20 69 6e 63 72 20 3a 3a  .        incr ::
0250: 63 68 61 72 63 6f 75 6e 74 20 5b 73 74 72 69 6e  charcount [strin
0260: 67 20 6c 65 6e 67 74 68 20 24 6e 61 6d 65 5d 0a  g length $name].
0270: 20 20 20 20 7d 0a 7d 0a 0a 70 72 6f 63 20 43 44      }.}..proc CD
0280: 61 74 61 48 61 6e 64 6c 65 72 20 7b 64 61 74 61  ataHandler {data
0290: 7d 20 7b 0a 20 20 20 20 69 66 20 7b 21 5b 69 6e  } {.    if {![in
02a0: 66 6f 20 65 78 69 73 74 73 20 3a 3a 63 64 61 74  fo exists ::cdat
02b0: 61 5d 7d 20 7b 0a 20 20 20 20 20 20 20 20 73 65  a]} {.        se
02c0: 74 20 3a 3a 63 64 61 74 61 20 5b 73 74 72 69 6e  t ::cdata [strin
02d0: 67 20 6c 65 6e 67 74 68 20 24 64 61 74 61 5d 0a  g length $data].
02e0: 20 20 20 20 7d 20 65 6c 73 65 20 7b 0a 20 20 20      } else {.   
02f0: 20 20 20 20 20 69 6e 63 72 20 3a 3a 63 64 61 74       incr ::cdat
0300: 61 20 5b 73 74 72 69 6e 67 20 6c 65 6e 67 74 68  a [string length
0310: 20 24 64 61 74 61 5d 0a 20 20 20 20 7d 0a 7d 0a   $data].    }.}.
0320: 0a 63 61 74 63 68 20 7b 75 6e 73 65 74 20 73 74  .catch {unset st
0330: 61 72 74 65 64 7d 0a 70 72 6f 63 20 53 74 61 72  arted}.proc Star
0340: 74 20 7b 6e 61 6d 65 20 61 74 4c 69 73 74 7d 20  t {name atList} 
0350: 7b 0a 20 20 20 20 61 72 72 61 79 20 73 65 74 20  {.    array set 
0360: 61 74 74 73 20 24 61 74 4c 69 73 74 0a 0a 20 20  atts $atList..  
0370: 20 20 69 66 20 7b 21 5b 69 6e 66 6f 20 65 78 69    if {![info exi
0380: 73 74 73 20 3a 3a 73 74 61 72 74 65 64 28 24 6e  sts ::started($n
0390: 61 6d 65 29 5d 7d 20 7b 0a 09 73 65 74 20 3a 3a  ame)]} {..set ::
03a0: 73 74 61 72 74 65 64 28 24 6e 61 6d 65 29 20 31  started($name) 1
03b0: 0a 20 20 20 20 7d 20 65 6c 73 65 20 7b 0a 09 69  .    } else {..i
03c0: 6e 63 72 20 3a 3a 73 74 61 72 74 65 64 28 24 6e  ncr ::started($n
03d0: 61 6d 65 29 0a 20 20 20 20 7d 0a 20 20 20 20 69  ame).    }.    i
03e0: 66 20 7b 5b 69 6e 66 6f 20 65 78 69 73 74 73 20  f {[info exists 
03f0: 61 74 74 73 28 63 6c 61 73 73 29 5d 7d 20 7b 0a  atts(class)]} {.
0400: 09 73 77 69 74 63 68 20 24 61 74 74 73 28 63 6c  .switch $atts(cl
0410: 61 73 73 29 20 7b 0a 09 20 20 20 20 63 6f 6e 74  ass) {..    cont
0420: 69 6e 75 65 20 7b 0a 09 09 72 65 74 75 72 6e 20  inue {...return 
0430: 2d 63 6f 64 65 20 63 6f 6e 74 69 6e 75 65 0a 09  -code continue..
0440: 20 20 20 20 7d 0a 09 20 20 20 20 62 72 65 61 6b      }..    break
0450: 20 7b 0a 09 09 72 65 74 75 72 6e 20 2d 63 6f 64   {...return -cod
0460: 65 20 62 72 65 61 6b 0a 09 20 20 20 20 7d 0a 09  e break..    }..
0470: 20 20 20 20 65 72 72 6f 72 20 7b 0a 09 09 72 65      error {...re
0480: 74 75 72 6e 20 2d 63 6f 64 65 20 65 72 72 6f 72  turn -code error
0490: 20 22 65 72 72 6f 72 20 63 6f 6e 64 69 74 69 6f   "error conditio
04a0: 6e 20 69 6e 20 63 61 6c 6c 62 61 63 6b 22 0a 09  n in callback"..
04b0: 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20      }.          
04c0: 20 20 72 65 74 75 72 6e 20 7b 0a 20 20 20 20 20    return {.     
04d0: 20 20 20 20 20 20 20 20 20 20 20 72 65 74 75 72             retur
04e0: 6e 20 2d 63 6f 64 65 20 72 65 74 75 72 6e 0a 20  n -code return. 
04f0: 20 20 20 20 20 20 20 20 20 20 20 7d 0a 09 20 20             }..  
0500: 20 20 64 65 66 61 75 6c 74 20 7b 0a 09 09 72 65    default {...re
0510: 74 75 72 6e 20 2d 63 6f 64 65 20 24 61 74 74 73  turn -code $atts
0520: 28 63 6c 61 73 73 29 20 0a 09 20 20 20 20 7d 0a  (class) ..    }.
0530: 09 7d 0a 20 20 20 20 7d 0a 7d 0a 0a 74 65 73 74  .}.    }.}..test
0540: 20 73 74 61 63 6b 65 64 68 64 6c 2d 31 2e 31 20   stackedhdl-1.1 
0550: 7b 74 77 6f 20 68 61 6e 64 6c 65 72 73 20 66 6f  {two handlers fo
0560: 72 20 65 6c 65 6d 65 6e 74 20 73 74 61 72 74 7d  r element start}
0570: 20 7b 0a 20 20 20 20 63 61 74 63 68 20 7b 75 6e   {.    catch {un
0580: 73 65 74 20 3a 3a 63 6f 75 6e 74 7d 20 0a 20 20  set ::count} .  
0590: 20 20 63 61 74 63 68 20 7b 75 6e 73 65 74 20 3a    catch {unset :
05a0: 3a 63 68 61 72 63 6f 75 6e 74 7d 0a 20 20 20 20  :charcount}.    
05b0: 73 65 74 20 70 20 5b 65 78 70 61 74 20 2d 65 6c  set p [expat -el
05c0: 65 6d 65 6e 74 73 74 61 72 74 63 6f 6d 6d 61 6e  ementstartcomman
05d0: 64 20 43 6f 75 6e 74 20 5c 0a 20 20 20 20 20 20  d Count \.      
05e0: 20 20 20 20 20 20 20 20 20 20 20 2d 68 61 6e 64             -hand
05f0: 6c 65 72 73 65 74 20 63 68 61 72 63 6f 75 6e 74  lerset charcount
0600: 20 2d 65 6c 65 6d 65 6e 74 73 74 61 72 74 63 6f   -elementstartco
0610: 6d 6d 61 6e 64 20 43 68 61 72 43 6f 75 6e 74 5d  mmand CharCount]
0620: 0a 20 20 20 20 24 70 20 70 61 72 73 65 20 7b 3c  .    $p parse {<
0630: 72 6f 6f 74 3e 3c 61 2f 3e 3c 61 3e 3c 2f 61 3e  root><a/><a></a>
0640: 3c 2f 72 6f 6f 74 3e 7d 0a 20 20 20 20 6c 69 73  </root>}.    lis
0650: 74 20 24 3a 3a 63 6f 75 6e 74 20 24 3a 3a 63 68  t $::count $::ch
0660: 61 72 63 6f 75 6e 74 0a 7d 20 7b 33 20 36 7d 0a  arcount.} {3 6}.
0670: 0a 74 65 73 74 20 73 74 61 63 6b 65 64 68 64 6c  .test stackedhdl
0680: 2d 31 2e 32 20 7b 74 77 6f 20 68 61 6e 64 6c 65  -1.2 {two handle
0690: 72 73 20 66 6f 72 20 65 6c 65 6d 65 6e 74 20 73  rs for element s
06a0: 74 61 72 74 7d 20 7b 0a 20 20 20 20 63 61 74 63  tart} {.    catc
06b0: 68 20 7b 75 6e 73 65 74 20 3a 3a 63 6f 75 6e 74  h {unset ::count
06c0: 7d 20 0a 20 20 20 20 63 61 74 63 68 20 7b 75 6e  } .    catch {un
06d0: 73 65 74 20 3a 3a 63 68 61 72 63 6f 75 6e 74 7d  set ::charcount}
06e0: 0a 20 20 20 20 73 65 74 20 70 20 5b 65 78 70 61  .    set p [expa
06f0: 74 5d 0a 20 20 20 20 24 70 20 63 6f 6e 66 69 67  t].    $p config
0700: 75 72 65 20 2d 65 6c 65 6d 65 6e 74 73 74 61 72  ure -elementstar
0710: 74 63 6f 6d 6d 61 6e 64 20 43 6f 75 6e 74 0a 20  tcommand Count. 
0720: 20 20 20 24 70 20 63 6f 6e 66 69 67 75 72 65 20     $p configure 
0730: 2d 68 61 6e 64 6c 65 72 73 65 74 20 63 68 61 72  -handlerset char
0740: 63 6f 75 6e 74 20 2d 65 6c 65 6d 65 6e 74 73 74  count -elementst
0750: 61 72 74 63 6f 6d 6d 61 6e 64 20 43 68 61 72 43  artcommand CharC
0760: 6f 75 6e 74 0a 20 20 20 20 24 70 20 70 61 72 73  ount.    $p pars
0770: 65 20 7b 3c 72 6f 6f 74 3e 3c 61 2f 3e 3c 61 3e  e {<root><a/><a>
0780: 3c 2f 61 3e 3c 2f 72 6f 6f 74 3e 7d 0a 20 20 20  </a></root>}.   
0790: 20 6c 69 73 74 20 24 3a 3a 63 6f 75 6e 74 20 24   list $::count $
07a0: 3a 3a 63 68 61 72 63 6f 75 6e 74 0a 7d 20 7b 33  ::charcount.} {3
07b0: 20 36 7d 0a 0a 74 65 73 74 20 73 74 61 63 6b 65   6}..test stacke
07c0: 64 68 64 6c 2d 31 2e 33 20 7b 74 77 6f 20 68 61  dhdl-1.3 {two ha
07d0: 6e 64 6c 65 72 73 20 66 6f 72 20 65 6c 65 6d 65  ndlers for eleme
07e0: 6e 74 20 73 74 61 72 74 7d 20 7b 0a 20 20 20 20  nt start} {.    
07f0: 63 61 74 63 68 20 7b 75 6e 73 65 74 20 3a 3a 63  catch {unset ::c
0800: 6f 75 6e 74 7d 20 0a 20 20 20 20 63 61 74 63 68  ount} .    catch
0810: 20 7b 75 6e 73 65 74 20 3a 3a 63 68 61 72 63 6f   {unset ::charco
0820: 75 6e 74 7d 0a 20 20 20 20 73 65 74 20 70 20 5b  unt}.    set p [
0830: 65 78 70 61 74 5d 0a 20 20 20 20 24 70 20 63 6f  expat].    $p co
0840: 6e 66 69 67 75 72 65 20 2d 68 61 6e 64 6c 65 72  nfigure -handler
0850: 73 65 74 20 63 68 61 72 63 6f 75 6e 74 20 2d 65  set charcount -e
0860: 6c 65 6d 65 6e 74 73 74 61 72 74 63 6f 6d 6d 61  lementstartcomma
0870: 6e 64 20 43 68 61 72 43 6f 75 6e 74 0a 20 20 20  nd CharCount.   
0880: 20 24 70 20 63 6f 6e 66 69 67 75 72 65 20 2d 65   $p configure -e
0890: 6c 65 6d 65 6e 74 73 74 61 72 74 63 6f 6d 6d 61  lementstartcomma
08a0: 6e 64 20 43 6f 75 6e 74 0a 20 20 20 20 24 70 20  nd Count.    $p 
08b0: 70 61 72 73 65 20 7b 3c 72 6f 6f 74 3e 3c 61 2f  parse {<root><a/
08c0: 3e 3c 61 3e 3c 2f 61 3e 3c 2f 72 6f 6f 74 3e 7d  ><a></a></root>}
08d0: 0a 20 20 20 20 6c 69 73 74 20 24 3a 3a 63 6f 75  .    list $::cou
08e0: 6e 74 20 24 3a 3a 63 68 61 72 63 6f 75 6e 74 0a  nt $::charcount.
08f0: 7d 20 7b 33 20 36 7d 0a 0a 74 65 73 74 20 73 74  } {3 6}..test st
0900: 61 63 6b 65 64 68 64 6c 2d 31 2e 34 20 7b 74 77  ackedhdl-1.4 {tw
0910: 6f 20 68 61 6e 64 6c 65 72 73 20 66 6f 72 20 65  o handlers for e
0920: 6c 65 6d 65 6e 74 20 73 74 61 72 74 20 61 6e 64  lement start and
0930: 20 65 6e 64 7d 20 7b 0a 20 20 20 20 63 61 74 63   end} {.    catc
0940: 68 20 7b 75 6e 73 65 74 20 3a 3a 63 6f 75 6e 74  h {unset ::count
0950: 7d 20 0a 20 20 20 20 63 61 74 63 68 20 7b 75 6e  } .    catch {un
0960: 73 65 74 20 3a 3a 63 68 61 72 63 6f 75 6e 74 7d  set ::charcount}
0970: 0a 20 20 20 20 73 65 74 20 70 20 5b 65 78 70 61  .    set p [expa
0980: 74 20 2d 65 6c 65 6d 65 6e 74 73 74 61 72 74 63  t -elementstartc
0990: 6f 6d 6d 61 6e 64 20 43 6f 75 6e 74 20 2d 65 6c  ommand Count -el
09a0: 65 6d 65 6e 74 65 6e 64 63 6f 6d 6d 61 6e 64 20  ementendcommand 
09b0: 43 6f 75 6e 74 20 5c 0a 20 20 20 20 20 20 20 20  Count \.        
09c0: 20 20 20 20 20 20 20 20 20 2d 68 61 6e 64 6c 65           -handle
09d0: 72 73 65 74 20 63 68 61 72 63 6f 75 6e 74 20 2d  rset charcount -
09e0: 65 6c 65 6d 65 6e 74 73 74 61 72 74 63 6f 6d 6d  elementstartcomm
09f0: 61 6e 64 20 43 68 61 72 43 6f 75 6e 74 20 5c 0a  and CharCount \.
0a00: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0a10: 20 2d 65 6c 65 6d 65 6e 74 65 6e 64 63 6f 6d 6d   -elementendcomm
0a20: 61 6e 64 20 43 68 61 72 43 6f 75 6e 74 5d 0a 20  and CharCount]. 
0a30: 20 20 20 24 70 20 70 61 72 73 65 20 7b 3c 72 6f     $p parse {<ro
0a40: 6f 74 3e 3c 61 2f 3e 3c 61 3e 3c 2f 61 3e 3c 2f  ot><a/><a></a></
0a50: 72 6f 6f 74 3e 7d 0a 20 20 20 20 6c 69 73 74 20  root>}.    list 
0a60: 24 3a 3a 63 6f 75 6e 74 20 24 3a 3a 63 68 61 72  $::count $::char
0a70: 63 6f 75 6e 74 0a 7d 20 7b 36 20 31 32 7d 0a 0a  count.} {6 12}..
0a80: 74 65 73 74 20 73 74 61 63 6b 65 64 68 64 6c 2d  test stackedhdl-
0a90: 31 2e 35 20 7b 74 77 6f 20 68 61 6e 64 6c 65 72  1.5 {two handler
0aa0: 73 20 66 6f 72 20 65 6c 65 6d 65 6e 74 20 73 74  s for element st
0ab0: 61 72 74 7d 20 7b 0a 20 20 20 20 63 61 74 63 68  art} {.    catch
0ac0: 20 7b 75 6e 73 65 74 20 3a 3a 63 6f 75 6e 74 7d   {unset ::count}
0ad0: 20 0a 20 20 20 20 63 61 74 63 68 20 7b 75 6e 73   .    catch {uns
0ae0: 65 74 20 3a 3a 63 68 61 72 63 6f 75 6e 74 7d 0a  et ::charcount}.
0af0: 20 20 20 20 73 65 74 20 70 20 5b 65 78 70 61 74      set p [expat
0b00: 5d 0a 20 20 20 20 24 70 20 63 6f 6e 66 69 67 75  ].    $p configu
0b10: 72 65 20 2d 65 6c 65 6d 65 6e 74 73 74 61 72 74  re -elementstart
0b20: 63 6f 6d 6d 61 6e 64 20 43 6f 75 6e 74 20 2d 65  command Count -e
0b30: 6c 65 6d 65 6e 74 65 6e 64 63 6f 6d 6d 61 6e 64  lementendcommand
0b40: 20 43 6f 75 6e 74 0a 20 20 20 20 24 70 20 63 6f   Count.    $p co
0b50: 6e 66 69 67 75 72 65 20 2d 68 61 6e 64 6c 65 72  nfigure -handler
0b60: 73 65 74 20 63 68 61 72 63 6f 75 6e 74 20 2d 65  set charcount -e
0b70: 6c 65 6d 65 6e 74 73 74 61 72 74 63 6f 6d 6d 61  lementstartcomma
0b80: 6e 64 20 43 68 61 72 43 6f 75 6e 74 20 5c 0a 20  nd CharCount \. 
0b90: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0ba0: 2d 65 6c 65 6d 65 6e 74 65 6e 64 63 6f 6d 6d 61  -elementendcomma
0bb0: 6e 64 20 43 68 61 72 43 6f 75 6e 74 0a 20 20 20  nd CharCount.   
0bc0: 20 24 70 20 70 61 72 73 65 20 7b 3c 72 6f 6f 74   $p parse {<root
0bd0: 3e 3c 61 2f 3e 3c 61 3e 3c 2f 61 3e 3c 2f 72 6f  ><a/><a></a></ro
0be0: 6f 74 3e 7d 0a 20 20 20 20 6c 69 73 74 20 24 3a  ot>}.    list $:
0bf0: 3a 63 6f 75 6e 74 20 24 3a 3a 63 68 61 72 63 6f  :count $::charco
0c00: 75 6e 74 0a 7d 20 7b 36 20 31 32 7d 0a 0a 74 65  unt.} {6 12}..te
0c10: 73 74 20 73 74 61 63 6b 65 64 68 64 6c 2d 31 2e  st stackedhdl-1.
0c20: 36 20 7b 74 77 6f 20 68 61 6e 64 6c 65 72 73 20  6 {two handlers 
0c30: 66 6f 72 20 65 6c 65 6d 65 6e 74 20 73 74 61 72  for element star
0c40: 74 7d 20 7b 0a 20 20 20 20 63 61 74 63 68 20 7b  t} {.    catch {
0c50: 75 6e 73 65 74 20 3a 3a 63 6f 75 6e 74 7d 20 0a  unset ::count} .
0c60: 20 20 20 20 63 61 74 63 68 20 7b 75 6e 73 65 74      catch {unset
0c70: 20 3a 3a 63 68 61 72 63 6f 75 6e 74 7d 0a 20 20   ::charcount}.  
0c80: 20 20 73 65 74 20 70 20 5b 65 78 70 61 74 5d 0a    set p [expat].
0c90: 20 20 20 20 24 70 20 63 6f 6e 66 69 67 75 72 65      $p configure
0ca0: 20 2d 68 61 6e 64 6c 65 72 73 65 74 20 63 68 61   -handlerset cha
0cb0: 72 63 6f 75 6e 74 20 2d 65 6c 65 6d 65 6e 74 73  rcount -elements
0cc0: 74 61 72 74 63 6f 6d 6d 61 6e 64 20 43 68 61 72  tartcommand Char
0cd0: 43 6f 75 6e 74 20 5c 0a 20 20 20 20 20 20 20 20  Count \.        
0ce0: 20 20 20 20 20 20 20 20 20 2d 65 6c 65 6d 65 6e           -elemen
0cf0: 74 65 6e 64 63 6f 6d 6d 61 6e 64 20 43 68 61 72  tendcommand Char
0d00: 43 6f 75 6e 74 0a 20 20 20 20 24 70 20 63 6f 6e  Count.    $p con
0d10: 66 69 67 75 72 65 20 2d 65 6c 65 6d 65 6e 74 73  figure -elements
0d20: 74 61 72 74 63 6f 6d 6d 61 6e 64 20 43 6f 75 6e  tartcommand Coun
0d30: 74 20 2d 65 6c 65 6d 65 6e 74 65 6e 64 63 6f 6d  t -elementendcom
0d40: 6d 61 6e 64 20 43 6f 75 6e 74 0a 20 20 20 20 24  mand Count.    $
0d50: 70 20 70 61 72 73 65 20 7b 3c 72 6f 6f 74 3e 3c  p parse {<root><
0d60: 61 2f 3e 3c 61 3e 3c 2f 61 3e 3c 2f 72 6f 6f 74  a/><a></a></root
0d70: 3e 7d 0a 20 20 20 20 6c 69 73 74 20 24 3a 3a 63  >}.    list $::c
0d80: 6f 75 6e 74 20 24 3a 3a 63 68 61 72 63 6f 75 6e  ount $::charcoun
0d90: 74 0a 7d 20 7b 36 20 31 32 7d 0a 0a 74 65 73 74  t.} {6 12}..test
0da0: 20 73 74 61 63 6b 65 64 68 64 6c 2d 31 2e 37 20   stackedhdl-1.7 
0db0: 7b 74 77 6f 20 68 61 6e 64 6c 65 72 73 20 66 6f  {two handlers fo
0dc0: 72 20 65 6c 65 6d 65 6e 74 20 73 74 61 72 74 7d  r element start}
0dd0: 20 7b 0a 20 20 20 20 63 61 74 63 68 20 7b 75 6e   {.    catch {un
0de0: 73 65 74 20 3a 3a 63 6f 75 6e 74 7d 20 0a 20 20  set ::count} .  
0df0: 20 20 63 61 74 63 68 20 7b 75 6e 73 65 74 20 3a    catch {unset :
0e00: 3a 63 68 61 72 63 6f 75 6e 74 7d 0a 20 20 20 20  :charcount}.    
0e10: 73 65 74 20 70 20 5b 65 78 70 61 74 5d 0a 20 20  set p [expat].  
0e20: 20 20 24 70 20 63 6f 6e 66 69 67 75 72 65 20 2d    $p configure -
0e30: 68 61 6e 64 6c 65 72 73 65 74 20 63 68 61 72 63  handlerset charc
0e40: 6f 75 6e 74 20 2d 65 6c 65 6d 65 6e 74 73 74 61  ount -elementsta
0e50: 72 74 63 6f 6d 6d 61 6e 64 20 43 68 61 72 43 6f  rtcommand CharCo
0e60: 75 6e 74 0a 20 20 20 20 24 70 20 63 6f 6e 66 69  unt.    $p confi
0e70: 67 75 72 65 20 2d 65 6c 65 6d 65 6e 74 73 74 61  gure -elementsta
0e80: 72 74 63 6f 6d 6d 61 6e 64 20 43 6f 75 6e 74 0a  rtcommand Count.
0e90: 20 20 20 20 24 70 20 63 6f 6e 66 69 67 75 72 65      $p configure
0ea0: 20 2d 68 61 6e 64 6c 65 72 73 65 74 20 63 68 61   -handlerset cha
0eb0: 72 63 6f 75 6e 74 20 2d 65 6c 65 6d 65 6e 74 65  rcount -elemente
0ec0: 6e 64 63 6f 6d 6d 61 6e 64 20 43 68 61 72 43 6f  ndcommand CharCo
0ed0: 75 6e 74 0a 20 20 20 20 24 70 20 63 6f 6e 66 69  unt.    $p confi
0ee0: 67 75 72 65 20 2d 65 6c 65 6d 65 6e 74 65 6e 64  gure -elementend
0ef0: 63 6f 6d 6d 61 6e 64 20 43 6f 75 6e 74 0a 20 20  command Count.  
0f00: 20 20 24 70 20 70 61 72 73 65 20 7b 3c 72 6f 6f    $p parse {<roo
0f10: 74 3e 3c 61 2f 3e 3c 61 3e 3c 2f 61 3e 3c 2f 72  t><a/><a></a></r
0f20: 6f 6f 74 3e 7d 0a 20 20 20 20 6c 69 73 74 20 24  oot>}.    list $
0f30: 3a 3a 63 6f 75 6e 74 20 24 3a 3a 63 68 61 72 63  ::count $::charc
0f40: 6f 75 6e 74 0a 7d 20 7b 36 20 31 32 7d 0a 0a 0a  ount.} {6 12}...
0f50: 74 65 73 74 20 73 74 61 63 6b 65 64 68 64 6c 2d  test stackedhdl-
0f60: 31 2e 38 20 7b 73 61 6d 65 20 68 61 6e 64 6c 65  1.8 {same handle
0f70: 72 20 73 63 72 69 70 74 20 66 6f 72 20 74 68 65  r script for the
0f80: 20 73 61 6d 65 20 65 76 65 6e 74 20 69 6e 20 64   same event in d
0f90: 69 66 66 65 72 65 6e 20 68 61 6e 64 6c 65 72 20  ifferen handler 
0fa0: 73 65 74 73 7d 20 7b 0a 20 20 20 20 63 61 74 63  sets} {.    catc
0fb0: 68 20 7b 75 6e 73 65 74 20 3a 3a 63 6f 75 6e 74  h {unset ::count
0fc0: 7d 20 0a 20 20 20 20 73 65 74 20 70 20 5b 65 78  } .    set p [ex
0fd0: 70 61 74 20 2d 65 6c 65 6d 65 6e 74 73 74 61 72  pat -elementstar
0fe0: 74 63 6f 6d 6d 61 6e 64 20 43 6f 75 6e 74 20 5c  tcommand Count \
0ff0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
1000: 20 20 2d 68 61 6e 64 6c 65 72 73 65 74 20 63 68    -handlerset ch
1010: 61 72 63 6f 75 6e 74 20 2d 65 6c 65 6d 65 6e 74  arcount -element
1020: 73 74 61 72 74 63 6f 6d 6d 61 6e 64 20 43 6f 75  startcommand Cou
1030: 6e 74 5d 0a 20 20 20 20 24 70 20 70 61 72 73 65  nt].    $p parse
1040: 20 7b 3c 72 6f 6f 74 3e 3c 61 2f 3e 3c 61 3e 3c   {<root><a/><a><
1050: 2f 61 3e 3c 2f 72 6f 6f 74 3e 7d 0a 20 20 20 20  /a></root>}.    
1060: 73 65 74 20 3a 3a 63 6f 75 6e 74 0a 7d 20 7b 36  set ::count.} {6
1070: 7d 0a 0a 74 65 73 74 20 73 74 61 63 6b 65 64 68  }..test stackedh
1080: 64 6c 2d 31 2e 39 20 7b 73 61 6d 65 20 68 61 6e  dl-1.9 {same han
1090: 64 6c 65 72 20 73 63 72 69 70 74 20 66 6f 72 20  dler script for 
10a0: 74 68 65 20 73 61 6d 65 20 65 76 65 6e 74 20 69  the same event i
10b0: 6e 20 64 69 66 66 65 72 65 6e 20 68 61 6e 64 6c  n differen handl
10c0: 65 72 20 73 65 74 73 7d 20 7b 0a 20 20 20 20 63  er sets} {.    c
10d0: 61 74 63 68 20 7b 75 6e 73 65 74 20 3a 3a 63 6f  atch {unset ::co
10e0: 75 6e 74 7d 20 0a 20 20 20 20 73 65 74 20 70 20  unt} .    set p 
10f0: 5b 65 78 70 61 74 20 2d 65 6c 65 6d 65 6e 74 65  [expat -elemente
1100: 6e 64 63 6f 6d 6d 61 6e 64 20 43 6f 75 6e 74 20  ndcommand Count 
1110: 5c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  \.              
1120: 20 20 20 2d 68 61 6e 64 6c 65 72 73 65 74 20 63     -handlerset c
1130: 68 61 72 63 6f 75 6e 74 20 2d 65 6c 65 6d 65 6e  harcount -elemen
1140: 74 65 6e 64 63 6f 6d 6d 61 6e 64 20 43 6f 75 6e  tendcommand Coun
1150: 74 5d 0a 20 20 20 20 24 70 20 70 61 72 73 65 20  t].    $p parse 
1160: 7b 3c 72 6f 6f 74 3e 3c 61 2f 3e 3c 61 3e 3c 2f  {<root><a/><a></
1170: 61 3e 3c 2f 72 6f 6f 74 3e 7d 0a 20 20 20 20 73  a></root>}.    s
1180: 65 74 20 3a 3a 63 6f 75 6e 74 0a 7d 20 7b 36 7d  et ::count.} {6}
1190: 0a 0a 74 65 73 74 20 73 74 61 63 6b 65 64 68 64  ..test stackedhd
11a0: 6c 2d 31 2e 31 30 20 7b 6c 6f 74 73 20 6f 66 20  l-1.10 {lots of 
11b0: 68 61 6e 64 6c 65 72 20 73 65 74 73 2c 20 77 69  handler sets, wi
11c0: 74 68 6f 75 74 20 64 65 66 61 75 6c 74 20 68 61  thout default ha
11d0: 6e 64 6c 65 72 20 73 65 74 7d 20 7b 0a 20 20 20  ndler set} {.   
11e0: 20 63 61 74 63 68 20 7b 75 6e 73 65 74 20 3a 3a   catch {unset ::
11f0: 63 6f 75 6e 74 7d 20 0a 20 20 20 20 63 61 74 63  count} .    catc
1200: 68 20 7b 75 6e 73 65 74 20 3a 3a 63 68 61 72 63  h {unset ::charc
1210: 6f 75 6e 74 7d 0a 20 20 20 20 63 61 74 63 68 20  ount}.    catch 
1220: 7b 75 6e 73 65 74 20 3a 3a 63 64 61 74 61 7d 0a  {unset ::cdata}.
1230: 20 20 20 20 73 65 74 20 70 20 5b 65 78 70 61 74      set p [expat
1240: 5d 0a 20 20 20 20 66 6f 72 20 7b 73 65 74 20 78  ].    for {set x
1250: 20 30 7d 20 7b 24 78 20 3c 20 31 30 30 7d 20 7b   0} {$x < 100} {
1260: 69 6e 63 72 20 78 7d 20 7b 0a 20 20 20 20 20 20  incr x} {.      
1270: 20 20 24 70 20 63 6f 6e 66 69 67 75 72 65 20 2d    $p configure -
1280: 68 61 6e 64 6c 65 72 73 65 74 20 73 65 74 24 78  handlerset set$x
1290: 20 2d 65 6c 65 6d 65 6e 74 73 74 61 72 74 63 6f   -elementstartco
12a0: 6d 6d 61 6e 64 20 43 6f 75 6e 74 20 5c 0a 20 20  mmand Count \.  
12b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12c0: 20 20 20 2d 65 6c 65 6d 65 6e 74 65 6e 64 63 6f     -elementendco
12d0: 6d 6d 61 6e 64 20 43 68 61 72 43 6f 75 6e 74 20  mmand CharCount 
12e0: 5c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  \.              
12f0: 20 20 20 20 20 20 20 2d 63 68 61 72 61 63 74 65         -characte
1300: 72 64 61 74 61 63 6f 6d 6d 61 6e 64 20 43 44 61  rdatacommand CDa
1310: 74 61 48 61 6e 64 6c 65 72 0a 20 20 20 20 7d 0a  taHandler.    }.
1320: 20 20 20 20 24 70 20 70 61 72 73 65 20 7b 3c 72      $p parse {<r
1330: 6f 6f 74 3e 20 20 3c 61 2f 3e 3c 61 3e 3c 2f 61  oot>  <a/><a></a
1340: 3e 3c 2f 72 6f 6f 74 3e 7d 0a 20 20 20 20 6c 69  ></root>}.    li
1350: 73 74 20 24 3a 3a 63 6f 75 6e 74 20 24 3a 3a 63  st $::count $::c
1360: 68 61 72 63 6f 75 6e 74 20 24 3a 3a 63 64 61 74  harcount $::cdat
1370: 61 0a 7d 20 7b 33 30 30 20 36 30 30 20 32 30 30  a.} {300 600 200
1380: 7d 0a 0a 74 65 73 74 20 73 74 61 63 6b 65 64 68  }..test stackedh
1390: 64 6c 2d 32 2e 31 20 7b 74 63 6c 20 68 61 6e 64  dl-2.1 {tcl hand
13a0: 6c 65 72 20 61 6e 64 20 43 20 63 6f 64 65 64 20  ler and C coded 
13b0: 70 61 72 73 65 72 20 65 78 74 65 6e 73 69 6f 6e  parser extension
13c0: 7d 20 7b 0a 20 20 20 20 63 61 74 63 68 20 7b 75  } {.    catch {u
13d0: 6e 73 65 74 20 3a 3a 63 6f 75 6e 74 7d 0a 20 20  nset ::count}.  
13e0: 20 20 73 65 74 20 70 20 5b 65 78 70 61 74 20 2d    set p [expat -
13f0: 65 6c 65 6d 65 6e 74 73 74 61 72 74 63 6f 6d 6d  elementstartcomm
1400: 61 6e 64 20 43 6f 75 6e 74 5d 0a 20 20 20 20 74  and Count].    t
1410: 64 6f 6d 20 24 70 20 65 6e 61 62 6c 65 0a 20 20  dom $p enable.  
1420: 20 20 24 70 20 70 61 72 73 65 20 7b 3c 72 6f 6f    $p parse {<roo
1430: 74 3e 3c 61 2f 3e 3c 61 3e 62 6f 6f 3c 2f 61 3e  t><a/><a>boo</a>
1440: 3c 2f 72 6f 6f 74 3e 7d 0a 20 20 20 20 73 65 74  </root>}.    set
1450: 20 64 6f 63 20 5b 74 64 6f 6d 20 24 70 20 67 65   doc [tdom $p ge
1460: 74 64 6f 63 5d 0a 20 20 20 20 73 65 74 20 72 6f  tdoc].    set ro
1470: 6f 74 20 5b 24 64 6f 63 20 64 6f 63 75 6d 65 6e  ot [$doc documen
1480: 74 45 6c 65 6d 65 6e 74 5d 0a 20 20 20 20 73 65  tElement].    se
1490: 74 20 72 65 73 75 6c 74 20 5b 6c 69 73 74 20 24  t result [list $
14a0: 3a 3a 63 6f 75 6e 74 20 5b 6c 6c 65 6e 67 74 68  ::count [llength
14b0: 20 5b 24 72 6f 6f 74 20 63 68 69 6c 64 4e 6f 64   [$root childNod
14c0: 65 73 5d 5d 5d 0a 20 20 20 20 24 64 6f 63 20 64  es]]].    $doc d
14d0: 65 6c 65 74 65 0a 20 20 20 20 73 65 74 20 72 65  elete.    set re
14e0: 73 75 6c 74 0a 7d 20 7b 33 20 32 7d 0a 0a 74 65  sult.} {3 2}..te
14f0: 73 74 20 73 74 61 63 6b 65 64 68 64 6c 2d 32 2e  st stackedhdl-2.
1500: 32 20 7b 74 63 6c 20 68 61 6e 64 6c 65 72 20 61  2 {tcl handler a
1510: 6e 64 20 43 20 63 6f 64 65 64 20 70 61 72 73 65  nd C coded parse
1520: 72 20 65 78 74 65 6e 73 69 6f 6e 7d 20 7b 0a 20  r extension} {. 
1530: 20 20 20 63 61 74 63 68 20 7b 75 6e 73 65 74 20     catch {unset 
1540: 3a 3a 63 6f 75 6e 74 7d 0a 20 20 20 20 73 65 74  ::count}.    set
1550: 20 70 20 5b 65 78 70 61 74 20 2d 65 6c 65 6d 65   p [expat -eleme
1560: 6e 74 73 74 61 72 74 63 6f 6d 6d 61 6e 64 20 43  ntstartcommand C
1570: 6f 75 6e 74 5d 0a 20 20 20 20 74 64 6f 6d 20 24  ount].    tdom $
1580: 70 20 65 6e 61 62 6c 65 0a 20 20 20 20 24 70 20  p enable.    $p 
1590: 70 61 72 73 65 20 7b 3c 72 6f 6f 74 3e 3c 61 2f  parse {<root><a/
15a0: 3e 3c 61 3e 62 6f 6f 3c 2f 61 3e 3c 2f 72 6f 6f  ><a>boo</a></roo
15b0: 74 3e 7d 0a 20 20 20 20 73 65 74 20 64 6f 63 20  t>}.    set doc 
15c0: 5b 74 64 6f 6d 20 24 70 20 67 65 74 64 6f 63 5d  [tdom $p getdoc]
15d0: 0a 20 20 20 20 24 70 20 66 72 65 65 0a 20 20 20  .    $p free.   
15e0: 20 73 65 74 20 72 6f 6f 74 20 5b 24 64 6f 63 20   set root [$doc 
15f0: 64 6f 63 75 6d 65 6e 74 45 6c 65 6d 65 6e 74 5d  documentElement]
1600: 0a 20 20 20 20 73 65 74 20 72 65 73 75 6c 74 20  .    set result 
1610: 5b 6c 69 73 74 20 24 3a 3a 63 6f 75 6e 74 20 5b  [list $::count [
1620: 6c 6c 65 6e 67 74 68 20 5b 24 72 6f 6f 74 20 63  llength [$root c
1630: 68 69 6c 64 4e 6f 64 65 73 5d 5d 5d 0a 20 20 20  hildNodes]]].   
1640: 20 24 64 6f 63 20 64 65 6c 65 74 65 0a 20 20 20   $doc delete.   
1650: 20 73 65 74 20 72 65 73 75 6c 74 0a 7d 20 7b 33   set result.} {3
1660: 20 32 7d 0a 0a 74 65 73 74 20 73 74 61 63 6b 65   2}..test stacke
1670: 64 68 64 6c 2d 32 2e 33 20 7b 72 65 74 75 72 6e  dhdl-2.3 {return
1680: 20 2d 63 6f 64 65 20 72 65 74 75 72 6e 20 77 69   -code return wi
1690: 74 68 20 74 63 6c 20 61 6e 64 20 43 20 63 6f 64  th tcl and C cod
16a0: 65 64 20 68 61 6e 64 6c 65 72 7d 20 2d 73 65 74  ed handler} -set
16b0: 75 70 20 7b 0a 20 20 20 20 63 61 74 63 68 20 7b  up {.    catch {
16c0: 75 6e 73 65 74 20 73 74 61 72 74 65 64 7d 0a 7d  unset started}.}
16d0: 20 2d 62 6f 64 79 20 7b 0a 20 20 20 20 73 65 74   -body {.    set
16e0: 20 70 20 5b 65 78 70 61 74 20 2d 65 6c 65 6d 65   p [expat -eleme
16f0: 6e 74 73 74 61 72 74 63 6f 6d 6d 61 6e 64 20 53  ntstartcommand S
1700: 74 61 72 74 5d 0a 20 20 20 20 74 64 6f 6d 20 24  tart].    tdom $
1710: 70 20 65 6e 61 62 6c 65 0a 20 20 20 20 73 65 74  p enable.    set
1720: 20 72 65 73 75 6c 74 63 6f 64 65 20 5b 63 61 74   resultcode [cat
1730: 63 68 20 7b 24 70 20 70 61 72 73 65 20 7b 3c 64  ch {$p parse {<d
1740: 6f 63 3e 3c 65 2f 3e 3c 65 20 63 6c 61 73 73 3d  oc><e/><e class=
1750: 22 72 65 74 75 72 6e 22 2f 3e 3c 65 2f 3e 3c 2f  "return"/><e/></
1760: 64 6f 63 3e 7d 7d 5d 0a 20 20 20 20 73 65 74 20  doc>}}].    set 
1770: 72 65 73 75 6c 74 20 5b 6c 69 73 74 20 24 72 65  result [list $re
1780: 73 75 6c 74 63 6f 64 65 20 24 3a 3a 73 74 61 72  sultcode $::star
1790: 74 65 64 28 65 29 20 5b 5b 74 64 6f 6d 20 24 70  ted(e) [[tdom $p
17a0: 20 67 65 74 64 6f 63 5d 20 61 73 58 4d 4c 20 2d   getdoc] asXML -
17b0: 69 6e 64 65 6e 74 20 6e 6f 6e 65 5d 5d 0a 20 20  indent none]].  
17c0: 20 20 24 70 20 66 72 65 65 0a 20 20 20 20 73 65    $p free.    se
17d0: 74 20 72 65 73 75 6c 74 0a 7d 20 2d 72 65 73 75  t result.} -resu
17e0: 6c 74 20 7b 30 20 32 20 7b 3c 64 6f 63 3e 3c 65  lt {0 2 {<doc><e
17f0: 2f 3e 3c 65 20 63 6c 61 73 73 3d 22 72 65 74 75  /><e class="retu
1800: 72 6e 22 2f 3e 3c 2f 64 6f 63 3e 7d 7d 0a 0a 74  rn"/></doc>}}..t
1810: 65 73 74 20 73 74 61 63 6b 65 64 68 64 6c 2d 32  est stackedhdl-2
1820: 2e 34 20 7b 72 65 74 75 72 6e 20 2d 63 6f 64 65  .4 {return -code
1830: 20 65 72 72 6f 72 20 77 69 74 68 20 74 63 6c 20   error with tcl 
1840: 61 6e 64 20 43 20 63 6f 64 65 64 20 68 61 6e 64  and C coded hand
1850: 6c 65 72 7d 20 2d 73 65 74 75 70 20 7b 0a 20 20  ler} -setup {.  
1860: 20 20 63 61 74 63 68 20 7b 75 6e 73 65 74 20 73    catch {unset s
1870: 74 61 72 74 65 64 7d 0a 7d 20 2d 62 6f 64 79 20  tarted}.} -body 
1880: 7b 0a 20 20 20 20 73 65 74 20 70 20 5b 65 78 70  {.    set p [exp
1890: 61 74 20 2d 65 6c 65 6d 65 6e 74 73 74 61 72 74  at -elementstart
18a0: 63 6f 6d 6d 61 6e 64 20 53 74 61 72 74 5d 0a 20  command Start]. 
18b0: 20 20 20 74 64 6f 6d 20 24 70 20 65 6e 61 62 6c     tdom $p enabl
18c0: 65 0a 20 20 20 20 73 65 74 20 72 65 73 75 6c 74  e.    set result
18d0: 63 6f 64 65 20 5b 63 61 74 63 68 20 7b 24 70 20  code [catch {$p 
18e0: 70 61 72 73 65 20 7b 3c 64 6f 63 3e 3c 65 2f 3e  parse {<doc><e/>
18f0: 3c 65 20 63 6c 61 73 73 3d 22 65 72 72 6f 72 22  <e class="error"
1900: 2f 3e 3c 65 2f 3e 3c 2f 64 6f 63 3e 7d 7d 20 6d  /><e/></doc>}} m
1910: 73 67 5d 0a 20 20 20 20 73 65 74 20 72 65 73 75  sg].    set resu
1920: 6c 74 20 5b 6c 69 73 74 20 24 72 65 73 75 6c 74  lt [list $result
1930: 63 6f 64 65 20 24 6d 73 67 20 24 3a 3a 73 74 61  code $msg $::sta
1940: 72 74 65 64 28 65 29 20 5b 5b 74 64 6f 6d 20 24  rted(e) [[tdom $
1950: 70 20 67 65 74 64 6f 63 5d 20 61 73 58 4d 4c 20  p getdoc] asXML 
1960: 2d 69 6e 64 65 6e 74 20 6e 6f 6e 65 5d 5d 0a 20  -indent none]]. 
1970: 20 20 20 24 70 20 66 72 65 65 0a 20 20 20 20 73     $p free.    s
1980: 65 74 20 72 65 73 75 6c 74 0a 7d 20 2d 72 65 73  et result.} -res
1990: 75 6c 74 20 7b 31 20 7b 65 72 72 6f 72 20 63 6f  ult {1 {error co
19a0: 6e 64 69 74 69 6f 6e 20 69 6e 20 63 61 6c 6c 62  ndition in callb
19b0: 61 63 6b 7d 20 32 20 7b 3c 64 6f 63 3e 3c 65 2f  ack} 2 {<doc><e/
19c0: 3e 3c 65 20 63 6c 61 73 73 3d 22 65 72 72 6f 72  ><e class="error
19d0: 22 2f 3e 3c 2f 64 6f 63 3e 7d 7d 0a 0a 74 65 73  "/></doc>}}..tes
19e0: 74 20 73 74 61 63 6b 65 64 68 64 6c 2d 32 2e 35  t stackedhdl-2.5
19f0: 20 7b 72 65 74 75 72 6e 20 2d 63 6f 64 65 20 72   {return -code r
1a00: 65 74 75 72 6e 20 77 69 74 68 20 74 63 6c 20 61  eturn with tcl a
1a10: 6e 64 20 43 20 63 6f 64 65 64 20 68 61 6e 64 6c  nd C coded handl
1a20: 65 72 7d 20 2d 73 65 74 75 70 20 7b 0a 20 20 20  er} -setup {.   
1a30: 20 63 61 74 63 68 20 7b 75 6e 73 65 74 20 73 74   catch {unset st
1a40: 61 72 74 65 64 7d 0a 7d 20 2d 62 6f 64 79 20 7b  arted}.} -body {
1a50: 0a 20 20 20 20 73 65 74 20 70 20 5b 65 78 70 61  .    set p [expa
1a60: 74 20 2d 65 6c 65 6d 65 6e 74 73 74 61 72 74 63  t -elementstartc
1a70: 6f 6d 6d 61 6e 64 20 53 74 61 72 74 5d 0a 20 20  ommand Start].  
1a80: 20 20 74 64 6f 6d 20 24 70 20 65 6e 61 62 6c 65    tdom $p enable
1a90: 0a 20 20 20 20 73 65 74 20 72 65 73 75 6c 74 63  .    set resultc
1aa0: 6f 64 65 20 5b 63 61 74 63 68 20 7b 24 70 20 70  ode [catch {$p p
1ab0: 61 72 73 65 20 7b 3c 64 6f 63 3e 3c 65 2f 3e 3c  arse {<doc><e/><
1ac0: 65 20 63 6c 61 73 73 3d 22 72 65 74 75 72 6e 22  e class="return"
1ad0: 2f 3e 3c 65 2f 3e 3c 2f 64 6f 63 3e 7d 7d 5d 0a  /><e/></doc>}}].
1ae0: 20 20 20 20 73 65 74 20 72 65 73 75 6c 74 20 5b      set result [
1af0: 6c 69 73 74 20 24 72 65 73 75 6c 74 63 6f 64 65  list $resultcode
1b00: 20 24 3a 3a 73 74 61 72 74 65 64 28 65 29 20 5b   $::started(e) [
1b10: 5b 74 64 6f 6d 20 24 70 20 67 65 74 64 6f 63 5d  [tdom $p getdoc]
1b20: 20 61 73 58 4d 4c 20 2d 69 6e 64 65 6e 74 20 6e   asXML -indent n
1b30: 6f 6e 65 5d 5d 0a 20 20 20 20 24 70 20 72 65 73  one]].    $p res
1b40: 65 74 0a 20 20 20 20 63 61 74 63 68 20 7b 75 6e  et.    catch {un
1b50: 73 65 74 20 73 74 61 72 74 65 64 7d 0a 20 20 20  set started}.   
1b60: 20 73 65 74 20 72 65 73 75 6c 74 63 6f 64 65 20   set resultcode 
1b70: 5b 63 61 74 63 68 20 7b 24 70 20 70 61 72 73 65  [catch {$p parse
1b80: 20 7b 3c 64 6f 63 3e 3c 65 2f 3e 3c 65 2f 3e 3c   {<doc><e/><e/><
1b90: 65 2f 3e 3c 2f 64 6f 63 3e 7d 7d 5d 0a 20 20 20  e/></doc>}}].   
1ba0: 20 6c 61 70 70 65 6e 64 20 72 65 73 75 6c 74 20   lappend result 
1bb0: 24 72 65 73 75 6c 74 63 6f 64 65 20 24 3a 3a 73  $resultcode $::s
1bc0: 74 61 72 74 65 64 28 65 29 20 5b 5b 74 64 6f 6d  tarted(e) [[tdom
1bd0: 20 24 70 20 67 65 74 64 6f 63 5d 20 61 73 58 4d   $p getdoc] asXM
1be0: 4c 20 2d 69 6e 64 65 6e 74 20 6e 6f 6e 65 5d 0a  L -indent none].
1bf0: 20 20 20 20 24 70 20 66 72 65 65 0a 20 20 20 20      $p free.    
1c00: 73 65 74 20 72 65 73 75 6c 74 0a 7d 20 2d 72 65  set result.} -re
1c10: 73 75 6c 74 20 7b 30 20 32 20 7b 3c 64 6f 63 3e  sult {0 2 {<doc>
1c20: 3c 65 2f 3e 3c 65 20 63 6c 61 73 73 3d 22 72 65  <e/><e class="re
1c30: 74 75 72 6e 22 2f 3e 3c 2f 64 6f 63 3e 7d 20 30  turn"/></doc>} 0
1c40: 20 33 20 3c 64 6f 63 3e 3c 65 2f 3e 3c 65 2f 3e   3 <doc><e/><e/>
1c50: 3c 65 2f 3e 3c 2f 64 6f 63 3e 7d 0a 0a 74 65 73  <e/></doc>}..tes
1c60: 74 20 73 74 61 63 6b 65 64 68 64 6c 2d 32 2e 36  t stackedhdl-2.6
1c70: 20 7b 72 65 74 75 72 6e 20 2d 63 6f 64 65 20 65   {return -code e
1c80: 72 72 6f 72 20 77 69 74 68 20 74 63 6c 20 61 6e  rror with tcl an
1c90: 64 20 43 20 63 6f 64 65 64 20 68 61 6e 64 6c 65  d C coded handle
1ca0: 72 7d 20 2d 73 65 74 75 70 20 7b 0a 20 20 20 20  r} -setup {.    
1cb0: 63 61 74 63 68 20 7b 75 6e 73 65 74 20 73 74 61  catch {unset sta
1cc0: 72 74 65 64 7d 0a 7d 20 2d 62 6f 64 79 20 7b 0a  rted}.} -body {.
1cd0: 20 20 20 20 73 65 74 20 70 20 5b 65 78 70 61 74      set p [expat
1ce0: 20 2d 65 6c 65 6d 65 6e 74 73 74 61 72 74 63 6f   -elementstartco
1cf0: 6d 6d 61 6e 64 20 53 74 61 72 74 5d 0a 20 20 20  mmand Start].   
1d00: 20 74 64 6f 6d 20 24 70 20 65 6e 61 62 6c 65 0a   tdom $p enable.
1d10: 20 20 20 20 73 65 74 20 72 65 73 75 6c 74 63 6f      set resultco
1d20: 64 65 20 5b 63 61 74 63 68 20 7b 24 70 20 70 61  de [catch {$p pa
1d30: 72 73 65 20 7b 3c 64 6f 63 3e 3c 65 2f 3e 3c 65  rse {<doc><e/><e
1d40: 20 63 6c 61 73 73 3d 22 65 72 72 6f 72 22 2f 3e   class="error"/>
1d50: 3c 65 2f 3e 3c 2f 64 6f 63 3e 7d 7d 20 6d 73 67  <e/></doc>}} msg
1d60: 5d 0a 20 20 20 20 73 65 74 20 72 65 73 75 6c 74  ].    set result
1d70: 20 5b 6c 69 73 74 20 24 72 65 73 75 6c 74 63 6f   [list $resultco
1d80: 64 65 20 24 6d 73 67 20 24 3a 3a 73 74 61 72 74  de $msg $::start
1d90: 65 64 28 65 29 20 5b 5b 74 64 6f 6d 20 24 70 20  ed(e) [[tdom $p 
1da0: 67 65 74 64 6f 63 5d 20 61 73 58 4d 4c 20 2d 69  getdoc] asXML -i
1db0: 6e 64 65 6e 74 20 6e 6f 6e 65 5d 5d 0a 20 20 20  ndent none]].   
1dc0: 20 24 70 20 72 65 73 65 74 0a 20 20 20 20 63 61   $p reset.    ca
1dd0: 74 63 68 20 7b 75 6e 73 65 74 20 73 74 61 72 74  tch {unset start
1de0: 65 64 7d 0a 20 20 20 20 73 65 74 20 72 65 73 75  ed}.    set resu
1df0: 6c 74 63 6f 64 65 20 5b 63 61 74 63 68 20 7b 24  ltcode [catch {$
1e00: 70 20 70 61 72 73 65 20 7b 3c 64 6f 63 3e 3c 65  p parse {<doc><e
1e10: 2f 3e 3c 65 2f 3e 3c 65 2f 3e 3c 2f 64 6f 63 3e  /><e/><e/></doc>
1e20: 7d 7d 5d 0a 20 20 20 20 6c 61 70 70 65 6e 64 20  }}].    lappend 
1e30: 72 65 73 75 6c 74 20 24 72 65 73 75 6c 74 63 6f  result $resultco
1e40: 64 65 20 24 3a 3a 73 74 61 72 74 65 64 28 65 29  de $::started(e)
1e50: 20 5b 5b 74 64 6f 6d 20 24 70 20 67 65 74 64 6f   [[tdom $p getdo
1e60: 63 5d 20 61 73 58 4d 4c 20 2d 69 6e 64 65 6e 74  c] asXML -indent
1e70: 20 6e 6f 6e 65 5d 0a 20 20 20 20 24 70 20 66 72   none].    $p fr
1e80: 65 65 0a 20 20 20 20 73 65 74 20 72 65 73 75 6c  ee.    set resul
1e90: 74 0a 7d 20 2d 72 65 73 75 6c 74 20 7b 31 20 7b  t.} -result {1 {
1ea0: 65 72 72 6f 72 20 63 6f 6e 64 69 74 69 6f 6e 20  error condition 
1eb0: 69 6e 20 63 61 6c 6c 62 61 63 6b 7d 20 32 20 7b  in callback} 2 {
1ec0: 3c 64 6f 63 3e 3c 65 2f 3e 3c 65 20 63 6c 61 73  <doc><e/><e clas
1ed0: 73 3d 22 65 72 72 6f 72 22 2f 3e 3c 2f 64 6f 63  s="error"/></doc
1ee0: 3e 7d 20 30 20 33 20 3c 64 6f 63 3e 3c 65 2f 3e  >} 0 3 <doc><e/>
1ef0: 3c 65 2f 3e 3c 65 2f 3e 3c 2f 64 6f 63 3e 7d 0a  <e/><e/></doc>}.
1f00: 0a 74 65 73 74 20 73 74 61 63 6b 65 64 68 64 6c  .test stackedhdl
1f10: 2d 33 2e 31 20 7b 64 6f 6e 27 74 20 72 65 71 75  -3.1 {don't requ
1f20: 65 73 74 20 74 68 65 20 44 4f 4d 20 74 72 65 65  est the DOM tree
1f30: 20 66 72 6f 6d 20 61 20 74 64 6f 6d 20 65 6e 61   from a tdom ena
1f40: 62 6c 65 64 20 70 61 72 73 65 72 7d 20 7b 0a 20  bled parser} {. 
1f50: 20 20 20 73 65 74 20 70 20 5b 65 78 70 61 74 5d     set p [expat]
1f60: 0a 20 20 20 20 74 64 6f 6d 20 24 70 20 65 6e 61  .    tdom $p ena
1f70: 62 6c 65 0a 20 20 20 20 24 70 20 70 61 72 73 65  ble.    $p parse
1f80: 20 7b 3c 72 6f 6f 74 3e 3c 61 2f 3e 3c 61 3e 62   {<root><a/><a>b
1f90: 6f 6f 3c 2f 61 3e 3c 2f 72 6f 6f 74 3e 7d 0a 20  oo</a></root>}. 
1fa0: 20 20 20 24 70 20 66 72 65 65 0a 7d 20 7b 7d 0a     $p free.} {}.
1fb0: 0a 66 6f 72 65 61 63 68 20 70 61 72 73 65 72 20  .foreach parser 
1fc0: 5b 69 6e 66 6f 20 63 6f 6d 6d 61 6e 64 73 20 78  [info commands x
1fd0: 6d 6c 70 61 72 73 65 72 2a 5d 20 7b 0a 20 20 20  mlparser*] {.   
1fe0: 20 24 70 61 72 73 65 72 20 66 72 65 65 0a 7d 0a   $parser free.}.
1ff0: 0a 23 20 63 6c 65 61 6e 75 70 0a 3a 3a 74 63 6c  .# cleanup.::tcl
2000: 74 65 73 74 3a 3a 63 6c 65 61 6e 75 70 54 65 73  test::cleanupTes
2010: 74 73 0a 72 65 74 75 72 6e 0a                    ts.return.