Mercurial > otakunoraifu
comparison font/codeconv.cc @ 0:223b71206888
Initial import
author | thib |
---|---|
date | Fri, 01 Aug 2008 16:32:45 +0000 |
parents | |
children | 15a18fbe6f21 |
comparison
equal
deleted
inserted
replaced
-1:000000000000 | 0:223b71206888 |
---|---|
1 /* | |
2 * Copyright (c) 2000 Yuki Sawada | |
3 * All rights reserved. | |
4 * | |
5 * Redistribution and use in source and binary forms, with or without | |
6 * modification, are permitted provided that the following conditions | |
7 * are met: | |
8 * 1. Redistributions of source code must retain the above copyright | |
9 * notice, this list of conditions and the following disclaimer. | |
10 * 2. Redistributions in binary form must reproduce the above copyright | |
11 * notice, this list of conditions and the following disclaimer in the | |
12 * documentation and/or other materials provided with the distribution. | |
13 * 3. The name of the author may not be used to endorse or promote products | |
14 * derived from this software without specific prior written permission. | |
15 * | |
16 * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR | |
17 * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES | |
18 * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. | |
19 * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, | |
20 * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT | |
21 * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, | |
22 * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY | |
23 * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT | |
24 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF | |
25 * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. | |
26 */ | |
27 | |
28 #include "codeconv.h" | |
29 #include "codeconv_tbl.h" | |
30 | |
31 static unsigned int | |
32 codeconv_euc_to_jis(unsigned int euc) | |
33 { | |
34 unsigned int hi, low; | |
35 | |
36 hi = (euc >> 8) & 0xff; | |
37 low = euc & 0xff; | |
38 | |
39 if (hi < 0x81) { | |
40 hi = 0; | |
41 } else if (low == 0x8e) | |
42 hi = 0; | |
43 else { | |
44 hi -= 0x80; | |
45 low -= 0x80; | |
46 } | |
47 | |
48 return (hi << 8) | low; | |
49 } | |
50 | |
51 static unsigned int | |
52 codeconv_jis_to_unicode(unsigned int jis) | |
53 { | |
54 int k0, k1; | |
55 | |
56 if (jis < 0x80) return jis; // ASCII | |
57 k0 = (jis >> 8) - 0x20; | |
58 if (k0 < 1 || k0 > 92) | |
59 return 0; | |
60 | |
61 k1 = (jis % 0x100) - 0x20; | |
62 if (k1 < 1 || k1 > 94) | |
63 return 0; | |
64 | |
65 return unicode_tbl[k0 - 1][k1 - 1]; | |
66 } | |
67 | |
68 unsigned int | |
69 codeconv_euc_to_unicode(unsigned int euc) | |
70 { | |
71 unsigned int jis, unicode; | |
72 | |
73 jis = codeconv_euc_to_jis(euc); | |
74 unicode = codeconv_jis_to_unicode(jis); | |
75 | |
76 return unicode; | |
77 } | |
78 | |
79 static unsigned int | |
80 codeconv_unicode_to_jis(unsigned int unicode) | |
81 { | |
82 int k0, k1; | |
83 unsigned int jis; | |
84 | |
85 k0 = (unicode >> 8) & 0xff; | |
86 k1 = unicode & 0xff; | |
87 jis = unicode_rev_table[k0][k1]; | |
88 | |
89 return jis; | |
90 } | |
91 | |
92 static unsigned int | |
93 codeconv_jis_to_euc(unsigned int jis) | |
94 { | |
95 unsigned int hi, low; | |
96 | |
97 hi = (jis >> 8) & 0x7f | 0x80; | |
98 low = jis & 0x7f | 0x80; | |
99 | |
100 return (hi << 8) | low; | |
101 } | |
102 | |
103 unsigned int | |
104 codeconv_unicode_to_euc(unsigned int unicode) | |
105 { | |
106 unsigned int jis, euc; | |
107 | |
108 if (unicode >= 0xff61 && unicode <= 0xff9f) | |
109 return unicode - 0xff61 + 0x8ea1; | |
110 | |
111 jis = codeconv_unicode_to_jis(unicode); | |
112 if (jis == 0) | |
113 return 0x7878; | |
114 euc = codeconv_jis_to_euc(jis); | |
115 | |
116 return euc; | |
117 } | |
118 | |
119 static unsigned int | |
120 codeconv_jis_to_sjis(unsigned int jis) | |
121 { | |
122 unsigned int hi, low; | |
123 | |
124 hi = (jis >> 8) & 0xff; | |
125 low = jis & 0xff; | |
126 | |
127 low += (hi & 0x01) ? 0x1f : 0x7d; | |
128 if (low >= 0x7f) | |
129 low++; | |
130 hi = ((hi - 0x21) >> 1) + 0x81; | |
131 if (hi > 0x9f) | |
132 hi += 0x40; | |
133 | |
134 return (hi << 8) | low; | |
135 } | |
136 | |
137 unsigned int | |
138 codeconv_euc_to_sjis(unsigned int euc) | |
139 { | |
140 unsigned int jis, sjis; | |
141 | |
142 jis = codeconv_euc_to_jis(euc); | |
143 sjis = codeconv_jis_to_sjis(jis); | |
144 | |
145 return sjis; | |
146 } | |
147 | |
148 static unsigned int | |
149 codeconv_sjis_to_jis(unsigned int sjis) | |
150 { | |
151 unsigned int hi, low; | |
152 | |
153 hi = (sjis >> 8) & 0xff; | |
154 low = sjis & 0xff; | |
155 | |
156 hi -= (hi <= 0x9f) ? 0x71 : 0xb1; | |
157 hi = (hi << 1) + 1; | |
158 if (low > 0x7f) | |
159 low--; | |
160 if (low >= 0x9e) { | |
161 low -= 0x7d; | |
162 hi++; | |
163 } else | |
164 low -= 0x1f; | |
165 | |
166 return (hi << 8) | low; | |
167 } | |
168 | |
169 unsigned int | |
170 codeconv_sjis_to_euc(unsigned int sjis) | |
171 { | |
172 unsigned int jis, euc; | |
173 | |
174 jis = codeconv_sjis_to_jis(sjis); | |
175 euc = codeconv_jis_to_euc(jis); | |
176 | |
177 return euc; | |
178 } | |
179 | |
180 unsigned int | |
181 codeconv_euc_to_latin1(unsigned int euc) | |
182 { | |
183 int high = (euc>>8) & 0xff; | |
184 if (high) return 0; | |
185 return euc & 0xff; | |
186 } |