66 lines
1.1 KiB
Go
66 lines
1.1 KiB
Go
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)
|
|
}
|
|
}
|
|
}
|