;;; -*- Mode:LISP; Package:USER; Base:10 -*-

;;; PUT SOURCE FILE PROPERTIES ON UCODE TAGS.



(SI:DEFINE-HOST "WILD"
		:HOST-NAMES '("WILD")
		:MACHINE-TYPE :LISPM
		:SYSTEM-TYPE :LISPM
		:WILD T)

(DEFUN FIND-PATHNAMES (P)
  (LET ((PATHNAME (FS:PARSE-PATHNAME P)))
    (LET ((HOST (SEND PATHNAME :HOST))
	  (DIRECTORY (SEND PATHNAME :DIRECTORY))
	  (NAME (SEND PATHNAME :NAME))
	  (TYPE (SEND PATHNAME :TYPE))
	  (WH (FS:GET-PATHNAME-HOST "WILD")))
      (LET ((L))
	(MAPHASH #'(LAMBDA (KEY PATHNAME) 
			   (WHEN (AND (OR (EQ HOST WH) (EQUAL (NTH 0 KEY) HOST))
				      (OR (EQ DIRECTORY :WILD) (EQUALP (NTH 2 KEY) DIRECTORY))
				      (OR (EQ NAME :WILD) (STRING-EQUAL (NTH 3 KEY) NAME))
				      (OR (EQ TYPE :WILD) (STRING-EQUAL (NTH 4 KEY) TYPE)))
			     (PUSH PATHNAME L)))
		 FS:*PATHNAME-HASH-TABLE*)
	L))))


(DEFCONST *UCODE-TAGS* NIL)

(DEFUN SET-UCODE-TAGS ()
  (SETQ *UCODE-TAGS* NIL)
  ;; THIS IS RUN AFTER "SYS:ULAMBDA;LAMBDA-MICROCODE.QFASL" IS LOADED. OR AN ASSEMBLY HAS BEEN RUN.
  (LET ((L (FIND-PATHNAMES "LAM3:RELEASE-3.ULAMBDA;*.LISP")))
    (DOLIST (P L)
      (LET ((GENERIC (SEND (SEND (FS:PARSE-PATHNAME "SYS:ULAMBDA;") :BACK-TRANSLATED-PATHNAME P)
			     :GENERIC-PATHNAME)))
	(WHEN (NOT (ASSQ GENERIC *UCODE-TAGS*))
	  (LET ((S (GET P 'LAMBDA:UA-LAMBDA-SEXP)))
	    (WHEN S
	      (PUSH (NCONS GENERIC) *UCODE-TAGS*)
	      (DOLIST (A S)
		(WHEN (SYMBOLP A)
		  (PUSH A (CDAR *UCODE-TAGS*)))))))))))


(DEFUN DUMP-UCODE-TAGS (FILENAME)
  (WITH-OPEN-FILE (STREAM FILENAME :DIRECTION :OUTPUT)
    (FORMAT STREAM ";;;-*-MODE:LISP;PACKAGE:LAMBDA;BASE:10;READTABLE:CL-*-~%")
    (LET ((*PACKAGE* (FIND-PACKAGE "LAMBDA"))
	  (*READTABLE* (SI:FIND-READTABLE-NAMED "CL")))
      (PRINT `(SPECIAL *UCODE-TAGS*) STREAM)
      (PRINT `(SETQ *UCODE-TAGS* ',*UCODE-TAGS*) STREAM)
      (PRINT `(DEFUN ENABLE-UCODE-TAGS ()
		(DOLIST (TAG *UCODE-TAGS*)
		(LET ((FS:FDEFINE-FILE-PATHNAME (CAR TAG)))
		  (DOLIST (SYM (CDR TAG))
		    (SI:RECORD-SOURCE-FILE-NAME SYM 'UCODE)))))
	     STREAM)
      (PRINT '(ENABLE-UCODE-TAGS) STREAM)
      (TERPRI STREAM))))
	    
