Advertisement
C0BRA

From this

Apr 24th, 2012
96
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 2.17 KB | None | 0 0
  1. bool CConfigor::LoadFromString(char* Input, unsigned long Length)
  2. {
  3.     m_pCurrentParseChar = (unsigned char*)Input;
  4.     m_CurrentParseLine = 1;
  5.  
  6.     IConfigorNode* pCurrentNode = GetRootNode();
  7.     IConfigorNode* pNewNode = 0;
  8.  
  9.     string Name;
  10.    
  11.     char* pData = 0;
  12.     unsigned long lLength = 0;
  13.  
  14.     int QuoteMode = 0;
  15.  
  16.     //for(unsigned long i = 0; i < Length; i++)
  17.     do
  18.     {
  19.         char x = *m_pCurrentParseChar;
  20.         m_pCurrentParseChar++;
  21.  
  22.         switch(x)
  23.         {
  24.         case '"': // Start of quote
  25.             {
  26.                 char* Quote = 0;
  27.                 unsigned long len = 0;
  28.  
  29.                 string pq = ParseQuotes(&Quote, &len, Length + Input);
  30.                 if(pq.length() > 1)
  31.                 {
  32.                     m_Error = pq;
  33.                     return false;
  34.                 }
  35.  
  36.                 //i += len;
  37.                 QuoteMode++;
  38.  
  39.                 if(QuoteMode == 1) // It's the name
  40.                 {
  41.                     Name = string(Quote, len);
  42.                     delete [] Quote;
  43.                 }
  44.                 else if(QuoteMode == 2)
  45.                 {
  46.                     // Data
  47.                     pData = Quote;
  48.                     lLength = len;
  49.                     QuoteMode = 0;
  50.  
  51.                     IConfigorNode* node = new CConfigorNode(pCurrentNode, Name, (unsigned char*)pData, lLength);
  52.                     pNewNode = node;
  53.                     pData = 0;
  54.                     lLength = 0;
  55.                 }
  56.             }
  57.             break;
  58.         case '{':
  59.             {
  60.                 if(QuoteMode == 1)
  61.                 {
  62.                     IConfigorNode* node = new CConfigorNode(pCurrentNode, Name, 0, 0);
  63.                     pNewNode = node;
  64.                     QuoteMode = 0;
  65.                 }
  66.                 if(!pNewNode)
  67.                 {
  68.                     stringstream ss;
  69.                     ss << m_CurrentParseLine;
  70.                     m_Error = "Node expected to group near line " + ss.str();
  71.                     return false;
  72.                 }
  73.                 pCurrentNode = pNewNode;
  74.                 pNewNode = 0;
  75.                 pData = 0;
  76.                 lLength = 0;
  77.                 QuoteMode = 0;
  78.             }
  79.             break;
  80.         case '}':
  81.             // Pop up
  82.             if(QuoteMode == 1)
  83.             {
  84.                 IConfigorNode* node = new CConfigorNode(pCurrentNode, Name, 0, 0);
  85.                 pNewNode = 0; // Going out of that scope so pNewNode should be null
  86.                 QuoteMode = 0;
  87.             }
  88.  
  89.             pCurrentNode = pCurrentNode->GetParent();
  90.            
  91.             if(!pCurrentNode) // One too many }'s
  92.             {
  93.                 stringstream ss;
  94.                 ss << m_CurrentParseLine;
  95.                 m_Error = "EOF expected near line " + ss.str();
  96.                 return false;
  97.             }
  98.             break;
  99.         case '\n':
  100.             m_CurrentParseLine++;
  101.             break;
  102.         default:
  103.             break;
  104.         };
  105.     }while(m_pCurrentParseChar != (unsigned char*)(Length + Input));
  106.  
  107.     return true;
  108. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement