binana/go/symbols/symbol.go

77 lines
1.4 KiB
Go

package symbols
import (
"fmt"
"io"
"strings"
)
// What kind of Symbol is this?
type SymbolKind uint8
const (
// Something that can be executed
Function SymbolKind = 'f'
// Something that is read or written to
DataLabel SymbolKind = 'l'
)
var (
valid_kinds = []SymbolKind{Function, DataLabel}
)
// An entry in the table
type Symbol struct {
// Undecorated, raw name
Name string
// Offset to the start of the function or data
StartAddress uint64
// What kind of Symbol is this?
Kind SymbolKind
// Any table entry can have a comment after a ';' column
Comment string
// Attributes
// end=AABBCCEEDD
EndAddress uint64
// type=void*
// The C syntax type of the data
DataType string
}
func (entry *Symbol) String() string {
var b strings.Builder
entry.WriteTo(&b)
return b.String()
}
func (entry *Symbol) WriteTo(w io.Writer) (n int64, err error) {
var b int
b, err = fmt.Fprintf(w, "%s %08X %c", entry.Name, entry.StartAddress, entry.Kind)
if err != nil {
return
}
n += int64(b)
if entry.EndAddress != 0 {
b, err = fmt.Fprintf(w, " end=%08X", entry.EndAddress)
if err != nil {
return
}
n += int64(b)
}
if entry.DataType != "" {
b, err = fmt.Fprintf(w, " type=\"%s\"", entry.DataType)
if err != nil {
return
}
n += int64(b)
}
if entry.Comment != "" {
b, err = fmt.Fprintf(w, " ; %s", entry.Comment)
if err != nil {
return
}
n += int64(b)
}
return
}