1 | /* |
2 | Copyright (C) 1997-2021 Sam Lantinga <slouken@libsdl.org> |
3 | |
4 | This software is provided 'as-is', without any express or implied |
5 | warranty. In no event will the authors be held liable for any damages |
6 | arising from the use of this software. |
7 | |
8 | Permission is granted to anyone to use this software for any purpose, |
9 | including commercial applications, and to alter it and redistribute it |
10 | freely. |
11 | */ |
12 | |
13 | /* Test program to test dynamic loading with the loadso subsystem. |
14 | */ |
15 | |
16 | #include <stdio.h> |
17 | #include <stdlib.h> |
18 | #include <string.h> |
19 | |
20 | #include "SDL.h" |
21 | |
22 | typedef int (*fntype) (const char *); |
23 | |
24 | int |
25 | main(int argc, char *argv[]) |
26 | { |
27 | int retval = 0; |
28 | int hello = 0; |
29 | const char *libname = NULL; |
30 | const char *symname = NULL; |
31 | void *lib = NULL; |
32 | fntype fn = NULL; |
33 | |
34 | if (argc != 3) { |
35 | const char *app = argv[0]; |
36 | SDL_Log("USAGE: %s <library> <functionname>\n" , app); |
37 | SDL_Log(" %s --hello <lib with puts()>\n" , app); |
38 | return 1; |
39 | } |
40 | |
41 | /* Initialize SDL */ |
42 | if (SDL_Init(0) < 0) { |
43 | SDL_LogError(SDL_LOG_CATEGORY_APPLICATION, "Couldn't initialize SDL: %s\n" , SDL_GetError()); |
44 | return 2; |
45 | } |
46 | |
47 | if (strcmp(argv[1], "--hello" ) == 0) { |
48 | hello = 1; |
49 | libname = argv[2]; |
50 | symname = "puts" ; |
51 | } else { |
52 | libname = argv[1]; |
53 | symname = argv[2]; |
54 | } |
55 | |
56 | lib = SDL_LoadObject(libname); |
57 | if (lib == NULL) { |
58 | SDL_LogError(SDL_LOG_CATEGORY_APPLICATION, "SDL_LoadObject('%s') failed: %s\n" , |
59 | libname, SDL_GetError()); |
60 | retval = 3; |
61 | } else { |
62 | fn = (fntype) SDL_LoadFunction(lib, symname); |
63 | if (fn == NULL) { |
64 | SDL_LogError(SDL_LOG_CATEGORY_APPLICATION, "SDL_LoadFunction('%s') failed: %s\n" , |
65 | symname, SDL_GetError()); |
66 | retval = 4; |
67 | } else { |
68 | SDL_Log("Found %s in %s at %p\n" , symname, libname, fn); |
69 | if (hello) { |
70 | SDL_Log("Calling function...\n" ); |
71 | fflush(stdout); |
72 | fn(" HELLO, WORLD!\n" ); |
73 | SDL_Log("...apparently, we survived. :)\n" ); |
74 | SDL_Log("Unloading library...\n" ); |
75 | fflush(stdout); |
76 | } |
77 | } |
78 | SDL_UnloadObject(lib); |
79 | } |
80 | SDL_Quit(); |
81 | return retval; |
82 | } |
83 | |