@@ -3,13 +3,50 @@ package readline
3
3
import (
4
4
"bytes"
5
5
"unicode"
6
+ "unicode/utf8"
6
7
)
7
8
8
9
var runes = Runes {}
9
10
var TabWidth = 4
10
11
11
12
type Runes struct {}
12
13
14
+ func (Runes ) EqualRune (a , b rune , fold bool ) bool {
15
+ if a == b {
16
+ return true
17
+ }
18
+ if ! fold {
19
+ return false
20
+ }
21
+ if a > b {
22
+ a , b = b , a
23
+ }
24
+ if b < utf8 .RuneSelf && 'A' <= a && a <= 'Z' {
25
+ if b == a + 'a' - 'A' {
26
+ return true
27
+ }
28
+ }
29
+ return false
30
+ }
31
+
32
+ func (r Runes ) EqualRuneFold (a , b rune ) bool {
33
+ return r .EqualRune (a , b , true )
34
+ }
35
+
36
+ func (r Runes ) EqualFold (a , b []rune ) bool {
37
+ if len (a ) != len (b ) {
38
+ return false
39
+ }
40
+ for i := 0 ; i < len (a ); i ++ {
41
+ if r .EqualRuneFold (a [i ], b [i ]) {
42
+ continue
43
+ }
44
+ return false
45
+ }
46
+
47
+ return true
48
+ }
49
+
13
50
func (Runes ) Equal (a , b []rune ) bool {
14
51
if len (a ) != len (b ) {
15
52
return false
@@ -22,12 +59,11 @@ func (Runes) Equal(a, b []rune) bool {
22
59
return true
23
60
}
24
61
25
- // Search in runes from end to front
26
- func (Runes ) IndexAllBck (r , sub []rune ) int {
62
+ func (rs Runes ) IndexAllBckEx (r , sub []rune , fold bool ) int {
27
63
for i := len (r ) - len (sub ); i >= 0 ; i -- {
28
64
found := true
29
65
for j := 0 ; j < len (sub ); j ++ {
30
- if r [i + j ] != sub [j ] {
66
+ if ! rs . EqualRune ( r [i + j ], sub [j ], fold ) {
31
67
found = false
32
68
break
33
69
}
@@ -39,15 +75,24 @@ func (Runes) IndexAllBck(r, sub []rune) int {
39
75
return - 1
40
76
}
41
77
78
+ // Search in runes from end to front
79
+ func (rs Runes ) IndexAllBck (r , sub []rune ) int {
80
+ return rs .IndexAllBckEx (r , sub , false )
81
+ }
82
+
42
83
// Search in runes from front to end
43
- func (Runes ) IndexAll (r , sub []rune ) int {
84
+ func (rs Runes ) IndexAll (r , sub []rune ) int {
85
+ return rs .IndexAllEx (r , sub , false )
86
+ }
87
+
88
+ func (rs Runes ) IndexAllEx (r , sub []rune , fold bool ) int {
44
89
for i := 0 ; i < len (r ); i ++ {
45
90
found := true
46
91
if len (r [i :]) < len (sub ) {
47
92
return - 1
48
93
}
49
94
for j := 0 ; j < len (sub ); j ++ {
50
- if r [i + j ] != sub [j ] {
95
+ if ! rs . EqualRune ( r [i + j ], sub [j ], fold ) {
51
96
found = false
52
97
break
53
98
}
@@ -128,6 +173,13 @@ func (Runes) Copy(r []rune) []rune {
128
173
return n
129
174
}
130
175
176
+ func (Runes ) HasPrefixFold (r , prefix []rune ) bool {
177
+ if len (r ) < len (prefix ) {
178
+ return false
179
+ }
180
+ return runes .EqualFold (r [:len (prefix )], prefix )
181
+ }
182
+
131
183
func (Runes ) HasPrefix (r , prefix []rune ) bool {
132
184
if len (r ) < len (prefix ) {
133
185
return false
0 commit comments