Blame tests/gen-casemap-txt.pl

Packit Service d3d246
#! /usr/bin/perl -w
Packit Service d3d246
Packit Service d3d246
#    Copyright (C) 1998, 1999 Tom Tromey
Packit Service d3d246
#    Copyright (C) 2001 Red Hat Software
Packit Service d3d246
Packit Service d3d246
#    This program is free software; you can redistribute it and/or modify
Packit Service d3d246
#    it under the terms of the GNU General Public License as published by
Packit Service d3d246
#    the Free Software Foundation; either version 2, or (at your option)
Packit Service d3d246
#    any later version.
Packit Service d3d246
Packit Service d3d246
#    This program is distributed in the hope that it will be useful,
Packit Service d3d246
#    but WITHOUT ANY WARRANTY; without even the implied warranty of
Packit Service d3d246
#    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
Packit Service d3d246
#    GNU General Public License for more details.
Packit Service d3d246
Packit Service d3d246
#    You should have received a copy of the GNU General Public License
Packit Service d3d246
#    along with this program; if not, see <http://www.gnu.org/licenses/>.
Packit Service d3d246
Packit Service d3d246
# gen-casemap-test.pl - Generate test cases for case mapping from Unicode data.
Packit Service d3d246
# See http://www.unicode.org/Public/UNIDATA/UnicodeCharacterDatabase.html
Packit Service d3d246
# I consider the output of this program to be unrestricted.  Use it as
Packit Service d3d246
# you will.
Packit Service d3d246
Packit Service d3d246
require 5.006;
Packit Service d3d246
use utf8;
Packit Service d3d246
Packit Service d3d246
if (@ARGV != 3) {
Packit Service d3d246
    $0 =~ s@.*/@@;
Packit Service d3d246
    die "Usage: $0 UNICODE-VERSION UnicodeData.txt SpecialCasing.txt\n";
Packit Service d3d246
}
Packit Service d3d246
 
