(DEFINE-FILE-INFO PACKAGE "XCL-USER" READTABLE "XCL")
(IL:FILECREATED "28-Nov-88 16:38:31" IL:|{DSK}/users/greep/BAD-XREF.;2| 2420   )


(IL:PRETTYCOMPRINT IL:BAD-XREFCOMS)

(IL:RPAQQ IL:BAD-XREFCOMS ((IL:FUNCTIONS XREF XREF-FILE XREF-OUTPUT)
                               (IL:VARIABLES XREF-READTABLE)))

(DEFUN XREF (FILENAMES &OPTIONAL (OUTPUT *STANDARD-OUTPUT*))
   (LET (DEFS)
        (DOLIST (FILENAME FILENAMES)
            (SETQ DEFS (NCONC (XREF-FILE FILENAME)
                              DEFS)))
        (SORT DEFS #'STRING< :KEY #'CAR)
        (IF (STREAMP OUTPUT)
            (XREF-OUTPUT DEFS OUTPUT)
            (WITH-OPEN-FILE (OUTPUT-STREAM OUTPUT :DIRECTION :OUTPUT)
                   (XREF-OUTPUT DEFS OUTPUT-STREAM)))
        (VALUES)))

(DEFUN XREF-FILE (FILENAME)
   (DECLARE (SPECIAL XREF-READTABLE))
   (WITH-OPEN-FILE
    (STRM FILENAME :DIRECTION :INPUT)
    (LET (FORM DEFS (FN (PATHNAME-NAME FILENAME)))
         (LOOP (WHEN (EQ (SETQ FORM (LET ((*READTABLE* XREF-READTABLE))
                                         (READ STRM NIL :EOF)))
                         :EOF)
                     (RETURN))
               (WHEN (CONSP FORM)
                   (LET ((FIRSTWORD (STRING (FIRST FORM))))
                        (WHEN (AND (CONSP (REST FORM))
                                   (>= (LENGTH FIRSTWORD)
                                       3)
                                   (STRING= (SUBSEQ FIRSTWORD 0 3)
                                          "DEF"))

                            (IL:* IL:|;;| "Each definition is of the form (s . f) where s is the name of the symbol being defined and f is the file name. ")

                            (PUSH (CONS (FORMAT NIL "~a" (LET ((NAME (SECOND FORM)))
                                                              (IF (CONSP NAME)
                                                                  (CAR NAME)
                                                                  NAME)))
                                        FN)
                                  DEFS)))))
         (NREVERSE DEFS))))

(DEFUN XREF-OUTPUT (DEFS OUTPUT-STREAM)
   (DOLIST (DEF DEFS)
       (FORMAT OUTPUT-STREAM "~a~50t~a~%" (CAR DEF)
              (CDR DEF))))

(DEFVAR XREF-READTABLE (LET ((RT (COPY-READTABLE NIL)))
                                (SET-SYNTAX-FROM-CHAR #\: #\_ RT)))
(IL:DECLARE\: IL:DONTCOPY
  (IL:FILEMAP (NIL)))
IL:STOP
