亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频

? 歡迎來到蟲蟲下載站! | ?? 資源下載 ?? 資源專輯 ?? 關(guān)于我們
? 蟲蟲下載站

?? script.cpp

?? this keik game source
?? CPP
字號:
//-----------------------------------------------------------------------------
//
//  $Logfile:: /Quake 2 Engine/Sin/code/game/script.cpp                       $
// $Revision:: 13                                                             $
//   $Author:: Jimdose                                                        $
//     $Date:: 10/07/98 11:58p                                                $
//
// Copyright (C) 1997 by Ritual Entertainment, Inc.
// All rights reserved.
//
// This source is may not be distributed and/or modified without
// expressly written permission by Ritual Entertainment, Inc.
//
// $Log:: /Quake 2 Engine/Sin/code/game/script.cpp                            $
// 
// 13    10/07/98 11:58p Jimdose
// changed script_t to offset in script markers
// 
// 12    6/09/98 4:21p Jimdose
// Added close
// filename is now a str
// 
// 11    5/24/98 5:25p Jimdose
// Changed char *'s to const char *'s
// 
// 10    3/26/98 3:57p Jimdose
// Made gettoken and getstring handle escape sequences (\n, \", etc.)
// 
// 9     3/23/98 1:31p Jimdose
// Revamped event and command system
// 
// 8     3/02/98 8:49p Jimdose
// Changed the classid parameter of CLASS_DECLARATION to a quoted string so
// that you could have a NULL classid.
// 
// 7     2/17/98 7:13p Jimdose
// Added MarkPosition and RestorePosition
// Added atString for determining if the next token is a quoted string
// Made GetToken call GetString if the next token is a quoted string
// Fixed bug where GetSpecific wasn't properly updating the current line number
// 
// 6     2/03/98 10:54a Jimdose
// Updated to work with Quake 2 engine
// 
// 4     11/24/97 4:30p Markd
// Added GetVector
// 
// 3     10/27/97 3:29p Jimdose
// Removed dependency on quakedef.h
// 
// 2     9/26/97 6:14p Jimdose
// Added standard Ritual headers
//
// DESCRIPTION:
// C++ implementaion of tokenizing text interpretation.  Class accepts filename
// to load or pointer to preloaded text data.  Standard tokenizing operations
// such as skip white-space, get string, get integer, get float, get token,
// and skip line are implemented.  
//
// Note: all '//', '#', and ';' are treated as comments.  Probably should
// make this behaviour toggleable.
// 

#include "g_local.h"
#include "script.h"

#define TOKENCOMMENT      (';')
#define TOKENCOMMENT2     ('#')
#define TOKENEOL          ('\n')
#define TOKENNULL         ('\0')
#define TOKENSPACE        (' ')

CLASS_DECLARATION( Class, Script, NULL );

ResponseDef Script::Responses[] =
	{
		{ NULL, NULL }
	};

Script::~Script()
	{
	Close();
	}

Script::Script()
	{
	buffer			= NULL;
	script_p			= NULL;
	end_p				= NULL;
	line				= 0;
	releaseBuffer	= false;
	tokenready		= false;
	memset( token, 0, sizeof( token ) );
	}

void Script::Close
	(
	void
	)

	{
	if ( releaseBuffer && buffer )
		{
		gi.TagFree( ( void * )buffer );
		}

	buffer			= NULL;
	script_p			= NULL;
	end_p				= NULL;
	line				= 0;
	releaseBuffer	= false;
	tokenready		= false;
	memset( token, 0, sizeof( token ) );
	}

/*
==============
=
= Filename
=
==============
*/

const char *Script::Filename
	(
	void
	)
	
	{
	return filename.c_str();
	}

/*
==============
=
= GetLineNumber
=
==============
*/

int Script::GetLineNumber
	(
	void
	)
	
	{
	return line;
	}

/*
==============
=
= Reset
=
==============
*/

void Script::Reset 
	( 
	void
	)
	
	{
	script_p = buffer;
	line = 1;
	tokenready = false;
	}

/*
==============
=
= MarkPosition
=
==============
*/

void Script::MarkPosition
	( 
	scriptmarker_t *mark 
	)

	{
	assert( mark );

	mark->tokenready = tokenready;
	mark->offset     = script_p - buffer;
	mark->line		  = line;
	strcpy( mark->token, token );
	}

/*
==============
=
= RestorePosition
=
==============
*/

void Script::RestorePosition
	(
	scriptmarker_t *mark
	)

	{
	assert( mark );

	tokenready	= mark->tokenready;
	script_p		= buffer + mark->offset;
	line			= mark->line;
	strcpy( token, mark->token );

   assert( script_p <= end_p );
   if ( script_p > end_p )
      {
      script_p = end_p;
      }
	}

/*
==============
=
= SkipToEOL
=
==============
*/

qboolean Script::SkipToEOL
	( 
	void
	)

	{
	if ( script_p >= end_p )
		{
		return true;
		}

	while( *script_p != TOKENEOL )
		{
		if ( script_p >= end_p )
			{
			return true;
			}
		script_p++;
		}
	return false;
	}

/*
==============
=
= CheckOverflow
=
==============
*/

void Script::CheckOverflow
	(
	void
	)
	
	{
	if ( script_p >= end_p )
		{
		gi.error( "End of token file reached prematurely reading %s\n", filename.c_str() );
		}
	}

/*
==============
=
= SkipWhiteSpace
=
==============
*/

void Script::SkipWhiteSpace
	(
	qboolean crossline
	)

	{
	//
	// skip space
	//
	CheckOverflow();

	while( *script_p <= TOKENSPACE )
		{
		if ( *script_p++ == TOKENEOL )
			{
			if ( !crossline )
				{
				gi.error( "Line %i is incomplete in file %s\n", line, filename.c_str() );
				}

			line++;
			}
		CheckOverflow();
		}
	}

qboolean Script::AtComment
	(
	void
	)

	{
	if ( script_p >= end_p )
		{
		return false;
		}

	if ( *script_p == TOKENCOMMENT )
		{
		return true;
		}
	
	if ( *script_p == TOKENCOMMENT2 )
		{
		return true;
		}

	// Two or more character comment specifiers
	if ( ( script_p + 1 ) >= end_p )
		{
		return false;
		}
	
	if ( ( *script_p == '/' ) && ( *( script_p + 1 ) == '/' ) )
		{
		return true;
		}

	return false;
	}

/*
==============
=
= SkipNonToken
=
==============
*/

void Script::SkipNonToken
	(
	qboolean crossline
	)

	{
	//
	// skip space and comments
	//
	SkipWhiteSpace( crossline );
	while( AtComment() )
		{
		SkipToEOL();
		SkipWhiteSpace( crossline );
		}
	}

/*
=============================================================================
=
= Token section
=
=============================================================================
*/

/*
==============
=
= TokenAvailable
=
==============
*/

qboolean Script::TokenAvailable 
	(
	qboolean crossline
	)

	{
	if ( script_p >= end_p )
		{
		return false;
		}

	while ( 1 )
		{
		while ( *script_p <= TOKENSPACE )
			{
			if ( *script_p == TOKENEOL )
				{
				if ( crossline==false )
					{
					return( false );
					}
				line++;
				}

			script_p++;
			if ( script_p >= end_p )
				{
				return false;
				}
			}
	
		if ( AtComment() )
			{
			qboolean done;

			done = SkipToEOL();
			if ( done )
				{
				return false;
				}
			}
		else
			{
			break;
			}
		}

	return true;
	}

/*
==============
=
= CommentAvailable
=
==============
*/

qboolean Script::CommentAvailable
	(
	qboolean crossline
	)

	{
	const char *searchptr;

	searchptr = script_p;

	if ( searchptr >= end_p )
		{
		return false;
		}

	while ( *searchptr <= TOKENSPACE )
		{
		if ( ( *searchptr == TOKENEOL ) && ( !crossline ) )
			{
			return false;
			}
		searchptr++;
		if ( searchptr >= end_p )
			{
			return false;
			}
		}

	return true;
	}


/*
==============
=
= UnGet
=
= Signals that the current token was not used, and should be reported
= for the next GetToken.  Note that

GetToken (true);
UnGetToken ();
GetToken (false);

= could cross a line boundary.
=
==============
*/

void Script::UnGetToken
	(
	void
	)
	
	{
	tokenready = true;
	}

/*
==============
=
= Get
=
==============
*/
qboolean Script::AtString
	(
	qboolean crossline
	)
	
	{
	//
	// skip space
	//
	SkipNonToken( crossline );

	return ( *script_p == '"' );
	}

/*
==============
=
= Get
=
==============
*/

