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

? 歡迎來到蟲蟲下載站! | ?? 資源下載 ?? 資源專輯 ?? 關于我們
? 蟲蟲下載站

?? qvnode.cpp

?? Windows上的MUD客戶端程序
?? CPP
字號:
#include <ctype.h>
#include <QvDB.h>
#include <QvInput.h>
#include <QvDebugError.h>
#include <QvReadError.h>
#include <QvField.h>
#include <QvFieldData.h>
#include <QvNodes.h>
#include <QvUnknownNode.h>

// The global name dictionary
QvDict		*QvNode::nameDict = NULL;

// Syntax for writing instances to files
#define OPEN_BRACE		'{'
#define CLOSE_BRACE		'}'
#define DEFINITION_KEYWORD	"DEF"
#define REFERENCE_KEYWORD	"USE"
#define NULL_KEYWORD		"NULL"
#define ROUTE_NAME			"ROUTE"

void
QvNode::init()
{
    if (nameDict == NULL)
	nameDict = new QvDict;
}

// Added by jwd chaco in quest of plugging leaks
void
QvNode::term()
{
	delete nameDict;
	nameDict = NULL;
}

QvNode::QvNode() : m_iUsage(1), m_pRenderData(0) 
{
    objName = new QvName("");
}

QvNode::~QvNode()
{
    if (! !(*objName))
	removeName(this, objName->getString());
    delete objName;
	delete m_pRenderData;
	m_pRenderData = 0;
}

const QvName &
QvNode::getName() const
{
    return *objName;
}

void
QvNode::setName(const QvName &newName)
{
    if (! !(*objName)) {
	removeName(this, objName->getString());
    }
    delete objName;

    const char *str = newName.getString();
    QvBool isBad = 0;

    if (newName.getLength() > 0 &&
	!QvName::isNodeNameStartChar(str[0])) isBad = TRUE;

    int i;
    for (i = 1; i < newName.getLength() && !isBad; i++) {
	isBad = !QvName::isNodeNameChar(str[i]);
    }

    if (isBad) {
	QvString goodString;

	if (!QvName::isNodeNameStartChar(str[0])) {
	    goodString += "_";
	}
	for (i = 0; i < newName.getLength(); i++) {
	    char temp[2];
	    temp[0] = str[i]; temp[1] = '\0';
	    if (!QvName::isNodeNameChar(str[i]))
		goodString += "_";
	    else
		goodString += temp;
	}
#ifdef DEBUG
	QvDebugError::post("QvNode::setName", "Bad characters in"
			   " name '%s'.  Replacing with name '%s'",
			   str, goodString.getString());
#endif       
	objName = new QvName(goodString);
    }
    else {
	objName = new QvName(newName);
    }
    if (! !(*objName)) {
	addName(this, objName->getString());
    }
}

void
QvNode::addName(QvNode *b, const char *name)
{
    QvPList *list;
    void *t;
    if (!nameDict->find((u_long)name, t)) {
	list = new QvPList;
	nameDict->enter((u_long)name, list, TRUE);
    }
    else {
	list = (QvPList *)t;
    }

    list->append(b);
}

void
QvNode::removeName(QvNode *b, const char *name)
{
    QvPList	*list;
    QvBool	found;
    void	*t;
    int		i;

    found = nameDict->find((u_long) name, t);

    if (found) {
	list = (QvPList *) t;
	i    = list->find(b);

	if (i < 0)
	    found = FALSE;

	else
	    list->remove(i);
    }

    if (! found)
	QvDebugError::post("QvNode::removeName",
			   "Name \"%s\" (node %x) is not in dictionary",
			   name, b);
}

QvBool
QvNode::read(QvInput *in, QvNode *&node)
{
    QvBool	ret;
    QvName	name;

    if (! in->read(name, TRUE)) {
	node = NULL;
	ret = in->headerOk;
    }

    else if (! name || name == NULL_KEYWORD) {
	node = NULL;
	ret = TRUE;
    }

    else if (name == REFERENCE_KEYWORD) {
	node = readReference(in);
	ret = (node != NULL);
    }

    else
	ret = readNode(in, name, node);

    return ret;
}

