sdl12-compat: init: eliminate lstrcpyA() and wsprintfA() dependencies on windows.

From 0adf9aa009ce336d8358ad6d0865e6dc0647f171 Mon Sep 17 00:00:00 2001
From: Ozkan Sezer <[EMAIL REDACTED]>
Date: Thu, 9 Feb 2023 01:21:32 +0300
Subject: [PATCH] init: eliminate lstrcpyA() and wsprintfA() dependencies on
 windows.

a stpcpy() and an itoa() implementation are enough to replace them.

(backported from sdl2-compat)
---
 src/SDL12_compat.c | 62 ++++++++++++++++++++++++++++++++++++++--------
 1 file changed, 51 insertions(+), 11 deletions(-)

diff --git a/src/SDL12_compat.c b/src/SDL12_compat.c
index 4a8bc01a4..4f3daa72a 100644
--- a/src/SDL12_compat.c
+++ b/src/SDL12_compat.c
@@ -1053,6 +1053,41 @@ SDL20_atoi(const char *str)
     return SDL20_strtol(str, NULL, 10);
 }
 
+static char *
+SDL12COMPAT_stpcpy(char *dst, const char *src)
+{
+    while ((*dst++ = *src++) != '\0') {
+        /**/;
+    }
+    return --dst;
+}
+
+static void
+SDL12COMPAT_itoa(char *dst, int val)
+{
+    char *ptr, temp;
+
+    if (val < 0) {
+        *dst++ = '-';
+        val = -val;
+    }
+    ptr = dst;
+
+    do {
+        *ptr++ = '0' + (val % 10);
+        val /= 10;
+    } while (val > 0);
+    *ptr-- = '\0';
+
+    /* correct the order of digits */
+    do {
+        temp = *dst;
+        *dst++ = *ptr;
+        *ptr-- = temp;
+    } while (ptr > dst);
+}
+
+
 /* Obviously we can't use SDL_LoadObject() to load SDL2.  :)  */
 static char loaderror[256];
 #if defined(_WIN32)
@@ -1064,16 +1099,12 @@ static char loaderror[256];
     #define LoadSDL20Library() ((Loaded_SDL20 = LoadLibraryA(SDL20_LIBNAME)) != NULL)
     #define LookupSDL20Sym(sym) (void *)GetProcAddress(Loaded_SDL20, sym)
     #define CloseSDL20Library() { if (Loaded_SDL20) { FreeLibrary(Loaded_SDL20); Loaded_SDL20 = NULL; } }
-    #define strcpy_fn  lstrcpyA
-    #define sprintf_fn wsprintfA
 #elif defined(__OS2__)
     #include <os2.h>
     #define DIRSEP "\\"
     #define SDL20_LIBNAME "SDL2.dll"
     #define SDL20_LIBNAME2 "SDL2"       /* if loading from LIBPATH */
     #define SDL20_REQUIRED_VER SDL_VERSIONNUM(2,0,7)
-    #define strcpy_fn  strcpy
-    #define sprintf_fn sprintf
     static HMODULE Loaded_SDL20 = NULLHANDLE;
     static SDL_bool LoadSDL20Library(void) {
         char err[256];
@@ -1104,8 +1135,6 @@ static char loaderror[256];
     #define SDL20_LIBNAME2 "libSDL2-2.0.dylib"
     #define SDL20_FRAMEWORK "SDL2.framework/Versions/A/SDL2"
     #define SDL20_REQUIRED_VER SDL_VERSIONNUM(2,0,7)
-    #define strcpy_fn  strcpy
-    #define sprintf_fn sprintf
     static void *Loaded_SDL20 = NULL;
     #define LookupSDL20Sym(sym) dlsym(Loaded_SDL20, sym)
     #define CloseSDL20Library() { if (Loaded_SDL20) { dlclose(Loaded_SDL20); Loaded_SDL20 = NULL; } }
@@ -1162,8 +1191,6 @@ static char loaderror[256];
     #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; } }
-    #define strcpy_fn  strcpy
-    #define sprintf_fn sprintf
 #else
     #error Please define your platform.
 #endif
@@ -1179,7 +1206,8 @@ LoadSDL20Symbol(const char *fn, int *okay)
     if (*okay) { /* only bother trying if we haven't previously failed. */
         retval = LookupSDL20Sym(fn);
         if (retval == NULL) {
-            sprintf_fn(loaderror, "%s missing in SDL2 library.", fn);
+            char *p = SDL12COMPAT_stpcpy(loaderror, fn);
+            SDL12COMPAT_stpcpy(p, " missing in SDL2 library.");
             *okay = 0;
         }
     }
@@ -1406,7 +1434,7 @@ LoadSDL20(void)
 
         okay = LoadSDL20Library();
         if (!okay) {
-            strcpy_fn(loaderror, "Failed loading SDL2 library.");
+            SDL12COMPAT_stpcpy(loaderror, "Failed loading SDL2 library.");
         } else {
             #define SDL20_SYM(rc,fn,params,args,ret) SDL20_##fn = (SDL20_##fn##_t) LoadSDL20Symbol("SDL_" #fn, &okay);
             #include "SDL20_syms.h"
@@ -1416,7 +1444,19 @@ LoadSDL20(void)
                 LinkedSDL2VersionInt = SDL_VERSIONNUM(v.major, v.minor, v.patch);
                 okay = (LinkedSDL2VersionInt >= SDL20_REQUIRED_VER);
                 if (!okay) {
-                    sprintf_fn(loaderror, "SDL2 %d.%d.%d library is too old.", v.major, v.minor, v.patch);
+                    char value[12];
+                    char *p = SDL12COMPAT_stpcpy(loaderror, "SDL2 ");
+
+                    SDL12COMPAT_itoa(value, v.major);
+                    p = SDL12COMPAT_stpcpy(p, value);
+                    *p++ = '.';
+                    SDL12COMPAT_itoa(value, v.minor);
+                    p = SDL12COMPAT_stpcpy(p, value);
+                    *p++ = '.';
+                    SDL12COMPAT_itoa(value, v.patch);
+                    p = SDL12COMPAT_stpcpy(p, value);
+
+                    SDL12COMPAT_stpcpy(p, " library is too old.");
                 } else {
                     WantDebugLogging = SDL12Compat_GetHintBoolean("SDL12COMPAT_DEBUG_LOGGING", SDL_FALSE);
                     if (WantDebugLogging) {