1#!/bin/sh
2# Copyright (C) 2000-2022 Free Software Foundation, Inc.
3# This file is part of the GNU C Library.
4#
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# Checks that the iconv() implementation (in both directions) for a
21# stateless encoding agrees with the charmap table.
22
23common_objpfx=$1
24objpfx=$2
25test_program_prefix=$3
26charset=$4
27charmap=$5
28
29# sort is used on the build system.
30LC_ALL=C
31export LC_ALL
32
33set -e
34
35# Get the charmap.
36./tst-table-charmap.sh ${charmap:-$charset} \
37  < ../localedata/charmaps/${charmap:-$charset} \
38  > ${objpfx}tst-${charset}.charmap.table
39# When the charset is GB18030, truncate this table because for this encoding,
40# the tst-table-from and tst-table-to programs scan the Unicode BMP only.
41if test ${charset} = GB18030; then
42  grep '0x....$' < ${objpfx}tst-${charset}.charmap.table \
43    > ${objpfx}tst-${charset}.truncated.table
44  mv ${objpfx}tst-${charset}.truncated.table ${objpfx}tst-${charset}.charmap.table
45fi
46
47# Precomputed expexted differences between the charmap and iconv forward.
48precomposed=${charset}.precomposed
49
50# Precompute expected differences between the charmap and iconv backward.
51if test ${charset} = EUC-TW; then
52  irreversible=${objpfx}tst-${charset}.irreversible
53  (grep '^0x8EA1' ${objpfx}tst-${charset}.charmap.table
54   cat ${charset}.irreversible
55  ) > ${irreversible}
56else
57  irreversible=${charset}.irreversible
58fi
59
60# iconv in one direction.
61${test_program_prefix} \
62${objpfx}tst-table-from ${charset} \
63  > ${objpfx}tst-${charset}.table
64
65# iconv in the other direction.
66${test_program_prefix} \
67${objpfx}tst-table-to ${charset} | sort \
68  > ${objpfx}tst-${charset}.inverse.table
69
70# Difference between the charmap and iconv backward.
71diff ${objpfx}tst-${charset}.charmap.table ${objpfx}tst-${charset}.inverse.table | \
72  grep '^[<>]' | sed -e 's,^. ,,' > ${objpfx}tst-${charset}.irreversible.table
73
74# Check 1: charmap and iconv forward should be identical, except for
75# precomposed characters.
76if test -f ${precomposed}; then
77  cat ${objpfx}tst-${charset}.table ${precomposed} | sort | uniq -u \
78    > ${objpfx}tst-${charset}.tmp.table
79  cmp -s ${objpfx}tst-${charset}.charmap.table ${objpfx}tst-${charset}.tmp.table ||
80  exit 1
81else
82  cmp -s ${objpfx}tst-${charset}.charmap.table ${objpfx}tst-${charset}.table ||
83  exit 1
84fi
85
86# Check 2: the difference between the charmap and iconv backward.
87if test -f ${irreversible}; then
88  cat ${objpfx}tst-${charset}.charmap.table ${irreversible} | sort | uniq -u \
89    > ${objpfx}tst-${charset}.tmp.table
90  cmp -s ${objpfx}tst-${charset}.tmp.table ${objpfx}tst-${charset}.inverse.table ||
91  exit 1
92else
93  cmp -s ${objpfx}tst-${charset}.charmap.table ${objpfx}tst-${charset}.inverse.table ||
94  exit 1
95fi
96
97exit 0
98