package main import ( "bufio" "bytes" "flag" "io" "os" "github.com/golang/glog" ) func writeMailderFile(b []byte) error { return nil } func parse(r io.Reader, writeMessage func(b []byte) error) error { from := []byte("From ") scanner := bufio.NewScanner(r) buf := new(bytes.Buffer) for scanner.Scan() { b := scanner.Bytes() if bytes.HasPrefix(b, from) { // New message if buf.Len() > 0 { msg := buf.Bytes() // Trim empty line from end of mbox message msg = msg[:len(msg)-1] if err := writeMessage(msg); err != nil { return err } } buf.Reset() } buf.Write(b) buf.Write([]byte("\n")) } if buf.Len() > 0 { if err := writeMessage(buf.Bytes()); err != nil { return err } } return scanner.Err() } func parseFile(p string) error { r, err := os.Open(p) if err != nil { return err } defer r.Close() if err := parse(r, writeMailderFile); err != nil { return err } return nil } func main() { flag.Parse() defer glog.Flush() for _, path := range flag.Args() { if err := parseFile(path); err != nil { glog.Errorf("Failed to parse %q: %v", err) } } }