SDL: Fixed building with Visual Studio 2013

From 8cd908e0b987d3de26052bb16d9065541a30d23d Mon Sep 17 00:00:00 2001
From: Sam Lantinga <[EMAIL REDACTED]>
Date: Fri, 6 May 2022 10:51:55 -0700
Subject: [PATCH] Fixed building with Visual Studio 2013

Added SDL_vacopy.h since it needs to be included after Windows headers
---
 src/SDL_internal.h        | 12 ------------
 src/SDL_log.c             |  3 +++
 src/core/linux/SDL_dbus.c |  1 +
 src/stdlib/SDL_string.c   |  1 +
 src/stdlib/SDL_vacopy.h   | 36 ++++++++++++++++++++++++++++++++++++
 5 files changed, 41 insertions(+), 12 deletions(-)
 create mode 100644 src/stdlib/SDL_vacopy.h

diff --git a/src/SDL_internal.h b/src/SDL_internal.h
index 7d3f9cd9e5f..69da271c624 100644
--- a/src/SDL_internal.h
+++ b/src/SDL_internal.h
@@ -26,18 +26,6 @@
 #define _GNU_SOURCE
 #endif
 
-/* Do our best to make sure va_copy is working */
-#if defined(__NGAGE__)
-#undef va_copy
-#define va_copy(dst, src)   dst = src
-#elif defined(_MSC_VER) && _MSC_VER <= 1800
-/* Visual Studio 2013 tries to link with _vacopy in the C runtime. Newer versions do an inline assignment */
-#undef va_copy
-#define va_copy(dst, src)   dst = src
-#elif defined(__GNUC__) && (__GNUC__ < 3)
-#define va_copy(dst, src)   __va_copy(dst, src)
-#endif
-
 /* This is for a variable-length array at the end of a struct:
     struct x { int y; char z[SDL_VARIABLE_LENGTH_ARRAY]; };
    Use this because GCC 2 needs different magic than other compilers. */
diff --git a/src/SDL_log.c b/src/SDL_log.c
index a4c4d505013..6f2e550905d 100644
--- a/src/SDL_log.c
+++ b/src/SDL_log.c
@@ -39,6 +39,9 @@
 #include <android/log.h>
 #endif
 
+#include "stdlib/SDL_vacopy.h"
+
+
 /* The size of the stack buffer to use for rendering log messages. */
 #define SDL_MAX_LOG_MESSAGE_STACK 256
 
diff --git a/src/core/linux/SDL_dbus.c b/src/core/linux/SDL_dbus.c
index 2fe12163e39..ecfbe6f4e46 100644
--- a/src/core/linux/SDL_dbus.c
+++ b/src/core/linux/SDL_dbus.c
@@ -22,6 +22,7 @@
 #include "SDL_hints.h"
 #include "SDL_dbus.h"
 #include "SDL_atomic.h"
+#include "../../stdlib/SDL_vacopy.h"
 
 #if SDL_USE_LIBDBUS
 /* we never link directly to libdbus. */
diff --git a/src/stdlib/SDL_string.c b/src/stdlib/SDL_string.c
index ae8f306659e..3125e839054 100644
--- a/src/stdlib/SDL_string.c
+++ b/src/stdlib/SDL_string.c
@@ -27,6 +27,7 @@
 /* This file contains portable string manipulation functions for SDL */
 
 #include "SDL_stdinc.h"
+#include "SDL_vacopy.h"
 
 #if !defined(HAVE_VSSCANF) || !defined(HAVE_STRTOL) || !defined(HAVE_STRTOUL) || !defined(HAVE_STRTOD) || !defined(HAVE_STRTOLL) || !defined(HAVE_STRTOULL)
 #define SDL_isupperhex(X)   (((X) >= 'A') && ((X) <= 'F'))
diff --git a/src/stdlib/SDL_vacopy.h b/src/stdlib/SDL_vacopy.h
new file mode 100644
index 00000000000..ab60046951b
--- /dev/null
+++ b/src/stdlib/SDL_vacopy.h
@@ -0,0 +1,36 @@
+/*
+  Simple DirectMedia Layer
+  Copyright (C) 1997-2022 Sam Lantinga <slouken@libsdl.org>
+
+  This software is provided 'as-is', without any express or implied
+  warranty.  In no event will the authors be held liable for any damages
+  arising from the use of this software.
+
+  Permission is granted to anyone to use this software for any purpose,
+  including commercial applications, and to alter it and redistribute it
+  freely, subject to the following restrictions:
+
+  1. The origin of this software must not be misrepresented; you must not
+     claim that you wrote the original software. If you use this software
+     in a product, an acknowledgment in the product documentation would be
+     appreciated but is not required.
+  2. Altered source versions must be plainly marked as such, and must not be
+     misrepresented as being the original software.
+  3. This notice may not be removed or altered from any source distribution.
+*/
+
+/* Do our best to make sure va_copy is working */
+#if defined(__NGAGE__)
+#undef va_copy
+#define va_copy(dst, src)   dst = src
+
+#elif defined(_MSC_VER) && _MSC_VER <= 1800
+/* Visual Studio 2013 tries to link with _vacopy in the C runtime. Newer versions do an inline assignment */
+#undef va_copy
+#define va_copy(dst, src)   dst = src
+
+#elif defined(__GNUC__) && (__GNUC__ < 3)
+#define va_copy(dst, src)   __va_copy(dst, src)
+#endif
+
+/* vi: set ts=4 sw=4 expandtab: */