(code, pattern, flags)
| 37 | return (flags | add_flags) & ~del_flags |
| 38 | |
| 39 | def _compile(code, pattern, flags): |
| 40 | # internal: compile a (sub)pattern |
| 41 | emit = code.append |
| 42 | _len = len |
| 43 | LITERAL_CODES = _LITERAL_CODES |
| 44 | REPEATING_CODES = _REPEATING_CODES |
| 45 | SUCCESS_CODES = _SUCCESS_CODES |
| 46 | ASSERT_CODES = _ASSERT_CODES |
| 47 | iscased = None |
| 48 | tolower = None |
| 49 | fixes = None |
| 50 | if flags & SRE_FLAG_IGNORECASE and not flags & SRE_FLAG_LOCALE: |
| 51 | if flags & SRE_FLAG_UNICODE: |
| 52 | iscased = _sre.unicode_iscased |
| 53 | tolower = _sre.unicode_tolower |
| 54 | fixes = _EXTRA_CASES |
| 55 | else: |
| 56 | iscased = _sre.ascii_iscased |
| 57 | tolower = _sre.ascii_tolower |
| 58 | for op, av in pattern: |
| 59 | if op in LITERAL_CODES: |
| 60 | if not flags & SRE_FLAG_IGNORECASE: |
| 61 | emit(op) |
| 62 | emit(av) |
| 63 | elif flags & SRE_FLAG_LOCALE: |
| 64 | emit(OP_LOCALE_IGNORE[op]) |
| 65 | emit(av) |
| 66 | elif not iscased(av): |
| 67 | emit(op) |
| 68 | emit(av) |
| 69 | else: |
| 70 | lo = tolower(av) |
| 71 | if not fixes: # ascii |
| 72 | emit(OP_IGNORE[op]) |
| 73 | emit(lo) |
| 74 | elif lo not in fixes: |
| 75 | emit(OP_UNICODE_IGNORE[op]) |
| 76 | emit(lo) |
| 77 | else: |
| 78 | emit(IN_UNI_IGNORE) |
| 79 | skip = _len(code); emit(0) |
| 80 | if op is NOT_LITERAL: |
| 81 | emit(NEGATE) |
| 82 | for k in (lo,) + fixes[lo]: |
| 83 | emit(LITERAL) |
| 84 | emit(k) |
| 85 | emit(FAILURE) |
| 86 | code[skip] = _len(code) - skip |
| 87 | elif op is IN: |
| 88 | charset, hascased = _optimize_charset(av, iscased, tolower, fixes) |
| 89 | if not charset: |
| 90 | emit(FAILURE) |
| 91 | elif charset == _CHARSET_ALL: |
| 92 | emit(ANY_ALL) |
| 93 | else: |
| 94 | if flags & SRE_FLAG_IGNORECASE and flags & SRE_FLAG_LOCALE: |
| 95 | emit(IN_LOC_IGNORE) |
| 96 | elif not hascased: |
no test coverage detected
searching dependent graphs…