home *** CD-ROM | disk | FTP | other *** search
- package java.text;
-
- final class CompactStringArray implements Cloneable {
- public static final int UNICODECOUNT = 65536;
- private static final int DEBUGSHOWOVERLAPLIMIT = 100;
- private static final boolean DEBUGTRACE = false;
- private static final boolean DEBUGSMALL = false;
- private static final boolean DEBUGOVERLAP = false;
- private static final int DEBUGSMALLLIMIT = 30000;
- private static final int BLOCKSHIFT = 7;
- private static final int BLOCKCOUNT = 128;
- private static final int INDEXSHIFT = 9;
- private static final int INDEXCOUNT = 512;
- private static final int BLOCKMASK = 127;
- private char[] values;
- private short[] indices;
- private StringBuffer exceptions;
- private boolean isCompact;
-
- public CompactStringArray() {
- this("");
- }
-
- public CompactStringArray(String var1) {
- this.exceptions = new StringBuffer();
- this.values = new char[65536];
- this.indices = new short[512];
- this.setElementAt('\u0000', '\uffff', var1);
-
- for(int var2 = 0; var2 < 512; ++var2) {
- this.indices[var2] = (short)(var2 << 7);
- }
-
- this.isCompact = false;
- }
-
- public CompactStringArray(short[] var1, char[] var2, String var3) {
- this.exceptions = new StringBuffer();
- if (var1.length != 512) {
- throw new IllegalArgumentException("Index out of bounds.");
- } else {
- for(int var4 = 0; var4 < 512; ++var4) {
- short var5 = var1[var4];
- if (var5 < 0 || var5 >= var2.length + 128) {
- throw new IllegalArgumentException("Index out of bounds.");
- }
- }
-
- this.indices = var1;
- this.values = var2;
- }
- }
-
- public void elementAt(char var1, StringBuffer var2) {
- char var3 = this.values[(this.indices[var1 >> 7] & '\uffff') + (var1 & 127)];
- if (var3 >= '\ue000' && var3 <= '\uf800') {
- int var4 = var3 - '\ue000';
-
- while(true) {
- var3 = this.exceptions.charAt(var4);
- if (var3 == '\uffff') {
- return;
- }
-
- var2.append(var3);
- ++var4;
- }
- } else {
- var2.append(var3);
- }
- }
-
- public String elementAt(char var1) {
- StringBuffer var2 = new StringBuffer();
- this.elementAt(var1, var2);
- return var2.toString();
- }
-
- public void setElementAt(char var1, String var2) {
- if (this.isCompact) {
- this.expand();
- }
-
- if (var2.length() == 1) {
- char var3 = var2.charAt(0);
- if (var3 < '\ue000' || var3 >= '\uf800') {
- this.values[var1] = var3;
- return;
- }
- }
-
- String var6 = var2 + '\uffff';
- int var4 = this.exceptions.toString().indexOf(var6);
- if (var4 != -1) {
- this.values[var1] = (char)('\ue000' + var4);
- } else {
- this.values[var1] = (char)('\ue000' + this.exceptions.length());
-
- for(int var5 = 0; var5 < var2.length(); ++var5) {
- this.exceptions.append(var2.charAt(var5));
- }
-
- this.exceptions.append('\uffff');
- }
- }
-
- public void setElementAt(char var1, char var2, String var3) {
- if (var1 < var2) {
- this.setElementAt(var1, var3);
- char var4 = this.values[var1];
-
- for(int var5 = var1 + 1; var5 <= var2; ++var5) {
- this.values[var5] = var4;
- }
-
- }
- }
-
- public void compact() {
- if (!this.isCompact) {
- char[] var1 = new char[65536];
- int var2 = 128;
-
- for(short var5 = 0; var5 < 128; ++var5) {
- var1[var5] = (char)var5;
- }
-
- this.indices[0] = 0;
-
- for(short var4 = 1; var4 < 512; ++var4) {
- int var8 = var4 << 7;
- int var7 = this.FindOverlappingPosition(var8, var1, var2);
- int var6 = var7 + 128;
- if (var6 > var2) {
- for(short var9 = (short)var2; var9 < var6; ++var9) {
- var1[var9] = (char)(var9 - var7 + var8);
- }
-
- var2 = var6;
- }
-
- this.indices[var4] = (short)var7;
- }
-
- char[] var3 = new char[var2];
-
- for(short var10 = 0; var10 < var2; ++var10) {
- var3[var10] = this.values[var1[var10]];
- }
-
- this.values = null;
- this.values = var3;
- this.isCompact = true;
- }
-
- }
-
- public short[] getIndexArray() {
- return this.indices;
- }
-
- public char[] getStringArray() {
- return this.values;
- }
-
- public Object clone() {
- try {
- CompactStringArray var1 = (CompactStringArray)super.clone();
- var1.values = (char[])this.values.clone();
- var1.indices = (short[])this.indices.clone();
- var1.exceptions = new StringBuffer(this.exceptions.toString());
- return var1;
- } catch (CloneNotSupportedException var2) {
- throw new InternalError();
- }
- }
-
- public boolean equals(Object var1) {
- if (var1 == null) {
- return false;
- } else if (this == var1) {
- return true;
- } else if (this.getClass() != var1.getClass()) {
- return false;
- } else {
- CompactStringArray var2 = (CompactStringArray)var1;
-
- for(int var3 = 0; var3 < 65536; ++var3) {
- if (this.elementAt((char)var3) != var2.elementAt((char)var3)) {
- return false;
- }
- }
-
- return true;
- }
- }
-
- public int hashCode() {
- int var1 = 0;
- int var2 = Math.min(3, this.values.length / 16);
-
- for(int var3 = 0; var3 < this.values.length; var3 += var2) {
- var1 = var1 * 37 + this.values[var3];
- }
-
- return var1;
- }
-
- void writeArrays() {
- int var2 = 0;
- if (this.values.length > 0) {
- var2 = this.values.length;
- } else {
- var2 = this.values.length + 65536;
- }
-
- System.out.println("{");
-
- int var1;
- for(var1 = 0; var1 < 511; ++var1) {
- System.out.print("(short)" + (this.getIndexArrayValue(var1) >= 0 ? this.getIndexArrayValue(var1) : this.getIndexArrayValue(var1) + 65536) + ", ");
- if (var1 != 0 && var1 % 10 == 0) {
- System.out.println();
- }
- }
-
- System.out.println("(char)" + (this.getIndexArrayValue(511) >= 0 ? this.getIndexArrayValue(var1) : this.getIndexArrayValue(var1) + 65536) + " }");
- System.out.println("{");
-
- for(int var4 = 0; var4 < var2 - 1; ++var4) {
- char var3 = this.getArrayValue(var4);
- if (var3 >= ' ' && (var3 <= '~' || var3 >= 160) && var3 <= 256) {
- System.out.print("'" + var3 + "',");
- } else {
- System.out.print("(char)0x" + Integer.toString(var3, 16).toUpperCase() + ",");
- }
-
- if (var4 != 0 && var4 % 10 == 0) {
- System.out.println();
- }
- }
-
- System.out.println("(char)" + this.getArrayValue(var2 - 1) + " }");
- System.out.println("\"" + this.exceptions.toString() + "\"");
- }
-
- void printIndex(char var1, short var2) {
- for(int var3 = var1; var3 < var2; ++var3) {
- System.out.println(var3 + " -> : " + (this.indices[var3] >= 0 ? this.indices[var3] : this.indices[var3] + 65536));
- }
-
- System.out.println();
- }
-
- void printPlainArray(int var1, int var2, char[] var3) {
- if (var3 != null) {
- for(int var4 = var1; var4 < var1 + var2; ++var4) {
- System.out.print(" " + this.getArrayValue(var3[var4]));
- }
- } else {
- for(int var5 = var1; var5 < var1 + var2; ++var5) {
- System.out.print(" " + this.getArrayValue(var5));
- }
- }
-
- System.out.println(" Range: start " + var1 + " , count " + var2);
- }
-
- private void expand() {
- if (this.isCompact) {
- char[] var2 = new char[65536];
-
- for(int var1 = 0; var1 < 65536; ++var1) {
- var2[var1] = this.values[(this.indices[var1 >> 7] & '\uffff') + (var1 & 127)];
- }
-
- for(int var3 = 0; var3 < 512; ++var3) {
- this.indices[var3] = (short)(var3 << 7);
- }
-
- this.values = null;
- this.values = var2;
- this.isCompact = false;
- }
-
- }
-
- private short capacity() {
- return (short)this.values.length;
- }
-
- private char getArrayValue(int var1) {
- return this.values[var1];
- }
-
- private short getIndexArrayValue(int var1) {
- return this.indices[var1];
- }
-
- private int FindOverlappingPosition(int var1, char[] var2, int var3) {
- int var4;
- for(var4 = 0; var4 < var3; var4 += 128) {
- short var6 = 128;
- if (var4 + 128 > var3) {
- var6 = (short)(var3 - var4);
- }
-
- short var5;
- for(var5 = 0; var5 < var6 && this.values[var1 + var5] == this.values[var2[var4 + var5]]; ++var5) {
- }
-
- if (var5 == var6) {
- break;
- }
- }
-
- return var4;
- }
- }
-