glibc/iconvdata/johab.c
Ulrich Drepper 9b26f5c47d Update.
<<<<<<< ChangeLog
1998-04-23 22:43  Ulrich Drepper  <drepper@cygnus.com>

	* elf/dl-load.c (fillin_rpath): Handle empty element returned by
	strsep as current directory.

	* iconv/gconv_builtin.h: Add aliases unicode and unicodebig for
	Java.  Add definitions for unicodelittle implementation.
	* iconv/gconv_int.h: Add declaration for unicodelittle functions.
	* iconv/gconv_simple.c: Define unicodelittle functions.

	* iconv/iconv_prog.c: Make program print information about position
	of illegal character in input.

	* iconv/skeleton.c: Use __strcasecmp instead of __strcasestr for
	comparison of charset name.
	* iconvdata/big5.c (CHARSET_NAME): Adapt for this.
	* iconvdata/ebcdic-at-de-a.c: Likewise.
	* iconvdata/ebcdic-at-de.c: Likewise.
	* iconvdata/ebcdic-ca-fr.c: Likewise.
	* iconvdata/euccn.c: Likewise.
	* iconvdata/eucjp.c: Likewise.
	* iconvdata/euckr.c: Likewise.
	* iconvdata/euctw.c: Likewise.
	* iconvdata/hp-roman8.c: Likewise.
	* iconvdata/iso6937.c: Likewise.
	* iconvdata/iso8859-1.c: Likewise.
	* iconvdata/iso8859-10.c: Likewise.
	* iconvdata/iso8859-2.c: Likewise.
	* iconvdata/iso8859-3.c: Likewise.
	* iconvdata/iso8859-4.c: Likewise.
	* iconvdata/iso8859-5.c: Likewise.
	* iconvdata/iso8859-6.c: Likewise.
	* iconvdata/iso8859-7.c: Likewise.
	* iconvdata/iso8859-8.c: Likewise.
	* iconvdata/iso8859-9.c: Likewise.
	* iconvdata/johab.c: Likewise.
	* iconvdata/koi-8.c: Likewise.
	* iconvdata/koi8-r.c: Likewise.
	* iconvdata/latin-greek-1.c: Likewise.
	* iconvdata/latin-greek.c: Likewise.
	* iconvdata/sjis.c: Likewise.
	* iconvdata/t61.c: Likewise.
	* iconvdata/uhc.c: Likewise.

	* iconvdata/iso646.c: Add support for more ISO 646 variants.
	* iconvdata/TESTS: Add tests for ISO646 module.
	* iconvdata/gconv-modules: Add new modules.
	* iconvdata/testdate/CSA_Z243.4-1985-1: New tests for ISO646 module.
	* iconvdata/testdate/CSA_Z243.4-1985-1..UCS2: Likewise.
	* iconvdata/testdate/CSA_Z243.4-1985-2: Likewise.
	* iconvdata/testdate/CSA_Z243.4-1985-2..UCS4: Likewise.
	* iconvdata/testdate/DIN_66003: Likewise.
	* iconvdata/testdate/DIN_66003..UTF8: Likewise.
	* iconvdata/testdate/DS_2089: Likewise.
	* iconvdata/testdate/DS_2089..UTF8: Likewise.
	* iconvdata/testdate/ES: Likewise.
	* iconvdata/testdate/ES..UTF8: Likewise.
	* iconvdata/testdate/ES2: Likewise.
	* iconvdata/testdate/ES2..UTF8: Likewise.
	* iconvdata/testdate/GB_1988-80: Likewise.
	* iconvdata/testdate/GB_1988-80..UTF8: Likewise.
	* iconvdata/testdate/IT: Likewise.
	* iconvdata/testdate/IT..UTF8: Likewise.
	* iconvdata/testdate/JIS_C6220-1969-RO: Likewise.
	* iconvdata/testdate/JIS_C6220-1969-RO..UTF8: Likewise.
	* iconvdata/testdate/JIS_C6229-1984-B: Likewise.
	* iconvdata/testdate/JIS_C6229-1984-B..UTF8: Likewise.
	* iconvdata/testdate/JUS_I.B1.002: Likewise.
	* iconvdata/testdate/JUS_I.B1.002..UTF8: Likewise.
	* iconvdata/testdate/KSC5636: Likewise.
	* iconvdata/testdate/KSC5636..UTF8: Likewise.
	* iconvdata/testdate/MSZ_7795.3: Likewise.
	* iconvdata/testdate/MSZ_7795.3..UTF8: Likewise.
	* iconvdata/testdate/NC_NC00-10: Likewise.
	* iconvdata/testdate/NC_NC00-10..UTF8: Likewise.
	* iconvdata/testdate/NF_Z_62-010: Likewise.
	* iconvdata/testdate/NF_Z_62-010..UTF8: Likewise.
	* iconvdata/testdate/NF_Z_62-010_1973: Likewise.
	* iconvdata/testdate/NF_Z_62-010_1973..UTF8: Likewise.
	* iconvdata/testdate/NS_4551-1: Likewise.
	* iconvdata/testdate/NS_4551-1..UTF8: Likewise.
	* iconvdata/testdate/NS_4551-2: Likewise.
	* iconvdata/testdate/NS_4551-2..UTF8: Likewise.
	* iconvdata/testdate/PT: Likewise.
	* iconvdata/testdate/PT..UTF8: Likewise.
	* iconvdata/testdate/PT2: Likewise.
	* iconvdata/testdate/PT2..UTF8: Likewise.
	* iconvdata/testdate/SEN_850200_B: Likewise.
	* iconvdata/testdate/SEN_850200_B..UTF8: Likewise.
	* iconvdata/testdate/SEN_850200_C: Likewise.
	* iconvdata/testdate/SEN_850200_C..UTF8: Likewise.

	* iconvdata/cns11643.h: Use uint32_t instead of wchar_t.
	* iconvdata/cns11643l1.h: Likewise.
	* iconvdata/latin-greek-1.h: Likewise.
	* iconvdata/latin-greek.h: Likewise.
	* iconvdata/koi8-r.h: Likewise.
	* iconvdata/jis0212.h: Likewise.
	* iconvdata/gb2312.h: Likewise.
	* iconvdata/ksc5601.h: Likewise.

	* iconvdata/8bit-gap.c: Use 32 bit type for idx element of struct gap.

	* iconvdata/Makefile: Add rules for lots of more modules.
	* iconvdata/cp1250.c: New file.
	* iconvdata/cp1251.c: New file.
	* iconvdata/cp1252.c: New file.
	* iconvdata/cp1253.c: New file.
	* iconvdata/cp1254.c: New file.
	* iconvdata/cp1255.c: New file.
	* iconvdata/cp1256.c: New file.
	* iconvdata/cp1257.c: New file.
	* iconvdata/ebcdic-dk-no-a.c: New file.
	* iconvdata/ebcdic-dk-no.c: New file.
	* iconvdata/ebcdic-es-a.c: New file.
	* iconvdata/ebcdic-es-s.c: New file.
	* iconvdata/ebcdic-es.c: New file.
	* iconvdata/ebcdic-fi-se-a.c: New file.
	* iconvdata/ebcdic-fi-se.c: New file.
	* iconvdata/ebcdic-fr.c: New file.
	* iconvdata/ebcdic-is-friss.c: New file.
	* iconvdata/ebcdic-it.c: New file.
	* iconvdata/ebcdic-pt.c: New file.
	* iconvdata/ebcdic-uk.c: New file.
	* iconvdata/ebcdic-us.c: New file.
	* iconvdata/ibm037.c: New file.
	* iconvdata/ibm038.c: New file.
	* iconvdata/ibm1004.c: New file.
	* iconvdata/ibm1026.c: New file.
	* iconvdata/ibm1047.c: New file.
	* iconvdata/ibm256.c: New file.
	* iconvdata/ibm273.c: New file.
	* iconvdata/ibm274.c: New file.
	* iconvdata/ibm275.c: New file.
	* iconvdata/ibm277.c: New file.
	* iconvdata/ibm278.c: New file.
	* iconvdata/ibm280.c: New file.
	* iconvdata/ibm281.c: New file.
	* iconvdata/ibm284.c: New file.
	* iconvdata/ibm285.c: New file.
	* iconvdata/ibm290.c: New file.
	* iconvdata/ibm297.c: New file.
	* iconvdata/ibm420.c: New file.
	* iconvdata/ibm423.c: New file.
	* iconvdata/ibm424.c: New file.
	* iconvdata/ibm437.c: New file.
	* iconvdata/ibm500.c: New file.
	* iconvdata/ibm850.c: New file.
	* iconvdata/ibm851.c: New file.
	* iconvdata/ibm852.c: New file.
	* iconvdata/ibm855.c: New file.
	* iconvdata/ibm857.c: New file.
	* iconvdata/ibm860.c: New file.
	* iconvdata/ibm861.c: New file.
	* iconvdata/ibm862.c: New file.
	* iconvdata/ibm863.c: New file.
	* iconvdata/ibm864.c: New file.
	* iconvdata/ibm865.c: New file.
	* iconvdata/ibm868.c: New file.
	* iconvdata/ibm869.c: New file.
	* iconvdata/ibm870.c: New file.
	* iconvdata/ibm871.c: New file.
	* iconvdata/ibm875.c: New file.
	* iconvdata/ibm880.c: New file.
	* iconvdata/ibm891.c: New file.
	* iconvdata/ibm903.c: New file.
	* iconvdata/ibm904.c: New file.
	* iconvdata/ibm905.c: New file.
	* iconvdata/ibm918.c: New file.

	* locale/iso-4217.def: Update.
	* localedata/locales/pt_BR: Correct.  Patches by Andreas Jaeger.

	* stdio-common/vfscanf.h: Recognize nan and inf in floating-point
	formats.

