mirror of
git://sourceware.org/git/glibc.git
synced 2024-12-03 04:01:43 +08:00
e1d3312015
support GB18030-2022 after add and change some transcoding relationship of GB18030-2022.Details are as follows: add 25 transcoding relationship UE81E 0x82359037 UE826 0x82359038 UE82B 0x82359039 UE82C 0x82359130 UE832 0x82359131 UE843 0x82359132 UE854 0x82359133 UE864 0x82359134 UE78D 0x84318236 UE78F 0x84318237 UE78E 0x84318238 UE790 0x84318239 UE791 0x84318330 UE792 0x84318331 UE793 0x84318332 UE794 0x84318333 UE795 0x84318334 UE796 0x84318335 UE816 0xfe51 UE817 0xfe52 UE818 0xfe53 UE831 0xfe6c UE83B 0xfe76 UE855 0xfe91 change 6 transcoding relationship U20087 0x95329031 U20089 0x95329033 U200CC 0x95329730 U215D7 0x9536b937 U2298F 0x9630ba35 U241FE 0x9635b630 Test the entire GB18030 charmap, not only the Unicode BMP part. Co-authored-by: yangyanchao <yangyanchao6@huawei.com> Co-authored-by: liqingqing <liqingqing3@huawei.com> Co-authored-by: Bruno Haible <bruno@clisp.org> Reviewed-by: Andreas Schwab <schwab@suse.de> Reviewed-by: Mike FABIAN <mfabian@redhat.com>
135 lines
3.7 KiB
C
135 lines
3.7 KiB
C
/* Copyright (C) 2000-2023 Free Software Foundation, Inc.
|
|
This file is part of the GNU C Library.
|
|
|
|
The GNU C Library is free software; you can redistribute it and/or
|
|
modify it under the terms of the GNU Lesser General Public
|
|
License as published by the Free Software Foundation; either
|
|
version 2.1 of the License, or (at your option) any later version.
|
|
|
|
The GNU C Library is distributed in the hope that it will be useful,
|
|
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
|
Lesser General Public License for more details.
|
|
|
|
You should have received a copy of the GNU Lesser General Public
|
|
License along with the GNU C Library; if not, see
|
|
<https://www.gnu.org/licenses/>. */
|
|
|
|
/* Create a table from Unicode to CHARSET.
|
|
This is a good test for CHARSET's iconv() module, in particular the
|
|
TO_LOOP BODY macro. */
|
|
|
|
#include <stddef.h>
|
|
#include <stdio.h>
|
|
#include <stdlib.h>
|
|
#include <string.h>
|
|
#include <iconv.h>
|
|
#include <errno.h>
|
|
|
|
int
|
|
main (int argc, char *argv[])
|
|
{
|
|
const char *charset;
|
|
iconv_t cd;
|
|
int bmp_only;
|
|
int no_tags;
|
|
|
|
if (argc != 2)
|
|
{
|
|
fprintf (stderr, "Usage: tst-table-to charset\n");
|
|
return 1;
|
|
}
|
|
charset = argv[1];
|
|
|
|
cd = iconv_open (charset, "UTF-8");
|
|
if (cd == (iconv_t)(-1))
|
|
{
|
|
perror ("iconv_open");
|
|
return 1;
|
|
}
|
|
|
|
/* When testing UTF-8, stop at 0x10000, otherwise the output
|
|
file gets too big. */
|
|
bmp_only = (strcmp (charset, "UTF-8") == 0);
|
|
/* When testing any encoding other than UTF-8 or GB18030, stop at 0xE0000,
|
|
because the conversion drops Unicode tag characters (range
|
|
U+E0000..U+E007F). */
|
|
no_tags = !(strcmp (charset, "UTF-8") == 0
|
|
|| strcmp (charset, "GB18030") == 0);
|
|
|
|
{
|
|
unsigned int i;
|
|
unsigned char buf[10];
|
|
for (i = 0; i < (bmp_only ? 0x10000 : no_tags ? 0xE0000 : 0x110000); i++)
|
|
{
|
|
unsigned char in[6];
|
|
unsigned int incount =
|
|
(i < 0x80 ? (in[0] = i, 1)
|
|
: i < 0x800 ? (in[0] = 0xc0 | (i >> 6),
|
|
in[1] = 0x80 | (i & 0x3f), 2)
|
|
: i < 0x10000 ? (in[0] = 0xe0 | (i >> 12),
|
|
in[1] = 0x80 | ((i >> 6) & 0x3f),
|
|
in[2] = 0x80 | (i & 0x3f), 3)
|
|
: /* i < 0x200000 */ (in[0] = 0xf0 | (i >> 18),
|
|
in[1] = 0x80 | ((i >> 12) & 0x3f),
|
|
in[2] = 0x80 | ((i >> 6) & 0x3f),
|
|
in[3] = 0x80 | (i & 0x3f), 4));
|
|
const char *inbuf = (const char *) in;
|
|
size_t inbytesleft = incount;
|
|
char *outbuf = (char *) buf;
|
|
size_t outbytesleft = sizeof (buf);
|
|
size_t result;
|
|
size_t result2 = 0;
|
|
|
|
iconv (cd, NULL, NULL, NULL, NULL);
|
|
result = iconv (cd,
|
|
(char **) &inbuf, &inbytesleft,
|
|
&outbuf, &outbytesleft);
|
|
if (result != (size_t)(-1))
|
|
result2 = iconv (cd, NULL, NULL, &outbuf, &outbytesleft);
|
|
|
|
if (result == (size_t)(-1) || result2 == (size_t)(-1))
|
|
{
|
|
if (errno != EILSEQ)
|
|
{
|
|
int saved_errno = errno;
|
|
fprintf (stderr, "0x%02X: iconv error: ", i);
|
|
errno = saved_errno;
|
|
perror ("");
|
|
return 1;
|
|
}
|
|
}
|
|
else if (result == 0) /* ignore conversions with transliteration */
|
|
{
|
|
unsigned int j, jmax;
|
|
if (inbytesleft != 0 || outbytesleft == sizeof (buf))
|
|
{
|
|
fprintf (stderr, "0x%02X: inbytes = %ld, outbytes = %ld\n", i,
|
|
(long) (incount - inbytesleft),
|
|
(long) (sizeof (buf) - outbytesleft));
|
|
return 1;
|
|
}
|
|
jmax = sizeof (buf) - outbytesleft;
|
|
printf ("0x");
|
|
for (j = 0; j < jmax; j++)
|
|
printf ("%02X", buf[j]);
|
|
printf ("\t0x%04X\n", i);
|
|
}
|
|
}
|
|
}
|
|
|
|
if (iconv_close (cd) < 0)
|
|
{
|
|
perror ("iconv_close");
|
|
return 1;
|
|
}
|
|
|
|
if (ferror (stdin) || fflush (stdout) || ferror (stdout))
|
|
{
|
|
fprintf (stderr, "I/O error\n");
|
|
return 1;
|
|
}
|
|
|
|
return 0;
|
|
}
|