Advertisement
Guest User

Untitled

a guest
Sep 22nd, 2019
337
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C 4.17 KB | None | 0 0
  1. void Padding()
  2. {
  3.   local int64 padding = FTell() % 16;
  4.   if (padding != 0)
  5.     FSkip(16 - padding);
  6. };
  7.  
  8. struct FileHeader
  9. {
  10.   int entryCount;
  11.   int stringSectionOffset;
  12.   int stringSectionSize;
  13.   int stringCount;
  14. };
  15.  
  16. FileHeader h1;
  17.  
  18. local uint64 entriesOffset = FTell();
  19. FSeek(h1.stringSectionOffset+h1.stringSectionSize);
  20. Padding();
  21.  
  22. struct TagsHeader
  23. {
  24.   int sectionSize;
  25.   int count;
  26.   int offset;
  27.   int size;
  28. };
  29.  
  30. local int tagsDataOffset = FTell();
  31. TagsHeader tagsHeader;
  32. tagsDataOffset += tagsHeader.offset;
  33.  
  34. struct TagInfo
  35. {
  36.   int tagId;
  37.   int nameOffset;
  38.  
  39.   local int pos = FTell();
  40.   FSeek(tagsDataOffset);
  41.  
  42.   string columnName;
  43.   tagsDataOffset += Strlen(columnName)+1;
  44.   FSeek(pos);
  45.  
  46. };
  47.  
  48. string TagInfo_Name(TagInfo &v)
  49. {
  50.    string result;
  51.    SPrintf( result, "TAG [%X8] %s", v.tagId, v.columnName );
  52.    return result;
  53. }
  54.  
  55. TagInfo columnRefs[tagsHeader.count]<optimize=false,name=TagInfo_Name>;
  56. Padding();
  57. char columnNames[tagsHeader.size];
  58.  
  59. FSeek(entriesOffset);
  60.  
  61. local int gCurrentTag;
  62. local int gCurrentTagIndex;
  63. local string gCurrentTagName;
  64.  
  65. string GetTagName(int tagId)
  66. {
  67.   if (gCurrentTag != tagId)
  68.   {
  69.     local int i;
  70.     for (i = gCurrentTagIndex; i < tagsHeader.count; i++)
  71.     {
  72.       if (columnRefs[i].tagId == tagId)
  73.       {
  74.          gCurrentTag = tagId;
  75.          gCurrentTagName = columnRefs[i].columnName;
  76.          gCurrentTagIndex = i;
  77.          return gCurrentTagName;
  78.       }
  79.     }
  80.  
  81.     for (i = 0; i < gCurrentTagIndex; i++)
  82.     {
  83.       if (columnRefs[i].tagId == tagId)
  84.       {
  85.          gCurrentTag = tagId;
  86.          gCurrentTagName = columnRefs[i].columnName;
  87.          gCurrentTagIndex = i;
  88.          return gCurrentTagName;
  89.       }
  90.     }
  91.  
  92.     Exit(6);
  93.   }
  94.   return gCurrentTagName;
  95. }
  96.  
  97. struct Entry
  98. {
  99.   int tagId;
  100.   ubyte fieldCount;
  101.  
  102.   if (fieldCount > 0)
  103.   {
  104.     local int maskSize = (fieldCount+3)/4;
  105.     local int paddingSize = 3-maskSize % 4;
  106.     ubyte fieldTypes[maskSize];
  107.  
  108.     if (paddingSize > 0)
  109.       ubyte padding[paddingSize];
  110.  
  111.     uint64 fields[fieldCount];
  112.   }
  113.   else
  114.   {
  115.     ubyte padding[3];
  116.   }
  117. };
  118.  
  119. ubyte GetFieldType(Entry &v, int fieldIndex)
  120. {
  121.   local ubyte b = v.fieldTypes[fieldIndex/4];
  122.   return (b >> (fieldIndex%4) * 2) & 3;
  123. }
  124.  
  125. wstring Entry_Name(Entry &v)
  126. {
  127.   wstring result;
  128.   string tmp;
  129.  
  130.   if (v.fieldCount == 0)
  131.   {
  132.     SPrintf( tmp, "[%s] NULL", GetTagName(v.tagId));
  133.     return tmp;
  134.   }
  135.  
  136.   if (v.fieldCount == 1)
  137.   {
  138.     ubyte type = GetFieldType(v, 0);
  139.     if (type == 0)
  140.     {
  141.       SPrintf( tmp, "[%s] STR: ", GetTagName(v.tagId) );
  142.       result = tmp + StringToWString(ReadLine(h1.stringSectionOffset + v.fields[0]), CHARSET_UTF8);    
  143.     }
  144.     else if (type == 1)
  145.     {
  146.       SPrintf( tmp, "[%s] INT: %d", GetTagName(v.tagId), v.fields[0] );
  147.       return tmp;
  148.     }
  149.     else if (type == 2)
  150.     {
  151.       SPrintf( tmp, "[%s] FLT: %f", GetTagName(v.tagId), v.fields[0] );
  152.       return tmp;
  153.     }
  154.     else
  155.     {
  156.        SPrintf( tmp, "[%s] LNG: %d", GetTagName(v.tagId), v.fields[0] );
  157.        return tmp;
  158.     }
  159.   }
  160.   else
  161.   {
  162.      SPrintf( tmp, "[%s] %d: (", GetTagName(v.tagId), v.fieldCount );
  163.      result = tmp;
  164.      
  165.      int i = 0;
  166.      ubyte type;
  167.      for (i = 0; i < v.fieldCount; i++)
  168.      {
  169.        if (i > 0)
  170.          result += ", ";
  171.  
  172.        type = GetFieldType(v, i);
  173.        if (type == 0)
  174.        {
  175.          tmp = ReadLine(h1.stringSectionOffset + v.fields[i]);
  176.          result += StringToWString(tmp, CHARSET_UTF8);
  177.        }
  178.        else if (type == 1)
  179.        {
  180.          SPrintf( tmp, "%d", v.fields[i] );
  181.          result += tmp;
  182.        }
  183.        else if (type == 2)
  184.        {
  185.          SPrintf( tmp, "%f", v.fields[i] );
  186.          result += tmp;
  187.        }
  188.        else
  189.        {
  190.          SPrintf( tmp, "%d", v.fields[i] );
  191.          result += tmp;
  192.        }
  193.      }
  194.      result += ")";
  195.      return result;
  196.   }
  197.  
  198.   SPrintf( tmp, "[%s] %d", GetTagName(v.tagId), v.fieldCount );
  199.   return tmp;
  200. }
  201.  
  202. Entry lines1[h1.entryCount]<optimize=false,name=Entry_Name>;
  203. Padding();
  204.  
  205. if (h1.stringSectionSize > 0)
  206. {
  207.   FSeek(h1.stringSectionOffset);
  208.   char content[h1.stringSectionSize];
  209.   Padding();
  210. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement