18e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#!/usr/bin/perl -w
28e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#
38e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project# This is JavaScriptCore's variant of the PCRE library. While this library
48e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project# started out as a copy of PCRE, many of the features of PCRE have been
58e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project# removed. This library now supports only the regular expression features
68e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project# required by the JavaScript language specification, and has only the functions
78e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project# needed by JavaScriptCore and the rest of WebKit.
88e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project# 
98e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#                  Originally written by Philip Hazel
108e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#            Copyright (c) 1997-2006 University of Cambridge
11635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project#  Copyright (C) 2002, 2004, 2006, 2007, 2008, 2009 Apple Inc.  All rights reserved.
128e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project# 
138e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project# -----------------------------------------------------------------------------
148e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project# Redistribution and use in source and binary forms, with or without
158e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project# modification, are permitted provided that the following conditions are met:
168e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project# 
178e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#     * Redistributions of source code must retain the above copyright notice,
188e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#       this list of conditions and the following disclaimer.
198e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project# 
208e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#     * Redistributions in binary form must reproduce the above copyright
218e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#       notice, this list of conditions and the following disclaimer in the
228e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#       documentation and/or other materials provided with the distribution.
238e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project# 
248e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#     * Neither the name of the University of Cambridge nor the names of its
258e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#       contributors may be used to endorse or promote products derived from
268e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#       this software without specific prior written permission.
278e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project# 
288e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
298e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project# AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
308e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
318e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project# ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
328e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project# LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
338e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project# CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
348e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project# SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
358e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project# INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
368e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project# CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
378e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project# ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
388e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project# POSSIBILITY OF SUCH DAMAGE.
398e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project# -----------------------------------------------------------------------------
408e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
418e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project# This is a freestanding support program to generate a file containing
428e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project# character tables. The tables are built according to the default C
438e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project# locale.
448e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
458e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectuse strict;
468e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
478e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectuse File::Basename;
488e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectuse File::Spec;
498e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectuse File::Temp qw(tempfile);
508e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectuse Getopt::Long;
518e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
528e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectsub readHeaderValues();
538e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
548e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectmy %pcre_internal;
558e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
568e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectif (scalar(@ARGV) < 1) {
578e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    print STDERR "Usage: ", basename($0), " [--preprocessor=program] output-file\n";
588e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    exit 1;
598e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
608e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
618e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectmy $outputFile;
628e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectmy $preprocessor;
638e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source ProjectGetOptions('preprocessor=s' => \$preprocessor);
648e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectif (not $preprocessor) {
658e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    $preprocessor = "cpp";
668e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
678e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
688e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project$outputFile = $ARGV[0];
698e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectdie('Must specify output file.') unless defined($outputFile);
708e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
718e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source ProjectreadHeaderValues();
728e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
738e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectopen(OUT, ">", $outputFile) or die "$!";
748e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectbinmode(OUT);
758e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
768e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectprintf(OUT
778e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    "/*************************************************\n" .
788e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    "*      Perl-Compatible Regular Expressions       *\n" .
798e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    "*************************************************/\n\n" .
808e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    "/* This file is automatically written by the dftables auxiliary \n" .
818e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    "program. If you edit it by hand, you might like to edit the Makefile to \n" .
828e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    "prevent its ever being regenerated.\n\n");
838e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectprintf(OUT
848e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    "This file contains the default tables for characters with codes less than\n" .
858e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    "128 (ASCII characters). These tables are used when no external tables are\n" .
868e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    "passed to PCRE. */\n\n" .
87635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project    "const unsigned char jsc_pcre_default_tables[%d] = {\n\n" .
888e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    "/* This table is a lower casing table. */\n\n", $pcre_internal{tables_length});
898e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
908e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectif ($pcre_internal{lcc_offset} != 0) {
918e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    die "lcc_offset != 0";
928e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
938e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
948e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectprintf(OUT "  ");
958e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectfor (my $i = 0; $i < 128; $i++) {
968e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    if (($i & 7) == 0 && $i != 0) {
978e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        printf(OUT "\n  ");
988e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    }
998e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    printf(OUT "0x%02X", ord(lc(chr($i))));
1008e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    if ($i != 127) {
1018e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        printf(OUT ", ");
1028e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    }
1038e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
1048e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectprintf(OUT ",\n\n");
1058e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
1068e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectprintf(OUT "/* This table is a case flipping table. */\n\n");
1078e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
1088e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectif ($pcre_internal{fcc_offset} != 128) {
1098e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project  die "fcc_offset != 128";
1108e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
1118e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
1128e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectprintf(OUT "  ");
1138e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectfor (my $i = 0; $i < 128; $i++) {
1148e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    if (($i & 7) == 0 && $i != 0) {
1158e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        printf(OUT "\n  ");
1168e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    }
1178e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    my $c = chr($i);
1188e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    printf(OUT "0x%02X", $c =~ /[[:lower:]]/ ? ord(uc($c)) : ord(lc($c)));
1198e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    if ($i != 127) {
1208e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        printf(OUT ", ");
1218e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    }
1228e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
1238e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectprintf(OUT ",\n\n");
1248e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
1258e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectprintf(OUT
1268e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    "/* This table contains bit maps for various character classes.\n" .
1278e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    "Each map is 32 bytes long and the bits run from the least\n" .
1288e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    "significant end of each byte. The classes are: space, digit, word. */\n\n");
1298e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
1308e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectif ($pcre_internal{cbits_offset} != $pcre_internal{fcc_offset} + 128) {
1318e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    die "cbits_offset != fcc_offset + 128";
1328e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
1338e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
1348e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectmy @cbit_table = (0) x $pcre_internal{cbit_length};
1358e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectfor (my $i = ord('0'); $i <= ord('9'); $i++) {
1368e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    $cbit_table[$pcre_internal{cbit_digit} + $i / 8] |= 1 << ($i & 7);
1378e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
1388e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project$cbit_table[$pcre_internal{cbit_word} + ord('_') / 8] |= 1 << (ord('_') & 7);
1398e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectfor (my $i = 0; $i < 128; $i++) {
1408e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    my $c = chr($i);
1418e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    if ($c =~ /[[:alnum:]]/) {
1428e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        $cbit_table[$pcre_internal{cbit_word} + $i / 8] |= 1 << ($i & 7);
1438e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    }
1448e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    if ($c =~ /[[:space:]]/) {
1458e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        $cbit_table[$pcre_internal{cbit_space} + $i / 8] |= 1 << ($i & 7);
1468e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    }
1478e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
1488e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
1498e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectprintf(OUT "  ");
1508e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectfor (my $i = 0; $i < $pcre_internal{cbit_length}; $i++) {
1518e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    if (($i & 7) == 0 && $i != 0) {
1528e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        if (($i & 31) == 0) {
1538e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            printf(OUT "\n");
1548e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        }
1558e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        printf(OUT "\n  ");
1568e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    }
1578e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    printf(OUT "0x%02X", $cbit_table[$i]);
1588e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    if ($i != $pcre_internal{cbit_length} - 1) {
1598e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        printf(OUT ", ");
1608e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    }
1618e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
1628e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectprintf(OUT ",\n\n");
1638e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
1648e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectprintf(OUT
1658e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    "/* This table identifies various classes of character by individual bits:\n" .
1668e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    "  0x%02x   white space character\n" .
1678e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    "  0x%02x   hexadecimal digit\n" .
1688e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    "  0x%02x   alphanumeric or '_'\n*/\n\n",
1698e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    $pcre_internal{ctype_space}, $pcre_internal{ctype_xdigit}, $pcre_internal{ctype_word});
1708e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
1718e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectif ($pcre_internal{ctypes_offset} != $pcre_internal{cbits_offset} + $pcre_internal{cbit_length}) {
1728e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    die "ctypes_offset != cbits_offset + cbit_length";
1738e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
1748e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
1758e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectprintf(OUT "  ");
1768e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectfor (my $i = 0; $i < 128; $i++) {
1778e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    my $x = 0;
1788e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    my $c = chr($i);
1798e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    if ($c =~ /[[:space:]]/) {
1808e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        $x += $pcre_internal{ctype_space};
1818e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    }
1828e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    if ($c =~ /[[:xdigit:]]/) {
1838e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        $x += $pcre_internal{ctype_xdigit};
1848e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    }
1858e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    if ($c =~ /[[:alnum:]_]/) {
1868e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        $x += $pcre_internal{ctype_word};
1878e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    }
1888e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    printf(OUT "0x%02X", $x);
1898e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    if ($i != 127) {
1908e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        printf(OUT ", ");
1918e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    } else {
1928e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        printf(OUT "};");
1938e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    }
1948e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    if (($i & 7) == 7) {
1958e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        printf(OUT " /* ");
1968e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        my $d = chr($i - 7);
1978e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        if ($d =~ /[[:print:]]/) {
1988e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            printf(OUT " %c -", $i - 7);
1998e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        } else {
2008e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            printf(OUT "%3d-", $i - 7);
2018e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        }
2028e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        if ($c =~ m/[[:print:]]/) {
2038e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            printf(OUT " %c ", $i);
2048e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        } else {
2058e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            printf(OUT "%3d", $i);
2068e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        }
2078e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        printf(OUT " */\n");
2088e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        if ($i != 127) {
2098e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            printf(OUT "  ");
2108e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        }
2118e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    }
2128e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
2138e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
2148e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectif ($pcre_internal{tables_length} != $pcre_internal{ctypes_offset} + 128) {
2158e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    die "tables_length != ctypes_offset + 128";
2168e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
2178e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
2188e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectprintf(OUT "\n\n/* End of chartables.c */\n");
2198e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
2208e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectclose(OUT);
2218e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
2228e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectexit 0;
2238e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
2248e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectsub readHeaderValues()
2258e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
2268e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    my @variables = qw(
2278e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        cbit_digit
2288e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        cbit_length
2298e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        cbit_space
2308e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        cbit_word
2318e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        cbits_offset
2328e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        ctype_space
2338e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        ctype_word
2348e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        ctype_xdigit
2358e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        ctypes_offset
2368e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        fcc_offset
2378e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        lcc_offset
2388e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        tables_length
2398e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    );
2408e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
2418e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    local $/ = undef;
2428e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
2438e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    my $headerPath = File::Spec->catfile(dirname($0), "pcre_internal.h");
2448e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 
2458e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    my ($fh, $tempFile) = tempfile(
2468e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        basename($0) . "-XXXXXXXX",
247231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block        DIR => File::Spec->tmpdir(),
2488e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        SUFFIX => ".in",
2498e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        UNLINK => 0,
2508e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    );
2518e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
2528e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    print $fh "#define DFTABLES\n\n";
2538e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
2548e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    open(HEADER, "<", $headerPath) or die "$!";
2558e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    print $fh <HEADER>;
2568e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    close(HEADER);
2578e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
2588e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    print $fh "\n\n";
2598e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
2608e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    for my $v (@variables) {
2618e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        print $fh "\$pcre_internal{\"$v\"} = $v;\n";
2628e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    }
2638e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
2648e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    close($fh);
2658e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
2668e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    open(CPP, "$preprocessor \"$tempFile\" |") or die "$!";
2678e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    my $content = <CPP>;
2688e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    close(CPP);
2698e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    
2708e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    eval $content;
2718e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    die "$@" if $@;
272d0825bca7fe65beaee391d30da42e937db621564Steve Block    unlink $tempFile;
2738e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
274