blob: ed59e31a43466595990b569e91e63fdcdbfd4ad3 [file] [log] [blame]
// Copyright 2017 The Go Authors. All rights reserved.
// Use of this source code is governed by a BSD-style
// license that can be found in the LICENSE file.
package x86csv
import (
"encoding/csv"
"io"
)
// A Reader reads entries from an "x86.csv" file.
type Reader struct {
csv *csv.Reader
}
// NewReader returns a Reader reading from r, which should
// be of the content of the "x86.csv" (format version=0.2).
func NewReader(r io.Reader) *Reader {
rcsv := csv.NewReader(r)
rcsv.Comment = '#'
return &Reader{csv: rcsv}
}
// ReadAll reads all remaining rows from r.
//
// If error is occured, still returns all rows
// that have been read during method execution.
//
// A successful call returns err == nil, not err == io.EOF.
// Because ReadAll is defined to read until EOF,
// it does not treat end of file as an error to be reported.
func (r *Reader) ReadAll() ([]*Inst, error) {
var err error
var insts []*Inst
for inst, err := r.Read(); err == nil; inst, err = r.Read() {
insts = append(insts, inst)
}
if err == io.EOF {
return insts, nil
}
return insts, err
}
// Read reads and returns the next Row from the "x86.csv" file.
// If there is no data left to be read, Read returns {nil, io.EOF}.
func (r *Reader) Read() (*Inst, error) {
cols, err := r.csv.Read()
if err != nil {
return nil, err
}
// This should be the only place where indexes
// are used. Everything else should rely on Row records.
inst := &Inst{
Intel: cols[0],
Go: cols[1],
GNU: cols[2],
Encoding: cols[3],
Mode32: cols[4],
Mode64: cols[5],
CPUID: cols[6],
Tags: cols[7],
Action: cols[8],
Multisize: cols[9],
DataSize: cols[10],
}
return inst, nil
}