~ubuntu-branches/debian/wheezy/jing-trang/wheezy

« back to all changes in this revision

Viewing changes to mod/regex-gen/src/main/com/thaiopensource/datatype/xsd/regex/java/gen/CategoriesGen.java

  • Committer: Bazaar Package Importer
  • Author(s): Samuel Thibault
  • Date: 2009-09-01 15:53:03 UTC
  • Revision ID: james.westby@ubuntu.com-20090901155303-2kweef05h5v9j3ni
Tags: upstream-20090818
ImportĀ upstreamĀ versionĀ 20090818

Show diffs side-by-side

added added

removed removed

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