/[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 963 by ph10, Sat Apr 21 18:06:31 2012 UTC revision 1041 by ph10, Sun Sep 16 10:16:27 2012 UTC
# Line 37  POSSIBILITY OF SUCH DAMAGE. Line 37  POSSIBILITY OF SUCH DAMAGE.
37  -----------------------------------------------------------------------------  -----------------------------------------------------------------------------
38  */  */
39    
   
40  /* This module contains pcre_exec(), the externally visible function that does  /* This module contains pcre_exec(), the externally visible function that does
41  pattern matching using an NFA algorithm, trying to mimic Perl as closely as  pattern matching using an NFA algorithm, trying to mimic Perl as closely as
42  possible. There are also some static supporting functions. */  possible. There are also some static supporting functions. */
# Line 907  for (;;) Line 906  for (;;)
906        }        }
907      else  /* OP_KETRMAX */      else  /* OP_KETRMAX */
908        {        {
       md->match_function_type = MATCH_CBEGROUP;  
909        RMATCH(eptr, prev, offset_top, md, eptrb, RM66);        RMATCH(eptr, prev, offset_top, md, eptrb, RM66);
910        if (rrc != MATCH_NOMATCH) RRETURN(rrc);        if (rrc != MATCH_NOMATCH) RRETURN(rrc);
911        ecode += 1 + LINK_SIZE;        ecode += 1 + LINK_SIZE;
# Line 1036  for (;;) Line 1034  for (;;)
1034    
1035      for (;;)      for (;;)
1036        {        {
1037        if (op >= OP_SBRA || op == OP_ONCE) md->match_function_type = MATCH_CBEGROUP;        if (op >= OP_SBRA || op == OP_ONCE)
1038            md->match_function_type = MATCH_CBEGROUP;
1039    
1040        /* If this is not a possibly empty group, and there are no (*THEN)s in        /* If this is not a possibly empty group, and there are no (*THEN)s in
1041        the pattern, and this is the final alternative, optimize as described        the pattern, and this is the final alternative, optimize as described
# Line 1577  for (;;) Line 1576  for (;;)
1576          }          }
1577        md->mark = save_mark;        md->mark = save_mark;
1578    
1579        /* A COMMIT failure must fail the entire assertion, without trying any        /* A COMMIT failure must fail the entire assertion, without trying any
1580        subsequent branches. */        subsequent branches. */
1581    
1582        if (rrc == MATCH_COMMIT) RRETURN(MATCH_NOMATCH);        if (rrc == MATCH_COMMIT) RRETURN(MATCH_NOMATCH);
1583    
1584        /* PCRE does not allow THEN to escape beyond an assertion; it        /* PCRE does not allow THEN to escape beyond an assertion; it
# Line 2009  for (;;) Line 2008  for (;;)
2008          }          }
2009        if (*prev >= OP_SBRA)    /* Could match an empty string */        if (*prev >= OP_SBRA)    /* Could match an empty string */
2010          {          {
         md->match_function_type = MATCH_CBEGROUP;  
2011          RMATCH(eptr, prev, offset_top, md, eptrb, RM50);          RMATCH(eptr, prev, offset_top, md, eptrb, RM50);
2012          RRETURN(rrc);          RRETURN(rrc);
2013          }          }
# Line 2018  for (;;) Line 2016  for (;;)
2016        }        }
2017      else  /* OP_KETRMAX */      else  /* OP_KETRMAX */
2018        {        {
       if (*prev >= OP_SBRA) md->match_function_type = MATCH_CBEGROUP;  
2019        RMATCH(eptr, prev, offset_top, md, eptrb, RM13);        RMATCH(eptr, prev, offset_top, md, eptrb, RM13);
2020        if (rrc == MATCH_ONCE && md->once_target == prev) rrc = MATCH_NOMATCH;        if (rrc == MATCH_ONCE && md->once_target == prev) rrc = MATCH_NOMATCH;
2021        if (rrc != MATCH_NOMATCH) RRETURN(rrc);        if (rrc != MATCH_NOMATCH) RRETURN(rrc);
# Line 2418  for (;;) Line 2415  for (;;)
2415        {        {
2416        default: RRETURN(MATCH_NOMATCH);        default: RRETURN(MATCH_NOMATCH);
2417    
2418        case 0x000d:        case CHAR_CR:
2419        if (eptr >= md->end_subject)        if (eptr >= md->end_subject)
2420          {          {
2421          SCHECK_PARTIAL();          SCHECK_PARTIAL();
2422          }          }
2423        else if (*eptr == 0x0a) eptr++;        else if (*eptr == CHAR_LF) eptr++;
2424        break;        break;
2425    
2426        case 0x000a:        case CHAR_LF:
2427        break;        break;
2428    
2429        case 0x000b:        case CHAR_VT:
2430        case 0x000c:        case CHAR_FF:
2431        case 0x0085:        case CHAR_NEL:
2432    #ifndef EBCDIC
2433        case 0x2028:        case 0x2028:
2434        case 0x2029:        case 0x2029:
2435    #endif  /* Not EBCDIC */
2436        if (md->bsr_anycrlf) RRETURN(MATCH_NOMATCH);        if (md->bsr_anycrlf) RRETURN(MATCH_NOMATCH);
2437        break;        break;
2438        }        }
# Line 2449  for (;;) Line 2448  for (;;)
2448      GETCHARINCTEST(c, eptr);      GETCHARINCTEST(c, eptr);
2449      switch(c)      switch(c)
2450        {        {
2451          HSPACE_CASES: RRETURN(MATCH_NOMATCH);  /* Byte and multibyte cases */
2452        default: break;        default: break;
       case 0x09:      /* HT */  
       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 */  
       RRETURN(MATCH_NOMATCH);  
2453        }        }
2454      ecode++;      ecode++;
2455      break;      break;
# Line 2483  for (;;) Line 2463  for (;;)
2463      GETCHARINCTEST(c, eptr);      GETCHARINCTEST(c, eptr);
2464      switch(c)      switch(c)
2465        {        {
2466          HSPACE_CASES: break;  /* Byte and multibyte cases */
2467        default: RRETURN(MATCH_NOMATCH);        default: RRETURN(MATCH_NOMATCH);
       case 0x09:      /* HT */  
       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;  
2468        }        }
2469      ecode++;      ecode++;
2470      break;      break;
# Line 2517  for (;;) Line 2478  for (;;)
2478      GETCHARINCTEST(c, eptr);      GETCHARINCTEST(c, eptr);
2479      switch(c)      switch(c)
2480        {        {
2481          VSPACE_CASES: RRETURN(MATCH_NOMATCH);
2482        default: break;        default: break;
       case 0x0a:      /* LF */  
       case 0x0b:      /* VT */  
       case 0x0c:      /* FF */  
       case 0x0d:      /* CR */  
       case 0x85:      /* NEL */  
       case 0x2028:    /* LINE SEPARATOR */  
       case 0x2029:    /* PARAGRAPH SEPARATOR */  
       RRETURN(MATCH_NOMATCH);  
2483        }        }
2484      ecode++;      ecode++;
2485      break;      break;
# Line 2539  for (;;) Line 2493  for (;;)
2493      GETCHARINCTEST(c, eptr);      GETCHARINCTEST(c, eptr);
2494      switch(c)      switch(c)
2495        {        {
2496          VSPACE_CASES: break;
2497        default: RRETURN(MATCH_NOMATCH);        default: RRETURN(MATCH_NOMATCH);
       case 0x0a:      /* LF */  
       case 0x0b:      /* VT */  
       case 0x0c:      /* FF */  
       case 0x0d:      /* CR */  
       case 0x85:      /* NEL */  
       case 0x2028:    /* LINE SEPARATOR */  
       case 0x2029:    /* PARAGRAPH SEPARATOR */  
       break;  
2498        }        }
2499      ecode++;      ecode++;
2500      break;      break;
# Line 2644  for (;;) Line 2591  for (;;)
2591        SCHECK_PARTIAL();        SCHECK_PARTIAL();
2592        RRETURN(MATCH_NOMATCH);        RRETURN(MATCH_NOMATCH);
2593        }        }
2594      GETCHARINCTEST(c, eptr);      else
     if (UCD_CATEGORY(c) == ucp_M) RRETURN(MATCH_NOMATCH);  
     while (eptr < md->end_subject)  
2595        {        {
2596        int len = 1;        int lgb, rgb;
2597        if (!utf) c = *eptr; else { GETCHARLEN(c, eptr, len); }        GETCHARINCTEST(c, eptr);
2598        if (UCD_CATEGORY(c) != ucp_M) break;        lgb = UCD_GRAPHBREAK(c);
2599        eptr += len;        while (eptr < md->end_subject)
2600            {
2601            int len = 1;
2602            if (!utf) c = *eptr; else { GETCHARLEN(c, eptr, len); }
2603            rgb = UCD_GRAPHBREAK(c);
2604            if ((PRIV(ucp_gbtable)[lgb] & (1 << rgb)) == 0) break;
2605            lgb = rgb;
2606            eptr += len;
2607            }
2608        }        }
2609      CHECK_PARTIAL();      CHECK_PARTIAL();
2610      ecode++;      ecode++;
# Line 3431  for (;;) Line 3384  for (;;)
3384      maximizing, find the maximum number of characters and work backwards. */      maximizing, find the maximum number of characters and work backwards. */
3385    
3386      DPRINTF(("matching %c{%d,%d} against subject %.*s\n", fc, min, max,      DPRINTF(("matching %c{%d,%d} against subject %.*s\n", fc, min, max,
3387        max, eptr));        max, (char *)eptr));
3388    
3389      if (op >= OP_STARI)  /* Caseless */      if (op >= OP_STARI)  /* Caseless */
3390        {        {
# Line 3700  for (;;) Line 3653  for (;;)
3653      characters and work backwards. */      characters and work backwards. */
3654    
3655      DPRINTF(("negative matching %c{%d,%d} against subject %.*s\n", fc, min, max,      DPRINTF(("negative matching %c{%d,%d} against subject %.*s\n", fc, min, max,
3656        max, eptr));        max, (char *)eptr));
3657    
3658      if (op >= OP_NOTSTARI)     /* Caseless */      if (op >= OP_NOTSTARI)     /* Caseless */
3659        {        {
# Line 4229  for (;;) Line 4182  for (;;)
4182              SCHECK_PARTIAL();              SCHECK_PARTIAL();
4183              RRETURN(MATCH_NOMATCH);              RRETURN(MATCH_NOMATCH);
4184              }              }
4185            GETCHARINCTEST(c, eptr);            else
           if (UCD_CATEGORY(c) == ucp_M) RRETURN(MATCH_NOMATCH);  
           while (eptr < md->end_subject)  
4186              {              {
4187              int len = 1;              int lgb, rgb;
4188              if (!utf) c = *eptr; else { GETCHARLEN(c, eptr, len); }              GETCHARINCTEST(c, eptr);
4189              if (UCD_CATEGORY(c) != ucp_M) break;              lgb = UCD_GRAPHBREAK(c);
4190              eptr += len;             while (eptr < md->end_subject)
4191                  {
4192                  int len = 1;
4193                  if (!utf) c = *eptr; else { GETCHARLEN(c, eptr, len); }
4194                  rgb = UCD_GRAPHBREAK(c);
4195                  if ((PRIV(ucp_gbtable)[lgb] & (1 << rgb)) == 0) break;
4196                  lgb = rgb;
4197                  eptr += len;
4198                  }
4199              }              }
4200            CHECK_PARTIAL();            CHECK_PARTIAL();
4201            }            }
# Line 4304  for (;;) Line 4263  for (;;)
4263              {              {
4264              default: RRETURN(MATCH_NOMATCH);              default: RRETURN(MATCH_NOMATCH);
4265    
4266              case 0x000d:              case CHAR_CR:
4267              if (eptr < md->end_subject && *eptr == 0x0a) eptr++;              if (eptr < md->end_subject && *eptr == CHAR_LF) eptr++;
4268              break;              break;
4269    
4270              case 0x000a:              case CHAR_LF:
4271              break;              break;
4272    
4273              case 0x000b:              case CHAR_VT:
4274              case 0x000c:              case CHAR_FF:
4275              case 0x0085:              case CHAR_NEL:
4276    #ifndef EBCDIC
4277              case 0x2028:              case 0x2028:
4278              case 0x2029:              case 0x2029:
4279    #endif  /* Not EBCDIC */
4280              if (md->bsr_anycrlf) RRETURN(MATCH_NOMATCH);              if (md->bsr_anycrlf) RRETURN(MATCH_NOMATCH);
4281              break;              break;
4282              }              }
# Line 4333  for (;;) Line 4294  for (;;)
4294            GETCHARINC(c, eptr);            GETCHARINC(c, eptr);
4295            switch(c)            switch(c)
4296              {              {
4297                HSPACE_CASES: RRETURN(MATCH_NOMATCH);  /* Byte and multibyte cases */
4298              default: break;              default: break;
             case 0x09:      /* HT */  
             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 */  
             RRETURN(MATCH_NOMATCH);  
4299              }              }
4300            }            }
4301          break;          break;
# Line 4369  for (;;) Line 4311  for (;;)
4311            GETCHARINC(c, eptr);            GETCHARINC(c, eptr);
4312            switch(c)            switch(c)
4313              {              {
4314                HSPACE_CASES: break;  /* Byte and multibyte cases */
4315              default: RRETURN(MATCH_NOMATCH);              default: RRETURN(MATCH_NOMATCH);
             case 0x09:      /* HT */  
             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;  
4316              }              }
4317            }            }
4318          break;          break;
# Line 4405  for (;;) Line 4328  for (;;)
4328            GETCHARINC(c, eptr);            GETCHARINC(c, eptr);
4329            switch(c)            switch(c)
4330              {              {
4331                VSPACE_CASES: RRETURN(MATCH_NOMATCH);
4332              default: break;              default: break;
             case 0x0a:      /* LF */  
             case 0x0b:      /* VT */  
             case 0x0c:      /* FF */  
             case 0x0d:      /* CR */  
             case 0x85:      /* NEL */  
             case 0x2028:    /* LINE SEPARATOR */  
             case 0x2029:    /* PARAGRAPH SEPARATOR */  
             RRETURN(MATCH_NOMATCH);  
4333              }              }
4334            }            }
4335          break;          break;
# Line 4429  for (;;) Line 4345  for (;;)
4345            GETCHARINC(c, eptr);            GETCHARINC(c, eptr);
4346            switch(c)            switch(c)
4347              {              {
4348                VSPACE_CASES: break;
4349              default: RRETURN(MATCH_NOMATCH);              default: RRETURN(MATCH_NOMATCH);
             case 0x0a:      /* LF */  
             case 0x0b:      /* VT */  
             case 0x0c:      /* FF */  
             case 0x0d:      /* CR */  
             case 0x85:      /* NEL */  
             case 0x2028:    /* LINE SEPARATOR */  
             case 0x2029:    /* PARAGRAPH SEPARATOR */  
             break;  
4350              }              }
4351            }            }
4352          break;          break;
# Line 4595  for (;;) Line 4504  for (;;)
4504              {              {
4505              default: RRETURN(MATCH_NOMATCH);              default: RRETURN(MATCH_NOMATCH);
4506    
4507              case 0x000d:              case CHAR_CR:
4508              if (eptr < md->end_subject && *eptr == 0x0a) eptr++;              if (eptr < md->end_subject && *eptr == CHAR_LF) eptr++;
4509              break;              break;
4510    
4511              case 0x000a:              case CHAR_LF:
4512              break;              break;
4513    
4514              case 0x000b:              case CHAR_VT:
4515              case 0x000c:              case CHAR_FF:
4516              case 0x0085:              case CHAR_NEL:
4517  #ifdef COMPILE_PCRE16  #ifdef COMPILE_PCRE16
4518              case 0x2028:              case 0x2028:
4519              case 0x2029:              case 0x2029:
# Line 4626  for (;;) Line 4535  for (;;)
4535            switch(*eptr++)            switch(*eptr++)
4536              {              {
4537              default: break;              default: break;
4538              case 0x09:      /* HT */              HSPACE_BYTE_CASES:
             case 0x20:      /* SPACE */  
             case 0xa0:      /* NBSP */  
4539  #ifdef COMPILE_PCRE16  #ifdef COMPILE_PCRE16
4540              case 0x1680:    /* OGHAM SPACE MARK */              HSPACE_MULTIBYTE_CASES:
             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 */  
4541  #endif  #endif
4542              RRETURN(MATCH_NOMATCH);              RRETURN(MATCH_NOMATCH);
4543              }              }
# Line 4663  for (;;) Line 4555  for (;;)
4555            switch(*eptr++)            switch(*eptr++)
4556              {              {
4557              default: RRETURN(MATCH_NOMATCH);              default: RRETURN(MATCH_NOMATCH);
4558              case 0x09:      /* HT */              HSPACE_BYTE_CASES:
             case 0x20:      /* SPACE */  
             case 0xa0:      /* NBSP */  
4559  #ifdef COMPILE_PCRE16  #ifdef COMPILE_PCRE16
4560              case 0x1680:    /* OGHAM SPACE MARK */              HSPACE_MULTIBYTE_CASES:
             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 */  
4561  #endif  #endif
4562              break;              break;
4563              }              }
# Line 4699  for (;;) Line 4574  for (;;)
4574              }              }
4575            switch(*eptr++)            switch(*eptr++)
4576              {              {
4577              default: break;              VSPACE_BYTE_CASES:
             case 0x0a:      /* LF */  
             case 0x0b:      /* VT */  
             case 0x0c:      /* FF */  
             case 0x0d:      /* CR */  
             case 0x85:      /* NEL */  
4578  #ifdef COMPILE_PCRE16  #ifdef COMPILE_PCRE16
4579              case 0x2028:    /* LINE SEPARATOR */              VSPACE_MULTIBYTE_CASES:
             case 0x2029:    /* PARAGRAPH SEPARATOR */  
4580  #endif  #endif
4581              RRETURN(MATCH_NOMATCH);              RRETURN(MATCH_NOMATCH);
4582                default: break;
4583              }              }
4584            }            }
4585          break;          break;
# Line 4725  for (;;) Line 4595  for (;;)
4595            switch(*eptr++)            switch(*eptr++)
4596              {              {
4597              default: RRETURN(MATCH_NOMATCH);              default: RRETURN(MATCH_NOMATCH);
4598              case 0x0a:      /* LF */              VSPACE_BYTE_CASES:
             case 0x0b:      /* VT */  
             case 0x0c:      /* FF */  
             case 0x0d:      /* CR */  
             case 0x85:      /* NEL */  
4599  #ifdef COMPILE_PCRE16  #ifdef COMPILE_PCRE16
4600              case 0x2028:    /* LINE SEPARATOR */              VSPACE_MULTIBYTE_CASES:
             case 0x2029:    /* PARAGRAPH SEPARATOR */  
4601  #endif  #endif
4602              break;              break;
4603              }              }
# Line 5032  for (;;) Line 4897  for (;;)
4897              SCHECK_PARTIAL();              SCHECK_PARTIAL();
4898              RRETURN(MATCH_NOMATCH);              RRETURN(MATCH_NOMATCH);
4899              }              }
4900            GETCHARINCTEST(c, eptr);            else
           if (UCD_CATEGORY(c) == ucp_M) RRETURN(MATCH_NOMATCH);  
           while (eptr < md->end_subject)  
