annotate vendor/github.com/dlclark/regexp2/syntax/escape.go @ 66:787b5ee0289d draft

Use vendored modules Signed-off-by: Izuru Yakumo <yakumo.izuru@chaotic.ninja>
author yakumo.izuru
date Sun, 23 Jul 2023 13:18:53 +0000
parents
children
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
66
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
1 package syntax
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
2
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
3 import (
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
4 "bytes"
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
5 "strconv"
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
6 "strings"
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
7 "unicode"
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
8 )
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
9
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
10 func Escape(input string) string {
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
11 b := &bytes.Buffer{}
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
12 for _, r := range input {
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
13 escape(b, r, false)
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
14 }
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
15 return b.String()
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
16 }
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
17
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
18 const meta = `\.+*?()|[]{}^$# `
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
19
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
20 func escape(b *bytes.Buffer, r rune, force bool) {
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
21 if unicode.IsPrint(r) {
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
22 if strings.IndexRune(meta, r) >= 0 || force {
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
23 b.WriteRune('\\')
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
24 }
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
25 b.WriteRune(r)
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
26 return
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
27 }
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
28
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
29 switch r {
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
30 case '\a':
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
31 b.WriteString(`\a`)
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
32 case '\f':
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
33 b.WriteString(`\f`)
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
34 case '\n':
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
35 b.WriteString(`\n`)
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
36 case '\r':
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
37 b.WriteString(`\r`)
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
38 case '\t':
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
39 b.WriteString(`\t`)
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
40 case '\v':
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
41 b.WriteString(`\v`)
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
42 default:
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
43 if r < 0x100 {
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
44 b.WriteString(`\x`)
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
45 s := strconv.FormatInt(int64(r), 16)
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
46 if len(s) == 1 {
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
47 b.WriteRune('0')
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
48 }
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
49 b.WriteString(s)
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
50 break
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
51 }
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
52 b.WriteString(`\u`)
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
53 b.WriteString(strconv.FormatInt(int64(r), 16))
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
54 }
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
55 }
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
56
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
57 func Unescape(input string) (string, error) {
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
58 idx := strings.IndexRune(input, '\\')
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
59 // no slashes means no unescape needed
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
60 if idx == -1 {
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
61 return input, nil
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
62 }
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
63
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
64 buf := bytes.NewBufferString(input[:idx])
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
65 // get the runes for the rest of the string -- we're going full parser scan on this
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
66
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
67 p := parser{}
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
68 p.setPattern(input[idx+1:])
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
69 for {
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
70 if p.rightMost() {
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
71 return "", p.getErr(ErrIllegalEndEscape)
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
72 }
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
73 r, err := p.scanCharEscape()
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
74 if err != nil {
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
75 return "", err
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
76 }
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
77 buf.WriteRune(r)
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
78 // are we done?
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
79 if p.rightMost() {
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
80 return buf.String(), nil
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
81 }
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
82
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
83 r = p.moveRightGetChar()
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
84 for r != '\\' {
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
85 buf.WriteRune(r)
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
86 if p.rightMost() {
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
87 // we're done, no more slashes
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
88 return buf.String(), nil
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
89 }
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
90 // keep scanning until we get another slash
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
91 r = p.moveRightGetChar()
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
92 }
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
93 }
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
94 }