X-Git-Url: http://git.xonotic.org/?a=blobdiff_plain;f=sys_shared.c;h=dfd9a7a37e72b0bff8dffc79bc5f783638ccbfc8;hb=6631251252a526c873d18d381d26a47bafe5ab51;hp=52a28285a16dc86924b02d8a5468bf9c4e9f5534;hpb=dab565345260287a1b98d0fc701ee055cbc3d343;p=xonotic%2Fdarkplaces.git diff --git a/sys_shared.c b/sys_shared.c index 52a28285..dfd9a7a3 100644 --- a/sys_shared.c +++ b/sys_shared.c @@ -1,6 +1,11 @@ #include "quakedef.h" -#include +# include +#ifndef WIN32 +# include +# include +# include +#endif extern cvar_t timestamps; extern cvar_t timeformat; @@ -39,81 +44,161 @@ static char qfont_table[256] = { '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', + '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; -#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); + strftime(sys_timestring, sizeof(sys_timestring), timeformat, localtime(&mytime)); + return sys_timestring; +} - time_t mytime = 0; - struct tm *local = NULL; - unsigned char *p; -#ifdef WIN32 - DWORD dummy; -#endif +#define MAXPRINTMSG 16384 - va_start (argptr, fmt); -#ifdef HAVE_VSNPRINTF - vsnprintf (start, sizeof(start), fmt, argptr); -#else - vsprintf (start, fmt, argptr); -#endif - va_end (argptr); +void Sys_Print(const char *msg) +{ + unsigned char *p; + // String we print + char final[MAXPRINTMSG]; if (sys_nostdout) return; - if (timestamps.value) - { - mytime = time (NULL); - local = localtime (&mytime); - strftime (stamp, sizeof (stamp), timeformat.string, local); - - snprintf (final, sizeof (final), "%s%s", stamp, start); - } + if (timestamps.integer) + snprintf(final, sizeof(final), "%s%s", Sys_TimeString(timeformat.string), msg); else - snprintf (final, sizeof (final), "%s", start); + strlcpy (final, msg, sizeof (final)); - for (p = (unsigned char *) final; *p; p++) + // LordHavoc: make sure the string is terminated + final[MAXPRINTMSG-1] = 0; + for (p = (unsigned char *) final;*p; p++) *p = qfont_table[*p]; -#ifdef WIN32 - if (cls.state == ca_dedicated) - WriteFile(houtput, final, strlen (final), &dummy, NULL); -#else - puts(final); -#endif -// for (p = (unsigned char *) final; *p; p++) -// putc (qfont_table[*p], stdout); -#ifndef WIN32 - fflush (stdout); -#endif + 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); +} + +void Sys_Quit (void) +{ + Host_Shutdown(); + exit(0); } -void Sys_Shared_Init(void) +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 - { -#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); + Con_Printf("%s\n", engineversion); +} + +void Sys_Shared_LateInit(void) +{ +} + +/* +=============================================================================== + +DLL MANAGEMENT + +=============================================================================== +*/ + +qboolean Sys_LoadLibrary (const char* dllname, dllhandle_t* handle, const dllfunction_t *fcts) +{ + const dllfunction_t *func; + dllhandle_t dllhandle; + + if (handle == NULL) + return false; + + // Initializations + for (func = fcts; func && func->name != NULL; func++) + *func->funcvariable = NULL; + + // Load the DLL +#ifdef WIN32 + dllhandle = LoadLibrary (dllname); #else - printf ("DarkPlaces Unknown GL %.2f build %3i", (float) VERSION, buildnumber); + dllhandle = dlopen (dllname, RTLD_LAZY); #endif + if (! dllhandle) + { + Con_Printf ("Can't load \"%s\".\n", dllname); + return false; } + + // 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; + Con_DPrintf("\"%s\" loaded.\n", dllname); + return true; } + +void Sys_UnloadLibrary (dllhandle_t* handle) +{ + if (handle == NULL || *handle == NULL) + return; + +#ifdef WIN32 + FreeLibrary (*handle); +#else + dlclose (*handle); +#endif + + *handle = NULL; +} + +void* Sys_GetProcAddress (dllhandle_t handle, const char* name) +{ +#ifdef WIN32 + return (void *)GetProcAddress (handle, name); +#else + return (void *)dlsym (handle, name); +#endif +} +