I'm pretty well satisfied that this module is in a usable form. This morning I put together some Tcl proc to manage the creation of application config files. This is what I came up with;
#---------------
# test-keyfile.tcl
#---------------
# William J Giddings
# 21/12/2010
#---------------
#!/bin/sh
#\
exec tclsh "$0" "$@"
package require Gnocl
#---------------
# read named ini file and create global config array
#---------------
# args:
# fname name of file to load
# notes:
# resets any existing config array
# returns:
# id of the created keyframe object
#---------------
proc config:read { {fname app.ini} } {
global config
array unset config
set i 0
set kf [gnocl::keyFile load $fname]
foreach group [$kf get groups] {
foreach key [$kf get keys -group $group ] {
set config($key) [$kf get value -group $group -key $key]
incr i
}
}
return $kf
}
#---------------
# Write current configuration setting to .ini file
#---------------
# args:
# kf keyfile object id
# fname name of the ini file to create
# notes:
# key group memberships checked internally
# returns:
# number of items written to keyfile
#---------------
proc config:write {kf {fname app.ini} } {
global config
set i 0
foreach key [array names config] {
foreach group [$kf get groups] {
if { [$kf has -group $group -key $key ] } {
$kf set value -group $group -key $key -value $config($key)
incr i
}
}
}
$kf write $fname
return i
}
#---------------
# Sets default configuration settings.
#---------------
# args:
# fname name of the ini file to create
# defaults list of entries in the form <group:key value>
# notes:
# if no values set, then an empty ini file will be created
# returns:
# id of newly created keyfile object
#---------------
proc config:new { {fname app.ini} {defaults {} } } {
global config
array unset config
set kf [gnocl::keyFile new $fname]
if {$defaults == {}} {return $kf}
foreach {a b} $defaults {
foreach {group key} [split $a :] {}
$kf set value -group $group -key $key -value $b
set config($key) $b
}
return $kf
}
#----------
# test code
#----------
set defaults {
group_1:key_a 1
group_1:key_b 2
group_2:key_c 3
group_2:key_d 4
group_3:key_e 5
group_3:key_f 6
group_3:key_g 7
}
set kf [config:new test.ini $defaults ]
config:write $kf test.ini
# test-keyfile.tcl
#---------------
# William J Giddings
# 21/12/2010
#---------------
#!/bin/sh
#\
exec tclsh "$0" "$@"
package require Gnocl
#---------------
# read named ini file and create global config array
#---------------
# args:
# fname name of file to load
# notes:
# resets any existing config array
# returns:
# id of the created keyframe object
#---------------
proc config:read { {fname app.ini} } {
global config
array unset config
set i 0
set kf [gnocl::keyFile load $fname]
foreach group [$kf get groups] {
foreach key [$kf get keys -group $group ] {
set config($key) [$kf get value -group $group -key $key]
incr i
}
}
return $kf
}
#---------------
# Write current configuration setting to .ini file
#---------------
# args:
# kf keyfile object id
# fname name of the ini file to create
# notes:
# key group memberships checked internally
# returns:
# number of items written to keyfile
#---------------
proc config:write {kf {fname app.ini} } {
global config
set i 0
foreach key [array names config] {
foreach group [$kf get groups] {
if { [$kf has -group $group -key $key ] } {
$kf set value -group $group -key $key -value $config($key)
incr i
}
}
}
$kf write $fname
return i
}
#---------------
# Sets default configuration settings.
#---------------
# args:
# fname name of the ini file to create
# defaults list of entries in the form <group:key value>
# notes:
# if no values set, then an empty ini file will be created
# returns:
# id of newly created keyfile object
#---------------
proc config:new { {fname app.ini} {defaults {} } } {
global config
array unset config
set kf [gnocl::keyFile new $fname]
if {$defaults == {}} {return $kf}
foreach {a b} $defaults {
foreach {group key} [split $a :] {}
$kf set value -group $group -key $key -value $b
set config($key) $b
}
return $kf
}
#----------
# test code
#----------
set defaults {
group_1:key_a 1
group_1:key_b 2
group_2:key_c 3
group_2:key_d 4
group_3:key_e 5
group_3:key_f 6
group_3:key_g 7
}
set kf [config:new test.ini $defaults ]
config:write $kf test.ini
Comments