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