*** graph.tcl	Fri Jun 22 09:29:18 2001
--- graph-modified.tcl	Wed Jan 16 15:18:11 2002
***************
*** 45,54 ****
--- 45,59 ----
  	    ]
  
      variable arcCommands [list	\
+ 	    "append"	\
  	    "delete"	\
  	    "exists"	\
  	    "get"	\
+ 	    "getall"	\
  	    "insert"	\
+ 	    "keys"	\
+ 	    "keyexists"	\
+ 	    "lappend"	\
  	    "set"	\
  	    "source"	\
  	    "target"	\
***************
*** 56,66 ****
--- 61,76 ----
  	    ]
  
      variable nodeCommands [list	\
+ 	    "append"	\
  	    "degree"	\
  	    "delete"	\
  	    "exists"	\
  	    "get"	\
+ 	    "getall"	\
  	    "insert"	\
+ 	    "keys"	\
+ 	    "keyexists"	\
+ 	    "lappend"	\
  	    "opposite"	\
  	    "set"	\
  	    "unset"	\
***************
*** 263,268 ****
--- 273,355 ----
      return $data($key)
  }
  
+ # ::struct::graph::__arc_getall --
+ #
+ #	Get a serialized array of key/value pairs from an arc in a graph.
+ #
+ # Arguments:
+ #	name	name of the graph.
+ #	arc	arc to query.
+ #
+ # Results:
+ #	value	serialized array of key/value pairs.
+ 
+ proc ::struct::graph::__arc_getall {name arc args} {
+     if { ![__arc_exists $name $arc] } {
+ 	error "arc \"$arc\" does not exist in graph \"$name\""
+     }
+ 
+     if { [llength $args] } {
+ 	error "Wrong # arguments given to 'getall'"
+     }
+     
+     upvar ::struct::graph::graph${name}::arc${arc} data
+ 
+     return [array get data]
+ }
+ 
+ # ::struct::graph::__arc_keys --
+ #
+ #	Get a list of keys for an arc in a graph.
+ #
+ # Arguments:
+ #	name	name of the graph.
+ #	arc	arc to query.
+ #
+ # Results:
+ #	value	value associated with the key given.
+ 
+ proc ::struct::graph::__arc_keys {name arc args} {
+     if { ![__arc_exists $name $arc] } {
+ 	error "arc \"$arc\" does not exist in graph \"$name\""
+     }
+ 
+     if { [llength $args] } {
+ 	error "Wrong # arguments given to 'keys'"
+     }    
+ 
+     upvar ::struct::graph::graph${name}::arc${arc} data
+ 
+     return [array names data]
+ }
+ 
+ # ::struct::graph::__arc_keyexists --
+ #
+ #	Test for existance of a given key for a given arc in a graph.
+ #
+ # Arguments:
+ #	name	name of the graph.
+ #	arc	arc to query.
+ #	flag	-key; anything else is an error
+ #	key	key to lookup; defaults to data
+ #
+ # Results:
+ #	1 if the key exists, 0 else.
+ 
+ proc ::struct::graph::__arc_keyexists {name arc {flag -key} {key data}} {
+     if { ![__arc_exists $name $arc] } {
+ 	error "arc \"$arc\" does not exist in graph \"$name\""
+     }
+ 
+     if { ![string equal $flag "-key"] } {
+ 	error "invalid option \"$flag\": should be -key"
+     }
+     
+     upvar ::struct::graph::graph${name}::arc${arc} data
+ 
+     return [info exists data($key)]
+ }
+ 
  # ::struct::graph::__arc_insert --
  #
  #	Add an arc to a graph.
***************
*** 366,371 ****
--- 453,534 ----
      }
  }
  
