135 lines
2.1 KiB
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
|
|
}
|