]> gitweb.fperrin.net Git - Dictionary.git/blob - jars/icu4j-4_4_2-src/tools/misc/src/com/ibm/icu/dev/tool/charsetdet/sbcs/Checker.java
go
[Dictionary.git] / jars / icu4j-4_4_2-src / tools / misc / src / com / ibm / icu / dev / tool / charsetdet / sbcs / Checker.java
1 /*\r
2  ***********************************************************************\r
3  * Copyright (C) 2005-2006, International Business Machines            *\r
4  * Corporation and others. All Rights Reserved.                        *\r
5  ***********************************************************************\r
6  *\r
7  */\r
8 \r
9 package com.ibm.icu.dev.tool.charsetdet.sbcs;\r
10 \r
11 /**\r
12  * @author emader\r
13  *\r
14  * TODO To change the template for this generated type comment go to\r
15  * Window - Preferences - Java - Code Style - Code Templates\r
16  */\r
17 public class Checker implements NGramParser.NGramParserClient\r
18 {\r
19     private NGramList ngrams;\r
20     private int totalNGrams;\r
21     private int totalHits;\r
22     \r
23     private String language;\r
24     private String encoding;\r
25     \r
26     private int[] histogram;\r
27 \r
28     private static final int BUFFER_SIZE = 1024;\r
29     \r
30     private char[] buffer;\r
31     private int bufIndex;\r
32     private int bufMax;\r
33 \r
34     private NGramParser parser;\r
35 \r
36     /**\r
37      * TODO This should take cumulative percent and the name...\r
38      */\r
39     public Checker(NGramList list, InputFile dataFile)\r
40     {\r
41         ngrams = list;\r
42         ngrams.setMapper(dataFile);\r
43         \r
44         language = languageName(dataFile.getFilename());\r
45         encoding = dataFile.getEncoding();\r
46         \r
47         buffer = new char[BUFFER_SIZE];\r
48         parser = new NGramParser(this);\r
49         resetCounts();\r
50         \r
51         histogram = new int[100];\r
52         resetHistogram();\r
53    }\r
54     \r
55     public void handleNGram(String key)\r
56     {\r
57         NGramList.NGram ngram = ngrams.get(key);\r
58         \r
59         totalNGrams += 1;\r
60         \r
61         if (ngram != null) {\r
62             totalHits += 1;\r
63             //ngram.incrementRefCount();\r
64         }\r
65     }\r
66     \r
67     private void resetCounts()\r
68     {\r
69         bufIndex = 0;\r
70         totalNGrams = totalHits = 0;\r
71     }\r
72     \r
73     private void resetHistogram()\r
74     {\r
75         for(int i = 0; i < 100; i += 1) {\r
76             histogram[i] = 0;\r
77         }\r
78         \r
79     }\r
80     \r
81     private static void exceptionError(Exception e)\r
82     {\r
83         System.err.println("ioError: " + e.toString());\r
84     }\r
85 \r
86     private static String languageName(String filename)\r
87     {\r
88         return filename.substring(0, filename.indexOf('.'));\r
89     }\r
90     \r
91     private boolean nextBuffer(InputFile inputFile)\r
92     {\r
93         try {\r
94             bufMax = inputFile.read(buffer);\r
95         } catch (Exception e) {\r
96             bufMax = -1;\r
97             exceptionError(e);\r
98             \r
99             return false;\r
100         }\r
101         \r
102         bufIndex = 0;\r
103         \r
104         return bufMax >= 0;\r
105     }\r
106     \r
107     private void parseBuffer()\r
108     {\r
109         resetCounts();\r
110         parser.reset();\r
111         parser.parse();\r
112     }\r
113     \r
114     public char nextChar()\r
115     {\r
116         if (bufIndex >= bufMax) {\r
117             return 0;\r
118         }\r
119         \r
120         return buffer[bufIndex++];\r
121     }\r
122     \r
123     public String getLanguage()\r
124     {\r
125         return language;\r
126     }\r
127     \r
128     public void setMapper(InputFile file)\r
129     {\r
130         ngrams.setMapper(file);\r
131     }\r
132     \r
133     public int checkBuffer(char[] theBuffer, int charCount)\r
134     {\r
135         buffer = theBuffer;\r
136         bufMax = charCount;\r
137         \r
138         parseBuffer();\r
139         \r
140         return totalHits;\r
141     }\r
142     \r
143     public void check(InputFile dataFile)\r
144     {\r
145         int minHist = 101, maxHist = -1;\r
146         \r
147         dataFile.open();\r
148         \r
149         String dataFilename = dataFile.getFilename();\r
150         String fileEncoding = dataFile.getEncoding();\r
151         \r
152         System.out.println(language + "(" + encoding + ") stats, " + languageName(dataFilename) + "(" + fileEncoding + ") data:");\r
153         \r
154         setMapper(dataFile);\r
155         resetHistogram();\r
156 \r
157         while (nextBuffer(dataFile)) {\r
158             parseBuffer();\r
159             \r
160             double percentHits = (double) totalHits / totalNGrams * 100.0;\r
161             int ph = (int) percentHits;\r
162             \r
163             if (ph < minHist) {\r
164                 minHist = ph;\r
165             }\r
166             \r
167             if (ph > maxHist) {\r
168                 maxHist = ph;\r
169             }\r
170             \r
171             histogram[ph] += 1;\r
172         }\r
173         \r
174         for(int ph = minHist; ph <= maxHist; ph += 1) {\r
175             System.out.println(ph + "\t" + histogram[ph]);\r
176         }\r
177         \r
178         System.out.println();\r
179         \r
180         dataFile.close();\r
181         \r
182         return;\r
183     }\r
184 }\r