diff --git a/src/rt/adi.d b/src/rt/adi.d index 99b579b073..44f0e15927 100644 --- a/src/rt/adi.d +++ b/src/rt/adi.d @@ -24,283 +24,6 @@ private extern (C) void[] _adSort(void[] a, TypeInfo ti); } - -/********************************************** - * Reverse array of chars. - * Handled separately because embedded multibyte encodings should not be - * reversed. - */ - -extern (C) char[] _adReverseChar(char[] a) -{ - if (a.length > 1) - { - char[6] tmp; - char[6] tmplo; - char* lo = a.ptr; - char* hi = &a[$ - 1]; - - while (lo < hi) - { auto clo = *lo; - auto chi = *hi; - - debug(adi) printf("lo = %d, hi = %d\n", lo, hi); - if (clo <= 0x7F && chi <= 0x7F) - { - debug(adi) printf("\tascii\n"); - *lo = chi; - *hi = clo; - lo++; - hi--; - continue; - } - - uint stridelo = UTF8stride[clo]; - - uint stridehi = 1; - while ((chi & 0xC0) == 0x80) - { - chi = *--hi; - stridehi++; - assert(hi >= lo); - } - if (lo == hi) - break; - - debug(adi) printf("\tstridelo = %d, stridehi = %d\n", stridelo, stridehi); - if (stridelo == stridehi) - { - - memcpy(tmp.ptr, lo, stridelo); - memcpy(lo, hi, stridelo); - memcpy(hi, tmp.ptr, stridelo); - lo += stridelo; - hi--; - continue; - } - - /* Shift the whole array. This is woefully inefficient - */ - memcpy(tmp.ptr, hi, stridehi); - memcpy(tmplo.ptr, lo, stridelo); - memmove(lo + stridehi, lo + stridelo , cast(size_t)((hi - lo) - stridelo)); - memcpy(lo, tmp.ptr, stridehi); - memcpy(hi + stridehi - stridelo, tmplo.ptr, stridelo); - - lo += stridehi; - hi = hi - 1 + cast(int)(stridehi - stridelo); - } - } - return a; -} - -unittest -{ - auto a = "abcd"c[]; - - auto r = _adReverseChar(a.dup); - //writefln(r); - assert(r == "dcba"); - - a = "a\u1235\u1234c"; - //writefln(a); - r = _adReverseChar(a.dup); - //writefln(r); - assert(r == "c\u1234\u1235a"); - - a = "ab\u1234c"; - //writefln(a); - r = _adReverseChar(a.dup); - //writefln(r); - assert(r == "c\u1234ba"); - - a = "\u3026\u2021\u3061\n"; - r = _adReverseChar(a.dup); - assert(r == "\n\u3061\u2021\u3026"); -} - - -/********************************************** - * Reverse array of wchars. - * Handled separately because embedded multiword encodings should not be - * reversed. - */ - -extern (C) wchar[] _adReverseWchar(wchar[] a) -{ - if (a.length > 1) - { - wchar[2] tmplo = void; - wchar[2] tmphi = void; - wchar* lo = a.ptr; - wchar* hi = &a[$ - 1]; - - while (lo < hi) - { auto clo = *lo; - auto chi = *hi; - - if ((clo < 0xD800 || clo > 0xDFFF) && - (chi < 0xD800 || chi > 0xDFFF)) - { - *lo = chi; - *hi = clo; - lo++; - hi--; - continue; - } - - int stridelo = 1 + (clo >= 0xD800 && clo <= 0xDBFF); - - int stridehi = 1; - if (chi >= 0xDC00 && chi <= 0xDFFF) - { - chi = *--hi; - stridehi++; - assert(hi >= lo); - } - if (lo == hi) - break; - - if (stridelo == stridehi) - { - wchar[2] stmp; - - assert(stridelo == 2); - stmp = lo[0 .. 2]; - lo[0 .. 2] = hi[0 .. 2]; - hi[0 .. 2] = stmp; - lo += stridelo; - hi--; - continue; - } - - /* Shift the whole array. This is woefully inefficient - */ - memcpy(tmplo.ptr, lo, stridelo * wchar.sizeof); - memcpy(tmphi.ptr, hi, stridehi * wchar.sizeof); - memmove(lo + stridehi, lo + stridelo , (hi - (lo + stridelo)) * wchar.sizeof); - memcpy(lo, tmphi.ptr, stridehi * wchar.sizeof); - memcpy(hi + (stridehi - stridelo), tmplo.ptr, stridelo * wchar.sizeof); - - lo += stridehi; - hi = hi - 1 + (stridehi - stridelo); - } - } - return a; -} - -unittest -{ - { - wstring a = "abcd"; - - auto r = _adReverseWchar(a.dup); - assert(r == "dcba"); - - a = "a\U00012356\U00012346c"; - r = _adReverseWchar(a.dup); - assert(r == "c\U00012346\U00012356a"); - - a = "ab\U00012345c"; - r = _adReverseWchar(a.dup); - assert(r == "c\U00012345ba"); - } - { - wstring a = "a\U00000081b\U00002000c\U00010000"; - wchar[] b = a.dup; - - _adReverseWchar(b); - _adReverseWchar(b); - assert(b == "a\U00000081b\U00002000c\U00010000"); - } -} - - -/********************************************** - * Support for array.reverse property. - */ - -extern (C) void[] _adReverse(void[] a, size_t szelem) -out (result) -{ - assert(result is a); -} -body -{ - if (a.length >= 2) - { - byte* tmp; - byte[16] buffer; - - void* lo = a.ptr; - void* hi = a.ptr + (a.length - 1) * szelem; - - tmp = buffer.ptr; - if (szelem > 16) - { - //version (Windows) - tmp = cast(byte*) alloca(szelem); - //else - //tmp = GC.malloc(szelem); - } - - for (; lo < hi; lo += szelem, hi -= szelem) - { - memcpy(tmp, lo, szelem); - memcpy(lo, hi, szelem); - memcpy(hi, tmp, szelem); - } - - version (Windows) - { - } - else - { - //if (szelem > 16) - // BUG: bad code is generate for delete pointer, tries - // to call delclass. - //GC.free(tmp); - } - } - return a; -} - -unittest -{ - debug(adi) printf("array.reverse.unittest\n"); - - int[] a = new int[5]; - int[] b; - - for (auto i = 0; i < 5; i++) - a[i] = i; - *(cast(void[]*)&b) = _adReverse(*cast(void[]*)&a, a[0].sizeof); - assert(b is a); - for (auto i = 0; i < 5; i++) - assert(a[i] == 4 - i); - - struct X20 - { // More than 16 bytes in size - int a; - int b, c, d, e; - } - - X20[] c = new X20[5]; - X20[] d; - - for (auto i = 0; i < 5; i++) - { c[i].a = i; - c[i].e = 10; - } - *(cast(void[]*)&d) = _adReverse(*(cast(void[]*)&c), c[0].sizeof); - assert(d is c); - for (auto i = 0; i < 5; i++) - { - assert(c[i].a == 4 - i); - assert(c[i].e == 10); - } -} - private dchar[] mallocUTF32(C)(in C[] s) { size_t j = 0;