home *** CD-ROM | disk | FTP | other *** search
/ Cre@te Online 2000 December / Cre@teOnline CD05.iso / MacSoft / XML ConsoleMax.sea / XML ConsoleMax / Required / xml4j.jar / com / ibm / xml / internal / DefaultStringPool.class (.txt) < prev    next >
Encoding:
Java Class File  |  1999-08-30  |  4.8 KB  |  437 lines

  1. package com.ibm.xml.internal;
  2.  
  3. import com.ibm.xml.framework.ParserState;
  4. import com.ibm.xml.framework.StringPool;
  5. import com.ibm.xml.framework.StringProducer;
  6.  
  7. public final class DefaultStringPool implements StringPool {
  8.    private static final int INITIAL_CHUNK_SHIFT = 5;
  9.    private static final int INITIAL_CHUNK_SIZE = 32;
  10.    private static final int CHUNK_SHIFT = 10;
  11.    private static final int CHUNK_SIZE = 1024;
  12.    private static final int CHUNK_MASK = 1023;
  13.    private static final int INITIAL_CHUNK_COUNT = 32;
  14.    private ParserState fParserState;
  15.    private int fStringCount;
  16.    private int fNullString;
  17.    private int fStringFreeList = -1;
  18.    private String[][] fString = new String[32][];
  19.    private StringProducer[][] fStringProducer = new StringProducer[32][];
  20.    private int[][] fOffset = new int[32][];
  21.    private int[][] fLength = new int[32][];
  22.    private int fStringListCount;
  23.    private int fActiveStringList = -1;
  24.    private int[][] fStringList = new int[32][];
  25.    private static final int INITIAL_BUCKET_SIZE = 4;
  26.    private static final int HASHTABLE_SIZE = 128;
  27.    private int[][] fSymbolTable = new int[128][];
  28.  
  29.    public DefaultStringPool(ParserState var1) {
  30.       this.fParserState = var1;
  31.       this.fNullString = this.addSymbol("");
  32.    }
  33.  
  34.    public void reset(ParserState var1) {
  35.       this.fParserState = var1;
  36.       int var2 = 0;
  37.       int var3 = 0;
  38.  
  39.       for(int var4 = 0; var4 < this.fStringCount; ++var4) {
  40.          this.fString[var2][var3] = null;
  41.          this.fStringProducer[var2][var3] = null;
  42.          ++var3;
  43.          if (var3 == 1024) {
  44.             ++var2;
  45.             var3 = 0;
  46.          }
  47.       }
  48.  
  49.       for(int var5 = 0; var5 < 128; ++var5) {
  50.          this.fSymbolTable[var5] = null;
  51.       }
  52.  
  53.       this.fStringCount = 0;
  54.       this.fStringFreeList = -1;
  55.       this.fStringListCount = 0;
  56.       this.fActiveStringList = -1;
  57.       this.fNullString = this.addSymbol("");
  58.    }
  59.  
  60.    public StringPool resetOrCopy(ParserState var1) {
  61.       return new DefaultStringPool(var1);
  62.    }
  63.  
  64.    private boolean ensureCapacity(int var1, int var2) {
  65.       try {
  66.          if (this.fOffset[var1][var2] != 0) {
  67.             return false;
  68.          }
  69.  
  70.          return true;
  71.       } catch (ArrayIndexOutOfBoundsException var6) {
  72.          if (var2 != 0) {
  73.             String[] var8 = new String[var2 * 2];
  74.             System.arraycopy(this.fString[var1], 0, var8, 0, var2);
  75.             this.fString[var1] = var8;
  76.             StringProducer[] var9 = new StringProducer[var2 * 2];
  77.             System.arraycopy(this.fStringProducer[var1], 0, var9, 0, var2);
  78.             this.fStringProducer[var1] = var9;
  79.             int[] var11 = new int[var2 * 2];
  80.             System.arraycopy(this.fOffset[var1], 0, var11, 0, var2);
  81.             this.fOffset[var1] = var11;
  82.             var11 = new int[var2 * 2];
  83.             System.arraycopy(this.fLength[var1], 0, var11, 0, var2);
  84.             this.fLength[var1] = var11;
  85.             return true;
  86.          }
  87.  
  88.          String[][] var3 = new String[var1 * 2][];
  89.          System.arraycopy(this.fString, 0, var3, 0, var1);
  90.          this.fString = var3;
  91.          StringProducer[][] var4 = new StringProducer[var1 * 2][];
  92.          System.arraycopy(this.fStringProducer, 0, var4, 0, var1);
  93.          this.fStringProducer = var4;
  94.          int[][] var5 = new int[var1 * 2][];
  95.          System.arraycopy(this.fOffset, 0, var5, 0, var1);
  96.          this.fOffset = var5;
  97.          var5 = new int[var1 * 2][];
  98.          System.arraycopy(this.fLength, 0, var5, 0, var1);
  99.          this.fLength = var5;
  100.       } catch (NullPointerException var7) {
  101.       }
  102.  
  103.       this.fString[var1] = new String[32];
  104.       this.fStringProducer[var1] = new StringProducer[32];
  105.       this.fOffset[var1] = new int[32];
  106.       this.fLength[var1] = new int[32];
  107.       return true;
  108.    }
  109.  
  110.    public int addString(String var1) {
  111.       int var2;
  112.       int var3;
  113.       int var4;
  114.       if (this.fStringFreeList != -1) {
  115.          var4 = this.fStringFreeList;
  116.          var2 = var4 >> 10;
  117.          var3 = var4 & 1023;
  118.          this.fStringFreeList = this.fOffset[var2][var3];
  119.       } else {
  120.          var4 = this.fStringCount++;
  121.          var2 = var4 >> 10;
  122.          var3 = var4 & 1023;
  123.          this.ensureCapacity(var2, var3);
  124.       }
  125.  
  126.       this.fString[var2][var3] = var1;
  127.       this.fStringProducer[var2][var3] = null;
  128.       this.fOffset[var2][var3] = 0;
  129.       this.fLength[var2][var3] = var1.length();
  130.       return var4;
  131.    }
  132.  
  133.    public int addString(StringProducer var1, int var2, int var3) {
  134.       int var4;
  135.       int var5;
  136.       int var6;
  137.       if (this.fStringFreeList != -1) {
  138.          var6 = this.fStringFreeList;
  139.          var4 = var6 >> 10;
  140.          var5 = var6 & 1023;
  141.          this.fStringFreeList = this.fOffset[var4][var5];
  142.       } else {
  143.          var6 = this.fStringCount++;
  144.          var4 = var6 >> 10;
  145.          var5 = var6 & 1023;
  146.          this.ensureCapacity(var4, var5);
  147.       }
  148.  
  149.       this.fString[var4][var5] = null;
  150.       this.fStringProducer[var4][var5] = var1;
  151.       this.fOffset[var4][var5] = var2;
  152.       this.fLength[var4][var5] = var3;
  153.       return var6;
  154.    }
  155.  
  156.    private void hashSymbol(int[] var1, int var2, int var3, int var4) {
  157.       if (var1 == null) {
  158.          var1 = new int[13];
  159.          var1[0] = 1;
  160.          var1[1] = var2;
  161.          var1[2] = var3;
  162.          var1[3] = var4;
  163.          int var12 = var2 % 128;
  164.          this.fSymbolTable[var12] = var1;
  165.       } else {
  166.          int var5 = var1[0];
  167.          int var6 = 1 + var5 * 3;
  168.          if (var6 == var1.length) {
  169.             int var7 = var5 + 4;
  170.             int[] var8 = new int[1 + var7 * 3];
  171.             System.arraycopy(var1, 0, var8, 0, var6);
  172.             var1 = var8;
  173.             int var9 = var2 % 128;
  174.             this.fSymbolTable[var9] = var8;
  175.          }
  176.  
  177.          var1[var6++] = var2;
  178.          var1[var6++] = var3;
  179.          var1[var6++] = var4;
  180.          ++var5;
  181.          var1[0] = var5;
  182.       }
  183.    }
  184.  
  185.    public int addSymbol(String var1) {
  186.       int var2 = var1.length();
  187.       int var3 = StringHasher.hashString(var1, var2);
  188.       int var4 = var3 % 128;
  189.       int[] var5 = this.fSymbolTable[var4];
  190.       if (var5 != null) {
  191.          int var6 = 1;
  192.  
  193.          for(int var7 = 0; var7 < var5[0]; ++var7) {
  194.             if (var5[var6] == var3) {
  195.                int var8 = var5[var6 + 1];
  196.                int var9 = var5[var6 + 2];
  197.                if (var1.equals(this.fString[var8][var9])) {
  198.                   return (var8 << 10) + var9;
  199.                }
  200.             }
  201.  
  202.             var6 += 3;
  203.          }
  204.       }
  205.  
  206.       int var10;
  207.       int var11;
  208.       int var12;
  209.       if (this.fStringFreeList != -1) {
  210.          var12 = this.fStringFreeList;
  211.          var10 = var12 >> 10;
  212.          var11 = var12 & 1023;
  213.          this.fStringFreeList = this.fOffset[var10][var11];
  214.       } else {
  215.          var12 = this.fStringCount++;
  216.          var10 = var12 >> 10;
  217.          var11 = var12 & 1023;
  218.          this.ensureCapacity(var10, var11);
  219.       }
  220.  
  221.       this.fString[var10][var11] = var1;
  222.       this.fStringProducer[var10][var11] = null;
  223.       this.fOffset[var10][var11] = -1;
  224.       this.fLength[var10][var11] = var2;
  225.       this.hashSymbol(var5, var3, var10, var11);
  226.       return var12;
  227.    }
  228.  
  229.    public int addSymbol(StringProducer var1, int var2, int var3, int var4) {
  230.       int var5 = var4 % 128;
  231.       int[] var6 = this.fSymbolTable[var5];
  232.       if (var6 != null) {
  233.          int var7 = 1;
  234.  
  235.          for(int var8 = 0; var8 < var6[0]; ++var8) {
  236.             if (var6[var7] == var4) {
  237.                int var9 = var6[var7 + 1];
  238.                int var10 = var6[var7 + 2];
  239.                if (var1.equalsString(var2, var3, this.fString[var9][var10], this.fLength[var9][var10])) {
  240.                   return (var9 << 10) + var10;
  241.                }
  242.             }
  243.  
  244.             var7 += 3;
  245.          }
  246.       }
  247.  
  248.       int var11;
  249.       int var12;
  250.       int var13;
  251.       if (this.fStringFreeList != -1) {
  252.          var13 = this.fStringFreeList;
  253.          var11 = var13 >> 10;
  254.          var12 = var13 & 1023;
  255.          this.fStringFreeList = this.fOffset[var11][var12];
  256.       } else {
  257.          var13 = this.fStringCount++;
  258.          var11 = var13 >> 10;
  259.          var12 = var13 & 1023;
  260.          this.ensureCapacity(var11, var12);
  261.       }
  262.  
  263.       String var14 = var1.toString(var2, var3);
  264.       this.fString[var11][var12] = var14;
  265.       this.fStringProducer[var11][var12] = null;
  266.       this.fOffset[var11][var12] = -1;
  267.       this.fLength[var11][var12] = var14.length();
  268.       this.hashSymbol(var6, var4, var11, var12);
  269.       return var13;
  270.    }
  271.  
  272.    private boolean ensureListCapacity(int var1, int var2) {
  273.       try {
  274.          if (this.fStringList[var1][var2] != 0) {
  275.             return false;
  276.          }
  277.  
  278.          return true;
  279.       } catch (ArrayIndexOutOfBoundsException var4) {
  280.          if (var2 != 0) {
  281.             int[] var6 = new int[var2 * 2];
  282.             System.arraycopy(this.fStringList[var1], 0, var6, 0, var2);
  283.             this.fStringList[var1] = var6;
  284.             return true;
  285.          }
  286.  
  287.          int[][] var3 = new int[var1 * 2][];
  288.          System.arraycopy(this.fStringList, 0, var3, 0, var1);
  289.          this.fStringList = var3;
  290.       } catch (NullPointerException var5) {
  291.       }
  292.  
  293.       this.fStringList[var1] = new int[32];
  294.       return true;
  295.    }
  296.  
  297.    public int startStringList() {
  298.       this.fActiveStringList = this.fStringListCount;
  299.       return this.fStringListCount;
  300.    }
  301.  
  302.    public boolean addStringToList(int var1, int var2) {
  303.       if (var2 != -1 && var1 == this.fActiveStringList) {
  304.          int var3 = this.fStringListCount >> 10;
  305.          int var4 = this.fStringListCount & 1023;
  306.          this.ensureListCapacity(var3, var4);
  307.          this.fStringList[var3][var4] = var2;
  308.          ++this.fStringListCount;
  309.          return true;
  310.       } else {
  311.          return false;
  312.       }
  313.    }
  314.  
  315.    public void finishStringList(int var1) {
  316.       if (var1 == this.fActiveStringList) {
  317.          int var2 = this.fStringListCount >> 10;
  318.          int var3 = this.fStringListCount & 1023;
  319.          this.ensureListCapacity(var2, var3);
  320.          this.fStringList[var2][var3] = -1;
  321.          this.fActiveStringList = -1;
  322.          ++this.fStringListCount;
  323.       }
  324.    }
  325.  
  326.    public int stringListLength(int var1) {
  327.       int var2 = var1 >> 10;
  328.       int var3 = var1 & 1023;
  329.       int var4 = 0;
  330.  
  331.       while(this.fStringList[var2][var3] != -1) {
  332.          ++var4;
  333.          ++var3;
  334.          if (var3 == 1024) {
  335.             ++var2;
  336.             var3 = 0;
  337.          }
  338.       }
  339.  
  340.       return var4;
  341.    }
  342.  
  343.    public boolean stringInList(int var1, int var2) {
  344.       int var3 = var1 >> 10;
  345.       int var4 = var1 & 1023;
  346.  
  347.       while(this.fStringList[var3][var4] != var2) {
  348.          if (this.fStringList[var3][var4] == -1) {
  349.             return false;
  350.          }
  351.  
  352.          ++var4;
  353.          if (var4 == 1024) {
  354.             ++var3;
  355.             var4 = 0;
  356.          }
  357.       }
  358.  
  359.       return true;
  360.    }
  361.  
  362.    public int[] stringsInList(int var1) {
  363.       int var2 = var1 >> 10;
  364.       int var3 = var1 & 1023;
  365.       int[] var4 = new int[this.stringListLength(var1)];
  366.       int var5 = 0;
  367.  
  368.       while(this.fStringList[var2][var3] != -1 && var5 < var4.length) {
  369.          var4[var5] = this.fStringList[var2][var3];
  370.          ++var5;
  371.          ++var3;
  372.          if (var3 == 1024) {
  373.             ++var2;
  374.             var3 = 0;
  375.          }
  376.       }
  377.  
  378.       return var4;
  379.    }
  380.  
  381.    private void releaseStringInternal(int var1, int var2) {
  382.       this.fString[var1][var2] = null;
  383.       this.fStringProducer[var1][var2] = null;
  384.       this.fLength[var1][var2] = 0;
  385.       this.fOffset[var1][var2] = this.fStringFreeList;
  386.       int var3 = (var1 << 10) + var2;
  387.       this.fStringFreeList = var3;
  388.    }
  389.  
  390.    public void releaseString(int var1) {
  391.       if (var1 >= 0 && var1 < this.fStringCount) {
  392.          int var2 = var1 >> 10;
  393.          int var3 = var1 & 1023;
  394.          if (this.fOffset[var2][var3] != -1) {
  395.             this.releaseStringInternal(var2, var3);
  396.          }
  397.  
  398.       }
  399.    }
  400.  
  401.    public String toString(int var1) {
  402.       if (var1 >= 0 && var1 < this.fStringCount) {
  403.          int var2 = var1 >> 10;
  404.          int var3 = var1 & 1023;
  405.          String var4 = this.fString[var2][var3];
  406.          if (var4 != null) {
  407.             return var4;
  408.          } else {
  409.             var4 = this.fStringProducer[var2][var3].toString(this.fOffset[var2][var3], this.fLength[var2][var3]);
  410.             this.fString[var2][var3] = var4;
  411.             this.fStringProducer[var2][var3] = null;
  412.             return var4;
  413.          }
  414.       } else {
  415.          return null;
  416.       }
  417.    }
  418.  
  419.    public String orphanString(int var1) {
  420.       if (var1 >= 0 && var1 < this.fStringCount) {
  421.          int var2 = var1 >> 10;
  422.          int var3 = var1 & 1023;
  423.          String var4 = this.fString[var2][var3];
  424.          if (var4 == null) {
  425.             var4 = this.fStringProducer[var2][var3].toString(this.fOffset[var2][var3], this.fLength[var2][var3]);
  426.             this.releaseStringInternal(var2, var3);
  427.          } else if (this.fOffset[var2][var3] != -1) {
  428.             this.releaseStringInternal(var2, var3);
  429.          }
  430.  
  431.          return var4;
  432.       } else {
  433.          return null;
  434.       }
  435.    }
  436. }
  437.