+ # ::struct::graph::__arc_append --
+ #
+ #	Append a value for an arc in a graph.
+ #
+ # Arguments:
+ #	name	name of the graph.
+ #	arc	arc to modify or query.
+ #	args	?-key key? value
+ #
+ # Results:
+ #	val	value associated with the given key of the given arc
+ 
+ proc ::struct::graph::__arc_append {name arc args} {
+     if { ![__arc_exists $name $arc] } {
+ 	error "arc \"$arc\" does not exist in graph \"$name\""
+     }
+ 
+     upvar ::struct::graph::graph${name}::arc$arc data
+ 
+     if { [llength $args] != 1 && [llength $args] != 3 } {
+ 	error "wrong # args: should be \"$name arc append $arc ?-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::graph::__arc_lappend --
+ #
+ #	lappend a value for an arc in a graph.
+ #
+ # Arguments:
+ #	name	name of the graph.
+ #	arc	arc to modify or query.
+ #	args	?-key key? value
+ #
+ # Results:
+ #	val	value associated with the given key of the given arc
+ 
+ proc ::struct::graph::__arc_lappend {name arc args} {
+     if { ![__arc_exists $name $arc] } {
+ 	error "arc \"$arc\" does not exist in graph \"$name\""
+     }
+ 
+     upvar ::struct::graph::graph${name}::arc$arc data
+ 
+     if { [llength $args] != 1 && [llength $args] != 3 } {
+ 	error "wrong # args: should be \"$name arc lappend $arc ?-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::graph::__arc_source --
  #
  #	Return the node at the beginning of the specified arc.
***************
*** 855,860 ****
--- 1018,1100 ----
      return $data($key)
  }
  
+ # ::struct::graph::__node_getall --
+ #
+ #	Get a serialized list of key/value pairs from a node in a graph.
+ #
+ # Arguments:
+ #	name	name of the graph.
+ #	node	node to query.
+ #
+ # Results:
+ #	value	value associated with the key given.
+ 
+ proc ::struct::graph::__node_getall {name node args} { 
+     if { ![__node_exists $name $node] } {
+ 	error "node \"$node\" does not exist in graph \"$name\""
+     }
+ 
+     if { [llength $args] } {
+ 	error "Wrong # arguments given to 'getall'"
+     }
+     
+     upvar ::struct::graph::graph${name}::node${node} data
+ 
+     return [array get data]
+ }
+ 
+ # ::struct::graph::__node_keys --
+ #
+ #	Get a of keys from a node in a graph.
+ #
+ # Arguments:
+ #	name	name of the graph.
+ #	node	node to query.
+ #
+ # Results:
+ #	value	value associated with the key given.
+ 
+ proc ::struct::graph::__node_keys {name node args} { 
+     if { ![__node_exists $name $node] } {
+ 	error "node \"$node\" does not exist in graph \"$name\""
+     }
+     
+     if { [llength $args] } {
+ 	error "Wrong # arguments given to 'keys'"
+     }
+ 
+     upvar ::struct::graph::graph${name}::node${node} data
+ 
+     return [array names data]
+ }
+ 
+ # ::struct::graph::__node_keyexists --
+ #
+ #	Test for existance of a given key for a node in a graph.
+ #
+ # Arguments:
+ #	name	name of the graph.
+ #	node	node to query.
+ #	flag	-key; anything else is an error
+ #	key	key to lookup; defaults to data
+ #
+ # Results:
+ #	1 if the key exists, 0 else.
+ 
+ proc ::struct::graph::__node_keyexists {name node {flag -key} {key data}} {
+     if { ![__node_exists $name $node] } {
+ 	error "node \"$node\" does not exist in graph \"$name\""
+     }
+     
+     if { ![string equal $flag "-key"] } {
+ 	error "invalid option \"$flag\": should be -key"
+     }
+     
+     upvar ::struct::graph::graph${name}::node${node} data
+ 
+     return [info exists data($key)]
+ }
+ 
  # ::struct::graph::__node_insert --
  #
  #	Add a node to a graph.
***************
*** 978,983 ****
--- 1218,1297 ----
  	}
  	return $data($key)
      }
+ }
+ 
+ # ::struct::graph::__node_append --
+ #
+ #	Append a value for a node in a graph.
+ #
+ # Arguments:
+ #	name	name of the graph.
+ #	node	node to modify or query.
+ #	args	?-key key? value
+ #
+ # Results:
+ #	val	value associated with the given key of the given node
+ 
+ proc ::struct::graph::__node_append {name node args} {
+     if { ![__node_exists $name $node] } {
+ 	error "node \"$node\" does not exist in graph \"$name\""
+     }
+     upvar ::struct::graph::graph${name}::node$node data
+ 
+     if { [llength $args] != 1 && [llength $args] != 3 } {
+ 	error "wrong # args: should be \"$name node append $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::graph::__node_lappend --
+ #
+ #	lappend a value for a node in a graph.
+ #
+ # Arguments:
+ #	name	name of the graph.
+ #	node	node to modify or query.
+ #	args	?-key key? value
+ #
+ # Results:
+ #	val	value associated with the given key of the given node
+ 
+ proc ::struct::graph::__node_lappend {name node args} {
+     if { ![__node_exists $name $node] } {
+ 	error "node \"$node\" does not exist in graph \"$name\""
+     }
+     upvar ::struct::graph::graph${name}::node$node data
+ 
+     if { [llength $args] != 1 && [llength $args] != 3 } {
+ 	error "wrong # args: should be \"$name node lappend $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::graph::__node_unset --
