/* */ package com.ibm.icu.text;
/* */
/* */ import com.ibm.icu.impl.Assert;
/* */ import com.ibm.icu.impl.IntTrieBuilder;
/* */ import com.ibm.icu.impl.TrieBuilder.DataManipulate;
/* */ import java.io.IOException;
/* */ import java.io.OutputStream;
/* */ import java.io.PrintStream;
/* */ import java.util.ArrayList;
/* */ import java.util.List;
/* */
/* */
/* */
/* */
/* */
/* */
/* */
/* */
/* */
/* */
/* */
/* */
/* */
/* */
/* */
/* */
/* */
/* */
/* */ class RBBISetBuilder
/* */ {
/* */ RBBIRuleBuilder fRB;
/* */ RangeDescriptor fRangeList;
/* */ IntTrieBuilder fTrie;
/* */ int fTrieSize;
/* */ int fGroupCount;
/* */ boolean fSawBOF;
/* */
/* */ static class RangeDescriptor
/* */ {
/* */ int fStartChar;
/* */ int fEndChar;
/* */ int fNum;
/* */ List<RBBINode> fIncludesSets;
/* */ RangeDescriptor fNext;
/* */
/* */ RangeDescriptor()
/* */ {
/* 48 */ this.fIncludesSets = new ArrayList();
/* */ }
/* */
/* */ RangeDescriptor(RangeDescriptor other) {
/* 52 */ this.fStartChar = other.fStartChar;
/* 53 */ this.fEndChar = other.fEndChar;
/* 54 */ this.fNum = other.fNum;
/* 55 */ this.fIncludesSets = new ArrayList(other.fIncludesSets);
/* */ }
/* */
/* */
/* */
/* */
/* */
/* */ void split(int where)
/* */ {
/* 64 */ Assert.assrt((where > this.fStartChar) && (where <= this.fEndChar));
/* 65 */ RangeDescriptor nr = new RangeDescriptor(this);
/* */
/* */
/* */
/* 69 */ nr.fStartChar = where;
/* 70 */ this.fEndChar = (where - 1);
/* 71 */ nr.fNext = this.fNext;
/* 72 */ this.fNext = nr;
/* */ }
/* */
/* */
/* */
/* */
/* */
/* */
/* */
/* */
/* */
/* */
/* */
/* */
/* */
/* */
/* */
/* */
/* */
/* */
/* */
/* */
/* */
/* */
/* */
/* */
/* */
/* */ void setDictionaryFlag()
/* */ {
/* 101 */ for (int i = 0; i < this.fIncludesSets.size(); i++) {
/* 102 */ RBBINode usetNode = (RBBINode)this.fIncludesSets.get(i);
/* 103 */ String setName = "";
/* 104 */ RBBINode setRef = usetNode.fParent;
/* 105 */ if (setRef != null) {
/* 106 */ RBBINode varRef = setRef.fParent;
/* 107 */ if ((varRef != null) && (varRef.fType == 2)) {
/* 108 */ setName = varRef.fText;
/* */ }
/* */ }
/* 111 */ if (setName.equals("dictionary")) {
/* 112 */ this.fNum |= 0x4000;
/* 113 */ break;
/* */ }
/* */ }
/* */ }
/* */ }
/* */
/* */
/* */
/* */
/* */
/* */
/* */
/* */
/* */
/* */
/* */
/* */
/* */
/* */
/* */
/* */
/* */
/* */
/* */
/* */
/* */
/* */
/* */
/* */
/* */
/* */ RBBISetBuilder(RBBIRuleBuilder rb)
/* */ {
/* 145 */ this.fRB = rb;
/* */ }
/* */
/* */
/* */
/* */
/* */
/* */
/* */
/* */
/* */
/* */ void build()
/* */ {
/* 158 */ if ((this.fRB.fDebugEnv != null) && (this.fRB.fDebugEnv.indexOf("usets") >= 0)) { printSets();
/* */ }
/* */
/* */
/* */
/* 163 */ this.fRangeList = new RangeDescriptor();
/* 164 */ this.fRangeList.fStartChar = 0;
/* 165 */ this.fRangeList.fEndChar = 1114111;
/* */
/* */
/* */
/* */
/* 170 */ for (RBBINode usetNode : this.fRB.fUSetNodes) {
/* 171 */ UnicodeSet inputSet = usetNode.fInputSet;
/* 172 */ int inputSetRangeCount = inputSet.getRangeCount();
/* 173 */ int inputSetRangeIndex = 0;
/* 174 */ RangeDescriptor rlRange = this.fRangeList;
/* */
/* */
/* 177 */ while (inputSetRangeIndex < inputSetRangeCount)
/* */ {
/* */
/* 180 */ int inputSetRangeBegin = inputSet.getRangeStart(inputSetRangeIndex);
/* 181 */ int inputSetRangeEnd = inputSet.getRangeEnd(inputSetRangeIndex);
/* */
/* */
/* */
/* 185 */ while (rlRange.fEndChar < inputSetRangeBegin) {
/* 186 */ rlRange = rlRange.fNext;
/* */ }
/* */
/* */
/* */
/* */
/* */
/* */
/* */
/* 195 */ if (rlRange.fStartChar < inputSetRangeBegin) {
/* 196 */ rlRange.split(inputSetRangeBegin);
/* */
/* */
/* */
/* */ }
/* */ else
/* */ {
/* */
/* */
/* 205 */ if (rlRange.fEndChar > inputSetRangeEnd) {
/* 206 */ rlRange.split(inputSetRangeEnd + 1);
/* */ }
/* */
/* */
/* */
/* 211 */ if (rlRange.fIncludesSets.indexOf(usetNode) == -1) {
/* 212 */ rlRange.fIncludesSets.add(usetNode);
/* */ }
/* */
/* */
/* 216 */ if (inputSetRangeEnd == rlRange.fEndChar) {
/* 217 */ inputSetRangeIndex++;
/* */ }
/* 219 */ rlRange = rlRange.fNext;
/* */ }
/* */ }
/* */ }
/* 223 */ if ((this.fRB.fDebugEnv != null) && (this.fRB.fDebugEnv.indexOf("range") >= 0)) { printRanges();
/* */ }
/* */
/* */
/* */
/* */
/* */
/* */
/* */
/* */
/* */
/* */
/* */
/* */
/* 237 */ for (RangeDescriptor rlRange = this.fRangeList; rlRange != null; rlRange = rlRange.fNext) {
/* 238 */ for (RangeDescriptor rlSearchRange = this.fRangeList; rlSearchRange != rlRange; rlSearchRange = rlSearchRange.fNext) {
/* 239 */ if (rlRange.fIncludesSets.equals(rlSearchRange.fIncludesSets)) {
/* 240 */ rlRange.fNum = rlSearchRange.fNum;
/* 241 */ break;
/* */ }
/* */ }
/* 244 */ if (rlRange.fNum == 0) {
/* 245 */ this.fGroupCount += 1;
/* 246 */ rlRange.fNum = (this.fGroupCount + 2);
/* 247 */ rlRange.setDictionaryFlag();
/* 248 */ addValToSets(rlRange.fIncludesSets, this.fGroupCount + 2);
/* */ }
/* */ }
/* */
/* */
/* */
/* */
/* */
/* */
/* */
/* */
/* */
/* */
/* */
/* 262 */ String eofString = "eof";
/* 263 */ String bofString = "bof";
/* */
/* 265 */ for (RBBINode usetNode : this.fRB.fUSetNodes) {
/* 266 */ UnicodeSet inputSet = usetNode.fInputSet;
/* 267 */ if (inputSet.contains(eofString)) {
/* 268 */ addValToSet(usetNode, 1);
/* */ }
/* 270 */ if (inputSet.contains(bofString)) {
/* 271 */ addValToSet(usetNode, 2);
/* 272 */ this.fSawBOF = true;
/* */ }
/* */ }
/* */
/* */
/* 277 */ if ((this.fRB.fDebugEnv != null) && (this.fRB.fDebugEnv.indexOf("rgroup") >= 0)) printRangeGroups();
/* 278 */ if ((this.fRB.fDebugEnv != null) && (this.fRB.fDebugEnv.indexOf("esets") >= 0)) { printSets();
/* */ }
/* */
/* */
/* */
/* */
/* */
/* 285 */ this.fTrie = new IntTrieBuilder(null, 100000, 0, 0, true);
/* */
/* */
/* */
/* */
/* */
/* 291 */ for (rlRange = this.fRangeList; rlRange != null; rlRange = rlRange.fNext) {
/* 292 */ this.fTrie.setRange(rlRange.fStartChar, rlRange.fEndChar + 1, rlRange.fNum, true);
/* */ }
/* */ }
/* */
/* */
/* */
/* */
/* */ class RBBIDataManipulate
/* */ implements TrieBuilder.DataManipulate
/* */ {
/* */ RBBIDataManipulate() {}
/* */
/* */
/* */
/* */ public int getFoldedValue(int start, int offset)
/* */ {
/* 308 */ boolean[] inBlockZero = new boolean[1];
/* */
/* 310 */ int limit = start + 1024;
/* 311 */ while (start < limit) {
/* 312 */ int value = RBBISetBuilder.this.fTrie.getValue(start, inBlockZero);
/* 313 */ if (inBlockZero[0] != 0) {
/* 314 */ start += 32;
/* 315 */ } else { if (value != 0) {
/* 316 */ return offset | 0x8000;
/* */ }
/* 318 */ start++;
/* */ }
/* */ }
/* 321 */ return 0;
/* */ } }
/* */
/* 324 */ RBBIDataManipulate dm = new RBBIDataManipulate();
/* */
/* */
/* */
/* */
/* */
/* */ int getTrieSize()
/* */ {
/* 332 */ int size = 0;
/* */
/* */ try
/* */ {
/* 336 */ size = this.fTrie.serialize(null, true, this.dm);
/* */ } catch (IOException e) {
/* 338 */ Assert.assrt(false);
/* */ }
/* 340 */ return size;
/* */ }
/* */
/* */
/* */
/* */
/* */
/* */ void serializeTrie(OutputStream os)
/* */ throws IOException
/* */ {
/* 350 */ this.fTrie.serialize(os, true, this.dm);
/* */ }
/* */
/* */
/* */
/* */
/* */
/* */
/* */
/* */
/* */
/* */
/* */
/* */
/* */
/* */
/* */ void addValToSets(List<RBBINode> sets, int val)
/* */ {
/* 368 */ for (RBBINode usetNode : sets) {
/* 369 */ addValToSet(usetNode, val);
/* */ }
/* */ }
/* */
/* */ void addValToSet(RBBINode usetNode, int val) {
/* 374 */ RBBINode leafNode = new RBBINode(3);
/* 375 */ leafNode.fVal = val;
/* 376 */ if (usetNode.fLeftChild == null) {
/* 377 */ usetNode.fLeftChild = leafNode;
/* 378 */ leafNode.fParent = usetNode;
/* */
/* */ }
/* */ else
/* */ {
/* 383 */ RBBINode orNode = new RBBINode(9);
/* 384 */ orNode.fLeftChild = usetNode.fLeftChild;
/* 385 */ orNode.fRightChild = leafNode;
/* 386 */ orNode.fLeftChild.fParent = orNode;
/* 387 */ orNode.fRightChild.fParent = orNode;
/* 388 */ usetNode.fLeftChild = orNode;
/* 389 */ orNode.fParent = usetNode;
/* */ }
/* */ }
/* */
/* */
/* */
/* */
/* */
/* */
/* */ int getNumCharCategories()
/* */ {
/* 400 */ return this.fGroupCount + 3;
/* */ }
/* */
/* */
/* */
/* */
/* */
/* */
/* */ boolean sawBOF()
/* */ {
/* 410 */ return this.fSawBOF;
/* */ }
/* */
/* */
/* */
/* */
/* */
/* */
/* */
/* */
/* */ int getFirstChar(int category)
/* */ {
/* 422 */ int retVal = -1;
/* 423 */ for (RangeDescriptor rlRange = this.fRangeList; rlRange != null; rlRange = rlRange.fNext) {
/* 424 */ if (rlRange.fNum == category) {
/* 425 */ retVal = rlRange.fStartChar;
/* 426 */ break;
/* */ }
/* */ }
/* 429 */ return retVal;
/* */ }
/* */
/* */
/* */
/* */
/* */
/* */
/* */
/* */
/* */
/* */
/* */
/* */
/* */ void printRanges()
/* */ {
/* 445 */ System.out.print("\n\n Nonoverlapping Ranges ...\n");
/* 446 */ for (RangeDescriptor rlRange = this.fRangeList; rlRange != null; rlRange = rlRange.fNext) {
/* 447 */ System.out.print(" " + rlRange.fNum + " " + rlRange.fStartChar + "-" + rlRange.fEndChar);
/* */
/* 449 */ for (int i = 0; i < rlRange.fIncludesSets.size(); i++) {
/* 450 */ RBBINode usetNode = (RBBINode)rlRange.fIncludesSets.get(i);
/* 451 */ String setName = "anon";
/* 452 */ RBBINode setRef = usetNode.fParent;
/* 453 */ if (setRef != null) {
/* 454 */ RBBINode varRef = setRef.fParent;
/* 455 */ if ((varRef != null) && (varRef.fType == 2)) {
/* 456 */ setName = varRef.fText;
/* */ }
/* */ }
/* 459 */ System.out.print(setName);System.out.print(" ");
/* */ }
/* 461 */ System.out.println("");
/* */ }
/* */ }
/* */
/* */
/* */
/* */
/* */
/* */
/* */
/* */
/* */
/* */
/* */
/* */
/* */ void printRangeGroups()
/* */ {
/* 478 */ int lastPrintedGroupNum = 0;
/* */
/* 480 */ System.out.print("\nRanges grouped by Unicode Set Membership...\n");
/* 481 */ for (RangeDescriptor rlRange = this.fRangeList; rlRange != null; rlRange = rlRange.fNext) {
/* 482 */ int groupNum = rlRange.fNum & 0xBFFF;
/* 483 */ if (groupNum > lastPrintedGroupNum) {
/* 484 */ lastPrintedGroupNum = groupNum;
/* 485 */ if (groupNum < 10) System.out.print(" ");
/* 486 */ System.out.print(groupNum + " ");
/* */
/* 488 */ if ((rlRange.fNum & 0x4000) != 0) { System.out.print(" <DICT> ");
/* */ }
/* 490 */ for (int i = 0; i < rlRange.fIncludesSets.size(); i++) {
/* 491 */ RBBINode usetNode = (RBBINode)rlRange.fIncludesSets.get(i);
/* 492 */ String setName = "anon";
/* 493 */ RBBINode setRef = usetNode.fParent;
/* 494 */ if (setRef != null) {
/* 495 */ RBBINode varRef = setRef.fParent;
/* 496 */ if ((varRef != null) && (varRef.fType == 2)) {
/* 497 */ setName = varRef.fText;
/* */ }
/* */ }
/* 500 */ System.out.print(setName);System.out.print(" ");
/* */ }
/* */
/* 503 */ i = 0;
/* 504 */ for (RangeDescriptor tRange = rlRange; tRange != null; tRange = tRange.fNext) {
/* 505 */ if (tRange.fNum == rlRange.fNum) {
/* 506 */ if (i++ % 5 == 0) {
/* 507 */ System.out.print("\n ");
/* */ }
/* 509 */ RBBINode.printHex(tRange.fStartChar, -1);
/* 510 */ System.out.print("-");
/* 511 */ RBBINode.printHex(tRange.fEndChar, 0);
/* */ }
/* */ }
/* 514 */ System.out.print("\n");
/* */ }
/* */ }
/* 517 */ System.out.print("\n");
/* */ }
/* */
/* */
/* */
/* */
/* */
/* */
/* */
/* */
/* */
/* */
/* */ void printSets()
/* */ {
/* 531 */ System.out.print("\n\nUnicode Sets List\n------------------\n");
/* 532 */ for (int i = 0; i < this.fRB.fUSetNodes.size(); i++)
/* */ {
/* */
/* */
/* */
/* */
/* 538 */ RBBINode usetNode = (RBBINode)this.fRB.fUSetNodes.get(i);
/* */
/* */
/* 541 */ RBBINode.printInt(2, i);
/* 542 */ String setName = "anonymous";
/* 543 */ RBBINode setRef = usetNode.fParent;
/* 544 */ if (setRef != null) {
/* 545 */ RBBINode varRef = setRef.fParent;
/* 546 */ if ((varRef != null) && (varRef.fType == 2)) {
/* 547 */ setName = varRef.fText;
/* */ }
/* */ }
/* 550 */ System.out.print(" " + setName);
/* 551 */ System.out.print(" ");
/* 552 */ System.out.print(usetNode.fText);
/* 553 */ System.out.print("\n");
/* 554 */ if (usetNode.fLeftChild != null) {
/* 555 */ usetNode.fLeftChild.printTree(true);
/* */ }
/* */ }
/* 558 */ System.out.print("\n");
/* */ }
/* */ }
/* Location: C:\Users\Ethan\Desktop\FontZip\FontTool\sfnttool.jar!\com\ibm\icu\text\RBBISetBuilder.class
* Java compiler version: 5 (49.0)
* JD-Core Version: 0.7.1
*/