From 352441449d9bcde920a121c28c628cb5f0017c3e Mon Sep 17 00:00:00 2001 From: tildearrow Date: Sun, 30 Jan 2022 23:30:13 -0500 Subject: [PATCH] fix not able to enter dirs with non-Latin chars --- extern/igfd/dirent/dirent.h | 60 ++++++++++++++++++++++++++++++++++++- 1 file changed, 59 insertions(+), 1 deletion(-) 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