diff options
Diffstat (limited to 'tool_src/QvLib/QvSFBitMask.cpp')
| -rw-r--r-- | tool_src/QvLib/QvSFBitMask.cpp | 84 |
1 files changed, 84 insertions, 0 deletions
diff --git a/tool_src/QvLib/QvSFBitMask.cpp b/tool_src/QvLib/QvSFBitMask.cpp new file mode 100644 index 0000000..d4c89df --- /dev/null +++ b/tool_src/QvLib/QvSFBitMask.cpp @@ -0,0 +1,84 @@ +#include <QvDebugError.h> +#include <QvReadError.h> +#include <QvSFBitMask.h> + +// Special characters when reading or writing value in ASCII +#define OPEN_PAREN '(' +#define CLOSE_PAREN ')' +#define BITWISE_OR '|' + +QV_SFIELD_SOURCE(QvSFBitMask); + +QvBool +QvSFBitMask::readValue(QvInput *in) +{ + char c; + QvName n; + int v; + +#ifdef DEBUG + if (enumValues == NULL) { + QvDebugError::post("QvSFBitMask::readValue", + "Enum values were never initialized"); + QvReadError::post(in, "Couldn't read QvSFBitMask values"); + return FALSE; + } +#endif /* DEBUG */ + + value = 0; + + // Read first character + if (! in->read(c)) + return FALSE; + + // Check for parenthesized list of bitwise-or'ed flags + if (c == OPEN_PAREN) { + + // Read names separated by BITWISE_OR + while (TRUE) { + if (in->read(n, TRUE) && ! (! n) ) { + + if (findEnumValue(n, v)) + value |= v; + + else { + QvReadError::post(in, "Unknown QvSFBitMask bit " + "mask value \"%s\"", n.getString()); + return FALSE; + } + } + + if (! in->read(c)) { + QvReadError::post(in, "EOF reached before '%c' " + "in QvSFBitMask value", CLOSE_PAREN); + return FALSE; + } + + if (c == CLOSE_PAREN) + break; + + else if (c != BITWISE_OR) { + QvReadError::post(in, "Expected '%c' or '%c', got '%c' ", + "in QvSFBitMask value", + BITWISE_OR, CLOSE_PAREN, c); + return FALSE; + } + } + } + + else { + in->putBack(c); + + // Read mnemonic value as a character string identifier + if (! in->read(n, TRUE)) + return FALSE; + + if (! findEnumValue(n, value)) { + QvReadError::post(in, "Unknown QvSFBitMask bit " + "mask value \"%s\"", n.getString()); + return FALSE; + } + } + + return TRUE; +} |
