Advertisement
snake5

tmd unserializer code

Apr 12th, 2018
387
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 1.49 KB | None | 0 0
  1. bool TMDTextUnserializer::Unserialize(StringView str)
  2. {
  3.     Array<size_t> indexStack;
  4.     auto FixupEntries = [this,&indexStack](int level)
  5.     {
  6.         size_t end = _entries.size();
  7.         while (indexStack.size() > size_t(level + 1))
  8.         {
  9.             _entries[indexStack.last()].off2next = end - indexStack.last();
  10.             indexStack.pop_back();
  11.         }
  12.     };
  13.  
  14.     _entries.clear();
  15.     _data = str;
  16.     str = _data;
  17.  
  18.     int prevLevel = -1;
  19.     while (str.not_empty())
  20.     {
  21.         StringView line = str.until("\n");
  22.         str.skip(line.size() + 1);
  23.  
  24.         // detect level
  25.         int level = 0;
  26.         while (line.ch() == ' ' || line.ch() == '\t')
  27.         {
  28.             line.skip(1);
  29.             level++;
  30.         }
  31.  
  32.         // whitespace only, skip line
  33.         if (line.empty())
  34.             continue;
  35.  
  36.         if (level > prevLevel + 1)
  37.         {
  38.             LOG_WARNING << "TMDTextUnserializer failed: missing entries/excessive indenting";
  39.             return false;
  40.         }
  41.         if (level == prevLevel + 1)
  42.         {
  43.             indexStack.push_back(_entries.size());
  44.         }
  45.         else
  46.         {
  47.             if (level < prevLevel)
  48.                 FixupEntries(level);
  49.             _entries[indexStack[level]].off2next = _entries.size() - indexStack[level];
  50.             indexStack[level] = _entries.size();
  51.         }
  52.         prevLevel = level;
  53.  
  54.         StringView nametype = line.until("=");
  55.         StringView value = line.part(nametype.size() + 1);
  56.         StringView name = nametype.until(":");
  57.         StringView type = nametype.part(name.size() + 1);
  58.  
  59.         name.trim(SPACE_CHARS);
  60.         type.trim(SPACE_CHARS);
  61.         value.trim(SPACE_CHARS);
  62.  
  63.         _entries.push_back({ level, 0, name, type, value });
  64.     }
  65.     FixupEntries(-1);
  66.  
  67.     return true;
  68. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement