github.com/lmorg/murex@v0.0.0-20240217211045-e081c89cd4ef/builtins/core/ranges/index.go (about) 1 package ranges 2 3 import ( 4 "fmt" 5 "strconv" 6 ) 7 8 type rfIndex struct { 9 start int 10 end int 11 i int 12 } 13 14 func (rf *rfIndex) Start(_ []byte) bool { 15 rf.i++ 16 return rf.i > rf.start 17 } 18 19 func (rf *rfIndex) End(_ []byte) bool { 20 if rf.end > -1 { 21 rf.i++ 22 return rf.i > rf.end 23 } 24 return false 25 } 26 27 func (rf *rfIndex) SetLength(i int) { 28 rf.start += i + 1 29 rf.end += i + 1 30 } 31 32 func createRfIndex(r *rangeParameters) (*rfIndex, error) { 33 rf := new(rfIndex) 34 35 sStart := r.Start 36 sEnd := r.End 37 38 if sStart == "" { 39 sStart = "0" 40 } 41 42 if sEnd == "" { 43 sEnd = "-1" 44 } 45 46 var err error 47 48 rf.start, err = strconv.Atoi(sStart) 49 if err != nil { 50 return nil, fmt.Errorf("cannot convert start value to integer: %s", err.Error()) 51 } 52 53 rf.end, err = strconv.Atoi(sEnd) 54 if err != nil { 55 return nil, fmt.Errorf("cannot convert end value to integer: %s", err.Error()) 56 } 57 58 if rf.start < 0 { 59 r.Buffer = true 60 if r.End == "" { 61 rf.end = 1 62 } 63 } 64 65 if rf.start > 0 && !r.Exclude { 66 rf.end++ 67 } 68 69 return rf, nil 70 } 71 72 func newIndex(r *rangeParameters) error { 73 rf, err := createRfIndex(r) 74 if err != nil { 75 return err 76 } 77 78 rf.start-- 79 rf.end-- 80 81 r.Match = rf 82 83 return nil 84 }