From de6724017de723175c3a561abeaaf75ab293fdb7 Mon Sep 17 00:00:00 2001 From: sebastianting Date: Sun, 22 Mar 2026 23:27:14 -0400 Subject: [PATCH] fix: iconv to/from unpacking order and calling convention (#126) (#127) swapped unpacking order of to and from and caller parameters removed null terminator adding at end changed call from stdcall to cdecl --- programs/cmm/lib/obj/iconv.h | 4 ++-- programs/develop/libraries/iconv/iconv.c | 7 +++---- 2 files changed, 5 insertions(+), 6 deletions(-) diff --git a/programs/cmm/lib/obj/iconv.h b/programs/cmm/lib/obj/iconv.h index 46c0b1211..ab257cf1d 100644 --- a/programs/cmm/lib/obj/iconv.h +++ b/programs/cmm/lib/obj/iconv.h @@ -27,7 +27,7 @@ dword ChangeCharset(dword from_chs, to_chs, conv_buf) { dword cd, in_len, out_len, new_buf; - iconv_open stdcall (from_chs*10+#charsets, to_chs*10+#charsets); + iconv_open cdecl (to_chs*10+#charsets, from_chs*10+#charsets); if (EAX==-1) { debugln("iconv: unsupported charset"); return 0; @@ -37,7 +37,7 @@ dword ChangeCharset(dword from_chs, to_chs, conv_buf) in_len = strlen(conv_buf)+1; out_len = in_len * 2; new_buf = mem_Alloc(out_len); - iconv stdcall (cd, #conv_buf, #in_len, #new_buf, #out_len); + iconv cdecl (cd, #conv_buf, #in_len, #new_buf, #out_len); if (EAX!=0) { cd = EAX; diff --git a/programs/develop/libraries/iconv/iconv.c b/programs/develop/libraries/iconv/iconv.c index 4c4d23c84..6ca65e828 100644 --- a/programs/develop/libraries/iconv/iconv.c +++ b/programs/develop/libraries/iconv/iconv.c @@ -64,8 +64,8 @@ size_t iconv(iconv_t cd, const char **inbuf, size_t *inbytesleft, char **outbuf, char *str; str=*outbuf; - from=cd>>16; - to=cd&0xFFFF; + to=cd>>16; + from=cd&0xFFFF; switch (from) { @@ -92,7 +92,7 @@ size_t iconv(iconv_t cd, const char **inbuf, size_t *inbytesleft, char **outbuf, count1=0; count2=0; - while ( *inbytesleft>0 && *outbytesleft>1) + while (*inbytesleft>0 && *outbytesleft>1) { n=1; @@ -116,7 +116,6 @@ size_t iconv(iconv_t cd, const char **inbuf, size_t *inbytesleft, char **outbuf, count1+=converted; count2+=written; } - *(str+count2)='\0'; if (*inbytesleft>0 && *outbytesleft==0) return -12; return 0;