1 ;;; riece-addon.el --- add-on management
2 ;; Copyright (C) 1998-2004 Daiki Ueno
4 ;; Author: Daiki Ueno <ueno@unixuser.org>
6 ;; Keywords: IRC, riece
8 ;; This file is part of Riece.
10 ;; This program is free software; you can redistribute it and/or modify
11 ;; it under the terms of the GNU General Public License as published by
12 ;; the Free Software Foundation; either version 2, or (at your option)
15 ;; This program is distributed in the hope that it will be useful,
16 ;; but WITHOUT ANY WARRANTY; without even the implied warranty of
17 ;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
18 ;; GNU General Public License for more details.
20 ;; You should have received a copy of the GNU General Public License
21 ;; along with GNU Emacs; see the file COPYING. If not, write to the
22 ;; Free Software Foundation, Inc., 59 Temple Place - Suite 330,
23 ;; Boston, MA 02111-1307, USA.
27 (defun riece-load-and-build-addon-dependencies (addons)
28 (let ((load-path (cons riece-addon-directory load-path))
31 (require (car addons)) ;error will be reported here
33 (funcall (or (intern-soft
34 (concat (symbol-name (car addons)) "-requires"))
38 ;; Increment succs' pred count.
39 (if (setq entry (assq (car addons) dependencies))
40 (setcar (cdr entry) (+ (length requires) (nth 1 entry)))
41 (setq dependencies (cons (list (car addons) (length requires))
43 ;; Merge pred's succs.
45 (if (setq entry (assq (car pointer) dependencies))
47 (cons (car addons) (nthcdr 2 entry)))
48 (setq dependencies (cons (list (car pointer) 0 (car addons))
50 (setq pointer (cdr pointer))))
51 (setq addons (cdr addons)))
54 (defun riece-resolve-addons (addons)
55 (let ((pointer addons)
59 (if (memq (car pointer) (cdr pointer))
61 (setq pointer (cdr pointer)))
62 (setq dependencies (riece-load-and-build-addon-dependencies
67 (if (zerop (nth 1 (car pointer)))
68 (setq dependencies (delq (car pointer) dependencies)
69 queue (cons (car pointer) queue)))
70 (setq pointer (cdr pointer)))
73 (setq addons (cons (car (car queue)) addons)
74 pointer (nthcdr 2 (car queue)))
76 (let* ((entry (assq (car pointer) dependencies))
77 (count (1- (nth 1 entry))))
80 (setq dependencies (delq entry dependencies)
81 queue (nconc queue (list entry))))
82 (setcar (cdr entry) count)))
83 (setq pointer (cdr pointer)))
84 (setq queue (cdr queue)))
86 (error "Circular add-on dependency found"))
89 (defun riece-insinuate-addon (addon)
90 (require addon) ;implicit dependency
91 (funcall (intern (concat (symbol-name addon) "-insinuate")))
93 (message "Add-on %S is insinuated" addon)))
95 (defun riece-enable-addon (addon)
96 (let ((enabled (intern-soft (concat (symbol-name addon) "-enabled"))))
99 (message "Add-on %S doesn't support enable/disable" addon))
100 (if (symbol-value enabled)
102 (message "Can't enable add-on %S" addon))
103 (funcall (intern (concat (symbol-name addon) "-enable")))
105 (message "Add-on %S enabled" addon))))))
107 (defun riece-disable-addon (addon)
108 (let ((enabled (intern-soft (concat (symbol-name addon) "-enabled"))))
111 (message "Add-on %S doesn't support enable/disable" addon))
112 (if (symbol-value enabled)
114 (funcall (intern (concat (symbol-name (car addons)) "-disable")))
116 (message "Add-on %S disabled" (car addons))))
118 (message "Can't disable add-on %S" addon))))))
120 (provide 'riece-addon)
122 ;;; riece-addon.el ends here