pull/5/head
Jordan Orelli 10 years ago
parent 22bdd88369
commit ed0dc6f570

@ -0,0 +1,31 @@
package main
import (
"strings"
)
const (
E_Ok int = iota
E_No_Data
)
type errorGroup []error
func (e errorGroup) Error() string {
messages := make([]string, 0, len(e))
for i, _ := range e {
messages[i] = e[i].Error()
}
return strings.Join(messages, " && ")
}
func (g *errorGroup) AddError(err error) {
if err == nil {
return
}
if g == nil {
panic("fart")
*g = make([]error, 0, 4)
}
*g = append(*g, err)
}

@ -0,0 +1,35 @@
package main
import (
"fmt"
"os"
)
var dataPath = "/projects/exo/expl.speck"
func log_error(template string, args ...interface{}) {
fmt.Fprint(os.Stderr, "ERROR ")
fmt.Fprintf(os.Stderr, template+"\n", args...)
}
func log_info(template string, args ...interface{}) {
fmt.Fprint(os.Stdout, "INFO ")
fmt.Fprintf(os.Stdout, template+"\n", args...)
}
func bail(status int, template string, args ...interface{}) {
if status == 0 {
fmt.Fprintf(os.Stdout, template, args...)
} else {
fmt.Fprintf(os.Stderr, template, args...)
}
os.Exit(status)
}
func main() {
fi, err := os.Open(dataPath)
if err != nil {
bail(E_No_Data, "unable to open data path: %v", err)
}
speckStream(fi)
}

@ -0,0 +1,66 @@
package main
import (
"bufio"
"fmt"
"io"
"regexp"
"strconv"
"strings"
)
func speckStream(r io.ReadCloser) {
defer r.Close()
keep := regexp.MustCompile(`^\s*[\d-]`)
br := bufio.NewReader(r)
for {
line, err := br.ReadBytes('\n')
switch err {
case io.EOF:
return
case nil:
break
default:
log_error("unable to stream speck file: %v", err)
return
}
if !keep.Match(line) {
continue
}
parseSpeckLine(line)
}
}
type exoSystem struct {
x, y, z float64
planets int
name string
}
func (e exoSystem) String() string {
return fmt.Sprintf("<name: %s x: %v y: %v z: %v planets: %v>", e.name, e.x, e.y, e.z, e.planets)
}
func parseSpeckLine(line []byte) {
parts := strings.Split(string(line), " ")
var err error
var g errorGroup
s := new(exoSystem)
s.x, err = strconv.ParseFloat(parts[0], 64)
g.AddError(err)
s.y, err = strconv.ParseFloat(parts[1], 64)
g.AddError(err)
s.z, err = strconv.ParseFloat(parts[2], 64)
g.AddError(err)
s.planets, err = strconv.Atoi(parts[3])
g.AddError(err)
s.name = strings.TrimSpace(strings.Join(parts[7:], " "))
if g != nil {
log_error("%v", g)
}
log_info("%v", s)
}
Loading…
Cancel
Save