dftables revision 8e35f3cfc7fba1d1c829dc557ebad6409cbe16a2
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 118e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project# Copyright (C) 2002, 2004, 2006, 2007, 2008 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" . 878e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project "const unsigned char kjs_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", 2478e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project DIR => ($ENV{'TMPDIR'} || "/tmp"), 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 $@; 2728e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 273