Apply fix for #151.

This commit is contained in:
Christian Kamm
2008-12-15 21:09:33 +01:00
parent d8a7727942
commit a272b01df6

View File

@@ -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;
}