binana/go/symbols/loader.go

79 lines
1.4 KiB
Go

package symbols
import (
"bufio"
"errors"
"fmt"
"io"
"strings"
)
const min_columns = 3
type loader struct {
filename string
input *bufio.Reader
table *Table
line_number int
}
func (l *loader) read_line() (line string, err error) {
line, err = l.input.ReadString('\n')
if err != nil {
return
}
line = strings.TrimRight(line, "\r\n")
l.line_number++
return
}
func (l *loader) parse_line(line string) (err error) {
var table_entry TableEntry
table_entry.Filename = l.filename
table_entry.Linenumber = l.line_number
if line == "" {
//err = fmt.Errorf("%w: %s:%d", ErrLineLeftEmpty, table_entry.Filename, table_entry.Linenumber)
return
}
if err = table_entry.Symbol.Parse(line); err != nil {
err = fmt.Errorf("%w: %s:%d", err, table_entry.Filename, table_entry.Linenumber)
return
}
err = l.table.Insert(&table_entry)
return
}
func load(filename string, file io.Reader, table *Table) (err error) {
l := new(loader)
l.input = bufio.NewReader(file)
l.filename = filename
l.table = table
var (
line string
)
for {
line, err = l.read_line()
if err != nil {
if errors.Is(err, io.EOF) {
err = nil
break
} else {
err = fmt.Errorf("symbols: error reading at line %d: %w", l.line_number, err)
return
}
}
if err = l.parse_line(line); err != nil {
err = fmt.Errorf("symbols: error parsing at line %d: %w", l.line_number, err)
return
}
}
return
}