1/* Verify that using C.UTF-8 works.
2
3 Copyright (C) 2021-2022 Free Software Foundation, Inc.
4 This file is part of the GNU C Library.
5
6 The GNU C Library is free software; you can redistribute it and/or
7 modify it under the terms of the GNU Lesser General Public
8 License as published by the Free Software Foundation; either
9 version 2.1 of the License, or (at your option) any later version.
10
11 The GNU C Library is distributed in the hope that it will be useful,
12 but WITHOUT ANY WARRANTY; without even the implied warranty of
13 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
14 Lesser General Public License for more details.
15
16 You should have received a copy of the GNU Lesser General Public
17 License along with the GNU C Library; if not, see
18 <https://www.gnu.org/licenses/>. */
19
20#include <iconv.h>
21#include <stddef.h>
22#include <stdio.h>
23#include <string.h>
24#include <support/support.h>
25#include <support/check.h>
26
27/* This test does two things:
28 (1) Verify that we have likely included translit_combining in C.UTF-8.
29 (2) Verify default_missing is '?' as expected. */
30
31/* ISO-8859-1 encoding of "für". */
32char iso88591_in[] = { 0x66, 0xfc, 0x72, 0x0 };
33/* ASCII transliteration is "fur" with C.UTF-8 translit_combining. */
34char ascii_exp[] = { 0x66, 0x75, 0x72, 0x0 };
35
36/* First 3-byte UTF-8 code point. */
37char utf8_in[] = { 0xe0, 0xa0, 0x80, 0x0 };
38/* There is no ASCII transliteration for SAMARITAN LETTER ALAF
39 so we get default_missing used which is '?'. */
40char default_missing_exp[] = { 0x3f, 0x0 };
41
42static int
43do_test (void)
44{
45 char ascii_out[5];
46 iconv_t cd;
47 char *inbuf;
48 char *outbuf;
49 size_t inbytes;
50 size_t outbytes;
51 size_t n;
52
53 /* The C.UTF-8 locale should include translit_combining, which provides
54 the transliteration for "LATIN SMALL LETTER U WITH DIAERESIS" which
55 is not provided by locale/C-translit.h.in. */
56 xsetlocale (LC_ALL, locale: "C.UTF-8");
57
58 /* From ISO-8859-1 to ASCII. */
59 cd = iconv_open (tocode: "ASCII//TRANSLIT,IGNORE", fromcode: "ISO-8859-1");
60 TEST_VERIFY (cd != (iconv_t) -1);
61 inbuf = iso88591_in;
62 inbytes = 3;
63 outbuf = ascii_out;
64 outbytes = 3;
65 n = iconv (cd: cd, inbuf: &inbuf, inbytesleft: &inbytes, outbuf: &outbuf, outbytesleft: &outbytes);
66 TEST_VERIFY (n != -1);
67 *outbuf = '\0';
68 TEST_COMPARE_BLOB (ascii_out, 3, ascii_exp, 3);
69 TEST_VERIFY (iconv_close (cd) == 0);
70
71 /* From UTF-8 to ASCII. */
72 cd = iconv_open (tocode: "ASCII//TRANSLIT,IGNORE", fromcode: "UTF-8");
73 TEST_VERIFY (cd != (iconv_t) -1);
74 inbuf = utf8_in;
75 inbytes = 3;
76 outbuf = ascii_out;
77 outbytes = 3;
78 n = iconv (cd: cd, inbuf: &inbuf, inbytesleft: &inbytes, outbuf: &outbuf, outbytesleft: &outbytes);
79 TEST_VERIFY (n != -1);
80 *outbuf = '\0';
81 TEST_COMPARE_BLOB (ascii_out, 1, default_missing_exp, 1);
82 TEST_VERIFY (iconv_close (cd) == 0);
83
84 return 0;
85}
86
87#include <support/test-driver.c>
88

source code of glibc/iconv/tst-iconv9.c