Files
ordoor/internal/data/data.go

108 lines
1.7 KiB
Go
Raw Normal View History

package data
import (
"bufio"
"bytes"
"io"
"io/ioutil"
"strconv"
)
var hashComment = []byte("#")
type CompassPoints struct {
N int
NE int
E int
SE int
S int
SW int
W int
NW int
}
type Range struct {
Start int
End int
}
func fileToScanner(filename string) (*bufio.Scanner, error) {
data, err := ioutil.ReadFile(filename)
if err != nil {
return nil, err
}
return bufio.NewScanner(bytes.NewReader(data)), nil
}
func consumeString(scanner *bufio.Scanner) (string, error) {
for scanner.Scan() {
line := scanner.Bytes()
if len(line) == 0 || line[0] == hashComment[0] { // Most .dat files use # for comments
continue
}
comment := bytes.Index(line, hashComment)
if comment > 0 {
line = line[0:comment]
}
return string(bytes.TrimRight(line, "\r\n\t ")), nil
}
err := scanner.Err()
if err == nil {
return "", io.EOF
}
return "", err
}
func consumeInt(scanner *bufio.Scanner) (int, error) {
str, err := consumeString(scanner)
if err != nil {
return 0, err
}
return strconv.Atoi(str)
}
func consumeIntPtr(to *int, scanner *bufio.Scanner) error {
val, err := consumeInt(scanner)
if err != nil {
return err
}
*to = val
return nil
}
func consumeIntPtrs(scanner *bufio.Scanner, ptrs ...*int) error {
for _, ptr := range ptrs {
if err := consumeIntPtr(ptr, scanner); err != nil {
return err
}
}
return nil
}
func consumeRange(scanner *bufio.Scanner) (Range, error) {
var out Range
err := consumeIntPtrs(scanner, &out.Start, &out.End)
return out, err
}
func consumeCompassPoints(scanner *bufio.Scanner) (CompassPoints, error) {
var out CompassPoints
err := consumeIntPtrs(
scanner,
&out.N, &out.NE, &out.E, &out.SE, &out.S, &out.SW, &out.W, &out.NW,
)
return out, err
}