]> gitweb.fperrin.net Git - Dictionary.git/blob - jars/icu4j-4_4_2-src/tools/misc/src/com/ibm/icu/dev/tool/layout/LigatureTree.java
go
[Dictionary.git] / jars / icu4j-4_4_2-src / tools / misc / src / com / ibm / icu / dev / tool / layout / LigatureTree.java
1 /*\r
2  *******************************************************************************\r
3  * Copyright (C) 1998-2010, International Business Machines Corporation and    *\r
4  * others. All Rights Reserved.                                                *\r
5  *******************************************************************************\r
6  *\r
7  * Created on Dec 3, 2003\r
8  *\r
9  *******************************************************************************\r
10  */\r
11 package com.ibm.icu.dev.tool.layout;\r
12 \r
13 \r
14 import java.io.IOException;\r
15 import java.io.PrintWriter;\r
16 import java.io.Writer;\r
17 \r
18 import com.ibm.icu.impl.Utility;\r
19 import com.ibm.icu.text.UTF16;\r
20 \r
21 public class LigatureTree\r
22 {\r
23     static class Lignode\r
24     {\r
25         int target;\r
26         int ligature = -1;\r
27         Lignode[] subnodes = null;\r
28 \r
29         Lignode()\r
30         {\r
31             target = -1;\r
32         }\r
33 \r
34         Lignode(int target)\r
35         {\r
36             this.target = target;\r
37         }\r
38 \r
39         boolean isMatch()\r
40         {\r
41             return ligature != -1;\r
42         }\r
43 \r
44         int getLigature()\r
45         {\r
46             return ligature;\r
47         }\r
48 \r
49         Lignode subnode(int c)\r
50         {\r
51             if (subnodes != null) {\r
52                 int len = subnodes.length;\r
53 \r
54                 if (c <= subnodes[len - 1].target) {\r
55                     for (int i = 0; i < len; i+= 1) {\r
56                         int t = subnodes[i].target;\r
57 \r
58                         if (t > c) {\r
59                             return null;\r
60                         }\r
61 \r
62                         if (t == c) {\r
63                             return subnodes[i];\r
64                         }\r
65                     }\r
66                 }\r
67             }\r
68 \r
69             return null;\r
70         }\r
71 \r
72         String ligatureString(int[] chars)\r
73         {\r
74             StringBuffer result = new StringBuffer();\r
75             int len = chars.length - 1;\r
76             \r
77             for (int i = 0; i < len; i += 1) {\r
78                 if (i > 0) {\r
79                     result.append(" + ");\r
80                 }\r
81                 \r
82                 result.append(Utility.hex(chars[i], 6));\r
83            }\r
84             \r
85             result.append(" => " + Utility.hex(chars[len], 6));\r
86             \r
87             return result.toString();\r
88         }\r
89         \r
90         void insert(int[] chars, int index)\r
91         {\r
92             int c = chars[index];\r
93             int len = chars.length;\r
94 \r
95             if (len == index + 1) {\r
96                 if (ligature != -1) {\r
97                     System.out.println("ignoring ligature " + ligatureString(chars) +\r
98                                        ": already have " + Utility.hex(ligature, 6));\r
99                 } else {\r
100                     ligature = c;\r
101                 }\r
102 \r
103                 return;\r
104             }\r
105 \r
106             if (subnodes == null) {\r
107                 subnodes = new Lignode[1];\r
108                 subnodes[0] = new Lignode(c);\r
109                 subnodes[0].insert(chars, index + 1);\r
110             } else {\r
111                 int i;\r
112 \r
113                 for (i = 0; i < subnodes.length; i += 1)\r
114                 {\r
115                     int t = subnodes[i].target;\r
116 \r
117                     if (t == c) {\r
118                         subnodes[i].insert(chars, index + 1);\r
119                         return;\r
120                     } else if (t > c) {\r
121                         break;\r
122                     }\r
123                 }\r
124 \r
125                 Lignode[] nnodes = new Lignode[subnodes.length + 1];\r
126 \r
127                 if (i > 0) {\r
128                     System.arraycopy(subnodes, 0, nnodes, 0, i);\r
129                 }\r
130 \r
131                 nnodes[i] = new Lignode(c);\r
132 \r
133                 if (i < subnodes.length) {\r
134                     System.arraycopy(subnodes, i, nnodes, i + 1, subnodes.length - i);\r
135                 }\r
136 \r
137                 subnodes = nnodes;\r
138 \r
139                 subnodes[i].insert(chars, index + 1);\r
140             }\r
141         }\r
142         \r
143         public void walk(TreeWalker walker)\r
144         {\r
145             if (target != -1) {\r
146                 walker.down(target);\r
147             }\r
148             \r
149             if (subnodes != null) {\r
150                 for (int i = 0; i < subnodes.length; i += 1)\r
151                 {\r
152                     subnodes[i].walk(walker);\r
153                 }\r
154             }\r
155             \r
156             if (ligature != -1) {\r
157                 walker.ligature(ligature);\r
158             }\r
159                 \r
160             walker.up();\r
161         }\r
162 \r
163         static final String ind = "                                      ";\r
164 \r
165         /*\r
166          * Write debugging information to w, starting at the provided indentation level.\r
167          */\r
168         public void dump(Writer w, int indent)\r
169         {\r
170             String tab = ind.substring(0, Math.min(indent, ind.length()));\r
171 \r
172             try {\r
173                 w.write(tab);\r
174                 if (target != -1) {\r
175                     w.write(Utility.hex(target, 6));\r
176                 }\r
177                 \r
178                 if (ligature != -1)\r
179                 {\r
180                     w.write(" --> ");\r
181                     w.write(Utility.hex(ligature, 6));\r
182                 }\r
183                 \r
184                 w.write("\n");\r
185                 \r
186                 if (subnodes != null) {\r
187                     w.write(tab);\r
188                     w.write("{\n");\r
189                     indent += 4;\r
190                     \r
191                     for (int i = 0; i < subnodes.length; i += 1) {\r
192                         subnodes[i].dump(w, indent);\r
193                     }\r
194                     \r
195                     w.write(tab);\r
196                     w.write("}\n");\r
197                 }\r
198             } catch (IOException e) {\r
199                 System.out.println(e);\r
200             }\r
201         }\r
202 \r
203     }\r
204 \r
205     private Lignode root = new Lignode();\r
206     \r
207     public LigatureTree()\r
208     {\r
209         // anything?\r
210     }\r
211 \r
212     private int[] toIntArray(String s)\r
213     {\r
214         int count = UTF16.countCodePoint(s);\r
215         int[] result = new int[count];\r
216         \r
217         for (int i = 0; i < count; i += 1) {\r
218             result[i] = UTF16.charAt(s, i);\r
219         }\r
220         \r
221         return result;\r
222     }\r
223 \r
224     public void insert(String string)\r
225     {\r
226         root.insert(toIntArray(string), 0);\r
227     }\r
228     \r
229     public void insert(int[] chars)\r
230     {\r
231         root.insert(chars, 0);\r
232     }\r
233     \r
234     public void walk(TreeWalker walker)\r
235     {\r
236         root.walk(walker);\r
237         walker.done();\r
238     }\r
239     \r
240     public void dump()\r
241     {\r
242         PrintWriter pw = new PrintWriter(System.out);\r
243         \r
244         root.dump(pw, 0);\r
245         pw.flush();\r
246     }\r
247 }\r