home *** CD-ROM | disk | FTP | other *** search
- package com.ibm.xml.internal;
-
- import com.ibm.xml.framework.ParserState;
- import com.ibm.xml.framework.StringPool;
- import com.ibm.xml.framework.StringProducer;
-
- public final class DefaultStringPool implements StringPool {
- private static final int INITIAL_CHUNK_SHIFT = 5;
- private static final int INITIAL_CHUNK_SIZE = 32;
- private static final int CHUNK_SHIFT = 10;
- private static final int CHUNK_SIZE = 1024;
- private static final int CHUNK_MASK = 1023;
- private static final int INITIAL_CHUNK_COUNT = 32;
- private ParserState fParserState;
- private int fStringCount;
- private int fNullString;
- private int fStringFreeList = -1;
- private String[][] fString = new String[32][];
- private StringProducer[][] fStringProducer = new StringProducer[32][];
- private int[][] fOffset = new int[32][];
- private int[][] fLength = new int[32][];
- private int fStringListCount;
- private int fActiveStringList = -1;
- private int[][] fStringList = new int[32][];
- private static final int INITIAL_BUCKET_SIZE = 4;
- private static final int HASHTABLE_SIZE = 128;
- private int[][] fSymbolTable = new int[128][];
-
- public DefaultStringPool(ParserState var1) {
- this.fParserState = var1;
- this.fNullString = this.addSymbol("");
- }
-
- public void reset(ParserState var1) {
- this.fParserState = var1;
- int var2 = 0;
- int var3 = 0;
-
- for(int var4 = 0; var4 < this.fStringCount; ++var4) {
- this.fString[var2][var3] = null;
- this.fStringProducer[var2][var3] = null;
- ++var3;
- if (var3 == 1024) {
- ++var2;
- var3 = 0;
- }
- }
-
- for(int var5 = 0; var5 < 128; ++var5) {
- this.fSymbolTable[var5] = null;
- }
-
- this.fStringCount = 0;
- this.fStringFreeList = -1;
- this.fStringListCount = 0;
- this.fActiveStringList = -1;
- this.fNullString = this.addSymbol("");
- }
-
- public StringPool resetOrCopy(ParserState var1) {
- return new DefaultStringPool(var1);
- }
-
- private boolean ensureCapacity(int var1, int var2) {
- try {
- if (this.fOffset[var1][var2] != 0) {
- return false;
- }
-
- return true;
- } catch (ArrayIndexOutOfBoundsException var6) {
- if (var2 != 0) {
- String[] var8 = new String[var2 * 2];
- System.arraycopy(this.fString[var1], 0, var8, 0, var2);
- this.fString[var1] = var8;
- StringProducer[] var9 = new StringProducer[var2 * 2];
- System.arraycopy(this.fStringProducer[var1], 0, var9, 0, var2);
- this.fStringProducer[var1] = var9;
- int[] var11 = new int[var2 * 2];
- System.arraycopy(this.fOffset[var1], 0, var11, 0, var2);
- this.fOffset[var1] = var11;
- var11 = new int[var2 * 2];
- System.arraycopy(this.fLength[var1], 0, var11, 0, var2);
- this.fLength[var1] = var11;
- return true;
- }
-
- String[][] var3 = new String[var1 * 2][];
- System.arraycopy(this.fString, 0, var3, 0, var1);
- this.fString = var3;
- StringProducer[][] var4 = new StringProducer[var1 * 2][];
- System.arraycopy(this.fStringProducer, 0, var4, 0, var1);
- this.fStringProducer = var4;
- int[][] var5 = new int[var1 * 2][];
- System.arraycopy(this.fOffset, 0, var5, 0, var1);
- this.fOffset = var5;
- var5 = new int[var1 * 2][];
- System.arraycopy(this.fLength, 0, var5, 0, var1);
- this.fLength = var5;
- } catch (NullPointerException var7) {
- }
-
- this.fString[var1] = new String[32];
- this.fStringProducer[var1] = new StringProducer[32];
- this.fOffset[var1] = new int[32];
- this.fLength[var1] = new int[32];
- return true;
- }
-
- public int addString(String var1) {
- int var2;
- int var3;
- int var4;
- if (this.fStringFreeList != -1) {
- var4 = this.fStringFreeList;
- var2 = var4 >> 10;
- var3 = var4 & 1023;
- this.fStringFreeList = this.fOffset[var2][var3];
- } else {
- var4 = this.fStringCount++;
- var2 = var4 >> 10;
- var3 = var4 & 1023;
- this.ensureCapacity(var2, var3);
- }
-
- this.fString[var2][var3] = var1;
- this.fStringProducer[var2][var3] = null;
- this.fOffset[var2][var3] = 0;
- this.fLength[var2][var3] = var1.length();
- return var4;
- }
-
- public int addString(StringProducer var1, int var2, int var3) {
- int var4;
- int var5;
- int var6;
- if (this.fStringFreeList != -1) {
- var6 = this.fStringFreeList;
- var4 = var6 >> 10;
- var5 = var6 & 1023;
- this.fStringFreeList = this.fOffset[var4][var5];
- } else {
- var6 = this.fStringCount++;
- var4 = var6 >> 10;
- var5 = var6 & 1023;
- this.ensureCapacity(var4, var5);
- }
-
- this.fString[var4][var5] = null;
- this.fStringProducer[var4][var5] = var1;
- this.fOffset[var4][var5] = var2;
- this.fLength[var4][var5] = var3;
- return var6;
- }
-
- private void hashSymbol(int[] var1, int var2, int var3, int var4) {
- if (var1 == null) {
- var1 = new int[13];
- var1[0] = 1;
- var1[1] = var2;
- var1[2] = var3;
- var1[3] = var4;
- int var12 = var2 % 128;
- this.fSymbolTable[var12] = var1;
- } else {
- int var5 = var1[0];
- int var6 = 1 + var5 * 3;
- if (var6 == var1.length) {
- int var7 = var5 + 4;
- int[] var8 = new int[1 + var7 * 3];
- System.arraycopy(var1, 0, var8, 0, var6);
- var1 = var8;
- int var9 = var2 % 128;
- this.fSymbolTable[var9] = var8;
- }
-
- var1[var6++] = var2;
- var1[var6++] = var3;
- var1[var6++] = var4;
- ++var5;
- var1[0] = var5;
- }
- }
-
- public int addSymbol(String var1) {
- int var2 = var1.length();
- int var3 = StringHasher.hashString(var1, var2);
- int var4 = var3 % 128;
- int[] var5 = this.fSymbolTable[var4];
- if (var5 != null) {
- int var6 = 1;
-
- for(int var7 = 0; var7 < var5[0]; ++var7) {
- if (var5[var6] == var3) {
- int var8 = var5[var6 + 1];
- int var9 = var5[var6 + 2];
- if (var1.equals(this.fString[var8][var9])) {
- return (var8 << 10) + var9;
- }
- }
-
- var6 += 3;
- }
- }
-
- int var10;
- int var11;
- int var12;
- if (this.fStringFreeList != -1) {
- var12 = this.fStringFreeList;
- var10 = var12 >> 10;
- var11 = var12 & 1023;
- this.fStringFreeList = this.fOffset[var10][var11];
- } else {
- var12 = this.fStringCount++;
- var10 = var12 >> 10;
- var11 = var12 & 1023;
- this.ensureCapacity(var10, var11);
- }
-
- this.fString[var10][var11] = var1;
- this.fStringProducer[var10][var11] = null;
- this.fOffset[var10][var11] = -1;
- this.fLength[var10][var11] = var2;
- this.hashSymbol(var5, var3, var10, var11);
- return var12;
- }
-
- public int addSymbol(StringProducer var1, int var2, int var3, int var4) {
- int var5 = var4 % 128;
- int[] var6 = this.fSymbolTable[var5];
- if (var6 != null) {
- int var7 = 1;
-
- for(int var8 = 0; var8 < var6[0]; ++var8) {
- if (var6[var7] == var4) {
- int var9 = var6[var7 + 1];
- int var10 = var6[var7 + 2];
- if (var1.equalsString(var2, var3, this.fString[var9][var10], this.fLength[var9][var10])) {
- return (var9 << 10) + var10;
- }
- }
-
- var7 += 3;
- }
- }
-
- int var11;
- int var12;
- int var13;
- if (this.fStringFreeList != -1) {
- var13 = this.fStringFreeList;
- var11 = var13 >> 10;
- var12 = var13 & 1023;
- this.fStringFreeList = this.fOffset[var11][var12];
- } else {
- var13 = this.fStringCount++;
- var11 = var13 >> 10;
- var12 = var13 & 1023;
- this.ensureCapacity(var11, var12);
- }
-
- String var14 = var1.toString(var2, var3);
- this.fString[var11][var12] = var14;
- this.fStringProducer[var11][var12] = null;
- this.fOffset[var11][var12] = -1;
- this.fLength[var11][var12] = var14.length();
- this.hashSymbol(var6, var4, var11, var12);
- return var13;
- }
-
- private boolean ensureListCapacity(int var1, int var2) {
- try {
- if (this.fStringList[var1][var2] != 0) {
- return false;
- }
-
- return true;
- } catch (ArrayIndexOutOfBoundsException var4) {
- if (var2 != 0) {
- int[] var6 = new int[var2 * 2];
- System.arraycopy(this.fStringList[var1], 0, var6, 0, var2);
- this.fStringList[var1] = var6;
- return true;
- }
-
- int[][] var3 = new int[var1 * 2][];
- System.arraycopy(this.fStringList, 0, var3, 0, var1);
- this.fStringList = var3;
- } catch (NullPointerException var5) {
- }
-
- this.fStringList[var1] = new int[32];
- return true;
- }
-
- public int startStringList() {
- this.fActiveStringList = this.fStringListCount;
- return this.fStringListCount;
- }
-
- public boolean addStringToList(int var1, int var2) {
- if (var2 != -1 && var1 == this.fActiveStringList) {
- int var3 = this.fStringListCount >> 10;
- int var4 = this.fStringListCount & 1023;
- this.ensureListCapacity(var3, var4);
- this.fStringList[var3][var4] = var2;
- ++this.fStringListCount;
- return true;
- } else {
- return false;
- }
- }
-
- public void finishStringList(int var1) {
- if (var1 == this.fActiveStringList) {
- int var2 = this.fStringListCount >> 10;
- int var3 = this.fStringListCount & 1023;
- this.ensureListCapacity(var2, var3);
- this.fStringList[var2][var3] = -1;
- this.fActiveStringList = -1;
- ++this.fStringListCount;
- }
- }
-
- public int stringListLength(int var1) {
- int var2 = var1 >> 10;
- int var3 = var1 & 1023;
- int var4 = 0;
-
- while(this.fStringList[var2][var3] != -1) {
- ++var4;
- ++var3;
- if (var3 == 1024) {
- ++var2;
- var3 = 0;
- }
- }
-
- return var4;
- }
-
- public boolean stringInList(int var1, int var2) {
- int var3 = var1 >> 10;
- int var4 = var1 & 1023;
-
- while(this.fStringList[var3][var4] != var2) {
- if (this.fStringList[var3][var4] == -1) {
- return false;
- }
-
- ++var4;
- if (var4 == 1024) {
- ++var3;
- var4 = 0;
- }
- }
-
- return true;
- }
-
- public int[] stringsInList(int var1) {
- int var2 = var1 >> 10;
- int var3 = var1 & 1023;
- int[] var4 = new int[this.stringListLength(var1)];
- int var5 = 0;
-
- while(this.fStringList[var2][var3] != -1 && var5 < var4.length) {
- var4[var5] = this.fStringList[var2][var3];
- ++var5;
- ++var3;
- if (var3 == 1024) {
- ++var2;
- var3 = 0;
- }
- }
-
- return var4;
- }
-
- private void releaseStringInternal(int var1, int var2) {
- this.fString[var1][var2] = null;
- this.fStringProducer[var1][var2] = null;
- this.fLength[var1][var2] = 0;
- this.fOffset[var1][var2] = this.fStringFreeList;
- int var3 = (var1 << 10) + var2;
- this.fStringFreeList = var3;
- }
-
- public void releaseString(int var1) {
- if (var1 >= 0 && var1 < this.fStringCount) {
- int var2 = var1 >> 10;
- int var3 = var1 & 1023;
- if (this.fOffset[var2][var3] != -1) {
- this.releaseStringInternal(var2, var3);
- }
-
- }
- }
-
- public String toString(int var1) {
- if (var1 >= 0 && var1 < this.fStringCount) {
- int var2 = var1 >> 10;
- int var3 = var1 & 1023;
- String var4 = this.fString[var2][var3];
- if (var4 != null) {
- return var4;
- } else {
- var4 = this.fStringProducer[var2][var3].toString(this.fOffset[var2][var3], this.fLength[var2][var3]);
- this.fString[var2][var3] = var4;
- this.fStringProducer[var2][var3] = null;
- return var4;
- }
- } else {
- return null;
- }
- }
-
- public String orphanString(int var1) {
- if (var1 >= 0 && var1 < this.fStringCount) {
- int var2 = var1 >> 10;
- int var3 = var1 & 1023;
- String var4 = this.fString[var2][var3];
- if (var4 == null) {
- var4 = this.fStringProducer[var2][var3].toString(this.fOffset[var2][var3], this.fLength[var2][var3]);
- this.releaseStringInternal(var2, var3);
- } else if (this.fOffset[var2][var3] != -1) {
- this.releaseStringInternal(var2, var3);
- }
-
- return var4;
- } else {
- return null;
- }
- }
- }
-