1*15193Sbaden (setq SCCS-fpMain.l "@(#)fpMain.l 1.2 10/08/83") 212065Sbaden ; FP interpreter/compiler 312065Sbaden ; Copyright (c) 1982 Scott B. Baden 412065Sbaden ; Berkeley, California 512065Sbaden 612065Sbaden ; Main routine to start up FP 712065Sbaden 812065Sbaden (include specials.l) 912065Sbaden (declare (special arg parse_tree) 1012065Sbaden (localf syntaxErr synErrMsg last_cr p_indic display rtime doExit) 1112065Sbaden ) 1212065Sbaden 1312065Sbaden ; may ask for debug output, 1412065Sbaden ; specifiy character set, only ASCII (asc) supported at this time. 1512065Sbaden ; exit to shell if invoked from it. 1612065Sbaden 1712065Sbaden (defun fpMain (debug from_shell) 1812065Sbaden 1912065Sbaden (do ((arg nil) 2012065Sbaden (parse_tree (*catch '(parse$err end_condit end_while) (parse 'top_lev)) 2112065Sbaden (*catch '(parse$err end_condit end_while) (parse 'top_lev)))) 2212065Sbaden 2312065Sbaden ; exit if an EOF has been entered from the terminal 2412065Sbaden ; (and it was the only character entered on the line) 2512065Sbaden 2612065Sbaden ((and (eq parse_tree 'eof$$) (null infile)) 2712065Sbaden (terpri) 2812065Sbaden (doExit from_shell)) ; in any case exit 2912065Sbaden 3012065Sbaden ; if the EOF was from a file close it and then accept 3112065Sbaden ; input from terminal again 3212065Sbaden 3312065Sbaden (cond 3412065Sbaden ((not (eq parse_tree 'eof$$)) 3512065Sbaden (cond (debug (print parse_tree) 3612065Sbaden (terpri))) 3712065Sbaden (cond 3812065Sbaden ((not (eq parse_tree 'cmd$$)) 3912065Sbaden (cond 4012065Sbaden ((not (listp parse_tree)) 4112065Sbaden (let 4212065Sbaden ((defn (put_fn fn_name parse_tree))) ; define the function 4312065Sbaden (cond (in_def 4412065Sbaden (patom "{") 4512065Sbaden (patom (setq usr_fn_name 4612065Sbaden (implode 4712065Sbaden (nreverse (cdddr (nreverse (explode fn_name))))))) 4812065Sbaden (patom "}") (terpri) 4912065Sbaden (putprop 'sources in_buf usr_fn_name))) 5012065Sbaden (cond ((and debug in_def) (pp fn_name)))) 5112065Sbaden 5212065Sbaden ; read in an FP sequence once a colon (apply) has been detected 5312065Sbaden 5412065Sbaden (cond ((not in_def) 5512065Sbaden (cond ((and (null infile) ptport) 5612065Sbaden (do 5712065Sbaden ((c (tyipeek) (tyipeek))) 5812065Sbaden ((or (null (memq c #.whiteSpace)))) 5912065Sbaden (Tyi)))) 6012065Sbaden (setq arg (*catch 'parse$err (get_obj nil))) 6112065Sbaden 6212065Sbaden (cond ((find 'err$$ arg) 6312065Sbaden (syntaxErr)) 6412065Sbaden ((undefp arg) 6512065Sbaden (terpri) (patom '?) (terpri)) 6612065Sbaden (t 6712065Sbaden (let ((sPlist 6812065Sbaden (If DynTraceFlg then 6912065Sbaden (copy (plist 'Measures)) else nil)) 70*15193Sbaden (wcTime1 (sys:time)) 7112065Sbaden (time1 (ptime)) 7212065Sbaden (rslt (*catch 'bottom$up (funcall fn_name arg))) 7312065Sbaden (time2 (ptime)) 74*15193Sbaden (wcTime2 (sys:time))) 7512065Sbaden 7612065Sbaden (fpPP rslt) 7712065Sbaden 7812065Sbaden (If (and DynTraceFlg (undefp rslt)) then (setplist 'Measures sPlist)) 7912065Sbaden (cond (timeIt 8012065Sbaden (let ((gcTime (diff (cadr time2) (cadr time1)))) 8112065Sbaden (msg N "cpu + gc [wc] = ") 8212065Sbaden (rtime (diff (diff (car time2) (car time1)) gcTime) 60.0) 8312065Sbaden (patom " + ") 8412065Sbaden (rtime gcTime 60.0) 8512065Sbaden (patom " [") 8612065Sbaden (rtime (diff wcTime2 wcTime1) 1.0) 8712065Sbaden (msg "]")) 8812065Sbaden (msg (N 2)))))))))) 8912065Sbaden 9012065Sbaden (t (syntaxErr) )))))) 9112065Sbaden 9212065Sbaden 9312065Sbaden (cond (in_def (setq fn_name 'tmp$$))) 9412065Sbaden 9512065Sbaden (cond ((and infile (eq parse_tree 'eof$$)) 9612065Sbaden (patom " ") (close infile) (setq infile nil)) 9712065Sbaden 9812065Sbaden (t (cond ((and (null infile) (not (eq parse_tree 'eof$$))) 9912065Sbaden (patom " "))))) 10012065Sbaden 10112065Sbaden (setq level 0) 10212065Sbaden (setq in_buf nil) 10312065Sbaden (setq in_def nil))) 10412065Sbaden 10512065Sbaden 10612065Sbaden ; Display a LISP list as an equivalent FP sequence 10712065Sbaden 10812065Sbaden (defun display (obj) 10912065Sbaden (cond ((null obj) (patom "<>")) 11012065Sbaden ((atom obj) (patom obj)) 11112065Sbaden ((listp obj) 11212065Sbaden (patom "<") 11312065Sbaden (maplist 11412065Sbaden '(lambda (x) 11512065Sbaden (display (car x)) 11612065Sbaden (cond ((not (onep (length x))) (patom " ")))) obj) 11712065Sbaden (patom ">")))) 11812065Sbaden 11912065Sbaden ; Form a character string of a LISP list as an equivalent FP sequence 12012065Sbaden 12112065Sbaden (defun put_obj (obj) 12212065Sbaden (cond ((null obj) "<>") 12312065Sbaden ((atom obj) obj) 12412065Sbaden ((listp obj) 12512065Sbaden (cond ((onep (length obj)) 12612065Sbaden (concat "<" (put_obj (car obj)) ">")) 12712065Sbaden (t (do 12812065Sbaden ((xx obj (cdr xx)) 12912065Sbaden (zz t nil) 13012065Sbaden (yy "<")) 13112065Sbaden ((zerop (length xx)) (concat yy ">")) 13212065Sbaden (cond ((not zz) (setq yy (concat yy " ")))) 13312065Sbaden (setq yy (concat yy (put_obj (car xx)))))))))) 13412065Sbaden 13512065Sbaden 13612065Sbaden 13712065Sbaden (defun rtime (time scale) 13812065Sbaden (patom (quotient (float (fix (product 100 (quotient time scale)))) 13912065Sbaden 100.0))) 14012065Sbaden 14112065Sbaden (defun doExit (exitCond) 14212065Sbaden (cond (exitCond 14312065Sbaden (dontLoseStats) 14412065Sbaden (and (portp 'traceport) (close traceport)) ; if traceport is open 14512065Sbaden (and ptport (close ptport)) ; if script port is open 14612065Sbaden (exit)))) 14712065Sbaden 14812065Sbaden 14912065Sbaden (defun syntaxErr nil 15012065Sbaden (let ((piport infile) 15112065Sbaden (tbuf (ncons nil))) 15212065Sbaden (cond ((and in_def (eq #/} (car in_buf))) 15312065Sbaden (do ((c (Tyi) (Tyi))) 15412065Sbaden ((memq c '(-1 #.CR)))) 15512065Sbaden (synErrMsg) 15612065Sbaden (p_indic) 15712065Sbaden ) 15812065Sbaden 15912065Sbaden (t (cond (in_def 16012065Sbaden (cond ((and 16112065Sbaden (eq #.CR 16212065Sbaden (do ((c (tyipeek) (tyipeek)) 16312065Sbaden (e nil)) 16412065Sbaden ((memq c '(-1 #/} #.CR)) 16512065Sbaden (If (eq c #/}) then 16612065Sbaden (progn 16712065Sbaden (tconc tbuf c) 16812065Sbaden (setq e (Tyi))) 16912065Sbaden 17012065Sbaden else 17112065Sbaden 17212065Sbaden (If (eq c #.CR) then 17312065Sbaden (setq e (Tyi)))) 17412065Sbaden 17512065Sbaden (synErrMsg) 17612065Sbaden (mapcar 'p_strng (car tbuf)) 17712065Sbaden (p_indic) 17812065Sbaden e) 17912065Sbaden (tconc tbuf (Tyi)))) 18012065Sbaden infile) 18112065Sbaden 18212065Sbaden (do ((c (tyipeek) (tyipeek)) 18312065Sbaden (tbuf (ncons nil))) 18412065Sbaden ((memq c '(-1 #/})) 18512065Sbaden (If (eq c #/}) 18612065Sbaden then (tconc tbuf (Tyi))) 18712065Sbaden (mapcar 'p_strng (car tbuf)) 18812065Sbaden (terpri) 18912065Sbaden (If (eq c #/}) then 19012065Sbaden (do ((c (Tyi) (Tyi))) 19112065Sbaden ((memq c '(-1 #.CR))))) 19212065Sbaden ) 19312065Sbaden 19412065Sbaden (tconc tbuf (Tyi)))))) 19512065Sbaden 19612065Sbaden (t 19712065Sbaden (do ((c (tyipeek) (tyipeek))) 19812065Sbaden ((memq c '(-1 #.CR)) 19912065Sbaden (Tyi) 20012065Sbaden (synErrMsg) 20112065Sbaden (mapcar 'p_strng (car tbuf)) 20212065Sbaden (p_indic)) 20312065Sbaden (tconc tbuf (Tyi))))))) 20412065Sbaden )) 20512065Sbaden 20612065Sbaden (defun synErrMsg nil 20712065Sbaden (msg N "Syntax Error:" 20812065Sbaden (N 2)) 20912065Sbaden (mapcar 'p_strng (reverse in_buf))) 21012065Sbaden 21112065Sbaden 21212065Sbaden (defun p_indic nil 21312065Sbaden (msg N (B (length (cdr (last_cr (reverse in_buf))))) "^" N) 21412065Sbaden (If (null infile) then (terpr))) 21512065Sbaden 21612065Sbaden (defun last_cr (zy) 21712065Sbaden (cond ((null (memq #.CR zy)) zy) (t (last_cr (cdr (memq #.CR zy)))))) 21812065Sbaden 21912065Sbaden ; throw bottom to the next level 22012065Sbaden ; This shortens the compiled code 22112065Sbaden 22212065Sbaden (defun bottom nil 22312065Sbaden (*throw 'bottom$up '?)) 224