⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 qvfield.cpp

📁 Windows上的MUD客户端程序
💻 CPP
字号:
#include <QvInput.h>
#include <QvReadError.h>
#include <QvFields.h>

// Special characters in files
#define OPEN_BRACE_CHAR		'['
#define CLOSE_BRACE_CHAR	']'
#define VALUE_SEPARATOR_CHAR	','
#define IGNORE_CHAR		'~'

QvField::~QvField()
{
	removeRoutes();
}

void
QvField::setContainer(QvNode *cont)
{
    container = cont;
    setDefault(TRUE);
}

QvBool
QvField::read(QvInput *in, const QvName &name)
{
    char c;

    setDefault(FALSE);

    if (in->read(c) && c == IGNORE_CHAR) {
	setDefault(TRUE);
	setIgnored(TRUE);
    }

    else {
	setIgnored(FALSE);

	in->putBack(c);

	if (! readValue(in)) {
	    QvReadError::post(in, "Couldn't read value for field \"%s\"",
			      name.getString());
	    return FALSE;
	}

	if (in->read(c)) {
	    if (c == IGNORE_CHAR)
		setIgnored(TRUE);
	    else
		in->putBack(c);
	}
    }

    return TRUE;
}

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

    QvField *inst = NULL;

    if (0) ;			// So "else" works in first TRY_CLASS

    TRY_CLASS("MFColor",	QvMFColor);
    TRY_CLASS("MFFloat",	QvMFFloat);
    TRY_CLASS("MFLong",		QvMFLong);
    TRY_CLASS("MFRotation",	QvMFRotation);
    TRY_CLASS("MFString",	QvMFString);
    TRY_CLASS("MFTime",		QvMFTime);
    TRY_CLASS("MFVec2f",	QvMFVec2f);
    TRY_CLASS("MFVec3f",	QvMFVec3f);
    TRY_CLASS("SFBitMask",	QvSFBitMask);
    TRY_CLASS("SFBool",		QvSFBool);
    TRY_CLASS("SFColor",	QvSFColor);
    TRY_CLASS("SFEnum",		QvSFEnum);
    TRY_CLASS("SFFloat",	QvSFFloat);
    TRY_CLASS("SFImage",	QvSFImage);
    TRY_CLASS("SFLong",		QvSFLong);
    TRY_CLASS("SFMatrix",	QvSFMatrix);
    TRY_CLASS("SFRotation",	QvSFRotation);
    TRY_CLASS("SFString",	QvSFString);
    TRY_CLASS("SFTime",		QvSFTime);
    TRY_CLASS("SFVec2f",	QvSFVec2f);
    TRY_CLASS("SFVec3f",	QvSFVec3f);
    
    return inst;

#undef TRY_CLASS
}

QvSField::QvSField()
{
}


QvSField::~QvSField()
{
}

QvMField::QvMField()
{
    maxNum = num = 0;
}

QvMField::~QvMField()
{
}

void
QvMField::makeRoom(int newNum)
{
    if (newNum != num)
	allocValues(newNum);
}

QvBool
QvMField::readValue(QvInput *in)
{
    char c;
    int	curIndex = 0;

    if (in->read(c) && c == OPEN_BRACE_CHAR) {

	if (in->read(c) && c == CLOSE_BRACE_CHAR)
	    ;				
	else {
	    in->putBack(c);

	    while (TRUE) {

		if (curIndex >= num)
		    makeRoom(curIndex + 1);

		if (! read1Value(in, curIndex++) || ! in->read(c)) {
		    QvReadError::post(in, "Couldn't read value %d of field",
				      curIndex);
		    return FALSE;
		}

		if (c == VALUE_SEPARATOR_CHAR) {
		    if (in->read(c)) {
			if (c == CLOSE_BRACE_CHAR)
			    break;
			else
			    in->putBack(c);
		    }
		}

		else if (c == CLOSE_BRACE_CHAR)
		    break;

		else {
		    QvReadError::post(in,
				      "Expected '%c' or '%c' but got "
				      "'%c' while reading value %d",
				      VALUE_SEPARATOR_CHAR,
				      CLOSE_BRACE_CHAR, c,
				      curIndex);
		    return FALSE;
		}
	    }
	}

	if (curIndex < num)
	    makeRoom(curIndex);
    }

    else {
	in->putBack(c);
	makeRoom(1);
	if (! read1Value(in, 0))
	    return FALSE;
    }

    return TRUE;
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -