From a258cd6803ff978867d2e5772a98ebdc713ed3af Mon Sep 17 00:00:00 2001 From: Lars Magne Ingebrigtsen Date: Wed, 29 Sep 2010 21:15:54 +0200 Subject: [PATCH] Removed packages that are included with Emacsen we support. --- contrib/ChangeLog | 8 + contrib/sendmail.el | 1926 -------------------------------- contrib/smtpmail.el | 1040 ----------------- contrib/ucs-tables.el | 2482 ----------------------------------------- 4 files changed, 8 insertions(+), 5448 deletions(-) delete mode 100644 contrib/sendmail.el delete mode 100644 contrib/smtpmail.el delete mode 100644 contrib/ucs-tables.el diff --git a/contrib/ChangeLog b/contrib/ChangeLog index af41c6be4..077154c15 100644 --- a/contrib/ChangeLog +++ b/contrib/ChangeLog @@ -1,3 +1,11 @@ +2010-09-29 Lars Magne Ingebrigtsen + + * smtpmail.el: Removed. + + * ucs-tables.el: Removed. + + * sendmail.el: Removed. + 2010-09-26 Julien Danjou * ssl.el: Removed. diff --git a/contrib/sendmail.el b/contrib/sendmail.el deleted file mode 100644 index 7f377db87..000000000 --- a/contrib/sendmail.el +++ /dev/null @@ -1,1926 +0,0 @@ -;;; sendmail.el --- mail sending commands for Emacs. -*- byte-compile-dynamic: t -*- - -;; Copyright (C) 1985, 1986, 1992, 1993, 1994, 1995, 1996, 1998, 2000, -;; 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009 -;; Free Software Foundation, Inc. - -;; Maintainer: FSF -;; Keywords: mail - -;; This file is part of GNU Emacs. - -;; GNU Emacs 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 3 of the License, or -;; (at your option) any later version. - -;; GNU Emacs 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 GNU Emacs. If not, see . - -;;; Commentary: - -;; This mode provides mail-sending facilities from within Emacs. It is -;; documented in the Emacs user's manual. - -;;; Code: -(eval-when-compile - ;; Necessary to avoid recursive `require's. - (provide 'sendmail) - (require 'rmail) - (require 'mailalias)) - -(autoload 'rfc2047-encode-string "rfc2047") - -(defgroup sendmail nil - "Mail sending commands for Emacs." - :prefix "mail-" - :group 'mail) - -(defcustom mail-setup-with-from t - "Non-nil means insert `From:' field when setting up the message." - :type 'boolean - :group 'sendmail - :version "22.1") - -(defcustom sendmail-program - (cond - ((file-exists-p "/usr/sbin/sendmail") "/usr/sbin/sendmail") - ((file-exists-p "/usr/lib/sendmail") "/usr/lib/sendmail") - ((file-exists-p "/usr/ucblib/sendmail") "/usr/ucblib/sendmail") - (t "fakemail")) ;In ../etc, to interface to /bin/mail. - "Program used to send messages." - :group 'mail - :type 'file) - -;;;###autoload -(defcustom mail-from-style 'angles - "Specifies how \"From:\" fields look. - -If `nil', they contain just the return address like: - king@grassland.com -If `parens', they look like: - king@grassland.com (Elvis Parsley) -If `angles', they look like: - Elvis Parsley -If `system-default', allows the mailer to insert its default From field -derived from the envelope-from address. - -In old versions of Emacs, the `system-default' setting also caused -Emacs to pass the proper email address from `user-mail-address' -to the mailer to specify the envelope-from address. But that is now -controlled by a separate variable, `mail-specify-envelope-from'." - :type '(choice (const nil) (const parens) (const angles) - (const system-default)) - :version "20.3" - :group 'sendmail) - -;;;###autoload -(defcustom mail-specify-envelope-from nil - "If non-nil, specify the envelope-from address when sending mail. -The value used to specify it is whatever is found in -the variable `mail-envelope-from', with `user-mail-address' as fallback. - -On most systems, specifying the envelope-from address is a -privileged operation. This variable affects sendmail and -smtpmail -- if you use feedmail to send mail, see instead the -variable `feedmail-deduce-envelope-from'." - :version "21.1" - :type 'boolean - :group 'sendmail) - -(defcustom mail-envelope-from nil - "If non-nil, designate the envelope-from address when sending mail. -This only has an effect if `mail-specify-envelope-from' is non-nil. -The value should be either a string, or the symbol `header' (in -which case the contents of the \"From\" header of the message -being sent is used), or nil (in which case the value of -`user-mail-address' is used)." - :version "21.1" - :type '(choice (string :tag "From-name") - (const :tag "Use From: header from message" header) - (const :tag "Use `user-mail-address'" nil)) - :group 'sendmail) - -;;;###autoload -(defcustom mail-self-blind nil - "Non-nil means insert BCC to self in messages to be sent. -This is done when the message is initialized, -so you can remove or alter the BCC field to override the default." - :type 'boolean - :group 'sendmail) - -;;;###autoload -(defcustom mail-interactive t - ;; We used to use a default of nil rather than t, but nowadays it is very - ;; common for sendmail to be misconfigured, so one cannot rely on the - ;; bounce message to be delivered anywhere, least of all to the - ;; user's mailbox. - "Non-nil means when sending a message wait for and display errors. -Otherwise, let mailer send back a message to report errors." - :type 'boolean - :group 'sendmail) - -(defcustom mail-yank-ignored-headers - (concat "^" - (regexp-opt '("via" "mail-from" "origin" "status" "remailed" - "received" "message-id" "summary-line" "to" "subject" - "in-reply-to" "return-path" "mail-reply-to" - ;; Should really be rmail-attribute-header and - ;; rmail-keyword-header, but this file does not - ;; require rmail (at run time). - "x-rmail-attributes" "x-rmail-keywords" - "mail-followup-to") "\\(?:") - ":") - "Delete these headers from old message when it's inserted in a reply." - :type 'regexp - :group 'sendmail - :version "23.1") - -;; Prevent problems with `window-system' not having the correct value -;; when loaddefs.el is loaded. `custom-reevaluate-setting' needs the -;; standard value. -;;;###autoload -(put 'send-mail-function 'standard-value - '((if (and window-system (memq system-type '(darwin windows-nt))) - 'mailclient-send-it - 'sendmail-send-it))) - -;; Useful to set in site-init.el -;;;###autoload -(defcustom send-mail-function - (if (and window-system (memq system-type '(darwin windows-nt))) - 'mailclient-send-it - 'sendmail-send-it) - "Function to call to send the current buffer as mail. -The headers should be delimited by a line which is -not a valid RFC822 header or continuation line, -that matches the variable `mail-header-separator'. -This is used by the default mail-sending commands. See also -`message-send-mail-function' for use with the Message package." - :type '(radio (function-item sendmail-send-it :tag "Use Sendmail package") - (function-item smtpmail-send-it :tag "Use SMTPmail package") - (function-item feedmail-send-it :tag "Use Feedmail package") - (function-item mailclient-send-it :tag "Use Mailclient package") - function) - :group 'sendmail) - -;;;###autoload -(defcustom mail-header-separator "--text follows this line--" - "Line used to separate headers from text in messages being composed." - :type 'string - :group 'sendmail) - -;; Set up mail-header-separator for use as a category text property. -(put 'mail-header-separator 'rear-nonsticky '(category)) -;; This was a nice idea, for preventing accidental modification of -;; the separator. But I found it also prevented or obstructed -;; certain deliberate operations, such as copying the separator line -;; up to the top to send myself a copy of an already sent outgoing message -;; and other things. So I turned it off. --rms. -;;(put 'mail-header-separator 'read-only t) - -;;;###autoload -(defcustom mail-archive-file-name nil - "Name of file to write all outgoing messages in, or nil for none. -This is normally an mbox file, but for backwards compatibility may also -be a Babyl file." - :type '(choice file (const nil)) - :group 'sendmail) - -;;;###autoload -(defcustom mail-default-reply-to nil - "Address to insert as default Reply-to field of outgoing messages. -If nil, it will be initialized from the REPLYTO environment variable -when you first send mail." - :type '(choice (const nil) string) - :group 'sendmail) - -;;;###autoload -(defcustom mail-alias-file nil - "If non-nil, the name of a file to use instead of `/usr/lib/aliases'. -This file defines aliases to be expanded by the mailer; this is a different -feature from that of defining aliases in `.mailrc' to be expanded in Emacs. -This variable has no effect unless your system uses sendmail as its mailer." - :type '(choice (const nil) file) - :group 'sendmail) - -;;;###autoload -(defcustom mail-personal-alias-file "~/.mailrc" - "If non-nil, the name of the user's personal mail alias file. -This file typically should be in same format as the `.mailrc' file used by -the `Mail' or `mailx' program. -This file need not actually exist." - :type '(choice (const nil) file) - :group 'sendmail) - -;;;###autoload -(defcustom mail-setup-hook nil - "Normal hook, run each time a new outgoing mail message is initialized. -The function `mail-setup' runs this hook." - :type 'hook - :options '(fortune-to-signature spook mail-abbrevs-setup) - :group 'sendmail) - -;;;###autoload -(defvar mail-aliases t - "Alist of mail address aliases, -or t meaning should be initialized from your mail aliases file. -\(The file's name is normally `~/.mailrc', but `mail-personal-alias-file' -can specify a different file name.) -The alias definitions in the file have this form: - alias ALIAS MEANING") - -(defvar mail-alias-modtime nil - "The modification time of your mail alias file when it was last examined.") - -;;;###autoload -(defcustom mail-yank-prefix nil - "Prefix insert on lines of yanked message being replied to. -If this is nil, use indentation, as specified by `mail-indentation-spaces'." - :type '(choice (const nil) string) - :group 'sendmail) - -;;;###autoload -(defcustom mail-indentation-spaces 3 - "Number of spaces to insert at the beginning of each cited line. -Used by `mail-yank-original' via `mail-indent-citation'." - :type 'integer - :group 'sendmail) - -;; FIXME make it really obsolete. -(defvar mail-yank-hooks nil - "Obsolete hook for modifying a citation just inserted in the mail buffer. -Each hook function can find the citation between (point) and (mark t). -And each hook function should leave point and mark around the citation -text as modified. - -This is a normal hook, misnamed for historical reasons. -It is semi-obsolete and mail agents should no longer use it.") - -;;;###autoload -(defcustom mail-citation-hook nil - "Hook for modifying a citation just inserted in the mail buffer. -Each hook function can find the citation between (point) and (mark t), -and should leave point and mark around the citation text as modified. -The hook functions can find the header of the cited message -in the variable `mail-citation-header', whether or not this is included -in the cited portion of the message. - -If this hook is entirely empty (nil), a default action is taken -instead of no action." - :type 'hook - :group 'sendmail) - -(defvar mail-citation-header nil - "While running `mail-citation-hook', this variable holds the message header. -This enables the hook functions to see the whole message header -regardless of what part of it (if any) is included in the cited text.") - -;;;###autoload -(defcustom mail-citation-prefix-regexp "[ \t]*[-a-z0-9A-Z]*>+[ \t]*\\|[ \t]*" - "Regular expression to match a citation prefix plus whitespace. -It should match whatever sort of citation prefixes you want to handle, -with whitespace before and after; it should also match just whitespace. -The default value matches citations like `foo-bar>' plus whitespace." - :type 'regexp - :group 'sendmail - :version "20.3") - -(defvar mail-abbrevs-loaded nil) -(defvar mail-mode-map - (let ((map (make-sparse-keymap))) - (define-key map "\M-\t" 'mail-complete) - (define-key map "\C-c?" 'describe-mode) - (define-key map "\C-c\C-f\C-t" 'mail-to) - (define-key map "\C-c\C-f\C-b" 'mail-bcc) - (define-key map "\C-c\C-f\C-f" 'mail-fcc) - (define-key map "\C-c\C-f\C-c" 'mail-cc) - (define-key map "\C-c\C-f\C-s" 'mail-subject) - (define-key map "\C-c\C-f\C-r" 'mail-reply-to) - (define-key map "\C-c\C-f\C-a" 'mail-mail-reply-to) ; author - (define-key map "\C-c\C-f\C-l" 'mail-mail-followup-to) ; list - (define-key map "\C-c\C-t" 'mail-text) - (define-key map "\C-c\C-y" 'mail-yank-original) - (define-key map "\C-c\C-r" 'mail-yank-region) - (define-key map [remap split-line] 'mail-split-line) - (define-key map "\C-c\C-q" 'mail-fill-yanked-message) - (define-key map "\C-c\C-w" 'mail-signature) - (define-key map "\C-c\C-v" 'mail-sent-via) - (define-key map "\C-c\C-c" 'mail-send-and-exit) - (define-key map "\C-c\C-s" 'mail-send) - (define-key map "\C-c\C-i" 'mail-attach-file) - ;; FIXME add this? "b" = bury buffer. It's in the menu-bar. -;;; (define-key map "\C-c\C-b" 'mail-dont-send) - - (define-key map [menu-bar mail] - (cons "Mail" (make-sparse-keymap "Mail"))) - - (define-key map [menu-bar mail fill] - '("Fill Citation" . mail-fill-yanked-message)) - - (define-key map [menu-bar mail yank] - '(menu-item "Cite Original" mail-yank-original :enable mail-reply-action)) - - (define-key map [menu-bar mail signature] - '("Insert Signature" . mail-signature)) - - (define-key map [menu-bar mail mail-sep] - '("--")) - - (define-key map [menu-bar mail cancel] - '("Cancel" . mail-dont-send)) - - (define-key map [menu-bar mail send-stay] - '("Send, Keep Editing" . mail-send)) - - (define-key map [menu-bar mail send] - '("Send Message" . mail-send-and-exit)) - - (define-key map [menu-bar headers] - (cons "Headers" (make-sparse-keymap "Move to Header"))) - - (define-key map [menu-bar headers text] - '("Text" . mail-text)) - - (define-key map [menu-bar headers expand-aliases] - '("Expand Aliases" . expand-mail-aliases)) - - (define-key map [menu-bar headers sent-via] - '("Sent-Via" . mail-sent-via)) - - (define-key map [menu-bar headers mail-reply-to] - '("Mail-Reply-To" . mail-mail-reply-to)) - - (define-key map [menu-bar headers mail-followup-to] - '("Mail-Followup-To" . mail-mail-followup-to)) - - (define-key map [menu-bar headers reply-to] - '("Reply-To" . mail-reply-to)) - - (define-key map [menu-bar headers bcc] - '("Bcc" . mail-bcc)) - - (define-key map [menu-bar headers fcc] - '("Fcc" . mail-fcc)) - - (define-key map [menu-bar headers cc] - '("Cc" . mail-cc)) - - (define-key map [menu-bar headers subject] - '("Subject" . mail-subject)) - - (define-key map [menu-bar headers to] - '("To" . mail-to)) - - map)) - -(autoload 'build-mail-aliases "mailalias" - "Read mail aliases from user's personal aliases file and set `mail-aliases'." - nil) - -(autoload 'expand-mail-aliases "mailalias" - "Expand all mail aliases in suitable header fields found between BEG and END. -Suitable header fields are `To', `Cc' and `Bcc' and their `Resent-' variants. -Optional second arg EXCLUDE may be a regular expression defining text to be -removed from alias expansions." - nil) - -;;;###autoload -(defcustom mail-signature nil - "Text inserted at end of mail buffer when a message is initialized. -If t, it means to insert the contents of the file `mail-signature-file'. -If a string, that string is inserted. - (To make a proper signature, the string should begin with \\n\\n-- \\n, - which is the standard way to delimit a signature in a message.) -Otherwise, it should be an expression; it is evaluated -and should insert whatever you want to insert." - :type '(choice (const :tag "None" nil) - (const :tag "Use `.signature' file" t) - (string :tag "String to insert") - (sexp :tag "Expression to evaluate")) - :group 'sendmail) -(put 'mail-signature 'risky-local-variable t) - -;;;###autoload -(defcustom mail-signature-file "~/.signature" - "File containing the text inserted at end of mail buffer." - :type 'file - :group 'sendmail) - -;;;###autoload -(defcustom mail-default-directory "~/" - "Directory for mail buffers. -Value of `default-directory' for mail buffers. -This directory is used for auto-save files of mail buffers." - :type '(directory :tag "Directory") - :group 'sendmail - :version "22.1") - -(defvar mail-reply-action nil) -(defvar mail-send-actions nil - "A list of actions to be performed upon successful sending of a message.") -(put 'mail-reply-action 'permanent-local t) -(put 'mail-send-actions 'permanent-local t) - -;;;###autoload -(defcustom mail-default-headers nil - "A string containing header lines, to be inserted in outgoing messages. -It can contain newlines, and should end in one. It is inserted -before you edit the message, so you can edit or delete the lines." - :type '(choice (const nil) string) - :group 'sendmail) - -;; FIXME no need for autoload -;;;###autoload -(defcustom mail-bury-selects-summary t - "If non-nil, try to show Rmail summary buffer after returning from mail. -The functions \\[mail-send-on-exit] or \\[mail-dont-send] select -the Rmail summary buffer before returning, if it exists and this variable -is non-nil." - :type 'boolean - :group 'sendmail) - -;; FIXME no need for autoload -;;;###autoload -(defcustom mail-send-nonascii 'mime - "Specify whether to allow sending non-ASCII characters in mail. -If t, that means do allow it. nil means don't allow it. -`query' means ask the user each time. -`mime' means add an appropriate MIME header if none already present. -The default is `mime'. -Including non-ASCII characters in a mail message can be problematical -for the recipient, who may not know how to decode them properly." - :type '(choice (const t) (const nil) (const query) (const mime)) - :group 'sendmail) - -(defcustom mail-use-dsn nil - "Ask MTA for notification of failed, delayed or successful delivery. -Note that only some MTAs (currently only recent versions of Sendmail) -support Delivery Status Notification." - :group 'sendmail - :type '(repeat (radio (const :tag "Failure" failure) - (const :tag "Delay" delay) - (const :tag "Success" success))) - :version "22.1") - -;; Note: could use /usr/ucb/mail instead of sendmail; -;; options -t, and -v if not interactive. -(defvar mail-mailer-swallows-blank-line - (if (and (string-match "sparc-sun-sunos\\(\\'\\|[^5]\\)" system-configuration) - (file-readable-p "/etc/sendmail.cf") - (with-temp-buffer - (insert-file-contents "/etc/sendmail.cf") - (goto-char (point-min)) - (let ((case-fold-search nil)) - (re-search-forward "^OR\\>" nil t)))) - ;; According to RFC822, "The field-name must be composed of printable - ;; ASCII characters (i.e. characters that have decimal values between - ;; 33 and 126, except colon)", i.e. any chars except ctl chars, - ;; space, or colon. - '(looking-at "[ \t]\\|[][!\"#$%&'()*+,-./0-9;<=>?@A-Z\\\\^_`a-z{|}~]+:")) - "Set this non-nil if the system's mailer runs the header and body together. -\(This problem exists on Sunos 4 when sendmail is run in remote mode.) -The value should be an expression to test whether the problem will -actually occur.") - -(defvar mail-mode-syntax-table - ;; define-derived-mode will make it inherit from text-mode-syntax-table. - (let ((st (make-syntax-table))) - ;; FIXME this is probably very obsolete now ("percent hack"). - ;; sending.texi used to say: - ;; Mail mode defines the character `%' as a word separator; this - ;; is helpful for using the word commands to edit mail addresses. - (modify-syntax-entry ?% ". " st) - st) - "Syntax table used while in `mail-mode'.") - -(defvar mail-font-lock-keywords - (eval-when-compile - (let* ((cite-chars "[>|}]") - (cite-prefix "[:alpha:]") - (cite-suffix (concat cite-prefix "0-9_.@-`'\""))) - (list '("^\\(To\\|Newsgroups\\):" . font-lock-function-name-face) - '("^\\(B?CC\\|Reply-to\\|Mail-\\(reply\\|followup\\)-to\\):" . font-lock-keyword-face) - '("^\\(Subject:\\)[ \t]*\\(.+\\)?" - (1 font-lock-comment-face) -;; (2 font-lock-type-face nil t) - ) - ;; Use EVAL to delay in case `mail-header-separator' gets changed. - '(eval . - (let ((separator (if (zerop (length mail-header-separator)) - " \\`\\' " - (regexp-quote mail-header-separator)))) - (cons (concat "^" separator "$") 'font-lock-warning-face))) - ;; Use MATCH-ANCHORED to effectively anchor the regexp left side. - `(,cite-chars - (,(concat "\\=[ \t]*" - "\\(\\(\\([" cite-prefix "]+[" cite-suffix "]*\\)?" - "\\(" cite-chars "[ \t]*\\)\\)+\\)" - "\\(.*\\)") - (beginning-of-line) (end-of-line) - (1 font-lock-comment-delimiter-face nil t) - (5 font-lock-comment-face nil t))) - '("^\\(X-[A-Za-z0-9-]+\\|In-reply-to\\):.*\\(\n[ \t]+.*\\)*$" - . font-lock-string-face)))) - "Additional expressions to highlight in Mail mode.") - - -(defun sendmail-sync-aliases () - (when mail-personal-alias-file - (let ((modtime (nth 5 (file-attributes mail-personal-alias-file)))) - (or (equal mail-alias-modtime modtime) - (setq mail-alias-modtime modtime - mail-aliases t))))) - -(defun mail-setup (to subject in-reply-to cc replybuffer actions) - (or mail-default-reply-to - (setq mail-default-reply-to (getenv "REPLYTO"))) - (sendmail-sync-aliases) - (if (eq mail-aliases t) - (progn - (setq mail-aliases nil) - (when mail-personal-alias-file - (if (file-exists-p mail-personal-alias-file) - (build-mail-aliases))))) - ;; Don't leave this around from a previous message. - (kill-local-variable 'buffer-file-coding-system) - ;; This doesn't work for enable-multibyte-characters. - ;; (kill-local-variable 'enable-multibyte-characters) - (set-buffer-multibyte default-enable-multibyte-characters) - (if current-input-method - (inactivate-input-method)) - (setq mail-send-actions actions) - (setq mail-reply-action replybuffer) - (goto-char (point-min)) - (if mail-setup-with-from - (mail-insert-from-field)) - (insert "To: ") - (save-excursion - (if to - ;; Here removed code to extract names from within <...> - ;; on the assumption that mail-strip-quoted-names - ;; has been called and has done so. - (let ((fill-prefix "\t") - (address-start (point))) - (insert to "\n") - (fill-region-as-paragraph address-start (point-max)) - (goto-char (point-max)) - (unless (bolp) - (newline))) - (newline)) - (if cc - (let ((fill-prefix "\t") - (address-start (progn (insert "CC: ") (point)))) - (insert cc "\n") - (fill-region-as-paragraph address-start (point-max)) - (goto-char (point-max)) - (unless (bolp) - (newline)))) - (if in-reply-to - (let ((fill-prefix "\t") - (fill-column 78) - (address-start (point))) - (insert "In-reply-to: " in-reply-to "\n") - (fill-region-as-paragraph address-start (point-max)) - (goto-char (point-max)) - (unless (bolp) - (newline)))) - (insert "Subject: " (or subject "") "\n") - (if mail-default-headers - (insert mail-default-headers)) - (if mail-default-reply-to - (insert "Reply-to: " mail-default-reply-to "\n")) - (if mail-self-blind - (insert "BCC: " user-mail-address "\n")) - (if mail-archive-file-name - (insert "FCC: " mail-archive-file-name "\n")) - (put-text-property (point) - (progn - (insert mail-header-separator "\n") - (1- (point))) - 'category 'mail-header-separator) - ;; Insert the signature. But remember the beginning of the message. - (if to (setq to (point))) - (if mail-signature (mail-signature t)) - (goto-char (point-max)) - (or (bolp) (newline))) - (if to (goto-char to)) - (or to subject in-reply-to - (set-buffer-modified-p nil)) - (run-hooks 'mail-setup-hook)) - -(defcustom mail-mode-hook nil - "Hook run by Mail mode. -When composing a mail, this runs immediately after creating, or -switching to, the `*mail*' buffer. See also `mail-setup-hook'." - :group 'sendmail - :type 'hook - :options '(footnote-mode)) - -(defvar mail-mode-abbrev-table text-mode-abbrev-table) -;;;###autoload -(define-derived-mode mail-mode text-mode "Mail" - "Major mode for editing mail to be sent. -Like Text Mode but with these additional commands: - -\\[mail-send] mail-send (send the message) -\\[mail-send-and-exit] mail-send-and-exit (send the message and exit) - -Here are commands that move to a header field (and create it if there isn't): - \\[mail-to] move to To: \\[mail-subject] move to Subj: - \\[mail-bcc] move to BCC: \\[mail-cc] move to CC: - \\[mail-fcc] move to FCC: \\[mail-reply-to] move to Reply-To: - \\[mail-mail-reply-to] move to Mail-Reply-To: - \\[mail-mail-followup-to] move to Mail-Followup-To: -\\[mail-text] move to message text. -\\[mail-signature] mail-signature (insert `mail-signature-file' file). -\\[mail-yank-original] mail-yank-original (insert current message, in Rmail). -\\[mail-fill-yanked-message] mail-fill-yanked-message (fill what was yanked). -\\[mail-sent-via] mail-sent-via (add a sent-via field for each To or CC). -Turning on Mail mode runs the normal hooks `text-mode-hook' and -`mail-mode-hook' (in that order)." - (make-local-variable 'mail-reply-action) - (make-local-variable 'mail-send-actions) - (setq buffer-offer-save t) - (make-local-variable 'font-lock-defaults) - (setq font-lock-defaults '(mail-font-lock-keywords t t)) - (make-local-variable 'paragraph-separate) - (make-local-variable 'normal-auto-fill-function) - (setq normal-auto-fill-function 'mail-mode-auto-fill) - (make-local-variable 'fill-paragraph-function) - (setq fill-paragraph-function 'mail-mode-fill-paragraph) - ;; Allow using comment commands to add/remove quoting (this only does - ;; anything if mail-yank-prefix is set to a non-nil value). - (set (make-local-variable 'comment-start) mail-yank-prefix) - (if mail-yank-prefix - (set (make-local-variable 'comment-start-skip) - (concat "^" (regexp-quote mail-yank-prefix) "[ \t]*"))) - (make-local-variable 'adaptive-fill-regexp) - (setq adaptive-fill-regexp - (concat "[ \t]*[-[:alnum:]]+>+[ \t]*\\|" - adaptive-fill-regexp)) - (make-local-variable 'adaptive-fill-first-line-regexp) - (setq adaptive-fill-first-line-regexp - (concat "[ \t]*[-[:alnum:]]*>+[ \t]*\\|" - adaptive-fill-first-line-regexp)) - ;; `-- ' precedes the signature. `-----' appears at the start of the - ;; lines that delimit forwarded messages. - ;; Lines containing just >= 3 dashes, perhaps after whitespace, - ;; are also sometimes used and should be separators. - (setq paragraph-separate (concat (regexp-quote mail-header-separator) - "$\\|\t*\\([-|#;>* ]\\|(?[0-9]+[.)]\\)+$" - "\\|[ \t]*[[:alnum:]]*>+[ \t]*$\\|[ \t]*$\\|" - "--\\( \\|-+\\)$\\|" - page-delimiter))) - - -(defun mail-header-end () - "Return the buffer location of the end of headers, as a number." - (save-restriction - (widen) - (save-excursion - (rfc822-goto-eoh) - (point)))) - -(defun mail-text-start () - "Return the buffer location of the start of text, as a number." - (save-restriction - (widen) - (save-excursion - (rfc822-goto-eoh) - (forward-line 1) - (point)))) - -(defun mail-sendmail-delimit-header () - "Set up whatever header delimiter convention sendmail will use. -Concretely: replace the first blank line in the header with the separator." - (rfc822-goto-eoh) - (insert mail-header-separator) - (point)) - -(defun mail-sendmail-undelimit-header () - "Remove header separator to put the message in correct form for sendmail. -Leave point at the start of the delimiter line." - (rfc822-goto-eoh) - (delete-region (point) (progn (end-of-line) (point)))) - -(defun mail-mode-auto-fill () - "Carry out Auto Fill for Mail mode. -If within the headers, this makes the new lines into continuation lines." - (if (< (point) (mail-header-end)) - (let ((old-line-start (save-excursion (beginning-of-line) (point)))) - (if (do-auto-fill) - (save-excursion - (beginning-of-line) - (while (not (eq (point) old-line-start)) - ;; Use insert-before-markers in case we're inserting - ;; before the saved value of point (which is common). - (insert-before-markers " ") - (forward-line -1)) - t))) - (do-auto-fill))) - -(defun mail-mode-fill-paragraph (arg) - ;; Do something special only if within the headers. - (if (< (point) (mail-header-end)) - (let (beg end fieldname) - (when (prog1 (re-search-backward "^[-a-zA-Z]+:" nil 'yes) - (setq beg (point))) - (setq fieldname - (downcase (buffer-substring beg (1- (match-end 0)))))) - (forward-line 1) - ;; Find continuation lines and get rid of their continuation markers. - (while (looking-at "[ \t]") - (delete-horizontal-space) - (forward-line 1)) - (setq end (point-marker)) - (goto-char beg) - ;; If this field contains addresses, - ;; make sure we can fill after each address. - (if (member fieldname - '("to" "cc" "bcc" "from" "reply-to" - "mail-reply-to" "mail-followup-to" - "resent-to" "resent-cc" "resent-bcc" - "resent-from" "resent-reply-to")) - (while (search-forward "," end t) - (or (looking-at "[ \t]") - (insert " ")))) - (fill-region-as-paragraph beg end arg) - ;; Mark all lines except the first as continuations. - (goto-char beg) - (forward-line 1) - (while (< (point) end) - (insert " ") - (forward-line 1)) - (move-marker end nil) - t))) - -;; User-level commands for sending. - -(defun mail-send-and-exit (&optional arg) - "Send message like `mail-send', then, if no errors, exit from mail buffer. -Prefix arg means don't delete this window." - (interactive "P") - (mail-send) - (mail-bury arg)) - -(defun mail-dont-send (&optional arg) - "Don't send the message you have been editing. -Prefix arg means don't delete this window." - (interactive "P") - (mail-bury arg)) - -(defun mail-bury (&optional arg) - "Bury this mail buffer." - (let ((newbuf (other-buffer (current-buffer)))) - (bury-buffer (current-buffer)) - (if (and (or nil - ;; In this case, we need to go to a different frame. - (window-dedicated-p (frame-selected-window)) - ;; In this mode of operation, the frame was probably - ;; made for this buffer, so the user probably wants - ;; to delete it now. - (and pop-up-frames (one-window-p)) - (cdr (assq 'mail-dedicated-frame (frame-parameters)))) - (not (null (delq (selected-frame) (visible-frame-list))))) - (progn - (if (display-multi-frame-p) - (delete-frame (selected-frame)) - ;; The previous frame is where normally they have the - ;; Rmail buffer displayed. - (other-frame -1))) - (let (rmail-flag summary-buffer) - (and (not arg) - (not (one-window-p)) - (with-current-buffer - (window-buffer (next-window (selected-window) 'not)) - (setq rmail-flag (eq major-mode 'rmail-mode)) - (setq summary-buffer - (and mail-bury-selects-summary - (boundp 'rmail-summary-buffer) - rmail-summary-buffer - (buffer-name rmail-summary-buffer) - (not (get-buffer-window rmail-summary-buffer)) - rmail-summary-buffer)))) - (if rmail-flag - ;; If the Rmail buffer has a summary, show that. - (if summary-buffer (switch-to-buffer summary-buffer) - (delete-window)) - (switch-to-buffer newbuf)))))) - -(defcustom mail-send-hook nil - "Hook run just before sending mail with `mail-send'." - :type 'hook - :options '(flyspell-mode-off) - :group 'sendmail) - -;;;###autoload -(defcustom mail-mailing-lists nil -"List of mailing list addresses the user is subscribed to. -The variable is used to trigger insertion of the \"Mail-Followup-To\" -header when sending a message to a mailing list." - :type '(repeat string) - :group 'sendmail) - - -(defun mail-send () - "Send the message in the current buffer. -If `mail-interactive' is non-nil, wait for success indication -or error messages, and inform user. -Otherwise any failure is reported in a message back to -the user from the mailer." - (interactive) - (if (if buffer-file-name - (y-or-n-p "Send buffer contents as mail message? ") - (or (buffer-modified-p) - (y-or-n-p "Message already sent; resend? "))) - (let ((inhibit-read-only t) - (opoint (point)) - (ml (when mail-mailing-lists - ;; The surrounding regexp assumes the use of - ;; `mail-strip-quoted-names' on addresses before matching - ;; Cannot deal with full RFC 822 freedom, but that is - ;; unlikely to be problematic. - (concat "\\(?:[[:space:];,]\\|\\`\\)" - (regexp-opt mail-mailing-lists t) - "\\(?:[[:space:];,]\\|\\'\\)")))) - ;; If there are mailing lists defined - (when ml - (save-excursion - (let* ((to (mail-fetch-field "to" nil t)) - (cc (mail-fetch-field "cc" nil t)) - (new-header-values ; To: and Cc: - (mail-strip-quoted-names - (concat to (when cc (concat ", " cc)))))) - ;; If message goes to known mailing list ... - (when (string-match ml new-header-values) - ;; Add Mail-Followup-To if none yet - (unless (mail-fetch-field "mail-followup-to") - (goto-char (mail-header-end)) - (insert "Mail-Followup-To: " - (let ((l)) - (mapc - ;; remove duplicates - '(lambda (e) - (unless (member e l) - (push e l))) - (split-string new-header-values - ",[[:space:]]+" t)) - (mapconcat 'identity l ", ")) - "\n")) - ;; Add Mail-Reply-To if none yet - (unless (mail-fetch-field "mail-reply-to") - (goto-char (mail-header-end)) - (insert "Mail-Reply-To: " - (or (mail-fetch-field "reply-to") - user-mail-address) - "\n")))))) - (unless (memq mail-send-nonascii '(t mime)) - (goto-char (point-min)) - (skip-chars-forward "\0-\177") - (or (= (point) (point-max)) - (if (eq mail-send-nonascii 'query) - (or (y-or-n-p "Message contains non-ASCII characters; send anyway? ") - (error "Aborted")) - (error "Message contains non-ASCII characters")))) - ;; Complain about any invalid line. - (goto-char (point-min)) - (re-search-forward (regexp-quote mail-header-separator) (point-max) t) - (let ((header-end (or (match-beginning 0) (point-max)))) - (goto-char (point-min)) - (while (< (point) header-end) - (unless (looking-at "[ \t]\\|.*:\\|$") - (push-mark opoint) - (error "Invalid header line (maybe a continuation line lacks initial whitespace)")) - (forward-line 1))) - (goto-char opoint) - (run-hooks 'mail-send-hook) - (message "Sending...") - (funcall send-mail-function) - ;; Now perform actions on successful sending. - (while mail-send-actions - (condition-case nil - (apply (car (car mail-send-actions)) - (cdr (car mail-send-actions))) - (error)) - (setq mail-send-actions (cdr mail-send-actions))) - (message "Sending...done") - ;; If buffer has no file, mark it as unmodified and delete auto-save. - (if (not buffer-file-name) - (progn - (set-buffer-modified-p nil) - (delete-auto-save-file-if-necessary t)))))) - -(defun mail-envelope-from () - "Return the envelope mail address to use when sending mail. -This function uses `mail-envelope-from'." - (if (eq mail-envelope-from 'header) - (nth 1 (mail-extract-address-components - (mail-fetch-field "From"))) - mail-envelope-from)) - -;; This does the real work of sending a message via sendmail. -;; It is called via the variable send-mail-function. - -;;;###autoload -(defvar sendmail-coding-system nil - "*Coding system for encoding the outgoing mail. -This has higher priority than `default-buffer-file-coding-system' -and `default-sendmail-coding-system', -but lower priority than the local value of `buffer-file-coding-system'. -See also the function `select-message-coding-system'.") - -;;;###autoload -(defvar default-sendmail-coding-system 'iso-latin-1 - "Default coding system for encoding the outgoing mail. -This variable is used only when `sendmail-coding-system' is nil. - -This variable is set/changed by the command `set-language-environment'. -User should not set this variable manually, -instead use `sendmail-coding-system' to get a constant encoding -of outgoing mails regardless of the current language environment. -See also the function `select-message-coding-system'.") - -(defun mail-insert-from-field () - (let* ((login user-mail-address) - (fullname (user-full-name)) - (quote-fullname nil)) - (if (string-match "[^\0-\177]" fullname) - (setq fullname (rfc2047-encode-string fullname) - quote-fullname t)) - (cond ((eq mail-from-style 'angles) - (insert "From: " fullname) - (let ((fullname-start (+ (point-min) 6)) - (fullname-end (point-marker))) - (goto-char fullname-start) - ;; Look for a character that cannot appear unquoted - ;; according to RFC 822. - (if (or (re-search-forward "[^- !#-'*+/-9=?A-Z^-~]" - fullname-end 1) - quote-fullname) - (progn - ;; Quote fullname, escaping specials. - (goto-char fullname-start) - (insert "\"") - (while (re-search-forward "[\"\\]" - fullname-end 1) - (replace-match "\\\\\\&" t)) - (insert "\"")))) - (insert " <" login ">\n")) - ((eq mail-from-style 'parens) - (insert "From: " login " (") - (let ((fullname-start (point))) - (if quote-fullname - (insert "\"")) - (insert fullname) - (if quote-fullname - (insert "\"")) - (let ((fullname-end (point-marker))) - (goto-char fullname-start) - ;; RFC 822 says \ and nonmatching parentheses - ;; must be escaped in comments. - ;; Escape every instance of ()\ ... - (while (re-search-forward "[()\\]" fullname-end 1) - (replace-match "\\\\\\&" t)) - ;; ... then undo escaping of matching parentheses, - ;; including matching nested parentheses. - (goto-char fullname-start) - (while (re-search-forward - "\\(\\=\\|[^\\]\\(\\\\\\\\\\)*\\)\\\\(\\(\\([^\\]\\|\\\\\\\\\\)*\\)\\\\)" - fullname-end 1) - (replace-match "\\1(\\3)" t) - (goto-char fullname-start)))) - (insert ")\n")) - ((null mail-from-style) - (insert "From: " login "\n")) - ((eq mail-from-style 'system-default) - nil) - (t (error "Invalid value for `mail-from-style'"))))) - -;; Normally you will not need to modify these options unless you are -;; using some non-genuine substitute for sendmail which does not -;; implement each and every option that the original supports. -;; E.g., ssmtp does not support "-odb", so, if your site uses it, -;; you will need to modify `sendmail-error-reporting-non-interactive' -;; in your site-init.el. -(defvar sendmail-error-reporting-interactive - ;; These mean "report errors to terminal" and "deliver interactively" - '("-oep" "-odi")) -(defvar sendmail-error-reporting-non-interactive - ;; These mean "report errors by mail" and "deliver in background". - '("-oem" "-odb")) - -(defun sendmail-send-it () - "Send the current mail buffer using the Sendmail package. -This is a suitable value for `send-mail-function'. It sends using the -external program defined by `sendmail-program'." - (require 'mail-utils) - (let ((errbuf (if mail-interactive - (generate-new-buffer " sendmail errors") - 0)) - (tembuf (generate-new-buffer " sendmail temp")) - (multibyte enable-multibyte-characters) - (case-fold-search nil) - (selected-coding (select-message-coding-system)) - resend-to-addresses - delimline - fcc-was-found - (mailbuf (current-buffer)) - (program (if (boundp 'sendmail-program) - sendmail-program - "/usr/lib/sendmail")) - ;; Examine these variables now, so that - ;; local binding in the mail buffer will take effect. - (envelope-from - (and mail-specify-envelope-from - (or (mail-envelope-from) user-mail-address)))) - (unwind-protect - (with-current-buffer tembuf - (erase-buffer) - (unless multibyte - (set-buffer-multibyte nil)) - (insert-buffer-substring mailbuf) - (goto-char (point-max)) - ;; require one newline at the end. - (or (= (preceding-char) ?\n) - (insert ?\n)) - ;; Change header-delimiter to be what sendmail expects. - (goto-char (mail-header-end)) - (delete-region (point) (progn (end-of-line) (point))) - (setq delimline (point-marker)) - (sendmail-sync-aliases) - (if mail-aliases - (expand-mail-aliases (point-min) delimline)) - (goto-char (point-min)) - ;; Ignore any blank lines in the header - (while (and (re-search-forward "\n\n\n*" delimline t) - (< (point) delimline)) - (replace-match "\n")) - (goto-char (point-min)) - ;; Look for Resent- headers. They require sending - ;; the message specially. - (let ((case-fold-search t)) - (goto-char (point-min)) - (while (re-search-forward "^Resent-\\(to\\|cc\\|bcc\\):" delimline t) - ;; Put a list of such addresses in resend-to-addresses. - (setq resend-to-addresses - (save-restriction - (narrow-to-region (point) - (save-excursion - (forward-line 1) - (while (looking-at "^[ \t]") - (forward-line 1)) - (point))) - (append (mail-parse-comma-list) - resend-to-addresses))) - ;; Delete Resent-BCC ourselves - (if (save-excursion (beginning-of-line) - (looking-at "resent-bcc")) - (delete-region (save-excursion (beginning-of-line) (point)) - (save-excursion (end-of-line) (1+ (point)))))) -;;; Apparently this causes a duplicate Sender. -;;; ;; If the From is different than current user, insert Sender. -;;; (goto-char (point-min)) -;;; (and (re-search-forward "^From:" delimline t) -;;; (progn -;;; (require 'mail-utils) -;;; (not (string-equal -;;; (mail-strip-quoted-names -;;; (save-restriction -;;; (narrow-to-region (point-min) delimline) -;;; (mail-fetch-field "From"))) -;;; (user-login-name)))) -;;; (progn -;;; (forward-line 1) -;;; (insert "Sender: " (user-login-name) "\n"))) - ;; Don't send out a blank subject line - (goto-char (point-min)) - (if (re-search-forward "^Subject:\\([ \t]*\n\\)+\\b" delimline t) - (replace-match "") - ;; This one matches a Subject just before the header delimiter. - (if (and (re-search-forward "^Subject:\\([ \t]*\n\\)+" delimline t) - (= (match-end 0) delimline)) - (replace-match ""))) - ;; Put the "From:" field in unless for some odd reason - ;; they put one in themselves. - (goto-char (point-min)) - (if (not (re-search-forward "^From:" delimline t)) - (mail-insert-from-field)) - ;; Possibly add a MIME header for the current coding system - (let (charset where-content-type) - (goto-char (point-min)) - (setq where-content-type - (re-search-forward "^Content-type:" delimline t)) - (goto-char (point-min)) - (and (eq mail-send-nonascii 'mime) - (not (re-search-forward "^MIME-version:" delimline t)) - (progn (skip-chars-forward "\0-\177") - (/= (point) (point-max))) - selected-coding - (setq charset - (coding-system-get selected-coding 'mime-charset)) - (progn - (goto-char delimline) - (insert "MIME-version: 1.0\n" - "Content-type: text/plain; charset=" - (symbol-name charset) - "\nContent-Transfer-Encoding: 8bit\n") - ;; The character set we will actually use - ;; should override any specified in the message itself. - (when where-content-type - (goto-char where-content-type) - (beginning-of-line) - (delete-region (point) - (progn (forward-line 1) (point))))))) - ;; Insert an extra newline if we need it to work around - ;; Sun's bug that swallows newlines. - (goto-char (1+ delimline)) - (if (eval mail-mailer-swallows-blank-line) - (newline)) - ;; Find and handle any FCC fields. - (goto-char (point-min)) - (if (re-search-forward "^FCC:" delimline t) - (progn - (setq fcc-was-found t) - (mail-do-fcc delimline))) - (if mail-interactive - (with-current-buffer errbuf - (erase-buffer)))) - (goto-char (point-min)) - (if (let ((case-fold-search t)) - (or resend-to-addresses - (re-search-forward "^To:\\|^cc:\\|^bcc:" - delimline t))) - (let* ((default-directory "/") - (coding-system-for-write selected-coding) - (args - (append (list (point-min) (point-max) - program - nil errbuf nil "-oi") - (and envelope-from - (list "-f" envelope-from)) -;;; ;; Don't say "from root" if running under su. -;;; (and (equal (user-real-login-name) "root") -;;; (list "-f" (user-login-name))) - (and mail-alias-file - (list (concat "-oA" mail-alias-file))) - (if mail-interactive - sendmail-error-reporting-interactive - sendmail-error-reporting-non-interactive) - ;; Get the addresses from the message - ;; unless this is a resend. - ;; We must not do that for a resend - ;; because we would find the original addresses. - ;; For a resend, include the specific addresses. - (or resend-to-addresses - '("-t") - ) - (if mail-use-dsn - (list "-N" (mapconcat 'symbol-name - mail-use-dsn ","))) - ) - ) - (exit-value (apply 'call-process-region args))) - (cond ((or (null exit-value) (eq 0 exit-value))) - ((numberp exit-value) - (error "Sending...failed with exit value %d" exit-value)) - ((stringp exit-value) - (error "Sending...terminated by signal: %s" exit-value)) - (t - (error "SENDMAIL-SEND-IT -- fall through: %S" exit-value)))) - (or fcc-was-found - (error "No recipients"))) - (if mail-interactive - (with-current-buffer errbuf - (goto-char (point-min)) - (while (re-search-forward "\n\n* *" nil t) - (replace-match "; ")) - (if (not (zerop (buffer-size))) - (error "Sending...failed to %s" - (buffer-substring (point-min) (point-max))))))) - (kill-buffer tembuf) - (if (bufferp errbuf) - (kill-buffer errbuf))))) - -(autoload 'rmail-output-to-rmail-buffer "rmailout") - -(defun mail-do-fcc (header-end) - "Find and act on any FCC: headers in the current message before HEADER-END. -If a buffer is visiting the FCC file, append to it before -offering to save it, if it was modified initially. If this is an -Rmail buffer, update Rmail as needed. If there is no buffer, -just append to the file, in Babyl format if necessary." - (unless (markerp header-end) - (error "Value of `header-end' must be a marker")) - (let (fcc-list - (mailbuf (current-buffer)) - (time (current-time))) - (save-excursion - (goto-char (point-min)) - (let ((case-fold-search t)) - (while (re-search-forward "^FCC:[ \t]*" header-end t) - (push (buffer-substring (point) - (progn - (end-of-line) - (skip-chars-backward " \t") - (point))) - fcc-list) - (delete-region (match-beginning 0) - (progn (forward-line 1) (point))))) - (with-temp-buffer - ;; This initial newline is not written out if we create a new - ;; file (see below). - (insert "\nFrom " (user-login-name) " " (current-time-string time) "\n") - ;; Insert the time zone before the year. - (forward-char -1) - (forward-word -1) - (require 'mail-utils) - (insert (mail-rfc822-time-zone time) " ") - (goto-char (point-max)) - (insert-buffer-substring mailbuf) - ;; Make sure messages are separated. - (goto-char (point-max)) - (insert ?\n) - (goto-char 2) - ;; ``Quote'' "^From " as ">From " - ;; (note that this isn't really quoting, as there is no requirement - ;; that "^[>]+From " be quoted in the same transparent way.) - (let ((case-fold-search nil)) - (while (search-forward "\nFrom " nil t) - (forward-char -5) - (insert ?>))) - (dolist (fcc fcc-list) - (let* ((buffer (find-buffer-visiting fcc)) - (curbuf (current-buffer)) - dont-write-the-file - buffer-matches-file - (beg (point-min)) ; the initial blank line - (end (point-max)) - ;; After the ^From line. - (beg2 (save-excursion (goto-char (point-min)) - (forward-line 2) (point)))) - (if buffer - ;; File is present in a buffer => append to that buffer. - (with-current-buffer buffer - (setq buffer-matches-file - (and (not (buffer-modified-p)) - (verify-visited-file-modtime buffer))) - (let ((msg (bound-and-true-p rmail-current-message)) - (buffer-read-only nil)) - ;; If MSG is non-nil, buffer is in Rmail mode. - (if msg - (let ((buff (generate-new-buffer " *mail-do-fcc"))) - (unwind-protect - (progn - (with-current-buffer buff - (insert-buffer-substring curbuf (1+ beg) end)) - (rmail-output-to-rmail-buffer buff msg)) - (kill-buffer buff))) - ;; Output file not in Rmail mode => just insert - ;; at the end. - (save-restriction - (widen) - (goto-char (point-max)) - (insert-buffer-substring curbuf beg end))) - ;; Offer to save the buffer if it was modified - ;; before we started. - (unless buffer-matches-file - (if (y-or-n-p (format "Save file %s? " fcc)) - (save-buffer)) - (setq dont-write-the-file t))))) - ;; Append to the file directly, unless we've already taken - ;; care of it. - (unless dont-write-the-file - (if (and (file-exists-p fcc) - (mail-file-babyl-p fcc)) - ;; If the file is a Babyl file, convert the message to - ;; Babyl format. Even though Rmail no longer uses - ;; Babyl, this code can remain for the time being, on - ;; the off-chance one FCCs to a Babyl file that has - ;; not yet been converted to mbox. - (let ((coding-system-for-write - (or rmail-file-coding-system 'emacs-mule))) - (with-temp-buffer - (insert "\C-l\n0, unseen,,\n*** EOOH ***\nDate: " - (mail-rfc822-date) "\n") - (insert-buffer-substring curbuf beg2 end) - (insert "\n\C-_") - (write-region (point-min) (point-max) fcc t))) - ;; Ensure there is a blank line between messages, but - ;; not at the very start of the file. - (write-region (if (file-exists-p fcc) - (point-min) - (1+ (point-min))) - (point-max) fcc t))) - (and buffer (not dont-write-the-file) - (with-current-buffer buffer - (set-visited-file-modtime))))))))) - -(defun mail-sent-via () - "Make a Sent-via header line from each To or CC header line." - (interactive) - (save-excursion - ;; put a marker at the end of the header - (let ((end (copy-marker (mail-header-end))) - (case-fold-search t)) - (goto-char (point-min)) - ;; search for the To: lines and make Sent-via: lines from them - ;; search for the next To: line - (while (re-search-forward "^\\(to\\|cc\\):" end t) - ;; Grab this line plus all its continuations, sans the `to:'. - (let ((to-line - (buffer-substring (point) - (progn - (if (re-search-forward "^[^ \t\n]" end t) - (backward-char 1) - (goto-char end)) - (point))))) - ;; Insert a copy, with altered header field name. - (insert-before-markers "Sent-via:" to-line)))))) - -(defun mail-to () - "Move point to end of To field, creating it if necessary." - (interactive) - (expand-abbrev) - (mail-position-on-field "To")) - -(defun mail-subject () - "Move point to end of Subject field, creating it if necessary." - (interactive) - (expand-abbrev) - (mail-position-on-field "Subject")) - -(defun mail-cc () - "Move point to end of CC field, creating it if necessary." - (interactive) - (expand-abbrev) - (or (mail-position-on-field "cc" t) - (progn (mail-position-on-field "to") - (insert "\nCC: ")))) - -(defun mail-bcc () - "Move point to end of BCC field, creating it if necessary." - (interactive) - (expand-abbrev) - (or (mail-position-on-field "bcc" t) - (progn (mail-position-on-field "to") - (insert "\nBCC: ")))) - -(defun mail-fcc (folder) - "Add a new FCC field, with file name completion." - (interactive "FFolder carbon copy: ") - (expand-abbrev) - (or (mail-position-on-field "fcc" t) ;Put new field after exiting FCC. - (mail-position-on-field "to")) - (insert "\nFCC: " folder)) - -(defun mail-reply-to () - "Move point to end of Reply-To field, creating it if necessary." - (interactive) - (expand-abbrev) - (mail-position-on-field "Reply-To")) - -(defun mail-mail-reply-to () - "Move point to end of Mail-Reply-To field, creating it if necessary." - (interactive) - (expand-abbrev) - (or (mail-position-on-field "mail-reply-to" t) - (progn (mail-position-on-field "to") - (insert "\nMail-Reply-To: ")))) - -(defun mail-mail-followup-to () - "Move point to end of Mail-Followup-To field, creating it if necessary." - (interactive) - (expand-abbrev) - (or (mail-position-on-field "mail-followup-to" t) - (progn (mail-position-on-field "to") - (insert "\nMail-Followup-To: ")))) - -(defun mail-position-on-field (field &optional soft) - (let (end - (case-fold-search t)) - (setq end (mail-header-end)) - (goto-char (point-min)) - (if (re-search-forward (concat "^" (regexp-quote field) ":") end t) - (progn - (re-search-forward "^[^ \t]" nil 'move) - (beginning-of-line) - (skip-chars-backward "\n") - t) - (or soft - (progn (goto-char end) - (insert field ": \n") - (skip-chars-backward "\n"))) - nil))) - -(defun mail-text () - "Move point to beginning of text field." - (interactive) - (expand-abbrev) - (goto-char (mail-text-start))) - -(defun mail-signature (&optional atpoint) - "Sign letter with signature. -If the variable `mail-signature' is a string, inserts it. -If it is t or nil, inserts the contents of the file `mail-signature-file'. -Otherwise, evals `mail-signature'. -Prefix argument ATPOINT means insert at point rather than the end." - (interactive "*P") - ;; Test for an unreadable file here, before we delete trailing - ;; whitespace, so that we don't modify the buffer needlessly. - (if (and (memq mail-signature '(t nil)) - (not (file-readable-p mail-signature-file))) - (if (interactive-p) - (message "The signature file `%s' could not be read" - mail-signature-file)) - (save-excursion - (unless atpoint - (goto-char (point-max)) - ;; Delete trailing whitespace and blank lines. - (skip-chars-backward " \t\n") - (end-of-line) - (delete-region (point) (point-max))) - (cond ((stringp mail-signature) - (insert mail-signature)) - ((memq mail-signature '(t nil)) - (insert "\n\n-- \n") - (insert-file-contents (expand-file-name mail-signature-file))) - (t - ;; FIXME add condition-case error handling? - (eval mail-signature)))))) - -(defun mail-fill-yanked-message (&optional justifyp) - "Fill the paragraphs of a message yanked into this one. -Numeric argument means justify as well." - (interactive "P") - (save-excursion - (goto-char (mail-text-start)) - (fill-individual-paragraphs (point) - (point-max) - justifyp - mail-citation-prefix-regexp))) - -(defun mail-indent-citation () - "Modify text just inserted from a message to be cited. -The inserted text should be the region. -When this function returns, the region is again around the modified text. - -Normally, indent each nonblank line `mail-indentation-spaces' spaces. -However, if `mail-yank-prefix' is non-nil, insert that prefix on each line." - (mail-yank-clear-headers (region-beginning) (region-end)) - (if (null mail-yank-prefix) - (indent-rigidly (region-beginning) (region-end) - mail-indentation-spaces) - (save-excursion - (let ((end (set-marker (make-marker) (region-end)))) - (goto-char (region-beginning)) - (while (< (point) end) - (insert mail-yank-prefix) - (forward-line 1)))))) - -(defun mail-yank-original (arg) - "Insert the message being replied to, if any (in Rmail). -Puts point after the text and mark before. -Normally, indents each nonblank line ARG spaces (default 3). -However, if `mail-yank-prefix' is non-nil, insert that prefix on each line. - -Just \\[universal-argument] as argument means don't indent, insert no prefix, -and don't delete any header fields." - (interactive "P") - (if mail-reply-action - (let ((start (point)) - (original mail-reply-action)) - (and (consp original) (eq (car original) 'insert-buffer) - (setq original (nth 1 original))) - (if (consp original) - (apply (car original) (cdr original)) - ;; If the original message is in another window in the same frame, - ;; delete that window to save screen space. - ;; t means don't alter other frames. - (delete-windows-on original t) - (with-no-warnings - ;; We really want this to set mark. - (insert-buffer original)) - (set-text-properties (point) (mark t) nil)) - (if (consp arg) - nil - (goto-char start) - (let ((mail-indentation-spaces (if arg (prefix-numeric-value arg) - mail-indentation-spaces)) - ;; Avoid error in Transient Mark mode - ;; on account of mark's being inactive. - (mark-even-if-inactive t)) - (cond (mail-citation-hook - ;; Bind mail-citation-header to the inserted - ;; message's header. - (let ((mail-citation-header - (buffer-substring-no-properties - start - (save-excursion - (save-restriction - (narrow-to-region start (point-max)) - (goto-char start) - (rfc822-goto-eoh) - (point)))))) - (run-hooks 'mail-citation-hook))) - (mail-yank-hooks - (run-hooks 'mail-yank-hooks)) - (t - (mail-indent-citation))))) - ;; This is like exchange-point-and-mark, but doesn't activate the mark. - ;; It is cleaner to avoid activation, even though the command - ;; loop would deactivate the mark because we inserted text. - (goto-char (prog1 (mark t) - (set-marker (mark-marker) (point) (current-buffer)))) - (if (not (eolp)) (insert ?\n))))) - -(defun mail-yank-clear-headers (start end) - (if (< end start) - (let (temp) - (setq temp start start end end temp))) - (if mail-yank-ignored-headers - (save-excursion - (goto-char start) - (if (search-forward "\n\n" end t) - (save-restriction - (narrow-to-region start (point)) - (goto-char start) - (while (let ((case-fold-search t)) - (re-search-forward mail-yank-ignored-headers nil t)) - (beginning-of-line) - (delete-region (point) - (progn (re-search-forward "\n[^ \t]") - (forward-char -1) - (point))))))))) - -(defun mail-yank-region (arg) - "Insert the selected region from the message being replied to. -Puts point after the text and mark before. -Normally, indents each nonblank line ARG spaces (default 3). -However, if `mail-yank-prefix' is non-nil, insert that prefix on each line. - -Just \\[universal-argument] as argument means don't indent, insert no prefix, -and don't delete any header fields." - (interactive "P") - (and (consp mail-reply-action) - (eq (car mail-reply-action) 'insert-buffer) - (with-current-buffer (nth 1 mail-reply-action) - (or (mark t) - (error "No mark set: %S" (current-buffer)))) - (let ((buffer (nth 1 mail-reply-action)) - (start (point)) - ;; Avoid error in Transient Mark mode - ;; on account of mark's being inactive. - (mark-even-if-inactive t)) - ;; Insert the citation text. - (insert (with-current-buffer buffer - (buffer-substring-no-properties (point) (mark)))) - (push-mark start) - ;; Indent or otherwise annotate the citation text. - (if (consp arg) - nil - (let ((mail-indentation-spaces (if arg (prefix-numeric-value arg) - mail-indentation-spaces))) - (if mail-citation-hook - ;; Bind mail-citation-header to the original message's header. - (let ((mail-citation-header - (with-current-buffer buffer - (buffer-substring-no-properties - (point-min) - (save-excursion - (goto-char (point-min)) - (rfc822-goto-eoh) - (point)))))) - (run-hooks 'mail-citation-hook)) - (if mail-yank-hooks - (run-hooks 'mail-yank-hooks) - (mail-indent-citation)))))))) - -(defun mail-split-line () - "Split current line, moving portion beyond point vertically down. -If the current line has `mail-yank-prefix', insert it on the new line." - (interactive "*") - (split-line mail-yank-prefix)) - - -(defun mail-attach-file (&optional file) - "Insert a file at the end of the buffer, with separator lines around it." - (interactive "fAttach file: ") - (save-excursion - (goto-char (point-max)) - (or (bolp) (newline)) - (newline) - (let ((start (point)) - middle) - (insert (format "===File %s===" file)) - (insert-char ?= (max 0 (- 60 (current-column)))) - (newline) - (setq middle (point)) - (insert "============================================================\n") - (push-mark) - (goto-char middle) - (insert-file-contents file) - (or (bolp) (newline)) - (goto-char start)))) - -;; Put these commands last, to reduce chance of lossage from quitting -;; in middle of loading the file. - -;;;###autoload (add-hook 'same-window-buffer-names "*mail*") - -;;;###autoload -(defun mail (&optional noerase to subject in-reply-to cc replybuffer actions) - "Edit a message to be sent. Prefix arg means resume editing (don't erase). -When this function returns, the buffer `*mail*' is selected. -The value is t if the message was newly initialized; otherwise, nil. - -Optionally, the signature file `mail-signature-file' can be inserted at the -end; see the variable `mail-signature'. - -\\ -While editing message, type \\[mail-send-and-exit] to send the message and exit. - -Various special commands starting with C-c are available in sendmail mode -to move to message header fields: -\\{mail-mode-map} - -If `mail-self-blind' is non-nil, a BCC to yourself is inserted -when the message is initialized. - -If `mail-default-reply-to' is non-nil, it should be an address (a string); -a Reply-to: field with that address is inserted. - -If `mail-archive-file-name' is non-nil, an FCC field with that file name -is inserted. - -The normal hook `mail-setup-hook' is run after the message is -initialized. It can add more default fields to the message. - -The first argument, NOERASE, determines what to do when there is -an existing modified `*mail*' buffer. If NOERASE is nil, the -existing mail buffer is used, and the user is prompted whether to -keep the old contents or to erase them. If NOERASE has the value -`new', a new mail buffer will be created instead of using the old -one. Any other non-nil value means to always select the old -buffer without erasing the contents. - -The second through fifth arguments, - TO, SUBJECT, IN-REPLY-TO and CC, specify if non-nil - the initial contents of those header fields. - These arguments should not have final newlines. -The sixth argument REPLYBUFFER is a buffer which contains an - original message being replied to, or else an action - of the form (FUNCTION . ARGS) which says how to insert the original. - Or it can be nil, if not replying to anything. -The seventh argument ACTIONS is a list of actions to take - if/when the message is sent. Each action looks like (FUNCTION . ARGS); - when the message is sent, we apply FUNCTION to ARGS. - This is how Rmail arranges to mark messages `answered'." - (interactive "P") -;;; This is commented out because I found it was confusing in practice. -;;; It is easy enough to rename *mail* by hand with rename-buffer -;;; if you want to have multiple mail buffers. -;;; And then you can control which messages to save. --rms. -;;; (let ((index 1) -;;; buffer) -;;; ;; If requested, look for a mail buffer that is modified and go to it. -;;; (if noerase -;;; (progn -;;; (while (and (setq buffer -;;; (get-buffer (if (= 1 index) "*mail*" -;;; (format "*mail*<%d>" index)))) -;;; (not (buffer-modified-p buffer))) -;;; (setq index (1+ index))) -;;; (if buffer (switch-to-buffer buffer) -;;; ;; If none exists, start a new message. -;;; ;; This will never re-use an existing unmodified mail buffer -;;; ;; (since index is not 1 anymore). Perhaps it should. -;;; (setq noerase nil)))) -;;; ;; Unless we found a modified message and are happy, start a new message. -;;; (if (not noerase) -;;; (progn -;;; ;; Look for existing unmodified mail buffer. -;;; (while (and (setq buffer -;;; (get-buffer (if (= 1 index) "*mail*" -;;; (format "*mail*<%d>" index)))) -;;; (buffer-modified-p buffer)) -;;; (setq index (1+ index))) -;;; ;; If none, make a new one. -;;; (or buffer -;;; (setq buffer (generate-new-buffer "*mail*"))) -;;; ;; Go there and initialize it. -;;; (switch-to-buffer buffer) -;;; (erase-buffer) -;;; (setq default-directory (expand-file-name "~/")) -;;; (auto-save-mode auto-save-default) -;;; (mail-mode) -;;; (mail-setup to subject in-reply-to cc replybuffer actions) -;;; (if (and buffer-auto-save-file-name -;;; (file-exists-p buffer-auto-save-file-name)) -;;; (message "Auto save file for draft message exists; consider M-x mail-recover")) -;;; t)) - - (if (eq noerase 'new) - (pop-to-buffer (generate-new-buffer "*mail*")) - (and noerase - (not (get-buffer "*mail*")) - (setq noerase nil)) - (pop-to-buffer "*mail*")) - - ;; Avoid danger that the auto-save file can't be written. - (let ((dir (expand-file-name - (file-name-as-directory mail-default-directory)))) - (if (file-exists-p dir) - (setq default-directory dir))) - ;; Only call auto-save-mode if necessary, to avoid changing auto-save file. - (if (or (and auto-save-default (not buffer-auto-save-file-name)) - (and (not auto-save-default) buffer-auto-save-file-name)) - (auto-save-mode auto-save-default)) - (mail-mode) - ;; Disconnect the buffer from its visited file - ;; (in case the user has actually visited a file *mail*). -;;; (set-visited-file-name nil) - (let (initialized) - (and (not (and noerase - (not (eq noerase 'new)))) - (if buffer-file-name - (if (buffer-modified-p) - (when (y-or-n-p "Buffer has unsaved changes; reinitialize it and discard them? ") - (if (y-or-n-p "Disconnect buffer from visited file? ") - (set-visited-file-name nil)) - t) - (when (y-or-n-p "Reinitialize buffer, and disconnect it from the visited file? ") - (set-visited-file-name nil) - t)) - ;; A non-file-visiting buffer. - (if (buffer-modified-p) - (y-or-n-p "Unsent message being composed; erase it? ") - t)) - (let ((inhibit-read-only t)) - (erase-buffer) - (mail-setup to subject in-reply-to cc replybuffer actions) - (setq initialized t))) - (if (and buffer-auto-save-file-name - (file-exists-p buffer-auto-save-file-name)) - (message "Auto save file for draft message exists; consider M-x mail-recover")) - initialized)) - -(declare-function dired-view-file "dired" ()) -(declare-function dired-get-filename "dired" (&optional localp no-error-if-not-filep)) - -(defun mail-recover-1 () - "Pop up a list of auto-saved draft messages so you can recover one of them." - (interactive) - (let ((file-name (make-auto-save-file-name)) - (ls-lisp-support-shell-wildcards t) - non-random-len wildcard) - ;; Remove the random part from the auto-save-file-name, and - ;; create a wildcard which matches possible candidates. - ;; Note: this knows that make-auto-save-file-name appends - ;; "##" to the buffer name, where RANDOM-STUFF - ;; is the result of (make-temp-name ""). - (setq non-random-len - (- (length file-name) (length (make-temp-name "")) 1)) - (setq wildcard (concat (substring file-name 0 non-random-len) "*")) - (if (null (file-expand-wildcards wildcard)) - (message "There are no auto-saved drafts to recover") - ;; Bind dired-trivial-filenames to t because all auto-save file - ;; names are normally ``trivial'', so Dired will set point after - ;; all the files, at buffer bottom. We want it on the first - ;; file instead. - (let ((dired-trivial-filenames t)) - (dired-other-window wildcard (concat dired-listing-switches "t"))) - (rename-buffer "*Auto-saved Drafts*" t) - (save-excursion - (goto-char (point-min)) - (or (looking-at " Move to the draft file you want to recover,") - (let ((inhibit-read-only t)) - ;; Each line starts with a space so that Font Lock mode - ;; won't highlight the first character. - (insert "\ - Move to the draft file you want to recover, then type C-c C-c - to recover text of message whose composition was interrupted. - To browse text of a draft, type v on the draft file's line. - - You can also delete some of these files; - type d on a line to mark that file for deletion. - - List of possible auto-save files for recovery: - -")))) - (use-local-map - (let ((map (make-sparse-keymap))) - (set-keymap-parent map (current-local-map)) - map)) - (define-key (current-local-map) "v" - (lambda () - (interactive) - (let ((coding-system-for-read 'emacs-mule-unix)) - (dired-view-file)))) - (define-key (current-local-map) "\C-c\C-c" - (lambda () - (interactive) - (let ((fname (dired-get-filename)) - ;; Auto-saved files are written in the internal - ;; representation, so they should be read accordingly. - (coding-system-for-read 'emacs-mule-unix)) - (switch-to-buffer-other-window "*mail*") - (let ((buffer-read-only nil)) - (erase-buffer) - (insert-file-contents fname nil) - ;; insert-file-contents will set buffer-file-coding-system - ;; to emacs-mule, which is probably not what they want to - ;; use for sending the message. But we don't know what - ;; was its value before the buffer was killed or Emacs - ;; crashed. We therefore reset buffer-file-coding-system - ;; to the default value, so that either the default does - ;; TRT, or the user will get prompted for the right - ;; encoding when they send the message. - (setq buffer-file-coding-system - default-buffer-file-coding-system)))))))) - -(declare-function dired-move-to-filename "dired" (&optional raise-error eol)) -(declare-function dired-get-filename "dired" (&optional localp no-error-if-not-filep)) -(declare-function dired-view-file "dired" ()) - -(defun mail-recover () - "Recover interrupted mail composition from auto-save files. - -If the mail buffer has a current valid auto-save file, -the command recovers that file. Otherwise, it displays a -buffer showing the existing auto-saved draft messages; -you can move to one of them and type C-c C-c to recover that one." - (interactive) - ;; In case they invoke us from some random buffer... - (switch-to-buffer "*mail*") - ;; If *mail* didn't exist, set its directory, so that auto-saved - ;; drafts will be found. - (let ((dir (expand-file-name - (file-name-as-directory mail-default-directory)))) - (if (file-exists-p dir) - (setq default-directory dir))) - (or (eq major-mode 'mail-mode) - (mail-mode)) - (let ((file-name buffer-auto-save-file-name)) - (cond ((and file-name (file-exists-p file-name)) - (let ((dispbuf - ;; This used to invoke `ls' via call-process, but - ;; dired-noselect is more portable to systems where - ;; `ls' is not a standard program (it will use - ;; ls-lisp instead). - (dired-noselect file-name - (concat dired-listing-switches "t")))) - (save-selected-window - (select-window (display-buffer dispbuf t)) - (goto-char (point-min)) - (forward-line 2) - (dired-move-to-filename) - (setq dispbuf (rename-buffer "*Directory*" t))) - (if (not (yes-or-no-p - (format "Recover mail draft from auto save file %s? " - file-name))) - (error "mail-recover cancelled") - (let ((buffer-read-only nil) - (buffer-coding buffer-file-coding-system) - ;; Auto-save files are written in internal - ;; representation of non-ASCII characters. - (coding-system-for-read 'emacs-mule-unix)) - (erase-buffer) - (insert-file-contents file-name nil) - (setq buffer-file-coding-system buffer-coding))))) - (t (mail-recover-1))))) - -;;;###autoload -(defun mail-other-window (&optional noerase to subject in-reply-to cc replybuffer sendactions) - "Like `mail' command, but display mail buffer in another window." - (interactive "P") - (let ((pop-up-windows t) - (special-display-buffer-names nil) - (special-display-regexps nil) - (same-window-buffer-names nil) - (same-window-regexps nil)) - (pop-to-buffer "*mail*")) - (mail noerase to subject in-reply-to cc replybuffer sendactions)) - -;;;###autoload -(defun mail-other-frame (&optional noerase to subject in-reply-to cc replybuffer sendactions) - "Like `mail' command, but display mail buffer in another frame." - (interactive "P") - (let ((pop-up-frames t) - (special-display-buffer-names nil) - (special-display-regexps nil) - (same-window-buffer-names nil) - (same-window-regexps nil)) - (pop-to-buffer "*mail*")) - (mail noerase to subject in-reply-to cc replybuffer sendactions)) - -;; Do not add anything but external entries on this page. - -(provide 'sendmail) - -;;; sendmail.el ends here diff --git a/contrib/smtpmail.el b/contrib/smtpmail.el deleted file mode 100644 index 43e84051e..000000000 --- a/contrib/smtpmail.el +++ /dev/null @@ -1,1040 +0,0 @@ -;;; smtpmail.el --- simple SMTP protocol (RFC 821) for sending mail - -;; Copyright (C) 1995, 1996, 2001, 2002, 2003, 2004, 2005, 2006, 2007, -;; 2008, 2009 Free Software Foundation, Inc. - -;; Author: Tomoji Kagatani -;; Maintainer: Simon Josefsson -;; w32 Maintainer: Brian D. Carlstrom -;; ESMTP support: Simon Leinen -;; Hacked by Mike Taylor, 11th October 1999 to add support for -;; automatically appending a domain to RCPT TO: addresses. -;; AUTH=LOGIN support: Stephen Cranefield -;; Keywords: mail - -;; This file is part of GNU Emacs. - -;; GNU Emacs 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 3 of the License, or -;; (at your option) any later version. - -;; GNU Emacs 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 GNU Emacs. If not, see . - -;;; Commentary: - -;; Send Mail to smtp host from smtpmail temp buffer. - -;; Please add these lines in your .emacs(_emacs) or use customize. -;; -;;(setq send-mail-function 'smtpmail-send-it) ; if you use `mail' -;;(setq message-send-mail-function 'smtpmail-send-it) ; if you use message/Gnus -;;(setq smtpmail-default-smtp-server "YOUR SMTP HOST") -;;(setq smtpmail-local-domain "YOUR DOMAIN NAME") -;;(setq smtpmail-sendto-domain "YOUR DOMAIN NAME") -;;(setq smtpmail-debug-info t) ; only to debug problems -;;(setq smtpmail-auth-credentials ; or use ~/.authinfo -;; '(("YOUR SMTP HOST" 25 "username" "password"))) -;;(setq smtpmail-starttls-credentials -;; '(("YOUR SMTP HOST" 25 "~/.my_smtp_tls.key" "~/.my_smtp_tls.cert"))) -;; Where the 25 equals the value of `smtpmail-smtp-service', it can be an -;; integer or a string, just as long as they match (eq). - -;; To queue mail, set smtpmail-queue-mail to t and use -;; smtpmail-send-queued-mail to send. - -;; Modified by Stephen Cranefield , -;; 22/6/99, to support SMTP Authentication by the AUTH=LOGIN mechanism. -;; See http://help.netscape.com/products/server/messaging/3x/info/smtpauth.html -;; Rewritten by Simon Josefsson to use same credential variable as AUTH -;; support below. - -;; Modified by Simon Josefsson , 22/2/99, to support SMTP -;; Authentication by the AUTH mechanism. -;; See http://www.ietf.org/rfc/rfc2554.txt - -;; Modified by Simon Josefsson , 2000-10-07, to support -;; STARTTLS. Requires external program -;; ftp://ftp.opaopa.org/pub/elisp/starttls-*.tar.gz. -;; See http://www.ietf.org/rfc/rfc2246.txt, http://www.ietf.org/rfc/rfc2487.txt - -;;; Code: - -;; This version of `smtpmail.el' should only be used with Emacs 21. -(if (featurep 'xemacs) - (error "Please use `smtpmail.el' from the mail-lib package.") - (when (>= emacs-major-version 22) - (error "Please use `smtpmail.el' bundled with Emacs."))) - -(require 'sendmail) -(autoload 'starttls-any-program-available "starttls") -(autoload 'starttls-open-stream "starttls") -(autoload 'starttls-negotiate "starttls") -(autoload 'mail-strip-quoted-names "mail-utils") -(autoload 'message-make-date "message") -(autoload 'message-make-message-id "message") -(autoload 'rfc2104-hash "rfc2104") -(autoload 'netrc-parse "netrc") -(autoload 'netrc-machine "netrc") -(autoload 'netrc-get "netrc") -(autoload 'auth-source-user-or-password "auth-source") - -;;; -(defgroup smtpmail nil - "SMTP protocol for sending mail." - :group 'mail) - - -(defcustom smtpmail-default-smtp-server nil - "*Specify default SMTP server. -This only has effect if you specify it before loading the smtpmail library." - :type '(choice (const nil) string) - :group 'smtpmail) - -(defcustom smtpmail-smtp-server - (or (getenv "SMTPSERVER") smtpmail-default-smtp-server) - "*The name of the host running SMTP server." - :type '(choice (const nil) string) - :group 'smtpmail) - -(defcustom smtpmail-smtp-service 25 - "*SMTP service port number. -The default value would be \"smtp\" or 25." - :type '(choice (integer :tag "Port") (string :tag "Service")) - :group 'smtpmail) - -(defcustom smtpmail-local-domain nil - "*Local domain name without a host name. -If the function `system-name' returns the full internet address, -don't define this value." - :type '(choice (const nil) string) - :group 'smtpmail) - -(defcustom smtpmail-sendto-domain nil - "*Local domain name without a host name. -This is appended (with an @-sign) to any specified recipients which do -not include an @-sign, so that each RCPT TO address is fully qualified. -\(Some configurations of sendmail require this.) - -Don't bother to set this unless you have get an error like: - Sending failed; SMTP protocol error -when sending mail, and the *trace of SMTP session to * -buffer includes an exchange like: - RCPT TO: - 501 : recipient address must contain a domain -" - :type '(choice (const nil) string) - :group 'smtpmail) - -(defcustom smtpmail-debug-info nil - "Whether to print info in buffer *trace of SMTP session to *. -See also `smtpmail-debug-verb' which determines if the SMTP protocol should -be verbose as well." - :type 'boolean - :group 'smtpmail) - -(defcustom smtpmail-debug-verb nil - "Whether this library sends the SMTP VERB command or not. -The commands enables verbose information from the SMTP server." - :type 'boolean - :group 'smtpmail) - -(defcustom smtpmail-code-conv-from nil ;; *junet* - "*smtpmail code convert from this code to *internal*..for tiny-mime.." - :type 'boolean - :group 'smtpmail) - -(defcustom smtpmail-queue-mail nil - "*If set, mail is queued; otherwise it is sent immediately. -If queued, it is stored in the directory `smtpmail-queue-dir' -and sent with `smtpmail-send-queued-mail'." - :type 'boolean - :group 'smtpmail) - -(defcustom smtpmail-queue-dir "~/Mail/queued-mail/" - "*Directory where `smtpmail.el' stores queued mail." - :type 'directory - :group 'smtpmail) - -(defcustom smtpmail-auth-credentials "~/.authinfo" - "Specify username and password for servers, directly or via .netrc file. -This variable can either be a filename pointing to a file in netrc(5) -format, or list of four-element lists that contain, in order, -`servername' (a string), `port' (an integer), `user' (a string) and -`password' (a string, or nil to query the user when needed). If you -need to enter a `realm' too, add it to the user string, so that it -looks like `user@realm'." - :type '(choice file - (repeat (list (string :tag "Server") - (integer :tag "Port") - (string :tag "Username") - (choice (const :tag "Query when needed" nil) - (string :tag "Password"))))) - :version "22.1" - :group 'smtpmail) - -(defcustom smtpmail-starttls-credentials '(("" 25 "" "")) - "Specify STARTTLS keys and certificates for servers. -This is a list of four-element list with `servername' (a string), -`port' (an integer), `key' (a filename) and `certificate' (a -filename). -If you do not have a certificate/key pair, leave the `key' and -`certificate' fields as `nil'. A key/certificate pair is only -needed if you want to use X.509 client authenticated -connections." - :type '(repeat (list (string :tag "Server") - (integer :tag "Port") - (file :tag "Key") - (file :tag "Certificate"))) - :version "21.1" - :group 'smtpmail) - -(defcustom smtpmail-warn-about-unknown-extensions nil - "*If set, print warnings about unknown SMTP extensions. -This is mainly useful for development purposes, to learn about -new SMTP extensions that might be useful to support." - :type 'boolean - :version "21.1" - :group 'smtpmail) - -(defvar smtpmail-queue-index-file "index" - "File name of queued mail index. -This is relative to `smtpmail-queue-dir'.") - -(defvar smtpmail-address-buffer) -(defvar smtpmail-recipient-address-list) - -(defvar smtpmail-queue-counter 0) - -;; Buffer-local variable. -(defvar smtpmail-read-point) - -(defvar smtpmail-queue-index (concat smtpmail-queue-dir - smtpmail-queue-index-file)) - -(defconst smtpmail-auth-supported '(cram-md5 plain login) - "List of supported SMTP AUTH mechanisms. -The list is in preference order.") - -;;; -;;; -;;; - -(defvar smtpmail-mail-address nil - "Value to use for envelope-from address for mail from ambient buffer.") - -;;;###autoload -(defun smtpmail-send-it () - (let ((errbuf (if mail-interactive - (generate-new-buffer " smtpmail errors") - 0)) - (tembuf (generate-new-buffer " smtpmail temp")) - (case-fold-search nil) - delimline - (mailbuf (current-buffer)) - ;; Examine this variable now, so that - ;; local binding in the mail buffer will take effect. - (smtpmail-mail-address - (or (and mail-specify-envelope-from (mail-envelope-from)) - user-mail-address)) - (smtpmail-code-conv-from - (if enable-multibyte-characters - (let ((sendmail-coding-system smtpmail-code-conv-from)) - (select-message-coding-system))))) - (unwind-protect - (save-excursion - (set-buffer tembuf) - (erase-buffer) - ;; Use the same buffer-file-coding-system as in the mail - ;; buffer, otherwise any write-region invocations (e.g., in - ;; mail-do-fcc below) will annoy with asking for a suitable - ;; encoding. - ;; - ;; This file (`gnus/contrib/smtpmail.el') is only useful for Emacs - ;; which doesn't support the third argument (NOMODIFY) of - ;; `set-buffer-file-coding-system'. - (set-buffer-file-coding-system smtpmail-code-conv-from nil) - (set-buffer-modified-p nil) - (force-mode-line-update) - (insert-buffer-substring mailbuf) - (goto-char (point-max)) - ;; require one newline at the end. - (or (= (preceding-char) ?\n) - (insert ?\n)) - ;; Change header-delimiter to be what sendmail expects. - (mail-sendmail-undelimit-header) - (setq delimline (point-marker)) -;; (sendmail-synch-aliases) - (if mail-aliases - (expand-mail-aliases (point-min) delimline)) - (goto-char (point-min)) - ;; ignore any blank lines in the header - (while (and (re-search-forward "\n\n\n*" delimline t) - (< (point) delimline)) - (replace-match "\n")) - (let ((case-fold-search t)) - ;; We used to process Resent-... headers here, - ;; but it was not done properly, and the job - ;; is done correctly in smtpmail-deduce-address-list. - ;; Don't send out a blank subject line - (goto-char (point-min)) - (if (re-search-forward "^Subject:\\([ \t]*\n\\)+\\b" delimline t) - (replace-match "") - ;; This one matches a Subject just before the header delimiter. - (if (and (re-search-forward "^Subject:\\([ \t]*\n\\)+" delimline t) - (= (match-end 0) delimline)) - (replace-match ""))) - ;; Put the "From:" field in unless for some odd reason - ;; they put one in themselves. - (goto-char (point-min)) - (if (not (re-search-forward "^From:" delimline t)) - (let* ((login smtpmail-mail-address) - (fullname (user-full-name))) - (cond ((eq mail-from-style 'angles) - (insert "From: " fullname) - (let ((fullname-start (+ (point-min) 6)) - (fullname-end (point-marker))) - (goto-char fullname-start) - ;; Look for a character that cannot appear unquoted - ;; according to RFC 822. - (if (re-search-forward "[^- !#-'*+/-9=?A-Z^-~]" - fullname-end 1) - (progn - ;; Quote fullname, escaping specials. - (goto-char fullname-start) - (insert "\"") - (while (re-search-forward "[\"\\]" - fullname-end 1) - (replace-match "\\\\\\&" t)) - (insert "\"")))) - (insert " <" login ">\n")) - ((eq mail-from-style 'parens) - (insert "From: " login " (") - (let ((fullname-start (point))) - (insert fullname) - (let ((fullname-end (point-marker))) - (goto-char fullname-start) - ;; RFC 822 says \ and nonmatching parentheses - ;; must be escaped in comments. - ;; Escape every instance of ()\ ... - (while (re-search-forward "[()\\]" fullname-end 1) - (replace-match "\\\\\\&" t)) - ;; ... then undo escaping of matching parentheses, - ;; including matching nested parentheses. - (goto-char fullname-start) - (while (re-search-forward - "\\(\\=\\|[^\\]\\(\\\\\\\\\\)*\\)\\\\(\\(\\([^\\]\\|\\\\\\\\\\)*\\)\\\\)" - fullname-end 1) - (replace-match "\\1(\\3)" t) - (goto-char fullname-start)))) - (insert ")\n")) - ((null mail-from-style) - (insert "From: " login "\n"))))) - ;; Insert a `Message-Id:' field if there isn't one yet. - (goto-char (point-min)) - (unless (re-search-forward "^Message-Id:" delimline t) - (insert "Message-Id: " (message-make-message-id) "\n")) - ;; Insert a `Date:' field if there isn't one yet. - (goto-char (point-min)) - (unless (re-search-forward "^Date:" delimline t) - (insert "Date: " (message-make-date) "\n")) - ;; Possibly add a MIME header for the current coding system - (let (charset) - (goto-char (point-min)) - (and (eq mail-send-nonascii 'mime) - (not (re-search-forward "^MIME-version:" delimline t)) - (progn (skip-chars-forward "\0-\177") - (/= (point) (point-max))) - smtpmail-code-conv-from - (setq charset - (coding-system-get smtpmail-code-conv-from - 'mime-charset)) - (goto-char delimline) - (insert "MIME-version: 1.0\n" - "Content-type: text/plain; charset=" - (symbol-name charset) - "\nContent-Transfer-Encoding: 8bit\n"))) - ;; Insert an extra newline if we need it to work around - ;; Sun's bug that swallows newlines. - (goto-char (1+ delimline)) - (if (eval mail-mailer-swallows-blank-line) - (newline)) - ;; Find and handle any FCC fields. - (goto-char (point-min)) - (if (re-search-forward "^FCC:" delimline t) - ;; Force mail-do-fcc to use the encoding of the mail - ;; buffer to encode outgoing messages on FCC files. - (let ((coding-system-for-write smtpmail-code-conv-from)) - (mail-do-fcc delimline))) - (if mail-interactive - (with-current-buffer errbuf - (erase-buffer)))) - ;; - ;; - ;; - (setq smtpmail-address-buffer (generate-new-buffer "*smtp-mail*")) - (setq smtpmail-recipient-address-list - (smtpmail-deduce-address-list tembuf (point-min) delimline)) - (kill-buffer smtpmail-address-buffer) - - (smtpmail-do-bcc delimline) - ; Send or queue - (if (not smtpmail-queue-mail) - (if (not (null smtpmail-recipient-address-list)) - (if (not (smtpmail-via-smtp - smtpmail-recipient-address-list tembuf)) - (error "Sending failed; SMTP protocol error")) - (error "Sending failed; no recipients")) - (let* ((file-data - (expand-file-name - (format "%s_%i" - (format-time-string "%Y-%m-%d_%H:%M:%S") - (setq smtpmail-queue-counter - (1+ smtpmail-queue-counter))) - smtpmail-queue-dir)) - (file-data (convert-standard-filename file-data)) - (file-elisp (concat file-data ".el")) - (buffer-data (create-file-buffer file-data)) - (buffer-elisp (create-file-buffer file-elisp)) - (buffer-scratch "*queue-mail*")) - (unless (file-exists-p smtpmail-queue-dir) - (make-directory smtpmail-queue-dir t)) - (with-current-buffer buffer-data - (erase-buffer) - (set-buffer-file-coding-system smtpmail-code-conv-from nil) - (insert-buffer-substring tembuf) - (write-file file-data) - (set-buffer buffer-elisp) - (erase-buffer) - (insert (concat - "(setq smtpmail-recipient-address-list '" - (prin1-to-string smtpmail-recipient-address-list) - ")\n")) - (write-file file-elisp) - (set-buffer (generate-new-buffer buffer-scratch)) - (insert (concat file-data "\n")) - (append-to-file (point-min) - (point-max) - smtpmail-queue-index) - ) - (kill-buffer buffer-scratch) - (kill-buffer buffer-data) - (kill-buffer buffer-elisp)))) - (kill-buffer tembuf) - (if (bufferp errbuf) - (kill-buffer errbuf))))) - -;;;###autoload -(defun smtpmail-send-queued-mail () - "Send mail that was queued as a result of setting `smtpmail-queue-mail'." - (interactive) - (with-temp-buffer - ;;; Get index, get first mail, send it, update index, get second - ;;; mail, send it, etc... - (let ((file-msg "")) - (insert-file-contents smtpmail-queue-index) - (goto-char (point-min)) - (while (not (eobp)) - (setq file-msg (buffer-substring (point) (line-end-position))) - (load file-msg) - ;; Insert the message literally: it is already encoded as per - ;; the MIME headers, and code conversions might guess the - ;; encoding wrongly. - (with-temp-buffer - (let ((coding-system-for-read 'no-conversion)) - (insert-file-contents file-msg)) - (let ((smtpmail-mail-address - (or (and mail-specify-envelope-from (mail-envelope-from)) - user-mail-address))) - (if (not (null smtpmail-recipient-address-list)) - (if (not (smtpmail-via-smtp smtpmail-recipient-address-list - (current-buffer))) - (error "Sending failed; SMTP protocol error")) - (error "Sending failed; no recipients")))) - (delete-file file-msg) - (delete-file (concat file-msg ".el")) - (delete-region (point-at-bol) (point-at-bol 2))) - (write-region (point-min) (point-max) smtpmail-queue-index)))) - -;(defun smtpmail-via-smtp (host,port,sender,destination,smtpmail-text-buffer) - -(defun smtpmail-fqdn () - (if smtpmail-local-domain - (concat (system-name) "." smtpmail-local-domain) - (system-name))) - -(defsubst smtpmail-cred-server (cred) - (nth 0 cred)) - -(defsubst smtpmail-cred-port (cred) - (nth 1 cred)) - -(defsubst smtpmail-cred-key (cred) - (nth 2 cred)) - -(defsubst smtpmail-cred-user (cred) - (nth 2 cred)) - -(defsubst smtpmail-cred-cert (cred) - (nth 3 cred)) - -(defsubst smtpmail-cred-passwd (cred) - (nth 3 cred)) - -(defun smtpmail-find-credentials (cred server port) - (catch 'done - (let ((l cred) el) - (while (setq el (pop l)) - (when (and (equal server (smtpmail-cred-server el)) - (equal port (smtpmail-cred-port el))) - (throw 'done el)))))) - -(defun smtpmail-maybe-append-domain (recipient) - (if (or (not smtpmail-sendto-domain) - (string-match "@" recipient)) - recipient - (concat recipient "@" smtpmail-sendto-domain))) - -(defun smtpmail-intersection (list1 list2) - (let ((result nil)) - (dolist (el2 list2) - (when (memq el2 list1) - (push el2 result))) - (nreverse result))) - -(defvar starttls-extra-args) -(defvar starttls-extra-arguments) - -(defun smtpmail-open-stream (process-buffer host port) - (let ((cred (smtpmail-find-credentials - smtpmail-starttls-credentials host port))) - (if (null (and cred (starttls-any-program-available))) - ;; The normal case. - (open-network-stream "SMTP" process-buffer host port) - (let* ((cred-key (smtpmail-cred-key cred)) - (cred-cert (smtpmail-cred-cert cred)) - (starttls-extra-args - (append - starttls-extra-args - (when (and (stringp cred-key) (stringp cred-cert) - (file-regular-p - (setq cred-key (expand-file-name cred-key))) - (file-regular-p - (setq cred-cert (expand-file-name cred-cert)))) - (list "--key-file" cred-key "--cert-file" cred-cert)))) - (starttls-extra-arguments - (append - starttls-extra-arguments - (when (and (stringp cred-key) (stringp cred-cert) - (file-regular-p - (setq cred-key (expand-file-name cred-key))) - (file-regular-p - (setq cred-cert (expand-file-name cred-cert)))) - (list "--x509keyfile" cred-key "--x509certfile" cred-cert))))) - (starttls-open-stream "SMTP" process-buffer host port))))) - -(defun smtpmail-try-auth-methods (process supported-extensions host port) - (let* ((mechs (cdr-safe (assoc 'auth supported-extensions))) - (mech (car (smtpmail-intersection mechs smtpmail-auth-supported))) - (auth-user (auth-source-user-or-password - "login" host (or port "smtp"))) - (auth-pass (auth-source-user-or-password - "password" host (or port "smtp"))) - (cred (if (and auth-user auth-pass) ; try user-auth-* before netrc-* - (list host port auth-user auth-pass) - ;; else, if auth-source didn't return them... - (if (stringp smtpmail-auth-credentials) - (let* ((netrc (netrc-parse smtpmail-auth-credentials)) - (port-name (format "%s" (or port "smtp"))) - (hostentry (netrc-machine netrc host port-name - port-name))) - (when hostentry - (list host port - (netrc-get hostentry "login") - (netrc-get hostentry "password")))) - ;; else, try smtpmail-find-credentials since - ;; smtpmail-auth-credentials is not a string - (smtpmail-find-credentials - smtpmail-auth-credentials host port)))) - (prompt (when cred (format "SMTP password for %s:%s: " - (smtpmail-cred-server cred) - (smtpmail-cred-port cred)))) - (passwd (when cred - (or (smtpmail-cred-passwd cred) - (read-passwd - (format "SMTP password for %s:%s: " - (smtpmail-cred-server cred) - (smtpmail-cred-port cred)))))) - ret) - (when (and cred mech) - (cond - ((eq mech 'cram-md5) - (smtpmail-send-command process (upcase (format "AUTH %s" mech))) - (if (or (null (car (setq ret (smtpmail-read-response process)))) - (not (integerp (car ret))) - (>= (car ret) 400)) - (throw 'done nil)) - (when (eq (car ret) 334) - (let* ((challenge (substring (cadr ret) 4)) - (decoded (base64-decode-string challenge)) - (hash (rfc2104-hash 'md5 64 16 passwd decoded)) - (response (concat (smtpmail-cred-user cred) " " hash)) - ;; Osamu Yamane : - ;; SMTP auth fails because the SMTP server identifies - ;; only the first part of the string (delimited by - ;; new line characters) as a response from the - ;; client, and the rest as distinct commands. - - ;; In my case, the response string is 80 characters - ;; long. Without the no-line-break option for - ;; base64-encode-sting, only the first 76 characters - ;; are taken as a response to the server, and the - ;; authentication fails. - (encoded (base64-encode-string response t))) - (smtpmail-send-command process (format "%s" encoded)) - (if (or (null (car (setq ret (smtpmail-read-response process)))) - (not (integerp (car ret))) - (>= (car ret) 400)) - (throw 'done nil))))) - ((eq mech 'login) - (smtpmail-send-command process "AUTH LOGIN") - (if (or (null (car (setq ret (smtpmail-read-response process)))) - (not (integerp (car ret))) - (>= (car ret) 400)) - (throw 'done nil)) - (smtpmail-send-command - process (base64-encode-string (smtpmail-cred-user cred) t)) - (if (or (null (car (setq ret (smtpmail-read-response process)))) - (not (integerp (car ret))) - (>= (car ret) 400)) - (throw 'done nil)) - (smtpmail-send-command process (base64-encode-string passwd t)) - (if (or (null (car (setq ret (smtpmail-read-response process)))) - (not (integerp (car ret))) - (>= (car ret) 400)) - (throw 'done nil))) - ((eq mech 'plain) - ;; We used to send an empty initial request, and wait for an - ;; empty response, and then send the password, but this - ;; violate a SHOULD in RFC 2222 paragraph 5.1. Note that this - ;; is not sent if the server did not advertise AUTH PLAIN in - ;; the EHLO response. See RFC 2554 for more info. - (smtpmail-send-command process - (concat "AUTH PLAIN " - (base64-encode-string - (concat "\0" - (smtpmail-cred-user cred) - "\0" - passwd) t))) - (if (or (null (car (setq ret (smtpmail-read-response process)))) - (not (integerp (car ret))) - (not (equal (car ret) 235))) - (throw 'done nil))) - - (t - (error "Mechanism %s not implemented" mech))) - ;; Remember the password. - (when (and (not (stringp smtpmail-auth-credentials)) - (null (smtpmail-cred-passwd cred))) - (setcar (cdr (cdr (cdr cred))) passwd))))) - -(defun smtpmail-via-smtp (recipient smtpmail-text-buffer) - (let ((process nil) - (host (or smtpmail-smtp-server - (error "`smtpmail-smtp-server' not defined"))) - (port smtpmail-smtp-service) - ;; smtpmail-mail-address should be set to the appropriate - ;; buffer-local value by the caller, but in case not: - (envelope-from (or smtpmail-mail-address - (and mail-specify-envelope-from - (mail-envelope-from)) - user-mail-address)) - response-code - greeting - process-buffer - (supported-extensions '())) - (unwind-protect - (catch 'done - ;; get or create the trace buffer - (setq process-buffer - (get-buffer-create (format "*trace of SMTP session to %s*" host))) - - ;; clear the trace buffer of old output - (with-current-buffer process-buffer - (setq buffer-undo-list t) - (erase-buffer)) - - ;; open the connection to the server - (setq process (smtpmail-open-stream process-buffer host port)) - (and (null process) (throw 'done nil)) - - ;; set the send-filter - (set-process-filter process 'smtpmail-process-filter) - - (with-current-buffer process-buffer - (set-buffer-process-coding-system 'raw-text-unix 'raw-text-unix) - (make-local-variable 'smtpmail-read-point) - (setq smtpmail-read-point (point-min)) - - - (if (or (null (car (setq greeting (smtpmail-read-response process)))) - (not (integerp (car greeting))) - (>= (car greeting) 400)) - (throw 'done nil) - ) - - (let ((do-ehlo t) - (do-starttls t)) - (while do-ehlo - ;; EHLO - (smtpmail-send-command process (format "EHLO %s" (smtpmail-fqdn))) - - (if (or (null (car (setq response-code - (smtpmail-read-response process)))) - (not (integerp (car response-code))) - (>= (car response-code) 400)) - (progn - ;; HELO - (smtpmail-send-command - process (format "HELO %s" (smtpmail-fqdn))) - - (if (or (null (car (setq response-code - (smtpmail-read-response process)))) - (not (integerp (car response-code))) - (>= (car response-code) 400)) - (throw 'done nil))) - (dolist (line (cdr (cdr response-code))) - (let ((name (mapcar (lambda (s) (intern (downcase s))) - (split-string (substring line 4) "[ ]")))) - (and (eq (length name) 1) - (setq name (car name))) - (and name - (cond ((memq (if (consp name) (car name) name) - '(verb xvrb 8bitmime onex xone - expn size dsn etrn - enhancedstatuscodes - help xusr - auth=login auth starttls)) - (setq supported-extensions - (cons name supported-extensions))) - (smtpmail-warn-about-unknown-extensions - (message "Unknown extension %s" name))))))) - - (if (and do-starttls - (smtpmail-find-credentials smtpmail-starttls-credentials host port) - (member 'starttls supported-extensions) - (numberp (process-id process))) - (progn - (smtpmail-send-command process (format "STARTTLS")) - (if (or (null (car (setq response-code (smtpmail-read-response process)))) - (not (integerp (car response-code))) - (>= (car response-code) 400)) - (throw 'done nil)) - (starttls-negotiate process) - (setq do-starttls nil)) - (setq do-ehlo nil)))) - - (smtpmail-try-auth-methods process supported-extensions host port) - - (if (or (member 'onex supported-extensions) - (member 'xone supported-extensions)) - (progn - (smtpmail-send-command process (format "ONEX")) - (if (or (null (car (setq response-code (smtpmail-read-response process)))) - (not (integerp (car response-code))) - (>= (car response-code) 400)) - (throw 'done nil)))) - - (if (and smtpmail-debug-verb - (or (member 'verb supported-extensions) - (member 'xvrb supported-extensions))) - (progn - (smtpmail-send-command process (format "VERB")) - (if (or (null (car (setq response-code (smtpmail-read-response process)))) - (not (integerp (car response-code))) - (>= (car response-code) 400)) - (throw 'done nil)))) - - (if (member 'xusr supported-extensions) - (progn - (smtpmail-send-command process (format "XUSR")) - (if (or (null (car (setq response-code (smtpmail-read-response process)))) - (not (integerp (car response-code))) - (>= (car response-code) 400)) - (throw 'done nil)))) - - ;; MAIL FROM: - (let ((size-part - (if (or (member 'size supported-extensions) - (assoc 'size supported-extensions)) - (format " SIZE=%d" - (with-current-buffer smtpmail-text-buffer - ;; size estimate: - (+ (- (point-max) (point-min)) - ;; Add one byte for each change-of-line - ;; because of CR-LF representation: - (count-lines (point-min) (point-max))))) - "")) - (body-part - (if (member '8bitmime supported-extensions) - ;; FIXME: - ;; Code should be added here that transforms - ;; the contents of the message buffer into - ;; something the receiving SMTP can handle. - ;; For a receiver that supports 8BITMIME, this - ;; may mean converting BINARY to BASE64, or - ;; adding Content-Transfer-Encoding and the - ;; other MIME headers. The code should also - ;; return an indication of what encoding the - ;; message buffer is now, i.e. ASCII or - ;; 8BITMIME. - (if nil - " BODY=8BITMIME" - "") - ""))) -; (smtpmail-send-command process (format "MAIL FROM:%s@%s" (user-login-name) (smtpmail-fqdn))) - (smtpmail-send-command process (format "MAIL FROM:<%s>%s%s" - envelope-from - size-part - body-part)) - - (if (or (null (car (setq response-code (smtpmail-read-response process)))) - (not (integerp (car response-code))) - (>= (car response-code) 400)) - (throw 'done nil) - )) - - ;; RCPT TO: - (let ((n 0)) - (while (not (null (nth n recipient))) - (smtpmail-send-command process (format "RCPT TO:<%s>" (smtpmail-maybe-append-domain (nth n recipient)))) - (setq n (1+ n)) - - (setq response-code (smtpmail-read-response process)) - (if (or (null (car response-code)) - (not (integerp (car response-code))) - (>= (car response-code) 400)) - (throw 'done nil) - ) - )) - - ;; DATA - (smtpmail-send-command process "DATA") - - (if (or (null (car (setq response-code (smtpmail-read-response process)))) - (not (integerp (car response-code))) - (>= (car response-code) 400)) - (throw 'done nil) - ) - - ;; Mail contents - (smtpmail-send-data process smtpmail-text-buffer) - - ;;DATA end "." - (smtpmail-send-command process ".") - - (if (or (null (car (setq response-code (smtpmail-read-response process)))) - (not (integerp (car response-code))) - (>= (car response-code) 400)) - (throw 'done nil) - ) - - ;;QUIT -; (smtpmail-send-command process "QUIT") -; (and (null (car (smtpmail-read-response process))) -; (throw 'done nil)) - t )) - (if process - (with-current-buffer (process-buffer process) - (smtpmail-send-command process "QUIT") - (smtpmail-read-response process) - -; (if (or (null (car (setq response-code (smtpmail-read-response process)))) -; (not (integerp (car response-code))) -; (>= (car response-code) 400)) -; (throw 'done nil) -; ) - (delete-process process) - (unless smtpmail-debug-info - (kill-buffer process-buffer))))))) - - -(defun smtpmail-process-filter (process output) - (with-current-buffer (process-buffer process) - (goto-char (point-max)) - (insert output))) - -(defun smtpmail-read-response (process) - (let ((case-fold-search nil) - (response-strings nil) - (response-continue t) - (return-value '(nil ())) - match-end) - (catch 'done - (while response-continue - (goto-char smtpmail-read-point) - (while (not (search-forward "\r\n" nil t)) - (unless (memq (process-status process) '(open run)) - (throw 'done nil)) - (accept-process-output process) - (goto-char smtpmail-read-point)) - - (setq match-end (point)) - (setq response-strings - (cons (buffer-substring smtpmail-read-point (- match-end 2)) - response-strings)) - - (goto-char smtpmail-read-point) - (if (looking-at "[0-9]+ ") - (let ((begin (match-beginning 0)) - (end (match-end 0))) - (if smtpmail-debug-info - (message "%s" (car response-strings))) - - (setq smtpmail-read-point match-end) - - ;; ignore lines that start with "0" - (if (looking-at "0[0-9]+ ") - nil - (setq response-continue nil) - (setq return-value - (cons (string-to-number - (buffer-substring begin end)) - (nreverse response-strings))))) - - (if (looking-at "[0-9]+-") - (progn (if smtpmail-debug-info - (message "%s" (car response-strings))) - (setq smtpmail-read-point match-end) - (setq response-continue t)) - (progn - (setq smtpmail-read-point match-end) - (setq response-continue nil) - (setq return-value - (cons nil (nreverse response-strings))))))) - (setq smtpmail-read-point match-end)) - return-value)) - - -(defun smtpmail-send-command (process command) - (goto-char (point-max)) - (if (= (aref command 0) ?P) - (insert "PASS \r\n") - (insert command "\r\n")) - (setq smtpmail-read-point (point)) - (process-send-string process command) - (process-send-string process "\r\n")) - -(defun smtpmail-send-data-1 (process data) - (goto-char (point-max)) - - (if (and (multibyte-string-p data) - smtpmail-code-conv-from) - (setq data (string-as-multibyte - (encode-coding-string data smtpmail-code-conv-from)))) - - (if smtpmail-debug-info - (insert data "\r\n")) - - (setq smtpmail-read-point (point)) - ;; Escape "." at start of a line - (if (eq (string-to-char data) ?.) - (process-send-string process ".")) - (process-send-string process data) - (process-send-string process "\r\n") - ) - -(defun smtpmail-send-data (process buffer) - (let ((data-continue t) sending-data) - (with-current-buffer buffer - (goto-char (point-min))) - (while data-continue - (with-current-buffer buffer - (setq sending-data (buffer-substring (point-at-bol) (point-at-eol))) - (end-of-line 2) - (setq data-continue (not (eobp)))) - (smtpmail-send-data-1 process sending-data)))) - -(defun smtpmail-deduce-address-list (smtpmail-text-buffer header-start header-end) - "Get address list suitable for smtp RCPT TO:
." - (unwind-protect - (with-current-buffer smtpmail-address-buffer - (erase-buffer) - (let - ((case-fold-search t) - (simple-address-list "") - this-line - this-line-end - addr-regexp) - (insert-buffer-substring smtpmail-text-buffer header-start header-end) - (goto-char (point-min)) - ;; RESENT-* fields should stop processing of regular fields. - (save-excursion - (setq addr-regexp - (if (re-search-forward "^Resent-\\(to\\|cc\\|bcc\\):" - header-end t) - "^Resent-\\(to\\|cc\\|bcc\\):" - "^\\(To:\\|Cc:\\|Bcc:\\)"))) - - (while (re-search-forward addr-regexp header-end t) - (replace-match "") - (setq this-line (match-beginning 0)) - (forward-line 1) - ;; get any continuation lines - (while (and (looking-at "^[ \t]+") (< (point) header-end)) - (forward-line 1)) - (setq this-line-end (point-marker)) - (setq simple-address-list - (concat simple-address-list " " - (mail-strip-quoted-names (buffer-substring this-line this-line-end)))) - ) - (erase-buffer) - (insert " " simple-address-list "\n") - (subst-char-in-region (point-min) (point-max) 10 ? t);; newline --> blank - (subst-char-in-region (point-min) (point-max) ?, ? t);; comma --> blank - (subst-char-in-region (point-min) (point-max) 9 ? t);; tab --> blank - - (goto-char (point-min)) - ;; tidyness in case hook is not robust when it looks at this - (while (re-search-forward "[ \t]+" header-end t) (replace-match " ")) - - (goto-char (point-min)) - (let (recipient-address-list) - (while (re-search-forward " \\([^ ]+\\) " (point-max) t) - (backward-char 1) - (setq recipient-address-list (cons (buffer-substring (match-beginning 1) (match-end 1)) - recipient-address-list)) - ) - (setq smtpmail-recipient-address-list recipient-address-list)) - - ) - ) - ) - ) - - -(defun smtpmail-do-bcc (header-end) - "Delete [Resent-]BCC: and their continuation lines from the header area. -There may be multiple BCC: lines, and each may have arbitrarily -many continuation lines." - (let ((case-fold-search t)) - (save-excursion - (goto-char (point-min)) - ;; iterate over all BCC: lines - (while (re-search-forward "^\\(RESENT-\\)?BCC:" header-end t) - (delete-region (match-beginning 0) - (progn (forward-line 1) (point))) - ;; get rid of any continuation lines - (while (and (looking-at "^[ \t].*\n") (< (point) header-end)) - (replace-match "")))))) - - -(provide 'smtpmail) - -;;; smtpmail.el ends here diff --git a/contrib/ucs-tables.el b/contrib/ucs-tables.el deleted file mode 100644 index 13ee7e0dd..000000000 --- a/contrib/ucs-tables.el +++ /dev/null @@ -1,2482 +0,0 @@ -;;; ucs-tables.el --- translation to, from and via Unicode -*- coding: iso-2022-7bit -*- - -;; Copyright (C) 2001 Free Software Foundation, Inc. - -;; Author: Dave Love -;; Keywords: i18n - -;; This file is part of GNU Emacs. - -;; This file 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 3, or (at your option) -;; any later version. - -;; This file 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 GNU Emacs; see the file COPYING. If not, write to the -;; Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, -;; Boston, MA 02110-1301, USA. - -;;; Commentary: - -;; This file provides tables mapping between Unicode numbers and -;; emacs-mule characters from the iso-8859 charsets (and others). It -;; also provides some auxiliary functions. - -;; These tables are used to construct other mappings between the Mule -;; iso8859 charsets and the emacs-unicode charsets and a table that -;; unifies iso8859 characters using a single charset as far as -;; possible. These tables are used by latin1-disp.el to display some -;; Unicode characters without a Unicode font and by utf-8.el to unify -;; Latin-N as far as possible on encoding. - -;; More drastically, they can be used to unify 8859 into Latin-1 plus -;; mule-unicode-0100-24ff on decoding, with the corresponding -;; adjustments on encoding; see `ucs-unify-8859'. Be wary of using -;; unification when, for instance, editing Lisp files such as this one -;; which are supposed to contain distinct 8859 charsets. Also, it can -;; make reading and writing of emacs-mule and iso-2022-based encodings -;; not idempotent. - -;; Global minor modes are provided to unify on encoding and decoding. - -;; The translation table `ucs-mule-to-mule-unicode' is populated. -;; This is used by the `mule-utf-8' coding system to encode extra -;; characters. - -;; Command `ucs-insert' is convenient for inserting a given Unicode. -;; (See also the `ucs' input method.) - -;;; Code: - -(when (featurep 'xemacs) - (error "This file cannot be used with XEmacs. For XEmacs, use latin-unity instead")) - -;;; Define tables, to be populated later. - -(defvar ucs-mule-8859-to-ucs-table (make-translation-table) - "Translation table from Emacs ISO-8859 characters to Unicode. -This maps Emacs characters from the non-Latin-1 -...-iso8859-... charsets to their Unicode code points. This is a -many-to-one mapping.") - -(defvar ucs-mule-8859-to-mule-unicode (make-translation-table) - "Translation table from Emacs ISO-8859 characters to Mule Unicode. -This maps Emacs characters from the non-Latin-1 -...-iso8859-... charsets to characters from the -mule-unicode-... charsets. This is a many-to-one mapping. The -characters translated to are suitable for encoding using the -`mule-utf-8' coding system.") - -;; (defvar ucs-ucs-to-mule-8859-table (make-translation-table) -;; "Translation table from Unicode to Emacs ISO-8859 characters. -;; This maps Unicode code points to corresponding Emacs characters from -;; the ...-iso8859-... charsets. This is made a one-to-one mapping where -;; the same character occurs in more than one set by preferring the Emacs -;; iso-8859-N character with lowest N.") - -;; (defvar ucs-mule-unicode-to-mule-8859 (make-translation-table) -;; "Translation table from Mule Unicode to Emacs ISO-8859 characters. -;; This maps non-Latin-1 Emacs characters from the -;; mule-unicode-... charsets used by the `mule-utf-8' coding system to -;; characters from the ...-iso8859-... charsets. This is made a -;; one-to-one mapping where the same character occurs in more than one -;; set by preferring the Emacs iso-8859-N character with lowest N.") - -(defvar ucs-8859-1-encode-table nil - "Used as `translation-table-for-encode' for iso-8859-2. -Translates from the iso8859 charsets and `mule-unicode-0100-24ff'.") - -(defvar ucs-8859-2-encode-table nil - "Used as `translation-table-for-encode' for iso-8859-2. -Translates from the iso8859 charsets and `mule-unicode-0100-24ff'.") - -(defvar ucs-8859-3-encode-table nil - "Used as `translation-table-for-encode' for iso-8859-3. -Translates from the iso8859 charsets and `mule-unicode-0100-24ff'.") - -(defvar ucs-8859-4-encode-table nil - "Used as `translation-table-for-encode' for iso-8859-4. -Translates from the iso8859 charsets and `mule-unicode-0100-24ff'.") - -(defvar ucs-8859-5-encode-table nil - "Used as `translation-table-for-encode' for iso-8859-5. -Translates from the iso8859 charsets and `mule-unicode-0100-24ff'.") - -(defvar ucs-8859-7-encode-table nil - "Used as `translation-table-for-encode' for iso-8859-7. -Translates from the iso8859 charsets and `mule-unicode-0100-24ff'.") - -(defvar ucs-8859-8-encode-table nil - "Used as `translation-table-for-encode' for iso-8859-8. -Translates from the iso8859 charsets and `mule-unicode-0100-24ff'.") - -(defvar ucs-8859-9-encode-table nil - "Used as `translation-table-for-encode' for iso-8859-9. -Translates from the iso8859 charsets and `mule-unicode-0100-24ff'.") - -(defvar ucs-8859-14-encode-table nil - "Used as `translation-table-for-encode' for iso-8859-14. -Translates from the iso8859 charsets and `mule-unicode-0100-24ff'.") - -(defvar ucs-8859-15-encode-table nil - "Used as `translation-table-for-encode' for iso-8859-15. -Translates from the iso8859 charsets and `mule-unicode-0100-24ff'.") - -;; Probably defined by utf-8.el. -(defvar ucs-mule-to-mule-unicode (make-translation-table)) -(unless (get 'ucs-mule-to-mule-unicode 'translation-table) - (define-translation-table 'ucs-mule-to-mule-unicode ucs-mule-to-mule-unicode)) -;;; Set up the tables. - -;; Most of these tables were derived from ones in Mule-UCS. - -;; There doesn't seem to be a need to make these let bindings into -;; defvars, so we'll let the data get GC'ed. -(let ((ucs-8859-2-alist - '((?\,B (B . ?\x00A0) ;; NO-BREAK SPACE - (?\,B!(B . ?\x0104) ;; LATIN CAPITAL LETTER A WITH OGONEK - (?\,B"(B . ?\x02D8) ;; BREVE - (?\,B#(B . ?\x0141) ;; LATIN CAPITAL LETTER L WITH STROKE - (?\,B$(B . ?\x00A4) ;; CURRENCY SIGN - (?\,B%(B . ?\x013D) ;; LATIN CAPITAL LETTER L WITH CARON - (?\,B&(B . ?\x015A) ;; LATIN CAPITAL LETTER S WITH ACUTE - (?\,B'(B . ?\x00A7) ;; SECTION SIGN - (?\,B((B . ?\x00A8) ;; DIAERESIS - (?\,B)(B . ?\x0160) ;; LATIN CAPITAL LETTER S WITH CARON - (?\,B*(B . ?\x015E) ;; LATIN CAPITAL LETTER S WITH CEDILLA - (?\,B+(B . ?\x0164) ;; LATIN CAPITAL LETTER T WITH CARON - (?\,B,(B . ?\x0179) ;; LATIN CAPITAL LETTER Z WITH ACUTE - (?\,B-(B . ?\x00AD) ;; SOFT HYPHEN - (?\,B.(B . ?\x017D) ;; LATIN CAPITAL LETTER Z WITH CARON - (?\,B/(B . ?\x017B) ;; LATIN CAPITAL LETTER Z WITH DOT ABOVE - (?\,B0(B . ?\x00B0) ;; DEGREE SIGN - (?\,B1(B . ?\x0105) ;; LATIN SMALL LETTER A WITH OGONEK - (?\,B2(B . ?\x02DB) ;; OGONEK - (?\,B3(B . ?\x0142) ;; LATIN SMALL LETTER L WITH STROKE - (?\,B4(B . ?\x00B4) ;; ACUTE ACCENT - (?\,B5(B . ?\x013E) ;; LATIN SMALL LETTER L WITH CARON - (?\,B6(B . ?\x015B) ;; LATIN SMALL LETTER S WITH ACUTE - (?\,B7(B . ?\x02C7) ;; CARON - (?\,B8(B . ?\x00B8) ;; CEDILLA - (?\,B9(B . ?\x0161) ;; LATIN SMALL LETTER S WITH CARON - (?\,B:(B . ?\x015F) ;; LATIN SMALL LETTER S WITH CEDILLA - (?\,B;(B . ?\x0165) ;; LATIN SMALL LETTER T WITH CARON - (?\,B<(B . ?\x017A) ;; LATIN SMALL LETTER Z WITH ACUTE - (?\,B=(B . ?\x02DD) ;; DOUBLE ACUTE ACCENT - (?\,B>(B . ?\x017E) ;; LATIN SMALL LETTER Z WITH CARON - (?\,B?(B . ?\x017C) ;; LATIN SMALL LETTER Z WITH DOT ABOVE - (?\,B@(B . ?\x0154) ;; LATIN CAPITAL LETTER R WITH ACUTE - (?\,BA(B . ?\x00C1) ;; LATIN CAPITAL LETTER A WITH ACUTE - (?\,BB(B . ?\x00C2) ;; LATIN CAPITAL LETTER A WITH CIRCUMFLEX - (?\,BC(B . ?\x0102) ;; LATIN CAPITAL LETTER A WITH BREVE - (?\,BD(B . ?\x00C4) ;; LATIN CAPITAL LETTER A WITH DIAERESIS - (?\,BE(B . ?\x0139) ;; LATIN CAPITAL LETTER L WITH ACUTE - (?\,BF(B . ?\x0106) ;; LATIN CAPITAL LETTER C WITH ACUTE - (?\,BG(B . ?\x00C7) ;; LATIN CAPITAL LETTER C WITH CEDILLA - (?\,BH(B . ?\x010C) ;; LATIN CAPITAL LETTER C WITH CARON - (?\,BI(B . ?\x00C9) ;; LATIN CAPITAL LETTER E WITH ACUTE - (?\,BJ(B . ?\x0118) ;; LATIN CAPITAL LETTER E WITH OGONEK - (?\,BK(B . ?\x00CB) ;; LATIN CAPITAL LETTER E WITH DIAERESIS - (?\,BL(B . ?\x011A) ;; LATIN CAPITAL LETTER E WITH CARON - (?\,BM(B . ?\x00CD) ;; LATIN CAPITAL LETTER I WITH ACUTE - (?\,BN(B . ?\x00CE) ;; LATIN CAPITAL LETTER I WITH CIRCUMFLEX - (?\,BO(B . ?\x010E) ;; LATIN CAPITAL LETTER D WITH CARON - (?\,BP(B . ?\x0110) ;; LATIN CAPITAL LETTER D WITH STROKE - (?\,BQ(B . ?\x0143) ;; LATIN CAPITAL LETTER N WITH ACUTE - (?\,BR(B . ?\x0147) ;; LATIN CAPITAL LETTER N WITH CARON - (?\,BS(B . ?\x00D3) ;; LATIN CAPITAL LETTER O WITH ACUTE - (?\,BT(B . ?\x00D4) ;; LATIN CAPITAL LETTER O WITH CIRCUMFLEX - (?\,BU(B . ?\x0150) ;; LATIN CAPITAL LETTER O WITH DOUBLE ACUTE - (?\,BV(B . ?\x00D6) ;; LATIN CAPITAL LETTER O WITH DIAERESIS - (?\,BW(B . ?\x00D7) ;; MULTIPLICATION SIGN - (?\,BX(B . ?\x0158) ;; LATIN CAPITAL LETTER R WITH CARON - (?\,BY(B . ?\x016E) ;; LATIN CAPITAL LETTER U WITH RING ABOVE - (?\,BZ(B . ?\x00DA) ;; LATIN CAPITAL LETTER U WITH ACUTE - (?\,B[(B . ?\x0170) ;; LATIN CAPITAL LETTER U WITH DOUBLE ACUTE - (?\,B\(B . ?\x00DC) ;; LATIN CAPITAL LETTER U WITH DIAERESIS - (?\,B](B . ?\x00DD) ;; LATIN CAPITAL LETTER Y WITH ACUTE - (?\,B^(B . ?\x0162) ;; LATIN CAPITAL LETTER T WITH CEDILLA - (?\,B_(B . ?\x00DF) ;; LATIN SMALL LETTER SHARP S - (?\,B`(B . ?\x0155) ;; LATIN SMALL LETTER R WITH ACUTE - (?\,Ba(B . ?\x00E1) ;; LATIN SMALL LETTER A WITH ACUTE - (?\,Bb(B . ?\x00E2) ;; LATIN SMALL LETTER A WITH CIRCUMFLEX - (?\,Bc(B . ?\x0103) ;; LATIN SMALL LETTER A WITH BREVE - (?\,Bd(B . ?\x00E4) ;; LATIN SMALL LETTER A WITH DIAERESIS - (?\,Be(B . ?\x013A) ;; LATIN SMALL LETTER L WITH ACUTE - (?\,Bf(B . ?\x0107) ;; LATIN SMALL LETTER C WITH ACUTE - (?\,Bg(B . ?\x00E7) ;; LATIN SMALL LETTER C WITH CEDILLA - (?\,Bh(B . ?\x010D) ;; LATIN SMALL LETTER C WITH CARON - (?\,Bi(B . ?\x00E9) ;; LATIN SMALL LETTER E WITH ACUTE - (?\,Bj(B . ?\x0119) ;; LATIN SMALL LETTER E WITH OGONEK - (?\,Bk(B . ?\x00EB) ;; LATIN SMALL LETTER E WITH DIAERESIS - (?\,Bl(B . ?\x011B) ;; LATIN SMALL LETTER E WITH CARON - (?\,Bm(B . ?\x00ED) ;; LATIN SMALL LETTER I WITH ACUTE - (?\,Bn(B . ?\x00EE) ;; LATIN SMALL LETTER I WITH CIRCUMFLEX - (?\,Bo(B . ?\x010F) ;; LATIN SMALL LETTER D WITH CARON - (?\,Bp(B . ?\x0111) ;; LATIN SMALL LETTER D WITH STROKE - (?\,Bq(B . ?\x0144) ;; LATIN SMALL LETTER N WITH ACUTE - (?\,Br(B . ?\x0148) ;; LATIN SMALL LETTER N WITH CARON - (?\,Bs(B . ?\x00F3) ;; LATIN SMALL LETTER O WITH ACUTE - (?\,Bt(B . ?\x00F4) ;; LATIN SMALL LETTER O WITH CIRCUMFLEX - (?\,Bu(B . ?\x0151) ;; LATIN SMALL LETTER O WITH DOUBLE ACUTE - (?\,Bv(B . ?\x00F6) ;; LATIN SMALL LETTER O WITH DIAERESIS - (?\,Bw(B . ?\x00F7) ;; DIVISION SIGN - (?\,Bx(B . ?\x0159) ;; LATIN SMALL LETTER R WITH CARON - (?\,By(B . ?\x016F) ;; LATIN SMALL LETTER U WITH RING ABOVE - (?\,Bz(B . ?\x00FA) ;; LATIN SMALL LETTER U WITH ACUTE - (?\,B{(B . ?\x0171) ;; LATIN SMALL LETTER U WITH DOUBLE ACUTE - (?\,B|(B . ?\x00FC) ;; LATIN SMALL LETTER U WITH DIAERESIS - (?\,B}(B . ?\x00FD) ;; LATIN SMALL LETTER Y WITH ACUTE - (?\,B~(B . ?\x0163) ;; LATIN SMALL LETTER T WITH CEDILLA - (?\,B(B . ?\x02D9) ;; DOT ABOVE - )) - - (ucs-8859-3-alist - '((?\,C (B . ?\x00A0) ;; NO-BREAK SPACE - (?\,C!(B . ?\x0126) ;; LATIN CAPITAL LETTER H WITH STROKE - (?\,C"(B . ?\x02D8) ;; BREVE - (?\,C#(B . ?\x00A3) ;; POUND SIGN - (?\,C$(B . ?\x00A4) ;; CURRENCY SIGN - (?\,C&(B . ?\x0124) ;; LATIN CAPITAL LETTER H WITH CIRCUMFLEX - (?\,C'(B . ?\x00A7) ;; SECTION SIGN - (?\,C((B . ?\x00A8) ;; DIAERESIS - (?\,C)(B . ?\x0130) ;; LATIN CAPITAL LETTER I WITH DOT ABOVE - (?\,C*(B . ?\x015E) ;; LATIN CAPITAL LETTER S WITH CEDILLA - (?\,C+(B . ?\x011E) ;; LATIN CAPITAL LETTER G WITH BREVE - (?\,C,(B . ?\x0134) ;; LATIN CAPITAL LETTER J WITH CIRCUMFLEX - (?\,C-(B . ?\x00AD) ;; SOFT HYPHEN - (?\,C/(B . ?\x017B) ;; LATIN CAPITAL LETTER Z WITH DOT ABOVE - (?\,C0(B . ?\x00B0) ;; DEGREE SIGN - (?\,C1(B . ?\x0127) ;; LATIN SMALL LETTER H WITH STROKE - (?\,C2(B . ?\x00B2) ;; SUPERSCRIPT TWO - (?\,C3(B . ?\x00B3) ;; SUPERSCRIPT THREE - (?\,C4(B . ?\x00B4) ;; ACUTE ACCENT - (?\,C5(B . ?\x00B5) ;; MICRO SIGN - (?\,C6(B . ?\x0125) ;; LATIN SMALL LETTER H WITH CIRCUMFLEX - (?\,C7(B . ?\x00B7) ;; MIDDLE DOT - (?\,C8(B . ?\x00B8) ;; CEDILLA - (?\,C9(B . ?\x0131) ;; LATIN SMALL LETTER DOTLESS I - (?\,C:(B . ?\x015F) ;; LATIN SMALL LETTER S WITH CEDILLA - (?\,C;(B . ?\x011F) ;; LATIN SMALL LETTER G WITH BREVE - (?\,C<(B . ?\x0135) ;; LATIN SMALL LETTER J WITH CIRCUMFLEX - (?\,C=(B . ?\x00BD) ;; VULGAR FRACTION ONE HALF - (?\,C?(B . ?\x017C) ;; LATIN SMALL LETTER Z WITH DOT ABOVE - (?\,C@(B . ?\x00C0) ;; LATIN CAPITAL LETTER A WITH GRAVE - (?\,CA(B . ?\x00C1) ;; LATIN CAPITAL LETTER A WITH ACUTE - (?\,CB(B . ?\x00C2) ;; LATIN CAPITAL LETTER A WITH CIRCUMFLEX - (?\,CD(B . ?\x00C4) ;; LATIN CAPITAL LETTER A WITH DIAERESIS - (?\,CE(B . ?\x010A) ;; LATIN CAPITAL LETTER C WITH DOT ABOVE - (?\,CF(B . ?\x0108) ;; LATIN CAPITAL LETTER C WITH CIRCUMFLEX - (?\,CG(B . ?\x00C7) ;; LATIN CAPITAL LETTER C WITH CEDILLA - (?\,CH(B . ?\x00C8) ;; LATIN CAPITAL LETTER E WITH GRAVE - (?\,CI(B . ?\x00C9) ;; LATIN CAPITAL LETTER E WITH ACUTE - (?\,CJ(B . ?\x00CA) ;; LATIN CAPITAL LETTER E WITH CIRCUMFLEX - (?\,CK(B . ?\x00CB) ;; LATIN CAPITAL LETTER E WITH DIAERESIS - (?\,CL(B . ?\x00CC) ;; LATIN CAPITAL LETTER I WITH GRAVE - (?\,CM(B . ?\x00CD) ;; LATIN CAPITAL LETTER I WITH ACUTE - (?\,CN(B . ?\x00CE) ;; LATIN CAPITAL LETTER I WITH CIRCUMFLEX - (?\,CO(B . ?\x00CF) ;; LATIN CAPITAL LETTER I WITH DIAERESIS - (?\,CQ(B . ?\x00D1) ;; LATIN CAPITAL LETTER N WITH TILDE - (?\,CR(B . ?\x00D2) ;; LATIN CAPITAL LETTER O WITH GRAVE - (?\,CS(B . ?\x00D3) ;; LATIN CAPITAL LETTER O WITH ACUTE - (?\,CT(B . ?\x00D4) ;; LATIN CAPITAL LETTER O WITH CIRCUMFLEX - (?\,CU(B . ?\x0120) ;; LATIN CAPITAL LETTER G WITH DOT ABOVE - (?\,CV(B . ?\x00D6) ;; LATIN CAPITAL LETTER O WITH DIAERESIS - (?\,CW(B . ?\x00D7) ;; MULTIPLICATION SIGN - (?\,CX(B . ?\x011C) ;; LATIN CAPITAL LETTER G WITH CIRCUMFLEX - (?\,CY(B . ?\x00D9) ;; LATIN CAPITAL LETTER U WITH GRAVE - (?\,CZ(B . ?\x00DA) ;; LATIN CAPITAL LETTER U WITH ACUTE - (?\,C[(B . ?\x00DB) ;; LATIN CAPITAL LETTER U WITH CIRCUMFLEX - (?\,C\(B . ?\x00DC) ;; LATIN CAPITAL LETTER U WITH DIAERESIS - (?\,C](B . ?\x016C) ;; LATIN CAPITAL LETTER U WITH BREVE - (?\,C^(B . ?\x015C) ;; LATIN CAPITAL LETTER S WITH CIRCUMFLEX - (?\,C_(B . ?\x00DF) ;; LATIN SMALL LETTER SHARP S - (?\,C`(B . ?\x00E0) ;; LATIN SMALL LETTER A WITH GRAVE - (?\,Ca(B . ?\x00E1) ;; LATIN SMALL LETTER A WITH ACUTE - (?\,Cb(B . ?\x00E2) ;; LATIN SMALL LETTER A WITH CIRCUMFLEX - (?\,Cd(B . ?\x00E4) ;; LATIN SMALL LETTER A WITH DIAERESIS - (?\,Ce(B . ?\x010B) ;; LATIN SMALL LETTER C WITH DOT ABOVE - (?\,Cf(B . ?\x0109) ;; LATIN SMALL LETTER C WITH CIRCUMFLEX - (?\,Cg(B . ?\x00E7) ;; LATIN SMALL LETTER C WITH CEDILLA - (?\,Ch(B . ?\x00E8) ;; LATIN SMALL LETTER E WITH GRAVE - (?\,Ci(B . ?\x00E9) ;; LATIN SMALL LETTER E WITH ACUTE - (?\,Cj(B . ?\x00EA) ;; LATIN SMALL LETTER E WITH CIRCUMFLEX - (?\,Ck(B . ?\x00EB) ;; LATIN SMALL LETTER E WITH DIAERESIS - (?\,Cl(B . ?\x00EC) ;; LATIN SMALL LETTER I WITH GRAVE - (?\,Cm(B . ?\x00ED) ;; LATIN SMALL LETTER I WITH ACUTE - (?\,Cn(B . ?\x00EE) ;; LATIN SMALL LETTER I WITH CIRCUMFLEX - (?\,Co(B . ?\x00EF) ;; LATIN SMALL LETTER I WITH DIAERESIS - (?\,Cq(B . ?\x00F1) ;; LATIN SMALL LETTER N WITH TILDE - (?\,Cr(B . ?\x00F2) ;; LATIN SMALL LETTER O WITH GRAVE - (?\,Cs(B . ?\x00F3) ;; LATIN SMALL LETTER O WITH ACUTE - (?\,Ct(B . ?\x00F4) ;; LATIN SMALL LETTER O WITH CIRCUMFLEX - (?\,Cu(B . ?\x0121) ;; LATIN SMALL LETTER G WITH DOT ABOVE - (?\,Cv(B . ?\x00F6) ;; LATIN SMALL LETTER O WITH DIAERESIS - (?\,Cw(B . ?\x00F7) ;; DIVISION SIGN - (?\,Cx(B . ?\x011D) ;; LATIN SMALL LETTER G WITH CIRCUMFLEX - (?\,Cy(B . ?\x00F9) ;; LATIN SMALL LETTER U WITH GRAVE - (?\,Cz(B . ?\x00FA) ;; LATIN SMALL LETTER U WITH ACUTE - (?\,C{(B . ?\x00FB) ;; LATIN SMALL LETTER U WITH CIRCUMFLEX - (?\,C|(B . ?\x00FC) ;; LATIN SMALL LETTER U WITH DIAERESIS - (?\,C}(B . ?\x016D) ;; LATIN SMALL LETTER U WITH BREVE - (?\,C~(B . ?\x015D) ;; LATIN SMALL LETTER S WITH CIRCUMFLEX - (?\,C(B . ?\x02D9) ;; DOT ABOVE - )) - - (ucs-8859-4-alist - '((?\,D (B . ?\x00A0) ;; NO-BREAK SPACE - (?\,D!(B . ?\x0104) ;; LATIN CAPITAL LETTER A WITH OGONEK - (?\,D"(B . ?\x0138) ;; LATIN SMALL LETTER KRA - (?\,D#(B . ?\x0156) ;; LATIN CAPITAL LETTER R WITH CEDILLA - (?\,D$(B . ?\x00A4) ;; CURRENCY SIGN - (?\,D%(B . ?\x0128) ;; LATIN CAPITAL LETTER I WITH TILDE - (?\,D&(B . ?\x013B) ;; LATIN CAPITAL LETTER L WITH CEDILLA - (?\,D'(B . ?\x00A7) ;; SECTION SIGN - (?\,D((B . ?\x00A8) ;; DIAERESIS - (?\,D)(B . ?\x0160) ;; LATIN CAPITAL LETTER S WITH CARON - (?\,D*(B . ?\x0112) ;; LATIN CAPITAL LETTER E WITH MACRON - (?\,D+(B . ?\x0122) ;; LATIN CAPITAL LETTER G WITH CEDILLA - (?\,D,(B . ?\x0166) ;; LATIN CAPITAL LETTER T WITH STROKE - (?\,D-(B . ?\x00AD) ;; SOFT HYPHEN - (?\,D.(B . ?\x017D) ;; LATIN CAPITAL LETTER Z WITH CARON - (?\,D/(B . ?\x00AF) ;; MACRON - (?\,D0(B . ?\x00B0) ;; DEGREE SIGN - (?\,D1(B . ?\x0105) ;; LATIN SMALL LETTER A WITH OGONEK - (?\,D2(B . ?\x02DB) ;; OGONEK - (?\,D3(B . ?\x0157) ;; LATIN SMALL LETTER R WITH CEDILLA - (?\,D4(B . ?\x00B4) ;; ACUTE ACCENT - (?\,D5(B . ?\x0129) ;; LATIN SMALL LETTER I WITH TILDE - (?\,D6(B . ?\x013C) ;; LATIN SMALL LETTER L WITH CEDILLA - (?\,D7(B . ?\x02C7) ;; CARON - (?\,D8(B . ?\x00B8) ;; CEDILLA - (?\,D9(B . ?\x0161) ;; LATIN SMALL LETTER S WITH CARON - (?\,D:(B . ?\x0113) ;; LATIN SMALL LETTER E WITH MACRON - (?\,D;(B . ?\x0123) ;; LATIN SMALL LETTER G WITH CEDILLA - (?\,D<(B . ?\x0167) ;; LATIN SMALL LETTER T WITH STROKE - (?\,D=(B . ?\x014A) ;; LATIN CAPITAL LETTER ENG - (?\,D>(B . ?\x017E) ;; LATIN SMALL LETTER Z WITH CARON - (?\,D?(B . ?\x014B) ;; LATIN SMALL LETTER ENG - (?\,D@(B . ?\x0100) ;; LATIN CAPITAL LETTER A WITH MACRON - (?\,DA(B . ?\x00C1) ;; LATIN CAPITAL LETTER A WITH ACUTE - (?\,DB(B . ?\x00C2) ;; LATIN CAPITAL LETTER A WITH CIRCUMFLEX - (?\,DC(B . ?\x00C3) ;; LATIN CAPITAL LETTER A WITH TILDE - (?\,DD(B . ?\x00C4) ;; LATIN CAPITAL LETTER A WITH DIAERESIS - (?\,DE(B . ?\x00C5) ;; LATIN CAPITAL LETTER A WITH RING ABOVE - (?\,DF(B . ?\x00C6) ;; LATIN CAPITAL LETTER AE - (?\,DG(B . ?\x012E) ;; LATIN CAPITAL LETTER I WITH OGONEK - (?\,DH(B . ?\x010C) ;; LATIN CAPITAL LETTER C WITH CARON - (?\,DI(B . ?\x00C9) ;; LATIN CAPITAL LETTER E WITH ACUTE - (?\,DJ(B . ?\x0118) ;; LATIN CAPITAL LETTER E WITH OGONEK - (?\,DK(B . ?\x00CB) ;; LATIN CAPITAL LETTER E WITH DIAERESIS - (?\,DL(B . ?\x0116) ;; LATIN CAPITAL LETTER E WITH DOT ABOVE - (?\,DM(B . ?\x00CD) ;; LATIN CAPITAL LETTER I WITH ACUTE - (?\,DN(B . ?\x00CE) ;; LATIN CAPITAL LETTER I WITH CIRCUMFLEX - (?\,DO(B . ?\x012A) ;; LATIN CAPITAL LETTER I WITH MACRON - (?\,DP(B . ?\x0110) ;; LATIN CAPITAL LETTER D WITH STROKE - (?\,DQ(B . ?\x0145) ;; LATIN CAPITAL LETTER N WITH CEDILLA - (?\,DR(B . ?\x014C) ;; LATIN CAPITAL LETTER O WITH MACRON - (?\,DS(B . ?\x0136) ;; LATIN CAPITAL LETTER K WITH CEDILLA - (?\,DT(B . ?\x00D4) ;; LATIN CAPITAL LETTER O WITH CIRCUMFLEX - (?\,DU(B . ?\x00D5) ;; LATIN CAPITAL LETTER O WITH TILDE - (?\,DV(B . ?\x00D6) ;; LATIN CAPITAL LETTER O WITH DIAERESIS - (?\,DW(B . ?\x00D7) ;; MULTIPLICATION SIGN - (?\,DX(B . ?\x00D8) ;; LATIN CAPITAL LETTER O WITH STROKE - (?\,DY(B . ?\x0172) ;; LATIN CAPITAL LETTER U WITH OGONEK - (?\,DZ(B . ?\x00DA) ;; LATIN CAPITAL LETTER U WITH ACUTE - (?\,D[(B . ?\x00DB) ;; LATIN CAPITAL LETTER U WITH CIRCUMFLEX - (?\,D\(B . ?\x00DC) ;; LATIN CAPITAL LETTER U WITH DIAERESIS - (?\,D](B . ?\x0168) ;; LATIN CAPITAL LETTER U WITH TILDE - (?\,D^(B . ?\x016A) ;; LATIN CAPITAL LETTER U WITH MACRON - (?\,D_(B . ?\x00DF) ;; LATIN SMALL LETTER SHARP S - (?\,D`(B . ?\x0101) ;; LATIN SMALL LETTER A WITH MACRON - (?\,Da(B . ?\x00E1) ;; LATIN SMALL LETTER A WITH ACUTE - (?\,Db(B . ?\x00E2) ;; LATIN SMALL LETTER A WITH CIRCUMFLEX - (?\,Dc(B . ?\x00E3) ;; LATIN SMALL LETTER A WITH TILDE - (?\,Dd(B . ?\x00E4) ;; LATIN SMALL LETTER A WITH DIAERESIS - (?\,De(B . ?\x00E5) ;; LATIN SMALL LETTER A WITH RING ABOVE - (?\,Df(B . ?\x00E6) ;; LATIN SMALL LETTER AE - (?\,Dg(B . ?\x012F) ;; LATIN SMALL LETTER I WITH OGONEK - (?\,Dh(B . ?\x010D) ;; LATIN SMALL LETTER C WITH CARON - (?\,Di(B . ?\x00E9) ;; LATIN SMALL LETTER E WITH ACUTE - (?\,Dj(B . ?\x0119) ;; LATIN SMALL LETTER E WITH OGONEK - (?\,Dk(B . ?\x00EB) ;; LATIN SMALL LETTER E WITH DIAERESIS - (?\,Dl(B . ?\x0117) ;; LATIN SMALL LETTER E WITH DOT ABOVE - (?\,Dm(B . ?\x00ED) ;; LATIN SMALL LETTER I WITH ACUTE - (?\,Dn(B . ?\x00EE) ;; LATIN SMALL LETTER I WITH CIRCUMFLEX - (?\,Do(B . ?\x012B) ;; LATIN SMALL LETTER I WITH MACRON - (?\,Dp(B . ?\x0111) ;; LATIN SMALL LETTER D WITH STROKE - (?\,Dq(B . ?\x0146) ;; LATIN SMALL LETTER N WITH CEDILLA - (?\,Dr(B . ?\x014D) ;; LATIN SMALL LETTER O WITH MACRON - (?\,Ds(B . ?\x0137) ;; LATIN SMALL LETTER K WITH CEDILLA - (?\,Dt(B . ?\x00F4) ;; LATIN SMALL LETTER O WITH CIRCUMFLEX - (?\,Du(B . ?\x00F5) ;; LATIN SMALL LETTER O WITH TILDE - (?\,Dv(B . ?\x00F6) ;; LATIN SMALL LETTER O WITH DIAERESIS - (?\,Dw(B . ?\x00F7) ;; DIVISION SIGN - (?\,Dx(B . ?\x00F8) ;; LATIN SMALL LETTER O WITH STROKE - (?\,Dy(B . ?\x0173) ;; LATIN SMALL LETTER U WITH OGONEK - (?\,Dz(B . ?\x00FA) ;; LATIN SMALL LETTER U WITH ACUTE - (?\,D{(B . ?\x00FB) ;; LATIN SMALL LETTER U WITH CIRCUMFLEX - (?\,D|(B . ?\x00FC) ;; LATIN SMALL LETTER U WITH DIAERESIS - (?\,D}(B . ?\x0169) ;; LATIN SMALL LETTER U WITH TILDE - (?\,D~(B . ?\x016B) ;; LATIN SMALL LETTER U WITH MACRON - (?\,D(B . ?\x02D9) ;; DOT ABOVE - )) - - (ucs-8859-5-alist - '((?\,L (B . ?\x00A0) ;; NO-BREAK SPACE - (?\,L!(B . ?\x0401) ;; CYRILLIC CAPITAL LETTER IO - (?\,L"(B . ?\x0402) ;; CYRILLIC CAPITAL LETTER DJE - (?\,L#(B . ?\x0403) ;; CYRILLIC CAPITAL LETTER GJE - (?\,L$(B . ?\x0404) ;; CYRILLIC CAPITAL LETTER UKRAINIAN IE - (?\,L%(B . ?\x0405) ;; CYRILLIC CAPITAL LETTER DZE - (?\,L&(B . ?\x0406) ;; CYRILLIC CAPITAL LETTER BYELORUSSIAN-UKRAINIAN I - (?\,L'(B . ?\x0407) ;; CYRILLIC CAPITAL LETTER YI - (?\,L((B . ?\x0408) ;; CYRILLIC CAPITAL LETTER JE - (?\,L)(B . ?\x0409) ;; CYRILLIC CAPITAL LETTER LJE - (?\,L*(B . ?\x040A) ;; CYRILLIC CAPITAL LETTER NJE - (?\,L+(B . ?\x040B) ;; CYRILLIC CAPITAL LETTER TSHE - (?\,L,(B . ?\x040C) ;; CYRILLIC CAPITAL LETTER KJE - (?\,L-(B . ?\x00AD) ;; SOFT HYPHEN - (?\,L.(B . ?\x040E) ;; CYRILLIC CAPITAL LETTER SHORT U - (?\,L/(B . ?\x040F) ;; CYRILLIC CAPITAL LETTER DZHE - (?\,L0(B . ?\x0410) ;; CYRILLIC CAPITAL LETTER A - (?\,L1(B . ?\x0411) ;; CYRILLIC CAPITAL LETTER BE - (?\,L2(B . ?\x0412) ;; CYRILLIC CAPITAL LETTER VE - (?\,L3(B . ?\x0413) ;; CYRILLIC CAPITAL LETTER GHE - (?\,L4(B . ?\x0414) ;; CYRILLIC CAPITAL LETTER DE - (?\,L5(B . ?\x0415) ;; CYRILLIC CAPITAL LETTER IE - (?\,L6(B . ?\x0416) ;; CYRILLIC CAPITAL LETTER ZHE - (?\,L7(B . ?\x0417) ;; CYRILLIC CAPITAL LETTER ZE - (?\,L8(B . ?\x0418) ;; CYRILLIC CAPITAL LETTER I - (?\,L9(B . ?\x0419) ;; CYRILLIC CAPITAL LETTER SHORT I - (?\,L:(B . ?\x041A) ;; CYRILLIC CAPITAL LETTER KA - (?\,L;(B . ?\x041B) ;; CYRILLIC CAPITAL LETTER EL - (?\,L<(B . ?\x041C) ;; CYRILLIC CAPITAL LETTER EM - (?\,L=(B . ?\x041D) ;; CYRILLIC CAPITAL LETTER EN - (?\,L>(B . ?\x041E) ;; CYRILLIC CAPITAL LETTER O - (?\,L?(B . ?\x041F) ;; CYRILLIC CAPITAL LETTER PE - (?\,L@(B . ?\x0420) ;; CYRILLIC CAPITAL LETTER ER - (?\,LA(B . ?\x0421) ;; CYRILLIC CAPITAL LETTER ES - (?\,LB(B . ?\x0422) ;; CYRILLIC CAPITAL LETTER TE - (?\,LC(B . ?\x0423) ;; CYRILLIC CAPITAL LETTER U - (?\,LD(B . ?\x0424) ;; CYRILLIC CAPITAL LETTER EF - (?\,LE(B . ?\x0425) ;; CYRILLIC CAPITAL LETTER HA - (?\,LF(B . ?\x0426) ;; CYRILLIC CAPITAL LETTER TSE - (?\,LG(B . ?\x0427) ;; CYRILLIC CAPITAL LETTER CHE - (?\,LH(B . ?\x0428) ;; CYRILLIC CAPITAL LETTER SHA - (?\,LI(B . ?\x0429) ;; CYRILLIC CAPITAL LETTER SHCHA - (?\,LJ(B . ?\x042A) ;; CYRILLIC CAPITAL LETTER HARD SIGN - (?\,LK(B . ?\x042B) ;; CYRILLIC CAPITAL LETTER YERU - (?\,LL(B . ?\x042C) ;; CYRILLIC CAPITAL LETTER SOFT SIGN - (?\,LM(B . ?\x042D) ;; CYRILLIC CAPITAL LETTER E - (?\,LN(B . ?\x042E) ;; CYRILLIC CAPITAL LETTER YU - (?\,LO(B . ?\x042F) ;; CYRILLIC CAPITAL LETTER YA - (?\,LP(B . ?\x0430) ;; CYRILLIC SMALL LETTER A - (?\,LQ(B . ?\x0431) ;; CYRILLIC SMALL LETTER BE - (?\,LR(B . ?\x0432) ;; CYRILLIC SMALL LETTER VE - (?\,LS(B . ?\x0433) ;; CYRILLIC SMALL LETTER GHE - (?\,LT(B . ?\x0434) ;; CYRILLIC SMALL LETTER DE - (?\,LU(B . ?\x0435) ;; CYRILLIC SMALL LETTER IE - (?\,LV(B . ?\x0436) ;; CYRILLIC SMALL LETTER ZHE - (?\,LW(B . ?\x0437) ;; CYRILLIC SMALL LETTER ZE - (?\,LX(B . ?\x0438) ;; CYRILLIC SMALL LETTER I - (?\,LY(B . ?\x0439) ;; CYRILLIC SMALL LETTER SHORT I - (?\,LZ(B . ?\x043A) ;; CYRILLIC SMALL LETTER KA - (?\,L[(B . ?\x043B) ;; CYRILLIC SMALL LETTER EL - (?\,L\(B . ?\x043C) ;; CYRILLIC SMALL LETTER EM - (?\,L](B . ?\x043D) ;; CYRILLIC SMALL LETTER EN - (?\,L^(B . ?\x043E) ;; CYRILLIC SMALL LETTER O - (?\,L_(B . ?\x043F) ;; CYRILLIC SMALL LETTER PE - (?\,L`(B . ?\x0440) ;; CYRILLIC SMALL LETTER ER - (?\,La(B . ?\x0441) ;; CYRILLIC SMALL LETTER ES - (?\,Lb(B . ?\x0442) ;; CYRILLIC SMALL LETTER TE - (?\,Lc(B . ?\x0443) ;; CYRILLIC SMALL LETTER U - (?\,Ld(B . ?\x0444) ;; CYRILLIC SMALL LETTER EF - (?\,Le(B . ?\x0445) ;; CYRILLIC SMALL LETTER HA - (?\,Lf(B . ?\x0446) ;; CYRILLIC SMALL LETTER TSE - (?\,Lg(B . ?\x0447) ;; CYRILLIC SMALL LETTER CHE - (?\,Lh(B . ?\x0448) ;; CYRILLIC SMALL LETTER SHA - (?\,Li(B . ?\x0449) ;; CYRILLIC SMALL LETTER SHCHA - (?\,Lj(B . ?\x044A) ;; CYRILLIC SMALL LETTER HARD SIGN - (?\,Lk(B . ?\x044B) ;; CYRILLIC SMALL LETTER YERU - (?\,Ll(B . ?\x044C) ;; CYRILLIC SMALL LETTER SOFT SIGN - (?\,Lm(B . ?\x044D) ;; CYRILLIC SMALL LETTER E - (?\,Ln(B . ?\x044E) ;; CYRILLIC SMALL LETTER YU - (?\,Lo(B . ?\x044F) ;; CYRILLIC SMALL LETTER YA - (?\,Lp(B . ?\x2116) ;; NUMERO SIGN - (?\,Lq(B . ?\x0451) ;; CYRILLIC SMALL LETTER IO - (?\,Lr(B . ?\x0452) ;; CYRILLIC SMALL LETTER DJE - (?\,Ls(B . ?\x0453) ;; CYRILLIC SMALL LETTER GJE - (?\,Lt(B . ?\x0454) ;; CYRILLIC SMALL LETTER UKRAINIAN IE - (?\,Lu(B . ?\x0455) ;; CYRILLIC SMALL LETTER DZE - (?\,Lv(B . ?\x0456) ;; CYRILLIC SMALL LETTER BYELORUSSIAN-UKRAINIAN I - (?\,Lw(B . ?\x0457) ;; CYRILLIC SMALL LETTER YI - (?\,Lx(B . ?\x0458) ;; CYRILLIC SMALL LETTER JE - (?\,Ly(B . ?\x0459) ;; CYRILLIC SMALL LETTER LJE - (?\,Lz(B . ?\x045A) ;; CYRILLIC SMALL LETTER NJE - (?\,L{(B . ?\x045B) ;; CYRILLIC SMALL LETTER TSHE - (?\,L|(B . ?\x045C) ;; CYRILLIC SMALL LETTER KJE - (?\,L}(B . ?\x00A7) ;; SECTION SIGN - (?\,L~(B . ?\x045E) ;; CYRILLIC SMALL LETTER SHORT U - (?\,L(B . ?\x045F) ;; CYRILLIC SMALL LETTER DZHE - )) - - ;; Arabic probably isn't so useful in the absence of Arabic - ;; language support. - (ucs-8859-6-alist - '((?,G (B . ?\x00A0) ;; NO-BREAK SPACE - (?,G$(B . ?\x00A4) ;; CURRENCY SIGN - (?,G,(B . ?\x060C) ;; ARABIC COMMA - (?,G-(B . ?\x00AD) ;; SOFT HYPHEN - (?,G;(B . ?\x061B) ;; ARABIC SEMICOLON - (?,G?(B . ?\x061F) ;; ARABIC QUESTION MARK - (?,GA(B . ?\x0621) ;; ARABIC LETTER HAMZA - (?,GB(B . ?\x0622) ;; ARABIC LETTER ALEF WITH MADDA ABOVE - (?,GC(B . ?\x0623) ;; ARABIC LETTER ALEF WITH HAMZA ABOVE - (?,GD(B . ?\x0624) ;; ARABIC LETTER WAW WITH HAMZA ABOVE - (?,GE(B . ?\x0625) ;; ARABIC LETTER ALEF WITH HAMZA BELOW - (?,GF(B . ?\x0626) ;; ARABIC LETTER YEH WITH HAMZA ABOVE - (?,GG(B . ?\x0627) ;; ARABIC LETTER ALEF - (?,GH(B . ?\x0628) ;; ARABIC LETTER BEH - (?,GI(B . ?\x0629) ;; ARABIC LETTER TEH MARBUTA - (?,GJ(B . ?\x062A) ;; ARABIC LETTER TEH - (?,GK(B . ?\x062B) ;; ARABIC LETTER THEH - (?,GL(B . ?\x062C) ;; ARABIC LETTER JEEM - (?,GM(B . ?\x062D) ;; ARABIC LETTER HAH - (?,GN(B . ?\x062E) ;; ARABIC LETTER KHAH - (?,GO(B . ?\x062F) ;; ARABIC LETTER DAL - (?,GP(B . ?\x0630) ;; ARABIC LETTER THAL - (?,GQ(B . ?\x0631) ;; ARABIC LETTER REH - (?,GR(B . ?\x0632) ;; ARABIC LETTER ZAIN - (?,GS(B . ?\x0633) ;; ARABIC LETTER SEEN - (?,GT(B . ?\x0634) ;; ARABIC LETTER SHEEN - (?,GU(B . ?\x0635) ;; ARABIC LETTER SAD - (?,GV(B . ?\x0636) ;; ARABIC LETTER DAD - (?,GW(B . ?\x0637) ;; ARABIC LETTER TAH - (?,GX(B . ?\x0638) ;; ARABIC LETTER ZAH - (?,GY(B . ?\x0639) ;; ARABIC LETTER AIN - (?,GZ(B . ?\x063A) ;; ARABIC LETTER GHAIN - (?,G`(B . ?\x0640) ;; ARABIC TATWEEL - (?,Ga(B . ?\x0641) ;; ARABIC LETTER FEH - (?,Gb(B . ?\x0642) ;; ARABIC LETTER QAF - (?,Gc(B . ?\x0643) ;; ARABIC LETTER KAF - (?,Gd(B . ?\x0644) ;; ARABIC LETTER LAM - (?,Ge(B . ?\x0645) ;; ARABIC LETTER MEEM - (?,Gf(B . ?\x0646) ;; ARABIC LETTER NOON - (?,Gg(B . ?\x0647) ;; ARABIC LETTER HEH - (?,Gh(B . ?\x0648) ;; ARABIC LETTER WAW - (?,Gi(B . ?\x0649) ;; ARABIC LETTER ALEF MAKSURA - (?,Gj(B . ?\x064A) ;; ARABIC LETTER YEH - (?,Gk(B . ?\x064B) ;; ARABIC FATHATAN - (?,Gl(B . ?\x064C) ;; ARABIC DAMMATAN - (?,Gm(B . ?\x064D) ;; ARABIC KASRATAN - (?,Gn(B . ?\x064E) ;; ARABIC FATHA - (?,Go(B . ?\x064F) ;; ARABIC DAMMA - (?,Gp(B . ?\x0650) ;; ARABIC KASRA - (?,Gq(B . ?\x0651) ;; ARABIC SHADDA - (?,Gr(B . ?\x0652) ;; ARABIC SUKUN - )) - - (ucs-8859-7-alist - '((?\,F (B . ?\x00A0) ;; NO-BREAK SPACE - (?\,F!(B . ?\x2018) ;; LEFT SINGLE QUOTATION MARK - (?\,F"(B . ?\x2019) ;; RIGHT SINGLE QUOTATION MARK - (?\,F#(B . ?\x00A3) ;; POUND SIGN - (?\$ . ?\x20AC) ;; EURO SIGN - (?\% . ?\x20AF) ;; DRACHMA SIGN - (?\,F&(B . ?\x00A6) ;; BROKEN BAR - (?\,F'(B . ?\x00A7) ;; SECTION SIGN - (?\,F((B . ?\x00A8) ;; DIAERESIS - (?\,F)(B . ?\x00A9) ;; COPYRIGHT SIGN - (?\* . ?\x037A) ;; GREEK YPOGEGRAMMENI - (?\,F+(B . ?\x00AB) ;; LEFT-POINTING DOUBLE ANGLE QUOTATION MARK - (?\,F,(B . ?\x00AC) ;; NOT SIGN - (?\,F-(B . ?\x00AD) ;; SOFT HYPHEN - (?\,F/(B . ?\x2015) ;; HORIZONTAL BAR - (?\,F0(B . ?\x00B0) ;; DEGREE SIGN - (?\,F1(B . ?\x00B1) ;; PLUS-MINUS SIGN - (?\,F2(B . ?\x00B2) ;; SUPERSCRIPT TWO - (?\,F3(B . ?\x00B3) ;; SUPERSCRIPT THREE - (?\,F4(B . ?\x0384) ;; GREEK TONOS - (?\,F5(B . ?\x0385) ;; GREEK DIALYTIKA TONOS - (?\,F6(B . ?\x0386) ;; GREEK CAPITAL LETTER ALPHA WITH TONOS - (?\,F7(B . ?\x00B7) ;; MIDDLE DOT - (?\,F8(B . ?\x0388) ;; GREEK CAPITAL LETTER EPSILON WITH TONOS - (?\,F9(B . ?\x0389) ;; GREEK CAPITAL LETTER ETA WITH TONOS - (?\,F:(B . ?\x038A) ;; GREEK CAPITAL LETTER IOTA WITH TONOS - (?\,F;(B . ?\x00BB) ;; RIGHT-POINTING DOUBLE ANGLE QUOTATION MARK - (?\,F<(B . ?\x038C) ;; GREEK CAPITAL LETTER OMICRON WITH TONOS - (?\,F=(B . ?\x00BD) ;; VULGAR FRACTION ONE HALF - (?\,F>(B . ?\x038E) ;; GREEK CAPITAL LETTER UPSILON WITH TONOS - (?\,F?(B . ?\x038F) ;; GREEK CAPITAL LETTER OMEGA WITH TONOS - (?\,F@(B . ?\x0390) ;; GREEK SMALL LETTER IOTA WITH DIALYTIKA AND TONOS - (?\,FA(B . ?\x0391) ;; GREEK CAPITAL LETTER ALPHA - (?\,FB(B . ?\x0392) ;; GREEK CAPITAL LETTER BETA - (?\,FC(B . ?\x0393) ;; GREEK CAPITAL LETTER GAMMA - (?\,FD(B . ?\x0394) ;; GREEK CAPITAL LETTER DELTA - (?\,FE(B . ?\x0395) ;; GREEK CAPITAL LETTER EPSILON - (?\,FF(B . ?\x0396) ;; GREEK CAPITAL LETTER ZETA - (?\,FG(B . ?\x0397) ;; GREEK CAPITAL LETTER ETA - (?\,FH(B . ?\x0398) ;; GREEK CAPITAL LETTER THETA - (?\,FI(B . ?\x0399) ;; GREEK CAPITAL LETTER IOTA - (?\,FJ(B . ?\x039A) ;; GREEK CAPITAL LETTER KAPPA - (?\,FK(B . ?\x039B) ;; GREEK CAPITAL LETTER LAMDA - (?\,FL(B . ?\x039C) ;; GREEK CAPITAL LETTER MU - (?\,FM(B . ?\x039D) ;; GREEK CAPITAL LETTER NU - (?\,FN(B . ?\x039E) ;; GREEK CAPITAL LETTER XI - (?\,FO(B . ?\x039F) ;; GREEK CAPITAL LETTER OMICRON - (?\,FP(B . ?\x03A0) ;; GREEK CAPITAL LETTER PI - (?\,FQ(B . ?\x03A1) ;; GREEK CAPITAL LETTER RHO - (?\,FS(B . ?\x03A3) ;; GREEK CAPITAL LETTER SIGMA - (?\,FT(B . ?\x03A4) ;; GREEK CAPITAL LETTER TAU - (?\,FU(B . ?\x03A5) ;; GREEK CAPITAL LETTER UPSILON - (?\,FV(B . ?\x03A6) ;; GREEK CAPITAL LETTER PHI - (?\,FW(B . ?\x03A7) ;; GREEK CAPITAL LETTER CHI - (?\,FX(B . ?\x03A8) ;; GREEK CAPITAL LETTER PSI - (?\,FY(B . ?\x03A9) ;; GREEK CAPITAL LETTER OMEGA - (?\,FZ(B . ?\x03AA) ;; GREEK CAPITAL LETTER IOTA WITH DIALYTIKA - (?\,F[(B . ?\x03AB) ;; GREEK CAPITAL LETTER UPSILON WITH DIALYTIKA - (?\,F\(B . ?\x03AC) ;; GREEK SMALL LETTER ALPHA WITH TONOS - (?\,F](B . ?\x03AD) ;; GREEK SMALL LETTER EPSILON WITH TONOS - (?\,F^(B . ?\x03AE) ;; GREEK SMALL LETTER ETA WITH TONOS - (?\,F_(B . ?\x03AF) ;; GREEK SMALL LETTER IOTA WITH TONOS - (?\,F`(B . ?\x03B0) ;; GREEK SMALL LETTER UPSILON WITH DIALYTIKA AND TONOS - (?\,Fa(B . ?\x03B1) ;; GREEK SMALL LETTER ALPHA - (?\,Fb(B . ?\x03B2) ;; GREEK SMALL LETTER BETA - (?\,Fc(B . ?\x03B3) ;; GREEK SMALL LETTER GAMMA - (?\,Fd(B . ?\x03B4) ;; GREEK SMALL LETTER DELTA - (?\,Fe(B . ?\x03B5) ;; GREEK SMALL LETTER EPSILON - (?\,Ff(B . ?\x03B6) ;; GREEK SMALL LETTER ZETA - (?\,Fg(B . ?\x03B7) ;; GREEK SMALL LETTER ETA - (?\,Fh(B . ?\x03B8) ;; GREEK SMALL LETTER THETA - (?\,Fi(B . ?\x03B9) ;; GREEK SMALL LETTER IOTA - (?\,Fj(B . ?\x03BA) ;; GREEK SMALL LETTER KAPPA - (?\,Fk(B . ?\x03BB) ;; GREEK SMALL LETTER LAMDA - (?\,Fl(B . ?\x03BC) ;; GREEK SMALL LETTER MU - (?\,Fm(B . ?\x03BD) ;; GREEK SMALL LETTER NU - (?\,Fn(B . ?\x03BE) ;; GREEK SMALL LETTER XI - (?\,Fo(B . ?\x03BF) ;; GREEK SMALL LETTER OMICRON - (?\,Fp(B . ?\x03C0) ;; GREEK SMALL LETTER PI - (?\,Fq(B . ?\x03C1) ;; GREEK SMALL LETTER RHO - (?\,Fr(B . ?\x03C2) ;; GREEK SMALL LETTER FINAL SIGMA - (?\,Fs(B . ?\x03C3) ;; GREEK SMALL LETTER SIGMA - (?\,Ft(B . ?\x03C4) ;; GREEK SMALL LETTER TAU - (?\,Fu(B . ?\x03C5) ;; GREEK SMALL LETTER UPSILON - (?\,Fv(B . ?\x03C6) ;; GREEK SMALL LETTER PHI - (?\,Fw(B . ?\x03C7) ;; GREEK SMALL LETTER CHI - (?\,Fx(B . ?\x03C8) ;; GREEK SMALL LETTER PSI - (?\,Fy(B . ?\x03C9) ;; GREEK SMALL LETTER OMEGA - (?\,Fz(B . ?\x03CA) ;; GREEK SMALL LETTER IOTA WITH DIALYTIKA - (?\,F{(B . ?\x03CB) ;; GREEK SMALL LETTER UPSILON WITH DIALYTIKA - (?\,F|(B . ?\x03CC) ;; GREEK SMALL LETTER OMICRON WITH TONOS - (?\,F}(B . ?\x03CD) ;; GREEK SMALL LETTER UPSILON WITH TONOS - (?\,F~(B . ?\x03CE) ;; GREEK SMALL LETTER OMEGA WITH TONOS - )) - - (ucs-8859-8-alist - '((?\,H (B . ?\x00A0) ;; NO-BREAK SPACE - (?\,H"(B . ?\x00A2) ;; CENT SIGN - (?\,H#(B . ?\x00A3) ;; POUND SIGN - (?\,H$(B . ?\x00A4) ;; CURRENCY SIGN - (?\,H%(B . ?\x00A5) ;; YEN SIGN - (?\,H&(B . ?\x00A6) ;; BROKEN BAR - (?\,H'(B . ?\x00A7) ;; SECTION SIGN - (?\,H((B . ?\x00A8) ;; DIAERESIS - (?\,H)(B . ?\x00A9) ;; COPYRIGHT SIGN - (?\,H*(B . ?\x00D7) ;; MULTIPLICATION SIGN - (?\,H+(B . ?\x00AB) ;; LEFT-POINTING DOUBLE ANGLE QUOTATION MARK - (?\,H,(B . ?\x00AC) ;; NOT SIGN - (?\,H-(B . ?\x00AD) ;; SOFT HYPHEN - (?\,H.(B . ?\x00AE) ;; REGISTERED SIGN - (?\,H/(B . ?\x00AF) ;; MACRON - (?\,H0(B . ?\x00B0) ;; DEGREE SIGN - (?\,H1(B . ?\x00B1) ;; PLUS-MINUS SIGN - (?\,H2(B . ?\x00B2) ;; SUPERSCRIPT TWO - (?\,H3(B . ?\x00B3) ;; SUPERSCRIPT THREE - (?\,H4(B . ?\x00B4) ;; ACUTE ACCENT - (?\,H5(B . ?\x00B5) ;; MICRO SIGN - (?\,H6(B . ?\x00B6) ;; PILCROW SIGN - (?\,H7(B . ?\x00B7) ;; MIDDLE DOT - (?\,H8(B . ?\x00B8) ;; CEDILLA - (?\,H9(B . ?\x00B9) ;; SUPERSCRIPT ONE - (?\,H:(B . ?\x00F7) ;; DIVISION SIGN - (?\,H;(B . ?\x00BB) ;; RIGHT-POINTING DOUBLE ANGLE QUOTATION MARK - (?\,H<(B . ?\x00BC) ;; VULGAR FRACTION ONE QUARTER - (?\,H=(B . ?\x00BD) ;; VULGAR FRACTION ONE HALF - (?\,H>(B . ?\x00BE) ;; VULGAR FRACTION THREE QUARTERS - ;; These are commented out since the current 8859-8 standard - ;; does not yet define these codepoints, although there are - ;; drafts which do). -; (?\@ . ?\x05B0) ;; HEBREW POINT SHEVA -; (?\A . ?\x05B1) ;; HEBREW POINT HATAF SEGOL -; (?\B . ?\x05B2) ;; HEBREW POINT HATAF PATAH -; (?\C . ?\x05B3) ;; HEBREW POINT HATAF QAMATS -; (?\D . ?\x05B4) ;; HEBREW POINT HIRIQ -; (?\E . ?\x05B5) ;; HEBREW POINT TSERE -; (?\F . ?\x05B6) ;; HEBREW POINT SEGOL -; (?\G . ?\x05B7) ;; HEBREW POINT PATAH -; (?\H . ?\x05B8) ;; HEBREW POINT QAMATS -; (?\I . ?\x05B9) ;; HEBREW POINT HOLAM -; (?\K . ?\x05BB) ;; HEBREW POINT QUBUTS -; (?\L . ?\x05BC) ;; HEBREW POINT DAGESH -; (?\M . ?\x05BD) ;; HEBREW POINT METEG -; (?\N . ?\x05BE) ;; HEBREW POINT MAQAF -; (?\O . ?\x05BF) ;; HEBREW POINT RAFE -; (?\P . ?\x05C0) ;; HEBREW PUNCTUATION PASEQ -; (?\Q . ?\x05C1) ;; HEBREW POINT SHIN DOT -; (?\R . ?\x05C2) ;; HEBREW POINT SIN DOT -; (?\S . ?\x05C3) ;; HEBREW PUNCTUATION SOF PASUQ - (?\[ . ?\x202D) ;; LEFT-TO-RIGHT OVERRIDE - (?\\ . ?\x202E) ;; RIGHT-TO-LEFT OVERRIDE - (?\] . ?\x202C) ;; POP DIRECTIONAL FORMATTING - (?\,H_(B . ?\x2017) ;; DOUBLE LOW LINE - (?\,H`(B . ?\x05D0) ;; HEBREW LETTER ALEF - (?\,Ha(B . ?\x05D1) ;; HEBREW LETTER BET - (?\,Hb(B . ?\x05D2) ;; HEBREW LETTER GIMEL - (?\,Hc(B . ?\x05D3) ;; HEBREW LETTER DALET - (?\,Hd(B . ?\x05D4) ;; HEBREW LETTER HE - (?\,He(B . ?\x05D5) ;; HEBREW LETTER VAV - (?\,Hf(B . ?\x05D6) ;; HEBREW LETTER ZAYIN - (?\,Hg(B . ?\x05D7) ;; HEBREW LETTER HET - (?\,Hh(B . ?\x05D8) ;; HEBREW LETTER TET - (?\,Hi(B . ?\x05D9) ;; HEBREW LETTER YOD - (?\,Hj(B . ?\x05DA) ;; HEBREW LETTER FINAL KAF - (?\,Hk(B . ?\x05DB) ;; HEBREW LETTER KAF - (?\,Hl(B . ?\x05DC) ;; HEBREW LETTER LAMED - (?\,Hm(B . ?\x05DD) ;; HEBREW LETTER FINAL MEM - (?\,Hn(B . ?\x05DE) ;; HEBREW LETTER MEM - (?\,Ho(B . ?\x05DF) ;; HEBREW LETTER FINAL NUN - (?\,Hp(B . ?\x05E0) ;; HEBREW LETTER NUN - (?\,Hq(B . ?\x05E1) ;; HEBREW LETTER SAMEKH - (?\,Hr(B . ?\x05E2) ;; HEBREW LETTER AYIN - (?\,Hs(B . ?\x05E3) ;; HEBREW LETTER FINAL PE - (?\,Ht(B . ?\x05E4) ;; HEBREW LETTER PE - (?\,Hu(B . ?\x05E5) ;; HEBREW LETTER FINAL TSADI - (?\,Hv(B . ?\x05E6) ;; HEBREW LETTER TSADI - (?\,Hw(B . ?\x05E7) ;; HEBREW LETTER QOF - (?\,Hx(B . ?\x05E8) ;; HEBREW LETTER RESH - (?\,Hy(B . ?\x05E9) ;; HEBREW LETTER SHIN - (?\,Hz(B . ?\x05EA) ;; HEBREW LETTER TAV - (?\{ . ?\x202A) ;; LEFT-TO-RIGHT EMBEDDING - (?\| . ?\x202B) ;; RIGHT-TO-LEFT EMBEDDING - (?\,H}(B . ?\x200E) ;; LEFT-TO-RIGHT MARK - (?\,H~(B . ?\x200F) ;; RIGHT-TO-LEFT MARK - )) - - (ucs-8859-9-alist - '((?\,M (B . ?\x00A0) ;; NO-BREAK SPACE - (?\,M!(B . ?\x00A1) ;; INVERTED EXCLAMATION MARK - (?\,M"(B . ?\x00A2) ;; CENT SIGN - (?\,M#(B . ?\x00A3) ;; POUND SIGN - (?\,M$(B . ?\x00A4) ;; CURRENCY SIGN - (?\,M%(B . ?\x00A5) ;; YEN SIGN - (?\,M&(B . ?\x00A6) ;; BROKEN BAR - (?\,M'(B . ?\x00A7) ;; SECTION SIGN - (?\,M((B . ?\x00A8) ;; DIAERESIS - (?\,M)(B . ?\x00A9) ;; COPYRIGHT SIGN - (?\,M*(B . ?\x00AA) ;; FEMININE ORDINAL INDICATOR - (?\,M+(B . ?\x00AB) ;; LEFT-POINTING DOUBLE ANGLE QUOTATION MARK - (?\,M,(B . ?\x00AC) ;; NOT SIGN - (?\,M-(B . ?\x00AD) ;; SOFT HYPHEN - (?\,M.(B . ?\x00AE) ;; REGISTERED SIGN - (?\,M/(B . ?\x00AF) ;; MACRON - (?\,M0(B . ?\x00B0) ;; DEGREE SIGN - (?\,M1(B . ?\x00B1) ;; PLUS-MINUS SIGN - (?\,M2(B . ?\x00B2) ;; SUPERSCRIPT TWO - (?\,M3(B . ?\x00B3) ;; SUPERSCRIPT THREE - (?\,M4(B . ?\x00B4) ;; ACUTE ACCENT - (?\,M5(B . ?\x00B5) ;; MICRO SIGN - (?\,M6(B . ?\x00B6) ;; PILCROW SIGN - (?\,M7(B . ?\x00B7) ;; MIDDLE DOT - (?\,M8(B . ?\x00B8) ;; CEDILLA - (?\,M9(B . ?\x00B9) ;; SUPERSCRIPT ONE - (?\,M:(B . ?\x00BA) ;; MASCULINE ORDINAL INDICATOR - (?\,M;(B . ?\x00BB) ;; RIGHT-POINTING DOUBLE ANGLE QUOTATION MARK - (?\,M<(B . ?\x00BC) ;; VULGAR FRACTION ONE QUARTER - (?\,M=(B . ?\x00BD) ;; VULGAR FRACTION ONE HALF - (?\,M>(B . ?\x00BE) ;; VULGAR FRACTION THREE QUARTERS - (?\,M?(B . ?\x00BF) ;; INVERTED QUESTION MARK - (?\,M@(B . ?\x00C0) ;; LATIN CAPITAL LETTER A WITH GRAVE - (?\,MA(B . ?\x00C1) ;; LATIN CAPITAL LETTER A WITH ACUTE - (?\,MB(B . ?\x00C2) ;; LATIN CAPITAL LETTER A WITH CIRCUMFLEX - (?\,MC(B . ?\x00C3) ;; LATIN CAPITAL LETTER A WITH TILDE - (?\,MD(B . ?\x00C4) ;; LATIN CAPITAL LETTER A WITH DIAERESIS - (?\,ME(B . ?\x00C5) ;; LATIN CAPITAL LETTER A WITH RING ABOVE - (?\,MF(B . ?\x00C6) ;; LATIN CAPITAL LETTER AE - (?\,MG(B . ?\x00C7) ;; LATIN CAPITAL LETTER C WITH CEDILLA - (?\,MH(B . ?\x00C8) ;; LATIN CAPITAL LETTER E WITH GRAVE - (?\,MI(B . ?\x00C9) ;; LATIN CAPITAL LETTER E WITH ACUTE - (?\,MJ(B . ?\x00CA) ;; LATIN CAPITAL LETTER E WITH CIRCUMFLEX - (?\,MK(B . ?\x00CB) ;; LATIN CAPITAL LETTER E WITH DIAERESIS - (?\,ML(B . ?\x00CC) ;; LATIN CAPITAL LETTER I WITH GRAVE - (?\,MM(B . ?\x00CD) ;; LATIN CAPITAL LETTER I WITH ACUTE - (?\,MN(B . ?\x00CE) ;; LATIN CAPITAL LETTER I WITH CIRCUMFLEX - (?\,MO(B . ?\x00CF) ;; LATIN CAPITAL LETTER I WITH DIAERESIS - (?\,MP(B . ?\x011E) ;; LATIN CAPITAL LETTER G WITH BREVE - (?\,MQ(B . ?\x00D1) ;; LATIN CAPITAL LETTER N WITH TILDE - (?\,MR(B . ?\x00D2) ;; LATIN CAPITAL LETTER O WITH GRAVE - (?\,MS(B . ?\x00D3) ;; LATIN CAPITAL LETTER O WITH ACUTE - (?\,MT(B . ?\x00D4) ;; LATIN CAPITAL LETTER O WITH CIRCUMFLEX - (?\,MU(B . ?\x00D5) ;; LATIN CAPITAL LETTER O WITH TILDE - (?\,MV(B . ?\x00D6) ;; LATIN CAPITAL LETTER O WITH DIAERESIS - (?\,MW(B . ?\x00D7) ;; MULTIPLICATION SIGN - (?\,MX(B . ?\x00D8) ;; LATIN CAPITAL LETTER O WITH STROKE - (?\,MY(B . ?\x00D9) ;; LATIN CAPITAL LETTER U WITH GRAVE - (?\,MZ(B . ?\x00DA) ;; LATIN CAPITAL LETTER U WITH ACUTE - (?\,M[(B . ?\x00DB) ;; LATIN CAPITAL LETTER U WITH CIRCUMFLEX - (?\,M\(B . ?\x00DC) ;; LATIN CAPITAL LETTER U WITH DIAERESIS - (?\,M](B . ?\x0130) ;; LATIN CAPITAL LETTER I WITH DOT ABOVE - (?\,M^(B . ?\x015E) ;; LATIN CAPITAL LETTER S WITH CEDILLA - (?\,M_(B . ?\x00DF) ;; LATIN SMALL LETTER SHARP S - (?\,M`(B . ?\x00E0) ;; LATIN SMALL LETTER A WITH GRAVE - (?\,Ma(B . ?\x00E1) ;; LATIN SMALL LETTER A WITH ACUTE - (?\,Mb(B . ?\x00E2) ;; LATIN SMALL LETTER A WITH CIRCUMFLEX - (?\,Mc(B . ?\x00E3) ;; LATIN SMALL LETTER A WITH TILDE - (?\,Md(B . ?\x00E4) ;; LATIN SMALL LETTER A WITH DIAERESIS - (?\,Me(B . ?\x00E5) ;; LATIN SMALL LETTER A WITH RING ABOVE - (?\,Mf(B . ?\x00E6) ;; LATIN SMALL LETTER AE - (?\,Mg(B . ?\x00E7) ;; LATIN SMALL LETTER C WITH CEDILLA - (?\,Mh(B . ?\x00E8) ;; LATIN SMALL LETTER E WITH GRAVE - (?\,Mi(B . ?\x00E9) ;; LATIN SMALL LETTER E WITH ACUTE - (?\,Mj(B . ?\x00EA) ;; LATIN SMALL LETTER E WITH CIRCUMFLEX - (?\,Mk(B . ?\x00EB) ;; LATIN SMALL LETTER E WITH DIAERESIS - (?\,Ml(B . ?\x00EC) ;; LATIN SMALL LETTER I WITH GRAVE - (?\,Mm(B . ?\x00ED) ;; LATIN SMALL LETTER I WITH ACUTE - (?\,Mn(B . ?\x00EE) ;; LATIN SMALL LETTER I WITH CIRCUMFLEX - (?\,Mo(B . ?\x00EF) ;; LATIN SMALL LETTER I WITH DIAERESIS - (?\,Mp(B . ?\x011F) ;; LATIN SMALL LETTER G WITH BREVE - (?\,Mq(B . ?\x00F1) ;; LATIN SMALL LETTER N WITH TILDE - (?\,Mr(B . ?\x00F2) ;; LATIN SMALL LETTER O WITH GRAVE - (?\,Ms(B . ?\x00F3) ;; LATIN SMALL LETTER O WITH ACUTE - (?\,Mt(B . ?\x00F4) ;; LATIN SMALL LETTER O WITH CIRCUMFLEX - (?\,Mu(B . ?\x00F5) ;; LATIN SMALL LETTER O WITH TILDE - (?\,Mv(B . ?\x00F6) ;; LATIN SMALL LETTER O WITH DIAERESIS - (?\,Mw(B . ?\x00F7) ;; DIVISION SIGN - (?\,Mx(B . ?\x00F8) ;; LATIN SMALL LETTER O WITH STROKE - (?\,My(B . ?\x00F9) ;; LATIN SMALL LETTER U WITH GRAVE - (?\,Mz(B . ?\x00FA) ;; LATIN SMALL LETTER U WITH ACUTE - (?\,M{(B . ?\x00FB) ;; LATIN SMALL LETTER U WITH CIRCUMFLEX - (?\,M|(B . ?\x00FC) ;; LATIN SMALL LETTER U WITH DIAERESIS - (?\,M}(B . ?\x0131) ;; LATIN SMALL LETTER DOTLESS I - (?\,M~(B . ?\x015F) ;; LATIN SMALL LETTER S WITH CEDILLA - (?\,M(B . ?\x00FF) ;; LATIN SMALL LETTER Y WITH DIAERESIS - )) - - (ucs-8859-14-alist - '((?\,_ (B . ?\x00A0) ;; NO-BREAK SPACE - (?\,_!(B . ?\x1E02) ;; LATIN CAPITAL LETTER B WITH DOT ABOVE - (?\,_"(B . ?\x1E03) ;; LATIN SMALL LETTER B WITH DOT ABOVE - (?\,_#(B . ?\x00A3) ;; POUND SIGN - (?\,_$(B . ?\x010A) ;; LATIN CAPITAL LETTER C WITH DOT ABOVE - (?\,_%(B . ?\x010B) ;; LATIN SMALL LETTER C WITH DOT ABOVE - (?\,_&(B . ?\x1E0A) ;; LATIN CAPITAL LETTER D WITH DOT ABOVE - (?\,_'(B . ?\x00A7) ;; SECTION SIGN - (?\,_((B . ?\x1E80) ;; LATIN CAPITAL LETTER W WITH GRAVE - (?\,_)(B . ?\x00A9) ;; COPYRIGHT SIGN - (?\,_*(B . ?\x1E82) ;; LATIN CAPITAL LETTER W WITH ACUTE - (?\,_+(B . ?\x1E0B) ;; LATIN SMALL LETTER D WITH DOT ABOVE - (?\,_,(B . ?\x1EF2) ;; LATIN CAPITAL LETTER Y WITH GRAVE - (?\,_-(B . ?\x00AD) ;; SOFT HYPHEN - (?\,_.(B . ?\x00AE) ;; REGISTERED SIGN - (?\,_/(B . ?\x0178) ;; LATIN CAPITAL LETTER Y WITH DIAERESIS - (?\,_0(B . ?\x1E1E) ;; LATIN CAPITAL LETTER F WITH DOT ABOVE - (?\,_1(B . ?\x1E1F) ;; LATIN SMALL LETTER F WITH DOT ABOVE - (?\,_2(B . ?\x0120) ;; LATIN CAPITAL LETTER G WITH DOT ABOVE - (?\,_3(B . ?\x0121) ;; LATIN SMALL LETTER G WITH DOT ABOVE - (?\,_4(B . ?\x1E40) ;; LATIN CAPITAL LETTER M WITH DOT ABOVE - (?\,_5(B . ?\x1E41) ;; LATIN SMALL LETTER M WITH DOT ABOVE - (?\,_6(B . ?\x00B6) ;; PILCROW SIGN - (?\,_7(B . ?\x1E56) ;; LATIN CAPITAL LETTER P WITH DOT ABOVE - (?\,_8(B . ?\x1E81) ;; LATIN SMALL LETTER W WITH GRAVE - (?\,_9(B . ?\x1E57) ;; LATIN SMALL LETTER P WITH DOT ABOVE - (?\,_:(B . ?\x1E83) ;; LATIN SMALL LETTER W WITH ACUTE - (?\,_;(B . ?\x1E60) ;; LATIN CAPITAL LETTER S WITH DOT ABOVE - (?\,_<(B . ?\x1EF3) ;; LATIN SMALL LETTER Y WITH GRAVE - (?\,_=(B . ?\x1E84) ;; LATIN CAPITAL LETTER W WITH DIAERESIS - (?\,_>(B . ?\x1E85) ;; LATIN SMALL LETTER W WITH DIAERESIS - (?\,_?(B . ?\x1E61) ;; LATIN SMALL LETTER S WITH DOT ABOVE - (?\,_@(B . ?\x00C0) ;; LATIN CAPITAL LETTER A WITH GRAVE - (?\,_A(B . ?\x00C1) ;; LATIN CAPITAL LETTER A WITH ACUTE - (?\,_B(B . ?\x00C2) ;; LATIN CAPITAL LETTER A WITH CIRCUMFLEX - (?\,_C(B . ?\x00C3) ;; LATIN CAPITAL LETTER A WITH TILDE - (?\,_D(B . ?\x00C4) ;; LATIN CAPITAL LETTER A WITH DIAERESIS - (?\,_E(B . ?\x00C5) ;; LATIN CAPITAL LETTER A WITH RING ABOVE - (?\,_F(B . ?\x00C6) ;; LATIN CAPITAL LETTER AE - (?\,_G(B . ?\x00C7) ;; LATIN CAPITAL LETTER C WITH CEDILLA - (?\,_H(B . ?\x00C8) ;; LATIN CAPITAL LETTER E WITH GRAVE - (?\,_I(B . ?\x00C9) ;; LATIN CAPITAL LETTER E WITH ACUTE - (?\,_J(B . ?\x00CA) ;; LATIN CAPITAL LETTER E WITH CIRCUMFLEX - (?\,_K(B . ?\x00CB) ;; LATIN CAPITAL LETTER E WITH DIAERESIS - (?\,_L(B . ?\x00CC) ;; LATIN CAPITAL LETTER I WITH GRAVE - (?\,_M(B . ?\x00CD) ;; LATIN CAPITAL LETTER I WITH ACUTE - (?\,_N(B . ?\x00CE) ;; LATIN CAPITAL LETTER I WITH CIRCUMFLEX - (?\,_O(B . ?\x00CF) ;; LATIN CAPITAL LETTER I WITH DIAERESIS - (?\,_P(B . ?\x0174) ;; LATIN CAPITAL LETTER W WITH CIRCUMFLEX - (?\,_Q(B . ?\x00D1) ;; LATIN CAPITAL LETTER N WITH TILDE - (?\,_R(B . ?\x00D2) ;; LATIN CAPITAL LETTER O WITH GRAVE - (?\,_S(B . ?\x00D3) ;; LATIN CAPITAL LETTER O WITH ACUTE - (?\,_T(B . ?\x00D4) ;; LATIN CAPITAL LETTER O WITH CIRCUMFLEX - (?\,_U(B . ?\x00D5) ;; LATIN CAPITAL LETTER O WITH TILDE - (?\,_V(B . ?\x00D6) ;; LATIN CAPITAL LETTER O WITH DIAERESIS - (?\,_W(B . ?\x1E6A) ;; LATIN CAPITAL LETTER T WITH DOT ABOVE - (?\,_X(B . ?\x00D8) ;; LATIN CAPITAL LETTER O WITH STROKE - (?\,_Y(B . ?\x00D9) ;; LATIN CAPITAL LETTER U WITH GRAVE - (?\,_Z(B . ?\x00DA) ;; LATIN CAPITAL LETTER U WITH ACUTE - (?\,_[(B . ?\x00DB) ;; LATIN CAPITAL LETTER U WITH CIRCUMFLEX - (?\,_\(B . ?\x00DC) ;; LATIN CAPITAL LETTER U WITH DIAERESIS - (?\,_](B . ?\x00DD) ;; LATIN CAPITAL LETTER Y WITH ACUTE - (?\,_^(B . ?\x0176) ;; LATIN CAPITAL LETTER Y WITH CIRCUMFLEX - (?\,__(B . ?\x00DF) ;; LATIN SMALL LETTER SHARP S - (?\,_`(B . ?\x00E0) ;; LATIN SMALL LETTER A WITH GRAVE - (?\,_a(B . ?\x00E1) ;; LATIN SMALL LETTER A WITH ACUTE - (?\,_b(B . ?\x00E2) ;; LATIN SMALL LETTER A WITH CIRCUMFLEX - (?\,_c(B . ?\x00E3) ;; LATIN SMALL LETTER A WITH TILDE - (?\,_d(B . ?\x00E4) ;; LATIN SMALL LETTER A WITH DIAERESIS - (?\,_e(B . ?\x00E5) ;; LATIN SMALL LETTER A WITH RING ABOVE - (?\,_f(B . ?\x00E6) ;; LATIN SMALL LETTER AE - (?\,_g(B . ?\x00E7) ;; LATIN SMALL LETTER C WITH CEDILLA - (?\,_h(B . ?\x00E8) ;; LATIN SMALL LETTER E WITH GRAVE - (?\,_i(B . ?\x00E9) ;; LATIN SMALL LETTER E WITH ACUTE - (?\,_j(B . ?\x00EA) ;; LATIN SMALL LETTER E WITH CIRCUMFLEX - (?\,_k(B . ?\x00EB) ;; LATIN SMALL LETTER E WITH DIAERESIS - (?\,_l(B . ?\x00EC) ;; LATIN SMALL LETTER I WITH GRAVE - (?\,_m(B . ?\x00ED) ;; LATIN SMALL LETTER I WITH ACUTE - (?\,_n(B . ?\x00EE) ;; LATIN SMALL LETTER I WITH CIRCUMFLEX - (?\,_o(B . ?\x00EF) ;; LATIN SMALL LETTER I WITH DIAERESIS - (?\,_p(B . ?\x0175) ;; LATIN SMALL LETTER W WITH CIRCUMFLEX - (?\,_q(B . ?\x00F1) ;; LATIN SMALL LETTER N WITH TILDE - (?\,_r(B . ?\x00F2) ;; LATIN SMALL LETTER O WITH GRAVE - (?\,_s(B . ?\x00F3) ;; LATIN SMALL LETTER O WITH ACUTE - (?\,_t(B . ?\x00F4) ;; LATIN SMALL LETTER O WITH CIRCUMFLEX - (?\,_u(B . ?\x00F5) ;; LATIN SMALL LETTER O WITH TILDE - (?\,_v(B . ?\x00F6) ;; LATIN SMALL LETTER O WITH DIAERESIS - (?\,_w(B . ?\x1E6B) ;; LATIN SMALL LETTER T WITH DOT ABOVE - (?\,_x(B . ?\x00F8) ;; LATIN SMALL LETTER O WITH STROKE - (?\,_y(B . ?\x00F9) ;; LATIN SMALL LETTER U WITH GRAVE - (?\,_z(B . ?\x00FA) ;; LATIN SMALL LETTER U WITH ACUTE - (?\,_{(B . ?\x00FB) ;; LATIN SMALL LETTER U WITH CIRCUMFLEX - (?\,_|(B . ?\x00FC) ;; LATIN SMALL LETTER U WITH DIAERESIS - (?\,_}(B . ?\x00FD) ;; LATIN SMALL LETTER Y WITH ACUTE - (?\,_~(B . ?\x0177) ;; LATIN SMALL LETTER Y WITH CIRCUMFLEX - (?\,_(B . ?\x00FF) ;; LATIN SMALL LETTER Y WITH DIAERESIS - )) - - (ucs-8859-15-alist - '((?\,b (B . ?\x00A0) ;; NO-BREAK SPACE - (?\,b!(B . ?\x00A1) ;; INVERTED EXCLAMATION MARK - (?\,b"(B . ?\x00A2) ;; CENT SIGN - (?\,b#(B . ?\x00A3) ;; POUND SIGN - (?\,b$(B . ?\x20AC) ;; EURO SIGN - (?\,b%(B . ?\x00A5) ;; YEN SIGN - (?\,b&(B . ?\x0160) ;; LATIN CAPITAL LETTER S WITH CARON - (?\,b'(B . ?\x00A7) ;; SECTION SIGN - (?\,b((B . ?\x0161) ;; LATIN SMALL LETTER S WITH CARON - (?\,b)(B . ?\x00A9) ;; COPYRIGHT SIGN - (?\,b*(B . ?\x00AA) ;; FEMININE ORDINAL INDICATOR - (?\,b+(B . ?\x00AB) ;; LEFT-POINTING DOUBLE ANGLE QUOTATION MARK - (?\,b,(B . ?\x00AC) ;; NOT SIGN - (?\,b-(B . ?\x00AD) ;; SOFT HYPHEN - (?\,b.(B . ?\x00AE) ;; REGISTERED SIGN - (?\,b/(B . ?\x00AF) ;; MACRON - (?\,b0(B . ?\x00B0) ;; DEGREE SIGN - (?\,b1(B . ?\x00B1) ;; PLUS-MINUS SIGN - (?\,b2(B . ?\x00B2) ;; SUPERSCRIPT TWO - (?\,b3(B . ?\x00B3) ;; SUPERSCRIPT THREE - (?\,b4(B . ?\x017D) ;; LATIN CAPITAL LETTER Z WITH CARON - (?\,b5(B . ?\x00B5) ;; MICRO SIGN - (?\,b6(B . ?\x00B6) ;; PILCROW SIGN - (?\,b7(B . ?\x00B7) ;; MIDDLE DOT - (?\,b8(B . ?\x017E) ;; LATIN SMALL LETTER Z WITH CARON - (?\,b9(B . ?\x00B9) ;; SUPERSCRIPT ONE - (?\,b:(B . ?\x00BA) ;; MASCULINE ORDINAL INDICATOR - (?\,b;(B . ?\x00BB) ;; RIGHT-POINTING DOUBLE ANGLE QUOTATION MARK - (?\,b<(B . ?\x0152) ;; LATIN CAPITAL LIGATURE OE - (?\,b=(B . ?\x0153) ;; LATIN SMALL LIGATURE OE - (?\,b>(B . ?\x0178) ;; LATIN CAPITAL LETTER Y WITH DIAERESIS - (?\,b?(B . ?\x00BF) ;; INVERTED QUESTION MARK - (?\,b@(B . ?\x00C0) ;; LATIN CAPITAL LETTER A WITH GRAVE - (?\,bA(B . ?\x00C1) ;; LATIN CAPITAL LETTER A WITH ACUTE - (?\,bB(B . ?\x00C2) ;; LATIN CAPITAL LETTER A WITH CIRCUMFLEX - (?\,bC(B . ?\x00C3) ;; LATIN CAPITAL LETTER A WITH TILDE - (?\,bD(B . ?\x00C4) ;; LATIN CAPITAL LETTER A WITH DIAERESIS - (?\,bE(B . ?\x00C5) ;; LATIN CAPITAL LETTER A WITH RING ABOVE - (?\,bF(B . ?\x00C6) ;; LATIN CAPITAL LETTER AE - (?\,bG(B . ?\x00C7) ;; LATIN CAPITAL LETTER C WITH CEDILLA - (?\,bH(B . ?\x00C8) ;; LATIN CAPITAL LETTER E WITH GRAVE - (?\,bI(B . ?\x00C9) ;; LATIN CAPITAL LETTER E WITH ACUTE - (?\,bJ(B . ?\x00CA) ;; LATIN CAPITAL LETTER E WITH CIRCUMFLEX - (?\,bK(B . ?\x00CB) ;; LATIN CAPITAL LETTER E WITH DIAERESIS - (?\,bL(B . ?\x00CC) ;; LATIN CAPITAL LETTER I WITH GRAVE - (?\,bM(B . ?\x00CD) ;; LATIN CAPITAL LETTER I WITH ACUTE - (?\,bN(B . ?\x00CE) ;; LATIN CAPITAL LETTER I WITH CIRCUMFLEX - (?\,bO(B . ?\x00CF) ;; LATIN CAPITAL LETTER I WITH DIAERESIS - (?\,bP(B . ?\x00D0) ;; LATIN CAPITAL LETTER ETH - (?\,bQ(B . ?\x00D1) ;; LATIN CAPITAL LETTER N WITH TILDE - (?\,bR(B . ?\x00D2) ;; LATIN CAPITAL LETTER O WITH GRAVE - (?\,bS(B . ?\x00D3) ;; LATIN CAPITAL LETTER O WITH ACUTE - (?\,bT(B . ?\x00D4) ;; LATIN CAPITAL LETTER O WITH CIRCUMFLEX - (?\,bU(B . ?\x00D5) ;; LATIN CAPITAL LETTER O WITH TILDE - (?\,bV(B . ?\x00D6) ;; LATIN CAPITAL LETTER O WITH DIAERESIS - (?\,bW(B . ?\x00D7) ;; MULTIPLICATION SIGN - (?\,bX(B . ?\x00D8) ;; LATIN CAPITAL LETTER O WITH STROKE - (?\,bY(B . ?\x00D9) ;; LATIN CAPITAL LETTER U WITH GRAVE - (?\,bZ(B . ?\x00DA) ;; LATIN CAPITAL LETTER U WITH ACUTE - (?\,b[(B . ?\x00DB) ;; LATIN CAPITAL LETTER U WITH CIRCUMFLEX - (?\,b\(B . ?\x00DC) ;; LATIN CAPITAL LETTER U WITH DIAERESIS - (?\,b](B . ?\x00DD) ;; LATIN CAPITAL LETTER Y WITH ACUTE - (?\,b^(B . ?\x00DE) ;; LATIN CAPITAL LETTER THORN - (?\,b_(B . ?\x00DF) ;; LATIN SMALL LETTER SHARP S - (?\,b`(B . ?\x00E0) ;; LATIN SMALL LETTER A WITH GRAVE - (?\,ba(B . ?\x00E1) ;; LATIN SMALL LETTER A WITH ACUTE - (?\,bb(B . ?\x00E2) ;; LATIN SMALL LETTER A WITH CIRCUMFLEX - (?\,bc(B . ?\x00E3) ;; LATIN SMALL LETTER A WITH TILDE - (?\,bd(B . ?\x00E4) ;; LATIN SMALL LETTER A WITH DIAERESIS - (?\,be(B . ?\x00E5) ;; LATIN SMALL LETTER A WITH RING ABOVE - (?\,bf(B . ?\x00E6) ;; LATIN SMALL LETTER AE - (?\,bg(B . ?\x00E7) ;; LATIN SMALL LETTER C WITH CEDILLA - (?\,bh(B . ?\x00E8) ;; LATIN SMALL LETTER E WITH GRAVE - (?\,bi(B . ?\x00E9) ;; LATIN SMALL LETTER E WITH ACUTE - (?\,bj(B . ?\x00EA) ;; LATIN SMALL LETTER E WITH CIRCUMFLEX - (?\,bk(B . ?\x00EB) ;; LATIN SMALL LETTER E WITH DIAERESIS - (?\,bl(B . ?\x00EC) ;; LATIN SMALL LETTER I WITH GRAVE - (?\,bm(B . ?\x00ED) ;; LATIN SMALL LETTER I WITH ACUTE - (?\,bn(B . ?\x00EE) ;; LATIN SMALL LETTER I WITH CIRCUMFLEX - (?\,bo(B . ?\x00EF) ;; LATIN SMALL LETTER I WITH DIAERESIS - (?\,bp(B . ?\x00F0) ;; LATIN SMALL LETTER ETH - (?\,bq(B . ?\x00F1) ;; LATIN SMALL LETTER N WITH TILDE - (?\,br(B . ?\x00F2) ;; LATIN SMALL LETTER O WITH GRAVE - (?\,bs(B . ?\x00F3) ;; LATIN SMALL LETTER O WITH ACUTE - (?\,bt(B . ?\x00F4) ;; LATIN SMALL LETTER O WITH CIRCUMFLEX - (?\,bu(B . ?\x00F5) ;; LATIN SMALL LETTER O WITH TILDE - (?\,bv(B . ?\x00F6) ;; LATIN SMALL LETTER O WITH DIAERESIS - (?\,bw(B . ?\x00F7) ;; DIVISION SIGN - (?\,bx(B . ?\x00F8) ;; LATIN SMALL LETTER O WITH STROKE - (?\,by(B . ?\x00F9) ;; LATIN SMALL LETTER U WITH GRAVE - (?\,bz(B . ?\x00FA) ;; LATIN SMALL LETTER U WITH ACUTE - (?\,b{(B . ?\x00FB) ;; LATIN SMALL LETTER U WITH CIRCUMFLEX - (?\,b|(B . ?\x00FC) ;; LATIN SMALL LETTER U WITH DIAERESIS - (?\,b}(B . ?\x00FD) ;; LATIN SMALL LETTER Y WITH ACUTE - (?\,b~(B . ?\x00FE) ;; LATIN SMALL LETTER THORN - (?\,b(B . ?\x00FF) ;; LATIN SMALL LETTER Y WITH DIAERESIS - )) - - (ucs-8859-1-alist - (let ((i 160) - l) - (while (< i 256) - (push (cons (make-char 'latin-iso8859-1 (- i 128)) i) - l) - (setq i (1+ i))) - (nreverse l))) - -;; (case-table (standard-case-table)) -;; (syntax-table (standard-syntax-table)) - ) - - ;; Convert the lists to the basic char tables. - (dolist (n (list 15 14 9 8 7 5 4 3 2 1)) - (let ((alist (symbol-value (intern (format "ucs-8859-%d-alist" n))))) - (dolist (pair alist) - (let ((mule (car pair)) - (uc (cdr pair)) - (mu (decode-char 'ucs (cdr pair)))) - (aset ucs-mule-8859-to-ucs-table mule uc) - ;; (aset ucs-ucs-to-mule-8859-table uc mule) - ;; (aset ucs-mule-unicode-to-mule-8859 mu mule) - (aset ucs-mule-8859-to-mule-unicode mule mu) - (aset ucs-mule-to-mule-unicode mule mu))) -;; I think this is actually done OK in characters.el. -;; Probably things like accents shouldn't have word syntax, but the -;; Latin-N syntax tables currently aren't consistent for such -;; characters anyhow. -;; ;; Make the mule-unicode characters inherit syntax and case info -;; ;; if they don't already have it. -;; (dolist (pair alist) -;; (let ((mule (car pair)) -;; (uc (cdr pair)) -;; (mu (decode-char 'ucs (cdr pair)))) -;; (let ((syntax (aref syntax-table mule))) -;; (if (eq mule (downcase mule)) -;; (if (eq mule (upcase mule)) ; non-letter or uncased letter -;; (progn -;; (if (= 4 (car syntax)) ; left delim -;; (progn -;; (aset syntax-table -;; mu -;; (cons 4 (aref ucs-mule-8859-to-mule-unicode -;; (cdr syntax)))) -;; (aset syntax-table -;; (aref ucs-mule-8859-to-mule-unicode -;; (cdr syntax)) -;; (cons 5 mu))) -;; (aset syntax-table mu syntax)) -;; (aset case-table mu mu))) -;; ;; Upper case letter -;; (let ((lower (aref ucs-mule-8859-to-mule-unicode -;; (aref case-table mule)))) -;; (aset case-table mu lower) -;; (aset case-table lower lower) -;; (modify-syntax-entry lower "w " syntax-table) -;; (modify-syntax-entry mu "w " syntax-table)))))) - )) - ;; Derive tables that can be used as per-coding-system - ;; `translation-table-for-encode's. - (dolist (n (list 15 14 9 8 7 5 4 3 2 1)) - (let* ((alist (symbol-value (intern (format "ucs-8859-%d-alist" n)))) - (encode-translator (set (intern (format "ucs-8859-%d-encode-table" - n)) - (make-translation-table))) - elt) - ;; Start with the mule-unicode component. - (dolist (pair alist) - (let ((mule (car pair)) - (mu (decode-char 'ucs (cdr pair)))) - (aset encode-translator mu mule))) - ;; Find characters from other 8859 sets which map to the same - ;; unicode as some character in this set. - (map-char-table (lambda (k v) - (if (and (setq elt (rassq v alist)) - (not (assq k alist))) - (aset encode-translator k (car elt)))) - ucs-mule-8859-to-ucs-table)))) - -;; Register for use in CCL. -(define-translation-table 'ucs-mule-8859-to-mule-unicode - ucs-mule-8859-to-mule-unicode) - -;; Fixme: Make this reversible, which means frobbing -;; `char-coding-system-table' directly to remove what we added -- see -;; codepages.el. Also make it a user option. -(defun ucs-unify-8859 (&optional encode-only) - "Set up translation tables for unifying characters from ISO 8859. - -On decoding, non-ASCII characters are mapped into the `iso-latin-1' -and `mule-unicode-0100-24ff' charsets. On encoding, these are mapped -back appropriate for the coding system. - -With prefix arg, do unification on encoding only, i.e. don't unify -everything on input operations." - (interactive "P") - (unless encode-only - ;; Unify 8859 on decoding. (Non-CCL coding systems only.) - (set-char-table-parent standard-translation-table-for-decode - ucs-mule-8859-to-mule-unicode)) - ;; Adjust the 8859 coding systems to fragment the unified characters - ;; on encoding. - (dolist (n '(1 2 3 4 5 7 8 9 14 15)) - (let* ((coding-system - (coding-system-base (intern (format "iso-8859-%d" n)))) - (table (symbol-value - (intern (format "ucs-8859-%d-encode-table" n)))) - (safe (coding-system-get coding-system 'safe-chars))) - ;; Actually, the coding system's safe-chars are not normally - ;; used after they've been registered, but we might as well - ;; record them. Setting the parent here is a convenience. - (set-char-table-parent safe table) - ;; Update the table of what encodes to what. - (register-char-codings coding-system table) - (coding-system-put coding-system 'translation-table-for-encode table))) - -;;; The following works for the bundled coding systems, but it's -;;; better to use the Unicode-based ones and make it irrelevant. - -;;; ;; Update the Cyrillic special cases. -;;; ;; `translation-table-for-encode' doesn't work for CCL coding -;;; ;; systems, and `standard-translation-table-for-decode' isn't -;;; ;; applied. -;;; (let ((table (get 'cyrillic-koi8-r-encode-table 'translation-table))) -;;; (map-char-table -;;; (lambda (k v) -;;; (aset table -;;; (or (aref ucs-8859-5-encode-table k) -;;; k) -;;; v)) -;;; table) -;;; (register-char-codings 'cyrillic-koi8 table)) -;;; (let ((table (get 'cyrillic-koi8-r-nonascii-translation-table -;;; 'translation-table))) -;;; (map-char-table -;;; (lambda (k v) -;;; (if v (aset table k (or (aref ucs-mule-8859-to-mule-unicode v) -;;; v)))) -;;; table)) -;;; ;; Redefine this, since the orginal only translated 8859-5. -;;; (define-ccl-program ccl-encode-koi8 -;;; `(1 -;;; ((loop -;;; (read-multibyte-character r0 r1) -;;; (translate-character cyrillic-koi8-r-encode-table r0 r1) -;;; (write-repeat r1)))) -;;; "CCL program to encode KOI8.") -;;; (let ((table (get 'cyrillic-alternativnyj-encode-table 'translation-table))) -;;; (map-char-table -;;; (lambda (k v) -;;; (aset table -;;; (or (aref ucs-8859-5-encode-table k) -;;; k) -;;; v)) -;;; table) -;;; (register-char-codings 'cyrillic-alternativnyj table)) -;;; (let ((table (get 'cyrillic-alternativnyj-nonascii-translation-table -;;; 'translation-table))) -;;; (map-char-table -;;; (lambda (k v) -;;; (if v (aset table -;;; k -;;; (or (aref ucs-mule-8859-to-mule-unicode v) -;;; v)))) -;;; table)) - ) - -(defun ucs-fragment-8859 (&optional encode-only) - "Undo the unification done by `ucs-unify-8859'. -With prefix arg, undo unification on encoding only, i.e. don't undo -unification on input operations." - (interactive "P") - ;; Maybe fix decoding. - (unless encode-only - ;; Unify 8859 on decoding. (Non-CCL coding systems only.) - (set-char-table-parent standard-translation-table-for-decode nil)) - ;; Fix encoding. For each charset, remove the entries in - ;; `char-coding-system-table' added to its safe-chars table (as its - ;; parent). - (dolist (n '(1 2 3 4 5 7 8 9 14 15)) - (let* ((coding-system - (coding-system-base (intern (format "iso-8859-%d" n)))) - (table (symbol-value - (intern (format "ucs-8859-%d-encode-table" n)))) - (safe (coding-system-get coding-system 'safe-chars))) - (map-char-table - (lambda (key val) - (if (and (>= key 128) val) - (let ((codings (aref char-coding-system-table key))) - (aset char-coding-system-table key - (delq coding-system codings))))) - (char-table-parent safe)) - (set-char-table-parent safe nil) - (coding-system-put coding-system 'translation-table-for-encode nil)))) - -;;;###autoload -(define-minor-mode unify-8859-on-encoding-mode - "Set up translation tables for unifying ISO 8859 characters on encoding. - -The ISO 8859 characters sets overlap, e.g. 8859-1 (Latin-1) and -8859-15 (Latin-9) differ only in a few characters. Emacs normally -distinguishes equivalent characters from those ISO-8859 character sets -which are built in to Emacs. This behaviour is essentially inherited -from the European-originated international standards. Treating them -equivalently, by translating to and from a single representation is -called `unification'. (The `utf-8' coding system treats the -characters of European scripts in a unified manner.) - -In this mode, on encoding -- i.e. output operations -- non-ASCII -characters from the built-in ISO 8859 and `mule-unicode-0100-24ff' -charsets are handled automatically by the coding system used if it can -represent them. Thus, say, an e-acute from the Latin-1 charset (the -unified representation) in a buffer saved as Latin-9 will be encoded -directly to a byte value 233. By default, in contrast, you would be -prompted for a general coding system to use for saving the file, which -can cope with separate Latin-1 and Latin-9 representations of e-acute. - -See also command `unify-8859-on-decoding-mode'." - :group 'mule - :global t - :version 21.3 ; who knows...? - :init-value nil - (if unify-8859-on-encoding-mode - (ucs-unify-8859 t) - (ucs-fragment-8859 t))) - -;;;###autoload -(define-minor-mode unify-8859-on-decoding-mode - "Set up translation table for unifying ISO 8859 characters on decoding. -On decoding -- i.e. input operations -- non-ASCII characters from the -built-in ISO 8859 charsets are unified by mapping them into the -`iso-latin-1' and `mule-unicode-0100-24ff' charsets. - -This sets the parent of `standard-translation-table-for-decode'. - -See also command `unify-8859-on-encoding-mode'." - :group 'mule - :global t - :version 21.3 ; who knows...? - :init-value nil - (if unify-8859-on-decoding-mode - (set-char-table-parent standard-translation-table-for-decode - ucs-mule-8859-to-mule-unicode) - (set-char-table-parent standard-translation-table-for-decode nil))) - -(defun ucs-insert (arg) - "Insert the Emacs character representation of the given Unicode. -Interactively, prompts for a hex string giving the code." - (interactive "sUnicode (hex): ") - (insert (decode-char 'ucs (if (integerp arg) - arg - (string-to-number arg 16))))) - -;;; Dealing with non-8859 character sets. - -;; We only set up translation on encoding to utf-8. Also translation -;; tables ucs-CS-encode-table are constructed for some coding systems -;; CS which could be used as `translation-table-for-encode', currently -;; for indian-is13194, lao, thai, tibetan-iso-8bit and -;; vietnamese-viscii. - -;; The alists here cover both coding systems (external charsets), like -;; VISCII, and individual Emacs charsets, like `ipa'. -(let ((vietnamese-viscii - '((?,1!(B . ?$,1o/(B) - (?,1"(B . ?$,1o1(B) - (?,1#(B . ?$,1o7(B) - (?,1$(B . ?$,1o%(B) - (?,1%(B . ?$,1o'(B) - (?,1&(B . ?$,1o)(B) - (?,1'(B . ?$,1o-(B) - (?,1((B . ?$,1o=(B) - (?,1)(B . ?$,1o9(B) - (?,1*(B . ?$,1o?(B) - (?,1+(B . ?$,1oA(B) - (?,1,(B . ?$,1oC(B) - (?,1-(B . ?$,1oE(B) - (?,1.(B . ?$,1oG(B) - (?,1/(B . ?$,1oQ(B) - (?,10(B . ?$,1oS(B) - (?,11(B . ?$,1oU(B) - (?,12(B . ?$,1oW(B) - (?,15(B . ?$,1oY(B) - (?,16(B . ?$,1o](B) - (?,17(B . ?$,1o_(B) - (?,18(B . ?$,1oK(B) - (?,1=(B . ?$,1!a(B) - (?,1>(B . ?$,1o[(B) - (?,1F(B . ?$,1o3(B) - (?,1G(B . ?$,1o5(B) - (?,1O(B . ?$,1os(B) - (?,1Q(B . ?$,1oi(B) - (?,1U(B . ?$,1o!(B) - (?,1V(B . ?$,1ow(B) - (?,1W(B . ?$,1ok(B) - (?,1X(B . ?$,1om(B) - (?,1[(B . ?$,1oy(B) - (?,1\(B . ?$,1ou(B) - (?,1^(B . ?$,1oa(B) - (?,1_(B . ?$,1!p(B) - (?,1`(B . ?,A`(B) - (?,1a(B . ?,Aa(B) - (?,1b(B . ?,Ab(B) - (?,1c(B . ?,Ac(B) - (?,1d(B . ?$,1o#(B) - (?,1e(B . ?$,1 #(B) - (?,1f(B . ?$,1oo(B) - (?,1g(B . ?$,1o+(B) - (?,1h(B . ?,Ah(B) - (?,1i(B . ?,Ai(B) - (?,1j(B . ?,Aj(B) - (?,1k(B . ?$,1o;(B) - (?,1l(B . ?,Al(B) - (?,1m(B . ?,Am(B) - (?,1n(B . ?$,1 I(B) - (?,1o(B . ?$,1oI(B) - (?,1p(B . ?$,1 1(B) - (?,1q(B . ?$,1oq(B) - (?,1r(B . ?,Ar(B) - (?,1s(B . ?,As(B) - (?,1t(B . ?,At(B) - (?,1u(B . ?,Au(B) - (?,1v(B . ?$,1oO(B) - (?,1w(B . ?$,1oM(B) - (?,1x(B . ?$,1oe(B) - (?,1y(B . ?,Ay(B) - (?,1z(B . ?,Az(B) - (?,1{(B . ?$,1!)(B) - (?,1|(B . ?$,1og(B) - (?,1}(B . ?,A}(B) - (?,1~(B . ?$,1oc(B) - - (?,2!(B . ?$,1o.(B) - (?,2"(B . ?$,1o0(B) - (?,2#(B . ?$,1o6(B) - (?,2$(B . ?$,1o$(B) - (?,2%(B . ?$,1o&(B) - (?,2&(B . ?$,1o((B) - (?,2'(B . ?$,1o,(B) - (?,2((B . ?$,1o<(B) - (?,2)(B . ?$,1o8(B) - (?,2*(B . ?$,1o>(B) - (?,2+(B . ?$,1o@(B) - (?,2,(B . ?$,1oB(B) - (?,2-(B . ?$,1oD(B) - (?,2.(B . ?$,1oF(B) - (?,2/(B . ?$,1oP(B) - (?,20(B . ?$,1oR(B) - (?,21(B . ?$,1oT(B) - (?,22(B . ?$,1oV(B) - (?,25(B . ?$,1oX(B) - (?,26(B . ?$,1o\(B) - (?,27(B . ?$,1o^(B) - (?,28(B . ?$,1oJ(B) - (?,2=(B . ?$,1!`(B) - (?,2>(B . ?$,1oZ(B) - (?,2F(B . ?$,1o2(B) - (?,2G(B . ?$,1o4(B) - (?,2O(B . ?$,1or(B) - (?,2Q(B . ?$,1oh(B) - (?,2U(B . ?$,1o (B) - (?,2V(B . ?$,1ov(B) - (?,2W(B . ?$,1oj(B) - (?,2X(B . ?$,1ol(B) - (?,2[(B . ?$,1ox(B) - (?,2\(B . ?$,1ot(B) - (?,2^(B . ?$,1o`(B) - (?,2_(B . ?$,1!o(B) - (?,2`(B . ?,A@(B) - (?,2a(B . ?,AA(B) - (?,2b(B . ?,AB(B) - (?,2c(B . ?,AC(B) - (?,2d(B . ?$,1o"(B) - (?,2e(B . ?$,1 "(B) - (?,2f(B . ?$,1on(B) - (?,2g(B . ?$,1o*(B) - (?,2h(B . ?,AH(B) - (?,2i(B . ?,AI(B) - (?,2j(B . ?,AJ(B) - (?,2k(B . ?$,1o:(B) - (?,2l(B . ?,AL(B) - (?,2m(B . ?,AM(B) - (?,2n(B . ?$,1 H(B) - (?,2o(B . ?$,1oH(B) - (?,2p(B . ?$,1 0(B) - (?,2q(B . ?$,1op(B) - (?,2r(B . ?,AR(B) - (?,2s(B . ?,AS(B) - (?,2t(B . ?,AT(B) - (?,2u(B . ?,AU(B) - (?,2v(B . ?$,1oN(B) - (?,2w(B . ?$,1oL(B) - (?,2x(B . ?$,1od(B) - (?,2y(B . ?,AY(B) - (?,2z(B . ?,AZ(B) - (?,2{(B . ?$,1!((B) - (?,2|(B . ?$,1of(B) - (?,2}(B . ?,A](B) - (?,2~(B . ?$,1ob(B))) - - (thai-tis620 - '((?,T!(B . ?$,1Ba(B) - (?,T"(B . ?$,1Bb(B) - (?,T#(B . ?$,1Bc(B) - (?,T$(B . ?$,1Bd(B) - (?,T%(B . ?$,1Be(B) - (?,T&(B . ?$,1Bf(B) - (?,T'(B . ?$,1Bg(B) - (?,T((B . ?$,1Bh(B) - (?,T)(B . ?$,1Bi(B) - (?,T*(B . ?$,1Bj(B) - (?,T+(B . ?$,1Bk(B) - (?,T,(B . ?$,1Bl(B) - (?,T-(B . ?$,1Bm(B) - (?,T.(B . ?$,1Bn(B) - (?,T/(B . ?$,1Bo(B) - (?,T0(B . ?$,1Bp(B) - (?,T1(B . ?$,1Bq(B) - (?,T2(B . ?$,1Br(B) - (?,T3(B . ?$,1Bs(B) - (?,T4(B . ?$,1Bt(B) - (?,T5(B . ?$,1Bu(B) - (?,T6(B . ?$,1Bv(B) - (?,T7(B . ?$,1Bw(B) - (?,T8(B . ?$,1Bx(B) - (?,T9(B . ?$,1By(B) - (?,T:(B . ?$,1Bz(B) - (?,T;(B . ?$,1B{(B) - (?,T<(B . ?$,1B|(B) - (?,T=(B . ?$,1B}(B) - (?,T>(B . ?$,1B~(B) - (?,T?(B . ?$,1B(B) - (?,T@(B . ?$,1C (B) - (?,TA(B . ?$,1C!(B) - (?,TB(B . ?$,1C"(B) - (?,TC(B . ?$,1C#(B) - (?,TD(B . ?$,1C$(B) - (?,TE(B . ?$,1C%(B) - (?,TF(B . ?$,1C&(B) - (?,TG(B . ?$,1C'(B) - (?,TH(B . ?$,1C((B) - (?,TI(B . ?$,1C)(B) - (?,TJ(B . ?$,1C*(B) - (?,TK(B . ?$,1C+(B) - (?,TL(B . ?$,1C,(B) - (?,TM(B . ?$,1C-(B) - (?,TN(B . ?$,1C.(B) - (?,TO(B . ?$,1C/(B) - (?,TP(B . ?$,1C0(B) - (?,TQ(B . ?$,1C1(B) - (?,TR(B . ?$,1C2(B) - (?,TS(B . ?$,1C3(B) - (?,TT(B . ?$,1C4(B) - (?,TU(B . ?$,1C5(B) - (?,TV(B . ?$,1C6(B) - (?,TW(B . ?$,1C7(B) - (?,TX(B . ?$,1C8(B) - (?,TY(B . ?$,1C9(B) - (?,TZ(B . ?$,1C:(B) - (?,T_(B . ?$,1C?(B) - (?,T`(B . ?$,1C@(B) - (?,Ta(B . ?$,1CA(B) - (?,Tb(B . ?$,1CB(B) - (?,Tc(B . ?$,1CC(B) - (?,Td(B . ?$,1CD(B) - (?,Te(B . ?$,1CE(B) - (?,Tf(B . ?$,1CF(B) - (?,Tg(B . ?$,1CG(B) - (?,Th(B . ?$,1CH(B) - (?,Ti(B . ?$,1CI(B) - (?,Tj(B . ?$,1CJ(B) - (?,Tk(B . ?$,1CK(B) - (?,Tl(B . ?$,1CL(B) - (?,Tm(B . ?$,1CM(B) - (?,Tn(B . ?$,1CN(B) - (?,To(B . ?$,1CO(B) - (?,Tp(B . ?$,1CP(B) - (?,Tq(B . ?$,1CQ(B) - (?,Tr(B . ?$,1CR(B) - (?,Ts(B . ?$,1CS(B) - (?,Tt(B . ?$,1CT(B) - (?,Tu(B . ?$,1CU(B) - (?,Tv(B . ?$,1CV(B) - (?,Tw(B . ?$,1CW(B) - (?,Tx(B . ?$,1CX(B) - (?,Ty(B . ?$,1CY(B) - (?,Tz(B . ?$,1CZ(B) - (?,T{(B . ?$,1C[(B))) - - (tibetan-iso-8bit - '((?$(7!0(B . ?$,1E@(B) - (?$(7!1(B . ?$,1EA(B) - (?$(7!2(B . ?$,1EB(B) - (?$(7!3(B . ?$,1EC(B) - (?$(7!4(B . ?$,1ED(B) - (?$(7!5(B . ?$,1EE(B) - (?$(7!6(B . ?$,1EF(B) - (?$(7!7(B . ?$,1EG(B) - (?$(7!8(B . ?$,1EH(B) - (?$(7!9(B . ?$,1EI(B) - (?$(7!:(B . ?$,1EJ(B) - (?$(7!;(B . ?$,1EK(B) - (?$(7!<(B . ?$,1EL(B) - (?$(7!=(B . ?$,1EM(B) - (?$(7!>(B . ?$,1EN(B) - (?$(7!?(B . ?$,1EO(B) - (?$(7!@(B . ?$,1EP(B) - (?$(7!A(B . ?$,1EQ(B) - (?$(7!B(B . ?$,1ER(B) - (?$(7!C(B . ?$,1ES(B) - (?$(7!D(B . ?$,1ET(B) - (?$(7!E(B . ?$,1EU(B) - (?$(7!F(B . ?$,1EV(B) - (?$(7!G(B . ?$,1EW(B) - (?$(7!H(B . ?$,1EX(B) - (?$(7!I(B . ?$,1EY(B) - (?$(7!J(B . ?$,1EZ(B) - (?$(7!K(B . ?$,1E[(B) - (?$(7!L(B . ?$,1E\(B) - (?$(7!M(B . ?$,1E](B) - (?$(7!N(B . ?$,1E^(B) - (?$(7!O(B . ?$,1E_(B) - (?$(7!P(B . ?$,1E`(B) - (?$(7!Q(B . ?$,1Ea(B) - (?$(7!R(B . ?$,1Eb(B) - (?$(7!S(B . ?$,1Ec(B) - (?$(7!T(B . ?$,1Ed(B) - (?$(7!U(B . ?$,1Ee(B) - (?$(7!V(B . ?$,1Ef(B) - (?$(7!W(B . ?$,1Eg(B) - (?$(7!X(B . ?$,1Eh(B) - (?$(7!Y(B . ?$,1Ei(B) - (?$(7!Z(B . ?$,1Ej(B) - (?$(7![(B . ?$,1Ek(B) - (?$(7!\(B . ?$,1El(B) - (?$(7!](B . ?$,1Em(B) - (?$(7!^(B . ?$,1En(B) - (?$(7!_(B . ?$,1Eo(B) - (?$(7!`(B . ?$,1Ep(B) - (?$(7!a(B . ?$,1Eq(B) - (?$(7!b(B . ?$,1Er(B) - (?$(7!c(B . ?$,1Es(B) - (?$(7!d(B . ?$,1Et(B) - (?$(7!e(B . ?$,1Eu(B) - (?$(7!f(B . ?$,1Ev(B) - (?$(7!g(B . ?$,1Ew(B) - (?$(7!h(B . ?$,1Ex(B) - (?$(7!i(B . ?$,1Ey(B) - (?$(7!j(B . ?$,1Ez(B) - (?$(7!k(B . ?$,1E{(B) - (?$(7!l(B . ?$,1E|(B) - (?$(7!m(B . ?$,1E}(B) - (?$(7!n(B . ?$,1E~(B) - (?$(7!o(B . ?$,1E(B) - (?$(7"!(B . ?$,1F (B) - (?$(7""(B . ?$,1F!(B) - (?$(7"#(B . ?$,1F"(B) - (?$(7"$(B . ?$,1F#(B) - (?$(7"%(B . ?$,1F$(B) - (?$(7"&(B . ?$,1F%(B) - (?$(7"'(B . ?$,1F&(B) - (?$(7"((B . ?$,1F'(B) - (?$(7"*(B . ?$,1F)(B) - (?$(7"+(B . ?$,1F*(B) - (?$(7",(B . ?$,1F+(B) - (?$(7"-(B . ?$,1F,(B) - (?$(7".(B . ?$,1F-(B) - (?$(7"/(B . ?$,1F.(B) - (?$(7"0(B . ?$,1F/(B) - (?$(7"1(B . ?$,1F0(B) - (?$(7"2(B . ?$,1F1(B) - (?$(7"3(B . ?$,1F2(B) - (?$(7"4(B . ?$,1F3(B) - (?$(7"5(B . ?$,1F4(B) - (?$(7"6(B . ?$,1F5(B) - (?$(7"7(B . ?$,1F6(B) - (?$(7"8(B . ?$,1F7(B) - (?$(7"9(B . ?$,1F8(B) - (?$(7":(B . ?$,1F9(B) - (?$(7";(B . ?$,1F:(B) - (?$(7"<(B . ?$,1F;(B) - (?$(7"=(B . ?$,1F<(B) - (?$(7">(B . ?$,1F=(B) - (?$(7"?(B . ?$,1F>(B) - (?$(7"@(B . ?$,1F?(B) - (?$(7"A(B . ?$,1F@(B) - (?$(7"B(B . ?$,1FA(B) - (?$(7"C(B . ?$,1FB(B) - (?$(7"D(B . ?$,1FC(B) - (?$(7"E(B . ?$,1FD(B) - (?$(7"F(B . ?$,1FE(B) - (?$(7"G(B . ?$,1FF(B) - (?$(7"H(B . ?$,1FG(B) - (?$(7"I(B . ?$,1FH(B) - (?$(7"J(B . ?$,1FI(B) - (?$(7"K(B . ?$,1FJ(B) - (?$(7"R(B . ?$,1FQ(B) - (?$(7"S(B . ?$,1FR(B) - (?$(7"T(B . ?$,1FS(B) - (?$(7"U(B . ?$,1FT(B) - (?$(7"V(B . ?$,1FU(B) - (?$(7"W(B . ?$,1FV(B) - (?$(7"X(B . ?$,1FW(B) - (?$(7"Y(B . ?$,1FX(B) - (?$(7"Z(B . ?$,1FY(B) - (?$(7"[(B . ?$,1FZ(B) - (?$(7"\(B . ?$,1F[(B) - (?$(7"](B . ?$,1F\(B) - (?$(7"^(B . ?$,1F](B) - (?$(7"_(B . ?$,1F^(B) - (?$(7"`(B . ?$,1F_(B) - (?$(7"a(B . ?$,1F`(B) - (?$(7"b(B . ?$,1Fa(B) - (?$(7"c(B . ?$,1Fb(B) - (?$(7"d(B . ?$,1Fc(B) - (?$(7"e(B . ?$,1Fd(B) - (?$(7"f(B . ?$,1Fe(B) - (?$(7"g(B . ?$,1Ff(B) - (?$(7"h(B . ?$,1Fg(B) - (?$(7"i(B . ?$,1Fh(B) - (?$(7"j(B . ?$,1Fi(B) - (?$(7"k(B . ?$,1Fj(B) - (?$(7"l(B . ?$,1Fk(B) - (?$(7#!(B . ?$,1Fp(B) - (?$(7#"(B . ?$,1Fq(B) - (?$(7##(B . ?$,1Fr(B) - (?$(7#$(B . ?$,1Fs(B) - (?$(7#%(B . ?$,1Ft(B) - (?$(7#&(B . ?$,1Fu(B) - (?$(7#'(B . ?$,1Fv(B) - (?$(7#((B . ?$,1Fw(B) - (?$(7#*(B . ?$,1Fy(B) - (?$(7#+(B . ?$,1Fz(B) - (?$(7#,(B . ?$,1F{(B) - (?$(7#-(B . ?$,1F|(B) - (?$(7#.(B . ?$,1F}(B) - (?$(7#/(B . ?$,1F~(B) - (?$(7#0(B . ?$,1F(B) - (?$(7#1(B . ?$,1G (B) - (?$(7#2(B . ?$,1G!(B) - (?$(7#3(B . ?$,1G"(B) - (?$(7#4(B . ?$,1G#(B) - (?$(7#5(B . ?$,1G$(B) - (?$(7#6(B . ?$,1G%(B) - (?$(7#7(B . ?$,1G&(B) - (?$(7#8(B . ?$,1G'(B) - (?$(7#9(B . ?$,1G((B) - (?$(7#:(B . ?$,1G)(B) - (?$(7#;(B . ?$,1G*(B) - (?$(7#<(B . ?$,1G+(B) - (?$(7#=(B . ?$,1G,(B) - (?$(7#>(B . ?$,1G-(B) - (?$(7#?(B . ?$,1G.(B) - (?$(7#@(B . ?$,1G/(B) - (?$(7#A(B . ?$,1G0(B) - (?$(7#B(B . ?$,1G1(B) - (?$(7#C(B . ?$,1G2(B) - (?$(7#D(B . ?$,1G3(B) - (?$(7#E(B . ?$,1G4(B) - (?$(7#F(B . ?$,1G5(B) - (?$(7#G(B . ?$,1G6(B) - (?$(7#H(B . ?$,1G7(B) - (?$(7#I(B . ?$,1G8(B) - (?$(7#J(B . ?$,1G9(B) - (?$(7#K(B . ?$,1G:(B) - (?$(7#L(B . ?$,1G;(B) - (?$(7#M(B . ?$,1G<(B) - (?$(7#O(B . ?$,1G>(B) - (?$(7#P(B . ?$,1G?(B) - (?$(7#Q(B . ?$,1G@(B) - (?$(7#R(B . ?$,1GA(B) - (?$(7#S(B . ?$,1GB(B) - (?$(7#T(B . ?$,1GC(B) - (?$(7#U(B . ?$,1GD(B) - (?$(7#V(B . ?$,1GE(B) - (?$(7#W(B . ?$,1GF(B) - (?$(7#X(B . ?$,1GG(B) - (?$(7#Y(B . ?$,1GH(B) - (?$(7#Z(B . ?$,1GI(B) - (?$(7#[(B . ?$,1GJ(B) - (?$(7#\(B . ?$,1GK(B) - (?$(7#](B . ?$,1GL(B) - (?$(7#`(B . ?$,1GO(B))) - - (ipa - '((?i . ?i) - (?,0!(B . ?$,1#j(B) - (?e . ?e) - (?,0#(B . ?$,1#[(B) - (?,0$(B . ?,Af(B) - (?a . ?a) - (?,0&(B . ?$,1#h(B) - (?,0'(B . ?$,1#Y(B) - (?,0((B . ?$,1#P(B) - (?,0)(B . ?$,1#o(B) - (?,0*(B . ?$,1#d(B) - (?,0+(B . ?$,1$,(B) - (?,0,(B . ?$,1#Q(B) - (?y . ?y) - (?,0.(B . ?$,1$/(B) - (?,0/(B . ?,Ax(B) - (?,00(B . ?$,1 s(B) - (?,01(B . ?$,1#v(B) - (?,02(B . ?$,1$)(B) - (?,03(B . ?$,1#u(B) - (?u . ?u) - (?,05(B . ?$,1$*(B) - (?o . ?o) - (?,07(B . ?$,1#T(B) - (?,08(B . ?$,1#R(B) - (?,0:(B . ?$,1#Z(B) - (?p . ?p) - (?b . ?b) - (?t . ?t) - (?d . ?d) - (?k . ?k) - (?g . ?g) - (?f . ?f) - (?v . ?v) - (?,0H(B . ?$,1'8(B) - (?,0I(B . ?,Ap(B) - (?s . ?s) - (?z . ?z) - (?,0L(B . ?$,1$#(B) - (?,0M(B . ?$,1$2(B) - (?,0N(B . ?,Ag(B) - (?x . ?x) - (?,0P(B . ?$,1$!(B) - (?h . ?h) - (?m . ?m) - (?n . ?n) - (?,0T(B . ?$,1#r(B) - (?,0U(B . ?$,1 k(B) - (?r . ?r) - (?,0W(B . ?$,1$ (B) - (?,0X(B . ?$,1#y(B) - (?j . ?j) - (?l . ?l) - (?,0[(B . ?$,1$.(B) - (?,0\(B . ?$,1$?(B) - (?,0](B . ?$,1#e(B) - (?w . ?w) - (?,0_(B . ?$,1$-(B) - (?,0p(B . ?$,1$h(B) - (?,0q(B . ?$,1$l(B) - (?,0r(B . ?$,1$p(B))) - - (ethiopic - '((?$(3!!(B . ?$,1M@(B) - (?$(3!"(B . ?$,1MA(B) - (?$(3!#(B . ?$,1MB(B) - (?$(3!$(B . ?$,1MC(B) - (?$(3!%(B . ?$,1MD(B) - (?$(3!&(B . ?$,1ME(B) - (?$(3!'(B . ?$,1MF(B) - (?$(3!)(B . ?$,1MH(B) - (?$(3!*(B . ?$,1MI(B) - (?$(3!+(B . ?$,1MJ(B) - (?$(3!,(B . ?$,1MK(B) - (?$(3!-(B . ?$,1ML(B) - (?$(3!.(B . ?$,1MM(B) - (?$(3!/(B . ?$,1MN(B) - (?$(3!0(B . ?$,1MO(B) - (?$(3!1(B . ?$,1MP(B) - (?$(3!2(B . ?$,1MQ(B) - (?$(3!3(B . ?$,1MR(B) - (?$(3!4(B . ?$,1MS(B) - (?$(3!5(B . ?$,1MT(B) - (?$(3!6(B . ?$,1MU(B) - (?$(3!7(B . ?$,1MV(B) - (?$(3!8(B . ?$,1MW(B) - (?$(3!9(B . ?$,1MX(B) - (?$(3!:(B . ?$,1MY(B) - (?$(3!;(B . ?$,1MZ(B) - (?$(3!<(B . ?$,1M[(B) - (?$(3!=(B . ?$,1M\(B) - (?$(3!>(B . ?$,1M](B) - (?$(3!?(B . ?$,1M^(B) - (?$(3!@(B . ?$,1M_(B) - (?$(3!A(B . ?$,1M`(B) - (?$(3!B(B . ?$,1Ma(B) - (?$(3!C(B . ?$,1Mb(B) - (?$(3!D(B . ?$,1Mc(B) - (?$(3!E(B . ?$,1Md(B) - (?$(3!F(B . ?$,1Me(B) - (?$(3!G(B . ?$,1Mf(B) - (?$(3!H(B . ?$,1Mg(B) - (?$(3!I(B . ?$,1Mh(B) - (?$(3!J(B . ?$,1Mi(B) - (?$(3!K(B . ?$,1Mj(B) - (?$(3!L(B . ?$,1Mk(B) - (?$(3!M(B . ?$,1Ml(B) - (?$(3!N(B . ?$,1Mm(B) - (?$(3!O(B . ?$,1Mn(B) - (?$(3!P(B . ?$,1Mo(B) - (?$(3!Q(B . ?$,1Mp(B) - (?$(3!R(B . ?$,1Mq(B) - (?$(3!S(B . ?$,1Mr(B) - (?$(3!T(B . ?$,1Ms(B) - (?$(3!U(B . ?$,1Mt(B) - (?$(3!V(B . ?$,1Mu(B) - (?$(3!W(B . ?$,1Mv(B) - (?$(3!X(B . ?$,1Mw(B) - (?$(3!Y(B . ?$,1Mx(B) - (?$(3!Z(B . ?$,1My(B) - (?$(3![(B . ?$,1Mz(B) - (?$(3!\(B . ?$,1M{(B) - (?$(3!](B . ?$,1M|(B) - (?$(3!^(B . ?$,1M}(B) - (?$(3!_(B . ?$,1M~(B) - (?$(3!`(B . ?$,1M(B) - (?$(3!a(B . ?$,1N (B) - (?$(3!b(B . ?$,1N!(B) - (?$(3!c(B . ?$,1N"(B) - (?$(3!d(B . ?$,1N#(B) - (?$(3!e(B . ?$,1N$(B) - (?$(3!f(B . ?$,1N%(B) - (?$(3!g(B . ?$,1N&(B) - (?$(3!i(B . ?$,1N((B) - (?$(3!k(B . ?$,1N*(B) - (?$(3!l(B . ?$,1N+(B) - (?$(3!m(B . ?$,1N,(B) - (?$(3!n(B . ?$,1N-(B) - (?$(3!q(B . ?$,1N0(B) - (?$(3!r(B . ?$,1N1(B) - (?$(3!s(B . ?$,1N2(B) - (?$(3!t(B . ?$,1N3(B) - (?$(3!u(B . ?$,1N4(B) - (?$(3!v(B . ?$,1N5(B) - (?$(3!w(B . ?$,1N6(B) - (?$(3!y(B . ?$,1N8(B) - (?$(3!{(B . ?$,1N:(B) - (?$(3!|(B . ?$,1N;(B) - (?$(3!}(B . ?$,1N<(B) - (?$(3!~(B . ?$,1N=(B) - (?$(3"#(B . ?$,1N@(B) - (?$(3"$(B . ?$,1NA(B) - (?$(3"%(B . ?$,1NB(B) - (?$(3"&(B . ?$,1NC(B) - (?$(3"'(B . ?$,1ND(B) - (?$(3"((B . ?$,1NE(B) - (?$(3")(B . ?$,1NF(B) - (?$(3"*(B . ?$,1NG(B) - (?$(3"+(B . ?$,1NH(B) - (?$(3",(B . ?$,1NI(B) - (?$(3"-(B . ?$,1NJ(B) - (?$(3".(B . ?$,1NK(B) - (?$(3"/(B . ?$,1NL(B) - (?$(3"0(B . ?$,1NM(B) - (?$(3"1(B . ?$,1NN(B) - (?$(3"2(B . ?$,1NO(B) - (?$(3"3(B . ?$,1NP(B) - (?$(3"4(B . ?$,1NQ(B) - (?$(3"5(B . ?$,1NR(B) - (?$(3"6(B . ?$,1NS(B) - (?$(3"7(B . ?$,1NT(B) - (?$(3"8(B . ?$,1NU(B) - (?$(3"9(B . ?$,1NV(B) - (?$(3":(B . ?$,1NW(B) - (?$(3";(B . ?$,1NX(B) - (?$(3"<(B . ?$,1NY(B) - (?$(3"=(B . ?$,1NZ(B) - (?$(3">(B . ?$,1N[(B) - (?$(3"?(B . ?$,1N\(B) - (?$(3"@(B . ?$,1N](B) - (?$(3"A(B . ?$,1N^(B) - (?$(3"B(B . ?$,1N_(B) - (?$(3"C(B . ?$,1N`(B) - (?$(3"D(B . ?$,1Na(B) - (?$(3"E(B . ?$,1Nb(B) - (?$(3"F(B . ?$,1Nc(B) - (?$(3"G(B . ?$,1Nd(B) - (?$(3"H(B . ?$,1Ne(B) - (?$(3"I(B . ?$,1Nf(B) - (?$(3"K(B . ?$,1Nh(B) - (?$(3"M(B . ?$,1Nj(B) - (?$(3"N(B . ?$,1Nk(B) - (?$(3"O(B . ?$,1Nl(B) - (?$(3"P(B . ?$,1Nm(B) - (?$(3"S(B . ?$,1Np(B) - (?$(3"T(B . ?$,1Nq(B) - (?$(3"U(B . ?$,1Nr(B) - (?$(3"V(B . ?$,1Ns(B) - (?$(3"W(B . ?$,1Nt(B) - (?$(3"X(B . ?$,1Nu(B) - (?$(3"Y(B . ?$,1Nv(B) - (?$(3"Z(B . ?$,1Nw(B) - (?$(3"[(B . ?$,1Nx(B) - (?$(3"\(B . ?$,1Ny(B) - (?$(3"](B . ?$,1Nz(B) - (?$(3"^(B . ?$,1N{(B) - (?$(3"_(B . ?$,1N|(B) - (?$(3"`(B . ?$,1N}(B) - (?$(3"a(B . ?$,1N~(B) - (?$(3"b(B . ?$,1N(B) - (?$(3"c(B . ?$,1O (B) - (?$(3"d(B . ?$,1O!(B) - (?$(3"e(B . ?$,1O"(B) - (?$(3"f(B . ?$,1O#(B) - (?$(3"g(B . ?$,1O$(B) - (?$(3"h(B . ?$,1O%(B) - (?$(3"i(B . ?$,1O&(B) - (?$(3"j(B . ?$,1O'(B) - (?$(3"k(B . ?$,1O((B) - (?$(3"l(B . ?$,1O)(B) - (?$(3"m(B . ?$,1O*(B) - (?$(3"n(B . ?$,1O+(B) - (?$(3"o(B . ?$,1O,(B) - (?$(3"p(B . ?$,1O-(B) - (?$(3"q(B . ?$,1O.(B) - (?$(3"s(B . ?$,1O0(B) - (?$(3"u(B . ?$,1O2(B) - (?$(3"v(B . ?$,1O3(B) - (?$(3"w(B . ?$,1O4(B) - (?$(3"x(B . ?$,1O5(B) - (?$(3"{(B . ?$,1O8(B) - (?$(3"|(B . ?$,1O9(B) - (?$(3"}(B . ?$,1O:(B) - (?$(3"~(B . ?$,1O;(B) - (?$(3#!(B . ?$,1O<(B) - (?$(3#"(B . ?$,1O=(B) - (?$(3##(B . ?$,1O>(B) - (?$(3#%(B . ?$,1O@(B) - (?$(3#'(B . ?$,1OB(B) - (?$(3#((B . ?$,1OC(B) - (?$(3#)(B . ?$,1OD(B) - (?$(3#*(B . ?$,1OE(B) - (?$(3#-(B . ?$,1OH(B) - (?$(3#.(B . ?$,1OI(B) - (?$(3#/(B . ?$,1OJ(B) - (?$(3#0(B . ?$,1OK(B) - (?$(3#1(B . ?$,1OL(B) - (?$(3#2(B . ?$,1OM(B) - (?$(3#3(B . ?$,1ON(B) - (?$(3#5(B . ?$,1OP(B) - (?$(3#6(B . ?$,1OQ(B) - (?$(3#7(B . ?$,1OR(B) - (?$(3#8(B . ?$,1OS(B) - (?$(3#9(B . ?$,1OT(B) - (?$(3#:(B . ?$,1OU(B) - (?$(3#;(B . ?$,1OV(B) - (?$(3#=(B . ?$,1OX(B) - (?$(3#>(B . ?$,1OY(B) - (?$(3#?(B . ?$,1OZ(B) - (?$(3#@(B . ?$,1O[(B) - (?$(3#A(B . ?$,1O\(B) - (?$(3#B(B . ?$,1O](B) - (?$(3#C(B . ?$,1O^(B) - (?$(3#D(B . ?$,1O_(B) - (?$(3#E(B . ?$,1O`(B) - (?$(3#F(B . ?$,1Oa(B) - (?$(3#G(B . ?$,1Ob(B) - (?$(3#H(B . ?$,1Oc(B) - (?$(3#I(B . ?$,1Od(B) - (?$(3#J(B . ?$,1Oe(B) - (?$(3#K(B . ?$,1Of(B) - (?$(3#L(B . ?$,1Og(B) - (?$(3#M(B . ?$,1Oh(B) - (?$(3#N(B . ?$,1Oi(B) - (?$(3#O(B . ?$,1Oj(B) - (?$(3#P(B . ?$,1Ok(B) - (?$(3#Q(B . ?$,1Ol(B) - (?$(3#R(B . ?$,1Om(B) - (?$(3#S(B . ?$,1On(B) - (?$(3#U(B . ?$,1Op(B) - (?$(3#V(B . ?$,1Oq(B) - (?$(3#W(B . ?$,1Or(B) - (?$(3#X(B . ?$,1Os(B) - (?$(3#Y(B . ?$,1Ot(B) - (?$(3#Z(B . ?$,1Ou(B) - (?$(3#[(B . ?$,1Ov(B) - (?$(3#\(B . ?$,1Ow(B) - (?$(3#](B . ?$,1Ox(B) - (?$(3#^(B . ?$,1Oy(B) - (?$(3#_(B . ?$,1Oz(B) - (?$(3#`(B . ?$,1O{(B) - (?$(3#a(B . ?$,1O|(B) - (?$(3#b(B . ?$,1O}(B) - (?$(3#c(B . ?$,1O~(B) - (?$(3#d(B . ?$,1O(B) - (?$(3#e(B . ?$,1P (B) - (?$(3#f(B . ?$,1P!(B) - (?$(3#g(B . ?$,1P"(B) - (?$(3#h(B . ?$,1P#(B) - (?$(3#i(B . ?$,1P$(B) - (?$(3#j(B . ?$,1P%(B) - (?$(3#k(B . ?$,1P&(B) - (?$(3#l(B . ?$,1P'(B) - (?$(3#m(B . ?$,1P((B) - (?$(3#n(B . ?$,1P)(B) - (?$(3#o(B . ?$,1P*(B) - (?$(3#p(B . ?$,1P+(B) - (?$(3#q(B . ?$,1P,(B) - (?$(3#r(B . ?$,1P-(B) - (?$(3#s(B . ?$,1P.(B) - (?$(3#u(B . ?$,1P0(B) - (?$(3#w(B . ?$,1P2(B) - (?$(3#x(B . ?$,1P3(B) - (?$(3#y(B . ?$,1P4(B) - (?$(3#z(B . ?$,1P5(B) - (?$(3#}(B . ?$,1P8(B) - (?$(3#~(B . ?$,1P9(B) - (?$(3$!(B . ?$,1P:(B) - (?$(3$"(B . ?$,1P;(B) - (?$(3$#(B . ?$,1P<(B) - (?$(3$$(B . ?$,1P=(B) - (?$(3$%(B . ?$,1P>(B) - (?$(3$'(B . ?$,1P@(B) - (?$(3$((B . ?$,1PA(B) - (?$(3$)(B . ?$,1PB(B) - (?$(3$*(B . ?$,1PC(B) - (?$(3$+(B . ?$,1PD(B) - (?$(3$,(B . ?$,1PE(B) - (?$(3$-(B . ?$,1PF(B) - (?$(3$.(B . ?$,1PG(B) - (?$(3$/(B . ?$,1PH(B) - (?$(3$0(B . ?$,1PI(B) - (?$(3$1(B . ?$,1PJ(B) - (?$(3$2(B . ?$,1PK(B) - (?$(3$3(B . ?$,1PL(B) - (?$(3$4(B . ?$,1PM(B) - (?$(3$5(B . ?$,1PN(B) - (?$(3$6(B . ?$,1PO(B) - (?$(3$7(B . ?$,1PP(B) - (?$(3$8(B . ?$,1PQ(B) - (?$(3$9(B . ?$,1PR(B) - (?$(3$:(B . ?$,1PS(B) - (?$(3$;(B . ?$,1PT(B) - (?$(3$<(B . ?$,1PU(B) - (?$(3$=(B . ?$,1PV(B) - (?$(3$>(B . ?$,1PW(B) - (?$(3$?(B . ?$,1PX(B) - (?$(3$@(B . ?$,1PY(B) - (?$(3$A(B . ?$,1PZ(B) - (?$(3$B(B . ?$,1P[(B) - (?$(3$C(B . ?$,1P\(B) - (?$(3$D(B . ?$,1P](B) - (?$(3$E(B . ?$,1P^(B) - (?$(3$F(B . ?$,1P_(B) - (?$(3$G(B . ?$,1P`(B) - (?$(3$H(B . ?$,1Pa(B) - (?$(3$I(B . ?$,1Pb(B) - (?$(3$J(B . ?$,1Pc(B) - (?$(3$K(B . ?$,1Pd(B) - (?$(3$L(B . ?$,1Pe(B) - (?$(3$M(B . ?$,1Pf(B) - (?$(3$O(B . ?$,1Ph(B) - (?$(3$P(B . ?$,1Pi(B) - (?$(3$Q(B . ?$,1Pj(B) - (?$(3$R(B . ?$,1Pk(B) - (?$(3$S(B . ?$,1Pl(B) - (?$(3$T(B . ?$,1Pm(B) - (?$(3$U(B . ?$,1Pn(B) - (?$(3$V(B . ?$,1Po(B) - (?$(3$W(B . ?$,1Pp(B) - (?$(3$X(B . ?$,1Pq(B) - (?$(3$Y(B . ?$,1Pr(B) - (?$(3$Z(B . ?$,1Ps(B) - (?$(3$[(B . ?$,1Pt(B) - (?$(3$\(B . ?$,1Pu(B) - (?$(3$](B . ?$,1Pv(B) - (?$(3$^(B . ?$,1Pw(B) - (?$(3$_(B . ?$,1Px(B) - (?$(3$`(B . ?$,1Py(B) - (?$(3$a(B . ?$,1Pz(B) - (?$(3$h(B . ?$,1Q!(B) - (?$(3$i(B . ?$,1Q"(B) - (?$(3$j(B . ?$,1Q#(B) - (?$(3$k(B . ?$,1Q$(B) - (?$(3$l(B . ?$,1Q%(B) - (?$(3$m(B . ?$,1Q&(B) - (?$(3$n(B . ?$,1Q'(B) - (?$(3$o(B . ?$,1Q((B) - (?$(3$p(B . ?$,1Q)(B) - (?$(3$q(B . ?$,1Q*(B) - (?$(3$r(B . ?$,1Q+(B) - (?$(3$s(B . ?$,1Q,(B) - (?$(3$t(B . ?$,1Q-(B) - (?$(3$u(B . ?$,1Q.(B) - (?$(3$v(B . ?$,1Q/(B) - (?$(3$w(B . ?$,1Q0(B) - (?$(3$x(B . ?$,1Q1(B) - (?$(3$y(B . ?$,1Q2(B) - (?$(3$z(B . ?$,1Q3(B) - (?$(3${(B . ?$,1Q4(B) - (?$(3$|(B . ?$,1Q5(B) - (?$(3$}(B . ?$,1Q6(B) - (?$(3$~(B . ?$,1Q7(B) - (?$(3%!(B . ?$,1Q8(B) - (?$(3%"(B . ?$,1Q9(B) - (?$(3%#(B . ?$,1Q:(B) - (?$(3%$(B . ?$,1Q;(B) - (?$(3%%(B . ?$,1Q<(B))) - - (indian-is13194 - '((?(5!(B . ?$,15A(B) - (?(5"(B . ?$,15B(B) - (?(5#(B . ?$,15C(B) - (?(5$(B . ?$,15E(B) - (?(5%(B . ?$,15F(B) - (?(5&(B . ?$,15G(B) - (?(5'(B . ?$,15H(B) - (?(5((B . ?$,15I(B) - (?(5)(B . ?$,15J(B) - (?(5*(B . ?$,15K(B) - (?(5+(B . ?$,15N(B) - (?(5,(B . ?$,15O(B) - (?(5-(B . ?$,15P(B) - (?(5.(B . ?$,15M(B) - (?(5/(B . ?$,15R(B) - (?(50(B . ?$,15S(B) - (?(51(B . ?$,15T(B) - (?(52(B . ?$,15M(B) - (?(53(B . ?$,15U(B) - (?(54(B . ?$,15V(B) - (?(55(B . ?$,15W(B) - (?(56(B . ?$,15X(B) - (?(57(B . ?$,15Y(B) - (?(58(B . ?$,15Z(B) - (?(59(B . ?$,15[(B) - (?(5:(B . ?$,15\(B) - (?(5;(B . ?$,15](B) - (?(5<(B . ?$,15^(B) - (?(5=(B . ?$,15_(B) - (?(5>(B . ?$,15`(B) - (?(5?(B . ?$,15a(B) - (?(5@(B . ?$,15b(B) - (?(5A(B . ?$,15c(B) - (?(5B(B . ?$,15d(B) - (?(5C(B . ?$,15e(B) - (?(5D(B . ?$,15f(B) - (?(5E(B . ?$,15g(B) - (?(5F(B . ?$,15h(B) - (?(5G(B . ?$,15i(B) - (?(5H(B . ?$,15j(B) - (?(5I(B . ?$,15k(B) - (?(5J(B . ?$,15l(B) - (?(5K(B . ?$,15m(B) - (?(5L(B . ?$,15n(B) - (?(5M(B . ?$,15o(B) - (?(5N(B . ?$,16?(B) - (?(5O(B . ?$,15p(B) - (?(5P(B . ?$,15q(B) - (?(5Q(B . ?$,15r(B) - (?(5R(B . ?$,15s(B) - (?(5S(B . ?$,15t(B) - (?(5T(B . ?$,15u(B) - (?(5U(B . ?$,15v(B) - (?(5V(B . ?$,15w(B) - (?(5W(B . ?$,15x(B) - (?(5X(B . ?$,15y(B) - (?(5Z(B . ?$,15~(B) - (?(5[(B . ?$,15(B) - (?(5\(B . ?$,16 (B) - (?(5](B . ?$,16!(B) - (?(5^(B . ?$,16"(B) - (?(5_(B . ?$,16#(B) - (?(5`(B . ?$,16&(B) - (?(5a(B . ?$,16'(B) - (?(5b(B . ?$,16((B) - (?(5c(B . ?$,16%(B) - (?(5d(B . ?$,16*(B) - (?(5e(B . ?$,16+(B) - (?(5f(B . ?$,16,(B) - (?(5g(B . ?$,16)(B) - (?(5h(B . ?$,16-(B) - (?(5i(B . ?$,15|(B) - (?(5j(B . ?$,16D(B) - (?(5q(B . ?$,16F(B) - (?(5r(B . ?$,16G(B) - (?(5s(B . ?$,16H(B) - (?(5t(B . ?$,16I(B) - (?(5u(B . ?$,16J(B) - (?(5v(B . ?$,16K(B) - (?(5w(B . ?$,16L(B) - (?(5x(B . ?$,16M(B) - (?(5y(B . ?$,16N(B) - (?(5z(B . ?$,16O(B))) - - (katakana-jisx0201 - '((?(I!(B . ?$,3sa(B) - (?\(I"(B . ?\$,3sb(B) - (?\(I#(B . ?\$,3sc(B) - (?(I$(B . ?$,3sd(B) - (?(I%(B . ?$,3se(B) - (?(I&(B . ?$,3sf(B) - (?(I'(B . ?$,3sg(B) - (?(I((B . ?$,3sh(B) - (?(I)(B . ?$,3si(B) - (?(I*(B . ?$,3sj(B) - (?(I+(B . ?$,3sk(B) - (?(I,(B . ?$,3sl(B) - (?(I-(B . ?$,3sm(B) - (?(I.(B . ?$,3sn(B) - (?(I/(B . ?$,3so(B) - (?(I0(B . ?$,3sp(B) - (?(I1(B . ?$,3sq(B) - (?(I2(B . ?$,3sr(B) - (?(I3(B . ?$,3ss(B) - (?(I4(B . ?$,3st(B) - (?(I5(B . ?$,3su(B) - (?(I6(B . ?$,3sv(B) - (?(I7(B . ?$,3sw(B) - (?(I8(B . ?$,3sx(B) - (?(I9(B . ?$,3sy(B) - (?(I:(B . ?$,3sz(B) - (?(I;(B . ?$,3s{(B) - (?(I<(B . ?$,3s|(B) - (?(I=(B . ?$,3s}(B) - (?(I>(B . ?$,3s~(B) - (?(I?(B . ?$,3s(B) - (?(I@(B . ?$,3t (B) - (?(IA(B . ?$,3t!(B) - (?(IB(B . ?$,3t"(B) - (?(IC(B . ?$,3t#(B) - (?(ID(B . ?$,3t$(B) - (?(IE(B . ?$,3t%(B) - (?(IF(B . ?$,3t&(B) - (?(IG(B . ?$,3t'(B) - (?(IH(B . ?$,3t((B) - (?(II(B . ?$,3t)(B) - (?(IJ(B . ?$,3t*(B) - (?(IK(B . ?$,3t+(B) - (?(IL(B . ?$,3t,(B) - (?(IM(B . ?$,3t-(B) - (?(IN(B . ?$,3t.(B) - (?(IO(B . ?$,3t/(B) - (?(IP(B . ?$,3t0(B) - (?(IQ(B . ?$,3t1(B) - (?(IR(B . ?$,3t2(B) - (?(IS(B . ?$,3t3(B) - (?(IT(B . ?$,3t4(B) - (?(IU(B . ?$,3t5(B) - (?(IV(B . ?$,3t6(B) - (?(IW(B . ?$,3t7(B) - (?(IX(B . ?$,3t8(B) - (?(IY(B . ?$,3t9(B) - (?(IZ(B . ?$,3t:(B) - (?(I[(B . ?$,3t;(B) - (?(I\(B . ?$,3t<(B) - (?(I](B . ?$,3t=(B) - (?(I^(B . ?$,3t>(B) - (?(I_(B . ?$,3t?(B))) - - (chinese-sisheng - '((?(0!(B . ?$,1 !(B) - (?(0"(B . ?,Aa(B) - (?(0#(B . ?$,1".(B) - (?(0$(B . ?,A`(B) - (?(0%(B . ?$,1 3(B) - (?(0&(B . ?,Ai(B) - (?(0'(B . ?$,1 ;(B) - (?(0((B . ?,Ah(B) - (?(0)(B . ?$,1 K(B) - (?(0*(B . ?,Am(B) - (?(0+(B . ?$,1"0(B) - (?(0,(B . ?,Al(B) - (?(0-(B . ?$,1 m(B) - (?(0.(B . ?,As(B) - (?(0/(B . ?$,1"2(B) - (?(00(B . ?,Ar(B) - (?(01(B . ?$,1!+(B) - (?(02(B . ?,Az(B) - (?(03(B . ?$,1"4(B) - (?(04(B . ?,Ay(B) - (?(05(B . ?$,1"6(B) - (?(06(B . ?$,1"8(B) - (?(07(B . ?$,1":(B) - (?(08(B . ?$,1"<(B) - (?(09(B . ?,A|(B) - (?(0:(B . ?,Aj(B) - (?(0<(B . ?$,1m(B) - (?(0=(B . ?$,1 d(B) - (?(0>(B . ?$,1 h(B) - (?(0?(B . ?$,1"Y(B) - (?(0A(B . ?$,1$i(B) - (?(0B(B . ?$,1$j(B) - (?(0C(B . ?$,1$g(B) - (?(0D(B . ?$,1$k(B) - (?(0E(B . ?$,2@%(B) - (?(0F(B . ?$,2@&(B) - (?(0G(B . ?$,2@'(B) - (?(0H(B . ?$,2@((B) - (?(0I(B . ?$,2@)(B) - (?(0J(B . ?$,2@*(B) - (?(0K(B . ?$,2@+(B) - (?(0L(B . ?$,2@,(B) - (?(0M(B . ?$,2@-(B) - (?(0N(B . ?$,2@.(B) - (?(0O(B . ?$,2@/(B) - (?(0P(B . ?$,2@0(B) - (?(0Q(B . ?$,2@1(B) - (?(0R(B . ?$,2@2(B) - (?(0S(B . ?$,2@3(B) - (?(0T(B . ?$,2@4(B) - (?(0U(B . ?$,2@5(B) - (?(0V(B . ?$,2@6(B) - (?(0W(B . ?$,2@7(B) - (?(0X(B . ?$,2@8(B) - (?(0Y(B . ?$,2@9(B) - (?(0Z(B . ?$,2@:(B) - (?(0[(B . ?$,2@;(B) - (?(0\(B . ?$,2@<(B) - (?(0](B . ?$,2@=(B) - (?(0^(B . ?$,2@>(B) - (?(0_(B . ?$,2@?(B) - (?(0`(B . ?$,2@@(B) - (?(0a(B . ?$,2@A(B) - (?(0b(B . ?$,2@B(B) - (?(0c(B . ?$,2@C(B) - (?(0d(B . ?$,2@D(B) - (?(0e(B . ?$,2@E(B) - (?(0f(B . ?$,2@F(B) - (?(0g(B . ?$,2@G(B) - (?(0h(B . ?$,2@H(B) - (?(0i(B . ?$,2@I(B))) - - (lao - '((?(1!(B . ?$,1D!(B) - (?(1"(B . ?$,1D"(B) - (?(1$(B . ?$,1D$(B) - (?(1'(B . ?$,1D'(B) - (?(1((B . ?$,1D((B) - (?(1*(B . ?$,1D*(B) - (?(1-(B . ?$,1D-(B) - (?(14(B . ?$,1D4(B) - (?(15(B . ?$,1D5(B) - (?(16(B . ?$,1D6(B) - (?(17(B . ?$,1D7(B) - (?(19(B . ?$,1D9(B) - (?(1:(B . ?$,1D:(B) - (?(1;(B . ?$,1D;(B) - (?(1<(B . ?$,1D<(B) - (?(1=(B . ?$,1D=(B) - (?(1>(B . ?$,1D>(B) - (?(1?(B . ?$,1D?(B) - (?(1A(B . ?$,1DA(B) - (?(1B(B . ?$,1DB(B) - (?(1C(B . ?$,1DC(B) - (?(1E(B . ?$,1DE(B) - (?(1G(B . ?$,1DG(B) - (?(1J(B . ?$,1DJ(B) - (?(1K(B . ?$,1DK(B) - (?(1M(B . ?$,1DM(B) - (?(1N(B . ?$,1DN(B) - (?(1O(B . ?$,1DO(B) - (?(1P(B . ?$,1DP(B) - (?(1Q(B . ?$,1DQ(B) - (?(1R(B . ?$,1DR(B) - (?(1S(B . ?$,1DS(B) - (?(1T(B . ?$,1DT(B) - (?(1U(B . ?$,1DU(B) - (?(1V(B . ?$,1DV(B) - (?(1W(B . ?$,1DW(B) - (?(1X(B . ?$,1DX(B) - (?(1Y(B . ?$,1DY(B) - (?(1[(B . ?$,1D[(B) - (?(1\(B . ?$,1D\(B) - (?(1](B . ?$,1D](B) - (?(1`(B . ?$,1D`(B) - (?(1a(B . ?$,1Da(B) - (?(1b(B . ?$,1Db(B) - (?(1c(B . ?$,1Dc(B) - (?(1d(B . ?$,1Dd(B) - (?(1f(B . ?$,1Df(B) - (?(1h(B . ?$,1Dh(B) - (?(1i(B . ?$,1Di(B) - (?(1j(B . ?$,1Dj(B) - (?(1k(B . ?$,1Dk(B) - (?(1l(B . ?$,1Dl(B) - (?(1m(B . ?$,1Dm(B) - (?(1p(B . ?$,1Dp(B) - (?(1q(B . ?$,1Dq(B) - (?(1r(B . ?$,1Dr(B) - (?(1s(B . ?$,1Ds(B) - (?(1t(B . ?$,1Dt(B) - (?(1u(B . ?$,1Du(B) - (?(1v(B . ?$,1Dv(B) - (?(1w(B . ?$,1Dw(B) - (?(1x(B . ?$,1Dx(B) - (?(1y(B . ?$,1Dy(B) - (?(1|(B . ?$,1D|(B) - (?(1}(B . ?$,1D}(B)))) - (let ((table (make-char-table 'safe-chars)) - safe-charsets) - (dolist (cs '(vietnamese-viscii lao chinese-sisheng ipa - katakana-jisx0201 thai-tis620 tibetan-iso-8bit - indian-is13194 ethiopic)) - ;; These tables could be used as translation-table-for-encode by - ;; the relevant coding systems. - (let ((encode-translator - (if (coding-system-p cs) - (set (intern (format "ucs-%s-encode-table" cs)) - (make-translation-table))))) - (dolist (pair (symbol-value cs)) - (aset ucs-mule-to-mule-unicode (car pair) (cdr pair)) - (if encode-translator - (aset encode-translator (cdr pair) (car pair)))) - (if (charsetp cs) - (push cs safe-charsets) - (setq safe-charsets - (append (delq 'ascii (coding-system-get cs 'safe-charsets)) - safe-charsets))))) - (dolist (c safe-charsets) - (aset table (make-char c) t)) - (coding-system-put 'mule-utf-8 'safe-charsets - (append (coding-system-get 'mule-utf-8 'safe-charsets) - safe-charsets)) - (register-char-codings 'mule-utf-8 table))) - -(provide 'ucs-tables) - -;;; ucs-tables.el ends here -- 2.25.1