//static
void TBNodeRefTree::ResolveConditions(TBNode *parent_node)
{
	bool condition_ret = false;
	TBNode *node = parent_node->GetFirstChild();
	while (node)
	{
		bool delete_node = false;
		bool move_children = false;
		if (strcmp(node->GetName(), "@if") == 0)
		{
			condition_ret = node->GetValueFollowRef().GetInt() ? true : false;
			if (condition_ret)
				move_children = true;
			delete_node = true;
		}
		else if (strcmp(node->GetName(), "@else") == 0)
		{
			condition_ret = !condition_ret;
			if (condition_ret)
				move_children = true;
			delete_node = true;
		}

		// Make sure we'll skip any nodes added from a conditional branch.
		TBNode *node_next = node->GetNext();

		if (move_children)
		{
			// Resolve the branch first, since we'll skip it.
			ResolveConditions(node);
			while (TBNode *content = node->GetLastChild())
			{
				node->Remove(content);
				parent_node->AddAfter(content, node);
			}
		}

		if (delete_node)
			parent_node->Delete(node);
		else
			ResolveConditions(node);
		node = node_next;
	}
}
Exemplo n.º 2
0
	void IncludeFile(int line_nr, const char *filename)
	{
		// Read the included file into a new TBNode and then
		// move all the children to m_target_node.
		TBTempBuffer include_filename;
		include_filename.AppendPath(m_filename);
		include_filename.AppendString(filename);
		TBNode content;
		if (content.ReadFile(include_filename.GetData()))
		{
			while (TBNode *content_n = content.GetFirstChild())
			{
				content.Remove(content_n);
				m_target_node->Add(content_n);
			}
		}
		else
		{
			TBStr err;
			err.SetFormatted("Referenced file \"%s\" was not found!", include_filename.GetData());
			OnError(line_nr, err);
		}
	}