/* ******************************************************************************* * Copyright (C) 1998-2010, International Business Machines Corporation and * * others. All Rights Reserved. * ******************************************************************************* */ package com.ibm.icu.dev.tool.layout; import java.util.Vector; import com.ibm.icu.impl.Utility; public class ScriptRunModuleWriter extends ScriptModuleWriter { public ScriptRunModuleWriter(ScriptData theScriptData) { super(theScriptData, null); } public void writeScriptRuns(String fileName) { int minScript = scriptData.getMinValue(); int maxScript = scriptData.getMaxValue(); int recordCount = scriptData.getRecordCount(); openFile(fileName); writeHeader(null, includeFiles); output.println(preamble); for (int record = 0; record < recordCount; record += 1) { int script = scriptData.getRecord(record).scriptCode(); output.print(" {0x"); output.print(Utility.hex(scriptData.getRecord(record).startChar(), 6)); output.print(", 0x"); output.print(Utility.hex(scriptData.getRecord(record).endChar(), 6)); output.print(", "); output.print(scriptData.getTag(script)); output.print("ScriptCode}"); output.print((record == recordCount - 1) ? " " : ","); output.print(" // "); output.println(scriptData.getName(script)); } output.println(postamble); int power = 1 << Utility.highBit(recordCount); int extra = recordCount - power; output.print("le_int32 ScriptRun::scriptRecordsPower = 0x"); output.print(Utility.hex(power, 4)); output.println(";"); output.print("le_int32 ScriptRun::scriptRecordsExtra = 0x"); output.print(Utility.hex(extra, 4)); output.println(";"); Vector[] scriptRangeOffsets = new Vector[maxScript - minScript + 1]; for (int script = minScript; script <= maxScript; script += 1) { scriptRangeOffsets[script - minScript] = new Vector(); } for (int record = 0; record < recordCount; record += 1) { scriptRangeOffsets[scriptData.getRecord(record).scriptCode() - minScript].addElement(new Integer(record)); } output.println(); for (int script = minScript; script <= maxScript; script += 1) { Vector offsets = scriptRangeOffsets[script - minScript]; output.print("le_int16 "); output.print(scriptData.getTag(script)); output.println("ScriptRanges[] = {"); output.print(" "); for (int offset = 0; offset < offsets.size(); offset += 1) { Integer i = (Integer) offsets.elementAt(offset); output.print(i.intValue()); output.print(", "); } output.println("-1"); output.println(postamble); } output.println("le_int16 *ScriptRun::scriptRangeOffsets[] = {"); for (int script = minScript; script <= maxScript; script += 1) { output.print(" "); output.print(scriptData.getTag(script)); output.print("ScriptRanges"); output.print(script == maxScript? " " : ", "); output.print("// "); output.println(scriptData.getName(script)); } output.println(postamble); writeTrailer(); closeFile(); } private static final String[] includeFiles = {"LETypes.h", "LEScripts.h", "ScriptRun.h"}; private static final String preamble = "\n" + "ScriptRecord ScriptRun::scriptRecords[] = {"; private static final String postamble = "};\n"; }