(pattern, flags)
| 479 | return prefix, prefix_skip, False |
| 480 | |
| 481 | def _get_charset_prefix(pattern, flags): |
| 482 | while True: |
| 483 | if not pattern.data: |
| 484 | return None |
| 485 | op, av = pattern.data[0] |
| 486 | if op is not SUBPATTERN: |
| 487 | break |
| 488 | group, add_flags, del_flags, pattern = av |
| 489 | flags = _combine_flags(flags, add_flags, del_flags) |
| 490 | if flags & SRE_FLAG_IGNORECASE and flags & SRE_FLAG_LOCALE: |
| 491 | return None |
| 492 | |
| 493 | iscased = _get_iscased(flags) |
| 494 | if op is LITERAL: |
| 495 | if iscased and iscased(av): |
| 496 | return None |
| 497 | return [(op, av)] |
| 498 | elif op is BRANCH: |
| 499 | charset = [] |
| 500 | charsetappend = charset.append |
| 501 | for p in av[1]: |
| 502 | if not p: |
| 503 | return None |
| 504 | op, av = p[0] |
| 505 | if op is LITERAL and not (iscased and iscased(av)): |
| 506 | charsetappend((op, av)) |
| 507 | else: |
| 508 | return None |
| 509 | return charset |
| 510 | elif op is IN: |
| 511 | charset = av |
| 512 | if iscased: |
| 513 | for op, av in charset: |
| 514 | if op is LITERAL: |
| 515 | if iscased(av): |
| 516 | return None |
| 517 | elif op is RANGE: |
| 518 | if av[1] > 0xffff: |
| 519 | return None |
| 520 | if any(map(iscased, range(av[0], av[1]+1))): |
| 521 | return None |
| 522 | return charset |
| 523 | return None |
| 524 | |
| 525 | def _compile_info(code, pattern, flags): |
| 526 | # internal: compile an info block. in the current version, |
no test coverage detected
searching dependent graphs…