Iconv alternate use of Win32 multibyte/widechar API

This commit is contained in:
Jonathan Campbell
2019-03-20 01:40:24 -07:00
parent e07155262b
commit e68edfc6fd
2 changed files with 25 additions and 17 deletions

View File

@@ -1,4 +1,4 @@
all: ic1 ic2 ic3 ic4 ic5
all: ic1 ic2 ic3 ic4 ic5 icw1
ic1: ic1.cpp iconvpp.o
g++ -Wall -Wextra -pedantic -std=c++11 -o $@ $< iconvpp.o -liconv
@@ -15,9 +15,12 @@ ic4: ic4.cpp iconvpp.o
ic5: ic5.cpp iconvpp.o
g++ -Wall -Wextra -pedantic -std=c++11 -o $@ $< iconvpp.o -liconv
icw1: icw1.cpp iconvpp.o
g++ -Wall -Wextra -pedantic -std=c++11 -o $@ $< iconvpp.o -liconv
iconvpp.o: iconvpp.cpp
g++ -Wall -Wextra -pedantic -std=c++11 -c -o $@ $<
clean:
rm -f ic1 ic2 ic3 ic4 ic5 *.o
rm -f ic1 ic2 ic3 ic4 ic5 icw1 *.o

View File

@@ -353,21 +353,29 @@ public:
public:
virtual int _do_convert(void) {
if (codepage != 0u) {
dstT *i_dst = pclass::dst_ptr;
const srcT *i_src = pclass::src_ptr;
size_t src_left = (size_t)((uintptr_t)((char*)pclass::src_ptr_fence) - (uintptr_t)((char*)pclass::src_ptr));
size_t dst_left = (size_t)((uintptr_t)((char*)pclass::dst_ptr_fence) - (uintptr_t)((char*)pclass::dst_ptr));
int ret;
if (sizeof(dstT) == sizeof(char) && sizeof(srcT) == sizeof(WCHAR))
ret = WideCharToMultiByte(codepage,0,pclass::src_ptr,src_left/sizeof(srcT),pclass::dst_ptr,dst_left,NULL,NULL);
else if (sizeof(dstT) == sizeof(WCHAR) && sizeof(srcT) == sizeof(char))
ret = MultiByteToWideChar(codepage,0,pclass::src_ptr,src_left,pclass::dst_ptr,dst_left/sizeof(dstT),NULL,NULL);
else
ret = -1;
pclass::src_adv = (size_t)(pclass::src_ptr - i_src);
pclass::dst_adv = (size_t)(pclass::dst_ptr - i_dst);
if (sizeof(dstT) == sizeof(char) && sizeof(srcT) == sizeof(WCHAR)) {
ret = WideCharToMultiByte(codepage,0,(WCHAR*)pclass::src_ptr,src_left/sizeof(srcT),(char*)pclass::dst_ptr,dst_left,NULL,NULL);
pclass::src_adv = src_left;
pclass::src_ptr += pclass::src_adv;
pclass::dst_adv = ret;
pclass::dst_ptr += pclass::dst_adv;
}
else if (sizeof(dstT) == sizeof(WCHAR) && sizeof(srcT) == sizeof(char)) {
ret = MultiByteToWideChar(codepage,0,(char*)pclass::src_ptr,src_left,(WCHAR*)pclass::dst_ptr,dst_left/sizeof(dstT));
pclass::src_adv = src_left;
pclass::src_ptr += pclass::src_adv;
pclass::dst_adv = ret;
pclass::dst_ptr += pclass::dst_adv;
}
else {
pclass::src_adv = 0;
pclass::dst_adv = 0;
ret = 0;
}
if (ret == 0) {
DWORD err = GetLastError();
@@ -379,11 +387,8 @@ public:
return pclass::err_noinit;
}
else {
return 0;
}
return ret;
return 0;
}
return pclass::err_noinit;