diff options
Diffstat (limited to 'build/make-aliases.pl')
-rw-r--r-- | build/make-aliases.pl | 124 |
1 files changed, 124 insertions, 0 deletions
diff --git a/build/make-aliases.pl b/build/make-aliases.pl new file mode 100644 index 0000000..f677c06 --- /dev/null +++ b/build/make-aliases.pl @@ -0,0 +1,124 @@ +#!/usr/bin/perl -w +# This file is part of LibParserUtils. +# Licensed under the MIT License, +# http://www.opensource.org/licenses/mit-license.php +# Copyright 2010 Daniel Silverstone <dsilvers@netsurf-browser.org> +# John-Mark Bell <jmb@netsurf-browser.org> + +use strict; + +use constant ALIAS_FILE => 'build/Aliases'; +use constant ALIAS_INC => 'src/charset/aliases.inc'; + +use constant UNICODE_CHARSETS => + [ + qr'^ISO-10646-UCS-[24]$', + qr'^UTF-16', + qr'^UTF-8$', + qr'^UTF-32' + ]; + +open(INFILE, "<", ALIAS_FILE) || die "Unable to open " . ALIAS_FILE; + +my %charsets; + +while (my $line = <INFILE>) { + last unless (defined $line); + next if ($line =~ /^#/); + chomp $line; + next if ($line eq ''); + my @elements = split /\s+/, $line; + my $canon = shift @elements; + my $mibenum = shift @elements; + $charsets{$canon} = [$mibenum, \@elements]; +} + +close(INFILE); + +my $unicodeexp = ""; + +my $output = <<'EOH'; +/* + * This file is part of LibParserUtils. + * Licensed under the MIT License, + * http://www.opensource.org/licenses/mit-license.php + * Copyright 2010 The NetSurf Project. + * + * Note: This file is automatically generated by make-aliases.pl + * + * Do not edit file file, changes will be overwritten during build. + */ + +static parserutils_charset_aliases_canon canonical_charset_names[] = { +EOH + +my %aliases; +my $canonnr = 0; +foreach my $canon (sort keys %charsets) { + my ($mibenum, $elements) = @{$charsets{$canon}}; + # Ordering must match struct in src/charset/aliases.h + $output .= "\t{ " . $mibenum . ", " . length($canon) . ', "' . $canon . '" },' . "\n"; + my $isunicode = 0; + foreach my $unirexp (@{UNICODE_CHARSETS()}) { + $isunicode = 1 if ($canon =~ $unirexp); + } + if ($isunicode == 1) { + $unicodeexp .= "((x) == $mibenum) || "; + } + $canon =~ y/A-Z/a-z/; + $canon =~ s/[^a-z0-9]//g; + $aliases{$canon} = $canonnr; + foreach my $alias (@$elements) { + $alias =~ y/A-Z/a-z/; + $alias =~ s/[^a-z0-9]//g; + $aliases{$alias} = $canonnr; + } + $canonnr += 1; +} + +$output .= "};\n\nstatic const uint16_t charset_aliases_canon_count = ${canonnr};\n\n"; + +$output .= <<'EOT'; +typedef struct { + uint16_t name_len; + const char *name; + parserutils_charset_aliases_canon *canon; +} parserutils_charset_aliases_alias; + +static parserutils_charset_aliases_alias charset_aliases[] = { +EOT + +my $aliascount = 0; + +foreach my $alias (sort keys %aliases) { + my $canonnr = $aliases{$alias}; + $output .= "\t{ " . length($alias) . ', "' . $alias . '", &canonical_charset_names[' . $canonnr . "] },\n"; + $aliascount += 1; +} + +$output .= "};\n\n"; + +# Drop the final " || " +chop $unicodeexp; +chop $unicodeexp; +chop $unicodeexp; +chop $unicodeexp; + +$output .= <<"EOS"; +static const uint16_t charset_aliases_count = ${aliascount}; + +#define MIBENUM_IS_UNICODE(x) ($unicodeexp) +EOS + +if (open(EXISTING, "<", ALIAS_INC)) { + local $/ = undef(); + my $now = <EXISTING>; + undef($output) if ($output eq $now); + close(EXISTING); +} + +if (defined($output)) { + open(OUTF, ">", ALIAS_INC); + print OUTF $output; + close(OUTF); +} |