1998-04-22  Andreas Jaeger  <aj@arthur.rhein-neckar.de>

	* elf/dl-load.c (_dl_init_paths): ';' is also a terminal for
	LD_LIBRARY_PATH.

1998-04-22  Gordon Matzigkeit  <gord@profitpress.com>

	* Makerules: Change occurances of `cd dir; cmd' to `cd dir && cmd'.
	* Makefile: Likewise.
	* posix/Makefile: Likewise.
	* sysdeps/mach/hurd/Makefile: Likewise.

1998-04-22  Gordon Matzigkeit  <gord@profitpress.com>

	* sysdeps/mach/hurd/bits/dirent.h: New file.
	* sysdeps/mach/hurd/readdir64.c: New file.
	* sysdeps/mach/hurd/readdir64_r.c: New file.

1998-04-21  Gordon Matzigkeit  <gord@profitpress.com>

	* stdio/stdio.h (vasprintf, __asprintf, asprintf, vdprintf,
	dprintf): Synchronize declarations with libio/stdio.h.

1998-04-21  Gordon Matzigkeit  <gord@profitpress.com>

	* elf/dlerror.c (dlerror): Don't assume that
	__libc_internal_tsd_get is defined.  __libc_getspecific is already
	well-protected, so just use it directly.

1998-04-22  Gordon Matzigkeit  <gord@profitpress.com>

	* io/ftw.h (ftw): Fix typo.

