1
0
mirror of https://github.com/garraflavatra/go-fmp.git synced 2025-07-19 12:24:04 +00:00

Skip first sector

This commit is contained in:
2025-06-13 19:54:17 +02:00
parent 17a3664e42
commit f364ed7ede
3 changed files with 99 additions and 77 deletions

View File

@ -2,7 +2,6 @@ package fmp
import (
"bytes"
"fmt"
"io"
"os"
"time"
@ -51,52 +50,11 @@ func OpenFile(path string) (*FmpFile, error) {
if err != nil {
return nil, err
}
ctx.Sectors = append(ctx.Sectors, sector)
ctx.Chunks = append(ctx.Chunks, sector.Chunks...)
for _, chunk := range sector.Chunks {
switch chunk.Type {
case FMP_CHUNK_PATH_PUSH:
currentPath = append(currentPath, uint64(chunk.Value[0]))
case FMP_CHUNK_PATH_POP:
if len(currentPath) > 0 {
currentPath = currentPath[:len(currentPath)-1]
}
case FMP_CHUNK_SIMPLE_DATA:
ctx.Dictionary.set(currentPath, chunk.Value)
case FMP_CHUNK_SEGMENTED_DATA:
// Todo: take index into account
ctx.Dictionary.set(
currentPath,
append(ctx.Dictionary.getValue(currentPath), chunk.Value...),
)
case FMP_CHUNK_SIMPLE_KEY_VALUE:
ctx.Dictionary.set(
append(currentPath, uint64(chunk.Key)),
chunk.Value,
)
case FMP_CHUNK_LONG_KEY_VALUE:
ctx.Dictionary.set(
append(currentPath, uint64(chunk.Key)), // todo: ??
chunk.Value,
)
case FMP_CHUNK_NOOP:
// noop
}
if chunk.Delayed {
if len(currentPath) == 0 {
println("warning: delayed pop without path")
} else {
currentPath = currentPath[:len(currentPath)-1]
}
}
if sector.ID != 0 {
sector.processChunks(ctx.Dictionary, &currentPath)
ctx.Chunks = append(ctx.Chunks, sector.Chunks...)
}
ctx.currentSectorID = sector.NextID
@ -154,14 +112,15 @@ func (ctx *FmpFile) readSector() (*FmpSector, error) {
Level: uint8(buf[1]),
PrevID: parseVarUint64(buf[4 : 4+4]),
NextID: parseVarUint64(buf[8 : 8+4]),
Chunks: make([]*FmpChunk, 0),
}
if ctx.currentSectorID == 0 && sector.PrevID > 0 {
return nil, ErrBadSectorHeader
}
payload := make([]byte, sectorPayloadSize)
n, err = ctx.stream.Read(payload)
sector.Payload = make([]byte, sectorPayloadSize)
n, err = ctx.stream.Read(sector.Payload)
if n != sectorPayloadSize {
return nil, ErrRead
@ -169,33 +128,5 @@ func (ctx *FmpFile) readSector() (*FmpSector, error) {
if err != nil {
return nil, ErrRead
}
sector.Chunks = make([]*FmpChunk, 0)
for {
chunk, err := ctx.readChunk(payload)
fmt.Printf("0x%02X", payload[0])
if chunk != nil {
fmt.Printf(" (type %v)\n", int(chunk.Type))
}
if err == io.EOF {
break
}
if err != nil {
return nil, err
}
if chunk == nil {
break
}
if chunk.Length == 0 {
panic("chunk length not set")
}
sector.Chunks = append(sector.Chunks, chunk)
payload = payload[min(chunk.Length, uint64(len(payload))):]
if len(payload) == 0 || (len(payload) == 1 && payload[0] == 0x00) {
break
}
}
return sector, nil
}