1 /*
2   Copyright (C) 1997-2020 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