+++ /dev/null
-# this line is needed for our install script, to keep up with different versions\r
-# ini_version=1.4\r
-#\r
-##########\r
-#\r
-# INIParse v1.4 (C)2000\r
-#\r
-# see AUTHORS\r
-#\r
-##########\r
-#\r
-# Usage:\r
-# iniparse:openfile <filename> ?RDONLY?\r
-# \r
-# Reads an ini file into memory, for later access (such as read or write),\r
-# and return an id which can be later used for writing/reading data, and\r
-# flushing/closing file.\r
-#\r
-# Notes:\r
-# - It doesn't leave the file open, just reads into memory, and returns an id.\r
-# - If RDONLY is specified (case-sensetive), then calls to writeini will work\r
-# only in memory, and changes won't be saved with iniparse:flush, nor\r
-# iniparse:closefile.\r
-#\r
-####\r
-#\r
-# Usage:\r
-# iniparse:flushfile <fileId>\r
-# \r
-# Writes an ini file in memory into its file, without removing data from\r
-# memory.\r
-#\r
-####\r
-#\r
-# Usage:\r
-# iniparse:closefile <fileId>\r
-# \r
-# Flushes an ini file in memory into its file, and then removes data from\r
-# memory.\r
-#\r
-####\r
-#\r
-# Usage:\r
-# readini <fileId> [ [<keyname>] [<itemname>] ]\r
-# Reads <itemname> under <keyname> from <fileId>. If it cannot find\r
-# file, <itemname>, or <keyname>, returns an empty string.\r
-# If itemname is absent, returns list of all items under keyname.\r
-#\r
-# Notes:\r
-# - This procedure doesn't read directly from the file, but from the\r
-# memory-version of the file. If directly the file (not memory version) is\r
-# modified after the call to iniparse:openfile, this procedure will not\r
-# see the changes in the file, but only changes in memory-version.\r
-#\r
-# See: writeini iniparse:openfile\r
-#\r
-####\r
-#\r
-# Usage:\r
-# writeini <fileId> <keyname> <itemname> <itemvalue>\r
-# Writes/modifies <itemname> under <keyname> in <fileId>. If cannot\r
-# find <itemname>, or <keyname>, creates a new one.\r
-#\r
-# Notes:\r
-# - This procedure doesn't write directly to the file, but to the\r
-# memory-version of the file. If directly the file (not memory version) is\r
-# modified after the call to iniparse:openfile, this procedure will not\r
-# see the changes in the file, but only changes in memory-version.\r
-#\r
-# See: readini iniparse:openfile\r
-#\r
-####\r
-#\r
-# Usage:\r
-# iniparse:removeitem <fileId> <keyname> <itemname>\r
-# Removes <itemname> under <keyname> in <fileId>.\r
-#\r
-# Notes:\r
-# - This procedure doesn't write directly to the file, but to the\r
-# memory-version of the file. If directly the file (not memory version) is\r
-# modified after the call to iniparse:openfile, this procedure will not\r
-# see the changes in the file, but only changes in memory-version.\r
-#\r
-# See: readini iniparse:openfile\r
-#\r
-####\r
-#\r
-# Usage:\r
-# iniparse:removekey <fileId> <keyname>\r
-# Removes <keyname> in <fileId>.\r
-#\r
-# Notes:\r
-# - This procedure doesn't write directly to the file, but to the\r
-# memory-version of the file. If directly the file (not memory version) is\r
-# modified after the call to iniparse:openfile, this procedure will not\r
-# see the changes in the file, but only changes in memory-version.\r
-#\r
-# See: readini iniparse:openfile\r
-#\r
-####\r
-#\r
-# Usage:\r
-# iniparse:renameitem <fileId> <keyname> <itemName> <newItemName>\r
-# Renames <itemName> under <keyname> in <fileId> to <newItemName>.\r
-#\r
-# Notes:\r
-# - This procedure doesn't write directly to the file, but to the\r
-# memory-version of the file. If directly the file (not memory version) is\r
-# modified after the call to iniparse:openfile, this procedure will not\r
-# see the changes in the file, but only changes in memory-version.\r
-#\r
-# See: readini iniparse:openfile\r
-#\r
-####\r
-#\r
-# Usage:\r
-# iniparse:renamekey <fileId> <keyname> <newKeyName>\r
-# Renames <keyname> in <fileId> to <newKeyName>.\r
-#\r
-# Notes:\r
-# - This procedure doesn't write directly to the file, but to the\r
-# memory-version of the file. If directly the file (not memory version) is\r
-# modified after the call to iniparse:openfile, this procedure will not\r
-# see the changes in the file, but only changes in memory-version.\r
-#\r
-# See: readini iniparse:openfile\r
-#\r
-#############################################################################\r
-\r
-package provide iniparse 1.4\r
-\r
-set iniparse(freeid) 0\r
-set iniparse(idlist) {}\r
-#$iniparse($id,fname) - filename\r
-#$iniparse($id,data) - each line in file are read into an item in this list\r
-#$iniparse($id,flags) - this is a list containing these flags:\r
-# RDONLY : If this flag is set, iniparse:flush will\r
-# not write anything over file, but still\r
-# writeini will work (only in memory)\r
-#\r
-\r
-proc rtrimleft {bigstr srcstr} {\r
- set istring1 [string length $srcstr]\r
- if {$srcstr == [string range $bigstr 0 [expr $istring1-1]]} {\r
- return [string range $bigstr $istring1 end]\r
- }\r
-}\r
-\r
-proc chrchk {arg} {\r
- if {[string index $arg 0] == "\[" && [string index $arg end] == "\]"} {\r
- return 1\r
- } else {return 0}\r
- return 0\r
-}\r
-\r
-#\r
-# Usage:\r
-# iniparse:openfile <filename> ?RDONLY?\r
-# \r
-# Reads an ini file into memory, for later access (such as read or write),\r
-# and return an id which can be later used for writing/reading data, and\r
-# flushing/closing file.\r
-#\r
-# Notes:\r
-# - It doesn't leave the file open, just reads into memory, and returns an id.\r
-# - If RDONLY is specified (case-sensetive), then calls to writeini will work\r
-# only in memory, and changes won't be saved with iniparse:flush, nor\r
-# iniparse:closefile.\r
-#\r
-proc iniparse:openfile {file args} {\r
-global iniparse\r
-\r
- set fileId [open $file {RDONLY CREAT}]\r
- set filedata {}\r
-\r
- while {![eof $fileId]} {\r
- set input [gets $fileId]\r
- if {[string match {\[*\]} $input]} {lappend filedata "" $input} \\r
- elseif {[string match {*=*} $input] || \\r
- [string match {#*} $input]} {lappend filedata $input}\r
- }\r
-\r
- close $fileId\r
-\r
- set id $iniparse(freeid)\r
- incr iniparse(freeid)\r
-\r
- set iniparse($id,fname) $file\r
- set iniparse($id,data) $filedata\r
- set iniparse($id,flags) $args\r
- lappend iniparse(idlist) $id\r
-\r
- return $id\r
-}\r
-\r
-#\r
-# Usage:\r
-# iniparse:flushfile <fileId>\r
-# \r
-# Writes an ini file in memory into its file, without removing data from\r
-# memory.\r
-#\r
-proc iniparse:flushfile {id} {\r
-global iniparse\r
-\r
- if {[lsearch $iniparse(idlist) $id] == -1} return ;# No such Id\r
-\r
- if {[lsearch $iniparse($id,flags) RDONLY] != -1} return ;# ReadOnly-Flag\r
-\r
- set fileId [open $iniparse($id,fname) {WRONLY CREAT TRUNC}]\r
-\r
- foreach line $iniparse($id,data) {\r
- if {[string match {\[*\]} $line]} {puts $fileId "\n$line"} \\r
- elseif {[string match {*=*} $line] || \\r
- [string match {#*} $line]} {puts $fileId $line}\r
- }\r
- close $fileId\r
-\r
- set iniparse($id,flags) [lreplace $iniparse($id,flags) [set idx [lsearch $iniparse($id,flags) CHANGED]] $idx]\r
-}\r
-\r
-#\r
-# Usage:\r
-# iniparse:closefile <fileId>\r
-# \r
-# Flushes an ini file in memory into its file, and then removes data from\r
-# memory.\r
-#\r
-proc iniparse:closefile {id} {\r
-global iniparse\r
-\r
- if {[lsearch $iniparse(idlist) $id] == -1} return ;# No such Id\r
-\r
- iniparse:flushfile $id\r
- unset iniparse($id,fname)\r
- unset iniparse($id,data)\r
- unset iniparse($id,flags)\r
- set iniparse(idlist) [lreplace $iniparse(idlist) [set idx [lsearch $iniparse(idlist) $id]] $idx]\r
-}\r
-\r
-#\r
-# Usage:\r
-# readini <fileId> [ [<keyname>] [<itemname>] ]\r
-# Reads <itemname> under <keyname> from <fileId>. If it cannot find\r
-# file, <itemname>, or <keyname>, returns an empty string.\r
-# If itemname is absent, returns list of all items under keyname.\r
-#\r
-# Notes:\r
-# - This procedure doesn't read directly from the file, but from the\r
-# memory-version of the file. If directly the file (not memory version) is\r
-# modified after the call to iniparse:openfile, this procedure will not\r
-# see the changes in the file, but only changes in memory-version.\r
-#\r
-# See: writeini iniparse:openfile\r
-#\r
-proc readini {id args} {\r
-global iniparse\r
- set keyfound 0 ; set itemfound 0\r
- set key [lindex $args 0]\r
- set item [lindex $args 1]\r
- set itemlength [string length $item]\r
- set item "$item="\r
- set kaccum [list]\r
- set iaccum [list]\r
-\r
- if {[lsearch $iniparse(idlist) $id] == -1} {return ""} ;# No such Id\r
-\r
- set input ""\r
- set lidx 0 ;# line index\r
- set llen [llength $iniparse($id,data)]\r
- set data $iniparse($id,data) ;# for fast access\r
-\r
- while {$lidx < $llen} {\r
- set input [lindex $data $lidx]\r
- if {[chrchk $input]} {\r
- if {$input == "\[$key\]"} {\r
- # looks like we found our key..\r
- set keyfound 1 ; break\r
- } else {\r
- set keyfound 0\r
- regsub -all {\[|\]} $input {} baccum\r
- lappend kaccum $baccum\r
- }\r
- }\r
- incr lidx\r
- }\r
- incr lidx\r
-\r
- if {$keyfound == 1} {\r
- while {$lidx < $llen} {\r
- set input [lindex $data $lidx]\r
- if {![chrchk $input]} {\r
- if {[string range $input 0 $itemlength]==$item} {\r
- set fValue [rtrimleft $input $item]\r
- set itemfound 1\r
- break\r
- } else {\r
- set itemNdx [string first "=" $input]\r
- if {$itemNdx != -1} {\r
- lappend iaccum [string range $input 0 [expr $itemNdx - 1]]\r
- }\r
- }\r
- } elseif {[chrchk $input]} {\r
- # oops, we hit the next key.. looks like that item isnt here.\r
- break\r
- }\r
- incr lidx\r
- }\r
- } elseif {$keyfound == 0} {\r
- if {[llength $args] == 0} {\r
- return $kaccum\r
- } else {\r
- return "" ;# no key exists called $key\r
- }\r
- }\r
- if {$itemfound == 1} {\r
- return $fValue\r
- } elseif {[llength $args] != 2} {\r
- return $iaccum\r
- } else {\r
- return "" ;# no item exists called "[string range $item 0 [expr [string length $item] - 2]]"\r
- }\r
-}\r
-\r
-#\r
-# Usage:\r
-# writeini <fileId> <keyname> <itemname> <itemvalue>\r
-# Writes/modifies <itemname> under <keyname> in <fileId>. If cannot\r
-# find <itemname>, or <keyname>, creates a new one.\r
-#\r
-# Notes:\r
-# - This procedure doesn't write directly to the file, but to the\r
-# memory-version of the file. If directly the file (not memory version) is\r
-# modified after the call to iniparse:openfile, this procedure will not\r
-# see the changes in the file, but only changes in memory-version.\r
-#\r
-# See: readini iniparse:openfile\r
-#\r
-proc writeini {id key item value} {\r
-global iniparse\r
- set fileline ""\r
- set keyfound 0\r
- set itemfound 0\r
- set itemlength [string length $item]\r
- set item "$item="\r
-\r
- if {[lsearch $iniparse(idlist) $id] == -1} return ;# No such Id\r
-\r
- set input ""\r
- set lidx 0 ;# line index\r
- set llen [llength $iniparse($id,data)]\r
- set fileline $iniparse($id,data)\r
- set data ""\r
-\r
- foreach line $fileline {\r
- if {(!$keyfound)} { ;# We will search for the key.\r
- if {$line=="\[$key\]"} {\r
- lappend data "" $line\r
- set keyfound 1\r
- continue\r
- }\r
- }\r
- if {($keyfound) && (!$itemfound) && [chrchk $line]} { ;# We hit the next key!\r
- lappend data "$item$value"\r
- lappend data "" $line\r
- set itemfound 1\r
- continue\r
- }\r
- if {($keyfound) && (!$itemfound)} { ;# We will search for the item\r
- if {[string range $line 0 $itemlength]==$item} {\r
- lappend data "$item$value"\r
- set itemfound 1\r
- continue\r
- }\r
- }\r
- # Because it doesn't match anything above, we print the line to file\r
- if {[chrchk $line]} {lappend data "" $line} \\r
- else {lappend data $line}\r
- }\r
-\r
- if {(!$keyfound) && (!$itemfound)} {\r
- lappend data "" "\[$key\]"\r
- lappend data "$item$value"\r
- } elseif {$keyfound && (!$itemfound)} {\r
- lappend data "$item$value"\r
- }\r
-\r
- set iniparse($id,data) $data\r
-}\r
-\r
-#\r
-# Usage:\r
-# iniparse:removeitem <fileId> <keyname> <itemname>\r
-# Removes <itemname> under <keyname> in <fileId>.\r
-#\r
-# Notes:\r
-# - This procedure doesn't write directly to the file, but to the\r
-# memory-version of the file. If directly the file (not memory version) is\r
-# modified after the call to iniparse:openfile, this procedure will not\r
-# see the changes in the file, but only changes in memory-version.\r
-#\r
-# See: readini iniparse:openfile\r
-#\r
-proc iniparse:removeitem {id key item} {\r
-global iniparse\r
- set fileline ""\r
- set keyfound 0\r
- set itemfound 0\r
- set itemlength [string length $item]\r
- set item "$item="\r
-\r
- if {[lsearch $iniparse(idlist) $id] == -1} return ;# No such Id\r
-\r
- set fileline $iniparse($id,data)\r
- set data {}\r
-\r
- foreach line $fileline {\r
- if {(!$keyfound)} { ;# We will search for the key.\r
- if {$line=="\[$key\]"} {\r
- lappend data "" $line\r
- set keyfound 1\r
- continue\r
- } else {lappend data $line; continue}\r
- }\r
- if {($keyfound) && (!$itemfound) && [chrchk $line]} { ;# We hit the next key!\r
- lappend data "" $line\r
- set itemfound 1\r
- continue\r
- }\r
- if {($keyfound) && (!$itemfound)} { ;# We will search for the item\r
- if {[string range $line 0 $itemlength]==$item} {\r
- set itemfound 1\r
- continue ;# We don't print the line to file\r
- } else {lappend data $line; continue}\r
- }\r
- # Because it doesn't match anything above, we print the line to file\r
- if {[chrchk $line]} {lappend data "" $line} \\r
- else {lappend data $line}\r
- }\r
-\r
- set iniparse($id,data) $data\r
-}\r
-\r
-#\r
-# Usage:\r
-# iniparse:removekey <fileId> <keyname>\r
-# Removes <keyname> in <fileId>.\r
-#\r
-# Notes:\r
-# - This procedure doesn't write directly to the file, but to the\r
-# memory-version of the file. If directly the file (not memory version) is\r
-# modified after the call to iniparse:openfile, this procedure will not\r
-# see the changes in the file, but only changes in memory-version.\r
-#\r
-# See: readini iniparse:openfile\r
-#\r
-proc iniparse:removekey {id key} {\r
-global iniparse\r
- set fileline ""\r
- set keyfound 0\r
- set keyfinished 0\r
-\r
- if {[lsearch $iniparse(idlist) $id] == -1} return ;# No such Id\r
-\r
- set fileline $iniparse($id,data)\r
- set data {}\r
-\r
- foreach line $fileline {\r
- if {(!$keyfound)} { ;# We will search for the key.\r
- if {$line=="\[$key\]"} {\r
- set keyfound 1\r
- continue\r
- }\r
- }\r
- if {($keyfound) && (!$keyfinished) && (![chrchk $line])} { ;# We are waiting for the next key\r
- continue\r
- }\r
- if {($keyfound) && (!$keyfinished) && ([chrchk $line])} { ;# We are hit the next key!\r
- lappend data "" $line\r
- set keyfinished 1\r
- continue\r
- }\r
- # Because it doesn't match anything above, we print the line to file\r
- if {[chrchk $line]} {lappend data "" $line} \\r
- else {lappend data $line}\r
- }\r
-\r
- set iniparse($id,data) $data\r
-}\r
-\r
-#\r
-# Usage:\r
-# iniparse:renameitem <fileId> <keyname> <itemName> <newItemName>\r
-# Renames <itemName> under <keyname> in <fileId> to <newItemName>.\r
-#\r
-# Notes:\r
-# - This procedure doesn't write directly to the file, but to the\r
-# memory-version of the file. If directly the file (not memory version) is\r
-# modified after the call to iniparse:openfile, this procedure will not\r
-# see the changes in the file, but only changes in memory-version.\r
-#\r
-# See: readini iniparse:openfile\r
-#\r
-proc iniparse:renameitem {id key olditem newitem} {\r
- writeini $id $key $newitem [readini $id $key $olditem]\r
- iniparse:removeitem $id $key $olditem\r
-}\r
-\r
-#\r
-# Usage:\r
-# iniparse:renamekey <fileId> <keyname> <newKeyName>\r
-# Renames <keyname> in <fileId> to <newKeyName>.\r
-#\r
-# Notes:\r
-# - This procedure doesn't write directly to the file, but to the\r
-# memory-version of the file. If directly the file (not memory version) is\r
-# modified after the call to iniparse:openfile, this procedure will not\r
-# see the changes in the file, but only changes in memory-version.\r
-#\r
-# See: readini iniparse:openfile\r
-#\r
-proc iniparse:renamekey {id oldkey newkey} {\r
-global iniparse\r
-\r
- if {[lsearch $iniparse(idlist) $id] == -1} return ;# No such Id\r
-\r
- set fileline $iniparse($id,data)\r
- set data {}\r
-\r
- foreach line $fileline {\r
- if {$line=="\[$oldkey\]"} {\r
- lappend data "" "\[$newkey\]"\r
- continue\r
- } else {\r
- if {[chrchk $line]} {lappend data "" $line} \\r
- else {lappend data $line}\r
- }\r
- }\r
-\r
- set iniparse($id,data) $data\r
-}\r
-\r