ICU-2649 Initial checkin of the ICU4J version of ScriptNameBuilder.

X-SVN-Rev: 10854
This commit is contained in:
Eric Mader 2003-01-14 19:05:23 +00:00
parent 4319e6f985
commit e46d24b5f1
6 changed files with 625 additions and 0 deletions

View file

@ -0,0 +1,75 @@
/*
*******************************************************************************
* Copyright (C) 1998-2002, International Business Machines Corporation and *
* others. All Rights Reserved. *
*******************************************************************************
*
* $Source: /xsrl/Nsvn/icu/icu4j/src/com/ibm/icu/dev/tool/layout/ModuleWriter.java,v $
* $Date: 2003/01/14 19:05:23 $
* $Revision: 1.1 $
*
*******************************************************************************
*/
package com.ibm.icu.dev.tool.layout;
import java.io.PrintStream;
import java.io.FileOutputStream;
import java.io.IOException;
public class ModuleWriter
{
public ModuleWriter(ScriptData theScriptData)
{
scriptData = theScriptData;
output = null;
}
public void openFile(String outputFileName)
{
try
{
output = new PrintStream(
new FileOutputStream(outputFileName));
}
catch (IOException e)
{
System.out.println("? Could not open " + outputFileName + " for writing.");
return;
}
System.out.println("\nWriting module " + outputFileName + "...");
}
public void writeHeader()
{
output.print(moduleHeader);
}
public void includeFile(String fileName)
{
output.print("#include \"");
output.print(fileName);
output.println("\"");
};
public void closeFile()
{
System.out.println("Done.");
output.close();
}
protected ScriptData scriptData;
protected PrintStream output;
protected static final String moduleHeader =
"/*\n" +
" * %W% %E%\n" +
" *\n" +
" * (C) Copyright IBM Corp. 1998 - 2003. All Rights Reserved.\n" +
" *\n" +
" * WARNING: THIS FILE IS MACHINE GENERATED. DO NOT HAND EDIT IT UNLESS\n" +
" * YOU REALLY KNOW WHAT YOU'RE DOING.\n" +
" *\n" +
" */\n" +
"\n";
}

View file

@ -0,0 +1,188 @@
/*
*******************************************************************************
* Copyright (C) 1998-2002, International Business Machines Corporation and *
* others. All Rights Reserved. *
*******************************************************************************
*
* $Source: /xsrl/Nsvn/icu/icu4j/src/com/ibm/icu/dev/tool/layout/ScriptData.java,v $
* $Date: 2003/01/14 19:05:23 $
* $Revision: 1.1 $
*
*******************************************************************************
*/
package com.ibm.icu.dev.tool.layout;
import java.util.*;
import com.ibm.icu.lang.UCharacter;
import com.ibm.icu.lang.UScript;
import com.ibm.icu.lang.UProperty;
import com.ibm.icu.text.UnicodeSet;
import com.ibm.icu.text.UnicodeSetIterator;
import com.ibm.icu.impl.Utility;
public class ScriptData
{
public static class Record
{
private int startChar;
private int endChar;
private int scriptCode;
Record()
{
// nothing?
}
Record(int theChar, int theScriptCode)
{
this(theChar, theChar, theScriptCode);
}
Record(int theStartChar, int theEndChar, int theScriptCode)
{
startChar = theStartChar;
endChar = theEndChar;
scriptCode = theScriptCode;
}
public int startChar()
{
return startChar;
}
public int endChar()
{
return endChar;
}
public int scriptCode()
{
return scriptCode;
}
public int compareTo(Record that)
{
return this.startChar - that.startChar;
}
public String toString()
{
return "[" + Utility.hex(startChar, 6) + ".." +
Utility.hex(endChar, 6) + ", " +
UScript.getShortName(scriptCode).toLowerCase() + "ScriptCode]";
}
}
//
// Straight insertion sort from Knuth vol. III, pg. 81
//
private void sort()
{
for (int j = 1; j < fRecords.length; j += 1) {
int i;
Record v = fRecords[j];
for (i = j - 1; i >= 0; i -= 1) {
if (v.compareTo(fRecords[i]) >= 0) {
break;
}
fRecords[i + 1] = fRecords[i];
}
fRecords[i + 1] = v;
}
}
ScriptData()
{
int commonScript = UCharacter.getPropertyValueEnum(UProperty.SCRIPT, "COMMON");
int scriptCount;
Vector rv = new Vector();
fMinScript = UCharacter.getIntPropertyMinValue(UProperty.SCRIPT);
fMaxScript = UCharacter.getIntPropertyMaxValue(UProperty.SCRIPT);
scriptCount = fMaxScript - fMinScript + 1;
System.out.println("Collecting script data for " + scriptCount + " scripts...");
fScriptNames = new String[scriptCount];
fScriptTags = new String[scriptCount];
for (int script = fMinScript; script <= fMaxScript; script += 1) {
fScriptNames[script - fMinScript] = UScript.getName(script).toUpperCase();
fScriptTags[script - fMinScript] = UScript.getShortName(script).toLowerCase();
if (script != commonScript) {
UnicodeSet scriptSet = new UnicodeSet("\\p{" + fScriptTags[script] + "}");
UnicodeSetIterator it = new UnicodeSetIterator(scriptSet);
while (it.nextRange()) {
Record record = new Record(it.codepoint, it.codepointEnd, script);
rv.addElement(record);
}
}
}
fRecords = new Record[rv.size()];
for (int i = 0; i < rv.size(); i += 1) {
fRecords[i] = (Record) rv.elementAt(i);
}
System.out.println("Collected " + rv.size() + " records. Sorting...");
sort();
System.out.println("Done.");
}
public int getMinScript()
{
return fMinScript;
}
public int getMaxScript()
{
return fMaxScript;
}
public int getRecordCount()
{
return fRecords.length;
}
public String getScriptTag(int scriptCode)
{
if (scriptCode >= fMinScript && scriptCode <= fMaxScript) {
return fScriptTags[scriptCode - fMinScript];
}
return "zyyx";
}
public String getScriptName(int scriptCode)
{
if (scriptCode >= fMinScript && scriptCode <= fMaxScript) {
return fScriptNames[scriptCode - fMinScript];
}
return "COMMON";
}
public Record getRecord(int index)
{
if (fRecords != null && index < fRecords.length) {
return fRecords[index];
}
return null;
}
private int fMinScript;
private int fMaxScript;
private String fScriptNames[];
private String fScriptTags[];
private Record fRecords[];
};

