mirror of
https://github.com/zellyn/diskii.git
synced 2025-02-18 07:30:33 +00:00
Re-thread errors through sector marshaling code
I'm still not sure what underlying errors might need to be reported up, and calling panic in a library was definitely a mistake. (Added a TODO to supermon.go to remove panics there too.)
This commit is contained in:
parent
68ee8a493c
commit
844ea47435
@ -8,7 +8,7 @@ package disk
|
|||||||
// SectorSource is the interface for types that can marshal to sectors.
|
// SectorSource is the interface for types that can marshal to sectors.
|
||||||
type SectorSource interface {
|
type SectorSource interface {
|
||||||
// ToSector marshals the sector struct to exactly 256 bytes.
|
// ToSector marshals the sector struct to exactly 256 bytes.
|
||||||
ToSector() []byte
|
ToSector() ([]byte, error)
|
||||||
// GetTrack returns the track that a sector struct was loaded from.
|
// GetTrack returns the track that a sector struct was loaded from.
|
||||||
GetTrack() byte
|
GetTrack() byte
|
||||||
// GetSector returns the sector that a sector struct was loaded from.
|
// GetSector returns the sector that a sector struct was loaded from.
|
||||||
@ -19,7 +19,7 @@ type SectorSource interface {
|
|||||||
type SectorSink interface {
|
type SectorSink interface {
|
||||||
// FromSector unmarshals the sector struct from bytes. Input is
|
// FromSector unmarshals the sector struct from bytes. Input is
|
||||||
// expected to be exactly 256 bytes.
|
// expected to be exactly 256 bytes.
|
||||||
FromSector(data []byte)
|
FromSector(data []byte) error
|
||||||
// SetTrack sets the track that a sector struct was loaded from.
|
// SetTrack sets the track that a sector struct was loaded from.
|
||||||
SetTrack(track byte)
|
SetTrack(track byte)
|
||||||
// SetSector sets the sector that a sector struct was loaded from.
|
// SetSector sets the sector that a sector struct was loaded from.
|
||||||
@ -33,7 +33,9 @@ func UnmarshalLogicalSector(d LogicalSectorDisk, ss SectorSink, track, sector by
|
|||||||
if err != nil {
|
if err != nil {
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
ss.FromSector(bytes)
|
if err := ss.FromSector(bytes); err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
ss.SetTrack(track)
|
ss.SetTrack(track)
|
||||||
ss.SetSector(sector)
|
ss.SetSector(sector)
|
||||||
return nil
|
return nil
|
||||||
@ -44,6 +46,9 @@ func UnmarshalLogicalSector(d LogicalSectorDisk, ss SectorSink, track, sector by
|
|||||||
func MarshalLogicalSector(d LogicalSectorDisk, ss SectorSource) error {
|
func MarshalLogicalSector(d LogicalSectorDisk, ss SectorSource) error {
|
||||||
track := ss.GetTrack()
|
track := ss.GetTrack()
|
||||||
sector := ss.GetSector()
|
sector := ss.GetSector()
|
||||||
bytes := ss.ToSector()
|
bytes, err := ss.ToSector()
|
||||||
|
if err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
return d.WriteLogicalSector(track, sector, bytes)
|
return d.WriteLogicalSector(track, sector, bytes)
|
||||||
}
|
}
|
||||||
|
@ -124,7 +124,7 @@ func (v *VTOC) Validate() error {
|
|||||||
}
|
}
|
||||||
|
|
||||||
// ToSector marshals the VTOC sector to bytes.
|
// ToSector marshals the VTOC sector to bytes.
|
||||||
func (v VTOC) ToSector() []byte {
|
func (v VTOC) ToSector() ([]byte, error) {
|
||||||
buf := make([]byte, 256)
|
buf := make([]byte, 256)
|
||||||
buf[0x00] = v.Unused1
|
buf[0x00] = v.Unused1
|
||||||
buf[0x01] = v.CatalogTrack
|
buf[0x01] = v.CatalogTrack
|
||||||
@ -144,7 +144,7 @@ func (v VTOC) ToSector() []byte {
|
|||||||
for i, m := range v.FreeSectors {
|
for i, m := range v.FreeSectors {
|
||||||
copyBytes(buf[0x38+4*i:0x38+4*i+4], m[:])
|
copyBytes(buf[0x38+4*i:0x38+4*i+4], m[:])
|
||||||
}
|
}
|
||||||
return buf
|
return buf, nil
|
||||||
}
|
}
|
||||||
|
|
||||||
// copyBytes is just like the builtin copy, but just for byte slices,
|
// copyBytes is just like the builtin copy, but just for byte slices,
|
||||||
@ -158,9 +158,9 @@ func copyBytes(dst, src []byte) int {
|
|||||||
|
|
||||||
// FromSector unmarshals the VTOC sector from bytes. Input is
|
// FromSector unmarshals the VTOC sector from bytes. Input is
|
||||||
// expected to be exactly 256 bytes.
|
// expected to be exactly 256 bytes.
|
||||||
func (v *VTOC) FromSector(data []byte) {
|
func (v *VTOC) FromSector(data []byte) error {
|
||||||
if len(data) != 256 {
|
if len(data) != 256 {
|
||||||
panic(fmt.Sprintf("VTOC.FromSector expects exactly 256 bytes; got %d", len(data)))
|
return fmt.Errorf("VTOC.FromSector expects exactly 256 bytes; got %d", len(data))
|
||||||
}
|
}
|
||||||
|
|
||||||
v.Unused1 = data[0x00]
|
v.Unused1 = data[0x00]
|
||||||
@ -181,6 +181,7 @@ func (v *VTOC) FromSector(data []byte) {
|
|||||||
for i := range v.FreeSectors {
|
for i := range v.FreeSectors {
|
||||||
copyBytes(v.FreeSectors[i][:], data[0x38+4*i:0x38+4*i+4])
|
copyBytes(v.FreeSectors[i][:], data[0x38+4*i:0x38+4*i+4])
|
||||||
}
|
}
|
||||||
|
return nil
|
||||||
}
|
}
|
||||||
|
|
||||||
func DefaultVTOC() VTOC {
|
func DefaultVTOC() VTOC {
|
||||||
@ -217,7 +218,7 @@ type CatalogSector struct {
|
|||||||
}
|
}
|
||||||
|
|
||||||
// ToSector marshals the CatalogSector to bytes.
|
// ToSector marshals the CatalogSector to bytes.
|
||||||
func (cs CatalogSector) ToSector() []byte {
|
func (cs CatalogSector) ToSector() ([]byte, error) {
|
||||||
buf := make([]byte, 256)
|
buf := make([]byte, 256)
|
||||||
buf[0x00] = cs.Unused1
|
buf[0x00] = cs.Unused1
|
||||||
buf[0x01] = cs.NextTrack
|
buf[0x01] = cs.NextTrack
|
||||||
@ -227,14 +228,14 @@ func (cs CatalogSector) ToSector() []byte {
|
|||||||
fdBytes := fd.ToBytes()
|
fdBytes := fd.ToBytes()
|
||||||
copyBytes(buf[0x0b+35*i:0x0b+35*(i+1)], fdBytes)
|
copyBytes(buf[0x0b+35*i:0x0b+35*(i+1)], fdBytes)
|
||||||
}
|
}
|
||||||
return buf
|
return buf, nil
|
||||||
}
|
}
|
||||||
|
|
||||||
// FromSector unmarshals the CatalogSector from bytes. Input is
|
// FromSector unmarshals the CatalogSector from bytes. Input is
|
||||||
// expected to be exactly 256 bytes.
|
// expected to be exactly 256 bytes.
|
||||||
func (cs *CatalogSector) FromSector(data []byte) {
|
func (cs *CatalogSector) FromSector(data []byte) error {
|
||||||
if len(data) != 256 {
|
if len(data) != 256 {
|
||||||
panic(fmt.Sprintf("CatalogSector.FromSector expects exactly 256 bytes; got %d", len(data)))
|
return fmt.Errorf("CatalogSector.FromSector expects exactly 256 bytes; got %d", len(data))
|
||||||
}
|
}
|
||||||
|
|
||||||
cs.Unused1 = data[0x00]
|
cs.Unused1 = data[0x00]
|
||||||
@ -245,6 +246,7 @@ func (cs *CatalogSector) FromSector(data []byte) {
|
|||||||
for i := range cs.FileDescs {
|
for i := range cs.FileDescs {
|
||||||
cs.FileDescs[i].FromBytes(data[0x0b+35*i : 0x0b+35*(i+1)])
|
cs.FileDescs[i].FromBytes(data[0x0b+35*i : 0x0b+35*(i+1)])
|
||||||
}
|
}
|
||||||
|
return nil
|
||||||
}
|
}
|
||||||
|
|
||||||
type Filetype byte
|
type Filetype byte
|
||||||
@ -360,7 +362,7 @@ type TrackSectorList struct {
|
|||||||
}
|
}
|
||||||
|
|
||||||
// ToSector marshals the TrackSectorList to bytes.
|
// ToSector marshals the TrackSectorList to bytes.
|
||||||
func (tsl TrackSectorList) ToSector() []byte {
|
func (tsl TrackSectorList) ToSector() ([]byte, error) {
|
||||||
buf := make([]byte, 256)
|
buf := make([]byte, 256)
|
||||||
buf[0x00] = tsl.Unused1
|
buf[0x00] = tsl.Unused1
|
||||||
buf[0x01] = tsl.NextTrack
|
buf[0x01] = tsl.NextTrack
|
||||||
@ -373,14 +375,14 @@ func (tsl TrackSectorList) ToSector() []byte {
|
|||||||
buf[0x0C+i*2] = ts.Track
|
buf[0x0C+i*2] = ts.Track
|
||||||
buf[0x0D+i*2] = ts.Sector
|
buf[0x0D+i*2] = ts.Sector
|
||||||
}
|
}
|
||||||
return buf
|
return buf, nil
|
||||||
}
|
}
|
||||||
|
|
||||||
// FromSector unmarshals the TrackSectorList from bytes. Input is
|
// FromSector unmarshals the TrackSectorList from bytes. Input is
|
||||||
// expected to be exactly 256 bytes.
|
// expected to be exactly 256 bytes.
|
||||||
func (tsl *TrackSectorList) FromSector(data []byte) {
|
func (tsl *TrackSectorList) FromSector(data []byte) error {
|
||||||
if len(data) != 256 {
|
if len(data) != 256 {
|
||||||
panic(fmt.Sprintf("TrackSectorList.FromSector expects exactly 256 bytes; got %d", len(data)))
|
return fmt.Errorf("TrackSectorList.FromSector expects exactly 256 bytes; got %d", len(data))
|
||||||
}
|
}
|
||||||
|
|
||||||
tsl.Unused1 = data[0x00]
|
tsl.Unused1 = data[0x00]
|
||||||
@ -394,6 +396,7 @@ func (tsl *TrackSectorList) FromSector(data []byte) {
|
|||||||
tsl.TrackSectors[i].Track = data[0x0C+i*2]
|
tsl.TrackSectors[i].Track = data[0x0C+i*2]
|
||||||
tsl.TrackSectors[i].Sector = data[0x0D+i*2]
|
tsl.TrackSectors[i].Sector = data[0x0D+i*2]
|
||||||
}
|
}
|
||||||
|
return nil
|
||||||
}
|
}
|
||||||
|
|
||||||
// readCatalogSectors reads the raw CatalogSector structs from a DOS
|
// readCatalogSectors reads the raw CatalogSector structs from a DOS
|
||||||
|
@ -16,7 +16,10 @@ func TestVTOCMarshalRoundtrip(t *testing.T) {
|
|||||||
copy(buf1, buf)
|
copy(buf1, buf)
|
||||||
vtoc1 := &VTOC{}
|
vtoc1 := &VTOC{}
|
||||||
vtoc1.FromSector(buf1)
|
vtoc1.FromSector(buf1)
|
||||||
buf2 := vtoc1.ToSector()
|
buf2, err := vtoc1.ToSector()
|
||||||
|
if err != nil {
|
||||||
|
t.Fatal(err)
|
||||||
|
}
|
||||||
if !reflect.DeepEqual(buf, buf2) {
|
if !reflect.DeepEqual(buf, buf2) {
|
||||||
t.Errorf("Buffers differ: %v != %v", buf, buf2)
|
t.Errorf("Buffers differ: %v != %v", buf, buf2)
|
||||||
}
|
}
|
||||||
@ -35,7 +38,10 @@ func TestCatalogSectorMarshalRoundtrip(t *testing.T) {
|
|||||||
copy(buf1, buf)
|
copy(buf1, buf)
|
||||||
cs1 := &CatalogSector{}
|
cs1 := &CatalogSector{}
|
||||||
cs1.FromSector(buf1)
|
cs1.FromSector(buf1)
|
||||||
buf2 := cs1.ToSector()
|
buf2, err := cs1.ToSector()
|
||||||
|
if err != nil {
|
||||||
|
t.Fatal(err)
|
||||||
|
}
|
||||||
if !reflect.DeepEqual(buf, buf2) {
|
if !reflect.DeepEqual(buf, buf2) {
|
||||||
t.Errorf("Buffers differ: %v != %v", buf, buf2)
|
t.Errorf("Buffers differ: %v != %v", buf, buf2)
|
||||||
}
|
}
|
||||||
@ -54,7 +60,10 @@ func TestTrackSectorListMarshalRoundtrip(t *testing.T) {
|
|||||||
copy(buf1, buf)
|
copy(buf1, buf)
|
||||||
cs1 := &TrackSectorList{}
|
cs1 := &TrackSectorList{}
|
||||||
cs1.FromSector(buf1)
|
cs1.FromSector(buf1)
|
||||||
buf2 := cs1.ToSector()
|
buf2, err := cs1.ToSector()
|
||||||
|
if err != nil {
|
||||||
|
t.Fatal(err)
|
||||||
|
}
|
||||||
if !reflect.DeepEqual(buf, buf2) {
|
if !reflect.DeepEqual(buf, buf2) {
|
||||||
t.Errorf("Buffers differ: %v != %v", buf, buf2)
|
t.Errorf("Buffers differ: %v != %v", buf, buf2)
|
||||||
}
|
}
|
||||||
|
@ -4,6 +4,8 @@
|
|||||||
// structures of NakedOS/Super-Mon disks.
|
// structures of NakedOS/Super-Mon disks.
|
||||||
package supermon
|
package supermon
|
||||||
|
|
||||||
|
// TODO(zellyn): remove panics.
|
||||||
|
|
||||||
import (
|
import (
|
||||||
"fmt"
|
"fmt"
|
||||||
|
|
||||||
|
Loading…
x
Reference in New Issue
Block a user