/[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 1320 by ph10, Wed May 1 16:39:35 2013 UTC revision 1376 by ph10, Sat Oct 12 18:02:11 2013 UTC
# Line 120  static const pcre_uint8 coptable[] = { Line 120  static const pcre_uint8 coptable[] = {
120    0, 0,                          /* \P, \p                                 */    0, 0,                          /* \P, \p                                 */
121    0, 0, 0, 0, 0,                 /* \R, \H, \h, \V, \v                     */    0, 0, 0, 0, 0,                 /* \R, \H, \h, \V, \v                     */
122    0,                             /* \X                                     */    0,                             /* \X                                     */
123    0, 0, 0, 0, 0, 0,              /* \Z, \z, ^, ^M, $, $M                   */    0, 0, 0, 0, 0, 0,              /* \Z, \z, $, $M, ^, ^M                   */
124    1,                             /* Char                                   */    1,                             /* Char                                   */
125    1,                             /* Chari                                  */    1,                             /* Chari                                  */
126    1,                             /* not                                    */    1,                             /* not                                    */
# Line 156  static const pcre_uint8 coptable[] = { Line 156  static const pcre_uint8 coptable[] = {
156    0,                             /* XCLASS - variable length               */    0,                             /* XCLASS - variable length               */
157    0,                             /* REF                                    */    0,                             /* REF                                    */
158    0,                             /* REFI                                   */    0,                             /* REFI                                   */
159      0,                             /* DNREF                                  */
160      0,                             /* DNREFI                                 */
161    0,                             /* RECURSE                                */    0,                             /* RECURSE                                */
162    0,                             /* CALLOUT                                */    0,                             /* CALLOUT                                */
163    0,                             /* Alt                                    */    0,                             /* Alt                                    */
# Line 171  static const pcre_uint8 coptable[] = { Line 173  static const pcre_uint8 coptable[] = {
173    0, 0,                          /* ONCE, ONCE_NC                          */    0, 0,                          /* ONCE, ONCE_NC                          */
174    0, 0, 0, 0, 0,                 /* BRA, BRAPOS, CBRA, CBRAPOS, COND       */    0, 0, 0, 0, 0,                 /* BRA, BRAPOS, CBRA, CBRAPOS, COND       */
175    0, 0, 0, 0, 0,                 /* SBRA, SBRAPOS, SCBRA, SCBRAPOS, SCOND  */    0, 0, 0, 0, 0,                 /* SBRA, SBRAPOS, SCBRA, SCBRAPOS, SCOND  */
176    0, 0,                          /* CREF, NCREF                            */    0, 0,                          /* CREF, DNCREF                           */
177    0, 0,                          /* RREF, NRREF                            */    0, 0,                          /* RREF, DNRREF                           */
178    0,                             /* DEF                                    */    0,                             /* DEF                                    */
179    0, 0, 0,                       /* BRAZERO, BRAMINZERO, BRAPOSZERO        */    0, 0, 0,                       /* BRAZERO, BRAMINZERO, BRAPOSZERO        */
180    0, 0, 0,                       /* MARK, PRUNE, PRUNE_ARG                 */    0, 0, 0,                       /* MARK, PRUNE, PRUNE_ARG                 */
# Line 194  static const pcre_uint8 poptable[] = { Line 196  static const pcre_uint8 poptable[] = {
196    1, 1,                          /* \P, \p                                 */    1, 1,                          /* \P, \p                                 */
197    1, 1, 1, 1, 1,                 /* \R, \H, \h, \V, \v                     */    1, 1, 1, 1, 1,                 /* \R, \H, \h, \V, \v                     */
198    1,                             /* \X                                     */    1,                             /* \X                                     */
199    0, 0, 0, 0, 0, 0,              /* \Z, \z, ^, ^M, $, $M                   */    0, 0, 0, 0, 0, 0,              /* \Z, \z, $, $M, ^, ^M                   */
200    1,                             /* Char                                   */    1,                             /* Char                                   */
201    1,                             /* Chari                                  */    1,                             /* Chari                                  */
202    1,                             /* not                                    */    1,                             /* not                                    */
# Line 225  static const pcre_uint8 poptable[] = { Line 227  static const pcre_uint8 poptable[] = {
227    1,                             /* XCLASS - variable length               */    1,                             /* XCLASS - variable length               */
228    0,                             /* REF                                    */    0,                             /* REF                                    */
229    0,                             /* REFI                                   */    0,                             /* REFI                                   */
230      0,                             /* DNREF                                  */
231      0,                             /* DNREFI                                 */
232    0,                             /* RECURSE                                */    0,                             /* RECURSE                                */
233    0,                             /* CALLOUT                                */    0,                             /* CALLOUT                                */
234    0,                             /* Alt                                    */    0,                             /* Alt                                    */
# Line 240  static const pcre_uint8 poptable[] = { Line 244  static const pcre_uint8 poptable[] = {
244    0, 0,                          /* ONCE, ONCE_NC                          */    0, 0,                          /* ONCE, ONCE_NC                          */
245    0, 0, 0, 0, 0,                 /* BRA, BRAPOS, CBRA, CBRAPOS, COND       */    0, 0, 0, 0, 0,                 /* BRA, BRAPOS, CBRA, CBRAPOS, COND       */
246    0, 0, 0, 0, 0,                 /* SBRA, SBRAPOS, SCBRA, SCBRAPOS, SCOND  */    0, 0, 0, 0, 0,                 /* SBRA, SBRAPOS, SCBRA, SCBRAPOS, SCOND  */
247    0, 0,                          /* CREF, NCREF                            */    0, 0,                          /* CREF, DNCREF                           */
248    0, 0,                          /* RREF, NRREF                            */    0, 0,                          /* RREF, DNRREF                           */
249    0,                             /* DEF                                    */    0,                             /* DEF                                    */
250    0, 0, 0,                       /* BRAZERO, BRAMINZERO, BRAPOSZERO        */    0, 0, 0,                       /* BRAZERO, BRAMINZERO, BRAPOSZERO        */
251    0, 0, 0,                       /* MARK, PRUNE, PRUNE_ARG                 */    0, 0, 0,                       /* MARK, PRUNE, PRUNE_ARG                 */
# Line 636  for (;;) Line 640  for (;;)
640      const pcre_uchar *code;      const pcre_uchar *code;
641      int state_offset = current_state->offset;      int state_offset = current_state->offset;
642      int codevalue, rrc;      int codevalue, rrc;
643      unsigned int count;      int count;
644    
645  #ifdef PCRE_DEBUG  #ifdef PCRE_DEBUG
646      printf ("%.*sProcessing state %d c=", rlevel*2-2, SP, state_offset);      printf ("%.*sProcessing state %d c=", rlevel*2-2, SP, state_offset);
# Line 1094  for (;;) Line 1098  for (;;)
1098                 PRIV(ucp_gentype)[prop->chartype] == ucp_N;                 PRIV(ucp_gentype)[prop->chartype] == ucp_N;
1099            break;            break;
1100    
1101              /* Perl space used to exclude VT, but from Perl 5.18 it is included,
1102              which means that Perl space and POSIX space are now identical. PCRE
1103              was changed at release 8.34. */
1104    
1105            case PT_SPACE:    /* Perl space */            case PT_SPACE:    /* Perl space */
           OK = PRIV(ucp_gentype)[prop->chartype] == ucp_Z ||  
                c == CHAR_HT || c == CHAR_NL || c == CHAR_FF || c == CHAR_CR;  
           break;  
   
1106            case PT_PXSPACE:  /* POSIX space */            case PT_PXSPACE:  /* POSIX space */
1107            OK = PRIV(ucp_gentype)[prop->chartype] == ucp_Z ||            switch(c)
1108                 c == CHAR_HT || c == CHAR_NL || c == CHAR_VT ||              {
1109                 c == CHAR_FF || c == CHAR_CR;              HSPACE_CASES:
1110                VSPACE_CASES:
1111                OK = TRUE;
1112                break;
1113    
1114                default:
1115                OK = PRIV(ucp_gentype)[prop->chartype] == ucp_Z;
1116                break;
1117                }
1118            break;            break;
1119    
1120            case PT_WORD:            case PT_WORD:
# Line 1255  for (;;) Line 1267  for (;;)
1267                (d != OP_ANY || !IS_NEWLINE(ptr)) &&                (d != OP_ANY || !IS_NEWLINE(ptr)) &&
1268                ((ctypes[c] & toptable1[d]) ^ toptable2[d]) != 0))                ((ctypes[c] & toptable1[d]) ^ toptable2[d]) != 0))
1269            {            {
1270            if (++count >= GET2(code, 1))            if (++count >= (int)GET2(code, 1))
1271              { ADD_NEW(state_offset + 1 + IMM2_SIZE + 1, 0); }              { ADD_NEW(state_offset + 1 + IMM2_SIZE + 1, 0); }
1272            else            else
1273              { ADD_NEW(state_offset, count); }              { ADD_NEW(state_offset, count); }
# Line 1289  for (;;) Line 1301  for (;;)
1301              active_count--;           /* Remove non-match possibility */              active_count--;           /* Remove non-match possibility */
1302              next_active_state--;              next_active_state--;
1303              }              }
1304            if (++count >= GET2(code, 1))            if (++count >= (int)GET2(code, 1))
1305              { ADD_NEW(state_offset + 2 + IMM2_SIZE, 0); }              { ADD_NEW(state_offset + 2 + IMM2_SIZE, 0); }
1306            else            else
1307              { ADD_NEW(state_offset, count); }              { ADD_NEW(state_offset, count); }
# Line 1344  for (;;) Line 1356  for (;;)
1356                 PRIV(ucp_gentype)[prop->chartype] == ucp_N;                 PRIV(ucp_gentype)[prop->chartype] == ucp_N;
1357            break;            break;
1358    
1359              /* Perl space used to exclude VT, but from Perl 5.18 it is included,
1360              which means that Perl space and POSIX space are now identical. PCRE
1361              was changed at release 8.34. */
1362    
1363            case PT_SPACE:    /* Perl space */            case PT_SPACE:    /* Perl space */
           OK = PRIV(ucp_gentype)[prop->chartype] == ucp_Z ||  
                c == CHAR_HT || c == CHAR_NL || c == CHAR_FF || c == CHAR_CR;  
           break;  
   
