Details | Last modification | View Log | RSS feed
Rev | Author | Line No. | Line |
---|---|---|---|
5131 | clevermous | 1 | #include |
2 | #include |
||
3 | #include |
||
4 | #include |
||
5 | #include |
||
6 | #include |
||
7 | #include |
||
8 | #include |
||
9 | #include |
||
10 | #include |
||
11 | #include |
||
12 | #include |
||
13 | #include |
||
14 | #include |
||
15 | #include |
||
16 | #include |
||
17 | #include |
||
18 | #include |
||
19 | |||
20 | #include "quakedef.h" |
||
21 | |||
22 | qboolean isDedicated; |
||
23 | |||
24 | int nostdout = 0; |
||
25 | |||
26 | char *basedir = "."; |
||
27 | char *cachedir = "/tmp"; |
||
28 | |||
29 | cvar_t sys_linerefresh = {"sys_linerefresh","0"};// set for entity display |
||
30 | |||
31 | // ======================================================================= |
||
32 | // General routines |
||
33 | // ======================================================================= |
||
34 | |||
35 | void Sys_DebugNumber(int y, int val) |
||
36 | { |
||
37 | } |
||
38 | |||
39 | /* |
||
40 | void Sys_Printf (char *fmt, ...) |
||
41 | { |
||
42 | va_list argptr; |
||
43 | char text[1024]; |
||
44 | |||
45 | va_start (argptr,fmt); |
||
46 | vsprintf (text,fmt,argptr); |
||
47 | va_end (argptr); |
||
48 | fprintf(stderr, "%s", text); |
||
49 | |||
50 | Con_Print (text); |
||
51 | } |
||
52 | |||
53 | void Sys_Printf (char *fmt, ...) |
||
54 | { |
||
55 | |||
56 | va_list argptr; |
||
57 | char text[1024], *t_p; |
||
58 | int l, r; |
||
59 | |||
60 | if (nostdout) |
||
61 | return; |
||
62 | |||
63 | va_start (argptr,fmt); |
||
64 | vsprintf (text,fmt,argptr); |
||
65 | va_end (argptr); |
||
66 | |||
67 | l = strlen(text); |
||
68 | t_p = text; |
||
69 | |||
70 | // make sure everything goes through, even though we are non-blocking |
||
71 | while (l) |
||
72 | { |
||
73 | r = write (1, text, l); |
||
74 | if (r != l) |
||
75 | sleep (0); |
||
76 | if (r > 0) |
||
77 | { |
||
78 | t_p += r; |
||
79 | l -= r; |
||
80 | } |
||
81 | } |
||
82 | |||
83 | } |
||
84 | */ |
||
85 | |||
86 | void Sys_Printf (char *fmt, ...) |
||
87 | { |
||
88 | va_list argptr; |
||
89 | char text[1024]; |
||
90 | unsigned char *p; |
||
91 | |||
92 | va_start (argptr,fmt); |
||
93 | vsprintf (text,fmt,argptr); |
||
94 | va_end (argptr); |
||
95 | |||
96 | if (strlen(text) > sizeof(text)) |
||
97 | Sys_Error("memory overwrite in Sys_Printf"); |
||
98 | |||
99 | if (nostdout) |
||
100 | return; |
||
101 | |||
102 | for (p = (unsigned char *)text; *p; p++) { |
||
103 | *p &= 0x7f; |
||
104 | if ((*p > 128 || *p < 32) && *p != 10 && *p != 13 && *p != 9) |
||
105 | printf("[%02x]", *p); |
||
106 | else |
||
107 | putc(*p, stdout); |
||
108 | } |
||
109 | } |
||
110 | |||
111 | #if 0 |
||
112 | static char end1[] = |
||
113 | "\x1b[?7h\x1b[40m\x1b[2J\x1b[0;1;41m\x1b[1;1H QUAKE: The Doomed Dimension \x1b[33mby \x1b[44mid\x1b[41m Software \x1b[2;1H ---------------------------------------------------------------------------- \x1b[3;1H CALL 1-800-IDGAMES TO ORDER OR FOR TECHNICAL SUPPORT \x1b[4;1H PRICE: $45.00 (PRICES MAY VARY OUTSIDE THE US.) \x1b[5;1H \x1b[6;1H \x1b[37mYes! You only have one fourth of this incredible epic. That is because most \x1b[7;1H of you have paid us nothing or at most, very little. You could steal the \x1b[8;1H game from a friend. But we both know you'll be punished by God if you do. \x1b[9;1H \x1b[33mWHY RISK ETERNAL DAMNATION? CALL 1-800-IDGAMES AND BUY NOW! \x1b[10;1H \x1b[37mRemember, we love you almost as much as He does. \x1b[11;1H \x1b[12;1H \x1b[33mProgramming: \x1b[37mJohn Carmack, Michael Abrash, John Cash \x1b[13;1H \x1b[33mDesign: \x1b[37mJohn Romero, Sandy Petersen, American McGee, Tim Willits \x1b[14;1H \x1b[33mArt: \x1b[37mAdrian Carmack, Kevin Cloud \x1b[15;1H \x1b[33mBiz: \x1b[37mJay Wilbur, Mike Wilson, Donna Jackson \x1b[16;1H \x1b[33mProjects: \x1b[37mShawn Green \x1b[33mSupport: \x1b[37mBarrett Alexander \x1b[17;1H \x1b[33mSound Effects: \x1b[37mTrent Reznor and Nine Inch Nails \x1b[18;1H For other information or details on ordering outside the US, check out the \x1b[19;1H files accompanying QUAKE or our website at http://www.idsoftware.com. \x1b[20;1H \x1b[0;41mQuake is a trademark of Id Software, inc., (c)1996 Id Software, inc. \x1b[21;1H All rights reserved. NIN logo is a registered trademark licensed to \x1b[22;1H Nothing Interactive, Inc. All rights reserved. \x1b[40m\x1b[23;1H\x1b[0m"; |
||
114 | static char end2[] = |
||
115 | "\x1b[?7h\x1b[40m\x1b[2J\x1b[0;1;41m\x1b[1;1H QUAKE \x1b[33mby \x1b[44mid\x1b[41m Software \x1b[2;1H ----------------------------------------------------------------------------- \x1b[3;1H \x1b[37mWhy did you quit from the registered version of QUAKE? Did the \x1b[4;1H scary monsters frighten you? Or did Mr. Sandman tug at your \x1b[5;1H little lids? No matter! What is important is you love our \x1b[6;1H game, and gave us your money. Congratulations, you are probably \x1b[7;1H not a thief. \x1b[8;1H Thank You. \x1b[9;1H \x1b[33;44mid\x1b[41m Software is: \x1b[10;1H PROGRAMMING: \x1b[37mJohn Carmack, Michael Abrash, John Cash \x1b[11;1H \x1b[33mDESIGN: \x1b[37mJohn Romero, Sandy Petersen, American McGee, Tim Willits \x1b[12;1H \x1b[33mART: \x1b[37mAdrian Carmack, Kevin Cloud \x1b[13;1H \x1b[33mBIZ: \x1b[37mJay Wilbur, Mike Wilson \x1b[33mPROJECTS MAN: \x1b[37mShawn Green \x1b[14;1H \x1b[33mBIZ ASSIST: \x1b[37mDonna Jackson \x1b[33mSUPPORT: \x1b[37mBarrett Alexander \x1b[15;1H \x1b[33mSOUND EFFECTS AND MUSIC: \x1b[37mTrent Reznor and Nine Inch Nails \x1b[16;1H \x1b[17;1H If you need help running QUAKE refer to the text files in the \x1b[18;1H QUAKE directory, or our website at http://www.idsoftware.com. \x1b[19;1H If all else fails, call our technical support at 1-800-IDGAMES. \x1b[20;1H \x1b[0;41mQuake is a trademark of Id Software, inc., (c)1996 Id Software, inc. \x1b[21;1H All rights reserved. NIN logo is a registered trademark licensed \x1b[22;1H to Nothing Interactive, Inc. All rights reserved. \x1b[23;1H\x1b[40m\x1b[0m"; |
||
116 | |||
117 | #endif |
||
118 | void Sys_Quit (void) |
||
119 | { |
||
120 | Host_Shutdown(); |
||
121 | fcntl (0, F_SETFL, fcntl (0, F_GETFL, 0) & ~FNDELAY); |
||
122 | #if 0 |
||
123 | if (registered.value) |
||
124 | printf("%s", end2); |
||
125 | else |
||
126 | printf("%s", end1); |
||
127 | #endif |
||
128 | fflush(stdout); |
||
129 | exit(0); |
||
130 | } |
||
131 | |||
132 | void Sys_Init(void) |
||
133 | { |
||
134 | #if id386 |
||
135 | Sys_SetFPCW(); |
||
136 | #endif |
||
137 | } |
||
138 | |||
139 | void Sys_Error (char *error, ...) |
||
140 | { |
||
141 | va_list argptr; |
||
142 | char string[1024]; |
||
143 | |||
144 | // change stdin to non blocking |
||
145 | fcntl (0, F_SETFL, fcntl (0, F_GETFL, 0) & ~FNDELAY); |
||
146 | |||
147 | va_start (argptr,error); |
||
148 | vsprintf (string,error,argptr); |
||
149 | va_end (argptr); |
||
150 | fprintf(stderr, "Error: %s\n", string); |
||
151 | |||
152 | Host_Shutdown (); |
||
153 | exit (1); |
||
154 | |||
155 | } |
||
156 | |||
157 | void Sys_Warn (char *warning, ...) |
||
158 | { |
||
159 | va_list argptr; |
||
160 | char string[1024]; |
||
161 | |||
162 | va_start (argptr,warning); |
||
163 | vsprintf (string,warning,argptr); |
||
164 | va_end (argptr); |
||
165 | fprintf(stderr, "Warning: %s", string); |
||
166 | } |
||
167 | |||
168 | /* |
||
169 | ============ |
||
170 | Sys_FileTime |
||
171 | |||
172 | returns -1 if not present |
||
173 | ============ |
||
174 | */ |
||
175 | int Sys_FileTime (char *path) |
||
176 | { |
||
177 | struct stat buf; |
||
178 | |||
179 | if (stat (path,&buf) == -1) |
||
180 | return -1; |
||
181 | |||
182 | return buf.st_mtime; |
||
183 | } |
||
184 | |||
185 | |||
186 | void Sys_mkdir (char *path) |
||
187 | { |
||
188 | mkdir (path, 0777); |
||
189 | } |
||
190 | |||
191 | int Sys_FileOpenRead (char *path, int *handle) |
||
192 | { |
||
193 | int h; |
||
194 | struct stat fileinfo; |
||
195 | |||
196 | |||
197 | h = open (path, O_RDONLY, 0666); |
||
198 | *handle = h; |
||
199 | if (h == -1) |
||
200 | return -1; |
||
201 | |||
202 | if (fstat (h,&fileinfo) == -1) |
||
203 | Sys_Error ("Error fstating %s", path); |
||
204 | |||
205 | return fileinfo.st_size; |
||
206 | } |
||
207 | |||
208 | int Sys_FileOpenWrite (char *path) |
||
209 | { |
||
210 | int handle; |
||
211 | |||
212 | umask (0); |
||
213 | |||
214 | handle = open(path,O_RDWR | O_CREAT | O_TRUNC |
||
215 | , 0666); |
||
216 | |||
217 | if (handle == -1) |
||
218 | Sys_Error ("Error opening %s: %s", path,strerror(errno)); |
||
219 | |||
220 | return handle; |
||
221 | } |
||
222 | |||
223 | int Sys_FileWrite (int handle, void *src, int count) |
||
224 | { |
||
225 | return write (handle, src, count); |
||
226 | } |
||
227 | |||
228 | void Sys_FileClose (int handle) |
||
229 | { |
||
230 | close (handle); |
||
231 | } |
||
232 | |||
233 | void Sys_FileSeek (int handle, int position) |
||
234 | { |
||
235 | lseek (handle, position, SEEK_SET); |
||
236 | } |
||
237 | |||
238 | int Sys_FileRead (int handle, void *dest, int count) |
||
239 | { |
||
240 | return read (handle, dest, count); |
||
241 | } |
||
242 | |||
243 | void Sys_DebugLog(char *file, char *fmt, ...) |
||
244 | { |
||
245 | va_list argptr; |
||
246 | static char data[1024]; |
||
247 | int fd; |
||
248 | |||
249 | va_start(argptr, fmt); |
||
250 | vsprintf(data, fmt, argptr); |
||
251 | va_end(argptr); |
||
252 | // fd = open(file, O_WRONLY | O_BINARY | O_CREAT | O_APPEND, 0666); |
||
253 | fd = open(file, O_WRONLY | O_CREAT | O_APPEND, 0666); |
||
254 | write(fd, data, strlen(data)); |
||
255 | close(fd); |
||
256 | } |
||
257 | |||
258 | void Sys_EditFile(char *filename) |
||
259 | { |
||
260 | |||
261 | char cmd[256]; |
||
262 | char *term; |
||
263 | char *editor; |
||
264 | |||
265 | term = getenv("TERM"); |
||
266 | if (term && !strcmp(term, "xterm")) |
||
267 | { |
||
268 | editor = getenv("VISUAL"); |
||
269 | if (!editor) |
||
270 | editor = getenv("EDITOR"); |
||
271 | if (!editor) |
||
272 | editor = getenv("EDIT"); |
||
273 | if (!editor) |
||
274 | editor = "vi"; |
||
275 | sprintf(cmd, "xterm -e %s %s", editor, filename); |
||
276 | system(cmd); |
||
277 | } |
||
278 | |||
279 | } |
||
280 | |||
281 | double Sys_FloatTime (void) |
||
282 | { |
||
283 | struct timeval tp; |
||
284 | struct timezone tzp; |
||
285 | static int secbase; |
||
286 | |||
287 | gettimeofday(&tp, &tzp); |
||
288 | |||
289 | if (!secbase) |
||
290 | { |
||
291 | secbase = tp.tv_sec; |
||
292 | return tp.tv_usec/1000000.0; |
||
293 | } |
||
294 | |||
295 | return (tp.tv_sec - secbase) + tp.tv_usec/1000000.0; |
||
296 | } |
||
297 | |||
298 | // ======================================================================= |
||
299 | // Sleeps for microseconds |
||
300 | // ======================================================================= |
||
301 | |||
302 | static volatile int oktogo; |
||
303 | |||
304 | void alarm_handler(int x) |
||
305 | { |
||
306 | oktogo=1; |
||
307 | } |
||
308 | |||
309 | void Sys_LineRefresh(void) |
||
310 | { |
||
311 | } |
||
312 | |||
313 | void floating_point_exception_handler(int whatever) |
||
314 | { |
||
315 | // Sys_Warn("floating point exception\n"); |
||
316 | signal(SIGFPE, floating_point_exception_handler); |
||
317 | } |
||
318 | |||
319 | char *Sys_ConsoleInput(void) |
||
320 | { |
||
321 | static char text[256]; |
||
322 | int len; |
||
323 | fd_set fdset; |
||
324 | struct timeval timeout; |
||
325 | |||
326 | if (cls.state == ca_dedicated) { |
||
327 | FD_ZERO(&fdset); |
||
328 | FD_SET(0, &fdset); // stdin |
||
329 | timeout.tv_sec = 0; |
||
330 | timeout.tv_usec = 0; |
||
331 | if (select (1, &fdset, NULL, NULL, &timeout) == -1 || !FD_ISSET(0, &fdset)) |
||
332 | return NULL; |
||
333 | |||
334 | len = read (0, text, sizeof(text)); |
||
335 | if (len < 1) |
||
336 | return NULL; |
||
337 | text[len-1] = 0; // rip off the /n and terminate |
||
338 | |||
339 | return text; |
||
340 | } |
||
341 | return NULL; |
||
342 | } |
||
343 | |||
344 | #if !id386 |
||
345 | void Sys_HighFPPrecision (void) |
||
346 | { |
||
347 | } |
||
348 | |||
349 | void Sys_LowFPPrecision (void) |
||
350 | { |
||
351 | } |
||
352 | #endif |
||
353 | |||
354 | int main (int c, char **v) |
||
355 | { |
||
356 | |||
357 | double time, oldtime, newtime; |
||
358 | quakeparms_t parms; |
||
359 | extern int vcrFile; |
||
360 | extern int recording; |
||
361 | int j; |
||
362 | |||
363 | // static char cwd[1024]; |
||
364 | |||
365 | // signal(SIGFPE, floating_point_exception_handler); |
||
366 | signal(SIGFPE, SIG_IGN); |
||
367 | |||
368 | memset(&parms, 0, sizeof(parms)); |
||
369 | |||
370 | COM_InitArgv(c, v); |
||
371 | parms.argc = com_argc; |
||
372 | parms.argv = com_argv; |
||
373 | |||
374 | #ifdef GLQUAKE |
||
375 | parms.memsize = 16*1024*1024; |
||
376 | #else |
||
377 | parms.memsize = 8*1024*1024; |
||
378 | #endif |
||
379 | |||
380 | j = COM_CheckParm("-mem"); |
||
381 | if (j) |
||
382 | parms.memsize = (int) (Q_atof(com_argv[j+1]) * 1024 * 1024); |
||
383 | parms.membase = malloc (parms.memsize); |
||
384 | |||
385 | parms.basedir = basedir; |
||
386 | // caching is disabled by default, use -cachedir to enable |
||
387 | // parms.cachedir = cachedir; |
||
388 | |||
389 | fcntl(0, F_SETFL, fcntl (0, F_GETFL, 0) | FNDELAY); |
||
390 | |||
391 | Host_Init(&parms); |
||
392 | |||
393 | Sys_Init(); |
||
394 | |||
395 | if (COM_CheckParm("-nostdout")) |
||
396 | nostdout = 1; |
||
397 | else { |
||
398 | fcntl(0, F_SETFL, fcntl (0, F_GETFL, 0) | FNDELAY); |
||
399 | printf ("Linux Quake -- Version %0.3f\n", LINUX_VERSION); |
||
400 | } |
||
401 | |||
402 | oldtime = Sys_FloatTime () - 0.1; |
||
403 | while (1) |
||
404 | { |
||
405 | // find time spent rendering last frame |
||
406 | newtime = Sys_FloatTime (); |
||
407 | time = newtime - oldtime; |
||
408 | |||
409 | if (cls.state == ca_dedicated) |
||
410 | { // play vcrfiles at max speed |
||
411 | if (time < sys_ticrate.value && (vcrFile == -1 || recording) ) |
||
412 | { |
||
413 | usleep(1); |
||
414 | continue; // not time to run a server only tic yet |
||
415 | } |
||
416 | time = sys_ticrate.value; |
||
417 | } |
||
418 | |||
419 | if (time > sys_ticrate.value*2) |
||
420 | oldtime = newtime; |
||
421 | else |
||
422 | oldtime += time; |
||
423 | |||
424 | Host_Frame (time); |
||
425 | |||
426 | // graphic debugging aids |
||
427 | if (sys_linerefresh.value) |
||
428 | Sys_LineRefresh (); |
||
429 | } |
||
430 | |||
431 | } |
||
432 | |||
433 | |||
434 | /* |
||
435 | ================ |
||
436 | Sys_MakeCodeWriteable |
||
437 | ================ |
||
438 | */ |
||
439 | void Sys_MakeCodeWriteable (unsigned long startaddr, unsigned long length) |
||
440 | { |
||
441 | |||
442 | int r; |
||
443 | unsigned long addr; |
||
444 | int psize = getpagesize(); |
||
445 | |||
446 | addr = (startaddr & ~(psize-1)) - psize; |
||
447 | |||
448 | // fprintf(stderr, "writable code %lx(%lx)-%lx, length=%lx\n", startaddr, |
||
449 | // addr, startaddr+length, length); |
||
450 | |||
451 | r = mprotect((char*)addr, length + startaddr - addr + psize, 7); |
||
452 | |||
453 | if (r < 0) |
||
454 | Sys_Error("Protection change failed\n"); |
||
455 | |||
456 | }>>>> |
||
457 |