=================================================================== RCS file: /home/cvs/OpenXM/src/kan96xx/Doc/httpd-asir.sm1,v retrieving revision 1.1 retrieving revision 1.10 diff -u -p -r1.1 -r1.10 --- OpenXM/src/kan96xx/Doc/httpd-asir.sm1 2001/04/20 13:38:31 1.1 +++ OpenXM/src/kan96xx/Doc/httpd-asir.sm1 2001/04/23 13:34:00 1.10 @@ -1,61 +1,104 @@ -%% $OpenXM$ +%% $OpenXM: OpenXM/src/kan96xx/Doc/httpd-asir.sm1,v 1.9 2001/04/22 04:55:07 takayama Exp $ %% http server by sm1 + +/httpd.port 1200 def + +/httpd.initialization +%% Put initialization codes here. + [ + ("Asirweb version 0.80. "+ + " Risa/Asir oxasir version "+rtostr(version());) + ] cat +def + [(parse) (oxasir.sm1) pushfile] extension (oxasir.started) boundp { } { + %% Initialize oxasir. [(x^2-1) (x)] fctr pop + oxasir.ccc oxmathcap + oxasir.ccc oxsetmathcap } ifelse -/startserver { - [(sm1.socket) (open) [1200 (localhost)]] extension /server.fdAndPort set - (sm1.socket.open returns ) messagen server.fdAndPort message - [(sm1.socket) (accept) [server.fdAndPort 0 get]] extension - /server.fd set +/asirweb { + [/rrr ] pushVariables + [ + %% This procedure to generate port number might fail. + [(oxGenPass)] extension . (integer) dc /rrr set + rrr << rrr 20000 idiv 20000 mul >> sub /rrr set + /httpd.port 1200 rrr add def + httpd.port message + + [(sleep 3; netscape -geometry 800x500 http://localhost:) + httpd.port toString + ( &)] cat system + httpd ; + ] pop + popVariables +} def + +/httpd_startserver { + [(sm1.socket) (open) [httpd.port (localhost)]] extension + /httpd.server.fdAndPort set + (sm1.socket.open returns ) messagen httpd.server.fdAndPort message + [(sm1.socket) (accept) [httpd.server.fdAndPort 0 get]] extension + /httpd.server.fd set (connected.) message - (sm1.socket.accept returns ) messagen server.fd message + (sm1.socket.accept returns ) messagen httpd.server.fd message } def -/stopserver { - [(sm1.socket) (close) server.fd ] extension message +/httpd_stopserver { + [(sm1.socket) (close) httpd.server.fd ] extension message } def -/send { +/send_packet { /arg1 set - [(sm1.socket) (write) [server.fd 0 get arg1]] extension message + [(sm1.socket) (write) [httpd.server.fd 0 get arg1]] extension message } def /sendln { - /mmm set + /arg1 set + [/in-sendln /mmm] pushVariables + [ arg1 /mmm set mmm tag 5 eq { [mmm 10 (string) dc] cat /mmm set }{ 10 (string) dc /mmm set } ifelse - [(sm1.socket) (write) [server.fd 0 get mmm]] extension message + [(sm1.socket) (select) [httpd.server.fd 0 get 0]] extension { + (Warning: your peer closed the connection. Do not send the data.) message + } { + [(sm1.socket) (write) [httpd.server.fd 0 get mmm]] extension message + } ifelse + ] pop + popVariables } def /httpd { + /httpd.serial 0 def + /httpd.history [ ] def { - startserver ; - action ; - stopserver ; + httpd_startserver ; + httpd_action ; + httpd_stopserver ; (5 sleep) system + httpd.serial 1 add /httpd.serial set } loop } def -/action { +/httpd_action { + [/in-httpd /ff /httpd.com /httpd.result /sss + /sss.engine /sss.web /err + ] pushVariables + [ { - /httpd.com.old ( ) def - [(sm1.socket) (select) [server.fd 0 get -1]] extension -%% wait for ever - { - [(sm1.socket) (read) [server.fd 0 get ]] extension /ff set + [(sm1.socket) (select) [httpd.server.fd 0 get -1]] extension + %% wait for ever + [(sm1.socket) (read) [httpd.server.fd 0 get ]] extension /ff set ff length 0 eq { (connection is closed.) message } - ff (quit) eq - { (We exit the function httpd) message exit } - { %% [(SigIgn) 0] system_variable + { (------------ start ----------------------) message ff message (-----------------------------------------) message @@ -63,30 +106,90 @@ httpd.com message (------------ end ----------------------) message ( ) message - oxasir.ccc - [(if (1) {) httpd.com (};)] cat - oxexecutestring ; - oxasir.ccc oxpopstring /httpd.result set - /httpd.com.old httpd.com def - (------------- result -------------) message - httpd.result message - (----------------------------------) message - ( ) message - [(Input:) (
) httpd.com () (
) - httpd.result - () - ] cat - send-page-3 exit - %% [(SigIgn) 1] system_variable + httpd.serial 0 eq { + /httpd.com httpd.initialization def + } { } ifelse + httpd.com metaCommand { + httpd.textarea.valid { + oxasir.ccc + [(if (1) {) httpd.com (; };)] cat + oxexecutestring ; + }{ + send-page-warning exit + } ifelse + [(oxReq) oxasir.ccc SM_dupErrors ] extension pop + + [(oxReq) oxasir.ccc SM_popCMO ] extension pop + [(oxReq) oxasir.ccc SM_popString ] extension pop + [(flush)] extension pop + %% Select inputs for interruption. + %% Wait by the spin lock. + { + [(oxMultiSelect) [oxasir.ccc] 1] extension 1 get 0 get + /sss.engine set + [(sm1.socket) (mselect) + [[httpd.server.fd 0 get] 1] + ] extension 0 get /sss.web set + /sss [sss.engine sss.web] def + sss.engine { exit } { } ifelse + sss.web { exit } { } ifelse + } loop + sss message + + sss 0 get { + [(oxGet) oxasir.ccc] extension /err set + [(oxGet) oxasir.ccc] extension /httpd.result set + %% oxasir.ccc oxpopstring /httpd.result set + } { + oxasir.ccc oxreset + oxasir.ccc ("computation is interrupted.";) oxexecutestring ; + oxasir.ccc oxpopstring + /httpd.result set + exit + } ifelse + (------------- result -------------) message + httpd.result message + (----------------------------------) message + ( ) message + + err message + err [ ] eq { + /httpd.history + httpd.history + [10 (string) dc + (/**** ) httpd.serial toString ( ****/) + 10 (string) dc + httpd.com + (;) %% add extra ; + ] cat + append + def + } { + oxasir.ccc cleanErrors + [httpd.result 10 (string) dc err toString] cat + /httpd.result set + } ifelse + + [httpd.serial 0 eq { } { + (
) sss ()] cat /arg1 set + ] pop + popVariables + arg1 +} def + +/metaCommand { + /arg1 set + [/in-metaCommand /msg /result] pushVariables + [ + /msg arg1 def + /result 1 def + msg (httpdAsirMeta quit) eq { + oxasir.ccc oxshutdown + send-page-bye + quit + /result 0 def + } { } ifelse + msg (httpdAsirMeta save) eq { + send-page-save + /result 0 def + } { } ifelse + msg (httpdAsirMeta interrupt) eq { + oxasir.ccc oxreset + (Interrupted!