Artifact 4a50517b515c4ee5aa5a0ee3961bf0d4da9f4ecd:


0000: 3b 3b 20 43 6f 70 79 72 69 67 68 74 20 32 30 30  ;; Copyright 200
0010: 37 2d 32 30 31 31 2c 20 4d 61 74 74 68 65 77 20  7-2011, Matthew 
0020: 57 65 6c 6c 61 6e 64 2e 0a 3b 3b 20 0a 3b 3b 20  Welland..;; .;; 
0030: 20 54 68 69 73 20 70 72 6f 67 72 61 6d 20 69 73   This program is
0040: 20 6d 61 64 65 20 61 76 61 69 6c 61 62 6c 65 20   made available 
0050: 75 6e 64 65 72 20 74 68 65 20 47 4e 55 20 47 50  under the GNU GP
0060: 4c 20 76 65 72 73 69 6f 6e 20 32 2e 30 20 6f 72  L version 2.0 or
0070: 0a 3b 3b 20 20 67 72 65 61 74 65 72 2e 20 53 65  .;;  greater. Se
0080: 65 20 74 68 65 20 61 63 63 6f 6d 70 61 6e 79 69  e the accompanyi
0090: 6e 67 20 66 69 6c 65 20 43 4f 50 59 49 4e 47 20  ng file COPYING 
00a0: 66 6f 72 20 64 65 74 61 69 6c 73 2e 0a 3b 3b 20  for details..;; 
00b0: 0a 3b 3b 20 20 54 68 69 73 20 70 72 6f 67 72 61  .;;  This progra
00c0: 6d 20 69 73 20 64 69 73 74 72 69 62 75 74 65 64  m is distributed
00d0: 20 57 49 54 48 4f 55 54 20 41 4e 59 20 57 41 52   WITHOUT ANY WAR
00e0: 52 41 4e 54 59 3b 20 77 69 74 68 6f 75 74 20 65  RANTY; without e
00f0: 76 65 6e 20 74 68 65 0a 3b 3b 20 20 69 6d 70 6c  ven the.;;  impl
0100: 69 65 64 20 77 61 72 72 61 6e 74 79 20 6f 66 20  ied warranty of 
0110: 4d 45 52 43 48 41 4e 54 41 42 49 4c 49 54 59 20  MERCHANTABILITY 
0120: 6f 72 20 46 49 54 4e 45 53 53 20 46 4f 52 20 41  or FITNESS FOR A
0130: 20 50 41 52 54 49 43 55 4c 41 52 0a 3b 3b 20 20   PARTICULAR.;;  
0140: 50 55 52 50 4f 53 45 2e 0a 0a 3b 3b 20 73 74 6d  PURPOSE...;; stm
0150: 6c 20 69 73 20 61 20 6c 69 73 74 20 6f 66 20 68  l is a list of h
0160: 74 6d 6c 20 73 74 72 69 6e 67 73 0a 0a 3b 3b 20  tml strings..;; 
0170: 28 64 65 63 6c 61 72 65 20 28 75 6e 69 74 20 73  (declare (unit s
0180: 74 6d 6c 29 29 0a 0a 28 6d 6f 64 75 6c 65 20 73  tml))..(module s
0190: 74 6d 6c 32 0a 20 20 20 20 2a 0a 0a 28 69 6d 70  tml2.    *..(imp
01a0: 6f 72 74 20 63 68 69 63 6b 65 6e 20 73 63 68 65  ort chicken sche
01b0: 6d 65 20 64 61 74 61 2d 73 74 72 75 63 74 75 72  me data-structur
01c0: 65 73 20 65 78 74 72 61 73 20 73 72 66 69 2d 31  es extras srfi-1
01d0: 33 20 70 6f 72 74 73 20 29 0a 0a 28 75 73 65 20  3 ports )..(use 
01e0: 73 74 6d 6c 63 6f 6d 6d 6f 6e 20 63 6f 6f 6b 69  stmlcommon cooki
01f0: 65 20 6d 69 73 63 2d 73 74 6d 6c 20 66 6f 72 6d  e misc-stml form
0200: 64 61 74 20 73 65 73 73 69 6f 6e 20 73 71 6c 74  dat session sqlt
0210: 62 6c 20 6b 65 79 73 74 6f 72 65 29 0a 0a 3b 3b  bl keystore)..;;
0220: 20 28 64 65 63 6c 61 72 65 20 28 75 73 65 73 20   (declare (uses 
0230: 6d 69 73 63 2d 73 74 6d 6c 29 29 0a 28 75 73 65  misc-stml)).(use
0240: 20 72 65 67 65 78 29 0a 0a 3b 3b 20 65 78 74 72   regex)..;; extr
0250: 61 63 74 20 76 61 72 69 6f 75 73 20 74 6f 6b 65  act various toke
0260: 6e 73 20 66 72 6f 6d 20 74 68 65 20 70 61 72 61  ns from the para
0270: 6d 65 74 65 72 20 6c 69 73 74 0a 3b 3b 20 20 20  meter list.;;   
0280: 27 6b 65 79 20 76 61 6c 20 3d 3e 20 70 75 74 20  'key val => put 
0290: 69 6e 20 74 68 65 20 70 61 72 61 6d 73 20 6c 69  in the params li
02a0: 73 74 0a 3b 3b 20 20 20 73 74 72 69 6e 67 73 20  st.;;   strings 
02b0: 20 3d 3e 20 6d 61 69 6e 74 61 69 6e 20 6f 72 64   => maintain ord
02c0: 65 72 20 61 6e 64 20 61 64 64 20 74 6f 20 74 68  er and add to th
02d0: 65 20 64 61 74 61 6c 69 73 74 20 3c 3c 3d 3d 20  e datalist <<== 
02e0: 49 4d 50 4f 52 54 41 4e 54 0a 28 64 65 66 69 6e  IMPORTANT.(defin
02f0: 65 20 28 73 3a 65 78 74 72 61 63 74 20 69 6e 6c  e (s:extract inl
0300: 73 74 29 0a 20 20 28 69 66 20 28 6e 75 6c 6c 3f  st).  (if (null?
0310: 20 69 6e 6c 73 74 29 20 69 6e 6c 73 74 0a 20 20   inlst) inlst.  
0320: 20 20 20 20 28 6c 65 74 20 6c 6f 6f 70 20 28 28      (let loop ((
0330: 64 61 74 61 20 27 28 29 29 0a 20 20 20 20 20 20  data '()).      
0340: 20 20 20 20 20 20 20 20 20 20 20 28 70 61 72 61             (para
0350: 6d 73 20 27 28 29 29 0a 20 20 20 20 20 20 20 20  ms '()).        
0360: 20 20 20 20 20 20 20 20 20 28 68 65 61 64 20 28           (head (
0370: 63 61 72 20 69 6e 6c 73 74 29 29 0a 20 20 20 20  car inlst)).    
0380: 20 20 20 20 20 20 20 20 20 20 20 20 20 28 74 61               (ta
0390: 69 6c 20 28 63 64 72 20 69 6e 6c 73 74 29 29 29  il (cdr inlst)))
03a0: 0a 20 20 20 20 20 20 20 20 3b 3b 20 28 70 72 69  .        ;; (pri
03b0: 6e 74 20 22 68 65 61 64 3d 22 20 68 65 61 64 20  nt "head=" head 
03c0: 22 20 74 61 69 6c 3d 22 20 74 61 69 6c 29 0a 20  " tail=" tail). 
03d0: 20 20 20 20 20 20 20 28 63 6f 6e 64 20 0a 20 20         (cond .  
03e0: 20 20 20 20 20 20 20 28 28 6e 75 6c 6c 3f 20 74         ((null? t
03f0: 61 69 6c 29 0a 20 20 20 20 20 20 20 20 20 20 28  ail).          (
0400: 69 66 20 28 73 79 6d 62 6f 6c 3f 20 68 65 61 64  if (symbol? head
0410: 29 20 3b 3b 20 74 68 65 20 6c 61 73 74 20 69 74  ) ;; the last it
0420: 65 6d 20 69 73 20 61 20 70 61 72 61 6d 20 2d 20  em is a param - 
0430: 62 6f 72 6b 65 64 0a 20 20 20 20 20 20 20 20 20  borked.         
0440: 20 20 20 20 20 28 73 3a 6c 6f 67 20 22 45 52 52       (s:log "ERR
0450: 4f 52 3a 20 70 61 72 61 6d 20 77 69 74 68 20 6e  OR: param with n
0460: 6f 20 76 61 6c 75 65 22 29 29 0a 20 20 20 20 20  o value")).     
0470: 20 20 20 20 20 28 6c 69 73 74 20 28 61 70 70 65       (list (appe
0480: 6e 64 20 64 61 74 61 20 28 6c 69 73 74 20 28 73  nd data (list (s
0490: 3a 61 6e 79 2d 3e 73 74 72 69 6e 67 20 68 65 61  :any->string hea
04a0: 64 29 29 29 20 70 61 72 61 6d 73 29 29 0a 20 20  d))) params)).  
04b0: 20 20 20 20 20 20 20 28 28 6f 72 20 28 73 74 72         ((or (str
04c0: 69 6e 67 3f 20 68 65 61 64 29 28 6c 69 73 74 3f  ing? head)(list?
04d0: 20 68 65 61 64 29 28 6e 75 6d 62 65 72 3f 20 68   head)(number? h
04e0: 65 61 64 29 29 0a 20 20 20 20 20 20 20 20 20 20  ead)).          
04f0: 28 6c 6f 6f 70 20 28 61 70 70 65 6e 64 20 64 61  (loop (append da
0500: 74 61 20 28 6c 69 73 74 20 20 28 73 3a 61 6e 79  ta (list  (s:any
0510: 2d 3e 73 74 72 69 6e 67 20 68 65 61 64 29 29 29  ->string head)))
0520: 20 70 61 72 61 6d 73 20 28 63 61 72 20 74 61 69   params (car tai
0530: 6c 29 20 20 20 28 63 64 72 20 74 61 69 6c 29 29  l)   (cdr tail))
0540: 29 0a 20 20 20 20 20 20 20 20 20 28 28 73 79 6d  ).         ((sym
0550: 62 6f 6c 3f 20 68 65 61 64 29 0a 20 20 20 20 20  bol? head).     
0560: 20 20 20 20 20 28 6c 65 74 20 28 28 6e 65 77 2d       (let ((new-
0570: 70 61 72 61 6d 73 20 28 63 6f 6e 73 20 28 6c 69  params (cons (li
0580: 73 74 20 68 65 61 64 20 28 63 61 72 20 74 61 69  st head (car tai
0590: 6c 29 29 20 70 61 72 61 6d 73 29 29 0a 20 20 20  l)) params)).   
05a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 28 6e 65               (ne
05b0: 77 2d 74 61 69 6c 20 20 28 63 64 72 20 74 61 69  w-tail  (cdr tai
05c0: 6c 29 29 29 0a 20 20 20 20 20 20 20 20 20 20 20  l))).           
05d0: 20 28 69 66 20 28 6e 75 6c 6c 3f 20 6e 65 77 2d   (if (null? new-
05e0: 74 61 69 6c 29 20 3b 3b 20 77 65 20 61 72 65 20  tail) ;; we are 
05f0: 64 6f 6e 65 2c 20 6e 6f 20 6d 6f 72 65 20 70 61  done, no more pa
0600: 72 61 6d 73 20 65 74 63 2e 0a 20 20 20 20 20 20  rams etc..      
0610: 20 20 20 20 20 20 20 20 20 20 28 6c 69 73 74 20            (list 
0620: 64 61 74 61 20 6e 65 77 2d 70 61 72 61 6d 73 29  data new-params)
0630: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
0640: 20 28 6c 6f 6f 70 20 64 61 74 61 20 6e 65 77 2d   (loop data new-
0650: 70 61 72 61 6d 73 20 28 63 61 72 20 6e 65 77 2d  params (car new-
0660: 74 61 69 6c 29 28 63 64 72 20 6e 65 77 2d 74 61  tail)(cdr new-ta
0670: 69 6c 29 29 29 29 29 0a 20 20 20 20 20 20 20 20  il))))).        
0680: 20 28 65 6c 73 65 0a 20 20 20 20 20 20 20 20 20   (else.         
0690: 20 28 73 3a 6c 6f 67 20 22 57 41 52 4e 49 4e 47   (s:log "WARNING
06a0: 3a 20 4d 61 6c 66 6f 72 6d 65 64 20 69 6e 70 75  : Malformed inpu
06b0: 74 2c 20 79 6f 75 20 68 61 76 65 20 62 72 6f 6b  t, you have brok
06c0: 65 6e 20 73 74 6d 6c 2c 20 72 65 6d 65 6d 62 65  en stml, remembe
06d0: 72 20 74 68 61 74 20 61 6c 6c 20 73 74 6d 6c 20  r that all stml 
06e0: 63 61 6c 6c 73 20 73 68 6f 75 6c 64 20 72 65 74  calls should ret
06f0: 75 72 6e 20 61 20 72 65 73 75 6c 74 20 28 6e 75  urn a result (nu
0700: 6c 6c 20 6c 69 73 74 20 6f 72 20 65 6d 70 74 79  ll list or empty
0710: 20 73 74 72 69 6e 67 20 69 73 20 6f 6b 29 3a 5c   string is ok):\
0720: 6e 20 20 68 65 61 64 3d 22 20 68 65 61 64 20 0a  n  head=" head .
0730: 09 20 20 20 20 20 20 20 20 20 20 22 5c 6e 20 20  .          "\n  
0740: 74 61 69 6c 3d 22 20 74 61 69 6c 20 0a 20 20 20  tail=" tail .   
0750: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 22                 "
0760: 5c 6e 20 20 69 6e 6c 73 74 3d 22 20 69 6e 6c 73  \n  inlst=" inls
0770: 74 20 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  t .             
0780: 20 20 20 20 20 22 5c 6e 20 20 70 61 72 61 6d 73       "\n  params
0790: 3d 22 20 70 61 72 61 6d 73 29 0a 09 20 20 28 69  =" params)..  (i
07a0: 66 20 28 6e 75 6c 6c 3f 20 74 61 69 6c 29 0a 09  f (null? tail)..
07b0: 20 20 20 20 20 20 28 6c 69 73 74 20 64 61 74 61        (list data
07c0: 20 70 61 72 61 6d 73 29 0a 09 20 20 20 20 20 20   params)..      
07d0: 28 6c 6f 6f 70 20 64 61 74 61 20 70 61 72 61 6d  (loop data param
07e0: 73 20 28 63 61 72 20 74 61 69 6c 29 28 63 64 72  s (car tail)(cdr
07f0: 20 74 61 69 6c 29 29 29 29 29 29 29 29 0a 0a 3b   tail))))))))..;
0800: 3b 20 6d 6f 73 74 20 74 61 67 73 20 63 61 6e 20  ; most tags can 
0810: 62 65 20 68 61 6e 64 6c 65 64 20 62 79 20 74 68  be handled by th
0820: 69 73 20 72 6f 75 74 69 6e 65 0a 28 64 65 66 69  is routine.(defi
0830: 6e 65 20 28 73 3a 63 6f 6d 6d 6f 6e 2d 74 61 67  ne (s:common-tag
0840: 20 74 61 67 6e 61 6d 65 20 61 72 67 73 29 0a 20   tagname args). 
0850: 20 28 6c 65 74 2a 20 28 28 69 6e 70 75 74 73 20   (let* ((inputs 
0860: 28 73 3a 65 78 74 72 61 63 74 20 61 72 67 73 29  (s:extract args)
0870: 29 0a 20 20 20 20 20 20 20 20 20 28 64 61 74 61  ).         (data
0880: 20 20 20 28 63 61 72 20 69 6e 70 75 74 73 29 29     (car inputs))
0890: 0a 20 20 20 20 20 20 20 20 20 28 70 61 72 61 6d  .         (param
08a0: 73 20 28 73 3a 70 72 6f 63 65 73 73 2d 70 61 72  s (s:process-par
08b0: 61 6d 73 20 28 63 61 64 72 20 69 6e 70 75 74 73  ams (cadr inputs
08c0: 29 29 29 29 0a 20 20 20 20 28 6c 69 73 74 20 28  )))).    (list (
08d0: 63 6f 6e 63 20 22 3c 22 20 74 61 67 6e 61 6d 65  conc "<" tagname
08e0: 20 70 61 72 61 6d 73 20 22 3e 22 29 0a 20 20 20   params ">").   
08f0: 20 20 20 20 20 20 20 64 61 74 61 0a 20 20 20 20         data.    
0900: 20 20 20 20 20 20 28 63 6f 6e 63 20 22 3c 2f 22        (conc "</"
0910: 20 74 61 67 6e 61 6d 65 20 22 3e 22 29 29 29 29   tagname ">"))))
0920: 0a 0a 3b 3b 20 53 75 67 67 65 73 74 69 6f 6e 3a  ..;; Suggestion:
0930: 20 6f 72 64 65 72 20 74 68 65 73 65 20 61 6c 70   order these alp
0940: 68 61 62 65 74 69 63 61 6c 6c 79 0a 28 64 65 66  habetically.(def
0950: 69 6e 65 20 28 73 3a 61 20 20 20 20 20 20 2e 20  ine (s:a      . 
0960: 61 72 67 73 29 20 28 73 3a 63 6f 6d 6d 6f 6e 2d  args) (s:common-
0970: 74 61 67 20 22 41 22 20 20 20 20 20 20 61 72 67  tag "A"      arg
0980: 73 29 29 0a 28 64 65 66 69 6e 65 20 28 73 3a 62  s)).(define (s:b
0990: 20 20 20 20 20 20 2e 20 61 72 67 73 29 20 28 73        . args) (s
09a0: 3a 63 6f 6d 6d 6f 6e 2d 74 61 67 20 22 42 22 20  :common-tag "B" 
09b0: 20 20 20 20 20 61 72 67 73 29 29 0a 28 64 65 66       args)).(def
09c0: 69 6e 65 20 28 73 3a 75 20 20 20 20 20 20 2e 20  ine (s:u      . 
09d0: 61 72 67 73 29 20 28 73 3a 63 6f 6d 6d 6f 6e 2d  args) (s:common-
09e0: 74 61 67 20 22 55 22 20 20 20 20 20 20 61 72 67  tag "U"      arg
09f0: 73 29 29 0a 28 64 65 66 69 6e 65 20 28 73 3a 62  s)).(define (s:b
0a00: 69 67 20 20 20 20 2e 20 61 72 67 73 29 20 28 73  ig    . args) (s
0a10: 3a 63 6f 6d 6d 6f 6e 2d 74 61 67 20 22 42 49 47  :common-tag "BIG
0a20: 22 20 20 20 20 61 72 67 73 29 29 0a 28 64 65 66  "    args)).(def
0a30: 69 6e 65 20 28 73 3a 62 6f 64 79 20 20 20 2e 20  ine (s:body   . 
0a40: 61 72 67 73 29 20 28 73 3a 63 6f 6d 6d 6f 6e 2d  args) (s:common-
0a50: 74 61 67 20 22 42 4f 44 59 22 20 20 20 61 72 67  tag "BODY"   arg
0a60: 73 29 29 0a 28 64 65 66 69 6e 65 20 28 73 3a 62  s)).(define (s:b
0a70: 75 74 74 6f 6e 20 2e 20 61 72 67 73 29 20 28 73  utton . args) (s
0a80: 3a 63 6f 6d 6d 6f 6e 2d 74 61 67 20 22 42 55 54  :common-tag "BUT
0a90: 54 4f 4e 22 20 61 72 67 73 29 29 0a 28 64 65 66  TON" args)).(def
0aa0: 69 6e 65 20 28 73 3a 63 65 6e 74 65 72 20 2e 20  ine (s:center . 
0ab0: 61 72 67 73 29 20 28 73 3a 63 6f 6d 6d 6f 6e 2d  args) (s:common-
0ac0: 74 61 67 20 22 43 45 4e 54 45 52 22 20 61 72 67  tag "CENTER" arg
0ad0: 73 29 29 0a 28 64 65 66 69 6e 65 20 28 73 3a 63  s)).(define (s:c
0ae0: 6f 64 65 20 20 20 2e 20 61 72 67 73 29 20 28 73  ode   . args) (s
0af0: 3a 63 6f 6d 6d 6f 6e 2d 74 61 67 20 22 43 4f 44  :common-tag "COD
0b00: 45 22 20 20 20 61 72 67 73 29 29 0a 28 64 65 66  E"   args)).(def
0b10: 69 6e 65 20 28 73 3a 64 69 76 20 20 20 20 2e 20  ine (s:div    . 
0b20: 61 72 67 73 29 20 28 73 3a 63 6f 6d 6d 6f 6e 2d  args) (s:common-
0b30: 74 61 67 20 22 44 49 56 22 20 20 20 20 61 72 67  tag "DIV"    arg
0b40: 73 29 29 0a 28 64 65 66 69 6e 65 20 28 73 3a 68  s)).(define (s:h
0b50: 31 20 20 20 20 20 2e 20 61 72 67 73 29 20 28 73  1     . args) (s
0b60: 3a 63 6f 6d 6d 6f 6e 2d 74 61 67 20 22 48 31 22  :common-tag "H1"
0b70: 20 20 20 20 20 61 72 67 73 29 29 0a 28 64 65 66       args)).(def
0b80: 69 6e 65 20 28 73 3a 68 32 20 20 20 20 20 2e 20  ine (s:h2     . 
0b90: 61 72 67 73 29 20 28 73 3a 63 6f 6d 6d 6f 6e 2d  args) (s:common-
0ba0: 74 61 67 20 22 48 32 22 20 20 20 20 20 61 72 67  tag "H2"     arg
0bb0: 73 29 29 0a 28 64 65 66 69 6e 65 20 28 73 3a 68  s)).(define (s:h
0bc0: 33 20 20 20 20 20 2e 20 61 72 67 73 29 20 28 73  3     . args) (s
0bd0: 3a 63 6f 6d 6d 6f 6e 2d 74 61 67 20 22 48 33 22  :common-tag "H3"
0be0: 20 20 20 20 20 61 72 67 73 29 29 0a 28 64 65 66       args)).(def
0bf0: 69 6e 65 20 28 73 3a 68 34 20 20 20 20 20 2e 20  ine (s:h4     . 
0c00: 61 72 67 73 29 20 28 73 3a 63 6f 6d 6d 6f 6e 2d  args) (s:common-
0c10: 74 61 67 20 22 48 34 22 20 20 20 20 20 61 72 67  tag "H4"     arg
0c20: 73 29 29 0a 28 64 65 66 69 6e 65 20 28 73 3a 68  s)).(define (s:h
0c30: 35 20 20 20 20 20 2e 20 61 72 67 73 29 20 28 73  5     . args) (s
0c40: 3a 63 6f 6d 6d 6f 6e 2d 74 61 67 20 22 48 35 22  :common-tag "H5"
0c50: 20 20 20 20 20 61 72 67 73 29 29 0a 28 64 65 66       args)).(def
0c60: 69 6e 65 20 28 73 3a 68 65 61 64 20 20 20 2e 20  ine (s:head   . 
0c70: 61 72 67 73 29 20 28 73 3a 63 6f 6d 6d 6f 6e 2d  args) (s:common-
0c80: 74 61 67 20 22 48 45 41 44 22 20 20 20 61 72 67  tag "HEAD"   arg
0c90: 73 29 29 0a 28 64 65 66 69 6e 65 20 28 73 3a 68  s)).(define (s:h
0ca0: 74 6d 6c 20 20 20 2e 20 61 72 67 73 29 20 28 73  tml   . args) (s
0cb0: 3a 63 6f 6d 6d 6f 6e 2d 74 61 67 20 22 48 54 4d  :common-tag "HTM
0cc0: 4c 22 20 20 20 61 72 67 73 29 29 0a 28 64 65 66  L"   args)).(def
0cd0: 69 6e 65 20 28 73 3a 69 20 20 20 20 20 20 2e 20  ine (s:i      . 
0ce0: 61 72 67 73 29 20 28 73 3a 63 6f 6d 6d 6f 6e 2d  args) (s:common-
0cf0: 74 61 67 20 22 49 22 20 20 20 20 20 20 61 72 67  tag "I"      arg
0d00: 73 29 29 0a 28 64 65 66 69 6e 65 20 28 73 3a 69  s)).(define (s:i
0d10: 6d 67 20 20 20 20 2e 20 61 72 67 73 29 20 28 73  mg    . args) (s
0d20: 3a 63 6f 6d 6d 6f 6e 2d 74 61 67 20 22 49 4d 47  :common-tag "IMG
0d30: 22 20 20 20 20 61 72 67 73 29 29 0a 28 64 65 66  "    args)).(def
0d40: 69 6e 65 20 28 73 3a 69 6e 70 75 74 20 20 2e 20  ine (s:input  . 
0d50: 61 72 67 73 29 20 28 73 3a 63 6f 6d 6d 6f 6e 2d  args) (s:common-
0d60: 74 61 67 20 22 49 4e 50 55 54 22 20 20 61 72 67  tag "INPUT"  arg
0d70: 73 29 29 0a 28 64 65 66 69 6e 65 20 28 73 3a 6c  s)).(define (s:l
0d80: 69 6e 6b 20 20 20 2e 20 61 72 67 73 29 20 28 73  ink   . args) (s
0d90: 3a 63 6f 6d 6d 6f 6e 2d 74 61 67 20 22 4c 49 4e  :common-tag "LIN
0da0: 4b 22 20 20 20 61 72 67 73 29 29 0a 28 64 65 66  K"   args)).(def
0db0: 69 6e 65 20 28 73 3a 70 20 20 20 20 20 20 2e 20  ine (s:p      . 
0dc0: 61 72 67 73 29 20 28 73 3a 63 6f 6d 6d 6f 6e 2d  args) (s:common-
0dd0: 74 61 67 20 22 50 22 20 20 20 20 20 20 61 72 67  tag "P"      arg
0de0: 73 29 29 0a 28 64 65 66 69 6e 65 20 28 73 3a 73  s)).(define (s:s
0df0: 74 72 6f 6e 67 20 2e 20 61 72 67 73 29 20 28 73  trong . args) (s
0e00: 3a 63 6f 6d 6d 6f 6e 2d 74 61 67 20 22 53 54 52  :common-tag "STR
0e10: 4f 4e 47 22 20 61 72 67 73 29 29 0a 28 64 65 66  ONG" args)).(def
0e20: 69 6e 65 20 28 73 3a 74 61 62 6c 65 20 20 2e 20  ine (s:table  . 
0e30: 61 72 67 73 29 20 28 73 3a 63 6f 6d 6d 6f 6e 2d  args) (s:common-
0e40: 74 61 67 20 22 54 41 42 4c 45 22 20 20 61 72 67  tag "TABLE"  arg
0e50: 73 29 29 0a 28 64 65 66 69 6e 65 20 28 73 3a 74  s)).(define (s:t
0e60: 62 6f 64 79 20 20 2e 20 61 72 67 73 29 20 28 73  body  . args) (s
0e70: 3a 63 6f 6d 6d 6f 6e 2d 74 61 67 20 22 54 42 4f  :common-tag "TBO
0e80: 44 59 22 20 20 61 72 67 73 29 29 0a 28 64 65 66  DY"  args)).(def
0e90: 69 6e 65 20 28 73 3a 74 68 65 61 64 20 20 2e 20  ine (s:thead  . 
0ea0: 61 72 67 73 29 20 28 73 3a 63 6f 6d 6d 6f 6e 2d  args) (s:common-
0eb0: 74 61 67 20 22 54 48 45 41 44 22 20 20 61 72 67  tag "THEAD"  arg
0ec0: 73 29 29 0a 28 64 65 66 69 6e 65 20 28 73 3a 74  s)).(define (s:t
0ed0: 68 20 20 20 20 20 2e 20 61 72 67 73 29 20 28 73  h     . args) (s
0ee0: 3a 63 6f 6d 6d 6f 6e 2d 74 61 67 20 22 54 48 22  :common-tag "TH"
0ef0: 20 20 20 20 20 61 72 67 73 29 29 0a 28 64 65 66       args)).(def
0f00: 69 6e 65 20 28 73 3a 74 64 20 20 20 20 20 2e 20  ine (s:td     . 
0f10: 61 72 67 73 29 20 28 73 3a 63 6f 6d 6d 6f 6e 2d  args) (s:common-
0f20: 74 61 67 20 22 54 44 22 20 20 20 20 20 61 72 67  tag "TD"     arg
0f30: 73 29 29 0a 28 64 65 66 69 6e 65 20 28 73 3a 74  s)).(define (s:t
0f40: 69 74 6c 65 20 20 2e 20 61 72 67 73 29 20 28 73  itle  . args) (s
0f50: 3a 63 6f 6d 6d 6f 6e 2d 74 61 67 20 22 54 49 54  :common-tag "TIT
0f60: 4c 45 22 20 20 61 72 67 73 29 29 0a 28 64 65 66  LE"  args)).(def
0f70: 69 6e 65 20 28 73 3a 74 72 20 20 20 20 20 2e 20  ine (s:tr     . 
0f80: 61 72 67 73 29 20 28 73 3a 63 6f 6d 6d 6f 6e 2d  args) (s:common-
0f90: 74 61 67 20 22 54 52 22 20 20 20 20 20 61 72 67  tag "TR"     arg
0fa0: 73 29 29 0a 28 64 65 66 69 6e 65 20 28 73 3a 73  s)).(define (s:s
0fb0: 6d 61 6c 6c 20 20 2e 20 61 72 67 73 29 20 28 73  mall  . args) (s
0fc0: 3a 63 6f 6d 6d 6f 6e 2d 74 61 67 20 22 53 4d 41  :common-tag "SMA
0fd0: 4c 4c 22 20 20 61 72 67 73 29 29 0a 28 64 65 66  LL"  args)).(def
0fe0: 69 6e 65 20 28 73 3a 71 75 6f 74 65 20 20 2e 20  ine (s:quote  . 
0ff0: 61 72 67 73 29 20 28 73 3a 63 6f 6d 6d 6f 6e 2d  args) (s:common-
1000: 74 61 67 20 22 51 55 4f 54 45 22 20 20 61 72 67  tag "QUOTE"  arg
1010: 73 29 29 0a 28 64 65 66 69 6e 65 20 28 73 3a 68  s)).(define (s:h
1020: 72 20 20 20 20 20 2e 20 61 72 67 73 29 20 28 73  r     . args) (s
1030: 3a 63 6f 6d 6d 6f 6e 2d 74 61 67 20 22 48 52 22  :common-tag "HR"
1040: 20 20 20 20 20 61 72 67 73 29 29 0a 28 64 65 66       args)).(def
1050: 69 6e 65 20 28 73 3a 6c 69 20 20 20 20 20 2e 20  ine (s:li     . 
1060: 61 72 67 73 29 20 28 73 3a 63 6f 6d 6d 6f 6e 2d  args) (s:common-
1070: 74 61 67 20 22 4c 49 22 20 20 20 20 20 61 72 67  tag "LI"     arg
1080: 73 29 29 0a 28 64 65 66 69 6e 65 20 28 73 3a 75  s)).(define (s:u
1090: 6c 20 20 20 20 20 2e 20 61 72 67 73 29 20 28 73  l     . args) (s
10a0: 3a 63 6f 6d 6d 6f 6e 2d 74 61 67 20 22 55 4c 22  :common-tag "UL"
10b0: 20 20 20 20 20 61 72 67 73 29 29 0a 28 64 65 66       args)).(def
10c0: 69 6e 65 20 28 73 3a 6f 6c 20 20 20 20 20 2e 20  ine (s:ol     . 
10d0: 61 72 67 73 29 20 28 73 3a 63 6f 6d 6d 6f 6e 2d  args) (s:common-
10e0: 74 61 67 20 22 4f 4c 22 20 20 20 20 20 61 72 67  tag "OL"     arg
10f0: 73 29 29 0a 28 64 65 66 69 6e 65 20 28 73 3a 64  s)).(define (s:d
1100: 6c 20 20 20 20 20 2e 20 61 72 67 73 29 20 28 73  l     . args) (s
1110: 3a 63 6f 6d 6d 6f 6e 2d 74 61 67 20 22 44 4c 22  :common-tag "DL"
1120: 20 20 20 20 20 61 72 67 73 29 29 0a 28 64 65 66       args)).(def
1130: 69 6e 65 20 28 73 3a 64 74 20 20 20 20 20 2e 20  ine (s:dt     . 
1140: 61 72 67 73 29 20 28 73 3a 63 6f 6d 6d 6f 6e 2d  args) (s:common-
1150: 74 61 67 20 22 44 54 22 20 20 20 20 20 61 72 67  tag "DT"     arg
1160: 73 29 29 0a 28 64 65 66 69 6e 65 20 28 73 3a 64  s)).(define (s:d
1170: 64 20 20 20 20 20 2e 20 61 72 67 73 29 20 28 73  d     . args) (s
1180: 3a 63 6f 6d 6d 6f 6e 2d 74 61 67 20 22 44 44 22  :common-tag "DD"
1190: 20 20 20 20 20 61 72 67 73 29 29 0a 28 64 65 66       args)).(def
11a0: 69 6e 65 20 28 73 3a 70 72 65 20 20 20 20 2e 20  ine (s:pre    . 
11b0: 61 72 67 73 29 20 28 73 3a 63 6f 6d 6d 6f 6e 2d  args) (s:common-
11c0: 74 61 67 20 22 50 52 45 22 20 20 20 20 61 72 67  tag "PRE"    arg
11d0: 73 29 29 0a 28 64 65 66 69 6e 65 20 28 73 3a 73  s)).(define (s:s
11e0: 70 61 6e 20 20 20 2e 20 61 72 67 73 29 20 28 73  pan   . args) (s
11f0: 3a 63 6f 6d 6d 6f 6e 2d 74 61 67 20 22 53 50 41  :common-tag "SPA
1200: 4e 22 20 20 20 61 72 67 73 29 29 0a 28 64 65 66  N"   args)).(def
1210: 69 6e 65 20 28 73 3a 6c 61 62 65 6c 20 20 2e 20  ine (s:label  . 
1220: 61 72 67 73 29 20 28 73 3a 63 6f 6d 6d 6f 6e 2d  args) (s:common-
1230: 74 61 67 20 22 4c 41 42 45 4c 22 20 20 61 72 67  tag "LABEL"  arg
1240: 73 29 29 0a 0a 28 64 65 66 69 6e 65 20 28 73 3a  s))..(define (s:
1250: 64 62 6c 71 75 6f 74 65 20 20 2e 20 61 72 67 73  dblquote  . args
1260: 29 0a 20 20 28 6c 65 74 2a 20 28 28 69 6e 70 75  ).  (let* ((inpu
1270: 74 73 20 28 73 3a 65 78 74 72 61 63 74 20 61 72  ts (s:extract ar
1280: 67 73 29 29 0a 20 20 20 20 20 20 20 20 20 28 64  gs)).         (d
1290: 61 74 61 20 20 20 28 63 61 61 72 20 69 6e 70 75  ata   (caar inpu
12a0: 74 73 29 29 0a 20 20 20 20 20 20 20 20 20 28 70  ts)).         (p
12b0: 61 72 61 6d 73 20 28 73 3a 70 72 6f 63 65 73 73  arams (s:process
12c0: 2d 70 61 72 61 6d 73 20 28 63 61 64 72 20 69 6e  -params (cadr in
12d0: 70 75 74 73 29 29 29 29 0a 20 20 20 20 28 63 6f  puts)))).    (co
12e0: 6e 63 20 22 26 71 75 6f 74 3b 22 20 64 61 74 61  nc "&quot;" data
12f0: 20 22 26 71 75 6f 74 3b 22 29 29 29 0a 0a 28 64   "&quot;")))..(d
1300: 65 66 69 6e 65 20 28 73 3a 62 72 20 20 20 20 20  efine (s:br     
1310: 2e 20 61 72 67 73 29 20 22 3c 42 52 3e 22 29 20  . args) "<BR>") 
1320: 3b 3b 20 20 54 48 49 53 20 4d 41 59 20 4e 4f 54  ;;  THIS MAY NOT
1330: 20 57 4f 52 4b 21 21 21 21 20 42 52 20 43 41 4e   WORK!!!! BR CAN
1340: 20 28 4d 49 53 54 41 4b 45 4e 4c 59 29 20 47 45   (MISTAKENLY) GE
1350: 54 20 50 41 52 41 4d 20 54 45 58 54 0a 3b 3b 20  T PARAM TEXT.;; 
1360: 28 64 65 66 69 6e 65 20 28 73 3a 62 72 20 20 20  (define (s:br   
1370: 20 20 2e 20 61 72 67 73 29 20 28 73 3a 63 6f 6d    . args) (s:com
1380: 6d 6f 6e 2d 74 61 67 20 22 42 52 22 20 20 20 20  mon-tag "BR"    
1390: 20 61 72 67 73 29 29 0a 28 64 65 66 69 6e 65 20   args)).(define 
13a0: 28 73 3a 66 6f 6e 74 20 20 20 2e 20 61 72 67 73  (s:font   . args
13b0: 29 20 28 73 3a 63 6f 6d 6d 6f 6e 2d 74 61 67 20  ) (s:common-tag 
13c0: 22 46 4f 4e 54 22 20 20 20 61 72 67 73 29 29 0a  "FONT"   args)).
13d0: 28 64 65 66 69 6e 65 20 28 73 3a 65 72 72 2d 66  (define (s:err-f
13e0: 6f 6e 74 20 2e 20 61 72 67 73 29 0a 20 20 28 73  ont . args).  (s
13f0: 3a 62 20 28 73 3a 66 6f 6e 74 20 27 63 6f 6c 6f  :b (s:font 'colo
1400: 72 20 22 72 65 64 22 20 61 72 67 73 29 29 29 0a  r "red" args))).
1410: 0a 28 64 65 66 69 6e 65 20 28 73 3a 63 6f 6d 6d  .(define (s:comm
1420: 65 6e 74 20 2e 20 61 72 67 73 29 0a 20 20 28 6c  ent . args).  (l
1430: 65 74 2a 20 28 28 69 6e 70 75 74 73 20 28 73 3a  et* ((inputs (s:
1440: 65 78 74 72 61 63 74 20 61 72 67 73 29 29 0a 20  extract args)). 
1450: 20 20 20 20 20 20 20 20 28 64 61 74 61 20 20 20          (data   
1460: 28 63 61 72 20 69 6e 70 75 74 73 29 29 0a 20 20  (car inputs)).  
1470: 20 20 20 20 20 20 20 28 70 61 72 61 6d 73 20 28         (params (
1480: 73 3a 70 72 6f 63 65 73 73 2d 70 61 72 61 6d 73  s:process-params
1490: 20 28 63 61 64 72 20 69 6e 70 75 74 73 29 29 29   (cadr inputs)))
14a0: 29 0a 20 20 20 20 28 6c 69 73 74 20 22 3c 21 2d  ).    (list "<!-
14b0: 2d 22 20 64 61 74 61 20 22 2d 2d 3e 22 29 29 29  -" data "-->")))
14c0: 0a 0a 28 64 65 66 69 6e 65 20 28 73 3a 6e 75 6c  ..(define (s:nul
14d0: 6c 20 20 20 2e 20 61 72 67 73 29 20 3b 3b 20 6e  l   . args) ;; n
14e0: 6f 70 0a 20 20 28 6c 65 74 2a 20 28 28 69 6e 70  op.  (let* ((inp
14f0: 75 74 73 20 28 73 3a 65 78 74 72 61 63 74 20 61  uts (s:extract a
1500: 72 67 73 29 29 0a 20 20 20 20 20 20 20 20 20 28  rgs)).         (
1510: 64 61 74 61 20 20 20 28 63 61 72 20 69 6e 70 75  data   (car inpu
1520: 74 73 29 29 0a 20 20 20 20 20 20 20 20 20 28 70  ts)).         (p
1530: 61 72 61 6d 73 20 28 73 3a 70 72 6f 63 65 73 73  arams (s:process
1540: 2d 70 61 72 61 6d 73 20 28 63 61 64 72 20 69 6e  -params (cadr in
1550: 70 75 74 73 29 29 29 29 0a 20 20 20 20 28 6c 69  puts)))).    (li
1560: 73 74 20 64 61 74 61 29 29 29 0a 0a 3b 3b 20 70  st data)))..;; p
1570: 75 74 73 20 61 20 6e 69 63 65 20 62 6f 78 20 61  uts a nice box a
1580: 72 6f 75 6e 64 20 61 20 63 68 75 6e 6b 20 6f 66  round a chunk of
1590: 20 73 74 75 66 66 0a 28 64 65 66 69 6e 65 20 28   stuff.(define (
15a0: 73 3a 66 69 65 6c 64 73 65 74 20 6c 65 67 65 6e  s:fieldset legen
15b0: 64 20 2e 20 61 72 67 73 29 0a 20 20 28 6c 69 73  d . args).  (lis
15c0: 74 20 22 3c 46 49 45 4c 44 53 45 54 3e 3c 4c 45  t "<FIELDSET><LE
15d0: 47 45 4e 44 3e 22 20 6c 65 67 65 6e 64 20 22 3c  GEND>" legend "<
15e0: 2f 4c 45 47 45 4e 44 3e 22 20 61 72 67 73 20 22  /LEGEND>" args "
15f0: 3c 2f 46 49 45 4c 44 53 45 54 3e 22 29 29 0a 0a  </FIELDSET>"))..
1600: 3b 3b 20 67 69 76 65 6e 20 61 20 73 74 72 69 6e  ;; given a strin
1610: 67 20 72 65 74 75 72 6e 20 74 68 65 20 73 74 72  g return the str
1620: 69 6e 67 20 69 66 20 69 74 20 69 73 20 6e 6f 6e  ing if it is non
1630: 2d 77 68 69 74 65 20 73 70 61 63 65 20 6f 72 20  -white space or 
1640: 26 6e 62 73 70 3b 20 6f 74 68 65 72 77 69 73 65  &nbsp; otherwise
1650: 0a 28 64 65 66 69 6e 65 20 28 73 3a 6e 62 73 70  .(define (s:nbsp
1660: 20 73 74 72 29 0a 20 20 28 69 66 20 28 73 74 72   str).  (if (str
1670: 69 6e 67 2d 6d 61 74 63 68 20 22 5e 5c 5c 73 2a  ing-match "^\\s*
1680: 24 22 20 73 74 72 29 0a 20 20 20 20 20 20 22 26  $" str).      "&
1690: 6e 62 73 70 3b 22 0a 20 20 20 20 20 20 73 74 72  nbsp;".      str
16a0: 29 29 0a 0a 3b 3b 20 55 53 45 20 27 70 61 67 65  ))..;; USE 'page
16b0: 5f 6f 76 65 72 72 69 64 65 20 74 6f 20 6f 76 65  _override to ove
16c0: 72 72 69 64 65 20 61 20 6c 69 6e 6b 74 6f 20 70  rride a linkto p
16d0: 61 67 65 20 66 72 6f 6d 20 61 20 62 75 74 74 6f  age from a butto
16e0: 6e 0a 28 64 65 66 69 6e 65 20 28 73 3a 66 6f 72  n.(define (s:for
16f0: 6d 20 20 20 2e 20 61 72 67 73 29 0a 20 20 3b 3b  m   . args).  ;;
1700: 20 63 72 65 61 74 65 20 61 20 6c 69 6e 6b 20 66   create a link f
1710: 6f 72 20 63 61 6c 6c 69 6e 67 20 62 61 63 6b 20  or calling back 
1720: 69 6e 74 6f 20 74 68 65 20 63 75 72 72 65 6e 74  into the current
1730: 20 70 61 67 65 20 61 6e 64 20 63 61 6c 6c 69 6e   page and callin
1740: 67 20 61 20 73 70 65 63 69 66 69 65 64 20 0a 20  g a specified . 
1750: 20 3b 3b 20 66 75 6e 63 74 69 6f 6e 0a 20 20 28   ;; function.  (
1760: 6c 65 74 2a 20 28 28 61 63 74 69 6f 6e 20 20 20  let* ((action   
1770: 20 20 28 6c 65 74 20 28 28 76 20 28 73 3a 66 69    (let ((v (s:fi
1780: 6e 64 2d 70 61 72 61 6d 20 27 61 63 74 69 6f 6e  nd-param 'action
1790: 20 61 72 67 73 29 29 29 0a 20 20 20 20 20 20 20   args))).       
17a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
17b0: 28 69 66 20 76 20 76 20 22 64 65 66 61 75 6c 74  (if v v "default
17c0: 22 29 29 29 0a 09 20 28 69 64 20 20 20 20 20 20  "))).. (id      
17d0: 20 20 20 28 6c 65 74 20 28 28 69 20 28 73 3a 66     (let ((i (s:f
17e0: 69 6e 64 2d 70 61 72 61 6d 20 27 69 64 20 61 72  ind-param 'id ar
17f0: 67 73 29 29 29 0a 09 09 20 20 20 20 20 20 20 28  gs)))...       (
1800: 69 66 20 69 20 69 20 23 66 29 29 29 0a 20 20 20  if i i #f))).   
1810: 20 20 20 20 20 20 28 70 61 67 65 20 20 20 20 20        (page     
1820: 20 20 28 6c 65 74 20 28 28 70 20 28 73 64 61 74    (let ((p (sdat
1830: 2d 67 65 74 2d 70 61 67 65 20 73 3a 73 65 73 73  -get-page s:sess
1840: 69 6f 6e 29 29 29 0a 20 20 20 20 20 20 20 20 20  ion))).         
1850: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 28 69                (i
1860: 66 20 70 20 70 20 22 68 6f 6d 65 22 29 29 29 0a  f p p "home"))).
1870: 09 20 3b 3b 20 28 6c 69 6e 6b 20 20 20 20 20 20  . ;; (link      
1880: 20 28 73 65 73 73 69 6f 6e 3a 6c 69 6e 6b 2d 74   (session:link-t
1890: 6f 20 73 3a 73 65 73 73 69 6f 6e 20 70 61 67 65  o s:session page
18a0: 20 28 69 66 20 69 64 0a 20 20 20 20 20 20 20 20   (if id.        
18b0: 20 3b 3b 20 20 20 20 20 20 20 20 20 20 20 20 20   ;;             
18c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
18d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
18e0: 20 20 20 20 28 6c 69 73 74 20 27 61 63 74 69 6f      (list 'actio
18f0: 6e 20 61 63 74 69 6f 6e 20 27 69 64 20 69 64 29  n action 'id id)
1900: 0a 20 20 20 20 20 20 20 20 20 3b 3b 20 20 20 20  .         ;;    
1910: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1920: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1930: 20 20 20 20 20 20 20 20 20 20 20 20 20 28 6c 69               (li
1940: 73 74 20 27 61 63 74 69 6f 6e 20 61 63 74 69 6f  st 'action actio
1950: 6e 29 29 29 29 29 0a 09 20 28 6c 69 6e 6b 20 20  n))))).. (link  
1960: 20 20 20 20 20 28 69 66 20 28 73 74 72 69 6e 67       (if (string
1970: 3d 3f 20 28 73 75 62 73 74 72 69 6e 67 20 61 63  =? (substring ac
1980: 74 69 6f 6e 20 30 20 35 29 20 22 68 74 74 70 3a  tion 0 5) "http:
1990: 22 29 20 3b 3b 20 69 66 20 66 69 72 73 74 20 70  ") ;; if first p
19a0: 61 72 74 20 6f 66 20 73 74 72 69 6e 67 20 69 73  art of string is
19b0: 20 68 74 74 70 3a 0a 09 20 20 20 20 20 20 20 20   http:..        
19c0: 09 20 61 63 74 69 6f 6e 0a 09 20 20 20 20 20 20  . action..      
19d0: 20 20 09 20 28 73 65 73 73 69 6f 6e 3a 6c 69 6e    . (session:lin
19e0: 6b 2d 74 6f 20 73 3a 73 65 73 73 69 6f 6e 20 0a  k-to s:session .
19f0: 09 20 20 20 20 20 20 20 20 09 09 09 20 20 70 61  .        ...  pa
1a00: 67 65 20 0a 09 20 20 20 20 20 20 20 20 09 09 09  ge ..        ...
1a10: 20 20 28 69 66 20 69 64 0a 09 20 20 20 20 20 20    (if id..      
1a20: 20 20 09 09 09 20 20 20 20 20 20 28 6c 69 73 74    ...      (list
1a30: 20 27 61 63 74 69 6f 6e 20 61 63 74 69 6f 6e 20   'action action 
1a40: 27 69 64 20 69 64 29 0a 09 20 20 20 20 20 20 20  'id id)..       
1a50: 20 09 09 09 20 20 20 20 20 20 28 6c 69 73 74 20   ...      (list 
1a60: 27 61 63 74 69 6f 6e 20 61 63 74 69 6f 6e 29 29  'action action))
1a70: 29 29 29 29 0a 20 20 20 20 3b 3b 20 28 73 63 72  )))).    ;; (scr
1a80: 69 70 74 20 20 20 20 20 28 73 6c 6f 74 2d 72 65  ipt     (slot-re
1a90: 66 20 73 3a 73 65 73 73 69 6f 6e 20 27 73 63 72  f s:session 'scr
1aa0: 69 70 74 29 29 0a 20 20 20 20 3b 3b 20 28 61 63  ipt)).    ;; (ac
1ab0: 74 69 6f 6e 2d 73 74 72 20 28 73 74 72 69 6e 67  tion-str (string
1ac0: 2d 61 70 70 65 6e 64 20 73 63 72 69 70 74 20 22  -append script "
1ad0: 2f 22 20 70 61 67 65 20 22 3f 61 63 74 69 6f 6e  /" page "?action
1ae0: 3d 22 20 61 63 74 69 6f 6e 29 29 29 0a 20 20 20  =" action))).   
1af0: 20 28 73 3a 63 6f 6d 6d 6f 6e 2d 74 61 67 20 22   (s:common-tag "
1b00: 46 4f 52 4d 22 20 28 61 70 70 65 6e 64 20 28 73  FORM" (append (s
1b10: 3a 72 65 6d 6f 76 65 2d 70 61 72 61 6d 2d 6d 61  :remove-param-ma
1b20: 74 63 68 69 6e 67 20 28 73 3a 72 65 6d 6f 76 65  tching (s:remove
1b30: 2d 70 61 72 61 6d 2d 6d 61 74 63 68 69 6e 67 20  -param-matching 
1b40: 61 72 67 73 20 27 61 63 74 69 6f 6e 29 20 27 69  args 'action) 'i
1b50: 64 29 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  d).             
1b60: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1b70: 20 20 20 20 28 6c 69 73 74 20 27 61 63 74 69 6f      (list 'actio
1b80: 6e 20 6c 69 6e 6b 29 29 29 29 29 0a 0a 3b 3b 20  n link)))))..;; 
1b90: 6c 6f 6f 6b 20 75 70 20 74 68 65 20 76 61 72 69  look up the vari
1ba0: 61 62 6c 65 20 6e 61 6d 65 20 28 76 69 61 20 74  able name (via t
1bb0: 68 65 20 27 6e 61 6d 65 20 74 61 67 29 20 74 68  he 'name tag) th
1bc0: 65 6e 20 69 6e 6a 65 63 74 20 74 68 65 20 76 61  en inject the va
1bd0: 6c 75 65 20 66 72 6f 6d 20 74 68 65 20 73 65 73  lue from the ses
1be0: 73 69 6f 6e 20 76 61 72 0a 3b 3b 20 72 65 70 6c  sion var.;; repl
1bf0: 61 63 69 6e 67 20 74 68 65 20 27 76 61 6c 75 65  acing the 'value
1c00: 20 76 61 6c 75 65 20 69 66 20 69 74 20 69 73 20   value if it is 
1c10: 61 6c 72 65 61 64 79 20 74 68 65 72 65 2c 20 61  already there, a
1c20: 64 64 69 6e 67 20 69 74 20 69 66 20 69 74 20 69  dding it if it i
1c30: 73 20 6e 6f 74 2e 0a 28 64 65 66 69 6e 65 20 28  s not..(define (
1c40: 73 3a 70 72 65 73 65 72 76 65 20 74 61 67 20 61  s:preserve tag a
1c50: 72 67 73 29 0a 20 20 28 6c 65 74 2a 20 28 28 76  rgs).  (let* ((v
1c60: 61 72 2d 6e 61 6d 65 20 28 73 3a 66 69 6e 64 2d  ar-name (s:find-
1c70: 70 61 72 61 6d 20 27 6e 61 6d 65 20 61 72 67 73  param 'name args
1c80: 29 29 20 3b 3b 20 6e 61 6d 65 3d 27 76 61 72 6e  )) ;; name='varn
1c90: 61 6d 65 27 0a 09 20 28 76 61 6c 75 65 20 20 20  ame'.. (value   
1ca0: 20 28 6c 65 74 20 28 28 76 20 28 73 3a 67 65 74   (let ((v (s:get
1cb0: 20 76 61 72 2d 6e 61 6d 65 29 29 29 0a 09 09 20   var-name)))... 
1cc0: 20 20 20 20 28 69 66 20 76 20 76 20 23 66 29 29      (if v v #f))
1cd0: 29 0a 09 20 28 6e 65 77 61 72 67 73 20 20 28 61  ).. (newargs  (a
1ce0: 70 70 65 6e 64 20 28 73 3a 72 65 6d 6f 76 65 2d  ppend (s:remove-
1cf0: 70 61 72 61 6d 2d 6d 61 74 63 68 69 6e 67 20 61  param-matching a
1d00: 72 67 73 20 27 76 61 6c 75 65 29 20 28 69 66 20  rgs 'value) (if 
1d10: 76 61 6c 75 65 20 28 6c 69 73 74 20 27 76 61 6c  value (list 'val
1d20: 75 65 20 76 61 6c 75 65 29 20 27 28 29 29 29 29  ue value) '())))
1d30: 29 0a 20 20 20 20 28 73 3a 63 6f 6d 6d 6f 6e 2d  ).    (s:common-
1d40: 74 61 67 20 74 61 67 20 6e 65 77 61 72 67 73 29  tag tag newargs)
1d50: 29 29 0a 0a 28 64 65 66 69 6e 65 20 28 73 3a 69  ))..(define (s:i
1d60: 6e 70 75 74 2d 70 72 65 73 65 72 76 65 20 20 2e  nput-preserve  .
1d70: 20 61 72 67 73 29 0a 20 20 28 73 3a 70 72 65 73   args).  (s:pres
1d80: 65 72 76 65 20 22 49 4e 50 55 54 22 20 61 72 67  erve "INPUT" arg
1d90: 73 29 29 0a 0a 3b 3b 20 74 65 78 74 20 61 72 65  s))..;; text are
1da0: 61 73 20 61 72 65 20 64 6f 6e 65 20 61 20 6c 69  as are done a li
1db0: 74 74 6c 65 20 64 69 66 66 65 72 65 6e 74 6c 79  ttle differently
1dc0: 2e 20 54 68 65 20 76 61 6c 75 65 20 69 73 20 73  . The value is s
1dd0: 74 6f 72 65 64 20 62 65 74 77 65 65 6e 20 74 68  tored between th
1de0: 65 20 74 61 67 73 20 3c 74 65 78 74 61 72 65 61  e tags <textarea
1df0: 20 2e 2e 2e 3e 74 68 65 20 76 61 6c 75 65 20 67   ...>the value g
1e00: 6f 65 73 20 68 65 72 65 3c 2f 74 65 78 74 61 72  oes here</textar
1e10: 65 61 3e 0a 28 64 65 66 69 6e 65 20 28 73 3a 74  ea>.(define (s:t
1e20: 65 78 74 61 72 65 61 2d 70 72 65 73 65 72 76 65  extarea-preserve
1e30: 20 2e 20 61 72 67 73 29 0a 20 20 28 6c 65 74 2a   . args).  (let*
1e40: 20 28 28 76 61 72 2d 6e 61 6d 65 20 28 73 3a 66   ((var-name (s:f
1e50: 69 6e 64 2d 70 61 72 61 6d 20 27 6e 61 6d 65 20  ind-param 'name 
1e60: 61 72 67 73 29 29 0a 09 20 28 76 61 6c 75 65 20  args)).. (value 
1e70: 20 20 20 28 6c 65 74 20 28 28 76 20 28 73 3a 67     (let ((v (s:g
1e80: 65 74 20 76 61 72 2d 6e 61 6d 65 29 29 29 0a 09  et var-name)))..
1e90: 09 20 20 20 20 20 28 69 66 20 76 20 76 20 23 66  .     (if v v #f
1ea0: 29 29 29 29 0a 20 20 20 20 28 73 3a 63 6f 6d 6d  )))).    (s:comm
1eb0: 6f 6e 2d 74 61 67 20 22 54 45 58 54 41 52 45 41  on-tag "TEXTAREA
1ec0: 22 20 28 69 66 20 76 61 6c 75 65 20 28 63 6f 6e  " (if value (con
1ed0: 73 20 76 61 6c 75 65 20 61 72 67 73 29 20 61 72  s value args) ar
1ee0: 67 73 29 29 29 29 0a 0a 28 64 65 66 69 6e 65 20  gs))))..(define 
1ef0: 28 73 3a 6f 70 74 69 6f 6e 20 64 61 74 29 0a 20  (s:option dat). 
1f00: 20 28 6c 65 74 20 28 28 6c 65 6e 20 20 20 20 20   (let ((len     
1f10: 20 28 6c 65 6e 67 74 68 20 64 61 74 29 29 29 0a   (length dat))).
1f20: 20 20 20 20 28 63 6f 6e 64 0a 20 20 20 20 20 28      (cond.     (
1f30: 28 65 71 3f 20 6c 65 6e 20 31 29 0a 20 20 20 20  (eq? len 1).    
1f40: 20 20 28 6c 65 74 20 28 28 69 74 65 6d 20 28 63    (let ((item (c
1f50: 61 72 20 64 61 74 29 29 29 0a 09 28 73 3a 6f 70  ar dat)))..(s:op
1f60: 74 69 6f 6e 20 28 6c 69 73 74 20 69 74 65 6d 20  tion (list item 
1f70: 69 74 65 6d 20 69 74 65 6d 29 29 29 29 0a 20 20  item item)))).  
1f80: 20 20 20 28 28 65 71 3f 20 6c 65 6e 20 32 29 0a     ((eq? len 2).
1f90: 20 20 20 20 20 20 28 73 3a 6f 70 74 69 6f 6e 20        (s:option 
1fa0: 28 61 70 70 65 6e 64 20 64 61 74 20 28 6c 69 73  (append dat (lis
1fb0: 74 20 28 63 61 72 20 64 61 74 29 29 29 29 29 0a  t (car dat))))).
1fc0: 20 20 20 20 20 28 65 6c 73 65 0a 20 20 20 20 20       (else.     
1fd0: 20 28 6c 65 74 20 28 28 6c 61 62 65 6c 20 20 20   (let ((label   
1fe0: 20 28 63 61 72 20 64 61 74 29 29 0a 09 20 20 20   (car dat))..   
1ff0: 20 28 76 61 6c 75 65 20 20 20 20 28 63 61 64 72   (value    (cadr
2000: 20 64 61 74 29 29 0a 09 20 20 20 20 28 64 69 73   dat))..    (dis
2010: 70 76 61 6c 20 20 28 63 61 64 64 72 20 64 61 74  pval  (caddr dat
2020: 29 29 0a 09 20 20 20 20 28 73 65 6c 65 63 74 65  ))..    (selecte
2030: 64 20 28 69 66 20 28 3e 20 6c 65 6e 20 33 29 28  d (if (> len 3)(
2040: 63 61 64 64 64 72 20 64 61 74 29 20 23 66 29 29  cadddr dat) #f))
2050: 29 0a 09 28 6c 69 73 74 20 28 63 6f 6e 63 20 22  )..(list (conc "
2060: 3c 4f 50 54 49 4f 4e 20 22 20 0a 09 09 20 20 20  <OPTION " ...   
2070: 20 28 69 66 20 73 65 6c 65 63 74 65 64 20 22 20   (if selected " 
2080: 73 65 6c 65 63 74 65 64 20 22 20 22 22 29 0a 09  selected " "")..
2090: 09 20 20 20 20 22 6c 61 62 65 6c 3d 5c 22 22 20  .    "label=\"" 
20a0: 6c 61 62 65 6c 0a 09 09 20 20 20 20 22 5c 22 20  label...    "\" 
20b0: 76 61 6c 75 65 3d 5c 22 22 20 76 61 6c 75 65 0a  value=\"" value.
20c0: 09 09 20 20 20 20 22 5c 22 3e 22 20 64 69 73 70  ..    "\">" disp
20d0: 76 61 6c 20 22 3c 2f 4f 50 54 49 4f 4e 3e 22 29  val "</OPTION>")
20e0: 29 29 29 29 29 29 0a 0a 3b 3b 20 63 61 6c 6c 20  ))))))..;; call 
20f0: 6f 6e 6c 79 20 77 69 74 68 20 28 6c 61 62 65 6c  only with (label
2100: 20 28 6c 61 62 65 6c 20 76 61 6c 75 65 20 64 69   (label value di
2110: 73 70 76 61 6c 20 5b 23 74 5d 29 20 2e 2e 2e 29  spval [#t]) ...)
2120: 0a 3b 3b 20 4e 42 2f 2f 20 73 61 64 6c 79 20 74  .;; NB// sadly t
2130: 68 69 73 20 62 6c 6f 63 6b 20 69 73 20 72 65 64  his block is red
2140: 75 6e 64 61 6e 74 6c 79 20 61 6c 6d 6f 73 74 20  undantly almost 
2150: 69 64 65 6e 74 69 63 61 6c 20 74 6f 20 74 68 65  identical to the
2160: 20 73 3a 73 65 6c 65 63 74 0a 3b 3b 20 66 69 78   s:select.;; fix
2170: 20 74 68 61 74 20 6c 61 74 65 72 20 2e 2e 2e 0a   that later ....
2180: 28 64 65 66 69 6e 65 20 28 73 3a 6f 70 74 67 72  (define (s:optgr
2190: 6f 75 70 20 64 61 74 29 0a 20 20 28 6c 65 74 20  oup dat).  (let 
21a0: 28 28 6c 61 62 65 6c 20 28 63 61 72 20 64 61 74  ((label (car dat
21b0: 29 29 0a 09 28 72 65 6d 20 20 20 28 63 64 72 20  ))..(rem   (cdr 
21c0: 64 61 74 29 29 29 0a 20 20 20 20 28 69 66 20 28  dat))).    (if (
21d0: 6e 75 6c 6c 3f 20 72 65 6d 29 0a 09 28 73 3a 63  null? rem)..(s:c
21e0: 6f 6d 6d 6f 6e 2d 74 61 67 20 22 4f 50 54 47 52  ommon-tag "OPTGR
21f0: 4f 55 50 22 20 27 6c 61 62 65 6c 20 6c 61 62 65  OUP" 'label labe
2200: 6c 29 0a 09 28 6c 65 74 20 6c 6f 6f 70 20 28 28  l)..(let loop ((
2210: 68 65 64 20 28 63 61 72 20 72 65 6d 29 29 0a 09  hed (car rem))..
2220: 09 20 20 20 28 74 61 6c 20 28 63 64 72 20 72 65  .   (tal (cdr re
2230: 6d 29 29 0a 09 09 20 20 20 28 72 65 73 20 28 6c  m))...   (res (l
2240: 69 73 74 20 28 63 6f 6e 63 20 22 3c 4f 50 54 47  ist (conc "<OPTG
2250: 52 4f 55 50 20 6c 61 62 65 6c 3d 22 20 6c 61 62  ROUP label=" lab
2260: 65 6c 29 29 29 29 0a 09 20 20 3b 3b 20 28 70 72  el))))..  ;; (pr
2270: 69 6e 74 20 22 68 65 64 3a 20 22 20 68 65 64 20  int "hed: " hed 
2280: 22 20 74 61 6c 3a 20 22 20 74 61 6c 20 22 20 72  " tal: " tal " r
2290: 65 73 3a 20 22 20 72 65 73 29 0a 09 20 20 28 6c  es: " res)..  (l
22a0: 65 74 20 28 28 6e 65 77 20 28 61 70 70 65 6e 64  et ((new (append
22b0: 20 72 65 73 20 28 6c 69 73 74 20 28 69 66 20 28   res (list (if (
22c0: 6c 69 73 74 3f 20 28 63 61 64 72 20 68 65 64 29  list? (cadr hed)
22d0: 29 0a 09 09 09 09 09 20 20 20 28 73 3a 6f 70 74  )......   (s:opt
22e0: 67 72 6f 75 70 20 68 65 64 29 0a 09 09 09 09 09  group hed)......
22f0: 20 20 20 28 73 3a 6f 70 74 69 6f 6e 20 68 65 64     (s:option hed
2300: 29 29 29 29 29 29 0a 09 20 20 20 20 28 69 66 20  ))))))..    (if 
2310: 28 6e 75 6c 6c 3f 20 74 61 6c 29 0a 09 09 28 61  (null? tal)...(a
2320: 70 70 65 6e 64 20 6e 65 77 20 28 6c 69 73 74 20  ppend new (list 
2330: 22 3c 2f 4f 50 54 47 52 4f 55 50 3e 22 29 29 0a  "</OPTGROUP>")).
2340: 09 09 28 6c 6f 6f 70 20 28 63 61 72 20 74 61 6c  ..(loop (car tal
2350: 29 28 63 64 72 20 74 61 6c 29 20 6e 65 77 29 29  )(cdr tal) new))
2360: 29 29 29 29 29 0a 20 20 20 20 0a 3b 3b 20 69 74  ))))).    .;; it
2370: 65 6d 73 20 69 73 20 61 20 68 69 65 72 61 72 63  ems is a hierarc
2380: 68 69 61 6c 20 61 6c 69 73 74 0a 3b 3b 20 28 20  hial alist.;; ( 
2390: 28 6c 61 62 65 6c 31 20 76 61 6c 75 65 31 20 64  (label1 value1 d
23a0: 69 73 70 76 61 6c 31 20 23 74 29 20 3b 3b 20 3c  ispval1 #t) ;; <
23b0: 3d 3d 20 74 68 69 73 20 6f 6e 65 20 69 73 20 73  == this one is s
23c0: 65 6c 65 63 74 65 64 0a 3b 3b 20 20 20 28 6c 61  elected.;;   (la
23d0: 62 65 6c 32 20 28 6c 61 62 65 6c 33 20 76 61 6c  bel2 (label3 val
23e0: 75 65 32 20 64 69 73 70 76 61 6c 32 29 0a 3b 3b  ue2 dispval2).;;
23f0: 20 20 20 20 20 20 20 20 20 20 20 28 6c 61 62 65             (labe
2400: 6c 34 20 76 61 6c 75 65 33 20 64 69 73 70 76 61  l4 value3 dispva
2410: 6c 33 29 29 29 0a 3b 3b 20 20 20 20 20 0a 3b 3b  l3))).;;     .;;
2420: 20 20 72 65 71 75 69 72 65 64 20 61 72 67 20 69    required arg i
2430: 73 20 27 6e 61 6d 65 0a 28 64 65 66 69 6e 65 20  s 'name.(define 
2440: 28 73 3a 73 65 6c 65 63 74 20 69 74 65 6d 73 20  (s:select items 
2450: 2e 20 61 72 67 73 29 0a 20 20 28 69 66 20 28 6e  . args).  (if (n
2460: 75 6c 6c 3f 20 69 74 65 6d 73 29 0a 20 20 20 20  ull? items).    
2470: 20 20 28 73 3a 63 6f 6d 6d 6f 6e 2d 74 61 67 20    (s:common-tag 
2480: 22 53 45 4c 45 43 54 22 20 61 72 67 73 29 0a 20  "SELECT" args). 
2490: 20 20 20 20 20 28 6c 65 74 20 6c 6f 6f 70 20 28       (let loop (
24a0: 28 68 65 64 20 28 63 61 72 20 69 74 65 6d 73 29  (hed (car items)
24b0: 29 0a 09 09 20 28 74 61 6c 20 28 63 64 72 20 69  )... (tal (cdr i
24c0: 74 65 6d 73 29 29 0a 09 09 20 28 72 65 73 20 27  tems))... (res '
24d0: 28 29 29 29 0a 09 3b 3b 20 28 70 72 69 6e 74 20  ()))..;; (print 
24e0: 22 68 65 64 3a 20 22 20 68 65 64 20 22 20 74 61  "hed: " hed " ta
24f0: 6c 3a 20 22 20 74 61 6c 20 22 20 72 65 73 3a 20  l: " tal " res: 
2500: 22 20 72 65 73 29 0a 09 28 6c 65 74 20 28 28 6e  " res)..(let ((n
2510: 65 77 20 28 61 70 70 65 6e 64 20 72 65 73 20 28  ew (append res (
2520: 6c 69 73 74 20 28 69 66 20 28 61 6e 64 20 28 3e  list (if (and (>
2530: 20 28 6c 65 6e 67 74 68 20 68 65 64 29 20 31 29   (length hed) 1)
2540: 0a 09 09 09 09 09 20 20 20 20 20 20 28 6c 69 73  ......      (lis
2550: 74 3f 20 28 63 61 64 72 20 68 65 64 29 29 29 0a  t? (cadr hed))).
2560: 09 09 09 09 09 20 28 73 3a 6f 70 74 67 72 6f 75  ..... (s:optgrou
2570: 70 20 68 65 64 29 0a 09 09 09 09 09 20 28 73 3a  p hed)...... (s:
2580: 6f 70 74 69 6f 6e 20 68 65 64 29 29 29 29 29 29  option hed))))))
2590: 0a 09 20 20 28 69 66 20 28 6e 75 6c 6c 3f 20 74  ..  (if (null? t
25a0: 61 6c 29 0a 09 20 20 20 20 20 20 28 73 3a 63 6f  al)..      (s:co
25b0: 6d 6d 6f 6e 2d 74 61 67 20 22 53 45 4c 45 43 54  mmon-tag "SELECT
25c0: 22 20 28 63 6f 6e 73 20 6e 65 77 20 61 72 67 73  " (cons new args
25d0: 29 29 0a 09 20 20 20 20 20 20 28 6c 6f 6f 70 20  ))..      (loop 
25e0: 28 63 61 72 20 74 61 6c 29 28 63 64 72 20 74 61  (car tal)(cdr ta
25f0: 6c 29 20 6e 65 77 29 29 29 29 29 29 0a 0a 28 64  l) new))))))..(d
2600: 65 66 69 6e 65 20 28 73 3a 63 6f 6c 6f 72 20 20  efine (s:color  
2610: 2e 20 61 72 67 73 29 0a 20 20 22 23 30 30 66 66  . args).  "#00ff
2620: 30 30 22 29 0a 0a 28 64 65 66 69 6e 65 20 28 73  00")..(define (s
2630: 3a 70 72 69 6e 74 20 69 6e 64 65 6e 74 20 69 6e  :print indent in
2640: 6c 73 74 29 0a 20 20 28 6d 61 70 20 28 6c 61 6d  lst).  (map (lam
2650: 62 64 61 20 28 78 29 0a 20 20 20 20 20 20 20 20  bda (x).        
2660: 20 28 63 6f 6e 64 20 0a 20 20 20 20 20 20 20 20   (cond .        
2670: 20 20 28 28 6f 72 20 28 73 74 72 69 6e 67 3f 20    ((or (string? 
2680: 78 29 28 73 79 6d 62 6f 6c 3f 20 78 29 29 0a 20  x)(symbol? x)). 
2690: 20 20 20 20 20 20 20 20 20 20 28 70 72 69 6e 74            (print
26a0: 20 28 63 6f 6e 63 20 28 6d 61 6b 65 2d 73 74 72   (conc (make-str
26b0: 69 6e 67 20 28 2a 20 69 6e 64 65 6e 74 20 32 29  ing (* indent 2)
26c0: 20 23 5c 20 29 20 28 61 6e 79 2d 3e 73 74 72 69   #\ ) (any->stri
26d0: 6e 67 20 78 29 29 29 29 0a 20 20 20 20 20 20 20  ng x)))).       
26e0: 20 20 20 28 28 6c 69 73 74 3f 20 78 29 0a 20 20     ((list? x).  
26f0: 20 20 20 20 20 20 20 20 20 28 73 3a 70 72 69 6e           (s:prin
2700: 74 20 28 2b 20 69 6e 64 65 6e 74 20 31 29 20 78  t (+ indent 1) x
2710: 29 29 0a 20 20 20 20 20 20 20 20 20 20 28 65 6c  )).          (el
2720: 73 65 0a 20 20 20 20 20 20 20 20 20 20 20 3b 3b  se.           ;;
2730: 20 28 70 72 69 6e 74 20 22 45 52 52 4f 52 3a 20   (print "ERROR: 
2740: 42 61 64 20 69 6e 70 75 74 20 30 31 22 29 20 3b  Bad input 01") ;
2750: 3b 20 77 68 79 20 64 6f 20 61 6e 79 74 68 69 6e  ; why do anythin
2760: 67 20 77 69 74 68 20 6a 75 6e 6b 3f 0a 20 20 20  g with junk?.   
2770: 20 20 20 20 20 20 20 20 29 29 29 0a 20 20 20 20          ))).    
2780: 20 20 20 69 6e 6c 73 74 29 29 0a 0a 3b 3b 20 4d     inlst))..;; M
2790: 6f 76 65 64 20 74 6f 20 6d 69 73 63 2d 73 74 6d  oved to misc-stm
27a0: 6c 0a 3b 3b 0a 23 3b 28 64 65 66 69 6e 65 20 28  l.;;.#;(define (
27b0: 73 3a 63 67 69 2d 6f 75 74 20 69 6e 6c 73 74 29  s:cgi-out inlst)
27c0: 0a 20 20 28 73 3a 6f 75 74 70 75 74 20 28 63 75  .  (s:output (cu
27d0: 72 72 65 6e 74 2d 6f 75 74 70 75 74 2d 70 6f 72  rrent-output-por
27e0: 74 29 20 69 6e 6c 73 74 29 29 0a 0a 23 3b 28 64  t) inlst))..#;(d
27f0: 65 66 69 6e 65 20 28 73 3a 6f 75 74 70 75 74 20  efine (s:output 
2800: 70 6f 72 74 20 69 6e 6c 73 74 29 0a 20 20 28 6d  port inlst).  (m
2810: 61 70 20 28 6c 61 6d 62 64 61 20 28 78 29 0a 09  ap (lambda (x)..
2820: 20 28 63 6f 6e 64 20 0a 09 20 20 28 28 73 74 72   (cond ..  ((str
2830: 69 6e 67 3f 20 78 29 20 28 70 72 69 6e 74 20 78  ing? x) (print x
2840: 29 29 20 3b 3b 20 28 70 72 69 6e 74 20 78 29 29  )) ;; (print x))
2850: 0a 09 20 20 28 28 73 79 6d 62 6f 6c 3f 20 78 29  ..  ((symbol? x)
2860: 20 28 70 72 69 6e 74 20 78 29 29 20 3b 3b 20 28   (print x)) ;; (
2870: 70 72 69 6e 74 20 78 29 29 0a 09 20 20 28 28 6c  print x))..  ((l
2880: 69 73 74 3f 20 78 29 20 20 20 28 73 3a 6f 75 74  ist? x)   (s:out
2890: 70 75 74 20 70 6f 72 74 20 78 29 29 0a 09 20 20  put port x))..  
28a0: 28 65 6c 73 65 20 22 22 0a 09 20 20 20 3b 3b 20  (else ""..   ;; 
28b0: 28 70 72 69 6e 74 20 22 45 52 52 4f 52 3a 20 42  (print "ERROR: B
28c0: 61 64 20 69 6e 70 75 74 20 30 32 22 29 20 3b 3b  ad input 02") ;;
28d0: 20 77 68 79 20 64 6f 20 61 6e 79 74 68 69 6e 67   why do anything
28e0: 3f 20 64 6f 6e 27 74 20 6f 75 74 70 75 74 20 6a  ? don't output j
28f0: 75 6e 6b 2e 0a 09 20 20 20 29 29 29 0a 20 20 20  unk...   ))).   
2900: 20 20 20 20 69 6e 6c 73 74 29 29 0a 3b 20 20 28      inlst)).;  (
2910: 69 66 20 28 3e 20 28 6c 65 6e 67 74 68 20 69 6e  if (> (length in
2920: 6c 73 74 29 20 32 29 0a 3b 20 20 20 20 20 20 28  lst) 2).;      (
2930: 70 72 69 6e 74 29 29 29 0a 0a 23 3b 28 64 65 66  print)))..#;(def
2940: 69 6e 65 20 28 73 3a 6f 75 74 70 75 74 2d 6e 65  ine (s:output-ne
2950: 77 20 70 6f 72 74 20 69 6e 6c 73 74 29 0a 20 20  w port inlst).  
2960: 28 77 69 74 68 2d 6f 75 74 70 75 74 2d 74 6f 2d  (with-output-to-
2970: 70 6f 72 74 20 70 6f 72 74 0a 20 20 20 20 20 20  port port.      
2980: 28 6c 61 6d 62 64 61 20 28 29 0a 09 28 6d 61 70  (lambda ()..(map
2990: 20 28 6c 61 6d 62 64 61 20 28 78 29 0a 09 20 20   (lambda (x)..  
29a0: 20 20 20 20 20 28 63 6f 6e 64 20 0a 09 09 28 28       (cond ...((
29b0: 73 74 72 69 6e 67 3f 20 78 29 20 28 70 72 69 6e  string? x) (prin
29c0: 74 20 78 29 29 0a 09 09 28 28 73 79 6d 62 6f 6c  t x))...((symbol
29d0: 3f 20 78 29 20 28 70 72 69 6e 74 20 78 29 29 0a  ? x) (print x)).
29e0: 09 09 28 28 6c 69 73 74 3f 20 78 29 20 20 20 28  ..((list? x)   (
29f0: 73 3a 6f 75 74 70 75 74 20 70 6f 72 74 20 78 29  s:output port x)
2a00: 29 0a 09 09 28 65 6c 73 65 0a 09 09 20 3b 3b 20  )...(else... ;; 
2a10: 28 70 72 69 6e 74 20 22 45 52 52 4f 52 3a 20 42  (print "ERROR: B
2a20: 61 64 20 69 6e 70 75 74 20 30 33 22 29 0a 20 20  ad input 03").  
2a30: 20 20 20 29 29 29 0a 09 20 20 20 20 20 69 6e 6c     )))..     inl
2a40: 73 74 29 29 29 29 0a 20 20 20 20 20 20 20 20 20  st)))).         
2a50: 20 20 0a 0a 29 0a                                  ..).