1364            case PT_PXSPACE:  /* POSIX space */            case PT_PXSPACE:  /* POSIX space */
1365            OK = PRIV(ucp_gentype)[prop->chartype] == ucp_Z ||            switch(c)
1366                 c == CHAR_HT || c == CHAR_NL || c == CHAR_VT ||              {
1367                 c == CHAR_FF || c == CHAR_CR;              HSPACE_CASES:
1368                VSPACE_CASES:
1369                OK = TRUE;
1370                break;
1371    
1372                default:
1373                OK = PRIV(ucp_gentype)[prop->chartype] == ucp_Z;
1374                break;
1375                }
1376            break;            break;
1377    
1378            case PT_WORD:            case PT_WORD:
# Line 1588  for (;;) Line 1608  for (;;)
1608                 PRIV(ucp_gentype)[prop->chartype] == ucp_N;                 PRIV(ucp_gentype)[prop->chartype] == ucp_N;
1609            break;            break;
1610    
1611              /* Perl space used to exclude VT, but from Perl 5.18 it is included,
1612              which means that Perl space and POSIX space are now identical. PCRE
1613              was changed at release 8.34. */
1614    
1615            case PT_SPACE:    /* Perl space */            case PT_SPACE:    /* Perl space */
           OK = PRIV(ucp_gentype)[prop->chartype] == ucp_Z ||  
                c == CHAR_HT || c == CHAR_NL || c == CHAR_FF || c == CHAR_CR;  
           break;  
   
