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