package main import ( "os" "io" "index/suffixarray" "regexp" "log" ) func main() { idx := os.Args[1] + ".suf" f, err := os.Open(os.Args[1]) if err != nil { log.Fatal(err) } defer f.Close() regexps := []*regexp.Regexp{} for _, re := range os.Args[2:] { re = "(?m:" + re + ")" re_compiled, err := regexp.Compile(re) if err != nil { log.Fatal(re, ": ", err) } regexps = append(regexps, re_compiled) } idxf, err := os.Open(idx) if err != nil { log.Fatal(err) } defer idxf.Close() var index suffixarray.Index err = index.Read(idxf) if err != nil { log.Fatal("reading ", idxf.Name(), ": ", err) } data := []byte{} for _, re_compiled := range regexps { for _, match := range index.FindAllIndex(re_compiled, -1) { missing := match[1] - len(data) if missing > 0 { // We should be able to do this in place, no? more := make([]byte, 2*match[1] - len(data)) count, err := f.ReadAt(more, int64(len(data))) if err != nil && err != io.EOF { log.Fatal(err) } if count < missing { log.Fatal("couldn't read ", missing, " bytes from ", f.Name, " at ", len(data)) } data = append(data, more...) } print(string(data[match[0]:match[1]]), "\n") } } }