Artifact
19b73d012b9afa8bc84359161c9a2dd47304c8565c0ef3cf4e0064ce75debad4 :
File
tests/parser.test
— part of check-in
[9ba9808c25]
at
2021-11-12 09:59:26
on branch experimental/bulk-xml-parse
— more tests (covering properly stop on error/return in bulk XML-end handler)
(user:
sebres
size: 27084)
0000: 23 20 46 65 61 74 75 72 65 73 20 63 6f 76 65 72 # Features cover
0010: 65 64 3a 20 20 50 61 72 73 65 72 20 66 75 6e 63 ed: Parser func
0020: 74 69 6f 6e 73 0a 23 0a 23 20 54 68 69 73 20 66 tions.#.# This f
0030: 69 6c 65 20 74 65 73 74 73 20 74 68 65 20 70 61 ile tests the pa
0040: 72 73 65 72 27 73 20 62 61 73 69 63 20 66 75 6e rser's basic fun
0050: 63 74 69 6f 6e 73 2e 0a 23 0a 23 20 20 20 20 70 ctions..#.# p
0060: 61 72 73 65 72 2d 31 2e 2a 3a 20 70 61 72 73 65 arser-1.*: parse
0070: 72 20 63 72 65 61 74 69 6f 6e 0a 23 20 20 20 20 r creation.#
0080: 70 61 72 73 65 72 2d 32 2e 2a 3a 20 72 65 74 75 parser-2.*: retu
0090: 72 6e 20 63 6f 64 65 20 27 62 72 65 61 6b 27 20 rn code 'break'
00a0: 66 72 6f 6d 20 63 61 6c 6c 62 61 63 6b 0a 23 20 from callback.#
00b0: 20 20 20 70 61 72 73 65 72 2d 33 2e 2a 3a 20 72 parser-3.*: r
00c0: 65 74 75 72 6e 20 63 6f 64 65 20 27 63 6f 6e 74 eturn code 'cont
00d0: 69 6e 75 65 27 20 66 72 6f 6d 20 63 61 6c 6c 62 inue' from callb
00e0: 61 63 6b 0a 23 20 20 20 20 70 61 72 73 65 72 2d ack.# parser-
00f0: 34 2e 2a 3a 20 72 65 74 75 72 6e 20 63 6f 64 65 4.*: return code
0100: 20 27 65 72 72 6f 72 27 20 66 72 6f 6d 20 63 61 'error' from ca
0110: 6c 6c 62 61 63 6b 0a 23 20 20 20 20 70 61 72 73 llback.# pars
0120: 65 72 2d 35 2e 2a 3a 20 70 61 72 73 65 20 69 6e er-5.*: parse in
0130: 70 75 74 20 66 72 6f 6d 20 63 68 61 6e 6e 65 6c put from channel
0140: 0a 23 20 20 20 20 70 61 72 73 65 72 2d 36 2e 2a .# parser-6.*
0150: 3a 20 72 65 75 73 65 20 70 61 72 73 65 72 20 0a : reuse parser .
0160: 23 20 20 20 20 70 61 72 73 65 72 2d 37 2e 2a 3a # parser-7.*:
0170: 20 70 61 72 73 65 72 20 72 65 73 65 74 0a 23 20 parser reset.#
0180: 20 20 20 70 61 72 73 65 72 2d 38 2e 2a 3a 20 70 parser-8.*: p
0190: 61 72 73 65 72 20 66 72 65 65 0a 23 20 20 20 20 arser free.#
01a0: 70 61 72 73 65 72 2d 39 2e 2a 3a 20 70 61 72 73 parser-9.*: pars
01b0: 65 72 20 70 61 72 73 65 0a 23 20 20 20 20 70 61 er parse.# pa
01c0: 72 73 65 72 2d 31 30 2e 2a 3a 20 72 65 74 75 72 rser-10.*: retur
01d0: 6e 20 63 6f 64 65 20 27 72 65 74 75 72 6e 27 20 n code 'return'
01e0: 66 72 6f 6d 20 63 61 6c 6c 62 61 63 6b 0a 23 20 from callback.#
01f0: 20 20 20 70 61 72 73 65 72 2d 31 31 2e 2a 3a 20 parser-11.*:
0200: 70 61 72 73 65 72 20 69 6e 70 75 74 20 66 72 6f parser input fro
0210: 6d 20 66 69 6c 65 6e 61 6d 65 0a 23 20 20 20 20 m filename.#
0220: 70 61 72 73 65 72 2d 31 32 2e 2a 3a 20 70 61 72 parser-12.*: par
0230: 73 65 72 20 63 75 72 72 65 6e 74 6d 61 72 6b 75 ser currentmarku
0240: 70 0a 23 0a 23 20 43 6f 70 79 72 69 67 68 74 20 p.#.# Copyright
0250: 28 63 29 20 31 39 39 39 2d 32 30 30 30 20 5a 76 (c) 1999-2000 Zv
0260: 65 6e 6f 20 50 74 79 20 4c 74 64 2e 0a 23 20 43 eno Pty Ltd..# C
0270: 6f 70 79 72 69 67 68 74 20 28 63 29 20 32 30 30 opyright (c) 200
0280: 32 2d 32 30 31 35 20 52 6f 6c 66 20 41 64 65 0a 2-2015 Rolf Ade.
0290: 23 0a 23 20 24 49 64 24 0a 0a 73 6f 75 72 63 65 #.# $Id$..source
02a0: 20 5b 66 69 6c 65 20 6a 6f 69 6e 20 5b 66 69 6c [file join [fil
02b0: 65 20 64 69 72 20 5b 69 6e 66 6f 20 73 63 72 69 e dir [info scri
02c0: 70 74 5d 5d 20 6c 6f 61 64 74 64 6f 6d 2e 74 63 pt]] loadtdom.tc
02d0: 6c 5d 0a 0a 70 72 6f 63 20 70 61 72 72 61 79 20 l]..proc parray
02e0: 61 72 72 61 79 4e 61 6d 65 20 7b 0a 20 20 20 20 arrayName {.
02f0: 75 70 76 61 72 20 23 30 20 24 61 72 72 61 79 4e upvar #0 $arrayN
0300: 61 6d 65 20 61 72 72 0a 20 20 20 20 66 6f 72 65 ame arr. fore
0310: 61 63 68 20 6b 65 79 20 5b 6c 73 6f 72 74 20 5b ach key [lsort [
0320: 61 72 72 61 79 20 6e 61 6d 65 73 20 24 61 72 72 array names $arr
0330: 61 79 4e 61 6d 65 5d 5d 20 7b 0a 09 6c 61 70 70 ayName]] {..lapp
0340: 65 6e 64 20 72 65 73 75 6c 74 20 24 6b 65 79 20 end result $key
0350: 24 61 72 72 28 24 6b 65 79 29 0a 20 20 20 20 7d $arr($key). }
0360: 0a 20 20 20 20 72 65 74 75 72 6e 20 24 72 65 73 . return $res
0370: 75 6c 74 0a 7d 0a 0a 63 61 74 63 68 20 7b 75 6e ult.}..catch {un
0380: 73 65 74 20 63 6f 75 6e 74 7d 20 0a 70 72 6f 63 set count} .proc
0390: 20 43 6f 75 6e 74 20 7b 61 72 67 73 7d 20 7b 0a Count {args} {.
03a0: 20 20 20 20 69 66 20 7b 21 5b 69 6e 66 6f 20 65 if {![info e
03b0: 78 69 73 74 73 20 3a 3a 63 6f 75 6e 74 5d 7d 20 xists ::count]}
03c0: 7b 0a 20 20 20 20 20 20 20 20 73 65 74 20 3a 3a {. set ::
03d0: 63 6f 75 6e 74 20 31 0a 20 20 20 20 7d 20 65 6c count 1. } el
03e0: 73 65 20 7b 0a 20 20 20 20 20 20 20 20 69 6e 63 se {. inc
03f0: 72 20 3a 3a 63 6f 75 6e 74 0a 20 20 20 20 7d 0a r ::count. }.
0400: 7d 0a 0a 63 61 74 63 68 20 7b 75 6e 73 65 74 20 }..catch {unset
0410: 73 74 61 72 74 65 64 7d 0a 70 72 6f 63 20 53 74 started}.proc St
0420: 61 72 74 20 7b 6e 61 6d 65 20 61 74 4c 69 73 74 art {name atList
0430: 20 61 72 67 73 7d 20 7b 0a 20 20 20 20 61 72 72 args} {. arr
0440: 61 79 20 73 65 74 20 6f 70 74 73 20 24 61 72 67 ay set opts $arg
0450: 73 0a 20 20 20 20 61 72 72 61 79 20 73 65 74 20 s. array set
0460: 61 74 74 73 20 24 61 74 4c 69 73 74 0a 0a 20 20 atts $atList..
0470: 20 20 69 66 20 7b 21 5b 69 6e 66 6f 20 65 78 69 if {![info exi
0480: 73 74 73 20 3a 3a 73 74 61 72 74 65 64 28 24 6e sts ::started($n
0490: 61 6d 65 29 5d 7d 20 7b 0a 09 73 65 74 20 3a 3a ame)]} {..set ::
04a0: 73 74 61 72 74 65 64 28 24 6e 61 6d 65 29 20 31 started($name) 1
04b0: 0a 20 20 20 20 7d 20 65 6c 73 65 20 7b 0a 09 69 . } else {..i
04c0: 6e 63 72 20 3a 3a 73 74 61 72 74 65 64 28 24 6e ncr ::started($n
04d0: 61 6d 65 29 0a 20 20 20 20 7d 0a 20 20 20 20 69 ame). }. i
04e0: 66 20 7b 5b 69 6e 66 6f 20 65 78 69 73 74 73 20 f {[info exists
04f0: 61 74 74 73 28 63 6c 61 73 73 29 5d 7d 20 7b 0a atts(class)]} {.
0500: 09 73 77 69 74 63 68 20 24 61 74 74 73 28 63 6c .switch $atts(cl
0510: 61 73 73 29 20 7b 0a 09 20 20 20 20 63 6f 6e 74 ass) {.. cont
0520: 69 6e 75 65 20 7b 0a 09 09 72 65 74 75 72 6e 20 inue {...return
0530: 2d 63 6f 64 65 20 63 6f 6e 74 69 6e 75 65 0a 09 -code continue..
0540: 20 20 20 20 7d 0a 09 20 20 20 20 62 72 65 61 6b }.. break
0550: 20 7b 0a 09 09 72 65 74 75 72 6e 20 2d 63 6f 64 {...return -cod
0560: 65 20 62 72 65 61 6b 0a 09 20 20 20 20 7d 0a 09 e break.. }..
0570: 20 20 20 20 65 72 72 6f 72 20 7b 0a 09 09 72 65 error {...re
0580: 74 75 72 6e 20 2d 63 6f 64 65 20 65 72 72 6f 72 turn -code error
0590: 20 22 65 72 72 6f 72 20 63 6f 6e 64 69 74 69 6f "error conditio
05a0: 6e 20 69 6e 20 63 61 6c 6c 62 61 63 6b 22 0a 09 n in callback"..
05b0: 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 }.
05c0: 20 20 72 65 74 75 72 6e 20 7b 0a 20 20 20 20 20 return {.
05d0: 20 20 20 20 20 20 20 20 20 20 20 72 65 74 75 72 retur
05e0: 6e 20 2d 63 6f 64 65 20 72 65 74 75 72 6e 0a 20 n -code return.
05f0: 20 20 20 20 20 20 20 20 20 20 20 7d 0a 09 20 20 }..
0600: 20 20 64 65 66 61 75 6c 74 20 7b 0a 09 09 72 65 default {...re
0610: 74 75 72 6e 20 2d 63 6f 64 65 20 24 61 74 74 73 turn -code $atts
0620: 28 63 6c 61 73 73 29 20 0a 09 20 20 20 20 7d 0a (class) .. }.
0630: 09 7d 0a 20 20 20 20 7d 0a 7d 0a 63 61 74 63 68 .}. }.}.catch
0640: 20 7b 75 6e 73 65 74 20 65 6e 64 65 64 7d 0a 70 {unset ended}.p
0650: 72 6f 63 20 45 6e 64 20 7b 6e 61 6d 65 20 61 72 roc End {name ar
0660: 67 73 7d 20 7b 0a 20 20 20 20 61 72 72 61 79 20 gs} {. array
0670: 73 65 74 20 6f 70 74 73 20 24 61 72 67 73 0a 20 set opts $args.
0680: 20 20 20 69 66 20 7b 21 5b 69 6e 66 6f 20 65 78 if {![info ex
0690: 69 73 74 73 20 3a 3a 65 6e 64 65 64 28 24 6e 61 ists ::ended($na
06a0: 6d 65 29 5d 7d 20 7b 0a 09 73 65 74 20 3a 3a 65 me)]} {..set ::e
06b0: 6e 64 65 64 28 24 6e 61 6d 65 29 20 31 0a 20 20 nded($name) 1.
06c0: 20 20 7d 20 65 6c 73 65 20 7b 0a 09 69 6e 63 72 } else {..incr
06d0: 20 3a 3a 65 6e 64 65 64 28 24 6e 61 6d 65 29 0a ::ended($name).
06e0: 20 20 20 20 7d 0a 7d 0a 70 72 6f 63 20 50 49 20 }.}.proc PI
06f0: 7b 6e 61 6d 65 20 61 72 67 73 7d 20 7b 0a 20 20 {name args} {.
0700: 20 20 72 65 74 75 72 6e 20 2d 63 6f 64 65 20 24 return -code $
0710: 6e 61 6d 65 0a 7d 0a 0a 63 61 74 63 68 20 7b 75 name.}..catch {u
0720: 6e 73 65 74 20 65 6c 4c 69 73 74 7d 0a 70 72 6f nset elList}.pro
0730: 63 20 45 6c 53 74 61 72 74 20 7b 6e 61 6d 65 20 c ElStart {name
0740: 61 74 4c 69 73 74 20 61 72 67 73 7d 20 7b 0a 20 atList args} {.
0750: 20 20 20 61 72 72 61 79 20 73 65 74 20 6f 70 74 array set opt
0760: 73 20 7b 2d 65 6d 70 74 79 20 30 7d 0a 20 20 20 s {-empty 0}.
0770: 20 61 72 72 61 79 20 73 65 74 20 6f 70 74 73 20 array set opts
0780: 24 61 72 67 73 0a 20 20 20 20 6c 61 70 70 65 6e $args. lappen
0790: 64 20 3a 3a 65 6c 4c 69 73 74 20 73 74 61 72 74 d ::elList start
07a0: 20 24 6e 61 6d 65 20 24 6f 70 74 73 28 2d 65 6d $name $opts(-em
07b0: 70 74 79 29 0a 7d 0a 70 72 6f 63 20 45 6c 45 6e pty).}.proc ElEn
07c0: 64 20 7b 6e 61 6d 65 20 61 72 67 73 7d 20 7b 0a d {name args} {.
07d0: 20 20 20 20 61 72 72 61 79 20 73 65 74 20 6f 70 array set op
07e0: 74 73 20 7b 2d 65 6d 70 74 79 20 30 7d 0a 20 20 ts {-empty 0}.
07f0: 20 20 61 72 72 61 79 20 73 65 74 20 6f 70 74 73 array set opts
0800: 20 24 61 72 67 73 0a 20 20 20 20 6c 61 70 70 65 $args. lappe
0810: 6e 64 20 3a 3a 65 6c 4c 69 73 74 20 65 6e 64 20 nd ::elList end
0820: 24 6e 61 6d 65 20 24 6f 70 74 73 28 2d 65 6d 70 $name $opts(-emp
0830: 74 79 29 0a 7d 0a 0a 74 65 73 74 20 70 61 72 73 ty).}..test pars
0840: 65 72 2d 31 2e 31 20 7b 70 61 72 73 65 72 20 63 er-1.1 {parser c
0850: 72 65 61 74 69 6f 6e 7d 20 7b 0a 20 20 20 20 73 reation} {. s
0860: 65 74 20 70 20 5b 3a 3a 78 6d 6c 3a 3a 70 61 72 et p [::xml::par
0870: 73 65 72 5d 0a 20 20 20 20 72 65 67 65 78 70 20 ser]. regexp
0880: 7b 5e 78 6d 6c 70 61 72 73 65 72 5b 30 2d 39 5d {^xmlparser[0-9]
0890: 2b 24 7d 20 24 70 0a 7d 20 31 0a 0a 74 65 73 74 +$} $p.} 1..test
08a0: 20 70 61 72 73 65 72 2d 31 2e 32 20 7b 70 61 72 parser-1.2 {par
08b0: 73 65 72 20 63 72 65 61 74 69 6f 6e 2c 20 6f 6e ser creation, on
08c0: 6c 79 20 6f 70 74 69 6f 6e 73 7d 20 7b 0a 20 20 ly options} {.
08d0: 20 20 73 65 74 20 70 20 5b 3a 3a 78 6d 6c 3a 3a set p [::xml::
08e0: 70 61 72 73 65 72 20 2d 65 6c 65 6d 65 6e 74 73 parser -elements
08f0: 74 61 72 74 63 6f 6d 6d 61 6e 64 20 53 74 61 72 tartcommand Star
0900: 74 5d 0a 20 20 20 20 72 65 67 65 78 70 20 7b 5e t]. regexp {^
0910: 78 6d 6c 70 61 72 73 65 72 5b 30 2d 39 5d 2b 24 xmlparser[0-9]+$
0920: 7d 20 24 70 0a 7d 20 31 0a 0a 74 65 73 74 20 70 } $p.} 1..test p
0930: 61 72 73 65 72 2d 31 2e 33 20 7b 70 61 72 73 65 arser-1.3 {parse
0940: 72 20 63 72 65 61 74 69 6f 6e 2c 20 6e 61 6d 65 r creation, name
0950: 64 7d 20 7b 0a 20 20 20 20 63 61 74 63 68 20 7b d} {. catch {
0960: 72 65 6e 61 6d 65 20 70 61 72 73 65 72 2d 31 2e rename parser-1.
0970: 33 20 7b 7d 7d 0a 20 20 20 20 3a 3a 78 6d 6c 3a 3 {}}. ::xml:
0980: 3a 70 61 72 73 65 72 20 70 61 72 73 65 72 2d 31 :parser parser-1
0990: 2e 33 0a 7d 20 70 61 72 73 65 72 2d 31 2e 33 0a .3.} parser-1.3.
09a0: 0a 74 65 73 74 20 70 61 72 73 65 72 2d 31 2e 34 .test parser-1.4
09b0: 20 7b 70 61 72 73 65 72 20 63 72 65 61 74 69 6f {parser creatio
09c0: 6e 2c 20 6e 61 6d 65 64 20 77 69 74 68 20 6f 70 n, named with op
09d0: 74 69 6f 6e 73 7d 20 7b 0a 20 20 20 20 63 61 74 tions} {. cat
09e0: 63 68 20 7b 72 65 6e 61 6d 65 20 70 61 72 73 65 ch {rename parse
09f0: 72 2d 31 2e 34 20 7b 7d 7d 0a 20 20 20 20 3a 3a r-1.4 {}}. ::
0a00: 78 6d 6c 3a 3a 70 61 72 73 65 72 20 70 61 72 73 xml::parser pars
0a10: 65 72 2d 31 2e 34 20 2d 65 6c 65 6d 65 6e 74 73 er-1.4 -elements
0a20: 74 61 72 74 63 6f 6d 6d 61 6e 64 20 53 74 61 72 tartcommand Star
0a30: 74 0a 7d 20 70 61 72 73 65 72 2d 31 2e 34 0a 0a t.} parser-1.4..
0a40: 74 65 73 74 20 70 61 72 73 65 72 2d 31 2e 35 20 test parser-1.5
0a50: 7b 70 61 72 73 65 72 20 66 72 65 65 69 6e 67 2c {parser freeing,
0a60: 20 77 72 6f 6e 67 20 6e 72 20 6f 66 20 61 72 67 wrong nr of arg
0a70: 73 7d 20 7b 0a 20 20 20 20 73 65 74 20 70 20 5b s} {. set p [
0a80: 65 78 70 61 74 5d 0a 20 20 20 20 69 66 20 7b 5b expat]. if {[
0a90: 73 65 74 20 72 65 73 75 6c 74 20 5b 63 61 74 63 set result [catc
0aa0: 68 20 7b 24 70 20 66 72 65 65 20 77 72 6f 6e 67 h {$p free wrong
0ab0: 61 72 67 7d 5d 5d 7d 20 7b 0a 20 20 20 20 20 20 arg}]]} {.
0ac0: 20 20 24 70 20 66 72 65 65 0a 20 20 20 20 7d 0a $p free. }.
0ad0: 20 20 20 20 73 65 74 20 72 65 73 75 6c 74 0a 7d set result.}
0ae0: 20 31 0a 0a 74 65 73 74 20 70 61 72 73 65 72 2d 1..test parser-
0af0: 31 2e 36 20 7b 70 61 72 73 65 72 20 63 72 65 61 1.6 {parser crea
0b00: 74 65 20 73 79 6e 74 61 78 20 63 68 65 63 6b 7d te syntax check}
0b10: 20 7b 0a 20 20 20 20 73 65 74 20 72 65 73 75 6c {. set resul
0b20: 74 20 5b 63 61 74 63 68 20 7b 73 65 74 20 70 61 t [catch {set pa
0b30: 72 73 65 72 20 5b 65 78 70 61 74 20 2d 70 61 72 rser [expat -par
0b40: 61 6d 65 6e 74 69 74 79 70 61 72 73 69 6e 67 20 amentityparsing
0b50: 77 72 6f 6e 67 5d 7d 20 65 72 72 4d 73 67 5d 0a wrong]} errMsg].
0b60: 20 20 20 20 6c 61 70 70 65 6e 64 20 72 65 73 75 lappend resu
0b70: 6c 74 20 24 65 72 72 4d 73 67 0a 7d 20 7b 31 20 lt $errMsg.} {1
0b80: 7b 62 61 64 20 76 61 6c 75 65 20 22 77 72 6f 6e {bad value "wron
0b90: 67 22 3a 20 6d 75 73 74 20 62 65 20 61 6c 77 61 g": must be alwa
0ba0: 79 73 2c 20 6e 65 76 65 72 2c 20 6f 72 20 6e 6f ys, never, or no
0bb0: 74 73 74 61 6e 64 61 6c 6f 6e 65 7d 7d 0a 0a 74 tstandalone}}..t
0bc0: 65 73 74 20 70 61 72 73 65 72 2d 31 2e 37 20 7b est parser-1.7 {
0bd0: 70 61 72 73 65 72 20 63 67 65 74 20 73 79 6e 74 parser cget synt
0be0: 61 78 7d 20 7b 0a 20 20 20 20 63 61 74 63 68 20 ax} {. catch
0bf0: 7b 72 65 6e 61 6d 65 20 70 61 72 73 65 72 2d 31 {rename parser-1
0c00: 2e 37 20 7b 7d 7d 0a 20 20 20 20 73 65 74 20 70 .7 {}}. set p
0c10: 61 72 73 65 72 20 5b 65 78 70 61 74 20 70 61 72 arser [expat par
0c20: 73 65 72 2d 31 2e 37 5d 0a 20 20 20 20 73 65 74 ser-1.7]. set
0c30: 20 72 65 73 75 6c 74 20 5b 63 61 74 63 68 20 7b result [catch {
0c40: 24 70 61 72 73 65 72 20 63 67 65 74 7d 20 65 72 $parser cget} er
0c50: 72 4d 73 67 5d 0a 20 20 20 20 6c 61 70 70 65 6e rMsg]. lappen
0c60: 64 20 72 65 73 75 6c 74 20 24 65 72 72 4d 73 67 d result $errMsg
0c70: 0a 7d 20 7b 31 20 7b 77 72 6f 6e 67 20 23 20 61 .} {1 {wrong # a
0c80: 72 67 73 3a 20 73 68 6f 75 6c 64 20 62 65 20 22 rgs: should be "
0c90: 70 61 72 73 65 72 2d 31 2e 37 20 63 67 65 74 20 parser-1.7 cget
0ca0: 3f 2d 68 61 6e 64 6c 65 72 73 65 74 20 68 61 6e ?-handlerset han
0cb0: 64 6c 65 72 73 65 74 6e 61 6d 65 3f 20 73 77 69 dlersetname? swi
0cc0: 74 63 68 22 7d 7d 0a 0a 74 65 73 74 20 70 61 72 tch"}}..test par
0cd0: 73 65 72 2d 31 2e 38 20 7b 70 61 72 73 65 72 20 ser-1.8 {parser
0ce0: 63 67 65 74 20 73 79 6e 74 61 78 7d 20 7b 0a 20 cget syntax} {.
0cf0: 20 20 20 63 61 74 63 68 20 7b 72 65 6e 61 6d 65 catch {rename
0d00: 20 70 61 72 73 65 72 2d 31 2e 38 20 7b 7d 7d 0a parser-1.8 {}}.
0d10: 20 20 20 20 73 65 74 20 70 61 72 73 65 72 20 5b set parser [
0d20: 65 78 70 61 74 20 70 61 72 73 65 72 2d 31 2e 38 expat parser-1.8
0d30: 5d 0a 20 20 20 20 73 65 74 20 72 65 73 75 6c 74 ]. set result
0d40: 20 5b 63 61 74 63 68 20 7b 24 70 61 72 73 65 72 [catch {$parser
0d50: 20 63 67 65 74 20 2d 68 61 6e 64 6c 65 72 73 65 cget -handlerse
0d60: 74 20 2d 66 69 6e 61 6c 7d 20 65 72 72 4d 73 67 t -final} errMsg
0d70: 5d 0a 20 20 20 20 6c 61 70 70 65 6e 64 20 72 65 ]. lappend re
0d80: 73 75 6c 74 20 24 65 72 72 4d 73 67 0a 7d 20 7b sult $errMsg.} {
0d90: 31 20 7b 77 72 6f 6e 67 20 23 20 61 72 67 73 3a 1 {wrong # args:
0da0: 20 73 68 6f 75 6c 64 20 62 65 20 22 3f 2d 68 61 should be "?-ha
0db0: 6e 64 6c 65 72 73 65 74 20 68 61 6e 64 6c 65 72 ndlerset handler
0dc0: 73 65 74 6e 61 6d 65 3f 20 73 77 69 74 63 68 22 setname? switch"
0dd0: 7d 7d 0a 0a 74 65 73 74 20 70 61 72 73 65 72 2d }}..test parser-
0de0: 31 2e 39 20 7b 70 61 72 73 65 72 20 63 67 65 74 1.9 {parser cget
0df0: 20 73 79 6e 74 61 78 7d 20 7b 0a 20 20 20 20 63 syntax} {. c
0e00: 61 74 63 68 20 7b 72 65 6e 61 6d 65 20 70 61 72 atch {rename par
0e10: 73 65 72 2d 31 2e 39 20 7b 7d 7d 0a 20 20 20 20 ser-1.9 {}}.
0e20: 73 65 74 20 70 61 72 73 65 72 20 5b 65 78 70 61 set parser [expa
0e30: 74 20 70 61 72 73 65 72 2d 31 2e 39 5d 0a 20 20 t parser-1.9].
0e40: 20 20 73 65 74 20 72 65 73 75 6c 74 20 5b 63 61 set result [ca
0e50: 74 63 68 20 7b 24 70 61 72 73 65 72 20 63 67 65 tch {$parser cge
0e60: 74 20 2d 68 61 6e 64 6c 65 72 73 65 74 20 64 6f t -handlerset do
0e70: 6e 74 65 78 69 73 74 20 2d 62 61 73 65 75 72 6c ntexist -baseurl
0e80: 7d 20 65 72 72 4d 73 67 5d 0a 20 20 20 20 6c 61 } errMsg]. la
0e90: 70 70 65 6e 64 20 72 65 73 75 6c 74 20 24 65 72 ppend result $er
0ea0: 72 4d 73 67 0a 7d 20 7b 31 20 7b 69 6e 76 61 6c rMsg.} {1 {inval
0eb0: 69 64 20 68 61 6e 64 6c 65 72 73 65 74 20 6e 61 id handlerset na
0ec0: 6d 65 3a 20 64 6f 6e 74 65 78 69 73 74 7d 7d 0a me: dontexist}}.
0ed0: 0a 74 65 73 74 20 70 61 72 73 65 72 2d 31 2e 31 .test parser-1.1
0ee0: 30 20 7b 70 61 72 73 65 72 20 63 67 65 74 20 73 0 {parser cget s
0ef0: 79 6e 74 61 78 7d 20 7b 0a 20 20 20 20 63 61 74 yntax} {. cat
0f00: 63 68 20 7b 72 65 6e 61 6d 65 20 70 61 72 73 65 ch {rename parse
0f10: 72 2d 31 2e 31 30 20 7b 7d 7d 0a 20 20 20 20 73 r-1.10 {}}. s
0f20: 65 74 20 70 61 72 73 65 72 20 5b 65 78 70 61 74 et parser [expat
0f30: 20 70 61 72 73 65 72 2d 31 2e 31 30 5d 0a 20 20 parser-1.10].
0f40: 20 20 73 65 74 20 72 65 73 75 6c 74 20 5b 24 70 set result [$p
0f50: 61 72 73 65 72 20 63 67 65 74 20 2d 68 61 6e 64 arser cget -hand
0f60: 6c 65 72 73 65 74 20 64 65 66 61 75 6c 74 20 2d lerset default -
0f70: 62 61 73 65 75 72 6c 5d 0a 7d 20 7b 7d 0a 0a 74 baseurl].} {}..t
0f80: 65 73 74 20 70 61 72 73 65 72 2d 31 2e 31 31 20 est parser-1.11
0f90: 7b 70 61 72 73 65 72 20 63 67 65 74 20 73 79 6e {parser cget syn
0fa0: 74 61 78 7d 20 7b 0a 20 20 20 20 63 61 74 63 68 tax} {. catch
0fb0: 20 7b 72 65 6e 61 6d 65 20 70 61 72 73 65 72 2d {rename parser-
0fc0: 31 2e 31 31 20 7b 7d 7d 0a 20 20 20 20 73 65 74 1.11 {}}. set
0fd0: 20 70 61 72 73 65 72 20 5b 65 78 70 61 74 20 70 parser [expat p
0fe0: 61 72 73 65 72 2d 31 2e 31 31 20 2d 62 61 73 65 arser-1.11 -base
0ff0: 75 72 6c 20 68 74 74 70 3a 2f 2f 66 6f 6f 2e 6f url http://foo.o
1000: 72 67 2f 5d 0a 20 20 20 20 73 65 74 20 72 65 73 rg/]. set res
1010: 75 6c 74 20 5b 24 70 61 72 73 65 72 20 63 67 65 ult [$parser cge
1020: 74 20 2d 68 61 6e 64 6c 65 72 73 65 74 20 64 65 t -handlerset de
1030: 66 61 75 6c 74 20 2d 62 61 73 65 75 72 6c 5d 0a fault -baseurl].
1040: 7d 20 7b 68 74 74 70 3a 2f 2f 66 6f 6f 2e 6f 72 } {http://foo.or
1050: 67 2f 7d 0a 0a 74 65 73 74 20 70 61 72 73 65 72 g/}..test parser
1060: 2d 31 2e 31 32 20 7b 70 61 72 73 65 72 20 63 67 -1.12 {parser cg
1070: 65 74 7d 20 7b 0a 20 20 20 20 63 61 74 63 68 20 et} {. catch
1080: 7b 72 65 6e 61 6d 65 20 70 61 72 73 65 72 2d 31 {rename parser-1
1090: 2e 31 32 20 7b 7d 7d 0a 20 20 20 20 73 65 74 20 .12 {}}. set
10a0: 70 61 72 73 65 72 20 5b 65 78 70 61 74 20 70 61 parser [expat pa
10b0: 72 73 65 72 2d 31 2e 31 32 5d 0a 20 20 20 20 73 rser-1.12]. s
10c0: 65 74 20 72 65 73 75 6c 74 20 5b 24 70 61 72 73 et result [$pars
10d0: 65 72 20 63 67 65 74 20 2d 62 61 73 65 75 72 6c er cget -baseurl
10e0: 5d 0a 7d 20 7b 7d 0a 0a 70 72 6f 63 20 65 73 68 ].} {}..proc esh
10f0: 5f 31 5f 31 33 5f 31 20 7b 61 72 67 73 7d 20 7b _1_13_1 {args} {
1100: 0a 20 20 20 20 69 6e 63 72 20 3a 3a 65 73 68 5f . incr ::esh_
1110: 31 5f 31 33 5f 31 0a 7d 0a 70 72 6f 63 20 65 73 1_13_1.}.proc es
1120: 68 5f 31 5f 31 33 5f 32 20 7b 61 72 67 73 7d 20 h_1_13_2 {args}
1130: 7b 0a 20 20 20 20 69 6e 63 72 20 3a 3a 65 73 68 {. incr ::esh
1140: 5f 31 5f 31 33 5f 32 0a 7d 0a 74 65 73 74 20 70 _1_13_2.}.test p
1150: 61 72 73 65 72 2d 31 2e 31 33 20 7b 70 61 72 73 arser-1.13 {pars
1160: 65 72 20 63 6f 6e 66 69 67 75 72 65 7d 20 7b 0a er configure} {.
1170: 20 20 20 20 73 65 74 20 3a 3a 65 73 68 5f 31 5f set ::esh_1_
1180: 31 33 5f 31 20 30 0a 20 20 20 20 73 65 74 20 3a 13_1 0. set :
1190: 3a 65 73 68 5f 31 5f 31 33 5f 32 20 30 0a 20 20 :esh_1_13_2 0.
11a0: 20 20 63 61 74 63 68 20 7b 72 65 6e 61 6d 65 20 catch {rename
11b0: 70 61 72 73 65 72 2d 31 2e 31 33 20 7b 7d 7d 0a parser-1.13 {}}.
11c0: 20 20 20 20 73 65 74 20 70 20 5b 65 78 70 61 74 set p [expat
11d0: 20 70 61 72 73 65 72 2d 31 2e 31 33 20 2d 65 6c parser-1.13 -el
11e0: 65 6d 65 6e 74 73 74 61 72 74 63 6f 6d 6d 61 6e ementstartcomman
11f0: 64 20 65 73 68 5f 31 5f 31 33 5f 31 5d 0a 20 20 d esh_1_13_1].
1200: 20 20 24 70 20 63 6f 6e 66 69 67 75 72 65 20 2d $p configure -
1210: 65 6c 65 6d 65 6e 74 73 74 61 72 74 63 6f 6d 6d elementstartcomm
1220: 61 6e 64 20 65 73 68 5f 31 5f 31 33 5f 32 0a 20 and esh_1_13_2.
1230: 20 20 20 24 70 20 70 61 72 73 65 20 7b 3c 72 6f $p parse {<ro
1240: 6f 74 3e 3c 61 2f 3e 3c 62 2f 3e 3c 2f 72 6f 6f ot><a/><b/></roo
1250: 74 3e 7d 0a 20 20 20 20 6c 69 73 74 20 24 3a 3a t>}. list $::
1260: 65 73 68 5f 31 5f 31 33 5f 31 20 24 3a 3a 65 73 esh_1_13_1 $::es
1270: 68 5f 31 5f 31 33 5f 32 0a 7d 20 7b 30 20 33 7d h_1_13_2.} {0 3}
1280: 0a 0a 74 65 73 74 20 70 61 72 73 65 72 2d 31 2e ..test parser-1.
1290: 31 34 20 7b 70 61 72 73 65 72 20 67 65 74 7d 20 14 {parser get}
12a0: 7b 0a 20 20 20 20 63 61 74 63 68 20 7b 72 65 6e {. catch {ren
12b0: 61 6d 65 20 70 61 72 73 65 72 2d 31 2e 31 34 20 ame parser-1.14
12c0: 7b 7d 7d 0a 20 20 20 20 73 65 74 20 70 61 72 73 {}}. set pars
12d0: 65 72 20 5b 65 78 70 61 74 20 70 61 72 73 65 72 er [expat parser
12e0: 2d 31 2e 31 34 5d 0a 20 20 20 20 73 65 74 20 72 -1.14]. set r
12f0: 65 73 75 6c 74 20 5b 63 61 74 63 68 20 7b 24 70 esult [catch {$p
1300: 61 72 73 65 72 20 67 65 74 7d 5d 0a 20 20 20 20 arser get}].
1310: 24 70 61 72 73 65 72 20 66 72 65 65 0a 20 20 20 $parser free.
1320: 20 73 65 74 20 72 65 73 75 6c 74 0a 7d 20 7b 31 set result.} {1
1330: 7d 0a 74 65 73 74 20 70 61 72 73 65 72 2d 31 2e }.test parser-1.
1340: 31 35 20 7b 70 61 72 73 65 72 20 67 65 74 7d 20 15 {parser get}
1350: 7b 0a 20 20 20 20 63 61 74 63 68 20 7b 72 65 6e {. catch {ren
1360: 61 6d 65 20 70 61 72 73 65 72 2d 31 2e 31 35 20 ame parser-1.15
1370: 7b 7d 7d 0a 20 20 20 20 73 65 74 20 70 61 72 73 {}}. set pars
1380: 65 72 20 5b 65 78 70 61 74 20 70 61 72 73 65 72 er [expat parser
1390: 2d 31 2e 31 35 5d 0a 20 20 20 20 73 65 74 20 72 -1.15]. set r
13a0: 65 73 75 6c 74 20 5b 63 61 74 63 68 20 7b 24 70 esult [catch {$p
13b0: 61 72 73 65 72 20 67 65 74 20 66 6f 6f 20 62 61 arser get foo ba
13c0: 72 7d 5d 0a 20 20 20 20 24 70 61 72 73 65 72 20 r}]. $parser
13d0: 66 72 65 65 0a 20 20 20 20 73 65 74 20 72 65 73 free. set res
13e0: 75 6c 74 0a 7d 20 7b 31 7d 0a 74 65 73 74 20 70 ult.} {1}.test p
13f0: 61 72 73 65 72 2d 31 2e 31 36 20 7b 70 61 72 73 arser-1.16 {pars
1400: 65 72 20 67 65 74 7d 20 7b 0a 20 20 20 20 63 61 er get} {. ca
1410: 74 63 68 20 7b 72 65 6e 61 6d 65 20 70 61 72 73 tch {rename pars
1420: 65 72 2d 31 2e 31 36 20 7b 7d 7d 0a 20 20 20 20 er-1.16 {}}.
1430: 73 65 74 20 70 61 72 73 65 72 20 5b 65 78 70 61 set parser [expa
1440: 74 20 70 61 72 73 65 72 2d 31 2e 31 36 5d 0a 20 t parser-1.16].
1450: 20 20 20 73 65 74 20 72 65 73 75 6c 74 20 5b 24 set result [$
1460: 70 61 72 73 65 72 20 67 65 74 20 2d 63 75 72 72 parser get -curr
1470: 65 6e 74 62 79 74 65 63 6f 75 6e 74 5d 0a 20 20 entbytecount].
1480: 20 20 24 70 61 72 73 65 72 20 66 72 65 65 0a 20 $parser free.
1490: 20 20 20 73 65 74 20 72 65 73 75 6c 74 0a 7d 20 set result.}
14a0: 7b 30 7d 0a 0a 74 65 73 74 20 70 61 72 73 65 72 {0}..test parser
14b0: 2d 31 2e 31 37 20 7b 70 61 72 73 65 72 20 64 65 -1.17 {parser de
14c0: 6c 65 74 65 7d 20 7b 0a 20 20 20 20 65 78 70 61 lete} {. expa
14d0: 74 20 70 61 72 73 65 72 2d 31 2e 31 37 0a 20 20 t parser-1.17.
14e0: 20 20 70 61 72 73 65 72 2d 31 2e 31 37 20 64 65 parser-1.17 de
14f0: 6c 65 74 65 0a 7d 20 7b 7d 0a 0a 70 72 6f 63 20 lete.} {}..proc
1500: 63 64 68 2d 31 2e 31 38 20 7b 64 61 74 61 7d 20 cdh-1.18 {data}
1510: 7b 0a 20 20 20 20 69 66 20 7b 5b 73 74 72 69 6e {. if {[strin
1520: 67 20 74 72 69 6d 20 24 64 61 74 61 5d 20 6e 65 g trim $data] ne
1530: 20 22 22 7d 20 7b 0a 20 20 20 20 20 20 20 20 61 ""} {. a
1540: 70 70 65 6e 64 20 3a 3a 72 65 73 75 6c 74 20 22 ppend ::result "
1550: 63 64 68 3a 24 64 61 74 61 22 0a 20 20 20 20 7d cdh:$data". }
1560: 0a 7d 0a 70 72 6f 63 20 64 68 2d 31 2e 31 38 20 .}.proc dh-1.18
1570: 7b 64 61 74 61 7d 20 7b 0a 20 20 20 20 69 66 20 {data} {. if
1580: 7b 5b 73 74 72 69 6e 67 20 74 72 69 6d 20 24 64 {[string trim $d
1590: 61 74 61 5d 20 6e 65 20 22 22 7d 20 7b 0a 20 20 ata] ne ""} {.
15a0: 20 20 20 20 20 20 61 70 70 65 6e 64 20 3a 3a 72 append ::r
15b0: 65 73 75 6c 74 20 22 64 68 3a 24 64 61 74 61 22 esult "dh:$data"
15c0: 0a 20 20 20 20 7d 0a 7d 0a 0a 74 65 73 74 20 70 . }.}..test p
15d0: 61 72 73 65 72 2d 31 2e 31 38 20 7b 70 61 72 73 arser-1.18 {pars
15e0: 65 72 20 6f 70 74 69 6f 6e 20 2d 6e 6f 65 78 70 er option -noexp
15f0: 61 6e 64 7d 20 7b 0a 20 20 20 20 63 61 74 63 68 and} {. catch
1600: 20 7b 72 65 6e 61 6d 65 20 70 61 72 73 65 72 2d {rename parser-
1610: 31 2e 31 38 20 7b 7d 7d 0a 20 20 20 20 73 65 74 1.18 {}}. set
1620: 20 70 61 72 73 65 72 20 5b 65 78 70 61 74 20 70 parser [expat p
1630: 61 72 73 65 72 2d 31 2e 31 38 5d 0a 20 20 20 20 arser-1.18].
1640: 24 70 61 72 73 65 72 20 63 6f 6e 66 69 67 75 72 $parser configur
1650: 65 20 5c 0a 20 20 20 20 20 20 20 20 2d 6e 6f 65 e \. -noe
1660: 78 70 61 6e 64 20 31 20 5c 0a 20 20 20 20 20 20 xpand 1 \.
1670: 20 20 2d 64 65 66 61 75 6c 74 63 6f 6d 6d 61 6e -defaultcomman
1680: 64 20 64 68 2d 31 2e 31 38 20 5c 0a 20 20 20 20 d dh-1.18 \.
1690: 20 20 20 20 2d 63 68 61 72 61 63 74 65 72 64 61 -characterda
16a0: 74 61 63 6f 6d 6d 61 6e 64 20 63 64 68 2d 31 2e tacommand cdh-1.
16b0: 31 38 0a 20 20 20 20 73 65 74 20 72 65 73 75 6c 18. set resul
16c0: 74 20 22 22 0a 20 20 20 20 24 70 61 72 73 65 72 t "". $parser
16d0: 20 70 61 72 73 65 20 7b 3c 21 44 4f 43 54 59 50 parse {<!DOCTYP
16e0: 45 20 78 6d 6c 20 5b 0a 20 20 20 20 20 20 3c 21 E xml [. <!
16f0: 45 4c 45 4d 45 4e 54 20 78 6d 6c 20 28 23 50 43 ELEMENT xml (#PC
1700: 44 41 54 41 29 20 3e 20 20 20 20 20 20 20 20 20 DATA) >
1710: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
1720: 20 20 20 20 20 20 20 20 20 0a 20 20 20 20 20 20 .
1730: 3c 21 45 4e 54 49 54 59 20 78 78 78 20 22 74 68 <!ENTITY xxx "th
1740: 69 73 20 77 61 73 20 74 68 65 20 78 78 78 20 65 is was the xxx e
1750: 6e 74 69 74 79 22 3e 0a 20 20 20 20 20 5d 3e 0a ntity">. ]>.
1760: 20 20 20 20 20 3c 78 6d 6c 3e 66 6f 6f 26 78 78 <xml>foo&xx
1770: 78 3b 62 61 72 3c 2f 78 6d 6c 3e 7d 0a 20 20 20 x;bar</xml>}.
1780: 20 73 65 74 20 72 65 73 75 6c 74 0a 7d 20 7b 63 set result.} {c
1790: 64 68 3a 66 6f 6f 64 68 3a 26 78 78 78 3b 63 64 dh:foodh:&xxx;cd
17a0: 68 3a 62 61 72 7d 0a 0a 74 65 73 74 20 70 61 72 h:bar}..test par
17b0: 73 65 72 2d 31 2e 31 39 20 7b 70 61 72 73 65 72 ser-1.19 {parser
17c0: 20 6f 70 74 69 6f 6e 20 2d 6e 6f 65 78 70 61 6e option -noexpan
17d0: 64 7d 20 7b 0a 20 20 20 20 63 61 74 63 68 20 7b d} {. catch {
17e0: 72 65 6e 61 6d 65 20 70 61 72 73 65 72 2d 31 2e rename parser-1.
17f0: 31 39 20 7b 7d 7d 0a 20 20 20 20 73 65 74 20 70 19 {}}. set p
1800: 61 72 73 65 72 20 5b 65 78 70 61 74 20 70 61 72 arser [expat par
1810: 73 65 72 2d 31 2e 31 39 5d 0a 20 20 20 20 24 70 ser-1.19]. $p
1820: 61 72 73 65 72 20 63 6f 6e 66 69 67 75 72 65 20 arser configure
1830: 5c 0a 20 20 20 20 20 20 20 20 2d 6e 6f 65 78 70 \. -noexp
1840: 61 6e 64 20 30 20 5c 0a 20 20 20 20 20 20 20 20 and 0 \.
1850: 2d 64 65 66 61 75 6c 74 63 6f 6d 6d 61 6e 64 20 -defaultcommand
1860: 64 68 2d 31 2e 31 38 20 5c 0a 20 20 20 20 20 20 dh-1.18 \.
1870: 20 20 2d 63 68 61 72 61 63 74 65 72 64 61 74 61 -characterdata
1880: 63 6f 6d 6d 61 6e 64 20 63 64 68 2d 31 2e 31 38 command cdh-1.18
1890: 0a 20 20 20 20 73 65 74 20 72 65 73 75 6c 74 20 . set result
18a0: 22 22 0a 20 20 20 20 24 70 61 72 73 65 72 20 70 "". $parser p
18b0: 61 72 73 65 20 7b 3c 21 44 4f 43 54 59 50 45 20 arse {<!DOCTYPE
18c0: 78 6d 6c 20 5b 0a 20 20 20 20 20 20 3c 21 45 4c xml [. <!EL
18d0: 45 4d 45 4e 54 20 78 6d 6c 20 28 23 50 43 44 41 EMENT xml (#PCDA
18e0: 54 41 29 20 3e 20 20 20 20 20 20 20 20 20 20 20 TA) >
18f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
1900: 20 20 20 20 20 20 20 0a 20 20 20 20 20 20 3c 21 . <!
1910: 45 4e 54 49 54 59 20 78 78 78 20 22 74 68 69 73 ENTITY xxx "this
1920: 20 77 61 73 20 74 68 65 20 78 78 78 20 65 6e 74 was the xxx ent
1930: 69 74 79 22 3e 0a 20 20 20 20 20 5d 3e 0a 20 20 ity">. ]>.
1940: 20 20 20 3c 78 6d 6c 3e 66 6f 6f 26 78 78 78 3b <xml>foo&xxx;
1950: 62 61 72 3c 2f 78 6d 6c 3e 7d 0a 20 20 20 20 73 bar</xml>}. s
1960: 65 74 20 72 65 73 75 6c 74 0a 7d 20 7b 63 64 68 et result.} {cdh
1970: 3a 66 6f 6f 74 68 69 73 20 77 61 73 20 74 68 65 :foothis was the
1980: 20 78 78 78 20 65 6e 74 69 74 79 62 61 72 7d 0a xxx entitybar}.
1990: 0a 74 65 73 74 20 70 61 72 73 65 72 2d 31 2e 32 .test parser-1.2
19a0: 30 20 7b 70 61 72 73 65 72 20 6f 70 74 69 6f 6e 0 {parser option
19b0: 20 2d 6e 6f 65 78 70 61 6e 64 7d 20 7b 0a 20 20 -noexpand} {.
19c0: 20 20 63 61 74 63 68 20 7b 72 65 6e 61 6d 65 20 catch {rename
19d0: 70 61 72 73 65 72 2d 31 2e 32 30 20 7b 7d 7d 0a parser-1.20 {}}.
19e0: 20 20 20 20 73 65 74 20 70 61 72 73 65 72 20 5b set parser [
19f0: 65 78 70 61 74 20 70 61 72 73 65 72 2d 31 2e 32 expat parser-1.2
1a00: 30 5d 0a 20 20 20 20 24 70 61 72 73 65 72 20 63 0]. $parser c
1a10: 6f 6e 66 69 67 75 72 65 20 5c 0a 20 20 20 20 20 onfigure \.
1a20: 20 20 20 2d 6e 6f 65 78 70 61 6e 64 20 31 20 5c -noexpand 1 \
1a30: 0a 20 20 20 20 20 20 20 20 2d 63 68 61 72 61 63 . -charac
1a40: 74 65 72 64 61 74 61 63 6f 6d 6d 61 6e 64 20 63 terdatacommand c
1a50: 64 68 2d 31 2e 31 38 0a 20 20 20 20 73 65 74 20 dh-1.18. set
1a60: 72 65 73 75 6c 74 20 22 22 0a 20 20 20 20 24 70 result "". $p
1a70: 61 72 73 65 72 20 70 61 72 73 65 20 7b 3c 21 44 arser parse {<!D
1a80: 4f 43 54 59 50 45 20 78 6d 6c 20 5b 0a 20 20 20 OCTYPE xml [.
1a90: 20 20 20 3c 21 45 4c 45 4d 45 4e 54 20 78 6d 6c <!ELEMENT xml
1aa0: 20 28 23 50 43 44 41 54 41 29 20 3e 20 20 20 20 (#PCDATA) >
1ab0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
1ac0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 0a 20 .
1ad0: 20 20 20 20 20 3c 21 45 4e 54 49 54 59 20 78 78 <!ENTITY xx
1ae0: 78 20 22 74 68 69 73 20 77 61 73 20 74 68 65 20 x "this was the
1af0: 78 78 78 20 65 6e 74 69 74 79 22 3e 0a 20 20 20 xxx entity">.
1b00: 20 20 5d 3e 0a 20 20 20 20 20 3c 78 6d 6c 3e 66 ]>. <xml>f
1b10: 6f 6f 26 78 78 78 3b 62 61 72 3c 2f 78 6d 6c 3e oo&xxx;bar</xml>
1b20: 7d 0a 20 20 20 20 73 65 74 20 72 65 73 75 6c 74 }. set result
1b30: 0a 7d 20 7b 63 64 68 3a 66 6f 6f 63 64 68 3a 62 .} {cdh:foocdh:b
1b40: 61 72 7d 0a 0a 74 65 73 74 20 70 61 72 73 65 72 ar}..test parser
1b50: 2d 31 2e 32 31 20 7b 70 61 72 73 65 72 20 6f 70 -1.21 {parser op
1b60: 74 69 6f 6e 20 2d 6e 6f 65 78 70 61 6e 64 7d 20 tion -noexpand}
1b70: 7b 0a 20 20 20 20 63 61 74 63 68 20 7b 72 65 6e {. catch {ren
1b80: 61 6d 65 20 70 61 72 73 65 72 2d 31 2e 32 31 20 ame parser-1.21
1b90: 7b 7d 7d 0a 20 20 20 20 73 65 74 20 70 61 72 73 {}}. set pars
1ba0: 65 72 20 5b 65 78 70 61 74 20 70 61 72 73 65 72 er [expat parser
1bb0: 2d 31 2e 32 31 5d 0a 20 20 20 20 24 70 61 72 73 -1.21]. $pars
1bc0: 65 72 20 63 6f 6e 66 69 67 75 72 65 20 5c 0a 20 er configure \.
1bd0: 20 20 20 20 20 20 20 2d 6e 6f 65 78 70 61 6e 64 -noexpand
1be0: 20 31 20 5c 0a 20 20 20 20 20 20 20 20 2d 64 65 1 \. -de
1bf0: 66 61 75 6c 74 63 6f 6d 6d 61 6e 64 20 64 68 2d faultcommand dh-
1c00: 31 2e 31 38 0a 20 20 20 20 73 65 74 20 72 65 73 1.18. set res
1c10: 75 6c 74 20 22 22 0a 20 20 20 20 24 70 61 72 73 ult "". $pars
1c20: 65 72 20 70 61 72 73 65 20 7b 3c 21 44 4f 43 54 er parse {<!DOCT
1c30: 59 50 45 20 78 6d 6c 20 5b 0a 20 20 20 20 20 20 YPE xml [.
1c40: 3c 21 45 4c 45 4d 45 4e 54 20 78 6d 6c 20 28 23 <!ELEMENT xml (#
1c50: 50 43 44 41 54 41 29 20 3e 20 20 20 20 20 20 20 PCDATA) >
1c60: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
1c70: 20 20 20 20 20 20 20 20 20 20 20 0a 20 20 20 20 .
1c80: 20 20 3c 21 45 4e 54 49 54 59 20 78 78 78 20 22 <!ENTITY xxx "
1c90: 74 68 69 73 20 77 61 73 20 74 68 65 20 78 78 78 this was the xxx
1ca0: 20 65 6e 74 69 74 79 22 3e 0a 20 20 20 20 20 5d entity">. ]
1cb0: 3e 0a 20 20 20 20 20 3c 78 6d 6c 3e 66 6f 6f 26 >. <xml>foo&
1cc0: 78 78 78 3b 62 61 72 3c 2f 78 6d 6c 3e 7d 0a 20 xxx;bar</xml>}.
1cd0: 20 20 20 73 65 74 20 72 65 73 75 6c 74 0a 7d 20 set result.}
1ce0: 7b 64 68 3a 26 78 78 78 3b 7d 0a 0a 74 65 73 74 {dh:&xxx;}..test
1cf0: 20 70 61 72 73 65 72 2d 31 2e 32 32 20 7b 70 61 parser-1.22 {pa
1d00: 72 73 65 72 20 6f 70 74 69 6f 6e 20 2d 6e 6f 65 rser option -noe
1d10: 78 70 61 6e 64 7d 20 7b 0a 20 20 20 20 63 61 74 xpand} {. cat
1d20: 63 68 20 7b 72 65 6e 61 6d 65 20 70 61 72 73 65 ch {rename parse
1d30: 72 2d 31 2e 32 32 20 7b 7d 7d 0a 20 20 20 20 73 r-1.22 {}}. s
1d40: 65 74 20 70 61 72 73 65 72 20 5b 65 78 70 61 74 et parser [expat
1d50: 20 70 61 72 73 65 72 2d 31 2e 31 38 5d 0a 20 20 parser-1.18].
1d60: 20 20 24 70 61 72 73 65 72 20 63 6f 6e 66 69 67 $parser config
1d70: 75 72 65 20 5c 0a 20 20 20 20 20 20 20 20 2d 6e ure \. -n
1d80: 6f 65 78 70 61 6e 64 20 31 20 5c 0a 20 20 20 20 oexpand 1 \.
1d90: 20 20 20 20 2d 64 65 66 61 75 6c 74 63 6f 6d 6d -defaultcomm
1da0: 61 6e 64 20 64 68 2d 31 2e 31 38 0a 20 20 20 20 and dh-1.18.
1db0: 73 65 74 20 72 65 73 75 6c 74 20 22 22 0a 20 20 set result "".
1dc0: 20 20 24 70 61 72 73 65 72 20 70 61 72 73 65 20 $parser parse
1dd0: 7b 3c 21 44 4f 43 54 59 50 45 20 78 6d 6c 20 5b {<!DOCTYPE xml [
1de0: 0a 20 20 20 20 20 20 3c 21 45 4c 45 4d 45 4e 54 . <!ELEMENT
1df0: 20 78 6d 6c 20 28 23 50 43 44 41 54 41 29 20 3e xml (#PCDATA) >
1e00: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
1e10: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
1e20: 20 20 0a 20 20 20 20 20 20 3c 21 45 4e 54 49 54 . <!ENTIT
1e30: 59 20 78 78 78 20 22 74 68 69 73 20 77 61 73 20 Y xxx "this was
1e40: 74 68 65 20 78 78 78 20 65 6e 74 69 74 79 22 3e the xxx entity">
1e50: 0a 20 20 20 20 20 5d 3e 0a 20 20 20 20 20 3c 78 . ]>. <x
1e60: 6d 6c 3e 66 6f 6f 26 78 78 78 3b 62 61 72 3c 2f ml>foo&xxx;bar</
1e70: 78 6d 6c 3e 7d 0a 20 20 20 20 73 65 74 20 72 65 xml>}. set re
1e80: 73 75 6c 74 0a 7d 20 7b 64 68 3a 26 78 78 78 3b sult.} {dh:&xxx;
1e90: 7d 0a 0a 74 65 73 74 20 70 61 72 73 65 72 2d 31 }..test parser-1
1ea0: 2e 32 33 20 7b 55 6e 6b 6e 6f 77 6e 20 6f 70 74 .23 {Unknown opt
1eb0: 69 6f 6e 20 66 6c 61 67 7d 20 7b 0a 20 20 20 20 ion flag} {.
1ec0: 63 61 74 63 68 20 7b 72 65 6e 61 6d 65 20 78 6d catch {rename xm
1ed0: 6c 3a 3a 70 61 72 73 65 72 2d 31 2e 32 33 20 7b l::parser-1.23 {
1ee0: 7d 7d 0a 20 20 20 20 63 61 74 63 68 20 7b 0a 20 }}. catch {.
1ef0: 20 20 20 20 20 20 20 73 65 74 20 70 61 72 73 65 set parse
1f00: 72 20 5b 78 6d 6c 3a 3a 70 61 72 73 65 72 20 70 r [xml::parser p
1f10: 61 72 73 65 72 2d 31 2e 32 33 20 5c 0a 20 20 20 arser-1.23 \.
1f20: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
1f30: 20 20 20 20 20 2d 65 6c 65 6d 65 6e 74 73 74 61 -elementsta
1f40: 72 74 63 6f 6d 6d 61 6e 64 20 45 53 74 61 72 74 rtcommand EStart
1f50: 20 5c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 \.
1f60: 20 20 20 20 20 20 20 20 20 20 20 2d 62 6f 6f 5d -boo]
1f70: 0a 20 20 20 20 7d 0a 7d 20 31 0a 0a 74 65 73 74 . }.} 1..test
1f80: 20 70 61 72 73 65 72 2d 31 2e 32 34 20 7b 4d 69 parser-1.24 {Mi
1f90: 73 73 69 6e 67 20 6f 70 74 69 6f 6e 20 61 72 67 ssing option arg
1fa0: 75 6d 65 6e 74 7d 20 7b 0a 20 20 20 20 63 61 74 ument} {. cat
1fb0: 63 68 20 7b 72 65 6e 61 6d 65 20 78 6d 6c 3a 3a ch {rename xml::
1fc0: 70 61 72 73 65 72 2d 31 2e 32 34 20 7b 7d 7d 0a parser-1.24 {}}.
1fd0: 20 20 20 20 63 61 74 63 68 20 7b 0a 20 20 20 20 catch {.
1fe0: 20 20 20 20 73 65 74 20 70 61 72 73 65 72 20 5b set parser [
1ff0: 78 6d 6c 3a 3a 70 61 72 73 65 72 20 70 61 72 73 xml::parser pars
2000: 65 72 2d 31 2e 32 33 20 5c 0a 20 20 20 20 20 20 er-1.23 \.
2010: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
2020: 20 20 2d 65 6c 65 6d 65 6e 74 73 74 61 72 74 63 -elementstartc
2030: 6f 6d 6d 61 6e 64 5d 0a 20 20 20 20 20 20 20 20 ommand].
2040: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
2050: 0a 20 20 20 20 7d 0a 7d 20 31 0a 0a 23 20 54 65 . }.} 1..# Te
2060: 73 74 20 62 72 65 61 6b 20 72 65 74 75 72 6e 20 st break return
2070: 63 6f 64 65 20 66 72 6f 6d 20 63 61 6c 6c 62 61 code from callba
2080: 63 6b 0a 0a 74 65 73 74 20 70 61 72 73 65 72 2d ck..test parser-
2090: 32 2e 31 20 7b 62 72 65 61 6b 20 69 6e 20 63 61 2.1 {break in ca
20a0: 6c 6c 62 61 63 6b 7d 20 7b 0a 20 20 20 20 63 61 llback} {. ca
20b0: 74 63 68 20 7b 75 6e 73 65 74 20 3a 3a 73 74 61 tch {unset ::sta
20c0: 72 74 65 64 7d 0a 0a 20 20 20 20 63 61 74 63 68 rted}.. catch
20d0: 20 7b 72 65 6e 61 6d 65 20 70 61 72 73 65 72 2d {rename parser-
20e0: 32 2e 31 20 7b 7d 7d 0a 20 20 20 20 73 65 74 20 2.1 {}}. set
20f0: 70 20 5b 3a 3a 78 6d 6c 3a 3a 70 61 72 73 65 72 p [::xml::parser
2100: 20 70 61 72 73 65 72 2d 32 2e 31 20 2d 65 6c 65 parser-2.1 -ele
2110: 6d 65 6e 74 73 74 61 72 74 63 6f 6d 6d 61 6e 64 mentstartcommand
2120: 20 53 74 61 72 74 5d 0a 20 20 20 20 24 70 20 70 Start]. $p p
2130: 61 72 73 65 20 7b 3c 3f 78 6d 6c 20 76 65 72 73 arse {<?xml vers
2140: 69 6f 6e 3d 22 31 2e 30 22 3f 3e 0a 3c 54 65 73 ion="1.0"?>.<Tes
2150: 74 3e 0a 3c 45 6c 65 6d 65 6e 74 20 69 64 3d 22 t>.<Element id="
2160: 65 6c 31 22 3e 53 68 6f 75 6c 64 20 73 65 65 20 el1">Should see
2170: 74 68 69 73 20 64 61 74 61 3c 2f 45 6c 65 6d 65 this data</Eleme
2180: 6e 74 3e 0a 3c 45 6c 65 6d 65 6e 74 20 63 6c 61 nt>.<Element cla
2190: 73 73 3d 22 62 72 65 61 6b 22 20 69 64 3d 22 65 ss="break" id="e
21a0: 6c 32 22 3e 53 68 6f 75 6c 64 20 6e 6f 74 20 73 l2">Should not s
21b0: 65 65 20 74 68 69 73 20 64 61 74 61 3c 45 6c 65 ee this data<Ele
21c0: 6d 65 6e 74 20 69 64 3d 22 65 6c 33 22 2f 3e 3c ment id="el3"/><
21d0: 2f 45 6c 65 6d 65 6e 74 3e 0a 3c 45 6c 65 6d 65 /Element>.<Eleme
21e0: 6e 74 20 69 64 3d 27 65 6c 34 27 3e 53 68 6f 75 nt id='el4'>Shou
21f0: 6c 64 20 6e 6f 74 20 73 65 65 20 74 68 69 73 20 ld not see this
2200: 64 61 74 61 3c 2f 45 6c 65 6d 65 6e 74 3e 0a 3c data</Element>.<
2210: 2f 54 65 73 74 3e 0a 7d 0a 20 20 20 20 73 65 74 /Test>.}. set
2220: 20 3a 3a 73 74 61 72 74 65 64 28 45 6c 65 6d 65 ::started(Eleme
2230: 6e 74 29 0a 7d 20 32 0a 0a 74 65 73 74 20 70 61 nt).} 2..test pa
2240: 72 73 65 72 2d 32 2e 32 20 7b 62 72 65 61 6b 20 rser-2.2 {break
2250: 69 6e 20 63 61 6c 6c 62 61 63 6b 7d 20 7b 0a 20 in callback} {.
2260: 20 20 20 63 61 74 63 68 20 7b 75 6e 73 65 74 20 catch {unset
2270: 3a 3a 73 74 61 72 74 65 64 7d 0a 0a 20 20 20 20 ::started}..
2280: 63 61 74 63 68 20 7b 72 65 6e 61 6d 65 20 70 61 catch {rename pa
2290: 72 73 65 72 2d 32 2e 32 20 7b 7d 7d 0a 20 20 20 rser-2.2 {}}.
22a0: 20 73 65 74 20 70 20 5b 3a 3a 78 6d 6c 3a 3a 70 set p [::xml::p
22b0: 61 72 73 65 72 20 70 61 72 73 65 72 2d 32 2e 32 arser parser-2.2
22c0: 20 2d 65 6c 65 6d 65 6e 74 73 74 61 72 74 63 6f -elementstartco
22d0: 6d 6d 61 6e 64 20 53 74 61 72 74 5d 0a 20 20 20 mmand Start].
22e0: 20 24 70 20 70 61 72 73 65 20 7b 3c 3f 78 6d 6c $p parse {<?xml
22f0: 20 76 65 72 73 69 6f 6e 3d 22 31 2e 30 22 3f 3e version="1.0"?>
2300: 0a 3c 54 65 73 74 3e 0a 3c 45 6c 65 6d 65 6e 74 .<Test>.<Element
2310: 3e 53 68 6f 75 6c 64 20 73 65 65 20 74 68 69 73 >Should see this
2320: 20 64 61 74 61 3c 2f 45 6c 65 6d 65 6e 74 3e 0a data</Element>.
2330: 3c 45 6c 65 6d 65 6e 74 3e 53 68 6f 75 6c 64 20 <Element>Should
2340: 73 65 65 20 74 68 69 73 20 64 61 74 61 3c 45 6c see this data<El
2350: 65 6d 65 6e 74 20 63 6c 61 73 73 3d 22 62 72 65 ement class="bre
2360: 61 6b 22 2f 3e 3c 2f 45 6c 65 6d 65 6e 74 3e 0a ak"/></Element>.
2370: 3c 45 6c 65 6d 65 6e 74 3e 53 68 6f 75 6c 64 20 <Element>Should
2380: 6e 6f 74 20 73 65 65 20 74 68 69 73 20 64 61 74 not see this dat
2390: 61 3c 2f 45 6c 65 6d 65 6e 74 3e 0a 3c 2f 54 65 a</Element>.</Te
23a0: 73 74 3e 0a 7d 0a 20 20 20 20 73 65 74 20 3a 3a st>.}. set ::
23b0: 73 74 61 72 74 65 64 28 45 6c 65 6d 65 6e 74 29 started(Element)
23c0: 0a 7d 20 33 0a 0a 74 65 73 74 20 70 61 72 73 65 .} 3..test parse
23d0: 72 2d 32 2e 33 20 7b 62 72 65 61 6b 20 69 6e 20 r-2.3 {break in
23e0: 63 61 6c 6c 62 61 63 6b 7d 20 7b 0a 20 20 20 20 callback} {.
23f0: 63 61 74 63 68 20 7b 75 6e 73 65 74 20 3a 3a 73 catch {unset ::s
2400: 74 61 72 74 65 64 7d 0a 0a 20 20 20 20 63 61 74 tarted}.. cat
2410: 63 68 20 7b 72 65 6e 61 6d 65 20 70 61 72 73 65 ch {rename parse
2420: 72 2d 32 2e 33 20 7b 7d 7d 0a 20 20 20 20 73 65 r-2.3 {}}. se
2430: 74 20 70 20 5b 3a 3a 78 6d 6c 3a 3a 70 61 72 73 t p [::xml::pars
2440: 65 72 20 70 61 72 73 65 72 2d 32 2e 33 20 2d 65 er parser-2.3 -e
2450: 6c 65 6d 65 6e 74 73 74 61 72 74 63 6f 6d 6d 61 lementstartcomma
2460: 6e 64 20 53 74 61 72 74 5d 0a 20 20 20 20 24 70 nd Start]. $p
2470: 20 70 61 72 73 65 20 7b 3c 3f 78 6d 6c 20 76 65 parse {<?xml ve
2480: 72 73 69 6f 6e 3d 22 31 2e 30 22 3f 3e 0a 3c 54 rsion="1.0"?>.<T
2490: 65 73 74 3e 0a 3c 45 6c 65 6d 65 6e 74 3e 53 68 est>.<Element>Sh
24a0: 6f 75 6c 64 20 73 65 65 20 74 68 69 73 20 64 61 ould see this da
24b0: 74 61 3c 2f 45 6c 65 6d 65 6e 74 3e 0a 3c 45 6c ta</Element>.<El
24c0: 65 6d 65 6e 74 3e 53 68 6f 75 6c 64 20 73 65 65 ement>Should see
24d0: 20 74 68 69 73 20 64 61 74 61 0a 20 20 3c 3f 62 this data. <?b
24e0: 72 65 61 6b 3f 3e 0a 3c 2f 45 6c 65 6d 65 6e 74 reak?>.</Element
24f0: 3e 0a 3c 45 6c 65 6d 65 6e 74 3e 53 68 6f 75 6c >.<Element>Shoul
2500: 64 20 6e 6f 74 20 73 65 65 20 74 68 69 73 20 64 d not see this d
2510: 61 74 61 3c 2f 45 6c 65 6d 65 6e 74 3e 0a 3c 2f ata</Element>.</
2520: 54 65 73 74 3e 0a 7d 0a 20 20 20 20 73 65 74 20 Test>.}. set
2530: 3a 3a 73 74 61 72 74 65 64 28 45 6c 65 6d 65 6e ::started(Elemen
2540: 74 29 0a 7d 20 33 0a 0a 74 65 73 74 20 70 61 72 t).} 3..test par
2550: 73 65 72 2d 33 2e 31 20 7b 63 6f 6e 74 69 6e 75 ser-3.1 {continu
2560: 65 20 69 6e 20 63 61 6c 6c 62 61 63 6b 7d 20 7b e in callback} {
2570: 0a 20 20 20 20 63 61 74 63 68 20 7b 75 6e 73 65 . catch {unse
2580: 74 20 3a 3a 73 74 61 72 74 65 64 7d 0a 0a 20 20 t ::started}..
2590: 20 20 63 61 74 63 68 20 7b 72 65 6e 61 6d 65 20 catch {rename
25a0: 70 61 72 73 65 72 2d 33 2e 31 20 7b 7d 7d 0a 20 parser-3.1 {}}.
25b0: 20 20 20 73 65 74 20 70 20 5b 3a 3a 78 6d 6c 3a set p [::xml:
25c0: 3a 70 61 72 73 65 72 20 70 61 72 73 65 72 2d 33 :parser parser-3
25d0: 2e 31 20 2d 65 6c 65 6d 65 6e 74 73 74 61 72 74 .1 -elementstart
25e0: 63 6f 6d 6d 61 6e 64 20 53 74 61 72 74 5d 0a 20 command Start].
25f0: 20 20 20 24 70 20 70 61 72 73 65 20 7b 3c 3f 78 $p parse {<?x
2600: 6d 6c 20 76 65 72 73 69 6f 6e 3d 22 31 2e 30 22 ml version="1.0"
2610: 3f 3e 0a 3c 54 65 73 74 3e 0a 3c 45 6c 65 6d 65 ?>.<Test>.<Eleme
2620: 6e 74 20 69 64 3d 27 65 6c 31 27 3e 53 68 6f 75 nt id='el1'>Shou
2630: 6c 64 20 73 65 65 20 74 68 69 73 20 64 61 74 61 ld see this data
2640: 3c 2f 45 6c 65 6d 65 6e 74 3e 0a 3c 45 6c 65 6d </Element>.<Elem
2650: 65 6e 74 20 63 6c 61 73 73 3d 22 63 6f 6e 74 69 ent class="conti
2660: 6e 75 65 22 20 69 64 3d 27 65 6c 32 27 3e 53 68 nue" id='el2'>Sh
2670: 6f 75 6c 64 20 6e 6f 74 20 73 65 65 20 74 68 69 ould not see thi
2680: 73 20 64 61 74 61 0a 20 20 3c 45 6c 65 6d 65 6e s data. <Elemen
2690: 74 20 69 64 3d 27 65 6c 33 27 2f 3e 0a 3c 2f 45 t id='el3'/>.</E
26a0: 6c 65 6d 65 6e 74 3e 0a 3c 45 6c 65 6d 65 6e 74 lement>.<Element
26b0: 20 69 64 3d 27 65 6c 34 27 3e 53 68 6f 75 6c 64 id='el4'>Should
26c0: 20 73 65 65 20 74 68 69 73 20 64 61 74 61 3c 2f see this data</
26d0: 45 6c 65 6d 65 6e 74 3e 0a 3c 2f 54 65 73 74 3e Element>.</Test>
26e0: 0a 7d 0a 20 20 20 20 73 65 74 20 3a 3a 73 74 61 .}. set ::sta
26f0: 72 74 65 64 28 45 6c 65 6d 65 6e 74 29 0a 7d 20 rted(Element).}
2700: 33 0a 0a 74 65 73 74 20 70 61 72 73 65 72 2d 33 3..test parser-3
2710: 2e 32 20 7b 63 6f 6e 74 69 6e 75 65 20 69 6e 20 .2 {continue in
2720: 63 61 6c 6c 62 61 63 6b 7d 20 7b 0a 20 20 20 20 callback} {.
2730: 63 61 74 63 68 20 7b 75 6e 73 65 74 20 3a 3a 73 catch {unset ::s
2740: 74 61 72 74 65 64 7d 0a 0a 20 20 20 20 63 61 74 tarted}.. cat
2750: 63 68 20 7b 72 65 6e 61 6d 65 20 70 61 72 73 65 ch {rename parse
2760: 72 2d 33 2e 32 20 7b 7d 7d 0a 20 20 20 20 73 65 r-3.2 {}}. se
2770: 74 20 70 20 5b 3a 3a 78 6d 6c 3a 3a 70 61 72 73 t p [::xml::pars
2780: 65 72 20 70 61 72 73 65 72 2d 33 2e 32 20 2d 65 er parser-3.2 -e
2790: 6c 65 6d 65 6e 74 73 74 61 72 74 63 6f 6d 6d 61 lementstartcomma
27a0: 6e 64 20 53 74 61 72 74 5d 0a 20 20 20 20 24 70 nd Start]. $p
27b0: 20 70 61 72 73 65 20 7b 3c 3f 78 6d 6c 20 76 65 parse {<?xml ve
27c0: 72 73 69 6f 6e 3d 22 31 2e 30 22 3f 3e 0a 3c 54 rsion="1.0"?>.<T
27d0: 65 73 74 3e 0a 3c 45 6c 65 6d 65 6e 74 3e 53 68 est>.<Element>Sh
27e0: 6f 75 6c 64 20 73 65 65 20 74 68 69 73 20 64 61 ould see this da
27f0: 74 61 3c 2f 45 6c 65 6d 65 6e 74 3e 0a 3c 45 6c ta</Element>.<El
2800: 65 6d 65 6e 74 3e 53 68 6f 75 6c 64 20 73 65 65 ement>Should see
2810: 20 74 68 69 73 20 64 61 74 61 0a 20 20 3c 45 6c this data. <El
2820: 65 6d 65 6e 74 20 63 6c 61 73 73 3d 22 63 6f 6e ement class="con
2830: 74 69 6e 75 65 22 3e 0a 20 20 20 20 53 68 6f 75 tinue">. Shou
2840: 6c 64 20 6e 6f 74 20 73 65 65 20 74 68 69 73 20 ld not see this
2850: 64 61 74 61 0a 20 20 20 20 3c 45 6c 65 6d 65 6e data. <Elemen
2860: 74 2f 3e 0a 20 20 3c 2f 45 6c 65 6d 65 6e 74 3e t/>. </Element>
2870: 0a 20 20 53 68 6f 75 6c 64 20 73 65 65 20 74 68 . Should see th
2880: 69 73 20 64 61 74 61 0a 20 20 3c 45 6c 65 6d 65 is data. <Eleme
2890: 6e 74 2f 3e 0a 3c 2f 45 6c 65 6d 65 6e 74 3e 0a nt/>.</Element>.
28a0: 3c 45 6c 65 6d 65 6e 74 3e 53 68 6f 75 6c 64 20 <Element>Should
28b0: 73 65 65 20 74 68 69 73 20 64 61 74 61 3c 2f 45 see this data</E
28c0: 6c 65 6d 65 6e 74 3e 0a 3c 2f 54 65 73 74 3e 0a lement>.</Test>.
28d0: 7d 0a 20 20 20 20 73 65 74 20 3a 3a 73 74 61 72 }. set ::star
28e0: 74 65 64 28 45 6c 65 6d 65 6e 74 29 0a 7d 20 35 ted(Element).} 5
28f0: 0a 0a 74 65 73 74 20 70 61 72 73 65 72 2d 33 2e ..test parser-3.
2900: 33 20 7b 63 6f 6e 74 69 6e 75 65 20 69 6e 20 63 3 {continue in c
2910: 61 6c 6c 62 61 63 6b 7d 20 7b 0a 20 20 20 20 63 allback} {. c
2920: 61 74 63 68 20 7b 75 6e 73 65 74 20 3a 3a 73 74 atch {unset ::st
2930: 61 72 74 65 64 7d 0a 0a 20 20 20 20 63 61 74 63 arted}.. catc
2940: 68 20 7b 72 65 6e 61 6d 65 20 70 61 72 73 65 72 h {rename parser
2950: 2d 33 2e 33 20 7b 7d 7d 0a 20 20 20 20 73 65 74 -3.3 {}}. set
2960: 20 70 20 5b 3a 3a 78 6d 6c 3a 3a 70 61 72 73 65 p [::xml::parse
2970: 72 20 70 61 72 73 65 72 2d 33 2e 33 20 2d 65 6c r parser-3.3 -el
2980: 65 6d 65 6e 74 73 74 61 72 74 63 6f 6d 6d 61 6e ementstartcomman
2990: 64 20 53 74 61 72 74 5d 0a 20 20 20 20 24 70 20 d Start]. $p
29a0: 70 61 72 73 65 20 7b 3c 3f 78 6d 6c 20 76 65 72 parse {<?xml ver
29b0: 73 69 6f 6e 3d 22 31 2e 30 22 3f 3e 0a 3c 54 65 sion="1.0"?>.<Te
29c0: 73 74 3e 0a 3c 45 6c 65 6d 65 6e 74 3e 53 68 6f st>.<Element>Sho
29d0: 75 6c 64 20 73 65 65 20 74 68 69 73 20 64 61 74 uld see this dat
29e0: 61 3c 2f 45 6c 65 6d 65 6e 74 3e 0a 3c 45 6c 65 a</Element>.<Ele
29f0: 6d 65 6e 74 3e 53 68 6f 75 6c 64 20 73 65 65 20 ment>Should see
2a00: 74 68 69 73 20 64 61 74 61 0a 20 20 3c 45 6c 65 this data. <Ele
2a10: 6d 65 6e 74 20 63 6c 61 73 73 3d 22 63 6f 6e 74 ment class="cont
2a20: 69 6e 75 65 22 3e 0a 20 20 20 20 53 68 6f 75 6c inue">. Shoul
2a30: 64 20 6e 6f 74 20 73 65 65 20 74 68 69 73 20 64 d not see this d
2a40: 61 74 61 0a 20 20 20 20 3c 45 6c 65 6d 65 6e 74 ata. <Element
2a50: 20 63 6c 61 73 73 3d 22 62 72 65 61 6b 22 2f 3e class="break"/>
2a60: 0a 20 20 20 20 62 72 65 61 6b 20 77 69 6c 6c 20 . break will
2a70: 68 61 76 65 20 6e 6f 20 65 66 66 65 63 74 0a 20 have no effect.
2a80: 20 3c 2f 45 6c 65 6d 65 6e 74 3e 0a 20 20 53 68 </Element>. Sh
2a90: 6f 75 6c 64 20 73 65 65 20 74 68 69 73 20 64 61 ould see this da
2aa0: 74 61 0a 20 20 3c 45 6c 65 6d 65 6e 74 2f 3e 0a ta. <Element/>.
2ab0: 3c 2f 45 6c 65 6d 65 6e 74 3e 0a 3c 45 6c 65 6d </Element>.<Elem
2ac0: 65 6e 74 3e 53 68 6f 75 6c 64 20 73 65 65 20 74 ent>Should see t
2ad0: 68 69 73 20 64 61 74 61 3c 2f 45 6c 65 6d 65 6e his data</Elemen
2ae0: 74 3e 0a 3c 2f 54 65 73 74 3e 0a 7d 0a 20 20 20 t>.</Test>.}.
2af0: 20 73 65 74 20 3a 3a 73 74 61 72 74 65 64 28 45 set ::started(E
2b00: 6c 65 6d 65 6e 74 29 0a 7d 20 35 0a 0a 70 72 6f lement).} 5..pro
2b10: 63 20 65 73 68 2d 33 2e 34 20 7b 6e 61 6d 65 20 c esh-3.4 {name
2b20: 61 74 74 4c 69 73 74 7d 20 7b 0a 20 20 20 20 69 attList} {. i
2b30: 6e 63 72 20 3a 3a 65 73 68 63 6f 75 6e 74 65 72 ncr ::eshcounter
2b40: 0a 20 20 20 20 72 65 74 75 72 6e 20 2d 63 6f 64 . return -cod
2b50: 65 20 63 6f 6e 74 69 6e 75 65 0a 7d 0a 0a 70 72 e continue.}..pr
2b60: 6f 63 20 65 65 68 2d 33 2e 34 20 7b 6e 61 6d 65 oc eeh-3.4 {name
2b70: 7d 20 7b 0a 20 20 20 20 69 6e 63 72 20 3a 3a 65 } {. incr ::e
2b80: 65 68 63 6f 75 6e 74 65 72 0a 7d 0a 0a 70 72 6f ehcounter.}..pro
2b90: 63 20 63 64 68 2d 33 2e 34 20 7b 64 61 74 61 7d c cdh-3.4 {data}
2ba0: 20 7b 0a 20 20 20 20 69 6e 63 72 20 3a 3a 63 64 {. incr ::cd
2bb0: 68 63 6f 75 6e 74 65 72 0a 7d 0a 0a 74 65 73 74 hcounter.}..test
2bc0: 20 70 61 72 73 65 72 2d 33 2e 34 20 7b 63 6f 6e parser-3.4 {con
2bd0: 74 69 6e 75 65 7d 20 7b 0a 20 20 20 20 73 65 74 tinue} {. set
2be0: 20 3a 3a 65 73 68 63 6f 75 6e 74 65 72 20 30 0a ::eshcounter 0.
2bf0: 20 20 20 20 73 65 74 20 3a 3a 65 65 68 63 6f 75 set ::eehcou
2c00: 6e 74 65 72 20 30 0a 20 20 20 20 73 65 74 20 3a nter 0. set :
2c10: 3a 63 64 68 63 6f 75 6e 74 65 72 20 30 0a 20 20 :cdhcounter 0.
2c20: 20 20 73 65 74 20 70 20 5b 65 78 70 61 74 20 2d set p [expat -
2c30: 65 6c 65 6d 65 6e 74 73 74 61 72 74 63 6f 6d 6d elementstartcomm
2c40: 61 6e 64 20 65 73 68 2d 33 2e 34 20 2d 65 6c 65 and esh-3.4 -ele
2c50: 6d 65 6e 74 65 6e 64 63 6f 6d 6d 61 6e 64 20 65 mentendcommand e
2c60: 65 68 2d 33 2e 34 20 5c 0a 20 20 20 20 20 20 20 eh-3.4 \.
2c70: 20 20 20 20 20 20 20 2d 63 68 61 72 61 63 74 65 -characte
2c80: 72 64 61 74 61 63 6f 6d 6d 61 6e 64 20 63 68 64 rdatacommand chd
2c90: 2d 33 2e 34 5d 0a 20 20 20 20 24 70 20 70 61 72 -3.4]. $p par
2ca0: 73 65 20 7b 3c 72 6f 6f 74 3e 3c 61 2f 3e 66 6f se {<root><a/>fo
2cb0: 6f 3c 61 3e 66 6f 6f 3c 62 3e 3c 63 2f 3e 66 6f o<a>foo<b><c/>fo
2cc0: 6f 3c 2f 62 3e 3c 2f 61 3e 3c 2f 72 6f 6f 74 3e o</b></a></root>
2cd0: 7d 0a 20 20 20 20 24 70 20 66 72 65 65 0a 20 20 }. $p free.
2ce0: 20 20 6c 69 73 74 20 24 3a 3a 65 73 68 63 6f 75 list $::eshcou
2cf0: 6e 74 65 72 20 24 3a 3a 65 65 68 63 6f 75 6e 74 nter $::eehcount
2d00: 65 72 20 24 3a 3a 63 64 68 63 6f 75 6e 74 65 72 er $::cdhcounter
2d10: 0a 7d 20 7b 31 20 31 20 30 7d 0a 0a 70 72 6f 63 .} {1 1 0}..proc
2d20: 20 65 73 68 2d 33 2e 35 20 7b 6e 61 6d 65 20 61 esh-3.5 {name a
2d30: 74 74 4c 69 73 74 7d 20 7b 0a 20 20 20 20 69 6e ttList} {. in
2d40: 63 72 20 3a 3a 65 73 68 63 6f 75 6e 74 65 72 32 cr ::eshcounter2
2d50: 0a 7d 0a 0a 70 72 6f 63 20 65 65 68 2d 33 2e 35 .}..proc eeh-3.5
2d60: 20 7b 6e 61 6d 65 7d 20 7b 0a 20 20 20 20 69 6e {name} {. in
2d70: 63 72 20 3a 3a 65 65 68 63 6f 75 6e 74 65 72 32 cr ::eehcounter2
2d80: 0a 7d 0a 0a 70 72 6f 63 20 63 64 68 2d 33 2e 35 .}..proc cdh-3.5
2d90: 20 7b 64 61 74 61 7d 20 7b 0a 20 20 20 20 69 6e {data} {. in
2da0: 63 72 20 3a 3a 63 64 68 63 6f 75 6e 74 65 72 32 cr ::cdhcounter2
2db0: 0a 7d 0a 0a 74 65 73 74 20 70 61 72 73 65 72 2d .}..test parser-
2dc0: 33 2e 35 20 7b 63 6f 6e 74 69 6e 75 65 20 77 69 3.5 {continue wi
2dd0: 74 68 20 6d 6f 72 65 20 74 68 61 6e 20 6f 6e 65 th more than one
2de0: 20 68 61 6e 64 6c 65 72 73 65 74 7d 20 7b 0a 20 handlerset} {.
2df0: 20 20 20 73 65 74 20 3a 3a 65 73 68 63 6f 75 6e set ::eshcoun
2e00: 74 65 72 20 30 0a 20 20 20 20 73 65 74 20 3a 3a ter 0. set ::
2e10: 65 65 68 63 6f 75 6e 74 65 72 20 30 0a 20 20 20 eehcounter 0.
2e20: 20 73 65 74 20 3a 3a 63 64 68 63 6f 75 6e 74 65 set ::cdhcounte
2e30: 72 20 30 0a 20 20 20 20 73 65 74 20 3a 3a 65 73 r 0. set ::es
2e40: 68 63 6f 75 6e 74 65 72 32 20 30 0a 20 20 20 20 hcounter2 0.
2e50: 73 65 74 20 3a 3a 65 65 68 63 6f 75 6e 74 65 72 set ::eehcounter
2e60: 32 20 30 0a 20 20 20 20 73 65 74 20 3a 3a 63 64 2 0. set ::cd
2e70: 68 63 6f 75 6e 74 65 72 32 20 30 0a 20 20 20 20 hcounter2 0.
2e80: 73 65 74 20 70 20 5b 65 78 70 61 74 20 2d 65 6c set p [expat -el
2e90: 65 6d 65 6e 74 73 74 61 72 74 63 6f 6d 6d 61 6e ementstartcomman
2ea0: 64 20 65 73 68 2d 33 2e 34 20 2d 65 6c 65 6d 65 d esh-3.4 -eleme
2eb0: 6e 74 65 6e 64 63 6f 6d 6d 61 6e 64 20 65 65 68 ntendcommand eeh
2ec0: 2d 33 2e 34 20 5c 0a 20 20 20 20 20 20 20 20 20 -3.4 \.
2ed0: 20 20 20 20 20 2d 63 68 61 72 61 63 74 65 72 64 -characterd
2ee0: 61 74 61 63 6f 6d 6d 61 6e 64 20 63 68 64 2d 33 atacommand chd-3
2ef0: 2e 34 20 2d 68 61 6e 64 6c 65 72 73 65 74 20 73 .4 -handlerset s
2f00: 65 63 6f 6e 64 20 5c 0a 20 20 20 20 20 20 20 20 econd \.
2f10: 20 20 20 20 20 20 2d 65 6c 65 6d 65 6e 74 73 74 -elementst
2f20: 61 72 74 63 6f 6d 6d 61 6e 64 20 65 73 68 2d 33 artcommand esh-3
2f30: 2e 35 20 2d 65 6c 65 6d 65 6e 74 65 6e 64 63 6f .5 -elementendco
2f40: 6d 6d 61 6e 64 20 65 65 68 2d 33 2e 35 20 5c 0a mmand eeh-3.5 \.
2f50: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2d 63 -c
2f60: 68 61 72 61 63 74 65 72 64 61 74 61 63 6f 6d 6d haracterdatacomm
2f70: 61 6e 64 20 63 64 68 2d 33 2e 35 5d 0a 20 20 20 and cdh-3.5].
2f80: 20 24 70 20 70 61 72 73 65 20 7b 3c 72 6f 6f 74 $p parse {<root
2f90: 3e 3c 61 2f 3e 66 6f 6f 3c 61 3e 66 6f 6f 3c 62 ><a/>foo<a>foo<b
2fa0: 3e 3c 63 2f 3e 66 6f 6f 3c 2f 62 3e 3c 2f 61 3e ><c/>foo</b></a>
2fb0: 3c 2f 72 6f 6f 74 3e 7d 0a 20 20 20 20 24 70 20 </root>}. $p
2fc0: 66 72 65 65 0a 20 20 20 20 6c 69 73 74 20 24 3a free. list $:
2fd0: 3a 65 73 68 63 6f 75 6e 74 65 72 20 24 3a 3a 65 :eshcounter $::e
2fe0: 65 68 63 6f 75 6e 74 65 72 20 24 3a 3a 63 64 68 ehcounter $::cdh
2ff0: 63 6f 75 6e 74 65 72 20 5c 0a 20 20 20 20 20 20 counter \.
3000: 20 20 24 3a 3a 65 73 68 63 6f 75 6e 74 65 72 32 $::eshcounter2
3010: 20 24 3a 3a 65 65 68 63 6f 75 6e 74 65 72 32 20 $::eehcounter2
3020: 24 3a 3a 63 64 68 63 6f 75 6e 74 65 72 32 0a 7d $::cdhcounter2.}
3030: 20 7b 31 20 31 20 30 20 35 20 35 20 33 7d 0a 0a {1 1 0 5 5 3}..
3040: 74 65 73 74 20 70 61 72 73 65 72 2d 34 2e 31 20 test parser-4.1
3050: 7b 65 72 72 6f 72 20 69 6e 20 63 61 6c 6c 62 61 {error in callba
3060: 63 6b 7d 20 7b 0a 20 20 20 20 63 61 74 63 68 20 ck} {. catch
3070: 7b 75 6e 73 65 74 20 3a 3a 73 74 61 72 74 65 64 {unset ::started
3080: 7d 0a 0a 20 20 20 20 63 61 74 63 68 20 7b 72 65 }.. catch {re
3090: 6e 61 6d 65 20 70 61 72 73 65 72 2d 34 2e 31 20 name parser-4.1
30a0: 7b 7d 7d 0a 20 20 20 20 73 65 74 20 70 20 5b 3a {}}. set p [:
30b0: 3a 78 6d 6c 3a 3a 70 61 72 73 65 72 20 70 61 72 :xml::parser par
30c0: 73 65 72 2d 34 2e 31 20 2d 65 6c 65 6d 65 6e 74 ser-4.1 -element
30d0: 73 74 61 72 74 63 6f 6d 6d 61 6e 64 20 53 74 61 startcommand Sta
30e0: 72 74 5d 0a 20 20 20 20 73 65 74 20 65 72 72 63 rt]. set errc
30f0: 6f 64 65 20 5b 63 61 74 63 68 20 7b 24 70 20 70 ode [catch {$p p
3100: 61 72 73 65 20 7b 3c 3f 78 6d 6c 20 76 65 72 73 arse {<?xml vers
3110: 69 6f 6e 3d 22 31 2e 30 22 3f 3e 0a 3c 54 65 73 ion="1.0"?>.<Tes
3120: 74 3e 0a 3c 45 6c 65 6d 65 6e 74 3e 53 68 6f 75 t>.<Element>Shou
3130: 6c 64 20 73 65 65 20 74 68 69 73 20 64 61 74 61 ld see this data
3140: 3c 2f 45 6c 65 6d 65 6e 74 3e 0a 3c 45 6c 65 6d </Element>.<Elem
3150: 65 6e 74 20 63 6c 61 73 73 3d 22 65 72 72 6f 72 ent class="error
3160: 22 2f 3e 0a 3c 45 6c 65 6d 65 6e 74 3e 53 68 6f "/>.<Element>Sho
3170: 75 6c 64 20 6e 6f 74 20 73 65 65 20 74 68 69 73 uld not see this
3180: 20 64 61 74 61 3c 2f 45 6c 65 6d 65 6e 74 3e 0a data</Element>.
3190: 3c 2f 54 65 73 74 3e 0a 20 20 20 20 7d 7d 20 72 </Test>. }} r
31a0: 65 73 75 6c 74 5d 0a 20 20 20 20 6c 69 73 74 20 esult]. list
31b0: 24 65 72 72 63 6f 64 65 20 24 3a 3a 73 74 61 72 $errcode $::star
31c0: 74 65 64 28 45 6c 65 6d 65 6e 74 29 0a 7d 20 7b ted(Element).} {
31d0: 31 20 32 7d 0a 0a 74 65 73 74 20 70 61 72 73 65 1 2}..test parse
31e0: 72 2d 34 2e 32 20 7b 65 72 72 6f 72 20 69 6e 20 r-4.2 {error in
31f0: 63 61 6c 6c 62 61 63 6b 7d 20 7b 0a 20 20 20 20 callback} {.
3200: 63 61 74 63 68 20 7b 75 6e 73 65 74 20 3a 3a 73 catch {unset ::s
3210: 74 61 72 74 65 64 7d 0a 0a 20 20 20 20 63 61 74 tarted}.. cat
3220: 63 68 20 7b 72 65 6e 61 6d 65 20 70 61 72 73 65 ch {rename parse
3230: 72 2d 34 2e 32 20 7b 7d 7d 0a 20 20 20 20 73 65 r-4.2 {}}. se
3240: 74 20 70 20 5b 3a 3a 78 6d 6c 3a 3a 70 61 72 73 t p [::xml::pars
3250: 65 72 20 70 61 72 73 65 72 2d 34 2e 32 20 2d 65 er parser-4.2 -e
3260: 6c 65 6d 65 6e 74 73 74 61 72 74 63 6f 6d 6d 61 lementstartcomma
3270: 6e 64 20 53 74 61 72 74 5d 0a 20 20 20 20 73 65 nd Start]. se
3280: 74 20 65 72 72 63 6f 64 65 20 5b 63 61 74 63 68 t errcode [catch
3290: 20 7b 24 70 20 70 61 72 73 65 20 7b 3c 3f 78 6d {$p parse {<?xm
32a0: 6c 20 76 65 72 73 69 6f 6e 3d 22 31 2e 30 22 3f l version="1.0"?
32b0: 3e 0a 3c 54 65 73 74 3e 0a 3c 45 6c 65 6d 65 6e >.<Test>.<Elemen
32c0: 74 3e 53 68 6f 75 6c 64 20 73 65 65 20 74 68 69 t>Should see thi
32d0: 73 20 64 61 74 61 3c 2f 45 6c 65 6d 65 6e 74 3e s data</Element>
32e0: 0a 3c 45 6c 65 6d 65 6e 74 20 63 6c 61 73 73 3d .<Element class=
32f0: 22 31 33 22 2f 3e 0a 3c 45 6c 65 6d 65 6e 74 3e "13"/>.<Element>
3300: 53 68 6f 75 6c 64 20 6e 6f 74 20 73 65 65 20 74 Should not see t
3310: 68 69 73 20 64 61 74 61 3c 2f 45 6c 65 6d 65 6e his data</Elemen
3320: 74 3e 0a 3c 2f 54 65 73 74 3e 0a 7d 7d 20 72 65 t>.</Test>.}} re
3330: 73 75 6c 74 5d 0a 20 20 20 20 6c 69 73 74 20 24 sult]. list $
3340: 3a 3a 65 72 72 63 6f 64 65 20 24 3a 3a 73 74 61 ::errcode $::sta
3350: 72 74 65 64 28 45 6c 65 6d 65 6e 74 29 0a 7d 20 rted(Element).}
3360: 7b 31 33 20 32 7d 0a 0a 74 65 73 74 20 70 61 72 {13 2}..test par
3370: 73 65 72 2d 35 2e 31 20 7b 70 61 72 73 65 20 63 ser-5.1 {parse c
3380: 68 61 6e 6e 65 6c 20 69 6e 70 75 74 7d 20 7b 0a hannel input} {.
3390: 20 20 20 20 63 61 74 63 68 20 7b 75 6e 73 65 74 catch {unset
33a0: 20 3a 3a 63 6f 75 6e 74 7d 0a 0a 20 20 20 20 63 ::count}.. c
33b0: 61 74 63 68 20 7b 72 65 6e 61 6d 65 20 70 61 72 atch {rename par
33c0: 73 65 72 2d 35 2e 31 20 7b 7d 7d 0a 20 20 20 20 ser-5.1 {}}.
33d0: 73 65 74 20 70 61 72 73 65 72 20 5b 3a 3a 78 6d set parser [::xm
33e0: 6c 3a 3a 70 61 72 73 65 72 20 70 61 72 73 65 72 l::parser parser
33f0: 2d 35 2e 31 20 2d 65 6c 65 6d 65 6e 74 73 74 61 -5.1 -elementsta
3400: 72 74 63 6f 6d 6d 61 6e 64 20 43 6f 75 6e 74 5d rtcommand Count]
3410: 0a 20 20 20 20 73 65 74 20 66 64 20 5b 6f 70 65 . set fd [ope
3420: 6e 20 5b 66 69 6c 65 20 6a 6f 69 6e 20 5b 70 77 n [file join [pw
3430: 64 5d 20 5b 66 69 6c 65 20 64 69 72 20 5b 69 6e d] [file dir [in
3440: 66 6f 20 73 63 72 69 70 74 5d 5d 20 64 61 74 61 fo script]] data
3450: 2f 62 6f 6f 6b 73 2e 78 6d 6c 5d 5d 0a 20 20 20 /books.xml]].
3460: 20 24 70 61 72 73 65 72 20 70 61 72 73 65 63 68 $parser parsech
3470: 61 6e 6e 65 6c 20 24 66 64 0a 20 20 20 20 63 6c annel $fd. cl
3480: 6f 73 65 20 24 66 64 0a 20 20 20 20 6c 69 73 74 ose $fd. list
3490: 20 24 3a 3a 63 6f 75 6e 74 0a 7d 20 7b 34 32 7d $::count.} {42}
34a0: 0a 0a 70 72 6f 63 20 65 6c 65 6d 65 6e 74 73 74 ..proc elementst
34b0: 61 72 74 20 7b 61 72 67 73 7d 20 7b 0a 20 20 20 art {args} {.
34c0: 20 67 6c 6f 62 61 6c 20 70 61 72 73 65 72 0a 0a global parser..
34d0: 20 20 20 20 69 66 20 7b 21 5b 69 6e 66 6f 20 65 if {![info e
34e0: 78 69 73 74 73 20 3a 3a 63 6f 75 6e 74 5d 7d 20 xists ::count]}
34f0: 7b 0a 20 20 20 20 20 20 20 20 73 65 74 20 3a 3a {. set ::
3500: 63 6f 75 6e 74 20 31 0a 20 20 20 20 7d 20 65 6c count 1. } el
3510: 73 65 20 7b 0a 20 20 20 20 20 20 20 20 69 6e 63 se {. inc
3520: 72 20 3a 3a 63 6f 75 6e 74 0a 20 20 20 20 7d 0a r ::count. }.
3530: 20 20 20 20 73 65 74 20 66 64 20 5b 6f 70 65 6e set fd [open
3540: 20 5b 66 69 6c 65 20 6a 6f 69 6e 20 5b 70 77 64 [file join [pwd
3550: 5d 20 5b 66 69 6c 65 20 64 69 72 20 5b 69 6e 66 ] [file dir [inf
3560: 6f 20 73 63 72 69 70 74 5d 5d 20 64 61 74 61 2f o script]] data/
3570: 62 6f 6f 6b 73 2e 78 6d 6c 5d 5d 0a 20 20 20 20 books.xml]].
3580: 63 61 74 63 68 20 7b 24 70 61 72 73 65 72 20 70 catch {$parser p
3590: 61 72 73 65 63 68 61 6e 6e 65 6c 20 24 66 64 7d arsechannel $fd}
35a0: 0a 20 20 20 20 63 6c 6f 73 65 20 24 66 64 0a 7d . close $fd.}
35b0: 0a 0a 74 65 73 74 20 70 61 72 73 65 72 2d 35 2e ..test parser-5.
35c0: 32 20 7b 70 61 72 73 65 20 63 68 61 6e 6e 65 6c 2 {parse channel
35d0: 20 69 6e 70 75 74 20 77 69 74 68 20 63 61 74 63 input with catc
35e0: 68 65 64 20 74 72 79 20 74 6f 20 72 65 63 75 72 hed try to recur
35f0: 73 69 76 65 20 70 61 72 73 69 6e 67 7d 20 7b 0a sive parsing} {.
3600: 20 20 20 20 63 61 74 63 68 20 7b 75 6e 73 65 74 catch {unset
3610: 20 3a 3a 63 6f 75 6e 74 7d 0a 0a 20 20 20 20 63 ::count}.. c
3620: 61 74 63 68 20 7b 72 65 6e 61 6d 65 20 70 61 72 atch {rename par
3630: 73 65 72 2d 35 2e 32 20 7b 7d 7d 0a 20 20 20 20 ser-5.2 {}}.
3640: 73 65 74 20 70 61 72 73 65 72 20 5b 3a 3a 78 6d set parser [::xm
3650: 6c 3a 3a 70 61 72 73 65 72 20 70 61 72 73 65 72 l::parser parser
3660: 2d 35 2e 32 20 2d 65 6c 65 6d 65 6e 74 73 74 61 -5.2 -elementsta
3670: 72 74 63 6f 6d 6d 61 6e 64 20 65 6c 65 6d 65 6e rtcommand elemen
3680: 74 73 74 61 72 74 5d 0a 20 20 20 20 73 65 74 20 tstart]. set
3690: 66 64 20 5b 6f 70 65 6e 20 5b 66 69 6c 65 20 6a fd [open [file j
36a0: 6f 69 6e 20 5b 70 77 64 5d 20 5b 66 69 6c 65 20 oin [pwd] [file
36b0: 64 69 72 20 5b 69 6e 66 6f 20 73 63 72 69 70 74 dir [info script
36c0: 5d 5d 20 64 61 74 61 2f 62 6f 6f 6b 73 2e 78 6d ]] data/books.xm
36d0: 6c 5d 5d 0a 20 20 20 20 24 70 61 72 73 65 72 20 l]]. $parser
36e0: 70 61 72 73 65 63 68 61 6e 6e 65 6c 20 24 66 64 parsechannel $fd
36f0: 0a 20 20 20 20 63 6c 6f 73 65 20 24 66 64 0a 20 . close $fd.
3700: 20 20 20 6c 69 73 74 20 24 3a 3a 63 6f 75 6e 74 list $::count
3710: 0a 7d 20 7b 34 32 7d 0a 0a 74 65 73 74 20 70 61 .} {42}..test pa
3720: 72 73 65 72 2d 35 2e 33 20 7b 70 61 72 73 65 20 rser-5.3 {parse
3730: 63 68 61 6e 6e 65 6c 20 2d 20 78 6d 6c 20 77 72 channel - xml wr
3740: 6f 6e 67 7d 20 2d 73 65 74 75 70 20 7b 0a 20 20 ong} -setup {.
3750: 20 20 73 65 74 20 78 6d 6c 46 69 6c 65 20 5b 6d set xmlFile [m
3760: 61 6b 65 46 69 6c 65 20 7b 3c 72 6f 6f 74 3e 3c akeFile {<root><
3770: 61 3e 3c 2f 72 6f 6f 74 3e 7d 20 70 61 72 73 65 a></root>} parse
3780: 72 2e 78 6d 6c 5d 0a 7d 20 2d 62 6f 64 79 20 7b r.xml].} -body {
3790: 0a 20 20 20 20 73 65 74 20 66 64 20 5b 6f 70 65 . set fd [ope
37a0: 6e 20 24 78 6d 6c 46 69 6c 65 5d 0a 20 20 20 20 n $xmlFile].
37b0: 63 61 74 63 68 20 7b 72 65 6e 61 6d 65 20 70 61 catch {rename pa
37c0: 72 73 65 72 2d 35 2e 33 20 7b 7d 7d 0a 20 20 20 rser-5.3 {}}.
37d0: 20 73 65 74 20 70 61 72 73 65 72 20 5b 3a 3a 78 set parser [::x
37e0: 6d 6c 3a 3a 70 61 72 73 65 72 20 70 61 72 73 65 ml::parser parse
37f0: 72 2d 35 2e 33 20 2d 65 6c 65 6d 65 6e 74 73 74 r-5.3 -elementst
3800: 61 72 74 63 6f 6d 6d 61 6e 64 20 65 6c 65 6d 65 artcommand eleme
3810: 6e 74 73 74 61 72 74 5d 0a 20 20 20 20 73 65 74 ntstart]. set
3820: 20 72 65 73 75 6c 74 20 5b 63 61 74 63 68 20 7b result [catch {
3830: 24 70 61 72 73 65 72 20 70 61 72 73 65 63 68 61 $parser parsecha
3840: 6e 6e 65 6c 20 24 66 64 7d 5d 0a 20 20 20 20 63 nnel $fd}]. c
3850: 6c 6f 73 65 20 24 66 64 0a 20 20 20 20 73 65 74 lose $fd. set
3860: 20 72 65 73 75 6c 74 0a 7d 20 2d 63 6c 65 61 6e result.} -clean
3870: 75 70 20 7b 0a 20 20 20 20 72 65 6d 6f 76 65 46 up {. removeF
3880: 69 6c 65 20 70 61 72 73 65 72 2e 78 6d 6c 0a 7d ile parser.xml.}
3890: 20 2d 72 65 73 75 6c 74 20 31 0a 0a 70 72 6f 63 -result 1..proc
38a0: 20 65 6c 65 6d 65 6e 74 73 74 61 72 74 2d 35 2e elementstart-5.
38b0: 34 20 7b 61 72 67 73 7d 20 7b 0a 20 20 20 20 65 4 {args} {. e
38c0: 72 72 6f 72 20 22 45 72 72 6f 72 20 72 61 69 73 rror "Error rais
38d0: 65 64 20 62 79 20 65 6c 65 6d 65 6e 74 73 74 61 ed by elementsta
38e0: 72 74 2d 35 2e 34 22 0a 7d 0a 0a 74 65 73 74 20 rt-5.4".}..test
38f0: 70 61 72 73 65 72 2d 35 2e 34 20 7b 70 61 72 73 parser-5.4 {pars
3900: 65 20 63 68 61 6e 6e 65 6c 20 2d 20 65 72 72 6f e channel - erro
3910: 72 20 72 61 69 73 65 64 20 69 6e 20 68 61 6e 64 r raised in hand
3920: 6c 65 72 7d 20 7b 0a 20 20 20 20 63 61 74 63 68 ler} {. catch
3930: 20 7b 70 61 72 73 65 72 2d 35 2e 34 20 66 72 65 {parser-5.4 fre
3940: 65 7d 0a 20 20 20 20 3a 3a 78 6d 6c 3a 3a 70 61 e}. ::xml::pa
3950: 72 73 65 72 20 70 61 72 73 65 72 2d 35 2e 34 20 rser parser-5.4
3960: 2d 65 6c 65 6d 65 6e 74 73 74 61 72 74 63 6f 6d -elementstartcom
3970: 6d 61 6e 64 20 65 6c 65 6d 65 6e 74 73 74 61 72 mand elementstar
3980: 74 2d 35 2e 34 0a 20 20 20 20 73 65 74 20 66 69 t-5.4. set fi
3990: 6c 65 20 5b 66 69 6c 65 20 6a 6f 69 6e 20 5b 70 le [file join [p
39a0: 77 64 5d 20 5b 66 69 6c 65 20 64 69 72 20 5b 69 wd] [file dir [i
39b0: 6e 66 6f 20 73 63 72 69 70 74 5d 5d 20 64 61 74 nfo script]] dat
39c0: 61 2f 62 6f 6f 6b 73 2e 78 6d 6c 5d 0a 20 20 20 a/books.xml].
39d0: 20 63 61 74 63 68 20 7b 70 61 72 73 65 72 2d 35 catch {parser-5
39e0: 2e 34 20 70 61 72 73 65 66 69 6c 65 20 24 66 69 .4 parsefile $fi
39f0: 6c 65 7d 20 65 72 72 4d 73 67 0a 20 20 20 20 70 le} errMsg. p
3a00: 61 72 73 65 72 2d 35 2e 34 20 66 72 65 65 0a 20 arser-5.4 free.
3a10: 20 20 20 73 65 74 20 65 72 72 4d 73 67 0a 7d 20 set errMsg.}
3a20: 22 45 72 72 6f 72 20 72 61 69 73 65 64 20 62 79 "Error raised by
3a30: 20 65 6c 65 6d 65 6e 74 73 74 61 72 74 2d 35 2e elementstart-5.
3a40: 34 22 0a 0a 74 65 73 74 20 70 61 72 73 65 72 2d 4"..test parser-
3a50: 36 2e 31 20 7b 72 65 75 73 65 20 70 61 72 73 65 6.1 {reuse parse
3a60: 72 7d 20 7b 0a 20 20 20 20 63 61 74 63 68 20 7b r} {. catch {
3a70: 72 65 6e 61 6d 65 20 70 61 72 73 65 72 2d 36 2e rename parser-6.
3a80: 31 20 7b 7d 7d 0a 20 20 20 20 73 65 74 20 70 61 1 {}}. set pa
3a90: 72 73 65 72 20 5b 65 78 70 61 74 20 70 61 72 73 rser [expat pars
3aa0: 65 72 2d 36 2e 31 20 2d 62 61 73 65 75 72 6c 20 er-6.1 -baseurl
3ab0: 66 69 6c 65 3a 2f 2f 2f 66 6f 6f 2f 62 61 72 5d file:///foo/bar]
3ac0: 0a 20 20 20 20 73 65 74 20 72 65 73 75 6c 74 20 . set result
3ad0: 5b 24 70 61 72 73 65 72 20 63 67 65 74 20 2d 62 [$parser cget -b
3ae0: 61 73 65 75 72 6c 5d 0a 20 20 20 20 24 70 61 72 aseurl]. $par
3af0: 73 65 72 20 70 61 72 73 65 20 3c 64 61 74 61 2f ser parse <data/
3b00: 3e 0a 20 20 20 20 6c 61 70 70 65 6e 64 20 72 65 >. lappend re
3b10: 73 75 6c 74 20 5b 24 70 61 72 73 65 72 20 63 67 sult [$parser cg
3b20: 65 74 20 2d 62 61 73 65 75 72 6c 5d 0a 20 20 20 et -baseurl].
3b30: 20 24 70 61 72 73 65 72 20 63 6f 6e 66 69 67 75 $parser configu
3b40: 72 65 20 2d 62 61 73 65 75 72 6c 20 66 69 6c 65 re -baseurl file
3b50: 3a 2f 2f 2f 62 61 72 2f 66 6f 6f 0a 20 20 20 20 :///bar/foo.
3b60: 6c 61 70 70 65 6e 64 20 72 65 73 75 6c 74 20 5b lappend result [
3b70: 24 70 61 72 73 65 72 20 63 67 65 74 20 2d 62 61 $parser cget -ba
3b80: 73 65 75 72 6c 5d 0a 20 20 20 20 24 70 61 72 73 seurl]. $pars
3b90: 65 72 20 70 61 72 73 65 20 3c 6f 74 68 65 72 64 er parse <otherd
3ba0: 61 74 61 2f 3e 0a 20 20 20 20 6c 61 70 70 65 6e ata/>. lappen
3bb0: 64 20 72 65 73 75 6c 74 20 5b 24 70 61 72 73 65 d result [$parse
3bc0: 72 20 63 67 65 74 20 2d 62 61 73 65 75 72 6c 5d r cget -baseurl]
3bd0: 0a 20 20 20 20 73 65 74 20 72 65 73 75 6c 74 0a . set result.
3be0: 7d 20 7b 66 69 6c 65 3a 2f 2f 2f 66 6f 6f 2f 62 } {file:///foo/b
3bf0: 61 72 20 7b 7d 20 66 69 6c 65 3a 2f 2f 2f 62 61 ar {} file:///ba
3c00: 72 2f 66 6f 6f 20 7b 7d 7d 0a 0a 0a 70 72 6f 63 r/foo {}}...proc
3c10: 20 65 6c 65 6d 65 6e 74 73 74 61 72 74 20 7b 61 elementstart {a
3c20: 72 67 73 7d 20 7b 0a 20 20 20 20 67 6c 6f 62 61 rgs} {. globa
3c30: 6c 20 70 61 72 73 65 72 0a 20 20 20 20 0a 20 20 l parser. .
3c40: 20 20 24 70 61 72 73 65 72 20 72 65 73 65 74 0a $parser reset.
3c50: 7d 0a 0a 74 65 73 74 20 70 61 72 73 65 72 2d 37 }..test parser-7
3c60: 2e 31 20 7b 70 61 72 73 65 72 20 72 65 73 65 74 .1 {parser reset
3c70: 20 63 61 6c 6c 65 64 20 66 72 6f 6d 20 77 69 74 called from wit
3c80: 68 69 6e 20 63 61 6c 6c 62 61 63 6b 20 70 72 6f hin callback pro
3c90: 63 7d 20 7b 0a 20 20 20 20 73 65 74 20 70 61 72 c} {. set par
3ca0: 73 65 72 20 5b 65 78 70 61 74 20 2d 65 6c 65 6d ser [expat -elem
3cb0: 65 6e 74 73 74 61 72 74 63 6f 6d 6d 61 6e 64 20 entstartcommand
3cc0: 65 6c 65 6d 65 6e 74 73 74 61 72 74 5d 0a 20 20 elementstart].
3cd0: 20 20 73 65 74 20 72 65 73 75 6c 74 20 5b 63 61 set result [ca
3ce0: 74 63 68 20 7b 24 70 61 72 73 65 72 20 70 61 72 tch {$parser par
3cf0: 73 65 20 3c 72 6f 6f 74 3e 66 6f 6f 3c 2f 72 6f se <root>foo</ro
3d00: 6f 74 3e 7d 20 65 72 72 4d 73 67 5d 0a 20 20 20 ot>} errMsg].
3d10: 20 6c 61 70 70 65 6e 64 20 72 65 73 75 6c 74 20 lappend result
3d20: 24 65 72 72 4d 73 67 0a 20 20 20 20 24 70 61 72 $errMsg. $par
3d30: 73 65 72 20 66 72 65 65 0a 20 20 20 20 73 65 74 ser free. set
3d40: 20 72 65 73 75 6c 74 0a 7d 20 7b 31 20 7b 70 61 result.} {1 {pa
3d50: 72 73 65 72 20 72 65 73 65 74 20 6e 6f 74 20 61 rser reset not a
3d60: 6c 6c 6f 77 65 64 20 66 72 6f 6d 20 77 69 74 68 llowed from with
3d70: 69 6e 20 63 61 6c 6c 62 61 63 6b 7d 7d 0a 0a 74 in callback}}..t
3d80: 65 73 74 20 70 61 72 73 65 72 2d 37 2e 32 20 7b est parser-7.2 {
3d90: 70 61 72 73 65 72 20 72 65 73 65 74 7d 20 7b 0a parser reset} {.
3da0: 20 20 20 20 73 65 74 20 70 61 72 73 65 72 20 5b set parser [
3db0: 65 78 70 61 74 20 2d 66 69 6e 61 6c 20 30 5d 0a expat -final 0].
3dc0: 20 20 20 20 24 70 61 72 73 65 72 20 70 61 72 73 $parser pars
3dd0: 65 20 22 3c 72 6f 22 0a 20 20 20 20 24 70 61 72 e "<ro". $par
3de0: 73 65 72 20 72 65 73 65 74 0a 20 20 20 20 73 65 ser reset. se
3df0: 74 20 72 65 73 75 6c 74 20 5b 6c 69 73 74 5d 0a t result [list].
3e00: 20 20 20 20 66 6f 72 65 61 63 68 20 6f 70 74 69 foreach opti
3e10: 6f 6e 20 7b 2d 66 69 6e 61 6c 20 2d 62 61 73 65 on {-final -base
3e20: 75 72 6c 20 2d 69 67 6e 6f 72 65 77 68 69 74 65 url -ignorewhite
3e30: 63 64 61 74 61 20 2d 75 73 65 46 6f 72 65 69 67 cdata -useForeig
3e40: 6e 44 54 44 7d 20 7b 0a 20 20 20 20 20 20 20 20 nDTD} {.
3e50: 6c 61 70 70 65 6e 64 20 72 65 73 75 6c 74 20 5b lappend result [
3e60: 24 70 61 72 73 65 72 20 63 67 65 74 20 24 6f 70 $parser cget $op
3e70: 74 69 6f 6e 5d 0a 20 20 20 20 7d 0a 20 20 20 20 tion]. }.
3e80: 24 70 61 72 73 65 72 20 70 61 72 73 65 20 22 3c $parser parse "<
3e90: 64 6f 63 2f 3e 22 0a 20 20 20 20 24 70 61 72 73 doc/>". $pars
3ea0: 65 72 20 66 72 65 65 0a 20 20 20 20 73 65 74 20 er free. set
3eb0: 72 65 73 75 6c 74 0a 7d 20 7b 31 20 7b 7d 20 30 result.} {1 {} 0
3ec0: 20 30 7d 0a 0a 70 72 6f 63 20 65 6c 65 6d 65 6e 0}..proc elemen
3ed0: 74 73 74 61 72 74 20 7b 61 72 67 73 7d 20 7b 0a tstart {args} {.
3ee0: 20 20 20 20 67 6c 6f 62 61 6c 20 70 61 72 73 65 global parse
3ef0: 72 0a 20 20 20 20 0a 20 20 20 20 24 70 61 72 73 r. . $pars
3f00: 65 72 20 66 72 65 65 0a 7d 0a 0a 74 65 73 74 20 er free.}..test
3f10: 70 61 72 73 65 72 2d 38 2e 31 20 7b 70 61 72 73 parser-8.1 {pars
3f20: 65 72 20 66 72 65 65 20 63 61 6c 6c 65 64 20 66 er free called f
3f30: 72 6f 6d 20 77 69 74 68 69 6e 20 63 61 6c 6c 62 rom within callb
3f40: 61 63 6b 20 70 72 6f 63 7d 20 7b 0a 20 20 20 20 ack proc} {.
3f50: 73 65 74 20 70 61 72 73 65 72 20 5b 65 78 70 61 set parser [expa
3f60: 74 20 2d 65 6c 65 6d 65 6e 74 73 74 61 72 74 63 t -elementstartc
3f70: 6f 6d 6d 61 6e 64 20 65 6c 65 6d 65 6e 74 73 74 ommand elementst
3f80: 61 72 74 5d 0a 20 20 20 20 73 65 74 20 72 65 73 art]. set res
3f90: 75 6c 74 20 5b 63 61 74 63 68 20 7b 24 70 61 72 ult [catch {$par
3fa0: 73 65 72 20 70 61 72 73 65 20 3c 72 6f 6f 74 3e ser parse <root>
3fb0: 66 6f 6f 3c 2f 72 6f 6f 74 3e 7d 20 65 72 72 4d foo</root>} errM
3fc0: 73 67 5d 0a 20 20 20 20 6c 61 70 70 65 6e 64 20 sg]. lappend
3fd0: 72 65 73 75 6c 74 20 24 65 72 72 4d 73 67 0a 20 result $errMsg.
3fe0: 20 20 20 24 70 61 72 73 65 72 20 66 72 65 65 0a $parser free.
3ff0: 20 20 20 20 73 65 74 20 72 65 73 75 6c 74 0a 7d set result.}
4000: 20 7b 31 20 7b 70 61 72 73 65 72 20 64 65 6c 65 {1 {parser dele
4010: 74 65 20 6e 6f 74 20 61 6c 6c 6f 77 65 64 20 66 te not allowed f
4020: 72 6f 6d 20 77 69 74 68 69 6e 20 63 61 6c 6c 62 rom within callb
4030: 61 63 6b 7d 7d 0a 0a 70 72 6f 63 20 65 6c 65 6d ack}}..proc elem
4040: 65 6e 74 73 74 61 72 74 20 7b 61 72 67 73 7d 20 entstart {args}
4050: 7b 0a 20 20 20 20 67 6c 6f 62 61 6c 20 70 61 72 {. global par
4060: 73 65 72 0a 0a 20 20 20 20 24 70 61 72 73 65 72 ser.. $parser
4070: 20 70 61 72 73 65 20 7b 3c 72 6f 6f 74 3e 66 6f parse {<root>fo
4080: 6f 20 62 61 72 3c 2f 72 6f 6f 74 3e 7d 0a 7d 0a o bar</root>}.}.
4090: 0a 74 65 73 74 20 70 61 72 73 65 72 2d 39 2e 31 .test parser-9.1
40a0: 20 7b 74 72 79 20 74 6f 20 75 73 65 20 74 68 65 {try to use the
40b0: 20 70 61 72 73 65 72 20 66 72 6f 6d 20 77 69 74 parser from wit
40c0: 68 69 6e 20 6f 6e 65 20 6f 66 20 69 74 73 20 63 hin one of its c
40d0: 61 6c 6c 62 61 63 6b 73 7d 20 7b 0a 20 20 20 20 allbacks} {.
40e0: 73 65 74 20 70 61 72 73 65 72 20 5b 65 78 70 61 set parser [expa
40f0: 74 20 2d 65 6c 65 6d 65 6e 74 73 74 61 72 74 63 t -elementstartc
4100: 6f 6d 6d 61 6e 64 20 65 6c 65 6d 65 6e 74 73 74 ommand elementst
4110: 61 72 74 5d 0a 20 20 20 20 73 65 74 20 72 65 73 art]. set res
4120: 75 6c 74 20 5b 63 61 74 63 68 20 7b 24 70 61 72 ult [catch {$par
4130: 73 65 72 20 70 61 72 73 65 20 3c 72 6f 6f 74 3e ser parse <root>
4140: 66 6f 6f 3c 2f 72 6f 6f 74 3e 7d 20 65 72 72 4d foo</root>} errM
4150: 73 67 5d 0a 20 20 20 20 6c 61 70 70 65 6e 64 20 sg]. lappend
4160: 72 65 73 75 6c 74 20 24 65 72 72 4d 73 67 0a 20 result $errMsg.
4170: 20 20 20 24 70 61 72 73 65 72 20 66 72 65 65 0a $parser free.
4180: 20 20 20 20 73 65 74 20 72 65 73 75 6c 74 0a 7d set result.}
4190: 20 7b 31 20 7b 50 61 72 73 65 72 20 61 6c 72 65 {1 {Parser alre
41a0: 61 64 79 20 69 6e 20 75 73 65 2e 7d 7d 0a 0a 70 ady in use.}}..p
41b0: 72 6f 63 20 63 61 6c 6c 65 64 46 72 6f 6d 45 6c roc calledFromEl
41c0: 65 6d 65 6e 74 73 74 61 72 74 20 7b 61 72 67 73 ementstart {args
41d0: 7d 20 7b 0a 20 20 20 20 67 6c 6f 62 61 6c 20 70 } {. global p
41e0: 61 72 73 65 72 0a 0a 20 20 20 20 24 70 61 72 73 arser.. $pars
41f0: 65 72 20 70 61 72 73 65 20 7b 3c 72 6f 6f 74 3e er parse {<root>
4200: 66 6f 6f 20 62 61 72 3c 2f 72 6f 6f 74 3e 7d 0a foo bar</root>}.
4210: 7d 0a 0a 70 72 6f 63 20 65 6c 65 6d 65 6e 74 73 }..proc elements
4220: 74 61 72 74 20 7b 61 72 67 73 7d 20 7b 0a 20 20 tart {args} {.
4230: 20 20 63 61 6c 6c 65 64 46 72 6f 6d 45 6c 65 6d calledFromElem
4240: 65 6e 74 73 74 61 72 74 0a 7d 0a 0a 74 65 73 74 entstart.}..test
4250: 20 70 61 72 73 65 72 2d 39 2e 32 20 7b 74 72 79 parser-9.2 {try
4260: 20 74 6f 20 75 73 65 20 74 68 65 20 70 61 72 73 to use the pars
4270: 65 72 20 66 72 6f 6d 20 77 69 74 68 69 6e 20 6f er from within o
4280: 6e 65 20 6f 66 20 69 74 73 20 63 61 6c 6c 62 61 ne of its callba
4290: 63 6b 73 7d 20 7b 0a 20 20 20 20 73 65 74 20 70 cks} {. set p
42a0: 61 72 73 65 72 20 5b 65 78 70 61 74 20 2d 65 6c arser [expat -el
42b0: 65 6d 65 6e 74 73 74 61 72 74 63 6f 6d 6d 61 6e ementstartcomman
42c0: 64 20 65 6c 65 6d 65 6e 74 73 74 61 72 74 5d 0a d elementstart].
42d0: 20 20 20 20 73 65 74 20 72 65 73 75 6c 74 20 5b set result [
42e0: 63 61 74 63 68 20 7b 24 70 61 72 73 65 72 20 70 catch {$parser p
42f0: 61 72 73 65 20 3c 72 6f 6f 74 3e 66 6f 6f 3c 2f arse <root>foo</
4300: 72 6f 6f 74 3e 7d 20 65 72 72 4d 73 67 5d 0a 20 root>} errMsg].
4310: 20 20 20 6c 61 70 70 65 6e 64 20 72 65 73 75 6c lappend resul
4320: 74 20 24 65 72 72 4d 73 67 0a 20 20 20 20 24 70 t $errMsg. $p
4330: 61 72 73 65 72 20 66 72 65 65 0a 20 20 20 20 73 arser free. s
4340: 65 74 20 72 65 73 75 6c 74 0a 7d 20 7b 31 20 7b et result.} {1 {
4350: 50 61 72 73 65 72 20 61 6c 72 65 61 64 79 20 69 Parser already i
4360: 6e 20 75 73 65 2e 7d 7d 0a 0a 0a 74 65 73 74 20 n use.}}...test
4370: 70 61 72 73 65 72 2d 31 30 2e 31 20 7b 72 65 74 parser-10.1 {ret
4380: 75 72 6e 20 2d 63 6f 64 65 20 72 65 74 75 72 6e urn -code return
4390: 20 69 6e 20 63 61 6c 6c 62 61 63 6b 7d 20 7b 0a in callback} {.
43a0: 20 20 20 20 63 61 74 63 68 20 7b 75 6e 73 65 74 catch {unset
43b0: 20 3a 3a 73 74 61 72 74 65 64 7d 0a 0a 20 20 20 ::started}..
43c0: 20 63 61 74 63 68 20 7b 72 65 6e 61 6d 65 20 70 catch {rename p
43d0: 61 72 73 65 72 2d 31 30 2e 31 20 7b 7d 7d 0a 20 arser-10.1 {}}.
43e0: 20 20 20 73 65 74 20 70 20 5b 3a 3a 78 6d 6c 3a set p [::xml:
43f0: 3a 70 61 72 73 65 72 20 70 61 72 73 65 72 2d 31 :parser parser-1
4400: 30 2e 31 20 2d 65 6c 65 6d 65 6e 74 73 74 61 72 0.1 -elementstar
4410: 74 63 6f 6d 6d 61 6e 64 20 53 74 61 72 74 5d 0a tcommand Start].
4420: 20 20 20 20 73 65 74 20 65 72 72 63 6f 64 65 20 set errcode
4430: 5b 63 61 74 63 68 20 7b 24 70 20 70 61 72 73 65 [catch {$p parse
4440: 20 7b 3c 3f 78 6d 6c 20 76 65 72 73 69 6f 6e 3d {<?xml version=
4450: 22 31 2e 30 22 3f 3e 0a 3c 54 65 73 74 3e 0a 3c "1.0"?>.<Test>.<
4460: 45 6c 65 6d 65 6e 74 3e 53 68 6f 75 6c 64 20 73 Element>Should s
4470: 65 65 20 74 68 69 73 20 64 61 74 61 3c 2f 45 6c ee this data</El
4480: 65 6d 65 6e 74 3e 0a 3c 45 6c 65 6d 65 6e 74 20 ement>.<Element
4490: 63 6c 61 73 73 3d 22 72 65 74 75 72 6e 22 2f 3e class="return"/>
44a0: 0a 3c 45 6c 65 6d 65 6e 74 3e 53 68 6f 75 6c 64 .<Element>Should
44b0: 20 6e 6f 74 20 73 65 65 20 74 68 69 73 20 64 61 not see this da
44c0: 74 61 3c 2f 45 6c 65 6d 65 6e 74 3e 0a 3c 2f 54 ta</Element>.</T
44d0: 65 73 74 3e 0a 7d 7d 20 72 65 73 75 6c 74 5d 0a est>.}} result].
44e0: 20 20 20 20 6c 69 73 74 20 24 65 72 72 63 6f 64 list $errcod
44f0: 65 20 24 3a 3a 73 74 61 72 74 65 64 28 45 6c 65 e $::started(Ele
4500: 6d 65 6e 74 29 0a 7d 20 7b 30 20 32 7d 0a 0a 74 ment).} {0 2}..t
4510: 65 73 74 20 70 61 72 73 65 72 2d 31 30 2e 32 20 est parser-10.2
4520: 7b 72 65 74 75 72 6e 20 2d 63 6f 64 65 20 72 65 {return -code re
4530: 74 75 72 6e 20 69 6e 20 63 61 6c 6c 62 61 63 6b turn in callback
4540: 7d 20 7b 0a 20 20 20 20 63 61 74 63 68 20 7b 75 } {. catch {u
4550: 6e 73 65 74 20 3a 3a 73 74 61 72 74 65 64 7d 0a nset ::started}.
4560: 0a 20 20 20 20 63 61 74 63 68 20 7b 72 65 6e 61 . catch {rena
4570: 6d 65 20 70 61 72 73 65 72 2d 31 30 2e 32 20 7b me parser-10.2 {
4580: 7d 7d 0a 20 20 20 20 73 65 74 20 70 20 5b 3a 3a }}. set p [::
4590: 78 6d 6c 3a 3a 70 61 72 73 65 72 20 70 61 72 73 xml::parser pars
45a0: 65 72 2d 31 30 2e 32 20 2d 65 6c 65 6d 65 6e 74 er-10.2 -element
45b0: 73 74 61 72 74 63 6f 6d 6d 61 6e 64 20 53 74 61 startcommand Sta
45c0: 72 74 5d 0a 20 20 20 20 73 65 74 20 65 72 72 63 rt]. set errc
45d0: 6f 64 65 20 5b 63 61 74 63 68 20 7b 24 70 20 70 ode [catch {$p p
45e0: 61 72 73 65 20 7b 3c 3f 78 6d 6c 20 76 65 72 73 arse {<?xml vers
45f0: 69 6f 6e 3d 22 31 2e 30 22 3f 3e 0a 3c 54 65 73 ion="1.0"?>.<Tes
4600: 74 3e 0a 3c 45 6c 65 6d 65 6e 74 3e 53 68 6f 75 t>.<Element>Shou
4610: 6c 64 20 73 65 65 20 74 68 69 73 20 64 61 74 61 ld see this data
4620: 3c 2f 45 6c 65 6d 65 6e 74 3e 0a 3c 45 6c 65 6d </Element>.<Elem
4630: 65 6e 74 20 63 6c 61 73 73 3d 22 72 65 74 75 72 ent class="retur
4640: 6e 22 2f 3e 0a 3c 45 6c 65 6d 65 6e 74 3e 53 68 n"/>.<Element>Sh
4650: 6f 75 6c 64 20 6e 6f 74 20 73 65 65 20 74 68 69 ould not see thi
4660: 73 20 64 61 74 61 3c 2f 45 6c 65 6d 65 6e 74 3e s data</Element>
4670: 0a 3c 2f 54 65 73 74 3e 7d 7d 20 65 72 72 4d 73 .</Test>}} errMs
4680: 67 5d 0a 20 20 20 20 73 65 74 20 72 65 73 75 6c g]. set resul
4690: 74 20 5b 6c 69 73 74 20 24 65 72 72 63 6f 64 65 t [list $errcode
46a0: 20 24 3a 3a 73 74 61 72 74 65 64 28 45 6c 65 6d $::started(Elem
46b0: 65 6e 74 29 5d 0a 20 20 20 20 24 70 20 72 65 73 ent)]. $p res
46c0: 65 74 0a 20 20 20 20 63 61 74 63 68 20 7b 75 6e et. catch {un
46d0: 73 65 74 20 3a 3a 73 74 61 72 74 65 64 7d 0a 20 set ::started}.
46e0: 20 20 20 73 65 74 20 65 72 72 63 6f 64 65 20 5b set errcode [
46f0: 63 61 74 63 68 20 7b 24 70 20 70 61 72 73 65 20 catch {$p parse
4700: 7b 3c 3f 78 6d 6c 20 76 65 72 73 69 6f 6e 3d 22 {<?xml version="
4710: 31 2e 30 22 3f 3e 0a 3c 54 65 73 74 3e 0a 3c 45 1.0"?>.<Test>.<E
4720: 6c 65 6d 65 6e 74 3e 53 68 6f 75 6c 64 20 73 65 lement>Should se
4730: 65 20 74 68 69 73 20 64 61 74 61 3c 2f 45 6c 65 e this data</Ele
4740: 6d 65 6e 74 3e 0a 3c 45 6c 65 6d 65 6e 74 20 63 ment>.<Element c
4750: 6c 61 73 73 3d 22 6f 6b 22 2f 3e 0a 3c 45 6c 65 lass="ok"/>.<Ele
4760: 6d 65 6e 74 3e 53 68 6f 75 6c 64 20 73 65 65 20 ment>Should see
4770: 74 68 69 73 20 64 61 74 61 3c 2f 45 6c 65 6d 65 this data</Eleme
4780: 6e 74 3e 0a 3c 2f 54 65 73 74 3e 7d 7d 20 65 72 nt>.</Test>}} er
4790: 72 4d 73 67 5d 0a 20 20 20 20 6c 61 70 70 65 6e rMsg]. lappen
47a0: 64 20 72 65 73 75 6c 74 20 24 65 72 72 63 6f 64 d result $errcod
47b0: 65 20 24 3a 3a 73 74 61 72 74 65 64 28 45 6c 65 e $::started(Ele
47c0: 6d 65 6e 74 29 0a 7d 20 7b 30 20 32 20 30 20 33 ment).} {0 2 0 3
47d0: 7d 0a 0a 74 65 73 74 20 70 61 72 73 65 72 2d 31 }..test parser-1
47e0: 31 2e 31 20 7b 70 61 72 73 65 20 70 61 72 73 65 1.1 {parse parse
47f0: 66 69 6c 65 7d 20 7b 0a 20 20 20 20 63 61 74 63 file} {. catc
4800: 68 20 7b 75 6e 73 65 74 20 3a 3a 63 6f 75 6e 74 h {unset ::count
4810: 7d 0a 0a 20 20 20 20 63 61 74 63 68 20 7b 72 65 }.. catch {re
4820: 6e 61 6d 65 20 70 61 72 73 65 72 2d 31 31 2e 31 name parser-11.1
4830: 20 7b 7d 7d 0a 20 20 20 20 73 65 74 20 70 61 72 {}}. set par
4840: 73 65 72 20 5b 3a 3a 78 6d 6c 3a 3a 70 61 72 73 ser [::xml::pars
4850: 65 72 20 70 61 72 73 65 72 2d 31 31 2e 31 20 2d er parser-11.1 -
4860: 65 6c 65 6d 65 6e 74 73 74 61 72 74 63 6f 6d 6d elementstartcomm
4870: 61 6e 64 20 43 6f 75 6e 74 5d 0a 20 20 20 20 73 and Count]. s
4880: 65 74 20 66 69 6c 65 20 5b 66 69 6c 65 20 6a 6f et file [file jo
4890: 69 6e 20 5b 70 77 64 5d 20 5b 66 69 6c 65 20 64 in [pwd] [file d
48a0: 69 72 20 5b 69 6e 66 6f 20 73 63 72 69 70 74 5d ir [info script]
48b0: 5d 20 64 61 74 61 2f 62 6f 6f 6b 73 2e 78 6d 6c ] data/books.xml
48c0: 5d 0a 20 20 20 20 24 70 61 72 73 65 72 20 70 61 ]. $parser pa
48d0: 72 73 65 66 69 6c 65 20 24 66 69 6c 65 0a 20 20 rsefile $file.
48e0: 20 20 73 65 74 20 3a 3a 63 6f 75 6e 74 0a 7d 20 set ::count.}
48f0: 7b 34 32 7d 0a 0a 70 72 6f 63 20 65 6c 65 6d 65 {42}..proc eleme
4900: 6e 74 73 74 61 72 74 2d 31 31 2e 32 20 7b 61 72 ntstart-11.2 {ar
4910: 67 73 7d 20 7b 0a 20 20 20 20 65 72 72 6f 72 20 gs} {. error
4920: 22 45 72 72 6f 72 20 72 61 69 73 65 64 20 62 79 "Error raised by
4930: 20 65 6c 65 6d 65 6e 74 73 74 61 72 74 2d 31 31 elementstart-11
4940: 2e 32 22 0a 7d 0a 0a 74 65 73 74 20 70 61 72 73 .2".}..test pars
4950: 65 72 2d 31 31 2e 32 20 7b 70 61 72 73 65 20 70 er-11.2 {parse p
4960: 61 72 73 65 66 69 6c 65 20 2d 20 65 72 72 6f 72 arsefile - error
4970: 20 72 61 69 73 65 64 20 69 6e 20 68 61 6e 64 6c raised in handl
4980: 65 72 7d 20 7b 0a 20 20 20 20 63 61 74 63 68 20 er} {. catch
4990: 7b 70 61 72 73 65 72 2d 31 31 2e 32 20 66 72 65 {parser-11.2 fre
49a0: 65 7d 0a 20 20 20 20 3a 3a 78 6d 6c 3a 3a 70 61 e}. ::xml::pa
49b0: 72 73 65 72 20 70 61 72 73 65 72 2d 31 31 2e 32 rser parser-11.2
49c0: 20 2d 65 6c 65 6d 65 6e 74 73 74 61 72 74 63 6f -elementstartco
49d0: 6d 6d 61 6e 64 20 65 6c 65 6d 65 6e 74 73 74 61 mmand elementsta
49e0: 72 74 2d 31 31 2e 32 0a 20 20 20 20 73 65 74 20 rt-11.2. set
49f0: 66 69 6c 65 20 5b 66 69 6c 65 20 6a 6f 69 6e 20 file [file join
4a00: 5b 70 77 64 5d 20 5b 66 69 6c 65 20 64 69 72 20 [pwd] [file dir
4a10: 5b 69 6e 66 6f 20 73 63 72 69 70 74 5d 5d 20 64 [info script]] d
4a20: 61 74 61 2f 62 6f 6f 6b 73 2e 78 6d 6c 5d 0a 20 ata/books.xml].
4a30: 20 20 20 63 61 74 63 68 20 7b 70 61 72 73 65 72 catch {parser
4a40: 2d 31 31 2e 32 20 70 61 72 73 65 66 69 6c 65 20 -11.2 parsefile
4a50: 24 66 69 6c 65 7d 20 65 72 72 4d 73 67 0a 20 20 $file} errMsg.
4a60: 20 20 70 61 72 73 65 72 2d 31 31 2e 32 20 66 72 parser-11.2 fr
4a70: 65 65 0a 20 20 20 20 73 65 74 20 65 72 72 4d 73 ee. set errMs
4a80: 67 0a 7d 20 22 45 72 72 6f 72 20 72 61 69 73 65 g.} "Error raise
4a90: 64 20 62 79 20 65 6c 65 6d 65 6e 74 73 74 61 72 d by elementstar
4aa0: 74 2d 31 31 2e 32 22 0a 0a 70 72 6f 63 20 65 6c t-11.2"..proc el
4ab0: 65 6d 65 6e 74 73 74 61 72 74 2d 31 32 2e 31 20 ementstart-12.1
4ac0: 7b 70 61 72 73 65 72 20 61 72 67 73 7d 20 7b 0a {parser args} {.
4ad0: 20 20 20 20 67 6c 6f 62 61 6c 20 72 65 73 75 6c global resul
4ae0: 74 0a 20 20 20 20 61 70 70 65 6e 64 20 72 65 73 t. append res
4af0: 75 6c 74 20 5b 24 70 61 72 73 65 72 20 63 75 72 ult [$parser cur
4b00: 72 65 6e 74 6d 61 72 6b 75 70 5d 0a 7d 0a 0a 70 rentmarkup].}..p
4b10: 72 6f 63 20 65 6c 65 6d 65 6e 74 65 6e 64 2d 31 roc elementend-1
4b20: 32 2e 31 20 7b 70 61 72 73 65 72 20 61 72 67 73 2.1 {parser args
4b30: 7d 20 7b 0a 20 20 20 20 67 6c 6f 62 61 6c 20 72 } {. global r
4b40: 65 73 75 6c 74 0a 20 20 20 20 61 70 70 65 6e 64 esult. append
4b50: 20 72 65 73 75 6c 74 20 5b 24 70 61 72 73 65 72 result [$parser
4b60: 20 63 75 72 72 65 6e 74 6d 61 72 6b 75 70 5d 0a currentmarkup].
4b70: 7d 0a 0a 74 65 73 74 20 70 61 72 73 65 72 2d 31 }..test parser-1
4b80: 32 2e 31 20 7b 63 75 72 72 65 6e 74 6d 61 72 6b 2.1 {currentmark
4b90: 75 70 20 6d 65 74 68 6f 64 7d 20 7b 0a 20 20 20 up method} {.
4ba0: 20 63 61 74 63 68 20 7b 75 6e 73 65 74 20 72 65 catch {unset re
4bb0: 73 75 6c 74 7d 0a 20 20 20 20 73 65 74 20 72 65 sult}. set re
4bc0: 73 75 6c 74 20 22 22 0a 20 20 20 20 73 65 74 20 sult "". set
4bd0: 70 20 5b 65 78 70 61 74 20 70 61 72 73 65 72 2d p [expat parser-
4be0: 31 32 2e 31 5d 0a 20 20 20 20 24 70 20 63 6f 6e 12.1]. $p con
4bf0: 66 69 67 75 72 65 20 5c 0a 20 20 20 20 20 20 20 figure \.
4c00: 20 2d 65 6c 65 6d 65 6e 74 73 74 61 72 74 63 6f -elementstartco
4c10: 6d 6d 61 6e 64 20 5b 6c 69 73 74 20 65 6c 65 6d mmand [list elem
4c20: 65 6e 74 73 74 61 72 74 2d 31 32 2e 31 20 24 70 entstart-12.1 $p
4c30: 5d 20 5c 0a 20 20 20 20 20 20 20 20 2d 65 6c 65 ] \. -ele
4c40: 6d 65 6e 74 65 6e 64 63 6f 6d 6d 61 6e 64 20 5b mentendcommand [
4c50: 6c 69 73 74 20 65 6c 65 6d 65 6e 74 65 6e 64 2d list elementend-
4c60: 31 32 2e 31 20 24 70 5d 0a 20 20 20 20 24 70 20 12.1 $p]. $p
4c70: 70 61 72 73 65 20 7b 3c 72 6f 6f 74 20 72 6f 6f parse {<root roo
4c80: 74 61 74 74 3d 22 72 6f 6f 74 61 74 74 22 3e 74 tatt="rootatt">t
4c90: 65 78 74 3c 61 0a 20 20 20 20 20 20 20 20 61 5f ext<a. a_
4ca0: 61 74 74 31 3d 22 61 5f 61 74 74 31 22 0a 20 20 att1="a_att1".
4cb0: 20 20 20 20 20 20 61 5f 61 74 74 32 20 3d 20 22 a_att2 = "
4cc0: 61 5f 61 74 74 32 22 2f 3e 3c 62 3e 6d 6f 72 65 a_att2"/><b>more
4cd0: 20 74 65 78 74 3c 2f 62 3e 3c 2f 72 6f 6f 74 3e text</b></root>
4ce0: 7d 0a 20 20 20 20 24 70 20 66 72 65 65 0a 20 20 }. $p free.
4cf0: 20 20 73 65 74 20 72 65 73 75 6c 74 0a 7d 20 7b set result.} {
4d00: 3c 72 6f 6f 74 20 72 6f 6f 74 61 74 74 3d 22 72 <root rootatt="r
4d10: 6f 6f 74 61 74 74 22 3e 3c 61 0a 20 20 20 20 20 ootatt"><a.
4d20: 20 20 20 61 5f 61 74 74 31 3d 22 61 5f 61 74 74 a_att1="a_att
4d30: 31 22 0a 20 20 20 20 20 20 20 20 61 5f 61 74 74 1". a_att
4d40: 32 20 3d 20 22 61 5f 61 74 74 32 22 2f 3e 3c 62 2 = "a_att2"/><b
4d50: 3e 3c 2f 62 3e 3c 2f 72 6f 6f 74 3e 7d 0a 0a 70 ></b></root>}..p
4d60: 72 6f 63 20 63 68 61 72 61 63 74 65 72 64 61 74 roc characterdat
4d70: 61 2d 31 32 2e 32 20 7b 70 61 72 73 65 72 20 64 a-12.2 {parser d
4d80: 61 74 61 7d 20 7b 0a 20 20 20 20 67 6c 6f 62 61 ata} {. globa
4d90: 6c 20 72 65 73 75 6c 74 0a 20 20 20 20 61 70 70 l result. app
4da0: 65 6e 64 20 72 65 73 75 6c 74 20 5b 24 70 61 72 end result [$par
4db0: 73 65 72 20 63 75 72 72 65 6e 74 6d 61 72 6b 75 ser currentmarku
4dc0: 70 5d 0a 7d 0a 74 65 73 74 20 70 61 72 73 65 72 p].}.test parser
4dd0: 2d 31 32 2e 32 20 7b 63 75 72 72 65 6e 74 6d 61 -12.2 {currentma
4de0: 72 6b 75 70 20 6d 65 74 68 6f 64 7d 20 7b 0a 20 rkup method} {.
4df0: 20 20 20 63 61 74 63 68 20 7b 75 6e 73 65 74 20 catch {unset
4e00: 72 65 73 75 6c 74 7d 0a 20 20 20 20 73 65 74 20 result}. set
4e10: 72 65 73 75 6c 74 20 22 22 0a 20 20 20 20 73 65 result "". se
4e20: 74 20 70 20 5b 65 78 70 61 74 20 70 61 72 73 65 t p [expat parse
4e30: 72 2d 31 32 2e 32 5d 0a 20 20 20 20 24 70 20 63 r-12.2]. $p c
4e40: 6f 6e 66 69 67 75 72 65 20 5c 0a 20 20 20 20 20 onfigure \.
4e50: 20 20 20 2d 63 68 61 72 61 63 74 65 72 64 61 74 -characterdat
4e60: 61 63 6f 6d 6d 61 6e 64 20 5b 6c 69 73 74 20 63 acommand [list c
4e70: 68 61 72 61 63 74 65 72 64 61 74 61 2d 31 32 2e haracterdata-12.
4e80: 32 20 24 70 5d 20 0a 20 20 20 20 24 70 20 70 61 2 $p] . $p pa
4e90: 72 73 65 20 7b 3c 72 6f 6f 74 20 72 6f 6f 74 61 rse {<root roota
4ea0: 74 74 3d 22 72 6f 6f 74 61 74 74 22 3e 74 65 78 tt="rootatt">tex
4eb0: 74 3c 61 0a 20 20 20 20 20 20 20 20 61 5f 61 74 t<a. a_at
4ec0: 74 31 3d 22 61 5f 61 74 74 31 22 0a 20 20 20 20 t1="a_att1".
4ed0: 20 20 20 20 61 5f 61 74 74 32 20 3d 20 22 61 5f a_att2 = "a_
4ee0: 61 74 74 32 22 2f 3e 3c 62 3e 6d 6f 72 65 20 74 att2"/><b>more t
4ef0: 65 78 74 3c 2f 62 3e 3c 2f 72 6f 6f 74 3e 7d 0a ext</b></root>}.
4f00: 20 20 20 20 24 70 20 66 72 65 65 0a 20 20 20 20 $p free.
4f10: 73 65 74 20 72 65 73 75 6c 74 0a 7d 20 7b 7d 0a set result.} {}.
4f20: 0a 74 65 73 74 20 70 61 72 73 65 72 2d 31 32 2e .test parser-12.
4f30: 33 20 7b 63 75 72 72 65 6e 74 6d 61 72 6b 75 70 3 {currentmarkup
4f40: 20 6d 65 74 68 6f 64 7d 20 7b 0a 20 20 20 20 73 method} {. s
4f50: 65 74 20 70 20 5b 65 78 70 61 74 20 70 61 72 73 et p [expat pars
4f60: 65 72 2d 31 32 2e 33 5d 0a 20 20 20 20 73 65 74 er-12.3]. set
4f70: 20 72 65 73 75 6c 74 20 5b 24 70 20 63 75 72 72 result [$p curr
4f80: 65 6e 74 6d 61 72 6b 75 70 5d 0a 20 20 20 20 24 entmarkup]. $
4f90: 70 20 66 72 65 65 0a 20 20 20 20 73 65 74 20 72 p free. set r
4fa0: 65 73 75 6c 74 0a 7d 20 7b 7d 0a 0a 70 72 6f 63 esult.} {}..proc
4fb0: 20 65 6c 65 6d 65 6e 74 73 74 61 72 74 2d 31 32 elementstart-12
4fc0: 2e 34 20 7b 70 61 72 73 65 72 20 68 61 6e 64 6c .4 {parser handl
4fd0: 65 72 73 65 74 20 61 72 67 73 7d 20 7b 0a 20 20 erset args} {.
4fe0: 20 20 67 6c 6f 62 61 6c 20 72 65 73 75 6c 74 0a global result.
4ff0: 20 20 20 20 61 70 70 65 6e 64 20 72 65 73 75 6c append resul
5000: 74 20 22 24 68 61 6e 64 6c 65 72 73 65 74 3a 20 t "$handlerset:
5010: 5b 24 70 61 72 73 65 72 20 63 75 72 72 65 6e 74 [$parser current
5020: 6d 61 72 6b 75 70 5d 5c 6e 22 0a 7d 0a 70 72 6f markup]\n".}.pro
5030: 63 20 65 6c 65 6d 65 6e 74 65 6e 64 2d 31 32 2e c elementend-12.
5040: 34 20 7b 70 61 72 73 65 72 20 68 61 6e 64 6c 65 4 {parser handle
5050: 72 73 65 74 20 61 72 67 73 7d 20 7b 0a 20 20 20 rset args} {.
5060: 20 67 6c 6f 62 61 6c 20 72 65 73 75 6c 74 0a 20 global result.
5070: 20 20 20 61 70 70 65 6e 64 20 72 65 73 75 6c 74 append result
5080: 20 22 24 68 61 6e 64 6c 65 72 73 65 74 3a 20 5b "$handlerset: [
5090: 24 70 61 72 73 65 72 20 63 75 72 72 65 6e 74 6d $parser currentm
50a0: 61 72 6b 75 70 5d 5c 6e 22 0a 7d 0a 74 65 73 74 arkup]\n".}.test
50b0: 20 70 61 72 73 65 72 2d 31 32 2e 34 20 7b 63 75 parser-12.4 {cu
50c0: 72 72 65 6e 74 6d 61 72 6b 75 70 20 6d 65 74 68 rrentmarkup meth
50d0: 6f 64 20 2d 20 6d 75 6c 74 69 70 6c 65 20 68 61 od - multiple ha
50e0: 6e 64 6c 65 72 20 73 65 74 7d 20 7b 0a 20 20 20 ndler set} {.
50f0: 20 63 61 74 63 68 20 7b 75 6e 73 65 74 20 72 65 catch {unset re
5100: 73 75 6c 74 7d 0a 20 20 20 20 73 65 74 20 72 65 sult}. set re
5110: 73 75 6c 74 20 22 22 0a 20 20 20 20 73 65 74 20 sult "". set
5120: 70 20 5b 65 78 70 61 74 20 70 61 72 73 65 72 2d p [expat parser-
5130: 31 32 2e 34 5d 0a 20 20 20 20 24 70 20 63 6f 6e 12.4]. $p con
5140: 66 69 67 75 72 65 20 5c 0a 20 20 20 20 20 20 20 figure \.
5150: 20 2d 65 6c 65 6d 65 6e 74 73 74 61 72 74 63 6f -elementstartco
5160: 6d 6d 61 6e 64 20 5b 6c 69 73 74 20 65 6c 65 6d mmand [list elem
5170: 65 6e 74 73 74 61 72 74 2d 31 32 2e 34 20 24 70 entstart-12.4 $p
5180: 20 64 65 66 61 75 6c 74 5d 20 5c 0a 20 20 20 20 default] \.
5190: 20 20 20 20 2d 65 6c 65 6d 65 6e 74 65 6e 64 63 -elementendc
51a0: 6f 6d 6d 61 6e 64 20 5b 6c 69 73 74 20 65 6c 65 ommand [list ele
51b0: 6d 65 6e 74 65 6e 64 2d 31 32 2e 34 20 24 70 20 mentend-12.4 $p
51c0: 64 65 66 61 75 6c 74 5d 20 5c 0a 20 20 20 20 20 default] \.
51d0: 20 20 20 2d 68 61 6e 64 6c 65 72 73 65 74 20 22 -handlerset "
51e0: 61 64 64 69 74 69 6f 6e 61 6c 22 20 5c 0a 20 20 additional" \.
51f0: 20 20 20 20 20 20 2d 65 6c 65 6d 65 6e 74 73 74 -elementst
5200: 61 72 74 63 6f 6d 6d 61 6e 64 20 5b 6c 69 73 74 artcommand [list
5210: 20 65 6c 65 6d 65 6e 74 73 74 61 72 74 2d 31 32 elementstart-12
5220: 2e 34 20 24 70 20 22 61 64 64 69 74 69 6f 6e 61 .4 $p "additiona
5230: 6c 22 5d 20 5c 0a 20 20 20 20 20 20 20 20 2d 65 l"] \. -e
5240: 6c 65 6d 65 6e 74 65 6e 64 63 6f 6d 6d 61 6e 64 lementendcommand
5250: 20 5b 6c 69 73 74 20 65 6c 65 6d 65 6e 74 65 6e [list elementen
5260: 64 2d 31 32 2e 34 20 24 70 20 22 61 64 64 69 74 d-12.4 $p "addit
5270: 69 6f 6e 61 6c 22 5d 0a 20 20 20 20 24 70 20 70 ional"]. $p p
5280: 61 72 73 65 20 7b 3c 72 6f 6f 74 20 72 6f 6f 74 arse {<root root
5290: 61 74 74 3d 22 72 6f 6f 74 61 74 74 22 3e 74 65 att="rootatt">te
52a0: 78 74 3c 61 0a 20 20 20 20 20 20 20 20 61 5f 61 xt<a. a_a
52b0: 74 74 31 3d 22 61 5f 61 74 74 31 22 0a 20 20 20 tt1="a_att1".
52c0: 20 20 20 20 20 61 5f 61 74 74 32 20 3d 20 22 61 a_att2 = "a
52d0: 5f 61 74 74 32 22 2f 3e 3c 62 3e 6d 6f 72 65 20 _att2"/><b>more
52e0: 74 65 78 74 3c 2f 62 3e 3c 2f 72 6f 6f 74 3e 7d text</b></root>}
52f0: 0a 20 20 20 20 24 70 20 66 72 65 65 0a 20 20 20 . $p free.
5300: 20 73 65 74 20 72 65 73 75 6c 74 0a 7d 20 7b 64 set result.} {d
5310: 65 66 61 75 6c 74 3a 20 3c 72 6f 6f 74 20 72 6f efault: <root ro
5320: 6f 74 61 74 74 3d 22 72 6f 6f 74 61 74 74 22 3e otatt="rootatt">
5330: 0a 61 64 64 69 74 69 6f 6e 61 6c 3a 20 3c 72 6f .additional: <ro
5340: 6f 74 20 72 6f 6f 74 61 74 74 3d 22 72 6f 6f 74 ot rootatt="root
5350: 61 74 74 22 3e 0a 64 65 66 61 75 6c 74 3a 20 3c att">.default: <
5360: 61 0a 20 20 20 20 20 20 20 20 61 5f 61 74 74 31 a. a_att1
5370: 3d 22 61 5f 61 74 74 31 22 0a 20 20 20 20 20 20 ="a_att1".
5380: 20 20 61 5f 61 74 74 32 20 3d 20 22 61 5f 61 74 a_att2 = "a_at
5390: 74 32 22 2f 3e 0a 61 64 64 69 74 69 6f 6e 61 6c t2"/>.additional
53a0: 3a 20 3c 61 0a 20 20 20 20 20 20 20 20 61 5f 61 : <a. a_a
53b0: 74 74 31 3d 22 61 5f 61 74 74 31 22 0a 20 20 20 tt1="a_att1".
53c0: 20 20 20 20 20 61 5f 61 74 74 32 20 3d 20 22 61 a_att2 = "a
53d0: 5f 61 74 74 32 22 2f 3e 0a 64 65 66 61 75 6c 74 _att2"/>.default
53e0: 3a 20 0a 61 64 64 69 74 69 6f 6e 61 6c 3a 20 0a : .additional: .
53f0: 64 65 66 61 75 6c 74 3a 20 3c 62 3e 0a 61 64 64 default: <b>.add
5400: 69 74 69 6f 6e 61 6c 3a 20 3c 62 3e 0a 64 65 66 itional: <b>.def
5410: 61 75 6c 74 3a 20 3c 2f 62 3e 0a 61 64 64 69 74 ault: </b>.addit
5420: 69 6f 6e 61 6c 3a 20 3c 2f 62 3e 0a 64 65 66 61 ional: </b>.defa
5430: 75 6c 74 3a 20 3c 2f 72 6f 6f 74 3e 0a 61 64 64 ult: </root>.add
5440: 69 74 69 6f 6e 61 6c 3a 20 3c 2f 72 6f 6f 74 3e itional: </root>
5450: 0a 7d 0a 0a 70 72 6f 63 20 65 6c 65 6d 65 6e 74 .}..proc element
5460: 73 74 61 72 74 2d 31 32 2e 35 20 7b 70 61 72 73 start-12.5 {pars
5470: 65 72 20 61 72 67 73 7d 20 7b 0a 20 20 20 20 67 er args} {. g
5480: 6c 6f 62 61 6c 20 72 65 73 75 6c 74 0a 20 20 20 lobal result.
5490: 20 61 70 70 65 6e 64 20 72 65 73 75 6c 74 20 22 append result "
54a0: 5b 24 70 61 72 73 65 72 20 63 75 72 72 65 6e 74 [$parser current
54b0: 6d 61 72 6b 75 70 5d 22 0a 7d 0a 74 65 73 74 20 markup]".}.test
54c0: 70 61 72 73 65 72 2d 31 32 2e 35 20 7b 63 75 72 parser-12.5 {cur
54d0: 72 65 6e 74 6d 61 72 6b 75 70 20 6d 65 74 68 6f rentmarkup metho
54e0: 64 20 2d 20 65 6d 70 74 79 20 65 6c 65 6d 65 6e d - empty elemen
54f0: 74 20 73 68 6f 72 74 63 75 74 20 2d 65 6c 65 6d t shortcut -elem
5500: 65 6e 74 73 74 61 72 74 63 6f 6d 6d 61 6e 64 7d entstartcommand}
5510: 20 7b 0a 20 20 20 20 63 61 74 63 68 20 7b 75 6e {. catch {un
5520: 73 65 74 20 72 65 73 75 6c 74 7d 0a 20 20 20 20 set result}.
5530: 73 65 74 20 72 65 73 75 6c 74 20 22 22 0a 20 20 set result "".
5540: 20 20 73 65 74 20 70 20 5b 65 78 70 61 74 20 70 set p [expat p
5550: 61 72 73 65 72 2d 31 32 2e 35 5d 0a 20 20 20 20 arser-12.5].
5560: 24 70 20 63 6f 6e 66 69 67 75 72 65 20 5c 0a 20 $p configure \.
5570: 20 20 20 20 20 20 20 2d 65 6c 65 6d 65 6e 74 73 -elements
5580: 74 61 72 74 63 6f 6d 6d 61 6e 64 20 5b 6c 69 73 tartcommand [lis
5590: 74 20 65 6c 65 6d 65 6e 74 73 74 61 72 74 2d 31 t elementstart-1
55a0: 32 2e 35 20 24 70 5d 20 0a 20 20 20 20 24 70 20 2.5 $p] . $p
55b0: 70 61 72 73 65 20 7b 3c 72 6f 6f 74 3e 3c 65 6c parse {<root><el
55c0: 65 6d 2f 3e 3c 2f 72 6f 6f 74 3e 7d 0a 20 20 20 em/></root>}.
55d0: 20 24 70 20 66 72 65 65 0a 20 20 20 20 73 65 74 $p free. set
55e0: 20 72 65 73 75 6c 74 0a 7d 20 7b 3c 72 6f 6f 74 result.} {<root
55f0: 3e 3c 65 6c 65 6d 2f 3e 7d 0a 0a 70 72 6f 63 20 ><elem/>}..proc
5600: 65 6c 65 6d 65 6e 74 65 6e 64 2d 31 32 2e 36 20 elementend-12.6
5610: 7b 70 61 72 73 65 72 20 61 72 67 73 7d 20 7b 0a {parser args} {.
5620: 20 20 20 20 67 6c 6f 62 61 6c 20 72 65 73 75 6c global resul
5630: 74 0a 20 20 20 20 69 66 20 7b 5b 24 70 61 72 73 t. if {[$pars
5640: 65 72 20 63 75 72 72 65 6e 74 6d 61 72 6b 75 70 er currentmarkup
5650: 5d 20 65 71 20 22 22 7d 20 7b 0a 20 20 20 20 20 ] eq ""} {.
5660: 20 20 20 61 70 70 65 6e 64 20 72 65 73 75 6c 74 append result
5670: 20 22 3c 65 6c 65 6d 65 6e 74 65 6e 64 20 63 61 "<elementend ca
5680: 6c 6c 65 64 2c 20 62 75 74 20 63 75 72 72 65 6e lled, but curren
5690: 74 6d 61 72 6b 75 70 20 72 65 74 75 72 6e 20 65 tmarkup return e
56a0: 6d 70 74 79 20 73 74 72 69 6e 67 3e 22 0a 20 20 mpty string>".
56b0: 20 20 7d 0a 20 20 20 20 61 70 70 65 6e 64 20 72 }. append r
56c0: 65 73 75 6c 74 20 22 5b 24 70 61 72 73 65 72 20 esult "[$parser
56d0: 63 75 72 72 65 6e 74 6d 61 72 6b 75 70 5d 22 0a currentmarkup]".
56e0: 7d 0a 74 65 73 74 20 70 61 72 73 65 72 2d 31 32 }.test parser-12
56f0: 2e 36 20 7b 63 75 72 72 65 6e 74 6d 61 72 6b 75 .6 {currentmarku
5700: 70 20 6d 65 74 68 6f 64 20 2d 20 65 6d 70 74 79 p method - empty
5710: 20 65 6c 65 6d 65 6e 74 20 73 68 6f 72 74 63 75 element shortcu
5720: 74 20 2d 65 6c 65 6d 65 6e 74 65 6e 64 63 6f 6d t -elementendcom
5730: 6d 61 6e 64 7d 20 7b 0a 20 20 20 20 63 61 74 63 mand} {. catc
5740: 68 20 7b 75 6e 73 65 74 20 72 65 73 75 6c 74 7d h {unset result}
5750: 0a 20 20 20 20 73 65 74 20 72 65 73 75 6c 74 20 . set result
5760: 22 22 0a 20 20 20 20 73 65 74 20 70 20 5b 65 78 "". set p [ex
5770: 70 61 74 20 70 61 72 73 65 72 2d 31 32 2e 36 5d pat parser-12.6]
5780: 0a 20 20 20 20 24 70 20 63 6f 6e 66 69 67 75 72 . $p configur
5790: 65 20 5c 0a 20 20 20 20 20 20 20 20 2d 65 6c 65 e \. -ele
57a0: 6d 65 6e 74 65 6e 64 63 6f 6d 6d 61 6e 64 20 5b mentendcommand [
57b0: 6c 69 73 74 20 65 6c 65 6d 65 6e 74 65 6e 64 2d list elementend-
57c0: 31 32 2e 36 20 24 70 5d 20 0a 20 20 20 20 24 70 12.6 $p] . $p
57d0: 20 70 61 72 73 65 20 7b 3c 72 6f 6f 74 3e 3c 65 parse {<root><e
57e0: 6c 65 6d 2f 3e 3c 2f 72 6f 6f 74 3e 7d 0a 20 20 lem/></root>}.
57f0: 20 20 24 70 20 66 72 65 65 0a 20 20 20 20 73 65 $p free. se
5800: 74 20 72 65 73 75 6c 74 0a 7d 20 7b 3c 65 6c 65 t result.} {<ele
5810: 6d 65 6e 74 65 6e 64 20 63 61 6c 6c 65 64 2c 20 mentend called,
5820: 62 75 74 20 63 75 72 72 65 6e 74 6d 61 72 6b 75 but currentmarku
5830: 70 20 72 65 74 75 72 6e 20 65 6d 70 74 79 20 73 p return empty s
5840: 74 72 69 6e 67 3e 3c 2f 72 6f 6f 74 3e 7d 0a 20 tring></root>}.
5850: 20 20 20 0a 66 6f 72 65 61 63 68 20 70 61 72 73 .foreach pars
5860: 65 72 20 5b 69 6e 66 6f 20 63 6f 6d 6d 61 6e 64 er [info command
5870: 73 20 78 6d 6c 70 61 72 73 65 72 2a 5d 20 7b 0a s xmlparser*] {.
5880: 20 20 20 20 24 70 61 72 73 65 72 20 66 72 65 65 $parser free
5890: 0a 7d 0a 66 6f 72 65 61 63 68 20 70 61 72 73 65 .}.foreach parse
58a0: 72 20 5b 69 6e 66 6f 20 63 6f 6d 6d 61 6e 64 73 r [info commands
58b0: 20 70 61 72 73 65 72 2d 2a 5d 20 7b 0a 20 20 20 parser-*] {.
58c0: 20 24 70 61 72 73 65 72 20 66 72 65 65 0a 7d 0a $parser free.}.
58d0: 0a 70 72 6f 63 20 65 6c 65 6d 65 6e 74 64 65 63 .proc elementdec
58e0: 6c 63 6f 6d 6d 61 6e 64 2d 31 32 2e 37 20 7b 70 lcommand-12.7 {p
58f0: 61 72 73 65 72 20 61 72 67 73 7d 20 7b 0a 20 20 arser args} {.
5900: 20 20 67 6c 6f 62 61 6c 20 72 65 73 75 6c 74 0a global result.
5910: 20 20 20 20 61 70 70 65 6e 64 20 72 65 73 75 6c append resul
5920: 74 20 22 65 6c 65 6d 65 6e 74 64 65 63 6c 63 6f t "elementdeclco
5930: 6d 6d 61 6e 64 3a 20 5b 24 70 61 72 73 65 72 20 mmand: [$parser
5940: 63 75 72 72 65 6e 74 6d 61 72 6b 75 70 5d 22 0a currentmarkup]".
5950: 7d 0a 0a 70 72 6f 63 20 65 6e 74 69 74 79 64 65 }..proc entityde
5960: 63 6c 63 6f 6d 6d 61 6e 64 2d 31 32 2e 37 20 7b clcommand-12.7 {
5970: 70 61 72 73 65 72 20 61 72 67 73 7d 20 7b 0a 20 parser args} {.
5980: 20 20 20 67 6c 6f 62 61 6c 20 72 65 73 75 6c 74 global result
5990: 0a 20 20 20 20 61 70 70 65 6e 64 20 72 65 73 75 . append resu
59a0: 6c 74 20 22 65 6e 74 69 74 79 64 65 63 6c 63 6f lt "entitydeclco
59b0: 6d 6d 61 6e 64 3a 20 5b 24 70 61 72 73 65 72 20 mmand: [$parser
59c0: 63 75 72 72 65 6e 74 6d 61 72 6b 75 70 5d 22 0a currentmarkup]".
59d0: 7d 0a 0a 74 65 73 74 20 70 61 72 73 65 72 2d 31 }..test parser-1
59e0: 32 2e 37 20 7b 63 75 72 72 65 6e 74 6d 61 72 6b 2.7 {currentmark
59f0: 75 70 20 6d 65 74 68 6f 64 20 2d 20 6e 6f 74 20 up method - not
5a00: 66 6f 72 20 64 6f 63 74 79 70 65 20 6d 61 72 6b for doctype mark
5a10: 75 70 20 68 61 6e 64 6c 65 72 7d 20 7b 0a 20 20 up handler} {.
5a20: 20 20 63 61 74 63 68 20 7b 75 6e 73 65 74 20 72 catch {unset r
5a30: 65 73 75 6c 74 7d 0a 20 20 20 20 73 65 74 20 72 esult}. set r
5a40: 65 73 75 6c 74 20 22 22 0a 20 20 20 20 73 65 74 esult "". set
5a50: 20 70 20 5b 65 78 70 61 74 20 70 61 72 73 65 72 p [expat parser
5a60: 2d 31 32 2e 37 5d 0a 20 20 20 20 24 70 20 63 6f -12.7]. $p co
5a70: 6e 66 69 67 75 72 65 20 5c 0a 20 20 20 20 20 20 nfigure \.
5a80: 20 20 2d 65 6c 65 6d 65 6e 74 64 65 63 6c 63 6f -elementdeclco
5a90: 6d 6d 61 6e 64 20 5b 6c 69 73 74 20 65 6c 65 6d mmand [list elem
5aa0: 65 6e 74 64 65 63 6c 63 6f 6d 6d 61 6e 64 2d 31 entdeclcommand-1
5ab0: 32 2e 37 20 24 70 5d 20 5c 0a 20 20 20 20 20 20 2.7 $p] \.
5ac0: 20 20 2d 65 6e 74 69 74 79 64 65 63 6c 63 6f 6d -entitydeclcom
5ad0: 6d 61 6e 64 20 5b 6c 69 73 74 20 65 6e 74 69 74 mand [list entit
5ae0: 79 64 65 63 6c 63 6f 6d 6d 61 6e 64 2d 31 32 2e ydeclcommand-12.
5af0: 37 20 24 70 5d 0a 20 20 20 20 24 70 20 70 61 72 7 $p]. $p par
5b00: 73 65 20 7b 3c 21 44 4f 43 54 59 50 45 20 74 65 se {<!DOCTYPE te
5b10: 73 74 20 5b 0a 3c 21 45 4c 45 4d 45 4e 54 20 74 st [.<!ELEMENT t
5b20: 65 73 74 20 28 23 50 43 44 41 54 41 29 20 3e 0a est (#PCDATA) >.
5b30: 3c 21 45 4e 54 49 54 59 20 25 20 78 78 20 27 26 <!ENTITY % xx '&
5b40: 23 33 37 3b 7a 7a 3b 27 3e 0a 3c 21 45 4e 54 49 #37;zz;'>.<!ENTI
5b50: 54 59 20 25 20 7a 7a 20 27 26 23 36 30 3b 21 45 TY % zz '<!E
5b60: 4e 54 49 54 59 20 74 72 69 63 6b 79 20 22 65 72 NTITY tricky "er
5b70: 72 6f 72 2d 70 72 6f 6e 65 22 20 3e 27 20 3e 0a ror-prone" >' >.
5b80: 25 78 78 3b 0a 5d 3e 0a 3c 74 65 73 74 3e 54 68 %xx;.]>.<test>Th
5b90: 69 73 20 73 61 6d 70 6c 65 20 73 68 6f 77 73 20 is sample shows
5ba0: 61 20 26 74 72 69 63 6b 79 3b 20 6d 65 74 68 6f a &tricky; metho
5bb0: 64 2e 3c 2f 74 65 73 74 3e 7d 0a 20 20 20 20 24 d.</test>}. $
5bc0: 70 20 66 72 65 65 0a 20 20 20 20 73 65 74 20 72 p free. set r
5bd0: 65 73 75 6c 74 0a 7d 20 7b 65 6c 65 6d 65 6e 74 esult.} {element
5be0: 64 65 63 6c 63 6f 6d 6d 61 6e 64 3a 20 65 6e 74 declcommand: ent
5bf0: 69 74 79 64 65 63 6c 63 6f 6d 6d 61 6e 64 3a 20 itydeclcommand:
5c00: 65 6e 74 69 74 79 64 65 63 6c 63 6f 6d 6d 61 6e entitydeclcomman
5c10: 64 3a 20 7d 0a 0a 70 72 6f 63 20 70 69 2d 31 32 d: }..proc pi-12
5c20: 2e 38 20 7b 70 61 72 73 65 72 20 61 72 67 73 7d .8 {parser args}
5c30: 20 7b 0a 20 20 20 20 67 6c 6f 62 61 6c 20 72 65 {. global re
5c40: 73 75 6c 74 0a 20 20 20 20 61 70 70 65 6e 64 20 sult. append
5c50: 72 65 73 75 6c 74 20 22 70 69 3a 20 5b 24 70 61 result "pi: [$pa
5c60: 72 73 65 72 20 63 75 72 72 65 6e 74 6d 61 72 6b rser currentmark
5c70: 75 70 5d 22 0a 7d 0a 74 65 73 74 20 70 61 72 73 up]".}.test pars
5c80: 65 72 2d 31 32 2e 38 20 7b 63 75 72 72 65 6e 74 er-12.8 {current
5c90: 6d 61 72 6b 75 70 20 6d 65 74 68 6f 64 20 2d 20 markup method -
5ca0: 70 72 6f 63 65 73 73 69 6e 67 20 69 6e 73 74 72 processing instr
5cb0: 75 63 74 69 6f 6e 7d 20 7b 0a 20 20 20 20 63 61 uction} {. ca
5cc0: 74 63 68 20 7b 75 6e 73 65 74 20 72 65 73 75 6c tch {unset resul
5cd0: 74 7d 0a 20 20 20 20 73 65 74 20 72 65 73 75 6c t}. set resul
5ce0: 74 20 22 22 0a 20 20 20 20 73 65 74 20 70 20 5b t "". set p [
5cf0: 65 78 70 61 74 20 70 61 72 73 65 72 2d 31 32 2e expat parser-12.
5d00: 38 5d 0a 20 20 20 20 24 70 20 63 6f 6e 66 69 67 8]. $p config
5d10: 75 72 65 20 5c 0a 20 20 20 20 20 20 20 20 2d 70 ure \. -p
5d20: 72 6f 63 65 73 73 69 6e 67 69 6e 73 74 72 75 63 rocessinginstruc
5d30: 74 69 6f 6e 63 6f 6d 6d 61 6e 64 20 5b 6c 69 73 tioncommand [lis
5d40: 74 20 70 69 2d 31 32 2e 38 20 24 70 5d 0a 20 20 t pi-12.8 $p].
5d50: 20 20 24 70 20 70 61 72 73 65 20 7b 3c 64 6f 63 $p parse {<doc
5d60: 3e 3c 3f 78 6d 6c 2d 73 74 79 6c 65 73 68 65 65 ><?xml-styleshee
5d70: 74 20 74 79 70 65 3d 22 74 65 78 74 2f 78 73 6c t type="text/xsl
5d80: 22 20 68 72 65 66 3d 22 73 74 79 6c 65 2e 78 73 " href="style.xs
5d90: 6c 22 3f 3e 3c 2f 64 6f 63 3e 7d 0a 20 20 20 20 l"?></doc>}.
5da0: 24 70 20 66 72 65 65 0a 20 20 20 20 73 65 74 20 $p free. set
5db0: 72 65 73 75 6c 74 0a 7d 20 7b 70 69 3a 20 3c 3f result.} {pi: <?
5dc0: 78 6d 6c 2d 73 74 79 6c 65 73 68 65 65 74 20 74 xml-stylesheet t
5dd0: 79 70 65 3d 22 74 65 78 74 2f 78 73 6c 22 20 68 ype="text/xsl" h
5de0: 72 65 66 3d 22 73 74 79 6c 65 2e 78 73 6c 22 3f ref="style.xsl"?
5df0: 3e 7d 0a 0a 70 72 6f 63 20 63 6f 6d 6d 65 6e 74 >}..proc comment
5e00: 2d 31 32 2e 39 20 7b 70 61 72 73 65 72 20 61 72 -12.9 {parser ar
5e10: 67 73 7d 20 7b 0a 20 20 20 20 67 6c 6f 62 61 6c gs} {. global
5e20: 20 72 65 73 75 6c 74 0a 20 20 20 20 61 70 70 65 result. appe
5e30: 6e 64 20 72 65 73 75 6c 74 20 22 63 6f 6d 6d 65 nd result "comme
5e40: 6e 74 3a 20 5b 24 70 61 72 73 65 72 20 63 75 72 nt: [$parser cur
5e50: 72 65 6e 74 6d 61 72 6b 75 70 5d 22 0a 7d 0a 74 rentmarkup]".}.t
5e60: 65 73 74 20 70 61 72 73 65 72 2d 31 32 2e 39 20 est parser-12.9
5e70: 7b 63 75 72 72 65 6e 74 6d 61 72 6b 75 70 20 6d {currentmarkup m
5e80: 65 74 68 6f 64 20 2d 20 63 6f 6d 6d 65 6e 74 7d ethod - comment}
5e90: 20 7b 0a 20 20 20 20 63 61 74 63 68 20 7b 75 6e {. catch {un
5ea0: 73 65 74 20 72 65 73 75 6c 74 7d 0a 20 20 20 20 set result}.
5eb0: 73 65 74 20 72 65 73 75 6c 74 20 22 22 0a 20 20 set result "".
5ec0: 20 20 73 65 74 20 70 20 5b 65 78 70 61 74 20 70 set p [expat p
5ed0: 61 72 73 65 72 2d 31 32 2e 39 5d 0a 20 20 20 20 arser-12.9].
5ee0: 24 70 20 63 6f 6e 66 69 67 75 72 65 20 5c 0a 20 $p configure \.
5ef0: 20 20 20 20 20 20 20 2d 63 6f 6d 6d 65 6e 74 63 -commentc
5f00: 6f 6d 6d 61 6e 64 20 5b 6c 69 73 74 20 63 6f 6d ommand [list com
5f10: 6d 65 6e 74 2d 31 32 2e 39 20 24 70 5d 0a 20 20 ment-12.9 $p].
5f20: 20 20 24 70 20 70 61 72 73 65 20 7b 3c 64 6f 63 $p parse {<doc
5f30: 3e 3c 21 2d 2d 20 41 20 63 6f 6d 6d 65 6e 74 20 ><!-- A comment
5f40: 2d 2d 3e 3c 2f 64 6f 63 3e 7d 0a 20 20 20 20 24 --></doc>}. $
5f50: 70 20 66 72 65 65 0a 20 20 20 20 73 65 74 20 72 p free. set r
5f60: 65 73 75 6c 74 0a 7d 20 7b 63 6f 6d 6d 65 6e 74 esult.} {comment
5f70: 3a 20 3c 21 2d 2d 20 41 20 63 6f 6d 6d 65 6e 74 : <!-- A comment
5f80: 20 2d 2d 3e 7d 0a 0a 0a 74 65 73 74 20 70 61 72 -->}...test par
5f90: 73 65 72 2d 31 33 2e 30 20 7b 6e 6f 2d 62 75 6c ser-13.0 {no-bul
5fa0: 6b 20 70 61 72 73 69 6e 67 20 2d 20 65 72 72 6f k parsing - erro
5fb0: 72 20 62 79 20 32 6e 64 20 58 4d 4c 7d 20 2d 62 r by 2nd XML} -b
5fc0: 6f 64 79 20 7b 0a 20 20 20 20 73 65 74 20 70 20 ody {. set p
5fd0: 5b 78 6d 6c 3a 3a 70 61 72 73 65 72 20 2d 66 69 [xml::parser -fi
5fe0: 6e 61 6c 20 31 5d 0a 20 20 20 20 24 70 20 70 61 nal 1]. $p pa
5ff0: 72 73 65 20 7b 3c 58 20 69 64 3d 22 31 22 3e 3c rse {<X id="1"><
6000: 61 3e 3c 62 3e 3c 2f 62 3e 3c 2f 61 3e 3c 2f 58 a><b></b></a></X
6010: 3e 20 20 3c 59 20 69 64 3d 22 32 22 3e 3c 63 3e > <Y id="2"><c>
6020: 3c 64 3e 3c 2f 64 3e 3c 2f 63 3e 3c 2f 59 3e 20 <d></d></c></Y>
6030: 20 3c 5a 20 69 64 3d 22 33 22 3e 3c 65 3e 3c 66 <Z id="3"><e><f
6040: 3e 2b 32 3c 2f 66 3e 3c 2f 65 3e 3c 2f 5a 3e 20 >+2</f></e></Z>
6050: 20 7d 0a 7d 20 2d 63 6c 65 61 6e 75 70 20 7b 0a }.} -cleanup {.
6060: 20 20 20 20 24 70 20 66 72 65 65 0a 7d 20 2d 72 $p free.} -r
6070: 65 74 75 72 6e 43 6f 64 65 73 20 65 72 72 6f 72 eturnCodes error
6080: 20 2d 6d 61 74 63 68 20 67 6c 6f 62 20 2d 72 65 -match glob -re
6090: 73 75 6c 74 20 7b 2a 6a 75 6e 6b 20 61 66 74 65 sult {*junk afte
60a0: 72 20 64 6f 63 75 6d 65 6e 74 20 65 6c 65 6d 65 r document eleme
60b0: 6e 74 2a 20 6c 69 6e 65 20 31 20 63 68 61 72 2a nt* line 1 char*
60c0: 20 33 30 7d 0a 0a 74 65 73 74 20 70 61 72 73 65 30}..test parse
60d0: 72 2d 31 33 2e 31 20 7b 62 75 6c 6b 20 70 61 72 r-13.1 {bulk par
60e0: 73 69 6e 67 20 2d 20 63 6f 6d 6d 6f 6e 20 68 61 sing - common ha
60f0: 6e 64 6c 69 6e 67 7d 20 2d 73 65 74 75 70 20 7b ndling} -setup {
6100: 0a 20 20 20 20 73 65 74 20 3a 3a 72 65 73 20 7b . set ::res {
6110: 7d 0a 7d 20 2d 62 6f 64 79 20 7b 0a 20 20 20 20 }.} -body {.
6120: 73 65 74 20 70 20 5b 78 6d 6c 3a 3a 70 61 72 73 set p [xml::pars
6130: 65 72 5d 0a 20 20 20 20 24 70 20 63 6f 6e 66 69 er]. $p confi
6140: 67 75 72 65 20 2d 66 69 6e 61 6c 20 31 20 2d 65 gure -final 1 -e
6150: 6c 65 6d 65 6e 74 73 74 61 72 74 63 6f 6d 6d 61 lementstartcomma
6160: 6e 64 20 7b 61 70 70 6c 79 20 7b 7b 6e 61 6d 65 nd {apply {{name
6170: 20 61 74 4c 69 73 74 20 61 72 67 73 7d 20 7b 0a atList args} {.
6180: 20 20 20 20 20 20 20 20 6c 61 70 70 65 6e 64 20 lappend
6190: 3a 3a 72 65 73 20 24 6e 61 6d 65 20 7b 2a 7d 24 ::res $name {*}$
61a0: 61 74 4c 69 73 74 20 2d 3e 0a 20 20 20 20 7d 7d atList ->. }}
61b0: 7d 20 2d 65 6c 65 6d 65 6e 74 65 6e 64 63 6f 6d } -elementendcom
61c0: 6d 61 6e 64 20 7b 61 70 70 6c 79 20 7b 7b 6e 61 mand {apply {{na
61d0: 6d 65 7d 20 7b 0a 20 20 20 20 20 20 20 20 6c 61 me} {. la
61e0: 70 70 65 6e 64 20 3a 3a 72 65 73 20 3c 2d 20 2f ppend ::res <- /
61f0: 2f 24 6e 61 6d 65 0a 20 20 20 20 7d 7d 7d 20 2d /$name. }}} -
6200: 62 75 6c 6b 78 6d 6c 65 6e 64 63 6f 6d 6d 61 6e bulkxmlendcomman
6210: 64 20 7b 61 70 70 6c 79 20 7b 7b 7d 20 7b 0a 20 d {apply {{} {.
6220: 20 20 20 20 20 20 20 6c 61 70 70 65 6e 64 20 3a lappend :
6230: 3a 72 65 73 20 22 2e 22 0a 20 20 20 20 7d 7d 7d :res ".". }}}
6240: 0a 20 20 20 20 24 70 20 70 61 72 73 65 20 7b 0a . $p parse {.
6250: 20 20 20 20 20 20 3c 58 20 69 64 3d 22 31 22 3e <X id="1">
6260: 3c 61 3e 3c 62 3e 3c 2f 62 3e 3c 2f 61 3e 3c 2f <a><b></b></a></
6270: 58 3e 0a 20 20 20 20 20 20 3c 59 20 69 64 3d 22 X>. <Y id="
6280: 32 22 3e 3c 63 3e 3c 64 3e 3c 2f 64 3e 3c 2f 63 2"><c><d></d></c
6290: 3e 3c 2f 59 3e 0a 20 20 20 20 20 20 3c 5a 20 69 ></Y>. <Z i
62a0: 64 3d 22 33 22 3e 3c 65 3e 3c 66 3e 3c 2f 66 3e d="3"><e><f></f>
62b0: 3c 2f 65 3e 3c 2f 5a 3e 0a 20 20 20 20 7d 0a 20 </e></Z>. }.
62c0: 20 20 20 73 65 74 20 3a 3a 72 65 73 0a 7d 20 2d set ::res.} -
62d0: 63 6c 65 61 6e 75 70 20 7b 0a 20 20 20 20 24 70 cleanup {. $p
62e0: 20 66 72 65 65 0a 20 20 20 20 75 6e 73 65 74 20 free. unset
62f0: 2d 6e 6f 63 6f 6d 70 6c 61 69 6e 20 3a 3a 72 65 -nocomplain ::re
6300: 73 0a 7d 20 2d 72 65 73 75 6c 74 20 5b 6c 69 73 s.} -result [lis
6310: 74 20 5c 0a 20 20 20 20 20 20 58 20 69 64 20 31 t \. X id 1
6320: 20 2d 3e 20 61 20 2d 3e 20 62 20 2d 3e 20 3c 2d -> a -> b -> <-
6330: 20 2f 2f 62 20 3c 2d 20 2f 2f 61 20 3c 2d 20 2f //b <- //a <- /
6340: 2f 58 20 2e 20 5c 0a 20 20 20 20 20 20 59 20 69 /X . \. Y i
6350: 64 20 32 20 2d 3e 20 63 20 2d 3e 20 64 20 2d 3e d 2 -> c -> d ->
6360: 20 3c 2d 20 2f 2f 64 20 3c 2d 20 2f 2f 63 20 3c <- //d <- //c <
6370: 2d 20 2f 2f 59 20 2e 20 5c 0a 20 20 20 20 20 20 - //Y . \.
6380: 5a 20 69 64 20 33 20 2d 3e 20 65 20 2d 3e 20 66 Z id 3 -> e -> f
6390: 20 2d 3e 20 3c 2d 20 2f 2f 66 20 3c 2d 20 2f 2f -> <- //f <- //
63a0: 65 20 3c 2d 20 2f 2f 5a 20 2e 20 5c 0a 5d 0a 0a e <- //Z . \.]..
63b0: 74 65 73 74 20 70 61 72 73 65 72 2d 31 33 2e 32 test parser-13.2
63c0: 20 7b 62 75 6c 6b 20 70 61 72 73 69 6e 67 20 2d {bulk parsing -
63d0: 20 70 6f 73 69 74 69 6f 6e 20 6f 66 20 58 4d 4c position of XML
63e0: 20 69 6e 20 62 75 6c 6b 78 6d 6c 65 6e 64 2d 68 in bulkxmlend-h
63f0: 61 6e 64 6c 65 72 7d 20 2d 73 65 74 75 70 20 7b andler} -setup {
6400: 0a 20 20 20 20 73 65 74 20 3a 3a 72 65 73 20 7b . set ::res {
6410: 30 7d 0a 7d 20 2d 62 6f 64 79 20 7b 0a 20 20 20 0}.} -body {.
6420: 20 73 65 74 20 70 20 5b 78 6d 6c 3a 3a 70 61 72 set p [xml::par
6430: 73 65 72 5d 0a 20 20 20 20 24 70 20 63 6f 6e 66 ser]. $p conf
6440: 69 67 75 72 65 20 2d 66 69 6e 61 6c 20 31 20 2d igure -final 1 -
6450: 62 75 6c 6b 78 6d 6c 65 6e 64 63 6f 6d 6d 61 6e bulkxmlendcomman
6460: 64 20 5b 6c 69 73 74 20 61 70 70 6c 79 20 7b 70 d [list apply {p
6470: 20 7b 0a 20 20 20 20 20 20 20 20 6c 61 70 70 65 {. lappe
6480: 6e 64 20 3a 3a 72 65 73 20 5b 24 70 20 67 65 74 nd ::res [$p get
6490: 20 2d 63 75 72 72 65 6e 74 62 79 74 65 69 6e 64 -currentbyteind
64a0: 65 78 5d 0a 20 20 20 20 20 20 20 20 69 66 20 7b ex]. if {
64b0: 5b 24 70 20 67 65 74 20 2d 63 75 72 72 65 6e 74 [$p get -current
64c0: 62 79 74 65 63 6f 75 6e 74 5d 7d 20 7b 72 65 74 bytecount]} {ret
64d0: 75 72 6e 20 2d 63 6f 64 65 20 65 72 72 6f 72 20 urn -code error
64e0: 22 75 6e 65 78 70 65 63 74 65 64 3a 20 63 75 72 "unexpected: cur
64f0: 72 65 6e 74 62 79 74 65 63 6f 75 6e 74 20 6d 75 rentbytecount mu
6500: 73 74 20 62 65 20 30 2e 22 7d 0a 20 20 20 20 7d st be 0."}. }
6510: 7d 20 24 70 5d 0a 20 20 20 20 24 70 20 70 61 72 } $p]. $p par
6520: 73 65 20 7b 3c 58 20 69 64 3d 22 31 22 3e 3c 61 se {<X id="1"><a
6530: 3e 3c 62 3e 3c 2f 62 3e 3c 2f 61 3e 3c 2f 58 3e ><b></b></a></X>
6540: 20 20 3c 59 20 69 64 3d 22 32 22 3e 3c 63 3e 3c <Y id="2"><c><
6550: 64 3e 3c 2f 64 3e 3c 2f 63 3e 3c 2f 59 3e 20 20 d></d></c></Y>
6560: 3c 5a 20 69 64 3d 22 33 22 3e 3c 65 3e 3c 66 3e <Z id="3"><e><f>
6570: 2b 32 3c 2f 66 3e 3c 2f 65 3e 3c 2f 5a 3e 20 20 +2</f></e></Z>
6580: 7d 0a 20 20 20 20 73 65 74 20 3a 3a 72 65 73 0a }. set ::res.
6590: 7d 20 2d 63 6c 65 61 6e 75 70 20 7b 0a 20 20 20 } -cleanup {.
65a0: 20 24 70 20 66 72 65 65 0a 20 20 20 20 75 6e 73 $p free. uns
65b0: 65 74 20 2d 6e 6f 63 6f 6d 70 6c 61 69 6e 20 3a et -nocomplain :
65c0: 3a 72 65 73 0a 7d 20 2d 72 65 73 75 6c 74 20 7b :res.} -result {
65d0: 30 20 33 30 20 36 30 20 39 32 7d 0a 0a 74 65 73 0 30 60 92}..tes
65e0: 74 20 70 61 72 73 65 72 2d 31 33 2e 34 20 7b 62 t parser-13.4 {b
65f0: 75 6c 6b 20 70 61 72 73 69 6e 67 20 2d 20 73 74 ulk parsing - st
6600: 6f 70 20 6f 6e 20 65 72 72 6f 72 20 69 6e 20 58 op on error in X
6610: 4d 4c 2d 65 6e 64 20 68 61 6e 64 6c 65 72 7d 20 ML-end handler}
6620: 2d 62 6f 64 79 20 7b 0a 20 20 20 20 73 65 74 20 -body {. set
6630: 70 20 5b 78 6d 6c 3a 3a 70 61 72 73 65 72 5d 0a p [xml::parser].
6640: 20 20 20 20 24 70 20 63 6f 6e 66 69 67 75 72 65 $p configure
6650: 20 2d 66 69 6e 61 6c 20 31 20 2d 62 75 6c 6b 78 -final 1 -bulkx
6660: 6d 6c 65 6e 64 63 6f 6d 6d 61 6e 64 20 5b 6c 69 mlendcommand [li
6670: 73 74 20 61 70 70 6c 79 20 7b 70 20 7b 0a 20 20 st apply {p {.
6680: 20 20 20 20 20 20 72 65 74 75 72 6e 20 2d 63 6f return -co
6690: 64 65 20 65 72 72 6f 72 20 22 74 65 73 74 20 65 de error "test e
66a0: 72 72 6f 72 20 61 74 20 5b 24 70 20 67 65 74 20 rror at [$p get
66b0: 2d 63 75 72 72 65 6e 74 62 79 74 65 69 6e 64 65 -currentbyteinde
66c0: 78 5d 22 0a 20 20 20 20 7d 7d 20 24 70 5d 0a 20 x]". }} $p].
66d0: 20 20 20 24 70 20 70 61 72 73 65 20 7b 3c 58 20 $p parse {<X
66e0: 69 64 3d 22 31 22 3e 3c 61 3e 3c 62 3e 3c 2f 62 id="1"><a><b></b
66f0: 3e 3c 2f 61 3e 3c 2f 58 3e 20 20 3c 59 20 69 64 ></a></X> <Y id
6700: 3d 22 32 22 3e 3c 63 3e 3c 64 3e 3c 2f 64 3e 3c ="2"><c><d></d><
6710: 2f 63 3e 3c 2f 59 3e 20 20 3c 5a 20 69 64 3d 22 /c></Y> <Z id="
6720: 33 22 3e 3c 65 3e 3c 66 3e 2b 32 3c 2f 66 3e 3c 3"><e><f>+2</f><
6730: 2f 65 3e 3c 2f 5a 3e 20 20 7d 0a 7d 20 2d 63 6c /e></Z> }.} -cl
6740: 65 61 6e 75 70 20 7b 0a 20 20 20 20 24 70 20 66 eanup {. $p f
6750: 72 65 65 0a 7d 20 2d 72 65 74 75 72 6e 43 6f 64 ree.} -returnCod
6760: 65 73 20 65 72 72 6f 72 20 2d 6d 61 74 63 68 20 es error -match
6770: 67 6c 6f 62 20 2d 72 65 73 75 6c 74 20 7b 2a 74 glob -result {*t
6780: 65 73 74 20 65 72 72 6f 72 20 61 74 20 33 30 2a est error at 30*
6790: 7d 0a 0a 74 65 73 74 20 70 61 72 73 65 72 2d 31 }..test parser-1
67a0: 33 2e 34 20 7b 62 75 6c 6b 20 70 61 72 73 69 6e 3.4 {bulk parsin
67b0: 67 20 2d 20 73 74 6f 70 20 6f 6e 20 72 65 74 75 g - stop on retu
67c0: 72 6e 20 69 6e 20 58 4d 4c 2d 65 6e 64 20 68 61 rn in XML-end ha
67d0: 6e 64 6c 65 72 7d 20 2d 73 65 74 75 70 20 7b 0a ndler} -setup {.
67e0: 20 20 20 20 73 65 74 20 3a 3a 72 65 73 20 7b 7d set ::res {}
67f0: 0a 7d 20 2d 62 6f 64 79 20 7b 0a 20 20 20 20 73 .} -body {. s
6800: 65 74 20 70 20 5b 78 6d 6c 3a 3a 70 61 72 73 65 et p [xml::parse
6810: 72 5d 0a 20 20 20 20 24 70 20 63 6f 6e 66 69 67 r]. $p config
6820: 75 72 65 20 2d 66 69 6e 61 6c 20 31 20 2d 65 6c ure -final 1 -el
6830: 65 6d 65 6e 74 65 6e 64 63 6f 6d 6d 61 6e 64 20 ementendcommand
6840: 7b 61 70 70 6c 79 20 7b 7b 6e 61 6d 65 7d 20 7b {apply {{name} {
6850: 0a 20 20 20 20 20 20 20 20 73 65 74 20 3a 3a 72 . set ::r
6860: 65 73 20 24 6e 61 6d 65 0a 20 20 20 20 7d 7d 7d es $name. }}}
6870: 20 2d 62 75 6c 6b 78 6d 6c 65 6e 64 63 6f 6d 6d -bulkxmlendcomm
6880: 61 6e 64 20 5b 6c 69 73 74 20 61 70 70 6c 79 20 and [list apply
6890: 7b 70 20 7b 0a 20 20 20 20 20 20 20 20 69 66 20 {p {. if
68a0: 7b 24 3a 3a 72 65 73 20 65 71 20 22 59 22 7d 20 {$::res eq "Y"}
68b0: 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 72 65 {. re
68c0: 74 75 72 6e 20 2d 63 6f 64 65 20 72 65 74 75 72 turn -code retur
68d0: 6e 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 n. }.
68e0: 7d 7d 20 24 70 5d 0a 20 20 20 20 24 70 20 70 61 }} $p]. $p pa
68f0: 72 73 65 20 7b 3c 58 20 69 64 3d 22 31 22 3e 3c rse {<X id="1"><
6900: 61 3e 3c 62 3e 3c 2f 62 3e 3c 2f 61 3e 3c 2f 58 a><b></b></a></X
6910: 3e 20 20 3c 59 20 69 64 3d 22 32 22 3e 3c 63 3e > <Y id="2"><c>
6920: 3c 64 3e 3c 2f 64 3e 3c 2f 63 3e 3c 2f 59 3e 20 <d></d></c></Y>
6930: 20 3c 5a 20 69 64 3d 22 33 22 3e 3c 65 3e 3c 66 <Z id="3"><e><f
6940: 3e 2b 32 3c 2f 66 3e 3c 2f 65 3e 3c 2f 5a 3e 20 >+2</f></e></Z>
6950: 20 7d 0a 20 20 20 20 73 65 74 20 3a 3a 72 65 73 }. set ::res
6960: 0a 7d 20 2d 63 6c 65 61 6e 75 70 20 7b 0a 20 20 .} -cleanup {.
6970: 20 20 24 70 20 66 72 65 65 0a 20 20 20 20 75 6e $p free. un
6980: 73 65 74 20 2d 6e 6f 63 6f 6d 70 6c 61 69 6e 20 set -nocomplain
6990: 3a 3a 72 65 73 0a 7d 20 2d 72 65 73 75 6c 74 20 ::res.} -result
69a0: 59 0a 0a 23 20 63 6c 65 61 6e 75 70 0a 3a 3a 74 Y..# cleanup.::t
69b0: 63 6c 74 65 73 74 3a 3a 63 6c 65 61 6e 75 70 54 cltest::cleanupT
69c0: 65 73 74 73 0a 72 65 74 75 72 6e 0a ests.return.