71 lines
		
	
	
		
			1.3 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
			
		
		
	
	
			71 lines
		
	
	
		
			1.3 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
// core.c
 | 
						|
 | 
						|
#include <stdio.h>
 | 
						|
#include <stdlib.h>
 | 
						|
 | 
						|
#define SDL_MAIN_HANDLED
 | 
						|
#include <SDL2/SDL.h>
 | 
						|
 | 
						|
#define PROJECT_NAME "sdfps"
 | 
						|
 | 
						|
#ifdef __WIN32__
 | 
						|
# define SHARED_OBJECT PROJECT_NAME ".dll"
 | 
						|
# define SHARED_OBJECT_ACTIVE SHARED_OBJECT "-active.dll"
 | 
						|
#else
 | 
						|
# define SHARED_OBJECT "./" PROJECT_NAME ".so"
 | 
						|
# define SHARED_OBJECT_ACTIVE SHARED_OBJECT
 | 
						|
#endif
 | 
						|
 | 
						|
#define SHARED_MAIN PROJECT_NAME "_main"
 | 
						|
 | 
						|
#ifdef __WIN32__
 | 
						|
/*
 | 
						|
 * windows doesn't let us overwite a dll that's currently in use, but it
 | 
						|
 * seems that macos/linux does
 | 
						|
*/
 | 
						|
int copy_shared_object() {
 | 
						|
	if (system("copy " SHARED_OBJECT " " SHARED_OBJECT_ACTIVE " /Y")) {
 | 
						|
		puts("failed copying to " SHARED_OBJECT_ACTIVE);
 | 
						|
		// puts(SDL_GetError());
 | 
						|
		return 1;
 | 
						|
	}
 | 
						|
	return 0;
 | 
						|
}
 | 
						|
#else
 | 
						|
int copy_shared_object() {
 | 
						|
	return 0;
 | 
						|
}
 | 
						|
#endif
 | 
						|
 | 
						|
int main(int argc, char **argv) {
 | 
						|
	void *u_data = NULL;
 | 
						|
 | 
						|
	puts("start.");
 | 
						|
	SDL_Init(SDL_INIT_EVERYTHING);
 | 
						|
 | 
						|
	while (1) {
 | 
						|
		if (copy_shared_object())
 | 
						|
			break;
 | 
						|
 | 
						|
		void *so = SDL_LoadObject(SHARED_OBJECT_ACTIVE);
 | 
						|
		if (so == 0) {
 | 
						|
			puts("failed load " SHARED_OBJECT_ACTIVE);
 | 
						|
			puts(SDL_GetError());
 | 
						|
			break;
 | 
						|
		}
 | 
						|
 | 
						|
		int(*shared_main)(int, char **, void **) = SDL_LoadFunction(so, SHARED_MAIN);
 | 
						|
 | 
						|
		if(shared_main(argc, argv, &u_data) != 0)
 | 
						|
			break;
 | 
						|
 | 
						|
		SDL_UnloadObject(so);
 | 
						|
	}
 | 
						|
 | 
						|
	quit:
 | 
						|
	SDL_Quit();
 | 
						|
	puts("done.");
 | 
						|
	return 0;
 | 
						|
}
 | 
						|
 |