Initial revision

From-SVN: r102074
This commit is contained in:
Tom Tromey
2005-07-16 00:30:23 +00:00
parent 6f4434b39b
commit f911ba985a
4557 changed files with 1000262 additions and 0 deletions
@@ -0,0 +1,53 @@
/* CharacterCodingException.java --
Copyright (C) 2002 Free Software Foundation, Inc.
This file is part of GNU Classpath.
GNU Classpath is free software; you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation; either version 2, or (at your option)
any later version.
GNU Classpath is distributed in the hope that it will be useful, but
WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
General Public License for more details.
You should have received a copy of the GNU General Public License
along with GNU Classpath; see the file COPYING. If not, write to the
Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
02110-1301 USA.
Linking this library statically or dynamically with other modules is
making a combined work based on this library. Thus, the terms and
conditions of the GNU General Public License cover the whole
combination.
As a special exception, the copyright holders of this library give you
permission to link this library with independent modules to produce an
executable, regardless of the license terms of these independent
modules, and to copy and distribute the resulting executable under
terms of your choice, provided that you also meet, for each linked
independent module, the terms and conditions of the license of that
module. An independent module is a module which is not derived from
or based on this library. If you modify this library, you may extend
this exception to your version of the library, but you are not
obligated to do so. If you do not wish to do so, delete this
exception statement from your version. */
package java.nio.charset;
import java.io.IOException;
/**
* @since 1.4
*/
public class CharacterCodingException extends IOException
{
/**
* Creates the exception
*/
public CharacterCodingException()
{
}
}
@@ -0,0 +1,406 @@
/* Charset.java --
Copyright (C) 2002, 2004, 2005 Free Software Foundation, Inc.
This file is part of GNU Classpath.
GNU Classpath is free software; you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation; either version 2, or (at your option)
any later version.
GNU Classpath is distributed in the hope that it will be useful, but
WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
General Public License for more details.
You should have received a copy of the GNU General Public License
along with GNU Classpath; see the file COPYING. If not, write to the
Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
02110-1301 USA.
Linking this library statically or dynamically with other modules is
making a combined work based on this library. Thus, the terms and
conditions of the GNU General Public License cover the whole
combination.
As a special exception, the copyright holders of this library give you
permission to link this library with independent modules to produce an
executable, regardless of the license terms of these independent
modules, and to copy and distribute the resulting executable under
terms of your choice, provided that you also meet, for each linked
independent module, the terms and conditions of the license of that
module. An independent module is a module which is not derived from
or based on this library. If you modify this library, you may extend
this exception to your version of the library, but you are not
obligated to do so. If you do not wish to do so, delete this
exception statement from your version. */
package java.nio.charset;
import gnu.classpath.SystemProperties;
import gnu.java.nio.charset.Provider;
import gnu.java.nio.charset.iconv.IconvProvider;
import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.net.URL;
import java.nio.ByteBuffer;
import java.nio.CharBuffer;
import java.nio.charset.spi.CharsetProvider;
import java.util.Collections;
import java.util.Enumeration;
import java.util.HashSet;
import java.util.Iterator;
import java.util.LinkedHashSet;
import java.util.Locale;
import java.util.Set;
import java.util.SortedMap;
import java.util.TreeMap;
/**
* @author Jesse Rosenstock
* @since 1.4
* @status updated to 1.5
*/
public abstract class Charset implements Comparable
{
private CharsetEncoder cachedEncoder;
private CharsetDecoder cachedDecoder;
/**
* Charset providers.
*/
private static CharsetProvider[] providers;
private final String canonicalName;
private final String[] aliases;
protected Charset (String canonicalName, String[] aliases)
{
checkName (canonicalName);
if (aliases != null)
{
int n = aliases.length;
for (int i = 0; i < n; ++i)
checkName (aliases[i]);
}
cachedEncoder = null;
cachedDecoder = null;
this.canonicalName = canonicalName;
this.aliases = aliases;
}
/**
* @throws IllegalCharsetNameException if the name is illegal
*/
private static void checkName (String name)
{
int n = name.length ();
if (n == 0)
throw new IllegalCharsetNameException (name);
char ch = name.charAt (0);
if (!(('A' <= ch && ch <= 'Z')
|| ('a' <= ch && ch <= 'z')
|| ('0' <= ch && ch <= '9')))
throw new IllegalCharsetNameException (name);
for (int i = 1; i < n; ++i)
{
ch = name.charAt (i);
if (!(('A' <= ch && ch <= 'Z')
|| ('a' <= ch && ch <= 'z')
|| ('0' <= ch && ch <= '9')
|| ch == '-' || ch == '.' || ch == ':' || ch == '_'))
throw new IllegalCharsetNameException (name);
}
}
/**
* Returns the system default charset.
*
* This may be set by the user or VM with the file.encoding
* property.
*/
public static Charset defaultCharset()
{
String encoding;
try
{
encoding = SystemProperties.getProperty("file.encoding");
}
catch(SecurityException e)
{
// Use fallback.
encoding = "ISO-8859-1";
}
catch(IllegalArgumentException e)
{
// Use fallback.
encoding = "ISO-8859-1";
}
try
{
return forName(encoding);
}
catch(UnsupportedCharsetException e)
{
// Ignore.
}
catch(IllegalCharsetNameException e)
{
// Ignore.
}
catch(IllegalArgumentException e)
{
// Ignore.
}
throw new IllegalStateException("Can't get default charset!");
}
public static boolean isSupported (String charsetName)
{
return charsetForName (charsetName) != null;
}
/**
* Returns the Charset instance for the charset of the given name.
*
* @param charsetName
* @return
* @throws UnsupportedCharsetException if this VM does not support
* the charset of the given name.
* @throws IllegalCharsetNameException if the given charset name is
* legal.
* @throws IllegalArgumentException if <code>charsetName</code> is null.
*/
public static Charset forName (String charsetName)
{
// Throws IllegalArgumentException as the JDK does.
if(charsetName == null)
throw new IllegalArgumentException("Charset name must not be null.");
Charset cs = charsetForName (charsetName);
if (cs == null)
throw new UnsupportedCharsetException (charsetName);
return cs;
}
/**
* Retrieves a charset for the given charset name.
*
* @return A charset object for the charset with the specified name, or
* <code>null</code> if no such charset exists.
*
* @throws IllegalCharsetNameException if the name is illegal
*/
private static Charset charsetForName(String charsetName)
{
checkName (charsetName);
Charset cs = null;
CharsetProvider[] providers = providers2();
for (int i = 0; i < providers.length; i++)
{
cs = providers[i].charsetForName(charsetName);
if (cs != null)
break;
}
return cs;
}
public static SortedMap availableCharsets()
{
TreeMap charsets = new TreeMap(String.CASE_INSENSITIVE_ORDER);
CharsetProvider[] providers = providers2();
for (int j = 0; j < providers.length; j++)
{
for (Iterator i = providers[j].charsets(); i.hasNext(); )
{
Charset cs = (Charset) i.next();
charsets.put(cs.name(), cs);
}
}
return Collections.unmodifiableSortedMap(charsets);
}
private static CharsetProvider provider()
{
String useIconv = SystemProperties.getProperty
("gnu.classpath.nio.charset.provider.iconv");
if (useIconv != null)
return IconvProvider.provider();
return Provider.provider();
}
/**
* We need to support multiple providers, reading them from
* java.nio.charset.spi.CharsetProvider in the resource directory
* META-INF/services.
*/
private static CharsetProvider[] providers2()
{
if (providers == null)
{
try
{
Enumeration en = ClassLoader.getSystemResources
("META-INF/services/java.nio.charset.spi.CharsetProvider");
LinkedHashSet set = new LinkedHashSet();
set.add(provider());
while (en.hasMoreElements())
{
BufferedReader rdr = new BufferedReader(new InputStreamReader
(((URL) (en.nextElement())).openStream()));
while (true)
{
String s = rdr.readLine();
if (s == null)
break;
CharsetProvider p =
(CharsetProvider) ((Class.forName(s)).newInstance());
set.add(p);
}
}
providers = new CharsetProvider[set.size()];
set.toArray(providers);
}
catch (Exception e)
{
throw new RuntimeException(e);
}
}
return providers;
}
public final String name ()
{
return canonicalName;
}
public final Set aliases ()
{
if (aliases == null)
return Collections.EMPTY_SET;
// should we cache the aliasSet instead?
int n = aliases.length;
HashSet aliasSet = new HashSet (n);
for (int i = 0; i < n; ++i)
aliasSet.add (aliases[i]);
return Collections.unmodifiableSet (aliasSet);
}
public String displayName ()
{
return canonicalName;
}
public String displayName (Locale locale)
{
return canonicalName;
}
public final boolean isRegistered ()
{
return (!canonicalName.startsWith ("x-")
&& !canonicalName.startsWith ("X-"));
}
public abstract boolean contains (Charset cs);
public abstract CharsetDecoder newDecoder ();
public abstract CharsetEncoder newEncoder ();
public boolean canEncode ()
{
return true;
}
// NB: This implementation serializes different threads calling
// Charset.encode(), a potential performance problem. It might
// be better to remove the cache, or use ThreadLocal to cache on
// a per-thread basis.
public final synchronized ByteBuffer encode (CharBuffer cb)
{
try
{
if (cachedEncoder == null)
{
cachedEncoder = newEncoder ()
.onMalformedInput (CodingErrorAction.REPLACE)
.onUnmappableCharacter (CodingErrorAction.REPLACE);
} else
cachedEncoder.reset();
return cachedEncoder.encode (cb);
}
catch (CharacterCodingException e)
{
throw new AssertionError (e);
}
}
public final ByteBuffer encode (String str)
{
return encode (CharBuffer.wrap (str));
}
// NB: This implementation serializes different threads calling
// Charset.decode(), a potential performance problem. It might
// be better to remove the cache, or use ThreadLocal to cache on
// a per-thread basis.
public final synchronized CharBuffer decode (ByteBuffer bb)
{
try
{
if (cachedDecoder == null)
{
cachedDecoder = newDecoder ()
.onMalformedInput (CodingErrorAction.REPLACE)
.onUnmappableCharacter (CodingErrorAction.REPLACE);
} else
cachedDecoder.reset();
return cachedDecoder.decode (bb);
}
catch (CharacterCodingException e)
{
throw new AssertionError (e);
}
}
public final int compareTo (Object ob)
{
return canonicalName.compareToIgnoreCase (((Charset) ob).canonicalName);
}
public final int hashCode ()
{
return canonicalName.hashCode ();
}
public final boolean equals (Object ob)
{
if (ob instanceof Charset)
return canonicalName.equalsIgnoreCase (((Charset) ob).canonicalName);
else
return false;
}
public final String toString ()
{
return canonicalName;
}
}
@@ -0,0 +1,317 @@
/* CharsetDecoder.java --
Copyright (C) 2002 Free Software Foundation, Inc.
This file is part of GNU Classpath.
GNU Classpath is free software; you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation; either version 2, or (at your option)
any later version.
GNU Classpath is distributed in the hope that it will be useful, but
WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
General Public License for more details.
You should have received a copy of the GNU General Public License
along with GNU Classpath; see the file COPYING. If not, write to the
Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
02110-1301 USA.
Linking this library statically or dynamically with other modules is
making a combined work based on this library. Thus, the terms and
conditions of the GNU General Public License cover the whole
combination.
As a special exception, the copyright holders of this library give you
permission to link this library with independent modules to produce an
executable, regardless of the license terms of these independent
modules, and to copy and distribute the resulting executable under
terms of your choice, provided that you also meet, for each linked
independent module, the terms and conditions of the license of that
module. An independent module is a module which is not derived from
or based on this library. If you modify this library, you may extend
this exception to your version of the library, but you are not
obligated to do so. If you do not wish to do so, delete this
exception statement from your version. */
package java.nio.charset;
import java.nio.ByteBuffer;
import java.nio.CharBuffer;
/**
* @author Jesse Rosenstock
* @since 1.4
*/
public abstract class CharsetDecoder
{
private static final int STATE_RESET = 0;
private static final int STATE_CODING = 1;
private static final int STATE_END = 2;
private static final int STATE_FLUSHED = 3;
private static final String DEFAULT_REPLACEMENT = "\uFFFD";
private final Charset charset;
private final float averageCharsPerByte;
private final float maxCharsPerByte;
private String replacement;
private int state = STATE_RESET;
private CodingErrorAction malformedInputAction
= CodingErrorAction.REPORT;
private CodingErrorAction unmappableCharacterAction
= CodingErrorAction.REPORT;
private CharsetDecoder (Charset cs, float averageCharsPerByte,
float maxCharsPerByte, String replacement)
{
if (averageCharsPerByte <= 0.0f)
throw new IllegalArgumentException ("Non-positive averageCharsPerByte");
if (maxCharsPerByte <= 0.0f)
throw new IllegalArgumentException ("Non-positive maxCharsPerByte");
this.charset = cs;
this.averageCharsPerByte
= averageCharsPerByte;
this.maxCharsPerByte
= maxCharsPerByte;
this.replacement = replacement;
implReplaceWith (replacement);
}
protected CharsetDecoder (Charset cs, float averageCharsPerByte,
float maxCharsPerByte)
{
this (cs, averageCharsPerByte, maxCharsPerByte, DEFAULT_REPLACEMENT);
}
public final float averageCharsPerByte ()
{
return averageCharsPerByte;
}
public final Charset charset ()
{
return charset;
}
public final CharBuffer decode (ByteBuffer in)
throws CharacterCodingException
{
// XXX: Sun's Javadoc seems to contradict itself saying an
// IllegalStateException is thrown "if a decoding operation is already
// in progress" and also that "it resets this Decoder".
// Should we check to see that the state is reset, or should we
// call reset()?
if (state != STATE_RESET)
throw new IllegalStateException ();
// REVIEW: Using max instead of average may allocate a very large
// buffer. Maybe we should do something more efficient?
int remaining = in.remaining ();
int n = (int) (remaining * maxCharsPerByte ());
CharBuffer out = CharBuffer.allocate (n);
if (remaining == 0)
{
state = STATE_FLUSHED;
return out;
}
CoderResult cr = decode (in, out, true);
if (cr.isError ())
cr.throwException ();
cr = flush (out);
if (cr.isError ())
cr.throwException ();
reset();
out.flip ();
// Unfortunately, resizing the actual charbuffer array is required.
char[] resized = new char[out.remaining()];
out.get(resized);
return CharBuffer.wrap(resized);
}
public final CoderResult decode (ByteBuffer in, CharBuffer out,
boolean endOfInput)
{
int newState = endOfInput ? STATE_END : STATE_CODING;
// XXX: Need to check for "previous step was an invocation [not] of
// this method with a value of true for the endOfInput parameter but
// a return value indicating an incomplete decoding operation"
// XXX: We will not check the previous return value, just
// that the previous call passed true for endOfInput
if (state != STATE_RESET && state != STATE_CODING
&& !(endOfInput && state == STATE_END))
throw new IllegalStateException ();
state = newState;
for (;;)
{
CoderResult cr;
try
{
cr = decodeLoop (in, out);
}
catch (RuntimeException e)
{
throw new CoderMalfunctionError (e);
}
if (cr.isOverflow ())
return cr;
if (cr.isUnderflow ())
{
if (endOfInput && in.hasRemaining ())
cr = CoderResult.malformedForLength (in.remaining ());
else
return cr;
}
CodingErrorAction action = cr.isMalformed ()
? malformedInputAction
: unmappableCharacterAction;
if (action == CodingErrorAction.REPORT)
return cr;
if (action == CodingErrorAction.REPLACE)
{
if (out.remaining () < replacement.length ())
return CoderResult.OVERFLOW;
out.put (replacement);
}
in.position (in.position () + cr.length ());
}
}
protected abstract CoderResult decodeLoop (ByteBuffer in, CharBuffer out);
public Charset detectedCharset ()
{
throw new UnsupportedOperationException ();
}
public final CoderResult flush (CharBuffer out)
{
// It seems weird that you can flush after reset, but Sun's javadoc
// says an IllegalStateException is thrown "If the previous step of the
// current decoding operation was an invocation neither of the reset
// method nor ... of the three-argument decode method with a value of
// true for the endOfInput parameter."
// Further note that flush() only requires that there not be
// an IllegalStateException if the previous step was a call to
// decode with true as the last argument. It does not require
// that the call succeeded. decode() does require that it succeeded.
// XXX: test this to see if reality matches javadoc
if (state != STATE_RESET && state != STATE_END)
throw new IllegalStateException ();
state = STATE_FLUSHED;
return implFlush (out);
}
protected CoderResult implFlush (CharBuffer out)
{
return CoderResult.UNDERFLOW;
}
public final CharsetDecoder onMalformedInput (CodingErrorAction newAction)
{
if (newAction == null)
throw new IllegalArgumentException ("Null action");
malformedInputAction = newAction;
implOnMalformedInput (newAction);
return this;
}
protected void implOnMalformedInput (CodingErrorAction newAction)
{
// default implementation does nothing
}
protected void implOnUnmappableCharacter (CodingErrorAction newAction)
{
// default implementation does nothing
}
protected void implReplaceWith (String newReplacement)
{
// default implementation does nothing
}
protected void implReset ()
{
// default implementation does nothing
}
public boolean isAutoDetecting ()
{
return false;
}
public boolean isCharsetDetected ()
{
throw new UnsupportedOperationException ();
}
public CodingErrorAction malformedInputAction ()
{
return malformedInputAction;
}
public final float maxCharsPerByte ()
{
return maxCharsPerByte;
}
public final CharsetDecoder onUnmappableCharacter
(CodingErrorAction newAction)
{
if (newAction == null)
throw new IllegalArgumentException ("Null action");
unmappableCharacterAction = newAction;
implOnUnmappableCharacter (newAction);
return this;
}
public final String replacement ()
{
return replacement;
}
public final CharsetDecoder replaceWith (String newReplacement)
{
if (newReplacement == null)
throw new IllegalArgumentException ("Null replacement");
if (newReplacement.length () == 0)
throw new IllegalArgumentException ("Empty replacement");
// XXX: what about maxCharsPerByte?
this.replacement = newReplacement;
implReplaceWith (newReplacement);
return this;
}
public final CharsetDecoder reset ()
{
state = STATE_RESET;
implReset ();
return this;
}
public CodingErrorAction unmappableCharacterAction ()
{
return unmappableCharacterAction;
}
}
@@ -0,0 +1,369 @@
/* CharsetEncoder.java --
Copyright (C) 2002 Free Software Foundation, Inc.
This file is part of GNU Classpath.
GNU Classpath is free software; you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation; either version 2, or (at your option)
any later version.
GNU Classpath is distributed in the hope that it will be useful, but
WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
General Public License for more details.
You should have received a copy of the GNU General Public License
along with GNU Classpath; see the file COPYING. If not, write to the
Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
02110-1301 USA.
Linking this library statically or dynamically with other modules is
making a combined work based on this library. Thus, the terms and
conditions of the GNU General Public License cover the whole
combination.
As a special exception, the copyright holders of this library give you
permission to link this library with independent modules to produce an
executable, regardless of the license terms of these independent
modules, and to copy and distribute the resulting executable under
terms of your choice, provided that you also meet, for each linked
independent module, the terms and conditions of the license of that
module. An independent module is a module which is not derived from
or based on this library. If you modify this library, you may extend
this exception to your version of the library, but you are not
obligated to do so. If you do not wish to do so, delete this
exception statement from your version. */
package java.nio.charset;
import java.nio.ByteBuffer;
import java.nio.CharBuffer;
/**
* @author Jesse Rosenstock
* @since 1.4
*/
public abstract class CharsetEncoder
{
private static final int STATE_RESET = 0;
private static final int STATE_CODING = 1;
private static final int STATE_END = 2;
private static final int STATE_FLUSHED = 3;
private static final byte[] DEFAULT_REPLACEMENT = {(byte)'?'};
private final Charset charset;
private final float averageBytesPerChar;
private final float maxBytesPerChar;
private byte[] replacement;
private int state = STATE_RESET;
private CodingErrorAction malformedInputAction
= CodingErrorAction.REPORT;
private CodingErrorAction unmappableCharacterAction
= CodingErrorAction.REPORT;
protected CharsetEncoder (Charset cs, float averageBytesPerChar,
float maxBytesPerChar)
{
this (cs, averageBytesPerChar, maxBytesPerChar, DEFAULT_REPLACEMENT);
}
protected CharsetEncoder (Charset cs, float averageBytesPerChar,
float maxBytesPerChar, byte[] replacement)
{
if (averageBytesPerChar <= 0.0f)
throw new IllegalArgumentException ("Non-positive averageBytesPerChar");
if (maxBytesPerChar <= 0.0f)
throw new IllegalArgumentException ("Non-positive maxBytesPerChar");
this.charset = cs;
this.averageBytesPerChar
= averageBytesPerChar;
this.maxBytesPerChar
= maxBytesPerChar;
this.replacement = replacement;
implReplaceWith (replacement);
}
public final float averageBytesPerChar ()
{
return averageBytesPerChar;
}
public boolean canEncode (char c)
{
CharBuffer cb = CharBuffer.allocate (1).put (c);
cb.flip ();
return canEncode (cb);
}
public boolean canEncode (CharSequence cs)
{
CharBuffer cb;
if (cs instanceof CharBuffer)
cb = ((CharBuffer) cs).duplicate ();
else
cb = CharBuffer.wrap (cs);
return canEncode (cb);
}
private boolean canEncode (CharBuffer cb)
{
// It is an error if a coding operation is "in progress"
// I take that to mean the state is not reset or flushed.
// XXX: check "in progress" everywhere
if (state == STATE_FLUSHED)
reset ();
else if (state != STATE_RESET)
throw new IllegalStateException ();
CodingErrorAction oldMalformedInputAction = malformedInputAction;
CodingErrorAction oldUnmappableCharacterAction
= unmappableCharacterAction;
try
{
if (oldMalformedInputAction != CodingErrorAction.REPORT)
onMalformedInput (CodingErrorAction.REPORT);
if (oldUnmappableCharacterAction != CodingErrorAction.REPORT)
onUnmappableCharacter (CodingErrorAction.REPORT);
}
catch (Exception e)
{
return false;
}
finally
{
if (oldMalformedInputAction != CodingErrorAction.REPORT)
onMalformedInput (oldMalformedInputAction);
if (oldUnmappableCharacterAction != CodingErrorAction.REPORT)
onUnmappableCharacter (oldUnmappableCharacterAction);
}
return true;
}
public final Charset charset ()
{
return charset;
}
public final ByteBuffer encode (CharBuffer in)
throws CharacterCodingException
{
// XXX: Sun's Javadoc seems to contradict itself saying an
// IllegalStateException is thrown "if a decoding operation is already
// in progress" and also that "it resets this Encoder".
// Should we check to see that the state is reset, or should we
// call reset()?
if (state != STATE_RESET)
throw new IllegalStateException ();
// REVIEW: Using max instead of average may allocate a very large
// buffer. Maybe we should do something more efficient?
int remaining = in.remaining ();
int n = (int) (remaining * maxBytesPerChar ());
ByteBuffer out = ByteBuffer.allocate (n);
if (remaining == 0)
{
state = STATE_FLUSHED;
return out;
}
CoderResult cr = encode (in, out, true);
if (cr.isError ())
cr.throwException ();
cr = flush (out);
if (cr.isError ())
cr.throwException ();
out.flip ();
// Unfortunately, resizing the actual bytebuffer array is required.
byte[] resized = new byte[out.remaining()];
out.get(resized);
return ByteBuffer.wrap(resized);
}
public final CoderResult encode (CharBuffer in, ByteBuffer out,
boolean endOfInput)
{
int newState = endOfInput ? STATE_END : STATE_CODING;
// XXX: Need to check for "previous step was an invocation [not] of
// this method with a value of true for the endOfInput parameter but
// a return value indicating an incomplete decoding operation"
// XXX: We will not check the previous return value, just
// that the previous call passed true for endOfInput
if (state != STATE_RESET && state != STATE_CODING
&& !(endOfInput && state == STATE_END))
throw new IllegalStateException ();
state = newState;
for (;;)
{
CoderResult cr;
try
{
cr = encodeLoop (in, out);
}
catch (RuntimeException e)
{
throw new CoderMalfunctionError (e);
}
if (cr.isOverflow ())
return cr;
if (cr.isUnderflow ())
{
if (endOfInput && in.hasRemaining ())
cr = CoderResult.malformedForLength (in.remaining ());
else
return cr;
}
CodingErrorAction action = cr.isMalformed ()
? malformedInputAction
: unmappableCharacterAction;
if (action == CodingErrorAction.REPORT)
return cr;
if (action == CodingErrorAction.REPLACE)
{
if (out.remaining () < replacement.length)
return CoderResult.OVERFLOW;
out.put (replacement);
}
in.position (in.position () + cr.length ());
}
}
protected abstract CoderResult encodeLoop (CharBuffer in, ByteBuffer out);
public final CoderResult flush (ByteBuffer out)
{
// It seems weird that you can flush after reset, but Sun's javadoc
// says an IllegalStateException is thrown "If the previous step of the
// current decoding operation was an invocation neither of the reset
// method nor ... of the three-argument encode method with a value of
// true for the endOfInput parameter."
// Further note that flush() only requires that there not be
// an IllegalStateException if the previous step was a call to
// encode with true as the last argument. It does not require
// that the call succeeded. encode() does require that it succeeded.
// XXX: test this to see if reality matches javadoc
if (state != STATE_RESET && state != STATE_END)
throw new IllegalStateException ();
state = STATE_FLUSHED;
return implFlush (out);
}
protected CoderResult implFlush (ByteBuffer out)
{
return CoderResult.UNDERFLOW;
}
protected void implOnMalformedInput (CodingErrorAction newAction)
{
// default implementation does nothing
}
protected void implOnUnmappableCharacter (CodingErrorAction newAction)
{
// default implementation does nothing
}
protected void implReplaceWith (byte[] newReplacement)
{
// default implementation does nothing
}
protected void implReset ()
{
// default implementation does nothing
}
public boolean isLegalReplacement (byte[] replacement)
{
// TODO: cache the decoder
// error actions will be REPORT after construction
CharsetDecoder decoder = charset.newDecoder ();
ByteBuffer bb = ByteBuffer.wrap (replacement);
CharBuffer cb
= CharBuffer.allocate ((int) (replacement.length
* decoder.maxCharsPerByte ()));
return !decoder.decode (bb, cb, true).isError ();
}
public CodingErrorAction malformedInputAction ()
{
return malformedInputAction;
}
public final float maxBytesPerChar ()
{
return maxBytesPerChar;
}
public final CharsetEncoder onMalformedInput (CodingErrorAction newAction)
{
if (newAction == null)
throw new IllegalArgumentException ("Null action");
malformedInputAction = newAction;
implOnMalformedInput (newAction);
return this;
}
public CodingErrorAction unmappableCharacterAction ()
{
return unmappableCharacterAction;
}
public final CharsetEncoder onUnmappableCharacter
(CodingErrorAction newAction)
{
if (newAction == null)
throw new IllegalArgumentException ("Null action");
unmappableCharacterAction = newAction;
implOnUnmappableCharacter (newAction);
return this;
}
public final byte[] replacement ()
{
return replacement;
}
public final CharsetEncoder replaceWith (byte[] newReplacement)
{
if (newReplacement == null)
throw new IllegalArgumentException ("Null replacement");
if (newReplacement.length == 0)
throw new IllegalArgumentException ("Empty replacement");
// XXX: what about maxBytesPerChar?
if (!isLegalReplacement (newReplacement))
throw new IllegalArgumentException ("Illegal replacement");
this.replacement = newReplacement;
implReplaceWith (newReplacement);
return this;
}
public final CharsetEncoder reset ()
{
state = STATE_RESET;
implReset ();
return this;
}
}
@@ -0,0 +1,52 @@
/* CoderMalfunctionError.java --
Copyright (C) 2002 Free Software Foundation, Inc.
This file is part of GNU Classpath.
GNU Classpath is free software; you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation; either version 2, or (at your option)
any later version.
GNU Classpath is distributed in the hope that it will be useful, but
WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
General Public License for more details.
You should have received a copy of the GNU General Public License
along with GNU Classpath; see the file COPYING. If not, write to the
Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
02110-1301 USA.
Linking this library statically or dynamically with other modules is
making a combined work based on this library. Thus, the terms and
conditions of the GNU General Public License cover the whole
combination.
As a special exception, the copyright holders of this library give you
permission to link this library with independent modules to produce an
executable, regardless of the license terms of these independent
modules, and to copy and distribute the resulting executable under
terms of your choice, provided that you also meet, for each linked
independent module, the terms and conditions of the license of that
module. An independent module is a module which is not derived from
or based on this library. If you modify this library, you may extend
this exception to your version of the library, but you are not
obligated to do so. If you do not wish to do so, delete this
exception statement from your version. */
package java.nio.charset;
/**
* @since 1.4
*/
public class CoderMalfunctionError extends Error
{
/**
* Creates the error
*/
public CoderMalfunctionError(Exception cause)
{
super (cause);
}
}
@@ -0,0 +1,189 @@
/* CoderResult.java --
Copyright (C) 2002, 2004 Free Software Foundation, Inc.
This file is part of GNU Classpath.
GNU Classpath is free software; you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation; either version 2, or (at your option)
any later version.
GNU Classpath is distributed in the hope that it will be useful, but
WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
General Public License for more details.
You should have received a copy of the GNU General Public License
along with GNU Classpath; see the file COPYING. If not, write to the
Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
02110-1301 USA.
Linking this library statically or dynamically with other modules is
making a combined work based on this library. Thus, the terms and
conditions of the GNU General Public License cover the whole
combination.
As a special exception, the copyright holders of this library give you
permission to link this library with independent modules to produce an
executable, regardless of the license terms of these independent
modules, and to copy and distribute the resulting executable under
terms of your choice, provided that you also meet, for each linked
independent module, the terms and conditions of the license of that
module. An independent module is a module which is not derived from
or based on this library. If you modify this library, you may extend
this exception to your version of the library, but you are not
obligated to do so. If you do not wish to do so, delete this
exception statement from your version. */
package java.nio.charset;
import java.lang.ref.WeakReference;
import java.nio.BufferOverflowException;
import java.nio.BufferUnderflowException;
import java.util.HashMap;
/**
* @author Jesse Rosenstock
* @since 1.4
*/
public class CoderResult
{
private static final int TYPE_MALFORMED = 0;
private static final int TYPE_OVERFLOW = 1;
private static final int TYPE_UNDERFLOW = 2;
private static final int TYPE_UNMAPPABLE = 3;
public static final CoderResult OVERFLOW
= new CoderResult (TYPE_OVERFLOW, 0);
public static final CoderResult UNDERFLOW
= new CoderResult (TYPE_UNDERFLOW, 0);
private static final String[] names
= { "MALFORMED", "OVERFLOW", "UNDERFLOW", "UNMAPPABLE" };
private static final Cache malformedCache
= new Cache ()
{
protected CoderResult make (int length)
{
return new CoderResult (TYPE_MALFORMED, length);
}
};
private static final Cache unmappableCache
= new Cache ()
{
protected CoderResult make (int length)
{
return new CoderResult (TYPE_UNMAPPABLE, length);
}
};
private final int type;
private final int length;
// Package-private to avoid a trampoline constructor.
CoderResult (int type, int length)
{
this.type = type;
this.length = length;
}
public boolean isError ()
{
return length > 0;
}
public boolean isMalformed ()
{
return type == TYPE_MALFORMED;
}
public boolean isOverflow ()
{
return type == TYPE_OVERFLOW;
}
public boolean isUnderflow ()
{
return type == TYPE_UNDERFLOW;
}
public boolean isUnmappable ()
{
return type == TYPE_UNMAPPABLE;
}
public int length ()
{
if (length <= 0)
throw new UnsupportedOperationException ();
else
return length;
}
public static CoderResult malformedForLength (int length)
{
return malformedCache.get (length);
}
public void throwException ()
throws CharacterCodingException
{
switch (type)
{
case TYPE_MALFORMED:
throw new MalformedInputException (length);
case TYPE_OVERFLOW:
throw new BufferOverflowException ();
case TYPE_UNDERFLOW:
throw new BufferUnderflowException ();
case TYPE_UNMAPPABLE:
throw new UnmappableCharacterException (length);
}
}
public String toString ()
{
String name = names[type];
return (length > 0) ? name + '[' + length + ']' : name;
}
public static CoderResult unmappableForLength (int length)
{
return unmappableCache.get (length);
}
private abstract static class Cache
{
private final HashMap cache;
// Package-private to avoid a trampoline constructor.
Cache ()
{
cache = new HashMap ();
}
// Package-private to avoid a trampoline.
synchronized CoderResult get (int length)
{
if (length <= 0)
throw new IllegalArgumentException ("Non-positive length");
Integer len = new Integer (length);
CoderResult cr = null;
Object o;
if ((o = cache.get (len)) != null)
cr = (CoderResult) ((WeakReference) o).get ();
if (cr == null)
{
cr = make (length);
cache.put (len, new WeakReference (cr));
}
return cr;
}
protected abstract CoderResult make (int length);
}
}
@@ -0,0 +1,66 @@
/* CodingErrorAction.java --
Copyright (C) 2002 Free Software Foundation, Inc.
This file is part of GNU Classpath.
GNU Classpath is free software; you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation; either version 2, or (at your option)
any later version.
GNU Classpath is distributed in the hope that it will be useful, but
WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
General Public License for more details.
You should have received a copy of the GNU General Public License
along with GNU Classpath; see the file COPYING. If not, write to the
Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
02110-1301 USA.
Linking this library statically or dynamically with other modules is
making a combined work based on this library. Thus, the terms and
conditions of the GNU General Public License cover the whole
combination.
As a special exception, the copyright holders of this library give you
permission to link this library with independent modules to produce an
executable, regardless of the license terms of these independent
modules, and to copy and distribute the resulting executable under
terms of your choice, provided that you also meet, for each linked
independent module, the terms and conditions of the license of that
module. An independent module is a module which is not derived from
or based on this library. If you modify this library, you may extend
this exception to your version of the library, but you are not
obligated to do so. If you do not wish to do so, delete this
exception statement from your version. */
package java.nio.charset;
public class CodingErrorAction
{
public static final CodingErrorAction IGNORE
= new CodingErrorAction("ignore");
public static final CodingErrorAction REPLACE
= new CodingErrorAction("replace");
public static final CodingErrorAction REPORT
= new CodingErrorAction("report");
private final String name;
/**
* Private constructor only used to create the constant CodingErrorActions.
*/
private CodingErrorAction(String name)
{
this.name = name;
}
/**
* Returns the name of the CodingErrorAction.
*/
public String toString ()
{
return name;
}
}
@@ -0,0 +1,73 @@
/* IllegalCharsetNameException.java --
Copyright (C) 2002 Free Software Foundation, Inc.
This file is part of GNU Classpath.
GNU Classpath is free software; you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation; either version 2, or (at your option)
any later version.
GNU Classpath is distributed in the hope that it will be useful, but
WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
General Public License for more details.
You should have received a copy of the GNU General Public License
along with GNU Classpath; see the file COPYING. If not, write to the
Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
02110-1301 USA.
Linking this library statically or dynamically with other modules is
making a combined work based on this library. Thus, the terms and
conditions of the GNU General Public License cover the whole
combination.
As a special exception, the copyright holders of this library give you
permission to link this library with independent modules to produce an
executable, regardless of the license terms of these independent
modules, and to copy and distribute the resulting executable under
terms of your choice, provided that you also meet, for each linked
independent module, the terms and conditions of the license of that
module. An independent module is a module which is not derived from
or based on this library. If you modify this library, you may extend
this exception to your version of the library, but you are not
obligated to do so. If you do not wish to do so, delete this
exception statement from your version. */
package java.nio.charset;
/**
* @author Michael Koch
* @since 1.4
*/
public class IllegalCharsetNameException extends IllegalArgumentException
{
/**
* Compatible with JDK 1.4+
*/
private static final long serialVersionUID = 1457525358470002989L;
private String charsetName;
/**
* Creates the exception
*
* @param charsetName name of the illegal charset
*/
public IllegalCharsetNameException (String charsetName)
{
super ();
this.charsetName = charsetName;
}
/**
* Retrieves the illegal charset name
*
* @return the illegal charset name
*/
public String getCharsetName ()
{
return charsetName;
}
}
@@ -0,0 +1,77 @@
/* MalformedInputException.java --
Copyright (C) 2002 Free Software Foundation, Inc.
This file is part of GNU Classpath.
GNU Classpath is free software; you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation; either version 2, or (at your option)
any later version.
GNU Classpath is distributed in the hope that it will be useful, but
WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
General Public License for more details.
You should have received a copy of the GNU General Public License
along with GNU Classpath; see the file COPYING. If not, write to the
Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
02110-1301 USA.
Linking this library statically or dynamically with other modules is
making a combined work based on this library. Thus, the terms and
conditions of the GNU General Public License cover the whole
combination.
As a special exception, the copyright holders of this library give you
permission to link this library with independent modules to produce an
executable, regardless of the license terms of these independent
modules, and to copy and distribute the resulting executable under
terms of your choice, provided that you also meet, for each linked
independent module, the terms and conditions of the license of that
module. An independent module is a module which is not derived from
or based on this library. If you modify this library, you may extend
this exception to your version of the library, but you are not
obligated to do so. If you do not wish to do so, delete this
exception statement from your version. */
package java.nio.charset;
/**
* @since 1.4
*/
public class MalformedInputException extends CharacterCodingException
{
private int inputLength;
/**
* Creates the exception
*
* @param inputLength the position of malformed input in the input stream
*/
public MalformedInputException (int inputLength)
{
super ();
this.inputLength = inputLength;
}
/**
* Retrieves the position of the malformed input in the input stream.
*
* @return the position
*/
public int getInputLength ()
{
return inputLength;
}
/**
* Returns the detail message string of this throwable
*
* @return the message
*/
public String getMessage ()
{
return "Input length = " + inputLength;
}
}
@@ -0,0 +1,71 @@
/* UnmappableCharacterException.java --
Copyright (C) 2002 Free Software Foundation, Inc.
This file is part of GNU Classpath.
GNU Classpath is free software; you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation; either version 2, or (at your option)
any later version.
GNU Classpath is distributed in the hope that it will be useful, but
WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
General Public License for more details.
You should have received a copy of the GNU General Public License
along with GNU Classpath; see the file COPYING. If not, write to the
Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
02110-1301 USA.
Linking this library statically or dynamically with other modules is
making a combined work based on this library. Thus, the terms and
conditions of the GNU General Public License cover the whole
combination.
As a special exception, the copyright holders of this library give you
permission to link this library with independent modules to produce an
executable, regardless of the license terms of these independent
modules, and to copy and distribute the resulting executable under
terms of your choice, provided that you also meet, for each linked
independent module, the terms and conditions of the license of that
module. An independent module is a module which is not derived from
or based on this library. If you modify this library, you may extend
this exception to your version of the library, but you are not
obligated to do so. If you do not wish to do so, delete this
exception statement from your version. */
package java.nio.charset;
/**
* @since 1.4
*/
public class UnmappableCharacterException extends CharacterCodingException
{
private int inputLength;
/**
* Creates the exception
*/
public UnmappableCharacterException (int inputLength)
{
super ();
this.inputLength = inputLength;
}
/**
* Retrieves the illegal charset name
*/
public int getInputLength ()
{
return inputLength;
}
/**
* Returns the detail message string of this throwable
*/
public String getMessage ()
{
return "Input length = " + inputLength;
}
}
@@ -0,0 +1,69 @@
/* UnsupportedCharsetException.java --
Copyright (C) 2002 Free Software Foundation, Inc.
This file is part of GNU Classpath.
GNU Classpath is free software; you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation; either version 2, or (at your option)
any later version.
GNU Classpath is distributed in the hope that it will be useful, but
WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
General Public License for more details.
You should have received a copy of the GNU General Public License
along with GNU Classpath; see the file COPYING. If not, write to the
Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
02110-1301 USA.
Linking this library statically or dynamically with other modules is
making a combined work based on this library. Thus, the terms and
conditions of the GNU General Public License cover the whole
combination.
As a special exception, the copyright holders of this library give you
permission to link this library with independent modules to produce an
executable, regardless of the license terms of these independent
modules, and to copy and distribute the resulting executable under
terms of your choice, provided that you also meet, for each linked
independent module, the terms and conditions of the license of that
module. An independent module is a module which is not derived from
or based on this library. If you modify this library, you may extend
this exception to your version of the library, but you are not
obligated to do so. If you do not wish to do so, delete this
exception statement from your version. */
package java.nio.charset;
/**
* @author Michael Koch
* @since 1.4
*/
public class UnsupportedCharsetException extends IllegalArgumentException
{
/**
* Compatible with JDK 1.4+
*/
private static final long serialVersionUID = 1490765524727386367L;
String charsetName;
/**
* Creates the exception
*/
public UnsupportedCharsetException (String charsetName)
{
super ();
this.charsetName = charsetName;
}
/**
* Retrieves the illegal charset name
*/
public String getCharsetName ()
{
return charsetName;
}
}
@@ -0,0 +1,47 @@
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 3.2 Final//EN">
<!-- package.html - describes classes in java.nio.charset package.
Copyright (C) 2002 Free Software Foundation, Inc.
This file is part of GNU Classpath.
GNU Classpath is free software; you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation; either version 2, or (at your option)
any later version.
GNU Classpath is distributed in the hope that it will be useful, but
WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
General Public License for more details.
You should have received a copy of the GNU General Public License
along with GNU Classpath; see the file COPYING. If not, write to the
Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
02110-1301 USA.
Linking this library statically or dynamically with other modules is
making a combined work based on this library. Thus, the terms and
conditions of the GNU General Public License cover the whole
combination.
As a special exception, the copyright holders of this library give you
permission to link this library with independent modules to produce an
executable, regardless of the license terms of these independent
modules, and to copy and distribute the resulting executable under
terms of your choice, provided that you also meet, for each linked
independent module, the terms and conditions of the license of that
module. An independent module is a module which is not derived from
or based on this library. If you modify this library, you may extend
this exception to your version of the library, but you are not
obligated to do so. If you do not wish to do so, delete this
exception statement from your version. -->
<html>
<head><title>GNU Classpath - java.nio.charset</title></head>
<body>
<p>Classes to manipulate, encode and decode different character sets from
and to bytes.</p>
</body>
</html>
@@ -0,0 +1,91 @@
/* CharsetProvider.java -- charset service provider interface
Copyright (C) 2002 Free Software Foundation
This file is part of GNU Classpath.
GNU Classpath is free software; you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation; either version 2, or (at your option)
any later version.
GNU Classpath is distributed in the hope that it will be useful, but
WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
General Public License for more details.
You should have received a copy of the GNU General Public License
along with GNU Classpath; see the file COPYING. If not, write to the
Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
02110-1301 USA.
Linking this library statically or dynamically with other modules is
making a combined work based on this library. Thus, the terms and
conditions of the GNU General Public License cover the whole
combination.
As a special exception, the copyright holders of this library give you
permission to link this library with independent modules to produce an
executable, regardless of the license terms of these independent
modules, and to copy and distribute the resulting executable under
terms of your choice, provided that you also meet, for each linked
independent module, the terms and conditions of the license of that
module. An independent module is a module which is not derived from
or based on this library. If you modify this library, you may extend
this exception to your version of the library, but you are not
obligated to do so. If you do not wish to do so, delete this
exception statement from your version. */
package java.nio.charset.spi;
import java.nio.charset.Charset;
import java.util.Iterator;
/**
* This class allows an implementor to provide additional character sets. The
* subclass must have a nullary constructor, and be attached to charset
* implementation classes. These extensions are loaded via the context class
* loader. To provide the charset extension, all files named
* <code>META-INF/services/java.nio.charset.spi.CharsetProvider</code> are
* read from the classpath. Each one should be a UTF-8 encoded list of
* fully-qualified names of concrete subclasses of this class; whitespace is
* ignored, and '#' starts comments. Duplicates are ignored. The
* implementations must be accessible to the classloader that requests them.
*
* @author Eric Blake (ebb9@email.byu.edu)
* @see Charset
* @since 1.4
* @status updated to 1.4
*/
public abstract class CharsetProvider
{
/**
* Initialize a new charset provider. This performs a security check on
* RuntimePermission("charsetProvider").
*
* @throws SecurityException if building a new set is not allowed
*/
protected CharsetProvider()
{
SecurityManager s = System.getSecurityManager();
if (s != null)
s.checkPermission(new RuntimePermission("charsetProvider"));
}
/**
* Returns an iterator over the charsets defined by this provider.
*
* @return the iterator
* @see Charset#availableCharsets()
*/
public abstract Iterator charsets();
/**
* Returns the named charset, by canonical name or alias.
*
* @param name the name of the character
*
* @return the charset, or null if not supported
*/
public abstract Charset charsetForName(String name);
} // class CharsetProvider
@@ -0,0 +1,46 @@
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 3.2 Final//EN">
<!-- package.html - describes classes in java.nio.charset.spi package.
Copyright (C) 2002 Free Software Foundation, Inc.
This file is part of GNU Classpath.
GNU Classpath is free software; you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation; either version 2, or (at your option)
any later version.
GNU Classpath is distributed in the hope that it will be useful, but
WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
General Public License for more details.
You should have received a copy of the GNU General Public License
along with GNU Classpath; see the file COPYING. If not, write to the
Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
02110-1301 USA.
Linking this library statically or dynamically with other modules is
making a combined work based on this library. Thus, the terms and
conditions of the GNU General Public License cover the whole
combination.
As a special exception, the copyright holders of this library give you
permission to link this library with independent modules to produce an
executable, regardless of the license terms of these independent
modules, and to copy and distribute the resulting executable under
terms of your choice, provided that you also meet, for each linked
independent module, the terms and conditions of the license of that
module. An independent module is a module which is not derived from
or based on this library. If you modify this library, you may extend
this exception to your version of the library, but you are not
obligated to do so. If you do not wish to do so, delete this
exception statement from your version. -->
<html>
<head><title>GNU Classpath - java.nio.charset.spi</title></head>
<body>
<p>Classes to provide new character sets.</p>
</body>
</html>