History

My first initial commit with all of mine experimental changes.

Dmitry Kabak (userdima committed 13 years ago

Commit d37b88d1 parent 3f5b46618352 files · +2598093 −-8690Browse files

Showing the changes to java/pkg/sun/io/CharToByteEUC.java (1 of 18352 files). Show all

Unified · Split

java/pkg/sun/io/CharToByteEUC.java+256−0
@@ -0,0 +1,256 @@
1+/*
2+ * Copyright (c) 1997, Oracle and/or its affiliates. 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. Oracle designates this
8+ * particular file as subject to the "Classpath" exception as provided
9+ * by Oracle 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 Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
22+ * or visit www.oracle.com if you need additional information or have any
23+ * questions.
24+ */
25+package sun.io;
26+
27+public abstract class CharToByteEUC extends CharToByteConverter
28+{
29+
30+ private char highHalfZoneCode;
31+ private byte[] outputByte;
32+
33+ protected short index1[];
34+ protected String index2;
35+ protected String index2a;
36+ protected String index2b;
37+ protected String index2c;
38+ protected int mask1;
39+ protected int mask2;
40+ protected int shift;
41+
42+ private byte[] workByte = new byte[4];
43+
44+ /**
45+ * flush out any residual data and reset the buffer state
46+ */
47+ public int flush(byte [] output, int outStart, int outEnd)
48+ throws MalformedInputException, ConversionBufferFullException
49+ {
50+
51+ if (highHalfZoneCode != 0) {
52+ reset();
53+ badInputLength = 0;
54+ throw new MalformedInputException();
55+ }
56+
57+ reset();
58+ return 0;
59+ }
60+
61+ /**
62+ * Character conversion
63+ */
64+ public int convert(char[] input, int inOff, int inEnd,
65+ byte[] output, int outOff, int outEnd)
66+ throws UnknownCharacterException, MalformedInputException,
67+ ConversionBufferFullException
68+ {
69+ char inputChar;
70+ int inputSize;
71+
72+ byteOff = outOff;
73+ charOff = inOff;
74+
75+ while(charOff < inEnd) {
76+
77+ outputByte = workByte;
78+
79+ int index;
80+ int theBytes;
81+ int spaceNeeded;
82+ boolean allZeroes = true;
83+ int i;
84+
85+
86+ if (highHalfZoneCode == 0) {
87+ inputChar = input[charOff];
88+ inputSize = 1;
89+ } else {
90+ inputChar = highHalfZoneCode;
91+ inputSize = 0;
92+ highHalfZoneCode = 0;
93+ }
94+
95+
96+ // Is this a high surrogate?
97+ if(inputChar >= '\ud800' && inputChar <= '\udbff') {
98+ // Is this the last character of the input?
99+ if (charOff + inputSize >= inEnd) {
100+ highHalfZoneCode = inputChar;
101+ charOff += inputSize;
102+ break;
103+ }
104+
105+ // Is there a low surrogate following?
106+ inputChar = input[charOff + inputSize];
107+ if (inputChar >= '\udc00' && inputChar <= '\udfff') {
108+
109+ // We have a valid surrogate pair. Too bad we don't do
110+ // surrogates. Is substitution enabled?
111+ if (subMode) {
112+ outputByte = subBytes;
113+ inputSize++;
114+ } else {
115+ badInputLength = 2;
116+ throw new UnknownCharacterException();
117+ }
118+ } else {
119+
120+ // We have a malformed surrogate pair
121+ badInputLength = 1;
122+ throw new MalformedInputException();
123+ }
124+ }
125+
126+ // Is this an unaccompanied low surrogate?
127+ else
128+ if (inputChar >= '\uDC00' && inputChar <= '\uDFFF') {
129+ badInputLength = 1;
130+ throw new MalformedInputException();
131+ } else {
132+
133+ String theChars;
134+ char aChar;
135+
136+ // We have a valid character, get the bytes for it
137+ index = index1[((inputChar & mask1) >> shift)] + (inputChar & mask2);
138+
139+ if (index < 7500)
140+ theChars = index2;
141+ else
142+ if (index < 15000) {
143+ index = index - 7500;
144+ theChars = index2a;
145+ }
146+ else
147+ if (index < 22500){
148+ index = index - 15000;
149+ theChars = index2b;
150+ }
151+ else {
152+ index = index - 22500;
153+ theChars = index2c;
154+ }
155+
156+ aChar = theChars.charAt(2*index);
157+ outputByte[0] = (byte)((aChar & 0xff00)>>8);
158+ outputByte[1] = (byte)(aChar & 0x00ff);
159+ aChar = theChars.charAt(2*index + 1);
160+ outputByte[2] = (byte)((aChar & 0xff00)>>8);
161+ outputByte[3] = (byte)(aChar & 0x00ff);
162+ }
163+
164+ // if there was no mapping - look for substitution characters
165+
166+ for (i = 0; i < outputByte.length; i++) {
167+ if (outputByte[i] != 0x00) {
168+ allZeroes = false;
169+ break;
170+ }
171+ }
172+
173+ if (allZeroes && inputChar != '\u0000')
174+ {
175+ if (subMode) {
176+ outputByte = subBytes;
177+ } else {
178+ badInputLength = 1;
179+ throw new UnknownCharacterException();
180+ }
181+ }
182+
183+ int oindex = 0;
184+ for (spaceNeeded = outputByte.length; spaceNeeded > 1; spaceNeeded--){
185+ if (outputByte[oindex++] != 0x00 )
186+ break;
187+ }
188+
189+ if (byteOff + spaceNeeded > outEnd)
190+ throw new ConversionBufferFullException();
191+
192+
193+ for (i = outputByte.length - spaceNeeded; i < outputByte.length; i++) {
194+ output[byteOff++] = outputByte[i];
195+ }
196+
197+ charOff += inputSize;
198+ }
199+
200+ return byteOff - outOff;
201+ }
202+
203+ /**
204+ * Resets converter to its initial state.
205+ */
206+ public void reset() {
207+ charOff = byteOff = 0;
208+ highHalfZoneCode = 0;
209+ }
210+
211+ /**
212+ * Returns the maximum number of bytes needed to convert a char.
213+ */
214+ public int getMaxBytesPerChar() {
215+ return 2;
216+ }
217+
218+
219+ /**
220+ * Returns true if the given character can be converted to the
221+ * target character encoding.
222+ */
223+ public boolean canConvert(char ch) {
224+ int index;
225+ String theChars;
226+
227+ index = index1[((ch & mask1) >> shift)] + (ch & mask2);
228+
229+ if (index < 7500)
230+ theChars = index2;
231+ else
232+ if (index < 15000) {
233+ index = index - 7500;
234+ theChars = index2a;
235+ }
236+ else
237+ if (index < 22500){
238+ index = index - 15000;
239+ theChars = index2b;
240+ }
241+ else {
242+ index = index - 22500;
243+ theChars = index2c;
244+ }
245+
246+ if (theChars.charAt(2*index) != '\u0000' ||
247+ theChars.charAt(2*index + 1) != '\u0000')
248+ return (true);
249+
250+ // only return true if input char was unicode null - all others are
251+ // undefined
252+ return( ch == '\u0000');
253+
254+ }
255+
256+}