1616            case PT_PXSPACE:  /* POSIX space */            case PT_PXSPACE:  /* POSIX space */
1617            OK = PRIV(ucp_gentype)[prop->chartype] == ucp_Z ||            switch(c)
1618                 c == CHAR_HT || c == CHAR_NL || c == CHAR_VT ||              {
1619                 c == CHAR_FF || c == CHAR_CR;              HSPACE_CASES:
1620                VSPACE_CASES:
1621                OK = TRUE;
1622                break;
1623    
1624                default:
1625                OK = PRIV(ucp_gentype)[prop->chartype] == ucp_Z;
1626                break;
1627                }
1628            break;            break;
1629    
1630            case PT_WORD:            case PT_WORD:
# Line 1857  for (;;) Line 1885  for (;;)
1885                 PRIV(ucp_gentype)[prop->chartype] == ucp_N;                 PRIV(ucp_gentype)[prop->chartype] == ucp_N;
1886            break;            break;
1887    
1888              /* Perl space used to exclude VT, but from Perl 5.18 it is included,
1889              which means that Perl space and POSIX space are now identical. PCRE
1890              was changed at release 8.34. */
1891    
1892            case PT_SPACE:    /* Perl space */            case PT_SPACE:    /* Perl space */
           OK = PRIV(ucp_gentype)[prop->chartype] == ucp_Z ||  
                c == CHAR_HT || c == CHAR_NL || c == CHAR_FF || c == CHAR_CR;  
           break;  
   
