;;; -*- Mode:LISP; Package:(ANALYZE GLOBAL); Readtable:CL; Base:10 -*-
;;;
;;; Functions for analysis of the Lisp Machine Environment
;;;
;;;

(defun count-stuff (&optional (top-pkg pkg-global-package))
  (let ((vars 0)
	(functions 0)
	(plists 0))
    (declare (special vars functions))
    (mapatoms-all #'(lambda (symbol)
		      (cond-every ((fboundp symbol) (incf functions))
				  ((boundp symbol) (incf vars))
				  ((plist symbol) (incf plists))))
		  top-pkg)
    (list (time:get-universal-time) :vars vars :functions functions :plists plists)))

(defun count-symbols (&optional (top-pkg pkg-global-package))
  (let ((symbols 0)
	(compiled-functions 0)
	(ucode-functions 0)
	(closures 0)
	(named-lambda-functions 0)
	(deffs 0)
	(macros 0)
	(flavors 0)
	(variables 0)
	(defstructs 0)
	(previously-defined 0)
	(sourced-symbols 0)
	(editor-buffers 0))
    (special symbols compiled-functions ucode-functions
	     closures named-lambda-functions deffs macros
	     flavors variables defstructs previously-defined
	     sourced-symbols editor-buffers)
    (mapatoms-all #'(lambda (symbol)
		      (incf symbols)
		      (cond-every ((fboundp symbol)
				   (typecase (fsymeval symbol)
				     (:compiled-function (incf compiled-functions))
				     (:microcode-function (incf ucode-functions))
				     (closure (incf closures))
				     (:cons (case (car (fsymeval symbol))
					      (macro (incf macros))
					      (named-lambda (incf named-lambda-functions 0))
					      (t (ferror nil "Unknown thing in function cell: ~A"
							 (fsymeval symbol)))))
				     (:symbol (incf deffs))
				     (t (ferror nil "Unknown thing in function cell: ~A"
						(fsymeval symbol)))))
				  ((boundp symbol)
				   (incf variables))
				  ((get symbol 'si:flavor) (incf flavors))
				  ((get symbol 'si:defstruct-description) (incf defstructs))
				  ((get symbol :previous-definition) (incf previously-defined))
				  ((get symbol ':source-file-name) (incf sourced-symbols))
				  ((get symbol 'zwei:zmacs-buffers) (incf editor-buffers))))
		  top-pkg)
    (list (time:get-universal-time)
	  :symbols symbols
	  :compiled-functions compiled-functions
	  :ucode-functions ucode-functions
	  :closures closures
	  :named-lambda-functions named-lambda-functions
	  :macros macros
	  :flavors flavors
	  :variables variables
	  :defstructs defstructs
	  :previously-defined previously-defined
	  :sourced-symbols sourced-symbols
	  :editor-buffers editor-buffers)))

	    
			     
			     
			     
					
