mirror of
https://sourceware.org/git/glibc.git
synced 2024-11-21 20:40:05 +00:00
Update.
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:
parent
e1fa173022
commit
f1813b562b
23
ChangeLog
23
ChangeLog
@ -1,3 +1,26 @@
|
||||
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>
|
||||
|
||||
* configure.in: Check for old add-ons that shouldn't be used with
|
||||
|
@ -34,7 +34,7 @@ CFLAGS-gconv_db.c = -DSTATIC_GCONV
|
||||
CFLAGS-gconv_simple.c = -DSTATIC_GCONV
|
||||
endif
|
||||
|
||||
tests = tst-iconv1 tst-iconv2
|
||||
tests = tst-iconv1 tst-iconv2 tst-iconv3
|
||||
|
||||
distribute = gconv_builtin.h gconv_int.h loop.c skeleton.c
|
||||
|
||||
|
@ -1,5 +1,5 @@
|
||||
/* 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.
|
||||
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)));
|
||||
#endif
|
||||
|
||||
do
|
||||
while (1)
|
||||
{
|
||||
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
|
||||
if everything was ok. */
|
||||
if (status == __GCONV_FULL_OUTPUT)
|
||||
{
|
||||
status = __GCONV_OK;
|
||||
outbuf = data->__outbuf;
|
||||
}
|
||||
}
|
||||
while (status == __GCONV_OK);
|
||||
|
||||
if (status != __GCONV_OK)
|
||||
break;
|
||||
|
||||
/* Reset the output buffer pointer for the next round. */
|
||||
outbuf = data->__outbuf;
|
||||
}
|
||||
|
||||
#ifdef END_LOOP
|
||||
END_LOOP
|
||||
|
@ -1,5 +1,5 @@
|
||||
/* 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.
|
||||
Contributed by Masahide Washizawa <washi@yamato.ibm.co.jp>, 2000.
|
||||
|
||||
@ -32,42 +32,77 @@
|
||||
#define CHARSET_NAME "IBM930//"
|
||||
#define FROM_LOOP from_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. */
|
||||
#define DEFINE_INIT 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. */
|
||||
enum
|
||||
{
|
||||
init = 0,
|
||||
sb,
|
||||
db
|
||||
sb = 0,
|
||||
db = 64
|
||||
};
|
||||
|
||||
|
||||
/* First, define the conversion function from IBM-930 to UCS4. */
|
||||
#define MIN_NEEDED_INPUT MIN_NEEDED_FROM
|
||||
#define MAX_NEEDED_INPUT MAX_NEEDED_FROM
|
||||
#define MIN_NEEDED_OUTPUT MIN_NEEDED_TO
|
||||
#define INIT_PARAMS int curcs = init;
|
||||
#define LOOPFCT FROM_LOOP
|
||||
#define BODY \
|
||||
{ \
|
||||
uint32_t ch = *inptr; \
|
||||
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 (inptr + 1 >= inend, 0)) \
|
||||
{ \
|
||||
result = __GCONV_INCOMPLETE_INPUT; \
|
||||
break; \
|
||||
} \
|
||||
\
|
||||
/* Shift OUT, change to DBCS converter. */ \
|
||||
if (curcs == db) \
|
||||
{ \
|
||||
@ -76,16 +111,10 @@ enum
|
||||
} \
|
||||
curcs = db; \
|
||||
++inptr; \
|
||||
ch = *inptr; \
|
||||
continue; \
|
||||
} \
|
||||
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 */ \
|
||||
if (curcs == sb) \
|
||||
{ \
|
||||
@ -94,19 +123,14 @@ enum
|
||||
} \
|
||||
curcs = sb; \
|
||||
++inptr; \
|
||||
ch = *inptr; \
|
||||
continue; \
|
||||
} \
|
||||
\
|
||||
if (curcs == sb || curcs == init) \
|
||||
if (curcs == sb) \
|
||||
{ \
|
||||
/* Use the IBM930 table for single byte. */ \
|
||||
while (ch > rp1->end) \
|
||||
++rp1; \
|
||||
\
|
||||
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')) \
|
||||
res = __ibm930sb_to_ucs4[ch]; \
|
||||
if (__builtin_expect (res, L'\1') == L'\0' && ch != '\0') \
|
||||
{ \
|
||||
/* This is an illegal character. */ \
|
||||
if (! ignore_errors_p ()) \
|
||||
@ -115,21 +139,21 @@ enum
|
||||
break; \
|
||||
} \
|
||||
++*irreversible; \
|
||||
++inptr; \
|
||||
continue; \
|
||||
} \
|
||||
else \
|
||||
{ \
|
||||
if (res == 0xa5) \
|
||||
res = 0x5c; \
|
||||
put32 (outptr, res); \
|
||||
outptr += 4; \
|
||||
} \
|
||||
++inptr; \
|
||||
} \
|
||||
} \
|
||||
else if (curcs == db) \
|
||||
else \
|
||||
{ \
|
||||
/* 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)) \
|
||||
{ \
|
||||
/* The second character is not available. Store the \
|
||||
@ -142,8 +166,7 @@ enum
|
||||
while (ch > rp2->end) \
|
||||
++rp2; \
|
||||
\
|
||||
if (__builtin_expect (rp2 == NULL, 0) \
|
||||
|| __builtin_expect (ch < rp2->start, 0) \
|
||||
if (__builtin_expect (ch < rp2->start, 0) \
|
||||
|| (res = __ibm930db_to_ucs4[ch + rp2->idx], \
|
||||
__builtin_expect (res, L'\1') == L'\0' && ch != '\0')) \
|
||||
{ \
|
||||
@ -154,24 +177,25 @@ enum
|
||||
break; \
|
||||
} \
|
||||
++*irreversible; \
|
||||
inptr += 2; \
|
||||
continue; \
|
||||
} \
|
||||
else \
|
||||
{ \
|
||||
put32 (outptr, res); \
|
||||
outptr += 4; \
|
||||
inptr += 2; \
|
||||
} \
|
||||
inptr += 2; \
|
||||
} \
|
||||
}
|
||||
#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>
|
||||
|
||||
/* Next, define the other direction. */
|
||||
#define MIN_NEEDED_INPUT MIN_NEEDED_TO
|
||||
#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 BODY \
|
||||
{ \
|
||||
@ -182,16 +206,21 @@ enum
|
||||
\
|
||||
if (__builtin_expect (ch, 0) >= 0xffff) \
|
||||
{ \
|
||||
rp1 = NULL; \
|
||||
rp2 = NULL; \
|
||||
if (! ignore_errors_p ()) \
|
||||
{ \
|
||||
result = __GCONV_ILLEGAL_INPUT; \
|
||||
break; \
|
||||
} \
|
||||
else \
|
||||
++*irreversible; \
|
||||
inptr += 4; \
|
||||
continue; \
|
||||
} \
|
||||
\
|
||||
while (ch > rp1->end) \
|
||||
++rp1; \
|
||||
\
|
||||
/* Use the UCS4 table for single byte. */ \
|
||||
if (__builtin_expect (rp1 == NULL, 0) \
|
||||
|| __builtin_expect (ch < rp1->start, 0) \
|
||||
if (__builtin_expect (ch < rp1->start, 0) \
|
||||
|| (cp = __ucs4_to_ibm930sb[ch + rp1->idx], \
|
||||
__builtin_expect (cp[0], L'\1') == L'\0' && ch != '\0')) \
|
||||
{ \
|
||||
@ -199,8 +228,7 @@ enum
|
||||
while (ch > rp2->end) \
|
||||
++rp2; \
|
||||
\
|
||||
if (__builtin_expect (rp2 == NULL, 0) \
|
||||
|| __builtin_expect (ch < rp2->start, 0) \
|
||||
if (__builtin_expect (ch < rp2->start, 0) \
|
||||
|| (cp = __ucs4_to_ibm930db[ch + rp2->idx], \
|
||||
__builtin_expect (cp[0], L'\1')==L'\0' && ch != '\0')) \
|
||||
{ \
|
||||
@ -214,7 +242,7 @@ enum
|
||||
} \
|
||||
else \
|
||||
{ \
|
||||
if (curcs == init || curcs == sb) \
|
||||
if (curcs == sb) \
|
||||
{ \
|
||||
if (__builtin_expect (outptr+1 > outend, 0)) \
|
||||
{ \
|
||||
@ -264,6 +292,9 @@ enum
|
||||
inptr += 4; \
|
||||
}
|
||||
#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>
|
||||
|
||||
/* Now define the toplevel functions. */
|
||||
|
@ -1,5 +1,5 @@
|
||||
/* 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.
|
||||
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 },
|
||||
{ start: 0x0058, end: 0x0058, idx: -1 },
|
||||
{ start: 0x005a, end: 0x0069, idx: -2 },
|
||||
{ start: 0x006b, end: 0x009b, idx: -3 },
|
||||
{ start: 0x009d, end: 0x00c9, idx: -4 },
|
||||
{ start: 0x00d0, end: 0x00d9, idx: -10 },
|
||||
{ start: 0x00e0, end: 0x00e0, idx: -16 },
|
||||
{ start: 0x00e2, end: 0x00e9, idx: -17 },
|
||||
{ start: 0x00f0, end: 0x00f9, idx: -23 },
|
||||
{ start: 0x00ff, end: 0x00ff, idx: -28 },
|
||||
{ start: 0xffff, end: 0xffff, idx: 0 }
|
||||
};
|
||||
|
||||
static const uint16_t __ibm930sb_to_ucs4[] =
|
||||
{
|
||||
0x0000, 0x0001, 0x0002, 0x0003, 0x009C, 0x0009, 0x0086, 0x007F, 0x0097,
|
||||
0x008D, 0x008E, 0x000B, 0x000C, 0x000D, 0x000E, 0x000F, 0x0010, 0x0011,
|
||||
0x0012, 0x0013, 0x009D, 0x0085, 0x0008, 0x0087, 0x0018, 0x0019, 0x0092,
|
||||
0x008F, 0x001C, 0x001D, 0x001E, 0x001F, 0x0080, 0x0081, 0x0082, 0x0083,
|
||||
0x0084, 0x000A, 0x0017, 0x001B, 0x0088, 0x0089, 0x008A, 0x008B, 0x008C,
|
||||
0x0005, 0x0006, 0x0007, 0x0090, 0x0091, 0x0016, 0x0093, 0x0094, 0x0095,
|
||||
0x0096, 0x0004, 0x0098, 0x0099, 0x009A, 0x009B, 0x0014, 0x0015, 0x009E,
|
||||
0x001A, 0x0020, 0xFF61, 0xFF62, 0xFF63, 0xFF64, 0xFF65, 0xFF66, 0xFF67,
|
||||
0xFF68, 0xFF69, 0x00A3, 0x002E, 0x003C, 0x0028, 0x002B, 0x007C, 0x0026,
|
||||
0xFF6A, 0xFF6B, 0xFF6C, 0xFF6D, 0xFF6E, 0xFF6F, 0xFF70, 0x0021, 0x00A5,
|
||||
0x002A, 0x0029, 0x003B, 0x00AC, 0x002D, 0x002F, 0x0061, 0x0062, 0x0063,
|
||||
0x0064, 0x0065, 0x0066, 0x0067, 0x0068, 0x002C, 0x0025, 0x005F, 0x003E,
|
||||
0x003F, 0x005B, 0x0069, 0x006A, 0x006B, 0x006C, 0x006D, 0x006E, 0x006F,
|
||||
0x0070, 0x0060, 0x003A, 0x0023, 0x0040, 0x0027, 0x003D, 0x0022, 0x005D,
|
||||
0xFF71, 0xFF72, 0xFF73, 0xFF74, 0xFF75, 0xFF76, 0xFF77, 0xFF78, 0xFF79,
|
||||
0xFF7A, 0x0071, 0xFF7B, 0xFF7C, 0xFF7D, 0xFF7E, 0xFF7F, 0xFF80, 0xFF81,
|
||||
0xFF82, 0xFF83, 0xFF84, 0xFF85, 0xFF86, 0xFF87, 0xFF88, 0xFF89, 0x0072,
|
||||
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
|
||||
/* 0x00 */ 0x0000, 0x0001, 0x0002, 0x0003, 0x009C, 0x0009, 0x0086, 0x007F,
|
||||
/* 0x08 */ 0x0097, 0x008D, 0x008E, 0x000B, 0x000C, 0x000D, 0x000E, 0x000F,
|
||||
/* 0x10 */ 0x0010, 0x0011, 0x0012, 0x0013, 0x009D, 0x0085, 0x0008, 0x0087,
|
||||
/* 0x18 */ 0x0018, 0x0019, 0x0092, 0x008F, 0x001C, 0x001D, 0x001E, 0x001F,
|
||||
/* 0x20 */ 0x0080, 0x0081, 0x0082, 0x0083, 0x0084, 0x000A, 0x0017, 0x001B,
|
||||
/* 0x28 */ 0x0088, 0x0089, 0x008A, 0x008B, 0x008C, 0x0005, 0x0006, 0x0007,
|
||||
/* 0x30 */ 0x0090, 0x0091, 0x0016, 0x0093, 0x0094, 0x0095, 0x0096, 0x0004,
|
||||
/* 0x38 */ 0x0098, 0x0099, 0x009A, 0x009B, 0x0014, 0x0015, 0x009E, 0x001A,
|
||||
/* 0x40 */ 0x0020, 0xFF61, 0xFF62, 0xFF63, 0xFF64, 0xFF65, 0xFF66, 0xFF67,
|
||||
/* 0x48 */ 0xFF68, 0xFF69, 0x00A3, 0x002E, 0x003C, 0x0028, 0x002B, 0x007C,
|
||||
/* 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,
|
||||
/* 0x68 */ 0x0067, 0x0068, 0x0000, 0x002C, 0x0025, 0x005F, 0x003E, 0x003F,
|
||||
/* 0x70 */ 0x005B, 0x0069, 0x006A, 0x006B, 0x006C, 0x006D, 0x006E, 0x006F,
|
||||
/* 0x78 */ 0x0070, 0x0060, 0x003A, 0x0023, 0x0040, 0x0027, 0x003D, 0x0022,
|
||||
/* 0x80 */ 0x005D, 0xFF71, 0xFF72, 0xFF73, 0xFF74, 0xFF75, 0xFF76, 0xFF77,
|
||||
/* 0x88 */ 0xFF78, 0xFF79, 0xFF7A, 0x0071, 0xFF7B, 0xFF7C, 0xFF7D, 0xFF7E,
|
||||
/* 0x90 */ 0xFF7F, 0xFF80, 0xFF81, 0xFF82, 0xFF83, 0xFF84, 0xFF85, 0xFF86,
|
||||
/* 0x98 */ 0xFF87, 0xFF88, 0xFF89, 0x0072, 0x0000, 0xFF8A, 0xFF8B, 0xFF8C,
|
||||
/* 0xa0 */ 0x007E, 0x203E, 0xFF8D, 0xFF8E, 0xFF8F, 0xFF90, 0xFF91, 0xFF92,
|
||||
/* 0xa8 */ 0xFF93, 0xFF94, 0xFF95, 0x0073, 0xFF96, 0xFF97, 0xFF98, 0xFF99,
|
||||
/* 0xb0 */ 0x005E, 0x00A2, 0x005C, 0x0074, 0x0075, 0x0076, 0x0077, 0x0078,
|
||||
/* 0xb8 */ 0x0079, 0x007A, 0xFF9A, 0xFF9B, 0xFF9C, 0xFF9D, 0xFF9E, 0xFF9F,
|
||||
/* 0xc0 */ 0x007B, 0x0041, 0x0042, 0x0043, 0x0044, 0x0045, 0x0046, 0x0047,
|
||||
/* 0xc8 */ 0x0048, 0x0049, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
|
||||
/* 0xd0 */ 0x007D, 0x004A, 0x004B, 0x004C, 0x004D, 0x004E, 0x004F, 0x0050,
|
||||
/* 0xd8 */ 0x0051, 0x0052, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
|
||||
/* 0xe0 */ 0x0024, 0x0000, 0x0053, 0x0054, 0x0055, 0x0056, 0x0057, 0x0058,
|
||||
/* 0xe8 */ 0x0059, 0x005A, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
|
||||
/* 0xf0 */ 0x0030, 0x0031, 0x0032, 0x0033, 0x0034, 0x0035, 0x0036, 0x0037,
|
||||
/* 0xf8 */ 0x0038, 0x0039, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x009F
|
||||
};
|
||||
|
||||
static const struct gap __ibm930db_to_ucs4_idx[] =
|
||||
|
@ -1,5 +1,5 @@
|
||||
/* 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.
|
||||
Contributed by Masahide Washizawa <washi@yamato.ibm.co.jp>, 2000.
|
||||
|
||||
@ -32,42 +32,76 @@
|
||||
#define CHARSET_NAME "IBM933//"
|
||||
#define FROM_LOOP from_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. */
|
||||
#define DEFINE_INIT 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. */
|
||||
enum
|
||||
{
|
||||
init = 0,
|
||||
sb,
|
||||
db
|
||||
sb = 0,
|
||||
db = 64
|
||||
};
|
||||
|
||||
/* First, define the conversion function from IBM-933 to UCS4. */
|
||||
#define MIN_NEEDED_INPUT MIN_NEEDED_FROM
|
||||
#define MAX_NEEDED_INPUT MAX_NEEDED_FROM
|
||||
#define MIN_NEEDED_OUTPUT MIN_NEEDED_TO
|
||||
#define INIT_PARAMS int curcs = init;
|
||||
#define LOOPFCT FROM_LOOP
|
||||
#define BODY \
|
||||
{ \
|
||||
uint32_t ch = *inptr; \
|
||||
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 (inptr + 1 >= inend, 0)) \
|
||||
{ \
|
||||
result = __GCONV_INCOMPLETE_INPUT; \
|
||||
break; \
|
||||
} \
|
||||
\
|
||||
/* Shift OUT, change to DBCS converter. */ \
|
||||
if (curcs == db) \
|
||||
{ \
|
||||
@ -76,16 +110,10 @@ enum
|
||||
} \
|
||||
curcs = db; \
|
||||
++inptr; \
|
||||
ch = *inptr; \
|
||||
continue; \
|
||||
} \
|
||||
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. */ \
|
||||
if (curcs == sb) \
|
||||
{ \
|
||||
@ -94,19 +122,14 @@ enum
|
||||
} \
|
||||
curcs = sb; \
|
||||
++inptr; \
|
||||
ch = *inptr; \
|
||||
continue; \
|
||||
} \
|
||||
\
|
||||
if (curcs == sb || curcs == init) \
|
||||
if (curcs == sb) \
|
||||
{ \
|
||||
/* Use the IBM933 table for single byte. */ \
|
||||
while (ch > rp1->end) \
|
||||
++rp1; \
|
||||
\
|
||||
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')) \
|
||||
res = __ibm933sb_to_ucs4[ch]; \
|
||||
if (__builtin_expect (res, L'\1') == L'\0' && ch != '\0') \
|
||||
{ \
|
||||
/* This is an illegal character. */ \
|
||||
if (! ignore_errors_p ()) \
|
||||
@ -115,18 +138,20 @@ enum
|
||||
break; \
|
||||
} \
|
||||
++*irreversible; \
|
||||
++inptr; \
|
||||
continue; \
|
||||
} \
|
||||
else \
|
||||
{ \
|
||||
put32 (outptr, res); \
|
||||
outptr += 4; \
|
||||
} \
|
||||
++inptr; \
|
||||
} \
|
||||
} \
|
||||
else if (curcs == db) \
|
||||
else \
|
||||
{ \
|
||||
const struct gap *rp2 = __ibm933db_to_ucs4_idx; \
|
||||
\
|
||||
assert (curcs == db); \
|
||||
\
|
||||
/* Use the IBM933 table for double byte. */ \
|
||||
if (__builtin_expect (inptr + 1 >= inend, 0)) \
|
||||
{ \
|
||||
@ -164,12 +189,15 @@ enum
|
||||
} \
|
||||
}
|
||||
#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>
|
||||
|
||||
/* Next, define the other direction. */
|
||||
#define MIN_NEEDED_INPUT MIN_NEEDED_TO
|
||||
#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 BODY \
|
||||
{ \
|
||||
@ -180,16 +208,21 @@ enum
|
||||
\
|
||||
if (__builtin_expect (ch, 0) >= 0xffff) \
|
||||
{ \
|
||||
rp1 = NULL; \
|
||||
rp2 = NULL; \
|
||||
if (! ignore_errors_p ()) \
|
||||
{ \
|
||||
result = __GCONV_ILLEGAL_INPUT; \
|
||||
break; \
|
||||
} \
|
||||
else \
|
||||
++*irreversible; \
|
||||
inptr += 4; \
|
||||
continue; \
|
||||
} \
|
||||
\
|
||||
while (ch > rp1->end) \
|
||||
++rp1; \
|
||||
\
|
||||
/* Use the UCS4 table for single byte. */ \
|
||||
if (__builtin_expect (rp1 == NULL, 0) \
|
||||
|| __builtin_expect (ch < rp1->start, 0) \
|
||||
if (__builtin_expect (ch < rp1->start, 0) \
|
||||
|| (cp = __ucs4_to_ibm933sb[ch + rp1->idx], \
|
||||
__builtin_expect (cp[0], L'\1') == L'\0' && ch != '\0')) \
|
||||
{ \
|
||||
@ -197,8 +230,7 @@ enum
|
||||
while (ch > rp2->end) \
|
||||
++rp2; \
|
||||
\
|
||||
if (__builtin_expect (rp2 == NULL, 0) \
|
||||
|| __builtin_expect (ch < rp2->start, 0) \
|
||||
if (__builtin_expect (ch < rp2->start, 0) \
|
||||
|| (cp = __ucs4_to_ibm933db[ch + rp2->idx], \
|
||||
__builtin_expect (cp[0], L'\1')==L'\0' && ch != '\0')) \
|
||||
{ \
|
||||
@ -212,7 +244,7 @@ enum
|
||||
} \
|
||||
else \
|
||||
{ \
|
||||
if (curcs == init || curcs == sb) \
|
||||
if (curcs == sb) \
|
||||
{ \
|
||||
if (__builtin_expect (outptr+1 > outend, 0)) \
|
||||
{ \
|
||||
@ -257,6 +289,9 @@ enum
|
||||
inptr += 4; \
|
||||
}
|
||||
#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>
|
||||
|
||||
/* Now define the toplevel functions. */
|
||||
|
@ -1,5 +1,5 @@
|
||||
/* 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.
|
||||
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 },
|
||||
{ start: 0x0042, end: 0x0050, idx: -1 },
|
||||
{ start: 0x0052, end: 0x0070, idx: -2 },
|
||||
{ start: 0x0072, end: 0x008f, idx: -3 },
|
||||
{ start: 0x0091, end: 0x00b0, idx: -4 },
|
||||
{ start: 0x00b2, end: 0x00b2, idx: -5 },
|
||||
{ start: 0x00ba, end: 0x00bc, idx: -12 },
|
||||
{ start: 0x00c0, end: 0x00c9, idx: -15 },
|
||||
{ start: 0x00d0, end: 0x00d9, idx: -21 },
|
||||
{ start: 0x00e0, end: 0x00e0, idx: -27 },
|
||||
{ start: 0x00e2, end: 0x00e9, idx: -28 },
|
||||
{ start: 0x00f0, end: 0x00f9, idx: -34 },
|
||||
{ start: 0x00ff, end: 0x00ff, idx: -39 },
|
||||
{ start: 0xffff, end: 0xffff, idx: 0 }
|
||||
};
|
||||
|
||||
static const uint16_t __ibm933sb_to_ucs4[] =
|
||||
{
|
||||
0x0000, 0x0001, 0x0002, 0x0003, 0x009C, 0x0009, 0x0086, 0x007F, 0x0097,
|
||||
0x008D, 0x008E, 0x000B, 0x000C, 0x000D, 0x000E, 0x000F, 0x0010, 0x0011,
|
||||
0x0012, 0x0013, 0x009D, 0x0085, 0x0008, 0x0087, 0x0018, 0x0019, 0x0092,
|
||||
0x008F, 0x001C, 0x001D, 0x001E, 0x001F, 0x0080, 0x0081, 0x0082, 0x0083,
|
||||
0x0084, 0x000A, 0x0017, 0x001B, 0x0088, 0x0089, 0x008A, 0x008B, 0x008C,
|
||||
0x0005, 0x0006, 0x0007, 0x0090, 0x0091, 0x0016, 0x0093, 0x0094, 0x0095,
|
||||
0x0096, 0x0004, 0x0098, 0x0099, 0x009A, 0x009B, 0x0014, 0x0015, 0x009E,
|
||||
0x001A, 0x0020, 0xFFA0, 0xFFA1, 0xFFA2, 0xFFA3, 0xFFA4, 0xFFA5, 0xFFA6,
|
||||
0xFFA7, 0x00A2, 0x002E, 0x003C, 0x0028, 0x002B, 0x007C, 0x0026, 0xFFA8,
|
||||
0xFFA9, 0xFFAA, 0xFFAB, 0xFFAC, 0xFFAD, 0xFFAE, 0xFFAF, 0x0021, 0x0024,
|
||||
0x002A, 0x0029, 0x003B, 0x00AC, 0x002D, 0x002F, 0xFFB0, 0xFFB1, 0xFFB2,
|
||||
0xFFB3, 0xFFB4, 0xFFB5, 0xFFB6, 0xFFB7, 0x00A6, 0x002C, 0x0025, 0x005F,
|
||||
0x003E, 0x003F, 0x005B, 0xFFB8, 0xFFB9, 0xFFBA, 0xFFBB, 0xFFBC, 0xFFBD,
|
||||
0xFFBE, 0x0060, 0x003A, 0x0023, 0x0040, 0x0027, 0x003D, 0x0022, 0x005D,
|
||||
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
|
||||
/* 0x00 */ 0x0000, 0x0001, 0x0002, 0x0003, 0x009C, 0x0009, 0x0086, 0x007F,
|
||||
/* 0x08 */ 0x0097, 0x008D, 0x008E, 0x000B, 0x000C, 0x000D, 0x000E, 0x000F,
|
||||
/* 0x10 */ 0x0010, 0x0011, 0x0012, 0x0013, 0x009D, 0x0085, 0x0008, 0x0087,
|
||||
/* 0x18 */ 0x0018, 0x0019, 0x0092, 0x008F, 0x001C, 0x001D, 0x001E, 0x001F,
|
||||
/* 0x20 */ 0x0080, 0x0081, 0x0082, 0x0083, 0x0084, 0x000A, 0x0017, 0x001B,
|
||||
/* 0x28 */ 0x0088, 0x0089, 0x008A, 0x008B, 0x008C, 0x0005, 0x0006, 0x0007,
|
||||
/* 0x30 */ 0x0090, 0x0091, 0x0016, 0x0093, 0x0094, 0x0095, 0x0096, 0x0004,
|
||||
/* 0x38 */ 0x0098, 0x0099, 0x009A, 0x009B, 0x0014, 0x0015, 0x009E, 0x001A,
|
||||
/* 0x40 */ 0x0020, 0x0000, 0xFFA0, 0xFFA1, 0xFFA2, 0xFFA3, 0xFFA4, 0xFFA5,
|
||||
/* 0x48 */ 0xFFA6, 0xFFA7, 0x00A2, 0x002E, 0x003C, 0x0028, 0x002B, 0x007C,
|
||||
/* 0x50 */ 0x0026, 0x0000, 0xFFA8, 0xFFA9, 0xFFAA, 0xFFAB, 0xFFAC, 0xFFAD,
|
||||
/* 0x58 */ 0xFFAE, 0xFFAF, 0x0021, 0x0024, 0x002A, 0x0029, 0x003B, 0x00AC,
|
||||
/* 0x60 */ 0x002D, 0x002F, 0xFFB0, 0xFFB1, 0xFFB2, 0xFFB3, 0xFFB4, 0xFFB5,
|
||||
/* 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,
|
||||
/* 0x80 */ 0x005D, 0x0061, 0x0062, 0x0063, 0x0064, 0x0065, 0x0066, 0x0067,
|
||||
/* 0x88 */ 0x0068, 0x0069, 0xFFC2, 0xFFC3, 0xFFC4, 0xFFC5, 0xFFC6, 0xFFC7,
|
||||
/* 0x90 */ 0x0000, 0x006A, 0x006B, 0x006C, 0x006D, 0x006E, 0x006F, 0x0070,
|
||||
/* 0x98 */ 0x0071, 0x0072, 0xFFCA, 0xFFCB, 0xFFCC, 0xFFCD, 0xFFCE, 0xFFCF,
|
||||
/* 0xa0 */ 0x203E, 0x007E, 0x0073, 0x0074, 0x0075, 0x0076, 0x0077, 0x0078,
|
||||
/* 0xa8 */ 0x0079, 0x007A, 0xFFD2, 0xFFD3, 0xFFD4, 0xFFD5, 0xFFD6, 0xFFD7,
|
||||
/* 0xb0 */ 0x005E, 0x0000, 0x005C, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
|
||||
/* 0xb8 */ 0x0000, 0x0000, 0xFFDA, 0xFFDB, 0xFFDC, 0x0000, 0x0000, 0x0000,
|
||||
/* 0xc0 */ 0x007B, 0x0041, 0x0042, 0x0043, 0x0044, 0x0045, 0x0046, 0x0047,
|
||||
/* 0xc8 */ 0x0048, 0x0049, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
|
||||
/* 0xd0 */ 0x007D, 0x004A, 0x004B, 0x004C, 0x004D, 0x004E, 0x004F, 0x0050,
|
||||
/* 0xd8 */ 0x0051, 0x0052, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
|
||||
/* 0xe0 */ 0x20A9, 0x0000, 0x0053, 0x0054, 0x0055, 0x0056, 0x0057, 0x0058,
|
||||
/* 0xe8 */ 0x0059, 0x005A, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
|
||||
/* 0xf0 */ 0x0030, 0x0031, 0x0032, 0x0033, 0x0034, 0x0035, 0x0036, 0x0037,
|
||||
/* 0xf8 */ 0x0038, 0x0039, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x009F
|
||||
};
|
||||
|
||||
static const struct gap __ibm933db_to_ucs4_idx[] =
|
||||
|
@ -1,5 +1,5 @@
|
||||
/* 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.
|
||||
Contributed by Masahide Washizawa <washi@yamato.ibm.co.jp>, 2000.
|
||||
|
||||
@ -32,42 +32,76 @@
|
||||
#define CHARSET_NAME "IBM935//"
|
||||
#define FROM_LOOP from_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. */
|
||||
#define DEFINE_INIT 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. */
|
||||
enum
|
||||
{
|
||||
init = 0,
|
||||
sb,
|
||||
db
|
||||
sb = 0,
|
||||
db = 64
|
||||
};
|
||||
|
||||
/* First, define the conversion function from IBM-935 to UCS4. */
|
||||
#define MIN_NEEDED_INPUT MIN_NEEDED_FROM
|
||||
#define MAX_NEEDED_INPUT MAX_NEEDED_FROM
|
||||
#define MIN_NEEDED_OUTPUT MIN_NEEDED_TO
|
||||
#define INIT_PARAMS int curcs = init;
|
||||
#define LOOPFCT FROM_LOOP
|
||||
#define BODY \
|
||||
{ \
|
||||
uint32_t ch = *inptr; \
|
||||
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 (inptr + 1 >= inend, 0)) \
|
||||
{ \
|
||||
result = __GCONV_INCOMPLETE_INPUT; \
|
||||
break; \
|
||||
} \
|
||||
\
|
||||
/* Shift OUT, change to DBCS converter. */ \
|
||||
if (curcs == db) \
|
||||
{ \
|
||||
@ -76,16 +110,10 @@ enum
|
||||
} \
|
||||
curcs = db; \
|
||||
++inptr; \
|
||||
ch = *inptr; \
|
||||
continue; \
|
||||
} \
|
||||
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. */ \
|
||||
if (curcs == sb) \
|
||||
{ \
|
||||
@ -94,19 +122,14 @@ enum
|
||||
} \
|
||||
curcs = sb; \
|
||||
++inptr; \
|
||||
ch = *inptr; \
|
||||
continue; \
|
||||
} \
|
||||
\
|
||||
if (curcs == sb || curcs == init) \
|
||||
if (curcs == sb) \
|
||||
{ \
|
||||
/* Use the IBM935 table for single byte. */ \
|
||||
while (ch > rp1->end) \
|
||||
++rp1; \
|
||||
\
|
||||
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')) \
|
||||
res = __ibm935sb_to_ucs4[ch]; \
|
||||
if (__builtin_expect (res, L'\1') == L'\0' && ch != '\0') \
|
||||
{ \
|
||||
/* This is an illegal character. */ \
|
||||
if (! ignore_errors_p ()) \
|
||||
@ -115,18 +138,20 @@ enum
|
||||
break; \
|
||||
} \
|
||||
++*irreversible; \
|
||||
++inptr; \
|
||||
continue; \
|
||||
} \
|
||||
else \
|
||||
{ \
|
||||
put32 (outptr, res); \
|
||||
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. */ \
|
||||
if (__builtin_expect (inptr + 1 >= inend, 0)) \
|
||||
{ \
|
||||
@ -152,24 +177,25 @@ enum
|
||||
break; \
|
||||
} \
|
||||
++*irreversible; \
|
||||
inptr += 2; \
|
||||
continue; \
|
||||
} \
|
||||
else \
|
||||
{ \
|
||||
put32 (outptr, res); \
|
||||
outptr += 4; \
|
||||
inptr += 2; \
|
||||
} \
|
||||
inptr += 2; \
|
||||
} \
|
||||
}
|
||||
#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>
|
||||
|
||||
/* Next, define the other direction. */
|
||||
#define MIN_NEEDED_INPUT MIN_NEEDED_TO
|
||||
#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 BODY \
|
||||
{ \
|
||||
@ -180,16 +206,21 @@ enum
|
||||
\
|
||||
if (__builtin_expect (ch, 0) >= 0xffff) \
|
||||
{ \
|
||||
rp1 = NULL; \
|
||||
rp2 = NULL; \
|
||||
if (! ignore_errors_p ()) \
|
||||
{ \
|
||||
result = __GCONV_ILLEGAL_INPUT; \
|
||||
break; \
|
||||
} \
|
||||
else \
|
||||
++*irreversible; \
|
||||
inptr += 4; \
|
||||
continue; \
|
||||
} \
|
||||
\
|
||||
while (ch > rp1->end) \
|
||||
++rp1; \
|
||||
\
|
||||
/* Use the UCS4 table for single byte. */ \
|
||||
if (__builtin_expect (rp1 == NULL, 0) \
|
||||
|| __builtin_expect (ch < rp1->start, 0) \
|
||||
if (__builtin_expect (ch < rp1->start, 0) \
|
||||
|| (cp = __ucs4_to_ibm935sb[ch + rp1->idx], \
|
||||
__builtin_expect (cp[0], L'\1') == L'\0' && ch != '\0')) \
|
||||
{ \
|
||||
@ -197,8 +228,7 @@ enum
|
||||
while (ch > rp2->end) \
|
||||
++rp2; \
|
||||
\
|
||||
if (__builtin_expect (rp2 == NULL, 0) \
|
||||
|| __builtin_expect (ch < rp2->start, 0) \
|
||||
if (__builtin_expect (ch < rp2->start, 0) \
|
||||
|| (cp = __ucs4_to_ibm935db[ch + rp2->idx], \
|
||||
__builtin_expect (cp[0], L'\1')==L'\0' && ch != '\0')) \
|
||||
{ \
|
||||
@ -212,7 +242,7 @@ enum
|
||||
} \
|
||||
else \
|
||||
{ \
|
||||
if (curcs == init || curcs == sb) \
|
||||
if (curcs == sb) \
|
||||
{ \
|
||||
if (__builtin_expect (outptr+1 > outend, 0)) \
|
||||
{ \
|
||||
@ -257,6 +287,9 @@ enum
|
||||
inptr += 4; \
|
||||
}
|
||||
#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>
|
||||
|
||||
/* Now define the toplevel functions. */
|
||||
|
@ -1,5 +1,5 @@
|
||||
/* 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.
|
||||
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 },
|
||||
{ start: 0x004a, end: 0x0050, idx: -9 },
|
||||
{ start: 0x005a, end: 0x0061, idx: -18 },
|
||||
{ start: 0x006a, end: 0x006f, idx: -26 },
|
||||
{ start: 0x0079, end: 0x007f, idx: -35 },
|
||||
{ start: 0x0081, end: 0x0089, idx: -36 },
|
||||
{ start: 0x0091, end: 0x0099, idx: -43 },
|
||||
{ start: 0x00a0, end: 0x00a9, idx: -49 },
|
||||
{ start: 0x00b0, end: 0x00b0, idx: -55 },
|
||||
{ start: 0x00b2, end: 0x00b2, idx: -56 },
|
||||
{ start: 0x00ba, end: 0x00bb, idx: -63 },
|
||||
{ start: 0x00c0, end: 0x00c9, idx: -67 },
|
||||
{ start: 0x00d0, end: 0x00d9, idx: -73 },
|
||||
{ start: 0x00e0, end: 0x00e0, idx: -79 },
|
||||
{ start: 0x00e2, end: 0x00e9, idx: -80 },
|
||||
{ start: 0x00f0, end: 0x00f9, idx: -86 },
|
||||
{ start: 0x00ff, end: 0x00ff, idx: -91 },
|
||||
{ start: 0xffff, end: 0xffff, idx: 0 }
|
||||
};
|
||||
|
||||
static const uint16_t __ibm935sb_to_ucs4[] =
|
||||
{
|
||||
0x0000, 0x0001, 0x0002, 0x0003, 0x009C, 0x0009, 0x0086, 0x007F, 0x0097,
|
||||
0x008D, 0x008E, 0x000B, 0x000C, 0x000D, 0x000E, 0x000F, 0x0010, 0x0011,
|
||||
0x0012, 0x0013, 0x009D, 0x0085, 0x0008, 0x0087, 0x0018, 0x0019, 0x0092,
|
||||
0x008F, 0x001C, 0x001D, 0x001E, 0x001F, 0x0080, 0x0081, 0x0082, 0x0083,
|
||||
0x0084, 0x000A, 0x0017, 0x001B, 0x0088, 0x0089, 0x008A, 0x008B, 0x008C,
|
||||
0x0005, 0x0006, 0x0007, 0x0090, 0x0091, 0x0016, 0x0093, 0x0094, 0x0095,
|
||||
0x0096, 0x0004, 0x0098, 0x0099, 0x009A, 0x009B, 0x0014, 0x0015, 0x009E,
|
||||
0x001A, 0x0020, 0x00A3, 0x002E, 0x003C, 0x0028, 0x002B, 0x007C, 0x0026,
|
||||
0x0021, 0x00A5, 0x002A, 0x0029, 0x003B, 0x00AC, 0x002D, 0x002F, 0x00A6,
|
||||
0x002C, 0x0025, 0x005F, 0x003E, 0x003F, 0x0060, 0x003A, 0x0023, 0x0040,
|
||||
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
|
||||
/* 0x00 */ 0x0000, 0x0001, 0x0002, 0x0003, 0x009C, 0x0009, 0x0086, 0x007F,
|
||||
/* 0x08 */ 0x0097, 0x008D, 0x008E, 0x000B, 0x000C, 0x000D, 0x000E, 0x000F,
|
||||
/* 0x10 */ 0x0010, 0x0011, 0x0012, 0x0013, 0x009D, 0x0085, 0x0008, 0x0087,
|
||||
/* 0x18 */ 0x0018, 0x0019, 0x0092, 0x008F, 0x001C, 0x001D, 0x001E, 0x001F,
|
||||
/* 0x20 */ 0x0080, 0x0081, 0x0082, 0x0083, 0x0084, 0x000A, 0x0017, 0x001B,
|
||||
/* 0x28 */ 0x0088, 0x0089, 0x008A, 0x008B, 0x008C, 0x0005, 0x0006, 0x0007,
|
||||
/* 0x30 */ 0x0090, 0x0091, 0x0016, 0x0093, 0x0094, 0x0095, 0x0096, 0x0004,
|
||||
/* 0x38 */ 0x0098, 0x0099, 0x009A, 0x009B, 0x0014, 0x0015, 0x009E, 0x001A,
|
||||
/* 0x40 */ 0x0020, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
|
||||
/* 0x48 */ 0x0000, 0x0000, 0x00A3, 0x002E, 0x003C, 0x0028, 0x002B, 0x007C,
|
||||
/* 0x50 */ 0x0026, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
|
||||
/* 0x58 */ 0x0000, 0x0000, 0x0021, 0x00A5, 0x002A, 0x0029, 0x003B, 0x00AC,
|
||||
/* 0x60 */ 0x002D, 0x002F, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
|
||||
/* 0x68 */ 0x0000, 0x0000, 0x00A6, 0x002C, 0x0025, 0x005F, 0x003E, 0x003F,
|
||||
/* 0x70 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
|
||||
/* 0x78 */ 0x0000, 0x0060, 0x003A, 0x0023, 0x0040, 0x0027, 0x003D, 0x0022,
|
||||
/* 0x80 */ 0x0000, 0x0061, 0x0062, 0x0063, 0x0064, 0x0065, 0x0066, 0x0067,
|
||||
/* 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,
|
||||
/* 0xa0 */ 0x007E, 0x203E, 0x0073, 0x0074, 0x0075, 0x0076, 0x0077, 0x0078,
|
||||
/* 0xa8 */ 0x0079, 0x007A, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
|
||||
/* 0xb0 */ 0x005E, 0x0000, 0x005C, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
|
||||
/* 0xb8 */ 0x0000, 0x0000, 0x005B, 0x005D, 0x0000, 0x0000, 0x0000, 0x0000,
|
||||
/* 0xc0 */ 0x007B, 0x0041, 0x0042, 0x0043, 0x0044, 0x0045, 0x0046, 0x0047,
|
||||
/* 0xc8 */ 0x0048, 0x0049, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
|
||||
/* 0xd0 */ 0x007D, 0x004A, 0x004B, 0x004C, 0x004D, 0x004E, 0x004F, 0x0050,
|
||||
/* 0xd8 */ 0x0051, 0x0052, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
|
||||
/* 0xe0 */ 0x0024, 0x0000, 0x0053, 0x0054, 0x0055, 0x0056, 0x0057, 0x0058,
|
||||
/* 0xe8 */ 0x0059, 0x005A, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
|
||||
/* 0xf0 */ 0x0030, 0x0031, 0x0032, 0x0033, 0x0034, 0x0035, 0x0036, 0x0037,
|
||||
/* 0xf8 */ 0x0038, 0x0039, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x009F
|
||||
};
|
||||
|
||||
static const struct gap __ibm935db_to_ucs4_idx[] =
|
||||
|
@ -1,5 +1,5 @@
|
||||
/* 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.
|
||||
Contributed by Masahide Washizawa <washi@yamato.ibm.co.jp>, 2000.
|
||||
|
||||
@ -32,26 +32,68 @@
|
||||
#define CHARSET_NAME "IBM937//"
|
||||
#define FROM_LOOP from_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. */
|
||||
#define DEFINE_INIT 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. */
|
||||
enum
|
||||
{
|
||||
init = 0,
|
||||
sb,
|
||||
db
|
||||
sb = 0,
|
||||
db = 64
|
||||
};
|
||||
|
||||
/* First, define the conversion function from IBM-937 to UCS4. */
|
||||
#define MIN_NEEDED_INPUT MIN_NEEDED_FROM
|
||||
#define MAX_NEEDED_INPUT MAX_NEEDED_FROM
|
||||
#define MIN_NEEDED_OUTPUT MIN_NEEDED_TO
|
||||
#define INIT_PARAMS int curcs = init;
|
||||
#define LOOPFCT FROM_LOOP
|
||||
#define BODY \
|
||||
{ \
|
||||
@ -59,12 +101,6 @@ enum
|
||||
\
|
||||
if (__builtin_expect (ch, 0) == SO) \
|
||||
{ \
|
||||
if (__builtin_expect (inptr + 1 >= inend, 0)) \
|
||||
{ \
|
||||
result = __GCONV_INCOMPLETE_INPUT; \
|
||||
break; \
|
||||
} \
|
||||
\
|
||||
/* Shift OUT, change to DBCS converter. */ \
|
||||
if (curcs == db) \
|
||||
{ \
|
||||
@ -73,16 +109,10 @@ enum
|
||||
} \
|
||||
curcs = db; \
|
||||
++inptr; \
|
||||
ch = *inptr; \
|
||||
continue; \
|
||||
} \
|
||||
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. */ \
|
||||
if (curcs == sb) \
|
||||
{ \
|
||||
@ -91,10 +121,10 @@ enum
|
||||
} \
|
||||
curcs = sb; \
|
||||
++inptr; \
|
||||
ch = *inptr; \
|
||||
continue; \
|
||||
} \
|
||||
\
|
||||
if (curcs == sb || curcs == init) \
|
||||
if (curcs == sb) \
|
||||
{ \
|
||||
/* Use the UCS4 table for single byte. */ \
|
||||
ch = __ibm937sb_to_ucs4[ch]; \
|
||||
@ -107,19 +137,20 @@ enum
|
||||
break; \
|
||||
} \
|
||||
++*irreversible; \
|
||||
++inptr; \
|
||||
continue; \
|
||||
} \
|
||||
else \
|
||||
{ \
|
||||
put32 (outptr, ch); \
|
||||
outptr += 4; \
|
||||
inptr++; \
|
||||
} \
|
||||
++inptr; \
|
||||
} \
|
||||
else if (curcs == db) \
|
||||
else \
|
||||
{ \
|
||||
/* Use the IBM937 table for double byte. */ \
|
||||
\
|
||||
assert (curcs == db); \
|
||||
\
|
||||
ch = ibm937db_to_ucs4(inptr[0], inptr[1]); \
|
||||
if (__builtin_expect (ch, L'\1') == L'\0' && *inptr != '\0') \
|
||||
{ \
|
||||
@ -130,24 +161,25 @@ enum
|
||||
break; \
|
||||
} \
|
||||
++*irreversible; \
|
||||
inptr += 2; \
|
||||
continue; \
|
||||
} \
|
||||
else \
|
||||
{ \
|
||||
put32 (outptr, ch); \
|
||||
outptr += 4; \
|
||||
inptr += 2; \
|
||||
} \
|
||||
inptr += 2; \
|
||||
} \
|
||||
}
|
||||
#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>
|
||||
|
||||
/* Next, define the other direction. */
|
||||
#define MIN_NEEDED_INPUT MIN_NEEDED_TO
|
||||
#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 BODY \
|
||||
{ \
|
||||
@ -174,7 +206,7 @@ enum
|
||||
} \
|
||||
else \
|
||||
{ \
|
||||
if (curcs == init || curcs == sb) \
|
||||
if (curcs == sb) \
|
||||
{ \
|
||||
*outptr++ = SO; \
|
||||
if (__builtin_expect (outptr == outend, 0)) \
|
||||
@ -207,6 +239,9 @@ enum
|
||||
inptr += 4; \
|
||||
}
|
||||
#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>
|
||||
|
||||
/* Now define the toplevel functions. */
|
||||
|
@ -1,5 +1,5 @@
|
||||
/* 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.
|
||||
Contributed by Masahide Washizawa <washi@yamato.ibm.co.jp>, 2000.
|
||||
|
||||
@ -32,42 +32,76 @@
|
||||
#define CHARSET_NAME "IBM939//"
|
||||
#define FROM_LOOP from_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. */
|
||||
#define DEFINE_INIT 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. */
|
||||
enum
|
||||
{
|
||||
init = 0,
|
||||
sb,
|
||||
db
|
||||
sb = 0,
|
||||
db = 64
|
||||
};
|
||||
|
||||
/* First, define the conversion function from IBM-939 to UCS4. */
|
||||
#define MIN_NEEDED_INPUT MIN_NEEDED_FROM
|
||||
#define MAX_NEEDED_INPUT MAX_NEEDED_FROM
|
||||
#define MIN_NEEDED_OUTPUT MIN_NEEDED_TO
|
||||
#define INIT_PARAMS int curcs = init;
|
||||
#define LOOPFCT FROM_LOOP
|
||||
#define BODY \
|
||||
{ \
|
||||
uint32_t ch = *inptr; \
|
||||
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 (inptr + 1 >= inend, 0)) \
|
||||
{ \
|
||||
result = __GCONV_INCOMPLETE_INPUT; \
|
||||
break; \
|
||||
} \
|
||||
\
|
||||
/* Shift OUT, change to DBCS converter. */ \
|
||||
if (curcs == db) \
|
||||
{ \
|
||||
@ -76,16 +110,10 @@ enum
|
||||
} \
|
||||
curcs = db; \
|
||||
++inptr; \
|
||||
ch = *inptr; \
|
||||
continue; \
|
||||
} \
|
||||
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. */ \
|
||||
if (curcs == sb) \
|
||||
{ \
|
||||
@ -94,19 +122,14 @@ enum
|
||||
} \
|
||||
curcs = sb; \
|
||||
++inptr; \
|
||||
ch = *inptr; \
|
||||
continue; \
|
||||
} \
|
||||
\
|
||||
if (curcs == sb || curcs == init) \
|
||||
if (curcs == sb) \
|
||||
{ \
|
||||
/* Use the IBM939 table for single byte. */ \
|
||||
while (ch > rp1->end) \
|
||||
++rp1; \
|
||||
\
|
||||
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')) \
|
||||
res = __ibm939sb_to_ucs4[ch]; \
|
||||
if (__builtin_expect (res, L'\1') == L'\0' && ch != '\0') \
|
||||
{ \
|
||||
/* This is an illegal character. */ \
|
||||
if (! ignore_errors_p ()) \
|
||||
@ -115,21 +138,21 @@ enum
|
||||
break; \
|
||||
} \
|
||||
++*irreversible; \
|
||||
++inptr; \
|
||||
continue; \
|
||||
} \
|
||||
else \
|
||||
{ \
|
||||
if (res == 0xa5) \
|
||||
res = 0x5c; \
|
||||
put32 (outptr, res); \
|
||||
outptr += 4; \
|
||||
} \
|
||||
++inptr; \
|
||||
} \
|
||||
} \
|
||||
else if (curcs == db) \
|
||||
else \
|
||||
{ \
|
||||
/* 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)) \
|
||||
{ \
|
||||
/* The second character is not available. Store the \
|
||||
@ -154,24 +177,25 @@ enum
|
||||
break; \
|
||||
} \
|
||||
++*irreversible; \
|
||||
inptr += 2; \
|
||||
continue; \
|
||||
} \
|
||||
else \
|
||||
{ \
|
||||
put32 (outptr, res); \
|
||||
outptr += 4; \
|
||||
inptr += 2; \
|
||||
} \
|
||||
inptr += 2; \
|
||||
} \
|
||||
}
|
||||
#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>
|
||||
|
||||
/* Next, define the other direction */
|
||||
#define MIN_NEEDED_INPUT MIN_NEEDED_TO
|
||||
#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 BODY \
|
||||
{ \
|
||||
@ -214,7 +238,7 @@ enum
|
||||
} \
|
||||
else \
|
||||
{ \
|
||||
if (curcs == init || curcs == sb) \
|
||||
if (curcs == sb) \
|
||||
{ \
|
||||
if (__builtin_expect (outptr+1 > outend, 0)) \
|
||||
{ \
|
||||
@ -264,6 +288,9 @@ enum
|
||||
inptr += 4; \
|
||||
}
|
||||
#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>
|
||||
|
||||
/* Now define the toplevel functions. */
|
||||
|
@ -1,5 +1,5 @@
|
||||
/* 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.
|
||||
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 },
|
||||
{ start: 0x0042, end: 0x0069, idx: -1 },
|
||||
{ start: 0x006b, end: 0x007f, idx: -2 },
|
||||
{ start: 0x0081, end: 0x008f, idx: -3 },
|
||||
{ start: 0x0091, end: 0x00c9, idx: -4 },
|
||||
{ start: 0x00d0, end: 0x00d9, idx: -10 },
|
||||
{ start: 0x00e0, end: 0x00e0, idx: -16 },
|
||||
{ start: 0x00e2, end: 0x00e9, idx: -17 },
|
||||
{ start: 0x00f0, end: 0x00f9, idx: -23 },
|
||||
{ start: 0x00ff, end: 0x00ff, idx: -28 },
|
||||
{ start: 0xffff, end: 0xffff, idx: 0 }
|
||||
};
|
||||
|
||||
static const uint16_t __ibm939sb_to_ucs4[] =
|
||||
{
|
||||
0x0000, 0x0001, 0x0002, 0x0003, 0x009C, 0x0009, 0x0086, 0x007F, 0x0097,
|
||||
0x008D, 0x008E, 0x000B, 0x000C, 0x000D, 0x000E, 0x000F, 0x0010, 0x0011,
|
||||
0x0012, 0x0013, 0x009D, 0x0085, 0x0008, 0x0087, 0x0018, 0x0019, 0x0092,
|
||||
0x008F, 0x001C, 0x001D, 0x001E, 0x001F, 0x0080, 0x0081, 0x0082, 0x0083,
|
||||
0x0084, 0x000A, 0x0017, 0x001B, 0x0088, 0x0089, 0x008A, 0x008B, 0x008C,
|
||||
0x0005, 0x0006, 0x0007, 0x0090, 0x0091, 0x0016, 0x0093, 0x0094, 0x0095,
|
||||
0x0096, 0x0004, 0x0098, 0x0099, 0x009A, 0x009B, 0x0014, 0x0015, 0x009E,
|
||||
0x001A, 0x0020, 0xFF61, 0xFF62, 0xFF63, 0xFF64, 0xFF65, 0xFF66, 0xFF67,
|
||||
0xFF68, 0x00A2, 0x002E, 0x003C, 0x0028, 0x002B, 0x007C, 0x0026, 0xFF69,
|
||||
0xFF6A, 0xFF6B, 0xFF6C, 0xFF6D, 0xFF6E, 0xFF6F, 0xFF70, 0xFF71, 0x0021,
|
||||
0x0024, 0x002A, 0x0029, 0x003B, 0x00AC, 0x002D, 0x002F, 0xFF72, 0xFF73,
|
||||
0xFF74, 0xFF75, 0xFF76, 0xFF77, 0xFF78, 0xFF79, 0x002C, 0x0025, 0x005F,
|
||||
0x003E, 0x003F, 0xFF7A, 0xFF7B, 0xFF7C, 0xFF7D, 0xFF7E, 0xFF7F, 0xFF80,
|
||||
0xFF81, 0xFF82, 0x0060, 0x003A, 0x0023, 0x0040, 0x0027, 0x003D, 0x0022,
|
||||
0x0061, 0x0062, 0x0063, 0x0064, 0x0065, 0x0066, 0x0067, 0x0068, 0x0069,
|
||||
0xFF83, 0xFF84, 0xFF85, 0xFF86, 0xFF87, 0xFF88, 0x006A, 0x006B, 0x006C,
|
||||
0x006D, 0x006E, 0x006F, 0x0070, 0x0071, 0x0072, 0xFF89, 0xFF8A, 0xFF8B,
|
||||
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
|
||||
/* 0x00 */ 0x0000, 0x0001, 0x0002, 0x0003, 0x009C, 0x0009, 0x0086, 0x007F,
|
||||
/* 0x08 */ 0x0097, 0x008D, 0x008E, 0x000B, 0x000C, 0x000D, 0x000E, 0x000F,
|
||||
/* 0x10 */ 0x0010, 0x0011, 0x0012, 0x0013, 0x009D, 0x0085, 0x0008, 0x0087,
|
||||
/* 0x18 */ 0x0018, 0x0019, 0x0092, 0x008F, 0x001C, 0x001D, 0x001E, 0x001F,
|
||||
/* 0x20 */ 0x0080, 0x0081, 0x0082, 0x0083, 0x0084, 0x000A, 0x0017, 0x001B,
|
||||
/* 0x28 */ 0x0088, 0x0089, 0x008A, 0x008B, 0x008C, 0x0005, 0x0006, 0x0007,
|
||||
/* 0x30 */ 0x0090, 0x0091, 0x0016, 0x0093, 0x0094, 0x0095, 0x0096, 0x0004,
|
||||
/* 0x38 */ 0x0098, 0x0099, 0x009A, 0x009B, 0x0014, 0x0015, 0x009E, 0x001A,
|
||||
/* 0x40 */ 0x0020, 0x0000, 0xFF61, 0xFF62, 0xFF63, 0xFF64, 0xFF65, 0xFF66,
|
||||
/* 0x48 */ 0xFF67, 0xFF68, 0x00A2, 0x002E, 0x003C, 0x0028, 0x002B, 0x007C,
|
||||
/* 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,
|
||||
/* 0x68 */ 0xFF78, 0xFF79, 0x0000, 0x002C, 0x0025, 0x005F, 0x003E, 0x003F,
|
||||
/* 0x70 */ 0xFF7A, 0xFF7B, 0xFF7C, 0xFF7D, 0xFF7E, 0xFF7F, 0xFF80, 0xFF81,
|
||||
/* 0x78 */ 0xFF82, 0x0060, 0x003A, 0x0023, 0x0040, 0x0027, 0x003D, 0x0022,
|
||||
/* 0x80 */ 0x0000, 0x0061, 0x0062, 0x0063, 0x0064, 0x0065, 0x0066, 0x0067,
|
||||
/* 0x88 */ 0x0068, 0x0069, 0xFF83, 0xFF84, 0xFF85, 0xFF86, 0xFF87, 0xFF88,
|
||||
/* 0x90 */ 0x0000, 0x006A, 0x006B, 0x006C, 0x006D, 0x006E, 0x006F, 0x0070,
|
||||
/* 0x98 */ 0x0071, 0x0072, 0xFF89, 0xFF8A, 0xFF8B, 0xFF8C, 0xFF8D, 0xFF8E,
|
||||
/* 0xa0 */ 0x203E, 0x007E, 0x0073, 0x0074, 0x0075, 0x0076, 0x0077, 0x0078,
|
||||
/* 0xa8 */ 0x0079, 0x007A, 0xFF8F, 0xFF90, 0xFF91, 0x005B, 0xFF92, 0xFF93,
|
||||
/* 0xb0 */ 0x005E, 0x00A3, 0x005C, 0xFF94, 0xFF95, 0xFF96, 0xFF97, 0xFF98,
|
||||
/* 0xb8 */ 0xFF99, 0xFF9A, 0xFF9B, 0xFF9C, 0xFF9D, 0x005D, 0xFF9E, 0xFF9F,
|
||||
/* 0xc0 */ 0x007B, 0x0041, 0x0042, 0x0043, 0x0044, 0x0045, 0x0046, 0x0047,
|
||||
/* 0xc8 */ 0x0048, 0x0049, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
|
||||
/* 0xd0 */ 0x007D, 0x004A, 0x004B, 0x004C, 0x004D, 0x004E, 0x004F, 0x0050,
|
||||
/* 0xd8 */ 0x0051, 0x0052, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
|
||||
/* 0xe0 */ 0x005C, 0x0000, 0x0053, 0x0054, 0x0055, 0x0056, 0x0057, 0x0058,
|
||||
/* 0xe8 */ 0x0059, 0x005A, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
|
||||
/* 0xf0 */ 0x0030, 0x0031, 0x0032, 0x0033, 0x0034, 0x0035, 0x0036, 0x0037,
|
||||
/* 0xf8 */ 0x0038, 0x0039, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x009F
|
||||
};
|
||||
|
||||
static const struct gap __ibm939db_to_ucs4_idx[] =
|
||||
|
BIN
iconvdata/testdata/IBM930
vendored
BIN
iconvdata/testdata/IBM930
vendored
Binary file not shown.
BIN
iconvdata/testdata/IBM933
vendored
BIN
iconvdata/testdata/IBM933
vendored
Binary file not shown.
BIN
iconvdata/testdata/IBM935
vendored
BIN
iconvdata/testdata/IBM935
vendored
Binary file not shown.
BIN
iconvdata/testdata/IBM937
vendored
BIN
iconvdata/testdata/IBM937
vendored
Binary file not shown.
BIN
iconvdata/testdata/IBM939
vendored
BIN
iconvdata/testdata/IBM939
vendored
Binary file not shown.
Loading…
Reference in New Issue
Block a user