xref: /csrg-svn/old/lisp/fp/fp.vax/fpMain.l (revision 21726)
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