From 688972df9daa1f80d24feff5c056ab3a66c4eee9 Mon Sep 17 00:00:00 2001 From: Sam Anthony Date: Fri, 7 Nov 2025 18:15:14 -0500 Subject: cal: parse csv tables --- sw/cal/csv.go | 55 +++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 55 insertions(+) create mode 100644 sw/cal/csv.go (limited to 'sw/cal/csv.go') diff --git a/sw/cal/csv.go b/sw/cal/csv.go new file mode 100644 index 0000000..bb5cd01 --- /dev/null +++ b/sw/cal/csv.go @@ -0,0 +1,55 @@ +package main + +import ( + "os" + "fmt" + "io" + "strconv" + "encoding/csv" +) + +func parseTable(filename string) (map[int32]uint16, error) { + f, err := os.Open(filename) + if err != nil { + eprintf("%v\n", err) + } + defer f.Close() + + tbl := make(map[int32]uint16) + rdr := csv.NewReader(f) + for { + err := parseRow(rdr, tbl) + if err == io.EOF { + return tbl, nil + } else if err != nil { + return nil, fmt.Errorf("%s:%v", filename, err) + } + } +} + +func parseRow(rdr *csv.Reader, tbl map[int32]uint16) error { + row, err := rdr.Read() + if err != nil { + return err + } + if len(row) != 2 { + line, _ := rdr.FieldPos(0) + return fmt.Errorf("%d: malformed row", line) + } + key, err := strconv.ParseInt(row[0], 10, 32) + if err != nil { + line, col := rdr.FieldPos(0) + return fmt.Errorf("%d:%d: %v", line, col, err) + } + val, err := strconv.ParseUint(row[1], 10, 16) + if err != nil { + line, col := rdr.FieldPos(1) + return fmt.Errorf("%d:%d: %v", line, col, err) + } + if _, ok := tbl[int32(key)]; ok { + line, col := rdr.FieldPos(0) + return fmt.Errorf("%d: %d: duplicate key %d", line, col, key) + } + tbl[int32(key)] = uint16(val) + return nil +} -- cgit v1.2.3