quickfix:

diff --git a/src/rt/switch_.d b/src/rt/switch_.d
index ec124e3..83572fe 100644
--- a/src/rt/switch_.d
+++ b/src/rt/switch_.d
@@ -27,6 +27,32 @@ private import core.stdc.string;

 extern (C):

+import core.stdc.wchar_ : wchar_t, wmemcmp;
+
+
+static if (wchar_t.sizeof == wchar.sizeof) {
+  alias memcmpw = wmemcmp;
+  int memcmpd (const(void)* s0, const(void)* s1, size_t len) {
+    while (len--) {
+ if (int r = *cast(const(int)*)s0-*cast(const(int)*)s1) return (r < 0 ? -1 : 1);
+      s0 += dchar.sizeof;
+      s1 += dchar.sizeof;
+    }
+    return 0;
+  }
+} else static if (wchar_t.sizeof == dchar.sizeof) {
+  int memcmpw (const(void)* s0, const(void)* s1, size_t len) {
+    while (len--) {
+ if (int r = *cast(const(ushort)*)s0-*cast(const(ushort)*)s1) return (r < 0 ? -1 : 1);
+      s0 += wchar.sizeof;
+      s1 += wchar.sizeof;
+    }
+    return 0;
+  }
+  alias memcmpd = wmemcmp;
+} else static assert(0, "wut?!");
+
+
 int _d_switch_string(char[][] table, char[] ca)
 in
 {
@@ -189,7 +215,7 @@ in
         {
             int c;

- c = memcmp(table[j - 1].ptr, table[j].ptr, len1 * wchar.sizeof);
+            c = memcmpw(table[j - 1].ptr, table[j].ptr, len1);
             assert(c < 0);  // c==0 means a duplicate
         }
     }
@@ -205,7 +231,7 @@ out (result)
         for (auto i = 0u; i < table.length; i++)
         {
             if (table[i].length == ca.length)
- { c = memcmp(table[i].ptr, ca.ptr, ca.length * wchar.sizeof);
+            {   c = memcmpw(table[i].ptr, ca.ptr, ca.length);
                 assert(c != 0);
             }
         }
@@ -218,7 +244,7 @@ out (result)
             assert(i < table.length);
             if (table[i].length == ca.length)
             {
- c = memcmp(table[i].ptr, ca.ptr, ca.length * wchar.sizeof);
+                c = memcmpw(table[i].ptr, ca.ptr, ca.length);
                 if (c == 0)
                 {
                     assert(i == result);
@@ -253,7 +279,7 @@ body
         auto c = cast(sizediff_t)(ca.length - pca.length);
         if (c == 0)
         {
- c = memcmp(ca.ptr, pca.ptr, ca.length * wchar.sizeof);
+            c = memcmpw(ca.ptr, pca.ptr, ca.length);
             if (c == 0)
             {   //printf("found %d\n", mid);
                 return cast(int)mid;
@@ -317,7 +343,7 @@ in
         assert(len1 <= len2);
         if (len1 == len2)
         {
- auto c = memcmp(table[j - 1].ptr, table[j].ptr, len1 * dchar.sizeof); + auto c = memcmpd(table[j - 1].ptr, table[j].ptr, len1);
             assert(c < 0);  // c==0 means a duplicate
         }
     }
@@ -331,7 +357,7 @@ out (result)
         for (auto i = 0u; i < table.length; i++)
         {
             if (table[i].length == ca.length)
- { auto c = memcmp(table[i].ptr, ca.ptr, ca.length * dchar.sizeof); + { auto c = memcmpd(table[i].ptr, ca.ptr, ca.length);
                 assert(c != 0);
             }
         }
@@ -344,7 +370,7 @@ out (result)
             assert(i < table.length);
             if (table[i].length == ca.length)
             {
- auto c = memcmp(table[i].ptr, ca.ptr, ca.length * dchar.sizeof); + auto c = memcmpd(table[i].ptr, ca.ptr, ca.length);
                 if (c == 0)
                 {
                     assert(i == result);
@@ -379,7 +405,7 @@ body
         auto c = cast(sizediff_t)(ca.length - pca.length);
         if (c == 0)
         {
- c = memcmp(ca.ptr, pca.ptr, ca.length * dchar.sizeof);
+            c = memcmpd(ca.ptr, pca.ptr, ca.length);
             if (c == 0)
             {   //printf("found %d\n", mid);
                 return cast(int)mid;
--
2.9.2
  • Switch ignores case (?) Chris via Digitalmars-d-learn
    • Re: Switch ignores case ... Steven Schveighoffer via Digitalmars-d-learn
      • Re: Switch ignores c... Chris via Digitalmars-d-learn
        • Re: Switch ignor... Steven Schveighoffer via Digitalmars-d-learn
          • Re: Switch i... Chris via Digitalmars-d-learn
            • Re: Swi... Jonathan M Davis via Digitalmars-d-learn
            • Re: Swi... ketmar via Digitalmars-d-learn
              • Re:... Chris via Digitalmars-d-learn
                • ... ketmar via Digitalmars-d-learn
                • ... ketmar via Digitalmars-d-learn
              • Re:... Steven Schveighoffer via Digitalmars-d-learn
                • ... Steven Schveighoffer via Digitalmars-d-learn
                • ... ketmar via Digitalmars-d-learn
                • ... Steven Schveighoffer via Digitalmars-d-learn
                • ... ketmar via Digitalmars-d-learn
                • ... Chris via Digitalmars-d-learn
                • ... ketmar via Digitalmars-d-learn
                • ... Chris via Digitalmars-d-learn
                • ... Antonio Corbi via Digitalmars-d-learn
                • ... ketmar via Digitalmars-d-learn

Reply via email to