;;; -*- Mode:LISP; Package:SI; Cold-Load:T; Base:8; Readtable:ZL -*-

(DEFUN GRIND-PRINT-CIRCULAR-OBJECT (EXP)
  (AND *PRINT-HASH-TABLE*			;*print-circle* in effect...
       (IF (SYMBOLP EXP)			;this object is a candidate for circularity
	   (NULL (SYMBOL-PACKAGE EXP))
	 (%POINTERP EXP))
       (CATCH 'LABEL-PRINTED
	 (SEND *PRINT-HASH-TABLE* :MODIFY-HASH EXP
	       #'(LAMBDA (KEY VALUE KEY-FOUND-P)
		   (DECLARE (IGNORE KEY KEY-FOUND-P)
			    (SYS:DOWNWARD-FUNCTION))
		   (COND ((NULL VALUE)
			  ;; this object hasn't been seen
			  NIL)
			 ((EQ VALUE T)
			  ;; this object has been seen but not printed
			  (LET ((LABEL (INCF *PRINT-LABEL-NUMBER*)))
			    (GTYO #/#)
			    (LET ((*PRINT-BASE* 10.))
			      (GRIND-ATOM LABEL GRIND-IO (LOCF LABEL)))
			    (GTYO #/=)
			    LABEL))
			 (T
			  ;; this object has been seen and printed before
			  (GTYO #/#)
			  (LET ((*PRINT-BASE* 10.))
			    (GRIND-ATOM VALUE GRIND-IO (LOCF VALUE)))
			  (GTYO #/#)
			  (THROW 'LABEL-PRINTED T)))))
	 NIL)))

(DEFUN GRIND-REST-OF-LIST (TAIL LOC FORM)
  (GIND (DO ((X TAIL (CDR X))
	     (COUNT 0 (1+ COUNT))
	     (LOC LOC (LOCF (CDR X))))
	    (())
	  (COND ((or (ATOM X)
		     (and *print-hash-table*
			  (send *print-hash-table* :get-hash x)))
		 (RETURN (GRIND-DOTTED-CDR X LOC)))
		((EQ COUNT PRINLENGTH)
		 (FUNCALL FORM (PTTBL-PRINLENGTH *READTABLE*) LOC)
		 (GTYO-CLOSE T)
		 (RETURN T))
		((ATOM (CDR X))
		 (LET ((GRIND-WIDTH (1- GRIND-WIDTH)))	;last form needs room for right paren
		   (FUNCALL FORM (CAR X) (LOCF (CAR X))))
		 (RETURN (GRIND-DOTTED-CDR (CDR X) (LOCF (CDR X))))))
	  (FUNCALL FORM (CAR X) (LOCF (CAR X)))
	  (GRIND-TERPRI))))			;not last form, terpri before next

(DEFUN GRIND-LINEAR-TAIL (EXP LOC)
  (GTYO-OPEN LOC)				;Do linear list
  (DO ((X EXP (CDR X))
       (LOC1 LOC (LOCF (CDR X)))
       (first t nil))
      ((or (ATOM X)
	   (and *print-hash-table*
		(not first)
		(send *print-hash-table* :get-hash x)))
       (when (NOT (NULL X))
	 (GSTRING (PTTBL-CONS-DOT *READTABLE*))
	 (GIND (GRIND-LINEAR-FORM X LOC1)))
       (GTYO-CLOSE T))
    (or first (gtyo-space))
    (GIND (GRIND-LINEAR-FORM (CAR X) (LOCF (CAR X))))))
