summaryrefslogtreecommitdiff
path: root/gnu/java/nio/charset/UTF_16Encoder.java
diff options
context:
space:
mode:
authorSven de Marothy <sven@physto.se>2005-04-08 21:46:05 +0000
committerSven de Marothy <sven@physto.se>2005-04-08 21:46:05 +0000
commitd619022a1d1b94506f2774b82daea02dde462e44 (patch)
tree6628305b0ea627dc0a037df9c7e18e91d83ed62f /gnu/java/nio/charset/UTF_16Encoder.java
parent9d37c49002f196b5aeb3a237903b1f0a23d77d1c (diff)
downloadclasspath-d619022a1d1b94506f2774b82daea02dde462e44.tar.gz
2005-04-08 Sven de Marothy <sven@physto.se>
* gnu/java/nio/charset/Provider.java: Add new charsets. * gnu/java/nio/charset/UTF_16.java: Default to using BOM. * gnu/java/nio/charset/UTF_16Decoder.java: Minor fixes. * gnu/java/nio/charset/UTF_16Encoder.java, Use NIO's built-in byte-ordering instead. * gnu/java/nio/charset/UTF_8.java, (Decoder): Correct values of maximum chars per byte. (decodeLoop): Handle 4-byte surrogates. * gnu/java/nio/charset/ByteCharset.java * gnu/java/nio/charset/Cp424.java * gnu/java/nio/charset/Cp437.java * gnu/java/nio/charset/Cp737.java * gnu/java/nio/charset/Cp775.java * gnu/java/nio/charset/Cp850.java * gnu/java/nio/charset/Cp852.java * gnu/java/nio/charset/Cp855.java * gnu/java/nio/charset/Cp857.java * gnu/java/nio/charset/Cp860.java * gnu/java/nio/charset/Cp861.java * gnu/java/nio/charset/Cp862.java * gnu/java/nio/charset/Cp863.java * gnu/java/nio/charset/Cp864.java * gnu/java/nio/charset/Cp865.java * gnu/java/nio/charset/Cp866.java * gnu/java/nio/charset/Cp869.java * gnu/java/nio/charset/Cp874.java * gnu/java/nio/charset/EncodingHelper.java * gnu/java/nio/charset/ISO_8859_13.java * gnu/java/nio/charset/ISO_8859_15.java * gnu/java/nio/charset/ISO_8859_2.java * gnu/java/nio/charset/ISO_8859_3.java * gnu/java/nio/charset/ISO_8859_4.java * gnu/java/nio/charset/ISO_8859_5.java * gnu/java/nio/charset/ISO_8859_6.java * gnu/java/nio/charset/ISO_8859_7.java * gnu/java/nio/charset/ISO_8859_8.java * gnu/java/nio/charset/ISO_8859_9.java * gnu/java/nio/charset/KOI_8.java * gnu/java/nio/charset/MS874.java * gnu/java/nio/charset/MacCentralEurope.java * gnu/java/nio/charset/MacCroatian.java * gnu/java/nio/charset/MacCyrillic.java * gnu/java/nio/charset/MacDingbat.java * gnu/java/nio/charset/MacGreek.java * gnu/java/nio/charset/MacIceland.java * gnu/java/nio/charset/MacRoman.java * gnu/java/nio/charset/MacRomania.java * gnu/java/nio/charset/MacSymbol.java * gnu/java/nio/charset/MacThai.java * gnu/java/nio/charset/MacTurkish.java * gnu/java/nio/charset/Windows1250.java * gnu/java/nio/charset/Windows1251.java * gnu/java/nio/charset/Windows1252.java * gnu/java/nio/charset/Windows1253.java * gnu/java/nio/charset/Windows1254.java * gnu/java/nio/charset/Windows1255.java * gnu/java/nio/charset/Windows1256.java * gnu/java/nio/charset/Windows1257.java * gnu/java/nio/charset/Windows1258.java New files.
Diffstat (limited to 'gnu/java/nio/charset/UTF_16Encoder.java')
-rw-r--r--gnu/java/nio/charset/UTF_16Encoder.java48
1 files changed, 19 insertions, 29 deletions
diff --git a/gnu/java/nio/charset/UTF_16Encoder.java b/gnu/java/nio/charset/UTF_16Encoder.java
index 8026e027b..b396c7304 100644
--- a/gnu/java/nio/charset/UTF_16Encoder.java
+++ b/gnu/java/nio/charset/UTF_16Encoder.java
@@ -38,6 +38,7 @@ exception statement from your version. */
package gnu.java.nio.charset;
import java.nio.ByteBuffer;
+import java.nio.ByteOrder;
import java.nio.CharBuffer;
import java.nio.charset.Charset;
import java.nio.charset.CharsetEncoder;
@@ -54,20 +55,21 @@ final class UTF_16Encoder extends CharsetEncoder
static final int BIG_ENDIAN = 0;
static final int LITTLE_ENDIAN = 1;
- private static final char BYTE_ORDER_MARK = '\uFEFF';
+ private static final char BYTE_ORDER_MARK = 0xFEFF;
- private final int byteOrder;
+ private final ByteOrder byteOrder;
private final boolean useByteOrderMark;
private boolean needsByteOrderMark;
UTF_16Encoder (Charset cs, int byteOrder, boolean useByteOrderMark)
{
super (cs, 2.0f,
- useByteOrderMark ? 2.0f : 4.0f,
+ useByteOrderMark ? 4.0f : 2.0f,
byteOrder == BIG_ENDIAN
? new byte[] { (byte) 0xFF, (byte) 0xFD }
: new byte[] { (byte) 0xFD, (byte) 0xFF });
- this.byteOrder = byteOrder;
+ this.byteOrder = (byteOrder == BIG_ENDIAN) ?
+ ByteOrder.BIG_ENDIAN : ByteOrder.LITTLE_ENDIAN;
this.useByteOrderMark = useByteOrderMark;
this.needsByteOrderMark = useByteOrderMark;
}
@@ -76,11 +78,17 @@ final class UTF_16Encoder extends CharsetEncoder
{
// TODO: Optimize this in the case in.hasArray() / out.hasArray()
+ ByteOrder originalBO = out.order();
+ out.order(byteOrder);
+
if (needsByteOrderMark)
{
if (out.remaining () < 2)
- return CoderResult.OVERFLOW;
- put (out, BYTE_ORDER_MARK);
+ {
+ out.order(originalBO);
+ return CoderResult.OVERFLOW;
+ }
+ out.putChar (BYTE_ORDER_MARK);
needsByteOrderMark = false;
}
@@ -90,7 +98,6 @@ final class UTF_16Encoder extends CharsetEncoder
while (in.hasRemaining ())
{
char c = in.get ();
-
if (0xD800 <= c && c <= 0xDFFF)
{
// c is a surrogate
@@ -104,19 +111,20 @@ final class UTF_16Encoder extends CharsetEncoder
// make sure d is a low surrogate
if (d < 0xDC00 || d > 0xDFFF)
return CoderResult.malformedForLength (1);
- put (out, c);
- put (out, d);
+ out.putChar (c);
+ out.putChar (d);
inPos += 2;
}
else
{
+ out.order(originalBO);
if (out.remaining () < 2)
return CoderResult.OVERFLOW;
- put (out, c);
+ out.putChar (c);
inPos++;
}
}
-
+ out.order(originalBO);
return CoderResult.UNDERFLOW;
}
finally
@@ -125,24 +133,6 @@ final class UTF_16Encoder extends CharsetEncoder
}
}
- /**
- * Writes <code>c</code> to <code>out</code> in the byte order
- * specified by <code>byteOrder</code>.
- **/
- private void put (ByteBuffer out, char c)
- {
- if (byteOrder == BIG_ENDIAN)
- {
- out.put ((byte) (c >> 8));
- out.put ((byte) (c & 0xFF));
- }
- else
- {
- out.put ((byte) (c & 0xFF));
- out.put ((byte) (c >> 8));
- }
- }
-
protected void implReset ()
{
needsByteOrderMark = useByteOrderMark;