Example #1
0
 void ParseBuffer(uint_t count, Stream& source, Builder& target)
 {
   const std::size_t bufSize = source.GetBufferSize();
   Dump buf(bufSize);
   std::size_t cursor = 0;
   uint_t flag = 0x40;
   //dX_flag
   while (count)
   {
     //dX_next
     flag <<= 1;
     if ((flag & 0xff) == 0)
     {
       flag = source.ReadByte();
       flag = (flag << 1) | 1;
     }
     if ((flag & 0x100) != 0)
     {
       flag &= 0xff;
       uint_t counter = source.ReadCounter();
       std::size_t srcPtr = source.ReadBackRef();
       Require(count >= counter);
       Require(srcPtr < bufSize);
       count -= counter;
       while (counter--)
       {
         buf[cursor++] = buf[srcPtr++];
         if (cursor >= bufSize)
         {
           target.AddValues(buf);
           cursor -= bufSize;
         }
         if (srcPtr >= bufSize)
         {
           srcPtr -= bufSize;
         }
       }
     }
     else
     {
       //dX_chr
       --count;
       buf[cursor++] = source.ReadByte();
       if (cursor >= bufSize)
       {
         target.AddValues(buf);
         cursor -= bufSize;
       }
     }
   }
   if (cursor)
   {
     buf.resize(cursor);
     target.AddValues(buf);
   }
 }