package build.tools.generatecharacter; import java.io.*; import java.nio.*; import java.util.*; import java.util.zip.*; public class CharacterName { public static void main(String[] args) { FileReader reader = null; try { if (args.length != 2) { System.err.println("Usage: java CharacterName UniocdeData.txt uniName.dat"); System.exit(1); } reader = new FileReader(args[0]); BufferedReader bfr = new BufferedReader(reader); String line = null; StringBuilder namePool = new StringBuilder(); byte[] cpPoolBytes = new byte[0x100000]; ByteBuffer cpBB = ByteBuffer.wrap(cpPoolBytes); int lastCp = 0; int cpNum = 0; while ((line = bfr.readLine()) != null) { if (line.startsWith("#")) continue; UnicodeSpec spec = UnicodeSpec.parse(line); if (spec != null) { int cp = spec.getCodePoint(); String name = spec.getName(); cpNum++; if (name.equals("") && spec.getOldName() != null) { if (spec.getOldName().length() != 0) name = spec.getOldName(); else continue; } else if (name.startsWith("<")) { /* 3400 4db5 4e00 9fc3 ac00 d7a3 d800 db7f db80 dbff dc00 dfff e000 f8ff 20000 2a6d6 f0000 ffffd */ continue; } if (cp == lastCp + 1) { cpBB.put((byte)name.length()); } else { cpBB.put((byte)0); // segment start flag cpBB.putInt((name.length() << 24) | (cp & 0xffffff)); } namePool.append(name); lastCp = cp; } } byte[] namePoolBytes = namePool.toString().getBytes("ASCII"); int cpLen = cpBB.position(); int total = cpLen + namePoolBytes.length; DataOutputStream dos = new DataOutputStream( new DeflaterOutputStream( new FileOutputStream(args[1]))); dos.writeInt(total); // total dos.writeInt(cpLen); // nameOff dos.write(cpPoolBytes, 0, cpLen); dos.write(namePoolBytes); dos.close(); } catch (Throwable e) { System.out.println("Unexpected exception:"); e.printStackTrace(); } finally { if (reader != null) { try { reader.close(); } catch (Throwable ee) { ee.printStackTrace(); } } } } }