From c0955d33dea6428aa495e0809432d95a539b8b11 Mon Sep 17 00:00:00 2001 From: ptitSeb Date: Sat, 28 Sep 2024 15:13:13 +0200 Subject: [PATCH] [BOX32][WRAPPER] Added some minimum 32bits wrpping for fontconfig, and some fixes for iconv wrapped function signature --- CMakeLists.txt | 1 + src/library_list_32.h | 1 + src/wrapped32/generated/functions_list.txt | 8 +- .../generated/wrappedfontconfigdefs32.h | 8 + .../generated/wrappedfontconfigtypes32.h | 19 ++ .../generated/wrappedfontconfigundefs32.h | 8 + src/wrapped32/generated/wrapper32.c | 10 +- src/wrapped32/generated/wrapper32.h | 5 +- src/wrapped32/wrappedfontconfig.c | 229 ++++++++++++++++++ src/wrapped32/wrappedfontconfig_private.h | 204 ++++++++++++++++ src/wrapped32/wrappedlibc_private.h | 2 +- 11 files changed, 490 insertions(+), 5 deletions(-) create mode 100644 src/wrapped32/generated/wrappedfontconfigdefs32.h create mode 100644 src/wrapped32/generated/wrappedfontconfigtypes32.h create mode 100644 src/wrapped32/generated/wrappedfontconfigundefs32.h create mode 100644 src/wrapped32/wrappedfontconfig.c create mode 100644 src/wrapped32/wrappedfontconfig_private.h diff --git a/CMakeLists.txt b/CMakeLists.txt index 399899525..28d373047 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -791,6 +791,7 @@ if(BOX32) "${BOX64_ROOT}/src/wrapped32/wrappedlibasound.c" "${BOX64_ROOT}/src/wrapped32/wrappedopenal.c" "${BOX64_ROOT}/src/wrapped32/wrappedfreetype.c" + "${BOX64_ROOT}/src/wrapped32/wrappedfontconfig.c" "${BOX64_ROOT}/src/wrapped32/wrappedlibx11.c" "${BOX64_ROOT}/src/wrapped32/wrappedlibxfixes.c" "${BOX64_ROOT}/src/wrapped32/wrappedlibxrender.c" diff --git a/src/library_list_32.h b/src/library_list_32.h index c4fe22768..0a3086a30 100644 --- a/src/library_list_32.h +++ b/src/library_list_32.h @@ -17,6 +17,7 @@ GO("libSDL2-2.0.so.0", sdl2) GO("libasound.so.2", libasound) GO("libasound.so", libasound) GO("libfreetype.so.6", freetype) +GO("libfontconfig.so.1", fontconfig) GO("libX11.so.6", libx11) GO("libXfixes.so.3", libxfixes) GO("libXrender.so.1", libxrender) diff --git a/src/wrapped32/generated/functions_list.txt b/src/wrapped32/generated/functions_list.txt index bdd2146d1..118bec1db 100644 --- a/src/wrapped32/generated/functions_list.txt +++ b/src/wrapped32/generated/functions_list.txt @@ -570,6 +570,7 @@ #() uFEpii -> uFEpii #() uFuuuu -> uFuuuu #() uFpCCC -> uFpCCC +#() uFppip -> uFppip #() lFEipi -> lFEipi #() lFiipL -> lFiipL #() lFipLi -> lFipLi @@ -603,6 +604,7 @@ #() iFppbp_p -> iFppBp #() iFBp_pui -> iFBpui #() IFpBp_ii -> IFpBii +#() uFppiBp_ -> uFppiB #() UFpBp_ii -> UFpBii #() lFiibp_L -> lFiiBL #() LFpbp_Lp -> LFpBLp @@ -727,6 +729,7 @@ #() iFuiuup -> iFuiuup #() iFpCCCC -> iFpCCCC #() iFpLuLi -> iFpLuLi +#() iFppiUi -> iFppiUi #() iFpppip -> iFpppip #() iFpppup -> iFpppup #() iFppppp -> iFppppp @@ -751,7 +754,7 @@ #() LFpbp_LLp -> LFpBLLp #() LFpBp_LLp -> LFpBLLp #() iFippprLL_ -> iFipppB -#() LFLbp_bL_Bp_BL_ -> LFLBBBB +#() LFLbp_bL_bp_bL_ -> LFLBBBB #() LFpLpriiiiiiiiilt_a -> LFpLpBa #() iFXLpBLWWWcc_BLWWWcc_ -> iFXLpBB #() vFEiiipp -> vFEiiipp @@ -1076,6 +1079,9 @@ wrappedexpat: - XML_SetElementHandler - uFpii: - XML_ParseBuffer +wrappedfontconfig: +- iFppiUi: + - FcPatternAdd wrappedfreetype: - iFp: - FT_Done_Face diff --git a/src/wrapped32/generated/wrappedfontconfigdefs32.h b/src/wrapped32/generated/wrappedfontconfigdefs32.h new file mode 100644 index 000000000..202c1c44b --- /dev/null +++ b/src/wrapped32/generated/wrappedfontconfigdefs32.h @@ -0,0 +1,8 @@ +/****************************************************************** + * File automatically generated by rebuild_wrappers_32.py (v0.0.1.1) * + ******************************************************************/ +#ifndef __wrappedfontconfigDEFS32_H_ +#define __wrappedfontconfigDEFS32_H_ + + +#endif // __wrappedfontconfigDEFS32_H_ diff --git a/src/wrapped32/generated/wrappedfontconfigtypes32.h b/src/wrapped32/generated/wrappedfontconfigtypes32.h new file mode 100644 index 000000000..c1742c844 --- /dev/null +++ b/src/wrapped32/generated/wrappedfontconfigtypes32.h @@ -0,0 +1,19 @@ +/****************************************************************** + * File automatically generated by rebuild_wrappers_32.py (v0.0.1.1) * + ******************************************************************/ +#ifndef __wrappedfontconfigTYPES32_H_ +#define __wrappedfontconfigTYPES32_H_ + +#ifndef LIBNAME +#error You should only #include this file inside a wrapped*.c file +#endif +#ifndef ADDED_FUNCTIONS +#define ADDED_FUNCTIONS() +#endif + +typedef int32_t (*iFppiUi_t)(void*, void*, int32_t, uint64_t, int32_t); + +#define SUPER() ADDED_FUNCTIONS() \ + GO(FcPatternAdd, iFppiUi_t) + +#endif // __wrappedfontconfigTYPES32_H_ diff --git a/src/wrapped32/generated/wrappedfontconfigundefs32.h b/src/wrapped32/generated/wrappedfontconfigundefs32.h new file mode 100644 index 000000000..91b06d041 --- /dev/null +++ b/src/wrapped32/generated/wrappedfontconfigundefs32.h @@ -0,0 +1,8 @@ +/****************************************************************** + * File automatically generated by rebuild_wrappers_32.py (v0.0.1.1) * + ******************************************************************/ +#ifndef __wrappedfontconfigUNDEFS32_H_ +#define __wrappedfontconfigUNDEFS32_H_ + + +#endif // __wrappedfontconfigUNDEFS32_H_ diff --git a/src/wrapped32/generated/wrapper32.c b/src/wrapped32/generated/wrapper32.c index 85291cf2b..02aa6ed0a 100644 --- a/src/wrapped32/generated/wrapper32.c +++ b/src/wrapped32/generated/wrapper32.c @@ -660,6 +660,7 @@ typedef uint8_t (*CFuuff_t)(uint32_t, uint32_t, float, float); typedef uint32_t (*uFEpii_t)(x64emu_t*, void*, int32_t, int32_t); typedef uint32_t (*uFuuuu_t)(uint32_t, uint32_t, uint32_t, uint32_t); typedef uint32_t (*uFpCCC_t)(void*, uint8_t, uint8_t, uint8_t); +typedef uint32_t (*uFppip_t)(void*, void*, int32_t, void*); typedef intptr_t (*lFEipi_t)(x64emu_t*, int32_t, void*, int32_t); typedef intptr_t (*lFiipL_t)(int32_t, int32_t, void*, uintptr_t); typedef intptr_t (*lFipLi_t)(int32_t, void*, uintptr_t, int32_t); @@ -693,6 +694,7 @@ typedef void* (*pFXppp_t)(void*, void*, void*, void*); typedef int32_t (*iFppbp_p_t)(void*, void*, struct_p_t*, void*); typedef int32_t (*iFBp_pui_t)(struct_p_t*, void*, uint32_t, int32_t); typedef int64_t (*IFpBp_ii_t)(void*, struct_p_t*, int32_t, int32_t); +typedef uint32_t (*uFppiBp__t)(void*, void*, int32_t, struct_p_t*); typedef uint64_t (*UFpBp_ii_t)(void*, struct_p_t*, int32_t, int32_t); typedef intptr_t (*lFiibp_L_t)(int32_t, int32_t, struct_p_t*, uintptr_t); typedef uintptr_t (*LFpbp_Lp_t)(void*, struct_p_t*, uintptr_t, void*); @@ -817,6 +819,7 @@ typedef int32_t (*iFipLLi_t)(int32_t, void*, uintptr_t, uintptr_t, int32_t); typedef int32_t (*iFuiuup_t)(uint32_t, int32_t, uint32_t, uint32_t, void*); typedef int32_t (*iFpCCCC_t)(void*, uint8_t, uint8_t, uint8_t, uint8_t); typedef int32_t (*iFpLuLi_t)(void*, uintptr_t, uint32_t, uintptr_t, int32_t); +typedef int32_t (*iFppiUi_t)(void*, void*, int32_t, uint64_t, int32_t); typedef int32_t (*iFpppip_t)(void*, void*, void*, int32_t, void*); typedef int32_t (*iFpppup_t)(void*, void*, void*, uint32_t, void*); typedef int32_t (*iFppppp_t)(void*, void*, void*, void*, void*); @@ -841,7 +844,7 @@ typedef int32_t (*iFEBh_ppp_t)(x64emu_t*, struct_h_t*, void*, void*, void*); typedef uintptr_t (*LFpbp_LLp_t)(void*, struct_p_t*, uintptr_t, uintptr_t, void*); typedef uintptr_t (*LFpBp_LLp_t)(void*, struct_p_t*, uintptr_t, uintptr_t, void*); typedef int32_t (*iFippprLL__t)(int32_t, void*, void*, void*, struct_LL_t*); -typedef uintptr_t (*LFLbp_bL_Bp_BL__t)(uintptr_t, struct_p_t*, struct_L_t*, struct_p_t*, struct_L_t*); +typedef uintptr_t (*LFLbp_bL_bp_bL__t)(uintptr_t, struct_p_t*, struct_L_t*, struct_p_t*, struct_L_t*); typedef uintptr_t (*LFpLpriiiiiiiiilt_a_t)(void*, uintptr_t, void*, struct_iiiiiiiiilt_t*, void*); typedef int32_t (*iFXLpBLWWWcc_BLWWWcc__t)(void*, uintptr_t, void*, struct_LWWWcc_t*, struct_LWWWcc_t*); typedef void (*vFEiiipp_t)(x64emu_t*, int32_t, int32_t, int32_t, void*, void*); @@ -1729,6 +1732,7 @@ void CFuuff_32(x64emu_t *emu, uintptr_t fcn) { CFuuff_t fn = (CFuuff_t)fcn; R_EA void uFEpii_32(x64emu_t *emu, uintptr_t fcn) { uFEpii_t fn = (uFEpii_t)fcn; R_EAX = (uint32_t)fn(emu, from_ptriv(R_ESP + 4), from_ptri(int32_t, R_ESP + 8), from_ptri(int32_t, R_ESP + 12)); } void uFuuuu_32(x64emu_t *emu, uintptr_t fcn) { uFuuuu_t fn = (uFuuuu_t)fcn; R_EAX = (uint32_t)fn(from_ptri(uint32_t, R_ESP + 4), from_ptri(uint32_t, R_ESP + 8), from_ptri(uint32_t, R_ESP + 12), from_ptri(uint32_t, R_ESP + 16)); } void uFpCCC_32(x64emu_t *emu, uintptr_t fcn) { uFpCCC_t fn = (uFpCCC_t)fcn; R_EAX = (uint32_t)fn(from_ptriv(R_ESP + 4), from_ptri(uint8_t, R_ESP + 8), from_ptri(uint8_t, R_ESP + 12), from_ptri(uint8_t, R_ESP + 16)); } +void uFppip_32(x64emu_t *emu, uintptr_t fcn) { uFppip_t fn = (uFppip_t)fcn; R_EAX = (uint32_t)fn(from_ptriv(R_ESP + 4), from_ptriv(R_ESP + 8), from_ptri(int32_t, R_ESP + 12), from_ptriv(R_ESP + 16)); } void lFEipi_32(x64emu_t *emu, uintptr_t fcn) { lFEipi_t fn = (lFEipi_t)fcn; R_EAX = to_long(fn(emu, from_ptri(int32_t, R_ESP + 4), from_ptriv(R_ESP + 8), from_ptri(int32_t, R_ESP + 12))); } void lFiipL_32(x64emu_t *emu, uintptr_t fcn) { lFiipL_t fn = (lFiipL_t)fcn; R_EAX = to_long(fn(from_ptri(int32_t, R_ESP + 4), from_ptri(int32_t, R_ESP + 8), from_ptriv(R_ESP + 12), to_ulong(from_ptri(ulong_t, R_ESP + 16)))); } void lFipLi_32(x64emu_t *emu, uintptr_t fcn) { lFipLi_t fn = (lFipLi_t)fcn; R_EAX = to_long(fn(from_ptri(int32_t, R_ESP + 4), from_ptriv(R_ESP + 8), to_ulong(from_ptri(ulong_t, R_ESP + 12)), from_ptri(int32_t, R_ESP + 16))); } @@ -1762,6 +1766,7 @@ void pFXppp_32(x64emu_t *emu, uintptr_t fcn) { pFXppp_t fn = (pFXppp_t)fcn; R_EA void iFppbp_p_32(x64emu_t *emu, uintptr_t fcn) { iFppbp_p_t fn = (iFppbp_p_t)fcn; struct_p_t arg_12={0}; from_struct_p(&arg_12, *(ptr_t*)(from_ptr((R_ESP + 12)))); R_EAX = fn(from_ptriv(R_ESP + 4), from_ptriv(R_ESP + 8), *(ptr_t*)(from_ptr((R_ESP + 12))) ? &arg_12 : NULL, from_ptriv(R_ESP + 16)); if (*(ptr_t*)(from_ptr((R_ESP + 12)))) to_struct_p(*(ptr_t*)(from_ptr((R_ESP + 12))), &arg_12); } void iFBp_pui_32(x64emu_t *emu, uintptr_t fcn) { iFBp_pui_t fn = (iFBp_pui_t)fcn; struct_p_t arg_4={0}; R_EAX = fn(*(ptr_t*)(from_ptr((R_ESP + 4))) ? &arg_4 : NULL, from_ptriv(R_ESP + 8), from_ptri(uint32_t, R_ESP + 12), from_ptri(int32_t, R_ESP + 16)); if (*(ptr_t*)(from_ptr((R_ESP + 4)))) to_struct_p(*(ptr_t*)(from_ptr((R_ESP + 4))), &arg_4); } void IFpBp_ii_32(x64emu_t *emu, uintptr_t fcn) { IFpBp_ii_t fn = (IFpBp_ii_t)fcn; struct_p_t arg_8={0}; ui64_t r; r.i = fn(from_ptriv(R_ESP + 4), *(ptr_t*)(from_ptr((R_ESP + 8))) ? &arg_8 : NULL, from_ptri(int32_t, R_ESP + 12), from_ptri(int32_t, R_ESP + 16)); R_EAX = r.d[0]; R_EDX = r.d[1]; if (*(ptr_t*)(from_ptr((R_ESP + 8)))) to_struct_p(*(ptr_t*)(from_ptr((R_ESP + 8))), &arg_8); } +void uFppiBp__32(x64emu_t *emu, uintptr_t fcn) { uFppiBp__t fn = (uFppiBp__t)fcn; struct_p_t arg_16={0}; R_EAX = (uint32_t)fn(from_ptriv(R_ESP + 4), from_ptriv(R_ESP + 8), from_ptri(int32_t, R_ESP + 12), *(ptr_t*)(from_ptr((R_ESP + 16))) ? &arg_16 : NULL); if (*(ptr_t*)(from_ptr((R_ESP + 16)))) to_struct_p(*(ptr_t*)(from_ptr((R_ESP + 16))), &arg_16); } void UFpBp_ii_32(x64emu_t *emu, uintptr_t fcn) { UFpBp_ii_t fn = (UFpBp_ii_t)fcn; struct_p_t arg_8={0}; ui64_t r; r.u = (uint64_t)fn(from_ptriv(R_ESP + 4), *(ptr_t*)(from_ptr((R_ESP + 8))) ? &arg_8 : NULL, from_ptri(int32_t, R_ESP + 12), from_ptri(int32_t, R_ESP + 16)); R_EAX = r.d[0]; R_EDX = r.d[1]; if (*(ptr_t*)(from_ptr((R_ESP + 8)))) to_struct_p(*(ptr_t*)(from_ptr((R_ESP + 8))), &arg_8); } void lFiibp_L_32(x64emu_t *emu, uintptr_t fcn) { lFiibp_L_t fn = (lFiibp_L_t)fcn; struct_p_t arg_12={0}; from_struct_p(&arg_12, *(ptr_t*)(from_ptr((R_ESP + 12)))); R_EAX = to_long(fn(from_ptri(int32_t, R_ESP + 4), from_ptri(int32_t, R_ESP + 8), *(ptr_t*)(from_ptr((R_ESP + 12))) ? &arg_12 : NULL, to_ulong(from_ptri(ulong_t, R_ESP + 16)))); if (*(ptr_t*)(from_ptr((R_ESP + 12)))) to_struct_p(*(ptr_t*)(from_ptr((R_ESP + 12))), &arg_12); } void LFpbp_Lp_32(x64emu_t *emu, uintptr_t fcn) { LFpbp_Lp_t fn = (LFpbp_Lp_t)fcn; struct_p_t arg_8={0}; from_struct_p(&arg_8, *(ptr_t*)(from_ptr((R_ESP + 8)))); R_EAX = to_ulong(fn(from_ptriv(R_ESP + 4), *(ptr_t*)(from_ptr((R_ESP + 8))) ? &arg_8 : NULL, to_ulong(from_ptri(ulong_t, R_ESP + 12)), from_ptriv(R_ESP + 16))); if (*(ptr_t*)(from_ptr((R_ESP + 8)))) to_struct_p(*(ptr_t*)(from_ptr((R_ESP + 8))), &arg_8); } @@ -1886,6 +1891,7 @@ void iFipLLi_32(x64emu_t *emu, uintptr_t fcn) { iFipLLi_t fn = (iFipLLi_t)fcn; R void iFuiuup_32(x64emu_t *emu, uintptr_t fcn) { iFuiuup_t fn = (iFuiuup_t)fcn; R_EAX = fn(from_ptri(uint32_t, R_ESP + 4), from_ptri(int32_t, R_ESP + 8), from_ptri(uint32_t, R_ESP + 12), from_ptri(uint32_t, R_ESP + 16), from_ptriv(R_ESP + 20)); } void iFpCCCC_32(x64emu_t *emu, uintptr_t fcn) { iFpCCCC_t fn = (iFpCCCC_t)fcn; R_EAX = fn(from_ptriv(R_ESP + 4), from_ptri(uint8_t, R_ESP + 8), from_ptri(uint8_t, R_ESP + 12), from_ptri(uint8_t, R_ESP + 16), from_ptri(uint8_t, R_ESP + 20)); } void iFpLuLi_32(x64emu_t *emu, uintptr_t fcn) { iFpLuLi_t fn = (iFpLuLi_t)fcn; R_EAX = fn(from_ptriv(R_ESP + 4), to_ulong(from_ptri(ulong_t, R_ESP + 8)), from_ptri(uint32_t, R_ESP + 12), to_ulong(from_ptri(ulong_t, R_ESP + 16)), from_ptri(int32_t, R_ESP + 20)); } +void iFppiUi_32(x64emu_t *emu, uintptr_t fcn) { iFppiUi_t fn = (iFppiUi_t)fcn; R_EAX = fn(from_ptriv(R_ESP + 4), from_ptriv(R_ESP + 8), from_ptri(int32_t, R_ESP + 12), from_ptri(uint64_t, R_ESP + 16), from_ptri(int32_t, R_ESP + 24)); } void iFpppip_32(x64emu_t *emu, uintptr_t fcn) { iFpppip_t fn = (iFpppip_t)fcn; R_EAX = fn(from_ptriv(R_ESP + 4), from_ptriv(R_ESP + 8), from_ptriv(R_ESP + 12), from_ptri(int32_t, R_ESP + 16), from_ptriv(R_ESP + 20)); } void iFpppup_32(x64emu_t *emu, uintptr_t fcn) { iFpppup_t fn = (iFpppup_t)fcn; R_EAX = fn(from_ptriv(R_ESP + 4), from_ptriv(R_ESP + 8), from_ptriv(R_ESP + 12), from_ptri(uint32_t, R_ESP + 16), from_ptriv(R_ESP + 20)); } void iFppppp_32(x64emu_t *emu, uintptr_t fcn) { iFppppp_t fn = (iFppppp_t)fcn; R_EAX = fn(from_ptriv(R_ESP + 4), from_ptriv(R_ESP + 8), from_ptriv(R_ESP + 12), from_ptriv(R_ESP + 16), from_ptriv(R_ESP + 20)); } @@ -1910,7 +1916,7 @@ void iFEBh_ppp_32(x64emu_t *emu, uintptr_t fcn) { iFEBh_ppp_t fn = (iFEBh_ppp_t) void LFpbp_LLp_32(x64emu_t *emu, uintptr_t fcn) { LFpbp_LLp_t fn = (LFpbp_LLp_t)fcn; struct_p_t arg_8={0}; from_struct_p(&arg_8, *(ptr_t*)(from_ptr((R_ESP + 8)))); R_EAX = to_ulong(fn(from_ptriv(R_ESP + 4), *(ptr_t*)(from_ptr((R_ESP + 8))) ? &arg_8 : NULL, to_ulong(from_ptri(ulong_t, R_ESP + 12)), to_ulong(from_ptri(ulong_t, R_ESP + 16)), from_ptriv(R_ESP + 20))); if (*(ptr_t*)(from_ptr((R_ESP + 8)))) to_struct_p(*(ptr_t*)(from_ptr((R_ESP + 8))), &arg_8); } void LFpBp_LLp_32(x64emu_t *emu, uintptr_t fcn) { LFpBp_LLp_t fn = (LFpBp_LLp_t)fcn; struct_p_t arg_8={0}; R_EAX = to_ulong(fn(from_ptriv(R_ESP + 4), *(ptr_t*)(from_ptr((R_ESP + 8))) ? &arg_8 : NULL, to_ulong(from_ptri(ulong_t, R_ESP + 12)), to_ulong(from_ptri(ulong_t, R_ESP + 16)), from_ptriv(R_ESP + 20))); if (*(ptr_t*)(from_ptr((R_ESP + 8)))) to_struct_p(*(ptr_t*)(from_ptr((R_ESP + 8))), &arg_8); } void iFippprLL__32(x64emu_t *emu, uintptr_t fcn) { iFippprLL__t fn = (iFippprLL__t)fcn; struct_LL_t arg_20={0}; from_struct_LL(&arg_20, *(ptr_t*)(from_ptr((R_ESP + 20)))); R_EAX = fn(from_ptri(int32_t, R_ESP + 4), from_ptriv(R_ESP + 8), from_ptriv(R_ESP + 12), from_ptriv(R_ESP + 16), *(ptr_t*)(from_ptr((R_ESP + 20))) ? &arg_20 : NULL); } -void LFLbp_bL_Bp_BL__32(x64emu_t *emu, uintptr_t fcn) { LFLbp_bL_Bp_BL__t fn = (LFLbp_bL_Bp_BL__t)fcn; struct_p_t arg_8={0}; from_struct_p(&arg_8, *(ptr_t*)(from_ptr((R_ESP + 8)))); struct_L_t arg_12={0}; from_struct_L(&arg_12, *(ptr_t*)(from_ptr((R_ESP + 12)))); struct_p_t arg_16={0}; struct_L_t arg_20={0}; R_EAX = to_ulong(fn(to_ulong(from_ptri(ulong_t, R_ESP + 4)), *(ptr_t*)(from_ptr((R_ESP + 8))) ? &arg_8 : NULL, *(ptr_t*)(from_ptr((R_ESP + 12))) ? &arg_12 : NULL, *(ptr_t*)(from_ptr((R_ESP + 16))) ? &arg_16 : NULL, *(ptr_t*)(from_ptr((R_ESP + 20))) ? &arg_20 : NULL)); if (*(ptr_t*)(from_ptr((R_ESP + 8)))) to_struct_p(*(ptr_t*)(from_ptr((R_ESP + 8))), &arg_8); if (*(ptr_t*)(from_ptr((R_ESP + 12)))) to_struct_L(*(ptr_t*)(from_ptr((R_ESP + 12))), &arg_12); if (*(ptr_t*)(from_ptr((R_ESP + 16)))) to_struct_p(*(ptr_t*)(from_ptr((R_ESP + 16))), &arg_16); if (*(ptr_t*)(from_ptr((R_ESP + 20)))) to_struct_L(*(ptr_t*)(from_ptr((R_ESP + 20))), &arg_20); } +void LFLbp_bL_bp_bL__32(x64emu_t *emu, uintptr_t fcn) { LFLbp_bL_bp_bL__t fn = (LFLbp_bL_bp_bL__t)fcn; struct_p_t arg_8={0}; from_struct_p(&arg_8, *(ptr_t*)(from_ptr((R_ESP + 8)))); struct_L_t arg_12={0}; from_struct_L(&arg_12, *(ptr_t*)(from_ptr((R_ESP + 12)))); struct_p_t arg_16={0}; from_struct_p(&arg_16, *(ptr_t*)(from_ptr((R_ESP + 16)))); struct_L_t arg_20={0}; from_struct_L(&arg_20, *(ptr_t*)(from_ptr((R_ESP + 20)))); R_EAX = to_ulong(fn(to_ulong(from_ptri(ulong_t, R_ESP + 4)), *(ptr_t*)(from_ptr((R_ESP + 8))) ? &arg_8 : NULL, *(ptr_t*)(from_ptr((R_ESP + 12))) ? &arg_12 : NULL, *(ptr_t*)(from_ptr((R_ESP + 16))) ? &arg_16 : NULL, *(ptr_t*)(from_ptr((R_ESP + 20))) ? &arg_20 : NULL)); if (*(ptr_t*)(from_ptr((R_ESP + 8)))) to_struct_p(*(ptr_t*)(from_ptr((R_ESP + 8))), &arg_8); if (*(ptr_t*)(from_ptr((R_ESP + 12)))) to_struct_L(*(ptr_t*)(from_ptr((R_ESP + 12))), &arg_12); if (*(ptr_t*)(from_ptr((R_ESP + 16)))) to_struct_p(*(ptr_t*)(from_ptr((R_ESP + 16))), &arg_16); if (*(ptr_t*)(from_ptr((R_ESP + 20)))) to_struct_L(*(ptr_t*)(from_ptr((R_ESP + 20))), &arg_20); } void LFpLpriiiiiiiiilt_a_32(x64emu_t *emu, uintptr_t fcn) { LFpLpriiiiiiiiilt_a_t fn = (LFpLpriiiiiiiiilt_a_t)fcn; struct_iiiiiiiiilt_t arg_16={0}; from_struct_iiiiiiiiilt(&arg_16, *(ptr_t*)(from_ptr((R_ESP + 16)))); R_EAX = to_ulong(fn(from_ptriv(R_ESP + 4), to_ulong(from_ptri(ulong_t, R_ESP + 8)), from_ptriv(R_ESP + 12), *(ptr_t*)(from_ptr((R_ESP + 16))) ? &arg_16 : NULL, from_locale(from_ptri(ptr_t, R_ESP + 20)))); } void iFXLpBLWWWcc_BLWWWcc__32(x64emu_t *emu, uintptr_t fcn) { iFXLpBLWWWcc_BLWWWcc__t fn = (iFXLpBLWWWcc_BLWWWcc__t)fcn; struct_LWWWcc_t arg_16={0}; struct_LWWWcc_t arg_20={0}; R_EAX = fn(getDisplay(from_ptriv(R_ESP + 4)), to_ulong(from_ptri(ulong_t, R_ESP + 8)), from_ptriv(R_ESP + 12), *(ptr_t*)(from_ptr((R_ESP + 16))) ? &arg_16 : NULL, *(ptr_t*)(from_ptr((R_ESP + 20))) ? &arg_20 : NULL); if (*(ptr_t*)(from_ptr((R_ESP + 16)))) to_struct_LWWWcc(*(ptr_t*)(from_ptr((R_ESP + 16))), &arg_16); if (*(ptr_t*)(from_ptr((R_ESP + 20)))) to_struct_LWWWcc(*(ptr_t*)(from_ptr((R_ESP + 20))), &arg_20); } void vFEiiipp_32(x64emu_t *emu, uintptr_t fcn) { vFEiiipp_t fn = (vFEiiipp_t)fcn; fn(emu, from_ptri(int32_t, R_ESP + 4), from_ptri(int32_t, R_ESP + 8), from_ptri(int32_t, R_ESP + 12), from_ptriv(R_ESP + 16), from_ptriv(R_ESP + 20)); } diff --git a/src/wrapped32/generated/wrapper32.h b/src/wrapped32/generated/wrapper32.h index fa52aa491..9a738282f 100644 --- a/src/wrapped32/generated/wrapper32.h +++ b/src/wrapped32/generated/wrapper32.h @@ -611,6 +611,7 @@ void CFuuff_32(x64emu_t *emu, uintptr_t fnc); void uFEpii_32(x64emu_t *emu, uintptr_t fnc); void uFuuuu_32(x64emu_t *emu, uintptr_t fnc); void uFpCCC_32(x64emu_t *emu, uintptr_t fnc); +void uFppip_32(x64emu_t *emu, uintptr_t fnc); void lFEipi_32(x64emu_t *emu, uintptr_t fnc); void lFiipL_32(x64emu_t *emu, uintptr_t fnc); void lFipLi_32(x64emu_t *emu, uintptr_t fnc); @@ -644,6 +645,7 @@ void pFXppp_32(x64emu_t *emu, uintptr_t fnc); void iFppbp_p_32(x64emu_t *emu, uintptr_t fnc); void iFBp_pui_32(x64emu_t *emu, uintptr_t fnc); void IFpBp_ii_32(x64emu_t *emu, uintptr_t fnc); +void uFppiBp__32(x64emu_t *emu, uintptr_t fnc); void UFpBp_ii_32(x64emu_t *emu, uintptr_t fnc); void lFiibp_L_32(x64emu_t *emu, uintptr_t fnc); void LFpbp_Lp_32(x64emu_t *emu, uintptr_t fnc); @@ -768,6 +770,7 @@ void iFipLLi_32(x64emu_t *emu, uintptr_t fnc); void iFuiuup_32(x64emu_t *emu, uintptr_t fnc); void iFpCCCC_32(x64emu_t *emu, uintptr_t fnc); void iFpLuLi_32(x64emu_t *emu, uintptr_t fnc); +void iFppiUi_32(x64emu_t *emu, uintptr_t fnc); void iFpppip_32(x64emu_t *emu, uintptr_t fnc); void iFpppup_32(x64emu_t *emu, uintptr_t fnc); void iFppppp_32(x64emu_t *emu, uintptr_t fnc); @@ -792,7 +795,7 @@ void iFEBh_ppp_32(x64emu_t *emu, uintptr_t fnc); void LFpbp_LLp_32(x64emu_t *emu, uintptr_t fnc); void LFpBp_LLp_32(x64emu_t *emu, uintptr_t fnc); void iFippprLL__32(x64emu_t *emu, uintptr_t fnc); -void LFLbp_bL_Bp_BL__32(x64emu_t *emu, uintptr_t fnc); +void LFLbp_bL_bp_bL__32(x64emu_t *emu, uintptr_t fnc); void LFpLpriiiiiiiiilt_a_32(x64emu_t *emu, uintptr_t fnc); void iFXLpBLWWWcc_BLWWWcc__32(x64emu_t *emu, uintptr_t fnc); void vFEiiipp_32(x64emu_t *emu, uintptr_t fnc); diff --git a/src/wrapped32/wrappedfontconfig.c b/src/wrapped32/wrappedfontconfig.c new file mode 100644 index 000000000..532942f56 --- /dev/null +++ b/src/wrapped32/wrappedfontconfig.c @@ -0,0 +1,229 @@ +#define _GNU_SOURCE /* See feature_test_macros(7) */ +#include +#include +#include +#include + +#include "wrappedlibs.h" + +#include "debug.h" +#include "wrapper32.h" +#include "bridge.h" +#include "librarian/library_private.h" +#include "x64emu.h" +#include "emu/x64emu_private.h" +#include "callback.h" +#include "librarian.h" +#include "box32context.h" +#include "emu/x64emu_private.h" +#include "myalign32.h" + +typedef struct FcValue_s { + int type; + union { + const char *s; + int i; + int b; + double d; + void *m; //const FcMatrix + void *c; //const FcCharSet + void *f; + void *l; //const FcLangSet + } u; +} FcValue_t; + +typedef struct FcPattern_s { + int num; + int size; + intptr_t elts_offset; + int ref; +} FcPattern_t; + +typedef struct FcFontSet_s { + int nfont; + int sfont; + FcPattern_t **fonts; +} FcFontSet_t; + +typedef struct FcStrSet_s { + int ref; + int num; + int size; + void **strs; +} FcStrSet_t; + +typedef struct FcBlanks_s { + int nblank; + int sblank; + void *blanks; +} FcBlanks_t; + +typedef struct FcConfig_s { + FcStrSet_t *configDirs; + FcBlanks_t *blanks; + FcStrSet_t *fontDirs; + FcStrSet_t *cacheDirs; + FcStrSet_t *configFiles; + void *substPattern; //FcSubst + void *substFont; //FcSubst + void *substScan; //FcSubst + int maxObjects; + FcStrSet_t *acceptGlobs; + FcStrSet_t *rejectGlobs; + FcFontSet_t *acceptPatterns; + FcFontSet_t *rejectPatterns; + FcFontSet_t *fonts[2]; + time_t rescanTime; + int rescanInterval; + int ref; + void *expr_pool; //FcExprPage +} FcConfig_t; + +// 32bits structures + +typedef struct FcValue_32_s { + int type; + union { + ptr_t s;//const char * + int i; + int b; + double d; + ptr_t m; //const FcMatrix* + ptr_t c; //const FcCharSet* + ptr_t f; //void* + ptr_t l; //const FcLangSet* + } u; +} FcValue_32_t; + +typedef struct FcPattern_32_s { + int num; + int size; + long_t elts_offset; + int ref; +} FcPattern_32_t; + +typedef struct FcFontSet_32_s { + int nfont; + int sfont; + ptr_t fonts;//FcPattern_t ** +} FcFontSet_32_t; + +typedef struct FcStrSet_32_s { + int ref; + int num; + int size; + ptr_t strs; //void ** +} FcStrSet_32_t; + +typedef struct FcBlanks_32_s { + int nblank; + int sblank; + ptr_t blanks; //void * +} FcBlanks_32_t; + +typedef struct FcConfig_32_s { + ptr_t configDirs; //FcStrSet_t* + ptr_t blanks; //FcBlanks_t* + ptr_t fontDirs; //FcStrSet_t* + ptr_t cacheDirs; //FcStrSet_t* + ptr_t configFiles; //FcStrSet_t* + ptr_t substPattern; //FcSubst* + ptr_t substFont; //FcSubst* + ptr_t substScan; //FcSubst* + int maxObjects; + ptr_t acceptGlobs; //FcStrSet_t* + ptr_t rejectGlobs; //FcStrSet_t* + ptr_t acceptPatterns; //FcFontSet_t* + ptr_t rejectPatterns; //FcFontSet_t* + ptr_t fonts[2]; //FcFontSet_t* + long_t rescanTime; + int rescanInterval; + int ref; + ptr_t expr_pool; //FcExprPage* +} FcConfig_32_t; + +#ifdef ANDROID + static const char* fontconfigName = "libfontconfig.so"; +#else + static const char* fontconfigName = "libfontconfig.so.1"; +#endif + +#define LIBNAME fontconfig + +//#define ADDED_FUNCTIONS() \ + +//#include "generated/wrappedfontconfigtypes32.h" + +typedef int (*iFppSi_t)(void*, void*, FcValue_t, int); + +#define SUPER() \ + GO(FcPatternAdd, iFppSi_t) \ + +#include "wrappercallback32.h" + +//EXPORT void* my_FcObjectSetVaBuild(x64emu_t* emu, void* first, x64_va_list_t V) +//{ +// #ifdef CONVERT_VALIST +// CONVERT_VALIST(V); +// #else +// CREATE_VALIST_FROM_VALIST(V, emu->scratch); +// #endif +// return my->FcObjectSetVaBuild(first, VARARGS); +//} +//EXPORT void* my_FcObjectSetBuild(x64emu_t* emu, void* first, uint64_t* b) +//{ +// if(!first) +// return my->FcObjectSetBuild(first, NULL); +// CREATE_VALIST_FROM_VAARG(b, emu->scratch, 1); +// return my->FcObjectSetVaBuild(first, VARARGS); +//} + +//EXPORT void* my_FcPatternVaBuild(x64emu_t* emu, void* pattern, x64_va_list_t V) +//{ +// #ifdef CONVERT_VALIST +// CONVERT_VALIST(V); +// #else +// CREATE_VALIST_FROM_VALIST(V, emu->scratch); +// #endif +// return my->FcPatternVaBuild(pattern, VARARGS); +//} +//EXPORT void* my_FcPatternBuild(x64emu_t* emu, void* pattern, uint64_t* b) +//{ +// if(!pattern) +// return my->FcPatternBuild(pattern, NULL); +// CREATE_VALIST_FROM_VAARG(b, emu->scratch, 1); +// return my->FcPatternVaBuild(pattern, VARARGS); +//} + +typedef union fcvalue_32s { + ptr_t p; + double d; + int i; +} fcvalue_32_t; +EXPORT int my32_FcPatternAdd(void* p, void* object, int type, fcvalue_32_t t, int append) +{ + // adjusting value "t" of the FcValue + FcValue_t val = {0}; + val.type = type; + switch(type) { + case 3: + case 5: + case 6: + case 7: + case 8: + case 9: + val.u.c = from_ptrv(t.p); + break; + case 2: + val.u.d = t.d; + case 1: + case 4: // just in case + val.u.i = t.i; + break; + } + return my->FcPatternAdd(p, object, val, append); +} + +#define NEEDED_LIBS "libexpat.so.1", "libfreetype.so.6" + +#include "wrappedlib_init32.h" diff --git a/src/wrapped32/wrappedfontconfig_private.h b/src/wrapped32/wrappedfontconfig_private.h new file mode 100644 index 000000000..f833ac19e --- /dev/null +++ b/src/wrapped32/wrappedfontconfig_private.h @@ -0,0 +1,204 @@ +#if !(defined(GO) && defined(GOM) && defined(GO2) && defined(DATA)) +#error Meh... +#endif + +// FcValue is a typedef with int+union, with biggest part is a double => so 3 "u32" on the stack + +//GO(FcAtomicCreate, pFp) +//GO(FcAtomicDeleteNew, vFp) +//GO(FcAtomicDestroy, vFp) +//GO(FcAtomicLock, iFp) +//GO(FcAtomicNewFile, pFp) +//GO(FcAtomicOrigFile, pFp) +//GO(FcAtomicReplaceOrig, iFp) +//GO(FcAtomicUnlock, vFp) +//GO(FcBlanksAdd, iFpu) +//GO(FcBlanksCreate, pFv) +//GO(FcBlanksDestroy, vFp) +//GO(FcBlanksIsMember, iFpu) +//GO(FcCacheCopySet, pFp) +//GO(FcCacheDir, pFp) +//GO(FcCacheNumFont, iFp) +//GO(FcCacheNumSubdir, iFp) +//GO(FcCacheSubdir, pFpi) +//GO(FcCharSetAddChar, iFpu) +//GO(FcCharSetCopy, pFp) +//GO(FcCharSetCount, uFp) +//GO(FcCharSetCoverage, uFpup) +//GO(FcCharSetCreate, pFv) +//GO(FcCharSetDestroy, vFp) +//GO(FcCharSetEqual, iFpp) +//GO(FcCharSetFirstPage, uFppp) // second p is a fixed sized array +//GO(FcCharSetHasChar, iFpu) +//GO(FcCharSetIntersect, pFpp) +//GO(FcCharSetIntersectCount, uFpp) +//GO(FcCharSetIsSubset, iFpp) +//GO(FcCharSetMerge, iFppp) +//GO(FcCharSetNew, pFv) +//GO(FcCharSetNextPage, uFppp) +//GO(FcCharSetSubtract, pFpp) +//GO(FcCharSetSubtractCount, uFpp) +//GO(FcCharSetUnion, pFpp) +//GO(FcConfigAppFontAddDir, iFpp) +//GO(FcConfigAppFontAddFile, iFpp) +//GO(FcConfigAppFontClear, vFp) +//GO(FcConfigBuildFonts, iFp) +//GO(FcConfigCreate, pFv) +//GO(FcConfigDestroy, vFp) +//GO(FcConfigEnableHome, iFi) +//GO(FcConfigFilename, pFp) +//GO(FcConfigGetBlanks, pFp) +//GO(FcConfigGetCache, pFp) +//GO(FcConfigGetCacheDirs, pFp) +//GO(FcConfigGetConfigDirs, pFp) +//GO(FcConfigGetConfigFiles, pFp) +GO(FcConfigGetCurrent, pFv) // need wrapping for FcConfig? +//GO(FcConfigGetFontDirs, pFp) +//GO(FcConfigGetFonts, pFpu) +//GO(FcConfigGetRescanInterval, iFp) +//GO(FcConfigGetRescanInverval, +//GO(FcConfigGetSysRoot, pFp) +//GO(FcConfigHome, pFv) +//GO(FcConfigParseAndLoad, iFppi) +//GO(FcConfigReference, pFp) +//GO(FcConfigSetCurrent, iFp) +//GO(FcConfigSetRescanInterval, iFpi) +//GO(FcConfigSetRescanInverval, +GO(FcConfigSubstitute, iFppu) // might need wrapping, 1st arg is FcConfig +//GO(FcConfigSubstituteWithPat, iFpppu) +//GO(FcConfigUptoDate, iFp) +GO(FcDefaultSubstitute, vFp) +//GO(FcDirCacheLoad, pFppp) +//GO(FcDirCacheLoadFile, pFpp) +//GO(FcDirCacheRead, pFpip) +//GO(FcDirCacheUnlink, iFpp) +//GO(FcDirCacheUnload, vFp) +//GO(FcDirCacheValid, iFp) +//GO(FcDirSave, iFppp) +//GO(FcDirScan, iFpppppi) +//GO(FcFileIsDir, iFp) +//GO(FcFileScan, iFpppppi) +//GO(FcFini, vFv) +GO(FcFontList, pFppp) // need wrapping of returned FcFontSet? +GO(FcFontMatch, pFppp) +//GO(FcFontRenderPrepare, pFppp) +//GO(FcFontSetAdd, iFpp) +//GO(FcFontSetCreate, pFv) +GO(FcFontSetDestroy, vFp) +//GO(FcFontSetList, pFppipp) +//GO(FcFontSetMatch, pFppipp) +//GO(FcFontSetPrint, vFp) +//GO(FcFontSetSort, pFppipipp) +//GO(FcFontSetSortDestroy, vFp) +//GO(FcFontSort, pFppipp) +//GO(FcFreeTypeCharIndex, uFpu) +//GO(FcFreeTypeCharSet, +//GO(FcFreeTypeCharSetAndSpacing, +//GO(FcFreeTypeQuery, pFpupp) +//GO(FcFreeTypeQueryFace, pFppip) +//GO(FcGetLangs, pFv) +GO(FcGetVersion, iFv) +GO(FcInit, iFv) +GO(FcInitBringUptoDate, iFv) +//GO(FcInitLoadConfig, pFv) +//GO(FcInitLoadConfigAndFonts, pFv) +GO(FcInitReinitialize, iFv) +//GO(FcLangGetCharSet, pFp) +//GO(FcLangSetAdd, iFpp) +//GO(FcLangSetCompare, uFpp) +//GO(FcLangSetContains, iFpp) +//GO(FcLangSetCopy, pFp) +//GO(FcLangSetCreate, pFv) +//GO(FcLangSetDestroy, vFp) +//GO(FcLangSetEqual, iFpp) +//GO(FcLangSetGetLangs, pFp) +//GO(FcLangSetHash, uFp) +//GO(FcLangSetHasLang, uFpp) +//GO(FcMatrixCopy, pFp) +//GO(FcMatrixEqual, iFpp) +//GO(FcMatrixMultiply, vFppp) +//GO(FcMatrixRotate, vFpdd) +//GO(FcMatrixScale, vFpdd) +//GO(FcMatrixShear, vFpdd) +//GO(FcNameConstant, iFpp) +//GO(FcNameGetConstant, pFp) +//GO(FcNameGetObjectType, pFp) +//GO(FcNameParse, pFp) +//GO(FcNameRegisterConstants, iFpi) +//GO(FcNameRegisterObjectTypes, iFpi) +//GO(FcNameUnparse, pFp) +//GO(FcNameUnregisterConstants, iFpi) +//GO(FcNameUnregisterObjectTypes, iFpi) +GO(FcObjectSetAdd, iFpp) +//GOM(FcObjectSetBuild, pFEpV) +GO(FcObjectSetCreate, pFv) +GO(FcObjectSetDestroy, vFp) +//GOM(FcObjectSetVaBuild, pFEpA) +GOM(FcPatternAdd, iFppiUi) //%noE //need M for the iU that is a an FcValue +//GO(FcPatternAddBool, iFppi) +//GO(FcPatternAddCharSet, iFppp) +//GO(FcPatternAddDouble, iFppd) +//GO(FcPatternAddFTFace, iFppp) +//GO(FcPatternAddInteger, iFppi) +//GO(FcPatternAddLangSet, iFppp) +//GO(FcPatternAddMatrix, iFppp) +//GO(FcPatternAddString, iFppp) +//GO(FcPatternAddWeak, iFppiLi) +//GOM(FcPatternBuild, pFEpV) +GO(FcPatternCreate, pFv) +//GO(FcPatternDel, iFpp) +GO(FcPatternDestroy, vFp) +//GO(FcPatternDuplicate, pFp) +//GO(FcPatternEqual, iFpp) +//GO(FcPatternEqualSubset, iFppp) +//GO(FcPatternFilter, pFpp) +//GO(FcPatternFormat, pFpp) +//GO(FcPatternGet, uFppip) +GO(FcPatternGetBool, uFppip) +//GO(FcPatternGetCharSet, uFppip) +//GO(FcPatternGetDouble, uFppip) +//GO(FcPatternGetFTFace, iFppip) +//GO(FcPatternGetInteger, uFppip) +//GO(FcPatternGetLangSet, uFppip) +//GO(FcPatternGetMatrix, uFppip) +GO(FcPatternGetString, uFppiBp_) +//GO(FcPatternHash, uFp) +//GO(FcPatternPrint, vFp) +//GO(FcPatternReference, vFp) +//GO(FcPatternRemove, iFppi) +//GOM(FcPatternVaBuild, pFEpA) +//GO(FcStrBasename, pFp) +//GO(FcStrCmp, iFpp) +//GO(FcStrCmpIgnoreCase, iFpp) +//GO(FcStrCopy, pFp) +//GO(FcStrCopyFilename, pFp) +//GO(FcStrDirname, pFp) +//GO(FcStrDowncase, pFp) +//GO(FcStrFree, vFp) +//GO(FcStrListCreate, pFp) +//GO(FcStrListDone, vFp) +//GO(FcStrListFirst, vFp) +//GO(FcStrListNext, pFp) +//GO(FcStrPlus, pFpp) +//GO(FcStrSetAdd, iFpp) +//GO(FcStrSetAddFilename, iFpp) +//GO(FcStrSetCreate, pFv) +//GO(FcStrSetDel, iFpp) +//GO(FcStrSetDestroy, vFp) +//GO(FcStrSetEqual, iFpp) +//GO(FcStrSetMember, iFpp) +//GO(FcStrStr, pFpp) +//GO(FcStrStrIgnoreCase, pFpp) +//GO(FcUcs4ToUtf8, iFup) +//GO(FcUtf16Len, iFpuipp) +//GO(FcUtf16ToUcs4, iFpupi) +//GO(FcUtf8Len, iFpipp) +//GO(FcUtf8ToUcs4, iFppi) +//GO(FcValueDestroy, +//GO(FcValueEqual, +//GO(FcValuePrint, +//GO(FcValueSave, +//GO(FcWeightFromOpenTypeDouble, dFd) +//GO(FcWeightToOpenTypeDouble, dFd) +//GO(_fini, +//GO(_init, diff --git a/src/wrapped32/wrappedlibc_private.h b/src/wrapped32/wrappedlibc_private.h index 9fa0fe6e9..03bc0193f 100755 --- a/src/wrapped32/wrappedlibc_private.h +++ b/src/wrapped32/wrappedlibc_private.h @@ -652,7 +652,7 @@ GOM(__h_errno_location, pFEv) //GO(hstrerror, pFi) GO(htonl, uFu) GO(htons, uFu) -GO(iconv, LFLbp_bL_Bp_BL_) +GO(iconv, LFLbp_bL_bp_bL_) //GO(iconv_canonicalize, pFp) GO(iconv_close, iFL) GO(iconv_open, pFpp)