diff options
author | Tom Tromey <tromey@gcc.gnu.org> | 1999-04-07 14:42:40 +0000 |
---|---|---|
committer | Tom Tromey <tromey@gcc.gnu.org> | 1999-04-07 14:42:40 +0000 |
commit | ee9dd3721be68b9fa63dea9aa5a1d86e66958cde (patch) | |
tree | d96801a16fdf03a5682ef98730fe333a46eef944 /libjava/gnu/gcj/convert/BytesToUnicode.java | |
parent | 140fa895c6b859f827fc4437b91775a82cd105fb (diff) | |
download | gcc-ee9dd3721be68b9fa63dea9aa5a1d86e66958cde.zip gcc-ee9dd3721be68b9fa63dea9aa5a1d86e66958cde.tar.gz gcc-ee9dd3721be68b9fa63dea9aa5a1d86e66958cde.tar.bz2 |
Initial revision
From-SVN: r26263
Diffstat (limited to 'libjava/gnu/gcj/convert/BytesToUnicode.java')
-rw-r--r-- | libjava/gnu/gcj/convert/BytesToUnicode.java | 105 |
1 files changed, 105 insertions, 0 deletions
diff --git a/libjava/gnu/gcj/convert/BytesToUnicode.java b/libjava/gnu/gcj/convert/BytesToUnicode.java new file mode 100644 index 0000000..21c1e7e --- /dev/null +++ b/libjava/gnu/gcj/convert/BytesToUnicode.java @@ -0,0 +1,105 @@ +/* Copyright (C) 1999 Cygnus Solutions + + This file is part of libgcj. + +This software is copyrighted work licensed under the terms of the +Libgcj License. Please consult the file "LIBGCJ_LICENSE" for +details. */ + +package gnu.gcj.convert; + +public abstract class BytesToUnicode +{ + /** Buffer to read bytes from. + * The characters inbuffer[inpos] ... inbuffer[inlength-1] are available. */ + public byte[] inbuffer; + /** Starting index in buffer to read bytes from. */ + public int inpos; + /** End of valid bytes in buffer. */ + public int inlength; + + static Class defaultDecodingClass; + + static synchronized void getDefaultDecodingClass() + { + // Test (defaultDecodingClass == null) again in case of race condition. + if (defaultDecodingClass == null) + { + String encoding = System.getProperty("file.encoding"); + String className = "gnu.gcj.convert.Input_"+encoding; + try + { + defaultDecodingClass = Class.forName(className); + } + catch (ClassNotFoundException ex) + { + throw new NoClassDefFoundError("missing default encoding " + + encoding + " (class " + + className + " not found)"); + } + } + } + + public abstract String getName(); + + public static BytesToUnicode getDefaultDecoder() + { + try + { + if (defaultDecodingClass == null) + getDefaultDecodingClass(); + return (BytesToUnicode) defaultDecodingClass.newInstance(); + } + catch (Throwable ex) + { + return new Input_8859_1(); + } + } + + /** Get a byte-stream->char-stream converter given an encoding name. */ + public static BytesToUnicode getDecoder (String encoding) + throws java.io.UnsupportedEncodingException + { + String className = "gnu.gcj.convert.Input_"+encoding; + Class decodingClass; + try + { + decodingClass = Class.forName(className); + return (BytesToUnicode) decodingClass.newInstance(); + } + catch (Throwable ex) + { + throw new java.io.UnsupportedEncodingException(encoding + + " (" + ex + ')'); + } + } + + /** Make input bytes available to the conversion. + * @param buffer source of input bytes + * @param pos index of first available byte + * @param length one more than index of last available byte + */ + public final void setInput(byte[] buffer, int pos, int length) + { + inbuffer = buffer; + inpos = pos; + inlength = length; + } + + /** Convert bytes to chars. + * Input bytes are taken from this.inbuffer. The available input + * bytes start at inbuffer[inpos], and end at inbuffer[inlength-1]. + * @param outbuffer buffer for the converted character + * @param outpos position in buffer to start putting converted characters + * @param outlength the maximum number of characters to read + * @return number of chars placed in outbuffer. + * Also, this.inpos is incremented by the number of bytes consumed. + * + * (Note the asymmetry in that the input upper bound is inbuffer[inlength-1], + * while the output upper bound is outbuffer[outpos+outlength-1]. The + * justification is that inlength is like the count field of a + * BufferedInputStream, while the outlength parameter is like the + * length parameter of a read request.) + */ + public abstract int read (char[] outbuffer, int outpos, int outlength); +} |