X-Git-Url: http://de.git.xonotic.org/?a=blobdiff_plain;ds=sidebyside;f=sys_shared.c;h=9abc08d4926dcca45503509a1f8317637e04aca2;hb=ac2ed2ab0ce7da11fe1735b321f9252783f7e6ef;hp=a8016fa7cc371bc2b8ec2a1c4ae5bffe2b39b4b7;hpb=ab535393effa9579a6f7bba053e513c0def9113d;p=xonotic%2Fdarkplaces.git diff --git a/sys_shared.c b/sys_shared.c index a8016fa7..9abc08d4 100644 --- a/sys_shared.c +++ b/sys_shared.c @@ -1,53 +1,12 @@ #include "quakedef.h" -#include +# include #ifndef WIN32 -#include -#include +# include +# include +# include #endif -extern cvar_t timestamps; -extern cvar_t timeformat; - -static int sys_nostdout = false; - -/* The translation table between the graphical font and plain ASCII --KB */ -static char qfont_table[256] = { - '\0', '#', '#', '#', '#', '.', '#', '#', - '#', 9, 10, '#', ' ', 13, '.', '.', - '[', ']', '0', '1', '2', '3', '4', '5', - '6', '7', '8', '9', '.', '<', '=', '>', - ' ', '!', '"', '#', '$', '%', '&', '\'', - '(', ')', '*', '+', ',', '-', '.', '/', - '0', '1', '2', '3', '4', '5', '6', '7', - '8', '9', ':', ';', '<', '=', '>', '?', - '@', 'A', 'B', 'C', 'D', 'E', 'F', 'G', - 'H', 'I', 'J', 'K', 'L', 'M', 'N', 'O', - 'P', 'Q', 'R', 'S', 'T', 'U', 'V', 'W', - 'X', 'Y', 'Z', '[', '\\', ']', '^', '_', - '`', 'a', 'b', 'c', 'd', 'e', 'f', 'g', - 'h', 'i', 'j', 'k', 'l', 'm', 'n', 'o', - 'p', 'q', 'r', 's', 't', 'u', 'v', 'w', - 'x', 'y', 'z', '{', '|', '}', '~', '<', - - '<', '=', '>', '#', '#', '.', '#', '#', - '#', '#', ' ', '#', ' ', '>', '.', '.', - '[', ']', '0', '1', '2', '3', '4', '5', - '6', '7', '8', '9', '.', '<', '=', '>', - ' ', '!', '"', '#', '$', '%', '&', '\'', - '(', ')', '*', '+', ',', '-', '.', '/', - '0', '1', '2', '3', '4', '5', '6', '7', - '8', '9', ':', ';', '<', '=', '>', '?', - '@', 'A', 'B', 'C', 'D', 'E', 'F', 'G', - 'H', 'I', 'J', 'K', 'L', 'M', 'N', 'O', - 'P', 'Q', 'R', 'S', 'T', 'U', 'V', 'W', - 'X', 'Y', 'Z', '[', '\\', ']', '^', '_', - '`', 'a', 'b', 'c', 'd', 'e', 'f', 'g', - 'h', 'i', 'j', 'k', 'l', 'm', 'n', 'o', - 'p', 'q', 'r', 's', 't', 'u', 'v', 'w', - 'x', 'y', 'z', '{', '|', '}', '~', '<' -}; - static char sys_timestring[128]; char *Sys_TimeString(const char *timeformat) { @@ -57,74 +16,12 @@ char *Sys_TimeString(const char *timeformat) } -#define MAXPRINTMSG 16384 - -void Sys_Print(const char *msg) -{ - unsigned char *p; - // String we print - char final[MAXPRINTMSG]; - - if (sys_nostdout) - return; - - if (timestamps.integer) - snprintf(final, sizeof(final), "%s%s", Sys_TimeString(timeformat.string), msg); - else - strncpy(final, msg, sizeof(final)); - - // LordHavoc: make sure the string is terminated - final[MAXPRINTMSG-1] = 0; - for (p = (unsigned char *) final;*p; p++) - *p = qfont_table[*p]; - Sys_PrintToTerminal(final); -} - -void Sys_Printf(const char *fmt, ...) -{ - va_list argptr; - char msg[MAXPRINTMSG]; // String we started with - - va_start(argptr,fmt); - vsnprintf(msg,sizeof(msg),fmt,argptr); - va_end(argptr); - - Sys_Print(msg); -} - - -char engineversion[128]; - -void Sys_Shared_EarlyInit(void) -{ - const char* os; - - Memory_Init (); - - COM_InitArgv(); - COM_InitGameType(); - -#if defined(__linux__) - os = "Linux"; -#elif defined(WIN32) - os = "Windows"; -#elif defined(__NetBSD__) - os = "NetBSD"; -#elif defined(__OpenBSD__) - os = "OpenBSD"; -#else - os = "Unknown"; -#endif - snprintf (engineversion, sizeof (engineversion), "%s %s %s", gamename, os, buildstring); - - if (COM_CheckParm("-nostdout")) - sys_nostdout = 1; - else - Con_Printf("%s\n", engineversion); -} - -void Sys_Shared_LateInit(void) +extern qboolean host_shuttingdown; +void Sys_Quit (void) { + host_shuttingdown = true; + Host_Shutdown(); + exit(0); } /* @@ -135,26 +32,90 @@ DLL MANAGEMENT =============================================================================== */ -#ifndef WIN32 -#include -#endif - -dllhandle_t Sys_LoadLibrary (const char* name) +qboolean Sys_LoadLibrary (const char** dllnames, dllhandle_t* handle, const dllfunction_t *fcts) { + const dllfunction_t *func; + dllhandle_t dllhandle = 0; + unsigned int i; + + if (handle == NULL) + return false; + + // Initializations + for (func = fcts; func && func->name != NULL; func++) + *func->funcvariable = NULL; + + // Try every possible name + Con_Printf ("Trying to load library..."); + for (i = 0; dllnames[i] != NULL; i++) + { + Con_Printf (" \"%s\"", dllnames[i]); +#ifdef WIN32 + dllhandle = LoadLibrary (dllnames[i]); +#else + dllhandle = dlopen (dllnames[i], RTLD_LAZY | RTLD_GLOBAL); +#endif + if (dllhandle) + break; + } + + // see if the names can be loaded relative to the executable path + // (this is for Mac OSX which does not check next to the executable) + if (!dllhandle && strrchr(com_argv[0], '/')) + { + char path[MAX_OSPATH]; + strlcpy(path, com_argv[0], sizeof(path)); + strrchr(path, '/')[1] = 0; + for (i = 0; dllnames[i] != NULL; i++) + { + char temp[MAX_OSPATH]; + strlcpy(temp, path, sizeof(temp)); + strlcat(temp, dllnames[i], sizeof(temp)); + Con_Printf (" \"%s\"", temp); #ifdef WIN32 - return LoadLibrary (name); + dllhandle = LoadLibrary (temp); #else - return dlopen (name, RTLD_LAZY); + dllhandle = dlopen (temp, RTLD_LAZY | RTLD_GLOBAL); #endif + if (dllhandle) + break; + } + } + + // No DLL found + if (! dllhandle) + { + Con_Printf(" - failed.\n"); + return false; + } + + Con_Printf(" - loaded.\n"); + + // Get the function adresses + for (func = fcts; func && func->name != NULL; func++) + if (!(*func->funcvariable = (void *) Sys_GetProcAddress (dllhandle, func->name))) + { + Con_Printf ("Missing function \"%s\" - broken library!\n", func->name); + Sys_UnloadLibrary (&dllhandle); + return false; + } + + *handle = dllhandle; + return true; } -void Sys_UnloadLibrary (dllhandle_t handle) +void Sys_UnloadLibrary (dllhandle_t* handle) { + if (handle == NULL || *handle == NULL) + return; + #ifdef WIN32 - FreeLibrary (handle); + FreeLibrary (*handle); #else - dlclose (handle); + dlclose (*handle); #endif + + *handle = NULL; } void* Sys_GetProcAddress (dllhandle_t handle, const char* name)