From 946efde18162392b30967af66b61fb1e93eed09d Mon Sep 17 00:00:00 2001 From: Tom Tromey Date: Mon, 31 Jan 2000 04:53:47 +0000 Subject: config.h.in: Rebuilt. * include/config.h.in: Rebuilt. * acconfig.h (HAVE_ICONV): Define. * configure: Rebuilt. * configure.in: Check for `iconv' function. * gnu/gcj/convert/BytesToUnicode.java (getDecoder): Try iconv if no specific encoder exists. * gnu/gcj/convert/UnicodeToBytes.java (getEncoder): Try iconv if no specific encoder exists. * Makefile.in: Rebuilt. * Makefile.am (convert_source_files): Mention Input_iconv.java and Output_iconv.java. (nat_source_files): Added natIconv.cc. * gnu/gcj/convert/natIconv.cc: New file. * gnu/gcj/convert/Input_iconv.java: New file. * gnu/gcj/convert/Output_iconv.java: New file. From-SVN: r31708 --- libjava/gnu/gcj/convert/BytesToUnicode.java | 13 ++- libjava/gnu/gcj/convert/Input_iconv.java | 42 ++++++++ libjava/gnu/gcj/convert/Output_iconv.java | 42 ++++++++ libjava/gnu/gcj/convert/UnicodeToBytes.java | 15 ++- libjava/gnu/gcj/convert/natIconv.cc | 142 ++++++++++++++++++++++++++++ 5 files changed, 247 insertions(+), 7 deletions(-) create mode 100644 libjava/gnu/gcj/convert/Input_iconv.java create mode 100644 libjava/gnu/gcj/convert/Output_iconv.java create mode 100644 libjava/gnu/gcj/convert/natIconv.cc (limited to 'libjava/gnu') diff --git a/libjava/gnu/gcj/convert/BytesToUnicode.java b/libjava/gnu/gcj/convert/BytesToUnicode.java index e5302b7..1d96409 100644 --- a/libjava/gnu/gcj/convert/BytesToUnicode.java +++ b/libjava/gnu/gcj/convert/BytesToUnicode.java @@ -1,4 +1,4 @@ -/* Copyright (C) 1999 Red Hat, Inc. +/* Copyright (C) 1999, 2000 Red Hat, Inc. This file is part of libgcj. @@ -69,8 +69,15 @@ public abstract class BytesToUnicode } catch (Throwable ex) { - throw new java.io.UnsupportedEncodingException(encoding - + " (" + ex + ')'); + try + { + return new Input_iconv (encoding); + } + catch (Throwable _) + { + throw new java.io.UnsupportedEncodingException(encoding + + " (" + ex + ')'); + } } } diff --git a/libjava/gnu/gcj/convert/Input_iconv.java b/libjava/gnu/gcj/convert/Input_iconv.java new file mode 100644 index 0000000..7b5fb03 --- /dev/null +++ b/libjava/gnu/gcj/convert/Input_iconv.java @@ -0,0 +1,42 @@ +// Input_iconv.java -- Java side of iconv() reader. + +/* Copyright (C) 2000 Red Hat, Inc. + + 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; +import gnu.gcj.RawData; +import java.io.UnsupportedEncodingException; + +/** + * Convert bytes in some iconv-supported encoding to Unicode. + * @author Tom Tromey + * @date January 30, 2000 + */ + +public class Input_iconv extends BytesToUnicode +{ + public Input_iconv (String encoding) throws UnsupportedEncodingException + { + this.encoding = encoding; + this.handle = null; + init (encoding); + } + + public String getName() { return encoding; } + + public native void finalize (); + private native void init (String encoding) + throws UnsupportedEncodingException; + public native int read (char[] outbuffer, int outpos, int count); + + // The encoding we're using. + private String encoding; + + // The iconv handle. + private RawData handle; +} diff --git a/libjava/gnu/gcj/convert/Output_iconv.java b/libjava/gnu/gcj/convert/Output_iconv.java new file mode 100644 index 0000000..386028a --- /dev/null +++ b/libjava/gnu/gcj/convert/Output_iconv.java @@ -0,0 +1,42 @@ +// Output_iconv.java -- Java side of iconv() writer. + +/* Copyright (C) 2000 Red Hat, Inc. + + 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; +import gnu.gcj.RawData; +import java.io.UnsupportedEncodingException; + +/** + * Convert Unicode to bytes in some iconv-supported encoding. + * @author Tom Tromey + * @date January 30, 2000 + */ + +public class Output_iconv extends UnicodeToBytes +{ + public Output_iconv (String encoding) throws UnsupportedEncodingException + { + this.encoding = encoding; + this.handle = null; + init (encoding); + } + + public String getName() { return encoding; } + + public native void finalize (); + private native void init (String encoding) + throws UnsupportedEncodingException; + public native int write (char[] inbuffer, int inpos, int count); + + // The encoding we're using. + private String encoding; + + // The iconv handle. + private RawData handle; +} diff --git a/libjava/gnu/gcj/convert/UnicodeToBytes.java b/libjava/gnu/gcj/convert/UnicodeToBytes.java index 5a33003..b91a8cc 100644 --- a/libjava/gnu/gcj/convert/UnicodeToBytes.java +++ b/libjava/gnu/gcj/convert/UnicodeToBytes.java @@ -1,4 +1,4 @@ -/* Copyright (C) 1999 Red Hat, Inc. +/* Copyright (C) 1999, 2000 Red Hat, Inc. This file is part of libgcj. @@ -67,8 +67,16 @@ public abstract class UnicodeToBytes } catch (Throwable ex) { - throw new java.io.UnsupportedEncodingException(encoding + " (" - + ex + ')'); + try + { + return new Output_iconv (encoding); + } + catch (Throwable _) + { + // Put the original exception in the throwable. + throw new java.io.UnsupportedEncodingException(encoding + " (" + + ex + ')'); + } } } @@ -105,5 +113,4 @@ public abstract class UnicodeToBytes str.getChars(inpos, srcEnd, work, 0); return write(work, inpos, inlength); } - } diff --git a/libjava/gnu/gcj/convert/natIconv.cc b/libjava/gnu/gcj/convert/natIconv.cc new file mode 100644 index 0000000..129db7e --- /dev/null +++ b/libjava/gnu/gcj/convert/natIconv.cc @@ -0,0 +1,142 @@ +// Input_iconv.java -- Java side of iconv() reader. + +/* Copyright (C) 2000 Red Hat, Inc. + + 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. */ + +/* Author: Tom Tromey . */ + +#include + +#include +#include + +#include +#include +#include + +#ifdef HAVE_ICONV +#include +#endif + +void +gnu::gcj::convert::Input_iconv::init (jstring encoding) +{ +#ifdef HAVE_ICONV + jsize len = _Jv_GetStringUTFLength (encoding); + char buffer[len]; + _Jv_GetStringUTFRegion (encoding, 0, len, buffer); + + iconv_t h = iconv_open ("UCS-2", buffer); + if (h == (iconv_t) -1) + JvThrow (new java::io::UnsupportedEncodingException); + + JvAssert (h != NULL); + handle = reinterpret_cast (h); +#else /* HAVE_ICONV */ + // If no iconv, just throw an exception. + JvThrow (new java::io::UnsupportedEncodingException); +#endif /* HAVE_ICONV */ +} + +void +gnu::gcj::convert::Input_iconv::finalize (void) +{ +#ifdef HAVE_ICONV + if (handle == NULL) + { + iconv_close ((iconv_t) handle); + handle = NULL; + } +#endif /* HAVE_ICONV */ +} + +jint +gnu::gcj::convert::Input_iconv::read (jcharArray outbuffer, + jint outpos, jint count) +{ +#ifdef HAVE_ICONV + jint origpos = outpos; + + jbyte *bytes = elements (inbuffer); + jchar *out = elements (outbuffer); + size_t inavail = inlength - inpos; + size_t old_in = inavail; + size_t outavail = count; + size_t old_out = outavail; + + size_t r = iconv ((iconv_t) handle, + &bytes[inpos], &inavail, + &out[outpos], &outavail); + // FIXME: what if R==-1? + + inpos += old_in - inavail; + return old_out - outavail; +#else /* HAVE_ICONV */ + return -1; +#endif /* HAVE_ICONV */ +} + +void +gnu::gcj::convert::Output_iconv::init (jstring encoding) +{ +#ifdef HAVE_ICONV + jsize len = _Jv_GetStringUTFLength (encoding); + char buffer[len]; + _Jv_GetStringUTFRegion (encoding, 0, len, buffer); + + iconv_t h = iconv_open (buffer, "UCS-2"); + if (h == (iconv_t) -1) + JvThrow (new java::io::UnsupportedEncodingException); + + JvAssert (h != NULL); + handle = reinterpret_cast (h); +#else /* HAVE_ICONV */ + // If no iconv, just throw an exception. + JvThrow (new java::io::UnsupportedEncodingException); +#endif /* HAVE_ICONV */ +} + +void +gnu::gcj::convert::Output_iconv::finalize (void) +{ +#ifdef HAVE_ICONV + if (handle == NULL) + { + iconv_close ((iconv_t) handle); + handle = NULL; + } +#endif /* HAVE_ICONV */ +} + +jint +gnu::gcj::convert::Output_iconv::write (jcharArray inbuffer, + jint inpos, jint count) +{ +#ifdef HAVE_ICONV + jint origpos = outpos; + + jchar *chars = elements (inbuffer); + jbyte *out = elements (buf); + + size_t inavail = count; + size_t old_in = count; + + size_t outavail = buf->length - count; + size_t old_out = outavail; + + size_t r = iconv ((iconv_t) handle, + &chars[inpos], &inavail, + &out[count], &outavail); + // FIXME: what if R==-1? + + count += old_out - outavail; + return old_in - inavail; +#else /* HAVE_ICONV */ + return -1; +#endif /* HAVE_ICONV */ +} -- cgit v1.1