summaryrefslogtreecommitdiffstats
path: root/vendor/github.com/mattermost/rsc/regexp/regmerge/main.go
diff options
context:
space:
mode:
Diffstat (limited to 'vendor/github.com/mattermost/rsc/regexp/regmerge/main.go')
-rw-r--r--vendor/github.com/mattermost/rsc/regexp/regmerge/main.go96
1 files changed, 96 insertions, 0 deletions
diff --git a/vendor/github.com/mattermost/rsc/regexp/regmerge/main.go b/vendor/github.com/mattermost/rsc/regexp/regmerge/main.go
new file mode 100644
index 000000000..672337a04
--- /dev/null
+++ b/vendor/github.com/mattermost/rsc/regexp/regmerge/main.go
@@ -0,0 +1,96 @@
+// Copyright 2012 The Go Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style
+// license that can be found in the LICENSE file.
+
+package main
+
+import (
+ "flag"
+ "fmt"
+ "log"
+ "os"
+ "regexp/syntax"
+ "runtime/pprof"
+)
+
+var maxState = flag.Int("m", 1e5, "maximum number of states to explore")
+var cpuprof = flag.String("cpuprofile", "", "cpu profile file")
+
+func main() {
+ flag.Usage = func() {
+ fmt.Fprintf(os.Stderr, "usage: regmerge [-m maxstate] regexp [regexp2 regexp3....]\n")
+ os.Exit(2)
+ }
+ flag.Parse()
+
+ if len(flag.Args()) < 1 {
+ flag.Usage()
+ }
+
+ os.Exit(run(flag.Args()))
+}
+
+func run(args []string) int {
+ if *cpuprof != "" {
+ f, err := os.Create(*cpuprof)
+ if err != nil {
+ log.Fatal(err)
+ }
+ pprof.StartCPUProfile(f)
+ defer pprof.StopCPUProfile()
+ }
+
+ m, err := compile(flag.Args()...)
+ if err != nil {
+ log.Fatal(err)
+ }
+ n := 100
+ for ;; n *= 2 {
+ if n >= *maxState {
+ if n >= 2* *maxState {
+ fmt.Printf("reached state limit\n")
+ return 1
+ }
+ n = *maxState
+ }
+ log.Printf("try %d states...\n", n)
+ s, err := m.findMatch(n)
+ if err == nil {
+ fmt.Printf("%q\n", s)
+ return 0
+ }
+ if err != ErrMemory {
+ fmt.Printf("failed: %s\n", err)
+ return 3
+ }
+ }
+ panic("unreachable")
+}
+
+func compile(exprs ...string) (*matcher, error) {
+ var progs []*syntax.Prog
+ for _, expr := range exprs {
+ re, err := syntax.Parse(expr, syntax.Perl)
+ if err != nil {
+ return nil, err
+ }
+ sre := re.Simplify()
+ prog, err := syntax.Compile(sre)
+ if err != nil {
+ return nil, err
+ }
+ if err := toByteProg(prog); err != nil {
+ return nil, err
+ }
+ progs = append(progs, prog)
+ }
+ m := &matcher{}
+ if err := m.init(joinProgs(progs), len(progs)); err != nil {
+ return nil, err
+ }
+ return m, nil
+}
+
+func bug() {
+ panic("regmerge: internal error")
+}