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  }