home *** CD-ROM | disk | FTP | other *** search
/ S283 Planetary Science &n…he Search for Life DVD 2 / DVD-ROM.iso / install / jre1_3 / lib / rt.jar / java / text / RBTableBuilder.class (.txt) < prev    next >
Encoding:
Java Class File  |  1979-12-31  |  5.0 KB  |  280 lines

  1. package java.text;
  2.  
  3. import java.util.Vector;
  4.  
  5. final class RBTableBuilder {
  6.    static final int CHARINDEX = 1879048192;
  7.    private static final int IGNORABLEMASK = 65535;
  8.    private static final int PRIMARYORDERINCREMENT = 65536;
  9.    private static final int SECONDARYORDERINCREMENT = 256;
  10.    private static final int TERTIARYORDERINCREMENT = 1;
  11.    private static final int INITIALTABLESIZE = 20;
  12.    private static final int MAXKEYSIZE = 5;
  13.    private RBCollationTables.BuildAPI tables = null;
  14.    private MergeCollation mPattern = null;
  15.    private boolean isOverIgnore = false;
  16.    private StringBuffer key = new StringBuffer(5);
  17.    private IntHashtable contractFlags = new IntHashtable(100);
  18.    private boolean frenchSec = false;
  19.    private CompactIntArray mapping = null;
  20.    private Vector contractTable = null;
  21.    private Vector expandTable = null;
  22.    private short maxSecOrder = 0;
  23.    private short maxTerOrder = 0;
  24.  
  25.    public RBTableBuilder(RBCollationTables.BuildAPI var1) {
  26.       this.tables = var1;
  27.    }
  28.  
  29.    public void build(String var1, int var2) throws ParseException {
  30.       boolean var3 = true;
  31.       boolean var4 = false;
  32.       if (var1.length() == 0) {
  33.          throw new ParseException("Build rules empty.", 0);
  34.       } else {
  35.          this.mapping = new CompactIntArray(-1);
  36.          var1 = Normalizer.decompose(var1, var2);
  37.          this.mPattern = new MergeCollation(var1);
  38.          int var7 = 0;
  39.  
  40.          for(int var11 = 0; var11 < this.mPattern.getCount(); ++var11) {
  41.             PatternEntry var8 = this.mPattern.getItemAt(var11);
  42.             if (var8 != null) {
  43.                String var6 = var8.getChars();
  44.                if (var6.length() > 1 && var6.charAt(var6.length() - 1) == '@') {
  45.                   this.frenchSec = true;
  46.                   var6 = var6.substring(0, var6.length() - 1);
  47.                }
  48.  
  49.                var7 = this.increment(var8.getStrength(), var7);
  50.                String var5 = var8.getExtension();
  51.                if (var5.length() != 0) {
  52.                   this.addExpandOrder(var6, var5, var7);
  53.                } else if (var6.length() > 1) {
  54.                   this.addContractOrder(var6, var7);
  55.                } else {
  56.                   char var9 = var6.charAt(0);
  57.                   this.addOrder(var9, var7);
  58.                }
  59.             }
  60.          }
  61.  
  62.          this.addComposedChars();
  63.          this.commit();
  64.          this.mapping.compact();
  65.          this.tables.fillInTables(this.frenchSec, this.mapping, this.contractTable, this.expandTable, this.contractFlags, this.maxSecOrder, this.maxTerOrder);
  66.       }
  67.    }
  68.  
  69.    private void addComposedChars() throws ParseException {
  70.       StringBuffer var1 = new StringBuffer(1);
  71.       Normalizer.DecompIterator var2 = Normalizer.getDecompositions(1);
  72.  
  73.       while(var2.hasNext()) {
  74.          char var3 = var2.next();
  75.          if (this.getCharOrder(var3) == -1) {
  76.             String var4 = var2.decomposition();
  77.             int var5 = this.getContractOrder(var4);
  78.             if (var5 != -1) {
  79.                this.addOrder(var3, var5);
  80.             } else {
  81.                boolean var6 = true;
  82.  
  83.                for(int var7 = 0; var7 < var4.length(); ++var7) {
  84.                   if (this.getCharOrder(var4.charAt(var7)) == -1) {
  85.                      var6 = false;
  86.                      break;
  87.                   }
  88.                }
  89.  
  90.                if (var6) {
  91.                   var1.setLength(0);
  92.                   var1.append(var3);
  93.                   this.addExpandOrder(var1.toString(), var4, -1);
  94.                }
  95.             }
  96.          }
  97.       }
  98.  
  99.    }
  100.  
  101.    private final void commit() {
  102.       if (this.expandTable != null) {
  103.          for(int var1 = 0; var1 < this.expandTable.size(); ++var1) {
  104.             int[] var2 = (int[])this.expandTable.elementAt(var1);
  105.  
  106.             for(int var3 = 0; var3 < var2.length; ++var3) {
  107.                int var4 = var2[var3];
  108.                if (var4 < 2113929216 && var4 > 1879048192) {
  109.                   char var5 = (char)(var4 - 1879048192);
  110.                   int var6 = this.getCharOrder(var5);
  111.                   if (var6 == -1) {
  112.                      var2[var3] = '\uffff' & var5;
  113.                   } else {
  114.                      var2[var3] = var6;
  115.                   }
  116.                }
  117.             }
  118.          }
  119.       }
  120.  
  121.    }
  122.  
  123.    private final int increment(int var1, int var2) {
  124.       switch (var1) {
  125.          case 0:
  126.             var2 += 65536;
  127.             var2 &= -65536;
  128.             this.isOverIgnore = true;
  129.             break;
  130.          case 1:
  131.             var2 += 256;
  132.             var2 &= -256;
  133.             if (!this.isOverIgnore) {
  134.                ++this.maxSecOrder;
  135.             }
  136.             break;
  137.          case 2:
  138.             ++var2;
  139.             if (!this.isOverIgnore) {
  140.                ++this.maxTerOrder;
  141.             }
  142.       }
  143.  
  144.       return var2;
  145.    }
  146.  
  147.    private final void addOrder(char var1, int var2) {
  148.       int var3 = this.mapping.elementAt(var1);
  149.       if (var3 >= 2130706432) {
  150.          this.key.setLength(0);
  151.          this.key.append(var1);
  152.          this.addContractOrder(this.key.toString(), var2);
  153.       } else {
  154.          this.mapping.setElementAt(var1, var2);
  155.       }
  156.  
  157.    }
  158.  
  159.    private final void addContractOrder(String var1, int var2) {
  160.       this.addContractOrder(var1, var2, true);
  161.    }
  162.  
  163.    private final void addContractOrder(String var1, int var2, boolean var3) {
  164.       if (this.contractTable == null) {
  165.          this.contractTable = new Vector(20);
  166.       }
  167.  
  168.       int var4 = this.mapping.elementAt(var1.charAt(0));
  169.       Vector var5 = this.getContractValues(var4 - 2130706432);
  170.       if (var5 == null) {
  171.          int var6 = 2130706432 + this.contractTable.size();
  172.          var5 = new Vector(20);
  173.          this.contractTable.addElement(var5);
  174.          var5.addElement(new EntryPair(var1.substring(0, 1), var4));
  175.          this.mapping.setElementAt(var1.charAt(0), var6);
  176.       }
  177.  
  178.       int var8 = RBCollationTables.getEntry(var5, var1, var3);
  179.       if (var8 != -1) {
  180.          EntryPair var7 = (EntryPair)var5.elementAt(var8);
  181.          var7.value = var2;
  182.       } else {
  183.          EntryPair var9 = (EntryPair)var5.lastElement();
  184.          if (var1.length() > var9.entryName.length()) {
  185.             var5.addElement(new EntryPair(var1, var2, var3));
  186.          } else {
  187.             var5.insertElementAt(new EntryPair(var1, var2, var3), var5.size() - 1);
  188.          }
  189.       }
  190.  
  191.       if (var3 && var1.length() > 1) {
  192.          this.addContractFlags(var1);
  193.          this.addContractOrder((new StringBuffer(var1)).reverse().toString(), var2, false);
  194.       }
  195.  
  196.    }
  197.  
  198.    private int getContractOrder(String var1) {
  199.       int var2 = -1;
  200.       if (this.contractTable != null) {
  201.          Vector var3 = this.getContractValues(var1.charAt(0));
  202.          if (var3 != null) {
  203.             int var4 = RBCollationTables.getEntry(var3, var1, true);
  204.             if (var4 != -1) {
  205.                EntryPair var5 = (EntryPair)var3.elementAt(var4);
  206.                var2 = var5.value;
  207.             }
  208.          }
  209.       }
  210.  
  211.       return var2;
  212.    }
  213.  
  214.    private final int getCharOrder(char var1) {
  215.       int var2 = this.mapping.elementAt(var1);
  216.       if (var2 >= 2130706432) {
  217.          Vector var3 = this.getContractValues(var2 - 2130706432);
  218.          EntryPair var4 = (EntryPair)var3.firstElement();
  219.          var2 = var4.value;
  220.       }
  221.  
  222.       return var2;
  223.    }
  224.  
  225.    Vector getContractValues(char var1) {
  226.       int var2 = this.mapping.elementAt(var1);
  227.       return this.getContractValues(var2 - 2130706432);
  228.    }
  229.  
  230.    Vector getContractValues(int var1) {
  231.       return var1 >= 0 ? (Vector)this.contractTable.elementAt(var1) : null;
  232.    }
  233.  
  234.    private final void addExpandOrder(String var1, String var2, int var3) throws ParseException {
  235.       int var4 = this.addExpansion(var3, var2);
  236.       if (var1.length() > 1) {
  237.          this.addContractOrder(var1, var4);
  238.       } else {
  239.          this.addOrder(var1.charAt(0), var4);
  240.       }
  241.  
  242.    }
  243.  
  244.    private int addExpansion(int var1, String var2) {
  245.       if (this.expandTable == null) {
  246.          this.expandTable = new Vector(20);
  247.       }
  248.  
  249.       int var3 = var1 == -1 ? 0 : 1;
  250.       int[] var4 = new int[var2.length() + var3];
  251.       if (var3 == 1) {
  252.          var4[0] = var1;
  253.       }
  254.  
  255.       for(int var5 = 0; var5 < var2.length(); ++var5) {
  256.          char var6 = var2.charAt(var5);
  257.          int var7 = this.getCharOrder(var6);
  258.          if (var7 != -1) {
  259.             var4[var5 + var3] = var7;
  260.          } else {
  261.             var4[var5 + var3] = 1879048192 + var6;
  262.          }
  263.       }
  264.  
  265.       int var8 = 2113929216 + this.expandTable.size();
  266.       this.expandTable.addElement(var4);
  267.       return var8;
  268.    }
  269.  
  270.    private void addContractFlags(String var1) {
  271.       int var3 = var1.length();
  272.  
  273.       for(int var4 = 0; var4 < var3; ++var4) {
  274.          char var2 = var1.charAt(var4);
  275.          this.contractFlags.put(var2, 1);
  276.       }
  277.  
  278.    }
  279. }
  280.