mirror of
https://github.com/garraflavatra/go-fmp.git
synced 2025-06-28 04:25:11 +00:00
84 lines
1.4 KiB
Go
84 lines
1.4 KiB
Go
package fmp
|
|
|
|
import (
|
|
"io"
|
|
"time"
|
|
)
|
|
|
|
type FmpFile struct {
|
|
VersionDate time.Time
|
|
CreatorName string
|
|
FileSize uint
|
|
NumSectors uint
|
|
Stream io.ReadSeeker
|
|
Sectors []*FmpSector
|
|
Chunks []*FmpChunk
|
|
Dictionary *FmpDict
|
|
}
|
|
|
|
type FmpSector struct {
|
|
Deleted bool
|
|
Level uint8
|
|
PrevSectorID uint32
|
|
NextSectorID uint32
|
|
Chunks []*FmpChunk
|
|
}
|
|
|
|
type FmpChunk struct {
|
|
Type FmpChunkType
|
|
Length uint32
|
|
Key uint32 // If Type == FMP_CHUNK_SHORT_KEY_VALUE or FMP_CHUNK_LONG_KEY_VALUE
|
|
Index uint32 // Segment index, if Type == FMP_CHUNK_SEGMENTED_DATA
|
|
Value []byte
|
|
}
|
|
|
|
type FmpDict map[uint16]*FmpDictEntry
|
|
|
|
type FmpDictEntry struct {
|
|
Value []byte
|
|
Children *FmpDict
|
|
}
|
|
|
|
type FmpTable struct {
|
|
Name string
|
|
}
|
|
|
|
func (dict *FmpDict) get(path []uint16) *FmpDictEntry {
|
|
for i, key := range path {
|
|
_, ok := (*dict)[key]
|
|
if !ok {
|
|
(*dict)[key] = &FmpDictEntry{Children: &FmpDict{}}
|
|
}
|
|
|
|
if i == len(path)-1 {
|
|
return (*dict)[key]
|
|
} else {
|
|
dict = (*dict)[key].Children
|
|
}
|
|
}
|
|
return nil
|
|
}
|
|
|
|
func (dict *FmpDict) getValue(path []uint16) []byte {
|
|
ent := dict.get(path)
|
|
if ent != nil {
|
|
return ent.Value
|
|
}
|
|
return nil
|
|
}
|
|
|
|
func (dict *FmpDict) set(path []uint16, value []byte) {
|
|
for i, key := range path {
|
|
_, ok := (*dict)[key]
|
|
if !ok {
|
|
(*dict)[key] = &FmpDictEntry{Children: &FmpDict{}}
|
|
}
|
|
|
|
if i == len(path)-1 {
|
|
(*dict)[key].Value = value
|
|
} else {
|
|
dict = (*dict)[key].Children
|
|
}
|
|
}
|
|
}
|