-Removed Sys_Quit and added Sys_Shutdown which will be called by Host_Shutdown.
[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 void Sys_Quit (void)
97 {
98         Host_Shutdown();
99         exit(0);
100 }
101
102 char engineversion[128];
103
104 void Sys_Shared_EarlyInit(void)
105 {
106         const char* os;
107
108         Memory_Init ();
109
110         COM_InitArgv();
111         COM_InitGameType();
112
113 #if defined(__linux__)
114         os = "Linux";
115 #elif defined(WIN32)
116         os = "Windows";
117 #elif defined(__NetBSD__)
118         os = "NetBSD";
119 #elif defined(__OpenBSD__)
120         os = "OpenBSD";
121 #else
122         os = "Unknown";
123 #endif
124         snprintf (engineversion, sizeof (engineversion), "%s %s %s", gamename, os, buildstring);
125
126         if (COM_CheckParm("-nostdout"))
127                 sys_nostdout = 1;
128         else
129                 Con_Printf("%s\n", engineversion);
130 }
131
132 void Sys_Shared_LateInit(void)
133 {
134 }
135
136 /*
137 ===============================================================================
138
139 DLL MANAGEMENT
140
141 ===============================================================================
142 */
143
144 qboolean Sys_LoadLibrary (const char* dllname, dllhandle_t* handle, const dllfunction_t *fcts)
145 {
146         const dllfunction_t *func;
147         dllhandle_t dllhandle;
148
149         if (handle == NULL)
150                 return false;
151
152         // Initializations
153         for (func = fcts; func && func->name != NULL; func++)
154                 *func->funcvariable = NULL;
155
156         // Load the DLL
157 #ifdef WIN32
158         dllhandle = LoadLibrary (dllname);
159 #else
160         dllhandle = dlopen (dllname, RTLD_LAZY);
161 #endif
162         if (! dllhandle)
163         {
164                 Con_Printf ("Can't load \"%s\".\n", dllname);
165                 return false;
166         }
167
168         // Get the function adresses
169         for (func = fcts; func && func->name != NULL; func++)
170                 if (!(*func->funcvariable = (void *) Sys_GetProcAddress (dllhandle, func->name)))
171                 {
172                         Con_Printf ("Missing function \"%s\" - broken library!\n", func->name);
173                         Sys_UnloadLibrary (&dllhandle);
174                         return false;
175                 }
176
177         *handle = dllhandle;
178         Con_DPrintf("\"%s\" loaded.\n", dllname);
179         return true;
180 }
181
182 void Sys_UnloadLibrary (dllhandle_t* handle)
183 {
184         if (handle == NULL || *handle == NULL)
185                 return;
186
187 #ifdef WIN32
188         FreeLibrary (*handle);
189 #else
190         dlclose (*handle);
191 #endif
192
193         *handle = NULL;
194 }
195
196 void* Sys_GetProcAddress (dllhandle_t handle, const char* name)
197 {
198 #ifdef WIN32
199         return (void *)GetProcAddress (handle, name);
200 #else
201         return (void *)dlsym (handle, name);
202 #endif
203 }
204