proc ParseString { variable_name string separators maximum } {
# this routine makes parsing easy WHILE preserving
# the "exactness" of the string by NOT treating it as a list...
#
# get ahold of an array to put results into
upvar "1" $variable_name local_array
# get a list of separators...
set separator_list [split $separators ""]
# get length in characters
set count [string length $string]
# start at first index (maybe make this variable later?)
set index "0"
# always start counting in result array from 1
# (should this really be zero?)
set found_index "1"
# how many "matches" did we find?
#
# NOTE: this will NOT be more than the parameter
# maximum, if specified
#
set found_count "0"
# current string that needs to be added when next
# separator is found...
set found_string ""
#
# keep going until the end of the string is reached
#
while {$index < $count} {
#
# go through string on a character-by-character basis
#
set character [string index $string $index]
#
# if the character is in the separator list,
# then we need to add to the array...
#
if {[lsearch -exact $separator_list $character] != "-1"} then {
if {$maximum > "0"} then {
#
# we are limiting the number of "matches" to a certain amount
# to allow for rather flexible argument parsing for callers...
# (they can treat the first X arguments as separate, and the
# rest as one long argument)
#
if {$found_count == [expr {$maximum - "1"}]} then {
# stop adding new after X matches... (last one is taken care
# of after loop)
set do_add "0"
} else {
# we haven't reached the maximum yet
set do_add "1"
}
} else {
# there is no maximum
set do_add "1"
}
} else {
# we didn't find a separator yet
set do_add "0"
}
if {$do_add != "0"} then {
#
# add string to found array...
#
set local_array($found_index) $found_string
# next index in result array
incr found_index
# increase count of found arguments
incr found_count
# reset current string
set found_string ""
} else {
#
# otherwise, just keep appending to current string
#
if {$found_string != ""} then {
# tack on the current character (this is not a separator)
append found_string $character
} else {
# since no other characters in the current string yet,
# just set it
set found_string $character
}
}
incr index
}
#
# don't forget last one... in case there is one...
# (this should always happen if the string doesn't end in space...)
#
if {$found_string != ""} then {
# add FINAL string to found array...
set local_array($found_index) $found_string
# next index in result array
incr found_index
# increase count to FINAL count of found arguments
incr found_count
# reset current string
set found_string ""
}
#
# pass back count always, even if no matches...
#
set local_array(count) $found_count
#
# NOTE: This should only return zero if there were
# no characters in the string (because otherwise
# we always found at least one element).
#
if {$found_count > "0"} then {
# if we found anything, return non-zero
set result "1"
} else {
# otherwise return zero
set result "0"
}
return $result
}