changeset 46:0d32fd48dac4

StringExp.compare
author korDen
date Sat, 21 Aug 2010 07:29:59 +0400
parents ccbc1e0bb3f0
children 488f3f6bcceb
files dmd/StringExp.d
diffstat 1 files changed, 54 insertions(+), 1 deletions(-) [+]
line wrap: on
line diff
--- a/dmd/StringExp.d	Sat Aug 21 07:26:20 2010 +0400
+++ b/dmd/StringExp.d	Sat Aug 21 07:29:59 2010 +0400
@@ -518,7 +518,60 @@
 
 	int compare(Object obj)
 	{
-		assert(false);
+		// Used to sort case statement expressions so we can do an efficient lookup
+		StringExp se2 = cast(StringExp)(obj);
+
+		// This is a kludge so isExpression() in template.c will return 5
+		// for StringExp's.
+		/// ??????????????????
+		if (!se2)
+			return 5;
+
+		assert(se2.op == TOKstring);
+
+		int len1 = len;
+		int len2 = se2.len;
+
+		if (len1 == len2)
+		{
+			switch (sz)
+			{
+				case 1:
+					return strcmp(cast(char*)string_, cast(char*)se2.string_);
+
+				case 2:
+				{	
+					wchar* s1 = cast(wchar*)string_;
+					wchar* s2 = cast(wchar*)se2.string_;
+
+					for (uint u = 0; u < len; u++)
+					{
+						if (s1[u] != s2[u]) {
+							return s1[u] - s2[u];
+						}
+					}
+				}
+
+				case 4:
+				{	
+					dchar* s1 = cast(dchar *)string_;
+					dchar* s2 = cast(dchar *)se2.string_;
+
+					for (uint u = 0; u < len; u++)
+					{
+						if (s1[u] != s2[u]) {
+							return s1[u] - s2[u];
+						}
+					}
+				}
+				break;
+
+				default:
+					assert(0);
+			}
+		}
+		
+		return len1 - len2;
 	}
 
 	bool isBool(bool result)