xref: /csrg-svn/old/lisp/fp/fp.vax/fpPP.l (revision 21728)
112067Sbaden ;  FP interpreter/compiler
212067Sbaden ;  Copyright (c) 1982  Scott B. Baden
312067Sbaden ;  Berkeley, California
4*21728Sdist ;
5*21728Sdist ;  Copyright (c) 1982 Regents of the University of California.
6*21728Sdist ;  All rights reserved.  The Berkeley software License Agreement
7*21728Sdist ;  specifies the terms and conditions for redistribution.
8*21728Sdist ;
9*21728Sdist (setq SCCS-fpPP.l "@(#)fpPP.l	5.1 (Berkeley) 05/31/85")
10*21728Sdist 
1112067Sbaden ;; pretty printer for fp -- snarfed from FRANZ LISP
1212067Sbaden 
1312067Sbaden (include specials.l)
1412067Sbaden 
1512067Sbaden (declare (special fpPParm1 fpPParm2 lAngle rAngle))
1612067Sbaden 
1712067Sbaden ; printRet is like print yet it returns the value printed,
1812067Sbaden ; this is used by fpPP.
1912067Sbaden 
2012067Sbaden (def printRet
2112067Sbaden   (macro ($l$)
2212067Sbaden 	 `(progn
2312067Sbaden 	   (let ((z ,@(cdr $l$)))
2412067Sbaden 		(cond ((null z) (patom "<>"))
2512067Sbaden 		      (t
2612067Sbaden 		       (print ,@(cdr $l$))))))))
2712067Sbaden 
2812067Sbaden 
2912067Sbaden (def fpPP
3012067Sbaden   (lambda (x)
3112067Sbaden 	  (terpri)
3212067Sbaden 	  (prDF x 0 0)
3312067Sbaden 	  (terpri)))
3412067Sbaden 
3512067Sbaden 
3612067Sbaden (setq fpPParm1 50 fpPParm2 100)
3712067Sbaden 
3812067Sbaden ;   -DNC These "prettyprinter parameters" are used to decide when we should
3912067Sbaden ;	quit printing down the right margin and move back to the left -
4012067Sbaden ;	Do it when the leftmargin > fpPParm1 and there are more than fpPParm2
4112067Sbaden ;	more chars to print in the expression
4212067Sbaden 
4312067Sbaden 
4412067Sbaden 
4512067Sbaden (declare (special rmar))
4612067Sbaden 
4712067Sbaden (def prDF
4812067Sbaden   (lambda (l lmar rmar)
4912067Sbaden     (prog nil
5012067Sbaden ;
5112067Sbaden ;			- DNC - Here we try to fix the tendency to print a
5212067Sbaden ;			  thin column down the right margin by allowing it
5312067Sbaden ;			  to move back to the left if necessary.
5412067Sbaden ;
5512067Sbaden 	  (cond ((and (>& lmar fpPParm1) (>& (flatc l (1+ fpPParm2)) fpPParm2))
5612067Sbaden 		 (terpri)
5712067Sbaden 		 (patom "; <<<<< start back on the left <<<<<")
5812067Sbaden 		 (prDF l 5 0)
5912067Sbaden 		 (terpri)
6012067Sbaden 		 (patom "; >>>>> continue on the right >>>>>")
6112067Sbaden 		 (terpri)
6212067Sbaden 		 (return nil)))
6312067Sbaden           (tab lmar)
6412067Sbaden      a    (cond
6512067Sbaden                 ((or (not (dtpr l))
6612067Sbaden ;                    (*** at the moment we just punt hunks etc)
6712067Sbaden                      ;(and (atom (car l)) (atom (cdr l)))
6812067Sbaden 		     )
6912067Sbaden                  (return (printRet l)))
7012067Sbaden                 ((<& (+ rmar (flatc l (charcnt poport)))
7112067Sbaden 		    (charcnt poport))
7212067Sbaden 		 ;
7312067Sbaden 		 ;	This is just a heuristic - if print can fit it in then figure that
7412067Sbaden ;	the printmacros won't hurt.  Note that despite the pretentions there
7512067Sbaden ;	is no guarantee that everything will fit in before rmar - for example
7612067Sbaden ;	atoms (and now even hunks) are just blindly printed.	- DNC
7712067Sbaden ;
7812067Sbaden                  (printAccross l lmar rmar))
7912067Sbaden                 ((and ($patom1 lAngle)
8012067Sbaden                       (atom (car l))
8112067Sbaden                       (not (atom (cdr l)))
8212067Sbaden                       (not (atom (cddr l))))
8312067Sbaden                  (prog (c)
8412067Sbaden                        (printRet (car l))
8512067Sbaden                        ($patom1 '" ")
8612067Sbaden                        (setq c (nwritn))
8712067Sbaden                   a    (prD1 (cdr l) c)
8812067Sbaden                        (cond
8912067Sbaden                         ((not (atom (cdr (setq l (cdr l)))))
9012067Sbaden                          (terpri)
9112067Sbaden                          (go a)))))
9212067Sbaden                 (t
9312067Sbaden                  (prog (c)
9412067Sbaden                        (setq c (nwritn))
9512067Sbaden                   a    (prD1 l c)
9612067Sbaden                        (cond
9712067Sbaden                         ((not (atom (setq l (cdr l))))
9812067Sbaden                          (terpri)
9912067Sbaden                          (go a))))))
10012067Sbaden      b    ($patom1 rAngle))))
10112067Sbaden 
10212067Sbaden 
10312067Sbaden (def prD1
10412067Sbaden   (lambda (l n)
10512067Sbaden     (prog nil
10612067Sbaden           (prDF (car l)
10712067Sbaden                  n
10812067Sbaden                  (cond ((null (setq l (cdr l))) (|1+| rmar))
10912067Sbaden                        ((atom l) (setq n nil) (plus 4 rmar (pntlen l)))
11012067Sbaden                        (t rmar)))
11112067Sbaden 
11212067Sbaden ;         The last arg to prDF is the space needed for the suffix
11312067Sbaden ;	  Note that this is still not really right - if the prefix
11412067Sbaden ;		takes several lines one would like to use the old rmar
11512067Sbaden ;		until the last line where the " . mumble" goes.
11612067Sbaden 	)))
11712067Sbaden 
11812067Sbaden 
11912067Sbaden (def printAccross
12012067Sbaden   (lambda (l lmar rmar)
12112067Sbaden     (prog nil
12212067Sbaden ;     this is needed to make sure the printmacros are executed
12312067Sbaden           (princ '|<|)
12412067Sbaden      l:   (cond ((null l))
12512067Sbaden                 (t (prDF (car l) (nwritn) rmar)
12612067Sbaden                    (setq l (cdr l))
12712067Sbaden                    (cond (l (princ '| |)))
12812067Sbaden                    (go l:))))))
129