2
*** iconv_open(), iconv(), iconv_close() wrappers for the OS/400.
4
*** See Copyright for the status of this software.
6
*** Author: Patrick Monnerat <pm@datasphere.ch>, DATASPHERE S.A.
13
#include "/QIBM/include/iconv.h" /* Force system definition. */
15
#define USE_SYSTEM_ICONV
16
#include "iconv.h" /* Use local definitions. */
21
*** Bring-in the name-->CCSID mapping DFA tables.
24
#include "ianatables.c"
29
findEncoding(const unsigned char * * namep)
32
t_staterange curstate;
37
const unsigned char * name;
40
*** Get the CCSID correspong to the name at *`namep'.
41
*** If success, update pointer at `namep' to 1st byte after matched
42
*** name and return the CCSID.
43
*** If failure, set errno and return -1.
46
if (!namep || !(name = *namep)) {
55
if (curstate < sizeof final_array / sizeof final_array[0])
56
if (final_array[curstate]) {
57
final = final_array[curstate];
61
l = trans_array[curstate] - 1;
62
h = trans_array[curstate + 1];
73
} while (label_array[l] != *name);
75
curstate = goto_array[l];
84
makeos400codename(char * buf, unsigned int ccsid)
89
sprintf(buf, "IBMCCSID%05u0000000", ccsid);
94
IconvOpen(const char * tocode, const char * fromcode)
97
int toccsid = findEncoding(&tocode);
98
int fromccsid = findEncoding(&fromcode);
99
char fromibmccsid[33];
103
if (toccsid < 0 || fromccsid < 0)
106
makeos400codename(fromibmccsid, fromccsid);
107
makeos400codename(toibmccsid, toccsid);
108
memset(toibmccsid + 13, 0, sizeof toibmccsid - 13);
110
cd = (iconv_t *) malloc(sizeof *cd);
115
*cd = iconv_open(toibmccsid, fromibmccsid);
117
if (cd->return_value) {
127
Iconv(Iconv_t cd, char * * inbuf, size_t * inbytesleft,
128
char * * outbuf, size_t * outbytesleft)
131
if (!cd || cd == (Iconv_t) -1) {
136
return iconv(*(iconv_t *) cd, inbuf, inbytesleft, outbuf, outbytesleft);
141
IconvClose(Iconv_t cd)
144
if (!cd || cd == (Iconv_t) -1) {
149
if (iconv_close(*(iconv_t *) cd))