diff --git a/extern/igfd/dirent/dirent.h b/extern/igfd/dirent/dirent.h index 6a10cbea9..0549aa27e 100644 --- a/extern/igfd/dirent/dirent.h +++ b/extern/igfd/dirent/dirent.h @@ -1031,6 +1031,64 @@ versionsort( return alphasort (a, b); } + +int decodeUTF8s(const unsigned char* data, char* len) { + int ret=0xfffd; + if (data[0]<0x80) { + ret=data[0]; + *len=1; + } else if (data[0]<0xc0) { + ret=0xfffd; // invalid + *len=1; + } else if (data[0]<0xe0) { + if (data[1]>=0x80 && data[1]<0xc0) { + *len=2; + ret=((data[0]&31)<<6)| + (data[1]&63); + } else *len=1; + } else if (data[0]<0xf0) { + if (data[1]>=0x80 && data[1]<0xc0) { + if (data[2]>=0x80 && data[2]<0xc0) { + *len=3; + ret=((data[0]&15)<<12)| + ((data[1]&63)<<6)| + (data[2]&63); + } else *len=2; + } else *len=1; + } else if (data[0]<0xf5) { + if (data[1]>=0x80 && data[1]<0xc0) { + if (data[2]>=0x80 && data[2]<0xc0) { + if (data[3]>=0x80 && data[3]<0xc0) { + *len=4; + ret=((data[0]&7)<<18)| + ((data[1]&63)<<12)| + ((data[2]&63)<<6)| + (data[3]&63); + } else *len=3; + } else *len=2; + } else *len=1; + } else { + *len=1; + return 0xfffd; + } + + if ((ret>=0xd800 && ret<=0xdfff) || ret>=0x110000) return 0xfffd; + return ret; +} + +static int u8to16s(wchar_t* dest, const char* src, size_t limit) { + size_t ret=0; + int ch, p; + char chs; + p=0; + while (src[p]!=0 && ret