1998-04-21  Gordon Matzigkeit  <gord@profitpress.com>

	* sysdeps/gnu/utmp_file.c: Fix typo.

1998-04-22 11:06  Andreas Schwab  <schwab@issan.informatik.uni-dortmund.de>

	* iconvdata/run-iconv-test.sh: Fix more portability bugs.  When
	one part of a test fails move on to the next test.

1998-04-21  Andreas Schwab  <schwab@issan.informatik.uni-dortmund.de>

	* sysdeps/i386/bits/setjmp.h (_JMPBUF_UNWINDS): Compare addresses
	as pointers, not signed integers.

1998-04-22 11:06  Andreas Schwab  <schwab@issan.informatik.uni-dortmund.de>
1998-04-24 07:07:59 +00:00

412 lines
12 KiB
C

/* Mapping tables for JOHAB handling.
Copyright (C) 1998 Free Software Foundation, Inc.
This file is part of the GNU C Library.
Contributed by Jungshik Shin <jshin@pantheon.yale.edu>
and Ulrich Drepper <drepper@cygnus.com>, 1998.
The GNU C Library is free software; you can redistribute it and/or
modify it under the terms of the GNU Library General Public License as
published by the Free Software Foundation; either version 2 of the
License, or (at your option) any later version.
The GNU C Library is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
Library General Public License for more details.
You should have received a copy of the GNU Library General Public
License along with the GNU C Library; see the file COPYING.LIB. If not,
write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
Boston, MA 02111-1307, USA. */
#include <stdint.h>
#include <ksc5601.h>
/* The table for Bit pattern to Hangul Jamo
5 bits each are used to encode
leading consonants(19 + 1 filler), medial vowels(21 + 1 filler)
and trailing consonants(27 + 1 filler).
KS C 5601-1992 Annex 3 Table 2
0 : Filler, -1: invalid, >= 1 : valid
*/
static const int init[32] =
{
-1, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18,
19, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1
};
static const int mid[32] =
{
-1, -1, 0, 1, 2, 3, 4, 5,
-1, -1, 6, 7, 8, 9, 10, 11,
-1, -1, 12, 13, 14, 15, 16, 17,
-1, -1, 18, 19, 20, 21, -1, -1
};
static const int final[32] =
{
-1, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16,
-1, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, -1, -1
};
/*
Hangul Jamo in Johab to Unicode 2.0 : Unicode 2.0
defines 51 Hangul Compatibility Jamos in the block [0x3131,0x314e]
It's to be considered later which Jamo block to use, Compatibility
block [0x3131,0x314e] or Hangul Conjoining Jamo block, [0x1100,0x11ff]
*/
static const uint32_t init_to_ucs[19] =
{
0x3131, 0x3132, 0x3134, 0x3137, 0x3138, 0x3139, 0x3141, 0x3142,
0x3143, 0x3145, 0x3146, 0x3147, 0x3148, 0x3149, 0x314a, 0x314b,
0x314c, 0x314d, 0x314e
};
static const uint32_t final_to_ucs[27] =
{
L'\0', L'\0', 0x3133, L'\0', 0x3135, 0x3136, L'\0', L'\0',
0x313a, 0x313b, 0x314c, 0x313d, 0x313e, 0x313f,
0x3140, L'\0', L'\0', 0x3144, L'\0', L'\0', L'\0',
L'\0', L'\0', L'\0', L'\0', L'\0', L'\0'
};
/* The following three arrays are used to convert
precomposed Hangul syllables in [0xac00,0xd???]
to Jamo bit patterns for Johab encoding
cf. : KS C 5601-1992, Annex3 Table 2
Arrays are used to speed up things although it's possible
to get the same result arithmetically.
*/
static const int init_to_bit[19] =
{
0x8800, 0x8c00, 0x9000, 0x9400, 0x9800, 0x9c00,
0xa000, 0xa400, 0xa800, 0xac00, 0xb000, 0xb400,
0xb800, 0xbc00, 0xc000, 0xc400, 0xc800, 0xcc00,
0xd000
};
static const int mid_to_bit[21] =
{
0x0060, 0x0080, 0x00a0, 0x00c0, 0x00e0,
0x0140, 0x0160, 0x0180, 0x01a0, 0x01c0, 0x1e0,
0x0240, 0x0260, 0x0280, 0x02a0, 0x02c0, 0x02e0,
0x0340, 0x0360, 0x0380, 0x03a0
};
static const int final_to_bit[28] =
{
1, 2, 3, 4, 5, 6, 7, 8, 9, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f, 0x10, 0x11,
0x13, 0x14, 0x15, 0x16, 0x17, 0x18, 0x19, 0x1a, 0x1b, 0x1c, 0x1d
};
/* The conversion table from
UCS4 Hangul Compatibility Jamo in [0x3131,0x3163]
to Johab
cf. 1. KS C 5601-1992 Annex 3 Table 2
2. Unicode 2.0 manual
*/
static const uint16_t jamo_from_ucs_table[51] =
{
0x8841, 0x8c41,
0x8444,
0x9041,
0x8446, 0x8447,
0x9441, 0x9841, 0x9c41,
0x844a, 0x844b, 0x844c, 0x844d, 0x884e, 0x884f, 0x8450,
0xa041, 0xa441, 0xa841,
0x8454,
0xac41, 0xb041, 0xb441, 0xb841, 0xbc41,
0xc041, 0xc441, 0xc841, 0xca41, 0xd041,
0x8461, 0x8481, 0x84a1, 0x84c1, 0x84e1,
0x8541, 0x8561, 0x8581, 0x85a1, 0x85c1, 0x85e1,
0x8641, 0x8661, 0x8681, 0x86a1, 0x86c1, 0x86e1,
0x8741, 0x8761, 0x8781, 0x87a1
};
static inline uint32_t
johab_sym_hanja_to_ucs (uint_fast32_t idx, uint_fast32_t c1, uint_fast32_t c2)
{
if (idx <= 0xdefe)
return (uint32_t) __ksc5601_sym_to_ucs[(c1 - 0xd9) * 188 + c2
- (c2 > 0x90 ? 0x43 : 0x31)];
else
return (uint32_t) __ksc5601_hanja_to_ucs[(c1 - 0xe0) * 188 + c2
- (c2 > 0x90 ? 0x43 : 0x31)];
}
static uint16_t
johab_hanja_from_ucs (uint32_t ch)
{
uint16_t idx;
if (ucs4_to_ksc5601_hanja (ch, &idx))
{
int idx1, idx2;
/* Hanja begins at the 42th row. 42=0x2a : 0x2a + 0x20 = 0x4a. */
idx1 = idx / 256 - 0x4a;
idx2 = idx % 256 + 0x80;
return ((idx1 / 2) * 256 + 0xe000 + idx2
+ (idx1 % 2 ? 0 : (idx2 > 0xee ? 0x43 : 0x31) - 0xa1));
}
else
return 0;
}
static uint16_t
johab_sym_from_ucs (uint32_t ch)
{
uint16_t idx;
if (ucs4_to_ksc5601_sym (ch, &idx))
{
int idx1, idx2;
idx1 = idx / 256 - 0x21;
idx2 = idx % 256 + 0x80;
return ((idx1 / 2) * 256 + 0xd900 + idx2
+ (idx1 % 2 ? 0 : (idx2 > 0xee ? 0x43 : 0x31) - 0xa1));
}
else
return 0;
}
static inline void
johab_from_ucs4 (uint32_t ch, unsigned char *cp)
{
if (ch >= 0x7f)
{
int idx;
if (ch >= 0xac00 && ch <= 0xd7a3)
{
ch -= 0xac00;
idx = init_to_bit[ch / 588]; /* 21*28 = 588 */
idx += mid_to_bit[(ch / 28) % 21]; /* (ch % (21 * 28)) / 28 */
idx += final_to_bit[ch % 28]; /* (ch % (21 * 28)) % 28 */
}
/* KS C 5601-1992 Annex 3 regards 0xA4DA(Hangul Filler : U3164)
as symbol */
else if (ch >= 0x3131 && ch <= 0x3163)
idx = jamo_from_ucs_table[ch - 0x3131];
else if (ch >= 0x4e00 && ch <= 0x9fa5
|| ch >= 0xf900 && ch <= 0xfa0b)
idx = johab_hanja_from_ucs (ch);
/* Half-width Korean Currency Won Sign
else if ( ch == 0x20a9 )
idx = 0x5c00;
*/
else
idx = johab_sym_from_ucs (ch);
cp[0] = (unsigned char) (idx / 256);
cp[1] = (unsigned char) (idx & 0xff);
}
else
{
cp[0] = (unsigned char) ch;
cp[1] = 0;
}
}
/* Definitions used in the body of the `gconv' function. */
#define CHARSET_NAME "JOHAB//"
#define FROM_LOOP from_johab
#define TO_LOOP to_johab
#define DEFINE_INIT 1
#define DEFINE_FINI 1
#define MIN_NEEDED_FROM 1
#define MAX_NEEDED_FROM 2
#define MIN_NEEDED_TO 4
/* First define the conversion function from JOHAB to UCS4. */
#define MIN_NEEDED_INPUT MIN_NEEDED_FROM
#define MAX_NEEDED_INPUT MAX_NEEDED_FROM
#define MIN_NEEDED_OUTPUT MIN_NEEDED_TO
#define LOOPFCT FROM_LOOP
#define BODY \
{ \
uint32_t ch = *inptr; \
\
/* half-width Korean Currency WON sign \
if (ch == 0x5c) \
ch = 0x20a9; \
else if (ch < 0x7f) \
ch = (uint32_t) ch; \
*/ \
if (ch < 0x7f) \
/* Plain ASCII. */ \
++inptr; \
/* Johab : 1. Hangul \
1st byte : 0x84-0xd3 \
2nd byte : 0x41-0x7e, 0x81-0xfe \
2. Hanja & Symbol : \
1st byte : 0xd8-0xde, 0xe0-0xf9 \
2nd byte : 0x31-0x7e, 0x91-0xfe \
0xd831-0xd87e and 0xd891-0xd8fe are user-defined area */ \
else \
{ \
if (ch > 0xf9 || ch == 0xdf || (ch > 0x7e && ch < 0x84) \
|| (ch > 0xd3 && ch < 0xd9)) \
{ \
/* These are illegal. */ \
result = GCONV_ILLEGAL_INPUT; \
break; \
} \
else \
{ \
/* Two-byte character. First test whether the next \
character is also available. */ \
uint32_t ch2; \
uint_fast32_t idx; \
\
if (NEED_LENGTH_TEST && inptr + 1 >= inend) \
{ \
/* The second character is not available. Store the \
intermediate result. */ \
result = GCONV_INCOMPLETE_INPUT; \
break; \
} \
\
ch2 = inptr[1]; \
idx = ch * 256 + ch2; \
if (ch <= 0xd3) \
{ \
/* Hangul */ \
uint_fast32_t i, m, f; \
\
i = init[(idx & 0x7c00) >> 10]; \
m = mid[(idx & 0x03e0) >> 5]; \
f = final[idx & 0x001f]; \
\
if (i == -1 || m == -1 || f == -1) \
{ \
/* This is illegal. */ \
result = GCONV_ILLEGAL_INPUT; \
break; \
} \
else if (i > 0 && m > 0) \
ch = ((i - 1) * 21 + (m - 1)) * 28 + f + 0xac00; \
else if (i > 0 && m == 0 & f == 0) \
ch = init_to_ucs[i - 1]; \
else if (i == 0 && m > 0 & f == 0) \
ch = 0x314e + m; /* 0x314f + m - 1 */ \
else if (i == 0 && m == 0 & f > 0) \
ch = final_to_ucs[f - 1]; /* round trip?? */ \
else \
{ \
/* This is illegal. */ \
result = GCONV_ILLEGAL_INPUT; \
break; \
} \
} \
else \
{ \
if (ch2 < 0x31 || (ch2 > 0x7e && ch2 < 0x91) || ch2 == 0xff) \
{ \
/* This is illegal. */ \
result = GCONV_ILLEGAL_INPUT; \
break; \
} \
else if (ch == 0xda && ch2 > 0xa0 && ch2 < 0xd4) \
{ \
/* This is illegal. Modern Hangul Jaso is defined \
elsewhere in Johab */ \
result = GCONV_ILLEGAL_INPUT; \
break; \
} \
else \
{ \
ch = johab_sym_hanja_to_ucs (idx, ch, ch2); \
/* if (idx <= 0xdefe) \
ch = __ksc5601_sym_to_ucs[(ch - 0xd9) * 192 \
+ ch2 - (ch2 > 0x90 \
? 0x43 : 0x31)]; \
else \
ch = __ksc5601_hanja_to_ucs[(ch - 0xe0) *192 \
+ ch2 - (ch2 > 0x90 \
?0x43 : 0x31)];\
*/ \
} \
} \
} \
\
if (ch == 0) \
{ \
/* This is an illegal character. */ \
result = GCONV_ILLEGAL_INPUT; \
break; \
} \
\
inptr += 2; \
} \
\
*((uint32_t *) outptr)++ = ch; \
}
#include <iconv/loop.c>
/* Next, define the other direction. */
#define MIN_NEEDED_INPUT MIN_NEEDED_TO
#define MIN_NEEDED_OUTPUT MIN_NEEDED_FROM
#define MAX_NEEDED_OUTPUT MAX_NEEDED_FROM
#define LOOPFCT TO_LOOP
#define BODY \
{ \
uint32_t ch = *((uint32_t *) inptr); \
unsigned char cp[2]; \
/* \
if (ch >= (sizeof (from_ucs4_lat1) / sizeof (from_ucs4_lat1[0]))) \
{ \
if (ch >= 0x0391 && ch <= 0x0451) \
cp = from_ucs4_greek[ch - 0x391]; \
else if (ch >= 0x2010 && ch <= 0x9fa0) \
cp = from_ucs4_cjk[ch - 0x02010]; \
else \
break; \
} \
else \
cp = from_ucs4_lat1[ch]; \
*/ \
johab_from_ucs4 (ch, cp); \
\
if (cp[0] == '\0' && ch != 0) \
{ \
/* Illegal character. */ \
result = GCONV_ILLEGAL_INPUT; \
break; \
} \
\
*outptr++ = cp[0]; \
/* Now test for a possible second byte and write this if possible. */ \
if (cp[1] != '\0') \
{ \
if (NEED_LENGTH_TEST && outptr >= outend) \
{ \
/* The result does not fit into the buffer. */ \
--outptr; \
result = GCONV_FULL_OUTPUT; \
break; \
} \
*outptr++ = cp[1]; \
} \
\
inptr += 4; \
}
#include <iconv/loop.c>
/* Now define the toplevel functions. */
#include <iconv/skeleton.c>