Extract scanning ASCII files into a util package

This commit is contained in:
2018-03-18 05:04:46 +00:00
parent 4176ccd94f
commit 10e22d8428
5 changed files with 131 additions and 100 deletions

View File

@@ -1,15 +1,9 @@
package data
import (
"bufio"
"bytes"
"io"
"io/ioutil"
"strconv"
"ur.gs/chaos-gate/internal/util/asciiscan"
)
var hashComment = []byte("#")
type CompassPoints struct {
N int
NE int
@@ -26,80 +20,17 @@ type Range struct {
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) {
func consumeRange(scanner *asciiscan.Scanner) (Range, error) {
var out Range
err := consumeIntPtrs(scanner, &out.Start, &out.End)
err := scanner.ConsumeIntPtrs(&out.Start, &out.End)
return out, err
}
func consumeCompassPoints(scanner *bufio.Scanner) (CompassPoints, error) {
func consumeCompassPoints(scanner *asciiscan.Scanner) (CompassPoints, error) {
var out CompassPoints
err := consumeIntPtrs(
scanner,
err := scanner.ConsumeIntPtrs(
&out.N, &out.NE, &out.E, &out.SE, &out.S, &out.SW, &out.W, &out.NW,
)