2 *******************************************************************************
\r
3 * Copyright (C) 1998-2004, International Business Machines Corporation and *
\r
4 * others. All Rights Reserved. *
\r
5 *******************************************************************************
\r
7 package com.ibm.icu.dev.tool.layout;
\r
10 import com.ibm.icu.impl.Utility;
\r
12 public class ScriptRunModuleWriter extends ScriptModuleWriter
\r
14 public ScriptRunModuleWriter(ScriptData theScriptData)
\r
16 super(theScriptData, null);
\r
19 public void writeScriptRuns(String fileName)
\r
21 int minScript = scriptData.getMinValue();
\r
22 int maxScript = scriptData.getMaxValue();
\r
23 int recordCount = scriptData.getRecordCount();
\r
26 writeHeader(null, includeFiles);
\r
27 output.println(preamble);
\r
29 for (int record = 0; record < recordCount; record += 1) {
\r
30 int script = scriptData.getRecord(record).scriptCode();
\r
32 output.print(" {0x");
\r
33 output.print(Utility.hex(scriptData.getRecord(record).startChar(), 6));
\r
34 output.print(", 0x");
\r
35 output.print(Utility.hex(scriptData.getRecord(record).endChar(), 6));
\r
37 output.print(scriptData.getTag(script));
\r
38 output.print("ScriptCode}");
\r
39 output.print((record == recordCount - 1) ? " " : ",");
\r
40 output.print(" // ");
\r
41 output.println(scriptData.getName(script));
\r
44 output.println(postamble);
\r
46 int power = 1 << Utility.highBit(recordCount);
\r
47 int extra = recordCount - power;
\r
49 output.print("le_int32 ScriptRun::scriptRecordsPower = 0x");
\r
50 output.print(Utility.hex(power, 4));
\r
51 output.println(";");
\r
54 output.print("le_int32 ScriptRun::scriptRecordsExtra = 0x");
\r
55 output.print(Utility.hex(extra, 4));
\r
56 output.println(";");
\r
58 Vector[] scriptRangeOffsets = new Vector[maxScript - minScript + 1];
\r
60 for (int script = minScript; script <= maxScript; script += 1) {
\r
61 scriptRangeOffsets[script - minScript] = new Vector();
\r
64 for (int record = 0; record < recordCount; record += 1) {
\r
65 scriptRangeOffsets[scriptData.getRecord(record).scriptCode() - minScript].addElement(new Integer(record));
\r
70 for (int script = minScript; script <= maxScript; script += 1) {
\r
71 Vector offsets = scriptRangeOffsets[script - minScript];
\r
73 output.print("le_int16 ");
\r
74 output.print(scriptData.getTag(script));
\r
75 output.println("ScriptRanges[] = {");
\r
78 for (int offset = 0; offset < offsets.size(); offset += 1) {
\r
79 Integer i = (Integer) offsets.elementAt(offset);
\r
81 output.print(i.intValue());
\r
85 output.println("-1");
\r
86 output.println(postamble);
\r
89 output.println("le_int16 *ScriptRun::scriptRangeOffsets[] = {");
\r
91 for (int script = minScript; script <= maxScript; script += 1) {
\r
93 output.print(scriptData.getTag(script));
\r
94 output.print("ScriptRanges");
\r
95 output.print(script == maxScript? " " : ", ");
\r
96 output.print("// ");
\r
97 output.println(scriptData.getName(script));
\r
100 output.println(postamble);
\r
106 private static final String[] includeFiles = {"LETypes.h", "LEScripts.h", "ScriptRun.h"};
\r
108 private static final String preamble =
\r
110 "ScriptRecord ScriptRun::scriptRecords[] = {";
\r
112 private static final String postamble =
\r