Mercurial > projects > ddmd
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)