# ==================================================================== #
# extract --
# Description
# Extract array variable into current scope
# Arguments
# array : name of array variable
# -prefix <string> : prefix variable names
# -postfix <string> : append variable names
# -overwrite <boolean> : overwrite existing variables
# args : wildcard pattern for array names
# Return
# on error, error messages
# otherwise, number of extracted variables
proc extract {array args} {
upvar $array _
set prefix ""
set postfix ""
set overwrite 0
if { ![array exists _] } {
return -code error "can't extract \"$array\": no such array"
}
set argv [list] ; # list of array names to extract
set n 0 ; # number of variables extracted
set error 0 ; # number of errors
set errors [list] ; # list of error messages
set argc [llength $args]
for {set i 0} {$i < $argc} {incr i} {
set arg [lindex $args $i]
# puts "parse arg\[$i\] \[$arg\]"
switch -- $arg {
-overwrite {
set overwrite [lindex $args [incr i]]
}
-postfix {
set postfix [lindex $args [incr i]]
}
-prefix {
set prefix [lindex $args [incr i]]
}
-- {
set argv [concat $argv [lrange $args [incr i] end]]
}
default {
lappend argv $arg
}
}
}
# puts "argv = \[$argv\]"
if { ![llength $argv] } { set argv [list *] }
foreach arg $argv {
foreach name [array names _ $arg] {
set name2 ${prefix}${name}${postfix}
upvar $name2 var
if { [array exists var] } {
incr error
lappend errors "extract: can't set \"$name2\": variable is array"
} elseif { ![info exists var] || $overwrite } {
set var $_($name)
incr n
} else {
incr error
lappend errors "extract: not overwriting var \"$name2\""
}
}
}
if { $error > 0 } {
set code error
set return [join $errors \n]
} else {
set code ok
set return $n
}
return -code $code $return
}
# ==================================================================== #
proc test {} {
global env
# array set env_HOME [list home /home]
# set env_HOME /home
if { [catch {extract env -prefix env_ -overwrite 1 H*} extract] } {
puts stderr "$extract"
} else {
puts "extracted \[$extract\] variables"
}
puts "found \[[llength [info vars env_*]]\] vars"
foreach var [info vars env_*] {
if { [array exists $var] } {
puts "\[$var\] is an array"
} else {
puts "\[$var\] = \[[set $var]\]"
}
}
}
test
# ==================================================================== #See also:

