intl/chardet/tools/genverifier.pm

branch
TOR_BUG_9701
changeset 8
97036ab72558
equal deleted inserted replaced
-1:000000000000 0:d8be7350e774
1 #!/usr/local/bin/perl
2
3 # This Source Code Form is subject to the terms of the Mozilla Public
4 # License, v. 2.0. If a copy of the MPL was not distributed with this
5 # file, You can obtain one at http://mozilla.org/MPL/2.0/.
6
7 package genverifier;
8 use strict;
9 use vars qw(@ISA @EXPORT @EXPORT_OK $VERSION);
10
11 use Exporter;
12 $VERSION = 1.00;
13 @ISA = qw(Exporter);
14
15 @EXPORT = qw(
16 GenVerifier
17 );
18 @EXPORT_OK = qw();
19
20 sub GenNPL {
21 my($ret) = << "END_MPL";
22 /* -*- Mode: C; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
23 /* This Source Code Form is subject to the terms of the Mozilla Public
24 * License, v. 2.0. If a copy of the MPL was not distributed with this
25 * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
26 END_MPL
27
28 return $ret;
29 }
30
31 ##--------------------------------------------------------------
32 sub GetClass {
33 my($char, $clstbl) = @_;
34 my($l);
35 for($l =0; $l <= @$clstbl; $l++) {
36 if(($clstbl->[$l][0] <= $char) && ($char <= $clstbl->[$l][1]))
37 {
38 return $clstbl->[$l][2];
39 }
40 }
41 print "WARNING- there are no class for $char\n";
42 };
43 ##--------------------------------------------------------------
44 sub GenClassPkg {
45 my($name, $bits) = @_;
46 return GenPkg($name, $bits, "_cls");
47 }
48 ##--------------------------------------------------------------
49 sub GenStatePkg {
50 my($name, $bits) = @_;
51 return GenPkg($name, $bits, "_st");
52 };
53 ##--------------------------------------------------------------
54 sub GenPkg {
55 my($name, $bits, $tbl) = @_;
56 my($ret);
57 $ret = " {" .
58 "eIdxSft" . $bits . "bits, " .
59 "eSftMsk" . $bits . "bits, " .
60 "eBitSft" . $bits . "bits, " .
61 "eUnitMsk" . $bits . "bits, " .
62 $name . $tbl . "" .
63 " }";
64 return $ret;
65 };
66 ##--------------------------------------------------------------
67 sub Gen4BitsClass {
68 my($name, $clstbl) = @_;
69 my($i,$j);
70 my($cls);
71 my($ret);
72 $ret = "";
73 $ret .= "static const uint32_t " . $name . "_cls [ 256 / 8 ] = {\n";
74 for($i = 0; $i < 0x100; $i+= 8) {
75 $ret .= "PCK4BITS(";
76 for($j = $i; $j < $i + 8; $j++) {
77 $cls = &GetClass($j,$clstbl);
78 $ret .= sprintf("%2d", $cls) ;
79 if($j != ($i+7)) {
80 $ret .= ",";
81 }
82 }
83 if( $i+8 >= 0x100) {
84 $ret .= ") ";
85 } else {
86 $ret .= "),";
87 }
88 $ret .= sprintf(" // %02x - %02x\n", $i, ($i+7));
89 }
90 $ret .= "};\n";
91 return $ret;
92 };
93 ##--------------------------------------------------------------
94 sub GenVerifier {
95 my($name, $charset, $cls, $numcls, $st) = @_;
96 my($ret);
97 $ret = GenNPL();
98 $ret .= GenNote();
99 $ret .= GenHeader();
100 $ret .= Gen4BitsClass($name, $cls);
101 $ret .= "\n\n";
102 $ret .= Gen4BitsState($name, $st);
103 $ret .= "\n\n";
104 $ret .= "const SMModel " . $name . "SMModel = {\n";
105 $ret .= GenClassPkg($name, 4);
106 $ret .= ",\n";
107 $ret .= " " . $numcls;
108 $ret .= ",\n";
109 $ret .= GenStatePkg($name, 4);
110 $ret .= ",\n";
111 $ret .= " " . "CHAR_LEN_TABLE(" . $name . "CharLenTable),\n";
112 $ret .= ' "' . $charset . '",' . "\n";
113 $ret .= "};\n";
114 return $ret;
115
116 };
117 ##--------------------------------------------------------------
118 sub Gen4BitsState {
119 my($name, $sttbl) = @_;
120 my($lenafterpad) = (((@$sttbl-1) >> 3) + 1) << 3;
121 my($i,$j);
122 my($ret);
123 $ret = "";
124 $ret .= "static const uint32_t " . $name . "_st [ " . ($lenafterpad >> 3) . "] = {\n";
125 for($i = 0; $i < $lenafterpad ; $i+= 8) {
126 $ret .= "PCK4BITS(";
127 for($j = $i; $j < $i + 8; $j++) {
128 if(0 == $sttbl->[$j]) {
129 $ret .= "eStart";
130 } else { if(1 == $sttbl->[$j]) {
131 $ret .= "eError";
132 } else { if(2 == $sttbl->[$j]) {
133 $ret .= "eItsMe";
134 } else {
135 $ret .= sprintf(" %d", $sttbl->[$j]) ;
136 }}}
137 if($j != ($i+7)) {
138 $ret .= ",";
139 }
140 }
141 if( $i+8 >= $lenafterpad ) {
142 $ret .= ") ";
143 } else {
144 $ret .= "),";
145 }
146 $ret .= sprintf(" // %02x - %02x\n", $i, ($i+7));
147 }
148 $ret .= "};\n";
149 return $ret;
150 };
151 ##--------------------------------------------------------------
152
153 sub GenNote {
154 my($ret) = << "END_NOTE";
155 /*
156 * DO NOT EDIT THIS DOCUMENT MANUALLY !!!
157 * THIS FILE IS AUTOMATICALLY GENERATED BY THE TOOLS UNDER
158 * mozilla/intl/chardet/tools/
159 * Please contact ftang\@netscape.com or mozilla-i18n\@mozilla.org
160 * if you have any question. Thanks
161 */
162 END_NOTE
163 return $ret;
164 }
165
166 ##--------------------------------------------------------------
167 sub GenHeader {
168 my($ret) = << "END_HEADER";
169 #include "nsVerifier.h"
170 END_HEADER
171
172 return $ret;
173 }
174 ##--------------------------------------------------------------
175 1; # this should be the last line

mercurial