mirror of
https://github.com/joncampbell123/dosbox-x.git
synced 2025-10-15 03:48:24 +08:00
Iconv alternate use of Win32 multibyte/widechar API
This commit is contained in:
@@ -1,4 +1,4 @@
|
|||||||
all: ic1 ic2 ic3 ic4 ic5
|
all: ic1 ic2 ic3 ic4 ic5 icw1
|
||||||
|
|
||||||
ic1: ic1.cpp iconvpp.o
|
ic1: ic1.cpp iconvpp.o
|
||||||
g++ -Wall -Wextra -pedantic -std=c++11 -o $@ $< iconvpp.o -liconv
|
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
|
ic5: ic5.cpp iconvpp.o
|
||||||
g++ -Wall -Wextra -pedantic -std=c++11 -o $@ $< iconvpp.o -liconv
|
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
|
iconvpp.o: iconvpp.cpp
|
||||||
g++ -Wall -Wextra -pedantic -std=c++11 -c -o $@ $<
|
g++ -Wall -Wextra -pedantic -std=c++11 -c -o $@ $<
|
||||||
|
|
||||||
clean:
|
clean:
|
||||||
rm -f ic1 ic2 ic3 ic4 ic5 *.o
|
rm -f ic1 ic2 ic3 ic4 ic5 icw1 *.o
|
||||||
|
|
||||||
|
@@ -353,21 +353,29 @@ public:
|
|||||||
public:
|
public:
|
||||||
virtual int _do_convert(void) {
|
virtual int _do_convert(void) {
|
||||||
if (codepage != 0u) {
|
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 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));
|
size_t dst_left = (size_t)((uintptr_t)((char*)pclass::dst_ptr_fence) - (uintptr_t)((char*)pclass::dst_ptr));
|
||||||
int ret;
|
int ret;
|
||||||
|
|
||||||
if (sizeof(dstT) == sizeof(char) && sizeof(srcT) == sizeof(WCHAR))
|
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);
|
ret = WideCharToMultiByte(codepage,0,(WCHAR*)pclass::src_ptr,src_left/sizeof(srcT),(char*)pclass::dst_ptr,dst_left,NULL,NULL);
|
||||||
else if (sizeof(dstT) == sizeof(WCHAR) && sizeof(srcT) == sizeof(char))
|
pclass::src_adv = src_left;
|
||||||
ret = MultiByteToWideChar(codepage,0,pclass::src_ptr,src_left,pclass::dst_ptr,dst_left/sizeof(dstT),NULL,NULL);
|
pclass::src_ptr += pclass::src_adv;
|
||||||
else
|
pclass::dst_adv = ret;
|
||||||
ret = -1;
|
pclass::dst_ptr += pclass::dst_adv;
|
||||||
|
}
|
||||||
pclass::src_adv = (size_t)(pclass::src_ptr - i_src);
|
else if (sizeof(dstT) == sizeof(WCHAR) && sizeof(srcT) == sizeof(char)) {
|
||||||
pclass::dst_adv = (size_t)(pclass::dst_ptr - i_dst);
|
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) {
|
if (ret == 0) {
|
||||||
DWORD err = GetLastError();
|
DWORD err = GetLastError();
|
||||||
@@ -379,11 +387,8 @@ public:
|
|||||||
|
|
||||||
return pclass::err_noinit;
|
return pclass::err_noinit;
|
||||||
}
|
}
|
||||||
else {
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
return ret;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
return pclass::err_noinit;
|
return pclass::err_noinit;
|
||||||
|
Reference in New Issue
Block a user