+
+# procedure to get name of temporary directory,
+# ensuring it is existing and writeable
+proc _get_temp_dir {} {
+ global env
+
+ # check typical environment variables
+ foreach var {TempDir Temp Tmp} {
+ # check different case
+ foreach name [list [string toupper $var] $var [string tolower $var]] {
+ if { [info exists env($name)] && [file isdirectory $env($name)] &&
+ [file writable $env($name)] } {
+ return [regsub -all {\\} $env($name) /]
+ }
+ }
+ }
+
+ # check platform-specific locations
+ set fallback tmp
+ if { "$tcl_platform(platform)" == "windows" } {
+ set paths "c:/TEMP c:/TMP /TEMP /TMP"
+ if { [info exists env(HOMEDRIVE)] && [info exists env(HOMEPATH)] } {
+ set fallback [regsub -all {\\} "$env(HOMEDRIVE)$(HOMEPATH)/tmp" /]
+ }
+ } else {
+ set paths "/tmp /var/tmp /usr/tmp"
+ if { [info exists env(HOME)] } {
+ set fallback "$env(HOME)/tmp"
+ }
+ }
+ foreach dir $paths {
+ if { [file isdirectory $dir] && [file iswritable $dir] } {
+ return $dir
+ }
+ }
+
+ # fallback case: use subdir /tmp of home or current dir
+ file mkdir $fallback
+ return $fallback
+}