1 /*
2 Copyright (C) 1997-2016 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
main(int argc,char * argv[])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