Created new subdir: uquake. Pick your favorite U word for the meaning --
Unchained, Ultimate, Ultra, Up Yours, Underworld, Underground, Unified,
Unity, etc. You know the drill.
This takes care of the "standalone" problem with the wrong name, and the
recent snafu with multiple developers working on the same files
simultaneously...expect me (and probably others) to start locking dirs when
updates are taking place.
And yes, this update is really as large as it looks. Software only at the
moment, but I will have the makefile updated to build the GL builds as
well.
1999-12-26 13:51:52 +00:00
|
|
|
/*
|
|
|
|
Copyright (C) 1996-1997 Id Software, Inc.
|
2000-01-08 04:50:26 +00:00
|
|
|
Portions Copyright (C) 1999,2000 Nelson Rush.
|
2000-01-27 17:06:02 +00:00
|
|
|
Copyright (C) 1999,2000 contributors of the QuakeForge project
|
|
|
|
Please see the file "AUTHORS" for a list of contributors
|
Created new subdir: uquake. Pick your favorite U word for the meaning --
Unchained, Ultimate, Ultra, Up Yours, Underworld, Underground, Unified,
Unity, etc. You know the drill.
This takes care of the "standalone" problem with the wrong name, and the
recent snafu with multiple developers working on the same files
simultaneously...expect me (and probably others) to start locking dirs when
updates are taking place.
And yes, this update is really as large as it looks. Software only at the
moment, but I will have the makefile updated to build the GL builds as
well.
1999-12-26 13:51:52 +00:00
|
|
|
|
|
|
|
This program is free software; you can redistribute it and/or
|
|
|
|
modify it under the terms of the GNU General Public License
|
|
|
|
as published by the Free Software Foundation; either version 2
|
|
|
|
of the License, or (at your option) any later version.
|
|
|
|
|
|
|
|
This program is distributed in the hope that it will be useful,
|
|
|
|
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
|
|
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
|
|
|
|
|
|
|
|
See the GNU General Public License for more details.
|
|
|
|
|
|
|
|
You should have received a copy of the GNU General Public License
|
|
|
|
along with this program; if not, write to the Free Software
|
|
|
|
Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
|
|
|
|
|
|
|
|
*/
|
|
|
|
// common.c -- misc functions used in client and server
|
|
|
|
|
2000-01-22 09:16:19 +00:00
|
|
|
#include <string.h>
|
2000-01-28 01:03:09 +00:00
|
|
|
#include <qtypes.h>
|
|
|
|
#include <qdefs.h>
|
|
|
|
#include <cvar.h>
|
|
|
|
#include <quakefs.h>
|
|
|
|
#include <common.h>
|
|
|
|
#include <net.h>
|
|
|
|
#include <zone.h>
|
|
|
|
#include <sys.h>
|
|
|
|
#include <qendian.h>
|
|
|
|
#include <console.h>
|
|
|
|
#include <cmd.h>
|
|
|
|
#include <stdarg.h>
|
|
|
|
#include <lib_replace.h>
|
|
|
|
|
Created new subdir: uquake. Pick your favorite U word for the meaning --
Unchained, Ultimate, Ultra, Up Yours, Underworld, Underground, Unified,
Unity, etc. You know the drill.
This takes care of the "standalone" problem with the wrong name, and the
recent snafu with multiple developers working on the same files
simultaneously...expect me (and probably others) to start locking dirs when
updates are taking place.
And yes, this update is really as large as it looks. Software only at the
moment, but I will have the makefile updated to build the GL builds as
well.
1999-12-26 13:51:52 +00:00
|
|
|
|
|
|
|
#define NUM_SAFE_ARGVS 7
|
|
|
|
|
|
|
|
static char *largv[MAX_NUM_ARGVS + NUM_SAFE_ARGVS + 1];
|
|
|
|
static char *argvdummy = " ";
|
|
|
|
|
|
|
|
static char *safeargvs[NUM_SAFE_ARGVS] =
|
|
|
|
{"-stdvid", "-nolan", "-nosound", "-nocdaudio", "-nojoy", "-nomouse", "-dibonly"};
|
|
|
|
|
|
|
|
cvar_t cmdline = {"cmdline","0", false, true};
|
|
|
|
|
|
|
|
qboolean com_modified; // set true if using non-id files
|
|
|
|
|
|
|
|
qboolean proghack;
|
|
|
|
|
|
|
|
qboolean msg_suppress_1 = 0;
|
|
|
|
|
|
|
|
void COM_InitFilesystem (void);
|
|
|
|
|
|
|
|
// if a packfile directory differs from this, it is assumed to be hacked
|
|
|
|
#define PAK0_COUNT 339
|
|
|
|
#define PAK0_CRC 32981
|
|
|
|
|
|
|
|
char com_token[1024];
|
|
|
|
int com_argc;
|
|
|
|
char **com_argv;
|
|
|
|
|
|
|
|
#define CMDLINE_LENGTH 256
|
|
|
|
char com_cmdline[CMDLINE_LENGTH];
|
|
|
|
|
|
|
|
qboolean standard_quake = true, rogue, hipnotic;
|
|
|
|
|
2000-01-06 22:02:55 +00:00
|
|
|
extern cvar_t developer;
|
|
|
|
|
Created new subdir: uquake. Pick your favorite U word for the meaning --
Unchained, Ultimate, Ultra, Up Yours, Underworld, Underground, Unified,
Unity, etc. You know the drill.
This takes care of the "standalone" problem with the wrong name, and the
recent snafu with multiple developers working on the same files
simultaneously...expect me (and probably others) to start locking dirs when
updates are taking place.
And yes, this update is really as large as it looks. Software only at the
moment, but I will have the makefile updated to build the GL builds as
well.
1999-12-26 13:51:52 +00:00
|
|
|
//============================================================================
|
|
|
|
|
|
|
|
|
|
|
|
// ClearLink is used for new headnodes
|
|
|
|
void ClearLink (link_t *l)
|
|
|
|
{
|
|
|
|
l->prev = l->next = l;
|
|
|
|
}
|
|
|
|
|
|
|
|
void RemoveLink (link_t *l)
|
|
|
|
{
|
|
|
|
l->next->prev = l->prev;
|
|
|
|
l->prev->next = l->next;
|
|
|
|
}
|
|
|
|
|
|
|
|
void InsertLinkBefore (link_t *l, link_t *before)
|
|
|
|
{
|
|
|
|
l->next = before;
|
|
|
|
l->prev = before->prev;
|
|
|
|
l->prev->next = l;
|
|
|
|
l->next->prev = l;
|
|
|
|
}
|
|
|
|
void InsertLinkAfter (link_t *l, link_t *after)
|
|
|
|
{
|
|
|
|
l->next = after->next;
|
|
|
|
l->prev = after;
|
|
|
|
l->prev->next = l;
|
|
|
|
l->next->prev = l;
|
|
|
|
}
|
|
|
|
|
|
|
|
/*
|
|
|
|
==============================================================================
|
|
|
|
|
|
|
|
MESSAGE IO FUNCTIONS
|
|
|
|
|
|
|
|
Handles byte ordering and avoids alignment errors
|
|
|
|
==============================================================================
|
|
|
|
*/
|
|
|
|
|
|
|
|
//
|
|
|
|
// writing functions
|
|
|
|
//
|
|
|
|
|
|
|
|
void MSG_WriteChar (sizebuf_t *sb, int c)
|
|
|
|
{
|
|
|
|
byte *buf;
|
|
|
|
|
|
|
|
#ifdef PARANOID
|
|
|
|
if (c < -128 || c > 127)
|
|
|
|
Sys_Error ("MSG_WriteChar: range error");
|
|
|
|
#endif
|
|
|
|
|
|
|
|
buf = SZ_GetSpace (sb, 1);
|
|
|
|
buf[0] = c;
|
|
|
|
}
|
|
|
|
|
|
|
|
void MSG_WriteByte (sizebuf_t *sb, int c)
|
|
|
|
{
|
|
|
|
byte *buf;
|
|
|
|
|
|
|
|
#ifdef PARANOID
|
|
|
|
if (c < 0 || c > 255)
|
|
|
|
Sys_Error ("MSG_WriteByte: range error");
|
|
|
|
#endif
|
|
|
|
|
|
|
|
buf = SZ_GetSpace (sb, 1);
|
|
|
|
buf[0] = c;
|
|
|
|
}
|
|
|
|
|
|
|
|
void MSG_WriteShort (sizebuf_t *sb, int c)
|
|
|
|
{
|
|
|
|
byte *buf;
|
|
|
|
|
|
|
|
#ifdef PARANOID
|
|
|
|
if (c < ((short)0x8000) || c > (short)0x7fff)
|
|
|
|
Sys_Error ("MSG_WriteShort: range error");
|
|
|
|
#endif
|
|
|
|
|
|
|
|
buf = SZ_GetSpace (sb, 2);
|
|
|
|
buf[0] = c&0xff;
|
|
|
|
buf[1] = c>>8;
|
|
|
|
}
|
|
|
|
|
|
|
|
void MSG_WriteLong (sizebuf_t *sb, int c)
|
|
|
|
{
|
|
|
|
byte *buf;
|
|
|
|
|
|
|
|
buf = SZ_GetSpace (sb, 4);
|
|
|
|
buf[0] = c&0xff;
|
|
|
|
buf[1] = (c>>8)&0xff;
|
|
|
|
buf[2] = (c>>16)&0xff;
|
|
|
|
buf[3] = c>>24;
|
|
|
|
}
|
|
|
|
|
|
|
|
void MSG_WriteFloat (sizebuf_t *sb, float f)
|
|
|
|
{
|
|
|
|
union
|
|
|
|
{
|
|
|
|
float f;
|
|
|
|
int l;
|
|
|
|
} dat;
|
|
|
|
|
|
|
|
|
|
|
|
dat.f = f;
|
|
|
|
dat.l = LittleLong (dat.l);
|
|
|
|
|
|
|
|
SZ_Write (sb, &dat.l, 4);
|
|
|
|
}
|
|
|
|
|
|
|
|
void MSG_WriteString (sizebuf_t *sb, char *s)
|
|
|
|
{
|
|
|
|
if (!s)
|
|
|
|
SZ_Write (sb, "", 1);
|
|
|
|
else
|
|
|
|
SZ_Write (sb, s, Q_strlen(s)+1);
|
|
|
|
}
|
|
|
|
|
|
|
|
void MSG_WriteCoord (sizebuf_t *sb, float f)
|
|
|
|
{
|
|
|
|
MSG_WriteShort (sb, (int)(f*8));
|
|
|
|
}
|
|
|
|
|
|
|
|
void MSG_WriteAngle (sizebuf_t *sb, float f)
|
|
|
|
{
|
|
|
|
MSG_WriteByte (sb, ((int)f*256/360) & 255);
|
|
|
|
}
|
|
|
|
|
|
|
|
//
|
|
|
|
// reading functions
|
|
|
|
//
|
|
|
|
int msg_readcount;
|
|
|
|
qboolean msg_badread;
|
|
|
|
|
|
|
|
void MSG_BeginReading (void)
|
|
|
|
{
|
|
|
|
msg_readcount = 0;
|
|
|
|
msg_badread = false;
|
|
|
|
}
|
|
|
|
|
|
|
|
// returns -1 and sets msg_badread if no more characters are available
|
|
|
|
int MSG_ReadChar (void)
|
|
|
|
{
|
|
|
|
int c;
|
|
|
|
|
|
|
|
if (msg_readcount+1 > net_message.cursize)
|
|
|
|
{
|
|
|
|
msg_badread = true;
|
|
|
|
return -1;
|
|
|
|
}
|
|
|
|
|
|
|
|
c = (signed char)net_message.data[msg_readcount];
|
|
|
|
msg_readcount++;
|
|
|
|
|
|
|
|
return c;
|
|
|
|
}
|
|
|
|
|
|
|
|
int MSG_ReadByte (void)
|
|
|
|
{
|
|
|
|
int c;
|
|
|
|
|
|
|
|
if (msg_readcount+1 > net_message.cursize)
|
|
|
|
{
|
|
|
|
msg_badread = true;
|
|
|
|
return -1;
|
|
|
|
}
|
|
|
|
|
|
|
|
c = (unsigned char)net_message.data[msg_readcount];
|
|
|
|
msg_readcount++;
|
|
|
|
|
|
|
|
return c;
|
|
|
|
}
|
|
|
|
|
|
|
|
int MSG_ReadShort (void)
|
|
|
|
{
|
|
|
|
int c;
|
|
|
|
|
|
|
|
if (msg_readcount+2 > net_message.cursize)
|
|
|
|
{
|
|
|
|
msg_badread = true;
|
|
|
|
return -1;
|
|
|
|
}
|
|
|
|
|
|
|
|
c = (short)(net_message.data[msg_readcount]
|
|
|
|
+ (net_message.data[msg_readcount+1]<<8));
|
|
|
|
|
|
|
|
msg_readcount += 2;
|
|
|
|
|
|
|
|
return c;
|
|
|
|
}
|
|
|
|
|
|
|
|
int MSG_ReadLong (void)
|
|
|
|
{
|
|
|
|
int c;
|
|
|
|
|
|
|
|
if (msg_readcount+4 > net_message.cursize)
|
|
|
|
{
|
|
|
|
msg_badread = true;
|
|
|
|
return -1;
|
|
|
|
}
|
|
|
|
|
|
|
|
c = net_message.data[msg_readcount]
|
|
|
|
+ (net_message.data[msg_readcount+1]<<8)
|
|
|
|
+ (net_message.data[msg_readcount+2]<<16)
|
|
|
|
+ (net_message.data[msg_readcount+3]<<24);
|
|
|
|
|
|
|
|
msg_readcount += 4;
|
|
|
|
|
|
|
|
return c;
|
|
|
|
}
|
|
|
|
|
|
|
|
float MSG_ReadFloat (void)
|
|
|
|
{
|
|
|
|
union
|
|
|
|
{
|
|
|
|
byte b[4];
|
|
|
|
float f;
|
|
|
|
int l;
|
|
|
|
} dat;
|
|
|
|
|
|
|
|
dat.b[0] = net_message.data[msg_readcount];
|
|
|
|
dat.b[1] = net_message.data[msg_readcount+1];
|
|
|
|
dat.b[2] = net_message.data[msg_readcount+2];
|
|
|
|
dat.b[3] = net_message.data[msg_readcount+3];
|
|
|
|
msg_readcount += 4;
|
|
|
|
|
|
|
|
dat.l = LittleLong (dat.l);
|
|
|
|
|
|
|
|
return dat.f;
|
|
|
|
}
|
|
|
|
|
|
|
|
char *MSG_ReadString (void)
|
|
|
|
{
|
|
|
|
static char string[2048];
|
|
|
|
int l,c;
|
|
|
|
|
|
|
|
l = 0;
|
|
|
|
do
|
|
|
|
{
|
|
|
|
c = MSG_ReadChar ();
|
|
|
|
if (c == -1 || c == 0)
|
|
|
|
break;
|
|
|
|
string[l] = c;
|
|
|
|
l++;
|
|
|
|
} while (l < sizeof(string)-1);
|
|
|
|
|
|
|
|
string[l] = 0;
|
|
|
|
|
|
|
|
return string;
|
|
|
|
}
|
|
|
|
|
|
|
|
float MSG_ReadCoord (void)
|
|
|
|
{
|
|
|
|
return MSG_ReadShort() * (1.0/8);
|
|
|
|
}
|
|
|
|
|
|
|
|
float MSG_ReadAngle (void)
|
|
|
|
{
|
|
|
|
return MSG_ReadChar() * (360.0/256);
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
//===========================================================================
|
|
|
|
|
|
|
|
void SZ_Alloc (sizebuf_t *buf, int startsize)
|
|
|
|
{
|
|
|
|
if (startsize < 256)
|
|
|
|
startsize = 256;
|
|
|
|
buf->data = Hunk_AllocName (startsize, "sizebuf");
|
|
|
|
buf->maxsize = startsize;
|
|
|
|
buf->cursize = 0;
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
void SZ_Free (sizebuf_t *buf)
|
|
|
|
{
|
|
|
|
// Z_Free (buf->data);
|
|
|
|
// buf->data = NULL;
|
|
|
|
// buf->maxsize = 0;
|
|
|
|
buf->cursize = 0;
|
|
|
|
}
|
|
|
|
|
|
|
|
void SZ_Clear (sizebuf_t *buf)
|
|
|
|
{
|
|
|
|
buf->cursize = 0;
|
|
|
|
}
|
|
|
|
|
|
|
|
void *SZ_GetSpace (sizebuf_t *buf, int length)
|
|
|
|
{
|
|
|
|
void *data;
|
|
|
|
|
|
|
|
if (buf->cursize + length > buf->maxsize)
|
|
|
|
{
|
|
|
|
if (!buf->allowoverflow)
|
|
|
|
Sys_Error ("SZ_GetSpace: overflow without allowoverflow set");
|
|
|
|
|
|
|
|
if (length > buf->maxsize)
|
|
|
|
Sys_Error ("SZ_GetSpace: %i is > full buffer size", length);
|
|
|
|
|
|
|
|
buf->overflowed = true;
|
|
|
|
Con_Printf ("SZ_GetSpace: overflow");
|
|
|
|
SZ_Clear (buf);
|
|
|
|
}
|
|
|
|
|
|
|
|
data = buf->data + buf->cursize;
|
|
|
|
buf->cursize += length;
|
|
|
|
|
|
|
|
return data;
|
|
|
|
}
|
|
|
|
|
|
|
|
void SZ_Write (sizebuf_t *buf, void *data, int length)
|
|
|
|
{
|
|
|
|
Q_memcpy (SZ_GetSpace(buf,length),data,length);
|
|
|
|
}
|
|
|
|
|
|
|
|
void SZ_Print (sizebuf_t *buf, char *data)
|
|
|
|
{
|
|
|
|
int len;
|
|
|
|
|
|
|
|
len = Q_strlen(data)+1;
|
|
|
|
|
|
|
|
// byte * cast to keep VC++ happy
|
|
|
|
if (buf->data[buf->cursize-1])
|
|
|
|
Q_memcpy ((byte *)SZ_GetSpace(buf, len),data,len); // no trailing 0
|
|
|
|
else
|
|
|
|
Q_memcpy ((byte *)SZ_GetSpace(buf, len-1)-1,data,len); // write over trailing 0
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
//============================================================================
|
|
|
|
|
|
|
|
|
|
|
|
/*
|
|
|
|
============
|
|
|
|
COM_SkipPath
|
|
|
|
============
|
|
|
|
*/
|
|
|
|
char *COM_SkipPath (char *pathname)
|
|
|
|
{
|
|
|
|
char *last;
|
|
|
|
|
|
|
|
last = pathname;
|
|
|
|
while (*pathname)
|
|
|
|
{
|
|
|
|
if (*pathname=='/')
|
|
|
|
last = pathname+1;
|
|
|
|
pathname++;
|
|
|
|
}
|
|
|
|
return last;
|
|
|
|
}
|
|
|
|
|
|
|
|
/*
|
|
|
|
============
|
|
|
|
COM_StripExtension
|
|
|
|
============
|
|
|
|
*/
|
|
|
|
void COM_StripExtension (char *in, char *out)
|
|
|
|
{
|
|
|
|
while (*in && *in != '.')
|
|
|
|
*out++ = *in++;
|
|
|
|
*out = 0;
|
|
|
|
}
|
|
|
|
|
|
|
|
/*
|
|
|
|
============
|
|
|
|
COM_FileExtension
|
|
|
|
============
|
|
|
|
*/
|
|
|
|
char *COM_FileExtension (char *in)
|
|
|
|
{
|
|
|
|
static char exten[8];
|
|
|
|
int i;
|
|
|
|
|
|
|
|
while (*in && *in != '.')
|
|
|
|
in++;
|
|
|
|
if (!*in)
|
|
|
|
return "";
|
|
|
|
in++;
|
|
|
|
for (i=0 ; i<7 && *in ; i++,in++)
|
|
|
|
exten[i] = *in;
|
|
|
|
exten[i] = 0;
|
|
|
|
return exten;
|
|
|
|
}
|
|
|
|
|
|
|
|
/*
|
|
|
|
============
|
|
|
|
COM_FileBase
|
|
|
|
============
|
|
|
|
*/
|
|
|
|
void COM_FileBase (char *in, char *out)
|
|
|
|
{
|
|
|
|
char *s, *s2;
|
|
|
|
|
|
|
|
s = in + strlen(in) - 1;
|
|
|
|
|
|
|
|
while (s != in && *s != '.')
|
|
|
|
s--;
|
|
|
|
|
|
|
|
for (s2 = s ; *s2 && *s2 != '/' ; s2--)
|
|
|
|
;
|
|
|
|
|
|
|
|
if (s-s2 < 2)
|
|
|
|
strcpy (out,"?model?");
|
|
|
|
else
|
|
|
|
{
|
|
|
|
s--;
|
|
|
|
strncpy (out,s2+1, s-s2);
|
|
|
|
out[s-s2] = 0;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
/*
|
|
|
|
==================
|
|
|
|
COM_DefaultExtension
|
|
|
|
==================
|
|
|
|
*/
|
|
|
|
void COM_DefaultExtension (char *path, char *extension)
|
|
|
|
{
|
|
|
|
char *src;
|
|
|
|
//
|
|
|
|
// if path doesn't have a .EXT, append extension
|
|
|
|
// (extension should include the .)
|
|
|
|
//
|
|
|
|
src = path + strlen(path) - 1;
|
|
|
|
|
|
|
|
while (*src != '/' && src != path)
|
|
|
|
{
|
|
|
|
if (*src == '.')
|
|
|
|
return; // it has an extension
|
|
|
|
src--;
|
|
|
|
}
|
|
|
|
|
|
|
|
strcat (path, extension);
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
/*
|
|
|
|
==============
|
|
|
|
COM_Parse
|
|
|
|
|
|
|
|
Parse a token out of a string
|
|
|
|
==============
|
|
|
|
*/
|
|
|
|
char *COM_Parse (char *data)
|
|
|
|
{
|
|
|
|
int c;
|
|
|
|
int len;
|
|
|
|
|
|
|
|
len = 0;
|
|
|
|
com_token[0] = 0;
|
|
|
|
|
|
|
|
if (!data)
|
|
|
|
return NULL;
|
|
|
|
|
|
|
|
// skip whitespace
|
|
|
|
skipwhite:
|
|
|
|
while ( (c = *data) <= ' ')
|
|
|
|
{
|
|
|
|
if (c == 0)
|
|
|
|
return NULL; // end of file;
|
|
|
|
data++;
|
|
|
|
}
|
|
|
|
|
|
|
|
// skip // comments
|
|
|
|
if (c=='/' && data[1] == '/')
|
|
|
|
{
|
|
|
|
while (*data && *data != '\n')
|
|
|
|
data++;
|
|
|
|
goto skipwhite;
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
// handle quoted strings specially
|
|
|
|
if (c == '\"')
|
|
|
|
{
|
|
|
|
data++;
|
|
|
|
while (1)
|
|
|
|
{
|
|
|
|
c = *data++;
|
|
|
|
if (c=='\"' || !c)
|
|
|
|
{
|
|
|
|
com_token[len] = 0;
|
|
|
|
return data;
|
|
|
|
}
|
|
|
|
com_token[len] = c;
|
|
|
|
len++;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
// parse single characters
|
|
|
|
if (c=='{' || c=='}'|| c==')'|| c=='(' || c=='\'' || c==':')
|
|
|
|
{
|
|
|
|
com_token[len] = c;
|
|
|
|
len++;
|
|
|
|
com_token[len] = 0;
|
|
|
|
return data+1;
|
|
|
|
}
|
|
|
|
|
|
|
|
// parse a regular word
|
|
|
|
do
|
|
|
|
{
|
|
|
|
com_token[len] = c;
|
|
|
|
data++;
|
|
|
|
len++;
|
|
|
|
c = *data;
|
|
|
|
if (c=='{' || c=='}'|| c==')'|| c=='(' || c=='\'' || c==':')
|
|
|
|
break;
|
|
|
|
} while (c>32);
|
|
|
|
|
|
|
|
com_token[len] = 0;
|
|
|
|
return data;
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
/*
|
|
|
|
================
|
|
|
|
COM_CheckParm
|
|
|
|
|
|
|
|
Returns the position (1 to argc-1) in the program's argument list
|
|
|
|
where the given parameter apears, or 0 if not present
|
|
|
|
================
|
|
|
|
*/
|
|
|
|
int COM_CheckParm (char *parm)
|
|
|
|
{
|
|
|
|
int i;
|
|
|
|
|
|
|
|
for (i=1 ; i<com_argc ; i++)
|
|
|
|
{
|
|
|
|
if (!com_argv[i])
|
|
|
|
continue; // NEXTSTEP sometimes clears appkit vars.
|
|
|
|
if (!Q_strcmp (parm,com_argv[i]))
|
|
|
|
return i;
|
|
|
|
}
|
|
|
|
|
|
|
|
return 0;
|
|
|
|
}
|
|
|
|
|
|
|
|
void COM_Path_f (void);
|
|
|
|
|
|
|
|
|
|
|
|
/*
|
|
|
|
================
|
|
|
|
COM_InitArgv
|
|
|
|
================
|
|
|
|
*/
|
|
|
|
void COM_InitArgv (int argc, char **argv)
|
|
|
|
{
|
|
|
|
qboolean safe;
|
|
|
|
int i, j, n;
|
|
|
|
|
|
|
|
// reconstitute the command line for the cmdline externally visible cvar
|
|
|
|
n = 0;
|
|
|
|
|
|
|
|
for (j=0 ; (j<MAX_NUM_ARGVS) && (j< argc) ; j++)
|
|
|
|
{
|
|
|
|
i = 0;
|
|
|
|
|
|
|
|
while ((n < (CMDLINE_LENGTH - 1)) && argv[j][i])
|
|
|
|
{
|
|
|
|
com_cmdline[n++] = argv[j][i++];
|
|
|
|
}
|
|
|
|
|
|
|
|
if (n < (CMDLINE_LENGTH - 1))
|
|
|
|
com_cmdline[n++] = ' ';
|
|
|
|
else
|
|
|
|
break;
|
|
|
|
}
|
|
|
|
|
|
|
|
com_cmdline[n] = 0;
|
|
|
|
|
|
|
|
safe = false;
|
|
|
|
|
|
|
|
for (com_argc=0 ; (com_argc<MAX_NUM_ARGVS) && (com_argc < argc) ;
|
|
|
|
com_argc++)
|
|
|
|
{
|
|
|
|
largv[com_argc] = argv[com_argc];
|
|
|
|
if (!Q_strcmp ("-safe", argv[com_argc]))
|
|
|
|
safe = true;
|
|
|
|
}
|
|
|
|
|
|
|
|
if (safe)
|
|
|
|
{
|
|
|
|
// force all the safe-mode switches. Note that we reserved extra space in
|
|
|
|
// case we need to add these, so we don't need an overflow check
|
|
|
|
for (i=0 ; i<NUM_SAFE_ARGVS ; i++)
|
|
|
|
{
|
|
|
|
largv[com_argc] = safeargvs[i];
|
|
|
|
com_argc++;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
largv[com_argc] = argvdummy;
|
|
|
|
com_argv = largv;
|
|
|
|
|
|
|
|
if (COM_CheckParm ("-rogue"))
|
|
|
|
{
|
|
|
|
rogue = true;
|
|
|
|
standard_quake = false;
|
|
|
|
}
|
|
|
|
|
|
|
|
if (COM_CheckParm ("-hipnotic"))
|
|
|
|
{
|
|
|
|
hipnotic = true;
|
|
|
|
standard_quake = false;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
/*
|
|
|
|
================
|
|
|
|
COM_Init
|
|
|
|
================
|
|
|
|
*/
|
|
|
|
void COM_Init (char *basedir)
|
|
|
|
{
|
1999-12-29 13:58:47 +00:00
|
|
|
#ifdef WORDS_BIGENDIAN
|
|
|
|
BigShort = ShortNoSwap;
|
|
|
|
LittleShort = ShortSwap;
|
|
|
|
BigLong = LongNoSwap;
|
|
|
|
LittleLong = LongSwap;
|
|
|
|
BigFloat = FloatNoSwap;
|
|
|
|
LittleFloat = FloatSwap;
|
|
|
|
#else
|
|
|
|
BigShort = ShortSwap;
|
|
|
|
LittleShort = ShortNoSwap;
|
|
|
|
BigLong = LongSwap;
|
|
|
|
LittleLong = LongNoSwap;
|
|
|
|
BigFloat = FloatSwap;
|
|
|
|
LittleFloat = FloatNoSwap;
|
|
|
|
#endif
|
Created new subdir: uquake. Pick your favorite U word for the meaning --
Unchained, Ultimate, Ultra, Up Yours, Underworld, Underground, Unified,
Unity, etc. You know the drill.
This takes care of the "standalone" problem with the wrong name, and the
recent snafu with multiple developers working on the same files
simultaneously...expect me (and probably others) to start locking dirs when
updates are taking place.
And yes, this update is really as large as it looks. Software only at the
moment, but I will have the makefile updated to build the GL builds as
well.
1999-12-26 13:51:52 +00:00
|
|
|
|
|
|
|
Cvar_RegisterVariable (&cmdline);
|
|
|
|
Cmd_AddCommand ("path", COM_Path_f);
|
|
|
|
|
|
|
|
COM_InitFilesystem ();
|
2000-01-03 01:40:54 +00:00
|
|
|
register_check ();
|
Created new subdir: uquake. Pick your favorite U word for the meaning --
Unchained, Ultimate, Ultra, Up Yours, Underworld, Underground, Unified,
Unity, etc. You know the drill.
This takes care of the "standalone" problem with the wrong name, and the
recent snafu with multiple developers working on the same files
simultaneously...expect me (and probably others) to start locking dirs when
updates are taking place.
And yes, this update is really as large as it looks. Software only at the
moment, but I will have the makefile updated to build the GL builds as
well.
1999-12-26 13:51:52 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
/*
|
|
|
|
============
|
|
|
|
va
|
|
|
|
|
|
|
|
does a varargs printf into a temp buffer, so I don't need to have
|
|
|
|
varargs versions of all text functions.
|
|
|
|
FIXME: make this buffer size safe someday
|
|
|
|
============
|
|
|
|
*/
|
|
|
|
char *va(char *format, ...)
|
|
|
|
{
|
|
|
|
va_list argptr;
|
|
|
|
static char string[1024];
|
|
|
|
|
|
|
|
va_start (argptr, format);
|
2000-01-08 13:55:33 +00:00
|
|
|
vsnprintf (string, sizeof(string), format, argptr);
|
Created new subdir: uquake. Pick your favorite U word for the meaning --
Unchained, Ultimate, Ultra, Up Yours, Underworld, Underground, Unified,
Unity, etc. You know the drill.
This takes care of the "standalone" problem with the wrong name, and the
recent snafu with multiple developers working on the same files
simultaneously...expect me (and probably others) to start locking dirs when
updates are taking place.
And yes, this update is really as large as it looks. Software only at the
moment, but I will have the makefile updated to build the GL builds as
well.
1999-12-26 13:51:52 +00:00
|
|
|
va_end (argptr);
|
|
|
|
|
|
|
|
return string;
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
/// just for debugging
|
|
|
|
int memsearch (byte *start, int count, int search)
|
|
|
|
{
|
|
|
|
int i;
|
|
|
|
|
|
|
|
for (i=0 ; i<count ; i++)
|
|
|
|
if (start[i] == search)
|
|
|
|
return i;
|
|
|
|
return -1;
|
|
|
|
}
|