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

Diff of /code/trunk/pcre_dfa_exec.c

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

revision 1144 by ph10, Fri Oct 19 16:19:55 2012 UTC revision 1320 by ph10, Wed May 1 16:39:35 2013 UTC
# Line 7  and semantics are as close as possible t Line 7  and semantics are as close as possible t
7  below for why this module is different).  below for why this module is different).
8    
9                         Written by Philip Hazel                         Written by Philip Hazel
10             Copyright (c) 1997-2012 University of Cambridge             Copyright (c) 1997-2013 University of Cambridge
11    
12  -----------------------------------------------------------------------------  -----------------------------------------------------------------------------
13  Redistribution and use in source and binary forms, with or without  Redistribution and use in source and binary forms, with or without
# Line 1062  for (;;) Line 1062  for (;;)
1062        if (clen > 0)        if (clen > 0)
1063          {          {
1064          BOOL OK;          BOOL OK;
1065          const pcre_uint32 *cp;          const pcre_uint32 *cp;
1066          const ucd_record * prop = GET_UCD(c);          const ucd_record * prop = GET_UCD(c);
1067          switch(code[1])          switch(code[1])
1068            {            {
# Line 1110  for (;;) Line 1110  for (;;)
1110                 PRIV(ucp_gentype)[prop->chartype] == ucp_N ||                 PRIV(ucp_gentype)[prop->chartype] == ucp_N ||
1111                 c == CHAR_UNDERSCORE;                 c == CHAR_UNDERSCORE;
1112            break;            break;
1113    
1114            case PT_CLIST:            case PT_CLIST:
1115            cp = PRIV(ucd_caseless_sets) + prop->caseset;            cp = PRIV(ucd_caseless_sets) + code[2];
1116            for (;;)            for (;;)
1117              {              {
1118              if (c < *cp) { OK = FALSE; break; }              if (c < *cp) { OK = FALSE; break; }
1119              if (c == *cp++) { OK = TRUE; break; }              if (c == *cp++) { OK = TRUE; break; }
1120              }              }
1121            break;            break;
1122    
1123              case PT_UCNC:
1124              OK = c == CHAR_DOLLAR_SIGN || c == CHAR_COMMERCIAL_AT ||
1125                   c == CHAR_GRAVE_ACCENT || (c >= 0xa0 && c <= 0xd7ff) ||
1126                   c >= 0xe000;
1127              break;
1128    
1129            /* Should never occur, but keep compilers from grumbling. */            /* Should never occur, but keep compilers from grumbling. */
1130    
# Line 1306  for (;;) Line 1312  for (;;)
1312        if (clen > 0)        if (clen > 0)
1313          {          {
1314          BOOL OK;          BOOL OK;
1315          const pcre_uint32 *cp;          const pcre_uint32 *cp;
1316          const ucd_record * prop = GET_UCD(c);          const ucd_record * prop = GET_UCD(c);
1317          switch(code[2])          switch(code[2])
1318            {            {
# Line 1356  for (;;) Line 1362  for (;;)
1362            break;            break;
1363    
1364            case PT_CLIST:            case PT_CLIST:
1365            cp = PRIV(ucd_caseless_sets) + prop->caseset;            cp = PRIV(ucd_caseless_sets) + code[3];
1366            for (;;)            for (;;)
1367              {              {
1368              if (c < *cp) { OK = FALSE; break; }              if (c < *cp) { OK = FALSE; break; }
1369              if (c == *cp++) { OK = TRUE; break; }              if (c == *cp++) { OK = TRUE; break; }
1370              }              }
1371            break;            break;
1372    
1373              case PT_UCNC:
1374              OK = c == CHAR_DOLLAR_SIGN || c == CHAR_COMMERCIAL_AT ||
1375                   c == CHAR_GRAVE_ACCENT || (c >= 0xa0 && c <= 0xd7ff) ||
1376                   c >= 0xe000;
1377              break;
1378    
1379            /* Should never occur, but keep compilers from grumbling. */            /* Should never occur, but keep compilers from grumbling. */
1380    
# Line 1470  for (;;) Line 1482  for (;;)
1482          BOOL OK;          BOOL OK;
1483          switch (c)          switch (c)
1484            {            {
1485            VSPACE_CASES:            VSPACE_CASES:
1486            OK = TRUE;            OK = TRUE;
1487            break;            break;
1488    
# Line 1503  for (;;) Line 1515  for (;;)
1515          BOOL OK;          BOOL OK;
1516          switch (c)          switch (c)
1517            {            {
1518            HSPACE_CASES:            HSPACE_CASES:
1519            OK = TRUE;            OK = TRUE;
1520            break;            break;
1521    
# Line 1544  for (;;) Line 1556  for (;;)
1556        if (clen > 0)        if (clen > 0)
1557          {          {
1558          BOOL OK;          BOOL OK;
1559          const pcre_uint32 *cp;          const pcre_uint32 *cp;
1560          const ucd_record * prop = GET_UCD(c);          const ucd_record * prop = GET_UCD(c);
1561          switch(code[2])          switch(code[2])
1562            {            {
# Line 1594  for (;;) Line 1606  for (;;)
1606            break;            break;
1607    
1608            case PT_CLIST:            case PT_CLIST:
1609            cp = PRIV(ucd_caseless_sets) + prop->caseset;            cp = PRIV(ucd_caseless_sets) + code[3];
1610            for (;;)            for (;;)
1611              {              {
1612              if (c < *cp) { OK = FALSE; break; }              if (c < *cp) { OK = FALSE; break; }
1613              if (c == *cp++) { OK = TRUE; break; }              if (c == *cp++) { OK = TRUE; break; }
1614              }              }
1615            break;            break;
1616    
1617              case PT_UCNC:
1618              OK = c == CHAR_DOLLAR_SIGN || c == CHAR_COMMERCIAL_AT ||
1619                   c == CHAR_GRAVE_ACCENT || (c >= 0xa0 && c <= 0xd7ff) ||
1620                   c >= 0xe000;
1621              break;
1622    
1623            /* Should never occur, but keep compilers from grumbling. */            /* Should never occur, but keep compilers from grumbling. */
1624    
# Line 1705  for (;;) Line 1723  for (;;)
1723              active_count--;           /* Remove non-match possibility */              active_count--;           /* Remove non-match possibility */
1724              next_active_state--;              next_active_state--;
1725              }              }
1726            ADD_NEW_DATA(-(state_offset + count), 0, ncount);            ADD_NEW_DATA(-(state_offset + (int)count), 0, ncount);
1727            break;            break;
1728    
1729            default:            default:
# Line 1733  for (;;) Line 1751  for (;;)
1751          BOOL OK;          BOOL OK;
1752          switch (c)          switch (c)
1753            {            {
1754            VSPACE_CASES:            VSPACE_CASES:
1755            OK = TRUE;            OK = TRUE;
1756            break;            break;
1757    
# Line 1749  for (;;) Line 1767  for (;;)
1767              active_count--;           /* Remove non-match possibility */              active_count--;           /* Remove non-match possibility */
1768              next_active_state--;              next_active_state--;
1769              }              }
1770            ADD_NEW_DATA(-(state_offset + count), 0, 0);            ADD_NEW_DATA(-(state_offset + (int)count), 0, 0);
1771            }            }
1772          }          }
1773        break;        break;
# Line 1773  for (;;) Line 1791  for (;;)
1791          BOOL OK;          BOOL OK;
1792          switch (c)          switch (c)
1793            {            {
1794            HSPACE_CASES:            HSPACE_CASES:
1795            OK = TRUE;            OK = TRUE;
1796            break;            break;
1797    
# Line 1790  for (;;) Line 1808  for (;;)
1808              active_count--;           /* Remove non-match possibility */              active_count--;           /* Remove non-match possibility */
1809              next_active_state--;              next_active_state--;
1810              }              }
1811            ADD_NEW_DATA(-(state_offset + count), 0, 0);            ADD_NEW_DATA(-(state_offset + (int)count), 0, 0);
1812            }            }
1813          }          }
1814        break;        break;
# Line 1807  for (;;) Line 1825  for (;;)
1825        if (clen > 0)        if (clen > 0)
1826          {          {
1827          BOOL OK;          BOOL OK;
1828          const pcre_uint32 *cp;          const pcre_uint32 *cp;
1829          const ucd_record * prop = GET_UCD(c);          const ucd_record * prop = GET_UCD(c);
1830          switch(code[1 + IMM2_SIZE + 1])          switch(code[1 + IMM2_SIZE + 1])
1831            {            {
# Line 1857  for (;;) Line 1875  for (;;)
1875            break;            break;
1876    
1877            case PT_CLIST:            case PT_CLIST:
1878            cp = PRIV(ucd_caseless_sets) + prop->caseset;            cp = PRIV(ucd_caseless_sets) + code[1 + IMM2_SIZE + 2];
1879            for (;;)            for (;;)
1880              {              {
1881              if (c < *cp) { OK = FALSE; break; }              if (c < *cp) { OK = FALSE; break; }
1882              if (c == *cp++) { OK = TRUE; break; }              if (c == *cp++) { OK = TRUE; break; }
1883              }              }
1884            break;            break;
1885    
1886              case PT_UCNC:
1887              OK = c == CHAR_DOLLAR_SIGN || c == CHAR_COMMERCIAL_AT ||
1888                   c == CHAR_GRAVE_ACCENT || (c >= 0xa0 && c <= 0xd7ff) ||
1889                   c >= 0xe000;
1890              break;
1891    
1892            /* Should never occur, but keep compilers from grumbling. */            /* Should never occur, but keep compilers from grumbling. */
1893    
# Line 1985  for (;;) Line 2009  for (;;)
2009          BOOL OK;          BOOL OK;
2010          switch (c)          switch (c)
2011            {            {
2012            VSPACE_CASES:            VSPACE_CASES:
2013            OK = TRUE;            OK = TRUE;
2014            break;            break;
2015    
# Line 2021  for (;;) Line 2045  for (;;)
2045          BOOL OK;          BOOL OK;
2046          switch (c)          switch (c)
2047            {            {
2048            HSPACE_CASES:            HSPACE_CASES:
2049            OK = TRUE;            OK = TRUE;
2050            break;            break;
2051    
# Line 2164  for (;;) Line 2188  for (;;)
2188        case OP_NOT_VSPACE:        case OP_NOT_VSPACE:
2189        if (clen > 0) switch(c)        if (clen > 0) switch(c)
2190          {          {
2191          VSPACE_CASES:          VSPACE_CASES:
2192          break;          break;
2193    
2194          default:          default:
# Line 2177  for (;;) Line 2201  for (;;)
2201        case OP_VSPACE:        case OP_VSPACE:
2202        if (clen > 0) switch(c)        if (clen > 0) switch(c)
2203          {          {
2204          VSPACE_CASES:          VSPACE_CASES:
2205          ADD_NEW(state_offset + 1, 0);          ADD_NEW(state_offset + 1, 0);
2206          break;          break;
2207    
2208          default:          default:
2209          break;          break;
2210          }          }
2211        break;        break;
# Line 2190  for (;;) Line 2214  for (;;)
2214        case OP_NOT_HSPACE:        case OP_NOT_HSPACE:
2215        if (clen > 0) switch(c)        if (clen > 0) switch(c)
2216          {          {
2217          HSPACE_CASES:          HSPACE_CASES:
2218          break;          break;
2219    
2220          default:          default:
# Line 2203  for (;;) Line 2227  for (;;)
2227        case OP_HSPACE:        case OP_HSPACE:
2228        if (clen > 0) switch(c)        if (clen > 0) switch(c)
2229          {          {
2230          HSPACE_CASES:          HSPACE_CASES:
2231          ADD_NEW(state_offset + 1, 0);          ADD_NEW(state_offset + 1, 0);
2232          break;          break;
2233    
2234          default:          default:
2235          break;          break;
2236          }          }
2237        break;        break;
2238    
# Line 3023  for (;;) Line 3047  for (;;)
3047            ptr > md->start_used_ptr)            /* Inspected non-empty string */            ptr > md->start_used_ptr)            /* Inspected non-empty string */
3048            )            )
3049          )          )
       {  
       if (offsetcount >= 2)  
         {  
         offsets[0] = (int)(md->start_used_ptr - start_subject);  
         offsets[1] = (int)(end_subject - start_subject);  
         }  
3050        match_count = PCRE_ERROR_PARTIAL;        match_count = PCRE_ERROR_PARTIAL;
       }  
   
3051      DPRINTF(("%.*sEnd of internal_dfa_exec %d: returning %d\n"      DPRINTF(("%.*sEnd of internal_dfa_exec %d: returning %d\n"
3052        "%.*s---------------------\n\n", rlevel*2-2, SP, rlevel, match_count,        "%.*s---------------------\n\n", rlevel*2-2, SP, rlevel, match_count,
3053        rlevel*2-2, SP));        rlevel*2-2, SP));
# Line 3122  if (re == NULL || subject == NULL || wor Line 3138  if (re == NULL || subject == NULL || wor
3138     (offsets == NULL && offsetcount > 0)) return PCRE_ERROR_NULL;     (offsets == NULL && offsetcount > 0)) return PCRE_ERROR_NULL;
3139  if (offsetcount < 0) return PCRE_ERROR_BADCOUNT;  if (offsetcount < 0) return PCRE_ERROR_BADCOUNT;
3140  if (wscount < 20) return PCRE_ERROR_DFA_WSSIZE;  if (wscount < 20) return PCRE_ERROR_DFA_WSSIZE;
3141    if (length < 0) return PCRE_ERROR_BADLENGTH;
3142  if (start_offset < 0 || start_offset > length) return PCRE_ERROR_BADOFFSET;  if (start_offset < 0 || start_offset > length) return PCRE_ERROR_BADOFFSET;
3143    
3144  /* 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 3544  for (;;) Line 3561  for (;;)
3561    /* Anything other than "no match" means we are done, always; otherwise, carry    /* Anything other than "no match" means we are done, always; otherwise, carry
3562    on only if not anchored. */    on only if not anchored. */
3563    
3564    if (rc != PCRE_ERROR_NOMATCH || anchored) return rc;    if (rc != PCRE_ERROR_NOMATCH || anchored)
3565        {
3566        if (rc == PCRE_ERROR_PARTIAL && offsetcount >= 2)
3567          {
3568          offsets[0] = (int)(md->start_used_ptr - (PCRE_PUCHAR)subject);
3569          offsets[1] = (int)(end_subject - (PCRE_PUCHAR)subject);
3570          if (offsetcount > 2)
3571            offsets[2] = (int)(current_subject - (PCRE_PUCHAR)subject);
3572          }
3573        return rc;
3574        }
3575    
3576    /* 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
3577    and firstline is set. */    and firstline is set. */

Legend:
Removed from v.1144  
changed lines
  Added in v.1320

  ViewVC Help
Powered by ViewVC 1.1.5