1cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich/*
2cabb5dd768714a7df34469a096b5e1aa815a2c22Jack PalevichCopyright (C) 1996-1997 Id Software, Inc.
3cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich
4cabb5dd768714a7df34469a096b5e1aa815a2c22Jack PalevichThis program is free software; you can redistribute it and/or
5cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevichmodify it under the terms of the GNU General Public License
6cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevichas published by the Free Software Foundation; either version 2
7cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevichof the License, or (at your option) any later version.
8cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich
9cabb5dd768714a7df34469a096b5e1aa815a2c22Jack PalevichThis program is distributed in the hope that it will be useful,
10cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevichbut WITHOUT ANY WARRANTY; without even the implied warranty of
11cabb5dd768714a7df34469a096b5e1aa815a2c22Jack PalevichMERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
12cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich
13cabb5dd768714a7df34469a096b5e1aa815a2c22Jack PalevichSee the GNU General Public License for more details.
14cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich
15cabb5dd768714a7df34469a096b5e1aa815a2c22Jack PalevichYou should have received a copy of the GNU General Public License
16cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevichalong with this program; if not, write to the Free Software
17cabb5dd768714a7df34469a096b5e1aa815a2c22Jack PalevichFoundation, Inc., 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.
18cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich
19cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich*/
209fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream// common.c -- misc functions used in client and server
219fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream
229fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream#include <ctype.h>
239fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream
249fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream#ifdef SERVERONLY
259fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream#include "qwsvdef.h"
269fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream#else
279fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream#include "quakedef.h"
289fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream#endif
299fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream
309fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream#define MAX_NUM_ARGVS	50
319fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream#define NUM_SAFE_ARGVS	6
329fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream
339fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstreamusercmd_t nullcmd; // guarenteed to be zero
349fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream
359fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstreamstatic char	*largv[MAX_NUM_ARGVS + NUM_SAFE_ARGVS + 1];
369fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstreamstatic char	*argvdummy = " ";
379fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream
389fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstreamstatic char	*safeargvs[NUM_SAFE_ARGVS] =
399fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	{"-stdvid", "-nolan", "-nosound", "-nocdaudio", "-nojoy", "-nomouse"};
409fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream
41cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevichcvar_t	registered = CVAR2("registered","0");
429fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream
439fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstreamqboolean	com_modified;	// set true if using non-id files
449fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream
459fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstreamint		static_registered = 1;	// only for startup check, then set
469fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream
479fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstreamqboolean		msg_suppress_1 = 0;
489fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream
499fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstreamvoid COM_InitFilesystem (void);
509fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstreamvoid COM_Path_f (void);
519fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream
529fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream
539fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream// if a packfile directory differs from this, it is assumed to be hacked
549fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream#define	PAK0_COUNT		339
559fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream#define	PAK0_CRC		52883
569fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream
579fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstreamqboolean		standard_quake = true, rogue, hipnotic;
589fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream
599fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstreamchar	gamedirfile[MAX_OSPATH];
609fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream
619fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream// this graphic needs to be in the pak file to use registered features
629fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstreamunsigned short pop[] =
639fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream{
649fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000
659fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream,0x0000,0x0000,0x6600,0x0000,0x0000,0x0000,0x6600,0x0000
669fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream,0x0000,0x0066,0x0000,0x0000,0x0000,0x0000,0x0067,0x0000
679fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream,0x0000,0x6665,0x0000,0x0000,0x0000,0x0000,0x0065,0x6600
689fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream,0x0063,0x6561,0x0000,0x0000,0x0000,0x0000,0x0061,0x6563
699fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream,0x0064,0x6561,0x0000,0x0000,0x0000,0x0000,0x0061,0x6564
709fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream,0x0064,0x6564,0x0000,0x6469,0x6969,0x6400,0x0064,0x6564
719fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream,0x0063,0x6568,0x6200,0x0064,0x6864,0x0000,0x6268,0x6563
729fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream,0x0000,0x6567,0x6963,0x0064,0x6764,0x0063,0x6967,0x6500
739fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream,0x0000,0x6266,0x6769,0x6a68,0x6768,0x6a69,0x6766,0x6200
749fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream,0x0000,0x0062,0x6566,0x6666,0x6666,0x6666,0x6562,0x0000
759fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream,0x0000,0x0000,0x0062,0x6364,0x6664,0x6362,0x0000,0x0000
769fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream,0x0000,0x0000,0x0000,0x0062,0x6662,0x0000,0x0000,0x0000
779fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream,0x0000,0x0000,0x0000,0x0061,0x6661,0x0000,0x0000,0x0000
789fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream,0x0000,0x0000,0x0000,0x0000,0x6500,0x0000,0x0000,0x0000
799fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream,0x0000,0x0000,0x0000,0x0000,0x6400,0x0000,0x0000,0x0000
809fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream};
819fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream
829fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream/*
839fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream
849fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream
859fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstreamAll of Quake's data access is through a hierchal file system, but the contents of the file system can be transparently merged from several sources.
869fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream
879fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstreamThe "base directory" is the path to the directory holding the quake.exe and all game directories.  The sys_* files pass this to host_init in quakeparms_t->basedir.  This can be overridden with the "-basedir" command line parm to allow code debugging in a different directory.  The base directory is
889fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstreamonly used during filesystem initialization.
899fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream
909fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstreamThe "game directory" is the first tree on the search path and directory that all generated files (savegames, screenshots, demos, config files) will be saved to.  This can be overridden with the "-game" command line parameter.  The game directory can never be changed while quake is executing.  This is a precacution against having a malicious server instruct clients to write files over areas they shouldn't.
919fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream
929fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstreamThe "cache directory" is only used during development to save network bandwidth, especially over ISDN / T1 lines.  If there is a cache directory
939fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstreamspecified, when a file is found by the normal search path, it will be mirrored
949fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstreaminto the cache directory, then opened there.
959fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream
969fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream*/
979fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream
989fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream//============================================================================
999fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream
1009fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream
1019fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream// ClearLink is used for new headnodes
1029fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstreamvoid ClearLink (link_t *l)
1039fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream{
1049fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	l->prev = l->next = l;
1059fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream}
1069fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream
1079fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstreamvoid RemoveLink (link_t *l)
1089fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream{
1099fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	l->next->prev = l->prev;
1109fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	l->prev->next = l->next;
1119fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream}
1129fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream
1139fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstreamvoid InsertLinkBefore (link_t *l, link_t *before)
1149fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream{
1159fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	l->next = before;
1169fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	l->prev = before->prev;
1179fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	l->prev->next = l;
1189fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	l->next->prev = l;
1199fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream}
1209fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstreamvoid InsertLinkAfter (link_t *l, link_t *after)
1219fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream{
1229fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	l->next = after->next;
1239fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	l->prev = after;
1249fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	l->prev->next = l;
1259fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	l->next->prev = l;
1269fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream}
1279fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream
1289fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream/*
1299fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream============================================================================
1309fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream
1319fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream					LIBRARY REPLACEMENT FUNCTIONS
1329fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream
1339fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream============================================================================
1349fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream*/
1359fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream
1369fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream#if 0
1379fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstreamvoid Q_memset (void *dest, int fill, int count)
1389fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream{
1399fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	int		i;
1409fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream
1419fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	if ( (((long)dest | count) & 3) == 0)
1429fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	{
1439fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream		count >>= 2;
1449fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream		fill = fill | (fill<<8) | (fill<<16) | (fill<<24);
1459fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream		for (i=0 ; i<count ; i++)
1469fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream			((int *)dest)[i] = fill;
1479fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	}
1489fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	else
1499fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream		for (i=0 ; i<count ; i++)
1509fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream			((byte *)dest)[i] = fill;
1519fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream}
1529fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream
1539fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstreamvoid Q_memcpy (void *dest, void *src, int count)
1549fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream{
1559fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	int		i;
1569fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream
1579fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	if (( ( (long)dest | (long)src | count) & 3) == 0 )
1589fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	{
1599fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream		count>>=2;
1609fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream		for (i=0 ; i<count ; i++)
1619fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream			((int *)dest)[i] = ((int *)src)[i];
1629fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	}
1639fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	else
1649fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream		for (i=0 ; i<count ; i++)
1659fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream			((byte *)dest)[i] = ((byte *)src)[i];
1669fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream}
1679fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream
1689fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstreamint Q_memcmp (void *m1, void *m2, int count)
1699fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream{
1709fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	while(count)
1719fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	{
1729fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream		count--;
1739fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream		if (((byte *)m1)[count] != ((byte *)m2)[count])
1749fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream			return -1;
1759fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	}
1769fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	return 0;
1779fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream}
1789fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream
1799fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstreamvoid Q_strcpy (char *dest, char *src)
1809fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream{
1819fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	while (*src)
1829fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	{
1839fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream		*dest++ = *src++;
1849fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	}
1859fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	*dest++ = 0;
1869fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream}
1879fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream
1889fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstreamvoid Q_strncpy (char *dest, char *src, int count)
1899fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream{
1909fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	while (*src && count--)
1919fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	{
1929fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream		*dest++ = *src++;
1939fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	}
1949fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	if (count)
1959fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream		*dest++ = 0;
1969fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream}
1979fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream
1989fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstreamint Q_strlen (char *str)
1999fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream{
2009fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	int		count;
2019fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream
2029fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	count = 0;
2039fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	while (str[count])
2049fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream		count++;
2059fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream
2069fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	return count;
2079fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream}
2089fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream
2099fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstreamchar *Q_strrchr(char *s, char c)
2109fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream{
2119fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream    int len = Q_strlen(s);
2129fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream    s += len;
2139fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream    while (len--)
2149fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream        if (*--s == c) return s;
2159fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream    return 0;
2169fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream}
2179fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream
2189fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstreamvoid Q_strcat (char *dest, char *src)
2199fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream{
2209fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	dest += Q_strlen(dest);
2219fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	Q_strcpy (dest, src);
2229fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream}
2239fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream
2249fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstreamint Q_strcmp (char *s1, char *s2)
2259fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream{
2269fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	while (1)
2279fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	{
2289fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream		if (*s1 != *s2)
2299fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream			return -1;		// strings not equal
2309fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream		if (!*s1)
2319fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream			return 0;		// strings are equal
2329fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream		s1++;
2339fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream		s2++;
2349fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	}
2359fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream
2369fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	return -1;
2379fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream}
2389fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream
2399fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstreamint Q_strncmp (char *s1, char *s2, int count)
2409fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream{
2419fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	while (1)
2429fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	{
2439fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream		if (!count--)
2449fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream			return 0;
2459fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream		if (*s1 != *s2)
2469fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream			return -1;		// strings not equal
2479fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream		if (!*s1)
2489fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream			return 0;		// strings are equal
2499fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream		s1++;
2509fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream		s2++;
2519fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	}
2529fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream
2539fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	return -1;
2549fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream}
2559fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream
2569fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstreamint Q_strncasecmp (char *s1, char *s2, int n)
2579fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream{
2589fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	int		c1, c2;
2599fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream
2609fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	while (1)
2619fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	{
2629fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream		c1 = *s1++;
2639fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream		c2 = *s2++;
2649fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream
2659fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream		if (!n--)
2669fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream			return 0;		// strings are equal until end point
2679fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream
2689fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream		if (c1 != c2)
2699fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream		{
2709fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream			if (c1 >= 'a' && c1 <= 'z')
2719fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream				c1 -= ('a' - 'A');
2729fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream			if (c2 >= 'a' && c2 <= 'z')
2739fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream				c2 -= ('a' - 'A');
2749fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream			if (c1 != c2)
2759fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream				return -1;		// strings not equal
2769fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream		}
2779fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream		if (!c1)
2789fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream			return 0;		// strings are equal
2799fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream//		s1++;
2809fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream//		s2++;
2819fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	}
2829fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream
2839fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	return -1;
2849fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream}
2859fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream
2869fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstreamint Q_strcasecmp (char *s1, char *s2)
2879fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream{
2889fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	return Q_strncasecmp (s1, s2, 99999);
2899fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream}
2909fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream
2919fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream#endif
2929fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream
2939fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstreamint Q_atoi (char *str)
2949fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream{
2959fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	int		val;
2969fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	int		sign;
2979fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	int		c;
2989fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream
2999fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	if (*str == '-')
3009fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	{
3019fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream		sign = -1;
3029fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream		str++;
3039fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	}
3049fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	else
3059fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream		sign = 1;
3069fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream
3079fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	val = 0;
3089fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream
3099fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream//
3109fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream// check for hex
3119fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream//
3129fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	if (str[0] == '0' && (str[1] == 'x' || str[1] == 'X') )
3139fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	{
3149fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream		str += 2;
3159fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream		while (1)
3169fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream		{
3179fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream			c = *str++;
3189fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream			if (c >= '0' && c <= '9')
3199fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream				val = (val<<4) + c - '0';
3209fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream			else if (c >= 'a' && c <= 'f')
3219fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream				val = (val<<4) + c - 'a' + 10;
3229fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream			else if (c >= 'A' && c <= 'F')
3239fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream				val = (val<<4) + c - 'A' + 10;
3249fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream			else
3259fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream				return val*sign;
3269fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream		}
3279fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	}
3289fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream
3299fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream//
3309fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream// check for character
3319fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream//
3329fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	if (str[0] == '\'')
3339fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	{
3349fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream		return sign * str[1];
3359fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	}
3369fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream
3379fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream//
3389fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream// assume decimal
3399fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream//
3409fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	while (1)
3419fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	{
3429fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream		c = *str++;
3439fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream		if (c <'0' || c > '9')
3449fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream			return val*sign;
3459fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream		val = val*10 + c - '0';
3469fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	}
3479fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream
3489fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	return 0;
3499fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream}
3509fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream
3519fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream
3529fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstreamfloat Q_atof (char *str)
3539fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream{
3549fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	double	val;
3559fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	int		sign;
3569fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	int		c;
3579fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	int		decimal, total;
3589fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream
3599fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	if (*str == '-')
3609fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	{
3619fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream		sign = -1;
3629fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream		str++;
3639fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	}
3649fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	else
3659fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream		sign = 1;
3669fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream
3679fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	val = 0;
3689fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream
3699fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream//
3709fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream// check for hex
3719fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream//
3729fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	if (str[0] == '0' && (str[1] == 'x' || str[1] == 'X') )
3739fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	{
3749fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream		str += 2;
3759fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream		while (1)
3769fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream		{
3779fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream			c = *str++;
3789fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream			if (c >= '0' && c <= '9')
3799fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream				val = (val*16) + c - '0';
3809fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream			else if (c >= 'a' && c <= 'f')
3819fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream				val = (val*16) + c - 'a' + 10;
3829fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream			else if (c >= 'A' && c <= 'F')
3839fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream				val = (val*16) + c - 'A' + 10;
3849fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream			else
3859fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream				return val*sign;
3869fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream		}
3879fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	}
3889fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream
3899fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream//
3909fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream// check for character
3919fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream//
3929fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	if (str[0] == '\'')
3939fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	{
3949fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream		return sign * str[1];
3959fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	}
3969fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream
3979fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream//
3989fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream// assume decimal
3999fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream//
4009fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	decimal = -1;
4019fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	total = 0;
4029fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	while (1)
4039fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	{
4049fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream		c = *str++;
4059fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream		if (c == '.')
4069fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream		{
4079fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream			decimal = total;
4089fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream			continue;
4099fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream		}
4109fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream		if (c <'0' || c > '9')
4119fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream			break;
4129fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream		val = val*10 + c - '0';
4139fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream		total++;
4149fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	}
4159fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream
4169fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	if (decimal == -1)
4179fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream		return val*sign;
4189fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	while (total > decimal)
4199fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	{
4209fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream		val /= 10;
4219fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream		total--;
4229fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	}
4239fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream
4249fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	return val*sign;
4259fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream}
4269fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream
4279fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream/*
4289fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream============================================================================
4299fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream
4309fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream					BYTE ORDER FUNCTIONS
4319fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream
4329fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream============================================================================
4339fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream*/
4349fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream
4359fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstreamqboolean	bigendien;
4369fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream
4379fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstreamshort	(*BigShort) (short l);
4389fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstreamshort	(*LittleShort) (short l);
4399fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstreamint	(*BigLong) (int l);
4409fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstreamint	(*LittleLong) (int l);
4419fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstreamfloat	(*BigFloat) (float l);
4429fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstreamfloat	(*LittleFloat) (float l);
4439fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream
4449fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstreamshort   ShortSwap (short l)
4459fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream{
4469fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	byte    b1,b2;
4479fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream
4489fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	b1 = l&255;
4499fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	b2 = (l>>8)&255;
4509fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream
4519fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	return (b1<<8) + b2;
4529fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream}
4539fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream
4549fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstreamshort	ShortNoSwap (short l)
4559fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream{
4569fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	return l;
4579fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream}
4589fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream
4599fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstreamint    LongSwap (int l)
4609fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream{
4619fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	byte    b1,b2,b3,b4;
4629fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream
4639fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	b1 = l&255;
4649fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	b2 = (l>>8)&255;
4659fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	b3 = (l>>16)&255;
4669fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	b4 = (l>>24)&255;
4679fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream
4689fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	return ((int)b1<<24) + ((int)b2<<16) + ((int)b3<<8) + b4;
4699fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream}
4709fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream
4719fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstreamint	LongNoSwap (int l)
4729fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream{
4739fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	return l;
4749fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream}
4759fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream
4769fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstreamfloat FloatSwap (float f)
4779fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream{
4789fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	union
4799fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	{
4809fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream		float	f;
4819fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream		byte	b[4];
4829fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	} dat1, dat2;
4839fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream
4849fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream
4859fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	dat1.f = f;
4869fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	dat2.b[0] = dat1.b[3];
4879fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	dat2.b[1] = dat1.b[2];
4889fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	dat2.b[2] = dat1.b[1];
4899fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	dat2.b[3] = dat1.b[0];
4909fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	return dat2.f;
4919fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream}
4929fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream
4939fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstreamfloat FloatNoSwap (float f)
4949fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream{
4959fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	return f;
4969fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream}
4979fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream
4989fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream/*
4999fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream==============================================================================
5009fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream
5019fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream			MESSAGE IO FUNCTIONS
5029fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream
5039fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstreamHandles byte ordering and avoids alignment errors
5049fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream==============================================================================
5059fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream*/
5069fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream
5079fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream//
5089fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream// writing functions
5099fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream//
5109fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream
5119fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstreamvoid MSG_WriteChar (sizebuf_t *sb, int c)
5129fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream{
5139fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	byte	*buf;
5149fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream
5159fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream#ifdef PARANOID
5169fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	if (c < -128 || c > 127)
5179fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream		Sys_Error ("MSG_WriteChar: range error");
5189fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream#endif
5199fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream
5209fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	buf = SZ_GetSpace (sb, 1);
5219fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	buf[0] = c;
5229fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream}
5239fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream
5249fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstreamvoid MSG_WriteByte (sizebuf_t *sb, int c)
5259fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream{
5269fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	byte	*buf;
5279fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream
5289fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream#ifdef PARANOID
5299fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	if (c < 0 || c > 255)
5309fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream		Sys_Error ("MSG_WriteByte: range error");
5319fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream#endif
5329fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream
5339fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	buf = SZ_GetSpace (sb, 1);
5349fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	buf[0] = c;
5359fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream}
5369fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream
5379fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstreamvoid MSG_WriteShort (sizebuf_t *sb, int c)
5389fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream{
5399fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	byte	*buf;
5409fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream
5419fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream#ifdef PARANOID
5429fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	if (c < ((short)0x8000) || c > (short)0x7fff)
5439fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream		Sys_Error ("MSG_WriteShort: range error");
5449fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream#endif
5459fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream
5469fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	buf = SZ_GetSpace (sb, 2);
5479fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	buf[0] = c&0xff;
5489fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	buf[1] = c>>8;
5499fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream}
5509fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream
5519fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstreamvoid MSG_WriteLong (sizebuf_t *sb, int c)
5529fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream{
5539fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	byte	*buf;
5549fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream
5559fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	buf = SZ_GetSpace (sb, 4);
5569fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	buf[0] = c&0xff;
5579fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	buf[1] = (c>>8)&0xff;
5589fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	buf[2] = (c>>16)&0xff;
5599fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	buf[3] = c>>24;
5609fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream}
5619fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream
5629fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstreamvoid MSG_WriteFloat (sizebuf_t *sb, float f)
5639fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream{
5649fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	union
5659fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	{
5669fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream		float	f;
5679fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream		int	l;
5689fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	} dat;
5699fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream
5709fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream
5719fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	dat.f = f;
5729fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	dat.l = LittleLong (dat.l);
5739fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream
5749fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	SZ_Write (sb, &dat.l, 4);
5759fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream}
5769fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream
5779fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstreamvoid MSG_WriteString (sizebuf_t *sb, char *s)
5789fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream{
5799fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	if (!s)
5809fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream		SZ_Write (sb, "", 1);
5819fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	else
5829fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream		SZ_Write (sb, s, Q_strlen(s)+1);
5839fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream}
5849fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream
5859fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstreamvoid MSG_WriteCoord (sizebuf_t *sb, float f)
5869fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream{
5879fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	MSG_WriteShort (sb, (int)(f*8));
5889fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream}
5899fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream
5909fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstreamvoid MSG_WriteAngle (sizebuf_t *sb, float f)
5919fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream{
5929fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	MSG_WriteByte (sb, (int)(f*256/360) & 255);
5939fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream}
5949fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream
5959fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstreamvoid MSG_WriteAngle16 (sizebuf_t *sb, float f)
5969fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream{
5979fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	MSG_WriteShort (sb, (int)(f*65536/360) & 65535);
5989fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream}
5999fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream
6009fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstreamvoid MSG_WriteDeltaUsercmd (sizebuf_t *buf, usercmd_t *from, usercmd_t *cmd)
6019fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream{
6029fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	int		bits;
6039fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream
6049fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream//
6059fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream// send the movement message
6069fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream//
6079fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	bits = 0;
6089fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	if (cmd->angles[0] != from->angles[0])
6099fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream		bits |= CM_ANGLE1;
6109fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	if (cmd->angles[1] != from->angles[1])
6119fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream		bits |= CM_ANGLE2;
6129fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	if (cmd->angles[2] != from->angles[2])
6139fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream		bits |= CM_ANGLE3;
6149fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	if (cmd->forwardmove != from->forwardmove)
6159fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream		bits |= CM_FORWARD;
6169fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	if (cmd->sidemove != from->sidemove)
6179fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream		bits |= CM_SIDE;
6189fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	if (cmd->upmove != from->upmove)
6199fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream		bits |= CM_UP;
6209fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	if (cmd->buttons != from->buttons)
6219fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream		bits |= CM_BUTTONS;
6229fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	if (cmd->impulse != from->impulse)
6239fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream		bits |= CM_IMPULSE;
6249fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream
6259fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream    MSG_WriteByte (buf, bits);
6269fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream
6279fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	if (bits & CM_ANGLE1)
6289fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream		MSG_WriteAngle16 (buf, cmd->angles[0]);
6299fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	if (bits & CM_ANGLE2)
6309fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream		MSG_WriteAngle16 (buf, cmd->angles[1]);
6319fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	if (bits & CM_ANGLE3)
6329fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream		MSG_WriteAngle16 (buf, cmd->angles[2]);
6339fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream
6349fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	if (bits & CM_FORWARD)
6359fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream		MSG_WriteShort (buf, cmd->forwardmove);
6369fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	if (bits & CM_SIDE)
6379fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	  	MSG_WriteShort (buf, cmd->sidemove);
6389fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	if (bits & CM_UP)
6399fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream		MSG_WriteShort (buf, cmd->upmove);
6409fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream
6419fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream 	if (bits & CM_BUTTONS)
6429fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	  	MSG_WriteByte (buf, cmd->buttons);
6439fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream 	if (bits & CM_IMPULSE)
6449fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	    MSG_WriteByte (buf, cmd->impulse);
6459fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	MSG_WriteByte (buf, cmd->msec);
6469fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream}
6479fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream
6489fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream
6499fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream//
6509fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream// reading functions
6519fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream//
6529fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstreamint			msg_readcount;
6539fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstreamqboolean	msg_badread;
6549fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream
6559fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstreamvoid MSG_BeginReading (void)
6569fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream{
6579fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	msg_readcount = 0;
6589fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	msg_badread = false;
6599fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream}
6609fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream
6619fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstreamint MSG_GetReadCount(void)
6629fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream{
6639fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	return msg_readcount;
6649fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream}
6659fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream
6669fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream// returns -1 and sets msg_badread if no more characters are available
6679fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstreamint MSG_ReadChar (void)
6689fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream{
6699fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	int	c;
6709fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream
6719fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	if (msg_readcount+1 > net_message.cursize)
6729fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	{
6739fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream		msg_badread = true;
6749fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream		return -1;
6759fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	}
6769fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream
6779fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	c = (signed char)net_message.data[msg_readcount];
6789fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	msg_readcount++;
6799fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream
6809fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	return c;
6819fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream}
6829fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream
6839fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstreamint MSG_ReadByte (void)
6849fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream{
6859fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	int	c;
6869fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream
6879fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	if (msg_readcount+1 > net_message.cursize)
6889fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	{
6899fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream		msg_badread = true;
6909fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream		return -1;
6919fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	}
6929fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream
6939fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	c = (unsigned char)net_message.data[msg_readcount];
6949fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	msg_readcount++;
6959fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream
6969fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	return c;
6979fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream}
6989fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream
6999fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstreamint MSG_ReadShort (void)
7009fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream{
7019fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	int	c;
7029fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream
7039fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	if (msg_readcount+2 > net_message.cursize)
7049fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	{
7059fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream		msg_badread = true;
7069fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream		return -1;
7079fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	}
7089fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream
7099fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	c = (short)(net_message.data[msg_readcount]
7109fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	+ (net_message.data[msg_readcount+1]<<8));
7119fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream
7129fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	msg_readcount += 2;
7139fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream
7149fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	return c;
7159fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream}
7169fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream
7179fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstreamint MSG_ReadLong (void)
7189fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream{
7199fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	int	c;
7209fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream
7219fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	if (msg_readcount+4 > net_message.cursize)
7229fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	{
7239fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream		msg_badread = true;
7249fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream		return -1;
7259fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	}
7269fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream
7279fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	c = net_message.data[msg_readcount]
7289fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	+ (net_message.data[msg_readcount+1]<<8)
7299fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	+ (net_message.data[msg_readcount+2]<<16)
7309fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	+ (net_message.data[msg_readcount+3]<<24);
7319fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream
7329fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	msg_readcount += 4;
7339fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream
7349fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	return c;
7359fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream}
7369fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream
7379fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstreamfloat MSG_ReadFloat (void)
7389fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream{
7399fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	union
7409fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	{
7419fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream		byte	b[4];
7429fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream		float	f;
7439fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream		int	l;
7449fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	} dat;
7459fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream
7469fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	dat.b[0] =	net_message.data[msg_readcount];
7479fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	dat.b[1] =	net_message.data[msg_readcount+1];
7489fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	dat.b[2] =	net_message.data[msg_readcount+2];
7499fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	dat.b[3] =	net_message.data[msg_readcount+3];
7509fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	msg_readcount += 4;
7519fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream
7529fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	dat.l = LittleLong (dat.l);
7539fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream
7549fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	return dat.f;
7559fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream}
7569fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream
7579fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstreamchar *MSG_ReadString (void)
7589fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream{
7599fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	static char	string[2048];
7609fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	int		l,c;
7619fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream
7629fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	l = 0;
7639fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	do
7649fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	{
7659fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream		c = MSG_ReadChar ();
7669fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream		if (c == -1 || c == 0)
7679fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream			break;
7689fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream		string[l] = c;
7699fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream		l++;
770cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich	} while (l < (int) sizeof(string)-1);
7719fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream
7729fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	string[l] = 0;
7739fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream
7749fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	return string;
7759fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream}
7769fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream
7779fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstreamchar *MSG_ReadStringLine (void)
7789fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream{
7799fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	static char	string[2048];
7809fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	int		l,c;
7819fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream
7829fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	l = 0;
7839fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	do
7849fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	{
7859fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream		c = MSG_ReadChar ();
7869fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream		if (c == -1 || c == 0 || c == '\n')
7879fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream			break;
7889fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream		string[l] = c;
7899fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream		l++;
790cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich	} while (l < (int) sizeof(string)-1);
7919fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream
7929fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	string[l] = 0;
7939fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream
7949fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	return string;
7959fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream}
7969fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream
7979fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstreamfloat MSG_ReadCoord (void)
7989fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream{
7999fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	return MSG_ReadShort() * (1.0/8);
8009fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream}
8019fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream
8029fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstreamfloat MSG_ReadAngle (void)
8039fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream{
8049fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	return MSG_ReadChar() * (360.0/256);
8059fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream}
8069fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream
8079fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstreamfloat MSG_ReadAngle16 (void)
8089fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream{
8099fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	return MSG_ReadShort() * (360.0/65536);
8109fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream}
8119fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream
8129fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstreamvoid MSG_ReadDeltaUsercmd (usercmd_t *from, usercmd_t *move)
8139fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream{
8149fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	int bits;
8159fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream
8169fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	memcpy (move, from, sizeof(*move));
8179fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream
8189fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	bits = MSG_ReadByte ();
8199fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream
8209fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream// read current angles
8219fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	if (bits & CM_ANGLE1)
8229fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream		move->angles[0] = MSG_ReadAngle16 ();
8239fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	if (bits & CM_ANGLE2)
8249fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream		move->angles[1] = MSG_ReadAngle16 ();
8259fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	if (bits & CM_ANGLE3)
8269fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream		move->angles[2] = MSG_ReadAngle16 ();
8279fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream
8289fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream// read movement
8299fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	if (bits & CM_FORWARD)
8309fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream		move->forwardmove = MSG_ReadShort ();
8319fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	if (bits & CM_SIDE)
8329fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream		move->sidemove = MSG_ReadShort ();
8339fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	if (bits & CM_UP)
8349fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream		move->upmove = MSG_ReadShort ();
8359fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream
8369fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream// read buttons
8379fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	if (bits & CM_BUTTONS)
8389fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream		move->buttons = MSG_ReadByte ();
8399fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream
8409fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	if (bits & CM_IMPULSE)
8419fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream		move->impulse = MSG_ReadByte ();
8429fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream
8439fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream// read time to run command
8449fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	move->msec = MSG_ReadByte ();
8459fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream}
8469fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream
8479fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream
8489fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream//===========================================================================
8499fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream
8509fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstreamvoid SZ_Clear (sizebuf_t *buf)
8519fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream{
8529fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	buf->cursize = 0;
8539fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	buf->overflowed = false;
8549fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream}
8559fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream
8569fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstreamvoid *SZ_GetSpace (sizebuf_t *buf, int length)
8579fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream{
8589fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	void	*data;
8599fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream
8609fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	if (buf->cursize + length > buf->maxsize)
8619fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	{
8629fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream		if (!buf->allowoverflow)
8639fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream			Sys_Error ("SZ_GetSpace: overflow without allowoverflow set (%d)", buf->maxsize);
8649fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream
8659fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream		if (length > buf->maxsize)
8669fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream			Sys_Error ("SZ_GetSpace: %i is > full buffer size", length);
8679fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream
8689fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream		Sys_Printf ("SZ_GetSpace: overflow\n");	// because Con_Printf may be redirected
8699fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream		SZ_Clear (buf);
8709fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream		buf->overflowed = true;
8719fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	}
8729fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream
8739fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	data = buf->data + buf->cursize;
8749fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	buf->cursize += length;
8759fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream
8769fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	return data;
8779fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream}
8789fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream
8799fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstreamvoid SZ_Write (sizebuf_t *buf, void *data, int length)
8809fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream{
8819fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	Q_memcpy (SZ_GetSpace(buf,length),data,length);
8829fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream}
8839fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream
8849fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstreamvoid SZ_Print (sizebuf_t *buf, char *data)
8859fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream{
8869fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	int		len;
8879fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream
8889fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	len = Q_strlen(data)+1;
8899fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream
8909fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	if (!buf->cursize || buf->data[buf->cursize-1])
8919fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream		Q_memcpy ((byte *)SZ_GetSpace(buf, len),data,len); // no trailing 0
8929fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	else
8939fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream		Q_memcpy ((byte *)SZ_GetSpace(buf, len-1)-1,data,len); // write over trailing 0
8949fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream}
8959fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream
8969fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream
8979fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream//============================================================================
8989fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream
8999fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream
9009fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream/*
9019fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream============
9029fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstreamCOM_SkipPath
9039fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream============
9049fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream*/
9059fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstreamchar *COM_SkipPath (char *pathname)
9069fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream{
9079fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	char	*last;
9089fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream
9099fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	last = pathname;
9109fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	while (*pathname)
9119fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	{
9129fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream		if (*pathname=='/')
9139fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream			last = pathname+1;
9149fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream		pathname++;
9159fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	}
9169fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	return last;
9179fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream}
9189fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream
9199fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream/*
9209fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream============
9219fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstreamCOM_StripExtension
9229fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream============
9239fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream*/
9249fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstreamvoid COM_StripExtension (char *in, char *out)
9259fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream{
9269fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	while (*in && *in != '.')
9279fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream		*out++ = *in++;
9289fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	*out = 0;
9299fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream}
9309fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream
9319fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream/*
9329fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream============
9339fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstreamCOM_FileExtension
9349fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream============
9359fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream*/
9369fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstreamchar *COM_FileExtension (char *in)
9379fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream{
9389fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	static char exten[8];
9399fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	int		i;
9409fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream
9419fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	while (*in && *in != '.')
9429fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream		in++;
9439fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	if (!*in)
9449fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream		return "";
9459fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	in++;
9469fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	for (i=0 ; i<7 && *in ; i++,in++)
9479fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream		exten[i] = *in;
9489fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	exten[i] = 0;
9499fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	return exten;
9509fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream}
9519fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream
9529fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream/*
9539fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream============
9549fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstreamCOM_FileBase
9559fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream============
9569fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream*/
9579fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstreamvoid COM_FileBase (char *in, char *out)
9589fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream{
9599fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	char *s, *s2;
9609fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream
9619fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	s = in + strlen(in) - 1;
9629fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream
9639fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	while (s != in && *s != '.')
9649fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream		s--;
9659fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream
9669fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	for (s2 = s ; *s2 && *s2 != '/' ; s2--)
9679fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	;
9689fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream
9699fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	if (s-s2 < 2)
9709fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream		strcpy (out,"?model?");
9719fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	else
9729fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	{
9739fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream		s--;
9749fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream		strncpy (out,s2+1, s-s2);
9759fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream		out[s-s2] = 0;
9769fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	}
9779fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream}
9789fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream
9799fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream
9809fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream/*
9819fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream==================
9829fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstreamCOM_DefaultExtension
9839fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream==================
9849fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream*/
9859fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstreamvoid COM_DefaultExtension (char *path, char *extension)
9869fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream{
9879fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	char    *src;
9889fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream//
9899fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream// if path doesn't have a .EXT, append extension
9909fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream// (extension should include the .)
9919fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream//
9929fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	src = path + strlen(path) - 1;
9939fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream
9949fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	while (*src != '/' && src != path)
9959fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	{
9969fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream		if (*src == '.')
9979fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream			return;                 // it has an extension
9989fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream		src--;
9999fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	}
10009fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream
10019fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	strcat (path, extension);
10029fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream}
10039fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream
10049fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream//============================================================================
10059fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream
10069fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstreamchar		com_token[1024];
10079fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstreamint		com_argc;
10089fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstreamchar	**com_argv;
10099fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream
10109fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream
10119fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream/*
10129fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream==============
10139fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstreamCOM_Parse
10149fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream
10159fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstreamParse a token out of a string
10169fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream==============
10179fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream*/
10189fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstreamchar *COM_Parse (char *data)
10199fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream{
10209fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	int		c;
10219fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	int		len;
10229fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream
10239fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	len = 0;
10249fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	com_token[0] = 0;
10259fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream
10269fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	if (!data)
10279fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream		return NULL;
10289fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream
10299fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream// skip whitespace
10309fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstreamskipwhite:
10319fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	while ( (c = *data) <= ' ')
10329fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	{
10339fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream		if (c == 0)
10349fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream			return NULL;			// end of file;
10359fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream		data++;
10369fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	}
10379fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream
10389fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream// skip // comments
10399fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	if (c=='/' && data[1] == '/')
10409fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	{
10419fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream		while (*data && *data != '\n')
10429fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream			data++;
10439fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream		goto skipwhite;
10449fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	}
10459fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream
10469fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream
10479fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream// handle quoted strings specially
10489fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	if (c == '\"')
10499fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	{
10509fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream		data++;
10519fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream		while (1)
10529fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream		{
10539fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream			c = *data++;
10549fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream			if (c=='\"' || !c)
10559fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream			{
10569fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream				com_token[len] = 0;
10579fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream				return data;
10589fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream			}
10599fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream			com_token[len] = c;
10609fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream			len++;
10619fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream		}
10629fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	}
10639fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream
10649fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream// parse a regular word
10659fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	do
10669fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	{
10679fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream		com_token[len] = c;
10689fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream		data++;
10699fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream		len++;
10709fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream		c = *data;
10719fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	} while (c>32);
10729fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream
10739fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	com_token[len] = 0;
10749fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	return data;
10759fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream}
10769fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream
10779fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream
10789fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream/*
10799fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream================
10809fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstreamCOM_CheckParm
10819fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream
10829fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstreamReturns the position (1 to argc-1) in the program's argument list
10839fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstreamwhere the given parameter apears, or 0 if not present
10849fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream================
10859fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream*/
10869fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstreamint COM_CheckParm (char *parm)
10879fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream{
10889fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	int		i;
10899fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream
10909fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	for (i=1 ; i<com_argc ; i++)
10919fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	{
10929fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream		if (!com_argv[i])
10939fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream			continue;		// NEXTSTEP sometimes clears appkit vars.
10949fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream		if (!Q_strcmp (parm,com_argv[i]))
10959fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream			return i;
10969fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	}
10979fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream
10989fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	return 0;
10999fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream}
11009fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream
11019fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream/*
11029fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream================
11039fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstreamCOM_CheckRegistered
11049fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream
11059fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstreamLooks for the pop.txt file and verifies it.
11069fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstreamSets the "registered" cvar.
11079fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstreamImmediately exits out if an alternate game was attempted to be started without
11089fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstreambeing registered.
11099fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream================
11109fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream*/
11119fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstreamvoid COM_CheckRegistered (void)
11129fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream{
11139fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	FILE		*h;
11149fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	unsigned short	check[128];
11159fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	int			i;
11169fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream
11179fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	COM_FOpenFile("gfx/pop.lmp", &h);
11189fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	static_registered = 0;
11199fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream
11209fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	if (!h)
11219fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	{
11229fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream		Con_Printf ("Playing shareware version.\n");
1123cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich#if 0
11249fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream#ifndef SERVERONLY
11259fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream// FIXME DEBUG -- only temporary
11269fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream		if (com_modified)
11279fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream			Sys_Error ("You must have the registered version to play QuakeWorld");
11289fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream#endif
1129cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich#endif
11309fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream		return;
11319fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	}
11329fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream
11339fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	fread (check, 1, sizeof(check), h);
11349fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	fclose (h);
11359fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream
11369fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	for (i=0 ; i<128 ; i++)
11379fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream		if (pop[i] != (unsigned short)BigShort (check[i]))
11389fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream			Sys_Error ("Corrupted data file.");
11399fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream
11409fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	Cvar_Set ("registered", "1");
11419fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	static_registered = 1;
11429fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	Con_Printf ("Playing registered version.\n");
11439fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream}
11449fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream
11459fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream
11469fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream
11479fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream/*
11489fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream================
11499fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstreamCOM_InitArgv
11509fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream================
11519fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream*/
11529fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstreamvoid COM_InitArgv (int argc, char **argv)
11539fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream{
11549fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	qboolean	safe;
11559fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	int			i;
11569fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream
11579fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	safe = false;
11589fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream
11599fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	for (com_argc=0 ; (com_argc<MAX_NUM_ARGVS) && (com_argc < argc) ;
11609fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream		 com_argc++)
11619fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	{
11629fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream		largv[com_argc] = argv[com_argc];
11639fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream		if (!Q_strcmp ("-safe", argv[com_argc]))
11649fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream			safe = true;
11659fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	}
11669fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream
11679fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	if (safe)
11689fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	{
11699fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	// force all the safe-mode switches. Note that we reserved extra space in
11709fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	// case we need to add these, so we don't need an overflow check
11719fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream		for (i=0 ; i<NUM_SAFE_ARGVS ; i++)
11729fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream		{
11739fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream			largv[com_argc] = safeargvs[i];
11749fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream			com_argc++;
11759fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream		}
11769fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	}
11779fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream
11789fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	largv[com_argc] = argvdummy;
11799fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	com_argv = largv;
11809fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream}
11819fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream
11829fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream/*
11839fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream================
11849fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstreamCOM_AddParm
11859fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream
11869fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstreamAdds the given string at the end of the current argument list
11879fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream================
11889fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream*/
11899fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstreamvoid COM_AddParm (char *parm)
11909fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream{
11919fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	largv[com_argc++] = parm;
11929fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream}
11939fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream
11949fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream
11959fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream/*
11969fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream================
11979fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstreamCOM_Init
11989fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream================
11999fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream*/
12009fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstreamvoid COM_Init (void)
12019fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream{
12029fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	byte	swaptest[2] = {1,0};
12039fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream
12049fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream// set the byte swapping variables in a portable manner
12059fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	if ( *(short *)swaptest == 1)
12069fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	{
12079fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream		bigendien = false;
12089fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream		BigShort = ShortSwap;
12099fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream		LittleShort = ShortNoSwap;
12109fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream		BigLong = LongSwap;
12119fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream		LittleLong = LongNoSwap;
12129fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream		BigFloat = FloatSwap;
12139fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream		LittleFloat = FloatNoSwap;
12149fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	}
12159fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	else
12169fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	{
12179fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream		bigendien = true;
12189fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream		BigShort = ShortNoSwap;
12199fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream		LittleShort = ShortSwap;
12209fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream		BigLong = LongNoSwap;
12219fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream		LittleLong = LongSwap;
12229fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream		BigFloat = FloatNoSwap;
12239fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream		LittleFloat = FloatSwap;
12249fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	}
12259fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream
12269fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	Cvar_RegisterVariable (&registered);
12279fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	Cmd_AddCommand ("path", COM_Path_f);
12289fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream
12299fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	COM_InitFilesystem ();
12309fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	COM_CheckRegistered ();
12319fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream}
12329fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream
12339fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream
12349fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream/*
12359fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream============
12369fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstreamva
12379fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream
12389fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstreamdoes a varargs printf into a temp buffer, so I don't need to have
12399fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstreamvarargs versions of all text functions.
12409fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstreamFIXME: make this buffer size safe someday
12419fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream============
12429fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream*/
12439fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstreamchar	*va(char *format, ...)
12449fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream{
12459fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	va_list		argptr;
12469fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	static char		string[1024];
12479fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream
12489fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	va_start (argptr, format);
12499fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	vsprintf (string, format,argptr);
12509fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	va_end (argptr);
12519fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream
12529fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	return string;
12539fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream}
12549fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream
12559fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream
12569fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream/// just for debugging
12579fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstreamint	memsearch (byte *start, int count, int search)
12589fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream{
12599fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	int		i;
12609fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream
12619fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	for (i=0 ; i<count ; i++)
12629fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream		if (start[i] == search)
12639fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream			return i;
12649fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	return -1;
12659fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream}
12669fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream
12679fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream/*
12689fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream=============================================================================
12699fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream
12709fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstreamQUAKE FILESYSTEM
12719fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream
12729fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream=============================================================================
12739fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream*/
12749fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream
12759fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstreamint	com_filesize;
12769fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream
12779fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream
12789fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream//
12799fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream// in memory
12809fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream//
12819fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream
12829fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstreamtypedef struct
12839fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream{
12849fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	char	name[MAX_QPATH];
12859fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	int		filepos, filelen;
12869fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream} packfile_t;
12879fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream
12889fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstreamtypedef struct pack_s
12899fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream{
12909fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	char	filename[MAX_OSPATH];
12919fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	FILE	*handle;
12929fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	int		numfiles;
12939fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	packfile_t	*files;
12949fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream} pack_t;
12959fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream
12969fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream//
12979fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream// on disk
12989fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream//
12999fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstreamtypedef struct
13009fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream{
13019fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	char	name[56];
13029fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	int		filepos, filelen;
13039fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream} dpackfile_t;
13049fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream
13059fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstreamtypedef struct
13069fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream{
13079fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	char	id[4];
13089fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	int		dirofs;
13099fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	int		dirlen;
13109fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream} dpackheader_t;
13119fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream
13129fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream#define	MAX_FILES_IN_PACK	2048
13139fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream
13149fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstreamchar	com_gamedir[MAX_OSPATH];
13159fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstreamchar	com_basedir[MAX_OSPATH];
13169fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream
13179fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstreamtypedef struct searchpath_s
13189fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream{
13199fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	char	filename[MAX_OSPATH];
13209fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	pack_t	*pack;		// only one of filename / pack will be used
13219fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	struct searchpath_s *next;
13229fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream} searchpath_t;
13239fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream
13249fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstreamsearchpath_t	*com_searchpaths;
13259fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstreamsearchpath_t	*com_base_searchpaths;	// without gamedirs
13269fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream
13279fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream/*
13289fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream================
13299fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstreamCOM_filelength
13309fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream================
13319fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream*/
13329fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstreamint COM_filelength (FILE *f)
13339fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream{
13349fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	int		pos;
13359fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	int		end;
13369fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream
13379fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	pos = ftell (f);
13389fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	fseek (f, 0, SEEK_END);
13399fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	end = ftell (f);
13409fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	fseek (f, pos, SEEK_SET);
13419fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream
13429fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	return end;
13439fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream}
13449fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream
13459fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstreamint COM_FileOpenRead (char *path, FILE **hndl)
13469fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream{
13479fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	FILE	*f;
13489fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream
13499fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	f = fopen(path, "rb");
13509fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	if (!f)
13519fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	{
13529fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream		*hndl = NULL;
13539fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream		return -1;
13549fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	}
13559fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	*hndl = f;
13569fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream
13579fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	return COM_filelength(f);
13589fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream}
13599fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream
13609fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream/*
13619fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream============
13629fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstreamCOM_Path_f
13639fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream
13649fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream============
13659fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream*/
13669fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstreamvoid COM_Path_f (void)
13679fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream{
13689fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	searchpath_t	*s;
13699fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream
13709fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	Con_Printf ("Current search path:\n");
13719fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	for (s=com_searchpaths ; s ; s=s->next)
13729fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	{
13739fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream		if (s == com_base_searchpaths)
13749fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream			Con_Printf ("----------\n");
13759fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream		if (s->pack)
13769fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream			Con_Printf ("%s (%i files)\n", s->pack->filename, s->pack->numfiles);
13779fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream		else
13789fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream			Con_Printf ("%s\n", s->filename);
13799fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	}
13809fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream}
13819fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream
13829fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream/*
13839fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream============
13849fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstreamCOM_WriteFile
13859fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream
13869fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstreamThe filename will be prefixed by the current game directory
13879fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream============
13889fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream*/
13899fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstreamvoid COM_WriteFile (char *filename, void *data, int len)
13909fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream{
13919fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	FILE	*f;
13929fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	char	name[MAX_OSPATH];
13939fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream
13949fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	sprintf (name, "%s/%s", com_gamedir, filename);
13959fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream
13969fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	f = fopen (name, "wb");
13979fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	if (!f) {
13989fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream		Sys_mkdir(com_gamedir);
13999fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream		f = fopen (name, "wb");
14009fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream		if (!f)
14019fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream			Sys_Error ("Error opening %s", filename);
14029fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	}
14039fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream
14049fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	Sys_Printf ("COM_WriteFile: %s\n", name);
14059fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	fwrite (data, 1, len, f);
14069fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	fclose (f);
14079fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream}
14089fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream
14099fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream
14109fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream/*
14119fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream============
14129fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstreamCOM_CreatePath
14139fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream
14149fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstreamOnly used for CopyFile and download
14159fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream============
14169fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream*/
14179fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstreamvoid	COM_CreatePath (char *path)
14189fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream{
14199fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	char	*ofs;
14209fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream
14219fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	for (ofs = path+1 ; *ofs ; ofs++)
14229fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	{
14239fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream		if (*ofs == '/')
14249fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream		{	// create the directory
14259fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream			*ofs = 0;
14269fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream			Sys_mkdir (path);
14279fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream			*ofs = '/';
14289fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream		}
14299fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	}
14309fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream}
14319fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream
14329fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream
14339fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream/*
14349fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream===========
14359fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstreamCOM_CopyFile
14369fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream
14379fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstreamCopies a file over from the net to the local cache, creating any directories
14389fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstreamneeded.  This is for the convenience of developers using ISDN from home.
14399fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream===========
14409fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream*/
14419fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstreamvoid COM_CopyFile (char *netpath, char *cachepath)
14429fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream{
14439fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	FILE	*in, *out;
14449fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	int		remaining, count;
14459fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	char	buf[4096];
14469fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream
14479fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	remaining = COM_FileOpenRead (netpath, &in);
14489fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	COM_CreatePath (cachepath);	// create directories up to the cache file
14499fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	out = fopen(cachepath, "wb");
14509fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	if (!out)
14519fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream		Sys_Error ("Error opening %s", cachepath);
14529fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream
14539fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	while (remaining)
14549fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	{
1455cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich		if (remaining < (int) sizeof(buf))
14569fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream			count = remaining;
14579fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream		else
14589fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream			count = sizeof(buf);
14599fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream		fread (buf, 1, count, in);
14609fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream		fwrite (buf, 1, count, out);
14619fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream		remaining -= count;
14629fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	}
14639fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream
14649fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	fclose (in);
14659fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	fclose (out);
14669fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream}
14679fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream
14689fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream/*
14699fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream===========
14709fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstreamCOM_FindFile
14719fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream
14729fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstreamFinds the file in the search path.
14739fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstreamSets com_filesize and one of handle or file
14749fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream===========
14759fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream*/
14769fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstreamint file_from_pak; // global indicating file came from pack file ZOID
14779fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream
14789fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstreamint COM_FOpenFile (char *filename, FILE **file)
14799fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream{
14809fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	searchpath_t	*search;
14819fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	char		netpath[MAX_OSPATH];
14829fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	pack_t		*pak;
14839fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	int			i;
14849fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	int			findtime;
14859fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream
14869fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	file_from_pak = 0;
14879fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream
14889fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream//
14899fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream// search through the path, one element at a time
14909fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream//
14919fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	for (search = com_searchpaths ; search ; search = search->next)
14929fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	{
14939fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	// is the element a pak file?
14949fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream		if (search->pack)
14959fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream		{
14969fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream		// look through all the pak file elements
14979fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream			pak = search->pack;
14989fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream			for (i=0 ; i<pak->numfiles ; i++)
14999fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream				if (!strcmp (pak->files[i].name, filename))
15009fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream				{	// found it!
15019fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream					Sys_Printf ("PackFile: %s : %s\n",pak->filename, filename);
15029fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream				// open a new file on the pakfile
15039fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream					*file = fopen (pak->filename, "rb");
15049fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream					if (!*file)
15059fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream						Sys_Error ("Couldn't reopen %s", pak->filename);
15069fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream					fseek (*file, pak->files[i].filepos, SEEK_SET);
15079fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream					com_filesize = pak->files[i].filelen;
15089fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream					file_from_pak = 1;
15099fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream					return com_filesize;
15109fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream				}
15119fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream		}
15129fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream		else
15139fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream		{
15149fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	// check a file in the directory tree
15159fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream			if (!static_registered)
15169fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream			{	// if not a registered version, don't ever go beyond base
15179fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream				if ( strchr (filename, '/') || strchr (filename,'\\'))
15189fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream					continue;
15199fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream			}
15209fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream
15219fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream			sprintf (netpath, "%s/%s",search->filename, filename);
15229fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream
15239fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream			findtime = Sys_FileTime (netpath);
15249fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream			if (findtime == -1)
15259fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream				continue;
15269fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream
15279fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream			Sys_Printf ("FindFile: %s\n",netpath);
15289fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream
15299fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream			*file = fopen (netpath, "rb");
15309fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream			return COM_filelength (*file);
15319fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream		}
15329fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream
15339fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	}
15349fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream
15359fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	Sys_Printf ("FindFile: can't find %s\n", filename);
15369fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream
15379fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	*file = NULL;
15389fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	com_filesize = -1;
15399fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	return -1;
15409fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream}
15419fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream
15429fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream/*
15439fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream============
15449fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstreamCOM_LoadFile
15459fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream
15469fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstreamFilename are reletive to the quake directory.
15479fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstreamAllways appends a 0 byte to the loaded data.
15489fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream============
15499fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream*/
15509fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstreamcache_user_t *loadcache;
15519fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstreambyte	*loadbuf;
15529fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstreamint		loadsize;
15539fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstreambyte *COM_LoadFile (char *path, int usehunk)
15549fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream{
15559fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	FILE	*h;
15569fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	byte	*buf;
15579fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	char	base[32];
15589fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	int		len;
15599fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream
15609fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	buf = NULL;	// quiet compiler warning
15619fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream
15629fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream// look for it in the filesystem or pack files
15639fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	len = com_filesize = COM_FOpenFile (path, &h);
15649fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	if (!h)
15659fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream		return NULL;
15669fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream
15679fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream// extract the filename base name for hunk tag
15689fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	COM_FileBase (path, base);
15699fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream
15709fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	if (usehunk == 1)
15719fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream		buf = Hunk_AllocName (len+1, base);
15729fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	else if (usehunk == 2)
15739fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream		buf = Hunk_TempAlloc (len+1);
15749fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	else if (usehunk == 0)
15759fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream		buf = Z_Malloc (len+1);
15769fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	else if (usehunk == 3)
15779fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream		buf = Cache_Alloc (loadcache, len+1, base);
15789fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	else if (usehunk == 4)
15799fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	{
15809fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream		if (len+1 > loadsize)
15819fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream			buf = Hunk_TempAlloc (len+1);
15829fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream		else
15839fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream			buf = loadbuf;
15849fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	}
15859fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	else
15869fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream		Sys_Error ("COM_LoadFile: bad usehunk");
15879fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream
15889fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	if (!buf)
15899fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream		Sys_Error ("COM_LoadFile: not enough space for %s", path);
15909fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream
15919fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	((byte *)buf)[len] = 0;
15929fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream#ifndef SERVERONLY
15939fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	Draw_BeginDisc ();
15949fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream#endif
15959fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	fread (buf, 1, len, h);
15969fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	fclose (h);
15979fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream#ifndef SERVERONLY
15989fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	Draw_EndDisc ();
15999fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream#endif
16009fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream
16019fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	return buf;
16029fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream}
16039fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream
16049fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstreambyte *COM_LoadHunkFile (char *path)
16059fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream{
16069fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	return COM_LoadFile (path, 1);
16079fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream}
16089fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream
16099fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstreambyte *COM_LoadTempFile (char *path)
16109fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream{
16119fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	return COM_LoadFile (path, 2);
16129fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream}
16139fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream
16149fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstreamvoid COM_LoadCacheFile (char *path, struct cache_user_s *cu)
16159fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream{
16169fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	loadcache = cu;
16179fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	COM_LoadFile (path, 3);
16189fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream}
16199fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream
16209fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream// uses temp hunk if larger than bufsize
16219fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstreambyte *COM_LoadStackFile (char *path, void *buffer, int bufsize)
16229fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream{
16239fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	byte	*buf;
16249fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream
16259fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	loadbuf = (byte *)buffer;
16269fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	loadsize = bufsize;
16279fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	buf = COM_LoadFile (path, 4);
16289fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream
16299fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	return buf;
16309fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream}
16319fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream
16329fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream/*
16339fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream=================
16349fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstreamCOM_LoadPackFile
16359fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream
16369fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstreamTakes an explicit (not game tree related) path to a pak file.
16379fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream
16389fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstreamLoads the header and directory, adding the files at the beginning
16399fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstreamof the list so they override previous pack files.
16409fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream=================
16419fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream*/
16429fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstreampack_t *COM_LoadPackFile (char *packfile)
16439fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream{
16449fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	dpackheader_t	header;
16459fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	int				i;
16469fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	packfile_t		*newfiles;
16479fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	int				numpackfiles;
16489fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	pack_t			*pack;
16499fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	FILE			*packhandle;
16509fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	dpackfile_t		info[MAX_FILES_IN_PACK];
16519fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	unsigned short		crc;
16529fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream
16539fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	if (COM_FileOpenRead (packfile, &packhandle) == -1)
16549fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream		return NULL;
16559fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream
16569fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	fread (&header, 1, sizeof(header), packhandle);
16579fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	if (header.id[0] != 'P' || header.id[1] != 'A'
16589fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	|| header.id[2] != 'C' || header.id[3] != 'K')
16599fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream		Sys_Error ("%s is not a packfile", packfile);
16609fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	header.dirofs = LittleLong (header.dirofs);
16619fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	header.dirlen = LittleLong (header.dirlen);
16629fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream
16639fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	numpackfiles = header.dirlen / sizeof(dpackfile_t);
16649fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream
16659fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	if (numpackfiles > MAX_FILES_IN_PACK)
16669fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream		Sys_Error ("%s has %i files", packfile, numpackfiles);
16679fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream
16689fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	if (numpackfiles != PAK0_COUNT)
16699fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream		com_modified = true;	// not the original file
16709fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream
16719fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	newfiles = Z_Malloc (numpackfiles * sizeof(packfile_t));
16729fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream
16739fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	fseek (packhandle, header.dirofs, SEEK_SET);
16749fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	fread (&info, 1, header.dirlen, packhandle);
16759fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream
16769fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream// crc the directory to check for modifications
16779fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	crc = CRC_Block((byte *)info, header.dirlen);
16789fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream
16799fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream//	CRC_Init (&crc);
16809fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream//	for (i=0 ; i<header.dirlen ; i++)
16819fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream//		CRC_ProcessByte (&crc, ((byte *)info)[i]);
16829fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	if (crc != PAK0_CRC)
16839fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream		com_modified = true;
16849fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream
16859fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream// parse the directory
16869fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	for (i=0 ; i<numpackfiles ; i++)
16879fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	{
16889fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream		strcpy (newfiles[i].name, info[i].name);
16899fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream		newfiles[i].filepos = LittleLong(info[i].filepos);
16909fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream		newfiles[i].filelen = LittleLong(info[i].filelen);
16919fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	}
16929fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream
16939fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	pack = Z_Malloc (sizeof (pack_t));
16949fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	strcpy (pack->filename, packfile);
16959fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	pack->handle = packhandle;
16969fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	pack->numfiles = numpackfiles;
16979fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	pack->files = newfiles;
16989fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream
16999fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	Con_Printf ("Added packfile %s (%i files)\n", packfile, numpackfiles);
17009fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	return pack;
17019fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream}
17029fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream
17039fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream
17049fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream/*
17059fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream================
17069fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstreamCOM_AddGameDirectory
17079fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream
17089fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstreamSets com_gamedir, adds the directory to the head of the path,
17099fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstreamthen loads and adds pak1.pak pak2.pak ...
17109fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream================
17119fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream*/
17129fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstreamvoid COM_AddGameDirectory (char *dir)
17139fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream{
17149fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	int				i;
17159fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	searchpath_t	*search;
17169fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	pack_t			*pak;
17179fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	char			pakfile[MAX_OSPATH];
17189fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	char			*p;
17199fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream
17209fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	if ((p = strrchr(dir, '/')) != NULL)
17219fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream		strcpy(gamedirfile, ++p);
17229fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	else
17239fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream		strcpy(gamedirfile, p);
17249fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	strcpy (com_gamedir, dir);
17259fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream
17269fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream//
17279fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream// add the directory to the search path
17289fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream//
17299fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	search = Hunk_Alloc (sizeof(searchpath_t));
17309fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	strcpy (search->filename, dir);
17319fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	search->next = com_searchpaths;
17329fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	com_searchpaths = search;
17339fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream
17349fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream//
17359fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream// add any pak files in the format pak0.pak pak1.pak, ...
17369fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream//
17379fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	for (i=0 ; ; i++)
17389fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	{
17399fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream		sprintf (pakfile, "%s/pak%i.pak", dir, i);
17409fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream		pak = COM_LoadPackFile (pakfile);
17419fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream		if (!pak)
17429fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream			break;
17439fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream		search = Hunk_Alloc (sizeof(searchpath_t));
17449fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream		search->pack = pak;
17459fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream		search->next = com_searchpaths;
17469fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream		com_searchpaths = search;
17479fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	}
17489fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream
17499fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream}
17509fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream
17519fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream/*
17529fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream================
17539fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstreamCOM_Gamedir
17549fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream
17559fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstreamSets the gamedir and path to a different directory.
17569fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream================
17579fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream*/
17589fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstreamvoid COM_Gamedir (char *dir)
17599fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream{
17609fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	searchpath_t	*search, *next;
17619fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	int				i;
17629fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	pack_t			*pak;
17639fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	char			pakfile[MAX_OSPATH];
17649fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream
17659fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	if (strstr(dir, "..") || strstr(dir, "/")
17669fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream		|| strstr(dir, "\\") || strstr(dir, ":") )
17679fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	{
17689fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream		Con_Printf ("Gamedir should be a single filename, not a path\n");
17699fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream		return;
17709fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	}
17719fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream
17729fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	if (!strcmp(gamedirfile, dir))
17739fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream		return;		// still the same
17749fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	strcpy (gamedirfile, dir);
17759fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream
17769fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	//
17779fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	// free up any current game dir info
17789fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	//
17799fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	while (com_searchpaths != com_base_searchpaths)
17809fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	{
17819fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream		if (com_searchpaths->pack)
17829fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream		{
17839fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream			fclose (com_searchpaths->pack->handle);
17849fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream			Z_Free (com_searchpaths->pack->files);
17859fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream			Z_Free (com_searchpaths->pack);
17869fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream		}
17879fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream		next = com_searchpaths->next;
17889fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream		Z_Free (com_searchpaths);
17899fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream		com_searchpaths = next;
17909fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	}
17919fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream
17929fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	//
17939fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	// flush all data, so it will be forced to reload
17949fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	//
17959fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	Cache_Flush ();
17969fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream
17979fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	if (!strcmp(dir,"id1") || !strcmp(dir, "qw"))
17989fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream		return;
17999fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream
18009fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	sprintf (com_gamedir, "%s/%s", com_basedir, dir);
18019fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream
18029fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	//
18039fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	// add the directory to the search path
18049fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	//
18059fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	search = Z_Malloc (sizeof(searchpath_t));
18069fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	strcpy (search->filename, com_gamedir);
18079fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	search->next = com_searchpaths;
18089fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	com_searchpaths = search;
18099fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream
18109fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	//
18119fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	// add any pak files in the format pak0.pak pak1.pak, ...
18129fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	//
18139fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	for (i=0 ; ; i++)
18149fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	{
18159fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream		sprintf (pakfile, "%s/pak%i.pak", com_gamedir, i);
18169fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream		pak = COM_LoadPackFile (pakfile);
18179fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream		if (!pak)
18189fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream			break;
18199fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream		search = Z_Malloc (sizeof(searchpath_t));
18209fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream		search->pack = pak;
18219fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream		search->next = com_searchpaths;
18229fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream		com_searchpaths = search;
18239fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	}
18249fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream}
18259fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream
18269fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream/*
18279fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream================
18289fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstreamCOM_InitFilesystem
18299fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream================
18309fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream*/
18319fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstreamvoid COM_InitFilesystem (void)
18329fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream{
18339fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	int		i;
18349fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream
18359fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream//
18369fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream// -basedir <path>
18379fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream// Overrides the system supplied base directory (under id1)
18389fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream//
18399fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	i = COM_CheckParm ("-basedir");
18409fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	if (i && i < com_argc-1)
18419fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream		strcpy (com_basedir, com_argv[i+1]);
18429fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	else
18439fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream		strcpy (com_basedir, host_parms.basedir);
18449fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream
18459fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream//
18469fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream// start up with id1 by default
18479fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream//
18489fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	COM_AddGameDirectory (va("%s/id1", com_basedir) );
18499fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	COM_AddGameDirectory (va("%s/qw", com_basedir) );
18509fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream
18519fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	// any set gamedirs will be freed up to here
18529fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	com_base_searchpaths = com_searchpaths;
18539fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream}
18549fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream
18559fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream
18569fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream
18579fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream/*
18589fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream=====================================================================
18599fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream
18609fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream  INFO STRINGS
18619fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream
18629fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream=====================================================================
18639fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream*/
18649fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream
18659fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream/*
18669fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream===============
18679fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstreamInfo_ValueForKey
18689fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream
18699fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstreamSearches the string for the given
18709fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstreamkey and returns the associated value, or an empty string.
18719fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream===============
18729fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream*/
18739fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstreamchar *Info_ValueForKey (char *s, char *key)
18749fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream{
18759fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	char	pkey[512];
18769fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	static	char value[4][512];	// use two buffers so compares
18779fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream								// work without stomping on each other
18789fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	static	int	valueindex;
18799fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	char	*o;
18809fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream
18819fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	valueindex = (valueindex + 1) % 4;
18829fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	if (*s == '\\')
18839fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream		s++;
18849fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	while (1)
18859fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	{
18869fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream		o = pkey;
18879fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream		while (*s != '\\')
18889fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream		{
18899fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream			if (!*s)
18909fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream				return "";
18919fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream			*o++ = *s++;
18929fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream		}
18939fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream		*o = 0;
18949fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream		s++;
18959fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream
18969fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream		o = value[valueindex];
18979fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream
18989fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream		while (*s != '\\' && *s)
18999fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream		{
19009fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream			if (!*s)
19019fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream				return "";
19029fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream			*o++ = *s++;
19039fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream		}
19049fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream		*o = 0;
19059fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream
19069fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream		if (!strcmp (key, pkey) )
19079fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream			return value[valueindex];
19089fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream
19099fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream		if (!*s)
19109fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream			return "";
19119fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream		s++;
19129fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	}
19139fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream}
19149fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream
19159fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstreamvoid Info_RemoveKey (char *s, char *key)
19169fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream{
19179fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	char	*start;
19189fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	char	pkey[512];
19199fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	char	value[512];
19209fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	char	*o;
19219fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream
19229fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	if (strstr (key, "\\"))
19239fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	{
19249fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream		Con_Printf ("Can't use a key with a \\\n");
19259fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream		return;
19269fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	}
19279fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream
19289fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	while (1)
19299fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	{
19309fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream		start = s;
19319fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream		if (*s == '\\')
19329fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream			s++;
19339fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream		o = pkey;
19349fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream		while (*s != '\\')
19359fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream		{
19369fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream			if (!*s)
19379fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream				return;
19389fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream			*o++ = *s++;
19399fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream		}
19409fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream		*o = 0;
19419fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream		s++;
19429fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream
19439fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream		o = value;
19449fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream		while (*s != '\\' && *s)
19459fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream		{
19469fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream			if (!*s)
19479fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream				return;
19489fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream			*o++ = *s++;
19499fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream		}
19509fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream		*o = 0;
19519fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream
19529fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream		if (!strcmp (key, pkey) )
19539fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream		{
19549fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream			strcpy (start, s);	// remove this part
19559fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream			return;
19569fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream		}
19579fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream
19589fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream		if (!*s)
19599fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream			return;
19609fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	}
19619fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream
19629fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream}
19639fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream
19649fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstreamvoid Info_RemovePrefixedKeys (char *start, char prefix)
19659fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream{
19669fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	char	*s;
19679fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	char	pkey[512];
19689fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	char	value[512];
19699fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	char	*o;
19709fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream
19719fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	s = start;
19729fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream
19739fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	while (1)
19749fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	{
19759fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream		if (*s == '\\')
19769fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream			s++;
19779fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream		o = pkey;
19789fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream		while (*s != '\\')
19799fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream		{
19809fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream			if (!*s)
19819fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream				return;
19829fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream			*o++ = *s++;
19839fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream		}
19849fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream		*o = 0;
19859fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream		s++;
19869fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream
19879fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream		o = value;
19889fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream		while (*s != '\\' && *s)
19899fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream		{
19909fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream			if (!*s)
19919fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream				return;
19929fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream			*o++ = *s++;
19939fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream		}
19949fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream		*o = 0;
19959fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream
19969fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream		if (pkey[0] == prefix)
19979fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream		{
19989fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream			Info_RemoveKey (start, pkey);
19999fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream			s = start;
20009fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream		}
20019fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream
20029fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream		if (!*s)
20039fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream			return;
20049fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	}
20059fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream
20069fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream}
20079fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream
20089fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream
20099fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstreamvoid Info_SetValueForStarKey (char *s, char *key, char *value, int maxsize)
20109fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream{
20119fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	char	new[1024], *v;
20129fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	int		c;
20139fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream#ifdef SERVERONLY
20149fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	extern cvar_t sv_highchars;
20159fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream#endif
20169fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream
20179fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	if (strstr (key, "\\") || strstr (value, "\\") )
20189fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	{
20199fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream		Con_Printf ("Can't use keys or values with a \\\n");
20209fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream		return;
20219fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	}
20229fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream
20239fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	if (strstr (key, "\"") || strstr (value, "\"") )
20249fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	{
20259fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream		Con_Printf ("Can't use keys or values with a \"\n");
20269fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream		return;
20279fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	}
20289fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream
20299fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	if (strlen(key) > 63 || strlen(value) > 63)
20309fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	{
20319fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream		Con_Printf ("Keys and values must be < 64 characters.\n");
20329fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream		return;
20339fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	}
20349fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream
20359fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	// this next line is kinda trippy
20369fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	if (*(v = Info_ValueForKey(s, key))) {
20379fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream		// key exists, make sure we have enough room for new value, if we don't,
20389fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream		// don't change it!
2039cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich		if ((int) (strlen(value) - strlen(v) + strlen(s)) > maxsize) {
20409fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream			Con_Printf ("Info string length exceeded\n");
20419fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream			return;
20429fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream		}
20439fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	}
20449fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	Info_RemoveKey (s, key);
20459fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	if (!value || !strlen(value))
20469fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream		return;
20479fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream
20489fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	sprintf (new, "\\%s\\%s", key, value);
20499fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream
20509fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	if ((int)(strlen(new) + strlen(s)) > maxsize)
20519fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	{
20529fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream		Con_Printf ("Info string length exceeded\n");
20539fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream		return;
20549fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	}
20559fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream
20569fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	// only copy ascii values
20579fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	s += strlen(s);
20589fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	v = new;
20599fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	while (*v)
20609fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	{
20619fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream		c = (unsigned char)*v++;
20629fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream#ifndef SERVERONLY
20639fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream		// client only allows highbits on name
20649fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream		if (stricmp(key, "name") != 0) {
20659fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream			c &= 127;
20669fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream			if (c < 32 || c > 127)
20679fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream				continue;
20689fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream			// auto lowercase team
20699fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream			if (stricmp(key, "team") == 0)
20709fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream				c = tolower(c);
20719fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream		}
20729fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream#else
20739fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream		if (!sv_highchars.value) {
20749fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream			c &= 127;
20759fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream			if (c < 32 || c > 127)
20769fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream				continue;
20779fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream		}
20789fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream#endif
20799fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream//		c &= 127;		// strip high bits
20809fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream		if (c > 13) // && c < 127)
20819fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream			*s++ = c;
20829fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	}
20839fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	*s = 0;
20849fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream}
20859fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream
20869fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstreamvoid Info_SetValueForKey (char *s, char *key, char *value, int maxsize)
20879fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream{
20889fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	if (key[0] == '*')
20899fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	{
20909fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream		Con_Printf ("Can't set * keys\n");
20919fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream		return;
20929fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	}
20939fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream
20949fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	Info_SetValueForStarKey (s, key, value, maxsize);
20959fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream}
20969fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream
20979fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstreamvoid Info_Print (char *s)
20989fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream{
20999fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	char	key[512];
21009fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	char	value[512];
21019fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	char	*o;
21029fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	int		l;
21039fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream
21049fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	if (*s == '\\')
21059fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream		s++;
21069fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	while (*s)
21079fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	{
21089fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream		o = key;
21099fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream		while (*s && *s != '\\')
21109fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream			*o++ = *s++;
21119fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream
21129fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream		l = o - key;
21139fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream		if (l < 20)
21149fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream		{
21159fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream			memset (o, ' ', 20-l);
21169fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream			key[20] = 0;
21179fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream		}
21189fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream		else
21199fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream			*o = 0;
21209fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream		Con_Printf ("%s", key);
21219fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream
21229fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream		if (!*s)
21239fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream		{
21249fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream			Con_Printf ("MISSING VALUE\n");
21259fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream			return;
21269fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream		}
21279fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream
21289fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream		o = value;
21299fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream		s++;
21309fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream		while (*s && *s != '\\')
21319fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream			*o++ = *s++;
21329fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream		*o = 0;
21339fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream
21349fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream		if (*s)
21359fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream			s++;
21369fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream		Con_Printf ("%s\n", value);
21379fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	}
21389fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream}
21399fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream
21409fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstreamstatic byte chktbl[1024 + 4] = {
21419fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream0x78,0xd2,0x94,0xe3,0x41,0xec,0xd6,0xd5,0xcb,0xfc,0xdb,0x8a,0x4b,0xcc,0x85,0x01,
21429fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream0x23,0xd2,0xe5,0xf2,0x29,0xa7,0x45,0x94,0x4a,0x62,0xe3,0xa5,0x6f,0x3f,0xe1,0x7a,
21439fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream0x64,0xed,0x5c,0x99,0x29,0x87,0xa8,0x78,0x59,0x0d,0xaa,0x0f,0x25,0x0a,0x5c,0x58,
21449fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream0xfb,0x00,0xa7,0xa8,0x8a,0x1d,0x86,0x80,0xc5,0x1f,0xd2,0x28,0x69,0x71,0x58,0xc3,
21459fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream0x51,0x90,0xe1,0xf8,0x6a,0xf3,0x8f,0xb0,0x68,0xdf,0x95,0x40,0x5c,0xe4,0x24,0x6b,
21469fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream0x29,0x19,0x71,0x3f,0x42,0x63,0x6c,0x48,0xe7,0xad,0xa8,0x4b,0x91,0x8f,0x42,0x36,
21479fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream0x34,0xe7,0x32,0x55,0x59,0x2d,0x36,0x38,0x38,0x59,0x9b,0x08,0x16,0x4d,0x8d,0xf8,
21489fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream0x0a,0xa4,0x52,0x01,0xbb,0x52,0xa9,0xfd,0x40,0x18,0x97,0x37,0xff,0xc9,0x82,0x27,
21499fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream0xb2,0x64,0x60,0xce,0x00,0xd9,0x04,0xf0,0x9e,0x99,0xbd,0xce,0x8f,0x90,0x4a,0xdd,
21509fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream0xe1,0xec,0x19,0x14,0xb1,0xfb,0xca,0x1e,0x98,0x0f,0xd4,0xcb,0x80,0xd6,0x05,0x63,
21519fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream0xfd,0xa0,0x74,0xa6,0x86,0xf6,0x19,0x98,0x76,0x27,0x68,0xf7,0xe9,0x09,0x9a,0xf2,
21529fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream0x2e,0x42,0xe1,0xbe,0x64,0x48,0x2a,0x74,0x30,0xbb,0x07,0xcc,0x1f,0xd4,0x91,0x9d,
21539fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream0xac,0x55,0x53,0x25,0xb9,0x64,0xf7,0x58,0x4c,0x34,0x16,0xbc,0xf6,0x12,0x2b,0x65,
21549fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream0x68,0x25,0x2e,0x29,0x1f,0xbb,0xb9,0xee,0x6d,0x0c,0x8e,0xbb,0xd2,0x5f,0x1d,0x8f,
21559fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream0xc1,0x39,0xf9,0x8d,0xc0,0x39,0x75,0xcf,0x25,0x17,0xbe,0x96,0xaf,0x98,0x9f,0x5f,
21569fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream0x65,0x15,0xc4,0x62,0xf8,0x55,0xfc,0xab,0x54,0xcf,0xdc,0x14,0x06,0xc8,0xfc,0x42,
21579fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream0xd3,0xf0,0xad,0x10,0x08,0xcd,0xd4,0x11,0xbb,0xca,0x67,0xc6,0x48,0x5f,0x9d,0x59,
21589fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream0xe3,0xe8,0x53,0x67,0x27,0x2d,0x34,0x9e,0x9e,0x24,0x29,0xdb,0x69,0x99,0x86,0xf9,
21599fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream0x20,0xb5,0xbb,0x5b,0xb0,0xf9,0xc3,0x67,0xad,0x1c,0x9c,0xf7,0xcc,0xef,0xce,0x69,
21609fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream0xe0,0x26,0x8f,0x79,0xbd,0xca,0x10,0x17,0xda,0xa9,0x88,0x57,0x9b,0x15,0x24,0xba,
21619fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream0x84,0xd0,0xeb,0x4d,0x14,0xf5,0xfc,0xe6,0x51,0x6c,0x6f,0x64,0x6b,0x73,0xec,0x85,
21629fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream0xf1,0x6f,0xe1,0x67,0x25,0x10,0x77,0x32,0x9e,0x85,0x6e,0x69,0xb1,0x83,0x00,0xe4,
21639fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream0x13,0xa4,0x45,0x34,0x3b,0x40,0xff,0x41,0x82,0x89,0x79,0x57,0xfd,0xd2,0x8e,0xe8,
21649fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream0xfc,0x1d,0x19,0x21,0x12,0x00,0xd7,0x66,0xe5,0xc7,0x10,0x1d,0xcb,0x75,0xe8,0xfa,
21659fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream0xb6,0xee,0x7b,0x2f,0x1a,0x25,0x24,0xb9,0x9f,0x1d,0x78,0xfb,0x84,0xd0,0x17,0x05,
21669fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream0x71,0xb3,0xc8,0x18,0xff,0x62,0xee,0xed,0x53,0xab,0x78,0xd3,0x65,0x2d,0xbb,0xc7,
21679fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream0xc1,0xe7,0x70,0xa2,0x43,0x2c,0x7c,0xc7,0x16,0x04,0xd2,0x45,0xd5,0x6b,0x6c,0x7a,
21689fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream0x5e,0xa1,0x50,0x2e,0x31,0x5b,0xcc,0xe8,0x65,0x8b,0x16,0x85,0xbf,0x82,0x83,0xfb,
21699fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream0xde,0x9f,0x36,0x48,0x32,0x79,0xd6,0x9b,0xfb,0x52,0x45,0xbf,0x43,0xf7,0x0b,0x0b,
21709fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream0x19,0x19,0x31,0xc3,0x85,0xec,0x1d,0x8c,0x20,0xf0,0x3a,0xfa,0x80,0x4d,0x2c,0x7d,
21719fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream0xac,0x60,0x09,0xc0,0x40,0xee,0xb9,0xeb,0x13,0x5b,0xe8,0x2b,0xb1,0x20,0xf0,0xce,
21729fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream0x4c,0xbd,0xc6,0x04,0x86,0x70,0xc6,0x33,0xc3,0x15,0x0f,0x65,0x19,0xfd,0xc2,0xd3,
21739fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream
21749fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream// map checksum goes here
21759fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream0x00,0x00,0x00,0x00
21769fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream};
21779fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream
21789fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstreamstatic byte chkbuf[16 + 60 + 4];
21799fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream
21809fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstreamstatic unsigned last_mapchecksum = 0;
21819fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream
21829fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream#if 0
21839fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream/*
21849fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream====================
21859fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstreamCOM_BlockSequenceCheckByte
21869fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream
21879fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstreamFor proxy protecting
21889fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream====================
21899fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream*/
21909fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstreambyte	COM_BlockSequenceCheckByte (byte *base, int length, int sequence, unsigned mapchecksum)
21919fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream{
21929fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	int		checksum;
21939fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	byte	*p;
21949fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream
21959fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	if (last_mapchecksum != mapchecksum) {
21969fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream		last_mapchecksum = mapchecksum;
21979fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream		chktbl[1024] = (mapchecksum & 0xff000000) >> 24;
21989fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream		chktbl[1025] = (mapchecksum & 0x00ff0000) >> 16;
21999fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream		chktbl[1026] = (mapchecksum & 0x0000ff00) >> 8;
22009fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream		chktbl[1027] = (mapchecksum & 0x000000ff);
22019fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream
22029fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream		Com_BlockFullChecksum (chktbl, sizeof(chktbl), chkbuf);
22039fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	}
22049fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream
22059fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	p = chktbl + (sequence % (sizeof(chktbl) - 8));
22069fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream
22079fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	if (length > 60)
22089fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream		length = 60;
22099fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	memcpy (chkbuf + 16, base, length);
22109fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream
22119fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	length += 16;
22129fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream
22139fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	chkbuf[length] = (sequence & 0xff) ^ p[0];
22149fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	chkbuf[length+1] = p[1];
22159fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	chkbuf[length+2] = ((sequence>>8) & 0xff) ^ p[2];
22169fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	chkbuf[length+3] = p[3];
22179fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream
22189fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	length += 4;
22199fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream
22209fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	checksum = LittleLong(Com_BlockChecksum (chkbuf, length));
22219fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream
22229fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	checksum &= 0xff;
22239fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream
22249fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	return checksum;
22259fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream}
22269fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream#endif
22279fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream
22289fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream/*
22299fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream====================
22309fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstreamCOM_BlockSequenceCRCByte
22319fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream
22329fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstreamFor proxy protecting
22339fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream====================
22349fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream*/
22359fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstreambyte	COM_BlockSequenceCRCByte (byte *base, int length, int sequence)
22369fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream{
22379fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	unsigned short crc;
22389fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	byte	*p;
22399fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	byte chkb[60 + 4];
22409fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream
22419fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	p = chktbl + (sequence % (sizeof(chktbl) - 8));
22429fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream
22439fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	if (length > 60)
22449fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream		length = 60;
22459fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	memcpy (chkb, base, length);
22469fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream
22479fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	chkb[length] = (sequence & 0xff) ^ p[0];
22489fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	chkb[length+1] = p[1];
22499fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	chkb[length+2] = ((sequence>>8) & 0xff) ^ p[2];
22509fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	chkb[length+3] = p[3];
22519fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream
22529fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	length += 4;
22539fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream
22549fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	crc = CRC_Block(chkb, length);
22559fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream
22569fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	crc &= 0xff;
22579fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream
22589fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	return crc;
22599fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream}
22609fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream
22619fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream// char *date = "Oct 24 1996";
22629fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstreamstatic char *date = __DATE__ ;
22639fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstreamstatic char *mon[12] =
22649fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream{ "Jan", "Feb", "Mar", "Apr", "May", "Jun", "Jul", "Aug", "Sep", "Oct", "Nov", "Dec" };
22659fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstreamstatic char mond[12] =
22669fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream{ 31,    28,    31,    30,    31,    30,    31,    31,    30,    31,    30,    31 };
22679fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream
22689fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream// returns days since Oct 24 1996
22699fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstreamint build_number( void )
22709fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream{
22719fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	int m = 0;
22729fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	int d = 0;
22739fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	int y = 0;
22749fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	static int b = 0;
22759fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream
22769fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	if (b != 0)
22779fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream		return b;
22789fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream
22799fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	for (m = 0; m < 11; m++)
22809fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	{
22819fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream		if (Q_strncasecmp( &date[0], mon[m], 3 ) == 0)
22829fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream			break;
22839fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream		d += mond[m];
22849fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	}
22859fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream
22869fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	d += atoi( &date[4] ) - 1;
22879fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream
22889fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	y = atoi( &date[7] ) - 1900;
22899fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream
22909fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	b = d + (int)((y - 1) * 365.25);
22919fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream
22929fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	if (((y % 4) == 0) && m > 1)
22939fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	{
22949fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream		b += 1;
22959fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	}
22969fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream
22979fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	b -= 35778; // Dec 16 1998
22989fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream
22999fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	return b;
23009fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream}
23019fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream
2302