X-Git-Url: http://de.git.xonotic.org/?p=xonotic%2Fdarkplaces.git;a=blobdiff_plain;f=sys_shared.c;h=1893c219f460ebbdf49145a8ed8fa530e06575eb;hp=5b81ce0ea877c19e7fbb8eed83bbe09c50d2bdf7;hb=783c61300adf71a38a5c9edb323d6f5ff90ac51d;hpb=80cbaf49351c00ec6dcc52ba01dcad7487ec77ba diff --git a/sys_shared.c b/sys_shared.c index 5b81ce0e..1893c219 100644 --- a/sys_shared.c +++ b/sys_shared.c @@ -1,14 +1,11 @@ #include "quakedef.h" -#include -#ifdef WIN32 -#include -#else -#include -#include -#include +# include +#ifndef WIN32 +# include +# include +# include #endif -#include extern cvar_t timestamps; extern cvar_t timeformat; @@ -52,211 +49,161 @@ static char qfont_table[256] = { 'x', 'y', 'z', '{', '|', '}', '~', '<' }; -#ifdef WIN32 -extern HANDLE hinput, houtput; -#endif - -#define MAX_PRINT_MSG 16384 -void Sys_Printf (const 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.integer) - { - mytime = time (NULL); - local = localtime (&mytime); - strftime (stamp, sizeof (stamp), timeformat.string, local); - - snprintf (final, sizeof (final), "%s%s", stamp, start); - } + snprintf(final, sizeof(final), "%s%s", Sys_TimeString(timeformat.string), msg); else - snprintf (final, sizeof (final), "%s", start); + strlcpy (final, msg, sizeof (final)); // LordHavoc: make sure the string is terminated - final[MAX_PRINT_MSG - 1] = 0; + 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 - printf("%s", final); -#endif + Sys_PrintToTerminal(final); } -// LordHavoc: 256 pak files (was 10) -#define MAX_HANDLES 256 -QFile *sys_handles[MAX_HANDLES]; - -int findhandle (void) +void Sys_Printf(const char *fmt, ...) { - int i; + va_list argptr; + char msg[MAXPRINTMSG]; // String we started with + + va_start(argptr,fmt); + vsnprintf(msg,sizeof(msg),fmt,argptr); + va_end(argptr); - for (i = 1;i < MAX_HANDLES;i++) - if (!sys_handles[i]) - return i; - Sys_Error ("out of handles"); - return -1; + Sys_Print(msg); } -/* -================ -Sys_FileLength -================ -*/ -int Sys_FileLength (QFile *f) +extern qboolean host_shuttingdown; +void Sys_Quit (void) { - int pos, end; - - pos = Qtell (f); - Qseek (f, 0, SEEK_END); - end = Qtell (f); - Qseek (f, pos, SEEK_SET); - - return end; + host_shuttingdown = true; + Host_Shutdown(); + exit(0); } -int Sys_FileOpenRead (const char *path, int *handle) +char engineversion[128]; + +void Sys_Shared_EarlyInit(void) { - QFile *f; - int i, retval; + const char* os; - i = findhandle (); + Memory_Init (); - f = Qopen(path, "rbz"); + COM_InitArgv(); + COM_InitGameType(); - if (!f) - { - *handle = -1; - retval = -1; - } - else - { - sys_handles[i] = f; - *handle = i; - retval = Sys_FileLength(f); - } +#if defined(__linux__) + os = "Linux"; +#elif defined(WIN32) + os = "Windows"; +#elif defined(__FreeBSD__) + os = "FreeBSD"; +#elif defined(__NetBSD__) + os = "NetBSD"; +#elif defined(__OpenBSD__) + os = "OpenBSD"; +#else + os = "Unknown"; +#endif + snprintf (engineversion, sizeof (engineversion), "%s %s %s", gamename, os, buildstring); - return retval; +// COMMANDLINEOPTION: Console: -nostdout disables text output to the terminal the game was launched from + if (COM_CheckParm("-nostdout")) + sys_nostdout = 1; + else + Con_Printf("%s\n", engineversion); } -int Sys_FileOpenWrite (const char *path) +void Sys_Shared_LateInit(void) { - QFile *f; - int i; - - i = findhandle (); - - f = Qopen(path, "wb"); - if (!f) - { - Con_Printf("Sys_FileOpenWrite: Error opening %s: %s", path, strerror(errno)); - return 0; - } - sys_handles[i] = f; - - return i; } -void Sys_FileClose (int handle) -{ - Qclose (sys_handles[handle]); - sys_handles[handle] = NULL; -} +/* +=============================================================================== -void Sys_FileSeek (int handle, int position) -{ - Qseek (sys_handles[handle], position, SEEK_SET); -} +DLL MANAGEMENT -int Sys_FileRead (int handle, void *dest, int count) -{ - return Qread (sys_handles[handle], dest, count); -} +=============================================================================== +*/ -int Sys_FileWrite (int handle, void *data, int count) +qboolean Sys_LoadLibrary (const char* dllname, dllhandle_t* handle, const dllfunction_t *fcts) { - return Qwrite (sys_handles[handle], data, count); -} + const dllfunction_t *func; + dllhandle_t dllhandle; -int Sys_FileTime (const char *path) -{ -#if WIN32 - QFile *f; + if (handle == NULL) + return false; - f = Qopen(path, "rb"); - if (f) - { - Qclose(f); - return 1; - } + // Initializations + for (func = fcts; func && func->name != NULL; func++) + *func->funcvariable = NULL; - return -1; + // Load the DLL +#ifdef WIN32 + dllhandle = LoadLibrary (dllname); #else - struct stat buf; - - if (stat (path,&buf) == -1) - return -1; - - return buf.st_mtime; + dllhandle = dlopen (dllname, RTLD_LAZY); #endif -} + if (! dllhandle) + { + Con_Printf ("Can't load \"%s\".\n", dllname); + return false; + } -void Sys_mkdir (const char *path) -{ -#if WIN32 - _mkdir (path); -#else - mkdir (path, 0777); -#endif + // 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; } -char engineversion[128]; - -void Sys_Shared_EarlyInit(void) +void Sys_UnloadLibrary (dllhandle_t* handle) { - Memory_Init (); - - COM_InitArgv(); - COM_InitGameType(); + if (handle == NULL || *handle == NULL) + return; -#if defined(__linux__) - sprintf (engineversion, "%s Linux %s", gamename, buildstring); -#elif defined(WIN32) - sprintf (engineversion, "%s Windows %s", gamename, buildstring); +#ifdef WIN32 + FreeLibrary (*handle); #else - sprintf (engineversion, "%s Unknown %s", gamename, buildstring); + dlclose (*handle); #endif - if (COM_CheckParm("-nostdout")) - sys_nostdout = 1; - else - printf("%s\n", engineversion); + *handle = NULL; } -void Sys_Shared_LateInit(void) +void* Sys_GetProcAddress (dllhandle_t handle, const char* name) { +#ifdef WIN32 + return (void *)GetProcAddress (handle, name); +#else + return (void *)dlsym (handle, name); +#endif }