]> gitweb.fperrin.net Git - Dictionary.git/blob - jars/icu4j-4_4_2-src/tools/misc/src/com/ibm/icu/dev/tool/layout/ScriptRunModuleWriter.java
go
[Dictionary.git] / jars / icu4j-4_4_2-src / tools / misc / src / com / ibm / icu / dev / tool / layout / ScriptRunModuleWriter.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 package com.ibm.icu.dev.tool.layout;\r
8 \r
9 import java.util.Vector;\r
10 \r
11 import com.ibm.icu.impl.Utility;\r
12 \r
13 public class ScriptRunModuleWriter extends ScriptModuleWriter\r
14 {\r
15     public ScriptRunModuleWriter(ScriptData theScriptData)\r
16     {\r
17         super(theScriptData, null);\r
18     }\r
19     \r
20     public void writeScriptRuns(String fileName)\r
21     {\r
22         int minScript   = scriptData.getMinValue();\r
23         int maxScript   = scriptData.getMaxValue();\r
24         int recordCount = scriptData.getRecordCount();\r
25         \r
26         openFile(fileName);\r
27         writeHeader(null, includeFiles);\r
28         output.println(preamble);\r
29         \r
30         for (int record = 0; record < recordCount; record += 1) {\r
31             int script = scriptData.getRecord(record).scriptCode();\r
32             \r
33             output.print("    {0x");\r
34             output.print(Utility.hex(scriptData.getRecord(record).startChar(), 6));\r
35             output.print(", 0x");\r
36             output.print(Utility.hex(scriptData.getRecord(record).endChar(), 6));\r
37             output.print(", ");\r
38             output.print(scriptData.getTag(script));\r
39             output.print("ScriptCode}");\r
40             output.print((record == recordCount - 1) ? " " : ",");\r
41             output.print(" // ");\r
42             output.println(scriptData.getName(script));\r
43         }\r
44         \r
45         output.println(postamble);\r
46         \r
47         int power = 1 << Utility.highBit(recordCount);\r
48         int extra = recordCount - power;\r
49         \r
50         output.print("le_int32 ScriptRun::scriptRecordsPower = 0x");\r
51         output.print(Utility.hex(power, 4));\r
52         output.println(";");\r
53         \r
54         \r
55         output.print("le_int32 ScriptRun::scriptRecordsExtra = 0x");\r
56         output.print(Utility.hex(extra, 4));\r
57         output.println(";");\r
58 \r
59         Vector[] scriptRangeOffsets = new Vector[maxScript - minScript + 1];\r
60         \r
61         for (int script = minScript; script <= maxScript; script += 1) {\r
62             scriptRangeOffsets[script - minScript] = new Vector();\r
63         }\r
64         \r
65         for (int record = 0; record < recordCount; record += 1) {\r
66             scriptRangeOffsets[scriptData.getRecord(record).scriptCode() - minScript].addElement(new Integer(record));\r
67         }\r
68         \r
69         output.println();\r
70         \r
71         for (int script = minScript; script <= maxScript; script += 1) {\r
72             Vector offsets = scriptRangeOffsets[script - minScript];\r
73             \r
74             output.print("le_int16 ");\r
75             output.print(scriptData.getTag(script));\r
76             output.println("ScriptRanges[] = {");\r
77             output.print("    ");\r
78             \r
79             for (int offset = 0; offset < offsets.size(); offset += 1) {\r
80                 Integer i = (Integer) offsets.elementAt(offset);\r
81                 \r
82                 output.print(i.intValue());\r
83                 output.print(", ");\r
84             }\r
85             \r
86             output.println("-1");\r
87             output.println(postamble);\r
88         }\r
89         \r
90         output.println("le_int16 *ScriptRun::scriptRangeOffsets[] = {");\r
91         \r
92         for (int script = minScript; script <= maxScript; script += 1) {\r
93             output.print("    ");\r
94             output.print(scriptData.getTag(script));\r
95             output.print("ScriptRanges");\r
96             output.print(script == maxScript? "  " : ", ");\r
97             output.print("// ");\r
98             output.println(scriptData.getName(script));\r
99         }\r
100         \r
101         output.println(postamble);\r
102         \r
103         writeTrailer();\r
104         closeFile();\r
105     }\r
106     \r
107     private static final String[] includeFiles = {"LETypes.h", "LEScripts.h", "ScriptRun.h"};\r
108     \r
109     private static final String preamble = \r
110     "\n" +\r
111     "ScriptRecord ScriptRun::scriptRecords[] = {";\r
112     \r
113     private static final String postamble =\r
114     "};\n";\r
115 }