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/CharToByteDBCS_ASCII.java (1 of 18352 files). Show all

Unified · Split

java/pkg/sun/io/CharToByteDBCS_ASCII.java+195−0
@@ -0,0 +1,195 @@
1/*
2 * Copyright (c) 1997, 2010, 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 */
25package sun.io;
26
27import sun.nio.cs.ext.DoubleByte;
28import static sun.nio.cs.CharsetMapping.*;
29
30public abstract class CharToByteDBCS_ASCII extends CharToByteConverter
31{
32
33 private char highHalfZoneCode;
34 private byte[] outputByte = new byte[2];
35
36 private DoubleByte.Encoder enc;
37
38 public CharToByteDBCS_ASCII(DoubleByte.Encoder enc) {
39 super();
40 this.enc = enc;
41 }
42
43 int encodeChar(char c) {
44 return enc.encodeChar(c);
45 }
46
47 /**
48 * flush out any residual data and reset the buffer state
49 */
50 public int flush(byte [] output, int outStart, int outEnd)
51 throws MalformedInputException, ConversionBufferFullException
52 {
53
54 if (highHalfZoneCode != 0) {
55 reset();
56 badInputLength = 0;
57 throw new MalformedInputException();
58 }
59
60 reset();
61 return 0;
62 }
63
64 /**
65 * Character conversion
66 */
67 public int convert(char[] input, int inOff, int inEnd,
68 byte[] output, int outOff, int outEnd)
69 throws UnknownCharacterException, MalformedInputException,
70 ConversionBufferFullException
71 {
72 char inputChar;
73 int inputSize;
74
75 byteOff = outOff;
76 charOff = inOff;
77
78 while(charOff < inEnd) {
79 int index;
80 int theBytes;
81 int spaceNeeded;
82
83 if (highHalfZoneCode == 0) {
84 inputChar = input[charOff];
85 inputSize = 1;
86 } else {
87 inputChar = highHalfZoneCode;
88 inputSize = 0;
89 highHalfZoneCode = 0;
90 }
91
92 // Is this a high surrogate?
93 if (Character.isHighSurrogate(inputChar)) {
94 // Is this the last character of the input?
95 if (charOff + inputSize >= inEnd) {
96 highHalfZoneCode = inputChar;
97 charOff += inputSize;
98 break;
99 }
100
101 // Is there a low surrogate following?
102 inputChar = input[charOff + inputSize];
103 if (Character.isLowSurrogate(inputChar)) {
104 // We have a valid surrogate pair. Too bad we don't do
105 // surrogates. Is substitution enabled?
106 if (subMode) {
107 if (subBytes.length == 1) {
108 outputByte[0] = 0x00;
109 outputByte[1] = subBytes[0];
110 }
111 else {
112 outputByte[0] = subBytes[0];
113 outputByte[1] = subBytes[1];
114 }
115 inputSize++;
116 } else {
117 badInputLength = 2;
118 throw new UnknownCharacterException();
119 }
120 } else {
121 // We have a malformed surrogate pair
122 badInputLength = 1;
123 throw new MalformedInputException();
124 }
125 }
126 // Is this an unaccompanied low surrogate?
127 else if (Character.isLowSurrogate(inputChar)) {
128 badInputLength = 1;
129 throw new MalformedInputException();
130 } else {
131
132 // We have a valid character, get the bytes for it
133 theBytes = encodeChar(inputChar);
134 if (theBytes == UNMAPPABLE_ENCODING) {
135 // if there was no mapping - look for substitution characters
136 if (subMode) {
137 if (subBytes.length == 1) {
138 outputByte[0] = 0x00;
139 outputByte[1] = subBytes[0];
140 } else {
141 outputByte[0] = subBytes[0];
142 outputByte[1] = subBytes[1];
143 }
144 } else {
145 badInputLength = 1;
146 throw new UnknownCharacterException();
147 }
148 } else {
149 outputByte[0] = (byte)(theBytes >>8);
150 outputByte[1] = (byte)theBytes;
151 }
152 }
153 if (outputByte[0] == 0x00)
154 spaceNeeded = 1;
155 else
156 spaceNeeded = 2;
157
158 if (byteOff + spaceNeeded > outEnd)
159 throw new ConversionBufferFullException();
160
161 if (spaceNeeded == 1)
162 output[byteOff++] = outputByte[1];
163 else {
164 output[byteOff++] = outputByte[0];
165 output[byteOff++] = outputByte[1];
166 }
167
168 charOff += inputSize;
169 }
170 return byteOff - outOff;
171 }
172
173 /**
174 * Resets converter to its initial state.
175 */
176 public void reset() {
177 charOff = byteOff = 0;
178 highHalfZoneCode = 0;
179 }
180
181 /**
182 * Returns the maximum number of bytes needed to convert a char.
183 */
184 public int getMaxBytesPerChar() {
185 return 2;
186 }
187
188 /**
189 * Returns true if the given character can be converted to the
190 * target character encoding.
191 */
192 public boolean canConvert(char c) {
193 return encodeChar(c) != UNMAPPABLE_ENCODING;
194 }
195}