*** tree.tcl	Wed Sep  5 17:36:15 2001
--- tree-modified.tcl	Wed Jan 16 14:23:28 2002
***************
*** 34,39 ****
--- 34,40 ----
  
      # commands is the list of subcommands recognized by the tree
      variable commands [list \
+ 	    "append"		\
  	    "children"		\
  	    "cut"		\
  	    "destroy"		\
***************
*** 41,49 ****
--- 42,54 ----
  	    "depth"		\
  	    "exists"		\
  	    "get"		\
+ 	    "getall"		\
  	    "index"		\
  	    "insert"		\
  	    "isleaf"		\
+ 	    "keys"		\
+ 	    "keyexists"		\
+ 	    "lappend"		\
  	    "move"		\
  	    "next"		\
  	    "numchildren"	\
***************
*** 367,372 ****
--- 372,451 ----
      return $data($key)
  }
  
+ # ::struct::tree::_getall --
+ #
+ #	Get a serialized list of key/value pairs from a node in a tree.
+ #
+ # Arguments:
+ #	name	Name of the tree.
+ #	node	Node to query.
+ #
+ # Results:
+ #	value	A serialized list of key/value pairs.
+ 
+ proc ::struct::tree::_getall {name node args} { 
+     if { ![_exists $name $node] } {
+ 	error "node \"$node\" does not exist in tree \"$name\""
+     }
+ 
+     if { [llength $args] } {
+ 	error "Wrong # args: should be \"$name getall $node\""
+     }
+     
+     upvar ::struct::tree::tree${name}::node${node} data
+     return [array get data]
+ }
+ 
+ # ::struct::tree::_keys --
+ #
+ #	Get a list of keys from a node in a tree.
+ #
+ # Arguments:
+ #	name	Name of the tree.
+ #	node	Node to query.
+ #
+ # Results:
+ #	value	A serialized list of key/value pairs.
+ 
+ proc ::struct::tree::_keys {name node args} { 
+     if { ![_exists $name $node] } {
+ 	error "node \"$node\" does not exist in tree \"$name\""
+     }
+ 
+     if { [llength $args] } {
+ 	error "Wrong # args: should be \"$name keys $node\""
+     }
+ 
+     upvar ::struct::tree::tree${name}::node${node} data
+     return [array names data]
+ }
+ 
+ # ::struct::tree::_keyexists --
+ #
+ #	Test for existance of a given key for a node in a tree.
+ #
+ # Arguments:
+ #	name	Name of the tree.
+ #	node	Node to query.
+ #	flag	Optional flag specifier; if present, must be "-key".
+ #	key	Optional key to lookup; defaults to data.
+ #
+ # Results:
+ #	1 if the key exists, 0 else.
+ 
+ proc ::struct::tree::_keyexists {name node {flag -key} {key data}} {
+     if { ![_exists $name $node] } {
+ 	error "node \"$node\" does not exist in tree \"$name\""
+     }
+ 
+     if { ![string equal $flag "-key"] } {
+ 	error "invalid option \"$flag\": should be -key"
+     }
+     
+     upvar ::struct::tree::tree${name}::node${node} data
+     return [info exists data($key)]
+ }
+ 
  # ::struct::tree::_index --
  #
  #	Determine the index of node with in its parent's list of children.
***************
*** 740,745 ****
--- 819,902 ----
  	}
  	return $data($key)
      }
+ }
+ 
+ # ::struct::tree::_append --
+ #
+ #	Append a value for a node in a tree.
+ #
+ # Arguments:
+ #	name	Name of the tree.
+ #	node	Node to modify or query.
+ #	args	Optional arguments specifying a key and a value.  Format is
+ #			?-key key? ?value?
+ #		If no key is specified, the key "data" is used.
+ #
+ # Results:
+ #	val	Value associated with the given key of the given node
+ 
+ proc ::struct::tree::_append {name node args} {
+     if { ![_exists $name $node] } {
+ 	error "node \"$node\" does not exist in tree \"$name\""
+     }
+     upvar ::struct::tree::tree${name}::node$node data
+ 
+     if { [llength $args] != 1 && [llength $args] != 3 } {
+ 	error "wrong # args: should be \"$name set $node ?-key key?\
+ 		value\""
+     }
+     
+     if { [llength $args] == 3 } {
+ 	foreach {flag key} $args break
+ 	if { ![string equal $flag "-key"] } {
+ 	    error "invalid option \"$flag\": should be -key"
+ 	}
+     } else {
+ 	set key "data"
+     }
+ 
+     set value [lindex $args end]
+ 
+     return [append data($key) $value]
+ }
+ 
+ # ::struct::tree::_lappend --
+ #
+ #	lappend a value for a node in a tree.
+ #
+ # Arguments:
+ #	name	Name of the tree.
+ #	node	Node to modify or query.
+ #	args	Optional arguments specifying a key and a value.  Format is
+ #			?-key key? ?value?
+ #		If no key is specified, the key "data" is used.
+ #
+ # Results:
+ #	val	Value associated with the given key of the given node
+ 
+ proc ::struct::tree::_lappend {name node args} {
+     if { ![_exists $name $node] } {
+ 	error "node \"$node\" does not exist in tree \"$name\""
+     }
+     upvar ::struct::tree::tree${name}::node$node data
+ 
+     if { [llength $args] != 1 && [llength $args] != 3 } {
+ 	error "wrong # args: should be \"$name set $node ?-key key?\
+ 		value\""
+     }
+     
+     if { [llength $args] == 3 } {
+ 	foreach {flag key} $args break
+ 	if { ![string equal $flag "-key"] } {
+ 	    error "invalid option \"$flag\": should be -key"
+ 	}
+     } else {
+ 	set key "data"
+     }
+ 
+     set value [lindex $args end]
+ 
+     return [lappend data($key) $value]
  }
  
  # ::struct::tree::_size --