4901              {              {
4902              int len = 1;              int lgb, rgb;
4903              if (!utf) c = *eptr; else { GETCHARLEN(c, eptr, len); }              GETCHARINCTEST(c, eptr);
4904              if (UCD_CATEGORY(c) != ucp_M) break;              lgb = UCD_GRAPHBREAK(c);
4905              eptr += len;              while (eptr < md->end_subject)
4906                  {
4907                  int len = 1;
4908                  if (!utf) c = *eptr; else { GETCHARLEN(c, eptr, len); }
4909                  rgb = UCD_GRAPHBREAK(c);
4910                  if ((PRIV(ucp_gbtable)[lgb] & (1 << rgb)) == 0) break;
4911                  lgb = rgb;
4912                  eptr += len;
4913                  }
4914              }              }
4915            CHECK_PARTIAL();            CHECK_PARTIAL();
4916            }            }
# Line 5085  for (;;) Line 4956  for (;;)
4956              switch(c)              switch(c)
4957                {                {
4958                default: RRETURN(MATCH_NOMATCH);                default: RRETURN(MATCH_NOMATCH);
4959                case 0x000d:                case CHAR_CR:
4960                if (eptr < md->end_subject && *eptr == 0x0a) eptr++;                if (eptr < md->end_subject && *eptr == CHAR_LF) eptr++;
4961                break;                break;
4962                case 0x000a:  
4963                  case CHAR_LF:
4964                break;                break;
4965    
4966                case 0x000b:                case CHAR_VT:
4967                case 0x000c:                case CHAR_FF:
4968                case 0x0085:                case CHAR_NEL:
4969    #ifndef EBCDIC
4970                case 0x2028:                case 0x2028:
4971                case 0x2029:                case 0x2029:
4972    #endif  /* Not EBCDIC */
4973                if (md->bsr_anycrlf) RRETURN(MATCH_NOMATCH);                if (md->bsr_anycrlf) RRETURN(MATCH_NOMATCH);
4974                break;                break;
4975                }                }
# Line 5104  for (;;) Line 4978  for (;;)
4978              case OP_NOT_HSPACE:              case OP_NOT_HSPACE:
4979              switch(c)              switch(c)
4980                {                {
4981                  HSPACE_CASES: RRETURN(MATCH_NOMATCH);
4982                default: break;                default: break;
               case 0x09:      /* HT */  
               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 */  
               RRETURN(MATCH_NOMATCH);  
4983                }                }
4984              break;              break;
4985    
4986              case OP_HSPACE:              case OP_HSPACE:
4987              switch(c)              switch(c)
4988                {                {
4989                  HSPACE_CASES: break;
4990                default: RRETURN(MATCH_NOMATCH);                default: RRETURN(MATCH_NOMATCH);
               case 0x09:      /* HT */  
               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;  
4991                }                }
4992              break;              break;
4993    
4994              case OP_NOT_VSPACE:              case OP_NOT_VSPACE:
4995              switch(c)              switch(c)
4996                {                {
4997                  VSPACE_CASES: RRETURN(MATCH_NOMATCH);
4998                default: break;                default: break;
               case 0x0a:      /* LF */  
               case 0x0b:      /* VT */  
               case 0x0c:      /* FF */  
               case 0x0d:      /* CR */  
               case 0x85:      /* NEL */  
               case 0x2028:    /* LINE SEPARATOR */  
               case 0x2029:    /* PARAGRAPH SEPARATOR */  
               RRETURN(MATCH_NOMATCH);  
4999                }                }
5000              break;              break;
5001    
5002              case OP_VSPACE:              case OP_VSPACE:
5003              switch(c)              switch(c)
5004                {                {
5005                  VSPACE_CASES: break;
5006                default: RRETURN(MATCH_NOMATCH);                default: RRETURN(MATCH_NOMATCH);
               case 0x0a:      /* LF */  
               case 0x0b:      /* VT */  
               case 0x0c:      /* FF */  
               case 0x0d:      /* CR */  
               case 0x85:      /* NEL */  
               case 0x2028:    /* LINE SEPARATOR */  
               case 0x2029:    /* PARAGRAPH SEPARATOR */  
               break;  
5007                }                }
5008              break;              break;
5009    
# Line 5259  for (;;) Line 5081  for (;;)
5081              switch(c)              switch(c)
5082                {                {
5083                default: RRETURN(MATCH_NOMATCH);                default: RRETURN(MATCH_NOMATCH);
5084                case 0x000d:                case CHAR_CR:
5085                if (eptr < md->end_subject && *eptr == 0x0a) eptr++;                if (eptr < md->end_subject && *eptr == CHAR_LF) eptr++;
5086                break;                break;
5087    
5088                case 0x000a:                case CHAR_LF:
5089                break;                break;
5090    
5091                case 0x000b:                case CHAR_VT:
5092                case 0x000c:                case CHAR_FF:
5093                case 0x0085:                case CHAR_NEL:
5094  #ifdef COMPILE_PCRE16  #ifdef COMPILE_PCRE16
5095                case 0x2028:                case 0x2028:
5096                case 0x2029:                case 0x2029:
# Line 5282  for (;;) Line 5104  for (;;)
5104              switch(c)              switch(c)
5105                {                {
5106                default: break;                default: break;
5107                case 0x09:      /* HT */                HSPACE_BYTE_CASES:
               case 0x20:      /* SPACE */  
               case 0xa0:      /* NBSP */  
5108  #ifdef COMPILE_PCRE16  #ifdef COMPILE_PCRE16
5109                case 0x1680:    /* OGHAM SPACE MARK */                HSPACE_MULTIBYTE_CASES:
               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 */  
5110  #endif  #endif
5111                RRETURN(MATCH_NOMATCH);                RRETURN(MATCH_NOMATCH);
5112                }                }
# Line 5311  for (;;) Line 5116  for (;;)
5116              switch(c)              switch(c)
5117                {                {
5118                default: RRETURN(MATCH_NOMATCH);                default: RRETURN(MATCH_NOMATCH);
5119                case 0x09:      /* HT */                HSPACE_BYTE_CASES:
               case 0x20:      /* SPACE */  
               case 0xa0:      /* NBSP */  
5120  #ifdef COMPILE_PCRE16  #ifdef COMPILE_PCRE16
5121                case 0x1680:    /* OGHAM SPACE MARK */                HSPACE_MULTIBYTE_CASES:
               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 */  
5122  #endif  #endif
5123                break;                break;
5124                }                }
# Line 5340  for (;;) Line 5128  for (;;)
5128              switch(c)              switch(c)
5129                {                {
5130                default: break;                default: break;
5131                case 0x0a:      /* LF */                VSPACE_BYTE_CASES:
               case 0x0b:      /* VT */  
               case 0x0c:      /* FF */  
               case 0x0d:      /* CR */  
               case 0x85:      /* NEL */  
5132  #ifdef COMPILE_PCRE16  #ifdef COMPILE_PCRE16
5133                case 0x2028:    /* LINE SEPARATOR */                VSPACE_MULTIBYTE_CASES:
               case 0x2029:    /* PARAGRAPH SEPARATOR */  
5134  #endif  #endif
5135                RRETURN(MATCH_NOMATCH);                RRETURN(MATCH_NOMATCH);
5136                }                }
# Line 5357  for (;;) Line 5140  for (;;)
5140              switch(c)              switch(c)
5141                {                {
5142                default: RRETURN(MATCH_NOMATCH);                default: RRETURN(MATCH_NOMATCH);
5143                case 0x0a:      /* LF */                VSPACE_BYTE_CASES:
               case 0x0b:      /* VT */  
               case 0x0c:      /* FF */  
               case 0x0d:      /* CR */  
               case 0x85:      /* NEL */  
5144  #ifdef COMPILE_PCRE16  #ifdef COMPILE_PCRE16
5145                case 0x2028:    /* LINE SEPARATOR */                VSPACE_MULTIBYTE_CASES:
               case 0x2029:    /* PARAGRAPH SEPARATOR */  
5146  #endif  #endif
5147                break;                break;
5148                }                }
# Line 5591  for (;;) Line 5369  for (;;)
5369          {          {
5370          for (i = min; i < max; i++)          for (i = min; i < max; i++)
5371            {            {
           int len = 1;  
5372            if (eptr >= md->end_subject)            if (eptr >= md->end_subject)
5373              {              {
5374              SCHECK_PARTIAL();              SCHECK_PARTIAL();
5375              break;              break;
5376              }              }
5377            if (!utf) c = *eptr; else { GETCHARLEN(c, eptr, len); }            else
           if (UCD_CATEGORY(c) == ucp_M) break;  
           eptr += len;  
           while (eptr < md->end_subject)  
5378              {              {
5379              len = 1;              int lgb, rgb;
5380              if (!utf) c = *eptr; else { GETCHARLEN(c, eptr, len); }              GETCHARINCTEST(c, eptr);
5381              if (UCD_CATEGORY(c) != ucp_M) break;              lgb = UCD_GRAPHBREAK(c);
5382              eptr += len;              while (eptr < md->end_subject)
5383                  {
5384                  int len = 1;
5385                  if (!utf) c = *eptr; else { GETCHARLEN(c, eptr, len); }
5386                  rgb = UCD_GRAPHBREAK(c);
5387                  if ((PRIV(ucp_gbtable)[lgb] & (1 << rgb)) == 0) break;
5388                  lgb = rgb;
5389                  eptr += len;
5390                  }
5391              }              }
5392            CHECK_PARTIAL();            CHECK_PARTIAL();
5393            }            }
# Line 5735  for (;;) Line 5517  for (;;)
5517                break;                break;
5518                }                }
5519              GETCHARLEN(c, eptr, len);              GETCHARLEN(c, eptr, len);
5520              if (c == 0x000d)              if (c == CHAR_CR)
5521                {                {
5522                if (++eptr >= md->end_subject) break;                if (++eptr >= md->end_subject) break;
5523                if (*eptr == 0x000a) eptr++;                if (*eptr == CHAR_LF) eptr++;
5524                }                }
5525              else              else
5526                {                {
5527                if (c != 0x000a &&                if (c != CHAR_LF &&
5528                    (md->bsr_anycrlf ||                    (md->bsr_anycrlf ||
5529                     (c != 0x000b && c != 0x000c &&                     (c != CHAR_VT && c != CHAR_FF && c != CHAR_NEL
5530                      c != 0x0085 && c != 0x2028 && c != 0x2029)))  #ifndef EBCDIC
5531                        && c != 0x2028 && c != 0x2029
5532    #endif  /* Not EBCDIC */
5533                        )))
5534                  break;                  break;
5535                eptr += len;                eptr += len;
5536                }                }
# Line 5766  for (;;) Line 5551  for (;;)
5551              GETCHARLEN(c, eptr, len);              GETCHARLEN(c, eptr, len);
5552              switch(c)              switch(c)
5553                {                {
5554                  HSPACE_CASES: gotspace = TRUE; break;
5555                default: gotspace = FALSE; break;                default: gotspace = FALSE; break;
               case 0x09:      /* HT */  
               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 */  
               gotspace = TRUE;  
               break;  
5556                }                }
5557              if (gotspace == (ctype == OP_NOT_HSPACE)) break;              if (gotspace == (ctype == OP_NOT_HSPACE)) break;
5558              eptr += len;              eptr += len;
# Line 5808  for (;;) Line 5573  for (;;)
5573              GETCHARLEN(c, eptr, len);              GETCHARLEN(c, eptr, len);
5574              switch(c)              switch(c)
5575                {                {
5576                  VSPACE_CASES: gotspace = TRUE; break;
5577                default: gotspace = FALSE; break;                default: gotspace = FALSE; break;
               case 0x0a:      /* LF */  
               case 0x0b:      /* VT */  
               case 0x0c:      /* FF */  
               case 0x0d:      /* CR */  
               case 0x85:      /* NEL */  
               case 0x2028:    /* LINE SEPARATOR */  
               case 0x2029:    /* PARAGRAPH SEPARATOR */  
               gotspace = TRUE;  
               break;  
5578                }                }
5579              if (gotspace == (ctype == OP_NOT_VSPACE)) break;              if (gotspace == (ctype == OP_NOT_VSPACE)) break;
5580              eptr += len;              eptr += len;
# Line 5931  for (;;) Line 5688  for (;;)
5688            if (rrc != MATCH_NOMATCH) RRETURN(rrc);            if (rrc != MATCH_NOMATCH) RRETURN(rrc);
5689            if (eptr-- == pp) break;        /* Stop if tried at original pos */            if (eptr-- == pp) break;        /* Stop if tried at original pos */
5690            BACKCHAR(eptr);            BACKCHAR(eptr);
5691            if (ctype == OP_ANYNL && eptr > pp  && *eptr == '\n' &&            if (ctype == OP_ANYNL && eptr > pp  && *eptr == CHAR_NL &&
5692                eptr[-1] == '\r') eptr--;                eptr[-1] == CHAR_CR) eptr--;
5693            }            }
5694          }          }
5695        else        else
# Line 5983  for (;;) Line 5740  for (;;)
5740                break;                break;
5741                }                }
5742              c = *eptr;              c = *eptr;
5743              if (c == 0x000d)              if (c == CHAR_CR)
5744                {                {
5745                if (++eptr >= md->end_subject) break;                if (++eptr >= md->end_subject) break;
5746                if (*eptr == 0x000a) eptr++;                if (*eptr == CHAR_LF) eptr++;
5747                }                }
5748              else              else
5749                {                {
5750                if (c != 0x000a && (md->bsr_anycrlf ||                if (c != CHAR_LF && (md->bsr_anycrlf ||
5751                  (c != 0x000b && c != 0x000c && c != 0x0085                   (c != CHAR_VT && c != CHAR_FF && c != CHAR_NEL
5752  #ifdef COMPILE_PCRE16  #ifdef COMPILE_PCRE16
5753                  && c != 0x2028 && c != 0x2029                   && c != 0x2028 && c != 0x2029
5754  #endif  #endif
5755                  ))) break;                   ))) break;
5756                eptr++;                eptr++;
5757                }                }
5758              }              }
# Line 6009  for (;;) Line 5766  for (;;)
5766                SCHECK_PARTIAL();                SCHECK_PARTIAL();
5767                break;                break;
5768                }                }
5769              c = *eptr;              switch(*eptr)
5770              if (c == 0x09 || c == 0x20 || c == 0xa0                {
5771                  default: eptr++; break;
5772                  HSPACE_BYTE_CASES:
5773  #ifdef COMPILE_PCRE16  #ifdef COMPILE_PCRE16
5774                || c == 0x1680 || c == 0x180e || (c >= 0x2000 && c <= 0x200A)                HSPACE_MULTIBYTE_CASES:
               || c == 0x202f || c == 0x205f || c == 0x3000  
5775  #endif  #endif
5776                ) break;                goto ENDLOOP00;
5777              eptr++;                }
5778              }              }
5779              ENDLOOP00:
5780            break;            break;
5781    
5782            case OP_HSPACE:            case OP_HSPACE:
# Line 6028  for (;;) Line 5787  for (;;)
5787                SCHECK_PARTIAL();                SCHECK_PARTIAL();
5788                break;                break;
5789                }                }
5790              c = *eptr;              switch(*eptr)
5791              if (c != 0x09 && c != 0x20 && c != 0xa0                {
5792                  default: goto ENDLOOP01;
5793                  HSPACE_BYTE_CASES:
5794  #ifdef COMPILE_PCRE16  #ifdef COMPILE_PCRE16
5795                && c != 0x1680 && c != 0x180e && (c < 0x2000 || c > 0x200A)                HSPACE_MULTIBYTE_CASES:
               && c != 0x202f && c != 0x205f && c != 0x3000  
5796  #endif  #endif
5797                ) break;                eptr++; break;
5798              eptr++;                }
5799              }              }
5800              ENDLOOP01:
5801            break;            break;
5802    
5803            case OP_NOT_VSPACE:            case OP_NOT_VSPACE:
# Line 6047  for (;;) Line 5808  for (;;)
5808                SCHECK_PARTIAL();                SCHECK_PARTIAL();
5809                break;                break;
5810                }                }
5811              c = *eptr;              switch(*eptr)
5812              if (c == 0x0a || c == 0x0b || c == 0x0c || c == 0x0d || c == 0x85                {
5813                  default: eptr++; break;
5814                  VSPACE_BYTE_CASES:
5815  #ifdef COMPILE_PCRE16  #ifdef COMPILE_PCRE16
5816                || c == 0x2028 || c == 0x2029                VSPACE_MULTIBYTE_CASES:
5817  #endif  #endif
5818                ) break;                goto ENDLOOP02;
5819              eptr++;                }
5820              }              }
5821              ENDLOOP02:
5822            break;            break;
5823    
5824            case OP_VSPACE:            case OP_VSPACE:
# Line 6065  for (;;) Line 5829  for (;;)
5829                SCHECK_PARTIAL();                SCHECK_PARTIAL();
5830                break;                break;
5831                }                }
5832              c = *eptr;              switch(*eptr)
5833              if (c != 0x0a && c != 0x0b && c != 0x0c && c != 0x0d && c != 0x85                {
5834                  default: goto ENDLOOP03;
5835                  VSPACE_BYTE_CASES:
5836  #ifdef COMPILE_PCRE16  #ifdef COMPILE_PCRE16
5837                && c != 0x2028 && c != 0x2029                VSPACE_MULTIBYTE_CASES:
5838  #endif  #endif
5839                ) break;                eptr++; break;
5840              eptr++;                }
5841              }              }
5842              ENDLOOP03:
5843            break;            break;
5844    
5845            case OP_NOT_DIGIT:            case OP_NOT_DIGIT:
# Line 6169  for (;;) Line 5936  for (;;)
5936            RMATCH(eptr, ecode, offset_top, md, eptrb, RM47);            RMATCH(eptr, ecode, offset_top, md, eptrb, RM47);
5937            if (rrc != MATCH_NOMATCH) RRETURN(rrc);            if (rrc != MATCH_NOMATCH) RRETURN(rrc);
5938            eptr--;            eptr--;
5939            if (ctype == OP_ANYNL && eptr > pp  && *eptr == '\n' &&            if (ctype == OP_ANYNL && eptr > pp  && *eptr == CHAR_LF &&
5940                eptr[-1] == '\r') eptr--;                eptr[-1] == CHAR_CR) eptr--;
5941            }            }
5942          }          }
5943    

Legend:
Removed from v.963  
changed lines
  Added in v.1041

  ViewVC Help
Powered by ViewVC 1.1.5