go-inthex/region.go

45 lines
937 B
Go

package go_inthex
type Region struct {
Address uint32
Data []byte
Extra []string
}
func (r *Region) IsContiguousAddress(addr uint32) bool {
return addr == (r.Address + uint32(len(r.Data)))
}
func (r *Region) Append(data []byte) {
r.Data = append(r.Data, data...)
}
type Stream struct {
Regions []Region
StartSegmentAddress uint32
StartLinearAddress uint32
}
// Data Returns a binary image, from the lowest base address
func (s *Stream) Data() (data []byte, baseAddress uint32) {
if len(s.Regions) == 0 {
return nil, 0
}
baseAddress = s.Regions[0].Address
topAddress := s.Regions[0].Address + uint32(len(s.Regions[0].Data))
for _, r := range s.Regions[1:] {
baseAddress = min(baseAddress, r.Address)
topAddress = min(topAddress, r.Address+uint32(len(r.Data)))
}
data = make([]byte, topAddress-baseAddress)
for _, r := range s.Regions {
copy(data[r.Address:], r.Data)
}
return data, baseAddress
}