const char *Script::GetToken
	(
	qboolean crossline
	)
	
	{
	char *token_p;

	// is a token already waiting?
	if ( tokenready )
		{
		tokenready = false;
		return token;
		}

	//
	// skip space
	//
	SkipNonToken( crossline );

	//
	// copy token
	//

	if ( *script_p == '"' )
		{
		return GetString( crossline );
		}

	token_p = token;	
	while( *script_p > TOKENSPACE && !AtComment() )
		{
		if ( ( *script_p == '\\' ) && ( script_p < end_p - 1 ) )
			{
			script_p++;
			switch( *script_p )
				{
				case 'n' :	*token_p++ = '\n'; break;
				case 'r' :	*token_p++ = '\n'; break;
				case '\'' : *token_p++ = '\''; break;
				case '\"' : *token_p++ = '\"'; break;
				case '\\' : *token_p++ = '\\'; break;
				default:		*token_p++ = *script_p; break;
				}
			script_p++;
			}
		else
			{
			*token_p++ = *script_p++;
			}

		if ( token_p == &token[ MAXTOKEN ] )
			{
			gi.error( "Token too large on line %i in file %s\n", line, filename.c_str() );
			}

		if ( script_p == end_p )
			{
			break;
			}
		}

	*token_p = 0;

	return token;
	}

/*
==============
=
= GetLine
=
==============
*/

const char *Script::GetLine
	(
	qboolean crossline
	)

	{
	const char	*start;
	int			size;

	// is a token already waiting?
	if ( tokenready )
		{
		tokenready = false;
		return token;
		}

	//
	// skip space
	//
	SkipNonToken( crossline );

	//
	// copy token
	//
   start = script_p;
   SkipToEOL();
   size = script_p - start;
   if ( size < MAXTOKEN - 1 )
		{
		memcpy( token, start, size );
		token[ size ] = '\0';
		}
	else
		{
		gi.error( "Token too large on line %i in file %s\n", line, filename.c_str() );
		}
	
	return token;
	}

/*
==============
=
= GetRaw
=
==============
*/

const char *Script::GetRaw
	(
	void
	)

	{
	const char	*start;
	int			size;

	//
	// skip white space
	//
	SkipWhiteSpace( true );

	//
	// copy token
	//
	start = script_p;
	SkipToEOL();
	size = script_p - start;
	if ( size < MAXTOKEN - 1 )
		{
		memset( token, 0, sizeof( token ) );
		memcpy( token, start, size );
		}
	else
		{
		gi.error( "Token too large on line %i in file %s\n", line, filename.c_str() );
		}

	return token;
	}

/*
==============
=
= GetString
=
==============
*/

const char *Script::GetString
	(
	qboolean crossline
	)

	{
	int startline;
	char *token_p;

	// is a token already waiting?
	if ( tokenready )
		{
		tokenready = false;
		return token;
		}

	//
	// skip space
	//
	SkipNonToken( crossline );

	if ( *script_p != '"' )
		{
		gi.error( "Expecting string on line %i in file %s\n", line, filename.c_str() );
		}

	script_p++;

	startline = line;
	token_p = token;
	while( *script_p != '"' )
		{
		if ( *script_p == TOKENEOL )
			{
			gi.error( "Line %i is incomplete while reading string in file %s\n", line, filename.c_str() );
			}

		if ( ( *script_p == '\\' ) && ( script_p < end_p - 1 ) )
			{
			script_p++;
			switch( *script_p )
				{
				case 'n' :	*token_p++ = '\n'; break;
				case 'r' :	*token_p++ = '\n'; break;
				case '\'' : *token_p++ = '\''; break;
				case '\"' : *token_p++ = '\"'; break;
				case '\\' : *token_p++ = '\\'; break;
				default:		*token_p++ = *script_p; break;
				}
			script_p++;
			}
		else
			{
			*token_p++ = *script_p++;
			}

		if ( script_p >= end_p )
			{
			gi.error( "End of token file reached prematurely while reading string on\n"
				"line %d in file %s\n", startline, filename.c_str() );
			}

		if ( token_p == &token[ MAXTOKEN ] )
			{
			gi.error( "String too large on line %i in file %s\n", line, filename.c_str() );
			}
		}

	*token_p = 0;

	// skip last quote
	script_p++;
	
	return token;
	}


/*
==============
=
= GetSpecific
=
==============
*/

qboolean Script::GetSpecific
	(
	const char *string
	)

	{
	do
		{
		if ( !TokenAvailable( true ) )
			{
			return false;
			}
		GetToken( true );
		}
	while( strcmp( token, string ) );

	return true;
	}

/*
==============
=
= GetInteger
=
==============
*/

int Script::GetInteger
	(
	qboolean crossline
	)

	{
	GetToken( crossline );
	return atoi( token );
	}

/*
==============
=
= GetDouble
=
==============
*/

double Script::GetDouble
	(
	qboolean crossline
	)

	{
	GetToken( crossline );
	return atof( token );
	}

/*
==============
=
= GetFloat
=
==============
*/

float Script::GetFloat
	(
	qboolean crossline
	)

	{
	return ( float )GetDouble( crossline );
	}

/*
==============
=
= GetVector
=
==============
*/

Vector Script::GetVector
	(
	qboolean crossline
	)

	{
	return Vector( GetFloat( crossline ), GetFloat( crossline ), GetFloat( crossline ) );
	}

/*
===================
=
= LinesInFile
=
===================
*/
int Script::LinesInFile
	( 
	void
	)
	
	{
	qboolean		temp_tokenready;
	const char	*temp_script_p;
	int			temp_line;		
	char			temp_token[ MAXTOKEN ];
	int			numentries;

	temp_tokenready = tokenready;
	temp_script_p	= script_p;
	temp_line		= line;
	strcpy( temp_token, token );

	numentries = 0;

	Reset();
	while( TokenAvailable( true ) )
		{
		GetLine( true );
		numentries++;
		}
	
	tokenready	= temp_tokenready;
	script_p	= temp_script_p;
	line		= temp_line;
	strcpy( token, temp_token );
	
	return numentries;
	}

/*
==============
=
= Parse
=
==============
*/

void Script::Parse
	( 
	const char *data, 
	int length, 
	const char *name 
	)

	{
	Close();

	buffer = data;
	Reset();
	end_p = script_p + length;
	this->length = length;
	filename = name;
	}

/*
==============
=
= Load
=
==============
*/

void Script::LoadFile
	(
	const char *name
	)

	{
	int			length;
	const char	*buffer;

	Close();

	length = gi.LoadFile( name, ( void ** )&buffer, TAG_GAME );
	if ( length < 0 )
		{
		error( "LoadFile", "Couldn't load %s\n", name );
		}
	Parse( buffer, length, name );
	releaseBuffer = true;
	}

const char *Script::Token
	(
	void
	)

	{
	return token;
	}

?? 快捷鍵說明

