SDL: os/2 optionally builds against libiconv.

From 70c5e91d0f208b0274c136c7dcae13167a8b69d3 Mon Sep 17 00:00:00 2001
From: Ozkan Sezer <[EMAIL REDACTED]>
Date: Wed, 1 Dec 2021 01:20:10 +0300
Subject: [PATCH] os/2 optionally builds against libiconv.

---
 Makefile.os2                 | 13 +++++++++++++
 include/SDL_config_os2.h     |  5 +++++
 src/core/os2/SDL_os2.h       |  6 ++++++
 src/video/os2/SDL_os2video.c |  7 ++++++-
 4 files changed, 30 insertions(+), 1 deletion(-)

diff --git a/Makefile.os2 b/Makefile.os2
index 07ca845b349..ab42a88d8ec 100644
--- a/Makefile.os2
+++ b/Makefile.os2
@@ -1,10 +1,16 @@
 # Open Watcom makefile to build SDL2.dll for OS/2
 # wmake -f Makefile.os2
+#
+# If you have libiconv installed, you can compile against it
+# by specifying LIBICONV=1, e.g.:
+# wmake -f Makefile.os2 LIBICONV=1
 
 LIBNAME = SDL2
 VERSION = 2.0.19
 DESCRIPTION = Simple DirectMedia Layer 2
 
+LIBICONV=0
+
 LIBHOME = .
 DLLFILE = $(LIBHOME)/$(LIBNAME).dll
 LIBFILE = $(LIBHOME)/$(LIBNAME).lib
@@ -23,7 +29,12 @@ CFLAGS+= -wcd=303
 # building dll:
 CFLAGS+= -bd
 # iconv:
+!ifeq LIBICONV 1
+CFLAGS+= -DHAVE_ICONV=1 -DHAVE_ICONV_H=1
+LIBS+= iconv.lib
+!else
 LIBS+= libuls.lib libconv.lib
+!endif
 # the include paths :
 CFLAGS+= $(INCPATH)
 # building SDL itself (for DECLSPEC):
@@ -69,7 +80,9 @@ SRCS+= SDL_locale.c SDL_syslocale.c
 SRCS+= SDL_url.c SDL_sysurl.c
 
 SRCS+= SDL_os2.c
+!ifeq LIBICONV 0
 SRCS+= geniconv.c os2cp.c os2iconv.c sys2utf8.c
+!endif
 SRCS+= SDL_os2audio.c
 SRCS+= SDL_os2video.c SDL_os2util.c SDL_os2dive.c SDL_os2vman.c &
        SDL_os2mouse.c SDL_os2messagebox.c
diff --git a/include/SDL_config_os2.h b/include/SDL_config_os2.h
index 33e4ba86684..d35bf6d3735 100644
--- a/include/SDL_config_os2.h
+++ b/include/SDL_config_os2.h
@@ -80,6 +80,11 @@
 #define HAVE_FLOAT_H 1
 #define HAVE_SIGNAL_H 1
 
+#if 0 /* see Makefile */
+#define HAVE_ICONV 1
+#define HAVE_ICONV_H 1
+#endif
+
 /* #undef HAVE_DLOPEN */
 #define HAVE_MALLOC 1
 #define HAVE_CALLOC 1
diff --git a/src/core/os2/SDL_os2.h b/src/core/os2/SDL_os2.h
index efc1bc1f5f4..53b0766145d 100644
--- a/src/core/os2/SDL_os2.h
+++ b/src/core/os2/SDL_os2.h
@@ -38,10 +38,16 @@
 
 #endif /* OS2DEBUG */
 
+#if defined(HAVE_ICONV) && defined(HAVE_ICONV_H)
+#define OS2_SysToUTF8(S) SDL_iconv_string("UTF-8", "", (char *)(S), SDL_strlen(S)+1)
+#define OS2_UTF8ToSys(S) SDL_iconv_string("", "UTF-8", (char *)(S), SDL_strlen(S)+1)
+#define libiconv_clean() do {} while(0)
+#else
 /* StrUTF8New() - geniconv/sys2utf8.c */
 #include "geniconv/geniconv.h"
 #define OS2_SysToUTF8(S) StrUTF8New(1,         (S), SDL_strlen((S)) + 1)
 #define OS2_UTF8ToSys(S) StrUTF8New(0, (char *)(S), SDL_strlen((S)) + 1)
+#endif
 
 /* SDL_OS2Quit() will be called from SDL_QuitSubSystem() */
 void SDL_OS2Quit(void);
diff --git a/src/video/os2/SDL_os2video.c b/src/video/os2/SDL_os2video.c
index 8cd7af38e9c..346294a71d8 100644
--- a/src/video/os2/SDL_os2video.c
+++ b/src/video/os2/SDL_os2video.c
@@ -320,10 +320,15 @@ static VOID _wmChar(WINDATA *pWinData, MPARAM mp1, MPARAM mp2)
     }
 
     if ((ulFlags & KC_CHAR) != 0) {
+#if defined(HAVE_ICONV) && defined(HAVE_ICONV_H)
+        char *acUTF8 = SDL_iconv_string("UTF-8", "", (char *)&ulCharCode, 1);
+        SDL_SendKeyboardText((acUTF8 != NULL)? acUTF8 : (char *)&ulCharCode);
+        SDL_free(acUTF8);
+#else
         CHAR    acUTF8[4];
         LONG    lRC = StrUTF8(1, acUTF8, sizeof(acUTF8), (PSZ)&ulCharCode, 1);
-
         SDL_SendKeyboardText((lRC > 0)? acUTF8 : (PSZ)&ulCharCode);
+#endif
     }
 }