blob: dfbd2ac8455a25c46a4eb3a9f0cfe8788a458c24 [file] [log] [blame]
J. Duke319a3b92007-12-01 00:00:00 +00001/*
2 * Copyright 1997-2005 Sun Microsystems, Inc. All Rights Reserved.
3 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
4 *
5 * This code is free software; you can redistribute it and/or modify it
6 * under the terms of the GNU General Public License version 2 only, as
7 * published by the Free Software Foundation. Sun designates this
8 * particular file as subject to the "Classpath" exception as provided
9 * by Sun in the LICENSE file that accompanied this code.
10 *
11 * This code is distributed in the hope that it will be useful, but WITHOUT
12 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
13 * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
14 * version 2 for more details (a copy is included in the LICENSE file that
15 * accompanied this code).
16 *
17 * You should have received a copy of the GNU General Public License version
18 * 2 along with this work; if not, write to the Free Software Foundation,
19 * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
20 *
21 * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara,
22 * CA 95054 USA or visit www.sun.com if you need additional information or
23 * have any questions.
24 */
25
26package sun.awt;
27
28import java.nio.ByteBuffer;
29import java.nio.CharBuffer;
30import java.nio.charset.*;
31
32public class Symbol extends Charset {
33 public Symbol () {
34 super("Symbol", null);
35 }
36 public CharsetEncoder newEncoder() {
37 return new Encoder(this);
38 }
39
40 /* Seems like supporting a decoder is required, but we aren't going
41 * to be publically exposing this class, so no need to waste work
42 */
43 public CharsetDecoder newDecoder() {
44 throw new Error("Decoder is not implemented for Symbol Charset");
45 }
46
47 public boolean contains(Charset cs) {
48 return cs instanceof Symbol;
49 }
50
51 private static class Encoder extends CharsetEncoder {
52 public Encoder(Charset cs) {
53 super(cs, 1.0f, 1.0f);
54 }
55
56 public boolean canEncode(char c) {
57 if (c >= 0x2200 && c <= 0x22ef) {
58 if (table_math[c - 0x2200] != 0x00) {
59 return true;
60 }
61 } else if (c >= 0x0391 && c <= 0x03d6) {
62 if (table_greek[c - 0x0391] != 0x00) {
63 return true;
64 }
65 }
66 return false;
67 }
68
69 protected CoderResult encodeLoop(CharBuffer src, ByteBuffer dst) {
70 char[] sa = src.array();
71 int sp = src.arrayOffset() + src.position();
72 int sl = src.arrayOffset() + src.limit();
73 assert (sp <= sl);
74 sp = (sp <= sl ? sp : sl);
75 byte[] da = dst.array();
76 int dp = dst.arrayOffset() + dst.position();
77 int dl = dst.arrayOffset() + dst.limit();
78 assert (dp <= dl);
79 dp = (dp <= dl ? dp : dl);
80
81 try {
82 while (sp < sl) {
83 char c = sa[sp];
84 if (dl - dp < 1)
85 return CoderResult.OVERFLOW;
86 if (!canEncode(c))
87 return CoderResult.unmappableForLength(1);
88 sp++;
89 if (c >= 0x2200 && c <= 0x22ef){
90 da[dp++] = table_math[c - 0x2200];
91 } else if (c >= 0x0391 && c <= 0x03d6) {
92 da[dp++]= table_greek[c - 0x0391];
93 }
94 }
95 return CoderResult.UNDERFLOW;
96 } finally {
97 src.position(sp - src.arrayOffset());
98 dst.position(dp - dst.arrayOffset());
99 }
100 }
101
102 private static byte[] table_math = {
103 (byte)0042, (byte)0000, (byte)0144, (byte)0044,
104 (byte)0000, (byte)0306, (byte)0104, (byte)0321, // 00
105 (byte)0316, (byte)0317, (byte)0000, (byte)0000,
106 (byte)0000, (byte)0047, (byte)0000, (byte)0120,
107 (byte)0000, (byte)0345, (byte)0055, (byte)0000,
108 (byte)0000, (byte)0244, (byte)0000, (byte)0052, // 10
109 (byte)0260, (byte)0267, (byte)0326, (byte)0000,
110 (byte)0000, (byte)0265, (byte)0245, (byte)0000,
111 (byte)0000, (byte)0000, (byte)0000, (byte)0275,
112 (byte)0000, (byte)0000, (byte)0000, (byte)0331, // 20
113 (byte)0332, (byte)0307, (byte)0310, (byte)0362,
114 (byte)0000, (byte)0000, (byte)0000, (byte)0000,
115 (byte)0000, (byte)0000, (byte)0000, (byte)0000,
116 (byte)0134, (byte)0000, (byte)0000, (byte)0000, // 30
117 (byte)0000, (byte)0000, (byte)0000, (byte)0000,
118 (byte)0176, (byte)0000, (byte)0000, (byte)0000,
119 (byte)0000, (byte)0000, (byte)0000, (byte)0000,
120 (byte)0000, (byte)0100, (byte)0000, (byte)0000, // 40
121 (byte)0273, (byte)0000, (byte)0000, (byte)0000,
122 (byte)0000, (byte)0000, (byte)0000, (byte)0000,
123 (byte)0000, (byte)0000, (byte)0000, (byte)0000,
124 (byte)0000, (byte)0000, (byte)0000, (byte)0000, // 50
125 (byte)0000, (byte)0000, (byte)0000, (byte)0000,
126 (byte)0000, (byte)0000, (byte)0000, (byte)0000,
127 (byte)0271, (byte)0272, (byte)0000, (byte)0000,
128 (byte)0243, (byte)0263, (byte)0000, (byte)0000, // 60
129 (byte)0000, (byte)0000, (byte)0000, (byte)0000,
130 (byte)0000, (byte)0000, (byte)0000, (byte)0000,
131 (byte)0000, (byte)0000, (byte)0000, (byte)0000,
132 (byte)0000, (byte)0000, (byte)0000, (byte)0000, // 70
133 (byte)0000, (byte)0000, (byte)0000, (byte)0000,
134 (byte)0000, (byte)0000, (byte)0000, (byte)0000,
135 (byte)0000, (byte)0000, (byte)0314, (byte)0311,
136 (byte)0313, (byte)0000, (byte)0315, (byte)0312, // 80
137 (byte)0000, (byte)0000, (byte)0000, (byte)0000,
138 (byte)0000, (byte)0000, (byte)0000, (byte)0000,
139 (byte)0000, (byte)0000, (byte)0000, (byte)0000,
140 (byte)0000, (byte)0305, (byte)0000, (byte)0304, // 90
141 (byte)0000, (byte)0000, (byte)0000, (byte)0000,
142 (byte)0000, (byte)0000, (byte)0000, (byte)0000,
143 (byte)0000, (byte)0000, (byte)0000, (byte)0000,
144 (byte)0000, (byte)0136, (byte)0000, (byte)0000, // a0
145 (byte)0000, (byte)0000, (byte)0000, (byte)0000,
146 (byte)0000, (byte)0000, (byte)0000, (byte)0000,
147 (byte)0000, (byte)0000, (byte)0000, (byte)0000,
148 (byte)0000, (byte)0000, (byte)0000, (byte)0000, // b0
149 (byte)0000, (byte)0000, (byte)0000, (byte)0000,
150 (byte)0000, (byte)0000, (byte)0000, (byte)0000,
151 (byte)0000, (byte)0000, (byte)0000, (byte)0000,
152 (byte)0340, (byte)0327, (byte)0000, (byte)0000, // c0
153 (byte)0000, (byte)0000, (byte)0000, (byte)0000,
154 (byte)0000, (byte)0000, (byte)0000, (byte)0000,
155 (byte)0000, (byte)0000, (byte)0000, (byte)0000,
156 (byte)0000, (byte)0000, (byte)0000, (byte)0000, // d0
157 (byte)0000, (byte)0000, (byte)0000, (byte)0000,
158 (byte)0000, (byte)0000, (byte)0000, (byte)0000,
159 (byte)0000, (byte)0000, (byte)0000, (byte)0000,
160 (byte)0000, (byte)0000, (byte)0000, (byte)0000, // e0
161 (byte)0000, (byte)0000, (byte)0000, (byte)0000,
162 (byte)0000, (byte)0000, (byte)0000, (byte)0274,
163 };
164
165 private static byte[] table_greek = {
166 (byte)0101, (byte)0102, (byte)0107,
167 (byte)0104, (byte)0105, (byte)0132, (byte)0110, // 90
168 (byte)0121, (byte)0111, (byte)0113, (byte)0114,
169 (byte)0115, (byte)0116, (byte)0130, (byte)0117,
170 (byte)0120, (byte)0122, (byte)0000, (byte)0123,
171 (byte)0124, (byte)0125, (byte)0106, (byte)0103, // a0
172 (byte)0131, (byte)0127, (byte)0000, (byte)0000,
173 (byte)0000, (byte)0000, (byte)0000, (byte)0000,
174 (byte)0000, (byte)0141, (byte)0142, (byte)0147,
175 (byte)0144, (byte)0145, (byte)0172, (byte)0150, // b0
176 (byte)0161, (byte)0151, (byte)0153, (byte)0154,
177 (byte)0155, (byte)0156, (byte)0170, (byte)0157,
178 (byte)0160, (byte)0162, (byte)0126, (byte)0163,
179 (byte)0164, (byte)0165, (byte)0146, (byte)0143, // c0
180 (byte)0171, (byte)0167, (byte)0000, (byte)0000,
181 (byte)0000, (byte)0000, (byte)0000, (byte)0000,
182 (byte)0000, (byte)0112, (byte)0241, (byte)0000,
183 (byte)0000, (byte)0152, (byte)0166, // d0
184 };
185
186 /* The default implementation creates a decoder and we don't have one */
187 public boolean isLegalReplacement(byte[] repl) {
188 return true;
189 }
190 }
191}