QvBool
QvNode::readInstance(QvInput *in)
{
    QvName	typeString;
    QvFieldData	*fieldData = getFieldData();

    if (in->read(typeString, TRUE)) {
	if (typeString == "fields") {
	    if (! fieldData->readFieldTypes(in, this)) {
		QvReadError::post(in, "Bad field specifications for node");
		return FALSE;
	    }
	}
	else
	    in->putBack(typeString.getString());
    }

    if (! fieldData->read(in, this))
        return FALSE;

    return TRUE;
}

QvNode *
QvNode::readReference(QvInput *in)
{
    QvName	refName;
    QvNode	*node;

    if (! in->read(refName, FALSE)) {
	QvReadError::post(in, "Premature end of file after "
			  REFERENCE_KEYWORD);
	node = NULL;
    }

    else if ((node = in->findReference(refName)) == NULL)
	QvReadError::post(in, "Unknown reference \"%s\"",
			  refName.getString());
	if (node) node->Use();	// jwd to add usage count
    return node;
}

QvBool
QvNode::readNode(QvInput *in, QvName &className, QvNode *&node)
{
    QvBool	gotChar;
    QvName	refName;
    char	c;
    QvBool	ret = TRUE, flush = FALSE;

    node = NULL;

    if (className == DEFINITION_KEYWORD) {
		if (! in->read(refName, FALSE) || ! in->read(className, TRUE)) {
		    QvReadError::post(in, "Premature end of file after "
				      DEFINITION_KEYWORD);
		    ret = FALSE;
		}

		if (! refName) {
		    QvReadError::post(in, "No name given after ", DEFINITION_KEYWORD);
		    ret = FALSE;
		}

		if (! className) {
		    QvReadError::post(in, "Invalid definition of %s",
				      refName.getString());
		    ret = FALSE;
		}
    }

    if (ret) {
		if(className == ROUTE_NAME)
		{
			ret = QvRoute::readRoute(in, node);
		}
		else
		{

			if (! (gotChar = in->read(c)) || c != OPEN_BRACE) {
			    if (gotChar)
				QvReadError::post(in, "Expected '%c'; got '%c'",
						  OPEN_BRACE, c);
			    else
				QvReadError::post(in, "Expected '%c'; got EOF", OPEN_BRACE);
			    ret = FALSE;
			}

			else {
			    ret = readNodeInstance(in, className, refName, node);

			    if (! ret)
				flush = TRUE;

			    else if (! (gotChar = in->read(c)) || c != CLOSE_BRACE) {
				if (gotChar)
				    QvReadError::post(in, "Expected '%c'; got '%c'",
						      CLOSE_BRACE, c);
				else
				    QvReadError::post(in, "Expected '%c'; got EOF",
						      CLOSE_BRACE);
				ret = FALSE;
			    }
			}
		}
    }

    if (! ret && flush)
	flushInput(in);

    return ret;
}

QvBool
QvNode::readNodeInstance(QvInput *in, const QvName &className,
			 const QvName &refName, QvNode *&node)
{
    node = createInstance(in, className);
    if (node == NULL)
	return FALSE;

    if (! (! refName))
	in->addReference(refName, node);

    return node->readInstance(in);
}

