1 // Input_iconv.java -- Java side of iconv() reader.
3 /* Copyright (C) 2000 Free Software Foundation
5 This file is part of libgcj.
7 This software is copyrighted work licensed under the terms of the
8 Libgcj License. Please consult the file "LIBGCJ_LICENSE" for
11 /* Author: Tom Tromey <tromey@redhat.com>. */
18 #include <gnu/gcj/convert/Input_iconv.h>
19 #include <gnu/gcj/convert/Output_iconv.h>
20 #include <java/io/UnsupportedEncodingException.h>
27 iconv_adapter (size_t (*iconv_f) (iconv_t, T, size_t *, char **, size_t *),
28 iconv_t handle, char **inbuf, size_t *inavail,
29 char **outbuf, size_t *outavail)
31 return (*iconv_f) (handle, (T) inbuf, inavail, outbuf, outavail);
37 gnu::gcj::convert::Input_iconv::init (jstring encoding)
40 jsize len = _Jv_GetStringUTFLength (encoding);
42 _Jv_GetStringUTFRegion (encoding, 0, len, buffer);
44 iconv_t h = iconv_open ("UCS-2", buffer);
45 if (h == (iconv_t) -1)
46 JvThrow (new java::io::UnsupportedEncodingException);
49 handle = reinterpret_cast<gnu::gcj::RawData *> (h);
50 #else /* HAVE_ICONV */
51 // If no iconv, just throw an exception.
52 JvThrow (new java::io::UnsupportedEncodingException);
53 #endif /* HAVE_ICONV */
57 gnu::gcj::convert::Input_iconv::finalize (void)
62 iconv_close ((iconv_t) handle);
65 #endif /* HAVE_ICONV */
69 gnu::gcj::convert::Input_iconv::read (jcharArray outbuffer,
70 jint outpos, jint count)
73 jbyte *bytes = elements (inbuffer);
74 jchar *out = elements (outbuffer);
75 size_t inavail = inlength - inpos;
76 size_t old_in = inavail;
77 size_t outavail = count;
78 size_t old_out = outavail;
80 char *inbuf = (char *) &bytes[inpos];
81 char *outbuf = (char *) &out[outpos];
83 size_t r = iconv_adapter (iconv, (iconv_t) handle,
86 // FIXME: what if R==-1?
88 inpos += old_in - inavail;
89 return old_out - outavail;
90 #else /* HAVE_ICONV */
92 #endif /* HAVE_ICONV */
96 gnu::gcj::convert::Output_iconv::init (jstring encoding)
99 jsize len = _Jv_GetStringUTFLength (encoding);
101 _Jv_GetStringUTFRegion (encoding, 0, len, buffer);
103 iconv_t h = iconv_open (buffer, "UCS-2");
104 if (h == (iconv_t) -1)
105 JvThrow (new java::io::UnsupportedEncodingException);
107 JvAssert (h != NULL);
108 handle = reinterpret_cast<gnu::gcj::RawData *> (h);
109 #else /* HAVE_ICONV */
110 // If no iconv, just throw an exception.
111 JvThrow (new java::io::UnsupportedEncodingException);
112 #endif /* HAVE_ICONV */
116 gnu::gcj::convert::Output_iconv::finalize (void)
121 iconv_close ((iconv_t) handle);
124 #endif /* HAVE_ICONV */
128 gnu::gcj::convert::Output_iconv::write (jcharArray inbuffer,
129 jint inpos, jint count)
132 jchar *chars = elements (inbuffer);
133 jbyte *out = elements (buf);
135 size_t inavail = count;
136 size_t old_in = count;
138 size_t outavail = buf->length - count;
139 size_t old_out = outavail;
141 char *inbuf = (char *) &chars[inpos];
142 char *outbuf = (char *) &out[count];
144 size_t r = iconv_adapter (iconv, (iconv_t) handle,
147 // FIXME: what if R==-1?
149 count += old_out - outavail;
150 return old_in - inavail;
151 #else /* HAVE_ICONV */
153 #endif /* HAVE_ICONV */