📄 qvfield.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 + -