Advertisement
C0BRA

To this

Apr 24th, 2012
101
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 1.90 KB | None | 0 0
  1. bool CConfigor::LoadFromString(char* Input, unsigned long Length)
  2. {
  3.     CConfigerLexNodeList lexed = Lexify(Input, Length);
  4.  
  5.     m_CurrentParseLine = 1;
  6.  
  7.     IConfigorNode* pCurrentNode = GetRootNode();
  8.     IConfigorNode* pNewNode = 0;
  9.  
  10.     for(auto it = lexed.begin(); it != lexed.end(); it++)
  11.     {
  12.         CConfigerLexNode* node = *it;
  13.         switch(node->Type)
  14.         {
  15.         case ConfigorLexType::NewLine:
  16.             m_CurrentParseLine++;
  17.             break;
  18.         case ConfigorLexType::None:
  19.             {
  20.                 string err = *(string*)&node->Value;
  21.                 m_Error = err;
  22.                 return false;
  23.             }
  24.             break;
  25.         case ConfigorLexType::String:
  26.             {
  27.                 auto it2 = it;
  28.                 it2++;
  29.  
  30.                 char* pName = (char*)node->Value;
  31.                 unsigned long mLength = node->Length;
  32.                 unsigned char* pData = 0;
  33.                 unsigned long dLength = 0;
  34.  
  35.                 if(it2 != lexed.end() || (*it2)->Type == ConfigorLexType::String)
  36.                 {
  37.                     it++;
  38.                     pData = (unsigned char*)(*it2)->Value;
  39.                     dLength = (*it2)->Length;
  40.                 }
  41.  
  42.                 IConfigorNode* node = new CConfigorNode(pCurrentNode, string(pName, mLength), pData, dLength);
  43.                 pNewNode = node;
  44.             }
  45.             break;
  46.         case ConfigorLexType::Token:
  47.             {
  48.                 char Token = (char)node->Value;
  49.  
  50.                 switch(Token)
  51.                 {
  52.                 case '{':
  53.                     {
  54.                         if(!pNewNode) // We don't have a node to asign to!
  55.                         {
  56.                             stringstream ss;
  57.                             ss << m_CurrentParseLine;
  58.                             m_Error = "Node expected to group near line " + ss.str();
  59.                             return false;
  60.                         }
  61.                         pCurrentNode = pNewNode;
  62.                         pNewNode = 0;
  63.                     }
  64.                     break;
  65.                 case '}':
  66.                     {
  67.                         pCurrentNode = pCurrentNode->GetParent();
  68.                         if(!pCurrentNode) // One too many }'s
  69.                         {
  70.                             stringstream ss;
  71.                             ss << m_CurrentParseLine;
  72.                             m_Error = "EOF expected near line " + ss.str();
  73.                             return false;
  74.                         }
  75.                         pNewNode = 0;
  76.                     }
  77.                     break;
  78.                 default:
  79.                     m_Error = "Unexpected token " + Token;
  80.                 }
  81.             }
  82.             break;
  83.         }
  84.     }
  85.  
  86.     return true;
  87. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement