Codebase list libjuniversalchardet-java / upstream/latest
Imported Upstream version 1.0.3 Emmanuel Bourg 10 years ago
71 changed file(s) with 0 addition(s) and 15365 deletion(s). Raw diff Collapse all Expand all
+0
-7
.classpath less more
0 <?xml version="1.0" encoding="UTF-8"?>
1 <classpath>
2 <classpathentry excluding="**/.svn/" kind="src" path="src"/>
3 <classpathentry kind="con" path="org.eclipse.jdt.launching.JRE_CONTAINER"/>
4 <classpathentry kind="con" path="org.eclipse.jdt.junit.JUNIT_CONTAINER/4"/>
5 <classpathentry kind="output" path="dist/classes"/>
6 </classpath>
+0
-17
.project less more
0 <?xml version="1.0" encoding="UTF-8"?>
1 <projectDescription>
2 <name>juniversalchardet</name>
3 <comment></comment>
4 <projects>
5 </projects>
6 <buildSpec>
7 <buildCommand>
8 <name>org.eclipse.jdt.core.javabuilder</name>
9 <arguments>
10 </arguments>
11 </buildCommand>
12 </buildSpec>
13 <natures>
14 <nature>org.eclipse.jdt.core.javanature</nature>
15 </natures>
16 </projectDescription>
+0
-470
c/MPL-1.1.txt less more
0 MOZILLA PUBLIC LICENSE
1 Version 1.1
2
3 ---------------
4
5 1. Definitions.
6
7 1.0.1. "Commercial Use" means distribution or otherwise making the
8 Covered Code available to a third party.
9
10 1.1. "Contributor" means each entity that creates or contributes to
11 the creation of Modifications.
12
13 1.2. "Contributor Version" means the combination of the Original
14 Code, prior Modifications used by a Contributor, and the Modifications
15 made by that particular Contributor.
16
17 1.3. "Covered Code" means the Original Code or Modifications or the
18 combination of the Original Code and Modifications, in each case
19 including portions thereof.
20
21 1.4. "Electronic Distribution Mechanism" means a mechanism generally
22 accepted in the software development community for the electronic
23 transfer of data.
24
25 1.5. "Executable" means Covered Code in any form other than Source
26 Code.
27
28 1.6. "Initial Developer" means the individual or entity identified
29 as the Initial Developer in the Source Code notice required by Exhibit
30 A.
31
32 1.7. "Larger Work" means a work which combines Covered Code or
33 portions thereof with code not governed by the terms of this License.
34
35 1.8. "License" means this document.
36
37 1.8.1. "Licensable" means having the right to grant, to the maximum
38 extent possible, whether at the time of the initial grant or
39 subsequently acquired, any and all of the rights conveyed herein.
40
41 1.9. "Modifications" means any addition to or deletion from the
42 substance or structure of either the Original Code or any previous
43 Modifications. When Covered Code is released as a series of files, a
44 Modification is:
45 A. Any addition to or deletion from the contents of a file
46 containing Original Code or previous Modifications.
47
48 B. Any new file that contains any part of the Original Code or
49 previous Modifications.
50
51 1.10. "Original Code" means Source Code of computer software code
52 which is described in the Source Code notice required by Exhibit A as
53 Original Code, and which, at the time of its release under this
54 License is not already Covered Code governed by this License.
55
56 1.10.1. "Patent Claims" means any patent claim(s), now owned or
57 hereafter acquired, including without limitation, method, process,
58 and apparatus claims, in any patent Licensable by grantor.
59
60 1.11. "Source Code" means the preferred form of the Covered Code for
61 making modifications to it, including all modules it contains, plus
62 any associated interface definition files, scripts used to control
63 compilation and installation of an Executable, or source code
64 differential comparisons against either the Original Code or another
65 well known, available Covered Code of the Contributor's choice. The
66 Source Code can be in a compressed or archival form, provided the
67 appropriate decompression or de-archiving software is widely available
68 for no charge.
69
70 1.12. "You" (or "Your") means an individual or a legal entity
71 exercising rights under, and complying with all of the terms of, this
72 License or a future version of this License issued under Section 6.1.
73 For legal entities, "You" includes any entity which controls, is
74 controlled by, or is under common control with You. For purposes of
75 this definition, "control" means (a) the power, direct or indirect,
76 to cause the direction or management of such entity, whether by
77 contract or otherwise, or (b) ownership of more than fifty percent
78 (50%) of the outstanding shares or beneficial ownership of such
79 entity.
80
81 2. Source Code License.
82
83 2.1. The Initial Developer Grant.
84 The Initial Developer hereby grants You a world-wide, royalty-free,
85 non-exclusive license, subject to third party intellectual property
86 claims:
87 (a) under intellectual property rights (other than patent or
88 trademark) Licensable by Initial Developer to use, reproduce,
89 modify, display, perform, sublicense and distribute the Original
90 Code (or portions thereof) with or without Modifications, and/or
91 as part of a Larger Work; and
92
93 (b) under Patents Claims infringed by the making, using or
94 selling of Original Code, to make, have made, use, practice,
95 sell, and offer for sale, and/or otherwise dispose of the
96 Original Code (or portions thereof).
97
98 (c) the licenses granted in this Section 2.1(a) and (b) are
99 effective on the date Initial Developer first distributes
100 Original Code under the terms of this License.
101
102 (d) Notwithstanding Section 2.1(b) above, no patent license is
103 granted: 1) for code that You delete from the Original Code; 2)
104 separate from the Original Code; or 3) for infringements caused
105 by: i) the modification of the Original Code or ii) the
106 combination of the Original Code with other software or devices.
107
108 2.2. Contributor Grant.
109 Subject to third party intellectual property claims, each Contributor
110 hereby grants You a world-wide, royalty-free, non-exclusive license
111
112 (a) under intellectual property rights (other than patent or
113 trademark) Licensable by Contributor, to use, reproduce, modify,
114 display, perform, sublicense and distribute the Modifications
115 created by such Contributor (or portions thereof) either on an
116 unmodified basis, with other Modifications, as Covered Code
117 and/or as part of a Larger Work; and
118
119 (b) under Patent Claims infringed by the making, using, or
120 selling of Modifications made by that Contributor either alone
121 and/or in combination with its Contributor Version (or portions
122 of such combination), to make, use, sell, offer for sale, have
123 made, and/or otherwise dispose of: 1) Modifications made by that
124 Contributor (or portions thereof); and 2) the combination of
125 Modifications made by that Contributor with its Contributor
126 Version (or portions of such combination).
127
128 (c) the licenses granted in Sections 2.2(a) and 2.2(b) are
129 effective on the date Contributor first makes Commercial Use of
130 the Covered Code.
131
132 (d) Notwithstanding Section 2.2(b) above, no patent license is
133 granted: 1) for any code that Contributor has deleted from the
134 Contributor Version; 2) separate from the Contributor Version;
135 3) for infringements caused by: i) third party modifications of
136 Contributor Version or ii) the combination of Modifications made
137 by that Contributor with other software (except as part of the
138 Contributor Version) or other devices; or 4) under Patent Claims
139 infringed by Covered Code in the absence of Modifications made by
140 that Contributor.
141
142 3. Distribution Obligations.
143
144 3.1. Application of License.
145 The Modifications which You create or to which You contribute are
146 governed by the terms of this License, including without limitation
147 Section 2.2. The Source Code version of Covered Code may be
148 distributed only under the terms of this License or a future version
149 of this License released under Section 6.1, and You must include a
150 copy of this License with every copy of the Source Code You
151 distribute. You may not offer or impose any terms on any Source Code
152 version that alters or restricts the applicable version of this
153 License or the recipients' rights hereunder. However, You may include
154 an additional document offering the additional rights described in
155 Section 3.5.
156
157 3.2. Availability of Source Code.
158 Any Modification which You create or to which You contribute must be
159 made available in Source Code form under the terms of this License
160 either on the same media as an Executable version or via an accepted
161 Electronic Distribution Mechanism to anyone to whom you made an
162 Executable version available; and if made available via Electronic
163 Distribution Mechanism, must remain available for at least twelve (12)
164 months after the date it initially became available, or at least six
165 (6) months after a subsequent version of that particular Modification
166 has been made available to such recipients. You are responsible for
167 ensuring that the Source Code version remains available even if the
168 Electronic Distribution Mechanism is maintained by a third party.
169
170 3.3. Description of Modifications.
171 You must cause all Covered Code to which You contribute to contain a
172 file documenting the changes You made to create that Covered Code and
173 the date of any change. You must include a prominent statement that
174 the Modification is derived, directly or indirectly, from Original
175 Code provided by the Initial Developer and including the name of the
176 Initial Developer in (a) the Source Code, and (b) in any notice in an
177 Executable version or related documentation in which You describe the
178 origin or ownership of the Covered Code.
179
180 3.4. Intellectual Property Matters
181 (a) Third Party Claims.
182 If Contributor has knowledge that a license under a third party's
183 intellectual property rights is required to exercise the rights
184 granted by such Contributor under Sections 2.1 or 2.2,
185 Contributor must include a text file with the Source Code
186 distribution titled "LEGAL" which describes the claim and the
187 party making the claim in sufficient detail that a recipient will
188 know whom to contact. If Contributor obtains such knowledge after
189 the Modification is made available as described in Section 3.2,
190 Contributor shall promptly modify the LEGAL file in all copies
191 Contributor makes available thereafter and shall take other steps
192 (such as notifying appropriate mailing lists or newsgroups)
193 reasonably calculated to inform those who received the Covered
194 Code that new knowledge has been obtained.
195
196 (b) Contributor APIs.
197 If Contributor's Modifications include an application programming
198 interface and Contributor has knowledge of patent licenses which
199 are reasonably necessary to implement that API, Contributor must
200 also include this information in the LEGAL file.
201
202 (c) Representations.
203 Contributor represents that, except as disclosed pursuant to
204 Section 3.4(a) above, Contributor believes that Contributor's
205 Modifications are Contributor's original creation(s) and/or
206 Contributor has sufficient rights to grant the rights conveyed by
207 this License.
208
209 3.5. Required Notices.
210 You must duplicate the notice in Exhibit A in each file of the Source
211 Code. If it is not possible to put such notice in a particular Source
212 Code file due to its structure, then You must include such notice in a
213 location (such as a relevant directory) where a user would be likely
214 to look for such a notice. If You created one or more Modification(s)
215 You may add your name as a Contributor to the notice described in
216 Exhibit A. You must also duplicate this License in any documentation
217 for the Source Code where You describe recipients' rights or ownership
218 rights relating to Covered Code. You may choose to offer, and to
219 charge a fee for, warranty, support, indemnity or liability
220 obligations to one or more recipients of Covered Code. However, You
221 may do so only on Your own behalf, and not on behalf of the Initial
222 Developer or any Contributor. You must make it absolutely clear than
223 any such warranty, support, indemnity or liability obligation is
224 offered by You alone, and You hereby agree to indemnify the Initial
225 Developer and every Contributor for any liability incurred by the
226 Initial Developer or such Contributor as a result of warranty,
227 support, indemnity or liability terms You offer.
228
229 3.6. Distribution of Executable Versions.
230 You may distribute Covered Code in Executable form only if the
231 requirements of Section 3.1-3.5 have been met for that Covered Code,
232 and if You include a notice stating that the Source Code version of
233 the Covered Code is available under the terms of this License,
234 including a description of how and where You have fulfilled the
235 obligations of Section 3.2. The notice must be conspicuously included
236 in any notice in an Executable version, related documentation or
237 collateral in which You describe recipients' rights relating to the
238 Covered Code. You may distribute the Executable version of Covered
239 Code or ownership rights under a license of Your choice, which may
240 contain terms different from this License, provided that You are in
241 compliance with the terms of this License and that the license for the
242 Executable version does not attempt to limit or alter the recipient's
243 rights in the Source Code version from the rights set forth in this
244 License. If You distribute the Executable version under a different
245 license You must make it absolutely clear that any terms which differ
246 from this License are offered by You alone, not by the Initial
247 Developer or any Contributor. You hereby agree to indemnify the
248 Initial Developer and every Contributor for any liability incurred by
249 the Initial Developer or such Contributor as a result of any such
250 terms You offer.
251
252 3.7. Larger Works.
253 You may create a Larger Work by combining Covered Code with other code
254 not governed by the terms of this License and distribute the Larger
255 Work as a single product. In such a case, You must make sure the
256 requirements of this License are fulfilled for the Covered Code.
257
258 4. Inability to Comply Due to Statute or Regulation.
259
260 If it is impossible for You to comply with any of the terms of this
261 License with respect to some or all of the Covered Code due to
262 statute, judicial order, or regulation then You must: (a) comply with
263 the terms of this License to the maximum extent possible; and (b)
264 describe the limitations and the code they affect. Such description
265 must be included in the LEGAL file described in Section 3.4 and must
266 be included with all distributions of the Source Code. Except to the
267 extent prohibited by statute or regulation, such description must be
268 sufficiently detailed for a recipient of ordinary skill to be able to
269 understand it.
270
271 5. Application of this License.
272
273 This License applies to code to which the Initial Developer has
274 attached the notice in Exhibit A and to related Covered Code.
275
276 6. Versions of the License.
277
278 6.1. New Versions.
279 Netscape Communications Corporation ("Netscape") may publish revised
280 and/or new versions of the License from time to time. Each version
281 will be given a distinguishing version number.
282
283 6.2. Effect of New Versions.
284 Once Covered Code has been published under a particular version of the
285 License, You may always continue to use it under the terms of that
286 version. You may also choose to use such Covered Code under the terms
287 of any subsequent version of the License published by Netscape. No one
288 other than Netscape has the right to modify the terms applicable to
289 Covered Code created under this License.
290
291 6.3. Derivative Works.
292 If You create or use a modified version of this License (which you may
293 only do in order to apply it to code which is not already Covered Code
294 governed by this License), You must (a) rename Your license so that
295 the phrases "Mozilla", "MOZILLAPL", "MOZPL", "Netscape",
296 "MPL", "NPL" or any confusingly similar phrase do not appear in your
297 license (except to note that your license differs from this License)
298 and (b) otherwise make it clear that Your version of the license
299 contains terms which differ from the Mozilla Public License and
300 Netscape Public License. (Filling in the name of the Initial
301 Developer, Original Code or Contributor in the notice described in
302 Exhibit A shall not of themselves be deemed to be modifications of
303 this License.)
304
305 7. DISCLAIMER OF WARRANTY.
306
307 COVERED CODE IS PROVIDED UNDER THIS LICENSE ON AN "AS IS" BASIS,
308 WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING,
309 WITHOUT LIMITATION, WARRANTIES THAT THE COVERED CODE IS FREE OF
310 DEFECTS, MERCHANTABLE, FIT FOR A PARTICULAR PURPOSE OR NON-INFRINGING.
311 THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE COVERED CODE
312 IS WITH YOU. SHOULD ANY COVERED CODE PROVE DEFECTIVE IN ANY RESPECT,
313 YOU (NOT THE INITIAL DEVELOPER OR ANY OTHER CONTRIBUTOR) ASSUME THE
314 COST OF ANY NECESSARY SERVICING, REPAIR OR CORRECTION. THIS DISCLAIMER
315 OF WARRANTY CONSTITUTES AN ESSENTIAL PART OF THIS LICENSE. NO USE OF
316 ANY COVERED CODE IS AUTHORIZED HEREUNDER EXCEPT UNDER THIS DISCLAIMER.
317
318 8. TERMINATION.
319
320 8.1. This License and the rights granted hereunder will terminate
321 automatically if You fail to comply with terms herein and fail to cure
322 such breach within 30 days of becoming aware of the breach. All
323 sublicenses to the Covered Code which are properly granted shall
324 survive any termination of this License. Provisions which, by their
325 nature, must remain in effect beyond the termination of this License
326 shall survive.
327
328 8.2. If You initiate litigation by asserting a patent infringement
329 claim (excluding declatory judgment actions) against Initial Developer
330 or a Contributor (the Initial Developer or Contributor against whom
331 You file such action is referred to as "Participant") alleging that:
332
333 (a) such Participant's Contributor Version directly or indirectly
334 infringes any patent, then any and all rights granted by such
335 Participant to You under Sections 2.1 and/or 2.2 of this License
336 shall, upon 60 days notice from Participant terminate prospectively,
337 unless if within 60 days after receipt of notice You either: (i)
338 agree in writing to pay Participant a mutually agreeable reasonable
339 royalty for Your past and future use of Modifications made by such
340 Participant, or (ii) withdraw Your litigation claim with respect to
341 the Contributor Version against such Participant. If within 60 days
342 of notice, a reasonable royalty and payment arrangement are not
343 mutually agreed upon in writing by the parties or the litigation claim
344 is not withdrawn, the rights granted by Participant to You under
345 Sections 2.1 and/or 2.2 automatically terminate at the expiration of
346 the 60 day notice period specified above.
347
348 (b) any software, hardware, or device, other than such Participant's
349 Contributor Version, directly or indirectly infringes any patent, then
350 any rights granted to You by such Participant under Sections 2.1(b)
351 and 2.2(b) are revoked effective as of the date You first made, used,
352 sold, distributed, or had made, Modifications made by that
353 Participant.
354
355 8.3. If You assert a patent infringement claim against Participant
356 alleging that such Participant's Contributor Version directly or
357 indirectly infringes any patent where such claim is resolved (such as
358 by license or settlement) prior to the initiation of patent
359 infringement litigation, then the reasonable value of the licenses
360 granted by such Participant under Sections 2.1 or 2.2 shall be taken
361 into account in determining the amount or value of any payment or
362 license.
363
364 8.4. In the event of termination under Sections 8.1 or 8.2 above,
365 all end user license agreements (excluding distributors and resellers)
366 which have been validly granted by You or any distributor hereunder
367 prior to termination shall survive termination.
368
369 9. LIMITATION OF LIABILITY.
370
371 UNDER NO CIRCUMSTANCES AND UNDER NO LEGAL THEORY, WHETHER TORT
372 (INCLUDING NEGLIGENCE), CONTRACT, OR OTHERWISE, SHALL YOU, THE INITIAL
373 DEVELOPER, ANY OTHER CONTRIBUTOR, OR ANY DISTRIBUTOR OF COVERED CODE,
374 OR ANY SUPPLIER OF ANY OF SUCH PARTIES, BE LIABLE TO ANY PERSON FOR
375 ANY INDIRECT, SPECIAL, INCIDENTAL, OR CONSEQUENTIAL DAMAGES OF ANY
376 CHARACTER INCLUDING, WITHOUT LIMITATION, DAMAGES FOR LOSS OF GOODWILL,
377 WORK STOPPAGE, COMPUTER FAILURE OR MALFUNCTION, OR ANY AND ALL OTHER
378 COMMERCIAL DAMAGES OR LOSSES, EVEN IF SUCH PARTY SHALL HAVE BEEN
379 INFORMED OF THE POSSIBILITY OF SUCH DAMAGES. THIS LIMITATION OF
380 LIABILITY SHALL NOT APPLY TO LIABILITY FOR DEATH OR PERSONAL INJURY
381 RESULTING FROM SUCH PARTY'S NEGLIGENCE TO THE EXTENT APPLICABLE LAW
382 PROHIBITS SUCH LIMITATION. SOME JURISDICTIONS DO NOT ALLOW THE
383 EXCLUSION OR LIMITATION OF INCIDENTAL OR CONSEQUENTIAL DAMAGES, SO
384 THIS EXCLUSION AND LIMITATION MAY NOT APPLY TO YOU.
385
386 10. U.S. GOVERNMENT END USERS.
387
388 The Covered Code is a "commercial item," as that term is defined in
389 48 C.F.R. 2.101 (Oct. 1995), consisting of "commercial computer
390 software" and "commercial computer software documentation," as such
391 terms are used in 48 C.F.R. 12.212 (Sept. 1995). Consistent with 48
392 C.F.R. 12.212 and 48 C.F.R. 227.7202-1 through 227.7202-4 (June 1995),
393 all U.S. Government End Users acquire Covered Code with only those
394 rights set forth herein.
395
396 11. MISCELLANEOUS.
397
398 This License represents the complete agreement concerning subject
399 matter hereof. If any provision of this License is held to be
400 unenforceable, such provision shall be reformed only to the extent
401 necessary to make it enforceable. This License shall be governed by
402 California law provisions (except to the extent applicable law, if
403 any, provides otherwise), excluding its conflict-of-law provisions.
404 With respect to disputes in which at least one party is a citizen of,
405 or an entity chartered or registered to do business in the United
406 States of America, any litigation relating to this License shall be
407 subject to the jurisdiction of the Federal Courts of the Northern
408 District of California, with venue lying in Santa Clara County,
409 California, with the losing party responsible for costs, including
410 without limitation, court costs and reasonable attorneys' fees and
411 expenses. The application of the United Nations Convention on
412 Contracts for the International Sale of Goods is expressly excluded.
413 Any law or regulation which provides that the language of a contract
414 shall be construed against the drafter shall not apply to this
415 License.
416
417 12. RESPONSIBILITY FOR CLAIMS.
418
419 As between Initial Developer and the Contributors, each party is
420 responsible for claims and damages arising, directly or indirectly,
421 out of its utilization of rights under this License and You agree to
422 work with Initial Developer and Contributors to distribute such
423 responsibility on an equitable basis. Nothing herein is intended or
424 shall be deemed to constitute any admission of liability.
425
426 13. MULTIPLE-LICENSED CODE.
427
428 Initial Developer may designate portions of the Covered Code as
429 "Multiple-Licensed". "Multiple-Licensed" means that the Initial
430 Developer permits you to utilize portions of the Covered Code under
431 Your choice of the NPL or the alternative licenses, if any, specified
432 by the Initial Developer in the file described in Exhibit A.
433
434 EXHIBIT A -Mozilla Public License.
435
436 ``The contents of this file are subject to the Mozilla Public License
437 Version 1.1 (the "License"); you may not use this file except in
438 compliance with the License. You may obtain a copy of the License at
439 http://www.mozilla.org/MPL/
440
441 Software distributed under the License is distributed on an "AS IS"
442 basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See the
443 License for the specific language governing rights and limitations
444 under the License.
445
446 The Original Code is ______________________________________.
447
448 The Initial Developer of the Original Code is ________________________.
449 Portions created by ______________________ are Copyright (C) ______
450 _______________________. All Rights Reserved.
451
452 Contributor(s): ______________________________________.
453
454 Alternatively, the contents of this file may be used under the terms
455 of the _____ license (the "[___] License"), in which case the
456 provisions of [______] License are applicable instead of those
457 above. If you wish to allow use of your version of this file only
458 under the terms of the [____] License and not to allow others to use
459 your version of this file under the MPL, indicate your decision by
460 deleting the provisions above and replace them with the notice and
461 other provisions required by the [___] License. If you do not delete
462 the provisions above, a recipient may use your version of this file
463 under either the MPL or the [___] License."
464
465 [NOTE: The text of this Exhibit A may differ slightly from the text of
466 the notices in the Source Code files of the Original Code. You should
467 use the text of this Exhibit A rather than the text found in the
468 Original Code Source Code for Your Modifications.]
469
+0
-38
c/Makefile less more
0 TARGET=libuchardet
1 VERSIONINFO=0:0:0
2 CXXFLAGS=-c -O2 -D_REENTRANT -I./src -I./include
3
4 SUBDIRS=src
5 DESTDIR=/usr/local
6 DESTLIBDIR=$(DESTDIR)/lib
7 DESTINCLUDEDIR=$(DESTDIR)/include
8
9 all: libuchardet
10
11 libuchardet:
12 @for mdir in $(SUBDIRS); do \
13 if test -d $$mdir; then \
14 $(MAKE) -C $$mdir ; \
15 fi; \
16 done
17 libtool --mode=compile $(CXX) $(CXXFLAGS) dll/dll.cpp
18 libtool --mode=link gcc -O -o $(TARGET).la dll.lo src/*.lo \
19 -rpath $(DESTLIBDIR) -lstdc++ -version-info $(VERSIONINFO)
20
21 install: libuchardet
22 libtool --mode=install install -c -m 644 \
23 $(TARGET).la $(DESTLIBDIR)/$(TARGET).la
24 install -c -m 644 include/universalchardet.h \
25 $(DESTINCLUDEDIR)/universalchardet.h
26
27 clean:
28 @for mdir in $(SUBDIRS); do \
29 if test -d $$mdir; then \
30 $(MAKE) -C $$mdir clean ; \
31 fi; \
32 done
33 rm -f *.o
34 rm -f *.lo
35 rm -f *.la
36 rm -rf .libs
37
+0
-47
c/dll/ReadMe.txt less more
0 ========================================================================
1 ダイナミック リンク ライブラリ: dll プロジェクトの概要
2 ========================================================================
3
4 ‚±‚Ì dll DLL ‚́AAppWizard ‚É‚æ‚Á‚č쐬‚³‚ê‚Ü‚µ‚½B
5
6 このファイルには、dll アプリケーションを構成する各ファイルの
7 内容の概略が記述されています。
8
9
10 dll.vcproj
11 これは、アプリケーション ウィザードで生成される VC++ プロジェクトのメインの
12 プロジェクト ファイルです。
13 ファイルを生成した Visual C++ のバージョン情報と、アプリケーション
14 ウィザードで選択したプラットフォーム、構成、およびプロジェクトの機能に関する
15 î•ñ‚ª‹Lq‚³‚ê‚Ä‚¢‚Ü‚·B
16
17 dll.cpp
18 これは、メインの DLL ソース ファイルです。
19
20 この DLL の作成時には、記号がエクスポートされません。このため、
21 ビルド時に .lib ファイルが生成されません。このプロジェクトを他の
22 プロジェクトに依存させるためには、DLL から機能をエクスポートするための
23 コードを追加してエクスポート ライブラリを生成するか、プロジェクトの
24 [プロパティ ページ] ダイアログ ボックスにある [リンカ] フォルダの
25 [全般] プロパティ ページで Ignore Input Library プロパティを Yes に
26 Ý’è‚·‚é•K—v‚ª‚ ‚è‚Ü‚·B
27
28 /////////////////////////////////////////////////////////////////////////////
29 その他の標準ファイル :
30
31 StdAfx.h, StdAfx.cpp
32 これらのファイルは、コンパイル済みヘッダー (PCH) ファイル
33 dll.pch とプリコンパイル済み型ファイル StdAfx.obj を
34 ビルドするために使用します。
35
36 /////////////////////////////////////////////////////////////////////////////
37 ‚»‚Ì‘¼‚̃ƒ‚ :
38
39 AppWizard では "TODO:" コメントを使用して、ユーザーが追加またはカスタマイズする
40 ソース部分を示します。
41
42 /////////////////////////////////////////////////////////////////////////////
43
44
45
46
+0
-190
c/dll/dll.cpp less more
0 /* ***** BEGIN LICENSE BLOCK *****
1 * Version: MPL 1.1/GPL 2.0/LGPL 2.1
2 *
3 * The contents of this file are subject to the Mozilla Public License Version
4 * 1.1 (the "License"); you may not use this file except in compliance with
5 * the License. You may obtain a copy of the License at
6 * http://www.mozilla.org/MPL/
7 *
8 * Software distributed under the License is distributed on an "AS IS" basis,
9 * WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License
10 * for the specific language governing rights and limitations under the
11 * License.
12 *
13 * The Original Code is Mozilla Universal charset detector code.
14 *
15 * The Initial Developer of the Original Code is
16 * Netscape Communications Corporation.
17 * Portions created by the Initial Developer are Copyright (C) 2001
18 * the Initial Developer. All Rights Reserved.
19 *
20 * Contributor(s):
21 * Kohei TAKETA <k-tak@void.in>
22 *
23 * Alternatively, the contents of this file may be used under the terms of
24 * either the GNU General Public License Version 2 or later (the "GPL"), or
25 * the GNU Lesser General Public License Version 2.1 or later (the "LGPL"),
26 * in which case the provisions of the GPL or the LGPL are applicable instead
27 * of those above. If you wish to allow use of your version of this file only
28 * under the terms of either the GPL or the LGPL, and not to allow others to
29 * use your version of this file under the terms of the MPL, indicate your
30 * decision by deleting the provisions above and replace them with the notice
31 * and other provisions required by the GPL or the LGPL. If you do not delete
32 * the provisions above, a recipient may use your version of this file under
33 * the terms of any one of the MPL, the GPL or the LGPL.
34 *
35 * ***** END LICENSE BLOCK ***** */
36 #include "universalchardet.h"
37 #include "nscore.h"
38 #include "nsUniversalDetector.h"
39 #include <string>
40
41 #ifdef _WIN32
42 # include <windows.h>
43 #endif
44
45
46 #ifdef _MANAGED
47 #pragma managed(push, off)
48 #endif
49
50
51 class DllDetector : public nsUniversalDetector
52 {
53 protected:
54 std::string charset_;
55
56 public:
57 DllDetector()
58 : nsUniversalDetector()
59 {}
60
61 virtual ~DllDetector()
62 {}
63
64 virtual void Report(const char* charset)
65 {
66 charset_ = charset;
67 }
68
69 virtual void Reset()
70 {
71 nsUniversalDetector::Reset();
72 charset_.clear();
73 }
74
75 const char* GetCharset() const
76 {
77 return charset_.c_str();
78 }
79 };
80
81
82 #ifdef _WIN32
83 BOOL APIENTRY DllMain( HMODULE hModule,
84 DWORD ul_reason_for_call,
85 LPVOID lpReserved
86 )
87 {
88 return TRUE;
89 }
90 #endif
91
92
93 CHARDET_IMEXPORT
94 int chardet_create(chardet_t* pdet)
95 {
96 if (!pdet) return CHARDET_RESULT_NOMEMORY;
97
98 *pdet = reinterpret_cast<chardet_t>(new DllDetector);
99 if (*pdet) {
100 return CHARDET_RESULT_OK;
101 } else {
102 return CHARDET_RESULT_NOMEMORY;
103 }
104 }
105
106
107 CHARDET_IMEXPORT
108 void chardet_destroy(chardet_t det)
109 {
110 if (det) {
111 delete reinterpret_cast<DllDetector*>(det);
112 }
113 }
114
115
116 CHARDET_IMEXPORT
117 int chardet_handle_data(chardet_t det, const char* data, unsigned int len)
118 {
119 if (det) {
120 nsresult ret = reinterpret_cast<DllDetector*>(det)->HandleData(data, (PRUint32)len);
121 if (ret == NS_OK) {
122 return CHARDET_RESULT_OK;
123 } else {
124 return CHARDET_RESULT_NOMEMORY;
125 }
126 } else {
127 return CHARDET_RESULT_INVALID_DETECTOR;
128 }
129 }
130
131
132 CHARDET_IMEXPORT
133 int chardet_data_end(chardet_t det)
134 {
135 if (det) {
136 reinterpret_cast<DllDetector*>(det)->DataEnd();
137 return CHARDET_RESULT_OK;
138 } else {
139 return CHARDET_RESULT_INVALID_DETECTOR;
140 }
141 }
142
143
144 CHARDET_IMEXPORT
145 int chardet_reset(chardet_t det)
146 {
147 if (det) {
148 reinterpret_cast<DllDetector*>(det)->Reset();
149 return CHARDET_RESULT_OK;
150 } else {
151 return CHARDET_RESULT_INVALID_DETECTOR;
152 }
153 }
154
155
156 CHARDET_IMEXPORT
157 int chardet_get_charset(chardet_t det, char* namebuf, unsigned int buflen)
158 {
159 if (det) {
160 if (!namebuf) return CHARDET_RESULT_NOMEMORY;
161
162 const char* name = reinterpret_cast<DllDetector*>(det)->GetCharset();
163 if (name == NULL || *name == 0) {
164 // could not detect encoding
165 if (buflen > 0) {
166 *namebuf = 0;
167 return CHARDET_RESULT_OK;
168 } else {
169 return CHARDET_RESULT_NOMEMORY;
170 }
171 } else {
172 // encoding detected
173 if (buflen >= strlen(name)+1) {
174 strcpy(namebuf, name);
175 return CHARDET_RESULT_OK;
176 } else {
177 return CHARDET_RESULT_NOMEMORY;
178 }
179 }
180 } else {
181 return CHARDET_RESULT_INVALID_DETECTOR;
182 }
183 }
184
185
186 #ifdef _MANAGED
187 #pragma managed(pop)
188 #endif
189
+0
-392
c/dll/dll.vcproj less more
0 <?xml version="1.0" encoding="shift_jis"?>
1 <VisualStudioProject
2 ProjectType="Visual C++"
3 Version="9.00"
4 Name="dll"
5 ProjectGUID="{7D9BA890-B579-433C-9D02-74D9BF8FDAA7}"
6 RootNamespace="dll"
7 Keyword="Win32Proj"
8 TargetFrameworkVersion="131072"
9 >
10 <Platforms>
11 <Platform
12 Name="Win32"
13 />
14 </Platforms>
15 <ToolFiles>
16 </ToolFiles>
17 <Configurations>
18 <Configuration
19 Name="Debug|Win32"
20 OutputDirectory="$(SolutionDir)$(ConfigurationName)"
21 IntermediateDirectory="$(ConfigurationName)"
22 ConfigurationType="2"
23 CharacterSet="1"
24 >
25 <Tool
26 Name="VCPreBuildEventTool"
27 />
28 <Tool
29 Name="VCCustomBuildTool"
30 />
31 <Tool
32 Name="VCXMLDataGeneratorTool"
33 />
34 <Tool
35 Name="VCWebServiceProxyGeneratorTool"
36 />
37 <Tool
38 Name="VCMIDLTool"
39 />
40 <Tool
41 Name="VCCLCompilerTool"
42 Optimization="0"
43 AdditionalIncludeDirectories="..\src;..\include"
44 PreprocessorDefinitions="WIN32;_DEBUG;_WINDOWS;_USRDLL;DLL_EXPORTS"
45 MinimalRebuild="true"
46 BasicRuntimeChecks="3"
47 RuntimeLibrary="1"
48 UsePrecompiledHeader="0"
49 WarningLevel="3"
50 Detect64BitPortabilityProblems="true"
51 DebugInformationFormat="4"
52 />
53 <Tool
54 Name="VCManagedResourceCompilerTool"
55 />
56 <Tool
57 Name="VCResourceCompilerTool"
58 />
59 <Tool
60 Name="VCPreLinkEventTool"
61 />
62 <Tool
63 Name="VCLinkerTool"
64 OutputFile="$(OutDir)\uchardet.dll"
65 LinkIncremental="2"
66 GenerateDebugInformation="true"
67 SubSystem="2"
68 RandomizedBaseAddress="1"
69 DataExecutionPrevention="0"
70 TargetMachine="1"
71 />
72 <Tool
73 Name="VCALinkTool"
74 />
75 <Tool
76 Name="VCManifestTool"
77 />
78 <Tool
79 Name="VCXDCMakeTool"
80 />
81 <Tool
82 Name="VCBscMakeTool"
83 />
84 <Tool
85 Name="VCFxCopTool"
86 />
87 <Tool
88 Name="VCAppVerifierTool"
89 />
90 <Tool
91 Name="VCPostBuildEventTool"
92 />
93 </Configuration>
94 <Configuration
95 Name="Release|Win32"
96 OutputDirectory="$(SolutionDir)$(ConfigurationName)"
97 IntermediateDirectory="$(ConfigurationName)"
98 ConfigurationType="2"
99 CharacterSet="1"
100 WholeProgramOptimization="1"
101 >
102 <Tool
103 Name="VCPreBuildEventTool"
104 />
105 <Tool
106 Name="VCCustomBuildTool"
107 />
108 <Tool
109 Name="VCXMLDataGeneratorTool"
110 />
111 <Tool
112 Name="VCWebServiceProxyGeneratorTool"
113 />
114 <Tool
115 Name="VCMIDLTool"
116 />
117 <Tool
118 Name="VCCLCompilerTool"
119 AdditionalIncludeDirectories="..\src;..\include"
120 PreprocessorDefinitions="WIN32;NDEBUG;_WINDOWS;_USRDLL;DLL_EXPORTS"
121 RuntimeLibrary="0"
122 UsePrecompiledHeader="0"
123 WarningLevel="3"
124 Detect64BitPortabilityProblems="true"
125 DebugInformationFormat="3"
126 />
127 <Tool
128 Name="VCManagedResourceCompilerTool"
129 />
130 <Tool
131 Name="VCResourceCompilerTool"
132 />
133 <Tool
134 Name="VCPreLinkEventTool"
135 />
136 <Tool
137 Name="VCLinkerTool"
138 OutputFile="$(OutDir)\uchardet.dll"
139 LinkIncremental="1"
140 GenerateDebugInformation="true"
141 SubSystem="2"
142 OptimizeReferences="2"
143 EnableCOMDATFolding="2"
144 RandomizedBaseAddress="1"
145 DataExecutionPrevention="0"
146 TargetMachine="1"
147 />
148 <Tool
149 Name="VCALinkTool"
150 />
151 <Tool
152 Name="VCManifestTool"
153 />
154 <Tool
155 Name="VCXDCMakeTool"
156 />
157 <Tool
158 Name="VCBscMakeTool"
159 />
160 <Tool
161 Name="VCFxCopTool"
162 />
163 <Tool
164 Name="VCAppVerifierTool"
165 />
166 <Tool
167 Name="VCPostBuildEventTool"
168 />
169 </Configuration>
170 </Configurations>
171 <References>
172 </References>
173 <Files>
174 <Filter
175 Name="ソース ファイル"
176 Filter="cpp;c;cc;cxx;def;odl;idl;hpj;bat;asm;asmx"
177 UniqueIdentifier="{4FC737F1-C7A5-4376-A066-2A32D752A2FF}"
178 >
179 <File
180 RelativePath="..\src\CharDistribution.cpp"
181 >
182 </File>
183 <File
184 RelativePath=".\dll.cpp"
185 >
186 </File>
187 <File
188 RelativePath="..\src\JpCntx.cpp"
189 >
190 </File>
191 <File
192 RelativePath="..\src\LangBulgarianModel.cpp"
193 >
194 </File>
195 <File
196 RelativePath="..\src\LangCyrillicModel.cpp"
197 >
198 </File>
199 <File
200 RelativePath="..\src\LangGreekModel.cpp"
201 >
202 </File>
203 <File
204 RelativePath="..\src\LangHebrewModel.cpp"
205 >
206 </File>
207 <File
208 RelativePath="..\src\LangHungarianModel.cpp"
209 >
210 </File>
211 <File
212 RelativePath="..\src\LangThaiModel.cpp"
213 >
214 </File>
215 <File
216 RelativePath="..\src\nsBig5Prober.cpp"
217 >
218 </File>
219 <File
220 RelativePath="..\src\nsCharSetProber.cpp"
221 >
222 </File>
223 <File
224 RelativePath="..\src\nsEscCharsetProber.cpp"
225 >
226 </File>
227 <File
228 RelativePath="..\src\nsEscSM.cpp"
229 >
230 </File>
231 <File
232 RelativePath="..\src\nsEUCJPProber.cpp"
233 >
234 </File>
235 <File
236 RelativePath="..\src\nsEUCKRProber.cpp"
237 >
238 </File>
239 <File
240 RelativePath="..\src\nsEUCTWProber.cpp"
241 >
242 </File>
243 <File
244 RelativePath="..\src\nsGB2312Prober.cpp"
245 >
246 </File>
247 <File
248 RelativePath="..\src\nsHebrewProber.cpp"
249 >
250 </File>
251 <File
252 RelativePath="..\src\nsLatin1Prober.cpp"
253 >
254 </File>
255 <File
256 RelativePath="..\src\nsMBCSGroupProber.cpp"
257 >
258 </File>
259 <File
260 RelativePath="..\src\nsMBCSSM.cpp"
261 >
262 </File>
263 <File
264 RelativePath="..\src\nsSBCharSetProber.cpp"
265 >
266 </File>
267 <File
268 RelativePath="..\src\nsSBCSGroupProber.cpp"
269 >
270 </File>
271 <File
272 RelativePath="..\src\nsSJISProber.cpp"
273 >
274 </File>
275 <File
276 RelativePath="..\src\nsUniversalDetector.cpp"
277 >
278 </File>
279 <File
280 RelativePath="..\src\nsUTF8Prober.cpp"
281 >
282 </File>
283 </Filter>
284 <Filter
285 Name="ヘッダー ファイル"
286 Filter="h;hpp;hxx;hm;inl;inc;xsd"
287 UniqueIdentifier="{93995380-89BD-4b04-88EB-625FBE52EBFB}"
288 >
289 <File
290 RelativePath="..\src\CharDistribution.h"
291 >
292 </File>
293 <File
294 RelativePath="..\src\JpCntx.h"
295 >
296 </File>
297 <File
298 RelativePath="..\src\nsBig5Prober.h"
299 >
300 </File>
301 <File
302 RelativePath="..\src\nsCharSetProber.h"
303 >
304 </File>
305 <File
306 RelativePath="..\src\nsCodingStateMachine.h"
307 >
308 </File>
309 <File
310 RelativePath="..\src\nscore.h"
311 >
312 </File>
313 <File
314 RelativePath="..\src\nsEscCharsetProber.h"
315 >
316 </File>
317 <File
318 RelativePath="..\src\nsEUCJPProber.h"
319 >
320 </File>
321 <File
322 RelativePath="..\src\nsEUCKRProber.h"
323 >
324 </File>
325 <File
326 RelativePath="..\src\nsEUCTWProber.h"
327 >
328 </File>
329 <File
330 RelativePath="..\src\nsGB2312Prober.h"
331 >
332 </File>
333 <File
334 RelativePath="..\src\nsHebrewProber.h"
335 >
336 </File>
337 <File
338 RelativePath="..\src\nsLatin1Prober.h"
339 >
340 </File>
341 <File
342 RelativePath="..\src\nsMBCSGroupProber.h"
343 >
344 </File>
345 <File
346 RelativePath="..\src\nsPkgInt.h"
347 >
348 </File>
349 <File
350 RelativePath="..\src\nsSBCharSetProber.h"
351 >
352 </File>
353 <File
354 RelativePath="..\src\nsSBCSGroupProber.h"
355 >
356 </File>
357 <File
358 RelativePath="..\src\nsSJISProber.h"
359 >
360 </File>
361 <File
362 RelativePath="..\src\nsUniversalDetector.h"
363 >
364 </File>
365 <File
366 RelativePath="..\src\nsUTF8Prober.h"
367 >
368 </File>
369 <File
370 RelativePath="..\src\prmem.h"
371 >
372 </File>
373 <File
374 RelativePath="..\include\universalchardet.h"
375 >
376 </File>
377 </Filter>
378 <Filter
379 Name="リソース ファイル"
380 Filter="rc;ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe;resx;tiff;tif;png;wav"
381 UniqueIdentifier="{67DA6AB6-F800-4c08-8B7A-83BB121AAD01}"
382 >
383 </Filter>
384 <File
385 RelativePath=".\ReadMe.txt"
386 >
387 </File>
388 </Files>
389 <Globals>
390 </Globals>
391 </VisualStudioProject>
+0
-160
c/include/universalchardet.h less more
0 /* ***** BEGIN LICENSE BLOCK *****
1 * Version: MPL 1.1/GPL 2.0/LGPL 2.1
2 *
3 * The contents of this file are subject to the Mozilla Public License Version
4 * 1.1 (the "License"); you may not use this file except in compliance with
5 * the License. You may obtain a copy of the License at
6 * http://www.mozilla.org/MPL/
7 *
8 * Software distributed under the License is distributed on an "AS IS" basis,
9 * WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License
10 * for the specific language governing rights and limitations under the
11 * License.
12 *
13 * The Original Code is Mozilla Universal charset detector code.
14 *
15 * The Initial Developer of the Original Code is
16 * Netscape Communications Corporation.
17 * Portions created by the Initial Developer are Copyright (C) 2001
18 * the Initial Developer. All Rights Reserved.
19 *
20 * Contributor(s):
21 * Kohei TAKETA <k-tak@void.in>
22 *
23 * Alternatively, the contents of this file may be used under the terms of
24 * either the GNU General Public License Version 2 or later (the "GPL"), or
25 * the GNU Lesser General Public License Version 2.1 or later (the "LGPL"),
26 * in which case the provisions of the GPL or the LGPL are applicable instead
27 * of those above. If you wish to allow use of your version of this file only
28 * under the terms of either the GPL or the LGPL, and not to allow others to
29 * use your version of this file under the terms of the MPL, indicate your
30 * decision by deleting the provisions above and replace them with the notice
31 * and other provisions required by the GPL or the LGPL. If you do not delete
32 * the provisions above, a recipient may use your version of this file under
33 * the terms of any one of the MPL, the GPL or the LGPL.
34 *
35 * ***** END LICENSE BLOCK ***** */
36 #ifndef ___UNIVERSALCHARDET_H___
37 #define ___UNIVERSALCHARDET_H___
38
39 #ifdef _WIN32
40 # ifdef DLL_EXPORTS
41 # define CHARDET_IMEXPORT extern _declspec(dllexport)
42 # else
43 # define CHARDET_IMEXPORT extern _declspec(dllimport)
44 # endif
45 #else
46 # define CHARDET_IMEXPORT extern
47 #endif
48
49 #include <stddef.h>
50
51 #define CHARDET_RESULT_OK 0
52 #define CHARDET_RESULT_NOMEMORY (-1)
53 #define CHARDET_RESULT_INVALID_DETECTOR (-2)
54
55 #define CHARDET_MAX_ENCODING_NAME 64
56
57 #define CHARDET_ENCODING_ISO_2022_JP "ISO-2022-JP"
58 #define CHARDET_ENCODING_ISO_2022_CN "ISO-2022-CN"
59 #define CHARDET_ENCODING_ISO_2022_KR "ISO-2022-KR"
60 #define CHARDET_ENCODING_ISO_8859_5 "ISO-8859-5"
61 #define CHARDET_ENCODING_ISO_8859_7 "ISO-8859-7"
62 #define CHARDET_ENCODING_ISO_8859_8 "ISO-8859-8"
63 #define CHARDET_ENCODING_BIG5 "BIG5"
64 #define CHARDET_ENCODING_GB18030 "GB18030"
65 #define CHARDET_ENCODING_EUC_JP "EUC-JP"
66 #define CHARDET_ENCODING_EUC_KR "EUC-KR"
67 #define CHARDET_ENCODING_EUC_TW "EUC-TW"
68 #define CHARDET_ENCODING_SHIFT_JIS "SHIFT_JIS"
69 #define CHARDET_ENCODING_IBM855 "IBM855"
70 #define CHARDET_ENCODING_IBM866 "IBM866"
71 #define CHARDET_ENCODING_KOI8_R "KOI8-R"
72 #define CHARDET_ENCODING_MACCYRILLIC "MACCYRILLIC"
73 #define CHARDET_ENCODING_WINDOWS_1251 "WINDOWS-1251"
74 #define CHARDET_ENCODING_WINDOWS_1252 "WINDOWS-1252"
75 #define CHARDET_ENCODING_WINDOWS_1253 "WINDOWS-1253"
76 #define CHARDET_ENCODING_WINDOWS_1255 "WINDOWS-1255"
77 #define CHARDET_ENCODING_UTF_8 "UTF-8"
78 #define CHARDET_ENCODING_UTF_16BE "UTF-16BE"
79 #define CHARDET_ENCODING_UTF_16LE "UTF-16LE"
80 #define CHARDET_ENCODING_UTF_32BE "UTF-32BE"
81 #define CHARDET_ENCODING_UTF_32LE "UTF-32LE"
82 #define CHARDET_ENCODING_HZ_GB_2312 "HZ-GB-2312"
83 #define CHARDET_ENCODING_X_ISO_10646_UCS_4_3412 "X-ISO-10646-UCS-4-3412"
84 #define CHARDET_ENCODING_X_ISO_10646_UCS_4_2143 "X-ISO-10646-UCS-4-2143"
85
86 /* Unused */
87 #define CHARDET_ENCODING_ISO_8859_2 "ISO-8859-2"
88 #define CHARDET_ENCODING_WINDOWS_1250 "WINDOWS-1250"
89 #define CHARDET_ENCODING_TIS_620 "TIS-620"
90
91 typedef void* chardet_t;
92
93 #ifdef __cplusplus
94 extern "C" {
95 #endif
96
97 /**
98 * Create an encoding detector.
99 * @param pdet [out] pointer to a chardet_t variable that receives
100 * the encoding detector handle.
101 * @return CHARDET_RESULT_OK if succeeded. CHARDET_RESULT_NOMEMORY otherwise.
102 */
103 CHARDET_IMEXPORT int chardet_create(chardet_t* pdet);
104
105 /**
106 * Destroy an encoding detector.
107 * @param det [in] the encoding detector handle to be destroyed.
108 */
109 CHARDET_IMEXPORT void chardet_destroy(chardet_t det);
110
111 /**
112 * Feed data to an encoding detector.
113 * @param det [in] the encoding detector handle
114 * @param data [in] data
115 * @param len [in] length of data in bytes.
116 * @return CHARDET_RESULT_OK if succeeded.
117 * CHARSET_RESULT_NOMEMORY if running out of memory.
118 * CHARDET_RESULT_INVALID_DETECTOR if det was invalid.
119 */
120 CHARDET_IMEXPORT int chardet_handle_data(chardet_t det, const char* data, unsigned int len);
121
122 /**
123 * Notify an end of data to an encoding detctor.
124 * @param det [in] the encoding detector handle
125 * @return CHARDET_RESULT_OK if succeeded.
126 * CHARDET_RESULT_INVALID_DETECTOR if det was invalid.
127 */
128 CHARDET_IMEXPORT int chardet_data_end(chardet_t det);
129
130 /**
131 * Reset an encoding detector.
132 * @param det [in] the encoding detector handle
133 * @return CHARDET_RESULT_OK if succeeded.
134 * CHARDET_RESULT_INVALID_DETECTOR if det was invalid.
135 */
136 CHARDET_IMEXPORT int chardet_reset(chardet_t det);
137
138 /**
139 * Get the name of encoding that was detected.
140 * @param det [in] the encoding detector handle
141 * @param namebuf [in/out] pointer to a buffer that receives the name of
142 * detected encoding. A valid encoding name or an empty string
143 * will be written to namebuf. If an empty strng was written,
144 * the detector could not detect any encoding.
145 * Written strings will always be NULL-terminated.
146 * @param buflen [in] length of namebuf
147 * @return CHARDET_RESULT_OK if succeeded.
148 * CHARDET_RESULT_NOMEMORY if namebuf was too small to store
149 * the entire encoding name.
150 * CHARDET_RESULT_INVALID_DETECTOR if det was invalid.
151 */
152 CHARDET_IMEXPORT int chardet_get_charset(chardet_t det, char* namebuf, unsigned int buflen);
153
154
155 #ifdef __cplusplus
156 };
157 #endif
158
159 #endif
+0
-46
c/readme-en.txt less more
0 Universal Character Set Detector C Library
1
2
3 1. What is it?
4
5 A port to C of "universalchardet", that is the encoding detector
6 library of Mozilla.
7
8 The original code of universalchardet is available at
9 http://lxr.mozilla.org/seamonkey/source/extensions/universalchardet/
10
11
12 2. Installation
13
14 To build an DLL on Windows, use universalchardet.sln (VS2005 Solution File).
15
16 To install the library to an Linux system, use Makefile.
17 "make && make install" will install files below.
18 /usr/local/include/universalchardet.h
19 /usr/local/lib/libuchardet.a
20 /usr/local/lib/libuchardet.la
21 /usr/local/lib/libuchardet.so
22 /usr/local/lib/libuchardet.so.0
23 /usr/local/lib/libuchardet.so.0.0.0
24
25
26 3. API
27
28 See universalchardet.h.
29
30
31 4. License
32
33 The library is subject to the Mozilla Public License Version 1.1.
34 Alternatively, the library may be used under the terms of either
35 the GNU General Public License Version 2 or later, or the GNU
36 Lesser General Public License 2.1 or later.
37
38
39 5. Contacts
40
41 If you have any question about the original source code,
42 please consult with the Mozilla team. If you have a question about
43 DLLization of universalchardet, feel free to email to
44 k-tak@void.in (Kohei TAKETA).
45
+0
-48
c/readme.txt less more
0 Universal Character Set Detector C Library
1
2
3 1. ‚±‚ê‚͉½‚Å‚·‚©H
4
5 Mozillaのエンコーディング自動判別ライブラリである
6 「universalchardet」を、Cライブラリにしたものです。
7 universalchardetのオリジナルソースコードは、
8 http://lxr.mozilla.org/seamonkey/source/extensions/universalchardet/
9 ‚ÅŽQÆ‰Â”\‚Å‚·B
10
11
12 2. インストール方法
13
14 Visual Studio 2005‚Ì�ê�‡‚Í�Auniversalchardet.sln‚ğ‚²—˜—p‚­‚¾‚³‚¢�B
15
16 Linuxの場合は、Makefileをご利用ください。make installで、
17 /usr/local/include/universalchardet.h
18 /usr/local/lib/libuchardet.a
19 /usr/local/lib/libuchardet.la
20 /usr/local/lib/libuchardet.so
21 /usr/local/lib/libuchardet.so.0
22 /usr/local/lib/libuchardet.so.0.0.0
23 がインストールされます。
24
25
26 3. —˜—p•û–@
27
28 universalchardet.h‚ğ‚²——‚­‚¾‚³‚¢�B
29
30
31 4. ƒ‰ƒCƒZƒ“ƒX
32
33 Mozilla‚Æ“¯—l�A
34 - Mozilla Public License 1.1
35 - GNU General Public License 2.0
36 - GNU Lesser General Public License 2.1
37 のトリプルライセンスとします。
38
39
40 5. •¶‹å“™
41
42 universalchardet本体に関するご質問は、Mozillaのコミュニティへどうぞ。
43 ƒ‰ƒCƒuƒ‰ƒŠ‰»‚ÉŠÖ‚·‚邱‚Ƃɂ‚¢‚ẮA
44
45 •�“cŒõ•½ k-tak@void.in
46
47 Ç‹Ç≈ǫǧǺÅB
+0
-943
c/src/Big5Freq.tab less more
0 /* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
1 /* ***** BEGIN LICENSE BLOCK *****
2 * Version: MPL 1.1/GPL 2.0/LGPL 2.1
3 *
4 * The contents of this file are subject to the Mozilla Public License Version
5 * 1.1 (the "License"); you may not use this file except in compliance with
6 * the License. You may obtain a copy of the License at
7 * http://www.mozilla.org/MPL/
8 *
9 * Software distributed under the License is distributed on an "AS IS" basis,
10 * WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License
11 * for the specific language governing rights and limitations under the
12 * License.
13 *
14 * The Original Code is Mozilla Communicator client code.
15 *
16 * The Initial Developer of the Original Code is
17 * Netscape Communications Corporation.
18 * Portions created by the Initial Developer are Copyright (C) 1998
19 * the Initial Developer. All Rights Reserved.
20 *
21 * Contributor(s):
22 *
23 * Alternatively, the contents of this file may be used under the terms of
24 * either the GNU General Public License Version 2 or later (the "GPL"), or
25 * the GNU Lesser General Public License Version 2.1 or later (the "LGPL"),
26 * in which case the provisions of the GPL or the LGPL are applicable instead
27 * of those above. If you wish to allow use of your version of this file only
28 * under the terms of either the GPL or the LGPL, and not to allow others to
29 * use your version of this file under the terms of the MPL, indicate your
30 * decision by deleting the provisions above and replace them with the notice
31 * and other provisions required by the GPL or the LGPL. If you do not delete
32 * the provisions above, a recipient may use your version of this file under
33 * the terms of any one of the MPL, the GPL or the LGPL.
34 *
35 * ***** END LICENSE BLOCK ***** */
36
37 // Big5 frequency table
38 // by Taiwan's Mandarin Promotion Council
39 // <http://www.edu.tw:81/mandr/>
40
41 /******************************************************************************
42 * 128 --> 0.42261
43 * 256 --> 0.57851
44 * 512 --> 0.74851
45 * 1024 --> 0.89384
46 * 2048 --> 0.97583
47 *
48 * Idea Distribution Ratio = 0.74851/(1-0.74851) =2.98
49 * Random Distribution Ration = 512/(5401-512)=0.105
50 *
51 * Typical Distribution Ratio about 25% of Ideal one, still much higher than RDR
52 *****************************************************************************/
53
54 #define BIG5_TYPICAL_DISTRIBUTION_RATIO (float)0.75
55
56
57 //Char to FreqOrder table ,
58 #define BIG5_TABLE_SIZE 5376
59
60 static const PRInt16 Big5CharToFreqOrder[] =
61 {
62 1,1801,1506, 255,1431, 198, 9, 82, 6,5008, 177, 202,3681,1256,2821, 110, // 16
63 3814, 33,3274, 261, 76, 44,2114, 16,2946,2187,1176, 659,3971, 26,3451,2653, // 32
64 1198,3972,3350,4202, 410,2215, 302, 590, 361,1964, 8, 204, 58,4510,5009,1932, // 48
65 63,5010,5011, 317,1614, 75, 222, 159,4203,2417,1480,5012,3555,3091, 224,2822, // 64
66 3682, 3, 10,3973,1471, 29,2787,1135,2866,1940, 873, 130,3275,1123, 312,5013, // 80
67 4511,2052, 507, 252, 682,5014, 142,1915, 124, 206,2947, 34,3556,3204, 64, 604, // 96
68 5015,2501,1977,1978, 155,1991, 645, 641,1606,5016,3452, 337, 72, 406,5017, 80, // 112
69 630, 238,3205,1509, 263, 939,1092,2654, 756,1440,1094,3453, 449, 69,2987, 591, // 128
70 179,2096, 471, 115,2035,1844, 60, 50,2988, 134, 806,1869, 734,2036,3454, 180, // 144
71 995,1607, 156, 537,2907, 688,5018, 319,1305, 779,2145, 514,2379, 298,4512, 359, // 160
72 2502, 90,2716,1338, 663, 11, 906,1099,2553, 20,2441, 182, 532,1716,5019, 732, // 176
73 1376,4204,1311,1420,3206, 25,2317,1056, 113, 399, 382,1950, 242,3455,2474, 529, // 192
74 3276, 475,1447,3683,5020, 117, 21, 656, 810,1297,2300,2334,3557,5021, 126,4205, // 208
75 706, 456, 150, 613,4513, 71,1118,2037,4206, 145,3092, 85, 835, 486,2115,1246, // 224
76 1426, 428, 727,1285,1015, 800, 106, 623, 303,1281,5022,2128,2359, 347,3815, 221, // 240
77 3558,3135,5023,1956,1153,4207, 83, 296,1199,3093, 192, 624, 93,5024, 822,1898, // 256
78 2823,3136, 795,2065, 991,1554,1542,1592, 27, 43,2867, 859, 139,1456, 860,4514, // 272
79 437, 712,3974, 164,2397,3137, 695, 211,3037,2097, 195,3975,1608,3559,3560,3684, // 288
80 3976, 234, 811,2989,2098,3977,2233,1441,3561,1615,2380, 668,2077,1638, 305, 228, // 304
81 1664,4515, 467, 415,5025, 262,2099,1593, 239, 108, 300, 200,1033, 512,1247,2078, // 320
82 5026,5027,2176,3207,3685,2682, 593, 845,1062,3277, 88,1723,2038,3978,1951, 212, // 336
83 266, 152, 149, 468,1899,4208,4516, 77, 187,5028,3038, 37, 5,2990,5029,3979, // 352
84 5030,5031, 39,2524,4517,2908,3208,2079, 55, 148, 74,4518, 545, 483,1474,1029, // 368
85 1665, 217,1870,1531,3138,1104,2655,4209, 24, 172,3562, 900,3980,3563,3564,4519, // 384
86 32,1408,2824,1312, 329, 487,2360,2251,2717, 784,2683, 4,3039,3351,1427,1789, // 400
87 188, 109, 499,5032,3686,1717,1790, 888,1217,3040,4520,5033,3565,5034,3352,1520, // 416
88 3687,3981, 196,1034, 775,5035,5036, 929,1816, 249, 439, 38,5037,1063,5038, 794, // 432
89 3982,1435,2301, 46, 178,3278,2066,5039,2381,5040, 214,1709,4521, 804, 35, 707, // 448
90 324,3688,1601,2554, 140, 459,4210,5041,5042,1365, 839, 272, 978,2262,2580,3456, // 464
91 2129,1363,3689,1423, 697, 100,3094, 48, 70,1231, 495,3139,2196,5043,1294,5044, // 480
92 2080, 462, 586,1042,3279, 853, 256, 988, 185,2382,3457,1698, 434,1084,5045,3458, // 496
93 314,2625,2788,4522,2335,2336, 569,2285, 637,1817,2525, 757,1162,1879,1616,3459, // 512
94 287,1577,2116, 768,4523,1671,2868,3566,2526,1321,3816, 909,2418,5046,4211, 933, // 528
95 3817,4212,2053,2361,1222,4524, 765,2419,1322, 786,4525,5047,1920,1462,1677,2909, // 544
96 1699,5048,4526,1424,2442,3140,3690,2600,3353,1775,1941,3460,3983,4213, 309,1369, // 560
97 1130,2825, 364,2234,1653,1299,3984,3567,3985,3986,2656, 525,1085,3041, 902,2001, // 576
98 1475, 964,4527, 421,1845,1415,1057,2286, 940,1364,3141, 376,4528,4529,1381, 7, // 592
99 2527, 983,2383, 336,1710,2684,1846, 321,3461, 559,1131,3042,2752,1809,1132,1313, // 608
100 265,1481,1858,5049, 352,1203,2826,3280, 167,1089, 420,2827, 776, 792,1724,3568, // 624
101 4214,2443,3281,5050,4215,5051, 446, 229, 333,2753, 901,3818,1200,1557,4530,2657, // 640
102 1921, 395,2754,2685,3819,4216,1836, 125, 916,3209,2626,4531,5052,5053,3820,5054, // 656
103 5055,5056,4532,3142,3691,1133,2555,1757,3462,1510,2318,1409,3569,5057,2146, 438, // 672
104 2601,2910,2384,3354,1068, 958,3043, 461, 311,2869,2686,4217,1916,3210,4218,1979, // 688
105 383, 750,2755,2627,4219, 274, 539, 385,1278,1442,5058,1154,1965, 384, 561, 210, // 704
106 98,1295,2556,3570,5059,1711,2420,1482,3463,3987,2911,1257, 129,5060,3821, 642, // 720
107 523,2789,2790,2658,5061, 141,2235,1333, 68, 176, 441, 876, 907,4220, 603,2602, // 736
108 710, 171,3464, 404, 549, 18,3143,2398,1410,3692,1666,5062,3571,4533,2912,4534, // 752
109 5063,2991, 368,5064, 146, 366, 99, 871,3693,1543, 748, 807,1586,1185, 22,2263, // 768
110 379,3822,3211,5065,3212, 505,1942,2628,1992,1382,2319,5066, 380,2362, 218, 702, // 784
111 1818,1248,3465,3044,3572,3355,3282,5067,2992,3694, 930,3283,3823,5068, 59,5069, // 800
112 585, 601,4221, 497,3466,1112,1314,4535,1802,5070,1223,1472,2177,5071, 749,1837, // 816
113 690,1900,3824,1773,3988,1476, 429,1043,1791,2236,2117, 917,4222, 447,1086,1629, // 832
114 5072, 556,5073,5074,2021,1654, 844,1090, 105, 550, 966,1758,2828,1008,1783, 686, // 848
115 1095,5075,2287, 793,1602,5076,3573,2603,4536,4223,2948,2302,4537,3825, 980,2503, // 864
116 544, 353, 527,4538, 908,2687,2913,5077, 381,2629,1943,1348,5078,1341,1252, 560, // 880
117 3095,5079,3467,2870,5080,2054, 973, 886,2081, 143,4539,5081,5082, 157,3989, 496, // 896
118 4224, 57, 840, 540,2039,4540,4541,3468,2118,1445, 970,2264,1748,1966,2082,4225, // 912
119 3144,1234,1776,3284,2829,3695, 773,1206,2130,1066,2040,1326,3990,1738,1725,4226, // 928
120 279,3145, 51,1544,2604, 423,1578,2131,2067, 173,4542,1880,5083,5084,1583, 264, // 944
121 610,3696,4543,2444, 280, 154,5085,5086,5087,1739, 338,1282,3096, 693,2871,1411, // 960
122 1074,3826,2445,5088,4544,5089,5090,1240, 952,2399,5091,2914,1538,2688, 685,1483, // 976
123 4227,2475,1436, 953,4228,2055,4545, 671,2400, 79,4229,2446,3285, 608, 567,2689, // 992
124 3469,4230,4231,1691, 393,1261,1792,2401,5092,4546,5093,5094,5095,5096,1383,1672, // 1008
125 3827,3213,1464, 522,1119, 661,1150, 216, 675,4547,3991,1432,3574, 609,4548,2690, // 1024
126 2402,5097,5098,5099,4232,3045, 0,5100,2476, 315, 231,2447, 301,3356,4549,2385, // 1040
127 5101, 233,4233,3697,1819,4550,4551,5102, 96,1777,1315,2083,5103, 257,5104,1810, // 1056
128 3698,2718,1139,1820,4234,2022,1124,2164,2791,1778,2659,5105,3097, 363,1655,3214, // 1072
129 5106,2993,5107,5108,5109,3992,1567,3993, 718, 103,3215, 849,1443, 341,3357,2949, // 1088
130 1484,5110,1712, 127, 67, 339,4235,2403, 679,1412, 821,5111,5112, 834, 738, 351, // 1104
131 2994,2147, 846, 235,1497,1881, 418,1993,3828,2719, 186,1100,2148,2756,3575,1545, // 1120
132 1355,2950,2872,1377, 583,3994,4236,2581,2995,5113,1298,3699,1078,2557,3700,2363, // 1136
133 78,3829,3830, 267,1289,2100,2002,1594,4237, 348, 369,1274,2197,2178,1838,4552, // 1152
134 1821,2830,3701,2757,2288,2003,4553,2951,2758, 144,3358, 882,4554,3995,2759,3470, // 1168
135 4555,2915,5114,4238,1726, 320,5115,3996,3046, 788,2996,5116,2831,1774,1327,2873, // 1184
136 3997,2832,5117,1306,4556,2004,1700,3831,3576,2364,2660, 787,2023, 506, 824,3702, // 1200
137 534, 323,4557,1044,3359,2024,1901, 946,3471,5118,1779,1500,1678,5119,1882,4558, // 1216
138 165, 243,4559,3703,2528, 123, 683,4239, 764,4560, 36,3998,1793, 589,2916, 816, // 1232
139 626,1667,3047,2237,1639,1555,1622,3832,3999,5120,4000,2874,1370,1228,1933, 891, // 1248
140 2084,2917, 304,4240,5121, 292,2997,2720,3577, 691,2101,4241,1115,4561, 118, 662, // 1264
141 5122, 611,1156, 854,2386,1316,2875, 2, 386, 515,2918,5123,5124,3286, 868,2238, // 1280
142 1486, 855,2661, 785,2216,3048,5125,1040,3216,3578,5126,3146, 448,5127,1525,5128, // 1296
143 2165,4562,5129,3833,5130,4242,2833,3579,3147, 503, 818,4001,3148,1568, 814, 676, // 1312
144 1444, 306,1749,5131,3834,1416,1030, 197,1428, 805,2834,1501,4563,5132,5133,5134, // 1328
145 1994,5135,4564,5136,5137,2198, 13,2792,3704,2998,3149,1229,1917,5138,3835,2132, // 1344
146 5139,4243,4565,2404,3580,5140,2217,1511,1727,1120,5141,5142, 646,3836,2448, 307, // 1360
147 5143,5144,1595,3217,5145,5146,5147,3705,1113,1356,4002,1465,2529,2530,5148, 519, // 1376
148 5149, 128,2133, 92,2289,1980,5150,4003,1512, 342,3150,2199,5151,2793,2218,1981, // 1392
149 3360,4244, 290,1656,1317, 789, 827,2365,5152,3837,4566, 562, 581,4004,5153, 401, // 1408
150 4567,2252, 94,4568,5154,1399,2794,5155,1463,2025,4569,3218,1944,5156, 828,1105, // 1424
151 4245,1262,1394,5157,4246, 605,4570,5158,1784,2876,5159,2835, 819,2102, 578,2200, // 1440
152 2952,5160,1502, 436,3287,4247,3288,2836,4005,2919,3472,3473,5161,2721,2320,5162, // 1456
153 5163,2337,2068, 23,4571, 193, 826,3838,2103, 699,1630,4248,3098, 390,1794,1064, // 1472
154 3581,5164,1579,3099,3100,1400,5165,4249,1839,1640,2877,5166,4572,4573, 137,4250, // 1488
155 598,3101,1967, 780, 104, 974,2953,5167, 278, 899, 253, 402, 572, 504, 493,1339, // 1504
156 5168,4006,1275,4574,2582,2558,5169,3706,3049,3102,2253, 565,1334,2722, 863, 41, // 1520
157 5170,5171,4575,5172,1657,2338, 19, 463,2760,4251, 606,5173,2999,3289,1087,2085, // 1536
158 1323,2662,3000,5174,1631,1623,1750,4252,2691,5175,2878, 791,2723,2663,2339, 232, // 1552
159 2421,5176,3001,1498,5177,2664,2630, 755,1366,3707,3290,3151,2026,1609, 119,1918, // 1568
160 3474, 862,1026,4253,5178,4007,3839,4576,4008,4577,2265,1952,2477,5179,1125, 817, // 1584
161 4254,4255,4009,1513,1766,2041,1487,4256,3050,3291,2837,3840,3152,5180,5181,1507, // 1600
162 5182,2692, 733, 40,1632,1106,2879, 345,4257, 841,2531, 230,4578,3002,1847,3292, // 1616
163 3475,5183,1263, 986,3476,5184, 735, 879, 254,1137, 857, 622,1300,1180,1388,1562, // 1632
164 4010,4011,2954, 967,2761,2665,1349, 592,2134,1692,3361,3003,1995,4258,1679,4012, // 1648
165 1902,2188,5185, 739,3708,2724,1296,1290,5186,4259,2201,2202,1922,1563,2605,2559, // 1664
166 1871,2762,3004,5187, 435,5188, 343,1108, 596, 17,1751,4579,2239,3477,3709,5189, // 1680
167 4580, 294,3582,2955,1693, 477, 979, 281,2042,3583, 643,2043,3710,2631,2795,2266, // 1696
168 1031,2340,2135,2303,3584,4581, 367,1249,2560,5190,3585,5191,4582,1283,3362,2005, // 1712
169 240,1762,3363,4583,4584, 836,1069,3153, 474,5192,2149,2532, 268,3586,5193,3219, // 1728
170 1521,1284,5194,1658,1546,4260,5195,3587,3588,5196,4261,3364,2693,1685,4262, 961, // 1744
171 1673,2632, 190,2006,2203,3841,4585,4586,5197, 570,2504,3711,1490,5198,4587,2633, // 1760
172 3293,1957,4588, 584,1514, 396,1045,1945,5199,4589,1968,2449,5200,5201,4590,4013, // 1776
173 619,5202,3154,3294, 215,2007,2796,2561,3220,4591,3221,4592, 763,4263,3842,4593, // 1792
174 5203,5204,1958,1767,2956,3365,3712,1174, 452,1477,4594,3366,3155,5205,2838,1253, // 1808
175 2387,2189,1091,2290,4264, 492,5206, 638,1169,1825,2136,1752,4014, 648, 926,1021, // 1824
176 1324,4595, 520,4596, 997, 847,1007, 892,4597,3843,2267,1872,3713,2405,1785,4598, // 1840
177 1953,2957,3103,3222,1728,4265,2044,3714,4599,2008,1701,3156,1551, 30,2268,4266, // 1856
178 5207,2027,4600,3589,5208, 501,5209,4267, 594,3478,2166,1822,3590,3479,3591,3223, // 1872
179 829,2839,4268,5210,1680,3157,1225,4269,5211,3295,4601,4270,3158,2341,5212,4602, // 1888
180 4271,5213,4015,4016,5214,1848,2388,2606,3367,5215,4603, 374,4017, 652,4272,4273, // 1904
181 375,1140, 798,5216,5217,5218,2366,4604,2269, 546,1659, 138,3051,2450,4605,5219, // 1920
182 2254, 612,1849, 910, 796,3844,1740,1371, 825,3845,3846,5220,2920,2562,5221, 692, // 1936
183 444,3052,2634, 801,4606,4274,5222,1491, 244,1053,3053,4275,4276, 340,5223,4018, // 1952
184 1041,3005, 293,1168, 87,1357,5224,1539, 959,5225,2240, 721, 694,4277,3847, 219, // 1968
185 1478, 644,1417,3368,2666,1413,1401,1335,1389,4019,5226,5227,3006,2367,3159,1826, // 1984
186 730,1515, 184,2840, 66,4607,5228,1660,2958, 246,3369, 378,1457, 226,3480, 975, // 2000
187 4020,2959,1264,3592, 674, 696,5229, 163,5230,1141,2422,2167, 713,3593,3370,4608, // 2016
188 4021,5231,5232,1186, 15,5233,1079,1070,5234,1522,3224,3594, 276,1050,2725, 758, // 2032
189 1126, 653,2960,3296,5235,2342, 889,3595,4022,3104,3007, 903,1250,4609,4023,3481, // 2048
190 3596,1342,1681,1718, 766,3297, 286, 89,2961,3715,5236,1713,5237,2607,3371,3008, // 2064
191 5238,2962,2219,3225,2880,5239,4610,2505,2533, 181, 387,1075,4024, 731,2190,3372, // 2080
192 5240,3298, 310, 313,3482,2304, 770,4278, 54,3054, 189,4611,3105,3848,4025,5241, // 2096
193 1230,1617,1850, 355,3597,4279,4612,3373, 111,4280,3716,1350,3160,3483,3055,4281, // 2112
194 2150,3299,3598,5242,2797,4026,4027,3009, 722,2009,5243,1071, 247,1207,2343,2478, // 2128
195 1378,4613,2010, 864,1437,1214,4614, 373,3849,1142,2220, 667,4615, 442,2763,2563, // 2144
196 3850,4028,1969,4282,3300,1840, 837, 170,1107, 934,1336,1883,5244,5245,2119,4283, // 2160
197 2841, 743,1569,5246,4616,4284, 582,2389,1418,3484,5247,1803,5248, 357,1395,1729, // 2176
198 3717,3301,2423,1564,2241,5249,3106,3851,1633,4617,1114,2086,4285,1532,5250, 482, // 2192
199 2451,4618,5251,5252,1492, 833,1466,5253,2726,3599,1641,2842,5254,1526,1272,3718, // 2208
200 4286,1686,1795, 416,2564,1903,1954,1804,5255,3852,2798,3853,1159,2321,5256,2881, // 2224
201 4619,1610,1584,3056,2424,2764, 443,3302,1163,3161,5257,5258,4029,5259,4287,2506, // 2240
202 3057,4620,4030,3162,2104,1647,3600,2011,1873,4288,5260,4289, 431,3485,5261, 250, // 2256
203 97, 81,4290,5262,1648,1851,1558, 160, 848,5263, 866, 740,1694,5264,2204,2843, // 2272
204 3226,4291,4621,3719,1687, 950,2479, 426, 469,3227,3720,3721,4031,5265,5266,1188, // 2288
205 424,1996, 861,3601,4292,3854,2205,2694, 168,1235,3602,4293,5267,2087,1674,4622, // 2304
206 3374,3303, 220,2565,1009,5268,3855, 670,3010, 332,1208, 717,5269,5270,3603,2452, // 2320
207 4032,3375,5271, 513,5272,1209,2882,3376,3163,4623,1080,5273,5274,5275,5276,2534, // 2336
208 3722,3604, 815,1587,4033,4034,5277,3605,3486,3856,1254,4624,1328,3058,1390,4035, // 2352
209 1741,4036,3857,4037,5278, 236,3858,2453,3304,5279,5280,3723,3859,1273,3860,4625, // 2368
210 5281, 308,5282,4626, 245,4627,1852,2480,1307,2583, 430, 715,2137,2454,5283, 270, // 2384
211 199,2883,4038,5284,3606,2727,1753, 761,1754, 725,1661,1841,4628,3487,3724,5285, // 2400
212 5286, 587, 14,3305, 227,2608, 326, 480,2270, 943,2765,3607, 291, 650,1884,5287, // 2416
213 1702,1226, 102,1547, 62,3488, 904,4629,3489,1164,4294,5288,5289,1224,1548,2766, // 2432
214 391, 498,1493,5290,1386,1419,5291,2056,1177,4630, 813, 880,1081,2368, 566,1145, // 2448
215 4631,2291,1001,1035,2566,2609,2242, 394,1286,5292,5293,2069,5294, 86,1494,1730, // 2464
216 4039, 491,1588, 745, 897,2963, 843,3377,4040,2767,2884,3306,1768, 998,2221,2070, // 2480
217 397,1827,1195,1970,3725,3011,3378, 284,5295,3861,2507,2138,2120,1904,5296,4041, // 2496
218 2151,4042,4295,1036,3490,1905, 114,2567,4296, 209,1527,5297,5298,2964,2844,2635, // 2512
219 2390,2728,3164, 812,2568,5299,3307,5300,1559, 737,1885,3726,1210, 885, 28,2695, // 2528
220 3608,3862,5301,4297,1004,1780,4632,5302, 346,1982,2222,2696,4633,3863,1742, 797, // 2544
221 1642,4043,1934,1072,1384,2152, 896,4044,3308,3727,3228,2885,3609,5303,2569,1959, // 2560
222 4634,2455,1786,5304,5305,5306,4045,4298,1005,1308,3728,4299,2729,4635,4636,1528, // 2576
223 2610, 161,1178,4300,1983, 987,4637,1101,4301, 631,4046,1157,3229,2425,1343,1241, // 2592
224 1016,2243,2570, 372, 877,2344,2508,1160, 555,1935, 911,4047,5307, 466,1170, 169, // 2608
225 1051,2921,2697,3729,2481,3012,1182,2012,2571,1251,2636,5308, 992,2345,3491,1540, // 2624
226 2730,1201,2071,2406,1997,2482,5309,4638, 528,1923,2191,1503,1874,1570,2369,3379, // 2640
227 3309,5310, 557,1073,5311,1828,3492,2088,2271,3165,3059,3107, 767,3108,2799,4639, // 2656
228 1006,4302,4640,2346,1267,2179,3730,3230, 778,4048,3231,2731,1597,2667,5312,4641, // 2672
229 5313,3493,5314,5315,5316,3310,2698,1433,3311, 131, 95,1504,4049, 723,4303,3166, // 2688
230 1842,3610,2768,2192,4050,2028,2105,3731,5317,3013,4051,1218,5318,3380,3232,4052, // 2704
231 4304,2584, 248,1634,3864, 912,5319,2845,3732,3060,3865, 654, 53,5320,3014,5321, // 2720
232 1688,4642, 777,3494,1032,4053,1425,5322, 191, 820,2121,2846, 971,4643, 931,3233, // 2736
233 135, 664, 783,3866,1998, 772,2922,1936,4054,3867,4644,2923,3234, 282,2732, 640, // 2752
234 1372,3495,1127, 922, 325,3381,5323,5324, 711,2045,5325,5326,4055,2223,2800,1937, // 2768
235 4056,3382,2224,2255,3868,2305,5327,4645,3869,1258,3312,4057,3235,2139,2965,4058, // 2784
236 4059,5328,2225, 258,3236,4646, 101,1227,5329,3313,1755,5330,1391,3314,5331,2924, // 2800
237 2057, 893,5332,5333,5334,1402,4305,2347,5335,5336,3237,3611,5337,5338, 878,1325, // 2816
238 1781,2801,4647, 259,1385,2585, 744,1183,2272,4648,5339,4060,2509,5340, 684,1024, // 2832
239 4306,5341, 472,3612,3496,1165,3315,4061,4062, 322,2153, 881, 455,1695,1152,1340, // 2848
240 660, 554,2154,4649,1058,4650,4307, 830,1065,3383,4063,4651,1924,5342,1703,1919, // 2864
241 5343, 932,2273, 122,5344,4652, 947, 677,5345,3870,2637, 297,1906,1925,2274,4653, // 2880
242 2322,3316,5346,5347,4308,5348,4309, 84,4310, 112, 989,5349, 547,1059,4064, 701, // 2896
243 3613,1019,5350,4311,5351,3497, 942, 639, 457,2306,2456, 993,2966, 407, 851, 494, // 2912
244 4654,3384, 927,5352,1237,5353,2426,3385, 573,4312, 680, 921,2925,1279,1875, 285, // 2928
245 790,1448,1984, 719,2168,5354,5355,4655,4065,4066,1649,5356,1541, 563,5357,1077, // 2944
246 5358,3386,3061,3498, 511,3015,4067,4068,3733,4069,1268,2572,3387,3238,4656,4657, // 2960
247 5359, 535,1048,1276,1189,2926,2029,3167,1438,1373,2847,2967,1134,2013,5360,4313, // 2976
248 1238,2586,3109,1259,5361, 700,5362,2968,3168,3734,4314,5363,4315,1146,1876,1907, // 2992
249 4658,2611,4070, 781,2427, 132,1589, 203, 147, 273,2802,2407, 898,1787,2155,4071, // 3008
250 4072,5364,3871,2803,5365,5366,4659,4660,5367,3239,5368,1635,3872, 965,5369,1805, // 3024
251 2699,1516,3614,1121,1082,1329,3317,4073,1449,3873, 65,1128,2848,2927,2769,1590, // 3040
252 3874,5370,5371, 12,2668, 45, 976,2587,3169,4661, 517,2535,1013,1037,3240,5372, // 3056
253 3875,2849,5373,3876,5374,3499,5375,2612, 614,1999,2323,3877,3110,2733,2638,5376, // 3072
254 2588,4316, 599,1269,5377,1811,3735,5378,2700,3111, 759,1060, 489,1806,3388,3318, // 3088
255 1358,5379,5380,2391,1387,1215,2639,2256, 490,5381,5382,4317,1759,2392,2348,5383, // 3104
256 4662,3878,1908,4074,2640,1807,3241,4663,3500,3319,2770,2349, 874,5384,5385,3501, // 3120
257 3736,1859, 91,2928,3737,3062,3879,4664,5386,3170,4075,2669,5387,3502,1202,1403, // 3136
258 3880,2969,2536,1517,2510,4665,3503,2511,5388,4666,5389,2701,1886,1495,1731,4076, // 3152
259 2370,4667,5390,2030,5391,5392,4077,2702,1216, 237,2589,4318,2324,4078,3881,4668, // 3168
260 4669,2703,3615,3504, 445,4670,5393,5394,5395,5396,2771, 61,4079,3738,1823,4080, // 3184
261 5397, 687,2046, 935, 925, 405,2670, 703,1096,1860,2734,4671,4081,1877,1367,2704, // 3200
262 3389, 918,2106,1782,2483, 334,3320,1611,1093,4672, 564,3171,3505,3739,3390, 945, // 3216
263 2641,2058,4673,5398,1926, 872,4319,5399,3506,2705,3112, 349,4320,3740,4082,4674, // 3232
264 3882,4321,3741,2156,4083,4675,4676,4322,4677,2408,2047, 782,4084, 400, 251,4323, // 3248
265 1624,5400,5401, 277,3742, 299,1265, 476,1191,3883,2122,4324,4325,1109, 205,5402, // 3264
266 2590,1000,2157,3616,1861,5403,5404,5405,4678,5406,4679,2573, 107,2484,2158,4085, // 3280
267 3507,3172,5407,1533, 541,1301, 158, 753,4326,2886,3617,5408,1696, 370,1088,4327, // 3296
268 4680,3618, 579, 327, 440, 162,2244, 269,1938,1374,3508, 968,3063, 56,1396,3113, // 3312
269 2107,3321,3391,5409,1927,2159,4681,3016,5410,3619,5411,5412,3743,4682,2485,5413, // 3328
270 2804,5414,1650,4683,5415,2613,5416,5417,4086,2671,3392,1149,3393,4087,3884,4088, // 3344
271 5418,1076, 49,5419, 951,3242,3322,3323, 450,2850, 920,5420,1812,2805,2371,4328, // 3360
272 1909,1138,2372,3885,3509,5421,3243,4684,1910,1147,1518,2428,4685,3886,5422,4686, // 3376
273 2393,2614, 260,1796,3244,5423,5424,3887,3324, 708,5425,3620,1704,5426,3621,1351, // 3392
274 1618,3394,3017,1887, 944,4329,3395,4330,3064,3396,4331,5427,3744, 422, 413,1714, // 3408
275 3325, 500,2059,2350,4332,2486,5428,1344,1911, 954,5429,1668,5430,5431,4089,2409, // 3424
276 4333,3622,3888,4334,5432,2307,1318,2512,3114, 133,3115,2887,4687, 629, 31,2851, // 3440
277 2706,3889,4688, 850, 949,4689,4090,2970,1732,2089,4335,1496,1853,5433,4091, 620, // 3456
278 3245, 981,1242,3745,3397,1619,3746,1643,3326,2140,2457,1971,1719,3510,2169,5434, // 3472
279 3246,5435,5436,3398,1829,5437,1277,4690,1565,2048,5438,1636,3623,3116,5439, 869, // 3488
280 2852, 655,3890,3891,3117,4092,3018,3892,1310,3624,4691,5440,5441,5442,1733, 558, // 3504
281 4692,3747, 335,1549,3065,1756,4336,3748,1946,3511,1830,1291,1192, 470,2735,2108, // 3520
282 2806, 913,1054,4093,5443,1027,5444,3066,4094,4693, 982,2672,3399,3173,3512,3247, // 3536
283 3248,1947,2807,5445, 571,4694,5446,1831,5447,3625,2591,1523,2429,5448,2090, 984, // 3552
284 4695,3749,1960,5449,3750, 852, 923,2808,3513,3751, 969,1519, 999,2049,2325,1705, // 3568
285 5450,3118, 615,1662, 151, 597,4095,2410,2326,1049, 275,4696,3752,4337, 568,3753, // 3584
286 3626,2487,4338,3754,5451,2430,2275, 409,3249,5452,1566,2888,3514,1002, 769,2853, // 3600
287 194,2091,3174,3755,2226,3327,4339, 628,1505,5453,5454,1763,2180,3019,4096, 521, // 3616
288 1161,2592,1788,2206,2411,4697,4097,1625,4340,4341, 412, 42,3119, 464,5455,2642, // 3632
289 4698,3400,1760,1571,2889,3515,2537,1219,2207,3893,2643,2141,2373,4699,4700,3328, // 3648
290 1651,3401,3627,5456,5457,3628,2488,3516,5458,3756,5459,5460,2276,2092, 460,5461, // 3664
291 4701,5462,3020, 962, 588,3629, 289,3250,2644,1116, 52,5463,3067,1797,5464,5465, // 3680
292 5466,1467,5467,1598,1143,3757,4342,1985,1734,1067,4702,1280,3402, 465,4703,1572, // 3696
293 510,5468,1928,2245,1813,1644,3630,5469,4704,3758,5470,5471,2673,1573,1534,5472, // 3712
294 5473, 536,1808,1761,3517,3894,3175,2645,5474,5475,5476,4705,3518,2929,1912,2809, // 3728
295 5477,3329,1122, 377,3251,5478, 360,5479,5480,4343,1529, 551,5481,2060,3759,1769, // 3744
296 2431,5482,2930,4344,3330,3120,2327,2109,2031,4706,1404, 136,1468,1479, 672,1171, // 3760
297 3252,2308, 271,3176,5483,2772,5484,2050, 678,2736, 865,1948,4707,5485,2014,4098, // 3776
298 2971,5486,2737,2227,1397,3068,3760,4708,4709,1735,2931,3403,3631,5487,3895, 509, // 3792
299 2854,2458,2890,3896,5488,5489,3177,3178,4710,4345,2538,4711,2309,1166,1010, 552, // 3808
300 681,1888,5490,5491,2972,2973,4099,1287,1596,1862,3179, 358, 453, 736, 175, 478, // 3824
301 1117, 905,1167,1097,5492,1854,1530,5493,1706,5494,2181,3519,2292,3761,3520,3632, // 3840
302 4346,2093,4347,5495,3404,1193,2489,4348,1458,2193,2208,1863,1889,1421,3331,2932, // 3856
303 3069,2182,3521, 595,2123,5496,4100,5497,5498,4349,1707,2646, 223,3762,1359, 751, // 3872
304 3121, 183,3522,5499,2810,3021, 419,2374, 633, 704,3897,2394, 241,5500,5501,5502, // 3888
305 838,3022,3763,2277,2773,2459,3898,1939,2051,4101,1309,3122,2246,1181,5503,1136, // 3904
306 2209,3899,2375,1446,4350,2310,4712,5504,5505,4351,1055,2615, 484,3764,5506,4102, // 3920
307 625,4352,2278,3405,1499,4353,4103,5507,4104,4354,3253,2279,2280,3523,5508,5509, // 3936
308 2774, 808,2616,3765,3406,4105,4355,3123,2539, 526,3407,3900,4356, 955,5510,1620, // 3952
309 4357,2647,2432,5511,1429,3766,1669,1832, 994, 928,5512,3633,1260,5513,5514,5515, // 3968
310 1949,2293, 741,2933,1626,4358,2738,2460, 867,1184, 362,3408,1392,5516,5517,4106, // 3984
311 4359,1770,1736,3254,2934,4713,4714,1929,2707,1459,1158,5518,3070,3409,2891,1292, // 4000
312 1930,2513,2855,3767,1986,1187,2072,2015,2617,4360,5519,2574,2514,2170,3768,2490, // 4016
313 3332,5520,3769,4715,5521,5522, 666,1003,3023,1022,3634,4361,5523,4716,1814,2257, // 4032
314 574,3901,1603, 295,1535, 705,3902,4362, 283, 858, 417,5524,5525,3255,4717,4718, // 4048
315 3071,1220,1890,1046,2281,2461,4107,1393,1599, 689,2575, 388,4363,5526,2491, 802, // 4064
316 5527,2811,3903,2061,1405,2258,5528,4719,3904,2110,1052,1345,3256,1585,5529, 809, // 4080
317 5530,5531,5532, 575,2739,3524, 956,1552,1469,1144,2328,5533,2329,1560,2462,3635, // 4096
318 3257,4108, 616,2210,4364,3180,2183,2294,5534,1833,5535,3525,4720,5536,1319,3770, // 4112
319 3771,1211,3636,1023,3258,1293,2812,5537,5538,5539,3905, 607,2311,3906, 762,2892, // 4128
320 1439,4365,1360,4721,1485,3072,5540,4722,1038,4366,1450,2062,2648,4367,1379,4723, // 4144
321 2593,5541,5542,4368,1352,1414,2330,2935,1172,5543,5544,3907,3908,4724,1798,1451, // 4160
322 5545,5546,5547,5548,2936,4109,4110,2492,2351, 411,4111,4112,3637,3333,3124,4725, // 4176
323 1561,2674,1452,4113,1375,5549,5550, 47,2974, 316,5551,1406,1591,2937,3181,5552, // 4192
324 1025,2142,3125,3182, 354,2740, 884,2228,4369,2412, 508,3772, 726,3638, 996,2433, // 4208
325 3639, 729,5553, 392,2194,1453,4114,4726,3773,5554,5555,2463,3640,2618,1675,2813, // 4224
326 919,2352,2975,2353,1270,4727,4115, 73,5556,5557, 647,5558,3259,2856,2259,1550, // 4240
327 1346,3024,5559,1332, 883,3526,5560,5561,5562,5563,3334,2775,5564,1212, 831,1347, // 4256
328 4370,4728,2331,3909,1864,3073, 720,3910,4729,4730,3911,5565,4371,5566,5567,4731, // 4272
329 5568,5569,1799,4732,3774,2619,4733,3641,1645,2376,4734,5570,2938, 669,2211,2675, // 4288
330 2434,5571,2893,5572,5573,1028,3260,5574,4372,2413,5575,2260,1353,5576,5577,4735, // 4304
331 3183, 518,5578,4116,5579,4373,1961,5580,2143,4374,5581,5582,3025,2354,2355,3912, // 4320
332 516,1834,1454,4117,2708,4375,4736,2229,2620,1972,1129,3642,5583,2776,5584,2976, // 4336
333 1422, 577,1470,3026,1524,3410,5585,5586, 432,4376,3074,3527,5587,2594,1455,2515, // 4352
334 2230,1973,1175,5588,1020,2741,4118,3528,4737,5589,2742,5590,1743,1361,3075,3529, // 4368
335 2649,4119,4377,4738,2295, 895, 924,4378,2171, 331,2247,3076, 166,1627,3077,1098, // 4384
336 5591,1232,2894,2231,3411,4739, 657, 403,1196,2377, 542,3775,3412,1600,4379,3530, // 4400
337 5592,4740,2777,3261, 576, 530,1362,4741,4742,2540,2676,3776,4120,5593, 842,3913, // 4416
338 5594,2814,2032,1014,4121, 213,2709,3413, 665, 621,4380,5595,3777,2939,2435,5596, // 4432
339 2436,3335,3643,3414,4743,4381,2541,4382,4744,3644,1682,4383,3531,1380,5597, 724, // 4448
340 2282, 600,1670,5598,1337,1233,4745,3126,2248,5599,1621,4746,5600, 651,4384,5601, // 4464
341 1612,4385,2621,5602,2857,5603,2743,2312,3078,5604, 716,2464,3079, 174,1255,2710, // 4480
342 4122,3645, 548,1320,1398, 728,4123,1574,5605,1891,1197,3080,4124,5606,3081,3082, // 4496
343 3778,3646,3779, 747,5607, 635,4386,4747,5608,5609,5610,4387,5611,5612,4748,5613, // 4512
344 3415,4749,2437, 451,5614,3780,2542,2073,4388,2744,4389,4125,5615,1764,4750,5616, // 4528
345 4390, 350,4751,2283,2395,2493,5617,4391,4126,2249,1434,4127, 488,4752, 458,4392, // 4544
346 4128,3781, 771,1330,2396,3914,2576,3184,2160,2414,1553,2677,3185,4393,5618,2494, // 4560
347 2895,2622,1720,2711,4394,3416,4753,5619,2543,4395,5620,3262,4396,2778,5621,2016, // 4576
348 2745,5622,1155,1017,3782,3915,5623,3336,2313, 201,1865,4397,1430,5624,4129,5625, // 4592
349 5626,5627,5628,5629,4398,1604,5630, 414,1866, 371,2595,4754,4755,3532,2017,3127, // 4608
350 4756,1708, 960,4399, 887, 389,2172,1536,1663,1721,5631,2232,4130,2356,2940,1580, // 4624
351 5632,5633,1744,4757,2544,4758,4759,5634,4760,5635,2074,5636,4761,3647,3417,2896, // 4640
352 4400,5637,4401,2650,3418,2815, 673,2712,2465, 709,3533,4131,3648,4402,5638,1148, // 4656
353 502, 634,5639,5640,1204,4762,3649,1575,4763,2623,3783,5641,3784,3128, 948,3263, // 4672
354 121,1745,3916,1110,5642,4403,3083,2516,3027,4132,3785,1151,1771,3917,1488,4133, // 4688
355 1987,5643,2438,3534,5644,5645,2094,5646,4404,3918,1213,1407,2816, 531,2746,2545, // 4704
356 3264,1011,1537,4764,2779,4405,3129,1061,5647,3786,3787,1867,2897,5648,2018, 120, // 4720
357 4406,4407,2063,3650,3265,2314,3919,2678,3419,1955,4765,4134,5649,3535,1047,2713, // 4736
358 1266,5650,1368,4766,2858, 649,3420,3920,2546,2747,1102,2859,2679,5651,5652,2000, // 4752
359 5653,1111,3651,2977,5654,2495,3921,3652,2817,1855,3421,3788,5655,5656,3422,2415, // 4768
360 2898,3337,3266,3653,5657,2577,5658,3654,2818,4135,1460, 856,5659,3655,5660,2899, // 4784
361 2978,5661,2900,3922,5662,4408, 632,2517, 875,3923,1697,3924,2296,5663,5664,4767, // 4800
362 3028,1239, 580,4768,4409,5665, 914, 936,2075,1190,4136,1039,2124,5666,5667,5668, // 4816
363 5669,3423,1473,5670,1354,4410,3925,4769,2173,3084,4137, 915,3338,4411,4412,3339, // 4832
364 1605,1835,5671,2748, 398,3656,4413,3926,4138, 328,1913,2860,4139,3927,1331,4414, // 4848
365 3029, 937,4415,5672,3657,4140,4141,3424,2161,4770,3425, 524, 742, 538,3085,1012, // 4864
366 5673,5674,3928,2466,5675, 658,1103, 225,3929,5676,5677,4771,5678,4772,5679,3267, // 4880
367 1243,5680,4142, 963,2250,4773,5681,2714,3658,3186,5682,5683,2596,2332,5684,4774, // 4896
368 5685,5686,5687,3536, 957,3426,2547,2033,1931,2941,2467, 870,2019,3659,1746,2780, // 4912
369 2781,2439,2468,5688,3930,5689,3789,3130,3790,3537,3427,3791,5690,1179,3086,5691, // 4928
370 3187,2378,4416,3792,2548,3188,3131,2749,4143,5692,3428,1556,2549,2297, 977,2901, // 4944
371 2034,4144,1205,3429,5693,1765,3430,3189,2125,1271, 714,1689,4775,3538,5694,2333, // 4960
372 3931, 533,4417,3660,2184, 617,5695,2469,3340,3539,2315,5696,5697,3190,5698,5699, // 4976
373 3932,1988, 618, 427,2651,3540,3431,5700,5701,1244,1690,5702,2819,4418,4776,5703, // 4992
374 3541,4777,5704,2284,1576, 473,3661,4419,3432, 972,5705,3662,5706,3087,5707,5708, // 5008
375 4778,4779,5709,3793,4145,4146,5710, 153,4780, 356,5711,1892,2902,4420,2144, 408, // 5024
376 803,2357,5712,3933,5713,4421,1646,2578,2518,4781,4782,3934,5714,3935,4422,5715, // 5040
377 2416,3433, 752,5716,5717,1962,3341,2979,5718, 746,3030,2470,4783,4423,3794, 698, // 5056
378 4784,1893,4424,3663,2550,4785,3664,3936,5719,3191,3434,5720,1824,1302,4147,2715, // 5072
379 3937,1974,4425,5721,4426,3192, 823,1303,1288,1236,2861,3542,4148,3435, 774,3938, // 5088
380 5722,1581,4786,1304,2862,3939,4787,5723,2440,2162,1083,3268,4427,4149,4428, 344, // 5104
381 1173, 288,2316, 454,1683,5724,5725,1461,4788,4150,2597,5726,5727,4789, 985, 894, // 5120
382 5728,3436,3193,5729,1914,2942,3795,1989,5730,2111,1975,5731,4151,5732,2579,1194, // 5136
383 425,5733,4790,3194,1245,3796,4429,5734,5735,2863,5736, 636,4791,1856,3940, 760, // 5152
384 1800,5737,4430,2212,1508,4792,4152,1894,1684,2298,5738,5739,4793,4431,4432,2213, // 5168
385 479,5740,5741, 832,5742,4153,2496,5743,2980,2497,3797, 990,3132, 627,1815,2652, // 5184
386 4433,1582,4434,2126,2112,3543,4794,5744, 799,4435,3195,5745,4795,2113,1737,3031, // 5200
387 1018, 543, 754,4436,3342,1676,4796,4797,4154,4798,1489,5746,3544,5747,2624,2903, // 5216
388 4155,5748,5749,2981,5750,5751,5752,5753,3196,4799,4800,2185,1722,5754,3269,3270, // 5232
389 1843,3665,1715, 481, 365,1976,1857,5755,5756,1963,2498,4801,5757,2127,3666,3271, // 5248
390 433,1895,2064,2076,5758, 602,2750,5759,5760,5761,5762,5763,3032,1628,3437,5764, // 5264
391 3197,4802,4156,2904,4803,2519,5765,2551,2782,5766,5767,5768,3343,4804,2905,5769, // 5280
392 4805,5770,2864,4806,4807,1221,2982,4157,2520,5771,5772,5773,1868,1990,5774,5775, // 5296
393 5776,1896,5777,5778,4808,1897,4158, 318,5779,2095,4159,4437,5780,5781, 485,5782, // 5312
394 938,3941, 553,2680, 116,5783,3942,3667,5784,3545,2681,2783,3438,3344,2820,5785, // 5328
395 3668,2943,4160,1747,2944,2983,5786,5787, 207,5788,4809,5789,4810,2521,5790,3033, // 5344
396 890,3669,3943,5791,1878,3798,3439,5792,2186,2358,3440,1652,5793,5794,5795, 941, // 5360
397 2299, 208,3546,4161,2020, 330,4438,3944,2906,2499,3799,4439,4811,5796,5797,5798, // 5376 //last 512
398
399 /***************************************************************************************
400 *Everything below is of no interest for detection purpose *
401 ***************************************************************************************
402
403 2522,1613,4812,5799,3345,3945,2523,5800,4162,5801,1637,4163,2471,4813,3946,5802, // 5392
404 2500,3034,3800,5803,5804,2195,4814,5805,2163,5806,5807,5808,5809,5810,5811,5812, // 5408
405 5813,5814,5815,5816,5817,5818,5819,5820,5821,5822,5823,5824,5825,5826,5827,5828, // 5424
406 5829,5830,5831,5832,5833,5834,5835,5836,5837,5838,5839,5840,5841,5842,5843,5844, // 5440
407 5845,5846,5847,5848,5849,5850,5851,5852,5853,5854,5855,5856,5857,5858,5859,5860, // 5456
408 5861,5862,5863,5864,5865,5866,5867,5868,5869,5870,5871,5872,5873,5874,5875,5876, // 5472
409 5877,5878,5879,5880,5881,5882,5883,5884,5885,5886,5887,5888,5889,5890,5891,5892, // 5488
410 5893,5894,5895,5896,5897,5898,5899,5900,5901,5902,5903,5904,5905,5906,5907,5908, // 5504
411 5909,5910,5911,5912,5913,5914,5915,5916,5917,5918,5919,5920,5921,5922,5923,5924, // 5520
412 5925,5926,5927,5928,5929,5930,5931,5932,5933,5934,5935,5936,5937,5938,5939,5940, // 5536
413 5941,5942,5943,5944,5945,5946,5947,5948,5949,5950,5951,5952,5953,5954,5955,5956, // 5552
414 5957,5958,5959,5960,5961,5962,5963,5964,5965,5966,5967,5968,5969,5970,5971,5972, // 5568
415 5973,5974,5975,5976,5977,5978,5979,5980,5981,5982,5983,5984,5985,5986,5987,5988, // 5584
416 5989,5990,5991,5992,5993,5994,5995,5996,5997,5998,5999,6000,6001,6002,6003,6004, // 5600
417 6005,6006,6007,6008,6009,6010,6011,6012,6013,6014,6015,6016,6017,6018,6019,6020, // 5616
418 6021,6022,6023,6024,6025,6026,6027,6028,6029,6030,6031,6032,6033,6034,6035,6036, // 5632
419 6037,6038,6039,6040,6041,6042,6043,6044,6045,6046,6047,6048,6049,6050,6051,6052, // 5648
420 6053,6054,6055,6056,6057,6058,6059,6060,6061,6062,6063,6064,6065,6066,6067,6068, // 5664
421 6069,6070,6071,6072,6073,6074,6075,6076,6077,6078,6079,6080,6081,6082,6083,6084, // 5680
422 6085,6086,6087,6088,6089,6090,6091,6092,6093,6094,6095,6096,6097,6098,6099,6100, // 5696
423 6101,6102,6103,6104,6105,6106,6107,6108,6109,6110,6111,6112,6113,6114,6115,6116, // 5712
424 6117,6118,6119,6120,6121,6122,6123,6124,6125,6126,6127,6128,6129,6130,6131,6132, // 5728
425 6133,6134,6135,6136,6137,6138,6139,6140,6141,6142,6143,6144,6145,6146,6147,6148, // 5744
426 6149,6150,6151,6152,6153,6154,6155,6156,6157,6158,6159,6160,6161,6162,6163,6164, // 5760
427 6165,6166,6167,6168,6169,6170,6171,6172,6173,6174,6175,6176,6177,6178,6179,6180, // 5776
428 6181,6182,6183,6184,6185,6186,6187,6188,6189,6190,6191,6192,6193,6194,6195,6196, // 5792
429 6197,6198,6199,6200,6201,6202,6203,6204,6205,6206,6207,6208,6209,6210,6211,6212, // 5808
430 6213,6214,6215,6216,6217,6218,6219,6220,6221,6222,6223,3670,6224,6225,6226,6227, // 5824
431 6228,6229,6230,6231,6232,6233,6234,6235,6236,6237,6238,6239,6240,6241,6242,6243, // 5840
432 6244,6245,6246,6247,6248,6249,6250,6251,6252,6253,6254,6255,6256,6257,6258,6259, // 5856
433 6260,6261,6262,6263,6264,6265,6266,6267,6268,6269,6270,6271,6272,6273,6274,6275, // 5872
434 6276,6277,6278,6279,6280,6281,6282,6283,6284,6285,4815,6286,6287,6288,6289,6290, // 5888
435 6291,6292,4816,6293,6294,6295,6296,6297,6298,6299,6300,6301,6302,6303,6304,6305, // 5904
436 6306,6307,6308,6309,6310,6311,4817,4818,6312,6313,6314,6315,6316,6317,6318,4819, // 5920
437 6319,6320,6321,6322,6323,6324,6325,6326,6327,6328,6329,6330,6331,6332,6333,6334, // 5936
438 6335,6336,6337,4820,6338,6339,6340,6341,6342,6343,6344,6345,6346,6347,6348,6349, // 5952
439 6350,6351,6352,6353,6354,6355,6356,6357,6358,6359,6360,6361,6362,6363,6364,6365, // 5968
440 6366,6367,6368,6369,6370,6371,6372,6373,6374,6375,6376,6377,6378,6379,6380,6381, // 5984
441 6382,6383,6384,6385,6386,6387,6388,6389,6390,6391,6392,6393,6394,6395,6396,6397, // 6000
442 6398,6399,6400,6401,6402,6403,6404,6405,6406,6407,6408,6409,6410,3441,6411,6412, // 6016
443 6413,6414,6415,6416,6417,6418,6419,6420,6421,6422,6423,6424,6425,4440,6426,6427, // 6032
444 6428,6429,6430,6431,6432,6433,6434,6435,6436,6437,6438,6439,6440,6441,6442,6443, // 6048
445 6444,6445,6446,6447,6448,6449,6450,6451,6452,6453,6454,4821,6455,6456,6457,6458, // 6064
446 6459,6460,6461,6462,6463,6464,6465,6466,6467,6468,6469,6470,6471,6472,6473,6474, // 6080
447 6475,6476,6477,3947,3948,6478,6479,6480,6481,3272,4441,6482,6483,6484,6485,4442, // 6096
448 6486,6487,6488,6489,6490,6491,6492,6493,6494,6495,6496,4822,6497,6498,6499,6500, // 6112
449 6501,6502,6503,6504,6505,6506,6507,6508,6509,6510,6511,6512,6513,6514,6515,6516, // 6128
450 6517,6518,6519,6520,6521,6522,6523,6524,6525,6526,6527,6528,6529,6530,6531,6532, // 6144
451 6533,6534,6535,6536,6537,6538,6539,6540,6541,6542,6543,6544,6545,6546,6547,6548, // 6160
452 6549,6550,6551,6552,6553,6554,6555,6556,2784,6557,4823,6558,6559,6560,6561,6562, // 6176
453 6563,6564,6565,6566,6567,6568,6569,3949,6570,6571,6572,4824,6573,6574,6575,6576, // 6192
454 6577,6578,6579,6580,6581,6582,6583,4825,6584,6585,6586,3950,2785,6587,6588,6589, // 6208
455 6590,6591,6592,6593,6594,6595,6596,6597,6598,6599,6600,6601,6602,6603,6604,6605, // 6224
456 6606,6607,6608,6609,6610,6611,6612,4826,6613,6614,6615,4827,6616,6617,6618,6619, // 6240
457 6620,6621,6622,6623,6624,6625,4164,6626,6627,6628,6629,6630,6631,6632,6633,6634, // 6256
458 3547,6635,4828,6636,6637,6638,6639,6640,6641,6642,3951,2984,6643,6644,6645,6646, // 6272
459 6647,6648,6649,4165,6650,4829,6651,6652,4830,6653,6654,6655,6656,6657,6658,6659, // 6288
460 6660,6661,6662,4831,6663,6664,6665,6666,6667,6668,6669,6670,6671,4166,6672,4832, // 6304
461 3952,6673,6674,6675,6676,4833,6677,6678,6679,4167,6680,6681,6682,3198,6683,6684, // 6320
462 6685,6686,6687,6688,6689,6690,6691,6692,6693,6694,6695,6696,6697,4834,6698,6699, // 6336
463 6700,6701,6702,6703,6704,6705,6706,6707,6708,6709,6710,6711,6712,6713,6714,6715, // 6352
464 6716,6717,6718,6719,6720,6721,6722,6723,6724,6725,6726,6727,6728,6729,6730,6731, // 6368
465 6732,6733,6734,4443,6735,6736,6737,6738,6739,6740,6741,6742,6743,6744,6745,4444, // 6384
466 6746,6747,6748,6749,6750,6751,6752,6753,6754,6755,6756,6757,6758,6759,6760,6761, // 6400
467 6762,6763,6764,6765,6766,6767,6768,6769,6770,6771,6772,6773,6774,6775,6776,6777, // 6416
468 6778,6779,6780,6781,4168,6782,6783,3442,6784,6785,6786,6787,6788,6789,6790,6791, // 6432
469 4169,6792,6793,6794,6795,6796,6797,6798,6799,6800,6801,6802,6803,6804,6805,6806, // 6448
470 6807,6808,6809,6810,6811,4835,6812,6813,6814,4445,6815,6816,4446,6817,6818,6819, // 6464
471 6820,6821,6822,6823,6824,6825,6826,6827,6828,6829,6830,6831,6832,6833,6834,6835, // 6480
472 3548,6836,6837,6838,6839,6840,6841,6842,6843,6844,6845,6846,4836,6847,6848,6849, // 6496
473 6850,6851,6852,6853,6854,3953,6855,6856,6857,6858,6859,6860,6861,6862,6863,6864, // 6512
474 6865,6866,6867,6868,6869,6870,6871,6872,6873,6874,6875,6876,6877,3199,6878,6879, // 6528
475 6880,6881,6882,4447,6883,6884,6885,6886,6887,6888,6889,6890,6891,6892,6893,6894, // 6544
476 6895,6896,6897,6898,6899,6900,6901,6902,6903,6904,4170,6905,6906,6907,6908,6909, // 6560
477 6910,6911,6912,6913,6914,6915,6916,6917,6918,6919,6920,6921,6922,6923,6924,6925, // 6576
478 6926,6927,4837,6928,6929,6930,6931,6932,6933,6934,6935,6936,3346,6937,6938,4838, // 6592
479 6939,6940,6941,4448,6942,6943,6944,6945,6946,4449,6947,6948,6949,6950,6951,6952, // 6608
480 6953,6954,6955,6956,6957,6958,6959,6960,6961,6962,6963,6964,6965,6966,6967,6968, // 6624
481 6969,6970,6971,6972,6973,6974,6975,6976,6977,6978,6979,6980,6981,6982,6983,6984, // 6640
482 6985,6986,6987,6988,6989,6990,6991,6992,6993,6994,3671,6995,6996,6997,6998,4839, // 6656
483 6999,7000,7001,7002,3549,7003,7004,7005,7006,7007,7008,7009,7010,7011,7012,7013, // 6672
484 7014,7015,7016,7017,7018,7019,7020,7021,7022,7023,7024,7025,7026,7027,7028,7029, // 6688
485 7030,4840,7031,7032,7033,7034,7035,7036,7037,7038,4841,7039,7040,7041,7042,7043, // 6704
486 7044,7045,7046,7047,7048,7049,7050,7051,7052,7053,7054,7055,7056,7057,7058,7059, // 6720
487 7060,7061,7062,7063,7064,7065,7066,7067,7068,7069,7070,2985,7071,7072,7073,7074, // 6736
488 7075,7076,7077,7078,7079,7080,4842,7081,7082,7083,7084,7085,7086,7087,7088,7089, // 6752
489 7090,7091,7092,7093,7094,7095,7096,7097,7098,7099,7100,7101,7102,7103,7104,7105, // 6768
490 7106,7107,7108,7109,7110,7111,7112,7113,7114,7115,7116,7117,7118,4450,7119,7120, // 6784
491 7121,7122,7123,7124,7125,7126,7127,7128,7129,7130,7131,7132,7133,7134,7135,7136, // 6800
492 7137,7138,7139,7140,7141,7142,7143,4843,7144,7145,7146,7147,7148,7149,7150,7151, // 6816
493 7152,7153,7154,7155,7156,7157,7158,7159,7160,7161,7162,7163,7164,7165,7166,7167, // 6832
494 7168,7169,7170,7171,7172,7173,7174,7175,7176,7177,7178,7179,7180,7181,7182,7183, // 6848
495 7184,7185,7186,7187,7188,4171,4172,7189,7190,7191,7192,7193,7194,7195,7196,7197, // 6864
496 7198,7199,7200,7201,7202,7203,7204,7205,7206,7207,7208,7209,7210,7211,7212,7213, // 6880
497 7214,7215,7216,7217,7218,7219,7220,7221,7222,7223,7224,7225,7226,7227,7228,7229, // 6896
498 7230,7231,7232,7233,7234,7235,7236,7237,7238,7239,7240,7241,7242,7243,7244,7245, // 6912
499 7246,7247,7248,7249,7250,7251,7252,7253,7254,7255,7256,7257,7258,7259,7260,7261, // 6928
500 7262,7263,7264,7265,7266,7267,7268,7269,7270,7271,7272,7273,7274,7275,7276,7277, // 6944
501 7278,7279,7280,7281,7282,7283,7284,7285,7286,7287,7288,7289,7290,7291,7292,7293, // 6960
502 7294,7295,7296,4844,7297,7298,7299,7300,7301,7302,7303,7304,7305,7306,7307,7308, // 6976
503 7309,7310,7311,7312,7313,7314,7315,7316,4451,7317,7318,7319,7320,7321,7322,7323, // 6992
504 7324,7325,7326,7327,7328,7329,7330,7331,7332,7333,7334,7335,7336,7337,7338,7339, // 7008
505 7340,7341,7342,7343,7344,7345,7346,7347,7348,7349,7350,7351,7352,7353,4173,7354, // 7024
506 7355,4845,7356,7357,7358,7359,7360,7361,7362,7363,7364,7365,7366,7367,7368,7369, // 7040
507 7370,7371,7372,7373,7374,7375,7376,7377,7378,7379,7380,7381,7382,7383,7384,7385, // 7056
508 7386,7387,7388,4846,7389,7390,7391,7392,7393,7394,7395,7396,7397,7398,7399,7400, // 7072
509 7401,7402,7403,7404,7405,3672,7406,7407,7408,7409,7410,7411,7412,7413,7414,7415, // 7088
510 7416,7417,7418,7419,7420,7421,7422,7423,7424,7425,7426,7427,7428,7429,7430,7431, // 7104
511 7432,7433,7434,7435,7436,7437,7438,7439,7440,7441,7442,7443,7444,7445,7446,7447, // 7120
512 7448,7449,7450,7451,7452,7453,4452,7454,3200,7455,7456,7457,7458,7459,7460,7461, // 7136
513 7462,7463,7464,7465,7466,7467,7468,7469,7470,7471,7472,7473,7474,4847,7475,7476, // 7152
514 7477,3133,7478,7479,7480,7481,7482,7483,7484,7485,7486,7487,7488,7489,7490,7491, // 7168
515 7492,7493,7494,7495,7496,7497,7498,7499,7500,7501,7502,3347,7503,7504,7505,7506, // 7184
516 7507,7508,7509,7510,7511,7512,7513,7514,7515,7516,7517,7518,7519,7520,7521,4848, // 7200
517 7522,7523,7524,7525,7526,7527,7528,7529,7530,7531,7532,7533,7534,7535,7536,7537, // 7216
518 7538,7539,7540,7541,7542,7543,7544,7545,7546,7547,7548,7549,3801,4849,7550,7551, // 7232
519 7552,7553,7554,7555,7556,7557,7558,7559,7560,7561,7562,7563,7564,7565,7566,7567, // 7248
520 7568,7569,3035,7570,7571,7572,7573,7574,7575,7576,7577,7578,7579,7580,7581,7582, // 7264
521 7583,7584,7585,7586,7587,7588,7589,7590,7591,7592,7593,7594,7595,7596,7597,7598, // 7280
522 7599,7600,7601,7602,7603,7604,7605,7606,7607,7608,7609,7610,7611,7612,7613,7614, // 7296
523 7615,7616,4850,7617,7618,3802,7619,7620,7621,7622,7623,7624,7625,7626,7627,7628, // 7312
524 7629,7630,7631,7632,4851,7633,7634,7635,7636,7637,7638,7639,7640,7641,7642,7643, // 7328
525 7644,7645,7646,7647,7648,7649,7650,7651,7652,7653,7654,7655,7656,7657,7658,7659, // 7344
526 7660,7661,7662,7663,7664,7665,7666,7667,7668,7669,7670,4453,7671,7672,7673,7674, // 7360
527 7675,7676,7677,7678,7679,7680,7681,7682,7683,7684,7685,7686,7687,7688,7689,7690, // 7376
528 7691,7692,7693,7694,7695,7696,7697,3443,7698,7699,7700,7701,7702,4454,7703,7704, // 7392
529 7705,7706,7707,7708,7709,7710,7711,7712,7713,2472,7714,7715,7716,7717,7718,7719, // 7408
530 7720,7721,7722,7723,7724,7725,7726,7727,7728,7729,7730,7731,3954,7732,7733,7734, // 7424
531 7735,7736,7737,7738,7739,7740,7741,7742,7743,7744,7745,7746,7747,7748,7749,7750, // 7440
532 3134,7751,7752,4852,7753,7754,7755,4853,7756,7757,7758,7759,7760,4174,7761,7762, // 7456
533 7763,7764,7765,7766,7767,7768,7769,7770,7771,7772,7773,7774,7775,7776,7777,7778, // 7472
534 7779,7780,7781,7782,7783,7784,7785,7786,7787,7788,7789,7790,7791,7792,7793,7794, // 7488
535 7795,7796,7797,7798,7799,7800,7801,7802,7803,7804,7805,4854,7806,7807,7808,7809, // 7504
536 7810,7811,7812,7813,7814,7815,7816,7817,7818,7819,7820,7821,7822,7823,7824,7825, // 7520
537 4855,7826,7827,7828,7829,7830,7831,7832,7833,7834,7835,7836,7837,7838,7839,7840, // 7536
538 7841,7842,7843,7844,7845,7846,7847,3955,7848,7849,7850,7851,7852,7853,7854,7855, // 7552
539 7856,7857,7858,7859,7860,3444,7861,7862,7863,7864,7865,7866,7867,7868,7869,7870, // 7568
540 7871,7872,7873,7874,7875,7876,7877,7878,7879,7880,7881,7882,7883,7884,7885,7886, // 7584
541 7887,7888,7889,7890,7891,4175,7892,7893,7894,7895,7896,4856,4857,7897,7898,7899, // 7600
542 7900,2598,7901,7902,7903,7904,7905,7906,7907,7908,4455,7909,7910,7911,7912,7913, // 7616
543 7914,3201,7915,7916,7917,7918,7919,7920,7921,4858,7922,7923,7924,7925,7926,7927, // 7632
544 7928,7929,7930,7931,7932,7933,7934,7935,7936,7937,7938,7939,7940,7941,7942,7943, // 7648
545 7944,7945,7946,7947,7948,7949,7950,7951,7952,7953,7954,7955,7956,7957,7958,7959, // 7664
546 7960,7961,7962,7963,7964,7965,7966,7967,7968,7969,7970,7971,7972,7973,7974,7975, // 7680
547 7976,7977,7978,7979,7980,7981,4859,7982,7983,7984,7985,7986,7987,7988,7989,7990, // 7696
548 7991,7992,7993,7994,7995,7996,4860,7997,7998,7999,8000,8001,8002,8003,8004,8005, // 7712
549 8006,8007,8008,8009,8010,8011,8012,8013,8014,8015,8016,4176,8017,8018,8019,8020, // 7728
550 8021,8022,8023,4861,8024,8025,8026,8027,8028,8029,8030,8031,8032,8033,8034,8035, // 7744
551 8036,4862,4456,8037,8038,8039,8040,4863,8041,8042,8043,8044,8045,8046,8047,8048, // 7760
552 8049,8050,8051,8052,8053,8054,8055,8056,8057,8058,8059,8060,8061,8062,8063,8064, // 7776
553 8065,8066,8067,8068,8069,8070,8071,8072,8073,8074,8075,8076,8077,8078,8079,8080, // 7792
554 8081,8082,8083,8084,8085,8086,8087,8088,8089,8090,8091,8092,8093,8094,8095,8096, // 7808
555 8097,8098,8099,4864,4177,8100,8101,8102,8103,8104,8105,8106,8107,8108,8109,8110, // 7824
556 8111,8112,8113,8114,8115,8116,8117,8118,8119,8120,4178,8121,8122,8123,8124,8125, // 7840
557 8126,8127,8128,8129,8130,8131,8132,8133,8134,8135,8136,8137,8138,8139,8140,8141, // 7856
558 8142,8143,8144,8145,4865,4866,8146,8147,8148,8149,8150,8151,8152,8153,8154,8155, // 7872
559 8156,8157,8158,8159,8160,8161,8162,8163,8164,8165,4179,8166,8167,8168,8169,8170, // 7888
560 8171,8172,8173,8174,8175,8176,8177,8178,8179,8180,8181,4457,8182,8183,8184,8185, // 7904
561 8186,8187,8188,8189,8190,8191,8192,8193,8194,8195,8196,8197,8198,8199,8200,8201, // 7920
562 8202,8203,8204,8205,8206,8207,8208,8209,8210,8211,8212,8213,8214,8215,8216,8217, // 7936
563 8218,8219,8220,8221,8222,8223,8224,8225,8226,8227,8228,8229,8230,8231,8232,8233, // 7952
564 8234,8235,8236,8237,8238,8239,8240,8241,8242,8243,8244,8245,8246,8247,8248,8249, // 7968
565 8250,8251,8252,8253,8254,8255,8256,3445,8257,8258,8259,8260,8261,8262,4458,8263, // 7984
566 8264,8265,8266,8267,8268,8269,8270,8271,8272,4459,8273,8274,8275,8276,3550,8277, // 8000
567 8278,8279,8280,8281,8282,8283,8284,8285,8286,8287,8288,8289,4460,8290,8291,8292, // 8016
568 8293,8294,8295,8296,8297,8298,8299,8300,8301,8302,8303,8304,8305,8306,8307,4867, // 8032
569 8308,8309,8310,8311,8312,3551,8313,8314,8315,8316,8317,8318,8319,8320,8321,8322, // 8048
570 8323,8324,8325,8326,4868,8327,8328,8329,8330,8331,8332,8333,8334,8335,8336,8337, // 8064
571 8338,8339,8340,8341,8342,8343,8344,8345,8346,8347,8348,8349,8350,8351,8352,8353, // 8080
572 8354,8355,8356,8357,8358,8359,8360,8361,8362,8363,4869,4461,8364,8365,8366,8367, // 8096
573 8368,8369,8370,4870,8371,8372,8373,8374,8375,8376,8377,8378,8379,8380,8381,8382, // 8112
574 8383,8384,8385,8386,8387,8388,8389,8390,8391,8392,8393,8394,8395,8396,8397,8398, // 8128
575 8399,8400,8401,8402,8403,8404,8405,8406,8407,8408,8409,8410,4871,8411,8412,8413, // 8144
576 8414,8415,8416,8417,8418,8419,8420,8421,8422,4462,8423,8424,8425,8426,8427,8428, // 8160
577 8429,8430,8431,8432,8433,2986,8434,8435,8436,8437,8438,8439,8440,8441,8442,8443, // 8176
578 8444,8445,8446,8447,8448,8449,8450,8451,8452,8453,8454,8455,8456,8457,8458,8459, // 8192
579 8460,8461,8462,8463,8464,8465,8466,8467,8468,8469,8470,8471,8472,8473,8474,8475, // 8208
580 8476,8477,8478,4180,8479,8480,8481,8482,8483,8484,8485,8486,8487,8488,8489,8490, // 8224
581 8491,8492,8493,8494,8495,8496,8497,8498,8499,8500,8501,8502,8503,8504,8505,8506, // 8240
582 8507,8508,8509,8510,8511,8512,8513,8514,8515,8516,8517,8518,8519,8520,8521,8522, // 8256
583 8523,8524,8525,8526,8527,8528,8529,8530,8531,8532,8533,8534,8535,8536,8537,8538, // 8272
584 8539,8540,8541,8542,8543,8544,8545,8546,8547,8548,8549,8550,8551,8552,8553,8554, // 8288
585 8555,8556,8557,8558,8559,8560,8561,8562,8563,8564,4872,8565,8566,8567,8568,8569, // 8304
586 8570,8571,8572,8573,4873,8574,8575,8576,8577,8578,8579,8580,8581,8582,8583,8584, // 8320
587 8585,8586,8587,8588,8589,8590,8591,8592,8593,8594,8595,8596,8597,8598,8599,8600, // 8336
588 8601,8602,8603,8604,8605,3803,8606,8607,8608,8609,8610,8611,8612,8613,4874,3804, // 8352
589 8614,8615,8616,8617,8618,8619,8620,8621,3956,8622,8623,8624,8625,8626,8627,8628, // 8368
590 8629,8630,8631,8632,8633,8634,8635,8636,8637,8638,2865,8639,8640,8641,8642,8643, // 8384
591 8644,8645,8646,8647,8648,8649,8650,8651,8652,8653,8654,8655,8656,4463,8657,8658, // 8400
592 8659,4875,4876,8660,8661,8662,8663,8664,8665,8666,8667,8668,8669,8670,8671,8672, // 8416
593 8673,8674,8675,8676,8677,8678,8679,8680,8681,4464,8682,8683,8684,8685,8686,8687, // 8432
594 8688,8689,8690,8691,8692,8693,8694,8695,8696,8697,8698,8699,8700,8701,8702,8703, // 8448
595 8704,8705,8706,8707,8708,8709,2261,8710,8711,8712,8713,8714,8715,8716,8717,8718, // 8464
596 8719,8720,8721,8722,8723,8724,8725,8726,8727,8728,8729,8730,8731,8732,8733,4181, // 8480
597 8734,8735,8736,8737,8738,8739,8740,8741,8742,8743,8744,8745,8746,8747,8748,8749, // 8496
598 8750,8751,8752,8753,8754,8755,8756,8757,8758,8759,8760,8761,8762,8763,4877,8764, // 8512
599 8765,8766,8767,8768,8769,8770,8771,8772,8773,8774,8775,8776,8777,8778,8779,8780, // 8528
600 8781,8782,8783,8784,8785,8786,8787,8788,4878,8789,4879,8790,8791,8792,4880,8793, // 8544
601 8794,8795,8796,8797,8798,8799,8800,8801,4881,8802,8803,8804,8805,8806,8807,8808, // 8560
602 8809,8810,8811,8812,8813,8814,8815,3957,8816,8817,8818,8819,8820,8821,8822,8823, // 8576
603 8824,8825,8826,8827,8828,8829,8830,8831,8832,8833,8834,8835,8836,8837,8838,8839, // 8592
604 8840,8841,8842,8843,8844,8845,8846,8847,4882,8848,8849,8850,8851,8852,8853,8854, // 8608
605 8855,8856,8857,8858,8859,8860,8861,8862,8863,8864,8865,8866,8867,8868,8869,8870, // 8624
606 8871,8872,8873,8874,8875,8876,8877,8878,8879,8880,8881,8882,8883,8884,3202,8885, // 8640
607 8886,8887,8888,8889,8890,8891,8892,8893,8894,8895,8896,8897,8898,8899,8900,8901, // 8656
608 8902,8903,8904,8905,8906,8907,8908,8909,8910,8911,8912,8913,8914,8915,8916,8917, // 8672
609 8918,8919,8920,8921,8922,8923,8924,4465,8925,8926,8927,8928,8929,8930,8931,8932, // 8688
610 4883,8933,8934,8935,8936,8937,8938,8939,8940,8941,8942,8943,2214,8944,8945,8946, // 8704
611 8947,8948,8949,8950,8951,8952,8953,8954,8955,8956,8957,8958,8959,8960,8961,8962, // 8720
612 8963,8964,8965,4884,8966,8967,8968,8969,8970,8971,8972,8973,8974,8975,8976,8977, // 8736
613 8978,8979,8980,8981,8982,8983,8984,8985,8986,8987,8988,8989,8990,8991,8992,4885, // 8752
614 8993,8994,8995,8996,8997,8998,8999,9000,9001,9002,9003,9004,9005,9006,9007,9008, // 8768
615 9009,9010,9011,9012,9013,9014,9015,9016,9017,9018,9019,9020,9021,4182,9022,9023, // 8784
616 9024,9025,9026,9027,9028,9029,9030,9031,9032,9033,9034,9035,9036,9037,9038,9039, // 8800
617 9040,9041,9042,9043,9044,9045,9046,9047,9048,9049,9050,9051,9052,9053,9054,9055, // 8816
618 9056,9057,9058,9059,9060,9061,9062,9063,4886,9064,9065,9066,9067,9068,9069,4887, // 8832
619 9070,9071,9072,9073,9074,9075,9076,9077,9078,9079,9080,9081,9082,9083,9084,9085, // 8848
620 9086,9087,9088,9089,9090,9091,9092,9093,9094,9095,9096,9097,9098,9099,9100,9101, // 8864
621 9102,9103,9104,9105,9106,9107,9108,9109,9110,9111,9112,9113,9114,9115,9116,9117, // 8880
622 9118,9119,9120,9121,9122,9123,9124,9125,9126,9127,9128,9129,9130,9131,9132,9133, // 8896
623 9134,9135,9136,9137,9138,9139,9140,9141,3958,9142,9143,9144,9145,9146,9147,9148, // 8912
624 9149,9150,9151,4888,9152,9153,9154,9155,9156,9157,9158,9159,9160,9161,9162,9163, // 8928
625 9164,9165,9166,9167,9168,9169,9170,9171,9172,9173,9174,9175,4889,9176,9177,9178, // 8944
626 9179,9180,9181,9182,9183,9184,9185,9186,9187,9188,9189,9190,9191,9192,9193,9194, // 8960
627 9195,9196,9197,9198,9199,9200,9201,9202,9203,4890,9204,9205,9206,9207,9208,9209, // 8976
628 9210,9211,9212,9213,9214,9215,9216,9217,9218,9219,9220,9221,9222,4466,9223,9224, // 8992
629 9225,9226,9227,9228,9229,9230,9231,9232,9233,9234,9235,9236,9237,9238,9239,9240, // 9008
630 9241,9242,9243,9244,9245,4891,9246,9247,9248,9249,9250,9251,9252,9253,9254,9255, // 9024
631 9256,9257,4892,9258,9259,9260,9261,4893,4894,9262,9263,9264,9265,9266,9267,9268, // 9040
632 9269,9270,9271,9272,9273,4467,9274,9275,9276,9277,9278,9279,9280,9281,9282,9283, // 9056
633 9284,9285,3673,9286,9287,9288,9289,9290,9291,9292,9293,9294,9295,9296,9297,9298, // 9072
634 9299,9300,9301,9302,9303,9304,9305,9306,9307,9308,9309,9310,9311,9312,9313,9314, // 9088
635 9315,9316,9317,9318,9319,9320,9321,9322,4895,9323,9324,9325,9326,9327,9328,9329, // 9104
636 9330,9331,9332,9333,9334,9335,9336,9337,9338,9339,9340,9341,9342,9343,9344,9345, // 9120
637 9346,9347,4468,9348,9349,9350,9351,9352,9353,9354,9355,9356,9357,9358,9359,9360, // 9136
638 9361,9362,9363,9364,9365,9366,9367,9368,9369,9370,9371,9372,9373,4896,9374,4469, // 9152
639 9375,9376,9377,9378,9379,4897,9380,9381,9382,9383,9384,9385,9386,9387,9388,9389, // 9168
640 9390,9391,9392,9393,9394,9395,9396,9397,9398,9399,9400,9401,9402,9403,9404,9405, // 9184
641 9406,4470,9407,2751,9408,9409,3674,3552,9410,9411,9412,9413,9414,9415,9416,9417, // 9200
642 9418,9419,9420,9421,4898,9422,9423,9424,9425,9426,9427,9428,9429,3959,9430,9431, // 9216
643 9432,9433,9434,9435,9436,4471,9437,9438,9439,9440,9441,9442,9443,9444,9445,9446, // 9232
644 9447,9448,9449,9450,3348,9451,9452,9453,9454,9455,9456,9457,9458,9459,9460,9461, // 9248
645 9462,9463,9464,9465,9466,9467,9468,9469,9470,9471,9472,4899,9473,9474,9475,9476, // 9264
646 9477,4900,9478,9479,9480,9481,9482,9483,9484,9485,9486,9487,9488,3349,9489,9490, // 9280
647 9491,9492,9493,9494,9495,9496,9497,9498,9499,9500,9501,9502,9503,9504,9505,9506, // 9296
648 9507,9508,9509,9510,9511,9512,9513,9514,9515,9516,9517,9518,9519,9520,4901,9521, // 9312
649 9522,9523,9524,9525,9526,4902,9527,9528,9529,9530,9531,9532,9533,9534,9535,9536, // 9328
650 9537,9538,9539,9540,9541,9542,9543,9544,9545,9546,9547,9548,9549,9550,9551,9552, // 9344
651 9553,9554,9555,9556,9557,9558,9559,9560,9561,9562,9563,9564,9565,9566,9567,9568, // 9360
652 9569,9570,9571,9572,9573,9574,9575,9576,9577,9578,9579,9580,9581,9582,9583,9584, // 9376
653 3805,9585,9586,9587,9588,9589,9590,9591,9592,9593,9594,9595,9596,9597,9598,9599, // 9392
654 9600,9601,9602,4903,9603,9604,9605,9606,9607,4904,9608,9609,9610,9611,9612,9613, // 9408
655 9614,4905,9615,9616,9617,9618,9619,9620,9621,9622,9623,9624,9625,9626,9627,9628, // 9424
656 9629,9630,9631,9632,4906,9633,9634,9635,9636,9637,9638,9639,9640,9641,9642,9643, // 9440
657 4907,9644,9645,9646,9647,9648,9649,9650,9651,9652,9653,9654,9655,9656,9657,9658, // 9456
658 9659,9660,9661,9662,9663,9664,9665,9666,9667,9668,9669,9670,9671,9672,4183,9673, // 9472
659 9674,9675,9676,9677,4908,9678,9679,9680,9681,4909,9682,9683,9684,9685,9686,9687, // 9488
660 9688,9689,9690,4910,9691,9692,9693,3675,9694,9695,9696,2945,9697,9698,9699,9700, // 9504
661 9701,9702,9703,9704,9705,4911,9706,9707,9708,9709,9710,9711,9712,9713,9714,9715, // 9520
662 9716,9717,9718,9719,9720,9721,9722,9723,9724,9725,9726,9727,9728,9729,9730,9731, // 9536
663 9732,9733,9734,9735,4912,9736,9737,9738,9739,9740,4913,9741,9742,9743,9744,9745, // 9552
664 9746,9747,9748,9749,9750,9751,9752,9753,9754,9755,9756,9757,9758,4914,9759,9760, // 9568
665 9761,9762,9763,9764,9765,9766,9767,9768,9769,9770,9771,9772,9773,9774,9775,9776, // 9584
666 9777,9778,9779,9780,9781,9782,4915,9783,9784,9785,9786,9787,9788,9789,9790,9791, // 9600
667 9792,9793,4916,9794,9795,9796,9797,9798,9799,9800,9801,9802,9803,9804,9805,9806, // 9616
668 9807,9808,9809,9810,9811,9812,9813,9814,9815,9816,9817,9818,9819,9820,9821,9822, // 9632
669 9823,9824,9825,9826,9827,9828,9829,9830,9831,9832,9833,9834,9835,9836,9837,9838, // 9648
670 9839,9840,9841,9842,9843,9844,9845,9846,9847,9848,9849,9850,9851,9852,9853,9854, // 9664
671 9855,9856,9857,9858,9859,9860,9861,9862,9863,9864,9865,9866,9867,9868,4917,9869, // 9680
672 9870,9871,9872,9873,9874,9875,9876,9877,9878,9879,9880,9881,9882,9883,9884,9885, // 9696
673 9886,9887,9888,9889,9890,9891,9892,4472,9893,9894,9895,9896,9897,3806,9898,9899, // 9712
674 9900,9901,9902,9903,9904,9905,9906,9907,9908,9909,9910,9911,9912,9913,9914,4918, // 9728
675 9915,9916,9917,4919,9918,9919,9920,9921,4184,9922,9923,9924,9925,9926,9927,9928, // 9744
676 9929,9930,9931,9932,9933,9934,9935,9936,9937,9938,9939,9940,9941,9942,9943,9944, // 9760
677 9945,9946,4920,9947,9948,9949,9950,9951,9952,9953,9954,9955,4185,9956,9957,9958, // 9776
678 9959,9960,9961,9962,9963,9964,9965,4921,9966,9967,9968,4473,9969,9970,9971,9972, // 9792
679 9973,9974,9975,9976,9977,4474,9978,9979,9980,9981,9982,9983,9984,9985,9986,9987, // 9808
680 9988,9989,9990,9991,9992,9993,9994,9995,9996,9997,9998,9999,10000,10001,10002,10003, // 9824
681 10004,10005,10006,10007,10008,10009,10010,10011,10012,10013,10014,10015,10016,10017,10018,10019, // 9840
682 10020,10021,4922,10022,4923,10023,10024,10025,10026,10027,10028,10029,10030,10031,10032,10033, // 9856
683 10034,10035,10036,10037,10038,10039,10040,10041,10042,10043,10044,10045,10046,10047,10048,4924, // 9872
684 10049,10050,10051,10052,10053,10054,10055,10056,10057,10058,10059,10060,10061,10062,10063,10064, // 9888
685 10065,10066,10067,10068,10069,10070,10071,10072,10073,10074,10075,10076,10077,10078,10079,10080, // 9904
686 10081,10082,10083,10084,10085,10086,10087,4475,10088,10089,10090,10091,10092,10093,10094,10095, // 9920
687 10096,10097,4476,10098,10099,10100,10101,10102,10103,10104,10105,10106,10107,10108,10109,10110, // 9936
688 10111,2174,10112,10113,10114,10115,10116,10117,10118,10119,10120,10121,10122,10123,10124,10125, // 9952
689 10126,10127,10128,10129,10130,10131,10132,10133,10134,10135,10136,10137,10138,10139,10140,3807, // 9968
690 4186,4925,10141,10142,10143,10144,10145,10146,10147,4477,4187,10148,10149,10150,10151,10152, // 9984
691 10153,4188,10154,10155,10156,10157,10158,10159,10160,10161,4926,10162,10163,10164,10165,10166, //10000
692 10167,10168,10169,10170,10171,10172,10173,10174,10175,10176,10177,10178,10179,10180,10181,10182, //10016
693 10183,10184,10185,10186,10187,10188,10189,10190,10191,10192,3203,10193,10194,10195,10196,10197, //10032
694 10198,10199,10200,4478,10201,10202,10203,10204,4479,10205,10206,10207,10208,10209,10210,10211, //10048
695 10212,10213,10214,10215,10216,10217,10218,10219,10220,10221,10222,10223,10224,10225,10226,10227, //10064
696 10228,10229,10230,10231,10232,10233,10234,4927,10235,10236,10237,10238,10239,10240,10241,10242, //10080
697 10243,10244,10245,10246,10247,10248,10249,10250,10251,10252,10253,10254,10255,10256,10257,10258, //10096
698 10259,10260,10261,10262,10263,10264,10265,10266,10267,10268,10269,10270,10271,10272,10273,4480, //10112
699 4928,4929,10274,10275,10276,10277,10278,10279,10280,10281,10282,10283,10284,10285,10286,10287, //10128
700 10288,10289,10290,10291,10292,10293,10294,10295,10296,10297,10298,10299,10300,10301,10302,10303, //10144
701 10304,10305,10306,10307,10308,10309,10310,10311,10312,10313,10314,10315,10316,10317,10318,10319, //10160
702 10320,10321,10322,10323,10324,10325,10326,10327,10328,10329,10330,10331,10332,10333,10334,4930, //10176
703 10335,10336,10337,10338,10339,10340,10341,10342,4931,10343,10344,10345,10346,10347,10348,10349, //10192
704 10350,10351,10352,10353,10354,10355,3088,10356,2786,10357,10358,10359,10360,4189,10361,10362, //10208
705 10363,10364,10365,10366,10367,10368,10369,10370,10371,10372,10373,10374,10375,4932,10376,10377, //10224
706 10378,10379,10380,10381,10382,10383,10384,10385,10386,10387,10388,10389,10390,10391,10392,4933, //10240
707 10393,10394,10395,4934,10396,10397,10398,10399,10400,10401,10402,10403,10404,10405,10406,10407, //10256
708 10408,10409,10410,10411,10412,3446,10413,10414,10415,10416,10417,10418,10419,10420,10421,10422, //10272
709 10423,4935,10424,10425,10426,10427,10428,10429,10430,4936,10431,10432,10433,10434,10435,10436, //10288
710 10437,10438,10439,10440,10441,10442,10443,4937,10444,10445,10446,10447,4481,10448,10449,10450, //10304
711 10451,10452,10453,10454,10455,10456,10457,10458,10459,10460,10461,10462,10463,10464,10465,10466, //10320
712 10467,10468,10469,10470,10471,10472,10473,10474,10475,10476,10477,10478,10479,10480,10481,10482, //10336
713 10483,10484,10485,10486,10487,10488,10489,10490,10491,10492,10493,10494,10495,10496,10497,10498, //10352
714 10499,10500,10501,10502,10503,10504,10505,4938,10506,10507,10508,10509,10510,2552,10511,10512, //10368
715 10513,10514,10515,10516,3447,10517,10518,10519,10520,10521,10522,10523,10524,10525,10526,10527, //10384
716 10528,10529,10530,10531,10532,10533,10534,10535,10536,10537,10538,10539,10540,10541,10542,10543, //10400
717 4482,10544,4939,10545,10546,10547,10548,10549,10550,10551,10552,10553,10554,10555,10556,10557, //10416
718 10558,10559,10560,10561,10562,10563,10564,10565,10566,10567,3676,4483,10568,10569,10570,10571, //10432
719 10572,3448,10573,10574,10575,10576,10577,10578,10579,10580,10581,10582,10583,10584,10585,10586, //10448
720 10587,10588,10589,10590,10591,10592,10593,10594,10595,10596,10597,10598,10599,10600,10601,10602, //10464
721 10603,10604,10605,10606,10607,10608,10609,10610,10611,10612,10613,10614,10615,10616,10617,10618, //10480
722 10619,10620,10621,10622,10623,10624,10625,10626,10627,4484,10628,10629,10630,10631,10632,4940, //10496
723 10633,10634,10635,10636,10637,10638,10639,10640,10641,10642,10643,10644,10645,10646,10647,10648, //10512
724 10649,10650,10651,10652,10653,10654,10655,10656,4941,10657,10658,10659,2599,10660,10661,10662, //10528
725 10663,10664,10665,10666,3089,10667,10668,10669,10670,10671,10672,10673,10674,10675,10676,10677, //10544
726 10678,10679,10680,4942,10681,10682,10683,10684,10685,10686,10687,10688,10689,10690,10691,10692, //10560
727 10693,10694,10695,10696,10697,4485,10698,10699,10700,10701,10702,10703,10704,4943,10705,3677, //10576
728 10706,10707,10708,10709,10710,10711,10712,4944,10713,10714,10715,10716,10717,10718,10719,10720, //10592
729 10721,10722,10723,10724,10725,10726,10727,10728,4945,10729,10730,10731,10732,10733,10734,10735, //10608
730 10736,10737,10738,10739,10740,10741,10742,10743,10744,10745,10746,10747,10748,10749,10750,10751, //10624
731 10752,10753,10754,10755,10756,10757,10758,10759,10760,10761,4946,10762,10763,10764,10765,10766, //10640
732 10767,4947,4948,10768,10769,10770,10771,10772,10773,10774,10775,10776,10777,10778,10779,10780, //10656
733 10781,10782,10783,10784,10785,10786,10787,10788,10789,10790,10791,10792,10793,10794,10795,10796, //10672
734 10797,10798,10799,10800,10801,10802,10803,10804,10805,10806,10807,10808,10809,10810,10811,10812, //10688
735 10813,10814,10815,10816,10817,10818,10819,10820,10821,10822,10823,10824,10825,10826,10827,10828, //10704
736 10829,10830,10831,10832,10833,10834,10835,10836,10837,10838,10839,10840,10841,10842,10843,10844, //10720
737 10845,10846,10847,10848,10849,10850,10851,10852,10853,10854,10855,10856,10857,10858,10859,10860, //10736
738 10861,10862,10863,10864,10865,10866,10867,10868,10869,10870,10871,10872,10873,10874,10875,10876, //10752
739 10877,10878,4486,10879,10880,10881,10882,10883,10884,10885,4949,10886,10887,10888,10889,10890, //10768
740 10891,10892,10893,10894,10895,10896,10897,10898,10899,10900,10901,10902,10903,10904,10905,10906, //10784
741 10907,10908,10909,10910,10911,10912,10913,10914,10915,10916,10917,10918,10919,4487,10920,10921, //10800
742 10922,10923,10924,10925,10926,10927,10928,10929,10930,10931,10932,4950,10933,10934,10935,10936, //10816
743 10937,10938,10939,10940,10941,10942,10943,10944,10945,10946,10947,10948,10949,4488,10950,10951, //10832
744 10952,10953,10954,10955,10956,10957,10958,10959,4190,10960,10961,10962,10963,10964,10965,10966, //10848
745 10967,10968,10969,10970,10971,10972,10973,10974,10975,10976,10977,10978,10979,10980,10981,10982, //10864
746 10983,10984,10985,10986,10987,10988,10989,10990,10991,10992,10993,10994,10995,10996,10997,10998, //10880
747 10999,11000,11001,11002,11003,11004,11005,11006,3960,11007,11008,11009,11010,11011,11012,11013, //10896
748 11014,11015,11016,11017,11018,11019,11020,11021,11022,11023,11024,11025,11026,11027,11028,11029, //10912
749 11030,11031,11032,4951,11033,11034,11035,11036,11037,11038,11039,11040,11041,11042,11043,11044, //10928
750 11045,11046,11047,4489,11048,11049,11050,11051,4952,11052,11053,11054,11055,11056,11057,11058, //10944
751 4953,11059,11060,11061,11062,11063,11064,11065,11066,11067,11068,11069,11070,11071,4954,11072, //10960
752 11073,11074,11075,11076,11077,11078,11079,11080,11081,11082,11083,11084,11085,11086,11087,11088, //10976
753 11089,11090,11091,11092,11093,11094,11095,11096,11097,11098,11099,11100,11101,11102,11103,11104, //10992
754 11105,11106,11107,11108,11109,11110,11111,11112,11113,11114,11115,3808,11116,11117,11118,11119, //11008
755 11120,11121,11122,11123,11124,11125,11126,11127,11128,11129,11130,11131,11132,11133,11134,4955, //11024
756 11135,11136,11137,11138,11139,11140,11141,11142,11143,11144,11145,11146,11147,11148,11149,11150, //11040
757 11151,11152,11153,11154,11155,11156,11157,11158,11159,11160,11161,4956,11162,11163,11164,11165, //11056
758 11166,11167,11168,11169,11170,11171,11172,11173,11174,11175,11176,11177,11178,11179,11180,4957, //11072
759 11181,11182,11183,11184,11185,11186,4958,11187,11188,11189,11190,11191,11192,11193,11194,11195, //11088
760 11196,11197,11198,11199,11200,3678,11201,11202,11203,11204,11205,11206,4191,11207,11208,11209, //11104
761 11210,11211,11212,11213,11214,11215,11216,11217,11218,11219,11220,11221,11222,11223,11224,11225, //11120
762 11226,11227,11228,11229,11230,11231,11232,11233,11234,11235,11236,11237,11238,11239,11240,11241, //11136
763 11242,11243,11244,11245,11246,11247,11248,11249,11250,11251,4959,11252,11253,11254,11255,11256, //11152
764 11257,11258,11259,11260,11261,11262,11263,11264,11265,11266,11267,11268,11269,11270,11271,11272, //11168
765 11273,11274,11275,11276,11277,11278,11279,11280,11281,11282,11283,11284,11285,11286,11287,11288, //11184
766 11289,11290,11291,11292,11293,11294,11295,11296,11297,11298,11299,11300,11301,11302,11303,11304, //11200
767 11305,11306,11307,11308,11309,11310,11311,11312,11313,11314,3679,11315,11316,11317,11318,4490, //11216
768 11319,11320,11321,11322,11323,11324,11325,11326,11327,11328,11329,11330,11331,11332,11333,11334, //11232
769 11335,11336,11337,11338,11339,11340,11341,11342,11343,11344,11345,11346,11347,4960,11348,11349, //11248
770 11350,11351,11352,11353,11354,11355,11356,11357,11358,11359,11360,11361,11362,11363,11364,11365, //11264
771 11366,11367,11368,11369,11370,11371,11372,11373,11374,11375,11376,11377,3961,4961,11378,11379, //11280
772 11380,11381,11382,11383,11384,11385,11386,11387,11388,11389,11390,11391,11392,11393,11394,11395, //11296
773 11396,11397,4192,11398,11399,11400,11401,11402,11403,11404,11405,11406,11407,11408,11409,11410, //11312
774 11411,4962,11412,11413,11414,11415,11416,11417,11418,11419,11420,11421,11422,11423,11424,11425, //11328
775 11426,11427,11428,11429,11430,11431,11432,11433,11434,11435,11436,11437,11438,11439,11440,11441, //11344
776 11442,11443,11444,11445,11446,11447,11448,11449,11450,11451,11452,11453,11454,11455,11456,11457, //11360
777 11458,11459,11460,11461,11462,11463,11464,11465,11466,11467,11468,11469,4963,11470,11471,4491, //11376
778 11472,11473,11474,11475,4964,11476,11477,11478,11479,11480,11481,11482,11483,11484,11485,11486, //11392
779 11487,11488,11489,11490,11491,11492,4965,11493,11494,11495,11496,11497,11498,11499,11500,11501, //11408
780 11502,11503,11504,11505,11506,11507,11508,11509,11510,11511,11512,11513,11514,11515,11516,11517, //11424
781 11518,11519,11520,11521,11522,11523,11524,11525,11526,11527,11528,11529,3962,11530,11531,11532, //11440
782 11533,11534,11535,11536,11537,11538,11539,11540,11541,11542,11543,11544,11545,11546,11547,11548, //11456
783 11549,11550,11551,11552,11553,11554,11555,11556,11557,11558,11559,11560,11561,11562,11563,11564, //11472
784 4193,4194,11565,11566,11567,11568,11569,11570,11571,11572,11573,11574,11575,11576,11577,11578, //11488
785 11579,11580,11581,11582,11583,11584,11585,11586,11587,11588,11589,11590,11591,4966,4195,11592, //11504
786 11593,11594,11595,11596,11597,11598,11599,11600,11601,11602,11603,11604,3090,11605,11606,11607, //11520
787 11608,11609,11610,4967,11611,11612,11613,11614,11615,11616,11617,11618,11619,11620,11621,11622, //11536
788 11623,11624,11625,11626,11627,11628,11629,11630,11631,11632,11633,11634,11635,11636,11637,11638, //11552
789 11639,11640,11641,11642,11643,11644,11645,11646,11647,11648,11649,11650,11651,11652,11653,11654, //11568
790 11655,11656,11657,11658,11659,11660,11661,11662,11663,11664,11665,11666,11667,11668,11669,11670, //11584
791 11671,11672,11673,11674,4968,11675,11676,11677,11678,11679,11680,11681,11682,11683,11684,11685, //11600
792 11686,11687,11688,11689,11690,11691,11692,11693,3809,11694,11695,11696,11697,11698,11699,11700, //11616
793 11701,11702,11703,11704,11705,11706,11707,11708,11709,11710,11711,11712,11713,11714,11715,11716, //11632
794 11717,11718,3553,11719,11720,11721,11722,11723,11724,11725,11726,11727,11728,11729,11730,4969, //11648
795 11731,11732,11733,11734,11735,11736,11737,11738,11739,11740,4492,11741,11742,11743,11744,11745, //11664
796 11746,11747,11748,11749,11750,11751,11752,4970,11753,11754,11755,11756,11757,11758,11759,11760, //11680
797 11761,11762,11763,11764,11765,11766,11767,11768,11769,11770,11771,11772,11773,11774,11775,11776, //11696
798 11777,11778,11779,11780,11781,11782,11783,11784,11785,11786,11787,11788,11789,11790,4971,11791, //11712
799 11792,11793,11794,11795,11796,11797,4972,11798,11799,11800,11801,11802,11803,11804,11805,11806, //11728
800 11807,11808,11809,11810,4973,11811,11812,11813,11814,11815,11816,11817,11818,11819,11820,11821, //11744
801 11822,11823,11824,11825,11826,11827,11828,11829,11830,11831,11832,11833,11834,3680,3810,11835, //11760
802 11836,4974,11837,11838,11839,11840,11841,11842,11843,11844,11845,11846,11847,11848,11849,11850, //11776
803 11851,11852,11853,11854,11855,11856,11857,11858,11859,11860,11861,11862,11863,11864,11865,11866, //11792
804 11867,11868,11869,11870,11871,11872,11873,11874,11875,11876,11877,11878,11879,11880,11881,11882, //11808
805 11883,11884,4493,11885,11886,11887,11888,11889,11890,11891,11892,11893,11894,11895,11896,11897, //11824
806 11898,11899,11900,11901,11902,11903,11904,11905,11906,11907,11908,11909,11910,11911,11912,11913, //11840
807 11914,11915,4975,11916,11917,11918,11919,11920,11921,11922,11923,11924,11925,11926,11927,11928, //11856
808 11929,11930,11931,11932,11933,11934,11935,11936,11937,11938,11939,11940,11941,11942,11943,11944, //11872
809 11945,11946,11947,11948,11949,4976,11950,11951,11952,11953,11954,11955,11956,11957,11958,11959, //11888
810 11960,11961,11962,11963,11964,11965,11966,11967,11968,11969,11970,11971,11972,11973,11974,11975, //11904
811 11976,11977,11978,11979,11980,11981,11982,11983,11984,11985,11986,11987,4196,11988,11989,11990, //11920
812 11991,11992,4977,11993,11994,11995,11996,11997,11998,11999,12000,12001,12002,12003,12004,12005, //11936
813 12006,12007,12008,12009,12010,12011,12012,12013,12014,12015,12016,12017,12018,12019,12020,12021, //11952
814 12022,12023,12024,12025,12026,12027,12028,12029,12030,12031,12032,12033,12034,12035,12036,12037, //11968
815 12038,12039,12040,12041,12042,12043,12044,12045,12046,12047,12048,12049,12050,12051,12052,12053, //11984
816 12054,12055,12056,12057,12058,12059,12060,12061,4978,12062,12063,12064,12065,12066,12067,12068, //12000
817 12069,12070,12071,12072,12073,12074,12075,12076,12077,12078,12079,12080,12081,12082,12083,12084, //12016
818 12085,12086,12087,12088,12089,12090,12091,12092,12093,12094,12095,12096,12097,12098,12099,12100, //12032
819 12101,12102,12103,12104,12105,12106,12107,12108,12109,12110,12111,12112,12113,12114,12115,12116, //12048
820 12117,12118,12119,12120,12121,12122,12123,4979,12124,12125,12126,12127,12128,4197,12129,12130, //12064
821 12131,12132,12133,12134,12135,12136,12137,12138,12139,12140,12141,12142,12143,12144,12145,12146, //12080
822 12147,12148,12149,12150,12151,12152,12153,12154,4980,12155,12156,12157,12158,12159,12160,4494, //12096
823 12161,12162,12163,12164,3811,12165,12166,12167,12168,12169,4495,12170,12171,4496,12172,12173, //12112
824 12174,12175,12176,3812,12177,12178,12179,12180,12181,12182,12183,12184,12185,12186,12187,12188, //12128
825 12189,12190,12191,12192,12193,12194,12195,12196,12197,12198,12199,12200,12201,12202,12203,12204, //12144
826 12205,12206,12207,12208,12209,12210,12211,12212,12213,12214,12215,12216,12217,12218,12219,12220, //12160
827 12221,4981,12222,12223,12224,12225,12226,12227,12228,12229,12230,12231,12232,12233,12234,12235, //12176
828 4982,12236,12237,12238,12239,12240,12241,12242,12243,12244,12245,4983,12246,12247,12248,12249, //12192
829 4984,12250,12251,12252,12253,12254,12255,12256,12257,12258,12259,12260,12261,12262,12263,12264, //12208
830 4985,12265,4497,12266,12267,12268,12269,12270,12271,12272,12273,12274,12275,12276,12277,12278, //12224
831 12279,12280,12281,12282,12283,12284,12285,12286,12287,4986,12288,12289,12290,12291,12292,12293, //12240
832 12294,12295,12296,2473,12297,12298,12299,12300,12301,12302,12303,12304,12305,12306,12307,12308, //12256
833 12309,12310,12311,12312,12313,12314,12315,12316,12317,12318,12319,3963,12320,12321,12322,12323, //12272
834 12324,12325,12326,12327,12328,12329,12330,12331,12332,4987,12333,12334,12335,12336,12337,12338, //12288
835 12339,12340,12341,12342,12343,12344,12345,12346,12347,12348,12349,12350,12351,12352,12353,12354, //12304
836 12355,12356,12357,12358,12359,3964,12360,12361,12362,12363,12364,12365,12366,12367,12368,12369, //12320
837 12370,3965,12371,12372,12373,12374,12375,12376,12377,12378,12379,12380,12381,12382,12383,12384, //12336
838 12385,12386,12387,12388,12389,12390,12391,12392,12393,12394,12395,12396,12397,12398,12399,12400, //12352
839 12401,12402,12403,12404,12405,12406,12407,12408,4988,12409,12410,12411,12412,12413,12414,12415, //12368
840 12416,12417,12418,12419,12420,12421,12422,12423,12424,12425,12426,12427,12428,12429,12430,12431, //12384
841 12432,12433,12434,12435,12436,12437,12438,3554,12439,12440,12441,12442,12443,12444,12445,12446, //12400
842 12447,12448,12449,12450,12451,12452,12453,12454,12455,12456,12457,12458,12459,12460,12461,12462, //12416
843 12463,12464,4989,12465,12466,12467,12468,12469,12470,12471,12472,12473,12474,12475,12476,12477, //12432
844 12478,12479,12480,4990,12481,12482,12483,12484,12485,12486,12487,12488,12489,4498,12490,12491, //12448
845 12492,12493,12494,12495,12496,12497,12498,12499,12500,12501,12502,12503,12504,12505,12506,12507, //12464
846 12508,12509,12510,12511,12512,12513,12514,12515,12516,12517,12518,12519,12520,12521,12522,12523, //12480
847 12524,12525,12526,12527,12528,12529,12530,12531,12532,12533,12534,12535,12536,12537,12538,12539, //12496
848 12540,12541,12542,12543,12544,12545,12546,12547,12548,12549,12550,12551,4991,12552,12553,12554, //12512
849 12555,12556,12557,12558,12559,12560,12561,12562,12563,12564,12565,12566,12567,12568,12569,12570, //12528
850 12571,12572,12573,12574,12575,12576,12577,12578,3036,12579,12580,12581,12582,12583,3966,12584, //12544
851 12585,12586,12587,12588,12589,12590,12591,12592,12593,12594,12595,12596,12597,12598,12599,12600, //12560
852 12601,12602,12603,12604,12605,12606,12607,12608,12609,12610,12611,12612,12613,12614,12615,12616, //12576
853 12617,12618,12619,12620,12621,12622,12623,12624,12625,12626,12627,12628,12629,12630,12631,12632, //12592
854 12633,12634,12635,12636,12637,12638,12639,12640,12641,12642,12643,12644,12645,12646,4499,12647, //12608
855 12648,12649,12650,12651,12652,12653,12654,12655,12656,12657,12658,12659,12660,12661,12662,12663, //12624
856 12664,12665,12666,12667,12668,12669,12670,12671,12672,12673,12674,12675,12676,12677,12678,12679, //12640
857 12680,12681,12682,12683,12684,12685,12686,12687,12688,12689,12690,12691,12692,12693,12694,12695, //12656
858 12696,12697,12698,4992,12699,12700,12701,12702,12703,12704,12705,12706,12707,12708,12709,12710, //12672
859 12711,12712,12713,12714,12715,12716,12717,12718,12719,12720,12721,12722,12723,12724,12725,12726, //12688
860 12727,12728,12729,12730,12731,12732,12733,12734,12735,12736,12737,12738,12739,12740,12741,12742, //12704
861 12743,12744,12745,12746,12747,12748,12749,12750,12751,12752,12753,12754,12755,12756,12757,12758, //12720
862 12759,12760,12761,12762,12763,12764,12765,12766,12767,12768,12769,12770,12771,12772,12773,12774, //12736
863 12775,12776,12777,12778,4993,2175,12779,12780,12781,12782,12783,12784,12785,12786,4500,12787, //12752
864 12788,12789,12790,12791,12792,12793,12794,12795,12796,12797,12798,12799,12800,12801,12802,12803, //12768
865 12804,12805,12806,12807,12808,12809,12810,12811,12812,12813,12814,12815,12816,12817,12818,12819, //12784
866 12820,12821,12822,12823,12824,12825,12826,4198,3967,12827,12828,12829,12830,12831,12832,12833, //12800
867 12834,12835,12836,12837,12838,12839,12840,12841,12842,12843,12844,12845,12846,12847,12848,12849, //12816
868 12850,12851,12852,12853,12854,12855,12856,12857,12858,12859,12860,12861,4199,12862,12863,12864, //12832
869 12865,12866,12867,12868,12869,12870,12871,12872,12873,12874,12875,12876,12877,12878,12879,12880, //12848
870 12881,12882,12883,12884,12885,12886,12887,4501,12888,12889,12890,12891,12892,12893,12894,12895, //12864
871 12896,12897,12898,12899,12900,12901,12902,12903,12904,12905,12906,12907,12908,12909,12910,12911, //12880
872 12912,4994,12913,12914,12915,12916,12917,12918,12919,12920,12921,12922,12923,12924,12925,12926, //12896
873 12927,12928,12929,12930,12931,12932,12933,12934,12935,12936,12937,12938,12939,12940,12941,12942, //12912
874 12943,12944,12945,12946,12947,12948,12949,12950,12951,12952,12953,12954,12955,12956,1772,12957, //12928
875 12958,12959,12960,12961,12962,12963,12964,12965,12966,12967,12968,12969,12970,12971,12972,12973, //12944
876 12974,12975,12976,12977,12978,12979,12980,12981,12982,12983,12984,12985,12986,12987,12988,12989, //12960
877 12990,12991,12992,12993,12994,12995,12996,12997,4502,12998,4503,12999,13000,13001,13002,13003, //12976
878 4504,13004,13005,13006,13007,13008,13009,13010,13011,13012,13013,13014,13015,13016,13017,13018, //12992
879 13019,13020,13021,13022,13023,13024,13025,13026,13027,13028,13029,3449,13030,13031,13032,13033, //13008
880 13034,13035,13036,13037,13038,13039,13040,13041,13042,13043,13044,13045,13046,13047,13048,13049, //13024
881 13050,13051,13052,13053,13054,13055,13056,13057,13058,13059,13060,13061,13062,13063,13064,13065, //13040
882 13066,13067,13068,13069,13070,13071,13072,13073,13074,13075,13076,13077,13078,13079,13080,13081, //13056
883 13082,13083,13084,13085,13086,13087,13088,13089,13090,13091,13092,13093,13094,13095,13096,13097, //13072
884 13098,13099,13100,13101,13102,13103,13104,13105,13106,13107,13108,13109,13110,13111,13112,13113, //13088
885 13114,13115,13116,13117,13118,3968,13119,4995,13120,13121,13122,13123,13124,13125,13126,13127, //13104
886 4505,13128,13129,13130,13131,13132,13133,13134,4996,4506,13135,13136,13137,13138,13139,4997, //13120
887 13140,13141,13142,13143,13144,13145,13146,13147,13148,13149,13150,13151,13152,13153,13154,13155, //13136
888 13156,13157,13158,13159,4998,13160,13161,13162,13163,13164,13165,13166,13167,13168,13169,13170, //13152
889 13171,13172,13173,13174,13175,13176,4999,13177,13178,13179,13180,13181,13182,13183,13184,13185, //13168
890 13186,13187,13188,13189,13190,13191,13192,13193,13194,13195,13196,13197,13198,13199,13200,13201, //13184
891 13202,13203,13204,13205,13206,5000,13207,13208,13209,13210,13211,13212,13213,13214,13215,13216, //13200
892 13217,13218,13219,13220,13221,13222,13223,13224,13225,13226,13227,4200,5001,13228,13229,13230, //13216
893 13231,13232,13233,13234,13235,13236,13237,13238,13239,13240,3969,13241,13242,13243,13244,3970, //13232
894 13245,13246,13247,13248,13249,13250,13251,13252,13253,13254,13255,13256,13257,13258,13259,13260, //13248
895 13261,13262,13263,13264,13265,13266,13267,13268,3450,13269,13270,13271,13272,13273,13274,13275, //13264
896 13276,5002,13277,13278,13279,13280,13281,13282,13283,13284,13285,13286,13287,13288,13289,13290, //13280
897 13291,13292,13293,13294,13295,13296,13297,13298,13299,13300,13301,13302,3813,13303,13304,13305, //13296
898 13306,13307,13308,13309,13310,13311,13312,13313,13314,13315,13316,13317,13318,13319,13320,13321, //13312
899 13322,13323,13324,13325,13326,13327,13328,4507,13329,13330,13331,13332,13333,13334,13335,13336, //13328
900 13337,13338,13339,13340,13341,5003,13342,13343,13344,13345,13346,13347,13348,13349,13350,13351, //13344
901 13352,13353,13354,13355,13356,13357,13358,13359,13360,13361,13362,13363,13364,13365,13366,13367, //13360
902 5004,13368,13369,13370,13371,13372,13373,13374,13375,13376,13377,13378,13379,13380,13381,13382, //13376
903 13383,13384,13385,13386,13387,13388,13389,13390,13391,13392,13393,13394,13395,13396,13397,13398, //13392
904 13399,13400,13401,13402,13403,13404,13405,13406,13407,13408,13409,13410,13411,13412,13413,13414, //13408
905 13415,13416,13417,13418,13419,13420,13421,13422,13423,13424,13425,13426,13427,13428,13429,13430, //13424
906 13431,13432,4508,13433,13434,13435,4201,13436,13437,13438,13439,13440,13441,13442,13443,13444, //13440
907 13445,13446,13447,13448,13449,13450,13451,13452,13453,13454,13455,13456,13457,5005,13458,13459, //13456
908 13460,13461,13462,13463,13464,13465,13466,13467,13468,13469,13470,4509,13471,13472,13473,13474, //13472
909 13475,13476,13477,13478,13479,13480,13481,13482,13483,13484,13485,13486,13487,13488,13489,13490, //13488
910 13491,13492,13493,13494,13495,13496,13497,13498,13499,13500,13501,13502,13503,13504,13505,13506, //13504
911 13507,13508,13509,13510,13511,13512,13513,13514,13515,13516,13517,13518,13519,13520,13521,13522, //13520
912 13523,13524,13525,13526,13527,13528,13529,13530,13531,13532,13533,13534,13535,13536,13537,13538, //13536
913 13539,13540,13541,13542,13543,13544,13545,13546,13547,13548,13549,13550,13551,13552,13553,13554, //13552
914 13555,13556,13557,13558,13559,13560,13561,13562,13563,13564,13565,13566,13567,13568,13569,13570, //13568
915 13571,13572,13573,13574,13575,13576,13577,13578,13579,13580,13581,13582,13583,13584,13585,13586, //13584
916 13587,13588,13589,13590,13591,13592,13593,13594,13595,13596,13597,13598,13599,13600,13601,13602, //13600
917 13603,13604,13605,13606,13607,13608,13609,13610,13611,13612,13613,13614,13615,13616,13617,13618, //13616
918 13619,13620,13621,13622,13623,13624,13625,13626,13627,13628,13629,13630,13631,13632,13633,13634, //13632
919 13635,13636,13637,13638,13639,13640,13641,13642,5006,13643,13644,13645,13646,13647,13648,13649, //13648
920 13650,13651,5007,13652,13653,13654,13655,13656,13657,13658,13659,13660,13661,13662,13663,13664, //13664
921 13665,13666,13667,13668,13669,13670,13671,13672,13673,13674,13675,13676,13677,13678,13679,13680, //13680
922 13681,13682,13683,13684,13685,13686,13687,13688,13689,13690,13691,13692,13693,13694,13695,13696, //13696
923 13697,13698,13699,13700,13701,13702,13703,13704,13705,13706,13707,13708,13709,13710,13711,13712, //13712
924 13713,13714,13715,13716,13717,13718,13719,13720,13721,13722,13723,13724,13725,13726,13727,13728, //13728
925 13729,13730,13731,13732,13733,13734,13735,13736,13737,13738,13739,13740,13741,13742,13743,13744, //13744
926 13745,13746,13747,13748,13749,13750,13751,13752,13753,13754,13755,13756,13757,13758,13759,13760, //13760
927 13761,13762,13763,13764,13765,13766,13767,13768,13769,13770,13771,13772,13773,13774,3273,13775, //13776
928 13776,13777,13778,13779,13780,13781,13782,13783,13784,13785,13786,13787,13788,13789,13790,13791, //13792
929 13792,13793,13794,13795,13796,13797,13798,13799,13800,13801,13802,13803,13804,13805,13806,13807, //13808
930 13808,13809,13810,13811,13812,13813,13814,13815,13816,13817,13818,13819,13820,13821,13822,13823, //13824
931 13824,13825,13826,13827,13828,13829,13830,13831,13832,13833,13834,13835,13836,13837,13838,13839, //13840
932 13840,13841,13842,13843,13844,13845,13846,13847,13848,13849,13850,13851,13852,13853,13854,13855, //13856
933 13856,13857,13858,13859,13860,13861,13862,13863,13864,13865,13866,13867,13868,13869,13870,13871, //13872
934 13872,13873,13874,13875,13876,13877,13878,13879,13880,13881,13882,13883,13884,13885,13886,13887, //13888
935 13888,13889,13890,13891,13892,13893,13894,13895,13896,13897,13898,13899,13900,13901,13902,13903, //13904
936 13904,13905,13906,13907,13908,13909,13910,13911,13912,13913,13914,13915,13916,13917,13918,13919, //13920
937 13920,13921,13922,13923,13924,13925,13926,13927,13928,13929,13930,13931,13932,13933,13934,13935, //13936
938 13936,13937,13938,13939,13940,13941,13942,13943,13944,13945,13946,13947,13948,13949,13950,13951, //13952
939 13952,13953,13954,13955,13956,13957,13958,13959,13960,13961,13962,13963,13964,13965,13966,13967, //13968
940 13968,13969,13970,13971,13972, //13973
941 ****************************************************************************************/
942 };
+0
-111
c/src/CharDistribution.cpp less more
0 /* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
1 /* ***** BEGIN LICENSE BLOCK *****
2 * Version: MPL 1.1/GPL 2.0/LGPL 2.1
3 *
4 * The contents of this file are subject to the Mozilla Public License Version
5 * 1.1 (the "License"); you may not use this file except in compliance with
6 * the License. You may obtain a copy of the License at
7 * http://www.mozilla.org/MPL/
8 *
9 * Software distributed under the License is distributed on an "AS IS" basis,
10 * WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License
11 * for the specific language governing rights and limitations under the
12 * License.
13 *
14 * The Original Code is Mozilla Communicator client code.
15 *
16 * The Initial Developer of the Original Code is
17 * Netscape Communications Corporation.
18 * Portions created by the Initial Developer are Copyright (C) 1998
19 * the Initial Developer. All Rights Reserved.
20 *
21 * Contributor(s):
22 *
23 * Alternatively, the contents of this file may be used under the terms of
24 * either the GNU General Public License Version 2 or later (the "GPL"), or
25 * the GNU Lesser General Public License Version 2.1 or later (the "LGPL"),
26 * in which case the provisions of the GPL or the LGPL are applicable instead
27 * of those above. If you wish to allow use of your version of this file only
28 * under the terms of either the GPL or the LGPL, and not to allow others to
29 * use your version of this file under the terms of the MPL, indicate your
30 * decision by deleting the provisions above and replace them with the notice
31 * and other provisions required by the GPL or the LGPL. If you do not delete
32 * the provisions above, a recipient may use your version of this file under
33 * the terms of any one of the MPL, the GPL or the LGPL.
34 *
35 * ***** END LICENSE BLOCK ***** */
36
37 #include "CharDistribution.h"
38
39 #include "JISFreq.tab"
40 #include "Big5Freq.tab"
41 #include "EUCKRFreq.tab"
42 #include "EUCTWFreq.tab"
43 #include "GB2312Freq.tab"
44
45 #define SURE_YES 0.99f
46 #define SURE_NO 0.01f
47
48 #define MINIMUM_DATA_THRESHOLD 4
49
50 //return confidence base on received data
51 float CharDistributionAnalysis::GetConfidence()
52 {
53 //if we didn't receive any character in our consideration range, or the
54 //number of frequent characters is below the minimum threshold, return
55 // negative answer
56 if (mTotalChars <= 0 || mFreqChars <= MINIMUM_DATA_THRESHOLD)
57 return SURE_NO;
58
59 if (mTotalChars != mFreqChars) {
60 float r = mFreqChars / ((mTotalChars - mFreqChars) * mTypicalDistributionRatio);
61
62 if (r < SURE_YES)
63 return r;
64 }
65 //normalize confidence, (we don't want to be 100% sure)
66 return SURE_YES;
67 }
68
69 EUCTWDistributionAnalysis::EUCTWDistributionAnalysis()
70 {
71 mCharToFreqOrder = EUCTWCharToFreqOrder;
72 mTableSize = EUCTW_TABLE_SIZE;
73 mTypicalDistributionRatio = EUCTW_TYPICAL_DISTRIBUTION_RATIO;
74 }
75
76 EUCKRDistributionAnalysis::EUCKRDistributionAnalysis()
77 {
78 mCharToFreqOrder = EUCKRCharToFreqOrder;
79 mTableSize = EUCKR_TABLE_SIZE;
80 mTypicalDistributionRatio = EUCKR_TYPICAL_DISTRIBUTION_RATIO;
81 }
82
83 GB2312DistributionAnalysis::GB2312DistributionAnalysis()
84 {
85 mCharToFreqOrder = GB2312CharToFreqOrder;
86 mTableSize = GB2312_TABLE_SIZE;
87 mTypicalDistributionRatio = GB2312_TYPICAL_DISTRIBUTION_RATIO;
88 }
89
90 Big5DistributionAnalysis::Big5DistributionAnalysis()
91 {
92 mCharToFreqOrder = Big5CharToFreqOrder;
93 mTableSize = BIG5_TABLE_SIZE;
94 mTypicalDistributionRatio = BIG5_TYPICAL_DISTRIBUTION_RATIO;
95 }
96
97 SJISDistributionAnalysis::SJISDistributionAnalysis()
98 {
99 mCharToFreqOrder = JISCharToFreqOrder;
100 mTableSize = JIS_TABLE_SIZE;
101 mTypicalDistributionRatio = JIS_TYPICAL_DISTRIBUTION_RATIO;
102 }
103
104 EUCJPDistributionAnalysis::EUCJPDistributionAnalysis()
105 {
106 mCharToFreqOrder = JISCharToFreqOrder;
107 mTableSize = JIS_TABLE_SIZE;
108 mTypicalDistributionRatio = JIS_TYPICAL_DISTRIBUTION_RATIO;
109 }
110
+0
-236
c/src/CharDistribution.h less more
0 /* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
1 /* ***** BEGIN LICENSE BLOCK *****
2 * Version: MPL 1.1/GPL 2.0/LGPL 2.1
3 *
4 * The contents of this file are subject to the Mozilla Public License Version
5 * 1.1 (the "License"); you may not use this file except in compliance with
6 * the License. You may obtain a copy of the License at
7 * http://www.mozilla.org/MPL/
8 *
9 * Software distributed under the License is distributed on an "AS IS" basis,
10 * WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License
11 * for the specific language governing rights and limitations under the
12 * License.
13 *
14 * The Original Code is Mozilla Communicator client code.
15 *
16 * The Initial Developer of the Original Code is
17 * Netscape Communications Corporation.
18 * Portions created by the Initial Developer are Copyright (C) 1998
19 * the Initial Developer. All Rights Reserved.
20 *
21 * Contributor(s):
22 *
23 * Alternatively, the contents of this file may be used under the terms of
24 * either the GNU General Public License Version 2 or later (the "GPL"), or
25 * the GNU Lesser General Public License Version 2.1 or later (the "LGPL"),
26 * in which case the provisions of the GPL or the LGPL are applicable instead
27 * of those above. If you wish to allow use of your version of this file only
28 * under the terms of either the GPL or the LGPL, and not to allow others to
29 * use your version of this file under the terms of the MPL, indicate your
30 * decision by deleting the provisions above and replace them with the notice
31 * and other provisions required by the GPL or the LGPL. If you do not delete
32 * the provisions above, a recipient may use your version of this file under
33 * the terms of any one of the MPL, the GPL or the LGPL.
34 *
35 * ***** END LICENSE BLOCK ***** */
36
37 #ifndef CharDistribution_h__
38 #define CharDistribution_h__
39
40 #include "nscore.h"
41
42 #define ENOUGH_DATA_THRESHOLD 1024
43
44 class CharDistributionAnalysis
45 {
46 public:
47 CharDistributionAnalysis() {Reset();}
48
49 //feed a block of data and do distribution analysis
50 void HandleData(const char* aBuf, PRUint32 aLen) {}
51
52 //Feed a character with known length
53 void HandleOneChar(const char* aStr, PRUint32 aCharLen)
54 {
55 PRInt32 order;
56
57 //we only care about 2-bytes character in our distribution analysis
58 order = (aCharLen == 2) ? GetOrder(aStr) : -1;
59
60 if (order >= 0)
61 {
62 mTotalChars++;
63 //order is valid
64 if ((PRUint32)order < mTableSize)
65 {
66 if (512 > mCharToFreqOrder[order])
67 mFreqChars++;
68 }
69 }
70 }
71
72 //return confidence base on existing data
73 float GetConfidence();
74
75 //Reset analyser, clear any state
76 void Reset(void)
77 {
78 mDone = PR_FALSE;
79 mTotalChars = 0;
80 mFreqChars = 0;
81 }
82
83 //This function is for future extension. Caller can use this function to control
84 //analyser's behavior
85 void SetOpion(){}
86
87 //It is not necessary to receive all data to draw conclusion. For charset detection,
88 // certain amount of data is enough
89 PRBool GotEnoughData() {return mTotalChars > ENOUGH_DATA_THRESHOLD;}
90
91 protected:
92 //we do not handle character base on its original encoding string, but
93 //convert this encoding string to a number, here called order.
94 //This allow multiple encoding of a language to share one frequency table
95 virtual PRInt32 GetOrder(const char* str) {return -1;}
96
97 //If this flag is set to PR_TRUE, detection is done and conclusion has been made
98 PRBool mDone;
99
100 //The number of characters whose frequency order is less than 512
101 PRUint32 mFreqChars;
102
103 //Total character encounted.
104 PRUint32 mTotalChars;
105
106 //Mapping table to get frequency order from char order (get from GetOrder())
107 const PRInt16 *mCharToFreqOrder;
108
109 //Size of above table
110 PRUint32 mTableSize;
111
112 //This is a constant value varies from language to language, it is used in
113 //calculating confidence. See my paper for further detail.
114 float mTypicalDistributionRatio;
115 };
116
117
118 class EUCTWDistributionAnalysis: public CharDistributionAnalysis
119 {
120 public:
121 EUCTWDistributionAnalysis();
122 protected:
123
124 //for euc-TW encoding, we are interested
125 // first byte range: 0xc4 -- 0xfe
126 // second byte range: 0xa1 -- 0xfe
127 //no validation needed here. State machine has done that
128 PRInt32 GetOrder(const char* str)
129 { if ((unsigned char)*str >= (unsigned char)0xc4)
130 return 94*((unsigned char)str[0]-(unsigned char)0xc4) + (unsigned char)str[1] - (unsigned char)0xa1;
131 else
132 return -1;
133 }
134 };
135
136
137 class EUCKRDistributionAnalysis : public CharDistributionAnalysis
138 {
139 public:
140 EUCKRDistributionAnalysis();
141 protected:
142 //for euc-KR encoding, we are interested
143 // first byte range: 0xb0 -- 0xfe
144 // second byte range: 0xa1 -- 0xfe
145 //no validation needed here. State machine has done that
146 PRInt32 GetOrder(const char* str)
147 { if ((unsigned char)*str >= (unsigned char)0xb0)
148 return 94*((unsigned char)str[0]-(unsigned char)0xb0) + (unsigned char)str[1] - (unsigned char)0xa1;
149 else
150 return -1;
151 }
152 };
153
154 class GB2312DistributionAnalysis : public CharDistributionAnalysis
155 {
156 public:
157 GB2312DistributionAnalysis();
158 protected:
159 //for GB2312 encoding, we are interested
160 // first byte range: 0xb0 -- 0xfe
161 // second byte range: 0xa1 -- 0xfe
162 //no validation needed here. State machine has done that
163 PRInt32 GetOrder(const char* str)
164 { if ((unsigned char)*str >= (unsigned char)0xb0 && (unsigned char)str[1] >= (unsigned char)0xa1)
165 return 94*((unsigned char)str[0]-(unsigned char)0xb0) + (unsigned char)str[1] - (unsigned char)0xa1;
166 else
167 return -1;
168 }
169 };
170
171
172 class Big5DistributionAnalysis : public CharDistributionAnalysis
173 {
174 public:
175 Big5DistributionAnalysis();
176 protected:
177 //for big5 encoding, we are interested
178 // first byte range: 0xa4 -- 0xfe
179 // second byte range: 0x40 -- 0x7e , 0xa1 -- 0xfe
180 //no validation needed here. State machine has done that
181 PRInt32 GetOrder(const char* str)
182 { if ((unsigned char)*str >= (unsigned char)0xa4)
183 if ((unsigned char)str[1] >= (unsigned char)0xa1)
184 return 157*((unsigned char)str[0]-(unsigned char)0xa4) + (unsigned char)str[1] - (unsigned char)0xa1 +63;
185 else
186 return 157*((unsigned char)str[0]-(unsigned char)0xa4) + (unsigned char)str[1] - (unsigned char)0x40;
187 else
188 return -1;
189 }
190 };
191
192 class SJISDistributionAnalysis : public CharDistributionAnalysis
193 {
194 public:
195 SJISDistributionAnalysis();
196 protected:
197 //for sjis encoding, we are interested
198 // first byte range: 0x81 -- 0x9f , 0xe0 -- 0xfe
199 // second byte range: 0x40 -- 0x7e, 0x81 -- oxfe
200 //no validation needed here. State machine has done that
201 PRInt32 GetOrder(const char* str)
202 {
203 PRInt32 order;
204 if ((unsigned char)*str >= (unsigned char)0x81 && (unsigned char)*str <= (unsigned char)0x9f)
205 order = 188 * ((unsigned char)str[0]-(unsigned char)0x81);
206 else if ((unsigned char)*str >= (unsigned char)0xe0 && (unsigned char)*str <= (unsigned char)0xef)
207 order = 188 * ((unsigned char)str[0]-(unsigned char)0xe0 + 31);
208 else
209 return -1;
210 order += (unsigned char)*(str+1) - 0x40;
211 if ((unsigned char)str[1] > (unsigned char)0x7f)
212 order--;
213 return order;
214 }
215 };
216
217 class EUCJPDistributionAnalysis : public CharDistributionAnalysis
218 {
219 public:
220 EUCJPDistributionAnalysis();
221 protected:
222 //for euc-JP encoding, we are interested
223 // first byte range: 0xa0 -- 0xfe
224 // second byte range: 0xa1 -- 0xfe
225 //no validation needed here. State machine has done that
226 PRInt32 GetOrder(const char* str)
227 { if ((unsigned char)*str >= (unsigned char)0xa0)
228 return 94*((unsigned char)str[0]-(unsigned char)0xa1) + (unsigned char)str[1] - (unsigned char)0xa1;
229 else
230 return -1;
231 }
232 };
233
234 #endif //CharDistribution_h__
235
+0
-614
c/src/EUCKRFreq.tab less more
0 /* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
1 /* ***** BEGIN LICENSE BLOCK *****
2 * Version: MPL 1.1/GPL 2.0/LGPL 2.1
3 *
4 * The contents of this file are subject to the Mozilla Public License Version
5 * 1.1 (the "License"); you may not use this file except in compliance with
6 * the License. You may obtain a copy of the License at
7 * http://www.mozilla.org/MPL/
8 *
9 * Software distributed under the License is distributed on an "AS IS" basis,
10 * WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License
11 * for the specific language governing rights and limitations under the
12 * License.
13 *
14 * The Original Code is Mozilla Communicator client code.
15 *
16 * The Initial Developer of the Original Code is
17 * Netscape Communications Corporation.
18 * Portions created by the Initial Developer are Copyright (C) 1998
19 * the Initial Developer. All Rights Reserved.
20 *
21 * Contributor(s):
22 *
23 * Alternatively, the contents of this file may be used under the terms of
24 * either the GNU General Public License Version 2 or later (the "GPL"), or
25 * the GNU Lesser General Public License Version 2.1 or later (the "LGPL"),
26 * in which case the provisions of the GPL or the LGPL are applicable instead
27 * of those above. If you wish to allow use of your version of this file only
28 * under the terms of either the GPL or the LGPL, and not to allow others to
29 * use your version of this file under the terms of the MPL, indicate your
30 * decision by deleting the provisions above and replace them with the notice
31 * and other provisions required by the GPL or the LGPL. If you do not delete
32 * the provisions above, a recipient may use your version of this file under
33 * the terms of any one of the MPL, the GPL or the LGPL.
34 *
35 * ***** END LICENSE BLOCK ***** */
36
37 //Sampling from about 20M text materials include literature and computer technology
38
39 /******************************************************************************
40 * 128 --> 0.79
41 * 256 --> 0.92
42 * 512 --> 0.986
43 * 1024 --> 0.99944
44 * 2048 --> 0.99999
45 *
46 * Idea Distribution Ratio = 0.98653 / (1-0.98653) = 73.24
47 * Random Distribution Ration = 512 / (2350-512) = 0.279.
48 *
49 * Typical Distribution Ratio
50 *****************************************************************************/
51
52 #define EUCKR_TYPICAL_DISTRIBUTION_RATIO (float) 6.0
53
54 #define EUCKR_TABLE_SIZE 2352
55
56 //Char to FreqOrder table ,
57 static const PRInt16 EUCKRCharToFreqOrder[] =
58 {
59 13, 130, 120,1396, 481,1719,1720, 328, 609, 212,1721, 707, 400, 299,1722, 87,
60 1397,1723, 104, 536,1117,1203,1724,1267, 685,1268, 508,1725,1726,1727,1728,1398,
61 1399,1729,1730,1731, 141, 621, 326,1057, 368,1732, 267, 488, 20,1733,1269,1734,
62 945,1400,1735, 47, 904,1270,1736,1737, 773, 248,1738, 409, 313, 786, 429,1739,
63 116, 987, 813,1401, 683, 75,1204, 145,1740,1741,1742,1743, 16, 847, 667, 622,
64 708,1744,1745,1746, 966, 787, 304, 129,1747, 60, 820, 123, 676,1748,1749,1750,
65 1751, 617,1752, 626,1753,1754,1755,1756, 653,1757,1758,1759,1760,1761,1762, 856,
66 344,1763,1764,1765,1766, 89, 401, 418, 806, 905, 848,1767,1768,1769, 946,1205,
67 709,1770,1118,1771, 241,1772,1773,1774,1271,1775, 569,1776, 999,1777,1778,1779,
68 1780, 337, 751,1058, 28, 628, 254,1781, 177, 906, 270, 349, 891,1079,1782, 19,
69 1783, 379,1784, 315,1785, 629, 754,1402, 559,1786, 636, 203,1206,1787, 710, 567,
70 1788, 935, 814,1789,1790,1207, 766, 528,1791,1792,1208,1793,1794,1795,1796,1797,
71 1403,1798,1799, 533,1059,1404,1405,1156,1406, 936, 884,1080,1800, 351,1801,1802,
72 1803,1804,1805, 801,1806,1807,1808,1119,1809,1157, 714, 474,1407,1810, 298, 899,
73 885,1811,1120, 802,1158,1812, 892,1813,1814,1408, 659,1815,1816,1121,1817,1818,
74 1819,1820,1821,1822, 319,1823, 594, 545,1824, 815, 937,1209,1825,1826, 573,1409,
75 1022,1827,1210,1828,1829,1830,1831,1832,1833, 556, 722, 807,1122,1060,1834, 697,
76 1835, 900, 557, 715,1836,1410, 540,1411, 752,1159, 294, 597,1211, 976, 803, 770,
77 1412,1837,1838, 39, 794,1413, 358,1839, 371, 925,1840, 453, 661, 788, 531, 723,
78 544,1023,1081, 869, 91,1841, 392, 430, 790, 602,1414, 677,1082, 457,1415,1416,
79 1842,1843, 475, 327,1024,1417, 795, 121,1844, 733, 403,1418,1845,1846,1847, 300,
80 119, 711,1212, 627,1848,1272, 207,1849,1850, 796,1213, 382,1851, 519,1852,1083,
81 893,1853,1854,1855, 367, 809, 487, 671,1856, 663,1857,1858, 956, 471, 306, 857,
82 1859,1860,1160,1084,1861,1862,1863,1864,1865,1061,1866,1867,1868,1869,1870,1871,
83 282, 96, 574,1872, 502,1085,1873,1214,1874, 907,1875,1876, 827, 977,1419,1420,
84 1421, 268,1877,1422,1878,1879,1880, 308,1881, 2, 537,1882,1883,1215,1884,1885,
85 127, 791,1886,1273,1423,1887, 34, 336, 404, 643,1888, 571, 654, 894, 840,1889,
86 0, 886,1274, 122, 575, 260, 908, 938,1890,1275, 410, 316,1891,1892, 100,1893,
87 1894,1123, 48,1161,1124,1025,1895, 633, 901,1276,1896,1897, 115, 816,1898, 317,
88 1899, 694,1900, 909, 734,1424, 572, 866,1425, 691, 85, 524,1010, 543, 394, 841,
89 1901,1902,1903,1026,1904,1905,1906,1907,1908,1909, 30, 451, 651, 988, 310,1910,
90 1911,1426, 810,1216, 93,1912,1913,1277,1217,1914, 858, 759, 45, 58, 181, 610,
91 269,1915,1916, 131,1062, 551, 443,1000, 821,1427, 957, 895,1086,1917,1918, 375,
92 1919, 359,1920, 687,1921, 822,1922, 293,1923,1924, 40, 662, 118, 692, 29, 939,
93 887, 640, 482, 174,1925, 69,1162, 728,1428, 910,1926,1278,1218,1279, 386, 870,
94 217, 854,1163, 823,1927,1928,1929,1930, 834,1931, 78,1932, 859,1933,1063,1934,
95 1935,1936,1937, 438,1164, 208, 595,1938,1939,1940,1941,1219,1125,1942, 280, 888,
96 1429,1430,1220,1431,1943,1944,1945,1946,1947,1280, 150, 510,1432,1948,1949,1950,
97 1951,1952,1953,1954,1011,1087,1955,1433,1043,1956, 881,1957, 614, 958,1064,1065,
98 1221,1958, 638,1001, 860, 967, 896,1434, 989, 492, 553,1281,1165,1959,1282,1002,
99 1283,1222,1960,1961,1962,1963, 36, 383, 228, 753, 247, 454,1964, 876, 678,1965,
100 1966,1284, 126, 464, 490, 835, 136, 672, 529, 940,1088,1435, 473,1967,1968, 467,
101 50, 390, 227, 587, 279, 378, 598, 792, 968, 240, 151, 160, 849, 882,1126,1285,
102 639,1044, 133, 140, 288, 360, 811, 563,1027, 561, 142, 523,1969,1970,1971, 7,
103 103, 296, 439, 407, 506, 634, 990,1972,1973,1974,1975, 645,1976,1977,1978,1979,
104 1980,1981, 236,1982,1436,1983,1984,1089, 192, 828, 618, 518,1166, 333,1127,1985,
105 818,1223,1986,1987,1988,1989,1990,1991,1992,1993, 342,1128,1286, 746, 842,1994,
106 1995, 560, 223,1287, 98, 8, 189, 650, 978,1288,1996,1437,1997, 17, 345, 250,
107 423, 277, 234, 512, 226, 97, 289, 42, 167,1998, 201,1999,2000, 843, 836, 824,
108 532, 338, 783,1090, 182, 576, 436,1438,1439, 527, 500,2001, 947, 889,2002,2003,
109 2004,2005, 262, 600, 314, 447,2006, 547,2007, 693, 738,1129,2008, 71,1440, 745,
110 619, 688,2009, 829,2010,2011, 147,2012, 33, 948,2013,2014, 74, 224,2015, 61,
111 191, 918, 399, 637,2016,1028,1130, 257, 902,2017,2018,2019,2020,2021,2022,2023,
112 2024,2025,2026, 837,2027,2028,2029,2030, 179, 874, 591, 52, 724, 246,2031,2032,
113 2033,2034,1167, 969,2035,1289, 630, 605, 911,1091,1168,2036,2037,2038,1441, 912,
114 2039, 623,2040,2041, 253,1169,1290,2042,1442, 146, 620, 611, 577, 433,2043,1224,
115 719,1170, 959, 440, 437, 534, 84, 388, 480,1131, 159, 220, 198, 679,2044,1012,
116 819,1066,1443, 113,1225, 194, 318,1003,1029,2045,2046,2047,2048,1067,2049,2050,
117 2051,2052,2053, 59, 913, 112,2054, 632,2055, 455, 144, 739,1291,2056, 273, 681,
118 499,2057, 448,2058,2059, 760,2060,2061, 970, 384, 169, 245,1132,2062,2063, 414,
119 1444,2064,2065, 41, 235,2066, 157, 252, 877, 568, 919, 789, 580,2067, 725,2068,
120 2069,1292,2070,2071,1445,2072,1446,2073,2074, 55, 588, 66,1447, 271,1092,2075,
121 1226,2076, 960,1013, 372,2077,2078,2079,2080,2081,1293,2082,2083,2084,2085, 850,
122 2086,2087,2088,2089,2090, 186,2091,1068, 180,2092,2093,2094, 109,1227, 522, 606,
123 2095, 867,1448,1093, 991,1171, 926, 353,1133,2096, 581,2097,2098,2099,1294,1449,
124 1450,2100, 596,1172,1014,1228,2101,1451,1295,1173,1229,2102,2103,1296,1134,1452,
125 949,1135,2104,2105,1094,1453,1454,1455,2106,1095,2107,2108,2109,2110,2111,2112,
126 2113,2114,2115,2116,2117, 804,2118,2119,1230,1231, 805,1456, 405,1136,2120,2121,
127 2122,2123,2124, 720, 701,1297, 992,1457, 927,1004,2125,2126,2127,2128,2129,2130,
128 22, 417,2131, 303,2132, 385,2133, 971, 520, 513,2134,1174, 73,1096, 231, 274,
129 962,1458, 673,2135,1459,2136, 152,1137,2137,2138,2139,2140,1005,1138,1460,1139,
130 2141,2142,2143,2144, 11, 374, 844,2145, 154,1232, 46,1461,2146, 838, 830, 721,
131 1233, 106,2147, 90, 428, 462, 578, 566,1175, 352,2148,2149, 538,1234, 124,1298,
132 2150,1462, 761, 565,2151, 686,2152, 649,2153, 72, 173,2154, 460, 415,2155,1463,
133 2156,1235, 305,2157,2158,2159,2160,2161,2162, 579,2163,2164,2165,2166,2167, 747,
134 2168,2169,2170,2171,1464, 669,2172,2173,2174,2175,2176,1465,2177, 23, 530, 285,
135 2178, 335, 729,2179, 397,2180,2181,2182,1030,2183,2184, 698,2185,2186, 325,2187,
136 2188, 369,2189, 799,1097,1015, 348,2190,1069, 680,2191, 851,1466,2192,2193, 10,
137 2194, 613, 424,2195, 979, 108, 449, 589, 27, 172, 81,1031, 80, 774, 281, 350,
138 1032, 525, 301, 582,1176,2196, 674,1045,2197,2198,1467, 730, 762,2199,2200,2201,
139 2202,1468,2203, 993,2204,2205, 266,1070, 963,1140,2206,2207,2208, 664,1098, 972,
140 2209,2210,2211,1177,1469,1470, 871,2212,2213,2214,2215,2216,1471,2217,2218,2219,
141 2220,2221,2222,2223,2224,2225,2226,2227,1472,1236,2228,2229,2230,2231,2232,2233,
142 2234,2235,1299,2236,2237, 200,2238, 477, 373,2239,2240, 731, 825, 777,2241,2242,
143 2243, 521, 486, 548,2244,2245,2246,1473,1300, 53, 549, 137, 875, 76, 158,2247,
144 1301,1474, 469, 396,1016, 278, 712,2248, 321, 442, 503, 767, 744, 941,1237,1178,
145 1475,2249, 82, 178,1141,1179, 973,2250,1302,2251, 297,2252,2253, 570,2254,2255,
146 2256, 18, 450, 206,2257, 290, 292,1142,2258, 511, 162, 99, 346, 164, 735,2259,
147 1476,1477, 4, 554, 343, 798,1099,2260,1100,2261, 43, 171,1303, 139, 215,2262,
148 2263, 717, 775,2264,1033, 322, 216,2265, 831,2266, 149,2267,1304,2268,2269, 702,
149 1238, 135, 845, 347, 309,2270, 484,2271, 878, 655, 238,1006,1478,2272, 67,2273,
150 295,2274,2275, 461,2276, 478, 942, 412,2277,1034,2278,2279,2280, 265,2281, 541,
151 2282,2283,2284,2285,2286, 70, 852,1071,2287,2288,2289,2290, 21, 56, 509, 117,
152 432,2291,2292, 331, 980, 552,1101, 148, 284, 105, 393,1180,1239, 755,2293, 187,
153 2294,1046,1479,2295, 340,2296, 63,1047, 230,2297,2298,1305, 763,1306, 101, 800,
154 808, 494,2299,2300,2301, 903,2302, 37,1072, 14, 5,2303, 79, 675,2304, 312,
155 2305,2306,2307,2308,2309,1480, 6,1307,2310,2311,2312, 1, 470, 35, 24, 229,
156 2313, 695, 210, 86, 778, 15, 784, 592, 779, 32, 77, 855, 964,2314, 259,2315,
157 501, 380,2316,2317, 83, 981, 153, 689,1308,1481,1482,1483,2318,2319, 716,1484,
158 2320,2321,2322,2323,2324,2325,1485,2326,2327, 128, 57, 68, 261,1048, 211, 170,
159 1240, 31,2328, 51, 435, 742,2329,2330,2331, 635,2332, 264, 456,2333,2334,2335,
160 425,2336,1486, 143, 507, 263, 943,2337, 363, 920,1487, 256,1488,1102, 243, 601,
161 1489,2338,2339,2340,2341,2342,2343,2344, 861,2345,2346,2347,2348,2349,2350, 395,
162 2351,1490,1491, 62, 535, 166, 225,2352,2353, 668, 419,1241, 138, 604, 928,2354,
163 1181,2355,1492,1493,2356,2357,2358,1143,2359, 696,2360, 387, 307,1309, 682, 476,
164 2361,2362, 332, 12, 222, 156,2363, 232,2364, 641, 276, 656, 517,1494,1495,1035,
165 416, 736,1496,2365,1017, 586,2366,2367,2368,1497,2369, 242,2370,2371,2372,1498,
166 2373, 965, 713,2374,2375,2376,2377, 740, 982,1499, 944,1500,1007,2378,2379,1310,
167 1501,2380,2381,2382, 785, 329,2383,2384,1502,2385,2386,2387, 932,2388,1503,2389,
168 2390,2391,2392,1242,2393,2394,2395,2396,2397, 994, 950,2398,2399,2400,2401,1504,
169 1311,2402,2403,2404,2405,1049, 749,2406,2407, 853, 718,1144,1312,2408,1182,1505,
170 2409,2410, 255, 516, 479, 564, 550, 214,1506,1507,1313, 413, 239, 444, 339,1145,
171 1036,1508,1509,1314,1037,1510,1315,2411,1511,2412,2413,2414, 176, 703, 497, 624,
172 593, 921, 302,2415, 341, 165,1103,1512,2416,1513,2417,2418,2419, 376,2420, 700,
173 2421,2422,2423, 258, 768,1316,2424,1183,2425, 995, 608,2426,2427,2428,2429, 221,
174 2430,2431,2432,2433,2434,2435,2436,2437, 195, 323, 726, 188, 897, 983,1317, 377,
175 644,1050, 879,2438, 452,2439,2440,2441,2442,2443,2444, 914,2445,2446,2447,2448,
176 915, 489,2449,1514,1184,2450,2451, 515, 64, 427, 495,2452, 583,2453, 483, 485,
177 1038, 562, 213,1515, 748, 666,2454,2455,2456,2457, 334,2458, 780, 996,1008, 705,
178 1243,2459,2460,2461,2462,2463, 114,2464, 493,1146, 366, 163,1516, 961,1104,2465,
179 291,2466,1318,1105,2467,1517, 365,2468, 355, 951,1244,2469,1319,2470, 631,2471,
180 2472, 218,1320, 364, 320, 756,1518,1519,1321,1520,1322,2473,2474,2475,2476, 997,
181 2477,2478,2479,2480, 665,1185,2481, 916,1521,2482,2483,2484, 584, 684,2485,2486,
182 797,2487,1051,1186,2488,2489,2490,1522,2491,2492, 370,2493,1039,1187, 65,2494,
183 434, 205, 463,1188,2495, 125, 812, 391, 402, 826, 699, 286, 398, 155, 781, 771,
184 585,2496, 590, 505,1073,2497, 599, 244, 219, 917,1018, 952, 646,1523,2498,1323,
185 2499,2500, 49, 984, 354, 741,2501, 625,2502,1324,2503,1019, 190, 357, 757, 491,
186 95, 782, 868,2504,2505,2506,2507,2508,2509, 134,1524,1074, 422,1525, 898,2510,
187 161,2511,2512,2513,2514, 769,2515,1526,2516,2517, 411,1325,2518, 472,1527,2519,
188 2520,2521,2522,2523,2524, 985,2525,2526,2527,2528,2529,2530, 764,2531,1245,2532,
189 2533, 25, 204, 311,2534, 496,2535,1052,2536,2537,2538,2539,2540,2541,2542, 199,
190 704, 504, 468, 758, 657,1528, 196, 44, 839,1246, 272, 750,2543, 765, 862,2544,
191 2545,1326,2546, 132, 615, 933,2547, 732,2548,2549,2550,1189,1529,2551, 283,1247,
192 1053, 607, 929,2552,2553,2554, 930, 183, 872, 616,1040,1147,2555,1148,1020, 441,
193 249,1075,2556,2557,2558, 466, 743,2559,2560,2561, 92, 514, 426, 420, 526,2562,
194 2563,2564,2565,2566,2567,2568, 185,2569,2570,2571,2572, 776,1530, 658,2573, 362,
195 2574, 361, 922,1076, 793,2575,2576,2577,2578,2579,2580,1531, 251,2581,2582,2583,
196 2584,1532, 54, 612, 237,1327,2585,2586, 275, 408, 647, 111,2587,1533,1106, 465,
197 3, 458, 9, 38,2588, 107, 110, 890, 209, 26, 737, 498,2589,1534,2590, 431,
198 202, 88,1535, 356, 287,1107, 660,1149,2591, 381,1536, 986,1150, 445,1248,1151,
199 974,2592,2593, 846,2594, 446, 953, 184,1249,1250, 727,2595, 923, 193, 883,2596,
200 2597,2598, 102, 324, 539, 817,2599, 421,1041,2600, 832,2601, 94, 175, 197, 406,
201 2602, 459,2603,2604,2605,2606,2607, 330, 555,2608,2609,2610, 706,1108, 389,2611,
202 2612,2613,2614, 233,2615, 833, 558, 931, 954,1251,2616,2617,1537, 546,2618,2619,
203 1009,2620,2621,2622,1538, 690,1328,2623, 955,2624,1539,2625,2626, 772,2627,2628,
204 2629,2630,2631, 924, 648, 863, 603,2632,2633, 934,1540, 864, 865,2634, 642,1042,
205 670,1190,2635,2636,2637,2638, 168,2639, 652, 873, 542,1054,1541,2640,2641,2642, //512, 256
206
207 /***************************************************************************************
208 *Everything below is of no interest for detection purpose *
209 ***************************************************************************************
210
211 2643,2644,2645,2646,2647,2648,2649,2650,2651,2652,2653,2654,2655,2656,2657,2658,
212 2659,2660,2661,2662,2663,2664,2665,2666,2667,2668,2669,2670,2671,2672,2673,2674,
213 2675,2676,2677,2678,2679,2680,2681,2682,2683,2684,2685,2686,2687,2688,2689,2690,
214 2691,2692,2693,2694,2695,2696,2697,2698,2699,1542, 880,2700,2701,2702,2703,2704,
215 2705,2706,2707,2708,2709,2710,2711,2712,2713,2714,2715,2716,2717,2718,2719,2720,
216 2721,2722,2723,2724,2725,1543,2726,2727,2728,2729,2730,2731,2732,1544,2733,2734,
217 2735,2736,2737,2738,2739,2740,2741,2742,2743,2744,2745,2746,2747,2748,2749,2750,
218 2751,2752,2753,2754,1545,2755,2756,2757,2758,2759,2760,2761,2762,2763,2764,2765,
219 2766,1546,2767,1547,2768,2769,2770,2771,2772,2773,2774,2775,2776,2777,2778,2779,
220 2780,2781,2782,2783,2784,2785,2786,1548,2787,2788,2789,1109,2790,2791,2792,2793,
221 2794,2795,2796,2797,2798,2799,2800,2801,2802,2803,2804,2805,2806,2807,2808,2809,
222 2810,2811,2812,1329,2813,2814,2815,2816,2817,2818,2819,2820,2821,2822,2823,2824,
223 2825,2826,2827,2828,2829,2830,2831,2832,2833,2834,2835,2836,2837,2838,2839,2840,
224 2841,2842,2843,2844,2845,2846,2847,2848,2849,2850,2851,2852,2853,2854,2855,2856,
225 1549,2857,2858,2859,2860,1550,2861,2862,1551,2863,2864,2865,2866,2867,2868,2869,
226 2870,2871,2872,2873,2874,1110,1330,2875,2876,2877,2878,2879,2880,2881,2882,2883,
227 2884,2885,2886,2887,2888,2889,2890,2891,2892,2893,2894,2895,2896,2897,2898,2899,
228 2900,2901,2902,2903,2904,2905,2906,2907,2908,2909,2910,2911,2912,2913,2914,2915,
229 2916,2917,2918,2919,2920,2921,2922,2923,2924,2925,2926,2927,2928,2929,2930,1331,
230 2931,2932,2933,2934,2935,2936,2937,2938,2939,2940,2941,2942,2943,1552,2944,2945,
231 2946,2947,2948,2949,2950,2951,2952,2953,2954,2955,2956,2957,2958,2959,2960,2961,
232 2962,2963,2964,1252,2965,2966,2967,2968,2969,2970,2971,2972,2973,2974,2975,2976,
233 2977,2978,2979,2980,2981,2982,2983,2984,2985,2986,2987,2988,2989,2990,2991,2992,
234 2993,2994,2995,2996,2997,2998,2999,3000,3001,3002,3003,3004,3005,3006,3007,3008,
235 3009,3010,3011,3012,1553,3013,3014,3015,3016,3017,1554,3018,1332,3019,3020,3021,
236 3022,3023,3024,3025,3026,3027,3028,3029,3030,3031,3032,3033,3034,3035,3036,3037,
237 3038,3039,3040,3041,3042,3043,3044,3045,3046,3047,3048,3049,3050,1555,3051,3052,
238 3053,1556,1557,3054,3055,3056,3057,3058,3059,3060,3061,3062,3063,3064,3065,3066,
239 3067,1558,3068,3069,3070,3071,3072,3073,3074,3075,3076,1559,3077,3078,3079,3080,
240 3081,3082,3083,1253,3084,3085,3086,3087,3088,3089,3090,3091,3092,3093,3094,3095,
241 3096,3097,3098,3099,3100,3101,3102,3103,3104,3105,3106,3107,3108,1152,3109,3110,
242 3111,3112,3113,1560,3114,3115,3116,3117,1111,3118,3119,3120,3121,3122,3123,3124,
243 3125,3126,3127,3128,3129,3130,3131,3132,3133,3134,3135,3136,3137,3138,3139,3140,
244 3141,3142,3143,3144,3145,3146,3147,3148,3149,3150,3151,3152,3153,3154,3155,3156,
245 3157,3158,3159,3160,3161,3162,3163,3164,3165,3166,3167,3168,3169,3170,3171,3172,
246 3173,3174,3175,3176,1333,3177,3178,3179,3180,3181,3182,3183,3184,3185,3186,3187,
247 3188,3189,1561,3190,3191,1334,3192,3193,3194,3195,3196,3197,3198,3199,3200,3201,
248 3202,3203,3204,3205,3206,3207,3208,3209,3210,3211,3212,3213,3214,3215,3216,3217,
249 3218,3219,3220,3221,3222,3223,3224,3225,3226,3227,3228,3229,3230,3231,3232,3233,
250 3234,1562,3235,3236,3237,3238,3239,3240,3241,3242,3243,3244,3245,3246,3247,3248,
251 3249,3250,3251,3252,3253,3254,3255,3256,3257,3258,3259,3260,3261,3262,3263,3264,
252 3265,3266,3267,3268,3269,3270,3271,3272,3273,3274,3275,3276,3277,1563,3278,3279,
253 3280,3281,3282,3283,3284,3285,3286,3287,3288,3289,3290,3291,3292,3293,3294,3295,
254 3296,3297,3298,3299,3300,3301,3302,3303,3304,3305,3306,3307,3308,3309,3310,3311,
255 3312,3313,3314,3315,3316,3317,3318,3319,3320,3321,3322,3323,3324,3325,3326,3327,
256 3328,3329,3330,3331,3332,3333,3334,3335,3336,3337,3338,3339,3340,3341,3342,3343,
257 3344,3345,3346,3347,3348,3349,3350,3351,3352,3353,3354,3355,3356,3357,3358,3359,
258 3360,3361,3362,3363,3364,1335,3365,3366,3367,3368,3369,3370,3371,3372,3373,3374,
259 3375,3376,3377,3378,3379,3380,3381,3382,3383,3384,3385,3386,3387,1336,3388,3389,
260 3390,3391,3392,3393,3394,3395,3396,3397,3398,3399,3400,3401,3402,3403,3404,3405,
261 3406,3407,3408,3409,3410,3411,3412,3413,3414,1337,3415,3416,3417,3418,3419,1338,
262 3420,3421,3422,1564,1565,3423,3424,3425,3426,3427,3428,3429,3430,3431,1254,3432,
263 3433,3434,1339,3435,3436,3437,3438,3439,1566,3440,3441,3442,3443,3444,3445,3446,
264 3447,3448,3449,3450,3451,3452,3453,3454,1255,3455,3456,3457,3458,3459,1567,1191,
265 3460,1568,1569,3461,3462,3463,1570,3464,3465,3466,3467,3468,1571,3469,3470,3471,
266 3472,3473,1572,3474,3475,3476,3477,3478,3479,3480,3481,3482,3483,3484,3485,3486,
267 1340,3487,3488,3489,3490,3491,3492,1021,3493,3494,3495,3496,3497,3498,1573,3499,
268 1341,3500,3501,3502,3503,3504,3505,3506,3507,3508,3509,3510,3511,1342,3512,3513,
269 3514,3515,3516,1574,1343,3517,3518,3519,1575,3520,1576,3521,3522,3523,3524,3525,
270 3526,3527,3528,3529,3530,3531,3532,3533,3534,3535,3536,3537,3538,3539,3540,3541,
271 3542,3543,3544,3545,3546,3547,3548,3549,3550,3551,3552,3553,3554,3555,3556,3557,
272 3558,3559,3560,3561,3562,3563,3564,3565,3566,3567,3568,3569,3570,3571,3572,3573,
273 3574,3575,3576,3577,3578,3579,3580,1577,3581,3582,1578,3583,3584,3585,3586,3587,
274 3588,3589,3590,3591,3592,3593,3594,3595,3596,3597,3598,3599,3600,3601,3602,3603,
275 3604,1579,3605,3606,3607,3608,3609,3610,3611,3612,3613,3614,3615,3616,3617,3618,
276 3619,3620,3621,3622,3623,3624,3625,3626,3627,3628,3629,1580,3630,3631,1581,3632,
277 3633,3634,3635,3636,3637,3638,3639,3640,3641,3642,3643,3644,3645,3646,3647,3648,
278 3649,3650,3651,3652,3653,3654,3655,3656,1582,3657,3658,3659,3660,3661,3662,3663,
279 3664,3665,3666,3667,3668,3669,3670,3671,3672,3673,3674,3675,3676,3677,3678,3679,
280 3680,3681,3682,3683,3684,3685,3686,3687,3688,3689,3690,3691,3692,3693,3694,3695,
281 3696,3697,3698,3699,3700,1192,3701,3702,3703,3704,1256,3705,3706,3707,3708,1583,
282 1257,3709,3710,3711,3712,3713,3714,3715,3716,1584,3717,3718,3719,3720,3721,3722,
283 3723,3724,3725,3726,3727,3728,3729,3730,3731,3732,3733,3734,3735,3736,3737,3738,
284 3739,3740,3741,3742,3743,3744,3745,1344,3746,3747,3748,3749,3750,3751,3752,3753,
285 3754,3755,3756,1585,3757,3758,3759,3760,3761,3762,3763,3764,3765,3766,1586,3767,
286 3768,3769,3770,3771,3772,3773,3774,3775,3776,3777,3778,1345,3779,3780,3781,3782,
287 3783,3784,3785,3786,3787,3788,3789,3790,3791,3792,3793,3794,3795,1346,1587,3796,
288 3797,1588,3798,3799,3800,3801,3802,3803,3804,3805,3806,1347,3807,3808,3809,3810,
289 3811,1589,3812,3813,3814,3815,3816,3817,3818,3819,3820,3821,1590,3822,3823,1591,
290 1348,3824,3825,3826,3827,3828,3829,3830,1592,3831,3832,1593,3833,3834,3835,3836,
291 3837,3838,3839,3840,3841,3842,3843,3844,1349,3845,3846,3847,3848,3849,3850,3851,
292 3852,3853,3854,3855,3856,3857,3858,1594,3859,3860,3861,3862,3863,3864,3865,3866,
293 3867,3868,3869,1595,3870,3871,3872,3873,1596,3874,3875,3876,3877,3878,3879,3880,
294 3881,3882,3883,3884,3885,3886,1597,3887,3888,3889,3890,3891,3892,3893,3894,3895,
295 1598,3896,3897,3898,1599,1600,3899,1350,3900,1351,3901,3902,1352,3903,3904,3905,
296 3906,3907,3908,3909,3910,3911,3912,3913,3914,3915,3916,3917,3918,3919,3920,3921,
297 3922,3923,3924,1258,3925,3926,3927,3928,3929,3930,3931,1193,3932,1601,3933,3934,
298 3935,3936,3937,3938,3939,3940,3941,3942,3943,1602,3944,3945,3946,3947,3948,1603,
299 3949,3950,3951,3952,3953,3954,3955,3956,3957,3958,3959,3960,3961,3962,3963,3964,
300 3965,1604,3966,3967,3968,3969,3970,3971,3972,3973,3974,3975,3976,3977,1353,3978,
301 3979,3980,3981,3982,3983,3984,3985,3986,3987,3988,3989,3990,3991,1354,3992,3993,
302 3994,3995,3996,3997,3998,3999,4000,4001,4002,4003,4004,4005,4006,4007,4008,4009,
303 4010,4011,4012,4013,4014,4015,4016,4017,4018,4019,4020,4021,4022,4023,1355,4024,
304 4025,4026,4027,4028,4029,4030,4031,4032,4033,4034,4035,4036,4037,4038,4039,4040,
305 1605,4041,4042,4043,4044,4045,4046,4047,4048,4049,4050,4051,4052,4053,4054,4055,
306 4056,4057,4058,4059,4060,1606,4061,4062,4063,4064,1607,4065,4066,4067,4068,4069,
307 4070,4071,4072,4073,4074,4075,4076,1194,4077,4078,1608,4079,4080,4081,4082,4083,
308 4084,4085,4086,4087,1609,4088,4089,4090,4091,4092,4093,4094,4095,4096,4097,4098,
309 4099,4100,4101,4102,4103,4104,4105,4106,4107,4108,1259,4109,4110,4111,4112,4113,
310 4114,4115,4116,4117,4118,4119,4120,4121,4122,4123,4124,1195,4125,4126,4127,1610,
311 4128,4129,4130,4131,4132,4133,4134,4135,4136,4137,1356,4138,4139,4140,4141,4142,
312 4143,4144,1611,4145,4146,4147,4148,4149,4150,4151,4152,4153,4154,4155,4156,4157,
313 4158,4159,4160,4161,4162,4163,4164,4165,4166,4167,4168,4169,4170,4171,4172,4173,
314 4174,4175,4176,4177,4178,4179,4180,4181,4182,4183,4184,4185,4186,4187,4188,4189,
315 4190,4191,4192,4193,4194,4195,4196,4197,4198,4199,4200,4201,4202,4203,4204,4205,
316 4206,4207,4208,4209,4210,4211,4212,4213,4214,4215,4216,4217,4218,4219,1612,4220,
317 4221,4222,4223,4224,4225,4226,4227,1357,4228,1613,4229,4230,4231,4232,4233,4234,
318 4235,4236,4237,4238,4239,4240,4241,4242,4243,1614,4244,4245,4246,4247,4248,4249,
319 4250,4251,4252,4253,4254,4255,4256,4257,4258,4259,4260,4261,4262,4263,4264,4265,
320 4266,4267,4268,4269,4270,1196,1358,4271,4272,4273,4274,4275,4276,4277,4278,4279,
321 4280,4281,4282,4283,4284,4285,4286,4287,1615,4288,4289,4290,4291,4292,4293,4294,
322 4295,4296,4297,4298,4299,4300,4301,4302,4303,4304,4305,4306,4307,4308,4309,4310,
323 4311,4312,4313,4314,4315,4316,4317,4318,4319,4320,4321,4322,4323,4324,4325,4326,
324 4327,4328,4329,4330,4331,4332,4333,4334,1616,4335,4336,4337,4338,4339,4340,4341,
325 4342,4343,4344,4345,4346,4347,4348,4349,4350,4351,4352,4353,4354,4355,4356,4357,
326 4358,4359,4360,1617,4361,4362,4363,4364,4365,1618,4366,4367,4368,4369,4370,4371,
327 4372,4373,4374,4375,4376,4377,4378,4379,4380,4381,4382,4383,4384,4385,4386,4387,
328 4388,4389,4390,4391,4392,4393,4394,4395,4396,4397,4398,4399,4400,4401,4402,4403,
329 4404,4405,4406,4407,4408,4409,4410,4411,4412,4413,4414,4415,4416,1619,4417,4418,
330 4419,4420,4421,4422,4423,4424,4425,1112,4426,4427,4428,4429,4430,1620,4431,4432,
331 4433,4434,4435,4436,4437,4438,4439,4440,4441,4442,1260,1261,4443,4444,4445,4446,
332 4447,4448,4449,4450,4451,4452,4453,4454,4455,1359,4456,4457,4458,4459,4460,4461,
333 4462,4463,4464,4465,1621,4466,4467,4468,4469,4470,4471,4472,4473,4474,4475,4476,
334 4477,4478,4479,4480,4481,4482,4483,4484,4485,4486,4487,4488,4489,1055,4490,4491,
335 4492,4493,4494,4495,4496,4497,4498,4499,4500,4501,4502,4503,4504,4505,4506,4507,
336 4508,4509,4510,4511,4512,4513,4514,4515,4516,4517,4518,1622,4519,4520,4521,1623,
337 4522,4523,4524,4525,4526,4527,4528,4529,4530,4531,4532,4533,4534,4535,1360,4536,
338 4537,4538,4539,4540,4541,4542,4543, 975,4544,4545,4546,4547,4548,4549,4550,4551,
339 4552,4553,4554,4555,4556,4557,4558,4559,4560,4561,4562,4563,4564,4565,4566,4567,
340 4568,4569,4570,4571,1624,4572,4573,4574,4575,4576,1625,4577,4578,4579,4580,4581,
341 4582,4583,4584,1626,4585,4586,4587,4588,4589,4590,4591,4592,4593,4594,4595,1627,
342 4596,4597,4598,4599,4600,4601,4602,4603,4604,4605,4606,4607,4608,4609,4610,4611,
343 4612,4613,4614,4615,1628,4616,4617,4618,4619,4620,4621,4622,4623,4624,4625,4626,
344 4627,4628,4629,4630,4631,4632,4633,4634,4635,4636,4637,4638,4639,4640,4641,4642,
345 4643,4644,4645,4646,4647,4648,4649,1361,4650,4651,4652,4653,4654,4655,4656,4657,
346 4658,4659,4660,4661,1362,4662,4663,4664,4665,4666,4667,4668,4669,4670,4671,4672,
347 4673,4674,4675,4676,4677,4678,4679,4680,4681,4682,1629,4683,4684,4685,4686,4687,
348 1630,4688,4689,4690,4691,1153,4692,4693,4694,1113,4695,4696,4697,4698,4699,4700,
349 4701,4702,4703,4704,4705,4706,4707,4708,4709,4710,4711,1197,4712,4713,4714,4715,
350 4716,4717,4718,4719,4720,4721,4722,4723,4724,4725,4726,4727,4728,4729,4730,4731,
351 4732,4733,4734,4735,1631,4736,1632,4737,4738,4739,4740,4741,4742,4743,4744,1633,
352 4745,4746,4747,4748,4749,1262,4750,4751,4752,4753,4754,1363,4755,4756,4757,4758,
353 4759,4760,4761,4762,4763,4764,4765,4766,4767,4768,1634,4769,4770,4771,4772,4773,
354 4774,4775,4776,4777,4778,1635,4779,4780,4781,4782,4783,4784,4785,4786,4787,4788,
355 4789,1636,4790,4791,4792,4793,4794,4795,4796,4797,4798,4799,4800,4801,4802,4803,
356 4804,4805,4806,1637,4807,4808,4809,1638,4810,4811,4812,4813,4814,4815,4816,4817,
357 4818,1639,4819,4820,4821,4822,4823,4824,4825,4826,4827,4828,4829,4830,4831,4832,
358 4833,1077,4834,4835,4836,4837,4838,4839,4840,4841,4842,4843,4844,4845,4846,4847,
359 4848,4849,4850,4851,4852,4853,4854,4855,4856,4857,4858,4859,4860,4861,4862,4863,
360 4864,4865,4866,4867,4868,4869,4870,4871,4872,4873,4874,4875,4876,4877,4878,4879,
361 4880,4881,4882,4883,1640,4884,4885,1641,4886,4887,4888,4889,4890,4891,4892,4893,
362 4894,4895,4896,4897,4898,4899,4900,4901,4902,4903,4904,4905,4906,4907,4908,4909,
363 4910,4911,1642,4912,4913,4914,1364,4915,4916,4917,4918,4919,4920,4921,4922,4923,
364 4924,4925,4926,4927,4928,4929,4930,4931,1643,4932,4933,4934,4935,4936,4937,4938,
365 4939,4940,4941,4942,4943,4944,4945,4946,4947,4948,4949,4950,4951,4952,4953,4954,
366 4955,4956,4957,4958,4959,4960,4961,4962,4963,4964,4965,4966,4967,4968,4969,4970,
367 4971,4972,4973,4974,4975,4976,4977,4978,4979,4980,1644,4981,4982,4983,4984,1645,
368 4985,4986,1646,4987,4988,4989,4990,4991,4992,4993,4994,4995,4996,4997,4998,4999,
369 5000,5001,5002,5003,5004,5005,1647,5006,1648,5007,5008,5009,5010,5011,5012,1078,
370 5013,5014,5015,5016,5017,5018,5019,5020,5021,5022,5023,5024,5025,5026,5027,5028,
371 1365,5029,5030,5031,5032,5033,5034,5035,5036,5037,5038,5039,1649,5040,5041,5042,
372 5043,5044,5045,1366,5046,5047,5048,5049,5050,5051,5052,5053,5054,5055,1650,5056,
373 5057,5058,5059,5060,5061,5062,5063,5064,5065,5066,5067,5068,5069,5070,5071,5072,
374 5073,5074,5075,5076,5077,1651,5078,5079,5080,5081,5082,5083,5084,5085,5086,5087,
375 5088,5089,5090,5091,5092,5093,5094,5095,5096,5097,5098,5099,5100,5101,5102,5103,
376 5104,5105,5106,5107,5108,5109,5110,1652,5111,5112,5113,5114,5115,5116,5117,5118,
377 1367,5119,5120,5121,5122,5123,5124,5125,5126,5127,5128,5129,1653,5130,5131,5132,
378 5133,5134,5135,5136,5137,5138,5139,5140,5141,5142,5143,5144,5145,5146,5147,5148,
379 5149,1368,5150,1654,5151,1369,5152,5153,5154,5155,5156,5157,5158,5159,5160,5161,
380 5162,5163,5164,5165,5166,5167,5168,5169,5170,5171,5172,5173,5174,5175,5176,5177,
381 5178,1370,5179,5180,5181,5182,5183,5184,5185,5186,5187,5188,5189,5190,5191,5192,
382 5193,5194,5195,5196,5197,5198,1655,5199,5200,5201,5202,1656,5203,5204,5205,5206,
383 1371,5207,1372,5208,5209,5210,5211,1373,5212,5213,1374,5214,5215,5216,5217,5218,
384 5219,5220,5221,5222,5223,5224,5225,5226,5227,5228,5229,5230,5231,5232,5233,5234,
385 5235,5236,5237,5238,5239,5240,5241,5242,5243,5244,5245,5246,5247,1657,5248,5249,
386 5250,5251,1658,1263,5252,5253,5254,5255,5256,1375,5257,5258,5259,5260,5261,5262,
387 5263,5264,5265,5266,5267,5268,5269,5270,5271,5272,5273,5274,5275,5276,5277,5278,
388 5279,5280,5281,5282,5283,1659,5284,5285,5286,5287,5288,5289,5290,5291,5292,5293,
389 5294,5295,5296,5297,5298,5299,5300,1660,5301,5302,5303,5304,5305,5306,5307,5308,
390 5309,5310,5311,5312,5313,5314,5315,5316,5317,5318,5319,5320,5321,1376,5322,5323,
391 5324,5325,5326,5327,5328,5329,5330,5331,5332,5333,1198,5334,5335,5336,5337,5338,
392 5339,5340,5341,5342,5343,1661,5344,5345,5346,5347,5348,5349,5350,5351,5352,5353,
393 5354,5355,5356,5357,5358,5359,5360,5361,5362,5363,5364,5365,5366,5367,5368,5369,
394 5370,5371,5372,5373,5374,5375,5376,5377,5378,5379,5380,5381,5382,5383,5384,5385,
395 5386,5387,5388,5389,5390,5391,5392,5393,5394,5395,5396,5397,5398,1264,5399,5400,
396 5401,5402,5403,5404,5405,5406,5407,5408,5409,5410,5411,5412,1662,5413,5414,5415,
397 5416,1663,5417,5418,5419,5420,5421,5422,5423,5424,5425,5426,5427,5428,5429,5430,
398 5431,5432,5433,5434,5435,5436,5437,5438,1664,5439,5440,5441,5442,5443,5444,5445,
399 5446,5447,5448,5449,5450,5451,5452,5453,5454,5455,5456,5457,5458,5459,5460,5461,
400 5462,5463,5464,5465,5466,5467,5468,5469,5470,5471,5472,5473,5474,5475,5476,5477,
401 5478,1154,5479,5480,5481,5482,5483,5484,5485,1665,5486,5487,5488,5489,5490,5491,
402 5492,5493,5494,5495,5496,5497,5498,5499,5500,5501,5502,5503,5504,5505,5506,5507,
403 5508,5509,5510,5511,5512,5513,5514,5515,5516,5517,5518,5519,5520,5521,5522,5523,
404 5524,5525,5526,5527,5528,5529,5530,5531,5532,5533,5534,5535,5536,5537,5538,5539,
405 5540,5541,5542,5543,5544,5545,5546,5547,5548,1377,5549,5550,5551,5552,5553,5554,
406 5555,5556,5557,5558,5559,5560,5561,5562,5563,5564,5565,5566,5567,5568,5569,5570,
407 1114,5571,5572,5573,5574,5575,5576,5577,5578,5579,5580,5581,5582,5583,5584,5585,
408 5586,5587,5588,5589,5590,5591,5592,1378,5593,5594,5595,5596,5597,5598,5599,5600,
409 5601,5602,5603,5604,5605,5606,5607,5608,5609,5610,5611,5612,5613,5614,1379,5615,
410 5616,5617,5618,5619,5620,5621,5622,5623,5624,5625,5626,5627,5628,5629,5630,5631,
411 5632,5633,5634,1380,5635,5636,5637,5638,5639,5640,5641,5642,5643,5644,5645,5646,
412 5647,5648,5649,1381,1056,5650,5651,5652,5653,5654,5655,5656,5657,5658,5659,5660,
413 1666,5661,5662,5663,5664,5665,5666,5667,5668,1667,5669,1668,5670,5671,5672,5673,
414 5674,5675,5676,5677,5678,1155,5679,5680,5681,5682,5683,5684,5685,5686,5687,5688,
415 5689,5690,5691,5692,5693,5694,5695,5696,5697,5698,1669,5699,5700,5701,5702,5703,
416 5704,5705,1670,5706,5707,5708,5709,5710,1671,5711,5712,5713,5714,1382,5715,5716,
417 5717,5718,5719,5720,5721,5722,5723,5724,5725,1672,5726,5727,1673,1674,5728,5729,
418 5730,5731,5732,5733,5734,5735,5736,1675,5737,5738,5739,5740,5741,5742,5743,5744,
419 1676,5745,5746,5747,5748,5749,5750,5751,1383,5752,5753,5754,5755,5756,5757,5758,
420 5759,5760,5761,5762,5763,5764,5765,5766,5767,5768,1677,5769,5770,5771,5772,5773,
421 1678,5774,5775,5776, 998,5777,5778,5779,5780,5781,5782,5783,5784,5785,1384,5786,
422 5787,5788,5789,5790,5791,5792,5793,5794,5795,5796,5797,5798,5799,5800,1679,5801,
423 5802,5803,1115,1116,5804,5805,5806,5807,5808,5809,5810,5811,5812,5813,5814,5815,
424 5816,5817,5818,5819,5820,5821,5822,5823,5824,5825,5826,5827,5828,5829,5830,5831,
425 5832,5833,5834,5835,5836,5837,5838,5839,5840,5841,5842,5843,5844,5845,5846,5847,
426 5848,5849,5850,5851,5852,5853,5854,5855,1680,5856,5857,5858,5859,5860,5861,5862,
427 5863,5864,1681,5865,5866,5867,1682,5868,5869,5870,5871,5872,5873,5874,5875,5876,
428 5877,5878,5879,1683,5880,1684,5881,5882,5883,5884,1685,5885,5886,5887,5888,5889,
429 5890,5891,5892,5893,5894,5895,5896,5897,5898,5899,5900,5901,5902,5903,5904,5905,
430 5906,5907,1686,5908,5909,5910,5911,5912,5913,5914,5915,5916,5917,5918,5919,5920,
431 5921,5922,5923,5924,5925,5926,5927,5928,5929,5930,5931,5932,5933,5934,5935,1687,
432 5936,5937,5938,5939,5940,5941,5942,5943,5944,5945,5946,5947,5948,5949,5950,5951,
433 5952,1688,1689,5953,1199,5954,5955,5956,5957,5958,5959,5960,5961,1690,5962,5963,
434 5964,5965,5966,5967,5968,5969,5970,5971,5972,5973,5974,5975,5976,5977,5978,5979,
435 5980,5981,1385,5982,1386,5983,5984,5985,5986,5987,5988,5989,5990,5991,5992,5993,
436 5994,5995,5996,5997,5998,5999,6000,6001,6002,6003,6004,6005,6006,6007,6008,6009,
437 6010,6011,6012,6013,6014,6015,6016,6017,6018,6019,6020,6021,6022,6023,6024,6025,
438 6026,6027,1265,6028,6029,1691,6030,6031,6032,6033,6034,6035,6036,6037,6038,6039,
439 6040,6041,6042,6043,6044,6045,6046,6047,6048,6049,6050,6051,6052,6053,6054,6055,
440 6056,6057,6058,6059,6060,6061,6062,6063,6064,6065,6066,6067,6068,6069,6070,6071,
441 6072,6073,6074,6075,6076,6077,6078,6079,6080,6081,6082,6083,6084,1692,6085,6086,
442 6087,6088,6089,6090,6091,6092,6093,6094,6095,6096,6097,6098,6099,6100,6101,6102,
443 6103,6104,6105,6106,6107,6108,6109,6110,6111,6112,6113,6114,6115,6116,6117,6118,
444 6119,6120,6121,6122,6123,6124,6125,6126,6127,6128,6129,6130,6131,1693,6132,6133,
445 6134,6135,6136,1694,6137,6138,6139,6140,6141,1695,6142,6143,6144,6145,6146,6147,
446 6148,6149,6150,6151,6152,6153,6154,6155,6156,6157,6158,6159,6160,6161,6162,6163,
447 6164,6165,6166,6167,6168,6169,6170,6171,6172,6173,6174,6175,6176,6177,6178,6179,
448 6180,6181,6182,6183,6184,6185,1696,6186,6187,6188,6189,6190,6191,6192,6193,6194,
449 6195,6196,6197,6198,6199,6200,6201,6202,6203,6204,6205,6206,6207,6208,6209,6210,
450 6211,6212,6213,6214,6215,6216,6217,6218,6219,1697,6220,6221,6222,6223,6224,6225,
451 6226,6227,6228,6229,6230,6231,6232,6233,6234,6235,6236,6237,6238,6239,6240,6241,
452 6242,6243,6244,6245,6246,6247,6248,6249,6250,6251,6252,6253,1698,6254,6255,6256,
453 6257,6258,6259,6260,6261,6262,6263,1200,6264,6265,6266,6267,6268,6269,6270,6271, //1024
454 6272,6273,6274,6275,6276,6277,6278,6279,6280,6281,6282,6283,6284,6285,6286,6287,
455 6288,6289,6290,6291,6292,6293,6294,6295,6296,6297,6298,6299,6300,6301,6302,1699,
456 6303,6304,1700,6305,6306,6307,6308,6309,6310,6311,6312,6313,6314,6315,6316,6317,
457 6318,6319,6320,6321,6322,6323,6324,6325,6326,6327,6328,6329,6330,6331,6332,6333,
458 6334,6335,6336,6337,6338,6339,1701,6340,6341,6342,6343,6344,1387,6345,6346,6347,
459 6348,6349,6350,6351,6352,6353,6354,6355,6356,6357,6358,6359,6360,6361,6362,6363,
460 6364,6365,6366,6367,6368,6369,6370,6371,6372,6373,6374,6375,6376,6377,6378,6379,
461 6380,6381,6382,6383,6384,6385,6386,6387,6388,6389,6390,6391,6392,6393,6394,6395,
462 6396,6397,6398,6399,6400,6401,6402,6403,6404,6405,6406,6407,6408,6409,6410,6411,
463 6412,6413,1702,6414,6415,6416,6417,6418,6419,6420,6421,6422,1703,6423,6424,6425,
464 6426,6427,6428,6429,6430,6431,6432,6433,6434,6435,6436,6437,6438,1704,6439,6440,
465 6441,6442,6443,6444,6445,6446,6447,6448,6449,6450,6451,6452,6453,6454,6455,6456,
466 6457,6458,6459,6460,6461,6462,6463,6464,6465,6466,6467,6468,6469,6470,6471,6472,
467 6473,6474,6475,6476,6477,6478,6479,6480,6481,6482,6483,6484,6485,6486,6487,6488,
468 6489,6490,6491,6492,6493,6494,6495,6496,6497,6498,6499,6500,6501,6502,6503,1266,
469 6504,6505,6506,6507,6508,6509,6510,6511,6512,6513,6514,6515,6516,6517,6518,6519,
470 6520,6521,6522,6523,6524,6525,6526,6527,6528,6529,6530,6531,6532,6533,6534,6535,
471 6536,6537,6538,6539,6540,6541,6542,6543,6544,6545,6546,6547,6548,6549,6550,6551,
472 1705,1706,6552,6553,6554,6555,6556,6557,6558,6559,6560,6561,6562,6563,6564,6565,
473 6566,6567,6568,6569,6570,6571,6572,6573,6574,6575,6576,6577,6578,6579,6580,6581,
474 6582,6583,6584,6585,6586,6587,6588,6589,6590,6591,6592,6593,6594,6595,6596,6597,
475 6598,6599,6600,6601,6602,6603,6604,6605,6606,6607,6608,6609,6610,6611,6612,6613,
476 6614,6615,6616,6617,6618,6619,6620,6621,6622,6623,6624,6625,6626,6627,6628,6629,
477 6630,6631,6632,6633,6634,6635,6636,6637,1388,6638,6639,6640,6641,6642,6643,6644,
478 1707,6645,6646,6647,6648,6649,6650,6651,6652,6653,6654,6655,6656,6657,6658,6659,
479 6660,6661,6662,6663,1708,6664,6665,6666,6667,6668,6669,6670,6671,6672,6673,6674,
480 1201,6675,6676,6677,6678,6679,6680,6681,6682,6683,6684,6685,6686,6687,6688,6689,
481 6690,6691,6692,6693,6694,6695,6696,6697,6698,6699,6700,6701,6702,6703,6704,6705,
482 6706,6707,6708,6709,6710,6711,6712,6713,6714,6715,6716,6717,6718,6719,6720,6721,
483 6722,6723,6724,6725,1389,6726,6727,6728,6729,6730,6731,6732,6733,6734,6735,6736,
484 1390,1709,6737,6738,6739,6740,6741,6742,1710,6743,6744,6745,6746,1391,6747,6748,
485 6749,6750,6751,6752,6753,6754,6755,6756,6757,1392,6758,6759,6760,6761,6762,6763,
486 6764,6765,6766,6767,6768,6769,6770,6771,6772,6773,6774,6775,6776,6777,6778,6779,
487 6780,1202,6781,6782,6783,6784,6785,6786,6787,6788,6789,6790,6791,6792,6793,6794,
488 6795,6796,6797,6798,6799,6800,6801,6802,6803,6804,6805,6806,6807,6808,6809,1711,
489 6810,6811,6812,6813,6814,6815,6816,6817,6818,6819,6820,6821,6822,6823,6824,6825,
490 6826,6827,6828,6829,6830,6831,6832,6833,6834,6835,6836,1393,6837,6838,6839,6840,
491 6841,6842,6843,6844,6845,6846,6847,6848,6849,6850,6851,6852,6853,6854,6855,6856,
492 6857,6858,6859,6860,6861,6862,6863,6864,6865,6866,6867,6868,6869,6870,6871,6872,
493 6873,6874,6875,6876,6877,6878,6879,6880,6881,6882,6883,6884,6885,6886,6887,6888,
494 6889,6890,6891,6892,6893,6894,6895,6896,6897,6898,6899,6900,6901,6902,1712,6903,
495 6904,6905,6906,6907,6908,6909,6910,1713,6911,6912,6913,6914,6915,6916,6917,6918,
496 6919,6920,6921,6922,6923,6924,6925,6926,6927,6928,6929,6930,6931,6932,6933,6934,
497 6935,6936,6937,6938,6939,6940,6941,6942,6943,6944,6945,6946,6947,6948,6949,6950,
498 6951,6952,6953,6954,6955,6956,6957,6958,6959,6960,6961,6962,6963,6964,6965,6966,
499 6967,6968,6969,6970,6971,6972,6973,6974,1714,6975,6976,6977,6978,6979,6980,6981,
500 6982,6983,6984,6985,6986,6987,6988,1394,6989,6990,6991,6992,6993,6994,6995,6996,
501 6997,6998,6999,7000,1715,7001,7002,7003,7004,7005,7006,7007,7008,7009,7010,7011,
502 7012,7013,7014,7015,7016,7017,7018,7019,7020,7021,7022,7023,7024,7025,7026,7027,
503 7028,1716,7029,7030,7031,7032,7033,7034,7035,7036,7037,7038,7039,7040,7041,7042,
504 7043,7044,7045,7046,7047,7048,7049,7050,7051,7052,7053,7054,7055,7056,7057,7058,
505 7059,7060,7061,7062,7063,7064,7065,7066,7067,7068,7069,7070,7071,7072,7073,7074,
506 7075,7076,7077,7078,7079,7080,7081,7082,7083,7084,7085,7086,7087,7088,7089,7090,
507 7091,7092,7093,7094,7095,7096,7097,7098,7099,7100,7101,7102,7103,7104,7105,7106,
508 7107,7108,7109,7110,7111,7112,7113,7114,7115,7116,7117,7118,7119,7120,7121,7122,
509 7123,7124,7125,7126,7127,7128,7129,7130,7131,7132,7133,7134,7135,7136,7137,7138,
510 7139,7140,7141,7142,7143,7144,7145,7146,7147,7148,7149,7150,7151,7152,7153,7154,
511 7155,7156,7157,7158,7159,7160,7161,7162,7163,7164,7165,7166,7167,7168,7169,7170,
512 7171,7172,7173,7174,7175,7176,7177,7178,7179,7180,7181,7182,7183,7184,7185,7186,
513 7187,7188,7189,7190,7191,7192,7193,7194,7195,7196,7197,7198,7199,7200,7201,7202,
514 7203,7204,7205,7206,7207,1395,7208,7209,7210,7211,7212,7213,1717,7214,7215,7216,
515 7217,7218,7219,7220,7221,7222,7223,7224,7225,7226,7227,7228,7229,7230,7231,7232,
516 7233,7234,7235,7236,7237,7238,7239,7240,7241,7242,7243,7244,7245,7246,7247,7248,
517 7249,7250,7251,7252,7253,7254,7255,7256,7257,7258,7259,7260,7261,7262,7263,7264,
518 7265,7266,7267,7268,7269,7270,7271,7272,7273,7274,7275,7276,7277,7278,7279,7280,
519 7281,7282,7283,7284,7285,7286,7287,7288,7289,7290,7291,7292,7293,7294,7295,7296,
520 7297,7298,7299,7300,7301,7302,7303,7304,7305,7306,7307,7308,7309,7310,7311,7312,
521 7313,1718,7314,7315,7316,7317,7318,7319,7320,7321,7322,7323,7324,7325,7326,7327,
522 7328,7329,7330,7331,7332,7333,7334,7335,7336,7337,7338,7339,7340,7341,7342,7343,
523 7344,7345,7346,7347,7348,7349,7350,7351,7352,7353,7354,7355,7356,7357,7358,7359,
524 7360,7361,7362,7363,7364,7365,7366,7367,7368,7369,7370,7371,7372,7373,7374,7375,
525 7376,7377,7378,7379,7380,7381,7382,7383,7384,7385,7386,7387,7388,7389,7390,7391,
526 7392,7393,7394,7395,7396,7397,7398,7399,7400,7401,7402,7403,7404,7405,7406,7407,
527 7408,7409,7410,7411,7412,7413,7414,7415,7416,7417,7418,7419,7420,7421,7422,7423,
528 7424,7425,7426,7427,7428,7429,7430,7431,7432,7433,7434,7435,7436,7437,7438,7439,
529 7440,7441,7442,7443,7444,7445,7446,7447,7448,7449,7450,7451,7452,7453,7454,7455,
530 7456,7457,7458,7459,7460,7461,7462,7463,7464,7465,7466,7467,7468,7469,7470,7471,
531 7472,7473,7474,7475,7476,7477,7478,7479,7480,7481,7482,7483,7484,7485,7486,7487,
532 7488,7489,7490,7491,7492,7493,7494,7495,7496,7497,7498,7499,7500,7501,7502,7503,
533 7504,7505,7506,7507,7508,7509,7510,7511,7512,7513,7514,7515,7516,7517,7518,7519,
534 7520,7521,7522,7523,7524,7525,7526,7527,7528,7529,7530,7531,7532,7533,7534,7535,
535 7536,7537,7538,7539,7540,7541,7542,7543,7544,7545,7546,7547,7548,7549,7550,7551,
536 7552,7553,7554,7555,7556,7557,7558,7559,7560,7561,7562,7563,7564,7565,7566,7567,
537 7568,7569,7570,7571,7572,7573,7574,7575,7576,7577,7578,7579,7580,7581,7582,7583,
538 7584,7585,7586,7587,7588,7589,7590,7591,7592,7593,7594,7595,7596,7597,7598,7599,
539 7600,7601,7602,7603,7604,7605,7606,7607,7608,7609,7610,7611,7612,7613,7614,7615,
540 7616,7617,7618,7619,7620,7621,7622,7623,7624,7625,7626,7627,7628,7629,7630,7631,
541 7632,7633,7634,7635,7636,7637,7638,7639,7640,7641,7642,7643,7644,7645,7646,7647,
542 7648,7649,7650,7651,7652,7653,7654,7655,7656,7657,7658,7659,7660,7661,7662,7663,
543 7664,7665,7666,7667,7668,7669,7670,7671,7672,7673,7674,7675,7676,7677,7678,7679,
544 7680,7681,7682,7683,7684,7685,7686,7687,7688,7689,7690,7691,7692,7693,7694,7695,
545 7696,7697,7698,7699,7700,7701,7702,7703,7704,7705,7706,7707,7708,7709,7710,7711,
546 7712,7713,7714,7715,7716,7717,7718,7719,7720,7721,7722,7723,7724,7725,7726,7727,
547 7728,7729,7730,7731,7732,7733,7734,7735,7736,7737,7738,7739,7740,7741,7742,7743,
548 7744,7745,7746,7747,7748,7749,7750,7751,7752,7753,7754,7755,7756,7757,7758,7759,
549 7760,7761,7762,7763,7764,7765,7766,7767,7768,7769,7770,7771,7772,7773,7774,7775,
550 7776,7777,7778,7779,7780,7781,7782,7783,7784,7785,7786,7787,7788,7789,7790,7791,
551 7792,7793,7794,7795,7796,7797,7798,7799,7800,7801,7802,7803,7804,7805,7806,7807,
552 7808,7809,7810,7811,7812,7813,7814,7815,7816,7817,7818,7819,7820,7821,7822,7823,
553 7824,7825,7826,7827,7828,7829,7830,7831,7832,7833,7834,7835,7836,7837,7838,7839,
554 7840,7841,7842,7843,7844,7845,7846,7847,7848,7849,7850,7851,7852,7853,7854,7855,
555 7856,7857,7858,7859,7860,7861,7862,7863,7864,7865,7866,7867,7868,7869,7870,7871,
556 7872,7873,7874,7875,7876,7877,7878,7879,7880,7881,7882,7883,7884,7885,7886,7887,
557 7888,7889,7890,7891,7892,7893,7894,7895,7896,7897,7898,7899,7900,7901,7902,7903,
558 7904,7905,7906,7907,7908,7909,7910,7911,7912,7913,7914,7915,7916,7917,7918,7919,
559 7920,7921,7922,7923,7924,7925,7926,7927,7928,7929,7930,7931,7932,7933,7934,7935,
560 7936,7937,7938,7939,7940,7941,7942,7943,7944,7945,7946,7947,7948,7949,7950,7951,
561 7952,7953,7954,7955,7956,7957,7958,7959,7960,7961,7962,7963,7964,7965,7966,7967,
562 7968,7969,7970,7971,7972,7973,7974,7975,7976,7977,7978,7979,7980,7981,7982,7983,
563 7984,7985,7986,7987,7988,7989,7990,7991,7992,7993,7994,7995,7996,7997,7998,7999,
564 8000,8001,8002,8003,8004,8005,8006,8007,8008,8009,8010,8011,8012,8013,8014,8015,
565 8016,8017,8018,8019,8020,8021,8022,8023,8024,8025,8026,8027,8028,8029,8030,8031,
566 8032,8033,8034,8035,8036,8037,8038,8039,8040,8041,8042,8043,8044,8045,8046,8047,
567 8048,8049,8050,8051,8052,8053,8054,8055,8056,8057,8058,8059,8060,8061,8062,8063,
568 8064,8065,8066,8067,8068,8069,8070,8071,8072,8073,8074,8075,8076,8077,8078,8079,
569 8080,8081,8082,8083,8084,8085,8086,8087,8088,8089,8090,8091,8092,8093,8094,8095,
570 8096,8097,8098,8099,8100,8101,8102,8103,8104,8105,8106,8107,8108,8109,8110,8111,
571 8112,8113,8114,8115,8116,8117,8118,8119,8120,8121,8122,8123,8124,8125,8126,8127,
572 8128,8129,8130,8131,8132,8133,8134,8135,8136,8137,8138,8139,8140,8141,8142,8143,
573 8144,8145,8146,8147,8148,8149,8150,8151,8152,8153,8154,8155,8156,8157,8158,8159,
574 8160,8161,8162,8163,8164,8165,8166,8167,8168,8169,8170,8171,8172,8173,8174,8175,
575 8176,8177,8178,8179,8180,8181,8182,8183,8184,8185,8186,8187,8188,8189,8190,8191,
576 8192,8193,8194,8195,8196,8197,8198,8199,8200,8201,8202,8203,8204,8205,8206,8207,
577 8208,8209,8210,8211,8212,8213,8214,8215,8216,8217,8218,8219,8220,8221,8222,8223,
578 8224,8225,8226,8227,8228,8229,8230,8231,8232,8233,8234,8235,8236,8237,8238,8239,
579 8240,8241,8242,8243,8244,8245,8246,8247,8248,8249,8250,8251,8252,8253,8254,8255,
580 8256,8257,8258,8259,8260,8261,8262,8263,8264,8265,8266,8267,8268,8269,8270,8271,
581 8272,8273,8274,8275,8276,8277,8278,8279,8280,8281,8282,8283,8284,8285,8286,8287,
582 8288,8289,8290,8291,8292,8293,8294,8295,8296,8297,8298,8299,8300,8301,8302,8303,
583 8304,8305,8306,8307,8308,8309,8310,8311,8312,8313,8314,8315,8316,8317,8318,8319,
584 8320,8321,8322,8323,8324,8325,8326,8327,8328,8329,8330,8331,8332,8333,8334,8335,
585 8336,8337,8338,8339,8340,8341,8342,8343,8344,8345,8346,8347,8348,8349,8350,8351,
586 8352,8353,8354,8355,8356,8357,8358,8359,8360,8361,8362,8363,8364,8365,8366,8367,
587 8368,8369,8370,8371,8372,8373,8374,8375,8376,8377,8378,8379,8380,8381,8382,8383,
588 8384,8385,8386,8387,8388,8389,8390,8391,8392,8393,8394,8395,8396,8397,8398,8399,
589 8400,8401,8402,8403,8404,8405,8406,8407,8408,8409,8410,8411,8412,8413,8414,8415,
590 8416,8417,8418,8419,8420,8421,8422,8423,8424,8425,8426,8427,8428,8429,8430,8431,
591 8432,8433,8434,8435,8436,8437,8438,8439,8440,8441,8442,8443,8444,8445,8446,8447,
592 8448,8449,8450,8451,8452,8453,8454,8455,8456,8457,8458,8459,8460,8461,8462,8463,
593 8464,8465,8466,8467,8468,8469,8470,8471,8472,8473,8474,8475,8476,8477,8478,8479,
594 8480,8481,8482,8483,8484,8485,8486,8487,8488,8489,8490,8491,8492,8493,8494,8495,
595 8496,8497,8498,8499,8500,8501,8502,8503,8504,8505,8506,8507,8508,8509,8510,8511,
596 8512,8513,8514,8515,8516,8517,8518,8519,8520,8521,8522,8523,8524,8525,8526,8527,
597 8528,8529,8530,8531,8532,8533,8534,8535,8536,8537,8538,8539,8540,8541,8542,8543,
598 8544,8545,8546,8547,8548,8549,8550,8551,8552,8553,8554,8555,8556,8557,8558,8559,
599 8560,8561,8562,8563,8564,8565,8566,8567,8568,8569,8570,8571,8572,8573,8574,8575,
600 8576,8577,8578,8579,8580,8581,8582,8583,8584,8585,8586,8587,8588,8589,8590,8591,
601 8592,8593,8594,8595,8596,8597,8598,8599,8600,8601,8602,8603,8604,8605,8606,8607,
602 8608,8609,8610,8611,8612,8613,8614,8615,8616,8617,8618,8619,8620,8621,8622,8623,
603 8624,8625,8626,8627,8628,8629,8630,8631,8632,8633,8634,8635,8636,8637,8638,8639,
604 8640,8641,8642,8643,8644,8645,8646,8647,8648,8649,8650,8651,8652,8653,8654,8655,
605 8656,8657,8658,8659,8660,8661,8662,8663,8664,8665,8666,8667,8668,8669,8670,8671,
606 8672,8673,8674,8675,8676,8677,8678,8679,8680,8681,8682,8683,8684,8685,8686,8687,
607 8688,8689,8690,8691,8692,8693,8694,8695,8696,8697,8698,8699,8700,8701,8702,8703,
608 8704,8705,8706,8707,8708,8709,8710,8711,8712,8713,8714,8715,8716,8717,8718,8719,
609 8720,8721,8722,8723,8724,8725,8726,8727,8728,8729,8730,8731,8732,8733,8734,8735,
610 8736,8737,8738,8739,8740,8741
611 ****************************************************************************************/
612 };
613
+0
-447
c/src/EUCTWFreq.tab less more
0 /* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
1 /* ***** BEGIN LICENSE BLOCK *****
2 * Version: MPL 1.1/GPL 2.0/LGPL 2.1
3 *
4 * The contents of this file are subject to the Mozilla Public License Version
5 * 1.1 (the "License"); you may not use this file except in compliance with
6 * the License. You may obtain a copy of the License at
7 * http://www.mozilla.org/MPL/
8 *
9 * Software distributed under the License is distributed on an "AS IS" basis,
10 * WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License
11 * for the specific language governing rights and limitations under the
12 * License.
13 *
14 * The Original Code is Mozilla Communicator client code.
15 *
16 * The Initial Developer of the Original Code is
17 * Netscape Communications Corporation.
18 * Portions created by the Initial Developer are Copyright (C) 1998
19 * the Initial Developer. All Rights Reserved.
20 *
21 * Contributor(s):
22 *
23 * Alternatively, the contents of this file may be used under the terms of
24 * either the GNU General Public License Version 2 or later (the "GPL"), or
25 * the GNU Lesser General Public License Version 2.1 or later (the "LGPL"),
26 * in which case the provisions of the GPL or the LGPL are applicable instead
27 * of those above. If you wish to allow use of your version of this file only
28 * under the terms of either the GPL or the LGPL, and not to allow others to
29 * use your version of this file under the terms of the MPL, indicate your
30 * decision by deleting the provisions above and replace them with the notice
31 * and other provisions required by the GPL or the LGPL. If you do not delete
32 * the provisions above, a recipient may use your version of this file under
33 * the terms of any one of the MPL, the GPL or the LGPL.
34 *
35 * ***** END LICENSE BLOCK ***** */
36
37 // EUCTW frequency table
38 // Converted from big5 work
39 // by Taiwan's Mandarin Promotion Council
40 // <http://www.edu.tw:81/mandr/>
41
42
43 /******************************************************************************
44 * 128 --> 0.42261
45 * 256 --> 0.57851
46 * 512 --> 0.74851
47 * 1024 --> 0.89384
48 * 2048 --> 0.97583
49 *
50 * Idea Distribution Ratio = 0.74851/(1-0.74851) =2.98
51 * Random Distribution Ration = 512/(5401-512)=0.105
52 *
53 * Typical Distribution Ratio about 25% of Ideal one, still much higher than RDR
54 *****************************************************************************/
55
56 #define EUCTW_TYPICAL_DISTRIBUTION_RATIO (float)0.75
57
58 //Char to FreqOrder table ,
59 #define EUCTW_TABLE_SIZE 8102
60
61 static const PRInt16 EUCTWCharToFreqOrder[] =
62 {
63 1,1800,1506, 255,1431, 198, 9, 82, 6,7310, 177, 202,3615,1256,2808, 110, // 2742
64 3735, 33,3241, 261, 76, 44,2113, 16,2931,2184,1176, 659,3868, 26,3404,2643, // 2758
65 1198,3869,3313,4060, 410,2211, 302, 590, 361,1963, 8, 204, 58,4296,7311,1931, // 2774
66 63,7312,7313, 317,1614, 75, 222, 159,4061,2412,1480,7314,3500,3068, 224,2809, // 2790
67 3616, 3, 10,3870,1471, 29,2774,1135,2852,1939, 873, 130,3242,1123, 312,7315, // 2806
68 4297,2051, 507, 252, 682,7316, 142,1914, 124, 206,2932, 34,3501,3173, 64, 604, // 2822
69 7317,2494,1976,1977, 155,1990, 645, 641,1606,7318,3405, 337, 72, 406,7319, 80, // 2838
70 630, 238,3174,1509, 263, 939,1092,2644, 756,1440,1094,3406, 449, 69,2969, 591, // 2854
71 179,2095, 471, 115,2034,1843, 60, 50,2970, 134, 806,1868, 734,2035,3407, 180, // 2870
72 995,1607, 156, 537,2893, 688,7320, 319,1305, 779,2144, 514,2374, 298,4298, 359, // 2886
73 2495, 90,2707,1338, 663, 11, 906,1099,2545, 20,2436, 182, 532,1716,7321, 732, // 2902
74 1376,4062,1311,1420,3175, 25,2312,1056, 113, 399, 382,1949, 242,3408,2467, 529, // 2918
75 3243, 475,1447,3617,7322, 117, 21, 656, 810,1297,2295,2329,3502,7323, 126,4063, // 2934
76 706, 456, 150, 613,4299, 71,1118,2036,4064, 145,3069, 85, 835, 486,2114,1246, // 2950
77 1426, 428, 727,1285,1015, 800, 106, 623, 303,1281,7324,2127,2354, 347,3736, 221, // 2966
78 3503,3110,7325,1955,1153,4065, 83, 296,1199,3070, 192, 624, 93,7326, 822,1897, // 2982
79 2810,3111, 795,2064, 991,1554,1542,1592, 27, 43,2853, 859, 139,1456, 860,4300, // 2998
80 437, 712,3871, 164,2392,3112, 695, 211,3017,2096, 195,3872,1608,3504,3505,3618, // 3014
81 3873, 234, 811,2971,2097,3874,2229,1441,3506,1615,2375, 668,2076,1638, 305, 228, // 3030
82 1664,4301, 467, 415,7327, 262,2098,1593, 239, 108, 300, 200,1033, 512,1247,2077, // 3046
83 7328,7329,2173,3176,3619,2673, 593, 845,1062,3244, 88,1723,2037,3875,1950, 212, // 3062
84 266, 152, 149, 468,1898,4066,4302, 77, 187,7330,3018, 37, 5,2972,7331,3876, // 3078
85 7332,7333, 39,2517,4303,2894,3177,2078, 55, 148, 74,4304, 545, 483,1474,1029, // 3094
86 1665, 217,1869,1531,3113,1104,2645,4067, 24, 172,3507, 900,3877,3508,3509,4305, // 3110
87 32,1408,2811,1312, 329, 487,2355,2247,2708, 784,2674, 4,3019,3314,1427,1788, // 3126
88 188, 109, 499,7334,3620,1717,1789, 888,1217,3020,4306,7335,3510,7336,3315,1520, // 3142
89 3621,3878, 196,1034, 775,7337,7338, 929,1815, 249, 439, 38,7339,1063,7340, 794, // 3158
90 3879,1435,2296, 46, 178,3245,2065,7341,2376,7342, 214,1709,4307, 804, 35, 707, // 3174
91 324,3622,1601,2546, 140, 459,4068,7343,7344,1365, 839, 272, 978,2257,2572,3409, // 3190
92 2128,1363,3623,1423, 697, 100,3071, 48, 70,1231, 495,3114,2193,7345,1294,7346, // 3206
93 2079, 462, 586,1042,3246, 853, 256, 988, 185,2377,3410,1698, 434,1084,7347,3411, // 3222
94 314,2615,2775,4308,2330,2331, 569,2280, 637,1816,2518, 757,1162,1878,1616,3412, // 3238
95 287,1577,2115, 768,4309,1671,2854,3511,2519,1321,3737, 909,2413,7348,4069, 933, // 3254
96 3738,7349,2052,2356,1222,4310, 765,2414,1322, 786,4311,7350,1919,1462,1677,2895, // 3270
97 1699,7351,4312,1424,2437,3115,3624,2590,3316,1774,1940,3413,3880,4070, 309,1369, // 3286
98 1130,2812, 364,2230,1653,1299,3881,3512,3882,3883,2646, 525,1085,3021, 902,2000, // 3302
99 1475, 964,4313, 421,1844,1415,1057,2281, 940,1364,3116, 376,4314,4315,1381, 7, // 3318
100 2520, 983,2378, 336,1710,2675,1845, 321,3414, 559,1131,3022,2742,1808,1132,1313, // 3334
101 265,1481,1857,7352, 352,1203,2813,3247, 167,1089, 420,2814, 776, 792,1724,3513, // 3350
102 4071,2438,3248,7353,4072,7354, 446, 229, 333,2743, 901,3739,1200,1557,4316,2647, // 3366
103 1920, 395,2744,2676,3740,4073,1835, 125, 916,3178,2616,4317,7355,7356,3741,7357, // 3382
104 7358,7359,4318,3117,3625,1133,2547,1757,3415,1510,2313,1409,3514,7360,2145, 438, // 3398
105 2591,2896,2379,3317,1068, 958,3023, 461, 311,2855,2677,4074,1915,3179,4075,1978, // 3414
106 383, 750,2745,2617,4076, 274, 539, 385,1278,1442,7361,1154,1964, 384, 561, 210, // 3430
107 98,1295,2548,3515,7362,1711,2415,1482,3416,3884,2897,1257, 129,7363,3742, 642, // 3446
108 523,2776,2777,2648,7364, 141,2231,1333, 68, 176, 441, 876, 907,4077, 603,2592, // 3462
109 710, 171,3417, 404, 549, 18,3118,2393,1410,3626,1666,7365,3516,4319,2898,4320, // 3478
110 7366,2973, 368,7367, 146, 366, 99, 871,3627,1543, 748, 807,1586,1185, 22,2258, // 3494
111 379,3743,3180,7368,3181, 505,1941,2618,1991,1382,2314,7369, 380,2357, 218, 702, // 3510
112 1817,1248,3418,3024,3517,3318,3249,7370,2974,3628, 930,3250,3744,7371, 59,7372, // 3526
113 585, 601,4078, 497,3419,1112,1314,4321,1801,7373,1223,1472,2174,7374, 749,1836, // 3542
114 690,1899,3745,1772,3885,1476, 429,1043,1790,2232,2116, 917,4079, 447,1086,1629, // 3558
115 7375, 556,7376,7377,2020,1654, 844,1090, 105, 550, 966,1758,2815,1008,1782, 686, // 3574
116 1095,7378,2282, 793,1602,7379,3518,2593,4322,4080,2933,2297,4323,3746, 980,2496, // 3590
117 544, 353, 527,4324, 908,2678,2899,7380, 381,2619,1942,1348,7381,1341,1252, 560, // 3606
118 3072,7382,3420,2856,7383,2053, 973, 886,2080, 143,4325,7384,7385, 157,3886, 496, // 3622
119 4081, 57, 840, 540,2038,4326,4327,3421,2117,1445, 970,2259,1748,1965,2081,4082, // 3638
120 3119,1234,1775,3251,2816,3629, 773,1206,2129,1066,2039,1326,3887,1738,1725,4083, // 3654
121 279,3120, 51,1544,2594, 423,1578,2130,2066, 173,4328,1879,7386,7387,1583, 264, // 3670
122 610,3630,4329,2439, 280, 154,7388,7389,7390,1739, 338,1282,3073, 693,2857,1411, // 3686
123 1074,3747,2440,7391,4330,7392,7393,1240, 952,2394,7394,2900,1538,2679, 685,1483, // 3702
124 4084,2468,1436, 953,4085,2054,4331, 671,2395, 79,4086,2441,3252, 608, 567,2680, // 3718
125 3422,4087,4088,1691, 393,1261,1791,2396,7395,4332,7396,7397,7398,7399,1383,1672, // 3734
126 3748,3182,1464, 522,1119, 661,1150, 216, 675,4333,3888,1432,3519, 609,4334,2681, // 3750
127 2397,7400,7401,7402,4089,3025, 0,7403,2469, 315, 231,2442, 301,3319,4335,2380, // 3766
128 7404, 233,4090,3631,1818,4336,4337,7405, 96,1776,1315,2082,7406, 257,7407,1809, // 3782
129 3632,2709,1139,1819,4091,2021,1124,2163,2778,1777,2649,7408,3074, 363,1655,3183, // 3798
130 7409,2975,7410,7411,7412,3889,1567,3890, 718, 103,3184, 849,1443, 341,3320,2934, // 3814
131 1484,7413,1712, 127, 67, 339,4092,2398, 679,1412, 821,7414,7415, 834, 738, 351, // 3830
132 2976,2146, 846, 235,1497,1880, 418,1992,3749,2710, 186,1100,2147,2746,3520,1545, // 3846
133 1355,2935,2858,1377, 583,3891,4093,2573,2977,7416,1298,3633,1078,2549,3634,2358, // 3862
134 78,3750,3751, 267,1289,2099,2001,1594,4094, 348, 369,1274,2194,2175,1837,4338, // 3878
135 1820,2817,3635,2747,2283,2002,4339,2936,2748, 144,3321, 882,4340,3892,2749,3423, // 3894
136 4341,2901,7417,4095,1726, 320,7418,3893,3026, 788,2978,7419,2818,1773,1327,2859, // 3910
137 3894,2819,7420,1306,4342,2003,1700,3752,3521,2359,2650, 787,2022, 506, 824,3636, // 3926
138 534, 323,4343,1044,3322,2023,1900, 946,3424,7421,1778,1500,1678,7422,1881,4344, // 3942
139 165, 243,4345,3637,2521, 123, 683,4096, 764,4346, 36,3895,1792, 589,2902, 816, // 3958
140 626,1667,3027,2233,1639,1555,1622,3753,3896,7423,3897,2860,1370,1228,1932, 891, // 3974
141 2083,2903, 304,4097,7424, 292,2979,2711,3522, 691,2100,4098,1115,4347, 118, 662, // 3990
142 7425, 611,1156, 854,2381,1316,2861, 2, 386, 515,2904,7426,7427,3253, 868,2234, // 4006
143 1486, 855,2651, 785,2212,3028,7428,1040,3185,3523,7429,3121, 448,7430,1525,7431, // 4022
144 2164,4348,7432,3754,7433,4099,2820,3524,3122, 503, 818,3898,3123,1568, 814, 676, // 4038
145 1444, 306,1749,7434,3755,1416,1030, 197,1428, 805,2821,1501,4349,7435,7436,7437, // 4054
146 1993,7438,4350,7439,7440,2195, 13,2779,3638,2980,3124,1229,1916,7441,3756,2131, // 4070
147 7442,4100,4351,2399,3525,7443,2213,1511,1727,1120,7444,7445, 646,3757,2443, 307, // 4086
148 7446,7447,1595,3186,7448,7449,7450,3639,1113,1356,3899,1465,2522,2523,7451, 519, // 4102
149 7452, 128,2132, 92,2284,1979,7453,3900,1512, 342,3125,2196,7454,2780,2214,1980, // 4118
150 3323,7455, 290,1656,1317, 789, 827,2360,7456,3758,4352, 562, 581,3901,7457, 401, // 4134
151 4353,2248, 94,4354,1399,2781,7458,1463,2024,4355,3187,1943,7459, 828,1105,4101, // 4150
152 1262,1394,7460,4102, 605,4356,7461,1783,2862,7462,2822, 819,2101, 578,2197,2937, // 4166
153 7463,1502, 436,3254,4103,3255,2823,3902,2905,3425,3426,7464,2712,2315,7465,7466, // 4182
154 2332,2067, 23,4357, 193, 826,3759,2102, 699,1630,4104,3075, 390,1793,1064,3526, // 4198
155 7467,1579,3076,3077,1400,7468,4105,1838,1640,2863,7469,4358,4359, 137,4106, 598, // 4214
156 3078,1966, 780, 104, 974,2938,7470, 278, 899, 253, 402, 572, 504, 493,1339,7471, // 4230
157 3903,1275,4360,2574,2550,7472,3640,3029,3079,2249, 565,1334,2713, 863, 41,7473, // 4246
158 7474,4361,7475,1657,2333, 19, 463,2750,4107, 606,7476,2981,3256,1087,2084,1323, // 4262
159 2652,2982,7477,1631,1623,1750,4108,2682,7478,2864, 791,2714,2653,2334, 232,2416, // 4278
160 7479,2983,1498,7480,2654,2620, 755,1366,3641,3257,3126,2025,1609, 119,1917,3427, // 4294
161 862,1026,4109,7481,3904,3760,4362,3905,4363,2260,1951,2470,7482,1125, 817,4110, // 4310
162 4111,3906,1513,1766,2040,1487,4112,3030,3258,2824,3761,3127,7483,7484,1507,7485, // 4326
163 2683, 733, 40,1632,1106,2865, 345,4113, 841,2524, 230,4364,2984,1846,3259,3428, // 4342
164 7486,1263, 986,3429,7487, 735, 879, 254,1137, 857, 622,1300,1180,1388,1562,3907, // 4358
165 3908,2939, 967,2751,2655,1349, 592,2133,1692,3324,2985,1994,4114,1679,3909,1901, // 4374
166 2185,7488, 739,3642,2715,1296,1290,7489,4115,2198,2199,1921,1563,2595,2551,1870, // 4390
167 2752,2986,7490, 435,7491, 343,1108, 596, 17,1751,4365,2235,3430,3643,7492,4366, // 4406
168 294,3527,2940,1693, 477, 979, 281,2041,3528, 643,2042,3644,2621,2782,2261,1031, // 4422
169 2335,2134,2298,3529,4367, 367,1249,2552,7493,3530,7494,4368,1283,3325,2004, 240, // 4438
170 1762,3326,4369,4370, 836,1069,3128, 474,7495,2148,2525, 268,3531,7496,3188,1521, // 4454
171 1284,7497,1658,1546,4116,7498,3532,3533,7499,4117,3327,2684,1685,4118, 961,1673, // 4470
172 2622, 190,2005,2200,3762,4371,4372,7500, 570,2497,3645,1490,7501,4373,2623,3260, // 4486
173 1956,4374, 584,1514, 396,1045,1944,7502,4375,1967,2444,7503,7504,4376,3910, 619, // 4502
174 7505,3129,3261, 215,2006,2783,2553,3189,4377,3190,4378, 763,4119,3763,4379,7506, // 4518
175 7507,1957,1767,2941,3328,3646,1174, 452,1477,4380,3329,3130,7508,2825,1253,2382, // 4534
176 2186,1091,2285,4120, 492,7509, 638,1169,1824,2135,1752,3911, 648, 926,1021,1324, // 4550
177 4381, 520,4382, 997, 847,1007, 892,4383,3764,2262,1871,3647,7510,2400,1784,4384, // 4566
178 1952,2942,3080,3191,1728,4121,2043,3648,4385,2007,1701,3131,1551, 30,2263,4122, // 4582
179 7511,2026,4386,3534,7512, 501,7513,4123, 594,3431,2165,1821,3535,3432,3536,3192, // 4598
180 829,2826,4124,7514,1680,3132,1225,4125,7515,3262,4387,4126,3133,2336,7516,4388, // 4614
181 4127,7517,3912,3913,7518,1847,2383,2596,3330,7519,4389, 374,3914, 652,4128,4129, // 4630
182 375,1140, 798,7520,7521,7522,2361,4390,2264, 546,1659, 138,3031,2445,4391,7523, // 4646
183 2250, 612,1848, 910, 796,3765,1740,1371, 825,3766,3767,7524,2906,2554,7525, 692, // 4662
184 444,3032,2624, 801,4392,4130,7526,1491, 244,1053,3033,4131,4132, 340,7527,3915, // 4678
185 1041,2987, 293,1168, 87,1357,7528,1539, 959,7529,2236, 721, 694,4133,3768, 219, // 4694
186 1478, 644,1417,3331,2656,1413,1401,1335,1389,3916,7530,7531,2988,2362,3134,1825, // 4710
187 730,1515, 184,2827, 66,4393,7532,1660,2943, 246,3332, 378,1457, 226,3433, 975, // 4726
188 3917,2944,1264,3537, 674, 696,7533, 163,7534,1141,2417,2166, 713,3538,3333,4394, // 4742
189 3918,7535,7536,1186, 15,7537,1079,1070,7538,1522,3193,3539, 276,1050,2716, 758, // 4758
190 1126, 653,2945,3263,7539,2337, 889,3540,3919,3081,2989, 903,1250,4395,3920,3434, // 4774
191 3541,1342,1681,1718, 766,3264, 286, 89,2946,3649,7540,1713,7541,2597,3334,2990, // 4790
192 7542,2947,2215,3194,2866,7543,4396,2498,2526, 181, 387,1075,3921, 731,2187,3335, // 4806
193 7544,3265, 310, 313,3435,2299, 770,4134, 54,3034, 189,4397,3082,3769,3922,7545, // 4822
194 1230,1617,1849, 355,3542,4135,4398,3336, 111,4136,3650,1350,3135,3436,3035,4137, // 4838
195 2149,3266,3543,7546,2784,3923,3924,2991, 722,2008,7547,1071, 247,1207,2338,2471, // 4854
196 1378,4399,2009, 864,1437,1214,4400, 373,3770,1142,2216, 667,4401, 442,2753,2555, // 4870
197 3771,3925,1968,4138,3267,1839, 837, 170,1107, 934,1336,1882,7548,7549,2118,4139, // 4886
198 2828, 743,1569,7550,4402,4140, 582,2384,1418,3437,7551,1802,7552, 357,1395,1729, // 4902
199 3651,3268,2418,1564,2237,7553,3083,3772,1633,4403,1114,2085,4141,1532,7554, 482, // 4918
200 2446,4404,7555,7556,1492, 833,1466,7557,2717,3544,1641,2829,7558,1526,1272,3652, // 4934
201 4142,1686,1794, 416,2556,1902,1953,1803,7559,3773,2785,3774,1159,2316,7560,2867, // 4950
202 4405,1610,1584,3036,2419,2754, 443,3269,1163,3136,7561,7562,3926,7563,4143,2499, // 4966
203 3037,4406,3927,3137,2103,1647,3545,2010,1872,4144,7564,4145, 431,3438,7565, 250, // 4982
204 97, 81,4146,7566,1648,1850,1558, 160, 848,7567, 866, 740,1694,7568,2201,2830, // 4998
205 3195,4147,4407,3653,1687, 950,2472, 426, 469,3196,3654,3655,3928,7569,7570,1188, // 5014
206 424,1995, 861,3546,4148,3775,2202,2685, 168,1235,3547,4149,7571,2086,1674,4408, // 5030
207 3337,3270, 220,2557,1009,7572,3776, 670,2992, 332,1208, 717,7573,7574,3548,2447, // 5046
208 3929,3338,7575, 513,7576,1209,2868,3339,3138,4409,1080,7577,7578,7579,7580,2527, // 5062
209 3656,3549, 815,1587,3930,3931,7581,3550,3439,3777,1254,4410,1328,3038,1390,3932, // 5078
210 1741,3933,3778,3934,7582, 236,3779,2448,3271,7583,7584,3657,3780,1273,3781,4411, // 5094
211 7585, 308,7586,4412, 245,4413,1851,2473,1307,2575, 430, 715,2136,2449,7587, 270, // 5110
212 199,2869,3935,7588,3551,2718,1753, 761,1754, 725,1661,1840,4414,3440,3658,7589, // 5126
213 7590, 587, 14,3272, 227,2598, 326, 480,2265, 943,2755,3552, 291, 650,1883,7591, // 5142
214 1702,1226, 102,1547, 62,3441, 904,4415,3442,1164,4150,7592,7593,1224,1548,2756, // 5158
215 391, 498,1493,7594,1386,1419,7595,2055,1177,4416, 813, 880,1081,2363, 566,1145, // 5174
216 4417,2286,1001,1035,2558,2599,2238, 394,1286,7596,7597,2068,7598, 86,1494,1730, // 5190
217 3936, 491,1588, 745, 897,2948, 843,3340,3937,2757,2870,3273,1768, 998,2217,2069, // 5206
218 397,1826,1195,1969,3659,2993,3341, 284,7599,3782,2500,2137,2119,1903,7600,3938, // 5222
219 2150,3939,4151,1036,3443,1904, 114,2559,4152, 209,1527,7601,7602,2949,2831,2625, // 5238
220 2385,2719,3139, 812,2560,7603,3274,7604,1559, 737,1884,3660,1210, 885, 28,2686, // 5254
221 3553,3783,7605,4153,1004,1779,4418,7606, 346,1981,2218,2687,4419,3784,1742, 797, // 5270
222 1642,3940,1933,1072,1384,2151, 896,3941,3275,3661,3197,2871,3554,7607,2561,1958, // 5286
223 4420,2450,1785,7608,7609,7610,3942,4154,1005,1308,3662,4155,2720,4421,4422,1528, // 5302
224 2600, 161,1178,4156,1982, 987,4423,1101,4157, 631,3943,1157,3198,2420,1343,1241, // 5318
225 1016,2239,2562, 372, 877,2339,2501,1160, 555,1934, 911,3944,7611, 466,1170, 169, // 5334
226 1051,2907,2688,3663,2474,2994,1182,2011,2563,1251,2626,7612, 992,2340,3444,1540, // 5350
227 2721,1201,2070,2401,1996,2475,7613,4424, 528,1922,2188,1503,1873,1570,2364,3342, // 5366
228 3276,7614, 557,1073,7615,1827,3445,2087,2266,3140,3039,3084, 767,3085,2786,4425, // 5382
229 1006,4158,4426,2341,1267,2176,3664,3199, 778,3945,3200,2722,1597,2657,7616,4427, // 5398
230 7617,3446,7618,7619,7620,3277,2689,1433,3278, 131, 95,1504,3946, 723,4159,3141, // 5414
231 1841,3555,2758,2189,3947,2027,2104,3665,7621,2995,3948,1218,7622,3343,3201,3949, // 5430
232 4160,2576, 248,1634,3785, 912,7623,2832,3666,3040,3786, 654, 53,7624,2996,7625, // 5446
233 1688,4428, 777,3447,1032,3950,1425,7626, 191, 820,2120,2833, 971,4429, 931,3202, // 5462
234 135, 664, 783,3787,1997, 772,2908,1935,3951,3788,4430,2909,3203, 282,2723, 640, // 5478
235 1372,3448,1127, 922, 325,3344,7627,7628, 711,2044,7629,7630,3952,2219,2787,1936, // 5494
236 3953,3345,2220,2251,3789,2300,7631,4431,3790,1258,3279,3954,3204,2138,2950,3955, // 5510
237 3956,7632,2221, 258,3205,4432, 101,1227,7633,3280,1755,7634,1391,3281,7635,2910, // 5526
238 2056, 893,7636,7637,7638,1402,4161,2342,7639,7640,3206,3556,7641,7642, 878,1325, // 5542
239 1780,2788,4433, 259,1385,2577, 744,1183,2267,4434,7643,3957,2502,7644, 684,1024, // 5558
240 4162,7645, 472,3557,3449,1165,3282,3958,3959, 322,2152, 881, 455,1695,1152,1340, // 5574
241 660, 554,2153,4435,1058,4436,4163, 830,1065,3346,3960,4437,1923,7646,1703,1918, // 5590
242 7647, 932,2268, 122,7648,4438, 947, 677,7649,3791,2627, 297,1905,1924,2269,4439, // 5606
243 2317,3283,7650,7651,4164,7652,4165, 84,4166, 112, 989,7653, 547,1059,3961, 701, // 5622
244 3558,1019,7654,4167,7655,3450, 942, 639, 457,2301,2451, 993,2951, 407, 851, 494, // 5638
245 4440,3347, 927,7656,1237,7657,2421,3348, 573,4168, 680, 921,2911,1279,1874, 285, // 5654
246 790,1448,1983, 719,2167,7658,7659,4441,3962,3963,1649,7660,1541, 563,7661,1077, // 5670
247 7662,3349,3041,3451, 511,2997,3964,3965,3667,3966,1268,2564,3350,3207,4442,4443, // 5686
248 7663, 535,1048,1276,1189,2912,2028,3142,1438,1373,2834,2952,1134,2012,7664,4169, // 5702
249 1238,2578,3086,1259,7665, 700,7666,2953,3143,3668,4170,7667,4171,1146,1875,1906, // 5718
250 4444,2601,3967, 781,2422, 132,1589, 203, 147, 273,2789,2402, 898,1786,2154,3968, // 5734
251 3969,7668,3792,2790,7669,7670,4445,4446,7671,3208,7672,1635,3793, 965,7673,1804, // 5750
252 2690,1516,3559,1121,1082,1329,3284,3970,1449,3794, 65,1128,2835,2913,2759,1590, // 5766
253 3795,7674,7675, 12,2658, 45, 976,2579,3144,4447, 517,2528,1013,1037,3209,7676, // 5782
254 3796,2836,7677,3797,7678,3452,7679,2602, 614,1998,2318,3798,3087,2724,2628,7680, // 5798
255 2580,4172, 599,1269,7681,1810,3669,7682,2691,3088, 759,1060, 489,1805,3351,3285, // 5814
256 1358,7683,7684,2386,1387,1215,2629,2252, 490,7685,7686,4173,1759,2387,2343,7687, // 5830
257 4448,3799,1907,3971,2630,1806,3210,4449,3453,3286,2760,2344, 874,7688,7689,3454, // 5846
258 3670,1858, 91,2914,3671,3042,3800,4450,7690,3145,3972,2659,7691,3455,1202,1403, // 5862
259 3801,2954,2529,1517,2503,4451,3456,2504,7692,4452,7693,2692,1885,1495,1731,3973, // 5878
260 2365,4453,7694,2029,7695,7696,3974,2693,1216, 237,2581,4174,2319,3975,3802,4454, // 5894
261 4455,2694,3560,3457, 445,4456,7697,7698,7699,7700,2761, 61,3976,3672,1822,3977, // 5910
262 7701, 687,2045, 935, 925, 405,2660, 703,1096,1859,2725,4457,3978,1876,1367,2695, // 5926
263 3352, 918,2105,1781,2476, 334,3287,1611,1093,4458, 564,3146,3458,3673,3353, 945, // 5942
264 2631,2057,4459,7702,1925, 872,4175,7703,3459,2696,3089, 349,4176,3674,3979,4460, // 5958
265 3803,4177,3675,2155,3980,4461,4462,4178,4463,2403,2046, 782,3981, 400, 251,4179, // 5974
266 1624,7704,7705, 277,3676, 299,1265, 476,1191,3804,2121,4180,4181,1109, 205,7706, // 5990
267 2582,1000,2156,3561,1860,7707,7708,7709,4464,7710,4465,2565, 107,2477,2157,3982, // 6006
268 3460,3147,7711,1533, 541,1301, 158, 753,4182,2872,3562,7712,1696, 370,1088,4183, // 6022
269 4466,3563, 579, 327, 440, 162,2240, 269,1937,1374,3461, 968,3043, 56,1396,3090, // 6038
270 2106,3288,3354,7713,1926,2158,4467,2998,7714,3564,7715,7716,3677,4468,2478,7717, // 6054
271 2791,7718,1650,4469,7719,2603,7720,7721,3983,2661,3355,1149,3356,3984,3805,3985, // 6070
272 7722,1076, 49,7723, 951,3211,3289,3290, 450,2837, 920,7724,1811,2792,2366,4184, // 6086
273 1908,1138,2367,3806,3462,7725,3212,4470,1909,1147,1518,2423,4471,3807,7726,4472, // 6102
274 2388,2604, 260,1795,3213,7727,7728,3808,3291, 708,7729,3565,1704,7730,3566,1351, // 6118
275 1618,3357,2999,1886, 944,4185,3358,4186,3044,3359,4187,7731,3678, 422, 413,1714, // 6134
276 3292, 500,2058,2345,4188,2479,7732,1344,1910, 954,7733,1668,7734,7735,3986,2404, // 6150
277 4189,3567,3809,4190,7736,2302,1318,2505,3091, 133,3092,2873,4473, 629, 31,2838, // 6166
278 2697,3810,4474, 850, 949,4475,3987,2955,1732,2088,4191,1496,1852,7737,3988, 620, // 6182
279 3214, 981,1242,3679,3360,1619,3680,1643,3293,2139,2452,1970,1719,3463,2168,7738, // 6198
280 3215,7739,7740,3361,1828,7741,1277,4476,1565,2047,7742,1636,3568,3093,7743, 869, // 6214
281 2839, 655,3811,3812,3094,3989,3000,3813,1310,3569,4477,7744,7745,7746,1733, 558, // 6230
282 4478,3681, 335,1549,3045,1756,4192,3682,1945,3464,1829,1291,1192, 470,2726,2107, // 6246
283 2793, 913,1054,3990,7747,1027,7748,3046,3991,4479, 982,2662,3362,3148,3465,3216, // 6262
284 3217,1946,2794,7749, 571,4480,7750,1830,7751,3570,2583,1523,2424,7752,2089, 984, // 6278
285 4481,3683,1959,7753,3684, 852, 923,2795,3466,3685, 969,1519, 999,2048,2320,1705, // 6294
286 7754,3095, 615,1662, 151, 597,3992,2405,2321,1049, 275,4482,3686,4193, 568,3687, // 6310
287 3571,2480,4194,3688,7755,2425,2270, 409,3218,7756,1566,2874,3467,1002, 769,2840, // 6326
288 194,2090,3149,3689,2222,3294,4195, 628,1505,7757,7758,1763,2177,3001,3993, 521, // 6342
289 1161,2584,1787,2203,2406,4483,3994,1625,4196,4197, 412, 42,3096, 464,7759,2632, // 6358
290 4484,3363,1760,1571,2875,3468,2530,1219,2204,3814,2633,2140,2368,4485,4486,3295, // 6374
291 1651,3364,3572,7760,7761,3573,2481,3469,7762,3690,7763,7764,2271,2091, 460,7765, // 6390
292 4487,7766,3002, 962, 588,3574, 289,3219,2634,1116, 52,7767,3047,1796,7768,7769, // 6406
293 7770,1467,7771,1598,1143,3691,4198,1984,1734,1067,4488,1280,3365, 465,4489,1572, // 6422
294 510,7772,1927,2241,1812,1644,3575,7773,4490,3692,7774,7775,2663,1573,1534,7776, // 6438
295 7777,4199, 536,1807,1761,3470,3815,3150,2635,7778,7779,7780,4491,3471,2915,1911, // 6454
296 2796,7781,3296,1122, 377,3220,7782, 360,7783,7784,4200,1529, 551,7785,2059,3693, // 6470
297 1769,2426,7786,2916,4201,3297,3097,2322,2108,2030,4492,1404, 136,1468,1479, 672, // 6486
298 1171,3221,2303, 271,3151,7787,2762,7788,2049, 678,2727, 865,1947,4493,7789,2013, // 6502
299 3995,2956,7790,2728,2223,1397,3048,3694,4494,4495,1735,2917,3366,3576,7791,3816, // 6518
300 509,2841,2453,2876,3817,7792,7793,3152,3153,4496,4202,2531,4497,2304,1166,1010, // 6534
301 552, 681,1887,7794,7795,2957,2958,3996,1287,1596,1861,3154, 358, 453, 736, 175, // 6550
302 478,1117, 905,1167,1097,7796,1853,1530,7797,1706,7798,2178,3472,2287,3695,3473, // 6566
303 3577,4203,2092,4204,7799,3367,1193,2482,4205,1458,2190,2205,1862,1888,1421,3298, // 6582
304 2918,3049,2179,3474, 595,2122,7800,3997,7801,7802,4206,1707,2636, 223,3696,1359, // 6598
305 751,3098, 183,3475,7803,2797,3003, 419,2369, 633, 704,3818,2389, 241,7804,7805, // 6614
306 7806, 838,3004,3697,2272,2763,2454,3819,1938,2050,3998,1309,3099,2242,1181,7807, // 6630
307 1136,2206,3820,2370,1446,4207,2305,4498,7808,7809,4208,1055,2605, 484,3698,7810, // 6646
308 3999, 625,4209,2273,3368,1499,4210,4000,7811,4001,4211,3222,2274,2275,3476,7812, // 6662
309 7813,2764, 808,2606,3699,3369,4002,4212,3100,2532, 526,3370,3821,4213, 955,7814, // 6678
310 1620,4214,2637,2427,7815,1429,3700,1669,1831, 994, 928,7816,3578,1260,7817,7818, // 6694
311 7819,1948,2288, 741,2919,1626,4215,2729,2455, 867,1184, 362,3371,1392,7820,7821, // 6710
312 4003,4216,1770,1736,3223,2920,4499,4500,1928,2698,1459,1158,7822,3050,3372,2877, // 6726
313 1292,1929,2506,2842,3701,1985,1187,2071,2014,2607,4217,7823,2566,2507,2169,3702, // 6742
314 2483,3299,7824,3703,4501,7825,7826, 666,1003,3005,1022,3579,4218,7827,4502,1813, // 6758
315 2253, 574,3822,1603, 295,1535, 705,3823,4219, 283, 858, 417,7828,7829,3224,4503, // 6774
316 4504,3051,1220,1889,1046,2276,2456,4004,1393,1599, 689,2567, 388,4220,7830,2484, // 6790
317 802,7831,2798,3824,2060,1405,2254,7832,4505,3825,2109,1052,1345,3225,1585,7833, // 6806
318 809,7834,7835,7836, 575,2730,3477, 956,1552,1469,1144,2323,7837,2324,1560,2457, // 6822
319 3580,3226,4005, 616,2207,3155,2180,2289,7838,1832,7839,3478,4506,7840,1319,3704, // 6838
320 3705,1211,3581,1023,3227,1293,2799,7841,7842,7843,3826, 607,2306,3827, 762,2878, // 6854
321 1439,4221,1360,7844,1485,3052,7845,4507,1038,4222,1450,2061,2638,4223,1379,4508, // 6870
322 2585,7846,7847,4224,1352,1414,2325,2921,1172,7848,7849,3828,3829,7850,1797,1451, // 6886
323 7851,7852,7853,7854,2922,4006,4007,2485,2346, 411,4008,4009,3582,3300,3101,4509, // 6902
324 1561,2664,1452,4010,1375,7855,7856, 47,2959, 316,7857,1406,1591,2923,3156,7858, // 6918
325 1025,2141,3102,3157, 354,2731, 884,2224,4225,2407, 508,3706, 726,3583, 996,2428, // 6934
326 3584, 729,7859, 392,2191,1453,4011,4510,3707,7860,7861,2458,3585,2608,1675,2800, // 6950
327 919,2347,2960,2348,1270,4511,4012, 73,7862,7863, 647,7864,3228,2843,2255,1550, // 6966
328 1346,3006,7865,1332, 883,3479,7866,7867,7868,7869,3301,2765,7870,1212, 831,1347, // 6982
329 4226,4512,2326,3830,1863,3053, 720,3831,4513,4514,3832,7871,4227,7872,7873,4515, // 6998
330 7874,7875,1798,4516,3708,2609,4517,3586,1645,2371,7876,7877,2924, 669,2208,2665, // 7014
331 2429,7878,2879,7879,7880,1028,3229,7881,4228,2408,7882,2256,1353,7883,7884,4518, // 7030
332 3158, 518,7885,4013,7886,4229,1960,7887,2142,4230,7888,7889,3007,2349,2350,3833, // 7046
333 516,1833,1454,4014,2699,4231,4519,2225,2610,1971,1129,3587,7890,2766,7891,2961, // 7062
334 1422, 577,1470,3008,1524,3373,7892,7893, 432,4232,3054,3480,7894,2586,1455,2508, // 7078
335 2226,1972,1175,7895,1020,2732,4015,3481,4520,7896,2733,7897,1743,1361,3055,3482, // 7094
336 2639,4016,4233,4521,2290, 895, 924,4234,2170, 331,2243,3056, 166,1627,3057,1098, // 7110
337 7898,1232,2880,2227,3374,4522, 657, 403,1196,2372, 542,3709,3375,1600,4235,3483, // 7126
338 7899,4523,2767,3230, 576, 530,1362,7900,4524,2533,2666,3710,4017,7901, 842,3834, // 7142
339 7902,2801,2031,1014,4018, 213,2700,3376, 665, 621,4236,7903,3711,2925,2430,7904, // 7158
340 2431,3302,3588,3377,7905,4237,2534,4238,4525,3589,1682,4239,3484,1380,7906, 724, // 7174
341 2277, 600,1670,7907,1337,1233,4526,3103,2244,7908,1621,4527,7909, 651,4240,7910, // 7190
342 1612,4241,2611,7911,2844,7912,2734,2307,3058,7913, 716,2459,3059, 174,1255,2701, // 7206
343 4019,3590, 548,1320,1398, 728,4020,1574,7914,1890,1197,3060,4021,7915,3061,3062, // 7222
344 3712,3591,3713, 747,7916, 635,4242,4528,7917,7918,7919,4243,7920,7921,4529,7922, // 7238
345 3378,4530,2432, 451,7923,3714,2535,2072,4244,2735,4245,4022,7924,1764,4531,7925, // 7254
346 4246, 350,7926,2278,2390,2486,7927,4247,4023,2245,1434,4024, 488,4532, 458,4248, // 7270
347 4025,3715, 771,1330,2391,3835,2568,3159,2159,2409,1553,2667,3160,4249,7928,2487, // 7286
348 2881,2612,1720,2702,4250,3379,4533,7929,2536,4251,7930,3231,4252,2768,7931,2015, // 7302
349 2736,7932,1155,1017,3716,3836,7933,3303,2308, 201,1864,4253,1430,7934,4026,7935, // 7318
350 7936,7937,7938,7939,4254,1604,7940, 414,1865, 371,2587,4534,4535,3485,2016,3104, // 7334
351 4536,1708, 960,4255, 887, 389,2171,1536,1663,1721,7941,2228,4027,2351,2926,1580, // 7350
352 7942,7943,7944,1744,7945,2537,4537,4538,7946,4539,7947,2073,7948,7949,3592,3380, // 7366
353 2882,4256,7950,4257,2640,3381,2802, 673,2703,2460, 709,3486,4028,3593,4258,7951, // 7382
354 1148, 502, 634,7952,7953,1204,4540,3594,1575,4541,2613,3717,7954,3718,3105, 948, // 7398
355 3232, 121,1745,3837,1110,7955,4259,3063,2509,3009,4029,3719,1151,1771,3838,1488, // 7414
356 4030,1986,7956,2433,3487,7957,7958,2093,7959,4260,3839,1213,1407,2803, 531,2737, // 7430
357 2538,3233,1011,1537,7960,2769,4261,3106,1061,7961,3720,3721,1866,2883,7962,2017, // 7446
358 120,4262,4263,2062,3595,3234,2309,3840,2668,3382,1954,4542,7963,7964,3488,1047, // 7462
359 2704,1266,7965,1368,4543,2845, 649,3383,3841,2539,2738,1102,2846,2669,7966,7967, // 7478
360 1999,7968,1111,3596,2962,7969,2488,3842,3597,2804,1854,3384,3722,7970,7971,3385, // 7494
361 2410,2884,3304,3235,3598,7972,2569,7973,3599,2805,4031,1460, 856,7974,3600,7975, // 7510
362 2885,2963,7976,2886,3843,7977,4264, 632,2510, 875,3844,1697,3845,2291,7978,7979, // 7526
363 4544,3010,1239, 580,4545,4265,7980, 914, 936,2074,1190,4032,1039,2123,7981,7982, // 7542
364 7983,3386,1473,7984,1354,4266,3846,7985,2172,3064,4033, 915,3305,4267,4268,3306, // 7558
365 1605,1834,7986,2739, 398,3601,4269,3847,4034, 328,1912,2847,4035,3848,1331,4270, // 7574
366 3011, 937,4271,7987,3602,4036,4037,3387,2160,4546,3388, 524, 742, 538,3065,1012, // 7590
367 7988,7989,3849,2461,7990, 658,1103, 225,3850,7991,7992,4547,7993,4548,7994,3236, // 7606
368 1243,7995,4038, 963,2246,4549,7996,2705,3603,3161,7997,7998,2588,2327,7999,4550, // 7622
369 8000,8001,8002,3489,3307, 957,3389,2540,2032,1930,2927,2462, 870,2018,3604,1746, // 7638
370 2770,2771,2434,2463,8003,3851,8004,3723,3107,3724,3490,3390,3725,8005,1179,3066, // 7654
371 8006,3162,2373,4272,3726,2541,3163,3108,2740,4039,8007,3391,1556,2542,2292, 977, // 7670
372 2887,2033,4040,1205,3392,8008,1765,3393,3164,2124,1271,1689, 714,4551,3491,8009, // 7686
373 2328,3852, 533,4273,3605,2181, 617,8010,2464,3308,3492,2310,8011,8012,3165,8013, // 7702
374 8014,3853,1987, 618, 427,2641,3493,3394,8015,8016,1244,1690,8017,2806,4274,4552, // 7718
375 8018,3494,8019,8020,2279,1576, 473,3606,4275,3395, 972,8021,3607,8022,3067,8023, // 7734
376 8024,4553,4554,8025,3727,4041,4042,8026, 153,4555, 356,8027,1891,2888,4276,2143, // 7750
377 408, 803,2352,8028,3854,8029,4277,1646,2570,2511,4556,4557,3855,8030,3856,4278, // 7766
378 8031,2411,3396, 752,8032,8033,1961,2964,8034, 746,3012,2465,8035,4279,3728, 698, // 7782
379 4558,1892,4280,3608,2543,4559,3609,3857,8036,3166,3397,8037,1823,1302,4043,2706, // 7798
380 3858,1973,4281,8038,4282,3167, 823,1303,1288,1236,2848,3495,4044,3398, 774,3859, // 7814
381 8039,1581,4560,1304,2849,3860,4561,8040,2435,2161,1083,3237,4283,4045,4284, 344, // 7830
382 1173, 288,2311, 454,1683,8041,8042,1461,4562,4046,2589,8043,8044,4563, 985, 894, // 7846
383 8045,3399,3168,8046,1913,2928,3729,1988,8047,2110,1974,8048,4047,8049,2571,1194, // 7862
384 425,8050,4564,3169,1245,3730,4285,8051,8052,2850,8053, 636,4565,1855,3861, 760, // 7878
385 1799,8054,4286,2209,1508,4566,4048,1893,1684,2293,8055,8056,8057,4287,4288,2210, // 7894
386 479,8058,8059, 832,8060,4049,2489,8061,2965,2490,3731, 990,3109, 627,1814,2642, // 7910
387 4289,1582,4290,2125,2111,3496,4567,8062, 799,4291,3170,8063,4568,2112,1737,3013, // 7926
388 1018, 543, 754,4292,3309,1676,4569,4570,4050,8064,1489,8065,3497,8066,2614,2889, // 7942
389 4051,8067,8068,2966,8069,8070,8071,8072,3171,4571,4572,2182,1722,8073,3238,3239, // 7958
390 1842,3610,1715, 481, 365,1975,1856,8074,8075,1962,2491,4573,8076,2126,3611,3240, // 7974
391 433,1894,2063,2075,8077, 602,2741,8078,8079,8080,8081,8082,3014,1628,3400,8083, // 7990
392 3172,4574,4052,2890,4575,2512,8084,2544,2772,8085,8086,8087,3310,4576,2891,8088, // 8006
393 4577,8089,2851,4578,4579,1221,2967,4053,2513,8090,8091,8092,1867,1989,8093,8094, // 8022
394 8095,1895,8096,8097,4580,1896,4054, 318,8098,2094,4055,4293,8099,8100, 485,8101, // 8038
395 938,3862, 553,2670, 116,8102,3863,3612,8103,3498,2671,2773,3401,3311,2807,8104, // 8054
396 3613,2929,4056,1747,2930,2968,8105,8106, 207,8107,8108,2672,4581,2514,8109,3015, // 8070
397 890,3614,3864,8110,1877,3732,3402,8111,2183,2353,3403,1652,8112,8113,8114, 941, // 8086
398 2294, 208,3499,4057,2019, 330,4294,3865,2892,2492,3733,4295,8115,8116,8117,8118, // 8102
399
400 /***************************************************************************************
401 *Everything below is of no interest for detection purpose *
402 ***************************************************************************************
403
404 2515,1613,4582,8119,3312,3866,2516,8120,4058,8121,1637,4059,2466,4583,3867,8122, // 8118
405 2493,3016,3734,8123,8124,2192,8125,8126,2162,8127,8128,8129,8130,8131,8132,8133, // 8134
406 8134,8135,8136,8137,8138,8139,8140,8141,8142,8143,8144,8145,8146,8147,8148,8149, // 8150
407 8150,8151,8152,8153,8154,8155,8156,8157,8158,8159,8160,8161,8162,8163,8164,8165, // 8166
408 8166,8167,8168,8169,8170,8171,8172,8173,8174,8175,8176,8177,8178,8179,8180,8181, // 8182
409 8182,8183,8184,8185,8186,8187,8188,8189,8190,8191,8192,8193,8194,8195,8196,8197, // 8198
410 8198,8199,8200,8201,8202,8203,8204,8205,8206,8207,8208,8209,8210,8211,8212,8213, // 8214
411 8214,8215,8216,8217,8218,8219,8220,8221,8222,8223,8224,8225,8226,8227,8228,8229, // 8230
412 8230,8231,8232,8233,8234,8235,8236,8237,8238,8239,8240,8241,8242,8243,8244,8245, // 8246
413 8246,8247,8248,8249,8250,8251,8252,8253,8254,8255,8256,8257,8258,8259,8260,8261, // 8262
414 8262,8263,8264,8265,8266,8267,8268,8269,8270,8271,8272,8273,8274,8275,8276,8277, // 8278
415 8278,8279,8280,8281,8282,8283,8284,8285,8286,8287,8288,8289,8290,8291,8292,8293, // 8294
416 8294,8295,8296,8297,8298,8299,8300,8301,8302,8303,8304,8305,8306,8307,8308,8309, // 8310
417 8310,8311,8312,8313,8314,8315,8316,8317,8318,8319,8320,8321,8322,8323,8324,8325, // 8326
418 8326,8327,8328,8329,8330,8331,8332,8333,8334,8335,8336,8337,8338,8339,8340,8341, // 8342
419 8342,8343,8344,8345,8346,8347,8348,8349,8350,8351,8352,8353,8354,8355,8356,8357, // 8358
420 8358,8359,8360,8361,8362,8363,8364,8365,8366,8367,8368,8369,8370,8371,8372,8373, // 8374
421 8374,8375,8376,8377,8378,8379,8380,8381,8382,8383,8384,8385,8386,8387,8388,8389, // 8390
422 8390,8391,8392,8393,8394,8395,8396,8397,8398,8399,8400,8401,8402,8403,8404,8405, // 8406
423 8406,8407,8408,8409,8410,8411,8412,8413,8414,8415,8416,8417,8418,8419,8420,8421, // 8422
424 8422,8423,8424,8425,8426,8427,8428,8429,8430,8431,8432,8433,8434,8435,8436,8437, // 8438
425 8438,8439,8440,8441,8442,8443,8444,8445,8446,8447,8448,8449,8450,8451,8452,8453, // 8454
426 8454,8455,8456,8457,8458,8459,8460,8461,8462,8463,8464,8465,8466,8467,8468,8469, // 8470
427 8470,8471,8472,8473,8474,8475,8476,8477,8478,8479,8480,8481,8482,8483,8484,8485, // 8486
428 8486,8487,8488,8489,8490,8491,8492,8493,8494,8495,8496,8497,8498,8499,8500,8501, // 8502
429 8502,8503,8504,8505,8506,8507,8508,8509,8510,8511,8512,8513,8514,8515,8516,8517, // 8518
430 8518,8519,8520,8521,8522,8523,8524,8525,8526,8527,8528,8529,8530,8531,8532,8533, // 8534
431 8534,8535,8536,8537,8538,8539,8540,8541,8542,8543,8544,8545,8546,8547,8548,8549, // 8550
432 8550,8551,8552,8553,8554,8555,8556,8557,8558,8559,8560,8561,8562,8563,8564,8565, // 8566
433 8566,8567,8568,8569,8570,8571,8572,8573,8574,8575,8576,8577,8578,8579,8580,8581, // 8582
434 8582,8583,8584,8585,8586,8587,8588,8589,8590,8591,8592,8593,8594,8595,8596,8597, // 8598
435 8598,8599,8600,8601,8602,8603,8604,8605,8606,8607,8608,8609,8610,8611,8612,8613, // 8614
436 8614,8615,8616,8617,8618,8619,8620,8621,8622,8623,8624,8625,8626,8627,8628,8629, // 8630
437 8630,8631,8632,8633,8634,8635,8636,8637,8638,8639,8640,8641,8642,8643,8644,8645, // 8646
438 8646,8647,8648,8649,8650,8651,8652,8653,8654,8655,8656,8657,8658,8659,8660,8661, // 8662
439 8662,8663,8664,8665,8666,8667,8668,8669,8670,8671,8672,8673,8674,8675,8676,8677, // 8678
440 8678,8679,8680,8681,8682,8683,8684,8685,8686,8687,8688,8689,8690,8691,8692,8693, // 8694
441 8694,8695,8696,8697,8698,8699,8700,8701,8702,8703,8704,8705,8706,8707,8708,8709, // 8710
442 8710,8711,8712,8713,8714,8715,8716,8717,8718,8719,8720,8721,8722,8723,8724,8725, // 8726
443 8726,8727,8728,8729,8730,8731,8732,8733,8734,8735,8736,8737,8738,8739,8740,8741, // 8742 //13973
444 ****************************************************************************************/
445 };
446
+0
-491
c/src/GB2312Freq.tab less more
0 /* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
1 /* ***** BEGIN LICENSE BLOCK *****
2 * Version: MPL 1.1/GPL 2.0/LGPL 2.1
3 *
4 * The contents of this file are subject to the Mozilla Public License Version
5 * 1.1 (the "License"); you may not use this file except in compliance with
6 * the License. You may obtain a copy of the License at
7 * http://www.mozilla.org/MPL/
8 *
9 * Software distributed under the License is distributed on an "AS IS" basis,
10 * WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License
11 * for the specific language governing rights and limitations under the
12 * License.
13 *
14 * The Original Code is Mozilla Communicator client code.
15 *
16 * The Initial Developer of the Original Code is
17 * Netscape Communications Corporation.
18 * Portions created by the Initial Developer are Copyright (C) 1998
19 * the Initial Developer. All Rights Reserved.
20 *
21 * Contributor(s):
22 *
23 * Alternatively, the contents of this file may be used under the terms of
24 * either the GNU General Public License Version 2 or later (the "GPL"), or
25 * the GNU Lesser General Public License Version 2.1 or later (the "LGPL"),
26 * in which case the provisions of the GPL or the LGPL are applicable instead
27 * of those above. If you wish to allow use of your version of this file only
28 * under the terms of either the GPL or the LGPL, and not to allow others to
29 * use your version of this file under the terms of the MPL, indicate your
30 * decision by deleting the provisions above and replace them with the notice
31 * and other provisions required by the GPL or the LGPL. If you do not delete
32 * the provisions above, a recipient may use your version of this file under
33 * the terms of any one of the MPL, the GPL or the LGPL.
34 *
35 * ***** END LICENSE BLOCK ***** */
36
37 //GB2312 most frequently used character table
38
39 //Char to FreqOrder table , from hz6763
40
41 /******************************************************************************
42 * 512 --> 0.79 -- 0.79
43 * 1024 --> 0.92 -- 0.13
44 * 2048 --> 0.98 -- 0.06
45 * 6768 --> 1.00 -- 0.02
46 *
47 * Idea Distribution Ratio = 0.79135/(1-0.79135) = 3.79
48 * Random Distribution Ration = 512 / (3755 - 512) = 0.157
49 *
50 * Typical Distribution Ratio about 25% of Ideal one, still much higher that RDR
51 *****************************************************************************/
52
53 #define GB2312_TYPICAL_DISTRIBUTION_RATIO (float)0.9
54
55 #define GB2312_TABLE_SIZE 3760
56
57 static const PRInt16 GB2312CharToFreqOrder[] =
58 {
59 1671, 749,1443,2364,3924,3807,2330,3921,1704,3463,2691,1511,1515, 572,3191,2205,
60 2361, 224,2558, 479,1711, 963,3162, 440,4060,1905,2966,2947,3580,2647,3961,3842,
61 2204, 869,4207, 970,2678,5626,2944,2956,1479,4048, 514,3595, 588,1346,2820,3409,
62 249,4088,1746,1873,2047,1774, 581,1813, 358,1174,3590,1014,1561,4844,2245, 670,
63 1636,3112, 889,1286, 953, 556,2327,3060,1290,3141, 613, 185,3477,1367, 850,3820,
64 1715,2428,2642,2303,2732,3041,2562,2648,3566,3946,1349, 388,3098,2091,1360,3585,
65 152,1687,1539, 738,1559, 59,1232,2925,2267,1388,1249,1741,1679,2960, 151,1566,
66 1125,1352,4271, 924,4296, 385,3166,4459, 310,1245,2850, 70,3285,2729,3534,3575,
67 2398,3298,3466,1960,2265, 217,3647, 864,1909,2084,4401,2773,1010,3269,5152, 853,
68 3051,3121,1244,4251,1895, 364,1499,1540,2313,1180,3655,2268, 562, 715,2417,3061,
69 544, 336,3768,2380,1752,4075, 950, 280,2425,4382, 183,2759,3272, 333,4297,2155,
70 1688,2356,1444,1039,4540, 736,1177,3349,2443,2368,2144,2225, 565, 196,1482,3406,
71 927,1335,4147, 692, 878,1311,1653,3911,3622,1378,4200,1840,2969,3149,2126,1816,
72 2534,1546,2393,2760, 737,2494, 13, 447, 245,2747, 38,2765,2129,2589,1079, 606,
73 360, 471,3755,2890, 404, 848, 699,1785,1236, 370,2221,1023,3746,2074,2026,2023,
74 2388,1581,2119, 812,1141,3091,2536,1519, 804,2053, 406,1596,1090, 784, 548,4414,
75 1806,2264,2936,1100, 343,4114,5096, 622,3358, 743,3668,1510,1626,5020,3567,2513,
76 3195,4115,5627,2489,2991, 24,2065,2697,1087,2719, 48,1634, 315, 68, 985,2052,
77 198,2239,1347,1107,1439, 597,2366,2172, 871,3307, 919,2487,2790,1867, 236,2570,
78 1413,3794, 906,3365,3381,1701,1982,1818,1524,2924,1205, 616,2586,2072,2004, 575,
79 253,3099, 32,1365,1182, 197,1714,2454,1201, 554,3388,3224,2748, 756,2587, 250,
80 2567,1507,1517,3529,1922,2761,2337,3416,1961,1677,2452,2238,3153, 615, 911,1506,
81 1474,2495,1265,1906,2749,3756,3280,2161, 898,2714,1759,3450,2243,2444, 563, 26,
82 3286,2266,3769,3344,2707,3677, 611,1402, 531,1028,2871,4548,1375, 261,2948, 835,
83 1190,4134, 353, 840,2684,1900,3082,1435,2109,1207,1674, 329,1872,2781,4055,2686,
84 2104, 608,3318,2423,2957,2768,1108,3739,3512,3271,3985,2203,1771,3520,1418,2054,
85 1681,1153, 225,1627,2929, 162,2050,2511,3687,1954, 124,1859,2431,1684,3032,2894,
86 585,4805,3969,2869,2704,2088,2032,2095,3656,2635,4362,2209, 256, 518,2042,2105,
87 3777,3657, 643,2298,1148,1779, 190, 989,3544, 414, 11,2135,2063,2979,1471, 403,
88 3678, 126, 770,1563, 671,2499,3216,2877, 600,1179, 307,2805,4937,1268,1297,2694,
89 252,4032,1448,1494,1331,1394, 127,2256, 222,1647,1035,1481,3056,1915,1048, 873,
90 3651, 210, 33,1608,2516, 200,1520, 415, 102, 0,3389,1287, 817, 91,3299,2940,
91 836,1814, 549,2197,1396,1669,2987,3582,2297,2848,4528,1070, 687, 20,1819, 121,
92 1552,1364,1461,1968,2617,3540,2824,2083, 177, 948,4938,2291, 110,4549,2066, 648,
93 3359,1755,2110,2114,4642,4845,1693,3937,3308,1257,1869,2123, 208,1804,3159,2992,
94 2531,2549,3361,2418,1350,2347,2800,2568,1291,2036,2680, 72, 842,1990, 212,1233,
95 1154,1586, 75,2027,3410,4900,1823,1337,2710,2676, 728,2810,1522,3026,4995, 157,
96 755,1050,4022, 710, 785,1936,2194,2085,1406,2777,2400, 150,1250,4049,1206, 807,
97 1910, 534, 529,3309,1721,1660, 274, 39,2827, 661,2670,1578, 925,3248,3815,1094,
98 4278,4901,4252, 41,1150,3747,2572,2227,4501,3658,4902,3813,3357,3617,2884,2258,
99 887, 538,4187,3199,1294,2439,3042,2329,2343,2497,1255, 107, 543,1527, 521,3478,
100 3568, 194,5062, 15, 961,3870,1241,1192,2664, 66,5215,3260,2111,1295,1127,2152,
101 3805,4135, 901,1164,1976, 398,1278, 530,1460, 748, 904,1054,1966,1426, 53,2909,
102 509, 523,2279,1534, 536,1019, 239,1685, 460,2353, 673,1065,2401,3600,4298,2272,
103 1272,2363, 284,1753,3679,4064,1695, 81, 815,2677,2757,2731,1386, 859, 500,4221,
104 2190,2566, 757,1006,2519,2068,1166,1455, 337,2654,3203,1863,1682,1914,3025,1252,
105 1409,1366, 847, 714,2834,2038,3209, 964,2970,1901, 885,2553,1078,1756,3049, 301,
106 1572,3326, 688,2130,1996,2429,1805,1648,2930,3421,2750,3652,3088, 262,1158,1254,
107 389,1641,1812, 526,1719, 923,2073,1073,1902, 468, 489,4625,1140, 857,2375,3070,
108 3319,2863, 380, 116,1328,2693,1161,2244, 273,1212,1884,2769,3011,1775,1142, 461,
109 3066,1200,2147,2212, 790, 702,2695,4222,1601,1058, 434,2338,5153,3640, 67,2360,
110 4099,2502, 618,3472,1329, 416,1132, 830,2782,1807,2653,3211,3510,1662, 192,2124,
111 296,3979,1739,1611,3684, 23, 118, 324, 446,1239,1225, 293,2520,3814,3795,2535,
112 3116, 17,1074, 467,2692,2201, 387,2922, 45,1326,3055,1645,3659,2817, 958, 243,
113 1903,2320,1339,2825,1784,3289, 356, 576, 865,2315,2381,3377,3916,1088,3122,1713,
114 1655, 935, 628,4689,1034,1327, 441, 800, 720, 894,1979,2183,1528,5289,2702,1071,
115 4046,3572,2399,1571,3281, 79, 761,1103, 327, 134, 758,1899,1371,1615, 879, 442,
116 215,2605,2579, 173,2048,2485,1057,2975,3317,1097,2253,3801,4263,1403,1650,2946,
117 814,4968,3487,1548,2644,1567,1285, 2, 295,2636, 97, 946,3576, 832, 141,4257,
118 3273, 760,3821,3521,3156,2607, 949,1024,1733,1516,1803,1920,2125,2283,2665,3180,
119 1501,2064,3560,2171,1592, 803,3518,1416, 732,3897,4258,1363,1362,2458, 119,1427,
120 602,1525,2608,1605,1639,3175, 694,3064, 10, 465, 76,2000,4846,4208, 444,3781,
121 1619,3353,2206,1273,3796, 740,2483, 320,1723,2377,3660,2619,1359,1137,1762,1724,
122 2345,2842,1850,1862, 912, 821,1866, 612,2625,1735,2573,3369,1093, 844, 89, 937,
123 930,1424,3564,2413,2972,1004,3046,3019,2011, 711,3171,1452,4178, 428, 801,1943,
124 432, 445,2811, 206,4136,1472, 730, 349, 73, 397,2802,2547, 998,1637,1167, 789,
125 396,3217, 154,1218, 716,1120,1780,2819,4826,1931,3334,3762,2139,1215,2627, 552,
126 3664,3628,3232,1405,2383,3111,1356,2652,3577,3320,3101,1703, 640,1045,1370,1246,
127 4996, 371,1575,2436,1621,2210, 984,4033,1734,2638, 16,4529, 663,2755,3255,1451,
128 3917,2257,1253,1955,2234,1263,2951, 214,1229, 617, 485, 359,1831,1969, 473,2310,
129 750,2058, 165, 80,2864,2419, 361,4344,2416,2479,1134, 796,3726,1266,2943, 860,
130 2715, 938, 390,2734,1313,1384, 248, 202, 877,1064,2854, 522,3907, 279,1602, 297,
131 2357, 395,3740, 137,2075, 944,4089,2584,1267,3802, 62,1533,2285, 178, 176, 780,
132 2440, 201,3707, 590, 478,1560,4354,2117,1075, 30, 74,4643,4004,1635,1441,2745,
133 776,2596, 238,1077,1692,1912,2844, 605, 499,1742,3947, 241,3053, 980,1749, 936,
134 2640,4511,2582, 515,1543,2162,5322,2892,2993, 890,2148,1924, 665,1827,3581,1032,
135 968,3163, 339,1044,1896, 270, 583,1791,1720,4367,1194,3488,3669, 43,2523,1657,
136 163,2167, 290,1209,1622,3378, 550, 634,2508,2510, 695,2634,2384,2512,1476,1414,
137 220,1469,2341,2138,2852,3183,2900,4939,2865,3502,1211,3680, 854,3227,1299,2976,
138 3172, 186,2998,1459, 443,1067,3251,1495, 321,1932,3054, 909, 753,1410,1828, 436,
139 2441,1119,1587,3164,2186,1258, 227, 231,1425,1890,3200,3942, 247, 959, 725,5254,
140 2741, 577,2158,2079, 929, 120, 174, 838,2813, 591,1115, 417,2024, 40,3240,1536,
141 1037, 291,4151,2354, 632,1298,2406,2500,3535,1825,1846,3451, 205,1171, 345,4238,
142 18,1163, 811, 685,2208,1217, 425,1312,1508,1175,4308,2552,1033, 587,1381,3059,
143 2984,3482, 340,1316,4023,3972, 792,3176, 519, 777,4690, 918, 933,4130,2981,3741,
144 90,3360,2911,2200,5184,4550, 609,3079,2030, 272,3379,2736, 363,3881,1130,1447,
145 286, 779, 357,1169,3350,3137,1630,1220,2687,2391, 747,1277,3688,2618,2682,2601,
146 1156,3196,5290,4034,3102,1689,3596,3128, 874, 219,2783, 798, 508,1843,2461, 269,
147 1658,1776,1392,1913,2983,3287,2866,2159,2372, 829,4076, 46,4253,2873,1889,1894,
148 915,1834,1631,2181,2318, 298, 664,2818,3555,2735, 954,3228,3117, 527,3511,2173,
149 681,2712,3033,2247,2346,3467,1652, 155,2164,3382, 113,1994, 450, 899, 494, 994,
150 1237,2958,1875,2336,1926,3727, 545,1577,1550, 633,3473, 204,1305,3072,2410,1956,
151 2471, 707,2134, 841,2195,2196,2663,3843,1026,4940, 990,3252,4997, 368,1092, 437,
152 3212,3258,1933,1829, 675,2977,2893, 412, 943,3723,4644,3294,3283,2230,2373,5154,
153 2389,2241,2661,2323,1404,2524, 593, 787, 677,3008,1275,2059, 438,2709,2609,2240,
154 2269,2246,1446, 36,1568,1373,3892,1574,2301,1456,3962, 693,2276,5216,2035,1143,
155 2720,1919,1797,1811,2763,4137,2597,1830,1699,1488,1198,2090, 424,1694, 312,3634,
156 3390,4179,3335,2252,1214, 561,1059,3243,2295,2561, 975,5155,2321,2751,3772, 472,
157 1537,3282,3398,1047,2077,2348,2878,1323,3340,3076, 690,2906, 51, 369, 170,3541,
158 1060,2187,2688,3670,2541,1083,1683, 928,3918, 459, 109,4427, 599,3744,4286, 143,
159 2101,2730,2490, 82,1588,3036,2121, 281,1860, 477,4035,1238,2812,3020,2716,3312,
160 1530,2188,2055,1317, 843, 636,1808,1173,3495, 649, 181,1002, 147,3641,1159,2414,
161 3750,2289,2795, 813,3123,2610,1136,4368, 5,3391,4541,2174, 420, 429,1728, 754,
162 1228,2115,2219, 347,2223,2733, 735,1518,3003,2355,3134,1764,3948,3329,1888,2424,
163 1001,1234,1972,3321,3363,1672,1021,1450,1584, 226, 765, 655,2526,3404,3244,2302,
164 3665, 731, 594,2184, 319,1576, 621, 658,2656,4299,2099,3864,1279,2071,2598,2739,
165 795,3086,3699,3908,1707,2352,2402,1382,3136,2475,1465,4847,3496,3865,1085,3004,
166 2591,1084, 213,2287,1963,3565,2250, 822, 793,4574,3187,1772,1789,3050, 595,1484,
167 1959,2770,1080,2650, 456, 422,2996, 940,3322,4328,4345,3092,2742, 965,2784, 739,
168 4124, 952,1358,2498,2949,2565, 332,2698,2378, 660,2260,2473,4194,3856,2919, 535,
169 1260,2651,1208,1428,1300,1949,1303,2942, 433,2455,2450,1251,1946, 614,1269, 641,
170 1306,1810,2737,3078,2912, 564,2365,1419,1415,1497,4460,2367,2185,1379,3005,1307,
171 3218,2175,1897,3063, 682,1157,4040,4005,1712,1160,1941,1399, 394, 402,2952,1573,
172 1151,2986,2404, 862, 299,2033,1489,3006, 346, 171,2886,3401,1726,2932, 168,2533,
173 47,2507,1030,3735,1145,3370,1395,1318,1579,3609,4560,2857,4116,1457,2529,1965,
174 504,1036,2690,2988,2405, 745,5871, 849,2397,2056,3081, 863,2359,3857,2096, 99,
175 1397,1769,2300,4428,1643,3455,1978,1757,3718,1440, 35,4879,3742,1296,4228,2280,
176 160,5063,1599,2013, 166, 520,3479,1646,3345,3012, 490,1937,1545,1264,2182,2505,
177 1096,1188,1369,1436,2421,1667,2792,2460,1270,2122, 727,3167,2143, 806,1706,1012,
178 1800,3037, 960,2218,1882, 805, 139,2456,1139,1521, 851,1052,3093,3089, 342,2039,
179 744,5097,1468,1502,1585,2087, 223, 939, 326,2140,2577, 892,2481,1623,4077, 982,
180 3708, 135,2131, 87,2503,3114,2326,1106, 876,1616, 547,2997,2831,2093,3441,4530,
181 4314, 9,3256,4229,4148, 659,1462,1986,1710,2046,2913,2231,4090,4880,5255,3392,
182 3274,1368,3689,4645,1477, 705,3384,3635,1068,1529,2941,1458,3782,1509, 100,1656,
183 2548, 718,2339, 408,1590,2780,3548,1838,4117,3719,1345,3530, 717,3442,2778,3220,
184 2898,1892,4590,3614,3371,2043,1998,1224,3483, 891, 635, 584,2559,3355, 733,1766,
185 1729,1172,3789,1891,2307, 781,2982,2271,1957,1580,5773,2633,2005,4195,3097,1535,
186 3213,1189,1934,5693,3262, 586,3118,1324,1598, 517,1564,2217,1868,1893,4445,3728,
187 2703,3139,1526,1787,1992,3882,2875,1549,1199,1056,2224,1904,2711,5098,4287, 338,
188 1993,3129,3489,2689,1809,2815,1997, 957,1855,3898,2550,3275,3057,1105,1319, 627,
189 1505,1911,1883,3526, 698,3629,3456,1833,1431, 746, 77,1261,2017,2296,1977,1885,
190 125,1334,1600, 525,1798,1109,2222,1470,1945, 559,2236,1186,3443,2476,1929,1411,
191 2411,3135,1777,3372,2621,1841,1613,3229, 668,1430,1839,2643,2916, 195,1989,2671,
192 2358,1387, 629,3205,2293,5256,4439, 123,1310, 888,1879,4300,3021,3605,1003,1162,
193 3192,2910,2010, 140,2395,2859, 55,1082,2012,2901, 662, 419,2081,1438, 680,2774,
194 4654,3912,1620,1731,1625,5035,4065,2328, 512,1344, 802,5443,2163,2311,2537, 524,
195 3399, 98,1155,2103,1918,2606,3925,2816,1393,2465,1504,3773,2177,3963,1478,4346,
196 180,1113,4655,3461,2028,1698, 833,2696,1235,1322,1594,4408,3623,3013,3225,2040,
197 3022, 541,2881, 607,3632,2029,1665,1219, 639,1385,1686,1099,2803,3231,1938,3188,
198 2858, 427, 676,2772,1168,2025, 454,3253,2486,3556, 230,1950, 580, 791,1991,1280,
199 1086,1974,2034, 630, 257,3338,2788,4903,1017, 86,4790, 966,2789,1995,1696,1131,
200 259,3095,4188,1308, 179,1463,5257, 289,4107,1248, 42,3413,1725,2288, 896,1947,
201 774,4474,4254, 604,3430,4264, 392,2514,2588, 452, 237,1408,3018, 988,4531,1970,
202 3034,3310, 540,2370,1562,1288,2990, 502,4765,1147, 4,1853,2708, 207, 294,2814,
203 4078,2902,2509, 684, 34,3105,3532,2551, 644, 709,2801,2344, 573,1727,3573,3557,
204 2021,1081,3100,4315,2100,3681, 199,2263,1837,2385, 146,3484,1195,2776,3949, 997,
205 1939,3973,1008,1091,1202,1962,1847,1149,4209,5444,1076, 493, 117,5400,2521, 972,
206 1490,2934,1796,4542,2374,1512,2933,2657, 413,2888,1135,2762,2314,2156,1355,2369,
207 766,2007,2527,2170,3124,2491,2593,2632,4757,2437, 234,3125,3591,1898,1750,1376,
208 1942,3468,3138, 570,2127,2145,3276,4131, 962, 132,1445,4196, 19, 941,3624,3480,
209 3366,1973,1374,4461,3431,2629, 283,2415,2275, 808,2887,3620,2112,2563,1353,3610,
210 955,1089,3103,1053, 96, 88,4097, 823,3808,1583, 399, 292,4091,3313, 421,1128,
211 642,4006, 903,2539,1877,2082, 596, 29,4066,1790, 722,2157, 130, 995,1569, 769,
212 1485, 464, 513,2213, 288,1923,1101,2453,4316, 133, 486,2445, 50, 625, 487,2207,
213 57, 423, 481,2962, 159,3729,1558, 491, 303, 482, 501, 240,2837, 112,3648,2392,
214 1783, 362, 8,3433,3422, 610,2793,3277,1390,1284,1654, 21,3823, 734, 367, 623,
215 193, 287, 374,1009,1483, 816, 476, 313,2255,2340,1262,2150,2899,1146,2581, 782,
216 2116,1659,2018,1880, 255,3586,3314,1110,2867,2137,2564, 986,2767,5185,2006, 650,
217 158, 926, 762, 881,3157,2717,2362,3587, 306,3690,3245,1542,3077,2427,1691,2478,
218 2118,2985,3490,2438, 539,2305, 983, 129,1754, 355,4201,2386, 827,2923, 104,1773,
219 2838,2771, 411,2905,3919, 376, 767, 122,1114, 828,2422,1817,3506, 266,3460,1007,
220 1609,4998, 945,2612,4429,2274, 726,1247,1964,2914,2199,2070,4002,4108, 657,3323,
221 1422, 579, 455,2764,4737,1222,2895,1670, 824,1223,1487,2525, 558, 861,3080, 598,
222 2659,2515,1967, 752,2583,2376,2214,4180, 977, 704,2464,4999,2622,4109,1210,2961,
223 819,1541, 142,2284, 44, 418, 457,1126,3730,4347,4626,1644,1876,3671,1864, 302,
224 1063,5694, 624, 723,1984,3745,1314,1676,2488,1610,1449,3558,3569,2166,2098, 409,
225 1011,2325,3704,2306, 818,1732,1383,1824,1844,3757, 999,2705,3497,1216,1423,2683,
226 2426,2954,2501,2726,2229,1475,2554,5064,1971,1794,1666,2014,1343, 783, 724, 191,
227 2434,1354,2220,5065,1763,2752,2472,4152, 131, 175,2885,3434, 92,1466,4920,2616,
228 3871,3872,3866, 128,1551,1632, 669,1854,3682,4691,4125,1230, 188,2973,3290,1302,
229 1213, 560,3266, 917, 763,3909,3249,1760, 868,1958, 764,1782,2097, 145,2277,3774,
230 4462, 64,1491,3062, 971,2132,3606,2442, 221,1226,1617, 218, 323,1185,3207,3147,
231 571, 619,1473,1005,1744,2281, 449,1887,2396,3685, 275, 375,3816,1743,3844,3731,
232 845,1983,2350,4210,1377, 773, 967,3499,3052,3743,2725,4007,1697,1022,3943,1464,
233 3264,2855,2722,1952,1029,2839,2467, 84,4383,2215, 820,1391,2015,2448,3672, 377,
234 1948,2168, 797,2545,3536,2578,2645, 94,2874,1678, 405,1259,3071, 771, 546,1315,
235 470,1243,3083, 895,2468, 981, 969,2037, 846,4181, 653,1276,2928, 14,2594, 557,
236 3007,2474, 156, 902,1338,1740,2574, 537,2518, 973,2282,2216,2433,1928, 138,2903,
237 1293,2631,1612, 646,3457, 839,2935, 111, 496,2191,2847, 589,3186, 149,3994,2060,
238 4031,2641,4067,3145,1870, 37,3597,2136,1025,2051,3009,3383,3549,1121,1016,3261,
239 1301, 251,2446,2599,2153, 872,3246, 637, 334,3705, 831, 884, 921,3065,3140,4092,
240 2198,1944, 246,2964, 108,2045,1152,1921,2308,1031, 203,3173,4170,1907,3890, 810,
241 1401,2003,1690, 506, 647,1242,2828,1761,1649,3208,2249,1589,3709,2931,5156,1708,
242 498, 666,2613, 834,3817,1231, 184,2851,1124, 883,3197,2261,3710,1765,1553,2658,
243 1178,2639,2351, 93,1193, 942,2538,2141,4402, 235,1821, 870,1591,2192,1709,1871,
244 3341,1618,4126,2595,2334, 603, 651, 69, 701, 268,2662,3411,2555,1380,1606, 503,
245 448, 254,2371,2646, 574,1187,2309,1770, 322,2235,1292,1801, 305, 566,1133, 229,
246 2067,2057, 706, 167, 483,2002,2672,3295,1820,3561,3067, 316, 378,2746,3452,1112,
247 136,1981, 507,1651,2917,1117, 285,4591, 182,2580,3522,1304, 335,3303,1835,2504,
248 1795,1792,2248, 674,1018,2106,2449,1857,2292,2845, 976,3047,1781,2600,2727,1389,
249 1281, 52,3152, 153, 265,3950, 672,3485,3951,4463, 430,1183, 365, 278,2169, 27,
250 1407,1336,2304, 209,1340,1730,2202,1852,2403,2883, 979,1737,1062, 631,2829,2542,
251 3876,2592, 825,2086,2226,3048,3625, 352,1417,3724, 542, 991, 431,1351,3938,1861,
252 2294, 826,1361,2927,3142,3503,1738, 463,2462,2723, 582,1916,1595,2808, 400,3845,
253 3891,2868,3621,2254, 58,2492,1123, 910,2160,2614,1372,1603,1196,1072,3385,1700,
254 3267,1980, 696, 480,2430, 920, 799,1570,2920,1951,2041,4047,2540,1321,4223,2469,
255 3562,2228,1271,2602, 401,2833,3351,2575,5157, 907,2312,1256, 410, 263,3507,1582,
256 996, 678,1849,2316,1480, 908,3545,2237, 703,2322, 667,1826,2849,1531,2604,2999,
257 2407,3146,2151,2630,1786,3711, 469,3542, 497,3899,2409, 858, 837,4446,3393,1274,
258 786, 620,1845,2001,3311, 484, 308,3367,1204,1815,3691,2332,1532,2557,1842,2020,
259 2724,1927,2333,4440, 567, 22,1673,2728,4475,1987,1858,1144,1597, 101,1832,3601,
260 12, 974,3783,4391, 951,1412, 1,3720, 453,4608,4041, 528,1041,1027,3230,2628,
261 1129, 875,1051,3291,1203,2262,1069,2860,2799,2149,2615,3278, 144,1758,3040, 31,
262 475,1680, 366,2685,3184, 311,1642,4008,2466,5036,1593,1493,2809, 216,1420,1668,
263 233, 304,2128,3284, 232,1429,1768,1040,2008,3407,2740,2967,2543, 242,2133, 778,
264 1565,2022,2620, 505,2189,2756,1098,2273, 372,1614, 708, 553,2846,2094,2278, 169,
265 3626,2835,4161, 228,2674,3165, 809,1454,1309, 466,1705,1095, 900,3423, 880,2667,
266 3751,5258,2317,3109,2571,4317,2766,1503,1342, 866,4447,1118, 63,2076, 314,1881,
267 1348,1061, 172, 978,3515,1747, 532, 511,3970, 6, 601, 905,2699,3300,1751, 276,
268 1467,3725,2668, 65,4239,2544,2779,2556,1604, 578,2451,1802, 992,2331,2624,1320,
269 3446, 713,1513,1013, 103,2786,2447,1661, 886,1702, 916, 654,3574,2031,1556, 751,
270 2178,2821,2179,1498,1538,2176, 271, 914,2251,2080,1325, 638,1953,2937,3877,2432,
271 2754, 95,3265,1716, 260,1227,4083, 775, 106,1357,3254, 426,1607, 555,2480, 772,
272 1985, 244,2546, 474, 495,1046,2611,1851,2061, 71,2089,1675,2590, 742,3758,2843,
273 3222,1433, 267,2180,2576,2826,2233,2092,3913,2435, 956,1745,3075, 856,2113,1116,
274 451, 3,1988,2896,1398, 993,2463,1878,2049,1341,2718,2721,2870,2108, 712,2904,
275 4363,2753,2324, 277,2872,2349,2649, 384, 987, 435, 691,3000, 922, 164,3939, 652,
276 1500,1184,4153,2482,3373,2165,4848,2335,3775,3508,3154,2806,2830,1554,2102,1664,
277 2530,1434,2408, 893,1547,2623,3447,2832,2242,2532,3169,2856,3223,2078, 49,3770,
278 3469, 462, 318, 656,2259,3250,3069, 679,1629,2758, 344,1138,1104,3120,1836,1283,
279 3115,2154,1437,4448, 934, 759,1999, 794,2862,1038, 533,2560,1722,2342, 855,2626,
280 1197,1663,4476,3127, 85,4240,2528, 25,1111,1181,3673, 407,3470,4561,2679,2713,
281 768,1925,2841,3986,1544,1165, 932, 373,1240,2146,1930,2673, 721,4766, 354,4333,
282 391,2963, 187, 61,3364,1442,1102, 330,1940,1767, 341,3809,4118, 393,2496,2062,
283 2211, 105, 331, 300, 439, 913,1332, 626, 379,3304,1557, 328, 689,3952, 309,1555,
284 931, 317,2517,3027, 325, 569, 686,2107,3084, 60,1042,1333,2794, 264,3177,4014,
285 1628, 258,3712, 7,4464,1176,1043,1778, 683, 114,1975, 78,1492, 383,1886, 510,
286 386, 645,5291,2891,2069,3305,4138,3867,2939,2603,2493,1935,1066,1848,3588,1015,
287 1282,1289,4609, 697,1453,3044,2666,3611,1856,2412, 54, 719,1330, 568,3778,2459,
288 1748, 788, 492, 551,1191,1000, 488,3394,3763, 282,1799, 348,2016,1523,3155,2390,
289 1049, 382,2019,1788,1170, 729,2968,3523, 897,3926,2785,2938,3292, 350,2319,3238,
290 1718,1717,2655,3453,3143,4465, 161,2889,2980,2009,1421, 56,1908,1640,2387,2232,
291 1917,1874,2477,4921, 148, 83,3438, 592,4245,2882,1822,1055, 741, 115,1496,1624,
292 381,1638,4592,1020, 516,3214, 458, 947,4575,1432, 211,1514,2926,1865,2142, 189,
293 852,1221,1400,1486, 882,2299,4036, 351, 28,1122, 700,6479,6480,6481,6482,6483, //last 512
294
295 /***************************************************************************************
296 *Everything below is of no interest for detection purpose *
297 ***************************************************************************************
298
299 5508,6484,3900,3414,3974,4441,4024,3537,4037,5628,5099,3633,6485,3148,6486,3636,
300 5509,3257,5510,5973,5445,5872,4941,4403,3174,4627,5873,6276,2286,4230,5446,5874,
301 5122,6102,6103,4162,5447,5123,5323,4849,6277,3980,3851,5066,4246,5774,5067,6278,
302 3001,2807,5695,3346,5775,5974,5158,5448,6487,5975,5976,5776,3598,6279,5696,4806,
303 4211,4154,6280,6488,6489,6490,6281,4212,5037,3374,4171,6491,4562,4807,4722,4827,
304 5977,6104,4532,4079,5159,5324,5160,4404,3858,5359,5875,3975,4288,4610,3486,4512,
305 5325,3893,5360,6282,6283,5560,2522,4231,5978,5186,5449,2569,3878,6284,5401,3578,
306 4415,6285,4656,5124,5979,2506,4247,4449,3219,3417,4334,4969,4329,6492,4576,4828,
307 4172,4416,4829,5402,6286,3927,3852,5361,4369,4830,4477,4867,5876,4173,6493,6105,
308 4657,6287,6106,5877,5450,6494,4155,4868,5451,3700,5629,4384,6288,6289,5878,3189,
309 4881,6107,6290,6495,4513,6496,4692,4515,4723,5100,3356,6497,6291,3810,4080,5561,
310 3570,4430,5980,6498,4355,5697,6499,4724,6108,6109,3764,4050,5038,5879,4093,3226,
311 6292,5068,5217,4693,3342,5630,3504,4831,4377,4466,4309,5698,4431,5777,6293,5778,
312 4272,3706,6110,5326,3752,4676,5327,4273,5403,4767,5631,6500,5699,5880,3475,5039,
313 6294,5562,5125,4348,4301,4482,4068,5126,4593,5700,3380,3462,5981,5563,3824,5404,
314 4970,5511,3825,4738,6295,6501,5452,4516,6111,5881,5564,6502,6296,5982,6503,4213,
315 4163,3454,6504,6112,4009,4450,6113,4658,6297,6114,3035,6505,6115,3995,4904,4739,
316 4563,4942,4110,5040,3661,3928,5362,3674,6506,5292,3612,4791,5565,4149,5983,5328,
317 5259,5021,4725,4577,4564,4517,4364,6298,5405,4578,5260,4594,4156,4157,5453,3592,
318 3491,6507,5127,5512,4709,4922,5984,5701,4726,4289,6508,4015,6116,5128,4628,3424,
319 4241,5779,6299,4905,6509,6510,5454,5702,5780,6300,4365,4923,3971,6511,5161,3270,
320 3158,5985,4100, 867,5129,5703,6117,5363,3695,3301,5513,4467,6118,6512,5455,4232,
321 4242,4629,6513,3959,4478,6514,5514,5329,5986,4850,5162,5566,3846,4694,6119,5456,
322 4869,5781,3779,6301,5704,5987,5515,4710,6302,5882,6120,4392,5364,5705,6515,6121,
323 6516,6517,3736,5988,5457,5989,4695,2457,5883,4551,5782,6303,6304,6305,5130,4971,
324 6122,5163,6123,4870,3263,5365,3150,4871,6518,6306,5783,5069,5706,3513,3498,4409,
325 5330,5632,5366,5458,5459,3991,5990,4502,3324,5991,5784,3696,4518,5633,4119,6519,
326 4630,5634,4417,5707,4832,5992,3418,6124,5993,5567,4768,5218,6520,4595,3458,5367,
327 6125,5635,6126,4202,6521,4740,4924,6307,3981,4069,4385,6308,3883,2675,4051,3834,
328 4302,4483,5568,5994,4972,4101,5368,6309,5164,5884,3922,6127,6522,6523,5261,5460,
329 5187,4164,5219,3538,5516,4111,3524,5995,6310,6311,5369,3181,3386,2484,5188,3464,
330 5569,3627,5708,6524,5406,5165,4677,4492,6312,4872,4851,5885,4468,5996,6313,5709,
331 5710,6128,2470,5886,6314,5293,4882,5785,3325,5461,5101,6129,5711,5786,6525,4906,
332 6526,6527,4418,5887,5712,4808,2907,3701,5713,5888,6528,3765,5636,5331,6529,6530,
333 3593,5889,3637,4943,3692,5714,5787,4925,6315,6130,5462,4405,6131,6132,6316,5262,
334 6531,6532,5715,3859,5716,5070,4696,5102,3929,5788,3987,4792,5997,6533,6534,3920,
335 4809,5000,5998,6535,2974,5370,6317,5189,5263,5717,3826,6536,3953,5001,4883,3190,
336 5463,5890,4973,5999,4741,6133,6134,3607,5570,6000,4711,3362,3630,4552,5041,6318,
337 6001,2950,2953,5637,4646,5371,4944,6002,2044,4120,3429,6319,6537,5103,4833,6538,
338 6539,4884,4647,3884,6003,6004,4758,3835,5220,5789,4565,5407,6540,6135,5294,4697,
339 4852,6320,6321,3206,4907,6541,6322,4945,6542,6136,6543,6323,6005,4631,3519,6544,
340 5891,6545,5464,3784,5221,6546,5571,4659,6547,6324,6137,5190,6548,3853,6549,4016,
341 4834,3954,6138,5332,3827,4017,3210,3546,4469,5408,5718,3505,4648,5790,5131,5638,
342 5791,5465,4727,4318,6325,6326,5792,4553,4010,4698,3439,4974,3638,4335,3085,6006,
343 5104,5042,5166,5892,5572,6327,4356,4519,5222,5573,5333,5793,5043,6550,5639,5071,
344 4503,6328,6139,6551,6140,3914,3901,5372,6007,5640,4728,4793,3976,3836,4885,6552,
345 4127,6553,4451,4102,5002,6554,3686,5105,6555,5191,5072,5295,4611,5794,5296,6556,
346 5893,5264,5894,4975,5466,5265,4699,4976,4370,4056,3492,5044,4886,6557,5795,4432,
347 4769,4357,5467,3940,4660,4290,6141,4484,4770,4661,3992,6329,4025,4662,5022,4632,
348 4835,4070,5297,4663,4596,5574,5132,5409,5895,6142,4504,5192,4664,5796,5896,3885,
349 5575,5797,5023,4810,5798,3732,5223,4712,5298,4084,5334,5468,6143,4052,4053,4336,
350 4977,4794,6558,5335,4908,5576,5224,4233,5024,4128,5469,5225,4873,6008,5045,4729,
351 4742,4633,3675,4597,6559,5897,5133,5577,5003,5641,5719,6330,6560,3017,2382,3854,
352 4406,4811,6331,4393,3964,4946,6561,2420,3722,6562,4926,4378,3247,1736,4442,6332,
353 5134,6333,5226,3996,2918,5470,4319,4003,4598,4743,4744,4485,3785,3902,5167,5004,
354 5373,4394,5898,6144,4874,1793,3997,6334,4085,4214,5106,5642,4909,5799,6009,4419,
355 4189,3330,5899,4165,4420,5299,5720,5227,3347,6145,4081,6335,2876,3930,6146,3293,
356 3786,3910,3998,5900,5300,5578,2840,6563,5901,5579,6147,3531,5374,6564,6565,5580,
357 4759,5375,6566,6148,3559,5643,6336,6010,5517,6337,6338,5721,5902,3873,6011,6339,
358 6567,5518,3868,3649,5722,6568,4771,4947,6569,6149,4812,6570,2853,5471,6340,6341,
359 5644,4795,6342,6012,5723,6343,5724,6013,4349,6344,3160,6150,5193,4599,4514,4493,
360 5168,4320,6345,4927,3666,4745,5169,5903,5005,4928,6346,5725,6014,4730,4203,5046,
361 4948,3395,5170,6015,4150,6016,5726,5519,6347,5047,3550,6151,6348,4197,4310,5904,
362 6571,5581,2965,6152,4978,3960,4291,5135,6572,5301,5727,4129,4026,5905,4853,5728,
363 5472,6153,6349,4533,2700,4505,5336,4678,3583,5073,2994,4486,3043,4554,5520,6350,
364 6017,5800,4487,6351,3931,4103,5376,6352,4011,4321,4311,4190,5136,6018,3988,3233,
365 4350,5906,5645,4198,6573,5107,3432,4191,3435,5582,6574,4139,5410,6353,5411,3944,
366 5583,5074,3198,6575,6354,4358,6576,5302,4600,5584,5194,5412,6577,6578,5585,5413,
367 5303,4248,5414,3879,4433,6579,4479,5025,4854,5415,6355,4760,4772,3683,2978,4700,
368 3797,4452,3965,3932,3721,4910,5801,6580,5195,3551,5907,3221,3471,3029,6019,3999,
369 5908,5909,5266,5267,3444,3023,3828,3170,4796,5646,4979,4259,6356,5647,5337,3694,
370 6357,5648,5338,4520,4322,5802,3031,3759,4071,6020,5586,4836,4386,5048,6581,3571,
371 4679,4174,4949,6154,4813,3787,3402,3822,3958,3215,3552,5268,4387,3933,4950,4359,
372 6021,5910,5075,3579,6358,4234,4566,5521,6359,3613,5049,6022,5911,3375,3702,3178,
373 4911,5339,4521,6582,6583,4395,3087,3811,5377,6023,6360,6155,4027,5171,5649,4421,
374 4249,2804,6584,2270,6585,4000,4235,3045,6156,5137,5729,4140,4312,3886,6361,4330,
375 6157,4215,6158,3500,3676,4929,4331,3713,4930,5912,4265,3776,3368,5587,4470,4855,
376 3038,4980,3631,6159,6160,4132,4680,6161,6362,3923,4379,5588,4255,6586,4121,6587,
377 6363,4649,6364,3288,4773,4774,6162,6024,6365,3543,6588,4274,3107,3737,5050,5803,
378 4797,4522,5589,5051,5730,3714,4887,5378,4001,4523,6163,5026,5522,4701,4175,2791,
379 3760,6589,5473,4224,4133,3847,4814,4815,4775,3259,5416,6590,2738,6164,6025,5304,
380 3733,5076,5650,4816,5590,6591,6165,6592,3934,5269,6593,3396,5340,6594,5804,3445,
381 3602,4042,4488,5731,5732,3525,5591,4601,5196,6166,6026,5172,3642,4612,3202,4506,
382 4798,6366,3818,5108,4303,5138,5139,4776,3332,4304,2915,3415,4434,5077,5109,4856,
383 2879,5305,4817,6595,5913,3104,3144,3903,4634,5341,3133,5110,5651,5805,6167,4057,
384 5592,2945,4371,5593,6596,3474,4182,6367,6597,6168,4507,4279,6598,2822,6599,4777,
385 4713,5594,3829,6169,3887,5417,6170,3653,5474,6368,4216,2971,5228,3790,4579,6369,
386 5733,6600,6601,4951,4746,4555,6602,5418,5475,6027,3400,4665,5806,6171,4799,6028,
387 5052,6172,3343,4800,4747,5006,6370,4556,4217,5476,4396,5229,5379,5477,3839,5914,
388 5652,5807,4714,3068,4635,5808,6173,5342,4192,5078,5419,5523,5734,6174,4557,6175,
389 4602,6371,6176,6603,5809,6372,5735,4260,3869,5111,5230,6029,5112,6177,3126,4681,
390 5524,5915,2706,3563,4748,3130,6178,4018,5525,6604,6605,5478,4012,4837,6606,4534,
391 4193,5810,4857,3615,5479,6030,4082,3697,3539,4086,5270,3662,4508,4931,5916,4912,
392 5811,5027,3888,6607,4397,3527,3302,3798,2775,2921,2637,3966,4122,4388,4028,4054,
393 1633,4858,5079,3024,5007,3982,3412,5736,6608,3426,3236,5595,3030,6179,3427,3336,
394 3279,3110,6373,3874,3039,5080,5917,5140,4489,3119,6374,5812,3405,4494,6031,4666,
395 4141,6180,4166,6032,5813,4981,6609,5081,4422,4982,4112,3915,5653,3296,3983,6375,
396 4266,4410,5654,6610,6181,3436,5082,6611,5380,6033,3819,5596,4535,5231,5306,5113,
397 6612,4952,5918,4275,3113,6613,6376,6182,6183,5814,3073,4731,4838,5008,3831,6614,
398 4888,3090,3848,4280,5526,5232,3014,5655,5009,5737,5420,5527,6615,5815,5343,5173,
399 5381,4818,6616,3151,4953,6617,5738,2796,3204,4360,2989,4281,5739,5174,5421,5197,
400 3132,5141,3849,5142,5528,5083,3799,3904,4839,5480,2880,4495,3448,6377,6184,5271,
401 5919,3771,3193,6034,6035,5920,5010,6036,5597,6037,6378,6038,3106,5422,6618,5423,
402 5424,4142,6619,4889,5084,4890,4313,5740,6620,3437,5175,5307,5816,4199,5198,5529,
403 5817,5199,5656,4913,5028,5344,3850,6185,2955,5272,5011,5818,4567,4580,5029,5921,
404 3616,5233,6621,6622,6186,4176,6039,6379,6380,3352,5200,5273,2908,5598,5234,3837,
405 5308,6623,6624,5819,4496,4323,5309,5201,6625,6626,4983,3194,3838,4167,5530,5922,
406 5274,6381,6382,3860,3861,5599,3333,4292,4509,6383,3553,5481,5820,5531,4778,6187,
407 3955,3956,4324,4389,4218,3945,4325,3397,2681,5923,4779,5085,4019,5482,4891,5382,
408 5383,6040,4682,3425,5275,4094,6627,5310,3015,5483,5657,4398,5924,3168,4819,6628,
409 5925,6629,5532,4932,4613,6041,6630,4636,6384,4780,4204,5658,4423,5821,3989,4683,
410 5822,6385,4954,6631,5345,6188,5425,5012,5384,3894,6386,4490,4104,6632,5741,5053,
411 6633,5823,5926,5659,5660,5927,6634,5235,5742,5824,4840,4933,4820,6387,4859,5928,
412 4955,6388,4143,3584,5825,5346,5013,6635,5661,6389,5014,5484,5743,4337,5176,5662,
413 6390,2836,6391,3268,6392,6636,6042,5236,6637,4158,6638,5744,5663,4471,5347,3663,
414 4123,5143,4293,3895,6639,6640,5311,5929,5826,3800,6189,6393,6190,5664,5348,3554,
415 3594,4749,4603,6641,5385,4801,6043,5827,4183,6642,5312,5426,4761,6394,5665,6191,
416 4715,2669,6643,6644,5533,3185,5427,5086,5930,5931,5386,6192,6044,6645,4781,4013,
417 5745,4282,4435,5534,4390,4267,6045,5746,4984,6046,2743,6193,3501,4087,5485,5932,
418 5428,4184,4095,5747,4061,5054,3058,3862,5933,5600,6646,5144,3618,6395,3131,5055,
419 5313,6396,4650,4956,3855,6194,3896,5202,4985,4029,4225,6195,6647,5828,5486,5829,
420 3589,3002,6648,6397,4782,5276,6649,6196,6650,4105,3803,4043,5237,5830,6398,4096,
421 3643,6399,3528,6651,4453,3315,4637,6652,3984,6197,5535,3182,3339,6653,3096,2660,
422 6400,6654,3449,5934,4250,4236,6047,6401,5831,6655,5487,3753,4062,5832,6198,6199,
423 6656,3766,6657,3403,4667,6048,6658,4338,2897,5833,3880,2797,3780,4326,6659,5748,
424 5015,6660,5387,4351,5601,4411,6661,3654,4424,5935,4339,4072,5277,4568,5536,6402,
425 6662,5238,6663,5349,5203,6200,5204,6201,5145,4536,5016,5056,4762,5834,4399,4957,
426 6202,6403,5666,5749,6664,4340,6665,5936,5177,5667,6666,6667,3459,4668,6404,6668,
427 6669,4543,6203,6670,4276,6405,4480,5537,6671,4614,5205,5668,6672,3348,2193,4763,
428 6406,6204,5937,5602,4177,5669,3419,6673,4020,6205,4443,4569,5388,3715,3639,6407,
429 6049,4058,6206,6674,5938,4544,6050,4185,4294,4841,4651,4615,5488,6207,6408,6051,
430 5178,3241,3509,5835,6208,4958,5836,4341,5489,5278,6209,2823,5538,5350,5206,5429,
431 6675,4638,4875,4073,3516,4684,4914,4860,5939,5603,5389,6052,5057,3237,5490,3791,
432 6676,6409,6677,4821,4915,4106,5351,5058,4243,5539,4244,5604,4842,4916,5239,3028,
433 3716,5837,5114,5605,5390,5940,5430,6210,4332,6678,5540,4732,3667,3840,6053,4305,
434 3408,5670,5541,6410,2744,5240,5750,6679,3234,5606,6680,5607,5671,3608,4283,4159,
435 4400,5352,4783,6681,6411,6682,4491,4802,6211,6412,5941,6413,6414,5542,5751,6683,
436 4669,3734,5942,6684,6415,5943,5059,3328,4670,4144,4268,6685,6686,6687,6688,4372,
437 3603,6689,5944,5491,4373,3440,6416,5543,4784,4822,5608,3792,4616,5838,5672,3514,
438 5391,6417,4892,6690,4639,6691,6054,5673,5839,6055,6692,6056,5392,6212,4038,5544,
439 5674,4497,6057,6693,5840,4284,5675,4021,4545,5609,6418,4454,6419,6213,4113,4472,
440 5314,3738,5087,5279,4074,5610,4959,4063,3179,4750,6058,6420,6214,3476,4498,4716,
441 5431,4960,4685,6215,5241,6694,6421,6216,6695,5841,5945,6422,3748,5946,5179,3905,
442 5752,5545,5947,4374,6217,4455,6423,4412,6218,4803,5353,6696,3832,5280,6219,4327,
443 4702,6220,6221,6059,4652,5432,6424,3749,4751,6425,5753,4986,5393,4917,5948,5030,
444 5754,4861,4733,6426,4703,6697,6222,4671,5949,4546,4961,5180,6223,5031,3316,5281,
445 6698,4862,4295,4934,5207,3644,6427,5842,5950,6428,6429,4570,5843,5282,6430,6224,
446 5088,3239,6060,6699,5844,5755,6061,6431,2701,5546,6432,5115,5676,4039,3993,3327,
447 4752,4425,5315,6433,3941,6434,5677,4617,4604,3074,4581,6225,5433,6435,6226,6062,
448 4823,5756,5116,6227,3717,5678,4717,5845,6436,5679,5846,6063,5847,6064,3977,3354,
449 6437,3863,5117,6228,5547,5394,4499,4524,6229,4605,6230,4306,4500,6700,5951,6065,
450 3693,5952,5089,4366,4918,6701,6231,5548,6232,6702,6438,4704,5434,6703,6704,5953,
451 4168,6705,5680,3420,6706,5242,4407,6066,3812,5757,5090,5954,4672,4525,3481,5681,
452 4618,5395,5354,5316,5955,6439,4962,6707,4526,6440,3465,4673,6067,6441,5682,6708,
453 5435,5492,5758,5683,4619,4571,4674,4804,4893,4686,5493,4753,6233,6068,4269,6442,
454 6234,5032,4705,5146,5243,5208,5848,6235,6443,4963,5033,4640,4226,6236,5849,3387,
455 6444,6445,4436,4437,5850,4843,5494,4785,4894,6709,4361,6710,5091,5956,3331,6237,
456 4987,5549,6069,6711,4342,3517,4473,5317,6070,6712,6071,4706,6446,5017,5355,6713,
457 6714,4988,5436,6447,4734,5759,6715,4735,4547,4456,4754,6448,5851,6449,6450,3547,
458 5852,5318,6451,6452,5092,4205,6716,6238,4620,4219,5611,6239,6072,4481,5760,5957,
459 5958,4059,6240,6453,4227,4537,6241,5761,4030,4186,5244,5209,3761,4457,4876,3337,
460 5495,5181,6242,5959,5319,5612,5684,5853,3493,5854,6073,4169,5613,5147,4895,6074,
461 5210,6717,5182,6718,3830,6243,2798,3841,6075,6244,5855,5614,3604,4606,5496,5685,
462 5118,5356,6719,6454,5960,5357,5961,6720,4145,3935,4621,5119,5962,4261,6721,6455,
463 4786,5963,4375,4582,6245,6246,6247,6076,5437,4877,5856,3376,4380,6248,4160,6722,
464 5148,6456,5211,6457,6723,4718,6458,6724,6249,5358,4044,3297,6459,6250,5857,5615,
465 5497,5245,6460,5498,6725,6251,6252,5550,3793,5499,2959,5396,6461,6462,4572,5093,
466 5500,5964,3806,4146,6463,4426,5762,5858,6077,6253,4755,3967,4220,5965,6254,4989,
467 5501,6464,4352,6726,6078,4764,2290,5246,3906,5438,5283,3767,4964,2861,5763,5094,
468 6255,6256,4622,5616,5859,5860,4707,6727,4285,4708,4824,5617,6257,5551,4787,5212,
469 4965,4935,4687,6465,6728,6466,5686,6079,3494,4413,2995,5247,5966,5618,6729,5967,
470 5764,5765,5687,5502,6730,6731,6080,5397,6467,4990,6258,6732,4538,5060,5619,6733,
471 4719,5688,5439,5018,5149,5284,5503,6734,6081,4607,6259,5120,3645,5861,4583,6260,
472 4584,4675,5620,4098,5440,6261,4863,2379,3306,4585,5552,5689,4586,5285,6735,4864,
473 6736,5286,6082,6737,4623,3010,4788,4381,4558,5621,4587,4896,3698,3161,5248,4353,
474 4045,6262,3754,5183,4588,6738,6263,6739,6740,5622,3936,6741,6468,6742,6264,5095,
475 6469,4991,5968,6743,4992,6744,6083,4897,6745,4256,5766,4307,3108,3968,4444,5287,
476 3889,4343,6084,4510,6085,4559,6086,4898,5969,6746,5623,5061,4919,5249,5250,5504,
477 5441,6265,5320,4878,3242,5862,5251,3428,6087,6747,4237,5624,5442,6266,5553,4539,
478 6748,2585,3533,5398,4262,6088,5150,4736,4438,6089,6267,5505,4966,6749,6268,6750,
479 6269,5288,5554,3650,6090,6091,4624,6092,5690,6751,5863,4270,5691,4277,5555,5864,
480 6752,5692,4720,4865,6470,5151,4688,4825,6753,3094,6754,6471,3235,4653,6755,5213,
481 5399,6756,3201,4589,5865,4967,6472,5866,6473,5019,3016,6757,5321,4756,3957,4573,
482 6093,4993,5767,4721,6474,6758,5625,6759,4458,6475,6270,6760,5556,4994,5214,5252,
483 6271,3875,5768,6094,5034,5506,4376,5769,6761,2120,6476,5253,5770,6762,5771,5970,
484 3990,5971,5557,5558,5772,6477,6095,2787,4641,5972,5121,6096,6097,6272,6763,3703,
485 5867,5507,6273,4206,6274,4789,6098,6764,3619,3646,3833,3804,2394,3788,4936,3978,
486 4866,4899,6099,6100,5559,6478,6765,3599,5868,6101,5869,5870,6275,6766,4527,6767,
487 *******************************************************************************/
488 };
489
490
+0
-589
c/src/JISFreq.tab less more
0 /* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
1 /* ***** BEGIN LICENSE BLOCK *****
2 * Version: MPL 1.1/GPL 2.0/LGPL 2.1
3 *
4 * The contents of this file are subject to the Mozilla Public License Version
5 * 1.1 (the "License"); you may not use this file except in compliance with
6 * the License. You may obtain a copy of the License at
7 * http://www.mozilla.org/MPL/
8 *
9 * Software distributed under the License is distributed on an "AS IS" basis,
10 * WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License
11 * for the specific language governing rights and limitations under the
12 * License.
13 *
14 * The Original Code is Mozilla Communicator client code.
15 *
16 * The Initial Developer of the Original Code is
17 * Netscape Communications Corporation.
18 * Portions created by the Initial Developer are Copyright (C) 1998
19 * the Initial Developer. All Rights Reserved.
20 *
21 * Contributor(s):
22 *
23 * Alternatively, the contents of this file may be used under the terms of
24 * either the GNU General Public License Version 2 or later (the "GPL"), or
25 * the GNU Lesser General Public License Version 2.1 or later (the "LGPL"),
26 * in which case the provisions of the GPL or the LGPL are applicable instead
27 * of those above. If you wish to allow use of your version of this file only
28 * under the terms of either the GPL or the LGPL, and not to allow others to
29 * use your version of this file under the terms of the MPL, indicate your
30 * decision by deleting the provisions above and replace them with the notice
31 * and other provisions required by the GPL or the LGPL. If you do not delete
32 * the provisions above, a recipient may use your version of this file under
33 * the terms of any one of the MPL, the GPL or the LGPL.
34 *
35 * ***** END LICENSE BLOCK ***** */
36
37 //Sampling from about 20M text materials include literature and computer technology
38
39 // Japanese frequency table, applied to both S-JIS and EUC-JP
40 //They are sorted in order.
41
42 /******************************************************************************
43 * 128 --> 0.77094
44 * 256 --> 0.85710
45 * 512 --> 0.92635
46 * 1024 --> 0.97130
47 * 2048 --> 0.99431
48 *
49 * Idea Distribution Ratio = 0.92635 / (1-0.92635) = 12.58
50 * Random Distribution Ration = 512 / (2965+62+83+86-512) = 0.191
51 *
52 * Typical Distribution Ratio, 25% of IDR
53 *****************************************************************************/
54
55 #define JIS_TYPICAL_DISTRIBUTION_RATIO (float) 3.0
56
57
58 //Char to FreqOrder table ,
59 #define JIS_TABLE_SIZE 4368
60
61 static const PRInt16 JISCharToFreqOrder[] =
62 {
63 40, 1, 6, 182, 152, 180, 295,2127, 285, 381,3295,4304,3068,4606,3165,3510, // 16
64 3511,1822,2785,4607,1193,2226,5070,4608, 171,2996,1247, 18, 179,5071, 856,1661, // 32
65 1262,5072, 619, 127,3431,3512,3230,1899,1700, 232, 228,1294,1298, 284, 283,2041, // 48
66 2042,1061,1062, 48, 49, 44, 45, 433, 434,1040,1041, 996, 787,2997,1255,4305, // 64
67 2108,4609,1684,1648,5073,5074,5075,5076,5077,5078,3687,5079,4610,5080,3927,3928, // 80
68 5081,3296,3432, 290,2285,1471,2187,5082,2580,2825,1303,2140,1739,1445,2691,3375, // 96
69 1691,3297,4306,4307,4611, 452,3376,1182,2713,3688,3069,4308,5083,5084,5085,5086, // 112
70 5087,5088,5089,5090,5091,5092,5093,5094,5095,5096,5097,5098,5099,5100,5101,5102, // 128
71 5103,5104,5105,5106,5107,5108,5109,5110,5111,5112,4097,5113,5114,5115,5116,5117, // 144
72 5118,5119,5120,5121,5122,5123,5124,5125,5126,5127,5128,5129,5130,5131,5132,5133, // 160
73 5134,5135,5136,5137,5138,5139,5140,5141,5142,5143,5144,5145,5146,5147,5148,5149, // 176
74 5150,5151,5152,4612,5153,5154,5155,5156,5157,5158,5159,5160,5161,5162,5163,5164, // 192
75 5165,5166,5167,5168,5169,5170,5171,5172,5173,5174,5175,1472, 598, 618, 820,1205, // 208
76 1309,1412,1858,1307,1692,5176,5177,5178,5179,5180,5181,5182,1142,1452,1234,1172, // 224
77 1875,2043,2149,1793,1382,2973, 925,2404,1067,1241, 960,1377,2935,1491, 919,1217, // 240
78 1865,2030,1406,1499,2749,4098,5183,5184,5185,5186,5187,5188,2561,4099,3117,1804, // 256
79 2049,3689,4309,3513,1663,5189,3166,3118,3298,1587,1561,3433,5190,3119,1625,2998, // 272
80 3299,4613,1766,3690,2786,4614,5191,5192,5193,5194,2161, 26,3377, 2,3929, 20, // 288
81 3691, 47,4100, 50, 17, 16, 35, 268, 27, 243, 42, 155, 24, 154, 29, 184, // 304
82 4, 91, 14, 92, 53, 396, 33, 289, 9, 37, 64, 620, 21, 39, 321, 5, // 320
83 12, 11, 52, 13, 3, 208, 138, 0, 7, 60, 526, 141, 151,1069, 181, 275, // 336
84 1591, 83, 132,1475, 126, 331, 829, 15, 69, 160, 59, 22, 157, 55,1079, 312, // 352
85 109, 38, 23, 25, 10, 19, 79,5195, 61, 382,1124, 8, 30,5196,5197,5198, // 368
86 5199,5200,5201,5202,5203,5204,5205,5206, 89, 62, 74, 34,2416, 112, 139, 196, // 384
87 271, 149, 84, 607, 131, 765, 46, 88, 153, 683, 76, 874, 101, 258, 57, 80, // 400
88 32, 364, 121,1508, 169,1547, 68, 235, 145,2999, 41, 360,3027, 70, 63, 31, // 416
89 43, 259, 262,1383, 99, 533, 194, 66, 93, 846, 217, 192, 56, 106, 58, 565, // 432
90 280, 272, 311, 256, 146, 82, 308, 71, 100, 128, 214, 655, 110, 261, 104,1140, // 448
91 54, 51, 36, 87, 67,3070, 185,2618,2936,2020, 28,1066,2390,2059,5207,5208, // 464
92 5209,5210,5211,5212,5213,5214,5215,5216,4615,5217,5218,5219,5220,5221,5222,5223, // 480
93 5224,5225,5226,5227,5228,5229,5230,5231,5232,5233,5234,5235,5236,3514,5237,5238, // 496
94 5239,5240,5241,5242,5243,5244,2297,2031,4616,4310,3692,5245,3071,5246,3598,5247, // 512
95 4617,3231,3515,5248,4101,4311,4618,3808,4312,4102,5249,4103,4104,3599,5250,5251, // 528
96 5252,5253,5254,5255,5256,5257,5258,5259,5260,5261,5262,5263,5264,5265,5266,5267, // 544
97 5268,5269,5270,5271,5272,5273,5274,5275,5276,5277,5278,5279,5280,5281,5282,5283, // 560
98 5284,5285,5286,5287,5288,5289,5290,5291,5292,5293,5294,5295,5296,5297,5298,5299, // 576
99 5300,5301,5302,5303,5304,5305,5306,5307,5308,5309,5310,5311,5312,5313,5314,5315, // 592
100 5316,5317,5318,5319,5320,5321,5322,5323,5324,5325,5326,5327,5328,5329,5330,5331, // 608
101 5332,5333,5334,5335,5336,5337,5338,5339,5340,5341,5342,5343,5344,5345,5346,5347, // 624
102 5348,5349,5350,5351,5352,5353,5354,5355,5356,5357,5358,5359,5360,5361,5362,5363, // 640
103 5364,5365,5366,5367,5368,5369,5370,5371,5372,5373,5374,5375,5376,5377,5378,5379, // 656
104 5380,5381, 363, 642,2787,2878,2788,2789,2316,3232,2317,3434,2011, 165,1942,3930, // 672
105 3931,3932,3933,5382,4619,5383,4620,5384,5385,5386,5387,5388,5389,5390,5391,5392, // 688
106 5393,5394,5395,5396,5397,5398,5399,5400,5401,5402,5403,5404,5405,5406,5407,5408, // 704
107 5409,5410,5411,5412,5413,5414,5415,5416,5417,5418,5419,5420,5421,5422,5423,5424, // 720
108 5425,5426,5427,5428,5429,5430,5431,5432,5433,5434,5435,5436,5437,5438,5439,5440, // 736
109 5441,5442,5443,5444,5445,5446,5447,5448,5449,5450,5451,5452,5453,5454,5455,5456, // 752
110 5457,5458,5459,5460,5461,5462,5463,5464,5465,5466,5467,5468,5469,5470,5471,5472, // 768
111 5473,5474,5475,5476,5477,5478,5479,5480,5481,5482,5483,5484,5485,5486,5487,5488, // 784
112 5489,5490,5491,5492,5493,5494,5495,5496,5497,5498,5499,5500,5501,5502,5503,5504, // 800
113 5505,5506,5507,5508,5509,5510,5511,5512,5513,5514,5515,5516,5517,5518,5519,5520, // 816
114 5521,5522,5523,5524,5525,5526,5527,5528,5529,5530,5531,5532,5533,5534,5535,5536, // 832
115 5537,5538,5539,5540,5541,5542,5543,5544,5545,5546,5547,5548,5549,5550,5551,5552, // 848
116 5553,5554,5555,5556,5557,5558,5559,5560,5561,5562,5563,5564,5565,5566,5567,5568, // 864
117 5569,5570,5571,5572,5573,5574,5575,5576,5577,5578,5579,5580,5581,5582,5583,5584, // 880
118 5585,5586,5587,5588,5589,5590,5591,5592,5593,5594,5595,5596,5597,5598,5599,5600, // 896
119 5601,5602,5603,5604,5605,5606,5607,5608,5609,5610,5611,5612,5613,5614,5615,5616, // 912
120 5617,5618,5619,5620,5621,5622,5623,5624,5625,5626,5627,5628,5629,5630,5631,5632, // 928
121 5633,5634,5635,5636,5637,5638,5639,5640,5641,5642,5643,5644,5645,5646,5647,5648, // 944
122 5649,5650,5651,5652,5653,5654,5655,5656,5657,5658,5659,5660,5661,5662,5663,5664, // 960
123 5665,5666,5667,5668,5669,5670,5671,5672,5673,5674,5675,5676,5677,5678,5679,5680, // 976
124 5681,5682,5683,5684,5685,5686,5687,5688,5689,5690,5691,5692,5693,5694,5695,5696, // 992
125 5697,5698,5699,5700,5701,5702,5703,5704,5705,5706,5707,5708,5709,5710,5711,5712, // 1008
126 5713,5714,5715,5716,5717,5718,5719,5720,5721,5722,5723,5724,5725,5726,5727,5728, // 1024
127 5729,5730,5731,5732,5733,5734,5735,5736,5737,5738,5739,5740,5741,5742,5743,5744, // 1040
128 5745,5746,5747,5748,5749,5750,5751,5752,5753,5754,5755,5756,5757,5758,5759,5760, // 1056
129 5761,5762,5763,5764,5765,5766,5767,5768,5769,5770,5771,5772,5773,5774,5775,5776, // 1072
130 5777,5778,5779,5780,5781,5782,5783,5784,5785,5786,5787,5788,5789,5790,5791,5792, // 1088
131 5793,5794,5795,5796,5797,5798,5799,5800,5801,5802,5803,5804,5805,5806,5807,5808, // 1104
132 5809,5810,5811,5812,5813,5814,5815,5816,5817,5818,5819,5820,5821,5822,5823,5824, // 1120
133 5825,5826,5827,5828,5829,5830,5831,5832,5833,5834,5835,5836,5837,5838,5839,5840, // 1136
134 5841,5842,5843,5844,5845,5846,5847,5848,5849,5850,5851,5852,5853,5854,5855,5856, // 1152
135 5857,5858,5859,5860,5861,5862,5863,5864,5865,5866,5867,5868,5869,5870,5871,5872, // 1168
136 5873,5874,5875,5876,5877,5878,5879,5880,5881,5882,5883,5884,5885,5886,5887,5888, // 1184
137 5889,5890,5891,5892,5893,5894,5895,5896,5897,5898,5899,5900,5901,5902,5903,5904, // 1200
138 5905,5906,5907,5908,5909,5910,5911,5912,5913,5914,5915,5916,5917,5918,5919,5920, // 1216
139 5921,5922,5923,5924,5925,5926,5927,5928,5929,5930,5931,5932,5933,5934,5935,5936, // 1232
140 5937,5938,5939,5940,5941,5942,5943,5944,5945,5946,5947,5948,5949,5950,5951,5952, // 1248
141 5953,5954,5955,5956,5957,5958,5959,5960,5961,5962,5963,5964,5965,5966,5967,5968, // 1264
142 5969,5970,5971,5972,5973,5974,5975,5976,5977,5978,5979,5980,5981,5982,5983,5984, // 1280
143 5985,5986,5987,5988,5989,5990,5991,5992,5993,5994,5995,5996,5997,5998,5999,6000, // 1296
144 6001,6002,6003,6004,6005,6006,6007,6008,6009,6010,6011,6012,6013,6014,6015,6016, // 1312
145 6017,6018,6019,6020,6021,6022,6023,6024,6025,6026,6027,6028,6029,6030,6031,6032, // 1328
146 6033,6034,6035,6036,6037,6038,6039,6040,6041,6042,6043,6044,6045,6046,6047,6048, // 1344
147 6049,6050,6051,6052,6053,6054,6055,6056,6057,6058,6059,6060,6061,6062,6063,6064, // 1360
148 6065,6066,6067,6068,6069,6070,6071,6072,6073,6074,6075,6076,6077,6078,6079,6080, // 1376
149 6081,6082,6083,6084,6085,6086,6087,6088,6089,6090,6091,6092,6093,6094,6095,6096, // 1392
150 6097,6098,6099,6100,6101,6102,6103,6104,6105,6106,6107,6108,6109,6110,6111,6112, // 1408
151 6113,6114,2044,2060,4621, 997,1235, 473,1186,4622, 920,3378,6115,6116, 379,1108, // 1424
152 4313,2657,2735,3934,6117,3809, 636,3233, 573,1026,3693,3435,2974,3300,2298,4105, // 1440
153 854,2937,2463, 393,2581,2417, 539, 752,1280,2750,2480, 140,1161, 440, 708,1569, // 1456
154 665,2497,1746,1291,1523,3000, 164,1603, 847,1331, 537,1997, 486, 508,1693,2418, // 1472
155 1970,2227, 878,1220, 299,1030, 969, 652,2751, 624,1137,3301,2619, 65,3302,2045, // 1488
156 1761,1859,3120,1930,3694,3516, 663,1767, 852, 835,3695, 269, 767,2826,2339,1305, // 1504
157 896,1150, 770,1616,6118, 506,1502,2075,1012,2519, 775,2520,2975,2340,2938,4314, // 1520
158 3028,2086,1224,1943,2286,6119,3072,4315,2240,1273,1987,3935,1557, 175, 597, 985, // 1536
159 3517,2419,2521,1416,3029, 585, 938,1931,1007,1052,1932,1685,6120,3379,4316,4623, // 1552
160 804, 599,3121,1333,2128,2539,1159,1554,2032,3810, 687,2033,2904, 952, 675,1467, // 1568
161 3436,6121,2241,1096,1786,2440,1543,1924, 980,1813,2228, 781,2692,1879, 728,1918, // 1584
162 3696,4624, 548,1950,4625,1809,1088,1356,3303,2522,1944, 502, 972, 373, 513,2827, // 1600
163 586,2377,2391,1003,1976,1631,6122,2464,1084, 648,1776,4626,2141, 324, 962,2012, // 1616
164 2177,2076,1384, 742,2178,1448,1173,1810, 222, 102, 301, 445, 125,2420, 662,2498, // 1632
165 277, 200,1476,1165,1068, 224,2562,1378,1446, 450,1880, 659, 791, 582,4627,2939, // 1648
166 3936,1516,1274, 555,2099,3697,1020,1389,1526,3380,1762,1723,1787,2229, 412,2114, // 1664
167 1900,2392,3518, 512,2597, 427,1925,2341,3122,1653,1686,2465,2499, 697, 330, 273, // 1680
168 380,2162, 951, 832, 780, 991,1301,3073, 965,2270,3519, 668,2523,2636,1286, 535, // 1696
169 1407, 518, 671, 957,2658,2378, 267, 611,2197,3030,6123, 248,2299, 967,1799,2356, // 1712
170 850,1418,3437,1876,1256,1480,2828,1718,6124,6125,1755,1664,2405,6126,4628,2879, // 1728
171 2829, 499,2179, 676,4629, 557,2329,2214,2090, 325,3234, 464, 811,3001, 992,2342, // 1744
172 2481,1232,1469, 303,2242, 466,1070,2163, 603,1777,2091,4630,2752,4631,2714, 322, // 1760
173 2659,1964,1768, 481,2188,1463,2330,2857,3600,2092,3031,2421,4632,2318,2070,1849, // 1776
174 2598,4633,1302,2254,1668,1701,2422,3811,2905,3032,3123,2046,4106,1763,1694,4634, // 1792
175 1604, 943,1724,1454, 917, 868,2215,1169,2940, 552,1145,1800,1228,1823,1955, 316, // 1808
176 1080,2510, 361,1807,2830,4107,2660,3381,1346,1423,1134,4108,6127, 541,1263,1229, // 1824
177 1148,2540, 545, 465,1833,2880,3438,1901,3074,2482, 816,3937, 713,1788,2500, 122, // 1840
178 1575, 195,1451,2501,1111,6128, 859, 374,1225,2243,2483,4317, 390,1033,3439,3075, // 1856
179 2524,1687, 266, 793,1440,2599, 946, 779, 802, 507, 897,1081, 528,2189,1292, 711, // 1872
180 1866,1725,1167,1640, 753, 398,2661,1053, 246, 348,4318, 137,1024,3440,1600,2077, // 1888
181 2129, 825,4319, 698, 238, 521, 187,2300,1157,2423,1641,1605,1464,1610,1097,2541, // 1904
182 1260,1436, 759,2255,1814,2150, 705,3235, 409,2563,3304, 561,3033,2005,2564, 726, // 1920
183 1956,2343,3698,4109, 949,3812,3813,3520,1669, 653,1379,2525, 881,2198, 632,2256, // 1936
184 1027, 778,1074, 733,1957, 514,1481,2466, 554,2180, 702,3938,1606,1017,1398,6129, // 1952
185 1380,3521, 921, 993,1313, 594, 449,1489,1617,1166, 768,1426,1360, 495,1794,3601, // 1968
186 1177,3602,1170,4320,2344, 476, 425,3167,4635,3168,1424, 401,2662,1171,3382,1998, // 1984
187 1089,4110, 477,3169, 474,6130,1909, 596,2831,1842, 494, 693,1051,1028,1207,3076, // 2000
188 606,2115, 727,2790,1473,1115, 743,3522, 630, 805,1532,4321,2021, 366,1057, 838, // 2016
189 684,1114,2142,4322,2050,1492,1892,1808,2271,3814,2424,1971,1447,1373,3305,1090, // 2032
190 1536,3939,3523,3306,1455,2199, 336, 369,2331,1035, 584,2393, 902, 718,2600,6131, // 2048
191 2753, 463,2151,1149,1611,2467, 715,1308,3124,1268, 343,1413,3236,1517,1347,2663, // 2064
192 2093,3940,2022,1131,1553,2100,2941,1427,3441,2942,1323,2484,6132,1980, 872,2368, // 2080
193 2441,2943, 320,2369,2116,1082, 679,1933,3941,2791,3815, 625,1143,2023, 422,2200, // 2096
194 3816,6133, 730,1695, 356,2257,1626,2301,2858,2637,1627,1778, 937, 883,2906,2693, // 2112
195 3002,1769,1086, 400,1063,1325,3307,2792,4111,3077, 456,2345,1046, 747,6134,1524, // 2128
196 884,1094,3383,1474,2164,1059, 974,1688,2181,2258,1047, 345,1665,1187, 358, 875, // 2144
197 3170, 305, 660,3524,2190,1334,1135,3171,1540,1649,2542,1527, 927, 968,2793, 885, // 2160
198 1972,1850, 482, 500,2638,1218,1109,1085,2543,1654,2034, 876, 78,2287,1482,1277, // 2176
199 861,1675,1083,1779, 724,2754, 454, 397,1132,1612,2332, 893, 672,1237, 257,2259, // 2192
200 2370, 135,3384, 337,2244, 547, 352, 340, 709,2485,1400, 788,1138,2511, 540, 772, // 2208
201 1682,2260,2272,2544,2013,1843,1902,4636,1999,1562,2288,4637,2201,1403,1533, 407, // 2224
202 576,3308,1254,2071, 978,3385, 170, 136,1201,3125,2664,3172,2394, 213, 912, 873, // 2240
203 3603,1713,2202, 699,3604,3699, 813,3442, 493, 531,1054, 468,2907,1483, 304, 281, // 2256
204 4112,1726,1252,2094, 339,2319,2130,2639, 756,1563,2944, 748, 571,2976,1588,2425, // 2272
205 2715,1851,1460,2426,1528,1392,1973,3237, 288,3309, 685,3386, 296, 892,2716,2216, // 2288
206 1570,2245, 722,1747,2217, 905,3238,1103,6135,1893,1441,1965, 251,1805,2371,3700, // 2304
207 2601,1919,1078, 75,2182,1509,1592,1270,2640,4638,2152,6136,3310,3817, 524, 706, // 2320
208 1075, 292,3818,1756,2602, 317, 98,3173,3605,3525,1844,2218,3819,2502, 814, 567, // 2336
209 385,2908,1534,6137, 534,1642,3239, 797,6138,1670,1529, 953,4323, 188,1071, 538, // 2352
210 178, 729,3240,2109,1226,1374,2000,2357,2977, 731,2468,1116,2014,2051,6139,1261, // 2368
211 1593, 803,2859,2736,3443, 556, 682, 823,1541,6140,1369,2289,1706,2794, 845, 462, // 2384
212 2603,2665,1361, 387, 162,2358,1740, 739,1770,1720,1304,1401,3241,1049, 627,1571, // 2400
213 2427,3526,1877,3942,1852,1500, 431,1910,1503, 677, 297,2795, 286,1433,1038,1198, // 2416
214 2290,1133,1596,4113,4639,2469,1510,1484,3943,6141,2442, 108, 712,4640,2372, 866, // 2432
215 3701,2755,3242,1348, 834,1945,1408,3527,2395,3243,1811, 824, 994,1179,2110,1548, // 2448
216 1453, 790,3003, 690,4324,4325,2832,2909,3820,1860,3821, 225,1748, 310, 346,1780, // 2464
217 2470, 821,1993,2717,2796, 828, 877,3528,2860,2471,1702,2165,2910,2486,1789, 453, // 2480
218 359,2291,1676, 73,1164,1461,1127,3311, 421, 604, 314,1037, 589, 116,2487, 737, // 2496
219 837,1180, 111, 244, 735,6142,2261,1861,1362, 986, 523, 418, 581,2666,3822, 103, // 2512
220 855, 503,1414,1867,2488,1091, 657,1597, 979, 605,1316,4641,1021,2443,2078,2001, // 2528
221 1209, 96, 587,2166,1032, 260,1072,2153, 173, 94, 226,3244, 819,2006,4642,4114, // 2544
222 2203, 231,1744, 782, 97,2667, 786,3387, 887, 391, 442,2219,4326,1425,6143,2694, // 2560
223 633,1544,1202, 483,2015, 592,2052,1958,2472,1655, 419, 129,4327,3444,3312,1714, // 2576
224 1257,3078,4328,1518,1098, 865,1310,1019,1885,1512,1734, 469,2444, 148, 773, 436, // 2592
225 1815,1868,1128,1055,4329,1245,2756,3445,2154,1934,1039,4643, 579,1238, 932,2320, // 2608
226 353, 205, 801, 115,2428, 944,2321,1881, 399,2565,1211, 678, 766,3944, 335,2101, // 2624
227 1459,1781,1402,3945,2737,2131,1010, 844, 981,1326,1013, 550,1816,1545,2620,1335, // 2640
228 1008, 371,2881, 936,1419,1613,3529,1456,1395,2273,1834,2604,1317,2738,2503, 416, // 2656
229 1643,4330, 806,1126, 229, 591,3946,1314,1981,1576,1837,1666, 347,1790, 977,3313, // 2672
230 764,2861,1853, 688,2429,1920,1462, 77, 595, 415,2002,3034, 798,1192,4115,6144, // 2688
231 2978,4331,3035,2695,2582,2072,2566, 430,2430,1727, 842,1396,3947,3702, 613, 377, // 2704
232 278, 236,1417,3388,3314,3174, 757,1869, 107,3530,6145,1194, 623,2262, 207,1253, // 2720
233 2167,3446,3948, 492,1117,1935, 536,1838,2757,1246,4332, 696,2095,2406,1393,1572, // 2736
234 3175,1782, 583, 190, 253,1390,2230, 830,3126,3389, 934,3245,1703,1749,2979,1870, // 2752
235 2545,1656,2204, 869,2346,4116,3176,1817, 496,1764,4644, 942,1504, 404,1903,1122, // 2768
236 1580,3606,2945,1022, 515, 372,1735, 955,2431,3036,6146,2797,1110,2302,2798, 617, // 2784
237 6147, 441, 762,1771,3447,3607,3608,1904, 840,3037, 86, 939,1385, 572,1370,2445, // 2800
238 1336, 114,3703, 898, 294, 203,3315, 703,1583,2274, 429, 961,4333,1854,1951,3390, // 2816
239 2373,3704,4334,1318,1381, 966,1911,2322,1006,1155, 309, 989, 458,2718,1795,1372, // 2832
240 1203, 252,1689,1363,3177, 517,1936, 168,1490, 562, 193,3823,1042,4117,1835, 551, // 2848
241 470,4645, 395, 489,3448,1871,1465,2583,2641, 417,1493, 279,1295, 511,1236,1119, // 2864
242 72,1231,1982,1812,3004, 871,1564, 984,3449,1667,2696,2096,4646,2347,2833,1673, // 2880
243 3609, 695,3246,2668, 807,1183,4647, 890, 388,2333,1801,1457,2911,1765,1477,1031, // 2896
244 3316,3317,1278,3391,2799,2292,2526, 163,3450,4335,2669,1404,1802,6148,2323,2407, // 2912
245 1584,1728,1494,1824,1269, 298, 909,3318,1034,1632, 375, 776,1683,2061, 291, 210, // 2928
246 1123, 809,1249,1002,2642,3038, 206,1011,2132, 144, 975, 882,1565, 342, 667, 754, // 2944
247 1442,2143,1299,2303,2062, 447, 626,2205,1221,2739,2912,1144,1214,2206,2584, 760, // 2960
248 1715, 614, 950,1281,2670,2621, 810, 577,1287,2546,4648, 242,2168, 250,2643, 691, // 2976
249 123,2644, 647, 313,1029, 689,1357,2946,1650, 216, 771,1339,1306, 808,2063, 549, // 2992
250 913,1371,2913,2914,6149,1466,1092,1174,1196,1311,2605,2396,1783,1796,3079, 406, // 3008
251 2671,2117,3949,4649, 487,1825,2220,6150,2915, 448,2348,1073,6151,2397,1707, 130, // 3024
252 900,1598, 329, 176,1959,2527,1620,6152,2275,4336,3319,1983,2191,3705,3610,2155, // 3040
253 3706,1912,1513,1614,6153,1988, 646, 392,2304,1589,3320,3039,1826,1239,1352,1340, // 3056
254 2916, 505,2567,1709,1437,2408,2547, 906,6154,2672, 384,1458,1594,1100,1329, 710, // 3072
255 423,3531,2064,2231,2622,1989,2673,1087,1882, 333, 841,3005,1296,2882,2379, 580, // 3088
256 1937,1827,1293,2585, 601, 574, 249,1772,4118,2079,1120, 645, 901,1176,1690, 795, // 3104
257 2207, 478,1434, 516,1190,1530, 761,2080, 930,1264, 355, 435,1552, 644,1791, 987, // 3120
258 220,1364,1163,1121,1538, 306,2169,1327,1222, 546,2645, 218, 241, 610,1704,3321, // 3136
259 1984,1839,1966,2528, 451,6155,2586,3707,2568, 907,3178, 254,2947, 186,1845,4650, // 3152
260 745, 432,1757, 428,1633, 888,2246,2221,2489,3611,2118,1258,1265, 956,3127,1784, // 3168
261 4337,2490, 319, 510, 119, 457,3612, 274,2035,2007,4651,1409,3128, 970,2758, 590, // 3184
262 2800, 661,2247,4652,2008,3950,1420,1549,3080,3322,3951,1651,1375,2111, 485,2491, // 3200
263 1429,1156,6156,2548,2183,1495, 831,1840,2529,2446, 501,1657, 307,1894,3247,1341, // 3216
264 666, 899,2156,1539,2549,1559, 886, 349,2208,3081,2305,1736,3824,2170,2759,1014, // 3232
265 1913,1386, 542,1397,2948, 490, 368, 716, 362, 159, 282,2569,1129,1658,1288,1750, // 3248
266 2674, 276, 649,2016, 751,1496, 658,1818,1284,1862,2209,2087,2512,3451, 622,2834, // 3264
267 376, 117,1060,2053,1208,1721,1101,1443, 247,1250,3179,1792,3952,2760,2398,3953, // 3280
268 6157,2144,3708, 446,2432,1151,2570,3452,2447,2761,2835,1210,2448,3082, 424,2222, // 3296
269 1251,2449,2119,2836, 504,1581,4338, 602, 817, 857,3825,2349,2306, 357,3826,1470, // 3312
270 1883,2883, 255, 958, 929,2917,3248, 302,4653,1050,1271,1751,2307,1952,1430,2697, // 3328
271 2719,2359, 354,3180, 777, 158,2036,4339,1659,4340,4654,2308,2949,2248,1146,2232, // 3344
272 3532,2720,1696,2623,3827,6158,3129,1550,2698,1485,1297,1428, 637, 931,2721,2145, // 3360
273 914,2550,2587, 81,2450, 612, 827,2646,1242,4655,1118,2884, 472,1855,3181,3533, // 3376
274 3534, 569,1353,2699,1244,1758,2588,4119,2009,2762,2171,3709,1312,1531,6159,1152, // 3392
275 1938, 134,1830, 471,3710,2276,1112,1535,3323,3453,3535, 982,1337,2950, 488, 826, // 3408
276 674,1058,1628,4120,2017, 522,2399, 211, 568,1367,3454, 350, 293,1872,1139,3249, // 3424
277 1399,1946,3006,1300,2360,3324, 588, 736,6160,2606, 744, 669,3536,3828,6161,1358, // 3440
278 199, 723, 848, 933, 851,1939,1505,1514,1338,1618,1831,4656,1634,3613, 443,2740, // 3456
279 3829, 717,1947, 491,1914,6162,2551,1542,4121,1025,6163,1099,1223, 198,3040,2722, // 3472
280 370, 410,1905,2589, 998,1248,3182,2380, 519,1449,4122,1710, 947, 928,1153,4341, // 3488
281 2277, 344,2624,1511, 615, 105, 161,1212,1076,1960,3130,2054,1926,1175,1906,2473, // 3504
282 414,1873,2801,6164,2309, 315,1319,3325, 318,2018,2146,2157, 963, 631, 223,4342, // 3520
283 4343,2675, 479,3711,1197,2625,3712,2676,2361,6165,4344,4123,6166,2451,3183,1886, // 3536
284 2184,1674,1330,1711,1635,1506, 799, 219,3250,3083,3954,1677,3713,3326,2081,3614, // 3552
285 1652,2073,4657,1147,3041,1752, 643,1961, 147,1974,3955,6167,1716,2037, 918,3007, // 3568
286 1994, 120,1537, 118, 609,3184,4345, 740,3455,1219, 332,1615,3830,6168,1621,2980, // 3584
287 1582, 783, 212, 553,2350,3714,1349,2433,2082,4124, 889,6169,2310,1275,1410, 973, // 3600
288 166,1320,3456,1797,1215,3185,2885,1846,2590,2763,4658, 629, 822,3008, 763, 940, // 3616
289 1990,2862, 439,2409,1566,1240,1622, 926,1282,1907,2764, 654,2210,1607, 327,1130, // 3632
290 3956,1678,1623,6170,2434,2192, 686, 608,3831,3715, 903,3957,3042,6171,2741,1522, // 3648
291 1915,1105,1555,2552,1359, 323,3251,4346,3457, 738,1354,2553,2311,2334,1828,2003, // 3664
292 3832,1753,2351,1227,6172,1887,4125,1478,6173,2410,1874,1712,1847, 520,1204,2607, // 3680
293 264,4659, 836,2677,2102, 600,4660,3833,2278,3084,6174,4347,3615,1342, 640, 532, // 3696
294 543,2608,1888,2400,2591,1009,4348,1497, 341,1737,3616,2723,1394, 529,3252,1321, // 3712
295 983,4661,1515,2120, 971,2592, 924, 287,1662,3186,4349,2700,4350,1519, 908,1948, // 3728
296 2452, 156, 796,1629,1486,2223,2055, 694,4126,1259,1036,3392,1213,2249,2742,1889, // 3744
297 1230,3958,1015, 910, 408, 559,3617,4662, 746, 725, 935,4663,3959,3009,1289, 563, // 3760
298 867,4664,3960,1567,2981,2038,2626, 988,2263,2381,4351, 143,2374, 704,1895,6175, // 3776
299 1188,3716,2088, 673,3085,2362,4352, 484,1608,1921,2765,2918, 215, 904,3618,3537, // 3792
300 894, 509, 976,3043,2701,3961,4353,2837,2982, 498,6176,6177,1102,3538,1332,3393, // 3808
301 1487,1636,1637, 233, 245,3962, 383, 650, 995,3044, 460,1520,1206,2352, 749,3327, // 3824
302 530, 700, 389,1438,1560,1773,3963,2264, 719,2951,2724,3834, 870,1832,1644,1000, // 3840
303 839,2474,3717, 197,1630,3394, 365,2886,3964,1285,2133, 734, 922, 818,1106, 732, // 3856
304 480,2083,1774,3458, 923,2279,1350, 221,3086, 85,2233,2234,3835,1585,3010,2147, // 3872
305 1387,1705,2382,1619,2475, 133, 239,2802,1991,1016,2084,2383, 411,2838,1113, 651, // 3888
306 1985,1160,3328, 990,1863,3087,1048,1276,2647, 265,2627,1599,3253,2056, 150, 638, // 3904
307 2019, 656, 853, 326,1479, 680,1439,4354,1001,1759, 413,3459,3395,2492,1431, 459, // 3920
308 4355,1125,3329,2265,1953,1450,2065,2863, 849, 351,2678,3131,3254,3255,1104,1577, // 3936
309 227,1351,1645,2453,2193,1421,2887, 812,2121, 634, 95,2435, 201,2312,4665,1646, // 3952
310 1671,2743,1601,2554,2702,2648,2280,1315,1366,2089,3132,1573,3718,3965,1729,1189, // 3968
311 328,2679,1077,1940,1136, 558,1283, 964,1195, 621,2074,1199,1743,3460,3619,1896, // 3984
312 1916,1890,3836,2952,1154,2112,1064, 862, 378,3011,2066,2113,2803,1568,2839,6178, // 4000
313 3088,2919,1941,1660,2004,1992,2194, 142, 707,1590,1708,1624,1922,1023,1836,1233, // 4016
314 1004,2313, 789, 741,3620,6179,1609,2411,1200,4127,3719,3720,4666,2057,3721, 593, // 4032
315 2840, 367,2920,1878,6180,3461,1521, 628,1168, 692,2211,2649, 300, 720,2067,2571, // 4048
316 2953,3396, 959,2504,3966,3539,3462,1977, 701,6181, 954,1043, 800, 681, 183,3722, // 4064
317 1803,1730,3540,4128,2103, 815,2314, 174, 467, 230,2454,1093,2134, 755,3541,3397, // 4080
318 1141,1162,6182,1738,2039, 270,3256,2513,1005,1647,2185,3837, 858,1679,1897,1719, // 4096
319 2954,2324,1806, 402, 670, 167,4129,1498,2158,2104, 750,6183, 915, 189,1680,1551, // 4112
320 455,4356,1501,2455, 405,1095,2955, 338,1586,1266,1819, 570, 641,1324, 237,1556, // 4128
321 2650,1388,3723,6184,1368,2384,1343,1978,3089,2436, 879,3724, 792,1191, 758,3012, // 4144
322 1411,2135,1322,4357, 240,4667,1848,3725,1574,6185, 420,3045,1546,1391, 714,4358, // 4160
323 1967, 941,1864, 863, 664, 426, 560,1731,2680,1785,2864,1949,2363, 403,3330,1415, // 4176
324 1279,2136,1697,2335, 204, 721,2097,3838, 90,6186,2085,2505, 191,3967, 124,2148, // 4192
325 1376,1798,1178,1107,1898,1405, 860,4359,1243,1272,2375,2983,1558,2456,1638, 113, // 4208
326 3621, 578,1923,2609, 880, 386,4130, 784,2186,2266,1422,2956,2172,1722, 497, 263, // 4224
327 2514,1267,2412,2610, 177,2703,3542, 774,1927,1344, 616,1432,1595,1018, 172,4360, // 4240
328 2325, 911,4361, 438,1468,3622, 794,3968,2024,2173,1681,1829,2957, 945, 895,3090, // 4256
329 575,2212,2476, 475,2401,2681, 785,2744,1745,2293,2555,1975,3133,2865, 394,4668, // 4272
330 3839, 635,4131, 639, 202,1507,2195,2766,1345,1435,2572,3726,1908,1184,1181,2457, // 4288
331 3727,3134,4362, 843,2611, 437, 916,4669, 234, 769,1884,3046,3047,3623, 833,6187, // 4304
332 1639,2250,2402,1355,1185,2010,2047, 999, 525,1732,1290,1488,2612, 948,1578,3728, // 4320
333 2413,2477,1216,2725,2159, 334,3840,1328,3624,2921,1525,4132, 564,1056, 891,4363, // 4336
334 1444,1698,2385,2251,3729,1365,2281,2235,1717,6188, 864,3841,2515, 444, 527,2767, // 4352
335 2922,3625, 544, 461,6189, 566, 209,2437,3398,2098,1065,2068,3331,3626,3257,2137, // 4368 //last 512
336
337 /***************************************************************************************
338 *Everything below is of no interest for detection purpose *
339 ***************************************************************************************
340
341 2138,2122,3730,2888,1995,1820,1044,6190,6191,6192,6193,6194,6195,6196,6197,6198, // 4384
342 6199,6200,6201,6202,6203,6204,6205,4670,6206,6207,6208,6209,6210,6211,6212,6213, // 4400
343 6214,6215,6216,6217,6218,6219,6220,6221,6222,6223,6224,6225,6226,6227,6228,6229, // 4416
344 6230,6231,6232,6233,6234,6235,6236,6237,3187,6238,6239,3969,6240,6241,6242,6243, // 4432
345 6244,4671,6245,6246,4672,6247,6248,4133,6249,6250,4364,6251,2923,2556,2613,4673, // 4448
346 4365,3970,6252,6253,6254,6255,4674,6256,6257,6258,2768,2353,4366,4675,4676,3188, // 4464
347 4367,3463,6259,4134,4677,4678,6260,2267,6261,3842,3332,4368,3543,6262,6263,6264, // 4480
348 3013,1954,1928,4135,4679,6265,6266,2478,3091,6267,4680,4369,6268,6269,1699,6270, // 4496
349 3544,4136,4681,6271,4137,6272,4370,2804,6273,6274,2593,3971,3972,4682,6275,2236, // 4512
350 4683,6276,6277,4684,6278,6279,4138,3973,4685,6280,6281,3258,6282,6283,6284,6285, // 4528
351 3974,4686,2841,3975,6286,6287,3545,6288,6289,4139,4687,4140,6290,4141,6291,4142, // 4544
352 6292,6293,3333,6294,6295,6296,4371,6297,3399,6298,6299,4372,3976,6300,6301,6302, // 4560
353 4373,6303,6304,3843,3731,6305,4688,4374,6306,6307,3259,2294,6308,3732,2530,4143, // 4576
354 6309,4689,6310,6311,6312,3048,6313,6314,4690,3733,2237,6315,6316,2282,3334,6317, // 4592
355 6318,3844,6319,6320,4691,6321,3400,4692,6322,4693,6323,3049,6324,4375,6325,3977, // 4608
356 6326,6327,6328,3546,6329,4694,3335,6330,4695,4696,6331,6332,6333,6334,4376,3978, // 4624
357 6335,4697,3979,4144,6336,3980,4698,6337,6338,6339,6340,6341,4699,4700,4701,6342, // 4640
358 6343,4702,6344,6345,4703,6346,6347,4704,6348,4705,4706,3135,6349,4707,6350,4708, // 4656
359 6351,4377,6352,4709,3734,4145,6353,2506,4710,3189,6354,3050,4711,3981,6355,3547, // 4672
360 3014,4146,4378,3735,2651,3845,3260,3136,2224,1986,6356,3401,6357,4712,2594,3627, // 4688
361 3137,2573,3736,3982,4713,3628,4714,4715,2682,3629,4716,6358,3630,4379,3631,6359, // 4704
362 6360,6361,3983,6362,6363,6364,6365,4147,3846,4717,6366,6367,3737,2842,6368,4718, // 4720
363 2628,6369,3261,6370,2386,6371,6372,3738,3984,4719,3464,4720,3402,6373,2924,3336, // 4736
364 4148,2866,6374,2805,3262,4380,2704,2069,2531,3138,2806,2984,6375,2769,6376,4721, // 4752
365 4722,3403,6377,6378,3548,6379,6380,2705,3092,1979,4149,2629,3337,2889,6381,3338, // 4768
366 4150,2557,3339,4381,6382,3190,3263,3739,6383,4151,4723,4152,2558,2574,3404,3191, // 4784
367 6384,6385,4153,6386,4724,4382,6387,6388,4383,6389,6390,4154,6391,4725,3985,6392, // 4800
368 3847,4155,6393,6394,6395,6396,6397,3465,6398,4384,6399,6400,6401,6402,6403,6404, // 4816
369 4156,6405,6406,6407,6408,2123,6409,6410,2326,3192,4726,6411,6412,6413,6414,4385, // 4832
370 4157,6415,6416,4158,6417,3093,3848,6418,3986,6419,6420,3849,6421,6422,6423,4159, // 4848
371 6424,6425,4160,6426,3740,6427,6428,6429,6430,3987,6431,4727,6432,2238,6433,6434, // 4864
372 4386,3988,6435,6436,3632,6437,6438,2843,6439,6440,6441,6442,3633,6443,2958,6444, // 4880
373 6445,3466,6446,2364,4387,3850,6447,4388,2959,3340,6448,3851,6449,4728,6450,6451, // 4896
374 3264,4729,6452,3193,6453,4389,4390,2706,3341,4730,6454,3139,6455,3194,6456,3051, // 4912
375 2124,3852,1602,4391,4161,3853,1158,3854,4162,3989,4392,3990,4731,4732,4393,2040, // 4928
376 4163,4394,3265,6457,2807,3467,3855,6458,6459,6460,3991,3468,4733,4734,6461,3140, // 4944
377 2960,6462,4735,6463,6464,6465,6466,4736,4737,4738,4739,6467,6468,4164,2403,3856, // 4960
378 6469,6470,2770,2844,6471,4740,6472,6473,6474,6475,6476,6477,6478,3195,6479,4741, // 4976
379 4395,6480,2867,6481,4742,2808,6482,2493,4165,6483,6484,6485,6486,2295,4743,6487, // 4992
380 6488,6489,3634,6490,6491,6492,6493,6494,6495,6496,2985,4744,6497,6498,4745,6499, // 5008
381 6500,2925,3141,4166,6501,6502,4746,6503,6504,4747,6505,6506,6507,2890,6508,6509, // 5024
382 6510,6511,6512,6513,6514,6515,6516,6517,6518,6519,3469,4167,6520,6521,6522,4748, // 5040
383 4396,3741,4397,4749,4398,3342,2125,4750,6523,4751,4752,4753,3052,6524,2961,4168, // 5056
384 6525,4754,6526,4755,4399,2926,4169,6527,3857,6528,4400,4170,6529,4171,6530,6531, // 5072
385 2595,6532,6533,6534,6535,3635,6536,6537,6538,6539,6540,6541,6542,4756,6543,6544, // 5088
386 6545,6546,6547,6548,4401,6549,6550,6551,6552,4402,3405,4757,4403,6553,6554,6555, // 5104
387 4172,3742,6556,6557,6558,3992,3636,6559,6560,3053,2726,6561,3549,4173,3054,4404, // 5120
388 6562,6563,3993,4405,3266,3550,2809,4406,6564,6565,6566,4758,4759,6567,3743,6568, // 5136
389 4760,3744,4761,3470,6569,6570,6571,4407,6572,3745,4174,6573,4175,2810,4176,3196, // 5152
390 4762,6574,4177,6575,6576,2494,2891,3551,6577,6578,3471,6579,4408,6580,3015,3197, // 5168
391 6581,3343,2532,3994,3858,6582,3094,3406,4409,6583,2892,4178,4763,4410,3016,4411, // 5184
392 6584,3995,3142,3017,2683,6585,4179,6586,6587,4764,4412,6588,6589,4413,6590,2986, // 5200
393 6591,2962,3552,6592,2963,3472,6593,6594,4180,4765,6595,6596,2225,3267,4414,6597, // 5216
394 3407,3637,4766,6598,6599,3198,6600,4415,6601,3859,3199,6602,3473,4767,2811,4416, // 5232
395 1856,3268,3200,2575,3996,3997,3201,4417,6603,3095,2927,6604,3143,6605,2268,6606, // 5248
396 3998,3860,3096,2771,6607,6608,3638,2495,4768,6609,3861,6610,3269,2745,4769,4181, // 5264
397 3553,6611,2845,3270,6612,6613,6614,3862,6615,6616,4770,4771,6617,3474,3999,4418, // 5280
398 4419,6618,3639,3344,6619,4772,4182,6620,2126,6621,6622,6623,4420,4773,6624,3018, // 5296
399 6625,4774,3554,6626,4183,2025,3746,6627,4184,2707,6628,4421,4422,3097,1775,4185, // 5312
400 3555,6629,6630,2868,6631,6632,4423,6633,6634,4424,2414,2533,2928,6635,4186,2387, // 5328
401 6636,4775,6637,4187,6638,1891,4425,3202,3203,6639,6640,4776,6641,3345,6642,6643, // 5344
402 3640,6644,3475,3346,3641,4000,6645,3144,6646,3098,2812,4188,3642,3204,6647,3863, // 5360
403 3476,6648,3864,6649,4426,4001,6650,6651,6652,2576,6653,4189,4777,6654,6655,6656, // 5376
404 2846,6657,3477,3205,4002,6658,4003,6659,3347,2252,6660,6661,6662,4778,6663,6664, // 5392
405 6665,6666,6667,6668,6669,4779,4780,2048,6670,3478,3099,6671,3556,3747,4004,6672, // 5408
406 6673,6674,3145,4005,3748,6675,6676,6677,6678,6679,3408,6680,6681,6682,6683,3206, // 5424
407 3207,6684,6685,4781,4427,6686,4782,4783,4784,6687,6688,6689,4190,6690,6691,3479, // 5440
408 6692,2746,6693,4428,6694,6695,6696,6697,6698,6699,4785,6700,6701,3208,2727,6702, // 5456
409 3146,6703,6704,3409,2196,6705,4429,6706,6707,6708,2534,1996,6709,6710,6711,2747, // 5472
410 6712,6713,6714,4786,3643,6715,4430,4431,6716,3557,6717,4432,4433,6718,6719,6720, // 5488
411 6721,3749,6722,4006,4787,6723,6724,3644,4788,4434,6725,6726,4789,2772,6727,6728, // 5504
412 6729,6730,6731,2708,3865,2813,4435,6732,6733,4790,4791,3480,6734,6735,6736,6737, // 5520
413 4436,3348,6738,3410,4007,6739,6740,4008,6741,6742,4792,3411,4191,6743,6744,6745, // 5536
414 6746,6747,3866,6748,3750,6749,6750,6751,6752,6753,6754,6755,3867,6756,4009,6757, // 5552
415 4793,4794,6758,2814,2987,6759,6760,6761,4437,6762,6763,6764,6765,3645,6766,6767, // 5568
416 3481,4192,6768,3751,6769,6770,2174,6771,3868,3752,6772,6773,6774,4193,4795,4438, // 5584
417 3558,4796,4439,6775,4797,6776,6777,4798,6778,4799,3559,4800,6779,6780,6781,3482, // 5600
418 6782,2893,6783,6784,4194,4801,4010,6785,6786,4440,6787,4011,6788,6789,6790,6791, // 5616
419 6792,6793,4802,6794,6795,6796,4012,6797,6798,6799,6800,3349,4803,3483,6801,4804, // 5632
420 4195,6802,4013,6803,6804,4196,6805,4014,4015,6806,2847,3271,2848,6807,3484,6808, // 5648
421 6809,6810,4441,6811,4442,4197,4443,3272,4805,6812,3412,4016,1579,6813,6814,4017, // 5664
422 6815,3869,6816,2964,6817,4806,6818,6819,4018,3646,6820,6821,4807,4019,4020,6822, // 5680
423 6823,3560,6824,6825,4021,4444,6826,4198,6827,6828,4445,6829,6830,4199,4808,6831, // 5696
424 6832,6833,3870,3019,2458,6834,3753,3413,3350,6835,4809,3871,4810,3561,4446,6836, // 5712
425 6837,4447,4811,4812,6838,2459,4448,6839,4449,6840,6841,4022,3872,6842,4813,4814, // 5728
426 6843,6844,4815,4200,4201,4202,6845,4023,6846,6847,4450,3562,3873,6848,6849,4816, // 5744
427 4817,6850,4451,4818,2139,6851,3563,6852,6853,3351,6854,6855,3352,4024,2709,3414, // 5760
428 4203,4452,6856,4204,6857,6858,3874,3875,6859,6860,4819,6861,6862,6863,6864,4453, // 5776
429 3647,6865,6866,4820,6867,6868,6869,6870,4454,6871,2869,6872,6873,4821,6874,3754, // 5792
430 6875,4822,4205,6876,6877,6878,3648,4206,4455,6879,4823,6880,4824,3876,6881,3055, // 5808
431 4207,6882,3415,6883,6884,6885,4208,4209,6886,4210,3353,6887,3354,3564,3209,3485, // 5824
432 2652,6888,2728,6889,3210,3755,6890,4025,4456,6891,4825,6892,6893,6894,6895,4211, // 5840
433 6896,6897,6898,4826,6899,6900,4212,6901,4827,6902,2773,3565,6903,4828,6904,6905, // 5856
434 6906,6907,3649,3650,6908,2849,3566,6909,3567,3100,6910,6911,6912,6913,6914,6915, // 5872
435 4026,6916,3355,4829,3056,4457,3756,6917,3651,6918,4213,3652,2870,6919,4458,6920, // 5888
436 2438,6921,6922,3757,2774,4830,6923,3356,4831,4832,6924,4833,4459,3653,2507,6925, // 5904
437 4834,2535,6926,6927,3273,4027,3147,6928,3568,6929,6930,6931,4460,6932,3877,4461, // 5920
438 2729,3654,6933,6934,6935,6936,2175,4835,2630,4214,4028,4462,4836,4215,6937,3148, // 5936
439 4216,4463,4837,4838,4217,6938,6939,2850,4839,6940,4464,6941,6942,6943,4840,6944, // 5952
440 4218,3274,4465,6945,6946,2710,6947,4841,4466,6948,6949,2894,6950,6951,4842,6952, // 5968
441 4219,3057,2871,6953,6954,6955,6956,4467,6957,2711,6958,6959,6960,3275,3101,4843, // 5984
442 6961,3357,3569,6962,4844,6963,6964,4468,4845,3570,6965,3102,4846,3758,6966,4847, // 6000
443 3878,4848,4849,4029,6967,2929,3879,4850,4851,6968,6969,1733,6970,4220,6971,6972, // 6016
444 6973,6974,6975,6976,4852,6977,6978,6979,6980,6981,6982,3759,6983,6984,6985,3486, // 6032
445 3487,6986,3488,3416,6987,6988,6989,6990,6991,6992,6993,6994,6995,6996,6997,4853, // 6048
446 6998,6999,4030,7000,7001,3211,7002,7003,4221,7004,7005,3571,4031,7006,3572,7007, // 6064
447 2614,4854,2577,7008,7009,2965,3655,3656,4855,2775,3489,3880,4222,4856,3881,4032, // 6080
448 3882,3657,2730,3490,4857,7010,3149,7011,4469,4858,2496,3491,4859,2283,7012,7013, // 6096
449 7014,2365,4860,4470,7015,7016,3760,7017,7018,4223,1917,7019,7020,7021,4471,7022, // 6112
450 2776,4472,7023,7024,7025,7026,4033,7027,3573,4224,4861,4034,4862,7028,7029,1929, // 6128
451 3883,4035,7030,4473,3058,7031,2536,3761,3884,7032,4036,7033,2966,2895,1968,4474, // 6144
452 3276,4225,3417,3492,4226,2105,7034,7035,1754,2596,3762,4227,4863,4475,3763,4864, // 6160
453 3764,2615,2777,3103,3765,3658,3418,4865,2296,3766,2815,7036,7037,7038,3574,2872, // 6176
454 3277,4476,7039,4037,4477,7040,7041,4038,7042,7043,7044,7045,7046,7047,2537,7048, // 6192
455 7049,7050,7051,7052,7053,7054,4478,7055,7056,3767,3659,4228,3575,7057,7058,4229, // 6208
456 7059,7060,7061,3660,7062,3212,7063,3885,4039,2460,7064,7065,7066,7067,7068,7069, // 6224
457 7070,7071,7072,7073,7074,4866,3768,4867,7075,7076,7077,7078,4868,3358,3278,2653, // 6240
458 7079,7080,4479,3886,7081,7082,4869,7083,7084,7085,7086,7087,7088,2538,7089,7090, // 6256
459 7091,4040,3150,3769,4870,4041,2896,3359,4230,2930,7092,3279,7093,2967,4480,3213, // 6272
460 4481,3661,7094,7095,7096,7097,7098,7099,7100,7101,7102,2461,3770,7103,7104,4231, // 6288
461 3151,7105,7106,7107,4042,3662,7108,7109,4871,3663,4872,4043,3059,7110,7111,7112, // 6304
462 3493,2988,7113,4873,7114,7115,7116,3771,4874,7117,7118,4232,4875,7119,3576,2336, // 6320
463 4876,7120,4233,3419,4044,4877,4878,4482,4483,4879,4484,4234,7121,3772,4880,1045, // 6336
464 3280,3664,4881,4882,7122,7123,7124,7125,4883,7126,2778,7127,4485,4486,7128,4884, // 6352
465 3214,3887,7129,7130,3215,7131,4885,4045,7132,7133,4046,7134,7135,7136,7137,7138, // 6368
466 7139,7140,7141,7142,7143,4235,7144,4886,7145,7146,7147,4887,7148,7149,7150,4487, // 6384
467 4047,4488,7151,7152,4888,4048,2989,3888,7153,3665,7154,4049,7155,7156,7157,7158, // 6400
468 7159,7160,2931,4889,4890,4489,7161,2631,3889,4236,2779,7162,7163,4891,7164,3060, // 6416
469 7165,1672,4892,7166,4893,4237,3281,4894,7167,7168,3666,7169,3494,7170,7171,4050, // 6432
470 7172,7173,3104,3360,3420,4490,4051,2684,4052,7174,4053,7175,7176,7177,2253,4054, // 6448
471 7178,7179,4895,7180,3152,3890,3153,4491,3216,7181,7182,7183,2968,4238,4492,4055, // 6464
472 7184,2990,7185,2479,7186,7187,4493,7188,7189,7190,7191,7192,4896,7193,4897,2969, // 6480
473 4494,4898,7194,3495,7195,7196,4899,4495,7197,3105,2731,7198,4900,7199,7200,7201, // 6496
474 4056,7202,3361,7203,7204,4496,4901,4902,7205,4497,7206,7207,2315,4903,7208,4904, // 6512
475 7209,4905,2851,7210,7211,3577,7212,3578,4906,7213,4057,3667,4907,7214,4058,2354, // 6528
476 3891,2376,3217,3773,7215,7216,7217,7218,7219,4498,7220,4908,3282,2685,7221,3496, // 6544
477 4909,2632,3154,4910,7222,2337,7223,4911,7224,7225,7226,4912,4913,3283,4239,4499, // 6560
478 7227,2816,7228,7229,7230,7231,7232,7233,7234,4914,4500,4501,7235,7236,7237,2686, // 6576
479 7238,4915,7239,2897,4502,7240,4503,7241,2516,7242,4504,3362,3218,7243,7244,7245, // 6592
480 4916,7246,7247,4505,3363,7248,7249,7250,7251,3774,4506,7252,7253,4917,7254,7255, // 6608
481 3284,2991,4918,4919,3219,3892,4920,3106,3497,4921,7256,7257,7258,4922,7259,4923, // 6624
482 3364,4507,4508,4059,7260,4240,3498,7261,7262,4924,7263,2992,3893,4060,3220,7264, // 6640
483 7265,7266,7267,7268,7269,4509,3775,7270,2817,7271,4061,4925,4510,3776,7272,4241, // 6656
484 4511,3285,7273,7274,3499,7275,7276,7277,4062,4512,4926,7278,3107,3894,7279,7280, // 6672
485 4927,7281,4513,7282,7283,3668,7284,7285,4242,4514,4243,7286,2058,4515,4928,4929, // 6688
486 4516,7287,3286,4244,7288,4517,7289,7290,7291,3669,7292,7293,4930,4931,4932,2355, // 6704
487 4933,7294,2633,4518,7295,4245,7296,7297,4519,7298,7299,4520,4521,4934,7300,4246, // 6720
488 4522,7301,7302,7303,3579,7304,4247,4935,7305,4936,7306,7307,7308,7309,3777,7310, // 6736
489 4523,7311,7312,7313,4248,3580,7314,4524,3778,4249,7315,3581,7316,3287,7317,3221, // 6752
490 7318,4937,7319,7320,7321,7322,7323,7324,4938,4939,7325,4525,7326,7327,7328,4063, // 6768
491 7329,7330,4940,7331,7332,4941,7333,4526,7334,3500,2780,1741,4942,2026,1742,7335, // 6784
492 7336,3582,4527,2388,7337,7338,7339,4528,7340,4250,4943,7341,7342,7343,4944,7344, // 6800
493 7345,7346,3020,7347,4945,7348,7349,7350,7351,3895,7352,3896,4064,3897,7353,7354, // 6816
494 7355,4251,7356,7357,3898,7358,3779,7359,3780,3288,7360,7361,4529,7362,4946,4530, // 6832
495 2027,7363,3899,4531,4947,3222,3583,7364,4948,7365,7366,7367,7368,4949,3501,4950, // 6848
496 3781,4951,4532,7369,2517,4952,4252,4953,3155,7370,4954,4955,4253,2518,4533,7371, // 6864
497 7372,2712,4254,7373,7374,7375,3670,4956,3671,7376,2389,3502,4065,7377,2338,7378, // 6880
498 7379,7380,7381,3061,7382,4957,7383,7384,7385,7386,4958,4534,7387,7388,2993,7389, // 6896
499 3062,7390,4959,7391,7392,7393,4960,3108,4961,7394,4535,7395,4962,3421,4536,7396, // 6912
500 4963,7397,4964,1857,7398,4965,7399,7400,2176,3584,4966,7401,7402,3422,4537,3900, // 6928
501 3585,7403,3782,7404,2852,7405,7406,7407,4538,3783,2654,3423,4967,4539,7408,3784, // 6944
502 3586,2853,4540,4541,7409,3901,7410,3902,7411,7412,3785,3109,2327,3903,7413,7414, // 6960
503 2970,4066,2932,7415,7416,7417,3904,3672,3424,7418,4542,4543,4544,7419,4968,7420, // 6976
504 7421,4255,7422,7423,7424,7425,7426,4067,7427,3673,3365,4545,7428,3110,2559,3674, // 6992
505 7429,7430,3156,7431,7432,3503,7433,3425,4546,7434,3063,2873,7435,3223,4969,4547, // 7008
506 4548,2898,4256,4068,7436,4069,3587,3786,2933,3787,4257,4970,4971,3788,7437,4972, // 7024
507 3064,7438,4549,7439,7440,7441,7442,7443,4973,3905,7444,2874,7445,7446,7447,7448, // 7040
508 3021,7449,4550,3906,3588,4974,7450,7451,3789,3675,7452,2578,7453,4070,7454,7455, // 7056
509 7456,4258,3676,7457,4975,7458,4976,4259,3790,3504,2634,4977,3677,4551,4260,7459, // 7072
510 7460,7461,7462,3907,4261,4978,7463,7464,7465,7466,4979,4980,7467,7468,2213,4262, // 7088
511 7469,7470,7471,3678,4981,7472,2439,7473,4263,3224,3289,7474,3908,2415,4982,7475, // 7104
512 4264,7476,4983,2655,7477,7478,2732,4552,2854,2875,7479,7480,4265,7481,4553,4984, // 7120
513 7482,7483,4266,7484,3679,3366,3680,2818,2781,2782,3367,3589,4554,3065,7485,4071, // 7136
514 2899,7486,7487,3157,2462,4072,4555,4073,4985,4986,3111,4267,2687,3368,4556,4074, // 7152
515 3791,4268,7488,3909,2783,7489,2656,1962,3158,4557,4987,1963,3159,3160,7490,3112, // 7168
516 4988,4989,3022,4990,4991,3792,2855,7491,7492,2971,4558,7493,7494,4992,7495,7496, // 7184
517 7497,7498,4993,7499,3426,4559,4994,7500,3681,4560,4269,4270,3910,7501,4075,4995, // 7200
518 4271,7502,7503,4076,7504,4996,7505,3225,4997,4272,4077,2819,3023,7506,7507,2733, // 7216
519 4561,7508,4562,7509,3369,3793,7510,3590,2508,7511,7512,4273,3113,2994,2616,7513, // 7232
520 7514,7515,7516,7517,7518,2820,3911,4078,2748,7519,7520,4563,4998,7521,7522,7523, // 7248
521 7524,4999,4274,7525,4564,3682,2239,4079,4565,7526,7527,7528,7529,5000,7530,7531, // 7264
522 5001,4275,3794,7532,7533,7534,3066,5002,4566,3161,7535,7536,4080,7537,3162,7538, // 7280
523 7539,4567,7540,7541,7542,7543,7544,7545,5003,7546,4568,7547,7548,7549,7550,7551, // 7296
524 7552,7553,7554,7555,7556,5004,7557,7558,7559,5005,7560,3795,7561,4569,7562,7563, // 7312
525 7564,2821,3796,4276,4277,4081,7565,2876,7566,5006,7567,7568,2900,7569,3797,3912, // 7328
526 7570,7571,7572,4278,7573,7574,7575,5007,7576,7577,5008,7578,7579,4279,2934,7580, // 7344
527 7581,5009,7582,4570,7583,4280,7584,7585,7586,4571,4572,3913,7587,4573,3505,7588, // 7360
528 5010,7589,7590,7591,7592,3798,4574,7593,7594,5011,7595,4281,7596,7597,7598,4282, // 7376
529 5012,7599,7600,5013,3163,7601,5014,7602,3914,7603,7604,2734,4575,4576,4577,7605, // 7392
530 7606,7607,7608,7609,3506,5015,4578,7610,4082,7611,2822,2901,2579,3683,3024,4579, // 7408
531 3507,7612,4580,7613,3226,3799,5016,7614,7615,7616,7617,7618,7619,7620,2995,3290, // 7424
532 7621,4083,7622,5017,7623,7624,7625,7626,7627,4581,3915,7628,3291,7629,5018,7630, // 7440
533 7631,7632,7633,4084,7634,7635,3427,3800,7636,7637,4582,7638,5019,4583,5020,7639, // 7456
534 3916,7640,3801,5021,4584,4283,7641,7642,3428,3591,2269,7643,2617,7644,4585,3592, // 7472
535 7645,4586,2902,7646,7647,3227,5022,7648,4587,7649,4284,7650,7651,7652,4588,2284, // 7488
536 7653,5023,7654,7655,7656,4589,5024,3802,7657,7658,5025,3508,4590,7659,7660,7661, // 7504
537 1969,5026,7662,7663,3684,1821,2688,7664,2028,2509,4285,7665,2823,1841,7666,2689, // 7520
538 3114,7667,3917,4085,2160,5027,5028,2972,7668,5029,7669,7670,7671,3593,4086,7672, // 7536
539 4591,4087,5030,3803,7673,7674,7675,7676,7677,7678,7679,4286,2366,4592,4593,3067, // 7552
540 2328,7680,7681,4594,3594,3918,2029,4287,7682,5031,3919,3370,4288,4595,2856,7683, // 7568
541 3509,7684,7685,5032,5033,7686,7687,3804,2784,7688,7689,7690,7691,3371,7692,7693, // 7584
542 2877,5034,7694,7695,3920,4289,4088,7696,7697,7698,5035,7699,5036,4290,5037,5038, // 7600
543 5039,7700,7701,7702,5040,5041,3228,7703,1760,7704,5042,3229,4596,2106,4089,7705, // 7616
544 4597,2824,5043,2107,3372,7706,4291,4090,5044,7707,4091,7708,5045,3025,3805,4598, // 7632
545 4292,4293,4294,3373,7709,4599,7710,5046,7711,7712,5047,5048,3806,7713,7714,7715, // 7648
546 5049,7716,7717,7718,7719,4600,5050,7720,7721,7722,5051,7723,4295,3429,7724,7725, // 7664
547 7726,7727,3921,7728,3292,5052,4092,7729,7730,7731,7732,7733,7734,7735,5053,5054, // 7680
548 7736,7737,7738,7739,3922,3685,7740,7741,7742,7743,2635,5055,7744,5056,4601,7745, // 7696
549 7746,2560,7747,7748,7749,7750,3923,7751,7752,7753,7754,7755,4296,2903,7756,7757, // 7712
550 7758,7759,7760,3924,7761,5057,4297,7762,7763,5058,4298,7764,4093,7765,7766,5059, // 7728
551 3925,7767,7768,7769,7770,7771,7772,7773,7774,7775,7776,3595,7777,4299,5060,4094, // 7744
552 7778,3293,5061,7779,7780,4300,7781,7782,4602,7783,3596,7784,7785,3430,2367,7786, // 7760
553 3164,5062,5063,4301,7787,7788,4095,5064,5065,7789,3374,3115,7790,7791,7792,7793, // 7776
554 7794,7795,7796,3597,4603,7797,7798,3686,3116,3807,5066,7799,7800,5067,7801,7802, // 7792
555 4604,4302,5068,4303,4096,7803,7804,3294,7805,7806,5069,4605,2690,7807,3026,7808, // 7808
556 7809,7810,7811,7812,7813,7814,7815,7816,7817,7818,7819,7820,7821,7822,7823,7824, // 7824
557 7825,7826,7827,7828,7829,7830,7831,7832,7833,7834,7835,7836,7837,7838,7839,7840, // 7840
558 7841,7842,7843,7844,7845,7846,7847,7848,7849,7850,7851,7852,7853,7854,7855,7856, // 7856
559 7857,7858,7859,7860,7861,7862,7863,7864,7865,7866,7867,7868,7869,7870,7871,7872, // 7872
560 7873,7874,7875,7876,7877,7878,7879,7880,7881,7882,7883,7884,7885,7886,7887,7888, // 7888
561 7889,7890,7891,7892,7893,7894,7895,7896,7897,7898,7899,7900,7901,7902,7903,7904, // 7904
562 7905,7906,7907,7908,7909,7910,7911,7912,7913,7914,7915,7916,7917,7918,7919,7920, // 7920
563 7921,7922,7923,7924,3926,7925,7926,7927,7928,7929,7930,7931,7932,7933,7934,7935, // 7936
564 7936,7937,7938,7939,7940,7941,7942,7943,7944,7945,7946,7947,7948,7949,7950,7951, // 7952
565 7952,7953,7954,7955,7956,7957,7958,7959,7960,7961,7962,7963,7964,7965,7966,7967, // 7968
566 7968,7969,7970,7971,7972,7973,7974,7975,7976,7977,7978,7979,7980,7981,7982,7983, // 7984
567 7984,7985,7986,7987,7988,7989,7990,7991,7992,7993,7994,7995,7996,7997,7998,7999, // 8000
568 8000,8001,8002,8003,8004,8005,8006,8007,8008,8009,8010,8011,8012,8013,8014,8015, // 8016
569 8016,8017,8018,8019,8020,8021,8022,8023,8024,8025,8026,8027,8028,8029,8030,8031, // 8032
570 8032,8033,8034,8035,8036,8037,8038,8039,8040,8041,8042,8043,8044,8045,8046,8047, // 8048
571 8048,8049,8050,8051,8052,8053,8054,8055,8056,8057,8058,8059,8060,8061,8062,8063, // 8064
572 8064,8065,8066,8067,8068,8069,8070,8071,8072,8073,8074,8075,8076,8077,8078,8079, // 8080
573 8080,8081,8082,8083,8084,8085,8086,8087,8088,8089,8090,8091,8092,8093,8094,8095, // 8096
574 8096,8097,8098,8099,8100,8101,8102,8103,8104,8105,8106,8107,8108,8109,8110,8111, // 8112
575 8112,8113,8114,8115,8116,8117,8118,8119,8120,8121,8122,8123,8124,8125,8126,8127, // 8128
576 8128,8129,8130,8131,8132,8133,8134,8135,8136,8137,8138,8139,8140,8141,8142,8143, // 8144
577 8144,8145,8146,8147,8148,8149,8150,8151,8152,8153,8154,8155,8156,8157,8158,8159, // 8160
578 8160,8161,8162,8163,8164,8165,8166,8167,8168,8169,8170,8171,8172,8173,8174,8175, // 8176
579 8176,8177,8178,8179,8180,8181,8182,8183,8184,8185,8186,8187,8188,8189,8190,8191, // 8192
580 8192,8193,8194,8195,8196,8197,8198,8199,8200,8201,8202,8203,8204,8205,8206,8207, // 8208
581 8208,8209,8210,8211,8212,8213,8214,8215,8216,8217,8218,8219,8220,8221,8222,8223, // 8224
582 8224,8225,8226,8227,8228,8229,8230,8231,8232,8233,8234,8235,8236,8237,8238,8239, // 8240
583 8240,8241,8242,8243,8244,8245,8246,8247,8248,8249,8250,8251,8252,8253,8254,8255, // 8256
584 8256,8257,8258,8259,8260,8261,8262,8263,8264,8265,8266,8267,8268,8269,8270,8271, // 8272
585 ****************************************************************************************/
586
587 };
588
+0
-231
c/src/JpCntx.cpp less more
0 /* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
1 /* ***** BEGIN LICENSE BLOCK *****
2 * Version: MPL 1.1/GPL 2.0/LGPL 2.1
3 *
4 * The contents of this file are subject to the Mozilla Public License Version
5 * 1.1 (the "License"); you may not use this file except in compliance with
6 * the License. You may obtain a copy of the License at
7 * http://www.mozilla.org/MPL/
8 *
9 * Software distributed under the License is distributed on an "AS IS" basis,
10 * WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License
11 * for the specific language governing rights and limitations under the
12 * License.
13 *
14 * The Original Code is Mozilla Communicator client code.
15 *
16 * The Initial Developer of the Original Code is
17 * Netscape Communications Corporation.
18 * Portions created by the Initial Developer are Copyright (C) 1998
19 * the Initial Developer. All Rights Reserved.
20 *
21 * Contributor(s):
22 *
23 * Alternatively, the contents of this file may be used under the terms of
24 * either the GNU General Public License Version 2 or later (the "GPL"), or
25 * the GNU Lesser General Public License Version 2.1 or later (the "LGPL"),
26 * in which case the provisions of the GPL or the LGPL are applicable instead
27 * of those above. If you wish to allow use of your version of this file only
28 * under the terms of either the GPL or the LGPL, and not to allow others to
29 * use your version of this file under the terms of the MPL, indicate your
30 * decision by deleting the provisions above and replace them with the notice
31 * and other provisions required by the GPL or the LGPL. If you do not delete
32 * the provisions above, a recipient may use your version of this file under
33 * the terms of any one of the MPL, the GPL or the LGPL.
34 *
35 * ***** END LICENSE BLOCK ***** */
36
37 #include "nscore.h"
38 #include "JpCntx.h"
39
40 //This is hiragana 2-char sequence table, the number in each cell represents its frequency category
41 char jp2CharContext[83][83] =
42 {
43 { 0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,1,0,0,0,0,0,0,0,0,0,0,1,},
44 { 2,4,0,4,0,3,0,4,0,3,4,4,4,2,4,3,3,4,3,2,3,3,4,2,3,3,3,2,4,1,4,3,3,1,5,4,3,4,3,4,3,5,3,0,3,5,4,2,0,3,1,0,3,3,0,3,3,0,1,1,0,4,3,0,3,3,0,4,0,2,0,3,5,5,5,5,4,0,4,1,0,3,4,},
45 { 0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,},
46 { 0,4,0,5,0,5,0,4,0,4,5,4,4,3,5,3,5,1,5,3,4,3,4,4,3,4,3,3,4,3,5,4,4,3,5,5,3,5,5,5,3,5,5,3,4,5,5,3,1,3,2,0,3,4,0,4,2,0,4,2,1,5,3,2,3,5,0,4,0,2,0,5,4,4,5,4,5,0,4,0,0,4,4,},
47 { 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,},
48 { 0,3,0,4,0,3,0,3,0,4,5,4,3,3,3,3,4,3,5,4,4,3,5,4,4,3,4,3,4,4,4,4,5,3,4,4,3,4,5,5,4,5,5,1,4,5,4,3,0,3,3,1,3,3,0,4,4,0,3,3,1,5,3,3,3,5,0,4,0,3,0,4,4,3,4,3,3,0,4,1,1,3,4,},
49 { 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,},
50 { 0,4,0,3,0,3,0,4,0,3,4,4,3,2,2,1,2,1,3,1,3,3,3,3,3,4,3,1,3,3,5,3,3,0,4,3,0,5,4,3,3,5,4,4,3,4,4,5,0,1,2,0,1,2,0,2,2,0,1,0,0,5,2,2,1,4,0,3,0,1,0,4,4,3,5,4,3,0,2,1,0,4,3,},
51 { 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,},
52 { 0,3,0,5,0,4,0,2,1,4,4,2,4,1,4,2,4,2,4,3,3,3,4,3,3,3,3,1,4,2,3,3,3,1,4,4,1,1,1,4,3,3,2,0,2,4,3,2,0,3,3,0,3,1,1,0,0,0,3,3,0,4,2,2,3,4,0,4,0,3,0,4,4,5,3,4,4,0,3,0,0,1,4,},
53 { 1,4,0,4,0,4,0,4,0,3,5,4,4,3,4,3,5,4,3,3,4,3,5,4,4,4,4,3,4,2,4,3,3,1,5,4,3,2,4,5,4,5,5,4,4,5,4,4,0,3,2,2,3,3,0,4,3,1,3,2,1,4,3,3,4,5,0,3,0,2,0,4,5,5,4,5,4,0,4,0,0,5,4,},
54 { 0,5,0,5,0,4,0,3,0,4,4,3,4,3,3,3,4,0,4,4,4,3,4,3,4,3,3,1,4,2,4,3,4,0,5,4,1,4,5,4,4,5,3,2,4,3,4,3,2,4,1,3,3,3,2,3,2,0,4,3,3,4,3,3,3,4,0,4,0,3,0,4,5,4,4,4,3,0,4,1,0,1,3,},
55 { 0,3,1,4,0,3,0,2,0,3,4,4,3,1,4,2,3,3,4,3,4,3,4,3,4,4,3,2,3,1,5,4,4,1,4,4,3,5,4,4,3,5,5,4,3,4,4,3,1,2,3,1,2,2,0,3,2,0,3,1,0,5,3,3,3,4,3,3,3,3,4,4,4,4,5,4,2,0,3,3,2,4,3,},
56 { 0,2,0,3,0,1,0,1,0,0,3,2,0,0,2,0,1,0,2,1,3,3,3,1,2,3,1,0,1,0,4,2,1,1,3,3,0,4,3,3,1,4,3,3,0,3,3,2,0,0,0,0,1,0,0,2,0,0,0,0,0,4,1,0,2,3,2,2,2,1,3,3,3,4,4,3,2,0,3,1,0,3,3,},
57 { 0,4,0,4,0,3,0,3,0,4,4,4,3,3,3,3,3,3,4,3,4,2,4,3,4,3,3,2,4,3,4,5,4,1,4,5,3,5,4,5,3,5,4,0,3,5,5,3,1,3,3,2,2,3,0,3,4,1,3,3,2,4,3,3,3,4,0,4,0,3,0,4,5,4,4,5,3,0,4,1,0,3,4,},
58 { 0,2,0,3,0,3,0,0,0,2,2,2,1,0,1,0,0,0,3,0,3,0,3,0,1,3,1,0,3,1,3,3,3,1,3,3,3,0,1,3,1,3,4,0,0,3,1,1,0,3,2,0,0,0,0,1,3,0,1,0,0,3,3,2,0,3,0,0,0,0,0,3,4,3,4,3,3,0,3,0,0,2,3,},
59 { 2,3,0,3,0,2,0,1,0,3,3,4,3,1,3,1,1,1,3,1,4,3,4,3,3,3,0,0,3,1,5,4,3,1,4,3,2,5,5,4,4,4,4,3,3,4,4,4,0,2,1,1,3,2,0,1,2,0,0,1,0,4,1,3,3,3,0,3,0,1,0,4,4,4,5,5,3,0,2,0,0,4,4,},
60 { 0,2,0,1,0,3,1,3,0,2,3,3,3,0,3,1,0,0,3,0,3,2,3,1,3,2,1,1,0,0,4,2,1,0,2,3,1,4,3,2,0,4,4,3,1,3,1,3,0,1,0,0,1,0,0,0,1,0,0,0,0,4,1,1,1,2,0,3,0,0,0,3,4,2,4,3,2,0,1,0,0,3,3,},
61 { 0,1,0,4,0,5,0,4,0,2,4,4,2,3,3,2,3,3,5,3,3,3,4,3,4,2,3,0,4,3,3,3,4,1,4,3,2,1,5,5,3,4,5,1,3,5,4,2,0,3,3,0,1,3,0,4,2,0,1,3,1,4,3,3,3,3,0,3,0,1,0,3,4,4,4,5,5,0,3,0,1,4,5,},
62 { 0,2,0,3,0,3,0,0,0,2,3,1,3,0,4,0,1,1,3,0,3,4,3,2,3,1,0,3,3,2,3,1,3,0,2,3,0,2,1,4,1,2,2,0,0,3,3,0,0,2,0,0,0,1,0,0,0,0,2,2,0,3,2,1,3,3,0,2,0,2,0,0,3,3,1,2,4,0,3,0,2,2,3,},
63 { 2,4,0,5,0,4,0,4,0,2,4,4,4,3,4,3,3,3,1,2,4,3,4,3,4,4,5,0,3,3,3,3,2,0,4,3,1,4,3,4,1,4,4,3,3,4,4,3,1,2,3,0,4,2,0,4,1,0,3,3,0,4,3,3,3,4,0,4,0,2,0,3,5,3,4,5,2,0,3,0,0,4,5,},
64 { 0,3,0,4,0,1,0,1,0,1,3,2,2,1,3,0,3,0,2,0,2,0,3,0,2,0,0,0,1,0,1,1,0,0,3,1,0,0,0,4,0,3,1,0,2,1,3,0,0,0,0,0,0,3,0,0,0,0,0,0,0,4,2,2,3,1,0,3,0,0,0,1,4,4,4,3,0,0,4,0,0,1,4,},
65 { 1,4,1,5,0,3,0,3,0,4,5,4,4,3,5,3,3,4,4,3,4,1,3,3,3,3,2,1,4,1,5,4,3,1,4,4,3,5,4,4,3,5,4,3,3,4,4,4,0,3,3,1,2,3,0,3,1,0,3,3,0,5,4,4,4,4,4,4,3,3,5,4,4,3,3,5,4,0,3,2,0,4,4,},
66 { 0,2,0,3,0,1,0,0,0,1,3,3,3,2,4,1,3,0,3,1,3,0,2,2,1,1,0,0,2,0,4,3,1,0,4,3,0,4,4,4,1,4,3,1,1,3,3,1,0,2,0,0,1,3,0,0,0,0,2,0,0,4,3,2,4,3,5,4,3,3,3,4,3,3,4,3,3,0,2,1,0,3,3,},
67 { 0,2,0,4,0,3,0,2,0,2,5,5,3,4,4,4,4,1,4,3,3,0,4,3,4,3,1,3,3,2,4,3,0,3,4,3,0,3,4,4,2,4,4,0,4,5,3,3,2,2,1,1,1,2,0,1,5,0,3,3,2,4,3,3,3,4,0,3,0,2,0,4,4,3,5,5,0,0,3,0,2,3,3,},
68 { 0,3,0,4,0,3,0,1,0,3,4,3,3,1,3,3,3,0,3,1,3,0,4,3,3,1,1,0,3,0,3,3,0,0,4,4,0,1,5,4,3,3,5,0,3,3,4,3,0,2,0,1,1,1,0,1,3,0,1,2,1,3,3,2,3,3,0,3,0,1,0,1,3,3,4,4,1,0,1,2,2,1,3,},
69 { 0,1,0,4,0,4,0,3,0,1,3,3,3,2,3,1,1,0,3,0,3,3,4,3,2,4,2,0,1,0,4,3,2,0,4,3,0,5,3,3,2,4,4,4,3,3,3,4,0,1,3,0,0,1,0,0,1,0,0,0,0,4,2,3,3,3,0,3,0,0,0,4,4,4,5,3,2,0,3,3,0,3,5,},
70 { 0,2,0,3,0,0,0,3,0,1,3,0,2,0,0,0,1,0,3,1,1,3,3,0,0,3,0,0,3,0,2,3,1,0,3,1,0,3,3,2,0,4,2,2,0,2,0,0,0,4,0,0,0,0,0,0,0,0,0,0,0,2,1,2,0,1,0,1,0,0,0,1,3,1,2,0,0,0,1,0,0,1,4,},
71 { 0,3,0,3,0,5,0,1,0,2,4,3,1,3,3,2,1,1,5,2,1,0,5,1,2,0,0,0,3,3,2,2,3,2,4,3,0,0,3,3,1,3,3,0,2,5,3,4,0,3,3,0,1,2,0,2,2,0,3,2,0,2,2,3,3,3,0,2,0,1,0,3,4,4,2,5,4,0,3,0,0,3,5,},
72 { 0,3,0,3,0,3,0,1,0,3,3,3,3,0,3,0,2,0,2,1,1,0,2,0,1,0,0,0,2,1,0,0,1,0,3,2,0,0,3,3,1,2,3,1,0,3,3,0,0,1,0,0,0,0,0,2,0,0,0,0,0,2,3,1,2,3,0,3,0,1,0,3,2,1,0,4,3,0,1,1,0,3,3,},
73 { 0,4,0,5,0,3,0,3,0,4,5,5,4,3,5,3,4,3,5,3,3,2,5,3,4,4,4,3,4,3,4,5,5,3,4,4,3,4,4,5,4,4,4,3,4,5,5,4,2,3,4,2,3,4,0,3,3,1,4,3,2,4,3,3,5,5,0,3,0,3,0,5,5,5,5,4,4,0,4,0,1,4,4,},
74 { 0,4,0,4,0,3,0,3,0,3,5,4,4,2,3,2,5,1,3,2,5,1,4,2,3,2,3,3,4,3,3,3,3,2,5,4,1,3,3,5,3,4,4,0,4,4,3,1,1,3,1,0,2,3,0,2,3,0,3,0,0,4,3,1,3,4,0,3,0,2,0,4,4,4,3,4,5,0,4,0,0,3,4,},
75 { 0,3,0,3,0,3,1,2,0,3,4,4,3,3,3,0,2,2,4,3,3,1,3,3,3,1,1,0,3,1,4,3,2,3,4,4,2,4,4,4,3,4,4,3,2,4,4,3,1,3,3,1,3,3,0,4,1,0,2,2,1,4,3,2,3,3,5,4,3,3,5,4,4,3,3,0,4,0,3,2,2,4,4,},
76 { 0,2,0,1,0,0,0,0,0,1,2,1,3,0,0,0,0,0,2,0,1,2,1,0,0,1,0,0,0,0,3,0,0,1,0,1,1,3,1,0,0,0,1,1,0,1,1,0,0,0,0,0,2,0,0,0,0,0,0,0,0,1,1,2,2,0,3,4,0,0,0,1,1,0,0,1,0,0,0,0,0,1,1,},
77 { 0,1,0,0,0,1,0,0,0,0,4,0,4,1,4,0,3,0,4,0,3,0,4,0,3,0,3,0,4,1,5,1,4,0,0,3,0,5,0,5,2,0,1,0,0,0,2,1,4,0,1,3,0,0,3,0,0,3,1,1,4,1,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,},
78 { 1,4,0,5,0,3,0,2,0,3,5,4,4,3,4,3,5,3,4,3,3,0,4,3,3,3,3,3,3,2,4,4,3,1,3,4,4,5,4,4,3,4,4,1,3,5,4,3,3,3,1,2,2,3,3,1,3,1,3,3,3,5,3,3,4,5,0,3,0,3,0,3,4,3,4,4,3,0,3,0,2,4,3,},
79 { 0,1,0,4,0,0,0,0,0,1,4,0,4,1,4,2,4,0,3,0,1,0,1,0,0,0,0,0,2,0,3,1,1,1,0,3,0,0,0,1,2,1,0,0,1,1,1,1,0,1,0,0,0,1,0,0,3,0,0,0,0,3,2,0,2,2,0,1,0,0,0,2,3,2,3,3,0,0,0,0,2,1,0,},
80 { 0,5,1,5,0,3,0,3,0,5,4,4,5,1,5,3,3,0,4,3,4,3,5,3,4,3,3,2,4,3,4,3,3,0,3,3,1,4,4,3,4,4,4,3,4,5,5,3,2,3,1,1,3,3,1,3,1,1,3,3,2,4,5,3,3,5,0,4,0,3,0,4,4,3,5,3,3,0,3,4,0,4,3,},
81 { 0,5,0,5,0,3,0,2,0,4,4,3,5,2,4,3,3,3,4,4,4,3,5,3,5,3,3,1,4,0,4,3,3,0,3,3,0,4,4,4,4,5,4,3,3,5,5,3,2,3,1,2,3,2,0,1,0,0,3,2,2,4,4,3,1,5,0,4,0,3,0,4,3,1,3,2,1,0,3,3,0,3,3,},
82 { 0,4,0,5,0,5,0,4,0,4,5,5,5,3,4,3,3,2,5,4,4,3,5,3,5,3,4,0,4,3,4,4,3,2,4,4,3,4,5,4,4,5,5,0,3,5,5,4,1,3,3,2,3,3,1,3,1,0,4,3,1,4,4,3,4,5,0,4,0,2,0,4,3,4,4,3,3,0,4,0,0,5,5,},
83 { 0,4,0,4,0,5,0,1,1,3,3,4,4,3,4,1,3,0,5,1,3,0,3,1,3,1,1,0,3,0,3,3,4,0,4,3,0,4,4,4,3,4,4,0,3,5,4,1,0,3,0,0,2,3,0,3,1,0,3,1,0,3,2,1,3,5,0,3,0,1,0,3,2,3,3,4,4,0,2,2,0,4,4,},
84 { 2,4,0,5,0,4,0,3,0,4,5,5,4,3,5,3,5,3,5,3,5,2,5,3,4,3,3,4,3,4,5,3,2,1,5,4,3,2,3,4,5,3,4,1,2,5,4,3,0,3,3,0,3,2,0,2,3,0,4,1,0,3,4,3,3,5,0,3,0,1,0,4,5,5,5,4,3,0,4,2,0,3,5,},
85 { 0,5,0,4,0,4,0,2,0,5,4,3,4,3,4,3,3,3,4,3,4,2,5,3,5,3,4,1,4,3,4,4,4,0,3,5,0,4,4,4,4,5,3,1,3,4,5,3,3,3,3,3,3,3,0,2,2,0,3,3,2,4,3,3,3,5,3,4,1,3,3,5,3,2,0,0,0,0,4,3,1,3,3,},
86 { 0,1,0,3,0,3,0,1,0,1,3,3,3,2,3,3,3,0,3,0,0,0,3,1,3,0,0,0,2,2,2,3,0,0,3,2,0,1,2,4,1,3,3,0,0,3,3,3,0,1,0,0,2,1,0,0,3,0,3,1,0,3,0,0,1,3,0,2,0,1,0,3,3,1,3,3,0,0,1,1,0,3,3,},
87 { 0,2,0,3,0,2,1,4,0,2,2,3,1,1,3,1,1,0,2,0,3,1,2,3,1,3,0,0,1,0,4,3,2,3,3,3,1,4,2,3,3,3,3,1,0,3,1,4,0,1,1,0,1,2,0,1,1,0,1,1,0,3,1,3,2,2,0,1,0,0,0,2,3,3,3,1,0,0,0,0,0,2,3,},
88 { 0,5,0,4,0,5,0,2,0,4,5,5,3,3,4,3,3,1,5,4,4,2,4,4,4,3,4,2,4,3,5,5,4,3,3,4,3,3,5,5,4,5,5,1,3,4,5,3,1,4,3,1,3,3,0,3,3,1,4,3,1,4,5,3,3,5,0,4,0,3,0,5,3,3,1,4,3,0,4,0,1,5,3,},
89 { 0,5,0,5,0,4,0,2,0,4,4,3,4,3,3,3,3,3,5,4,4,4,4,4,4,5,3,3,5,2,4,4,4,3,4,4,3,3,4,4,5,5,3,3,4,3,4,3,3,4,3,3,3,3,1,2,2,1,4,3,3,5,4,4,3,4,0,4,0,3,0,4,4,4,4,4,1,0,4,2,0,2,4,},
90 { 0,4,0,4,0,3,0,1,0,3,5,2,3,0,3,0,2,1,4,2,3,3,4,1,4,3,3,2,4,1,3,3,3,0,3,3,0,0,3,3,3,5,3,3,3,3,3,2,0,2,0,0,2,0,0,2,0,0,1,0,0,3,1,2,2,3,0,3,0,2,0,4,4,3,3,4,1,0,3,0,0,2,4,},
91 { 0,0,0,4,0,0,0,0,0,0,1,0,1,0,2,0,0,0,0,0,1,0,2,0,1,0,0,0,0,0,3,1,3,0,3,2,0,0,0,1,0,3,2,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,3,4,0,2,0,0,0,0,0,0,2,},
92 { 0,2,1,3,0,2,0,2,0,3,3,3,3,1,3,1,3,3,3,3,3,3,4,2,2,1,2,1,4,0,4,3,1,3,3,3,2,4,3,5,4,3,3,3,3,3,3,3,0,1,3,0,2,0,0,1,0,0,1,0,0,4,2,0,2,3,0,3,3,0,3,3,4,2,3,1,4,0,1,2,0,2,3,},
93 { 0,3,0,3,0,1,0,3,0,2,3,3,3,0,3,1,2,0,3,3,2,3,3,2,3,2,3,1,3,0,4,3,2,0,3,3,1,4,3,3,2,3,4,3,1,3,3,1,1,0,1,1,0,1,0,1,0,1,0,0,0,4,1,1,0,3,0,3,1,0,2,3,3,3,3,3,1,0,0,2,0,3,3,},
94 { 0,0,0,0,0,0,0,0,0,0,3,0,2,0,3,0,0,0,0,0,0,0,3,0,0,0,0,0,0,0,3,0,3,0,3,1,0,1,0,1,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,3,0,2,0,2,3,0,0,0,0,0,0,0,0,3,},
95 { 0,2,0,3,1,3,0,3,0,2,3,3,3,1,3,1,3,1,3,1,3,3,3,1,3,0,2,3,1,1,4,3,3,2,3,3,1,2,2,4,1,3,3,0,1,4,2,3,0,1,3,0,3,0,0,1,3,0,2,0,0,3,3,2,1,3,0,3,0,2,0,3,4,4,4,3,1,0,3,0,0,3,3,},
96 { 0,2,0,1,0,2,0,0,0,1,3,2,2,1,3,0,1,1,3,0,3,2,3,1,2,0,2,0,1,1,3,3,3,0,3,3,1,1,2,3,2,3,3,1,2,3,2,0,0,1,0,0,0,0,0,0,3,0,1,0,0,2,1,2,1,3,0,3,0,0,0,3,4,4,4,3,2,0,2,0,0,2,4,},
97 { 0,0,0,1,0,1,0,0,0,0,1,0,0,0,1,0,0,0,0,0,0,0,1,1,1,0,0,0,0,0,0,0,0,0,2,2,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,1,3,1,0,0,0,0,0,0,0,3,},
98 { 0,3,0,3,0,2,0,3,0,3,3,3,2,3,2,2,2,0,3,1,3,3,3,2,3,3,0,0,3,0,3,2,2,0,2,3,1,4,3,4,3,3,2,3,1,5,4,4,0,3,1,2,1,3,0,3,1,1,2,0,2,3,1,3,1,3,0,3,0,1,0,3,3,4,4,2,1,0,2,1,0,2,4,},
99 { 0,1,0,3,0,1,0,2,0,1,4,2,5,1,4,0,2,0,2,1,3,1,4,0,2,1,0,0,2,1,4,1,1,0,3,3,0,5,1,3,2,3,3,1,0,3,2,3,0,1,0,0,0,0,0,0,1,0,0,0,0,4,0,1,0,3,0,2,0,1,0,3,3,3,4,3,3,0,0,0,0,2,3,},
100 { 0,0,0,1,0,0,0,0,0,0,2,0,1,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,3,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,1,0,0,1,0,0,0,0,0,3,},
101 { 0,1,0,3,0,4,0,3,0,2,4,3,1,0,3,2,2,1,3,1,2,2,3,1,1,1,2,1,3,0,1,2,0,1,3,2,1,3,0,5,5,1,0,0,1,3,2,1,0,3,0,0,1,0,0,0,0,0,3,4,0,1,1,1,3,2,0,2,0,1,0,2,3,3,1,2,3,0,1,0,1,0,4,},
102 { 0,0,0,1,0,3,0,3,0,2,2,1,0,0,4,0,3,0,3,1,3,0,3,0,3,0,1,0,3,0,3,1,3,0,3,3,0,0,1,2,1,1,1,0,1,2,0,0,0,1,0,0,1,0,0,0,0,0,0,0,0,2,2,1,2,0,0,2,0,0,0,0,2,3,3,3,3,0,0,0,0,1,4,},
103 { 0,0,0,3,0,3,0,0,0,0,3,1,1,0,3,0,1,0,2,0,1,0,0,0,0,0,0,0,1,0,3,0,2,0,2,3,0,0,2,2,3,1,2,0,0,1,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,3,0,0,2,0,0,0,0,2,3,},
104 { 2,4,0,5,0,5,0,4,0,3,4,3,3,3,4,3,3,3,4,3,4,4,5,4,5,5,5,2,3,0,5,5,4,1,5,4,3,1,5,4,3,4,4,3,3,4,3,3,0,3,2,0,2,3,0,3,0,0,3,3,0,5,3,2,3,3,0,3,0,3,0,3,4,5,4,5,3,0,4,3,0,3,4,},
105 { 0,3,0,3,0,3,0,3,0,3,3,4,3,2,3,2,3,0,4,3,3,3,3,3,3,3,3,0,3,2,4,3,3,1,3,4,3,4,4,4,3,4,4,3,2,4,4,1,0,2,0,0,1,1,0,2,0,0,3,1,0,5,3,2,1,3,0,3,0,1,2,4,3,2,4,3,3,0,3,2,0,4,4,},
106 { 0,3,0,3,0,1,0,0,0,1,4,3,3,2,3,1,3,1,4,2,3,2,4,2,3,4,3,0,2,2,3,3,3,0,3,3,3,0,3,4,1,3,3,0,3,4,3,3,0,1,1,0,1,0,0,0,4,0,3,0,0,3,1,2,1,3,0,4,0,1,0,4,3,3,4,3,3,0,2,0,0,3,3,},
107 { 0,3,0,4,0,1,0,3,0,3,4,3,3,0,3,3,3,1,3,1,3,3,4,3,3,3,0,0,3,1,5,3,3,1,3,3,2,5,4,3,3,4,5,3,2,5,3,4,0,1,0,0,0,0,0,2,0,0,1,1,0,4,2,2,1,3,0,3,0,2,0,4,4,3,5,3,2,0,1,1,0,3,4,},
108 { 0,5,0,4,0,5,0,2,0,4,4,3,3,2,3,3,3,1,4,3,4,1,5,3,4,3,4,0,4,2,4,3,4,1,5,4,0,4,4,4,4,5,4,1,3,5,4,2,1,4,1,1,3,2,0,3,1,0,3,2,1,4,3,3,3,4,0,4,0,3,0,4,4,4,3,3,3,0,4,2,0,3,4,},
109 { 1,4,0,4,0,3,0,1,0,3,3,3,1,1,3,3,2,2,3,3,1,0,3,2,2,1,2,0,3,1,2,1,2,0,3,2,0,2,2,3,3,4,3,0,3,3,1,2,0,1,1,3,1,2,0,0,3,0,1,1,0,3,2,2,3,3,0,3,0,0,0,2,3,3,4,3,3,0,1,0,0,1,4,},
110 { 0,4,0,4,0,4,0,0,0,3,4,4,3,1,4,2,3,2,3,3,3,1,4,3,4,0,3,0,4,2,3,3,2,2,5,4,2,1,3,4,3,4,3,1,3,3,4,2,0,2,1,0,3,3,0,0,2,0,3,1,0,4,4,3,4,3,0,4,0,1,0,2,4,4,4,4,4,0,3,2,0,3,3,},
111 { 0,0,0,1,0,4,0,0,0,0,0,0,1,1,1,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,1,0,3,2,0,0,1,0,0,0,1,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,2,},
112 { 0,2,0,3,0,4,0,4,0,1,3,3,3,0,4,0,2,1,2,1,1,1,2,0,3,1,1,0,1,0,3,1,0,0,3,3,2,0,1,1,0,0,0,0,0,1,0,2,0,2,2,0,3,1,0,0,1,0,1,1,0,1,2,0,3,0,0,0,0,1,0,0,3,3,4,3,1,0,1,0,3,0,2,},
113 { 0,0,0,3,0,5,0,0,0,0,1,0,2,0,3,1,0,1,3,0,0,0,2,0,0,0,1,0,0,0,1,1,0,0,4,0,0,0,2,3,0,1,4,1,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,3,0,0,0,0,0,1,0,0,0,0,0,0,0,2,0,0,3,0,0,0,0,0,3,},
114 { 0,2,0,5,0,5,0,1,0,2,4,3,3,2,5,1,3,2,3,3,3,0,4,1,2,0,3,0,4,0,2,2,1,1,5,3,0,0,1,4,2,3,2,0,3,3,3,2,0,2,4,1,1,2,0,1,1,0,3,1,0,1,3,1,2,3,0,2,0,0,0,1,3,5,4,4,4,0,3,0,0,1,3,},
115 { 0,4,0,5,0,4,0,4,0,4,5,4,3,3,4,3,3,3,4,3,4,4,5,3,4,5,4,2,4,2,3,4,3,1,4,4,1,3,5,4,4,5,5,4,4,5,5,5,2,3,3,1,4,3,1,3,3,0,3,3,1,4,3,4,4,4,0,3,0,4,0,3,3,4,4,5,0,0,4,3,0,4,5,},
116 { 0,4,0,4,0,3,0,3,0,3,4,4,4,3,3,2,4,3,4,3,4,3,5,3,4,3,2,1,4,2,4,4,3,1,3,4,2,4,5,5,3,4,5,4,1,5,4,3,0,3,2,2,3,2,1,3,1,0,3,3,3,5,3,3,3,5,4,4,2,3,3,4,3,3,3,2,1,0,3,2,1,4,3,},
117 { 0,4,0,5,0,4,0,3,0,3,5,5,3,2,4,3,4,0,5,4,4,1,4,4,4,3,3,3,4,3,5,5,2,3,3,4,1,2,5,5,3,5,5,2,3,5,5,4,0,3,2,0,3,3,1,1,5,1,4,1,0,4,3,2,3,5,0,4,0,3,0,5,4,3,4,3,0,0,4,1,0,4,4,},
118 { 1,3,0,4,0,2,0,2,0,2,5,5,3,3,3,3,3,0,4,2,3,4,4,4,3,4,0,0,3,4,5,4,3,3,3,3,2,5,5,4,5,5,5,4,3,5,5,5,1,3,1,0,1,0,0,3,2,0,4,2,0,5,2,3,2,4,1,3,0,3,0,4,5,4,5,4,3,0,4,2,0,5,4,},
119 { 0,3,0,4,0,5,0,3,0,3,4,4,3,2,3,2,3,3,3,3,3,2,4,3,3,2,2,0,3,3,3,3,3,1,3,3,3,0,4,4,3,4,4,1,1,4,4,2,0,3,1,0,1,1,0,4,1,0,2,3,1,3,3,1,3,4,0,3,0,1,0,3,1,3,0,0,1,0,2,0,0,4,4,},
120 { 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,},
121 { 0,3,0,3,0,2,0,3,0,1,5,4,3,3,3,1,4,2,1,2,3,4,4,2,4,4,5,0,3,1,4,3,4,0,4,3,3,3,2,3,2,5,3,4,3,2,2,3,0,0,3,0,2,1,0,1,2,0,0,0,0,2,1,1,3,1,0,2,0,4,0,3,4,4,4,5,2,0,2,0,0,1,3,},
122 { 0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,1,1,1,0,0,1,1,0,0,0,4,2,1,1,0,1,0,3,2,0,0,3,1,1,1,2,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,3,0,1,0,0,0,2,0,0,0,1,4,0,4,2,1,0,0,0,0,0,1,},
123 { 0,0,0,0,0,0,0,0,0,1,0,1,0,0,0,0,1,0,0,0,0,0,0,1,0,1,0,0,0,0,3,1,0,0,0,2,0,2,1,0,0,1,2,1,0,1,1,0,0,3,0,0,0,0,0,0,0,0,0,0,0,1,3,1,0,0,0,0,0,1,0,0,2,1,0,0,0,0,0,0,0,0,2,},
124 { 0,4,0,4,0,4,0,3,0,4,4,3,4,2,4,3,2,0,4,4,4,3,5,3,5,3,3,2,4,2,4,3,4,3,1,4,0,2,3,4,4,4,3,3,3,4,4,4,3,4,1,3,4,3,2,1,2,1,3,3,3,4,4,3,3,5,0,4,0,3,0,4,3,3,3,2,1,0,3,0,0,3,3,},
125 { 0,4,0,3,0,3,0,3,0,3,5,5,3,3,3,3,4,3,4,3,3,3,4,4,4,3,3,3,3,4,3,5,3,3,1,3,2,4,5,5,5,5,4,3,4,5,5,3,2,2,3,3,3,3,2,3,3,1,2,3,2,4,3,3,3,4,0,4,0,2,0,4,3,2,2,1,2,0,3,0,0,4,1,},
126 };
127
128 #define MINIMUM_DATA_THRESHOLD 4
129
130 void JapaneseContextAnalysis::HandleData(const char* aBuf, PRUint32 aLen)
131 {
132 PRUint32 charLen;
133 PRInt32 order;
134 PRUint32 i;
135
136 if (mDone)
137 return;
138
139 //The buffer we got is byte oriented, and a character may span in more than one
140 //buffers. In case the last one or two byte in last buffer is not complete, we
141 //record how many byte needed to complete that character and skip these bytes here.
142 //We can choose to record those bytes as well and analyse the character once it
143 //is complete, but since a character will not make much difference, by simply skipping
144 //this character will simply our logic and improve performance.
145 for (i = mNeedToSkipCharNum; i < aLen; )
146 {
147 order = GetOrder(aBuf+i, &charLen);
148 i+= charLen;
149 if (i > aLen){
150 mNeedToSkipCharNum = i - aLen;
151 mLastCharOrder = -1;
152 }
153 else
154 {
155 if (order != -1 && mLastCharOrder != -1)
156 {
157 mTotalRel ++;
158 if (mTotalRel > MAX_REL_THRESHOLD)
159 {
160 mDone = PR_TRUE;
161 break;
162 }
163 mRelSample[jp2CharContext[mLastCharOrder][order]]++;
164 }
165 mLastCharOrder = order;
166 }
167 }
168
169 return;
170 }
171
172 void JapaneseContextAnalysis::Reset(void)
173 {
174 mTotalRel = 0;
175 for (PRUint32 i = 0; i < NUM_OF_CATEGORY; i++)
176 mRelSample[i] = 0;
177 mNeedToSkipCharNum = 0;
178 mLastCharOrder = -1;
179 mDone = PR_FALSE;
180 }
181 #define DONT_KNOW (float)-1
182
183 float JapaneseContextAnalysis::GetConfidence()
184 {
185 //This is just one way to calculate confidence. It works well for me.
186 if (mTotalRel > MINIMUM_DATA_THRESHOLD)
187 return ((float)(mTotalRel - mRelSample[0]))/mTotalRel;
188 else
189 return (float)DONT_KNOW;
190 }
191
192
193 PRInt32 SJISContextAnalysis::GetOrder(const char* str, PRUint32 *charLen)
194 {
195 //find out current char's byte length
196 if ((unsigned char)*str >= (unsigned char)0x81 && (unsigned char)*str <= (unsigned char)0x9f ||
197 (unsigned char)*str >= (unsigned char)0xe0 && (unsigned char)*str <= (unsigned char)0xfc )
198 *charLen = 2;
199 else
200 *charLen = 1;
201
202 //return its order if it is hiragana
203 if (*str == '\202' &&
204 (unsigned char)*(str+1) >= (unsigned char)0x9f &&
205 (unsigned char)*(str+1) <= (unsigned char)0xf1)
206 return (unsigned char)*(str+1) - (unsigned char)0x9f;
207 return -1;
208 }
209
210 PRInt32 EUCJPContextAnalysis::GetOrder(const char* str, PRUint32 *charLen)
211 {
212 //find out current char's byte length
213 if ((unsigned char)*str == (unsigned char)0x8e ||
214 (unsigned char)*str >= (unsigned char)0xa1 &&
215 (unsigned char)*str <= (unsigned char)0xfe)
216 *charLen = 2;
217 else if ((unsigned char)*str == (unsigned char)0x8f)
218 *charLen = 3;
219 else
220 *charLen = 1;
221
222 //return its order if it is hiragana
223 if ((unsigned char)*str == (unsigned char)0xa4 &&
224 (unsigned char)*(str+1) >= (unsigned char)0xa1 &&
225 (unsigned char)*(str+1) <= (unsigned char)0xf3)
226 return (unsigned char)*(str+1) - (unsigned char)0xa1;
227 return -1;
228 }
229
230
+0
-137
c/src/JpCntx.h less more
0 /* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
1 /* ***** BEGIN LICENSE BLOCK *****
2 * Version: MPL 1.1/GPL 2.0/LGPL 2.1
3 *
4 * The contents of this file are subject to the Mozilla Public License Version
5 * 1.1 (the "License"); you may not use this file except in compliance with
6 * the License. You may obtain a copy of the License at
7 * http://www.mozilla.org/MPL/
8 *
9 * Software distributed under the License is distributed on an "AS IS" basis,
10 * WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License
11 * for the specific language governing rights and limitations under the
12 * License.
13 *
14 * The Original Code is Mozilla Communicator client code.
15 *
16 * The Initial Developer of the Original Code is
17 * Netscape Communications Corporation.
18 * Portions created by the Initial Developer are Copyright (C) 1998
19 * the Initial Developer. All Rights Reserved.
20 *
21 * Contributor(s):
22 *
23 * Alternatively, the contents of this file may be used under the terms of
24 * either the GNU General Public License Version 2 or later (the "GPL"), or
25 * the GNU Lesser General Public License Version 2.1 or later (the "LGPL"),
26 * in which case the provisions of the GPL or the LGPL are applicable instead
27 * of those above. If you wish to allow use of your version of this file only
28 * under the terms of either the GPL or the LGPL, and not to allow others to
29 * use your version of this file under the terms of the MPL, indicate your
30 * decision by deleting the provisions above and replace them with the notice
31 * and other provisions required by the GPL or the LGPL. If you do not delete
32 * the provisions above, a recipient may use your version of this file under
33 * the terms of any one of the MPL, the GPL or the LGPL.
34 *
35 * ***** END LICENSE BLOCK ***** */
36
37 #ifndef __JPCNTX_H__
38 #define __JPCNTX_H__
39
40 #define NUM_OF_CATEGORY 6
41
42 #include "nscore.h"
43
44 #define ENOUGH_REL_THRESHOLD 100
45 #define MAX_REL_THRESHOLD 1000
46
47 //hiragana frequency category table
48 extern char jp2CharContext[83][83];
49
50 class JapaneseContextAnalysis
51 {
52 public:
53 JapaneseContextAnalysis() {Reset();}
54
55 void HandleData(const char* aBuf, PRUint32 aLen);
56
57 void HandleOneChar(const char* aStr, PRUint32 aCharLen)
58 {
59 PRInt32 order;
60
61 //if we received enough data, stop here
62 if (mTotalRel > MAX_REL_THRESHOLD) mDone = PR_TRUE;
63 if (mDone) return;
64
65 //Only 2-bytes characters are of our interest
66 order = (aCharLen == 2) ? GetOrder(aStr) : -1;
67 if (order != -1 && mLastCharOrder != -1)
68 {
69 mTotalRel++;
70 //count this sequence to its category counter
71 mRelSample[jp2CharContext[mLastCharOrder][order]]++;
72 }
73 mLastCharOrder = order;
74 }
75
76 float GetConfidence();
77 void Reset(void);
78 void SetOpion(){}
79 PRBool GotEnoughData() {return mTotalRel > ENOUGH_REL_THRESHOLD;}
80
81 protected:
82 virtual PRInt32 GetOrder(const char* str, PRUint32 *charLen) = 0;
83 virtual PRInt32 GetOrder(const char* str) = 0;
84
85 //category counters, each interger counts sequence in its category
86 PRUint32 mRelSample[NUM_OF_CATEGORY];
87
88 //total sequence received
89 PRUint32 mTotalRel;
90
91 //The order of previous char
92 PRInt32 mLastCharOrder;
93
94 //if last byte in current buffer is not the last byte of a character, we
95 //need to know how many byte to skip in next buffer.
96 PRUint32 mNeedToSkipCharNum;
97
98 //If this flag is set to PR_TRUE, detection is done and conclusion has been made
99 PRBool mDone;
100 };
101
102
103 class SJISContextAnalysis : public JapaneseContextAnalysis
104 {
105 //SJISContextAnalysis(){};
106 protected:
107 PRInt32 GetOrder(const char* str, PRUint32 *charLen);
108
109 PRInt32 GetOrder(const char* str)
110 {
111 //We only interested in Hiragana, so first byte is '\202'
112 if (*str == '\202' &&
113 (unsigned char)*(str+1) >= (unsigned char)0x9f &&
114 (unsigned char)*(str+1) <= (unsigned char)0xf1)
115 return (unsigned char)*(str+1) - (unsigned char)0x9f;
116 return -1;
117 }
118 };
119
120 class EUCJPContextAnalysis : public JapaneseContextAnalysis
121 {
122 protected:
123 PRInt32 GetOrder(const char* str, PRUint32 *charLen);
124 PRInt32 GetOrder(const char* str)
125 //We only interested in Hiragana, so first byte is '\244'
126 {
127 if (*str == '\244' &&
128 (unsigned char)*(str+1) >= (unsigned char)0xa1 &&
129 (unsigned char)*(str+1) <= (unsigned char)0xf3)
130 return (unsigned char)*(str+1) - (unsigned char)0xa1;
131 return -1;
132 }
133 };
134
135 #endif /* __JPCNTX_H__ */
136
+0
-246
c/src/LangBulgarianModel.cpp less more
0 /* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
1 /* ***** BEGIN LICENSE BLOCK *****
2 * Version: MPL 1.1/GPL 2.0/LGPL 2.1
3 *
4 * The contents of this file are subject to the Mozilla Public License Version
5 * 1.1 (the "License"); you may not use this file except in compliance with
6 * the License. You may obtain a copy of the License at
7 * http://www.mozilla.org/MPL/
8 *
9 * Software distributed under the License is distributed on an "AS IS" basis,
10 * WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License
11 * for the specific language governing rights and limitations under the
12 * License.
13 *
14 * The Original Code is Mozilla Communicator client code.
15 *
16 * The Initial Developer of the Original Code is
17 * Netscape Communications Corporation.
18 * Portions created by the Initial Developer are Copyright (C) 1998
19 * the Initial Developer. All Rights Reserved.
20 *
21 * Contributor(s):
22 *
23 * Alternatively, the contents of this file may be used under the terms of
24 * either the GNU General Public License Version 2 or later (the "GPL"), or
25 * the GNU Lesser General Public License Version 2.1 or later (the "LGPL"),
26 * in which case the provisions of the GPL or the LGPL are applicable instead
27 * of those above. If you wish to allow use of your version of this file only
28 * under the terms of either the GPL or the LGPL, and not to allow others to
29 * use your version of this file under the terms of the MPL, indicate your
30 * decision by deleting the provisions above and replace them with the notice
31 * and other provisions required by the GPL or the LGPL. If you do not delete
32 * the provisions above, a recipient may use your version of this file under
33 * the terms of any one of the MPL, the GPL or the LGPL.
34 *
35 * ***** END LICENSE BLOCK ***** */
36
37 #include "universalchardet.h"
38 #include "nsSBCharSetProber.h"
39 /****************************************************************
40 255: Control characters that usually does not exist in any text
41 254: Carriage/Return
42 253: symbol (punctuation) that does not belong to word
43 252: 0 - 9
44
45 *****************************************************************/
46
47 //Character Mapping Table:
48 //this talbe is modified base on win1251BulgarianCharToOrderMap, so
49 //only number <64 is sure valid
50
51 unsigned char Latin5_BulgarianCharToOrderMap[] =
52 {
53 255,255,255,255,255,255,255,255,255,255,254,255,255,254,255,255, //00
54 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, //10
55 +253,253,253,253,253,253,253,253,253,253,253,253,253,253,253,253, //20
56 252,252,252,252,252,252,252,252,252,252,253,253,253,253,253,253, //30
57 253, 77, 90, 99,100, 72,109,107,101, 79,185, 81,102, 76, 94, 82, //40
58 110,186,108, 91, 74,119, 84, 96,111,187,115,253,253,253,253,253, //50
59 253, 65, 69, 70, 66, 63, 68,112,103, 92,194,104, 95, 86, 87, 71, //60
60 116,195, 85, 93, 97,113,196,197,198,199,200,253,253,253,253,253, //70
61 194,195,196,197,198,199,200,201,202,203,204,205,206,207,208,209, //80
62 210,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225, //90
63 81,226,227,228,229,230,105,231,232,233,234,235,236, 45,237,238, //a0
64 31, 32, 35, 43, 37, 44, 55, 47, 40, 59, 33, 46, 38, 36, 41, 30, //b0
65 39, 28, 34, 51, 48, 49, 53, 50, 54, 57, 61,239, 67,240, 60, 56, //c0
66 1, 18, 9, 20, 11, 3, 23, 15, 2, 26, 12, 10, 14, 6, 4, 13, //d0
67 7, 8, 5, 19, 29, 25, 22, 21, 27, 24, 17, 75, 52,241, 42, 16, //e0
68 62,242,243,244, 58,245, 98,246,247,248,249,250,251, 91,252,253, //f0
69 };
70
71 unsigned char win1251BulgarianCharToOrderMap[] =
72 {
73 255,255,255,255,255,255,255,255,255,255,254,255,255,254,255,255, //00
74 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, //10
75 +253,253,253,253,253,253,253,253,253,253,253,253,253,253,253,253, //20
76 252,252,252,252,252,252,252,252,252,252,253,253,253,253,253,253, //30
77 253, 77, 90, 99,100, 72,109,107,101, 79,185, 81,102, 76, 94, 82, //40
78 110,186,108, 91, 74,119, 84, 96,111,187,115,253,253,253,253,253, //50
79 253, 65, 69, 70, 66, 63, 68,112,103, 92,194,104, 95, 86, 87, 71, //60
80 116,195, 85, 93, 97,113,196,197,198,199,200,253,253,253,253,253, //70
81 206,207,208,209,210,211,212,213,120,214,215,216,217,218,219,220, //80
82 221, 78, 64, 83,121, 98,117,105,222,223,224,225,226,227,228,229, //90
83 88,230,231,232,233,122, 89,106,234,235,236,237,238, 45,239,240, //a0
84 73, 80,118,114,241,242,243,244,245, 62, 58,246,247,248,249,250, //b0
85 31, 32, 35, 43, 37, 44, 55, 47, 40, 59, 33, 46, 38, 36, 41, 30, //c0
86 39, 28, 34, 51, 48, 49, 53, 50, 54, 57, 61,251, 67,252, 60, 56, //d0
87 1, 18, 9, 20, 11, 3, 23, 15, 2, 26, 12, 10, 14, 6, 4, 13, //e0
88 7, 8, 5, 19, 29, 25, 22, 21, 27, 24, 17, 75, 52,253, 42, 16, //f0
89 };
90
91 //Model Table:
92 //total sequences: 100%
93 //first 512 sequences: 96.9392%
94 //first 1024 sequences:3.0618%
95 //rest sequences: 0.2992%
96 //negative sequences: 0.0020%
97 char BulgarianLangModel[] =
98 {
99 0,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,2,3,3,3,3,3,3,3,3,2,3,3,3,3,3,
100 3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,0,3,3,3,2,2,3,2,2,1,2,2,
101 3,1,3,3,2,3,3,3,3,3,3,3,3,3,3,3,3,0,3,3,3,3,3,3,3,3,3,3,0,3,0,1,
102 0,0,0,0,0,0,0,0,0,0,1,0,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,
103 3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,2,3,2,3,3,3,3,3,3,3,3,0,3,1,0,
104 0,1,0,0,0,0,0,0,0,0,1,1,0,1,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,
105 3,2,2,2,3,3,3,3,3,3,3,3,3,3,3,3,3,1,3,2,3,3,3,3,3,3,3,3,0,3,0,0,
106 0,0,0,0,0,0,0,0,0,0,1,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
107 3,2,3,3,2,3,3,3,3,3,3,3,3,3,3,3,3,1,3,2,3,3,3,3,3,3,3,3,0,3,0,0,
108 0,0,0,0,0,0,0,0,0,0,1,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
109 3,3,3,3,3,3,3,3,3,3,3,2,3,2,2,1,3,3,3,3,2,2,2,1,1,2,0,1,0,1,0,0,
110 0,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,1,
111 3,3,3,3,3,3,3,2,3,2,2,3,3,1,1,2,3,3,2,3,3,3,3,2,1,2,0,2,0,3,0,0,
112 0,0,0,0,0,0,0,1,0,0,2,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,1,
113 3,3,3,3,3,3,3,1,3,3,3,3,3,2,3,2,3,3,3,3,3,2,3,3,1,3,0,3,0,2,0,0,
114 0,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,1,
115 3,3,3,3,3,3,3,3,1,3,3,2,3,3,3,1,3,3,2,3,2,2,2,0,0,2,0,2,0,2,0,0,
116 0,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,1,
117 3,3,3,3,3,3,3,3,3,0,3,3,3,2,2,3,3,3,1,2,2,3,2,1,1,2,0,2,0,0,0,0,
118 1,0,0,0,0,0,0,0,0,0,2,0,0,1,0,0,1,0,0,0,1,0,0,0,0,0,0,0,0,0,0,1,
119 3,3,3,3,3,3,3,2,3,3,1,2,3,2,2,2,3,3,3,3,3,2,2,3,1,2,0,2,1,2,0,0,
120 0,0,0,0,0,0,0,0,0,0,3,0,0,1,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,1,
121 3,3,3,3,3,1,3,3,3,3,3,2,3,3,3,2,3,3,2,3,2,2,2,3,1,2,0,1,0,1,0,0,
122 0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,1,
123 3,3,3,3,3,3,3,3,3,3,3,1,1,1,2,2,1,3,1,3,2,2,3,0,0,1,0,1,0,1,0,0,
124 0,0,0,1,0,0,0,0,1,0,2,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,1,
125 3,3,3,3,3,2,2,3,2,2,3,1,2,1,1,1,2,3,1,3,1,2,2,0,1,1,1,1,0,1,0,0,
126 0,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,1,
127 3,3,3,3,3,1,3,2,2,3,3,1,2,3,1,1,3,3,3,3,1,2,2,1,1,1,0,2,0,2,0,1,
128 0,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,1,
129 3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,1,2,2,3,3,3,2,2,1,1,2,0,2,0,1,0,0,
130 0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,1,
131 3,0,1,2,1,3,3,2,3,3,3,3,3,2,3,2,1,0,3,1,2,1,2,1,2,3,2,1,0,1,0,0,
132 0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
133 1,1,1,2,3,3,3,3,3,3,3,3,3,3,3,3,0,0,3,1,3,3,2,3,3,2,2,2,0,1,0,0,
134 0,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
135 2,3,3,3,3,0,3,3,3,3,3,2,1,1,2,1,3,3,0,3,1,1,1,1,3,2,0,1,0,0,0,0,
136 0,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,1,
137 3,3,2,2,2,3,3,3,3,3,3,3,3,3,3,3,1,1,3,1,3,3,2,3,2,2,2,3,0,2,0,0,
138 0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
139 3,3,3,3,3,2,3,3,2,2,3,2,1,1,1,1,1,3,1,3,1,1,0,0,0,1,0,0,0,1,0,0,
140 0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,
141 3,3,3,3,3,2,3,2,0,3,2,0,3,0,2,0,0,2,1,3,1,0,0,1,0,0,0,1,0,0,0,0,
142 0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,
143 3,3,3,3,2,1,1,1,1,2,1,1,2,1,1,1,2,2,1,2,1,1,1,0,1,1,0,1,0,1,0,0,
144 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,1,
145 3,3,3,3,2,1,3,1,1,2,1,3,2,1,1,0,1,2,3,2,1,1,1,0,0,0,0,0,0,0,0,0,
146 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
147 2,3,3,3,3,2,2,1,0,1,0,0,1,0,0,0,2,1,0,3,0,0,1,0,0,0,0,0,0,0,0,0,
148 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,
149 3,3,3,2,3,2,3,3,1,3,2,1,1,1,2,1,1,2,1,3,0,1,0,0,0,1,0,0,0,0,0,0,
150 0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
151 3,1,1,2,2,3,3,2,3,2,2,2,3,1,2,2,1,1,2,1,1,2,2,0,1,1,0,1,0,2,0,0,
152 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
153 3,3,3,3,2,1,3,1,0,2,2,1,3,2,1,0,0,2,0,2,0,1,0,0,0,0,0,0,0,1,0,0,
154 0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,1,
155 3,3,3,3,3,3,1,2,0,2,3,1,2,3,2,0,1,3,1,2,1,1,1,0,0,1,0,0,2,2,2,3,
156 2,2,2,2,1,2,1,1,2,2,1,1,2,0,1,1,1,0,0,1,1,0,0,1,1,0,0,0,1,1,0,1,
157 3,3,3,3,3,2,1,2,2,1,2,0,2,0,1,0,1,2,1,2,1,1,0,0,0,1,0,1,0,0,0,0,
158 0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,1,
159 3,3,2,3,3,1,1,3,1,0,3,2,1,0,0,0,1,2,0,2,0,1,0,0,0,1,0,1,2,1,2,2,
160 1,1,1,1,1,1,1,2,2,2,1,1,1,1,1,1,1,0,1,2,1,1,1,0,0,0,0,0,1,1,0,0,
161 3,1,0,1,0,2,3,2,2,2,3,2,2,2,2,2,1,0,2,1,2,1,1,1,0,1,2,1,2,2,2,1,
162 1,1,2,2,2,2,1,2,1,1,0,1,2,1,2,2,2,1,1,1,0,1,1,1,1,2,0,1,0,0,0,0,
163 2,3,2,3,3,0,0,2,1,0,2,1,0,0,0,0,2,3,0,2,0,0,0,0,0,1,0,0,2,0,1,2,
164 2,1,2,1,2,2,1,1,1,2,1,1,1,0,1,2,2,1,1,1,1,1,0,1,1,1,0,0,1,2,0,0,
165 3,3,2,2,3,0,2,3,1,1,2,0,0,0,1,0,0,2,0,2,0,0,0,1,0,1,0,1,2,0,2,2,
166 1,1,1,1,2,1,0,1,2,2,2,1,1,1,1,1,1,1,0,1,1,1,0,0,0,0,0,0,1,1,0,0,
167 2,3,2,3,3,0,0,3,0,1,1,0,1,0,0,0,2,2,1,2,0,0,0,0,0,0,0,0,2,0,1,2,
168 2,2,1,1,1,1,1,2,2,2,1,0,2,0,1,0,1,0,0,1,0,1,0,0,1,0,0,0,0,1,0,0,
169 3,3,3,3,2,2,2,2,2,0,2,1,1,1,1,2,1,2,1,1,0,2,0,1,0,1,0,0,2,0,1,2,
170 1,1,1,1,1,1,1,2,2,1,1,0,2,0,1,0,2,0,0,1,1,1,0,0,2,0,0,0,1,1,0,0,
171 2,3,3,3,3,1,0,0,0,0,0,0,0,0,0,0,2,0,0,1,1,0,0,0,0,0,0,1,2,0,1,2,
172 2,2,2,1,1,2,1,1,2,2,2,1,2,0,1,1,1,1,1,1,0,1,1,1,1,0,0,1,1,1,0,0,
173 2,3,3,3,3,0,2,2,0,2,1,0,0,0,1,1,1,2,0,2,0,0,0,3,0,0,0,0,2,0,2,2,
174 1,1,1,2,1,2,1,1,2,2,2,1,2,0,1,1,1,0,1,1,1,1,0,2,1,0,0,0,1,1,0,0,
175 2,3,3,3,3,0,2,1,0,0,2,0,0,0,0,0,1,2,0,2,0,0,0,0,0,0,0,0,2,0,1,2,
176 1,1,1,2,1,1,1,1,2,2,2,0,1,0,1,1,1,0,0,1,1,1,0,0,1,0,0,0,0,1,0,0,
177 3,3,2,2,3,0,1,0,1,0,0,0,0,0,0,0,1,1,0,3,0,0,0,0,0,0,0,0,1,0,2,2,
178 1,1,1,1,1,2,1,1,2,2,1,2,2,1,0,1,1,1,1,1,0,1,0,0,1,0,0,0,1,1,0,0,
179 3,1,0,1,0,2,2,2,2,3,2,1,1,1,2,3,0,0,1,0,2,1,1,0,1,1,1,1,2,1,1,1,
180 1,2,2,1,2,1,2,2,1,1,0,1,2,1,2,2,1,1,1,0,0,1,1,1,2,1,0,1,0,0,0,0,
181 2,1,0,1,0,3,1,2,2,2,2,1,2,2,1,1,1,0,2,1,2,2,1,1,2,1,1,0,2,1,1,1,
182 1,2,2,2,2,2,2,2,1,2,0,1,1,0,2,1,1,1,1,1,0,0,1,1,1,1,0,1,0,0,0,0,
183 2,1,1,1,1,2,2,2,2,1,2,2,2,1,2,2,1,1,2,1,2,3,2,2,1,1,1,1,0,1,0,0,
184 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
185 2,2,2,3,2,0,1,2,0,1,2,1,1,0,1,0,1,2,1,2,0,0,0,1,1,0,0,0,1,0,0,2,
186 1,1,0,0,1,1,0,1,1,1,1,0,2,0,1,1,1,0,0,1,1,0,0,0,0,1,0,0,0,1,0,0,
187 2,0,0,0,0,1,2,2,2,2,2,2,2,1,2,1,1,1,1,1,1,1,0,1,1,1,1,1,2,1,1,1,
188 1,2,2,2,2,1,1,2,1,2,1,1,1,0,2,1,2,1,1,1,0,2,1,1,1,1,0,1,0,0,0,0,
189 3,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,1,0,
190 1,1,0,1,0,1,1,1,1,1,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
191 2,2,2,3,2,0,0,0,0,1,0,0,0,0,0,0,1,1,0,2,0,0,0,0,0,0,0,0,1,0,1,2,
192 1,1,1,1,1,1,0,0,2,2,2,2,2,0,1,1,0,1,1,1,1,1,0,0,1,0,0,0,1,1,0,1,
193 2,3,1,2,1,0,1,1,0,2,2,2,0,0,1,0,0,1,1,1,1,0,0,0,0,0,0,0,1,0,1,2,
194 1,1,1,1,2,1,1,1,1,1,1,1,1,0,1,1,0,1,0,1,0,1,0,0,1,0,0,0,0,1,0,0,
195 2,2,2,2,2,0,0,2,0,0,2,0,0,0,0,0,0,1,0,1,0,0,0,0,0,0,0,0,2,0,2,2,
196 1,1,1,1,1,0,0,1,2,1,1,0,1,0,1,0,0,0,0,1,1,0,0,0,0,0,0,0,0,0,0,0,
197 1,2,2,2,2,0,0,2,0,1,1,0,0,0,1,0,0,2,0,2,0,0,0,0,0,0,0,0,0,0,1,1,
198 0,0,0,1,1,1,1,1,1,1,1,1,1,0,1,0,0,1,0,0,1,0,0,0,0,0,0,0,0,0,0,0,
199 1,2,2,3,2,0,0,1,0,0,1,0,0,0,0,0,0,1,0,2,0,0,0,1,0,0,0,0,0,0,0,2,
200 1,1,0,0,1,0,0,0,1,1,0,0,1,0,1,1,0,0,0,1,1,0,0,0,0,0,0,0,0,0,0,0,
201 2,1,2,2,2,1,2,1,2,2,1,1,2,1,1,1,0,1,1,1,1,2,0,1,0,1,1,1,1,0,1,1,
202 1,1,2,1,1,1,1,1,1,0,0,1,2,1,1,1,1,1,1,0,0,1,1,1,0,0,0,0,0,0,0,0,
203 1,0,0,1,3,1,1,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,
204 0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
205 2,2,2,2,1,0,0,1,0,2,0,0,0,0,0,1,1,1,0,1,0,0,0,0,0,0,0,0,2,0,0,1,
206 0,2,0,1,0,0,1,1,2,0,1,0,1,0,1,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,
207 1,2,2,2,2,0,1,1,0,2,1,0,1,1,1,0,0,1,0,2,0,1,0,0,0,0,0,0,0,0,0,1,
208 0,1,0,0,1,0,0,0,1,1,0,0,1,0,0,1,0,0,0,1,1,0,0,0,0,0,0,0,0,0,0,0,
209 2,2,2,2,2,0,0,1,0,0,0,1,0,1,0,0,0,1,0,1,0,0,0,0,0,0,0,0,0,0,0,1,
210 0,1,0,1,1,1,0,0,1,1,1,0,1,0,0,0,0,0,0,1,1,0,0,0,0,0,0,0,0,0,0,0,
211 2,0,1,0,0,1,2,1,1,1,1,1,1,2,2,1,0,0,1,0,1,0,0,0,0,1,1,1,1,0,0,0,
212 1,1,2,1,1,1,1,0,0,0,1,1,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
213 2,2,1,2,1,0,0,1,0,0,0,0,0,0,0,0,1,1,0,1,0,0,0,0,0,0,0,0,0,0,0,1,
214 0,0,0,0,0,0,0,0,1,1,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
215 3,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
216 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
217 1,0,0,1,2,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,1,0,0,0,
218 0,1,1,0,1,1,1,0,0,1,0,0,1,0,1,0,0,0,1,0,0,0,0,0,1,0,0,0,0,0,0,0,
219 1,0,1,0,0,1,1,1,1,1,1,1,1,1,1,1,0,0,1,0,2,0,0,2,0,1,0,0,1,0,0,1,
220 1,1,0,0,1,1,0,1,0,0,0,1,0,0,1,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,
221 0,0,0,0,0,0,1,1,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,1,0,
222 1,1,1,1,1,1,1,2,0,0,0,0,0,0,2,1,0,1,1,0,0,1,1,1,0,1,0,0,0,0,0,0,
223 2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
224 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
225 1,0,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,1,0,1,1,0,1,1,1,1,1,0,1,0,0,
226 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,
227 };
228
229 SequenceModel Latin5BulgarianModel =
230 {
231 Latin5_BulgarianCharToOrderMap,
232 BulgarianLangModel,
233 (float)0.969392,
234 PR_FALSE,
235 CHARDET_ENCODING_ISO_8859_5
236 };
237
238 SequenceModel Win1251BulgarianModel =
239 {
240 win1251BulgarianCharToOrderMap,
241 BulgarianLangModel,
242 (float)0.969392,
243 PR_FALSE,
244 CHARDET_ENCODING_WINDOWS_1251
245 };
+0
-356
c/src/LangCyrillicModel.cpp less more
0 /* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
1 /* ***** BEGIN LICENSE BLOCK *****
2 * Version: MPL 1.1/GPL 2.0/LGPL 2.1
3 *
4 * The contents of this file are subject to the Mozilla Public License Version
5 * 1.1 (the "License"); you may not use this file except in compliance with
6 * the License. You may obtain a copy of the License at
7 * http://www.mozilla.org/MPL/
8 *
9 * Software distributed under the License is distributed on an "AS IS" basis,
10 * WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License
11 * for the specific language governing rights and limitations under the
12 * License.
13 *
14 * The Original Code is Mozilla Communicator client code.
15 *
16 * The Initial Developer of the Original Code is
17 * Netscape Communications Corporation.
18 * Portions created by the Initial Developer are Copyright (C) 1998
19 * the Initial Developer. All Rights Reserved.
20 *
21 * Contributor(s):
22 *
23 * Alternatively, the contents of this file may be used under the terms of
24 * either the GNU General Public License Version 2 or later (the "GPL"), or
25 * the GNU Lesser General Public License Version 2.1 or later (the "LGPL"),
26 * in which case the provisions of the GPL or the LGPL are applicable instead
27 * of those above. If you wish to allow use of your version of this file only
28 * under the terms of either the GPL or the LGPL, and not to allow others to
29 * use your version of this file under the terms of the MPL, indicate your
30 * decision by deleting the provisions above and replace them with the notice
31 * and other provisions required by the GPL or the LGPL. If you do not delete
32 * the provisions above, a recipient may use your version of this file under
33 * the terms of any one of the MPL, the GPL or the LGPL.
34 *
35 * ***** END LICENSE BLOCK ***** */
36
37 #include "universalchardet.h"
38 #include "nsSBCharSetProber.h"
39
40
41
42 //KOI8-R language model
43 //Character Mapping Table:
44 unsigned char KOI8R_CharToOrderMap[] =
45 {
46 255,255,255,255,255,255,255,255,255,255,254,255,255,254,255,255, //00
47 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, //10
48 +253,253,253,253,253,253,253,253,253,253,253,253,253,253,253,253, //20
49 252,252,252,252,252,252,252,252,252,252,253,253,253,253,253,253, //30
50 253,142,143,144,145,146,147,148,149,150,151,152, 74,153, 75,154, //40
51 155,156,157,158,159,160,161,162,163,164,165,253,253,253,253,253, //50
52 253, 71,172, 66,173, 65,174, 76,175, 64,176,177, 77, 72,178, 69, //60
53 67,179, 78, 73,180,181, 79,182,183,184,185,253,253,253,253,253, //70
54 191,192,193,194,195,196,197,198,199,200,201,202,203,204,205,206, //80
55 207,208,209,210,211,212,213,214,215,216,217,218,219,220,221,222, //90
56 223,224,225, 68,226,227,228,229,230,231,232,233,234,235,236,237, //a0
57 238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253, //b0
58 27, 3, 21, 28, 13, 2, 39, 19, 26, 4, 23, 11, 8, 12, 5, 1, //c0
59 15, 16, 9, 7, 6, 14, 24, 10, 17, 18, 20, 25, 30, 29, 22, 54, //d0
60 59, 37, 44, 58, 41, 48, 53, 46, 55, 42, 60, 36, 49, 38, 31, 34, //e0
61 35, 43, 45, 32, 40, 52, 56, 33, 61, 62, 51, 57, 47, 63, 50, 70, //f0
62 };
63
64 unsigned char win1251_CharToOrderMap[] =
65 {
66 255,255,255,255,255,255,255,255,255,255,254,255,255,254,255,255, //00
67 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, //10
68 +253,253,253,253,253,253,253,253,253,253,253,253,253,253,253,253, //20
69 252,252,252,252,252,252,252,252,252,252,253,253,253,253,253,253, //30
70 253,142,143,144,145,146,147,148,149,150,151,152, 74,153, 75,154, //40
71 155,156,157,158,159,160,161,162,163,164,165,253,253,253,253,253, //50
72 253, 71,172, 66,173, 65,174, 76,175, 64,176,177, 77, 72,178, 69, //60
73 67,179, 78, 73,180,181, 79,182,183,184,185,253,253,253,253,253, //70
74 191,192,193,194,195,196,197,198,199,200,201,202,203,204,205,206,
75 207,208,209,210,211,212,213,214,215,216,217,218,219,220,221,222,
76 223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,
77 239,240,241,242,243,244,245,246, 68,247,248,249,250,251,252,253,
78 37, 44, 33, 46, 41, 48, 56, 51, 42, 60, 36, 49, 38, 31, 34, 35,
79 45, 32, 40, 52, 53, 55, 58, 50, 57, 63, 70, 62, 61, 47, 59, 43,
80 3, 21, 10, 19, 13, 2, 24, 20, 4, 23, 11, 8, 12, 5, 1, 15,
81 9, 7, 6, 14, 39, 26, 28, 22, 25, 29, 54, 18, 17, 30, 27, 16,
82 };
83
84 unsigned char latin5_CharToOrderMap[] =
85 {
86 255,255,255,255,255,255,255,255,255,255,254,255,255,254,255,255, //00
87 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, //10
88 +253,253,253,253,253,253,253,253,253,253,253,253,253,253,253,253, //20
89 252,252,252,252,252,252,252,252,252,252,253,253,253,253,253,253, //30
90 253,142,143,144,145,146,147,148,149,150,151,152, 74,153, 75,154, //40
91 155,156,157,158,159,160,161,162,163,164,165,253,253,253,253,253, //50
92 253, 71,172, 66,173, 65,174, 76,175, 64,176,177, 77, 72,178, 69, //60
93 67,179, 78, 73,180,181, 79,182,183,184,185,253,253,253,253,253, //70
94 191,192,193,194,195,196,197,198,199,200,201,202,203,204,205,206,
95 207,208,209,210,211,212,213,214,215,216,217,218,219,220,221,222,
96 223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,
97 37, 44, 33, 46, 41, 48, 56, 51, 42, 60, 36, 49, 38, 31, 34, 35,
98 45, 32, 40, 52, 53, 55, 58, 50, 57, 63, 70, 62, 61, 47, 59, 43,
99 3, 21, 10, 19, 13, 2, 24, 20, 4, 23, 11, 8, 12, 5, 1, 15,
100 9, 7, 6, 14, 39, 26, 28, 22, 25, 29, 54, 18, 17, 30, 27, 16,
101 239, 68,240,241,242,243,244,245,246,247,248,249,250,251,252,255,
102 };
103
104 unsigned char macCyrillic_CharToOrderMap[] =
105 {
106 255,255,255,255,255,255,255,255,255,255,254,255,255,254,255,255, //00
107 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, //10
108 +253,253,253,253,253,253,253,253,253,253,253,253,253,253,253,253, //20
109 252,252,252,252,252,252,252,252,252,252,253,253,253,253,253,253, //30
110 253,142,143,144,145,146,147,148,149,150,151,152, 74,153, 75,154, //40
111 155,156,157,158,159,160,161,162,163,164,165,253,253,253,253,253, //50
112 253, 71,172, 66,173, 65,174, 76,175, 64,176,177, 77, 72,178, 69, //60
113 67,179, 78, 73,180,181, 79,182,183,184,185,253,253,253,253,253, //70
114 37, 44, 33, 46, 41, 48, 56, 51, 42, 60, 36, 49, 38, 31, 34, 35,
115 45, 32, 40, 52, 53, 55, 58, 50, 57, 63, 70, 62, 61, 47, 59, 43,
116 191,192,193,194,195,196,197,198,199,200,201,202,203,204,205,206,
117 207,208,209,210,211,212,213,214,215,216,217,218,219,220,221,222,
118 223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,
119 239,240,241,242,243,244,245,246,247,248,249,250,251,252, 68, 16,
120 3, 21, 10, 19, 13, 2, 24, 20, 4, 23, 11, 8, 12, 5, 1, 15,
121 9, 7, 6, 14, 39, 26, 28, 22, 25, 29, 54, 18, 17, 30, 27,255,
122 };
123
124 unsigned char IBM855_CharToOrderMap[] =
125 {
126 255,255,255,255,255,255,255,255,255,255,254,255,255,254,255,255, //00
127 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, //10
128 +253,253,253,253,253,253,253,253,253,253,253,253,253,253,253,253, //20
129 252,252,252,252,252,252,252,252,252,252,253,253,253,253,253,253, //30
130 253,142,143,144,145,146,147,148,149,150,151,152, 74,153, 75,154, //40
131 155,156,157,158,159,160,161,162,163,164,165,253,253,253,253,253, //50
132 253, 71,172, 66,173, 65,174, 76,175, 64,176,177, 77, 72,178, 69, //60
133 67,179, 78, 73,180,181, 79,182,183,184,185,253,253,253,253,253, //70
134 191,192,193,194, 68,195,196,197,198,199,200,201,202,203,204,205,
135 206,207,208,209,210,211,212,213,214,215,216,217, 27, 59, 54, 70,
136 3, 37, 21, 44, 28, 58, 13, 41, 2, 48, 39, 53, 19, 46,218,219,
137 220,221,222,223,224, 26, 55, 4, 42,225,226,227,228, 23, 60,229,
138 230,231,232,233,234,235, 11, 36,236,237,238,239,240,241,242,243,
139 8, 49, 12, 38, 5, 31, 1, 34, 15,244,245,246,247, 35, 16,248,
140 43, 9, 45, 7, 32, 6, 40, 14, 52, 24, 56, 10, 33, 17, 61,249,
141 250, 18, 62, 20, 51, 25, 57, 30, 47, 29, 63, 22, 50,251,252,255,
142 };
143
144 unsigned char IBM866_CharToOrderMap[] =
145 {
146 255,255,255,255,255,255,255,255,255,255,254,255,255,254,255,255, //00
147 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, //10
148 +253,253,253,253,253,253,253,253,253,253,253,253,253,253,253,253, //20
149 252,252,252,252,252,252,252,252,252,252,253,253,253,253,253,253, //30
150 253,142,143,144,145,146,147,148,149,150,151,152, 74,153, 75,154, //40
151 155,156,157,158,159,160,161,162,163,164,165,253,253,253,253,253, //50
152 253, 71,172, 66,173, 65,174, 76,175, 64,176,177, 77, 72,178, 69, //60
153 67,179, 78, 73,180,181, 79,182,183,184,185,253,253,253,253,253, //70
154 37, 44, 33, 46, 41, 48, 56, 51, 42, 60, 36, 49, 38, 31, 34, 35,
155 45, 32, 40, 52, 53, 55, 58, 50, 57, 63, 70, 62, 61, 47, 59, 43,
156 3, 21, 10, 19, 13, 2, 24, 20, 4, 23, 11, 8, 12, 5, 1, 15,
157 191,192,193,194,195,196,197,198,199,200,201,202,203,204,205,206,
158 207,208,209,210,211,212,213,214,215,216,217,218,219,220,221,222,
159 223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,
160 9, 7, 6, 14, 39, 26, 28, 22, 25, 29, 54, 18, 17, 30, 27, 16,
161 239, 68,240,241,242,243,244,245,246,247,248,249,250,251,252,255,
162 };
163
164 //Model Table:
165 //total sequences: 100%
166 //first 512 sequences: 97.6601%
167 //first 1024 sequences: 2.3389%
168 //rest sequences: 0.1237%
169 //negative sequences: 0.0009%
170 char RussianLangModel[] =
171 {
172 0,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,1,1,3,3,3,3,1,3,3,3,2,3,2,3,3,
173 3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,0,3,2,2,2,2,2,0,0,2,
174 3,3,3,2,3,3,3,3,3,3,3,3,3,3,2,3,3,0,0,3,3,3,3,3,3,3,3,3,2,3,2,0,
175 0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
176 3,3,3,2,2,3,3,3,3,3,3,3,3,3,2,3,3,0,0,3,3,3,3,3,3,3,3,2,3,3,1,0,
177 0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
178 3,2,3,2,3,3,3,3,3,3,3,3,3,3,3,3,3,0,0,3,3,3,3,3,3,3,3,3,3,3,2,1,
179 0,0,0,0,0,0,0,2,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
180 3,3,3,3,3,3,3,3,3,3,3,3,3,3,2,3,3,0,0,3,3,3,3,3,3,3,3,3,3,3,2,1,
181 0,0,0,0,0,1,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
182 3,3,3,3,3,3,3,3,2,2,2,3,1,3,3,1,3,3,3,3,2,2,3,0,2,2,2,3,3,2,1,0,
183 0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,
184 3,3,3,3,3,3,2,3,3,3,3,3,2,2,3,2,3,3,3,2,1,2,2,0,1,2,2,2,2,2,2,0,
185 0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,
186 3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,2,2,2,3,0,2,2,3,3,2,1,2,0,
187 0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,1,0,0,2,0,0,0,0,0,0,0,0,0,
188 3,3,3,3,3,3,2,3,3,1,2,3,2,2,3,2,3,3,3,3,2,2,3,0,3,2,2,3,1,1,1,0,
189 0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
190 3,3,3,3,3,3,3,3,2,2,3,3,3,3,3,2,3,3,3,3,2,2,2,0,3,3,3,2,2,2,2,0,
191 0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
192 3,3,3,3,3,3,3,3,3,3,2,3,2,3,3,3,3,3,3,2,3,2,2,0,1,3,2,1,2,2,1,0,
193 0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,
194 3,3,3,3,3,3,3,3,3,3,3,2,1,1,3,0,1,1,1,1,2,1,1,0,2,2,2,1,2,0,1,0,
195 0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
196 3,3,3,3,3,3,2,3,3,2,2,2,2,1,3,2,3,2,3,2,1,2,2,0,1,1,2,1,2,1,2,0,
197 0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
198 3,3,3,3,3,3,3,3,3,3,3,3,2,2,3,2,3,3,3,2,2,2,2,0,2,2,2,2,3,1,1,0,
199 0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,
200 3,2,3,2,2,3,3,3,3,3,3,3,3,3,1,3,2,0,0,3,3,3,3,2,3,3,3,3,2,3,2,0,
201 0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
202 2,3,3,3,3,3,2,2,3,3,0,2,1,0,3,2,3,2,3,0,0,1,2,0,0,1,0,1,2,1,1,0,
203 0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
204 3,0,3,0,2,3,3,3,3,2,3,3,3,3,1,2,2,0,0,2,3,2,2,2,3,2,3,2,2,3,0,0,
205 0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
206 3,2,3,0,2,3,2,3,0,1,2,3,3,2,0,2,3,0,0,2,3,2,2,0,1,3,1,3,2,2,1,0,
207 0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
208 3,1,3,0,2,3,3,3,3,3,3,3,3,2,1,3,2,0,0,2,2,3,3,3,2,3,3,0,2,2,0,0,
209 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
210 3,3,3,3,3,3,2,2,3,3,2,2,2,3,3,0,0,1,1,1,1,1,2,0,0,1,1,1,1,0,1,0,
211 0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
212 3,3,3,3,3,3,2,2,3,3,3,3,3,3,3,0,3,2,3,3,2,3,2,0,2,1,0,1,1,0,1,0,
213 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,
214 3,3,3,3,3,3,2,3,3,3,2,2,2,2,3,1,3,2,3,1,1,2,1,0,2,2,2,2,1,3,1,0,
215 0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,
216 2,2,3,3,3,3,3,1,2,2,1,3,1,0,3,0,0,3,0,0,0,1,1,0,1,2,1,0,0,0,0,0,
217 0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
218 3,2,2,1,1,3,3,3,2,2,1,2,2,3,1,1,2,0,0,2,2,1,3,0,0,2,1,1,2,1,1,0,
219 0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
220 3,2,3,3,3,3,1,2,2,2,1,2,1,3,3,1,1,2,1,2,1,2,2,0,2,0,0,1,1,0,1,0,
221 0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
222 2,3,3,3,3,3,2,1,3,2,2,3,2,0,3,2,0,3,0,1,0,1,1,0,0,1,1,1,1,0,1,0,
223 0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
224 3,3,2,3,3,3,2,2,2,3,3,1,2,1,2,1,0,1,0,1,1,0,1,0,0,2,1,1,1,0,1,0,
225 0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,
226 3,1,1,2,1,2,3,3,2,2,1,2,2,3,0,2,1,0,0,2,2,3,2,1,2,2,2,2,2,3,1,0,
227 0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
228 3,3,3,3,3,1,1,0,1,1,2,2,1,1,3,0,0,1,3,1,1,1,0,0,0,1,0,1,1,0,0,0,
229 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
230 2,1,3,3,3,2,0,0,0,2,1,0,1,0,2,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
231 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
232 2,0,1,0,0,2,3,2,2,2,1,2,2,2,1,2,1,0,0,1,1,1,0,2,0,1,1,1,0,0,1,1,
233 1,0,0,0,0,0,1,2,0,0,0,0,0,1,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,
234 2,3,3,3,3,0,0,0,0,1,0,0,0,0,3,0,1,2,1,0,0,0,0,0,0,0,1,1,0,0,1,1,
235 1,0,1,0,1,2,0,0,1,1,2,1,0,1,1,1,1,0,1,1,1,1,0,1,0,0,1,0,0,1,1,0,
236 2,2,3,2,2,2,3,1,2,2,2,2,2,2,2,2,1,1,1,1,1,1,1,0,1,0,1,1,1,0,2,1,
237 1,1,1,1,1,1,1,1,2,1,1,1,1,1,1,1,1,1,1,0,1,0,1,1,0,1,1,1,0,1,1,0,
238 3,3,3,2,2,2,2,3,2,2,1,1,2,2,2,2,1,1,3,1,2,1,2,0,0,1,1,0,1,0,2,1,
239 1,1,1,1,1,2,1,0,1,1,1,1,0,1,0,0,1,1,0,0,1,0,1,0,0,1,0,0,0,1,1,0,
240 2,0,0,1,0,3,2,2,2,2,1,2,1,2,1,2,0,0,0,2,1,2,2,1,1,2,2,0,1,1,0,2,
241 1,1,1,1,1,0,1,1,1,2,1,1,1,2,1,0,1,2,1,1,1,1,0,1,1,1,0,0,1,0,0,1,
242 1,3,2,2,2,1,1,1,2,3,0,0,0,0,2,0,2,2,1,0,0,0,0,0,0,1,0,0,0,0,1,1,
243 1,0,1,1,0,1,0,1,1,0,1,1,0,2,0,0,1,1,0,0,1,0,0,0,0,0,0,0,0,1,1,0,
244 2,3,2,3,2,1,2,2,2,2,1,0,0,0,2,0,0,1,1,0,0,0,0,0,0,0,1,1,0,0,2,1,
245 1,1,2,1,0,2,0,0,1,0,1,0,0,1,0,0,1,1,0,1,1,0,0,0,0,0,1,0,0,0,0,0,
246 3,0,0,1,0,2,2,2,3,2,2,2,2,2,2,2,0,0,0,2,1,2,1,1,1,2,2,0,0,0,1,2,
247 1,1,1,1,1,0,1,2,1,1,1,1,1,1,1,0,1,1,1,1,1,1,0,1,1,1,1,1,1,0,0,1,
248 2,3,2,3,3,2,0,1,1,1,0,0,1,0,2,0,1,1,3,1,0,0,0,0,0,0,0,1,0,0,2,1,
249 1,1,1,1,1,1,1,0,1,0,1,1,1,1,0,1,1,1,0,0,1,1,0,1,0,0,0,0,0,0,1,0,
250 2,3,3,3,3,1,2,2,2,2,0,1,1,0,2,1,1,1,2,1,0,1,1,0,0,1,0,1,0,0,2,0,
251 0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
252 2,3,3,3,2,0,0,1,1,2,2,1,0,0,2,0,1,1,3,0,0,1,0,0,0,0,0,1,0,1,2,1,
253 1,1,2,0,1,1,1,0,1,0,1,1,0,1,0,1,1,1,1,0,1,0,0,0,0,0,0,1,0,1,1,0,
254 1,3,2,3,2,1,0,0,2,2,2,0,1,0,2,0,1,1,1,0,1,0,0,0,3,0,1,1,0,0,2,1,
255 1,1,1,0,1,1,0,0,0,0,1,1,0,1,0,0,2,1,1,0,1,0,0,0,1,0,1,0,0,1,1,0,
256 3,1,2,1,1,2,2,2,2,2,2,1,2,2,1,1,0,0,0,2,2,2,0,0,0,1,2,1,0,1,0,1,
257 2,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,2,1,1,1,0,1,0,1,1,0,1,1,1,0,0,1,
258 3,0,0,0,0,2,0,1,1,1,1,1,1,1,0,1,0,0,0,1,1,1,0,1,0,1,1,0,0,1,0,1,
259 1,1,0,0,1,0,0,0,1,0,1,1,0,0,1,0,1,0,1,0,0,0,0,1,0,0,0,1,0,0,0,1,
260 1,3,3,2,2,0,0,0,2,2,0,0,0,1,2,0,1,1,2,0,0,0,0,0,0,0,0,1,0,0,2,1,
261 0,1,1,0,0,1,1,0,0,0,1,1,0,1,1,0,1,1,0,0,1,0,0,0,0,0,0,0,0,0,1,0,
262 2,3,2,3,2,0,0,0,0,1,1,0,0,0,2,0,2,0,2,0,0,0,0,0,1,0,0,1,0,0,1,1,
263 1,1,2,0,1,2,1,0,1,1,2,1,1,1,1,1,2,1,1,0,1,0,0,1,1,1,1,1,0,1,1,0,
264 1,3,2,2,2,1,0,0,2,2,1,0,1,2,2,0,0,1,0,0,0,0,0,0,0,0,0,1,0,0,1,1,
265 0,0,1,1,0,1,1,0,0,1,1,0,1,1,0,0,1,1,0,0,1,0,0,0,0,0,0,0,0,0,0,0,
266 1,0,0,1,0,2,3,1,2,2,2,2,2,2,1,1,0,0,0,1,0,1,0,2,1,1,1,0,0,0,0,1,
267 1,1,0,1,1,0,1,1,1,1,0,0,0,1,0,0,0,1,0,0,0,0,0,0,0,0,0,0,1,0,0,0,
268 2,0,2,0,0,1,0,3,2,1,2,1,2,2,0,1,0,0,0,2,1,0,0,2,1,1,1,1,0,2,0,2,
269 2,1,1,1,1,1,1,1,1,1,1,1,1,2,1,0,1,1,1,1,0,0,0,1,1,1,1,0,1,0,0,1,
270 1,2,2,2,2,1,0,0,1,0,0,0,0,0,2,0,1,1,1,1,0,0,0,0,1,0,1,2,0,0,2,0,
271 1,0,1,1,1,2,1,0,1,0,1,1,0,0,1,0,1,1,1,0,1,0,0,0,1,0,0,1,0,1,1,0,
272 2,1,2,2,2,0,3,0,1,1,0,0,0,0,2,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,1,
273 0,0,0,1,1,1,0,0,1,0,1,0,0,0,0,0,1,0,0,0,1,0,0,0,0,0,0,0,0,1,0,0,
274 1,2,2,3,2,2,0,0,1,1,2,0,1,2,1,0,1,0,1,0,0,1,0,0,0,0,0,0,0,0,0,1,
275 0,1,1,0,0,1,1,0,0,1,1,0,0,1,1,0,1,1,0,0,1,0,0,0,0,0,0,0,0,1,1,0,
276 2,2,1,1,2,1,2,2,2,2,2,1,2,2,0,1,0,0,0,1,2,2,2,1,2,1,1,1,1,1,2,1,
277 1,1,1,1,1,1,1,1,1,1,0,0,1,1,1,0,1,1,1,0,0,0,0,1,1,1,0,1,1,0,0,1,
278 1,2,2,2,2,0,1,0,2,2,0,0,0,0,2,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,2,0,
279 0,0,1,0,0,1,0,0,0,0,1,0,1,1,0,0,1,1,0,0,1,0,0,0,0,0,0,0,0,0,0,0,
280 0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,
281 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
282 1,2,2,2,2,0,0,0,2,2,2,0,1,0,1,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,1,1,
283 0,1,1,0,0,1,1,0,0,0,1,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
284 1,2,2,2,2,0,0,0,0,1,0,0,1,1,2,0,0,0,0,1,0,1,0,0,1,0,0,2,0,0,0,1,
285 0,0,1,0,0,1,0,0,0,1,1,0,0,0,0,0,1,0,0,1,1,0,0,0,0,0,0,0,0,0,0,0,
286 1,2,2,2,1,1,2,0,2,1,1,1,1,0,2,2,0,0,0,0,0,0,0,0,0,1,1,0,0,0,1,1,
287 0,0,1,0,1,1,0,0,0,0,1,0,0,0,0,0,1,1,0,0,1,0,0,0,0,0,0,0,0,0,0,0,
288 1,0,2,1,2,0,0,0,0,0,1,0,0,0,1,0,0,0,1,0,0,0,0,0,0,0,0,1,0,0,0,0,
289 0,0,1,0,1,1,0,0,0,0,1,0,0,0,0,0,1,0,0,0,1,0,0,0,0,0,0,0,0,0,1,0,
290 1,0,0,0,0,2,0,1,2,1,0,1,1,1,0,1,0,0,0,1,0,1,0,0,1,0,1,0,0,0,0,1,
291 0,0,0,0,0,1,0,0,1,1,0,0,1,1,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,1,
292 2,2,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,
293 1,0,0,0,1,0,0,0,1,1,0,0,0,0,0,0,0,1,0,0,0,0,0,1,0,0,1,0,0,0,0,0,
294 2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,
295 1,1,1,0,1,0,1,0,0,1,1,1,1,0,0,0,1,0,0,0,0,1,0,0,0,1,0,1,0,0,0,0,
296 1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,
297 1,1,0,1,1,0,1,0,1,0,0,0,0,1,1,0,1,1,0,0,0,0,0,1,0,1,1,0,1,0,0,0,
298 0,1,1,1,1,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
299 0,0,0,0,0,1,0,0,0,0,1,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,
300 };
301
302
303 SequenceModel Koi8rModel =
304 {
305 KOI8R_CharToOrderMap,
306 RussianLangModel,
307 (float)0.976601,
308 PR_FALSE,
309 CHARDET_ENCODING_KOI8_R
310 };
311
312 SequenceModel Win1251Model =
313 {
314 win1251_CharToOrderMap,
315 RussianLangModel,
316 (float)0.976601,
317 PR_FALSE,
318 CHARDET_ENCODING_WINDOWS_1251
319 };
320
321 SequenceModel Latin5Model =
322 {
323 latin5_CharToOrderMap,
324 RussianLangModel,
325 (float)0.976601,
326 PR_FALSE,
327 CHARDET_ENCODING_ISO_8859_5
328 };
329
330 SequenceModel MacCyrillicModel =
331 {
332 macCyrillic_CharToOrderMap,
333 RussianLangModel,
334 (float)0.976601,
335 PR_FALSE,
336 CHARDET_ENCODING_MACCYRILLIC
337 };
338
339 SequenceModel Ibm866Model =
340 {
341 IBM866_CharToOrderMap,
342 RussianLangModel,
343 (float)0.976601,
344 PR_FALSE,
345 CHARDET_ENCODING_IBM866
346 };
347
348 SequenceModel Ibm855Model =
349 {
350 IBM855_CharToOrderMap,
351 RussianLangModel,
352 (float)0.976601,
353 PR_FALSE,
354 CHARDET_ENCODING_IBM855
355 };
+0
-245
c/src/LangGreekModel.cpp less more
0 /* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
1 /* ***** BEGIN LICENSE BLOCK *****
2 * Version: MPL 1.1/GPL 2.0/LGPL 2.1
3 *
4 * The contents of this file are subject to the Mozilla Public License Version
5 * 1.1 (the "License"); you may not use this file except in compliance with
6 * the License. You may obtain a copy of the License at
7 * http://www.mozilla.org/MPL/
8 *
9 * Software distributed under the License is distributed on an "AS IS" basis,
10 * WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License
11 * for the specific language governing rights and limitations under the
12 * License.
13 *
14 * The Original Code is Mozilla Communicator client code.
15 *
16 * The Initial Developer of the Original Code is
17 * Netscape Communications Corporation.
18 * Portions created by the Initial Developer are Copyright (C) 1998
19 * the Initial Developer. All Rights Reserved.
20 *
21 * Contributor(s):
22 *
23 * Alternatively, the contents of this file may be used under the terms of
24 * either the GNU General Public License Version 2 or later (the "GPL"), or
25 * the GNU Lesser General Public License Version 2.1 or later (the "LGPL"),
26 * in which case the provisions of the GPL or the LGPL are applicable instead
27 * of those above. If you wish to allow use of your version of this file only
28 * under the terms of either the GPL or the LGPL, and not to allow others to
29 * use your version of this file under the terms of the MPL, indicate your
30 * decision by deleting the provisions above and replace them with the notice
31 * and other provisions required by the GPL or the LGPL. If you do not delete
32 * the provisions above, a recipient may use your version of this file under
33 * the terms of any one of the MPL, the GPL or the LGPL.
34 *
35 * ***** END LICENSE BLOCK ***** */
36
37 #include "universalchardet.h"
38 #include "nsSBCharSetProber.h"
39 /****************************************************************
40 255: Control characters that usually does not exist in any text
41 254: Carriage/Return
42 253: symbol (punctuation) that does not belong to word
43 252: 0 - 9
44
45 *****************************************************************/
46
47 //Character Mapping Table:
48 unsigned char Latin7_CharToOrderMap[] =
49 {
50 255,255,255,255,255,255,255,255,255,255,254,255,255,254,255,255, //00
51 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, //10
52 +253,253,253,253,253,253,253,253,253,253,253,253,253,253,253,253, //20
53 252,252,252,252,252,252,252,252,252,252,253,253,253,253,253,253, //30
54 253, 82,100,104, 94, 98,101,116,102,111,187,117, 92, 88,113, 85, //40
55 79,118,105, 83, 67,114,119, 95, 99,109,188,253,253,253,253,253, //50
56 253, 72, 70, 80, 81, 60, 96, 93, 89, 68,120, 97, 77, 86, 69, 55, //60
57 78,115, 65, 66, 58, 76,106,103, 87,107,112,253,253,253,253,253, //70
58 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, //80
59 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, //90
60 +253,233, 90,253,253,253,253,253,253,253,253,253,253, 74,253,253, //a0
61 253,253,253,253,247,248, 61, 36, 46, 71, 73,253, 54,253,108,123, //b0
62 110, 31, 51, 43, 41, 34, 91, 40, 52, 47, 44, 53, 38, 49, 59, 39, //c0
63 35, 48,250, 37, 33, 45, 56, 50, 84, 57,120,121, 17, 18, 22, 15, //d0
64 124, 1, 29, 20, 21, 3, 32, 13, 25, 5, 11, 16, 10, 6, 30, 4, //e0
65 9, 8, 14, 7, 2, 12, 28, 23, 42, 24, 64, 75, 19, 26, 27,253, //f0
66 };
67
68
69
70 unsigned char win1253_CharToOrderMap[] =
71 {
72 255,255,255,255,255,255,255,255,255,255,254,255,255,254,255,255, //00
73 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, //10
74 +253,253,253,253,253,253,253,253,253,253,253,253,253,253,253,253, //20
75 252,252,252,252,252,252,252,252,252,252,253,253,253,253,253,253, //30
76 253, 82,100,104, 94, 98,101,116,102,111,187,117, 92, 88,113, 85, //40
77 79,118,105, 83, 67,114,119, 95, 99,109,188,253,253,253,253,253, //50
78 253, 72, 70, 80, 81, 60, 96, 93, 89, 68,120, 97, 77, 86, 69, 55, //60
79 78,115, 65, 66, 58, 76,106,103, 87,107,112,253,253,253,253,253, //70
80 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, //80
81 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, //90
82 +253,233, 61,253,253,253,253,253,253,253,253,253,253, 74,253,253, //a0
83 253,253,253,253,247,253,253, 36, 46, 71, 73,253, 54,253,108,123, //b0
84 110, 31, 51, 43, 41, 34, 91, 40, 52, 47, 44, 53, 38, 49, 59, 39, //c0
85 35, 48,250, 37, 33, 45, 56, 50, 84, 57,120,121, 17, 18, 22, 15, //d0
86 124, 1, 29, 20, 21, 3, 32, 13, 25, 5, 11, 16, 10, 6, 30, 4, //e0
87 9, 8, 14, 7, 2, 12, 28, 23, 42, 24, 64, 75, 19, 26, 27,253, //f0
88 };
89
90 //Model Table:
91 //total sequences: 100%
92 //first 512 sequences: 98.2851%
93 //first 1024 sequences:1.7001%
94 //rest sequences: 0.0359%
95 //negative sequences: 0.0148%
96 char GreekLangModel[] =
97 {
98 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
99 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
100 0,0,3,2,2,3,3,3,3,3,3,3,3,1,3,3,3,0,2,2,3,3,0,3,0,3,2,0,3,3,3,0,
101 3,0,0,0,2,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
102 0,3,3,3,3,3,0,3,3,0,3,2,3,3,0,3,2,3,3,3,0,0,3,0,3,0,3,3,2,0,0,0,
103 2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,
104 0,2,3,2,2,3,3,3,3,3,3,3,3,0,3,3,3,3,0,2,3,3,0,3,3,3,3,2,3,3,3,0,
105 2,0,0,0,2,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
106 0,2,3,3,2,3,3,3,3,3,3,3,3,3,3,3,3,0,2,1,3,3,3,3,2,3,3,2,3,3,2,0,
107 0,0,0,0,2,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
108 0,3,3,3,3,0,3,3,3,3,3,3,0,3,3,0,3,3,3,3,3,3,3,3,3,3,0,3,2,3,3,0,
109 2,0,1,0,2,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,
110 0,3,3,3,3,3,2,3,0,0,0,0,3,3,0,3,1,3,3,3,0,3,3,0,3,3,3,3,0,0,0,0,
111 2,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
112 0,3,3,3,3,3,0,3,0,3,3,3,3,3,0,3,2,2,2,3,0,2,3,3,3,3,3,2,3,3,0,0,
113 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
114 0,3,3,3,3,3,3,2,2,2,3,3,3,3,0,3,1,3,3,3,3,2,3,3,3,3,3,3,3,2,2,0,
115 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
116 0,3,3,3,3,3,2,0,3,0,0,0,3,3,2,3,3,3,3,3,0,0,3,2,3,0,2,3,0,0,0,0,
117 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
118 0,3,0,3,3,3,3,0,0,3,3,0,2,3,0,3,0,3,3,3,0,0,3,0,3,0,2,2,3,3,0,0,
119 0,0,1,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
120 0,3,3,3,3,3,2,0,3,2,3,3,3,3,0,3,3,3,3,3,0,3,3,2,3,2,3,3,2,0,0,0,
121 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
122 0,3,3,2,3,2,3,3,3,3,3,3,0,2,3,2,3,2,2,2,3,2,3,3,2,3,0,2,2,2,3,0,
123 2,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
124 0,0,3,0,0,0,3,3,3,2,3,3,0,0,3,0,3,0,0,0,3,2,0,3,0,3,0,0,2,0,2,0,
125 0,0,0,0,2,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
126 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
127 0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
128 0,3,3,3,3,0,3,3,3,3,3,3,0,3,3,0,3,0,0,0,3,3,0,3,3,3,0,0,1,2,3,0,
129 3,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
130 0,3,3,3,3,3,2,0,0,3,2,2,3,3,0,3,3,3,3,3,2,1,3,0,3,2,3,3,2,1,0,0,
131 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
132 0,0,3,3,0,2,3,3,3,3,3,3,0,0,3,0,3,0,0,0,3,3,0,3,2,3,0,0,3,3,3,0,
133 3,0,0,0,2,0,0,0,0,0,3,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
134 0,3,3,3,3,0,3,3,3,3,3,3,0,0,3,0,3,0,0,0,3,2,0,3,2,3,0,0,3,2,3,0,
135 2,0,0,0,0,0,0,0,0,0,3,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
136 0,0,3,1,2,2,3,3,3,3,3,3,0,2,3,0,3,0,0,0,3,3,0,3,0,2,0,0,2,3,1,0,
137 2,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
138 0,3,0,3,3,3,3,0,3,0,3,3,2,3,0,3,3,3,3,3,3,0,3,3,3,0,2,3,0,0,3,0,
139 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
140 0,3,0,3,3,3,0,0,3,0,0,0,3,3,0,3,0,2,3,3,0,0,3,0,3,0,3,3,0,0,0,0,
141 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
142 0,0,3,0,0,0,3,3,3,3,3,3,0,0,3,0,2,0,0,0,3,3,0,3,0,3,0,0,2,0,2,0,
143 0,0,0,0,1,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
144 0,3,3,3,3,3,3,0,3,0,2,0,3,2,0,3,2,3,2,3,0,0,3,2,3,2,3,3,0,0,0,0,
145 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
146 0,0,3,0,0,2,3,3,3,3,3,0,0,0,3,0,2,1,0,0,3,2,2,2,0,3,0,0,2,2,0,0,
147 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
148 0,3,0,3,3,3,2,0,3,0,3,0,3,3,0,2,1,2,3,3,0,0,3,0,3,0,3,3,0,0,0,0,
149 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
150 0,2,3,3,3,0,3,3,3,3,3,3,0,2,3,0,3,0,0,0,2,1,0,2,2,3,0,0,2,2,2,0,
151 0,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
152 0,0,3,0,0,2,3,3,3,2,3,0,0,1,3,0,2,0,0,0,0,3,0,1,0,2,0,0,1,1,1,0,
153 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
154 0,3,3,3,3,3,1,0,3,0,0,0,3,2,0,3,2,3,3,3,0,0,3,0,3,2,2,2,1,0,0,0,
155 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
156 0,3,0,3,3,3,0,0,3,0,0,0,0,2,0,2,3,3,2,2,2,2,3,0,2,0,2,2,0,0,0,0,
157 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
158 0,3,3,3,3,2,0,0,0,0,0,0,2,3,0,2,0,2,3,2,0,0,3,0,3,0,3,1,0,0,0,0,
159 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
160 0,0,0,0,0,0,3,2,3,3,2,2,3,0,2,0,3,0,0,0,2,0,0,0,0,1,2,0,2,0,2,0,
161 0,2,0,2,0,2,2,0,0,1,0,2,2,2,0,2,2,2,0,2,2,2,0,0,2,0,0,1,0,0,0,0,
162 0,2,0,3,3,2,0,0,0,0,0,0,1,3,0,2,0,2,2,2,0,0,2,0,3,0,0,2,0,0,0,0,
163 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
164 0,3,0,2,3,2,0,2,2,0,2,0,2,2,0,2,0,2,2,2,0,0,0,0,0,0,2,3,0,0,0,2,
165 0,1,2,0,0,0,0,2,2,0,0,0,2,1,0,2,2,0,0,0,0,0,0,1,0,2,0,0,0,0,0,0,
166 0,0,2,1,0,2,3,2,2,3,2,3,2,0,0,3,3,3,0,0,3,2,0,0,0,1,1,0,2,0,2,2,
167 0,2,0,2,0,2,2,0,0,2,0,2,2,2,0,2,2,2,2,0,0,2,0,0,0,2,0,1,0,0,0,0,
168 0,3,0,3,3,2,2,0,3,0,0,0,2,2,0,2,2,2,1,2,0,0,1,2,2,0,0,3,0,0,0,2,
169 0,1,2,0,0,0,1,2,0,0,0,0,0,0,0,2,2,0,1,0,0,2,0,0,0,2,0,0,0,0,0,0,
170 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
171 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
172 0,2,3,3,2,2,0,0,0,2,0,2,3,3,0,2,0,0,0,0,0,0,2,2,2,0,2,2,0,2,0,2,
173 0,2,2,0,0,2,2,2,2,1,0,0,2,2,0,2,0,0,2,0,0,0,0,0,0,2,0,0,0,0,0,0,
174 0,2,0,3,2,3,0,0,0,3,0,0,2,2,0,2,0,2,2,2,0,0,2,0,0,0,0,0,0,0,0,2,
175 0,0,2,2,0,0,2,2,2,0,0,0,0,0,0,2,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,
176 0,0,2,0,0,3,2,0,2,2,2,2,2,0,0,0,2,0,0,0,0,2,0,1,0,0,2,0,1,0,0,0,
177 0,2,2,2,0,2,2,0,1,2,0,2,2,2,0,2,2,2,2,1,2,2,0,0,2,0,0,0,0,0,0,0,
178 0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,
179 0,2,0,2,0,2,2,0,0,0,0,1,2,1,0,0,2,2,0,0,2,0,0,0,0,0,0,0,0,0,0,0,
180 0,0,0,3,2,3,0,0,2,0,0,0,2,2,0,2,0,0,0,1,0,0,2,0,2,0,2,2,0,0,0,0,
181 0,0,2,0,0,0,0,2,2,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,
182 0,2,2,3,2,2,0,0,0,0,0,0,1,3,0,2,0,2,2,0,0,0,1,0,2,0,0,0,0,0,0,0,
183 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
184 0,2,0,2,0,3,2,0,2,0,0,0,0,0,0,2,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,
185 0,0,2,0,0,0,0,1,1,0,0,2,1,2,0,2,2,0,1,0,0,1,0,0,0,2,0,0,0,0,0,0,
186 0,3,0,2,2,2,0,0,2,0,0,0,2,0,0,0,2,3,0,2,0,0,0,0,0,0,2,2,0,0,0,2,
187 0,1,2,0,0,0,1,2,2,1,0,0,0,2,0,0,2,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,
188 0,0,0,0,0,0,0,0,0,3,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
189 0,2,1,2,0,2,2,0,2,0,0,2,0,0,0,0,1,2,1,0,2,1,0,0,0,0,0,0,0,0,0,0,
190 0,0,2,0,0,0,3,1,2,2,0,2,0,0,0,0,2,0,0,0,2,0,0,3,0,0,0,0,2,2,2,0,
191 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
192 0,2,1,0,2,0,1,2,0,0,0,0,0,0,0,0,0,0,0,0,0,2,0,0,1,0,0,0,0,0,0,2,
193 0,2,2,0,0,2,2,2,2,2,0,1,2,0,0,0,2,2,0,1,0,2,0,0,2,2,0,0,0,0,0,0,
194 0,0,0,0,1,0,0,0,0,0,0,0,3,0,0,2,0,0,0,0,0,0,0,0,2,0,2,0,0,0,0,2,
195 0,1,2,0,0,0,0,2,2,1,0,1,0,1,0,2,2,2,1,0,0,0,0,0,0,1,0,0,0,0,0,0,
196 0,2,0,1,2,0,0,0,0,0,0,0,0,0,0,2,0,0,2,2,0,0,0,0,1,0,0,0,0,0,0,2,
197 0,2,2,0,0,0,0,2,2,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,2,0,0,2,0,0,0,
198 0,2,2,2,2,0,0,0,3,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,2,0,0,0,0,0,0,1,
199 0,0,2,0,0,0,0,1,2,0,0,0,0,0,0,2,2,1,1,0,0,0,0,0,0,1,0,0,0,0,0,0,
200 0,2,0,2,2,2,0,0,2,0,0,0,0,0,0,0,2,2,2,0,0,0,2,0,0,0,0,0,0,0,0,2,
201 0,0,1,0,0,0,0,2,1,0,0,0,0,0,0,1,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,
202 0,3,0,2,0,0,0,0,0,0,0,0,2,0,0,0,0,0,2,0,0,0,0,0,0,0,2,0,0,0,0,2,
203 0,0,2,0,0,0,0,2,2,0,0,0,0,1,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
204 0,2,0,2,2,1,0,0,0,0,0,0,2,0,0,2,0,2,2,2,0,0,0,0,0,0,2,0,0,0,0,2,
205 0,0,2,0,0,2,0,2,2,0,0,0,0,2,0,2,0,0,0,0,0,2,0,0,0,2,0,0,0,0,0,0,
206 0,0,3,0,0,0,2,2,0,2,2,0,0,0,0,0,2,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,
207 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
208 0,0,0,0,0,0,1,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
209 0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,0,0,2,0,0,0,0,0,
210 0,2,2,2,2,2,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,0,0,0,1,
211 0,0,0,0,0,0,0,2,1,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
212 0,0,0,0,0,0,0,2,2,0,0,0,0,0,2,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,
213 0,2,0,0,0,2,0,0,0,0,0,1,0,0,0,0,2,2,0,0,0,1,0,0,0,0,0,0,0,0,0,0,
214 0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
215 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,1,0,2,0,0,0,
216 0,2,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,
217 0,0,1,0,0,0,0,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
218 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
219 0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,1,0,0,2,0,2,0,0,0,
220 0,0,0,0,0,0,0,0,2,1,0,0,0,0,0,0,2,0,0,0,1,2,0,0,0,0,0,0,0,0,0,0,
221 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
222 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
223 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
224 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
225 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
226 };
227
228 SequenceModel Latin7Model =
229 {
230 Latin7_CharToOrderMap,
231 GreekLangModel,
232 (float)0.982851,
233 PR_FALSE,
234 CHARDET_ENCODING_ISO_8859_7
235 };
236
237 SequenceModel Win1253Model =
238 {
239 win1253_CharToOrderMap,
240 GreekLangModel,
241 (float)0.982851,
242 PR_FALSE,
243 CHARDET_ENCODING_WINDOWS_1253
244 };
+0
-220
c/src/LangHebrewModel.cpp less more
0 /* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
1 /* ***** BEGIN LICENSE BLOCK *****
2 * Version: MPL 1.1/GPL 2.0/LGPL 2.1
3 *
4 * The contents of this file are subject to the Mozilla Public License Version
5 * 1.1 (the "License"); you may not use this file except in compliance with
6 * the License. You may obtain a copy of the License at
7 * http://www.mozilla.org/MPL/
8 *
9 * Software distributed under the License is distributed on an "AS IS" basis,
10 * WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License
11 * for the specific language governing rights and limitations under the
12 * License.
13 *
14 * The Original Code is Mozilla Universal charset detector code.
15 *
16 * The Initial Developer of the Original Code is
17 * Simon Montagu <smontagu@smontagu.org>
18 * Portions created by the Initial Developer are Copyright (C) 2005
19 * the Initial Developer. All Rights Reserved.
20 *
21 * Contributor(s):
22 * Shoshannah Forbes <xslf@xslf.com>
23 * Shy Shalom <shooshX@gmail.com>
24 *
25 * Alternatively, the contents of this file may be used under the terms of
26 * either the GNU General Public License Version 2 or later (the "GPL"), or
27 * the GNU Lesser General Public License Version 2.1 or later (the "LGPL"),
28 * in which case the provisions of the GPL or the LGPL are applicable instead
29 * of those above. If you wish to allow use of your version of this file only
30 * under the terms of either the GPL or the LGPL, and not to allow others to
31 * use your version of this file under the terms of the MPL, indicate your
32 * decision by deleting the provisions above and replace them with the notice
33 * and other provisions required by the GPL or the LGPL. If you do not delete
34 * the provisions above, a recipient may use your version of this file under
35 * the terms of any one of the MPL, the GPL or the LGPL.
36 *
37 * ***** END LICENSE BLOCK ***** */
38
39 #include "universalchardet.h"
40 #include "nsSBCharSetProber.h"
41
42
43 /****************************************************************
44 255: Control characters that usually does not exist in any text
45 254: Carriage/Return
46 253: symbol (punctuation) that does not belong to word
47 252: 0 - 9
48
49 *****************************************************************/
50
51 //Windows-1255 language model
52 //Character Mapping Table:
53 unsigned char win1255_CharToOrderMap[] =
54 {
55 255,255,255,255,255,255,255,255,255,255,254,255,255,254,255,255, //00
56 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, //10
57 +253,253,253,253,253,253,253,253,253,253,253,253,253,253,253,253, //20
58 252,252,252,252,252,252,252,252,252,252,253,253,253,253,253,253, //30
59 253, 69, 91, 79, 80, 92, 89, 97, 90, 68,111,112, 82, 73, 95, 85, //40
60 78,121, 86, 71, 67,102,107, 84,114,103,115,253,253,253,253,253, //50
61 253, 50, 74, 60, 61, 42, 76, 70, 64, 53,105, 93, 56, 65, 54, 49, //60
62 66,110, 51, 43, 44, 63, 81, 77, 98, 75,108,253,253,253,253,253, //70
63 124,202,203,204,205, 40, 58,206,207,208,209,210,211,212,213,214,
64 215, 83, 52, 47, 46, 72, 32, 94,216,113,217,109,218,219,220,221,
65 34,116,222,118,100,223,224,117,119,104,125,225,226, 87, 99,227,
66 106,122,123,228, 55,229,230,101,231,232,120,233, 48, 39, 57,234,
67 30, 59, 41, 88, 33, 37, 36, 31, 29, 35,235, 62, 28,236,126,237,
68 238, 38, 45,239,240,241,242,243,127,244,245,246,247,248,249,250,
69 9, 8, 20, 16, 3, 2, 24, 14, 22, 1, 25, 15, 4, 11, 6, 23,
70 12, 19, 13, 26, 18, 27, 21, 17, 7, 10, 5,251,252,128, 96,253,
71 };
72
73 //Model Table:
74 //total sequences: 100%
75 //first 512 sequences: 98.4004%
76 //first 1024 sequences: 1.5981%
77 //rest sequences: 0.087%
78 //negative sequences: 0.0015%
79 char HebrewLangModel[] =
80 {
81 0,3,3,3,3,3,3,3,3,3,3,2,3,3,3,3,3,3,3,3,3,3,3,2,3,2,1,2,0,1,0,0,
82 3,0,3,1,0,0,1,3,2,0,1,1,2,0,2,2,2,1,1,1,1,2,1,1,1,2,0,0,2,2,0,1,
83 3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,2,2,2,2,
84 1,2,1,2,1,2,0,0,2,0,0,0,0,0,1,0,1,0,0,0,0,0,0,1,0,0,0,0,0,0,1,0,
85 3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,2,2,2,
86 1,2,1,3,1,1,0,0,2,0,0,0,1,0,1,0,1,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,
87 3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,1,0,1,2,2,1,3,
88 1,2,1,1,2,2,0,0,2,2,0,0,0,0,1,0,1,0,0,0,1,0,0,0,0,0,0,1,0,1,1,0,
89 3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,2,3,3,2,2,2,2,3,2,
90 1,2,1,2,2,2,0,0,1,0,0,0,0,0,1,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,1,0,
91 3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,2,3,3,2,3,2,2,3,2,2,2,1,2,2,2,2,
92 1,2,1,1,2,2,0,1,2,0,0,0,0,0,0,0,1,0,0,0,1,0,0,0,0,0,0,0,0,0,1,0,
93 3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,2,0,2,2,2,2,2,
94 0,2,0,2,2,2,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,1,0,
95 3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,2,3,0,2,2,2,
96 0,2,1,2,2,2,0,0,2,1,0,0,0,0,1,0,1,0,0,0,0,0,0,2,0,0,0,0,0,0,1,0,
97 3,3,3,3,3,3,3,3,3,3,3,2,3,3,3,3,3,3,3,3,3,3,3,3,3,2,1,2,3,2,2,2,
98 1,2,1,2,2,2,0,0,1,0,0,0,0,0,1,0,0,0,0,0,0,0,0,1,0,0,0,0,0,1,1,0,
99 3,3,3,3,3,3,3,3,3,2,3,3,3,2,3,3,3,3,3,3,3,3,3,3,3,3,3,1,0,2,0,2,
100 0,2,1,2,2,2,0,0,1,2,0,0,0,0,1,0,1,0,0,0,0,0,0,1,0,0,0,2,0,0,1,0,
101 3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,2,3,2,3,2,2,3,2,1,2,1,1,1,
102 0,1,1,1,1,1,3,0,1,0,0,0,0,2,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,
103 3,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,1,1,0,1,1,0,0,1,0,0,1,0,0,0,0,
104 0,0,1,0,0,0,0,0,2,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
105 3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,2,2,2,2,2,2,2,
106 0,2,0,1,2,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,
107 3,3,3,3,3,3,3,3,3,2,3,3,3,2,1,2,3,3,2,3,3,3,3,2,3,2,1,2,0,2,1,2,
108 0,2,0,2,2,2,0,0,1,2,0,0,0,0,1,0,1,0,0,0,0,0,0,0,0,0,0,1,0,0,1,0,
109 3,3,3,3,3,3,3,3,3,2,3,3,3,1,2,2,3,3,2,3,2,3,2,2,3,1,2,2,0,2,2,2,
110 0,2,1,2,2,2,0,0,1,2,0,0,0,0,1,0,0,0,0,0,1,0,0,1,0,0,0,1,0,0,1,0,
111 3,3,3,3,3,3,3,3,3,3,3,3,3,2,3,3,3,2,3,3,2,2,2,3,3,3,3,1,3,2,2,2,
112 0,2,0,1,2,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,
113 3,3,3,3,3,3,3,3,3,3,3,3,3,3,2,2,3,3,3,2,3,2,2,2,1,2,2,0,2,2,2,2,
114 0,2,0,2,2,2,0,0,1,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,
115 3,3,3,3,3,3,3,3,3,3,3,2,3,3,3,1,3,2,3,3,2,3,3,2,2,1,2,2,2,2,2,2,
116 0,2,1,2,1,2,0,0,1,0,0,0,0,0,1,0,0,0,0,0,1,0,0,1,0,0,0,0,0,0,1,0,
117 3,3,3,3,3,3,2,3,2,3,3,2,3,3,3,3,2,3,2,3,3,3,3,3,2,2,2,2,2,2,2,1,
118 0,2,0,1,2,1,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,1,0,
119 3,3,3,3,3,3,3,3,3,2,1,2,3,3,3,3,3,3,3,2,3,2,3,2,1,2,3,0,2,1,2,2,
120 0,2,1,1,2,1,0,0,1,0,0,0,0,0,1,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,2,0,
121 3,3,3,3,3,3,3,3,3,2,3,3,3,3,2,1,3,1,2,2,2,1,2,3,3,1,2,1,2,2,2,2,
122 0,1,1,1,1,1,0,0,0,0,0,0,0,0,1,0,0,0,0,0,1,0,0,2,0,0,0,0,0,0,0,0,
123 3,3,3,3,3,3,3,3,3,3,0,2,3,3,3,1,3,3,3,1,2,2,2,2,1,1,2,2,2,2,2,2,
124 0,2,0,1,1,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,1,0,
125 3,3,3,3,3,3,2,3,3,3,2,2,3,3,3,2,1,2,3,2,3,2,2,2,2,1,2,1,1,1,2,2,
126 0,2,1,1,1,1,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,
127 3,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,1,0,0,0,1,0,0,0,0,0,
128 1,0,1,0,0,0,0,0,2,0,0,0,0,0,1,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
129 3,3,3,3,3,2,3,3,2,3,1,2,2,2,2,3,2,3,1,1,2,2,1,2,2,1,1,0,2,2,2,2,
130 0,1,0,1,2,2,0,0,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,1,0,
131 3,0,0,1,1,0,1,0,0,1,1,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,1,2,2,0,
132 0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
133 3,0,1,0,1,0,1,1,0,1,1,0,0,0,1,1,0,1,1,1,0,0,0,0,0,0,1,0,0,0,0,0,
134 0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
135 3,0,0,0,1,1,0,1,0,1,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,
136 0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,
137 3,2,2,1,2,2,2,2,2,2,2,1,2,2,1,2,2,1,1,1,1,1,1,1,1,2,1,1,0,3,3,3,
138 0,3,0,2,2,2,2,0,0,1,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,
139 2,2,2,3,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,1,2,2,1,2,2,2,1,1,1,2,0,1,
140 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
141 2,2,2,2,2,2,2,2,2,2,2,1,2,2,2,2,2,2,2,2,2,2,2,0,2,2,0,0,0,0,0,0,
142 0,0,0,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
143 2,3,1,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,1,2,1,0,2,1,0,
144 0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
145 3,1,1,1,1,1,1,1,1,1,1,0,0,1,1,1,1,0,1,1,1,1,0,0,0,0,0,0,0,0,0,0,
146 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,
147 0,3,1,1,2,2,2,2,2,1,2,2,2,1,1,2,2,2,2,2,2,2,1,2,2,1,0,1,1,1,1,0,
148 0,1,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
149 3,2,1,1,1,1,2,1,1,2,1,0,1,1,1,1,1,1,1,1,1,1,1,0,1,0,0,0,0,0,0,0,
150 0,0,2,0,0,0,0,0,0,0,0,1,1,0,0,0,0,1,1,0,0,1,1,0,0,0,0,0,0,1,0,0,
151 2,1,1,2,2,2,2,2,2,2,2,2,2,2,1,2,2,2,2,2,1,2,1,2,1,1,1,1,0,0,0,0,
152 0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
153 1,2,1,2,2,2,2,2,2,2,2,2,2,1,2,1,2,1,1,2,1,1,1,2,1,2,1,2,0,1,0,1,
154 0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
155 0,3,1,2,2,2,1,2,2,2,2,2,2,2,2,1,2,1,1,1,1,1,1,2,1,2,1,1,0,1,0,1,
156 0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
157 2,1,2,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,2,2,
158 0,2,0,1,2,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,
159 3,0,0,0,1,0,0,0,0,0,0,0,0,0,0,1,0,1,0,0,0,1,0,0,0,0,0,0,0,0,0,0,
160 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
161 2,1,1,1,1,1,1,1,0,1,1,0,1,0,0,1,0,0,1,0,0,0,0,0,1,0,0,0,0,0,0,0,
162 0,0,0,0,0,0,0,0,2,0,1,1,1,0,1,0,0,0,1,1,0,1,1,0,0,0,0,0,1,1,0,0,
163 0,1,1,1,2,1,2,2,2,0,2,0,2,0,1,1,2,1,1,1,1,2,1,0,1,1,0,0,0,0,0,0,
164 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
165 2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,
166 1,0,1,0,0,0,0,0,1,0,1,2,2,0,1,0,0,1,1,2,2,1,2,0,2,0,0,0,1,2,0,1,
167 2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
168 0,0,0,0,0,0,0,0,2,0,2,1,2,0,2,0,0,1,1,1,1,1,1,0,1,0,0,0,1,0,0,1,
169 2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
170 0,0,1,0,0,0,0,0,1,0,2,1,1,0,1,0,0,1,1,1,2,2,0,0,1,0,0,0,1,0,0,1,
171 1,1,2,1,0,1,1,1,0,1,0,1,1,1,1,0,0,0,1,0,1,0,0,0,0,0,0,0,0,2,2,1,
172 0,2,0,1,2,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
173 2,1,0,0,1,0,1,1,1,1,0,0,0,0,0,1,0,0,0,0,1,1,0,0,0,0,0,0,0,0,0,0,
174 0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
175 1,1,1,1,1,1,1,1,1,2,1,0,1,1,1,1,1,1,1,1,1,1,1,0,1,0,0,0,0,0,0,0,
176 0,0,0,0,0,0,0,0,0,0,1,1,1,0,0,0,0,1,1,1,0,1,1,0,1,0,0,0,1,1,0,1,
177 2,0,1,0,1,0,1,0,0,1,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
178 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
179 1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
180 0,0,0,0,0,0,0,0,1,0,1,1,1,0,1,0,0,1,1,2,1,1,2,0,1,0,0,0,1,1,0,1,
181 1,0,0,1,0,0,1,0,0,0,1,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
182 0,0,0,0,0,0,0,0,1,0,1,1,2,0,1,0,0,0,0,2,1,1,2,0,2,0,0,0,1,1,0,1,
183 1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
184 0,0,0,0,0,0,0,0,1,0,2,1,1,0,1,0,0,2,2,1,2,1,1,0,1,0,0,0,1,1,0,1,
185 2,0,1,0,0,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
186 0,0,0,0,0,0,0,0,0,0,1,2,2,0,0,0,0,0,1,1,0,1,0,0,1,0,0,0,0,1,0,1,
187 1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
188 0,0,0,0,0,0,0,0,0,0,1,2,2,0,0,0,0,2,1,1,1,0,2,1,1,0,0,0,2,1,0,1,
189 1,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
190 0,0,0,0,0,0,0,0,1,0,1,1,2,0,1,0,0,1,1,0,2,1,1,0,1,0,0,0,1,1,0,1,
191 2,2,1,1,1,0,1,1,0,1,1,0,1,0,0,0,0,0,0,1,0,0,0,1,0,0,0,0,0,0,0,0,
192 0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
193 2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
194 0,0,0,0,0,0,0,0,1,0,2,1,1,0,1,0,0,1,1,0,1,2,1,0,2,0,0,0,1,1,0,1,
195 2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
196 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
197 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
198 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,
199 0,1,0,0,2,0,2,1,1,0,1,0,1,0,0,1,0,0,0,0,1,0,0,0,1,0,0,0,0,0,1,0,
200 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
201 1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
202 0,0,0,0,0,0,0,0,1,0,1,1,2,0,1,0,0,1,1,1,0,1,0,0,1,0,0,0,1,0,0,1,
203 1,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
204 1,0,0,0,0,0,0,0,1,0,1,1,0,0,1,0,0,2,1,1,1,1,1,0,1,0,0,0,0,1,0,1,
205 0,1,1,1,2,1,1,1,1,0,1,1,1,1,1,1,1,1,1,1,1,1,0,1,1,0,0,0,0,0,0,0,
206 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
207 1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
208 0,0,0,0,0,0,0,0,0,0,1,2,1,0,0,0,0,0,1,1,1,1,1,0,1,0,0,0,1,1,0,0,
209 };
210
211 SequenceModel Win1255Model =
212 {
213 win1255_CharToOrderMap,
214 HebrewLangModel,
215 (float)0.984004,
216 PR_FALSE,
217 CHARDET_ENCODING_WINDOWS_1255
218 };
219
+0
-243
c/src/LangHungarianModel.cpp less more
0 /* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
1 /* ***** BEGIN LICENSE BLOCK *****
2 * Version: MPL 1.1/GPL 2.0/LGPL 2.1
3 *
4 * The contents of this file are subject to the Mozilla Public License Version
5 * 1.1 (the "License"); you may not use this file except in compliance with
6 * the License. You may obtain a copy of the License at
7 * http://www.mozilla.org/MPL/
8 *
9 * Software distributed under the License is distributed on an "AS IS" basis,
10 * WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License
11 * for the specific language governing rights and limitations under the
12 * License.
13 *
14 * The Original Code is Mozilla Communicator client code.
15 *
16 * The Initial Developer of the Original Code is
17 * Netscape Communications Corporation.
18 * Portions created by the Initial Developer are Copyright (C) 1998
19 * the Initial Developer. All Rights Reserved.
20 *
21 * Contributor(s):
22 *
23 * Alternatively, the contents of this file may be used under the terms of
24 * either the GNU General Public License Version 2 or later (the "GPL"), or
25 * the GNU Lesser General Public License Version 2.1 or later (the "LGPL"),
26 * in which case the provisions of the GPL or the LGPL are applicable instead
27 * of those above. If you wish to allow use of your version of this file only
28 * under the terms of either the GPL or the LGPL, and not to allow others to
29 * use your version of this file under the terms of the MPL, indicate your
30 * decision by deleting the provisions above and replace them with the notice
31 * and other provisions required by the GPL or the LGPL. If you do not delete
32 * the provisions above, a recipient may use your version of this file under
33 * the terms of any one of the MPL, the GPL or the LGPL.
34 *
35 * ***** END LICENSE BLOCK ***** */
36
37 #include "universalchardet.h"
38 #include "nsSBCharSetProber.h"
39 /****************************************************************
40 255: Control characters that usually does not exist in any text
41 254: Carriage/Return
42 253: symbol (punctuation) that does not belong to word
43 252: 0 - 9
44
45 *****************************************************************/
46
47 //Character Mapping Table:
48 unsigned char Latin2_HungarianCharToOrderMap[] =
49 {
50 255,255,255,255,255,255,255,255,255,255,254,255,255,254,255,255, //00
51 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, //10
52 +253,253,253,253,253,253,253,253,253,253,253,253,253,253,253,253, //20
53 252,252,252,252,252,252,252,252,252,252,253,253,253,253,253,253, //30
54 253, 28, 40, 54, 45, 32, 50, 49, 38, 39, 53, 36, 41, 34, 35, 47,
55 46, 71, 43, 33, 37, 57, 48, 64, 68, 55, 52,253,253,253,253,253,
56 253, 2, 18, 26, 17, 1, 27, 12, 20, 9, 22, 7, 6, 13, 4, 8,
57 23, 67, 10, 5, 3, 21, 19, 65, 62, 16, 11,253,253,253,253,253,
58 159,160,161,162,163,164,165,166,167,168,169,170,171,172,173,174,
59 175,176,177,178,179,180,181,182,183,184,185,186,187,188,189,190,
60 191,192,193,194,195,196,197, 75,198,199,200,201,202,203,204,205,
61 79,206,207,208,209,210,211,212,213,214,215,216,217,218,219,220,
62 221, 51, 81,222, 78,223,224,225,226, 44,227,228,229, 61,230,231,
63 232,233,234, 58,235, 66, 59,236,237,238, 60, 69, 63,239,240,241,
64 82, 14, 74,242, 70, 80,243, 72,244, 15, 83, 77, 84, 30, 76, 85,
65 245,246,247, 25, 73, 42, 24,248,249,250, 31, 56, 29,251,252,253,
66 };
67
68 unsigned char win1250HungarianCharToOrderMap[] =
69 {
70 255,255,255,255,255,255,255,255,255,255,254,255,255,254,255,255, //00
71 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, //10
72 +253,253,253,253,253,253,253,253,253,253,253,253,253,253,253,253, //20
73 252,252,252,252,252,252,252,252,252,252,253,253,253,253,253,253, //30
74 253, 28, 40, 54, 45, 32, 50, 49, 38, 39, 53, 36, 41, 34, 35, 47,
75 46, 72, 43, 33, 37, 57, 48, 64, 68, 55, 52,253,253,253,253,253,
76 253, 2, 18, 26, 17, 1, 27, 12, 20, 9, 22, 7, 6, 13, 4, 8,
77 23, 67, 10, 5, 3, 21, 19, 65, 62, 16, 11,253,253,253,253,253,
78 161,162,163,164,165,166,167,168,169,170,171,172,173,174,175,176,
79 177,178,179,180, 78,181, 69,182,183,184,185,186,187,188,189,190,
80 191,192,193,194,195,196,197, 76,198,199,200,201,202,203,204,205,
81 81,206,207,208,209,210,211,212,213,214,215,216,217,218,219,220,
82 221, 51, 83,222, 80,223,224,225,226, 44,227,228,229, 61,230,231,
83 232,233,234, 58,235, 66, 59,236,237,238, 60, 70, 63,239,240,241,
84 84, 14, 75,242, 71, 82,243, 73,244, 15, 85, 79, 86, 30, 77, 87,
85 245,246,247, 25, 74, 42, 24,248,249,250, 31, 56, 29,251,252,253,
86 };
87
88 //Model Table:
89 //total sequences: 100%
90 //first 512 sequences: 94.7368%
91 //first 1024 sequences:5.2623%
92 //rest sequences: 0.8894%
93 //negative sequences: 0.0009%
94 char HungarianLangModel[] =
95 {
96 0,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,1,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,
97 3,3,3,3,3,3,3,3,3,3,2,3,3,3,3,3,3,3,3,2,2,3,3,1,1,2,2,2,2,2,1,2,
98 3,2,2,3,3,3,3,3,2,3,3,3,3,3,3,1,2,3,3,3,3,2,3,3,1,1,3,3,0,1,1,1,
99 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,0,
100 3,2,1,3,3,3,3,3,2,3,3,3,3,3,1,1,2,3,3,3,3,3,3,3,1,1,3,2,0,1,1,1,
101 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,
102 3,3,3,3,3,3,3,3,3,3,3,1,1,2,3,3,3,1,3,3,3,3,3,1,3,3,2,2,0,3,2,3,
103 0,0,0,0,0,0,0,0,0,0,3,0,0,0,0,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,
104 3,3,3,3,3,3,2,3,3,3,2,3,3,2,3,3,3,3,3,2,3,3,2,2,3,2,3,2,0,3,2,2,
105 0,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,1,0,
106 3,3,3,3,3,3,2,3,3,3,3,3,2,3,3,3,1,2,3,2,2,3,1,2,3,3,2,2,0,3,3,3,
107 0,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,
108 3,3,3,3,3,3,3,3,3,3,2,2,3,3,3,3,3,3,2,3,3,3,3,2,3,3,3,3,0,2,3,2,
109 0,0,0,1,1,0,0,0,0,0,3,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,
110 3,3,3,3,3,3,3,3,3,3,3,1,1,1,3,3,2,1,3,2,2,3,2,1,3,2,2,1,0,3,3,1,
111 0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,
112 3,2,2,3,3,3,3,3,1,2,3,3,3,3,1,2,1,3,3,3,3,2,2,3,1,1,3,2,0,1,1,1,
113 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,
114 3,3,3,3,3,3,3,3,2,2,3,3,3,3,3,2,1,3,3,3,3,3,2,2,1,3,3,3,0,1,1,2,
115 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,1,0,
116 3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,2,3,3,3,2,3,3,2,3,3,3,2,0,3,2,3,
117 0,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,1,0,
118 3,3,3,3,3,3,2,3,3,3,2,3,2,3,3,3,1,3,2,2,2,3,1,1,3,3,1,1,0,3,3,2,
119 0,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,
120 3,3,3,3,3,3,3,2,3,3,3,2,3,2,3,3,3,2,3,3,3,3,3,1,2,3,2,2,0,2,2,2,
121 0,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,
122 3,3,3,2,2,2,3,1,3,3,2,2,1,3,3,3,1,1,3,1,2,3,2,3,2,2,2,1,0,2,2,2,
123 0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,
124 3,1,1,3,3,3,3,3,1,2,3,3,3,3,1,2,1,3,3,3,2,2,3,2,1,0,3,2,0,1,1,0,
125 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
126 3,1,1,3,3,3,3,3,1,2,3,3,3,3,1,1,0,3,3,3,3,0,2,3,0,0,2,1,0,1,0,0,
127 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
128 3,3,3,3,3,3,2,2,3,3,2,2,2,2,3,3,0,1,2,3,2,3,2,2,3,2,1,2,0,2,2,2,
129 0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,
130 3,3,3,3,3,3,1,2,3,3,3,2,1,2,3,3,2,2,2,3,2,3,3,1,3,3,1,1,0,2,3,2,
131 0,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,
132 3,3,3,1,2,2,2,2,3,3,3,1,1,1,3,3,1,1,3,1,1,3,2,1,2,3,1,1,0,2,2,2,
133 0,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,
134 3,3,3,2,1,2,1,1,3,3,1,1,1,1,3,3,1,1,2,2,1,2,1,1,2,2,1,1,0,2,2,1,
135 0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,
136 3,3,3,1,1,2,1,1,3,3,1,0,1,1,3,3,2,0,1,1,2,3,1,0,2,2,1,0,0,1,3,2,
137 0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,
138 3,2,1,3,3,3,3,3,1,2,3,2,3,3,2,1,1,3,2,3,2,1,2,2,0,1,2,1,0,0,1,1,
139 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,
140 3,3,3,3,2,2,2,2,3,1,2,2,1,1,3,3,0,3,2,1,2,3,2,1,3,3,1,1,0,2,1,3,
141 0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,
142 3,3,3,2,2,2,3,2,3,3,3,2,1,1,3,3,1,1,1,2,2,3,2,3,2,2,2,1,0,2,2,1,
143 0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,
144 1,0,0,3,3,3,3,3,0,0,3,3,2,3,0,0,0,2,3,3,1,0,1,2,0,0,1,1,0,0,0,0,
145 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
146 3,1,2,3,3,3,3,3,1,2,3,3,2,2,1,1,0,3,3,2,2,1,2,2,1,0,2,2,0,1,1,1,
147 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
148 3,3,2,2,1,3,1,2,3,3,2,2,1,1,2,2,1,1,1,1,3,2,1,1,1,1,2,1,0,1,2,1,
149 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,1,0,0,0,0,0,0,0,0,0,
150 2,3,3,1,1,1,1,1,3,3,3,0,1,1,3,3,1,1,1,1,1,2,2,0,3,1,1,2,0,2,1,1,
151 0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,
152 3,1,0,1,2,1,2,2,0,1,2,3,1,2,0,0,0,2,1,1,1,1,1,2,0,0,1,1,0,0,0,0,
153 1,2,1,2,2,2,1,2,1,2,0,2,0,2,2,1,1,2,1,1,2,1,1,1,0,1,0,0,0,1,1,0,
154 1,1,1,2,3,2,3,3,0,1,2,2,3,1,0,1,0,2,1,2,2,0,1,1,0,0,1,1,0,0,0,0,
155 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
156 1,0,0,3,3,2,2,1,0,0,3,2,3,2,0,0,0,1,1,3,0,0,1,1,0,0,2,1,0,0,0,0,
157 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
158 3,1,1,2,2,3,3,1,0,1,3,2,3,1,1,1,0,1,1,1,1,1,3,1,0,0,2,2,0,0,0,0,
159 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
160 3,1,1,1,2,2,2,1,0,1,2,3,3,2,0,0,0,2,1,1,1,2,1,1,1,0,1,1,1,0,0,0,
161 1,2,2,2,2,2,1,1,1,2,0,2,1,1,1,1,1,2,1,1,1,1,1,1,0,1,1,1,0,0,1,1,
162 3,2,2,1,0,0,1,1,2,2,0,3,0,1,2,1,1,0,0,1,1,1,0,1,1,1,1,0,2,1,1,1,
163 2,2,1,1,1,2,1,2,1,1,1,1,1,1,1,2,1,1,1,2,3,1,1,1,1,1,1,1,1,1,0,1,
164 2,3,3,0,1,0,0,0,3,3,1,0,0,1,2,2,1,0,0,0,0,2,0,0,1,1,1,0,2,1,1,1,
165 2,1,1,1,1,1,1,2,1,1,0,1,1,0,1,1,1,0,1,2,1,1,0,1,1,1,1,1,1,1,0,1,
166 2,3,3,0,1,0,0,0,2,2,0,0,0,0,1,2,2,0,0,0,0,1,0,0,1,1,0,0,2,0,1,0,
167 2,1,1,1,1,2,1,1,1,1,1,1,1,2,1,1,1,1,1,1,1,1,1,2,0,1,1,1,1,1,0,1,
168 3,2,2,0,1,0,1,0,2,3,2,0,0,1,2,2,1,0,0,1,1,1,0,0,2,1,0,1,2,2,1,1,
169 2,1,1,1,1,1,1,2,1,1,1,1,1,1,0,2,1,0,1,1,0,1,1,1,0,1,1,2,1,1,0,1,
170 2,2,2,0,0,1,0,0,2,2,1,1,0,0,2,1,1,0,0,0,1,2,0,0,2,1,0,0,2,1,1,1,
171 2,1,1,1,1,2,1,2,1,1,1,2,2,1,1,2,1,1,1,2,1,1,1,1,1,1,1,1,1,1,0,1,
172 1,2,3,0,0,0,1,0,3,2,1,0,0,1,2,1,1,0,0,0,0,2,1,0,1,1,0,0,2,1,2,1,
173 1,1,0,0,0,1,0,1,1,1,1,1,2,0,0,1,0,0,0,2,0,0,1,1,1,1,1,1,1,1,0,1,
174 3,0,0,2,1,2,2,1,0,0,2,1,2,2,0,0,0,2,1,1,1,0,1,1,0,0,1,1,2,0,0,0,
175 1,2,1,2,2,1,1,2,1,2,0,1,1,1,1,1,1,1,1,1,2,1,1,0,0,1,1,1,1,0,0,1,
176 1,3,2,0,0,0,1,0,2,2,2,0,0,0,2,2,1,0,0,0,0,3,1,1,1,1,0,0,2,1,1,1,
177 2,1,0,1,1,1,0,1,1,1,1,1,1,1,0,2,1,0,0,1,0,1,1,0,1,1,1,1,1,1,0,1,
178 2,3,2,0,0,0,1,0,2,2,0,0,0,0,2,1,1,0,0,0,0,2,1,0,1,1,0,0,2,1,1,0,
179 2,1,1,1,1,2,1,2,1,2,0,1,1,1,0,2,1,1,1,2,1,1,1,1,0,1,1,1,1,1,0,1,
180 3,1,1,2,2,2,3,2,1,1,2,2,1,1,0,1,0,2,2,1,1,1,1,1,0,0,1,1,0,1,1,0,
181 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
182 2,2,2,0,0,0,0,0,2,2,0,0,0,0,2,2,1,0,0,0,1,1,0,0,1,2,0,0,2,1,1,1,
183 2,2,1,1,1,2,1,2,1,1,0,1,1,1,1,2,1,1,1,2,1,1,1,1,0,1,2,1,1,1,0,1,
184 1,0,0,1,2,3,2,1,0,0,2,0,1,1,0,0,0,1,1,1,1,0,1,1,0,0,1,0,0,0,0,0,
185 1,2,1,2,1,2,1,1,1,2,0,2,1,1,1,0,1,2,0,0,1,1,1,0,0,0,0,0,0,0,0,0,
186 2,3,2,0,0,0,0,0,1,1,2,1,0,0,1,1,1,0,0,0,0,2,0,0,1,1,0,0,2,1,1,1,
187 2,1,1,1,1,1,1,2,1,0,1,1,1,1,0,2,1,1,1,1,1,1,0,1,0,1,1,1,1,1,0,1,
188 1,2,2,0,1,1,1,0,2,2,2,0,0,0,3,2,1,0,0,0,1,1,0,0,1,1,0,1,1,1,0,0,
189 1,1,0,1,1,1,1,1,1,1,1,2,1,1,1,1,1,1,1,2,1,1,1,0,0,1,1,1,0,1,0,1,
190 2,1,0,2,1,1,2,2,1,1,2,1,1,1,0,0,0,1,1,0,1,1,1,1,0,0,1,1,1,0,0,0,
191 1,2,2,2,2,2,1,1,1,2,0,2,1,1,1,1,1,1,1,1,1,1,1,1,0,1,1,0,0,0,1,0,
192 1,2,3,0,0,0,1,0,2,2,0,0,0,0,2,2,0,0,0,0,0,1,0,0,1,0,0,0,2,0,1,0,
193 2,1,1,1,1,1,0,2,0,0,0,1,2,1,1,1,1,0,1,2,0,1,0,1,0,1,1,1,0,1,0,1,
194 2,2,2,0,0,0,1,0,2,1,2,0,0,0,1,1,2,0,0,0,0,1,0,0,1,1,0,0,2,1,0,1,
195 2,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,2,0,1,1,1,1,1,0,1,
196 1,2,2,0,0,0,1,0,2,2,2,0,0,0,1,1,0,0,0,0,0,1,1,0,2,0,0,1,1,1,0,1,
197 1,0,1,1,1,1,1,1,0,1,1,1,1,0,0,1,0,0,1,1,0,1,0,1,1,1,1,1,0,0,0,1,
198 1,0,0,1,0,1,2,1,0,0,1,1,1,2,0,0,0,1,1,0,1,0,1,1,0,0,1,0,0,0,0,0,
199 0,2,1,2,1,1,1,1,1,2,0,2,0,1,1,0,1,2,1,0,1,1,1,0,0,0,0,0,0,1,0,0,
200 2,1,1,0,1,2,0,0,1,1,1,0,0,0,1,1,0,0,0,0,0,1,0,0,1,0,0,0,2,1,0,1,
201 2,2,1,1,1,1,1,2,1,1,0,1,1,1,1,2,1,1,1,2,1,1,0,1,0,1,1,1,1,1,0,1,
202 1,2,2,0,0,0,0,0,1,1,0,0,0,0,2,1,0,0,0,0,0,2,0,0,2,2,0,0,2,0,0,1,
203 2,1,1,1,1,1,1,1,0,1,1,0,1,1,0,1,0,0,0,1,1,1,1,0,0,1,1,1,1,0,0,1,
204 1,1,2,0,0,3,1,0,2,1,1,1,0,0,1,1,1,0,0,0,1,1,0,0,0,1,0,0,1,0,1,0,
205 1,2,1,0,1,1,1,2,1,1,0,1,1,1,1,1,0,0,0,1,1,1,1,1,0,1,0,0,0,1,0,0,
206 2,1,1,0,0,0,0,0,1,0,0,0,0,0,0,0,0,1,0,1,0,0,0,1,0,0,0,0,2,0,0,0,
207 2,1,1,1,1,1,1,1,1,1,0,1,1,1,1,1,1,1,1,1,2,1,1,0,0,1,1,1,1,1,0,1,
208 2,1,1,1,2,1,1,1,0,1,1,2,1,0,0,0,0,1,1,1,1,0,1,0,0,0,0,1,0,0,0,0,
209 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
210 1,1,0,1,1,1,1,1,0,0,1,1,2,1,0,0,0,1,1,0,0,0,1,1,0,0,1,0,1,0,0,0,
211 1,2,1,1,1,1,1,1,1,1,0,1,0,1,1,1,1,1,1,0,1,1,1,0,0,0,0,0,0,1,0,0,
212 2,0,0,0,1,1,1,1,0,0,1,1,0,0,0,0,0,1,1,1,2,0,0,1,0,0,1,0,1,0,0,0,
213 0,1,1,1,1,1,1,1,1,2,0,1,1,1,1,0,1,1,1,0,1,1,1,0,0,0,0,0,0,0,0,0,
214 1,0,0,1,1,1,1,1,0,0,2,1,0,1,0,0,0,1,0,1,0,0,0,0,0,0,1,0,0,0,0,0,
215 0,1,1,1,1,1,1,0,1,1,0,1,0,1,1,0,1,1,0,0,1,1,1,0,0,0,0,0,0,0,0,0,
216 1,0,0,1,1,1,0,0,0,0,1,0,2,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,
217 0,1,1,1,1,1,0,0,1,1,0,1,0,1,0,0,1,1,1,0,1,1,1,0,0,0,0,0,0,0,0,0,
218 0,0,0,1,0,0,0,0,0,0,1,1,2,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
219 0,1,1,1,0,1,0,0,1,1,0,1,0,1,1,0,1,1,1,0,1,1,1,0,0,0,0,0,0,0,0,0,
220 2,1,1,1,1,1,1,1,1,1,1,0,0,1,1,1,0,0,1,0,0,1,0,1,0,1,1,1,0,0,1,0,
221 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
222 1,0,0,1,1,1,1,0,0,0,1,1,1,0,0,0,0,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,
223 0,1,1,1,1,1,1,0,1,1,0,1,0,1,0,0,1,1,0,0,1,1,0,0,0,0,0,0,0,0,0,0,
224 };
225
226 SequenceModel Latin2HungarianModel =
227 {
228 Latin2_HungarianCharToOrderMap,
229 HungarianLangModel,
230 (float)0.947368,
231 PR_TRUE,
232 CHARDET_ENCODING_ISO_8859_2
233 };
234
235 SequenceModel Win1250HungarianModel =
236 {
237 win1250HungarianCharToOrderMap,
238 HungarianLangModel,
239 (float)0.947368,
240 PR_TRUE,
241 CHARDET_ENCODING_WINDOWS_1250
242 };
+0
-222
c/src/LangThaiModel.cpp less more
0 /* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
1 /* ***** BEGIN LICENSE BLOCK *****
2 * Version: MPL 1.1/GPL 2.0/LGPL 2.1
3 *
4 * The contents of this file are subject to the Mozilla Public License Version
5 * 1.1 (the "License"); you may not use this file except in compliance with
6 * the License. You may obtain a copy of the License at
7 * http://www.mozilla.org/MPL/
8 *
9 * Software distributed under the License is distributed on an "AS IS" basis,
10 * WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License
11 * for the specific language governing rights and limitations under the
12 * License.
13 *
14 * The Original Code is Mozilla Communicator client code.
15 *
16 * The Initial Developer of the Original Code is
17 * Netscape Communications Corporation.
18 * Portions created by the Initial Developer are Copyright (C) 1998
19 * the Initial Developer. All Rights Reserved.
20 *
21 * Contributor(s):
22 *
23 * Alternatively, the contents of this file may be used under the terms of
24 * either the GNU General Public License Version 2 or later (the "GPL"), or
25 * the GNU Lesser General Public License Version 2.1 or later (the "LGPL"),
26 * in which case the provisions of the GPL or the LGPL are applicable instead
27 * of those above. If you wish to allow use of your version of this file only
28 * under the terms of either the GPL or the LGPL, and not to allow others to
29 * use your version of this file under the terms of the MPL, indicate your
30 * decision by deleting the provisions above and replace them with the notice
31 * and other provisions required by the GPL or the LGPL. If you do not delete
32 * the provisions above, a recipient may use your version of this file under
33 * the terms of any one of the MPL, the GPL or the LGPL.
34 *
35 * ***** END LICENSE BLOCK ***** */
36
37 #include "universalchardet.h"
38 #include "nsSBCharSetProber.h"
39
40
41 /****************************************************************
42 255: Control characters that usually does not exist in any text
43 254: Carriage/Return
44 253: symbol (punctuation) that does not belong to word
45 252: 0 - 9
46
47 *****************************************************************/
48
49 //The following result for thai was collected from a limited sample (1M).
50
51 //Character Mapping Table:
52 unsigned char TIS620CharToOrderMap[] =
53 {
54 255,255,255,255,255,255,255,255,255,255,254,255,255,254,255,255, //00
55 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, //10
56 +253,253,253,253,253,253,253,253,253,253,253,253,253,253,253,253, //20
57 252,252,252,252,252,252,252,252,252,252,253,253,253,253,253,253, //30
58 253,182,106,107,100,183,184,185,101, 94,186,187,108,109,110,111, //40
59 188,189,190, 89, 95,112,113,191,192,193,194,253,253,253,253,253, //50
60 253, 64, 72, 73,114, 74,115,116,102, 81,201,117, 90,103, 78, 82, //60
61 96,202, 91, 79, 84,104,105, 97, 98, 92,203,253,253,253,253,253, //70
62 209,210,211,212,213, 88,214,215,216,217,218,219,220,118,221,222,
63 223,224, 99, 85, 83,225,226,227,228,229,230,231,232,233,234,235,
64 236, 5, 30,237, 24,238, 75, 8, 26, 52, 34, 51,119, 47, 58, 57,
65 49, 53, 55, 43, 20, 19, 44, 14, 48, 3, 17, 25, 39, 62, 31, 54,
66 45, 9, 16, 2, 61, 15,239, 12, 42, 46, 18, 21, 76, 4, 66, 63,
67 22, 10, 1, 36, 23, 13, 40, 27, 32, 35, 86,240,241,242,243,244,
68 11, 28, 41, 29, 33,245, 50, 37, 6, 7, 67, 77, 38, 93,246,247,
69 68, 56, 59, 65, 69, 60, 70, 80, 71, 87,248,249,250,251,252,253,
70 };
71
72
73
74
75 //Model Table:
76 //total sequences: 100%
77 //first 512 sequences: 92.6386%
78 //first 1024 sequences:7.3177%
79 //rest sequences: 1.0230%
80 //negative sequences: 0.0436%
81 char ThaiLangModel[] =
82 {
83 0,1,3,3,3,3,0,0,3,3,0,3,3,0,3,3,3,3,3,3,3,3,0,0,3,3,3,0,3,3,3,3,
84 0,3,3,0,0,0,1,3,0,3,3,2,3,3,0,1,2,3,3,3,3,0,2,0,2,0,0,3,2,1,2,2,
85 3,0,3,3,2,3,0,0,3,3,0,3,3,0,3,3,3,3,3,3,3,3,3,0,3,2,3,0,2,2,2,3,
86 0,2,3,0,0,0,0,1,0,1,2,3,1,1,3,2,2,0,1,1,0,0,1,0,0,0,0,0,0,0,1,1,
87 3,3,3,2,3,3,3,3,3,3,3,3,3,3,3,2,2,2,2,2,2,2,3,3,2,3,2,3,3,2,2,2,
88 3,1,2,3,0,3,3,2,2,1,2,3,3,1,2,0,1,3,0,1,0,0,1,0,0,0,0,0,0,0,1,1,
89 3,3,2,2,3,3,3,3,1,2,3,3,3,3,3,2,2,2,2,3,3,2,2,3,3,2,2,3,2,3,2,2,
90 3,3,1,2,3,1,2,2,3,3,1,0,2,1,0,0,3,1,2,1,0,0,1,0,0,0,0,0,0,1,0,1,
91 3,3,3,3,3,3,2,2,3,3,3,3,2,3,2,2,3,3,2,2,3,2,2,2,2,1,1,3,1,2,1,1,
92 3,2,1,0,2,1,0,1,0,1,1,0,1,1,0,0,1,0,1,0,0,0,1,0,0,0,0,0,0,0,0,0,
93 3,3,3,2,3,2,3,3,2,2,3,2,3,3,2,3,1,1,2,3,2,2,2,3,2,2,2,2,2,1,2,1,
94 2,2,1,1,3,3,2,1,0,1,2,2,0,1,3,0,0,0,1,1,0,0,0,0,0,2,3,0,0,2,1,1,
95 3,3,2,3,3,2,0,0,3,3,0,3,3,0,2,2,3,1,2,2,1,1,1,0,2,2,2,0,2,2,1,1,
96 0,2,1,0,2,0,0,2,0,1,0,0,1,0,0,0,1,1,1,1,0,0,0,0,0,0,0,0,0,0,1,0,
97 3,3,2,3,3,2,0,0,3,3,0,2,3,0,2,1,2,2,2,2,1,2,0,0,2,2,2,0,2,2,1,1,
98 0,2,1,0,2,0,0,2,0,1,1,0,1,0,0,0,0,0,0,1,0,0,1,0,0,0,0,0,0,0,0,0,
99 3,3,2,3,2,3,2,0,2,2,1,3,2,1,3,2,1,2,3,2,2,3,0,2,3,2,2,1,2,2,2,2,
100 1,2,2,0,0,0,0,2,0,1,2,0,1,1,1,0,1,0,3,1,1,0,0,0,0,0,0,0,0,0,1,0,
101 3,3,2,3,3,2,3,2,2,2,3,2,2,3,2,2,1,2,3,2,2,3,1,3,2,2,2,3,2,2,2,3,
102 3,2,1,3,0,1,1,1,0,2,1,1,1,1,1,0,1,0,1,1,0,0,0,0,0,0,0,0,0,2,0,0,
103 1,0,0,3,0,3,3,3,3,3,0,0,3,0,2,2,3,3,3,3,3,0,0,0,1,1,3,0,0,0,0,2,
104 0,0,1,0,0,0,0,0,0,0,2,3,0,0,0,3,0,2,0,0,0,0,0,3,0,0,0,0,0,0,0,0,
105 2,0,3,3,3,3,0,0,2,3,0,0,3,0,3,3,2,3,3,3,3,3,0,0,3,3,3,0,0,0,3,3,
106 0,0,3,0,0,0,0,2,0,0,2,1,1,3,0,0,1,0,0,2,3,0,1,0,0,0,0,0,0,0,1,0,
107 3,3,3,3,2,3,3,3,3,3,3,3,1,2,1,3,3,2,2,1,2,2,2,3,1,1,2,0,2,1,2,1,
108 2,2,1,0,0,0,1,1,0,1,0,1,1,0,0,0,0,0,1,1,0,0,1,0,0,0,0,0,0,0,0,0,
109 3,0,2,1,2,3,3,3,0,2,0,2,2,0,2,1,3,2,2,1,2,1,0,0,2,2,1,0,2,1,2,2,
110 0,1,1,0,0,0,0,1,0,1,1,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,
111 3,3,3,3,2,1,3,3,1,1,3,0,2,3,1,1,3,2,1,1,2,0,2,2,3,2,1,1,1,1,1,2,
112 3,0,0,1,3,1,2,1,2,0,3,0,0,0,1,0,3,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,
113 3,3,1,1,3,2,3,3,3,1,3,2,1,3,2,1,3,2,2,2,2,1,3,3,1,2,1,3,1,2,3,0,
114 2,1,1,3,2,2,2,1,2,1,0,0,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,
115 3,3,2,3,2,3,3,2,3,2,3,2,3,3,2,1,0,3,2,2,2,1,2,2,2,1,2,2,1,2,1,1,
116 2,2,2,3,0,1,3,1,1,1,1,0,1,1,0,2,1,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,
117 3,3,3,3,2,3,2,2,1,1,3,2,3,2,3,2,0,3,2,2,1,2,0,2,2,2,1,2,2,2,2,1,
118 3,2,1,2,2,1,0,2,0,1,0,0,1,1,0,0,0,0,0,1,1,0,1,0,0,0,0,0,0,0,0,1,
119 3,3,3,3,3,2,3,1,2,3,3,2,2,3,0,1,1,2,0,3,3,2,2,3,0,1,1,3,0,0,0,0,
120 3,1,0,3,3,0,2,0,2,1,0,0,3,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
121 3,3,3,2,3,2,3,3,0,1,3,1,1,2,1,2,1,1,3,1,1,0,2,3,1,1,1,1,1,1,1,1,
122 3,1,1,2,2,2,2,1,1,1,0,0,2,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,
123 3,2,2,1,1,2,1,3,3,2,3,2,2,3,2,2,3,1,2,2,1,2,0,3,2,1,2,2,2,2,2,1,
124 3,2,1,2,2,2,1,1,1,1,0,0,1,1,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,
125 3,3,3,3,3,3,3,3,1,3,3,0,2,1,0,3,2,0,0,3,1,0,1,1,0,1,0,0,0,0,0,1,
126 1,0,0,1,0,3,2,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
127 3,0,2,2,2,3,0,0,1,3,0,3,2,0,3,2,2,3,3,3,3,3,1,0,2,2,2,0,2,2,1,2,
128 0,2,3,0,0,0,0,1,0,1,0,0,1,1,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,
129 3,0,2,3,1,3,3,2,3,3,0,3,3,0,3,2,2,3,2,3,3,3,0,0,2,2,3,0,1,1,1,3,
130 0,0,3,0,0,0,2,2,0,1,3,0,1,2,2,2,3,0,0,0,0,0,1,0,0,0,0,0,0,0,0,1,
131 3,2,3,3,2,0,3,3,2,2,3,1,3,2,1,3,2,0,1,2,2,0,2,3,2,1,0,3,0,0,0,0,
132 3,0,0,2,3,1,3,0,0,3,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
133 3,1,3,2,2,2,1,2,0,1,3,1,1,3,1,3,0,0,2,1,1,1,1,2,1,1,1,0,2,1,0,1,
134 1,2,0,0,0,3,1,1,0,0,0,0,1,0,1,0,0,1,0,1,0,0,0,0,0,3,1,0,0,0,1,0,
135 3,3,3,3,2,2,2,2,2,1,3,1,1,1,2,0,1,1,2,1,2,1,3,2,0,0,3,1,1,1,1,1,
136 3,1,0,2,3,0,0,0,3,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
137 0,0,0,2,3,0,3,3,0,2,0,0,0,0,0,0,0,3,0,0,1,0,0,0,0,0,0,0,0,0,0,0,
138 0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
139 0,0,2,3,1,3,0,0,1,2,0,0,2,0,3,3,2,3,3,3,2,3,0,0,2,2,2,0,0,0,2,2,
140 0,0,1,0,0,0,0,3,0,0,0,0,2,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,
141 0,0,0,3,0,2,0,0,0,0,0,0,0,0,0,0,1,2,3,1,3,3,0,0,1,0,3,0,0,0,0,0,
142 0,0,3,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
143 3,3,1,2,3,1,2,3,1,0,3,0,2,2,1,0,2,1,1,2,0,1,0,0,1,1,1,1,0,1,0,0,
144 1,0,0,0,0,1,1,0,3,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
145 3,3,3,3,2,1,0,1,1,1,3,1,2,2,2,2,2,2,1,1,1,1,0,3,1,0,1,3,1,1,1,1,
146 1,1,0,2,0,1,3,1,1,0,0,1,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,2,0,1,
147 3,0,2,2,1,3,3,2,3,3,0,1,1,0,2,2,1,2,1,3,3,1,0,0,3,2,0,0,0,0,2,1,
148 0,1,0,0,0,0,1,2,0,1,1,3,1,1,2,2,1,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,
149 0,0,3,0,0,1,0,0,0,3,0,0,3,0,3,1,0,1,1,1,3,2,0,0,0,3,0,0,0,0,2,0,
150 0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,2,0,0,0,0,0,0,0,0,0,
151 3,3,1,3,2,1,3,3,1,2,2,0,1,2,1,0,1,2,0,0,0,0,0,3,0,0,0,3,0,0,0,0,
152 3,0,0,1,1,1,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
153 3,0,1,2,0,3,3,3,2,2,0,1,1,0,1,3,0,0,0,2,2,0,0,0,0,3,1,0,1,0,0,0,
154 0,0,0,0,0,0,0,0,0,1,0,1,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
155 3,0,2,3,1,2,0,0,2,1,0,3,1,0,1,2,0,1,1,1,1,3,0,0,3,1,1,0,2,2,1,1,
156 0,2,0,0,0,0,0,1,0,1,0,0,1,1,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
157 3,0,0,3,1,2,0,0,2,2,0,1,2,0,1,0,1,3,1,2,1,0,0,0,2,0,3,0,0,0,1,0,
158 0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
159 3,0,1,1,2,2,0,0,0,2,0,2,1,0,1,1,0,1,1,1,2,1,0,0,1,1,1,0,2,1,1,1,
160 0,1,1,0,0,0,0,0,0,1,0,0,1,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,1,0,1,
161 0,0,0,2,0,1,3,1,1,1,1,0,0,0,0,3,2,0,1,0,0,0,1,2,0,0,0,1,0,0,0,0,
162 0,0,0,3,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
163 0,0,0,0,0,3,3,3,3,1,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,
164 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
165 1,0,2,3,2,2,0,0,0,1,0,0,0,0,2,3,2,1,2,2,3,0,0,0,2,3,1,0,0,0,1,1,
166 0,0,1,0,0,0,0,0,0,0,1,0,0,1,0,0,0,0,0,1,1,0,1,0,0,0,0,0,0,0,0,0,
167 3,3,2,2,0,1,0,0,0,0,2,0,2,0,1,0,0,0,1,1,0,0,0,2,1,0,1,0,1,1,0,0,
168 0,1,0,2,0,0,1,0,3,0,1,0,0,0,2,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
169 3,3,1,0,0,1,0,0,0,0,0,1,1,2,0,0,0,0,1,0,0,1,3,1,0,0,0,0,1,1,0,0,
170 0,1,0,0,0,0,3,0,0,0,0,0,0,3,0,0,0,0,0,0,0,3,0,0,0,0,0,0,0,0,0,0,
171 3,3,1,1,1,1,2,3,0,0,2,1,1,1,1,1,0,2,1,1,0,0,0,2,1,0,1,2,1,1,0,1,
172 2,1,0,3,0,0,0,0,3,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
173 1,3,1,0,0,0,0,0,0,0,3,0,0,0,3,0,0,0,0,0,0,0,0,1,1,0,0,0,0,0,0,1,
174 0,0,0,2,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
175 3,3,2,0,0,0,0,0,0,1,2,1,0,1,1,0,2,0,0,1,0,0,2,0,0,0,0,0,0,0,0,0,
176 0,0,0,0,0,0,2,0,0,0,1,3,0,1,0,0,0,2,0,0,0,0,0,0,0,1,2,0,0,0,0,0,
177 3,3,0,0,1,1,2,0,0,1,2,1,0,1,1,1,0,1,1,0,0,2,1,1,0,1,0,0,1,1,1,0,
178 0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,3,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,
179 2,2,2,1,0,0,0,0,1,0,0,0,0,3,0,0,0,0,0,0,0,0,0,3,0,0,0,0,0,0,0,0,
180 2,0,0,0,0,0,3,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
181 2,3,0,0,1,1,0,0,0,2,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
182 0,0,0,0,0,0,1,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
183 3,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
184 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
185 1,1,0,1,2,0,1,2,0,0,1,1,0,2,0,1,0,0,1,0,0,0,0,1,0,0,0,2,0,0,0,0,
186 1,0,0,1,0,1,1,0,3,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
187 0,1,0,0,0,0,0,0,0,1,1,0,1,1,0,2,1,3,0,0,0,0,1,1,0,0,0,0,0,0,0,3,
188 1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
189 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,
190 0,0,0,0,0,0,3,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
191 2,0,1,0,1,0,0,2,0,0,2,0,0,1,1,2,0,0,1,1,0,0,0,1,0,0,0,1,1,0,0,0,
192 1,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,
193 1,0,0,3,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,1,
194 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
195 3,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
196 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,0,0,1,1,0,0,0,
197 2,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,3,0,0,0,0,0,0,0,0,
198 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
199 2,0,0,0,0,2,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,1,0,1,0,0,0,0,0,0,0,0,
200 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
201 2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
202 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,1,3,0,0,0,
203 2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
204 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,0,0,1,0,0,0,0,
205 1,0,0,0,0,0,0,0,0,1,0,0,0,0,2,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,
206 0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
207 0,0,1,1,0,0,2,1,0,0,1,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
208 0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
209 2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
210 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
211 };
212
213
214 SequenceModel TIS620ThaiModel =
215 {
216 TIS620CharToOrderMap,
217 ThaiLangModel,
218 (float)0.926386,
219 PR_FALSE,
220 CHARDET_ENCODING_TIS_620
221 };
+0
-42
c/src/Makefile less more
0 CXX=g++
1 CXXFLAGS=-c -O2 -D_REENTRANT -I../include
2 LDFLAGS=
3
4 SRCS=\
5 CharDistribution.cpp \
6 JpCntx.cpp \
7 LangBulgarianModel.cpp \
8 LangCyrillicModel.cpp \
9 LangGreekModel.cpp \
10 LangHebrewModel.cpp \
11 LangHungarianModel.cpp \
12 LangThaiModel.cpp \
13 nsBig5Prober.cpp \
14 nsCharSetProber.cpp \
15 nsEUCJPProber.cpp \
16 nsEUCKRProber.cpp \
17 nsEUCTWProber.cpp \
18 nsEscCharsetProber.cpp \
19 nsEscSM.cpp \
20 nsGB2312Prober.cpp \
21 nsHebrewProber.cpp \
22 nsLatin1Prober.cpp \
23 nsMBCSGroupProber.cpp \
24 nsMBCSSM.cpp \
25 nsSBCSGroupProber.cpp \
26 nsSBCharSetProber.cpp \
27 nsSJISProber.cpp \
28 nsUTF8Prober.cpp \
29 nsUniversalDetector.cpp
30
31 OBJS=$(SRCS:%.cpp=%.o)
32
33 all: $(OBJS)
34
35 $(OBJS): %.o: %.cpp
36 libtool --mode=compile $(CXX) $(CXXFLAGS) $<
37
38 clean:
39 rm -f *.o
40 rm -f *.lo
41 rm -rf .libs
+0
-93
c/src/nsBig5Prober.cpp less more
0 /* -*- Mode: C; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
1 /* ***** BEGIN LICENSE BLOCK *****
2 * Version: MPL 1.1/GPL 2.0/LGPL 2.1
3 *
4 * The contents of this file are subject to the Mozilla Public License Version
5 * 1.1 (the "License"); you may not use this file except in compliance with
6 * the License. You may obtain a copy of the License at
7 * http://www.mozilla.org/MPL/
8 *
9 * Software distributed under the License is distributed on an "AS IS" basis,
10 * WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License
11 * for the specific language governing rights and limitations under the
12 * License.
13 *
14 * The Original Code is mozilla.org code.
15 *
16 * The Initial Developer of the Original Code is
17 * Netscape Communications Corporation.
18 * Portions created by the Initial Developer are Copyright (C) 1998
19 * the Initial Developer. All Rights Reserved.
20 *
21 * Contributor(s):
22 *
23 * Alternatively, the contents of this file may be used under the terms of
24 * either the GNU General Public License Version 2 or later (the "GPL"), or
25 * the GNU Lesser General Public License Version 2.1 or later (the "LGPL"),
26 * in which case the provisions of the GPL or the LGPL are applicable instead
27 * of those above. If you wish to allow use of your version of this file only
28 * under the terms of either the GPL or the LGPL, and not to allow others to
29 * use your version of this file under the terms of the MPL, indicate your
30 * decision by deleting the provisions above and replace them with the notice
31 * and other provisions required by the GPL or the LGPL. If you do not delete
32 * the provisions above, a recipient may use your version of this file under
33 * the terms of any one of the MPL, the GPL or the LGPL.
34 *
35 * ***** END LICENSE BLOCK ***** */
36
37 #include "nsBig5Prober.h"
38
39 void nsBig5Prober::Reset(void)
40 {
41 mCodingSM->Reset();
42 mState = eDetecting;
43 mDistributionAnalyser.Reset();
44 }
45
46 nsProbingState nsBig5Prober::HandleData(const char* aBuf, PRUint32 aLen)
47 {
48 nsSMState codingState;
49
50 for (PRUint32 i = 0; i < aLen; i++)
51 {
52 codingState = mCodingSM->NextState(aBuf[i]);
53 if (codingState == eError)
54 {
55 mState = eNotMe;
56 break;
57 }
58 if (codingState == eItsMe)
59 {
60 mState = eFoundIt;
61 break;
62 }
63 if (codingState == eStart)
64 {
65 PRUint32 charLen = mCodingSM->GetCurrentCharLen();
66
67 if (i == 0)
68 {
69 mLastChar[1] = aBuf[0];
70 mDistributionAnalyser.HandleOneChar(mLastChar, charLen);
71 }
72 else
73 mDistributionAnalyser.HandleOneChar(aBuf+i-1, charLen);
74 }
75 }
76
77 mLastChar[0] = aBuf[aLen-1];
78
79 if (mState == eDetecting)
80 if (mDistributionAnalyser.GotEnoughData() && GetConfidence() > SHORTCUT_THRESHOLD)
81 mState = eFoundIt;
82
83 return mState;
84 }
85
86 float nsBig5Prober::GetConfidence(void)
87 {
88 float distribCf = mDistributionAnalyser.GetConfidence();
89
90 return (float)distribCf;
91 }
92
+0
-72
c/src/nsBig5Prober.h less more
0 /* -*- Mode: C; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
1 /* ***** BEGIN LICENSE BLOCK *****
2 * Version: MPL 1.1/GPL 2.0/LGPL 2.1
3 *
4 * The contents of this file are subject to the Mozilla Public License Version
5 * 1.1 (the "License"); you may not use this file except in compliance with
6 * the License. You may obtain a copy of the License at
7 * http://www.mozilla.org/MPL/
8 *
9 * Software distributed under the License is distributed on an "AS IS" basis,
10 * WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License
11 * for the specific language governing rights and limitations under the
12 * License.
13 *
14 * The Original Code is mozilla.org code.
15 *
16 * The Initial Developer of the Original Code is
17 * Netscape Communications Corporation.
18 * Portions created by the Initial Developer are Copyright (C) 1998
19 * the Initial Developer. All Rights Reserved.
20 *
21 * Contributor(s):
22 *
23 * Alternatively, the contents of this file may be used under the terms of
24 * either the GNU General Public License Version 2 or later (the "GPL"), or
25 * the GNU Lesser General Public License Version 2.1 or later (the "LGPL"),
26 * in which case the provisions of the GPL or the LGPL are applicable instead
27 * of those above. If you wish to allow use of your version of this file only
28 * under the terms of either the GPL or the LGPL, and not to allow others to
29 * use your version of this file under the terms of the MPL, indicate your
30 * decision by deleting the provisions above and replace them with the notice
31 * and other provisions required by the GPL or the LGPL. If you do not delete
32 * the provisions above, a recipient may use your version of this file under
33 * the terms of any one of the MPL, the GPL or the LGPL.
34 *
35 * ***** END LICENSE BLOCK ***** */
36
37 #ifndef nsBig5Prober_h__
38 #define nsBig5Prober_h__
39
40 #include "universalchardet.h"
41 #include "nsCharSetProber.h"
42 #include "nsCodingStateMachine.h"
43 #include "CharDistribution.h"
44
45 class nsBig5Prober: public nsCharSetProber {
46 public:
47 nsBig5Prober(void){mCodingSM = new nsCodingStateMachine(&Big5SMModel);
48 Reset();}
49 virtual ~nsBig5Prober(void){delete mCodingSM;}
50 nsProbingState HandleData(const char* aBuf, PRUint32 aLen);
51 const char* GetCharSetName() {return CHARDET_ENCODING_BIG5;}
52 nsProbingState GetState(void) {return mState;}
53 void Reset(void);
54 float GetConfidence(void);
55 void SetOpion() {}
56
57 protected:
58 void GetDistribution(PRUint32 aCharLen, const char* aStr);
59
60 nsCodingStateMachine* mCodingSM;
61 nsProbingState mState;
62
63 //Big5ContextAnalysis mContextAnalyser;
64 Big5DistributionAnalysis mDistributionAnalyser;
65 char mLastChar[2];
66
67 };
68
69
70 #endif /* nsBig5Prober_h__ */
71
+0
-125
c/src/nsCharSetProber.cpp less more
0 /* -*- Mode: C; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
1 /* ***** BEGIN LICENSE BLOCK *****
2 * Version: MPL 1.1/GPL 2.0/LGPL 2.1
3 *
4 * The contents of this file are subject to the Mozilla Public License Version
5 * 1.1 (the "License"); you may not use this file except in compliance with
6 * the License. You may obtain a copy of the License at
7 * http://www.mozilla.org/MPL/
8 *
9 * Software distributed under the License is distributed on an "AS IS" basis,
10 * WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License
11 * for the specific language governing rights and limitations under the
12 * License.
13 *
14 * The Original Code is Mozilla Universal charset detector code.
15 *
16 * The Initial Developer of the Original Code is
17 * Netscape Communications Corporation.
18 * Portions created by the Initial Developer are Copyright (C) 2001
19 * the Initial Developer. All Rights Reserved.
20 *
21 * Contributor(s):
22 * Shy Shalom <shooshX@gmail.com>
23 *
24 * Alternatively, the contents of this file may be used under the terms of
25 * either the GNU General Public License Version 2 or later (the "GPL"), or
26 * the GNU Lesser General Public License Version 2.1 or later (the "LGPL"),
27 * in which case the provisions of the GPL or the LGPL are applicable instead
28 * of those above. If you wish to allow use of your version of this file only
29 * under the terms of either the GPL or the LGPL, and not to allow others to
30 * use your version of this file under the terms of the MPL, indicate your
31 * decision by deleting the provisions above and replace them with the notice
32 * and other provisions required by the GPL or the LGPL. If you do not delete
33 * the provisions above, a recipient may use your version of this file under
34 * the terms of any one of the MPL, the GPL or the LGPL.
35 *
36 * ***** END LICENSE BLOCK ***** */
37
38 #include "nsCharSetProber.h"
39 #include "prmem.h"
40
41 //This filter applies to all scripts which do not use English characters
42 PRBool nsCharSetProber::FilterWithoutEnglishLetters(const char* aBuf, PRUint32 aLen, char** newBuf, PRUint32& newLen)
43 {
44 char *newptr;
45 char *prevPtr, *curPtr;
46
47 PRBool meetMSB = PR_FALSE;
48 newptr = *newBuf = (char*)PR_Malloc(aLen);
49 if (!newptr)
50 return PR_FALSE;
51
52 for (curPtr = prevPtr = (char*)aBuf; curPtr < aBuf+aLen; curPtr++)
53 {
54 if (*curPtr & 0x80)
55 {
56 meetMSB = PR_TRUE;
57 }
58 else if (*curPtr < 'A' || (*curPtr > 'Z' && *curPtr < 'a') || *curPtr > 'z')
59 {
60 //current char is a symbol, most likely a punctuation. we treat it as segment delimiter
61 if (meetMSB && curPtr > prevPtr)
62 //this segment contains more than single symbol, and it has upper ASCII, we need to keep it
63 {
64 while (prevPtr < curPtr) *newptr++ = *prevPtr++;
65 prevPtr++;
66 *newptr++ = ' ';
67 meetMSB = PR_FALSE;
68 }
69 else //ignore current segment. (either because it is just a symbol or just an English word)
70 prevPtr = curPtr+1;
71 }
72 }
73 if (meetMSB && curPtr > prevPtr)
74 while (prevPtr < curPtr) *newptr++ = *prevPtr++;
75
76 newLen = newptr - *newBuf;
77
78 return PR_TRUE;
79 }
80
81 //This filter applies to all scripts which contain both English characters and upper ASCII characters.
82 PRBool nsCharSetProber::FilterWithEnglishLetters(const char* aBuf, PRUint32 aLen, char** newBuf, PRUint32& newLen)
83 {
84 //do filtering to reduce load to probers
85 char *newptr;
86 char *prevPtr, *curPtr;
87 PRBool isInTag = PR_FALSE;
88
89 newptr = *newBuf = (char*)PR_Malloc(aLen);
90 if (!newptr)
91 return PR_FALSE;
92
93 for (curPtr = prevPtr = (char*)aBuf; curPtr < aBuf+aLen; curPtr++)
94 {
95 if (*curPtr == '>')
96 isInTag = PR_FALSE;
97 else if (*curPtr == '<')
98 isInTag = PR_TRUE;
99
100 if (!(*curPtr & 0x80) &&
101 (*curPtr < 'A' || (*curPtr > 'Z' && *curPtr < 'a') || *curPtr > 'z') )
102 {
103 if (curPtr > prevPtr && !isInTag) // Current segment contains more than just a symbol
104 // and it is not inside a tag, keep it.
105 {
106 while (prevPtr < curPtr) *newptr++ = *prevPtr++;
107 prevPtr++;
108 *newptr++ = ' ';
109 }
110 else
111 prevPtr = curPtr+1;
112 }
113 }
114
115 // If the current segment contains more than just a symbol
116 // and it is not inside a tag then keep it.
117 if (!isInTag)
118 while (prevPtr < curPtr)
119 *newptr++ = *prevPtr++;
120
121 newLen = newptr - *newBuf;
122
123 return PR_TRUE;
124 }
+0
-76
c/src/nsCharSetProber.h less more
0 /* -*- Mode: C; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
1 /* ***** BEGIN LICENSE BLOCK *****
2 * Version: MPL 1.1/GPL 2.0/LGPL 2.1
3 *
4 * The contents of this file are subject to the Mozilla Public License Version
5 * 1.1 (the "License"); you may not use this file except in compliance with
6 * the License. You may obtain a copy of the License at
7 * http://www.mozilla.org/MPL/
8 *
9 * Software distributed under the License is distributed on an "AS IS" basis,
10 * WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License
11 * for the specific language governing rights and limitations under the
12 * License.
13 *
14 * The Original Code is Mozilla Universal charset detector code.
15 *
16 * The Initial Developer of the Original Code is
17 * Netscape Communications Corporation.
18 * Portions created by the Initial Developer are Copyright (C) 2001
19 * the Initial Developer. All Rights Reserved.
20 *
21 * Contributor(s):
22 * Shy Shalom <shooshX@gmail.com>
23 *
24 * Alternatively, the contents of this file may be used under the terms of
25 * either the GNU General Public License Version 2 or later (the "GPL"), or
26 * the GNU Lesser General Public License Version 2.1 or later (the "LGPL"),
27 * in which case the provisions of the GPL or the LGPL are applicable instead
28 * of those above. If you wish to allow use of your version of this file only
29 * under the terms of either the GPL or the LGPL, and not to allow others to
30 * use your version of this file under the terms of the MPL, indicate your
31 * decision by deleting the provisions above and replace them with the notice
32 * and other provisions required by the GPL or the LGPL. If you do not delete
33 * the provisions above, a recipient may use your version of this file under
34 * the terms of any one of the MPL, the GPL or the LGPL.
35 *
36 * ***** END LICENSE BLOCK ***** */
37 #ifndef nsCharSetProber_h__
38 #define nsCharSetProber_h__
39
40 #include "nscore.h"
41
42 //#define DEBUG_chardet // Uncomment this for debug dump.
43
44 typedef enum {
45 eDetecting = 0, //We are still detecting, no sure answer yet, but caller can ask for confidence.
46 eFoundIt = 1, //That's a positive answer
47 eNotMe = 2 //Negative answer
48 } nsProbingState;
49
50 #define SHORTCUT_THRESHOLD (float)0.95
51
52 class nsCharSetProber {
53 public:
54 virtual ~nsCharSetProber() {}
55 virtual const char* GetCharSetName() = 0;
56 virtual nsProbingState HandleData(const char* aBuf, PRUint32 aLen) = 0;
57 virtual nsProbingState GetState(void) = 0;
58 virtual void Reset(void) = 0;
59 virtual float GetConfidence(void) = 0;
60 virtual void SetOpion() = 0;
61
62 #ifdef DEBUG_chardet
63 virtual void DumpStatus() {}
64 #endif
65
66 // Helper functions used in the Latin1 and Group probers.
67 // both functions Allocate a new buffer for newBuf. This buffer should be
68 // freed by the caller using PR_FREEIF.
69 // Both functions return PR_FALSE in case of memory allocation failure.
70 static PRBool FilterWithoutEnglishLetters(const char* aBuf, PRUint32 aLen, char** newBuf, PRUint32& newLen);
71 static PRBool FilterWithEnglishLetters(const char* aBuf, PRUint32 aLen, char** newBuf, PRUint32& newLen);
72
73 };
74
75 #endif /* nsCharSetProber_h__ */
+0
-108
c/src/nsCodingStateMachine.h less more
0 /* -*- Mode: C; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
1 /* ***** BEGIN LICENSE BLOCK *****
2 * Version: MPL 1.1/GPL 2.0/LGPL 2.1
3 *
4 * The contents of this file are subject to the Mozilla Public License Version
5 * 1.1 (the "License"); you may not use this file except in compliance with
6 * the License. You may obtain a copy of the License at
7 * http://www.mozilla.org/MPL/
8 *
9 * Software distributed under the License is distributed on an "AS IS" basis,
10 * WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License
11 * for the specific language governing rights and limitations under the
12 * License.
13 *
14 * The Original Code is mozilla.org code.
15 *
16 * The Initial Developer of the Original Code is
17 * Netscape Communications Corporation.
18 * Portions created by the Initial Developer are Copyright (C) 1998
19 * the Initial Developer. All Rights Reserved.
20 *
21 * Contributor(s):
22 *
23 * Alternatively, the contents of this file may be used under the terms of
24 * either the GNU General Public License Version 2 or later (the "GPL"), or
25 * the GNU Lesser General Public License Version 2.1 or later (the "LGPL"),
26 * in which case the provisions of the GPL or the LGPL are applicable instead
27 * of those above. If you wish to allow use of your version of this file only
28 * under the terms of either the GPL or the LGPL, and not to allow others to
29 * use your version of this file under the terms of the MPL, indicate your
30 * decision by deleting the provisions above and replace them with the notice
31 * and other provisions required by the GPL or the LGPL. If you do not delete
32 * the provisions above, a recipient may use your version of this file under
33 * the terms of any one of the MPL, the GPL or the LGPL.
34 *
35 * ***** END LICENSE BLOCK ***** */
36 #ifndef nsCodingStateMachine_h__
37 #define nsCodingStateMachine_h__
38
39 #include "nsPkgInt.h"
40
41 typedef enum {
42 eStart = 0,
43 eError = 1,
44 eItsMe = 2
45 } nsSMState;
46
47 #define GETCLASS(c) GETFROMPCK(((unsigned char)(c)), mModel->classTable)
48
49 //state machine model
50 typedef struct
51 {
52 nsPkgInt classTable;
53 PRUint32 classFactor;
54 nsPkgInt stateTable;
55 const PRUint32* charLenTable;
56 const char* name;
57 } SMModel;
58
59 class nsCodingStateMachine {
60 public:
61 nsCodingStateMachine(SMModel* sm){
62 mCurrentState = eStart;
63 mModel = sm;
64 }
65 nsSMState NextState(char c){
66 //for each byte we get its class , if it is first byte, we also get byte length
67 PRUint32 byteCls = GETCLASS(c);
68 if (mCurrentState == eStart)
69 {
70 mCurrentBytePos = 0;
71 mCurrentCharLen = mModel->charLenTable[byteCls];
72 }
73 //from byte's class and stateTable, we get its next state
74 mCurrentState=(nsSMState)GETFROMPCK(mCurrentState*(mModel->classFactor)+byteCls,
75 mModel->stateTable);
76 mCurrentBytePos++;
77 return mCurrentState;
78 }
79 PRUint32 GetCurrentCharLen(void) {return mCurrentCharLen;}
80 void Reset(void) {mCurrentState = eStart;}
81 const char * GetCodingStateMachine() {return mModel->name;}
82
83 protected:
84 nsSMState mCurrentState;
85 PRUint32 mCurrentCharLen;
86 PRUint32 mCurrentBytePos;
87
88 SMModel *mModel;
89 };
90
91 extern SMModel UTF8SMModel;
92 extern SMModel Big5SMModel;
93 extern SMModel EUCJPSMModel;
94 extern SMModel EUCKRSMModel;
95 extern SMModel EUCTWSMModel;
96 extern SMModel GB18030SMModel;
97 extern SMModel SJISSMModel;
98 extern SMModel UCS2BESMModel;
99
100
101 extern SMModel HZSMModel;
102 extern SMModel ISO2022CNSMModel;
103 extern SMModel ISO2022JPSMModel;
104 extern SMModel ISO2022KRSMModel;
105
106 #endif /* nsCodingStateMachine_h__ */
107
+0
-104
c/src/nsEUCJPProber.cpp less more
0 /* -*- Mode: C; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
1 /* ***** BEGIN LICENSE BLOCK *****
2 * Version: MPL 1.1/GPL 2.0/LGPL 2.1
3 *
4 * The contents of this file are subject to the Mozilla Public License Version
5 * 1.1 (the "License"); you may not use this file except in compliance with
6 * the License. You may obtain a copy of the License at
7 * http://www.mozilla.org/MPL/
8 *
9 * Software distributed under the License is distributed on an "AS IS" basis,
10 * WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License
11 * for the specific language governing rights and limitations under the
12 * License.
13 *
14 * The Original Code is mozilla.org code.
15 *
16 * The Initial Developer of the Original Code is
17 * Netscape Communications Corporation.
18 * Portions created by the Initial Developer are Copyright (C) 1998
19 * the Initial Developer. All Rights Reserved.
20 *
21 * Contributor(s):
22 *
23 * Alternatively, the contents of this file may be used under the terms of
24 * either the GNU General Public License Version 2 or later (the "GPL"), or
25 * the GNU Lesser General Public License Version 2.1 or later (the "LGPL"),
26 * in which case the provisions of the GPL or the LGPL are applicable instead
27 * of those above. If you wish to allow use of your version of this file only
28 * under the terms of either the GPL or the LGPL, and not to allow others to
29 * use your version of this file under the terms of the MPL, indicate your
30 * decision by deleting the provisions above and replace them with the notice
31 * and other provisions required by the GPL or the LGPL. If you do not delete
32 * the provisions above, a recipient may use your version of this file under
33 * the terms of any one of the MPL, the GPL or the LGPL.
34 *
35 * ***** END LICENSE BLOCK ***** */
36
37 // for japanese encoding, obeserve characteristic:
38 // 1, kana character (or hankaku?) often have hight frequency of appereance
39 // 2, kana character often exist in group
40 // 3, certain combination of kana is never used in japanese language
41
42 #include "nsEUCJPProber.h"
43
44 void nsEUCJPProber::Reset(void)
45 {
46 mCodingSM->Reset();
47 mState = eDetecting;
48 mContextAnalyser.Reset();
49 mDistributionAnalyser.Reset();
50 }
51
52 nsProbingState nsEUCJPProber::HandleData(const char* aBuf, PRUint32 aLen)
53 {
54 nsSMState codingState;
55
56 for (PRUint32 i = 0; i < aLen; i++)
57 {
58 codingState = mCodingSM->NextState(aBuf[i]);
59 if (codingState == eError)
60 {
61 mState = eNotMe;
62 break;
63 }
64 if (codingState == eItsMe)
65 {
66 mState = eFoundIt;
67 break;
68 }
69 if (codingState == eStart)
70 {
71 PRUint32 charLen = mCodingSM->GetCurrentCharLen();
72
73 if (i == 0)
74 {
75 mLastChar[1] = aBuf[0];
76 mContextAnalyser.HandleOneChar(mLastChar, charLen);
77 mDistributionAnalyser.HandleOneChar(mLastChar, charLen);
78 }
79 else
80 {
81 mContextAnalyser.HandleOneChar(aBuf+i-1, charLen);
82 mDistributionAnalyser.HandleOneChar(aBuf+i-1, charLen);
83 }
84 }
85 }
86
87 mLastChar[0] = aBuf[aLen-1];
88
89 if (mState == eDetecting)
90 if (mContextAnalyser.GotEnoughData() && GetConfidence() > SHORTCUT_THRESHOLD)
91 mState = eFoundIt;
92
93 return mState;
94 }
95
96 float nsEUCJPProber::GetConfidence(void)
97 {
98 float contxtCf = mContextAnalyser.GetConfidence();
99 float distribCf = mDistributionAnalyser.GetConfidence();
100
101 return (contxtCf > distribCf ? contxtCf : distribCf);
102 }
103
+0
-76
c/src/nsEUCJPProber.h less more
0 /* -*- Mode: C; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
1 /* ***** BEGIN LICENSE BLOCK *****
2 * Version: MPL 1.1/GPL 2.0/LGPL 2.1
3 *
4 * The contents of this file are subject to the Mozilla Public License Version
5 * 1.1 (the "License"); you may not use this file except in compliance with
6 * the License. You may obtain a copy of the License at
7 * http://www.mozilla.org/MPL/
8 *
9 * Software distributed under the License is distributed on an "AS IS" basis,
10 * WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License
11 * for the specific language governing rights and limitations under the
12 * License.
13 *
14 * The Original Code is mozilla.org code.
15 *
16 * The Initial Developer of the Original Code is
17 * Netscape Communications Corporation.
18 * Portions created by the Initial Developer are Copyright (C) 1998
19 * the Initial Developer. All Rights Reserved.
20 *
21 * Contributor(s):
22 *
23 * Alternatively, the contents of this file may be used under the terms of
24 * either the GNU General Public License Version 2 or later (the "GPL"), or
25 * the GNU Lesser General Public License Version 2.1 or later (the "LGPL"),
26 * in which case the provisions of the GPL or the LGPL are applicable instead
27 * of those above. If you wish to allow use of your version of this file only
28 * under the terms of either the GPL or the LGPL, and not to allow others to
29 * use your version of this file under the terms of the MPL, indicate your
30 * decision by deleting the provisions above and replace them with the notice
31 * and other provisions required by the GPL or the LGPL. If you do not delete
32 * the provisions above, a recipient may use your version of this file under
33 * the terms of any one of the MPL, the GPL or the LGPL.
34 *
35 * ***** END LICENSE BLOCK ***** */
36
37 // for S-JIS encoding, obeserve characteristic:
38 // 1, kana character (or hankaku?) often have hight frequency of appereance
39 // 2, kana character often exist in group
40 // 3, certain combination of kana is never used in japanese language
41
42 #ifndef nsEUCJPProber_h__
43 #define nsEUCJPProber_h__
44
45 #include "universalchardet.h"
46 #include "nsCharSetProber.h"
47 #include "nsCodingStateMachine.h"
48 #include "JpCntx.h"
49 #include "CharDistribution.h"
50
51 class nsEUCJPProber: public nsCharSetProber {
52 public:
53 nsEUCJPProber(void){mCodingSM = new nsCodingStateMachine(&EUCJPSMModel);
54 Reset();}
55 virtual ~nsEUCJPProber(void){delete mCodingSM;}
56 nsProbingState HandleData(const char* aBuf, PRUint32 aLen);
57 const char* GetCharSetName() {return CHARDET_ENCODING_EUC_JP;}
58 nsProbingState GetState(void) {return mState;}
59 void Reset(void);
60 float GetConfidence(void);
61 void SetOpion() {}
62
63 protected:
64 nsCodingStateMachine* mCodingSM;
65 nsProbingState mState;
66
67 EUCJPContextAnalysis mContextAnalyser;
68 EUCJPDistributionAnalysis mDistributionAnalyser;
69
70 char mLastChar[2];
71 };
72
73
74 #endif /* nsEUCJPProber_h__ */
75
+0
-96
c/src/nsEUCKRProber.cpp less more
0 /* -*- Mode: C; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
1 /* ***** BEGIN LICENSE BLOCK *****
2 * Version: MPL 1.1/GPL 2.0/LGPL 2.1
3 *
4 * The contents of this file are subject to the Mozilla Public License Version
5 * 1.1 (the "License"); you may not use this file except in compliance with
6 * the License. You may obtain a copy of the License at
7 * http://www.mozilla.org/MPL/
8 *
9 * Software distributed under the License is distributed on an "AS IS" basis,
10 * WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License
11 * for the specific language governing rights and limitations under the
12 * License.
13 *
14 * The Original Code is mozilla.org code.
15 *
16 * The Initial Developer of the Original Code is
17 * Netscape Communications Corporation.
18 * Portions created by the Initial Developer are Copyright (C) 1998
19 * the Initial Developer. All Rights Reserved.
20 *
21 * Contributor(s):
22 *
23 * Alternatively, the contents of this file may be used under the terms of
24 * either the GNU General Public License Version 2 or later (the "GPL"), or
25 * the GNU Lesser General Public License Version 2.1 or later (the "LGPL"),
26 * in which case the provisions of the GPL or the LGPL are applicable instead
27 * of those above. If you wish to allow use of your version of this file only
28 * under the terms of either the GPL or the LGPL, and not to allow others to
29 * use your version of this file under the terms of the MPL, indicate your
30 * decision by deleting the provisions above and replace them with the notice
31 * and other provisions required by the GPL or the LGPL. If you do not delete
32 * the provisions above, a recipient may use your version of this file under
33 * the terms of any one of the MPL, the GPL or the LGPL.
34 *
35 * ***** END LICENSE BLOCK ***** */
36
37 #include "nsEUCKRProber.h"
38
39 void nsEUCKRProber::Reset(void)
40 {
41 mCodingSM->Reset();
42 mState = eDetecting;
43 mDistributionAnalyser.Reset();
44 //mContextAnalyser.Reset();
45 }
46
47 nsProbingState nsEUCKRProber::HandleData(const char* aBuf, PRUint32 aLen)
48 {
49 nsSMState codingState;
50
51 for (PRUint32 i = 0; i < aLen; i++)
52 {
53 codingState = mCodingSM->NextState(aBuf[i]);
54 if (codingState == eError)
55 {
56 mState = eNotMe;
57 break;
58 }
59 if (codingState == eItsMe)
60 {
61 mState = eFoundIt;
62 break;
63 }
64 if (codingState == eStart)
65 {
66 PRUint32 charLen = mCodingSM->GetCurrentCharLen();
67
68 if (i == 0)
69 {
70 mLastChar[1] = aBuf[0];
71 mDistributionAnalyser.HandleOneChar(mLastChar, charLen);
72 }
73 else
74 mDistributionAnalyser.HandleOneChar(aBuf+i-1, charLen);
75 }
76 }
77
78 mLastChar[0] = aBuf[aLen-1];
79
80 if (mState == eDetecting)
81 if (mDistributionAnalyser.GotEnoughData() && GetConfidence() > SHORTCUT_THRESHOLD)
82 mState = eFoundIt;
83 // else
84 // mDistributionAnalyser.HandleData(aBuf, aLen);
85
86 return mState;
87 }
88
89 float nsEUCKRProber::GetConfidence(void)
90 {
91 float distribCf = mDistributionAnalyser.GetConfidence();
92
93 return (float)distribCf;
94 }
95
+0
-72
c/src/nsEUCKRProber.h less more
0 /* -*- Mode: C; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
1 /* ***** BEGIN LICENSE BLOCK *****
2 * Version: MPL 1.1/GPL 2.0/LGPL 2.1
3 *
4 * The contents of this file are subject to the Mozilla Public License Version
5 * 1.1 (the "License"); you may not use this file except in compliance with
6 * the License. You may obtain a copy of the License at
7 * http://www.mozilla.org/MPL/
8 *
9 * Software distributed under the License is distributed on an "AS IS" basis,
10 * WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License
11 * for the specific language governing rights and limitations under the
12 * License.
13 *
14 * The Original Code is mozilla.org code.
15 *
16 * The Initial Developer of the Original Code is
17 * Netscape Communications Corporation.
18 * Portions created by the Initial Developer are Copyright (C) 1998
19 * the Initial Developer. All Rights Reserved.
20 *
21 * Contributor(s):
22 *
23 * Alternatively, the contents of this file may be used under the terms of
24 * either the GNU General Public License Version 2 or later (the "GPL"), or
25 * the GNU Lesser General Public License Version 2.1 or later (the "LGPL"),
26 * in which case the provisions of the GPL or the LGPL are applicable instead
27 * of those above. If you wish to allow use of your version of this file only
28 * under the terms of either the GPL or the LGPL, and not to allow others to
29 * use your version of this file under the terms of the MPL, indicate your
30 * decision by deleting the provisions above and replace them with the notice
31 * and other provisions required by the GPL or the LGPL. If you do not delete
32 * the provisions above, a recipient may use your version of this file under
33 * the terms of any one of the MPL, the GPL or the LGPL.
34 *
35 * ***** END LICENSE BLOCK ***** */
36
37 #ifndef nsEUCKRProber_h__
38 #define nsEUCKRProber_h__
39
40 #include "universalchardet.h"
41 #include "nsCharSetProber.h"
42 #include "nsCodingStateMachine.h"
43 #include "CharDistribution.h"
44
45 class nsEUCKRProber: public nsCharSetProber {
46 public:
47 nsEUCKRProber(void){mCodingSM = new nsCodingStateMachine(&EUCKRSMModel);
48 Reset();}
49 virtual ~nsEUCKRProber(void){delete mCodingSM;}
50 nsProbingState HandleData(const char* aBuf, PRUint32 aLen);
51 const char* GetCharSetName() {return CHARDET_ENCODING_EUC_KR;}
52 nsProbingState GetState(void) {return mState;}
53 void Reset(void);
54 float GetConfidence(void);
55 void SetOpion() {}
56
57 protected:
58 void GetDistribution(PRUint32 aCharLen, const char* aStr);
59
60 nsCodingStateMachine* mCodingSM;
61 nsProbingState mState;
62
63 //EUCKRContextAnalysis mContextAnalyser;
64 EUCKRDistributionAnalysis mDistributionAnalyser;
65 char mLastChar[2];
66
67 };
68
69
70 #endif /* nsEUCKRProber_h__ */
71
+0
-96
c/src/nsEUCTWProber.cpp less more
0 /* -*- Mode: C; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
1 /* ***** BEGIN LICENSE BLOCK *****
2 * Version: MPL 1.1/GPL 2.0/LGPL 2.1
3 *
4 * The contents of this file are subject to the Mozilla Public License Version
5 * 1.1 (the "License"); you may not use this file except in compliance with
6 * the License. You may obtain a copy of the License at
7 * http://www.mozilla.org/MPL/
8 *
9 * Software distributed under the License is distributed on an "AS IS" basis,
10 * WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License
11 * for the specific language governing rights and limitations under the
12 * License.
13 *
14 * The Original Code is mozilla.org code.
15 *
16 * The Initial Developer of the Original Code is
17 * Netscape Communications Corporation.
18 * Portions created by the Initial Developer are Copyright (C) 1998
19 * the Initial Developer. All Rights Reserved.
20 *
21 * Contributor(s):
22 *
23 * Alternatively, the contents of this file may be used under the terms of
24 * either the GNU General Public License Version 2 or later (the "GPL"), or
25 * the GNU Lesser General Public License Version 2.1 or later (the "LGPL"),
26 * in which case the provisions of the GPL or the LGPL are applicable instead
27 * of those above. If you wish to allow use of your version of this file only
28 * under the terms of either the GPL or the LGPL, and not to allow others to
29 * use your version of this file under the terms of the MPL, indicate your
30 * decision by deleting the provisions above and replace them with the notice
31 * and other provisions required by the GPL or the LGPL. If you do not delete
32 * the provisions above, a recipient may use your version of this file under
33 * the terms of any one of the MPL, the GPL or the LGPL.
34 *
35 * ***** END LICENSE BLOCK ***** */
36
37 #include "nsEUCTWProber.h"
38
39 void nsEUCTWProber::Reset(void)
40 {
41 mCodingSM->Reset();
42 mState = eDetecting;
43 mDistributionAnalyser.Reset();
44 //mContextAnalyser.Reset();
45 }
46
47 nsProbingState nsEUCTWProber::HandleData(const char* aBuf, PRUint32 aLen)
48 {
49 nsSMState codingState;
50
51 for (PRUint32 i = 0; i < aLen; i++)
52 {
53 codingState = mCodingSM->NextState(aBuf[i]);
54 if (codingState == eError)
55 {
56 mState = eNotMe;
57 break;
58 }
59 if (codingState == eItsMe)
60 {
61 mState = eFoundIt;
62 break;
63 }
64 if (codingState == eStart)
65 {
66 PRUint32 charLen = mCodingSM->GetCurrentCharLen();
67
68 if (i == 0)
69 {
70 mLastChar[1] = aBuf[0];
71 mDistributionAnalyser.HandleOneChar(mLastChar, charLen);
72 }
73 else
74 mDistributionAnalyser.HandleOneChar(aBuf+i-1, charLen);
75 }
76 }
77
78 mLastChar[0] = aBuf[aLen-1];
79
80 if (mState == eDetecting)
81 if (mDistributionAnalyser.GotEnoughData() && GetConfidence() > SHORTCUT_THRESHOLD)
82 mState = eFoundIt;
83 // else
84 // mDistributionAnalyser.HandleData(aBuf, aLen);
85
86 return mState;
87 }
88
89 float nsEUCTWProber::GetConfidence(void)
90 {
91 float distribCf = mDistributionAnalyser.GetConfidence();
92
93 return (float)distribCf;
94 }
95
+0
-72
c/src/nsEUCTWProber.h less more
0 /* -*- Mode: C; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
1 /* ***** BEGIN LICENSE BLOCK *****
2 * Version: MPL 1.1/GPL 2.0/LGPL 2.1
3 *
4 * The contents of this file are subject to the Mozilla Public License Version
5 * 1.1 (the "License"); you may not use this file except in compliance with
6 * the License. You may obtain a copy of the License at
7 * http://www.mozilla.org/MPL/
8 *
9 * Software distributed under the License is distributed on an "AS IS" basis,
10 * WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License
11 * for the specific language governing rights and limitations under the
12 * License.
13 *
14 * The Original Code is mozilla.org code.
15 *
16 * The Initial Developer of the Original Code is
17 * Netscape Communications Corporation.
18 * Portions created by the Initial Developer are Copyright (C) 1998
19 * the Initial Developer. All Rights Reserved.
20 *
21 * Contributor(s):
22 *
23 * Alternatively, the contents of this file may be used under the terms of
24 * either the GNU General Public License Version 2 or later (the "GPL"), or
25 * the GNU Lesser General Public License Version 2.1 or later (the "LGPL"),
26 * in which case the provisions of the GPL or the LGPL are applicable instead
27 * of those above. If you wish to allow use of your version of this file only
28 * under the terms of either the GPL or the LGPL, and not to allow others to
29 * use your version of this file under the terms of the MPL, indicate your
30 * decision by deleting the provisions above and replace them with the notice
31 * and other provisions required by the GPL or the LGPL. If you do not delete
32 * the provisions above, a recipient may use your version of this file under
33 * the terms of any one of the MPL, the GPL or the LGPL.
34 *
35 * ***** END LICENSE BLOCK ***** */
36
37 #ifndef nsEUCTWProber_h__
38 #define nsEUCTWProber_h__
39
40 #include "universalchardet.h"
41 #include "nsCharSetProber.h"
42 #include "nsCodingStateMachine.h"
43 #include "CharDistribution.h"
44
45 class nsEUCTWProber: public nsCharSetProber {
46 public:
47 nsEUCTWProber(void){mCodingSM = new nsCodingStateMachine(&EUCTWSMModel);
48 Reset();}
49 virtual ~nsEUCTWProber(void){delete mCodingSM;}
50 nsProbingState HandleData(const char* aBuf, PRUint32 aLen);
51 const char* GetCharSetName() {return CHARDET_ENCODING_EUC_TW;}
52 nsProbingState GetState(void) {return mState;}
53 void Reset(void);
54 float GetConfidence(void);
55 void SetOpion() {}
56
57 protected:
58 void GetDistribution(PRUint32 aCharLen, const char* aStr);
59
60 nsCodingStateMachine* mCodingSM;
61 nsProbingState mState;
62
63 //EUCTWContextAnalysis mContextAnalyser;
64 EUCTWDistributionAnalysis mDistributionAnalyser;
65 char mLastChar[2];
66
67 };
68
69
70 #endif /* nsEUCTWProber_h__ */
71
+0
-107
c/src/nsEscCharsetProber.cpp less more
0 /* -*- Mode: C; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
1 /* ***** BEGIN LICENSE BLOCK *****
2 * Version: MPL 1.1/GPL 2.0/LGPL 2.1
3 *
4 * The contents of this file are subject to the Mozilla Public License Version
5 * 1.1 (the "License"); you may not use this file except in compliance with
6 * the License. You may obtain a copy of the License at
7 * http://www.mozilla.org/MPL/
8 *
9 * Software distributed under the License is distributed on an "AS IS" basis,
10 * WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License
11 * for the specific language governing rights and limitations under the
12 * License.
13 *
14 * The Original Code is mozilla.org code.
15 *
16 * The Initial Developer of the Original Code is
17 * Netscape Communications Corporation.
18 * Portions created by the Initial Developer are Copyright (C) 1998
19 * the Initial Developer. All Rights Reserved.
20 *
21 * Contributor(s):
22 *
23 * Alternatively, the contents of this file may be used under the terms of
24 * either the GNU General Public License Version 2 or later (the "GPL"), or
25 * the GNU Lesser General Public License Version 2.1 or later (the "LGPL"),
26 * in which case the provisions of the GPL or the LGPL are applicable instead
27 * of those above. If you wish to allow use of your version of this file only
28 * under the terms of either the GPL or the LGPL, and not to allow others to
29 * use your version of this file under the terms of the MPL, indicate your
30 * decision by deleting the provisions above and replace them with the notice
31 * and other provisions required by the GPL or the LGPL. If you do not delete
32 * the provisions above, a recipient may use your version of this file under
33 * the terms of any one of the MPL, the GPL or the LGPL.
34 *
35 * ***** END LICENSE BLOCK ***** */
36
37
38 #include "nsEscCharsetProber.h"
39
40 nsEscCharSetProber::nsEscCharSetProber(void)
41 {
42 mCodingSM[0] = new nsCodingStateMachine(&HZSMModel);
43 mCodingSM[1] = new nsCodingStateMachine(&ISO2022CNSMModel);
44 mCodingSM[2] = new nsCodingStateMachine(&ISO2022JPSMModel);
45 mCodingSM[3] = new nsCodingStateMachine(&ISO2022KRSMModel);
46 mActiveSM = NUM_OF_ESC_CHARSETS;
47 mState = eDetecting;
48 mDetectedCharset = nsnull;
49 }
50
51 nsEscCharSetProber::~nsEscCharSetProber(void)
52 {
53 for (PRUint32 i = 0; i < NUM_OF_ESC_CHARSETS; i++)
54 delete mCodingSM[i];
55 }
56
57 void nsEscCharSetProber::Reset(void)
58 {
59 mState = eDetecting;
60 for (PRUint32 i = 0; i < NUM_OF_ESC_CHARSETS; i++)
61 mCodingSM[i]->Reset();
62 mActiveSM = NUM_OF_ESC_CHARSETS;
63 mDetectedCharset = nsnull;
64 }
65
66 nsProbingState nsEscCharSetProber::HandleData(const char* aBuf, PRUint32 aLen)
67 {
68 nsSMState codingState;
69 PRInt32 j;
70 PRUint32 i;
71
72 for ( i = 0; i < aLen && mState == eDetecting; i++)
73 {
74 for (j = mActiveSM-1; j>= 0; j--)
75 {
76 //byte is feed to all active state machine
77 codingState = mCodingSM[j]->NextState(aBuf[i]);
78 if (codingState == eError)
79 {
80 //got negative answer for this state machine, make it inactive
81 mActiveSM--;
82 if (mActiveSM == 0)
83 {
84 mState = eNotMe;
85 return mState;
86 }
87 else if (j != (PRInt32)mActiveSM)
88 {
89 nsCodingStateMachine* t;
90 t = mCodingSM[mActiveSM];
91 mCodingSM[mActiveSM] = mCodingSM[j];
92 mCodingSM[j] = t;
93 }
94 }
95 else if (codingState == eItsMe)
96 {
97 mState = eFoundIt;
98 mDetectedCharset = mCodingSM[j]->GetCodingStateMachine();
99 return mState;
100 }
101 }
102 }
103
104 return mState;
105 }
106
+0
-67
c/src/nsEscCharsetProber.h less more
0 /* -*- Mode: C; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
1 /* ***** BEGIN LICENSE BLOCK *****
2 * Version: MPL 1.1/GPL 2.0/LGPL 2.1
3 *
4 * The contents of this file are subject to the Mozilla Public License Version
5 * 1.1 (the "License"); you may not use this file except in compliance with
6 * the License. You may obtain a copy of the License at
7 * http://www.mozilla.org/MPL/
8 *
9 * Software distributed under the License is distributed on an "AS IS" basis,
10 * WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License
11 * for the specific language governing rights and limitations under the
12 * License.
13 *
14 * The Original Code is mozilla.org code.
15 *
16 * The Initial Developer of the Original Code is
17 * Netscape Communications Corporation.
18 * Portions created by the Initial Developer are Copyright (C) 1998
19 * the Initial Developer. All Rights Reserved.
20 *
21 * Contributor(s):
22 *
23 * Alternatively, the contents of this file may be used under the terms of
24 * either the GNU General Public License Version 2 or later (the "GPL"), or
25 * the GNU Lesser General Public License Version 2.1 or later (the "LGPL"),
26 * in which case the provisions of the GPL or the LGPL are applicable instead
27 * of those above. If you wish to allow use of your version of this file only
28 * under the terms of either the GPL or the LGPL, and not to allow others to
29 * use your version of this file under the terms of the MPL, indicate your
30 * decision by deleting the provisions above and replace them with the notice
31 * and other provisions required by the GPL or the LGPL. If you do not delete
32 * the provisions above, a recipient may use your version of this file under
33 * the terms of any one of the MPL, the GPL or the LGPL.
34 *
35 * ***** END LICENSE BLOCK ***** */
36
37 #ifndef nsEscCharSetProber_h__
38 #define nsEscCharSetProber_h__
39
40 #include "nsCharSetProber.h"
41 #include "nsCodingStateMachine.h"
42
43 #define NUM_OF_ESC_CHARSETS 4
44
45 class nsEscCharSetProber: public nsCharSetProber {
46 public:
47 nsEscCharSetProber(void);
48 virtual ~nsEscCharSetProber(void);
49 nsProbingState HandleData(const char* aBuf, PRUint32 aLen);
50 const char* GetCharSetName() {return mDetectedCharset;}
51 nsProbingState GetState(void) {return mState;}
52 void Reset(void);
53 float GetConfidence(void){return (float)0.99;}
54 void SetOpion() {}
55
56 protected:
57 void GetDistribution(PRUint32 aCharLen, const char* aStr);
58
59 nsCodingStateMachine* mCodingSM[NUM_OF_ESC_CHARSETS] ;
60 PRUint32 mActiveSM;
61 nsProbingState mState;
62 const char * mDetectedCharset;
63 };
64
65 #endif /* nsEscCharSetProber_h__ */
66
+0
-265
c/src/nsEscSM.cpp less more
0 /* -*- Mode: C; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
1 /* ***** BEGIN LICENSE BLOCK *****
2 * Version: MPL 1.1/GPL 2.0/LGPL 2.1
3 *
4 * The contents of this file are subject to the Mozilla Public License Version
5 * 1.1 (the "License"); you may not use this file except in compliance with
6 * the License. You may obtain a copy of the License at
7 * http://www.mozilla.org/MPL/
8 *
9 * Software distributed under the License is distributed on an "AS IS" basis,
10 * WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License
11 * for the specific language governing rights and limitations under the
12 * License.
13 *
14 * The Original Code is mozilla.org code.
15 *
16 * The Initial Developer of the Original Code is
17 * Netscape Communications Corporation.
18 * Portions created by the Initial Developer are Copyright (C) 1998
19 * the Initial Developer. All Rights Reserved.
20 *
21 * Contributor(s):
22 * Kazutoshi Satoda
23 *
24 * Alternatively, the contents of this file may be used under the terms of
25 * either the GNU General Public License Version 2 or later (the "GPL"), or
26 * the GNU Lesser General Public License Version 2.1 or later (the "LGPL"),
27 * in which case the provisions of the GPL or the LGPL are applicable instead
28 * of those above. If you wish to allow use of your version of this file only
29 * under the terms of either the GPL or the LGPL, and not to allow others to
30 * use your version of this file under the terms of the MPL, indicate your
31 * decision by deleting the provisions above and replace them with the notice
32 * and other provisions required by the GPL or the LGPL. If you do not delete
33 * the provisions above, a recipient may use your version of this file under
34 * the terms of any one of the MPL, the GPL or the LGPL.
35 *
36 * ***** END LICENSE BLOCK ***** */
37 #include "universalchardet.h"
38 #include "nsCodingStateMachine.h"
39
40 static PRUint32 HZ_cls[ 256 / 8 ] = {
41 PCK4BITS(1,0,0,0,0,0,0,0), // 00 - 07
42 PCK4BITS(0,0,0,0,0,0,0,0), // 08 - 0f
43 PCK4BITS(0,0,0,0,0,0,0,0), // 10 - 17
44 PCK4BITS(0,0,0,1,0,0,0,0), // 18 - 1f
45 PCK4BITS(0,0,0,0,0,0,0,0), // 20 - 27
46 PCK4BITS(0,0,0,0,0,0,0,0), // 28 - 2f
47 PCK4BITS(0,0,0,0,0,0,0,0), // 30 - 37
48 PCK4BITS(0,0,0,0,0,0,0,0), // 38 - 3f
49 PCK4BITS(0,0,0,0,0,0,0,0), // 40 - 47
50 PCK4BITS(0,0,0,0,0,0,0,0), // 48 - 4f
51 PCK4BITS(0,0,0,0,0,0,0,0), // 50 - 57
52 PCK4BITS(0,0,0,0,0,0,0,0), // 58 - 5f
53 PCK4BITS(0,0,0,0,0,0,0,0), // 60 - 67
54 PCK4BITS(0,0,0,0,0,0,0,0), // 68 - 6f
55 PCK4BITS(0,0,0,0,0,0,0,0), // 70 - 77
56 PCK4BITS(0,0,0,4,0,5,2,0), // 78 - 7f
57 PCK4BITS(1,1,1,1,1,1,1,1), // 80 - 87
58 PCK4BITS(1,1,1,1,1,1,1,1), // 88 - 8f
59 PCK4BITS(1,1,1,1,1,1,1,1), // 90 - 97
60 PCK4BITS(1,1,1,1,1,1,1,1), // 98 - 9f
61 PCK4BITS(1,1,1,1,1,1,1,1), // a0 - a7
62 PCK4BITS(1,1,1,1,1,1,1,1), // a8 - af
63 PCK4BITS(1,1,1,1,1,1,1,1), // b0 - b7
64 PCK4BITS(1,1,1,1,1,1,1,1), // b8 - bf
65 PCK4BITS(1,1,1,1,1,1,1,1), // c0 - c7
66 PCK4BITS(1,1,1,1,1,1,1,1), // c8 - cf
67 PCK4BITS(1,1,1,1,1,1,1,1), // d0 - d7
68 PCK4BITS(1,1,1,1,1,1,1,1), // d8 - df
69 PCK4BITS(1,1,1,1,1,1,1,1), // e0 - e7
70 PCK4BITS(1,1,1,1,1,1,1,1), // e8 - ef
71 PCK4BITS(1,1,1,1,1,1,1,1), // f0 - f7
72 PCK4BITS(1,1,1,1,1,1,1,1) // f8 - ff
73 };
74
75
76 static PRUint32 HZ_st [ 6] = {
77 PCK4BITS(eStart,eError, 3,eStart,eStart,eStart,eError,eError),//00-07
78 PCK4BITS(eError,eError,eError,eError,eItsMe,eItsMe,eItsMe,eItsMe),//08-0f
79 PCK4BITS(eItsMe,eItsMe,eError,eError,eStart,eStart, 4,eError),//10-17
80 PCK4BITS( 5,eError, 6,eError, 5, 5, 4,eError),//18-1f
81 PCK4BITS( 4,eError, 4, 4, 4,eError, 4,eError),//20-27
82 PCK4BITS( 4,eItsMe,eStart,eStart,eStart,eStart,eStart,eStart) //28-2f
83 };
84
85 static const PRUint32 HZCharLenTable[] = {0, 0, 0, 0, 0, 0};
86
87 SMModel HZSMModel = {
88 {eIdxSft4bits, eSftMsk4bits, eBitSft4bits, eUnitMsk4bits, HZ_cls },
89 6,
90 {eIdxSft4bits, eSftMsk4bits, eBitSft4bits, eUnitMsk4bits, HZ_st },
91 HZCharLenTable,
92 CHARDET_ENCODING_HZ_GB_2312,
93 };
94
95
96 static PRUint32 ISO2022CN_cls [ 256 / 8 ] = {
97 PCK4BITS(2,0,0,0,0,0,0,0), // 00 - 07
98 PCK4BITS(0,0,0,0,0,0,0,0), // 08 - 0f
99 PCK4BITS(0,0,0,0,0,0,0,0), // 10 - 17
100 PCK4BITS(0,0,0,1,0,0,0,0), // 18 - 1f
101 PCK4BITS(0,0,0,0,0,0,0,0), // 20 - 27
102 PCK4BITS(0,3,0,0,0,0,0,0), // 28 - 2f
103 PCK4BITS(0,0,0,0,0,0,0,0), // 30 - 37
104 PCK4BITS(0,0,0,0,0,0,0,0), // 38 - 3f
105 PCK4BITS(0,0,0,4,0,0,0,0), // 40 - 47
106 PCK4BITS(0,0,0,0,0,0,0,0), // 48 - 4f
107 PCK4BITS(0,0,0,0,0,0,0,0), // 50 - 57
108 PCK4BITS(0,0,0,0,0,0,0,0), // 58 - 5f
109 PCK4BITS(0,0,0,0,0,0,0,0), // 60 - 67
110 PCK4BITS(0,0,0,0,0,0,0,0), // 68 - 6f
111 PCK4BITS(0,0,0,0,0,0,0,0), // 70 - 77
112 PCK4BITS(0,0,0,0,0,0,0,0), // 78 - 7f
113 PCK4BITS(2,2,2,2,2,2,2,2), // 80 - 87
114 PCK4BITS(2,2,2,2,2,2,2,2), // 88 - 8f
115 PCK4BITS(2,2,2,2,2,2,2,2), // 90 - 97
116 PCK4BITS(2,2,2,2,2,2,2,2), // 98 - 9f
117 PCK4BITS(2,2,2,2,2,2,2,2), // a0 - a7
118 PCK4BITS(2,2,2,2,2,2,2,2), // a8 - af
119 PCK4BITS(2,2,2,2,2,2,2,2), // b0 - b7
120 PCK4BITS(2,2,2,2,2,2,2,2), // b8 - bf
121 PCK4BITS(2,2,2,2,2,2,2,2), // c0 - c7
122 PCK4BITS(2,2,2,2,2,2,2,2), // c8 - cf
123 PCK4BITS(2,2,2,2,2,2,2,2), // d0 - d7
124 PCK4BITS(2,2,2,2,2,2,2,2), // d8 - df
125 PCK4BITS(2,2,2,2,2,2,2,2), // e0 - e7
126 PCK4BITS(2,2,2,2,2,2,2,2), // e8 - ef
127 PCK4BITS(2,2,2,2,2,2,2,2), // f0 - f7
128 PCK4BITS(2,2,2,2,2,2,2,2) // f8 - ff
129 };
130
131
132 static PRUint32 ISO2022CN_st [ 8] = {
133 PCK4BITS(eStart, 3,eError,eStart,eStart,eStart,eStart,eStart),//00-07
134 PCK4BITS(eStart,eError,eError,eError,eError,eError,eError,eError),//08-0f
135 PCK4BITS(eError,eError,eItsMe,eItsMe,eItsMe,eItsMe,eItsMe,eItsMe),//10-17
136 PCK4BITS(eItsMe,eItsMe,eItsMe,eError,eError,eError, 4,eError),//18-1f
137 PCK4BITS(eError,eError,eError,eItsMe,eError,eError,eError,eError),//20-27
138 PCK4BITS( 5, 6,eError,eError,eError,eError,eError,eError),//28-2f
139 PCK4BITS(eError,eError,eError,eItsMe,eError,eError,eError,eError),//30-37
140 PCK4BITS(eError,eError,eError,eError,eError,eItsMe,eError,eStart) //38-3f
141 };
142
143 static const PRUint32 ISO2022CNCharLenTable[] = {0, 0, 0, 0, 0, 0, 0, 0, 0};
144
145 SMModel ISO2022CNSMModel = {
146 {eIdxSft4bits, eSftMsk4bits, eBitSft4bits, eUnitMsk4bits, ISO2022CN_cls },
147 9,
148 {eIdxSft4bits, eSftMsk4bits, eBitSft4bits, eUnitMsk4bits, ISO2022CN_st },
149 ISO2022CNCharLenTable,
150 CHARDET_ENCODING_ISO_2022_CN,
151 };
152
153 static PRUint32 ISO2022JP_cls [ 256 / 8 ] = {
154 PCK4BITS(2,0,0,0,0,0,0,0), // 00 - 07
155 PCK4BITS(0,0,0,0,0,0,2,2), // 08 - 0f
156 PCK4BITS(0,0,0,0,0,0,0,0), // 10 - 17
157 PCK4BITS(0,0,0,1,0,0,0,0), // 18 - 1f
158 PCK4BITS(0,0,0,0,7,0,0,0), // 20 - 27
159 PCK4BITS(3,0,0,0,0,0,0,0), // 28 - 2f
160 PCK4BITS(0,0,0,0,0,0,0,0), // 30 - 37
161 PCK4BITS(0,0,0,0,0,0,0,0), // 38 - 3f
162 PCK4BITS(6,0,4,0,8,0,0,0), // 40 - 47
163 PCK4BITS(0,9,5,0,0,0,0,0), // 48 - 4f
164 PCK4BITS(0,0,0,0,0,0,0,0), // 50 - 57
165 PCK4BITS(0,0,0,0,0,0,0,0), // 58 - 5f
166 PCK4BITS(0,0,0,0,0,0,0,0), // 60 - 67
167 PCK4BITS(0,0,0,0,0,0,0,0), // 68 - 6f
168 PCK4BITS(0,0,0,0,0,0,0,0), // 70 - 77
169 PCK4BITS(0,0,0,0,0,0,0,0), // 78 - 7f
170 PCK4BITS(2,2,2,2,2,2,2,2), // 80 - 87
171 PCK4BITS(2,2,2,2,2,2,2,2), // 88 - 8f
172 PCK4BITS(2,2,2,2,2,2,2,2), // 90 - 97
173 PCK4BITS(2,2,2,2,2,2,2,2), // 98 - 9f
174 PCK4BITS(2,2,2,2,2,2,2,2), // a0 - a7
175 PCK4BITS(2,2,2,2,2,2,2,2), // a8 - af
176 PCK4BITS(2,2,2,2,2,2,2,2), // b0 - b7
177 PCK4BITS(2,2,2,2,2,2,2,2), // b8 - bf
178 PCK4BITS(2,2,2,2,2,2,2,2), // c0 - c7
179 PCK4BITS(2,2,2,2,2,2,2,2), // c8 - cf
180 PCK4BITS(2,2,2,2,2,2,2,2), // d0 - d7
181 PCK4BITS(2,2,2,2,2,2,2,2), // d8 - df
182 PCK4BITS(2,2,2,2,2,2,2,2), // e0 - e7
183 PCK4BITS(2,2,2,2,2,2,2,2), // e8 - ef
184 PCK4BITS(2,2,2,2,2,2,2,2), // f0 - f7
185 PCK4BITS(2,2,2,2,2,2,2,2) // f8 - ff
186 };
187
188
189 static PRUint32 ISO2022JP_st [ 9] = {
190 PCK4BITS(eStart, 3,eError,eStart,eStart,eStart,eStart,eStart),//00-07
191 PCK4BITS(eStart,eStart,eError,eError,eError,eError,eError,eError),//08-0f
192 PCK4BITS(eError,eError,eError,eError,eItsMe,eItsMe,eItsMe,eItsMe),//10-17
193 PCK4BITS(eItsMe,eItsMe,eItsMe,eItsMe,eItsMe,eItsMe,eError,eError),//18-1f
194 PCK4BITS(eError, 5,eError,eError,eError, 4,eError,eError),//20-27
195 PCK4BITS(eError,eError,eError, 6,eItsMe,eError,eItsMe,eError),//28-2f
196 PCK4BITS(eError,eError,eError,eError,eError,eError,eItsMe,eItsMe),//30-37
197 PCK4BITS(eError,eError,eError,eItsMe,eError,eError,eError,eError),//38-3f
198 PCK4BITS(eError,eError,eError,eError,eItsMe,eError,eStart,eStart) //40-47
199 };
200
201 static const PRUint32 ISO2022JPCharLenTable[] = {0, 0, 0, 0, 0, 0, 0, 0, 0, 0};
202
203 SMModel ISO2022JPSMModel = {
204 {eIdxSft4bits, eSftMsk4bits, eBitSft4bits, eUnitMsk4bits, ISO2022JP_cls },
205 10,
206 {eIdxSft4bits, eSftMsk4bits, eBitSft4bits, eUnitMsk4bits, ISO2022JP_st },
207 ISO2022JPCharLenTable,
208 CHARDET_ENCODING_ISO_2022_JP,
209 };
210
211 static PRUint32 ISO2022KR_cls [ 256 / 8 ] = {
212 PCK4BITS(2,0,0,0,0,0,0,0), // 00 - 07
213 PCK4BITS(0,0,0,0,0,0,0,0), // 08 - 0f
214 PCK4BITS(0,0,0,0,0,0,0,0), // 10 - 17
215 PCK4BITS(0,0,0,1,0,0,0,0), // 18 - 1f
216 PCK4BITS(0,0,0,0,3,0,0,0), // 20 - 27
217 PCK4BITS(0,4,0,0,0,0,0,0), // 28 - 2f
218 PCK4BITS(0,0,0,0,0,0,0,0), // 30 - 37
219 PCK4BITS(0,0,0,0,0,0,0,0), // 38 - 3f
220 PCK4BITS(0,0,0,5,0,0,0,0), // 40 - 47
221 PCK4BITS(0,0,0,0,0,0,0,0), // 48 - 4f
222 PCK4BITS(0,0,0,0,0,0,0,0), // 50 - 57
223 PCK4BITS(0,0,0,0,0,0,0,0), // 58 - 5f
224 PCK4BITS(0,0,0,0,0,0,0,0), // 60 - 67
225 PCK4BITS(0,0,0,0,0,0,0,0), // 68 - 6f
226 PCK4BITS(0,0,0,0,0,0,0,0), // 70 - 77
227 PCK4BITS(0,0,0,0,0,0,0,0), // 78 - 7f
228 PCK4BITS(2,2,2,2,2,2,2,2), // 80 - 87
229 PCK4BITS(2,2,2,2,2,2,2,2), // 88 - 8f
230 PCK4BITS(2,2,2,2,2,2,2,2), // 90 - 97
231 PCK4BITS(2,2,2,2,2,2,2,2), // 98 - 9f
232 PCK4BITS(2,2,2,2,2,2,2,2), // a0 - a7
233 PCK4BITS(2,2,2,2,2,2,2,2), // a8 - af
234 PCK4BITS(2,2,2,2,2,2,2,2), // b0 - b7
235 PCK4BITS(2,2,2,2,2,2,2,2), // b8 - bf
236 PCK4BITS(2,2,2,2,2,2,2,2), // c0 - c7
237 PCK4BITS(2,2,2,2,2,2,2,2), // c8 - cf
238 PCK4BITS(2,2,2,2,2,2,2,2), // d0 - d7
239 PCK4BITS(2,2,2,2,2,2,2,2), // d8 - df
240 PCK4BITS(2,2,2,2,2,2,2,2), // e0 - e7
241 PCK4BITS(2,2,2,2,2,2,2,2), // e8 - ef
242 PCK4BITS(2,2,2,2,2,2,2,2), // f0 - f7
243 PCK4BITS(2,2,2,2,2,2,2,2) // f8 - ff
244 };
245
246
247 static PRUint32 ISO2022KR_st [ 5] = {
248 PCK4BITS(eStart, 3,eError,eStart,eStart,eStart,eError,eError),//00-07
249 PCK4BITS(eError,eError,eError,eError,eItsMe,eItsMe,eItsMe,eItsMe),//08-0f
250 PCK4BITS(eItsMe,eItsMe,eError,eError,eError, 4,eError,eError),//10-17
251 PCK4BITS(eError,eError,eError,eError, 5,eError,eError,eError),//18-1f
252 PCK4BITS(eError,eError,eError,eItsMe,eStart,eStart,eStart,eStart) //20-27
253 };
254
255 static const PRUint32 ISO2022KRCharLenTable[] = {0, 0, 0, 0, 0, 0};
256
257 SMModel ISO2022KRSMModel = {
258 {eIdxSft4bits, eSftMsk4bits, eBitSft4bits, eUnitMsk4bits, ISO2022KR_cls },
259 6,
260 {eIdxSft4bits, eSftMsk4bits, eBitSft4bits, eUnitMsk4bits, ISO2022KR_st },
261 ISO2022KRCharLenTable,
262 CHARDET_ENCODING_ISO_2022_KR,
263 };
264
+0
-101
c/src/nsGB2312Prober.cpp less more
0 /* -*- Mode: C; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
1 /* ***** BEGIN LICENSE BLOCK *****
2 * Version: MPL 1.1/GPL 2.0/LGPL 2.1
3 *
4 * The contents of this file are subject to the Mozilla Public License Version
5 * 1.1 (the "License"); you may not use this file except in compliance with
6 * the License. You may obtain a copy of the License at
7 * http://www.mozilla.org/MPL/
8 *
9 * Software distributed under the License is distributed on an "AS IS" basis,
10 * WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License
11 * for the specific language governing rights and limitations under the
12 * License.
13 *
14 * The Original Code is mozilla.org code.
15 *
16 * The Initial Developer of the Original Code is
17 * Netscape Communications Corporation.
18 * Portions created by the Initial Developer are Copyright (C) 1998
19 * the Initial Developer. All Rights Reserved.
20 *
21 * Contributor(s):
22 *
23 * Alternatively, the contents of this file may be used under the terms of
24 * either the GNU General Public License Version 2 or later (the "GPL"), or
25 * the GNU Lesser General Public License Version 2.1 or later (the "LGPL"),
26 * in which case the provisions of the GPL or the LGPL are applicable instead
27 * of those above. If you wish to allow use of your version of this file only
28 * under the terms of either the GPL or the LGPL, and not to allow others to
29 * use your version of this file under the terms of the MPL, indicate your
30 * decision by deleting the provisions above and replace them with the notice
31 * and other provisions required by the GPL or the LGPL. If you do not delete
32 * the provisions above, a recipient may use your version of this file under
33 * the terms of any one of the MPL, the GPL or the LGPL.
34 *
35 * ***** END LICENSE BLOCK ***** */
36
37 // for S-JIS encoding, obeserve characteristic:
38 // 1, kana character (or hankaku?) often have hight frequency of appereance
39 // 2, kana character often exist in group
40 // 3, certain combination of kana is never used in japanese language
41
42 #include "nsGB2312Prober.h"
43
44 void nsGB18030Prober::Reset(void)
45 {
46 mCodingSM->Reset();
47 mState = eDetecting;
48 mDistributionAnalyser.Reset();
49 //mContextAnalyser.Reset();
50 }
51
52 nsProbingState nsGB18030Prober::HandleData(const char* aBuf, PRUint32 aLen)
53 {
54 nsSMState codingState;
55
56 for (PRUint32 i = 0; i < aLen; i++)
57 {
58 codingState = mCodingSM->NextState(aBuf[i]);
59 if (codingState == eError)
60 {
61 mState = eNotMe;
62 break;
63 }
64 if (codingState == eItsMe)
65 {
66 mState = eFoundIt;
67 break;
68 }
69 if (codingState == eStart)
70 {
71 PRUint32 charLen = mCodingSM->GetCurrentCharLen();
72
73 if (i == 0)
74 {
75 mLastChar[1] = aBuf[0];
76 mDistributionAnalyser.HandleOneChar(mLastChar, charLen);
77 }
78 else
79 mDistributionAnalyser.HandleOneChar(aBuf+i-1, charLen);
80 }
81 }
82
83 mLastChar[0] = aBuf[aLen-1];
84
85 if (mState == eDetecting)
86 if (mDistributionAnalyser.GotEnoughData() && GetConfidence() > SHORTCUT_THRESHOLD)
87 mState = eFoundIt;
88 // else
89 // mDistributionAnalyser.HandleData(aBuf, aLen);
90
91 return mState;
92 }
93
94 float nsGB18030Prober::GetConfidence(void)
95 {
96 float distribCf = mDistributionAnalyser.GetConfidence();
97
98 return (float)distribCf;
99 }
100
+0
-74
c/src/nsGB2312Prober.h less more
0 /* -*- Mode: C; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
1 /* ***** BEGIN LICENSE BLOCK *****
2 * Version: MPL 1.1/GPL 2.0/LGPL 2.1
3 *
4 * The contents of this file are subject to the Mozilla Public License Version
5 * 1.1 (the "License"); you may not use this file except in compliance with
6 * the License. You may obtain a copy of the License at
7 * http://www.mozilla.org/MPL/
8 *
9 * Software distributed under the License is distributed on an "AS IS" basis,
10 * WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License
11 * for the specific language governing rights and limitations under the
12 * License.
13 *
14 * The Original Code is mozilla.org code.
15 *
16 * The Initial Developer of the Original Code is
17 * Netscape Communications Corporation.
18 * Portions created by the Initial Developer are Copyright (C) 1998
19 * the Initial Developer. All Rights Reserved.
20 *
21 * Contributor(s):
22 *
23 * Alternatively, the contents of this file may be used under the terms of
24 * either the GNU General Public License Version 2 or later (the "GPL"), or
25 * the GNU Lesser General Public License Version 2.1 or later (the "LGPL"),
26 * in which case the provisions of the GPL or the LGPL are applicable instead
27 * of those above. If you wish to allow use of your version of this file only
28 * under the terms of either the GPL or the LGPL, and not to allow others to
29 * use your version of this file under the terms of the MPL, indicate your
30 * decision by deleting the provisions above and replace them with the notice
31 * and other provisions required by the GPL or the LGPL. If you do not delete
32 * the provisions above, a recipient may use your version of this file under
33 * the terms of any one of the MPL, the GPL or the LGPL.
34 *
35 * ***** END LICENSE BLOCK ***** */
36
37 #ifndef nsGB2312Prober_h__
38 #define nsGB2312Prober_h__
39
40 #include "universalchardet.h"
41 #include "nsCharSetProber.h"
42 #include "nsCodingStateMachine.h"
43 #include "CharDistribution.h"
44
45 // We use gb18030 to replace gb2312, because 18030 is a superset.
46
47 class nsGB18030Prober: public nsCharSetProber {
48 public:
49 nsGB18030Prober(void){mCodingSM = new nsCodingStateMachine(&GB18030SMModel);
50 Reset();}
51 virtual ~nsGB18030Prober(void){delete mCodingSM;}
52 nsProbingState HandleData(const char* aBuf, PRUint32 aLen);
53 const char* GetCharSetName() {return CHARDET_ENCODING_GB18030;}
54 nsProbingState GetState(void) {return mState;}
55 void Reset(void);
56 float GetConfidence(void);
57 void SetOpion() {}
58
59 protected:
60 void GetDistribution(PRUint32 aCharLen, const char* aStr);
61
62 nsCodingStateMachine* mCodingSM;
63 nsProbingState mState;
64
65 //GB2312ContextAnalysis mContextAnalyser;
66 GB2312DistributionAnalysis mDistributionAnalyser;
67 char mLastChar[2];
68
69 };
70
71
72 #endif /* nsGB2312Prober_h__ */
73
+0
-195
c/src/nsHebrewProber.cpp less more
0 /* -*- Mode: C; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
1 /* ***** BEGIN LICENSE BLOCK *****
2 * Version: MPL 1.1/GPL 2.0/LGPL 2.1
3 *
4 * The contents of this file are subject to the Mozilla Public License Version
5 * 1.1 (the "License"); you may not use this file except in compliance with
6 * the License. You may obtain a copy of the License at
7 * http://www.mozilla.org/MPL/
8 *
9 * Software distributed under the License is distributed on an "AS IS" basis,
10 * WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License
11 * for the specific language governing rights and limitations under the
12 * License.
13 *
14 * The Original Code is Mozilla Universal charset detector code.
15 *
16 * The Initial Developer of the Original Code is
17 * Shy Shalom <shooshX@gmail.com>
18 * Portions created by the Initial Developer are Copyright (C) 2005
19 * the Initial Developer. All Rights Reserved.
20 *
21 * Contributor(s):
22 *
23 * Alternatively, the contents of this file may be used under the terms of
24 * either the GNU General Public License Version 2 or later (the "GPL"), or
25 * the GNU Lesser General Public License Version 2.1 or later (the "LGPL"),
26 * in which case the provisions of the GPL or the LGPL are applicable instead
27 * of those above. If you wish to allow use of your version of this file only
28 * under the terms of either the GPL or the LGPL, and not to allow others to
29 * use your version of this file under the terms of the MPL, indicate your
30 * decision by deleting the provisions above and replace them with the notice
31 * and other provisions required by the GPL or the LGPL. If you do not delete
32 * the provisions above, a recipient may use your version of this file under
33 * the terms of any one of the MPL, the GPL or the LGPL.
34 *
35 * ***** END LICENSE BLOCK ***** */
36
37 #include "universalchardet.h"
38 #include "nsHebrewProber.h"
39 #include <stdio.h>
40
41 // windows-1255 / ISO-8859-8 code points of interest
42 #define FINAL_KAF ('\xea')
43 #define NORMAL_KAF ('\xeb')
44 #define FINAL_MEM ('\xed')
45 #define NORMAL_MEM ('\xee')
46 #define FINAL_NUN ('\xef')
47 #define NORMAL_NUN ('\xf0')
48 #define FINAL_PE ('\xf3')
49 #define NORMAL_PE ('\xf4')
50 #define FINAL_TSADI ('\xf5')
51 #define NORMAL_TSADI ('\xf6')
52
53 // Minimum Visual vs Logical final letter score difference.
54 // If the difference is below this, don't rely solely on the final letter score distance.
55 #define MIN_FINAL_CHAR_DISTANCE (5)
56
57 // Minimum Visual vs Logical model score difference.
58 // If the difference is below this, don't rely at all on the model score distance.
59 #define MIN_MODEL_DISTANCE (0.01)
60
61 #define VISUAL_HEBREW_NAME (CHARDET_ENCODING_ISO_8859_8)
62 #define LOGICAL_HEBREW_NAME (CHARDET_ENCODING_WINDOWS_1255)
63
64 PRBool nsHebrewProber::isFinal(char c)
65 {
66 return ((c == FINAL_KAF) || (c == FINAL_MEM) || (c == FINAL_NUN) || (c == FINAL_PE) || (c == FINAL_TSADI));
67 }
68
69 PRBool nsHebrewProber::isNonFinal(char c)
70 {
71 return ((c == NORMAL_KAF) || (c == NORMAL_MEM) || (c == NORMAL_NUN) || (c == NORMAL_PE));
72 // The normal Tsadi is not a good Non-Final letter due to words like
73 // 'lechotet' (to chat) containing an apostrophe after the tsadi. This
74 // apostrophe is converted to a space in FilterWithoutEnglishLetters causing
75 // the Non-Final tsadi to appear at an end of a word even though this is not
76 // the case in the original text.
77 // The letters Pe and Kaf rarely display a related behavior of not being a
78 // good Non-Final letter. Words like 'Pop', 'Winamp' and 'Mubarak' for
79 // example legally end with a Non-Final Pe or Kaf. However, the benefit of
80 // these letters as Non-Final letters outweighs the damage since these words
81 // are quite rare.
82 }
83
84 /** HandleData
85 * Final letter analysis for logical-visual decision.
86 * Look for evidence that the received buffer is either logical Hebrew or
87 * visual Hebrew.
88 * The following cases are checked:
89 * 1) A word longer than 1 letter, ending with a final letter. This is an
90 * indication that the text is laid out "naturally" since the final letter
91 * really appears at the end. +1 for logical score.
92 * 2) A word longer than 1 letter, ending with a Non-Final letter. In normal
93 * Hebrew, words ending with Kaf, Mem, Nun, Pe or Tsadi, should not end with
94 * the Non-Final form of that letter. Exceptions to this rule are mentioned
95 * above in isNonFinal(). This is an indication that the text is laid out
96 * backwards. +1 for visual score
97 * 3) A word longer than 1 letter, starting with a final letter. Final letters
98 * should not appear at the beginning of a word. This is an indication that
99 * the text is laid out backwards. +1 for visual score.
100 *
101 * The visual score and logical score are accumulated throughout the text and
102 * are finally checked against each other in GetCharSetName().
103 * No checking for final letters in the middle of words is done since that case
104 * is not an indication for either Logical or Visual text.
105 *
106 * The input buffer should not contain any white spaces that are not (' ')
107 * or any low-ascii punctuation marks.
108 */
109 nsProbingState nsHebrewProber::HandleData(const char* aBuf, PRUint32 aLen)
110 {
111 // Both model probers say it's not them. No reason to continue.
112 if (GetState() == eNotMe)
113 return eNotMe;
114
115 const char *curPtr, *endPtr = aBuf+aLen;
116 char cur;
117
118 for (curPtr = (char*)aBuf; curPtr < endPtr; ++curPtr)
119 {
120 cur = *curPtr;
121 if (cur == ' ') // We stand on a space - a word just ended
122 {
123 if (mBeforePrev != ' ') // *(curPtr-2) was not a space so prev is not a 1 letter word
124 {
125 if (isFinal(mPrev)) // case (1) [-2:not space][-1:final letter][cur:space]
126 ++mFinalCharLogicalScore;
127 else if (isNonFinal(mPrev)) // case (2) [-2:not space][-1:Non-Final letter][cur:space]
128 ++mFinalCharVisualScore;
129 }
130 }
131 else // Not standing on a space
132 {
133 if ((mBeforePrev == ' ') && (isFinal(mPrev)) && (cur != ' ')) // case (3) [-2:space][-1:final letter][cur:not space]
134 ++mFinalCharVisualScore;
135 }
136 mBeforePrev = mPrev;
137 mPrev = cur;
138 }
139
140 // Forever detecting, till the end or until both model probers return eNotMe (handled above).
141 return eDetecting;
142 }
143
144 // Make the decision: is it Logical or Visual?
145 const char* nsHebrewProber::GetCharSetName()
146 {
147 // If the final letter score distance is dominant enough, rely on it.
148 PRInt32 finalsub = mFinalCharLogicalScore - mFinalCharVisualScore;
149 if (finalsub >= MIN_FINAL_CHAR_DISTANCE)
150 return LOGICAL_HEBREW_NAME;
151 if (finalsub <= -(MIN_FINAL_CHAR_DISTANCE))
152 return VISUAL_HEBREW_NAME;
153
154 // It's not dominant enough, try to rely on the model scores instead.
155 float modelsub = mLogicalProb->GetConfidence() - mVisualProb->GetConfidence();
156 if (modelsub > MIN_MODEL_DISTANCE)
157 return LOGICAL_HEBREW_NAME;
158 if (modelsub < -(MIN_MODEL_DISTANCE))
159 return VISUAL_HEBREW_NAME;
160
161 // Still no good, back to final letter distance, maybe it'll save the day.
162 if (finalsub < 0)
163 return VISUAL_HEBREW_NAME;
164
165 // (finalsub > 0 - Logical) or (don't know what to do) default to Logical.
166 return LOGICAL_HEBREW_NAME;
167 }
168
169
170 void nsHebrewProber::Reset(void)
171 {
172 mFinalCharLogicalScore = 0;
173 mFinalCharVisualScore = 0;
174
175 // mPrev and mBeforePrev are initialized to space in order to simulate a word
176 // delimiter at the beginning of the data
177 mPrev = ' ';
178 mBeforePrev = ' ';
179 }
180
181 nsProbingState nsHebrewProber::GetState(void)
182 {
183 // Remain active as long as any of the model probers are active.
184 if ((mLogicalProb->GetState() == eNotMe) && (mVisualProb->GetState() == eNotMe))
185 return eNotMe;
186 return eDetecting;
187 }
188
189 #ifdef DEBUG_chardet
190 void nsHebrewProber::DumpStatus()
191 {
192 printf(" HEB: %d - %d [Logical-Visual score]\r\n", mFinalCharLogicalScore, mFinalCharVisualScore);
193 }
194 #endif
+0
-176
c/src/nsHebrewProber.h less more
0 /* -*- Mode: C; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
1 /* ***** BEGIN LICENSE BLOCK *****
2 * Version: MPL 1.1/GPL 2.0/LGPL 2.1
3 *
4 * The contents of this file are subject to the Mozilla Public License Version
5 * 1.1 (the "License"); you may not use this file except in compliance with
6 * the License. You may obtain a copy of the License at
7 * http://www.mozilla.org/MPL/
8 *
9 * Software distributed under the License is distributed on an "AS IS" basis,
10 * WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License
11 * for the specific language governing rights and limitations under the
12 * License.
13 *
14 * The Original Code is Mozilla Universal charset detector code.
15 *
16 * The Initial Developer of the Original Code is
17 * Shy Shalom <shooshX@gmail.com>
18 * Portions created by the Initial Developer are Copyright (C) 2005
19 * the Initial Developer: All Rights Reserved.
20 *
21 * Contributor(s):
22 *
23 * Alternatively, the contents of this file may be used under the terms of
24 * either the GNU General Public License Version 2 or later (the "GPL"), or
25 * the GNU Lesser General Public License Version 2.1 or later (the "LGPL"),
26 * in which case the provisions of the GPL or the LGPL are applicable instead
27 * of those above. If you wish to allow use of your version of this file only
28 * under the terms of either the GPL or the LGPL, and not to allow others to
29 * use your version of this file under the terms of the MPL, indicate your
30 * decision by deleting the provisions above and replace them with the notice
31 * and other provisions required by the GPL or the LGPL. If you do not delete
32 * the provisions above, a recipient may use your version of this file under
33 * the terms of any one of the MPL, the GPL or the LGPL.
34 *
35 * ***** END LICENSE BLOCK ***** */
36
37 #ifndef nsHebrewProber_h__
38 #define nsHebrewProber_h__
39
40 #include "nsSBCharSetProber.h"
41
42 // This prober doesn't actually recognize a language or a charset.
43 // It is a helper prober for the use of the Hebrew model probers
44 class nsHebrewProber: public nsCharSetProber
45 {
46 public:
47 nsHebrewProber(void) :mLogicalProb(0), mVisualProb(0) { Reset(); }
48
49 virtual ~nsHebrewProber(void) {}
50 virtual nsProbingState HandleData(const char* aBuf, PRUint32 aLen);
51 virtual const char* GetCharSetName();
52 virtual void Reset(void);
53
54 virtual nsProbingState GetState(void);
55
56 virtual float GetConfidence(void) { return (float)0.0; }
57 virtual void SetOpion() {}
58
59 void SetModelProbers(nsCharSetProber *logicalPrb, nsCharSetProber *visualPrb)
60 { mLogicalProb = logicalPrb; mVisualProb = visualPrb; }
61
62 #ifdef DEBUG_chardet
63 virtual void DumpStatus();
64 #endif
65
66 protected:
67 static PRBool isFinal(char c);
68 static PRBool isNonFinal(char c);
69
70 PRInt32 mFinalCharLogicalScore, mFinalCharVisualScore;
71
72 // The two last characters seen in the previous buffer.
73 char mPrev, mBeforePrev;
74
75 // These probers are owned by the group prober.
76 nsCharSetProber *mLogicalProb, *mVisualProb;
77 };
78
79 /**
80 * ** General ideas of the Hebrew charset recognition **
81 *
82 * Four main charsets exist in Hebrew:
83 * "ISO-8859-8" - Visual Hebrew
84 * "windows-1255" - Logical Hebrew
85 * "ISO-8859-8-I" - Logical Hebrew
86 * "x-mac-hebrew" - ?? Logical Hebrew ??
87 *
88 * Both "ISO" charsets use a completely identical set of code points, whereas
89 * "windows-1255" and "x-mac-hebrew" are two different proper supersets of
90 * these code points. windows-1255 defines additional characters in the range
91 * 0x80-0x9F as some misc punctuation marks as well as some Hebrew-specific
92 * diacritics and additional 'Yiddish' ligature letters in the range 0xc0-0xd6.
93 * x-mac-hebrew defines similar additional code points but with a different
94 * mapping.
95 *
96 * As far as an average Hebrew text with no diacritics is concerned, all four
97 * charsets are identical with respect to code points. Meaning that for the
98 * main Hebrew alphabet, all four map the same values to all 27 Hebrew letters
99 * (including final letters).
100 *
101 * The dominant difference between these charsets is their directionality.
102 * "Visual" directionality means that the text is ordered as if the renderer is
103 * not aware of a BIDI rendering algorithm. The renderer sees the text and
104 * draws it from left to right. The text itself when ordered naturally is read
105 * backwards. A buffer of Visual Hebrew generally looks like so:
106 * "[last word of first line spelled backwards] [whole line ordered backwards
107 * and spelled backwards] [first word of first line spelled backwards]
108 * [end of line] [last word of second line] ... etc' "
109 * adding punctuation marks, numbers and English text to visual text is
110 * naturally also "visual" and from left to right.
111 *
112 * "Logical" directionality means the text is ordered "naturally" according to
113 * the order it is read. It is the responsibility of the renderer to display
114 * the text from right to left. A BIDI algorithm is used to place general
115 * punctuation marks, numbers and English text in the text.
116 *
117 * Texts in x-mac-hebrew are almost impossible to find on the Internet. From
118 * what little evidence I could find, it seems that its general directionality
119 * is Logical.
120 *
121 * To sum up all of the above, the Hebrew probing mechanism knows about two
122 * charsets:
123 * Visual Hebrew - "ISO-8859-8" - backwards text - Words and sentences are
124 * backwards while line order is natural. For charset recognition purposes
125 * the line order is unimportant (In fact, for this implementation, even
126 * word order is unimportant).
127 * Logical Hebrew - "windows-1255" - normal, naturally ordered text.
128 *
129 * "ISO-8859-8-I" is a subset of windows-1255 and doesn't need to be
130 * specifically identified.
131 * "x-mac-hebrew" is also identified as windows-1255. A text in x-mac-hebrew
132 * that contain special punctuation marks or diacritics is displayed with
133 * some unconverted characters showing as question marks. This problem might
134 * be corrected using another model prober for x-mac-hebrew. Due to the fact
135 * that x-mac-hebrew texts are so rare, writing another model prober isn't
136 * worth the effort and performance hit.
137 *
138 * *** The Prober ***
139 *
140 * The prober is divided between two nsSBCharSetProbers and an nsHebrewProber,
141 * all of which are managed, created, fed data, inquired and deleted by the
142 * nsSBCSGroupProber. The two nsSBCharSetProbers identify that the text is in
143 * fact some kind of Hebrew, Logical or Visual. The final decision about which
144 * one is it is made by the nsHebrewProber by combining final-letter scores
145 * with the scores of the two nsSBCharSetProbers to produce a final answer.
146 *
147 * The nsSBCSGroupProber is responsible for stripping the original text of HTML
148 * tags, English characters, numbers, low-ASCII punctuation characters, spaces
149 * and new lines. It reduces any sequence of such characters to a single space.
150 * The buffer fed to each prober in the SBCS group prober is pure text in
151 * high-ASCII.
152 * The two nsSBCharSetProbers (model probers) share the same language model:
153 * Win1255Model.
154 * The first nsSBCharSetProber uses the model normally as any other
155 * nsSBCharSetProber does, to recognize windows-1255, upon which this model was
156 * built. The second nsSBCharSetProber is told to make the pair-of-letter
157 * lookup in the language model backwards. This in practice exactly simulates
158 * a visual Hebrew model using the windows-1255 logical Hebrew model.
159 *
160 * The nsHebrewProber is not using any language model. All it does is look for
161 * final-letter evidence suggesting the text is either logical Hebrew or visual
162 * Hebrew. Disjointed from the model probers, the results of the nsHebrewProber
163 * alone are meaningless. nsHebrewProber always returns 0.00 as confidence
164 * since it never identifies a charset by itself. Instead, the pointer to the
165 * nsHebrewProber is passed to the model probers as a helper "Name Prober".
166 * When the Group prober receives a positive identification from any prober,
167 * it asks for the name of the charset identified. If the prober queried is a
168 * Hebrew model prober, the model prober forwards the call to the
169 * nsHebrewProber to make the final decision. In the nsHebrewProber, the
170 * decision is made according to the final-letters scores maintained and Both
171 * model probers scores. The answer is returned in the form of the name of the
172 * charset identified, either "windows-1255" or "ISO-8859-8".
173 *
174 */
175 #endif /* nsHebrewProber_h__ */
+0
-182
c/src/nsLatin1Prober.cpp less more
0 /* -*- Mode: C; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
1 /* ***** BEGIN LICENSE BLOCK *****
2 * Version: MPL 1.1/GPL 2.0/LGPL 2.1
3 *
4 * The contents of this file are subject to the Mozilla Public License Version
5 * 1.1 (the "License"); you may not use this file except in compliance with
6 * the License. You may obtain a copy of the License at
7 * http://www.mozilla.org/MPL/
8 *
9 * Software distributed under the License is distributed on an "AS IS" basis,
10 * WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License
11 * for the specific language governing rights and limitations under the
12 * License.
13 *
14 * The Original Code is Mozilla Universal charset detector code.
15 *
16 * The Initial Developer of the Original Code is
17 * Netscape Communications Corporation.
18 * Portions created by the Initial Developer are Copyright (C) 2001
19 * the Initial Developer. All Rights Reserved.
20 *
21 * Contributor(s):
22 * Shy Shalom <shooshX@gmail.com>
23 *
24 * Alternatively, the contents of this file may be used under the terms of
25 * either the GNU General Public License Version 2 or later (the "GPL"), or
26 * the GNU Lesser General Public License Version 2.1 or later (the "LGPL"),
27 * in which case the provisions of the GPL or the LGPL are applicable instead
28 * of those above. If you wish to allow use of your version of this file only
29 * under the terms of either the GPL or the LGPL, and not to allow others to
30 * use your version of this file under the terms of the MPL, indicate your
31 * decision by deleting the provisions above and replace them with the notice
32 * and other provisions required by the GPL or the LGPL. If you do not delete
33 * the provisions above, a recipient may use your version of this file under
34 * the terms of any one of the MPL, the GPL or the LGPL.
35 *
36 * ***** END LICENSE BLOCK ***** */
37
38 #include "nsLatin1Prober.h"
39 #include "prmem.h"
40 #include <stdio.h>
41
42 #define UDF 0 // undefined
43 #define OTH 1 //other
44 #define ASC 2 // ascii capital letter
45 #define ASS 3 // ascii small letter
46 #define ACV 4 // accent capital vowel
47 #define ACO 5 // accent capital other
48 #define ASV 6 // accent small vowel
49 #define ASO 7 // accent small other
50 #define CLASS_NUM 8 // total classes
51
52 static unsigned char Latin1_CharToClass[] =
53 {
54 OTH, OTH, OTH, OTH, OTH, OTH, OTH, OTH, // 00 - 07
55 OTH, OTH, OTH, OTH, OTH, OTH, OTH, OTH, // 08 - 0F
56 OTH, OTH, OTH, OTH, OTH, OTH, OTH, OTH, // 10 - 17
57 OTH, OTH, OTH, OTH, OTH, OTH, OTH, OTH, // 18 - 1F
58 OTH, OTH, OTH, OTH, OTH, OTH, OTH, OTH, // 20 - 27
59 OTH, OTH, OTH, OTH, OTH, OTH, OTH, OTH, // 28 - 2F
60 OTH, OTH, OTH, OTH, OTH, OTH, OTH, OTH, // 30 - 37
61 OTH, OTH, OTH, OTH, OTH, OTH, OTH, OTH, // 38 - 3F
62 OTH, ASC, ASC, ASC, ASC, ASC, ASC, ASC, // 40 - 47
63 ASC, ASC, ASC, ASC, ASC, ASC, ASC, ASC, // 48 - 4F
64 ASC, ASC, ASC, ASC, ASC, ASC, ASC, ASC, // 50 - 57
65 ASC, ASC, ASC, OTH, OTH, OTH, OTH, OTH, // 58 - 5F
66 OTH, ASS, ASS, ASS, ASS, ASS, ASS, ASS, // 60 - 67
67 ASS, ASS, ASS, ASS, ASS, ASS, ASS, ASS, // 68 - 6F
68 ASS, ASS, ASS, ASS, ASS, ASS, ASS, ASS, // 70 - 77
69 ASS, ASS, ASS, OTH, OTH, OTH, OTH, OTH, // 78 - 7F
70 OTH, UDF, OTH, ASO, OTH, OTH, OTH, OTH, // 80 - 87
71 OTH, OTH, ACO, OTH, ACO, UDF, ACO, UDF, // 88 - 8F
72 UDF, OTH, OTH, OTH, OTH, OTH, OTH, OTH, // 90 - 97
73 OTH, OTH, ASO, OTH, ASO, UDF, ASO, ACO, // 98 - 9F
74 OTH, OTH, OTH, OTH, OTH, OTH, OTH, OTH, // A0 - A7
75 OTH, OTH, OTH, OTH, OTH, OTH, OTH, OTH, // A8 - AF
76 OTH, OTH, OTH, OTH, OTH, OTH, OTH, OTH, // B0 - B7
77 OTH, OTH, OTH, OTH, OTH, OTH, OTH, OTH, // B8 - BF
78 ACV, ACV, ACV, ACV, ACV, ACV, ACO, ACO, // C0 - C7
79 ACV, ACV, ACV, ACV, ACV, ACV, ACV, ACV, // C8 - CF
80 ACO, ACO, ACV, ACV, ACV, ACV, ACV, OTH, // D0 - D7
81 ACV, ACV, ACV, ACV, ACV, ACO, ACO, ACO, // D8 - DF
82 ASV, ASV, ASV, ASV, ASV, ASV, ASO, ASO, // E0 - E7
83 ASV, ASV, ASV, ASV, ASV, ASV, ASV, ASV, // E8 - EF
84 ASO, ASO, ASV, ASV, ASV, ASV, ASV, OTH, // F0 - F7
85 ASV, ASV, ASV, ASV, ASV, ASO, ASO, ASO, // F8 - FF
86 };
87
88
89 /* 0 : illegal
90 1 : very unlikely
91 2 : normal
92 3 : very likely
93 */
94 static unsigned char Latin1ClassModel[] =
95 {
96 /* UDF OTH ASC ASS ACV ACO ASV ASO */
97 /*UDF*/ 0, 0, 0, 0, 0, 0, 0, 0,
98 /*OTH*/ 0, 3, 3, 3, 3, 3, 3, 3,
99 /*ASC*/ 0, 3, 3, 3, 3, 3, 3, 3,
100 /*ASS*/ 0, 3, 3, 3, 1, 1, 3, 3,
101 /*ACV*/ 0, 3, 3, 3, 1, 2, 1, 2,
102 /*ACO*/ 0, 3, 3, 3, 3, 3, 3, 3,
103 /*ASV*/ 0, 3, 1, 3, 1, 1, 1, 3,
104 /*ASO*/ 0, 3, 1, 3, 1, 1, 3, 3,
105 };
106
107 void nsLatin1Prober::Reset(void)
108 {
109 mState = eDetecting;
110 mLastCharClass = OTH;
111 for (int i = 0; i < FREQ_CAT_NUM; i++)
112 mFreqCounter[i] = 0;
113 }
114
115
116 nsProbingState nsLatin1Prober::HandleData(const char* aBuf, PRUint32 aLen)
117 {
118 char *newBuf1 = 0;
119 PRUint32 newLen1 = 0;
120
121 if (!FilterWithEnglishLetters(aBuf, aLen, &newBuf1, newLen1)) {
122 newBuf1 = (char*)aBuf;
123 newLen1 = aLen;
124 }
125
126 unsigned char charClass;
127 unsigned char freq;
128 for (PRUint32 i = 0; i < newLen1; i++)
129 {
130 charClass = Latin1_CharToClass[(unsigned char)newBuf1[i]];
131 freq = Latin1ClassModel[mLastCharClass*CLASS_NUM + charClass];
132 if (freq == 0) {
133 mState = eNotMe;
134 break;
135 }
136 mFreqCounter[freq]++;
137 mLastCharClass = charClass;
138 }
139
140 if (newBuf1 != aBuf)
141 PR_FREEIF(newBuf1);
142
143 return mState;
144 }
145
146 float nsLatin1Prober::GetConfidence(void)
147 {
148 if (mState == eNotMe)
149 return 0.01f;
150
151 float confidence;
152 PRUint32 total = 0;
153 for (PRInt32 i = 0; i < FREQ_CAT_NUM; i++)
154 total += mFreqCounter[i];
155
156 if(!total)
157 confidence = 0.0f;
158 else
159 {
160 confidence = mFreqCounter[3]*1.0f / total;
161 confidence -= mFreqCounter[1]*20.0f/total;
162 }
163
164 if (confidence < 0.0f)
165 confidence = 0.0f;
166
167 // lower the confidence of latin1 so that other more accurate detector
168 // can take priority.
169 confidence *= 0.50f;
170
171 return confidence;
172 }
173
174 #ifdef DEBUG_chardet
175 void nsLatin1Prober::DumpStatus()
176 {
177 printf(" Latin1Prober: %1.3f [%s]\r\n", GetConfidence(), GetCharSetName());
178 }
179 #endif
180
181
+0
-71
c/src/nsLatin1Prober.h less more
0 /* -*- Mode: C; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
1 /* ***** BEGIN LICENSE BLOCK *****
2 * Version: MPL 1.1/GPL 2.0/LGPL 2.1
3 *
4 * The contents of this file are subject to the Mozilla Public License Version
5 * 1.1 (the "License"); you may not use this file except in compliance with
6 * the License. You may obtain a copy of the License at
7 * http://www.mozilla.org/MPL/
8 *
9 * Software distributed under the License is distributed on an "AS IS" basis,
10 * WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License
11 * for the specific language governing rights and limitations under the
12 * License.
13 *
14 * The Original Code is Mozilla Universal charset detector code.
15 *
16 * The Initial Developer of the Original Code is
17 * Netscape Communications Corporation.
18 * Portions created by the Initial Developer are Copyright (C) 2001
19 * the Initial Developer. All Rights Reserved.
20 *
21 * Contributor(s):
22 * Shy Shalom <shooshX@gmail.com>
23 *
24 * Alternatively, the contents of this file may be used under the terms of
25 * either the GNU General Public License Version 2 or later (the "GPL"), or
26 * the GNU Lesser General Public License Version 2.1 or later (the "LGPL"),
27 * in which case the provisions of the GPL or the LGPL are applicable instead
28 * of those above. If you wish to allow use of your version of this file only
29 * under the terms of either the GPL or the LGPL, and not to allow others to
30 * use your version of this file under the terms of the MPL, indicate your
31 * decision by deleting the provisions above and replace them with the notice
32 * and other provisions required by the GPL or the LGPL. If you do not delete
33 * the provisions above, a recipient may use your version of this file under
34 * the terms of any one of the MPL, the GPL or the LGPL.
35 *
36 * ***** END LICENSE BLOCK ***** */
37
38 #ifndef nsLatin1Prober_h__
39 #define nsLatin1Prober_h__
40
41 #include "universalchardet.h"
42 #include "nsCharSetProber.h"
43
44 #define FREQ_CAT_NUM 4
45
46 class nsLatin1Prober: public nsCharSetProber {
47 public:
48 nsLatin1Prober(void){Reset();}
49 virtual ~nsLatin1Prober(void){}
50 nsProbingState HandleData(const char* aBuf, PRUint32 aLen);
51 const char* GetCharSetName() {return CHARDET_ENCODING_WINDOWS_1252;}
52 nsProbingState GetState(void) {return mState;}
53 void Reset(void);
54 float GetConfidence(void);
55 void SetOpion() {}
56
57 #ifdef DEBUG_chardet
58 virtual void DumpStatus();
59 #endif
60
61 protected:
62
63 nsProbingState mState;
64 char mLastCharClass;
65 PRUint32 mFreqCounter[FREQ_CAT_NUM];
66 };
67
68
69 #endif /* nsLatin1Prober_h__ */
70
+0
-209
c/src/nsMBCSGroupProber.cpp less more
0 /* -*- Mode: C; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
1 /* ***** BEGIN LICENSE BLOCK *****
2 * Version: MPL 1.1/GPL 2.0/LGPL 2.1
3 *
4 * The contents of this file are subject to the Mozilla Public License Version
5 * 1.1 (the "License"); you may not use this file except in compliance with
6 * the License. You may obtain a copy of the License at
7 * http://www.mozilla.org/MPL/
8 *
9 * Software distributed under the License is distributed on an "AS IS" basis,
10 * WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License
11 * for the specific language governing rights and limitations under the
12 * License.
13 *
14 * The Original Code is Mozilla Universal charset detector code.
15 *
16 * The Initial Developer of the Original Code is
17 * Netscape Communications Corporation.
18 * Portions created by the Initial Developer are Copyright (C) 2001
19 * the Initial Developer. All Rights Reserved.
20 *
21 * Contributor(s):
22 * Shy Shalom <shooshX@gmail.com>
23 *
24 * Alternatively, the contents of this file may be used under the terms of
25 * either the GNU General Public License Version 2 or later (the "GPL"), or
26 * the GNU Lesser General Public License Version 2.1 or later (the "LGPL"),
27 * in which case the provisions of the GPL or the LGPL are applicable instead
28 * of those above. If you wish to allow use of your version of this file only
29 * under the terms of either the GPL or the LGPL, and not to allow others to
30 * use your version of this file under the terms of the MPL, indicate your
31 * decision by deleting the provisions above and replace them with the notice
32 * and other provisions required by the GPL or the LGPL. If you do not delete
33 * the provisions above, a recipient may use your version of this file under
34 * the terms of any one of the MPL, the GPL or the LGPL.
35 *
36 * ***** END LICENSE BLOCK ***** */
37 #include <stdio.h>
38 #include "prmem.h"
39
40 #include "nsMBCSGroupProber.h"
41
42 #ifdef DEBUG_chardet
43 char *ProberName[] =
44 {
45 "UTF8",
46 "SJIS",
47 "EUCJP",
48 "GB18030",
49 "EUCKR",
50 "Big5",
51 "EUCTW",
52 };
53
54 #endif
55
56 nsMBCSGroupProber::nsMBCSGroupProber()
57 {
58 mProbers[0] = new nsUTF8Prober();
59 mProbers[1] = new nsSJISProber();
60 mProbers[2] = new nsEUCJPProber();
61 mProbers[3] = new nsGB18030Prober();
62 mProbers[4] = new nsEUCKRProber();
63 mProbers[5] = new nsBig5Prober();
64 mProbers[6] = new nsEUCTWProber();
65 Reset();
66 }
67
68 nsMBCSGroupProber::~nsMBCSGroupProber()
69 {
70 for (PRUint32 i = 0; i < NUM_OF_PROBERS; i++)
71 {
72 delete mProbers[i];
73 }
74 }
75
76 const char* nsMBCSGroupProber::GetCharSetName()
77 {
78 if (mBestGuess == -1)
79 {
80 GetConfidence();
81 if (mBestGuess == -1)
82 mBestGuess = 0;
83 }
84 return mProbers[mBestGuess]->GetCharSetName();
85 }
86
87 void nsMBCSGroupProber::Reset(void)
88 {
89 mActiveNum = 0;
90 for (PRUint32 i = 0; i < NUM_OF_PROBERS; i++)
91 {
92 if (mProbers[i])
93 {
94 mProbers[i]->Reset();
95 mIsActive[i] = PR_TRUE;
96 ++mActiveNum;
97 }
98 else
99 mIsActive[i] = PR_FALSE;
100 }
101 mBestGuess = -1;
102 mState = eDetecting;
103 }
104
105 nsProbingState nsMBCSGroupProber::HandleData(const char* aBuf, PRUint32 aLen)
106 {
107 nsProbingState st;
108 PRUint32 i;
109
110 //do filtering to reduce load to probers
111 char *highbyteBuf;
112 char *hptr;
113 PRBool keepNext = PR_TRUE; //assume previous is not ascii, it will do no harm except add some noise
114 hptr = highbyteBuf = (char*)PR_Malloc(aLen);
115 if (!hptr)
116 return mState;
117 for (i = 0; i < aLen; i++)
118 {
119 if (aBuf[i] & 0x80)
120 {
121 *hptr++ = aBuf[i];
122 keepNext = PR_TRUE;
123 }
124 else
125 {
126 //if previous is highbyte, keep this even it is a ASCII
127 if (keepNext)
128 {
129 *hptr++ = aBuf[i];
130 keepNext = PR_FALSE;
131 }
132 }
133 }
134
135 for (i = 0; i < NUM_OF_PROBERS; i++)
136 {
137 if (!mIsActive[i])
138 continue;
139 st = mProbers[i]->HandleData(highbyteBuf, hptr - highbyteBuf);
140 if (st == eFoundIt)
141 {
142 mBestGuess = i;
143 mState = eFoundIt;
144 break;
145 }
146 else if (st == eNotMe)
147 {
148 mIsActive[i] = PR_FALSE;
149 mActiveNum--;
150 if (mActiveNum <= 0)
151 {
152 mState = eNotMe;
153 break;
154 }
155 }
156 }
157
158 PR_FREEIF(highbyteBuf);
159
160 return mState;
161 }
162
163 float nsMBCSGroupProber::GetConfidence(void)
164 {
165 PRUint32 i;
166 float bestConf = 0.0, cf;
167
168 switch (mState)
169 {
170 case eFoundIt:
171 return (float)0.99;
172 case eNotMe:
173 return (float)0.01;
174 default:
175 for (i = 0; i < NUM_OF_PROBERS; i++)
176 {
177 if (!mIsActive[i])
178 continue;
179 cf = mProbers[i]->GetConfidence();
180 if (bestConf < cf)
181 {
182 bestConf = cf;
183 mBestGuess = i;
184 }
185 }
186 }
187 return bestConf;
188 }
189
190 #ifdef DEBUG_chardet
191 void nsMBCSGroupProber::DumpStatus()
192 {
193 PRUint32 i;
194 float cf;
195
196 GetConfidence();
197 for (i = 0; i < NUM_OF_PROBERS; i++)
198 {
199 if (!mIsActive[i])
200 printf(" MBCS inactive: [%s] (confidence is too low).\r\n", ProberName[i]);
201 else
202 {
203 cf = mProbers[i]->GetConfidence();
204 printf(" MBCS %1.3f: [%s]\r\n", cf, ProberName[i]);
205 }
206 }
207 }
208 #endif
+0
-75
c/src/nsMBCSGroupProber.h less more
0 /* -*- Mode: C; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
1 /* ***** BEGIN LICENSE BLOCK *****
2 * Version: MPL 1.1/GPL 2.0/LGPL 2.1
3 *
4 * The contents of this file are subject to the Mozilla Public License Version
5 * 1.1 (the "License"); you may not use this file except in compliance with
6 * the License. You may obtain a copy of the License at
7 * http://www.mozilla.org/MPL/
8 *
9 * Software distributed under the License is distributed on an "AS IS" basis,
10 * WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License
11 * for the specific language governing rights and limitations under the
12 * License.
13 *
14 * The Original Code is mozilla.org code.
15 *
16 * The Initial Developer of the Original Code is
17 * Netscape Communications Corporation.
18 * Portions created by the Initial Developer are Copyright (C) 1998
19 * the Initial Developer. All Rights Reserved.
20 *
21 * Contributor(s):
22 *
23 * Alternatively, the contents of this file may be used under the terms of
24 * either the GNU General Public License Version 2 or later (the "GPL"), or
25 * the GNU Lesser General Public License Version 2.1 or later (the "LGPL"),
26 * in which case the provisions of the GPL or the LGPL are applicable instead
27 * of those above. If you wish to allow use of your version of this file only
28 * under the terms of either the GPL or the LGPL, and not to allow others to
29 * use your version of this file under the terms of the MPL, indicate your
30 * decision by deleting the provisions above and replace them with the notice
31 * and other provisions required by the GPL or the LGPL. If you do not delete
32 * the provisions above, a recipient may use your version of this file under
33 * the terms of any one of the MPL, the GPL or the LGPL.
34 *
35 * ***** END LICENSE BLOCK ***** */
36
37 #ifndef nsMBCSGroupProber_h__
38 #define nsMBCSGroupProber_h__
39
40 #include "nsSJISProber.h"
41 #include "nsUTF8Prober.h"
42 #include "nsEUCJPProber.h"
43 #include "nsGB2312Prober.h"
44 #include "nsEUCKRProber.h"
45 #include "nsBig5Prober.h"
46 #include "nsEUCTWProber.h"
47
48 #define NUM_OF_PROBERS 7
49
50 class nsMBCSGroupProber: public nsCharSetProber {
51 public:
52 nsMBCSGroupProber();
53 virtual ~nsMBCSGroupProber();
54 nsProbingState HandleData(const char* aBuf, PRUint32 aLen);
55 const char* GetCharSetName();
56 nsProbingState GetState(void) {return mState;}
57 void Reset(void);
58 float GetConfidence(void);
59 void SetOpion() {}
60
61 #ifdef DEBUG_chardet
62 void DumpStatus();
63 #endif
64
65 protected:
66 nsProbingState mState;
67 nsCharSetProber* mProbers[NUM_OF_PROBERS];
68 PRBool mIsActive[NUM_OF_PROBERS];
69 PRInt32 mBestGuess;
70 PRUint32 mActiveNum;
71 };
72
73 #endif /* nsMBCSGroupProber_h__ */
74
+0
-627
c/src/nsMBCSSM.cpp less more
0 /* -*- Mode: C; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
1 /* ***** BEGIN LICENSE BLOCK *****
2 * Version: MPL 1.1/GPL 2.0/LGPL 2.1
3 *
4 * The contents of this file are subject to the Mozilla Public License Version
5 * 1.1 (the "License"); you may not use this file except in compliance with
6 * the License. You may obtain a copy of the License at
7 * http://www.mozilla.org/MPL/
8 *
9 * Software distributed under the License is distributed on an "AS IS" basis,
10 * WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License
11 * for the specific language governing rights and limitations under the
12 * License.
13 *
14 * The Original Code is mozilla.org code.
15 *
16 * The Initial Developer of the Original Code is
17 * Netscape Communications Corporation.
18 * Portions created by the Initial Developer are Copyright (C) 1998
19 * the Initial Developer. All Rights Reserved.
20 *
21 * Contributor(s):
22 *
23 * Alternatively, the contents of this file may be used under the terms of
24 * either the GNU General Public License Version 2 or later (the "GPL"), or
25 * the GNU Lesser General Public License Version 2.1 or later (the "LGPL"),
26 * in which case the provisions of the GPL or the LGPL are applicable instead
27 * of those above. If you wish to allow use of your version of this file only
28 * under the terms of either the GPL or the LGPL, and not to allow others to
29 * use your version of this file under the terms of the MPL, indicate your
30 * decision by deleting the provisions above and replace them with the notice
31 * and other provisions required by the GPL or the LGPL. If you do not delete
32 * the provisions above, a recipient may use your version of this file under
33 * the terms of any one of the MPL, the GPL or the LGPL.
34 *
35 * ***** END LICENSE BLOCK ***** */
36 #include "universalchardet.h"
37 #include "nsCodingStateMachine.h"
38
39 /*
40 Modification from frank tang's original work:
41 . 0x00 is allowed as a legal character. Since some web pages contains this char in
42 text stream.
43 */
44
45 // BIG5
46
47 static PRUint32 BIG5_cls [ 256 / 8 ] = {
48 //PCK4BITS(0,1,1,1,1,1,1,1), // 00 - 07
49 PCK4BITS(1,1,1,1,1,1,1,1), // 00 - 07 //allow 0x00 as legal value
50 PCK4BITS(1,1,1,1,1,1,0,0), // 08 - 0f
51 PCK4BITS(1,1,1,1,1,1,1,1), // 10 - 17
52 PCK4BITS(1,1,1,0,1,1,1,1), // 18 - 1f
53 PCK4BITS(1,1,1,1,1,1,1,1), // 20 - 27
54 PCK4BITS(1,1,1,1,1,1,1,1), // 28 - 2f
55 PCK4BITS(1,1,1,1,1,1,1,1), // 30 - 37
56 PCK4BITS(1,1,1,1,1,1,1,1), // 38 - 3f
57 PCK4BITS(2,2,2,2,2,2,2,2), // 40 - 47
58 PCK4BITS(2,2,2,2,2,2,2,2), // 48 - 4f
59 PCK4BITS(2,2,2,2,2,2,2,2), // 50 - 57
60 PCK4BITS(2,2,2,2,2,2,2,2), // 58 - 5f
61 PCK4BITS(2,2,2,2,2,2,2,2), // 60 - 67
62 PCK4BITS(2,2,2,2,2,2,2,2), // 68 - 6f
63 PCK4BITS(2,2,2,2,2,2,2,2), // 70 - 77
64 PCK4BITS(2,2,2,2,2,2,2,1), // 78 - 7f
65 PCK4BITS(4,4,4,4,4,4,4,4), // 80 - 87
66 PCK4BITS(4,4,4,4,4,4,4,4), // 88 - 8f
67 PCK4BITS(4,4,4,4,4,4,4,4), // 90 - 97
68 PCK4BITS(4,4,4,4,4,4,4,4), // 98 - 9f
69 PCK4BITS(4,3,3,3,3,3,3,3), // a0 - a7
70 PCK4BITS(3,3,3,3,3,3,3,3), // a8 - af
71 PCK4BITS(3,3,3,3,3,3,3,3), // b0 - b7
72 PCK4BITS(3,3,3,3,3,3,3,3), // b8 - bf
73 PCK4BITS(3,3,3,3,3,3,3,3), // c0 - c7
74 PCK4BITS(3,3,3,3,3,3,3,3), // c8 - cf
75 PCK4BITS(3,3,3,3,3,3,3,3), // d0 - d7
76 PCK4BITS(3,3,3,3,3,3,3,3), // d8 - df
77 PCK4BITS(3,3,3,3,3,3,3,3), // e0 - e7
78 PCK4BITS(3,3,3,3,3,3,3,3), // e8 - ef
79 PCK4BITS(3,3,3,3,3,3,3,3), // f0 - f7
80 PCK4BITS(3,3,3,3,3,3,3,0) // f8 - ff
81 };
82
83
84 static PRUint32 BIG5_st [ 3] = {
85 PCK4BITS(eError,eStart,eStart, 3,eError,eError,eError,eError),//00-07
86 PCK4BITS(eError,eError,eItsMe,eItsMe,eItsMe,eItsMe,eItsMe,eError),//08-0f
87 PCK4BITS(eError,eStart,eStart,eStart,eStart,eStart,eStart,eStart) //10-17
88 };
89
90 static const PRUint32 Big5CharLenTable[] = {0, 1, 1, 2, 0};
91
92 SMModel Big5SMModel = {
93 {eIdxSft4bits, eSftMsk4bits, eBitSft4bits, eUnitMsk4bits, BIG5_cls },
94 5,
95 {eIdxSft4bits, eSftMsk4bits, eBitSft4bits, eUnitMsk4bits, BIG5_st },
96 Big5CharLenTable,
97 CHARDET_ENCODING_BIG5,
98 };
99
100 static PRUint32 EUCJP_cls [ 256 / 8 ] = {
101 //PCK4BITS(5,4,4,4,4,4,4,4), // 00 - 07
102 PCK4BITS(4,4,4,4,4,4,4,4), // 00 - 07
103 PCK4BITS(4,4,4,4,4,4,5,5), // 08 - 0f
104 PCK4BITS(4,4,4,4,4,4,4,4), // 10 - 17
105 PCK4BITS(4,4,4,5,4,4,4,4), // 18 - 1f
106 PCK4BITS(4,4,4,4,4,4,4,4), // 20 - 27
107 PCK4BITS(4,4,4,4,4,4,4,4), // 28 - 2f
108 PCK4BITS(4,4,4,4,4,4,4,4), // 30 - 37
109 PCK4BITS(4,4,4,4,4,4,4,4), // 38 - 3f
110 PCK4BITS(4,4,4,4,4,4,4,4), // 40 - 47
111 PCK4BITS(4,4,4,4,4,4,4,4), // 48 - 4f
112 PCK4BITS(4,4,4,4,4,4,4,4), // 50 - 57
113 PCK4BITS(4,4,4,4,4,4,4,4), // 58 - 5f
114 PCK4BITS(4,4,4,4,4,4,4,4), // 60 - 67
115 PCK4BITS(4,4,4,4,4,4,4,4), // 68 - 6f
116 PCK4BITS(4,4,4,4,4,4,4,4), // 70 - 77
117 PCK4BITS(4,4,4,4,4,4,4,4), // 78 - 7f
118 PCK4BITS(5,5,5,5,5,5,5,5), // 80 - 87
119 PCK4BITS(5,5,5,5,5,5,1,3), // 88 - 8f
120 PCK4BITS(5,5,5,5,5,5,5,5), // 90 - 97
121 PCK4BITS(5,5,5,5,5,5,5,5), // 98 - 9f
122 PCK4BITS(5,2,2,2,2,2,2,2), // a0 - a7
123 PCK4BITS(2,2,2,2,2,2,2,2), // a8 - af
124 PCK4BITS(2,2,2,2,2,2,2,2), // b0 - b7
125 PCK4BITS(2,2,2,2,2,2,2,2), // b8 - bf
126 PCK4BITS(2,2,2,2,2,2,2,2), // c0 - c7
127 PCK4BITS(2,2,2,2,2,2,2,2), // c8 - cf
128 PCK4BITS(2,2,2,2,2,2,2,2), // d0 - d7
129 PCK4BITS(2,2,2,2,2,2,2,2), // d8 - df
130 PCK4BITS(0,0,0,0,0,0,0,0), // e0 - e7
131 PCK4BITS(0,0,0,0,0,0,0,0), // e8 - ef
132 PCK4BITS(0,0,0,0,0,0,0,0), // f0 - f7
133 PCK4BITS(0,0,0,0,0,0,0,5) // f8 - ff
134 };
135
136
137 static PRUint32 EUCJP_st [ 5] = {
138 PCK4BITS( 3, 4, 3, 5,eStart,eError,eError,eError),//00-07
139 PCK4BITS(eError,eError,eError,eError,eItsMe,eItsMe,eItsMe,eItsMe),//08-0f
140 PCK4BITS(eItsMe,eItsMe,eStart,eError,eStart,eError,eError,eError),//10-17
141 PCK4BITS(eError,eError,eStart,eError,eError,eError, 3,eError),//18-1f
142 PCK4BITS( 3,eError,eError,eError,eStart,eStart,eStart,eStart) //20-27
143 };
144
145 static const PRUint32 EUCJPCharLenTable[] = {2, 2, 2, 3, 1, 0};
146
147 SMModel EUCJPSMModel = {
148 {eIdxSft4bits, eSftMsk4bits, eBitSft4bits, eUnitMsk4bits, EUCJP_cls },
149 6,
150 {eIdxSft4bits, eSftMsk4bits, eBitSft4bits, eUnitMsk4bits, EUCJP_st },
151 EUCJPCharLenTable,
152 CHARDET_ENCODING_EUC_JP,
153 };
154
155 static PRUint32 EUCKR_cls [ 256 / 8 ] = {
156 //PCK4BITS(0,1,1,1,1,1,1,1), // 00 - 07
157 PCK4BITS(1,1,1,1,1,1,1,1), // 00 - 07
158 PCK4BITS(1,1,1,1,1,1,0,0), // 08 - 0f
159 PCK4BITS(1,1,1,1,1,1,1,1), // 10 - 17
160 PCK4BITS(1,1,1,0,1,1,1,1), // 18 - 1f
161 PCK4BITS(1,1,1,1,1,1,1,1), // 20 - 27
162 PCK4BITS(1,1,1,1,1,1,1,1), // 28 - 2f
163 PCK4BITS(1,1,1,1,1,1,1,1), // 30 - 37
164 PCK4BITS(1,1,1,1,1,1,1,1), // 38 - 3f
165 PCK4BITS(1,1,1,1,1,1,1,1), // 40 - 47
166 PCK4BITS(1,1,1,1,1,1,1,1), // 48 - 4f
167 PCK4BITS(1,1,1,1,1,1,1,1), // 50 - 57
168 PCK4BITS(1,1,1,1,1,1,1,1), // 58 - 5f
169 PCK4BITS(1,1,1,1,1,1,1,1), // 60 - 67
170 PCK4BITS(1,1,1,1,1,1,1,1), // 68 - 6f
171 PCK4BITS(1,1,1,1,1,1,1,1), // 70 - 77
172 PCK4BITS(1,1,1,1,1,1,1,1), // 78 - 7f
173 PCK4BITS(0,0,0,0,0,0,0,0), // 80 - 87
174 PCK4BITS(0,0,0,0,0,0,0,0), // 88 - 8f
175 PCK4BITS(0,0,0,0,0,0,0,0), // 90 - 97
176 PCK4BITS(0,0,0,0,0,0,0,0), // 98 - 9f
177 PCK4BITS(0,2,2,2,2,2,2,2), // a0 - a7
178 PCK4BITS(2,2,2,2,2,3,3,3), // a8 - af
179 PCK4BITS(2,2,2,2,2,2,2,2), // b0 - b7
180 PCK4BITS(2,2,2,2,2,2,2,2), // b8 - bf
181 PCK4BITS(2,2,2,2,2,2,2,2), // c0 - c7
182 PCK4BITS(2,3,2,2,2,2,2,2), // c8 - cf
183 PCK4BITS(2,2,2,2,2,2,2,2), // d0 - d7
184 PCK4BITS(2,2,2,2,2,2,2,2), // d8 - df
185 PCK4BITS(2,2,2,2,2,2,2,2), // e0 - e7
186 PCK4BITS(2,2,2,2,2,2,2,2), // e8 - ef
187 PCK4BITS(2,2,2,2,2,2,2,2), // f0 - f7
188 PCK4BITS(2,2,2,2,2,2,2,0) // f8 - ff
189 };
190
191
192 static PRUint32 EUCKR_st [ 2] = {
193 PCK4BITS(eError,eStart, 3,eError,eError,eError,eError,eError),//00-07
194 PCK4BITS(eItsMe,eItsMe,eItsMe,eItsMe,eError,eError,eStart,eStart) //08-0f
195 };
196
197 static const PRUint32 EUCKRCharLenTable[] = {0, 1, 2, 0};
198
199 SMModel EUCKRSMModel = {
200 {eIdxSft4bits, eSftMsk4bits, eBitSft4bits, eUnitMsk4bits, EUCKR_cls },
201 4,
202 {eIdxSft4bits, eSftMsk4bits, eBitSft4bits, eUnitMsk4bits, EUCKR_st },
203 EUCKRCharLenTable,
204 CHARDET_ENCODING_EUC_KR,
205 };
206
207 static PRUint32 EUCTW_cls [ 256 / 8 ] = {
208 //PCK4BITS(0,2,2,2,2,2,2,2), // 00 - 07
209 PCK4BITS(2,2,2,2,2,2,2,2), // 00 - 07
210 PCK4BITS(2,2,2,2,2,2,0,0), // 08 - 0f
211 PCK4BITS(2,2,2,2,2,2,2,2), // 10 - 17
212 PCK4BITS(2,2,2,0,2,2,2,2), // 18 - 1f
213 PCK4BITS(2,2,2,2,2,2,2,2), // 20 - 27
214 PCK4BITS(2,2,2,2,2,2,2,2), // 28 - 2f
215 PCK4BITS(2,2,2,2,2,2,2,2), // 30 - 37
216 PCK4BITS(2,2,2,2,2,2,2,2), // 38 - 3f
217 PCK4BITS(2,2,2,2,2,2,2,2), // 40 - 47
218 PCK4BITS(2,2,2,2,2,2,2,2), // 48 - 4f
219 PCK4BITS(2,2,2,2,2,2,2,2), // 50 - 57
220 PCK4BITS(2,2,2,2,2,2,2,2), // 58 - 5f
221 PCK4BITS(2,2,2,2,2,2,2,2), // 60 - 67
222 PCK4BITS(2,2,2,2,2,2,2,2), // 68 - 6f
223 PCK4BITS(2,2,2,2,2,2,2,2), // 70 - 77
224 PCK4BITS(2,2,2,2,2,2,2,2), // 78 - 7f
225 PCK4BITS(0,0,0,0,0,0,0,0), // 80 - 87
226 PCK4BITS(0,0,0,0,0,0,6,0), // 88 - 8f
227 PCK4BITS(0,0,0,0,0,0,0,0), // 90 - 97
228 PCK4BITS(0,0,0,0,0,0,0,0), // 98 - 9f
229 PCK4BITS(0,3,4,4,4,4,4,4), // a0 - a7
230 PCK4BITS(5,5,1,1,1,1,1,1), // a8 - af
231 PCK4BITS(1,1,1,1,1,1,1,1), // b0 - b7
232 PCK4BITS(1,1,1,1,1,1,1,1), // b8 - bf
233 PCK4BITS(1,1,3,1,3,3,3,3), // c0 - c7
234 PCK4BITS(3,3,3,3,3,3,3,3), // c8 - cf
235 PCK4BITS(3,3,3,3,3,3,3,3), // d0 - d7
236 PCK4BITS(3,3,3,3,3,3,3,3), // d8 - df
237 PCK4BITS(3,3,3,3,3,3,3,3), // e0 - e7
238 PCK4BITS(3,3,3,3,3,3,3,3), // e8 - ef
239 PCK4BITS(3,3,3,3,3,3,3,3), // f0 - f7
240 PCK4BITS(3,3,3,3,3,3,3,0) // f8 - ff
241 };
242
243
244 static PRUint32 EUCTW_st [ 6] = {
245 PCK4BITS(eError,eError,eStart, 3, 3, 3, 4,eError),//00-07
246 PCK4BITS(eError,eError,eError,eError,eError,eError,eItsMe,eItsMe),//08-0f
247 PCK4BITS(eItsMe,eItsMe,eItsMe,eItsMe,eItsMe,eError,eStart,eError),//10-17
248 PCK4BITS(eStart,eStart,eStart,eError,eError,eError,eError,eError),//18-1f
249 PCK4BITS( 5,eError,eError,eError,eStart,eError,eStart,eStart),//20-27
250 PCK4BITS(eStart,eError,eStart,eStart,eStart,eStart,eStart,eStart) //28-2f
251 };
252
253 static const PRUint32 EUCTWCharLenTable[] = {0, 0, 1, 2, 2, 2, 3};
254
255 SMModel EUCTWSMModel = {
256 {eIdxSft4bits, eSftMsk4bits, eBitSft4bits, eUnitMsk4bits, EUCTW_cls },
257 7,
258 {eIdxSft4bits, eSftMsk4bits, eBitSft4bits, eUnitMsk4bits, EUCTW_st },
259 EUCTWCharLenTable,
260 CHARDET_ENCODING_EUC_TW,
261 };
262
263 /* obsolete GB2312 by gb18030
264 static PRUint32 GB2312_cls [ 256 / 8 ] = {
265 //PCK4BITS(0,1,1,1,1,1,1,1), // 00 - 07
266 PCK4BITS(1,1,1,1,1,1,1,1), // 00 - 07
267 PCK4BITS(1,1,1,1,1,1,0,0), // 08 - 0f
268 PCK4BITS(1,1,1,1,1,1,1,1), // 10 - 17
269 PCK4BITS(1,1,1,0,1,1,1,1), // 18 - 1f
270 PCK4BITS(1,1,1,1,1,1,1,1), // 20 - 27
271 PCK4BITS(1,1,1,1,1,1,1,1), // 28 - 2f
272 PCK4BITS(1,1,1,1,1,1,1,1), // 30 - 37
273 PCK4BITS(1,1,1,1,1,1,1,1), // 38 - 3f
274 PCK4BITS(1,1,1,1,1,1,1,1), // 40 - 47
275 PCK4BITS(1,1,1,1,1,1,1,1), // 48 - 4f
276 PCK4BITS(1,1,1,1,1,1,1,1), // 50 - 57
277 PCK4BITS(1,1,1,1,1,1,1,1), // 58 - 5f
278 PCK4BITS(1,1,1,1,1,1,1,1), // 60 - 67
279 PCK4BITS(1,1,1,1,1,1,1,1), // 68 - 6f
280 PCK4BITS(1,1,1,1,1,1,1,1), // 70 - 77
281 PCK4BITS(1,1,1,1,1,1,1,1), // 78 - 7f
282 PCK4BITS(1,0,0,0,0,0,0,0), // 80 - 87
283 PCK4BITS(0,0,0,0,0,0,0,0), // 88 - 8f
284 PCK4BITS(0,0,0,0,0,0,0,0), // 90 - 97
285 PCK4BITS(0,0,0,0,0,0,0,0), // 98 - 9f
286 PCK4BITS(0,2,2,2,2,2,2,2), // a0 - a7
287 PCK4BITS(2,2,3,3,3,3,3,3), // a8 - af
288 PCK4BITS(2,2,2,2,2,2,2,2), // b0 - b7
289 PCK4BITS(2,2,2,2,2,2,2,2), // b8 - bf
290 PCK4BITS(2,2,2,2,2,2,2,2), // c0 - c7
291 PCK4BITS(2,2,2,2,2,2,2,2), // c8 - cf
292 PCK4BITS(2,2,2,2,2,2,2,2), // d0 - d7
293 PCK4BITS(2,2,2,2,2,2,2,2), // d8 - df
294 PCK4BITS(2,2,2,2,2,2,2,2), // e0 - e7
295 PCK4BITS(2,2,2,2,2,2,2,2), // e8 - ef
296 PCK4BITS(2,2,2,2,2,2,2,2), // f0 - f7
297 PCK4BITS(2,2,2,2,2,2,2,0) // f8 - ff
298 };
299
300
301 static PRUint32 GB2312_st [ 2] = {
302 PCK4BITS(eError,eStart, 3,eError,eError,eError,eError,eError),//00-07
303 PCK4BITS(eItsMe,eItsMe,eItsMe,eItsMe,eError,eError,eStart,eStart) //08-0f
304 };
305
306 static const PRUint32 GB2312CharLenTable[] = {0, 1, 2, 0};
307
308 SMModel GB2312SMModel = {
309 {eIdxSft4bits, eSftMsk4bits, eBitSft4bits, eUnitMsk4bits, GB2312_cls },
310 4,
311 {eIdxSft4bits, eSftMsk4bits, eBitSft4bits, eUnitMsk4bits, GB2312_st },
312 GB2312CharLenTable,
313 "GB2312",
314 };
315 */
316
317 // the following state machine data was created by perl script in
318 // intl/chardet/tools. It should be the same as in PSM detector.
319 static PRUint32 GB18030_cls [ 256 / 8 ] = {
320 PCK4BITS(1,1,1,1,1,1,1,1), // 00 - 07
321 PCK4BITS(1,1,1,1,1,1,0,0), // 08 - 0f
322 PCK4BITS(1,1,1,1,1,1,1,1), // 10 - 17
323 PCK4BITS(1,1,1,0,1,1,1,1), // 18 - 1f
324 PCK4BITS(1,1,1,1,1,1,1,1), // 20 - 27
325 PCK4BITS(1,1,1,1,1,1,1,1), // 28 - 2f
326 PCK4BITS(3,3,3,3,3,3,3,3), // 30 - 37
327 PCK4BITS(3,3,1,1,1,1,1,1), // 38 - 3f
328 PCK4BITS(2,2,2,2,2,2,2,2), // 40 - 47
329 PCK4BITS(2,2,2,2,2,2,2,2), // 48 - 4f
330 PCK4BITS(2,2,2,2,2,2,2,2), // 50 - 57
331 PCK4BITS(2,2,2,2,2,2,2,2), // 58 - 5f
332 PCK4BITS(2,2,2,2,2,2,2,2), // 60 - 67
333 PCK4BITS(2,2,2,2,2,2,2,2), // 68 - 6f
334 PCK4BITS(2,2,2,2,2,2,2,2), // 70 - 77
335 PCK4BITS(2,2,2,2,2,2,2,4), // 78 - 7f
336 PCK4BITS(5,6,6,6,6,6,6,6), // 80 - 87
337 PCK4BITS(6,6,6,6,6,6,6,6), // 88 - 8f
338 PCK4BITS(6,6,6,6,6,6,6,6), // 90 - 97
339 PCK4BITS(6,6,6,6,6,6,6,6), // 98 - 9f
340 PCK4BITS(6,6,6,6,6,6,6,6), // a0 - a7
341 PCK4BITS(6,6,6,6,6,6,6,6), // a8 - af
342 PCK4BITS(6,6,6,6,6,6,6,6), // b0 - b7
343 PCK4BITS(6,6,6,6,6,6,6,6), // b8 - bf
344 PCK4BITS(6,6,6,6,6,6,6,6), // c0 - c7
345 PCK4BITS(6,6,6,6,6,6,6,6), // c8 - cf
346 PCK4BITS(6,6,6,6,6,6,6,6), // d0 - d7
347 PCK4BITS(6,6,6,6,6,6,6,6), // d8 - df
348 PCK4BITS(6,6,6,6,6,6,6,6), // e0 - e7
349 PCK4BITS(6,6,6,6,6,6,6,6), // e8 - ef
350 PCK4BITS(6,6,6,6,6,6,6,6), // f0 - f7
351 PCK4BITS(6,6,6,6,6,6,6,0) // f8 - ff
352 };
353
354
355 static PRUint32 GB18030_st [ 6] = {
356 PCK4BITS(eError,eStart,eStart,eStart,eStart,eStart, 3,eError),//00-07
357 PCK4BITS(eError,eError,eError,eError,eError,eError,eItsMe,eItsMe),//08-0f
358 PCK4BITS(eItsMe,eItsMe,eItsMe,eItsMe,eItsMe,eError,eError,eStart),//10-17
359 PCK4BITS( 4,eError,eStart,eStart,eError,eError,eError,eError),//18-1f
360 PCK4BITS(eError,eError, 5,eError,eError,eError,eItsMe,eError),//20-27
361 PCK4BITS(eError,eError,eStart,eStart,eStart,eStart,eStart,eStart) //28-2f
362 };
363
364 // To be accurate, the length of class 6 can be either 2 or 4.
365 // But it is not necessary to discriminate between the two since
366 // it is used for frequency analysis only, and we are validing
367 // each code range there as well. So it is safe to set it to be
368 // 2 here.
369 static const PRUint32 GB18030CharLenTable[] = {0, 1, 1, 1, 1, 1, 2};
370
371 SMModel GB18030SMModel = {
372 {eIdxSft4bits, eSftMsk4bits, eBitSft4bits, eUnitMsk4bits, GB18030_cls },
373 7,
374 {eIdxSft4bits, eSftMsk4bits, eBitSft4bits, eUnitMsk4bits, GB18030_st },
375 GB18030CharLenTable,
376 CHARDET_ENCODING_GB18030,
377 };
378
379 // sjis
380
381 static PRUint32 SJIS_cls [ 256 / 8 ] = {
382 //PCK4BITS(0,1,1,1,1,1,1,1), // 00 - 07
383 PCK4BITS(1,1,1,1,1,1,1,1), // 00 - 07
384 PCK4BITS(1,1,1,1,1,1,0,0), // 08 - 0f
385 PCK4BITS(1,1,1,1,1,1,1,1), // 10 - 17
386 PCK4BITS(1,1,1,0,1,1,1,1), // 18 - 1f
387 PCK4BITS(1,1,1,1,1,1,1,1), // 20 - 27
388 PCK4BITS(1,1,1,1,1,1,1,1), // 28 - 2f
389 PCK4BITS(1,1,1,1,1,1,1,1), // 30 - 37
390 PCK4BITS(1,1,1,1,1,1,1,1), // 38 - 3f
391 PCK4BITS(2,2,2,2,2,2,2,2), // 40 - 47
392 PCK4BITS(2,2,2,2,2,2,2,2), // 48 - 4f
393 PCK4BITS(2,2,2,2,2,2,2,2), // 50 - 57
394 PCK4BITS(2,2,2,2,2,2,2,2), // 58 - 5f
395 PCK4BITS(2,2,2,2,2,2,2,2), // 60 - 67
396 PCK4BITS(2,2,2,2,2,2,2,2), // 68 - 6f
397 PCK4BITS(2,2,2,2,2,2,2,2), // 70 - 77
398 PCK4BITS(2,2,2,2,2,2,2,1), // 78 - 7f
399 PCK4BITS(3,3,3,3,3,3,3,3), // 80 - 87
400 PCK4BITS(3,3,3,3,3,3,3,3), // 88 - 8f
401 PCK4BITS(3,3,3,3,3,3,3,3), // 90 - 97
402 PCK4BITS(3,3,3,3,3,3,3,3), // 98 - 9f
403 //0xa0 is illegal in sjis encoding, but some pages does
404 //contain such byte. We need to be more error forgiven.
405 PCK4BITS(2,2,2,2,2,2,2,2), // a0 - a7
406 PCK4BITS(2,2,2,2,2,2,2,2), // a8 - af
407 PCK4BITS(2,2,2,2,2,2,2,2), // b0 - b7
408 PCK4BITS(2,2,2,2,2,2,2,2), // b8 - bf
409 PCK4BITS(2,2,2,2,2,2,2,2), // c0 - c7
410 PCK4BITS(2,2,2,2,2,2,2,2), // c8 - cf
411 PCK4BITS(2,2,2,2,2,2,2,2), // d0 - d7
412 PCK4BITS(2,2,2,2,2,2,2,2), // d8 - df
413 PCK4BITS(3,3,3,3,3,3,3,3), // e0 - e7
414 PCK4BITS(3,3,3,3,3,4,4,4), // e8 - ef
415 PCK4BITS(4,4,4,4,4,4,4,4), // f0 - f7
416 PCK4BITS(4,4,4,4,4,0,0,0) // f8 - ff
417 };
418
419
420 static PRUint32 SJIS_st [ 3] = {
421 PCK4BITS(eError,eStart,eStart, 3,eError,eError,eError,eError),//00-07
422 PCK4BITS(eError,eError,eError,eError,eItsMe,eItsMe,eItsMe,eItsMe),//08-0f
423 PCK4BITS(eItsMe,eItsMe,eError,eError,eStart,eStart,eStart,eStart) //10-17
424 };
425
426 static const PRUint32 SJISCharLenTable[] = {0, 1, 1, 2, 0, 0};
427
428 SMModel SJISSMModel = {
429 {eIdxSft4bits, eSftMsk4bits, eBitSft4bits, eUnitMsk4bits, SJIS_cls },
430 6,
431 {eIdxSft4bits, eSftMsk4bits, eBitSft4bits, eUnitMsk4bits, SJIS_st },
432 SJISCharLenTable,
433 CHARDET_ENCODING_SHIFT_JIS,
434 };
435
436
437 static PRUint32 UCS2BE_cls [ 256 / 8 ] = {
438 PCK4BITS(0,0,0,0,0,0,0,0), // 00 - 07
439 PCK4BITS(0,0,1,0,0,2,0,0), // 08 - 0f
440 PCK4BITS(0,0,0,0,0,0,0,0), // 10 - 17
441 PCK4BITS(0,0,0,3,0,0,0,0), // 18 - 1f
442 PCK4BITS(0,0,0,0,0,0,0,0), // 20 - 27
443 PCK4BITS(0,3,3,3,3,3,0,0), // 28 - 2f
444 PCK4BITS(0,0,0,0,0,0,0,0), // 30 - 37
445 PCK4BITS(0,0,0,0,0,0,0,0), // 38 - 3f
446 PCK4BITS(0,0,0,0,0,0,0,0), // 40 - 47
447 PCK4BITS(0,0,0,0,0,0,0,0), // 48 - 4f
448 PCK4BITS(0,0,0,0,0,0,0,0), // 50 - 57
449 PCK4BITS(0,0,0,0,0,0,0,0), // 58 - 5f
450 PCK4BITS(0,0,0,0,0,0,0,0), // 60 - 67
451 PCK4BITS(0,0,0,0,0,0,0,0), // 68 - 6f
452 PCK4BITS(0,0,0,0,0,0,0,0), // 70 - 77
453 PCK4BITS(0,0,0,0,0,0,0,0), // 78 - 7f
454 PCK4BITS(0,0,0,0,0,0,0,0), // 80 - 87
455 PCK4BITS(0,0,0,0,0,0,0,0), // 88 - 8f
456 PCK4BITS(0,0,0,0,0,0,0,0), // 90 - 97
457 PCK4BITS(0,0,0,0,0,0,0,0), // 98 - 9f
458 PCK4BITS(0,0,0,0,0,0,0,0), // a0 - a7
459 PCK4BITS(0,0,0,0,0,0,0,0), // a8 - af
460 PCK4BITS(0,0,0,0,0,0,0,0), // b0 - b7
461 PCK4BITS(0,0,0,0,0,0,0,0), // b8 - bf
462 PCK4BITS(0,0,0,0,0,0,0,0), // c0 - c7
463 PCK4BITS(0,0,0,0,0,0,0,0), // c8 - cf
464 PCK4BITS(0,0,0,0,0,0,0,0), // d0 - d7
465 PCK4BITS(0,0,0,0,0,0,0,0), // d8 - df
466 PCK4BITS(0,0,0,0,0,0,0,0), // e0 - e7
467 PCK4BITS(0,0,0,0,0,0,0,0), // e8 - ef
468 PCK4BITS(0,0,0,0,0,0,0,0), // f0 - f7
469 PCK4BITS(0,0,0,0,0,0,4,5) // f8 - ff
470 };
471
472
473 static PRUint32 UCS2BE_st [ 7] = {
474 PCK4BITS( 5, 7, 7,eError, 4, 3,eError,eError),//00-07
475 PCK4BITS(eError,eError,eError,eError,eItsMe,eItsMe,eItsMe,eItsMe),//08-0f
476 PCK4BITS(eItsMe,eItsMe, 6, 6, 6, 6,eError,eError),//10-17
477 PCK4BITS( 6, 6, 6, 6, 6,eItsMe, 6, 6),//18-1f
478 PCK4BITS( 6, 6, 6, 6, 5, 7, 7,eError),//20-27
479 PCK4BITS( 5, 8, 6, 6,eError, 6, 6, 6),//28-2f
480 PCK4BITS( 6, 6, 6, 6,eError,eError,eStart,eStart) //30-37
481 };
482
483 static const PRUint32 UCS2BECharLenTable[] = {2, 2, 2, 0, 2, 2};
484
485 SMModel UCS2BESMModel = {
486 {eIdxSft4bits, eSftMsk4bits, eBitSft4bits, eUnitMsk4bits, UCS2BE_cls },
487 6,
488 {eIdxSft4bits, eSftMsk4bits, eBitSft4bits, eUnitMsk4bits, UCS2BE_st },
489 UCS2BECharLenTable,
490 CHARDET_ENCODING_UTF_16BE,
491 };
492
493 static PRUint32 UCS2LE_cls [ 256 / 8 ] = {
494 PCK4BITS(0,0,0,0,0,0,0,0), // 00 - 07
495 PCK4BITS(0,0,1,0,0,2,0,0), // 08 - 0f
496 PCK4BITS(0,0,0,0,0,0,0,0), // 10 - 17
497 PCK4BITS(0,0,0,3,0,0,0,0), // 18 - 1f
498 PCK4BITS(0,0,0,0,0,0,0,0), // 20 - 27
499 PCK4BITS(0,3,3,3,3,3,0,0), // 28 - 2f
500 PCK4BITS(0,0,0,0,0,0,0,0), // 30 - 37
501 PCK4BITS(0,0,0,0,0,0,0,0), // 38 - 3f
502 PCK4BITS(0,0,0,0,0,0,0,0), // 40 - 47
503 PCK4BITS(0,0,0,0,0,0,0,0), // 48 - 4f
504 PCK4BITS(0,0,0,0,0,0,0,0), // 50 - 57
505 PCK4BITS(0,0,0,0,0,0,0,0), // 58 - 5f
506 PCK4BITS(0,0,0,0,0,0,0,0), // 60 - 67
507 PCK4BITS(0,0,0,0,0,0,0,0), // 68 - 6f
508 PCK4BITS(0,0,0,0,0,0,0,0), // 70 - 77
509 PCK4BITS(0,0,0,0,0,0,0,0), // 78 - 7f
510 PCK4BITS(0,0,0,0,0,0,0,0), // 80 - 87
511 PCK4BITS(0,0,0,0,0,0,0,0), // 88 - 8f
512 PCK4BITS(0,0,0,0,0,0,0,0), // 90 - 97
513 PCK4BITS(0,0,0,0,0,0,0,0), // 98 - 9f
514 PCK4BITS(0,0,0,0,0,0,0,0), // a0 - a7
515 PCK4BITS(0,0,0,0,0,0,0,0), // a8 - af
516 PCK4BITS(0,0,0,0,0,0,0,0), // b0 - b7
517 PCK4BITS(0,0,0,0,0,0,0,0), // b8 - bf
518 PCK4BITS(0,0,0,0,0,0,0,0), // c0 - c7
519 PCK4BITS(0,0,0,0,0,0,0,0), // c8 - cf
520 PCK4BITS(0,0,0,0,0,0,0,0), // d0 - d7
521 PCK4BITS(0,0,0,0,0,0,0,0), // d8 - df
522 PCK4BITS(0,0,0,0,0,0,0,0), // e0 - e7
523 PCK4BITS(0,0,0,0,0,0,0,0), // e8 - ef
524 PCK4BITS(0,0,0,0,0,0,0,0), // f0 - f7
525 PCK4BITS(0,0,0,0,0,0,4,5) // f8 - ff
526 };
527
528
529 static PRUint32 UCS2LE_st [ 7] = {
530 PCK4BITS( 6, 6, 7, 6, 4, 3,eError,eError),//00-07
531 PCK4BITS(eError,eError,eError,eError,eItsMe,eItsMe,eItsMe,eItsMe),//08-0f
532 PCK4BITS(eItsMe,eItsMe, 5, 5, 5,eError,eItsMe,eError),//10-17
533 PCK4BITS( 5, 5, 5,eError, 5,eError, 6, 6),//18-1f
534 PCK4BITS( 7, 6, 8, 8, 5, 5, 5,eError),//20-27
535 PCK4BITS( 5, 5, 5,eError,eError,eError, 5, 5),//28-2f
536 PCK4BITS( 5, 5, 5,eError, 5,eError,eStart,eStart) //30-37
537 };
538
539 static const PRUint32 UCS2LECharLenTable[] = {2, 2, 2, 2, 2, 2};
540
541 SMModel UCS2LESMModel = {
542 {eIdxSft4bits, eSftMsk4bits, eBitSft4bits, eUnitMsk4bits, UCS2LE_cls },
543 6,
544 {eIdxSft4bits, eSftMsk4bits, eBitSft4bits, eUnitMsk4bits, UCS2LE_st },
545 UCS2LECharLenTable,
546 CHARDET_ENCODING_UTF_16LE,
547 };
548
549
550 static PRUint32 UTF8_cls [ 256 / 8 ] = {
551 //PCK4BITS(0,1,1,1,1,1,1,1), // 00 - 07
552 PCK4BITS(1,1,1,1,1,1,1,1), // 00 - 07 //allow 0x00 as a legal value
553 PCK4BITS(1,1,1,1,1,1,0,0), // 08 - 0f
554 PCK4BITS(1,1,1,1,1,1,1,1), // 10 - 17
555 PCK4BITS(1,1,1,0,1,1,1,1), // 18 - 1f
556 PCK4BITS(1,1,1,1,1,1,1,1), // 20 - 27
557 PCK4BITS(1,1,1,1,1,1,1,1), // 28 - 2f
558 PCK4BITS(1,1,1,1,1,1,1,1), // 30 - 37
559 PCK4BITS(1,1,1,1,1,1,1,1), // 38 - 3f
560 PCK4BITS(1,1,1,1,1,1,1,1), // 40 - 47
561 PCK4BITS(1,1,1,1,1,1,1,1), // 48 - 4f
562 PCK4BITS(1,1,1,1,1,1,1,1), // 50 - 57
563 PCK4BITS(1,1,1,1,1,1,1,1), // 58 - 5f
564 PCK4BITS(1,1,1,1,1,1,1,1), // 60 - 67
565 PCK4BITS(1,1,1,1,1,1,1,1), // 68 - 6f
566 PCK4BITS(1,1,1,1,1,1,1,1), // 70 - 77
567 PCK4BITS(1,1,1,1,1,1,1,1), // 78 - 7f
568 PCK4BITS(2,2,2,2,3,3,3,3), // 80 - 87
569 PCK4BITS(4,4,4,4,4,4,4,4), // 88 - 8f
570 PCK4BITS(4,4,4,4,4,4,4,4), // 90 - 97
571 PCK4BITS(4,4,4,4,4,4,4,4), // 98 - 9f
572 PCK4BITS(5,5,5,5,5,5,5,5), // a0 - a7
573 PCK4BITS(5,5,5,5,5,5,5,5), // a8 - af
574 PCK4BITS(5,5,5,5,5,5,5,5), // b0 - b7
575 PCK4BITS(5,5,5,5,5,5,5,5), // b8 - bf
576 PCK4BITS(0,0,6,6,6,6,6,6), // c0 - c7
577 PCK4BITS(6,6,6,6,6,6,6,6), // c8 - cf
578 PCK4BITS(6,6,6,6,6,6,6,6), // d0 - d7
579 PCK4BITS(6,6,6,6,6,6,6,6), // d8 - df
580 PCK4BITS(7,8,8,8,8,8,8,8), // e0 - e7
581 PCK4BITS(8,8,8,8,8,9,8,8), // e8 - ef
582 PCK4BITS(10,11,11,11,11,11,11,11), // f0 - f7
583 PCK4BITS(12,13,13,13,14,15,0,0) // f8 - ff
584 };
585
586
587 static PRUint32 UTF8_st [ 26] = {
588 PCK4BITS(eError,eStart,eError,eError,eError,eError, 12, 10),//00-07
589 PCK4BITS( 9, 11, 8, 7, 6, 5, 4, 3),//08-0f
590 PCK4BITS(eError,eError,eError,eError,eError,eError,eError,eError),//10-17
591 PCK4BITS(eError,eError,eError,eError,eError,eError,eError,eError),//18-1f
592 PCK4BITS(eItsMe,eItsMe,eItsMe,eItsMe,eItsMe,eItsMe,eItsMe,eItsMe),//20-27
593 PCK4BITS(eItsMe,eItsMe,eItsMe,eItsMe,eItsMe,eItsMe,eItsMe,eItsMe),//28-2f
594 PCK4BITS(eError,eError, 5, 5, 5, 5,eError,eError),//30-37
595 PCK4BITS(eError,eError,eError,eError,eError,eError,eError,eError),//38-3f
596 PCK4BITS(eError,eError,eError, 5, 5, 5,eError,eError),//40-47
597 PCK4BITS(eError,eError,eError,eError,eError,eError,eError,eError),//48-4f
598 PCK4BITS(eError,eError, 7, 7, 7, 7,eError,eError),//50-57
599 PCK4BITS(eError,eError,eError,eError,eError,eError,eError,eError),//58-5f
600 PCK4BITS(eError,eError,eError,eError, 7, 7,eError,eError),//60-67
601 PCK4BITS(eError,eError,eError,eError,eError,eError,eError,eError),//68-6f
602 PCK4BITS(eError,eError, 9, 9, 9, 9,eError,eError),//70-77
603 PCK4BITS(eError,eError,eError,eError,eError,eError,eError,eError),//78-7f
604 PCK4BITS(eError,eError,eError,eError,eError, 9,eError,eError),//80-87
605 PCK4BITS(eError,eError,eError,eError,eError,eError,eError,eError),//88-8f
606 PCK4BITS(eError,eError, 12, 12, 12, 12,eError,eError),//90-97
607 PCK4BITS(eError,eError,eError,eError,eError,eError,eError,eError),//98-9f
608 PCK4BITS(eError,eError,eError,eError,eError, 12,eError,eError),//a0-a7
609 PCK4BITS(eError,eError,eError,eError,eError,eError,eError,eError),//a8-af
610 PCK4BITS(eError,eError, 12, 12, 12,eError,eError,eError),//b0-b7
611 PCK4BITS(eError,eError,eError,eError,eError,eError,eError,eError),//b8-bf
612 PCK4BITS(eError,eError,eStart,eStart,eStart,eStart,eError,eError),//c0-c7
613 PCK4BITS(eError,eError,eError,eError,eError,eError,eError,eError) //c8-cf
614 };
615
616 static const PRUint32 UTF8CharLenTable[] = {0, 1, 0, 0, 0, 0, 2, 3,
617 3, 3, 4, 4, 5, 5, 6, 6 };
618
619 SMModel UTF8SMModel = {
620 {eIdxSft4bits, eSftMsk4bits, eBitSft4bits, eUnitMsk4bits, UTF8_cls },
621 16,
622 {eIdxSft4bits, eSftMsk4bits, eBitSft4bits, eUnitMsk4bits, UTF8_st },
623 UTF8CharLenTable,
624 CHARDET_ENCODING_UTF_8,
625 };
626
+0
-89
c/src/nsPkgInt.h less more
0 /* -*- Mode: C; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
1 /* ***** BEGIN LICENSE BLOCK *****
2 * Version: MPL 1.1/GPL 2.0/LGPL 2.1
3 *
4 * The contents of this file are subject to the Mozilla Public License Version
5 * 1.1 (the "License"); you may not use this file except in compliance with
6 * the License. You may obtain a copy of the License at
7 * http://www.mozilla.org/MPL/
8 *
9 * Software distributed under the License is distributed on an "AS IS" basis,
10 * WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License
11 * for the specific language governing rights and limitations under the
12 * License.
13 *
14 * The Original Code is mozilla.org code.
15 *
16 * The Initial Developer of the Original Code is
17 * Netscape Communications Corporation.
18 * Portions created by the Initial Developer are Copyright (C) 1998
19 * the Initial Developer. All Rights Reserved.
20 *
21 * Contributor(s):
22 *
23 * Alternatively, the contents of this file may be used under the terms of
24 * either the GNU General Public License Version 2 or later (the "GPL"), or
25 * the GNU Lesser General Public License Version 2.1 or later (the "LGPL"),
26 * in which case the provisions of the GPL or the LGPL are applicable instead
27 * of those above. If you wish to allow use of your version of this file only
28 * under the terms of either the GPL or the LGPL, and not to allow others to
29 * use your version of this file under the terms of the MPL, indicate your
30 * decision by deleting the provisions above and replace them with the notice
31 * and other provisions required by the GPL or the LGPL. If you do not delete
32 * the provisions above, a recipient may use your version of this file under
33 * the terms of any one of the MPL, the GPL or the LGPL.
34 *
35 * ***** END LICENSE BLOCK ***** */
36
37 #ifndef nsPkgInt_h__
38 #define nsPkgInt_h__
39 #include "nscore.h"
40
41 typedef enum {
42 eIdxSft4bits = 3,
43 eIdxSft8bits = 2,
44 eIdxSft16bits = 1
45 } nsIdxSft;
46
47 typedef enum {
48 eSftMsk4bits = 7,
49 eSftMsk8bits = 3,
50 eSftMsk16bits = 1
51 } nsSftMsk;
52
53 typedef enum {
54 eBitSft4bits = 2,
55 eBitSft8bits = 3,
56 eBitSft16bits = 4
57 } nsBitSft;
58
59 typedef enum {
60 eUnitMsk4bits = 0x0000000FL,
61 eUnitMsk8bits = 0x000000FFL,
62 eUnitMsk16bits = 0x0000FFFFL
63 } nsUnitMsk;
64
65 typedef struct nsPkgInt {
66 nsIdxSft idxsft;
67 nsSftMsk sftmsk;
68 nsBitSft bitsft;
69 nsUnitMsk unitmsk;
70 PRUint32 *data;
71 } nsPkgInt;
72
73
74 #define PCK16BITS(a,b) ((PRUint32)(((b) << 16) | (a)))
75
76 #define PCK8BITS(a,b,c,d) PCK16BITS( ((PRUint32)(((b) << 8) | (a))), \
77 ((PRUint32)(((d) << 8) | (c))))
78
79 #define PCK4BITS(a,b,c,d,e,f,g,h) PCK8BITS( ((PRUint32)(((b) << 4) | (a))), \
80 ((PRUint32)(((d) << 4) | (c))), \
81 ((PRUint32)(((f) << 4) | (e))), \
82 ((PRUint32)(((h) << 4) | (g))) )
83
84 #define GETFROMPCK(i, c) \
85 (((((c).data)[(i)>>(c).idxsft])>>(((i)&(c).sftmsk)<<(c).bitsft))&(c).unitmsk)
86
87 #endif /* nsPkgInt_h__ */
88
+0
-223
c/src/nsSBCSGroupProber.cpp less more
0 /* -*- Mode: C; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
1 /* ***** BEGIN LICENSE BLOCK *****
2 * Version: MPL 1.1/GPL 2.0/LGPL 2.1
3 *
4 * The contents of this file are subject to the Mozilla Public License Version
5 * 1.1 (the "License"); you may not use this file except in compliance with
6 * the License. You may obtain a copy of the License at
7 * http://www.mozilla.org/MPL/
8 *
9 * Software distributed under the License is distributed on an "AS IS" basis,
10 * WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License
11 * for the specific language governing rights and limitations under the
12 * License.
13 *
14 * The Original Code is Mozilla Universal charset detector code.
15 *
16 * The Initial Developer of the Original Code is
17 * Netscape Communications Corporation.
18 * Portions created by the Initial Developer are Copyright (C) 2001
19 * the Initial Developer. All Rights Reserved.
20 *
21 * Contributor(s):
22 * Shy Shalom <shooshX@gmail.com>
23 *
24 * Alternatively, the contents of this file may be used under the terms of
25 * either the GNU General Public License Version 2 or later (the "GPL"), or
26 * the GNU Lesser General Public License Version 2.1 or later (the "LGPL"),
27 * in which case the provisions of the GPL or the LGPL are applicable instead
28 * of those above. If you wish to allow use of your version of this file only
29 * under the terms of either the GPL or the LGPL, and not to allow others to
30 * use your version of this file under the terms of the MPL, indicate your
31 * decision by deleting the provisions above and replace them with the notice
32 * and other provisions required by the GPL or the LGPL. If you do not delete
33 * the provisions above, a recipient may use your version of this file under
34 * the terms of any one of the MPL, the GPL or the LGPL.
35 *
36 * ***** END LICENSE BLOCK ***** */
37
38 #include <stdio.h>
39 #include "prmem.h"
40
41 #include "nsSBCharSetProber.h"
42 #include "nsSBCSGroupProber.h"
43
44 #include "nsHebrewProber.h"
45
46 nsSBCSGroupProber::nsSBCSGroupProber()
47 {
48 mProbers[0] = new nsSingleByteCharSetProber(&Win1251Model);
49 mProbers[1] = new nsSingleByteCharSetProber(&Koi8rModel);
50 mProbers[2] = new nsSingleByteCharSetProber(&Latin5Model);
51 mProbers[3] = new nsSingleByteCharSetProber(&MacCyrillicModel);
52 mProbers[4] = new nsSingleByteCharSetProber(&Ibm866Model);
53 mProbers[5] = new nsSingleByteCharSetProber(&Ibm855Model);
54 mProbers[6] = new nsSingleByteCharSetProber(&Latin7Model);
55 mProbers[7] = new nsSingleByteCharSetProber(&Win1253Model);
56 mProbers[8] = new nsSingleByteCharSetProber(&Latin5BulgarianModel);
57 mProbers[9] = new nsSingleByteCharSetProber(&Win1251BulgarianModel);
58
59 nsHebrewProber *hebprober = new nsHebrewProber();
60 // Notice: Any change in these indexes - 10,11,12 must be reflected
61 // in the code below as well.
62 mProbers[10] = hebprober;
63 mProbers[11] = new nsSingleByteCharSetProber(&Win1255Model, PR_FALSE, hebprober); // Logical Hebrew
64 mProbers[12] = new nsSingleByteCharSetProber(&Win1255Model, PR_TRUE, hebprober); // Visual Hebrew
65 // Tell the Hebrew prober about the logical and visual probers
66 if (mProbers[10] && mProbers[11] && mProbers[12]) // all are not null
67 {
68 hebprober->SetModelProbers(mProbers[11], mProbers[12]);
69 }
70 else // One or more is null. avoid any Hebrew probing, null them all
71 {
72 for (PRUint32 i = 10; i <= 12; ++i)
73 {
74 delete mProbers[i];
75 mProbers[i] = 0;
76 }
77 }
78
79 // disable latin2 before latin1 is available, otherwise all latin1
80 // will be detected as latin2 because of their similarity.
81 //mProbers[10] = new nsSingleByteCharSetProber(&Latin2HungarianModel);
82 //mProbers[11] = new nsSingleByteCharSetProber(&Win1250HungarianModel);
83
84 Reset();
85 }
86
87 nsSBCSGroupProber::~nsSBCSGroupProber()
88 {
89 for (PRUint32 i = 0; i < NUM_OF_SBCS_PROBERS; i++)
90 {
91 delete mProbers[i];
92 }
93 }
94
95
96 const char* nsSBCSGroupProber::GetCharSetName()
97 {
98 //if we have no answer yet
99 if (mBestGuess == -1)
100 {
101 GetConfidence();
102 //no charset seems positive
103 if (mBestGuess == -1)
104 //we will use default.
105 mBestGuess = 0;
106 }
107 return mProbers[mBestGuess]->GetCharSetName();
108 }
109
110 void nsSBCSGroupProber::Reset(void)
111 {
112 mActiveNum = 0;
113 for (PRUint32 i = 0; i < NUM_OF_SBCS_PROBERS; i++)
114 {
115 if (mProbers[i]) // not null
116 {
117 mProbers[i]->Reset();
118 mIsActive[i] = PR_TRUE;
119 ++mActiveNum;
120 }
121 else
122 mIsActive[i] = PR_FALSE;
123 }
124 mBestGuess = -1;
125 mState = eDetecting;
126 }
127
128
129 nsProbingState nsSBCSGroupProber::HandleData(const char* aBuf, PRUint32 aLen)
130 {
131 nsProbingState st;
132 PRUint32 i;
133 char *newBuf1 = 0;
134 PRUint32 newLen1 = 0;
135
136 //apply filter to original buffer, and we got new buffer back
137 //depend on what script it is, we will feed them the new buffer
138 //we got after applying proper filter
139 //this is done without any consideration to KeepEnglishLetters
140 //of each prober since as of now, there are no probers here which
141 //recognize languages with English characters.
142 if (!FilterWithoutEnglishLetters(aBuf, aLen, &newBuf1, newLen1))
143 goto done;
144
145 if (newLen1 == 0)
146 goto done; // Nothing to see here, move on.
147
148 for (i = 0; i < NUM_OF_SBCS_PROBERS; i++)
149 {
150 if (!mIsActive[i])
151 continue;
152 st = mProbers[i]->HandleData(newBuf1, newLen1);
153 if (st == eFoundIt)
154 {
155 mBestGuess = i;
156 mState = eFoundIt;
157 break;
158 }
159 else if (st == eNotMe)
160 {
161 mIsActive[i] = PR_FALSE;
162 mActiveNum--;
163 if (mActiveNum <= 0)
164 {
165 mState = eNotMe;
166 break;
167 }
168 }
169 }
170
171 done:
172 PR_FREEIF(newBuf1);
173
174 return mState;
175 }
176
177 float nsSBCSGroupProber::GetConfidence(void)
178 {
179 PRUint32 i;
180 float bestConf = 0.0, cf;
181
182 switch (mState)
183 {
184 case eFoundIt:
185 return (float)0.99; //sure yes
186 case eNotMe:
187 return (float)0.01; //sure no
188 default:
189 for (i = 0; i < NUM_OF_SBCS_PROBERS; i++)
190 {
191 if (!mIsActive[i])
192 continue;
193 cf = mProbers[i]->GetConfidence();
194 if (bestConf < cf)
195 {
196 bestConf = cf;
197 mBestGuess = i;
198 }
199 }
200 }
201 return bestConf;
202 }
203
204 #ifdef DEBUG_chardet
205 void nsSBCSGroupProber::DumpStatus()
206 {
207 PRUint32 i;
208 float cf;
209
210 cf = GetConfidence();
211 printf(" SBCS Group Prober --------begin status \r\n");
212 for (i = 0; i < NUM_OF_SBCS_PROBERS; i++)
213 {
214 if (!mIsActive[i])
215 printf(" inactive: [%s] (i.e. confidence is too low).\r\n", mProbers[i]->GetCharSetName());
216 else
217 mProbers[i]->DumpStatus();
218 }
219 printf(" SBCS Group found best match [%s] confidence %f.\r\n",
220 mProbers[mBestGuess]->GetCharSetName(), cf);
221 }
222 #endif
+0
-70
c/src/nsSBCSGroupProber.h less more
0 /* -*- Mode: C; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
1 /* ***** BEGIN LICENSE BLOCK *****
2 * Version: MPL 1.1/GPL 2.0/LGPL 2.1
3 *
4 * The contents of this file are subject to the Mozilla Public License Version
5 * 1.1 (the "License"); you may not use this file except in compliance with
6 * the License. You may obtain a copy of the License at
7 * http://www.mozilla.org/MPL/
8 *
9 * Software distributed under the License is distributed on an "AS IS" basis,
10 * WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License
11 * for the specific language governing rights and limitations under the
12 * License.
13 *
14 * The Original Code is Mozilla Universal charset detector code.
15 *
16 * The Initial Developer of the Original Code is
17 * Netscape Communications Corporation.
18 * Portions created by the Initial Developer are Copyright (C) 2001
19 * the Initial Developer. All Rights Reserved.
20 *
21 * Contributor(s):
22 * Shy Shalom <shooshX@gmail.com>
23 *
24 * Alternatively, the contents of this file may be used under the terms of
25 * either the GNU General Public License Version 2 or later (the "GPL"), or
26 * the GNU Lesser General Public License Version 2.1 or later (the "LGPL"),
27 * in which case the provisions of the GPL or the LGPL are applicable instead
28 * of those above. If you wish to allow use of your version of this file only
29 * under the terms of either the GPL or the LGPL, and not to allow others to
30 * use your version of this file under the terms of the MPL, indicate your
31 * decision by deleting the provisions above and replace them with the notice
32 * and other provisions required by the GPL or the LGPL. If you do not delete
33 * the provisions above, a recipient may use your version of this file under
34 * the terms of any one of the MPL, the GPL or the LGPL.
35 *
36 * ***** END LICENSE BLOCK ***** */
37
38 #ifndef nsSBCSGroupProber_h__
39 #define nsSBCSGroupProber_h__
40
41
42 #define NUM_OF_SBCS_PROBERS 13
43
44 class nsCharSetProber;
45 class nsSBCSGroupProber: public nsCharSetProber {
46 public:
47 nsSBCSGroupProber();
48 virtual ~nsSBCSGroupProber();
49 nsProbingState HandleData(const char* aBuf, PRUint32 aLen);
50 const char* GetCharSetName();
51 nsProbingState GetState(void) {return mState;}
52 void Reset(void);
53 float GetConfidence(void);
54 void SetOpion() {}
55
56 #ifdef DEBUG_chardet
57 void DumpStatus();
58 #endif
59
60 protected:
61 nsProbingState mState;
62 nsCharSetProber* mProbers[NUM_OF_SBCS_PROBERS];
63 PRBool mIsActive[NUM_OF_SBCS_PROBERS];
64 PRInt32 mBestGuess;
65 PRUint32 mActiveNum;
66 };
67
68 #endif /* nsSBCSGroupProber_h__ */
69
+0
-126
c/src/nsSBCharSetProber.cpp less more
0 /* -*- Mode: C; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
1 /* ***** BEGIN LICENSE BLOCK *****
2 * Version: MPL 1.1/GPL 2.0/LGPL 2.1
3 *
4 * The contents of this file are subject to the Mozilla Public License Version
5 * 1.1 (the "License"); you may not use this file except in compliance with
6 * the License. You may obtain a copy of the License at
7 * http://www.mozilla.org/MPL/
8 *
9 * Software distributed under the License is distributed on an "AS IS" basis,
10 * WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License
11 * for the specific language governing rights and limitations under the
12 * License.
13 *
14 * The Original Code is Mozilla Universal charset detector code.
15 *
16 * The Initial Developer of the Original Code is
17 * Netscape Communications Corporation.
18 * Portions created by the Initial Developer are Copyright (C) 2001
19 * the Initial Developer. All Rights Reserved.
20 *
21 * Contributor(s):
22 * Shy Shalom <shooshX@gmail.com>
23 *
24 * Alternatively, the contents of this file may be used under the terms of
25 * either the GNU General Public License Version 2 or later (the "GPL"), or
26 * the GNU Lesser General Public License Version 2.1 or later (the "LGPL"),
27 * in which case the provisions of the GPL or the LGPL are applicable instead
28 * of those above. If you wish to allow use of your version of this file only
29 * under the terms of either the GPL or the LGPL, and not to allow others to
30 * use your version of this file under the terms of the MPL, indicate your
31 * decision by deleting the provisions above and replace them with the notice
32 * and other provisions required by the GPL or the LGPL. If you do not delete
33 * the provisions above, a recipient may use your version of this file under
34 * the terms of any one of the MPL, the GPL or the LGPL.
35 *
36 * ***** END LICENSE BLOCK ***** */
37 #include <stdio.h>
38 #include "nsSBCharSetProber.h"
39
40 nsProbingState nsSingleByteCharSetProber::HandleData(const char* aBuf, PRUint32 aLen)
41 {
42 unsigned char order;
43
44 for (PRUint32 i = 0; i < aLen; i++)
45 {
46 order = mModel->charToOrderMap[(unsigned char)aBuf[i]];
47
48 if (order < SYMBOL_CAT_ORDER)
49 mTotalChar++;
50 if (order < SAMPLE_SIZE)
51 {
52 mFreqChar++;
53
54 if (mLastOrder < SAMPLE_SIZE)
55 {
56 mTotalSeqs++;
57 if (!mReversed)
58 ++(mSeqCounters[mModel->precedenceMatrix[mLastOrder*SAMPLE_SIZE+order]]);
59 else // reverse the order of the letters in the lookup
60 ++(mSeqCounters[mModel->precedenceMatrix[order*SAMPLE_SIZE+mLastOrder]]);
61 }
62 }
63 mLastOrder = order;
64 }
65
66 if (mState == eDetecting)
67 if (mTotalSeqs > SB_ENOUGH_REL_THRESHOLD)
68 {
69 float cf = GetConfidence();
70 if (cf > POSITIVE_SHORTCUT_THRESHOLD)
71 mState = eFoundIt;
72 else if (cf < NEGATIVE_SHORTCUT_THRESHOLD)
73 mState = eNotMe;
74 }
75
76 return mState;
77 }
78
79 void nsSingleByteCharSetProber::Reset(void)
80 {
81 mState = eDetecting;
82 mLastOrder = 255;
83 for (PRUint32 i = 0; i < NUMBER_OF_SEQ_CAT; i++)
84 mSeqCounters[i] = 0;
85 mTotalSeqs = 0;
86 mTotalChar = 0;
87 mFreqChar = 0;
88 }
89
90 //#define NEGATIVE_APPROACH 1
91
92 float nsSingleByteCharSetProber::GetConfidence(void)
93 {
94 #ifdef NEGATIVE_APPROACH
95 if (mTotalSeqs > 0)
96 if (mTotalSeqs > mSeqCounters[NEGATIVE_CAT]*10 )
97 return ((float)(mTotalSeqs - mSeqCounters[NEGATIVE_CAT]*10))/mTotalSeqs * mFreqChar / mTotalChar;
98 return (float)0.01;
99 #else //POSITIVE_APPROACH
100 float r;
101
102 if (mTotalSeqs > 0) {
103 r = ((float)1.0) * mSeqCounters[POSITIVE_CAT] / mTotalSeqs / mModel->mTypicalPositiveRatio;
104 r = r*mFreqChar/mTotalChar;
105 if (r >= (float)1.00)
106 r = (float)0.99;
107 return r;
108 }
109 return (float)0.01;
110 #endif
111 }
112
113 const char* nsSingleByteCharSetProber::GetCharSetName()
114 {
115 if (!mNameProber)
116 return mModel->charsetName;
117 return mNameProber->GetCharSetName();
118 }
119
120 #ifdef DEBUG_chardet
121 void nsSingleByteCharSetProber::DumpStatus()
122 {
123 printf(" SBCS: %1.3f [%s]\r\n", GetConfidence(), GetCharSetName());
124 }
125 #endif
+0
-124
c/src/nsSBCharSetProber.h less more
0 /* -*- Mode: C; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
1 /* ***** BEGIN LICENSE BLOCK *****
2 * Version: MPL 1.1/GPL 2.0/LGPL 2.1
3 *
4 * The contents of this file are subject to the Mozilla Public License Version
5 * 1.1 (the "License"); you may not use this file except in compliance with
6 * the License. You may obtain a copy of the License at
7 * http://www.mozilla.org/MPL/
8 *
9 * Software distributed under the License is distributed on an "AS IS" basis,
10 * WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License
11 * for the specific language governing rights and limitations under the
12 * License.
13 *
14 * The Original Code is Mozilla Universal charset detector code.
15 *
16 * The Initial Developer of the Original Code is
17 * Netscape Communications Corporation.
18 * Portions created by the Initial Developer are Copyright (C) 2001
19 * the Initial Developer. All Rights Reserved.
20 *
21 * Contributor(s):
22 * Shy Shalom <shooshX@gmail.com>
23 *
24 * Alternatively, the contents of this file may be used under the terms of
25 * either the GNU General Public License Version 2 or later (the "GPL"), or
26 * the GNU Lesser General Public License Version 2.1 or later (the "LGPL"),
27 * in which case the provisions of the GPL or the LGPL are applicable instead
28 * of those above. If you wish to allow use of your version of this file only
29 * under the terms of either the GPL or the LGPL, and not to allow others to
30 * use your version of this file under the terms of the MPL, indicate your
31 * decision by deleting the provisions above and replace them with the notice
32 * and other provisions required by the GPL or the LGPL. If you do not delete
33 * the provisions above, a recipient may use your version of this file under
34 * the terms of any one of the MPL, the GPL or the LGPL.
35 *
36 * ***** END LICENSE BLOCK ***** */
37 #ifndef nsSingleByteCharSetProber_h__
38 #define nsSingleByteCharSetProber_h__
39
40 #include "nsCharSetProber.h"
41
42 #define SAMPLE_SIZE 64
43 #define SB_ENOUGH_REL_THRESHOLD 1024
44 #define POSITIVE_SHORTCUT_THRESHOLD (float)0.95
45 #define NEGATIVE_SHORTCUT_THRESHOLD (float)0.05
46 #define SYMBOL_CAT_ORDER 250
47 #define NUMBER_OF_SEQ_CAT 4
48 #define POSITIVE_CAT (NUMBER_OF_SEQ_CAT-1)
49 #define NEGATIVE_CAT 0
50
51 typedef struct
52 {
53 unsigned char *charToOrderMap; // [256] table use to find a char's order
54 char *precedenceMatrix; // [SAMPLE_SIZE][SAMPLE_SIZE]; table to find a 2-char sequence's frequency
55 float mTypicalPositiveRatio; // = freqSeqs / totalSeqs
56 PRBool keepEnglishLetter; // says if this script contains English characters (not implemented)
57 const char* charsetName;
58 } SequenceModel;
59
60
61 class nsSingleByteCharSetProber : public nsCharSetProber{
62 public:
63 nsSingleByteCharSetProber(SequenceModel *model)
64 :mModel(model), mReversed(PR_FALSE), mNameProber(0) { Reset(); }
65 nsSingleByteCharSetProber(SequenceModel *model, PRBool reversed, nsCharSetProber* nameProber)
66 :mModel(model), mReversed(reversed), mNameProber(nameProber) { Reset(); }
67
68 virtual const char* GetCharSetName();
69 virtual nsProbingState HandleData(const char* aBuf, PRUint32 aLen);
70 virtual nsProbingState GetState(void) {return mState;}
71 virtual void Reset(void);
72 virtual float GetConfidence(void);
73 virtual void SetOpion() {}
74
75 // This feature is not implemented yet. any current language model
76 // contain this parameter as PR_FALSE. No one is looking at this
77 // parameter or calling this method.
78 // Moreover, the nsSBCSGroupProber which calls the HandleData of this
79 // prober has a hard-coded call to FilterWithoutEnglishLetters which gets rid
80 // of the English letters.
81 PRBool KeepEnglishLetters() {return mModel->keepEnglishLetter;} // (not implemented)
82
83 #ifdef DEBUG_chardet
84 virtual void DumpStatus();
85 #endif
86
87 protected:
88 nsProbingState mState;
89 const SequenceModel *mModel;
90 const PRBool mReversed; // PR_TRUE if we need to reverse every pair in the model lookup
91
92 //char order of last character
93 unsigned char mLastOrder;
94
95 PRUint32 mTotalSeqs;
96 PRUint32 mSeqCounters[NUMBER_OF_SEQ_CAT];
97
98 PRUint32 mTotalChar;
99 //characters that fall in our sampling range
100 PRUint32 mFreqChar;
101
102 // Optional auxiliary prober for name decision. created and destroyed by the GroupProber
103 nsCharSetProber* mNameProber;
104
105 };
106
107
108 extern SequenceModel Koi8rModel;
109 extern SequenceModel Win1251Model;
110 extern SequenceModel Latin5Model;
111 extern SequenceModel MacCyrillicModel;
112 extern SequenceModel Ibm866Model;
113 extern SequenceModel Ibm855Model;
114 extern SequenceModel Latin7Model;
115 extern SequenceModel Win1253Model;
116 extern SequenceModel Latin5BulgarianModel;
117 extern SequenceModel Win1251BulgarianModel;
118 extern SequenceModel Latin2HungarianModel;
119 extern SequenceModel Win1250HungarianModel;
120 extern SequenceModel Win1255Model;
121
122 #endif /* nsSingleByteCharSetProber_h__ */
123
+0
-103
c/src/nsSJISProber.cpp less more
0 /* -*- Mode: C; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
1 /* ***** BEGIN LICENSE BLOCK *****
2 * Version: MPL 1.1/GPL 2.0/LGPL 2.1
3 *
4 * The contents of this file are subject to the Mozilla Public License Version
5 * 1.1 (the "License"); you may not use this file except in compliance with
6 * the License. You may obtain a copy of the License at
7 * http://www.mozilla.org/MPL/
8 *
9 * Software distributed under the License is distributed on an "AS IS" basis,
10 * WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License
11 * for the specific language governing rights and limitations under the
12 * License.
13 *
14 * The Original Code is mozilla.org code.
15 *
16 * The Initial Developer of the Original Code is
17 * Netscape Communications Corporation.
18 * Portions created by the Initial Developer are Copyright (C) 1998
19 * the Initial Developer. All Rights Reserved.
20 *
21 * Contributor(s):
22 *
23 * Alternatively, the contents of this file may be used under the terms of
24 * either the GNU General Public License Version 2 or later (the "GPL"), or
25 * the GNU Lesser General Public License Version 2.1 or later (the "LGPL"),
26 * in which case the provisions of the GPL or the LGPL are applicable instead
27 * of those above. If you wish to allow use of your version of this file only
28 * under the terms of either the GPL or the LGPL, and not to allow others to
29 * use your version of this file under the terms of the MPL, indicate your
30 * decision by deleting the provisions above and replace them with the notice
31 * and other provisions required by the GPL or the LGPL. If you do not delete
32 * the provisions above, a recipient may use your version of this file under
33 * the terms of any one of the MPL, the GPL or the LGPL.
34 *
35 * ***** END LICENSE BLOCK ***** */
36
37 // for S-JIS encoding, obeserve characteristic:
38 // 1, kana character (or hankaku?) often have hight frequency of appereance
39 // 2, kana character often exist in group
40 // 3, certain combination of kana is never used in japanese language
41
42 #include "nsSJISProber.h"
43
44 void nsSJISProber::Reset(void)
45 {
46 mCodingSM->Reset();
47 mState = eDetecting;
48 mContextAnalyser.Reset();
49 mDistributionAnalyser.Reset();
50 }
51
52 nsProbingState nsSJISProber::HandleData(const char* aBuf, PRUint32 aLen)
53 {
54 nsSMState codingState;
55
56 for (PRUint32 i = 0; i < aLen; i++)
57 {
58 codingState = mCodingSM->NextState(aBuf[i]);
59 if (codingState == eError)
60 {
61 mState = eNotMe;
62 break;
63 }
64 if (codingState == eItsMe)
65 {
66 mState = eFoundIt;
67 break;
68 }
69 if (codingState == eStart)
70 {
71 PRUint32 charLen = mCodingSM->GetCurrentCharLen();
72 if (i == 0)
73 {
74 mLastChar[1] = aBuf[0];
75 mContextAnalyser.HandleOneChar(mLastChar+2-charLen, charLen);
76 mDistributionAnalyser.HandleOneChar(mLastChar, charLen);
77 }
78 else
79 {
80 mContextAnalyser.HandleOneChar(aBuf+i+1-charLen, charLen);
81 mDistributionAnalyser.HandleOneChar(aBuf+i-1, charLen);
82 }
83 }
84 }
85
86 mLastChar[0] = aBuf[aLen-1];
87
88 if (mState == eDetecting)
89 if (mContextAnalyser.GotEnoughData() && GetConfidence() > SHORTCUT_THRESHOLD)
90 mState = eFoundIt;
91
92 return mState;
93 }
94
95 float nsSJISProber::GetConfidence(void)
96 {
97 float contxtCf = mContextAnalyser.GetConfidence();
98 float distribCf = mDistributionAnalyser.GetConfidence();
99
100 return (contxtCf > distribCf ? contxtCf : distribCf);
101 }
102
+0
-78
c/src/nsSJISProber.h less more
0 /* -*- Mode: C; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
1 /* ***** BEGIN LICENSE BLOCK *****
2 * Version: MPL 1.1/GPL 2.0/LGPL 2.1
3 *
4 * The contents of this file are subject to the Mozilla Public License Version
5 * 1.1 (the "License"); you may not use this file except in compliance with
6 * the License. You may obtain a copy of the License at
7 * http://www.mozilla.org/MPL/
8 *
9 * Software distributed under the License is distributed on an "AS IS" basis,
10 * WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License
11 * for the specific language governing rights and limitations under the
12 * License.
13 *
14 * The Original Code is mozilla.org code.
15 *
16 * The Initial Developer of the Original Code is
17 * Netscape Communications Corporation.
18 * Portions created by the Initial Developer are Copyright (C) 1998
19 * the Initial Developer. All Rights Reserved.
20 *
21 * Contributor(s):
22 *
23 * Alternatively, the contents of this file may be used under the terms of
24 * either the GNU General Public License Version 2 or later (the "GPL"), or
25 * the GNU Lesser General Public License Version 2.1 or later (the "LGPL"),
26 * in which case the provisions of the GPL or the LGPL are applicable instead
27 * of those above. If you wish to allow use of your version of this file only
28 * under the terms of either the GPL or the LGPL, and not to allow others to
29 * use your version of this file under the terms of the MPL, indicate your
30 * decision by deleting the provisions above and replace them with the notice
31 * and other provisions required by the GPL or the LGPL. If you do not delete
32 * the provisions above, a recipient may use your version of this file under
33 * the terms of any one of the MPL, the GPL or the LGPL.
34 *
35 * ***** END LICENSE BLOCK ***** */
36
37 // for S-JIS encoding, obeserve characteristic:
38 // 1, kana character (or hankaku?) often have hight frequency of appereance
39 // 2, kana character often exist in group
40 // 3, certain combination of kana is never used in japanese language
41
42 #ifndef nsSJISProber_h__
43 #define nsSJISProber_h__
44
45 #include "universalchardet.h"
46 #include "nsCharSetProber.h"
47 #include "nsCodingStateMachine.h"
48 #include "JpCntx.h"
49 #include "CharDistribution.h"
50
51
52 class nsSJISProber: public nsCharSetProber {
53 public:
54 nsSJISProber(void){mCodingSM = new nsCodingStateMachine(&SJISSMModel);
55 Reset();}
56 virtual ~nsSJISProber(void){delete mCodingSM;}
57 nsProbingState HandleData(const char* aBuf, PRUint32 aLen);
58 const char* GetCharSetName() {return CHARDET_ENCODING_SHIFT_JIS;}
59 nsProbingState GetState(void) {return mState;}
60 void Reset(void);
61 float GetConfidence(void);
62 void SetOpion() {}
63
64 protected:
65 nsCodingStateMachine* mCodingSM;
66 nsProbingState mState;
67
68 SJISContextAnalysis mContextAnalyser;
69 SJISDistributionAnalysis mDistributionAnalyser;
70
71 char mLastChar[2];
72
73 };
74
75
76 #endif /* nsSJISProber_h__ */
77
+0
-92
c/src/nsUTF8Prober.cpp less more
0 /* -*- Mode: C; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
1 /* ***** BEGIN LICENSE BLOCK *****
2 * Version: MPL 1.1/GPL 2.0/LGPL 2.1
3 *
4 * The contents of this file are subject to the Mozilla Public License Version
5 * 1.1 (the "License"); you may not use this file except in compliance with
6 * the License. You may obtain a copy of the License at
7 * http://www.mozilla.org/MPL/
8 *
9 * Software distributed under the License is distributed on an "AS IS" basis,
10 * WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License
11 * for the specific language governing rights and limitations under the
12 * License.
13 *
14 * The Original Code is mozilla.org code.
15 *
16 * The Initial Developer of the Original Code is
17 * Netscape Communications Corporation.
18 * Portions created by the Initial Developer are Copyright (C) 1998
19 * the Initial Developer. All Rights Reserved.
20 *
21 * Contributor(s):
22 *
23 * Alternatively, the contents of this file may be used under the terms of
24 * either the GNU General Public License Version 2 or later (the "GPL"), or
25 * the GNU Lesser General Public License Version 2.1 or later (the "LGPL"),
26 * in which case the provisions of the GPL or the LGPL are applicable instead
27 * of those above. If you wish to allow use of your version of this file only
28 * under the terms of either the GPL or the LGPL, and not to allow others to
29 * use your version of this file under the terms of the MPL, indicate your
30 * decision by deleting the provisions above and replace them with the notice
31 * and other provisions required by the GPL or the LGPL. If you do not delete
32 * the provisions above, a recipient may use your version of this file under
33 * the terms of any one of the MPL, the GPL or the LGPL.
34 *
35 * ***** END LICENSE BLOCK ***** */
36
37 #include "nsUTF8Prober.h"
38
39 void nsUTF8Prober::Reset(void)
40 {
41 mCodingSM->Reset();
42 mNumOfMBChar = 0;
43 mState = eDetecting;
44 }
45
46 nsProbingState nsUTF8Prober::HandleData(const char* aBuf, PRUint32 aLen)
47 {
48 nsSMState codingState;
49
50 for (PRUint32 i = 0; i < aLen; i++)
51 {
52 codingState = mCodingSM->NextState(aBuf[i]);
53 if (codingState == eError)
54 {
55 mState = eNotMe;
56 break;
57 }
58 if (codingState == eItsMe)
59 {
60 mState = eFoundIt;
61 break;
62 }
63 if (codingState == eStart)
64 {
65 if (mCodingSM->GetCurrentCharLen() >= 2)
66 mNumOfMBChar++;
67 }
68 }
69
70 if (mState == eDetecting)
71 if (GetConfidence() > SHORTCUT_THRESHOLD)
72 mState = eFoundIt;
73 return mState;
74 }
75
76 #define ONE_CHAR_PROB (float)0.50
77
78 float nsUTF8Prober::GetConfidence(void)
79 {
80 float unlike = (float)0.99;
81
82 if (mNumOfMBChar < 6)
83 {
84 for (PRUint32 i = 0; i < mNumOfMBChar; i++)
85 unlike *= ONE_CHAR_PROB;
86 return (float)1.0 - unlike;
87 }
88 else
89 return (float)0.99;
90 }
91
+0
-65
c/src/nsUTF8Prober.h less more
0 /* -*- Mode: C; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
1 /* ***** BEGIN LICENSE BLOCK *****
2 * Version: MPL 1.1/GPL 2.0/LGPL 2.1
3 *
4 * The contents of this file are subject to the Mozilla Public License Version
5 * 1.1 (the "License"); you may not use this file except in compliance with
6 * the License. You may obtain a copy of the License at
7 * http://www.mozilla.org/MPL/
8 *
9 * Software distributed under the License is distributed on an "AS IS" basis,
10 * WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License
11 * for the specific language governing rights and limitations under the
12 * License.
13 *
14 * The Original Code is mozilla.org code.
15 *
16 * The Initial Developer of the Original Code is
17 * Netscape Communications Corporation.
18 * Portions created by the Initial Developer are Copyright (C) 1998
19 * the Initial Developer. All Rights Reserved.
20 *
21 * Contributor(s):
22 *
23 * Alternatively, the contents of this file may be used under the terms of
24 * either the GNU General Public License Version 2 or later (the "GPL"), or
25 * the GNU Lesser General Public License Version 2.1 or later (the "LGPL"),
26 * in which case the provisions of the GPL or the LGPL are applicable instead
27 * of those above. If you wish to allow use of your version of this file only
28 * under the terms of either the GPL or the LGPL, and not to allow others to
29 * use your version of this file under the terms of the MPL, indicate your
30 * decision by deleting the provisions above and replace them with the notice
31 * and other provisions required by the GPL or the LGPL. If you do not delete
32 * the provisions above, a recipient may use your version of this file under
33 * the terms of any one of the MPL, the GPL or the LGPL.
34 *
35 * ***** END LICENSE BLOCK ***** */
36
37 #ifndef nsUTF8Prober_h__
38 #define nsUTF8Prober_h__
39
40 #include "universalchardet.h"
41 #include "nsCharSetProber.h"
42 #include "nsCodingStateMachine.h"
43
44 class nsUTF8Prober: public nsCharSetProber {
45 public:
46 nsUTF8Prober(){mNumOfMBChar = 0;
47 mCodingSM = new nsCodingStateMachine(&UTF8SMModel);
48 Reset(); }
49 virtual ~nsUTF8Prober(){delete mCodingSM;}
50 nsProbingState HandleData(const char* aBuf, PRUint32 aLen);
51 const char* GetCharSetName() {return CHARDET_ENCODING_UTF_8;}
52 nsProbingState GetState(void) {return mState;}
53 void Reset(void);
54 float GetConfidence(void);
55 void SetOpion() {}
56
57 protected:
58 nsCodingStateMachine* mCodingSM;
59 nsProbingState mState;
60 PRUint32 mNumOfMBChar;
61 };
62
63 #endif /* nsUTF8Prober_h__ */
64
+0
-281
c/src/nsUniversalDetector.cpp less more
0 /* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
1 /* ***** BEGIN LICENSE BLOCK *****
2 * Version: MPL 1.1/GPL 2.0/LGPL 2.1
3 *
4 * The contents of this file are subject to the Mozilla Public License Version
5 * 1.1 (the "License"); you may not use this file except in compliance with
6 * the License. You may obtain a copy of the License at
7 * http://www.mozilla.org/MPL/
8 *
9 * Software distributed under the License is distributed on an "AS IS" basis,
10 * WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License
11 * for the specific language governing rights and limitations under the
12 * License.
13 *
14 * The Original Code is Mozilla Universal charset detector code.
15 *
16 * The Initial Developer of the Original Code is
17 * Netscape Communications Corporation.
18 * Portions created by the Initial Developer are Copyright (C) 2001
19 * the Initial Developer. All Rights Reserved.
20 *
21 * Contributor(s):
22 * Shy Shalom <shooshX@gmail.com>
23 *
24 * Alternatively, the contents of this file may be used under the terms of
25 * either the GNU General Public License Version 2 or later (the "GPL"), or
26 * the GNU Lesser General Public License Version 2.1 or later (the "LGPL"),
27 * in which case the provisions of the GPL or the LGPL are applicable instead
28 * of those above. If you wish to allow use of your version of this file only
29 * under the terms of either the GPL or the LGPL, and not to allow others to
30 * use your version of this file under the terms of the MPL, indicate your
31 * decision by deleting the provisions above and replace them with the notice
32 * and other provisions required by the GPL or the LGPL. If you do not delete
33 * the provisions above, a recipient may use your version of this file under
34 * the terms of any one of the MPL, the GPL or the LGPL.
35 *
36 * ***** END LICENSE BLOCK ***** */
37
38 #include "nscore.h"
39
40 #include "universalchardet.h"
41 #include "nsUniversalDetector.h"
42
43 #include "nsMBCSGroupProber.h"
44 #include "nsSBCSGroupProber.h"
45 #include "nsEscCharsetProber.h"
46 #include "nsLatin1Prober.h"
47
48 nsUniversalDetector::nsUniversalDetector()
49 {
50 mDone = PR_FALSE;
51 mBestGuess = -1; //illegal value as signal
52 mInTag = PR_FALSE;
53 mEscCharSetProber = nsnull;
54
55 mStart = PR_TRUE;
56 mDetectedCharset = nsnull;
57 mGotData = PR_FALSE;
58 mInputState = ePureAscii;
59 mLastChar = '\0';
60
61 PRUint32 i;
62 for (i = 0; i < NUM_OF_CHARSET_PROBERS; i++)
63 mCharSetProbers[i] = nsnull;
64 }
65
66 nsUniversalDetector::~nsUniversalDetector()
67 {
68 for (PRInt32 i = 0; i < NUM_OF_CHARSET_PROBERS; i++)
69 if (mCharSetProbers[i])
70 delete mCharSetProbers[i];
71 if (mEscCharSetProber)
72 delete mEscCharSetProber;
73 }
74
75 void
76 nsUniversalDetector::Reset()
77 {
78 mDone = PR_FALSE;
79 mBestGuess = -1; //illegal value as signal
80 mInTag = PR_FALSE;
81
82 mStart = PR_TRUE;
83 mDetectedCharset = nsnull;
84 mGotData = PR_FALSE;
85 mInputState = ePureAscii;
86 mLastChar = '\0';
87
88 if (mEscCharSetProber)
89 mEscCharSetProber->Reset();
90
91 PRUint32 i;
92 for (i = 0; i < NUM_OF_CHARSET_PROBERS; i++)
93 if (mCharSetProbers[i])
94 mCharSetProbers[i]->Reset();
95 }
96
97 //---------------------------------------------------------------------
98 #define SHORTCUT_THRESHOLD (float)0.95
99 #define MINIMUM_THRESHOLD (float)0.20
100
101 nsresult nsUniversalDetector::HandleData(const char* aBuf, PRUint32 aLen)
102 {
103 if(mDone)
104 return NS_OK;
105
106 if (aLen > 0)
107 mGotData = PR_TRUE;
108
109 //If the data starts with BOM, we know it is UTF
110 if (mStart)
111 {
112 mStart = PR_FALSE;
113 if (aLen > 3)
114 switch (aBuf[0])
115 {
116 case '\xEF':
117 if (('\xBB' == aBuf[1]) && ('\xBF' == aBuf[2]))
118 // EF BB BF UTF-8 encoded BOM
119 mDetectedCharset = CHARDET_ENCODING_UTF_8;
120 break;
121 case '\xFE':
122 if (('\xFF' == aBuf[1]) && ('\x00' == aBuf[2]) && ('\x00' == aBuf[3]))
123 // FE FF 00 00 UCS-4, unusual octet order BOM (3412)
124 mDetectedCharset = CHARDET_ENCODING_X_ISO_10646_UCS_4_3412;
125 else if ('\xFF' == aBuf[1])
126 // FE FF UTF-16, big endian BOM
127 mDetectedCharset = CHARDET_ENCODING_UTF_16BE;
128 break;
129 case '\x00':
130 if (('\x00' == aBuf[1]) && ('\xFE' == aBuf[2]) && ('\xFF' == aBuf[3]))
131 // 00 00 FE FF UTF-32, big-endian BOM
132 mDetectedCharset = CHARDET_ENCODING_UTF_32BE;
133 else if (('\x00' == aBuf[1]) && ('\xFF' == aBuf[2]) && ('\xFE' == aBuf[3]))
134 // 00 00 FF FE UCS-4, unusual octet order BOM (2143)
135 mDetectedCharset = CHARDET_ENCODING_X_ISO_10646_UCS_4_2143;
136 break;
137 case '\xFF':
138 if (('\xFE' == aBuf[1]) && ('\x00' == aBuf[2]) && ('\x00' == aBuf[3]))
139 // FF FE 00 00 UTF-32, little-endian BOM
140 mDetectedCharset = CHARDET_ENCODING_UTF_32LE;
141 else if ('\xFE' == aBuf[1])
142 // FF FE UTF-16, little endian BOM
143 mDetectedCharset = CHARDET_ENCODING_UTF_16LE;
144 break;
145 } // switch
146
147 if (mDetectedCharset)
148 {
149 mDone = PR_TRUE;
150 return NS_OK;
151 }
152 }
153
154 PRUint32 i;
155 for (i = 0; i < aLen; i++)
156 {
157 //other than 0xa0, if every othe character is ascii, the page is ascii
158 if (aBuf[i] & '\x80' && aBuf[i] != '\xA0') //Since many Ascii only page contains NBSP
159 {
160 //we got a non-ascii byte (high-byte)
161 if (mInputState != eHighbyte)
162 {
163 //adjust state
164 mInputState = eHighbyte;
165
166 //kill mEscCharSetProber if it is active
167 if (mEscCharSetProber) {
168 delete mEscCharSetProber;
169 mEscCharSetProber = nsnull;
170 }
171
172 //start multibyte and singlebyte charset prober
173 if (nsnull == mCharSetProbers[0])
174 mCharSetProbers[0] = new nsMBCSGroupProber;
175 if (nsnull == mCharSetProbers[1])
176 mCharSetProbers[1] = new nsSBCSGroupProber;
177 if (nsnull == mCharSetProbers[2])
178 mCharSetProbers[2] = new nsLatin1Prober;
179
180 if ((nsnull == mCharSetProbers[0]) ||
181 (nsnull == mCharSetProbers[1]) ||
182 (nsnull == mCharSetProbers[2]))
183 return NS_ERROR_OUT_OF_MEMORY;
184 }
185 }
186 else
187 {
188 //ok, just pure ascii so far
189 if ( ePureAscii == mInputState &&
190 (aBuf[i] == '\033' || (aBuf[i] == '{' && mLastChar == '~')) )
191 {
192 //found escape character or HZ "~{"
193 mInputState = eEscAscii;
194 }
195 mLastChar = aBuf[i];
196 }
197 }
198
199 nsProbingState st;
200 switch (mInputState)
201 {
202 case eEscAscii:
203 if (nsnull == mEscCharSetProber) {
204 mEscCharSetProber = new nsEscCharSetProber;
205 if (nsnull == mEscCharSetProber)
206 return NS_ERROR_OUT_OF_MEMORY;
207 }
208 st = mEscCharSetProber->HandleData(aBuf, aLen);
209 if (st == eFoundIt)
210 {
211 mDone = PR_TRUE;
212 mDetectedCharset = mEscCharSetProber->GetCharSetName();
213 }
214 break;
215 case eHighbyte:
216 for (i = 0; i < NUM_OF_CHARSET_PROBERS; i++)
217 {
218 st = mCharSetProbers[i]->HandleData(aBuf, aLen);
219 if (st == eFoundIt)
220 {
221 mDone = PR_TRUE;
222 mDetectedCharset = mCharSetProbers[i]->GetCharSetName();
223 return NS_OK;
224 }
225 }
226 break;
227
228 default: //pure ascii
229 ;//do nothing here
230 }
231 return NS_OK;
232 }
233
234
235 //---------------------------------------------------------------------
236 void nsUniversalDetector::DataEnd()
237 {
238 if (!mGotData)
239 {
240 // we haven't got any data yet, return immediately
241 // caller program sometimes call DataEnd before anything has been sent to detector
242 return;
243 }
244
245 if (mDetectedCharset)
246 {
247 mDone = PR_TRUE;
248 Report(mDetectedCharset);
249 return;
250 }
251
252 switch (mInputState)
253 {
254 case eHighbyte:
255 {
256 float proberConfidence;
257 float maxProberConfidence = (float)0.0;
258 PRInt32 maxProber = 0;
259
260 for (PRInt32 i = 0; i < NUM_OF_CHARSET_PROBERS; i++)
261 {
262 proberConfidence = mCharSetProbers[i]->GetConfidence();
263 if (proberConfidence > maxProberConfidence)
264 {
265 maxProberConfidence = proberConfidence;
266 maxProber = i;
267 }
268 }
269 //do not report anything because we are not confident of it, that's in fact a negative answer
270 if (maxProberConfidence > MINIMUM_THRESHOLD)
271 Report(mCharSetProbers[maxProber]->GetCharSetName());
272 }
273 break;
274 case eEscAscii:
275 break;
276 default:
277 ;
278 }
279 return;
280 }
+0
-75
c/src/nsUniversalDetector.h less more
0 /* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
1 /* ***** BEGIN LICENSE BLOCK *****
2 * Version: MPL 1.1/GPL 2.0/LGPL 2.1
3 *
4 * The contents of this file are subject to the Mozilla Public License Version
5 * 1.1 (the "License"); you may not use this file except in compliance with
6 * the License. You may obtain a copy of the License at
7 * http://www.mozilla.org/MPL/
8 *
9 * Software distributed under the License is distributed on an "AS IS" basis,
10 * WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License
11 * for the specific language governing rights and limitations under the
12 * License.
13 *
14 * The Original Code is Mozilla Communicator client code.
15 *
16 * The Initial Developer of the Original Code is
17 * Netscape Communications Corporation.
18 * Portions created by the Initial Developer are Copyright (C) 1998
19 * the Initial Developer. All Rights Reserved.
20 *
21 * Contributor(s):
22 *
23 * Alternatively, the contents of this file may be used under the terms of
24 * either the GNU General Public License Version 2 or later (the "GPL"), or
25 * the GNU Lesser General Public License Version 2.1 or later (the "LGPL"),
26 * in which case the provisions of the GPL or the LGPL are applicable instead
27 * of those above. If you wish to allow use of your version of this file only
28 * under the terms of either the GPL or the LGPL, and not to allow others to
29 * use your version of this file under the terms of the MPL, indicate your
30 * decision by deleting the provisions above and replace them with the notice
31 * and other provisions required by the GPL or the LGPL. If you do not delete
32 * the provisions above, a recipient may use your version of this file under
33 * the terms of any one of the MPL, the GPL or the LGPL.
34 *
35 * ***** END LICENSE BLOCK ***** */
36
37 #ifndef nsUniversalDetector_h__
38 #define nsUniversalDetector_h__
39
40 class nsCharSetProber;
41
42 #define NUM_OF_CHARSET_PROBERS 3
43
44 typedef enum {
45 ePureAscii = 0,
46 eEscAscii = 1,
47 eHighbyte = 2
48 } nsInputState;
49
50 class nsUniversalDetector {
51 public:
52 nsUniversalDetector();
53 virtual ~nsUniversalDetector();
54 virtual nsresult HandleData(const char* aBuf, PRUint32 aLen);
55 virtual void DataEnd(void);
56
57 protected:
58 virtual void Report(const char* aCharset) = 0;
59 virtual void Reset();
60 nsInputState mInputState;
61 PRBool mDone;
62 PRBool mInTag;
63 PRBool mStart;
64 PRBool mGotData;
65 char mLastChar;
66 const char * mDetectedCharset;
67 PRInt32 mBestGuess;
68
69 nsCharSetProber *mCharSetProbers[NUM_OF_CHARSET_PROBERS];
70 nsCharSetProber *mEscCharSetProber;
71 };
72
73 #endif
74
+0
-57
c/src/nscore.h less more
0 /* ***** BEGIN LICENSE BLOCK *****
1 * Version: MPL 1.1/GPL 2.0/LGPL 2.1
2 *
3 * The contents of this file are subject to the Mozilla Public License Version
4 * 1.1 (the "License"); you may not use this file except in compliance with
5 * the License. You may obtain a copy of the License at
6 * http://www.mozilla.org/MPL/
7 *
8 * Software distributed under the License is distributed on an "AS IS" basis,
9 * WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License
10 * for the specific language governing rights and limitations under the
11 * License.
12 *
13 * The Original Code is Mozilla Universal charset detector code.
14 *
15 * The Initial Developer of the Original Code is
16 * Netscape Communications Corporation.
17 * Portions created by the Initial Developer are Copyright (C) 2001
18 * the Initial Developer. All Rights Reserved.
19 *
20 * Contributor(s):
21 * Kohei TAKETA <k-tak@void.in>
22 *
23 * Alternatively, the contents of this file may be used under the terms of
24 * either the GNU General Public License Version 2 or later (the "GPL"), or
25 * the GNU Lesser General Public License Version 2.1 or later (the "LGPL"),
26 * in which case the provisions of the GPL or the LGPL are applicable instead
27 * of those above. If you wish to allow use of your version of this file only
28 * under the terms of either the GPL or the LGPL, and not to allow others to
29 * use your version of this file under the terms of the MPL, indicate your
30 * decision by deleting the provisions above and replace them with the notice
31 * and other provisions required by the GPL or the LGPL. If you do not delete
32 * the provisions above, a recipient may use your version of this file under
33 * the terms of any one of the MPL, the GPL or the LGPL.
34 *
35 * ***** END LICENSE BLOCK ***** */
36 #ifndef nsDummyCore_h__
37 #define nsDummyCore_h__
38
39 typedef bool PRBool;
40 typedef int PRInt32;
41 typedef unsigned int PRUint32;
42 typedef short PRInt16;
43 typedef unsigned short PRUint16;
44
45 #define PR_FALSE false
46 #define PR_TRUE true
47 #define nsnull 0
48
49
50 enum nsresult
51 {
52 NS_OK,
53 NS_ERROR_OUT_OF_MEMORY
54 };
55
56 #endif
+0
-49
c/src/prmem.h less more
0 /* ***** BEGIN LICENSE BLOCK *****
1 * Version: MPL 1.1/GPL 2.0/LGPL 2.1
2 *
3 * The contents of this file are subject to the Mozilla Public License Version
4 * 1.1 (the "License"); you may not use this file except in compliance with
5 * the License. You may obtain a copy of the License at
6 * http://www.mozilla.org/MPL/
7 *
8 * Software distributed under the License is distributed on an "AS IS" basis,
9 * WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License
10 * for the specific language governing rights and limitations under the
11 * License.
12 *
13 * The Original Code is Mozilla Universal charset detector code.
14 *
15 * The Initial Developer of the Original Code is
16 * Netscape Communications Corporation.
17 * Portions created by the Initial Developer are Copyright (C) 2001
18 * the Initial Developer. All Rights Reserved.
19 *
20 * Contributor(s):
21 * Kohei TAKETA <k-tak@void.in>
22 *
23 * Alternatively, the contents of this file may be used under the terms of
24 * either the GNU General Public License Version 2 or later (the "GPL"), or
25 * the GNU Lesser General Public License Version 2.1 or later (the "LGPL"),
26 * in which case the provisions of the GPL or the LGPL are applicable instead
27 * of those above. If you wish to allow use of your version of this file only
28 * under the terms of either the GPL or the LGPL, and not to allow others to
29 * use your version of this file under the terms of the MPL, indicate your
30 * decision by deleting the provisions above and replace them with the notice
31 * and other provisions required by the GPL or the LGPL. If you do not delete
32 * the provisions above, a recipient may use your version of this file under
33 * the terms of any one of the MPL, the GPL or the LGPL.
34 *
35 * ***** END LICENSE BLOCK ***** */
36 #ifndef nsDummyPrmem_h__
37 #define nsDummyPrmem_h__
38
39 #include <cstdlib>
40
41 inline void* PR_Malloc(size_t len)
42 {
43 return malloc(len);
44 }
45
46 #define PR_FREEIF(p) if (p) free(p)
47
48 #endif
+0
-7
c/universalchardet/Makefile less more
0 all: chardet
1
2 chardet: universalchardet.c
3 gcc -O2 -o universalchardet universalchardet.c -luchardet
4
5 clean:
6 rm -f universalchardet
+0
-39
c/universalchardet/ReadMe.txt less more
0 ========================================================================
1 コンソール アプリケーション : universalchardet プロジェクトの概要
2 ========================================================================
3
4 この universalchardet アプリケーションは、AppWizard によって作成されました。
5
6 このファイルには、universalchardet アプリケーションを構成する各ファイルの
7 内容の概略が記述されています。
8
9
10 universalchardet.vcproj
11 これは、アプリケーション ウィザードで生成される VC++ プロジェクトのメインの
12 プロジェクト ファイルです。
13 ファイルを生成した Visual C++ のバージョン情報と、アプリケーション
14 ウィザードで選択したプラットフォーム、構成、およびプロジェクトの機能に関する
15 î•ñ‚ª‹Lq‚³‚ê‚Ä‚¢‚Ü‚·B
16
17 universalchardet.cpp
18 これは、メインのアプリケーション ソース ファイルです。
19
20 /////////////////////////////////////////////////////////////////////////////
21 その他の標準ファイル :
22
23 StdAfx.h, StdAfx.cpp
24 これらのファイルは、コンパイル済みヘッダー (PCH) ファイル
25 universalchardet.pch とプリコンパイル済み型ファイル StdAfx.obj を
26 ビルドするために使用します。
27
28 /////////////////////////////////////////////////////////////////////////////
29 ‚»‚Ì‘¼‚̃ƒ‚ :
30
31 AppWizard では "TODO:" コメントを使用して、ユーザーが追加またはカスタマイズする
32 ソース部分を示します。
33
34 /////////////////////////////////////////////////////////////////////////////
35
36
37
38
+0
-49
c/universalchardet/universalchardet.c less more
0 #include "universalchardet.h"
1
2 #include <stdio.h>
3
4
5 static void doit(FILE* fp)
6 {
7 char buf[4096];
8 char encoding[CHARDET_MAX_ENCODING_NAME];
9 size_t len;
10 int res = 0;
11 chardet_t det = NULL;
12
13 chardet_create(&det);
14
15 do {
16 len = fread(buf, 1, sizeof(buf), fp);
17 res = chardet_handle_data(det, buf, len);
18 } while (res==CHARDET_RESULT_OK && feof(fp)==0);
19
20 chardet_data_end(det);
21
22 chardet_get_charset(det, encoding, CHARDET_MAX_ENCODING_NAME);
23 printf("Charset = %s\n", encoding);
24
25 chardet_destroy(det);
26 }
27
28 int main(int argc, char* argv[])
29 {
30 FILE* fp = NULL;
31
32 if (argc > 1) {
33 fp = fopen(argv[1], "rb");
34 if (fp) {
35 doit(fp);
36 fclose(fp);
37 } else {
38 printf("Can't open %s\n", argv[1]);
39 return 1;
40 }
41 } else {
42 printf("USAGE: chardet filename\n");
43 return 1;
44 }
45
46 return 0;
47 }
48
+0
-203
c/universalchardet/universalchardet.vcproj less more
0 <?xml version="1.0" encoding="shift_jis"?>
1 <VisualStudioProject
2 ProjectType="Visual C++"
3 Version="9.00"
4 Name="universalchardet"
5 ProjectGUID="{3D96F3F3-7C46-4FEE-BD8D-BA19D8ED1DBB}"
6 RootNamespace="universalchardet"
7 Keyword="Win32Proj"
8 TargetFrameworkVersion="131072"
9 >
10 <Platforms>
11 <Platform
12 Name="Win32"
13 />
14 </Platforms>
15 <ToolFiles>
16 </ToolFiles>
17 <Configurations>
18 <Configuration
19 Name="Debug|Win32"
20 OutputDirectory="$(SolutionDir)$(ConfigurationName)"
21 IntermediateDirectory="$(ConfigurationName)"
22 ConfigurationType="1"
23 CharacterSet="1"
24 >
25 <Tool
26 Name="VCPreBuildEventTool"
27 />
28 <Tool
29 Name="VCCustomBuildTool"
30 />
31 <Tool
32 Name="VCXMLDataGeneratorTool"
33 />
34 <Tool
35 Name="VCWebServiceProxyGeneratorTool"
36 />
37 <Tool
38 Name="VCMIDLTool"
39 />
40 <Tool
41 Name="VCCLCompilerTool"
42 Optimization="0"
43 AdditionalIncludeDirectories="..\include"
44 PreprocessorDefinitions="WIN32;_DEBUG;_CONSOLE"
45 MinimalRebuild="true"
46 BasicRuntimeChecks="3"
47 RuntimeLibrary="1"
48 UsePrecompiledHeader="0"
49 WarningLevel="3"
50 Detect64BitPortabilityProblems="true"
51 DebugInformationFormat="4"
52 CompileAs="1"
53 />
54 <Tool
55 Name="VCManagedResourceCompilerTool"
56 />
57 <Tool
58 Name="VCResourceCompilerTool"
59 />
60 <Tool
61 Name="VCPreLinkEventTool"
62 />
63 <Tool
64 Name="VCLinkerTool"
65 LinkIncremental="2"
66 GenerateDebugInformation="true"
67 SubSystem="1"
68 RandomizedBaseAddress="1"
69 DataExecutionPrevention="0"
70 TargetMachine="1"
71 />
72 <Tool
73 Name="VCALinkTool"
74 />
75 <Tool
76 Name="VCManifestTool"
77 />
78 <Tool
79 Name="VCXDCMakeTool"
80 />
81 <Tool
82 Name="VCBscMakeTool"
83 />
84 <Tool
85 Name="VCFxCopTool"
86 />
87 <Tool
88 Name="VCAppVerifierTool"
89 />
90 <Tool
91 Name="VCPostBuildEventTool"
92 />
93 </Configuration>
94 <Configuration
95 Name="Release|Win32"
96 OutputDirectory="$(SolutionDir)$(ConfigurationName)"
97 IntermediateDirectory="$(ConfigurationName)"
98 ConfigurationType="1"
99 CharacterSet="1"
100 WholeProgramOptimization="1"
101 >
102 <Tool
103 Name="VCPreBuildEventTool"
104 />
105 <Tool
106 Name="VCCustomBuildTool"
107 />
108 <Tool
109 Name="VCXMLDataGeneratorTool"
110 />
111 <Tool
112 Name="VCWebServiceProxyGeneratorTool"
113 />
114 <Tool
115 Name="VCMIDLTool"
116 />
117 <Tool
118 Name="VCCLCompilerTool"
119 AdditionalIncludeDirectories="..\include"
120 PreprocessorDefinitions="WIN32;NDEBUG;_CONSOLE"
121 RuntimeLibrary="0"
122 UsePrecompiledHeader="0"
123 WarningLevel="3"
124 Detect64BitPortabilityProblems="true"
125 DebugInformationFormat="3"
126 />
127 <Tool
128 Name="VCManagedResourceCompilerTool"
129 />
130 <Tool
131 Name="VCResourceCompilerTool"
132 />
133 <Tool
134 Name="VCPreLinkEventTool"
135 />
136 <Tool
137 Name="VCLinkerTool"
138 LinkIncremental="1"
139 GenerateDebugInformation="true"
140 SubSystem="1"
141 OptimizeReferences="2"
142 EnableCOMDATFolding="2"
143 RandomizedBaseAddress="1"
144 DataExecutionPrevention="0"
145 TargetMachine="1"
146 />
147 <Tool
148 Name="VCALinkTool"
149 />
150 <Tool
151 Name="VCManifestTool"
152 />
153 <Tool
154 Name="VCXDCMakeTool"
155 />
156 <Tool
157 Name="VCBscMakeTool"
158 />
159 <Tool
160 Name="VCFxCopTool"
161 />
162 <Tool
163 Name="VCAppVerifierTool"
164 />
165 <Tool
166 Name="VCPostBuildEventTool"
167 />
168 </Configuration>
169 </Configurations>
170 <References>
171 </References>
172 <Files>
173 <Filter
174 Name="ソース ファイル"
175 Filter="cpp;c;cc;cxx;def;odl;idl;hpj;bat;asm;asmx"
176 UniqueIdentifier="{4FC737F1-C7A5-4376-A066-2A32D752A2FF}"
177 >
178 <File
179 RelativePath=".\universalchardet.c"
180 >
181 </File>
182 </Filter>
183 <Filter
184 Name="ヘッダー ファイル"
185 Filter="h;hpp;hxx;hm;inl;inc;xsd"
186 UniqueIdentifier="{93995380-89BD-4b04-88EB-625FBE52EBFB}"
187 >
188 </Filter>
189 <Filter
190 Name="リソース ファイル"
191 Filter="rc;ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe;resx;tiff;tif;png;wav"
192 UniqueIdentifier="{67DA6AB6-F800-4c08-8B7A-83BB121AAD01}"
193 >
194 </Filter>
195 <File
196 RelativePath=".\ReadMe.txt"
197 >
198 </File>
199 </Files>
200 <Globals>
201 </Globals>
202 </VisualStudioProject>
+0
-29
c/universalchardet.sln less more
0 
1 Microsoft Visual Studio Solution File, Format Version 10.00
2 # Visual Studio 2008
3 Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "universalchardet", "universalchardet\universalchardet.vcproj", "{3D96F3F3-7C46-4FEE-BD8D-BA19D8ED1DBB}"
4 ProjectSection(ProjectDependencies) = postProject
5 {7D9BA890-B579-433C-9D02-74D9BF8FDAA7} = {7D9BA890-B579-433C-9D02-74D9BF8FDAA7}
6 EndProjectSection
7 EndProject
8 Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "dll", "dll\dll.vcproj", "{7D9BA890-B579-433C-9D02-74D9BF8FDAA7}"
9 EndProject
10 Global
11 GlobalSection(SolutionConfigurationPlatforms) = preSolution
12 Debug|Win32 = Debug|Win32
13 Release|Win32 = Release|Win32
14 EndGlobalSection
15 GlobalSection(ProjectConfigurationPlatforms) = postSolution
16 {3D96F3F3-7C46-4FEE-BD8D-BA19D8ED1DBB}.Debug|Win32.ActiveCfg = Debug|Win32
17 {3D96F3F3-7C46-4FEE-BD8D-BA19D8ED1DBB}.Debug|Win32.Build.0 = Debug|Win32
18 {3D96F3F3-7C46-4FEE-BD8D-BA19D8ED1DBB}.Release|Win32.ActiveCfg = Release|Win32
19 {3D96F3F3-7C46-4FEE-BD8D-BA19D8ED1DBB}.Release|Win32.Build.0 = Release|Win32
20 {7D9BA890-B579-433C-9D02-74D9BF8FDAA7}.Debug|Win32.ActiveCfg = Debug|Win32
21 {7D9BA890-B579-433C-9D02-74D9BF8FDAA7}.Debug|Win32.Build.0 = Debug|Win32
22 {7D9BA890-B579-433C-9D02-74D9BF8FDAA7}.Release|Win32.ActiveCfg = Release|Win32
23 {7D9BA890-B579-433C-9D02-74D9BF8FDAA7}.Release|Win32.Build.0 = Release|Win32
24 EndGlobalSection
25 GlobalSection(SolutionProperties) = preSolution
26 HideSolutionNode = FALSE
27 EndGlobalSection
28 EndGlobal
+0
-90
swig/cchardet.i less more
0 /***************************************************************
1 * The author disclaims copyright to this source code.
2 * In place of a legal notice, here is a blessing:
3 *
4 * May you do good and not evil.
5 * May you find forgiveness for yourself and forgive others.
6 * May you share freely, never taking more than you give.
7 *
8 * Any feedback will be appreciated. mailto:k-tak@void.in
9 ***************************************************************/
10 %module cchardet
11 %include typemaps.i
12 %include cstring.i
13
14 %{
15 #include <universalchardet.h>
16 %}
17
18 typedef void* chardet_t;
19
20 #define CHARDET_RESULT_OK 0
21 #define CHARDET_RESULT_NOMEMORY (-1)
22 #define CHARDET_RESULT_INVALID_DETECTOR (-2)
23
24 #define CHARDET_ENCODING_ISO_2022_JP "ISO-2022-JP"
25 #define CHARDET_ENCODING_ISO_2022_CN "ISO-2022-CN"
26 #define CHARDET_ENCODING_ISO_2022_KR "ISO-2022-KR"
27 #define CHARDET_ENCODING_ISO_8859_5 "ISO-8859-5"
28 #define CHARDET_ENCODING_ISO_8859_7 "ISO-8859-7"
29 #define CHARDET_ENCODING_ISO_8859_8 "ISO-8859-8"
30 #define CHARDET_ENCODING_BIG5 "BIG5"
31 #define CHARDET_ENCODING_GB18030 "GB18030"
32 #define CHARDET_ENCODING_EUC_JP "EUC-JP"
33 #define CHARDET_ENCODING_EUC_KR "EUC-KR"
34 #define CHARDET_ENCODING_EUC_TW "EUC-TW"
35 #define CHARDET_ENCODING_SHIFT_JIS "SHIFT_JIS"
36 #define CHARDET_ENCODING_IBM855 "IBM855"
37 #define CHARDET_ENCODING_IBM866 "IBM866"
38 #define CHARDET_ENCODING_KOI8_R "KOI8-R"
39 #define CHARDET_ENCODING_MACCYRILLIC "MACCYRILLIC"
40 #define CHARDET_ENCODING_WINDOWS_1251 "WINDOWS-1251"
41 #define CHARDET_ENCODING_WINDOWS_1252 "WINDOWS-1252"
42 #define CHARDET_ENCODING_WINDOWS_1253 "WINDOWS-1253"
43 #define CHARDET_ENCODING_WINDOWS_1255 "WINDOWS-1255"
44 #define CHARDET_ENCODING_UTF_8 "UTF-8"
45 #define CHARDET_ENCODING_UTF_16BE "UTF-16BE"
46 #define CHARDET_ENCODING_UTF_16LE "UTF-16LE"
47 #define CHARDET_ENCODING_UTF_32BE "UTF-32BE"
48 #define CHARDET_ENCODING_UTF_32LE "UTF-32LE"
49 #define CHARDET_ENCODING_HZ_GB_2312 "HZ-GB-2312"
50 #define CHARDET_ENCODING_X_ISO_10646_UCS_4_3412 "X-ISO-10646-UCS-4-3412"
51 #define CHARDET_ENCODING_X_ISO_10646_UCS_4_2143 "X-ISO-10646-UCS-4-2143"
52
53 #define CHARDET_ENCODING_ISO_8859_2 "ISO-8859-2"
54 #define CHARDET_ENCODING_WINDOWS_1250 "WINDOWS-1250"
55 #define CHARDET_ENCODING_TIS_620 "TIS-620"
56
57
58 %typemap(in) char *namebuf (char tmpbuf[CHARDET_MAX_ENCODING_NAME+1]) {
59 $1 = tmpbuf;
60 }
61 %cstring_bounded_output(char *namebuf, CHARDET_MAX_ENCODING_NAME);
62
63 %apply (const char *STRING, size_t LENGTH) { (const char *input_str, unsigned int input_len) };
64
65 %typemap(in, numinputs=0) chardet_t *pdet(chardet_t ret) {
66 ret = NULL;
67 $1 = &ret;
68 }
69 %typemap(argout) chardet_t *pdet {
70 SWIG_Object o;
71 o = SWIG_NewPointerObj(*$1, $descriptor(chardet_t), 0);
72 $result = SWIG_AppendOutput($result, o);
73 }
74
75 int chardet_create(chardet_t* pdet);
76 void chardet_destroy(chardet_t det);
77 int chardet_handle_data(chardet_t det,
78 const char* input_str, unsigned int input_len);
79 int chardet_data_end(chardet_t det);
80 int chardet_reset(chardet_t det);
81
82 %rename(chardet_get_charset) my_get_charset;
83 %inline {
84 static void my_get_charset(chardet_t det, char* namebuf)
85 {
86 int ret = 0;
87 ret = chardet_get_charset(det, namebuf, CHARDET_MAX_ENCODING_NAME);
88 }
89 }
+0
-92
swig/python/cchardet.py less more
0 # This file was automatically generated by SWIG (http://www.swig.org).
1 # Version 1.3.31
2 #
3 # Don't modify this file, modify the SWIG interface instead.
4 # This file is compatible with both classic and new-style classes.
5
6 import _cchardet
7 import new
8 new_instancemethod = new.instancemethod
9 try:
10 _swig_property = property
11 except NameError:
12 pass # Python < 2.2 doesn't have 'property'.
13 def _swig_setattr_nondynamic(self,class_type,name,value,static=1):
14 if (name == "thisown"): return self.this.own(value)
15 if (name == "this"):
16 if type(value).__name__ == 'PySwigObject':
17 self.__dict__[name] = value
18 return
19 method = class_type.__swig_setmethods__.get(name,None)
20 if method: return method(self,value)
21 if (not static) or hasattr(self,name):
22 self.__dict__[name] = value
23 else:
24 raise AttributeError("You cannot add attributes to %s" % self)
25
26 def _swig_setattr(self,class_type,name,value):
27 return _swig_setattr_nondynamic(self,class_type,name,value,0)
28
29 def _swig_getattr(self,class_type,name):
30 if (name == "thisown"): return self.this.own()
31 method = class_type.__swig_getmethods__.get(name,None)
32 if method: return method(self)
33 raise AttributeError,name
34
35 def _swig_repr(self):
36 try: strthis = "proxy of " + self.this.__repr__()
37 except: strthis = ""
38 return "<%s.%s; %s >" % (self.__class__.__module__, self.__class__.__name__, strthis,)
39
40 import types
41 try:
42 _object = types.ObjectType
43 _newclass = 1
44 except AttributeError:
45 class _object : pass
46 _newclass = 0
47 del types
48
49
50 CHARDET_RESULT_OK = _cchardet.CHARDET_RESULT_OK
51 CHARDET_RESULT_NOMEMORY = _cchardet.CHARDET_RESULT_NOMEMORY
52 CHARDET_RESULT_INVALID_DETECTOR = _cchardet.CHARDET_RESULT_INVALID_DETECTOR
53 CHARDET_ENCODING_ISO_2022_JP = _cchardet.CHARDET_ENCODING_ISO_2022_JP
54 CHARDET_ENCODING_ISO_2022_CN = _cchardet.CHARDET_ENCODING_ISO_2022_CN
55 CHARDET_ENCODING_ISO_2022_KR = _cchardet.CHARDET_ENCODING_ISO_2022_KR
56 CHARDET_ENCODING_ISO_8859_5 = _cchardet.CHARDET_ENCODING_ISO_8859_5
57 CHARDET_ENCODING_ISO_8859_7 = _cchardet.CHARDET_ENCODING_ISO_8859_7
58 CHARDET_ENCODING_ISO_8859_8 = _cchardet.CHARDET_ENCODING_ISO_8859_8
59 CHARDET_ENCODING_BIG5 = _cchardet.CHARDET_ENCODING_BIG5
60 CHARDET_ENCODING_GB18030 = _cchardet.CHARDET_ENCODING_GB18030
61 CHARDET_ENCODING_EUC_JP = _cchardet.CHARDET_ENCODING_EUC_JP
62 CHARDET_ENCODING_EUC_KR = _cchardet.CHARDET_ENCODING_EUC_KR
63 CHARDET_ENCODING_EUC_TW = _cchardet.CHARDET_ENCODING_EUC_TW
64 CHARDET_ENCODING_SHIFT_JIS = _cchardet.CHARDET_ENCODING_SHIFT_JIS
65 CHARDET_ENCODING_IBM855 = _cchardet.CHARDET_ENCODING_IBM855
66 CHARDET_ENCODING_IBM866 = _cchardet.CHARDET_ENCODING_IBM866
67 CHARDET_ENCODING_KOI8_R = _cchardet.CHARDET_ENCODING_KOI8_R
68 CHARDET_ENCODING_MACCYRILLIC = _cchardet.CHARDET_ENCODING_MACCYRILLIC
69 CHARDET_ENCODING_WINDOWS_1251 = _cchardet.CHARDET_ENCODING_WINDOWS_1251
70 CHARDET_ENCODING_WINDOWS_1252 = _cchardet.CHARDET_ENCODING_WINDOWS_1252
71 CHARDET_ENCODING_WINDOWS_1253 = _cchardet.CHARDET_ENCODING_WINDOWS_1253
72 CHARDET_ENCODING_WINDOWS_1255 = _cchardet.CHARDET_ENCODING_WINDOWS_1255
73 CHARDET_ENCODING_UTF_8 = _cchardet.CHARDET_ENCODING_UTF_8
74 CHARDET_ENCODING_UTF_16BE = _cchardet.CHARDET_ENCODING_UTF_16BE
75 CHARDET_ENCODING_UTF_16LE = _cchardet.CHARDET_ENCODING_UTF_16LE
76 CHARDET_ENCODING_UTF_32BE = _cchardet.CHARDET_ENCODING_UTF_32BE
77 CHARDET_ENCODING_UTF_32LE = _cchardet.CHARDET_ENCODING_UTF_32LE
78 CHARDET_ENCODING_HZ_GB_2312 = _cchardet.CHARDET_ENCODING_HZ_GB_2312
79 CHARDET_ENCODING_X_ISO_10646_UCS_4_3412 = _cchardet.CHARDET_ENCODING_X_ISO_10646_UCS_4_3412
80 CHARDET_ENCODING_X_ISO_10646_UCS_4_2143 = _cchardet.CHARDET_ENCODING_X_ISO_10646_UCS_4_2143
81 CHARDET_ENCODING_ISO_8859_2 = _cchardet.CHARDET_ENCODING_ISO_8859_2
82 CHARDET_ENCODING_WINDOWS_1250 = _cchardet.CHARDET_ENCODING_WINDOWS_1250
83 CHARDET_ENCODING_TIS_620 = _cchardet.CHARDET_ENCODING_TIS_620
84 chardet_create = _cchardet.chardet_create
85 chardet_destroy = _cchardet.chardet_destroy
86 chardet_handle_data = _cchardet.chardet_handle_data
87 chardet_data_end = _cchardet.chardet_data_end
88 chardet_reset = _cchardet.chardet_reset
89 chardet_get_charset = _cchardet.chardet_get_charset
90
91
+0
-3474
swig/python/cchardet_wrap.c less more
0 /* ----------------------------------------------------------------------------
1 * This file was automatically generated by SWIG (http://www.swig.org).
2 * Version 1.3.31
3 *
4 * This file is not intended to be easily readable and contains a number of
5 * coding conventions designed to improve portability and efficiency. Do not make
6 * changes to this file unless you know what you are doing--modify the SWIG
7 * interface file instead.
8 * ----------------------------------------------------------------------------- */
9
10 #define SWIGPYTHON
11 #define SWIG_PYTHON_DIRECTOR_NO_VTABLE
12 /* -----------------------------------------------------------------------------
13 * This section contains generic SWIG labels for method/variable
14 * declarations/attributes, and other compiler dependent labels.
15 * ----------------------------------------------------------------------------- */
16
17 /* template workaround for compilers that cannot correctly implement the C++ standard */
18 #ifndef SWIGTEMPLATEDISAMBIGUATOR
19 # if defined(__SUNPRO_CC)
20 # if (__SUNPRO_CC <= 0x560)
21 # define SWIGTEMPLATEDISAMBIGUATOR template
22 # else
23 # define SWIGTEMPLATEDISAMBIGUATOR
24 # endif
25 # else
26 # define SWIGTEMPLATEDISAMBIGUATOR
27 # endif
28 #endif
29
30 /* inline attribute */
31 #ifndef SWIGINLINE
32 # if defined(__cplusplus) || (defined(__GNUC__) && !defined(__STRICT_ANSI__))
33 # define SWIGINLINE inline
34 # else
35 # define SWIGINLINE
36 # endif
37 #endif
38
39 /* attribute recognised by some compilers to avoid 'unused' warnings */
40 #ifndef SWIGUNUSED
41 # if defined(__GNUC__)
42 # if !(defined(__cplusplus)) || (__GNUC__ > 3 || (__GNUC__ == 3 && __GNUC_MINOR__ >= 4))
43 # define SWIGUNUSED __attribute__ ((__unused__))
44 # else
45 # define SWIGUNUSED
46 # endif
47 # elif defined(__ICC)
48 # define SWIGUNUSED __attribute__ ((__unused__))
49 # else
50 # define SWIGUNUSED
51 # endif
52 #endif
53
54 #ifndef SWIGUNUSEDPARM
55 # ifdef __cplusplus
56 # define SWIGUNUSEDPARM(p)
57 # else
58 # define SWIGUNUSEDPARM(p) p SWIGUNUSED
59 # endif
60 #endif
61
62 /* internal SWIG method */
63 #ifndef SWIGINTERN
64 # define SWIGINTERN static SWIGUNUSED
65 #endif
66
67 /* internal inline SWIG method */
68 #ifndef SWIGINTERNINLINE
69 # define SWIGINTERNINLINE SWIGINTERN SWIGINLINE
70 #endif
71
72 /* exporting methods */
73 #if (__GNUC__ >= 4) || (__GNUC__ == 3 && __GNUC_MINOR__ >= 4)
74 # ifndef GCC_HASCLASSVISIBILITY
75 # define GCC_HASCLASSVISIBILITY
76 # endif
77 #endif
78
79 #ifndef SWIGEXPORT
80 # if defined(_WIN32) || defined(__WIN32__) || defined(__CYGWIN__)
81 # if defined(STATIC_LINKED)
82 # define SWIGEXPORT
83 # else
84 # define SWIGEXPORT __declspec(dllexport)
85 # endif
86 # else
87 # if defined(__GNUC__) && defined(GCC_HASCLASSVISIBILITY)
88 # define SWIGEXPORT __attribute__ ((visibility("default")))
89 # else
90 # define SWIGEXPORT
91 # endif
92 # endif
93 #endif
94
95 /* calling conventions for Windows */
96 #ifndef SWIGSTDCALL
97 # if defined(_WIN32) || defined(__WIN32__) || defined(__CYGWIN__)
98 # define SWIGSTDCALL __stdcall
99 # else
100 # define SWIGSTDCALL
101 # endif
102 #endif
103
104 /* Deal with Microsoft's attempt at deprecating C standard runtime functions */
105 #if !defined(SWIG_NO_CRT_SECURE_NO_DEPRECATE) && defined(_MSC_VER) && !defined(_CRT_SECURE_NO_DEPRECATE)
106 # define _CRT_SECURE_NO_DEPRECATE
107 #endif
108
109
110 /* Python.h has to appear first */
111 #include <Python.h>
112
113 /* -----------------------------------------------------------------------------
114 * swigrun.swg
115 *
116 * This file contains generic CAPI SWIG runtime support for pointer
117 * type checking.
118 * ----------------------------------------------------------------------------- */
119
120 /* This should only be incremented when either the layout of swig_type_info changes,
121 or for whatever reason, the runtime changes incompatibly */
122 #define SWIG_RUNTIME_VERSION "3"
123
124 /* define SWIG_TYPE_TABLE_NAME as "SWIG_TYPE_TABLE" */
125 #ifdef SWIG_TYPE_TABLE
126 # define SWIG_QUOTE_STRING(x) #x
127 # define SWIG_EXPAND_AND_QUOTE_STRING(x) SWIG_QUOTE_STRING(x)
128 # define SWIG_TYPE_TABLE_NAME SWIG_EXPAND_AND_QUOTE_STRING(SWIG_TYPE_TABLE)
129 #else
130 # define SWIG_TYPE_TABLE_NAME
131 #endif
132
133 /*
134 You can use the SWIGRUNTIME and SWIGRUNTIMEINLINE macros for
135 creating a static or dynamic library from the swig runtime code.
136 In 99.9% of the cases, swig just needs to declare them as 'static'.
137
138 But only do this if is strictly necessary, ie, if you have problems
139 with your compiler or so.
140 */
141
142 #ifndef SWIGRUNTIME
143 # define SWIGRUNTIME SWIGINTERN
144 #endif
145
146 #ifndef SWIGRUNTIMEINLINE
147 # define SWIGRUNTIMEINLINE SWIGRUNTIME SWIGINLINE
148 #endif
149
150 /* Generic buffer size */
151 #ifndef SWIG_BUFFER_SIZE
152 # define SWIG_BUFFER_SIZE 1024
153 #endif
154
155 /* Flags for pointer conversions */
156 #define SWIG_POINTER_DISOWN 0x1
157
158 /* Flags for new pointer objects */
159 #define SWIG_POINTER_OWN 0x1
160
161
162 /*
163 Flags/methods for returning states.
164
165 The swig conversion methods, as ConvertPtr, return and integer
166 that tells if the conversion was successful or not. And if not,
167 an error code can be returned (see swigerrors.swg for the codes).
168
169 Use the following macros/flags to set or process the returning
170 states.
171
172 In old swig versions, you usually write code as:
173
174 if (SWIG_ConvertPtr(obj,vptr,ty.flags) != -1) {
175 // success code
176 } else {
177 //fail code
178 }
179
180 Now you can be more explicit as:
181
182 int res = SWIG_ConvertPtr(obj,vptr,ty.flags);
183 if (SWIG_IsOK(res)) {
184 // success code
185 } else {
186 // fail code
187 }
188
189 that seems to be the same, but now you can also do
190
191 Type *ptr;
192 int res = SWIG_ConvertPtr(obj,(void **)(&ptr),ty.flags);
193 if (SWIG_IsOK(res)) {
194 // success code
195 if (SWIG_IsNewObj(res) {
196 ...
197 delete *ptr;
198 } else {
199 ...
200 }
201 } else {
202 // fail code
203 }
204
205 I.e., now SWIG_ConvertPtr can return new objects and you can
206 identify the case and take care of the deallocation. Of course that
207 requires also to SWIG_ConvertPtr to return new result values, as
208
209 int SWIG_ConvertPtr(obj, ptr,...) {
210 if (<obj is ok>) {
211 if (<need new object>) {
212 *ptr = <ptr to new allocated object>;
213 return SWIG_NEWOBJ;
214 } else {
215 *ptr = <ptr to old object>;
216 return SWIG_OLDOBJ;
217 }
218 } else {
219 return SWIG_BADOBJ;
220 }
221 }
222
223 Of course, returning the plain '0(success)/-1(fail)' still works, but you can be
224 more explicit by returning SWIG_BADOBJ, SWIG_ERROR or any of the
225 swig errors code.
226
227 Finally, if the SWIG_CASTRANK_MODE is enabled, the result code
228 allows to return the 'cast rank', for example, if you have this
229
230 int food(double)
231 int fooi(int);
232
233 and you call
234
235 food(1) // cast rank '1' (1 -> 1.0)
236 fooi(1) // cast rank '0'
237
238 just use the SWIG_AddCast()/SWIG_CheckState()
239
240
241 */
242 #define SWIG_OK (0)
243 #define SWIG_ERROR (-1)
244 #define SWIG_IsOK(r) (r >= 0)
245 #define SWIG_ArgError(r) ((r != SWIG_ERROR) ? r : SWIG_TypeError)
246
247 /* The CastRankLimit says how many bits are used for the cast rank */
248 #define SWIG_CASTRANKLIMIT (1 << 8)
249 /* The NewMask denotes the object was created (using new/malloc) */
250 #define SWIG_NEWOBJMASK (SWIG_CASTRANKLIMIT << 1)
251 /* The TmpMask is for in/out typemaps that use temporal objects */
252 #define SWIG_TMPOBJMASK (SWIG_NEWOBJMASK << 1)
253 /* Simple returning values */
254 #define SWIG_BADOBJ (SWIG_ERROR)
255 #define SWIG_OLDOBJ (SWIG_OK)
256 #define SWIG_NEWOBJ (SWIG_OK | SWIG_NEWOBJMASK)
257 #define SWIG_TMPOBJ (SWIG_OK | SWIG_TMPOBJMASK)
258 /* Check, add and del mask methods */
259 #define SWIG_AddNewMask(r) (SWIG_IsOK(r) ? (r | SWIG_NEWOBJMASK) : r)
260 #define SWIG_DelNewMask(r) (SWIG_IsOK(r) ? (r & ~SWIG_NEWOBJMASK) : r)
261 #define SWIG_IsNewObj(r) (SWIG_IsOK(r) && (r & SWIG_NEWOBJMASK))
262 #define SWIG_AddTmpMask(r) (SWIG_IsOK(r) ? (r | SWIG_TMPOBJMASK) : r)
263 #define SWIG_DelTmpMask(r) (SWIG_IsOK(r) ? (r & ~SWIG_TMPOBJMASK) : r)
264 #define SWIG_IsTmpObj(r) (SWIG_IsOK(r) && (r & SWIG_TMPOBJMASK))
265
266
267 /* Cast-Rank Mode */
268 #if defined(SWIG_CASTRANK_MODE)
269 # ifndef SWIG_TypeRank
270 # define SWIG_TypeRank unsigned long
271 # endif
272 # ifndef SWIG_MAXCASTRANK /* Default cast allowed */
273 # define SWIG_MAXCASTRANK (2)
274 # endif
275 # define SWIG_CASTRANKMASK ((SWIG_CASTRANKLIMIT) -1)
276 # define SWIG_CastRank(r) (r & SWIG_CASTRANKMASK)
277 SWIGINTERNINLINE int SWIG_AddCast(int r) {
278 return SWIG_IsOK(r) ? ((SWIG_CastRank(r) < SWIG_MAXCASTRANK) ? (r + 1) : SWIG_ERROR) : r;
279 }
280 SWIGINTERNINLINE int SWIG_CheckState(int r) {
281 return SWIG_IsOK(r) ? SWIG_CastRank(r) + 1 : 0;
282 }
283 #else /* no cast-rank mode */
284 # define SWIG_AddCast
285 # define SWIG_CheckState(r) (SWIG_IsOK(r) ? 1 : 0)
286 #endif
287
288
289
290
291 #include <string.h>
292
293 #ifdef __cplusplus
294 extern "C" {
295 #endif
296
297 typedef void *(*swig_converter_func)(void *);
298 typedef struct swig_type_info *(*swig_dycast_func)(void **);
299
300 /* Structure to store inforomation on one type */
301 typedef struct swig_type_info {
302 const char *name; /* mangled name of this type */
303 const char *str; /* human readable name of this type */
304 swig_dycast_func dcast; /* dynamic cast function down a hierarchy */
305 struct swig_cast_info *cast; /* linked list of types that can cast into this type */
306 void *clientdata; /* language specific type data */
307 int owndata; /* flag if the structure owns the clientdata */
308 } swig_type_info;
309
310 /* Structure to store a type and conversion function used for casting */
311 typedef struct swig_cast_info {
312 swig_type_info *type; /* pointer to type that is equivalent to this type */
313 swig_converter_func converter; /* function to cast the void pointers */
314 struct swig_cast_info *next; /* pointer to next cast in linked list */
315 struct swig_cast_info *prev; /* pointer to the previous cast */
316 } swig_cast_info;
317
318 /* Structure used to store module information
319 * Each module generates one structure like this, and the runtime collects
320 * all of these structures and stores them in a circularly linked list.*/
321 typedef struct swig_module_info {
322 swig_type_info **types; /* Array of pointers to swig_type_info structures that are in this module */
323 size_t size; /* Number of types in this module */
324 struct swig_module_info *next; /* Pointer to next element in circularly linked list */
325 swig_type_info **type_initial; /* Array of initially generated type structures */
326 swig_cast_info **cast_initial; /* Array of initially generated casting structures */
327 void *clientdata; /* Language specific module data */
328 } swig_module_info;
329
330 /*
331 Compare two type names skipping the space characters, therefore
332 "char*" == "char *" and "Class<int>" == "Class<int >", etc.
333
334 Return 0 when the two name types are equivalent, as in
335 strncmp, but skipping ' '.
336 */
337 SWIGRUNTIME int
338 SWIG_TypeNameComp(const char *f1, const char *l1,
339 const char *f2, const char *l2) {
340 for (;(f1 != l1) && (f2 != l2); ++f1, ++f2) {
341 while ((*f1 == ' ') && (f1 != l1)) ++f1;
342 while ((*f2 == ' ') && (f2 != l2)) ++f2;
343 if (*f1 != *f2) return (*f1 > *f2) ? 1 : -1;
344 }
345 return (l1 - f1) - (l2 - f2);
346 }
347
348 /*
349 Check type equivalence in a name list like <name1>|<name2>|...
350 Return 0 if not equal, 1 if equal
351 */
352 SWIGRUNTIME int
353 SWIG_TypeEquiv(const char *nb, const char *tb) {
354 int equiv = 0;
355 const char* te = tb + strlen(tb);
356 const char* ne = nb;
357 while (!equiv && *ne) {
358 for (nb = ne; *ne; ++ne) {
359 if (*ne == '|') break;
360 }
361 equiv = (SWIG_TypeNameComp(nb, ne, tb, te) == 0) ? 1 : 0;
362 if (*ne) ++ne;
363 }
364 return equiv;
365 }
366
367 /*
368 Check type equivalence in a name list like <name1>|<name2>|...
369 Return 0 if equal, -1 if nb < tb, 1 if nb > tb
370 */
371 SWIGRUNTIME int
372 SWIG_TypeCompare(const char *nb, const char *tb) {
373 int equiv = 0;
374 const char* te = tb + strlen(tb);
375 const char* ne = nb;
376 while (!equiv && *ne) {
377 for (nb = ne; *ne; ++ne) {
378 if (*ne == '|') break;
379 }
380 equiv = (SWIG_TypeNameComp(nb, ne, tb, te) == 0) ? 1 : 0;
381 if (*ne) ++ne;
382 }
383 return equiv;
384 }
385
386
387 /* think of this as a c++ template<> or a scheme macro */
388 #define SWIG_TypeCheck_Template(comparison, ty) \
389 if (ty) { \
390 swig_cast_info *iter = ty->cast; \
391 while (iter) { \
392 if (comparison) { \
393 if (iter == ty->cast) return iter; \
394 /* Move iter to the top of the linked list */ \
395 iter->prev->next = iter->next; \
396 if (iter->next) \
397 iter->next->prev = iter->prev; \
398 iter->next = ty->cast; \
399 iter->prev = 0; \
400 if (ty->cast) ty->cast->prev = iter; \
401 ty->cast = iter; \
402 return iter; \
403 } \
404 iter = iter->next; \
405 } \
406 } \
407 return 0
408
409 /*
410 Check the typename
411 */
412 SWIGRUNTIME swig_cast_info *
413 SWIG_TypeCheck(const char *c, swig_type_info *ty) {
414 SWIG_TypeCheck_Template(strcmp(iter->type->name, c) == 0, ty);
415 }
416
417 /* Same as previous function, except strcmp is replaced with a pointer comparison */
418 SWIGRUNTIME swig_cast_info *
419 SWIG_TypeCheckStruct(swig_type_info *from, swig_type_info *into) {
420 SWIG_TypeCheck_Template(iter->type == from, into);
421 }
422
423 /*
424 Cast a pointer up an inheritance hierarchy
425 */
426 SWIGRUNTIMEINLINE void *
427 SWIG_TypeCast(swig_cast_info *ty, void *ptr) {
428 return ((!ty) || (!ty->converter)) ? ptr : (*ty->converter)(ptr);
429 }
430
431 /*
432 Dynamic pointer casting. Down an inheritance hierarchy
433 */
434 SWIGRUNTIME swig_type_info *
435 SWIG_TypeDynamicCast(swig_type_info *ty, void **ptr) {
436 swig_type_info *lastty = ty;
437 if (!ty || !ty->dcast) return ty;
438 while (ty && (ty->dcast)) {
439 ty = (*ty->dcast)(ptr);
440 if (ty) lastty = ty;
441 }
442 return lastty;
443 }
444
445 /*
446 Return the name associated with this type
447 */
448 SWIGRUNTIMEINLINE const char *
449 SWIG_TypeName(const swig_type_info *ty) {
450 return ty->name;
451 }
452
453 /*
454 Return the pretty name associated with this type,
455 that is an unmangled type name in a form presentable to the user.
456 */
457 SWIGRUNTIME const char *
458 SWIG_TypePrettyName(const swig_type_info *type) {
459 /* The "str" field contains the equivalent pretty names of the
460 type, separated by vertical-bar characters. We choose
461 to print the last name, as it is often (?) the most
462 specific. */
463 if (!type) return NULL;
464 if (type->str != NULL) {
465 const char *last_name = type->str;
466 const char *s;
467 for (s = type->str; *s; s++)
468 if (*s == '|') last_name = s+1;
469 return last_name;
470 }
471 else
472 return type->name;
473 }
474
475 /*
476 Set the clientdata field for a type
477 */
478 SWIGRUNTIME void
479 SWIG_TypeClientData(swig_type_info *ti, void *clientdata) {
480 swig_cast_info *cast = ti->cast;
481 /* if (ti->clientdata == clientdata) return; */
482 ti->clientdata = clientdata;
483
484 while (cast) {
485 if (!cast->converter) {
486 swig_type_info *tc = cast->type;
487 if (!tc->clientdata) {
488 SWIG_TypeClientData(tc, clientdata);
489 }
490 }
491 cast = cast->next;
492 }
493 }
494 SWIGRUNTIME void
495 SWIG_TypeNewClientData(swig_type_info *ti, void *clientdata) {
496 SWIG_TypeClientData(ti, clientdata);
497 ti->owndata = 1;
498 }
499
500 /*
501 Search for a swig_type_info structure only by mangled name
502 Search is a O(log #types)
503
504 We start searching at module start, and finish searching when start == end.
505 Note: if start == end at the beginning of the function, we go all the way around
506 the circular list.
507 */
508 SWIGRUNTIME swig_type_info *
509 SWIG_MangledTypeQueryModule(swig_module_info *start,
510 swig_module_info *end,
511 const char *name) {
512 swig_module_info *iter = start;
513 do {
514 if (iter->size) {
515 register size_t l = 0;
516 register size_t r = iter->size - 1;
517 do {
518 /* since l+r >= 0, we can (>> 1) instead (/ 2) */
519 register size_t i = (l + r) >> 1;
520 const char *iname = iter->types[i]->name;
521 if (iname) {
522 register int compare = strcmp(name, iname);
523 if (compare == 0) {
524 return iter->types[i];
525 } else if (compare < 0) {
526 if (i) {
527 r = i - 1;
528 } else {
529 break;
530 }
531 } else if (compare > 0) {
532 l = i + 1;
533 }
534 } else {
535 break; /* should never happen */
536 }
537 } while (l <= r);
538 }
539 iter = iter->next;
540 } while (iter != end);
541 return 0;
542 }
543
544 /*
545 Search for a swig_type_info structure for either a mangled name or a human readable name.
546 It first searches the mangled names of the types, which is a O(log #types)
547 If a type is not found it then searches the human readable names, which is O(#types).
548
549 We start searching at module start, and finish searching when start == end.
550 Note: if start == end at the beginning of the function, we go all the way around
551 the circular list.
552 */
553 SWIGRUNTIME swig_type_info *
554 SWIG_TypeQueryModule(swig_module_info *start,
555 swig_module_info *end,
556 const char *name) {
557 /* STEP 1: Search the name field using binary search */
558 swig_type_info *ret = SWIG_MangledTypeQueryModule(start, end, name);
559 if (ret) {
560 return ret;
561 } else {
562 /* STEP 2: If the type hasn't been found, do a complete search
563 of the str field (the human readable name) */
564 swig_module_info *iter = start;
565 do {
566 register size_t i = 0;
567 for (; i < iter->size; ++i) {
568 if (iter->types[i]->str && (SWIG_TypeEquiv(iter->types[i]->str, name)))
569 return iter->types[i];
570 }
571 iter = iter->next;
572 } while (iter != end);
573 }
574
575 /* neither found a match */
576 return 0;
577 }
578
579 /*
580 Pack binary data into a string
581 */
582 SWIGRUNTIME char *
583 SWIG_PackData(char *c, void *ptr, size_t sz) {
584 static const char hex[17] = "0123456789abcdef";
585 register const unsigned char *u = (unsigned char *) ptr;
586 register const unsigned char *eu = u + sz;
587 for (; u != eu; ++u) {
588 register unsigned char uu = *u;
589 *(c++) = hex[(uu & 0xf0) >> 4];
590 *(c++) = hex[uu & 0xf];
591 }
592 return c;
593 }
594
595 /*
596 Unpack binary data from a string
597 */
598 SWIGRUNTIME const char *
599 SWIG_UnpackData(const char *c, void *ptr, size_t sz) {
600 register unsigned char *u = (unsigned char *) ptr;
601 register const unsigned char *eu = u + sz;
602 for (; u != eu; ++u) {
603 register char d = *(c++);
604 register unsigned char uu;
605 if ((d >= '0') && (d <= '9'))
606 uu = ((d - '0') << 4);
607 else if ((d >= 'a') && (d <= 'f'))
608 uu = ((d - ('a'-10)) << 4);
609 else
610 return (char *) 0;
611 d = *(c++);
612 if ((d >= '0') && (d <= '9'))
613 uu |= (d - '0');
614 else if ((d >= 'a') && (d <= 'f'))
615 uu |= (d - ('a'-10));
616 else
617 return (char *) 0;
618 *u = uu;
619 }
620 return c;
621 }
622
623 /*
624 Pack 'void *' into a string buffer.
625 */
626 SWIGRUNTIME char *
627 SWIG_PackVoidPtr(char *buff, void *ptr, const char *name, size_t bsz) {
628 char *r = buff;
629 if ((2*sizeof(void *) + 2) > bsz) return 0;
630 *(r++) = '_';
631 r = SWIG_PackData(r,&ptr,sizeof(void *));
632 if (strlen(name) + 1 > (bsz - (r - buff))) return 0;
633 strcpy(r,name);
634 return buff;
635 }
636
637 SWIGRUNTIME const char *
638 SWIG_UnpackVoidPtr(const char *c, void **ptr, const char *name) {
639 if (*c != '_') {
640 if (strcmp(c,"NULL") == 0) {
641 *ptr = (void *) 0;
642 return name;
643 } else {
644 return 0;
645 }
646 }
647 return SWIG_UnpackData(++c,ptr,sizeof(void *));
648 }
649
650 SWIGRUNTIME char *
651 SWIG_PackDataName(char *buff, void *ptr, size_t sz, const char *name, size_t bsz) {
652 char *r = buff;
653 size_t lname = (name ? strlen(name) : 0);
654 if ((2*sz + 2 + lname) > bsz) return 0;
655 *(r++) = '_';
656 r = SWIG_PackData(r,ptr,sz);
657 if (lname) {
658 strncpy(r,name,lname+1);
659 } else {
660 *r = 0;
661 }
662 return buff;
663 }
664
665 SWIGRUNTIME const char *
666 SWIG_UnpackDataName(const char *c, void *ptr, size_t sz, const char *name) {
667 if (*c != '_') {
668 if (strcmp(c,"NULL") == 0) {
669 memset(ptr,0,sz);
670 return name;
671 } else {
672 return 0;
673 }
674 }
675 return SWIG_UnpackData(++c,ptr,sz);
676 }
677
678 #ifdef __cplusplus
679 }
680 #endif
681
682 /* Errors in SWIG */
683 #define SWIG_UnknownError -1
684 #define SWIG_IOError -2
685 #define SWIG_RuntimeError -3
686 #define SWIG_IndexError -4
687 #define SWIG_TypeError -5
688 #define SWIG_DivisionByZero -6
689 #define SWIG_OverflowError -7
690 #define SWIG_SyntaxError -8
691 #define SWIG_ValueError -9
692 #define SWIG_SystemError -10
693 #define SWIG_AttributeError -11
694 #define SWIG_MemoryError -12
695 #define SWIG_NullReferenceError -13
696
697
698
699
700 /* Add PyOS_snprintf for old Pythons */
701 #if PY_VERSION_HEX < 0x02020000
702 # if defined(_MSC_VER) || defined(__BORLANDC__) || defined(_WATCOM)
703 # define PyOS_snprintf _snprintf
704 # else
705 # define PyOS_snprintf snprintf
706 # endif
707 #endif
708
709 /* A crude PyString_FromFormat implementation for old Pythons */
710 #if PY_VERSION_HEX < 0x02020000
711
712 #ifndef SWIG_PYBUFFER_SIZE
713 # define SWIG_PYBUFFER_SIZE 1024
714 #endif
715
716 static PyObject *
717 PyString_FromFormat(const char *fmt, ...) {
718 va_list ap;
719 char buf[SWIG_PYBUFFER_SIZE * 2];
720 int res;
721 va_start(ap, fmt);
722 res = vsnprintf(buf, sizeof(buf), fmt, ap);
723 va_end(ap);
724 return (res < 0 || res >= (int)sizeof(buf)) ? 0 : PyString_FromString(buf);
725 }
726 #endif
727
728 /* Add PyObject_Del for old Pythons */
729 #if PY_VERSION_HEX < 0x01060000
730 # define PyObject_Del(op) PyMem_DEL((op))
731 #endif
732 #ifndef PyObject_DEL
733 # define PyObject_DEL PyObject_Del
734 #endif
735
736 /* A crude PyExc_StopIteration exception for old Pythons */
737 #if PY_VERSION_HEX < 0x02020000
738 # ifndef PyExc_StopIteration
739 # define PyExc_StopIteration PyExc_RuntimeError
740 # endif
741 # ifndef PyObject_GenericGetAttr
742 # define PyObject_GenericGetAttr 0
743 # endif
744 #endif
745 /* Py_NotImplemented is defined in 2.1 and up. */
746 #if PY_VERSION_HEX < 0x02010000
747 # ifndef Py_NotImplemented
748 # define Py_NotImplemented PyExc_RuntimeError
749 # endif
750 #endif
751
752
753 /* A crude PyString_AsStringAndSize implementation for old Pythons */
754 #if PY_VERSION_HEX < 0x02010000
755 # ifndef PyString_AsStringAndSize
756 # define PyString_AsStringAndSize(obj, s, len) {*s = PyString_AsString(obj); *len = *s ? strlen(*s) : 0;}
757 # endif
758 #endif
759
760 /* PySequence_Size for old Pythons */
761 #if PY_VERSION_HEX < 0x02000000
762 # ifndef PySequence_Size
763 # define PySequence_Size PySequence_Length
764 # endif
765 #endif
766
767
768 /* PyBool_FromLong for old Pythons */
769 #if PY_VERSION_HEX < 0x02030000
770 static
771 PyObject *PyBool_FromLong(long ok)
772 {
773 PyObject *result = ok ? Py_True : Py_False;
774 Py_INCREF(result);
775 return result;
776 }
777 #endif
778
779 /* Py_ssize_t for old Pythons */
780 /* This code is as recommended by: */
781 /* http://www.python.org/dev/peps/pep-0353/#conversion-guidelines */
782 #if PY_VERSION_HEX < 0x02050000 && !defined(PY_SSIZE_T_MIN)
783 typedef int Py_ssize_t;
784 # define PY_SSIZE_T_MAX INT_MAX
785 # define PY_SSIZE_T_MIN INT_MIN
786 #endif
787
788 /* -----------------------------------------------------------------------------
789 * error manipulation
790 * ----------------------------------------------------------------------------- */
791
792 SWIGRUNTIME PyObject*
793 SWIG_Python_ErrorType(int code) {
794 PyObject* type = 0;
795 switch(code) {
796 case SWIG_MemoryError:
797 type = PyExc_MemoryError;
798 break;
799 case SWIG_IOError:
800 type = PyExc_IOError;
801 break;
802 case SWIG_RuntimeError:
803 type = PyExc_RuntimeError;
804 break;
805 case SWIG_IndexError:
806 type = PyExc_IndexError;
807 break;
808 case SWIG_TypeError:
809 type = PyExc_TypeError;
810 break;
811 case SWIG_DivisionByZero:
812 type = PyExc_ZeroDivisionError;
813 break;
814 case SWIG_OverflowError:
815 type = PyExc_OverflowError;
816 break;
817 case SWIG_SyntaxError:
818 type = PyExc_SyntaxError;
819 break;
820 case SWIG_ValueError:
821 type = PyExc_ValueError;
822 break;
823 case SWIG_SystemError:
824 type = PyExc_SystemError;
825 break;
826 case SWIG_AttributeError:
827 type = PyExc_AttributeError;
828 break;
829 default:
830 type = PyExc_RuntimeError;
831 }
832 return type;
833 }
834
835
836 SWIGRUNTIME void
837 SWIG_Python_AddErrorMsg(const char* mesg)
838 {
839 PyObject *type = 0;
840 PyObject *value = 0;
841 PyObject *traceback = 0;
842
843 if (PyErr_Occurred()) PyErr_Fetch(&type, &value, &traceback);
844 if (value) {
845 PyObject *old_str = PyObject_Str(value);
846 PyErr_Clear();
847 Py_XINCREF(type);
848 PyErr_Format(type, "%s %s", PyString_AsString(old_str), mesg);
849 Py_DECREF(old_str);
850 Py_DECREF(value);
851 } else {
852 PyErr_Format(PyExc_RuntimeError, mesg);
853 }
854 }
855
856
857
858 #if defined(SWIG_PYTHON_NO_THREADS)
859 # if defined(SWIG_PYTHON_THREADS)
860 # undef SWIG_PYTHON_THREADS
861 # endif
862 #endif
863 #if defined(SWIG_PYTHON_THREADS) /* Threading support is enabled */
864 # if !defined(SWIG_PYTHON_USE_GIL) && !defined(SWIG_PYTHON_NO_USE_GIL)
865 # if (PY_VERSION_HEX >= 0x02030000) /* For 2.3 or later, use the PyGILState calls */
866 # define SWIG_PYTHON_USE_GIL
867 # endif
868 # endif
869 # if defined(SWIG_PYTHON_USE_GIL) /* Use PyGILState threads calls */
870 # ifndef SWIG_PYTHON_INITIALIZE_THREADS
871 # define SWIG_PYTHON_INITIALIZE_THREADS PyEval_InitThreads()
872 # endif
873 # ifdef __cplusplus /* C++ code */
874 class SWIG_Python_Thread_Block {
875 bool status;
876 PyGILState_STATE state;
877 public:
878 void end() { if (status) { PyGILState_Release(state); status = false;} }
879 SWIG_Python_Thread_Block() : status(true), state(PyGILState_Ensure()) {}
880 ~SWIG_Python_Thread_Block() { end(); }
881 };
882 class SWIG_Python_Thread_Allow {
883 bool status;
884 PyThreadState *save;
885 public:
886 void end() { if (status) { PyEval_RestoreThread(save); status = false; }}
887 SWIG_Python_Thread_Allow() : status(true), save(PyEval_SaveThread()) {}
888 ~SWIG_Python_Thread_Allow() { end(); }
889 };
890 # define SWIG_PYTHON_THREAD_BEGIN_BLOCK SWIG_Python_Thread_Block _swig_thread_block
891 # define SWIG_PYTHON_THREAD_END_BLOCK _swig_thread_block.end()
892 # define SWIG_PYTHON_THREAD_BEGIN_ALLOW SWIG_Python_Thread_Allow _swig_thread_allow
893 # define SWIG_PYTHON_THREAD_END_ALLOW _swig_thread_allow.end()
894 # else /* C code */
895 # define SWIG_PYTHON_THREAD_BEGIN_BLOCK PyGILState_STATE _swig_thread_block = PyGILState_Ensure()
896 # define SWIG_PYTHON_THREAD_END_BLOCK PyGILState_Release(_swig_thread_block)
897 # define SWIG_PYTHON_THREAD_BEGIN_ALLOW PyThreadState *_swig_thread_allow = PyEval_SaveThread()
898 # define SWIG_PYTHON_THREAD_END_ALLOW PyEval_RestoreThread(_swig_thread_allow)
899 # endif
900 # else /* Old thread way, not implemented, user must provide it */
901 # if !defined(SWIG_PYTHON_INITIALIZE_THREADS)
902 # define SWIG_PYTHON_INITIALIZE_THREADS
903 # endif
904 # if !defined(SWIG_PYTHON_THREAD_BEGIN_BLOCK)
905 # define SWIG_PYTHON_THREAD_BEGIN_BLOCK
906 # endif
907 # if !defined(SWIG_PYTHON_THREAD_END_BLOCK)
908 # define SWIG_PYTHON_THREAD_END_BLOCK
909 # endif
910 # if !defined(SWIG_PYTHON_THREAD_BEGIN_ALLOW)
911 # define SWIG_PYTHON_THREAD_BEGIN_ALLOW
912 # endif
913 # if !defined(SWIG_PYTHON_THREAD_END_ALLOW)
914 # define SWIG_PYTHON_THREAD_END_ALLOW
915 # endif
916 # endif
917 #else /* No thread support */
918 # define SWIG_PYTHON_INITIALIZE_THREADS
919 # define SWIG_PYTHON_THREAD_BEGIN_BLOCK
920 # define SWIG_PYTHON_THREAD_END_BLOCK
921 # define SWIG_PYTHON_THREAD_BEGIN_ALLOW
922 # define SWIG_PYTHON_THREAD_END_ALLOW
923 #endif
924
925 /* -----------------------------------------------------------------------------
926 * Python API portion that goes into the runtime
927 * ----------------------------------------------------------------------------- */
928
929 #ifdef __cplusplus
930 extern "C" {
931 #if 0
932 } /* cc-mode */
933 #endif
934 #endif
935
936 /* -----------------------------------------------------------------------------
937 * Constant declarations
938 * ----------------------------------------------------------------------------- */
939
940 /* Constant Types */
941 #define SWIG_PY_POINTER 4
942 #define SWIG_PY_BINARY 5
943
944 /* Constant information structure */
945 typedef struct swig_const_info {
946 int type;
947 char *name;
948 long lvalue;
949 double dvalue;
950 void *pvalue;
951 swig_type_info **ptype;
952 } swig_const_info;
953
954 #ifdef __cplusplus
955 #if 0
956 { /* cc-mode */
957 #endif
958 }
959 #endif
960
961
962 /* -----------------------------------------------------------------------------
963 * See the LICENSE file for information on copyright, usage and redistribution
964 * of SWIG, and the README file for authors - http://www.swig.org/release.html.
965 *
966 * pyrun.swg
967 *
968 * This file contains the runtime support for Python modules
969 * and includes code for managing global variables and pointer
970 * type checking.
971 *
972 * ----------------------------------------------------------------------------- */
973
974 /* Common SWIG API */
975
976 /* for raw pointers */
977 #define SWIG_Python_ConvertPtr(obj, pptr, type, flags) SWIG_Python_ConvertPtrAndOwn(obj, pptr, type, flags, 0)
978 #define SWIG_ConvertPtr(obj, pptr, type, flags) SWIG_Python_ConvertPtr(obj, pptr, type, flags)
979 #define SWIG_ConvertPtrAndOwn(obj,pptr,type,flags,own) SWIG_Python_ConvertPtrAndOwn(obj, pptr, type, flags, own)
980 #define SWIG_NewPointerObj(ptr, type, flags) SWIG_Python_NewPointerObj(ptr, type, flags)
981 #define SWIG_CheckImplicit(ty) SWIG_Python_CheckImplicit(ty)
982 #define SWIG_AcquirePtr(ptr, src) SWIG_Python_AcquirePtr(ptr, src)
983 #define swig_owntype int
984
985 /* for raw packed data */
986 #define SWIG_ConvertPacked(obj, ptr, sz, ty) SWIG_Python_ConvertPacked(obj, ptr, sz, ty)
987 #define SWIG_NewPackedObj(ptr, sz, type) SWIG_Python_NewPackedObj(ptr, sz, type)
988
989 /* for class or struct pointers */
990 #define SWIG_ConvertInstance(obj, pptr, type, flags) SWIG_ConvertPtr(obj, pptr, type, flags)
991 #define SWIG_NewInstanceObj(ptr, type, flags) SWIG_NewPointerObj(ptr, type, flags)
992
993 /* for C or C++ function pointers */
994 #define SWIG_ConvertFunctionPtr(obj, pptr, type) SWIG_Python_ConvertFunctionPtr(obj, pptr, type)
995 #define SWIG_NewFunctionPtrObj(ptr, type) SWIG_Python_NewPointerObj(ptr, type, 0)
996
997 /* for C++ member pointers, ie, member methods */
998 #define SWIG_ConvertMember(obj, ptr, sz, ty) SWIG_Python_ConvertPacked(obj, ptr, sz, ty)
999 #define SWIG_NewMemberObj(ptr, sz, type) SWIG_Python_NewPackedObj(ptr, sz, type)
1000
1001
1002 /* Runtime API */
1003
1004 #define SWIG_GetModule(clientdata) SWIG_Python_GetModule()
1005 #define SWIG_SetModule(clientdata, pointer) SWIG_Python_SetModule(pointer)
1006 #define SWIG_NewClientData(obj) PySwigClientData_New(obj)
1007
1008 #define SWIG_SetErrorObj SWIG_Python_SetErrorObj
1009 #define SWIG_SetErrorMsg SWIG_Python_SetErrorMsg
1010 #define SWIG_ErrorType(code) SWIG_Python_ErrorType(code)
1011 #define SWIG_Error(code, msg) SWIG_Python_SetErrorMsg(SWIG_ErrorType(code), msg)
1012 #define SWIG_fail goto fail
1013
1014
1015 /* Runtime API implementation */
1016
1017 /* Error manipulation */
1018
1019 SWIGINTERN void
1020 SWIG_Python_SetErrorObj(PyObject *errtype, PyObject *obj) {
1021 SWIG_PYTHON_THREAD_BEGIN_BLOCK;
1022 PyErr_SetObject(errtype, obj);
1023 Py_DECREF(obj);
1024 SWIG_PYTHON_THREAD_END_BLOCK;
1025 }
1026
1027 SWIGINTERN void
1028 SWIG_Python_SetErrorMsg(PyObject *errtype, const char *msg) {
1029 SWIG_PYTHON_THREAD_BEGIN_BLOCK;
1030 PyErr_SetString(errtype, (char *) msg);
1031 SWIG_PYTHON_THREAD_END_BLOCK;
1032 }
1033
1034 #define SWIG_Python_Raise(obj, type, desc) SWIG_Python_SetErrorObj(SWIG_Python_ExceptionType(desc), obj)
1035
1036 /* Set a constant value */
1037
1038 SWIGINTERN void
1039 SWIG_Python_SetConstant(PyObject *d, const char *name, PyObject *obj) {
1040 PyDict_SetItemString(d, (char*) name, obj);
1041 Py_DECREF(obj);
1042 }
1043
1044 /* Append a value to the result obj */
1045
1046 SWIGINTERN PyObject*
1047 SWIG_Python_AppendOutput(PyObject* result, PyObject* obj) {
1048 #if !defined(SWIG_PYTHON_OUTPUT_TUPLE)
1049 if (!result) {
1050 result = obj;
1051 } else if (result == Py_None) {
1052 Py_DECREF(result);
1053 result = obj;
1054 } else {
1055 if (!PyList_Check(result)) {
1056 PyObject *o2 = result;
1057 result = PyList_New(1);
1058 PyList_SetItem(result, 0, o2);
1059 }
1060 PyList_Append(result,obj);
1061 Py_DECREF(obj);
1062 }
1063 return result;
1064 #else
1065 PyObject* o2;
1066 PyObject* o3;
1067 if (!result) {
1068 result = obj;
1069 } else if (result == Py_None) {
1070 Py_DECREF(result);
1071 result = obj;
1072 } else {
1073 if (!PyTuple_Check(result)) {
1074 o2 = result;
1075 result = PyTuple_New(1);
1076 PyTuple_SET_ITEM(result, 0, o2);
1077 }
1078 o3 = PyTuple_New(1);
1079 PyTuple_SET_ITEM(o3, 0, obj);
1080 o2 = result;
1081 result = PySequence_Concat(o2, o3);
1082 Py_DECREF(o2);
1083 Py_DECREF(o3);
1084 }
1085 return result;
1086 #endif
1087 }
1088
1089 /* Unpack the argument tuple */
1090
1091 SWIGINTERN int
1092 SWIG_Python_UnpackTuple(PyObject *args, const char *name, int min, int max, PyObject **objs)
1093 {
1094 if (!args) {
1095 if (!min && !max) {
1096 return 1;
1097 } else {
1098 PyErr_Format(PyExc_TypeError, "%s expected %s%d arguments, got none",
1099 name, (min == max ? "" : "at least "), min);
1100 return 0;
1101 }
1102 }
1103 if (!PyTuple_Check(args)) {
1104 PyErr_SetString(PyExc_SystemError, "UnpackTuple() argument list is not a tuple");
1105 return 0;
1106 } else {
1107 register int l = PyTuple_GET_SIZE(args);
1108 if (l < min) {
1109 PyErr_Format(PyExc_TypeError, "%s expected %s%d arguments, got %d",
1110 name, (min == max ? "" : "at least "), min, l);
1111 return 0;
1112 } else if (l > max) {
1113 PyErr_Format(PyExc_TypeError, "%s expected %s%d arguments, got %d",
1114 name, (min == max ? "" : "at most "), max, l);
1115 return 0;
1116 } else {
1117 register int i;
1118 for (i = 0; i < l; ++i) {
1119 objs[i] = PyTuple_GET_ITEM(args, i);
1120 }
1121 for (; l < max; ++l) {
1122 objs[l] = 0;
1123 }
1124 return i + 1;
1125 }
1126 }
1127 }
1128
1129 /* A functor is a function object with one single object argument */
1130 #if PY_VERSION_HEX >= 0x02020000
1131 #define SWIG_Python_CallFunctor(functor, obj) PyObject_CallFunctionObjArgs(functor, obj, NULL);
1132 #else
1133 #define SWIG_Python_CallFunctor(functor, obj) PyObject_CallFunction(functor, "O", obj);
1134 #endif
1135
1136 /*
1137 Helper for static pointer initialization for both C and C++ code, for example
1138 static PyObject *SWIG_STATIC_POINTER(MyVar) = NewSomething(...);
1139 */
1140 #ifdef __cplusplus
1141 #define SWIG_STATIC_POINTER(var) var
1142 #else
1143 #define SWIG_STATIC_POINTER(var) var = 0; if (!var) var
1144 #endif
1145
1146 /* -----------------------------------------------------------------------------
1147 * Pointer declarations
1148 * ----------------------------------------------------------------------------- */
1149
1150 /* Flags for new pointer objects */
1151 #define SWIG_POINTER_NOSHADOW (SWIG_POINTER_OWN << 1)
1152 #define SWIG_POINTER_NEW (SWIG_POINTER_NOSHADOW | SWIG_POINTER_OWN)
1153
1154 #define SWIG_POINTER_IMPLICIT_CONV (SWIG_POINTER_DISOWN << 1)
1155
1156 #ifdef __cplusplus
1157 extern "C" {
1158 #if 0
1159 } /* cc-mode */
1160 #endif
1161 #endif
1162
1163 /* How to access Py_None */
1164 #if defined(_WIN32) || defined(__WIN32__) || defined(__CYGWIN__)
1165 # ifndef SWIG_PYTHON_NO_BUILD_NONE
1166 # ifndef SWIG_PYTHON_BUILD_NONE
1167 # define SWIG_PYTHON_BUILD_NONE
1168 # endif
1169 # endif
1170 #endif
1171
1172 #ifdef SWIG_PYTHON_BUILD_NONE
1173 # ifdef Py_None
1174 # undef Py_None
1175 # define Py_None SWIG_Py_None()
1176 # endif
1177 SWIGRUNTIMEINLINE PyObject *
1178 _SWIG_Py_None(void)
1179 {
1180 PyObject *none = Py_BuildValue((char*)"");
1181 Py_DECREF(none);
1182 return none;
1183 }
1184 SWIGRUNTIME PyObject *
1185 SWIG_Py_None(void)
1186 {
1187 static PyObject *SWIG_STATIC_POINTER(none) = _SWIG_Py_None();
1188 return none;
1189 }
1190 #endif
1191
1192 /* The python void return value */
1193
1194 SWIGRUNTIMEINLINE PyObject *
1195 SWIG_Py_Void(void)
1196 {
1197 PyObject *none = Py_None;
1198 Py_INCREF(none);
1199 return none;
1200 }
1201
1202 /* PySwigClientData */
1203
1204 typedef struct {
1205 PyObject *klass;
1206 PyObject *newraw;
1207 PyObject *newargs;
1208 PyObject *destroy;
1209 int delargs;
1210 int implicitconv;
1211 } PySwigClientData;
1212
1213 SWIGRUNTIMEINLINE int
1214 SWIG_Python_CheckImplicit(swig_type_info *ty)
1215 {
1216 PySwigClientData *data = (PySwigClientData *)ty->clientdata;
1217 return data ? data->implicitconv : 0;
1218 }
1219
1220 SWIGRUNTIMEINLINE PyObject *
1221 SWIG_Python_ExceptionType(swig_type_info *desc) {
1222 PySwigClientData *data = desc ? (PySwigClientData *) desc->clientdata : 0;
1223 PyObject *klass = data ? data->klass : 0;
1224 return (klass ? klass : PyExc_RuntimeError);
1225 }
1226
1227
1228 SWIGRUNTIME PySwigClientData *
1229 PySwigClientData_New(PyObject* obj)
1230 {
1231 if (!obj) {
1232 return 0;
1233 } else {
1234 PySwigClientData *data = (PySwigClientData *)malloc(sizeof(PySwigClientData));
1235 /* the klass element */
1236 data->klass = obj;
1237 Py_INCREF(data->klass);
1238 /* the newraw method and newargs arguments used to create a new raw instance */
1239 if (PyClass_Check(obj)) {
1240 data->newraw = 0;
1241 data->newargs = obj;
1242 Py_INCREF(obj);
1243 } else {
1244 #if (PY_VERSION_HEX < 0x02020000)
1245 data->newraw = 0;
1246 #else
1247 data->newraw = PyObject_GetAttrString(data->klass, (char *)"__new__");
1248 #endif
1249 if (data->newraw) {
1250 Py_INCREF(data->newraw);
1251 data->newargs = PyTuple_New(1);
1252 PyTuple_SetItem(data->newargs, 0, obj);
1253 } else {
1254 data->newargs = obj;
1255 }
1256 Py_INCREF(data->newargs);
1257 }
1258 /* the destroy method, aka as the C++ delete method */
1259 data->destroy = PyObject_GetAttrString(data->klass, (char *)"__swig_destroy__");
1260 if (PyErr_Occurred()) {
1261 PyErr_Clear();
1262 data->destroy = 0;
1263 }
1264 if (data->destroy) {
1265 int flags;
1266 Py_INCREF(data->destroy);
1267 flags = PyCFunction_GET_FLAGS(data->destroy);
1268 #ifdef METH_O
1269 data->delargs = !(flags & (METH_O));
1270 #else
1271 data->delargs = 0;
1272 #endif
1273 } else {
1274 data->delargs = 0;
1275 }
1276 data->implicitconv = 0;
1277 return data;
1278 }
1279 }
1280
1281 SWIGRUNTIME void
1282 PySwigClientData_Del(PySwigClientData* data)
1283 {
1284 Py_XDECREF(data->newraw);
1285 Py_XDECREF(data->newargs);
1286 Py_XDECREF(data->destroy);
1287 }
1288
1289 /* =============== PySwigObject =====================*/
1290
1291 typedef struct {
1292 PyObject_HEAD
1293 void *ptr;
1294 swig_type_info *ty;
1295 int own;
1296 PyObject *next;
1297 } PySwigObject;
1298
1299 SWIGRUNTIME PyObject *
1300 PySwigObject_long(PySwigObject *v)
1301 {
1302 return PyLong_FromVoidPtr(v->ptr);
1303 }
1304
1305 SWIGRUNTIME PyObject *
1306 PySwigObject_format(const char* fmt, PySwigObject *v)
1307 {
1308 PyObject *res = NULL;
1309 PyObject *args = PyTuple_New(1);
1310 if (args) {
1311 if (PyTuple_SetItem(args, 0, PySwigObject_long(v)) == 0) {
1312 PyObject *ofmt = PyString_FromString(fmt);
1313 if (ofmt) {
1314 res = PyString_Format(ofmt,args);
1315 Py_DECREF(ofmt);
1316 }
1317 Py_DECREF(args);
1318 }
1319 }
1320 return res;
1321 }
1322
1323 SWIGRUNTIME PyObject *
1324 PySwigObject_oct(PySwigObject *v)
1325 {
1326 return PySwigObject_format("%o",v);
1327 }
1328
1329 SWIGRUNTIME PyObject *
1330 PySwigObject_hex(PySwigObject *v)
1331 {
1332 return PySwigObject_format("%x",v);
1333 }
1334
1335 SWIGRUNTIME PyObject *
1336 #ifdef METH_NOARGS
1337 PySwigObject_repr(PySwigObject *v)
1338 #else
1339 PySwigObject_repr(PySwigObject *v, PyObject *args)
1340 #endif
1341 {
1342 const char *name = SWIG_TypePrettyName(v->ty);
1343 PyObject *hex = PySwigObject_hex(v);
1344 PyObject *repr = PyString_FromFormat("<Swig Object of type '%s' at 0x%s>", name, PyString_AsString(hex));
1345 Py_DECREF(hex);
1346 if (v->next) {
1347 #ifdef METH_NOARGS
1348 PyObject *nrep = PySwigObject_repr((PySwigObject *)v->next);
1349 #else
1350 PyObject *nrep = PySwigObject_repr((PySwigObject *)v->next, args);
1351 #endif
1352 PyString_ConcatAndDel(&repr,nrep);
1353 }
1354 return repr;
1355 }
1356
1357 SWIGRUNTIME int
1358 PySwigObject_print(PySwigObject *v, FILE *fp, int SWIGUNUSEDPARM(flags))
1359 {
1360 #ifdef METH_NOARGS
1361 PyObject *repr = PySwigObject_repr(v);
1362 #else
1363 PyObject *repr = PySwigObject_repr(v, NULL);
1364 #endif
1365 if (repr) {
1366 fputs(PyString_AsString(repr), fp);
1367 Py_DECREF(repr);
1368 return 0;
1369 } else {
1370 return 1;
1371 }
1372 }
1373
1374 SWIGRUNTIME PyObject *
1375 PySwigObject_str(PySwigObject *v)
1376 {
1377 char result[SWIG_BUFFER_SIZE];
1378 return SWIG_PackVoidPtr(result, v->ptr, v->ty->name, sizeof(result)) ?
1379 PyString_FromString(result) : 0;
1380 }
1381
1382 SWIGRUNTIME int
1383 PySwigObject_compare(PySwigObject *v, PySwigObject *w)
1384 {
1385 void *i = v->ptr;
1386 void *j = w->ptr;
1387 return (i < j) ? -1 : ((i > j) ? 1 : 0);
1388 }
1389
1390 SWIGRUNTIME PyTypeObject* _PySwigObject_type(void);
1391
1392 SWIGRUNTIME PyTypeObject*
1393 PySwigObject_type(void) {
1394 static PyTypeObject *SWIG_STATIC_POINTER(type) = _PySwigObject_type();
1395 return type;
1396 }
1397
1398 SWIGRUNTIMEINLINE int
1399 PySwigObject_Check(PyObject *op) {
1400 return ((op)->ob_type == PySwigObject_type())
1401 || (strcmp((op)->ob_type->tp_name,"PySwigObject") == 0);
1402 }
1403
1404 SWIGRUNTIME PyObject *
1405 PySwigObject_New(void *ptr, swig_type_info *ty, int own);
1406
1407 SWIGRUNTIME void
1408 PySwigObject_dealloc(PyObject *v)
1409 {
1410 PySwigObject *sobj = (PySwigObject *) v;
1411 PyObject *next = sobj->next;
1412 if (sobj->own) {
1413 swig_type_info *ty = sobj->ty;
1414 PySwigClientData *data = ty ? (PySwigClientData *) ty->clientdata : 0;
1415 PyObject *destroy = data ? data->destroy : 0;
1416 if (destroy) {
1417 /* destroy is always a VARARGS method */
1418 PyObject *res;
1419 if (data->delargs) {
1420 /* we need to create a temporal object to carry the destroy operation */
1421 PyObject *tmp = PySwigObject_New(sobj->ptr, ty, 0);
1422 res = SWIG_Python_CallFunctor(destroy, tmp);
1423 Py_DECREF(tmp);
1424 } else {
1425 PyCFunction meth = PyCFunction_GET_FUNCTION(destroy);
1426 PyObject *mself = PyCFunction_GET_SELF(destroy);
1427 res = ((*meth)(mself, v));
1428 }
1429 Py_XDECREF(res);
1430 } else {
1431 const char *name = SWIG_TypePrettyName(ty);
1432 #if !defined(SWIG_PYTHON_SILENT_MEMLEAK)
1433 printf("swig/python detected a memory leak of type '%s', no destructor found.\n", name);
1434 #endif
1435 }
1436 }
1437 Py_XDECREF(next);
1438 PyObject_DEL(v);
1439 }
1440
1441 SWIGRUNTIME PyObject*
1442 PySwigObject_append(PyObject* v, PyObject* next)
1443 {
1444 PySwigObject *sobj = (PySwigObject *) v;
1445 #ifndef METH_O
1446 PyObject *tmp = 0;
1447 if (!PyArg_ParseTuple(next,(char *)"O:append", &tmp)) return NULL;
1448 next = tmp;
1449 #endif
1450 if (!PySwigObject_Check(next)) {
1451 return NULL;
1452 }
1453 sobj->next = next;
1454 Py_INCREF(next);
1455 return SWIG_Py_Void();
1456 }
1457
1458 SWIGRUNTIME PyObject*
1459 #ifdef METH_NOARGS
1460 PySwigObject_next(PyObject* v)
1461 #else
1462 PySwigObject_next(PyObject* v, PyObject *SWIGUNUSEDPARM(args))
1463 #endif
1464 {
1465 PySwigObject *sobj = (PySwigObject *) v;
1466 if (sobj->next) {
1467 Py_INCREF(sobj->next);
1468 return sobj->next;
1469 } else {
1470 return SWIG_Py_Void();
1471 }
1472 }
1473
1474 SWIGINTERN PyObject*
1475 #ifdef METH_NOARGS
1476 PySwigObject_disown(PyObject *v)
1477 #else
1478 PySwigObject_disown(PyObject* v, PyObject *SWIGUNUSEDPARM(args))
1479 #endif
1480 {
1481 PySwigObject *sobj = (PySwigObject *)v;
1482 sobj->own = 0;
1483 return SWIG_Py_Void();
1484 }
1485
1486 SWIGINTERN PyObject*
1487 #ifdef METH_NOARGS
1488 PySwigObject_acquire(PyObject *v)
1489 #else
1490 PySwigObject_acquire(PyObject* v, PyObject *SWIGUNUSEDPARM(args))
1491 #endif
1492 {
1493 PySwigObject *sobj = (PySwigObject *)v;
1494 sobj->own = SWIG_POINTER_OWN;
1495 return SWIG_Py_Void();
1496 }
1497
1498 SWIGINTERN PyObject*
1499 PySwigObject_own(PyObject *v, PyObject *args)
1500 {
1501 PyObject *val = 0;
1502 #if (PY_VERSION_HEX < 0x02020000)
1503 if (!PyArg_ParseTuple(args,(char *)"|O:own",&val))
1504 #else
1505 if (!PyArg_UnpackTuple(args, (char *)"own", 0, 1, &val))
1506 #endif
1507 {
1508 return NULL;
1509 }
1510 else
1511 {
1512 PySwigObject *sobj = (PySwigObject *)v;
1513 PyObject *obj = PyBool_FromLong(sobj->own);
1514 if (val) {
1515 #ifdef METH_NOARGS
1516 if (PyObject_IsTrue(val)) {
1517 PySwigObject_acquire(v);
1518 } else {
1519 PySwigObject_disown(v);
1520 }
1521 #else
1522 if (PyObject_IsTrue(val)) {
1523 PySwigObject_acquire(v,args);
1524 } else {
1525 PySwigObject_disown(v,args);
1526 }
1527 #endif
1528 }
1529 return obj;
1530 }
1531 }
1532
1533 #ifdef METH_O
1534 static PyMethodDef
1535 swigobject_methods[] = {
1536 {(char *)"disown", (PyCFunction)PySwigObject_disown, METH_NOARGS, (char *)"releases ownership of the pointer"},
1537 {(char *)"acquire", (PyCFunction)PySwigObject_acquire, METH_NOARGS, (char *)"aquires ownership of the pointer"},
1538 {(char *)"own", (PyCFunction)PySwigObject_own, METH_VARARGS, (char *)"returns/sets ownership of the pointer"},
1539 {(char *)"append", (PyCFunction)PySwigObject_append, METH_O, (char *)"appends another 'this' object"},
1540 {(char *)"next", (PyCFunction)PySwigObject_next, METH_NOARGS, (char *)"returns the next 'this' object"},
1541 {(char *)"__repr__",(PyCFunction)PySwigObject_repr, METH_NOARGS, (char *)"returns object representation"},
1542 {0, 0, 0, 0}
1543 };
1544 #else
1545 static PyMethodDef
1546 swigobject_methods[] = {
1547 {(char *)"disown", (PyCFunction)PySwigObject_disown, METH_VARARGS, (char *)"releases ownership of the pointer"},
1548 {(char *)"acquire", (PyCFunction)PySwigObject_acquire, METH_VARARGS, (char *)"aquires ownership of the pointer"},
1549 {(char *)"own", (PyCFunction)PySwigObject_own, METH_VARARGS, (char *)"returns/sets ownership of the pointer"},
1550 {(char *)"append", (PyCFunction)PySwigObject_append, METH_VARARGS, (char *)"appends another 'this' object"},
1551 {(char *)"next", (PyCFunction)PySwigObject_next, METH_VARARGS, (char *)"returns the next 'this' object"},
1552 {(char *)"__repr__",(PyCFunction)PySwigObject_repr, METH_VARARGS, (char *)"returns object representation"},
1553 {0, 0, 0, 0}
1554 };
1555 #endif
1556
1557 #if PY_VERSION_HEX < 0x02020000
1558 SWIGINTERN PyObject *
1559 PySwigObject_getattr(PySwigObject *sobj,char *name)
1560 {
1561 return Py_FindMethod(swigobject_methods, (PyObject *)sobj, name);
1562 }
1563 #endif
1564
1565 SWIGRUNTIME PyTypeObject*
1566 _PySwigObject_type(void) {
1567 static char swigobject_doc[] = "Swig object carries a C/C++ instance pointer";
1568
1569 static PyNumberMethods PySwigObject_as_number = {
1570 (binaryfunc)0, /*nb_add*/
1571 (binaryfunc)0, /*nb_subtract*/
1572 (binaryfunc)0, /*nb_multiply*/
1573 (binaryfunc)0, /*nb_divide*/
1574 (binaryfunc)0, /*nb_remainder*/
1575 (binaryfunc)0, /*nb_divmod*/
1576 (ternaryfunc)0,/*nb_power*/
1577 (unaryfunc)0, /*nb_negative*/
1578 (unaryfunc)0, /*nb_positive*/
1579 (unaryfunc)0, /*nb_absolute*/
1580 (inquiry)0, /*nb_nonzero*/
1581 0, /*nb_invert*/
1582 0, /*nb_lshift*/
1583 0, /*nb_rshift*/
1584 0, /*nb_and*/
1585 0, /*nb_xor*/
1586 0, /*nb_or*/
1587 (coercion)0, /*nb_coerce*/
1588 (unaryfunc)PySwigObject_long, /*nb_int*/
1589 (unaryfunc)PySwigObject_long, /*nb_long*/
1590 (unaryfunc)0, /*nb_float*/
1591 (unaryfunc)PySwigObject_oct, /*nb_oct*/
1592 (unaryfunc)PySwigObject_hex, /*nb_hex*/
1593 #if PY_VERSION_HEX >= 0x02020000
1594 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 /* nb_inplace_add -> nb_inplace_true_divide */
1595 #elif PY_VERSION_HEX >= 0x02000000
1596 0,0,0,0,0,0,0,0,0,0,0 /* nb_inplace_add -> nb_inplace_or */
1597 #endif
1598 };
1599
1600 static PyTypeObject pyswigobject_type;
1601 static int type_init = 0;
1602 if (!type_init) {
1603 const PyTypeObject tmp
1604 = {
1605 PyObject_HEAD_INIT(NULL)
1606 0, /* ob_size */
1607 (char *)"PySwigObject", /* tp_name */
1608 sizeof(PySwigObject), /* tp_basicsize */
1609 0, /* tp_itemsize */
1610 (destructor)PySwigObject_dealloc, /* tp_dealloc */
1611 (printfunc)PySwigObject_print, /* tp_print */
1612 #if PY_VERSION_HEX < 0x02020000
1613 (getattrfunc)PySwigObject_getattr, /* tp_getattr */
1614 #else
1615 (getattrfunc)0, /* tp_getattr */
1616 #endif
1617 (setattrfunc)0, /* tp_setattr */
1618 (cmpfunc)PySwigObject_compare, /* tp_compare */
1619 (reprfunc)PySwigObject_repr, /* tp_repr */
1620 &PySwigObject_as_number, /* tp_as_number */
1621 0, /* tp_as_sequence */
1622 0, /* tp_as_mapping */
1623 (hashfunc)0, /* tp_hash */
1624 (ternaryfunc)0, /* tp_call */
1625 (reprfunc)PySwigObject_str, /* tp_str */
1626 PyObject_GenericGetAttr, /* tp_getattro */
1627 0, /* tp_setattro */
1628 0, /* tp_as_buffer */
1629 Py_TPFLAGS_DEFAULT, /* tp_flags */
1630 swigobject_doc, /* tp_doc */
1631 0, /* tp_traverse */
1632 0, /* tp_clear */
1633 0, /* tp_richcompare */
1634 0, /* tp_weaklistoffset */
1635 #if PY_VERSION_HEX >= 0x02020000
1636 0, /* tp_iter */
1637 0, /* tp_iternext */
1638 swigobject_methods, /* tp_methods */
1639 0, /* tp_members */
1640 0, /* tp_getset */
1641 0, /* tp_base */
1642 0, /* tp_dict */
1643 0, /* tp_descr_get */
1644 0, /* tp_descr_set */
1645 0, /* tp_dictoffset */
1646 0, /* tp_init */
1647 0, /* tp_alloc */
1648 0, /* tp_new */
1649 0, /* tp_free */
1650 0, /* tp_is_gc */
1651 0, /* tp_bases */
1652 0, /* tp_mro */
1653 0, /* tp_cache */
1654 0, /* tp_subclasses */
1655 0, /* tp_weaklist */
1656 #endif
1657 #if PY_VERSION_HEX >= 0x02030000
1658 0, /* tp_del */
1659 #endif
1660 #ifdef COUNT_ALLOCS
1661 0,0,0,0 /* tp_alloc -> tp_next */
1662 #endif
1663 };
1664 pyswigobject_type = tmp;
1665 pyswigobject_type.ob_type = &PyType_Type;
1666 type_init = 1;
1667 }
1668 return &pyswigobject_type;
1669 }
1670
1671 SWIGRUNTIME PyObject *
1672 PySwigObject_New(void *ptr, swig_type_info *ty, int own)
1673 {
1674 PySwigObject *sobj = PyObject_NEW(PySwigObject, PySwigObject_type());
1675 if (sobj) {
1676 sobj->ptr = ptr;
1677 sobj->ty = ty;
1678 sobj->own = own;
1679 sobj->next = 0;
1680 }
1681 return (PyObject *)sobj;
1682 }
1683
1684 /* -----------------------------------------------------------------------------
1685 * Implements a simple Swig Packed type, and use it instead of string
1686 * ----------------------------------------------------------------------------- */
1687
1688 typedef struct {
1689 PyObject_HEAD
1690 void *pack;
1691 swig_type_info *ty;
1692 size_t size;
1693 } PySwigPacked;
1694
1695 SWIGRUNTIME int
1696 PySwigPacked_print(PySwigPacked *v, FILE *fp, int SWIGUNUSEDPARM(flags))
1697 {
1698 char result[SWIG_BUFFER_SIZE];
1699 fputs("<Swig Packed ", fp);
1700 if (SWIG_PackDataName(result, v->pack, v->size, 0, sizeof(result))) {
1701 fputs("at ", fp);
1702 fputs(result, fp);
1703 }
1704 fputs(v->ty->name,fp);
1705 fputs(">", fp);
1706 return 0;
1707 }
1708
1709 SWIGRUNTIME PyObject *
1710 PySwigPacked_repr(PySwigPacked *v)
1711 {
1712 char result[SWIG_BUFFER_SIZE];
1713 if (SWIG_PackDataName(result, v->pack, v->size, 0, sizeof(result))) {
1714 return PyString_FromFormat("<Swig Packed at %s%s>", result, v->ty->name);
1715 } else {
1716 return PyString_FromFormat("<Swig Packed %s>", v->ty->name);
1717 }
1718 }
1719
1720 SWIGRUNTIME PyObject *
1721 PySwigPacked_str(PySwigPacked *v)
1722 {
1723 char result[SWIG_BUFFER_SIZE];
1724 if (SWIG_PackDataName(result, v->pack, v->size, 0, sizeof(result))){
1725 return PyString_FromFormat("%s%s", result, v->ty->name);
1726 } else {
1727 return PyString_FromString(v->ty->name);
1728 }
1729 }
1730
1731 SWIGRUNTIME int
1732 PySwigPacked_compare(PySwigPacked *v, PySwigPacked *w)
1733 {
1734 size_t i = v->size;
1735 size_t j = w->size;
1736 int s = (i < j) ? -1 : ((i > j) ? 1 : 0);
1737 return s ? s : strncmp((char *)v->pack, (char *)w->pack, 2*v->size);
1738 }
1739
1740 SWIGRUNTIME PyTypeObject* _PySwigPacked_type(void);
1741
1742 SWIGRUNTIME PyTypeObject*
1743 PySwigPacked_type(void) {
1744 static PyTypeObject *SWIG_STATIC_POINTER(type) = _PySwigPacked_type();
1745 return type;
1746 }
1747
1748 SWIGRUNTIMEINLINE int
1749 PySwigPacked_Check(PyObject *op) {
1750 return ((op)->ob_type == _PySwigPacked_type())
1751 || (strcmp((op)->ob_type->tp_name,"PySwigPacked") == 0);
1752 }
1753
1754 SWIGRUNTIME void
1755 PySwigPacked_dealloc(PyObject *v)
1756 {
1757 if (PySwigPacked_Check(v)) {
1758 PySwigPacked *sobj = (PySwigPacked *) v;
1759 free(sobj->pack);
1760 }
1761 PyObject_DEL(v);
1762 }
1763
1764 SWIGRUNTIME PyTypeObject*
1765 _PySwigPacked_type(void) {
1766 static char swigpacked_doc[] = "Swig object carries a C/C++ instance pointer";
1767 static PyTypeObject pyswigpacked_type;
1768 static int type_init = 0;
1769 if (!type_init) {
1770 const PyTypeObject tmp
1771 = {
1772 PyObject_HEAD_INIT(NULL)
1773 0, /* ob_size */
1774 (char *)"PySwigPacked", /* tp_name */
1775 sizeof(PySwigPacked), /* tp_basicsize */
1776 0, /* tp_itemsize */
1777 (destructor)PySwigPacked_dealloc, /* tp_dealloc */
1778 (printfunc)PySwigPacked_print, /* tp_print */
1779 (getattrfunc)0, /* tp_getattr */
1780 (setattrfunc)0, /* tp_setattr */
1781 (cmpfunc)PySwigPacked_compare, /* tp_compare */
1782 (reprfunc)PySwigPacked_repr, /* tp_repr */
1783 0, /* tp_as_number */
1784 0, /* tp_as_sequence */
1785 0, /* tp_as_mapping */
1786 (hashfunc)0, /* tp_hash */
1787 (ternaryfunc)0, /* tp_call */
1788 (reprfunc)PySwigPacked_str, /* tp_str */
1789 PyObject_GenericGetAttr, /* tp_getattro */
1790 0, /* tp_setattro */
1791 0, /* tp_as_buffer */
1792 Py_TPFLAGS_DEFAULT, /* tp_flags */
1793 swigpacked_doc, /* tp_doc */
1794 0, /* tp_traverse */
1795 0, /* tp_clear */
1796 0, /* tp_richcompare */
1797 0, /* tp_weaklistoffset */
1798 #if PY_VERSION_HEX >= 0x02020000
1799 0, /* tp_iter */
1800 0, /* tp_iternext */
1801 0, /* tp_methods */
1802 0, /* tp_members */
1803 0, /* tp_getset */
1804 0, /* tp_base */
1805 0, /* tp_dict */
1806 0, /* tp_descr_get */
1807 0, /* tp_descr_set */
1808 0, /* tp_dictoffset */
1809 0, /* tp_init */
1810 0, /* tp_alloc */
1811 0, /* tp_new */
1812 0, /* tp_free */
1813 0, /* tp_is_gc */
1814 0, /* tp_bases */
1815 0, /* tp_mro */
1816 0, /* tp_cache */
1817 0, /* tp_subclasses */
1818 0, /* tp_weaklist */
1819 #endif
1820 #if PY_VERSION_HEX >= 0x02030000
1821 0, /* tp_del */
1822 #endif
1823 #ifdef COUNT_ALLOCS
1824 0,0,0,0 /* tp_alloc -> tp_next */
1825 #endif
1826 };
1827 pyswigpacked_type = tmp;
1828 pyswigpacked_type.ob_type = &PyType_Type;
1829 type_init = 1;
1830 }
1831 return &pyswigpacked_type;
1832 }
1833
1834 SWIGRUNTIME PyObject *
1835 PySwigPacked_New(void *ptr, size_t size, swig_type_info *ty)
1836 {
1837 PySwigPacked *sobj = PyObject_NEW(PySwigPacked, PySwigPacked_type());
1838 if (sobj) {
1839 void *pack = malloc(size);
1840 if (pack) {
1841 memcpy(pack, ptr, size);
1842 sobj->pack = pack;
1843 sobj->ty = ty;
1844 sobj->size = size;
1845 } else {
1846 PyObject_DEL((PyObject *) sobj);
1847 sobj = 0;
1848 }
1849 }
1850 return (PyObject *) sobj;
1851 }
1852
1853 SWIGRUNTIME swig_type_info *
1854 PySwigPacked_UnpackData(PyObject *obj, void *ptr, size_t size)
1855 {
1856 if (PySwigPacked_Check(obj)) {
1857 PySwigPacked *sobj = (PySwigPacked *)obj;
1858 if (sobj->size != size) return 0;
1859 memcpy(ptr, sobj->pack, size);
1860 return sobj->ty;
1861 } else {
1862 return 0;
1863 }
1864 }
1865
1866 /* -----------------------------------------------------------------------------
1867 * pointers/data manipulation
1868 * ----------------------------------------------------------------------------- */
1869
1870 SWIGRUNTIMEINLINE PyObject *
1871 _SWIG_This(void)
1872 {
1873 return PyString_FromString("this");
1874 }
1875
1876 SWIGRUNTIME PyObject *
1877 SWIG_This(void)
1878 {
1879 static PyObject *SWIG_STATIC_POINTER(swig_this) = _SWIG_This();
1880 return swig_this;
1881 }
1882
1883 /* #define SWIG_PYTHON_SLOW_GETSET_THIS */
1884
1885 SWIGRUNTIME PySwigObject *
1886 SWIG_Python_GetSwigThis(PyObject *pyobj)
1887 {
1888 if (PySwigObject_Check(pyobj)) {
1889 return (PySwigObject *) pyobj;
1890 } else {
1891 PyObject *obj = 0;
1892 #if (!defined(SWIG_PYTHON_SLOW_GETSET_THIS) && (PY_VERSION_HEX >= 0x02030000))
1893 if (PyInstance_Check(pyobj)) {
1894 obj = _PyInstance_Lookup(pyobj, SWIG_This());
1895 } else {
1896 PyObject **dictptr = _PyObject_GetDictPtr(pyobj);
1897 if (dictptr != NULL) {
1898 PyObject *dict = *dictptr;
1899 obj = dict ? PyDict_GetItem(dict, SWIG_This()) : 0;
1900 } else {
1901 #ifdef PyWeakref_CheckProxy
1902 if (PyWeakref_CheckProxy(pyobj)) {
1903 PyObject *wobj = PyWeakref_GET_OBJECT(pyobj);
1904 return wobj ? SWIG_Python_GetSwigThis(wobj) : 0;
1905 }
1906 #endif
1907 obj = PyObject_GetAttr(pyobj,SWIG_This());
1908 if (obj) {
1909 Py_DECREF(obj);
1910 } else {
1911 if (PyErr_Occurred()) PyErr_Clear();
1912 return 0;
1913 }
1914 }
1915 }
1916 #else
1917 obj = PyObject_GetAttr(pyobj,SWIG_This());
1918 if (obj) {
1919 Py_DECREF(obj);
1920 } else {
1921 if (PyErr_Occurred()) PyErr_Clear();
1922 return 0;
1923 }
1924 #endif
1925 if (obj && !PySwigObject_Check(obj)) {
1926 /* a PyObject is called 'this', try to get the 'real this'
1927 PySwigObject from it */
1928 return SWIG_Python_GetSwigThis(obj);
1929 }
1930 return (PySwigObject *)obj;
1931 }
1932 }
1933
1934 /* Acquire a pointer value */
1935
1936 SWIGRUNTIME int
1937 SWIG_Python_AcquirePtr(PyObject *obj, int own) {
1938 if (own) {
1939 PySwigObject *sobj = SWIG_Python_GetSwigThis(obj);
1940 if (sobj) {
1941 int oldown = sobj->own;
1942 sobj->own = own;
1943 return oldown;
1944 }
1945 }
1946 return 0;
1947 }
1948
1949 /* Convert a pointer value */
1950
1951 SWIGRUNTIME int
1952 SWIG_Python_ConvertPtrAndOwn(PyObject *obj, void **ptr, swig_type_info *ty, int flags, int *own) {
1953 if (!obj) return SWIG_ERROR;
1954 if (obj == Py_None) {
1955 if (ptr) *ptr = 0;
1956 return SWIG_OK;
1957 } else {
1958 PySwigObject *sobj = SWIG_Python_GetSwigThis(obj);
1959 while (sobj) {
1960 void *vptr = sobj->ptr;
1961 if (ty) {
1962 swig_type_info *to = sobj->ty;
1963 if (to == ty) {
1964 /* no type cast needed */
1965 if (ptr) *ptr = vptr;
1966 break;
1967 } else {
1968 swig_cast_info *tc = SWIG_TypeCheck(to->name,ty);
1969 if (!tc) {
1970 sobj = (PySwigObject *)sobj->next;
1971 } else {
1972 if (ptr) *ptr = SWIG_TypeCast(tc,vptr);
1973 break;
1974 }
1975 }
1976 } else {
1977 if (ptr) *ptr = vptr;
1978 break;
1979 }
1980 }
1981 if (sobj) {
1982 if (own) *own = sobj->own;
1983 if (flags & SWIG_POINTER_DISOWN) {
1984 sobj->own = 0;
1985 }
1986 return SWIG_OK;
1987 } else {
1988 int res = SWIG_ERROR;
1989 if (flags & SWIG_POINTER_IMPLICIT_CONV) {
1990 PySwigClientData *data = ty ? (PySwigClientData *) ty->clientdata : 0;
1991 if (data && !data->implicitconv) {
1992 PyObject *klass = data->klass;
1993 if (klass) {
1994 PyObject *impconv;
1995 data->implicitconv = 1; /* avoid recursion and call 'explicit' constructors*/
1996 impconv = SWIG_Python_CallFunctor(klass, obj);
1997 data->implicitconv = 0;
1998 if (PyErr_Occurred()) {
1999 PyErr_Clear();
2000 impconv = 0;
2001 }
2002 if (impconv) {
2003 PySwigObject *iobj = SWIG_Python_GetSwigThis(impconv);
2004 if (iobj) {
2005 void *vptr;
2006 res = SWIG_Python_ConvertPtrAndOwn((PyObject*)iobj, &vptr, ty, 0, 0);
2007 if (SWIG_IsOK(res)) {
2008 if (ptr) {
2009 *ptr = vptr;
2010 /* transfer the ownership to 'ptr' */
2011 iobj->own = 0;
2012 res = SWIG_AddCast(res);
2013 res = SWIG_AddNewMask(res);
2014 } else {
2015 res = SWIG_AddCast(res);
2016 }
2017 }
2018 }
2019 Py_DECREF(impconv);
2020 }
2021 }
2022 }
2023 }
2024 return res;
2025 }
2026 }
2027 }
2028
2029 /* Convert a function ptr value */
2030
2031 SWIGRUNTIME int
2032 SWIG_Python_ConvertFunctionPtr(PyObject *obj, void **ptr, swig_type_info *ty) {
2033 if (!PyCFunction_Check(obj)) {
2034 return SWIG_ConvertPtr(obj, ptr, ty, 0);
2035 } else {
2036 void *vptr = 0;
2037
2038 /* here we get the method pointer for callbacks */
2039 const char *doc = (((PyCFunctionObject *)obj) -> m_ml -> ml_doc);
2040 const char *desc = doc ? strstr(doc, "swig_ptr: ") : 0;
2041 if (desc) {
2042 desc = ty ? SWIG_UnpackVoidPtr(desc + 10, &vptr, ty->name) : 0;
2043 if (!desc) return SWIG_ERROR;
2044 }
2045 if (ty) {
2046 swig_cast_info *tc = SWIG_TypeCheck(desc,ty);
2047 if (!tc) return SWIG_ERROR;
2048 *ptr = SWIG_TypeCast(tc,vptr);
2049 } else {
2050 *ptr = vptr;
2051 }
2052 return SWIG_OK;
2053 }
2054 }
2055
2056 /* Convert a packed value value */
2057
2058 SWIGRUNTIME int
2059 SWIG_Python_ConvertPacked(PyObject *obj, void *ptr, size_t sz, swig_type_info *ty) {
2060 swig_type_info *to = PySwigPacked_UnpackData(obj, ptr, sz);
2061 if (!to) return SWIG_ERROR;
2062 if (ty) {
2063 if (to != ty) {
2064 /* check type cast? */
2065 swig_cast_info *tc = SWIG_TypeCheck(to->name,ty);
2066 if (!tc) return SWIG_ERROR;
2067 }
2068 }
2069 return SWIG_OK;
2070 }
2071
2072 /* -----------------------------------------------------------------------------
2073 * Create a new pointer object
2074 * ----------------------------------------------------------------------------- */
2075
2076 /*
2077 Create a new instance object, whitout calling __init__, and set the
2078 'this' attribute.
2079 */
2080
2081 SWIGRUNTIME PyObject*
2082 SWIG_Python_NewShadowInstance(PySwigClientData *data, PyObject *swig_this)
2083 {
2084 #if (PY_VERSION_HEX >= 0x02020000)
2085 PyObject *inst = 0;
2086 PyObject *newraw = data->newraw;
2087 if (newraw) {
2088 inst = PyObject_Call(newraw, data->newargs, NULL);
2089 if (inst) {
2090 #if !defined(SWIG_PYTHON_SLOW_GETSET_THIS)
2091 PyObject **dictptr = _PyObject_GetDictPtr(inst);
2092 if (dictptr != NULL) {
2093 PyObject *dict = *dictptr;
2094 if (dict == NULL) {
2095 dict = PyDict_New();
2096 *dictptr = dict;
2097 PyDict_SetItem(dict, SWIG_This(), swig_this);
2098 }
2099 }
2100 #else
2101 PyObject *key = SWIG_This();
2102 PyObject_SetAttr(inst, key, swig_this);
2103 #endif
2104 }
2105 } else {
2106 PyObject *dict = PyDict_New();
2107 PyDict_SetItem(dict, SWIG_This(), swig_this);
2108 inst = PyInstance_NewRaw(data->newargs, dict);
2109 Py_DECREF(dict);
2110 }
2111 return inst;
2112 #else
2113 #if (PY_VERSION_HEX >= 0x02010000)
2114 PyObject *inst;
2115 PyObject *dict = PyDict_New();
2116 PyDict_SetItem(dict, SWIG_This(), swig_this);
2117 inst = PyInstance_NewRaw(data->newargs, dict);
2118 Py_DECREF(dict);
2119 return (PyObject *) inst;
2120 #else
2121 PyInstanceObject *inst = PyObject_NEW(PyInstanceObject, &PyInstance_Type);
2122 if (inst == NULL) {
2123 return NULL;
2124 }
2125 inst->in_class = (PyClassObject *)data->newargs;
2126 Py_INCREF(inst->in_class);
2127 inst->in_dict = PyDict_New();
2128 if (inst->in_dict == NULL) {
2129 Py_DECREF(inst);
2130 return NULL;
2131 }
2132 #ifdef Py_TPFLAGS_HAVE_WEAKREFS
2133 inst->in_weakreflist = NULL;
2134 #endif
2135 #ifdef Py_TPFLAGS_GC
2136 PyObject_GC_Init(inst);
2137 #endif
2138 PyDict_SetItem(inst->in_dict, SWIG_This(), swig_this);
2139 return (PyObject *) inst;
2140 #endif
2141 #endif
2142 }
2143
2144 SWIGRUNTIME void
2145 SWIG_Python_SetSwigThis(PyObject *inst, PyObject *swig_this)
2146 {
2147 PyObject *dict;
2148 #if (PY_VERSION_HEX >= 0x02020000) && !defined(SWIG_PYTHON_SLOW_GETSET_THIS)
2149 PyObject **dictptr = _PyObject_GetDictPtr(inst);
2150 if (dictptr != NULL) {
2151 dict = *dictptr;
2152 if (dict == NULL) {
2153 dict = PyDict_New();
2154 *dictptr = dict;
2155 }
2156 PyDict_SetItem(dict, SWIG_This(), swig_this);
2157 return;
2158 }
2159 #endif
2160 dict = PyObject_GetAttrString(inst, (char*)"__dict__");
2161 PyDict_SetItem(dict, SWIG_This(), swig_this);
2162 Py_DECREF(dict);
2163 }
2164
2165
2166 SWIGINTERN PyObject *
2167 SWIG_Python_InitShadowInstance(PyObject *args) {
2168 PyObject *obj[2];
2169 if (!SWIG_Python_UnpackTuple(args,(char*)"swiginit", 2, 2, obj)) {
2170 return NULL;
2171 } else {
2172 PySwigObject *sthis = SWIG_Python_GetSwigThis(obj[0]);
2173 if (sthis) {
2174 PySwigObject_append((PyObject*) sthis, obj[1]);
2175 } else {
2176 SWIG_Python_SetSwigThis(obj[0], obj[1]);
2177 }
2178 return SWIG_Py_Void();
2179 }
2180 }
2181
2182 /* Create a new pointer object */
2183
2184 SWIGRUNTIME PyObject *
2185 SWIG_Python_NewPointerObj(void *ptr, swig_type_info *type, int flags) {
2186 if (!ptr) {
2187 return SWIG_Py_Void();
2188 } else {
2189 int own = (flags & SWIG_POINTER_OWN) ? SWIG_POINTER_OWN : 0;
2190 PyObject *robj = PySwigObject_New(ptr, type, own);
2191 PySwigClientData *clientdata = type ? (PySwigClientData *)(type->clientdata) : 0;
2192 if (clientdata && !(flags & SWIG_POINTER_NOSHADOW)) {
2193 PyObject *inst = SWIG_Python_NewShadowInstance(clientdata, robj);
2194 if (inst) {
2195 Py_DECREF(robj);
2196 robj = inst;
2197 }
2198 }
2199 return robj;
2200 }
2201 }
2202
2203 /* Create a new packed object */
2204
2205 SWIGRUNTIMEINLINE PyObject *
2206 SWIG_Python_NewPackedObj(void *ptr, size_t sz, swig_type_info *type) {
2207 return ptr ? PySwigPacked_New((void *) ptr, sz, type) : SWIG_Py_Void();
2208 }
2209
2210 /* -----------------------------------------------------------------------------*
2211 * Get type list
2212 * -----------------------------------------------------------------------------*/
2213
2214 #ifdef SWIG_LINK_RUNTIME
2215 void *SWIG_ReturnGlobalTypeList(void *);
2216 #endif
2217
2218 SWIGRUNTIME swig_module_info *
2219 SWIG_Python_GetModule(void) {
2220 static void *type_pointer = (void *)0;
2221 /* first check if module already created */
2222 if (!type_pointer) {
2223 #ifdef SWIG_LINK_RUNTIME
2224 type_pointer = SWIG_ReturnGlobalTypeList((void *)0);
2225 #else
2226 type_pointer = PyCObject_Import((char*)"swig_runtime_data" SWIG_RUNTIME_VERSION,
2227 (char*)"type_pointer" SWIG_TYPE_TABLE_NAME);
2228 if (PyErr_Occurred()) {
2229 PyErr_Clear();
2230 type_pointer = (void *)0;
2231 }
2232 #endif
2233 }
2234 return (swig_module_info *) type_pointer;
2235 }
2236
2237 #if PY_MAJOR_VERSION < 2
2238 /* PyModule_AddObject function was introduced in Python 2.0. The following function
2239 is copied out of Python/modsupport.c in python version 2.3.4 */
2240 SWIGINTERN int
2241 PyModule_AddObject(PyObject *m, char *name, PyObject *o)
2242 {
2243 PyObject *dict;
2244 if (!PyModule_Check(m)) {
2245 PyErr_SetString(PyExc_TypeError,
2246 "PyModule_AddObject() needs module as first arg");
2247 return SWIG_ERROR;
2248 }
2249 if (!o) {
2250 PyErr_SetString(PyExc_TypeError,
2251 "PyModule_AddObject() needs non-NULL value");
2252 return SWIG_ERROR;
2253 }
2254
2255 dict = PyModule_GetDict(m);
2256 if (dict == NULL) {
2257 /* Internal error -- modules must have a dict! */
2258 PyErr_Format(PyExc_SystemError, "module '%s' has no __dict__",
2259 PyModule_GetName(m));
2260 return SWIG_ERROR;
2261 }
2262 if (PyDict_SetItemString(dict, name, o))
2263 return SWIG_ERROR;
2264 Py_DECREF(o);
2265 return SWIG_OK;
2266 }
2267 #endif
2268
2269 SWIGRUNTIME void
2270 SWIG_Python_DestroyModule(void *vptr)
2271 {
2272 swig_module_info *swig_module = (swig_module_info *) vptr;
2273 swig_type_info **types = swig_module->types;
2274 size_t i;
2275 for (i =0; i < swig_module->size; ++i) {
2276 swig_type_info *ty = types[i];
2277 if (ty->owndata) {
2278 PySwigClientData *data = (PySwigClientData *) ty->clientdata;
2279 if (data) PySwigClientData_Del(data);
2280 }
2281 }
2282 Py_DECREF(SWIG_This());
2283 }
2284
2285 SWIGRUNTIME void
2286 SWIG_Python_SetModule(swig_module_info *swig_module) {
2287 static PyMethodDef swig_empty_runtime_method_table[] = { {NULL, NULL, 0, NULL} };/* Sentinel */
2288
2289 PyObject *module = Py_InitModule((char*)"swig_runtime_data" SWIG_RUNTIME_VERSION,
2290 swig_empty_runtime_method_table);
2291 PyObject *pointer = PyCObject_FromVoidPtr((void *) swig_module, SWIG_Python_DestroyModule);
2292 if (pointer && module) {
2293 PyModule_AddObject(module, (char*)"type_pointer" SWIG_TYPE_TABLE_NAME, pointer);
2294 } else {
2295 Py_XDECREF(pointer);
2296 }
2297 }
2298
2299 /* The python cached type query */
2300 SWIGRUNTIME PyObject *
2301 SWIG_Python_TypeCache(void) {
2302 static PyObject *SWIG_STATIC_POINTER(cache) = PyDict_New();
2303 return cache;
2304 }
2305
2306 SWIGRUNTIME swig_type_info *
2307 SWIG_Python_TypeQuery(const char *type)
2308 {
2309 PyObject *cache = SWIG_Python_TypeCache();
2310 PyObject *key = PyString_FromString(type);
2311 PyObject *obj = PyDict_GetItem(cache, key);
2312 swig_type_info *descriptor;
2313 if (obj) {
2314 descriptor = (swig_type_info *) PyCObject_AsVoidPtr(obj);
2315 } else {
2316 swig_module_info *swig_module = SWIG_Python_GetModule();
2317 descriptor = SWIG_TypeQueryModule(swig_module, swig_module, type);
2318 if (descriptor) {
2319 obj = PyCObject_FromVoidPtr(descriptor, NULL);
2320 PyDict_SetItem(cache, key, obj);
2321 Py_DECREF(obj);
2322 }
2323 }
2324 Py_DECREF(key);
2325 return descriptor;
2326 }
2327
2328 /*
2329 For backward compatibility only
2330 */
2331 #define SWIG_POINTER_EXCEPTION 0
2332 #define SWIG_arg_fail(arg) SWIG_Python_ArgFail(arg)
2333 #define SWIG_MustGetPtr(p, type, argnum, flags) SWIG_Python_MustGetPtr(p, type, argnum, flags)
2334
2335 SWIGRUNTIME int
2336 SWIG_Python_AddErrMesg(const char* mesg, int infront)
2337 {
2338 if (PyErr_Occurred()) {
2339 PyObject *type = 0;
2340 PyObject *value = 0;
2341 PyObject *traceback = 0;
2342 PyErr_Fetch(&type, &value, &traceback);
2343 if (value) {
2344 PyObject *old_str = PyObject_Str(value);
2345 Py_XINCREF(type);
2346 PyErr_Clear();
2347 if (infront) {
2348 PyErr_Format(type, "%s %s", mesg, PyString_AsString(old_str));
2349 } else {
2350 PyErr_Format(type, "%s %s", PyString_AsString(old_str), mesg);
2351 }
2352 Py_DECREF(old_str);
2353 }
2354 return 1;
2355 } else {
2356 return 0;
2357 }
2358 }
2359
2360 SWIGRUNTIME int
2361 SWIG_Python_ArgFail(int argnum)
2362 {
2363 if (PyErr_Occurred()) {
2364 /* add information about failing argument */
2365 char mesg[256];
2366 PyOS_snprintf(mesg, sizeof(mesg), "argument number %d:", argnum);
2367 return SWIG_Python_AddErrMesg(mesg, 1);
2368 } else {
2369 return 0;
2370 }
2371 }
2372
2373 SWIGRUNTIMEINLINE const char *
2374 PySwigObject_GetDesc(PyObject *self)
2375 {
2376 PySwigObject *v = (PySwigObject *)self;
2377 swig_type_info *ty = v ? v->ty : 0;
2378 return ty ? ty->str : (char*)"";
2379 }
2380
2381 SWIGRUNTIME void
2382 SWIG_Python_TypeError(const char *type, PyObject *obj)
2383 {
2384 if (type) {
2385 #if defined(SWIG_COBJECT_TYPES)
2386 if (obj && PySwigObject_Check(obj)) {
2387 const char *otype = (const char *) PySwigObject_GetDesc(obj);
2388 if (otype) {
2389 PyErr_Format(PyExc_TypeError, "a '%s' is expected, 'PySwigObject(%s)' is received",
2390 type, otype);
2391 return;
2392 }
2393 } else
2394 #endif
2395 {
2396 const char *otype = (obj ? obj->ob_type->tp_name : 0);
2397 if (otype) {
2398 PyObject *str = PyObject_Str(obj);
2399 const char *cstr = str ? PyString_AsString(str) : 0;
2400 if (cstr) {
2401 PyErr_Format(PyExc_TypeError, "a '%s' is expected, '%s(%s)' is received",
2402 type, otype, cstr);
2403 } else {
2404 PyErr_Format(PyExc_TypeError, "a '%s' is expected, '%s' is received",
2405 type, otype);
2406 }
2407 Py_XDECREF(str);
2408 return;
2409 }
2410 }
2411 PyErr_Format(PyExc_TypeError, "a '%s' is expected", type);
2412 } else {
2413 PyErr_Format(PyExc_TypeError, "unexpected type is received");
2414 }
2415 }
2416
2417
2418 /* Convert a pointer value, signal an exception on a type mismatch */
2419 SWIGRUNTIME void *
2420 SWIG_Python_MustGetPtr(PyObject *obj, swig_type_info *ty, int argnum, int flags) {
2421 void *result;
2422 if (SWIG_Python_ConvertPtr(obj, &result, ty, flags) == -1) {
2423 PyErr_Clear();
2424 if (flags & SWIG_POINTER_EXCEPTION) {
2425 SWIG_Python_TypeError(SWIG_TypePrettyName(ty), obj);
2426 SWIG_Python_ArgFail(argnum);
2427 }
2428 }
2429 return result;
2430 }
2431
2432
2433 #ifdef __cplusplus
2434 #if 0
2435 { /* cc-mode */
2436 #endif
2437 }
2438 #endif
2439
2440
2441
2442 #define SWIG_exception_fail(code, msg) do { SWIG_Error(code, msg); SWIG_fail; } while(0)
2443
2444 #define SWIG_contract_assert(expr, msg) if (!(expr)) { SWIG_Error(SWIG_RuntimeError, msg); SWIG_fail; } else
2445
2446
2447
2448 /* -------- TYPES TABLE (BEGIN) -------- */
2449
2450 #define SWIGTYPE_p_char swig_types[0]
2451 #define SWIGTYPE_p_p_void swig_types[1]
2452 #define SWIGTYPE_p_void swig_types[2]
2453 static swig_type_info *swig_types[4];
2454 static swig_module_info swig_module = {swig_types, 3, 0, 0, 0, 0};
2455 #define SWIG_TypeQuery(name) SWIG_TypeQueryModule(&swig_module, &swig_module, name)
2456 #define SWIG_MangledTypeQuery(name) SWIG_MangledTypeQueryModule(&swig_module, &swig_module, name)
2457
2458 /* -------- TYPES TABLE (END) -------- */
2459
2460 #if (PY_VERSION_HEX <= 0x02000000)
2461 # if !defined(SWIG_PYTHON_CLASSIC)
2462 # error "This python version requires swig to be run with the '-classic' option"
2463 # endif
2464 #endif
2465
2466 /*-----------------------------------------------
2467 @(target):= _cchardet.so
2468 ------------------------------------------------*/
2469 #define SWIG_init init_cchardet
2470
2471 #define SWIG_name "_cchardet"
2472
2473 #define SWIGVERSION 0x010331
2474 #define SWIG_VERSION SWIGVERSION
2475
2476
2477 #define SWIG_as_voidptr(a) (void *)((const void *)(a))
2478 #define SWIG_as_voidptrptr(a) ((void)SWIG_as_voidptr(*a),(void**)(a))
2479
2480
2481 #include <universalchardet.h>
2482
2483
2484 #define SWIG_From_long PyInt_FromLong
2485
2486
2487 SWIGINTERNINLINE PyObject *
2488 SWIG_From_int (int value)
2489 {
2490 return SWIG_From_long (value);
2491 }
2492
2493
2494 SWIGINTERN swig_type_info*
2495 SWIG_pchar_descriptor(void)
2496 {
2497 static int init = 0;
2498 static swig_type_info* info = 0;
2499 if (!init) {
2500 info = SWIG_TypeQuery("_p_char");
2501 init = 1;
2502 }
2503 return info;
2504 }
2505
2506
2507 SWIGINTERNINLINE PyObject *
2508 SWIG_FromCharPtrAndSize(const char* carray, size_t size)
2509 {
2510 if (carray) {
2511 if (size > INT_MAX) {
2512 swig_type_info* pchar_descriptor = SWIG_pchar_descriptor();
2513 return pchar_descriptor ?
2514 SWIG_NewPointerObj((char *)(carray), pchar_descriptor, 0) : SWIG_Py_Void();
2515 } else {
2516 return PyString_FromStringAndSize(carray, (int)(size));
2517 }
2518 } else {
2519 return SWIG_Py_Void();
2520 }
2521 }
2522
2523
2524 SWIGINTERNINLINE PyObject *
2525 SWIG_FromCharPtr(const char *cptr)
2526 {
2527 return SWIG_FromCharPtrAndSize(cptr, (cptr ? strlen(cptr) : 0));
2528 }
2529
2530
2531 SWIGINTERN int
2532 SWIG_AsCharPtrAndSize(PyObject *obj, char** cptr, size_t* psize, int *alloc)
2533 {
2534 if (PyString_Check(obj)) {
2535 char *cstr; Py_ssize_t len;
2536 PyString_AsStringAndSize(obj, &cstr, &len);
2537 if (cptr) {
2538 if (alloc) {
2539 /*
2540 In python the user should not be able to modify the inner
2541 string representation. To warranty that, if you define
2542 SWIG_PYTHON_SAFE_CSTRINGS, a new/copy of the python string
2543 buffer is always returned.
2544
2545 The default behavior is just to return the pointer value,
2546 so, be careful.
2547 */
2548 #if defined(SWIG_PYTHON_SAFE_CSTRINGS)
2549 if (*alloc != SWIG_OLDOBJ)
2550 #else
2551 if (*alloc == SWIG_NEWOBJ)
2552 #endif
2553 {
2554 *cptr = (char *)memcpy((char *)malloc((len + 1)*sizeof(char)), cstr, sizeof(char)*(len + 1));
2555 *alloc = SWIG_NEWOBJ;
2556 }
2557 else {
2558 *cptr = cstr;
2559 *alloc = SWIG_OLDOBJ;
2560 }
2561 } else {
2562 *cptr = PyString_AsString(obj);
2563 }
2564 }
2565 if (psize) *psize = len + 1;
2566 return SWIG_OK;
2567 } else {
2568 swig_type_info* pchar_descriptor = SWIG_pchar_descriptor();
2569 if (pchar_descriptor) {
2570 void* vptr = 0;
2571 if (SWIG_ConvertPtr(obj, &vptr, pchar_descriptor, 0) == SWIG_OK) {
2572 if (cptr) *cptr = (char *) vptr;
2573 if (psize) *psize = vptr ? (strlen((char *)vptr) + 1) : 0;
2574 if (alloc) *alloc = SWIG_OLDOBJ;
2575 return SWIG_OK;
2576 }
2577 }
2578 }
2579 return SWIG_TypeError;
2580 }
2581
2582
2583
2584
2585
2586 #include <limits.h>
2587 #ifndef LLONG_MIN
2588 # define LLONG_MIN LONG_LONG_MIN
2589 #endif
2590 #ifndef LLONG_MAX
2591 # define LLONG_MAX LONG_LONG_MAX
2592 #endif
2593 #ifndef ULLONG_MAX
2594 # define ULLONG_MAX ULONG_LONG_MAX
2595 #endif
2596
2597
2598 SWIGINTERN int
2599 SWIG_AsVal_double (PyObject *obj, double *val)
2600 {
2601 int res = SWIG_TypeError;
2602 if (PyFloat_Check(obj)) {
2603 if (val) *val = PyFloat_AsDouble(obj);
2604 return SWIG_OK;
2605 } else if (PyInt_Check(obj)) {
2606 if (val) *val = PyInt_AsLong(obj);
2607 return SWIG_OK;
2608 } else if (PyLong_Check(obj)) {
2609 double v = PyLong_AsDouble(obj);
2610 if (!PyErr_Occurred()) {
2611 if (val) *val = v;
2612 return SWIG_OK;
2613 } else {
2614 PyErr_Clear();
2615 }
2616 }
2617 #ifdef SWIG_PYTHON_CAST_MODE
2618 {
2619 int dispatch = 0;
2620 double d = PyFloat_AsDouble(obj);
2621 if (!PyErr_Occurred()) {
2622 if (val) *val = d;
2623 return SWIG_AddCast(SWIG_OK);
2624 } else {
2625 PyErr_Clear();
2626 }
2627 if (!dispatch) {
2628 long v = PyLong_AsLong(obj);
2629 if (!PyErr_Occurred()) {
2630 if (val) *val = v;
2631 return SWIG_AddCast(SWIG_AddCast(SWIG_OK));
2632 } else {
2633 PyErr_Clear();
2634 }
2635 }
2636 }
2637 #endif
2638 return res;
2639 }
2640
2641
2642 #include <float.h>
2643
2644
2645 #include <math.h>
2646
2647
2648 SWIGINTERNINLINE int
2649 SWIG_CanCastAsInteger(double *d, double min, double max) {
2650 double x = *d;
2651 if ((min <= x && x <= max)) {
2652 double fx = floor(x);
2653 double cx = ceil(x);
2654 double rd = ((x - fx) < 0.5) ? fx : cx; /* simple rint */
2655 if ((errno == EDOM) || (errno == ERANGE)) {
2656 errno = 0;
2657 } else {
2658 double summ, reps, diff;
2659 if (rd < x) {
2660 diff = x - rd;
2661 } else if (rd > x) {
2662 diff = rd - x;
2663 } else {
2664 return 1;
2665 }
2666 summ = rd + x;
2667 reps = diff/summ;
2668 if (reps < 8*DBL_EPSILON) {
2669 *d = rd;
2670 return 1;
2671 }
2672 }
2673 }
2674 return 0;
2675 }
2676
2677
2678 SWIGINTERN int
2679 SWIG_AsVal_unsigned_SS_long (PyObject *obj, unsigned long *val)
2680 {
2681 if (PyInt_Check(obj)) {
2682 long v = PyInt_AsLong(obj);
2683 if (v >= 0) {
2684 if (val) *val = v;
2685 return SWIG_OK;
2686 } else {
2687 return SWIG_OverflowError;
2688 }
2689 } else if (PyLong_Check(obj)) {
2690 unsigned long v = PyLong_AsUnsignedLong(obj);
2691 if (!PyErr_Occurred()) {
2692 if (val) *val = v;
2693 return SWIG_OK;
2694 } else {
2695 PyErr_Clear();
2696 }
2697 }
2698 #ifdef SWIG_PYTHON_CAST_MODE
2699 {
2700 int dispatch = 0;
2701 unsigned long v = PyLong_AsUnsignedLong(obj);
2702 if (!PyErr_Occurred()) {
2703 if (val) *val = v;
2704 return SWIG_AddCast(SWIG_OK);
2705 } else {
2706 PyErr_Clear();
2707 }
2708 if (!dispatch) {
2709 double d;
2710 int res = SWIG_AddCast(SWIG_AsVal_double (obj,&d));
2711 if (SWIG_IsOK(res) && SWIG_CanCastAsInteger(&d, 0, ULONG_MAX)) {
2712 if (val) *val = (unsigned long)(d);
2713 return res;
2714 }
2715 }
2716 }
2717 #endif
2718 return SWIG_TypeError;
2719 }
2720
2721
2722 SWIGINTERN int
2723 SWIG_AsVal_unsigned_SS_int (PyObject * obj, unsigned int *val)
2724 {
2725 unsigned long v;
2726 int res = SWIG_AsVal_unsigned_SS_long (obj, &v);
2727 if (SWIG_IsOK(res)) {
2728 if ((v > UINT_MAX)) {
2729 return SWIG_OverflowError;
2730 } else {
2731 if (val) *val = (unsigned int)(v);
2732 }
2733 }
2734 return res;
2735 }
2736
2737
2738 static void my_get_charset(chardet_t det, char* namebuf)
2739 {
2740 int ret = 0;
2741 ret = chardet_get_charset(det, namebuf, CHARDET_MAX_ENCODING_NAME);
2742 }
2743
2744 #ifdef __cplusplus
2745 extern "C" {
2746 #endif
2747 SWIGINTERN PyObject *_wrap_chardet_create(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
2748 PyObject *resultobj = 0;
2749 chardet_t *arg1 = (chardet_t *) 0 ;
2750 int result;
2751 chardet_t ret1 ;
2752
2753 {
2754 ret1 = NULL;
2755 arg1 = &ret1;
2756 }
2757 if (!PyArg_ParseTuple(args,(char *)":chardet_create")) SWIG_fail;
2758 result = (int)chardet_create(arg1);
2759 resultobj = SWIG_From_int((int)(result));
2760 {
2761 PyObject * o;
2762 o = SWIG_NewPointerObj(*arg1, SWIGTYPE_p_void, 0);
2763 resultobj = SWIG_Python_AppendOutput(resultobj, o);
2764 }
2765 return resultobj;
2766 fail:
2767 return NULL;
2768 }
2769
2770
2771 SWIGINTERN PyObject *_wrap_chardet_destroy(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
2772 PyObject *resultobj = 0;
2773 chardet_t arg1 = (chardet_t) 0 ;
2774 int res1 ;
2775 PyObject * obj0 = 0 ;
2776
2777 if (!PyArg_ParseTuple(args,(char *)"O:chardet_destroy",&obj0)) SWIG_fail;
2778 res1 = SWIG_ConvertPtr(obj0,SWIG_as_voidptrptr(&arg1), 0, 0);
2779 if (!SWIG_IsOK(res1)) {
2780 SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "chardet_destroy" "', argument " "1"" of type '" "chardet_t""'");
2781 }
2782 chardet_destroy(arg1);
2783 resultobj = SWIG_Py_Void();
2784 return resultobj;
2785 fail:
2786 return NULL;
2787 }
2788
2789
2790 SWIGINTERN PyObject *_wrap_chardet_handle_data(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
2791 PyObject *resultobj = 0;
2792 chardet_t arg1 = (chardet_t) 0 ;
2793 char *arg2 = (char *) 0 ;
2794 unsigned int arg3 ;
2795 int result;
2796 int res1 ;
2797 int res2 ;
2798 char *buf2 = 0 ;
2799 size_t size2 = 0 ;
2800 int alloc2 = 0 ;
2801 PyObject * obj0 = 0 ;
2802 PyObject * obj1 = 0 ;
2803
2804 if (!PyArg_ParseTuple(args,(char *)"OO:chardet_handle_data",&obj0,&obj1)) SWIG_fail;
2805 res1 = SWIG_ConvertPtr(obj0,SWIG_as_voidptrptr(&arg1), 0, 0);
2806 if (!SWIG_IsOK(res1)) {
2807 SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "chardet_handle_data" "', argument " "1"" of type '" "chardet_t""'");
2808 }
2809 res2 = SWIG_AsCharPtrAndSize(obj1, &buf2, &size2, &alloc2);
2810 if (!SWIG_IsOK(res2)) {
2811 SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "chardet_handle_data" "', argument " "2"" of type '" "char const *""'");
2812 }
2813 arg2 = (char *)(buf2);
2814 arg3 = (unsigned int)(size2 - 1);
2815 result = (int)chardet_handle_data(arg1,(char const *)arg2,arg3);
2816 resultobj = SWIG_From_int((int)(result));
2817 return resultobj;
2818 fail:
2819 return NULL;
2820 }
2821
2822
2823 SWIGINTERN PyObject *_wrap_chardet_data_end(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
2824 PyObject *resultobj = 0;
2825 chardet_t arg1 = (chardet_t) 0 ;
2826 int result;
2827 int res1 ;
2828 PyObject * obj0 = 0 ;
2829
2830 if (!PyArg_ParseTuple(args,(char *)"O:chardet_data_end",&obj0)) SWIG_fail;
2831 res1 = SWIG_ConvertPtr(obj0,SWIG_as_voidptrptr(&arg1), 0, 0);
2832 if (!SWIG_IsOK(res1)) {
2833 SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "chardet_data_end" "', argument " "1"" of type '" "chardet_t""'");
2834 }
2835 result = (int)chardet_data_end(arg1);
2836 resultobj = SWIG_From_int((int)(result));
2837 return resultobj;
2838 fail:
2839 return NULL;
2840 }
2841
2842
2843 SWIGINTERN PyObject *_wrap_chardet_reset(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
2844 PyObject *resultobj = 0;
2845 chardet_t arg1 = (chardet_t) 0 ;
2846 int result;
2847 int res1 ;
2848 PyObject * obj0 = 0 ;
2849
2850 if (!PyArg_ParseTuple(args,(char *)"O:chardet_reset",&obj0)) SWIG_fail;
2851 res1 = SWIG_ConvertPtr(obj0,SWIG_as_voidptrptr(&arg1), 0, 0);
2852 if (!SWIG_IsOK(res1)) {
2853 SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "chardet_reset" "', argument " "1"" of type '" "chardet_t""'");
2854 }
2855 result = (int)chardet_reset(arg1);
2856 resultobj = SWIG_From_int((int)(result));
2857 return resultobj;
2858 fail:
2859 return NULL;
2860 }
2861
2862
2863 SWIGINTERN PyObject *_wrap_chardet_get_charset(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
2864 PyObject *resultobj = 0;
2865 chardet_t arg1 = (chardet_t) 0 ;
2866 char *arg2 = (char *) 0 ;
2867 int res1 ;
2868 char temp2[CHARDET_MAX_ENCODING_NAME+1] ;
2869 PyObject * obj0 = 0 ;
2870
2871 arg2 = (char *) temp2;
2872 if (!PyArg_ParseTuple(args,(char *)"O:chardet_get_charset",&obj0)) SWIG_fail;
2873 res1 = SWIG_ConvertPtr(obj0,SWIG_as_voidptrptr(&arg1), 0, 0);
2874 if (!SWIG_IsOK(res1)) {
2875 SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "chardet_get_charset" "', argument " "1"" of type '" "chardet_t""'");
2876 }
2877 my_get_charset(arg1,arg2);
2878 resultobj = SWIG_Py_Void();
2879 arg2[CHARDET_MAX_ENCODING_NAME] = 0;
2880 resultobj = SWIG_Python_AppendOutput(resultobj, SWIG_FromCharPtr(arg2));
2881 return resultobj;
2882 fail:
2883 return NULL;
2884 }
2885
2886
2887 static PyMethodDef SwigMethods[] = {
2888 { (char *)"chardet_create", _wrap_chardet_create, METH_VARARGS, NULL},
2889 { (char *)"chardet_destroy", _wrap_chardet_destroy, METH_VARARGS, NULL},
2890 { (char *)"chardet_handle_data", _wrap_chardet_handle_data, METH_VARARGS, NULL},
2891 { (char *)"chardet_data_end", _wrap_chardet_data_end, METH_VARARGS, NULL},
2892 { (char *)"chardet_reset", _wrap_chardet_reset, METH_VARARGS, NULL},
2893 { (char *)"chardet_get_charset", _wrap_chardet_get_charset, METH_VARARGS, NULL},
2894 { NULL, NULL, 0, NULL }
2895 };
2896
2897
2898 /* -------- TYPE CONVERSION AND EQUIVALENCE RULES (BEGIN) -------- */
2899
2900 static swig_type_info _swigt__p_char = {"_p_char", "char *", 0, 0, (void*)0, 0};
2901 static swig_type_info _swigt__p_p_void = {"_p_p_void", "void **|chardet_t *", 0, 0, (void*)0, 0};
2902 static swig_type_info _swigt__p_void = {"_p_void", "void *|chardet_t", 0, 0, (void*)0, 0};
2903
2904 static swig_type_info *swig_type_initial[] = {
2905 &_swigt__p_char,
2906 &_swigt__p_p_void,
2907 &_swigt__p_void,
2908 };
2909
2910 static swig_cast_info _swigc__p_char[] = { {&_swigt__p_char, 0, 0, 0},{0, 0, 0, 0}};
2911 static swig_cast_info _swigc__p_p_void[] = { {&_swigt__p_p_void, 0, 0, 0},{0, 0, 0, 0}};
2912 static swig_cast_info _swigc__p_void[] = { {&_swigt__p_void, 0, 0, 0},{0, 0, 0, 0}};
2913
2914 static swig_cast_info *swig_cast_initial[] = {
2915 _swigc__p_char,
2916 _swigc__p_p_void,
2917 _swigc__p_void,
2918 };
2919
2920
2921 /* -------- TYPE CONVERSION AND EQUIVALENCE RULES (END) -------- */
2922
2923 static swig_const_info swig_const_table[] = {
2924 {0, 0, 0, 0.0, 0, 0}};
2925
2926 #ifdef __cplusplus
2927 }
2928 #endif
2929 /* -----------------------------------------------------------------------------
2930 * Type initialization:
2931 * This problem is tough by the requirement that no dynamic
2932 * memory is used. Also, since swig_type_info structures store pointers to
2933 * swig_cast_info structures and swig_cast_info structures store pointers back
2934 * to swig_type_info structures, we need some lookup code at initialization.
2935 * The idea is that swig generates all the structures that are needed.
2936 * The runtime then collects these partially filled structures.
2937 * The SWIG_InitializeModule function takes these initial arrays out of
2938 * swig_module, and does all the lookup, filling in the swig_module.types
2939 * array with the correct data and linking the correct swig_cast_info
2940 * structures together.
2941 *
2942 * The generated swig_type_info structures are assigned staticly to an initial
2943 * array. We just loop through that array, and handle each type individually.
2944 * First we lookup if this type has been already loaded, and if so, use the
2945 * loaded structure instead of the generated one. Then we have to fill in the
2946 * cast linked list. The cast data is initially stored in something like a
2947 * two-dimensional array. Each row corresponds to a type (there are the same
2948 * number of rows as there are in the swig_type_initial array). Each entry in
2949 * a column is one of the swig_cast_info structures for that type.
2950 * The cast_initial array is actually an array of arrays, because each row has
2951 * a variable number of columns. So to actually build the cast linked list,
2952 * we find the array of casts associated with the type, and loop through it
2953 * adding the casts to the list. The one last trick we need to do is making
2954 * sure the type pointer in the swig_cast_info struct is correct.
2955 *
2956 * First off, we lookup the cast->type name to see if it is already loaded.
2957 * There are three cases to handle:
2958 * 1) If the cast->type has already been loaded AND the type we are adding
2959 * casting info to has not been loaded (it is in this module), THEN we
2960 * replace the cast->type pointer with the type pointer that has already
2961 * been loaded.
2962 * 2) If BOTH types (the one we are adding casting info to, and the
2963 * cast->type) are loaded, THEN the cast info has already been loaded by
2964 * the previous module so we just ignore it.
2965 * 3) Finally, if cast->type has not already been loaded, then we add that
2966 * swig_cast_info to the linked list (because the cast->type) pointer will
2967 * be correct.
2968 * ----------------------------------------------------------------------------- */
2969
2970 #ifdef __cplusplus
2971 extern "C" {
2972 #if 0
2973 } /* c-mode */
2974 #endif
2975 #endif
2976
2977 #if 0
2978 #define SWIGRUNTIME_DEBUG
2979 #endif
2980
2981
2982 SWIGRUNTIME void
2983 SWIG_InitializeModule(void *clientdata) {
2984 size_t i;
2985 swig_module_info *module_head, *iter;
2986 int found;
2987
2988 clientdata = clientdata;
2989
2990 /* check to see if the circular list has been setup, if not, set it up */
2991 if (swig_module.next==0) {
2992 /* Initialize the swig_module */
2993 swig_module.type_initial = swig_type_initial;
2994 swig_module.cast_initial = swig_cast_initial;
2995 swig_module.next = &swig_module;
2996 }
2997
2998 /* Try and load any already created modules */
2999 module_head = SWIG_GetModule(clientdata);
3000 if (!module_head) {
3001 /* This is the first module loaded for this interpreter */
3002 /* so set the swig module into the interpreter */
3003 SWIG_SetModule(clientdata, &swig_module);
3004 module_head = &swig_module;
3005 } else {
3006 /* the interpreter has loaded a SWIG module, but has it loaded this one? */
3007 found=0;
3008 iter=module_head;
3009 do {
3010 if (iter==&swig_module) {
3011 found=1;
3012 break;
3013 }
3014 iter=iter->next;
3015 } while (iter!= module_head);
3016
3017 /* if the is found in the list, then all is done and we may leave */
3018 if (found) return;
3019 /* otherwise we must add out module into the list */
3020 swig_module.next = module_head->next;
3021 module_head->next = &swig_module;
3022 }
3023
3024 /* Now work on filling in swig_module.types */
3025 #ifdef SWIGRUNTIME_DEBUG
3026 printf("SWIG_InitializeModule: size %d\n", swig_module.size);
3027 #endif
3028 for (i = 0; i < swig_module.size; ++i) {
3029 swig_type_info *type = 0;
3030 swig_type_info *ret;
3031 swig_cast_info *cast;
3032
3033 #ifdef SWIGRUNTIME_DEBUG
3034 printf("SWIG_InitializeModule: type %d %s\n", i, swig_module.type_initial[i]->name);
3035 #endif
3036
3037 /* if there is another module already loaded */
3038 if (swig_module.next != &swig_module) {
3039 type = SWIG_MangledTypeQueryModule(swig_module.next, &swig_module, swig_module.type_initial[i]->name);
3040 }
3041 if (type) {
3042 /* Overwrite clientdata field */
3043 #ifdef SWIGRUNTIME_DEBUG
3044 printf("SWIG_InitializeModule: found type %s\n", type->name);
3045 #endif
3046 if (swig_module.type_initial[i]->clientdata) {
3047 type->clientdata = swig_module.type_initial[i]->clientdata;
3048 #ifdef SWIGRUNTIME_DEBUG
3049 printf("SWIG_InitializeModule: found and overwrite type %s \n", type->name);
3050 #endif
3051 }
3052 } else {
3053 type = swig_module.type_initial[i];
3054 }
3055
3056 /* Insert casting types */
3057 cast = swig_module.cast_initial[i];
3058 while (cast->type) {
3059 /* Don't need to add information already in the list */
3060 ret = 0;
3061 #ifdef SWIGRUNTIME_DEBUG
3062 printf("SWIG_InitializeModule: look cast %s\n", cast->type->name);
3063 #endif
3064 if (swig_module.next != &swig_module) {
3065 ret = SWIG_MangledTypeQueryModule(swig_module.next, &swig_module, cast->type->name);
3066 #ifdef SWIGRUNTIME_DEBUG
3067 if (ret) printf("SWIG_InitializeModule: found cast %s\n", ret->name);
3068 #endif
3069 }
3070 if (ret) {
3071 if (type == swig_module.type_initial[i]) {
3072 #ifdef SWIGRUNTIME_DEBUG
3073 printf("SWIG_InitializeModule: skip old type %s\n", ret->name);
3074 #endif
3075 cast->type = ret;
3076 ret = 0;
3077 } else {
3078 /* Check for casting already in the list */
3079 swig_cast_info *ocast = SWIG_TypeCheck(ret->name, type);
3080 #ifdef SWIGRUNTIME_DEBUG
3081 if (ocast) printf("SWIG_InitializeModule: skip old cast %s\n", ret->name);
3082 #endif
3083 if (!ocast) ret = 0;
3084 }
3085 }
3086
3087 if (!ret) {
3088 #ifdef SWIGRUNTIME_DEBUG
3089 printf("SWIG_InitializeModule: adding cast %s\n", cast->type->name);
3090 #endif
3091 if (type->cast) {
3092 type->cast->prev = cast;
3093 cast->next = type->cast;
3094 }
3095 type->cast = cast;
3096 }
3097 cast++;
3098 }
3099 /* Set entry in modules->types array equal to the type */
3100 swig_module.types[i] = type;
3101 }
3102 swig_module.types[i] = 0;
3103
3104 #ifdef SWIGRUNTIME_DEBUG
3105 printf("**** SWIG_InitializeModule: Cast List ******\n");
3106 for (i = 0; i < swig_module.size; ++i) {
3107 int j = 0;
3108 swig_cast_info *cast = swig_module.cast_initial[i];
3109 printf("SWIG_InitializeModule: type %d %s\n", i, swig_module.type_initial[i]->name);
3110 while (cast->type) {
3111 printf("SWIG_InitializeModule: cast type %s\n", cast->type->name);
3112 cast++;
3113 ++j;
3114 }
3115 printf("---- Total casts: %d\n",j);
3116 }
3117 printf("**** SWIG_InitializeModule: Cast List ******\n");
3118 #endif
3119 }
3120
3121 /* This function will propagate the clientdata field of type to
3122 * any new swig_type_info structures that have been added into the list
3123 * of equivalent types. It is like calling
3124 * SWIG_TypeClientData(type, clientdata) a second time.
3125 */
3126 SWIGRUNTIME void
3127 SWIG_PropagateClientData(void) {
3128 size_t i;
3129 swig_cast_info *equiv;
3130 static int init_run = 0;
3131
3132 if (init_run) return;
3133 init_run = 1;
3134
3135 for (i = 0; i < swig_module.size; i++) {
3136 if (swig_module.types[i]->clientdata) {
3137 equiv = swig_module.types[i]->cast;
3138 while (equiv) {
3139 if (!equiv->converter) {
3140 if (equiv->type && !equiv->type->clientdata)
3141 SWIG_TypeClientData(equiv->type, swig_module.types[i]->clientdata);
3142 }
3143 equiv = equiv->next;
3144 }
3145 }
3146 }
3147 }
3148
3149 #ifdef __cplusplus
3150 #if 0
3151 {
3152 /* c-mode */
3153 #endif
3154 }
3155 #endif
3156
3157
3158
3159 #ifdef __cplusplus
3160 extern "C" {
3161 #endif
3162
3163 /* Python-specific SWIG API */
3164 #define SWIG_newvarlink() SWIG_Python_newvarlink()
3165 #define SWIG_addvarlink(p, name, get_attr, set_attr) SWIG_Python_addvarlink(p, name, get_attr, set_attr)
3166 #define SWIG_InstallConstants(d, constants) SWIG_Python_InstallConstants(d, constants)
3167
3168 /* -----------------------------------------------------------------------------
3169 * global variable support code.
3170 * ----------------------------------------------------------------------------- */
3171
3172 typedef struct swig_globalvar {
3173 char *name; /* Name of global variable */
3174 PyObject *(*get_attr)(void); /* Return the current value */
3175 int (*set_attr)(PyObject *); /* Set the value */
3176 struct swig_globalvar *next;
3177 } swig_globalvar;
3178
3179 typedef struct swig_varlinkobject {
3180 PyObject_HEAD
3181 swig_globalvar *vars;
3182 } swig_varlinkobject;
3183
3184 SWIGINTERN PyObject *
3185 swig_varlink_repr(swig_varlinkobject *SWIGUNUSEDPARM(v)) {
3186 return PyString_FromString("<Swig global variables>");
3187 }
3188
3189 SWIGINTERN PyObject *
3190 swig_varlink_str(swig_varlinkobject *v) {
3191 PyObject *str = PyString_FromString("(");
3192 swig_globalvar *var;
3193 for (var = v->vars; var; var=var->next) {
3194 PyString_ConcatAndDel(&str,PyString_FromString(var->name));
3195 if (var->next) PyString_ConcatAndDel(&str,PyString_FromString(", "));
3196 }
3197 PyString_ConcatAndDel(&str,PyString_FromString(")"));
3198 return str;
3199 }
3200
3201 SWIGINTERN int
3202 swig_varlink_print(swig_varlinkobject *v, FILE *fp, int SWIGUNUSEDPARM(flags)) {
3203 PyObject *str = swig_varlink_str(v);
3204 fprintf(fp,"Swig global variables ");
3205 fprintf(fp,"%s\n", PyString_AsString(str));
3206 Py_DECREF(str);
3207 return 0;
3208 }
3209
3210 SWIGINTERN void
3211 swig_varlink_dealloc(swig_varlinkobject *v) {
3212 swig_globalvar *var = v->vars;
3213 while (var) {
3214 swig_globalvar *n = var->next;
3215 free(var->name);
3216 free(var);
3217 var = n;
3218 }
3219 }
3220
3221 SWIGINTERN PyObject *
3222 swig_varlink_getattr(swig_varlinkobject *v, char *n) {
3223 PyObject *res = NULL;
3224 swig_globalvar *var = v->vars;
3225 while (var) {
3226 if (strcmp(var->name,n) == 0) {
3227 res = (*var->get_attr)();
3228 break;
3229 }
3230 var = var->next;
3231 }
3232 if (res == NULL && !PyErr_Occurred()) {
3233 PyErr_SetString(PyExc_NameError,"Unknown C global variable");
3234 }
3235 return res;
3236 }
3237
3238 SWIGINTERN int
3239 swig_varlink_setattr(swig_varlinkobject *v, char *n, PyObject *p) {
3240 int res = 1;
3241 swig_globalvar *var = v->vars;
3242 while (var) {
3243 if (strcmp(var->name,n) == 0) {
3244 res = (*var->set_attr)(p);
3245 break;
3246 }
3247 var = var->next;
3248 }
3249 if (res == 1 && !PyErr_Occurred()) {
3250 PyErr_SetString(PyExc_NameError,"Unknown C global variable");
3251 }
3252 return res;
3253 }
3254
3255 SWIGINTERN PyTypeObject*
3256 swig_varlink_type(void) {
3257 static char varlink__doc__[] = "Swig var link object";
3258 static PyTypeObject varlink_type;
3259 static int type_init = 0;
3260 if (!type_init) {
3261 const PyTypeObject tmp
3262 = {
3263 PyObject_HEAD_INIT(NULL)
3264 0, /* Number of items in variable part (ob_size) */
3265 (char *)"swigvarlink", /* Type name (tp_name) */
3266 sizeof(swig_varlinkobject), /* Basic size (tp_basicsize) */
3267 0, /* Itemsize (tp_itemsize) */
3268 (destructor) swig_varlink_dealloc, /* Deallocator (tp_dealloc) */
3269 (printfunc) swig_varlink_print, /* Print (tp_print) */
3270 (getattrfunc) swig_varlink_getattr, /* get attr (tp_getattr) */
3271 (setattrfunc) swig_varlink_setattr, /* Set attr (tp_setattr) */
3272 0, /* tp_compare */
3273 (reprfunc) swig_varlink_repr, /* tp_repr */
3274 0, /* tp_as_number */
3275 0, /* tp_as_sequence */
3276 0, /* tp_as_mapping */
3277 0, /* tp_hash */
3278 0, /* tp_call */
3279 (reprfunc)swig_varlink_str, /* tp_str */
3280 0, /* tp_getattro */
3281 0, /* tp_setattro */
3282 0, /* tp_as_buffer */
3283 0, /* tp_flags */
3284 varlink__doc__, /* tp_doc */
3285 0, /* tp_traverse */
3286 0, /* tp_clear */
3287 0, /* tp_richcompare */
3288 0, /* tp_weaklistoffset */
3289 #if PY_VERSION_HEX >= 0x02020000
3290 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, /* tp_iter -> tp_weaklist */
3291 #endif
3292 #if PY_VERSION_HEX >= 0x02030000
3293 0, /* tp_del */
3294 #endif
3295 #ifdef COUNT_ALLOCS
3296 0,0,0,0 /* tp_alloc -> tp_next */
3297 #endif
3298 };
3299 varlink_type = tmp;
3300 varlink_type.ob_type = &PyType_Type;
3301 type_init = 1;
3302 }
3303 return &varlink_type;
3304 }
3305
3306 /* Create a variable linking object for use later */
3307 SWIGINTERN PyObject *
3308 SWIG_Python_newvarlink(void) {
3309 swig_varlinkobject *result = PyObject_NEW(swig_varlinkobject, swig_varlink_type());
3310 if (result) {
3311 result->vars = 0;
3312 }
3313 return ((PyObject*) result);
3314 }
3315
3316 SWIGINTERN void
3317 SWIG_Python_addvarlink(PyObject *p, char *name, PyObject *(*get_attr)(void), int (*set_attr)(PyObject *p)) {
3318 swig_varlinkobject *v = (swig_varlinkobject *) p;
3319 swig_globalvar *gv = (swig_globalvar *) malloc(sizeof(swig_globalvar));
3320 if (gv) {
3321 size_t size = strlen(name)+1;
3322 gv->name = (char *)malloc(size);
3323 if (gv->name) {
3324 strncpy(gv->name,name,size);
3325 gv->get_attr = get_attr;
3326 gv->set_attr = set_attr;
3327 gv->next = v->vars;
3328 }
3329 }
3330 v->vars = gv;
3331 }
3332
3333 SWIGINTERN PyObject *
3334 SWIG_globals(void) {
3335 static PyObject *_SWIG_globals = 0;
3336 if (!_SWIG_globals) _SWIG_globals = SWIG_newvarlink();
3337 return _SWIG_globals;
3338 }
3339
3340 /* -----------------------------------------------------------------------------
3341 * constants/methods manipulation
3342 * ----------------------------------------------------------------------------- */
3343
3344 /* Install Constants */
3345 SWIGINTERN void
3346 SWIG_Python_InstallConstants(PyObject *d, swig_const_info constants[]) {
3347 PyObject *obj = 0;
3348 size_t i;
3349 for (i = 0; constants[i].type; ++i) {
3350 switch(constants[i].type) {
3351 case SWIG_PY_POINTER:
3352 obj = SWIG_NewPointerObj(constants[i].pvalue, *(constants[i]).ptype,0);
3353 break;
3354 case SWIG_PY_BINARY:
3355 obj = SWIG_NewPackedObj(constants[i].pvalue, constants[i].lvalue, *(constants[i].ptype));
3356 break;
3357 default:
3358 obj = 0;
3359 break;
3360 }
3361 if (obj) {
3362 PyDict_SetItemString(d, constants[i].name, obj);
3363 Py_DECREF(obj);
3364 }
3365 }
3366 }
3367
3368 /* -----------------------------------------------------------------------------*/
3369 /* Fix SwigMethods to carry the callback ptrs when needed */
3370 /* -----------------------------------------------------------------------------*/
3371
3372 SWIGINTERN void
3373 SWIG_Python_FixMethods(PyMethodDef *methods,
3374 swig_const_info *const_table,
3375 swig_type_info **types,
3376 swig_type_info **types_initial) {
3377 size_t i;
3378 for (i = 0; methods[i].ml_name; ++i) {
3379 const char *c = methods[i].ml_doc;
3380 if (c && (c = strstr(c, "swig_ptr: "))) {
3381 int j;
3382 swig_const_info *ci = 0;
3383 const char *name = c + 10;
3384 for (j = 0; const_table[j].type; ++j) {
3385 if (strncmp(const_table[j].name, name,
3386 strlen(const_table[j].name)) == 0) {
3387 ci = &(const_table[j]);
3388 break;
3389 }
3390 }
3391 if (ci) {
3392 size_t shift = (ci->ptype) - types;
3393 swig_type_info *ty = types_initial[shift];
3394 size_t ldoc = (c - methods[i].ml_doc);
3395 size_t lptr = strlen(ty->name)+2*sizeof(void*)+2;
3396 char *ndoc = (char*)malloc(ldoc + lptr + 10);
3397 if (ndoc) {
3398 char *buff = ndoc;
3399 void *ptr = (ci->type == SWIG_PY_POINTER) ? ci->pvalue : 0;
3400 if (ptr) {
3401 strncpy(buff, methods[i].ml_doc, ldoc);
3402 buff += ldoc;
3403 strncpy(buff, "swig_ptr: ", 10);
3404 buff += 10;
3405 SWIG_PackVoidPtr(buff, ptr, ty->name, lptr);
3406 methods[i].ml_doc = ndoc;
3407 }
3408 }
3409 }
3410 }
3411 }
3412 }
3413
3414 #ifdef __cplusplus
3415 }
3416 #endif
3417
3418 /* -----------------------------------------------------------------------------*
3419 * Partial Init method
3420 * -----------------------------------------------------------------------------*/
3421
3422 #ifdef __cplusplus
3423 extern "C"
3424 #endif
3425 SWIGEXPORT void SWIG_init(void) {
3426 PyObject *m, *d;
3427
3428 /* Fix SwigMethods to carry the callback ptrs when needed */
3429 SWIG_Python_FixMethods(SwigMethods, swig_const_table, swig_types, swig_type_initial);
3430
3431 m = Py_InitModule((char *) SWIG_name, SwigMethods);
3432 d = PyModule_GetDict(m);
3433
3434 SWIG_InitializeModule(0);
3435 SWIG_InstallConstants(d,swig_const_table);
3436
3437
3438 SWIG_Python_SetConstant(d, "CHARDET_RESULT_OK",SWIG_From_int((int)(0)));
3439 SWIG_Python_SetConstant(d, "CHARDET_RESULT_NOMEMORY",SWIG_From_int((int)((-1))));
3440 SWIG_Python_SetConstant(d, "CHARDET_RESULT_INVALID_DETECTOR",SWIG_From_int((int)((-2))));
3441 SWIG_Python_SetConstant(d, "CHARDET_ENCODING_ISO_2022_JP",SWIG_FromCharPtr("ISO-2022-JP"));
3442 SWIG_Python_SetConstant(d, "CHARDET_ENCODING_ISO_2022_CN",SWIG_FromCharPtr("ISO-2022-CN"));
3443 SWIG_Python_SetConstant(d, "CHARDET_ENCODING_ISO_2022_KR",SWIG_FromCharPtr("ISO-2022-KR"));
3444 SWIG_Python_SetConstant(d, "CHARDET_ENCODING_ISO_8859_5",SWIG_FromCharPtr("ISO-8859-5"));
3445 SWIG_Python_SetConstant(d, "CHARDET_ENCODING_ISO_8859_7",SWIG_FromCharPtr("ISO-8859-7"));
3446 SWIG_Python_SetConstant(d, "CHARDET_ENCODING_ISO_8859_8",SWIG_FromCharPtr("ISO-8859-8"));
3447 SWIG_Python_SetConstant(d, "CHARDET_ENCODING_BIG5",SWIG_FromCharPtr("BIG5"));
3448 SWIG_Python_SetConstant(d, "CHARDET_ENCODING_GB18030",SWIG_FromCharPtr("GB18030"));
3449 SWIG_Python_SetConstant(d, "CHARDET_ENCODING_EUC_JP",SWIG_FromCharPtr("EUC-JP"));
3450 SWIG_Python_SetConstant(d, "CHARDET_ENCODING_EUC_KR",SWIG_FromCharPtr("EUC-KR"));
3451 SWIG_Python_SetConstant(d, "CHARDET_ENCODING_EUC_TW",SWIG_FromCharPtr("EUC-TW"));
3452 SWIG_Python_SetConstant(d, "CHARDET_ENCODING_SHIFT_JIS",SWIG_FromCharPtr("SHIFT_JIS"));
3453 SWIG_Python_SetConstant(d, "CHARDET_ENCODING_IBM855",SWIG_FromCharPtr("IBM855"));
3454 SWIG_Python_SetConstant(d, "CHARDET_ENCODING_IBM866",SWIG_FromCharPtr("IBM866"));
3455 SWIG_Python_SetConstant(d, "CHARDET_ENCODING_KOI8_R",SWIG_FromCharPtr("KOI8-R"));
3456 SWIG_Python_SetConstant(d, "CHARDET_ENCODING_MACCYRILLIC",SWIG_FromCharPtr("MACCYRILLIC"));
3457 SWIG_Python_SetConstant(d, "CHARDET_ENCODING_WINDOWS_1251",SWIG_FromCharPtr("WINDOWS-1251"));
3458 SWIG_Python_SetConstant(d, "CHARDET_ENCODING_WINDOWS_1252",SWIG_FromCharPtr("WINDOWS-1252"));
3459 SWIG_Python_SetConstant(d, "CHARDET_ENCODING_WINDOWS_1253",SWIG_FromCharPtr("WINDOWS-1253"));
3460 SWIG_Python_SetConstant(d, "CHARDET_ENCODING_WINDOWS_1255",SWIG_FromCharPtr("WINDOWS-1255"));
3461 SWIG_Python_SetConstant(d, "CHARDET_ENCODING_UTF_8",SWIG_FromCharPtr("UTF-8"));
3462 SWIG_Python_SetConstant(d, "CHARDET_ENCODING_UTF_16BE",SWIG_FromCharPtr("UTF-16BE"));
3463 SWIG_Python_SetConstant(d, "CHARDET_ENCODING_UTF_16LE",SWIG_FromCharPtr("UTF-16LE"));
3464 SWIG_Python_SetConstant(d, "CHARDET_ENCODING_UTF_32BE",SWIG_FromCharPtr("UTF-32BE"));
3465 SWIG_Python_SetConstant(d, "CHARDET_ENCODING_UTF_32LE",SWIG_FromCharPtr("UTF-32LE"));
3466 SWIG_Python_SetConstant(d, "CHARDET_ENCODING_HZ_GB_2312",SWIG_FromCharPtr("HZ-GB-2312"));
3467 SWIG_Python_SetConstant(d, "CHARDET_ENCODING_X_ISO_10646_UCS_4_3412",SWIG_FromCharPtr("X-ISO-10646-UCS-4-3412"));
3468 SWIG_Python_SetConstant(d, "CHARDET_ENCODING_X_ISO_10646_UCS_4_2143",SWIG_FromCharPtr("X-ISO-10646-UCS-4-2143"));
3469 SWIG_Python_SetConstant(d, "CHARDET_ENCODING_ISO_8859_2",SWIG_FromCharPtr("ISO-8859-2"));
3470 SWIG_Python_SetConstant(d, "CHARDET_ENCODING_WINDOWS_1250",SWIG_FromCharPtr("WINDOWS-1250"));
3471 SWIG_Python_SetConstant(d, "CHARDET_ENCODING_TIS_620",SWIG_FromCharPtr("TIS-620"));
3472 }
3473
+0
-23
swig/python/setup.py less more
0 #!/usr/bin/env python
1 # -*- coding:utf-8 -*-
2 from distutils.core import setup
3 from distutils.core import Extension
4
5 LIB_NAME = 'cchardet'
6 LIB_VERSION = '1.0.2'
7 LIB_DESC = 'A Python binding of universalchardet'
8 LIB_AUTHOR = 'Kohei TAKETA'
9 LIB_AUTHOR_EMAIL = 'k-tak@void.in'
10 LIB_URL = 'http://code.google.com/p/juniversalchardet/'
11
12 setup(name=LIB_NAME,
13 version=LIB_VERSION,
14 description=LIB_DESC,
15 author=LIB_AUTHOR,
16 author_email=LIB_AUTHOR_EMAIL,
17 url=LIB_URL,
18 ext_modules=[Extension('_cchardet',
19 ['cchardet_wrap.c'],
20 libraries=['uchardet'])],
21 py_modules=['cchardet']
22 )