Diff for /embedaddon/pcre/pcre_dfa_exec.c between versions 1.1.1.3 and 1.1.1.4

version 1.1.1.3, 2012/10/09 09:19:17 version 1.1.1.4, 2013/07/22 08:25:55
Line 7  and semantics are as close as possible to those of the Line 7  and semantics are as close as possible to those of the
 below for why this module is different).  below for why this module is different).
   
                        Written by Philip Hazel                         Written by Philip Hazel
           Copyright (c) 1997-2012 University of Cambridge           Copyright (c) 1997-2013 University of Cambridge
   
 -----------------------------------------------------------------------------  -----------------------------------------------------------------------------
 Redistribution and use in source and binary forms, with or without  Redistribution and use in source and binary forms, with or without
Line 302  Returns:       nothing Line 302  Returns:       nothing
 static void  static void
 pchars(const pcre_uchar *p, int length, FILE *f)  pchars(const pcre_uchar *p, int length, FILE *f)
 {  {
int c;pcre_uint32 c;
 while (length-- > 0)  while (length-- > 0)
   {    {
   if (isprint(c = *(p++)))    if (isprint(c = *(p++)))
     fprintf(f, "%c", c);      fprintf(f, "%c", c);
   else    else
    fprintf(f, "\\x%02x", c);    fprintf(f, "\\x{%02x}", c);
   }    }
 }  }
 #endif  #endif
