1 package com.thaiopensource.datatype.xsd.regex.jdk1_4.gen; 2 3 import java.io.File ; 4 import java.io.OutputStream ; 5 import java.io.FileOutputStream ; 6 import java.io.Writer ; 7 import java.io.BufferedWriter ; 8 import java.io.OutputStreamWriter ; 9 import java.io.BufferedReader ; 10 import java.io.FileInputStream ; 11 import java.io.InputStreamReader ; 12 import java.io.IOException ; 13 import java.io.Reader ; 14 import java.util.HashMap ; 15 import java.util.Map ; 16 import java.util.List ; 17 import java.util.Vector ; 18 import java.util.Iterator ; 19 import java.util.Set ; 20 21 public class CategoriesGen { 22 static public void main(String [] args) throws IOException { 23 if (args.length != 3) { 24 System.err.println("usage: " + CategoriesGen.class.getName() + " className srcDir UnicodeData.txt"); 25 System.exit(2); 26 } 27 BufferedReader r = new BufferedReader (new InputStreamReader (new FileInputStream (args[2]))); 28 CategoriesGen g = new CategoriesGen(); 29 g.load(r); 30 String className = args[0]; 31 String srcDir = args[1]; 32 int lastDot = className.lastIndexOf('.'); 33 String 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 srcFile = srcDir + File.separator + className + ".java"; 42 OutputStream stm = new FileOutputStream (srcFile); 43 Writer w = new BufferedWriter (new OutputStreamWriter (stm)); 44 String 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 r) throws IOException { 57 String lastCategory = null; 58 int lastCode = 0; 59 int firstCode = 0; 60 for (;;) { 61 String 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 name = line.substring(semi, semi2); 70 String 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 map = new HashMap (); 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 category) { 97 List list = (List )map.get(category); 98 if (list == null) { 99 list = new Vector (); 100 map.put(category, list); 101 } 102 list.add(new Range(firstCode, lastCode)); 103 } 104 105 static private final String INDENT = " "; 106 107 void save(Writer w, String lineSep) throws IOException { 108 Set set = map.entrySet(); 109 w.write(lineSep); 110 w.write(INDENT); 111 w.write("static final String CATEGORY_NAMES = \""); 112 for (Iterator iter = set.iterator(); iter.hasNext();) { 113 Map.Entry entry = (Map.Entry )iter.next(); 114 w.write((String )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 iter = set.iterator(); iter.hasNext();) { 124 Map.Entry entry = (Map.Entry )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 )entry.getKey()); 134 w.write(lineSep); 135 List list = (List )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 |