From 6aaedb813fa11ba0679c3051bc2eb28646b9506c Mon Sep 17 00:00:00 2001 From: 3gg <3gg@shellblade.net> Date: Sat, 30 Aug 2025 16:53:58 -0700 Subject: Update to SDL3 --- src/contrib/SDL-3.2.20/test/childprocess.c | 170 +++++++++++++++++++++++++++++ 1 file changed, 170 insertions(+) create mode 100644 src/contrib/SDL-3.2.20/test/childprocess.c (limited to 'src/contrib/SDL-3.2.20/test/childprocess.c') diff --git a/src/contrib/SDL-3.2.20/test/childprocess.c b/src/contrib/SDL-3.2.20/test/childprocess.c new file mode 100644 index 0000000..772d86d --- /dev/null +++ b/src/contrib/SDL-3.2.20/test/childprocess.c @@ -0,0 +1,170 @@ +#include +#include +#include + +#include +#include + +int main(int argc, char *argv[]) { + SDLTest_CommonState *state; + int i; + bool print_arguments = false; + bool print_environment = false; + bool stdin_to_stdout = false; + bool read_stdin = false; + bool stdin_to_stderr = false; + SDL_IOStream *log_stdin = NULL; + int exit_code = 0; + + state = SDLTest_CommonCreateState(argv, 0); + + for (i = 1; i < argc;) { + int consumed = SDLTest_CommonArg(state, i); + if (!consumed) { + if (SDL_strcmp(argv[i], "--print-arguments") == 0) { + print_arguments = true; + consumed = 1; + } else if (SDL_strcmp(argv[i], "--print-environment") == 0) { + print_environment = true; + consumed = 1; + } else if (SDL_strcmp(argv[i], "--stdin-to-stdout") == 0) { + stdin_to_stdout = true; + consumed = 1; + } else if (SDL_strcmp(argv[i], "--stdin-to-stderr") == 0) { + stdin_to_stderr = true; + consumed = 1; + } else if (SDL_strcmp(argv[i], "--stdin") == 0) { + read_stdin = true; + consumed = 1; + } else if (SDL_strcmp(argv[i], "--stdout") == 0) { + if (i + 1 < argc) { + fprintf(stdout, "%s", argv[i + 1]); + consumed = 2; + } + } else if (SDL_strcmp(argv[i], "--stderr") == 0) { + if (i + 1 < argc) { + fprintf(stderr, "%s", argv[i + 1]); + consumed = 2; + } + } else if (SDL_strcmp(argv[i], "--log-stdin") == 0) { + if (i + 1 < argc) { + log_stdin = SDL_IOFromFile(argv[i + 1], "w"); + if (!log_stdin) { + fprintf(stderr, "Couldn't open %s\n", argv[i + 1]); + return 2; + } + consumed = 2; + } + } else if (SDL_strcmp(argv[i], "--exit-code") == 0) { + if (i + 1 < argc) { + char *endptr = NULL; + exit_code = SDL_strtol(argv[i + 1], &endptr, 0); + if (endptr && *endptr == '\0') { + consumed = 2; + } + } + } else if (SDL_strcmp(argv[i], "--version") == 0) { + int version = SDL_GetVersion(); + fprintf(stdout, "SDL version %d.%d.%d", + SDL_VERSIONNUM_MAJOR(version), + SDL_VERSIONNUM_MINOR(version), + SDL_VERSIONNUM_MICRO(version)); + fprintf(stderr, "SDL version %d.%d.%d", + SDL_VERSIONNUM_MAJOR(version), + SDL_VERSIONNUM_MINOR(version), + SDL_VERSIONNUM_MICRO(version)); + consumed = 1; + break; + } else if (SDL_strcmp(argv[i], "--") == 0) { + i++; + break; + } + } + if (consumed <= 0) { + const char *args[] = { + "[--print-arguments]", + "[--print-environment]", + "[--stdin]", + "[--log-stdin FILE]", + "[--stdin-to-stdout]", + "[--stdout TEXT]", + "[--stdin-to-stderr]", + "[--stderr TEXT]", + "[--exit-code EXIT_CODE]", + "[--] [ARG [ARG ...]]", + NULL + }; + SDLTest_CommonLogUsage(state, argv[0], args); + return 1; + } + i += consumed; + } + + if (print_arguments) { + int print_i; + for (print_i = 0; i + print_i < argc; print_i++) { + fprintf(stdout, "|%d=%s|\r\n", print_i, argv[i + print_i]); + } + fflush(stdout); + } + + if (print_environment) { + char **env = SDL_GetEnvironmentVariables(SDL_GetEnvironment()); + if (env) { + for (i = 0; env[i]; ++i) { + fprintf(stdout, "%s\n", env[i]); + } + SDL_free(env); + } + fflush(stdout); + } + + if (stdin_to_stdout || stdin_to_stderr || read_stdin) { + for (;;) { + char buffer[4 * 4096]; + size_t result; + + result = fread(buffer, 1, sizeof(buffer), stdin); + if (result == 0) { + if (!feof(stdin)) { + char error[128]; + + if (errno == EAGAIN) { + clearerr(stdin); + SDL_Delay(20); + continue; + } + +#ifdef SDL_PLATFORM_WINDOWS + if (strerror_s(error, sizeof(error), errno) != 0) { + SDL_strlcpy(error, "Unknown error", sizeof(error)); + } +#else + SDL_strlcpy(error, strerror(errno), sizeof(error)); +#endif + SDL_Log("Error reading from stdin: %s", error); + } + break; + } + if (log_stdin) { + SDL_WriteIO(log_stdin, buffer, result); + SDL_FlushIO(log_stdin); + } + if (stdin_to_stdout) { + fwrite(buffer, 1, result, stdout); + fflush(stdout); + } + if (stdin_to_stderr) { + fwrite(buffer, 1, result, stderr); + } + } + } + + if (log_stdin) { + SDL_CloseIO(log_stdin); + } + + SDLTest_CommonDestroyState(state); + + return exit_code; +} -- cgit v1.2.3