Line 571  for (;;) Line 571  for (;;)
   {    {
   int i, j;    int i, j;
   int clen, dlen;    int clen, dlen;
  unsigned int c, d;  pcre_uint32 c, d;
   int forced_fail = 0;    int forced_fail = 0;
   BOOL partial_newline = FALSE;    BOOL partial_newline = FALSE;
   BOOL could_continue = reset_could_continue;    BOOL could_continue = reset_could_continue;
Line 613  for (;;) Line 613  for (;;)
     {      {
     clen = 1;        /* Number of data items in the character */      clen = 1;        /* Number of data items in the character */
 #ifdef SUPPORT_UTF  #ifdef SUPPORT_UTF
    if (utf) { GETCHARLEN(c, ptr, clen); } else    GETCHARLENTEST(c, ptr, clen);
#endif  /* SUPPORT_UTF */#else
     c = *ptr;      c = *ptr;
   #endif  /* SUPPORT_UTF */
     }      }
   else    else
     {      {
Line 634  for (;;) Line 635  for (;;)
     BOOL caseless = FALSE;      BOOL caseless = FALSE;
     const pcre_uchar *code;      const pcre_uchar *code;
     int state_offset = current_state->offset;      int state_offset = current_state->offset;
    int count, codevalue, rrc;    int codevalue, rrc;
     int count;
   
 #ifdef PCRE_DEBUG  #ifdef PCRE_DEBUG
     printf ("%.*sProcessing state %d c=", rlevel*2-2, SP, state_offset);      printf ("%.*sProcessing state %d c=", rlevel*2-2, SP, state_offset);
Line 1007  for (;;) Line 1009  for (;;)
           {            {
           const pcre_uchar *temp = ptr - 1;            const pcre_uchar *temp = ptr - 1;
           if (temp < md->start_used_ptr) md->start_used_ptr = temp;            if (temp < md->start_used_ptr) md->start_used_ptr = temp;
#ifdef SUPPORT_UTF#if defined SUPPORT_UTF && !defined COMPILE_PCRE32
           if (utf) { BACKCHAR(temp); }            if (utf) { BACKCHAR(temp); }
 #endif  #endif
           GETCHARTEST(d, temp);            GETCHARTEST(d, temp);
Line 1060  for (;;) Line 1062  for (;;)
       if (clen > 0)        if (clen > 0)
         {          {
         BOOL OK;          BOOL OK;
           const pcre_uint32 *cp;
         const ucd_record * prop = GET_UCD(c);          const ucd_record * prop = GET_UCD(c);
         switch(code[1])          switch(code[1])
           {            {
Line 1108  for (;;) Line 1111  for (;;)
                c == CHAR_UNDERSCORE;                 c == CHAR_UNDERSCORE;
           break;            break;
   
             case PT_CLIST:
             cp = PRIV(ucd_caseless_sets) + code[2];
             for (;;)
               {
               if (c < *cp) { OK = FALSE; break; }
               if (c == *cp++) { OK = TRUE; break; }
               }
             break;
   
             case PT_UCNC:
             OK = c == CHAR_DOLLAR_SIGN || c == CHAR_COMMERCIAL_AT ||
                  c == CHAR_GRAVE_ACCENT || (c >= 0xa0 && c <= 0xd7ff) ||
                  c >= 0xe000;
             break;
   
           /* Should never occur, but keep compilers from grumbling. */            /* Should never occur, but keep compilers from grumbling. */
   
           default:            default:
Line 1237  for (;;) Line 1255  for (;;)
               (d != OP_ANY || !IS_NEWLINE(ptr)) &&                (d != OP_ANY || !IS_NEWLINE(ptr)) &&
               ((ctypes[c] & toptable1[d]) ^ toptable2[d]) != 0))                ((ctypes[c] & toptable1[d]) ^ toptable2[d]) != 0))
           {            {
          if (++count >= GET2(code, 1))          if (++count >= (int)GET2(code, 1))
             { ADD_NEW(state_offset + 1 + IMM2_SIZE + 1, 0); }              { ADD_NEW(state_offset + 1 + IMM2_SIZE + 1, 0); }
           else            else
             { ADD_NEW(state_offset, count); }              { ADD_NEW(state_offset, count); }
Line 1271  for (;;) Line 1289  for (;;)
             active_count--;           /* Remove non-match possibility */              active_count--;           /* Remove non-match possibility */
             next_active_state--;              next_active_state--;
             }              }
          if (++count >= GET2(code, 1))          if (++count >= (int)GET2(code, 1))
             { ADD_NEW(state_offset + 2 + IMM2_SIZE, 0); }              { ADD_NEW(state_offset + 2 + IMM2_SIZE, 0); }
           else            else
             { ADD_NEW(state_offset, count); }              { ADD_NEW(state_offset, count); }
Line 1294  for (;;) Line 1312  for (;;)
       if (clen > 0)        if (clen > 0)
         {          {
         BOOL OK;          BOOL OK;
           const pcre_uint32 *cp;
         const ucd_record * prop = GET_UCD(c);          const ucd_record * prop = GET_UCD(c);
         switch(code[2])          switch(code[2])
           {            {
Line 1342  for (;;) Line 1361  for (;;)
                c == CHAR_UNDERSCORE;                 c == CHAR_UNDERSCORE;
           break;            break;
   
             case PT_CLIST:
             cp = PRIV(ucd_caseless_sets) + code[3];
             for (;;)
               {
               if (c < *cp) { OK = FALSE; break; }
               if (c == *cp++) { OK = TRUE; break; }
               }
             break;
   
             case PT_UCNC:
             OK = c == CHAR_DOLLAR_SIGN || c == CHAR_COMMERCIAL_AT ||
                  c == CHAR_GRAVE_ACCENT || (c >= 0xa0 && c <= 0xd7ff) ||
                  c >= 0xe000;
             break;
   
           /* Should never occur, but keep compilers from grumbling. */            /* Should never occur, but keep compilers from grumbling. */
   
           default:            default:
Line 1368  for (;;) Line 1402  for (;;)
       case OP_EXTUNI_EXTRA + OP_TYPEPOSPLUS:        case OP_EXTUNI_EXTRA + OP_TYPEPOSPLUS:
       count = current_state->count;  /* Already matched */        count = current_state->count;  /* Already matched */
       if (count > 0) { ADD_ACTIVE(state_offset + 2, 0); }        if (count > 0) { ADD_ACTIVE(state_offset + 2, 0); }
      if (clen > 0 && UCD_CATEGORY(c) != ucp_M)      if (clen > 0)
         {          {
           int lgb, rgb;
         const pcre_uchar *nptr = ptr + clen;          const pcre_uchar *nptr = ptr + clen;
         int ncount = 0;          int ncount = 0;
         if (count > 0 && codevalue == OP_EXTUNI_EXTRA + OP_TYPEPOSPLUS)          if (count > 0 && codevalue == OP_EXTUNI_EXTRA + OP_TYPEPOSPLUS)
Line 1377  for (;;) Line 1412  for (;;)
           active_count--;           /* Remove non-match possibility */            active_count--;           /* Remove non-match possibility */
           next_active_state--;            next_active_state--;
           }            }
           lgb = UCD_GRAPHBREAK(c);
         while (nptr < end_subject)          while (nptr < end_subject)
           {            {
          int nd;          dlen = 1;
          int ndlen = 1;          if (!utf) d = *nptr; else { GETCHARLEN(d, nptr, dlen); }
          GETCHARLEN(nd, nptr, ndlen);          rgb = UCD_GRAPHBREAK(d);
          if (UCD_CATEGORY(nd) != ucp_M) break;          if ((PRIV(ucp_gbtable)[lgb] & (1 << rgb)) == 0) break;
           ncount++;            ncount++;
          nptr += ndlen;          lgb = rgb;
           nptr += dlen;
           }            }
         count++;          count++;
         ADD_NEW_DATA(-state_offset, count, ncount);          ADD_NEW_DATA(-state_offset, count, ncount);
Line 1403  for (;;) Line 1440  for (;;)
         int ncount = 0;          int ncount = 0;
         switch (c)          switch (c)
           {            {
          case 0x000b:          case CHAR_VT:
          case 0x000c:          case CHAR_FF:
          case 0x0085:          case CHAR_NEL:
 #ifndef EBCDIC
           case 0x2028:            case 0x2028:
           case 0x2029:            case 0x2029:
   #endif  /* Not EBCDIC */
           if ((md->moptions & PCRE_BSR_ANYCRLF) != 0) break;            if ((md->moptions & PCRE_BSR_ANYCRLF) != 0) break;
           goto ANYNL01;            goto ANYNL01;
   
          case 0x000d:          case CHAR_CR:
          if (ptr + 1 < end_subject && ptr[1] == 0x0a) ncount = 1;          if (ptr + 1 < end_subject && RAWUCHARTEST(ptr + 1) == CHAR_LF) ncount = 1;
           /* Fall through */            /* Fall through */
   
           ANYNL01:            ANYNL01:
          case 0x000a:          case CHAR_LF:
           if (count > 0 && codevalue == OP_ANYNL_EXTRA + OP_TYPEPOSPLUS)            if (count > 0 && codevalue == OP_ANYNL_EXTRA + OP_TYPEPOSPLUS)
             {              {
             active_count--;           /* Remove non-match possibility */              active_count--;           /* Remove non-match possibility */
Line 1443  for (;;) Line 1482  for (;;)
         BOOL OK;          BOOL OK;
         switch (c)          switch (c)
           {            {
          case 0x000a:          VSPACE_CASES:
          case 0x000b: 
          case 0x000c: 
          case 0x000d: 
          case 0x0085: 
          case 0x2028: 
          case 0x2029: 
           OK = TRUE;            OK = TRUE;
           break;            break;
   
Line 1482  for (;;) Line 1515  for (;;)
         BOOL OK;          BOOL OK;
         switch (c)          switch (c)
           {            {
          case 0x09:      /* HT */          HSPACE_CASES:
          case 0x20:      /* SPACE */ 
          case 0xa0:      /* NBSP */ 
          case 0x1680:    /* OGHAM SPACE MARK */ 
          case 0x180e:    /* MONGOLIAN VOWEL SEPARATOR */ 
          case 0x2000:    /* EN QUAD */ 
          case 0x2001:    /* EM QUAD */ 
          case 0x2002:    /* EN SPACE */ 
          case 0x2003:    /* EM SPACE */ 
          case 0x2004:    /* THREE-PER-EM SPACE */ 
          case 0x2005:    /* FOUR-PER-EM SPACE */ 
          case 0x2006:    /* SIX-PER-EM SPACE */ 
          case 0x2007:    /* FIGURE SPACE */ 
          case 0x2008:    /* PUNCTUATION SPACE */ 
          case 0x2009:    /* THIN SPACE */ 
          case 0x200A:    /* HAIR SPACE */ 
          case 0x202f:    /* NARROW NO-BREAK SPACE */ 
          case 0x205f:    /* MEDIUM MATHEMATICAL SPACE */ 
          case 0x3000:    /* IDEOGRAPHIC SPACE */ 
           OK = TRUE;            OK = TRUE;
           break;            break;
   
Line 1541  for (;;) Line 1556  for (;;)
       if (clen > 0)        if (clen > 0)
         {          {
         BOOL OK;          BOOL OK;
           const pcre_uint32 *cp;
         const ucd_record * prop = GET_UCD(c);          const ucd_record * prop = GET_UCD(c);
         switch(code[2])          switch(code[2])
           {            {
Line 1589  for (;;) Line 1605  for (;;)
                c == CHAR_UNDERSCORE;                 c == CHAR_UNDERSCORE;
           break;            break;
   
             case PT_CLIST:
             cp = PRIV(ucd_caseless_sets) + code[3];
             for (;;)
               {
               if (c < *cp) { OK = FALSE; break; }
               if (c == *cp++) { OK = TRUE; break; }
               }
             break;
   
             case PT_UCNC:
             OK = c == CHAR_DOLLAR_SIGN || c == CHAR_COMMERCIAL_AT ||
                  c == CHAR_GRAVE_ACCENT || (c >= 0xa0 && c <= 0xd7ff) ||
                  c >= 0xe000;
             break;
   
           /* Should never occur, but keep compilers from grumbling. */            /* Should never occur, but keep compilers from grumbling. */
   
           default:            default:
Line 1624  for (;;) Line 1655  for (;;)
       QS2:        QS2:
   
       ADD_ACTIVE(state_offset + 2, 0);        ADD_ACTIVE(state_offset + 2, 0);
      if (clen > 0 && UCD_CATEGORY(c) != ucp_M)      if (clen > 0)
         {          {
           int lgb, rgb;
         const pcre_uchar *nptr = ptr + clen;          const pcre_uchar *nptr = ptr + clen;
         int ncount = 0;          int ncount = 0;
         if (codevalue == OP_EXTUNI_EXTRA + OP_TYPEPOSSTAR ||          if (codevalue == OP_EXTUNI_EXTRA + OP_TYPEPOSSTAR ||
Line 1634  for (;;) Line 1666  for (;;)
           active_count--;           /* Remove non-match possibility */            active_count--;           /* Remove non-match possibility */
           next_active_state--;            next_active_state--;
           }            }
           lgb = UCD_GRAPHBREAK(c);
         while (nptr < end_subject)          while (nptr < end_subject)
           {            {
          int nd;          dlen = 1;
          int ndlen = 1;          if (!utf) d = *nptr; else { GETCHARLEN(d, nptr, dlen); }
          GETCHARLEN(nd, nptr, ndlen);          rgb = UCD_GRAPHBREAK(d);
          if (UCD_CATEGORY(nd) != ucp_M) break;          if ((PRIV(ucp_gbtable)[lgb] & (1 << rgb)) == 0) break;
           ncount++;            ncount++;
          nptr += ndlen;          lgb = rgb;
           nptr += dlen;
           }            }
         ADD_NEW_DATA(-(state_offset + count), 0, ncount);          ADD_NEW_DATA(-(state_offset + count), 0, ncount);
         }          }
Line 1667  for (;;) Line 1701  for (;;)
         int ncount = 0;          int ncount = 0;
         switch (c)          switch (c)
           {            {
          case 0x000b:          case CHAR_VT:
          case 0x000c:          case CHAR_FF:
          case 0x0085:          case CHAR_NEL:
 #ifndef EBCDIC
           case 0x2028:            case 0x2028:
           case 0x2029:            case 0x2029:
   #endif  /* Not EBCDIC */
           if ((md->moptions & PCRE_BSR_ANYCRLF) != 0) break;            if ((md->moptions & PCRE_BSR_ANYCRLF) != 0) break;
           goto ANYNL02;            goto ANYNL02;
   
          case 0x000d:          case CHAR_CR:
          if (ptr + 1 < end_subject && ptr[1] == 0x0a) ncount = 1;          if (ptr + 1 < end_subject && RAWUCHARTEST(ptr + 1) == CHAR_LF) ncount = 1;
           /* Fall through */            /* Fall through */
   
           ANYNL02:            ANYNL02:
          case 0x000a:          case CHAR_LF:
           if (codevalue == OP_ANYNL_EXTRA + OP_TYPEPOSSTAR ||            if (codevalue == OP_ANYNL_EXTRA + OP_TYPEPOSSTAR ||
               codevalue == OP_ANYNL_EXTRA + OP_TYPEPOSQUERY)                codevalue == OP_ANYNL_EXTRA + OP_TYPEPOSQUERY)
             {              {
             active_count--;           /* Remove non-match possibility */              active_count--;           /* Remove non-match possibility */
             next_active_state--;              next_active_state--;
             }              }
          ADD_NEW_DATA(-(state_offset + count), 0, ncount);          ADD_NEW_DATA(-(state_offset + (int)count), 0, ncount);
           break;            break;
   
           default:            default:
Line 1715  for (;;) Line 1751  for (;;)
         BOOL OK;          BOOL OK;
         switch (c)          switch (c)
           {            {
          case 0x000a:          VSPACE_CASES:
          case 0x000b: 
          case 0x000c: 
          case 0x000d: 
          case 0x0085: 
          case 0x2028: 
          case 0x2029: 
           OK = TRUE;            OK = TRUE;
           break;            break;
   
Line 1737  for (;;) Line 1767  for (;;)
             active_count--;           /* Remove non-match possibility */              active_count--;           /* Remove non-match possibility */
             next_active_state--;              next_active_state--;
             }              }
          ADD_NEW_DATA(-(state_offset + count), 0, 0);          ADD_NEW_DATA(-(state_offset + (int)count), 0, 0);
           }            }
         }          }
       break;        break;
Line 1761  for (;;) Line 1791  for (;;)
         BOOL OK;          BOOL OK;
         switch (c)          switch (c)
           {            {
          case 0x09:      /* HT */          HSPACE_CASES:
          case 0x20:      /* SPACE */ 
          case 0xa0:      /* NBSP */ 
          case 0x1680:    /* OGHAM SPACE MARK */ 
          case 0x180e:    /* MONGOLIAN VOWEL SEPARATOR */ 
          case 0x2000:    /* EN QUAD */ 
          case 0x2001:    /* EM QUAD */ 
          case 0x2002:    /* EN SPACE */ 
          case 0x2003:    /* EM SPACE */ 
          case 0x2004:    /* THREE-PER-EM SPACE */ 
          case 0x2005:    /* FOUR-PER-EM SPACE */ 
          case 0x2006:    /* SIX-PER-EM SPACE */ 
          case 0x2007:    /* FIGURE SPACE */ 
          case 0x2008:    /* PUNCTUATION SPACE */ 
          case 0x2009:    /* THIN SPACE */ 
          case 0x200A:    /* HAIR SPACE */ 
          case 0x202f:    /* NARROW NO-BREAK SPACE */ 
          case 0x205f:    /* MEDIUM MATHEMATICAL SPACE */ 
          case 0x3000:    /* IDEOGRAPHIC SPACE */ 
           OK = TRUE;            OK = TRUE;
           break;            break;
   
Line 1796  for (;;) Line 1808  for (;;)
             active_count--;           /* Remove non-match possibility */              active_count--;           /* Remove non-match possibility */
             next_active_state--;              next_active_state--;
             }              }
          ADD_NEW_DATA(-(state_offset + count), 0, 0);          ADD_NEW_DATA(-(state_offset + (int)count), 0, 0);
           }            }
         }          }
       break;        break;
Line 1813  for (;;) Line 1825  for (;;)
       if (clen > 0)        if (clen > 0)
         {          {
         BOOL OK;          BOOL OK;
           const pcre_uint32 *cp;
         const ucd_record * prop = GET_UCD(c);          const ucd_record * prop = GET_UCD(c);
         switch(code[1 + IMM2_SIZE + 1])          switch(code[1 + IMM2_SIZE + 1])
           {            {
Line 1861  for (;;) Line 1874  for (;;)
                c == CHAR_UNDERSCORE;                 c == CHAR_UNDERSCORE;
           break;            break;
   
             case PT_CLIST:
             cp = PRIV(ucd_caseless_sets) + code[1 + IMM2_SIZE + 2];
             for (;;)
               {
               if (c < *cp) { OK = FALSE; break; }
               if (c == *cp++) { OK = TRUE; break; }
               }
             break;
   
             case PT_UCNC:
             OK = c == CHAR_DOLLAR_SIGN || c == CHAR_COMMERCIAL_AT ||
                  c == CHAR_GRAVE_ACCENT || (c >= 0xa0 && c <= 0xd7ff) ||
                  c >= 0xe000;
             break;
   
           /* Should never occur, but keep compilers from grumbling. */            /* Should never occur, but keep compilers from grumbling. */
   
           default:            default:
Line 1875  for (;;) Line 1903  for (;;)
             active_count--;           /* Remove non-match possibility */              active_count--;           /* Remove non-match possibility */
             next_active_state--;              next_active_state--;
             }              }
          if (++count >= GET2(code, 1))          if (++count >= (int)GET2(code, 1))
             { ADD_NEW(state_offset + 1 + IMM2_SIZE + 3, 0); }              { ADD_NEW(state_offset + 1 + IMM2_SIZE + 3, 0); }
           else            else
             { ADD_NEW(state_offset, count); }              { ADD_NEW(state_offset, count); }
Line 1891  for (;;) Line 1919  for (;;)
       if (codevalue != OP_EXTUNI_EXTRA + OP_TYPEEXACT)        if (codevalue != OP_EXTUNI_EXTRA + OP_TYPEEXACT)
         { ADD_ACTIVE(state_offset + 2 + IMM2_SIZE, 0); }          { ADD_ACTIVE(state_offset + 2 + IMM2_SIZE, 0); }
       count = current_state->count;  /* Number already matched */        count = current_state->count;  /* Number already matched */
      if (clen > 0 && UCD_CATEGORY(c) != ucp_M)      if (clen > 0)
         {          {
           int lgb, rgb;
         const pcre_uchar *nptr = ptr + clen;          const pcre_uchar *nptr = ptr + clen;
         int ncount = 0;          int ncount = 0;
         if (codevalue == OP_EXTUNI_EXTRA + OP_TYPEPOSUPTO)          if (codevalue == OP_EXTUNI_EXTRA + OP_TYPEPOSUPTO)
Line 1900  for (;;) Line 1929  for (;;)
           active_count--;           /* Remove non-match possibility */            active_count--;           /* Remove non-match possibility */
           next_active_state--;            next_active_state--;
           }            }
           lgb = UCD_GRAPHBREAK(c);
         while (nptr < end_subject)          while (nptr < end_subject)
           {            {
          int nd;          dlen = 1;
          int ndlen = 1;          if (!utf) d = *nptr; else { GETCHARLEN(d, nptr, dlen); }
          GETCHARLEN(nd, nptr, ndlen);          rgb = UCD_GRAPHBREAK(d);
          if (UCD_CATEGORY(nd) != ucp_M) break;          if ((PRIV(ucp_gbtable)[lgb] & (1 << rgb)) == 0) break;
           ncount++;            ncount++;
          nptr += ndlen;          lgb = rgb;
           nptr += dlen;
           }            }
         if (nptr >= end_subject && (md->moptions & PCRE_PARTIAL_HARD) != 0)          if (nptr >= end_subject && (md->moptions & PCRE_PARTIAL_HARD) != 0)
             reset_could_continue = TRUE;              reset_could_continue = TRUE;
        if (++count >= GET2(code, 1))        if (++count >= (int)GET2(code, 1))
           { ADD_NEW_DATA(-(state_offset + 2 + IMM2_SIZE), 0, ncount); }            { ADD_NEW_DATA(-(state_offset + 2 + IMM2_SIZE), 0, ncount); }
         else          else
           { ADD_NEW_DATA(-state_offset, count, ncount); }            { ADD_NEW_DATA(-state_offset, count, ncount); }
Line 1932  for (;;) Line 1963  for (;;)
         int ncount = 0;          int ncount = 0;
         switch (c)          switch (c)
           {            {
          case 0x000b:          case CHAR_VT:
          case 0x000c:          case CHAR_FF:
          case 0x0085:          case CHAR_NEL:
 #ifndef EBCDIC
           case 0x2028:            case 0x2028:
           case 0x2029:            case 0x2029:
   #endif  /* Not EBCDIC */
           if ((md->moptions & PCRE_BSR_ANYCRLF) != 0) break;            if ((md->moptions & PCRE_BSR_ANYCRLF) != 0) break;
           goto ANYNL03;            goto ANYNL03;
   
          case 0x000d:          case CHAR_CR:
          if (ptr + 1 < end_subject && ptr[1] == 0x0a) ncount = 1;          if (ptr + 1 < end_subject && RAWUCHARTEST(ptr + 1) == CHAR_LF) ncount = 1;
           /* Fall through */            /* Fall through */
   
           ANYNL03:            ANYNL03:
          case 0x000a:          case CHAR_LF:
           if (codevalue == OP_ANYNL_EXTRA + OP_TYPEPOSUPTO)            if (codevalue == OP_ANYNL_EXTRA + OP_TYPEPOSUPTO)
             {              {
             active_count--;           /* Remove non-match possibility */              active_count--;           /* Remove non-match possibility */
             next_active_state--;              next_active_state--;
             }              }
          if (++count >= GET2(code, 1))          if (++count >= (int)GET2(code, 1))
             { ADD_NEW_DATA(-(state_offset + 2 + IMM2_SIZE), 0, ncount); }              { ADD_NEW_DATA(-(state_offset + 2 + IMM2_SIZE), 0, ncount); }
           else            else
             { ADD_NEW_DATA(-state_offset, count, ncount); }              { ADD_NEW_DATA(-state_offset, count, ncount); }
Line 1976  for (;;) Line 2009  for (;;)
         BOOL OK;          BOOL OK;
         switch (c)          switch (c)
           {            {
          case 0x000a:          VSPACE_CASES:
          case 0x000b: 
          case 0x000c: 
          case 0x000d: 
          case 0x0085: 
          case 0x2028: 
          case 0x2029: 
           OK = TRUE;            OK = TRUE;
           break;            break;
   
Line 1997  for (;;) Line 2024  for (;;)
             active_count--;           /* Remove non-match possibility */              active_count--;           /* Remove non-match possibility */
             next_active_state--;              next_active_state--;
             }              }
          if (++count >= GET2(code, 1))          if (++count >= (int)GET2(code, 1))
             { ADD_NEW_DATA(-(state_offset + 2 + IMM2_SIZE), 0, 0); }              { ADD_NEW_DATA(-(state_offset + 2 + IMM2_SIZE), 0, 0); }
           else            else
             { ADD_NEW_DATA(-state_offset, count, 0); }              { ADD_NEW_DATA(-state_offset, count, 0); }
Line 2018  for (;;) Line 2045  for (;;)
         BOOL OK;          BOOL OK;
         switch (c)          switch (c)
           {            {
          case 0x09:      /* HT */          HSPACE_CASES:
          case 0x20:      /* SPACE */ 
          case 0xa0:      /* NBSP */ 
          case 0x1680:    /* OGHAM SPACE MARK */ 
          case 0x180e:    /* MONGOLIAN VOWEL SEPARATOR */ 
          case 0x2000:    /* EN QUAD */ 
          case 0x2001:    /* EM QUAD */ 
          case 0x2002:    /* EN SPACE */ 
          case 0x2003:    /* EM SPACE */ 
          case 0x2004:    /* THREE-PER-EM SPACE */ 
          case 0x2005:    /* FOUR-PER-EM SPACE */ 
          case 0x2006:    /* SIX-PER-EM SPACE */ 
          case 0x2007:    /* FIGURE SPACE */ 
          case 0x2008:    /* PUNCTUATION SPACE */ 
          case 0x2009:    /* THIN SPACE */ 
          case 0x200A:    /* HAIR SPACE */ 
          case 0x202f:    /* NARROW NO-BREAK SPACE */ 
          case 0x205f:    /* MEDIUM MATHEMATICAL SPACE */ 
          case 0x3000:    /* IDEOGRAPHIC SPACE */ 
           OK = TRUE;            OK = TRUE;
           break;            break;
   
Line 2052  for (;;) Line 2061  for (;;)
             active_count--;           /* Remove non-match possibility */              active_count--;           /* Remove non-match possibility */
             next_active_state--;              next_active_state--;
             }              }
          if (++count >= GET2(code, 1))          if (++count >= (int)GET2(code, 1))
             { ADD_NEW_DATA(-(state_offset + 2 + IMM2_SIZE), 0, 0); }              { ADD_NEW_DATA(-(state_offset + 2 + IMM2_SIZE), 0, 0); }
           else            else
             { ADD_NEW_DATA(-state_offset, count, 0); }              { ADD_NEW_DATA(-state_offset, count, 0); }
Line 2112  for (;;) Line 2121  for (;;)
       to wait for them to pass before continuing. */        to wait for them to pass before continuing. */
   
       case OP_EXTUNI:        case OP_EXTUNI:
      if (clen > 0 && UCD_CATEGORY(c) != ucp_M)      if (clen > 0)
         {          {
           int lgb, rgb;
         const pcre_uchar *nptr = ptr + clen;          const pcre_uchar *nptr = ptr + clen;
         int ncount = 0;          int ncount = 0;
           lgb = UCD_GRAPHBREAK(c);
         while (nptr < end_subject)          while (nptr < end_subject)
           {            {
          int nclen = 1;          dlen = 1;
          GETCHARLEN(c, nptr, nclen);          if (!utf) d = *nptr; else { GETCHARLEN(d, nptr, dlen); }
          if (UCD_CATEGORY(c) != ucp_M) break;          rgb = UCD_GRAPHBREAK(d);
           if ((PRIV(ucp_gbtable)[lgb] & (1 << rgb)) == 0) break;
           ncount++;            ncount++;
          nptr += nclen;          lgb = rgb;
           nptr += dlen;
           }            }
         if (nptr >= end_subject && (md->moptions & PCRE_PARTIAL_HARD) != 0)          if (nptr >= end_subject && (md->moptions & PCRE_PARTIAL_HARD) != 0)
             reset_could_continue = TRUE;              reset_could_continue = TRUE;
Line 2139  for (;;) Line 2152  for (;;)
       case OP_ANYNL:        case OP_ANYNL:
       if (clen > 0) switch(c)        if (clen > 0) switch(c)
         {          {
        case 0x000b:        case CHAR_VT:
        case 0x000c:        case CHAR_FF:
        case 0x0085:        case CHAR_NEL:
 #ifndef EBCDIC
         case 0x2028:          case 0x2028:
         case 0x2029:          case 0x2029:
   #endif  /* Not EBCDIC */
         if ((md->moptions & PCRE_BSR_ANYCRLF) != 0) break;          if ((md->moptions & PCRE_BSR_ANYCRLF) != 0) break;
   
        case 0x000a:        case CHAR_LF:
         ADD_NEW(state_offset + 1, 0);          ADD_NEW(state_offset + 1, 0);
         break;          break;
   
        case 0x000d:        case CHAR_CR:
         if (ptr + 1 >= end_subject)          if (ptr + 1 >= end_subject)
           {            {
           ADD_NEW(state_offset + 1, 0);            ADD_NEW(state_offset + 1, 0);
           if ((md->moptions & PCRE_PARTIAL_HARD) != 0)            if ((md->moptions & PCRE_PARTIAL_HARD) != 0)
             reset_could_continue = TRUE;              reset_could_continue = TRUE;
           }            }
        else if (ptr[1] == 0x0a)        else if (RAWUCHARTEST(ptr + 1) == CHAR_LF)
           {            {
           ADD_NEW_DATA(-(state_offset + 1), 0, 1);            ADD_NEW_DATA(-(state_offset + 1), 0, 1);
           }            }
Line 2173  for (;;) Line 2188  for (;;)
       case OP_NOT_VSPACE:        case OP_NOT_VSPACE:
       if (clen > 0) switch(c)        if (clen > 0) switch(c)
         {          {
        case 0x000a:        VSPACE_CASES:
        case 0x000b: 
        case 0x000c: 
        case 0x000d: 
        case 0x0085: 
        case 0x2028: 
        case 0x2029: 
         break;          break;
   
         default:          default:
Line 2192  for (;;) Line 2201  for (;;)
       case OP_VSPACE:        case OP_VSPACE:
       if (clen > 0) switch(c)        if (clen > 0) switch(c)
         {          {
        case 0x000a:        VSPACE_CASES:
        case 0x000b: 
        case 0x000c: 
        case 0x000d: 
        case 0x0085: 
        case 0x2028: 
        case 0x2029: 
         ADD_NEW(state_offset + 1, 0);          ADD_NEW(state_offset + 1, 0);
         break;          break;
   
        default: break;        default:
         break;
         }          }
       break;        break;
   
Line 2210  for (;;) Line 2214  for (;;)
       case OP_NOT_HSPACE:        case OP_NOT_HSPACE:
       if (clen > 0) switch(c)        if (clen > 0) switch(c)
         {          {
        case 0x09:      /* HT */        HSPACE_CASES:
        case 0x20:      /* SPACE */ 
        case 0xa0:      /* NBSP */ 
        case 0x1680:    /* OGHAM SPACE MARK */ 
        case 0x180e:    /* MONGOLIAN VOWEL SEPARATOR */ 
        case 0x2000:    /* EN QUAD */ 
        case 0x2001:    /* EM QUAD */ 
        case 0x2002:    /* EN SPACE */ 
        case 0x2003:    /* EM SPACE */ 
        case 0x2004:    /* THREE-PER-EM SPACE */ 
        case 0x2005:    /* FOUR-PER-EM SPACE */ 
        case 0x2006:    /* SIX-PER-EM SPACE */ 
        case 0x2007:    /* FIGURE SPACE */ 
        case 0x2008:    /* PUNCTUATION SPACE */ 
        case 0x2009:    /* THIN SPACE */ 
        case 0x200A:    /* HAIR SPACE */ 
        case 0x202f:    /* NARROW NO-BREAK SPACE */ 
        case 0x205f:    /* MEDIUM MATHEMATICAL SPACE */ 
        case 0x3000:    /* IDEOGRAPHIC SPACE */ 
         break;          break;
   
         default:          default:
Line 2241  for (;;) Line 2227  for (;;)
       case OP_HSPACE:        case OP_HSPACE:
       if (clen > 0) switch(c)        if (clen > 0) switch(c)
         {          {
        case 0x09:      /* HT */        HSPACE_CASES:
        case 0x20:      /* SPACE */ 
        case 0xa0:      /* NBSP */ 
        case 0x1680:    /* OGHAM SPACE MARK */ 
        case 0x180e:    /* MONGOLIAN VOWEL SEPARATOR */ 
        case 0x2000:    /* EN QUAD */ 
        case 0x2001:    /* EM QUAD */ 
        case 0x2002:    /* EN SPACE */ 
        case 0x2003:    /* EM SPACE */ 
        case 0x2004:    /* THREE-PER-EM SPACE */ 
        case 0x2005:    /* FOUR-PER-EM SPACE */ 
        case 0x2006:    /* SIX-PER-EM SPACE */ 
        case 0x2007:    /* FIGURE SPACE */ 
        case 0x2008:    /* PUNCTUATION SPACE */ 
        case 0x2009:    /* THIN SPACE */ 
        case 0x200A:    /* HAIR SPACE */ 
        case 0x202f:    /* NARROW NO-BREAK SPACE */ 
        case 0x205f:    /* MEDIUM MATHEMATICAL SPACE */ 
        case 0x3000:    /* IDEOGRAPHIC SPACE */ 
         ADD_NEW(state_offset + 1, 0);          ADD_NEW(state_offset + 1, 0);
         break;          break;
   
           default:
           break;
         }          }
       break;        break;
   
Line 2315  for (;;) Line 2286  for (;;)
       if (count > 0) { ADD_ACTIVE(state_offset + dlen + 1, 0); }        if (count > 0) { ADD_ACTIVE(state_offset + dlen + 1, 0); }
       if (clen > 0)        if (clen > 0)
         {          {
        unsigned int otherd = NOTACHAR;        pcre_uint32 otherd = NOTACHAR;
         if (caseless)          if (caseless)
           {            {
 #ifdef SUPPORT_UTF  #ifdef SUPPORT_UTF
Line 2362  for (;;) Line 2333  for (;;)
       ADD_ACTIVE(state_offset + dlen + 1, 0);        ADD_ACTIVE(state_offset + dlen + 1, 0);
       if (clen > 0)        if (clen > 0)
         {          {
        unsigned int otherd = NOTACHAR;        pcre_uint32 otherd = NOTACHAR;
         if (caseless)          if (caseless)
           {            {
 #ifdef SUPPORT_UTF  #ifdef SUPPORT_UTF
Line 2407  for (;;) Line 2378  for (;;)
       ADD_ACTIVE(state_offset + dlen + 1, 0);        ADD_ACTIVE(state_offset + dlen + 1, 0);
       if (clen > 0)        if (clen > 0)
         {          {
        unsigned int otherd = NOTACHAR;        pcre_uint32 otherd = NOTACHAR;
         if (caseless)          if (caseless)
           {            {
 #ifdef SUPPORT_UTF  #ifdef SUPPORT_UTF
Line 2444  for (;;) Line 2415  for (;;)
       count = current_state->count;  /* Number already matched */        count = current_state->count;  /* Number already matched */
       if (clen > 0)        if (clen > 0)
         {          {
        unsigned int otherd = NOTACHAR;        pcre_uint32 otherd = NOTACHAR;
         if (caseless)          if (caseless)
           {            {
 #ifdef SUPPORT_UTF  #ifdef SUPPORT_UTF
Line 2460  for (;;) Line 2431  for (;;)
           }            }
         if ((c == d || c == otherd) == (codevalue < OP_NOTSTAR))          if ((c == d || c == otherd) == (codevalue < OP_NOTSTAR))
           {            {
          if (++count >= GET2(code, 1))          if (++count >= (int)GET2(code, 1))
             { ADD_NEW(state_offset + dlen + 1 + IMM2_SIZE, 0); }              { ADD_NEW(state_offset + dlen + 1 + IMM2_SIZE, 0); }
           else            else
             { ADD_NEW(state_offset, count); }              { ADD_NEW(state_offset, count); }
Line 2488  for (;;) Line 2459  for (;;)
       count = current_state->count;  /* Number already matched */        count = current_state->count;  /* Number already matched */
       if (clen > 0)        if (clen > 0)
         {          {
        unsigned int otherd = NOTACHAR;        pcre_uint32 otherd = NOTACHAR;
         if (caseless)          if (caseless)
           {            {
 #ifdef SUPPORT_UTF  #ifdef SUPPORT_UTF
Line 2509  for (;;) Line 2480  for (;;)
             active_count--;             /* Remove non-match possibility */              active_count--;             /* Remove non-match possibility */
             next_active_state--;              next_active_state--;
             }              }
          if (++count >= GET2(code, 1))          if (++count >= (int)GET2(code, 1))
             { ADD_NEW(state_offset + dlen + 1 + IMM2_SIZE, 0); }              { ADD_NEW(state_offset + dlen + 1 + IMM2_SIZE, 0); }
           else            else
             { ADD_NEW(state_offset, count); }              { ADD_NEW(state_offset, count); }
Line 2582  for (;;) Line 2553  for (;;)
           case OP_CRRANGE:            case OP_CRRANGE:
           case OP_CRMINRANGE:            case OP_CRMINRANGE:
           count = current_state->count;  /* Already matched */            count = current_state->count;  /* Already matched */
          if (count >= GET2(ecode, 1))          if (count >= (int)GET2(ecode, 1))
             { ADD_ACTIVE(next_state_offset + 1 + 2 * IMM2_SIZE, 0); }              { ADD_ACTIVE(next_state_offset + 1 + 2 * IMM2_SIZE, 0); }
           if (isinclass)            if (isinclass)
             {              {
            int max = GET2(ecode, 1 + IMM2_SIZE);            int max = (int)GET2(ecode, 1 + IMM2_SIZE);
             if (++count >= max && max != 0)   /* Max 0 => no limit */              if (++count >= max && max != 0)   /* Max 0 => no limit */
               { ADD_NEW(next_state_offset + 1 + 2 * IMM2_SIZE, 0); }                { ADD_NEW(next_state_offset + 1 + 2 * IMM2_SIZE, 0); }
             else              else
Line 2662  for (;;) Line 2633  for (;;)
             cb.version          = 1;   /* Version 1 of the callout block */              cb.version          = 1;   /* Version 1 of the callout block */
             cb.callout_number   = code[LINK_SIZE+2];              cb.callout_number   = code[LINK_SIZE+2];
             cb.offset_vector    = offsets;              cb.offset_vector    = offsets;
#ifdef COMPILE_PCRE8#if defined COMPILE_PCRE8
             cb.subject          = (PCRE_SPTR)start_subject;              cb.subject          = (PCRE_SPTR)start_subject;
#else#elif defined COMPILE_PCRE16
             cb.subject          = (PCRE_SPTR16)start_subject;              cb.subject          = (PCRE_SPTR16)start_subject;
   #elif defined COMPILE_PCRE32
               cb.subject          = (PCRE_SPTR32)start_subject;
 #endif  #endif
             cb.subject_length   = (int)(end_subject - start_subject);              cb.subject_length   = (int)(end_subject - start_subject);
             cb.start_match      = (int)(current_subject - start_subject);              cb.start_match      = (int)(current_subject - start_subject);
Line 2796  for (;;) Line 2769  for (;;)
           for (rc = rc*2 - 2; rc >= 0; rc -= 2)            for (rc = rc*2 - 2; rc >= 0; rc -= 2)
             {              {
             int charcount = local_offsets[rc+1] - local_offsets[rc];              int charcount = local_offsets[rc+1] - local_offsets[rc];
#ifdef SUPPORT_UTF#if defined SUPPORT_UTF && !defined COMPILE_PCRE32
             if (utf)              if (utf)
               {                {
               const pcre_uchar *p = start_subject + local_offsets[rc];                const pcre_uchar *p = start_subject + local_offsets[rc];
Line 2900  for (;;) Line 2873  for (;;)
             const pcre_uchar *p = ptr;              const pcre_uchar *p = ptr;
             const pcre_uchar *pp = local_ptr;              const pcre_uchar *pp = local_ptr;
             charcount = (int)(pp - p);              charcount = (int)(pp - p);
#ifdef SUPPORT_UTF#if defined SUPPORT_UTF && !defined COMPILE_PCRE32
             if (utf) while (p < pp) if (NOT_FIRSTCHAR(*p++)) charcount--;              if (utf) while (p < pp) if (NOT_FIRSTCHAR(*p++)) charcount--;
 #endif  #endif
             ADD_NEW_DATA(-next_state_offset, 0, (charcount - 1));              ADD_NEW_DATA(-next_state_offset, 0, (charcount - 1));
Line 2982  for (;;) Line 2955  for (;;)
             }              }
           else            else
             {              {
#ifdef SUPPORT_UTF#if defined SUPPORT_UTF && !defined COMPILE_PCRE32
             if (utf)              if (utf)
               {                {
               const pcre_uchar *p = start_subject + local_offsets[0];                const pcre_uchar *p = start_subject + local_offsets[0];
Line 3011  for (;;) Line 2984  for (;;)
         cb.version          = 1;   /* Version 1 of the callout block */          cb.version          = 1;   /* Version 1 of the callout block */
         cb.callout_number   = code[1];          cb.callout_number   = code[1];
         cb.offset_vector    = offsets;          cb.offset_vector    = offsets;
#ifdef COMPILE_PCRE8#if defined COMPILE_PCRE8
         cb.subject          = (PCRE_SPTR)start_subject;          cb.subject          = (PCRE_SPTR)start_subject;
#else#elif defined COMPILE_PCRE16
         cb.subject          = (PCRE_SPTR16)start_subject;          cb.subject          = (PCRE_SPTR16)start_subject;
   #elif defined COMPILE_PCRE32
           cb.subject          = (PCRE_SPTR32)start_subject;
 #endif  #endif
         cb.subject_length   = (int)(end_subject - start_subject);          cb.subject_length   = (int)(end_subject - start_subject);
         cb.start_match      = (int)(current_subject - start_subject);          cb.start_match      = (int)(current_subject - start_subject);
Line 3072  for (;;) Line 3047  for (;;)
           ptr > md->start_used_ptr)            /* Inspected non-empty string */            ptr > md->start_used_ptr)            /* Inspected non-empty string */
           )            )
         )          )
       {  
       if (offsetcount >= 2)  
         {  
         offsets[0] = (int)(md->start_used_ptr - start_subject);  
         offsets[1] = (int)(end_subject - start_subject);  
         }  
       match_count = PCRE_ERROR_PARTIAL;        match_count = PCRE_ERROR_PARTIAL;
       }  
   
     DPRINTF(("%.*sEnd of internal_dfa_exec %d: returning %d\n"      DPRINTF(("%.*sEnd of internal_dfa_exec %d: returning %d\n"
       "%.*s---------------------\n\n", rlevel*2-2, SP, rlevel, match_count,        "%.*s---------------------\n\n", rlevel*2-2, SP, rlevel, match_count,
       rlevel*2-2, SP));        rlevel*2-2, SP));
Line 3130  Returns:          > 0 => number of match offset pairs  Line 3097  Returns:          > 0 => number of match offset pairs 
                  < -1 => some kind of unexpected problem                   < -1 => some kind of unexpected problem
 */  */
   
#ifdef COMPILE_PCRE8#if defined COMPILE_PCRE8
 PCRE_EXP_DEFN int PCRE_CALL_CONVENTION  PCRE_EXP_DEFN int PCRE_CALL_CONVENTION
 pcre_dfa_exec(const pcre *argument_re, const pcre_extra *extra_data,  pcre_dfa_exec(const pcre *argument_re, const pcre_extra *extra_data,
   const char *subject, int length, int start_offset, int options, int *offsets,    const char *subject, int length, int start_offset, int options, int *offsets,
   int offsetcount, int *workspace, int wscount)    int offsetcount, int *workspace, int wscount)
#else#elif defined COMPILE_PCRE16
 PCRE_EXP_DEFN int PCRE_CALL_CONVENTION  PCRE_EXP_DEFN int PCRE_CALL_CONVENTION
 pcre16_dfa_exec(const pcre16 *argument_re, const pcre16_extra *extra_data,  pcre16_dfa_exec(const pcre16 *argument_re, const pcre16_extra *extra_data,
   PCRE_SPTR16 subject, int length, int start_offset, int options, int *offsets,    PCRE_SPTR16 subject, int length, int start_offset, int options, int *offsets,
   int offsetcount, int *workspace, int wscount)    int offsetcount, int *workspace, int wscount)
   #elif defined COMPILE_PCRE32
   PCRE_EXP_DEFN int PCRE_CALL_CONVENTION
   pcre32_dfa_exec(const pcre32 *argument_re, const pcre32_extra *extra_data,
     PCRE_SPTR32 subject, int length, int start_offset, int options, int *offsets,
     int offsetcount, int *workspace, int wscount)
 #endif  #endif
 {  {
 REAL_PCRE *re = (REAL_PCRE *)argument_re;  REAL_PCRE *re = (REAL_PCRE *)argument_re;
Line 3166  if (re == NULL || subject == NULL || workspace == NULL Line 3138  if (re == NULL || subject == NULL || workspace == NULL
    (offsets == NULL && offsetcount > 0)) return PCRE_ERROR_NULL;     (offsets == NULL && offsetcount > 0)) return PCRE_ERROR_NULL;
 if (offsetcount < 0) return PCRE_ERROR_BADCOUNT;  if (offsetcount < 0) return PCRE_ERROR_BADCOUNT;
 if (wscount < 20) return PCRE_ERROR_DFA_WSSIZE;  if (wscount < 20) return PCRE_ERROR_DFA_WSSIZE;
   if (length < 0) return PCRE_ERROR_BADLENGTH;
 if (start_offset < 0 || start_offset > length) return PCRE_ERROR_BADOFFSET;  if (start_offset < 0 || start_offset > length) return PCRE_ERROR_BADOFFSET;
   
 /* Check that the first field in the block is the magic number. If it is not,  /* Check that the first field in the block is the magic number. If it is not,
Line 3214  end_subject = (const pcre_uchar *)subject + length; Line 3187  end_subject = (const pcre_uchar *)subject + length;
 req_char_ptr = current_subject - 1;  req_char_ptr = current_subject - 1;
   
 #ifdef SUPPORT_UTF  #ifdef SUPPORT_UTF
/* PCRE_UTF16 has the same value as PCRE_UTF8. *//* PCRE_UTF(16|32) have the same value as PCRE_UTF8. */
 utf = (re->options & PCRE_UTF8) != 0;  utf = (re->options & PCRE_UTF8) != 0;
 #else  #else
 utf = FALSE;  utf = FALSE;
Line 3300  if (utf && (options & PCRE_NO_UTF8_CHECK) == 0) Line 3273  if (utf && (options & PCRE_NO_UTF8_CHECK) == 0)
       offsets[0] = erroroffset;        offsets[0] = erroroffset;
       offsets[1] = errorcode;        offsets[1] = errorcode;
       }        }
    return (errorcode <= PCRE_UTF8_ERR5 && (options & PCRE_PARTIAL_HARD) != 0)?#if defined COMPILE_PCRE8
     return (errorcode <= PCRE_UTF8_ERR5 && (options & PCRE_PARTIAL_HARD) != 0) ?
       PCRE_ERROR_SHORTUTF8 : PCRE_ERROR_BADUTF8;        PCRE_ERROR_SHORTUTF8 : PCRE_ERROR_BADUTF8;
   #elif defined COMPILE_PCRE16
       return (errorcode <= PCRE_UTF16_ERR1 && (options & PCRE_PARTIAL_HARD) != 0) ?
         PCRE_ERROR_SHORTUTF16 : PCRE_ERROR_BADUTF16;
   #elif defined COMPILE_PCRE32
       return PCRE_ERROR_BADUTF32;
   #endif
     }      }
   #if defined COMPILE_PCRE8 || defined COMPILE_PCRE16
   if (start_offset > 0 && start_offset < length &&    if (start_offset > 0 && start_offset < length &&
         NOT_FIRSTCHAR(((PCRE_PUCHAR)subject)[start_offset]))          NOT_FIRSTCHAR(((PCRE_PUCHAR)subject)[start_offset]))
     return PCRE_ERROR_BADUTF8_OFFSET;      return PCRE_ERROR_BADUTF8_OFFSET;
   #endif
   }    }
 #endif  #endif
   
Line 3415  for (;;) Line 3397  for (;;)
       if (has_first_char)        if (has_first_char)
         {          {
         if (first_char != first_char2)          if (first_char != first_char2)
             {
             pcre_uchar csc;
           while (current_subject < end_subject &&            while (current_subject < end_subject &&
              *current_subject != first_char && *current_subject != first_char2)                 (csc = RAWUCHARTEST(current_subject)) != first_char && csc != first_char2)
             current_subject++;              current_subject++;
             }
         else          else
           while (current_subject < end_subject &&            while (current_subject < end_subject &&
                 *current_subject != first_char)                 RAWUCHARTEST(current_subject) != first_char)
             current_subject++;              current_subject++;
         }          }
   
Line 3450  for (;;) Line 3435  for (;;)
           ANYCRLF, and we are now at a LF, advance the match position by one            ANYCRLF, and we are now at a LF, advance the match position by one
           more character. */            more character. */
   
          if (current_subject[-1] == CHAR_CR &&          if (RAWUCHARTEST(current_subject - 1) == CHAR_CR &&
                (md->nltype == NLTYPE_ANY || md->nltype == NLTYPE_ANYCRLF) &&                 (md->nltype == NLTYPE_ANY || md->nltype == NLTYPE_ANYCRLF) &&
                current_subject < end_subject &&                 current_subject < end_subject &&
               *current_subject == CHAR_NL)               RAWUCHARTEST(current_subject) == CHAR_NL)
             current_subject++;              current_subject++;
           }            }
         }          }
Line 3464  for (;;) Line 3449  for (;;)
         {          {
         while (current_subject < end_subject)          while (current_subject < end_subject)
           {            {
          register unsigned int c = *current_subject;          register pcre_uint32 c = RAWUCHARTEST(current_subject);
 #ifndef COMPILE_PCRE8  #ifndef COMPILE_PCRE8
           if (c > 255) c = 255;            if (c > 255) c = 255;
 #endif  #endif
Line 3530  for (;;) Line 3515  for (;;)
             {              {
             while (p < end_subject)              while (p < end_subject)
               {                {
              register int pp = *p++;              register pcre_uint32 pp = RAWUCHARINCTEST(p);
               if (pp == req_char || pp == req_char2) { p--; break; }                if (pp == req_char || pp == req_char2) { p--; break; }
               }                }
             }              }
Line 3538  for (;;) Line 3523  for (;;)
             {              {
             while (p < end_subject)              while (p < end_subject)
               {                {
              if (*p++ == req_char) { p--; break; }              if (RAWUCHARINCTEST(p) == req_char) { p--; break; }
               }                }
             }              }
   
Line 3576  for (;;) Line 3561  for (;;)
   /* Anything other than "no match" means we are done, always; otherwise, carry    /* Anything other than "no match" means we are done, always; otherwise, carry
   on only if not anchored. */    on only if not anchored. */
   
  if (rc != PCRE_ERROR_NOMATCH || anchored) return rc;  if (rc != PCRE_ERROR_NOMATCH || anchored)
     {
     if (rc == PCRE_ERROR_PARTIAL && offsetcount >= 2)
       {
       offsets[0] = (int)(md->start_used_ptr - (PCRE_PUCHAR)subject);
       offsets[1] = (int)(end_subject - (PCRE_PUCHAR)subject);
       if (offsetcount > 2)
         offsets[2] = (int)(current_subject - (PCRE_PUCHAR)subject);
       }
     return rc;
     }
   
   /* Advance to the next subject character unless we are at the end of a line    /* Advance to the next subject character unless we are at the end of a line
   and firstline is set. */    and firstline is set. */
Line 3596  for (;;) Line 3591  for (;;)
   not contain any explicit matches for \r or \n, and the newline option is CRLF    not contain any explicit matches for \r or \n, and the newline option is CRLF
   or ANY or ANYCRLF, advance the match position by one more character. */    or ANY or ANYCRLF, advance the match position by one more character. */
   
  if (current_subject[-1] == CHAR_CR &&  if (RAWUCHARTEST(current_subject - 1) == CHAR_CR &&
       current_subject < end_subject &&        current_subject < end_subject &&
      *current_subject == CHAR_NL &&      RAWUCHARTEST(current_subject) == CHAR_NL &&
       (re->flags & PCRE_HASCRORLF) == 0 &&        (re->flags & PCRE_HASCRORLF) == 0 &&
         (md->nltype == NLTYPE_ANY ||          (md->nltype == NLTYPE_ANY ||
          md->nltype == NLTYPE_ANYCRLF ||           md->nltype == NLTYPE_ANYCRLF ||

Removed from v.1.1.1.3  
changed lines
  Added in v.1.1.1.4


FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>