2004-08-21 01:25:48 +00:00
/*
Copyright ( C ) 1996 - 1997 Id Software , Inc .
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 .
*/
// comndef.h -- general definitions
typedef unsigned char qbyte ;
// KJB Undefined true and false defined in SciTech's DEBUG.H header
# undef true
# undef false
# ifdef __cplusplus
2005-03-28 00:11:59 +00:00
typedef enum { qfalse , qtrue } qboolean ; //false and true are forcivly defined.
# define true qtrue
# define false qfalse
2004-08-21 01:25:48 +00:00
# else
typedef enum { false , true } qboolean ;
# endif
2005-03-07 08:58:26 +00:00
# define MAX_INFO_STRING 196 //regular quakeworld. Sickening isn't it.
# define EXTENDED_INFO_STRING 1024
# define MAX_SERVERINFO_STRING 1024 //standard quake has 512 here.
2004-08-21 01:25:48 +00:00
# define MAX_LOCALINFO_STRING 32768
//============================================================================
2004-12-24 08:45:56 +00:00
typedef enum {
SZ_BAD ,
SZ_RAWBYTES ,
SZ_RAWBITS ,
SZ_HUFFMAN //q3 style packets are horrible.
} sbpacking_t ;
2004-08-21 01:25:48 +00:00
typedef struct sizebuf_s
{
qboolean allowoverflow ; // if false, do a Sys_Error
qboolean overflowed ; // set to true if the buffer size failed
qbyte * data ;
int maxsize ;
int cursize ;
2004-12-24 08:45:56 +00:00
int packing ;
int currentbit ;
2004-08-21 01:25:48 +00:00
} sizebuf_t ;
void SZ_Clear ( sizebuf_t * buf ) ;
void * SZ_GetSpace ( sizebuf_t * buf , int length ) ;
void SZ_Write ( sizebuf_t * buf , const void * data , int length ) ;
void SZ_Print ( sizebuf_t * buf , const char * data ) ; // strcats onto the sizebuf
//============================================================================
typedef struct link_s
{
struct link_s * prev , * next ;
} link_t ;
void ClearLink ( link_t * l ) ;
void RemoveLink ( link_t * l ) ;
void InsertLinkBefore ( link_t * l , link_t * before ) ;
void InsertLinkAfter ( link_t * l , link_t * after ) ;
// (type *)STRUCT_FROM_LINK(link_t *link, type, member)
// ent = STRUCT_FROM_LINK(link,entity_t,order)
// FIXME: remove this mess!
# define STRUCT_FROM_LINK(l,t,m) ((t *)((qbyte *)l - (int)&(((t *)0)->m)))
//============================================================================
# ifndef NULL
# define NULL ((void *)0)
# endif
# define Q_MAXCHAR ((char)0x7f)
# define Q_MAXSHORT ((short)0x7fff)
# define Q_MAXINT ((int)0x7fffffff)
# define Q_MAXLONG ((int)0x7fffffff)
# define Q_MAXFLOAT ((int)0x7fffffff)
# define Q_MINCHAR ((char)0x80)
# define Q_MINSHORT ((short)0x8000)
# define Q_MININT ((int)0x80000000)
# define Q_MINLONG ((int)0x80000000)
# define Q_MINFLOAT ((int)0x7fffffff)
//============================================================================
extern qboolean bigendien ;
extern short ( * BigShort ) ( short l ) ;
extern short ( * LittleShort ) ( short l ) ;
extern int ( * BigLong ) ( int l ) ;
extern int ( * LittleLong ) ( int l ) ;
extern float ( * BigFloat ) ( float l ) ;
extern float ( * LittleFloat ) ( float l ) ;
2005-07-29 22:26:43 +00:00
short ShortSwap ( short l ) ;
int LongSwap ( int l ) ;
2004-08-21 01:25:48 +00:00
//============================================================================
struct usercmd_s ;
extern struct usercmd_s nullcmd ;
2004-11-17 17:34:14 +00:00
typedef union { //note: reading from packets can be misaligned
char b [ 4 ] ;
short b2 ;
int b4 ;
float f ;
} coorddata ;
extern int sizeofcoord ;
2004-11-27 08:16:25 +00:00
extern int sizeofangle ;
2004-11-17 17:34:14 +00:00
float MSG_FromCoord ( coorddata c , int bytes ) ;
coorddata MSG_ToCoord ( float f , int bytes ) ;
2004-08-21 01:25:48 +00:00
void MSG_WriteChar ( sizebuf_t * sb , int c ) ;
void MSG_WriteByte ( sizebuf_t * sb , int c ) ;
void MSG_WriteShort ( sizebuf_t * sb , int c ) ;
void MSG_WriteLong ( sizebuf_t * sb , int c ) ;
void MSG_WriteFloat ( sizebuf_t * sb , float f ) ;
2005-03-28 00:11:59 +00:00
void MSG_WriteString ( sizebuf_t * sb , const char * s ) ;
2004-08-21 01:25:48 +00:00
void MSG_WriteCoord ( sizebuf_t * sb , float f ) ;
void MSG_WriteBigCoord ( sizebuf_t * sb , float f ) ;
void MSG_WriteAngle ( sizebuf_t * sb , float f ) ;
2005-06-14 04:52:10 +00:00
void MSG_WriteAngle8 ( sizebuf_t * sb , float f ) ;
2004-08-21 01:25:48 +00:00
void MSG_WriteAngle16 ( sizebuf_t * sb , float f ) ;
void MSG_WriteDeltaUsercmd ( sizebuf_t * sb , struct usercmd_s * from , struct usercmd_s * cmd ) ;
void MSG_WriteDir ( sizebuf_t * sb , float * dir ) ;
extern int msg_readcount ;
extern qboolean msg_badread ; // set if a read goes beyond end of message
void MSG_BeginReading ( void ) ;
int MSG_GetReadCount ( void ) ;
int MSG_ReadChar ( void ) ;
2005-02-12 18:56:04 +00:00
int MSG_ReadBits ( int bits ) ;
2004-08-21 01:25:48 +00:00
int MSG_ReadByte ( void ) ;
int MSG_ReadShort ( void ) ;
int MSG_ReadLong ( void ) ;
float MSG_ReadFloat ( void ) ;
char * MSG_ReadString ( void ) ;
char * MSG_ReadStringLine ( void ) ;
float MSG_ReadCoord ( void ) ;
void MSG_ReadPos ( float * pos ) ;
float MSG_ReadAngle ( void ) ;
float MSG_ReadAngle16 ( void ) ;
void MSG_ReadDeltaUsercmd ( struct usercmd_s * from , struct usercmd_s * cmd ) ;
void MSGQ2_ReadDeltaUsercmd ( struct usercmd_s * from , struct usercmd_s * move ) ;
void MSG_ReadData ( void * data , int len ) ;
//============================================================================
char * Q_strcpyline ( char * out , char * in , int maxlen ) ; //stops at '\n' (and '\r')
2005-01-24 23:47:32 +00:00
char * Q_strlwr ( char * str ) ;
2005-03-20 02:57:11 +00:00
int wildcmp ( char * wild , char * string ) ; //1 if match
2005-01-24 23:47:32 +00:00
2004-08-21 01:25:48 +00:00
# define Q_memset(d, f, c) memset((d), (f), (c))
# define Q_memcpy(d, s, c) memcpy((d), (s), (c))
# define Q_memcmp(m1, m2, c) memcmp((m1), (m2), (c))
# define Q_strcpy(d, s) strcpy((d), (s))
# define Q_strncpy(d, s, n) strncpy((d), (s), (n))
# define Q_strlen(s) ((int)strlen(s))
# define Q_strrchr(s, c) strrchr((s), (c))
# define Q_strcat(d, s) strcat((d), (s))
# define Q_strcmp(s1, s2) strcmp((s1), (s2))
# define Q_strncmp(s1, s2, n) strncmp((s1), (s2), (n))
2005-11-30 01:20:53 +00:00
void VARGS Q_snprintfz ( char * dest , size_t size , char * fmt , . . . ) ;
2005-04-16 16:21:27 +00:00
2004-08-21 01:25:48 +00:00
# define Q_strncpyS(d, s, n) do{const char *____in=(s);char *____out=(d);int ____i; for (____i=0;*(____in); ____i++){if (____i == (n))break;*____out++ = *____in++;}if (____i < (n))*____out='\0';}while(0) //only use this when it should be used. If undiciided, use N
# define Q_strncpyN(d, s, n) do{if (n < 0)Sys_Error("Bad length in strncpyz");Q_strncpyS((d), (s), (n));((char *)(d))[n] = '\0';}while(0) //this'll stop me doing buffer overflows. (guarenteed to overflow if you tried the wrong size.)
2005-04-16 16:21:27 +00:00
//#define Q_strncpyNCHECKSIZE(d, s, n) do{if (n < 1)Sys_Error("Bad length in strncpyz");Q_strncpyS((d), (s), (n));((char *)(d))[n-1] = '\0';((char *)(d))[n] = '255';}while(0) //This forces nothing else to be within the buffer. Should be used for testing and nothing else.
#if 0
2004-08-21 01:25:48 +00:00
# define Q_strncpyz(d, s, n) Q_strncpyN(d, s, (n)-1)
2005-04-16 16:21:27 +00:00
# else
void Q_strncpyz ( char * d , const char * s , int n ) ;
2005-04-26 16:04:12 +00:00
# define Q_strncatz(dest, src, sizeofdest) \
do { \
strncat ( dest , src , sizeofdest - strlen ( dest ) - 1 ) ; \
dest [ sizeofdest - 1 ] = 0 ; \
} while ( 0 )
# define Q_strncatz2(dest, src) Q_strncatz(dest, src, sizeof(dest))
2005-04-16 16:21:27 +00:00
# endif
2004-08-21 01:25:48 +00:00
//#define Q_strncpy Please remove all strncpys
/*#ifndef strncpy
# define strncpy Q_strncpy
# endif* /
# ifdef _WIN32
# define Q_strcasecmp(s1, s2) _stricmp((s1), (s2))
# define Q_strncasecmp(s1, s2, n) _strnicmp((s1), (s2), (n))
# else
# define Q_strcasecmp(s1, s2) strcasecmp((s1), (s2))
# define Q_strncasecmp(s1, s2, n) strncasecmp((s1), (s2), (n))
# endif
int Q_atoi ( char * str ) ;
float Q_atof ( char * str ) ;
//============================================================================
extern char com_token [ 1024 ] ;
typedef enum { TTP_UNKNOWN , TTP_STRING } com_tokentype_t ;
extern com_tokentype_t com_tokentype ;
extern qboolean com_eof ;
char * COM_Parse ( char * data ) ;
char * COM_ParseCString ( char * data ) ;
2004-12-08 04:14:52 +00:00
char * COM_StringParse ( char * data , qboolean expandmacros , qboolean qctokenize ) ;
2005-08-26 22:56:51 +00:00
const char * COM_ParseToken ( const char * data , const char * punctuation ) ;
2004-08-21 01:25:48 +00:00
char * COM_TrimString ( char * str ) ;
extern int com_argc ;
extern char * * com_argv ;
int COM_CheckParm ( char * parm ) ;
2005-10-07 16:27:20 +00:00
int COM_CheckNextParm ( char * parm , int last ) ;
2004-08-21 01:25:48 +00:00
void COM_AddParm ( char * parm ) ;
void COM_Init ( void ) ;
void COM_InitArgv ( int argc , char * * argv ) ;
2005-01-16 02:26:29 +00:00
void COM_ParsePlusSets ( void ) ;
2004-08-21 01:25:48 +00:00
char * COM_SkipPath ( char * pathname ) ;
void COM_StripExtension ( char * in , char * out ) ;
void COM_FileBase ( char * in , char * out ) ;
void COM_DefaultExtension ( char * path , char * extension ) ;
char * COM_FileExtension ( char * in ) ;
2005-03-18 06:13:36 +00:00
void COM_CleanUpPath ( char * str ) ;
2004-08-21 01:25:48 +00:00
char * VARGS va ( char * format , . . . ) ;
// does a varargs printf into a temp buffer
//============================================================================
2005-09-09 23:40:55 +00:00
extern qboolean com_file_copyprotected ;
2004-08-21 01:25:48 +00:00
extern int com_filesize ;
struct cache_user_s ;
extern char com_gamedir [ MAX_OSPATH ] ;
2005-12-21 03:07:33 +00:00
extern char com_quakedir [ MAX_OSPATH ] ;
extern char com_homedir [ MAX_OSPATH ] ;
extern char com_configdir [ MAX_OSPATH ] ; //dir to put cfg_save configs in
//extern char *com_basedir;
2004-08-21 01:25:48 +00:00
void COM_WriteFile ( char * filename , void * data , int len ) ;
2005-12-15 19:15:39 +00:00
FILE * COM_WriteFileOpen ( char * filename ) ;
2004-08-21 01:25:48 +00:00
typedef struct {
struct searchpath_s * search ;
int index ;
char rawname [ MAX_OSPATH ] ;
int offset ;
int len ;
} flocation_t ;
2005-12-21 03:07:33 +00:00
typedef enum { FSLFRT_IFFOUND , FSLFRT_LENGTH , FSLFRT_DEPTH_OSONLY , FSLFRT_DEPTH_ANYPATH } FSLF_ReturnType_e ;
2004-08-21 01:25:48 +00:00
//if loc is valid, loc->search is always filled in, the others are filled on success.
//returns -1 if couldn't find.
int FS_FLocateFile ( char * filename , FSLF_ReturnType_e returntype , flocation_t * loc ) ;
int COM_FOpenFile ( char * filename , FILE * * file ) ;
2005-08-07 18:08:13 +00:00
int COM_FOpenWriteFile ( char * filename , FILE * * file ) ;
//#ifdef _MSC_VER //this is enough to annoy me, without conflicting with other (more bizzare) platforms.
//#define fopen dont_use_fopen
//#endif
2004-08-21 01:25:48 +00:00
void COM_CloseFile ( FILE * h ) ;
# define COM_FDepthFile(filename,ignorepacks) FS_FLocateFile(filename,ignorepacks?FSLFRT_DEPTH_OSONLY:FSLFRT_DEPTH_ANYPATH, NULL)
# define COM_FCheckExists(filename) (FS_FLocateFile(filename,FSLFRT_LENGTH, NULL)>0)
2005-12-21 03:07:33 +00:00
typedef struct vfsfile_s {
int ( * ReadBytes ) ( struct vfsfile_s * file , void * buffer , int bytestoread ) ;
int ( * WriteBytes ) ( struct vfsfile_s * file , void * buffer , int bytestoread ) ;
qboolean ( * Seek ) ( struct vfsfile_s * file , unsigned long pos ) ; //returns false for error
unsigned long ( * Tell ) ( struct vfsfile_s * file ) ;
unsigned long ( * GetLen ) ( struct vfsfile_s * file ) ; //could give some lag
void ( * Close ) ( struct vfsfile_s * file ) ;
2005-12-22 02:29:11 +00:00
void ( * Flush ) ( struct vfsfile_s * file ) ;
2005-12-21 03:07:33 +00:00
} vfsfile_t ;
# define VFS_CLOSE(vf) (vf->Close(vf))
# define VFS_TELL(vf) (vf->Tell(vf))
# define VFS_GETLEN(vf) (vf->GetLen(vf))
# define VFS_SEEK(vf,pos) (vf->Seek(vf,pos))
# define VFS_READ(vf,buffer,buflen) (vf->ReadBytes(vf,buffer,buflen))
# define VFS_WRITE(vf,buffer,buflen) (vf->WriteBytes(vf,buffer,buflen))
2005-12-22 02:29:11 +00:00
# define VFS_FLUSH(vf) do{if(vf->Flush)vf->Flush(vf);}while(0)
# define VFS_GETS(vf,buffer,buflen) (Sys_Error("VFS_GETS not implemented"),false) //:(
2005-12-21 03:07:33 +00:00
void FS_Remove ( char * fname , int relativeto ) ;
vfsfile_t * FS_OpenVFS ( char * filename , char * mode , int relativeto ) ;
enum {
FS_GAME ,
FS_BASE ,
FS_GAMEONLY ,
FS_CONFIGONLY ,
FS_SKINS
} ;
2004-08-21 01:25:48 +00:00
int COM_filelength ( FILE * f ) ;
qbyte * COM_LoadStackFile ( char * path , void * buffer , int bufsize ) ;
qbyte * COM_LoadTempFile ( char * path ) ;
qbyte * COM_LoadTempFile2 ( char * path ) ; //allocates a little bit more without freeing old temp
qbyte * COM_LoadHunkFile ( char * path ) ;
qbyte * COM_LoadMallocFile ( char * path ) ;
void COM_LoadCacheFile ( char * path , struct cache_user_s * cu ) ;
void COM_CreatePath ( char * path ) ;
void COM_Gamedir ( char * dir ) ;
2005-08-26 22:56:51 +00:00
void FS_ForceToPure ( char * str , char * crcs , int seed ) ;
2004-11-23 01:14:00 +00:00
char * COM_GetPathInfo ( int i , int * crc ) ;
2004-08-21 01:25:48 +00:00
char * COM_NextPath ( char * prevpath ) ;
void COM_FlushFSCache ( void ) ; //a file was written using fopen
void COM_RefreshFSCache_f ( void ) ;
qboolean COM_LoadMapPackFile ( char * name , int offset ) ;
void COM_FlushTempoaryPacks ( void ) ;
void COM_EnumerateFiles ( char * match , int ( * func ) ( char * , int , void * ) , void * parm ) ;
extern struct cvar_s registered ;
2005-08-26 22:56:51 +00:00
extern qboolean standard_quake ; //fixme: remove
2004-08-21 01:25:48 +00:00
# define MAX_INFO_KEY 64
2005-03-28 00:11:59 +00:00
char * Info_ValueForKey ( char * s , const char * key ) ;
void Info_RemoveKey ( char * s , const char * key ) ;
2005-11-30 01:20:53 +00:00
char * Info_KeyForNumber ( char * s , int num ) ;
2004-08-21 01:25:48 +00:00
void Info_RemovePrefixedKeys ( char * start , char prefix ) ;
void Info_RemoveNonStarKeys ( char * start ) ;
2005-03-28 00:11:59 +00:00
void Info_SetValueForKey ( char * s , const char * key , const char * value , int maxsize ) ;
void Info_SetValueForStarKey ( char * s , const char * key , const char * value , int maxsize ) ;
2004-08-21 01:25:48 +00:00
void Info_Print ( char * s ) ;
2005-12-21 03:07:33 +00:00
void Info_WriteToFile ( vfsfile_t * f , char * info , char * commandname , int cvarflags ) ;
2004-08-21 01:25:48 +00:00
2005-11-03 23:46:31 +00:00
unsigned int Com_BlockChecksum ( void * buffer , int length ) ;
2004-08-21 01:25:48 +00:00
void Com_BlockFullChecksum ( void * buffer , int len , unsigned char * outbuf ) ;
qbyte COM_BlockSequenceCheckByte ( qbyte * base , int length , int sequence , unsigned mapchecksum ) ;
qbyte COM_BlockSequenceCRCByte ( qbyte * base , int length , int sequence ) ;
qbyte Q2COM_BlockSequenceCRCByte ( qbyte * base , int length , int sequence ) ;
int build_number ( void ) ;
void TL_InitLanguages ( void ) ;
void T_FreeStrings ( void ) ;
char * T_GetString ( int num ) ;