QvNode *
QvNode::createInstance(QvInput *in, const QvName &className)
{
    QvNode		*instance;
    QvString            unknownString;

    instance = createInstanceFromName(className);

    if (instance == NULL) {

		// Changed to allow empty unknown nodes - jwd for Chaco
		if (! in->read(unknownString) )
		{  
		    QvReadError::post(in, "Unknown class \"%s\". Parsing failed.",
				      className.getString());
	    	return NULL;
		}
		else if (unknownString != "fields" && unknownString != "}") 
		{
									// Try to recover, skip to matching brace

			if(skipToBrace(in))
			{
				#if 0
		    	QvReadError::postWarning(in, "Unknown class \"%s\". Node ignored.",
				      className.getString());
				#endif
				// Recovered!
			    QvUnknownNode *tmpNode = new QvUnknownNode;
			    tmpNode->setClassName(className.getString());
			    instance = tmpNode;
			}
			else
			{
		    	QvReadError::post(in, "Unknown class \"%s\". Parsing failed.",
				      className.getString());
		    	return NULL;
			}
		}

		else if (unknownString == "fields")
		{
			// Rather than trying to read it, just skip it and be done
			// with it - this prevents leaks of fieldNames - jwd 5/13/96
			if(skipToBrace(in))
			{
			    QvUnknownNode *tmpNode = new QvUnknownNode;
			    tmpNode->setClassName(className.getString());
			    instance = tmpNode;
			}
			else
			{
		    	QvReadError::post(in, "Unknown class \"%s\". Parsing failed.",
				      className.getString());
		    	return NULL;
			}
		}
		else if ( unknownString == "}")
		{
		    QvUnknownNode *tmpNode = new QvUnknownNode;
		    tmpNode->setClassName(className.getString());
		    instance = tmpNode;
		    in->putBack(unknownString.getString());
		}
    }

    return instance;
}

QvNode *
QvNode::createInstanceFromName(const QvName &className)
{
#define TRY_CLASS(name, class)						      \
    else if (className == name)						      \
	inst = new class

    QvNode *inst = NULL;

    if (0) ;			// So "else" works in first TRY_CLASS
    TRY_CLASS("AsciiText",			QvAsciiText);
    TRY_CLASS("Background",			QvBackground);
    TRY_CLASS("BaseColor",			QvBaseColor);
    TRY_CLASS("Cone",			QvCone);
    TRY_CLASS("Coordinate3",		QvCoordinate3);
    TRY_CLASS("Cube",			QvCube);
    TRY_CLASS("Cylinder",		QvCylinder);
    TRY_CLASS("DirectionalLight",	QvDirectionalLight);
    TRY_CLASS("FontStyle",	QvFontStyle);
    TRY_CLASS("Group",			QvGroup);
    TRY_CLASS("IndexedFaceSet",		QvIndexedFaceSet);
    TRY_CLASS("IndexedLineSet",		QvIndexedLineSet);
    TRY_CLASS("Info",			QvInfo);
    TRY_CLASS("LOD",		QvLOD);
    TRY_CLASS("Material",		QvMaterial);
    TRY_CLASS("MaterialBinding",	QvMaterialBinding);
    TRY_CLASS("MatrixTransform",	QvMatrixTransform);
    TRY_CLASS("Normal",			QvNormal);
    TRY_CLASS("NormalBinding",		QvNormalBinding);
    TRY_CLASS("OrthographicCamera",	QvOrthographicCamera);
    TRY_CLASS("PerspectiveCamera",	QvPerspectiveCamera);
    TRY_CLASS("PointLight",		QvPointLight);
    TRY_CLASS("PointSet",		QvPointSet);
    TRY_CLASS("Rotation",		QvRotation);
    TRY_CLASS("Scale",			QvScale);
    TRY_CLASS("Separator",		QvSeparator);
    TRY_CLASS("ShapeHints",		QvShapeHints);
    TRY_CLASS("Sphere",			QvSphere);
    TRY_CLASS("Spin",			QvSpin);
    TRY_CLASS("SpinGroup",			QvSpinGroup);
    TRY_CLASS("SpotLight",		QvSpotLight);
    TRY_CLASS("Switch",			QvSwitch);
    TRY_CLASS("Texture2",		QvTexture2);
    TRY_CLASS("Texture2Transform",	QvTexture2Transform);
    TRY_CLASS("TextureCoordinate2",	QvTextureCoordinate2);
    TRY_CLASS("Transform",		QvTransform);
    TRY_CLASS("TransformSeparator",	QvTransformSeparator);
    TRY_CLASS("Translation",		QvTranslation);
    TRY_CLASS("WWWAnchor",		QvWWWAnchor);
    TRY_CLASS("WWWInline",		QvWWWInline);
    
    TRY_CLASS("TimeSensor",		QvTimeSensor);
    TRY_CLASS("OrientationInterpolator",		QvOrientationInterpolator);
    TRY_CLASS("PositionInterpolator",		QvPositionInterpolator);
    TRY_CLASS("NavigationInfo",			QvNavigationInfo);
    
    return inst;

#undef TRY_CLASS
}

