1 // cmdlib.c
2
3 #include "cmdlib.h"
4 #include <sys/time.h>
5
6 #define PATHSEPERATOR '/'
7
8 // set these before calling CheckParm
9 int myargc;
10 char **myargv;
11
12 char com_token[1024];
13 int com_eof;
14
15 /*
16 ================
17 I_FloatTime
18 ================
19 */
I_FloatTime(void)20 double I_FloatTime (void)
21 {
22 struct timeval tp;
23 struct timezone tzp;
24 static int secbase;
25
26 gettimeofday(&tp, &tzp);
27
28 if (!secbase)
29 {
30 secbase = tp.tv_sec;
31 return tp.tv_usec/1000000.0;
32 }
33
34 return (tp.tv_sec - secbase) + tp.tv_usec/1000000.0;
35 }
36
37
38 /*
39 ==============
40 COM_Parse
41
42 Parse a token out of a string
43 ==============
44 */
COM_Parse(char * data)45 char *COM_Parse (char *data)
46 {
47 int c;
48 int len;
49
50 len = 0;
51 com_token[0] = 0;
52
53 if (!data)
54 return NULL;
55
56 // skip whitespace
57 skipwhite:
58 while ( (c = *data) <= ' ')
59 {
60 if (c == 0)
61 {
62 com_eof = true;
63 return NULL; // end of file;
64 }
65 data++;
66 }
67
68 // skip // comments
69 if (c=='/' && data[1] == '/')
70 {
71 while (*data && *data != '\n')
72 data++;
73 goto skipwhite;
74 }
75
76
77 // handle quoted strings specially
78 if (c == '\"')
79 {
80 data++;
81 do
82 {
83 c = *data++;
84 if (c=='\"')
85 {
86 com_token[len] = 0;
87 return data;
88 }
89 com_token[len] = c;
90 len++;
91 } while (1);
92 }
93
94 // parse single characters
95 if (c=='{' || c=='}'|| c==')'|| c=='(' || c=='\'' || c==':')
96 {
97 com_token[len] = c;
98 len++;
99 com_token[len] = 0;
100 return data+1;
101 }
102
103 // parse a regular word
104 do
105 {
106 com_token[len] = c;
107 data++;
108 len++;
109 c = *data;
110 if (c=='{' || c=='}'|| c==')'|| c=='(' || c=='\'' || c==':')
111 break;
112 } while (c>32);
113
114 com_token[len] = 0;
115 return data;
116 }
117
118
119
120
121 /*
122 ================
123 filelength
124 ================
125 */
filelength(int handle)126 int filelength (int handle)
127 {
128 struct stat fileinfo;
129
130 if (fstat (handle,&fileinfo) == -1)
131 {
132 Error ("Error fstating");
133 }
134
135 return fileinfo.st_size;
136 }
137
tell(int handle)138 int tell (int handle)
139 {
140 return lseek (handle, 0, SEEK_CUR);
141 }
142
strupr(char * start)143 char *strupr (char *start)
144 {
145 char *in;
146 in = start;
147 while (*in)
148 {
149 *in = toupper(*in);
150 in++;
151 }
152 return start;
153 }
154
strlower(char * start)155 char *strlower (char *start)
156 {
157 char *in;
158 in = start;
159 while (*in)
160 {
161 *in = tolower(*in);
162 in++;
163 }
164 return start;
165 }
166
167
168 /*
169 =============================================================================
170
171 MISC FUNCTIONS
172
173 =============================================================================
174 */
175
176 /*
177 =================
178 Error
179
180 For abnormal program terminations
181 =================
182 */
Error(char * error,...)183 void Error (char *error, ...)
184 {
185 va_list argptr;
186
187 printf ("\n************ ERROR ************\n");
188
189 va_start (argptr,error);
190 vprintf (error,argptr);
191 va_end (argptr);
192 printf ("\n");
193 exit (1);
194 }
195
196
197 /*
198 =================
199 CheckParm
200
201 Checks for the given parameter in the program's command line arguments
202 Returns the argument number (1 to argc-1) or 0 if not present
203 =================
204 */
CheckParm(char * check)205 int CheckParm (char *check)
206 {
207 int i;
208
209 for (i = 1;i<myargc;i++)
210 {
211 if ( !strcasecmp(check, myargv[i]) )
212 return i;
213 }
214
215 return 0;
216 }
217
218
219 #ifndef O_BINARY
220 #define O_BINARY 0
221 #endif
222
SafeOpenWrite(char * filename)223 int SafeOpenWrite (char *filename)
224 {
225 int handle;
226
227 umask (0);
228
229 handle = open(filename,O_WRONLY | O_CREAT | O_TRUNC | O_BINARY
230 , 0666);
231
232 if (handle == -1)
233 Error ("Error opening %s: %s",filename,strerror(errno));
234
235 return handle;
236 }
237
SafeOpenRead(char * filename)238 int SafeOpenRead (char *filename)
239 {
240 int handle;
241
242 handle = open(filename,O_RDONLY | O_BINARY);
243
244 if (handle == -1)
245 Error ("Error opening %s: %s",filename,strerror(errno));
246
247 return handle;
248 }
249
250
SafeRead(int handle,void * buffer,long count)251 void SafeRead (int handle, void *buffer, long count)
252 {
253 if (read (handle,buffer,count) != count)
254 Error ("File read failure");
255 }
256
257
SafeWrite(int handle,void * buffer,long count)258 void SafeWrite (int handle, void *buffer, long count)
259 {
260 if (write (handle,buffer,count) != count)
261 Error ("File write failure");
262 }
263
264
SafeMalloc(long size)265 void *SafeMalloc (long size)
266 {
267 void *ptr;
268
269 ptr = malloc (size);
270
271 if (!ptr)
272 Error ("Malloc failure for %lu bytes",size);
273
274 return ptr;
275 }
276
277
278 /*
279 ==============
280 LoadFile
281 ==============
282 */
LoadFile(char * filename,void ** bufferptr)283 long LoadFile (char *filename, void **bufferptr)
284 {
285 int handle;
286 long length;
287 void *buffer;
288
289 handle = SafeOpenRead (filename);
290 length = filelength (handle);
291 buffer = SafeMalloc (length+1);
292 ((byte *)buffer)[length] = 0;
293 SafeRead (handle, buffer, length);
294 close (handle);
295
296 *bufferptr = buffer;
297 return length;
298 }
299
300
301 /*
302 ==============
303 SaveFile
304 ==============
305 */
SaveFile(char * filename,void * buffer,long count)306 void SaveFile (char *filename, void *buffer, long count)
307 {
308 int handle;
309
310 handle = SafeOpenWrite (filename);
311 SafeWrite (handle, buffer, count);
312 close (handle);
313 }
314
315
316
DefaultExtension(char * path,char * extension)317 void DefaultExtension (char *path, char *extension)
318 {
319 char *src;
320 //
321 // if path doesn't have a .EXT, append extension
322 // (extension should include the .)
323 //
324 src = path + strlen(path) - 1;
325
326 while (*src != PATHSEPERATOR && src != path)
327 {
328 if (*src == '.')
329 return; // it has an extension
330 src--;
331 }
332
333 strcat (path, extension);
334 }
335
336
DefaultPath(char * path,char * basepath)337 void DefaultPath (char *path, char *basepath)
338 {
339 char temp[128];
340
341 if (path[0] == PATHSEPERATOR)
342 return; // absolute path location
343 strcpy (temp,path);
344 strcpy (path,basepath);
345 strcat (path,temp);
346 }
347
348
StripFilename(char * path)349 void StripFilename (char *path)
350 {
351 int length;
352
353 length = strlen(path)-1;
354 while (length > 0 && path[length] != PATHSEPERATOR)
355 length--;
356 path[length] = 0;
357 }
358
StripExtension(char * path)359 void StripExtension (char *path)
360 {
361 int length;
362
363 length = strlen(path)-1;
364 while (length > 0 && path[length] != '.')
365 {
366 length--;
367 if (path[length] == '/')
368 return; // no extension
369 }
370 if (length)
371 path[length] = 0;
372 }
373
374
375 /*
376 ====================
377 Extract file parts
378 ====================
379 */
ExtractFilePath(char * path,char * dest)380 void ExtractFilePath (char *path, char *dest)
381 {
382 char *src;
383
384 src = path + strlen(path) - 1;
385
386 //
387 // back up until a \ or the start
388 //
389 while (src != path && *(src-1) != PATHSEPERATOR)
390 src--;
391
392 memcpy (dest, path, src-path);
393 dest[src-path] = 0;
394 }
395
ExtractFileBase(char * path,char * dest)396 void ExtractFileBase (char *path, char *dest)
397 {
398 char *src;
399
400 src = path + strlen(path) - 1;
401
402 //
403 // back up until a \ or the start
404 //
405 while (src != path && *(src-1) != PATHSEPERATOR)
406 src--;
407
408 while (*src && *src != '.')
409 {
410 *dest++ = *src++;
411 }
412 *dest = 0;
413 }
414
ExtractFileExtension(char * path,char * dest)415 void ExtractFileExtension (char *path, char *dest)
416 {
417 char *src;
418
419 src = path + strlen(path) - 1;
420
421 //
422 // back up until a . or the start
423 //
424 while (src != path && *(src-1) != '.')
425 src--;
426 if (src == path)
427 {
428 *dest = 0; // no extension
429 return;
430 }
431
432 strcpy (dest,src);
433 }
434
435
436 /*
437 ==============
438 ParseNum / ParseHex
439 ==============
440 */
ParseHex(char * hex)441 long ParseHex (char *hex)
442 {
443 char *str;
444 long num;
445
446 num = 0;
447 str = hex;
448
449 while (*str)
450 {
451 num <<= 4;
452 if (*str >= '0' && *str <= '9')
453 num += *str-'0';
454 else if (*str >= 'a' && *str <= 'f')
455 num += 10 + *str-'a';
456 else if (*str >= 'A' && *str <= 'F')
457 num += 10 + *str-'A';
458 else
459 Error ("Bad hex number: %s",hex);
460 str++;
461 }
462
463 return num;
464 }
465
466
ParseNum(char * str)467 long ParseNum (char *str)
468 {
469 if (str[0] == '$')
470 return ParseHex (str+1);
471 if (str[0] == '0' && str[1] == 'x')
472 return ParseHex (str+2);
473 return atol (str);
474 }
475
476
477
478 /*
479 ============================================================================
480
481 BYTE ORDER FUNCTIONS
482
483 ============================================================================
484 */
485
486 #ifdef __BIG_ENDIAN__
487
LittleShort(short l)488 short LittleShort (short l)
489 {
490 byte b1,b2;
491
492 b1 = l&255;
493 b2 = (l>>8)&255;
494
495 return (b1<<8) + b2;
496 }
497
BigShort(short l)498 short BigShort (short l)
499 {
500 return l;
501 }
502
503
LittleLong(long l)504 long LittleLong (long l)
505 {
506 byte b1,b2,b3,b4;
507
508 b1 = l&255;
509 b2 = (l>>8)&255;
510 b3 = (l>>16)&255;
511 b4 = (l>>24)&255;
512
513 return ((long)b1<<24) + ((long)b2<<16) + ((long)b3<<8) + b4;
514 }
515
BigLong(long l)516 long BigLong (long l)
517 {
518 return l;
519 }
520
521
LittleFloat(float l)522 float LittleFloat (float l)
523 {
524 union {byte b[4]; float f;} in, out;
525
526 in.f = l;
527 out.b[0] = in.b[3];
528 out.b[1] = in.b[2];
529 out.b[2] = in.b[1];
530 out.b[3] = in.b[0];
531
532 return out.f;
533 }
534
BigFloat(float l)535 float BigFloat (float l)
536 {
537 return l;
538 }
539
540
541 #else
542
543
BigShort(short l)544 short BigShort (short l)
545 {
546 byte b1,b2;
547
548 b1 = l&255;
549 b2 = (l>>8)&255;
550
551 return (b1<<8) + b2;
552 }
553
LittleShort(short l)554 short LittleShort (short l)
555 {
556 return l;
557 }
558
559
BigLong(long l)560 long BigLong (long l)
561 {
562 byte b1,b2,b3,b4;
563
564 b1 = l&255;
565 b2 = (l>>8)&255;
566 b3 = (l>>16)&255;
567 b4 = (l>>24)&255;
568
569 return ((long)b1<<24) + ((long)b2<<16) + ((long)b3<<8) + b4;
570 }
571
LittleLong(long l)572 long LittleLong (long l)
573 {
574 return l;
575 }
576
BigFloat(float l)577 float BigFloat (float l)
578 {
579 union {byte b[4]; float f;} in, out;
580
581 in.f = l;
582 out.b[0] = in.b[3];
583 out.b[1] = in.b[2];
584 out.b[2] = in.b[1];
585 out.b[3] = in.b[0];
586
587 return out.f;
588 }
589
LittleFloat(float l)590 float LittleFloat (float l)
591 {
592 return l;
593 }
594
595
596
597 #endif
598
599