/// <summary> /// This function is used by RBTableBuilder to fill in all the members of this /// object. (Effectively, the builder class functions as a "friend" of this /// class, but to avoid changing too much of the logic, it carries around "shadow" /// copies of all these variables until the end of the build process and then /// copies them en masse into the actual tables object once all the construction /// logic is complete. This function does that "copying en masse". </summary> /// <param name="f2ary"> The value for frenchSec (the French-secondary flag) </param> /// <param name="swap"> The value for SE Asian swapping rule </param> /// <param name="map"> The collator's character-mapping table (the value for mapping) </param> /// <param name="cTbl"> The collator's contracting-character table (the value for contractTable) </param> /// <param name="eTbl"> The collator's expanding-character table (the value for expandTable) </param> /// <param name="cFlgs"> The hash table of characters that participate in contracting- /// character sequences (the value for contractFlags) </param> /// <param name="mso"> The value for maxSecOrder </param> /// <param name="mto"> The value for maxTerOrder </param> internal void FillInTables(bool f2ary, bool swap, UCompactIntArray map, List <List <EntryPair> > cTbl, List <int[]> eTbl, IntHashtable cFlgs, short mso, short mto) { outerInstance.FrenchSec_Renamed = f2ary; outerInstance.SeAsianSwapping = swap; outerInstance.Mapping = map; outerInstance.ContractTable = cTbl; outerInstance.ExpandTable = eTbl; outerInstance.ContractFlags = cFlgs; outerInstance.MaxSecOrder_Renamed = mso; outerInstance.MaxTerOrder_Renamed = mto; }
/// <summary> /// Create a table-based collation object with the given rules. /// This is the main function that actually builds the tables and /// stores them back in the RBCollationTables object. It is called /// ONLY by the RBCollationTables constructor. </summary> /// <seealso cref= RuleBasedCollator#RuleBasedCollator </seealso> /// <exception cref="ParseException"> If the rules format is incorrect. </exception> //JAVA TO C# CONVERTER WARNING: Method 'throws' clauses are not available in .NET: //ORIGINAL LINE: public void build(String pattern, int decmp) throws ParseException public void Build(String pattern, int decmp) { bool isSource = true; int i = 0; String expChars; String groupChars; if (pattern.Length() == 0) { throw new ParseException("Build rules empty.", 0); } // This array maps Unicode characters to their collation ordering Mapping = new UCompactIntArray(RBCollationTables.UNMAPPED); // Normalize the build rules. Find occurances of all decomposed characters // and normalize the rules before feeding into the builder. By "normalize", // we mean that all precomposed Unicode characters must be converted into // a base character and one or more combining characters (such as accents). // When there are multiple combining characters attached to a base character, // the combining characters must be in their canonical order // // sherman/Note: //(1)decmp will be NO_DECOMPOSITION only in ko locale to prevent decompose //hangual syllables to jamos, so we can actually just call decompose with //normalizer's IGNORE_HANGUL option turned on // //(2)just call the "special version" in NormalizerImpl directly //pattern = Normalizer.decompose(pattern, false, Normalizer.IGNORE_HANGUL, true); // //Normalizer.Mode mode = CollatorUtilities.toNormalizerMode(decmp); //pattern = Normalizer.normalize(pattern, mode, 0, true); pattern = NormalizerImpl.canonicalDecomposeWithSingleQuotation(pattern); // Build the merged collation entries // Since rules can be specified in any order in the string // (e.g. "c , C < d , D < e , E .... C < CH") // this splits all of the rules in the string out into separate // objects and then sorts them. In the above example, it merges the // "C < CH" rule in just before the "C < D" rule. // MPattern = new MergeCollation(pattern); int order = 0; // Now walk though each entry and add it to my own tables for (i = 0; i < MPattern.Count; ++i) { PatternEntry entry = MPattern.GetItemAt(i); if (entry != null) { groupChars = entry.Chars; if (groupChars.Length() > 1) { switch (groupChars.CharAt(groupChars.Length() - 1)) { case '@': FrenchSec = true; groupChars = groupChars.Substring(0, groupChars.Length() - 1); break; case '!': SeAsianSwapping = true; groupChars = groupChars.Substring(0, groupChars.Length() - 1); break; } } order = Increment(entry.Strength, order); expChars = entry.Extension; if (expChars.Length() != 0) { AddExpandOrder(groupChars, expChars, order); } else if (groupChars.Length() > 1) { char ch = groupChars.CharAt(0); if (char.IsHighSurrogate(ch) && groupChars.Length() == 2) { AddOrder(Character.ToCodePoint(ch, groupChars.CharAt(1)), order); } else { AddContractOrder(groupChars, order); } } else { char ch = groupChars.CharAt(0); AddOrder(ch, order); } } } AddComposedChars(); Commit(); Mapping.compact(); /* * System.out.println("mappingSize=" + mapping.getKSize()); * for (int j = 0; j < 0xffff; j++) { * int value = mapping.elementAt(j); * if (value != RBCollationTables.UNMAPPED) * System.out.println("index=" + Integer.toString(j, 16) + ", value=" + Integer.toString(value, 16)); + } */ Tables.FillInTables(FrenchSec, SeAsianSwapping, Mapping, ContractTable, ExpandTable, ContractFlags, MaxSecOrder, MaxTerOrder); }