diff options
Diffstat (limited to 'src/gnu/java')
| -rw-r--r-- | src/gnu/java/nio/charset/ByteCharset.java | 188 | ||||
| -rw-r--r-- | src/gnu/java/nio/charset/Cp437.java | 90 | 
2 files changed, 278 insertions, 0 deletions
diff --git a/src/gnu/java/nio/charset/ByteCharset.java b/src/gnu/java/nio/charset/ByteCharset.java new file mode 100644 index 0000000..a7de91c --- /dev/null +++ b/src/gnu/java/nio/charset/ByteCharset.java @@ -0,0 +1,188 @@ +/* ByteCharset.java -- Abstract class for generic 1-byte encodings. +   Copyright (C) 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 gnu.java.nio.charset; + +import java.nio.ByteBuffer; +import java.nio.CharBuffer; +import java.nio.charset.Charset; +import java.nio.charset.CharsetDecoder; +import java.nio.charset.CharsetEncoder; +import java.nio.charset.CoderResult; + +/** + * A generic encoding framework for single-byte encodings,  + * utilizing a look-up table. + *  + * This replaces the gnu.java.io.EncoderEightBitLookup class,  + * created by Aron Renn. + * + * @author Sven de Marothy + */ +abstract class ByteCharset extends Charset +{ +  protected char[] lookupTable; +    /** +     * Char to signify the character in the table is undefined +     */ +  protected static final char NONE = (char)0xFFFD; + +  ByteCharset (String canonicalName, String[] aliases) +  { +    super (canonicalName, aliases); +  } + +  /** +   * Most western charsets include ASCII, but this should +   * be overloaded for others. +   */ +  public boolean contains (Charset cs) +  { +//    return cs instanceof US_ASCII || (cs.getClass() == getClass()); +    return cs.getClass() == cs.getClass(); +  } + +  char[] getLookupTable() +  { +    return lookupTable; +  } + +  public CharsetDecoder newDecoder () +  { +    return new Decoder (this); +  } + +  public CharsetEncoder newEncoder () +  { +    return new Encoder (this); +  } + +  private static final class Decoder extends CharsetDecoder +  { +    private char[] lookup; + +    // Package-private to avoid a trampoline constructor. +    Decoder (ByteCharset cs) +    { +      super (cs, 1.0f, 1.0f); +      lookup = cs.getLookupTable(); +    } + +    protected CoderResult decodeLoop (ByteBuffer in, CharBuffer out) +    { +      // TODO: Optimize this in the case in.hasArray() / out.hasArray() +      while (in.hasRemaining ()) +      { +        byte b = in.get (); +	char c; + +        if (!out.hasRemaining ()) +          { +            in.position (in.position () - 1); +            return CoderResult.OVERFLOW; +          } +	 +	if((c = lookup[(int) (b & 0xFF)]) == NONE); +	//	  return CoderResult.unmappableForLength (1);		 +        out.put (c); +      } + +      return CoderResult.UNDERFLOW; +    } +  } + +  private static final class Encoder extends CharsetEncoder +  { +    private byte[] lookup; + +    // Package-private to avoid a trampoline constructor. +    Encoder (ByteCharset cs) +    { +      super (cs, 1.0f, 1.0f); + +      char[] lookup_table = cs.getLookupTable(); + +      // Create the inverse look-up table. +      // determine required size of encoding_table:  +      int max = 0;  +      for (int i = 0; i < lookup_table.length; i++) +	  { +	      int c = (int)lookup_table[i];  +	      max = (c > max && c < NONE) ? c : max; +	  } + +      lookup = new byte[max+1]; +       +      for (int i = 0; i < lookup_table.length; i++) +	  { +	    int c = (int)lookup_table[i];  +	    if (c != 0 && c < NONE)  +	      { +		lookup[c] = (byte)i; +	      } +	  } +    } + +    protected CoderResult encodeLoop (CharBuffer in, ByteBuffer out) +    { +      // TODO: Optimize this in the case in.hasArray() / out.hasArray() +      while (in.hasRemaining ()) +      { +	int c = (int)in.get (); + +        if (!out.hasRemaining ()) +          { +            in.position (in.position () - 1); +            return CoderResult.OVERFLOW; +          } + +	// lookup byte encoding +	byte b = (c < lookup.length) ? lookup[c] : (byte)0; + +	if ((int)b != 0 || (int)c == 0) +	    { +		out.put (b); +	    } else { +		in.position (in.position () - 1); +		return CoderResult.unmappableForLength (1);		 +	    } +      } + +      return CoderResult.UNDERFLOW; +    } +  } +} diff --git a/src/gnu/java/nio/charset/Cp437.java b/src/gnu/java/nio/charset/Cp437.java new file mode 100644 index 0000000..a2e8bbe --- /dev/null +++ b/src/gnu/java/nio/charset/Cp437.java @@ -0,0 +1,90 @@ +/* Cp437.java -- Charset implementation for the Cp437 character set. +   Copyright (C) 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 gnu.java.nio.charset; + +public class Cp437 extends ByteCharset +{ +    public static final String NAME = "CP437"; + +  /** +   * This is the lookup table for this encoding +   */ +    private static final char[]	lookup = +    { +	0x0000, 0x0001, 0x0002, 0x0003, 0x0004, 0x0005, 0x0006, 0x0007,  +	0x0008, 0x0009, 0x000A, 0x000B, 0x000C, 0x000D, 0x000E, 0x000F,  +	0x0010, 0x0011, 0x0012, 0x0013, 0x0014, 0x0015, 0x0016, 0x0017,  +	0x0018, 0x0019, 0x001A, 0x001B, 0x001C, 0x001D, 0x001E, 0x001F,  +	0x0020, 0x0021, 0x0022, 0x0023, 0x0024, 0x0025, 0x0026, 0x0027,  +	0x0028, 0x0029, 0x002A, 0x002B, 0x002C, 0x002D, 0x002E, 0x002F,  +	0x0030, 0x0031, 0x0032, 0x0033, 0x0034, 0x0035, 0x0036, 0x0037,  +	0x0038, 0x0039, 0x003A, 0x003B, 0x003C, 0x003D, 0x003E, 0x003F,  +	0x0040, 0x0041, 0x0042, 0x0043, 0x0044, 0x0045, 0x0046, 0x0047,  +	0x0048, 0x0049, 0x004A, 0x004B, 0x004C, 0x004D, 0x004E, 0x004F,  +	0x0050, 0x0051, 0x0052, 0x0053, 0x0054, 0x0055, 0x0056, 0x0057,  +	0x0058, 0x0059, 0x005A, 0x005B, 0x005C, 0x005D, 0x005E, 0x005F,  +	0x0060, 0x0061, 0x0062, 0x0063, 0x0064, 0x0065, 0x0066, 0x0067,  +	0x0068, 0x0069, 0x006A, 0x006B, 0x006C, 0x006D, 0x006E, 0x006F,  +	0x0070, 0x0071, 0x0072, 0x0073, 0x0074, 0x0075, 0x0076, 0x0077,  +	0x0078, 0x0079, 0x007A, 0x007B, 0x007C, 0x007D, 0x007E, 0x007F,  +	0x00C7, 0x00FC, 0x00E9, 0x00E2, 0x00E4, 0x00E0, 0x00E5, 0x00E7,  +	0x00EA, 0x00EB, 0x00E8, 0x00EF, 0x00EE, 0x00EC, 0x00C4, 0x00C5,  +	0x00C9, 0x00E6, 0x00C6, 0x00F4, 0x00F6, 0x00F2, 0x00FB, 0x00F9,  +	0x00FF, 0x00D6, 0x00DC, 0x00A2, 0x00A3, 0x00A5, 0x20A7, 0x0192,  +	0x00E1, 0x00ED, 0x00F3, 0x00FA, 0x00F1, 0x00D1, 0x00AA, 0x00BA,  +	0x00BF, 0x2310, 0x00AC, 0x00BD, 0x00BC, 0x00A1, 0x00AB, 0x00BB,  +	0x2591, 0x2592, 0x2593, 0x2502, 0x2524, 0x2561, 0x2562, 0x2556,  +	0x2555, 0x2563, 0x2551, 0x2557, 0x255D, 0x255C, 0x255B, 0x2510,  +	0x2514, 0x2534, 0x252C, 0x251C, 0x2500, 0x253C, 0x255E, 0x255F,  +	0x255A, 0x2554, 0x2569, 0x2566, 0x2560, 0x2550, 0x256C, 0x2567,  +	0x2568, 0x2564, 0x2565, 0x2559, 0x2558, 0x2552, 0x2553, 0x256B,  +	0x256A, 0x2518, 0x250C, 0x2588, 0x2584, 0x258C, 0x2590, 0x2580,  +	0x03B1, 0x00DF, 0x0393, 0x03C0, 0x03A3, 0x03C3, 0x00B5, 0x03C4,  +	0x03A6, 0x0398, 0x03A9, 0x03B4, 0x221E, 0x03C6, 0x03B5, 0x2229,  +	0x2261, 0x00B1, 0x2265, 0x2264, 0x2320, 0x2321, 0x00F7, 0x2248,  +	0x00B0, 0x2219, 0x00B7, 0x221A, 0x207F, 0x00B2, 0x25A0, 0x00A0 +    }; + +    public Cp437() +    { +	super("Cp437", new String[] { +	}); +	lookupTable = lookup; +    } + +} // class Cp437  | 
