aUCBLogo Demos and Tests / cgitest3
			
				
			
			#!D:/Users/AndreasM/aucblogo/aucblogo_client.exe
setCaseIgnored false
to cgitest3
   output runSecure security_connect [cgi3proc]
end
to cgi3proc
   local [out err result]
   catch "error
   [
      out=(Word [Content-type: Text/html; charset=iso-8859-1
<HTML>])
      changeDir [D:/Users/AndreasM/aucblogo]
      result=cgi3
            [D:/Apache2.2/htdocs/]
            &out
      closeall
      if result=="reset [reset]
      (GC true)
   ]
   err=error
   if not emptyP err
   [   out=(Word out first butFirst err 
         "\ in\  first bF bF err
         "( first bF bF bF bF err ")</br>)
   ]
   output out
end
to cgi3 dname &out
   local [err errout 
      request_method query_string content_length 
      query_length maxArgs argCount name value 
      start_name start_value end_value end_name 
      namename i gr
      %run %animate %stop %reset %commands %FrameNr FrameNr]
      
   request_method=getEnv "REQUEST_METHOD
   query_string  =getEnv "QUERY_STRING
   content_length=getEnv "CONTENT_LENGTH
;request_method="GET
;query_string  ="heading=10&time=1234
;content_length=getenv "CONTENT_LENGTH
;print query_string
   if (empty? request_method) or2 empty? query_string
   [   goTo "nix
   ]
   query_length=0
   if request_method==" [output []]
   if request_method=="GET or2 request_method=="POST
   [   if query_string==" [output []]
      ifElse content_length=="
      [   query_length=count query_string
      ][   query_length=Int content_length
      ]
   ]
;   if request_method=="POST
;   [   if content_length==0 [output []]
;      query_length=Int content_length
;      setReader "stdin
;      query_string=readRawLine
;      setReader []
;   ]
   maxArgs=10
   name=Array maxArgs
   value=Array maxArgs
   for [i 1 maxArgs 1]
   [   name.i=[]
      value.i=[]
   ]
   end_value=0
   argCount=1
   while [end_value < query_length]
   [   start_name=end_value+1
      end_name=start_name
      while [end_name<query_length and2 query_string.end_name !="=]
      [   end_name=end_name+1
      ]
      name.argCount=Items start_name end_name-1 query_string
      name.argCount=decode_string name.argCount
      start_value=end_name+1
      end_value=start_value
      while [end_value<query_length]
      [   if query_string.end_value =="& [break]
         if query_string.end_value =="+  
         [   query_string.end_value="\ 
         ]
         end_value=end_value+1
      ]
      ifElse end_value<=query_length
      [   value.argCount=Items start_value end_value query_string
         value.argCount=decode_string value.argCount
      ][   value.argCount="
      ]
      argCount=argCount+1
   ]
   argCount=argCount-1
   
   if argCount > 0
   [   for [i 1 argCount 1]
      [   if not empty? name.i
         [   namename=Word "% name.i
            make namename  value.i
         ]   
      ]
   ]
tag "nix
   if not name? "%reset [%reset="]
   if not name? "%animate [%animate="]
   if not name? "%stop [%stop="]
   fname=BitAnd butFirst genSym 63
   local [txtname]
   txtname=Word fname [.txt]
   ifElse name? "%FrameNr [FrameNr=%FrameNr][FrameNr=0]
   if not Number? FrameNr [pr FrameNr FrameNr=0]
   ifElse (name? "%commands) and2 %reset !="reset
   [   openWrite txtname
      setWriter txtname
      setCaseIgnored true
      catch "error
      [   (runSecure 
            security_dlcall
            +security_iodll
            +security_shell
            +security_filewrite 
            ;+security_fileread
            ;+security_dirs
            +security_thread
            ;+security_keyboard
            +security_gui
            +security_erase
            1024   ;stack size (in bytes)
            1000000   ;graphic record size (in graphic primitives)
            2000000   ;memory size (in bytes)
            65536   ;max. number of nodes
            10000   ;timeout (in milliseconds)
            %commands)
      ]
      setCaseIgnored false
      changeDir [D:/Users/AndreasM/aucblogo]
      err=error
      ifElse not emptyP err
      [   errout=(Word [
         <tr><td style="color:yellow" bgcolor=red><b>
            ] 
            first butFirst err 
            "\ in\  first bF bF err
            "( first bF bF bF bF err ")</br>
            [
         </b></td></tr>])
      ][   errout=[]
      ]
      setWriter []
      close txtname
   ][   errout=[]
   ]
   setSaveSize [400 300]
   saveScreen (Word dname fname [.png])
   openRead (Word dname fname [.png])
   close (Word dname fname [.png])
   local [txt]
   txt=" 
   if File? txtname
   [   openRead txtname
      setReader txtname
      txt=readChars FileSize txtname
      setReader []
      close txtname
      eraseFile txtname
   ]