1893            case PT_PXSPACE:  /* POSIX space */            case PT_PXSPACE:  /* POSIX space */
1894            OK = PRIV(ucp_gentype)[prop->chartype] == ucp_Z ||            switch(c)
1895                 c == CHAR_HT || c == CHAR_NL || c == CHAR_VT ||              {
1896                 c == CHAR_FF || c == CHAR_CR;              HSPACE_CASES:
1897                VSPACE_CASES:
1898                OK = TRUE;
1899                break;
1900    
1901                default:
1902                OK = PRIV(ucp_gentype)[prop->chartype] == ucp_Z;
1903                break;
1904                }
1905            break;            break;
1906    
1907            case PT_WORD:            case PT_WORD:
# Line 1903  for (;;) Line 1939  for (;;)
1939              active_count--;           /* Remove non-match possibility */              active_count--;           /* Remove non-match possibility */
1940              next_active_state--;              next_active_state--;
1941              }              }
1942            if (++count >= GET2(code, 1))            if (++count >= (int)GET2(code, 1))
1943              { ADD_NEW(state_offset + 1 + IMM2_SIZE + 3, 0); }              { ADD_NEW(state_offset + 1 + IMM2_SIZE + 3, 0); }
1944            else            else
1945              { ADD_NEW(state_offset, count); }              { ADD_NEW(state_offset, count); }
# Line 1942  for (;;) Line 1978  for (;;)
1978            }            }
1979          if (nptr >= end_subject && (md->moptions & PCRE_PARTIAL_HARD) != 0)          if (nptr >= end_subject && (md->moptions & PCRE_PARTIAL_HARD) != 0)
1980              reset_could_continue = TRUE;              reset_could_continue = TRUE;
1981          if (++count >= GET2(code, 1))          if (++count >= (int)GET2(code, 1))
1982            { ADD_NEW_DATA(-(state_offset + 2 + IMM2_SIZE), 0, ncount); }            { ADD_NEW_DATA(-(state_offset + 2 + IMM2_SIZE), 0, ncount); }
1983          else          else
1984            { ADD_NEW_DATA(-state_offset, count, ncount); }            { ADD_NEW_DATA(-state_offset, count, ncount); }
# Line 1984  for (;;) Line 2020  for (;;)
2020              active_count--;           /* Remove non-match possibility */              active_count--;           /* Remove non-match possibility */
2021              next_active_state--;              next_active_state--;
2022              }              }
2023            if (++count >= GET2(code, 1))            if (++count >= (int)GET2(code, 1))
2024              { ADD_NEW_DATA(-(state_offset + 2 + IMM2_SIZE), 0, ncount); }              { ADD_NEW_DATA(-(state_offset + 2 + IMM2_SIZE), 0, ncount); }
2025            else            else
2026              { ADD_NEW_DATA(-state_offset, count, ncount); }              { ADD_NEW_DATA(-state_offset, count, ncount); }
# Line 2024  for (;;) Line 2060  for (;;)
2060              active_count--;           /* Remove non-match possibility */              active_count--;           /* Remove non-match possibility */
2061              next_active_state--;              next_active_state--;
2062              }              }
2063            if (++count >= GET2(code, 1))            if (++count >= (int)GET2(code, 1))
2064              { ADD_NEW_DATA(-(state_offset + 2 + IMM2_SIZE), 0, 0); }              { ADD_NEW_DATA(-(state_offset + 2 + IMM2_SIZE), 0, 0); }
2065            else            else
2066              { ADD_NEW_DATA(-state_offset, count, 0); }              { ADD_NEW_DATA(-state_offset, count, 0); }
# Line 2061  for (;;) Line 2097  for (;;)
2097              active_count--;           /* Remove non-match possibility */              active_count--;           /* Remove non-match possibility */
2098              next_active_state--;              next_active_state--;
2099              }              }
2100            if (++count >= GET2(code, 1))            if (++count >= (int)GET2(code, 1))
2101              { ADD_NEW_DATA(-(state_offset + 2 + IMM2_SIZE), 0, 0); }              { ADD_NEW_DATA(-(state_offset + 2 + IMM2_SIZE), 0, 0); }
2102            else            else
2103              { ADD_NEW_DATA(-state_offset, count, 0); }              { ADD_NEW_DATA(-state_offset, count, 0); }
# Line 2431  for (;;) Line 2467  for (;;)
2467            }            }
2468          if ((c == d || c == otherd) == (codevalue < OP_NOTSTAR))          if ((c == d || c == otherd) == (codevalue < OP_NOTSTAR))
2469            {            {
2470            if (++count >= GET2(code, 1))            if (++count >= (int)GET2(code, 1))
2471              { ADD_NEW(state_offset + dlen + 1 + IMM2_SIZE, 0); }              { ADD_NEW(state_offset + dlen + 1 + IMM2_SIZE, 0); }
2472            else            else
2473              { ADD_NEW(state_offset, count); }              { ADD_NEW(state_offset, count); }
# Line 2480  for (;;) Line 2516  for (;;)
2516              active_count--;             /* Remove non-match possibility */              active_count--;             /* Remove non-match possibility */
2517              next_active_state--;              next_active_state--;
2518              }              }
2519            if (++count >= GET2(code, 1))            if (++count >= (int)GET2(code, 1))
2520              { ADD_NEW(state_offset + dlen + 1 + IMM2_SIZE, 0); }              { ADD_NEW(state_offset + dlen + 1 + IMM2_SIZE, 0); }
2521            else            else
2522              { ADD_NEW(state_offset, count); }              { ADD_NEW(state_offset, count); }
# Line 2553  for (;;) Line 2589  for (;;)
2589            case OP_CRRANGE:            case OP_CRRANGE:
2590            case OP_CRMINRANGE:            case OP_CRMINRANGE:
2591            count = current_state->count;  /* Already matched */            count = current_state->count;  /* Already matched */
2592            if (count >= GET2(ecode, 1))            if (count >= (int)GET2(ecode, 1))
2593              { ADD_ACTIVE(next_state_offset + 1 + 2 * IMM2_SIZE, 0); }              { ADD_ACTIVE(next_state_offset + 1 + 2 * IMM2_SIZE, 0); }
2594            if (isinclass)            if (isinclass)
2595              {              {
2596              unsigned int max = GET2(ecode, 1 + IMM2_SIZE);              int max = (int)GET2(ecode, 1 + IMM2_SIZE);
2597              if (++count >= max && max != 0)   /* Max 0 => no limit */              if (++count >= max && max != 0)   /* Max 0 => no limit */
2598                { ADD_NEW(next_state_offset + 1 + 2 * IMM2_SIZE, 0); }                { ADD_NEW(next_state_offset + 1 + 2 * IMM2_SIZE, 0); }
2599              else              else
# Line 2657  for (;;) Line 2693  for (;;)
2693    
2694          condcode = code[LINK_SIZE+1];          condcode = code[LINK_SIZE+1];
2695    
2696          /* Back reference conditions are not supported */          /* Back reference conditions and duplicate named recursion conditions
2697            are not supported */
2698    
2699          if (condcode == OP_CREF || condcode == OP_NCREF)          if (condcode == OP_CREF || condcode == OP_DNCREF ||
2700                condcode == OP_DNRREF)
2701            return PCRE_ERROR_DFA_UCOND;            return PCRE_ERROR_DFA_UCOND;
2702    
2703          /* The DEFINE condition is always false */          /* The DEFINE condition is always false */
# Line 2671  for (;;) Line 2709  for (;;)
2709          which means "test if in any recursion". We can't test for specifically          which means "test if in any recursion". We can't test for specifically
2710          recursed groups. */          recursed groups. */
2711    
2712          else if (condcode == OP_RREF || condcode == OP_NRREF)          else if (condcode == OP_RREF)
2713            {            {
2714            int value = GET2(code, LINK_SIZE + 2);            int value = GET2(code, LINK_SIZE + 2);
2715            if (value != RREF_ANY) return PCRE_ERROR_DFA_UCOND;            if (value != RREF_ANY) return PCRE_ERROR_DFA_UCOND;

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

  ViewVC Help
Powered by ViewVC 1.1.5