1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120
|
;;; callers-of-rpt.el --- generate call graph of lisp in XEmacs
;; Copyright (C) 1997 Karl Hegbloom
;; Copyright (C) 1997 Free Software Foundation, Inc.
;; Author: Karl Hegbloom <karlheg@inetarena.com>
;; Maintainer: XEmacs Development Team
;; Keywords: internal
;; This file is part of XEmacs.
;; XEmacs is free software; you can redistribute it and/or modify it
;; under the terms of the GNU General Public License as published by
;; the Free Software Foundation; either version 2, or (at your option)
;; any later version.
;; XEmacs is distributed in the hope that it will be useful, but
;; WITHOUT ANY WARRANTY; without even the implied warranty of
;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
;; General Public License for more details.
;; You should have received a copy of the GNU General Public License
;; along with XEmacs; see the file COPYING. If not, write to the
;; Free Software Foundation, 59 Temple Place - Suite 330,
;; Boston, MA 02111-1307, USA.
;;; Synched up with: not in FSF
;;; Commentary:
;; Grep-2.1 is required.
;; Modify the `xemacs-src-lisp-dir' and `xemacs-pkg-lisp-dir' to reflect
;; where these directories live on your local system.
;;; Code:
(defvar xemacs-src-lisp-dir "/usr/src/xemacs-20.0/lisp/"
"Where the XEmacs 20 lisp sources live.")
(defvar xemacs-pkg-lisp-dir "/home/xemacs/packages/"
"Where the package lisp sources live.")
;; (makunbound 'caller-table)
(defconst caller-table (make-hash-table :test 'equal)
"Hash table keyed on the symbols being required. Each element will
be a list of file-names of programs that depend on them.")
;;./apel/atype.el:(require 'emu)
;;./apel/atype.el:(require 'alist)
;;./apel/emu-e19.el: (require 'emu-xemacs))
;;./apel/emu-e19.el: (require 'emu-19)
(defun make-caller-report ()
"Generate a simple report showing .el files that are `require'd by
other .el files, and the list of programs that depend on them."
(interactive)
(let ((cmd-out (get-buffer-create "*caller-report find-grep output*"))
(rpt (get-buffer-create "* caller report *"))
file-name)
(switch-to-buffer cmd-out)
(buffer-disable-undo cmd-out)
(set-syntax-table emacs-lisp-mode-syntax-table cmd-out)
(erase-buffer cmd-out)
(message "Running the find | grep...")
(sit-for 0)
;; Note: Edit this part as needed for your installation.
(shell-command (concat
;; First the installed lisp
"cd " xemacs-src-lisp-dir " ;"
"grep -H '(require ' $(find -name '*.el' -print) |"
" grep -v 'auto-autoloads\\.el\\|callers-of-rpt\\.el' |"
" grep -v 'el:[ \t]*;\\|require load' ;" ; ones commented off, and cus-edit.el
;; Then the packages
"cd " xemacs-pkg-lisp-dir " ;"
"grep -H '(require ' $(find -name '*.el' -print) |"
" grep -v 'auto-autoloads\\.el\\|callers-of-rpt\\.el' |"
" grep -v 'el:[ \t]*;' ;" ; ones commented off
)
cmd-out)
(message "Running the find | grep... Done.")
(goto-char (point-min))
(sit-for 0)
(while (not (eobp))
(setq file-name (buffer-substring (+ (point) 2) ; skip the leading "./"
(progn
(skip-chars-forward "^:")
(point))
cmd-out))
(re-search-forward "(require '" nil t)
(let* ((key (buffer-substring (point) (progn
(skip-chars-forward "^) ")
(point))
cmd-out))
(lst (gethash key caller-table)))
(unless (member file-name lst)
(puthash key (cons file-name lst) caller-table)))
(forward-line 1)
(sit-for 0))
(switch-to-buffer rpt)
(buffer-disable-undo rpt)
(erase-buffer rpt)
(sit-for 0)
(let (keys)
(maphash #'(lambda (key val) (push key keys)) caller-table)
(setq keys (sort keys #'string<))
(mapc #'(lambda (key)
(insert (format "(%s '(" key))
(let ((lst (gethash key caller-table)))
(while lst
(insert (format "%S" (car lst)))
(setq lst (cdr lst))
(when lst (insert " "))))
(insert "))\n")
(sit-for 0))
keys))))
(byte-compile 'make-caller-report)
(delete-other-windows)
(make-caller-report)
;;; callers-of-rpt.el ends here
|