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