コード例 #1
0
ファイル: fileloader.cpp プロジェクト: tryller/otserv
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;
	}
}
コード例 #2
0
ファイル: fileloader.cpp プロジェクト: Fir3element/tfs12
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;
}