Home | History | Annotate | Download | only in layout
      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 }