diff options
Diffstat (limited to 'thirdparty/pcre2/src/pcre2_dfa_match.c')
| -rw-r--r-- | thirdparty/pcre2/src/pcre2_dfa_match.c | 75 | 
1 files changed, 67 insertions, 8 deletions
| diff --git a/thirdparty/pcre2/src/pcre2_dfa_match.c b/thirdparty/pcre2/src/pcre2_dfa_match.c index 060dc7669a..d29130f2d0 100644 --- a/thirdparty/pcre2/src/pcre2_dfa_match.c +++ b/thirdparty/pcre2/src/pcre2_dfa_match.c @@ -7,7 +7,7 @@ and semantics are as close as possible to those of the Perl 5 language.                         Written by Philip Hazel       Original API code Copyright (c) 1997-2012 University of Cambridge -          New API code Copyright (c) 2016-2021 University of Cambridge +          New API code Copyright (c) 2016-2022 University of Cambridge  -----------------------------------------------------------------------------  Redistribution and use in source and binary forms, with or without @@ -1193,6 +1193,11 @@ for (;;)            OK = prop->script == code[2];            break; +          case PT_SCX: +          OK = (prop->script == code[2] || +                MAPBIT(PRIV(ucd_script_sets) + UCD_SCRIPTX_PROP(prop), code[2]) != 0); +          break; +            /* These are specials for combination cases. */            case PT_ALNUM: @@ -1240,6 +1245,15 @@ for (;;)                 c >= 0xe000;            break; +          case PT_BIDICL: +          OK = UCD_BIDICLASS(c) == code[2]; +          break; + +          case PT_BOOL: +          OK = MAPBIT(PRIV(ucd_boolprop_sets) + +            UCD_BPROPS_PROP(prop), code[2]) != 0; +          break; +            /* Should never occur, but keep compilers from grumbling. */            default: @@ -1451,6 +1465,11 @@ for (;;)            OK = prop->script == code[3];            break; +          case PT_SCX: +          OK = (prop->script == code[3] || +                MAPBIT(PRIV(ucd_script_sets) + UCD_SCRIPTX_PROP(prop), code[3]) != 0); +          break; +            /* These are specials for combination cases. */            case PT_ALNUM: @@ -1498,6 +1517,15 @@ for (;;)                 c >= 0xe000;            break; +          case PT_BIDICL: +          OK = UCD_BIDICLASS(c) == code[3]; +          break; + +          case PT_BOOL: +          OK = MAPBIT(PRIV(ucd_boolprop_sets) + +            UCD_BPROPS_PROP(prop), code[3]) != 0; +          break; +            /* Should never occur, but keep compilers from grumbling. */            default: @@ -1692,6 +1720,11 @@ for (;;)            OK = prop->script == code[3];            break; +          case PT_SCX: +          OK = (prop->script == code[3] || +                MAPBIT(PRIV(ucd_script_sets) + UCD_SCRIPTX_PROP(prop), code[3]) != 0); +          break; +            /* These are specials for combination cases. */            case PT_ALNUM: @@ -1739,6 +1772,15 @@ for (;;)                 c >= 0xe000;            break; +          case PT_BIDICL: +          OK = UCD_BIDICLASS(c) == code[3]; +          break; + +          case PT_BOOL: +          OK = MAPBIT(PRIV(ucd_boolprop_sets) + +            UCD_BPROPS_PROP(prop), code[3]) != 0; +          break; +            /* Should never occur, but keep compilers from grumbling. */            default: @@ -1958,6 +2000,12 @@ for (;;)            OK = prop->script == code[1 + IMM2_SIZE + 2];            break; +          case PT_SCX: +          OK = (prop->script == code[1 + IMM2_SIZE + 2] || +                MAPBIT(PRIV(ucd_script_sets) + UCD_SCRIPTX_PROP(prop), +                  code[1 + IMM2_SIZE + 2]) != 0); +          break; +            /* These are specials for combination cases. */            case PT_ALNUM: @@ -2005,6 +2053,15 @@ for (;;)                 c >= 0xe000;            break; +          case PT_BIDICL: +          OK = UCD_BIDICLASS(c) == code[1 + IMM2_SIZE + 2]; +          break; + +          case PT_BOOL: +          OK = MAPBIT(PRIV(ucd_boolprop_sets) + +            UCD_BPROPS_PROP(prop), code[1 + IMM2_SIZE + 2]) != 0; +          break; +            /* Should never occur, but keep compilers from grumbling. */            default: @@ -3285,20 +3342,22 @@ rws->next = NULL;  rws->size = RWS_BASE_SIZE;  rws->free = RWS_BASE_SIZE - RWS_ANCHOR_SIZE; -/* A length equal to PCRE2_ZERO_TERMINATED implies a zero-terminated -subject string. */ +/* Recognize NULL, length 0 as an empty string. */ -if (length == PCRE2_ZERO_TERMINATED) -  { -  length = PRIV(strlen)(subject); -  was_zero_terminated = 1; -  } +if (subject == NULL && length == 0) subject = (PCRE2_SPTR)"";  /* Plausibility checks */  if ((options & ~PUBLIC_DFA_MATCH_OPTIONS) != 0) return PCRE2_ERROR_BADOPTION;  if (re == NULL || subject == NULL || workspace == NULL || match_data == NULL)    return PCRE2_ERROR_NULL; + +if (length == PCRE2_ZERO_TERMINATED) +  { +  length = PRIV(strlen)(subject); +  was_zero_terminated = 1; +  } +  if (wscount < 20) return PCRE2_ERROR_DFA_WSSIZE;  if (start_offset > length) return PCRE2_ERROR_BADOFFSET; |