cscg22-gearboy

CSCG 2022 Challenge 'Gearboy'
git clone https://git.sinitax.com/sinitax/cscg22-gearboy
Log | Files | Refs | sfeed.txt

testloadso.c (2295B)


      1/*
      2  Copyright (C) 1997-2014 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
     22typedef int (*fntype) (const char *);
     23
     24int
     25main(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}