Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- void Padding()
- {
- local int64 padding = FTell() % 16;
- if (padding != 0)
- FSkip(16 - padding);
- };
- struct FileHeader
- {
- int entryCount;
- int stringSectionOffset;
- int stringSectionSize;
- int stringCount;
- };
- FileHeader h1;
- local uint64 entriesOffset = FTell();
- FSeek(h1.stringSectionOffset+h1.stringSectionSize);
- Padding();
- struct TagsHeader
- {
- int sectionSize;
- int count;
- int offset;
- int size;
- };
- local int tagsDataOffset = FTell();
- TagsHeader tagsHeader;
- tagsDataOffset += tagsHeader.offset;
- struct TagInfo
- {
- int tagId;
- int nameOffset;
- local int pos = FTell();
- FSeek(tagsDataOffset);
- string columnName;
- tagsDataOffset += Strlen(columnName)+1;
- FSeek(pos);
- };
- string TagInfo_Name(TagInfo &v)
- {
- string result;
- SPrintf( result, "TAG [%X8] %s", v.tagId, v.columnName );
- return result;
- }
- TagInfo columnRefs[tagsHeader.count]<optimize=false,name=TagInfo_Name>;
- Padding();
- char columnNames[tagsHeader.size];
- FSeek(entriesOffset);
- local int gCurrentTag;
- local int gCurrentTagIndex;
- local string gCurrentTagName;
- string GetTagName(int tagId)
- {
- if (gCurrentTag != tagId)
- {
- local int i;
- for (i = gCurrentTagIndex; i < tagsHeader.count; i++)
- {
- if (columnRefs[i].tagId == tagId)
- {
- gCurrentTag = tagId;
- gCurrentTagName = columnRefs[i].columnName;
- gCurrentTagIndex = i;
- return gCurrentTagName;
- }
- }
- for (i = 0; i < gCurrentTagIndex; i++)
- {
- if (columnRefs[i].tagId == tagId)
- {
- gCurrentTag = tagId;
- gCurrentTagName = columnRefs[i].columnName;
- gCurrentTagIndex = i;
- return gCurrentTagName;
- }
- }
- Exit(6);
- }
- return gCurrentTagName;
- }
- struct Entry
- {
- int tagId;
- ubyte fieldCount;
- if (fieldCount > 0)
- {
- local int maskSize = (fieldCount+3)/4;
- local int paddingSize = 3-maskSize % 4;
- ubyte fieldTypes[maskSize];
- if (paddingSize > 0)
- ubyte padding[paddingSize];
- uint64 fields[fieldCount];
- }
- else
- {
- ubyte padding[3];
- }
- };
- ubyte GetFieldType(Entry &v, int fieldIndex)
- {
- local ubyte b = v.fieldTypes[fieldIndex/4];
- return (b >> (fieldIndex%4)) & 3;
- }
- string Entry_Name(Entry &v)
- {
- string result;
- if (v.fieldCount == 0)
- {
- SPrintf( result, "[%s] NULL", GetTagName(v.tagId));
- return result;
- }
- if (v.fieldCount == 1)
- {
- ubyte type = GetFieldType(v, 0);
- if (type == 0)
- {
- result = ReadLine(h1.stringSectionOffset + v.fields[0]);
- SPrintf( result, "[%s] STR: %s", GetTagName(v.tagId), result );
- }
- else if (type == 1)
- {
- SPrintf( result, "[%s] INT: %d", GetTagName(v.tagId), v.fields[0] );
- }
- else if (type == 2)
- {
- SPrintf( result, "[%s] FLT: %f", GetTagName(v.tagId), v.fields[0] );
- }
- else
- {
- SPrintf( result, "[%s] LNG: %d", GetTagName(v.tagId), v.fields[0] );
- }
- return result;
- }
- else
- {
- SPrintf( result, "[%s] %d: (", GetTagName(v.tagId), v.fieldCount );
- string tmp;
- int i = 0;
- ubyte type;
- for (i = 0; i < v.fieldCount; i++)
- {
- if (i > 0)
- result += ", ";
- type = GetFieldType(v, i);
- if (type == 0)
- {
- tmp = ReadLine(h1.stringSectionOffset + v.fields[i]);
- result += tmp;
- }
- else if (type == 1)
- {
- SPrintf( tmp, "%d", v.fields[i] );
- result += tmp;
- }
- else if (type == 2)
- {
- SPrintf( tmp, "%f", v.fields[i] );
- result += tmp;
- }
- else
- {
- SPrintf( tmp, "%d", v.fields[i] );
- result += tmp;
- }
- }
- result += ")";
- return result;
- }
- SPrintf( result, "[%s] %d", GetTagName(v.tagId), v.fieldCount );
- return result;
- }
- Entry lines1[h1.entryCount]<optimize=false,name=Entry_Name>;
- Padding();
- if (h1.stringSectionSize > 0)
- {
- FSeek(h1.stringSectionOffset);
- char content[h1.stringSectionSize];
- Padding();
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement