/[pcre]/code/trunk/pcre_exec.c
ViewVC logotype

Diff of /code/trunk/pcre_exec.c

Parent Directory Parent Directory | Revision Log Revision Log | View Patch Patch

revision 518 by ph10, Tue May 18 15:47:01 2010 UTC revision 545 by ph10, Wed Jun 16 10:51:15 2010 UTC
# Line 255  enum { RM1=1, RM2,  RM3,  RM4,  RM5,  RM Line 255  enum { RM1=1, RM2,  RM3,  RM4,  RM5,  RM
255         RM21,  RM22, RM23, RM24, RM25, RM26, RM27, RM28, RM29, RM30,         RM21,  RM22, RM23, RM24, RM25, RM26, RM27, RM28, RM29, RM30,
256         RM31,  RM32, RM33, RM34, RM35, RM36, RM37, RM38, RM39, RM40,         RM31,  RM32, RM33, RM34, RM35, RM36, RM37, RM38, RM39, RM40,
257         RM41,  RM42, RM43, RM44, RM45, RM46, RM47, RM48, RM49, RM50,         RM41,  RM42, RM43, RM44, RM45, RM46, RM47, RM48, RM49, RM50,
258         RM51,  RM52, RM53, RM54, RM55, RM56, RM57, RM58 };         RM51,  RM52, RM53, RM54, RM55, RM56, RM57, RM58, RM59, RM60,
259           RM61,  RM62 };
260    
261  /* These versions of the macros use the stack, as normal. There are debugging  /* These versions of the macros use the stack, as normal. There are debugging
262  versions and production versions. Note that the "rw" argument of RMATCH isn't  versions and production versions. Note that the "rw" argument of RMATCH isn't
# Line 294  argument of match(), which never changes Line 295  argument of match(), which never changes
295  #define RMATCH(ra,rb,rc,rd,re,rf,rg,rw)\  #define RMATCH(ra,rb,rc,rd,re,rf,rg,rw)\
296    {\    {\
297    heapframe *newframe = (pcre_stack_malloc)(sizeof(heapframe));\    heapframe *newframe = (pcre_stack_malloc)(sizeof(heapframe));\
298      if (newframe == NULL) RRETURN(PCRE_ERROR_NOMEMORY);\
299    frame->Xwhere = rw; \    frame->Xwhere = rw; \
300    newframe->Xeptr = ra;\    newframe->Xeptr = ra;\
301    newframe->Xecode = rb;\    newframe->Xecode = rb;\
# Line 314  argument of match(), which never changes Line 316  argument of match(), which never changes
316    
317  #define RRETURN(ra)\  #define RRETURN(ra)\
318    {\    {\
319    heapframe *newframe = frame;\    heapframe *oldframe = frame;\
320    frame = newframe->Xprevframe;\    frame = oldframe->Xprevframe;\
321    (pcre_stack_free)(newframe);\    (pcre_stack_free)(oldframe);\
322    if (frame != NULL)\    if (frame != NULL)\
323      {\      {\
324      rrc = ra;\      rrc = ra;\
# Line 487  heap whenever RMATCH() does a "recursion Line 489  heap whenever RMATCH() does a "recursion
489    
490  #ifdef NO_RECURSE  #ifdef NO_RECURSE
491  heapframe *frame = (pcre_stack_malloc)(sizeof(heapframe));  heapframe *frame = (pcre_stack_malloc)(sizeof(heapframe));
492    if (frame == NULL) RRETURN(PCRE_ERROR_NOMEMORY);
493  frame->Xprevframe = NULL;            /* Marks the top level */  frame->Xprevframe = NULL;            /* Marks the top level */
494    
495  /* Copy in the original argument variables */  /* Copy in the original argument variables */
# Line 793  for (;;) Line 796  for (;;)
796        save_capture_last = md->capture_last;        save_capture_last = md->capture_last;
797    
798        DPRINTF(("saving %d %d %d\n", save_offset1, save_offset2, save_offset3));        DPRINTF(("saving %d %d %d\n", save_offset1, save_offset2, save_offset3));
799        md->offset_vector[md->offset_end - number] = eptr - md->start_subject;        md->offset_vector[md->offset_end - number] =
800            (int)(eptr - md->start_subject);
801    
802        flags = (op == OP_SCBRA)? match_cbegroup : 0;        flags = (op == OP_SCBRA)? match_cbegroup : 0;
803        do        do
# Line 888  for (;;) Line 892  for (;;)
892          cb.callout_number   = ecode[LINK_SIZE+2];          cb.callout_number   = ecode[LINK_SIZE+2];
893          cb.offset_vector    = md->offset_vector;          cb.offset_vector    = md->offset_vector;
894          cb.subject          = (PCRE_SPTR)md->start_subject;          cb.subject          = (PCRE_SPTR)md->start_subject;
895          cb.subject_length   = md->end_subject - md->start_subject;          cb.subject_length   = (int)(md->end_subject - md->start_subject);
896          cb.start_match      = mstart - md->start_subject;          cb.start_match      = (int)(mstart - md->start_subject);
897          cb.current_position = eptr - md->start_subject;          cb.current_position = (int)(eptr - md->start_subject);
898          cb.pattern_position = GET(ecode, LINK_SIZE + 3);          cb.pattern_position = GET(ecode, LINK_SIZE + 3);
899          cb.next_item_length = GET(ecode, 3 + 2*LINK_SIZE);          cb.next_item_length = GET(ecode, 3 + 2*LINK_SIZE);
900          cb.capture_top      = offset_top/2;          cb.capture_top      = offset_top/2;
# Line 1116  for (;;) Line 1120  for (;;)
1120        {        {
1121        md->offset_vector[offset] =        md->offset_vector[offset] =
1122          md->offset_vector[md->offset_end - number];          md->offset_vector[md->offset_end - number];
1123        md->offset_vector[offset+1] = eptr - md->start_subject;        md->offset_vector[offset+1] = (int)(eptr - md->start_subject);
1124        if (offset_top <= offset) offset_top = offset + 2;        if (offset_top <= offset) offset_top = offset + 2;
1125        }        }
1126      ecode += 3;      ecode += 3;
# Line 1279  for (;;) Line 1283  for (;;)
1283        cb.callout_number   = ecode[1];        cb.callout_number   = ecode[1];
1284        cb.offset_vector    = md->offset_vector;        cb.offset_vector    = md->offset_vector;
1285        cb.subject          = (PCRE_SPTR)md->start_subject;        cb.subject          = (PCRE_SPTR)md->start_subject;
1286        cb.subject_length   = md->end_subject - md->start_subject;        cb.subject_length   = (int)(md->end_subject - md->start_subject);
1287        cb.start_match      = mstart - md->start_subject;        cb.start_match      = (int)(mstart - md->start_subject);
1288        cb.current_position = eptr - md->start_subject;        cb.current_position = (int)(eptr - md->start_subject);
1289        cb.pattern_position = GET(ecode, 2);        cb.pattern_position = GET(ecode, 2);
1290        cb.next_item_length = GET(ecode, 2 + LINK_SIZE);        cb.next_item_length = GET(ecode, 2 + LINK_SIZE);
1291        cb.capture_top      = offset_top/2;        cb.capture_top      = offset_top/2;
# Line 1558  for (;;) Line 1562  for (;;)
1562          {          {
1563          md->offset_vector[offset] =          md->offset_vector[offset] =
1564            md->offset_vector[md->offset_end - number];            md->offset_vector[md->offset_end - number];
1565          md->offset_vector[offset+1] = eptr - md->start_subject;          md->offset_vector[offset+1] = (int)(eptr - md->start_subject);
1566          if (offset_top <= offset) offset_top = offset + 2;          if (offset_top <= offset) offset_top = offset + 2;
1567          }          }
1568    
# Line 1719  for (;;) Line 1723  for (;;)
1723        if (utf8)        if (utf8)
1724          {          {
1725          /* Get status of previous character */          /* Get status of previous character */
1726    
1727          if (eptr == md->start_subject) prev_is_word = FALSE; else          if (eptr == md->start_subject) prev_is_word = FALSE; else
1728            {            {
1729            USPTR lastptr = eptr - 1;            USPTR lastptr = eptr - 1;
1730            while((*lastptr & 0xc0) == 0x80) lastptr--;            while((*lastptr & 0xc0) == 0x80) lastptr--;
1731            if (lastptr < md->start_used_ptr) md->start_used_ptr = lastptr;            if (lastptr < md->start_used_ptr) md->start_used_ptr = lastptr;
1732            GETCHAR(c, lastptr);            GETCHAR(c, lastptr);
1733  #ifdef SUPPORT_UCP  #ifdef SUPPORT_UCP
1734            if (md->use_ucp)            if (md->use_ucp)
1735              {              {
1736              if (c == '_') prev_is_word = TRUE; else              if (c == '_') prev_is_word = TRUE; else
1737                {                {
1738                int cat = UCD_CATEGORY(c);                int cat = UCD_CATEGORY(c);
1739                prev_is_word = (cat == ucp_L || cat == ucp_N);                prev_is_word = (cat == ucp_L || cat == ucp_N);
1740                }                }
1741              }              }
1742            else            else
1743  #endif  #endif
1744            prev_is_word = c < 256 && (md->ctypes[c] & ctype_word) != 0;            prev_is_word = c < 256 && (md->ctypes[c] & ctype_word) != 0;
1745            }            }
1746    
1747          /* Get status of next character */          /* Get status of next character */
1748    
1749          if (eptr >= md->end_subject)          if (eptr >= md->end_subject)
1750            {            {
1751            SCHECK_PARTIAL();            SCHECK_PARTIAL();
# Line 1750  for (;;) Line 1754  for (;;)
1754          else          else
1755            {            {
1756            GETCHAR(c, eptr);            GETCHAR(c, eptr);
1757  #ifdef SUPPORT_UCP  #ifdef SUPPORT_UCP
1758            if (md->use_ucp)            if (md->use_ucp)
1759              {              {
1760              if (c == '_') cur_is_word = TRUE; else              if (c == '_') cur_is_word = TRUE; else
1761                {                {
1762                int cat = UCD_CATEGORY(c);                int cat = UCD_CATEGORY(c);
1763                cur_is_word = (cat == ucp_L || cat == ucp_N);                cur_is_word = (cat == ucp_L || cat == ucp_N);
1764                }                }
1765              }              }
1766            else            else
1767  #endif  #endif
1768            cur_is_word = c < 256 && (md->ctypes[c] & ctype_word) != 0;            cur_is_word = c < 256 && (md->ctypes[c] & ctype_word) != 0;
1769            }            }
1770          }          }
1771        else        else
1772  #endif  #endif
1773    
1774        /* Not in UTF-8 mode, but we may still have PCRE_UCP set, and for        /* Not in UTF-8 mode, but we may still have PCRE_UCP set, and for
1775        consistency with the behaviour of \w we do use it in this case. */        consistency with the behaviour of \w we do use it in this case. */
1776    
1777          {          {
1778          /* Get status of previous character */          /* Get status of previous character */
1779    
1780          if (eptr == md->start_subject) prev_is_word = FALSE; else          if (eptr == md->start_subject) prev_is_word = FALSE; else
1781            {            {
1782            if (eptr <= md->start_used_ptr) md->start_used_ptr = eptr - 1;            if (eptr <= md->start_used_ptr) md->start_used_ptr = eptr - 1;
1783  #ifdef SUPPORT_UCP  #ifdef SUPPORT_UCP
1784            if (md->use_ucp)            if (md->use_ucp)
1785              {              {
1786              c = eptr[-1];              c = eptr[-1];
1787              if (c == '_') prev_is_word = TRUE; else              if (c == '_') prev_is_word = TRUE; else
1788                {                {
1789                int cat = UCD_CATEGORY(c);                int cat = UCD_CATEGORY(c);
1790                prev_is_word = (cat == ucp_L || cat == ucp_N);                prev_is_word = (cat == ucp_L || cat == ucp_N);
1791                }                }
1792              }              }
1793            else            else
1794  #endif  #endif
1795            prev_is_word = ((md->ctypes[eptr[-1]] & ctype_word) != 0);            prev_is_word = ((md->ctypes[eptr[-1]] & ctype_word) != 0);
1796            }            }
1797    
1798          /* Get status of next character */          /* Get status of next character */
1799    
1800          if (eptr >= md->end_subject)          if (eptr >= md->end_subject)
1801            {            {
1802            SCHECK_PARTIAL();            SCHECK_PARTIAL();
1803            cur_is_word = FALSE;            cur_is_word = FALSE;
1804            }            }
1805          else          else
1806  #ifdef SUPPORT_UCP  #ifdef SUPPORT_UCP
1807          if (md->use_ucp)          if (md->use_ucp)
1808            {            {
1809            c = *eptr;            c = *eptr;
1810            if (c == '_') cur_is_word = TRUE; else            if (c == '_') cur_is_word = TRUE; else
1811              {              {
1812              int cat = UCD_CATEGORY(c);              int cat = UCD_CATEGORY(c);
1813              cur_is_word = (cat == ucp_L || cat == ucp_N);              cur_is_word = (cat == ucp_L || cat == ucp_N);
1814              }              }
1815            }            }
1816          else          else
1817  #endif  #endif
1818          cur_is_word = ((md->ctypes[*eptr] & ctype_word) != 0);          cur_is_word = ((md->ctypes[*eptr] & ctype_word) != 0);
1819          }          }
1820    
# Line 2134  for (;;) Line 2138  for (;;)
2138          if ((ecode[2] != prop->script) == (op == OP_PROP))          if ((ecode[2] != prop->script) == (op == OP_PROP))
2139            MRRETURN(MATCH_NOMATCH);            MRRETURN(MATCH_NOMATCH);
2140          break;          break;
2141    
2142          /* These are specials */          /* These are specials */
2143    
2144          case PT_ALNUM:          case PT_ALNUM:
2145          if ((_pcre_ucp_gentype[prop->chartype] == ucp_L ||          if ((_pcre_ucp_gentype[prop->chartype] == ucp_L ||
2146               _pcre_ucp_gentype[prop->chartype] == ucp_N) == (op == OP_NOTPROP))               _pcre_ucp_gentype[prop->chartype] == ucp_N) == (op == OP_NOTPROP))
2147            MRRETURN(MATCH_NOMATCH);            MRRETURN(MATCH_NOMATCH);
2148          break;          break;
2149    
2150          case PT_SPACE:    /* Perl space */          case PT_SPACE:    /* Perl space */
2151          if ((_pcre_ucp_gentype[prop->chartype] == ucp_Z ||          if ((_pcre_ucp_gentype[prop->chartype] == ucp_Z ||
2152               c == CHAR_HT || c == CHAR_NL || c == CHAR_FF || c == CHAR_CR)               c == CHAR_HT || c == CHAR_NL || c == CHAR_FF || c == CHAR_CR)
2153                 == (op == OP_NOTPROP))                 == (op == OP_NOTPROP))
2154            MRRETURN(MATCH_NOMATCH);            MRRETURN(MATCH_NOMATCH);
2155          break;          break;
2156    
2157          case PT_PXSPACE:  /* POSIX space */          case PT_PXSPACE:  /* POSIX space */
2158          if ((_pcre_ucp_gentype[prop->chartype] == ucp_Z ||          if ((_pcre_ucp_gentype[prop->chartype] == ucp_Z ||
2159               c == CHAR_HT || c == CHAR_NL || c == CHAR_VT ||               c == CHAR_HT || c == CHAR_NL || c == CHAR_VT ||
2160               c == CHAR_FF || c == CHAR_CR)               c == CHAR_FF || c == CHAR_CR)
2161                 == (op == OP_NOTPROP))                 == (op == OP_NOTPROP))
2162            MRRETURN(MATCH_NOMATCH);            MRRETURN(MATCH_NOMATCH);
2163          break;          break;
2164    
2165          case PT_WORD:          case PT_WORD:
2166          if ((_pcre_ucp_gentype[prop->chartype] == ucp_L ||          if ((_pcre_ucp_gentype[prop->chartype] == ucp_L ||
2167               _pcre_ucp_gentype[prop->chartype] == ucp_N ||               _pcre_ucp_gentype[prop->chartype] == ucp_N ||
2168               c == CHAR_UNDERSCORE) == (op == OP_NOTPROP))               c == CHAR_UNDERSCORE) == (op == OP_NOTPROP))
2169            MRRETURN(MATCH_NOMATCH);            MRRETURN(MATCH_NOMATCH);
2170          break;          break;
2171    
2172          /* This should never occur */          /* This should never occur */
2173    
2174          default:          default:
# Line 2232  for (;;) Line 2236  for (;;)
2236        referenced subpattern. */        referenced subpattern. */
2237    
2238        if (offset >= offset_top || md->offset_vector[offset] < 0)        if (offset >= offset_top || md->offset_vector[offset] < 0)
2239          length = (md->jscript_compat)? 0 : md->end_subject - eptr + 1;          length = (md->jscript_compat)? 0 : (int)(md->end_subject - eptr + 1);
2240        else        else
2241          length = md->offset_vector[offset+1] - md->offset_vector[offset];          length = md->offset_vector[offset+1] - md->offset_vector[offset];
2242    
# Line 3582  for (;;) Line 3586  for (;;)
3586                MRRETURN(MATCH_NOMATCH);                MRRETURN(MATCH_NOMATCH);
3587              }              }
3588            break;            break;
3589    
3590            case PT_ALNUM:            case PT_ALNUM:
3591            for (i = 1; i <= min; i++)            for (i = 1; i <= min; i++)
3592              {              {
# Line 3592  for (;;) Line 3596  for (;;)
3596                MRRETURN(MATCH_NOMATCH);                MRRETURN(MATCH_NOMATCH);
3597                }                }
3598              GETCHARINCTEST(c, eptr);              GETCHARINCTEST(c, eptr);
3599              prop_category = UCD_CATEGORY(c);              prop_category = UCD_CATEGORY(c);
3600              if ((prop_category == ucp_L || prop_category == ucp_N)              if ((prop_category == ucp_L || prop_category == ucp_N)
3601                     == prop_fail_result)                     == prop_fail_result)
3602                MRRETURN(MATCH_NOMATCH);                MRRETURN(MATCH_NOMATCH);
3603              }              }
3604            break;            break;
3605    
3606            case PT_SPACE:    /* Perl space */            case PT_SPACE:    /* Perl space */
3607            for (i = 1; i <= min; i++)            for (i = 1; i <= min; i++)
3608              {              {
# Line 3608  for (;;) Line 3612  for (;;)
3612                MRRETURN(MATCH_NOMATCH);                MRRETURN(MATCH_NOMATCH);
3613                }                }
3614              GETCHARINCTEST(c, eptr);              GETCHARINCTEST(c, eptr);
3615              prop_category = UCD_CATEGORY(c);              prop_category = UCD_CATEGORY(c);
3616              if ((prop_category == ucp_Z || c == CHAR_HT || c == CHAR_NL ||              if ((prop_category == ucp_Z || c == CHAR_HT || c == CHAR_NL ||
3617                   c == CHAR_FF || c == CHAR_CR)                   c == CHAR_FF || c == CHAR_CR)
3618                     == prop_fail_result)                     == prop_fail_result)
3619                MRRETURN(MATCH_NOMATCH);                MRRETURN(MATCH_NOMATCH);
3620              }              }
3621            break;            break;
3622    
3623            case PT_PXSPACE:  /* POSIX space */            case PT_PXSPACE:  /* POSIX space */
3624            for (i = 1; i <= min; i++)            for (i = 1; i <= min; i++)
3625              {              {
# Line 3625  for (;;) Line 3629  for (;;)
3629                MRRETURN(MATCH_NOMATCH);                MRRETURN(MATCH_NOMATCH);
3630                }                }
3631              GETCHARINCTEST(c, eptr);              GETCHARINCTEST(c, eptr);
3632              prop_category = UCD_CATEGORY(c);              prop_category = UCD_CATEGORY(c);
3633              if ((prop_category == ucp_Z || c == CHAR_HT || c == CHAR_NL ||              if ((prop_category == ucp_Z || c == CHAR_HT || c == CHAR_NL ||
3634                   c == CHAR_VT || c == CHAR_FF || c == CHAR_CR)                   c == CHAR_VT || c == CHAR_FF || c == CHAR_CR)
3635                     == prop_fail_result)                     == prop_fail_result)
3636                MRRETURN(MATCH_NOMATCH);                MRRETURN(MATCH_NOMATCH);
3637              }              }
3638            break;            break;
3639    
3640            case PT_WORD:            case PT_WORD:
3641            for (i = 1; i <= min; i++)            for (i = 1; i <= min; i++)
3642              {              {
3643              if (eptr >= md->end_subject)              if (eptr >= md->end_subject)
# Line 3642  for (;;) Line 3646  for (;;)
3646                MRRETURN(MATCH_NOMATCH);                MRRETURN(MATCH_NOMATCH);
3647                }                }
3648              GETCHARINCTEST(c, eptr);              GETCHARINCTEST(c, eptr);
3649              prop_category = UCD_CATEGORY(c);              prop_category = UCD_CATEGORY(c);
3650              if ((prop_category == ucp_L || prop_category == ucp_N ||              if ((prop_category == ucp_L || prop_category == ucp_N ||
3651                   c == CHAR_UNDERSCORE)                   c == CHAR_UNDERSCORE)
3652                     == prop_fail_result)                     == prop_fail_result)
3653                MRRETURN(MATCH_NOMATCH);                MRRETURN(MATCH_NOMATCH);
3654              }              }
3655            break;            break;
3656    
3657            /* This should not occur */            /* This should not occur */
3658    
3659            default:            default:
# Line 4212  for (;;) Line 4216  for (;;)
4216                SCHECK_PARTIAL();                SCHECK_PARTIAL();
4217                MRRETURN(MATCH_NOMATCH);                MRRETURN(MATCH_NOMATCH);
4218                }                }
4219              GETCHARINC(c, eptr);              GETCHARINCTEST(c, eptr);
4220              if (prop_fail_result) MRRETURN(MATCH_NOMATCH);              if (prop_fail_result) MRRETURN(MATCH_NOMATCH);
4221              }              }
4222            /* Control never gets here */            /* Control never gets here */
# Line 4228  for (;;) Line 4232  for (;;)
4232                SCHECK_PARTIAL();                SCHECK_PARTIAL();
4233                MRRETURN(MATCH_NOMATCH);                MRRETURN(MATCH_NOMATCH);
4234                }                }
4235              GETCHARINC(c, eptr);              GETCHARINCTEST(c, eptr);
4236              prop_chartype = UCD_CHARTYPE(c);              prop_chartype = UCD_CHARTYPE(c);
4237              if ((prop_chartype == ucp_Lu ||              if ((prop_chartype == ucp_Lu ||
4238                   prop_chartype == ucp_Ll ||                   prop_chartype == ucp_Ll ||
# Line 4248  for (;;) Line 4252  for (;;)
4252                SCHECK_PARTIAL();                SCHECK_PARTIAL();
4253                MRRETURN(MATCH_NOMATCH);                MRRETURN(MATCH_NOMATCH);
4254                }                }
4255              GETCHARINC(c, eptr);              GETCHARINCTEST(c, eptr);
4256              prop_category = UCD_CATEGORY(c);              prop_category = UCD_CATEGORY(c);
4257              if ((prop_category == prop_value) == prop_fail_result)              if ((prop_category == prop_value) == prop_fail_result)
4258                MRRETURN(MATCH_NOMATCH);                MRRETURN(MATCH_NOMATCH);
# Line 4266  for (;;) Line 4270  for (;;)
4270                SCHECK_PARTIAL();                SCHECK_PARTIAL();
4271                MRRETURN(MATCH_NOMATCH);                MRRETURN(MATCH_NOMATCH);
4272                }                }
4273              GETCHARINC(c, eptr);              GETCHARINCTEST(c, eptr);
4274              prop_chartype = UCD_CHARTYPE(c);              prop_chartype = UCD_CHARTYPE(c);
4275              if ((prop_chartype == prop_value) == prop_fail_result)              if ((prop_chartype == prop_value) == prop_fail_result)
4276                MRRETURN(MATCH_NOMATCH);                MRRETURN(MATCH_NOMATCH);
# Line 4284  for (;;) Line 4288  for (;;)
4288                SCHECK_PARTIAL();                SCHECK_PARTIAL();
4289                MRRETURN(MATCH_NOMATCH);                MRRETURN(MATCH_NOMATCH);
4290                }                }
4291              GETCHARINC(c, eptr);              GETCHARINCTEST(c, eptr);
4292              prop_script = UCD_SCRIPT(c);              prop_script = UCD_SCRIPT(c);
4293              if ((prop_script == prop_value) == prop_fail_result)              if ((prop_script == prop_value) == prop_fail_result)
4294                MRRETURN(MATCH_NOMATCH);                MRRETURN(MATCH_NOMATCH);
# Line 4294  for (;;) Line 4298  for (;;)
4298            case PT_ALNUM:            case PT_ALNUM:
4299            for (fi = min;; fi++)            for (fi = min;; fi++)
4300              {              {
4301              RMATCH(eptr, ecode, offset_top, md, ims, eptrb, 0, RM39);              RMATCH(eptr, ecode, offset_top, md, ims, eptrb, 0, RM59);
4302              if (rrc != MATCH_NOMATCH) RRETURN(rrc);              if (rrc != MATCH_NOMATCH) RRETURN(rrc);
4303              if (fi >= max) MRRETURN(MATCH_NOMATCH);              if (fi >= max) MRRETURN(MATCH_NOMATCH);
4304              if (eptr >= md->end_subject)              if (eptr >= md->end_subject)
# Line 4302  for (;;) Line 4306  for (;;)
4306                SCHECK_PARTIAL();                SCHECK_PARTIAL();
4307                MRRETURN(MATCH_NOMATCH);                MRRETURN(MATCH_NOMATCH);
4308                }                }
4309              GETCHARINC(c, eptr);              GETCHARINCTEST(c, eptr);
4310              prop_category = UCD_CATEGORY(c);              prop_category = UCD_CATEGORY(c);
4311              if ((prop_category == ucp_L || prop_category == ucp_N)              if ((prop_category == ucp_L || prop_category == ucp_N)
4312                     == prop_fail_result)                     == prop_fail_result)
4313                MRRETURN(MATCH_NOMATCH);                MRRETURN(MATCH_NOMATCH);
4314              }              }
4315            /* Control never gets here */            /* Control never gets here */
4316    
4317            case PT_SPACE:    /* Perl space */            case PT_SPACE:    /* Perl space */
4318            for (fi = min;; fi++)            for (fi = min;; fi++)
4319              {              {
4320              RMATCH(eptr, ecode, offset_top, md, ims, eptrb, 0, RM39);              RMATCH(eptr, ecode, offset_top, md, ims, eptrb, 0, RM60);
4321              if (rrc != MATCH_NOMATCH) RRETURN(rrc);              if (rrc != MATCH_NOMATCH) RRETURN(rrc);
4322              if (fi >= max) MRRETURN(MATCH_NOMATCH);              if (fi >= max) MRRETURN(MATCH_NOMATCH);
4323              if (eptr >= md->end_subject)              if (eptr >= md->end_subject)
# Line 4321  for (;;) Line 4325  for (;;)
4325                SCHECK_PARTIAL();                SCHECK_PARTIAL();
4326                MRRETURN(MATCH_NOMATCH);                MRRETURN(MATCH_NOMATCH);
4327                }                }
4328              GETCHARINC(c, eptr);              GETCHARINCTEST(c, eptr);
4329              prop_category = UCD_CATEGORY(c);              prop_category = UCD_CATEGORY(c);
4330              if ((prop_category == ucp_Z || c == CHAR_HT || c == CHAR_NL ||              if ((prop_category == ucp_Z || c == CHAR_HT || c == CHAR_NL ||
4331                   c == CHAR_FF || c == CHAR_CR)                   c == CHAR_FF || c == CHAR_CR)
4332                     == prop_fail_result)                     == prop_fail_result)
4333                MRRETURN(MATCH_NOMATCH);                MRRETURN(MATCH_NOMATCH);
4334              }              }
4335            /* Control never gets here */            /* Control never gets here */
4336    
4337            case PT_PXSPACE:  /* POSIX space */            case PT_PXSPACE:  /* POSIX space */
4338            for (fi = min;; fi++)            for (fi = min;; fi++)
4339              {              {
4340              RMATCH(eptr, ecode, offset_top, md, ims, eptrb, 0, RM39);              RMATCH(eptr, ecode, offset_top, md, ims, eptrb, 0, RM61);
4341              if (rrc != MATCH_NOMATCH) RRETURN(rrc);              if (rrc != MATCH_NOMATCH) RRETURN(rrc);
4342              if (fi >= max) MRRETURN(MATCH_NOMATCH);              if (fi >= max) MRRETURN(MATCH_NOMATCH);
4343              if (eptr >= md->end_subject)              if (eptr >= md->end_subject)
# Line 4341  for (;;) Line 4345  for (;;)
4345                SCHECK_PARTIAL();                SCHECK_PARTIAL();
4346                MRRETURN(MATCH_NOMATCH);                MRRETURN(MATCH_NOMATCH);
4347                }                }
4348              GETCHARINC(c, eptr);              GETCHARINCTEST(c, eptr);
4349              prop_category = UCD_CATEGORY(c);              prop_category = UCD_CATEGORY(c);
4350              if ((prop_category == ucp_Z || c == CHAR_HT || c == CHAR_NL ||              if ((prop_category == ucp_Z || c == CHAR_HT || c == CHAR_NL ||
4351                   c == CHAR_VT || c == CHAR_FF || c == CHAR_CR)                   c == CHAR_VT || c == CHAR_FF || c == CHAR_CR)
4352                     == prop_fail_result)                     == prop_fail_result)
4353                MRRETURN(MATCH_NOMATCH);                MRRETURN(MATCH_NOMATCH);
4354              }              }
4355            /* Control never gets here */            /* Control never gets here */
4356    
4357            case PT_WORD:            case PT_WORD:
4358            for (fi = min;; fi++)            for (fi = min;; fi++)
4359              {              {
4360              RMATCH(eptr, ecode, offset_top, md, ims, eptrb, 0, RM39);              RMATCH(eptr, ecode, offset_top, md, ims, eptrb, 0, RM62);
4361              if (rrc != MATCH_NOMATCH) RRETURN(rrc);              if (rrc != MATCH_NOMATCH) RRETURN(rrc);
4362              if (fi >= max) MRRETURN(MATCH_NOMATCH);              if (fi >= max) MRRETURN(MATCH_NOMATCH);
4363              if (eptr >= md->end_subject)              if (eptr >= md->end_subject)
# Line 4361  for (;;) Line 4365  for (;;)
4365                SCHECK_PARTIAL();                SCHECK_PARTIAL();
4366                MRRETURN(MATCH_NOMATCH);                MRRETURN(MATCH_NOMATCH);
4367                }                }
4368              GETCHARINC(c, eptr);              GETCHARINCTEST(c, eptr);
4369              prop_category = UCD_CATEGORY(c);              prop_category = UCD_CATEGORY(c);
4370              if ((prop_category == ucp_L ||              if ((prop_category == ucp_L ||
4371                   prop_category == ucp_N ||                   prop_category == ucp_N ||
4372                   c == CHAR_UNDERSCORE)                   c == CHAR_UNDERSCORE)
4373                     == prop_fail_result)                     == prop_fail_result)
4374                MRRETURN(MATCH_NOMATCH);                MRRETURN(MATCH_NOMATCH);
4375              }              }
4376            /* Control never gets here */            /* Control never gets here */
4377    
4378            /* This should never occur */            /* This should never occur */
4379    
4380            default:            default:
4381            RRETURN(PCRE_ERROR_INTERNAL);            RRETURN(PCRE_ERROR_INTERNAL);
4382            }            }
# Line 4719  for (;;) Line 4723  for (;;)
4723                SCHECK_PARTIAL();                SCHECK_PARTIAL();
4724                break;                break;
4725                }                }
4726              GETCHARLEN(c, eptr, len);              GETCHARLENTEST(c, eptr, len);
4727              if (prop_fail_result) break;              if (prop_fail_result) break;
4728              eptr+= len;              eptr+= len;
4729              }              }
# Line 4734  for (;;) Line 4738  for (;;)
4738                SCHECK_PARTIAL();                SCHECK_PARTIAL();
4739                break;                break;
4740                }                }
4741              GETCHARLEN(c, eptr, len);              GETCHARLENTEST(c, eptr, len);
4742              prop_chartype = UCD_CHARTYPE(c);              prop_chartype = UCD_CHARTYPE(c);
4743              if ((prop_chartype == ucp_Lu ||              if ((prop_chartype == ucp_Lu ||
4744                   prop_chartype == ucp_Ll ||                   prop_chartype == ucp_Ll ||
# Line 4753  for (;;) Line 4757  for (;;)
4757                SCHECK_PARTIAL();                SCHECK_PARTIAL();
4758                break;                break;
4759                }                }
4760              GETCHARLEN(c, eptr, len);              GETCHARLENTEST(c, eptr, len);
4761              prop_category = UCD_CATEGORY(c);              prop_category = UCD_CATEGORY(c);
4762              if ((prop_category == prop_value) == prop_fail_result)              if ((prop_category == prop_value) == prop_fail_result)
4763                break;                break;
# Line 4770  for (;;) Line 4774  for (;;)
4774                SCHECK_PARTIAL();                SCHECK_PARTIAL();
4775                break;                break;
4776                }                }
4777              GETCHARLEN(c, eptr, len);              GETCHARLENTEST(c, eptr, len);
4778              prop_chartype = UCD_CHARTYPE(c);              prop_chartype = UCD_CHARTYPE(c);
4779              if ((prop_chartype == prop_value) == prop_fail_result)              if ((prop_chartype == prop_value) == prop_fail_result)
4780                break;                break;
# Line 4787  for (;;) Line 4791  for (;;)
4791                SCHECK_PARTIAL();                SCHECK_PARTIAL();
4792                break;                break;
4793                }                }
4794              GETCHARLEN(c, eptr, len);              GETCHARLENTEST(c, eptr, len);
4795              prop_script = UCD_SCRIPT(c);              prop_script = UCD_SCRIPT(c);
4796              if ((prop_script == prop_value) == prop_fail_result)              if ((prop_script == prop_value) == prop_fail_result)
4797                break;                break;
4798              eptr+= len;              eptr+= len;
4799              }              }
4800            break;            break;
4801    
4802            case PT_ALNUM:            case PT_ALNUM:
4803            for (i = min; i < max; i++)            for (i = min; i < max; i++)
4804              {              {
# Line 4804  for (;;) Line 4808  for (;;)
4808                SCHECK_PARTIAL();                SCHECK_PARTIAL();
4809                break;                break;
4810                }                }
4811              GETCHARLEN(c, eptr, len);              GETCHARLENTEST(c, eptr, len);
4812              prop_category = UCD_CATEGORY(c);              prop_category = UCD_CATEGORY(c);
4813              if ((prop_category == ucp_L || prop_category == ucp_N)              if ((prop_category == ucp_L || prop_category == ucp_N)
4814                   == prop_fail_result)                   == prop_fail_result)
4815                break;                break;
4816              eptr+= len;              eptr+= len;
# Line 4822  for (;;) Line 4826  for (;;)
4826                SCHECK_PARTIAL();                SCHECK_PARTIAL();
4827                break;                break;
4828                }                }
4829              GETCHARLEN(c, eptr, len);              GETCHARLENTEST(c, eptr, len);
4830              prop_category = UCD_CATEGORY(c);              prop_category = UCD_CATEGORY(c);
4831              if ((prop_category == ucp_Z || c == CHAR_HT || c == CHAR_NL ||              if ((prop_category == ucp_Z || c == CHAR_HT || c == CHAR_NL ||
4832                   c == CHAR_FF || c == CHAR_CR)                   c == CHAR_FF || c == CHAR_CR)
4833                   == prop_fail_result)                   == prop_fail_result)
4834                break;                break;
4835              eptr+= len;              eptr+= len;
# Line 4841  for (;;) Line 4845  for (;;)
4845                SCHECK_PARTIAL();                SCHECK_PARTIAL();
4846                break;                break;
4847                }                }
4848              GETCHARLEN(c, eptr, len);              GETCHARLENTEST(c, eptr, len);
4849              prop_category = UCD_CATEGORY(c);              prop_category = UCD_CATEGORY(c);
4850              if ((prop_category == ucp_Z || c == CHAR_HT || c == CHAR_NL ||              if ((prop_category == ucp_Z || c == CHAR_HT || c == CHAR_NL ||
4851                   c == CHAR_VT || c == CHAR_FF || c == CHAR_CR)                   c == CHAR_VT || c == CHAR_FF || c == CHAR_CR)
4852                   == prop_fail_result)                   == prop_fail_result)
4853                break;                break;
4854              eptr+= len;              eptr+= len;
# Line 4860  for (;;) Line 4864  for (;;)
4864                SCHECK_PARTIAL();                SCHECK_PARTIAL();
4865                break;                break;
4866                }                }
4867              GETCHARLEN(c, eptr, len);              GETCHARLENTEST(c, eptr, len);
4868              prop_category = UCD_CATEGORY(c);              prop_category = UCD_CATEGORY(c);
4869              if ((prop_category == ucp_L || prop_category == ucp_N ||              if ((prop_category == ucp_L || prop_category == ucp_N ||
4870                   c == CHAR_UNDERSCORE) == prop_fail_result)                   c == CHAR_UNDERSCORE) == prop_fail_result)
# Line 5462  switch (frame->Xwhere) Line 5466  switch (frame->Xwhere)
5466    LBL(32) LBL(34) LBL(42) LBL(46)    LBL(32) LBL(34) LBL(42) LBL(46)
5467  #ifdef SUPPORT_UCP  #ifdef SUPPORT_UCP
5468    LBL(36) LBL(37) LBL(38) LBL(39) LBL(40) LBL(41) LBL(44) LBL(45)    LBL(36) LBL(37) LBL(38) LBL(39) LBL(40) LBL(41) LBL(44) LBL(45)
5469      LBL(59) LBL(60) LBL(61) LBL(62)
5470  #endif  /* SUPPORT_UCP */  #endif  /* SUPPORT_UCP */
5471  #endif  /* SUPPORT_UTF8 */  #endif  /* SUPPORT_UTF8 */
5472    default:    default:
# Line 5954  for(;;) Line 5959  for(;;)
5959        while (start_match < end_subject)        while (start_match < end_subject)
5960          {          {
5961          register unsigned int c = *start_match;          register unsigned int c = *start_match;
5962          if ((start_bits[c/8] & (1 << (c&7))) == 0) start_match++;          if ((start_bits[c/8] & (1 << (c&7))) == 0)
5963            else break;            {
5964              start_match++;
5965    #ifdef SUPPORT_UTF8
5966              if (utf8)
5967                while(start_match < end_subject && (*start_match & 0xc0) == 0x80)
5968                  start_match++;
5969    #endif
5970              }
5971            else break;
5972          }          }
5973        }        }
5974      }   /* Starting optimizations */      }   /* Starting optimizations */
# Line 6056  for(;;) Line 6069  for(;;)
6069    
6070    switch(rc)    switch(rc)
6071      {      {
6072      /* NOMATCH and PRUNE advance by one character. If MATCH_SKIP_ARG reaches      /* SKIP passes back the next starting point explicitly, but if it is the
6073      this level it means that a MARK that matched the SKIP's arg was not found.      same as the match we have just done, treat it as NOMATCH. */
6074      We treat this as NOMATCH. THEN at this level acts exactly like PRUNE. */  
6075        case MATCH_SKIP:
6076        if (md->start_match_ptr != start_match)
6077          {
6078          new_start_match = md->start_match_ptr;
6079          break;
6080          }
6081        /* Fall through */
6082    
6083        /* If MATCH_SKIP_ARG reaches this level it means that a MARK that matched
6084        the SKIP's arg was not found. We also treat this as NOMATCH. */
6085    
6086        case MATCH_SKIP_ARG:
6087        /* Fall through */
6088    
6089        /* NOMATCH and PRUNE advance by one character. THEN at this level acts
6090        exactly like PRUNE. */
6091    
6092      case MATCH_NOMATCH:      case MATCH_NOMATCH:
6093      case MATCH_PRUNE:      case MATCH_PRUNE:
     case MATCH_SKIP_ARG:  
6094      case MATCH_THEN:      case MATCH_THEN:
6095      new_start_match = start_match + 1;      new_start_match = start_match + 1;
6096  #ifdef SUPPORT_UTF8  #ifdef SUPPORT_UTF8
# Line 6072  for(;;) Line 6100  for(;;)
6100  #endif  #endif
6101      break;      break;
6102    
     /* SKIP passes back the next starting point explicitly. */  
   
     case MATCH_SKIP:  
     new_start_match = md->start_match_ptr;  
     break;  
   
6103      /* COMMIT disables the bumpalong, but otherwise behaves as NOMATCH. */      /* COMMIT disables the bumpalong, but otherwise behaves as NOMATCH. */
6104    
6105      case MATCH_COMMIT:      case MATCH_COMMIT:
# Line 6174  if (rc == MATCH_MATCH || rc == MATCH_ACC Line 6196  if (rc == MATCH_MATCH || rc == MATCH_ACC
6196    
6197    if (offsetcount < 2) rc = 0; else    if (offsetcount < 2) rc = 0; else
6198      {      {
6199      offsets[0] = md->start_match_ptr - md->start_subject;      offsets[0] = (int)(md->start_match_ptr - md->start_subject);
6200      offsets[1] = md->end_match_ptr - md->start_subject;      offsets[1] = (int)(md->end_match_ptr - md->start_subject);
6201      }      }
6202    
6203    DPRINTF((">>>> returning %d\n", rc));    DPRINTF((">>>> returning %d\n", rc));
# Line 6207  if (start_partial != NULL) Line 6229  if (start_partial != NULL)
6229    md->mark = NULL;    md->mark = NULL;
6230    if (offsetcount > 1)    if (offsetcount > 1)
6231      {      {
6232      offsets[0] = start_partial - (USPTR)subject;      offsets[0] = (int)(start_partial - (USPTR)subject);
6233      offsets[1] = end_subject - (USPTR)subject;      offsets[1] = (int)(end_subject - (USPTR)subject);
6234      }      }
6235    rc = PCRE_ERROR_PARTIAL;    rc = PCRE_ERROR_PARTIAL;
6236    }    }

Legend:
Removed from v.518  
changed lines
  Added in v.545

  ViewVC Help
Powered by ViewVC 1.1.5