This commit was generated by cvs2svn to compensate for changes in r72, which
[elisp/egg.git] / egg-com.el
1 ;;; egg-com.el --- Communication Routines in Egg Input
2 ;;;                   Method Architecture
3
4 ;; Copyright (C) 1997, 1998 Mule Project, Powered by Electrotechnical
5 ;; Laboratory, JAPAN.
6 ;; Project Leader: Satoru Tomura <tomura@etl.go.jp>
7
8 ;; Author: Hisashi Miyashita <himi@bird.scphys.kyoto-u.ac.jp>
9 ;;         NIIBE Yutaka <gniibe@mri.co.jp>
10 ;;         KATAYAMA Yoshio <kate@pfu.co.jp>  ; Korean, Chinese support.
11 ;; Maintainer: NIIBE Yutaka <gniibe@mri.co.jp>
12
13 ;; This file is part of EGG.
14
15 ;; EGG is free software; you can redistribute it and/or modify
16 ;; it under the terms of the GNU General Public License as published by
17 ;; the Free Software Foundation; either version 2, or (at your option)
18 ;; any later version.
19
20 ;; EGG is distributed in the hope that it will be useful,
21 ;; but WITHOUT ANY WARRANTY; without even the implied warranty of
22 ;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
23 ;; GNU General Public License for more details.
24
25 ;; You should have received a copy of the GNU General Public License
26 ;; along with GNU Emacs; see the file COPYING.  If not, write to the
27 ;; Free Software Foundation, Inc., 59 Temple Place - Suite 330,
28 ;; Boston, MA 02111-1307, USA.
29
30 ;;; Commentary:
31
32 ;;; Code:
33
34 (require 'egg-edep)
35
36 (defvar egg-fixed-euc 'fixed-euc-jp)
37 (make-variable-buffer-local 'egg-fixed-euc)
38
39 (defvar egg-mb-euc 'euc-japan)
40 (make-variable-buffer-local 'egg-mb-euc)
41
42 (eval-and-compile
43 (define-ccl-program ccl-decode-fixed-euc-jp
44   `(2
45     ((r2 = ,(charset-id 'japanese-jisx0208))
46      (r3 = ,(charset-id 'japanese-jisx0212))
47      (r4 = ,(charset-id 'katakana-jisx0201))
48      (read r0)
49      (loop
50       (read r1)
51       (if (r0 < ?\x80)
52           ((r0 = r1)
53            (if (r1 < ?\x80)
54                (write-read-repeat r0))
55            (write r4)
56            (write-read-repeat r0))
57         ((if (r1 > ?\x80)
58              ((write r2 r0)
59               (r0 = r1)
60               (write-read-repeat r0))
61            ((write r3 r0)
62             (r0 = (r1 | ?\x80))
63             (write-read-repeat r0)))))))))
64
65 (define-ccl-program ccl-encode-fixed-euc-jp
66   `(2
67     ((read r0)
68      (loop
69       (if (r0 == ,(charset-id 'latin-jisx0201))                   ; Unify
70           ((read r0)
71            (r0 &= ?\x7f)))
72       (if (r0 < ?\x80)                                            ;G0
73           ((write 0)
74            (write-read-repeat r0)))
75       (r6 = (r0 == ,(charset-id 'japanese-jisx0208)))
76       (r6 |= (r0 == ,(charset-id 'japanese-jisx0208-1978)))
77       (if r6                                                      ;G1
78           ((read r0)
79            (write r0)
80            (read r0)
81            (write-read-repeat r0)))
82       (if (r0 == ,(charset-id 'katakana-jisx0201))                ;G2
83           ((read r0)
84            (write 0)
85            (write-read-repeat r0)))
86       (if (r0 == ,(charset-id 'japanese-jisx0212))                ;G3
87           ((read r0)
88            (write r0)
89            (read r0)
90            (r0 &= ?\x7f)
91            (write-read-repeat r0)))
92       (read r0)
93       (repeat)))))
94 )
95
96 (make-coding-system 'fixed-euc-jp 4 ?W "Coding System for fixed EUC Japanese"
97                     (cons ccl-decode-fixed-euc-jp ccl-encode-fixed-euc-jp))
98
99 ;; Korean
100
101 (eval-and-compile
102 (define-ccl-program ccl-decode-fixed-euc-kr
103   `(2
104     ((r2 = ,(charset-id 'korean-ksc5601))
105      (read r0)
106      (loop
107       (read r1)
108       (if (r0 < ?\x80)
109           (r0 = r1 & ?\x7f)
110         ((write r2 r0)
111          (r0 = r1 | ?\x80)))
112       (write-read-repeat r0)))))
113
114 (define-ccl-program ccl-encode-fixed-euc-kr
115   `(2
116     ((read r0)
117      (loop
118       (if (r0 < ?\x80)
119           ((write 0)
120            (write-read-repeat r0)))
121       (if (r0 == ,(charset-id 'korean-ksc5601))
122           ((read r0)
123            (write r0)
124            (read r0)
125            (write-read-repeat r0)))
126       (read r0)
127       (repeat)))))
128 )
129
130 (make-coding-system 'fixed-euc-kr 4 ?W "Coding System for fixed EUC Korean"
131                     (cons ccl-decode-fixed-euc-kr ccl-encode-fixed-euc-kr))
132
133 ;; Chinese
134 (defvar egg-zhuyin nil)
135
136 (defconst yincode-pinyin-shengmu
137   '((""  . 0)  ("B" . 1)  ("C"  . 2)  ("Ch" . 3)  ("D" . 4)
138     ("F" . 5)  ("G" . 6)  ("H"  . 7)  ("J"  . 8)  ("K" . 9)
139     ("L" . 10) ("M" . 11) ("N"  . 12) ("P"  . 13) ("Q" . 14)
140     ("R" . 15) ("S" . 16) ("Sh" . 17) ("T"  . 18) ("W" . 19)
141     ("X" . 20) ("Y" . 21) ("Z"  . 22) ("Zh" . 23)))
142
143 (defconst yincode-pinyin-yunmu
144   '(("\e(0@\e(B"      0 0) ("\e(0@\e(B"      0 1) ("\e(0@\e(B"      0 3) ("\e(0@\e(B"      0 5) ("\e(0@\e(B"      0 7)
145     ("a\e(0@\e(B"     1 0) ("\e(0!@\e(B"     1 1) ("\e(0"@\e(B"     1 3) ("\e(0#@\e(B"     1 5) ("\e(0$@\e(B"     1 7)
146     ("ai\e(0@\e(B"    2 0) ("\e(0!\e(Bi\e(0@\e(B"    2 1) ("\e(0"\e(Bi\e(0@\e(B"    2 3) ("\e(0#\e(Bi\e(0@\e(B"    2 5) ("\e(0$\e(Bi\e(0@\e(B"    2 7)
147     ("an\e(0@\e(B"    3 0) ("\e(0!\e(Bn\e(0@\e(B"    3 1) ("\e(0"\e(Bn\e(0@\e(B"    3 3) ("\e(0#\e(Bn\e(0@\e(B"    3 5) ("\e(0$\e(Bn\e(0@\e(B"    3 7)
148     ("ang\e(0@\e(B"   4 0) ("\e(0!\e(Bng\e(0@\e(B"   4 1) ("\e(0"\e(Bng\e(0@\e(B"   4 3) ("\e(0#\e(Bng\e(0@\e(B"   4 5) ("\e(0$\e(Bng\e(0@\e(B"   4 7)
149     ("ao\e(0@\e(B"    5 0) ("\e(0!\e(Bo\e(0@\e(B"    5 1) ("\e(0"\e(Bo\e(0@\e(B"    5 3) ("\e(0#\e(Bo\e(0@\e(B"    5 5) ("\e(0$\e(Bo\e(0@\e(B"    5 7)
150     ("e\e(0@\e(B"     6 0) ("\e(0%@\e(B"     6 1) ("\e(0&@\e(B"     6 3) ("\e(0'@\e(B"     6 5) ("\e(0(@\e(B"     6 7)
151     ("ei\e(0@\e(B"    7 0) ("\e(0%\e(Bi\e(0@\e(B"    7 1) ("\e(0&\e(Bi\e(0@\e(B"    7 3) ("\e(0'\e(Bi\e(0@\e(B"    7 5) ("\e(0(\e(Bi\e(0@\e(B"    7 7)
152     ("en\e(0@\e(B"    8 0) ("\e(0%\e(Bn\e(0@\e(B"    8 1) ("\e(0&\e(Bn\e(0@\e(B"    8 3) ("\e(0'\e(Bn\e(0@\e(B"    8 5) ("\e(0(\e(Bn\e(0@\e(B"    8 7)
153     ("eng\e(0@\e(B"   9 0) ("\e(0%\e(Bng\e(0@\e(B"   9 1) ("\e(0&\e(Bng\e(0@\e(B"   9 3) ("\e(0'\e(Bng\e(0@\e(B"   9 5) ("\e(0(\e(Bng\e(0@\e(B"   9 7)
154     ("er\e(0@\e(B"   10 0) ("\e(0%\e(Br\e(0@\e(B"   10 1) ("\e(0&\e(Br\e(0@\e(B"   10 3) ("\e(0'\e(Br\e(0@\e(B"   10 5) ("\e(0(\e(Br\e(0@\e(B"   10 7)
155     ("i\e(0@\e(B"    11 0) ("\e(0)@\e(B"    11 1) ("\e(0*@\e(B"    11 3) ("\e(0+@\e(B"    11 5) ("\e(0,@\e(B"    11 7)
156     ("ia\e(0@\e(B"   12 0) ("i\e(0!@\e(B"   12 1) ("i\e(0"@\e(B"   12 3) ("i\e(0#@\e(B"   12 5) ("i\e(0$@\e(B"   12 7)
157     ("ian\e(0@\e(B"  13 0) ("i\e(0!\e(Bn\e(0@\e(B"  13 1) ("i\e(0"\e(Bn\e(0@\e(B"  13 3) ("i\e(0#\e(Bn\e(0@\e(B"  13 5) ("i\e(0$\e(Bn\e(0@\e(B"  13 7)
158     ("iang\e(0@\e(B" 14 0) ("i\e(0!\e(Bng\e(0@\e(B" 14 1) ("i\e(0"\e(Bng\e(0@\e(B" 14 3) ("i\e(0#\e(Bng\e(0@\e(B" 14 5) ("i\e(0$\e(Bng\e(0@\e(B" 14 7)
159     ("iao\e(0@\e(B"  15 0) ("i\e(0!\e(Bo\e(0@\e(B"  15 1) ("i\e(0"\e(Bo\e(0@\e(B"  15 3) ("i\e(0#\e(Bo\e(0@\e(B"  15 5) ("i\e(0$\e(Bo\e(0@\e(B"  15 7)
160     ("ie\e(0@\e(B"   16 0) ("i\e(0%@\e(B"   16 1) ("i\e(0&@\e(B"   16 3) ("i\e(0'@\e(B"   16 5) ("i\e(0(@\e(B"   16 7)
161     ("in\e(0@\e(B"   17 0) ("\e(0)\e(Bn\e(0@\e(B"   17 1) ("\e(0*\e(Bn\e(0@\e(B"   17 3) ("\e(0+\e(Bn\e(0@\e(B"   17 5) ("\e(0,\e(Bn\e(0@\e(B"   17 7)
162     ("ing\e(0@\e(B"  18 0) ("\e(0)\e(Bng\e(0@\e(B"  18 1) ("\e(0*\e(Bng\e(0@\e(B"  18 3) ("\e(0+\e(Bng\e(0@\e(B"  18 5) ("\e(0,\e(Bng\e(0@\e(B"  18 7)
163     ("iong\e(0@\e(B" 19 0) ("i\e(0-\e(Bng\e(0@\e(B" 19 1) ("i\e(0.\e(Bng\e(0@\e(B" 19 3) ("i\e(0/\e(Bng\e(0@\e(B" 19 5) ("i\e(00\e(Bng\e(0@\e(B" 19 7)
164     ("iu\e(0@\e(B"   20 0) ("i\e(01@\e(B"   20 1) ("i\e(02@\e(B"   20 3) ("i\e(03@\e(B"   20 5) ("i\e(04@\e(B"   20 7)
165     ("m\e(0@\e(B"    21 0) ("m\e(0@\e(B"    21 1) ("m\e(0@\e(B"    21 3) ("m\e(0@\e(B"    21 5) ("m\e(0@\e(B"    21 7)
166     ("n\e(0@\e(B"    22 0) ("n\e(0@\e(B"    22 1) ("\e(0=@\e(B"    22 3) ("\e(0>@\e(B"    22 5) ("\e(0?@\e(B"    22 7)
167     ("ng\e(0@\e(B"   23 0) ("ng\e(0@\e(B"   23 1) ("ng\e(0@\e(B"   23 3) ("ng\e(0@\e(B"   23 5) ("ng\e(0@\e(B"   23 7)
168     ("o\e(0@\e(B"    24 0) ("\e(0-@\e(B"    24 1) ("\e(0.@\e(B"    24 3) ("\e(0/@\e(B"    24 5) ("\e(00@\e(B"    24 7)
169     ("ong\e(0@\e(B"  25 0) ("\e(0-\e(Bng\e(0@\e(B"  25 1) ("\e(0.\e(Bng\e(0@\e(B"  25 3) ("\e(0/\e(Bng\e(0@\e(B"  25 5) ("\e(00\e(Bng\e(0@\e(B"  25 7)
170     ("ou\e(0@\e(B"   26 0) ("\e(0-\e(Bu\e(0@\e(B"   26 1) ("\e(0.\e(Bu\e(0@\e(B"   26 3) ("\e(0/\e(Bu\e(0@\e(B"   26 5) ("\e(00\e(Bu\e(0@\e(B"   26 7)
171     ("u\e(0@\e(B"    27 0) ("\e(01@\e(B"    27 1) ("\e(02@\e(B"    27 3) ("\e(03@\e(B"    27 5) ("\e(04@\e(B"    27 7)
172     ("ua\e(0@\e(B"   28 0) ("u\e(0!@\e(B"   28 1) ("u\e(0"@\e(B"   28 3) ("u\e(0#@\e(B"   28 5) ("u\e(0$@\e(B"   28 7)
173     ("uai\e(0@\e(B"  29 0) ("u\e(0!\e(Bi\e(0@\e(B"  29 1) ("u\e(0"\e(Bi\e(0@\e(B"  29 3) ("u\e(0#\e(Bi\e(0@\e(B"  29 5) ("u\e(0$\e(Bi\e(0@\e(B"  29 7)
174     ("uan\e(0@\e(B"  30 0) ("u\e(0!\e(Bn\e(0@\e(B"  30 1) ("u\e(0"\e(Bn\e(0@\e(B"  30 3) ("u\e(0#\e(Bn\e(0@\e(B"  30 5) ("u\e(0$\e(Bn\e(0@\e(B"  30 7)
175     ("uang\e(0@\e(B" 31 0) ("u\e(0!\e(Bng\e(0@\e(B" 31 1) ("u\e(0"\e(Bng\e(0@\e(B" 31 3) ("u\e(0#\e(Bng\e(0@\e(B" 31 5) ("u\e(0$\e(Bng\e(0@\e(B" 31 7)
176     ("ue\e(0@\e(B"   32 0) ("u\e(0%@\e(B"   32 1) ("u\e(0&@\e(B"   32 3) ("u\e(0'@\e(B"   32 5) ("u\e(0(@\e(B"   32 7)
177     ("ui\e(0@\e(B"   33 0) ("u\e(0)@\e(B"   33 1) ("u\e(0*@\e(B"   33 3) ("u\e(0+@\e(B"   33 5) ("u\e(0,@\e(B"   33 7)
178     ("un\e(0@\e(B"   34 0) ("\e(01\e(Bn\e(0@\e(B"   34 1) ("\e(02\e(Bn\e(0@\e(B"   34 3) ("\e(03\e(Bn\e(0@\e(B"   34 5) ("\e(04\e(Bn\e(0@\e(B"   34 7)
179     ("uo\e(0@\e(B"   35 0) ("u\e(0-@\e(B"   35 1) ("u\e(0.@\e(B"   35 3) ("u\e(0/@\e(B"   35 5) ("u\e(00@\e(B"   35 7)
180     ("\e(09@\e(B"    36 0) ("\e(05@\e(B"    36 1) ("\e(06@\e(B"    36 3) ("\e(07@\e(B"    36 5) ("\e(08@\e(B"    36 7)
181     ("\e(09\e(Be\e(0@\e(B"   37 0) ("\e(09%@\e(B"   37 1) ("\e(09&@\e(B"   37 3) ("\e(09'@\e(B"   37 5) ("\e(09(@\e(B"   37 7)
182     ("0\e(0@\e(B"    38 0) ("1\e(0@\e(B"    38 1) ("2\e(0@\e(B"    38 3) ("3\e(0@\e(B"    38 5) ("4\e(0@\e(B"    38 7)))
183
184 (defconst yincode-pinyin-table
185   [
186    0 1 1 1 1 1 1 1 1 1 1 0 0 0 0 0 0 0 0 0 0 1 1 1 1 0 1 0 0 0 0 0 0 0 0 0 0 0 0
187    0 1 1 1 1 1 0 1 1 1 0 1 0 1 0 1 1 1 1 0 0 0 0 0 1 0 0 1 0 0 0 0 0 0 0 0 0 0 1
188    0 1 1 1 1 1 1 1 1 1 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 1 0 0 1 0 0 1 1 1 0 0 1
189    0 1 1 1 1 1 1 0 1 1 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 1 1 1 1 1 0 1 1 1 0 0 1
190    0 1 1 1 1 1 1 1 1 1 0 1 1 1 0 1 1 0 1 0 1 0 0 0 0 1 1 1 0 0 1 0 0 1 1 1 0 0 1
191    0 1 0 1 1 0 0 1 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 1 1 0 0 0 0 0 0 0 0 0 0 1
192    0 1 1 1 1 1 1 1 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 1 1 1 1 1 0 1 1 1 0 0 1
193    0 1 1 1 1 1 1 1 1 1 0 0 0 0 0 0 0 0 0 0 0 1 0 1 0 1 1 1 1 1 1 1 0 1 1 1 0 0 1
194    0 0 0 0 0 0 0 0 0 0 0 1 1 1 1 1 1 1 1 1 1 0 0 0 0 0 0 1 0 0 1 0 1 0 1 0 0 0 1
195    0 1 1 1 1 1 1 1 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 1 1 1 1 1 0 1 1 1 0 0 1
196    0 1 1 1 1 1 1 1 0 1 0 1 1 1 1 1 1 1 1 0 1 0 0 0 1 1 1 1 0 0 1 0 0 0 1 1 1 1 1
197    0 1 1 1 1 1 1 1 1 1 0 1 0 1 0 1 1 1 1 0 1 0 0 0 1 0 1 1 0 0 0 0 0 0 0 0 0 0 1
198    0 1 1 1 1 1 1 1 1 1 0 1 0 1 1 1 1 1 1 0 1 0 0 0 0 1 1 1 0 0 1 0 0 0 0 1 1 1 1
199    0 1 1 1 1 1 0 1 1 1 0 1 0 1 0 1 1 1 1 0 0 0 0 0 1 0 1 1 0 0 0 0 0 0 0 0 0 0 1
200    0 0 0 0 0 0 0 0 0 0 0 1 1 1 1 1 1 1 1 1 1 0 0 0 0 0 0 1 0 0 1 0 1 0 1 0 0 0 1
201    0 0 0 1 1 1 1 0 1 1 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 1 1 0 1 0 0 1 1 1 0 0 1
202    0 1 1 1 1 1 1 0 1 1 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 1 0 0 1 0 0 1 1 1 0 0 1
203    0 1 1 1 1 1 1 1 1 1 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 1 1 1 1 0 1 1 1 0 0 1
204    0 1 1 1 1 1 1 1 0 1 0 1 0 1 0 1 1 0 1 0 0 0 0 0 0 1 1 1 0 0 1 0 0 1 1 1 0 0 1
205    0 1 1 1 1 0 0 1 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 1 0 0 0 0 0 0 0 0 0 0 1
206    0 0 0 0 0 0 0 0 0 0 0 1 1 1 1 1 1 1 1 1 1 0 0 0 0 0 0 1 0 0 1 0 1 0 1 0 0 0 1
207    0 1 0 1 1 1 1 0 0 0 0 1 0 0 0 0 0 1 1 0 0 0 0 0 1 1 1 1 0 0 1 0 1 0 1 0 0 0 1
208    0 1 1 1 1 1 1 1 1 1 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 1 0 0 1 0 0 1 1 1 0 0 1
209    0 1 1 1 1 1 1 1 1 1 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 1 1 1 1 1 0 1 1 1 0 0 1
210    ])
211
212 (defconst yincode-zhuyin-shengmu
213   '((""  .  0) ("\e(0E\e(B" .  1) ("\e(0X\e(B" .  2) ("\e(0T\e(B" .  3) ("\e(0I\e(B" .  4)
214     ("\e(0H\e(B" .  5) ("\e(0M\e(B" .  6) ("\e(0O\e(B" .  7) ("\e(0P\e(B" .  8) ("\e(0N\e(B" .  9)
215     ("\e(0L\e(B" . 10) ("\e(0G\e(B" . 11) ("\e(0K\e(B" . 12) ("\e(0F\e(B" . 13) ("\e(0Q\e(B" . 14)
216     ("\e(0V\e(B" . 15) ("\e(0Y\e(B" . 16) ("\e(0U\e(B" . 17) ("\e(0J\e(B" . 18) ("\e(0h\e(B" . 19)
217     ("\e(0R\e(B" . 20) ("\e(0g\e(B" . 21) ("\e(0W\e(B" . 22) ("\e(0S\e(B" . 23)))
218
219 (defconst yincode-zhuyin-yunmu
220   '(("\e(0@\e(B"    0 0) ("\e(0A\e(B"    0 1) ("\e(0B\e(B"    0 3) ("\e(0C\e(B"    0 5) ("\e(0D\e(B"    0 7) ; i
221     ("\e(0Z@\e(B"   1 0) ("\e(0ZA\e(B"   1 1) ("\e(0ZB\e(B"   1 3) ("\e(0ZC\e(B"   1 5) ("\e(0ZD\e(B"   1 7) ; a
222     ("\e(0^@\e(B"   2 0) ("\e(0^A\e(B"   2 1) ("\e(0^B\e(B"   2 3) ("\e(0^C\e(B"   2 5) ("\e(0^D\e(B"   2 7) ; ai
223     ("\e(0b@\e(B"   3 0) ("\e(0bA\e(B"   3 1) ("\e(0bB\e(B"   3 3) ("\e(0bC\e(B"   3 5) ("\e(0bD\e(B"   3 7) ; an
224     ("\e(0d@\e(B"   4 0) ("\e(0dA\e(B"   4 1) ("\e(0dB\e(B"   4 3) ("\e(0dC\e(B"   4 5) ("\e(0dD\e(B"   4 7) ; ang
225     ("\e(0`@\e(B"   5 0) ("\e(0`A\e(B"   5 1) ("\e(0`B\e(B"   5 3) ("\e(0`C\e(B"   5 5) ("\e(0`D\e(B"   5 7) ; ao
226     ("\e(0\@\e(B"   6 0) ("\e(0\A\e(B"   6 1) ("\e(0\B\e(B"   6 3) ("\e(0\C\e(B"   6 5) ("\e(0\D\e(B"   6 7) ; e
227     ("\e(0_@\e(B"   7 0) ("\e(0_A\e(B"   7 1) ("\e(0_B\e(B"   7 3) ("\e(0_C\e(B"   7 5) ("\e(0_D\e(B"   7 7) ; ei
228     ("\e(0c@\e(B"   8 0) ("\e(0cA\e(B"   8 1) ("\e(0cB\e(B"   8 3) ("\e(0cC\e(B"   8 5) ("\e(0cD\e(B"   8 7) ; en
229     ("\e(0e@\e(B"   9 0) ("\e(0eA\e(B"   9 1) ("\e(0eB\e(B"   9 3) ("\e(0eC\e(B"   9 5) ("\e(0eD\e(B"   9 7) ; eng
230     ("\e(0f@\e(B"  10 0) ("\e(0fA\e(B"  10 1) ("\e(0fB\e(B"  10 3) ("\e(0fC\e(B"  10 5) ("\e(0fD\e(B"  10 7) ; er
231     ("\e(0g@\e(B"  11 0) ("\e(0gA\e(B"  11 1) ("\e(0gB\e(B"  11 3) ("\e(0gC\e(B"  11 5) ("\e(0gD\e(B"  11 7) ; i
232     ("\e(0gZ@\e(B" 12 0) ("\e(0gZA\e(B" 12 1) ("\e(0gZB\e(B" 12 3) ("\e(0gZC\e(B" 12 5) ("\e(0gZD\e(B" 12 7) ; ia
233     ("\e(0gb@\e(B" 13 0) ("\e(0gbA\e(B" 13 1) ("\e(0gbB\e(B" 13 3) ("\e(0gbC\e(B" 13 5) ("\e(0gbD\e(B" 13 7) ; ian
234     ("\e(0gd@\e(B" 14 0) ("\e(0gdA\e(B" 14 1) ("\e(0gdB\e(B" 14 3) ("\e(0gdC\e(B" 14 5) ("\e(0gdD\e(B" 14 7) ; iang
235     ("\e(0g`@\e(B" 15 0) ("\e(0g`A\e(B" 15 1) ("\e(0g`B\e(B" 15 3) ("\e(0g`C\e(B" 15 5) ("\e(0g`D\e(B" 15 7) ; iao
236     ("\e(0g]@\e(B" 16 0) ("\e(0g]A\e(B" 16 1) ("\e(0g]B\e(B" 16 3) ("\e(0g]C\e(B" 16 5) ("\e(0g]D\e(B" 16 7) ; ie
237     ("\e(0gc@\e(B" 17 0) ("\e(0gcA\e(B" 17 1) ("\e(0gcB\e(B" 17 3) ("\e(0gcC\e(B" 17 5) ("\e(0gcD\e(B" 17 7) ; in
238     ("\e(0ge@\e(B" 18 0) ("\e(0geA\e(B" 18 1) ("\e(0geB\e(B" 18 3) ("\e(0geC\e(B" 18 5) ("\e(0geD\e(B" 18 7) ; ing
239     ("\e(0ie@\e(B" 19 0) ("\e(0ieA\e(B" 19 1) ("\e(0ieB\e(B" 19 3) ("\e(0ieC\e(B" 19 5) ("\e(0ieD\e(B" 19 7) ; iong
240     ("\e(0ga@\e(B" 20 0) ("\e(0gaA\e(B" 20 1) ("\e(0gaB\e(B" 20 3) ("\e(0gaC\e(B" 20 5) ("\e(0gaD\e(B" 20 7) ; iu
241     ("\e(0G@\e(B"  21 0) ("\e(0GA\e(B"  21 1) ("\e(0GB\e(B"  21 3) ("\e(0GC\e(B"  21 5) ("\e(0GD\e(B"  21 7) ; m
242     ("\e(0K@\e(B"  22 0) ("\e(0KA\e(B"  22 1) ("\e(0KB\e(B"  22 3) ("\e(0KC\e(B"  22 5) ("\e(0KD\e(B"  22 7) ; n
243     ("@\e(0@\e(B"  23 0) ("@\e(0A\e(B"  23 1) ("@\e(0B\e(B"  23 3) ("@\e(0C\e(B"  23 5) ("@\e(0D\e(B"  23 7) ; ng
244     ("\e(0[@\e(B"  24 0) ("\e(0[A\e(B"  24 1) ("\e(0[B\e(B"  24 3) ("\e(0[C\e(B"  24 5) ("\e(0[D\e(B"  24 7) ; o
245     ("\e(0he@\e(B" 25 0) ("\e(0heA\e(B" 25 1) ("\e(0heB\e(B" 25 3) ("\e(0heC\e(B" 25 5) ("\e(0heD\e(B" 25 7) ; ong
246     ("\e(0a@\e(B"  26 0) ("\e(0aA\e(B"  26 1) ("\e(0aB\e(B"  26 3) ("\e(0aC\e(B"  26 5) ("\e(0aD\e(B"  26 7) ; ou
247     ("\e(0h@\e(B"  27 0) ("\e(0hA\e(B"  27 1) ("\e(0hB\e(B"  27 3) ("\e(0hC\e(B"  27 5) ("\e(0hD\e(B"  27 7) ; u
248     ("\e(0hZ@\e(B" 28 0) ("\e(0hZA\e(B" 28 1) ("\e(0hZB\e(B" 28 3) ("\e(0hZC\e(B" 28 5) ("\e(0hZD\e(B" 28 7) ; ua
249     ("\e(0h^@\e(B" 29 0) ("\e(0h^A\e(B" 29 1) ("\e(0h^B\e(B" 29 3) ("\e(0h^C\e(B" 29 5) ("\e(0h^D\e(B" 29 7) ; uai
250     ("\e(0hb@\e(B" 30 0) ("\e(0hbA\e(B" 30 1) ("\e(0hbB\e(B" 30 3) ("\e(0hbC\e(B" 30 5) ("\e(0hbD\e(B" 30 7) ; uan
251     ("\e(0hd@\e(B" 31 0) ("\e(0hdA\e(B" 31 1) ("\e(0hdB\e(B" 31 3) ("\e(0hdC\e(B" 31 5) ("\e(0hdD\e(B" 31 7) ; uang
252     ("\e(0i]@\e(B" 37 0) ("\e(0i]A\e(B" 37 1) ("\e(0i]B\e(B" 37 3) ("\e(0i]C\e(B" 37 5) ("\e(0i]D\e(B" 37 7) ; ue
253     ("\e(0h_@\e(B" 33 0) ("\e(0h_A\e(B" 33 1) ("\e(0h_B\e(B" 33 3) ("\e(0h_C\e(B" 33 5) ("\e(0h_D\e(B" 33 7) ; ui
254     ("\e(0hc@\e(B" 34 0) ("\e(0hcA\e(B" 34 1) ("\e(0hcB\e(B" 34 3) ("\e(0hcC\e(B" 34 5) ("\e(0hcD\e(B" 34 7) ; un
255     ("\e(0h[@\e(B" 35 0) ("\e(0h[A\e(B" 35 1) ("\e(0h[B\e(B" 35 3) ("\e(0h[C\e(B" 35 5) ("\e(0h[D\e(B" 35 7) ; uo
256     ("\e(0i@\e(B"  36 0) ("\e(0iA\e(B"  36 1) ("\e(0iB\e(B"  36 3) ("\e(0iC\e(B"  36 5) ("\e(0iD\e(B"  36 7) ; \e(09\e(B
257     ("\e(0i]@\e(B" 37 0) ("\e(0i]A\e(B" 37 1) ("\e(0i]B\e(B" 37 3) ("\e(0i]C\e(B" 37 5) ("\e(0i]D\e(B" 37 7) ; \e(09\e(Be
258     ("0\e(0@\e(B"  38 0) ("1\e(0A\e(B"  38 1) ("2\e(0B\e(B"  38 3) ("3\e(0C\e(B"  38 5) ("4\e(0D\e(B"  38 7) ; undefined
259     ("\e(0ib@\e(B" 39 0) ("\e(0ibA\e(B" 39 1) ("\e(0ibB\e(B" 39 3) ("\e(0ibC\e(B" 39 5) ("\e(0ibD\e(B" 39 7) ; \e(09\e(Ban
260     ("\e(0ic@\e(B" 40 0) ("\e(0icA\e(B" 40 1) ("\e(0icB\e(B" 40 3) ("\e(0icC\e(B" 40 5) ("\e(0icD\e(B" 40 7) ; \e(09\e(Bn
261     ))
262
263 (defconst yincode-zhuyin-table
264   [
265    ;; empty ShengMu
266    ?\x0000 ?\x8000 ?\x8000 ?\x8000 ?\x8000 ?\x8000 ?\x8000 ?\x8000 ?\x8000 ?\x8000
267    ?\x8000 ?\x0000 ?\x0000 ?\x0000 ?\x0000 ?\x0000 ?\x9586 ?\x0000 ?\x9592 ?\x9599
268    ?\x0000 ?\x8000 ?\x8000 ?\x8000 ?\x8000 ?\x0000 ?\x8000 ?\x0000 ?\x0000 ?\x0000
269    ?\x0000 ?\x0000 ?\x0000 ?\x0000 ?\x0000 ?\x0000 ?\x959b ?\x95a0 ?\x0000 ?\x959e
270    ?\x95a2
271    ;; ShengMu B
272    ?\x0000 ?\x8000 ?\x8000 ?\x8000 ?\x8000 ?\x8000 ?\x0000 ?\x8000 ?\x8000 ?\x8000
273    ?\x0000 ?\x8000 ?\x0000 ?\x8000 ?\x0000 ?\x8000 ?\x8000 ?\x8000 ?\x8000 ?\x0000
274    ?\x0000 ?\x0000 ?\x0000 ?\x0000 ?\x8000 ?\x0000 ?\x0000 ?\x8000 ?\x0000 ?\x0000
275    ?\x0000 ?\x0000 ?\x0000 ?\x0000 ?\x0000 ?\x0000 ?\x0000 ?\x0000 ?\x8000 ?\x0000
276    ?\x0000
277    ;; ShengMu C
278    ?\x828b ?\x8000 ?\x8000 ?\x8000 ?\x8000 ?\x8000 ?\x8000 ?\x8000 ?\x8000 ?\x8000
279    ?\x0000 ?\x0280 ?\x0000 ?\x0000 ?\x0000 ?\x0000 ?\x0000 ?\x0000 ?\x0000 ?\x0000
280    ?\x0000 ?\x0000 ?\x0000 ?\x0000 ?\x0000 ?\x8000 ?\x8000 ?\x8000 ?\x0000 ?\x0000
281    ?\x8000 ?\x0000 ?\x0000 ?\x8000 ?\x8000 ?\x8000 ?\x0000 ?\x0000 ?\x8000 ?\x0000
282    ?\x0000
283    ;; ShengMu Ch
284    ?\x838b ?\x8000 ?\x8000 ?\x8000 ?\x8000 ?\x8000 ?\x8000 ?\x0000 ?\x8000 ?\x8000
285    ?\x0000 ?\x0380 ?\x0000 ?\x0000 ?\x0000 ?\x0000 ?\x0000 ?\x0000 ?\x0000 ?\x0000
286    ?\x0000 ?\x0000 ?\x0000 ?\x0000 ?\x0000 ?\x8000 ?\x8000 ?\x8000 ?\x8000 ?\x8000
287    ?\x8000 ?\x8000 ?\x0000 ?\x8000 ?\x8000 ?\x8000 ?\x0000 ?\x0000 ?\x8000 ?\x0000
288    ?\x0000
289    ;; ShengMu D
290    ?\x0000 ?\x8000 ?\x8000 ?\x8000 ?\x8000 ?\x8000 ?\x8000 ?\x8000 ?\x8000 ?\x8000
291    ?\x0000 ?\x8000 ?\x8000 ?\x8000 ?\x0000 ?\x8000 ?\x8000 ?\x0000 ?\x8000 ?\x0000
292    ?\x8000 ?\x0000 ?\x0000 ?\x0000 ?\x0000 ?\x8000 ?\x8000 ?\x8000 ?\x0000 ?\x0000
293    ?\x8000 ?\x0000 ?\x0000 ?\x8000 ?\x8000 ?\x8000 ?\x0000 ?\x0000 ?\x8000 ?\x0000
294    ?\x0000
295    ;; ShengMu F
296    ?\x0000 ?\x8000 ?\x0000 ?\x8000 ?\x8000 ?\x0000 ?\x0000 ?\x8000 ?\x8000 ?\x8000
297    ?\x0000 ?\x0000 ?\x0000 ?\x0000 ?\x0000 ?\x0000 ?\x0000 ?\x0000 ?\x0000 ?\x0000
298    ?\x0000 ?\x0000 ?\x0000 ?\x0000 ?\x8000 ?\x0000 ?\x8000 ?\x8000 ?\x0000 ?\x0000
299    ?\x0000 ?\x0000 ?\x0000 ?\x0000 ?\x0000 ?\x0000 ?\x0000 ?\x0000 ?\x8000 ?\x0000
300    ?\x0000
301    ;; ShengMu G
302    ?\x0000 ?\x8000 ?\x8000 ?\x8000 ?\x8000 ?\x8000 ?\x8000 ?\x8000 ?\x8000 ?\x8000
303    ?\x0000 ?\x0000 ?\x0000 ?\x0000 ?\x0000 ?\x0000 ?\x0000 ?\x0000 ?\x0000 ?\x0000
304    ?\x0000 ?\x0000 ?\x0000 ?\x0000 ?\x0000 ?\x8000 ?\x8000 ?\x8000 ?\x8000 ?\x8000
305    ?\x8000 ?\x8000 ?\x0000 ?\x8000 ?\x8000 ?\x8000 ?\x0000 ?\x0000 ?\x8000 ?\x0000
306    ?\x0000
307    ;; ShengMu H
308    ?\x0000 ?\x8000 ?\x8000 ?\x8000 ?\x8000 ?\x8000 ?\x8000 ?\x8000 ?\x8000 ?\x8000
309    ?\x0000 ?\x0000 ?\x0000 ?\x0000 ?\x0000 ?\x0000 ?\x0000 ?\x0000 ?\x0000 ?\x0000
310    ?\x0000 ?\x8000 ?\x0000 ?\x8000 ?\x0000 ?\x8000 ?\x8000 ?\x8000 ?\x8000 ?\x8000
311    ?\x8000 ?\x8000 ?\x0000 ?\x8000 ?\x8000 ?\x8000 ?\x0000 ?\x0000 ?\x8000 ?\x0000
312    ?\x0000
313    ;; ShengMu J
314    ?\x0000 ?\x0000 ?\x0000 ?\x0000 ?\x0000 ?\x0000 ?\x0000 ?\x0000 ?\x0000 ?\x0000
315    ?\x0000 ?\x8000 ?\x8000 ?\x8000 ?\x8000 ?\x8000 ?\x8000 ?\x8000 ?\x8000 ?\x8000
316    ?\x8000 ?\x0000 ?\x0000 ?\x0000 ?\x0000 ?\x0000 ?\x0000 ?\x08a4 ?\x0000 ?\x0000
317    ?\x08a7 ?\x0000 ?\x08a5 ?\x0000 ?\x08a8 ?\x0000 ?\x889b ?\x88a0 ?\x8000 ?\x889e
318    ?\x88a2
319    ;; ShengMu K
320    ?\x0000 ?\x8000 ?\x8000 ?\x8000 ?\x8000 ?\x8000 ?\x8000 ?\x8000 ?\x8000 ?\x8000
321    ?\x0000 ?\x0000 ?\x0000 ?\x0000 ?\x0000 ?\x0000 ?\x0000 ?\x0000 ?\x0000 ?\x0000
322    ?\x0000 ?\x0000 ?\x0000 ?\x0000 ?\x0000 ?\x8000 ?\x8000 ?\x8000 ?\x8000 ?\x8000
323    ?\x8000 ?\x8000 ?\x0000 ?\x8000 ?\x8000 ?\x8000 ?\x0000 ?\x0000 ?\x8000 ?\x0000
324    ?\x0000
325    ;; ShengMu L
326    ?\x0000 ?\x8000 ?\x8000 ?\x8000 ?\x8000 ?\x8000 ?\x8000 ?\x8000 ?\x0000 ?\x8000
327    ?\x0000 ?\x8000 ?\x8000 ?\x8000 ?\x8000 ?\x8000 ?\x8000 ?\x8000 ?\x8000 ?\x0000
328    ?\x8000 ?\x0000 ?\x0000 ?\x0000 ?\x8000 ?\x8000 ?\x8000 ?\x8000 ?\x0000 ?\x0000
329    ?\x8000 ?\x0000 ?\x0000 ?\x0000 ?\x8000 ?\x8000 ?\x8000 ?\x8000 ?\x8000 ?\x0000
330    ?\x0000
331    ;; ShengMu M
332    ?\x0000 ?\x8000 ?\x8000 ?\x8000 ?\x8000 ?\x8000 ?\x8000 ?\x8000 ?\x8000 ?\x8000
333    ?\x0000 ?\x8000 ?\x0000 ?\x8000 ?\x0000 ?\x8000 ?\x8000 ?\x8000 ?\x8000 ?\x0000
334    ?\x8000 ?\x0000 ?\x0000 ?\x0000 ?\x8000 ?\x0000 ?\x8000 ?\x8000 ?\x0000 ?\x0000
335    ?\x0000 ?\x0000 ?\x0000 ?\x0000 ?\x0000 ?\x0000 ?\x0000 ?\x0000 ?\x8000 ?\x0000
336    ?\x0000
337    ;; ShengMu N
338    ?\x0000 ?\x8000 ?\x8000 ?\x8000 ?\x8000 ?\x8000 ?\x8000 ?\x8000 ?\x8000 ?\x8000
339    ?\x0000 ?\x8000 ?\x0000 ?\x8000 ?\x8000 ?\x8000 ?\x8000 ?\x8000 ?\x8000 ?\x0000
340    ?\x8000 ?\x0000 ?\x0000 ?\x0000 ?\x0000 ?\x8000 ?\x8000 ?\x8000 ?\x0000 ?\x0000
341    ?\x8000 ?\x0000 ?\x0000 ?\x0000 ?\x0000 ?\x8000 ?\x8000 ?\x8000 ?\x8000 ?\x0000
342    ?\x0000
343    ;; ShengMu P
344    ?\x0000 ?\x8000 ?\x8000 ?\x8000 ?\x8000 ?\x8000 ?\x0000 ?\x8000 ?\x8000 ?\x8000
345    ?\x0000 ?\x8000 ?\x0000 ?\x8000 ?\x0000 ?\x8000 ?\x8000 ?\x8000 ?\x8000 ?\x0000
346    ?\x0000 ?\x0000 ?\x0000 ?\x0000 ?\x8000 ?\x0000 ?\x8000 ?\x8000 ?\x0000 ?\x0000
347    ?\x0000 ?\x0000 ?\x0000 ?\x0000 ?\x0000 ?\x0000 ?\x0000 ?\x0000 ?\x8000 ?\x0000
348    ?\x0000 
349    ;; ShengMu Q
350    ?\x0000 ?\x0000 ?\x0000 ?\x0000 ?\x0000 ?\x0000 ?\x0000 ?\x0000 ?\x0000 ?\x0000
351    ?\x0000 ?\x8000 ?\x8000 ?\x8000 ?\x8000 ?\x8000 ?\x8000 ?\x8000 ?\x8000 ?\x8000
352    ?\x8000 ?\x0000 ?\x0000 ?\x0000 ?\x0000 ?\x0000 ?\x0000 ?\x0ea4 ?\x0000 ?\x0000
353    ?\x0ea7 ?\x0000 ?\x0ea5 ?\x0000 ?\x0ea8 ?\x0000 ?\x8e9b ?\x8ea0 ?\x8000 ?\x8e9e
354    ?\x8ea2
355    ;; ShengMu R
356    ?\x8f8b ?\x0000 ?\x0000 ?\x8000 ?\x8000 ?\x8000 ?\x8000 ?\x0000 ?\x8000 ?\x8000
357    ?\x0000 ?\x0f80 ?\x0000 ?\x0000 ?\x0000 ?\x0000 ?\x0000 ?\x0000 ?\x0000 ?\x0000
358    ?\x0000 ?\x0000 ?\x0000 ?\x0000 ?\x0000 ?\x8000 ?\x8000 ?\x8000 ?\x8000 ?\x0000
359    ?\x8000 ?\x0000 ?\x0000 ?\x8000 ?\x8000 ?\x8000 ?\x0000 ?\x0000 ?\x8000 ?\x0000
360    ?\x0000
361    ;; ShengMu S
362    ?\x908b ?\x8000 ?\x8000 ?\x8000 ?\x8000 ?\x8000 ?\x8000 ?\x0000 ?\x8000 ?\x8000
363    ?\x0000 ?\x1080 ?\x0000 ?\x0000 ?\x0000 ?\x0000 ?\x0000 ?\x0000 ?\x0000 ?\x0000
364    ?\x0000 ?\x0000 ?\x0000 ?\x0000 ?\x0000 ?\x8000 ?\x8000 ?\x8000 ?\x0000 ?\x0000
365    ?\x8000 ?\x0000 ?\x0000 ?\x8000 ?\x8000 ?\x8000 ?\x0000 ?\x0000 ?\x8000 ?\x0000
366    ?\x0000
367    ;; ShengMu Sh
368    ?\x918b ?\x8000 ?\x8000 ?\x8000 ?\x8000 ?\x8000 ?\x8000 ?\x8000 ?\x8000 ?\x8000
369    ?\x0000 ?\x1180 ?\x0000 ?\x0000 ?\x0000 ?\x0000 ?\x0000 ?\x0000 ?\x0000 ?\x0000
370    ?\x0000 ?\x0000 ?\x0000 ?\x0000 ?\x0000 ?\x0000 ?\x8000 ?\x8000 ?\x8000 ?\x8000
371    ?\x8000 ?\x8000 ?\x0000 ?\x8000 ?\x8000 ?\x8000 ?\x0000 ?\x0000 ?\x8000 ?\x0000
372    ?\x0000
373    ;; ShengMu T
374    ?\x0000 ?\x8000 ?\x8000 ?\x8000 ?\x8000 ?\x8000 ?\x8000 ?\x8000 ?\x0000 ?\x8000
375    ?\x0000 ?\x8000 ?\x0000 ?\x8000 ?\x0000 ?\x8000 ?\x8000 ?\x0000 ?\x8000 ?\x0000
376    ?\x0000 ?\x0000 ?\x0000 ?\x0000 ?\x0000 ?\x8000 ?\x8000 ?\x8000 ?\x0000 ?\x0000
377    ?\x8000 ?\x0000 ?\x0000 ?\x8000 ?\x8000 ?\x8000 ?\x0000 ?\x0000 ?\x8000 ?\x0000
378    ?\x0000
379    ;; ShengMu W
380    ?\x939b ?\x8000 ?\x8000 ?\x8000 ?\x8000 ?\x0000 ?\x0000 ?\x8000 ?\x8000 ?\x8000
381    ?\x0000 ?\x0000 ?\x0000 ?\x0000 ?\x0000 ?\x0000 ?\x0000 ?\x0000 ?\x0000 ?\x0000
382    ?\x0000 ?\x0000 ?\x0000 ?\x0000 ?\x8000 ?\x0000 ?\x0000 ?\x1380 ?\x0000 ?\x0000
383    ?\x0000 ?\x0000 ?\x0000 ?\x0000 ?\x0000 ?\x0000 ?\x0000 ?\x0000 ?\x8000 ?\x0000
384    ?\x0000
385    ;; ShengMu X
386    ?\x0000 ?\x0000 ?\x0000 ?\x0000 ?\x0000 ?\x0000 ?\x0000 ?\x0000 ?\x0000 ?\x0000
387    ?\x0000 ?\x8000 ?\x8000 ?\x8000 ?\x8000 ?\x8000 ?\x8000 ?\x8000 ?\x8000 ?\x8000
388    ?\x8000 ?\x0000 ?\x0000 ?\x0000 ?\x0000 ?\x0000 ?\x0000 ?\x14a4 ?\x0000 ?\x0000
389    ?\x14a7 ?\x0000 ?\x14a5 ?\x0000 ?\x14a8 ?\x0000 ?\x949b ?\x94a0 ?\x8000 ?\x949e
390    ?\x94a2
391    ;; ShengMu Y 
392    ?\x958b ?\x8000 ?\x0000 ?\x8000 ?\x8000 ?\x8000 ?\x0090 ?\x0000 ?\x9591 ?\x9592
393    ?\x0000 ?\x1580 ?\x0000 ?\x0000 ?\x0000 ?\x0000 ?\x0000 ?\x1588 ?\x1589 ?\x0000
394    ?\x0000 ?\x0000 ?\x0000 ?\x0000 ?\x8000 ?\x0093 ?\x8000 ?\x00a4 ?\x0000 ?\x0000
395    ?\x00a7 ?\x0000 ?\x00a5 ?\x0000 ?\x00a8 ?\x0000 ?\x0000 ?\x0000 ?\x8000 ?\x0000
396    ?\x0000
397    ;; ShengMu Z
398    ?\x968b ?\x8000 ?\x8000 ?\x8000 ?\x8000 ?\x8000 ?\x8000 ?\x8000 ?\x8000 ?\x8000
399    ?\x0000 ?\x1680 ?\x0000 ?\x0000 ?\x0000 ?\x0000 ?\x0000 ?\x0000 ?\x0000 ?\x0000
400    ?\x0000 ?\x0000 ?\x0000 ?\x0000 ?\x0000 ?\x8000 ?\x8000 ?\x8000 ?\x0000 ?\x0000
401    ?\x8000 ?\x0000 ?\x0000 ?\x8000 ?\x8000 ?\x8000 ?\x0000 ?\x0000 ?\x8000 ?\x0000
402    ?\x0000
403    ;; ShengMu Zh 
404    ?\x978b ?\x8000 ?\x8000 ?\x8000 ?\x8000 ?\x8000 ?\x8000 ?\x8000 ?\x8000 ?\x8000
405    ?\x0000 ?\x1780 ?\x0000 ?\x0000 ?\x0000 ?\x0000 ?\x0000 ?\x0000 ?\x0000 ?\x0000
406    ?\x0000 ?\x0000 ?\x0000 ?\x0000 ?\x0000 ?\x8000 ?\x8000 ?\x8000 ?\x8000 ?\x8000
407    ?\x8000 ?\x8000 ?\x0000 ?\x8000 ?\x8000 ?\x8000 ?\x0000 ?\x0000 ?\x8000 ?\x0000
408    ?\x0000
409    ])
410
411 (defconst egg-chinese-syllable-max-len
412   (max (length "Zhu\e(0!\e(Bng\e(0@\e(B") (length "\e(0ShdA\e(B")))
413
414 (defun egg-chinese-syllable (str pos)
415   (setq str (substring str pos (min (length str)
416                                     (+ pos egg-chinese-syllable-max-len))))
417   (or (car (egg-pinyin-syllable str))
418       (car (egg-zhuyin-syllable str))))
419
420 (defsubst egg-make-fixed-euc-china-code (s y)
421   (cons
422    (+ (* 2 (nth 1 y)) (logand (nth 2 y) 1) 32)
423    (+ (* 4 (if (= s 0) 20 s)) (lsh (nth 2 y) -1) 156)))
424
425 (defun egg-pinyin-syllable (str)
426   (let (s y end)
427     (if (eq (string-match "^[A-Za-z\e(0!\e(B-\e(0?\e(B]+\e(0@\e(B" str) 0)
428         (progn
429           (setq end (match-end 0))
430           (cond
431            ((setq s (cdr (assoc (substring str 0 2) yincode-pinyin-shengmu)))
432             (setq y (substring str 2 end)))
433            ((setq s (cdr (assoc (substring str 0 1) yincode-pinyin-shengmu)))
434             (setq y (substring str 1 end)))
435            (t
436             (setq s 0 y (substring str 0 end))))
437           (if (and (setq y (assoc y yincode-pinyin-yunmu))
438                    (= (aref yincode-pinyin-table (+ (* 39 s) (nth 1 y))) 1))
439               (cons end (egg-make-fixed-euc-china-code s y)))))))
440
441 (defun egg-zhuyin-syllable (str)
442   (let (end s y c z (zhuyin-len (egg-charset-bytes 'chinese-sisheng)))
443     (if (eq (string-match "^[\e(0E\e(B-\e(0i\e(B@0-4]+[\e(0@ABCD\e(B]" str) 0)
444         (progn
445           (setq end (match-end 0)
446                 c (substring str 0 zhuyin-len)
447                 s (cdr (assoc c yincode-zhuyin-shengmu))
448                 y (assoc (substring str zhuyin-len end) yincode-zhuyin-yunmu))
449           (if (null (and s y))
450               (setq s 0
451                     y (assoc (substring str 0 end) yincode-zhuyin-yunmu)))
452           (if (and y
453                    (setq z (aref yincode-zhuyin-table (+ (* 41 s) (nth 1 y))))
454                    (/= (logand z ?\x8000) 0))
455               (if (/= (logand z ?\x80) 0)
456                   (cons end (egg-make-fixed-euc-china-code
457                              (logand (lsh z -8) ?\x7f)
458                              (list nil (logand z ?\x7f) (nth 2 y))))
459                 (cons end (egg-make-fixed-euc-china-code s y))))))))
460
461 (defun encode-fixed-euc-china-region (beg end type)
462   "Encode the text in the region to EUC-CN/TW."
463   (let (s syl c cset)
464     (save-excursion
465       (save-restriction
466         (narrow-to-region beg end)
467         (goto-char (point-min))
468         (while (< (point) (point-max))
469           (setq s (buffer-substring
470                    (point)
471                    (min (point-max) (+ (point) egg-chinese-syllable-max-len))))
472           (cond
473            ((setq syl (egg-pinyin-syllable s))
474             (delete-region (point) (+ (point) (car syl)))
475             (insert (car (cdr syl)) (cdr (cdr syl))))
476            ((setq syl (egg-zhuyin-syllable s))
477             (delete-region (point) (+ (point) (car syl)))
478             (insert (car (cdr syl)) (cdr (cdr syl))))
479            (t
480             (setq c (split-char (following-char))
481                   cset (car c))
482             (cond
483              ((or (and (eq cset 'chinese-gb2312) (eq type 'cn))
484                   (and (eq cset 'chinese-cns11643-1) (eq type 'tw)))
485               (delete-char 1)
486               (insert (+ (nth 1 c) 128) (+ (nth 2 c) 128)))
487              ((and (eq cset 'chinese-cns11643-2) (eq type 'tw))
488               (delete-char 1)
489               (insert (+ (nth 1 c) 128) (nth 2 c)))
490              ((eq cset 'chinese-sisheng)
491               (delete-char 1)
492               (insert 0 (+ (nth 1 c) 128)))
493              ((eq cset 'ascii)
494               (delete-char 1)
495               (insert 0 (nth 1 c)))
496              (t
497               (delete-char 1))))))
498         (- (point-max) (point-min))))))
499
500 (defun pre-write-encode-fixed-euc-china (from to type)
501   (let ((buf (current-buffer))
502         (work (get-buffer-create " *pre-write-encoding-work*")))
503     (set-buffer work)
504     (erase-buffer)
505     (if (null (stringp from))
506         (save-excursion
507           (set-buffer buf)
508           (setq from (buffer-substring from to))))
509     (insert (string-as-multibyte from))
510     (encode-fixed-euc-china-region 1 (point-max) type)
511     nil))
512
513 (defun pre-write-encode-euc-cn (from to)
514   (pre-write-encode-fixed-euc-china from to 'cn))
515
516 (defun pre-write-encode-euc-tw (from to)
517   (pre-write-encode-fixed-euc-china from to 'tw))
518
519 (defun decode-fixed-euc-china-region (beg end type)
520   "Decode EUC-CN/TW encoded text in the region.
521 Return the length of resulting text."
522   (prog1
523       (let ((str (string-as-unibyte (buffer-substring beg end)))
524             (i 0)
525             l c0 c1 s y ss)
526         (delete-region beg end)
527         (setq l (1- (length str)))
528         (while (< i l)
529           (setq c0 (aref str i)
530                 c1 (aref str (1+ i))
531                 i  (+ i 2))
532           (cond
533            ((eq c0 0)
534             (if (> c1 ?\xa0)
535                 (insert leading-code-private-11
536                         (charset-id 'chinese-sisheng)
537                         c1)
538               (insert c1)))
539            ((>= c0 ?\x80)
540             (cond
541              ((eq type 'cn)
542               (insert (charset-id 'chinese-gb2312) c0 (logior c1 ?\x80)))
543              ((>= c0 ?\x80)
544               (insert (charset-id 'chinese-cns11643-1) c0 c1))
545              (t
546               (insert (charset-id 'chinese-cns11643-2) c0 (+ c1 ?\x80)))))
547            (t
548             (setq c1 (logand c1 ?\x7f))
549             (setq s (- (lsh c1 -2) 7);;(+ (lsh (- c1 32) -2) 1)
550                   y (- (lsh c0 -1) 16);;(lsh (- c0 32) -1)
551                   ss (+ (logand c0 1) (logand c1 3)))
552             (if egg-zhuyin
553                 (progn
554                   (setq c0 (aref yincode-zhuyin-table (+ (* 41 s) y)))
555                   (if (eq (logand c0 ?\x8080) ?\x80)
556                       (setq s (lsh c0 -8)
557                             y (logand c0 ?\x7f)))
558                   (if (and (eq s 20)
559                            (eq (aref yincode-pinyin-table (+ (* 39 s) y)) 0))
560                       (setq s 0))
561                   (setq s (car (nth s yincode-zhuyin-shengmu))
562                         y (car (nth (+ (* 5 y) ss) yincode-zhuyin-yunmu))))
563               (if (and (eq s 20)
564                        (eq (aref yincode-pinyin-table (+ (* 39 s) y)) 0))
565                   (setq s 0))
566               (setq s (car (nth s yincode-pinyin-shengmu))
567                     y (car (nth (+ (* 5 y) ss) yincode-pinyin-yunmu))))
568             (if enable-multibyte-characters
569                 (insert s y)
570               (insert (string-as-unibyte s) (string-as-unibyte y))))))
571         (- (point) beg))
572     (if (looking-at "\0\0") (forward-char 2))))
573
574 (defun post-read-decode-fixed-euc-china (len type)
575   (let ((pos (point))
576         (buffer-modified-p (buffer-modified-p)))
577     (prog1
578         (decode-fixed-euc-china-region pos (+ pos len) type)
579       (set-buffer-modified-p buffer-modified-p))))
580
581 (defun post-read-decode-euc-cn (len)
582   (post-read-decode-fixed-euc-china len 'cn))
583
584 (defun post-read-decode-euc-tw (len)
585   (post-read-decode-fixed-euc-china len 'tw))
586
587 (make-coding-system 'fixed-euc-cn 0 ?W "Coding System for fixed EUC Chinese-gb2312")
588 (coding-system-put 'fixed-euc-cn 'pre-write-conversion 'pre-write-encode-euc-cn)
589 (coding-system-put 'fixed-euc-cn 'post-read-conversion 'post-read-decode-euc-cn)
590
591 (make-coding-system 'fixed-euc-tw 0 ?W "Coding System for fixed EUC Chinese-cns11643")
592 (coding-system-put 'fixed-euc-tw 'pre-write-conversion 'pre-write-encode-euc-tw)
593 (coding-system-put 'fixed-euc-tw 'post-read-conversion 'post-read-decode-euc-tw)
594 \f
595 (defsubst comm-format-u32c (uint32c)
596   (let ((h0 (car uint32c))
597         (h1 (cdr uint32c)))
598     (let ((b0 (logand (lsh h0 -8) 255))
599           (b1 (logand h0 255))
600           (b2 (logand (lsh h1 -8) 255))
601           (b3 (logand h1 255)))
602       (insert-char b0 1)
603       (insert-char b1 1)
604       (insert-char b2 1)
605       (insert-char b3 1))))
606
607 (defsubst comm-format-u32 (uint32)
608   (let ((b0 (logand (lsh uint32 -24) 255))
609         (b1 (logand (lsh uint32 -16) 255))
610         (b2 (logand (lsh uint32 -8) 255))
611         (b3 (logand uint32 255)))
612     (insert-char b0 1)
613     (insert-char b1 1)
614     (insert-char b2 1)
615     (insert-char b3 1)))
616
617 (defsubst comm-format-i32 (int32)
618   (let ((b0 (logand (ash int32 -24) 255))
619         (b1 (logand (ash int32 -16) 255))
620         (b2 (logand (ash int32 -8) 255))
621         (b3 (logand int32 255)))
622     (insert-char b0 1)
623     (insert-char b1 1)
624     (insert-char b2 1)
625     (insert-char b3 1)))
626
627 (defsubst comm-format-u16 (uint16)
628   (let ((b0 (logand (lsh uint16 -8) 255))
629         (b1 (logand uint16 255)))
630     (insert-char b0 1)
631     (insert-char b1 1)))
632
633 (defsubst comm-format-u8 (uint8)
634   (let ((b0 (logand uint8 255)))
635     (insert-char b0 1)))
636
637 ;;; XXX should support other code conversion
638 (defsubst comm-format-u16-string (s)
639   (let ((euc-string (encode-coding-string s egg-fixed-euc)))
640     (insert euc-string)
641     (insert-char 0 1)
642     (insert-char 0 1)))
643
644 ;;; XXX should support other code conversion
645 (defsubst comm-format-mb-string (s)
646   (let ((euc-string (encode-coding-string s egg-mb-euc)))
647     (insert euc-string)
648     (insert-char 0 1)))
649
650 (defsubst comm-format-u8-string (s)
651   (insert s)
652   (insert-char 0 1))
653
654 (defsubst comm-format-u8-vector (s)
655   (insert (concat s)))
656
657 (defsubst comm-format-bytes (s)
658   (insert s)
659   (insert-char 255 1))
660
661 (defmacro comm-format (format &rest args)
662   "Format a string out of a control-list and arguments into the buffer.
663 u means unsigned 32-bit in big endian.
664 i means unsigned 32-bit in big endian.
665 w means unsigned 16-bit in big endian.
666 b means unsigned  8-bit.
667 S means 16-bit(big endian) wide-character string (0x0000 terminated).
668 E means multibyte string (0x00 terminated).
669 s means 8-bit string (0x00 terminated).
670 v means 8-bit vector."
671   (let ((p args) result arg f)
672     (while format
673       (setq arg (car p))
674       (setq f (car format))
675       (setq result
676             (append result
677                     (list
678                      (cond ((eq f 'U) (list 'comm-format-u32c arg))
679                            ((eq f 'u) (list 'comm-format-u32 arg))
680                            ((eq f 'i) (list 'comm-format-i32 arg))
681                            ((eq f 'v) (list 'comm-format-u8-vector arg))
682                            ((eq f 'w) (list 'comm-format-u16 arg))
683                            ((eq f 'b) (list 'comm-format-u8 arg))
684                            ((eq f 'S) (list 'comm-format-u16-string arg))
685                            ((eq f 'E) (list 'comm-format-mb-string arg))
686                            ((eq f 's) (list 'comm-format-u8-string arg))
687                            ((eq f 'B) (list 'comm-format-bytes arg))))))
688       (setq p (cdr p))
689       (setq format (cdr format)))
690     (cons
691      'progn
692      result)))
693 \f
694 ;; Do not move the point, leave it where it was.
695 (defun comm-accept-process-output (proc)
696   (let ((p (point)))
697     (accept-process-output proc)
698     (goto-char p)))
699
700 ;; Assume PROC is bound to the process of current buffer
701 (defsubst comm-following-char-or-wait (proc)
702   (if (eobp)
703       (let ((p (point)))
704         (while (= p (point-max))
705           (accept-process-output proc))
706         (goto-char p)))
707   (following-char))
708
709 (defun comm-following+forward-char (proc)
710   (prog1
711       (comm-following-char-or-wait proc)
712     (forward-char 1)))
713
714 (defsubst comm-unpack-u32c (proc uint32c)
715   (let (h0 h1)
716     (setq h0
717          (+
718           (lsh (comm-following+forward-char proc) 8)
719           (comm-following+forward-char proc)))
720     (setq h1
721          (+
722           (lsh (comm-following+forward-char proc) 8)
723           (comm-following+forward-char proc)))
724     (set uint32c (cons h0 h1))))
725
726 (defsubst comm-unpack-u32 (proc uint32)
727   (set uint32
728        (+
729         (lsh (comm-following+forward-char proc) 24)
730         (lsh (comm-following+forward-char proc) 16)
731         (lsh (comm-following+forward-char proc) 8)
732         (comm-following+forward-char proc))))
733
734 (defsubst comm-unpack-u16 (proc uint16)
735   (set uint16
736        (+
737         (lsh (comm-following+forward-char proc) 8)
738         (comm-following+forward-char proc))))
739
740 (defsubst comm-unpack-u8 (proc uint8)
741   (set uint8
742        (comm-following+forward-char proc)))
743
744 ;;; XXX should support other conversion (euc-kr, cns)
745 (defsubst comm-unpack-u16-string (proc s)
746   (let ((start (point)))
747     (while (not (search-forward "\0\0" nil t))
748       (comm-accept-process-output proc))
749     (set s (string-as-multibyte
750             (buffer-substring start
751                               (+ start
752                                  (decode-coding-region start (- (point) 2)
753                                                        egg-fixed-euc)))))))
754
755 ;;; XXX should support other conversion (euc-kr, cns)
756 (defsubst comm-unpack-mb-string (proc s)
757   (let ((start (point)))
758     (while (not (search-forward "\0" nil t))
759       (comm-accept-process-output proc))
760     (set s (string-as-multibyte
761             (buffer-substring start
762                               (+ start
763                                  (decode-coding-region start (- (point) 1)
764                                                        egg-mb-euc)))))))
765
766 (defsubst comm-unpack-u8-string (proc s)
767   (let ((start (point)))
768     (while (not (search-forward "\0" nil 1))
769       (comm-accept-process-output proc))
770     (set s (buffer-substring start (1- (point))))))
771
772 (defsubst comm-unpack-bytes (proc s)
773   (let ((start (point)))
774     (while (not (search-forward "\377" nil 1))
775       (comm-accept-process-output proc))
776     (set s (buffer-substring start (1- (point))))))
777
778 (defmacro comm-unpack (format &rest args)
779   "Unpack a string out of a control-string and set arguments.
780 u means unsigned 32-bit in big endian.
781 w means unsigned 16-bit in big endian.
782 b means unsigned  8-bit.
783 S means 16-bit(big endian) string (0x0000 terminated).
784 E means multibyte string (0x00 terminated).
785 s means 8-bit string (0x00 terminated).
786 "
787   (let ((p args) result arg f)
788     (while format
789       (setq arg (car p))
790       (setq f (car format))
791       (setq result
792             (append result
793                     (list
794                      (cond ((eq f 'U) (list 'comm-unpack-u32c
795                                             'proc (list 'quote arg)))
796                            ((eq f 'u) (list 'comm-unpack-u32
797                                             'proc (list 'quote arg)))
798                            ((eq f 'w) (list 'comm-unpack-u16
799                                             'proc (list 'quote arg)))
800                            ((eq f 'b) (list 'comm-unpack-u8
801                                             'proc (list 'quote arg)))
802                            ((eq f 'S) (list 'comm-unpack-u16-string
803                                             'proc (list 'quote arg)))
804                            ((eq f 'E) (list 'comm-unpack-mb-string
805                                             'proc (list 'quote arg)))
806                            ((eq f 's) (list 'comm-unpack-u8-string
807                                             'proc (list 'quote arg)))
808                            ((eq f 'B) (list 'comm-unpack-u8-string
809                                             'proc (list 'quote arg)))))))
810       (setq p (cdr p))
811       (setq format (cdr format)))
812     (cons
813      'progn
814      result)))
815 \f
816 (defmacro comm-call-with-proc (proc vlist send-expr &rest receive-exprs)
817   (list
818    'let vlist
819    (append
820     `(save-excursion
821        (set-buffer (process-buffer proc))
822        (erase-buffer)
823        ,send-expr
824        (process-send-region proc (point-min) (point-max))
825        (goto-char (prog1 (point) (accept-process-output proc))))
826     receive-exprs)))
827
828 (defmacro comm-call-with-proc-1 (proc vlist send-expr &rest receive-exprs)
829   (list
830    'let vlist
831    (append
832     `(progn
833        (erase-buffer)
834        ,send-expr
835        (process-send-region proc (point-min) (point-max))
836        (goto-char (prog1 (point) (accept-process-output proc))))
837     receive-exprs)))
838
839 (provide 'egg-com)
840 ;;; egg-com.el ends here.