4.3BSD/usr/src/ucb/fp/fpPP.l

;  FP interpreter/compiler
;  Copyright (c) 1982  Scott B. Baden
;  Berkeley, California
;
;  Copyright (c) 1982 Regents of the University of California.
;  All rights reserved.  The Berkeley software License Agreement
;  specifies the terms and conditions for redistribution.
;
(setq SCCS-fpPP.l "@(#)fpPP.l	5.1 (Berkeley) 5/31/85")

;; pretty printer for fp -- snarfed from FRANZ LISP

(include specials.l)

(declare (special fpPParm1 fpPParm2 lAngle rAngle))

; printRet is like print yet it returns the value printed,
; this is used by fpPP.

(def printRet
  (macro ($l$)
	 `(progn 
	   (let ((z ,@(cdr $l$)))
		(cond ((null z) (patom "<>"))
		      (t
		       (print ,@(cdr $l$))))))))


(def fpPP
  (lambda (x)
	  (terpri)
	  (prDF x 0 0)
	  (terpri)))


(setq fpPParm1 50 fpPParm2 100)

;   -DNC These "prettyprinter parameters" are used to decide when we should
;	quit printing down the right margin and move back to the left -
;	Do it when the leftmargin > fpPParm1 and there are more than fpPParm2
;	more chars to print in the expression



(declare (special rmar))

(def prDF
  (lambda (l lmar rmar)
    (prog nil
;
;			- DNC - Here we try to fix the tendency to print a
;			  thin column down the right margin by allowing it
;			  to move back to the left if necessary.
;
	  (cond ((and (>& lmar fpPParm1) (>& (flatc l (1+ fpPParm2)) fpPParm2))
		 (terpri)
		 (patom "; <<<<< start back on the left <<<<<")
		 (prDF l 5 0)
		 (terpri)
		 (patom "; >>>>> continue on the right >>>>>")
		 (terpri)
		 (return nil)))
          (tab lmar)
     a    (cond 
                ((or (not (dtpr l))
;                    (*** at the moment we just punt hunks etc)
                     ;(and (atom (car l)) (atom (cdr l)))
		     )
                 (return (printRet l)))
                ((<& (+ rmar (flatc l (charcnt poport)))
		    (charcnt poport))
		 ;
		 ;	This is just a heuristic - if print can fit it in then figure that
;	the printmacros won't hurt.  Note that despite the pretentions there
;	is no guarantee that everything will fit in before rmar - for example
;	atoms (and now even hunks) are just blindly printed.	- DNC
;
                 (printAccross l lmar rmar))
                ((and ($patom1 lAngle)
                      (atom (car l))
                      (not (atom (cdr l)))
                      (not (atom (cddr l))))
                 (prog (c)
                       (printRet (car l))
                       ($patom1 '" ")
                       (setq c (nwritn))
                  a    (prD1 (cdr l) c)
                       (cond
                        ((not (atom (cdr (setq l (cdr l)))))
                         (terpri)
                         (go a)))))
                (t
                 (prog (c)
                       (setq c (nwritn))
                  a    (prD1 l c)
                       (cond
                        ((not (atom (setq l (cdr l))))
                         (terpri)
                         (go a))))))
     b    ($patom1 rAngle))))


(def prD1
  (lambda (l n)
    (prog nil
          (prDF (car l)
                 n
                 (cond ((null (setq l (cdr l))) (|1+| rmar))
                       ((atom l) (setq n nil) (plus 4 rmar (pntlen l)))
                       (t rmar)))

;         The last arg to prDF is the space needed for the suffix
;	  Note that this is still not really right - if the prefix
;		takes several lines one would like to use the old rmar 
;		until the last line where the " . mumble" goes.
	)))


(def printAccross
  (lambda (l lmar rmar)
    (prog nil
;     this is needed to make sure the printmacros are executed
          (princ '|<|)
     l:   (cond ((null l))
                (t (prDF (car l) (nwritn) rmar)
                   (setq l (cdr l))
                   (cond (l (princ '| |)))
                   (go l:))))))