diff options
| author | Felix Morgner <felix.morgner@gmail.com> | 2026-08-24 11:16:07 +0200 |
|---|---|---|
| committer | Felix Morgner <felix.morgner@gmail.com> | 2026-08-24 11:16:07 +0200 |
| commit | c068f22329d5cc722622a2183bbb22eef2093df7 (patch) | |
| tree | 12d56c1aede67988a55e241364606bfbb4dba933 /tool_src/QvLib/QvField.cpp | |
| download | openparsec-c068f22329d5cc722622a2183bbb22eef2093df7.tar.xz openparsec-c068f22329d5cc722622a2183bbb22eef2093df7.zip | |
Diffstat (limited to 'tool_src/QvLib/QvField.cpp')
| -rw-r--r-- | tool_src/QvLib/QvField.cpp | 175 |
1 files changed, 175 insertions, 0 deletions
diff --git a/tool_src/QvLib/QvField.cpp b/tool_src/QvLib/QvField.cpp new file mode 100644 index 0000000..e682dda --- /dev/null +++ b/tool_src/QvLib/QvField.cpp @@ -0,0 +1,175 @@ +#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() +{ +} + +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("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("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; +} |