void
QvNode::flushInput(QvInput *in)
{
    int		nestLevel = 1;
    char	c;

    while (nestLevel > 0 && in->get(c)) {

	if (c == CLOSE_BRACE)
	    nestLevel--;

	else if (c == OPEN_BRACE)
	    nestLevel++;
    }
}

// Added by jwd to skip bad node defns
QvBool
QvNode::skipToBrace(QvInput *in)
{
    QvString            unknownString;
	int count = 1;


	while (count > 0 && in->read(unknownString) )
	{
		if (unknownString == "}")  count --;
		if (unknownString == "{")  count ++;
	}
	if(count > 0) return FALSE;

    in->putBack(unknownString.getString());
    return TRUE;
}


#undef OPEN_BRACE
#undef CLOSE_BRACE
#undef DEFINITION_KEYWORD
#undef REFERENCE_KEYWORD
#undef NULL_KEYWORD
#undef ROUTE_NAME

?? 快捷鍵說明

復制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
日韩在线一区二区| 国产激情一区二区三区| 国产日韩欧美麻豆| 欧洲一区在线电影| 国产九色sp调教91| 亚洲第一福利视频在线| 国产精品卡一卡二| 欧美一级二级三级乱码| 91麻豆免费看片| 国产精品99久久久久久久vr | 精品无人码麻豆乱码1区2区| 日本一二三不卡| 日韩女优av电影在线观看| 欧美综合一区二区| 成人黄色av网站在线| 九色综合狠狠综合久久| 亚洲国产aⅴ天堂久久| 日本一区二区久久| 久久久av毛片精品| 精品少妇一区二区三区视频免付费 | 色综合天天做天天爱| 国产精品夜夜嗨| 蜜桃视频一区二区三区| 亚洲一区二区三区四区五区中文 | 五月天激情综合| 一区二区在线电影| 国产精品美女久久久久久| 精品成人在线观看| 91麻豆精品国产91久久久使用方法| 99在线精品一区二区三区| 国产成人免费视频精品含羞草妖精 | 国产一区二区导航在线播放| 亚洲国产日韩精品| 亚洲综合激情另类小说区| 亚洲美女屁股眼交3| 中文字幕制服丝袜成人av| 国产精品欧美精品| 国产精品美女久久久久久久久| 国产女同互慰高潮91漫画| 国产亚洲精久久久久久| 久久精品综合网| 国产欧美日韩三区| 国产精品乱人伦| 国产精品黄色在线观看| 亚洲人成在线播放网站岛国| 亚洲日本va午夜在线影院| 亚洲另类春色校园小说| 亚洲精选视频在线| 亚洲一区二三区| 午夜精品一区二区三区免费视频| 一区二区国产视频| 午夜av一区二区三区| 久久精品久久精品| 国产亚洲午夜高清国产拍精品| 2014亚洲片线观看视频免费| 国产性色一区二区| 国产精品久久久久久久久快鸭| 中文字幕在线观看不卡| 一区二区三区四区高清精品免费观看| 一区二区视频在线看| 日韩精品电影在线| 国产麻豆午夜三级精品| 成人国产免费视频| 色噜噜狠狠色综合欧洲selulu| 在线中文字幕一区二区| 欧美福利视频导航| 26uuu国产电影一区二区| 国产欧美日韩在线看| 亚洲免费色视频| 日韩二区三区四区| 国产精品18久久久久| 色综合一个色综合亚洲| 91精品国产91久久久久久最新毛片| 欧美大片在线观看| 中文字幕一区二区三区在线观看| 一区二区三区资源| 久久国产日韩欧美精品| 成人爽a毛片一区二区免费| 色乱码一区二区三区88| 欧美xxxxx牲另类人与| 国产精品乱人伦| 日韩精品五月天| 国产成人亚洲综合a∨猫咪| 色88888久久久久久影院按摩| 91精品国产综合久久久久久久久久| 久久久一区二区| 夜夜爽夜夜爽精品视频| 精品亚洲porn| 91福利精品第一导航| 久久久久国产精品麻豆| 亚洲一区二区欧美激情| 国产成人久久精品77777最新版本| 色综合久久66| 国产亚洲一区二区三区四区| 亚洲成人动漫精品| caoporen国产精品视频| 日韩午夜三级在线| 一区二区三国产精华液| 国产精品亚洲午夜一区二区三区| 91福利国产成人精品照片| 国产午夜一区二区三区| 日本大胆欧美人术艺术动态| www.日韩在线| 日韩一级在线观看| 一区二区三区四区在线| 成人免费观看视频| 精品噜噜噜噜久久久久久久久试看 | 久久综合九色综合久久久精品综合| 亚洲另类在线一区| 成人激情免费电影网址| 欧美成人aa大片| 亚洲r级在线视频| 一本到不卡免费一区二区| 国产日韩欧美麻豆| 精品亚洲国产成人av制服丝袜| 欧美女孩性生活视频| 国产精品美女久久久久久2018| 激情久久五月天| 91精品在线麻豆| 亚洲超碰97人人做人人爱| 色又黄又爽网站www久久| 国产精品白丝在线| 成人听书哪个软件好| 久久久国产精华| 久草在线在线精品观看| 日韩一区二区三| 日本亚洲一区二区| 69堂亚洲精品首页| 亚洲第一搞黄网站| 欧美精品日韩综合在线| 亚洲www啪成人一区二区麻豆| 在线观看日韩一区| 一区二区三区**美女毛片| 色综合天天综合色综合av| 亚洲欧美日本韩国| 91国在线观看| 亚洲成人免费视| 欧美伊人精品成人久久综合97| 一区二区三区丝袜| 欧美在线观看一区| 日韩中文字幕不卡| 91精品国产欧美日韩| 久久精品国产一区二区三区免费看 | 91丨九色丨国产丨porny| 国产精品久久久久精k8 | 日韩视频中午一区| 久久成人免费网| 欧美精品一区二区三区四区| 久久99国产精品免费| 久久美女艺术照精彩视频福利播放| 国产一区二区不卡| 中文字幕不卡在线| 色婷婷综合久久久| 亚洲va国产天堂va久久en| 欧美一区二区日韩| 国内精品久久久久影院色| 欧美激情在线一区二区| 一本大道综合伊人精品热热| 亚洲成国产人片在线观看| 日韩一区二区视频| 国产成人免费在线| 有码一区二区三区| 日韩一二三区视频| 国产精品99久久久| 亚洲精品高清在线| 日韩三级在线免费观看| 国产激情精品久久久第一区二区| 亚洲婷婷综合色高清在线| 欧美日韩在线观看一区二区| 三级欧美韩日大片在线看| 久久噜噜亚洲综合| 91极品视觉盛宴| 黑人巨大精品欧美一区| 亚洲欧洲av色图| 555www色欧美视频| 国产99久久久精品| 亚洲国产精品久久人人爱蜜臀 | 精品久久久久久久久久久久久久久久久 | 欧美国产综合一区二区| 色婷婷久久久综合中文字幕| 蜜桃av一区二区三区| 国产精品久久三区| 欧美一区二区女人| 99国产一区二区三精品乱码| 蜜臀av亚洲一区中文字幕| 国产精品久久久久婷婷| 在线播放国产精品二区一二区四区 | 欧美日韩视频一区二区| 国产乱码精品1区2区3区| 亚洲午夜久久久久中文字幕久| 精品国精品自拍自在线| 色哟哟日韩精品| 国产精品一区二区三区99| 亚洲成人免费电影| 中文字幕一区av| 欧美大肚乱孕交hd孕妇| 在线观看欧美黄色| 成人午夜电影小说| 久久国产精品99精品国产| 亚洲国产一区二区a毛片|