Host_Shutdown now calls CL_Disconnect and Host_ShutdownServer so that quitting withou...
[divverent/darkplaces.git] / sys_shared.c
1
2 #include "quakedef.h"
3 # include <time.h>
4 #ifndef WIN32
5 # include <unistd.h>
6 # include <fcntl.h>
7 # include <dlfcn.h>
8 #endif
9
10 extern cvar_t   timestamps;
11 extern cvar_t   timeformat;
12
13 static int sys_nostdout = false;
14
15 /* The translation table between the graphical font and plain ASCII  --KB */
16 static char qfont_table[256] = {
17         '\0', '#',  '#',  '#',  '#',  '.',  '#',  '#',
18         '#',  9,    10,   '#',  ' ',  13,   '.',  '.',
19         '[',  ']',  '0',  '1',  '2',  '3',  '4',  '5',
20         '6',  '7',  '8',  '9',  '.',  '<',  '=',  '>',
21         ' ',  '!',  '"',  '#',  '$',  '%',  '&',  '\'',
22         '(',  ')',  '*',  '+',  ',',  '-',  '.',  '/',
23         '0',  '1',  '2',  '3',  '4',  '5',  '6',  '7',
24         '8',  '9',  ':',  ';',  '<',  '=',  '>',  '?',
25         '@',  'A',  'B',  'C',  'D',  'E',  'F',  'G',
26         'H',  'I',  'J',  'K',  'L',  'M',  'N',  'O',
27         'P',  'Q',  'R',  'S',  'T',  'U',  'V',  'W',
28         'X',  'Y',  'Z',  '[',  '\\', ']',  '^',  '_',
29         '`',  'a',  'b',  'c',  'd',  'e',  'f',  'g',
30         'h',  'i',  'j',  'k',  'l',  'm',  'n',  'o',
31         'p',  'q',  'r',  's',  't',  'u',  'v',  'w',
32         'x',  'y',  'z',  '{',  '|',  '}',  '~',  '<',
33
34         '<',  '=',  '>',  '#',  '#',  '.',  '#',  '#',
35         '#',  '#',  ' ',  '#',  ' ',  '>',  '.',  '.',
36         '[',  ']',  '0',  '1',  '2',  '3',  '4',  '5',
37         '6',  '7',  '8',  '9',  '.',  '<',  '=',  '>',
38         ' ',  '!',  '"',  '#',  '$',  '%',  '&',  '\'',
39         '(',  ')',  '*',  '+',  ',',  '-',  '.',  '/',
40         '0',  '1',  '2',  '3',  '4',  '5',  '6',  '7',
41         '8',  '9',  ':',  ';',  '<',  '=',  '>',  '?',
42         '@',  'A',  'B',  'C',  'D',  'E',  'F',  'G',
43         'H',  'I',  'J',  'K',  'L',  'M',  'N',  'O',
44         'P',  'Q',  'R',  'S',  'T',  'U',  'V',  'W',
45         'X',  'Y',  'Z',  '[',  '\\', ']',  '^',  '_',
46         '`',  'a',  'b',  'c',  'd',  'e',  'f',  'g',
47         'h',  'i',  'j',  'k',  'l',  'm',  'n',  'o',
48         'p',  'q',  'r',  's',  't',  'u',  'v',  'w',
49         'x',  'y',  'z',  '{',  '|',  '}',  '~',  '<'
50 };
51
52 static char sys_timestring[128];
53 char *Sys_TimeString(const char *timeformat)
54 {
55         time_t mytime = time(NULL);
56         strftime(sys_timestring, sizeof(sys_timestring), timeformat, localtime(&mytime));
57         return sys_timestring;
58 }
59
60
61 #define MAXPRINTMSG 16384
62
63 void Sys_Print(const char *msg)
64 {
65         unsigned char *p;
66         // String we print
67         char final[MAXPRINTMSG];
68
69         if (sys_nostdout)
70                 return;
71
72         if (timestamps.integer)
73                 snprintf(final, sizeof(final), "%s%s", Sys_TimeString(timeformat.string), msg);
74         else
75                 strlcpy (final, msg, sizeof (final));
76
77         // LordHavoc: make sure the string is terminated
78         final[MAXPRINTMSG-1] = 0;
79         for (p = (unsigned char *) final;*p; p++)
80                 *p = qfont_table[*p];
81         Sys_PrintToTerminal(final);
82 }
83
84 void Sys_Printf(const char *fmt, ...)
85 {
86         va_list argptr;
87         char msg[MAXPRINTMSG];  // String we started with
88
89         va_start(argptr,fmt);
90         vsnprintf(msg,sizeof(msg),fmt,argptr);
91         va_end(argptr);
92
93         Sys_Print(msg);
94 }
95
96 extern qboolean host_shuttingdown;
97 void Sys_Quit (void)
98 {
99         host_shuttingdown = true;
100         Host_Shutdown();
101         exit(0);
102 }
103
104 char engineversion[128];
105
106 void Sys_Shared_EarlyInit(void)
107 {
108         const char* os;
109
110         Memory_Init ();
111
112         COM_InitArgv();
113         COM_InitGameType();
114
115 #if defined(__linux__)
116         os = "Linux";
117 #elif defined(WIN32)
118         os = "Windows";
119 #elif defined(__NetBSD__)
120         os = "NetBSD";
121 #elif defined(__OpenBSD__)
122         os = "OpenBSD";
123 #else
124         os = "Unknown";
125 #endif
126         snprintf (engineversion, sizeof (engineversion), "%s %s %s", gamename, os, buildstring);
127
128 // COMMANDLINEOPTION: Console: -nostdout disables text output to the terminal the game was launched from
129         if (COM_CheckParm("-nostdout"))
130                 sys_nostdout = 1;
131         else
132                 Con_Printf("%s\n", engineversion);
133 }
134
135 void Sys_Shared_LateInit(void)
136 {
137 }
138
139 /*
140 ===============================================================================
141
142 DLL MANAGEMENT
143
144 ===============================================================================
145 */
146
147 qboolean Sys_LoadLibrary (const char* dllname, dllhandle_t* handle, const dllfunction_t *fcts)
148 {
149         const dllfunction_t *func;
150         dllhandle_t dllhandle;
151
152         if (handle == NULL)
153                 return false;
154
155         // Initializations
156         for (func = fcts; func && func->name != NULL; func++)
157                 *func->funcvariable = NULL;
158
159         // Load the DLL
160 #ifdef WIN32
161         dllhandle = LoadLibrary (dllname);
162 #else
163         dllhandle = dlopen (dllname, RTLD_LAZY);
164 #endif
165         if (! dllhandle)
166         {
167                 Con_Printf ("Can't load \"%s\".\n", dllname);
168                 return false;
169         }
170
171         // Get the function adresses
172         for (func = fcts; func && func->name != NULL; func++)
173                 if (!(*func->funcvariable = (void *) Sys_GetProcAddress (dllhandle, func->name)))
174                 {
175                         Con_Printf ("Missing function \"%s\" - broken library!\n", func->name);
176                         Sys_UnloadLibrary (&dllhandle);
177                         return false;
178                 }
179
180         *handle = dllhandle;
181         Con_DPrintf("\"%s\" loaded.\n", dllname);
182         return true;
183 }
184
185 void Sys_UnloadLibrary (dllhandle_t* handle)
186 {
187         if (handle == NULL || *handle == NULL)
188                 return;
189
190 #ifdef WIN32
191         FreeLibrary (*handle);
192 #else
193         dlclose (*handle);
194 #endif
195
196         *handle = NULL;
197 }
198
199 void* Sys_GetProcAddress (dllhandle_t handle, const char* name)
200 {
201 #ifdef WIN32
202         return (void *)GetProcAddress (handle, name);
203 #else
204         return (void *)dlsym (handle, name);
205 #endif
206 }
207