Packit Service d3d246
use vars qw($CODE $NAME $CATEGORY $COMBINING_CLASSES $BIDI_CATEGORY $DECOMPOSITION $DECIMAL_VALUE $DIGIT_VALUE $NUMERIC_VALUE $MIRRORED $OLD_NAME $COMMENT $UPPER $LOWER $TITLE $BREAK_CODE $BREAK_CATEGORY $BREAK_NAME $CASE_CODE $CASE_LOWER $CASE_TITLE $CASE_UPPER $CASE_CONDITION);
Packit Service d3d246
Packit Service d3d246
# Names of fields in Unicode data table.
Packit Service d3d246
$CODE = 0;
Packit Service d3d246
$NAME = 1;
Packit Service d3d246
$CATEGORY = 2;
Packit Service d3d246
$COMBINING_CLASSES = 3;
Packit Service d3d246
$BIDI_CATEGORY = 4;
Packit Service d3d246
$DECOMPOSITION = 5;
Packit Service d3d246
$DECIMAL_VALUE = 6;
Packit Service d3d246
$DIGIT_VALUE = 7;
Packit Service d3d246
$NUMERIC_VALUE = 8;
Packit Service d3d246
$MIRRORED = 9;
Packit Service d3d246
$OLD_NAME = 10;
Packit Service d3d246
$COMMENT = 11;
Packit Service d3d246
$UPPER = 12;
Packit Service d3d246
$LOWER = 13;
Packit Service d3d246
$TITLE = 14;
Packit Service d3d246
Packit Service d3d246
# Names of fields in the SpecialCasing table
Packit Service d3d246
$CASE_CODE = 0;
Packit Service d3d246
$CASE_LOWER = 1;
Packit Service d3d246
$CASE_TITLE = 2;
Packit Service d3d246
$CASE_UPPER = 3;
Packit Service d3d246
$CASE_CONDITION = 4;
Packit Service d3d246
Packit Service d3d246
my @upper;
Packit Service d3d246
my @title;
Packit Service d3d246
my @lower;
Packit Service d3d246
Packit Service d3d246
binmode STDOUT, ":utf8";
Packit Service d3d246
open (INPUT, "< $ARGV[1]") || exit 1;
Packit Service d3d246
Packit Service d3d246
$last_code = -1;
Packit Service d3d246
while (<INPUT>)
Packit Service d3d246
{
Packit Service d3d246
    chop;
Packit Service d3d246
    @fields = split (';', $_, 30);
Packit Service d3d246
    if ($#fields != 14)
Packit Service d3d246
    {
Packit Service d3d246
	printf STDERR ("Entry for $fields[$CODE] has wrong number of fields (%d)\n", $#fields);
Packit Service d3d246
    }
Packit Service d3d246
Packit Service d3d246
    $code = hex ($fields[$CODE]);
Packit Service d3d246
Packit Service d3d246
    if ($code > $last_code + 1)
Packit Service d3d246
    {
Packit Service d3d246
	# Found a gap.
Packit Service d3d246
	if ($fields[$NAME] =~ /Last>/)
Packit Service d3d246
	{
Packit Service d3d246
	    # Fill the gap with the last character read,
Packit Service d3d246
            # since this was a range specified in the char database
Packit Service d3d246
	    @gfields = @fields;
Packit Service d3d246
	}
Packit Service d3d246
	else
Packit Service d3d246
	{
Packit Service d3d246
	    # The gap represents undefined characters.  Only the type
Packit Service d3d246
	    # matters.
Packit Service d3d246
	    @gfields = ('', '', 'Cn', '0', '', '', '', '', '', '', '',
Packit Service d3d246
			'', '', '', '');
Packit Service d3d246
	}
Packit Service d3d246
	for (++$last_code; $last_code < $code; ++$last_code)
Packit Service d3d246
	{
Packit Service d3d246
	    $gfields{$CODE} = sprintf ("%04x", $last_code);
Packit Service d3d246
	    &process_one ($last_code, @gfields);
Packit Service d3d246
	}
Packit Service d3d246
    }
Packit Service d3d246
    &process_one ($code, @fields);
Packit Service d3d246
    $last_code = $code;
Packit Service d3d246
}
Packit Service d3d246
Packit Service d3d246
close INPUT;
Packit Service d3d246
Packit Service d3d246
open (INPUT, "< $ARGV[2]") || exit 1;
Packit Service d3d246
Packit Service d3d246
while (<INPUT>)
Packit Service d3d246
{
Packit Service d3d246
    my $code;
Packit Service d3d246
    
Packit Service d3d246
    chop;
Packit Service d3d246
Packit Service d3d246
    next if /^#/;
Packit Service d3d246
    next if /^\s*$/;
Packit Service d3d246
Packit Service d3d246
    s/\s*#.*//;
Packit Service d3d246
Packit Service d3d246
    @fields = split ('\s*;\s*', $_, 30);
Packit Service d3d246
Packit Service d3d246
    $raw_code = $fields[$CASE_CODE];
Packit Service d3d246
    $code = hex ($raw_code);
Packit Service d3d246
Packit Service d3d246
    if ($#fields != 4 && $#fields != 5)
Packit Service d3d246
    {
Packit Service d3d246
	printf STDERR ("Entry for $raw_code has wrong number of fields (%d)\n", $#fields);
Packit Service d3d246
	next;
Packit Service d3d246
    }
Packit Service d3d246
Packit Service d3d246
    if (defined $fields[5]) {
Packit Service d3d246
	# Ignore conditional special cases - we'll handle them manually
Packit Service d3d246
	next;
Packit Service d3d246
    }
Packit Service d3d246
Packit Service d3d246
    $upper[$code] = &make_hex ($fields[$CASE_UPPER]);
Packit Service d3d246
    $lower[$code] = &make_hex ($fields[$CASE_LOWER]);
Packit Service d3d246
    $title[$code] = &make_hex ($fields[$CASE_TITLE]);
Packit Service d3d246
}
Packit Service d3d246
Packit Service d3d246
close INPUT;
Packit Service d3d246
Packit Service d3d246
print <
Packit Service d3d246
# Test cases generated from Unicode $ARGV[0] data
Packit Service d3d246
# by gen-case-tests.pl. Do not edit.
Packit Service d3d246
#
Packit Service d3d246
# Some special hand crafted tests
Packit Service d3d246
#
Packit Service d3d246
tr_TR\ti\ti\t\x{0130}\t\x{0130}\t# i => LATIN CAPITAL LETTER I WITH DOT ABOVE
Packit Service d3d246
tr_TR\tI\t\x{0131}\tI\tI\t# I => LATIN SMALL LETTER DOTLESS I
Packit Service d3d246
tr_TR\tI\x{0307}\ti\tI\x{0307}\tI\x{0307}\t# I => LATIN SMALL LETTER DOTLESS I
Packit Service d3d246
tr_TR.UTF-8\ti\ti\t\x{0130}\t\x{0130}\t# i => LATIN CAPITAL LETTER I WITH DOT ABOVE
Packit Service d3d246
tr_TR.UTF-8\tI\t\x{0131}\tI\tI\t# I => LATIN SMALL LETTER DOTLESS I
Packit Service d3d246
tr_TR.UTF-8\tI\x{0307}\ti\tI\x{0307}\tI\x{0307}\t# I => LATIN SMALL LETTER DOTLESS I
Packit Service d3d246
# Test reordering of YPOGEGRAMMENI across other accents
Packit Service d3d246
\t\x{03b1}\x{0345}\x{0314}\t\x{03b1}\x{0345}\x{314}\t\x{0391}\x{0345}\x{0314}\t\x{0391}\x{0314}\x{0399}\t
Packit Service d3d246
\t\x{03b1}\x{0314}\x{0345}\t\x{03b1}\x{314}\x{0345}\t\x{0391}\x{0314}\x{0345}\t\x{0391}\x{0314}\x{0399}\t
Packit Service d3d246
# Handling of final and nonfinal sigma
Packit Service d3d246
	ΜΆΙΟΣ 	μάιος 	Μάιος 	ΜΆΙΟΣ 	
Packit Service d3d246
	ΜΆΙΟΣ	μάιος	Μάιος	ΜΆΙΟΣ	
Packit Service d3d246
	ΣΙΓΜΑ	σιγμα	Σιγμα	ΣΙΓΜΑ	
Packit Service d3d246
# Lithuanian rule of i followed by letter with dot. Not at all sure
Packit Service d3d246
# about the titlecase part here
Packit Service d3d246
lt_LT\ti\x{117}\ti\x{117}\tIe\tIE\t
Packit Service d3d246
lt_LT\tie\x{307}\tie\x{307}\tIe\tIE\t
Packit Service d3d246
lt_LT\t\x{00cc}\ti\x{0307}\x{0300}\t\x{00cc}\t\x{00cc}\t # LATIN CAPITAL LETTER I WITH GRAVE
Packit Service d3d246
lt_LT\t\x{00CD}\ti\x{0307}\x{0301}\t\x{00CD}\t\x{00CD}\t # LATIN CAPITAL LETTER I WITH ACUTE
Packit Service d3d246
lt_LT\t\x{0128}\ti\x{0307}\x{0303}\t\x{0128}\t\x{0128}\t # LATIN CAPITAL LETTER I WITH TILDE
Packit Service d3d246
lt_LT\tI\x{0301}\ti\x{0307}\x{0301}\tI\x{0301}\tI\x{0301}\t # LATIN CAPITAL LETTER I (with acute accent)
Packit Service d3d246
lt_LT\tI\x{0300}\ti\x{0307}\x{0300}\tI\x{0300}\tI\x{0300}\t # LATIN CAPITAL LETTER I (with grave accent)
Packit Service d3d246
lt_LT\tI\x{0303}\ti\x{0307}\x{0303}\tI\x{0303}\tI\x{0303}\t # LATIN CAPITAL LETTER I (with tilde above)
Packit Service d3d246
lt_LT\tI\x{0328}\x{0301}\ti\x{0307}\x{0328}\x{0301}\tI\x{0328}\x{0301}\tI\x{0328}\x{0301}\t # LATIN CAPITAL LETTER I (with ogonek and acute accent)
Packit Service d3d246
lt_LT\tJ\x{0301}\tj\x{0307}\x{0301}\tJ\x{0301}\tJ\x{0301}\t # LATIN CAPITAL LETTER J (with acute accent)
Packit Service d3d246
lt_LT\t\x{012e}\x{0301}\t\x{012f}\x{0307}\x{0301}\t\x{012e}\x{0301}\t\x{012e}\x{0301}\t # LATIN CAPITAL LETTER I WITH OGONEK (with acute accent)
Packit Service d3d246
lt_LT.UTF-8\ti\x{117}\ti\x{117}\tIe\tIE\t
Packit Service d3d246
lt_LT.UTF-8\tie\x{307}\tie\x{307}\tIe\tIE\t
Packit Service d3d246
lt_LT.UTF-8\t\x{00cc}\ti\x{0307}\x{0300}\t\x{00cc}\t\x{00cc}\t # LATIN CAPITAL LETTER I WITH GRAVE
Packit Service d3d246
lt_LT.UTF-8\t\x{00CD}\ti\x{0307}\x{0301}\t\x{00CD}\t\x{00CD}\t # LATIN CAPITAL LETTER I WITH ACUTE
Packit Service d3d246
lt_LT.UTF-8\t\x{0128}\ti\x{0307}\x{0303}\t\x{0128}\t\x{0128}\t # LATIN CAPITAL LETTER I WITH TILDE
Packit Service d3d246
lt_LT.UTF-8\tI\x{0301}\ti\x{0307}\x{0301}\tI\x{0301}\tI\x{0301}\t # LATIN CAPITAL LETTER I (with acute accent)
Packit Service d3d246
lt_LT.UTF-8\tI\x{0300}\ti\x{0307}\x{0300}\tI\x{0300}\tI\x{0300}\t # LATIN CAPITAL LETTER I (with grave accent)
Packit Service d3d246
lt_LT.UTF-8\tI\x{0303}\ti\x{0307}\x{0303}\tI\x{0303}\tI\x{0303}\t # LATIN CAPITAL LETTER I (with tilde above)
Packit Service d3d246
lt_LT.UTF-8\tI\x{0328}\x{0301}\ti\x{0307}\x{0328}\x{0301}\tI\x{0328}\x{0301}\tI\x{0328}\x{0301}\t # LATIN CAPITAL LETTER I (with ogonek and acute accent)
Packit Service d3d246
lt_LT.UTF-8\tJ\x{0301}\tj\x{0307}\x{0301}\tJ\x{0301}\tJ\x{0301}\t # LATIN CAPITAL LETTER J (with acute accent)
Packit Service d3d246
lt_LT.UTF-8\t\x{012e}\x{0301}\t\x{012f}\x{0307}\x{0301}\t\x{012e}\x{0301}\t\x{012e}\x{0301}\t # LATIN CAPITAL LETTER I WITH OGONEK (with acute accent)
Packit Service d3d246
# Special case not at initial position
Packit Service d3d246
\ta\x{fb04}\ta\x{fb04}\tAffl\tAFFL\t# FB04
Packit Service d3d246
#
Packit Service d3d246
# Now the automatic tests
Packit Service d3d246
#
Packit Service d3d246
EOT
Packit Service d3d246
&print_tests;
Packit Service d3d246
Packit Service d3d246
exit 0;
Packit Service d3d246
Packit Service d3d246
# Process a single character.
Packit Service d3d246
sub process_one
Packit Service d3d246
{
Packit Service d3d246
    my ($code, @fields) = @_;
Packit Service d3d246
Packit Service d3d246
    my $type =  $fields[$CATEGORY];
Packit Service d3d246
    if ($type eq 'Ll')
Packit Service d3d246
    {
Packit Service d3d246
	$upper[$code] = make_hex ($fields[$UPPER]);
Packit Service d3d246
	$lower[$code] = pack ("U", $code);
Packit Service d3d246
	$title[$code] = make_hex ($fields[$TITLE]);
Packit Service d3d246
    }
Packit Service d3d246
    elsif ($type eq 'Lu')
Packit Service d3d246
    {
Packit Service d3d246
	$lower[$code] = make_hex ($fields[$LOWER]);
Packit Service d3d246
	$upper[$code] = pack ("U", $code);
Packit Service d3d246
	$title[$code] = make_hex ($fields[$TITLE]);
Packit Service d3d246
    }
Packit Service d3d246
Packit Service d3d246
    if ($type eq 'Lt')
Packit Service d3d246
    {
Packit Service d3d246
	$upper[$code] = make_hex ($fields[$UPPER]);
Packit Service d3d246
	$lower[$code] = pack ("U", hex ($fields[$LOWER]));
Packit Service d3d246
	$title[$code] = make_hex ($fields[$LOWER]);
Packit Service d3d246
    }
Packit Service d3d246
}
Packit Service d3d246
Packit Service d3d246
sub print_tests
Packit Service d3d246
{
Packit Service d3d246
    for ($i = 0; $i < 0x10ffff; $i++) {
Packit Service d3d246
	if ($i == 0x3A3) {
Packit Service d3d246
	    # Greek sigma needs special tests
Packit Service d3d246
	    next;
Packit Service d3d246
	}
Packit Service d3d246
	
Packit Service d3d246
	my $lower = $lower[$i];
Packit Service d3d246
	my $title = $title[$i];
Packit Service d3d246
	my $upper = $upper[$i];
Packit Service d3d246
Packit Service d3d246
	if (defined $upper || defined $lower || defined $title) {
Packit Service d3d246
	    printf "\t%s\t%s\t%s\t%s\t# %4X\n",
Packit Service d3d246
		    pack ("U", $i),
Packit Service d3d246
		    (defined $lower ? $lower : ""),
Packit Service d3d246
		    (defined $title ? $title : ""),
Packit Service d3d246
		    (defined $upper ? $upper : ""),
Packit Service d3d246
                    $i;
Packit Service d3d246
	}
Packit Service d3d246
    }
Packit Service d3d246
}
Packit Service d3d246
Packit Service d3d246
sub make_hex
Packit Service d3d246
{
Packit Service d3d246
    my $codes = shift;
Packit Service d3d246
Packit Service d3d246
    $codes =~ s/^\s+//;
Packit Service d3d246
    $codes =~ s/\s+$//;
Packit Service d3d246
Packit Service d3d246
    if ($codes eq "0" || $codes eq "") {
Packit Service d3d246
	return "";
Packit Service d3d246
    } else {
Packit Service d3d246
	return pack ("U*", map { hex ($_) } split /\s+/, $codes);
Packit Service d3d246
    }
Packit Service d3d246
}