Author: atsushi
Date: 2005-07-14 03:36:22 -0400 (Thu, 14 Jul 2005)
New Revision: 47292
Modified:
trunk/mcs/class/corlib/Mono.Globalization.Unicode/ChangeLog
trunk/mcs/class/corlib/Mono.Globalization.Unicode/SimpleCollator.cs
trunk/mcs/class/corlib/Test/System.Globalization/ChangeLog
trunk/mcs/class/corlib/Test/System.Globalization/CompareInfoTest.cs
Log:
2005-07-14 Atsushi Enomoto <[EMAIL PROTECTED]>
* SimpleCollator.cs : Now FilterExtender() handles all extender
support. IndexOf() and LastIndexOf() now supports extenders.
IndexOf() and LastIndexOf() did not proceed contraction source
length as expected. Tiny refactoring on private IsPrefix() to take
stringSort argument.
* CompareInfoTest.cs : Added extender tests for GetSortKey(),
Compare(), IsPrefix(), IndexOf() and LastIndexOf().
Modified: trunk/mcs/class/corlib/Mono.Globalization.Unicode/ChangeLog
===================================================================
--- trunk/mcs/class/corlib/Mono.Globalization.Unicode/ChangeLog 2005-07-14
02:35:58 UTC (rev 47291)
+++ trunk/mcs/class/corlib/Mono.Globalization.Unicode/ChangeLog 2005-07-14
07:36:22 UTC (rev 47292)
@@ -1,3 +1,11 @@
+2005-07-14 Atsushi Enomoto <[EMAIL PROTECTED]>
+
+ * SimpleCollator.cs : Now FilterExtender() handles all extender
+ support. IndexOf() and LastIndexOf() now supports extenders.
+ IndexOf() and LastIndexOf() did not proceed contraction source
+ length as expected. Tiny refactoring on private IsPrefix() to take
+ stringSort argument.
+
2005-07-13 Atsushi Enomoto <[EMAIL PROTECTED]>
* SimpleCollator.cs : when restoring from expansion, go back to the
Modified: trunk/mcs/class/corlib/Mono.Globalization.Unicode/SimpleCollator.cs
===================================================================
--- trunk/mcs/class/corlib/Mono.Globalization.Unicode/SimpleCollator.cs
2005-07-14 02:35:58 UTC (rev 47291)
+++ trunk/mcs/class/corlib/Mono.Globalization.Unicode/SimpleCollator.cs
2005-07-14 07:36:22 UTC (rev 47292)
@@ -545,6 +545,28 @@
}
}
+ int FilterExtender (int i, ExtenderType ext)
+ {
+ if (ext == ExtenderType.Conditional &&
+ Uni.HasSpecialWeight ((char) i)) {
+ bool half = IsHalfKana ((char) i);
+ bool katakana = !Uni.IsHiragana ((char) i);
+ switch (Level1 (i) & 7) {
+ case 2:
+ return half ? 0xFF71 : katakana ?
0x30A2 : 0x3042;
+ case 3:
+ return half ? 0xFF72 : katakana ?
0x30A4 : 0x3044;
+ case 4:
+ return half ? 0xFF73 : katakana ?
0x30A6 : 0x3046;
+ case 5:
+ return half ? 0xFF74 : katakana ?
0x30A8 : 0x3048;
+ case 6:
+ return half ? 0xFF75 : katakana ?
0x30AA : 0x304A;
+ }
+ }
+ return i;
+ }
+
bool IsIgnorable (int i)
{
return Uni.IsIgnorable (i) ||
@@ -583,7 +605,7 @@
ExtenderType ext = GetExtenderType (i);
if (ext != ExtenderType.None) {
- i = previousChar;
+ i = FilterExtender (previousChar, ext);
if (i >= 0)
FillSortKeyRaw (i, ext);
else if (previousSortKey != null) {
@@ -656,8 +678,6 @@
byte level2 = Level2 (i, ext);
if (Uni.HasSpecialWeight ((char) i)) {
byte level1 = Level1 (i);
- if (ext == ExtenderType.Conditional)
- level1 = (byte) ((level1 & 0xF) % 8);
buf.AppendKana (
Category (i),
level1,
@@ -890,7 +910,7 @@
sk1 = previousSortKey;
}
else
- i1 = previousChar;
+ i1 = FilterExtender
(previousChar, ext1);
}
ext2 = GetExtenderType (i2);
if (ext2 != ExtenderType.None) {
@@ -903,7 +923,7 @@
sk2 = previousSortKey2;
}
else
- i2 = previousChar2;
+ i2 = FilterExtender
(previousChar2, ext2);
}
byte cat1 = Category (i1);
@@ -1017,7 +1037,7 @@
if (currentLevel > 3)
special2 = Uni.HasSpecialWeight
((char) i2);
if (cat2 > 1)
- previousChar = i2;
+ previousChar2 = i2;
idx2++;
}
@@ -1139,28 +1159,33 @@
return IsPrefix (src, target, 0, src.Length, opt);
}
-#if true
public bool IsPrefix (string s, string target, int start, int
length, CompareOptions opt)
{
SetOptions (opt);
+ return IsPrefix (s, target, start, length,
+ (opt & CompareOptions.StringSort) != 0);
+ }
+
+ public bool IsPrefix (string s, string target, int start, int
length, bool stringSort)
+ {
bool consumed;
escape1.Source = null;
escape2.Source = null;
previousSortKey= previousSortKey2 = null;
previousChar = previousChar2 = -1;
int ret = CompareInternal (s, start, length,
- target, 0, target.Length,
- (opt & CompareOptions.StringSort) != 0,
+ target, 0, target.Length, stringSort,
out consumed);
return consumed;
}
-#else
+
+/*
public bool IsPrefix (string s, string target, int start, int
length, CompareOptions opt)
{
SetOptions (opt);
return IsPrefix (s, target, start, length);
}
-#endif
+
// returns the consumed length in positive number, or -1 if
// target was not a prefix.
bool IsPrefix (string s, string target, int start, int length)
@@ -1248,6 +1273,7 @@
}
return true;
}
+*/
// WARNING: Don't invoke it outside IsPrefix().
int GetMatchLength (ref string s, ref int idx, ref int end,
char target)
@@ -1509,7 +1535,8 @@
public int IndexOf (string s, string target, int start, int
length, CompareOptions opt)
{
SetOptions (opt);
- return IndexOf (s, target, start, length);
+ return IndexOf (s, target, start, length,
+ (opt & CompareOptions.StringSort) != 0);
}
public int IndexOf (string s, char target, CompareOptions opt)
@@ -1560,7 +1587,7 @@
// Searches string. Search head character (or keydata when
// the head is contraction sortkey) and try IsPrefix().
- int IndexOf (string s, string target, int start, int length)
+ int IndexOf (string s, string target, int start, int length,
bool stringSort)
{
int tidx = 0;
for (; tidx < target.Length; tidx++)
@@ -1576,15 +1603,21 @@
if (sortkey != null)
idx = IndexOfSortKey (s, start, length,
ct.SortKey, char.MinValue, -1, true);
else if (replace != null)
- idx = IndexOf (s, replace, start,
length);
+ idx = IndexOf (s, replace, start,
length, stringSort);
else
idx = IndexOfPrimitiveChar (s, start,
length, target [tidx]);
if (idx < 0)
return -1;
- if (IsPrefix (s, target, idx, length - (idx -
start)))
+ if (IsPrefix (s, target, idx, length - (idx -
start), stringSort))
return idx;
- start++;
- length--;
+ Contraction cts = GetContraction (s, idx,
length - (idx - start));
+ if (cts != null) {
+ start += cts.Source.Length;
+ length -= cts.Source.Length;
+ } else {
+ start++;
+ length--;
+ }
} while (length > 0);
return -1;
}
@@ -1602,7 +1635,8 @@
public int LastIndexOf (string s, string target, int start, int
length, CompareOptions opt)
{
SetOptions (opt);
- return LastIndexOf (s, target, start, length);
+ return LastIndexOf (s, target, start, length,
+ (opt & CompareOptions.StringSort) != 0);
}
public int LastIndexOf (string s, char target, CompareOptions
opt)
@@ -1654,7 +1688,7 @@
// Searches string. Search head character (or keydata when
// the head is contraction sortkey) and try IsPrefix().
- int LastIndexOf (string s, string target, int start, int length)
+ int LastIndexOf (string s, string target, int start, int
length, bool stringSort)
{
int orgStart = start;
int tidx = 0;
@@ -1672,20 +1706,26 @@
if (sortkey != null)
idx = LastIndexOfSortKey (s, start,
length, ct.SortKey, char.MinValue, -1, true);
else if (replace != null)
- idx = LastIndexOf (s, replace, start,
length);
+ idx = LastIndexOf (s, replace, start,
length, stringSort);
else
idx = LastIndexOfPrimitiveChar (s,
start, length, target [tidx]);
if (idx < 0)
return -1;
- if (IsPrefix (s, target, idx, orgStart - idx +
1)) {
+ if (IsPrefix (s, target, idx, orgStart - idx +
1, stringSort)) {
for (;idx < orgStart; idx++)
if (!IsIgnorable (s [idx]))
break;
return idx;
}
- length--;
- start--;
+ Contraction cts = GetContraction (s, idx,
orgStart - idx + 1);
+ if (cts != null) {
+ start -= cts.Source.Length;
+ length -= cts.Source.Length;
+ } else {
+ start--;
+ length--;
+ }
} while (length > 0);
return -1;
}
Modified: trunk/mcs/class/corlib/Test/System.Globalization/ChangeLog
===================================================================
--- trunk/mcs/class/corlib/Test/System.Globalization/ChangeLog 2005-07-14
02:35:58 UTC (rev 47291)
+++ trunk/mcs/class/corlib/Test/System.Globalization/ChangeLog 2005-07-14
07:36:22 UTC (rev 47292)
@@ -1,3 +1,8 @@
+2005-07-14 Atsushi Enomoto <[EMAIL PROTECTED]>
+
+ * CompareInfoTest.cs : Added extender tests for GetSortKey(),
+ Compare(), IsPrefix(), IndexOf() and LastIndexOf().
+
2005-07-13 Atsushi Enomoto <[EMAIL PROTECTED]>
* CompareInfoTest.cs : Added Compare() test that contains expansion.
Modified: trunk/mcs/class/corlib/Test/System.Globalization/CompareInfoTest.cs
===================================================================
--- trunk/mcs/class/corlib/Test/System.Globalization/CompareInfoTest.cs
2005-07-14 02:35:58 UTC (rev 47291)
+++ trunk/mcs/class/corlib/Test/System.Globalization/CompareInfoTest.cs
2005-07-14 07:36:22 UTC (rev 47292)
@@ -734,6 +734,12 @@
// AssertCompare ("#6", 0, "\uFF8A\uFF9E\uFF70\uFF99",
// "\u30D0\u30FC\u30EB", CompareOptions.IgnoreWidth);
+ // extender in target
+ AssertCompare ("#7", -1, "\u30D1\u30A2", "\u30D1\u30FC");
+ AssertCompare ("#8", 0, "\u30D1\u30A2", "\u30D1\u30FC",
CompareOptions.IgnoreNonSpace);
+ // extender in source
+ AssertCompare ("#9", 1, "\u30D1\u30FC", "\u30D1\u30A2");
+ AssertCompare ("#10", 0, "\u30D1\u30FC", "\u30D1\u30A2",
CompareOptions.IgnoreNonSpace);
}
[Test]
@@ -828,6 +834,13 @@
// FIXME: not working
// AssertIsPrefix ("#6", true, "\uFF8A\uFF9E\uFF70\uFF99",
// "\u30D0\u30FC\u30EB", CompareOptions.IgnoreWidth);
+
+ // extender in target
+ AssertIsPrefix ("#7", false, "\u30D1\u30A2", "\u30D1\u30FC");
+ AssertIsPrefix ("#8", true, "\u30D1\u30A2", "\u30D1\u30FC",
CompareOptions.IgnoreNonSpace);
+ // extender in source
+ AssertIsPrefix ("#9", false, "\u30D1\u30FC", "\u30D1\u30A2");
+ AssertIsPrefix ("#10", true, "\u30D1\u30FC", "\u30D1\u30A2",
CompareOptions.IgnoreNonSpace);
}
[Test]
@@ -888,7 +901,33 @@
AssertIndexOf ("#18", 0, "ABC", "\u3007");
}
+ [Test]
+ public void IndexOfSpecialWeight ()
+ {
+ if (!doTest)
+ return;
+ // Japanese (in invariant)
+ AssertIndexOf ("#1", -1, "\u30D1\u30FC\u30B9",
"\uFF8A\uFF9F\uFF70\uFF7D");
+ // extender in target
+ AssertIndexOf ("#1-2", -1, "\u30D1\u30A2", "\u30D1\u30FC");
+ AssertIndexOf ("#1-3", 0, "\u30D1\u30A2", "\u30D1\u30FC",
CompareOptions.IgnoreNonSpace);
+ // extender in source
+ AssertIndexOf ("#1-4", 0, "\u30D1\u30FC", "\u30D1\u30A2",
CompareOptions.IgnoreNonSpace);
+
+ // FIXME: not working
+// AssertIndexOf ("#2", true, "\u30D1\u30FC\u30B9",
"\uFF8A\uFF9F\uFF70\uFF7D", CompareOptions.IgnoreWidth);
+ // FIXME: not working
+// AssertIndexOf ("#3", 0, "\uFF80\uFF9E\uFF72\uFF8C\uFF9E",
+// "\u30C0\u30A4\u30D6", CompareOptions.IgnoreWidth);
+ AssertIndexOf ("#4", -1, "\u3042\u309D", "\u3042\u3042");
+ AssertIndexOf ("#5", 0, "\u3042\u309D", "\u3042\u3042",
CompareOptions.IgnoreNonSpace);
+ // FIXME: not working
+// AssertIndexOf ("#6", 0, "\uFF8A\uFF9E\uFF70\uFF99",
+// "\u30D0\u30FC\u30EB", CompareOptions.IgnoreWidth);
+
+ }
+
[Test]
public void LastIndexOfString ()
{
@@ -914,6 +953,33 @@
AssertLastIndexOf ("#16", 1, "\uff21\uff21", "\uff21\u3007",
CompareOptions.None);
AssertLastIndexOf ("#17", 1, "\uff21\uff21", "\u3007",
CompareOptions.None);
}
+
+ [Test]
+ public void LastIndexOfSpecialWeight ()
+ {
+ if (!doTest)
+ return;
+
+ // Japanese (in invariant)
+ AssertLastIndexOf ("#1", -1, "\u30D1\u30FC\u30B9",
"\uFF8A\uFF9F\uFF70\uFF7D");
+ // extender in target
+ AssertLastIndexOf ("#1-2", -1, "\u30D1\u30A2", "\u30D1\u30FC");
+ AssertLastIndexOf ("#1-3", 0, "\u30D1\u30A2", "\u30D1\u30FC",
CompareOptions.IgnoreNonSpace);
+ // extender in source
+ AssertLastIndexOf ("#1-4", 0, "\u30D1\u30FC", "\u30D1\u30A2",
CompareOptions.IgnoreNonSpace);
+
+ // FIXME: not working
+// AssertLastIndexOf ("#2", true, "\u30D1\u30FC\u30B9",
"\uFF8A\uFF9F\uFF70\uFF7D", CompareOptions.IgnoreWidth);
+ // FIXME: not working
+// AssertLastIndexOf ("#3", 0, "\uFF80\uFF9E\uFF72\uFF8C\uFF9E",
+// "\u30C0\u30A4\u30D6", CompareOptions.IgnoreWidth);
+ AssertLastIndexOf ("#4", -1, "\u3042\u309D", "\u3042\u3042");
+ AssertLastIndexOf ("#5", 0, "\u3042\u309D", "\u3042\u3042",
CompareOptions.IgnoreNonSpace);
+ // FIXME: not working
+// AssertLastIndexOf ("#6", 0, "\uFF8A\uFF9E\uFF70\uFF99",
+// "\u30D0\u30FC\u30EB", CompareOptions.IgnoreWidth);
+
+ }
}
}
_______________________________________________
Mono-patches maillist - [email protected]
http://lists.ximian.com/mailman/listinfo/mono-patches