intl/chardet/tools/genverifier.pm

changeset 0
6474c204b198
     1.1 --- /dev/null	Thu Jan 01 00:00:00 1970 +0000
     1.2 +++ b/intl/chardet/tools/genverifier.pm	Wed Dec 31 06:09:35 2014 +0100
     1.3 @@ -0,0 +1,175 @@
     1.4 +#!/usr/local/bin/perl
     1.5 +
     1.6 +# This Source Code Form is subject to the terms of the Mozilla Public
     1.7 +# License, v. 2.0. If a copy of the MPL was not distributed with this
     1.8 +# file, You can obtain one at http://mozilla.org/MPL/2.0/.
     1.9 +
    1.10 +package genverifier;
    1.11 +use strict;
    1.12 +use vars qw(@ISA @EXPORT @EXPORT_OK $VERSION);
    1.13 +
    1.14 +use Exporter;
    1.15 +$VERSION = 1.00;
    1.16 +@ISA = qw(Exporter);
    1.17 +
    1.18 +@EXPORT       = qw(
    1.19 +                   GenVerifier
    1.20 +                  );
    1.21 +@EXPORT_OK    = qw();
    1.22 +
    1.23 +sub GenNPL {
    1.24 +  my($ret) = << "END_MPL";
    1.25 +/* -*- Mode: C; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
    1.26 +/* This Source Code Form is subject to the terms of the Mozilla Public
    1.27 + * License, v. 2.0. If a copy of the MPL was not distributed with this
    1.28 + * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
    1.29 +END_MPL
    1.30 +
    1.31 +  return $ret;
    1.32 +}
    1.33 +
    1.34 +##--------------------------------------------------------------
    1.35 +sub GetClass {
    1.36 +  my($char, $clstbl) = @_;
    1.37 +  my($l);
    1.38 +  for($l =0; $l <= @$clstbl; $l++) {
    1.39 +    if(($clstbl->[$l][0] <= $char) && ($char <= $clstbl->[$l][1]))
    1.40 +    {
    1.41 +          return $clstbl->[$l][2];
    1.42 +    }
    1.43 +  }
    1.44 +  print "WARNING- there are no class for $char\n";
    1.45 +};
    1.46 +##--------------------------------------------------------------
    1.47 +sub GenClassPkg {
    1.48 +  my($name, $bits) = @_;
    1.49 +  return GenPkg($name, $bits, "_cls");
    1.50 +}
    1.51 +##--------------------------------------------------------------
    1.52 +sub GenStatePkg {
    1.53 +  my($name, $bits) = @_;
    1.54 +  return GenPkg($name, $bits, "_st");
    1.55 +};
    1.56 +##--------------------------------------------------------------
    1.57 +sub GenPkg {
    1.58 +  my($name, $bits, $tbl) = @_;
    1.59 +  my($ret);
    1.60 +  $ret = "  {" .
    1.61 +         "eIdxSft"  . $bits . "bits, " .
    1.62 +         "eSftMsk"  . $bits . "bits, " .
    1.63 +         "eBitSft"  . $bits . "bits, " .
    1.64 +         "eUnitMsk" . $bits . "bits, " .
    1.65 +         $name . $tbl . "" .
    1.66 +        " }";
    1.67 +  return $ret;
    1.68 +};
    1.69 +##--------------------------------------------------------------
    1.70 +sub Gen4BitsClass {
    1.71 +  my($name, $clstbl) = @_;
    1.72 +  my($i,$j);
    1.73 +  my($cls);
    1.74 +  my($ret);
    1.75 +  $ret = "";
    1.76 +  $ret .= "static const uint32_t " . $name . "_cls [ 256 / 8 ] = {\n";
    1.77 +  for($i = 0; $i < 0x100; $i+= 8) {
    1.78 +     $ret .= "PCK4BITS(";
    1.79 +     for($j = $i; $j < $i + 8; $j++) {
    1.80 +         $cls = &GetClass($j,$clstbl);
    1.81 +         $ret .= sprintf("%2d", $cls) ;
    1.82 +         if($j != ($i+7)) {
    1.83 +            $ret .= ",";
    1.84 +         }
    1.85 +     }
    1.86 +     if( $i+8 >= 0x100) {
    1.87 +        $ret .= ") ";
    1.88 +     } else {
    1.89 +        $ret .= "),";
    1.90 +     }
    1.91 +     $ret .= sprintf("  // %02x - %02x\n", $i, ($i+7));
    1.92 +  }
    1.93 +  $ret .= "};\n";
    1.94 +  return $ret;
    1.95 +};
    1.96 +##--------------------------------------------------------------
    1.97 +sub GenVerifier {
    1.98 +  my($name, $charset, $cls, $numcls, $st) = @_;
    1.99 +  my($ret);
   1.100 +  $ret = GenNPL();
   1.101 +  $ret .= GenNote();
   1.102 +  $ret .= GenHeader();
   1.103 +  $ret .= Gen4BitsClass($name, $cls);
   1.104 +  $ret .= "\n\n";
   1.105 +  $ret .= Gen4BitsState($name, $st);
   1.106 +  $ret .= "\n\n";
   1.107 +  $ret .= "const SMModel " . $name . "SMModel = {\n";
   1.108 +  $ret .= GenClassPkg($name, 4);
   1.109 +  $ret .= ",\n";
   1.110 +  $ret .= "   " . $numcls;
   1.111 +  $ret .= ",\n";
   1.112 +  $ret .= GenStatePkg($name, 4);
   1.113 +  $ret .= ",\n";
   1.114 +  $ret .= "  " . "CHAR_LEN_TABLE(" . $name . "CharLenTable),\n";
   1.115 +  $ret .= '  "' . $charset . '",' . "\n";
   1.116 +  $ret .= "};\n";
   1.117 +  return $ret;
   1.118 +
   1.119 +};
   1.120 +##--------------------------------------------------------------
   1.121 +sub Gen4BitsState {
   1.122 +  my($name, $sttbl) = @_;
   1.123 +  my($lenafterpad) = (((@$sttbl-1) >> 3) + 1) << 3;
   1.124 +  my($i,$j);
   1.125 +  my($ret);
   1.126 +  $ret = "";
   1.127 +  $ret .= "static const uint32_t " . $name . "_st [ " . ($lenafterpad >> 3) . "] = {\n";
   1.128 +  for($i = 0; $i < $lenafterpad ; $i+= 8) {
   1.129 +     $ret .= "PCK4BITS(";
   1.130 +     for($j = $i; $j < $i + 8; $j++) {
   1.131 +         if(0 == $sttbl->[$j]) {
   1.132 +              $ret .= "eStart";
   1.133 +         } else { if(1 == $sttbl->[$j]) {
   1.134 +              $ret .= "eError";
   1.135 +         } else { if(2 == $sttbl->[$j]) {
   1.136 +              $ret .= "eItsMe";
   1.137 +         } else {
   1.138 +              $ret .= sprintf("     %d", $sttbl->[$j]) ;
   1.139 +         }}}
   1.140 +         if($j != ($i+7)) {
   1.141 +            $ret .= ",";
   1.142 +         }
   1.143 +     }
   1.144 +     if( $i+8 >= $lenafterpad ) {
   1.145 +        $ret .= ") ";
   1.146 +     } else {
   1.147 +        $ret .= "),";
   1.148 +     }
   1.149 +     $ret .= sprintf("  // %02x - %02x\n", $i, ($i+7));
   1.150 +  }
   1.151 +  $ret .= "};\n";
   1.152 +  return $ret;
   1.153 +};
   1.154 +##--------------------------------------------------------------
   1.155 +
   1.156 +sub GenNote {
   1.157 +  my($ret) = << "END_NOTE";
   1.158 +/*
   1.159 + * DO NOT EDIT THIS DOCUMENT MANUALLY !!!
   1.160 + * THIS FILE IS AUTOMATICALLY GENERATED BY THE TOOLS UNDER
   1.161 + *    mozilla/intl/chardet/tools/
   1.162 + * Please contact ftang\@netscape.com or mozilla-i18n\@mozilla.org
   1.163 + * if you have any question. Thanks
   1.164 + */
   1.165 +END_NOTE
   1.166 +  return $ret;
   1.167 +}
   1.168 +
   1.169 +##--------------------------------------------------------------
   1.170 +sub GenHeader {
   1.171 +  my($ret) = << "END_HEADER";
   1.172 +#include "nsVerifier.h"
   1.173 +END_HEADER
   1.174 +
   1.175 +  return $ret;
   1.176 +}
   1.177 +##--------------------------------------------------------------
   1.178 +1; # this should be the last line

mercurial