Ubuntu Pastebin

Paste from rog at Thu, 9 Mar 2017 15:48:50 +0000

Download as text
  1
  2
  3
  4
  5
  6
  7
  8
  9
 10
 11
 12
 13
 14
 15
 16
 17
 18
 19
 20
 21
 22
 23
 24
 25
 26
 27
 28
 29
 30
 31
 32
 33
 34
 35
 36
 37
 38
 39
 40
 41
 42
 43
 44
 45
 46
 47
 48
 49
 50
 51
 52
 53
 54
 55
 56
 57
 58
 59
 60
 61
 62
 63
 64
 65
 66
 67
 68
 69
 70
 71
 72
 73
 74
 75
 76
 77
 78
 79
 80
 81
 82
 83
 84
 85
 86
 87
 88
 89
 90
 91
 92
 93
 94
 95
 96
 97
 98
 99
100
101
102
103
104
105
106
107
108
package main

import (
	"fmt"
	"io/ioutil"
	"log"
	"os"
	"regexp"
	"strings"
)

var (
	valuePrefix = regexp.MustCompile(`^\.\.\. (value|error) string = `)
	regexPrefix = regexp.MustCompile(`\.\.\. regex string = `)
)

func main() {
	data, err := ioutil.ReadAll(os.Stdin)
	if err != nil {
		log.Fatal(err)
	}
	val, pat := parse(string(data))
	mval, mpat := findMismatch(val, pat)
	fmt.Printf("val mismatch from %q\n", mval)
	fmt.Printf("pat mismatch from %q\n", mpat)
}

// findMismatch finds the last
func findMismatch(val, pat string) (mval, mpat string) {
	for i := 1; i < len(pat); i++ {
		re, err := regexp.Compile(pat[0:i])
		if err != nil {
			continue
		}
		// fmt.Printf("match %q\n", pat[0:i])
		m := re.FindStringIndex(val)
		if m != nil {
			// fmt.Printf("-> %q %q\n", val[m[0]:m[1]], val[m[1]:])
			mval = val[m[1]:]
			mpat = pat[i:]
		}
	}
	return
}

func trimLeadingRegex(s string, re *regexp.Regexp) string {
	m := re.FindStringIndex(s)
	if m == nil {
		return s
	}
	return s[m[1]:]
}

func parse(s string) (val, pat string) {
	lines := strings.Split(s, "\n")
	for ; len(lines) > 0; lines = lines[1:] {
		if valuePrefix.MatchString(lines[0]) {
			break
		}
	}
	if len(lines) == 0 {
		log.Fatal("didn't see expected value from gocheck")
	}
	lines[0] = "... " + trimLeadingRegex(lines[0], valuePrefix)
	var relines []string
	for i, l := range lines {
		if regexPrefix.MatchString(l) {
			relines = lines[i:]
			lines = lines[0:i]
			break
		}
	}
	if len(relines) == 0 {
		log.Fatal("didn't see expected regex from gocheck")
	}
	relines[0] = "... " + trimLeadingRegex(relines[0], regexPrefix)

	pat = "^" + buildString(relines) + "$"
	val = buildString(lines)

	// Note that the regexp is always anchored.
	_, err := regexp.Compile(pat)
	if err != nil {
		log.Fatal("pattern is not valid regex: %v", err)
	}
	return
}

var dotdotdotPrefix = regexp.MustCompile(`^\.\.\. *"`)

func buildString(lines []string) string {
	all := ""
	for _, l := range lines {
		if l0 := trimLeadingRegex(l, dotdotdotPrefix); l0 != l {
			l = l0
		} else {
			continue
		}
		l = `"` + l
		var s string
		n, err := fmt.Sscanf(l, "%q", &s)
		if n != 1 || err != nil {
			log.Fatalf("failed to unquote string from line: %q", l)
		}
		all += s
	}
	return all
}
Download as text