Пример #1
0
	CVMTGroupNode *Parse() {
		CToken *Token;
		CVMTGroupNode *Group = 0;

		// Consume all newlines.
		Token = this->Tokenizer->Next();
		while (Token->GetToken() == TOKEN_NEWLINE) {
			Token = this->Tokenizer->Next();
		}

		if (Token->GetToken() == TOKEN_STRING || Token->GetToken() == TOKEN_QUOTED_STRING) {
			Group = new CVMTGroupNode(Token->GetString());
		} else {
			throw "expected shader name";
		}
		// We *may* have a group, parse it.
		this->Parse(Group);

		if (uiVMTParseMode == PARSE_MODE_LOOSE) {
			while (vlTrue) {
				// Consume all newlines.
				while (this->Tokenizer->Peek()->GetToken() == TOKEN_NEWLINE) {
					Token = this->Tokenizer->Next();
				}

				CToken *Peek = this->Tokenizer->Peek();

				if (Peek->GetToken() == TOKEN_EOF) {
					break;
				} else if (Peek->GetToken() == TOKEN_OPEN_BRACE) {
					CVMTGroupNode *NextGroup = 0;
					try{
						NextGroup = new CVMTGroupNode("");
						this->Parse(NextGroup);
					}catch (char *cErrorMessage) {
						delete NextGroup;
						throw cErrorMessage;
					}
					for (vlUInt i = 0; i < NextGroup->GetNodeCount(); i++) {
						Group->AddNode(NextGroup->GetNode(i)->Clone());
					}
					delete NextGroup;
				} else {
					throw "expected end of file";
				}
			}
		} else {
			// Consume all newlines.
			Token = this->Tokenizer->Next();
			while (Token->GetToken() == TOKEN_NEWLINE) {
				Token = this->Tokenizer->Next();
			}

			if (Token->GetToken() != TOKEN_EOF) {
				throw "expected end of file";
			}
		}
		return Group;
	}
Пример #2
0
//
// Save()
// Saves a node to a file.
//
vlVoid CVMTFile::Save(IO::Writers::IWriter *Writer, CVMTNode *Node, vlUInt uiLevel) const
{
	vlChar cBuffer[2048];

	if(Node->GetType() == NODE_TYPE_GROUP)
	{
		CVMTGroupNode *Group = static_cast<CVMTGroupNode *>(Node);

		this->Indent(Writer, uiLevel);
		sprintf(cBuffer, "\"%s\"\r\n", Group->GetName());
		Writer->Write(cBuffer, (vlUInt)strlen(cBuffer));

		this->Indent(Writer, uiLevel);
		sprintf(cBuffer, "{\r\n");
		Writer->Write(cBuffer, (vlUInt)strlen(cBuffer));

		for(vlUInt i = 0; i < Group->GetNodeCount(); i++)
		{
			this->Save(Writer, Group->GetNode(i), uiLevel + 1);
		}

		this->Indent(Writer, uiLevel);
		sprintf(cBuffer, "}\r\n");
		Writer->Write(cBuffer, (vlUInt)strlen(cBuffer));
	}
	else if(Node->GetType() == NODE_TYPE_STRING)
	{
		CVMTStringNode *String = static_cast<CVMTStringNode *>(Node);

		this->Indent(Writer, uiLevel);
		sprintf(cBuffer, "\"%s\" \"%s\"\r\n", String->GetName(), String->GetValue());
		Writer->Write(cBuffer, (vlUInt)strlen(cBuffer));
	}
	else if(Node->GetType() == NODE_TYPE_INTEGER)
	{
		CVMTIntegerNode *Integer = static_cast<CVMTIntegerNode *>(Node);

		this->Indent(Writer, uiLevel);
		sprintf(cBuffer, "\"%s\" %d\r\n", Integer->GetName(), Integer->GetValue());
		Writer->Write(cBuffer, (vlUInt)strlen(cBuffer));
	}
	else if(Node->GetType() == NODE_TYPE_SINGLE)
	{
		CVMTSingleNode *Single = static_cast<CVMTSingleNode *>(Node);

		this->Indent(Writer, uiLevel);
		sprintf(cBuffer, "\"%s\" %f\r\n", Single->GetName(), Single->GetValue());
		Writer->Write(cBuffer, (vlUInt)strlen(cBuffer));
	}
}