1*12065Sbaden (setq SCCS-fpMain.l "@(#)fpMain.l 1.1 04/27/83") 2*12065Sbaden ; FP interpreter/compiler 3*12065Sbaden ; Copyright (c) 1982 Scott B. Baden 4*12065Sbaden ; Berkeley, California 5*12065Sbaden 6*12065Sbaden ; Main routine to start up FP 7*12065Sbaden 8*12065Sbaden (include specials.l) 9*12065Sbaden (declare (special arg parse_tree) 10*12065Sbaden (localf syntaxErr synErrMsg last_cr p_indic display rtime doExit) 11*12065Sbaden ) 12*12065Sbaden 13*12065Sbaden ; may ask for debug output, 14*12065Sbaden ; specifiy character set, only ASCII (asc) supported at this time. 15*12065Sbaden ; exit to shell if invoked from it. 16*12065Sbaden 17*12065Sbaden (defun fpMain (debug from_shell) 18*12065Sbaden 19*12065Sbaden (do ((arg nil) 20*12065Sbaden (parse_tree (*catch '(parse$err end_condit end_while) (parse 'top_lev)) 21*12065Sbaden (*catch '(parse$err end_condit end_while) (parse 'top_lev)))) 22*12065Sbaden 23*12065Sbaden ; exit if an EOF has been entered from the terminal 24*12065Sbaden ; (and it was the only character entered on the line) 25*12065Sbaden 26*12065Sbaden ((and (eq parse_tree 'eof$$) (null infile)) 27*12065Sbaden (terpri) 28*12065Sbaden (doExit from_shell)) ; in any case exit 29*12065Sbaden 30*12065Sbaden ; if the EOF was from a file close it and then accept 31*12065Sbaden ; input from terminal again 32*12065Sbaden 33*12065Sbaden (cond 34*12065Sbaden ((not (eq parse_tree 'eof$$)) 35*12065Sbaden (cond (debug (print parse_tree) 36*12065Sbaden (terpri))) 37*12065Sbaden (cond 38*12065Sbaden ((not (eq parse_tree 'cmd$$)) 39*12065Sbaden (cond 40*12065Sbaden ((not (listp parse_tree)) 41*12065Sbaden (let 42*12065Sbaden ((defn (put_fn fn_name parse_tree))) ; define the function 43*12065Sbaden (cond (in_def 44*12065Sbaden (patom "{") 45*12065Sbaden (patom (setq usr_fn_name 46*12065Sbaden (implode 47*12065Sbaden (nreverse (cdddr (nreverse (explode fn_name))))))) 48*12065Sbaden (patom "}") (terpri) 49*12065Sbaden (putprop 'sources in_buf usr_fn_name))) 50*12065Sbaden (cond ((and debug in_def) (pp fn_name)))) 51*12065Sbaden 52*12065Sbaden ; read in an FP sequence once a colon (apply) has been detected 53*12065Sbaden 54*12065Sbaden (cond ((not in_def) 55*12065Sbaden (cond ((and (null infile) ptport) 56*12065Sbaden (do 57*12065Sbaden ((c (tyipeek) (tyipeek))) 58*12065Sbaden ((or (null (memq c #.whiteSpace)))) 59*12065Sbaden (Tyi)))) 60*12065Sbaden (setq arg (*catch 'parse$err (get_obj nil))) 61*12065Sbaden 62*12065Sbaden (cond ((find 'err$$ arg) 63*12065Sbaden (syntaxErr)) 64*12065Sbaden ((undefp arg) 65*12065Sbaden (terpri) (patom '?) (terpri)) 66*12065Sbaden (t 67*12065Sbaden (let ((sPlist 68*12065Sbaden (If DynTraceFlg then 69*12065Sbaden (copy (plist 'Measures)) else nil)) 70*12065Sbaden (wcTime1 (syscall 13)) 71*12065Sbaden (time1 (ptime)) 72*12065Sbaden (rslt (*catch 'bottom$up (funcall fn_name arg))) 73*12065Sbaden (time2 (ptime)) 74*12065Sbaden (wcTime2 (syscall 13))) 75*12065Sbaden 76*12065Sbaden (fpPP rslt) 77*12065Sbaden 78*12065Sbaden (If (and DynTraceFlg (undefp rslt)) then (setplist 'Measures sPlist)) 79*12065Sbaden (cond (timeIt 80*12065Sbaden (let ((gcTime (diff (cadr time2) (cadr time1)))) 81*12065Sbaden (msg N "cpu + gc [wc] = ") 82*12065Sbaden (rtime (diff (diff (car time2) (car time1)) gcTime) 60.0) 83*12065Sbaden (patom " + ") 84*12065Sbaden (rtime gcTime 60.0) 85*12065Sbaden (patom " [") 86*12065Sbaden (rtime (diff wcTime2 wcTime1) 1.0) 87*12065Sbaden (msg "]")) 88*12065Sbaden (msg (N 2)))))))))) 89*12065Sbaden 90*12065Sbaden (t (syntaxErr) )))))) 91*12065Sbaden 92*12065Sbaden 93*12065Sbaden (cond (in_def (setq fn_name 'tmp$$))) 94*12065Sbaden 95*12065Sbaden (cond ((and infile (eq parse_tree 'eof$$)) 96*12065Sbaden (patom " ") (close infile) (setq infile nil)) 97*12065Sbaden 98*12065Sbaden (t (cond ((and (null infile) (not (eq parse_tree 'eof$$))) 99*12065Sbaden (patom " "))))) 100*12065Sbaden 101*12065Sbaden (setq level 0) 102*12065Sbaden (setq in_buf nil) 103*12065Sbaden (setq in_def nil))) 104*12065Sbaden 105*12065Sbaden 106*12065Sbaden ; Display a LISP list as an equivalent FP sequence 107*12065Sbaden 108*12065Sbaden (defun display (obj) 109*12065Sbaden (cond ((null obj) (patom "<>")) 110*12065Sbaden ((atom obj) (patom obj)) 111*12065Sbaden ((listp obj) 112*12065Sbaden (patom "<") 113*12065Sbaden (maplist 114*12065Sbaden '(lambda (x) 115*12065Sbaden (display (car x)) 116*12065Sbaden (cond ((not (onep (length x))) (patom " ")))) obj) 117*12065Sbaden (patom ">")))) 118*12065Sbaden 119*12065Sbaden ; Form a character string of a LISP list as an equivalent FP sequence 120*12065Sbaden 121*12065Sbaden (defun put_obj (obj) 122*12065Sbaden (cond ((null obj) "<>") 123*12065Sbaden ((atom obj) obj) 124*12065Sbaden ((listp obj) 125*12065Sbaden (cond ((onep (length obj)) 126*12065Sbaden (concat "<" (put_obj (car obj)) ">")) 127*12065Sbaden (t (do 128*12065Sbaden ((xx obj (cdr xx)) 129*12065Sbaden (zz t nil) 130*12065Sbaden (yy "<")) 131*12065Sbaden ((zerop (length xx)) (concat yy ">")) 132*12065Sbaden (cond ((not zz) (setq yy (concat yy " ")))) 133*12065Sbaden (setq yy (concat yy (put_obj (car xx)))))))))) 134*12065Sbaden 135*12065Sbaden 136*12065Sbaden 137*12065Sbaden (defun rtime (time scale) 138*12065Sbaden (patom (quotient (float (fix (product 100 (quotient time scale)))) 139*12065Sbaden 100.0))) 140*12065Sbaden 141*12065Sbaden (defun doExit (exitCond) 142*12065Sbaden (cond (exitCond 143*12065Sbaden (dontLoseStats) 144*12065Sbaden (and (portp 'traceport) (close traceport)) ; if traceport is open 145*12065Sbaden (and ptport (close ptport)) ; if script port is open 146*12065Sbaden (exit)))) 147*12065Sbaden 148*12065Sbaden 149*12065Sbaden (defun syntaxErr nil 150*12065Sbaden (let ((piport infile) 151*12065Sbaden (tbuf (ncons nil))) 152*12065Sbaden (cond ((and in_def (eq #/} (car in_buf))) 153*12065Sbaden (do ((c (Tyi) (Tyi))) 154*12065Sbaden ((memq c '(-1 #.CR)))) 155*12065Sbaden (synErrMsg) 156*12065Sbaden (p_indic) 157*12065Sbaden ) 158*12065Sbaden 159*12065Sbaden (t (cond (in_def 160*12065Sbaden (cond ((and 161*12065Sbaden (eq #.CR 162*12065Sbaden (do ((c (tyipeek) (tyipeek)) 163*12065Sbaden (e nil)) 164*12065Sbaden ((memq c '(-1 #/} #.CR)) 165*12065Sbaden (If (eq c #/}) then 166*12065Sbaden (progn 167*12065Sbaden (tconc tbuf c) 168*12065Sbaden (setq e (Tyi))) 169*12065Sbaden 170*12065Sbaden else 171*12065Sbaden 172*12065Sbaden (If (eq c #.CR) then 173*12065Sbaden (setq e (Tyi)))) 174*12065Sbaden 175*12065Sbaden (synErrMsg) 176*12065Sbaden (mapcar 'p_strng (car tbuf)) 177*12065Sbaden (p_indic) 178*12065Sbaden e) 179*12065Sbaden (tconc tbuf (Tyi)))) 180*12065Sbaden infile) 181*12065Sbaden 182*12065Sbaden (do ((c (tyipeek) (tyipeek)) 183*12065Sbaden (tbuf (ncons nil))) 184*12065Sbaden ((memq c '(-1 #/})) 185*12065Sbaden (If (eq c #/}) 186*12065Sbaden then (tconc tbuf (Tyi))) 187*12065Sbaden (mapcar 'p_strng (car tbuf)) 188*12065Sbaden (terpri) 189*12065Sbaden (If (eq c #/}) then 190*12065Sbaden (do ((c (Tyi) (Tyi))) 191*12065Sbaden ((memq c '(-1 #.CR))))) 192*12065Sbaden ) 193*12065Sbaden 194*12065Sbaden (tconc tbuf (Tyi)))))) 195*12065Sbaden 196*12065Sbaden (t 197*12065Sbaden (do ((c (tyipeek) (tyipeek))) 198*12065Sbaden ((memq c '(-1 #.CR)) 199*12065Sbaden (Tyi) 200*12065Sbaden (synErrMsg) 201*12065Sbaden (mapcar 'p_strng (car tbuf)) 202*12065Sbaden (p_indic)) 203*12065Sbaden (tconc tbuf (Tyi))))))) 204*12065Sbaden )) 205*12065Sbaden 206*12065Sbaden (defun synErrMsg nil 207*12065Sbaden (msg N "Syntax Error:" 208*12065Sbaden (N 2)) 209*12065Sbaden (mapcar 'p_strng (reverse in_buf))) 210*12065Sbaden 211*12065Sbaden 212*12065Sbaden (defun p_indic nil 213*12065Sbaden (msg N (B (length (cdr (last_cr (reverse in_buf))))) "^" N) 214*12065Sbaden (If (null infile) then (terpr))) 215*12065Sbaden 216*12065Sbaden (defun last_cr (zy) 217*12065Sbaden (cond ((null (memq #.CR zy)) zy) (t (last_cr (cdr (memq #.CR zy)))))) 218*12065Sbaden 219*12065Sbaden ; throw bottom to the next level 220*12065Sbaden ; This shortens the compiled code 221*12065Sbaden 222*12065Sbaden (defun bottom nil 223*12065Sbaden (*throw 'bottom$up '?)) 224