github.com/hirochachacha/plua@v0.0.0-20170217012138-c82f520cc725/internal/pattern/match.go (about) 1 package pattern 2 3 import "unicode/utf8" 4 5 func simpleMatch(op opCode, r rune) bool { 6 switch op { 7 case opAny: 8 return true 9 case opLetter: 10 return isLetter(r) 11 case opControl: 12 return isControl(r) 13 case opDigit: 14 return isDigit(r) 15 case opGraphic: 16 return isGraphic(r) 17 case opLower: 18 return isLower(r) 19 case opPunct: 20 return isPunct(r) 21 case opSpace: 22 return isSpace(r) 23 case opUpper: 24 return isUpper(r) 25 case opAlphaNum: 26 return isAlphaNum(r) 27 case opHexDigit: 28 return isHexDigit(r) 29 case opZero: 30 return r == 0 31 case opNotLetter: 32 return !isLetter(r) 33 case opNotControl: 34 return !isControl(r) 35 case opNotDigit: 36 return !isDigit(r) 37 case opNotGraphic: 38 return !isGraphic(r) 39 case opNotLower: 40 return !isLower(r) 41 case opNotPunct: 42 return !isPunct(r) 43 case opNotSpace: 44 return !isSpace(r) 45 case opNotUpper: 46 return !isUpper(r) 47 case opNotAlphaNum: 48 return !isAlphaNum(r) 49 case opNotHexDigit: 50 return !isHexDigit(r) 51 case opNotZero: 52 return r != 0 53 default: 54 if 0 <= op && op <= utf8.MaxRune { 55 return rune(op) == r 56 } 57 return false 58 } 59 } 60 61 type r32 struct { 62 low int32 63 hi int32 64 } 65 66 type set struct { 67 elems []rune 68 ranges []r32 69 not bool 70 } 71 72 func (s *set) match(r rune) bool { 73 for _, e := range s.elems { 74 if simpleMatch(opCode(e), r) { 75 return !s.not 76 } 77 } 78 for _, rng := range s.ranges { 79 if rng.low <= r && r <= rng.hi { 80 return !s.not 81 } 82 } 83 return s.not 84 }