#| -*- Mode:LISP; Package:COMPILER; Base:10; Fonts:(CPTFONTB) -*-

  Copyright LISP Machine, Inc. 1985,1986
   See filename "Copyright.Text" for
  licensing and release information.

*********************************************************
*********************************************************
*** NOTE: This is an EXAMPLE, not LMI supported code. ***
*** information contained in this example is subject  ***
*** to change without notice. The ways of doing       ***
*** the things contained in the example may change    ***
*** between system releases. Some techniques which    ***
*** are mere examples in one release may become built ***
*** in system features in the next release. Use good  ***
*** judgement when copying these techniques. Most     ***
*** examples have been motivated by specific customer ***
*** requests, and may not be the best engineered      ***
*** or most efficient solution for someone else.      ***
*********************************************************
*********************************************************

  This is how one might want to store lisp forms in an array for later
  putting in some database. for MCC sometime in 1985 -GJC

Example use:

(SETQ A (MAKE-ARRAY-FOR-DUMPING-EXAMPLE 100))

(DUMP-FORMS-TO-ARRAY A '((print "what a hack")))

(FASLOAD-FROM-ARRAY A)

|#

(DEFUN MAKE-STREAM-TO-ARRAY (ARRAY &AUX STREAM)
  (SETQ STREAM #'(LAMBDA (OP &OPTIONAL ARG1 &REST ARGS)
		   (SI:SELECTQ-WITH-WHICH-OPERATIONS OP
		     (:TYO
		       (VECTOR-PUSH-EXTEND ARG1 ARRAY))
		     (:STRING-OUT
		       (DO ((J (OR (CAR ARGS) 0) (1+ J))
			    (END (OR (CADR ARGS) (LENGTH ARG1))))
			   ((= J END))
			 (VECTOR-PUSH-EXTEND (AREF ARG1 J) ARRAY)))
		     (T
		       (STREAM-DEFAULT-HANDLER STREAM OP ARG1 ARGS))))))


(DEFUN MAKE-STREAM-FROM-ARRAY (ARRAY &AUX STREAM (INDEX 0) PLIST)
    (SETQ STREAM #'(LAMBDA (OP &OPTIONAL ARG1 &REST ARGS)
		   (SI:SELECTQ-WITH-WHICH-OPERATIONS OP
		     (:TYI
		       (IF (= INDEX (LENGTH ARRAY))
			   NIL
			 (AREF ARRAY (PROG1 INDEX (INCF INDEX)))))
		     (:UNTYI
		       (DECF INDEX))
		     (:GENERIC-PATHNAME
		       #'(LAMBDA (OP &REST ARGS)
			   (SI:SELECTQ-WITH-WHICH-OPERATIONS OP
			     (:PUTPROP
			       (SETF (GETF PLIST (CADR ARGS)) (CAR ARGS)))
			     (:PLIST
			       PLIST)
			     (:REMPROP
			       (REMF PLIST (CAR ARGS)))
			     (:GET
			       (GETF PLIST (CAR ARGS))))))
		     (:INFO NIL)
		     (:PATHNAME "an array")
		     (T
		       (STREAM-DEFAULT-HANDLER STREAM OP ARG1 ARGS))))))

(DEFUN DUMP-FORMS-TO-ARRAY (ARRAY FORMS-LIST &OPTIONAL ATTRIBUTE-LIST)
  (LET ((FASD-STREAM (MAKE-STREAM-TO-ARRAY ARRAY)))
    (LET ((FASD-PACKAGE NIL))			;in case fasd-attributes-list bashes it
      (LOCKING-RESOURCES
	(FASD-INITIALIZE)
	(FASD-START-FILE)
	(FASD-ATTRIBUTES-LIST
	  (IF (GETL (LOCF ATTRIBUTE-LIST) '(:PACKAGE))
	      ATTRIBUTE-LIST
	    (LIST* ':PACKAGE ':USER ATTRIBUTE-LIST)))
	(DOLIST (FORM FORMS-LIST)
	  (IF ( (FASD-TABLE-LENGTH) QC-FILE-WHACK-THRESHOLD)
	      (FASD-END-WHACK))
	  (FASD-FORM FORM))
	(FASD-END-WHACK)
	(FASD-END-FILE)))))


(DEFUN MAKE-ARRAY-FOR-DUMPING-EXAMPLE (size)
  (make-array size :fill-pointer 0 :adjustable t
	      :type 'art-16b))

(DEFUN FASLOAD-FROM-ARRAY (ARRAY &OPTIONAL PKG NO-MSG-P)
  (SI:FASLOAD-INTERNAL (MAKE-STREAM-FROM-ARRAY ARRAY) PKG NO-MSG-P))

