From afb70f26811a60432bf9cfd0a373d6043cf07e75 Mon Sep 17 00:00:00 2001 From: "Ryan C. Gordon" Date: Wed, 12 Feb 2020 13:09:38 -0500 Subject: [PATCH] test: Reimplemented SDLTest_CommonUsage() to restore binary compatibility. Fixes Bugzilla #4975. --- include/SDL_test_common.h | 13 ++++++++ src/test/SDL_test_common.c | 66 ++++++++++++++++++++++++++++++++++++++ 2 files changed, 79 insertions(+) diff --git a/include/SDL_test_common.h b/include/SDL_test_common.h index 9e0aa8b4f22fe..3ad203055e201 100644 --- a/include/SDL_test_common.h +++ b/include/SDL_test_common.h @@ -155,6 +155,19 @@ int SDLTest_CommonArg(SDLTest_CommonState * state, int index); */ void SDLTest_CommonLogUsage(SDLTest_CommonState * state, const char *argv0, const char **options); +/** + * \brief Returns common usage information + * + * You should (probably) be using SDLTest_CommonLogUsage() instead, but this + * function remains for binary compatibility. Strings returned from this + * function are valid until SDLTest_CommonQuit() is called, in which case + * those strings' memory is freed and can no longer be used. + * + * \param state The common state describing the test window to create. + * \returns String with usage information + */ +const char *SDLTest_CommonUsage(SDLTest_CommonState * state); + /** * \brief Open test window. * diff --git a/src/test/SDL_test_common.c b/src/test/SDL_test_common.c index cf1f9e5856456..b48c6a5c65033 100644 --- a/src/test/SDL_test_common.c +++ b/src/test/SDL_test_common.c @@ -521,6 +521,65 @@ SDLTest_CommonLogUsage(SDLTest_CommonState * state, const char *argv0, const cha } } +static const char * +BuildCommonUsageString(char **pstr, const char **strlist, const int numitems, const char **strlist2, const int numitems2) +{ + char *str = *pstr; + if (!str) { + size_t len = SDL_strlen("[--trackmem]") + 2; + int i; + for (i = 0; i < numitems; i++) { + len += SDL_strlen(strlist[i]) + 1; + } + if (strlist2) { + for (i = 0; i < numitems2; i++) { + len += SDL_strlen(strlist2[i]) + 1; + } + } + str = (char *) SDL_calloc(1, len); + if (!str) { + return ""; /* oh well. */ + } + SDL_strlcat(str, "[--trackmem] ", len); + for (i = 0; i < numitems-1; i++) { + SDL_strlcat(str, strlist[i], len); + SDL_strlcat(str, " ", len); + } + SDL_strlcat(str, strlist[i], len); + if (strlist2) { + SDL_strlcat(str, " ", len); + for (i = 0; i < numitems2-1; i++) { + SDL_strlcat(str, strlist2[i], len); + SDL_strlcat(str, " ", len); + } + SDL_strlcat(str, strlist2[i], len); + } + *pstr = str; + } + return str; +} + +static char *common_usage_video = NULL; +static char *common_usage_audio = NULL; +static char *common_usage_videoaudio = NULL; + +const char * +SDLTest_CommonUsage(SDLTest_CommonState * state) +{ + + switch (state->flags & (SDL_INIT_VIDEO | SDL_INIT_AUDIO)) { + case SDL_INIT_VIDEO: + return BuildCommonUsageString(&common_usage_video, video_usage, SDL_arraysize(video_usage), NULL, 0); + case SDL_INIT_AUDIO: + return BuildCommonUsageString(&common_usage_audio, audio_usage, SDL_arraysize(audio_usage), NULL, 0); + case (SDL_INIT_VIDEO | SDL_INIT_AUDIO): + return BuildCommonUsageString(&common_usage_videoaudio, video_usage, SDL_arraysize(video_usage), audio_usage, SDL_arraysize(audio_usage)); + default: + return "[--trackmem]"; + } +} + + SDL_bool SDLTest_CommonDefaultArgs(SDLTest_CommonState *state, const int argc, char **argv) { @@ -1852,6 +1911,13 @@ SDLTest_CommonQuit(SDLTest_CommonState * state) { int i; + SDL_free(common_usage_video); + SDL_free(common_usage_audio); + SDL_free(common_usage_videoaudio); + common_usage_video = NULL; + common_usage_audio = NULL; + common_usage_videoaudio = NULL; + SDL_free(state->windows); if (state->targets) { for (i = 0; i < state->num_windows; ++i) {