復制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
久久色成人在线| 91精品国产综合久久精品麻豆| 久久久久久久综合| 国产一区在线视频| 久久精品在这里| 99在线精品观看| 图片区小说区国产精品视频| 欧美吞精做爰啪啪高潮| 偷拍亚洲欧洲综合| 精品国产电影一区二区 | 亚洲午夜精品网| 欧美日韩一区二区在线观看| 久久99热99| 国产精品久久久久久久久图文区 | 国产精品一区二区三区99| 国产欧美日韩亚州综合| 色播五月激情综合网| 蜜臀av一级做a爰片久久| 欧美国产激情二区三区| 欧洲精品中文字幕| 麻豆传媒一区二区三区| 国产精品国产三级国产普通话蜜臀| 欧日韩精品视频| 久久99久国产精品黄毛片色诱| 国产欧美一区二区在线| 欧美日韩国产免费| 国产一区二区剧情av在线| 亚洲欧美激情插 | 亚洲高清久久久| 久久一区二区三区四区| 97久久超碰精品国产| 日本一不卡视频| 国产精品国产成人国产三级| 欧美一区二区精品在线| 91小视频在线| 国产精品99久久久久久似苏梦涵| 一区二区三国产精华液| 国产亚洲欧美中文| 9191精品国产综合久久久久久| 成人午夜大片免费观看| 日韩vs国产vs欧美| 亚洲免费资源在线播放| 久久综合色8888| 精品视频1区2区| 粉嫩久久99精品久久久久久夜 | 欧美一区二区视频观看视频| aaa国产一区| 国产精品亚洲专一区二区三区| 亚洲成人在线观看视频| 亚洲色图视频网站| 国产亚洲欧美激情| 日韩午夜三级在线| 欧美精品xxxxbbbb| 色婷婷精品大在线视频| 高清不卡在线观看av| 国产成人免费在线观看| 亚洲伊人色欲综合网| 中文字幕在线一区二区三区| 亚洲精品一区二区三区在线观看| 欧美精品三级在线观看| 欧洲精品在线观看| 色婷婷激情一区二区三区| av一区二区三区| 国产成人精品免费| 国产主播一区二区三区| 久久99精品久久久| 乱一区二区av| 精品一区二区三区的国产在线播放| 亚洲图片有声小说| 亚洲午夜国产一区99re久久| 亚洲欧美激情在线| 一区二区三区加勒比av| 亚洲免费视频中文字幕| 中文字幕佐山爱一区二区免费| 中文字幕在线不卡视频| 国产精品国产三级国产aⅴ入口 | 久久电影网站中文字幕| 青娱乐精品视频| 免费成人性网站| 蜜桃av噜噜一区二区三区小说| 午夜久久电影网| 日韩精品一二三四| 日韩avvvv在线播放| 日本视频在线一区| 久久99国产精品尤物| 国产毛片一区二区| 风流少妇一区二区| 99热99精品| 在线一区二区视频| 欧美一三区三区四区免费在线看| 91精品国产欧美一区二区18| 日韩你懂的在线播放| 久久久蜜桃精品| 国产精品久久久久久久久免费相片| 亚洲日韩欧美一区二区在线| 亚洲一区二区黄色| 久久国产乱子精品免费女| 狠狠色丁香久久婷婷综合丁香| 国产精品白丝jk白祙喷水网站| av成人老司机| 欧美精品久久99久久在免费线 | 国产精品日产欧美久久久久| 亚洲色图欧美在线| 日韩成人午夜电影| 国产超碰在线一区| 色噜噜夜夜夜综合网| 欧美肥大bbwbbw高潮| 精品sm在线观看| 亚洲视频综合在线| 麻豆久久一区二区| www.亚洲免费av| 欧美日韩一区精品| 国产亚洲欧美一区在线观看| 一区二区免费看| 北岛玲一区二区三区四区| 99精品视频中文字幕| 欧美一二三在线| 国产精品久久久久四虎| 日韩激情视频在线观看| 成人午夜碰碰视频| 538prom精品视频线放| 国产日韩欧美高清| 日韩激情一二三区| 91在线观看视频| 日韩精品一区二区三区视频| 亚洲精品乱码久久久久久久久 | 色综合天天综合网天天狠天天| 884aa四虎影成人精品一区| 日本一区二区久久| 免费观看在线综合| 91国偷自产一区二区三区成为亚洲经典| 日韩三级在线免费观看| 亚洲欧美电影院| 国产老妇另类xxxxx| 欧美日韩久久久| 国产精品无码永久免费888| 欧美aaaaaa午夜精品| 色老综合老女人久久久| 欧美激情艳妇裸体舞| 蜜臀av性久久久久av蜜臀妖精| 色噜噜狠狠成人网p站| 日本一区二区久久| 国产一区二区精品久久91| 69堂亚洲精品首页| 亚洲电影你懂得| 99精品视频一区二区三区| 久久亚洲精品国产精品紫薇 | 久久国产免费看| 91超碰这里只有精品国产| 一区二区三区精品视频| 99久久精品免费看国产 | 精品国产乱码久久久久久夜甘婷婷| 亚洲午夜视频在线| 91小视频在线观看| 中文字幕亚洲精品在线观看| 成人一区二区三区中文字幕| 久久综合色一综合色88| 久久91精品国产91久久小草 | 国产一区二区不卡在线| 日韩三级视频中文字幕| 免费人成在线不卡| 日韩亚洲欧美成人一区| 日韩电影免费一区| 欧美丰满少妇xxxxx高潮对白| 亚洲国产精品一区二区久久 | 91欧美激情一区二区三区成人| 国产欧美日韩激情| 成人黄色av电影| 亚洲欧洲日韩一区二区三区| 97久久精品人人澡人人爽| 亚洲欧美一区二区三区极速播放 | 国产综合一区二区| 久久天天做天天爱综合色| 国产福利一区二区| 欧美高清在线视频| 色综合天天在线| 一区二区三区四区精品在线视频| 色狠狠综合天天综合综合| 亚洲精品免费在线| 5858s免费视频成人| 久久99久久久久| 国产拍揄自揄精品视频麻豆| 99久久精品免费精品国产| 亚洲综合成人在线| 欧美日本国产视频| 韩国成人精品a∨在线观看| 2014亚洲片线观看视频免费| 成人毛片在线观看| 一区二区三区在线视频免费| 在线电影一区二区三区| 久久精品国产77777蜜臀| 久久久三级国产网站| 成人国产亚洲欧美成人综合网| 一区二区三区日韩| 日韩一区二区不卡| 成人av在线影院| 亚洲第一精品在线| 久久久久久亚洲综合影院红桃 | 欧洲激情一区二区| 美女一区二区视频|