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