Sdl12-compat: initial attempt at os/2 support

From a928063dab07b189064aaf43fe82634b991d95fa Mon Sep 17 00:00:00 2001
From: Ozkan Sezer <[EMAIL REDACTED]>
Date: Fri, 19 Feb 2021 17:55:00 +0300
Subject: [PATCH] initial attempt at os/2 support.

---
 Makefile.os2                | 79 +++++++++++++++++++++++++++++++++++++
 src/SDL12_compat.c          | 35 +++++++++++++++-
 src/SDL20_include_wrapper.h |  5 ++-
 3 files changed, 117 insertions(+), 2 deletions(-)
 create mode 100644 Makefile.os2

diff --git a/Makefile.os2 b/Makefile.os2
new file mode 100644
index 0000000..e85d4de
--- /dev/null
+++ b/Makefile.os2
@@ -0,0 +1,79 @@
+#  OpenWatcom makefile to build SDL for OS/2
+
+!ifndef %WATCOM
+!error Environment variable WATCOM is not specified!
+!endif
+
+DLLNAME = SDL12
+VERSION = 1.2.50
+LIBHOME = .
+
+# change SDL2_INC in order to point to the dependency headers.
+#SDL2INC = -IC:\SDL2DEV/h/SDL2
+SDL2INC = -I/home/ozzie/Downloads/sdl-dev/SDL/include
+INCPATH = -I$(%WATCOM)/h/os2 -I$(%WATCOM)/h $(SDL2INC)
+LIBNAME = $(DLLNAME)
+
+DLLFILE = $(LIBHOME)/$(LIBNAME).dll
+LIBFILE = $(LIBHOME)/$(LIBNAME).lib
+LNKFILE=$(LIBNAME).lnk
+
+CFLAGS_DEF=-bt=os2 -d0 -zq -bm -5s -fp5 -fpi87 -sg -oteanbmier $(INCPATH)
+CFLAGS_DLL=$(CFLAGS_DEF) -bd
+
+# Special flags for building SDL
+CFLAGS=$(CFLAGS_DLL) -otexan -wx -ei
+# newer OpenWatcom versions enable W303 by default
+CFLAGS+= -wcd=303
+
+DESCRIPTION = Simple DirectMedia Layer 1.2
+
+object_files= SDL12_compat.obj
+
+.extensions:
+.extensions: .lib .dll .obj .c .asm
+
+.c: src;
+
+.c.obj:
+	wcc386 $(CFLAGS) -fo=$^@ $<
+
+all: $(DLLFILE) $(LIBFILE) .symbolic
+
+$(DLLFILE): compiling_info $(object_files) $(LNKFILE)
+	@echo * Linking: $@
+	@wlink @$(LNKFILE)
+
+$(LIBFILE): $(DLLFILE)
+	@echo * Creating LIB file: $@
+	wlib -q -b -n -c -pa -s -t -zld -ii -io $* $(DLLFILE)
+
+compiling_info : .symbolic
+	@echo * Compiling...
+
+$(LNKFILE):
+	@echo * Creating linker file: $@
+	@%create $@
+	@%append $@ SYSTEM os2v2_dll INITINSTANCE TERMINSTANCE
+	@%append $@ NAME $(DLLFILE)
+	@for %i in ($(object_files)) do @%append $@ FILE %i
+	@%append $@ OPTION QUIET
+	@%append $@ OPTION IMPF=$^&.exp
+	@%append $@ OPTION MAP=$^&.map
+	@%append $@ OPTION DESCRIPTION '@$#libsdl org:$(VERSION)$#@$(DESCRIPTION)'
+	@%append $@ OPTION ELIMINATE
+	@%append $@ OPTION MANYAUTODATA
+	@%append $@ OPTION OSNAME='OS/2 and eComStation'
+	@%append $@ OPTION SHOWDEAD
+
+clean: .SYMBOLIC
+	@echo * Clean: $(LIBNAME) $(VERSION)
+	@if exist *.obj rm *.obj
+	@if exist *.map rm *.map
+	@if exist *.exp rm *.exp
+	@if exist $(LNKFILE) rm $(LNKFILE)
+
+distclean: clean .SYMBOLIC
+	@if exist *.obj rm *.err
+	@if exist $(DLLFILE) rm $(DLLFILE)
+	@if exist $(LIBFILE) rm $(LIBFILE)
diff --git a/src/SDL12_compat.c b/src/SDL12_compat.c
index d42a9a3..9fa34ae 100644
--- a/src/SDL12_compat.c
+++ b/src/SDL12_compat.c
@@ -791,6 +791,28 @@ static EventQueueType *EventQueueAvailable = NULL;
     #define LoadSDL20Library() ((Loaded_SDL20 = dlopen(SDL20_LIBNAME, RTLD_LOCAL|RTLD_NOW)) != NULL)
     #define LookupSDL20Sym(sym) dlsym(Loaded_SDL20, sym)
     #define CloseSDL20Library() { if (Loaded_SDL20) { dlclose(Loaded_SDL20); Loaded_SDL20 = NULL; } }
+#elif defined(__OS2__)
+    #include <os2.h>
+    #define SDL20_LIBNAME "SDL2.dll"
+    static HMODULE Loaded_SDL20 = NULLHANDLE;
+    static SDL_bool LoadSDL20Library(void) {
+        char err[256];
+        if (DosLoadModule(err, sizeof(err), SDL20_LIBNAME, &Loaded_SDL20) != 0) {
+            return SDL_FALSE;
+        }
+        return SDL_TRUE;
+    }
+    static void *LookupSDL20Sym (const char *symname) {
+        PFN fp;
+        if (DosQueryProcAddr(Loaded_SDL20, 0, symname, &fp) != 0) return NULL;
+        return (void *)fp;
+    }
+    static void CloseSDL20Library(void) {
+        if (Loaded_SDL20 != NULLHANDLE) {
+            DosFreeModule(Loaded_SDL20);
+            Loaded_SDL20 = NULLHANDLE;
+        }
+    }
 #else
     #error Please define your platform.
 #endif
@@ -855,7 +877,18 @@ static void dllquit(void)
 #elif defined(_MSC_VER) && defined(_WIN32)
     #error Write me
 #elif defined(__WATCOMC__) && defined(__OS2__)
-    #error Write me
+unsigned _System LibMain(unsigned hmod, unsigned termination)
+{
+    (void)hmod;
+    if (termination) {
+        UnloadSDL20();
+    } else if (!LoadSDL20()) {
+        fprintf(stderr, "ERROR: sdl12-compat failed to load SDL 2.0! Aborting!\n");
+        fflush(stderr);
+        abort();
+    }
+    return 1;
+}
 #else
     #error Please define your platform.
 #endif
diff --git a/src/SDL20_include_wrapper.h b/src/SDL20_include_wrapper.h
index 58cb832..77f5500 100644
--- a/src/SDL20_include_wrapper.h
+++ b/src/SDL20_include_wrapper.h
@@ -94,7 +94,10 @@
 
 #define BUILD_SDL 1
 #include "SDL.h"
-#include "SDL_syswm.h" /* includes windows.h for _WIN32 */
+#ifdef __OS2__
+#define INCL_DOSMODULEMGR /* for Dos_LoadModule() & co. */
+#endif
+#include "SDL_syswm.h"    /* includes windows.h for _WIN32, os2.h for __OS2__ */
 #ifdef _WIN32
 #undef CreateThread
 #undef CreateSemaphore