KickJava   Java API By Example, From Geeks To Geeks.

Java > Open Source Codes > com > thaiopensource > datatype > xsd > regex > jdk1_4 > gen > CategoriesGen


1 package com.thaiopensource.datatype.xsd.regex.jdk1_4.gen;
2
3 import java.io.File JavaDoc;
4 import java.io.OutputStream JavaDoc;
5 import java.io.FileOutputStream JavaDoc;
6 import java.io.Writer JavaDoc;
7 import java.io.BufferedWriter JavaDoc;
8 import java.io.OutputStreamWriter JavaDoc;
9 import java.io.BufferedReader JavaDoc;
10 import java.io.FileInputStream JavaDoc;
11 import java.io.InputStreamReader JavaDoc;
12 import java.io.IOException JavaDoc;
13 import java.io.Reader JavaDoc;
14 import java.util.HashMap JavaDoc;
15 import java.util.Map JavaDoc;
16 import java.util.List JavaDoc;
17 import java.util.Vector JavaDoc;
18 import java.util.Iterator JavaDoc;
19 import java.util.Set JavaDoc;
20
21 public class CategoriesGen {
22   static public void main(String JavaDoc[] args) throws IOException JavaDoc {
23     if (args.length != 3) {
24       System.err.println("usage: " + CategoriesGen.class.getName() + " className srcDir UnicodeData.txt");
25       System.exit(2);
26     }
27     BufferedReader JavaDoc r = new BufferedReader JavaDoc(new InputStreamReader JavaDoc(new FileInputStream JavaDoc(args[2])));
28     CategoriesGen g = new CategoriesGen();
29     g.load(r);
30     String JavaDoc className = args[0];
31     String JavaDoc srcDir = args[1];
32     int lastDot = className.lastIndexOf('.');
33     String JavaDoc pkg;
34     if (lastDot < 0)
35       pkg = null;
36     else {
37       pkg = className.substring(0, lastDot);
38       className = className.substring(lastDot + 1);
39       srcDir = srcDir + File.separator + pkg.replace('.', File.separatorChar);
40     }
41     String JavaDoc srcFile = srcDir + File.separator + className + ".java";
42     OutputStream JavaDoc stm = new FileOutputStream JavaDoc(srcFile);
43     Writer JavaDoc w = new BufferedWriter JavaDoc(new OutputStreamWriter JavaDoc(stm));
44     String JavaDoc lineSep = System.getProperty("line.separator");
45     w.write("// This file was automatically generated by ");
46     w.write(CategoriesGen.class.getName());
47     w.write(lineSep);
48     if (pkg != null)
49       w.write("package " + pkg + ";" + lineSep + lineSep);
50     w.write("class " + className + " {" + lineSep);
51     g.save(w, lineSep);
52     w.write("}" + lineSep);
53     w.close();
54   }
55
56   void load(BufferedReader JavaDoc r) throws IOException JavaDoc {
57     String JavaDoc lastCategory = null;
58     int lastCode = 0;
59     int firstCode = 0;
60     for (;;) {
61       String JavaDoc line = r.readLine();
62       if (line == null)
63         break;
64       int semi = line.indexOf(';');
65       if (semi != 5 && semi != 6)
66         continue;
67       int code = Integer.parseInt(line.substring(0, semi), 16);
68       int semi2 = line.indexOf(';', semi + 1);
69       String JavaDoc name = line.substring(semi, semi2);
70       String JavaDoc category = line.substring(semi2 + 1, semi2 + 3);
71       if (!category.equals(lastCategory) ||
72           !(lastCode + 1 == code || name.endsWith(", Last>"))) {
73         if (lastCategory != null)
74           add(firstCode, lastCode, lastCategory);
75         lastCategory = category;
76         firstCode = code;
77       }
78       lastCode = code;
79     }
80     if (lastCategory != null)
81       add(firstCode, lastCode, lastCategory);
82   }
83
84   private final Map JavaDoc map = new HashMap JavaDoc();
85
86   static class Range {
87     private final int lower;
88     private final int upper;
89
90     public Range(int lower, int upper) {
91       this.lower = lower;
92       this.upper = upper;
93     }
94   }
95
96   void add(int firstCode, int lastCode, String JavaDoc category) {
97     List JavaDoc list = (List JavaDoc)map.get(category);
98     if (list == null) {
99       list = new Vector JavaDoc();
100       map.put(category, list);
101     }
102     list.add(new Range(firstCode, lastCode));
103   }
104
105   static private final String JavaDoc INDENT = " ";
106
107   void save(Writer JavaDoc w, String JavaDoc lineSep) throws IOException JavaDoc {
108     Set JavaDoc set = map.entrySet();
109     w.write(lineSep);
110     w.write(INDENT);
111     w.write("static final String CATEGORY_NAMES = \"");
112     for (Iterator JavaDoc iter = set.iterator(); iter.hasNext();) {
113       Map.Entry JavaDoc entry = (Map.Entry JavaDoc)iter.next();
114       w.write((String JavaDoc)entry.getKey());
115     }
116     w.write("\";");
117     w.write(lineSep);
118     w.write(lineSep);
119     w.write(INDENT);
120     w.write("static final int[][] CATEGORY_RANGES = {");
121     w.write(lineSep);
122
123     for (Iterator JavaDoc iter = set.iterator(); iter.hasNext();) {
124       Map.Entry JavaDoc entry = (Map.Entry JavaDoc)iter.next();
125       w.write(INDENT);
126       w.write(INDENT);
127       w.write('{');
128       w.write(lineSep);
129       w.write(INDENT);
130       w.write(INDENT);
131       w.write(INDENT);
132       w.write("// ");
133       w.write((String JavaDoc)entry.getKey());
134       w.write(lineSep);
135       List JavaDoc list = (List JavaDoc)entry.getValue();
136       for (int i = 0, len = list.size(); i < len; i++) {
137         Range r = (Range)list.get(i);
138         w.write(INDENT);
139         w.write(INDENT);
140         w.write(INDENT);
141         w.write("0x");
142         w.write(Integer.toHexString(r.lower));
143         w.write(", ");
144         w.write("0x");
145         w.write(Integer.toHexString(r.upper));
146         if (i + 1 != len)
147           w.write(",");
148         w.write(lineSep);
149       }
150       w.write(INDENT);
151       w.write(INDENT);
152       w.write('}');
153       if (iter.hasNext())
154         w.write(',');
155       w.write(lineSep);
156     }
157     w.write(INDENT);
158     w.write("};");
159     w.write(lineSep);
160   }
161 }
162
Popular Tags