1 ;;; riece-identity.el --- an identity object
2 ;; Copyright (C) 1998-2003 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 (require 'riece-globals)
28 (require 'riece-coding)
29 (require 'riece-compat) ;riece-set-case-syntax-pair
31 (defvar riece-abbrev-identity-string-function nil)
32 (defvar riece-expand-identity-string-function nil)
34 (defvar riece-identity-prefix-case-table
35 (let ((table (copy-case-table (standard-case-table))))
36 (riece-set-case-syntax-pair ?\[ ?{ table)
37 (riece-set-case-syntax-pair ?\] ?} table)
38 (riece-set-case-syntax-pair ?\\ ?| table)
39 (riece-set-case-syntax-pair ?~ ?^ table)
42 (defun riece-identity-prefix (identity)
43 "Return the component sans its server from IDENTITY."
46 (defun riece-identity-server (identity)
47 "Return the server component in IDENTITY."
50 (defun riece-make-identity (prefix server)
51 "Make an identity object from PREFIX and SERVER."
52 (vector prefix server))
54 (defun riece-identity-equal (ident1 ident2)
55 "Return t, if IDENT1 and IDENT2 is equal."
56 (and (riece-identity-equal-no-server
57 (riece-identity-prefix ident1)
58 (riece-identity-prefix ident2))
60 (riece-identity-server ident1)
61 (riece-identity-server ident2))))
63 (defun riece-identity-canonicalize-prefix (prefix)
64 "Canonicalize identity PREFIX.
65 This function downcases PREFIX with Scandinavian alphabet rule.
67 RFC2812, 2.2 \"Character codes\" says:
68 Because of IRC's Scandinavian origin, the characters {}|^ are
69 considered to be the lower case equivalents of the characters []\~,
70 respectively. This is a critical issue when determining the
71 equivalence of two nicknames or channel names."
72 (let ((old-table (current-case-table)))
75 (set-case-table riece-identity-prefix-case-table)
77 (set-case-table old-table))))
79 (defun riece-identity-equal-no-server (prefix1 prefix2)
80 "Return t, if IDENT1 and IDENT2 is equal without server."
81 (equal (riece-identity-canonicalize-prefix prefix1)
82 (riece-identity-canonicalize-prefix prefix2)))
84 (defun riece-identity-member (elt list)
85 "Return non-nil if an identity ELT is an element of LIST."
88 (if (and (vectorp (car list)) ;needed because
89 ;riece-current-channels
91 (riece-identity-equal (car list) elt))
93 (setq list (cdr list))))))
95 (defun riece-identity-assoc (elt alist)
96 "Return non-nil if an identity ELT matches the car of an element of ALIST."
99 (if (riece-identity-equal (car (car alist)) elt)
100 (throw 'found (car alist))
101 (setq alist (cdr alist))))))
103 (defun riece-identity-assign-binding (item list binding)
104 (let ((slot (riece-identity-member item binding))
106 (unless list ;we need at least one room
107 (setq list (list nil)))
110 (while (not (eq binding slot))
111 (unless (cdr pointer)
112 (setcdr pointer (list nil)))
113 (setq pointer (cdr pointer)
114 binding (cdr binding)))
115 (while (or (car pointer) (car binding))
116 (unless (cdr pointer)
117 (setcdr pointer (list nil)))
118 (setq pointer (cdr pointer)
119 binding (cdr binding))))
120 (setcar pointer item)
123 (defun riece-format-identity (identity &optional prefix-only)
124 "Convert IDENTITY object to a string.
125 If the optional 2nd argument PREFIX-ONLY is non-nil, don't append
126 server part of the identity.
128 The returned string will be abbreviated by
129 `riece-abbrev-identity-string-function', and `riece-identity' property
133 (equal (riece-identity-server identity) ""))
134 (riece-identity-prefix identity)
135 (concat (riece-identity-prefix identity) " "
136 (riece-identity-server identity)))))
137 (if riece-abbrev-identity-string-function
138 (setq string (funcall riece-abbrev-identity-string-function string)))
139 (put-text-property 0 (length string) 'riece-identity identity string)
142 (defun riece-parse-identity (string)
143 "Convert STRING to an identity object.
144 The string will be expanded by
145 `riece-expand-identity-string-function'."
146 (if riece-expand-identity-string-function
147 (setq string (funcall riece-expand-identity-string-function string)))
148 (riece-make-identity (if (string-match " " string)
149 (substring string 0 (match-beginning 0))
151 (if (string-match " " string)
152 (substring string (match-end 0))
155 (defun riece-completing-read-identity (prompt channels
156 &optional predicate require-match
157 initial history default)
158 "Read an identity object in the minibuffer, with completion.
159 PROMPT is a string to prompt with; normally it ends in a colon and a space.
160 CHANNELS is a list of identity objects.
161 The rest of arguments are the same as `completing-read'."
165 (mapcar (lambda (channel)
166 (list (riece-format-identity channel)))
167 (delq nil (copy-sequence (or channels
168 riece-current-channels))))
169 predicate require-match initial history default))
171 (riece-parse-identity string)))
172 (unless (string-match (concat "^\\(" riece-channel-regexp "\\|"
173 riece-user-regexp "\\)")
174 (riece-identity-prefix identity))
175 (error "Invalid channel name!"))
178 (provide 'riece-identity)
180 ;;; riece-identity.el ends here