func main() { opts := initConfig(os.Args) if *opts.help { getopt.PrintUsage(os.Stdout) } else { /*Passing stdin for test mocking*/ files, errs := handleArgs(os.Stdin, getopt.CommandLine) for _, file := range files { if len(file) != 0 { if err := copyPaste(file, opts); err != nil { errs = append(errs, err) } } } for _, err := range errs { log.Print(err) } if len(errs) > 0 { os.Exit(-1) } } }
func main() { log.SetFlags(log.LstdFlags | log.Lshortfile) // var needle string // var filepattern string var distance int var patternFile string var help bool var verbose bool var simpleoutput bool getopt.IntVarLong(&distance, "edit", 'e', "Compute the approximate matching", "max_dist") getopt.StringVarLong(&patternFile, "pattern", 'p', "Use line-break separated patterns from a file", "filepath") getopt.StringVarLong(&cpuprofile, "cpuprofile", 0, "Write cpuprofile file", "path") getopt.StringVarLong(&memprofile, "memprofile", 0, "Write memprofile file", "path") getopt.BoolVarLong(&help, "help", 'h', "Shows this message") getopt.BoolVarLong(&verbose, "verbose", 'v', "Show log messages") getopt.BoolVarLong(&simpleoutput, "simple", 's', "Show simple output") getopt.SetProgram("pmt") getopt.SetParameters("needle [haystack ...]") getopt.SetUsage(func() { getopt.PrintUsage(os.Stderr) fmt.Fprintf(os.Stderr, "needle - only if -p was not used\n") fmt.Fprint(os.Stderr, "haystack\n") }) getopt.Parse() if cpuprofile != "" { f, err := os.Create(cpuprofile) if err != nil { log.Fatal(err) } pprof.StartCPUProfile(f) defer pprof.StopCPUProfile() } if help { getopt.Usage() return } var patterns []string var files []string if patternFile == "" { // if(len(getopt.Args() ) if getopt.NArgs() < 1 { fmt.Fprintf(os.Stderr, "Needle is missing!\n") getopt.Usage() os.Exit(1) } patterns = getopt.Args()[:1] files = getopt.Args()[1:] } else { var err error patterns, err = readLinesFromFile(patternFile) if err != nil { log.Fatal(err) } files = getopt.Args() } if verbose { log.Printf("%v %v %v\n", patterns, files, distance) } fileset := findFilesMatch(files) if distance == 0 { if len(patterns) == 1 { matcher := streammatch.NewKMP([]byte(patterns[0])) for fp, _ := range fileset { file, err := os.Open(fp) if err != nil { log.Fatal(err) } matches, err := processSingleExactMatcher(file, matcher, true) if err != nil { log.Fatal(err) } if !simpleoutput { printMatches(fp, file, patterns, matches, distance) if len(matches) > 0 { fmt.Println("###") } } else { printSimpleMatches(fp, file, patterns, matches) } } } else if len(patterns) > 1 { bpatterns := make([][]byte, len(patterns)) for i, pattern := range patterns { bpatterns[i] = []byte(pattern) } matcher := streammatch.NewAhoCorasick(bpatterns) for fp, _ := range fileset { file, err := os.Open(fp) if err != nil { log.Fatal(err) } matches, err := processMultiExactMatcher(file, matcher) if err != nil { log.Fatal(err) } if !simpleoutput { printMatches(fp, file, patterns, matches, distance) if len(matches) > 0 { fmt.Println("###") } } else { printSimpleMatches(fp, file, patterns, matches) } } } } else { matchers := make([]streammatch.Matcher, 0, len(patterns)) for i := 0; i < len(patterns); i++ { matchers = append(matchers, streammatch.NewSellers([]byte(patterns[i]), distance)) } for fp, _ := range fileset { file, err := os.Open(fp) if err != nil { log.Fatal(err) } bufreader := bufio.NewReaderSize(file, defaultBufSize) allmatches := make([]matchRecord, 0, 2) for _, matcher := range matchers { _, err := file.Seek(0, 0) if err != nil { log.Fatal(err) } bufreader.Reset(file) matches, err := processSingleExactMatcher(bufreader, matcher, false) if err != nil { log.Fatal(err) } allmatches = append(allmatches, matches...) } sort.Stable(matchRecordList(allmatches)) if !simpleoutput { printMatches(fp, file, patterns, allmatches, distance) if len(allmatches) > 0 { fmt.Println("###") } } else { printSimpleMatches(fp, file, patterns, allmatches) } } } if memprofile != "" { f, err := os.Create(memprofile) if err != nil { log.Fatal(err) } pprof.WriteHeapProfile(f) defer f.Close() return } }