global env
#!/usr/local/bin/tcl 
# (or whatever flavour of Tcl you like to run)
# This  boilerplate goes at the top of your cgi script.  For a working
# example of this code see http://www.ucolick.org/epbook.html
#
# lifted this kludge directly from Jackson@stsci -- it works.
proc unescape {v} {
    # This a kludge
    regsub -all {\%25} $v {XXXPERCENTXXX} v
    set nv $v
    while {[regexp {%[0-9A-F][0-9A-F]} $v blah]} {
      scan $blah "%%%x" cv
      if {[ctype char $cv]=="&"} {
          regsub -all $blah $v \\& nv
      } else {
          regsub -all $blah $v [ctype char $cv] nv
      }
      set v $nv
    }
    regsub -all {XXXPERCENTXXX} $v {%} v
    return $v
}
#
if [info exists env(CONTENT_LENGTH)] then {
    set message [split [read stdin $env(CONTENT_LENGTH)] &]
    foreach pair $message {
      set name [lindex [split $pair =] 0]
      set val [lindex [split $pair =] 1]
      regsub -all {\+} $val { } val
      set val [unescape $val]
      set val [string trim $val]
      if [info exists value($name)] then {
          lappend value($name) $val
      } else {
          set value($name) $val
      }
    }
# If you have just one input widget called input, then you could do this:
#    set input $value(input)
} else {
#    puts $ofp "Did not find CONTENT_LENGTH"
    # In this case value came in argv
    set input $argv
#    puts $ofp "got input $input"
}
# otherwise you would want to do [array names value] and do a loop to
# set each array index (as a variable) to $value(name).. so if you
# had an input widget called voice and another called fax,
# set voice $value(voice) 
# set fax $value(fax)
#
# From here on you are on your own.  Enjoy.
#