tDOM

Hex Artifact Content
Login

Hex Artifact Content

Artifact 4cbc01ba1185bf2afc632e1d49e18b75b03d16d912dfdd8d54ac9e2c00b99594:


0000: 23 20 46 65 61 74 75 72 65 73 20 63 6f 76 65 72  # Features cover
0010: 65 64 3a 20 64 6f 6d 20 63 6f 6d 6d 61 6e 64 0a  ed: dom command.
0020: 23 0a 23 20 54 68 69 73 20 66 69 6c 65 20 63 6f  #.# This file co
0030: 6e 74 61 69 6e 73 20 61 20 63 6f 6c 6c 65 63 74  ntains a collect
0040: 69 6f 6e 20 6f 66 20 74 65 73 74 73 20 66 6f 72  ion of tests for
0050: 20 74 68 65 20 64 6f 6d 20 63 6f 6d 6d 61 6e 64   the dom command
0060: 20 6f 66 0a 23 20 74 44 4f 4d 2e 0a 23 0a 23 20   of.# tDOM..#.# 
0070: 20 20 20 64 6f 6d 2d 31 2e 2a 3a 20 20 63 72 65     dom-1.*:  cre
0080: 61 74 65 44 6f 63 75 6d 65 6e 74 2c 20 63 72 65  ateDocument, cre
0090: 61 74 65 44 6f 63 75 6d 65 6e 74 4e 53 0a 23 20  ateDocumentNS.# 
00a0: 20 20 20 64 6f 6d 2d 32 2e 2a 3a 20 20 70 61 72     dom-2.*:  par
00b0: 73 65 0a 23 20 20 20 20 64 6f 6d 2d 33 2e 2a 3a  se.#    dom-3.*:
00c0: 20 20 69 73 4e 61 6d 65 2c 20 69 73 4e 43 4e 61    isName, isNCNa
00d0: 6d 65 2c 20 69 73 43 68 61 72 44 61 74 61 2c 20  me, isCharData, 
00e0: 69 73 50 49 4e 61 6d 65 2c 20 69 73 43 6f 6d 6d  isPIName, isComm
00f0: 65 6e 74 2c 20 69 73 43 44 41 54 41 0a 23 20 20  ent, isCDATA.#  
0100: 20 20 64 6f 6d 2d 34 2e 2a 3a 20 20 70 61 72 73    dom-4.*:  pars
0110: 65 20 2d 75 73 65 46 6f 72 65 69 67 6e 44 54 44  e -useForeignDTD
0120: 0a 23 20 20 20 20 64 6f 6d 2d 35 2e 2a 3a 20 20  .#    dom-5.*:  
0130: 65 78 74 65 72 6e 61 6c 20 65 6e 74 69 74 69 65  external entitie
0140: 73 0a 23 20 20 20 20 64 6f 6d 2d 36 2e 2a 3a 20  s.#    dom-6.*: 
0150: 20 75 73 65 20 69 6e 20 73 6c 61 76 65 20 69 6e   use in slave in
0160: 74 65 72 70 72 65 74 65 72 0a 23 20 20 20 20 64  terpreter.#    d
0170: 6f 6d 2d 37 2e 2a 3a 20 20 73 65 74 4e 61 6d 65  om-7.*:  setName
0180: 43 68 65 63 6b 2c 20 73 65 74 54 65 78 74 43 68  Check, setTextCh
0190: 65 63 6b 0a 23 20 20 20 20 64 6f 6d 2d 38 2e 2a  eck.#    dom-8.*
01a0: 3a 20 20 63 72 65 61 74 65 44 6f 63 75 6d 65 6e  :  createDocumen
01b0: 74 4e 6f 64 65 2c 20 64 6f 63 75 6d 65 6e 74 4e  tNode, documentN
01c0: 6f 64 65 73 0a 23 20 20 20 20 64 6f 6d 2d 39 2e  odes.#    dom-9.
01d0: 2a 3a 20 20 73 65 74 4f 62 6a 65 63 74 43 6f 6d  *:  setObjectCom
01e0: 6d 61 6e 64 73 0a 23 20 20 20 20 64 6f 6d 2d 31  mands.#    dom-1
01f0: 30 2e 2a 3a 20 63 72 65 61 74 65 4e 6f 64 65 43  0.*: createNodeC
0200: 6d 64 0a 23 20 20 20 20 64 6f 6d 2d 31 31 2e 2a  md.#    dom-11.*
0210: 3a 20 66 65 61 74 75 72 65 69 6e 66 6f 0a 23 20  : featureinfo.# 
0220: 20 20 20 64 6f 6d 2d 31 32 2e 2a 3a 20 2d 66 65     dom-12.*: -fe
0230: 65 64 62 61 63 6b 41 66 74 65 72 0a 23 0a 23 20  edbackAfter.#.# 
0240: 43 6f 70 79 72 69 67 68 74 20 28 63 29 20 32 30  Copyright (c) 20
0250: 30 32 2c 20 32 30 30 33 2c 20 32 30 30 34 20 52  02, 2003, 2004 R
0260: 6f 6c 66 20 41 64 65 2e 0a 0a 73 6f 75 72 63 65  olf Ade...source
0270: 20 5b 66 69 6c 65 20 6a 6f 69 6e 20 5b 66 69 6c   [file join [fil
0280: 65 20 64 69 72 20 5b 69 6e 66 6f 20 73 63 72 69  e dir [info scri
0290: 70 74 5d 5d 20 6c 6f 61 64 74 64 6f 6d 2e 74 63  pt]] loadtdom.tc
02a0: 6c 5d 0a 0a 74 65 73 74 20 64 6f 6d 2d 31 2e 31  l]..test dom-1.1
02b0: 20 7b 63 72 65 61 74 65 44 6f 63 75 6d 65 6e 74   {createDocument
02c0: 20 77 69 74 68 20 72 6f 6f 74 20 6e 6f 64 65 20   with root node 
02d0: 6e 61 6d 65 20 6e 6f 74 20 61 20 58 4d 4c 20 4e  name not a XML N
02e0: 61 6d 65 7d 20 7b 0a 20 20 20 20 6c 69 73 74 20  ame} {.    list 
02f0: 5b 63 61 74 63 68 20 7b 64 6f 6d 20 63 72 65 61  [catch {dom crea
0300: 74 65 44 6f 63 75 6d 65 6e 74 20 22 72 6f 6f 74  teDocument "root
0310: 20 6e 6f 64 65 22 7d 20 6d 73 67 5d 20 24 6d 73   node"} msg] $ms
0320: 67 0a 7d 20 22 31 20 7b 49 6e 76 61 6c 69 64 20  g.} "1 {Invalid 
0330: 72 6f 6f 74 20 65 6c 65 6d 65 6e 74 20 6e 61 6d  root element nam
0340: 65 20 27 72 6f 6f 74 20 6e 6f 64 65 27 7d 22 0a  e 'root node'}".
0350: 0a 74 65 73 74 20 64 6f 6d 2d 31 2e 32 20 7b 63  .test dom-1.2 {c
0360: 72 65 61 74 65 44 6f 63 75 6d 65 6e 74 20 77 69  reateDocument wi
0370: 74 68 20 72 6f 6f 74 20 6e 6f 64 65 20 6e 61 6d  th root node nam
0380: 65 20 6e 6f 74 20 61 20 58 4d 4c 20 4e 61 6d 65  e not a XML Name
0390: 7d 20 7b 0a 20 20 20 20 6c 69 73 74 20 5b 63 61  } {.    list [ca
03a0: 74 63 68 20 7b 64 6f 6d 20 63 72 65 61 74 65 44  tch {dom createD
03b0: 6f 63 75 6d 65 6e 74 20 22 31 72 6f 6f 74 22 7d  ocument "1root"}
03c0: 20 6d 73 67 5d 20 24 6d 73 67 0a 7d 20 22 31 20   msg] $msg.} "1 
03d0: 7b 49 6e 76 61 6c 69 64 20 72 6f 6f 74 20 65 6c  {Invalid root el
03e0: 65 6d 65 6e 74 20 6e 61 6d 65 20 27 31 72 6f 6f  ement name '1roo
03f0: 74 27 7d 22 0a 0a 74 65 73 74 20 64 6f 6d 2d 31  t'}"..test dom-1
0400: 2e 33 20 7b 63 72 65 61 74 65 44 6f 63 75 6d 65  .3 {createDocume
0410: 6e 74 20 2d 20 72 6f 6f 74 20 6e 61 6d 65 20 75  nt - root name u
0420: 73 2d 61 73 63 69 69 7d 20 7b 0a 20 20 20 20 64  s-ascii} {.    d
0430: 6f 6d 20 63 72 65 61 74 65 44 6f 63 75 6d 65 6e  om createDocumen
0440: 74 20 22 72 6f 6f 74 22 20 64 6f 63 20 0a 20 20  t "root" doc .  
0450: 20 20 73 65 74 20 72 6f 6f 74 20 5b 24 64 6f 63    set root [$doc
0460: 20 64 6f 63 75 6d 65 6e 74 45 6c 65 6d 65 6e 74   documentElement
0470: 5d 0a 20 20 20 20 73 65 74 20 72 65 73 75 6c 74  ].    set result
0480: 20 5b 24 72 6f 6f 74 20 6e 6f 64 65 4e 61 6d 65   [$root nodeName
0490: 5d 0a 20 20 20 20 24 64 6f 63 20 64 65 6c 65 74  ].    $doc delet
04a0: 65 0a 20 20 20 20 73 65 74 20 72 65 73 75 6c 74  e.    set result
04b0: 0a 7d 20 22 72 6f 6f 74 22 0a 0a 74 65 73 74 20  .} "root"..test 
04c0: 64 6f 6d 2d 31 2e 34 20 7b 63 72 65 61 74 65 44  dom-1.4 {createD
04d0: 6f 63 75 6d 65 6e 74 20 2d 20 72 6f 6f 74 20 6e  ocument - root n
04e0: 61 6d 65 20 77 69 74 68 20 55 54 46 2d 38 20 63  ame with UTF-8 c
04f0: 68 61 72 73 7d 20 7b 0a 20 20 20 20 64 6f 6d 20  hars} {.    dom 
0500: 63 72 65 61 74 65 44 6f 63 75 6d 65 6e 74 20 22  createDocument "
0510: 5c 75 30 30 63 34 5c 75 30 30 64 34 5c 75 30 30  \u00c4\u00d4\u00
0520: 64 63 22 20 64 6f 63 20 0a 20 20 20 20 73 65 74  dc" doc .    set
0530: 20 72 6f 6f 74 20 5b 24 64 6f 63 20 64 6f 63 75   root [$doc docu
0540: 6d 65 6e 74 45 6c 65 6d 65 6e 74 5d 0a 20 20 20  mentElement].   
0550: 20 73 65 74 20 72 65 73 75 6c 74 20 5b 24 72 6f   set result [$ro
0560: 6f 74 20 6e 6f 64 65 4e 61 6d 65 5d 0a 20 20 20  ot nodeName].   
0570: 20 24 64 6f 63 20 64 65 6c 65 74 65 0a 20 20 20   $doc delete.   
0580: 20 73 65 74 20 72 65 73 75 6c 74 0a 7d 20 22 5c   set result.} "\
0590: 75 30 30 63 34 5c 75 30 30 64 34 5c 75 30 30 64  u00c4\u00d4\u00d
05a0: 63 22 0a 20 20 20 20 0a 74 65 73 74 20 64 6f 6d  c".    .test dom
05b0: 2d 31 2e 35 20 7b 63 72 65 61 74 65 44 6f 63 75  -1.5 {createDocu
05c0: 6d 65 6e 74 20 77 69 74 68 20 46 51 20 72 6f 6f  ment with FQ roo
05d0: 74 20 6e 61 6d 65 7d 20 7b 0a 20 20 20 20 64 6f  t name} {.    do
05e0: 6d 20 63 72 65 61 74 65 44 6f 63 75 6d 65 6e 74  m createDocument
05f0: 20 22 66 6f 6f 3a 62 61 72 22 20 64 6f 63 0a 20   "foo:bar" doc. 
0600: 20 20 20 73 65 74 20 72 6f 6f 74 20 5b 24 64 6f     set root [$do
0610: 63 20 64 6f 63 75 6d 65 6e 74 45 6c 65 6d 65 6e  c documentElemen
0620: 74 5d 0a 20 20 20 20 73 65 74 20 72 65 73 75 6c  t].    set resul
0630: 74 20 5b 24 72 6f 6f 74 20 6e 6f 64 65 4e 61 6d  t [$root nodeNam
0640: 65 5d 0a 20 20 20 20 24 64 6f 63 20 64 65 6c 65  e].    $doc dele
0650: 74 65 0a 20 20 20 20 73 65 74 20 72 65 73 75 6c  te.    set resul
0660: 74 0a 7d 20 22 66 6f 6f 3a 62 61 72 22 0a 0a 74  t.} "foo:bar"..t
0670: 65 73 74 20 64 6f 6d 2d 31 2e 36 20 7b 63 72 65  est dom-1.6 {cre
0680: 61 74 65 44 6f 63 75 6d 65 6e 74 20 77 69 74 68  ateDocument with
0690: 20 77 72 6f 6e 67 20 23 20 6f 66 20 61 72 67 73   wrong # of args
06a0: 7d 20 7b 0a 20 20 20 20 6c 69 73 74 20 5b 63 61  } {.    list [ca
06b0: 74 63 68 20 7b 64 6f 6d 20 63 72 65 61 74 65 44  tch {dom createD
06c0: 6f 63 75 6d 65 6e 74 20 22 72 6f 6f 74 22 20 22  ocument "root" "
06d0: 68 74 74 70 3a 2f 66 6f 6f 3a 62 61 72 22 20 64  http:/foo:bar" d
06e0: 6f 63 7d 20 6d 73 67 5d 20 24 6d 73 67 0a 7d 20  oc} msg] $msg.} 
06f0: 22 31 20 7b 77 72 6f 6e 67 20 5c 23 20 61 72 67  "1 {wrong \# arg
0700: 73 3a 20 73 68 6f 75 6c 64 20 62 65 20 5c 22 63  s: should be \"c
0710: 72 65 61 74 65 44 6f 63 75 6d 65 6e 74 20 64 6f  reateDocument do
0720: 63 45 6c 65 6d 4e 61 6d 65 20 3f 6e 65 77 4f 62  cElemName ?newOb
0730: 6a 56 61 72 3f 5c 22 7d 22 0a 0a 74 65 73 74 20  jVar?\"}"..test 
0740: 64 6f 6d 2d 31 2e 37 20 7b 63 72 65 61 74 65 44  dom-1.7 {createD
0750: 6f 63 75 6d 65 6e 74 4e 53 20 2d 20 63 68 65 63  ocumentNS - chec
0760: 6b 20 72 6f 6f 74 20 6e 61 6d 65 7d 20 7b 0a 20  k root name} {. 
0770: 20 20 20 73 65 74 20 64 6f 63 20 5b 64 6f 6d 20     set doc [dom 
0780: 63 72 65 61 74 65 44 6f 63 75 6d 65 6e 74 4e 53  createDocumentNS
0790: 20 22 68 74 74 70 3a 2f 2f 66 6f 6f 2e 62 61 72   "http://foo.bar
07a0: 22 20 22 72 6f 6f 74 22 5d 0a 20 20 20 20 73 65  " "root"].    se
07b0: 74 20 72 6f 6f 74 20 5b 24 64 6f 63 20 64 6f 63  t root [$doc doc
07c0: 75 6d 65 6e 74 45 6c 65 6d 65 6e 74 5d 0a 20 20  umentElement].  
07d0: 20 20 73 65 74 20 72 65 73 75 6c 74 20 5b 24 72    set result [$r
07e0: 6f 6f 74 20 6e 6f 64 65 4e 61 6d 65 5d 0a 20 20  oot nodeName].  
07f0: 20 20 24 64 6f 63 20 64 65 6c 65 74 65 0a 20 20    $doc delete.  
0800: 20 20 73 65 74 20 72 65 73 75 6c 74 0a 7d 20 22    set result.} "
0810: 72 6f 6f 74 22 0a 0a 74 65 73 74 20 64 6f 6d 2d  root"..test dom-
0820: 31 2e 38 20 7b 63 72 65 61 74 65 44 6f 63 75 6d  1.8 {createDocum
0830: 65 6e 74 4e 53 20 2d 20 63 68 65 63 6b 20 74 68  entNS - check th
0840: 65 20 4e 53 20 6f 66 20 74 68 65 20 63 72 65 61  e NS of the crea
0850: 74 65 64 20 72 6f 6f 74 7d 20 7b 0a 20 20 20 20  ted root} {.    
0860: 64 6f 6d 20 63 72 65 61 74 65 44 6f 63 75 6d 65  dom createDocume
0870: 6e 74 4e 53 20 22 68 74 74 70 3a 2f 2f 66 6f 6f  ntNS "http://foo
0880: 2e 62 61 72 22 20 22 72 6f 6f 74 22 20 64 6f 63  .bar" "root" doc
0890: 0a 20 20 20 20 73 65 74 20 72 6f 6f 74 20 5b 24  .    set root [$
08a0: 64 6f 63 20 64 6f 63 75 6d 65 6e 74 45 6c 65 6d  doc documentElem
08b0: 65 6e 74 5d 0a 20 20 20 20 73 65 74 20 72 65 73  ent].    set res
08c0: 75 6c 74 20 5b 24 72 6f 6f 74 20 6e 61 6d 65 73  ult [$root names
08d0: 70 61 63 65 55 52 49 5d 0a 20 20 20 20 24 64 6f  paceURI].    $do
08e0: 63 20 64 65 6c 65 74 65 0a 20 20 20 20 73 65 74  c delete.    set
08f0: 20 72 65 73 75 6c 74 0a 7d 20 22 68 74 74 70 3a   result.} "http:
0900: 2f 2f 66 6f 6f 2e 62 61 72 22 20 20 20 20 0a 0a  //foo.bar"    ..
0910: 74 65 73 74 20 64 6f 6d 2d 31 2e 39 20 7b 63 72  test dom-1.9 {cr
0920: 65 61 74 65 44 6f 63 75 6d 65 6e 74 4e 53 20 77  eateDocumentNS w
0930: 69 74 68 20 72 6f 6f 74 20 6e 61 6d 65 20 6e 6f  ith root name no
0940: 74 20 61 20 4e 43 4e 61 6d 65 7d 20 7b 0a 20 20  t a NCName} {.  
0950: 20 20 6c 69 73 74 20 5b 63 61 74 63 68 20 7b 64    list [catch {d
0960: 6f 6d 20 63 72 65 61 74 65 44 6f 63 75 6d 65 6e  om createDocumen
0970: 74 4e 53 20 22 68 74 74 70 3a 2f 2f 66 6f 6f 2e  tNS "http://foo.
0980: 62 61 72 22 20 22 66 6f 6f 20 62 61 72 22 20 64  bar" "foo bar" d
0990: 6f 63 7d 20 6d 73 67 5d 20 24 6d 73 67 0a 7d 20  oc} msg] $msg.} 
09a0: 22 31 20 7b 49 6e 76 61 6c 69 64 20 72 6f 6f 74  "1 {Invalid root
09b0: 20 65 6c 65 6d 65 6e 74 20 6e 61 6d 65 20 27 66   element name 'f
09c0: 6f 6f 20 62 61 72 27 7d 22 0a 0a 74 65 73 74 20  oo bar'}"..test 
09d0: 64 6f 6d 2d 31 2e 31 30 20 7b 63 72 65 61 74 65  dom-1.10 {create
09e0: 44 6f 63 75 6d 65 6e 74 4e 53 20 77 69 74 68 20  DocumentNS with 
09f0: 72 6f 6f 74 20 6e 61 6d 65 20 6e 6f 74 20 61 20  root name not a 
0a00: 4e 43 4e 61 6d 65 7d 20 7b 0a 20 20 20 20 6c 69  NCName} {.    li
0a10: 73 74 20 5b 63 61 74 63 68 20 7b 64 6f 6d 20 63  st [catch {dom c
0a20: 72 65 61 74 65 44 6f 63 75 6d 65 6e 74 4e 53 20  reateDocumentNS 
0a30: 22 68 74 74 70 3a 2f 2f 66 6f 6f 2e 62 61 72 22  "http://foo.bar"
0a40: 20 22 61 3a 62 3a 63 22 20 64 6f 63 7d 20 6d 73   "a:b:c" doc} ms
0a50: 67 5d 20 24 6d 73 67 0a 7d 20 22 31 20 7b 49 6e  g] $msg.} "1 {In
0a60: 76 61 6c 69 64 20 72 6f 6f 74 20 65 6c 65 6d 65  valid root eleme
0a70: 6e 74 20 6e 61 6d 65 20 27 61 3a 62 3a 63 27 7d  nt name 'a:b:c'}
0a80: 22 0a 0a 74 65 73 74 20 64 6f 6d 2d 31 2e 31 31  "..test dom-1.11
0a90: 20 7b 63 72 65 61 74 65 44 6f 63 75 6d 65 6e 74   {createDocument
0aa0: 4e 53 20 77 69 74 68 20 72 6f 6f 74 20 6e 61 6d  NS with root nam
0ab0: 65 20 6e 6f 74 20 61 20 4e 43 4e 61 6d 65 7d 20  e not a NCName} 
0ac0: 7b 0a 20 20 20 20 6c 69 73 74 20 5b 63 61 74 63  {.    list [catc
0ad0: 68 20 7b 64 6f 6d 20 63 72 65 61 74 65 44 6f 63  h {dom createDoc
0ae0: 75 6d 65 6e 74 4e 53 20 22 68 74 74 70 3a 2f 2f  umentNS "http://
0af0: 66 6f 6f 2e 62 61 72 22 20 22 61 20 62 3a 62 22  foo.bar" "a b:b"
0b00: 20 64 6f 63 7d 20 6d 73 67 5d 20 24 6d 73 67 0a   doc} msg] $msg.
0b10: 7d 20 22 31 20 7b 49 6e 76 61 6c 69 64 20 72 6f  } "1 {Invalid ro
0b20: 6f 74 20 65 6c 65 6d 65 6e 74 20 6e 61 6d 65 20  ot element name 
0b30: 27 61 20 62 3a 62 27 7d 22 0a 0a 74 65 73 74 20  'a b:b'}"..test 
0b40: 64 6f 6d 2d 31 2e 31 32 20 7b 63 72 65 61 74 65  dom-1.12 {create
0b50: 44 6f 63 75 6d 65 6e 74 4e 53 20 77 69 74 68 20  DocumentNS with 
0b60: 72 6f 6f 74 20 6e 61 6d 65 20 6e 6f 74 20 61 20  root name not a 
0b70: 4e 43 4e 61 6d 65 7d 20 7b 0a 20 20 20 20 6c 69  NCName} {.    li
0b80: 73 74 20 5b 63 61 74 63 68 20 7b 64 6f 6d 20 63  st [catch {dom c
0b90: 72 65 61 74 65 44 6f 63 75 6d 65 6e 74 4e 53 20  reateDocumentNS 
0ba0: 22 68 74 74 70 3a 2f 2f 66 6f 6f 2e 62 61 72 22  "http://foo.bar"
0bb0: 20 22 61 3a 61 20 62 22 20 64 6f 63 7d 20 6d 73   "a:a b" doc} ms
0bc0: 67 5d 20 24 6d 73 67 0a 7d 20 22 31 20 7b 49 6e  g] $msg.} "1 {In
0bd0: 76 61 6c 69 64 20 72 6f 6f 74 20 65 6c 65 6d 65  valid root eleme
0be0: 6e 74 20 6e 61 6d 65 20 27 61 3a 61 20 62 27 7d  nt name 'a:a b'}
0bf0: 22 0a 0a 74 65 73 74 20 64 6f 6d 2d 31 2e 31 33  "..test dom-1.13
0c00: 20 7b 63 72 65 61 74 65 44 6f 63 75 6d 65 6e 74   {createDocument
0c10: 4e 53 20 2d 20 63 68 65 63 6b 20 72 6f 6f 74 20  NS - check root 
0c20: 6e 61 6d 65 7d 20 7b 0a 20 20 20 20 73 65 74 20  name} {.    set 
0c30: 64 6f 63 20 5b 64 6f 6d 20 63 72 65 61 74 65 44  doc [dom createD
0c40: 6f 63 75 6d 65 6e 74 4e 53 20 22 68 74 74 70 3a  ocumentNS "http:
0c50: 2f 2f 66 6f 6f 2e 62 61 72 22 20 66 6f 6f 3a 72  //foo.bar" foo:r
0c60: 6f 6f 74 5d 0a 20 20 20 20 73 65 74 20 72 6f 6f  oot].    set roo
0c70: 74 20 5b 24 64 6f 63 20 64 6f 63 75 6d 65 6e 74  t [$doc document
0c80: 45 6c 65 6d 65 6e 74 5d 0a 20 20 20 20 73 65 74  Element].    set
0c90: 20 72 65 73 75 6c 74 20 5b 24 72 6f 6f 74 20 6e   result [$root n
0ca0: 6f 64 65 4e 61 6d 65 5d 0a 20 20 20 20 24 64 6f  odeName].    $do
0cb0: 63 20 64 65 6c 65 74 65 0a 20 20 20 20 73 65 74  c delete.    set
0cc0: 20 72 65 73 75 6c 74 0a 7d 20 22 66 6f 6f 3a 72   result.} "foo:r
0cd0: 6f 6f 74 22 0a 0a 74 65 73 74 20 64 6f 6d 2d 31  oot"..test dom-1
0ce0: 2e 31 34 20 7b 63 72 65 61 74 65 44 6f 63 75 6d  .14 {createDocum
0cf0: 65 6e 74 20 2d 20 72 65 6e 61 6d 65 20 74 68 65  ent - rename the
0d00: 20 64 6f 63 20 63 6d 64 7d 20 7b 0a 20 20 20 20   doc cmd} {.    
0d10: 73 65 74 20 64 6f 63 20 5b 64 6f 6d 20 63 72 65  set doc [dom cre
0d20: 61 74 65 44 6f 63 75 6d 65 6e 74 20 72 6f 6f 74  ateDocument root
0d30: 5d 0a 20 20 20 20 69 66 20 7b 5b 69 6e 66 6f 20  ].    if {[info 
0d40: 63 6f 6d 6d 61 6e 64 73 20 66 6f 6f 43 6d 64 5d  commands fooCmd]
0d50: 20 3d 3d 20 22 66 6f 6f 43 6d 64 22 7d 20 7b 0a   == "fooCmd"} {.
0d60: 20 20 20 20 20 20 20 20 72 65 6e 61 6d 65 20 66          rename f
0d70: 6f 6f 43 6d 64 20 7b 7d 0a 20 20 20 20 7d 0a 20  ooCmd {}.    }. 
0d80: 20 20 20 72 65 6e 61 6d 65 20 24 64 6f 63 20 66     rename $doc f
0d90: 6f 6f 43 6d 64 0a 20 20 20 20 73 65 74 20 72 65  ooCmd.    set re
0da0: 73 75 6c 74 20 5b 5b 66 6f 6f 43 6d 64 20 64 6f  sult [[fooCmd do
0db0: 63 75 6d 65 6e 74 45 6c 65 6d 65 6e 74 5d 20 6e  cumentElement] n
0dc0: 6f 64 65 4e 61 6d 65 5d 0a 20 20 20 20 66 6f 6f  odeName].    foo
0dd0: 43 6d 64 20 64 65 6c 65 74 65 0a 20 20 20 20 73  Cmd delete.    s
0de0: 65 74 20 72 65 73 75 6c 74 0a 7d 20 7b 72 6f 6f  et result.} {roo
0df0: 74 7d 0a 0a 74 65 73 74 20 64 6f 6d 2d 31 2e 31  t}..test dom-1.1
0e00: 35 20 7b 63 72 65 61 74 65 44 6f 63 75 6d 65 6e  5 {createDocumen
0e10: 74 20 2d 20 72 65 6e 61 6d 65 20 74 68 65 20 64  t - rename the d
0e20: 6f 63 20 63 6d 64 7d 20 7b 0a 20 20 20 20 69 66  oc cmd} {.    if
0e30: 20 7b 5b 69 6e 66 6f 20 63 6f 6d 6d 61 6e 64 73   {[info commands
0e40: 20 66 6f 6f 43 6d 64 5d 20 3d 3d 20 22 66 6f 6f   fooCmd] == "foo
0e50: 43 6d 64 22 7d 20 7b 0a 20 20 20 20 20 20 20 20  Cmd"} {.        
0e60: 72 65 6e 61 6d 65 20 66 6f 6f 43 6d 64 20 7b 7d  rename fooCmd {}
0e70: 0a 20 20 20 20 7d 0a 20 20 20 20 73 65 74 20 6e  .    }.    set n
0e80: 72 4f 66 43 6f 6d 6d 61 6e 64 73 20 5b 6c 6c 65  rOfCommands [lle
0e90: 6e 67 74 68 20 5b 69 6e 66 6f 20 63 6f 6d 6d 61  ngth [info comma
0ea0: 6e 64 73 5d 5d 0a 20 20 20 20 73 65 74 20 64 6f  nds]].    set do
0eb0: 63 20 5b 64 6f 6d 20 63 72 65 61 74 65 44 6f 63  c [dom createDoc
0ec0: 75 6d 65 6e 74 20 72 6f 6f 74 5d 0a 20 20 20 20  ument root].    
0ed0: 72 65 6e 61 6d 65 20 24 64 6f 63 20 66 6f 6f 43  rename $doc fooC
0ee0: 6d 64 0a 20 20 20 20 66 6f 6f 43 6d 64 20 64 65  md.    fooCmd de
0ef0: 6c 65 74 65 0a 20 20 20 20 65 78 70 72 20 7b 5b  lete.    expr {[
0f00: 6c 6c 65 6e 67 74 68 20 5b 69 6e 66 6f 20 63 6f  llength [info co
0f10: 6d 6d 61 6e 64 73 5d 5d 20 3d 3d 20 24 6e 72 4f  mmands]] == $nrO
0f20: 66 43 6f 6d 6d 61 6e 64 73 7d 0a 7d 20 7b 31 7d  fCommands}.} {1}
0f30: 0a 0a 74 65 73 74 20 64 6f 6d 2d 31 2e 31 36 20  ..test dom-1.16 
0f40: 7b 63 72 65 61 74 65 44 6f 63 75 6d 65 6e 74 4e  {createDocumentN
0f50: 53 20 2d 20 65 6d 70 74 79 20 6e 61 6d 65 73 70  S - empty namesp
0f60: 61 63 65 2c 20 6e 6f 20 70 72 65 66 69 78 7d 20  ace, no prefix} 
0f70: 7b 0a 20 20 20 20 64 6f 6d 20 63 72 65 61 74 65  {.    dom create
0f80: 44 6f 63 75 6d 65 6e 74 4e 53 20 22 22 20 64 6f  DocumentNS "" do
0f90: 63 20 64 6f 63 0a 20 20 20 20 73 65 74 20 72 65  c doc.    set re
0fa0: 73 75 6c 74 20 5b 24 64 6f 63 20 61 73 58 4d 4c  sult [$doc asXML
0fb0: 20 2d 69 6e 64 65 6e 74 20 6e 6f 6e 65 5d 0a 20   -indent none]. 
0fc0: 20 20 20 24 64 6f 63 20 64 65 6c 65 74 65 0a 20     $doc delete. 
0fd0: 20 20 20 73 65 74 20 72 65 73 75 6c 74 0a 7d 20     set result.} 
0fe0: 7b 3c 64 6f 63 2f 3e 7d 0a 0a 74 65 73 74 20 64  {<doc/>}..test d
0ff0: 6f 6d 2d 31 2e 31 37 20 7b 63 72 65 61 74 65 44  om-1.17 {createD
1000: 6f 63 75 6d 65 6e 74 4e 53 20 2d 20 20 6e 61 6d  ocumentNS -  nam
1010: 65 73 70 61 63 65 2c 20 6e 6f 20 70 72 65 66 69  espace, no prefi
1020: 78 7d 20 7b 0a 20 20 20 20 64 6f 6d 20 63 72 65  x} {.    dom cre
1030: 61 74 65 44 6f 63 75 6d 65 6e 74 4e 53 20 22 75  ateDocumentNS "u
1040: 72 69 22 20 64 6f 63 20 64 6f 63 0a 20 20 20 20  ri" doc doc.    
1050: 73 65 74 20 72 65 73 75 6c 74 20 5b 24 64 6f 63  set result [$doc
1060: 20 61 73 58 4d 4c 20 2d 69 6e 64 65 6e 74 20 6e   asXML -indent n
1070: 6f 6e 65 5d 0a 20 20 20 20 24 64 6f 63 20 64 65  one].    $doc de
1080: 6c 65 74 65 0a 20 20 20 20 73 65 74 20 72 65 73  lete.    set res
1090: 75 6c 74 0a 7d 20 7b 3c 64 6f 63 20 78 6d 6c 6e  ult.} {<doc xmln
10a0: 73 3d 22 75 72 69 22 2f 3e 7d 0a 0a 74 65 73 74  s="uri"/>}..test
10b0: 20 64 6f 6d 2d 31 2e 31 38 20 7b 63 72 65 61 74   dom-1.18 {creat
10c0: 65 44 6f 63 75 6d 65 6e 74 4e 53 20 2d 20 20 6e  eDocumentNS -  n
10d0: 61 6d 65 73 70 61 63 65 2c 20 6e 6f 20 70 72 65  amespace, no pre
10e0: 66 69 78 7d 20 7b 0a 20 20 20 20 64 6f 6d 20 63  fix} {.    dom c
10f0: 72 65 61 74 65 44 6f 63 75 6d 65 6e 74 4e 53 20  reateDocumentNS 
1100: 22 75 72 69 22 20 64 6f 63 20 64 6f 63 0a 20 20  "uri" doc doc.  
1110: 20 20 73 65 74 20 72 65 73 75 6c 74 20 5b 24 64    set result [$d
1120: 6f 63 20 73 65 6c 65 63 74 4e 6f 64 65 73 20 2d  oc selectNodes -
1130: 6e 61 6d 65 73 70 61 63 65 73 20 7b 6e 73 20 75  namespaces {ns u
1140: 72 69 7d 20 63 6f 75 6e 74 28 2f 6e 73 3a 64 6f  ri} count(/ns:do
1150: 63 29 5d 0a 20 20 20 20 24 64 6f 63 20 64 65 6c  c)].    $doc del
1160: 65 74 65 0a 20 20 20 20 73 65 74 20 72 65 73 75  ete.    set resu
1170: 6c 74 0a 7d 20 31 0a 0a 74 65 73 74 20 64 6f 6d  lt.} 1..test dom
1180: 2d 31 2e 31 39 20 7b 63 72 65 61 74 65 44 6f 63  -1.19 {createDoc
1190: 75 6d 65 6e 74 4e 53 20 2d 20 6e 61 6d 65 73 70  umentNS - namesp
11a0: 61 63 65 2c 20 70 72 65 66 69 78 7d 20 7b 0a 20  ace, prefix} {. 
11b0: 20 20 20 64 6f 6d 20 63 72 65 61 74 65 44 6f 63     dom createDoc
11c0: 75 6d 65 6e 74 4e 53 20 22 75 72 69 22 20 6e 31  umentNS "uri" n1
11d0: 3a 64 6f 63 20 64 6f 63 0a 20 20 20 20 73 65 74  :doc doc.    set
11e0: 20 72 65 73 75 6c 74 20 5b 24 64 6f 63 20 73 65   result [$doc se
11f0: 6c 65 63 74 4e 6f 64 65 73 20 2d 6e 61 6d 65 73  lectNodes -names
1200: 70 61 63 65 73 20 7b 6e 73 20 75 72 69 7d 20 63  paces {ns uri} c
1210: 6f 75 6e 74 28 2f 6e 73 3a 64 6f 63 29 5d 0a 20  ount(/ns:doc)]. 
1220: 20 20 20 24 64 6f 63 20 64 65 6c 65 74 65 0a 20     $doc delete. 
1230: 20 20 20 73 65 74 20 72 65 73 75 6c 74 0a 7d 20     set result.} 
1240: 31 0a 0a 74 65 73 74 20 64 6f 6d 2d 31 2e 32 30  1..test dom-1.20
1250: 20 7b 63 72 65 61 74 65 44 6f 63 75 6d 65 6e 74   {createDocument
1260: 4e 53 20 2d 20 65 6d 70 74 79 20 6e 61 6d 65 73  NS - empty names
1270: 70 61 63 65 2c 20 70 72 65 66 69 78 7d 20 7b 0a  pace, prefix} {.
1280: 20 20 20 20 63 61 74 63 68 20 7b 64 6f 6d 20 63      catch {dom c
1290: 72 65 61 74 65 44 6f 63 75 6d 65 6e 74 4e 53 20  reateDocumentNS 
12a0: 22 22 20 6e 31 3a 64 6f 63 20 64 6f 63 7d 20 65  "" n1:doc doc} e
12b0: 72 72 4d 73 67 0a 20 20 20 20 73 65 74 20 65 72  rrMsg.    set er
12c0: 72 4d 73 67 0a 7d 20 7b 4d 69 73 73 69 6e 67 20  rMsg.} {Missing 
12d0: 55 52 49 20 69 6e 20 4e 61 6d 65 73 70 61 63 65  URI in Namespace
12e0: 20 64 65 63 6c 61 72 61 74 69 6f 6e 7d 0a 0a 74   declaration}..t
12f0: 65 73 74 20 64 6f 6d 2d 31 2e 32 31 20 7b 45 78  est dom-1.21 {Ex
1300: 70 6c 69 63 69 74 20 64 65 6c 65 74 65 20 6f 66  plicit delete of
1310: 20 73 63 6f 70 65 64 20 64 6f 63 20 77 69 74 68   scoped doc with
1320: 20 64 6f 6d 44 6f 63 20 63 6d 64 7d 20 7b 7d 20   domDoc cmd} {} 
1330: 7b 0a 20 20 20 20 64 6f 6d 20 63 72 65 61 74 65  {.    dom create
1340: 44 6f 63 75 6d 65 6e 74 20 74 65 73 74 20 64 6f  Document test do
1350: 63 0a 20 20 20 20 64 6f 6d 44 6f 63 20 24 64 6f  c.    domDoc $do
1360: 63 20 64 65 6c 65 74 65 0a 20 20 20 20 75 6e 73  c delete.    uns
1370: 65 74 20 64 6f 63 0a 7d 20 7b 7d 20 20 20 20 0a  et doc.} {}    .
1380: 0a 70 72 6f 63 20 64 6f 6d 2d 31 2e 32 32 20 7b  .proc dom-1.22 {
1390: 64 6f 63 7d 20 7b 0a 20 20 20 20 24 64 6f 63 20  doc} {.    $doc 
13a0: 64 65 6c 65 74 65 0a 7d 0a 74 65 73 74 20 64 6f  delete.}.test do
13b0: 6d 2d 31 2e 32 32 20 7b 45 78 70 6c 69 63 69 74  m-1.22 {Explicit
13c0: 20 64 65 6c 65 74 65 20 6f 66 20 73 63 6f 70 65   delete of scope
13d0: 64 20 64 6f 63 20 69 6e 20 70 72 6f 63 20 63 61  d doc in proc ca
13e0: 6c 6c 20 66 72 6f 6d 20 73 63 6f 70 65 7d 20 7b  ll from scope} {
13f0: 7d 20 7b 0a 20 20 20 20 64 6f 6d 20 63 72 65 61  } {.    dom crea
1400: 74 65 44 6f 63 75 6d 65 6e 74 20 74 65 73 74 20  teDocument test 
1410: 64 6f 63 0a 20 20 20 20 64 6f 6d 2d 31 2e 32 32  doc.    dom-1.22
1420: 20 24 64 6f 63 0a 20 20 20 20 75 6e 73 65 74 20   $doc.    unset 
1430: 64 6f 63 0a 7d 20 7b 7d 20 20 20 20 0a 0a 74 65  doc.} {}    ..te
1440: 73 74 20 64 6f 6d 2d 31 2e 32 33 20 7b 45 78 70  st dom-1.23 {Exp
1450: 6c 69 63 69 74 20 64 65 6c 65 74 65 20 6f 66 20  licit delete of 
1460: 73 63 6f 70 65 64 20 64 6f 63 7d 20 7b 0a 20 20  scoped doc} {.  
1470: 20 20 64 6f 6d 20 63 72 65 61 74 65 44 6f 63 75    dom createDocu
1480: 6d 65 6e 74 20 74 65 73 74 20 64 6f 63 0a 20 20  ment test doc.  
1490: 20 20 24 64 6f 63 20 64 65 6c 65 74 65 0a 20 20    $doc delete.  
14a0: 20 20 75 6e 73 65 74 20 64 6f 63 0a 7d 20 7b 7d    unset doc.} {}
14b0: 20 20 20 20 0a 0a 74 65 73 74 20 64 6f 6d 2d 31      ..test dom-1
14c0: 2e 32 34 20 7b 45 78 70 6c 69 63 69 74 20 64 65  .24 {Explicit de
14d0: 6c 65 74 65 20 6f 66 20 73 63 6f 70 65 64 20 64  lete of scoped d
14e0: 6f 63 7d 20 7b 0a 20 20 20 20 64 6f 6d 20 63 72  oc} {.    dom cr
14f0: 65 61 74 65 44 6f 63 75 6d 65 6e 74 20 74 65 73  eateDocument tes
1500: 74 20 64 6f 63 0a 20 20 20 20 73 65 74 20 72 65  t doc.    set re
1510: 73 75 6c 74 20 5b 63 61 74 63 68 20 7b 73 65 74  sult [catch {set
1520: 20 64 6f 63 20 66 6f 6f 7d 20 65 72 72 4d 73 67   doc foo} errMsg
1530: 5d 0a 20 20 20 20 6c 61 70 70 65 6e 64 20 72 65  ].    lappend re
1540: 73 75 6c 74 20 24 65 72 72 4d 73 67 0a 20 20 20  sult $errMsg.   
1550: 20 24 64 6f 63 20 64 65 6c 65 74 65 0a 20 20 20   $doc delete.   
1560: 20 75 6e 73 65 74 20 64 6f 63 0a 20 20 20 20 73   unset doc.    s
1570: 65 74 20 72 65 73 75 6c 74 0a 7d 20 7b 31 20 7b  et result.} {1 {
1580: 63 61 6e 27 74 20 73 65 74 20 22 64 6f 63 22 3a  can't set "doc":
1590: 20 76 61 72 20 69 73 20 72 65 61 64 2d 6f 6e 6c   var is read-onl
15a0: 79 7d 7d 0a 0a 74 65 73 74 20 64 6f 6d 2d 31 2e  y}}..test dom-1.
15b0: 32 35 20 7b 44 6f 63 20 76 61 72 7d 20 7b 0a 20  25 {Doc var} {. 
15c0: 20 20 20 64 6f 6d 20 70 61 72 73 65 20 3c 74 65     dom parse <te
15d0: 73 74 2f 3e 20 64 6f 63 0a 20 20 20 20 64 6f 6d  st/> doc.    dom
15e0: 20 70 61 72 73 65 20 3c 74 65 73 74 2f 3e 20 64   parse <test/> d
15f0: 6f 63 0a 20 20 20 20 75 6e 73 65 74 20 64 6f 63  oc.    unset doc
1600: 0a 7d 20 7b 7d 0a 0a 74 65 73 74 20 64 6f 6d 2d  .} {}..test dom-
1610: 31 2e 32 36 20 7b 44 6f 63 20 76 61 72 7d 20 7b  1.26 {Doc var} {
1620: 0a 20 20 20 20 64 6f 6d 20 70 61 72 73 65 20 3c  .    dom parse <
1630: 74 65 73 74 2f 3e 20 64 6f 63 0a 20 20 20 20 73  test/> doc.    s
1640: 65 74 20 72 65 73 75 6c 74 20 5b 63 61 74 63 68  et result [catch
1650: 20 7b 24 64 6f 63 20 64 6f 63 75 6d 65 6e 74 45   {$doc documentE
1660: 6c 65 6d 65 6e 74 20 64 6f 63 7d 5d 0a 20 20 20  lement doc}].   
1670: 20 75 6e 73 65 74 20 64 6f 63 0a 20 20 20 20 73   unset doc.    s
1680: 65 74 20 72 65 73 75 6c 74 0a 7d 20 7b 31 7d 0a  et result.} {1}.
1690: 0a 74 65 73 74 20 64 6f 6d 2d 32 2e 31 20 7b 44  .test dom-2.1 {D
16a0: 6f 6e 27 74 20 71 75 61 73 68 20 77 68 69 74 65  on't quash white
16b0: 20 73 70 61 63 65 20 61 74 20 73 74 61 72 74 20   space at start 
16c0: 6f 72 20 65 6e 64 20 6f 66 20 6e 6f 6e 20 77 68  or end of non wh
16d0: 69 74 65 20 73 70 61 63 65 20 63 6f 6e 74 65 6e  ite space conten
16e0: 74 7d 20 7b 0a 20 20 20 20 73 65 74 20 64 6f 63  t} {.    set doc
16f0: 20 5b 64 6f 6d 20 70 61 72 73 65 20 7b 3c 72 6f   [dom parse {<ro
1700: 6f 74 3e 0a 20 20 20 20 73 6f 6d 65 20 63 6f 6e  ot>.    some con
1710: 74 65 6e 74 0a 20 20 20 20 3c 2f 72 6f 6f 74 3e  tent.    </root>
1720: 7d 5d 0a 20 20 20 20 73 65 74 20 72 6f 6f 74 20  }].    set root 
1730: 5b 24 64 6f 63 20 64 6f 63 75 6d 65 6e 74 45 6c  [$doc documentEl
1740: 65 6d 65 6e 74 5d 0a 20 20 20 20 24 72 6f 6f 74  ement].    $root
1750: 20 74 65 78 74 0a 7d 20 7b 0a 20 20 20 20 73 6f   text.} {.    so
1760: 6d 65 20 63 6f 6e 74 65 6e 74 0a 20 20 20 20 7d  me content.    }
1770: 0a 0a 74 65 73 74 20 64 6f 6d 2d 32 2e 32 20 7b  ..test dom-2.2 {
1780: 70 61 72 73 65 20 64 6f 63 20 77 69 74 68 20 76  parse doc with v
1790: 61 72 69 6f 75 73 20 72 65 2d 64 65 63 6c 61 72  arious re-declar
17a0: 61 74 69 6f 6e 20 6f 66 20 61 20 70 72 65 66 69  ation of a prefi
17b0: 78 7d 20 7b 0a 20 20 20 20 73 65 74 20 64 6f 63  x} {.    set doc
17c0: 20 5b 64 6f 6d 20 70 61 72 73 65 20 7b 3c 70 3a   [dom parse {<p:
17d0: 61 20 78 6d 6c 6e 73 3a 70 3d 22 75 72 69 31 22  a xmlns:p="uri1"
17e0: 3e 0a 20 20 20 20 3c 70 3a 62 20 78 6d 6c 6e 73  >.    <p:b xmlns
17f0: 3a 70 3d 22 75 72 69 32 22 3e 0a 20 20 20 20 20  :p="uri2">.     
1800: 20 20 20 3c 70 3a 63 20 78 6d 6c 6e 73 3a 70 3d     <p:c xmlns:p=
1810: 22 75 72 69 31 22 2f 3e 0a 20 20 20 20 3c 2f 70  "uri1"/>.    </p
1820: 3a 62 3e 0a 3c 2f 70 3a 61 3e 7d 5d 0a 20 20 20  :b>.</p:a>}].   
1830: 20 73 65 74 20 72 6f 6f 74 20 5b 24 64 6f 63 20   set root [$doc 
1840: 64 6f 63 75 6d 65 6e 74 45 6c 65 6d 65 6e 74 5d  documentElement]
1850: 0a 20 20 20 20 73 65 74 20 72 65 73 75 6c 74 20  .    set result 
1860: 5b 24 72 6f 6f 74 20 61 73 58 4d 4c 5d 0a 20 20  [$root asXML].  
1870: 20 20 24 64 6f 63 20 64 65 6c 65 74 65 0a 20 20    $doc delete.  
1880: 20 20 73 65 74 20 72 65 73 75 6c 74 0a 7d 20 7b    set result.} {
1890: 3c 70 3a 61 20 78 6d 6c 6e 73 3a 70 3d 22 75 72  <p:a xmlns:p="ur
18a0: 69 31 22 3e 0a 20 20 20 20 3c 70 3a 62 20 78 6d  i1">.    <p:b xm
18b0: 6c 6e 73 3a 70 3d 22 75 72 69 32 22 3e 0a 20 20  lns:p="uri2">.  
18c0: 20 20 20 20 20 20 3c 70 3a 63 20 78 6d 6c 6e 73        <p:c xmlns
18d0: 3a 70 3d 22 75 72 69 31 22 2f 3e 0a 20 20 20 20  :p="uri1"/>.    
18e0: 3c 2f 70 3a 62 3e 0a 3c 2f 70 3a 61 3e 0a 7d 0a  </p:b>.</p:a>.}.
18f0: 0a 74 65 73 74 20 64 6f 6d 2d 32 2e 33 20 7b 70  .test dom-2.3 {p
1900: 61 72 73 65 20 64 6f 63 20 77 69 74 68 20 64 65  arse doc with de
1910: 66 61 75 6c 74 20 4e 53 20 64 65 63 6c 61 72 61  fault NS declara
1920: 74 69 6f 6e 7d 20 7b 0a 20 20 20 20 73 65 74 20  tion} {.    set 
1930: 64 6f 63 20 5b 64 6f 6d 20 70 61 72 73 65 20 7b  doc [dom parse {
1940: 3c 61 20 78 6d 6c 6e 73 3a 70 3d 22 75 72 69 22  <a xmlns:p="uri"
1950: 3e 0a 20 20 20 20 3c 70 3a 62 2f 3e 0a 20 20 20  >.    <p:b/>.   
1960: 20 3c 70 3a 62 2f 3e 0a 3c 2f 61 3e 7d 5d 0a 20   <p:b/>.</a>}]. 
1970: 20 20 20 73 65 74 20 72 6f 6f 74 20 5b 24 64 6f     set root [$do
1980: 63 20 64 6f 63 75 6d 65 6e 74 45 6c 65 6d 65 6e  c documentElemen
1990: 74 5d 0a 20 20 20 20 73 65 74 20 72 65 73 75 6c  t].    set resul
19a0: 74 20 5b 24 72 6f 6f 74 20 61 73 58 4d 4c 5d 0a  t [$root asXML].
19b0: 20 20 20 20 24 64 6f 63 20 64 65 6c 65 74 65 0a      $doc delete.
19c0: 20 20 20 20 73 65 74 20 72 65 73 75 6c 74 0a 7d      set result.}
19d0: 20 7b 3c 61 20 78 6d 6c 6e 73 3a 70 3d 22 75 72   {<a xmlns:p="ur
19e0: 69 22 3e 0a 20 20 20 20 3c 70 3a 62 2f 3e 0a 20  i">.    <p:b/>. 
19f0: 20 20 20 3c 70 3a 62 2f 3e 0a 3c 2f 61 3e 0a 7d     <p:b/>.</a>.}
1a00: 0a 0a 74 65 73 74 20 64 6f 6d 2d 32 2e 34 20 7b  ..test dom-2.4 {
1a10: 70 61 72 73 65 20 6d 65 74 68 6f 64 3a 20 73 79  parse method: sy
1a20: 6e 74 61 78 20 63 68 65 63 6b 7d 20 7b 0a 20 20  ntax check} {.  
1a30: 20 20 73 65 74 20 64 6f 63 20 5b 64 6f 6d 20 70    set doc [dom p
1a40: 61 72 73 65 20 2d 6b 65 65 70 45 6d 70 74 69 65  arse -keepEmptie
1a50: 73 20 7b 3c 72 6f 6f 74 3e 0a 20 20 74 65 78 74  s {<root>.  text
1a60: 0a 20 20 20 20 3c 2f 72 6f 6f 74 3e 7d 5d 0a 20  .    </root>}]. 
1a70: 20 20 20 73 65 74 20 72 65 73 75 6c 74 20 5b 24     set result [$
1a80: 64 6f 63 20 61 73 58 4d 4c 20 2d 69 6e 64 65 6e  doc asXML -inden
1a90: 74 20 6e 6f 6e 65 5d 0a 20 20 20 20 24 64 6f 63  t none].    $doc
1aa0: 20 64 65 6c 65 74 65 0a 20 20 20 20 73 65 74 20   delete.    set 
1ab0: 72 65 73 75 6c 74 0a 7d 20 7b 3c 72 6f 6f 74 3e  result.} {<root>
1ac0: 0a 20 20 74 65 78 74 0a 20 20 20 20 3c 2f 72 6f  .  text.    </ro
1ad0: 6f 74 3e 7d 0a 0a 74 65 73 74 20 64 6f 6d 2d 32  ot>}..test dom-2
1ae0: 2e 35 20 7b 70 61 72 73 65 20 6d 65 74 68 6f 64  .5 {parse method
1af0: 3a 20 73 79 6e 74 61 78 20 63 68 65 63 6b 7d 20  : syntax check} 
1b00: 7b 0a 20 20 20 20 73 65 74 20 64 6f 63 20 5b 64  {.    set doc [d
1b10: 6f 6d 20 70 61 72 73 65 20 2d 75 73 65 46 6f 72  om parse -useFor
1b20: 65 69 67 6e 44 54 44 20 30 20 2d 6b 65 65 70 45  eignDTD 0 -keepE
1b30: 6d 70 74 69 65 73 20 7b 3c 72 6f 6f 74 3e 0a 20  mpties {<root>. 
1b40: 20 74 65 78 74 0a 20 20 20 20 3c 2f 72 6f 6f 74   text.    </root
1b50: 3e 7d 5d 0a 20 20 20 20 73 65 74 20 72 65 73 75  >}].    set resu
1b60: 6c 74 20 5b 24 64 6f 63 20 61 73 58 4d 4c 20 2d  lt [$doc asXML -
1b70: 69 6e 64 65 6e 74 20 6e 6f 6e 65 5d 0a 20 20 20  indent none].   
1b80: 20 24 64 6f 63 20 64 65 6c 65 74 65 0a 20 20 20   $doc delete.   
1b90: 20 73 65 74 20 72 65 73 75 6c 74 0a 7d 20 7b 3c   set result.} {<
1ba0: 72 6f 6f 74 3e 0a 20 20 74 65 78 74 0a 20 20 20  root>.  text.   
1bb0: 20 3c 2f 72 6f 6f 74 3e 7d 0a 0a 74 65 73 74 20   </root>}..test 
1bc0: 64 6f 6d 2d 32 2e 36 20 7b 70 61 72 73 65 20 6d  dom-2.6 {parse m
1bd0: 65 74 68 6f 64 3a 20 73 79 6e 74 61 78 20 63 68  ethod: syntax ch
1be0: 65 63 6b 7d 20 2d 73 65 74 75 70 20 7b 0a 20 20  eck} -setup {.  
1bf0: 20 20 73 65 74 20 78 6d 6c 46 69 6c 65 20 5b 6d    set xmlFile [m
1c00: 61 6b 65 46 69 6c 65 20 7b 3c 72 6f 6f 74 3e 20  akeFile {<root> 
1c10: 20 20 20 3c 2f 72 6f 6f 74 3e 7d 20 64 6f 6d 2e     </root>} dom.
1c20: 78 6d 6c 5d 0a 7d 20 2d 62 6f 64 79 20 7b 0a 20  xml].} -body {. 
1c30: 20 20 20 73 65 74 20 66 64 20 5b 6f 70 65 6e 20     set fd [open 
1c40: 24 78 6d 6c 46 69 6c 65 5d 0a 20 20 20 20 73 65  $xmlFile].    se
1c50: 74 20 64 6f 63 20 5b 64 6f 6d 20 70 61 72 73 65  t doc [dom parse
1c60: 20 2d 63 68 61 6e 6e 65 6c 20 24 66 64 20 2d 6b   -channel $fd -k
1c70: 65 65 70 45 6d 70 74 69 65 73 5d 0a 20 20 20 20  eepEmpties].    
1c80: 63 6c 6f 73 65 20 24 66 64 0a 20 20 20 20 73 65  close $fd.    se
1c90: 74 20 72 6f 6f 74 20 5b 24 64 6f 63 20 64 6f 63  t root [$doc doc
1ca0: 75 6d 65 6e 74 45 6c 65 6d 65 6e 74 5d 0a 20 20  umentElement].  
1cb0: 20 20 73 65 74 20 72 65 73 75 6c 74 20 5b 24 72    set result [$r
1cc0: 6f 6f 74 20 61 73 58 4d 4c 20 2d 69 6e 64 65 6e  oot asXML -inden
1cd0: 74 20 6e 6f 6e 65 5d 0a 20 20 20 20 24 64 6f 63  t none].    $doc
1ce0: 20 64 65 6c 65 74 65 0a 20 20 20 20 73 65 74 20   delete.    set 
1cf0: 72 65 73 75 6c 74 0a 7d 20 2d 63 6c 65 61 6e 75  result.} -cleanu
1d00: 70 20 7b 0a 20 20 20 20 72 65 6d 6f 76 65 46 69  p {.    removeFi
1d10: 6c 65 20 64 6f 6d 2e 78 6d 6c 0a 7d 20 2d 72 65  le dom.xml.} -re
1d20: 73 75 6c 74 20 7b 3c 72 6f 6f 74 3e 20 20 20 20  sult {<root>    
1d30: 3c 2f 72 6f 6f 74 3e 7d 0a 0a 74 65 73 74 20 64  </root>}..test d
1d40: 6f 6d 2d 32 2e 37 20 7b 70 61 72 73 65 20 6d 65  om-2.7 {parse me
1d50: 74 68 6f 64 3a 20 73 79 6e 74 61 78 20 63 68 65  thod: syntax che
1d60: 63 6b 7d 20 2d 73 65 74 75 70 20 7b 0a 20 20 20  ck} -setup {.   
1d70: 20 73 65 74 20 78 6d 6c 46 69 6c 65 20 5b 6d 61   set xmlFile [ma
1d80: 6b 65 46 69 6c 65 20 7b 3c 72 6f 6f 74 3e 20 20  keFile {<root>  
1d90: 20 20 3c 2f 72 6f 6f 74 3e 7d 20 64 6f 6d 2e 78    </root>} dom.x
1da0: 6d 6c 5d 0a 7d 20 2d 62 6f 64 79 20 7b 0a 20 20  ml].} -body {.  
1db0: 20 20 63 61 74 63 68 20 7b 75 6e 73 65 74 20 2d    catch {unset -
1dc0: 6b 65 65 70 45 6d 70 74 69 65 73 7d 0a 20 20 20  keepEmpties}.   
1dd0: 20 73 65 74 20 66 64 20 5b 6f 70 65 6e 20 24 78   set fd [open $x
1de0: 6d 6c 46 69 6c 65 5d 0a 20 20 20 20 73 65 74 20  mlFile].    set 
1df0: 64 6f 63 20 5b 64 6f 6d 20 70 61 72 73 65 20 2d  doc [dom parse -
1e00: 63 68 61 6e 6e 65 6c 20 24 66 64 20 2d 6b 65 65  channel $fd -kee
1e10: 70 45 6d 70 74 69 65 73 5d 0a 20 20 20 20 63 6c  pEmpties].    cl
1e20: 6f 73 65 20 24 66 64 0a 20 20 20 20 24 64 6f 63  ose $fd.    $doc
1e30: 20 64 65 6c 65 74 65 0a 20 20 20 20 69 6e 66 6f   delete.    info
1e40: 20 65 78 69 73 74 73 20 2d 6b 65 65 70 45 6d 70   exists -keepEmp
1e50: 74 69 65 73 0a 7d 20 2d 63 6c 65 61 6e 75 70 20  ties.} -cleanup 
1e60: 7b 0a 20 20 20 20 72 65 6d 6f 76 65 46 69 6c 65  {.    removeFile
1e70: 20 64 6f 6d 2e 78 6d 6c 0a 7d 20 2d 72 65 73 75   dom.xml.} -resu
1e80: 6c 74 20 30 0a 0a 74 65 73 74 20 64 6f 6d 2d 32  lt 0..test dom-2
1e90: 2e 38 20 7b 70 61 72 73 65 20 6d 65 74 68 6f 64  .8 {parse method
1ea0: 3a 20 62 6f 67 75 73 20 6f 70 74 69 6f 6e 7d 20  : bogus option} 
1eb0: 2d 62 6f 64 79 20 7b 0a 20 20 20 20 73 65 74 20  -body {.    set 
1ec0: 72 65 73 75 6c 74 20 5b 63 61 74 63 68 20 7b 73  result [catch {s
1ed0: 65 74 20 64 6f 63 20 5b 64 6f 6d 20 70 61 72 73  et doc [dom pars
1ee0: 65 20 2d 62 6f 67 75 73 4f 70 74 69 6f 6e 20 66  e -bogusOption f
1ef0: 6f 6f 20 3c 72 6f 6f 74 2f 3e 5d 7d 20 65 72 72  oo <root/>]} err
1f00: 4d 73 67 5d 0a 20 20 20 20 6c 61 70 70 65 6e 64  Msg].    lappend
1f10: 20 72 65 73 75 6c 74 20 24 65 72 72 4d 73 67 0a   result $errMsg.
1f20: 7d 20 2d 6d 61 74 63 68 20 72 65 67 65 78 70 20  } -match regexp 
1f30: 2d 72 65 73 75 6c 74 20 7b 31 20 7b 62 61 64 20  -result {1 {bad 
1f40: 6f 70 74 69 6f 6e 20 22 2d 62 6f 67 75 73 4f 70  option "-bogusOp
1f50: 74 69 6f 6e 22 3a 20 6d 75 73 74 20 62 65 20 2e  tion": must be .
1f60: 2a 7d 7d 0a 0a 74 65 73 74 20 64 6f 6d 2d 32 2e  *}}..test dom-2.
1f70: 39 20 7b 70 61 72 73 65 20 6d 65 74 68 6f 64 3a  9 {parse method:
1f80: 20 62 6f 67 75 73 20 6f 70 74 69 6f 6e 7d 20 2d   bogus option} -
1f90: 73 65 74 75 70 20 7b 0a 20 20 20 20 73 65 74 20  setup {.    set 
1fa0: 78 6d 6c 46 69 6c 65 20 5b 6d 61 6b 65 46 69 6c  xmlFile [makeFil
1fb0: 65 20 7b 3c 72 6f 6f 74 3e 20 20 20 20 3c 2f 72  e {<root>    </r
1fc0: 6f 6f 74 3e 7d 20 64 6f 6d 2e 78 6d 6c 5d 0a 7d  oot>} dom.xml].}
1fd0: 20 2d 62 6f 64 79 20 7b 0a 20 20 20 20 63 61 74   -body {.    cat
1fe0: 63 68 20 7b 75 6e 73 65 74 20 2d 6b 65 65 70 45  ch {unset -keepE
1ff0: 6d 70 74 69 65 73 7d 0a 20 20 20 20 73 65 74 20  mpties}.    set 
2000: 66 64 20 5b 6f 70 65 6e 20 24 78 6d 6c 46 69 6c  fd [open $xmlFil
2010: 65 5d 0a 20 20 20 20 73 65 74 20 72 65 73 75 6c  e].    set resul
2020: 74 20 5b 63 61 74 63 68 20 7b 73 65 74 20 64 6f  t [catch {set do
2030: 63 20 5b 64 6f 6d 20 70 61 72 73 65 20 2d 63 68  c [dom parse -ch
2040: 61 6e 6e 65 6c 20 24 66 64 20 2d 62 6f 67 75 73  annel $fd -bogus
2050: 4f 70 74 69 6f 6e 5d 7d 20 65 72 72 4d 73 67 5d  Option]} errMsg]
2060: 0a 20 20 20 20 63 6c 6f 73 65 20 24 66 64 0a 20  .    close $fd. 
2070: 20 20 20 6c 61 70 70 65 6e 64 20 72 65 73 75 6c     lappend resul
2080: 74 20 24 65 72 72 4d 73 67 0a 7d 20 2d 63 6c 65  t $errMsg.} -cle
2090: 61 6e 75 70 20 7b 0a 20 20 20 20 72 65 6d 6f 76  anup {.    remov
20a0: 65 46 69 6c 65 20 64 6f 6d 2e 78 6d 6c 0a 7d 20  eFile dom.xml.} 
20b0: 2d 6d 61 74 63 68 20 72 65 67 65 78 70 20 2d 72  -match regexp -r
20c0: 65 73 75 6c 74 20 7b 31 20 7b 62 61 64 20 6f 70  esult {1 {bad op
20d0: 74 69 6f 6e 20 22 2d 62 6f 67 75 73 4f 70 74 69  tion "-bogusOpti
20e0: 6f 6e 22 3a 20 6d 75 73 74 20 62 65 20 2e 2a 7d  on": must be .*}
20f0: 7d 0a 0a 73 65 74 20 64 6f 6d 5f 64 74 64 20 22  }..set dom_dtd "
2100: 0a 20 20 20 20 3c 21 45 4c 45 4d 45 4e 54 20 72  .    <!ELEMENT r
2110: 6f 6f 74 20 45 4d 50 54 59 3e 0a 20 20 20 20 3c  oot EMPTY>.    <
2120: 21 41 54 54 4c 49 53 54 20 72 6f 6f 74 20 6c 61  !ATTLIST root la
2130: 6e 67 20 43 44 41 54 41 20 23 46 49 58 45 44 20  ng CDATA #FIXED 
2140: 5c 22 65 6e 5c 22 3e 22 0a 0a 70 72 6f 63 20 65  \"en\">"..proc e
2150: 78 74 52 65 66 52 65 73 6f 6c 76 65 72 20 7b 62  xtRefResolver {b
2160: 61 73 65 20 73 79 73 74 65 6d 49 64 20 70 75 62  ase systemId pub
2170: 6c 69 63 49 64 7d 20 7b 0a 20 20 20 20 67 6c 6f  licId} {.    glo
2180: 62 61 6c 20 64 6f 6d 5f 64 74 64 0a 0a 20 20 20  bal dom_dtd..   
2190: 20 69 66 20 7b 24 70 75 62 6c 69 63 49 64 20 3d   if {$publicId =
21a0: 3d 20 22 44 4f 4d 43 4d 44 54 45 53 54 22 7d 20  = "DOMCMDTEST"} 
21b0: 7b 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e  {.        return
21c0: 20 5b 6c 69 73 74 20 73 74 72 69 6e 67 20 24 62   [list string $b
21d0: 61 73 65 20 24 64 6f 6d 5f 64 74 64 5d 0a 20 20  ase $dom_dtd].  
21e0: 20 20 7d 20 65 6c 73 65 20 7b 0a 20 20 20 20 20    } else {.     
21f0: 20 20 20 72 65 74 75 72 6e 20 5b 3a 3a 74 64 6f     return [::tdo
2200: 6d 3a 3a 65 78 74 52 65 66 48 61 6e 64 6c 65 72  m::extRefHandler
2210: 20 24 62 61 73 65 20 24 73 79 73 74 65 6d 49 64   $base $systemId
2220: 20 24 70 75 62 6c 69 63 49 64 5d 0a 20 20 20 20   $publicId].    
2230: 7d 0a 7d 0a 0a 74 65 73 74 20 64 6f 6d 2d 32 2e  }.}..test dom-2.
2240: 31 30 20 7b 70 61 72 73 65 20 6d 65 74 68 6f 64  10 {parse method
2250: 3a 20 2d 70 61 72 61 6d 65 6e 74 69 74 79 70 61  : -paramentitypa
2260: 72 73 69 6e 67 20 64 65 66 61 75 6c 74 20 69 73  rsing default is
2270: 20 27 61 6c 77 61 79 73 27 7d 20 7b 0a 20 20 20   'always'} {.   
2280: 20 73 65 74 20 64 6f 63 20 5b 64 6f 6d 20 70 61   set doc [dom pa
2290: 72 73 65 20 2d 65 78 74 65 72 6e 61 6c 65 6e 74  rse -externalent
22a0: 69 74 79 63 6f 6d 6d 61 6e 64 20 65 78 74 52 65  itycommand extRe
22b0: 66 52 65 73 6f 6c 76 65 72 20 7b 0a 20 20 20 20  fResolver {.    
22c0: 20 20 20 20 3c 21 44 4f 43 54 59 50 45 20 72 6f      <!DOCTYPE ro
22d0: 6f 74 20 50 55 42 4c 49 43 20 22 44 4f 4d 43 4d  ot PUBLIC "DOMCM
22e0: 44 54 45 53 54 22 20 22 64 75 6d 6d 79 73 79 73  DTEST" "dummysys
22f0: 74 65 6d 49 44 22 3e 0a 20 20 20 20 20 20 20 20  temID">.        
2300: 3c 72 6f 6f 74 2f 3e 0a 20 20 20 20 7d 5d 0a 20  <root/>.    }]. 
2310: 20 20 20 73 65 74 20 72 6f 6f 74 20 5b 24 64 6f     set root [$do
2320: 63 20 64 6f 63 75 6d 65 6e 74 45 6c 65 6d 65 6e  c documentElemen
2330: 74 5d 0a 20 20 20 20 73 65 74 20 72 65 73 75 6c  t].    set resul
2340: 74 20 5b 24 72 6f 6f 74 20 40 6c 61 6e 67 5d 0a  t [$root @lang].
2350: 20 20 20 20 24 64 6f 63 20 64 65 6c 65 74 65 0a      $doc delete.
2360: 20 20 20 20 73 65 74 20 72 65 73 75 6c 74 0a 7d      set result.}
2370: 20 7b 65 6e 7d 0a 0a 74 65 73 74 20 64 6f 6d 2d   {en}..test dom-
2380: 32 2e 31 31 20 7b 70 61 72 73 65 20 6d 65 74 68  2.11 {parse meth
2390: 6f 64 3a 20 65 78 70 6c 69 63 69 74 20 2d 70 61  od: explicit -pa
23a0: 72 61 6d 65 6e 74 69 74 79 70 61 72 73 69 6e 67  ramentityparsing
23b0: 20 61 6c 77 61 79 73 7d 20 7b 0a 20 20 20 20 73   always} {.    s
23c0: 65 74 20 64 6f 63 20 5b 64 6f 6d 20 70 61 72 73  et doc [dom pars
23d0: 65 20 2d 65 78 74 65 72 6e 61 6c 65 6e 74 69 74  e -externalentit
23e0: 79 63 6f 6d 6d 61 6e 64 20 65 78 74 52 65 66 52  ycommand extRefR
23f0: 65 73 6f 6c 76 65 72 20 5c 0a 20 20 20 20 20 20  esolver \.      
2400: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2410: 20 2d 70 61 72 61 6d 65 6e 74 69 74 79 70 61 72   -paramentitypar
2420: 73 69 6e 67 20 61 6c 77 61 79 73 20 7b 0a 20 20  sing always {.  
2430: 20 20 20 20 20 20 3c 21 44 4f 43 54 59 50 45 20        <!DOCTYPE 
2440: 72 6f 6f 74 20 50 55 42 4c 49 43 20 22 44 4f 4d  root PUBLIC "DOM
2450: 43 4d 44 54 45 53 54 22 20 22 64 75 6d 6d 79 73  CMDTEST" "dummys
2460: 79 73 74 65 6d 49 44 22 3e 0a 20 20 20 20 20 20  ystemID">.      
2470: 20 20 3c 72 6f 6f 74 2f 3e 0a 20 20 20 20 7d 5d    <root/>.    }]
2480: 0a 20 20 20 20 73 65 74 20 72 6f 6f 74 20 5b 24  .    set root [$
2490: 64 6f 63 20 64 6f 63 75 6d 65 6e 74 45 6c 65 6d  doc documentElem
24a0: 65 6e 74 5d 0a 20 20 20 20 73 65 74 20 72 65 73  ent].    set res
24b0: 75 6c 74 20 5b 24 72 6f 6f 74 20 40 6c 61 6e 67  ult [$root @lang
24c0: 5d 0a 20 20 20 20 24 64 6f 63 20 64 65 6c 65 74  ].    $doc delet
24d0: 65 0a 20 20 20 20 73 65 74 20 72 65 73 75 6c 74  e.    set result
24e0: 0a 7d 20 7b 65 6e 7d 0a 0a 74 65 73 74 20 64 6f  .} {en}..test do
24f0: 6d 2d 32 2e 31 32 20 7b 70 61 72 73 65 20 6d 65  m-2.12 {parse me
2500: 74 68 6f 64 3a 20 2d 70 61 72 61 6d 65 6e 74 69  thod: -paramenti
2510: 74 79 70 61 72 73 69 6e 67 20 6e 65 76 65 72 7d  typarsing never}
2520: 20 7b 0a 20 20 20 20 73 65 74 20 64 6f 63 20 5b   {.    set doc [
2530: 64 6f 6d 20 70 61 72 73 65 20 2d 65 78 74 65 72  dom parse -exter
2540: 6e 61 6c 65 6e 74 69 74 79 63 6f 6d 6d 61 6e 64  nalentitycommand
2550: 20 65 78 74 52 65 66 52 65 73 6f 6c 76 65 72 20   extRefResolver 
2560: 5c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  \.              
2570: 20 20 20 20 20 20 20 20 20 2d 70 61 72 61 6d 65           -parame
2580: 6e 74 69 74 79 70 61 72 73 69 6e 67 20 6e 65 76  ntityparsing nev
2590: 65 72 20 7b 0a 20 20 20 20 20 20 20 20 3c 21 44  er {.        <!D
25a0: 4f 43 54 59 50 45 20 72 6f 6f 74 20 50 55 42 4c  OCTYPE root PUBL
25b0: 49 43 20 22 44 4f 4d 43 4d 44 54 45 53 54 22 20  IC "DOMCMDTEST" 
25c0: 22 64 75 6d 6d 79 73 79 73 74 65 6d 49 44 22 3e  "dummysystemID">
25d0: 0a 20 20 20 20 20 20 20 20 3c 72 6f 6f 74 2f 3e  .        <root/>
25e0: 0a 20 20 20 20 7d 5d 0a 20 20 20 20 73 65 74 20  .    }].    set 
25f0: 72 6f 6f 74 20 5b 24 64 6f 63 20 64 6f 63 75 6d  root [$doc docum
2600: 65 6e 74 45 6c 65 6d 65 6e 74 5d 0a 20 20 20 20  entElement].    
2610: 73 65 74 20 72 65 73 75 6c 74 20 5b 63 61 74 63  set result [catc
2620: 68 20 7b 73 65 74 20 72 65 73 75 6c 74 20 5b 24  h {set result [$
2630: 72 6f 6f 74 20 40 6c 61 6e 67 5d 7d 20 65 72 72  root @lang]} err
2640: 4d 73 67 5d 0a 20 20 20 20 24 64 6f 63 20 64 65  Msg].    $doc de
2650: 6c 65 74 65 0a 20 20 20 20 6c 61 70 70 65 6e 64  lete.    lappend
2660: 20 72 65 73 75 6c 74 20 24 65 72 72 4d 73 67 0a   result $errMsg.
2670: 20 20 20 20 73 65 74 20 72 65 73 75 6c 74 0a 7d      set result.}
2680: 20 7b 31 20 7b 41 74 74 72 69 62 75 74 65 20 22   {1 {Attribute "
2690: 6c 61 6e 67 22 20 6e 6f 74 20 66 6f 75 6e 64 21  lang" not found!
26a0: 7d 7d 0a 0a 74 65 73 74 20 64 6f 6d 2d 32 2e 31  }}..test dom-2.1
26b0: 33 20 7b 70 61 72 73 65 20 6d 65 74 68 6f 64 3a  3 {parse method:
26c0: 20 2d 70 61 72 61 6d 65 6e 74 69 74 79 70 61 72   -paramentitypar
26d0: 73 69 6e 67 20 6e 6f 74 73 74 61 6e 64 61 6c 6f  sing notstandalo
26e0: 6e 65 7d 20 7b 0a 20 20 20 20 73 65 74 20 64 6f  ne} {.    set do
26f0: 63 20 5b 64 6f 6d 20 70 61 72 73 65 20 2d 65 78  c [dom parse -ex
2700: 74 65 72 6e 61 6c 65 6e 74 69 74 79 63 6f 6d 6d  ternalentitycomm
2710: 61 6e 64 20 65 78 74 52 65 66 52 65 73 6f 6c 76  and extRefResolv
2720: 65 72 20 5c 0a 20 20 20 20 20 20 20 20 20 20 20  er \.           
2730: 20 20 20 20 20 20 20 20 20 20 20 20 2d 70 61 72              -par
2740: 61 6d 65 6e 74 69 74 79 70 61 72 73 69 6e 67 20  amentityparsing 
2750: 6e 6f 74 73 74 61 6e 64 61 6c 6f 6e 65 20 7b 0a  notstandalone {.
2760: 20 20 20 20 20 20 20 20 3c 21 44 4f 43 54 59 50          <!DOCTYP
2770: 45 20 72 6f 6f 74 20 50 55 42 4c 49 43 20 22 44  E root PUBLIC "D
2780: 4f 4d 43 4d 44 54 45 53 54 22 20 22 64 75 6d 6d  OMCMDTEST" "dumm
2790: 79 73 79 73 74 65 6d 49 44 22 3e 0a 20 20 20 20  ysystemID">.    
27a0: 20 20 20 20 3c 72 6f 6f 74 2f 3e 0a 20 20 20 20      <root/>.    
27b0: 7d 5d 0a 20 20 20 20 73 65 74 20 72 6f 6f 74 20  }].    set root 
27c0: 5b 24 64 6f 63 20 64 6f 63 75 6d 65 6e 74 45 6c  [$doc documentEl
27d0: 65 6d 65 6e 74 5d 0a 20 20 20 20 73 65 74 20 72  ement].    set r
27e0: 65 73 75 6c 74 20 5b 24 72 6f 6f 74 20 40 6c 61  esult [$root @la
27f0: 6e 67 5d 0a 20 20 20 20 24 64 6f 63 20 64 65 6c  ng].    $doc del
2800: 65 74 65 0a 20 20 20 20 73 65 74 20 72 65 73 75  ete.    set resu
2810: 6c 74 0a 7d 20 7b 65 6e 7d 0a 0a 74 65 73 74 20  lt.} {en}..test 
2820: 64 6f 6d 2d 32 2e 31 34 20 7b 70 61 72 73 65 20  dom-2.14 {parse 
2830: 6d 65 74 68 6f 64 3a 20 2d 70 61 72 61 6d 65 6e  method: -paramen
2840: 74 69 74 79 70 61 72 73 69 6e 67 20 6e 6f 74 73  tityparsing nots
2850: 74 61 6e 64 61 6c 6f 6e 65 7d 20 7b 0a 20 20 20  tandalone} {.   
2860: 20 73 65 74 20 64 6f 63 20 5b 64 6f 6d 20 70 61   set doc [dom pa
2870: 72 73 65 20 2d 65 78 74 65 72 6e 61 6c 65 6e 74  rse -externalent
2880: 69 74 79 63 6f 6d 6d 61 6e 64 20 65 78 74 52 65  itycommand extRe
2890: 66 52 65 73 6f 6c 76 65 72 20 5c 0a 20 20 20 20  fResolver \.    
28a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
28b0: 20 20 20 2d 70 61 72 61 6d 65 6e 74 69 74 79 70     -paramentityp
28c0: 61 72 73 69 6e 67 20 6e 6f 74 73 74 61 6e 64 61  arsing notstanda
28d0: 6c 6f 6e 65 20 5c 0a 20 20 20 20 20 20 20 20 20  lone \.         
28e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7b 3c                {<
28f0: 3f 78 6d 6c 20 76 65 72 73 69 6f 6e 3d 22 31 2e  ?xml version="1.
2900: 30 22 20 73 74 61 6e 64 61 6c 6f 6e 65 3d 22 79  0" standalone="y
2910: 65 73 22 3f 3e 0a 20 20 20 20 20 20 20 20 3c 21  es"?>.        <!
2920: 44 4f 43 54 59 50 45 20 72 6f 6f 74 20 50 55 42  DOCTYPE root PUB
2930: 4c 49 43 20 22 44 4f 4d 43 4d 44 54 45 53 54 22  LIC "DOMCMDTEST"
2940: 20 22 64 75 6d 6d 79 73 79 73 74 65 6d 49 44 22   "dummysystemID"
2950: 3e 0a 20 20 20 20 20 20 20 20 3c 72 6f 6f 74 2f  >.        <root/
2960: 3e 0a 20 20 20 20 7d 5d 0a 20 20 20 20 73 65 74  >.    }].    set
2970: 20 72 6f 6f 74 20 5b 24 64 6f 63 20 64 6f 63 75   root [$doc docu
2980: 6d 65 6e 74 45 6c 65 6d 65 6e 74 5d 0a 20 20 20  mentElement].   
2990: 20 73 65 74 20 72 65 73 75 6c 74 20 5b 63 61 74   set result [cat
29a0: 63 68 20 7b 73 65 74 20 72 65 73 75 6c 74 20 5b  ch {set result [
29b0: 24 72 6f 6f 74 20 40 6c 61 6e 67 5d 7d 20 65 72  $root @lang]} er
29c0: 72 4d 73 67 5d 0a 20 20 20 20 24 64 6f 63 20 64  rMsg].    $doc d
29d0: 65 6c 65 74 65 0a 20 20 20 20 6c 61 70 70 65 6e  elete.    lappen
29e0: 64 20 72 65 73 75 6c 74 20 24 65 72 72 4d 73 67  d result $errMsg
29f0: 0a 20 20 20 20 73 65 74 20 72 65 73 75 6c 74 0a  .    set result.
2a00: 7d 20 7b 31 20 7b 41 74 74 72 69 62 75 74 65 20  } {1 {Attribute 
2a10: 22 6c 61 6e 67 22 20 6e 6f 74 20 66 6f 75 6e 64  "lang" not found
2a20: 21 7d 7d 0a 0a 74 65 73 74 20 64 6f 6d 2d 32 2e  !}}..test dom-2.
2a30: 31 35 20 7b 70 61 72 73 65 20 6d 65 74 68 6f 64  15 {parse method
2a40: 3a 20 2d 70 61 72 61 6d 65 6e 74 69 74 79 70 61  : -paramentitypa
2a50: 72 73 69 6e 67 20 6e 6f 74 73 74 61 6e 64 61 6c  rsing notstandal
2a60: 6f 6e 65 7d 20 7b 0a 20 20 20 20 73 65 74 20 64  one} {.    set d
2a70: 6f 63 20 5b 64 6f 6d 20 70 61 72 73 65 20 2d 65  oc [dom parse -e
2a80: 78 74 65 72 6e 61 6c 65 6e 74 69 74 79 63 6f 6d  xternalentitycom
2a90: 6d 61 6e 64 20 65 78 74 52 65 66 52 65 73 6f 6c  mand extRefResol
2aa0: 76 65 72 20 5c 0a 20 20 20 20 20 20 20 20 20 20  ver \.          
2ab0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2d 70 61               -pa
2ac0: 72 61 6d 65 6e 74 69 74 79 70 61 72 73 69 6e 67  ramentityparsing
2ad0: 20 6e 6f 74 73 74 61 6e 64 61 6c 6f 6e 65 20 5c   notstandalone \
2ae0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
2af0: 20 20 20 20 20 20 20 20 7b 3c 3f 78 6d 6c 20 76          {<?xml v
2b00: 65 72 73 69 6f 6e 3d 22 31 2e 30 22 20 73 74 61  ersion="1.0" sta
2b10: 6e 64 61 6c 6f 6e 65 3d 22 6e 6f 22 3f 3e 0a 20  ndalone="no"?>. 
2b20: 20 20 20 20 20 20 20 3c 21 44 4f 43 54 59 50 45         <!DOCTYPE
2b30: 20 72 6f 6f 74 20 50 55 42 4c 49 43 20 22 44 4f   root PUBLIC "DO
2b40: 4d 43 4d 44 54 45 53 54 22 20 22 64 75 6d 6d 79  MCMDTEST" "dummy
2b50: 73 79 73 74 65 6d 49 44 22 3e 0a 20 20 20 20 20  systemID">.     
2b60: 20 20 20 3c 72 6f 6f 74 2f 3e 0a 20 20 20 20 7d     <root/>.    }
2b70: 5d 0a 20 20 20 20 73 65 74 20 72 6f 6f 74 20 5b  ].    set root [
2b80: 24 64 6f 63 20 64 6f 63 75 6d 65 6e 74 45 6c 65  $doc documentEle
2b90: 6d 65 6e 74 5d 0a 20 20 20 20 73 65 74 20 72 65  ment].    set re
2ba0: 73 75 6c 74 20 5b 24 72 6f 6f 74 20 40 6c 61 6e  sult [$root @lan
2bb0: 67 5d 0a 20 20 20 20 24 64 6f 63 20 64 65 6c 65  g].    $doc dele
2bc0: 74 65 0a 20 20 20 20 73 65 74 20 72 65 73 75 6c  te.    set resul
2bd0: 74 0a 7d 20 7b 65 6e 7d 0a 0a 74 65 73 74 20 64  t.} {en}..test d
2be0: 6f 6d 2d 32 2e 31 36 20 7b 70 61 72 73 65 20 6d  om-2.16 {parse m
2bf0: 65 74 68 6f 64 3a 20 77 72 6f 6e 67 20 76 61 6c  ethod: wrong val
2c00: 75 65 20 61 72 67 20 66 6f 72 20 2d 70 61 72 61  ue arg for -para
2c10: 6d 65 6e 74 69 74 79 70 61 72 73 69 6e 67 7d 20  mentityparsing} 
2c20: 7b 0a 20 20 20 20 73 65 74 20 72 65 73 75 6c 74  {.    set result
2c30: 20 5b 63 61 74 63 68 20 7b 73 65 74 20 64 6f 63   [catch {set doc
2c40: 20 5b 64 6f 6d 20 70 61 72 73 65 20 2d 70 61 72   [dom parse -par
2c50: 61 6d 65 6e 74 69 74 79 70 61 72 73 69 6e 67 20  amentityparsing 
2c60: 77 72 6f 6e 67 20 7b 0a 20 20 20 20 20 20 20 20  wrong {.        
2c70: 3c 72 6f 6f 74 2f 3e 7d 5d 7d 20 65 72 72 4d 73  <root/>}]} errMs
2c80: 67 5d 0a 20 20 20 20 6c 61 70 70 65 6e 64 20 72  g].    lappend r
2c90: 65 73 75 6c 74 20 24 65 72 72 4d 73 67 0a 7d 20  esult $errMsg.} 
2ca0: 7b 31 20 7b 62 61 64 20 76 61 6c 75 65 20 22 77  {1 {bad value "w
2cb0: 72 6f 6e 67 22 3a 20 6d 75 73 74 20 62 65 20 61  rong": must be a
2cc0: 6c 77 61 79 73 2c 20 6e 65 76 65 72 2c 20 6f 72  lways, never, or
2cd0: 20 6e 6f 74 73 74 61 6e 64 61 6c 6f 6e 65 7d 7d   notstandalone}}
2ce0: 0a 0a 23 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e  ..# The followin
2cf0: 67 20 69 73 20 73 79 6e 74 61 63 74 69 63 61 6c  g is syntactical
2d00: 6c 79 20 77 72 6f 6e 67 2e 20 49 74 27 73 20 75  ly wrong. It's u
2d10: 73 65 64 2c 20 74 6f 20 74 65 73 74 20 74 68 65  sed, to test the
2d20: 0a 23 20 65 72 72 6f 72 20 72 65 70 6f 72 74 69  .# error reporti
2d30: 6e 67 20 69 6e 20 65 78 74 65 72 6e 61 6c 20 44  ng in external D
2d40: 54 44 73 0a 73 65 74 20 64 6f 6d 5f 64 74 64 20  TDs.set dom_dtd 
2d50: 22 3c 21 41 54 54 4c 49 53 54 20 72 6f 6f 74 20  "<!ATTLIST root 
2d60: 6c 61 6e 67 20 23 46 49 58 45 44 20 5c 22 65 6e  lang #FIXED \"en
2d70: 5c 22 3e 22 0a 0a 74 65 73 74 20 64 6f 6d 2d 32  \">"..test dom-2
2d80: 2e 31 37 20 7b 70 61 72 73 65 20 6d 65 74 68 6f  .17 {parse metho
2d90: 64 3a 20 74 65 73 74 20 72 65 70 6f 72 74 69 6e  d: test reportin
2da0: 67 20 6f 66 20 65 72 72 6f 72 20 69 6e 20 65 78  g of error in ex
2db0: 74 65 72 6e 61 6c 20 73 75 62 73 65 74 7d 20 7b  ternal subset} {
2dc0: 0a 20 20 20 20 73 65 74 20 72 65 73 75 6c 74 20  .    set result 
2dd0: 5b 63 61 74 63 68 20 7b 73 65 74 20 64 6f 63 20  [catch {set doc 
2de0: 5b 64 6f 6d 20 70 61 72 73 65 20 5c 0a 20 20 20  [dom parse \.   
2df0: 20 20 20 20 20 20 20 20 20 2d 65 78 74 65 72 6e           -extern
2e00: 61 6c 65 6e 74 69 74 79 63 6f 6d 6d 61 6e 64 20  alentitycommand 
2e10: 65 78 74 52 65 66 52 65 73 6f 6c 76 65 72 20 7b  extRefResolver {
2e20: 0a 20 20 20 20 20 20 20 20 3c 21 44 4f 43 54 59  .        <!DOCTY
2e30: 50 45 20 72 6f 6f 74 20 50 55 42 4c 49 43 20 22  PE root PUBLIC "
2e40: 44 4f 4d 43 4d 44 54 45 53 54 22 20 22 64 75 6d  DOMCMDTEST" "dum
2e50: 6d 79 73 79 73 74 65 6d 49 44 22 3e 0a 20 20 20  mysystemID">.   
2e60: 20 20 20 20 20 3c 72 6f 6f 74 2f 3e 0a 20 20 20       <root/>.   
2e70: 20 7d 5d 7d 20 65 72 72 4d 73 67 5d 0a 20 20 20   }]} errMsg].   
2e80: 20 6c 61 70 70 65 6e 64 20 72 65 73 75 6c 74 20   lappend result 
2e90: 24 65 72 72 4d 73 67 0a 7d 20 7b 31 20 7b 65 72  $errMsg.} {1 {er
2ea0: 72 6f 72 20 22 73 79 6e 74 61 78 20 65 72 72 6f  ror "syntax erro
2eb0: 72 22 20 69 6e 20 65 6e 74 69 74 79 20 22 64 75  r" in entity "du
2ec0: 6d 6d 79 73 79 73 74 65 6d 49 44 22 20 61 74 20  mmysystemID" at 
2ed0: 6c 69 6e 65 20 31 20 63 68 61 72 61 63 74 65 72  line 1 character
2ee0: 20 32 30 0a 22 3c 21 41 54 54 4c 49 53 54 20 72   20."<!ATTLIST r
2ef0: 6f 6f 74 20 6c 61 6e 67 20 23 20 3c 2d 2d 45 72  oot lang # <--Er
2f00: 72 6f 72 2d 2d 20 46 49 58 45 44 20 22 65 6e 22  ror-- FIXED "en"
2f10: 3e 22 2c 20 72 65 66 65 72 65 6e 63 65 64 20 61  >", referenced a
2f20: 74 20 6c 69 6e 65 20 32 20 63 68 61 72 61 63 74  t line 2 charact
2f30: 65 72 20 35 38 7d 7d 0a 0a 74 65 73 74 20 64 6f  er 58}}..test do
2f40: 6d 2d 32 2e 31 38 20 7b 70 61 72 73 65 20 64 6f  m-2.18 {parse do
2f50: 63 75 6d 65 6e 74 20 77 69 74 68 20 6e 6f 64 65  cument with node
2f60: 73 20 62 65 66 6f 72 65 20 61 6e 64 20 61 66 74  s before and aft
2f70: 65 72 20 74 68 65 20 64 6f 63 75 6d 65 6e 74 45  er the documentE
2f80: 6c 65 6d 65 6e 74 7d 20 7b 0a 20 20 20 20 73 65  lement} {.    se
2f90: 74 20 64 6f 63 20 5b 64 6f 6d 20 70 61 72 73 65  t doc [dom parse
2fa0: 20 7b 3c 21 2d 2d 20 46 69 72 73 74 20 63 6f 6d   {<!-- First com
2fb0: 6d 65 6e 74 20 2d 2d 3e 0a 3c 64 6f 63 3e 0a 20  ment -->.<doc>. 
2fc0: 20 3c 21 2d 2d 20 46 72 6f 6e 74 20 63 6f 6d 6d   <!-- Front comm
2fd0: 65 6e 74 20 2d 2d 3e 0a 20 20 3c 69 6e 6e 65 72  ent -->.  <inner
2fe0: 2f 3e 0a 20 20 3c 21 2d 2d 20 42 61 63 6b 20 63  />.  <!-- Back c
2ff0: 6f 6d 6d 65 6e 74 20 2d 2d 3e 0a 3c 2f 64 6f 63  omment -->.</doc
3000: 3e 0a 3c 21 2d 2d 20 4c 61 73 74 20 63 6f 6d 6d  >.<!-- Last comm
3010: 65 6e 74 20 2d 2d 3e 7d 5d 0a 20 20 20 20 73 65  ent -->}].    se
3020: 74 20 72 65 73 75 6c 74 20 5b 24 64 6f 63 20 61  t result [$doc a
3030: 73 58 4d 4c 20 2d 69 6e 64 65 6e 74 20 6e 6f 6e  sXML -indent non
3040: 65 5d 0a 20 20 20 20 24 64 6f 63 20 64 65 6c 65  e].    $doc dele
3050: 74 65 0a 20 20 20 20 73 65 74 20 72 65 73 75 6c  te.    set resul
3060: 74 0a 7d 20 7b 3c 21 2d 2d 20 46 69 72 73 74 20  t.} {<!-- First 
3070: 63 6f 6d 6d 65 6e 74 20 2d 2d 3e 3c 64 6f 63 3e  comment --><doc>
3080: 3c 21 2d 2d 20 46 72 6f 6e 74 20 63 6f 6d 6d 65  <!-- Front comme
3090: 6e 74 20 2d 2d 3e 3c 69 6e 6e 65 72 2f 3e 3c 21  nt --><inner/><!
30a0: 2d 2d 20 42 61 63 6b 20 63 6f 6d 6d 65 6e 74 20  -- Back comment 
30b0: 2d 2d 3e 3c 2f 64 6f 63 3e 3c 21 2d 2d 20 4c 61  --></doc><!-- La
30c0: 73 74 20 63 6f 6d 6d 65 6e 74 20 2d 2d 3e 7d 0a  st comment -->}.
30d0: 0a 74 65 73 74 20 64 6f 6d 2d 32 2e 31 39 20 7b  .test dom-2.19 {
30e0: 70 61 72 73 65 20 64 6f 63 75 6d 65 6e 74 20 2d  parse document -
30f0: 20 72 65 6e 61 6d 65 20 64 6f 63 43 6d 64 7d 20   rename docCmd} 
3100: 7b 0a 20 20 20 20 73 65 74 20 64 6f 63 20 5b 64  {.    set doc [d
3110: 6f 6d 20 70 61 72 73 65 20 7b 3c 72 6f 6f 74 3e  om parse {<root>
3120: 66 6f 6f 3c 63 68 69 6c 64 2f 3e 3c 2f 72 6f 6f  foo<child/></roo
3130: 74 3e 7d 5d 0a 20 20 20 20 69 66 20 7b 5b 69 6e  t>}].    if {[in
3140: 66 6f 20 63 6f 6d 6d 61 6e 64 73 20 66 6f 6f 43  fo commands fooC
3150: 6d 64 5d 20 3d 3d 20 22 66 6f 6f 43 6d 64 22 7d  md] == "fooCmd"}
3160: 20 7b 0a 20 20 20 20 20 20 20 20 72 65 6e 61 6d   {.        renam
3170: 65 20 66 6f 6f 43 6d 64 20 7b 7d 0a 20 20 20 20  e fooCmd {}.    
3180: 7d 0a 20 20 20 20 72 65 6e 61 6d 65 20 24 64 6f  }.    rename $do
3190: 63 20 66 6f 6f 43 6d 64 0a 20 20 20 20 73 65 74  c fooCmd.    set
31a0: 20 72 65 73 75 6c 74 20 5b 66 6f 6f 43 6d 64 20   result [fooCmd 
31b0: 61 73 58 4d 4c 20 2d 69 6e 64 65 6e 74 20 6e 6f  asXML -indent no
31c0: 6e 65 5d 0a 20 20 20 20 66 6f 6f 43 6d 64 20 64  ne].    fooCmd d
31d0: 65 6c 65 74 65 0a 20 20 20 20 73 65 74 20 72 65  elete.    set re
31e0: 73 75 6c 74 0a 7d 20 7b 3c 72 6f 6f 74 3e 66 6f  sult.} {<root>fo
31f0: 6f 3c 63 68 69 6c 64 2f 3e 3c 2f 72 6f 6f 74 3e  o<child/></root>
3200: 7d 0a 0a 74 65 73 74 20 64 6f 6d 2d 32 2e 32 30  }..test dom-2.20
3210: 20 7b 70 61 72 73 65 20 2d 20 64 6f 63 20 77 69   {parse - doc wi
3220: 74 68 20 69 6e 74 65 72 6e 61 6c 20 73 75 62 73  th internal subs
3230: 65 74 20 70 61 72 73 65 64 20 77 69 74 68 20 2d  et parsed with -
3240: 6b 65 65 70 45 6d 70 74 69 65 73 7d 20 7b 0a 20  keepEmpties} {. 
3250: 20 20 20 73 65 74 20 64 6f 63 20 5b 64 6f 6d 20     set doc [dom 
3260: 70 61 72 73 65 20 2d 6b 65 65 70 45 6d 70 74 69  parse -keepEmpti
3270: 65 73 20 7b 0a 20 20 20 20 20 20 20 20 3c 21 44  es {.        <!D
3280: 4f 43 54 59 50 45 20 72 6f 6f 74 20 5b 0a 20 20  OCTYPE root [.  
3290: 20 20 20 20 20 20 20 20 20 3c 21 45 4c 45 4d 45           <!ELEME
32a0: 4e 54 20 72 6f 6f 74 20 45 4d 50 54 59 3e 0a 20  NT root EMPTY>. 
32b0: 20 20 20 20 20 20 20 20 20 20 3c 21 2d 2d 20 43            <!-- C
32c0: 6f 6d 6d 65 6e 74 20 69 6e 73 69 64 65 20 74 68  omment inside th
32d0: 65 20 44 54 44 20 2d 2d 3e 0a 20 20 20 20 20 20  e DTD -->.      
32e0: 20 20 20 20 20 3c 3f 61 50 49 20 49 6e 73 69 64       <?aPI Insid
32f0: 65 20 74 68 65 20 44 54 44 3f 3e 0a 20 20 20 20  e the DTD?>.    
3300: 20 20 20 20 20 20 20 3c 21 41 54 54 4c 49 53 54         <!ATTLIST
3310: 20 72 6f 6f 74 20 6c 61 6e 67 20 43 44 41 54 41   root lang CDATA
3320: 20 23 46 49 58 45 44 20 22 65 6e 22 3e 0a 20 20   #FIXED "en">.  
3330: 20 20 20 20 20 20 20 20 5d 3e 0a 20 20 20 20 20          ]>.     
3340: 20 20 20 3c 72 6f 6f 74 2f 3e 7d 5d 0a 20 20 20     <root/>}].   
3350: 20 24 64 6f 63 20 64 6f 63 75 6d 65 6e 74 45 6c   $doc documentEl
3360: 65 6d 65 6e 74 20 72 6f 6f 74 0a 20 20 20 20 73  ement root.    s
3370: 65 74 20 72 65 73 75 6c 74 20 22 22 0a 20 20 20  et result "".   
3380: 20 66 6f 72 65 61 63 68 20 6e 6f 64 65 20 5b 24   foreach node [$
3390: 72 6f 6f 74 20 73 65 6c 65 63 74 4e 6f 64 65 73  root selectNodes
33a0: 20 2f 6e 6f 64 65 28 29 5d 20 7b 0a 20 20 20 20   /node()] {.    
33b0: 20 20 20 20 73 77 69 74 63 68 20 5b 24 6e 6f 64      switch [$nod
33c0: 65 20 6e 6f 64 65 54 79 70 65 5d 20 7b 0a 20 20  e nodeType] {.  
33d0: 20 20 20 20 20 20 20 20 20 20 54 45 58 54 5f 4e            TEXT_N
33e0: 4f 44 45 20 7b 0a 20 20 20 20 20 20 20 20 20 20  ODE {.          
33f0: 20 20 20 20 20 20 6c 61 70 70 65 6e 64 20 72 65        lappend re
3400: 73 75 6c 74 20 54 45 58 54 5f 4e 4f 44 45 0a 20  sult TEXT_NODE. 
3410: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 6c                 l
3420: 61 70 70 65 6e 64 20 72 65 73 75 6c 74 20 5b 73  append result [s
3430: 74 72 69 6e 67 20 6c 65 6e 67 74 68 20 5b 24 6e  tring length [$n
3440: 6f 64 65 20 76 61 6c 75 65 5d 5d 0a 20 20 20 20  ode value]].    
3450: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
3460: 20 20 20 20 20 20 43 4f 4d 4d 45 4e 54 5f 4e 4f        COMMENT_NO
3470: 44 45 20 7b 0a 20 20 20 20 20 20 20 20 20 20 20  DE {.           
3480: 20 20 20 20 20 6c 61 70 70 65 6e 64 20 72 65 73       lappend res
3490: 75 6c 74 20 43 4f 4d 4d 45 4e 54 5f 4e 4f 44 45  ult COMMENT_NODE
34a0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
34b0: 20 6c 61 70 70 65 6e 64 20 72 65 73 75 6c 74 20   lappend result 
34c0: 5b 73 74 72 69 6e 67 20 6c 65 6e 67 74 68 20 5b  [string length [
34d0: 24 6e 6f 64 65 20 76 61 6c 75 65 5d 5d 0a 20 20  $node value]].  
34e0: 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
34f0: 20 20 20 20 20 20 20 20 50 52 4f 43 45 53 53 49          PROCESSI
3500: 4e 47 5f 49 4e 53 54 52 55 43 54 49 4f 4e 5f 4e  NG_INSTRUCTION_N
3510: 4f 44 45 20 7b 0a 20 20 20 20 20 20 20 20 20 20  ODE {.          
3520: 20 20 20 20 20 20 6c 61 70 70 65 6e 64 20 72 65        lappend re
3530: 73 75 6c 74 20 50 52 4f 43 45 53 53 49 4e 47 5f  sult PROCESSING_
3540: 49 4e 53 54 52 55 43 54 49 4f 4e 5f 4e 4f 44 45  INSTRUCTION_NODE
3550: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
3560: 20 6c 61 70 70 65 6e 64 20 72 65 73 75 6c 74 20   lappend result 
3570: 5b 24 6e 6f 64 65 20 74 61 72 67 65 74 5d 0a 20  [$node target]. 
3580: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 6c                 l
3590: 61 70 70 65 6e 64 20 72 65 73 75 6c 74 20 5b 24  append result [$
35a0: 6e 6f 64 65 20 64 61 74 61 5d 0a 20 20 20 20 20  node data].     
35b0: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
35c0: 20 20 20 20 20 45 4c 45 4d 45 4e 54 5f 4e 4f 44       ELEMENT_NOD
35d0: 45 20 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20  E {.            
35e0: 20 20 20 20 6c 61 70 70 65 6e 64 20 72 65 73 75      lappend resu
35f0: 6c 74 20 45 4c 45 4d 45 4e 54 5f 4e 4f 44 45 0a  lt ELEMENT_NODE.
3600: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3610: 6c 61 70 70 65 6e 64 20 72 65 73 75 6c 74 20 5b  lappend result [
3620: 24 6e 6f 64 65 20 6e 6f 64 65 4e 61 6d 65 5d 0a  $node nodeName].
3630: 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20              }.  
3640: 20 20 20 20 20 20 20 20 20 20 64 65 66 61 75 6c            defaul
3650: 74 20 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20  t {.            
3660: 20 20 20 20 6c 61 70 70 65 6e 64 20 72 65 73 75      lappend resu
3670: 6c 74 20 5b 24 6e 6f 64 65 20 6e 6f 64 65 54 79  lt [$node nodeTy
3680: 70 65 5d 0a 20 20 20 20 20 20 20 20 20 20 20 20  pe].            
3690: 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  }.        }.    
36a0: 7d 0a 20 20 20 20 24 64 6f 63 20 64 65 6c 65 74  }.    $doc delet
36b0: 65 0a 20 20 20 20 73 65 74 20 72 65 73 75 6c 74  e.    set result
36c0: 0a 7d 20 7b 45 4c 45 4d 45 4e 54 5f 4e 4f 44 45  .} {ELEMENT_NODE
36d0: 20 72 6f 6f 74 7d 0a 0a 74 65 73 74 20 64 6f 6d   root}..test dom
36e0: 2d 32 2e 32 31 20 7b 70 61 72 73 65 20 2d 20 65  -2.21 {parse - e
36f0: 6d 70 74 79 20 43 44 41 54 41 20 73 65 63 74 69  mpty CDATA secti
3700: 6f 6e 7d 20 7b 0a 20 20 20 20 73 65 74 20 64 6f  on} {.    set do
3710: 63 20 5b 64 6f 6d 20 70 61 72 73 65 20 7b 3c 64  c [dom parse {<d
3720: 6f 63 3e 3c 21 5b 43 44 41 54 41 5b 5d 5d 3e 3c  oc><![CDATA[]]><
3730: 2f 64 6f 63 3e 7d 5d 0a 20 20 20 20 73 65 74 20  /doc>}].    set 
3740: 72 6f 6f 74 20 5b 24 64 6f 63 20 64 6f 63 75 6d  root [$doc docum
3750: 65 6e 74 45 6c 65 6d 65 6e 74 5d 0a 20 20 20 20  entElement].    
3760: 73 65 74 20 72 65 73 75 6c 74 20 5b 24 72 6f 6f  set result [$roo
3770: 74 20 68 61 73 43 68 69 6c 64 4e 6f 64 65 73 5d  t hasChildNodes]
3780: 0a 20 20 20 20 24 64 6f 63 20 64 65 6c 65 74 65  .    $doc delete
3790: 0a 20 20 20 20 73 65 74 20 72 65 73 75 6c 74 0a  .    set result.
37a0: 7d 20 7b 30 7d 0a 0a 74 65 73 74 20 64 6f 6d 2d  } {0}..test dom-
37b0: 32 2e 32 32 20 7b 70 61 72 73 65 20 2d 20 65 6d  2.22 {parse - em
37c0: 70 74 79 20 63 6f 6d 6d 65 6e 74 20 73 65 63 74  pty comment sect
37d0: 69 6f 6e 7d 20 7b 0a 20 20 20 20 73 65 74 20 64  ion} {.    set d
37e0: 6f 63 20 5b 64 6f 6d 20 70 61 72 73 65 20 7b 3c  oc [dom parse {<
37f0: 64 6f 63 3e 3c 21 2d 2d 2d 2d 3e 3c 2f 64 6f 63  doc><!----></doc
3800: 3e 7d 5d 0a 20 20 20 20 73 65 74 20 72 6f 6f 74  >}].    set root
3810: 20 5b 24 64 6f 63 20 64 6f 63 75 6d 65 6e 74 45   [$doc documentE
3820: 6c 65 6d 65 6e 74 5d 0a 20 20 20 20 73 65 74 20  lement].    set 
3830: 72 65 73 75 6c 74 20 5b 24 72 6f 6f 74 20 68 61  result [$root ha
3840: 73 43 68 69 6c 64 4e 6f 64 65 73 5d 0a 20 20 20  sChildNodes].   
3850: 20 6c 61 70 70 65 6e 64 20 72 65 73 75 6c 74 20   lappend result 
3860: 5b 5b 24 72 6f 6f 74 20 66 69 72 73 74 43 68 69  [[$root firstChi
3870: 6c 64 5d 20 6e 6f 64 65 56 61 6c 75 65 5d 0a 20  ld] nodeValue]. 
3880: 20 20 20 24 64 6f 63 20 64 65 6c 65 74 65 0a 20     $doc delete. 
3890: 20 20 20 73 65 74 20 72 65 73 75 6c 74 0a 7d 20     set result.} 
38a0: 7b 31 20 7b 7d 7d 0a 0a 74 65 73 74 20 64 6f 6d  {1 {}}..test dom
38b0: 2d 32 2e 32 33 20 7b 70 61 72 73 65 20 2d 20 70  -2.23 {parse - p
38c0: 69 20 77 69 74 68 6f 75 74 20 70 69 76 61 6c 75  i without pivalu
38d0: 65 7d 20 7b 0a 20 20 20 20 73 65 74 20 64 6f 63  e} {.    set doc
38e0: 20 5b 64 6f 6d 20 70 61 72 73 65 20 7b 3c 64 6f   [dom parse {<do
38f0: 63 3e 3c 3f 70 3f 3e 3c 2f 64 6f 63 3e 7d 5d 0a  c><?p?></doc>}].
3900: 20 20 20 20 73 65 74 20 70 69 20 5b 5b 24 64 6f      set pi [[$do
3910: 63 20 64 6f 63 75 6d 65 6e 74 45 6c 65 6d 65 6e  c documentElemen
3920: 74 5d 20 66 69 72 73 74 43 68 69 6c 64 5d 0a 20  t] firstChild]. 
3930: 20 20 20 73 65 74 20 72 65 73 75 6c 74 20 5b 6c     set result [l
3940: 69 73 74 20 5b 24 70 69 20 6e 6f 64 65 4e 61 6d  ist [$pi nodeNam
3950: 65 5d 20 5b 24 70 69 20 6e 6f 64 65 56 61 6c 75  e] [$pi nodeValu
3960: 65 5d 20 5b 24 70 69 20 74 61 72 67 65 74 5d 20  e] [$pi target] 
3970: 5b 24 70 69 20 64 61 74 61 5d 5d 0a 20 20 20 20  [$pi data]].    
3980: 24 64 6f 63 20 64 65 6c 65 74 65 0a 20 20 20 20  $doc delete.    
3990: 73 65 74 20 72 65 73 75 6c 74 0a 7d 20 7b 70 20  set result.} {p 
39a0: 7b 7d 20 70 20 7b 7d 7d 0a 0a 70 72 6f 63 20 32  {} p {}}..proc 2
39b0: 2e 32 34 20 7b 61 72 67 73 7d 20 7b 0a 20 20 20  .24 {args} {.   
39c0: 20 65 72 72 6f 72 20 22 32 2e 32 34 20 65 78 74   error "2.24 ext
39d0: 65 72 6e 61 6c 20 65 6e 74 69 74 69 79 20 72 65  ernal entitiy re
39e0: 73 6f 6c 76 65 72 20 73 63 72 69 70 74 20 65 72  solver script er
39f0: 72 6f 72 22 0a 7d 0a 0a 74 65 73 74 20 64 6f 6d  ror".}..test dom
3a00: 2d 32 2e 32 34 20 7b 70 61 72 73 65 20 2d 20 73  -2.24 {parse - s
3a10: 63 72 69 70 74 20 65 72 72 6f 72 20 69 6e 20 2d  cript error in -
3a20: 65 78 74 65 72 6e 61 6c 65 6e 74 69 74 79 63 6f  externalentityco
3a30: 6d 6d 61 6e 64 7d 20 7b 0a 20 20 20 20 73 65 74  mmand} {.    set
3a40: 20 72 65 73 75 6c 74 20 5b 63 61 74 63 68 20 7b   result [catch {
3a50: 0a 20 20 20 20 20 20 20 20 64 6f 6d 20 70 61 72  .        dom par
3a60: 73 65 20 2d 65 78 74 65 72 6e 61 6c 65 6e 74 69  se -externalenti
3a70: 74 79 63 6f 6d 6d 61 6e 64 20 32 2e 32 34 20 7b  tycommand 2.24 {
3a80: 0a 20 20 20 20 20 20 20 20 20 20 20 20 3c 21 44  .            <!D
3a90: 4f 43 54 59 50 45 20 72 6f 6f 74 20 53 59 53 54  OCTYPE root SYST
3aa0: 45 4d 20 22 64 61 74 61 2f 64 6f 6d 43 6d 64 32  EM "data/domCmd2
3ab0: 2e 64 74 64 22 3e 0a 20 20 20 20 20 20 20 20 20  .dtd">.         
3ac0: 20 20 20 3c 72 6f 6f 74 2f 3e 7d 7d 20 65 72 72     <root/>}} err
3ad0: 4d 73 67 5d 0a 20 20 20 20 6c 61 70 70 65 6e 64  Msg].    lappend
3ae0: 20 72 65 73 75 6c 74 20 24 65 72 72 4d 73 67 0a   result $errMsg.
3af0: 7d 20 7b 31 20 7b 32 2e 32 34 20 65 78 74 65 72  } {1 {2.24 exter
3b00: 6e 61 6c 20 65 6e 74 69 74 69 79 20 72 65 73 6f  nal entitiy reso
3b10: 6c 76 65 72 20 73 63 72 69 70 74 20 65 72 72 6f  lver script erro
3b20: 72 7d 7d 0a 0a 74 65 73 74 20 64 6f 6d 2d 32 2e  r}}..test dom-2.
3b30: 32 35 20 7b 57 68 69 74 65 20 73 70 61 63 65 20  25 {White space 
3b40: 6f 75 74 73 69 64 65 20 74 68 65 20 64 6f 63 75  outside the docu
3b50: 6d 65 6e 74 20 65 6c 65 6d 65 6e 74 20 69 73 20  ment element is 
3b60: 6d 61 72 6b 75 70 20 61 6e 64 20 69 67 6e 6f 72  markup and ignor
3b70: 65 64 2c 20 65 76 65 6e 20 77 69 74 68 20 2d 6b  ed, even with -k
3b80: 65 65 70 45 6d 70 74 69 65 73 7d 20 7b 0a 20 20  eepEmpties} {.  
3b90: 20 20 73 65 74 20 64 6f 63 20 5b 64 6f 6d 20 70    set doc [dom p
3ba0: 61 72 73 65 20 2d 6b 65 65 70 45 6d 70 74 69 65  arse -keepEmptie
3bb0: 73 20 7b 0a 3c 21 2d 2d 20 46 69 72 73 74 20 63  s {.<!-- First c
3bc0: 6f 6d 6d 65 6e 74 20 2d 2d 3e 0a 3c 64 6f 63 3e  omment -->.<doc>
3bd0: 0a 20 20 3c 21 2d 2d 20 46 72 6f 6e 74 20 63 6f  .  <!-- Front co
3be0: 6d 6d 65 6e 74 20 2d 2d 3e 0a 20 20 3c 69 6e 6e  mment -->.  <inn
3bf0: 65 72 2f 3e 0a 20 20 3c 21 2d 2d 20 42 61 63 6b  er/>.  <!-- Back
3c00: 20 63 6f 6d 6d 65 6e 74 20 2d 2d 3e 0a 3c 2f 64   comment -->.</d
3c10: 6f 63 3e 0a 3c 21 2d 2d 20 4c 61 73 74 20 63 6f  oc>.<!-- Last co
3c20: 6d 6d 65 6e 74 20 2d 2d 3e 7d 5d 0a 20 20 20 20  mment -->}].    
3c30: 73 65 74 20 72 65 73 75 6c 74 20 5b 24 64 6f 63  set result [$doc
3c40: 20 61 73 58 4d 4c 20 2d 69 6e 64 65 6e 74 20 6e   asXML -indent n
3c50: 6f 6e 65 5d 0a 20 20 20 20 24 64 6f 63 20 64 65  one].    $doc de
3c60: 6c 65 74 65 0a 20 20 20 20 73 65 74 20 72 65 73  lete.    set res
3c70: 75 6c 74 0a 7d 20 7b 3c 21 2d 2d 20 46 69 72 73  ult.} {<!-- Firs
3c80: 74 20 63 6f 6d 6d 65 6e 74 20 2d 2d 3e 3c 64 6f  t comment --><do
3c90: 63 3e 0a 20 20 3c 21 2d 2d 20 46 72 6f 6e 74 20  c>.  <!-- Front 
3ca0: 63 6f 6d 6d 65 6e 74 20 2d 2d 3e 0a 20 20 3c 69  comment -->.  <i
3cb0: 6e 6e 65 72 2f 3e 0a 20 20 3c 21 2d 2d 20 42 61  nner/>.  <!-- Ba
3cc0: 63 6b 20 63 6f 6d 6d 65 6e 74 20 2d 2d 3e 0a 3c  ck comment -->.<
3cd0: 2f 64 6f 63 3e 3c 21 2d 2d 20 4c 61 73 74 20 63  /doc><!-- Last c
3ce0: 6f 6d 6d 65 6e 74 20 2d 2d 3e 7d 0a 0a 74 65 73  omment -->}..tes
3cf0: 74 20 64 6f 6d 2d 32 2e 32 36 20 7b 4e 6f 74 20  t dom-2.26 {Not 
3d00: 77 65 6c 6c 2d 66 6f 72 6d 65 64 20 69 6e 70 75  well-formed inpu
3d10: 74 7d 20 7b 0a 20 20 20 20 63 61 74 63 68 20 7b  t} {.    catch {
3d20: 64 6f 6d 20 70 61 72 73 65 20 7b 3c 78 73 6c 3a  dom parse {<xsl:
3d30: 74 72 61 6e 73 66 6f 72 6d 20 20 20 20 20 20 20  transform       
3d40: 0a 20 20 20 20 20 20 20 20 78 6d 6c 6e 73 3a 78  .        xmlns:x
3d50: 73 6c 3d 22 68 74 74 70 3a 2f 2f 77 77 77 2e 77  sl="http://www.w
3d60: 33 2e 6f 72 67 2f 31 39 39 39 2f 58 53 4c 2f 54  3.org/1999/XSL/T
3d70: 72 61 6e 73 66 6f 72 6d 20 20 20 20 20 20 20 20  ransform        
3d80: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
3d90: 20 20 20 20 3c 68 74 74 70 3a 2f 2f 77 77 77 2e      <http://www.
3da0: 77 33 2e 6f 72 67 2f 31 39 39 39 2f 58 53 4c 2f  w3.org/1999/XSL/
3db0: 54 72 61 6e 73 66 6f 72 6d 3e 20 22 2f 3e 7d 7d  Transform> "/>}}
3dc0: 0a 7d 20 31 0a 0a 74 65 73 74 20 64 6f 6d 2d 32  .} 1..test dom-2
3dd0: 2e 32 37 20 7b 70 61 72 73 65 20 2d 69 67 6e 6f  .27 {parse -igno
3de0: 72 65 78 6d 6c 6e 73 7d 20 7b 0a 20 20 20 20 73  rexmlns} {.    s
3df0: 65 74 20 72 65 73 75 6c 74 20 5b 6c 69 73 74 5d  et result [list]
3e00: 0a 20 20 20 20 73 65 74 20 64 6f 63 20 5b 64 6f  .    set doc [do
3e10: 6d 20 70 61 72 73 65 20 7b 3c 64 6f 63 20 78 6d  m parse {<doc xm
3e20: 6c 6e 73 3d 22 66 6f 6f 2e 62 61 72 22 3e 3c 63  lns="foo.bar"><c
3e30: 68 69 6c 64 2f 3e 3c 2f 64 6f 63 3e 7d 5d 0a 20  hild/></doc>}]. 
3e40: 20 20 20 73 65 74 20 72 6f 6f 74 20 5b 24 64 6f     set root [$do
3e50: 63 20 64 6f 63 75 6d 65 6e 74 45 6c 65 6d 65 6e  c documentElemen
3e60: 74 5d 0a 20 20 20 20 6c 61 70 70 65 6e 64 20 72  t].    lappend r
3e70: 65 73 75 6c 74 20 5b 24 72 6f 6f 74 20 6c 6f 63  esult [$root loc
3e80: 61 6c 4e 61 6d 65 5d 0a 20 20 20 20 6c 61 70 70  alName].    lapp
3e90: 65 6e 64 20 72 65 73 75 6c 74 20 5b 24 72 6f 6f  end result [$roo
3ea0: 74 20 6e 61 6d 65 73 70 61 63 65 55 52 49 5d 0a  t namespaceURI].
3eb0: 20 20 20 20 73 65 74 20 63 68 69 6c 64 20 5b 24      set child [$
3ec0: 72 6f 6f 74 20 66 69 72 73 74 43 68 69 6c 64 5d  root firstChild]
3ed0: 0a 20 20 20 20 6c 61 70 70 65 6e 64 20 72 65 73  .    lappend res
3ee0: 75 6c 74 20 5b 24 63 68 69 6c 64 20 6c 6f 63 61  ult [$child loca
3ef0: 6c 4e 61 6d 65 5d 0a 20 20 20 20 6c 61 70 70 65  lName].    lappe
3f00: 6e 64 20 72 65 73 75 6c 74 20 5b 24 63 68 69 6c  nd result [$chil
3f10: 64 20 6e 61 6d 65 73 70 61 63 65 55 52 49 5d 0a  d namespaceURI].
3f20: 20 20 20 20 6c 61 70 70 65 6e 64 20 72 65 73 75      lappend resu
3f30: 6c 74 20 5b 24 64 6f 63 20 73 65 6c 65 63 74 4e  lt [$doc selectN
3f40: 6f 64 65 73 20 63 6f 75 6e 74 28 2f 64 6f 63 2f  odes count(/doc/
3f50: 63 68 69 6c 64 29 5d 0a 20 20 20 20 24 64 6f 63  child)].    $doc
3f60: 20 64 65 6c 65 74 65 0a 20 20 20 20 73 65 74 20   delete.    set 
3f70: 64 6f 63 20 5b 64 6f 6d 20 70 61 72 73 65 20 2d  doc [dom parse -
3f80: 69 67 6e 6f 72 65 78 6d 6c 6e 73 20 7b 3c 64 6f  ignorexmlns {<do
3f90: 63 20 78 6d 6c 6e 73 3d 22 66 6f 6f 2e 62 61 72  c xmlns="foo.bar
3fa0: 22 3e 3c 63 68 69 6c 64 2f 3e 3c 2f 64 6f 63 3e  "><child/></doc>
3fb0: 7d 5d 0a 20 20 20 20 73 65 74 20 72 6f 6f 74 20  }].    set root 
3fc0: 5b 24 64 6f 63 20 64 6f 63 75 6d 65 6e 74 45 6c  [$doc documentEl
3fd0: 65 6d 65 6e 74 5d 0a 20 20 20 20 6c 61 70 70 65  ement].    lappe
3fe0: 6e 64 20 72 65 73 75 6c 74 20 5b 24 72 6f 6f 74  nd result [$root
3ff0: 20 6e 6f 64 65 4e 61 6d 65 5d 0a 20 20 20 20 6c   nodeName].    l
4000: 61 70 70 65 6e 64 20 72 65 73 75 6c 74 20 5b 24  append result [$
4010: 72 6f 6f 74 20 6e 61 6d 65 73 70 61 63 65 55 52  root namespaceUR
4020: 49 5d 0a 20 20 20 20 73 65 74 20 63 68 69 6c 64  I].    set child
4030: 20 5b 24 72 6f 6f 74 20 66 69 72 73 74 43 68 69   [$root firstChi
4040: 6c 64 5d 0a 20 20 20 20 6c 61 70 70 65 6e 64 20  ld].    lappend 
4050: 72 65 73 75 6c 74 20 5b 24 63 68 69 6c 64 20 6e  result [$child n
4060: 6f 64 65 4e 61 6d 65 5d 0a 20 20 20 20 6c 61 70  odeName].    lap
4070: 70 65 6e 64 20 72 65 73 75 6c 74 20 5b 24 63 68  pend result [$ch
4080: 69 6c 64 20 6e 61 6d 65 73 70 61 63 65 55 52 49  ild namespaceURI
4090: 5d 0a 20 20 20 20 6c 61 70 70 65 6e 64 20 72 65  ].    lappend re
40a0: 73 75 6c 74 20 5b 24 64 6f 63 20 73 65 6c 65 63  sult [$doc selec
40b0: 74 4e 6f 64 65 73 20 63 6f 75 6e 74 28 2f 64 6f  tNodes count(/do
40c0: 63 2f 63 68 69 6c 64 29 5d 0a 20 20 20 20 24 64  c/child)].    $d
40d0: 6f 63 20 64 65 6c 65 74 65 0a 20 20 20 20 73 65  oc delete.    se
40e0: 74 20 72 65 73 75 6c 74 0a 7d 20 7b 64 6f 63 20  t result.} {doc 
40f0: 66 6f 6f 2e 62 61 72 20 63 68 69 6c 64 20 66 6f  foo.bar child fo
4100: 6f 2e 62 61 72 20 30 20 64 6f 63 20 7b 7d 20 63  o.bar 0 doc {} c
4110: 68 69 6c 64 20 7b 7d 20 31 7d 0a 0a 74 65 73 74  hild {} 1}..test
4120: 20 64 6f 6d 2d 32 2e 32 38 20 7b 70 61 72 73 65   dom-2.28 {parse
4130: 20 64 6f 63 75 6d 65 6e 74 20 77 69 74 68 20 75   document with u
4140: 6e 64 65 63 6c 61 72 65 64 20 78 6d 6c 20 70 72  ndeclared xml pr
4150: 65 66 69 78 7d 20 7b 0a 20 20 20 20 63 61 74 63  efix} {.    catc
4160: 68 20 7b 64 6f 6d 20 70 61 72 73 65 20 7b 3c 64  h {dom parse {<d
4170: 6f 63 3e 3c 66 6f 6f 3a 65 2f 3e 3c 2f 64 6f 63  oc><foo:e/></doc
4180: 3e 7d 7d 20 65 72 72 4d 73 67 0a 20 20 20 20 73  >}} errMsg.    s
4190: 74 72 69 6e 67 20 72 61 6e 67 65 20 24 65 72 72  tring range $err
41a0: 4d 73 67 20 30 20 33 30 0a 7d 20 7b 4e 61 6d 65  Msg 0 30.} {Name
41b0: 73 70 61 63 65 20 70 72 65 66 69 78 20 69 73 20  space prefix is 
41c0: 6e 6f 74 20 64 65 66 69 6e 65 64 7d 0a 0a 74 65  not defined}..te
41d0: 73 74 20 64 6f 6d 2d 32 2e 32 39 20 7b 70 61 72  st dom-2.29 {par
41e0: 73 65 20 6e 6f 74 20 77 65 6c 6c 2d 66 6f 72 6d  se not well-form
41f0: 65 64 20 64 6f 63 75 6d 65 6e 74 20 77 69 74 68  ed document with
4200: 20 75 6e 64 65 63 6c 61 72 65 64 20 78 6d 6c 20   undeclared xml 
4210: 70 72 65 66 69 78 7d 20 7b 0a 20 20 20 20 63 61  prefix} {.    ca
4220: 74 63 68 20 7b 64 6f 6d 20 70 61 72 73 65 20 7b  tch {dom parse {
4230: 3c 66 6f 6f 3a 65 2f 3e 7d 7d 20 65 72 72 4d 73  <foo:e/>}} errMs
4240: 67 0a 20 20 20 20 73 74 72 69 6e 67 20 72 61 6e  g.    string ran
4250: 67 65 20 24 65 72 72 4d 73 67 20 30 20 33 30 0a  ge $errMsg 0 30.
4260: 7d 20 7b 4e 61 6d 65 73 70 61 63 65 20 70 72 65  } {Namespace pre
4270: 66 69 78 20 69 73 20 6e 6f 74 20 64 65 66 69 6e  fix is not defin
4280: 65 64 7d 0a 0a 74 65 73 74 20 64 6f 6d 2d 32 2e  ed}..test dom-2.
4290: 33 30 20 7b 70 61 72 73 65 20 64 6f 63 75 6d 65  30 {parse docume
42a0: 6e 74 20 77 69 74 68 20 75 6e 64 65 63 6c 61 72  nt with undeclar
42b0: 65 64 20 78 6d 6c 20 70 72 65 66 69 78 7d 20 7b  ed xml prefix} {
42c0: 0a 20 20 20 20 63 61 74 63 68 20 7b 64 6f 6d 20  .    catch {dom 
42d0: 70 61 72 73 65 20 7b 3c 66 6f 6f 3a 65 3e 3c 61  parse {<foo:e><a
42e0: 2f 3e 3c 2f 66 6f 6f 3a 65 3e 7d 7d 20 65 72 72  /></foo:e>}} err
42f0: 4d 73 67 0a 20 20 20 20 73 74 72 69 6e 67 20 72  Msg.    string r
4300: 61 6e 67 65 20 24 65 72 72 4d 73 67 20 30 20 33  ange $errMsg 0 3
4310: 30 0a 7d 20 7b 4e 61 6d 65 73 70 61 63 65 20 70  0.} {Namespace p
4320: 72 65 66 69 78 20 69 73 20 6e 6f 74 20 64 65 66  refix is not def
4330: 69 6e 65 64 7d 0a 0a 70 72 6f 63 20 64 6f 6d 2d  ined}..proc dom-
4340: 32 2e 33 31 20 7b 62 61 73 65 20 73 79 73 74 65  2.31 {base syste
4350: 6d 49 64 20 70 75 62 6c 69 63 49 64 7d 20 7b 0a  mId publicId} {.
4360: 20 20 20 20 73 77 69 74 63 68 20 24 70 75 62 6c      switch $publ
4370: 69 63 49 64 20 7b 0a 20 20 20 20 20 20 20 20 22  icId {.        "
4380: 65 31 22 20 7b 0a 20 20 20 20 20 20 20 20 20 20  e1" {.          
4390: 20 20 23 20 4e 6f 74 20 77 65 6c 6c 2d 66 6f 72    # Not well-for
43a0: 6d 65 64 0a 20 20 20 20 20 20 20 20 20 20 20 20  med.            
43b0: 73 65 74 20 64 61 74 61 20 22 3c 66 6f 6f 3a 65  set data "<foo:e
43c0: 2f 3e 22 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  />".        }.  
43d0: 20 20 20 20 20 20 64 65 66 61 75 6c 74 20 7b 0a        default {.
43e0: 20 20 20 20 20 20 20 20 20 20 20 20 65 72 72 6f              erro
43f0: 72 20 22 75 6e 6b 6e 6f 77 6e 20 70 75 62 6c 69  r "unknown publi
4400: 63 20 49 44 22 0a 20 20 20 20 20 20 20 20 7d 0a  c ID".        }.
4410: 20 20 20 20 7d 0a 20 20 20 20 72 65 74 75 72 6e      }.    return
4420: 20 5b 6c 69 73 74 20 22 73 74 72 69 6e 67 22 20   [list "string" 
4430: 24 62 61 73 65 20 24 64 61 74 61 5d 0a 7d 0a 74  $base $data].}.t
4440: 65 73 74 20 64 6f 6d 2d 32 2e 33 31 20 7b 70 61  est dom-2.31 {pa
4450: 72 73 65 20 64 6f 63 75 6d 65 6e 74 20 77 69 74  rse document wit
4460: 68 20 75 6e 64 65 63 6c 61 72 65 64 20 78 6d 6c  h undeclared xml
4470: 20 70 72 65 66 69 78 7d 20 7b 0a 20 20 20 20 63   prefix} {.    c
4480: 61 74 63 68 20 7b 64 6f 6d 20 70 61 72 73 65 20  atch {dom parse 
4490: 2d 65 78 74 65 72 6e 61 6c 65 6e 74 69 74 79 63  -externalentityc
44a0: 6f 6d 6d 61 6e 64 20 64 6f 6d 2d 32 2e 33 31 20  ommand dom-2.31 
44b0: 5c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  \.              
44c0: 20 20 7b 3c 21 44 4f 43 54 59 50 45 20 64 6f 63    {<!DOCTYPE doc
44d0: 20 5b 3c 21 45 4e 54 49 54 59 20 65 31 20 50 55   [<!ENTITY e1 PU
44e0: 42 4c 49 43 20 22 65 31 22 20 22 65 31 2e 78 6d  BLIC "e1" "e1.xm
44f0: 6c 22 3e 5d 3e 0a 20 20 20 20 20 20 20 20 20 20  l">]>.          
4500: 20 20 20 20 20 20 20 20 20 20 3c 64 6f 63 3e 26            <doc>&
4510: 65 31 3b 3c 2f 64 6f 63 3e 7d 0a 20 20 20 20 7d  e1;</doc>}.    }
4520: 20 65 72 72 4d 73 67 0a 20 20 20 20 73 74 72 69   errMsg.    stri
4530: 6e 67 20 72 61 6e 67 65 20 24 65 72 72 4d 73 67  ng range $errMsg
4540: 20 30 20 33 30 0a 7d 20 7b 4e 61 6d 65 73 70 61   0 30.} {Namespa
4550: 63 65 20 70 72 65 66 69 78 20 69 73 20 6e 6f 74  ce prefix is not
4560: 20 64 65 66 69 6e 65 64 7d 0a 20 20 20 20 0a 74   defined}.    .t
4570: 65 73 74 20 64 6f 6d 2d 32 2e 33 32 20 7b 70 61  est dom-2.32 {pa
4580: 72 73 65 20 64 6f 63 75 6d 65 6e 74 20 77 69 74  rse document wit
4590: 68 20 75 6e 64 65 63 6c 61 72 65 64 20 78 6d 6c  h undeclared xml
45a0: 20 70 72 65 66 69 78 20 61 6e 64 20 2d 69 67 6e   prefix and -ign
45b0: 6f 72 65 78 6d 6c 6e 73 7d 20 7b 0a 20 20 20 20  orexmlns} {.    
45c0: 73 65 74 20 64 6f 63 20 5b 64 6f 6d 20 70 61 72  set doc [dom par
45d0: 73 65 20 2d 69 67 6e 6f 72 65 78 6d 6c 6e 73 20  se -ignorexmlns 
45e0: 7b 3c 66 6f 6f 3a 65 3e 3c 61 2f 3e 3c 2f 66 6f  {<foo:e><a/></fo
45f0: 6f 3a 65 3e 7d 5d 0a 20 20 20 20 73 65 74 20 72  o:e>}].    set r
4600: 65 73 75 6c 74 20 5b 5b 24 64 6f 63 20 64 6f 63  esult [[$doc doc
4610: 75 6d 65 6e 74 45 6c 65 6d 65 6e 74 5d 20 6e 6f  umentElement] no
4620: 64 65 4e 61 6d 65 5d 0a 20 20 20 20 24 64 6f 63  deName].    $doc
4630: 20 64 65 6c 65 74 65 0a 20 20 20 20 73 65 74 20   delete.    set 
4640: 72 65 73 75 6c 74 0a 7d 20 7b 66 6f 6f 3a 65 7d  result.} {foo:e}
4650: 0a 0a 74 65 73 74 20 64 6f 6d 2d 32 2e 33 33 20  ..test dom-2.33 
4660: 7b 65 6e 64 20 6f 66 20 6f 70 74 69 6f 6e 73 20  {end of options 
4670: 6f 70 74 69 6f 6e 7d 20 7b 0a 20 20 20 20 73 65  option} {.    se
4680: 74 20 64 6f 63 20 5b 64 6f 6d 20 70 61 72 73 65  t doc [dom parse
4690: 20 2d 6a 73 6f 6e 20 2d 2d 20 2d 30 2e 31 32 33   -json -- -0.123
46a0: 5d 0a 20 20 20 20 73 65 74 20 72 65 73 75 6c 74  ].    set result
46b0: 20 5b 24 64 6f 63 20 61 73 58 4d 4c 20 2d 69 6e   [$doc asXML -in
46c0: 64 65 6e 74 20 6e 6f 6e 65 5d 0a 20 20 20 20 24  dent none].    $
46d0: 64 6f 63 20 64 65 6c 65 74 65 0a 20 20 20 20 73  doc delete.    s
46e0: 65 74 20 72 65 73 75 6c 74 0a 7d 20 2d 30 2e 31  et result.} -0.1
46f0: 32 33 0a 0a 74 65 73 74 20 64 6f 6d 2d 32 2e 33  23..test dom-2.3
4700: 34 20 7b 58 4d 4c 20 70 72 65 66 69 78 20 64 65  4 {XML prefix de
4710: 63 6c 61 72 61 74 69 6f 6e 20 77 69 74 68 20 65  claration with e
4720: 6d 70 74 79 20 6e 61 6d 65 73 70 61 63 65 7d 20  mpty namespace} 
4730: 7b 0a 20 20 20 20 63 61 74 63 68 20 7b 64 6f 6d  {.    catch {dom
4740: 20 70 61 72 73 65 20 7b 3c 66 6f 6f 3a 64 6f 63   parse {<foo:doc
4750: 20 78 6d 6c 6e 73 3a 66 6f 6f 3d 22 22 3e 3c 65   xmlns:foo=""><e
4760: 31 2f 3e 3c 2f 66 6f 6f 3a 64 6f 63 3e 7d 7d 20  1/></foo:doc>}} 
4770: 65 72 72 4d 73 67 0a 20 20 20 20 73 65 74 20 65  errMsg.    set e
4780: 72 72 4d 73 67 0a 7d 20 7b 4d 69 73 73 69 6e 67  rrMsg.} {Missing
4790: 20 55 52 49 20 69 6e 20 4e 61 6d 65 73 70 61 63   URI in Namespac
47a0: 65 20 64 65 63 6c 61 72 61 74 69 6f 6e 2c 20 72  e declaration, r
47b0: 65 66 65 72 65 6e 63 65 64 20 61 74 20 6c 69 6e  eferenced at lin
47c0: 65 20 31 20 63 68 61 72 61 63 74 65 72 20 32 32  e 1 character 22
47d0: 7d 0a 0a 74 65 73 74 20 64 6f 6d 2d 32 2e 33 35  }..test dom-2.35
47e0: 20 7b 2d 6b 65 65 70 43 44 41 54 41 7d 20 7b 0a   {-keepCDATA} {.
47f0: 20 20 20 20 73 65 74 20 64 6f 63 20 5b 64 6f 6d      set doc [dom
4800: 20 70 61 72 73 65 20 2d 6b 65 65 70 43 44 41 54   parse -keepCDAT
4810: 41 20 7b 3c 64 6f 63 3e 66 6f 6f 20 3c 21 5b 43  A {<doc>foo <![C
4820: 44 41 54 41 5b 74 65 73 74 20 6f 66 20 26 20 3c  DATA[test of & <
4830: 62 61 64 3e 20 66 6f 72 6d 61 74 5d 5d 3e 20 62  bad> format]]> b
4840: 61 72 20 3c 2f 64 6f 63 3e 7d 5d 0a 20 20 20 20  ar </doc>}].    
4850: 73 65 74 20 72 65 73 75 6c 74 20 5b 24 64 6f 63  set result [$doc
4860: 20 61 73 58 4d 4c 20 2d 69 6e 64 65 6e 74 20 6e   asXML -indent n
4870: 6f 6e 65 5d 0a 20 20 20 20 24 64 6f 63 20 64 65  one].    $doc de
4880: 6c 65 74 65 0a 20 20 20 20 73 65 74 20 72 65 73  lete.    set res
4890: 75 6c 74 0a 7d 20 7b 3c 64 6f 63 3e 66 6f 6f 20  ult.} {<doc>foo 
48a0: 3c 21 5b 43 44 41 54 41 5b 74 65 73 74 20 6f 66  <![CDATA[test of
48b0: 20 26 20 3c 62 61 64 3e 20 66 6f 72 6d 61 74 5d   & <bad> format]
48c0: 5d 3e 20 62 61 72 20 3c 2f 64 6f 63 3e 7d 0a 0a  ]> bar </doc>}..
48d0: 74 65 73 74 20 64 6f 6d 2d 32 2e 33 36 20 7b 2d  test dom-2.36 {-
48e0: 6b 65 65 70 43 44 41 54 41 7d 20 7b 0a 20 20 20  keepCDATA} {.   
48f0: 20 73 65 74 20 64 6f 63 20 5b 64 6f 6d 20 70 61   set doc [dom pa
4900: 72 73 65 20 2d 6b 65 65 70 43 44 41 54 41 20 7b  rse -keepCDATA {
4910: 3c 64 6f 63 3e 66 6f 6f 20 3c 21 5b 43 44 41 54  <doc>foo <![CDAT
4920: 41 5b 74 65 73 74 20 6f 66 20 26 20 3c 62 61 64  A[test of & <bad
4930: 3e 20 66 6f 72 6d 61 74 5d 5d 3e 20 62 61 72 20  > format]]> bar 
4940: 3c 2f 64 6f 63 3e 7d 5d 0a 20 20 20 20 73 65 74  </doc>}].    set
4950: 20 72 6f 6f 74 20 5b 24 64 6f 63 20 64 6f 63 75   root [$doc docu
4960: 6d 65 6e 74 45 6c 65 6d 65 6e 74 5d 0a 20 20 20  mentElement].   
4970: 20 73 65 74 20 72 65 73 75 6c 74 20 5b 6c 69 73   set result [lis
4980: 74 5d 0a 20 20 20 20 66 6f 72 65 61 63 68 20 63  t].    foreach c
4990: 68 69 6c 64 20 5b 24 72 6f 6f 74 20 63 68 69 6c  hild [$root chil
49a0: 64 4e 6f 64 65 73 5d 20 7b 0a 20 20 20 20 20 20  dNodes] {.      
49b0: 20 20 6c 61 70 70 65 6e 64 20 72 65 73 75 6c 74    lappend result
49c0: 20 5b 24 63 68 69 6c 64 20 6e 6f 64 65 54 79 70   [$child nodeTyp
49d0: 65 5d 0a 20 20 20 20 7d 0a 20 20 20 20 24 64 6f  e].    }.    $do
49e0: 63 20 64 65 6c 65 74 65 0a 20 20 20 20 73 65 74  c delete.    set
49f0: 20 72 65 73 75 6c 74 0a 7d 20 7b 54 45 58 54 5f   result.} {TEXT_
4a00: 4e 4f 44 45 20 43 44 41 54 41 5f 53 45 43 54 49  NODE CDATA_SECTI
4a10: 4f 4e 5f 4e 4f 44 45 20 54 45 58 54 5f 4e 4f 44  ON_NODE TEXT_NOD
4a20: 45 7d 0a 0a 74 65 73 74 20 64 6f 6d 2d 32 2e 33  E}..test dom-2.3
4a30: 37 20 7b 2d 6b 65 65 70 43 44 41 54 41 7d 20 7b  7 {-keepCDATA} {
4a40: 0a 20 20 20 20 73 65 74 20 64 6f 63 20 5b 64 6f  .    set doc [do
4a50: 6d 20 70 61 72 73 65 20 2d 6b 65 65 70 43 44 41  m parse -keepCDA
4a60: 54 41 20 7b 3c 64 6f 63 3e 3c 65 3e 3c 21 5b 43  TA {<doc><e><![C
4a70: 44 41 54 41 5b 6f 6e 65 5d 5d 3e 3c 2f 65 3e 3c  DATA[one]]></e><
4a80: 2f 64 6f 63 3e 7d 5d 0a 20 20 20 20 73 65 74 20  /doc>}].    set 
4a90: 72 65 73 75 6c 74 20 5b 6c 69 73 74 5d 0a 20 20  result [list].  
4aa0: 20 20 66 6f 72 65 61 63 68 20 63 68 69 6c 64 20    foreach child 
4ab0: 5b 24 64 6f 63 20 73 65 6c 65 63 74 4e 6f 64 65  [$doc selectNode
4ac0: 73 20 64 6f 63 2f 65 2f 6e 6f 64 65 28 29 5d 20  s doc/e/node()] 
4ad0: 7b 0a 20 20 20 20 20 20 20 20 6c 61 70 70 65 6e  {.        lappen
4ae0: 64 20 72 65 73 75 6c 74 20 5b 24 63 68 69 6c 64  d result [$child
4af0: 20 6e 6f 64 65 54 79 70 65 5d 0a 20 20 20 20 7d   nodeType].    }
4b00: 0a 20 20 20 20 24 64 6f 63 20 64 65 6c 65 74 65  .    $doc delete
4b10: 0a 20 20 20 20 73 65 74 20 72 65 73 75 6c 74 0a  .    set result.
4b20: 7d 20 7b 43 44 41 54 41 5f 53 45 43 54 49 4f 4e  } {CDATA_SECTION
4b30: 5f 4e 4f 44 45 7d 0a 0a 74 65 73 74 20 64 6f 6d  _NODE}..test dom
4b40: 2d 32 2e 33 38 20 7b 2d 6b 65 65 70 43 44 41 54  -2.38 {-keepCDAT
4b50: 41 7d 20 7b 0a 20 20 20 20 73 65 74 20 64 6f 63  A} {.    set doc
4b60: 20 5b 64 6f 6d 20 70 61 72 73 65 20 2d 6b 65 65   [dom parse -kee
4b70: 70 43 44 41 54 41 20 7b 3c 64 6f 63 3e 3c 65 3e  pCDATA {<doc><e>
4b80: 3c 21 5b 43 44 41 54 41 5b 6f 6e 65 5d 5d 3e 3c  <![CDATA[one]]><
4b90: 21 5b 43 44 41 54 41 5b 74 77 6f 5d 5d 3e 3c 2f  ![CDATA[two]]></
4ba0: 65 3e 3c 2f 64 6f 63 3e 7d 5d 0a 20 20 20 20 73  e></doc>}].    s
4bb0: 65 74 20 72 65 73 75 6c 74 20 5b 6c 69 73 74 5d  et result [list]
4bc0: 0a 20 20 20 20 66 6f 72 65 61 63 68 20 63 68 69  .    foreach chi
4bd0: 6c 64 20 5b 24 64 6f 63 20 73 65 6c 65 63 74 4e  ld [$doc selectN
4be0: 6f 64 65 73 20 64 6f 63 2f 65 2f 6e 6f 64 65 28  odes doc/e/node(
4bf0: 29 5d 20 7b 0a 20 20 20 20 20 20 20 20 6c 61 70  )] {.        lap
4c00: 70 65 6e 64 20 72 65 73 75 6c 74 20 5b 24 63 68  pend result [$ch
4c10: 69 6c 64 20 6e 6f 64 65 54 79 70 65 5d 0a 20 20  ild nodeType].  
4c20: 20 20 7d 0a 20 20 20 20 24 64 6f 63 20 64 65 6c    }.    $doc del
4c30: 65 74 65 0a 20 20 20 20 73 65 74 20 72 65 73 75  ete.    set resu
4c40: 6c 74 0a 7d 20 7b 43 44 41 54 41 5f 53 45 43 54  lt.} {CDATA_SECT
4c50: 49 4f 4e 5f 4e 4f 44 45 20 43 44 41 54 41 5f 53  ION_NODE CDATA_S
4c60: 45 43 54 49 4f 4e 5f 4e 4f 44 45 7d 0a 0a 74 65  ECTION_NODE}..te
4c70: 73 74 20 64 6f 6d 2d 32 2e 33 39 20 7b 2d 6b 65  st dom-2.39 {-ke
4c80: 65 70 43 44 41 54 41 7d 20 7b 0a 20 20 20 20 73  epCDATA} {.    s
4c90: 65 74 20 64 6f 63 20 5b 64 6f 6d 20 70 61 72 73  et doc [dom pars
4ca0: 65 20 2d 6b 65 65 70 43 44 41 54 41 20 7b 3c 64  e -keepCDATA {<d
4cb0: 6f 63 3e 3c 65 3e 3c 21 5b 43 44 41 54 41 5b 5d  oc><e><![CDATA[]
4cc0: 5d 3e 3c 2f 65 3e 3c 2f 64 6f 63 3e 7d 5d 0a 20  ]></e></doc>}]. 
4cd0: 20 20 20 73 65 74 20 72 65 73 75 6c 74 20 5b 24     set result [$
4ce0: 64 6f 63 20 73 65 6c 65 63 74 4e 6f 64 65 73 20  doc selectNodes 
4cf0: 63 6f 75 6e 74 28 64 6f 63 2f 65 2f 6e 6f 64 65  count(doc/e/node
4d00: 28 29 29 5d 0a 20 20 20 20 24 64 6f 63 20 64 65  ())].    $doc de
4d10: 6c 65 74 65 0a 20 20 20 20 73 65 74 20 72 65 73  lete.    set res
4d20: 75 6c 74 0a 7d 20 30 0a 0a 74 65 73 74 20 64 6f  ult.} 0..test do
4d30: 6d 2d 32 2e 34 30 20 7b 2d 6b 65 65 70 43 44 41  m-2.40 {-keepCDA
4d40: 54 41 20 77 68 69 74 65 20 73 70 61 63 65 20 6f  TA white space o
4d50: 6e 6c 79 20 43 44 41 54 41 20 73 65 63 74 69 6f  nly CDATA sectio
4d60: 6e 7d 20 7b 0a 20 20 20 20 73 65 74 20 64 6f 63  n} {.    set doc
4d70: 20 5b 64 6f 6d 20 70 61 72 73 65 20 2d 6b 65 65   [dom parse -kee
4d80: 70 43 44 41 54 41 20 7b 3c 64 6f 63 3e 3c 65 3e  pCDATA {<doc><e>
4d90: 3c 21 5b 43 44 41 54 41 5b 0a 20 20 20 20 5d 5d  <![CDATA[.    ]]
4da0: 3e 3c 2f 65 3e 3c 2f 64 6f 63 3e 7d 5d 0a 20 20  ></e></doc>}].  
4db0: 20 20 73 65 74 20 72 65 73 75 6c 74 20 5b 24 64    set result [$d
4dc0: 6f 63 20 73 65 6c 65 63 74 4e 6f 64 65 73 20 63  oc selectNodes c
4dd0: 6f 75 6e 74 28 64 6f 63 2f 65 2f 6e 6f 64 65 28  ount(doc/e/node(
4de0: 29 29 5d 0a 20 20 20 20 24 64 6f 63 20 64 65 6c  ))].    $doc del
4df0: 65 74 65 0a 20 20 20 20 73 65 74 20 72 65 73 75  ete.    set resu
4e00: 6c 74 0a 7d 20 30 0a 0a 74 65 73 74 20 64 6f 6d  lt.} 0..test dom
4e10: 2d 32 2e 34 31 20 7b 2d 6b 65 65 70 43 44 41 54  -2.41 {-keepCDAT
4e20: 41 20 61 6e 64 20 2d 6b 65 65 70 45 6d 70 74 69  A and -keepEmpti
4e30: 65 73 7d 20 7b 0a 20 20 20 20 73 65 74 20 64 6f  es} {.    set do
4e40: 63 20 5b 64 6f 6d 20 70 61 72 73 65 20 2d 6b 65  c [dom parse -ke
4e50: 65 70 43 44 41 54 41 20 2d 6b 65 65 70 45 6d 70  epCDATA -keepEmp
4e60: 74 69 65 73 20 7b 3c 64 6f 63 3e 3c 65 3e 3c 21  ties {<doc><e><!
4e70: 5b 43 44 41 54 41 5b 5d 5d 3e 3c 2f 65 3e 3c 2f  [CDATA[]]></e></
4e80: 64 6f 63 3e 7d 5d 0a 20 20 20 20 73 65 74 20 72  doc>}].    set r
4e90: 65 73 75 6c 74 20 5b 24 64 6f 63 20 73 65 6c 65  esult [$doc sele
4ea0: 63 74 4e 6f 64 65 73 20 63 6f 75 6e 74 28 64 6f  ctNodes count(do
4eb0: 63 2f 65 2f 6e 6f 64 65 28 29 29 5d 0a 20 20 20  c/e/node())].   
4ec0: 20 24 64 6f 63 20 64 65 6c 65 74 65 0a 20 20 20   $doc delete.   
4ed0: 20 73 65 74 20 72 65 73 75 6c 74 0a 7d 20 31 0a   set result.} 1.
4ee0: 0a 74 65 73 74 20 64 6f 6d 2d 32 2e 34 32 20 7b  .test dom-2.42 {
4ef0: 6e 61 6d 65 73 70 61 63 65 73 7d 20 7b 0a 20 20  namespaces} {.  
4f00: 20 20 73 65 74 20 64 6f 63 20 5b 64 6f 6d 20 70    set doc [dom p
4f10: 61 72 73 65 20 7b 0a 20 20 20 20 20 20 20 20 3c  arse {.        <
4f20: 68 65 6c 70 3e 3c 62 72 20 78 6d 6c 6e 73 3a 78  help><br xmlns:x
4f30: 73 69 3d 22 61 22 2f 3e 3c 65 6d 20 78 6d 6c 6e  si="a"/><em xmln
4f40: 73 3a 78 73 69 3d 22 61 22 3e 6e 6f 74 65 73 3c  s:xsi="a">notes<
4f50: 2f 65 6d 3e 3c 2f 68 65 6c 70 3e 0a 20 20 20 20  /em></help>.    
4f60: 7d 5d 0a 20 20 20 20 24 64 6f 63 20 64 65 6c 65  }].    $doc dele
4f70: 74 65 0a 7d 20 7b 7d 0a 0a 74 65 73 74 20 64 6f  te.} {}..test do
4f80: 6d 2d 33 2e 31 20 7b 69 73 4e 61 6d 65 7d 20 7b  m-3.1 {isName} {
4f90: 0a 20 20 20 20 64 6f 6d 20 69 73 4e 61 6d 65 20  .    dom isName 
4fa0: 22 3a 66 6f 6f 22 0a 7d 20 7b 31 7d 0a 0a 74 65  ":foo".} {1}..te
4fb0: 73 74 20 64 6f 6d 2d 33 2e 32 20 7b 69 73 4e 61  st dom-3.2 {isNa
4fc0: 6d 65 7d 20 7b 0a 20 20 20 20 64 6f 6d 20 69 73  me} {.    dom is
4fd0: 4e 61 6d 65 20 22 5f 66 6f 6f 22 0a 7d 20 7b 31  Name "_foo".} {1
4fe0: 7d 0a 0a 74 65 73 74 20 64 6f 6d 2d 33 2e 33 20  }..test dom-3.3 
4ff0: 7b 69 73 4e 61 6d 65 7d 20 7b 0a 20 20 20 20 64  {isName} {.    d
5000: 6f 6d 20 69 73 4e 61 6d 65 20 22 66 6f 6f 3a 62  om isName "foo:b
5010: 61 72 3a 62 61 7a 22 0a 7d 20 7b 31 7d 0a 0a 74  ar:baz".} {1}..t
5020: 65 73 74 20 64 6f 6d 2d 33 2e 34 20 7b 69 73 4e  est dom-3.4 {isN
5030: 61 6d 65 7d 20 7b 0a 20 20 20 20 64 6f 6d 20 69  ame} {.    dom i
5040: 73 4e 61 6d 65 20 22 2d 66 6f 6f 22 0a 7d 20 7b  sName "-foo".} {
5050: 30 7d 0a 0a 74 65 73 74 20 64 6f 6d 2d 33 2e 35  0}..test dom-3.5
5060: 20 7b 69 73 4e 61 6d 65 7d 20 7b 0a 20 20 20 20   {isName} {.    
5070: 64 6f 6d 20 69 73 4e 61 6d 65 20 22 2e 66 6f 6f  dom isName ".foo
5080: 22 0a 7d 20 7b 30 7d 0a 0a 74 65 73 74 20 64 6f  ".} {0}..test do
5090: 6d 2d 33 2e 36 20 7b 69 73 4e 61 6d 65 7d 20 7b  m-3.6 {isName} {
50a0: 0a 20 20 20 20 63 61 74 63 68 20 7b 64 6f 6d 20  .    catch {dom 
50b0: 69 73 4e 61 6d 65 7d 0a 7d 20 7b 31 7d 0a 0a 74  isName}.} {1}..t
50c0: 65 73 74 20 64 6f 6d 2d 33 2e 37 20 7b 69 73 4e  est dom-3.7 {isN
50d0: 61 6d 65 7d 20 7b 0a 20 20 20 20 63 61 74 63 68  ame} {.    catch
50e0: 20 7b 64 6f 6d 20 69 73 4e 61 6d 65 20 66 6f 6f   {dom isName foo
50f0: 20 62 61 72 7d 0a 7d 20 7b 31 7d 0a 0a 23 20 54   bar}.} {1}..# T
5100: 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 63 68 61  he following cha
5110: 72 61 63 74 65 72 20 63 6c 61 73 73 65 73 20 61  racter classes a
5120: 72 65 20 6f 75 74 20 6f 66 20 58 4d 4c 20 31 2e  re out of XML 1.
5130: 30 20 53 65 63 6f 6e 64 20 45 64 69 74 69 6f 6e  0 Second Edition
5140: 20 72 65 63 2c 0a 23 20 41 70 70 65 6e 64 69 78   rec,.# Appendix
5150: 20 42 20 28 77 68 69 63 68 20 69 73 20 66 6f 6c   B (which is fol
5160: 6c 6f 77 69 6e 67 20 74 68 65 20 55 6e 69 63 6f  lowing the Unico
5170: 64 65 20 73 74 61 6e 64 61 72 64 29 2e 0a 0a 73  de standard)...s
5180: 65 74 20 42 61 73 65 43 68 61 72 20 7b 0a 20 20  et BaseChar {.  
5190: 20 20 7b 30 78 30 30 34 31 20 30 78 30 30 35 41    {0x0041 0x005A
51a0: 7d 20 7b 30 78 30 30 36 31 20 30 78 30 30 37 41  } {0x0061 0x007A
51b0: 7d 20 7b 30 78 30 30 43 30 20 30 78 30 30 44 36  } {0x00C0 0x00D6
51c0: 7d 0a 20 20 20 20 7b 30 78 30 30 44 38 20 30 78  }.    {0x00D8 0x
51d0: 30 30 46 36 7d 20 7b 30 78 30 30 46 38 20 30 78  00F6} {0x00F8 0x
51e0: 30 30 46 46 7d 20 7b 30 78 30 31 30 30 20 30 78  00FF} {0x0100 0x
51f0: 30 31 33 31 7d 20 7b 30 78 30 31 33 34 20 30 78  0131} {0x0134 0x
5200: 30 31 33 45 7d 0a 20 20 20 20 7b 30 78 30 31 34  013E}.    {0x014
5210: 31 20 30 78 30 31 34 38 7d 20 7b 30 78 30 31 34  1 0x0148} {0x014
5220: 41 20 30 78 30 31 37 45 7d 20 7b 30 78 30 31 38  A 0x017E} {0x018
5230: 30 20 30 78 30 31 43 33 7d 0a 20 20 20 20 7b 30  0 0x01C3}.    {0
5240: 78 30 31 43 44 20 30 78 30 31 46 30 7d 20 7b 30  x01CD 0x01F0} {0
5250: 78 30 31 46 34 20 30 78 30 31 46 35 7d 20 7b 30  x01F4 0x01F5} {0
5260: 78 30 31 46 41 20 30 78 30 32 31 37 7d 20 7b 30  x01FA 0x0217} {0
5270: 78 30 32 35 30 20 30 78 30 32 41 38 7d 0a 20 20  x0250 0x02A8}.  
5280: 20 20 7b 30 78 30 32 42 42 20 30 78 30 32 43 31    {0x02BB 0x02C1
5290: 7d 20 30 78 30 33 38 36 20 7b 30 78 30 33 38 38  } 0x0386 {0x0388
52a0: 20 30 78 30 33 38 41 7d 20 30 78 30 33 38 43 0a   0x038A} 0x038C.
52b0: 20 20 20 20 7b 30 78 30 33 38 45 20 30 78 30 33      {0x038E 0x03
52c0: 41 31 7d 20 7b 30 78 30 33 41 33 20 30 78 30 33  A1} {0x03A3 0x03
52d0: 43 45 7d 20 7b 30 78 30 33 44 30 20 30 78 30 33  CE} {0x03D0 0x03
52e0: 44 36 7d 20 30 78 30 33 44 41 20 30 78 30 33 44  D6} 0x03DA 0x03D
52f0: 43 0a 20 20 20 20 30 78 30 33 44 45 20 30 78 30  C.    0x03DE 0x0
5300: 33 45 30 20 7b 30 78 30 33 45 32 20 30 78 30 33  3E0 {0x03E2 0x03
5310: 46 33 7d 20 7b 30 78 30 34 30 31 20 30 78 30 34  F3} {0x0401 0x04
5320: 30 43 7d 0a 20 20 20 20 7b 30 78 30 34 30 45 20  0C}.    {0x040E 
5330: 30 78 30 34 34 46 7d 20 7b 30 78 30 34 35 31 20  0x044F} {0x0451 
5340: 30 78 30 34 35 43 7d 20 7b 30 78 30 34 35 45 20  0x045C} {0x045E 
5350: 30 78 30 34 38 31 7d 20 7b 30 78 30 34 39 30 20  0x0481} {0x0490 
5360: 30 78 30 34 43 34 7d 0a 20 20 20 20 7b 30 78 30  0x04C4}.    {0x0
5370: 34 43 37 20 30 78 30 34 43 38 7d 20 7b 30 78 30  4C7 0x04C8} {0x0
5380: 34 43 42 20 30 78 30 34 43 43 7d 20 7b 30 78 30  4CB 0x04CC} {0x0
5390: 34 44 30 20 30 78 30 34 45 42 7d 0a 20 20 20 20  4D0 0x04EB}.    
53a0: 7b 30 78 30 34 45 45 20 30 78 30 34 46 35 7d 20  {0x04EE 0x04F5} 
53b0: 7b 30 78 30 34 46 38 20 30 78 30 34 46 39 7d 20  {0x04F8 0x04F9} 
53c0: 7b 30 78 30 35 33 31 20 30 78 30 35 35 36 7d 20  {0x0531 0x0556} 
53d0: 30 78 30 35 35 39 0a 20 20 20 20 7b 30 78 30 35  0x0559.    {0x05
53e0: 36 31 20 30 78 30 35 38 36 7d 20 7b 30 78 30 35  61 0x0586} {0x05
53f0: 44 30 20 30 78 30 35 45 41 7d 20 7b 30 78 30 35  D0 0x05EA} {0x05
5400: 46 30 20 30 78 30 35 46 32 7d 20 7b 30 78 30 36  F0 0x05F2} {0x06
5410: 32 31 20 30 78 30 36 33 41 7d 0a 20 20 20 20 7b  21 0x063A}.    {
5420: 30 78 30 36 34 31 20 30 78 30 36 34 41 7d 20 7b  0x0641 0x064A} {
5430: 30 78 30 36 37 31 20 30 78 30 36 42 37 7d 20 7b  0x0671 0x06B7} {
5440: 30 78 30 36 42 41 20 30 78 30 36 42 45 7d 0a 20  0x06BA 0x06BE}. 
5450: 20 20 20 7b 30 78 30 36 43 30 20 30 78 30 36 43     {0x06C0 0x06C
5460: 45 7d 20 7b 30 78 30 36 44 30 20 30 78 30 36 44  E} {0x06D0 0x06D
5470: 33 7d 20 30 78 30 36 44 35 20 7b 30 78 30 36 45  3} 0x06D5 {0x06E
5480: 35 20 30 78 30 36 45 36 7d 0a 20 20 20 20 7b 30  5 0x06E6}.    {0
5490: 78 30 39 30 35 20 30 78 30 39 33 39 7d 20 30 78  x0905 0x0939} 0x
54a0: 30 39 33 44 20 7b 30 78 30 39 35 38 20 30 78 30  093D {0x0958 0x0
54b0: 39 36 31 7d 20 7b 30 78 30 39 38 35 20 30 78 30  961} {0x0985 0x0
54c0: 39 38 43 7d 0a 20 20 20 20 7b 30 78 30 39 38 46  98C}.    {0x098F
54d0: 20 30 78 30 39 39 30 7d 20 7b 30 78 30 39 39 33   0x0990} {0x0993
54e0: 20 30 78 30 39 41 38 7d 20 7b 30 78 30 39 41 41   0x09A8} {0x09AA
54f0: 20 30 78 30 39 42 30 7d 20 30 78 30 39 42 32 0a   0x09B0} 0x09B2.
5500: 20 20 20 20 7b 30 78 30 39 42 36 20 30 78 30 39      {0x09B6 0x09
5510: 42 39 7d 20 7b 30 78 30 39 44 43 20 30 78 30 39  B9} {0x09DC 0x09
5520: 44 44 7d 20 7b 30 78 30 39 44 46 20 30 78 30 39  DD} {0x09DF 0x09
5530: 45 31 7d 20 7b 30 78 30 39 46 30 20 30 78 30 39  E1} {0x09F0 0x09
5540: 46 31 7d 0a 20 20 20 20 7b 30 78 30 41 30 35 20  F1}.    {0x0A05 
5550: 30 78 30 41 30 41 7d 20 7b 30 78 30 41 30 46 20  0x0A0A} {0x0A0F 
5560: 30 78 30 41 31 30 7d 20 7b 30 78 30 41 31 33 20  0x0A10} {0x0A13 
5570: 30 78 30 41 32 38 7d 0a 20 20 20 20 7b 30 78 30  0x0A28}.    {0x0
5580: 41 32 41 20 30 78 30 41 33 30 7d 20 7b 30 78 30  A2A 0x0A30} {0x0
5590: 41 33 32 20 30 78 30 41 33 33 7d 20 7b 30 78 30  A32 0x0A33} {0x0
55a0: 41 33 35 20 30 78 30 41 33 36 7d 20 7b 30 78 30  A35 0x0A36} {0x0
55b0: 41 33 38 20 30 78 30 41 33 39 7d 0a 20 20 20 20  A38 0x0A39}.    
55c0: 7b 30 78 30 41 35 39 20 30 78 30 41 35 43 7d 20  {0x0A59 0x0A5C} 
55d0: 30 78 30 41 35 45 20 7b 30 78 30 41 37 32 20 30  0x0A5E {0x0A72 0
55e0: 78 30 41 37 34 7d 20 7b 30 78 30 41 38 35 20 30  x0A74} {0x0A85 0
55f0: 78 30 41 38 42 7d 0a 20 20 20 20 30 78 30 41 38  x0A8B}.    0x0A8
5600: 44 20 7b 30 78 30 41 38 46 20 30 78 30 41 39 31  D {0x0A8F 0x0A91
5610: 7d 20 7b 30 78 30 41 39 33 20 30 78 30 41 41 38  } {0x0A93 0x0AA8
5620: 7d 20 7b 30 78 30 41 41 41 20 30 78 30 41 42 30  } {0x0AAA 0x0AB0
5630: 7d 0a 20 20 20 20 7b 30 78 30 41 42 32 20 30 78  }.    {0x0AB2 0x
5640: 30 41 42 33 7d 20 7b 30 78 30 41 42 35 20 30 78  0AB3} {0x0AB5 0x
5650: 30 41 42 39 7d 20 30 78 30 41 42 44 20 30 78 30  0AB9} 0x0ABD 0x0
5660: 41 45 30 20 7b 30 78 30 42 30 35 20 30 78 30 42  AE0 {0x0B05 0x0B
5670: 30 43 7d 0a 20 20 20 20 7b 30 78 30 42 30 46 20  0C}.    {0x0B0F 
5680: 30 78 30 42 31 30 7d 20 7b 30 78 30 42 31 33 20  0x0B10} {0x0B13 
5690: 30 78 30 42 32 38 7d 20 7b 30 78 30 42 32 41 20  0x0B28} {0x0B2A 
56a0: 30 78 30 42 33 30 7d 0a 20 20 20 20 7b 30 78 30  0x0B30}.    {0x0
56b0: 42 33 32 20 30 78 30 42 33 33 7d 20 7b 30 78 30  B32 0x0B33} {0x0
56c0: 42 33 36 20 30 78 30 42 33 39 7d 20 30 78 30 42  B36 0x0B39} 0x0B
56d0: 33 44 20 7b 30 78 30 42 35 43 20 30 78 30 42 35  3D {0x0B5C 0x0B5
56e0: 44 7d 0a 20 20 20 20 7b 30 78 30 42 35 46 20 30  D}.    {0x0B5F 0
56f0: 78 30 42 36 31 7d 20 7b 30 78 30 42 38 35 20 30  x0B61} {0x0B85 0
5700: 78 30 42 38 41 7d 20 7b 30 78 30 42 38 45 20 30  x0B8A} {0x0B8E 0
5710: 78 30 42 39 30 7d 20 7b 30 78 30 42 39 32 20 30  x0B90} {0x0B92 0
5720: 78 30 42 39 35 7d 0a 20 20 20 20 7b 30 78 30 42  x0B95}.    {0x0B
5730: 39 39 20 30 78 30 42 39 41 7d 20 30 78 30 42 39  99 0x0B9A} 0x0B9
5740: 43 20 7b 30 78 30 42 39 45 20 30 78 30 42 39 46  C {0x0B9E 0x0B9F
5750: 7d 20 7b 30 78 30 42 41 33 20 30 78 30 42 41 34  } {0x0BA3 0x0BA4
5760: 7d 0a 20 20 20 20 7b 30 78 30 42 41 38 20 30 78  }.    {0x0BA8 0x
5770: 30 42 41 41 7d 20 7b 30 78 30 42 41 45 20 30 78  0BAA} {0x0BAE 0x
5780: 30 42 42 35 7d 20 7b 30 78 30 42 42 37 20 30 78  0BB5} {0x0BB7 0x
5790: 30 42 42 39 7d 20 7b 30 78 30 43 30 35 20 30 78  0BB9} {0x0C05 0x
57a0: 30 43 30 43 7d 0a 20 20 20 20 7b 30 78 30 43 30  0C0C}.    {0x0C0
57b0: 45 20 30 78 30 43 31 30 7d 20 7b 30 78 30 43 31  E 0x0C10} {0x0C1
57c0: 32 20 30 78 30 43 32 38 7d 20 7b 30 78 30 43 32  2 0x0C28} {0x0C2
57d0: 41 20 30 78 30 43 33 33 7d 0a 20 20 20 20 7b 30  A 0x0C33}.    {0
57e0: 78 30 43 33 35 20 30 78 30 43 33 39 7d 20 7b 30  x0C35 0x0C39} {0
57f0: 78 30 43 36 30 20 30 78 30 43 36 31 7d 20 7b 30  x0C60 0x0C61} {0
5800: 78 30 43 38 35 20 30 78 30 43 38 43 7d 20 7b 30  x0C85 0x0C8C} {0
5810: 78 30 43 38 45 20 30 78 30 43 39 30 7d 0a 20 20  x0C8E 0x0C90}.  
5820: 20 20 7b 30 78 30 43 39 32 20 30 78 30 43 41 38    {0x0C92 0x0CA8
5830: 7d 20 7b 30 78 30 43 41 41 20 30 78 30 43 42 33  } {0x0CAA 0x0CB3
5840: 7d 20 7b 30 78 30 43 42 35 20 30 78 30 43 42 39  } {0x0CB5 0x0CB9
5850: 7d 20 30 78 30 43 44 45 0a 20 20 20 20 7b 30 78  } 0x0CDE.    {0x
5860: 30 43 45 30 20 30 78 30 43 45 31 7d 20 7b 30 78  0CE0 0x0CE1} {0x
5870: 30 44 30 35 20 30 78 30 44 30 43 7d 20 7b 30 78  0D05 0x0D0C} {0x
5880: 30 44 30 45 20 30 78 30 44 31 30 7d 20 7b 30 78  0D0E 0x0D10} {0x
5890: 30 44 31 32 20 30 78 30 44 32 38 7d 0a 20 20 20  0D12 0x0D28}.   
58a0: 20 7b 30 78 30 44 32 41 20 30 78 30 44 33 39 7d   {0x0D2A 0x0D39}
58b0: 20 7b 30 78 30 44 36 30 20 30 78 30 44 36 31 7d   {0x0D60 0x0D61}
58c0: 20 7b 30 78 30 45 30 31 20 30 78 30 45 32 45 7d   {0x0E01 0x0E2E}
58d0: 20 30 78 30 45 33 30 0a 20 20 20 20 7b 30 78 30   0x0E30.    {0x0
58e0: 45 33 32 20 30 78 30 45 33 33 7d 20 7b 30 78 30  E32 0x0E33} {0x0
58f0: 45 34 30 20 30 78 30 45 34 35 7d 20 7b 30 78 30  E40 0x0E45} {0x0
5900: 45 38 31 20 30 78 30 45 38 32 7d 20 30 78 30 45  E81 0x0E82} 0x0E
5910: 38 34 0a 20 20 20 20 7b 30 78 30 45 38 37 20 30  84.    {0x0E87 0
5920: 78 30 45 38 38 7d 20 30 78 30 45 38 41 20 30 78  x0E88} 0x0E8A 0x
5930: 30 45 38 44 20 7b 30 78 30 45 39 34 20 30 78 30  0E8D {0x0E94 0x0
5940: 45 39 37 7d 20 7b 30 78 30 45 39 39 20 30 78 30  E97} {0x0E99 0x0
5950: 45 39 46 7d 0a 20 20 20 20 7b 30 78 30 45 41 31  E9F}.    {0x0EA1
5960: 20 30 78 30 45 41 33 7d 20 30 78 30 45 41 35 20   0x0EA3} 0x0EA5 
5970: 30 78 30 45 41 37 20 7b 30 78 30 45 41 41 20 30  0x0EA7 {0x0EAA 0
5980: 78 30 45 41 42 7d 0a 20 20 20 20 7b 30 78 30 45  x0EAB}.    {0x0E
5990: 41 44 20 30 78 30 45 41 45 7d 20 30 78 30 45 42  AD 0x0EAE} 0x0EB
59a0: 30 20 7b 30 78 30 45 42 32 20 30 78 30 45 42 33  0 {0x0EB2 0x0EB3
59b0: 7d 20 30 78 30 45 42 44 20 7b 30 78 30 45 43 30  } 0x0EBD {0x0EC0
59c0: 20 30 78 30 45 43 34 7d 0a 20 20 20 20 7b 30 78   0x0EC4}.    {0x
59d0: 30 46 34 30 20 30 78 30 46 34 37 7d 20 7b 30 78  0F40 0x0F47} {0x
59e0: 30 46 34 39 20 30 78 30 46 36 39 7d 20 7b 30 78  0F49 0x0F69} {0x
59f0: 31 30 41 30 20 30 78 31 30 43 35 7d 0a 20 20 20  10A0 0x10C5}.   
5a00: 20 7b 30 78 31 30 44 30 20 30 78 31 30 46 36 7d   {0x10D0 0x10F6}
5a10: 20 30 78 31 31 30 30 20 7b 30 78 31 31 30 32 20   0x1100 {0x1102 
5a20: 30 78 31 31 30 33 7d 20 7b 30 78 31 31 30 35 20  0x1103} {0x1105 
5a30: 30 78 31 31 30 37 7d 20 30 78 31 31 30 39 0a 20  0x1107} 0x1109. 
5a40: 20 20 20 7b 30 78 31 31 30 42 20 30 78 31 31 30     {0x110B 0x110
5a50: 43 7d 20 7b 30 78 31 31 30 45 20 30 78 31 31 31  C} {0x110E 0x111
5a60: 32 7d 20 30 78 31 31 33 43 20 30 78 31 31 33 45  2} 0x113C 0x113E
5a70: 20 30 78 31 31 34 30 0a 20 20 20 20 30 78 31 31   0x1140.    0x11
5a80: 34 43 20 30 78 31 31 34 45 20 30 78 31 31 35 30  4C 0x114E 0x1150
5a90: 20 7b 30 78 31 31 35 34 20 30 78 31 31 35 35 7d   {0x1154 0x1155}
5aa0: 20 30 78 31 31 35 39 20 7b 30 78 31 31 35 46 20   0x1159 {0x115F 
5ab0: 30 78 31 31 36 31 7d 0a 20 20 20 20 30 78 31 31  0x1161}.    0x11
5ac0: 36 33 20 30 78 31 31 36 35 20 30 78 31 31 36 37  63 0x1165 0x1167
5ad0: 20 30 78 31 31 36 39 20 7b 30 78 31 31 36 44 20   0x1169 {0x116D 
5ae0: 30 78 31 31 36 45 7d 0a 20 20 20 20 7b 30 78 31  0x116E}.    {0x1
5af0: 31 37 32 20 30 78 31 31 37 33 7d 20 30 78 31 31  172 0x1173} 0x11
5b00: 37 35 20 30 78 31 31 39 45 20 30 78 31 31 41 38  75 0x119E 0x11A8
5b10: 20 30 78 31 31 41 42 20 7b 30 78 31 31 41 45 20   0x11AB {0x11AE 
5b20: 30 78 31 31 41 46 7d 0a 20 20 20 20 7b 30 78 31  0x11AF}.    {0x1
5b30: 31 42 37 20 30 78 31 31 42 38 7d 20 30 78 31 31  1B7 0x11B8} 0x11
5b40: 42 41 20 7b 30 78 31 31 42 43 20 30 78 31 31 43  BA {0x11BC 0x11C
5b50: 32 7d 20 30 78 31 31 45 42 20 30 78 31 31 46 30  2} 0x11EB 0x11F0
5b60: 0a 20 20 20 20 30 78 31 31 46 39 20 7b 30 78 31  .    0x11F9 {0x1
5b70: 45 30 30 20 30 78 31 45 39 42 7d 20 7b 30 78 31  E00 0x1E9B} {0x1
5b80: 45 41 30 20 30 78 31 45 46 39 7d 20 7b 30 78 31  EA0 0x1EF9} {0x1
5b90: 46 30 30 20 30 78 31 46 31 35 7d 0a 20 20 20 20  F00 0x1F15}.    
5ba0: 7b 30 78 31 46 31 38 20 30 78 31 46 31 44 7d 20  {0x1F18 0x1F1D} 
5bb0: 7b 30 78 31 46 32 30 20 30 78 31 46 34 35 7d 20  {0x1F20 0x1F45} 
5bc0: 7b 30 78 31 46 34 38 20 30 78 31 46 34 44 7d 20  {0x1F48 0x1F4D} 
5bd0: 7b 30 78 31 46 35 30 20 30 78 31 46 35 37 7d 0a  {0x1F50 0x1F57}.
5be0: 20 20 20 20 30 78 31 46 35 39 20 30 78 31 46 35      0x1F59 0x1F5
5bf0: 42 20 30 78 31 46 35 44 20 7b 30 78 31 46 35 46  B 0x1F5D {0x1F5F
5c00: 20 30 78 31 46 37 44 7d 20 7b 30 78 31 46 38 30   0x1F7D} {0x1F80
5c10: 20 30 78 31 46 42 34 7d 0a 20 20 20 20 7b 30 78   0x1FB4}.    {0x
5c20: 31 46 42 36 20 30 78 31 46 42 43 7d 20 30 78 31  1FB6 0x1FBC} 0x1
5c30: 46 42 45 20 7b 30 78 31 46 43 32 20 30 78 31 46  FBE {0x1FC2 0x1F
5c40: 43 34 7d 20 7b 30 78 31 46 43 36 20 30 78 31 46  C4} {0x1FC6 0x1F
5c50: 43 43 7d 0a 20 20 20 20 7b 30 78 31 46 44 30 20  CC}.    {0x1FD0 
5c60: 30 78 31 46 44 33 7d 20 7b 30 78 31 46 44 36 20  0x1FD3} {0x1FD6 
5c70: 30 78 31 46 44 42 7d 20 7b 30 78 31 46 45 30 20  0x1FDB} {0x1FE0 
5c80: 30 78 31 46 45 43 7d 20 7b 30 78 31 46 46 32 20  0x1FEC} {0x1FF2 
5c90: 30 78 31 46 46 34 7d 0a 20 20 20 20 7b 30 78 31  0x1FF4}.    {0x1
5ca0: 46 46 36 20 30 78 31 46 46 43 7d 20 30 78 32 31  FF6 0x1FFC} 0x21
5cb0: 32 36 20 7b 30 78 32 31 32 41 20 30 78 32 31 32  26 {0x212A 0x212
5cc0: 42 7d 20 30 78 32 31 32 45 0a 20 20 20 20 7b 30  B} 0x212E.    {0
5cd0: 78 32 31 38 30 20 30 78 32 31 38 32 7d 20 7b 30  x2180 0x2182} {0
5ce0: 78 33 30 34 31 20 30 78 33 30 39 34 7d 20 7b 30  x3041 0x3094} {0
5cf0: 78 33 30 41 31 20 30 78 33 30 46 41 7d 20 7b 30  x30A1 0x30FA} {0
5d00: 78 33 31 30 35 20 30 78 33 31 32 43 7d 0a 20 20  x3105 0x312C}.  
5d10: 20 20 7b 30 78 41 43 30 30 20 30 78 44 37 41 33    {0xAC00 0xD7A3
5d20: 7d 0a 7d 0a 0a 73 65 74 20 49 64 65 6f 67 72 61  }.}..set Ideogra
5d30: 70 68 69 63 20 7b 0a 20 20 20 20 7b 30 78 34 45  phic {.    {0x4E
5d40: 30 30 20 30 78 39 46 41 35 7d 20 30 78 33 30 30  00 0x9FA5} 0x300
5d50: 37 20 7b 30 78 33 30 32 31 20 30 78 33 30 32 39  7 {0x3021 0x3029
5d60: 7d 0a 7d 0a 0a 73 65 74 20 43 6f 6d 62 69 6e 69  }.}..set Combini
5d70: 6e 67 43 68 61 72 20 7b 0a 20 20 20 20 7b 30 78  ngChar {.    {0x
5d80: 30 33 30 30 20 30 78 30 33 34 35 7d 20 7b 30 78  0300 0x0345} {0x
5d90: 30 33 36 30 20 30 78 30 33 36 31 7d 20 7b 30 78  0360 0x0361} {0x
5da0: 30 34 38 33 20 30 78 30 34 38 36 7d 20 7b 30 78  0483 0x0486} {0x
5db0: 30 35 39 31 20 30 78 30 35 41 31 7d 0a 20 20 20  0591 0x05A1}.   
5dc0: 20 7b 30 78 30 35 41 33 20 30 78 30 35 42 39 7d   {0x05A3 0x05B9}
5dd0: 20 7b 30 78 30 35 42 42 20 30 78 30 35 42 44 7d   {0x05BB 0x05BD}
5de0: 20 30 78 30 35 42 46 20 7b 30 78 30 35 43 31 20   0x05BF {0x05C1 
5df0: 30 78 30 35 43 32 7d 0a 20 20 20 20 30 78 30 35  0x05C2}.    0x05
5e00: 43 34 20 7b 30 78 30 36 34 42 20 30 78 30 36 35  C4 {0x064B 0x065
5e10: 32 7d 20 30 78 30 36 37 30 20 7b 30 78 30 36 44  2} 0x0670 {0x06D
5e20: 36 20 30 78 30 36 44 43 7d 20 7b 30 78 30 36 44  6 0x06DC} {0x06D
5e30: 44 20 30 78 30 36 44 46 7d 0a 20 20 20 20 7b 30  D 0x06DF}.    {0
5e40: 78 30 36 45 30 20 30 78 30 36 45 34 7d 20 7b 30  x06E0 0x06E4} {0
5e50: 78 30 36 45 37 20 30 78 30 36 45 38 7d 20 7b 30  x06E7 0x06E8} {0
5e60: 78 30 36 45 41 20 30 78 30 36 45 44 7d 0a 20 20  x06EA 0x06ED}.  
5e70: 20 20 7b 30 78 30 39 30 31 20 30 78 30 39 30 33    {0x0901 0x0903
5e80: 7d 20 30 78 30 39 33 43 20 7b 30 78 30 39 33 45  } 0x093C {0x093E
5e90: 20 30 78 30 39 34 43 7d 20 30 78 30 39 34 44 20   0x094C} 0x094D 
5ea0: 7b 30 78 30 39 35 31 20 30 78 30 39 35 34 7d 0a  {0x0951 0x0954}.
5eb0: 20 20 20 20 7b 30 78 30 39 36 32 20 30 78 30 39      {0x0962 0x09
5ec0: 36 33 7d 20 7b 30 78 30 39 38 31 20 30 78 30 39  63} {0x0981 0x09
5ed0: 38 33 7d 20 30 78 30 39 42 43 20 30 78 30 39 42  83} 0x09BC 0x09B
5ee0: 45 20 30 78 30 39 42 46 0a 20 20 20 20 7b 30 78  E 0x09BF.    {0x
5ef0: 30 39 43 30 20 30 78 30 39 43 34 7d 20 7b 30 78  09C0 0x09C4} {0x
5f00: 30 39 43 37 20 30 78 30 39 43 38 7d 20 7b 30 78  09C7 0x09C8} {0x
5f10: 30 39 43 42 20 30 78 30 39 43 44 7d 20 30 78 30  09CB 0x09CD} 0x0
5f20: 39 44 37 0a 20 20 20 20 7b 30 78 30 39 45 32 20  9D7.    {0x09E2 
5f30: 30 78 30 39 45 33 7d 20 30 78 30 41 30 32 20 30  0x09E3} 0x0A02 0
5f40: 78 30 41 33 43 20 30 78 30 41 33 45 20 30 78 30  x0A3C 0x0A3E 0x0
5f50: 41 33 46 20 7b 30 78 30 41 34 30 20 30 78 30 41  A3F {0x0A40 0x0A
5f60: 34 32 7d 0a 20 20 20 20 7b 30 78 30 41 34 37 20  42}.    {0x0A47 
5f70: 30 78 30 41 34 38 7d 20 7b 30 78 30 41 34 42 20  0x0A48} {0x0A4B 
5f80: 30 78 30 41 34 44 7d 20 7b 30 78 30 41 37 30 20  0x0A4D} {0x0A70 
5f90: 30 78 30 41 37 31 7d 0a 20 20 20 20 7b 30 78 30  0x0A71}.    {0x0
5fa0: 41 38 31 20 30 78 30 41 38 33 7d 20 30 78 30 41  A81 0x0A83} 0x0A
5fb0: 42 43 20 7b 30 78 30 41 42 45 20 30 78 30 41 43  BC {0x0ABE 0x0AC
5fc0: 35 7d 20 7b 30 78 30 41 43 37 20 30 78 30 41 43  5} {0x0AC7 0x0AC
5fd0: 39 7d 0a 20 20 20 20 7b 30 78 30 41 43 42 20 30  9}.    {0x0ACB 0
5fe0: 78 30 41 43 44 7d 20 7b 30 78 30 42 30 31 20 30  x0ACD} {0x0B01 0
5ff0: 78 30 42 30 33 7d 20 30 78 30 42 33 43 20 7b 30  x0B03} 0x0B3C {0
6000: 78 30 42 33 45 20 30 78 30 42 34 33 7d 0a 20 20  x0B3E 0x0B43}.  
6010: 20 20 7b 30 78 30 42 34 37 20 30 78 30 42 34 38    {0x0B47 0x0B48
6020: 7d 20 7b 30 78 30 42 34 42 20 30 78 30 42 34 44  } {0x0B4B 0x0B4D
6030: 7d 20 7b 30 78 30 42 35 36 20 30 78 30 42 35 37  } {0x0B56 0x0B57
6040: 7d 20 7b 30 78 30 42 38 32 20 30 78 30 42 38 33  } {0x0B82 0x0B83
6050: 7d 0a 20 20 20 20 7b 30 78 30 42 42 45 20 30 78  }.    {0x0BBE 0x
6060: 30 42 43 32 7d 20 7b 30 78 30 42 43 36 20 30 78  0BC2} {0x0BC6 0x
6070: 30 42 43 38 7d 20 7b 30 78 30 42 43 41 20 30 78  0BC8} {0x0BCA 0x
6080: 30 42 43 44 7d 20 30 78 30 42 44 37 0a 20 20 20  0BCD} 0x0BD7.   
6090: 20 7b 30 78 30 43 30 31 20 30 78 30 43 30 33 7d   {0x0C01 0x0C03}
60a0: 20 7b 30 78 30 43 33 45 20 30 78 30 43 34 34 7d   {0x0C3E 0x0C44}
60b0: 20 7b 30 78 30 43 34 36 20 30 78 30 43 34 38 7d   {0x0C46 0x0C48}
60c0: 20 7b 30 78 30 43 34 41 20 30 78 30 43 34 44 7d   {0x0C4A 0x0C4D}
60d0: 0a 20 20 20 20 7b 30 78 30 43 35 35 20 30 78 30  .    {0x0C55 0x0
60e0: 43 35 36 7d 20 7b 30 78 30 43 38 32 20 30 78 30  C56} {0x0C82 0x0
60f0: 43 38 33 7d 20 7b 30 78 30 43 42 45 20 30 78 30  C83} {0x0CBE 0x0
6100: 43 43 34 7d 0a 20 20 20 20 7b 30 78 30 43 43 36  CC4}.    {0x0CC6
6110: 20 30 78 30 43 43 38 7d 20 7b 30 78 30 43 43 41   0x0CC8} {0x0CCA
6120: 20 30 78 30 43 43 44 7d 20 7b 30 78 30 43 44 35   0x0CCD} {0x0CD5
6130: 20 30 78 30 43 44 36 7d 20 7b 30 78 30 44 30 32   0x0CD6} {0x0D02
6140: 20 30 78 30 44 30 33 7d 0a 20 20 20 20 7b 30 78   0x0D03}.    {0x
6150: 30 44 33 45 20 30 78 30 44 34 33 7d 20 7b 30 78  0D3E 0x0D43} {0x
6160: 30 44 34 36 20 30 78 30 44 34 38 7d 20 7b 30 78  0D46 0x0D48} {0x
6170: 30 44 34 41 20 30 78 30 44 34 44 7d 20 30 78 30  0D4A 0x0D4D} 0x0
6180: 44 35 37 0a 20 20 20 20 30 78 30 45 33 31 20 7b  D57.    0x0E31 {
6190: 30 78 30 45 33 34 20 30 78 30 45 33 41 7d 20 7b  0x0E34 0x0E3A} {
61a0: 30 78 30 45 34 37 20 30 78 30 45 34 45 7d 20 30  0x0E47 0x0E4E} 0
61b0: 78 30 45 42 31 20 7b 30 78 30 45 42 34 20 30 78  x0EB1 {0x0EB4 0x
61c0: 30 45 42 39 7d 0a 20 20 20 20 7b 30 78 30 45 42  0EB9}.    {0x0EB
61d0: 42 20 30 78 30 45 42 43 7d 20 7b 30 78 30 45 43  B 0x0EBC} {0x0EC
61e0: 38 20 30 78 30 45 43 44 7d 20 7b 30 78 30 46 31  8 0x0ECD} {0x0F1
61f0: 38 20 30 78 30 46 31 39 7d 20 30 78 30 46 33 35  8 0x0F19} 0x0F35
6200: 0a 20 20 20 20 30 78 30 46 33 37 20 30 78 30 46  .    0x0F37 0x0F
6210: 33 39 20 30 78 30 46 33 45 20 30 78 30 46 33 46  39 0x0F3E 0x0F3F
6220: 20 7b 30 78 30 46 37 31 20 30 78 30 46 38 34 7d   {0x0F71 0x0F84}
6230: 20 7b 30 78 30 46 38 36 20 30 78 30 46 38 42 7d   {0x0F86 0x0F8B}
6240: 0a 20 20 20 20 7b 30 78 30 46 39 30 20 30 78 30  .    {0x0F90 0x0
6250: 46 39 35 7d 20 30 78 30 46 39 37 20 7b 30 78 30  F95} 0x0F97 {0x0
6260: 46 39 39 20 30 78 30 46 41 44 7d 20 7b 30 78 30  F99 0x0FAD} {0x0
6270: 46 42 31 20 30 78 30 46 42 37 7d 0a 20 20 20 20  FB1 0x0FB7}.    
6280: 30 78 30 46 42 39 20 7b 30 78 32 30 44 30 20 30  0x0FB9 {0x20D0 0
6290: 78 32 30 44 43 7d 20 30 78 32 30 45 31 20 7b 30  x20DC} 0x20E1 {0
62a0: 78 33 30 32 41 20 30 78 33 30 32 46 7d 20 30 78  x302A 0x302F} 0x
62b0: 33 30 39 39 20 30 78 33 30 39 41 0a 7d 0a 0a 73  3099 0x309A.}..s
62c0: 65 74 20 44 69 67 69 74 20 7b 0a 20 20 20 20 7b  et Digit {.    {
62d0: 30 78 30 30 33 30 20 30 78 30 30 33 39 7d 20 7b  0x0030 0x0039} {
62e0: 30 78 30 36 36 30 20 30 78 30 36 36 39 7d 20 7b  0x0660 0x0669} {
62f0: 30 78 30 36 46 30 20 30 78 30 36 46 39 7d 20 7b  0x06F0 0x06F9} {
6300: 30 78 30 39 36 36 20 30 78 30 39 36 46 7d 0a 20  0x0966 0x096F}. 
6310: 20 20 20 7b 30 78 30 39 45 36 20 30 78 30 39 45     {0x09E6 0x09E
6320: 46 7d 20 7b 30 78 30 41 36 36 20 30 78 30 41 36  F} {0x0A66 0x0A6
6330: 46 7d 20 7b 30 78 30 41 45 36 20 30 78 30 41 45  F} {0x0AE6 0x0AE
6340: 46 7d 0a 20 20 20 20 7b 30 78 30 42 36 36 20 30  F}.    {0x0B66 0
6350: 78 30 42 36 46 7d 20 7b 30 78 30 42 45 37 20 30  x0B6F} {0x0BE7 0
6360: 78 30 42 45 46 7d 20 7b 30 78 30 43 36 36 20 30  x0BEF} {0x0C66 0
6370: 78 30 43 36 46 7d 20 7b 30 78 30 43 45 36 20 30  x0C6F} {0x0CE6 0
6380: 78 30 43 45 46 7d 0a 20 20 20 20 7b 30 78 30 44  x0CEF}.    {0x0D
6390: 36 36 20 30 78 30 44 36 46 7d 20 7b 30 78 30 45  66 0x0D6F} {0x0E
63a0: 35 30 20 30 78 30 45 35 39 7d 20 7b 30 78 30 45  50 0x0E59} {0x0E
63b0: 44 30 20 30 78 30 45 44 39 7d 0a 20 20 20 20 7b  D0 0x0ED9}.    {
63c0: 30 78 30 46 32 30 20 30 78 30 46 32 39 7d 0a 7d  0x0F20 0x0F29}.}
63d0: 0a 0a 73 65 74 20 45 78 74 65 6e 64 65 72 20 7b  ..set Extender {
63e0: 0a 20 20 20 20 30 78 30 30 42 37 20 30 78 30 32  .    0x00B7 0x02
63f0: 44 30 20 30 78 30 32 44 31 20 30 78 30 33 38 37  D0 0x02D1 0x0387
6400: 20 30 78 30 36 34 30 20 30 78 30 45 34 36 20 30   0x0640 0x0E46 0
6410: 78 30 45 43 36 20 30 78 33 30 30 35 0a 20 20 20  x0EC6 0x3005.   
6420: 20 7b 30 78 33 30 33 31 20 30 78 33 30 33 35 7d   {0x3031 0x3035}
6430: 20 7b 30 78 33 30 39 44 20 30 78 33 30 39 45 7d   {0x309D 0x309E}
6440: 20 7b 30 78 33 30 46 43 20 30 78 33 30 46 45 7d   {0x30FC 0x30FE}
6450: 0a 7d 0a 0a 70 72 6f 63 20 73 6f 72 74 43 6d 64  .}..proc sortCmd
6460: 20 7b 61 20 62 7d 20 7b 0a 20 20 20 20 69 66 20   {a b} {.    if 
6470: 7b 5b 6c 69 6e 64 65 78 20 24 61 20 30 5d 20 3e  {[lindex $a 0] >
6480: 20 5b 6c 69 6e 64 65 78 20 24 62 20 30 5d 7d 20   [lindex $b 0]} 
6490: 7b 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e  {.        return
64a0: 20 31 0a 20 20 20 20 7d 20 65 6c 73 65 20 7b 0a   1.    } else {.
64b0: 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 2d          return -
64c0: 31 0a 20 20 20 20 7d 0a 7d 0a 0a 23 20 20 69 66  1.    }.}..#  if
64d0: 20 7b 24 74 63 6c 5f 76 65 72 73 69 6f 6e 20 3c   {$tcl_version <
64e0: 20 38 2e 34 7d 20 7b 0a 23 20 20 20 20 20 20 73   8.4} {.#      s
64f0: 65 74 20 6e 61 6d 65 53 74 61 72 74 43 68 61 72  et nameStartChar
6500: 73 20 5b 6c 73 6f 72 74 20 2d 63 6f 6d 6d 61 6e  s [lsort -comman
6510: 64 20 73 6f 72 74 43 6d 64 20 5c 0a 23 20 20 20  d sortCmd \.#   
6520: 20 20 20 20 20 20 20 20 20 20 20 5b 63 6f 6e 63             [conc
6530: 61 74 20 24 42 61 73 65 43 68 61 72 20 24 49 64  at $BaseChar $Id
6540: 65 6f 67 72 61 70 68 69 63 20 30 78 30 30 35 46  eographic 0x005F
6550: 20 30 78 30 30 33 41 5d 5d 0a 23 20 20 7d 20 65   0x003A]].#  } e
6560: 6c 73 65 20 7b 0a 23 20 20 20 20 20 20 73 65 74  lse {.#      set
6570: 20 6e 61 6d 65 53 74 61 72 74 43 68 61 72 73 20   nameStartChars 
6580: 5b 6c 73 6f 72 74 20 2d 69 6e 74 65 67 65 72 20  [lsort -integer 
6590: 2d 69 6e 64 65 78 20 30 20 5c 0a 23 20 20 20 20  -index 0 \.#    
65a0: 20 20 20 20 20 20 20 20 20 20 5b 63 6f 6e 63 61            [conca
65b0: 74 20 24 42 61 73 65 43 68 61 72 20 24 49 64 65  t $BaseChar $Ide
65c0: 6f 67 72 61 70 68 69 63 20 30 78 30 30 35 46 20  ographic 0x005F 
65d0: 30 78 30 30 33 41 5d 5d 0a 23 20 20 7d 0a 0a 73  0x003A]].#  }..s
65e0: 65 74 20 6e 61 6d 65 53 74 61 72 74 43 68 61 72  et nameStartChar
65f0: 73 20 5b 6c 73 6f 72 74 20 2d 63 6f 6d 6d 61 6e  s [lsort -comman
6600: 64 20 73 6f 72 74 43 6d 64 20 5c 0a 20 20 20 20  d sortCmd \.    
6610: 20 20 20 20 5b 63 6f 6e 63 61 74 20 24 42 61 73      [concat $Bas
6620: 65 43 68 61 72 20 24 49 64 65 6f 67 72 61 70 68  eChar $Ideograph
6630: 69 63 20 30 78 30 30 35 46 20 30 78 30 30 33 41  ic 0x005F 0x003A
6640: 5d 5d 0a 0a 23 20 41 70 70 65 6e 64 20 73 74 6f  ]]..# Append sto
6650: 70 20 63 68 61 72 20 6e 65 65 64 65 64 20 62 79  p char needed by
6660: 20 74 68 65 20 74 65 73 74 20 63 6f 64 65 20 74   the test code t
6670: 6f 20 77 6f 72 6b 20 70 72 6f 70 65 72 6c 79 2e  o work properly.
6680: 0a 6c 61 70 70 65 6e 64 20 6e 61 6d 65 53 74 61  .lappend nameSta
6690: 72 74 43 68 61 72 73 20 30 78 31 30 30 30 30 0a  rtChars 0x10000.
66a0: 0a 74 65 73 74 20 64 6f 6d 2d 33 2e 38 20 7b 69  .test dom-3.8 {i
66b0: 73 4e 61 6d 65 7d 20 7b 6c 6f 6e 67 52 75 6e 6e  sName} {longRunn
66c0: 69 6e 67 7d 20 7b 0a 20 20 20 20 73 65 74 20 69  ing} {.    set i
66d0: 6e 64 20 30 0a 20 20 20 20 73 65 74 20 6e 72 20  nd 0.    set nr 
66e0: 30 0a 20 20 20 20 77 68 69 6c 65 20 7b 24 6e 72  0.    while {$nr
66f0: 20 3c 20 36 35 35 33 36 7d 20 7b 0a 20 20 20 20   < 65536} {.    
6700: 20 20 20 20 73 65 74 20 72 61 6e 67 65 20 5b 6c      set range [l
6710: 69 6e 64 65 78 20 24 6e 61 6d 65 53 74 61 72 74  index $nameStart
6720: 43 68 61 72 73 20 24 69 6e 64 5d 0a 20 20 20 20  Chars $ind].    
6730: 20 20 20 20 69 6e 63 72 20 69 6e 64 0a 20 20 20      incr ind.   
6740: 20 20 20 20 20 69 66 20 7b 5b 6c 6c 65 6e 67 74       if {[llengt
6750: 68 20 24 72 61 6e 67 65 5d 20 3d 3d 20 32 7d 20  h $range] == 2} 
6760: 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 66 6f  {.            fo
6770: 72 65 61 63 68 20 7b 6d 69 6e 20 6d 61 78 7d 20  reach {min max} 
6780: 24 72 61 6e 67 65 20 62 72 65 61 6b 0a 20 20 20  $range break.   
6790: 20 20 20 20 20 7d 20 65 6c 73 65 20 7b 0a 20 20       } else {.  
67a0: 20 20 20 20 20 20 20 20 20 20 73 65 74 20 6d 69            set mi
67b0: 6e 20 24 72 61 6e 67 65 0a 20 20 20 20 20 20 20  n $range.       
67c0: 20 20 20 20 20 73 65 74 20 6d 61 78 20 24 72 61       set max $ra
67d0: 6e 67 65 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  nge.        }.  
67e0: 20 20 20 20 20 20 77 68 69 6c 65 20 7b 24 6e 72        while {$nr
67f0: 20 3c 20 24 6d 69 6e 7d 20 7b 0a 20 20 20 20 20   < $min} {.     
6800: 20 20 20 20 20 20 20 69 66 20 7b 5b 64 6f 6d 20         if {[dom 
6810: 69 73 4e 61 6d 65 20 5b 73 75 62 73 74 20 5c 5c  isName [subst \\
6820: 75 5b 66 6f 72 6d 61 74 20 22 25 30 34 78 22 20  u[format "%04x" 
6830: 24 6e 72 5d 5d 5d 20 21 3d 20 30 7d 20 7b 0a 20  $nr]]] != 0} {. 
6840: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 65                 e
6850: 72 72 6f 72 20 22 77 72 6f 6e 67 20 27 69 73 4e  rror "wrong 'isN
6860: 61 6d 65 27 20 72 65 73 75 6c 74 20 66 6f 72 20  ame' result for 
6870: 6e 61 6d 65 20 73 74 61 72 74 20 63 68 61 72 20  name start char 
6880: 23 78 5b 66 6f 72 6d 61 74 20 22 25 30 34 78 22  #x[format "%04x"
6890: 20 24 6e 72 5d 20 2d 20 73 68 6f 75 6c 64 20 62   $nr] - should b
68a0: 65 20 69 6c 6c 65 67 61 6c 22 0a 20 20 20 20 20  e illegal".     
68b0: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
68c0: 20 20 20 20 20 69 6e 63 72 20 6e 72 0a 20 20 20       incr nr.   
68d0: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 69       }.        i
68e0: 66 20 7b 24 6e 72 20 3d 3d 20 30 78 31 30 30 30  f {$nr == 0x1000
68f0: 30 7d 20 7b 62 72 65 61 6b 7d 0a 20 20 20 20 20  0} {break}.     
6900: 20 20 20 77 68 69 6c 65 20 7b 24 6e 72 20 3c 3d     while {$nr <=
6910: 20 24 6d 61 78 7d 20 7b 0a 20 20 20 20 20 20 20   $max} {.       
6920: 20 20 20 20 20 69 66 20 7b 5b 64 6f 6d 20 69 73       if {[dom is
6930: 4e 61 6d 65 20 5b 73 75 62 73 74 20 5c 5c 75 5b  Name [subst \\u[
6940: 66 6f 72 6d 61 74 20 22 25 30 34 78 22 20 24 6e  format "%04x" $n
6950: 72 5d 5d 5d 20 21 3d 20 31 7d 20 7b 0a 20 20 20  r]]] != 1} {.   
6960: 20 20 20 20 20 20 20 20 20 20 20 20 20 65 72 72               err
6970: 6f 72 20 22 77 72 6f 6e 67 20 27 69 73 4e 61 6d  or "wrong 'isNam
6980: 65 27 20 72 65 73 75 6c 74 20 66 6f 72 20 6e 61  e' result for na
6990: 6d 65 20 73 74 61 72 74 20 63 68 61 72 20 23 78  me start char #x
69a0: 5b 66 6f 72 6d 61 74 20 22 25 30 34 78 22 20 24  [format "%04x" $
69b0: 6e 72 5d 20 2d 20 73 68 6f 75 6c 64 20 62 65 20  nr] - should be 
69c0: 6c 65 67 61 6c 22 0a 20 20 20 20 20 20 20 20 20  legal".         
69d0: 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 20     }.           
69e0: 20 69 6e 63 72 20 6e 72 0a 20 20 20 20 20 20 20   incr nr.       
69f0: 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 73 65 74   }.    }.    set
6a00: 20 6e 72 0a 7d 20 7b 36 35 35 33 36 7d 0a 0a 73   nr.} {65536}..s
6a10: 65 74 20 6e 61 6d 65 43 68 61 72 73 20 5b 6c 73  et nameChars [ls
6a20: 6f 72 74 20 2d 63 6f 6d 6d 61 6e 64 20 73 6f 72  ort -command sor
6a30: 74 43 6d 64 20 5c 0a 20 20 20 20 20 20 20 20 5b  tCmd \.        [
6a40: 63 6f 6e 63 61 74 20 24 42 61 73 65 43 68 61 72  concat $BaseChar
6a50: 20 24 49 64 65 6f 67 72 61 70 68 69 63 20 24 44   $Ideographic $D
6a60: 69 67 69 74 20 30 78 30 30 32 45 20 30 78 30 30  igit 0x002E 0x00
6a70: 32 44 20 30 78 30 30 35 46 20 30 78 30 30 33 41  2D 0x005F 0x003A
6a80: 20 5c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20   \.             
6a90: 20 20 20 24 43 6f 6d 62 69 6e 69 6e 67 43 68 61     $CombiningCha
6aa0: 72 20 24 45 78 74 65 6e 64 65 72 5d 5d 0a 0a 23  r $Extender]]..#
6ab0: 20 41 70 70 65 6e 64 20 73 74 6f 70 20 63 68 61   Append stop cha
6ac0: 72 20 6e 65 65 64 65 64 20 62 79 20 74 68 65 20  r needed by the 
6ad0: 74 65 73 74 20 63 6f 64 65 20 74 6f 20 77 6f 72  test code to wor
6ae0: 6b 20 70 72 6f 70 65 72 6c 79 2e 0a 6c 61 70 70  k properly..lapp
6af0: 65 6e 64 20 6e 61 6d 65 43 68 61 72 73 20 30 78  end nameChars 0x
6b00: 31 30 30 30 30 0a 0a 74 65 73 74 20 64 6f 6d 2d  10000..test dom-
6b10: 33 2e 39 20 7b 69 73 4e 61 6d 65 7d 20 7b 0a 20  3.9 {isName} {. 
6b20: 20 20 20 73 65 74 20 69 6e 64 20 30 0a 20 20 20     set ind 0.   
6b30: 20 73 65 74 20 6e 72 20 30 0a 20 20 20 20 77 68   set nr 0.    wh
6b40: 69 6c 65 20 7b 24 6e 72 20 3c 20 36 35 35 33 36  ile {$nr < 65536
6b50: 7d 20 7b 0a 20 20 20 20 20 20 20 20 73 65 74 20  } {.        set 
6b60: 72 61 6e 67 65 20 5b 6c 69 6e 64 65 78 20 24 6e  range [lindex $n
6b70: 61 6d 65 43 68 61 72 73 20 24 69 6e 64 5d 0a 20  ameChars $ind]. 
6b80: 20 20 20 20 20 20 20 69 6e 63 72 20 69 6e 64 0a         incr ind.
6b90: 20 20 20 20 20 20 20 20 69 66 20 7b 5b 6c 6c 65          if {[lle
6ba0: 6e 67 74 68 20 24 72 61 6e 67 65 5d 20 3d 3d 20  ngth $range] == 
6bb0: 32 7d 20 7b 0a 20 20 20 20 20 20 20 20 20 20 20  2} {.           
6bc0: 20 66 6f 72 65 61 63 68 20 7b 6d 69 6e 20 6d 61   foreach {min ma
6bd0: 78 7d 20 24 72 61 6e 67 65 20 62 72 65 61 6b 0a  x} $range break.
6be0: 20 20 20 20 20 20 20 20 7d 20 65 6c 73 65 20 7b          } else {
6bf0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 73 65 74  .            set
6c00: 20 6d 69 6e 20 24 72 61 6e 67 65 0a 20 20 20 20   min $range.    
6c10: 20 20 20 20 20 20 20 20 73 65 74 20 6d 61 78 20          set max 
6c20: 24 72 61 6e 67 65 0a 20 20 20 20 20 20 20 20 7d  $range.        }
6c30: 0a 20 20 20 20 20 20 20 20 77 68 69 6c 65 20 7b  .        while {
6c40: 24 6e 72 20 3c 20 24 6d 69 6e 7d 20 7b 0a 20 20  $nr < $min} {.  
6c50: 20 20 20 20 20 20 20 20 20 20 69 66 20 7b 5b 64            if {[d
6c60: 6f 6d 20 69 73 4e 61 6d 65 20 61 5b 73 75 62 73  om isName a[subs
6c70: 74 20 5c 5c 75 5b 66 6f 72 6d 61 74 20 22 25 30  t \\u[format "%0
6c80: 34 78 22 20 24 6e 72 5d 5d 5d 20 21 3d 20 30 7d  4x" $nr]]] != 0}
6c90: 20 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20   {.             
6ca0: 20 20 20 65 72 72 6f 72 20 22 77 72 6f 6e 67 20     error "wrong 
6cb0: 27 69 73 4e 61 6d 65 27 20 72 65 73 75 6c 74 20  'isName' result 
6cc0: 66 6f 72 20 6e 61 6d 65 20 63 68 61 72 20 23 78  for name char #x
6cd0: 5b 66 6f 72 6d 61 74 20 22 25 30 34 78 22 20 24  [format "%04x" $
6ce0: 6e 72 5d 20 2d 20 73 68 6f 75 6c 64 20 62 65 20  nr] - should be 
6cf0: 69 6c 6c 65 67 61 6c 22 0a 20 20 20 20 20 20 20  illegal".       
6d00: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20       }.         
6d10: 20 20 20 69 6e 63 72 20 6e 72 0a 20 20 20 20 20     incr nr.     
6d20: 20 20 20 7d 0a 20 20 20 20 20 20 20 20 69 66 20     }.        if 
6d30: 7b 24 6e 72 20 3d 3d 20 30 78 31 30 30 30 30 7d  {$nr == 0x10000}
6d40: 20 7b 62 72 65 61 6b 7d 0a 20 20 20 20 20 20 20   {break}.       
6d50: 20 77 68 69 6c 65 20 7b 24 6e 72 20 3c 3d 20 24   while {$nr <= $
6d60: 6d 61 78 7d 20 7b 0a 20 20 20 20 20 20 20 20 20  max} {.         
6d70: 20 20 20 69 66 20 7b 5b 64 6f 6d 20 69 73 4e 61     if {[dom isNa
6d80: 6d 65 20 61 5b 73 75 62 73 74 20 5c 5c 75 5b 66  me a[subst \\u[f
6d90: 6f 72 6d 61 74 20 22 25 30 34 78 22 20 24 6e 72  ormat "%04x" $nr
6da0: 5d 5d 5d 20 21 3d 20 31 7d 20 7b 0a 20 20 20 20  ]]] != 1} {.    
6db0: 20 20 20 20 20 20 20 20 20 20 20 20 65 72 72 6f              erro
6dc0: 72 20 22 77 72 6f 6e 67 20 27 69 73 4e 61 6d 65  r "wrong 'isName
6dd0: 27 20 72 65 73 75 6c 74 20 66 6f 72 20 6e 61 6d  ' result for nam
6de0: 65 20 63 68 61 72 20 23 78 5b 66 6f 72 6d 61 74  e char #x[format
6df0: 20 22 25 30 34 78 22 20 24 6e 72 5d 20 2d 20 73   "%04x" $nr] - s
6e00: 68 6f 75 6c 64 20 62 65 20 6c 65 67 61 6c 22 0a  hould be legal".
6e10: 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20              }.  
6e20: 20 20 20 20 20 20 20 20 20 20 69 6e 63 72 20 6e            incr n
6e30: 72 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  r.        }.    
6e40: 7d 0a 20 20 20 20 73 65 74 20 6e 72 0a 7d 20 7b  }.    set nr.} {
6e50: 36 35 35 33 36 7d 0a 0a 0a 74 65 73 74 20 64 6f  65536}...test do
6e60: 6d 2d 33 2e 31 30 20 7b 69 73 4e 43 4e 61 6d 65  m-3.10 {isNCName
6e70: 7d 20 7b 0a 20 20 20 20 64 6f 6d 20 69 73 4e 43  } {.    dom isNC
6e80: 4e 61 6d 65 20 22 3a 66 6f 6f 22 0a 7d 20 7b 30  Name ":foo".} {0
6e90: 7d 0a 0a 74 65 73 74 20 64 6f 6d 2d 33 2e 31 31  }..test dom-3.11
6ea0: 20 7b 69 73 4e 43 4e 61 6d 65 7d 20 7b 0a 20 20   {isNCName} {.  
6eb0: 20 20 64 6f 6d 20 69 73 4e 43 4e 61 6d 65 20 22    dom isNCName "
6ec0: 5f 66 6f 6f 22 0a 7d 20 7b 31 7d 0a 0a 74 65 73  _foo".} {1}..tes
6ed0: 74 20 64 6f 6d 2d 33 2e 31 32 20 7b 69 73 4e 43  t dom-3.12 {isNC
6ee0: 4e 61 6d 65 7d 20 7b 0a 20 20 20 20 64 6f 6d 20  Name} {.    dom 
6ef0: 69 73 4e 43 4e 61 6d 65 20 22 66 6f 6f 3a 62 61  isNCName "foo:ba
6f00: 72 3a 62 61 7a 22 0a 7d 20 7b 30 7d 0a 0a 74 65  r:baz".} {0}..te
6f10: 73 74 20 64 6f 6d 2d 33 2e 31 33 20 7b 69 73 4e  st dom-3.13 {isN
6f20: 43 4e 61 6d 65 7d 20 7b 0a 20 20 20 20 64 6f 6d  CName} {.    dom
6f30: 20 69 73 4e 43 4e 61 6d 65 20 22 2d 66 6f 6f 22   isNCName "-foo"
6f40: 0a 7d 20 7b 30 7d 0a 0a 74 65 73 74 20 64 6f 6d  .} {0}..test dom
6f50: 2d 33 2e 31 34 20 7b 69 73 4e 43 4e 61 6d 65 7d  -3.14 {isNCName}
6f60: 20 7b 0a 20 20 20 20 64 6f 6d 20 69 73 4e 43 4e   {.    dom isNCN
6f70: 61 6d 65 20 22 2e 66 6f 6f 22 0a 7d 20 7b 30 7d  ame ".foo".} {0}
6f80: 0a 0a 74 65 73 74 20 64 6f 6d 2d 33 2e 31 35 20  ..test dom-3.15 
6f90: 7b 69 73 4e 43 4e 61 6d 65 7d 20 7b 0a 20 20 20  {isNCName} {.   
6fa0: 20 63 61 74 63 68 20 7b 64 6f 6d 20 69 73 4e 43   catch {dom isNC
6fb0: 4e 61 6d 65 7d 0a 7d 20 7b 31 7d 0a 0a 74 65 73  Name}.} {1}..tes
6fc0: 74 20 64 6f 6d 2d 33 2e 31 36 20 7b 69 73 4e 43  t dom-3.16 {isNC
6fd0: 4e 61 6d 65 7d 20 7b 0a 20 20 20 20 63 61 74 63  Name} {.    catc
6fe0: 68 20 7b 64 6f 6d 20 69 73 4e 43 4e 61 6d 65 20  h {dom isNCName 
6ff0: 66 6f 6f 20 62 61 72 7d 0a 7d 20 7b 31 7d 0a 0a  foo bar}.} {1}..
7000: 0a 74 65 73 74 20 64 6f 6d 2d 33 2e 31 37 20 7b  .test dom-3.17 {
7010: 69 73 51 4e 61 6d 65 7d 20 7b 0a 20 20 20 20 64  isQName} {.    d
7020: 6f 6d 20 69 73 51 4e 61 6d 65 20 22 3a 66 6f 6f  om isQName ":foo
7030: 22 0a 7d 20 7b 30 7d 0a 0a 74 65 73 74 20 64 6f  ".} {0}..test do
7040: 6d 2d 33 2e 31 38 20 7b 69 73 51 4e 61 6d 65 7d  m-3.18 {isQName}
7050: 20 7b 0a 20 20 20 20 64 6f 6d 20 69 73 51 4e 61   {.    dom isQNa
7060: 6d 65 20 22 5f 66 6f 6f 22 0a 7d 20 7b 31 7d 0a  me "_foo".} {1}.
7070: 0a 74 65 73 74 20 64 6f 6d 2d 33 2e 31 39 20 7b  .test dom-3.19 {
7080: 69 73 51 4e 61 6d 65 7d 20 7b 0a 20 20 20 20 64  isQName} {.    d
7090: 6f 6d 20 69 73 51 4e 61 6d 65 20 22 66 6f 6f 3a  om isQName "foo:
70a0: 62 61 72 3a 62 61 7a 22 0a 7d 20 7b 30 7d 0a 0a  bar:baz".} {0}..
70b0: 74 65 73 74 20 64 6f 6d 2d 33 2e 32 30 20 7b 69  test dom-3.20 {i
70c0: 73 51 4e 61 6d 65 7d 20 7b 0a 20 20 20 20 64 6f  sQName} {.    do
70d0: 6d 20 69 73 51 4e 61 6d 65 20 22 2d 66 6f 6f 22  m isQName "-foo"
70e0: 0a 7d 20 7b 30 7d 0a 0a 74 65 73 74 20 64 6f 6d  .} {0}..test dom
70f0: 2d 33 2e 32 31 20 7b 69 73 51 4e 61 6d 65 7d 20  -3.21 {isQName} 
7100: 7b 0a 20 20 20 20 64 6f 6d 20 69 73 51 4e 61 6d  {.    dom isQNam
7110: 65 20 22 2e 66 6f 6f 22 0a 7d 20 7b 30 7d 0a 0a  e ".foo".} {0}..
7120: 74 65 73 74 20 64 6f 6d 2d 33 2e 32 32 20 7b 69  test dom-3.22 {i
7130: 73 51 4e 61 6d 65 7d 20 7b 0a 20 20 20 20 64 6f  sQName} {.    do
7140: 6d 20 69 73 51 4e 61 6d 65 20 22 66 6f 6f 3a 62  m isQName "foo:b
7150: 61 72 22 0a 7d 20 7b 31 7d 0a 0a 74 65 73 74 20  ar".} {1}..test 
7160: 64 6f 6d 2d 33 2e 32 33 20 7b 69 73 51 4e 61 6d  dom-3.23 {isQNam
7170: 65 7d 20 7b 0a 20 20 20 20 63 61 74 63 68 20 7b  e} {.    catch {
7180: 64 6f 6d 20 69 73 51 4e 61 6d 65 7d 0a 7d 20 7b  dom isQName}.} {
7190: 31 7d 0a 0a 74 65 73 74 20 64 6f 6d 2d 33 2e 32  1}..test dom-3.2
71a0: 34 20 7b 69 73 51 4e 61 6d 65 7d 20 7b 0a 20 20  4 {isQName} {.  
71b0: 20 20 63 61 74 63 68 20 7b 64 6f 6d 20 69 73 51    catch {dom isQ
71c0: 4e 61 6d 65 20 66 6f 6f 20 62 61 72 7d 0a 7d 20  Name foo bar}.} 
71d0: 7b 31 7d 0a 0a 74 65 73 74 20 64 6f 6d 2d 33 2e  {1}..test dom-3.
71e0: 32 35 20 7b 69 73 51 4e 61 6d 65 7d 20 7b 0a 20  25 {isQName} {. 
71f0: 20 20 20 64 6f 6d 20 69 73 51 4e 61 6d 65 20 22     dom isQName "
7200: 66 6f 6f 20 62 61 72 22 0a 7d 20 7b 30 7d 0a 20  foo bar".} {0}. 
7210: 20 20 20 0a 74 65 73 74 20 64 6f 6d 2d 33 2e 32     .test dom-3.2
7220: 36 20 7b 69 73 51 4e 61 6d 65 7d 20 7b 0a 20 20  6 {isQName} {.  
7230: 20 20 64 6f 6d 20 69 73 51 4e 61 6d 65 20 22 77    dom isQName "w
7240: 6f 6f 7a 62 69 7a 3a 22 0a 7d 20 7b 30 7d 0a 0a  oozbiz:".} {0}..
7250: 74 65 73 74 20 64 6f 6d 2d 33 2e 32 36 2e 31 20  test dom-3.26.1 
7260: 7b 69 73 51 4e 61 6d 65 7d 20 7b 0a 20 20 20 20  {isQName} {.    
7270: 20 64 6f 6d 20 69 73 51 4e 61 6d 65 20 66 6f 6f   dom isQName foo
7280: 3a 31 0a 7d 20 7b 30 7d 0a 0a 74 65 73 74 20 64  :1.} {0}..test d
7290: 6f 6d 2d 33 2e 32 36 2e 32 20 7b 69 73 51 4e 61  om-3.26.2 {isQNa
72a0: 6d 65 7d 20 7b 0a 20 20 20 20 20 64 6f 6d 20 69  me} {.     dom i
72b0: 73 51 4e 61 6d 65 20 31 3a 66 6f 6f 0a 7d 20 7b  sQName 1:foo.} {
72c0: 30 7d 0a 0a 73 65 74 20 58 4d 4c 43 68 61 72 73  0}..set XMLChars
72d0: 20 7b 0a 20 20 20 20 30 78 39 20 30 78 41 20 30   {.    0x9 0xA 0
72e0: 78 44 20 7b 30 78 32 30 20 30 78 44 37 46 46 7d  xD {0x20 0xD7FF}
72f0: 20 7b 30 78 45 30 30 30 20 30 78 46 46 46 44 7d   {0xE000 0xFFFD}
7300: 20 7b 30 78 31 30 30 30 30 20 30 78 31 30 46 46   {0x10000 0x10FF
7310: 46 46 7d 0a 7d 0a 0a 74 65 73 74 20 64 6f 6d 2d  FF}.}..test dom-
7320: 33 2e 32 37 20 7b 69 73 43 68 61 72 44 61 74 61  3.27 {isCharData
7330: 7d 20 7b 6c 6f 6e 67 52 75 6e 6e 69 6e 67 7d 20  } {longRunning} 
7340: 7b 0a 20 20 20 20 73 65 74 20 69 6e 64 20 30 0a  {.    set ind 0.
7350: 20 20 20 20 73 65 74 20 6e 72 20 31 0a 20 20 20      set nr 1.   
7360: 20 77 68 69 6c 65 20 7b 24 6e 72 20 3c 20 36 35   while {$nr < 65
7370: 35 33 36 7d 20 7b 0a 20 20 20 20 20 20 20 20 73  536} {.        s
7380: 65 74 20 72 61 6e 67 65 20 5b 6c 69 6e 64 65 78  et range [lindex
7390: 20 24 58 4d 4c 43 68 61 72 73 20 24 69 6e 64 5d   $XMLChars $ind]
73a0: 0a 20 20 20 20 20 20 20 20 69 6e 63 72 20 69 6e  .        incr in
73b0: 64 0a 20 20 20 20 20 20 20 20 69 66 20 7b 5b 6c  d.        if {[l
73c0: 6c 65 6e 67 74 68 20 24 72 61 6e 67 65 5d 20 3d  length $range] =
73d0: 3d 20 32 7d 20 7b 0a 20 20 20 20 20 20 20 20 20  = 2} {.         
73e0: 20 20 20 66 6f 72 65 61 63 68 20 7b 6d 69 6e 20     foreach {min 
73f0: 6d 61 78 7d 20 24 72 61 6e 67 65 20 62 72 65 61  max} $range brea
7400: 6b 0a 20 20 20 20 20 20 20 20 7d 20 65 6c 73 65  k.        } else
7410: 20 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 73   {.            s
7420: 65 74 20 6d 69 6e 20 24 72 61 6e 67 65 0a 20 20  et min $range.  
7430: 20 20 20 20 20 20 20 20 20 20 73 65 74 20 6d 61            set ma
7440: 78 20 24 72 61 6e 67 65 0a 20 20 20 20 20 20 20  x $range.       
7450: 20 7d 0a 20 20 20 20 20 20 20 20 77 68 69 6c 65   }.        while
7460: 20 7b 24 6e 72 20 3c 20 24 6d 69 6e 7d 20 7b 0a   {$nr < $min} {.
7470: 20 20 20 20 20 20 20 20 20 20 20 20 69 66 20 7b              if {
7480: 5b 64 6f 6d 20 69 73 43 68 61 72 44 61 74 61 20  [dom isCharData 
7490: 22 61 5b 73 75 62 73 74 20 5c 5c 75 5b 66 6f 72  "a[subst \\u[for
74a0: 6d 61 74 20 22 25 30 34 78 22 20 24 6e 72 5d 5d  mat "%04x" $nr]]
74b0: 62 22 5d 20 21 3d 20 30 7d 20 7b 0a 20 20 20 20  b"] != 0} {.    
74c0: 20 20 20 20 20 20 20 20 20 20 20 20 65 72 72 6f              erro
74d0: 72 20 22 77 72 6f 6e 67 20 27 69 73 43 68 61 72  r "wrong 'isChar
74e0: 44 61 74 61 27 20 72 65 73 75 6c 74 20 66 6f 72  Data' result for
74f0: 20 63 68 61 72 20 23 78 5b 66 6f 72 6d 61 74 20   char #x[format 
7500: 22 25 30 34 78 22 20 24 6e 72 5d 20 2d 20 73 68  "%04x" $nr] - sh
7510: 6f 75 6c 64 20 62 65 20 69 6c 6c 65 67 61 6c 22  ould be illegal"
7520: 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20  .            }. 
7530: 20 20 20 20 20 20 20 20 20 20 20 69 6e 63 72 20             incr 
7540: 6e 72 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  nr.        }.   
7550: 20 20 20 20 20 69 66 20 7b 24 6e 72 20 3d 3d 20       if {$nr == 
7560: 30 78 31 30 30 30 30 7d 20 7b 62 72 65 61 6b 7d  0x10000} {break}
7570: 0a 20 20 20 20 20 20 20 20 77 68 69 6c 65 20 7b  .        while {
7580: 24 6e 72 20 3c 3d 20 24 6d 61 78 7d 20 7b 0a 20  $nr <= $max} {. 
7590: 20 20 20 20 20 20 20 20 20 20 20 69 66 20 7b 5b             if {[
75a0: 64 6f 6d 20 69 73 43 68 61 72 44 61 74 61 20 22  dom isCharData "
75b0: 61 5b 73 75 62 73 74 20 5c 5c 75 5b 66 6f 72 6d  a[subst \\u[form
75c0: 61 74 20 22 25 30 34 78 22 20 24 6e 72 5d 5d 62  at "%04x" $nr]]b
75d0: 22 5d 20 21 3d 20 31 7d 20 7b 0a 20 20 20 20 20  "] != 1} {.     
75e0: 20 20 20 20 20 20 20 20 20 20 20 65 72 72 6f 72             error
75f0: 20 22 77 72 6f 6e 67 20 27 69 73 43 68 61 72 44   "wrong 'isCharD
7600: 61 74 61 27 20 72 65 73 75 6c 74 20 66 6f 72 20  ata' result for 
7610: 63 68 61 72 20 23 78 5b 66 6f 72 6d 61 74 20 22  char #x[format "
7620: 25 30 34 78 22 20 24 6e 72 5d 20 2d 20 73 68 6f  %04x" $nr] - sho
7630: 75 6c 64 20 62 65 20 6c 65 67 61 6c 22 0a 20 20  uld be legal".  
7640: 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
7650: 20 20 20 20 20 20 20 20 69 6e 63 72 20 6e 72 0a          incr nr.
7660: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a          }.    }.
7670: 20 20 20 20 73 65 74 20 6e 72 0a 7d 20 7b 36 35      set nr.} {65
7680: 35 33 36 7d 0a 0a 0a 74 65 73 74 20 64 6f 6d 2d  536}...test dom-
7690: 33 2e 32 38 20 7b 69 73 50 49 4e 61 6d 65 7d 20  3.28 {isPIName} 
76a0: 7b 0a 20 20 20 20 64 6f 6d 20 69 73 50 49 4e 61  {.    dom isPINa
76b0: 6d 65 20 22 74 61 72 67 65 74 22 0a 7d 20 7b 31  me "target".} {1
76c0: 7d 0a 0a 74 65 73 74 20 64 6f 6d 2d 33 2e 32 39  }..test dom-3.29
76d0: 20 7b 69 73 50 49 4e 61 6d 65 7d 20 7b 0a 20 20   {isPIName} {.  
76e0: 20 20 64 6f 6d 20 69 73 50 49 4e 61 6d 65 20 22    dom isPIName "
76f0: 66 6f 6f 3a 74 61 72 67 65 74 22 0a 7d 20 7b 31  foo:target".} {1
7700: 7d 0a 0a 74 65 73 74 20 64 6f 6d 2d 33 2e 33 30  }..test dom-3.30
7710: 20 7b 69 73 50 49 4e 61 6d 65 7d 20 7b 0a 20 20   {isPIName} {.  
7720: 20 20 64 6f 6d 20 69 73 50 49 4e 61 6d 65 20 22    dom isPIName "
7730: 58 6d 6c 22 0a 7d 20 7b 30 7d 0a 0a 74 65 73 74  Xml".} {0}..test
7740: 20 64 6f 6d 2d 33 2e 33 31 20 7b 69 73 43 6f 6d   dom-3.31 {isCom
7750: 6d 65 6e 74 7d 20 7b 0a 20 20 20 20 64 6f 6d 20  ment} {.    dom 
7760: 69 73 43 6f 6d 6d 65 6e 74 20 22 73 6f 6d 65 20  isComment "some 
7770: 63 6f 6d 6d 65 6e 74 22 0a 7d 20 7b 31 7d 0a 0a  comment".} {1}..
7780: 74 65 73 74 20 64 6f 6d 2d 33 2e 33 32 20 7b 69  test dom-3.32 {i
7790: 73 43 6f 6d 6d 65 6e 74 7d 20 7b 0a 20 20 20 20  sComment} {.    
77a0: 64 6f 6d 20 69 73 43 6f 6d 6d 65 6e 74 20 22 73  dom isComment "s
77b0: 6f 6d 65 20 69 6e 76 61 6c 69 64 20 2d 2d 20 63  ome invalid -- c
77c0: 6f 6d 6d 65 6e 74 22 0a 7d 20 7b 30 7d 0a 0a 74  omment".} {0}..t
77d0: 65 73 74 20 64 6f 6d 2d 33 2e 33 33 20 7b 69 73  est dom-3.33 {is
77e0: 43 6f 6d 6d 65 6e 74 7d 20 7b 0a 20 20 20 20 64  Comment} {.    d
77f0: 6f 6d 20 69 73 43 6f 6d 6d 65 6e 74 20 22 73 6f  om isComment "so
7800: 6d 65 20 69 6e 76 61 6c 69 64 20 63 6f 6d 6d 65  me invalid comme
7810: 6e 74 2d 22 0a 7d 20 7b 30 7d 0a 0a 74 65 73 74  nt-".} {0}..test
7820: 20 64 6f 6d 2d 33 2e 33 34 20 7b 69 73 43 44 41   dom-3.34 {isCDA
7830: 54 41 7d 20 7b 0a 20 20 20 20 64 6f 6d 20 69 73  TA} {.    dom is
7840: 43 44 41 54 41 20 22 3c 76 61 6c 69 64 3e 73 6f  CDATA "<valid>so
7850: 6d 65 20 5d 5d 20 43 44 41 54 41 20 3c 2f 76 61  me ]] CDATA </va
7860: 6c 69 64 3e 22 0a 7d 20 7b 31 7d 0a 0a 74 65 73  lid>".} {1}..tes
7870: 74 20 64 6f 6d 2d 33 2e 33 35 20 7b 69 73 43 44  t dom-3.35 {isCD
7880: 41 54 41 7d 20 7b 0a 20 20 20 20 64 6f 6d 20 69  ATA} {.    dom i
7890: 73 43 44 41 54 41 20 22 3c 69 6e 76 61 6c 69 64  sCDATA "<invalid
78a0: 3e 73 6f 6d 65 20 5d 5d 3e 20 43 44 41 54 41 20  >some ]]> CDATA 
78b0: 3c 2f 69 6e 76 61 6c 69 64 3e 22 0a 7d 20 7b 30  </invalid>".} {0
78c0: 7d 0a 0a 74 65 73 74 20 64 6f 6d 2d 33 2e 33 36  }..test dom-3.36
78d0: 20 7b 69 73 43 44 41 54 41 7d 20 7b 0a 20 20 20   {isCDATA} {.   
78e0: 20 64 6f 6d 20 69 73 43 44 41 54 41 20 22 69 6e   dom isCDATA "in
78f0: 76 61 6c 69 64 3a 20 5d 5d 3e 22 0a 7d 20 7b 30  valid: ]]>".} {0
7900: 7d 0a 0a 74 65 73 74 20 64 6f 6d 2d 33 2e 33 37  }..test dom-3.37
7910: 20 7b 69 73 43 44 41 54 41 7d 20 7b 0a 20 20 20   {isCDATA} {.   
7920: 20 64 6f 6d 20 69 73 43 44 41 54 41 20 22 76 61   dom isCDATA "va
7930: 6c 69 64 3a 20 5d 5d 3e 20 22 0a 7d 20 7b 30 7d  lid: ]]> ".} {0}
7940: 0a 0a 74 65 73 74 20 64 6f 6d 2d 33 2e 33 38 20  ..test dom-3.38 
7950: 7b 69 73 43 44 41 54 41 7d 20 7b 0a 20 20 20 20  {isCDATA} {.    
7960: 64 6f 6d 20 69 73 43 44 41 54 41 20 22 5c 75 64  dom isCDATA "\ud
7970: 37 66 61 5c 75 64 37 66 62 5c 75 64 37 66 63 5c  7fa\ud7fb\ud7fc\
7980: 75 64 37 66 64 5c 75 64 37 66 65 5c 75 64 37 66  ud7fd\ud7fe\ud7f
7990: 66 5d 5d 3e 22 0a 7d 20 7b 30 7d 0a 0a 74 65 73  f]]>".} {0}..tes
79a0: 74 20 64 6f 6d 2d 33 2e 33 39 20 7b 69 73 50 49  t dom-3.39 {isPI
79b0: 56 61 6c 75 65 7d 20 7b 0a 20 20 20 20 64 6f 6d  Value} {.    dom
79c0: 20 69 73 50 49 56 61 6c 75 65 20 22 73 6f 6d 65   isPIValue "some
79d0: 20 70 72 6f 63 65 73 73 69 6e 67 20 69 6e 73 74   processing inst
79e0: 72 75 63 74 69 6f 6e 20 64 61 74 61 22 0a 7d 20  ruction data".} 
79f0: 7b 31 7d 0a 0a 74 65 73 74 20 64 6f 6d 2d 33 2e  {1}..test dom-3.
7a00: 34 30 20 7b 69 73 50 49 56 61 6c 75 65 7d 20 7b  40 {isPIValue} {
7a10: 0a 20 20 20 20 64 6f 6d 20 69 73 50 49 56 61 6c  .    dom isPIVal
7a20: 75 65 20 22 73 6f 6d 65 20 69 6e 76 61 6c 69 64  ue "some invalid
7a30: 20 3f 3e 20 70 72 6f 63 65 73 73 69 6e 67 20 69   ?> processing i
7a40: 6e 73 74 72 75 63 74 69 6f 6e 20 64 61 74 61 22  nstruction data"
7a50: 0a 7d 20 7b 30 7d 0a 0a 74 65 73 74 20 64 6f 6d  .} {0}..test dom
7a60: 2d 33 2e 34 31 20 7b 69 73 50 49 56 61 6c 75 65  -3.41 {isPIValue
7a70: 7d 20 7b 0a 20 20 20 20 64 6f 6d 20 69 73 50 49  } {.    dom isPI
7a80: 56 61 6c 75 65 20 22 73 6f 6d 65 20 69 6e 76 61  Value "some inva
7a90: 6c 69 64 20 70 72 6f 63 65 73 73 69 6e 67 20 69  lid processing i
7aa0: 6e 73 74 72 75 63 74 69 6f 6e 20 64 61 74 61 3f  nstruction data?
7ab0: 3e 22 0a 7d 20 7b 30 7d 0a 0a 0a 74 65 73 74 20  >".} {0}...test 
7ac0: 64 6f 6d 2d 34 2e 31 20 7b 2d 75 73 65 46 6f 72  dom-4.1 {-useFor
7ad0: 65 69 67 6e 44 54 44 20 30 7d 20 7b 0a 20 20 20  eignDTD 0} {.   
7ae0: 20 73 65 74 20 64 6f 63 20 5b 64 6f 6d 20 70 61   set doc [dom pa
7af0: 72 73 65 20 2d 75 73 65 46 6f 72 65 69 67 6e 44  rse -useForeignD
7b00: 54 44 20 30 20 7b 3c 72 6f 6f 74 2f 3e 7d 5d 0a  TD 0 {<root/>}].
7b10: 20 20 20 20 24 64 6f 63 20 64 65 6c 65 74 65 0a      $doc delete.
7b20: 7d 20 7b 7d 0a 0a 74 65 73 74 20 64 6f 6d 2d 34  } {}..test dom-4
7b30: 2e 32 20 7b 2d 75 73 65 46 6f 72 65 69 67 6e 44  .2 {-useForeignD
7b40: 54 44 20 31 20 77 69 74 68 20 64 6f 63 75 6d 65  TD 1 with docume
7b50: 6e 74 20 77 69 74 68 20 69 6e 74 65 72 6e 61 6c  nt with internal
7b60: 20 73 75 62 73 65 74 7d 20 7b 6e 65 65 64 5f 75   subset} {need_u
7b70: 72 69 7d 20 7b 0a 20 20 20 20 73 65 74 20 62 61  ri} {.    set ba
7b80: 73 65 55 52 49 20 5b 74 64 6f 6d 3a 3a 62 61 73  seURI [tdom::bas
7b90: 65 55 52 4c 20 5b 66 69 6c 65 20 6a 6f 69 6e 20  eURL [file join 
7ba0: 5b 70 77 64 5d 20 5b 66 69 6c 65 20 64 69 72 20  [pwd] [file dir 
7bb0: 5b 69 6e 66 6f 20 73 63 72 69 70 74 5d 5d 20 64  [info script]] d
7bc0: 6f 6d 2e 74 65 73 74 5d 5d 0a 20 20 20 20 73 65  om.test]].    se
7bd0: 74 20 3a 3a 74 64 6f 6d 3a 3a 75 73 65 46 6f 72  t ::tdom::useFor
7be0: 65 69 67 6e 44 54 44 20 22 64 61 74 61 2f 64 6f  eignDTD "data/do
7bf0: 6d 43 6d 64 31 2e 64 74 64 22 0a 20 20 20 20 73  mCmd1.dtd".    s
7c00: 65 74 20 64 6f 63 20 5b 64 6f 6d 20 70 61 72 73  et doc [dom pars
7c10: 65 20 5c 0a 20 20 20 20 20 20 20 20 20 20 20 20  e \.            
7c20: 2d 75 73 65 46 6f 72 65 69 67 6e 44 54 44 20 31  -useForeignDTD 1
7c30: 20 5c 0a 20 20 20 20 20 20 20 20 20 20 20 20 2d   \.            -
7c40: 62 61 73 65 75 72 6c 20 24 62 61 73 65 55 52 49  baseurl $baseURI
7c50: 20 5c 0a 20 20 20 20 20 20 20 20 20 20 20 20 2d   \.            -
7c60: 65 78 74 65 72 6e 61 6c 65 6e 74 69 74 79 63 6f  externalentityco
7c70: 6d 6d 61 6e 64 20 3a 3a 74 64 6f 6d 3a 3a 65 78  mmand ::tdom::ex
7c80: 74 52 65 66 48 61 6e 64 6c 65 72 20 7b 0a 3c 21  tRefHandler {.<!
7c90: 44 4f 43 54 59 50 45 20 72 6f 6f 74 20 5b 0a 20  DOCTYPE root [. 
7ca0: 20 20 20 3c 21 41 54 54 4c 49 53 54 20 72 6f 6f     <!ATTLIST roo
7cb0: 74 20 66 69 78 65 64 20 43 44 41 54 41 20 23 46  t fixed CDATA #F
7cc0: 49 58 45 44 20 22 74 6f 54 68 61 74 22 3e 0a 5d  IXED "toThat">.]
7cd0: 3e 0a 3c 72 6f 6f 74 2f 3e 7d 5d 0a 20 20 20 20  >.<root/>}].    
7ce0: 73 65 74 20 72 6f 6f 74 20 5b 24 64 6f 63 20 64  set root [$doc d
7cf0: 6f 63 75 6d 65 6e 74 45 6c 65 6d 65 6e 74 5d 0a  ocumentElement].
7d00: 20 20 20 20 73 65 74 20 72 65 73 75 6c 74 20 5b      set result [
7d10: 24 72 6f 6f 74 20 40 66 69 78 65 64 5d 0a 20 20  $root @fixed].  
7d20: 20 20 24 64 6f 63 20 64 65 6c 65 74 65 0a 20 20    $doc delete.  
7d30: 20 20 73 65 74 20 72 65 73 75 6c 74 0a 7d 20 7b    set result.} {
7d40: 74 6f 54 68 61 74 7d 0a 0a 74 65 73 74 20 64 6f  toThat}..test do
7d50: 6d 2d 34 2e 33 20 7b 2d 75 73 65 46 6f 72 65 69  m-4.3 {-useForei
7d60: 67 6e 44 54 44 20 31 20 77 69 74 68 20 64 6f 63  gnDTD 1 with doc
7d70: 75 6d 65 6e 74 20 77 69 74 68 20 69 6e 74 65 72  ument with inter
7d80: 6e 61 6c 20 73 75 62 73 65 74 7d 20 7b 6e 65 65  nal subset} {nee
7d90: 64 5f 75 72 69 7d 20 7b 0a 20 20 20 20 73 65 74  d_uri} {.    set
7da0: 20 62 61 73 65 55 52 49 20 5b 74 64 6f 6d 3a 3a   baseURI [tdom::
7db0: 62 61 73 65 55 52 4c 20 5b 66 69 6c 65 20 6a 6f  baseURL [file jo
7dc0: 69 6e 20 5b 70 77 64 5d 20 5b 66 69 6c 65 20 64  in [pwd] [file d
7dd0: 69 72 20 5b 69 6e 66 6f 20 73 63 72 69 70 74 5d  ir [info script]
7de0: 5d 20 64 6f 6d 2e 74 65 73 74 5d 5d 0a 20 20 20  ] dom.test]].   
7df0: 20 73 65 74 20 3a 3a 74 64 6f 6d 3a 3a 75 73 65   set ::tdom::use
7e00: 46 6f 72 65 69 67 6e 44 54 44 20 22 64 61 74 61  ForeignDTD "data
7e10: 2f 64 6f 6d 43 6d 64 31 2e 64 74 64 22 0a 20 20  /domCmd1.dtd".  
7e20: 20 20 73 65 74 20 64 6f 63 20 5b 64 6f 6d 20 70    set doc [dom p
7e30: 61 72 73 65 20 5c 0a 20 20 20 20 20 20 20 20 20  arse \.         
7e40: 20 20 20 2d 75 73 65 46 6f 72 65 69 67 6e 44 54     -useForeignDT
7e50: 44 20 31 20 5c 0a 20 20 20 20 20 20 20 20 20 20  D 1 \.          
7e60: 20 20 2d 62 61 73 65 75 72 6c 20 24 62 61 73 65    -baseurl $base
7e70: 55 52 49 20 5c 0a 20 20 20 20 20 20 20 20 20 20  URI \.          
7e80: 20 20 2d 65 78 74 65 72 6e 61 6c 65 6e 74 69 74    -externalentit
7e90: 79 63 6f 6d 6d 61 6e 64 20 3a 3a 74 64 6f 6d 3a  ycommand ::tdom:
7ea0: 3a 65 78 74 52 65 66 48 61 6e 64 6c 65 72 20 7b  :extRefHandler {
7eb0: 0a 3c 21 44 4f 43 54 59 50 45 20 72 6f 6f 74 20  .<!DOCTYPE root 
7ec0: 5b 0a 20 20 20 20 3c 21 41 54 54 4c 49 53 54 20  [.    <!ATTLIST 
7ed0: 72 6f 6f 74 20 66 69 78 65 64 32 20 43 44 41 54  root fixed2 CDAT
7ee0: 41 20 23 46 49 58 45 44 20 22 74 6f 54 68 61 74  A #FIXED "toThat
7ef0: 22 3e 0a 5d 3e 0a 3c 72 6f 6f 74 2f 3e 7d 5d 0a  ">.]>.<root/>}].
7f00: 20 20 20 20 73 65 74 20 72 6f 6f 74 20 5b 24 64      set root [$d
7f10: 6f 63 20 64 6f 63 75 6d 65 6e 74 45 6c 65 6d 65  oc documentEleme
7f20: 6e 74 5d 0a 20 20 20 20 73 65 74 20 72 65 73 75  nt].    set resu
7f30: 6c 74 20 5b 24 72 6f 6f 74 20 40 66 69 78 65 64  lt [$root @fixed
7f40: 5d 0a 20 20 20 20 6c 61 70 70 65 6e 64 20 72 65  ].    lappend re
7f50: 73 75 6c 74 20 5b 24 72 6f 6f 74 20 40 66 69 78  sult [$root @fix
7f60: 65 64 32 5d 0a 20 20 20 20 24 64 6f 63 20 64 65  ed2].    $doc de
7f70: 6c 65 74 65 0a 20 20 20 20 73 65 74 20 72 65 73  lete.    set res
7f80: 75 6c 74 0a 7d 20 7b 74 6f 54 68 69 73 20 74 6f  ult.} {toThis to
7f90: 54 68 61 74 7d 0a 0a 74 65 73 74 20 64 6f 6d 2d  That}..test dom-
7fa0: 34 2e 34 20 7b 2d 75 73 65 46 6f 72 65 69 67 6e  4.4 {-useForeign
7fb0: 44 54 44 20 31 20 77 69 74 68 20 64 6f 63 75 6d  DTD 1 with docum
7fc0: 65 6e 74 20 77 69 74 68 6f 75 74 20 64 6f 63 75  ent without docu
7fd0: 6d 65 6e 74 20 64 65 63 6c 61 72 61 74 69 6f 6e  ment declaration
7fe0: 7d 20 7b 6e 65 65 64 5f 75 72 69 7d 20 7b 0a 20  } {need_uri} {. 
7ff0: 20 20 20 73 65 74 20 62 61 73 65 55 52 49 20 5b     set baseURI [
8000: 74 64 6f 6d 3a 3a 62 61 73 65 55 52 4c 20 5b 66  tdom::baseURL [f
8010: 69 6c 65 20 6a 6f 69 6e 20 5b 70 77 64 5d 20 5b  ile join [pwd] [
8020: 66 69 6c 65 20 64 69 72 20 5b 69 6e 66 6f 20 73  file dir [info s
8030: 63 72 69 70 74 5d 5d 20 64 6f 6d 2e 74 65 73 74  cript]] dom.test
8040: 5d 5d 0a 20 20 20 20 73 65 74 20 3a 3a 74 64 6f  ]].    set ::tdo
8050: 6d 3a 3a 75 73 65 46 6f 72 65 69 67 6e 44 54 44  m::useForeignDTD
8060: 20 22 64 61 74 61 2f 64 6f 6d 43 6d 64 31 2e 64   "data/domCmd1.d
8070: 74 64 22 0a 20 20 20 20 73 65 74 20 64 6f 63 20  td".    set doc 
8080: 5b 64 6f 6d 20 70 61 72 73 65 20 5c 0a 20 20 20  [dom parse \.   
8090: 20 20 20 20 20 20 20 20 20 2d 75 73 65 46 6f 72           -useFor
80a0: 65 69 67 6e 44 54 44 20 31 20 5c 0a 20 20 20 20  eignDTD 1 \.    
80b0: 20 20 20 20 20 20 20 20 2d 62 61 73 65 75 72 6c          -baseurl
80c0: 20 24 62 61 73 65 55 52 49 20 5c 0a 20 20 20 20   $baseURI \.    
80d0: 20 20 20 20 20 20 20 20 2d 65 78 74 65 72 6e 61          -externa
80e0: 6c 65 6e 74 69 74 79 63 6f 6d 6d 61 6e 64 20 3a  lentitycommand :
80f0: 3a 74 64 6f 6d 3a 3a 65 78 74 52 65 66 48 61 6e  :tdom::extRefHan
8100: 64 6c 65 72 20 3c 72 6f 6f 74 2f 3e 5d 0a 20 20  dler <root/>].  
8110: 20 20 73 65 74 20 72 6f 6f 74 20 5b 24 64 6f 63    set root [$doc
8120: 20 64 6f 63 75 6d 65 6e 74 45 6c 65 6d 65 6e 74   documentElement
8130: 5d 0a 20 20 20 20 73 65 74 20 72 65 73 75 6c 74  ].    set result
8140: 20 5b 24 72 6f 6f 74 20 40 66 69 78 65 64 5d 0a   [$root @fixed].
8150: 20 20 20 20 24 64 6f 63 20 64 65 6c 65 74 65 0a      $doc delete.
8160: 20 20 20 20 73 65 74 20 72 65 73 75 6c 74 0a 7d      set result.}
8170: 20 7b 74 6f 54 68 69 73 7d 0a 0a 74 65 73 74 20   {toThis}..test 
8180: 64 6f 6d 2d 34 2e 35 20 7b 2d 75 73 65 46 6f 72  dom-4.5 {-useFor
8190: 65 69 67 6e 44 54 44 20 31 20 64 6f 65 73 20 6e  eignDTD 1 does n
81a0: 6f 74 20 6f 76 65 72 77 72 69 74 65 20 61 20 67  ot overwrite a g
81b0: 69 76 65 6e 20 65 78 74 65 72 6e 61 6c 20 73 75  iven external su
81c0: 62 73 65 74 7d 20 7b 6e 65 65 64 5f 75 72 69 7d  bset} {need_uri}
81d0: 20 7b 0a 20 20 20 20 73 65 74 20 62 61 73 65 55   {.    set baseU
81e0: 52 49 20 5b 74 64 6f 6d 3a 3a 62 61 73 65 55 52  RI [tdom::baseUR
81f0: 4c 20 5b 66 69 6c 65 20 6a 6f 69 6e 20 5b 70 77  L [file join [pw
8200: 64 5d 20 5b 66 69 6c 65 20 64 69 72 20 5b 69 6e  d] [file dir [in
8210: 66 6f 20 73 63 72 69 70 74 5d 5d 20 64 6f 6d 2e  fo script]] dom.
8220: 74 65 73 74 5d 5d 0a 20 20 20 20 73 65 74 20 3a  test]].    set :
8230: 3a 74 64 6f 6d 3a 3a 75 73 65 46 6f 72 65 69 67  :tdom::useForeig
8240: 6e 44 54 44 20 22 64 61 74 61 2f 64 6f 6d 43 6d  nDTD "data/domCm
8250: 64 31 2e 64 74 64 22 0a 20 20 20 20 73 65 74 20  d1.dtd".    set 
8260: 64 6f 63 20 5b 64 6f 6d 20 70 61 72 73 65 20 5c  doc [dom parse \
8270: 0a 20 20 20 20 20 20 20 20 20 20 20 20 2d 75 73  .            -us
8280: 65 46 6f 72 65 69 67 6e 44 54 44 20 31 20 5c 0a  eForeignDTD 1 \.
8290: 20 20 20 20 20 20 20 20 20 20 20 20 2d 62 61 73              -bas
82a0: 65 75 72 6c 20 24 62 61 73 65 55 52 49 20 5c 0a  eurl $baseURI \.
82b0: 20 20 20 20 20 20 20 20 20 20 20 20 2d 65 78 74              -ext
82c0: 65 72 6e 61 6c 65 6e 74 69 74 79 63 6f 6d 6d 61  ernalentitycomma
82d0: 6e 64 20 3a 3a 74 64 6f 6d 3a 3a 65 78 74 52 65  nd ::tdom::extRe
82e0: 66 48 61 6e 64 6c 65 72 20 7b 0a 3c 21 44 4f 43  fHandler {.<!DOC
82f0: 54 59 50 45 20 72 6f 6f 74 20 53 59 53 54 45 4d  TYPE root SYSTEM
8300: 20 22 64 61 74 61 2f 64 6f 6d 43 6d 64 32 2e 64   "data/domCmd2.d
8310: 74 64 22 3e 0a 3c 72 6f 6f 74 2f 3e 7d 5d 0a 20  td">.<root/>}]. 
8320: 20 20 20 73 65 74 20 72 6f 6f 74 20 5b 24 64 6f     set root [$do
8330: 63 20 64 6f 63 75 6d 65 6e 74 45 6c 65 6d 65 6e  c documentElemen
8340: 74 5d 0a 20 20 20 20 73 65 74 20 72 65 73 75 6c  t].    set resul
8350: 74 20 5b 24 72 6f 6f 74 20 40 66 69 78 65 64 5d  t [$root @fixed]
8360: 0a 20 20 20 20 24 64 6f 63 20 64 65 6c 65 74 65  .    $doc delete
8370: 0a 20 20 20 20 73 65 74 20 72 65 73 75 6c 74 0a  .    set result.
8380: 7d 20 7b 74 6f 54 68 61 74 7d 0a 0a 74 65 73 74  } {toThat}..test
8390: 20 64 6f 6d 2d 34 2e 36 20 7b 2d 75 73 65 46 6f   dom-4.6 {-useFo
83a0: 72 65 69 67 6e 44 54 44 20 77 69 74 68 20 6e 6f  reignDTD with no
83b0: 6e 62 6f 6f 6c 65 61 6e 20 61 72 67 7d 20 7b 6e  nboolean arg} {n
83c0: 65 65 64 5f 75 72 69 7d 20 7b 0a 20 20 20 20 73  eed_uri} {.    s
83d0: 65 74 20 72 65 73 75 6c 74 20 5b 63 61 74 63 68  et result [catch
83e0: 20 7b 73 65 74 20 64 6f 63 20 5b 64 6f 6d 20 70   {set doc [dom p
83f0: 61 72 73 65 20 2d 75 73 65 46 6f 72 65 69 67 6e  arse -useForeign
8400: 44 54 44 20 66 6f 6f 20 3c 72 6f 6f 74 2f 3e 5d  DTD foo <root/>]
8410: 7d 20 65 72 72 4d 73 67 5d 0a 20 20 20 20 6c 61  } errMsg].    la
8420: 70 70 65 6e 64 20 72 65 73 75 6c 74 20 24 65 72  ppend result $er
8430: 72 4d 73 67 0a 7d 20 7b 31 20 7b 65 78 70 65 63  rMsg.} {1 {expec
8440: 74 65 64 20 62 6f 6f 6c 65 61 6e 20 76 61 6c 75  ted boolean valu
8450: 65 20 62 75 74 20 67 6f 74 20 22 66 6f 6f 22 7d  e but got "foo"}
8460: 7d 0a 0a 74 65 73 74 20 64 6f 6d 2d 35 2e 31 20  }..test dom-5.1 
8470: 7b 64 6f 63 75 6d 65 6e 74 20 77 69 74 68 20 65  {document with e
8480: 78 74 65 72 6e 61 6c 20 73 75 62 73 65 74 7d 20  xternal subset} 
8490: 7b 6e 65 65 64 5f 75 72 69 7d 20 7b 0a 20 20 20  {need_uri} {.   
84a0: 20 73 65 74 20 62 61 73 65 55 52 49 20 5b 74 64   set baseURI [td
84b0: 6f 6d 3a 3a 62 61 73 65 55 52 4c 20 5b 66 69 6c  om::baseURL [fil
84c0: 65 20 6a 6f 69 6e 20 5b 70 77 64 5d 20 5b 66 69  e join [pwd] [fi
84d0: 6c 65 20 64 69 72 20 5b 69 6e 66 6f 20 73 63 72  le dir [info scr
84e0: 69 70 74 5d 5d 20 64 6f 6d 2e 74 65 73 74 5d 5d  ipt]] dom.test]]
84f0: 0a 20 20 20 20 73 65 74 20 64 6f 63 20 5b 64 6f  .    set doc [do
8500: 6d 20 70 61 72 73 65 20 5c 0a 20 20 20 20 20 20  m parse \.      
8510: 20 20 20 20 20 20 2d 62 61 73 65 75 72 6c 20 24        -baseurl $
8520: 62 61 73 65 55 52 49 20 5c 0a 20 20 20 20 20 20  baseURI \.      
8530: 20 20 20 20 20 20 2d 65 78 74 65 72 6e 61 6c 65        -externale
8540: 6e 74 69 74 79 63 6f 6d 6d 61 6e 64 20 3a 3a 74  ntitycommand ::t
8550: 64 6f 6d 3a 3a 65 78 74 52 65 66 48 61 6e 64 6c  dom::extRefHandl
8560: 65 72 20 7b 0a 3c 21 44 4f 43 54 59 50 45 20 72  er {.<!DOCTYPE r
8570: 6f 6f 74 20 53 59 53 54 45 4d 20 22 64 61 74 61  oot SYSTEM "data
8580: 2f 64 6f 6d 43 6d 64 32 2e 64 74 64 22 3e 0a 3c  /domCmd2.dtd">.<
8590: 72 6f 6f 74 2f 3e 7d 5d 0a 20 20 20 20 73 65 74  root/>}].    set
85a0: 20 72 6f 6f 74 20 5b 24 64 6f 63 20 64 6f 63 75   root [$doc docu
85b0: 6d 65 6e 74 45 6c 65 6d 65 6e 74 5d 0a 20 20 20  mentElement].   
85c0: 20 73 65 74 20 72 65 73 75 6c 74 20 5b 24 72 6f   set result [$ro
85d0: 6f 74 20 40 66 69 78 65 64 5d 0a 20 20 20 20 24  ot @fixed].    $
85e0: 64 6f 63 20 64 65 6c 65 74 65 0a 20 20 20 20 73  doc delete.    s
85f0: 65 74 20 72 65 73 75 6c 74 0a 7d 20 7b 74 6f 54  et result.} {toT
8600: 68 61 74 7d 0a 0a 70 72 6f 63 20 64 6f 6d 2d 35  hat}..proc dom-5
8610: 2e 32 20 7b 6d 79 70 61 72 6d 20 62 61 73 65 20  .2 {myparm base 
8620: 73 79 73 74 65 6d 49 64 20 70 75 62 6c 69 63 49  systemId publicI
8630: 64 7d 20 7b 0a 20 20 20 20 73 65 74 20 3a 3a 64  d} {.    set ::d
8640: 6f 6d 2d 35 5f 32 20 24 6d 79 70 61 72 6d 0a 20  om-5_2 $myparm. 
8650: 20 20 20 72 65 74 75 72 6e 20 5b 6c 69 73 74 20     return [list 
8660: 73 74 72 69 6e 67 20 64 75 6d 6d 79 20 22 22 5d  string dummy ""]
8670: 0a 7d 0a 0a 74 65 73 74 20 64 6f 6d 2d 35 2e 32  .}..test dom-5.2
8680: 20 7b 2d 65 78 74 65 72 6e 61 6c 65 6e 74 69 74   {-externalentit
8690: 79 63 6f 6d 6d 61 6e 64 7d 20 7b 0a 20 20 20 20  ycommand} {.    
86a0: 73 65 74 20 3a 3a 64 6f 6d 2d 35 5f 32 20 22 22  set ::dom-5_2 ""
86b0: 0a 20 20 20 20 73 65 74 20 64 6f 63 20 5b 64 6f  .    set doc [do
86c0: 6d 20 70 61 72 73 65 20 5c 0a 20 20 20 20 20 20  m parse \.      
86d0: 20 20 20 20 20 20 20 20 20 20 20 2d 62 61 73 65             -base
86e0: 75 72 6c 20 22 64 75 6d 6d 79 22 20 5c 0a 20 20  url "dummy" \.  
86f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2d                 -
8700: 65 78 74 65 72 6e 61 6c 65 6e 74 69 74 79 63 6f  externalentityco
8710: 6d 6d 61 6e 64 20 5b 6c 69 73 74 20 64 6f 6d 2d  mmand [list dom-
8720: 35 2e 32 20 74 68 69 73 44 6f 63 5d 20 7b 0a 20  5.2 thisDoc] {. 
8730: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8740: 20 20 20 20 3c 21 44 4f 43 54 59 50 45 20 72 6f      <!DOCTYPE ro
8750: 6f 74 20 53 59 53 54 45 4d 20 22 22 3e 0a 20 20  ot SYSTEM "">.  
8760: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8770: 20 20 20 3c 72 6f 6f 74 2f 3e 7d 5d 0a 20 20 20     <root/>}].   
8780: 20 24 64 6f 63 20 64 65 6c 65 74 65 0a 20 20 20   $doc delete.   
8790: 20 73 65 74 20 3a 3a 64 6f 6d 2d 35 5f 32 0a 7d   set ::dom-5_2.}
87a0: 20 7b 74 68 69 73 44 6f 63 7d 0a 0a 70 72 6f 63   {thisDoc}..proc
87b0: 20 64 6f 6d 2d 35 2e 33 20 7b 62 61 73 65 20 73   dom-5.3 {base s
87c0: 79 73 74 65 6d 49 64 20 70 75 62 6c 69 63 49 64  ystemId publicId
87d0: 7d 20 7b 0a 20 20 20 20 73 77 69 74 63 68 20 24  } {.    switch $
87e0: 70 75 62 6c 69 63 49 64 20 7b 0a 20 20 20 20 20  publicId {.     
87f0: 20 20 20 22 65 31 22 20 7b 0a 20 20 20 20 20 20     "e1" {.      
8800: 20 20 20 20 20 20 23 20 4e 6f 74 20 77 65 6c 6c        # Not well
8810: 2d 66 6f 72 6d 65 64 0a 20 20 20 20 20 20 20 20  -formed.        
8820: 20 20 20 20 73 65 74 20 64 61 74 61 20 22 3c 65      set data "<e
8830: 2c 31 2f 3e 22 0a 20 20 20 20 20 20 20 20 7d 0a  ,1/>".        }.
8840: 20 20 20 20 20 20 20 20 64 65 66 61 75 6c 74 20          default 
8850: 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 65 72  {.            er
8860: 72 6f 72 20 22 75 6e 6b 6e 6f 77 6e 20 70 75 62  ror "unknown pub
8870: 6c 69 63 20 49 44 22 0a 20 20 20 20 20 20 20 20  lic ID".        
8880: 7d 0a 20 20 20 20 7d 0a 20 20 20 20 72 65 74 75  }.    }.    retu
8890: 72 6e 20 5b 6c 69 73 74 20 22 73 74 72 69 6e 67  rn [list "string
88a0: 22 20 24 62 61 73 65 20 24 64 61 74 61 5d 0a 7d  " $base $data].}
88b0: 0a 74 65 73 74 20 64 6f 6d 2d 35 2e 33 20 7b 2d  .test dom-5.3 {-
88c0: 65 78 74 65 72 6e 61 6c 65 6e 74 69 74 79 63 6f  externalentityco
88d0: 6d 6d 61 6e 64 20 2d 20 6e 65 73 74 65 64 20 65  mmand - nested e
88e0: 78 74 65 72 6e 61 6c 20 65 6e 74 69 74 69 65 73  xternal entities
88f0: 7d 20 2d 62 6f 64 79 20 7b 0a 20 20 20 20 73 65  } -body {.    se
8900: 74 20 72 65 73 75 6c 74 20 5b 63 61 74 63 68 20  t result [catch 
8910: 7b 0a 20 20 20 20 20 20 20 20 64 6f 6d 20 70 61  {.        dom pa
8920: 72 73 65 20 2d 65 78 74 65 72 6e 61 6c 65 6e 74  rse -externalent
8930: 69 74 79 63 6f 6d 6d 61 6e 64 20 64 6f 6d 2d 35  itycommand dom-5
8940: 2e 33 20 5c 0a 20 20 20 20 20 20 20 20 20 20 20  .3 \.           
8950: 20 7b 3c 21 44 4f 43 54 59 50 45 20 64 6f 63 20   {<!DOCTYPE doc 
8960: 5b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  [.              
8970: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 3c 21                <!
8980: 45 4e 54 49 54 59 20 65 31 20 50 55 42 4c 49 43  ENTITY e1 PUBLIC
8990: 20 22 65 31 22 20 22 65 31 2e 78 6d 6c 22 3e 0a   "e1" "e1.xml">.
89a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
89b0: 20 20 20 20 20 20 20 20 20 20 20 20 5d 3e 0a 20              ]>. 
89c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 3c                 <
89d0: 64 6f 63 3e 26 65 31 3b 3c 2f 64 6f 63 3e 7d 0a  doc>&e1;</doc>}.
89e0: 20 20 20 20 7d 20 6d 73 67 5d 0a 20 20 20 20 6c      } msg].    l
89f0: 69 73 74 20 24 72 65 73 75 6c 74 20 24 6d 73 67  ist $result $msg
8a00: 0a 7d 20 2d 72 65 73 75 6c 74 20 5b 6c 69 73 74  .} -result [list
8a10: 20 31 20 7b 65 72 72 6f 72 20 22 6e 6f 74 20 77   1 {error "not w
8a20: 65 6c 6c 2d 66 6f 72 6d 65 64 20 28 69 6e 76 61  ell-formed (inva
8a30: 6c 69 64 20 74 6f 6b 65 6e 29 22 20 69 6e 20 65  lid token)" in e
8a40: 6e 74 69 74 79 20 22 65 31 2e 78 6d 6c 22 20 61  ntity "e1.xml" a
8a50: 74 20 6c 69 6e 65 20 31 20 63 68 61 72 61 63 74  t line 1 charact
8a60: 65 72 20 32 0a 22 3c 65 2c 20 3c 2d 2d 45 72 72  er 2."<e, <--Err
8a70: 6f 72 2d 2d 20 31 2f 3e 22 2c 20 72 65 66 65 72  or-- 1/>", refer
8a80: 65 6e 63 65 64 20 61 74 20 6c 69 6e 65 20 34 20  enced at line 4 
8a90: 63 68 61 72 61 63 74 65 72 20 32 31 7d 5d 0a 0a  character 21}]..
8aa0: 70 72 6f 63 20 64 6f 6d 2d 35 2e 34 20 7b 62 61  proc dom-5.4 {ba
8ab0: 73 65 20 73 79 73 74 65 6d 49 64 20 70 75 62 6c  se systemId publ
8ac0: 69 63 49 64 7d 20 7b 0a 20 20 20 20 73 77 69 74  icId} {.    swit
8ad0: 63 68 20 24 70 75 62 6c 69 63 49 64 20 7b 0a 20  ch $publicId {. 
8ae0: 20 20 20 20 20 20 20 22 65 31 22 20 7b 0a 20 20         "e1" {.  
8af0: 20 20 20 20 20 20 20 20 20 20 73 65 74 20 64 61            set da
8b00: 74 61 20 22 3c 65 31 3e 26 65 32 3b 3c 2f 65 31  ta "<e1>&e2;</e1
8b10: 3e 22 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  >".        }.   
8b20: 20 20 20 20 20 22 65 32 22 20 7b 0a 20 20 20 20       "e2" {.    
8b30: 20 20 20 20 20 20 20 20 73 65 74 20 64 61 74 61          set data
8b40: 20 22 3c 65 2c 32 2f 3e 22 0a 20 20 20 20 20 20   "<e,2/>".      
8b50: 20 20 7d 0a 20 20 20 20 20 20 20 20 64 65 66 61    }.        defa
8b60: 75 6c 74 20 7b 0a 20 20 20 20 20 20 20 20 20 20  ult {.          
8b70: 20 20 65 72 72 6f 72 20 22 75 6e 6b 6e 6f 77 6e    error "unknown
8b80: 20 70 75 62 6c 69 63 20 49 44 22 0a 20 20 20 20   public ID".    
8b90: 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20      }.    }.    
8ba0: 72 65 74 75 72 6e 20 5b 6c 69 73 74 20 22 73 74  return [list "st
8bb0: 72 69 6e 67 22 20 24 62 61 73 65 20 24 64 61 74  ring" $base $dat
8bc0: 61 5d 0a 7d 0a 74 65 73 74 20 64 6f 6d 2d 35 2e  a].}.test dom-5.
8bd0: 34 20 7b 2d 65 78 74 65 72 6e 61 6c 65 6e 74 69  4 {-externalenti
8be0: 74 79 63 6f 6d 6d 61 6e 64 20 2d 20 6e 65 73 74  tycommand - nest
8bf0: 65 64 20 65 78 74 65 72 6e 61 6c 20 65 6e 74 69  ed external enti
8c00: 74 69 65 73 7d 20 2d 62 6f 64 79 20 7b 0a 20 20  ties} -body {.  
8c10: 20 20 73 65 74 20 72 65 73 75 6c 74 20 5b 63 61    set result [ca
8c20: 74 63 68 20 7b 0a 20 20 20 20 20 20 20 20 64 6f  tch {.        do
8c30: 6d 20 70 61 72 73 65 20 2d 65 78 74 65 72 6e 61  m parse -externa
8c40: 6c 65 6e 74 69 74 79 63 6f 6d 6d 61 6e 64 20 64  lentitycommand d
8c50: 6f 6d 2d 35 2e 34 20 5c 0a 20 20 20 20 20 20 20  om-5.4 \.       
8c60: 20 20 20 20 20 7b 3c 21 44 4f 43 54 59 50 45 20       {<!DOCTYPE 
8c70: 64 6f 63 20 5b 0a 20 20 20 20 20 20 20 20 20 20  doc [.          
8c80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8c90: 20 20 3c 21 45 4e 54 49 54 59 20 65 31 20 50 55    <!ENTITY e1 PU
8ca0: 42 4c 49 43 20 22 65 31 22 20 22 65 31 2e 78 6d  BLIC "e1" "e1.xm
8cb0: 6c 22 3e 0a 20 20 20 20 20 20 20 20 20 20 20 20  l">.            
8cc0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8cd0: 3c 21 45 4e 54 49 54 59 20 65 32 20 50 55 42 4c  <!ENTITY e2 PUBL
8ce0: 49 43 20 22 65 32 22 20 22 65 32 2e 78 6d 6c 22  IC "e2" "e2.xml"
8cf0: 3e 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  >.              
8d00: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 5d 3e                ]>
8d10: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
8d20: 20 3c 64 6f 63 3e 26 65 31 3b 3c 2f 64 6f 63 3e   <doc>&e1;</doc>
8d30: 7d 0a 20 20 20 20 7d 20 6d 73 67 5d 0a 20 20 20  }.    } msg].   
8d40: 20 6c 69 73 74 20 24 72 65 73 75 6c 74 20 24 6d   list $result $m
8d50: 73 67 0a 7d 20 2d 72 65 73 75 6c 74 20 5b 6c 69  sg.} -result [li
8d60: 73 74 20 31 20 7b 65 72 72 6f 72 20 22 6e 6f 74  st 1 {error "not
8d70: 20 77 65 6c 6c 2d 66 6f 72 6d 65 64 20 28 69 6e   well-formed (in
8d80: 76 61 6c 69 64 20 74 6f 6b 65 6e 29 22 20 69 6e  valid token)" in
8d90: 20 65 6e 74 69 74 79 20 22 65 32 2e 78 6d 6c 22   entity "e2.xml"
8da0: 20 61 74 20 6c 69 6e 65 20 31 20 63 68 61 72 61   at line 1 chara
8db0: 63 74 65 72 20 32 0a 22 3c 65 2c 20 3c 2d 2d 45  cter 2."<e, <--E
8dc0: 72 72 6f 72 2d 2d 20 32 2f 3e 22 2c 20 72 65 66  rror-- 2/>", ref
8dd0: 65 72 65 6e 63 65 64 20 69 6e 20 65 6e 74 69 74  erenced in entit
8de0: 79 20 22 65 31 2e 78 6d 6c 22 20 61 74 20 6c 69  y "e1.xml" at li
8df0: 6e 65 20 31 20 63 68 61 72 61 63 74 65 72 20 34  ne 1 character 4
8e00: 2c 20 72 65 66 65 72 65 6e 63 65 64 20 61 74 20  , referenced at 
8e10: 6c 69 6e 65 20 35 20 63 68 61 72 61 63 74 65 72  line 5 character
8e20: 20 32 31 7d 5d 0a 0a 70 72 6f 63 20 64 6f 6d 2d   21}]..proc dom-
8e30: 35 2e 35 20 7b 62 61 73 65 20 73 79 73 74 65 6d  5.5 {base system
8e40: 49 64 20 70 75 62 6c 69 63 49 64 7d 20 7b 0a 20  Id publicId} {. 
8e50: 20 20 20 73 77 69 74 63 68 20 24 70 75 62 6c 69     switch $publi
8e60: 63 49 64 20 7b 0a 20 20 20 20 20 20 20 20 22 65  cId {.        "e
8e70: 31 22 20 7b 0a 20 20 20 20 20 20 20 20 20 20 20  1" {.           
8e80: 20 73 65 74 20 64 61 74 61 20 22 3c 65 31 3e 26   set data "<e1>&
8e90: 65 32 3b 3c 2f 65 31 3e 22 0a 20 20 20 20 20 20  e2;</e1>".      
8ea0: 20 20 7d 0a 20 20 20 20 20 20 20 20 22 65 32 22    }.        "e2"
8eb0: 20 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 73   {.            s
8ec0: 65 74 20 64 61 74 61 20 22 3c 65 32 3e 26 65 33  et data "<e2>&e3
8ed0: 3b 3c 2f 65 32 3e 22 0a 20 20 20 20 20 20 20 20  ;</e2>".        
8ee0: 7d 0a 20 20 20 20 20 20 20 20 22 65 33 22 20 7b  }.        "e3" {
8ef0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 23 20 4e  .            # N
8f00: 6f 74 20 77 65 6c 6c 2d 66 6f 72 6d 65 64 0a 20  ot well-formed. 
8f10: 20 20 20 20 20 20 20 20 20 20 20 73 65 74 20 64             set d
8f20: 61 74 61 20 22 3c 65 2c 33 2f 3e 22 0a 20 20 20  ata "<e,3/>".   
8f30: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 64       }.        d
8f40: 65 66 61 75 6c 74 20 7b 0a 20 20 20 20 20 20 20  efault {.       
8f50: 20 20 20 20 20 65 72 72 6f 72 20 22 75 6e 6b 6e       error "unkn
8f60: 6f 77 6e 20 70 75 62 6c 69 63 20 49 44 22 0a 20  own public ID". 
8f70: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20         }.    }. 
8f80: 20 20 20 72 65 74 75 72 6e 20 5b 6c 69 73 74 20     return [list 
8f90: 22 73 74 72 69 6e 67 22 20 24 62 61 73 65 20 24  "string" $base $
8fa0: 64 61 74 61 5d 0a 7d 0a 74 65 73 74 20 64 6f 6d  data].}.test dom
8fb0: 2d 35 2e 35 20 7b 2d 65 78 74 65 72 6e 61 6c 65  -5.5 {-externale
8fc0: 6e 74 69 74 79 63 6f 6d 6d 61 6e 64 20 2d 20 6e  ntitycommand - n
8fd0: 65 73 74 65 64 20 65 78 74 65 72 6e 61 6c 20 65  ested external e
8fe0: 6e 74 69 74 69 65 73 7d 20 2d 62 6f 64 79 20 7b  ntities} -body {
8ff0: 0a 20 20 20 20 73 65 74 20 72 65 73 75 6c 74 20  .    set result 
9000: 5b 63 61 74 63 68 20 7b 0a 20 20 20 20 20 20 20  [catch {.       
9010: 20 64 6f 6d 20 70 61 72 73 65 20 2d 65 78 74 65   dom parse -exte
9020: 72 6e 61 6c 65 6e 74 69 74 79 63 6f 6d 6d 61 6e  rnalentitycomman
9030: 64 20 64 6f 6d 2d 35 2e 35 20 5c 0a 20 20 20 20  d dom-5.5 \.    
9040: 20 20 20 20 20 20 20 20 7b 3c 21 44 4f 43 54 59          {<!DOCTY
9050: 50 45 20 64 6f 63 20 5b 0a 20 20 20 20 20 20 20  PE doc [.       
9060: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9070: 20 20 20 20 20 3c 21 45 4e 54 49 54 59 20 65 31       <!ENTITY e1
9080: 20 50 55 42 4c 49 43 20 22 65 31 22 20 22 65 31   PUBLIC "e1" "e1
9090: 2e 78 6d 6c 22 3e 0a 20 20 20 20 20 20 20 20 20  .xml">.         
90a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
90b0: 20 20 20 3c 21 45 4e 54 49 54 59 20 65 32 20 50     <!ENTITY e2 P
90c0: 55 42 4c 49 43 20 22 65 32 22 20 22 65 32 2e 78  UBLIC "e2" "e2.x
90d0: 6d 6c 22 3e 0a 20 20 20 20 20 20 20 20 20 20 20  ml">.           
90e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
90f0: 20 3c 21 45 4e 54 49 54 59 20 65 33 20 50 55 42   <!ENTITY e3 PUB
9100: 4c 49 43 20 22 65 33 22 20 22 65 33 2e 78 6d 6c  LIC "e3" "e3.xml
9110: 22 3e 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ">.             
9120: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 5d                 ]
9130: 3e 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  >.              
9140: 20 20 3c 64 6f 63 3e 26 65 31 3b 3c 2f 64 6f 63    <doc>&e1;</doc
9150: 3e 7d 0a 20 20 20 20 7d 20 6d 73 67 5d 0a 20 20  >}.    } msg].  
9160: 20 20 6c 69 73 74 20 24 72 65 73 75 6c 74 20 24    list $result $
9170: 6d 73 67 0a 7d 20 2d 72 65 73 75 6c 74 20 5b 6c  msg.} -result [l
9180: 69 73 74 20 31 20 7b 65 72 72 6f 72 20 22 6e 6f  ist 1 {error "no
9190: 74 20 77 65 6c 6c 2d 66 6f 72 6d 65 64 20 28 69  t well-formed (i
91a0: 6e 76 61 6c 69 64 20 74 6f 6b 65 6e 29 22 20 69  nvalid token)" i
91b0: 6e 20 65 6e 74 69 74 79 20 22 65 33 2e 78 6d 6c  n entity "e3.xml
91c0: 22 20 61 74 20 6c 69 6e 65 20 31 20 63 68 61 72  " at line 1 char
91d0: 61 63 74 65 72 20 32 0a 22 3c 65 2c 20 3c 2d 2d  acter 2."<e, <--
91e0: 45 72 72 6f 72 2d 2d 20 33 2f 3e 22 2c 20 72 65  Error-- 3/>", re
91f0: 66 65 72 65 6e 63 65 64 20 69 6e 20 65 6e 74 69  ferenced in enti
9200: 74 79 20 22 65 32 2e 78 6d 6c 22 20 61 74 20 6c  ty "e2.xml" at l
9210: 69 6e 65 20 31 20 63 68 61 72 61 63 74 65 72 20  ine 1 character 
9220: 34 2c 20 72 65 66 65 72 65 6e 63 65 64 20 69 6e  4, referenced in
9230: 20 65 6e 74 69 74 79 20 22 65 31 2e 78 6d 6c 22   entity "e1.xml"
9240: 20 61 74 20 6c 69 6e 65 20 31 20 63 68 61 72 61   at line 1 chara
9250: 63 74 65 72 20 34 2c 20 72 65 66 65 72 65 6e 63  cter 4, referenc
9260: 65 64 20 61 74 20 6c 69 6e 65 20 36 20 63 68 61  ed at line 6 cha
9270: 72 61 63 74 65 72 20 32 31 7d 5d 0a 0a 70 72 6f  racter 21}]..pro
9280: 63 20 64 6f 6d 2d 35 2e 36 20 7b 62 61 73 65 20  c dom-5.6 {base 
9290: 73 79 73 74 65 6d 49 64 20 70 75 62 6c 69 63 49  systemId publicI
92a0: 64 7d 20 7b 0a 20 20 20 20 73 77 69 74 63 68 20  d} {.    switch 
92b0: 24 70 75 62 6c 69 63 49 64 20 7b 0a 20 20 20 20  $publicId {.    
92c0: 20 20 20 20 22 65 31 22 20 7b 0a 20 20 20 20 20      "e1" {.     
92d0: 20 20 20 20 20 20 20 73 65 74 20 64 61 74 61 20         set data 
92e0: 5b 6f 70 65 6e 20 24 3a 3a 65 31 5d 0a 20 20 20  [open $::e1].   
92f0: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 64       }.        d
9300: 65 66 61 75 6c 74 20 7b 0a 20 20 20 20 20 20 20  efault {.       
9310: 20 20 20 20 20 65 72 72 6f 72 20 22 75 6e 6b 6e       error "unkn
9320: 6f 77 6e 20 70 75 62 6c 69 63 20 49 44 22 0a 20  own public ID". 
9330: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20         }.    }. 
9340: 20 20 20 6c 61 70 70 65 6e 64 20 3a 3a 6f 70 65     lappend ::ope
9350: 6e 43 68 61 6e 6e 65 6c 73 20 24 64 61 74 61 0a  nChannels $data.
9360: 20 20 20 20 72 65 74 75 72 6e 20 5b 6c 69 73 74      return [list
9370: 20 22 63 68 61 6e 6e 65 6c 22 20 24 62 61 73 65   "channel" $base
9380: 20 24 64 61 74 61 5d 0a 7d 0a 74 65 73 74 20 64   $data].}.test d
9390: 6f 6d 2d 35 2e 36 20 7b 2d 65 78 74 65 72 6e 61  om-5.6 {-externa
93a0: 6c 65 6e 74 69 74 79 63 6f 6d 6d 61 6e 64 20 2d  lentitycommand -
93b0: 20 6e 65 73 74 65 64 20 65 78 74 65 72 6e 61 6c   nested external
93c0: 20 65 6e 74 69 74 69 65 73 7d 20 2d 73 65 74 75   entities} -setu
93d0: 70 20 7b 0a 20 20 20 20 73 65 74 20 65 31 20 5b  p {.    set e1 [
93e0: 6d 61 6b 65 46 69 6c 65 20 22 3c 65 2c 31 2f 3e  makeFile "<e,1/>
93f0: 22 20 65 31 2e 78 6d 6c 5d 0a 20 20 20 20 73 65  " e1.xml].    se
9400: 74 20 6f 70 65 6e 43 68 61 6e 6e 65 6c 73 20 5b  t openChannels [
9410: 6c 69 73 74 5d 0a 7d 20 2d 62 6f 64 79 20 7b 0a  list].} -body {.
9420: 20 20 20 20 73 65 74 20 72 65 73 75 6c 74 20 5b      set result [
9430: 63 61 74 63 68 20 7b 0a 20 20 20 20 20 20 20 20  catch {.        
9440: 64 6f 6d 20 70 61 72 73 65 20 2d 65 78 74 65 72  dom parse -exter
9450: 6e 61 6c 65 6e 74 69 74 79 63 6f 6d 6d 61 6e 64  nalentitycommand
9460: 20 64 6f 6d 2d 35 2e 36 20 5c 0a 20 20 20 20 20   dom-5.6 \.     
9470: 20 20 20 20 20 20 20 7b 3c 21 44 4f 43 54 59 50         {<!DOCTYP
9480: 45 20 64 6f 63 20 5b 0a 20 20 20 20 20 20 20 20  E doc [.        
9490: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
94a0: 20 20 20 20 3c 21 45 4e 54 49 54 59 20 65 31 20      <!ENTITY e1 
94b0: 50 55 42 4c 49 43 20 22 65 31 22 20 22 65 31 2e  PUBLIC "e1" "e1.
94c0: 78 6d 6c 22 3e 0a 20 20 20 20 20 20 20 20 20 20  xml">.          
94d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
94e0: 20 20 5d 3e 0a 20 20 20 20 20 20 20 20 20 20 20    ]>.           
94f0: 20 20 20 20 20 3c 64 6f 63 3e 26 65 31 3b 3c 2f       <doc>&e1;</
9500: 64 6f 63 3e 7d 0a 20 20 20 20 7d 20 6d 73 67 5d  doc>}.    } msg]
9510: 0a 20 20 20 20 6c 69 73 74 20 24 72 65 73 75 6c  .    list $resul
9520: 74 20 24 6d 73 67 0a 7d 20 2d 63 6c 65 61 6e 75  t $msg.} -cleanu
9530: 70 20 7b 0a 20 20 20 20 66 6f 72 65 61 63 68 20  p {.    foreach 
9540: 63 68 61 6e 6e 65 6c 20 24 6f 70 65 6e 43 68 61  channel $openCha
9550: 6e 6e 65 6c 73 20 7b 63 6c 6f 73 65 20 24 63 68  nnels {close $ch
9560: 61 6e 6e 65 6c 7d 0a 20 20 20 20 72 65 6d 6f 76  annel}.    remov
9570: 65 46 69 6c 65 20 65 31 2e 78 6d 6c 0a 7d 20 2d  eFile e1.xml.} -
9580: 72 65 73 75 6c 74 20 5b 6c 69 73 74 20 31 20 7b  result [list 1 {
9590: 65 72 72 6f 72 20 22 6e 6f 74 20 77 65 6c 6c 2d  error "not well-
95a0: 66 6f 72 6d 65 64 20 28 69 6e 76 61 6c 69 64 20  formed (invalid 
95b0: 74 6f 6b 65 6e 29 22 20 69 6e 20 65 6e 74 69 74  token)" in entit
95c0: 79 20 22 65 31 2e 78 6d 6c 22 20 61 74 20 6c 69  y "e1.xml" at li
95d0: 6e 65 20 31 20 63 68 61 72 61 63 74 65 72 20 32  ne 1 character 2
95e0: 2c 20 72 65 66 65 72 65 6e 63 65 64 20 61 74 20  , referenced at 
95f0: 6c 69 6e 65 20 34 20 63 68 61 72 61 63 74 65 72  line 4 character
9600: 20 32 31 7d 5d 0a 0a 70 72 6f 63 20 64 6f 6d 2d   21}]..proc dom-
9610: 35 2e 37 20 7b 62 61 73 65 20 73 79 73 74 65 6d  5.7 {base system
9620: 49 64 20 70 75 62 6c 69 63 49 64 7d 20 7b 0a 20  Id publicId} {. 
9630: 20 20 20 73 77 69 74 63 68 20 24 70 75 62 6c 69     switch $publi
9640: 63 49 64 20 7b 0a 20 20 20 20 20 20 20 20 22 65  cId {.        "e
9650: 31 22 20 7b 0a 20 20 20 20 20 20 20 20 20 20 20  1" {.           
9660: 20 73 65 74 20 64 61 74 61 20 5b 6f 70 65 6e 20   set data [open 
9670: 24 3a 3a 65 31 5d 0a 20 20 20 20 20 20 20 20 7d  $::e1].        }
9680: 0a 20 20 20 20 20 20 20 20 22 65 32 22 20 7b 0a  .        "e2" {.
9690: 20 20 20 20 20 20 20 20 20 20 20 20 73 65 74 20              set 
96a0: 64 61 74 61 20 5b 6f 70 65 6e 20 24 3a 3a 65 32  data [open $::e2
96b0: 5d 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ].        }.    
96c0: 20 20 20 20 64 65 66 61 75 6c 74 20 7b 0a 20 20      default {.  
96d0: 20 20 20 20 20 20 20 20 20 20 65 72 72 6f 72 20            error 
96e0: 22 75 6e 6b 6e 6f 77 6e 20 70 75 62 6c 69 63 20  "unknown public 
96f0: 49 44 22 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  ID".        }.  
9700: 20 20 7d 0a 20 20 20 20 6c 61 70 70 65 6e 64 20    }.    lappend 
9710: 3a 3a 6f 70 65 6e 43 68 61 6e 6e 65 6c 73 20 24  ::openChannels $
9720: 64 61 74 61 0a 20 20 20 20 72 65 74 75 72 6e 20  data.    return 
9730: 5b 6c 69 73 74 20 22 63 68 61 6e 6e 65 6c 22 20  [list "channel" 
9740: 24 62 61 73 65 20 24 64 61 74 61 5d 0a 7d 0a 74  $base $data].}.t
9750: 65 73 74 20 64 6f 6d 2d 35 2e 37 20 7b 2d 65 78  est dom-5.7 {-ex
9760: 74 65 72 6e 61 6c 65 6e 74 69 74 79 63 6f 6d 6d  ternalentitycomm
9770: 61 6e 64 20 2d 20 6e 65 73 74 65 64 20 65 78 74  and - nested ext
9780: 65 72 6e 61 6c 20 65 6e 74 69 74 69 65 73 7d 20  ernal entities} 
9790: 2d 73 65 74 75 70 20 7b 0a 20 20 20 20 73 65 74  -setup {.    set
97a0: 20 65 31 20 5b 6d 61 6b 65 46 69 6c 65 20 22 3c   e1 [makeFile "<
97b0: 65 31 3e 26 65 32 3b 3c 2f 65 31 3e 22 20 65 31  e1>&e2;</e1>" e1
97c0: 2e 78 6d 6c 5d 0a 20 20 20 20 73 65 74 20 65 32  .xml].    set e2
97d0: 20 5b 6d 61 6b 65 46 69 6c 65 20 22 3c 65 2c 32   [makeFile "<e,2
97e0: 2f 3e 22 20 65 32 2e 78 6d 6c 5d 0a 20 20 20 20  />" e2.xml].    
97f0: 73 65 74 20 6f 70 65 6e 43 68 61 6e 6e 65 6c 73  set openChannels
9800: 20 5b 6c 69 73 74 5d 0a 7d 20 2d 62 6f 64 79 20   [list].} -body 
9810: 7b 0a 20 20 20 20 73 65 74 20 72 65 73 75 6c 74  {.    set result
9820: 20 5b 63 61 74 63 68 20 7b 0a 20 20 20 20 20 20   [catch {.      
9830: 20 20 64 6f 6d 20 70 61 72 73 65 20 2d 65 78 74    dom parse -ext
9840: 65 72 6e 61 6c 65 6e 74 69 74 79 63 6f 6d 6d 61  ernalentitycomma
9850: 6e 64 20 64 6f 6d 2d 35 2e 37 20 5c 0a 20 20 20  nd dom-5.7 \.   
9860: 20 20 20 20 20 20 20 20 20 7b 3c 21 44 4f 43 54           {<!DOCT
9870: 59 50 45 20 64 6f 63 20 5b 0a 20 20 20 20 20 20  YPE doc [.      
9880: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9890: 20 20 20 20 20 20 3c 21 45 4e 54 49 54 59 20 65        <!ENTITY e
98a0: 31 20 50 55 42 4c 49 43 20 22 65 31 22 20 22 65  1 PUBLIC "e1" "e
98b0: 31 2e 78 6d 6c 22 3e 0a 20 20 20 20 20 20 20 20  1.xml">.        
98c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
98d0: 20 20 20 20 3c 21 45 4e 54 49 54 59 20 65 32 20      <!ENTITY e2 
98e0: 50 55 42 4c 49 43 20 22 65 32 22 20 22 65 32 2e  PUBLIC "e2" "e2.
98f0: 78 6d 6c 22 3e 0a 20 20 20 20 20 20 20 20 20 20  xml">.          
9900: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9910: 20 20 5d 3e 0a 20 20 20 20 20 20 20 20 20 20 20    ]>.           
9920: 20 20 20 20 20 3c 64 6f 63 3e 26 65 31 3b 3c 2f       <doc>&e1;</
9930: 64 6f 63 3e 7d 0a 20 20 20 20 7d 20 6d 73 67 5d  doc>}.    } msg]
9940: 0a 20 20 20 20 6c 69 73 74 20 24 72 65 73 75 6c  .    list $resul
9950: 74 20 24 6d 73 67 0a 7d 20 2d 63 6c 65 61 6e 75  t $msg.} -cleanu
9960: 70 20 7b 0a 20 20 20 20 66 6f 72 65 61 63 68 20  p {.    foreach 
9970: 63 68 61 6e 6e 65 6c 20 24 6f 70 65 6e 43 68 61  channel $openCha
9980: 6e 6e 65 6c 73 20 7b 63 6c 6f 73 65 20 24 63 68  nnels {close $ch
9990: 61 6e 6e 65 6c 7d 0a 20 20 20 20 72 65 6d 6f 76  annel}.    remov
99a0: 65 46 69 6c 65 20 65 31 2e 78 6d 6c 0a 20 20 20  eFile e1.xml.   
99b0: 20 72 65 6d 6f 76 65 46 69 6c 65 20 65 32 2e 78   removeFile e2.x
99c0: 6d 6c 0a 7d 20 2d 72 65 73 75 6c 74 20 5b 6c 69  ml.} -result [li
99d0: 73 74 20 31 20 7b 65 72 72 6f 72 20 22 6e 6f 74  st 1 {error "not
99e0: 20 77 65 6c 6c 2d 66 6f 72 6d 65 64 20 28 69 6e   well-formed (in
99f0: 76 61 6c 69 64 20 74 6f 6b 65 6e 29 22 20 69 6e  valid token)" in
9a00: 20 65 6e 74 69 74 79 20 22 65 32 2e 78 6d 6c 22   entity "e2.xml"
9a10: 20 61 74 20 6c 69 6e 65 20 31 20 63 68 61 72 61   at line 1 chara
9a20: 63 74 65 72 20 32 2c 20 72 65 66 65 72 65 6e 63  cter 2, referenc
9a30: 65 64 20 69 6e 20 65 6e 74 69 74 79 20 22 65 31  ed in entity "e1
9a40: 2e 78 6d 6c 22 20 61 74 20 6c 69 6e 65 20 31 20  .xml" at line 1 
9a50: 63 68 61 72 61 63 74 65 72 20 34 2c 20 72 65 66  character 4, ref
9a60: 65 72 65 6e 63 65 64 20 61 74 20 6c 69 6e 65 20  erenced at line 
9a70: 35 20 63 68 61 72 61 63 74 65 72 20 32 31 7d 5d  5 character 21}]
9a80: 0a 0a 70 72 6f 63 20 64 6f 6d 2d 35 2e 38 20 7b  ..proc dom-5.8 {
9a90: 62 61 73 65 20 73 79 73 74 65 6d 49 64 20 70 75  base systemId pu
9aa0: 62 6c 69 63 49 64 7d 20 7b 0a 20 20 20 20 73 77  blicId} {.    sw
9ab0: 69 74 63 68 20 24 70 75 62 6c 69 63 49 64 20 7b  itch $publicId {
9ac0: 0a 20 20 20 20 20 20 20 20 22 65 31 22 20 7b 0a  .        "e1" {.
9ad0: 20 20 20 20 20 20 20 20 20 20 20 20 73 65 74 20              set 
9ae0: 64 61 74 61 20 5b 6f 70 65 6e 20 24 3a 3a 65 31  data [open $::e1
9af0: 5d 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ].        }.    
9b00: 20 20 20 20 22 65 32 22 20 7b 0a 20 20 20 20 20      "e2" {.     
9b10: 20 20 20 20 20 20 20 73 65 74 20 64 61 74 61 20         set data 
9b20: 5b 6f 70 65 6e 20 24 3a 3a 65 32 5d 0a 20 20 20  [open $::e2].   
9b30: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 22       }.        "
9b40: 65 33 22 20 7b 0a 20 20 20 20 20 20 20 20 20 20  e3" {.          
9b50: 20 20 73 65 74 20 64 61 74 61 20 5b 6f 70 65 6e    set data [open
9b60: 20 24 3a 3a 65 33 5d 0a 20 20 20 20 20 20 20 20   $::e3].        
9b70: 7d 0a 20 20 20 20 20 20 20 20 64 65 66 61 75 6c  }.        defaul
9b80: 74 20 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20  t {.            
9b90: 65 72 72 6f 72 20 22 75 6e 6b 6e 6f 77 6e 20 70  error "unknown p
9ba0: 75 62 6c 69 63 20 49 44 22 0a 20 20 20 20 20 20  ublic ID".      
9bb0: 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 6c 61    }.    }.    la
9bc0: 70 70 65 6e 64 20 3a 3a 6f 70 65 6e 43 68 61 6e  ppend ::openChan
9bd0: 6e 65 6c 73 20 24 64 61 74 61 0a 20 20 20 20 72  nels $data.    r
9be0: 65 74 75 72 6e 20 5b 6c 69 73 74 20 22 63 68 61  eturn [list "cha
9bf0: 6e 6e 65 6c 22 20 24 62 61 73 65 20 24 64 61 74  nnel" $base $dat
9c00: 61 5d 0a 7d 0a 74 65 73 74 20 64 6f 6d 2d 35 2e  a].}.test dom-5.
9c10: 38 20 7b 2d 65 78 74 65 72 6e 61 6c 65 6e 74 69  8 {-externalenti
9c20: 74 79 63 6f 6d 6d 61 6e 64 20 2d 20 6e 65 73 74  tycommand - nest
9c30: 65 64 20 65 78 74 65 72 6e 61 6c 20 65 6e 74 69  ed external enti
9c40: 74 69 65 73 7d 20 2d 73 65 74 75 70 20 7b 0a 20  ties} -setup {. 
9c50: 20 20 20 73 65 74 20 65 31 20 5b 6d 61 6b 65 46     set e1 [makeF
9c60: 69 6c 65 20 22 3c 65 31 3e 26 65 32 3b 3c 2f 65  ile "<e1>&e2;</e
9c70: 31 3e 22 20 65 31 2e 78 6d 6c 5d 0a 20 20 20 20  1>" e1.xml].    
9c80: 73 65 74 20 65 32 20 5b 6d 61 6b 65 46 69 6c 65  set e2 [makeFile
9c90: 20 22 3c 65 32 3e 26 65 33 3b 3c 2f 65 32 3e 22   "<e2>&e3;</e2>"
9ca0: 20 65 32 2e 78 6d 6c 5d 0a 20 20 20 20 73 65 74   e2.xml].    set
9cb0: 20 65 33 20 5b 6d 61 6b 65 46 69 6c 65 20 22 3c   e3 [makeFile "<
9cc0: 65 2c 33 2f 3e 22 20 65 33 2e 78 6d 6c 5d 0a 20  e,3/>" e3.xml]. 
9cd0: 20 20 20 73 65 74 20 6f 70 65 6e 43 68 61 6e 6e     set openChann
9ce0: 65 6c 73 20 5b 6c 69 73 74 5d 0a 7d 20 2d 62 6f  els [list].} -bo
9cf0: 64 79 20 7b 0a 20 20 20 20 73 65 74 20 72 65 73  dy {.    set res
9d00: 75 6c 74 20 5b 63 61 74 63 68 20 7b 0a 20 20 20  ult [catch {.   
9d10: 20 20 20 20 20 64 6f 6d 20 70 61 72 73 65 20 2d       dom parse -
9d20: 65 78 74 65 72 6e 61 6c 65 6e 74 69 74 79 63 6f  externalentityco
9d30: 6d 6d 61 6e 64 20 64 6f 6d 2d 35 2e 38 20 5c 0a  mmand dom-5.8 \.
9d40: 20 20 20 20 20 20 20 20 20 20 20 20 7b 3c 21 44              {<!D
9d50: 4f 43 54 59 50 45 20 64 6f 63 20 5b 0a 20 20 20  OCTYPE doc [.   
9d60: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9d70: 20 20 20 20 20 20 20 20 20 3c 21 45 4e 54 49 54           <!ENTIT
9d80: 59 20 65 31 20 50 55 42 4c 49 43 20 22 65 31 22  Y e1 PUBLIC "e1"
9d90: 20 22 65 31 2e 78 6d 6c 22 3e 0a 20 20 20 20 20   "e1.xml">.     
9da0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9db0: 20 20 20 20 20 20 20 3c 21 45 4e 54 49 54 59 20         <!ENTITY 
9dc0: 65 32 20 50 55 42 4c 49 43 20 22 65 32 22 20 22  e2 PUBLIC "e2" "
9dd0: 65 32 2e 78 6d 6c 22 3e 0a 20 20 20 20 20 20 20  e2.xml">.       
9de0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9df0: 20 20 20 20 20 3c 21 45 4e 54 49 54 59 20 65 33       <!ENTITY e3
9e00: 20 50 55 42 4c 49 43 20 22 65 33 22 20 22 65 33   PUBLIC "e3" "e3
9e10: 2e 78 6d 6c 22 3e 0a 20 20 20 20 20 20 20 20 20  .xml">.         
9e20: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9e30: 20 20 20 5d 3e 0a 20 20 20 20 20 20 20 20 20 20     ]>.          
9e40: 20 20 20 20 20 20 3c 64 6f 63 3e 26 65 31 3b 3c        <doc>&e1;<
9e50: 2f 64 6f 63 3e 7d 0a 20 20 20 20 7d 20 6d 73 67  /doc>}.    } msg
9e60: 5d 0a 20 20 20 20 6c 69 73 74 20 24 72 65 73 75  ].    list $resu
9e70: 6c 74 20 24 6d 73 67 0a 7d 20 2d 63 6c 65 61 6e  lt $msg.} -clean
9e80: 75 70 20 7b 0a 20 20 20 20 66 6f 72 65 61 63 68  up {.    foreach
9e90: 20 63 68 61 6e 6e 65 6c 20 24 6f 70 65 6e 43 68   channel $openCh
9ea0: 61 6e 6e 65 6c 73 20 7b 63 6c 6f 73 65 20 24 63  annels {close $c
9eb0: 68 61 6e 6e 65 6c 7d 0a 20 20 20 20 72 65 6d 6f  hannel}.    remo
9ec0: 76 65 46 69 6c 65 20 65 31 2e 78 6d 6c 0a 20 20  veFile e1.xml.  
9ed0: 20 20 72 65 6d 6f 76 65 46 69 6c 65 20 65 32 2e    removeFile e2.
9ee0: 78 6d 6c 0a 20 20 20 20 72 65 6d 6f 76 65 46 69  xml.    removeFi
9ef0: 6c 65 20 65 33 2e 78 6d 6c 0a 7d 20 2d 72 65 73  le e3.xml.} -res
9f00: 75 6c 74 20 5b 6c 69 73 74 20 31 20 7b 65 72 72  ult [list 1 {err
9f10: 6f 72 20 22 6e 6f 74 20 77 65 6c 6c 2d 66 6f 72  or "not well-for
9f20: 6d 65 64 20 28 69 6e 76 61 6c 69 64 20 74 6f 6b  med (invalid tok
9f30: 65 6e 29 22 20 69 6e 20 65 6e 74 69 74 79 20 22  en)" in entity "
9f40: 65 33 2e 78 6d 6c 22 20 61 74 20 6c 69 6e 65 20  e3.xml" at line 
9f50: 31 20 63 68 61 72 61 63 74 65 72 20 32 2c 20 72  1 character 2, r
9f60: 65 66 65 72 65 6e 63 65 64 20 69 6e 20 65 6e 74  eferenced in ent
9f70: 69 74 79 20 22 65 32 2e 78 6d 6c 22 20 61 74 20  ity "e2.xml" at 
9f80: 6c 69 6e 65 20 31 20 63 68 61 72 61 63 74 65 72  line 1 character
9f90: 20 34 2c 20 72 65 66 65 72 65 6e 63 65 64 20 69   4, referenced i
9fa0: 6e 20 65 6e 74 69 74 79 20 22 65 31 2e 78 6d 6c  n entity "e1.xml
9fb0: 22 20 61 74 20 6c 69 6e 65 20 31 20 63 68 61 72  " at line 1 char
9fc0: 61 63 74 65 72 20 34 2c 20 72 65 66 65 72 65 6e  acter 4, referen
9fd0: 63 65 64 20 61 74 20 6c 69 6e 65 20 36 20 63 68  ced at line 6 ch
9fe0: 61 72 61 63 74 65 72 20 32 31 7d 5d 0a 0a 74 65  aracter 21}]..te
9ff0: 73 74 20 64 6f 6d 2d 35 2e 39 20 7b 57 72 6f 6e  st dom-5.9 {Wron
a000: 67 20 6f 70 74 69 6f 6e 20 61 66 74 65 72 20 2d  g option after -
a010: 65 78 74 65 72 6e 61 6c 65 6e 74 69 74 79 63 6f  externalentityco
a020: 6d 6d 61 6e 64 7d 20 2d 62 6f 64 79 20 7b 0a 20  mmand} -body {. 
a030: 20 20 20 73 65 74 20 72 65 73 75 6c 74 20 5b 63     set result [c
a040: 61 74 63 68 20 7b 64 6f 6d 20 70 61 72 73 65 20  atch {dom parse 
a050: 2d 65 78 74 65 72 6e 61 6c 65 6e 74 69 74 79 63  -externalentityc
a060: 6f 6d 6d 61 6e 64 20 3a 3a 74 64 6f 6d 3a 3a 65  ommand ::tdom::e
a070: 78 74 52 65 66 48 61 6e 64 6c 65 72 20 5c 0a 20  xtRefHandler \. 
a080: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
a090: 20 20 20 20 20 20 20 20 20 20 2d 75 73 65 46 6f            -useFo
a0a0: 72 65 69 67 6e 44 54 44 20 66 6f 6f 7d 5d 0a 7d  reignDTD foo}].}
a0b0: 20 2d 72 65 73 75 6c 74 20 31 0a 0a 74 65 73 74   -result 1..test
a0c0: 20 64 6f 6d 2d 36 2e 31 20 7b 75 73 65 20 69 6e   dom-6.1 {use in
a0d0: 20 73 6c 61 76 65 20 69 6e 74 65 72 70 72 65 74   slave interpret
a0e0: 65 72 7d 20 7b 0a 20 20 20 20 73 65 74 20 73 6c  er} {.    set sl
a0f0: 61 76 65 20 5b 69 6e 74 65 72 70 20 63 72 65 61  ave [interp crea
a100: 74 65 5d 0a 20 20 20 20 6c 6f 61 64 20 7b 7d 20  te].    load {} 
a110: 74 64 6f 6d 20 24 73 6c 61 76 65 0a 20 20 20 20  tdom $slave.    
a120: 69 6e 74 65 72 70 20 65 76 61 6c 20 24 73 6c 61  interp eval $sla
a130: 76 65 20 7b 0a 20 20 20 20 20 20 20 20 64 6f 6d  ve {.        dom
a140: 20 70 61 72 73 65 20 3c 72 6f 6f 74 3e 66 6f 6f   parse <root>foo
a150: 3c 2f 72 6f 6f 74 3e 20 64 6f 63 0a 20 20 20 20  </root> doc.    
a160: 20 20 20 20 24 64 6f 63 20 64 6f 63 75 6d 65 6e      $doc documen
a170: 74 45 6c 65 6d 65 6e 74 20 72 6f 6f 74 0a 20 20  tElement root.  
a180: 20 20 7d 0a 20 20 20 20 69 6e 74 65 72 70 20 64    }.    interp d
a190: 65 6c 65 74 65 20 24 73 6c 61 76 65 0a 7d 20 7b  elete $slave.} {
a1a0: 7d 0a 0a 74 65 73 74 20 64 6f 6d 2d 36 2e 32 20  }..test dom-6.2 
a1b0: 7b 75 73 65 20 69 6e 20 73 6c 61 76 65 20 69 6e  {use in slave in
a1c0: 74 65 72 70 72 65 74 65 72 7d 20 7b 0a 20 20 20  terpreter} {.   
a1d0: 20 73 65 74 20 73 6c 61 76 65 20 5b 69 6e 74 65   set slave [inte
a1e0: 72 70 20 63 72 65 61 74 65 5d 0a 20 20 20 20 6c  rp create].    l
a1f0: 6f 61 64 20 7b 7d 20 74 64 6f 6d 20 24 73 6c 61  oad {} tdom $sla
a200: 76 65 0a 20 20 20 20 69 6e 74 65 72 70 20 65 76  ve.    interp ev
a210: 61 6c 20 24 73 6c 61 76 65 20 7b 0a 20 20 20 20  al $slave {.    
a220: 20 20 20 20 73 65 74 20 64 6f 63 20 5b 64 6f 6d      set doc [dom
a230: 20 70 61 72 73 65 20 3c 72 6f 6f 74 3e 66 6f 6f   parse <root>foo
a240: 3c 2f 72 6f 6f 74 3e 5d 0a 20 20 20 20 20 20 20  </root>].       
a250: 20 73 65 74 20 72 6f 6f 74 20 5b 24 64 6f 63 20   set root [$doc 
a260: 64 6f 63 75 6d 65 6e 74 45 6c 65 6d 65 6e 74 5d  documentElement]
a270: 0a 20 20 20 20 7d 0a 20 20 20 20 69 6e 74 65 72  .    }.    inter
a280: 70 20 64 65 6c 65 74 65 20 24 73 6c 61 76 65 0a  p delete $slave.
a290: 7d 20 7b 7d 0a 0a 74 65 73 74 20 64 6f 6d 2d 37  } {}..test dom-7
a2a0: 2e 31 20 7b 73 65 74 4e 61 6d 65 43 68 65 63 6b  .1 {setNameCheck
a2b0: 7d 20 7b 0a 20 20 20 20 73 65 74 20 72 65 73 75  } {.    set resu
a2c0: 6c 74 20 5b 64 6f 6d 20 73 65 74 4e 61 6d 65 43  lt [dom setNameC
a2d0: 68 65 63 6b 5d 0a 20 20 20 20 6c 61 70 70 65 6e  heck].    lappen
a2e0: 64 20 72 65 73 75 6c 74 20 5b 64 6f 6d 20 73 65  d result [dom se
a2f0: 74 4e 61 6d 65 43 68 65 63 6b 20 30 5d 0a 20 20  tNameCheck 0].  
a300: 20 20 6c 61 70 70 65 6e 64 20 72 65 73 75 6c 74    lappend result
a310: 20 5b 64 6f 6d 20 73 65 74 4e 61 6d 65 43 68 65   [dom setNameChe
a320: 63 6b 5d 0a 20 20 20 20 23 20 73 65 74 20 62 61  ck].    # set ba
a330: 63 6b 20 74 6f 20 64 65 66 61 75 6c 74 0a 20 20  ck to default.  
a340: 20 20 6c 61 70 70 65 6e 64 20 72 65 73 75 6c 74    lappend result
a350: 20 5b 64 6f 6d 20 73 65 74 4e 61 6d 65 43 68 65   [dom setNameChe
a360: 63 6b 20 31 5d 0a 20 20 20 20 73 65 74 20 72 65  ck 1].    set re
a370: 73 75 6c 74 0a 7d 20 7b 31 20 30 20 30 20 31 7d  sult.} {1 0 0 1}
a380: 0a 0a 73 65 74 20 64 6f 63 20 5b 64 6f 6d 20 63  ..set doc [dom c
a390: 72 65 61 74 65 44 6f 63 75 6d 65 6e 74 20 72 6f  reateDocument ro
a3a0: 6f 74 5d 0a 23 20 65 6e 73 75 72 65 2c 20 77 65  ot].# ensure, we
a3b0: 27 76 65 20 74 68 65 20 64 65 66 61 75 6c 74 0a  've the default.
a3c0: 64 6f 6d 20 73 65 74 4e 61 6d 65 43 68 65 63 6b  dom setNameCheck
a3d0: 20 31 0a 0a 74 65 73 74 20 64 6f 6d 2d 37 2e 32   1..test dom-7.2
a3e0: 20 7b 73 65 74 4e 61 6d 65 43 68 65 63 6b 7d 20   {setNameCheck} 
a3f0: 7b 0a 20 20 20 20 73 65 74 20 72 65 73 75 6c 74  {.    set result
a400: 20 5b 63 61 74 63 68 20 7b 24 64 6f 63 20 63 72   [catch {$doc cr
a410: 65 61 74 65 45 6c 65 6d 65 6e 74 20 22 69 6e 76  eateElement "inv
a420: 61 6c 69 64 20 6e 61 6d 65 22 7d 20 65 72 72 4d  alid name"} errM
a430: 73 67 5d 0a 20 20 20 20 6c 61 70 70 65 6e 64 20  sg].    lappend 
a440: 72 65 73 75 6c 74 20 24 65 72 72 4d 73 67 0a 7d  result $errMsg.}
a450: 20 7b 31 20 7b 49 6e 76 61 6c 69 64 20 74 61 67   {1 {Invalid tag
a460: 20 6e 61 6d 65 20 27 69 6e 76 61 6c 69 64 20 6e   name 'invalid n
a470: 61 6d 65 27 7d 7d 0a 0a 74 65 73 74 20 64 6f 6d  ame'}}..test dom
a480: 2d 37 2e 33 20 7b 73 65 74 4e 61 6d 65 43 68 65  -7.3 {setNameChe
a490: 63 6b 7d 20 7b 0a 20 20 20 20 63 61 74 63 68 20  ck} {.    catch 
a4a0: 7b 24 64 6f 63 20 63 72 65 61 74 65 45 6c 65 6d  {$doc createElem
a4b0: 65 6e 74 20 22 76 61 6c 69 64 3a 6e 61 6d 65 22  ent "valid:name"
a4c0: 7d 0a 7d 20 7b 30 7d 0a 0a 74 65 73 74 20 64 6f  }.} {0}..test do
a4d0: 6d 2d 37 2e 34 20 7b 73 65 74 4e 61 6d 65 43 68  m-7.4 {setNameCh
a4e0: 65 63 6b 7d 20 7b 0a 20 20 20 20 63 61 74 63 68  eck} {.    catch
a4f0: 20 7b 24 64 6f 63 20 63 72 65 61 74 65 45 6c 65   {$doc createEle
a500: 6d 65 6e 74 20 22 76 61 6c 69 64 3a 3a 6e 61 6d  ment "valid::nam
a510: 65 22 7d 0a 7d 20 7b 30 7d 0a 0a 74 65 73 74 20  e"}.} {0}..test 
a520: 64 6f 6d 2d 37 2e 35 20 7b 73 65 74 4e 61 6d 65  dom-7.5 {setName
a530: 43 68 65 63 6b 7d 20 7b 0a 20 20 20 20 64 6f 6d  Check} {.    dom
a540: 20 73 65 74 4e 61 6d 65 43 68 65 63 6b 20 30 0a   setNameCheck 0.
a550: 20 20 20 20 73 65 74 20 72 65 73 75 6c 74 20 5b      set result [
a560: 63 61 74 63 68 20 7b 24 64 6f 63 20 63 72 65 61  catch {$doc crea
a570: 74 65 45 6c 65 6d 65 6e 74 20 22 69 6e 76 61 6c  teElement "inval
a580: 69 64 20 6e 61 6d 65 22 7d 20 65 72 72 4d 73 67  id name"} errMsg
a590: 5d 0a 20 20 20 20 23 20 73 65 74 20 62 61 63 6b  ].    # set back
a5a0: 20 74 6f 20 64 65 66 61 75 6c 74 0a 20 20 20 20   to default.    
a5b0: 64 6f 6d 20 73 65 74 4e 61 6d 65 43 68 65 63 6b  dom setNameCheck
a5c0: 20 31 0a 20 20 20 20 73 65 74 20 72 65 73 75 6c   1.    set resul
a5d0: 74 0a 7d 20 7b 30 7d 0a 0a 74 65 73 74 20 64 6f  t.} {0}..test do
a5e0: 6d 2d 37 2e 36 20 7b 73 65 74 4e 61 6d 65 43 68  m-7.6 {setNameCh
a5f0: 65 63 6b 7d 20 7b 0a 20 20 20 20 73 65 74 20 72  eck} {.    set r
a600: 65 73 75 6c 74 20 5b 63 61 74 63 68 20 7b 24 64  esult [catch {$d
a610: 6f 63 20 63 72 65 61 74 65 45 6c 65 6d 65 6e 74  oc createElement
a620: 4e 53 20 22 64 75 6d 6d 79 6e 73 22 20 22 69 6e  NS "dummyns" "in
a630: 76 61 6c 69 64 20 6e 61 6d 65 22 7d 20 65 72 72  valid name"} err
a640: 4d 73 67 5d 0a 20 20 20 20 6c 61 70 70 65 6e 64  Msg].    lappend
a650: 20 72 65 73 75 6c 74 20 24 65 72 72 4d 73 67 0a   result $errMsg.
a660: 7d 20 7b 31 20 7b 49 6e 76 61 6c 69 64 20 66 75  } {1 {Invalid fu
a670: 6c 6c 20 71 75 61 6c 69 66 69 65 64 20 74 61 67  ll qualified tag
a680: 20 6e 61 6d 65 20 27 69 6e 76 61 6c 69 64 20 6e   name 'invalid n
a690: 61 6d 65 27 7d 7d 0a 0a 74 65 73 74 20 64 6f 6d  ame'}}..test dom
a6a0: 2d 37 2e 37 20 7b 73 65 74 4e 61 6d 65 43 68 65  -7.7 {setNameChe
a6b0: 63 6b 7d 20 7b 0a 20 20 20 20 63 61 74 63 68 20  ck} {.    catch 
a6c0: 7b 24 64 6f 63 20 63 72 65 61 74 65 45 6c 65 6d  {$doc createElem
a6d0: 65 6e 74 4e 53 20 22 64 75 6d 6d 79 6e 73 22 20  entNS "dummyns" 
a6e0: 22 76 61 6c 69 64 3a 6e 61 6d 65 22 7d 0a 7d 20  "valid:name"}.} 
a6f0: 7b 30 7d 0a 0a 74 65 73 74 20 64 6f 6d 2d 37 2e  {0}..test dom-7.
a700: 38 20 7b 73 65 74 4e 61 6d 65 43 68 65 63 6b 7d  8 {setNameCheck}
a710: 20 7b 0a 20 20 20 20 73 65 74 20 72 65 73 75 6c   {.    set resul
a720: 74 20 5b 63 61 74 63 68 20 7b 24 64 6f 63 20 63  t [catch {$doc c
a730: 72 65 61 74 65 45 6c 65 6d 65 6e 74 4e 53 20 22  reateElementNS "
a740: 64 75 6d 6d 79 6e 73 22 20 22 69 6e 76 61 6c 69  dummyns" "invali
a750: 64 3a 3a 6e 61 6d 65 22 7d 20 65 72 72 4d 73 67  d::name"} errMsg
a760: 5d 0a 20 20 20 20 6c 61 70 70 65 6e 64 20 72 65  ].    lappend re
a770: 73 75 6c 74 20 24 65 72 72 4d 73 67 0a 7d 20 7b  sult $errMsg.} {
a780: 31 20 7b 49 6e 76 61 6c 69 64 20 66 75 6c 6c 20  1 {Invalid full 
a790: 71 75 61 6c 69 66 69 65 64 20 74 61 67 20 6e 61  qualified tag na
a7a0: 6d 65 20 27 69 6e 76 61 6c 69 64 3a 3a 6e 61 6d  me 'invalid::nam
a7b0: 65 27 7d 7d 0a 0a 74 65 73 74 20 64 6f 6d 2d 37  e'}}..test dom-7
a7c0: 2e 39 20 7b 73 65 74 4e 61 6d 65 43 68 65 63 6b  .9 {setNameCheck
a7d0: 7d 20 7b 0a 20 20 20 20 64 6f 6d 20 73 65 74 4e  } {.    dom setN
a7e0: 61 6d 65 43 68 65 63 6b 20 30 0a 20 20 20 20 73  ameCheck 0.    s
a7f0: 65 74 20 72 65 73 75 6c 74 20 5b 63 61 74 63 68  et result [catch
a800: 20 7b 24 64 6f 63 20 63 72 65 61 74 65 45 6c 65   {$doc createEle
a810: 6d 65 6e 74 4e 53 20 22 64 75 6d 6d 79 6e 73 22  mentNS "dummyns"
a820: 20 22 69 6e 76 61 6c 69 64 20 6e 61 6d 65 22 7d   "invalid name"}
a830: 20 65 72 72 4d 73 67 5d 0a 20 20 20 20 23 20 73   errMsg].    # s
a840: 65 74 20 62 61 63 6b 20 74 6f 20 64 65 66 61 75  et back to defau
a850: 6c 74 0a 20 20 20 20 64 6f 6d 20 73 65 74 4e 61  lt.    dom setNa
a860: 6d 65 43 68 65 63 6b 20 31 0a 20 20 20 20 73 65  meCheck 1.    se
a870: 74 20 72 65 73 75 6c 74 0a 7d 20 7b 30 7d 0a 0a  t result.} {0}..
a880: 74 65 73 74 20 64 6f 6d 2d 37 2e 31 30 20 7b 73  test dom-7.10 {s
a890: 65 74 54 65 78 74 43 68 65 63 6b 7d 20 7b 0a 20  etTextCheck} {. 
a8a0: 20 20 20 73 65 74 20 72 65 73 75 6c 74 20 5b 63     set result [c
a8b0: 61 74 63 68 20 7b 24 64 6f 63 20 63 72 65 61 74  atch {$doc creat
a8c0: 65 43 6f 6d 6d 65 6e 74 20 22 76 61 6c 69 64 20  eComment "valid 
a8d0: 63 6f 6d 6d 65 6e 74 22 7d 5d 0a 20 20 20 20 6c  comment"}].    l
a8e0: 61 70 70 65 6e 64 20 72 65 73 75 6c 74 20 5b 63  append result [c
a8f0: 61 74 63 68 20 7b 24 64 6f 63 20 63 72 65 61 74  atch {$doc creat
a900: 65 43 6f 6d 6d 65 6e 74 20 22 69 6e 76 61 6c 69  eComment "invali
a910: 64 20 2d 2d 20 63 6f 6d 6d 65 6e 74 22 7d 5d 0a  d -- comment"}].
a920: 20 20 20 20 64 6f 6d 20 73 65 74 54 65 78 74 43      dom setTextC
a930: 68 65 63 6b 20 30 0a 20 20 20 20 6c 61 70 70 65  heck 0.    lappe
a940: 6e 64 20 72 65 73 75 6c 74 20 5b 63 61 74 63 68  nd result [catch
a950: 20 7b 24 64 6f 63 20 63 72 65 61 74 65 43 6f 6d   {$doc createCom
a960: 6d 65 6e 74 20 22 69 6e 76 61 6c 69 64 20 2d 2d  ment "invalid --
a970: 20 63 6f 6d 6d 65 6e 74 22 7d 5d 0a 20 20 20 20   comment"}].    
a980: 64 6f 6d 20 73 65 74 54 65 78 74 43 68 65 63 6b  dom setTextCheck
a990: 20 31 0a 20 20 20 20 73 65 74 20 72 65 73 75 6c   1.    set resul
a9a0: 74 0a 7d 20 7b 30 20 31 20 30 7d 0a 0a 74 65 73  t.} {0 1 0}..tes
a9b0: 74 20 64 6f 6d 2d 37 2e 31 31 20 7b 73 65 74 54  t dom-7.11 {setT
a9c0: 65 78 74 43 68 65 63 6b 7d 20 7b 0a 20 20 20 20  extCheck} {.    
a9d0: 73 65 74 20 72 65 73 75 6c 74 20 5b 63 61 74 63  set result [catc
a9e0: 68 20 7b 24 64 6f 63 20 63 72 65 61 74 65 43 44  h {$doc createCD
a9f0: 41 54 41 53 65 63 74 69 6f 6e 20 22 3c 76 61 6c  ATASection "<val
aa00: 69 64 2f 3e 22 7d 5d 0a 20 20 20 20 6c 61 70 70  id/>"}].    lapp
aa10: 65 6e 64 20 72 65 73 75 6c 74 20 5b 63 61 74 63  end result [catc
aa20: 68 20 7b 24 64 6f 63 20 63 72 65 61 74 65 43 44  h {$doc createCD
aa30: 41 54 41 53 65 63 74 69 6f 6e 20 22 3c 69 6e 76  ATASection "<inv
aa40: 61 6c 69 64 3e 5d 5d 3e 3c 2f 69 6e 76 61 6c 69  alid>]]></invali
aa50: 64 22 7d 5d 0a 20 20 20 20 64 6f 6d 20 73 65 74  d"}].    dom set
aa60: 54 65 78 74 43 68 65 63 6b 20 30 0a 20 20 20 20  TextCheck 0.    
aa70: 6c 61 70 70 65 6e 64 20 72 65 73 75 6c 74 20 5b  lappend result [
aa80: 63 61 74 63 68 20 7b 24 64 6f 63 20 63 72 65 61  catch {$doc crea
aa90: 74 65 43 44 41 54 41 53 65 63 74 69 6f 6e 20 22  teCDATASection "
aaa0: 3c 69 6e 76 61 6c 69 64 3e 5d 5d 3e 3c 2f 69 6e  <invalid>]]></in
aab0: 76 61 6c 69 64 22 7d 5d 0a 20 20 20 20 64 6f 6d  valid"}].    dom
aac0: 20 73 65 74 54 65 78 74 43 68 65 63 6b 20 31 0a   setTextCheck 1.
aad0: 20 20 20 20 73 65 74 20 72 65 73 75 6c 74 0a 7d      set result.}
aae0: 20 7b 30 20 31 20 30 7d 0a 0a 74 65 73 74 20 64   {0 1 0}..test d
aaf0: 6f 6d 2d 37 2e 31 32 20 7b 73 65 74 54 65 78 74  om-7.12 {setText
ab00: 43 68 65 63 6b 7d 20 7b 0a 20 20 20 20 73 65 74  Check} {.    set
ab10: 20 72 65 73 75 6c 74 20 5b 63 61 74 63 68 20 7b   result [catch {
ab20: 24 64 6f 63 20 63 72 65 61 74 65 54 65 78 74 4e  $doc createTextN
ab30: 6f 64 65 20 22 64 61 74 61 22 7d 5d 0a 20 20 20  ode "data"}].   
ab40: 20 6c 61 70 70 65 6e 64 20 72 65 73 75 6c 74 20   lappend result 
ab50: 5b 63 61 74 63 68 20 7b 24 64 6f 63 20 63 72 65  [catch {$doc cre
ab60: 61 74 65 54 65 78 74 4e 6f 64 65 20 22 6e 6f 74  ateTextNode "not
ab70: 20 58 4d 4c 20 5c 75 30 30 30 32 20 43 68 61 72   XML \u0002 Char
ab80: 20 64 61 74 61 22 7d 5d 0a 20 20 20 20 64 6f 6d   data"}].    dom
ab90: 20 73 65 74 54 65 78 74 43 68 65 63 6b 20 30 0a   setTextCheck 0.
aba0: 20 20 20 20 6c 61 70 70 65 6e 64 20 72 65 73 75      lappend resu
abb0: 6c 74 20 5b 63 61 74 63 68 20 7b 24 64 6f 63 20  lt [catch {$doc 
abc0: 63 72 65 61 74 65 54 65 78 74 4e 6f 64 65 20 22  createTextNode "
abd0: 6e 6f 74 20 58 4d 4c 20 5c 75 30 30 30 32 20 43  not XML \u0002 C
abe0: 68 61 72 20 64 61 74 61 22 7d 5d 0a 20 20 20 20  har data"}].    
abf0: 64 6f 6d 20 73 65 74 54 65 78 74 43 68 65 63 6b  dom setTextCheck
ac00: 20 31 0a 20 20 20 20 73 65 74 20 72 65 73 75 6c   1.    set resul
ac10: 74 0a 7d 20 7b 30 20 31 20 30 7d 0a 0a 74 65 73  t.} {0 1 0}..tes
ac20: 74 20 64 6f 6d 2d 37 2e 31 33 20 7b 73 65 74 4e  t dom-7.13 {setN
ac30: 61 6d 65 43 68 65 63 6b 7d 20 7b 0a 20 20 20 20  ameCheck} {.    
ac40: 73 65 74 20 72 65 73 75 6c 74 20 5b 63 61 74 63  set result [catc
ac50: 68 20 7b 24 64 6f 63 20 63 72 65 61 74 65 50 72  h {$doc createPr
ac60: 6f 63 65 73 73 69 6e 67 49 6e 73 74 72 75 63 74  ocessingInstruct
ac70: 69 6f 6e 20 22 74 61 72 67 65 74 22 20 22 64 61  ion "target" "da
ac80: 74 61 22 7d 5d 0a 20 20 20 20 6c 61 70 70 65 6e  ta"}].    lappen
ac90: 64 20 72 65 73 75 6c 74 20 5b 63 61 74 63 68 20  d result [catch 
aca0: 7b 24 64 6f 63 20 63 72 65 61 74 65 50 72 6f 63  {$doc createProc
acb0: 65 73 73 69 6e 67 49 6e 73 74 72 75 63 74 69 6f  essingInstructio
acc0: 6e 20 22 74 61 72 20 67 65 74 22 20 22 64 61 74  n "tar get" "dat
acd0: 61 22 7d 5d 0a 20 20 20 20 6c 61 70 70 65 6e 64  a"}].    lappend
ace0: 20 72 65 73 75 6c 74 20 5b 63 61 74 63 68 20 7b   result [catch {
acf0: 24 64 6f 63 20 63 72 65 61 74 65 50 72 6f 63 65  $doc createProce
ad00: 73 73 69 6e 67 49 6e 73 74 72 75 63 74 69 6f 6e  ssingInstruction
ad10: 20 22 78 4d 6c 22 20 22 64 61 74 61 22 7d 5d 0a   "xMl" "data"}].
ad20: 20 20 20 20 64 6f 6d 20 73 65 74 4e 61 6d 65 43      dom setNameC
ad30: 68 65 63 6b 20 30 0a 20 20 20 20 6c 61 70 70 65  heck 0.    lappe
ad40: 6e 64 20 72 65 73 75 6c 74 20 5b 63 61 74 63 68  nd result [catch
ad50: 20 7b 24 64 6f 63 20 63 72 65 61 74 65 50 72 6f   {$doc createPro
ad60: 63 65 73 73 69 6e 67 49 6e 73 74 72 75 63 74 69  cessingInstructi
ad70: 6f 6e 20 22 74 61 72 20 67 65 74 22 20 22 64 61  on "tar get" "da
ad80: 74 61 22 7d 5d 0a 20 20 20 20 6c 61 70 70 65 6e  ta"}].    lappen
ad90: 64 20 72 65 73 75 6c 74 20 5b 63 61 74 63 68 20  d result [catch 
ada0: 7b 24 64 6f 63 20 63 72 65 61 74 65 50 72 6f 63  {$doc createProc
adb0: 65 73 73 69 6e 67 49 6e 73 74 72 75 63 74 69 6f  essingInstructio
adc0: 6e 20 22 78 4d 6c 22 20 22 64 61 74 61 22 7d 5d  n "xMl" "data"}]
add0: 0a 20 20 20 20 64 6f 6d 20 73 65 74 4e 61 6d 65  .    dom setName
ade0: 43 68 65 63 6b 20 31 0a 20 20 20 20 73 65 74 20  Check 1.    set 
adf0: 72 65 73 75 6c 74 0a 7d 20 7b 30 20 31 20 31 20  result.} {0 1 1 
ae00: 30 20 30 7d 0a 0a 73 65 74 20 72 6f 6f 74 20 5b  0 0}..set root [
ae10: 24 64 6f 63 20 64 6f 63 75 6d 65 6e 74 45 6c 65  $doc documentEle
ae20: 6d 65 6e 74 5d 0a 0a 74 65 73 74 20 64 6f 6d 2d  ment]..test dom-
ae30: 37 2e 31 34 20 7b 73 65 74 4e 61 6d 65 43 68 65  7.14 {setNameChe
ae40: 63 6b 7d 20 7b 0a 20 20 20 20 73 65 74 20 72 65  ck} {.    set re
ae50: 73 75 6c 74 20 5b 63 61 74 63 68 20 7b 24 72 6f  sult [catch {$ro
ae60: 6f 74 20 61 70 70 65 6e 64 46 72 6f 6d 4c 69 73  ot appendFromLis
ae70: 74 20 7b 22 61 20 62 22 20 7b 7d 20 7b 7d 7d 7d  t {"a b" {} {}}}
ae80: 20 65 72 72 4d 73 67 5d 0a 20 20 20 20 6c 61 70   errMsg].    lap
ae90: 70 65 6e 64 20 72 65 73 75 6c 74 20 24 65 72 72  pend result $err
aea0: 4d 73 67 0a 20 20 20 20 64 6f 6d 20 73 65 74 4e  Msg.    dom setN
aeb0: 61 6d 65 43 68 65 63 6b 20 30 0a 20 20 20 20 6c  ameCheck 0.    l
aec0: 61 70 70 65 6e 64 20 72 65 73 75 6c 74 20 5b 63  append result [c
aed0: 61 74 63 68 20 7b 24 72 6f 6f 74 20 61 70 70 65  atch {$root appe
aee0: 6e 64 46 72 6f 6d 4c 69 73 74 20 7b 22 61 20 62  ndFromList {"a b
aef0: 22 20 7b 7d 20 7b 7d 7d 7d 5d 0a 20 20 20 20 64  " {} {}}}].    d
af00: 6f 6d 20 73 65 74 4e 61 6d 65 43 68 65 63 6b 20  om setNameCheck 
af10: 31 0a 20 20 20 20 73 65 74 20 72 65 73 75 6c 74  1.    set result
af20: 0a 7d 20 7b 31 20 7b 49 6e 76 61 6c 69 64 20 74  .} {1 {Invalid t
af30: 61 67 20 6e 61 6d 65 20 27 61 20 62 27 7d 20 30  ag name 'a b'} 0
af40: 7d 0a 0a 74 65 73 74 20 64 6f 6d 2d 37 2e 31 35  }..test dom-7.15
af50: 20 7b 73 65 74 4e 61 6d 65 43 68 65 63 6b 7d 20   {setNameCheck} 
af60: 7b 0a 20 20 20 20 73 65 74 20 72 65 73 75 6c 74  {.    set result
af70: 20 5b 63 61 74 63 68 20 7b 24 72 6f 6f 74 20 61   [catch {$root a
af80: 70 70 65 6e 64 46 72 6f 6d 4c 69 73 74 20 7b 61  ppendFromList {a
af90: 20 7b 61 74 74 31 20 22 61 74 74 31 20 76 61 6c   {att1 "att1 val
afa0: 75 65 22 20 22 61 74 74 20 32 22 20 22 61 74 74  ue" "att 2" "att
afb0: 32 20 76 61 6c 75 65 22 7d 20 7b 7d 7d 7d 20 65  2 value"} {}}} e
afc0: 72 72 4d 73 67 5d 0a 20 20 20 20 6c 61 70 70 65  rrMsg].    lappe
afd0: 6e 64 20 72 65 73 75 6c 74 20 24 65 72 72 4d 73  nd result $errMs
afe0: 67 0a 20 20 20 20 64 6f 6d 20 73 65 74 4e 61 6d  g.    dom setNam
aff0: 65 43 68 65 63 6b 20 30 0a 20 20 20 20 6c 61 70  eCheck 0.    lap
b000: 70 65 6e 64 20 72 65 73 75 6c 74 20 5b 63 61 74  pend result [cat
b010: 63 68 20 7b 24 72 6f 6f 74 20 61 70 70 65 6e 64  ch {$root append
b020: 46 72 6f 6d 4c 69 73 74 20 7b 61 20 7b 61 74 74  FromList {a {att
b030: 31 20 22 61 74 74 31 20 76 61 6c 75 65 22 20 22  1 "att1 value" "
b040: 61 74 74 20 32 22 20 22 61 74 74 32 20 76 61 6c  att 2" "att2 val
b050: 75 65 22 7d 20 7b 7d 7d 7d 5d 0a 20 20 20 20 64  ue"} {}}}].    d
b060: 6f 6d 20 73 65 74 4e 61 6d 65 43 68 65 63 6b 20  om setNameCheck 
b070: 31 0a 20 20 20 20 73 65 74 20 72 65 73 75 6c 74  1.    set result
b080: 0a 7d 20 7b 31 20 7b 49 6e 76 61 6c 69 64 20 61  .} {1 {Invalid a
b090: 74 74 72 69 62 75 74 65 20 6e 61 6d 65 20 27 61  ttribute name 'a
b0a0: 74 74 20 32 27 7d 20 30 7d 0a 0a 74 65 73 74 20  tt 2'} 0}..test 
b0b0: 64 6f 6d 2d 37 2e 31 36 20 7b 73 65 74 54 65 78  dom-7.16 {setTex
b0c0: 74 43 68 65 63 6b 7d 20 7b 0a 20 20 20 20 73 65  tCheck} {.    se
b0d0: 74 20 72 65 73 75 6c 74 20 5b 63 61 74 63 68 20  t result [catch 
b0e0: 7b 24 72 6f 6f 74 20 61 70 70 65 6e 64 46 72 6f  {$root appendFro
b0f0: 6d 4c 69 73 74 20 7b 61 20 7b 61 74 74 31 20 22  mList {a {att1 "
b100: 61 74 74 31 20 76 61 6c 75 65 22 20 22 61 74 74  att1 value" "att
b110: 32 22 20 22 61 74 74 32 20 76 61 6c 75 65 20 5c  2" "att2 value \
b120: 75 30 30 30 32 22 7d 20 7b 7d 7d 7d 20 65 72 72  u0002"} {}}} err
b130: 4d 73 67 5d 0a 20 20 20 20 6c 61 70 70 65 6e 64  Msg].    lappend
b140: 20 72 65 73 75 6c 74 20 24 65 72 72 4d 73 67 0a   result $errMsg.
b150: 20 20 20 20 64 6f 6d 20 73 65 74 54 65 78 74 43      dom setTextC
b160: 68 65 63 6b 20 30 0a 20 20 20 20 6c 61 70 70 65  heck 0.    lappe
b170: 6e 64 20 72 65 73 75 6c 74 20 5b 63 61 74 63 68  nd result [catch
b180: 20 7b 24 72 6f 6f 74 20 61 70 70 65 6e 64 46 72   {$root appendFr
b190: 6f 6d 4c 69 73 74 20 7b 61 20 7b 61 74 74 31 20  omList {a {att1 
b1a0: 22 61 74 74 31 20 76 61 6c 75 65 22 20 22 61 74  "att1 value" "at
b1b0: 74 32 22 20 22 61 74 74 32 20 76 61 6c 75 65 20  t2" "att2 value 
b1c0: 5c 75 30 30 30 32 22 7d 20 7b 7d 7d 7d 5d 0a 20  \u0002"} {}}}]. 
b1d0: 20 20 20 64 6f 6d 20 73 65 74 54 65 78 74 43 68     dom setTextCh
b1e0: 65 63 6b 20 31 0a 20 20 20 20 73 65 74 20 72 65  eck 1.    set re
b1f0: 73 75 6c 74 0a 7d 20 5b 6c 69 73 74 20 31 20 22  sult.} [list 1 "
b200: 49 6e 76 61 6c 69 64 20 61 74 74 72 69 62 75 74  Invalid attribut
b210: 65 20 76 61 6c 75 65 20 27 61 74 74 32 20 76 61  e value 'att2 va
b220: 6c 75 65 20 5c 75 30 30 30 32 27 22 20 30 5d 0a  lue \u0002'" 0].
b230: 0a 74 65 73 74 20 64 6f 6d 2d 37 2e 31 37 20 7b  .test dom-7.17 {
b240: 73 65 74 54 65 78 74 43 68 65 63 6b 7d 20 7b 0a  setTextCheck} {.
b250: 20 20 20 20 73 65 74 20 72 65 73 75 6c 74 20 5b      set result [
b260: 63 61 74 63 68 20 7b 24 72 6f 6f 74 20 61 70 70  catch {$root app
b270: 65 6e 64 46 72 6f 6d 4c 69 73 74 20 7b 5c 23 74  endFromList {\#t
b280: 65 78 74 20 22 66 6f 6f 20 5c 75 30 30 30 32 22  ext "foo \u0002"
b290: 7d 7d 20 65 72 72 4d 73 67 5d 0a 20 20 20 20 6c  }} errMsg].    l
b2a0: 61 70 70 65 6e 64 20 72 65 73 75 6c 74 20 24 65  append result $e
b2b0: 72 72 4d 73 67 0a 20 20 20 20 64 6f 6d 20 73 65  rrMsg.    dom se
b2c0: 74 54 65 78 74 43 68 65 63 6b 20 30 0a 20 20 20  tTextCheck 0.   
b2d0: 20 6c 61 70 70 65 6e 64 20 72 65 73 75 6c 74 20   lappend result 
b2e0: 5b 63 61 74 63 68 20 7b 24 72 6f 6f 74 20 61 70  [catch {$root ap
b2f0: 70 65 6e 64 46 72 6f 6d 4c 69 73 74 20 7b 5c 23  pendFromList {\#
b300: 74 65 78 74 20 22 66 6f 6f 20 5c 75 30 30 30 32  text "foo \u0002
b310: 22 7d 7d 5d 0a 20 20 20 20 64 6f 6d 20 73 65 74  "}}].    dom set
b320: 54 65 78 74 43 68 65 63 6b 20 31 0a 20 20 20 20  TextCheck 1.    
b330: 73 65 74 20 72 65 73 75 6c 74 20 20 20 20 0a 7d  set result    .}
b340: 20 5b 6c 69 73 74 20 31 20 22 49 6e 76 61 6c 69   [list 1 "Invali
b350: 64 20 74 65 78 74 20 76 61 6c 75 65 20 27 66 6f  d text value 'fo
b360: 6f 20 5c 75 30 30 30 32 27 22 20 30 5d 0a 0a 24  o \u0002'" 0]..$
b370: 64 6f 63 20 64 65 6c 65 74 65 0a 0a 74 65 73 74  doc delete..test
b380: 20 64 6f 6d 2d 37 2e 31 38 20 7b 73 65 74 54 65   dom-7.18 {setTe
b390: 78 74 43 68 65 63 6b 20 61 6e 64 20 61 70 70 65  xtCheck and appe
b3a0: 6e 64 46 72 6f 6d 53 63 72 69 70 74 7d 20 7b 0a  ndFromScript} {.
b3b0: 20 20 20 20 73 65 74 20 64 6f 63 20 5b 64 6f 6d      set doc [dom
b3c0: 20 63 72 65 61 74 65 44 6f 63 75 6d 65 6e 74 4e   createDocumentN
b3d0: 6f 64 65 5d 0a 20 20 20 20 64 6f 6d 20 73 65 74  ode].    dom set
b3e0: 54 65 78 74 43 68 65 63 6b 20 30 0a 20 20 20 20  TextCheck 0.    
b3f0: 6e 61 6d 65 73 70 61 63 65 20 65 76 61 6c 20 6e  namespace eval n
b400: 6f 64 65 43 6d 64 73 20 7b 0a 20 20 20 20 20 20  odeCmds {.      
b410: 20 20 64 6f 6d 20 63 72 65 61 74 65 4e 6f 64 65    dom createNode
b420: 43 6d 64 20 65 6c 65 6d 65 6e 74 4e 6f 64 65 20  Cmd elementNode 
b430: 64 6f 63 0a 20 20 20 20 20 20 20 20 64 6f 6d 20  doc.        dom 
b440: 63 72 65 61 74 65 4e 6f 64 65 43 6d 64 20 74 65  createNodeCmd te
b450: 78 74 4e 6f 64 65 20 74 0a 20 20 20 20 7d 0a 20  xtNode t.    }. 
b460: 20 20 20 24 64 6f 63 20 61 70 70 65 6e 64 46 72     $doc appendFr
b470: 6f 6d 53 63 72 69 70 74 20 7b 0a 20 20 20 20 20  omScript {.     
b480: 20 20 20 6e 6f 64 65 43 6d 64 73 3a 3a 64 6f 63     nodeCmds::doc
b490: 20 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 6e   {.            n
b4a0: 6f 64 65 43 6d 64 73 3a 3a 74 20 22 66 6f 6f 5c  odeCmds::t "foo\
b4b0: 75 30 30 30 33 62 61 72 22 0a 20 20 20 20 20 20  u0003bar".      
b4c0: 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 64 6f    }.    }.    do
b4d0: 6d 20 73 65 74 54 65 78 74 43 68 65 63 6b 20 31  m setTextCheck 1
b4e0: 0a 20 20 20 20 73 65 74 20 72 65 73 75 6c 74 20  .    set result 
b4f0: 5b 24 64 6f 63 20 61 73 58 4d 4c 20 2d 69 6e 64  [$doc asXML -ind
b500: 65 6e 74 20 6e 6f 6e 65 5d 0a 20 20 20 20 24 64  ent none].    $d
b510: 6f 63 20 64 65 6c 65 74 65 0a 20 20 20 20 73 65  oc delete.    se
b520: 74 20 72 65 73 75 6c 74 0a 7d 20 22 3c 64 6f 63  t result.} "<doc
b530: 3e 66 6f 6f 5c 75 30 30 30 33 62 61 72 3c 2f 64  >foo\u0003bar</d
b540: 6f 63 3e 22 0a 0a 74 65 73 74 20 64 6f 6d 2d 37  oc>"..test dom-7
b550: 2e 31 39 20 7b 73 65 74 54 65 78 74 43 68 65 63  .19 {setTextChec
b560: 6b 20 61 6e 64 20 61 70 70 65 6e 64 46 72 6f 6d  k and appendFrom
b570: 53 63 72 69 70 74 20 2d 20 73 65 74 54 65 78 74  Script - setText
b580: 43 68 65 63 6b 20 73 74 61 74 65 20 61 74 20 63  Check state at c
b590: 72 65 61 74 65 20 74 69 6d 65 20 69 73 20 63 72  reate time is cr
b5a0: 75 63 69 61 6c 7d 20 7b 0a 20 20 20 20 73 65 74  ucial} {.    set
b5b0: 20 64 6f 63 20 5b 64 6f 6d 20 63 72 65 61 74 65   doc [dom create
b5c0: 44 6f 63 75 6d 65 6e 74 4e 6f 64 65 5d 0a 20 20  DocumentNode].  
b5d0: 20 20 6e 61 6d 65 73 70 61 63 65 20 65 76 61 6c    namespace eval
b5e0: 20 6e 6f 64 65 43 6d 64 73 20 7b 0a 20 20 20 20   nodeCmds {.    
b5f0: 20 20 20 20 64 6f 6d 20 63 72 65 61 74 65 4e 6f      dom createNo
b600: 64 65 43 6d 64 20 65 6c 65 6d 65 6e 74 4e 6f 64  deCmd elementNod
b610: 65 20 64 6f 63 0a 20 20 20 20 20 20 20 20 64 6f  e doc.        do
b620: 6d 20 63 72 65 61 74 65 4e 6f 64 65 43 6d 64 20  m createNodeCmd 
b630: 74 65 78 74 4e 6f 64 65 20 74 0a 20 20 20 20 7d  textNode t.    }
b640: 0a 20 20 20 20 64 6f 6d 20 73 65 74 54 65 78 74  .    dom setText
b650: 43 68 65 63 6b 20 30 0a 20 20 20 20 73 65 74 20  Check 0.    set 
b660: 72 65 73 75 6c 74 20 5b 63 61 74 63 68 20 7b 24  result [catch {$
b670: 64 6f 63 20 61 70 70 65 6e 64 46 72 6f 6d 53 63  doc appendFromSc
b680: 72 69 70 74 20 7b 0a 20 20 20 20 20 20 20 20 6e  ript {.        n
b690: 6f 64 65 43 6d 64 73 3a 3a 64 6f 63 20 7b 0a 20  odeCmds::doc {. 
b6a0: 20 20 20 20 20 20 20 20 20 20 20 6e 6f 64 65 43             nodeC
b6b0: 6d 64 73 3a 3a 74 20 22 66 6f 6f 5c 75 30 30 30  mds::t "foo\u000
b6c0: 33 62 61 72 22 0a 20 20 20 20 20 20 20 20 7d 0a  3bar".        }.
b6d0: 20 20 20 20 7d 7d 20 65 72 72 4d 73 67 5d 0a 20      }} errMsg]. 
b6e0: 20 20 20 64 6f 6d 20 73 65 74 54 65 78 74 43 68     dom setTextCh
b6f0: 65 63 6b 20 31 0a 20 20 20 20 24 64 6f 63 20 64  eck 1.    $doc d
b700: 65 6c 65 74 65 0a 20 20 20 20 6c 61 70 70 65 6e  elete.    lappen
b710: 64 20 72 65 73 75 6c 74 20 24 65 72 72 4d 73 67  d result $errMsg
b720: 0a 7d 20 5b 6c 69 73 74 20 31 20 22 49 6e 76 61  .} [list 1 "Inva
b730: 6c 69 64 20 74 65 78 74 20 76 61 6c 75 65 20 27  lid text value '
b740: 66 6f 6f 5c 75 30 30 30 33 62 61 72 27 22 5d 0a  foo\u0003bar'"].
b750: 0a 74 65 73 74 20 64 6f 6d 2d 37 2e 31 39 20 7b  .test dom-7.19 {
b760: 73 65 74 4e 61 6d 65 43 68 65 63 6b 20 2f 20 63  setNameCheck / c
b770: 72 65 61 74 65 44 6f 63 75 6d 65 6e 74 7d 20 7b  reateDocument} {
b780: 0a 20 20 20 20 64 6f 6d 20 73 65 74 4e 61 6d 65  .    dom setName
b790: 43 68 65 63 6b 20 30 0a 20 20 20 20 64 6f 6d 20  Check 0.    dom 
b7a0: 63 72 65 61 74 65 44 6f 63 75 6d 65 6e 74 20 22  createDocument "
b7b0: 66 6f 6f 20 62 61 72 22 20 64 6f 63 0a 20 20 20  foo bar" doc.   
b7c0: 20 73 65 74 20 72 65 73 75 6c 74 20 5b 24 64 6f   set result [$do
b7d0: 63 20 61 73 58 4d 4c 20 2d 69 6e 64 65 6e 74 20  c asXML -indent 
b7e0: 6e 6f 6e 65 5d 0a 20 20 20 20 24 64 6f 63 20 64  none].    $doc d
b7f0: 65 6c 65 74 65 0a 20 20 20 20 64 6f 6d 20 73 65  elete.    dom se
b800: 74 4e 61 6d 65 43 68 65 63 6b 20 31 0a 20 20 20  tNameCheck 1.   
b810: 20 73 65 74 20 72 65 73 75 6c 74 0a 7d 20 7b 3c   set result.} {<
b820: 66 6f 6f 20 62 61 72 2f 3e 7d 0a 20 20 20 20 0a  foo bar/>}.    .
b830: 0a 74 65 73 74 20 64 6f 6d 2d 38 2e 31 20 7b 63  .test dom-8.1 {c
b840: 72 65 61 74 65 44 6f 63 75 6d 65 6e 74 4e 6f 64  reateDocumentNod
b850: 65 7d 20 7b 0a 20 20 20 20 73 65 74 20 72 65 73  e} {.    set res
b860: 75 6c 74 20 5b 63 61 74 63 68 20 7b 64 6f 6d 20  ult [catch {dom 
b870: 63 72 65 61 74 65 44 6f 63 75 6d 65 6e 74 4e 6f  createDocumentNo
b880: 64 65 20 66 6f 6f 20 62 61 72 7d 5d 0a 7d 20 7b  de foo bar}].} {
b890: 31 7d 0a 0a 74 65 73 74 20 64 6f 6d 2d 38 2e 32  1}..test dom-8.2
b8a0: 20 7b 63 72 65 61 74 65 44 6f 63 75 6d 65 6e 74   {createDocument
b8b0: 4e 6f 64 65 7d 20 7b 0a 20 20 20 20 73 65 74 20  Node} {.    set 
b8c0: 64 6f 63 4e 6f 64 65 20 5b 64 6f 6d 20 63 72 65  docNode [dom cre
b8d0: 61 74 65 44 6f 63 75 6d 65 6e 74 4e 6f 64 65 5d  ateDocumentNode]
b8e0: 0a 20 20 20 20 73 65 74 20 72 65 73 75 6c 74 20  .    set result 
b8f0: 5b 24 64 6f 63 4e 6f 64 65 20 61 73 58 4d 4c 20  [$docNode asXML 
b900: 2d 69 6e 64 65 6e 74 20 6e 6f 6e 65 5d 0a 20 20  -indent none].  
b910: 20 20 24 64 6f 63 4e 6f 64 65 20 64 65 6c 65 74    $docNode delet
b920: 65 0a 20 20 20 20 73 65 74 20 72 65 73 75 6c 74  e.    set result
b930: 0a 7d 20 7b 7d 0a 0a 74 65 73 74 20 64 6f 6d 2d  .} {}..test dom-
b940: 38 2e 33 20 7b 63 72 65 61 74 65 44 6f 63 75 6d  8.3 {createDocum
b950: 65 6e 74 4e 6f 64 65 7d 20 7b 0a 20 20 20 20 64  entNode} {.    d
b960: 6f 6d 20 63 72 65 61 74 65 44 6f 63 75 6d 65 6e  om createDocumen
b970: 74 4e 6f 64 65 20 64 6f 63 4e 6f 64 65 0a 20 20  tNode docNode.  
b980: 20 20 73 65 74 20 72 65 73 75 6c 74 20 5b 24 64    set result [$d
b990: 6f 63 4e 6f 64 65 20 61 73 58 4d 4c 20 2d 69 6e  ocNode asXML -in
b9a0: 64 65 6e 74 20 6e 6f 6e 65 5d 0a 20 20 20 20 24  dent none].    $
b9b0: 64 6f 63 4e 6f 64 65 20 64 65 6c 65 74 65 0a 20  docNode delete. 
b9c0: 20 20 20 73 65 74 20 72 65 73 75 6c 74 0a 7d 20     set result.} 
b9d0: 7b 7d 0a 0a 74 65 73 74 20 64 6f 6d 2d 38 2e 34  {}..test dom-8.4
b9e0: 20 7b 63 72 65 61 74 65 44 6f 63 75 6d 65 6e 74   {createDocument
b9f0: 4e 6f 64 65 7d 20 7b 0a 20 20 20 20 73 65 74 20  Node} {.    set 
ba00: 64 6f 63 4e 6f 64 65 20 5b 64 6f 6d 20 63 72 65  docNode [dom cre
ba10: 61 74 65 44 6f 63 75 6d 65 6e 74 4e 6f 64 65 5d  ateDocumentNode]
ba20: 0a 20 20 20 20 73 65 74 20 72 65 73 75 6c 74 20  .    set result 
ba30: 5b 24 64 6f 63 4e 6f 64 65 20 6e 6f 64 65 54 79  [$docNode nodeTy
ba40: 70 65 5d 0a 20 20 20 20 6c 61 70 70 65 6e 64 20  pe].    lappend 
ba50: 72 65 73 75 6c 74 20 5b 24 64 6f 63 4e 6f 64 65  result [$docNode
ba60: 20 64 6f 63 75 6d 65 6e 74 45 6c 65 6d 65 6e 74   documentElement
ba70: 5d 0a 20 20 20 20 24 64 6f 63 4e 6f 64 65 20 64  ].    $docNode d
ba80: 65 6c 65 74 65 0a 20 20 20 20 73 65 74 20 72 65  elete.    set re
ba90: 73 75 6c 74 0a 7d 20 7b 44 4f 43 55 4d 45 4e 54  sult.} {DOCUMENT
baa0: 5f 4e 4f 44 45 20 7b 7d 7d 0a 0a 74 65 73 74 20  _NODE {}}..test 
bab0: 64 6f 6d 2d 38 2e 35 20 7b 63 72 65 61 74 65 44  dom-8.5 {createD
bac0: 6f 63 75 6d 65 6e 74 4e 6f 64 65 7d 20 7b 0a 20  ocumentNode} {. 
bad0: 20 20 20 73 65 74 20 64 6f 63 4e 6f 64 65 20 5b     set docNode [
bae0: 64 6f 6d 20 63 72 65 61 74 65 44 6f 63 75 6d 65  dom createDocume
baf0: 6e 74 4e 6f 64 65 5d 0a 20 20 20 20 73 65 74 20  ntNode].    set 
bb00: 6e 65 77 4e 6f 64 65 20 5b 24 64 6f 63 4e 6f 64  newNode [$docNod
bb10: 65 20 63 72 65 61 74 65 43 6f 6d 6d 65 6e 74 20  e createComment 
bb20: 22 43 6f 6d 6d 65 6e 74 20 62 65 66 6f 72 65 20  "Comment before 
bb30: 74 68 65 20 64 6f 63 75 6d 65 6e 74 20 6e 6f 64  the document nod
bb40: 65 22 5d 0a 20 20 20 20 24 64 6f 63 4e 6f 64 65  e"].    $docNode
bb50: 20 61 70 70 65 6e 64 43 68 69 6c 64 20 24 6e 65   appendChild $ne
bb60: 77 4e 6f 64 65 0a 20 20 20 20 73 65 74 20 72 65  wNode.    set re
bb70: 73 75 6c 74 20 5b 5b 24 64 6f 63 4e 6f 64 65 20  sult [[$docNode 
bb80: 64 6f 63 75 6d 65 6e 74 45 6c 65 6d 65 6e 74 5d  documentElement]
bb90: 20 6e 6f 64 65 54 79 70 65 5d 0a 20 20 20 20 73   nodeType].    s
bba0: 65 74 20 6e 65 77 4e 6f 64 65 20 5b 24 64 6f 63  et newNode [$doc
bbb0: 4e 6f 64 65 20 63 72 65 61 74 65 45 6c 65 6d 65  Node createEleme
bbc0: 6e 74 20 66 69 72 73 74 43 68 69 6c 64 5d 0a 20  nt firstChild]. 
bbd0: 20 20 20 24 64 6f 63 4e 6f 64 65 20 61 70 70 65     $docNode appe
bbe0: 6e 64 43 68 69 6c 64 20 24 6e 65 77 4e 6f 64 65  ndChild $newNode
bbf0: 0a 20 20 20 20 6c 61 70 70 65 6e 64 20 72 65 73  .    lappend res
bc00: 75 6c 74 20 5b 5b 24 64 6f 63 4e 6f 64 65 20 64  ult [[$docNode d
bc10: 6f 63 75 6d 65 6e 74 45 6c 65 6d 65 6e 74 5d 20  ocumentElement] 
bc20: 6e 6f 64 65 4e 61 6d 65 5d 0a 20 20 20 20 73 65  nodeName].    se
bc30: 74 20 6e 65 77 4e 6f 64 65 20 5b 24 64 6f 63 4e  t newNode [$docN
bc40: 6f 64 65 20 63 72 65 61 74 65 45 6c 65 6d 65 6e  ode createElemen
bc50: 74 20 73 65 63 6f 6e 64 43 68 69 6c 64 5d 0a 20  t secondChild]. 
bc60: 20 20 20 24 64 6f 63 4e 6f 64 65 20 61 70 70 65     $docNode appe
bc70: 6e 64 43 68 69 6c 64 20 24 6e 65 77 4e 6f 64 65  ndChild $newNode
bc80: 0a 20 20 20 20 6c 61 70 70 65 6e 64 20 72 65 73  .    lappend res
bc90: 75 6c 74 20 5b 5b 24 64 6f 63 4e 6f 64 65 20 64  ult [[$docNode d
bca0: 6f 63 75 6d 65 6e 74 45 6c 65 6d 65 6e 74 5d 20  ocumentElement] 
bcb0: 6e 6f 64 65 4e 61 6d 65 5d 0a 20 20 20 20 24 64  nodeName].    $d
bcc0: 6f 63 4e 6f 64 65 20 64 65 6c 65 74 65 0a 20 20  ocNode delete.  
bcd0: 20 20 73 65 74 20 72 65 73 75 6c 74 0a 7d 20 7b    set result.} {
bce0: 43 4f 4d 4d 45 4e 54 5f 4e 4f 44 45 20 66 69 72  COMMENT_NODE fir
bcf0: 73 74 43 68 69 6c 64 20 66 69 72 73 74 43 68 69  stChild firstChi
bd00: 6c 64 7d 0a 0a 74 65 73 74 20 64 6f 6d 2d 38 2e  ld}..test dom-8.
bd10: 36 20 7b 63 72 65 61 74 65 44 6f 63 75 6d 65 6e  6 {createDocumen
bd20: 74 4e 6f 64 65 7d 20 7b 0a 20 20 20 20 73 65 74  tNode} {.    set
bd30: 20 64 6f 63 4e 6f 64 65 20 5b 64 6f 6d 20 63 72   docNode [dom cr
bd40: 65 61 74 65 44 6f 63 75 6d 65 6e 74 4e 6f 64 65  eateDocumentNode
bd50: 5d 0a 20 20 20 20 73 65 74 20 64 6f 63 20 5b 64  ].    set doc [d
bd60: 6f 6d 20 70 61 72 73 65 20 7b 3c 72 6f 6f 74 3e  om parse {<root>
bd70: 3c 63 68 69 6c 64 31 2f 3e 3c 63 68 69 6c 64 32  <child1/><child2
bd80: 2f 3e 73 6f 6d 65 20 74 65 78 74 3c 63 68 69 6c  />some text<chil
bd90: 64 33 2f 3e 3c 2f 72 6f 6f 74 3e 7d 5d 0a 20 20  d3/></root>}].  
bda0: 20 20 73 65 74 20 72 6f 6f 74 20 5b 24 64 6f 63    set root [$doc
bdb0: 20 64 6f 63 75 6d 65 6e 74 45 6c 65 6d 65 6e 74   documentElement
bdc0: 5d 0a 20 20 20 20 73 65 74 20 6c 69 73 74 52 65  ].    set listRe
bdd0: 70 20 5b 24 72 6f 6f 74 20 61 73 4c 69 73 74 5d  p [$root asList]
bde0: 0a 20 20 20 20 24 64 6f 63 20 64 65 6c 65 74 65  .    $doc delete
bdf0: 0a 20 20 20 20 24 64 6f 63 4e 6f 64 65 20 61 70  .    $docNode ap
be00: 70 65 6e 64 46 72 6f 6d 4c 69 73 74 20 24 6c 69  pendFromList $li
be10: 73 74 52 65 70 0a 20 20 20 20 73 65 74 20 72 65  stRep.    set re
be20: 73 75 6c 74 20 5b 24 64 6f 63 4e 6f 64 65 20 61  sult [$docNode a
be30: 73 58 4d 4c 20 2d 69 6e 64 65 6e 74 20 6e 6f 6e  sXML -indent non
be40: 65 5d 0a 20 20 20 20 24 64 6f 63 4e 6f 64 65 20  e].    $docNode 
be50: 64 65 6c 65 74 65 0a 20 20 20 20 73 65 74 20 72  delete.    set r
be60: 65 73 75 6c 74 0a 7d 20 7b 3c 72 6f 6f 74 3e 3c  esult.} {<root><
be70: 63 68 69 6c 64 31 2f 3e 3c 63 68 69 6c 64 32 2f  child1/><child2/
be80: 3e 73 6f 6d 65 20 74 65 78 74 3c 63 68 69 6c 64  >some text<child
be90: 33 2f 3e 3c 2f 72 6f 6f 74 3e 7d 0a 0a 74 65 73  3/></root>}..tes
bea0: 74 20 64 6f 6d 2d 38 2e 37 20 7b 63 72 65 61 74  t dom-8.7 {creat
beb0: 65 44 6f 63 75 6d 65 6e 74 4e 6f 64 65 7d 20 7b  eDocumentNode} {
bec0: 0a 20 20 20 20 64 6f 6d 20 63 72 65 61 74 65 44  .    dom createD
bed0: 6f 63 75 6d 65 6e 74 4e 6f 64 65 20 64 6f 63 4e  ocumentNode docN
bee0: 6f 64 65 0a 20 20 20 20 64 6f 6d 20 63 72 65 61  ode.    dom crea
bef0: 74 65 44 6f 63 75 6d 65 6e 74 4e 6f 64 65 20 64  teDocumentNode d
bf00: 6f 63 4e 6f 64 65 0a 20 20 20 20 24 64 6f 63 4e  ocNode.    $docN
bf10: 6f 64 65 20 64 65 6c 65 74 65 0a 20 20 20 20 73  ode delete.    s
bf20: 65 74 20 72 65 73 75 6c 74 20 22 22 0a 7d 20 22  et result "".} "
bf30: 22 0a 0a 74 65 73 74 20 64 6f 6d 2d 38 2e 38 20  "..test dom-8.8 
bf40: 7b 63 72 65 61 74 65 44 6f 63 75 6d 65 6e 74 4e  {createDocumentN
bf50: 6f 64 65 7d 20 7b 0a 20 20 20 20 64 6f 6d 20 63  ode} {.    dom c
bf60: 72 65 61 74 65 44 6f 63 75 6d 65 6e 74 4e 6f 64  reateDocumentNod
bf70: 65 20 2d 6a 73 6f 6e 54 79 70 65 20 41 52 52 41  e -jsonType ARRA
bf80: 59 20 64 6f 63 4e 6f 64 65 0a 20 20 20 20 73 65  Y docNode.    se
bf90: 74 20 72 65 73 75 6c 74 20 5b 24 64 6f 63 4e 6f  t result [$docNo
bfa0: 64 65 20 6a 73 6f 6e 54 79 70 65 5d 0a 20 20 20  de jsonType].   
bfb0: 20 24 64 6f 63 4e 6f 64 65 20 64 65 6c 65 74 65   $docNode delete
bfc0: 0a 20 20 20 20 73 65 74 20 72 65 73 75 6c 74 0a  .    set result.
bfd0: 7d 20 41 52 52 41 59 0a 0a 74 65 73 74 20 64 6f  } ARRAY..test do
bfe0: 6d 2d 38 2e 39 20 7b 63 72 65 61 74 65 44 6f 63  m-8.9 {createDoc
bff0: 75 6d 65 6e 74 4e 6f 64 65 7d 20 7b 0a 20 20 20  umentNode} {.   
c000: 20 73 65 74 20 64 6f 63 4e 6f 64 65 20 5b 64 6f   set docNode [do
c010: 6d 20 63 72 65 61 74 65 44 6f 63 75 6d 65 6e 74  m createDocument
c020: 4e 6f 64 65 20 2d 6a 73 6f 6e 54 79 70 65 20 4e  Node -jsonType N
c030: 55 4d 42 45 52 5d 0a 20 20 20 20 73 65 74 20 72  UMBER].    set r
c040: 65 73 75 6c 74 20 5b 24 64 6f 63 4e 6f 64 65 20  esult [$docNode 
c050: 6a 73 6f 6e 54 79 70 65 5d 0a 20 20 20 20 24 64  jsonType].    $d
c060: 6f 63 4e 6f 64 65 20 64 65 6c 65 74 65 0a 20 20  ocNode delete.  
c070: 20 20 73 65 74 20 72 65 73 75 6c 74 0a 7d 20 4e    set result.} N
c080: 55 4d 42 45 52 0a 0a 74 65 73 74 20 64 6f 6d 2d  UMBER..test dom-
c090: 38 2e 31 30 20 7b 63 72 65 61 74 65 44 6f 63 75  8.10 {createDocu
c0a0: 6d 65 6e 74 4e 6f 64 65 7d 20 7b 0a 20 20 20 20  mentNode} {.    
c0b0: 63 61 74 63 68 20 7b 64 6f 6d 20 63 72 65 61 74  catch {dom creat
c0c0: 65 44 6f 63 75 6d 65 6e 74 4e 6f 64 65 20 2d 66  eDocumentNode -f
c0d0: 6f 6f 20 4e 55 4c 4c 20 64 6f 63 4e 6f 64 65 7d  oo NULL docNode}
c0e0: 20 65 72 72 4d 73 67 0a 20 20 20 20 73 65 74 20   errMsg.    set 
c0f0: 65 72 72 4d 73 67 0a 7d 20 7b 62 61 64 20 6f 70  errMsg.} {bad op
c100: 74 69 6f 6e 20 22 2d 66 6f 6f 22 3a 20 6d 75 73  tion "-foo": mus
c110: 74 20 62 65 20 2d 6a 73 6f 6e 54 79 70 65 7d 0a  t be -jsonType}.
c120: 0a 74 65 73 74 20 64 6f 6d 2d 38 2e 31 30 20 7b  .test dom-8.10 {
c130: 63 72 65 61 74 65 44 6f 63 75 6d 65 6e 74 4e 6f  createDocumentNo
c140: 64 65 7d 20 7b 0a 20 20 20 20 63 61 74 63 68 20  de} {.    catch 
c150: 7b 64 6f 6d 20 63 72 65 61 74 65 44 6f 63 75 6d  {dom createDocum
c160: 65 6e 74 4e 6f 64 65 20 2d 66 6f 6f 20 4e 55 4c  entNode -foo NUL
c170: 4c 20 64 6f 63 4e 6f 64 65 7d 20 65 72 72 4d 73  L docNode} errMs
c180: 67 0a 20 20 20 20 73 65 74 20 65 72 72 4d 73 67  g.    set errMsg
c190: 0a 7d 20 7b 62 61 64 20 6f 70 74 69 6f 6e 20 22  .} {bad option "
c1a0: 2d 66 6f 6f 22 3a 20 6d 75 73 74 20 62 65 20 2d  -foo": must be -
c1b0: 6a 73 6f 6e 54 79 70 65 7d 0a 0a 74 65 73 74 20  jsonType}..test 
c1c0: 64 6f 6d 2d 38 2e 31 31 20 7b 63 72 65 61 74 65  dom-8.11 {create
c1d0: 44 6f 63 75 6d 65 6e 74 4e 6f 64 65 7d 20 7b 0a  DocumentNode} {.
c1e0: 20 20 20 20 63 61 74 63 68 20 7b 64 6f 6d 20 63      catch {dom c
c1f0: 72 65 61 74 65 44 6f 63 75 6d 65 6e 74 4e 6f 64  reateDocumentNod
c200: 65 20 2d 6a 73 6f 6e 54 79 70 65 20 46 4f 4f 20  e -jsonType FOO 
c210: 64 6f 63 4e 6f 64 65 7d 20 65 72 72 4d 73 67 0a  docNode} errMsg.
c220: 20 20 20 20 73 65 74 20 65 72 72 4d 73 67 0a 7d      set errMsg.}
c230: 20 7b 62 61 64 20 6a 73 6f 6e 54 79 70 65 20 22   {bad jsonType "
c240: 46 4f 4f 22 3a 20 6d 75 73 74 20 62 65 20 4e 4f  FOO": must be NO
c250: 4e 45 2c 20 41 52 52 41 59 2c 20 4f 42 4a 45 43  NE, ARRAY, OBJEC
c260: 54 2c 20 4e 55 4c 4c 2c 20 54 52 55 45 2c 20 46  T, NULL, TRUE, F
c270: 41 4c 53 45 2c 20 53 54 52 49 4e 47 2c 20 6f 72  ALSE, STRING, or
c280: 20 4e 55 4d 42 45 52 7d 0a 0a 74 65 73 74 20 64   NUMBER}..test d
c290: 6f 6d 2d 39 2e 31 20 7b 73 65 74 4f 62 6a 65 63  om-9.1 {setObjec
c2a0: 74 43 6f 6d 6d 61 6e 64 73 7d 20 7b 0a 20 20 20  tCommands} {.   
c2b0: 20 64 6f 6d 20 73 65 74 4f 62 6a 65 63 74 43 6f   dom setObjectCo
c2c0: 6d 6d 61 6e 64 73 0a 7d 20 7b 61 75 74 6f 6d 61  mmands.} {automa
c2d0: 74 69 63 7d 0a 0a 74 65 73 74 20 64 6f 6d 2d 39  tic}..test dom-9
c2e0: 2e 32 20 7b 73 65 74 4f 62 6a 65 63 74 43 6f 6d  .2 {setObjectCom
c2f0: 6d 61 6e 64 73 7d 20 7b 0a 20 20 20 20 64 6f 6d  mands} {.    dom
c300: 20 73 65 74 4f 62 6a 65 63 74 43 6f 6d 6d 61 6e   setObjectComman
c310: 64 73 20 61 75 74 6f 6d 61 74 69 63 0a 7d 20 7b  ds automatic.} {
c320: 61 75 74 6f 6d 61 74 69 63 7d 0a 0a 74 65 73 74  automatic}..test
c330: 20 64 6f 6d 2d 39 2e 33 20 7b 73 65 74 4f 62 6a   dom-9.3 {setObj
c340: 65 63 74 43 6f 6d 6d 61 6e 64 73 7d 20 7b 0a 20  ectCommands} {. 
c350: 20 20 20 73 65 74 20 72 65 73 75 6c 74 20 5b 63     set result [c
c360: 61 74 63 68 20 7b 64 6f 6d 20 73 65 74 4f 62 6a  atch {dom setObj
c370: 65 63 74 43 6f 6d 6d 61 6e 64 73 20 66 6f 6f 62  ectCommands foob
c380: 61 72 7d 20 65 72 72 4d 73 67 5d 0a 20 20 20 20  ar} errMsg].    
c390: 6c 61 70 70 65 6e 64 20 72 65 73 75 6c 74 20 24  lappend result $
c3a0: 65 72 72 4d 73 67 0a 7d 20 7b 31 20 7b 62 61 64  errMsg.} {1 {bad
c3b0: 20 6d 6f 64 65 20 76 61 6c 75 65 20 22 66 6f 6f   mode value "foo
c3c0: 62 61 72 22 3a 20 6d 75 73 74 20 62 65 20 61 75  bar": must be au
c3d0: 74 6f 6d 61 74 69 63 2c 20 63 6f 6d 6d 61 6e 64  tomatic, command
c3e0: 2c 20 6f 72 20 74 6f 6b 65 6e 7d 7d 0a 0a 74 65  , or token}}..te
c3f0: 73 74 20 64 6f 6d 2d 39 2e 34 20 7b 73 65 74 4f  st dom-9.4 {setO
c400: 62 6a 65 63 74 43 6f 6d 6d 61 6e 64 73 7d 20 7b  bjectCommands} {
c410: 0a 20 20 20 20 73 65 74 20 6e 72 4f 66 43 6d 64  .    set nrOfCmd
c420: 73 20 5b 6c 6c 65 6e 67 74 68 20 5b 69 6e 66 6f  s [llength [info
c430: 20 63 6f 6d 6d 61 6e 64 73 5d 5d 0a 20 20 20 20   commands]].    
c440: 64 6f 6d 20 73 65 74 4f 62 6a 65 63 74 43 6f 6d  dom setObjectCom
c450: 6d 61 6e 64 73 20 61 75 74 6f 6d 61 74 69 63 0a  mands automatic.
c460: 20 20 20 20 73 65 74 20 64 6f 63 4e 6f 64 65 20      set docNode 
c470: 5b 64 6f 6d 20 63 72 65 61 74 65 44 6f 63 75 6d  [dom createDocum
c480: 65 6e 74 4e 6f 64 65 5d 0a 20 20 20 20 73 65 74  entNode].    set
c490: 20 72 65 73 75 6c 74 20 5b 65 78 70 72 20 7b 24   result [expr {$
c4a0: 6e 72 4f 66 43 6d 64 73 20 2b 20 31 20 3d 3d 20  nrOfCmds + 1 == 
c4b0: 5b 6c 6c 65 6e 67 74 68 20 5b 69 6e 66 6f 20 63  [llength [info c
c4c0: 6f 6d 6d 61 6e 64 73 5d 5d 7d 5d 0a 20 20 20 20  ommands]]}].    
c4d0: 24 64 6f 63 4e 6f 64 65 20 64 65 6c 65 74 65 0a  $docNode delete.
c4e0: 20 20 20 20 6c 61 70 70 65 6e 64 20 72 65 73 75      lappend resu
c4f0: 6c 74 20 5b 65 78 70 72 20 7b 24 6e 72 4f 66 43  lt [expr {$nrOfC
c500: 6d 64 73 20 3d 3d 20 5b 6c 6c 65 6e 67 74 68 20  mds == [llength 
c510: 5b 69 6e 66 6f 20 63 6f 6d 6d 61 6e 64 73 5d 5d  [info commands]]
c520: 7d 5d 0a 20 20 20 20 64 6f 6d 20 73 65 74 4f 62  }].    dom setOb
c530: 6a 65 63 74 43 6f 6d 6d 61 6e 64 73 20 74 6f 6b  jectCommands tok
c540: 65 6e 0a 20 20 20 20 73 65 74 20 64 6f 63 4e 6f  en.    set docNo
c550: 64 65 20 5b 64 6f 6d 20 63 72 65 61 74 65 44 6f  de [dom createDo
c560: 63 75 6d 65 6e 74 4e 6f 64 65 5d 0a 20 20 20 20  cumentNode].    
c570: 6c 61 70 70 65 6e 64 20 72 65 73 75 6c 74 20 5b  lappend result [
c580: 65 78 70 72 20 7b 24 6e 72 4f 66 43 6d 64 73 20  expr {$nrOfCmds 
c590: 3d 3d 20 5b 6c 6c 65 6e 67 74 68 20 5b 69 6e 66  == [llength [inf
c5a0: 6f 20 63 6f 6d 6d 61 6e 64 73 5d 5d 7d 5d 0a 20  o commands]]}]. 
c5b0: 20 20 20 6c 61 70 70 65 6e 64 20 72 65 73 75 6c     lappend resul
c5c0: 74 20 5b 64 6f 6d 44 6f 63 20 24 64 6f 63 4e 6f  t [domDoc $docNo
c5d0: 64 65 20 68 61 73 43 68 69 6c 64 4e 6f 64 65 73  de hasChildNodes
c5e0: 5d 0a 20 20 20 20 64 6f 6d 44 6f 63 20 24 64 6f  ].    domDoc $do
c5f0: 63 4e 6f 64 65 20 64 65 6c 65 74 65 0a 20 20 20  cNode delete.   
c600: 20 6c 61 70 70 65 6e 64 20 72 65 73 75 6c 74 20   lappend result 
c610: 5b 65 78 70 72 20 7b 24 6e 72 4f 66 43 6d 64 73  [expr {$nrOfCmds
c620: 20 3d 3d 20 5b 6c 6c 65 6e 67 74 68 20 5b 69 6e   == [llength [in
c630: 66 6f 20 63 6f 6d 6d 61 6e 64 73 5d 5d 7d 5d 0a  fo commands]]}].
c640: 20 20 20 20 23 20 73 77 69 74 63 68 20 62 61 63      # switch bac
c650: 6b 20 74 6f 20 64 65 66 61 75 6c 74 0a 20 20 20  k to default.   
c660: 20 64 6f 6d 20 73 65 74 4f 62 6a 65 63 74 43 6f   dom setObjectCo
c670: 6d 6d 61 6e 64 73 20 61 75 74 6f 6d 61 74 69 63  mmands automatic
c680: 0a 20 20 20 20 73 65 74 20 72 65 73 75 6c 74 0a  .    set result.
c690: 7d 20 7b 31 20 31 20 31 20 30 20 31 7d 0a 0a 74  } {1 1 1 0 1}..t
c6a0: 65 73 74 20 64 6f 6d 2d 39 2e 35 20 7b 73 65 74  est dom-9.5 {set
c6b0: 4f 62 6a 65 63 74 43 6f 6d 6d 61 6e 64 73 7d 20  ObjectCommands} 
c6c0: 7b 0a 20 20 20 20 64 6f 6d 20 73 65 74 4f 62 6a  {.    dom setObj
c6d0: 65 63 74 43 6f 6d 6d 61 6e 64 73 20 74 6f 6b 65  ectCommands toke
c6e0: 6e 0a 20 20 20 20 73 65 74 20 6e 72 4f 66 43 6d  n.    set nrOfCm
c6f0: 64 73 20 5b 6c 6c 65 6e 67 74 68 20 5b 69 6e 66  ds [llength [inf
c700: 6f 20 63 6f 6d 6d 61 6e 64 73 5d 5d 0a 20 20 20  o commands]].   
c710: 20 73 65 74 20 64 6f 63 20 5b 64 6f 6d 20 70 61   set doc [dom pa
c720: 72 73 65 20 3c 72 6f 6f 74 3e 3c 63 68 69 6c 64  rse <root><child
c730: 31 2f 3e 3c 63 68 69 6c 64 32 2f 3e 3c 2f 72 6f  1/><child2/></ro
c740: 6f 74 3e 5d 0a 20 20 20 20 73 65 74 20 72 6f 6f  ot>].    set roo
c750: 74 20 5b 64 6f 6d 44 6f 63 20 24 64 6f 63 20 64  t [domDoc $doc d
c760: 6f 63 75 6d 65 6e 74 45 6c 65 6d 65 6e 74 5d 0a  ocumentElement].
c770: 20 20 20 20 73 65 74 20 72 65 73 75 6c 74 20 5b      set result [
c780: 65 78 70 72 20 7b 24 6e 72 4f 66 43 6d 64 73 20  expr {$nrOfCmds 
c790: 3d 3d 20 5b 6c 6c 65 6e 67 74 68 20 5b 69 6e 66  == [llength [inf
c7a0: 6f 20 63 6f 6d 6d 61 6e 64 73 5d 5d 7d 5d 0a 20  o commands]]}]. 
c7b0: 20 20 20 64 6f 6d 20 73 65 74 4f 62 6a 65 63 74     dom setObject
c7c0: 43 6f 6d 6d 61 6e 64 73 20 63 6f 6d 6d 61 6e 64  Commands command
c7d0: 0a 20 20 20 20 73 65 74 20 64 6f 63 43 6d 64 20  .    set docCmd 
c7e0: 5b 64 6f 6d 4e 6f 64 65 20 24 72 6f 6f 74 20 6f  [domNode $root o
c7f0: 77 6e 65 72 44 6f 63 75 6d 65 6e 74 5d 0a 20 20  wnerDocument].  
c800: 20 20 6c 61 70 70 65 6e 64 20 72 65 73 75 6c 74    lappend result
c810: 20 5b 65 78 70 72 20 7b 24 6e 72 4f 66 43 6d 64   [expr {$nrOfCmd
c820: 73 20 2b 20 31 20 3d 3d 20 5b 6c 6c 65 6e 67 74  s + 1 == [llengt
c830: 68 20 5b 69 6e 66 6f 20 63 6f 6d 6d 61 6e 64 73  h [info commands
c840: 5d 5d 7d 5d 0a 20 20 20 20 24 64 6f 63 43 6d 64  ]]}].    $docCmd
c850: 20 64 65 6c 65 74 65 0a 20 20 20 20 64 6f 6d 20   delete.    dom 
c860: 73 65 74 4f 62 6a 65 63 74 43 6f 6d 6d 61 6e 64  setObjectCommand
c870: 73 20 61 75 74 6f 6d 61 74 69 63 0a 20 20 20 20  s automatic.    
c880: 73 65 74 20 72 65 73 75 6c 74 0a 7d 20 7b 31 20  set result.} {1 
c890: 31 7d 0a 0a 74 65 73 74 20 64 6f 6d 2d 39 2e 36  1}..test dom-9.6
c8a0: 20 7b 6e 6f 64 65 20 74 6f 6b 65 6e 20 77 69 74   {node token wit
c8b0: 68 20 72 65 73 75 6c 74 20 76 61 72 20 61 72 67  h result var arg
c8c0: 75 6d 65 6e 74 7d 20 7b 0a 20 20 20 20 64 6f 6d  ument} {.    dom
c8d0: 20 73 65 74 4f 62 6a 65 63 74 43 6f 6d 6d 61 6e   setObjectComman
c8e0: 64 73 20 74 6f 6b 65 6e 0a 20 20 20 20 73 65 74  ds token.    set
c8f0: 20 64 6f 63 20 5b 64 6f 6d 20 70 61 72 73 65 20   doc [dom parse 
c900: 3c 72 6f 6f 74 3e 3c 63 68 69 6c 64 31 2f 3e 3c  <root><child1/><
c910: 63 68 69 6c 64 32 2f 3e 3c 2f 72 6f 6f 74 3e 5d  child2/></root>]
c920: 0a 20 20 20 20 64 6f 6d 44 6f 63 20 24 64 6f 63  .    domDoc $doc
c930: 20 64 6f 63 75 6d 65 6e 74 45 6c 65 6d 65 6e 74   documentElement
c940: 20 76 61 72 0a 20 20 20 20 64 6f 6d 4e 6f 64 65   var.    domNode
c950: 20 24 76 61 72 20 66 69 72 73 74 43 68 69 6c 64   $var firstChild
c960: 20 76 61 72 0a 20 20 20 20 64 6f 6d 4e 6f 64 65   var.    domNode
c970: 20 24 76 61 72 20 6e 65 78 74 53 69 62 6c 69 6e   $var nextSiblin
c980: 67 20 76 61 72 0a 20 20 20 20 64 6f 6d 44 6f 63  g var.    domDoc
c990: 20 24 64 6f 63 20 64 65 6c 65 74 65 0a 20 20 20   $doc delete.   
c9a0: 20 64 6f 6d 20 73 65 74 4f 62 6a 65 63 74 43 6f   dom setObjectCo
c9b0: 6d 6d 61 6e 64 73 20 61 75 74 6f 6d 61 74 69 63  mmands automatic
c9c0: 0a 7d 20 7b 61 75 74 6f 6d 61 74 69 63 7d 0a 0a  .} {automatic}..
c9d0: 0a 74 65 73 74 20 64 6f 6d 2d 39 2e 37 20 7b 41  .test dom-9.7 {A
c9e0: 74 74 65 6d 70 74 20 74 6f 20 75 73 65 20 74 68  ttempt to use th
c9f0: 65 20 74 6f 6b 65 6e 20 74 6f 20 61 6e 20 61 6c  e token to an al
ca00: 72 65 61 64 79 20 66 72 65 65 64 20 6e 6f 64 65  ready freed node
ca10: 7d 20 7b 0a 20 20 20 20 64 6f 6d 20 73 65 74 4f  } {.    dom setO
ca20: 62 6a 65 63 74 43 6f 6d 6d 61 6e 64 73 20 74 6f  bjectCommands to
ca30: 6b 65 6e 0a 20 20 20 20 73 65 74 20 64 6f 63 20  ken.    set doc 
ca40: 5b 64 6f 6d 20 63 72 65 61 74 65 44 6f 63 75 6d  [dom createDocum
ca50: 65 6e 74 20 6f 6e 65 5d 0a 20 20 20 20 73 65 74  ent one].    set
ca60: 20 74 6f 70 20 5b 64 6f 6d 44 6f 63 20 24 64 6f   top [domDoc $do
ca70: 63 20 64 6f 63 75 6d 65 6e 74 45 6c 65 6d 65 6e  c documentElemen
ca80: 74 5d 0a 20 20 20 20 73 65 74 20 65 6c 65 6d 20  t].    set elem 
ca90: 5b 64 6f 6d 44 6f 63 20 24 64 6f 63 20 63 72 65  [domDoc $doc cre
caa0: 61 74 65 45 6c 65 6d 65 6e 74 20 6f 6e 65 5d 0a  ateElement one].
cab0: 20 20 20 20 64 6f 6d 4e 6f 64 65 20 24 65 6c 65      domNode $ele
cac0: 6d 20 64 65 6c 65 74 65 0a 20 20 20 20 73 65 74  m delete.    set
cad0: 20 72 65 73 75 6c 74 20 5b 63 61 74 63 68 20 7b   result [catch {
cae0: 64 6f 6d 4e 6f 64 65 20 24 65 6c 65 6d 20 61 73  domNode $elem as
caf0: 4c 69 73 74 7d 20 65 72 72 4d 73 67 5d 0a 20 20  List} errMsg].  
cb00: 20 20 6c 61 70 70 65 6e 64 20 72 65 73 75 6c 74    lappend result
cb10: 20 24 65 72 72 4d 73 67 0a 20 20 20 20 64 6f 6d   $errMsg.    dom
cb20: 44 6f 63 20 24 64 6f 63 20 64 65 6c 65 74 65 0a  Doc $doc delete.
cb30: 20 20 20 20 64 6f 6d 20 73 65 74 4f 62 6a 65 63      dom setObjec
cb40: 74 43 6f 6d 6d 61 6e 64 73 20 61 75 74 6f 6d 61  tCommands automa
cb50: 74 69 63 0a 20 20 20 20 73 65 74 20 72 65 73 75  tic.    set resu
cb60: 6c 74 0a 7d 20 7b 31 20 7b 50 61 72 61 6d 65 74  lt.} {1 {Paramet
cb70: 65 72 20 22 22 20 69 73 20 6e 6f 74 20 61 20 64  er "" is not a d
cb80: 6f 6d 4e 6f 64 65 2e 7d 7d 0a 20 20 20 20 0a 63  omNode.}}.    .c
cb90: 61 74 63 68 20 7b 6e 61 6d 65 73 70 61 63 65 20  atch {namespace 
cba0: 64 65 6c 65 74 65 20 6e 6f 64 65 43 6d 64 73 7d  delete nodeCmds}
cbb0: 0a 0a 6e 61 6d 65 73 70 61 63 65 20 65 76 61 6c  ..namespace eval
cbc0: 20 6e 6f 64 65 43 6d 64 73 20 7b 0a 20 20 20 20   nodeCmds {.    
cbd0: 64 6f 6d 20 63 72 65 61 74 65 4e 6f 64 65 43 6d  dom createNodeCm
cbe0: 64 20 65 6c 65 6d 65 6e 74 4e 6f 64 65 20 65 31  d elementNode e1
cbf0: 0a 20 20 20 20 64 6f 6d 20 63 72 65 61 74 65 4e  .    dom createN
cc00: 6f 64 65 43 6d 64 20 65 6c 65 6d 65 6e 74 4e 6f  odeCmd elementNo
cc10: 64 65 20 65 32 0a 20 20 20 20 64 6f 6d 20 63 72  de e2.    dom cr
cc20: 65 61 74 65 4e 6f 64 65 43 6d 64 20 63 6f 6d 6d  eateNodeCmd comm
cc30: 65 6e 74 4e 6f 64 65 20 63 0a 20 20 20 20 64 6f  entNode c.    do
cc40: 6d 20 63 72 65 61 74 65 4e 6f 64 65 43 6d 64 20  m createNodeCmd 
cc50: 74 65 78 74 4e 6f 64 65 20 20 20 20 74 0a 20 20  textNode    t.  
cc60: 20 20 64 6f 6d 20 63 72 65 61 74 65 4e 6f 64 65    dom createNode
cc70: 43 6d 64 20 63 64 61 74 61 4e 6f 64 65 20 20 20  Cmd cdataNode   
cc80: 63 64 61 74 61 0a 20 20 20 20 64 6f 6d 20 63 72  cdata.    dom cr
cc90: 65 61 74 65 4e 6f 64 65 43 6d 64 20 70 69 4e 6f  eateNodeCmd piNo
cca0: 64 65 20 20 20 20 20 20 70 69 0a 20 20 20 20 64  de      pi.    d
ccb0: 6f 6d 20 63 72 65 61 74 65 4e 6f 64 65 43 6d 64  om createNodeCmd
ccc0: 20 70 61 72 73 65 72 4e 6f 64 65 20 20 70 61 72   parserNode  par
ccd0: 73 65 72 0a 20 20 20 20 64 6f 6d 20 63 72 65 61  ser.    dom crea
cce0: 74 65 4e 6f 64 65 43 6d 64 20 2d 74 61 67 4e 61  teNodeCmd -tagNa
ccf0: 6d 65 20 66 6f 6f 20 65 6c 65 6d 65 6e 74 4e 6f  me foo elementNo
cd00: 64 65 20 62 61 72 0a 7d 0a 0a 74 65 73 74 20 64  de bar.}..test d
cd10: 6f 6d 2d 31 30 2e 31 20 7b 63 72 65 61 74 65 4e  om-10.1 {createN
cd20: 6f 64 65 43 6d 64 7d 20 7b 0a 20 20 20 20 6c 6c  odeCmd} {.    ll
cd30: 65 6e 67 74 68 20 5b 69 6e 66 6f 20 63 6f 6d 6d  ength [info comm
cd40: 61 6e 64 73 20 6e 6f 64 65 43 6d 64 73 3a 3a 2a  ands nodeCmds::*
cd50: 5d 0a 7d 20 7b 38 7d 0a 0a 6e 61 6d 65 73 70 61  ].} {8}..namespa
cd60: 63 65 20 65 76 61 6c 20 6e 6f 64 65 43 6d 64 73  ce eval nodeCmds
cd70: 20 7b 0a 20 20 20 20 72 65 6e 61 6d 65 20 65 31   {.    rename e1
cd80: 20 7b 7d 0a 20 20 20 20 72 65 6e 61 6d 65 20 65   {}.    rename e
cd90: 32 20 7b 7d 0a 20 20 20 20 72 65 6e 61 6d 65 20  2 {}.    rename 
cda0: 63 20 7b 7d 0a 20 20 20 20 72 65 6e 61 6d 65 20  c {}.    rename 
cdb0: 74 20 7b 7d 0a 20 20 20 20 72 65 6e 61 6d 65 20  t {}.    rename 
cdc0: 63 64 61 74 61 20 7b 7d 0a 20 20 20 20 72 65 6e  cdata {}.    ren
cdd0: 61 6d 65 20 70 69 20 7b 7d 0a 20 20 20 20 72 65  ame pi {}.    re
cde0: 6e 61 6d 65 20 70 61 72 73 65 72 20 7b 7d 0a 20  name parser {}. 
cdf0: 20 20 20 72 65 6e 61 6d 65 20 62 61 72 20 7b 7d     rename bar {}
ce00: 0a 7d 0a 0a 74 65 73 74 20 64 6f 6d 2d 31 30 2e  .}..test dom-10.
ce10: 32 20 7b 63 72 65 61 74 65 4e 6f 64 65 43 6d 64  2 {createNodeCmd
ce20: 7d 20 7b 0a 20 20 20 20 6c 6c 65 6e 67 74 68 20  } {.    llength 
ce30: 5b 69 6e 66 6f 20 63 6f 6d 6d 61 6e 64 73 20 6e  [info commands n
ce40: 6f 64 65 43 6d 64 73 3a 3a 2a 5d 0a 7d 20 7b 30  odeCmds::*].} {0
ce50: 7d 0a 0a 6e 61 6d 65 73 70 61 63 65 20 65 76 61  }..namespace eva
ce60: 6c 20 6e 6f 64 65 43 6d 64 73 20 7b 0a 20 20 20  l nodeCmds {.   
ce70: 20 64 6f 6d 20 63 72 65 61 74 65 4e 6f 64 65 43   dom createNodeC
ce80: 6d 64 20 65 6c 65 6d 65 6e 74 4e 6f 64 65 20 65  md elementNode e
ce90: 31 0a 20 20 20 20 64 6f 6d 20 63 72 65 61 74 65  1.    dom create
cea0: 4e 6f 64 65 43 6d 64 20 74 65 78 74 4e 6f 64 65  NodeCmd textNode
ceb0: 20 20 20 20 74 0a 7d 0a 0a 74 65 73 74 20 64 6f      t.}..test do
cec0: 6d 2d 31 30 2e 33 20 7b 6e 6f 64 65 20 63 72 65  m-10.3 {node cre
ced0: 61 74 69 6e 67 20 63 6f 6d 6d 61 6e 64 20 63 61  ating command ca
cee0: 6c 6c 65 64 20 6f 75 74 73 69 64 65 20 64 6f 6d  lled outside dom
cef0: 4e 6f 64 65 20 63 6f 6e 74 65 78 74 7d 20 7b 0a  Node context} {.
cf00: 20 20 20 20 73 65 74 20 72 65 73 75 6c 74 20 5b      set result [
cf10: 63 61 74 63 68 20 7b 6e 6f 64 65 43 6d 64 73 3a  catch {nodeCmds:
cf20: 3a 74 20 22 73 6f 6d 65 20 74 65 78 74 22 7d 20  :t "some text"} 
cf30: 65 72 72 4d 73 67 5d 0a 20 20 20 20 6c 61 70 70  errMsg].    lapp
cf40: 65 6e 64 20 72 65 73 75 6c 74 20 24 65 72 72 4d  end result $errM
cf50: 73 67 0a 7d 20 7b 31 20 7b 63 61 6c 6c 65 64 20  sg.} {1 {called 
cf60: 6f 75 74 73 69 64 65 20 64 6f 6d 4e 6f 64 65 20  outside domNode 
cf70: 63 6f 6e 74 65 78 74 7d 7d 0a 0a 74 65 73 74 20  context}}..test 
cf80: 64 6f 6d 2d 31 30 2e 34 20 7b 6e 6f 64 65 20 63  dom-10.4 {node c
cf90: 72 65 61 74 69 6e 67 20 63 6f 6d 6d 61 6e 64 20  reating command 
cfa0: 63 61 6c 6c 65 64 20 6f 75 74 73 69 64 65 20 64  called outside d
cfb0: 6f 6d 4e 6f 64 65 20 63 6f 6e 74 65 78 74 7d 20  omNode context} 
cfc0: 7b 0a 20 20 20 20 64 6f 6d 20 63 72 65 61 74 65  {.    dom create
cfd0: 44 6f 63 75 6d 65 6e 74 20 64 6f 63 52 6f 6f 74  Document docRoot
cfe0: 20 64 6f 63 0a 20 20 20 20 24 64 6f 63 20 64 6f   doc.    $doc do
cff0: 63 75 6d 65 6e 74 45 6c 65 6d 65 6e 74 20 72 6f  cumentElement ro
d000: 6f 74 0a 20 20 20 20 24 72 6f 6f 74 20 61 70 70  ot.    $root app
d010: 65 6e 64 46 72 6f 6d 53 63 72 69 70 74 20 7b 0a  endFromScript {.
d020: 20 20 20 20 20 20 20 20 6e 6f 64 65 43 6d 64 73          nodeCmds
d030: 3a 3a 74 20 22 53 6f 6d 65 20 74 65 78 74 22 0a  ::t "Some text".
d040: 20 20 20 20 7d 0a 20 20 20 20 73 65 74 20 72 65      }.    set re
d050: 73 75 6c 74 20 5b 6c 69 73 74 20 5b 24 64 6f 63  sult [list [$doc
d060: 20 61 73 58 4d 4c 20 2d 69 6e 64 65 6e 74 20 6e   asXML -indent n
d070: 6f 6e 65 5d 5d 0a 20 20 20 20 24 64 6f 63 20 64  one]].    $doc d
d080: 65 6c 65 74 65 0a 20 20 20 20 6c 61 70 70 65 6e  elete.    lappen
d090: 64 20 72 65 73 75 6c 74 20 5b 63 61 74 63 68 20  d result [catch 
d0a0: 7b 6e 6f 64 65 43 6d 64 73 3a 3a 74 20 22 53 6f  {nodeCmds::t "So
d0b0: 6d 65 20 74 65 78 74 22 7d 20 65 72 72 4d 73 67  me text"} errMsg
d0c0: 5d 0a 20 20 20 20 6c 61 70 70 65 6e 64 20 72 65  ].    lappend re
d0d0: 73 75 6c 74 20 24 65 72 72 4d 73 67 0a 7d 20 7b  sult $errMsg.} {
d0e0: 7b 3c 64 6f 63 52 6f 6f 74 3e 53 6f 6d 65 20 74  {<docRoot>Some t
d0f0: 65 78 74 3c 2f 64 6f 63 52 6f 6f 74 3e 7d 20 31  ext</docRoot>} 1
d100: 20 7b 63 61 6c 6c 65 64 20 6f 75 74 73 69 64 65   {called outside
d110: 20 64 6f 6d 4e 6f 64 65 20 63 6f 6e 74 65 78 74   domNode context
d120: 7d 7d 0a 0a 74 65 73 74 20 64 6f 6d 2d 31 30 2e  }}..test dom-10.
d130: 35 20 7b 6e 6f 64 65 20 63 72 65 61 74 69 6e 67  5 {node creating
d140: 20 63 6f 6d 6d 61 6e 64 20 63 61 6c 6c 65 64 20   command called 
d150: 6f 75 74 73 69 64 65 20 64 6f 6d 4e 6f 64 65 20  outside domNode 
d160: 63 6f 6e 74 65 78 74 7d 20 7b 0a 20 20 20 20 64  context} {.    d
d170: 6f 6d 20 63 72 65 61 74 65 44 6f 63 75 6d 65 6e  om createDocumen
d180: 74 20 64 6f 63 52 6f 6f 74 20 64 6f 63 0a 20 20  t docRoot doc.  
d190: 20 20 24 64 6f 63 20 64 6f 63 75 6d 65 6e 74 45    $doc documentE
d1a0: 6c 65 6d 65 6e 74 20 72 6f 6f 74 0a 20 20 20 20  lement root.    
d1b0: 24 72 6f 6f 74 20 61 70 70 65 6e 64 46 72 6f 6d  $root appendFrom
d1c0: 53 63 72 69 70 74 20 7b 0a 20 20 20 20 20 20 20  Script {.       
d1d0: 20 6e 6f 64 65 43 6d 64 73 3a 3a 65 31 20 7b 0a   nodeCmds::e1 {.
d1e0: 20 20 20 20 20 20 20 20 20 20 20 20 6e 6f 64 65              node
d1f0: 43 6d 64 73 3a 3a 74 20 22 53 6f 6d 65 20 74 65  Cmds::t "Some te
d200: 78 74 22 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  xt".        }.  
d210: 20 20 7d 0a 20 20 20 20 73 65 74 20 72 65 73 75    }.    set resu
d220: 6c 74 20 5b 6c 69 73 74 20 5b 24 64 6f 63 20 61  lt [list [$doc a
d230: 73 58 4d 4c 20 2d 69 6e 64 65 6e 74 20 6e 6f 6e  sXML -indent non
d240: 65 5d 5d 0a 20 20 20 20 24 64 6f 63 20 64 65 6c  e]].    $doc del
d250: 65 74 65 0a 20 20 20 20 6c 61 70 70 65 6e 64 20  ete.    lappend 
d260: 72 65 73 75 6c 74 20 5b 63 61 74 63 68 20 7b 0a  result [catch {.
d270: 20 20 20 20 20 20 20 20 6e 6f 64 65 43 6d 64 73          nodeCmds
d280: 3a 3a 65 31 20 7b 0a 20 20 20 20 20 20 20 20 20  ::e1 {.         
d290: 20 20 20 6e 6f 64 65 43 6d 64 73 3a 3a 74 20 22     nodeCmds::t "
d2a0: 53 6f 6d 65 20 74 65 78 74 22 0a 20 20 20 20 20  Some text".     
d2b0: 20 20 20 7d 7d 20 65 72 72 4d 73 67 5d 0a 20 20     }} errMsg].  
d2c0: 20 20 6c 61 70 70 65 6e 64 20 72 65 73 75 6c 74    lappend result
d2d0: 20 24 65 72 72 4d 73 67 0a 7d 20 7b 7b 3c 64 6f   $errMsg.} {{<do
d2e0: 63 52 6f 6f 74 3e 3c 65 31 3e 53 6f 6d 65 20 74  cRoot><e1>Some t
d2f0: 65 78 74 3c 2f 65 31 3e 3c 2f 64 6f 63 52 6f 6f  ext</e1></docRoo
d300: 74 3e 7d 20 31 20 7b 63 61 6c 6c 65 64 20 6f 75  t>} 1 {called ou
d310: 74 73 69 64 65 20 64 6f 6d 4e 6f 64 65 20 63 6f  tside domNode co
d320: 6e 74 65 78 74 7d 7d 0a 0a 6e 61 6d 65 73 70 61  ntext}}..namespa
d330: 63 65 20 65 76 61 6c 20 6e 6f 64 65 43 6d 64 73  ce eval nodeCmds
d340: 20 7b 0a 20 20 20 20 64 6f 6d 20 63 72 65 61 74   {.    dom creat
d350: 65 4e 6f 64 65 43 6d 64 20 2d 74 61 67 4e 61 6d  eNodeCmd -tagNam
d360: 65 20 66 6f 6f 20 65 6c 65 6d 65 6e 74 4e 6f 64  e foo elementNod
d370: 65 20 62 61 72 0a 7d 0a 74 65 73 74 20 64 6f 6d  e bar.}.test dom
d380: 2d 31 30 2e 36 20 7b 63 72 65 61 74 65 4e 6f 64  -10.6 {createNod
d390: 65 43 6d 64 20 2d 20 6f 70 74 69 6f 6e 20 2d 74  eCmd - option -t
d3a0: 61 67 4e 61 6d 65 7d 20 7b 0a 20 20 20 20 73 65  agName} {.    se
d3b0: 74 20 64 6f 63 20 5b 64 6f 6d 20 63 72 65 61 74  t doc [dom creat
d3c0: 65 44 6f 63 75 6d 65 6e 74 4e 6f 64 65 5d 0a 20  eDocumentNode]. 
d3d0: 20 20 20 24 64 6f 63 20 61 70 70 65 6e 64 46 72     $doc appendFr
d3e0: 6f 6d 53 63 72 69 70 74 20 7b 0a 20 20 20 20 20  omScript {.     
d3f0: 20 20 20 6e 6f 64 65 43 6d 64 73 3a 3a 62 61 72     nodeCmds::bar
d400: 20 7b 7d 0a 20 20 20 20 7d 0a 20 20 20 20 73 65   {}.    }.    se
d410: 74 20 72 65 73 75 6c 74 20 5b 24 64 6f 63 20 61  t result [$doc a
d420: 73 58 4d 4c 20 2d 69 6e 64 65 6e 74 20 6e 6f 6e  sXML -indent non
d430: 65 5d 0a 20 20 20 20 24 64 6f 63 20 64 65 6c 65  e].    $doc dele
d440: 74 65 0a 20 20 20 20 73 65 74 20 72 65 73 75 6c  te.    set resul
d450: 74 0a 7d 20 7b 3c 66 6f 6f 2f 3e 7d 0a 0a 6e 61  t.} {<foo/>}..na
d460: 6d 65 73 70 61 63 65 20 64 65 6c 65 74 65 20 6e  mespace delete n
d470: 6f 64 65 43 6d 64 73 0a 0a 74 65 73 74 20 64 6f  odeCmds..test do
d480: 6d 2d 31 31 2e 31 20 7b 66 65 61 74 75 72 65 69  m-11.1 {featurei
d490: 6e 66 6f 20 2d 20 65 78 70 61 74 76 65 72 73 69  nfo - expatversi
d4a0: 6f 6e 7d 20 2d 62 6f 64 79 20 7b 0a 20 20 20 20  on} -body {.    
d4b0: 64 6f 6d 20 66 65 61 74 75 72 65 69 6e 66 6f 20  dom featureinfo 
d4c0: 65 78 70 61 74 76 65 72 73 69 6f 6e 0a 7d 20 2d  expatversion.} -
d4d0: 6d 61 74 63 68 20 72 65 67 65 78 70 20 2d 72 65  match regexp -re
d4e0: 73 75 6c 74 20 7b 65 78 70 61 74 5f 2e 2a 7d 0a  sult {expat_.*}.
d4f0: 0a 74 65 73 74 20 64 6f 6d 2d 31 31 2e 32 20 7b  .test dom-11.2 {
d500: 66 65 61 74 75 72 65 69 6e 66 6f 20 2d 20 69 6e  featureinfo - in
d510: 76 61 6c 69 64 20 61 72 67 7d 20 2d 62 6f 64 79  valid arg} -body
d520: 20 7b 0a 20 20 20 20 63 61 74 63 68 20 7b 64 6f   {.    catch {do
d530: 6d 20 66 65 61 74 75 72 65 69 6e 66 6f 20 66 6f  m featureinfo fo
d540: 6f 7d 20 65 72 72 4d 73 67 0a 7d 20 2d 72 65 73  o} errMsg.} -res
d550: 75 6c 74 20 31 0a 0a 74 65 73 74 20 64 6f 6d 2d  ult 1..test dom-
d560: 31 31 2e 33 20 7b 66 65 61 74 75 72 65 69 6e 66  11.3 {featureinf
d570: 6f 20 2d 20 65 78 70 61 74 6d 61 6a 6f 72 76 65  o - expatmajorve
d580: 72 73 69 6f 6e 7d 20 2d 62 6f 64 79 20 7b 0a 20  rsion} -body {. 
d590: 20 20 20 64 6f 6d 20 66 65 61 74 75 72 65 69 6e     dom featurein
d5a0: 66 6f 20 65 78 70 61 74 6d 61 6a 6f 72 76 65 72  fo expatmajorver
d5b0: 73 69 6f 6e 0a 7d 20 2d 6d 61 74 63 68 20 72 65  sion.} -match re
d5c0: 67 65 78 70 20 2d 72 65 73 75 6c 74 20 7b 28 31  gexp -result {(1
d5d0: 7c 32 29 7d 0a 0a 74 65 73 74 20 64 6f 6d 2d 31  |2)}..test dom-1
d5e0: 31 2e 34 20 7b 66 65 61 74 75 72 65 69 6e 66 6f  1.4 {featureinfo
d5f0: 20 2d 20 64 74 64 7d 20 2d 62 6f 64 79 20 7b 0a   - dtd} -body {.
d600: 20 20 20 20 64 6f 6d 20 66 65 61 74 75 72 65 69      dom featurei
d610: 6e 66 6f 20 64 74 64 0a 7d 20 2d 6d 61 74 63 68  nfo dtd.} -match
d620: 20 72 65 67 65 78 70 20 2d 72 65 73 75 6c 74 20   regexp -result 
d630: 7b 28 30 7c 31 29 7d 0a 0a 74 65 73 74 20 64 6f  {(0|1)}..test do
d640: 6d 2d 31 31 2e 35 20 7b 66 65 61 74 75 72 65 69  m-11.5 {featurei
d650: 6e 66 6f 20 2d 20 6a 73 6f 6e 6d 61 78 6e 65 73  nfo - jsonmaxnes
d660: 74 69 6e 67 7d 20 7b 0a 20 20 20 20 64 6f 6d 20  ting} {.    dom 
d670: 66 65 61 74 75 72 65 69 6e 66 6f 20 6a 73 6f 6e  featureinfo json
d680: 6d 61 78 6e 65 73 74 69 6e 67 0a 7d 20 32 30 30  maxnesting.} 200
d690: 30 0a 0a 74 65 73 74 20 64 6f 6d 2d 31 31 2e 36  0..test dom-11.6
d6a0: 20 7b 66 65 61 74 75 72 65 69 6e 66 6f 20 2d 20   {featureinfo - 
d6b0: 76 65 72 73 69 6f 6e 68 61 73 68 7d 20 7b 0a 20  versionhash} {. 
d6c0: 20 20 20 72 65 67 65 78 70 20 7b 5e 5b 30 2d 39     regexp {^[0-9
d6d0: 61 2d 66 41 2d 46 5d 2b 24 7d 20 5b 64 6f 6d 20  a-fA-F]+$} [dom 
d6e0: 66 65 61 74 75 72 65 69 6e 66 6f 20 76 65 72 73  featureinfo vers
d6f0: 69 6f 6e 68 61 73 68 5d 0a 7d 20 31 0a 0a 70 72  ionhash].} 1..pr
d700: 6f 63 20 3a 3a 64 6f 6d 3a 3a 64 6f 6d 50 61 72  oc ::dom::domPar
d710: 73 65 46 65 65 64 62 61 63 6b 20 7b 7d 20 7b 0a  seFeedback {} {.
d720: 20 20 20 20 72 65 74 75 72 6e 20 2d 63 6f 64 65      return -code
d730: 20 62 72 65 61 6b 0a 7d 0a 74 65 73 74 20 64 6f   break.}.test do
d740: 6d 2d 31 32 2e 31 20 7b 2d 66 65 65 64 62 61 63  m-12.1 {-feedbac
d750: 6b 41 66 74 65 72 20 2d 2d 20 63 6d 64 20 72 65  kAfter -- cmd re
d760: 74 75 72 6e 73 20 54 43 4c 5f 42 52 45 41 4b 7d  turns TCL_BREAK}
d770: 20 2d 62 6f 64 79 20 7b 0a 20 20 20 20 64 6f 6d   -body {.    dom
d780: 20 70 61 72 73 65 20 2d 66 65 65 64 62 61 63 6b   parse -feedback
d790: 41 66 74 65 72 20 31 20 7b 3c 64 6f 63 3e 3c 65  After 1 {<doc><e
d7a0: 31 2f 3e 3c 65 31 2f 3e 3c 65 31 2f 3e 3c 2f 64  1/><e1/><e1/></d
d7b0: 6f 63 3e 7d 0a 7d 20 2d 72 65 73 75 6c 74 20 22  oc>}.} -result "
d7c0: 22 0a 0a 70 72 6f 63 20 3a 3a 64 6f 6d 3a 3a 64  "..proc ::dom::d
d7d0: 6f 6d 50 61 72 73 65 46 65 65 64 62 61 63 6b 20  omParseFeedback 
d7e0: 7b 7d 20 7b 0a 20 20 20 20 65 72 72 6f 72 20 22  {} {.    error "
d7f0: 45 72 72 6f 72 20 69 6e 20 66 65 65 64 62 61 63  Error in feedbac
d800: 6b 20 63 6d 64 2e 22 0a 7d 0a 74 65 73 74 20 64  k cmd.".}.test d
d810: 6f 6d 2d 31 32 2e 32 20 7b 2d 66 65 65 64 62 61  om-12.2 {-feedba
d820: 63 6b 41 66 74 65 72 20 2d 2d 20 63 6d 64 20 72  ckAfter -- cmd r
d830: 65 74 75 72 6e 73 20 54 43 4c 5f 45 52 52 4f 52  eturns TCL_ERROR
d840: 7d 20 2d 62 6f 64 79 20 7b 0a 20 20 20 20 73 65  } -body {.    se
d850: 74 20 72 65 73 75 6c 74 20 5b 63 61 74 63 68 20  t result [catch 
d860: 7b 0a 20 20 20 20 20 20 20 20 64 6f 6d 20 70 61  {.        dom pa
d870: 72 73 65 20 2d 66 65 65 64 62 61 63 6b 41 66 74  rse -feedbackAft
d880: 65 72 20 31 20 7b 3c 64 6f 63 3e 3c 65 31 2f 3e  er 1 {<doc><e1/>
d890: 3c 65 31 2f 3e 3c 65 31 2f 3e 3c 2f 64 6f 63 3e  <e1/><e1/></doc>
d8a0: 7d 0a 20 20 20 20 7d 20 6d 73 67 5d 0a 20 20 20  }.    } msg].   
d8b0: 20 6c 69 73 74 20 24 72 65 73 75 6c 74 20 24 6d   list $result $m
d8c0: 73 67 0a 7d 20 2d 72 65 73 75 6c 74 20 5b 6c 69  sg.} -result [li
d8d0: 73 74 20 31 20 22 45 72 72 6f 72 20 69 6e 20 66  st 1 "Error in f
d8e0: 65 65 64 62 61 63 6b 20 63 6d 64 2e 22 5d 0a 0a  eedback cmd."]..
d8f0: 70 72 6f 63 20 3a 3a 64 6f 6d 3a 3a 64 6f 6d 50  proc ::dom::domP
d900: 61 72 73 65 46 65 65 64 62 61 63 6b 20 7b 7d 20  arseFeedback {} 
d910: 7b 0a 20 20 20 20 23 20 55 70 64 61 74 65 20 70  {.    # Update p
d920: 72 6f 67 65 73 73 20 64 69 61 6c 6f 67 2c 20 63  rogess dialog, c
d930: 68 65 63 6b 20 66 6f 72 20 63 61 6e 63 65 6c 20  heck for cancel 
d940: 65 74 63 2e 0a 20 20 20 20 72 65 74 75 72 6e 0a  etc..    return.
d950: 7d 0a 74 65 73 74 20 64 6f 6d 2d 31 32 2e 33 20  }.test dom-12.3 
d960: 7b 2d 66 65 65 64 62 61 63 6b 41 66 74 65 72 7d  {-feedbackAfter}
d970: 20 2d 62 6f 64 79 20 7b 0a 20 20 20 20 73 65 74   -body {.    set
d980: 20 64 6f 63 20 5b 64 6f 6d 20 70 61 72 73 65 20   doc [dom parse 
d990: 2d 66 65 65 64 62 61 63 6b 41 66 74 65 72 20 31  -feedbackAfter 1
d9a0: 20 7b 3c 64 6f 63 3e 3c 65 31 2f 3e 3c 65 31 2f   {<doc><e1/><e1/
d9b0: 3e 3c 65 31 2f 3e 3c 2f 64 6f 63 3e 7d 5d 0a 20  ><e1/></doc>}]. 
d9c0: 20 20 20 24 64 6f 63 20 73 65 6c 65 63 74 4e 6f     $doc selectNo
d9d0: 64 65 73 20 63 6f 75 6e 74 28 2f 2f 2a 29 0a 7d  des count(//*).}
d9e0: 20 2d 72 65 73 75 6c 74 20 34 0a 74 65 73 74 20   -result 4.test 
d9f0: 64 6f 6d 2d 31 32 2e 34 20 7b 2d 66 65 65 64 62  dom-12.4 {-feedb
da00: 61 63 6b 41 66 74 65 72 20 61 6e 64 20 2d 63 68  ackAfter and -ch
da10: 61 6e 6e 65 6c 7d 20 2d 73 65 74 75 70 20 7b 0a  annel} -setup {.
da20: 20 20 20 20 73 65 74 20 78 6d 6c 46 69 6c 65 20      set xmlFile 
da30: 5b 6d 61 6b 65 46 69 6c 65 20 7b 3c 64 6f 63 3e  [makeFile {<doc>
da40: 3c 65 31 2f 3e 3c 65 31 2f 3e 3c 65 31 2f 3e 3c  <e1/><e1/><e1/><
da50: 2f 64 6f 63 3e 7d 20 64 6f 6d 2e 78 6d 6c 5d 0a  /doc>} dom.xml].
da60: 7d 20 2d 62 6f 64 79 20 7b 0a 20 20 20 20 73 65  } -body {.    se
da70: 74 20 66 64 20 5b 6f 70 65 6e 20 24 78 6d 6c 46  t fd [open $xmlF
da80: 69 6c 65 5d 0a 20 20 20 20 73 65 74 20 64 6f 63  ile].    set doc
da90: 20 5b 64 6f 6d 20 70 61 72 73 65 20 2d 63 68 61   [dom parse -cha
daa0: 6e 6e 65 6c 20 24 66 64 20 2d 66 65 65 64 62 61  nnel $fd -feedba
dab0: 63 6b 41 66 74 65 72 20 31 5d 0a 20 20 20 20 63  ckAfter 1].    c
dac0: 6c 6f 73 65 20 24 66 64 0a 20 20 20 20 24 64 6f  lose $fd.    $do
dad0: 63 20 73 65 6c 65 63 74 4e 6f 64 65 73 20 63 6f  c selectNodes co
dae0: 75 6e 74 28 2f 2f 2a 29 0a 7d 20 2d 63 6c 65 61  unt(//*).} -clea
daf0: 6e 75 70 20 7b 0a 20 20 20 20 72 65 6d 6f 76 65  nup {.    remove
db00: 46 69 6c 65 20 64 6f 6d 2e 78 6d 6c 0a 7d 20 2d  File dom.xml.} -
db10: 72 65 73 75 6c 74 20 34 0a 70 72 6f 63 20 65 78  result 4.proc ex
db20: 74 52 65 66 52 65 73 6f 6c 76 65 72 2d 31 32 2e  tRefResolver-12.
db30: 35 20 7b 62 61 73 65 20 73 79 73 74 65 6d 49 64  5 {base systemId
db40: 20 70 75 62 6c 69 63 49 64 7d 20 7b 0a 20 20 20   publicId} {.   
db50: 20 73 77 69 74 63 68 20 24 70 75 62 6c 69 63 49   switch $publicI
db60: 64 20 7b 0a 20 20 20 20 20 20 20 20 22 61 22 20  d {.        "a" 
db70: 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 73 65  {.            se
db80: 74 20 64 61 74 61 20 22 3c 65 31 2f 3e 22 0a 20  t data "<e1/>". 
db90: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
dba0: 20 22 62 22 20 7b 0a 20 20 20 20 20 20 20 20 20   "b" {.         
dbb0: 20 20 20 73 65 74 20 64 61 74 61 20 22 3c 65 31     set data "<e1
dbc0: 2f 3e 3c 65 31 2f 3e 22 0a 20 20 20 20 20 20 20  /><e1/>".       
dbd0: 20 7d 0a 20 20 20 20 20 20 20 20 64 65 66 61 75   }.        defau
dbe0: 6c 74 20 7b 0a 20 20 20 20 20 20 20 20 20 20 20  lt {.           
dbf0: 20 65 72 72 6f 72 20 22 75 6e 6b 6e 6f 77 6e 20   error "unknown 
dc00: 70 75 62 6c 69 63 20 49 44 22 0a 20 20 20 20 20  public ID".     
dc10: 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 72     }.    }.    r
dc20: 65 74 75 72 6e 20 5b 6c 69 73 74 20 22 73 74 72  eturn [list "str
dc30: 69 6e 67 22 20 24 62 61 73 65 20 24 64 61 74 61  ing" $base $data
dc40: 5d 0a 7d 0a 74 65 73 74 20 64 6f 6d 2d 31 32 2e  ].}.test dom-12.
dc50: 35 20 7b 2d 66 65 65 64 62 61 63 6b 41 66 74 65  5 {-feedbackAfte
dc60: 72 20 61 6e 64 20 65 78 74 65 72 6e 61 6c 20 65  r and external e
dc70: 6e 74 69 74 69 65 73 7d 20 2d 62 6f 64 79 20 7b  ntities} -body {
dc80: 0a 20 20 20 20 73 65 74 20 64 6f 63 20 5b 64 6f  .    set doc [do
dc90: 6d 20 70 61 72 73 65 20 2d 65 78 74 65 72 6e 61  m parse -externa
dca0: 6c 65 6e 74 69 74 79 63 6f 6d 6d 61 6e 64 20 65  lentitycommand e
dcb0: 78 74 52 65 66 52 65 73 6f 6c 76 65 72 2d 31 32  xtRefResolver-12
dcc0: 2e 35 20 5c 0a 20 20 20 20 20 20 20 20 20 20 20  .5 \.           
dcd0: 20 20 20 20 20 20 2d 66 65 65 64 62 61 63 6b 41        -feedbackA
dce0: 66 74 65 72 20 31 20 7b 0a 20 20 20 20 20 20 20  fter 1 {.       
dcf0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 3c 21                <!
dd00: 44 4f 43 54 59 50 45 20 64 6f 63 20 5b 0a 20 20  DOCTYPE doc [.  
dd10: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
dd20: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
dd30: 20 20 3c 21 45 4e 54 49 54 59 20 61 20 50 55 42    <!ENTITY a PUB
dd40: 4c 49 43 20 22 61 22 20 22 61 2e 78 6d 6c 22 3e  LIC "a" "a.xml">
dd50: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
dd60: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
dd70: 20 20 20 20 20 3c 21 45 4e 54 49 54 59 20 62 20       <!ENTITY b 
dd80: 50 55 42 4c 49 43 20 22 62 22 20 22 62 2e 78 6d  PUBLIC "b" "b.xm
dd90: 6c 22 3e 0a 20 20 20 20 20 20 20 20 20 20 20 20  l">.            
dda0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ddb0: 20 20 20 20 20 20 20 20 5d 3e 0a 20 20 20 20 20          ]>.     
ddc0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ddd0: 3c 64 6f 63 3e 26 61 3b 26 62 3b 3c 2f 64 6f 63  <doc>&a;&b;</doc
dde0: 3e 7d 5d 0a 20 20 20 20 24 64 6f 63 20 73 65 6c  >}].    $doc sel
ddf0: 65 63 74 4e 6f 64 65 73 20 63 6f 75 6e 74 28 2f  ectNodes count(/
de00: 2f 2a 29 0a 7d 20 2d 72 65 73 75 6c 74 20 34 0a  /*).} -result 4.
de10: 0a 73 65 74 20 63 61 6e 63 65 6c 20 30 0a 70 72  .set cancel 0.pr
de20: 6f 63 20 65 78 74 52 65 66 52 65 73 6f 6c 76 65  oc extRefResolve
de30: 72 2d 31 32 2e 36 20 7b 62 61 73 65 20 73 79 73  r-12.6 {base sys
de40: 74 65 6d 49 64 20 70 75 62 6c 69 63 49 64 7d 20  temId publicId} 
de50: 7b 0a 20 20 20 20 67 6c 6f 62 61 6c 20 63 61 6e  {.    global can
de60: 63 65 6c 0a 20 20 20 20 73 77 69 74 63 68 20 24  cel.    switch $
de70: 70 75 62 6c 69 63 49 64 20 7b 0a 20 20 20 20 20  publicId {.     
de80: 20 20 20 22 61 22 20 7b 0a 20 20 20 20 20 20 20     "a" {.       
de90: 20 20 20 20 20 73 65 74 20 63 61 6e 63 65 6c 20       set cancel 
dea0: 31 0a 20 20 20 20 20 20 20 20 20 20 20 20 73 65  1.            se
deb0: 74 20 64 61 74 61 20 22 3c 65 31 2f 3e 3c 65 31  t data "<e1/><e1
dec0: 2f 3e 22 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  />".        }.  
ded0: 20 20 20 20 20 20 22 62 22 20 7b 0a 20 20 20 20        "b" {.    
dee0: 20 20 20 20 20 20 20 20 73 65 74 20 64 61 74 61          set data
def0: 20 22 3c 65 31 2f 3e 22 0a 20 20 20 20 20 20 20   "<e1/>".       
df00: 20 7d 0a 20 20 20 20 20 20 20 20 64 65 66 61 75   }.        defau
df10: 6c 74 20 7b 0a 20 20 20 20 20 20 20 20 20 20 20  lt {.           
df20: 20 65 72 72 6f 72 20 22 75 6e 6b 6e 6f 77 6e 20   error "unknown 
df30: 70 75 62 6c 69 63 20 49 44 22 0a 20 20 20 20 20  public ID".     
df40: 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 72     }.    }.    r
df50: 65 74 75 72 6e 20 5b 6c 69 73 74 20 22 73 74 72  eturn [list "str
df60: 69 6e 67 22 20 24 62 61 73 65 20 24 64 61 74 61  ing" $base $data
df70: 5d 0a 7d 0a 70 72 6f 63 20 3a 3a 64 6f 6d 3a 3a  ].}.proc ::dom::
df80: 64 6f 6d 50 61 72 73 65 46 65 65 64 62 61 63 6b  domParseFeedback
df90: 20 7b 7d 20 7b 0a 20 20 20 20 67 6c 6f 62 61 6c   {} {.    global
dfa0: 20 63 61 6e 63 65 6c 0a 20 20 20 20 69 66 20 7b   cancel.    if {
dfb0: 24 63 61 6e 63 65 6c 7d 20 7b 0a 20 20 20 20 20  $cancel} {.     
dfc0: 20 20 20 72 65 74 75 72 6e 20 2d 63 6f 64 65 20     return -code 
dfd0: 62 72 65 61 6b 0a 20 20 20 20 7d 0a 7d 0a 74 65  break.    }.}.te
dfe0: 73 74 20 64 6f 6d 2d 31 32 2e 36 20 7b 2d 66 65  st dom-12.6 {-fe
dff0: 65 64 62 61 63 6b 41 66 74 65 72 20 61 6e 64 20  edbackAfter and 
e000: 65 78 74 65 72 6e 61 6c 20 65 6e 74 69 74 69 65  external entitie
e010: 73 2c 20 77 69 74 68 20 63 61 6e 63 65 6c 7d 20  s, with cancel} 
e020: 2d 62 6f 64 79 20 7b 0a 20 20 20 20 64 6f 6d 20  -body {.    dom 
e030: 70 61 72 73 65 20 2d 65 78 74 65 72 6e 61 6c 65  parse -externale
e040: 6e 74 69 74 79 63 6f 6d 6d 61 6e 64 20 65 78 74  ntitycommand ext
e050: 52 65 66 52 65 73 6f 6c 76 65 72 2d 31 32 2e 36  RefResolver-12.6
e060: 20 5c 0a 20 20 20 20 20 20 20 20 2d 66 65 65 64   \.        -feed
e070: 62 61 63 6b 41 66 74 65 72 20 31 20 7b 0a 20 20  backAfter 1 {.  
e080: 20 20 20 20 20 20 20 20 20 20 3c 21 44 4f 43 54            <!DOCT
e090: 59 50 45 20 64 6f 63 20 5b 0a 20 20 20 20 20 20  YPE doc [.      
e0a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e0b0: 20 20 20 20 20 3c 21 45 4e 54 49 54 59 20 61 20       <!ENTITY a 
e0c0: 50 55 42 4c 49 43 20 22 61 22 20 22 61 2e 78 6d  PUBLIC "a" "a.xm
e0d0: 6c 22 3e 0a 20 20 20 20 20 20 20 20 20 20 20 20  l">.            
e0e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 3c                 <
e0f0: 21 45 4e 54 49 54 59 20 62 20 50 55 42 4c 49 43  !ENTITY b PUBLIC
e100: 20 22 62 22 20 22 62 2e 78 6d 6c 22 3e 0a 20 20   "b" "b.xml">.  
e110: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e120: 20 20 20 20 20 20 20 20 5d 3e 0a 20 20 20 20 20          ]>.     
e130: 20 20 20 20 20 20 20 3c 64 6f 63 3e 26 61 3b 26         <doc>&a;&
e140: 62 3b 3c 2f 64 6f 63 3e 7d 0a 7d 20 2d 72 65 73  b;</doc>}.} -res
e150: 75 6c 74 20 22 22 0a 70 72 6f 63 20 3a 3a 64 6f  ult "".proc ::do
e160: 6d 3a 3a 64 6f 6d 50 61 72 73 65 46 65 65 64 62  m::domParseFeedb
e170: 61 63 6b 20 7b 7d 20 7b 0a 20 20 20 20 67 6c 6f  ack {} {.    glo
e180: 62 61 6c 20 63 61 6e 63 65 6c 0a 20 20 20 20 69  bal cancel.    i
e190: 66 20 7b 24 63 61 6e 63 65 6c 7d 20 7b 0a 20 20  f {$cancel} {.  
e1a0: 20 20 20 20 20 20 65 72 72 6f 72 20 22 45 72 72        error "Err
e1b0: 6f 72 20 69 6e 20 66 65 65 64 62 61 63 6b 20 63  or in feedback c
e1c0: 6d 64 2e 22 0a 20 20 20 20 7d 0a 7d 0a 74 65 73  md.".    }.}.tes
e1d0: 74 20 64 6f 6d 2d 31 32 2e 37 20 7b 2d 66 65 65  t dom-12.7 {-fee
e1e0: 64 62 61 63 6b 41 66 74 65 72 20 61 6e 64 20 65  dbackAfter and e
e1f0: 78 74 65 72 6e 61 6c 20 65 6e 74 69 74 69 65 73  xternal entities
e200: 2c 20 77 69 74 68 20 65 72 72 6f 72 7d 20 2d 62  , with error} -b
e210: 6f 64 79 20 7b 0a 20 20 20 20 73 65 74 20 72 65  ody {.    set re
e220: 73 75 6c 74 20 5b 63 61 74 63 68 20 7b 64 6f 6d  sult [catch {dom
e230: 20 70 61 72 73 65 20 2d 65 78 74 65 72 6e 61 6c   parse -external
e240: 65 6e 74 69 74 79 63 6f 6d 6d 61 6e 64 20 65 78  entitycommand ex
e250: 74 52 65 66 52 65 73 6f 6c 76 65 72 2d 31 32 2e  tRefResolver-12.
e260: 36 20 5c 0a 20 20 20 20 20 20 20 20 20 20 20 20  6 \.            
e270: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2d                 -
e280: 66 65 65 64 62 61 63 6b 41 66 74 65 72 20 31 20  feedbackAfter 1 
e290: 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  {.              
e2a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e2b0: 20 3c 21 44 4f 43 54 59 50 45 20 64 6f 63 20 5b   <!DOCTYPE doc [
e2c0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
e2d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e2e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 3c                 <
e2f0: 21 45 4e 54 49 54 59 20 61 20 50 55 42 4c 49 43  !ENTITY a PUBLIC
e300: 20 22 61 22 20 22 61 2e 78 6d 6c 22 3e 0a 20 20   "a" "a.xml">.  
e310: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e320: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e330: 20 20 20 20 20 20 20 20 20 20 20 20 3c 21 45 4e              <!EN
e340: 54 49 54 59 20 62 20 50 55 42 4c 49 43 20 22 62  TITY b PUBLIC "b
e350: 22 20 22 62 2e 78 6d 6c 22 3e 0a 20 20 20 20 20  " "b.xml">.     
e360: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e370: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e380: 20 20 20 20 20 20 20 20 5d 3e 0a 20 20 20 20 20          ]>.     
e390: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e3a0: 20 20 20 20 20 20 20 20 20 20 3c 64 6f 63 3e 26            <doc>&
e3b0: 61 3b 26 62 3b 3c 2f 64 6f 63 3e 7d 7d 20 6d 73  a;&b;</doc>}} ms
e3c0: 67 5d 0a 20 20 20 20 6c 69 73 74 20 24 72 65 73  g].    list $res
e3d0: 75 6c 74 20 24 6d 73 67 0a 7d 20 2d 72 65 73 75  ult $msg.} -resu
e3e0: 6c 74 20 5b 6c 69 73 74 20 31 20 22 45 72 72 6f  lt [list 1 "Erro
e3f0: 72 20 69 6e 20 66 65 65 64 62 61 63 6b 20 63 6d  r in feedback cm
e400: 64 2e 22 5d 0a 0a 74 65 73 74 20 64 6f 6d 2d 31  d."]..test dom-1
e410: 32 2e 38 20 7b 2d 66 65 65 64 62 61 63 6b 41 66  2.8 {-feedbackAf
e420: 74 65 72 20 77 69 74 68 6f 75 74 20 2d 66 65 65  ter without -fee
e430: 64 62 61 63 6b 63 6d 64 7d 20 2d 73 65 74 75 70  dbackcmd} -setup
e440: 20 7b 0a 20 20 20 20 63 61 74 63 68 20 7b 72 65   {.    catch {re
e450: 6e 61 6d 65 20 3a 3a 64 6f 6d 3a 3a 64 6f 6d 50  name ::dom::domP
e460: 61 72 73 65 46 65 65 64 62 61 63 6b 20 22 22 7d  arseFeedback ""}
e470: 0a 7d 20 2d 62 6f 64 79 20 7b 0a 20 20 20 20 73  .} -body {.    s
e480: 65 74 20 72 65 73 75 6c 74 20 5b 63 61 74 63 68  et result [catch
e490: 20 7b 64 6f 6d 20 70 61 72 73 65 20 2d 66 65 65   {dom parse -fee
e4a0: 64 62 61 63 6b 41 66 74 65 72 20 31 30 30 20 3c  dbackAfter 100 <
e4b0: 64 6f 63 2f 3e 7d 20 6d 73 67 5d 0a 20 20 20 20  doc/>} msg].    
e4c0: 6c 69 73 74 20 24 72 65 73 75 6c 74 20 24 6d 73  list $result $ms
e4d0: 67 0a 7d 20 2d 72 65 73 75 6c 74 20 7b 31 20 7b  g.} -result {1 {
e4e0: 49 66 20 2d 66 65 65 64 62 61 63 6b 41 66 74 65  If -feedbackAfte
e4f0: 72 20 69 73 20 75 73 65 64 2c 20 2d 66 65 65 64  r is used, -feed
e500: 62 61 63 6b 63 6d 64 20 6d 75 73 74 20 61 6c 73  backcmd must als
e510: 6f 20 62 65 20 75 73 65 64 2e 7d 7d 0a 0a 70 72  o be used.}}..pr
e520: 6f 63 20 66 65 65 64 62 61 63 6b 63 6d 64 2d 31  oc feedbackcmd-1
e530: 32 2e 39 20 7b 7d 20 7b 0a 20 20 20 20 72 65 74  2.9 {} {.    ret
e540: 75 72 6e 20 2d 63 6f 64 65 20 62 72 65 61 6b 0a  urn -code break.
e550: 7d 0a 74 65 73 74 20 64 6f 6d 2d 31 32 2e 39 20  }.test dom-12.9 
e560: 7b 2d 66 65 65 64 62 61 63 6b 41 66 74 65 72 20  {-feedbackAfter 
e570: 77 69 74 68 20 2d 66 65 65 64 62 61 63 6b 63 6d  with -feedbackcm
e580: 64 20 2d 2d 20 63 6d 64 20 72 65 74 75 72 6e 73  d -- cmd returns
e590: 20 54 43 4c 5f 42 52 45 41 4b 7d 20 2d 62 6f 64   TCL_BREAK} -bod
e5a0: 79 20 7b 0a 20 20 20 20 64 6f 6d 20 70 61 72 73  y {.    dom pars
e5b0: 65 20 2d 66 65 65 64 62 61 63 6b 41 66 74 65 72  e -feedbackAfter
e5c0: 20 31 20 2d 66 65 65 64 62 61 63 6b 63 6d 64 20   1 -feedbackcmd 
e5d0: 66 65 65 64 62 61 63 6b 63 6d 64 2d 31 32 2e 39  feedbackcmd-12.9
e5e0: 20 5c 0a 20 20 20 20 20 20 20 20 7b 3c 64 6f 63   \.        {<doc
e5f0: 3e 3c 65 31 2f 3e 3c 65 31 2f 3e 3c 65 31 2f 3e  ><e1/><e1/><e1/>
e600: 3c 2f 64 6f 63 3e 7d 0a 7d 20 2d 72 65 73 75 6c  </doc>}.} -resul
e610: 74 20 22 22 0a 0a 70 72 6f 63 20 66 65 65 64 62  t ""..proc feedb
e620: 61 63 6b 63 6d 64 2d 31 32 2e 31 30 20 7b 7d 20  ackcmd-12.10 {} 
e630: 7b 0a 20 20 20 20 65 72 72 6f 72 20 22 45 72 72  {.    error "Err
e640: 6f 72 20 69 6e 20 66 65 65 64 62 61 63 6b 20 63  or in feedback c
e650: 6d 64 2e 22 0a 7d 0a 74 65 73 74 20 64 6f 6d 2d  md.".}.test dom-
e660: 31 32 2e 31 30 20 7b 2d 66 65 65 64 62 61 63 6b  12.10 {-feedback
e670: 41 66 74 65 72 20 77 69 74 68 20 2d 66 65 65 64  After with -feed
e680: 62 61 63 6b 63 6d 64 20 2d 2d 20 63 6d 64 20 72  backcmd -- cmd r
e690: 65 74 75 72 6e 73 20 54 43 4c 5f 45 52 52 4f 52  eturns TCL_ERROR
e6a0: 7d 20 2d 62 6f 64 79 20 7b 0a 20 20 20 20 73 65  } -body {.    se
e6b0: 74 20 72 65 73 75 6c 74 20 5b 63 61 74 63 68 20  t result [catch 
e6c0: 7b 0a 20 20 20 20 20 20 20 20 64 6f 6d 20 70 61  {.        dom pa
e6d0: 72 73 65 20 2d 66 65 65 64 62 61 63 6b 41 66 74  rse -feedbackAft
e6e0: 65 72 20 31 20 2d 66 65 65 64 62 61 63 6b 63 6d  er 1 -feedbackcm
e6f0: 64 20 66 65 65 64 62 61 63 6b 63 6d 64 2d 31 32  d feedbackcmd-12
e700: 2e 31 30 20 5c 0a 20 20 20 20 20 20 20 20 20 20  .10 \.          
e710: 20 20 7b 3c 64 6f 63 3e 3c 65 31 2f 3e 3c 65 31    {<doc><e1/><e1
e720: 2f 3e 3c 65 31 2f 3e 3c 2f 64 6f 63 3e 7d 0a 20  /><e1/></doc>}. 
e730: 20 20 20 7d 20 6d 73 67 5d 0a 20 20 20 20 6c 69     } msg].    li
e740: 73 74 20 24 72 65 73 75 6c 74 20 24 6d 73 67 0a  st $result $msg.
e750: 7d 20 2d 72 65 73 75 6c 74 20 5b 6c 69 73 74 20  } -result [list 
e760: 31 20 22 45 72 72 6f 72 20 69 6e 20 66 65 65 64  1 "Error in feed
e770: 62 61 63 6b 20 63 6d 64 2e 22 5d 0a 0a 70 72 6f  back cmd."]..pro
e780: 63 20 66 65 65 64 62 61 63 6b 63 6d 64 2d 31 32  c feedbackcmd-12
e790: 2e 31 31 20 7b 7d 20 7b 0a 20 20 20 20 23 20 55  .11 {} {.    # U
e7a0: 70 64 61 74 65 20 70 72 6f 67 65 73 73 20 64 69  pdate progess di
e7b0: 61 6c 6f 67 2c 20 63 68 65 63 6b 20 66 6f 72 20  alog, check for 
e7c0: 63 61 6e 63 65 6c 20 65 74 63 2e 0a 20 20 20 20  cancel etc..    
e7d0: 72 65 74 75 72 6e 0a 7d 0a 74 65 73 74 20 64 6f  return.}.test do
e7e0: 6d 2d 31 32 2e 31 31 20 7b 2d 66 65 65 64 62 61  m-12.11 {-feedba
e7f0: 63 6b 41 66 74 65 72 20 77 69 74 68 20 2d 66 65  ckAfter with -fe
e800: 65 64 62 61 63 6b 63 6d 64 7d 20 2d 62 6f 64 79  edbackcmd} -body
e810: 20 7b 0a 20 20 20 20 73 65 74 20 64 6f 63 20 5b   {.    set doc [
e820: 64 6f 6d 20 70 61 72 73 65 20 2d 66 65 65 64 62  dom parse -feedb
e830: 61 63 6b 41 66 74 65 72 20 31 20 2d 66 65 65 64  ackAfter 1 -feed
e840: 62 61 63 6b 63 6d 64 20 66 65 65 64 62 61 63 6b  backcmd feedback
e850: 63 6d 64 2d 31 32 2e 31 31 20 5c 0a 20 20 20 20  cmd-12.11 \.    
e860: 20 20 20 20 20 20 20 20 20 20 20 20 20 7b 3c 64               {<d
e870: 6f 63 3e 3c 65 31 2f 3e 3c 65 31 2f 3e 3c 65 31  oc><e1/><e1/><e1
e880: 2f 3e 3c 2f 64 6f 63 3e 7d 5d 0a 20 20 20 20 24  /></doc>}].    $
e890: 64 6f 63 20 73 65 6c 65 63 74 4e 6f 64 65 73 20  doc selectNodes 
e8a0: 63 6f 75 6e 74 28 2f 2f 2a 29 0a 7d 20 2d 72 65  count(//*).} -re
e8b0: 73 75 6c 74 20 34 0a 74 65 73 74 20 64 6f 6d 2d  sult 4.test dom-
e8c0: 31 32 2e 31 32 20 7b 2d 66 65 65 64 62 61 63 6b  12.12 {-feedback
e8d0: 41 66 74 65 72 20 77 69 74 68 20 2d 66 65 65 64  After with -feed
e8e0: 62 61 63 6b 63 6d 64 20 61 6e 64 20 2d 63 68 61  backcmd and -cha
e8f0: 6e 6e 65 6c 7d 20 2d 73 65 74 75 70 20 7b 0a 20  nnel} -setup {. 
e900: 20 20 20 73 65 74 20 78 6d 6c 46 69 6c 65 20 5b     set xmlFile [
e910: 6d 61 6b 65 46 69 6c 65 20 7b 3c 64 6f 63 3e 3c  makeFile {<doc><
e920: 65 31 2f 3e 3c 65 31 2f 3e 3c 65 31 2f 3e 3c 2f  e1/><e1/><e1/></
e930: 64 6f 63 3e 7d 20 64 6f 6d 2e 78 6d 6c 5d 0a 7d  doc>} dom.xml].}
e940: 20 2d 62 6f 64 79 20 7b 0a 20 20 20 20 73 65 74   -body {.    set
e950: 20 66 64 20 5b 6f 70 65 6e 20 24 78 6d 6c 46 69   fd [open $xmlFi
e960: 6c 65 5d 0a 20 20 20 20 73 65 74 20 64 6f 63 20  le].    set doc 
e970: 5b 64 6f 6d 20 70 61 72 73 65 20 2d 63 68 61 6e  [dom parse -chan
e980: 6e 65 6c 20 24 66 64 20 2d 66 65 65 64 62 61 63  nel $fd -feedbac
e990: 6b 41 66 74 65 72 20 31 20 5c 0a 20 20 20 20 20  kAfter 1 \.     
e9a0: 20 20 20 20 20 20 20 20 20 20 20 20 2d 66 65 65              -fee
e9b0: 64 62 61 63 6b 63 6d 64 20 66 65 65 64 62 61 63  dbackcmd feedbac
e9c0: 6b 63 6d 64 2d 31 32 2e 31 31 5d 0a 20 20 20 20  kcmd-12.11].    
e9d0: 63 6c 6f 73 65 20 24 66 64 0a 20 20 20 20 24 64  close $fd.    $d
e9e0: 6f 63 20 73 65 6c 65 63 74 4e 6f 64 65 73 20 63  oc selectNodes c
e9f0: 6f 75 6e 74 28 2f 2f 2a 29 0a 7d 20 2d 63 6c 65  ount(//*).} -cle
ea00: 61 6e 75 70 20 7b 0a 20 20 20 20 72 65 6d 6f 76  anup {.    remov
ea10: 65 46 69 6c 65 20 64 6f 6d 2e 78 6d 6c 0a 7d 20  eFile dom.xml.} 
ea20: 2d 72 65 73 75 6c 74 20 34 0a 74 65 73 74 20 64  -result 4.test d
ea30: 6f 6d 2d 31 32 2e 31 33 20 7b 2d 66 65 65 64 62  om-12.13 {-feedb
ea40: 61 63 6b 41 66 74 65 72 20 77 69 74 68 20 2d 66  ackAfter with -f
ea50: 65 65 64 62 61 63 6b 63 6d 64 20 61 6e 64 20 65  eedbackcmd and e
ea60: 78 74 65 72 6e 61 6c 20 65 6e 74 69 74 69 65 73  xternal entities
ea70: 7d 20 2d 62 6f 64 79 20 7b 0a 20 20 20 20 73 65  } -body {.    se
ea80: 74 20 64 6f 63 20 5b 64 6f 6d 20 70 61 72 73 65  t doc [dom parse
ea90: 20 2d 65 78 74 65 72 6e 61 6c 65 6e 74 69 74 79   -externalentity
eaa0: 63 6f 6d 6d 61 6e 64 20 65 78 74 52 65 66 52 65  command extRefRe
eab0: 73 6f 6c 76 65 72 2d 31 32 2e 35 20 5c 0a 20 20  solver-12.5 \.  
eac0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2d                 -
ead0: 66 65 65 64 62 61 63 6b 63 6d 64 20 66 65 65 64  feedbackcmd feed
eae0: 62 61 63 6b 63 6d 64 2d 31 32 2e 31 31 20 5c 0a  backcmd-12.11 \.
eaf0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
eb00: 20 2d 66 65 65 64 62 61 63 6b 41 66 74 65 72 20   -feedbackAfter 
eb10: 31 20 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20  1 {.            
eb20: 20 20 20 20 20 20 20 20 20 3c 21 44 4f 43 54 59           <!DOCTY
eb30: 50 45 20 64 6f 63 20 5b 0a 20 20 20 20 20 20 20  PE doc [.       
eb40: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
eb50: 20 20 20 20 20 20 20 20 20 20 20 20 20 3c 21 45               <!E
eb60: 4e 54 49 54 59 20 61 20 50 55 42 4c 49 43 20 22  NTITY a PUBLIC "
eb70: 61 22 20 22 61 2e 78 6d 6c 22 3e 0a 20 20 20 20  a" "a.xml">.    
eb80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
eb90: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
eba0: 3c 21 45 4e 54 49 54 59 20 62 20 50 55 42 4c 49  <!ENTITY b PUBLI
ebb0: 43 20 22 62 22 20 22 62 2e 78 6d 6c 22 3e 0a 20  C "b" "b.xml">. 
ebc0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ebd0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ebe0: 20 20 20 5d 3e 0a 20 20 20 20 20 20 20 20 20 20     ]>.          
ebf0: 20 20 20 20 20 20 20 20 20 20 20 3c 64 6f 63 3e             <doc>
ec00: 26 61 3b 26 62 3b 3c 2f 64 6f 63 3e 7d 5d 0a 20  &a;&b;</doc>}]. 
ec10: 20 20 20 24 64 6f 63 20 73 65 6c 65 63 74 4e 6f     $doc selectNo
ec20: 64 65 73 20 63 6f 75 6e 74 28 2f 2f 2a 29 0a 7d  des count(//*).}
ec30: 20 2d 72 65 73 75 6c 74 20 34 0a 0a 73 65 74 20   -result 4..set 
ec40: 63 61 6e 63 65 6c 20 30 0a 70 72 6f 63 20 66 65  cancel 0.proc fe
ec50: 65 64 62 61 63 6b 63 6d 64 2d 31 32 2e 31 34 20  edbackcmd-12.14 
ec60: 7b 7d 20 7b 0a 20 20 20 20 67 6c 6f 62 61 6c 20  {} {.    global 
ec70: 63 61 6e 63 65 6c 0a 20 20 20 20 69 66 20 7b 24  cancel.    if {$
ec80: 63 61 6e 63 65 6c 7d 20 7b 0a 20 20 20 20 20 20  cancel} {.      
ec90: 20 20 72 65 74 75 72 6e 20 2d 63 6f 64 65 20 62    return -code b
eca0: 72 65 61 6b 0a 20 20 20 20 7d 0a 7d 0a 74 65 73  reak.    }.}.tes
ecb0: 74 20 64 6f 6d 2d 31 32 2e 31 34 20 7b 2d 66 65  t dom-12.14 {-fe
ecc0: 65 64 62 61 63 6b 41 66 74 65 72 20 77 69 74 68  edbackAfter with
ecd0: 20 2d 66 65 65 64 62 61 63 6b 63 6d 64 20 61 6e   -feedbackcmd an
ece0: 64 20 65 78 74 65 72 6e 61 6c 20 65 6e 74 69 74  d external entit
ecf0: 69 65 73 2c 20 77 69 74 68 20 63 61 6e 63 65 6c  ies, with cancel
ed00: 7d 20 2d 62 6f 64 79 20 7b 0a 20 20 20 20 64 6f  } -body {.    do
ed10: 6d 20 70 61 72 73 65 20 2d 65 78 74 65 72 6e 61  m parse -externa
ed20: 6c 65 6e 74 69 74 79 63 6f 6d 6d 61 6e 64 20 65  lentitycommand e
ed30: 78 74 52 65 66 52 65 73 6f 6c 76 65 72 2d 31 32  xtRefResolver-12
ed40: 2e 36 20 5c 0a 20 20 20 20 20 20 20 20 2d 66 65  .6 \.        -fe
ed50: 65 64 62 61 63 6b 63 6d 64 20 66 65 65 64 62 61  edbackcmd feedba
ed60: 63 6b 63 6d 64 2d 31 32 2e 31 34 20 5c 0a 20 20  ckcmd-12.14 \.  
ed70: 20 20 20 20 20 20 2d 66 65 65 64 62 61 63 6b 41        -feedbackA
ed80: 66 74 65 72 20 31 20 7b 0a 20 20 20 20 20 20 20  fter 1 {.       
ed90: 20 20 20 20 20 3c 21 44 4f 43 54 59 50 45 20 64       <!DOCTYPE d
eda0: 6f 63 20 5b 0a 20 20 20 20 20 20 20 20 20 20 20  oc [.           
edb0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
edc0: 3c 21 45 4e 54 49 54 59 20 61 20 50 55 42 4c 49  <!ENTITY a PUBLI
edd0: 43 20 22 61 22 20 22 61 2e 78 6d 6c 22 3e 0a 20  C "a" "a.xml">. 
ede0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
edf0: 20 20 20 20 20 20 20 20 20 20 3c 21 45 4e 54 49            <!ENTI
ee00: 54 59 20 62 20 50 55 42 4c 49 43 20 22 62 22 20  TY b PUBLIC "b" 
ee10: 22 62 2e 78 6d 6c 22 3e 0a 20 20 20 20 20 20 20  "b.xml">.       
ee20: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ee30: 20 20 20 5d 3e 0a 20 20 20 20 20 20 20 20 20 20     ]>.          
ee40: 20 20 3c 64 6f 63 3e 26 61 3b 26 62 3b 3c 2f 64    <doc>&a;&b;</d
ee50: 6f 63 3e 7d 0a 7d 20 2d 72 65 73 75 6c 74 20 22  oc>}.} -result "
ee60: 22 0a 73 65 74 20 63 61 6e 63 65 6c 20 30 0a 70  ".set cancel 0.p
ee70: 72 6f 63 20 66 65 65 64 62 61 63 6b 63 6d 64 2d  roc feedbackcmd-
ee80: 31 32 2e 31 35 20 7b 7d 20 7b 0a 20 20 20 20 67  12.15 {} {.    g
ee90: 6c 6f 62 61 6c 20 63 61 6e 63 65 6c 0a 20 20 20  lobal cancel.   
eea0: 20 69 66 20 7b 24 63 61 6e 63 65 6c 7d 20 7b 0a   if {$cancel} {.
eeb0: 20 20 20 20 20 20 20 20 65 72 72 6f 72 20 22 45          error "E
eec0: 72 72 6f 72 20 69 6e 20 66 65 65 64 62 61 63 6b  rror in feedback
eed0: 20 63 6d 64 2e 22 0a 20 20 20 20 7d 0a 7d 0a 74   cmd.".    }.}.t
eee0: 65 73 74 20 64 6f 6d 2d 31 32 2e 31 35 20 7b 2d  est dom-12.15 {-
eef0: 66 65 65 64 62 61 63 6b 41 66 74 65 72 20 77 69  feedbackAfter wi
ef00: 74 68 20 2d 66 65 65 64 62 61 63 6b 63 6d 64 20  th -feedbackcmd 
ef10: 61 6e 64 20 65 78 74 65 72 6e 61 6c 20 65 6e 74  and external ent
ef20: 69 74 69 65 73 2c 20 77 69 74 68 20 65 72 72 6f  ities, with erro
ef30: 72 7d 20 2d 62 6f 64 79 20 7b 0a 20 20 20 20 73  r} -body {.    s
ef40: 65 74 20 72 65 73 75 6c 74 20 5b 63 61 74 63 68  et result [catch
ef50: 20 7b 64 6f 6d 20 70 61 72 73 65 20 2d 65 78 74   {dom parse -ext
ef60: 65 72 6e 61 6c 65 6e 74 69 74 79 63 6f 6d 6d 61  ernalentitycomma
ef70: 6e 64 20 65 78 74 52 65 66 52 65 73 6f 6c 76 65  nd extRefResolve
ef80: 72 2d 31 32 2e 36 20 5c 0a 20 20 20 20 20 20 20  r-12.6 \.       
ef90: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
efa0: 20 20 20 20 2d 66 65 65 64 62 61 63 6b 63 6d 64      -feedbackcmd
efb0: 20 66 65 65 64 62 61 63 6b 63 6d 64 2d 31 32 2e   feedbackcmd-12.
efc0: 31 35 20 5c 0a 20 20 20 20 20 20 20 20 20 20 20  15 \.           
efd0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
efe0: 2d 66 65 65 64 62 61 63 6b 41 66 74 65 72 20 31  -feedbackAfter 1
eff0: 20 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20   {.             
f000: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f010: 20 20 3c 21 44 4f 43 54 59 50 45 20 64 6f 63 20    <!DOCTYPE doc 
f020: 5b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  [.              
f030: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f040: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f050: 3c 21 45 4e 54 49 54 59 20 61 20 50 55 42 4c 49  <!ENTITY a PUBLI
f060: 43 20 22 61 22 20 22 61 2e 78 6d 6c 22 3e 0a 20  C "a" "a.xml">. 
f070: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f080: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f090: 20 20 20 20 20 20 20 20 20 20 20 20 20 3c 21 45               <!E
f0a0: 4e 54 49 54 59 20 62 20 50 55 42 4c 49 43 20 22  NTITY b PUBLIC "
f0b0: 62 22 20 22 62 2e 78 6d 6c 22 3e 0a 20 20 20 20  b" "b.xml">.    
f0c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f0d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f0e0: 20 20 20 20 20 20 20 20 20 5d 3e 0a 20 20 20 20           ]>.    
f0f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f100: 20 20 20 20 20 20 20 20 20 20 20 3c 64 6f 63 3e             <doc>
f110: 26 61 3b 26 62 3b 3c 2f 64 6f 63 3e 7d 7d 20 6d  &a;&b;</doc>}} m
f120: 73 67 5d 0a 20 20 20 20 6c 69 73 74 20 24 72 65  sg].    list $re
f130: 73 75 6c 74 20 24 6d 73 67 0a 7d 20 2d 72 65 73  sult $msg.} -res
f140: 75 6c 74 20 5b 6c 69 73 74 20 31 20 22 45 72 72  ult [list 1 "Err
f150: 6f 72 20 69 6e 20 66 65 65 64 62 61 63 6b 20 63  or in feedback c
f160: 6d 64 2e 22 5d 0a 70 72 6f 63 20 66 65 65 64 62  md."].proc feedb
f170: 61 63 6b 63 6d 64 2d 31 32 2e 31 36 20 7b 7d 20  ackcmd-12.16 {} 
f180: 7b 0a 20 20 20 20 69 6e 63 72 20 3a 3a 66 65 65  {.    incr ::fee
f190: 64 62 61 63 6b 63 6d 64 2d 31 32 2e 31 36 0a 7d  dbackcmd-12.16.}
f1a0: 0a 74 65 73 74 20 64 6f 6d 2d 31 32 2e 31 36 20  .test dom-12.16 
f1b0: 7b 2d 66 65 65 64 62 61 63 6b 63 6d 64 20 73 65  {-feedbackcmd se
f1c0: 74 74 69 6e 67 20 69 6e 74 65 72 70 20 72 65 73  tting interp res
f1d0: 75 6c 74 20 77 2f 20 69 6e 76 61 6c 69 64 20 58  ult w/ invalid X
f1e0: 4d 4c 7d 20 2d 62 6f 64 79 20 7b 0a 20 20 20 20  ML} -body {.    
f1f0: 73 65 74 20 3a 3a 66 65 65 64 62 61 63 6b 63 6d  set ::feedbackcm
f200: 64 2d 31 32 2e 31 36 20 30 0a 20 20 20 20 73 65  d-12.16 0.    se
f210: 74 20 72 65 73 75 6c 74 20 5b 63 61 74 63 68 20  t result [catch 
f220: 7b 64 6f 6d 20 70 61 72 73 65 20 2d 66 65 65 64  {dom parse -feed
f230: 62 61 63 6b 63 6d 64 20 66 65 65 64 62 61 63 6b  backcmd feedback
f240: 63 6d 64 2d 31 32 2e 31 36 20 5c 0a 20 20 20 20  cmd-12.16 \.    
f250: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f260: 20 20 20 20 20 20 20 2d 66 65 65 64 62 61 63 6b         -feedback
f270: 41 66 74 65 72 20 31 20 7b 3c 64 6f 63 3e 3c 65  After 1 {<doc><e
f280: 31 2f 3e 3c 65 31 2f 3e 3c 65 31 3e 3c 2f 64 6f  1/><e1/><e1></do
f290: 63 7d 7d 20 6d 73 67 5d 0a 20 20 20 20 6c 69 73  c}} msg].    lis
f2a0: 74 20 24 72 65 73 75 6c 74 20 24 6d 73 67 0a 7d  t $result $msg.}
f2b0: 20 2d 72 65 73 75 6c 74 20 5b 6c 69 73 74 20 31   -result [list 1
f2c0: 20 7b 65 72 72 6f 72 20 22 75 6e 63 6c 6f 73 65   {error "unclose
f2d0: 64 20 74 6f 6b 65 6e 22 20 61 74 20 6c 69 6e 65  d token" at line
f2e0: 20 31 20 63 68 61 72 61 63 74 65 72 20 31 39 0a   1 character 19.
f2f0: 22 3c 64 6f 63 3e 3c 65 31 2f 3e 3c 65 31 2f 3e  "<doc><e1/><e1/>
f300: 3c 65 31 3e 3c 20 3c 2d 2d 45 72 72 6f 72 2d 2d  <e1>< <--Error--
f310: 20 2f 64 6f 63 22 7d 5d 0a 0a 23 20 63 6c 65 61   /doc"}]..# clea
f320: 6e 75 70 0a 3a 3a 74 63 6c 74 65 73 74 3a 3a 63  nup.::tcltest::c
f330: 6c 65 61 6e 75 70 54 65 73 74 73 0a 72 65 74 75  leanupTests.retu
f340: 72 6e 0a                                         rn.