bool FileLoader::parseNode(NODE node) { int32_t byte; int32_t pos; NODE currentNode = node; while(1) { //read node type if(readByte(byte)) { currentNode->type = byte; bool setPropsSize = false; while(1) { //search child and next node if(readByte(byte)) { if(byte == NODE_START) { //child node start if(safeTell(pos)) { NODE childNode = new NodeStruct(); childNode->start = pos; setPropsSize = true; currentNode->propsSize = pos - currentNode->start - 2; currentNode->child = childNode; if(!parseNode(childNode)) return false; } else return false; } else if(byte == NODE_END) { //current node end if(!setPropsSize) { if(safeTell(pos)) currentNode->propsSize = pos - currentNode->start - 2; else return false; } if(readByte(byte)) { if(byte == NODE_START) { //starts next node if(safeTell(pos)) { NODE nextNode = new NodeStruct(); nextNode->start = pos; currentNode->next = nextNode; currentNode = nextNode; break; } else return false; } else if(byte == NODE_END) { //up 1 level and move 1 position back if(safeTell(pos) && safeSeek(pos)) return true; else return false; } else { //wrong format m_lastError = ERROR_INVALID_FORMAT; return false; } } else { //end of file? return true; } } else if(byte == ESCAPE_CHAR) { if(!readByte(byte)) return false; } } else return false; } } else return false; } }
bool FileLoader::parseNode(NODE node) { int32_t byte, pos; NODE currentNode = node; while (readByte(byte)) { currentNode->type = byte; bool setPropsSize = false; while (true) { if (!readByte(byte)) { return false; } bool skipNode = false; switch (byte) { case NODE_START: { //child node start if (!safeTell(pos)) { return false; } NODE childNode = new NodeStruct(); childNode->start = pos; currentNode->propsSize = pos - currentNode->start - 2; currentNode->child = childNode; setPropsSize = true; if (!parseNode(childNode)) { return false; } break; } case NODE_END: { //current node end if (!setPropsSize) { if (!safeTell(pos)) { return false; } currentNode->propsSize = pos - currentNode->start - 2; } if (!readByte(byte)) { return true; } switch (byte) { case NODE_START: { //starts next node if (!safeTell(pos)) { return false; } skipNode = true; NODE nextNode = new NodeStruct(); nextNode->start = pos; currentNode->next = nextNode; currentNode = nextNode; break; } case NODE_END: return safeTell(pos) && safeSeek(pos); default: m_lastError = ERROR_INVALID_FORMAT; return false; } break; } case ESCAPE_CHAR: { if (!readByte(byte)) { return false; } break; } default: break; } if (skipNode) { break; } } } return false; }