View file

@ -0,0 +1,71 @@
/*
*******************************************************************************
* Copyright (C) 1998-2002, International Business Machines Corporation and *
* others. All Rights Reserved. *
*******************************************************************************
*
* $Source: /xsrl/Nsvn/icu/icu4j/src/com/ibm/icu/dev/tool/layout/ScriptModuleWriter.java,v $
* $Date: 2003/01/14 19:05:23 $
* $Revision: 1.1 $
*
*******************************************************************************
*/
package com.ibm.icu.dev.tool.layout;
public class ScriptModuleWriter extends ModuleWriter
{
public ScriptModuleWriter(ScriptData scriptData)
{
super(scriptData);
}
public void writeScriptHeader(String fileName)
{
int minScript = scriptData.getMinScript();
int maxScript = scriptData.getMaxScript();
openFile(fileName);
writeHeader();
output.println(preamble);
for (int script = minScript; script <= maxScript; script += 1) {
output.print(" ");
output.print(scriptData.getScriptTag(script));
output.print("ScriptCode = ");
if (script < 10) {
output.print(" ");
}
output.print(script);
output.println(",");
}
output.println();
output.print(" scriptCodeCount = ");
output.println(maxScript - minScript + 1);
output.println(postamble);
closeFile();
}
private static final String preamble =
"#ifndef __LESCRIPTS_H\n" +
"#define __LESCRIPTS_H\n" +
"\n" +
"U_NAMESPACE_BEGIN\n" +
"\n" +
"/**\n" +
" * Constants for Unicode script values, generated using\n" +
" * ICU4J's <code>UScript</code> class.\n" +
" *\n" +
" * @draft ICU 2.4\n" +
" */\n" +
"enum ScriptCodes {";
private static final String postamble =
"};\n" +
"\n" +
"U_NAMESPACE_END\n" +
"#endif";
}

View file

@ -0,0 +1,38 @@
/*
*******************************************************************************
* Copyright (C) 1998-2002, International Business Machines Corporation and *
* others. All Rights Reserved. *
*******************************************************************************
*
* $Source: /xsrl/Nsvn/icu/icu4j/src/com/ibm/icu/dev/tool/layout/ScriptNameBuilder.java,v $
* $Date: 2003/01/14 19:05:23 $
* $Revision: 1.1 $
*
*******************************************************************************
*/
package com.ibm.icu.dev.tool.layout;
public class ScriptNameBuilder
{
/*
* This tool builds the script related header files and data tables needed by
* the ICU LayoutEngine. By using the ICU4J interfaces to access the script
* information, we can be sure that the data written by this tool is in synch
* with ICU.
*/
public static void main(String[] args)
{
ScriptData scriptData = new ScriptData();
ScriptModuleWriter scriptModuleWriter = new ScriptModuleWriter(scriptData);
scriptModuleWriter.writeScriptHeader("LEScripts.h");
ScriptTagModuleWriter scriptTagModuleWriter = new ScriptTagModuleWriter(scriptData);
scriptTagModuleWriter.writeScriptTags("ScriptAndLanguageTags");
ScriptRunModuleWriter scriptRunModuleWriter = new ScriptRunModuleWriter(scriptData);
scriptRunModuleWriter.writeScriptRuns("ScriptRunData.cpp");
}
}

View file

@ -0,0 +1,120 @@
/*
*******************************************************************************
* Copyright (C) 1998-2002, International Business Machines Corporation and *
* others. All Rights Reserved. *
*******************************************************************************
*
* $Source: /xsrl/Nsvn/icu/icu4j/src/com/ibm/icu/dev/tool/layout/ScriptRunModuleWriter.java,v $
* $Date: 2003/01/14 19:05:23 $
* $Revision: 1.1 $
*
*******************************************************************************
*/
package com.ibm.icu.dev.tool.layout;
import java.util.*;
import com.ibm.icu.impl.Utility;
public class ScriptRunModuleWriter extends ModuleWriter
{
public ScriptRunModuleWriter(ScriptData theScriptData)
{
super(theScriptData);
}
public void writeScriptRuns(String fileName)
{
int minScript = scriptData.getMinScript();
int maxScript = scriptData.getMaxScript();
int recordCount = scriptData.getRecordCount();
openFile(fileName);
writeHeader();
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.getScriptTag(script));
output.print("ScriptCode}");
output.print((record == recordCount - 1) ? " " : ",");
output.print(" // ");
output.println(scriptData.getScriptName(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.getScriptTag(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("};\n");
}
output.println("le_int16 *ScriptRun::scriptRangeOffsets[] = {");
for (int script = minScript; script <= maxScript; script += 1) {
output.print(" ");
output.print(scriptData.getScriptTag(script));
output.print("ScriptRanges");
output.print(script == maxScript? " " : ", ");
output.print("// ");
output.println(scriptData.getScriptName(script));
}
output.println("};");
closeFile();
}
private static final String preamble =
"#include \"LETypes.h\"\n" +
"#include \"LEScripts.h\"\n" +
"#include \"ScriptRun.h\"\n" +
"\n" +
"ScriptRecord ScriptRun::scriptRecords[] = {";
private static final String postamble =
"};\n";
}

View file

@ -0,0 +1,133 @@
/*
*******************************************************************************
* Copyright (C) 1998-2002, International Business Machines Corporation and *
* others. All Rights Reserved. *
*******************************************************************************
*
* $Source: /xsrl/Nsvn/icu/icu4j/src/com/ibm/icu/dev/tool/layout/ScriptTagModuleWriter.java,v $
* $Date: 2003/01/14 19:05:23 $
* $Revision: 1.1 $
*
*******************************************************************************
*/
package com.ibm.icu.dev.tool.layout;
import com.ibm.icu.impl.Utility;
public class ScriptTagModuleWriter extends ModuleWriter
{
private int scriptTag(String tag)
{
int result = 0;
for (int i = 0; i < 4; i += 1) {
result <<= 8;
result += (int) (tag.charAt(i) & 0xFF);
}
return result;
}
public ScriptTagModuleWriter(ScriptData theScriptData)
{
super(theScriptData);
}
public void writeHeaderFile(String fileName)
{
int minScript = scriptData.getMinScript();
int maxScript = scriptData.getMaxScript();
openFile(fileName);
writeHeader();
output.println(hPreamble);
for (int script = minScript; script <= maxScript; script += 1) {
String tag = scriptData.getScriptTag(script);
output.print("const LETag ");
output.print(tag);
output.print("ScriptTag = 0x");
output.print(Utility.hex(scriptTag(tag), 8));
output.print("; /* '");
output.print(tag);
output.print("' (");
output.print(scriptData.getScriptName(script));
output.println(") */");
}
output.println(hPostamble);
closeFile();
}
public void writeCPPFile(String fileName)
{
int minScript = scriptData.getMinScript();
int maxScript = scriptData.getMaxScript();
openFile(fileName);
writeHeader();
output.println(cppPreamble);
for (int script = minScript; script <= maxScript; script += 1) {
String tag = scriptData.getScriptTag(script);
output.print(" ");
output.print(tag);
output.print("ScriptTag");
output.print((script == maxScript? " " : ","));
output.print(" /* '");
output.print(tag);
output.print("' (");
output.print(scriptData.getScriptName(script));
output.println(") */");
}
output.println(cppPostamble);
closeFile();
}
public void writeScriptTags(String fileName)
{
writeHeaderFile(fileName + ".h");
writeCPPFile(fileName + ".cpp");
}
private static final String hPreamble =
"#ifndef __SCRIPTANDLANGUAGES_H\n" +
"#define __SCRIPTANDLANGUAGES_H\n" +
"\n" +
"/**\n" +
" * \\file\n" +
" * \\internal\n" +
" */\n" +
"\n" +
"#include \"LETypes.h\"\n" +
"#include \"LEScripts.h\"\n" +
"\n" +
"U_NAMESPACE_BEGIN\n";
private static final String hPostamble =
"\n" +
"const LETag nullScriptTag = 0x00000000; /* '' (NULL) */\n" +
"\n" +
"const LETag noLangSysTag = 0x00000000; /* '' (NONE) */\n" +
"\n" +
"U_NAMESPACE_END\n" +
"#endif";
private static final String cppPreamble =
"#include \"LETypes.h\"\n" +
"#include \"ScriptAndLanguageTags.h\"\n" +
"#include \"OpenTypeLayoutEngine.h\"\n" +
"\n" +
"U_NAMESPACE_BEGIN\n" +
"\n" +
"const LETag OpenTypeLayoutEngine::scriptTags[] = {";
private static final String cppPostamble =
"};\n" +
"\n" +
"U_NAMESPACE_END";
}