added COMMANDLINEOPTION comments for every commandline option, these will be listed...
[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 // COMMANDLINEOPTION: -nostdout disables text output to the terminal the game was launched from
127         if (COM_CheckParm("-nostdout"))
128                 sys_nostdout = 1;
129         else
130                 Con_Printf("%s\n", engineversion);
131 }
132
133 void Sys_Shared_LateInit(void)
134 {
135 }
136
137 /*
138 ===============================================================================
139
140 DLL MANAGEMENT
141
142 ===============================================================================
143 */
144
145 qboolean Sys_LoadLibrary (const char* dllname, dllhandle_t* handle, const dllfunction_t *fcts)
146 {
147         const dllfunction_t *func;
148         dllhandle_t dllhandle;
149
150         if (handle == NULL)
151                 return false;
152
153         // Initializations
154         for (func = fcts; func && func->name != NULL; func++)
155                 *func->funcvariable = NULL;
156
157         // Load the DLL
158 #ifdef WIN32
159         dllhandle = LoadLibrary (dllname);
160 #else
161         dllhandle = dlopen (dllname, RTLD_LAZY);
162 #endif
163         if (! dllhandle)
164         {
165                 Con_Printf ("Can't load \"%s\".\n", dllname);
166                 return false;
167         }
168
169         // Get the function adresses
170         for (func = fcts; func && func->name != NULL; func++)
171                 if (!(*func->funcvariable = (void *) Sys_GetProcAddress (dllhandle, func->name)))
172                 {
173                         Con_Printf ("Missing function \"%s\" - broken library!\n", func->name);
174                         Sys_UnloadLibrary (&dllhandle);
175                         return false;
176                 }
177
178         *handle = dllhandle;
179         Con_DPrintf("\"%s\" loaded.\n", dllname);
180         return true;
181 }
182
183 void Sys_UnloadLibrary (dllhandle_t* handle)
184 {
185         if (handle == NULL || *handle == NULL)
186                 return;
187
188 #ifdef WIN32
189         FreeLibrary (*handle);
190 #else
191         dlclose (*handle);
192 #endif
193
194         *handle = NULL;
195 }
196
197 void* Sys_GetProcAddress (dllhandle_t handle, const char* name)
198 {
199 #ifdef WIN32
200         return (void *)GetProcAddress (handle, name);
201 #else
202         return (void *)dlsym (handle, name);
203 #endif
204 }
205