File: dyn-commands.scm

package info (click to toggle)
freetalk 0.5-2
  • links: PTS
  • area: main
  • in suites: etch, etch-m68k
  • size: 792 kB
  • ctags: 361
  • sloc: sh: 3,426; ansic: 2,172; lisp: 816; makefile: 93
file content (81 lines) | stat: -rw-r--r-- 2,704 bytes parent folder | download
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
;;; dyn-commands.scm: Dynamic Commands support.
;;; author: Anand Babu <ab@zresearch.com>
;;; copyright 2005 FreeTalk Core Team

;;; This program 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.
;;; 
;;; This program 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 this program; if not, write to the Free Software
;;; Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA

(use-modules (ice-9 string-fun))

(define dynamic-command-registry '())

(define (add-command! func command syntax description)
  "Adds a dynamic command"
  (if (procedure? func)
      (set! dynamic-command-registry 
	    (assoc-set! dynamic-command-registry
			command
			(list func syntax description)))
      (display (string-append "freetalk: error: command ["
			      command
			      "] not bound to any procedure\n"))))

(define (remove-command! command)
  "Removes a dynamic command"
  (set! dynamic-command-registry 
	(assoc-remove! dynamic-command-registry
		       command)))

(define (dynamic-command-proc command args)
  (if (not args)
      (set! args ""))
  ((lambda (cmd-entry)
     (if cmd-entry
	(begin
	  ((car cmd-entry) args)
	  (ft-hook-return)))) (assoc-ref dynamic-command-registry command)))
      ;;  (if (string-null? args)
      ;;	  (ft-hook-return))
       ;; Terminate all empty messages here - AVATI: moved to commands.c:do_send_message()

(add-hook! ft-command-hook dynamic-command-proc)

(define (help args)
  "display help message"
  (let ((command-name (sans-surrounding-whitespace args))
	(command-doc (assoc-ref dynamic-command-registry (sans-surrounding-whitespace args))))
    (if (not (string-null? args))
	(if (not (list? command-doc))
	    (display "no such command\n")
	    (display (string-append command-name
				    " - "
				    (cadr command-doc)
				    "\n\t"
				    (caddr command-doc)
				    "\n"
				    )))
	(for-each (lambda (command-entry)
		    (display (string-append (car command-entry)
					    " - "
					    (caddr command-entry)
					    "\n\t"
					    (cadddr command-entry)
					    "\n"
					    )))
		  (sort dynamic-command-registry 
			(lambda (a b) 
			  (string<? (car a) (car b))))))))

(add-command! help "help" "help [COMMAND]" "show help")
(add-command! help "/help" "/help [COMMAND]" "show help")