mirror of
https://github.com/xomboverlord/ldc.git
synced 2026-01-11 18:33:14 +01:00
Apply fix for #151.
This commit is contained in:
@@ -63,6 +63,7 @@ private
|
||||
|
||||
extern (C) char[] _adReverseChar(char[] a)
|
||||
{
|
||||
bool hadErrors = false;
|
||||
if (a.length > 1)
|
||||
{
|
||||
char[6] tmp;
|
||||
@@ -86,24 +87,31 @@ extern (C) char[] _adReverseChar(char[] a)
|
||||
}
|
||||
|
||||
uint stridelo = UTF8stride[clo];
|
||||
// don't barf on invalid strides, just ignore it
|
||||
if (stridelo == 0xFF)
|
||||
stridelo = 1;
|
||||
if (stridelo > 6) { // invalid UTF-8 0xFF
|
||||
stridelo = 1;
|
||||
hadErrors=true;
|
||||
}
|
||||
|
||||
uint stridehi = 1;
|
||||
while ((chi & 0xC0) == 0x80)
|
||||
while ((chi & 0xC0) == 0x80 && hi >= lo)
|
||||
{
|
||||
chi = *--hi;
|
||||
stridehi++;
|
||||
assert(hi >= lo);
|
||||
}
|
||||
if (lo == hi)
|
||||
if (lo >= hi) {
|
||||
if (lo > hi) {
|
||||
hadErrors = true;
|
||||
}
|
||||
break;
|
||||
}
|
||||
if (stridehi > 6) {
|
||||
hadErrors = true;
|
||||
stridehi = 6;
|
||||
}
|
||||
|
||||
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);
|
||||
@@ -124,6 +132,8 @@ extern (C) char[] _adReverseChar(char[] a)
|
||||
hi = hi - 1 + (stridehi - stridelo);
|
||||
}
|
||||
}
|
||||
if (hadErrors)
|
||||
throw new Exception("invalid UTF-8 sequence",__FILE__,__LINE__);
|
||||
return a;
|
||||
}
|
||||
|
||||
@@ -161,6 +171,7 @@ unittest
|
||||
|
||||
extern (C) wchar[] _adReverseWchar(wchar[] a)
|
||||
{
|
||||
bool hadErrors = false;
|
||||
if (a.length > 1)
|
||||
{
|
||||
wchar[2] tmp;
|
||||
@@ -188,10 +199,13 @@ extern (C) wchar[] _adReverseWchar(wchar[] a)
|
||||
{
|
||||
chi = *--hi;
|
||||
stridehi++;
|
||||
assert(hi >= lo);
|
||||
}
|
||||
if (lo == hi)
|
||||
if (lo >= hi) {
|
||||
if (lo > hi) {
|
||||
hadErrors = true;
|
||||
}
|
||||
break;
|
||||
}
|
||||
|
||||
if (stridelo == stridehi)
|
||||
{ int stmp;
|
||||
@@ -217,6 +231,8 @@ extern (C) wchar[] _adReverseWchar(wchar[] a)
|
||||
hi = hi - 1 + (stridehi - stridelo);
|
||||
}
|
||||
}
|
||||
if (hadErrors)
|
||||
throw new Exception("invalid UTF-8 sequence",__FILE__,__LINE__);
|
||||
return a;
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user