X-Git-Url: http://de.git.xonotic.org/?a=blobdiff_plain;f=sys_shared.c;h=b917e60dabc6899d535e35d4d0443f6ba829f9cf;hb=a264aa2dc7ac856f3d6b885f9b709ae65eb69e0f;hp=52a28285a16dc86924b02d8a5468bf9c4e9f5534;hpb=dab565345260287a1b98d0fc701ee055cbc3d343;p=xonotic%2Fdarkplaces.git diff --git a/sys_shared.c b/sys_shared.c index 52a28285..b917e60d 100644 --- a/sys_shared.c +++ b/sys_shared.c @@ -1,119 +1,185 @@ - #include "quakedef.h" -#include - -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', '{', '|', '}', '~', '<' -}; -#ifdef WIN32 -extern HANDLE hinput, houtput; +#define SUPPORTDLL + +# include +#ifndef WIN32 +# include +# include +#ifdef SUPPORTDLL +# include +#endif #endif -#define MAX_PRINT_MSG 16384 -void Sys_Printf (char *fmt, ...) +static char sys_timestring[128]; +char *Sys_TimeString(const char *timeformat) { - va_list argptr; - char start[MAX_PRINT_MSG]; // String we started with - char stamp[MAX_PRINT_MSG]; // Time stamp - char final[MAX_PRINT_MSG]; // String we print + time_t mytime = time(NULL); +#if _MSC_VER >= 1400 + struct tm mytm; + localtime_s(&mytm, &mytime); + strftime(sys_timestring, sizeof(sys_timestring), timeformat, &mytm); +#else + strftime(sys_timestring, sizeof(sys_timestring), timeformat, localtime(&mytime)); +#endif + return sys_timestring; +} - time_t mytime = 0; - struct tm *local = NULL; - unsigned char *p; -#ifdef WIN32 - DWORD dummy; +extern qboolean host_shuttingdown; +void Sys_Quit (int returnvalue) +{ + if (COM_CheckParm("-profilegameonly")) + Sys_AllowProfiling(false); + host_shuttingdown = true; + Host_Shutdown(); + exit(returnvalue); +} + +#if defined(__linux__) || defined(__FreeBSD__) +#ifdef __cplusplus +extern "C" +#endif +int moncontrol(int); #endif - va_start (argptr, fmt); -#ifdef HAVE_VSNPRINTF - vsnprintf (start, sizeof(start), fmt, argptr); +void Sys_AllowProfiling(qboolean enable) +{ +#if defined(__linux__) || defined(__FreeBSD__) + moncontrol(enable); +#endif +} + + +/* +=============================================================================== + +DLL MANAGEMENT + +=============================================================================== +*/ + +qboolean Sys_LoadLibrary (const char** dllnames, dllhandle_t* handle, const dllfunction_t *fcts) +{ +#ifdef SUPPORTDLL + const dllfunction_t *func; + dllhandle_t dllhandle = 0; + unsigned int i; + + if (handle == NULL) + return false; + +#ifndef WIN32 +#ifdef PREFER_PRELOAD + dllhandle = dlopen(NULL, RTLD_LAZY | RTLD_GLOBAL); + if(dllhandle) + { + for (func = fcts; func && func->name != NULL; func++) + if (!(*func->funcvariable = (void *) Sys_GetProcAddress (dllhandle, func->name))) + { + dlclose(dllhandle); + goto notfound; + } + Con_DPrintf ("All of %s's functions were already linked in! Not loading dynamically...\n", dllnames[0]); + *handle = dllhandle; + return true; + } +notfound: +#endif +#endif + + // Initializations + for (func = fcts; func && func->name != NULL; func++) + *func->funcvariable = NULL; + + // Try every possible name + Con_DPrintf ("Trying to load library..."); + for (i = 0; dllnames[i] != NULL; i++) + { + Con_DPrintf (" \"%s\"", dllnames[i]); +#ifdef WIN32 + dllhandle = LoadLibrary (dllnames[i]); #else - vsprintf (start, fmt, argptr); + dllhandle = dlopen (dllnames[i], RTLD_LAZY | RTLD_GLOBAL); #endif - va_end (argptr); + if (dllhandle) + break; + } - if (sys_nostdout) - return; + // 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_DPrintf (" \"%s\"", temp); +#ifdef WIN32 + dllhandle = LoadLibrary (temp); +#else + dllhandle = dlopen (temp, RTLD_LAZY | RTLD_GLOBAL); +#endif + if (dllhandle) + break; + } + } - if (timestamps.value) + // No DLL found + if (! dllhandle) { - mytime = time (NULL); - local = localtime (&mytime); - strftime (stamp, sizeof (stamp), timeformat.string, local); - - snprintf (final, sizeof (final), "%s%s", stamp, start); + Con_DPrintf(" - failed.\n"); + return false; } - else - snprintf (final, sizeof (final), "%s", start); - for (p = (unsigned char *) final; *p; p++) - *p = qfont_table[*p]; + Con_DPrintf(" - loaded.\n"); + + // Get the function adresses + for (func = fcts; func && func->name != NULL; func++) + if (!(*func->funcvariable = (void *) Sys_GetProcAddress (dllhandle, func->name))) + { + Con_DPrintf ("Missing function \"%s\" - broken library!\n", func->name); + Sys_UnloadLibrary (&dllhandle); + return false; + } + + *handle = dllhandle; + return true; +#else + return false; +#endif +} + +void Sys_UnloadLibrary (dllhandle_t* handle) +{ +#ifdef SUPPORTDLL + if (handle == NULL || *handle == NULL) + return; + #ifdef WIN32 - if (cls.state == ca_dedicated) - WriteFile(houtput, final, strlen (final), &dummy, NULL); + FreeLibrary (*handle); #else - puts(final); + dlclose (*handle); #endif -// for (p = (unsigned char *) final; *p; p++) -// putc (qfont_table[*p], stdout); -#ifndef WIN32 - fflush (stdout); + + *handle = NULL; #endif } -void Sys_Shared_Init(void) +void* Sys_GetProcAddress (dllhandle_t handle, const char* name) { - if (COM_CheckParm("-nostdout")) - sys_nostdout = 1; - else - { -#if defined(__linux__) - fcntl(0, F_SETFL, fcntl (0, F_GETFL, 0) | FNDELAY); - printf ("DarkPlaces Linux GL %.2f build %3i", (float) VERSION, buildnumber); -#elif defined(WIN32) - printf ("DarkPlaces Windows GL %.2f build %3i", (float) VERSION, buildnumber); +#ifdef SUPPORTDLL +#ifdef WIN32 + return (void *)GetProcAddress (handle, name); #else - printf ("DarkPlaces Unknown GL %.2f build %3i", (float) VERSION, buildnumber); + return (void *)dlsym (handle, name); +#endif +#else + return NULL; #endif - } } +