[kaffe] CVS kaffe (kaz): Added new files as a preparation for importing GNU Classpath's

Kaffe CVS Kaffe Mailing List <kaffe@kaffe.org>
Mon Jan 19 08:30:03 2004


PatchSet 4353 
Date: 2004/01/19 16:27:19
Author: kaz
Branch: HEAD
Tag: (none) 
Log:
Added new files as a preparation for importing GNU Classpath's
java.io.InputStreamReader and java.io.OutputStreamWriter.

Members: 
	libraries/javalib/gnu/java/io/EncodingManager.java:INITIAL->1.1 
	libraries/javalib/gnu/java/io/decode/Decoder.java:INITIAL->1.1 
	libraries/javalib/gnu/java/io/decode/KaffeDecoder.java:INITIAL->1.1 
	libraries/javalib/gnu/java/io/encode/Encoder.java:INITIAL->1.1 
	libraries/javalib/gnu/java/io/encode/KaffeEncoder.java:INITIAL->1.1 

===================================================================
Checking out kaffe/libraries/javalib/gnu/java/io/EncodingManager.java
RCS:  /home/cvs/kaffe/kaffe/libraries/javalib/gnu/java/io/EncodingManager.java,v
VERS: 1.1
***************
--- /dev/null	Sun Aug  4 19:57:58 2002
+++ kaffe/libraries/javalib/gnu/java/io/EncodingManager.java	Mon Jan 19 16:29:50 2004
@@ -0,0 +1,435 @@
+/* EncodingManager.java -- Manages character encoding translators
+   Copyright (C) 1998, 1999 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., 59 Temple Place, Suite 330, Boston, MA
+02111-1307 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 gnu.java.io;
+
+import java.io.InputStream;
+import java.io.OutputStream;
+import java.io.UnsupportedEncodingException;
+import java.util.Hashtable;
+import gnu.java.io.decode.*;
+import gnu.java.io.encode.*;
+
+
+import java.io.FileOutputStream;
+
+// gnu.java.io.EncodingManager that works with kaffe
+
+/**
+  * This class is used to create new instances of Decoders for a specified
+  * encoding scheme.  These instances are cache for fast subsequent retrieval 
+  * if necessary.
+  *
+  * @version 0.0
+  *
+  * @author Aaron M. Renn (arenn@urbanophile.com),
+  * Ito Kazumitsu (kaz@maczuka.gcd.org)
+  */
+public class EncodingManager
+{
+
+/*************************************************************************/
+
+/*
+ * Class Variables
+ */
+
+/**
+  * This is the system default character encoding
+  */
+private static String default_encoding;
+
+/**
+  * This is the default instance of the default <code>Decoder</code>, put
+  * here to make access even faster than through the Hashtable
+  */
+private static Decoder default_decoder_instance;
+
+/**
+  * This is the default instance of the default <code>Encoder</code>, put
+  * here to make access even faster than through the Hashtable
+  */
+private static Encoder default_encoder_instance;
+
+/**
+  * This is hash table of cached instances of <code>Decoder</code> objects
+  */
+private static Hashtable decoder_instances;
+
+/**
+  * This is hash table of cached instances of <code>Encoder</code> objects
+  */
+private static Hashtable encoder_instances;
+
+
+static 
+{
+  // Initialize hashtables
+  decoder_instances = new Hashtable();
+  encoder_instances = new Hashtable();
+
+  // Find the system default encoding name
+  String default_encoding = System.getProperty("file.encoding","8859_1");
+
+  // Load the class
+  try
+    {
+      // First the Decoder side
+
+      default_decoder_instance = 
+            new KaffeDecoder(null, default_encoding);
+        
+      // Now the Encoder side
+
+      default_encoder_instance = 
+            new KaffeEncoder(null, default_encoding);
+        
+      // Add items to the hashtable;
+      decoder_instances.put(default_encoding, default_decoder_instance);
+      encoder_instances.put(default_encoding, default_encoder_instance);
+    }
+  catch(Exception e)
+    {
+      throw new Error("Cannot load system default encoding '" + 
+                     default_encoding + "': " + e.getMessage());
+    }
+}  
+
+/*************************************************************************/
+
+/*
+ * Class Methods
+ */
+
+/*************************************************************************/
+
+/**
+  * This method returns the default instance of the default <code>Decoder</code> 
+  * which must be used only for calling the static byte array conversion methods.
+  * Calling any instance methods on this object will result in a 
+  * <code>NullPointerException</code>.
+  *
+  * @return An instance of the default <code>Decoder</code>.
+  */
+public static Decoder
+getDecoder()
+{
+  return(default_decoder_instance);
+}
+
+/*************************************************************************/
+
+/**
+  * This method returns the default instance of the <code>Decoder</code>
+  * for the named encoding.  This must be used only for calling the static
+  * byte array conversion methods.  Calling any instance methods on this
+  * object will result in a <code>NullPointerException</code>
+  *
+  * This form of <code>getDecoder</code> caches the instance that is returned.  If
+  * this decoder is for a complex character encoding that may use lots of
+  * memory and is only needed once or infrequently, consider using the form 
+  * of the <code>getDecoder</code> method that does not cache the results 
+  * to save resources.
+  *
+  * @param encoding The name of the encoding to retrieve a <code>Decoder</code> for.
+  *
+  * @return An instance of the <code>Decoder</code> for the named encoding.
+  *
+  * @exception UnsupportedEncodingException If a <code>Decoder</code> for the named encoding cannot be found
+  */
+public static Decoder
+getDecoder(String encoding) throws UnsupportedEncodingException
+{
+  return(getDecoder(encoding, true));
+}
+
+/*************************************************************************/
+
+/**
+  * This method returns the default instance of the <code>Decoder</code>
+  * for the named encoding.  This must be used only for calling the static
+  * byte array conversion methods.  Calling any instance methods on this
+  * object will result in a <code>NullPointerException</code>
+  *
+  * @param encoding The name of the encoding to retrieve a <code>Decoder</code> for.
+  * @param cache <code>true</code> to cache this encoding, <code>false</code> otherwise
+  *
+  * @return An instance of the <code>Decoder</code> for the named encoding.
+  *
+  * @exception UnsupportedEncodingException If a <code>Decoder</code> for the named encoding cannot be found
+  */
+public static Decoder
+getDecoder(String encoding, boolean cache) throws UnsupportedEncodingException
+{
+  Decoder dec = (Decoder)decoder_instances.get(encoding);
+  if (dec != null)
+    return(dec);
+ 
+  dec = getDecoder(null, encoding, cache);
+
+  if (cache)
+    decoder_instances.put(encoding, dec);
+
+  return(dec);
+}
+
+/*************************************************************************/
+
+/**
+  * This method returns a <code>Decoder</code> object that can read
+  * from the specified <code>InputStream</code> using the default 
+  * encoding.
+  *
+  * @param in The <code>InputStream</code> to read from
+  */
+public static Decoder
+getDecoder(InputStream in)
+{
+  try
+    {
+      return(getDecoder(in, default_encoding, false));
+    }
+  catch(Exception e)
+    {
+      throw new Error("Unexpected problems with default decoder");
+    }
+}
+
+/*************************************************************************/
+
+/**
+  * This method returns a <code>Decoder</code> object that can read from
+  * the specified <code>InputStream</code> using the named encoding
+  *
+  * This form of <code>getDecoder</code> caches the instance that is returned.  If
+  * this decoder is for a complex character encoding that may use lots of
+  * memory and is only needed once or infrequently, consider using the form 
+  * of the <code>getDecoder</code> method that does not cache the results 
+  * to save resources.
+  *
+  * @param in The <code>InputStream</code> to read from
+  * @param encoding The name of the character encoding scheme to use
+  *
+  * @exception UnsupportedEncodingException If a <code>Decoder</code> for this encoding cannot be found
+  */
+public static Decoder
+getDecoder(InputStream in, String encoding) throws UnsupportedEncodingException
+{
+  return(getDecoder(in, encoding, true));
+}
+
+/*************************************************************************/
+
+/**
+  * This method returns a <code>Decoder</code> object that can read from
+  * the specified <code>InputStream</code> using the named encoding
+  *
+  * @param in The <code>InputStream</code> to read from
+  * @param encoding The name of the character encoding scheme to use
+  * @param cache <code>true</code> to cache the returned <code>Decoder</code>, <code>false</code> otherwise.  Actually, not used.
+  *
+  * @exception UnsupportedEncodingException If a <code>Decoder</code> for this encoding cannot be found
+  */
+public static Decoder
+getDecoder(InputStream in, String encoding, boolean cache) 
+                              throws UnsupportedEncodingException
+{
+  Decoder dec = null;
+  try
+    {
+      dec = new KaffeDecoder(in, encoding);
+    }
+  catch(Exception e)
+    {
+      throw new UnsupportedEncodingException(encoding + ": " + e.getMessage());
+    }
+
+  return(dec);
+}
+
+/*************************************************************************/
+
+/**
+  * This method returns the default instance of the default <code>Encoder</code> 
+  * which must be used only for calling the static byte array conversion methods.
+  * Calling any instance methods on this object will result in a 
+  * <code>NullPointerException</code>.
+  *
+  * @return An instance of the default <code>Encoder</code>.
+  */
+public static Encoder
+getEncoder()
+{
+  return(default_encoder_instance);
+}
+
+/*************************************************************************/
+
+/**
+  * This method returns the default instance of the <code>Encoder</code>
+  * for the named encoding.  This must be used only for calling the static
+  * byte array conversion methods.  Calling any instance methods on this
+  * object will result in a <code>NullPointerException</code>
+  *
+  * This form of <code>getEncoder</code> caches the instance that is returned.  If
+  * this decoder is for a complex character encoding that may use lots of
+  * memory and is only needed once or infrequently, consider using the form 
+  * of the <code>getEncoder</code> method that does not cache the results 
+  * to save resources.
+  *
+  * @param encoding The name of the encoding to retrieve a <code>Encoder</code> for.
+  *
+  * @return An instance of the <code>Encoder</code> for the named encoding.
+  *
+  * @exception UnsupportedEncodingException If a <code>Encoder</code> for the named encoding cannot be found
+  */
+public static Encoder
+getEncoder(String encoding) throws UnsupportedEncodingException
+{
+  return(getEncoder(encoding, true));
+}
+
+/*************************************************************************/
+
+/**
+  * This method returns the default instance of the <code>Encoder</code>
+  * for the named encoding.  This must be used only for calling the static
+  * byte array conversion methods.  Calling any instance methods on this
+  * object will result in a <code>NullPointerException</code>
+  *
+  * @param encoding The name of the encoding to retrieve a <code>Encoder</code> for.
+  * @param cache <code>true</code> to cache this encoding, <code>false</code> otherwise
+  *
+  * @return An instance of the <code>Encoder</code> for the named encoding.
+  *
+  * @exception UnsupportedEncodingException If a <code>Encoder</code> for the named encoding cannot be found
+  */
+public static Encoder
+getEncoder(String encoding, boolean cache) throws UnsupportedEncodingException
+{
+  Encoder enc = (Encoder)encoder_instances.get(encoding);
+  if (enc != null)
+    return(enc);
+ 
+  enc = getEncoder(null, encoding, cache);
+
+  if (cache)
+    encoder_instances.put(encoding, enc);
+
+  return(enc);
+}
+
+/*************************************************************************/
+
+/**
+  * This method returns an <code>Encoder</code> object that can write
+  * to the specified <code>OutputStream</code> using the default 
+  * encoding.
+  *
+  * @param out The <code>OutputStream</code> to read from
+  */
+public static Encoder
+getEncoder(OutputStream out)
+{
+  Encoder enc = null;
+  try
+    {
+      enc = getEncoder(out, default_encoding, false);
+    }
+  catch(Exception e)
+    {
+      throw new Error("Unexpected problems with default encoder");
+    }
+
+  return(enc);
+}
+
+/*************************************************************************/
+
+/**
+  * This method returns an <code>Encoder</code> object that can write to
+  * the specified <code>OutputStream</code> using the named encoding
+  *
+  * This form of <code>getencoder</code> caches the instance that is returned.  If
+  * this encoder is for a complex character encoding that may use lots of
+  * memory and is only needed once or infrequently, consider using the form 
+  * of the <code>getEncoder</code> method that does not cache the results 
+  * to save resources.
+  *
+  * @param in The <code>OutputStream</code> to read from
+  * @param encoding The name of the character encoding scheme to use
+  *
+  * @exception UnsupportedEncodingException If an <code>Encoder</code> for this encoding cannot be found
+  */
+public static Encoder
+getEncoder(OutputStream in, String encoding) throws UnsupportedEncodingException
+{
+  return(getEncoder(in, encoding, true));
+}
+
+/*************************************************************************/
+
+/**
+  * This method returns an <code>Encoder</code> object that can write to
+  * the specified <code>OutputStream</code> using the named encoding
+  *
+  * @param in The <code>OutputStream</code> to read from
+  * @param encoding The name of the character encoding scheme to use
+  * @param cache <code>true</code> to cache the returned <code>Encoder</code>, <code>false</code> otherwise. Actually, not used.
+  *
+  * @exception UnsupportedEncodingException If a <code>Decoder</code> for this encoding cannot be found
+  */
+public static Encoder
+getEncoder(OutputStream out, String encoding, boolean cache) 
+                              throws UnsupportedEncodingException
+{
+  Encoder enc = null;
+  try
+    {
+      enc = new KaffeEncoder(out, encoding); 
+    }
+  catch(Exception e)
+    {
+      throw new UnsupportedEncodingException(encoding + ": " + e.getMessage());
+    }
+
+  return(enc);
+}
+
+} // class EncodingManager
+
===================================================================
Checking out kaffe/libraries/javalib/gnu/java/io/decode/Decoder.java
RCS:  /home/cvs/kaffe/kaffe/libraries/javalib/gnu/java/io/decode/Decoder.java,v
VERS: 1.1
***************
--- /dev/null	Sun Aug  4 19:57:58 2002
+++ kaffe/libraries/javalib/gnu/java/io/decode/Decoder.java	Mon Jan 19 16:29:50 2004
@@ -0,0 +1,308 @@
+/* Decoder.java -- Base class for byte->char decoders
+   Copyright (C) 1998 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., 59 Temple Place, Suite 330, Boston, MA
+02111-1307 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 gnu.java.io.decode;
+
+import java.io.InputStream;
+import java.io.Reader;
+import java.io.IOException;
+import java.io.CharConversionException;
+
+/**
+  * This class is the base class for decoding bytes into character. 
+  *
+  * @version 0.0
+  *
+  * @author Aaron M. Renn (arenn@urbanophile.com)
+  */
+public abstract class Decoder extends Reader
+{
+
+/*************************************************************************/
+
+/*
+ * Class Variables
+ */
+
+/**
+  * This is the name of the current encoding. MUST be overriden by
+  * subclasses.
+  */
+protected static String scheme_name = "undefined";
+
+/**
+  * This is a description of the current encoding.  MUST be overridden
+  * by subclasses.
+  */
+protected static String scheme_description = "undefined";
+
+/*************************************************************************/
+
+/*
+ * Instance Variables
+ */
+
+/**
+  * This is the <code>InputStream</code> bytes are read from
+  */
+protected InputStream in;
+
+/*************************************************************************/
+
+/*
+ * Class Methods
+ */
+
+/**
+  * This method returns the name of the encoding scheme in use
+  *
+  * @return The name of the encoding scheme
+  */
+public static String
+getSchemeName()
+{
+  return(scheme_name);
+}
+
+/*************************************************************************/
+
+/**
+  * This method returns a description of the encoding scheme in use
+  *
+  * @param A description of the decoding scheme.
+  */
+public static String
+getSchemeDescription()
+{
+  return(scheme_description);
+}
+
+/*************************************************************************/
+
+/*
+ * Constructors
+ */
+
+/**
+  * This method initializes a new <code>Decoder</code> to read from the
+  * specified <code>InputStream</code>.
+  *
+  * @param in The <code>InputStream</code> to read from
+  */
+public
+Decoder(InputStream in)
+{
+  this.in = in;
+}
+
+/*************************************************************************/
+
+/*
+ * Instance Methods
+ */
+
+/**
+  * For a given set of bytes, this method returns the number of characters
+  * that byte array will translate into.  If the bytes do not all translate 
+  * into an even number of charcters, an exception will be thrown.    
+  * Additionally, an exception may be thrown if any of the bytes are not
+  * valid for the given encoding.  (This is not guaranteed to happen however).
+  *
+  * @param buf The array of bytes to determine the number of characters from.
+  *
+  * @return The number of characters than can be decoded from the byte array
+  *
+  * @exception CharConversionException If the bytes do not evenly translate to characters, or an invalid byte is encountered.
+  */
+public int
+charsInByteArray(byte[] buf) throws CharConversionException
+{
+  return(charsInByteArray(buf, 0, buf.length));
+}
+
+/*************************************************************************/
+
+/**
+  * For a <code>len</code> bytes in the specified array, starting from
+  * index <code>offset</code>, this method returns the number of characters
+  * that byte array will translate into.  If the bytes do not all translate 
+  * into an even number of charcters, an exception will be thrown.    
+  * Additionally, an exception may be thrown if any of the bytes are not
+  * valid for the given encoding.  (This is not guaranteed to happen however).
+  *
+  * @param buf The array of bytes to determine the number of characters from.
+  * @param offset The index to start examining bytes from
+  * @param len The number of bytes to be converted
+  *
+  * @return The number of characters than can be decoded from the byte array
+  *
+  * @exception CharConversionException If the bytes do not evenly translate to characters, or an invalid byte is encountered.
+  */
+public abstract int
+charsInByteArray(byte[] buf, int offset, int len) throws CharConversionException;
+
+/*************************************************************************/
+
+/**
+  * This method converts an array of bytes to chars, returning the result in
+  * a newly allocated char array.
+  *
+  * @param buf The byte array to convert
+  *
+  * @return The converted char array
+  *
+  * @exception CharConversionException If an error occurs, such as an invalid byte in the source array.
+  */
+public char[]
+convertToChars(byte[] buf) throws CharConversionException
+{
+  return(convertToChars(buf, 0, buf.length));
+}
+
+/*************************************************************************/
+
+/**
+  * This method converts <code>len<code> bytes from a specified array to
+  * characters starting at index <code>offset</code> into the array.  The
+  * results are returned in a newly allocated char array.
+  *
+  * @param buf The byte array to convert
+  * @param offset The index into the array to start converting from
+  * @param len The number of bytes to convert
+  *
+  * @return The converted char array
+  *
+  * @exception CharConversionException If an error occurs, such as an invalid byte in the source array.
+  */
+public char[]
+convertToChars(byte[] buf, int offset, int len) throws CharConversionException
+{
+  char[] cbuf = new char[charsInByteArray(buf, offset, len)];
+
+  return(convertToChars(buf, offset, len, cbuf, 0));
+}
+
+/*************************************************************************/
+
+/**
+  * This method converts all the bytes in the specified array to characters
+  * and stores them into the supplied character array starting at index
+  * <code>cbuf_offset</code> into the destination char array.  The array itself
+  * is returned as a convenience for passing to other methods.
+  *
+  * Note that there must be enough space in the destination array to hold
+  * all the converted bytes, or an exception will be thrown.
+  *
+  * @param buf The byte array to convert
+  * @param cbuf The char array to store converted characters into
+  * @param cbuf_offset The index into the char array to start storing converted characters.
+  *
+  * @return The char array passed by the caller as a param, now filled with converted characters.
+  *
+  * @exception ArrayIndexOutOfBoundsException If the destination char array is not big enough to hold all the converted characters
+  * @exception CharConversionException If an error occurs, such as an invalid byte in the source array.
+  */
+public char[]
+convertToChars(byte[] buf, char[] cbuf, int cbuf_offset) throws
+                  CharConversionException
+{
+  return(convertToChars(buf, 0, buf.length, cbuf, cbuf_offset));
+}
+
+/*************************************************************************/
+
+/**
+  * This method converts <code>len</code> bytes in the specified array to 
+  * characters starting at position <code>buf_offset</code> in the array
+  * and stores them into the supplied character array starting at index
+  * <code>cbuf_offset</code> into the destination char array.  The array itself
+  * is returned as a convenience for passing to other methods.
+  *
+  * Note that there must be enough space in the destination array to hold
+  * all the converted bytes, or an exception will be thrown.
+  *
+  * @param buf The byte array to convert
+  * @param buf_offset The index into the byte array to start converting from
+  * @param len The number of bytes to convert
+  * @param cbuf The char array to store converted characters into
+  * @param cbuf_offset The index into the char array to start storing converted characters.
+  *
+  * @return The char array passed by the caller as a param, now filled with converted characters.
+  *
+  * @exception ArrayIndexOutOfBoundsException If the destination char array is not big enough to hold all the converted characters
+  * @exception CharConversionException If an error occurs, such as an invalid byte in the source array.
+  */
+public abstract char[]
+convertToChars(byte[] buf, int buf_offset, int len, char[] cbuf,
+               int cbuf_offset) throws CharConversionException;
+
+/*************************************************************************/
+
+/**
+  * Closes this stream and the underlying <code>InputStream</code>
+  * 
+  * @exception IOException If an error occurs
+  */
+public void
+close() throws IOException
+{
+  in.close();
+}
+
+/*************************************************************************/
+
+/**
+  * This method returns <code>false</code> to indicate that there is no
+  * guarantee this stream can be read successfully without blocking.  This
+  * is because even if bytes are available from the underlying
+  * <code>InputStream</code>, this method does not know if a particular
+  * encoding requires more than that number of bytes or not.  Subclasses
+  * that can make that determination should override this method.
+  * 
+  * @return <code>false</code> since there is no guarantee this stream is ready to be read
+  *
+  * @exception IOException If an error occurs
+  */
+public boolean
+ready() throws IOException
+{
+  return(false);
+}
+
+} // class Decoder
+
===================================================================
Checking out kaffe/libraries/javalib/gnu/java/io/decode/KaffeDecoder.java
RCS:  /home/cvs/kaffe/kaffe/libraries/javalib/gnu/java/io/decode/KaffeDecoder.java,v
VERS: 1.1
***************
--- /dev/null	Sun Aug  4 19:57:58 2002
+++ kaffe/libraries/javalib/gnu/java/io/decode/KaffeDecoder.java	Mon Jan 19 16:29:50 2004
@@ -0,0 +1,164 @@
+/*
+ * Java core library component.
+ *
+ * Copyright (c) 2004
+ *	Ito Kazumitsu <kaz@maczuka.gcd.org>
+ *
+ * See the file "license.terms" for information on usage and redistribution
+ * of this file.
+ */
+
+package gnu.java.io.decode;
+
+import java.io.IOException;
+import java.io.InputStream;
+import kaffe.io.ByteToCharConverter;
+
+/**
+  * This class behaves as gnu.java.io.decode.Decoder
+  * wrapping Kaffe's kaffe.io.ByteToCharConverter.
+  *
+  * @version 0.0
+  *
+  * @author Ito Kazumitsu (kaz@maczuka.gcd.org)
+  */
+public class KaffeDecoder extends Decoder
+{
+
+/*************************************************************************/
+
+/*
+ * Class Variables
+ */
+ 
+/*************************************************************************/
+
+/*
+ * Constructors
+ */
+public
+KaffeDecoder(InputStream in, String enc)
+{
+  super(in);
+  try {
+      converter = ByteToCharConverter.getConverter(enc);
+  }
+  catch (java.io.UnsupportedEncodingException _) {
+      converter = null;
+  }
+}
+
+/*
+ * Instance Variables
+ */
+
+ByteToCharConverter converter;
+
+/*************************************************************************/
+
+/*
+ * Instance Methods
+ */
+
+/**
+  * This method is supposed to return the number of chars that can be
+  * converted out of the <code>len</code> bytes in the specified array
+  * starting at <code>offset</code>.  But it is often the case that
+  * it is impossible to calculate such number without actually executing
+  * the conversion, and the converter may return a wrong value.
+  * So, you should avoid using this method.
+  */
+
+public int
+charsInByteArray(byte[] buf, int offset, int len)
+{
+  return (converter.getNumberOfChars(buf, offset, len));
+}
+
+/**
+  * Convert the requested bytes to chars
+  */
+public char[]
+convertToChars(byte[] buf, int buf_offset, int len)
+{
+  char[] cbuf = new char[len];
+  int olen = converter.convert(buf, buf_offset, len,
+                    cbuf, 0, cbuf.length);
+  char[] ret = new char[olen];
+  System.arraycopy(cbuf, 0, ret, 0, olen);
+  return(ret);
+}
+
+/**
+  * Convert the requested bytes to chars
+  */
+public char[]
+convertToChars(byte[] buf, int buf_offset, int len,
+               char[] cbuf, int cbuf_offset)
+{
+  converter.convert(buf, buf_offset, len,
+                    cbuf, cbuf_offset, cbuf.length - cbuf_offset);
+  return(cbuf);
+}
+
+/**
+  * Read the requested number of chars from the underlying stream.
+  * Some byte fragments may remain in the converter and they are
+  * used by the following read.  So read and convertToChars must
+  * not be used for the same converter instance.
+  */
+// copied from kaffe's java/io/InputStreamReader.java
+public int
+read ( char cbuf[], int off, int len ) throws IOException
+{
+    if (len < 0 || off < 0 || off + len > cbuf.length) {
+            throw new IndexOutOfBoundsException();
+    }
+
+    int outlen = 0;
+    boolean seenEOF = false;
+
+    byte[] inbuf = new byte[2048];
+
+    while (len > outlen) {
+        // First we retreive anything left in the converter
+        int inpos = converter.withdraw(inbuf, 0, inbuf.length);
+        int n = len - outlen;
+        int m = inbuf.length - inpos;
+        if (n > m) {
+            n = m;
+        }
+        int inlen = in.read(inbuf, inpos, n);
+        if (inlen < 0) {
+            inlen = 0;
+            seenEOF = true;
+        }
+        outlen += converter.convert(inbuf, 0, inpos+inlen, cbuf,
+                           off+outlen, len-outlen);
+        if (inlen < n || !ready()) {
+            break;
+        }
+    }
+    if (seenEOF && !converter.havePending()) {
+        return (-1);
+    }
+    return (outlen);
+}
+
+
+/**
+  * Checks if bytes are available in the underlying inputstream. If this 
+  * is true at least one character can be read without blocking. 
+  * 
+  * @return <code>true</code> iff there are > 0 bytes available for
+  * the underlying InputStream.
+  *
+  * @exception IOException If an error occurs
+  */
+public boolean
+ready() throws IOException
+{
+  return (in.available() > 0);
+}
+
+} // class KaffeDecoder
===================================================================
Checking out kaffe/libraries/javalib/gnu/java/io/encode/Encoder.java
RCS:  /home/cvs/kaffe/kaffe/libraries/javalib/gnu/java/io/encode/Encoder.java,v
VERS: 1.1
***************
--- /dev/null	Sun Aug  4 19:57:58 2002
+++ kaffe/libraries/javalib/gnu/java/io/encode/Encoder.java	Mon Jan 19 16:29:50 2004
@@ -0,0 +1,340 @@
+/* Encoder.java -- Base class for char->byte encoders
+   Copyright (C) 1998 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., 59 Temple Place, Suite 330, Boston, MA
+02111-1307 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 gnu.java.io.encode;
+
+import java.io.OutputStream;
+import java.io.Writer;
+import java.io.IOException;
+import java.io.CharConversionException;
+

*** Patch too long, truncated ***