From 63ff3724007d6df302e9dc35733c1bfb3b968341 Mon Sep 17 00:00:00 2001 From: Maxim Logaev Date: Thu, 6 Mar 2025 01:41:57 +0300 Subject: [PATCH] Libs/iconv: Untied from Libc, export table added Signed-off-by: Maxim Logaev --- programs/develop/libraries/iconv/Tupfile.lua | 2 +- programs/develop/libraries/iconv/iconv.c | 63 ++++++++++++++------ programs/develop/libraries/iconv/libc_stub.h | 32 ++++++++++ 3 files changed, 79 insertions(+), 18 deletions(-) create mode 100644 programs/develop/libraries/iconv/libc_stub.h diff --git a/programs/develop/libraries/iconv/Tupfile.lua b/programs/develop/libraries/iconv/Tupfile.lua index 1f714f65a..6ab855d3a 100644 --- a/programs/develop/libraries/iconv/Tupfile.lua +++ b/programs/develop/libraries/iconv/Tupfile.lua @@ -1,2 +1,2 @@ if tup.getconfig("NO_GCC") ~= "" then return end -tup.rule("iconv.c", "kos32-gcc -c -I../../../../contrib/sdk/sources/newlib/libc/include/ -fno-ident -Os -c -o %o %f " .. tup.getconfig("KPACK_CMD"), "iconv.obj") +tup.rule("iconv.c", "kos32-gcc -D_KOLIBRI -Os -fno-ident -fno-leading-underscore -fno-pie -c -o %o %f && kos32-strip %o --strip-unneeded " .. tup.getconfig("KPACK_CMD"), "iconv.obj") diff --git a/programs/develop/libraries/iconv/iconv.c b/programs/develop/libraries/iconv/iconv.c index 419a2efb2..3f621f33f 100644 --- a/programs/develop/libraries/iconv/iconv.c +++ b/programs/develop/libraries/iconv/iconv.c @@ -1,6 +1,10 @@ +#ifdef _KOLIBRI +#include "libc_stub.h" +#else #include #include #include +#endif typedef int conv_t; typedef unsigned int ucs4_t; @@ -39,6 +43,7 @@ typedef int iconv_t; int encoding(const char *someencoding) { +#if 0 char *what = strdup(someencoding); /* Ignore //TRANSLIT or //IGNORE for now. */ int i; @@ -48,6 +53,9 @@ int encoding(const char *someencoding) { break; } } +#else + const char *what = someencoding; +#endif if (!strcasecmp(what,"CP866")) return CP866; if (!strcasecmp(what,"CP1251")) return CP1251; @@ -190,6 +198,23 @@ size_t iconv(iconv_t cd, const char **inbuf, size_t *inbytesleft, return count1; } +char *iconv_strerr(void) +{ + switch (errno) + { + case 0: + return "Success"; + case EINVAL: + return "Invalid argument"; + case EILSEQ: + return "Illegal byte sequence"; + case E2BIG: + return "Arg list too long"; + default: + return "Unknown error"; + } +} + /* int main() */ /* { */ /* char *s;// ="вертолет"; */ @@ -248,22 +273,26 @@ size_t iconv(iconv_t cd, const char **inbuf, size_t *inbytesleft, /* //for (;s