aboutsummaryrefslogtreecommitdiff
path: root/libjava/gnu/gcj/convert/BytesToUnicode.java
diff options
context:
space:
mode:
authorTom Tromey <tromey@gcc.gnu.org>1999-04-07 14:42:40 +0000
committerTom Tromey <tromey@gcc.gnu.org>1999-04-07 14:42:40 +0000
commitee9dd3721be68b9fa63dea9aa5a1d86e66958cde (patch)
treed96801a16fdf03a5682ef98730fe333a46eef944 /libjava/gnu/gcj/convert/BytesToUnicode.java
parent140fa895c6b859f827fc4437b91775a82cd105fb (diff)
downloadgcc-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.java105
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);
+}