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; }
// // 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)); } }