diff lisp/mule/ethiopic.el @ 165:5a88923fcbfe r20-3b9

Import from CVS: tag r20-3b9
author cvs
date Mon, 13 Aug 2007 09:44:42 +0200
parents 131b0175ea99
children
line wrap: on
line diff
--- a/lisp/mule/ethiopic.el	Mon Aug 13 09:43:39 2007 +0200
+++ b/lisp/mule/ethiopic.el	Mon Aug 13 09:44:42 2007 +0200
@@ -1,1093 +0,0 @@
-;; Ethiopic language utilities for Mule
-;; Copyright (C) 1994, 1995 Free Software Foundation, Inc.
-
-;; This file is part of XEmacs.
-;; This file contains Ethiopic characters.
-
-;; XEmacs is free software; you can redistribute it and/or modify it
-;; under the terms of the GNU General Public License as published by
-;; the Free Software Foundation; either version 2, or (at your option)
-;; any later version.
-
-;; XEmacs is distributed in the hope that it will be useful, but
-;; WITHOUT ANY WARRANTY; without even the implied warranty of
-;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
-;; General Public License for more details.
-
-;; You should have received a copy of the GNU General Public License
-;; along with XEmacs; see the file COPYING.  If not, write to the 
-;; Free Software Foundation, Inc., 59 Temple Place - Suite 330,
-;; Boston, MA 02111-1307, USA.
-
-;;; 94.10.13 created for Mule Ver.2.1 by TAKAHASHI Naoto <ntakahas@etl.go.jp>
-;;; 94.12.27 modified for Mule Ver.2.2 by TAKAHASHI Naoto <ntakahas@etl.go.jp>
-;;; 95.7.24 modified for Mule Ver.2.3 by TAKAHASHI Naoto <ntakahas@etl.go.jp>
-
-;;
-;; ETHIOPIC UTILITY FUNCTIONS
-;;
-
-;; To automatically convert Ethiopic text to SERA format when sending mail,
-;;   (add-hook 'mail-send-hook 'fidel-to-sera-mail)
-;;
-;; To automatically convert SERA format to Ethiopic when receiving mail,
-;;   (add-hook 'rmail-show-message-hook 'sera-to-fidel-mail)
-;;
-;; To automatically convert Ethiopic text to SERA format when posting news,
-;;   (add-hook 'news-inews-hook 'fidel-to-sera-mail)
-;;
-;; If the filename ends in ".sera", editing will be done in fidel
-;; while file I/O will be done in sera.
-;;
-;; The following two functions have been removed.
-;;   fidel-to-sera-for-disksave
-;;   sera-to-fidel-for-disksave
-
-;;
-;; SERA to FIDEL
-;;
-   
-(defconst sera-to-fidel-table
-  [
-   nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil
-   nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil
-;;; SP  !   "   #   $   %   &   '    (   )   *   +    ,     -    .     /
-   nil nil nil nil nil nil nil ("") nil nil nil nil ("$(2$Q(B") nil ("$(2$P(B") nil
-;;; 0   1   2   3   4   5   6   7   8   9    :      ;     <   =   >   ?   @
-   nil nil nil nil nil nil nil nil nil nil ("$(2$S(B") ("$(2$R(B") nil nil nil nil nil
-;;; A
-   ("$(2"V(B" (?2 "$(2#b(B"))
-;;; B
-   ("$(2!F(B" (?e "$(2!A(B") (?u "$(2!B(B") (?i "$(2!C(B") (?a "$(2!D(B") (?E "$(2!E(B") (?o "$(2!G(B") (?| "$(2!F(B")
-         (?W "$(2!H(B" (?a "$(2!H(B")
-	          (?e "$(2!F#L(B") (?u "$(2!F#M(B") (?i "$(2!F#N(B") (?E "$(2!F#P(B") (?' "$(2!F#M(B")))
-;;; C
-   ("$(2"8(B" (?e "$(2"3(B") (?u "$(2"4(B") (?i "$(2"5(B") (?a "$(2"6(B") (?E "$(2"7(B") (?o "$(2"9(B") (?| "$(2"8(B")
-         (?W "$(2":(B" (?a "$(2":(B")
-	          (?e "$(2"8#L(B") (?u "$(2"8#M(B") (?i "$(2"8#N(B") (?E "$(2"8#P(B") (?' "$(2"8#M(B")))
-;;; D
-   ("$(2$0(B" (?e "$(2$+(B") (?u "$(2$,(B") (?i "$(2$-(B") (?a "$(2$.(B") (?E "$(2$/(B") (?o "$(2$1(B") (?| "$(2$0(B"))
-;;; E
-   ("$(2"W(B" (?2 "$(2#c(B"))
-;;; F
-   ("$(2"@(B" (?e "$(2";(B") (?u "$(2"<(B") (?i "$(2"=(B") (?a "$(2">(B") (?E "$(2"?(B") (?o "$(2"A(B") (?| "$(2"@(B")
-         (?W "$(2"B(B" (?a "$(2"B(B")
-	          (?e "$(2"@#L(B") (?u "$(2"@#M(B") (?i "$(2"@#N(B") (?E "$(2"@#P(B") (?' "$(2"@#M(B")))
-;;; G
-   ("$(2$>(B" (?e "$(2$9(B") (?u "$(2$:(B") (?i "$(2$;(B") (?a "$(2$<(B") (?E "$(2$=(B") (?o "$(2$?(B") (?| "$(2$>(B"))
-;;; H
-   ("$(2$"(B" (?e "$(2#{(B") (?u "$(2#|(B") (?i "$(2#}(B") (?a "$(2#~(B") (?E "$(2$!(B") (?o "$(2$#(B") (?| "$(2$"(B"))
-;;; I
-   ("$(2"X(B" (?2 "$(2#d(B"))
-;;; J
-   ("$(2$7(B" (?e "$(2$2(B") (?u "$(2$3(B") (?i "$(2$4(B") (?a "$(2$5(B") (?E "$(2$6(B") (?o "$(2$8(B") (?| "$(2$7(B"))
-;;; K
-   ("$(2"x(B" (?e "$(2"s(B") (?u "$(2"t(B") (?i "$(2"u(B") (?a "$(2"v(B") (?E "$(2"w(B") (?o "$(2"y(B") (?| "$(2"x(B")
-         (?W "$(2"{(B" (?e "$(2"z(B") (?u "$(2"{(B") (?i "$(2"|(B") (?a "$(2"}(B") (?E "$(2"~(B")))
-;;; L
-   ("$(2!&(B" (?e "$(2!!(B") (?u "$(2!"(B") (?i "$(2!#(B") (?a "$(2!$(B") (?E "$(2!%(B") (?o "$(2!'(B") (?| "$(2!&(B")
-         (?W "$(2!((B" (?a "$(2!((B")
-                  (?e "$(2!&#L(B") (?u "$(2!&#M(B") (?i "$(2!&#N(B") (?E "$(2!&#P(B") (?' "$(2!&#M(B")))
-;;; M
-   ("$(2!.(B" (?e "$(2!)(B") (?u "$(2!*(B") (?i "$(2!+(B") (?a "$(2!,(B") (?E "$(2!-(B") (?o "$(2!/(B") (?| "$(2!.(B")
-         (?W "$(2!0(B" (?a "$(2!0(B")
-	          (?e "$(2!.#L(B") (?u "$(2!.#M(B") (?i "$(2!.#N(B") (?E "$(2!.#P(B") (?' "$(2!.#M(B")))
-;;; N
-   ("$(2!n(B" (?e "$(2!i(B") (?u "$(2!j(B") (?i "$(2!k(B") (?a "$(2!l(B") (?E "$(2!m(B") (?o "$(2!o(B") (?| "$(2!n(B")
-         (?W "$(2!p(B" (?a "$(2!p(B")
-	          (?e "$(2!n#L(B") (?u "$(2!n#M(B") (?i "$(2!n#N(B") (?E "$(2!n#P(B") (?' "$(2!n#M(B")))
-;;; O
-   ("$(2"Y(B" (?2 "$(2#e(B"))
-;;; P
-   ("$(2$E(B" (?e "$(2$@(B") (?u "$(2$A(B") (?i "$(2$B(B") (?a "$(2$C(B") (?E "$(2$D(B") (?o "$(2$F(B") (?| "$(2$E(B"))
-;;; Q
-   ("$(2#2(B" (?e "$(2#-(B") (?u "$(2#.(B") (?i "$(2#/(B") (?a "$(2#0(B") (?E "$(2#1(B") (?o "$(2#3(B") (?| "$(2#2(B")
-         (?W "$(2#5(B" (?e "$(2#4(B") (?u "$(2#5(B") (?i "$(2#6(B") (?a "$(2#7(B") (?E "$(2#8(B")))
-;;; R
-   ("$(2!6(B" (?e "$(2!1(B") (?u "$(2!2(B") (?i "$(2!3(B") (?a "$(2!4(B") (?E "$(2!5(B") (?o "$(2!7(B") (?| "$(2!6(B")
-         (?W "$(2!8(B" (?a "$(2!8(B")
-	          (?e "$(2!6#L(B") (?u "$(2!6#M(B") (?i "$(2!6#N(B") (?E "$(2!6#P(B") (?' "$(2!6#M(B")))
-;;; S
-   ("$(2"P(B" (?e "$(2"K(B") (?u "$(2"L(B") (?i "$(2"M(B") (?a "$(2"N(B") (?E "$(2"O(B") (?o "$(2"Q(B") (?| "$(2"P(B")
-         (?W "$(2"R(B" (?a "$(2"R(B")
-                  (?e "$(2"P#L(B") (?u "$(2"P#M(B") (?i "$(2"P#N(B") (?E "$(2"P#P(B") (?' "$(2"P#M(B"))
-	 (?2 "$(2#](B" (?| "$(2#](B")
-	     (?e "$(2#X(B") (?u "$(2#Y(B") (?i "$(2#Z(B") (?a "$(2#[(B") (?E "$(2#\(B") (?o "$(2#^(B")
-	     (?W "$(2"R(B"
-		 (?a "$(2"R(B")
-		 (?e "$(2#]#L(B") (?u "$(2#]#M(B") (?i "$(2#]#N(B") (?E "$(2#]#P(B") (?' "$(2#]#M(B"))))
-		
-;;; T
-   ("$(2"0(B" (?e "$(2"+(B") (?u "$(2",(B") (?i "$(2"-(B") (?a "$(2".(B") (?E "$(2"/(B") (?o "$(2"1(B") (?| "$(2"0(B")
-         (?W "$(2"2(B" (?a "$(2"2(B")
-	          (?e "$(2"0#L(B") (?u "$(2"0#M(B") (?i "$(2"0#N(B") (?E "$(2"0#P(B") (?' "$(2"0#M(B")))
-;;; U
-   ("$(2"T(B" (?2 "$(2#`(B"))
-;;; V
-   ("$(2!N(B" (?e "$(2!I(B") (?u "$(2!J(B") (?i "$(2!K(B") (?a "$(2!L(B") (?E "$(2!M(B") (?o "$(2!O(B") (?| "$(2!N(B")
-         (?W "$(2!P(B" (?a "$(2!P(B")
-	          (?e "$(2!N#L(B") (?u "$(2!N#M(B") (?i "$(2!N#N(B") (?E "$(2!N#P(B") (?' "$(2!N#M(B")))
-;;; W
-   ("$(2#M(B" (?e "$(2#L(B") (?u "$(2#M(B") (?i "$(2#N(B") (?a "$(2#O(B") (?E "$(2#P(B"))
-;;; X
-   ("$(2#y(B" (?e "$(2#t(B") (?u "$(2#u(B") (?i "$(2#v(B") (?a "$(2#w(B") (?E "$(2#x(B") (?o "$(2#z(B") (?| "$(2#y(B"))
-;;; Y
-   ("$(2$)(B" (?e "$(2$$(B") (?u "$(2$%(B") (?i "$(2$&(B") (?a "$(2$'(B") (?E "$(2$((B") (?o "$(2$*(B") (?| "$(2$)(B"))
-;;; Z
-   ("$(2!~(B" (?e "$(2!y(B") (?u "$(2!z(B") (?i "$(2!{(B") (?a "$(2!|(B") (?E "$(2!}(B") (?o "$(2"!(B") (?| "$(2!~(B")
-         (?W "$(2""(B" (?a "$(2""(B")
-	          (?e "$(2!~#L(B") (?u "$(2!~#M(B") (?i "$(2!~#N(B") (?E "$(2!~#P(B") (?' "$(2!~#M(B")))
-;;; [   \   ]   ^   _
-   nil nil nil nil nil
-;;; `
-   ("`"
-    (?e "$(2#_(B") (?u "$(2#`(B") (?U "$(2#`(B") (?i "$(2#a(B") (?a "$(2#b(B") (?A "$(2#b(B")
-    (?E "$(2#c(B") (?I "$(2#d(B") (?o "$(2#e(B") (?O "$(2#e(B")
-    (?s "$(2#V(B"
-	(?e "$(2#Q(B") (?u "$(2#R(B") (?i "$(2#S(B") (?a "$(2#T(B") (?E "$(2#U(B") (?o "$(2#W(B") (?| "$(2#V(B")
-	(?W "$(2"J(B" (?a "$(2"J(B")
-	         (?e "$(2#V#L(B") (?u "$(2#V#M(B") (?i "$(2#V#N(B") (?E "$(2#V#P(B") (?' "$(2#V#M(B")))
-    (?S "$(2#](B"
-	(?e "$(2#X(B") (?u "$(2#Y(B") (?i "$(2#Z(B") (?a "$(2#[(B") (?E "$(2#\(B") (?o "$(2#^(B") (?| "$(2#](B")
-	(?W "$(2"R(B" (?a "$(2"R(B")
-	         (?e "$(2#]#L(B") (?u "$(2#]#M(B") (?i "$(2#]#N(B") (?E "$(2#]#P(B") (?' "$(2#]#M(B")))
-    (?h "$(2#k(B"
-	(?e "$(2#f(B") (?u "$(2#g(B") (?i "$(2#h(B") (?a "$(2#i(B") (?E "$(2#j(B") (?o "$(2#l(B") (?| "$(2#k(B")
-        (?W "$(2"c(B" (?e "$(2"b(B") (?u "$(2"c(B") (?i "$(2"d(B") (?a "$(2"e(B") (?E "$(2"f(B")))
-    (?k "$(2#r(B"
-        (?e "$(2#m(B") (?u "$(2#n(B") (?i "$(2#o(B") (?a "$(2#p(B") (?E "$(2#q(B") (?o "$(2#s(B") (?| "$(2#r(B")))
-;;; a
-   ("$(2"S(B" (?2 "$(2#b(B"))
-
-;;; b
-   ("$(2!F(B" (?e "$(2!A(B") (?u "$(2!B(B") (?i "$(2!C(B") (?a "$(2!D(B") (?E "$(2!E(B") (?o "$(2!G(B") (?| "$(2!F(B")
-         (?W "$(2!H(B" (?a "$(2!H(B")
-	          (?e "$(2!F#L(B") (?u "$(2!F#M(B") (?i "$(2!F#N(B") (?E "$(2!F#P(B") (?' "$(2!F#M(B")))
-;;; c
-   ("$(2!^(B" (?e "$(2!Y(B") (?u "$(2!Z(B") (?i "$(2![(B") (?a "$(2!\(B") (?E "$(2!](B") (?o "$(2!_(B") (?| "$(2!^(B")
-         (?W "$(2!`(B" (?a "$(2!`(B")
-	          (?e "$(2!^#L(B") (?u "$(2!^#M(B") (?i "$(2!^#N(B") (?E "$(2!^#P(B") (?' "$(2!^#M(B")))
-;;; d
-   ("$(2"((B" (?e "$(2"#(B") (?u "$(2"$(B") (?i "$(2"%(B") (?a "$(2"&(B") (?E "$(2"'(B") (?o "$(2")(B") (?| "$(2"((B")
-         (?W "$(2"*(B" (?a "$(2"*(B")
-	          (?e "$(2"(#L(B") (?u "$(2"(#M(B") (?i "$(2"(#N(B") (?E "$(2"(#P(B") (?' "$(2"(#M(B")))
-;;; e
-   ("$(2"S(B" (?2 "$(2#_(B") (?3 "$(2"Z(B"))
-;;; f
-   ("$(2"@(B" (?e "$(2";(B") (?u "$(2"<(B") (?i "$(2"=(B") (?a "$(2">(B") (?E "$(2"?(B") (?o "$(2"A(B") (?| "$(2"@(B")
-         (?W "$(2"B(B" (?a "$(2"B(B")
-	          (?e "$(2"@#L(B") (?u "$(2"@#M(B") (?i "$(2"@#N(B") (?E "$(2"@#P(B") (?' "$(2"@#M(B")))
-;;; g
-   ("$(2#>(B" (?e "$(2#9(B") (?u "$(2#:(B") (?i "$(2#;(B") (?a "$(2#<(B") (?E "$(2#=(B") (?o "$(2#?(B") (?| "$(2#>(B")
-         (?W "$(2#A(B" (?e "$(2#@(B") (?u "$(2#A(B") (?i "$(2#B(B") (?a "$(2#C(B") (?E "$(2#D(B")))
-;;; h
-   ("$(2"`(B" (?e "$(2"[(B") (?u "$(2"\(B") (?i "$(2"](B") (?a "$(2"^(B") (?E "$(2"_(B") (?o "$(2"a(B") (?| "$(2"`(B")
-         (?W "$(2"c(B" (?e "$(2"b(B") (?u "$(2"c(B") (?i "$(2"d(B") (?a "$(2"e(B") (?E "$(2"f(B"))
-	 (?2 "$(2#k(B" (?e "$(2#f(B") (?u "$(2#g(B") (?i "$(2#h(B") (?a "$(2#i(B") (?E "$(2#j(B") (?o "$(2#l(B")
-	          (?| "$(2#k(B")
-	          (?W "$(2"c(B" (?e "$(2"b(B") (?u "$(2"c(B") (?i "$(2"d(B") (?a "$(2"e(B") (?E "$(2"f(B"))))
-;;; i
-   ("$(2"U(B" (?2 "$(2#a(B"))
-;;; j
-   ("$(2$7(B" (?e "$(2$2(B") (?u "$(2$3(B") (?i "$(2$4(B") (?a "$(2$5(B") (?E "$(2$6(B") (?o "$(2$8(B") (?| "$(2$7(B"))
-;;; k
-   ("$(2"l(B" (?e "$(2"g(B") (?u "$(2"h(B") (?i "$(2"i(B") (?a "$(2"j(B") (?E "$(2"k(B") (?o "$(2"m(B") (?| "$(2"l(B")
-         (?W "$(2"o(B" (?e "$(2"n(B") (?u "$(2"o(B") (?i "$(2"p(B") (?a "$(2"q(B") (?E "$(2"r(B"))
-	 (?2 "$(2#r(B" (?e "$(2#m(B") (?u "$(2#n(B") (?i "$(2#o(B") (?a "$(2#p(B") (?E "$(2#q(B") (?o "$(2#s(B")
-	          (?| "$(2#r(B")))
-;;; l
-   ("$(2!&(B" (?e "$(2!!(B") (?u "$(2!"(B") (?i "$(2!#(B") (?a "$(2!$(B") (?E "$(2!%(B") (?o "$(2!'(B") (?| "$(2!&(B")
-         (?W "$(2!((B" (?a "$(2!((B")
-                  (?e "$(2!&#L(B") (?u "$(2!&#M(B") (?i "$(2!&#N(B") (?E "$(2!&#P(B") (?' "$(2!&#M(B")))
-;;; m
-   ("$(2!.(B" (?e "$(2!)(B") (?u "$(2!*(B") (?i "$(2!+(B") (?a "$(2!,(B") (?E "$(2!-(B") (?o "$(2!/(B") (?| "$(2!.(B")
-         (?W "$(2!0(B" (?a "$(2!0(B")
-	          (?e "$(2!.#L(B") (?u "$(2!.#M(B") (?i "$(2!.#N(B") (?E "$(2!.#P(B") (?' "$(2!.#M(B")))
-;;; n
-   ("$(2!f(B" (?e "$(2!a(B") (?u "$(2!b(B") (?i "$(2!c(B") (?a "$(2!d(B") (?E "$(2!e(B") (?o "$(2!g(B") (?| "$(2!f(B")
-         (?W "$(2!h(B" (?a "$(2!h(B")
-	          (?e "$(2!f#L(B") (?u "$(2!f#M(B") (?i "$(2!f#N(B") (?E "$(2!f#P(B") (?' "$(2!f#M(B")))
-;;; o
-   ("$(2"Y(B" (?2 "$(2#e(B"))
-;;; p
-   ("$(2$L(B" (?e "$(2$G(B") (?u "$(2$H(B") (?i "$(2$I(B") (?a "$(2$J(B") (?E "$(2$K(B") (?o "$(2$M(B") (?| "$(2$L(B"))
-;;; q
-   ("$(2#&(B" (?e "$(2#!(B") (?u "$(2#"(B") (?i "$(2##(B") (?a "$(2#$(B") (?E "$(2#%(B") (?o "$(2#'(B") (?| "$(2#&(B")
-         (?W "$(2#)(B" (?e "$(2#((B") (?u "$(2#)(B") (?i "$(2#*(B") (?a "$(2#+(B") (?E "$(2#,(B")))
-;;; r
-   ("$(2!6(B" (?e "$(2!1(B") (?u "$(2!2(B") (?i "$(2!3(B") (?a "$(2!4(B") (?E "$(2!5(B") (?o "$(2!7(B") (?| "$(2!6(B")
-         (?W "$(2!8(B" (?a "$(2!8(B")
-	          (?e "$(2!6#L(B") (?u "$(2!6#M(B") (?i "$(2!6#N(B") (?E "$(2!6#P(B") (?' "$(2!6#M(B")))
-;;; s
-   ("$(2"H(B" (?e "$(2"C(B") (?u "$(2"D(B") (?i "$(2"E(B") (?a "$(2"F(B") (?E "$(2"G(B") (?o "$(2"I(B") (?| "$(2"H(B")
-         (?W "$(2"J(B" (?a "$(2"J(B")
-	          (?e "$(2"H#L(B") (?u "$(2"H#M(B") (?i "$(2"H#N(B") (?E "$(2"H#P(B") (?' "$(2"H#M(B"))
-	 (?2 "$(2#V(B" (?e "$(2#Q(B") (?u "$(2#R(B") (?i "$(2#S(B") (?a "$(2#T(B") (?E "$(2#U(B") (?o "$(2#W(B")
-	          (?| "$(2#V(B")
-		  (?W "$(2"J(B" (?a "$(2"J(B")
-		           (?e "$(2#V#L(B") (?u "$(2#V#M(B") (?i "$(2#V#N(B") (?E "$(2#V#P(B")
-			   (?' "$(2#V#M(B"))))
-;;; t
-   ("$(2!V(B" (?e "$(2!Q(B") (?u "$(2!R(B") (?i "$(2!S(B") (?a "$(2!T(B") (?E "$(2!U(B") (?o "$(2!W(B") (?| "$(2!V(B")
-         (?W "$(2!X(B" (?a "$(2!X(B")
-	          (?e "$(2!V#L(B") (?u "$(2!V#M(B") (?i "$(2!V#N(B") (?E "$(2!V#P(B") (?' "$(2!V#M(B")))
-;;; u
-   ("$(2"T(B" (?2 "$(2#`(B"))
-;;; v
-   ("$(2!N(B" (?e "$(2!I(B") (?u "$(2!J(B") (?i "$(2!K(B") (?a "$(2!L(B") (?E "$(2!M(B") (?o "$(2!O(B") (?| "$(2!N(B")
-         (?W "$(2!P(B" (?a "$(2!P(B")
-	          (?e "$(2!N#L(B") (?u "$(2!N#M(B") (?i "$(2!N#N(B") (?E "$(2!N#P(B") (?' "$(2!N#M(B")))
-;;; w
-   ("$(2#J(B" (?e "$(2#E(B") (?u "$(2#F(B") (?i "$(2#G(B") (?a "$(2#H(B") (?E "$(2#I(B") (?o "$(2#K(B") (?| "$(2#J(B")
-         (?W "$(2#M(B" (?e "$(2#L(B") (?u "$(2#M(B") (?i "$(2#N(B") (?a "$(2#O(B") (?E "$(2#P(B")))
-;;; x
-   ("$(2!>(B" (?e "$(2!9(B") (?u "$(2!:(B") (?i "$(2!;(B") (?a "$(2!<(B") (?E "$(2!=(B") (?o "$(2!?(B") (?| "$(2!>(B")
-         (?W "$(2!@(B" (?a "$(2!@(B")
-	          (?e "$(2!>#L(B") (?u "$(2!>#M(B") (?i "$(2!>#N(B") (?E "$(2!>#P(B") (?' "$(2!>#M(B")))
-;;; y
-   ("$(2$)(B" (?e "$(2$$(B") (?u "$(2$%(B") (?i "$(2$&(B") (?a "$(2$'(B") (?E "$(2$((B") (?o "$(2$*(B") (?| "$(2$)(B"))
-;;; z
-   ("$(2!v(B" (?e "$(2!q(B") (?u "$(2!r(B") (?i "$(2!s(B") (?a "$(2!t(B") (?E "$(2!u(B") (?o "$(2!w(B") (?| "$(2!v(B")
-         (?W "$(2!x(B" (?a "$(2!x(B")
-	          (?e "$(2!v#L(B") (?u "$(2!v#M(B") (?i "$(2!v#N(B") (?E "$(2!v#P(B") (?' "$(2!v#M(B")))
-   ])
-
-;;;###autoload
-(defun sera-to-fidel-region (beg end &optional ascii-mode force)
-  "Translates the characters in region from SERA to FIDEL.
-
-If the 1st optional parameter ASCII-MODE is non-NIL, assumes that the
-region begins in ASCII script.
-
-If the 2nd optional parametr FORCE is non-NIL, translates even if the
-buffer is read-only."
-
-  (interactive "r\nP")
-  (save-excursion
-    (save-restriction
-      (narrow-to-region beg end)
-      (sera-to-fidel-buffer ascii-mode force))))
-
-;;;###autoload
-(defun sera-to-fidel-buffer (&optional ascii-mode force)
-  "Translates the current buffer from SERA to FIDEL.
-
-If the 1st optional parameter ASCII-MODE is non-NIL, assumes that the
-current buffer begins in ASCII script.
-
-If the 2nd optional panametr FORCE is non-NIL, translates even if the
-buffer is read-only."
-
-  (interactive "P")
-  (if (and buffer-read-only
-	   (not force)
-	   (not (y-or-n-p "Buffer is read-only.  Force to convert? ")))
-      (error ""))
-  (let (start pre fol hard table table2 (buffer-read-only nil))
-    (goto-char (point-min))
-    (while (not (eobp))
-      (setq start (point))
-      (forward-char 1)
-      (setq pre (preceding-char)
-	    fol (following-char))
-
-      (if ascii-mode
-	  (cond
-
-	   ;; ascii mode, pre != \ 
-	   ((/= pre ?\\ ))
-
-	   ;; ascii mode, pre = \, fol = !
-	   ((= fol ?!)
-	    (backward-delete-char 1)
-	    (delete-char 1)
-	    (setq ascii-mode nil
-		  hard (not hard)))
-
-	   ;; hard ascii mode, pre = \, fol != !
-	   (hard)
-
-	   ;; soft ascii mode, pre = \, fol = {\ _ * < > 0..9 ~}
-	   ((or (backward-delete-char 1) ; always nil
-		(eobp)
-		(sera-to-fidel-backslash)))
-
-	   ;; soft ascii mode, pre = \, fol = SPC
-	   ((= fol 32)
-	    (delete-char 1)
-	    (setq ascii-mode nil))
-
-	   ;; soft ascii mode, pre = \, fol = .
-	   ((= fol ?.)
-	    (delete-char 1)
-	    (insert ?$(2$P(B))
-
-	   ;; soft ascii mode, pre = \, fol = ,
-	   ((= fol ?,)
-	    (delete-char 1)
-	    (insert ?$(2$Q(B))
-
-	   ;; soft ascii mode, pre = \, fol = ;
-	   ((= fol ?\;)
-	    (delete-char 1)
-	    (insert ?$(2$R(B))
-
-	   ;; soft ascii mode, pre = \, fol = :
-	   ((= fol ?:)
-	    (delete-char 1)
-	    (insert ?$(2$S(B))
-
-	   ;; soft ascii mode, pre = \, fol = others
-	   (t
-	    (setq ascii-mode nil)))
-
-	(cond
-
-	 ;; very special: skip "<" to ">" (or "&" to ";") if in w3-mode
-	 ((and (boundp 'sera-being-called-by-w3)
-	       sera-being-called-by-w3
-	       (or (= pre ?<) (= pre ?&)))
-	  (search-forward (if (= pre ?<) ">" ";")
-			  nil 0))
-
-	 ;; ethio mode, pre != sera
-	 ((or (< pre ?') (> pre ?z)))
-
-	 ;; ethio mode, pre != \ 
-	 ((/= pre ?\\ )
-	  (setq table (aref sera-to-fidel-table pre))
-	  (while (setq table2 (cdr (assoc (following-char) table)))
-	    (setq table table2)
-	    (forward-char 1))
-	  (if (car table)
-	      (progn
-		(delete-region start (point))
-		(insert (car table)))))
-
-	 ;; ethio mode, pre = \, fol = !
-	 ((= fol ?!)
-	  (backward-delete-char 1)
-	  (delete-char 1)
-	  (setq ascii-mode t
-		hard (not hard)))
-
-	 ;; hard ethio mode, pre = \, fol != !
-	 (hard)
-
-	 ;; soft ethio mode, pre = \, fol = {\ _ * < > 0..9 ~}
-	 ((or (backward-delete-char 1)	; always nil
-	      (eobp)
-	      (sera-to-fidel-backslash)))
-
-	 ;; soft ethio mode, pre = \, fol = SPC
-	 ((= fol 32)
-	  (delete-char 1)
-	  (setq ascii-mode t))
-
-	 ;; soft ethio mode, pre = \, fol = {. , ; : | ' `}
-	 ((memq fol '(?. ?, ?\; ?: ?| ?' ?`))
-	  (forward-char 1))
-
-	 ;; soft ethio mode, pre = \, fol = others
-	 (t
-	  (setq ascii-mode t))))))
-  (goto-char (point-min)))
-
-(defun sera-to-fidel-backslash nil
-  "Handle SERA backslash escapes common to ethio- and ascii-mode.
-Returns t if something has been processed."
-  (let ((ch (following-char))
-	(converted t))
-    (if (and (>= ch ?1) (<= ch ?9))
-	(ethio-convert-digit)
-      (delete-char 1)
-      (cond
-       ((= ch ?\\ )
-	(insert ?\\ ))
-       ((= ch ?_)
-	(insert ?$(2$O(B))
-       ((= ch ?*)
-	(insert ?$(2$T(B))
-       ((= ch ?<)
-	(insert ?$(2$U(B))
-       ((= ch ?>)
-	(insert ?$(2$V(B))
-       ((= ch ?~)
-	(setq ch (following-char))
-	(delete-char 1)
-	(cond
-	 ((= ch ?e)
-	  (insert "$(2$k(B"))
-	 ((= ch ?E)
-	  (insert "$(2$l(B"))
-	 ((= ch ?a)
-	  (insert "$(2$m(B"))
-	 ((= ch ?A)
-	  (insert "$(2$n(B"))))
-       (t
-	(insert ch)
-	(backward-char 1)
-	(setq converted nil))))
-    converted))
-
-(defun ethio-convert-digit nil
-  "Convert Arabic digits to Ethiopic digits."
-  (let (ch z)
-    (while (and (>= (setq ch (following-char)) ?1)
-		(<= ch ?9))
-      (delete-char 1)
-
-      ;; count up following zeros
-      (setq z 0)
-      (while (= (following-char) ?0)
-	(delete-char 1)
-	(setq z (1+ z)))
-
-      (cond
-
-       ;; first digit is 10, 20, ..., or 90
-       ((= (mod z 2) 1)
-	;; (- ch 40) means ?1 -> 9, ?2 -> 10, etc.
-	(insert (aref [?$(2$`(B ?$(2$a(B ?$(2$b(B ?$(2$c(B ?$(2$d(B ?$(2$e(B ?$(2$f(B ?$(2$g(B ?$(2$h(B] (- ch ?1)))
-	(setq z (1- z)))
-
-       ;; first digit is 2, 3, ..., or 9
-       ((/= ch ?1)
-	(insert (aref [?$(2$X(B ?$(2$Y(B ?$(2$Z(B ?$(2$[(B ?$(2$\(B ?$(2$](B ?$(2$^(B ?$(2$_(B] (- ch ?2))))
-
-       ;; single 1
-       ((= z 0)
-	(insert "$(2$W(B")))
-
-      ;; 100
-      (if (= (mod z 4) 2)
-	  (insert"$(2$i(B"))
-
-      ;; 10000
-      (insert-char ?$(2$j(B (/ z 4)))))
-
-;;;###autoload
-(defun sera-to-fidel-mail (&optional arg)
-  "Does SERA to FIDEL conversion for reading/writing mail and news.
-
-If the buffer contains the markers \"<sera>\" and \"</sera>\",
-converts the segment between the two markers in Ethio start mode and
-the subject field in ASCII start mode.
-
-If invoked interactively and there is no marker, converts both the
-whole body and the subject field in Ethio start mode.
-
-For backward compatibility, \"<ethiopic>\" and \"<>\" can be used instead of
-\"<sera>\" and \"</sera>\"."
-
-  (interactive "p")
-  (let* ((buffer-read-only nil) border)
-
-    (save-excursion
-      (goto-char (point-min))
-      (setq border
-	    (search-forward
-	     (if (eq major-mode 'rmail-mode)
-		 "\n\n"
-	       (concat "\n" mail-header-separator "\n"))))
-
-      (cond
-
-       ;; with markers
-       ((re-search-forward "^<sera>\n" nil t)
-	(goto-char (match-beginning 0))
-	(while (re-search-forward "^<sera>\n" nil t)
-	  (replace-match "" nil t)
-	  (sera-to-fidel-region
-	   (point)
-	   (progn
-	     (if (re-search-forward "^</sera>\n" nil 0)
-		 (replace-match "" nil t))
-	     (point))))
-
-	(goto-char (point-min))
-	(if (re-search-forward "^Subject: " border t)
-	    (sera-to-fidel-region
-	     (point)
-	     (progn (end-of-line) (point))
-	     'ascii-start)))
-
-       ;; backward compatibility
-       ((re-search-forward "^<ethiopic>\n" nil t)
-	(goto-char (match-beginning 0))
-	(while (re-search-forward "^<ethiopic>\n" nil t)
-	  (replace-match "" nil t)
-	  (sera-to-fidel-region
-	   (setq border (point))
-	   (progn
-	     (if (re-search-forward "^<>\n" nil 0)
-		 (replace-match "" nil t))
-	     (point))))
-
-	(goto-char (point-min))
-	(if (re-search-forward "^Subject: " border t)
-	    (sera-to-fidel-region
-	     (point)
-	     (progn (end-of-line) (point))
-	     'ascii-start)))
-
-       ;; interactive & no markers
-       (arg
-	(sera-to-fidel-region border (point-max))
-	(goto-char (point-min))
-	(if (re-search-forward "^Subject: " border t)
-	    (sera-to-fidel-region
-	     (point)
-	     (progn (end-of-line) (point))))))
-
-      ;; adjust the rmail marker
-      (if (eq major-mode 'rmail-mode)
-	  (set-marker
-	   (aref rmail-message-vector (1+ rmail-current-message))
-	   (point-max))))))
-
-;;;###autoload
-(defun sera-to-fidel-marker nil
-  "If the buffer contains the markers \"<sera>\" and \"</sera>\",
-converts the segment between the two markers from SERA to Fidel
-in Ethio start mode.  The markers will not be removed."
-
-  (interactive)
-  (if (and buffer-read-only
-	   (not (y-or-n-p "Buffer is read-only.  Force to convert? ")))
-      (error ""))
-  (save-excursion
-    (goto-char (point-min))
-    (while (re-search-forward "<sera>" nil t)
-      (sera-to-fidel-region
-       (point)
-       (if (re-search-forward "</sera>" nil t)
-	   (match-beginning 0)
-	 (point-max))
-       nil
-       'force))))
-
-;;
-;; FIDEL to SERA
-;;
-
-(defconst fidel-to-sera-map
-  ["le" "lu" "li" "la" "lE" "l" "lo" "lWa"
-   "me" "mu" "mi" "ma" "mE" "m" "mo" "mWa"
-   "re" "ru" "ri" "ra" "rE" "r" "ro" "rWa"
-   "xe" "xu" "xi" "xa" "xE" "x" "xo" "xWa"
-   "be" "bu" "bi" "ba" "bE" "b" "bo" "bWa"
-   "ve" "vu" "vi" "va" "vE" "v" "vo" "vWa"
-   "te" "tu" "ti" "ta" "tE" "t" "to" "tWa"
-   "ce" "cu" "ci" "ca" "cE" "c" "co" "cWa"
-   "ne" "nu" "ni" "na" "nE" "n" "no" "nWa"
-   "Ne" "Nu" "Ni" "Na" "NE" "N" "No" "NWa"
-   "ze" "zu" "zi" "za" "zE" "z" "zo" "zWa"
-   "Ze" "Zu" "Zi" "Za" "ZE" "Z" "Zo" "ZWa"
-   "de" "du" "di" "da" "dE" "d" "do" "dWa"
-   "Te" "Tu" "Ti" "Ta" "TE" "T" "To" "TWa"
-   "Ce" "Cu" "Ci" "Ca" "CE" "C" "Co" "CWa"
-   "fe" "fu" "fi" "fa" "fE" "f" "fo" "fWa"
-   "se" "su" "si" "sa" "sE" "s" "so" "sWa"
-   "Se" "Su" "Si" "Sa" "SE" "S" "So" "SWa"
-   "a"  "u"  "i"  "A"  "E"  "I" "o"  "e3"
-   "he" "hu" "hi" "ha" "hE" "h" "ho" "hWe" "hWu" "hWi" "hWa" "hWE"
-   "ke" "ku" "ki" "ka" "kE" "k" "ko" "kWe" "kWu" "kWi" "kWa" "kWE"
-   "Ke" "Ku" "Ki" "Ka" "KE" "K" "Ko" "KWe" "KWu" "KWi" "KWa" "KWE"
-   "qe" "qu" "qi" "qa" "qE" "q" "qo" "qWe" "qWu" "qWi" "qWa" "qWE"
-   "Qe" "Qu" "Qi" "Qa" "QE" "Q" "Qo" "QWe" "QWu" "QWi" "QWa" "QWE"
-   "ge" "gu" "gi" "ga" "gE" "g" "go" "gWe" "gWu" "gWi" "gWa" "gWE"
-   "we" "wu" "wi" "wa" "wE" "w" "wo" "wWe" "wWu" "wWi" "wWa" "wWE"
-   "`se" "`su" "`si" "`sa" "`sE" "`s" "`so"
-   "`Se" "`Su" "`Si" "`Sa" "`SE" "`S" "`So"
-   "`e"  "`u"  "`i"  "`a"  "`E"  "`I" "`o"
-   "`he" "`hu" "`hi" "`ha" "`hE" "`h" "`ho"
-   "`ke" "`ku" "`ki" "`ka" "`kE" "`k" "`ko"
-   "Xe" "Xu" "Xi" "Xa" "XE" "X" "Xo"
-   "He" "Hu" "Hi" "Ha" "HE" "H" "Ho"
-   "ye" "yu" "yi" "ya" "yE" "y" "yo"
-   "De" "Du" "Di" "Da" "DE" "D" "Do"
-   "je" "ju" "ji" "ja" "jE" "j" "jo"
-   "Ge" "Gu" "Gi" "Ga" "GE" "G" "Go"
-   "Pe" "Pu" "Pi" "Pa" "PE" "P" "Po"
-   "pe" "pu" "pi" "pa" "pE" "p" "po"
-   " " "\\_" "." "," ";" ":" "\\*" "\\<" "\\>"
-   "1" "2" "3" "4" "5" "6" "7" "8" "9"
-   "10" "20" "30" "40" "50" "60" "70" "80" "90"
-   "100" "10000"
-   "\\~e" "\\~E" "\\~a" "\\~A"])
-
-(defvar ethio-use-tigrigna-style nil
-  "*If non-NIL, use \"e\" instead of \"a\" for the first lone vowel
-translation in sera-to-fidel and fidel-to-sera conversions.")
-
-(defvar ethio-quote-vowel-always nil
-  "*If non-NIL, lone vowels are always transcribed by \"an apostrophe
-+ the vowel\" except at word initial.  Otherwise, they are quoted by
-an apostrophe only if the preceding Ethiopic character is a lone
-consonant.")
-
-(defvar ethio-W-sixth-always nil
-  "*If non-NIL, the Wu-form of a 12-form consonant is transcribed by
-\"W'\" instead of \"Wu\".")
-
-(defvar ethio-numeric-reduction 0
-  "*Degree of reduction in transcribing Ethiopic digits by Arabic
-digits.  For example, $(2$`$_$i$g$](B ({10}{9}{100}{80}{7}) will be
-transcribed by:
-    \10\9\100\80\7	if ETHIO-NUMERIC-REDUCTION is 0,
-    \109100807					   is 1,
-    \10900807					   is 2.")
-
-;;;###autoload
-(defun fidel-to-sera-region (begin end &optional ascii-mode force)
-  "Replaces all the FIDEL characters in the region to sera format.
-
-If the 1st optional parameter ASCII-MODE is non-NIL, converts the
-region so that it begins in ASCII script.
-
-If the 2nd optional parameter FORCE is non-NIL, converts even if the
-buffer is read-only."
-
-  (interactive "r\nP")
-  (save-excursion
-    (save-restriction
-      (narrow-to-region begin end)
-      (fidel-to-sera-buffer ascii-mode force))))
-
-;;;###autoload
-(defun fidel-to-sera-buffer (&optional ascii-mode force)
-  "Replace all the FIDEL characters in the current buffer to sera format.
-
-If the 1st optional parameter ASCII-MODE is non-NIL,
-convert the current buffer so that it begins in ASCII script.
-
-If the 2nd optional parameter FORCE is non-NIL, converts even if the
-buffer is read-only.
-
-See also the description of the variables ethio-use-tigrigna-style,
-ethio-quote-vowel-on-demand and ethio-numeric-reduction."
-
-  (interactive "P")
-  (if (and buffer-read-only
-	   (not force)
-	   (not (y-or-n-p "Buffer is read-only.  Force to convert? ")))
-      (error ""))
-
-  ;; user's preference in transcription
-  (aset fidel-to-sera-map 144 (if ethio-use-tigrigna-style "e" "a"))
-  (let ((i 160)
-	(x (if ethio-W-sixth-always
-	       '("hW'" "kW'" "KW'" "qW'" "QW'" "gW'" "wW'")
-	     '("hWu" "kWu" "KWu" "qWu" "QWu" "gWu" "wWu"))))
-    (while x
-      (aset fidel-to-sera-map i (car x))
-      (setq i (+ i 12)
-	    x (cdr x))))
-
-  ;; main conversion routine
-  (let ((lonec nil) ; if lonec = t, previous char was a lone consonant.
-	(fidel nil) ; if fidel = t, previous char was a fidel.
-	(digit nil) ; if digit = t, previous char was an Ethiopic digit.
-	(buffer-read-only nil)
-	ch)
-    (goto-char (point-min))
-    (while (not (eobp))
-      (setq ch (following-char))
-
-      ;; ethiopic charactes
-      (if (= (char-charset ch) 'ethiopic)
-	  (progn
-	    (setq ch (char-to-ethiocode ch))
-	    (delete-char 1)
-
-	    (cond
-
-	     ;; fidels
-	     ((<= ch 326)
-	      (if ascii-mode
-		  (insert "\\ "))
-	      (if (and (memq ch '(144 145 146 147 148 150 151)) ; (auiAEoe3)
-		       (or lonec
-			   (and ethio-quote-vowel-always
-				fidel)))
-		  (insert "'"))
-	      (insert (aref fidel-to-sera-map ch))
-	      (setq ascii-mode nil
-		    lonec (ethio-lone-consonant-p ch)
-		    fidel t
-		    digit nil))
-
-	     ;; punctuations and symbols
-	     ((or (< ch 336) (> ch 355))
-	      (if (and ascii-mode
-		       (memq ch '(329 330 331 332))) ; (.,;:)
-		  (insert "\\"))
-	      (insert (aref fidel-to-sera-map ch))
-	      (setq lonec nil
-		    fidel nil
-		    digit nil))
-
-	     ;; now CH must be an ethiopic digit
-
-	     ;; reduction = 0 or leading digit
-	     ((or (= ethio-numeric-reduction 0)
-		  (not digit))
-	      (insert "\\" (aref fidel-to-sera-map ch))
-	      (setq lonec nil
-		    fidel nil
-		    digit t))
-
-	     ;; reduction = 2 and following 10s, 100s, 10000s 
-	     ((and (= ethio-numeric-reduction 2)
-		   (memq ch '(345 354 355)))
-	      (insert (substring (aref fidel-to-sera-map ch) 1))
-	      (setq lonec nil
-		    fidel nil
-		    digit t))
-
-	     ;; ordinary following digits
-	     (t
-	      (insert (aref fidel-to-sera-map ch))
-	      (setq lonec nil
-		    fidel nil
-		    digit t))))
-
-	;; non-ethiopic characters
-	(cond
-
-	 ;; backslash is always quoted
-	 ((= ch ?\\ )
-	  (insert "\\"))
-
-	 ;; nothing to do if in ascii-mode
-	 (ascii-mode)
-
-	 ;; ethio-mode -> ascii-mode
-	 ((or (and (>= ch ?a) (<= ch ?z))
-	      (and (>= ch ?A) (<= ch ?Z))
-	      (memq ch '(?| ?' ?`)))
-	  (insert "\\ ")
-	  (setq ascii-mode t))
-
-	 ;; ascii punctuations in ethio-mode
-	 ((memq ch '(?. ?, ?\; ?:))
-	  (insert "\\")))
-
-	(forward-char 1)
-	(setq lonec nil
-	      fidel nil
-	      digit nil)))
-
-    ;; a few modifications for readability
-    (goto-char (point-min))
-    (while (re-search-forward "\\([]!\"#$%&()*+/<=>?@[^_-]+\\)\\\\ " nil t)
-      (replace-match "\\\\ \\1"))
-
-    (goto-char (point-min))
-    (while (re-search-forward "\n\\([ \t]*\\)\\\\ " nil t)
-      (replace-match "\\\\\n\\1")))
-
-  (goto-char (point-min)))
-
-(defun ethio-lone-consonant-p (code)
-  "If the ethiocode CODE is an Ethiopic lone consonant, return t."
-  (cond
-   ((< code 144)
-    (= (mod code 8) 5))
-   ((< code 153)
-    nil)
-   ((< code 236)
-    (= (mod code 12) 1))
-   ((< code 327)
-    (= (mod code 7) 3))))
-
-;;;###autoload
-(defun fidel-to-sera-mail nil
-  "Does FIDEL to SERA conversion for reading/writing mail and news.
-
-If the buffer contains at least one Ethiopic character,
- 1) inserts the string \"<sera>\" right after the header-body separator,
- 2) inserts \"</sera>\" at the end of the buffer,
- 3) converts the body into SERA in Ethiopic start mode, and
- 4) converts the subject field in ASCII start mode."
-
-  (interactive)
-  (save-excursion
-    (goto-char (point-min))
-    (if (re-search-forward "\\cE" nil t)
-	(let ((buffer-read-only nil) border)
-
-	  (goto-char (point-min))
-	  (setq border
-		(search-forward
-		 (if (eq major-mode 'rmail-mode)
-		     "\n\n"
-		   (concat "\n" mail-header-separator "\n"))))
-	  (insert "<sera>\n")
-
-	  (fidel-to-sera-region (point) (point-max))
-
-	  (goto-char (point-max))
-	  (if (/= (preceding-char) ?\n)
-	      (insert "\n"))
-	  (insert "</sera>\n")
-
-	  (goto-char (point-min))
-	  (if (re-search-forward "^Subject: " border t)
-	      (fidel-to-sera-region
-	       (point)
-	       (progn (end-of-line) (point))
-	       'ascii-start))
-
-	  ;; adjust the rmail marker
-	  (if (eq major-mode 'rmail-mode)
-	      (set-marker
-	       (aref rmail-message-vector (1+ rmail-current-message))
-	       (point-max))))
-
-      (message "No Ethiopic characters in this buffer."))))
-
-;;;###autoload
-(defun fidel-to-sera-marker nil
-  "If the buffer contains the markers \"<sera>\" and \"</sera>\",
-converts the segment between the two markers from Fidel to SERA
-in Ethio start mode.  The markers will not be removed."
-
-  (interactive)
-  (if (and buffer-read-only
-	   (not (y-or-n-p "Buffer is read-only.  Force to convert? ")))
-      (error ""))
-  (save-excursion
-    (goto-char (point-min))
-    (while (re-search-forward "^<sera>\n" nil t)
-      (fidel-to-sera-region
-       (point)
-       (if (re-search-forward "^</sera>\n" nil t)
-	   (match-beginning 0)
-	 (point-max))
-       nil
-       'force))))
-
-;;
-;; file I/O hooks
-;;
-
-(if (not (assoc "\\.sera$" auto-mode-alist))
-    (setq auto-mode-alist
-	  (cons '("\\.sera$" . sera-to-fidel-find-file) auto-mode-alist)))
-(add-hook 'write-file-hooks 'fidel-to-sera-write-file)
-(add-hook 'after-save-hook 'sera-to-fidel-after-save)
-
-;;;###autoload
-(defun sera-to-fidel-find-file nil
-  "Intended to be called when a file whose name ends in \".sera\" is read in."
-  (sera-to-fidel-buffer nil 'force)
-  (set-buffer-modified-p nil)
-  nil)
-
-;;;###autoload
-(defun fidel-to-sera-write-file nil
-  "Intended to be used as write-file-hooks for the files
-whose name ends in \".sera\"."
-  (if (string-match "\\.sera$" (buffer-file-name))
-      (save-excursion
-	(fidel-to-sera-buffer nil 'force)
-	(set-buffer-modified-p nil)))
-  nil)
-
-;;;###autoload
-(defun sera-to-fidel-after-save nil
-  "Intended to be used as after-save-hook for the files
-whose name ends in \".sera\"."
-  (if (string-match "\\.sera$" (buffer-file-name))
-      (save-excursion
-	(sera-to-fidel-buffer nil 'force)
-	(set-buffer-modified-p nil)))
-  nil)
-
-;;
-;; vowel modification
-;;
-
-;;;###autoload
-(defun ethio-modify-vowel nil
-  "Modify the vowel of the FIDEL that is under the cursor."
-  (interactive)
-  (let ((ch (following-char)) newch base vowel)
-    (if (= (char-charset ch) 'ethiopic)
-	(setq ch (char-to-ethiocode ch))
-      (error "Not a valid character."))
-    (if (or (and (>= ch 144) (<= ch 151)) ; lone vowels
-	    (and (>= ch 250) (<= ch 256)) ; secondary lone vowels
-	    (>= ch 327))		  ; not FIDEL
-	(error "Not a valid character."))
-    (message "Modify vowel to: ")
-    (if (null (setq vowel (memq (read-char) '(?e ?u ?i ?a ?E ?' ?o))))
-	(error "Not a valid vowel.")
-      ;; ?e -> 0, ?u -> 1, ?i -> 2, ?a -> 3, ?E -> 4, ?' -> 5, ?o -> 6
-      (setq vowel (- 7 (length vowel))))
-
-    (cond
-
-     ;; 8-form consonant
-     ((<= ch 143)
-      (setq base (* (/ ch 8) 8))
-      (cond
-       ((< (mod ch 8) 7)		; e-form <= ch <= o-form
-	(setq newch (+ base vowel)))
-       ((= vowel 3)			; 3 = a
-	(setq newch (+ base 7)))	; (+ base 7) = Wa-form
-       ((= vowel 5)			; 5 = '
-	(setq newch
-	      (cons (+ base 5)		; (+ base 5) = lone consonant
-		    232)))		; 232 = Wu
-       (t
-	(setq newch
-	      (cons (+ base 5)		; (+ base 5) = lone consonant
-		    (+ 231 vowel))))))	; 231 = We
-
-     ;; 12-form consonant
-     ((<= ch 235)
-      (setq ch (- ch 152)		; 152 = 12-form consonant offset
-	    base (* (/ ch 12) 12))
-      (cond
-       ((< (mod ch 12) 7)		; e-form <= ch <= o-form
-	(setq newch (+ base vowel 152)))
-       ((< vowel 5)			; We-form <= ch <= WE-form
-	(setq newch (+ base vowel 159))) ; 159 = 152 (offset) + 7 (We-form)
-       ((= vowel 5)			; 5 = ' (= u in this case)
-	(setq newch (+ base 160)))	; 160 = 152 (offset) + 8 (Wu-form)
-       (t
-	(error "Not a valid vowel."))))
-
-     ;; 7-form consonant
-     (t					; 236 = 7-form consonant offset
-      (setq newch (+ (* (/ (- ch 236) 7) 7) vowel 236))))
-
-    (delete-char 1)
-
-    (cond
-     ((consp newch)
-      (insert (ethiocode-to-char (car newch))
-	      (ethiocode-to-char (cdr newch)))
-      (backward-char 2))
-     (t
-      (insert (ethiocode-to-char newch))
-      (backward-char 1)))))
-
-(defun ethiocode-to-char (code)
-  (make-char 'ethiopic (+ (/ code 94) 33) (+ (mod code 94) 33)))
-
-(defun char-to-ethiocode (ch)
-  (and (eq (char-charset ch) 'ethiopic)
-       (+ (* (- (char-octet ch 0) 33) 94)
-	  (- (char-octet ch 1) 33))))
-
-;;
-;; space replacement
-;;
-
-;;;###autoload
-(defun ethio-replace-space (ch begin end)
-  "In the specified region, replace spaces between two Ethiopic characters."
-  (interactive "*cReplace spaces to: 1 (sg col), 2 (dbl col), 3 (Ethiopic)\nr")
-  (if (not (memq ch '(?1 ?2 ?3)))
-      (error ""))
-  (save-excursion
-    (save-restriction
-      (narrow-to-region begin end)
-      (goto-char (point-min))
-
-      (cond
-
-       ((= ch ?1)
-
-	;; A double column space or an Ethiopic word separator is always
-	;; converted to an ASCII space.
-	(while (re-search-forward "[$(2$N$O(B]" nil t)
-	  (replace-match " " nil nil)))
-
-       ((= ch ?2)
-
-	;; An Ethiopic word separator is always converted to
-	;; a double column space.
-	(while (search-forward "$(2$O(B" nil t)
-	  (replace-match "$(2$N(B"))
-
-	(goto-char (point-min))
-
-	;; ASCII spaces are converted only if they are placed
-	;; between two Ethiopic characters.
-	(while (re-search-forward "\\(\\cE\\)\\( \\)\\( *\\cE\\)" nil t)
-
-	  ;; Converting the first ASCII space
-	  (replace-match "\\1$(2$N(B\\3")
-
-	  ;; A double column space is \cE, so going back to the just
-	  ;; converted double column space makes it possible to find
-	  ;; the following ASCII spaces.
-	  (goto-char (match-beginning 2))))
-
-       ((= ch ?3)
-
-	;; If more than one consecutive space (either ASCII or double
-	;; width) is found between two Ethiopic characters, the first
-	;; space will be converted to an Ethiopic word separator.
-	(let (pred succ)
-	  (while (re-search-forward "[ $(2$N(B]\\([ $(2$N(B]*\\)" nil t)
-	    (and (setq pred (char-before (match-beginning 0)))
-		 (= (char-charset pred) 'ethiopic)
-		 (setq succ (char-after (match-end 0)))
-		 (= (char-charset succ) 'ethiopic)
-		 (replace-match "$(2$O(B\\1" nil nil)))))))))
-
-;;
-;; special characters
-;;
-
-;;;###autoload
-(defun ethio-input-special-character (arg)
-  "Allow the user to input special characters."
-  (interactive "*cInput number: 1.$(2$k(B  2.$(2$l(B  3.$(2$m(B  4.$(2$n(B")
-  (cond
-   ((= arg ?1)
-    (insert ?$(2$k(B))
-   ((= arg ?2)
-    (insert ?$(2$l(B))
-   ((= arg ?3)
-    (insert ?$(2$m(B))
-   ((= arg ?4)
-    (insert ?$(2$n(B))
-   (t
-    (error ""))))
-
-;;
-;;  key bindings
-;;
-
-(define-key global-map [f4] 'sera-to-fidel-buffer)
-(define-key global-map [(shift f4)] 'sera-to-fidel-region)
-(define-key global-map [(control f4)] 'sera-to-fidel-marker)
-(define-key global-map [f5] 'fidel-to-sera-buffer)
-(define-key global-map [(shift f5)] 'fidel-to-sera-region)
-(define-key global-map [(control f5)] 'fidel-to-sera-marker)
-(define-key global-map [f6] 'ethio-modify-vowel)
-(define-key global-map [f7] 'ethio-replace-space)
-(define-key global-map [(shift f2)] 'ethio-replace-space) ; as requested
-(define-key global-map [f8] 'ethio-input-special-character)
-
-(add-hook
- 'rmail-mode-hook
- '(lambda nil
-    (define-key rmail-mode-map [(control f4)] 'sera-to-fidel-mail)
-    (define-key rmail-mode-map [(control f5)] 'fidel-to-sera-mail)))
-
-(add-hook
- 'mail-mode-hook
- '(lambda nil
-    (define-key mail-mode-map [(control f4)] 'sera-to-fidel-mail)
-    (define-key mail-mode-map [(control f5)] 'fidel-to-sera-mail)))
-
-;;
-(provide 'ethio)