go-studybox/script/labels.go

135 lines
2.1 KiB
Go

package script
import (
"fmt"
"io"
"os"
"encoding/json"
"strconv"
)
type Label struct {
Address int
Name string
Comment string
FarLabel bool
}
type JsonLabel struct {
Address string
Name string
Comment string
FarLabel bool
}
func (l Label) JsonLabel() JsonLabel {
return JsonLabel{
Address: fmt.Sprintf("0x%X", l.Address),
Name: l.Name,
Comment: l.Comment,
FarLabel: l.FarLabel,
}
}
func (l JsonLabel) Label() (*Label, error) {
addr, err := strconv.ParseInt(l.Address, 0, 32)
if err != nil {
return nil, fmt.Errorf("Invalid address: %q", l.Address)
}
return &Label{
Address: int(addr),
Name: l.Name,
Comment: l.Comment,
FarLabel: l.FarLabel,
}, nil
}
func AutoLabel(address int) *Label {
return &Label{
Address: address,
Name: fmt.Sprintf("L%04X", address),
}
}
func AutoLabelVar(address int) *Label {
return &Label{
Address: address,
Name: fmt.Sprintf("Var_%04X", address),
}
}
func AutoLabelFar(address int) *Label {
return &Label{
Address: address,
Name: fmt.Sprintf("F%04X", address),
FarLabel: true,
}
}
func NewLabel(address int, name string) *Label {
return &Label{
Address: address,
Name: name,
}
}
func (s *Script) LabelsFromJsonFile(filename string) error {
file, err := os.Open(filename)
if err != nil {
return err
}
defer file.Close()
return s.LabelsFromJson(file)
}
func (s *Script) LabelsFromJson(r io.Reader) error {
lbls := []JsonLabel{}
dec := json.NewDecoder(r)
err := dec.Decode(&lbls)
if err != nil {
return err
}
if s.Labels == nil {
s.Labels = make(map[int]*Label)
}
for _, lbl := range lbls {
l, err := lbl.Label()
if err != nil {
return err
}
s.Labels[l.Address] = l
}
return nil
}
func (s *Script) WriteLabelsToFile(filename string) error {
file, err := os.Create(filename)
if err != nil {
return err
}
defer file.Close()
return s.WriteLabels(file)
}
func (s *Script) WriteLabels(w io.Writer) error {
slice := []JsonLabel{}
for _, lbl := range s.Labels {
slice = append(slice, lbl.JsonLabel())
}
raw, err := json.MarshalIndent(slice, "", "\t")
if err != nil {
return err
}
_, err = w.Write(raw)
return err
}