# HG changeset patch # User korDen # Date 1282361399 -14400 # Node ID 0d32fd48dac4635f4b3e24f116d92a6101bed8f4 # Parent ccbc1e0bb3f0b8f0eac4461d19ef3f9e0b2e945a StringExp.compare diff -r ccbc1e0bb3f0 -r 0d32fd48dac4 dmd/StringExp.d --- 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)