2 *******************************************************************************
\r
3 * Copyright (C) 1998-2010, International Business Machines Corporation and *
\r
4 * others. All Rights Reserved. *
\r
5 *******************************************************************************
\r
7 package com.ibm.icu.dev.tool.layout;
\r
9 import java.util.Vector;
\r
11 import com.ibm.icu.impl.Utility;
\r
13 public class ScriptRunModuleWriter extends ScriptModuleWriter
\r
15 public ScriptRunModuleWriter(ScriptData theScriptData)
\r
17 super(theScriptData, null);
\r
20 public void writeScriptRuns(String fileName)
\r
22 int minScript = scriptData.getMinValue();
\r
23 int maxScript = scriptData.getMaxValue();
\r
24 int recordCount = scriptData.getRecordCount();
\r
27 writeHeader(null, includeFiles);
\r
28 output.println(preamble);
\r
30 for (int record = 0; record < recordCount; record += 1) {
\r
31 int script = scriptData.getRecord(record).scriptCode();
\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
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
45 output.println(postamble);
\r
47 int power = 1 << Utility.highBit(recordCount);
\r
48 int extra = recordCount - power;
\r
50 output.print("le_int32 ScriptRun::scriptRecordsPower = 0x");
\r
51 output.print(Utility.hex(power, 4));
\r
52 output.println(";");
\r
55 output.print("le_int32 ScriptRun::scriptRecordsExtra = 0x");
\r
56 output.print(Utility.hex(extra, 4));
\r
57 output.println(";");
\r
59 Vector[] scriptRangeOffsets = new Vector[maxScript - minScript + 1];
\r
61 for (int script = minScript; script <= maxScript; script += 1) {
\r
62 scriptRangeOffsets[script - minScript] = new Vector();
\r
65 for (int record = 0; record < recordCount; record += 1) {
\r
66 scriptRangeOffsets[scriptData.getRecord(record).scriptCode() - minScript].addElement(new Integer(record));
\r
71 for (int script = minScript; script <= maxScript; script += 1) {
\r
72 Vector offsets = scriptRangeOffsets[script - minScript];
\r
74 output.print("le_int16 ");
\r
75 output.print(scriptData.getTag(script));
\r
76 output.println("ScriptRanges[] = {");
\r
79 for (int offset = 0; offset < offsets.size(); offset += 1) {
\r
80 Integer i = (Integer) offsets.elementAt(offset);
\r
82 output.print(i.intValue());
\r
86 output.println("-1");
\r
87 output.println(postamble);
\r
90 output.println("le_int16 *ScriptRun::scriptRangeOffsets[] = {");
\r
92 for (int script = minScript; script <= maxScript; script += 1) {
\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
101 output.println(postamble);
\r
107 private static final String[] includeFiles = {"LETypes.h", "LEScripts.h", "ScriptRun.h"};
\r
109 private static final String preamble =
\r
111 "ScriptRecord ScriptRun::scriptRecords[] = {";
\r
113 private static final String postamble =
\r