From 82871ba1bac1d62f69e1933b66659e62d2e5e063 Mon Sep 17 00:00:00 2001 From: Arda Serdar Pektezol <1669855+pektezol@users.noreply.github.com> Date: Tue, 12 Sep 2023 20:53:09 +0300 Subject: another rewrite, v1.0.0 --- pkg/classes/stringTable.go | 82 ++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 82 insertions(+) create mode 100644 pkg/classes/stringTable.go (limited to 'pkg/classes/stringTable.go') diff --git a/pkg/classes/stringTable.go b/pkg/classes/stringTable.go new file mode 100644 index 0000000..c6709f5 --- /dev/null +++ b/pkg/classes/stringTable.go @@ -0,0 +1,82 @@ +package classes + +import ( + "bytes" + + "github.com/pektezol/bitreader" +) + +type StringTable struct { + Name string + TableEntries []StringTableEntry + Classes []StringTableClass +} + +type StringTableEntry struct { + Name string + EntryData StringTableEntryData +} + +type StringTableEntryData struct { + // TODO: Parse StringTableEntry +} + +type StringTableClass struct { + Name string + Data string +} + +func ParseStringTables(reader *bitreader.ReaderType) []StringTable { + tableCount := reader.TryReadBits(8) + stringTables := make([]StringTable, tableCount) + for i := 0; i < int(tableCount); i++ { + var table StringTable + table.ParseStream(reader) + stringTables[i] = table + } + return stringTables +} + +func (stringTable *StringTable) ParseStream(reader *bitreader.ReaderType) { + stringTable.Name = reader.TryReadString() + entryCount := reader.TryReadBits(16) + stringTable.TableEntries = make([]StringTableEntry, entryCount) + + for i := 0; i < int(entryCount); i++ { + var entry StringTableEntry + entry.Parse(reader) + stringTable.TableEntries[i] = entry + } + + if reader.TryReadBool() { + classCount := reader.TryReadBits(16) + stringTable.Classes = make([]StringTableClass, classCount) + + for i := 0; i < int(classCount); i++ { + var class StringTableClass + class.Parse(reader) + stringTable.Classes[i] = class + } + } +} + +func (stringTableEntry *StringTableEntry) Parse(reader *bitreader.ReaderType) { + stringTableEntry.Name = reader.TryReadString() + if reader.TryReadBool() { + byteLen, err := reader.ReadBits(16) + if err != nil { + return + } + dataBsr := reader.TryReadBytesToSlice(int(byteLen)) + _ = bitreader.Reader(bytes.NewReader(dataBsr), true) // TODO: Parse StringTableEntry + // stringTableEntry.EntryData.ParseStream(entryReader) + } +} + +func (stringTableClass *StringTableClass) Parse(reader *bitreader.ReaderType) { + stringTableClass.Name = reader.TryReadString() + if reader.TryReadBool() { + dataLen := reader.TryReadBits(16) + stringTableClass.Data = reader.TryReadStringLen(int(dataLen)) + } +} -- cgit v1.2.3