2001-01-06  Ulrich Drepper  <drepper@redhat.com>

	* iconv/skeleton.c: Reset outbuf for next round of the loop.
	Reported by Owen Taylor <otaylor@redhat.com>.
	* iconv/Makefile (tests): Add tst-iconv3.
	* iconv/tst-iconv3.c: New file.

	* iconvdata/ibm930.c: Fix handling of state.  Optimize a bit.
	* iconvdata/ibm933.c: Likewise.
	* iconvdata/ibm935.c: Likewise.
	* iconvdata/ibm937.c: Likewise.
	* iconvdata/ibm939.c: Likewise.
	* iconvdata/ibm930.h: Adjust single byte table for optimization.
	* iconvdata/ibm933.h: Likewise.
	* iconvdata/ibm935.h: Likewise.
	* iconvdata/ibm939.h: Likewise.

	* iconvdata/testdata/IBM930: Add misssing SI.
	* iconvdata/testdata/IBM933: Likewise.
	* iconvdata/testdata/IBM935: Likewise.
	* iconvdata/testdata/IBM937: Likewise.
	* iconvdata/testdata/IBM939: Likewise.

	* configure.in: Check for old add-ons that shouldn't be used with
	current glibc anymore.
This commit is contained in:
Ulrich Drepper 2001-01-06 20:21:33 +00:00
parent e1fa173022
commit f1813b562b
17 changed files with 556 additions and 402 deletions

View File

@ -1,7 +1,30 @@
2001-01-06 Ulrich Drepper <drepper@redhat.com>
* iconv/skeleton.c: Reset outbuf for next round of the loop.
Reported by Owen Taylor <otaylor@redhat.com>.
* iconv/Makefile (tests): Add tst-iconv3.
* iconv/tst-iconv3.c: New file.
* iconvdata/ibm930.c: Fix handling of state. Optimize a bit.
* iconvdata/ibm933.c: Likewise.
* iconvdata/ibm935.c: Likewise.
* iconvdata/ibm937.c: Likewise.
* iconvdata/ibm939.c: Likewise.
* iconvdata/ibm930.h: Adjust single byte table for optimization.
* iconvdata/ibm933.h: Likewise.
* iconvdata/ibm935.h: Likewise.
* iconvdata/ibm939.h: Likewise.
* iconvdata/testdata/IBM930: Add misssing SI.
* iconvdata/testdata/IBM933: Likewise.
* iconvdata/testdata/IBM935: Likewise.
* iconvdata/testdata/IBM937: Likewise.
* iconvdata/testdata/IBM939: Likewise.
2001-01-06 Andreas Jaeger <aj@suse.de> 2001-01-06 Andreas Jaeger <aj@suse.de>
* configure.in: Check for old add-ons that shouldn't be used with * configure.in: Check for old add-ons that shouldn't be used with
current glibc anymore. current glibc anymore.
2001-01-06 Mark Kettenis <kettenis@gnu.org> 2001-01-06 Mark Kettenis <kettenis@gnu.org>

View File

@ -34,7 +34,7 @@ CFLAGS-gconv_db.c = -DSTATIC_GCONV
CFLAGS-gconv_simple.c = -DSTATIC_GCONV CFLAGS-gconv_simple.c = -DSTATIC_GCONV
endif endif
tests = tst-iconv1 tst-iconv2 tests = tst-iconv1 tst-iconv2 tst-iconv3
distribute = gconv_builtin.h gconv_int.h loop.c skeleton.c distribute = gconv_builtin.h gconv_int.h loop.c skeleton.c

View File

@ -1,5 +1,5 @@
/* Skeleton for a conversion module. /* Skeleton for a conversion module.
Copyright (C) 1998, 1999, 2000 Free Software Foundation, Inc. Copyright (C) 1998, 1999, 2000, 2001 Free Software Foundation, Inc.
This file is part of the GNU C Library. This file is part of the GNU C Library.
Contributed by Ulrich Drepper <drepper@cygnus.com>, 1998. Contributed by Ulrich Drepper <drepper@cygnus.com>, 1998.
@ -398,7 +398,7 @@ FUNCTION_NAME (struct __gconv_step *step, struct __gconv_step_data *data,
|| (uintptr_t) inptr % MIN_NEEDED_TO != 0))); || (uintptr_t) inptr % MIN_NEEDED_TO != 0)));
#endif #endif
do while (1)
{ {
struct __gconv_trans_data *trans; struct __gconv_trans_data *trans;
@ -561,10 +561,18 @@ FUNCTION_NAME (struct __gconv_step *step, struct __gconv_step_data *data,
/* All the output is consumed, we can make another run /* All the output is consumed, we can make another run
if everything was ok. */ if everything was ok. */
if (status == __GCONV_FULL_OUTPUT) if (status == __GCONV_FULL_OUTPUT)
status = __GCONV_OK; {
status = __GCONV_OK;
outbuf = data->__outbuf;
}
} }
if (status != __GCONV_OK)
break;
/* Reset the output buffer pointer for the next round. */
outbuf = data->__outbuf;
} }
while (status == __GCONV_OK);
#ifdef END_LOOP #ifdef END_LOOP
END_LOOP END_LOOP

View File

@ -1,5 +1,5 @@
/* Conversion from and to IBM930. /* Conversion from and to IBM930.
Copyright (C) 2000 Free Software Foundation, Inc. Copyright (C) 2000, 2001 Free Software Foundation, Inc.
This file is part of the GNU C Library. This file is part of the GNU C Library.
Contributed by Masahide Washizawa <washi@yamato.ibm.co.jp>, 2000. Contributed by Masahide Washizawa <washi@yamato.ibm.co.jp>, 2000.
@ -32,42 +32,77 @@
#define CHARSET_NAME "IBM930//" #define CHARSET_NAME "IBM930//"
#define FROM_LOOP from_ibm930 #define FROM_LOOP from_ibm930
#define TO_LOOP to_ibm930 #define TO_LOOP to_ibm930
#define MIN_NEEDED_FROM 1
#define MAX_NEEDED_FROM 2
#define MIN_NEEDED_TO 4
#define MAX_NEEDED_TO 4
#define PREPARE_LOOP \
int save_curcs; \
int *curcsp = &data->__statep->__count;
#define EXTRA_LOOP_ARGS , curcsp
/* Definitions of initialization and destructor function. */ /* Definitions of initialization and destructor function. */
#define DEFINE_INIT 1 #define DEFINE_INIT 1
#define DEFINE_FINI 1 #define DEFINE_FINI 1
#define MIN_NEEDED_FROM 1
#define MIN_NEEDED_TO 4 /* Since this is a stateful encoding we have to provide code which resets
the output state to the initial state. This has to be done during the
flushing. */
#define EMIT_SHIFT_TO_INIT \
if ((data->__statep->__count & ~7) != sb) \
{ \
if (FROM_DIRECTION) \
data->__statep->__count &= 7; \
else \
{ \
unsigned char *outbuf = data->__outbuf; \
\
/* We are not in the initial state. To switch back we have \
to emit `SI'. */ \
if (__builtin_expect (outbuf >= data->__outbufend, 0)) \
/* We don't have enough room in the output buffer. */ \
status = __GCONV_FULL_OUTPUT; \
else \
{ \
/* Write out the shift sequence. */ \
*outbuf++ = SI; \
data->__outbuf = outbuf; \
data->__statep->__count &= 7; \
} \
} \
}
/* Since we might have to reset input pointer we must be able to save
and retore the state. */
#define SAVE_RESET_STATE(Save) \
if (Save) \
save_curcs = *curcsp; \
else \
*curcsp = save_curcs
/* Current codeset type. */ /* Current codeset type. */
enum enum
{ {
init = 0, sb = 0,
sb, db = 64
db
}; };
/* First, define the conversion function from IBM-930 to UCS4. */ /* First, define the conversion function from IBM-930 to UCS4. */
#define MIN_NEEDED_INPUT MIN_NEEDED_FROM #define MIN_NEEDED_INPUT MIN_NEEDED_FROM
#define MAX_NEEDED_INPUT MAX_NEEDED_FROM
#define MIN_NEEDED_OUTPUT MIN_NEEDED_TO #define MIN_NEEDED_OUTPUT MIN_NEEDED_TO
#define INIT_PARAMS int curcs = init;
#define LOOPFCT FROM_LOOP #define LOOPFCT FROM_LOOP
#define BODY \ #define BODY \
{ \ { \
uint32_t ch = *inptr; \ uint32_t ch = *inptr; \
uint32_t res; \ uint32_t res; \
const struct gap *rp1 = __ibm930sb_to_ucs4_idx; \
const struct gap *rp2 = __ibm930db_to_ucs4_idx; \
\ \
if (__builtin_expect (ch, 0) == SO) \ if (__builtin_expect (ch, 0) == SO) \
{ \ { \
if (__builtin_expect (inptr + 1 >= inend, 0)) \
{ \
result = __GCONV_INCOMPLETE_INPUT; \
break; \
} \
\
/* Shift OUT, change to DBCS converter. */ \ /* Shift OUT, change to DBCS converter. */ \
if (curcs == db) \ if (curcs == db) \
{ \ { \
@ -76,16 +111,10 @@ enum
} \ } \
curcs = db; \ curcs = db; \
++inptr; \ ++inptr; \
ch = *inptr; \ continue; \
} \ } \
else if (__builtin_expect (ch, 0) == SI) \ else if (__builtin_expect (ch, 0) == SI) \
{ \ { \
if (__builtin_expect (inptr + 1 >= inend, 0)) \
{ \
result = __GCONV_INCOMPLETE_INPUT; \
break; \
} \
\
/* Shift IN, change to SBCS converter */ \ /* Shift IN, change to SBCS converter */ \
if (curcs == sb) \ if (curcs == sb) \
{ \ { \
@ -94,19 +123,14 @@ enum
} \ } \
curcs = sb; \ curcs = sb; \
++inptr; \ ++inptr; \
ch = *inptr; \ continue; \
} \ } \
\ \
if (curcs == sb || curcs == init) \ if (curcs == sb) \
{ \ { \
/* Use the IBM930 table for single byte. */ \ /* Use the IBM930 table for single byte. */ \
while (ch > rp1->end) \ res = __ibm930sb_to_ucs4[ch]; \
++rp1; \ if (__builtin_expect (res, L'\1') == L'\0' && ch != '\0') \
\
if (__builtin_expect (rp1 == NULL, 0) \
|| __builtin_expect (ch < rp1->start, 0) \
|| (res = __ibm930sb_to_ucs4[ch + rp1->idx], \
__builtin_expect (res, L'\1') == L'\0' && ch != '\0')) \
{ \ { \
/* This is an illegal character. */ \ /* This is an illegal character. */ \
if (! ignore_errors_p ()) \ if (! ignore_errors_p ()) \
@ -115,21 +139,21 @@ enum
break; \ break; \
} \ } \
++*irreversible; \ ++*irreversible; \
++inptr; \
continue; \
} \ } \
else \ else \
{ \ { \
if (res == 0xa5) \
res = 0x5c; \
put32 (outptr, res); \ put32 (outptr, res); \
outptr += 4; \ outptr += 4; \
++inptr; \
} \ } \
++inptr; \
} \ } \
else if (curcs == db) \ else \
{ \ { \
/* Use the IBM930 table for double byte. */ \ /* Use the IBM930 table for double byte. */ \
const struct gap *rp2 = __ibm930db_to_ucs4_idx; \
\
assert (curcs == db); \
\
if (__builtin_expect (inptr + 1 >= inend, 0)) \ if (__builtin_expect (inptr + 1 >= inend, 0)) \
{ \ { \
/* The second character is not available. Store the \ /* The second character is not available. Store the \
@ -142,8 +166,7 @@ enum
while (ch > rp2->end) \ while (ch > rp2->end) \
++rp2; \ ++rp2; \
\ \
if (__builtin_expect (rp2 == NULL, 0) \ if (__builtin_expect (ch < rp2->start, 0) \
|| __builtin_expect (ch < rp2->start, 0) \
|| (res = __ibm930db_to_ucs4[ch + rp2->idx], \ || (res = __ibm930db_to_ucs4[ch + rp2->idx], \
__builtin_expect (res, L'\1') == L'\0' && ch != '\0')) \ __builtin_expect (res, L'\1') == L'\0' && ch != '\0')) \
{ \ { \
@ -154,24 +177,25 @@ enum
break; \ break; \
} \ } \
++*irreversible; \ ++*irreversible; \
inptr += 2; \
continue; \
} \ } \
else \ else \
{ \ { \
put32 (outptr, res); \ put32 (outptr, res); \
outptr += 4; \ outptr += 4; \
inptr += 2; \
} \ } \
inptr += 2; \
} \ } \
} }
#define LOOP_NEED_FLAGS #define LOOP_NEED_FLAGS
#define EXTRA_LOOP_DECLS , int *curcsp
#define INIT_PARAMS int curcs = *curcsp & ~7
#define UPDATE_PARAMS *curcsp = curcs
#include <iconv/loop.c> #include <iconv/loop.c>
/* Next, define the other direction. */ /* Next, define the other direction. */
#define MIN_NEEDED_INPUT MIN_NEEDED_TO #define MIN_NEEDED_INPUT MIN_NEEDED_TO
#define MIN_NEEDED_OUTPUT MIN_NEEDED_FROM #define MIN_NEEDED_OUTPUT MIN_NEEDED_FROM
#define INIT_PARAMS int curcs = init; #define MAX_NEEDED_OUTPUT MAX_NEEDED_FROM
#define LOOPFCT TO_LOOP #define LOOPFCT TO_LOOP
#define BODY \ #define BODY \
{ \ { \
@ -182,16 +206,21 @@ enum
\ \
if (__builtin_expect (ch, 0) >= 0xffff) \ if (__builtin_expect (ch, 0) >= 0xffff) \
{ \ { \
rp1 = NULL; \ if (! ignore_errors_p ()) \
rp2 = NULL; \ { \
result = __GCONV_ILLEGAL_INPUT; \
break; \
} \
++*irreversible; \
inptr += 4; \
continue; \
} \ } \
else \ \
while (ch > rp1->end) \ while (ch > rp1->end) \
++rp1; \ ++rp1; \
\ \
/* Use the UCS4 table for single byte. */ \ /* Use the UCS4 table for single byte. */ \
if (__builtin_expect (rp1 == NULL, 0) \ if (__builtin_expect (ch < rp1->start, 0) \
|| __builtin_expect (ch < rp1->start, 0) \
|| (cp = __ucs4_to_ibm930sb[ch + rp1->idx], \ || (cp = __ucs4_to_ibm930sb[ch + rp1->idx], \
__builtin_expect (cp[0], L'\1') == L'\0' && ch != '\0')) \ __builtin_expect (cp[0], L'\1') == L'\0' && ch != '\0')) \
{ \ { \
@ -199,8 +228,7 @@ enum
while (ch > rp2->end) \ while (ch > rp2->end) \
++rp2; \ ++rp2; \
\ \
if (__builtin_expect (rp2 == NULL, 0) \ if (__builtin_expect (ch < rp2->start, 0) \
|| __builtin_expect (ch < rp2->start, 0) \
|| (cp = __ucs4_to_ibm930db[ch + rp2->idx], \ || (cp = __ucs4_to_ibm930db[ch + rp2->idx], \
__builtin_expect (cp[0], L'\1')==L'\0' && ch != '\0')) \ __builtin_expect (cp[0], L'\1')==L'\0' && ch != '\0')) \
{ \ { \
@ -214,7 +242,7 @@ enum
} \ } \
else \ else \
{ \ { \
if (curcs == init || curcs == sb) \ if (curcs == sb) \
{ \ { \
if (__builtin_expect (outptr+1 > outend, 0)) \ if (__builtin_expect (outptr+1 > outend, 0)) \
{ \ { \
@ -264,6 +292,9 @@ enum
inptr += 4; \ inptr += 4; \
} }
#define LOOP_NEED_FLAGS #define LOOP_NEED_FLAGS
#define EXTRA_LOOP_DECLS , int *curcsp
#define INIT_PARAMS int curcs = *curcsp & ~7
#define UPDATE_PARAMS *curcsp = curcs
#include <iconv/loop.c> #include <iconv/loop.c>
/* Now define the toplevel functions. */ /* Now define the toplevel functions. */

View File

@ -1,5 +1,5 @@
/* Tables for conversion from and to IBM930. /* Tables for conversion from and to IBM930.
Copyright (C) 2000 Free Software Foundation, Inc. Copyright (C) 2000, 2001 Free Software Foundation, Inc.
This file is part of the GNU C Library. This file is part of the GNU C Library.
Contributed by Masahide Washizawa <washi@yamato.ibm.co.jp>, 2000. Contributed by Masahide Washizawa <washi@yamato.ibm.co.jp>, 2000.
@ -32,49 +32,40 @@ struct gap
}; };
static const struct gap __ibm930sb_to_ucs4_idx[] = static const uint16_t __ibm930sb_to_ucs4[256] =
{ {
{ start: 0x0000, end: 0x0056, idx: 0 }, /* 0x00 */ 0x0000, 0x0001, 0x0002, 0x0003, 0x009C, 0x0009, 0x0086, 0x007F,
{ start: 0x0058, end: 0x0058, idx: -1 }, /* 0x08 */ 0x0097, 0x008D, 0x008E, 0x000B, 0x000C, 0x000D, 0x000E, 0x000F,
{ start: 0x005a, end: 0x0069, idx: -2 }, /* 0x10 */ 0x0010, 0x0011, 0x0012, 0x0013, 0x009D, 0x0085, 0x0008, 0x0087,
{ start: 0x006b, end: 0x009b, idx: -3 }, /* 0x18 */ 0x0018, 0x0019, 0x0092, 0x008F, 0x001C, 0x001D, 0x001E, 0x001F,
{ start: 0x009d, end: 0x00c9, idx: -4 }, /* 0x20 */ 0x0080, 0x0081, 0x0082, 0x0083, 0x0084, 0x000A, 0x0017, 0x001B,
{ start: 0x00d0, end: 0x00d9, idx: -10 }, /* 0x28 */ 0x0088, 0x0089, 0x008A, 0x008B, 0x008C, 0x0005, 0x0006, 0x0007,
{ start: 0x00e0, end: 0x00e0, idx: -16 }, /* 0x30 */ 0x0090, 0x0091, 0x0016, 0x0093, 0x0094, 0x0095, 0x0096, 0x0004,
{ start: 0x00e2, end: 0x00e9, idx: -17 }, /* 0x38 */ 0x0098, 0x0099, 0x009A, 0x009B, 0x0014, 0x0015, 0x009E, 0x001A,
{ start: 0x00f0, end: 0x00f9, idx: -23 }, /* 0x40 */ 0x0020, 0xFF61, 0xFF62, 0xFF63, 0xFF64, 0xFF65, 0xFF66, 0xFF67,
{ start: 0x00ff, end: 0x00ff, idx: -28 }, /* 0x48 */ 0xFF68, 0xFF69, 0x00A3, 0x002E, 0x003C, 0x0028, 0x002B, 0x007C,
{ start: 0xffff, end: 0xffff, idx: 0 } /* 0x50 */ 0x0026, 0xFF6A, 0xFF6B, 0xFF6C, 0xFF6D, 0xFF6E, 0xFF6F, 0x0000,
}; /* 0x58 */ 0xFF70, 0x0000, 0x0021, 0x005C, 0x002A, 0x0029, 0x003B, 0x00AC,
/* 0x60 */ 0x002D, 0x002F, 0x0061, 0x0062, 0x0063, 0x0064, 0x0065, 0x0066,
static const uint16_t __ibm930sb_to_ucs4[] = /* 0x68 */ 0x0067, 0x0068, 0x0000, 0x002C, 0x0025, 0x005F, 0x003E, 0x003F,
{ /* 0x70 */ 0x005B, 0x0069, 0x006A, 0x006B, 0x006C, 0x006D, 0x006E, 0x006F,
0x0000, 0x0001, 0x0002, 0x0003, 0x009C, 0x0009, 0x0086, 0x007F, 0x0097, /* 0x78 */ 0x0070, 0x0060, 0x003A, 0x0023, 0x0040, 0x0027, 0x003D, 0x0022,
0x008D, 0x008E, 0x000B, 0x000C, 0x000D, 0x000E, 0x000F, 0x0010, 0x0011, /* 0x80 */ 0x005D, 0xFF71, 0xFF72, 0xFF73, 0xFF74, 0xFF75, 0xFF76, 0xFF77,
0x0012, 0x0013, 0x009D, 0x0085, 0x0008, 0x0087, 0x0018, 0x0019, 0x0092, /* 0x88 */ 0xFF78, 0xFF79, 0xFF7A, 0x0071, 0xFF7B, 0xFF7C, 0xFF7D, 0xFF7E,
0x008F, 0x001C, 0x001D, 0x001E, 0x001F, 0x0080, 0x0081, 0x0082, 0x0083, /* 0x90 */ 0xFF7F, 0xFF80, 0xFF81, 0xFF82, 0xFF83, 0xFF84, 0xFF85, 0xFF86,
0x0084, 0x000A, 0x0017, 0x001B, 0x0088, 0x0089, 0x008A, 0x008B, 0x008C, /* 0x98 */ 0xFF87, 0xFF88, 0xFF89, 0x0072, 0x0000, 0xFF8A, 0xFF8B, 0xFF8C,
0x0005, 0x0006, 0x0007, 0x0090, 0x0091, 0x0016, 0x0093, 0x0094, 0x0095, /* 0xa0 */ 0x007E, 0x203E, 0xFF8D, 0xFF8E, 0xFF8F, 0xFF90, 0xFF91, 0xFF92,
0x0096, 0x0004, 0x0098, 0x0099, 0x009A, 0x009B, 0x0014, 0x0015, 0x009E, /* 0xa8 */ 0xFF93, 0xFF94, 0xFF95, 0x0073, 0xFF96, 0xFF97, 0xFF98, 0xFF99,
0x001A, 0x0020, 0xFF61, 0xFF62, 0xFF63, 0xFF64, 0xFF65, 0xFF66, 0xFF67, /* 0xb0 */ 0x005E, 0x00A2, 0x005C, 0x0074, 0x0075, 0x0076, 0x0077, 0x0078,
0xFF68, 0xFF69, 0x00A3, 0x002E, 0x003C, 0x0028, 0x002B, 0x007C, 0x0026, /* 0xb8 */ 0x0079, 0x007A, 0xFF9A, 0xFF9B, 0xFF9C, 0xFF9D, 0xFF9E, 0xFF9F,
0xFF6A, 0xFF6B, 0xFF6C, 0xFF6D, 0xFF6E, 0xFF6F, 0xFF70, 0x0021, 0x00A5, /* 0xc0 */ 0x007B, 0x0041, 0x0042, 0x0043, 0x0044, 0x0045, 0x0046, 0x0047,
0x002A, 0x0029, 0x003B, 0x00AC, 0x002D, 0x002F, 0x0061, 0x0062, 0x0063, /* 0xc8 */ 0x0048, 0x0049, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
0x0064, 0x0065, 0x0066, 0x0067, 0x0068, 0x002C, 0x0025, 0x005F, 0x003E, /* 0xd0 */ 0x007D, 0x004A, 0x004B, 0x004C, 0x004D, 0x004E, 0x004F, 0x0050,
0x003F, 0x005B, 0x0069, 0x006A, 0x006B, 0x006C, 0x006D, 0x006E, 0x006F, /* 0xd8 */ 0x0051, 0x0052, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
0x0070, 0x0060, 0x003A, 0x0023, 0x0040, 0x0027, 0x003D, 0x0022, 0x005D, /* 0xe0 */ 0x0024, 0x0000, 0x0053, 0x0054, 0x0055, 0x0056, 0x0057, 0x0058,
0xFF71, 0xFF72, 0xFF73, 0xFF74, 0xFF75, 0xFF76, 0xFF77, 0xFF78, 0xFF79, /* 0xe8 */ 0x0059, 0x005A, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
0xFF7A, 0x0071, 0xFF7B, 0xFF7C, 0xFF7D, 0xFF7E, 0xFF7F, 0xFF80, 0xFF81, /* 0xf0 */ 0x0030, 0x0031, 0x0032, 0x0033, 0x0034, 0x0035, 0x0036, 0x0037,
0xFF82, 0xFF83, 0xFF84, 0xFF85, 0xFF86, 0xFF87, 0xFF88, 0xFF89, 0x0072, /* 0xf8 */ 0x0038, 0x0039, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x009F
0xFF8A, 0xFF8B, 0xFF8C, 0x007E, 0x203E, 0xFF8D, 0xFF8E, 0xFF8F, 0xFF90,
0xFF91, 0xFF92, 0xFF93, 0xFF94, 0xFF95, 0x0073, 0xFF96, 0xFF97, 0xFF98,
0xFF99, 0x005E, 0x00A2, 0x005C, 0x0074, 0x0075, 0x0076, 0x0077, 0x0078,
0x0079, 0x007A, 0xFF9A, 0xFF9B, 0xFF9C, 0xFF9D, 0xFF9E, 0xFF9F, 0x007B,
0x0041, 0x0042, 0x0043, 0x0044, 0x0045, 0x0046, 0x0047, 0x0048, 0x0049,
0x007D, 0x004A, 0x004B, 0x004C, 0x004D, 0x004E, 0x004F, 0x0050, 0x0051,
0x0052, 0x0024, 0x0053, 0x0054, 0x0055, 0x0056, 0x0057, 0x0058, 0x0059,
0x005A, 0x0030, 0x0031, 0x0032, 0x0033, 0x0034, 0x0035, 0x0036, 0x0037,
0x0038, 0x0039, 0x009F
}; };
static const struct gap __ibm930db_to_ucs4_idx[] = static const struct gap __ibm930db_to_ucs4_idx[] =

View File

@ -1,5 +1,5 @@
/* Conversion from and to IBM933. /* Conversion from and to IBM933.
Copyright (C) 2000 Free Software Foundation, Inc. Copyright (C) 2000, 2001 Free Software Foundation, Inc.
This file is part of the GNU C Library. This file is part of the GNU C Library.
Contributed by Masahide Washizawa <washi@yamato.ibm.co.jp>, 2000. Contributed by Masahide Washizawa <washi@yamato.ibm.co.jp>, 2000.
@ -32,42 +32,76 @@
#define CHARSET_NAME "IBM933//" #define CHARSET_NAME "IBM933//"
#define FROM_LOOP from_ibm933 #define FROM_LOOP from_ibm933
#define TO_LOOP to_ibm933 #define TO_LOOP to_ibm933
#define MIN_NEEDED_FROM 1
#define MAX_NEEDED_FROM 2
#define MIN_NEEDED_TO 4
#define MAX_NEEDED_TO 4
#define PREPARE_LOOP \
int save_curcs; \
int *curcsp = &data->__statep->__count;
#define EXTRA_LOOP_ARGS , curcsp
/* Definitions of initialization and destructor function. */ /* Definitions of initialization and destructor function. */
#define DEFINE_INIT 1 #define DEFINE_INIT 1
#define DEFINE_FINI 1 #define DEFINE_FINI 1
#define MIN_NEEDED_FROM 1
#define MIN_NEEDED_TO 4 /* Since this is a stateful encoding we have to provide code which resets
the output state to the initial state. This has to be done during the
flushing. */
#define EMIT_SHIFT_TO_INIT \
if ((data->__statep->__count & ~7) != sb) \
{ \
if (FROM_DIRECTION) \
data->__statep->__count &= 7; \
else \
{ \
unsigned char *outbuf = data->__outbuf; \
\
/* We are not in the initial state. To switch back we have \
to emit `SI'. */ \
if (__builtin_expect (outbuf >= data->__outbufend, 0)) \
/* We don't have enough room in the output buffer. */ \
status = __GCONV_FULL_OUTPUT; \
else \
{ \
/* Write out the shift sequence. */ \
*outbuf++ = SI; \
data->__outbuf = outbuf; \
data->__statep->__count &= 7; \
} \
} \
}
/* Since we might have to reset input pointer we must be able to save
and retore the state. */
#define SAVE_RESET_STATE(Save) \
if (Save) \
save_curcs = *curcsp; \
else \
*curcsp = save_curcs
/* Current codeset type. */ /* Current codeset type. */
enum enum
{ {
init = 0, sb = 0,
sb, db = 64
db
}; };
/* First, define the conversion function from IBM-933 to UCS4. */ /* First, define the conversion function from IBM-933 to UCS4. */
#define MIN_NEEDED_INPUT MIN_NEEDED_FROM #define MIN_NEEDED_INPUT MIN_NEEDED_FROM
#define MAX_NEEDED_INPUT MAX_NEEDED_FROM
#define MIN_NEEDED_OUTPUT MIN_NEEDED_TO #define MIN_NEEDED_OUTPUT MIN_NEEDED_TO
#define INIT_PARAMS int curcs = init;
#define LOOPFCT FROM_LOOP #define LOOPFCT FROM_LOOP
#define BODY \ #define BODY \
{ \ { \
uint32_t ch = *inptr; \ uint32_t ch = *inptr; \
uint32_t res; \ uint32_t res; \
const struct gap *rp1 = __ibm933sb_to_ucs4_idx; \
const struct gap *rp2 = __ibm933db_to_ucs4_idx; \
\ \
if (__builtin_expect (ch, 0) == SO) \ if (__builtin_expect (ch, 0) == SO) \
{ \ { \
if (__builtin_expect (inptr + 1 >= inend, 0)) \
{ \
result = __GCONV_INCOMPLETE_INPUT; \
break; \
} \
\
/* Shift OUT, change to DBCS converter. */ \ /* Shift OUT, change to DBCS converter. */ \
if (curcs == db) \ if (curcs == db) \
{ \ { \
@ -76,16 +110,10 @@ enum
} \ } \
curcs = db; \ curcs = db; \
++inptr; \ ++inptr; \
ch = *inptr; \ continue; \
} \ } \
else if (__builtin_expect (ch, 0) == SI) \ else if (__builtin_expect (ch, 0) == SI) \
{ \ { \
if (__builtin_expect (inptr + 1 >= inend, 0)) \
{ \
result = __GCONV_INCOMPLETE_INPUT; \
break; \
} \
\
/* Shift IN, change to SBCS converter. */ \ /* Shift IN, change to SBCS converter. */ \
if (curcs == sb) \ if (curcs == sb) \
{ \ { \
@ -94,19 +122,14 @@ enum
} \ } \
curcs = sb; \ curcs = sb; \
++inptr; \ ++inptr; \
ch = *inptr; \ continue; \
} \ } \
\ \
if (curcs == sb || curcs == init) \ if (curcs == sb) \
{ \ { \
/* Use the IBM933 table for single byte. */ \ /* Use the IBM933 table for single byte. */ \
while (ch > rp1->end) \ res = __ibm933sb_to_ucs4[ch]; \
++rp1; \ if (__builtin_expect (res, L'\1') == L'\0' && ch != '\0') \
\
if (__builtin_expect (rp1 == NULL, 0) \
|| __builtin_expect (ch < rp1->start, 0) \
|| (res = __ibm933sb_to_ucs4[ch + rp1->idx], \
__builtin_expect (res, L'\1') == L'\0' && ch != '\0')) \
{ \ { \
/* This is an illegal character. */ \ /* This is an illegal character. */ \
if (! ignore_errors_p ()) \ if (! ignore_errors_p ()) \
@ -115,18 +138,20 @@ enum
break; \ break; \
} \ } \
++*irreversible; \ ++*irreversible; \
++inptr; \
continue; \
} \ } \
else \ else \
{ \ { \
put32 (outptr, res); \ put32 (outptr, res); \
outptr += 4; \ outptr += 4; \
++inptr; \
} \ } \
++inptr; \
} \ } \
else if (curcs == db) \ else \
{ \ { \
const struct gap *rp2 = __ibm933db_to_ucs4_idx; \
\
assert (curcs == db); \
\
/* Use the IBM933 table for double byte. */ \ /* Use the IBM933 table for double byte. */ \
if (__builtin_expect (inptr + 1 >= inend, 0)) \ if (__builtin_expect (inptr + 1 >= inend, 0)) \
{ \ { \
@ -164,12 +189,15 @@ enum
} \ } \
} }
#define LOOP_NEED_FLAGS #define LOOP_NEED_FLAGS
#define EXTRA_LOOP_DECLS , int *curcsp
#define INIT_PARAMS int curcs = *curcsp & ~7
#define UPDATE_PARAMS *curcsp = curcs
#include <iconv/loop.c> #include <iconv/loop.c>
/* Next, define the other direction. */ /* Next, define the other direction. */
#define MIN_NEEDED_INPUT MIN_NEEDED_TO #define MIN_NEEDED_INPUT MIN_NEEDED_TO
#define MIN_NEEDED_OUTPUT MIN_NEEDED_FROM #define MIN_NEEDED_OUTPUT MIN_NEEDED_FROM
#define INIT_PARAMS int curcs = init; #define MAX_NEEDED_OUTPUT MAX_NEEDED_FROM
#define LOOPFCT TO_LOOP #define LOOPFCT TO_LOOP
#define BODY \ #define BODY \
{ \ { \
@ -180,16 +208,21 @@ enum
\ \
if (__builtin_expect (ch, 0) >= 0xffff) \ if (__builtin_expect (ch, 0) >= 0xffff) \
{ \ { \
rp1 = NULL; \ if (! ignore_errors_p ()) \
rp2 = NULL; \ { \
result = __GCONV_ILLEGAL_INPUT; \
break; \
} \
++*irreversible; \
inptr += 4; \
continue; \
} \ } \
else \ \
while (ch > rp1->end) \ while (ch > rp1->end) \
++rp1; \ ++rp1; \
\ \
/* Use the UCS4 table for single byte. */ \ /* Use the UCS4 table for single byte. */ \
if (__builtin_expect (rp1 == NULL, 0) \ if (__builtin_expect (ch < rp1->start, 0) \
|| __builtin_expect (ch < rp1->start, 0) \
|| (cp = __ucs4_to_ibm933sb[ch + rp1->idx], \ || (cp = __ucs4_to_ibm933sb[ch + rp1->idx], \
__builtin_expect (cp[0], L'\1') == L'\0' && ch != '\0')) \ __builtin_expect (cp[0], L'\1') == L'\0' && ch != '\0')) \
{ \ { \
@ -197,8 +230,7 @@ enum
while (ch > rp2->end) \ while (ch > rp2->end) \
++rp2; \ ++rp2; \
\ \
if (__builtin_expect (rp2 == NULL, 0) \ if (__builtin_expect (ch < rp2->start, 0) \
|| __builtin_expect (ch < rp2->start, 0) \
|| (cp = __ucs4_to_ibm933db[ch + rp2->idx], \ || (cp = __ucs4_to_ibm933db[ch + rp2->idx], \
__builtin_expect (cp[0], L'\1')==L'\0' && ch != '\0')) \ __builtin_expect (cp[0], L'\1')==L'\0' && ch != '\0')) \
{ \ { \
@ -212,7 +244,7 @@ enum
} \ } \
else \ else \
{ \ { \
if (curcs == init || curcs == sb) \ if (curcs == sb) \
{ \ { \
if (__builtin_expect (outptr+1 > outend, 0)) \ if (__builtin_expect (outptr+1 > outend, 0)) \
{ \ { \
@ -257,6 +289,9 @@ enum
inptr += 4; \ inptr += 4; \
} }
#define LOOP_NEED_FLAGS #define LOOP_NEED_FLAGS
#define EXTRA_LOOP_DECLS , int *curcsp
#define INIT_PARAMS int curcs = *curcsp & ~7
#define UPDATE_PARAMS *curcsp = curcs
#include <iconv/loop.c> #include <iconv/loop.c>
/* Now define the toplevel functions. */ /* Now define the toplevel functions. */

View File

@ -1,5 +1,5 @@
/* Tables for conversion from and to IBM933. /* Tables for conversion from and to IBM933.
Copyright (C) 2000 Free Software Foundation, Inc. Copyright (C) 2000, 2001 Free Software Foundation, Inc.
This file is part of the GNU C Library. This file is part of the GNU C Library.
Contributed by Masahide Washizawa <washi@yamato.ibm.co.jp>, 2000. Contributed by Masahide Washizawa <washi@yamato.ibm.co.jp>, 2000.
@ -32,51 +32,40 @@ struct gap
}; };
static const struct gap __ibm933sb_to_ucs4_idx[] = static const uint16_t __ibm933sb_to_ucs4[256] =
{ {
{ start: 0x0000, end: 0x0040, idx: 0 }, /* 0x00 */ 0x0000, 0x0001, 0x0002, 0x0003, 0x009C, 0x0009, 0x0086, 0x007F,
{ start: 0x0042, end: 0x0050, idx: -1 }, /* 0x08 */ 0x0097, 0x008D, 0x008E, 0x000B, 0x000C, 0x000D, 0x000E, 0x000F,
{ start: 0x0052, end: 0x0070, idx: -2 }, /* 0x10 */ 0x0010, 0x0011, 0x0012, 0x0013, 0x009D, 0x0085, 0x0008, 0x0087,
{ start: 0x0072, end: 0x008f, idx: -3 }, /* 0x18 */ 0x0018, 0x0019, 0x0092, 0x008F, 0x001C, 0x001D, 0x001E, 0x001F,
{ start: 0x0091, end: 0x00b0, idx: -4 }, /* 0x20 */ 0x0080, 0x0081, 0x0082, 0x0083, 0x0084, 0x000A, 0x0017, 0x001B,
{ start: 0x00b2, end: 0x00b2, idx: -5 }, /* 0x28 */ 0x0088, 0x0089, 0x008A, 0x008B, 0x008C, 0x0005, 0x0006, 0x0007,
{ start: 0x00ba, end: 0x00bc, idx: -12 }, /* 0x30 */ 0x0090, 0x0091, 0x0016, 0x0093, 0x0094, 0x0095, 0x0096, 0x0004,
{ start: 0x00c0, end: 0x00c9, idx: -15 }, /* 0x38 */ 0x0098, 0x0099, 0x009A, 0x009B, 0x0014, 0x0015, 0x009E, 0x001A,
{ start: 0x00d0, end: 0x00d9, idx: -21 }, /* 0x40 */ 0x0020, 0x0000, 0xFFA0, 0xFFA1, 0xFFA2, 0xFFA3, 0xFFA4, 0xFFA5,
{ start: 0x00e0, end: 0x00e0, idx: -27 }, /* 0x48 */ 0xFFA6, 0xFFA7, 0x00A2, 0x002E, 0x003C, 0x0028, 0x002B, 0x007C,
{ start: 0x00e2, end: 0x00e9, idx: -28 }, /* 0x50 */ 0x0026, 0x0000, 0xFFA8, 0xFFA9, 0xFFAA, 0xFFAB, 0xFFAC, 0xFFAD,
{ start: 0x00f0, end: 0x00f9, idx: -34 }, /* 0x58 */ 0xFFAE, 0xFFAF, 0x0021, 0x0024, 0x002A, 0x0029, 0x003B, 0x00AC,
{ start: 0x00ff, end: 0x00ff, idx: -39 }, /* 0x60 */ 0x002D, 0x002F, 0xFFB0, 0xFFB1, 0xFFB2, 0xFFB3, 0xFFB4, 0xFFB5,
{ start: 0xffff, end: 0xffff, idx: 0 } /* 0x68 */ 0xFFB6, 0xFFB7, 0x00A6, 0x002C, 0x0025, 0x005F, 0x003E, 0x003F,
}; /* 0x70 */ 0x005B, 0x0000, 0xFFB8, 0xFFB9, 0xFFBA, 0xFFBB, 0xFFBC, 0xFFBD,
/* 0x78 */ 0xFFBE, 0x0060, 0x003A, 0x0023, 0x0040, 0x0027, 0x003D, 0x0022,
static const uint16_t __ibm933sb_to_ucs4[] = /* 0x80 */ 0x005D, 0x0061, 0x0062, 0x0063, 0x0064, 0x0065, 0x0066, 0x0067,
{ /* 0x88 */ 0x0068, 0x0069, 0xFFC2, 0xFFC3, 0xFFC4, 0xFFC5, 0xFFC6, 0xFFC7,
0x0000, 0x0001, 0x0002, 0x0003, 0x009C, 0x0009, 0x0086, 0x007F, 0x0097, /* 0x90 */ 0x0000, 0x006A, 0x006B, 0x006C, 0x006D, 0x006E, 0x006F, 0x0070,
0x008D, 0x008E, 0x000B, 0x000C, 0x000D, 0x000E, 0x000F, 0x0010, 0x0011, /* 0x98 */ 0x0071, 0x0072, 0xFFCA, 0xFFCB, 0xFFCC, 0xFFCD, 0xFFCE, 0xFFCF,
0x0012, 0x0013, 0x009D, 0x0085, 0x0008, 0x0087, 0x0018, 0x0019, 0x0092, /* 0xa0 */ 0x203E, 0x007E, 0x0073, 0x0074, 0x0075, 0x0076, 0x0077, 0x0078,
0x008F, 0x001C, 0x001D, 0x001E, 0x001F, 0x0080, 0x0081, 0x0082, 0x0083, /* 0xa8 */ 0x0079, 0x007A, 0xFFD2, 0xFFD3, 0xFFD4, 0xFFD5, 0xFFD6, 0xFFD7,
0x0084, 0x000A, 0x0017, 0x001B, 0x0088, 0x0089, 0x008A, 0x008B, 0x008C, /* 0xb0 */ 0x005E, 0x0000, 0x005C, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
0x0005, 0x0006, 0x0007, 0x0090, 0x0091, 0x0016, 0x0093, 0x0094, 0x0095, /* 0xb8 */ 0x0000, 0x0000, 0xFFDA, 0xFFDB, 0xFFDC, 0x0000, 0x0000, 0x0000,
0x0096, 0x0004, 0x0098, 0x0099, 0x009A, 0x009B, 0x0014, 0x0015, 0x009E, /* 0xc0 */ 0x007B, 0x0041, 0x0042, 0x0043, 0x0044, 0x0045, 0x0046, 0x0047,
0x001A, 0x0020, 0xFFA0, 0xFFA1, 0xFFA2, 0xFFA3, 0xFFA4, 0xFFA5, 0xFFA6, /* 0xc8 */ 0x0048, 0x0049, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
0xFFA7, 0x00A2, 0x002E, 0x003C, 0x0028, 0x002B, 0x007C, 0x0026, 0xFFA8, /* 0xd0 */ 0x007D, 0x004A, 0x004B, 0x004C, 0x004D, 0x004E, 0x004F, 0x0050,
0xFFA9, 0xFFAA, 0xFFAB, 0xFFAC, 0xFFAD, 0xFFAE, 0xFFAF, 0x0021, 0x0024, /* 0xd8 */ 0x0051, 0x0052, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
0x002A, 0x0029, 0x003B, 0x00AC, 0x002D, 0x002F, 0xFFB0, 0xFFB1, 0xFFB2, /* 0xe0 */ 0x20A9, 0x0000, 0x0053, 0x0054, 0x0055, 0x0056, 0x0057, 0x0058,
0xFFB3, 0xFFB4, 0xFFB5, 0xFFB6, 0xFFB7, 0x00A6, 0x002C, 0x0025, 0x005F, /* 0xe8 */ 0x0059, 0x005A, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
0x003E, 0x003F, 0x005B, 0xFFB8, 0xFFB9, 0xFFBA, 0xFFBB, 0xFFBC, 0xFFBD, /* 0xf0 */ 0x0030, 0x0031, 0x0032, 0x0033, 0x0034, 0x0035, 0x0036, 0x0037,
0xFFBE, 0x0060, 0x003A, 0x0023, 0x0040, 0x0027, 0x003D, 0x0022, 0x005D, /* 0xf8 */ 0x0038, 0x0039, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x009F
0x0061, 0x0062, 0x0063, 0x0064, 0x0065, 0x0066, 0x0067, 0x0068, 0x0069,
0xFFC2, 0xFFC3, 0xFFC4, 0xFFC5, 0xFFC6, 0xFFC7, 0x006A, 0x006B, 0x006C,
0x006D, 0x006E, 0x006F, 0x0070, 0x0071, 0x0072, 0xFFCA, 0xFFCB, 0xFFCC,
0xFFCD, 0xFFCE, 0xFFCF, 0x203E, 0x007E, 0x0073, 0x0074, 0x0075, 0x0076,
0x0077, 0x0078, 0x0079, 0x007A, 0xFFD2, 0xFFD3, 0xFFD4, 0xFFD5, 0xFFD6,
0xFFD7, 0x005E, 0x005C, 0xFFDA, 0xFFDB, 0xFFDC, 0x007B, 0x0041, 0x0042,
0x0043, 0x0044, 0x0045, 0x0046, 0x0047, 0x0048, 0x0049, 0x007D, 0x004A,
0x004B, 0x004C, 0x004D, 0x004E, 0x004F, 0x0050, 0x0051, 0x0052, 0x20A9,
0x0053, 0x0054, 0x0055, 0x0056, 0x0057, 0x0058, 0x0059, 0x005A, 0x0030,
0x0031, 0x0032, 0x0033, 0x0034, 0x0035, 0x0036, 0x0037, 0x0038, 0x0039,
0x009F
}; };
static const struct gap __ibm933db_to_ucs4_idx[] = static const struct gap __ibm933db_to_ucs4_idx[] =

View File

@ -1,5 +1,5 @@
/* Conversion from and to IBM935 /* Conversion from and to IBM935
Copyright (C) 2000 Free Software Foundation, Inc. Copyright (C) 2000, 2001 Free Software Foundation, Inc.
This file is part of the GNU C Library. This file is part of the GNU C Library.
Contributed by Masahide Washizawa <washi@yamato.ibm.co.jp>, 2000. Contributed by Masahide Washizawa <washi@yamato.ibm.co.jp>, 2000.
@ -32,42 +32,76 @@
#define CHARSET_NAME "IBM935//" #define CHARSET_NAME "IBM935//"
#define FROM_LOOP from_ibm935 #define FROM_LOOP from_ibm935
#define TO_LOOP to_ibm935 #define TO_LOOP to_ibm935
#define MIN_NEEDED_FROM 1
#define MAX_NEEDED_FROM 2
#define MIN_NEEDED_TO 4
#define MAX_NEEDED_TO 4
#define PREPARE_LOOP \
int save_curcs; \
int *curcsp = &data->__statep->__count;
#define EXTRA_LOOP_ARGS , curcsp
/* Definitions of initialization and destructor function. */ /* Definitions of initialization and destructor function. */
#define DEFINE_INIT 1 #define DEFINE_INIT 1
#define DEFINE_FINI 1 #define DEFINE_FINI 1
#define MIN_NEEDED_FROM 1
#define MIN_NEEDED_TO 4 /* Since this is a stateful encoding we have to provide code which resets
the output state to the initial state. This has to be done during the
flushing. */
#define EMIT_SHIFT_TO_INIT \
if ((data->__statep->__count & ~7) != sb) \
{ \
if (FROM_DIRECTION) \
data->__statep->__count &= 7; \
else \
{ \
unsigned char *outbuf = data->__outbuf; \
\
/* We are not in the initial state. To switch back we have \
to emit `SI'. */ \
if (__builtin_expect (outbuf >= data->__outbufend, 0)) \
/* We don't have enough room in the output buffer. */ \
status = __GCONV_FULL_OUTPUT; \
else \
{ \
/* Write out the shift sequence. */ \
*outbuf++ = SI; \
data->__outbuf = outbuf; \
data->__statep->__count &= 7; \
} \
} \
}
/* Since we might have to reset input pointer we must be able to save
and retore the state. */
#define SAVE_RESET_STATE(Save) \
if (Save) \
save_curcs = *curcsp; \
else \
*curcsp = save_curcs
/* Current codeset type. */ /* Current codeset type. */
enum enum
{ {
init = 0, sb = 0,
sb, db = 64
db
}; };
/* First, define the conversion function from IBM-935 to UCS4. */ /* First, define the conversion function from IBM-935 to UCS4. */
#define MIN_NEEDED_INPUT MIN_NEEDED_FROM #define MIN_NEEDED_INPUT MIN_NEEDED_FROM
#define MAX_NEEDED_INPUT MAX_NEEDED_FROM
#define MIN_NEEDED_OUTPUT MIN_NEEDED_TO #define MIN_NEEDED_OUTPUT MIN_NEEDED_TO
#define INIT_PARAMS int curcs = init;
#define LOOPFCT FROM_LOOP #define LOOPFCT FROM_LOOP
#define BODY \ #define BODY \
{ \ { \
uint32_t ch = *inptr; \ uint32_t ch = *inptr; \
uint32_t res; \ uint32_t res; \
const struct gap *rp1 = __ibm935sb_to_ucs4_idx; \
const struct gap *rp2 = __ibm935db_to_ucs4_idx; \
\ \
if (__builtin_expect(ch, 0) == SO) \ if (__builtin_expect(ch, 0) == SO) \
{ \ { \
if (__builtin_expect (inptr + 1 >= inend, 0)) \
{ \
result = __GCONV_INCOMPLETE_INPUT; \
break; \
} \
\
/* Shift OUT, change to DBCS converter. */ \ /* Shift OUT, change to DBCS converter. */ \
if (curcs == db) \ if (curcs == db) \
{ \ { \
@ -76,16 +110,10 @@ enum
} \ } \
curcs = db; \ curcs = db; \
++inptr; \ ++inptr; \
ch = *inptr; \ continue; \
} \ } \
else if (__builtin_expect (ch, 0) == SI) \ else if (__builtin_expect (ch, 0) == SI) \
{ \ { \
if (__builtin_expect (inptr + 1 >= inend, 0)) \
{ \
result = __GCONV_INCOMPLETE_INPUT; \
break; \
} \
\
/* Shift IN, change to SBCS converter. */ \ /* Shift IN, change to SBCS converter. */ \
if (curcs == sb) \ if (curcs == sb) \
{ \ { \
@ -94,19 +122,14 @@ enum
} \ } \
curcs = sb; \ curcs = sb; \
++inptr; \ ++inptr; \
ch = *inptr; \ continue; \
} \ } \
\ \
if (curcs == sb || curcs == init) \ if (curcs == sb) \
{ \ { \
/* Use the IBM935 table for single byte. */ \ /* Use the IBM935 table for single byte. */ \
while (ch > rp1->end) \ res = __ibm935sb_to_ucs4[ch]; \
++rp1; \ if (__builtin_expect (res, L'\1') == L'\0' && ch != '\0') \
\
if (__builtin_expect (rp1 == NULL, 0) \
|| __builtin_expect (ch < rp1->start, 0) \
|| (res = __ibm935sb_to_ucs4[ch + rp1->idx], \
__builtin_expect (res, L'\1') == L'\0' && ch != '\0')) \
{ \ { \
/* This is an illegal character. */ \ /* This is an illegal character. */ \
if (! ignore_errors_p ()) \ if (! ignore_errors_p ()) \
@ -115,18 +138,20 @@ enum
break; \ break; \
} \ } \
++*irreversible; \ ++*irreversible; \
++inptr; \
continue; \
} \ } \
else \ else \
{ \ { \
put32 (outptr, res); \ put32 (outptr, res); \
outptr += 4; \ outptr += 4; \
inptr++; \
} \ } \
++inptr; \
} \ } \
else if (curcs == db) \ else \
{ \ { \
const struct gap *rp2 = __ibm935db_to_ucs4_idx; \
\
assert (curcs == db); \
\
/* Use the IBM935 table for double byte. */ \ /* Use the IBM935 table for double byte. */ \
if (__builtin_expect (inptr + 1 >= inend, 0)) \ if (__builtin_expect (inptr + 1 >= inend, 0)) \
{ \ { \
@ -152,24 +177,25 @@ enum
break; \ break; \
} \ } \
++*irreversible; \ ++*irreversible; \
inptr += 2; \
continue; \
} \ } \
else \ else \
{ \ { \
put32 (outptr, res); \ put32 (outptr, res); \
outptr += 4; \ outptr += 4; \
inptr += 2; \
} \ } \
inptr += 2; \
} \ } \
} }
#define LOOP_NEED_FLAGS #define LOOP_NEED_FLAGS
#define EXTRA_LOOP_DECLS , int *curcsp
#define INIT_PARAMS int curcs = *curcsp & ~7
#define UPDATE_PARAMS *curcsp = curcs
#include <iconv/loop.c> #include <iconv/loop.c>
/* Next, define the other direction. */ /* Next, define the other direction. */
#define MIN_NEEDED_INPUT MIN_NEEDED_TO #define MIN_NEEDED_INPUT MIN_NEEDED_TO
#define MIN_NEEDED_OUTPUT MIN_NEEDED_FROM #define MIN_NEEDED_OUTPUT MIN_NEEDED_FROM
#define INIT_PARAMS int curcs = init; #define MAX_NEEDED_OUTPUT MAX_NEEDED_FROM
#define LOOPFCT TO_LOOP #define LOOPFCT TO_LOOP
#define BODY \ #define BODY \
{ \ { \
@ -180,16 +206,21 @@ enum
\ \
if (__builtin_expect (ch, 0) >= 0xffff) \ if (__builtin_expect (ch, 0) >= 0xffff) \
{ \ { \
rp1 = NULL; \ if (! ignore_errors_p ()) \
rp2 = NULL; \ { \
result = __GCONV_ILLEGAL_INPUT; \
break; \
} \
++*irreversible; \
inptr += 4; \
continue; \
} \ } \
else \ \
while (ch > rp1->end) \ while (ch > rp1->end) \
++rp1; \ ++rp1; \
\ \
/* Use the UCS4 table for single byte. */ \ /* Use the UCS4 table for single byte. */ \
if (__builtin_expect (rp1 == NULL, 0) \ if (__builtin_expect (ch < rp1->start, 0) \
|| __builtin_expect (ch < rp1->start, 0) \
|| (cp = __ucs4_to_ibm935sb[ch + rp1->idx], \ || (cp = __ucs4_to_ibm935sb[ch + rp1->idx], \
__builtin_expect (cp[0], L'\1') == L'\0' && ch != '\0')) \ __builtin_expect (cp[0], L'\1') == L'\0' && ch != '\0')) \
{ \ { \
@ -197,8 +228,7 @@ enum
while (ch > rp2->end) \ while (ch > rp2->end) \
++rp2; \ ++rp2; \
\ \
if (__builtin_expect (rp2 == NULL, 0) \ if (__builtin_expect (ch < rp2->start, 0) \
|| __builtin_expect (ch < rp2->start, 0) \
|| (cp = __ucs4_to_ibm935db[ch + rp2->idx], \ || (cp = __ucs4_to_ibm935db[ch + rp2->idx], \
__builtin_expect (cp[0], L'\1')==L'\0' && ch != '\0')) \ __builtin_expect (cp[0], L'\1')==L'\0' && ch != '\0')) \
{ \ { \
@ -212,7 +242,7 @@ enum
} \ } \
else \ else \
{ \ { \
if (curcs == init || curcs == sb) \ if (curcs == sb) \
{ \ { \
if (__builtin_expect (outptr+1 > outend, 0)) \ if (__builtin_expect (outptr+1 > outend, 0)) \
{ \ { \
@ -257,6 +287,9 @@ enum
inptr += 4; \ inptr += 4; \
} }
#define LOOP_NEED_FLAGS #define LOOP_NEED_FLAGS
#define EXTRA_LOOP_DECLS , int *curcsp
#define INIT_PARAMS int curcs = *curcsp & ~7
#define UPDATE_PARAMS *curcsp = curcs
#include <iconv/loop.c> #include <iconv/loop.c>
/* Now define the toplevel functions. */ /* Now define the toplevel functions. */

View File

@ -1,5 +1,5 @@
/* Tables for conversion from and to IBM935 /* Tables for conversion from and to IBM935
Copyright (C) 2000 Free Software Foundation, Inc. Copyright (C) 2000, 2001 Free Software Foundation, Inc.
This file is part of the GNU C Library. This file is part of the GNU C Library.
Contributed by Masahide Washizawa <washi@yamato.ibm.co.jp>, 2000. Contributed by Masahide Washizawa <washi@yamato.ibm.co.jp>, 2000.
@ -32,49 +32,40 @@ struct gap
}; };
static const struct gap __ibm935sb_to_ucs4_idx[] = static const uint16_t __ibm935sb_to_ucs4[256] =
{ {
{ start: 0x0000, end: 0x0040, idx: 0 }, /* 0x00 */ 0x0000, 0x0001, 0x0002, 0x0003, 0x009C, 0x0009, 0x0086, 0x007F,
{ start: 0x004a, end: 0x0050, idx: -9 }, /* 0x08 */ 0x0097, 0x008D, 0x008E, 0x000B, 0x000C, 0x000D, 0x000E, 0x000F,
{ start: 0x005a, end: 0x0061, idx: -18 }, /* 0x10 */ 0x0010, 0x0011, 0x0012, 0x0013, 0x009D, 0x0085, 0x0008, 0x0087,
{ start: 0x006a, end: 0x006f, idx: -26 }, /* 0x18 */ 0x0018, 0x0019, 0x0092, 0x008F, 0x001C, 0x001D, 0x001E, 0x001F,
{ start: 0x0079, end: 0x007f, idx: -35 }, /* 0x20 */ 0x0080, 0x0081, 0x0082, 0x0083, 0x0084, 0x000A, 0x0017, 0x001B,
{ start: 0x0081, end: 0x0089, idx: -36 }, /* 0x28 */ 0x0088, 0x0089, 0x008A, 0x008B, 0x008C, 0x0005, 0x0006, 0x0007,
{ start: 0x0091, end: 0x0099, idx: -43 }, /* 0x30 */ 0x0090, 0x0091, 0x0016, 0x0093, 0x0094, 0x0095, 0x0096, 0x0004,
{ start: 0x00a0, end: 0x00a9, idx: -49 }, /* 0x38 */ 0x0098, 0x0099, 0x009A, 0x009B, 0x0014, 0x0015, 0x009E, 0x001A,
{ start: 0x00b0, end: 0x00b0, idx: -55 }, /* 0x40 */ 0x0020, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
{ start: 0x00b2, end: 0x00b2, idx: -56 }, /* 0x48 */ 0x0000, 0x0000, 0x00A3, 0x002E, 0x003C, 0x0028, 0x002B, 0x007C,
{ start: 0x00ba, end: 0x00bb, idx: -63 }, /* 0x50 */ 0x0026, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
{ start: 0x00c0, end: 0x00c9, idx: -67 }, /* 0x58 */ 0x0000, 0x0000, 0x0021, 0x00A5, 0x002A, 0x0029, 0x003B, 0x00AC,
{ start: 0x00d0, end: 0x00d9, idx: -73 }, /* 0x60 */ 0x002D, 0x002F, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
{ start: 0x00e0, end: 0x00e0, idx: -79 }, /* 0x68 */ 0x0000, 0x0000, 0x00A6, 0x002C, 0x0025, 0x005F, 0x003E, 0x003F,
{ start: 0x00e2, end: 0x00e9, idx: -80 }, /* 0x70 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
{ start: 0x00f0, end: 0x00f9, idx: -86 }, /* 0x78 */ 0x0000, 0x0060, 0x003A, 0x0023, 0x0040, 0x0027, 0x003D, 0x0022,
{ start: 0x00ff, end: 0x00ff, idx: -91 }, /* 0x80 */ 0x0000, 0x0061, 0x0062, 0x0063, 0x0064, 0x0065, 0x0066, 0x0067,
{ start: 0xffff, end: 0xffff, idx: 0 } /* 0x88 */ 0x0068, 0x0069, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
}; /* 0x90 */ 0x0000, 0x006A, 0x006B, 0x006C, 0x006D, 0x006E, 0x006F, 0x0070,
/* 0x98 */ 0x0071, 0x0072, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
static const uint16_t __ibm935sb_to_ucs4[] = /* 0xa0 */ 0x007E, 0x203E, 0x0073, 0x0074, 0x0075, 0x0076, 0x0077, 0x0078,
{ /* 0xa8 */ 0x0079, 0x007A, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
0x0000, 0x0001, 0x0002, 0x0003, 0x009C, 0x0009, 0x0086, 0x007F, 0x0097, /* 0xb0 */ 0x005E, 0x0000, 0x005C, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
0x008D, 0x008E, 0x000B, 0x000C, 0x000D, 0x000E, 0x000F, 0x0010, 0x0011, /* 0xb8 */ 0x0000, 0x0000, 0x005B, 0x005D, 0x0000, 0x0000, 0x0000, 0x0000,
0x0012, 0x0013, 0x009D, 0x0085, 0x0008, 0x0087, 0x0018, 0x0019, 0x0092, /* 0xc0 */ 0x007B, 0x0041, 0x0042, 0x0043, 0x0044, 0x0045, 0x0046, 0x0047,
0x008F, 0x001C, 0x001D, 0x001E, 0x001F, 0x0080, 0x0081, 0x0082, 0x0083, /* 0xc8 */ 0x0048, 0x0049, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
0x0084, 0x000A, 0x0017, 0x001B, 0x0088, 0x0089, 0x008A, 0x008B, 0x008C, /* 0xd0 */ 0x007D, 0x004A, 0x004B, 0x004C, 0x004D, 0x004E, 0x004F, 0x0050,
0x0005, 0x0006, 0x0007, 0x0090, 0x0091, 0x0016, 0x0093, 0x0094, 0x0095, /* 0xd8 */ 0x0051, 0x0052, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
0x0096, 0x0004, 0x0098, 0x0099, 0x009A, 0x009B, 0x0014, 0x0015, 0x009E, /* 0xe0 */ 0x0024, 0x0000, 0x0053, 0x0054, 0x0055, 0x0056, 0x0057, 0x0058,
0x001A, 0x0020, 0x00A3, 0x002E, 0x003C, 0x0028, 0x002B, 0x007C, 0x0026, /* 0xe8 */ 0x0059, 0x005A, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
0x0021, 0x00A5, 0x002A, 0x0029, 0x003B, 0x00AC, 0x002D, 0x002F, 0x00A6, /* 0xf0 */ 0x0030, 0x0031, 0x0032, 0x0033, 0x0034, 0x0035, 0x0036, 0x0037,
0x002C, 0x0025, 0x005F, 0x003E, 0x003F, 0x0060, 0x003A, 0x0023, 0x0040, /* 0xf8 */ 0x0038, 0x0039, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x009F
0x0027, 0x003D, 0x0022, 0x0061, 0x0062, 0x0063, 0x0064, 0x0065, 0x0066,
0x0067, 0x0068, 0x0069, 0x006A, 0x006B, 0x006C, 0x006D, 0x006E, 0x006F,
0x0070, 0x0071, 0x0072, 0x007E, 0x203E, 0x0073, 0x0074, 0x0075, 0x0076,
0x0077, 0x0078, 0x0079, 0x007A, 0x005E, 0x005C, 0x005B, 0x005D, 0x007B,
0x0041, 0x0042, 0x0043, 0x0044, 0x0045, 0x0046, 0x0047, 0x0048, 0x0049,
0x007D, 0x004A, 0x004B, 0x004C, 0x004D, 0x004E, 0x004F, 0x0050, 0x0051,
0x0052, 0x0024, 0x0053, 0x0054, 0x0055, 0x0056, 0x0057, 0x0058, 0x0059,
0x005A, 0x0030, 0x0031, 0x0032, 0x0033, 0x0034, 0x0035, 0x0036, 0x0037,
0x0038, 0x0039, 0x009F
}; };
static const struct gap __ibm935db_to_ucs4_idx[] = static const struct gap __ibm935db_to_ucs4_idx[] =

View File

@ -1,5 +1,5 @@
/* Conversion to and from IBM937. /* Conversion to and from IBM937.
Copyright (C) 2000 Free Software Foundation, Inc. Copyright (C) 2000, 2001 Free Software Foundation, Inc.
This file is part of the GNU C Library. This file is part of the GNU C Library.
Contributed by Masahide Washizawa <washi@yamato.ibm.co.jp>, 2000. Contributed by Masahide Washizawa <washi@yamato.ibm.co.jp>, 2000.
@ -32,26 +32,68 @@
#define CHARSET_NAME "IBM937//" #define CHARSET_NAME "IBM937//"
#define FROM_LOOP from_ibm937 #define FROM_LOOP from_ibm937
#define TO_LOOP to_ibm937 #define TO_LOOP to_ibm937
#define MIN_NEEDED_FROM 1
#define MAX_NEEDED_FROM 2
#define MIN_NEEDED_TO 4
#define MAX_NEEDED_TO 4
#define PREPARE_LOOP \
int save_curcs; \
int *curcsp = &data->__statep->__count;
#define EXTRA_LOOP_ARGS , curcsp
/* Definitions of initialization and destructor function. */ /* Definitions of initialization and destructor function. */
#define DEFINE_INIT 1 #define DEFINE_INIT 1
#define DEFINE_FINI 1 #define DEFINE_FINI 1
#define MIN_NEEDED_FROM 1
#define MIN_NEEDED_TO 4 /* Since this is a stateful encoding we have to provide code which resets
the output state to the initial state. This has to be done during the
flushing. */
#define EMIT_SHIFT_TO_INIT \
if ((data->__statep->__count & ~7) != sb) \
{ \
if (FROM_DIRECTION) \
data->__statep->__count &= 7; \
else \
{ \
unsigned char *outbuf = data->__outbuf; \
\
/* We are not in the initial state. To switch back we have \
to emit `SI'. */ \
if (__builtin_expect (outbuf >= data->__outbufend, 0)) \
/* We don't have enough room in the output buffer. */ \
status = __GCONV_FULL_OUTPUT; \
else \
{ \
/* Write out the shift sequence. */ \
*outbuf++ = SI; \
data->__outbuf = outbuf; \
data->__statep->__count &= 7; \
} \
} \
}
/* Since we might have to reset input pointer we must be able to save
and retore the state. */
#define SAVE_RESET_STATE(Save) \
if (Save) \
save_curcs = *curcsp; \
else \
*curcsp = save_curcs
/* Current codeset type. */ /* Current codeset type. */
enum enum
{ {
init = 0, sb = 0,
sb, db = 64
db
}; };
/* First, define the conversion function from IBM-937 to UCS4. */ /* First, define the conversion function from IBM-937 to UCS4. */
#define MIN_NEEDED_INPUT MIN_NEEDED_FROM #define MIN_NEEDED_INPUT MIN_NEEDED_FROM
#define MAX_NEEDED_INPUT MAX_NEEDED_FROM
#define MIN_NEEDED_OUTPUT MIN_NEEDED_TO #define MIN_NEEDED_OUTPUT MIN_NEEDED_TO
#define INIT_PARAMS int curcs = init;
#define LOOPFCT FROM_LOOP #define LOOPFCT FROM_LOOP
#define BODY \ #define BODY \
{ \ { \
@ -59,12 +101,6 @@ enum
\ \
if (__builtin_expect (ch, 0) == SO) \ if (__builtin_expect (ch, 0) == SO) \
{ \ { \
if (__builtin_expect (inptr + 1 >= inend, 0)) \
{ \
result = __GCONV_INCOMPLETE_INPUT; \
break; \
} \
\
/* Shift OUT, change to DBCS converter. */ \ /* Shift OUT, change to DBCS converter. */ \
if (curcs == db) \ if (curcs == db) \
{ \ { \
@ -73,16 +109,10 @@ enum
} \ } \
curcs = db; \ curcs = db; \
++inptr; \ ++inptr; \
ch = *inptr; \ continue; \
} \ } \
else if (__builtin_expect (ch, 0) == SI) \ else if (__builtin_expect (ch, 0) == SI) \
{ \ { \
if (__builtin_expect (inptr + 1 >= inend, 0)) \
{ \
result = __GCONV_INCOMPLETE_INPUT; \
break; \
} \
\
/* Shift IN, change to SBCS converter. */ \ /* Shift IN, change to SBCS converter. */ \
if (curcs == sb) \ if (curcs == sb) \
{ \ { \
@ -91,10 +121,10 @@ enum
} \ } \
curcs = sb; \ curcs = sb; \
++inptr; \ ++inptr; \
ch = *inptr; \ continue; \
} \ } \
\ \
if (curcs == sb || curcs == init) \ if (curcs == sb) \
{ \ { \
/* Use the UCS4 table for single byte. */ \ /* Use the UCS4 table for single byte. */ \
ch = __ibm937sb_to_ucs4[ch]; \ ch = __ibm937sb_to_ucs4[ch]; \
@ -107,19 +137,20 @@ enum
break; \ break; \
} \ } \
++*irreversible; \ ++*irreversible; \
++inptr; \
continue; \
} \ } \
else \ else \
{ \ { \
put32 (outptr, ch); \ put32 (outptr, ch); \
outptr += 4; \ outptr += 4; \
inptr++; \
} \ } \
++inptr; \
} \ } \
else if (curcs == db) \ else \
{ \ { \
/* Use the IBM937 table for double byte. */ \ /* Use the IBM937 table for double byte. */ \
\
assert (curcs == db); \
\
ch = ibm937db_to_ucs4(inptr[0], inptr[1]); \ ch = ibm937db_to_ucs4(inptr[0], inptr[1]); \
if (__builtin_expect (ch, L'\1') == L'\0' && *inptr != '\0') \ if (__builtin_expect (ch, L'\1') == L'\0' && *inptr != '\0') \
{ \ { \
@ -130,24 +161,25 @@ enum
break; \ break; \
} \ } \
++*irreversible; \ ++*irreversible; \
inptr += 2; \
continue; \
} \ } \
else \ else \
{ \ { \
put32 (outptr, ch); \ put32 (outptr, ch); \
outptr += 4; \ outptr += 4; \
inptr += 2; \
} \ } \
inptr += 2; \
} \ } \
} }
#define LOOP_NEED_FLAGS #define LOOP_NEED_FLAGS
#define EXTRA_LOOP_DECLS , int *curcsp
#define INIT_PARAMS int curcs = *curcsp & ~7
#define UPDATE_PARAMS *curcsp = curcs
#include <iconv/loop.c> #include <iconv/loop.c>
/* Next, define the other direction. */ /* Next, define the other direction. */
#define MIN_NEEDED_INPUT MIN_NEEDED_TO #define MIN_NEEDED_INPUT MIN_NEEDED_TO
#define MIN_NEEDED_OUTPUT MIN_NEEDED_FROM #define MIN_NEEDED_OUTPUT MIN_NEEDED_FROM
#define INIT_PARAMS int curcs = init; #define MAX_NEEDED_OUTPUT MAX_NEEDED_FROM
#define LOOPFCT TO_LOOP #define LOOPFCT TO_LOOP
#define BODY \ #define BODY \
{ \ { \
@ -174,7 +206,7 @@ enum
} \ } \
else \ else \
{ \ { \
if (curcs == init || curcs == sb) \ if (curcs == sb) \
{ \ { \
*outptr++ = SO; \ *outptr++ = SO; \
if (__builtin_expect (outptr == outend, 0)) \ if (__builtin_expect (outptr == outend, 0)) \
@ -207,6 +239,9 @@ enum
inptr += 4; \ inptr += 4; \
} }
#define LOOP_NEED_FLAGS #define LOOP_NEED_FLAGS
#define EXTRA_LOOP_DECLS , int *curcsp
#define INIT_PARAMS int curcs = *curcsp & ~7
#define UPDATE_PARAMS *curcsp = curcs
#include <iconv/loop.c> #include <iconv/loop.c>
/* Now define the toplevel functions. */ /* Now define the toplevel functions. */

View File

@ -1,5 +1,5 @@
/* Conversion to and from IBM939. /* Conversion to and from IBM939.
Copyright (C) 2000 Free Software Foundation, Inc. Copyright (C) 2000, 2001 Free Software Foundation, Inc.
This file is part of the GNU C Library. This file is part of the GNU C Library.
Contributed by Masahide Washizawa <washi@yamato.ibm.co.jp>, 2000. Contributed by Masahide Washizawa <washi@yamato.ibm.co.jp>, 2000.
@ -32,42 +32,76 @@
#define CHARSET_NAME "IBM939//" #define CHARSET_NAME "IBM939//"
#define FROM_LOOP from_ibm939 #define FROM_LOOP from_ibm939
#define TO_LOOP to_ibm939 #define TO_LOOP to_ibm939
#define MIN_NEEDED_FROM 1
#define MAX_NEEDED_FROM 2
#define MIN_NEEDED_TO 4
#define MAX_NEEDED_TO 4
#define PREPARE_LOOP \
int save_curcs; \
int *curcsp = &data->__statep->__count;
#define EXTRA_LOOP_ARGS , curcsp
/* Definitions of initialization and destructor function. */ /* Definitions of initialization and destructor function. */
#define DEFINE_INIT 1 #define DEFINE_INIT 1
#define DEFINE_FINI 1 #define DEFINE_FINI 1
#define MIN_NEEDED_FROM 1
#define MIN_NEEDED_TO 4 /* Since this is a stateful encoding we have to provide code which resets
the output state to the initial state. This has to be done during the
flushing. */
#define EMIT_SHIFT_TO_INIT \
if ((data->__statep->__count & ~7) != sb) \
{ \
if (FROM_DIRECTION) \
data->__statep->__count &= 7; \
else \
{ \
unsigned char *outbuf = data->__outbuf; \
\
/* We are not in the initial state. To switch back we have \
to emit `SI'. */ \
if (__builtin_expect (outbuf >= data->__outbufend, 0)) \
/* We don't have enough room in the output buffer. */ \
status = __GCONV_FULL_OUTPUT; \
else \
{ \
/* Write out the shift sequence. */ \
*outbuf++ = SI; \
data->__outbuf = outbuf; \
data->__statep->__count &= 7; \
} \
} \
}
/* Since we might have to reset input pointer we must be able to save
and retore the state. */
#define SAVE_RESET_STATE(Save) \
if (Save) \
save_curcs = *curcsp; \
else \
*curcsp = save_curcs
/* Current codeset type. */ /* Current codeset type. */
enum enum
{ {
init = 0, sb = 0,
sb, db = 64
db
}; };
/* First, define the conversion function from IBM-939 to UCS4. */ /* First, define the conversion function from IBM-939 to UCS4. */
#define MIN_NEEDED_INPUT MIN_NEEDED_FROM #define MIN_NEEDED_INPUT MIN_NEEDED_FROM
#define MAX_NEEDED_INPUT MAX_NEEDED_FROM
#define MIN_NEEDED_OUTPUT MIN_NEEDED_TO #define MIN_NEEDED_OUTPUT MIN_NEEDED_TO
#define INIT_PARAMS int curcs = init;
#define LOOPFCT FROM_LOOP #define LOOPFCT FROM_LOOP
#define BODY \ #define BODY \
{ \ { \
uint32_t ch = *inptr; \ uint32_t ch = *inptr; \
uint32_t res; \ uint32_t res; \
const struct gap *rp1 = __ibm939sb_to_ucs4_idx; \
const struct gap *rp2 = __ibm939db_to_ucs4_idx; \
\ \
if (__builtin_expect (ch, 0) == SO) \ if (__builtin_expect (ch, 0) == SO) \
{ \ { \
if (__builtin_expect (inptr + 1 >= inend, 0)) \
{ \
result = __GCONV_INCOMPLETE_INPUT; \
break; \
} \
\
/* Shift OUT, change to DBCS converter. */ \ /* Shift OUT, change to DBCS converter. */ \
if (curcs == db) \ if (curcs == db) \
{ \ { \
@ -76,16 +110,10 @@ enum
} \ } \
curcs = db; \ curcs = db; \
++inptr; \ ++inptr; \
ch = *inptr; \ continue; \
} \ } \
else if (__builtin_expect (ch, 0) == SI) \ else if (__builtin_expect (ch, 0) == SI) \
{ \ { \
if (__builtin_expect (inptr + 1 >= inend, 0)) \
{ \
result = __GCONV_INCOMPLETE_INPUT; \
break; \
} \
\
/* Shift IN, change to SBCS converter. */ \ /* Shift IN, change to SBCS converter. */ \
if (curcs == sb) \ if (curcs == sb) \
{ \ { \
@ -94,19 +122,14 @@ enum
} \ } \
curcs = sb; \ curcs = sb; \
++inptr; \ ++inptr; \
ch = *inptr; \ continue; \
} \ } \
\ \
if (curcs == sb || curcs == init) \ if (curcs == sb) \
{ \ { \
/* Use the IBM939 table for single byte. */ \ /* Use the IBM939 table for single byte. */ \
while (ch > rp1->end) \ res = __ibm939sb_to_ucs4[ch]; \
++rp1; \ if (__builtin_expect (res, L'\1') == L'\0' && ch != '\0') \
\
if (__builtin_expect (rp1 == NULL, 0) \
|| __builtin_expect (ch < rp1->start, 0) \
|| (res = __ibm939sb_to_ucs4[ch + rp1->idx], \
__builtin_expect (res, L'\1') == L'\0' && ch != '\0')) \
{ \ { \
/* This is an illegal character. */ \ /* This is an illegal character. */ \
if (! ignore_errors_p ()) \ if (! ignore_errors_p ()) \
@ -115,21 +138,21 @@ enum
break; \ break; \
} \ } \
++*irreversible; \ ++*irreversible; \
++inptr; \
continue; \
} \ } \
else \ else \
{ \ { \
if (res == 0xa5) \
res = 0x5c; \
put32 (outptr, res); \ put32 (outptr, res); \
outptr += 4; \ outptr += 4; \
++inptr; \
} \ } \
++inptr; \
} \ } \
else if (curcs == db) \ else \
{ \ { \
/* Use the IBM939 table for double byte. */ \ /* Use the IBM939 table for double byte. */ \
const struct gap *rp2 = __ibm939db_to_ucs4_idx; \
\
assert (curcs == db); \
\
if (__builtin_expect (inptr + 1 >= inend, 0)) \ if (__builtin_expect (inptr + 1 >= inend, 0)) \
{ \ { \
/* The second character is not available. Store the \ /* The second character is not available. Store the \
@ -154,24 +177,25 @@ enum
break; \ break; \
} \ } \
++*irreversible; \ ++*irreversible; \
inptr += 2; \
continue; \
} \ } \
else \ else \
{ \ { \
put32 (outptr, res); \ put32 (outptr, res); \
outptr += 4; \ outptr += 4; \
inptr += 2; \
} \ } \
inptr += 2; \
} \ } \
} }
#define LOOP_NEED_FLAGS #define LOOP_NEED_FLAGS
#define EXTRA_LOOP_DECLS , int *curcsp
#define INIT_PARAMS int curcs = *curcsp & ~7
#define UPDATE_PARAMS *curcsp = curcs
#include <iconv/loop.c> #include <iconv/loop.c>
/* Next, define the other direction */ /* Next, define the other direction */
#define MIN_NEEDED_INPUT MIN_NEEDED_TO #define MIN_NEEDED_INPUT MIN_NEEDED_TO
#define MIN_NEEDED_OUTPUT MIN_NEEDED_FROM #define MIN_NEEDED_OUTPUT MIN_NEEDED_FROM
#define INIT_PARAMS int curcs = init; #define MAX_NEEDED_OUTPUT MAX_NEEDED_FROM
#define LOOPFCT TO_LOOP #define LOOPFCT TO_LOOP
#define BODY \ #define BODY \
{ \ { \
@ -214,7 +238,7 @@ enum
} \ } \
else \ else \
{ \ { \
if (curcs == init || curcs == sb) \ if (curcs == sb) \
{ \ { \
if (__builtin_expect (outptr+1 > outend, 0)) \ if (__builtin_expect (outptr+1 > outend, 0)) \
{ \ { \
@ -264,6 +288,9 @@ enum
inptr += 4; \ inptr += 4; \
} }
#define LOOP_NEED_FLAGS #define LOOP_NEED_FLAGS
#define EXTRA_LOOP_DECLS , int *curcsp
#define INIT_PARAMS int curcs = *curcsp & ~7
#define UPDATE_PARAMS *curcsp = curcs
#include <iconv/loop.c> #include <iconv/loop.c>
/* Now define the toplevel functions. */ /* Now define the toplevel functions. */

View File

@ -1,5 +1,5 @@
/* Tables for conversion to and from IBM939. /* Tables for conversion to and from IBM939.
Copyright (C) 2000 Free Software Foundation, Inc. Copyright (C) 2000, 2001 Free Software Foundation, Inc.
This file is part of the GNU C Library. This file is part of the GNU C Library.
Contributed by Masahide Washizawa <washi@yamato.ibm.co.jp>, 2000. Contributed by Masahide Washizawa <washi@yamato.ibm.co.jp>, 2000.
@ -32,49 +32,40 @@ struct gap
}; };
static const struct gap __ibm939sb_to_ucs4_idx[] = static const uint16_t __ibm939sb_to_ucs4[256] =
{ {
{ start: 0x0000, end: 0x0040, idx: 0 }, /* 0x00 */ 0x0000, 0x0001, 0x0002, 0x0003, 0x009C, 0x0009, 0x0086, 0x007F,
{ start: 0x0042, end: 0x0069, idx: -1 }, /* 0x08 */ 0x0097, 0x008D, 0x008E, 0x000B, 0x000C, 0x000D, 0x000E, 0x000F,
{ start: 0x006b, end: 0x007f, idx: -2 }, /* 0x10 */ 0x0010, 0x0011, 0x0012, 0x0013, 0x009D, 0x0085, 0x0008, 0x0087,
{ start: 0x0081, end: 0x008f, idx: -3 }, /* 0x18 */ 0x0018, 0x0019, 0x0092, 0x008F, 0x001C, 0x001D, 0x001E, 0x001F,
{ start: 0x0091, end: 0x00c9, idx: -4 }, /* 0x20 */ 0x0080, 0x0081, 0x0082, 0x0083, 0x0084, 0x000A, 0x0017, 0x001B,
{ start: 0x00d0, end: 0x00d9, idx: -10 }, /* 0x28 */ 0x0088, 0x0089, 0x008A, 0x008B, 0x008C, 0x0005, 0x0006, 0x0007,
{ start: 0x00e0, end: 0x00e0, idx: -16 }, /* 0x30 */ 0x0090, 0x0091, 0x0016, 0x0093, 0x0094, 0x0095, 0x0096, 0x0004,
{ start: 0x00e2, end: 0x00e9, idx: -17 }, /* 0x38 */ 0x0098, 0x0099, 0x009A, 0x009B, 0x0014, 0x0015, 0x009E, 0x001A,
{ start: 0x00f0, end: 0x00f9, idx: -23 }, /* 0x40 */ 0x0020, 0x0000, 0xFF61, 0xFF62, 0xFF63, 0xFF64, 0xFF65, 0xFF66,
{ start: 0x00ff, end: 0x00ff, idx: -28 }, /* 0x48 */ 0xFF67, 0xFF68, 0x00A2, 0x002E, 0x003C, 0x0028, 0x002B, 0x007C,
{ start: 0xffff, end: 0xffff, idx: 0 } /* 0x50 */ 0x0026, 0xFF69, 0xFF6A, 0xFF6B, 0xFF6C, 0xFF6D, 0xFF6E, 0xFF6F,
}; /* 0x58 */ 0xFF70, 0xFF71, 0x0021, 0x0024, 0x002A, 0x0029, 0x003B, 0x00AC,
/* 0x60 */ 0x002D, 0x002F, 0xFF72, 0xFF73, 0xFF74, 0xFF75, 0xFF76, 0xFF77,
static const uint16_t __ibm939sb_to_ucs4[] = /* 0x68 */ 0xFF78, 0xFF79, 0x0000, 0x002C, 0x0025, 0x005F, 0x003E, 0x003F,
{ /* 0x70 */ 0xFF7A, 0xFF7B, 0xFF7C, 0xFF7D, 0xFF7E, 0xFF7F, 0xFF80, 0xFF81,
0x0000, 0x0001, 0x0002, 0x0003, 0x009C, 0x0009, 0x0086, 0x007F, 0x0097, /* 0x78 */ 0xFF82, 0x0060, 0x003A, 0x0023, 0x0040, 0x0027, 0x003D, 0x0022,
0x008D, 0x008E, 0x000B, 0x000C, 0x000D, 0x000E, 0x000F, 0x0010, 0x0011, /* 0x80 */ 0x0000, 0x0061, 0x0062, 0x0063, 0x0064, 0x0065, 0x0066, 0x0067,
0x0012, 0x0013, 0x009D, 0x0085, 0x0008, 0x0087, 0x0018, 0x0019, 0x0092, /* 0x88 */ 0x0068, 0x0069, 0xFF83, 0xFF84, 0xFF85, 0xFF86, 0xFF87, 0xFF88,
0x008F, 0x001C, 0x001D, 0x001E, 0x001F, 0x0080, 0x0081, 0x0082, 0x0083, /* 0x90 */ 0x0000, 0x006A, 0x006B, 0x006C, 0x006D, 0x006E, 0x006F, 0x0070,
0x0084, 0x000A, 0x0017, 0x001B, 0x0088, 0x0089, 0x008A, 0x008B, 0x008C, /* 0x98 */ 0x0071, 0x0072, 0xFF89, 0xFF8A, 0xFF8B, 0xFF8C, 0xFF8D, 0xFF8E,
0x0005, 0x0006, 0x0007, 0x0090, 0x0091, 0x0016, 0x0093, 0x0094, 0x0095, /* 0xa0 */ 0x203E, 0x007E, 0x0073, 0x0074, 0x0075, 0x0076, 0x0077, 0x0078,
0x0096, 0x0004, 0x0098, 0x0099, 0x009A, 0x009B, 0x0014, 0x0015, 0x009E, /* 0xa8 */ 0x0079, 0x007A, 0xFF8F, 0xFF90, 0xFF91, 0x005B, 0xFF92, 0xFF93,
0x001A, 0x0020, 0xFF61, 0xFF62, 0xFF63, 0xFF64, 0xFF65, 0xFF66, 0xFF67, /* 0xb0 */ 0x005E, 0x00A3, 0x005C, 0xFF94, 0xFF95, 0xFF96, 0xFF97, 0xFF98,
0xFF68, 0x00A2, 0x002E, 0x003C, 0x0028, 0x002B, 0x007C, 0x0026, 0xFF69, /* 0xb8 */ 0xFF99, 0xFF9A, 0xFF9B, 0xFF9C, 0xFF9D, 0x005D, 0xFF9E, 0xFF9F,
0xFF6A, 0xFF6B, 0xFF6C, 0xFF6D, 0xFF6E, 0xFF6F, 0xFF70, 0xFF71, 0x0021, /* 0xc0 */ 0x007B, 0x0041, 0x0042, 0x0043, 0x0044, 0x0045, 0x0046, 0x0047,
0x0024, 0x002A, 0x0029, 0x003B, 0x00AC, 0x002D, 0x002F, 0xFF72, 0xFF73, /* 0xc8 */ 0x0048, 0x0049, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
0xFF74, 0xFF75, 0xFF76, 0xFF77, 0xFF78, 0xFF79, 0x002C, 0x0025, 0x005F, /* 0xd0 */ 0x007D, 0x004A, 0x004B, 0x004C, 0x004D, 0x004E, 0x004F, 0x0050,
0x003E, 0x003F, 0xFF7A, 0xFF7B, 0xFF7C, 0xFF7D, 0xFF7E, 0xFF7F, 0xFF80, /* 0xd8 */ 0x0051, 0x0052, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
0xFF81, 0xFF82, 0x0060, 0x003A, 0x0023, 0x0040, 0x0027, 0x003D, 0x0022, /* 0xe0 */ 0x005C, 0x0000, 0x0053, 0x0054, 0x0055, 0x0056, 0x0057, 0x0058,
0x0061, 0x0062, 0x0063, 0x0064, 0x0065, 0x0066, 0x0067, 0x0068, 0x0069, /* 0xe8 */ 0x0059, 0x005A, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
0xFF83, 0xFF84, 0xFF85, 0xFF86, 0xFF87, 0xFF88, 0x006A, 0x006B, 0x006C, /* 0xf0 */ 0x0030, 0x0031, 0x0032, 0x0033, 0x0034, 0x0035, 0x0036, 0x0037,
0x006D, 0x006E, 0x006F, 0x0070, 0x0071, 0x0072, 0xFF89, 0xFF8A, 0xFF8B, /* 0xf8 */ 0x0038, 0x0039, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x009F
0xFF8C, 0xFF8D, 0xFF8E, 0x203E, 0x007E, 0x0073, 0x0074, 0x0075, 0x0076,
0x0077, 0x0078, 0x0079, 0x007A, 0xFF8F, 0xFF90, 0xFF91, 0x005B, 0xFF92,
0xFF93, 0x005E, 0x00A3, 0x00A5, 0xFF94, 0xFF95, 0xFF96, 0xFF97, 0xFF98,
0xFF99, 0xFF9A, 0xFF9B, 0xFF9C, 0xFF9D, 0x005D, 0xFF9E, 0xFF9F, 0x007B,
0x0041, 0x0042, 0x0043, 0x0044, 0x0045, 0x0046, 0x0047, 0x0048, 0x0049,
0x007D, 0x004A, 0x004B, 0x004C, 0x004D, 0x004E, 0x004F, 0x0050, 0x0051,
0x0052, 0x005C, 0x0053, 0x0054, 0x0055, 0x0056, 0x0057, 0x0058, 0x0059,
0x005A, 0x0030, 0x0031, 0x0032, 0x0033, 0x0034, 0x0035, 0x0036, 0x0037,
0x0038, 0x0039, 0x009F
}; };
static const struct gap __ibm939db_to_ucs4_idx[] = static const struct gap __ibm939db_to_ucs4_idx[] =

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.