;      This is process number  GetProcessId ".
;      </br>)
   out=(Word out [
   <Head>
      <style type="Text/css">
         .output { Background-color:#FFFFFF; font-size:80%; }
      </style>
      <script type="Text/javascript">
         function setFocusRun()
         {   ])
            if %animate !="animate
            [   out=(Word out [document.Form1.commands.focus();])
            ]
            ;out=(word out
            ;[document.Form1.commands.rows=
            ;   (window.innerHeight-500)/20;
            ;])
            if %animate=="animate and2 %stop !="stop and2 empty? errout
            [   out=Word out [document.Form1.submit();]
            ]
            out=(Word out [               
         }
         Window.onresize=sizeit;
         function sizeit()
         {   document.Form1.commands.rows=
               (Window.innerHeight-500)/20;
         }
      </Script>
   </Head>
   <Body OnLoad="setFocusRun()"
   marginwidth="0" marginheight="0" topmargin="0" leftmargin="0">
      <Table Border="0" rules="rows">] errout)
;         if name? "argCount
;         [   for [i 1 argCount]
;            [   out=(word out name.i "= value.i "\ )
;            ]
;         ]
;         out=word out getEnvTable
         out=(Word out [
         <tr><td>
            <center>
               <Image src="] fname [.png" 
               width="400" height="300" tabindex="20">
            </center>
         </td></tr>
         <tr><td>
            <textarea class="output" name="commands" 
            style="width:100%; height:150;" tabindex="10">]
            txt 
            [</textarea>
         </td></tr>
         <tr><td>
            <Form action="cgitest3.lg" method="post" name="Form1">
               <textarea name="commands" rows="15" cols="70" 
               style="width:100%; font-size:14" border="0"
               tabindex="0">] 
                  ifElse name? "%commands 
                  [   %commands
                  ][   []
                  ]
               [</textarea>
               ])
               ifElse %animate=="animate and2 %stop !="stop
               [   out=(Word out 
               [<input name="run" type="hidden" value="run">
               <input name="animate" type="hidden" value="animate">
               <input name="stop" type="submit" value="stop" tabindex="1" accesskey="s">
               <Input name="FrameNr" size="10" border="0" value="]
                     FrameNr+1
                  [" tabindex="2">
                  ])
               ][   out=(Word out
               [<input name="run" type="submit" value="run" tabindex="1" accesskey="r">
               <input name="animate" type="submit" value="animate" tabindex="2" accesskey="a">
               <input name="reset" type="submit" value="reset" tabindex="3" accesskey="0">
               <Input name="FrameNr" size="10" border="0" value="]
                     FrameNr+1
                  [" tabindex="4">])
               ]
               out=(Word out [
               <Input name="Time" type="hidden" value="] TimeFine [">
            </Form>
         </td></tr>
      </Table>
   </Body>
</HTML>
])
;updateVars
pr %commands
   if %reset=="reset [output "reset]
   output []
end
to decode_string str
   local [length outpos ch1 ch2 n]
   length=count str
   outpos=1
   for [i 1 length 1]
   [   ifElse str.i == "&
      [;   str.outpos=" 
      ;   outpos=outpos+1
      ][   ifElse str.i == "%
         [   i=i+1   ch1=upperCase str.i
            i=i+1   ch2=upperCase str.i
            n=toInt  Word ch1 ch2  16
            if n != 10
            [   str.outpos=Char n
               outpos=outpos+1
            ]
         ][   str.outpos=str.i
            outpos=outpos+1
         ]
      ]
   ]
   output Items 1 outpos-1 str
end
to reset
   erase 
      remove "cgitest3 
      remove "cgi3proc 
      remove "cgi3 
      remove "decode_string 
      remove "reset Procedures
   erase 
      remove "cgi3proc::out Names
   erase (List [] [] 
      remove "cgi3proc 
      remove "cgi3
      remove "decode_string
      first bF bF Tables)
   setCaseIgnored false
;   closeall
   foreach allopen [close ?]
   erase buried
   clearShadows
   setUpdateGraph true
   setPenColor 0
   setScreenColor 7
   setFloodColor 0
   setPenSize [1 1]
   disableCylinderLines
   disableTexture
   enableLineSmooth
   setDepthFunc 1
   setLabelFont [Times]
   setLabelAlign 0 0
   showTurtle
   PenDown
   setLightAmbient RGB 0.1 0.1 0.1
   setLightDiffuse RGB 1 1 1
   unperspective
   clearScreen
   refresh
   wrap
;   doubleBuffer
   insertMode
   notFullScreen
   deleteTextures
   (GC true)
end