/[pcre]/code/branches/pcre16/pcre_exec.c
ViewVC logotype

Diff of /code/branches/pcre16/pcre_exec.c

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

revision 461 by ph10, Mon Oct 5 10:59:35 2009 UTC revision 482 by ph10, Mon Jan 4 15:55:46 2010 UTC
# Line 6  Line 6 
6  and semantics are as close as possible to those of the Perl 5 language.  and semantics are as close as possible to those of the Perl 5 language.
7    
8                         Written by Philip Hazel                         Written by Philip Hazel
9             Copyright (c) 1997-2009 University of Cambridge             Copyright (c) 1997-2010 University of Cambridge
10    
11  -----------------------------------------------------------------------------  -----------------------------------------------------------------------------
12  Redistribution and use in source and binary forms, with or without  Redistribution and use in source and binary forms, with or without
# Line 89  static const char rep_max[] = { 0, 0, 0, Line 89  static const char rep_max[] = { 0, 0, 0,
89    
90    
91    
92  #ifdef DEBUG  #ifdef PCRE_DEBUG
93  /*************************************************  /*************************************************
94  *        Debugging function to print chars       *  *        Debugging function to print chars       *
95  *************************************************/  *************************************************/
# Line 141  match_ref(int offset, register USPTR ept Line 141  match_ref(int offset, register USPTR ept
141  {  {
142  USPTR p = md->start_subject + md->offset_vector[offset];  USPTR p = md->start_subject + md->offset_vector[offset];
143    
144  #ifdef DEBUG  #ifdef PCRE_DEBUG
145  if (eptr >= md->end_subject)  if (eptr >= md->end_subject)
146    printf("matching subject <null>");    printf("matching subject <null>");
147  else  else
# Line 254  actuall used in this definition. */ Line 254  actuall used in this definition. */
254  #ifndef NO_RECURSE  #ifndef NO_RECURSE
255  #define REGISTER register  #define REGISTER register
256    
257  #ifdef DEBUG  #ifdef PCRE_DEBUG
258  #define RMATCH(ra,rb,rc,rd,re,rf,rg,rw) \  #define RMATCH(ra,rb,rc,rd,re,rf,rg,rw) \
259    { \    { \
260    printf("match() called in line %d\n", __LINE__); \    printf("match() called in line %d\n", __LINE__); \
# Line 415  the subject. */ Line 415  the subject. */
415      }      }
416    
417  #define SCHECK_PARTIAL()\  #define SCHECK_PARTIAL()\
418    if (md->partial && eptr > mstart)\    if (md->partial != 0 && eptr > mstart)\
419      {\      {\
420      md->hitend = TRUE;\      md->hitend = TRUE;\
421      if (md->partial > 1) RRETURN(PCRE_ERROR_PARTIAL);\      if (md->partial > 1) RRETURN(PCRE_ERROR_PARTIAL);\
# Line 622  TAIL_RECURSE: Line 622  TAIL_RECURSE:
622  /* OK, now we can get on with the real code of the function. Recursive calls  /* OK, now we can get on with the real code of the function. Recursive calls
623  are specified by the macro RMATCH and RRETURN is used to return. When  are specified by the macro RMATCH and RRETURN is used to return. When
624  NO_RECURSE is *not* defined, these just turn into a recursive call to match()  NO_RECURSE is *not* defined, these just turn into a recursive call to match()
625  and a "return", respectively (possibly with some debugging if DEBUG is  and a "return", respectively (possibly with some debugging if PCRE_DEBUG is
626  defined). However, RMATCH isn't like a function call because it's quite a  defined). However, RMATCH isn't like a function call because it's quite a
627  complicated macro. It has to be used in one particular way. This shouldn't,  complicated macro. It has to be used in one particular way. This shouldn't,
628  however, impact performance when true recursion is being used. */  however, impact performance when true recursion is being used. */
# Line 713  for (;;) Line 713  for (;;)
713      number = GET2(ecode, 1+LINK_SIZE);      number = GET2(ecode, 1+LINK_SIZE);
714      offset = number << 1;      offset = number << 1;
715    
716  #ifdef DEBUG  #ifdef PCRE_DEBUG
717      printf("start bracket %d\n", number);      printf("start bracket %d\n", number);
718      printf("subject=");      printf("subject=");
719      pchars(eptr, 16, TRUE, md);      pchars(eptr, 16, TRUE, md);
# Line 1039  for (;;) Line 1039  for (;;)
1039      number = GET2(ecode, 1);      number = GET2(ecode, 1);
1040      offset = number << 1;      offset = number << 1;
1041    
1042  #ifdef DEBUG  #ifdef PCRE_DEBUG
1043        printf("end bracket %d at *ACCEPT", number);        printf("end bracket %d at *ACCEPT", number);
1044        printf("\n");        printf("\n");
1045  #endif  #endif
# Line 1133  for (;;) Line 1133  for (;;)
1133      offset_top = md->end_offset_top;      offset_top = md->end_offset_top;
1134      continue;      continue;
1135    
1136      /* Negative assertion: all branches must fail to match */      /* Negative assertion: all branches must fail to match. Encountering SKIP,
1137        PRUNE, or COMMIT means we must assume failure without checking subsequent
1138        branches. */
1139    
1140      case OP_ASSERT_NOT:      case OP_ASSERT_NOT:
1141      case OP_ASSERTBACK_NOT:      case OP_ASSERTBACK_NOT:
# Line 1142  for (;;) Line 1144  for (;;)
1144        RMATCH(eptr, ecode + 1 + LINK_SIZE, offset_top, md, ims, NULL, 0,        RMATCH(eptr, ecode + 1 + LINK_SIZE, offset_top, md, ims, NULL, 0,
1145          RM5);          RM5);
1146        if (rrc == MATCH_MATCH) RRETURN(MATCH_NOMATCH);        if (rrc == MATCH_MATCH) RRETURN(MATCH_NOMATCH);
1147          if (rrc == MATCH_SKIP || rrc == MATCH_PRUNE || rrc == MATCH_COMMIT)
1148            {
1149            do ecode += GET(ecode,1); while (*ecode == OP_ALT);
1150            break;
1151            }
1152        if (rrc != MATCH_NOMATCH && rrc != MATCH_THEN) RRETURN(rrc);        if (rrc != MATCH_NOMATCH && rrc != MATCH_THEN) RRETURN(rrc);
1153        ecode += GET(ecode,1);        ecode += GET(ecode,1);
1154        }        }
# Line 1461  for (;;) Line 1468  for (;;)
1468        number = GET2(prev, 1+LINK_SIZE);        number = GET2(prev, 1+LINK_SIZE);
1469        offset = number << 1;        offset = number << 1;
1470    
1471  #ifdef DEBUG  #ifdef PCRE_DEBUG
1472        printf("end bracket %d", number);        printf("end bracket %d", number);
1473        printf("\n");        printf("\n");
1474  #endif  #endif
# Line 2146  for (;;) Line 2153  for (;;)
2153          pp = eptr;          pp = eptr;
2154          for (i = min; i < max; i++)          for (i = min; i < max; i++)
2155            {            {
2156            if (!match_ref(offset, eptr, length, md, ims)) break;            if (!match_ref(offset, eptr, length, md, ims))
2157                {
2158                CHECK_PARTIAL();
2159                break;
2160                }
2161            eptr += length;            eptr += length;
2162            }            }
2163          while (eptr >= pp)          while (eptr >= pp)
# Line 2315  for (;;) Line 2326  for (;;)
2326            for (i = min; i < max; i++)            for (i = min; i < max; i++)
2327              {              {
2328              int len = 1;              int len = 1;
2329              if (eptr >= md->end_subject) break;              if (eptr >= md->end_subject)
2330                  {
2331                  SCHECK_PARTIAL();
2332                  break;
2333                  }
2334              GETCHARLEN(c, eptr, len);              GETCHARLEN(c, eptr, len);
2335              if (c > 255)              if (c > 255)
2336                {                {
# Line 2341  for (;;) Line 2356  for (;;)
2356            {            {
2357            for (i = min; i < max; i++)            for (i = min; i < max; i++)
2358              {              {
2359              if (eptr >= md->end_subject) break;              if (eptr >= md->end_subject)
2360                  {
2361                  SCHECK_PARTIAL();
2362                  break;
2363                  }
2364              c = *eptr;              c = *eptr;
2365              if ((data[c/8] & (1 << (c&7))) == 0) break;              if ((data[c/8] & (1 << (c&7))) == 0) break;
2366              eptr++;              eptr++;
# Line 2446  for (;;) Line 2465  for (;;)
2465          for (i = min; i < max; i++)          for (i = min; i < max; i++)
2466            {            {
2467            int len = 1;            int len = 1;
2468            if (eptr >= md->end_subject) break;            if (eptr >= md->end_subject)
2469                {
2470                SCHECK_PARTIAL();
2471                break;
2472                }
2473            GETCHARLENTEST(c, eptr, len);            GETCHARLENTEST(c, eptr, len);
2474            if (!_pcre_xclass(c, data)) break;            if (!_pcre_xclass(c, data)) break;
2475            eptr += len;            eptr += len;
# Line 2685  for (;;) Line 2708  for (;;)
2708                       eptr <= md->end_subject - oclength &&                       eptr <= md->end_subject - oclength &&
2709                       memcmp(eptr, occhars, oclength) == 0) eptr += oclength;                       memcmp(eptr, occhars, oclength) == 0) eptr += oclength;
2710  #endif  /* SUPPORT_UCP */  #endif  /* SUPPORT_UCP */
2711              else break;              else
2712                  {
2713                  CHECK_PARTIAL();
2714                  break;
2715                  }
2716              }              }
2717    
2718            if (possessive) continue;            if (possessive) continue;
# Line 2763  for (;;) Line 2790  for (;;)
2790          pp = eptr;          pp = eptr;
2791          for (i = min; i < max; i++)          for (i = min; i < max; i++)
2792            {            {
2793            if (eptr >= md->end_subject || fc != md->lcc[*eptr]) break;            if (eptr >= md->end_subject)
2794                {
2795                SCHECK_PARTIAL();
2796                break;
2797                }
2798              if (fc != md->lcc[*eptr]) break;
2799            eptr++;            eptr++;
2800            }            }
2801    
# Line 2817  for (;;) Line 2849  for (;;)
2849          pp = eptr;          pp = eptr;
2850          for (i = min; i < max; i++)          for (i = min; i < max; i++)
2851            {            {
2852            if (eptr >= md->end_subject || fc != *eptr) break;            if (eptr >= md->end_subject)
2853                {
2854                SCHECK_PARTIAL();
2855                break;
2856                }
2857              if (fc != *eptr) break;
2858            eptr++;            eptr++;
2859            }            }
2860          if (possessive) continue;          if (possessive) continue;
# Line 3029  for (;;) Line 3066  for (;;)
3066            for (i = min; i < max; i++)            for (i = min; i < max; i++)
3067              {              {
3068              int len = 1;              int len = 1;
3069              if (eptr >= md->end_subject) break;              if (eptr >= md->end_subject)
3070                  {
3071                  SCHECK_PARTIAL();
3072                  break;
3073                  }
3074              GETCHARLEN(d, eptr, len);              GETCHARLEN(d, eptr, len);
3075              if (d < 256) d = md->lcc[d];              if (d < 256) d = md->lcc[d];
3076              if (fc == d) break;              if (fc == d) break;
# Line 3050  for (;;) Line 3091  for (;;)
3091            {            {
3092            for (i = min; i < max; i++)            for (i = min; i < max; i++)
3093              {              {
3094              if (eptr >= md->end_subject || fc == md->lcc[*eptr]) break;              if (eptr >= md->end_subject)
3095                  {
3096                  SCHECK_PARTIAL();
3097                  break;
3098                  }
3099                if (fc == md->lcc[*eptr]) break;
3100              eptr++;              eptr++;
3101              }              }
3102            if (possessive) continue;            if (possessive) continue;
# Line 3159  for (;;) Line 3205  for (;;)
3205            for (i = min; i < max; i++)            for (i = min; i < max; i++)
3206              {              {
3207              int len = 1;              int len = 1;
3208              if (eptr >= md->end_subject) break;              if (eptr >= md->end_subject)
3209                  {
3210                  SCHECK_PARTIAL();
3211                  break;
3212                  }
3213              GETCHARLEN(d, eptr, len);              GETCHARLEN(d, eptr, len);
3214              if (fc == d) break;              if (fc == d) break;
3215              eptr += len;              eptr += len;
# Line 3179  for (;;) Line 3229  for (;;)
3229            {            {
3230            for (i = min; i < max; i++)            for (i = min; i < max; i++)
3231              {              {
3232              if (eptr >= md->end_subject || fc == *eptr) break;              if (eptr >= md->end_subject)
3233                  {
3234                  SCHECK_PARTIAL();
3235                  break;
3236                  }
3237                if (fc == *eptr) break;
3238              eptr++;              eptr++;
3239              }              }
3240            if (possessive) continue;            if (possessive) continue;
# Line 3640  for (;;) Line 3695  for (;;)
3695          case OP_NOT_WORDCHAR:          case OP_NOT_WORDCHAR:
3696          for (i = 1; i <= min; i++)          for (i = 1; i <= min; i++)
3697            {            {
3698            if (eptr >= md->end_subject ||            if (eptr >= md->end_subject)
3699               (*eptr < 128 && (md->ctypes[*eptr] & ctype_word) != 0))              {
3700                SCHECK_PARTIAL();
3701                RRETURN(MATCH_NOMATCH);
3702                }
3703              if (*eptr < 128 && (md->ctypes[*eptr] & ctype_word) != 0)
3704              RRETURN(MATCH_NOMATCH);              RRETURN(MATCH_NOMATCH);
3705            while (++eptr < md->end_subject && (*eptr & 0xc0) == 0x80);            while (++eptr < md->end_subject && (*eptr & 0xc0) == 0x80);
3706            }            }
# Line 4335  for (;;) Line 4394  for (;;)
4394            for (i = min; i < max; i++)            for (i = min; i < max; i++)
4395              {              {
4396              int len = 1;              int len = 1;
4397              if (eptr >= md->end_subject) break;              if (eptr >= md->end_subject)
4398                  {
4399                  SCHECK_PARTIAL();
4400                  break;
4401                  }
4402              GETCHARLEN(c, eptr, len);              GETCHARLEN(c, eptr, len);
4403              if (prop_fail_result) break;              if (prop_fail_result) break;
4404              eptr+= len;              eptr+= len;
# Line 4346  for (;;) Line 4409  for (;;)
4409            for (i = min; i < max; i++)            for (i = min; i < max; i++)
4410              {              {
4411              int len = 1;              int len = 1;
4412              if (eptr >= md->end_subject) break;              if (eptr >= md->end_subject)
4413                  {
4414                  SCHECK_PARTIAL();
4415                  break;
4416                  }
4417              GETCHARLEN(c, eptr, len);              GETCHARLEN(c, eptr, len);
4418              prop_chartype = UCD_CHARTYPE(c);              prop_chartype = UCD_CHARTYPE(c);
4419              if ((prop_chartype == ucp_Lu ||              if ((prop_chartype == ucp_Lu ||
# Line 4361  for (;;) Line 4428  for (;;)
4428            for (i = min; i < max; i++)            for (i = min; i < max; i++)
4429              {              {
4430              int len = 1;              int len = 1;
4431              if (eptr >= md->end_subject) break;              if (eptr >= md->end_subject)
4432                  {
4433                  SCHECK_PARTIAL();
4434                  break;
4435                  }
4436              GETCHARLEN(c, eptr, len);              GETCHARLEN(c, eptr, len);
4437              prop_category = UCD_CATEGORY(c);              prop_category = UCD_CATEGORY(c);
4438              if ((prop_category == prop_value) == prop_fail_result)              if ((prop_category == prop_value) == prop_fail_result)
# Line 4374  for (;;) Line 4445  for (;;)
4445            for (i = min; i < max; i++)            for (i = min; i < max; i++)
4446              {              {
4447              int len = 1;              int len = 1;
4448              if (eptr >= md->end_subject) break;              if (eptr >= md->end_subject)
4449                  {
4450                  SCHECK_PARTIAL();
4451                  break;
4452                  }
4453              GETCHARLEN(c, eptr, len);              GETCHARLEN(c, eptr, len);
4454              prop_chartype = UCD_CHARTYPE(c);              prop_chartype = UCD_CHARTYPE(c);
4455              if ((prop_chartype == prop_value) == prop_fail_result)              if ((prop_chartype == prop_value) == prop_fail_result)
# Line 4387  for (;;) Line 4462  for (;;)
4462            for (i = min; i < max; i++)            for (i = min; i < max; i++)
4463              {              {
4464              int len = 1;              int len = 1;
4465              if (eptr >= md->end_subject) break;              if (eptr >= md->end_subject)
4466                  {
4467                  SCHECK_PARTIAL();
4468                  break;
4469                  }
4470              GETCHARLEN(c, eptr, len);              GETCHARLEN(c, eptr, len);
4471              prop_script = UCD_SCRIPT(c);              prop_script = UCD_SCRIPT(c);
4472              if ((prop_script == prop_value) == prop_fail_result)              if ((prop_script == prop_value) == prop_fail_result)
# Line 4416  for (;;) Line 4495  for (;;)
4495          {          {
4496          for (i = min; i < max; i++)          for (i = min; i < max; i++)
4497            {            {
4498            if (eptr >= md->end_subject) break;            if (eptr >= md->end_subject)
4499                {
4500                SCHECK_PARTIAL();
4501                break;
4502                }
4503            GETCHARINCTEST(c, eptr);            GETCHARINCTEST(c, eptr);
4504            prop_category = UCD_CATEGORY(c);            prop_category = UCD_CATEGORY(c);
4505            if (prop_category == ucp_M) break;            if (prop_category == ucp_M) break;
# Line 4436  for (;;) Line 4519  for (;;)
4519          /* eptr is now past the end of the maximum run */          /* eptr is now past the end of the maximum run */
4520    
4521          if (possessive) continue;          if (possessive) continue;
4522    
4523          for(;;)          for(;;)
4524            {            {
4525            RMATCH(eptr, ecode, offset_top, md, ims, eptrb, 0, RM45);            RMATCH(eptr, ecode, offset_top, md, ims, eptrb, 0, RM45);
# Line 4471  for (;;) Line 4555  for (;;)
4555              {              {
4556              for (i = min; i < max; i++)              for (i = min; i < max; i++)
4557                {                {
4558                if (eptr >= md->end_subject || IS_NEWLINE(eptr)) break;                if (eptr >= md->end_subject)
4559                    {
4560                    SCHECK_PARTIAL();
4561                    break;
4562                    }
4563                  if (IS_NEWLINE(eptr)) break;
4564                eptr++;                eptr++;
4565                while (eptr < md->end_subject && (*eptr & 0xc0) == 0x80) eptr++;                while (eptr < md->end_subject && (*eptr & 0xc0) == 0x80) eptr++;
4566                }                }
# Line 4483  for (;;) Line 4572  for (;;)
4572              {              {
4573              for (i = min; i < max; i++)              for (i = min; i < max; i++)
4574                {                {
4575                if (eptr >= md->end_subject || IS_NEWLINE(eptr)) break;                if (eptr >= md->end_subject)
4576                    {
4577                    SCHECK_PARTIAL();
4578                    break;
4579                    }
4580                  if (IS_NEWLINE(eptr)) break;
4581                eptr++;                eptr++;
4582                while (eptr < md->end_subject && (*eptr & 0xc0) == 0x80) eptr++;                while (eptr < md->end_subject && (*eptr & 0xc0) == 0x80) eptr++;
4583                }                }
# Line 4495  for (;;) Line 4589  for (;;)
4589              {              {
4590              for (i = min; i < max; i++)              for (i = min; i < max; i++)
4591                {                {
4592                if (eptr >= md->end_subject) break;                if (eptr >= md->end_subject)
4593                    {
4594                    SCHECK_PARTIAL();
4595                    break;
4596                    }
4597                eptr++;                eptr++;
4598                while (eptr < md->end_subject && (*eptr & 0xc0) == 0x80) eptr++;                while (eptr < md->end_subject && (*eptr & 0xc0) == 0x80) eptr++;
4599                }                }
# Line 4508  for (;;) Line 4606  for (;;)
4606            case OP_ANYBYTE:            case OP_ANYBYTE:
4607            c = max - min;            c = max - min;
4608            if (c > (unsigned int)(md->end_subject - eptr))            if (c > (unsigned int)(md->end_subject - eptr))
4609              c = md->end_subject - eptr;              {
4610            eptr += c;              eptr = md->end_subject;
4611                SCHECK_PARTIAL();
4612                }
4613              else eptr += c;
4614            break;            break;
4615    
4616            case OP_ANYNL:            case OP_ANYNL:
4617            for (i = min; i < max; i++)            for (i = min; i < max; i++)
4618              {              {
4619              int len = 1;              int len = 1;
4620              if (eptr >= md->end_subject) break;              if (eptr >= md->end_subject)
4621                  {
4622                  SCHECK_PARTIAL();
4623                  break;
4624                  }
4625              GETCHARLEN(c, eptr, len);              GETCHARLEN(c, eptr, len);
4626              if (c == 0x000d)              if (c == 0x000d)
4627                {                {
# Line 4541  for (;;) Line 4646  for (;;)
4646              {              {
4647              BOOL gotspace;              BOOL gotspace;
4648              int len = 1;              int len = 1;
4649              if (eptr >= md->end_subject) break;              if (eptr >= md->end_subject)
4650                  {
4651                  SCHECK_PARTIAL();
4652                  break;
4653                  }
4654              GETCHARLEN(c, eptr, len);              GETCHARLEN(c, eptr, len);
4655              switch(c)              switch(c)
4656                {                {
# Line 4579  for (;;) Line 4688  for (;;)
4688              {              {
4689              BOOL gotspace;              BOOL gotspace;
4690              int len = 1;              int len = 1;
4691              if (eptr >= md->end_subject) break;              if (eptr >= md->end_subject)
4692                  {
4693                  SCHECK_PARTIAL();
4694                  break;
4695                  }
4696              GETCHARLEN(c, eptr, len);              GETCHARLEN(c, eptr, len);
4697              switch(c)              switch(c)
4698                {                {
# Line 4603  for (;;) Line 4716  for (;;)
4716            for (i = min; i < max; i++)            for (i = min; i < max; i++)
4717              {              {
4718              int len = 1;              int len = 1;
4719              if (eptr >= md->end_subject) break;              if (eptr >= md->end_subject)
4720                  {
4721                  SCHECK_PARTIAL();
4722                  break;
4723                  }
4724              GETCHARLEN(c, eptr, len);              GETCHARLEN(c, eptr, len);
4725              if (c < 256 && (md->ctypes[c] & ctype_digit) != 0) break;              if (c < 256 && (md->ctypes[c] & ctype_digit) != 0) break;
4726              eptr+= len;              eptr+= len;
# Line 4614  for (;;) Line 4731  for (;;)
4731            for (i = min; i < max; i++)            for (i = min; i < max; i++)
4732              {              {
4733              int len = 1;              int len = 1;
4734              if (eptr >= md->end_subject) break;              if (eptr >= md->end_subject)
4735                  {
4736                  SCHECK_PARTIAL();
4737                  break;
4738                  }
4739              GETCHARLEN(c, eptr, len);              GETCHARLEN(c, eptr, len);
4740              if (c >= 256 ||(md->ctypes[c] & ctype_digit) == 0) break;              if (c >= 256 ||(md->ctypes[c] & ctype_digit) == 0) break;
4741              eptr+= len;              eptr+= len;
# Line 4625  for (;;) Line 4746  for (;;)
4746            for (i = min; i < max; i++)            for (i = min; i < max; i++)
4747              {              {
4748              int len = 1;              int len = 1;
4749              if (eptr >= md->end_subject) break;              if (eptr >= md->end_subject)
4750                  {
4751                  SCHECK_PARTIAL();
4752                  break;
4753                  }
4754              GETCHARLEN(c, eptr, len);              GETCHARLEN(c, eptr, len);
4755              if (c < 256 && (md->ctypes[c] & ctype_space) != 0) break;              if (c < 256 && (md->ctypes[c] & ctype_space) != 0) break;
4756              eptr+= len;              eptr+= len;
# Line 4636  for (;;) Line 4761  for (;;)
4761            for (i = min; i < max; i++)            for (i = min; i < max; i++)
4762              {              {
4763              int len = 1;              int len = 1;
4764              if (eptr >= md->end_subject) break;              if (eptr >= md->end_subject)
4765                  {
4766                  SCHECK_PARTIAL();
4767                  break;
4768                  }
4769              GETCHARLEN(c, eptr, len);              GETCHARLEN(c, eptr, len);
4770              if (c >= 256 ||(md->ctypes[c] & ctype_space) == 0) break;              if (c >= 256 ||(md->ctypes[c] & ctype_space) == 0) break;
4771              eptr+= len;              eptr+= len;
# Line 4647  for (;;) Line 4776  for (;;)
4776            for (i = min; i < max; i++)            for (i = min; i < max; i++)
4777              {              {
4778              int len = 1;              int len = 1;
4779              if (eptr >= md->end_subject) break;              if (eptr >= md->end_subject)
4780                  {
4781                  SCHECK_PARTIAL();
4782                  break;
4783                  }
4784              GETCHARLEN(c, eptr, len);              GETCHARLEN(c, eptr, len);
4785              if (c < 256 && (md->ctypes[c] & ctype_word) != 0) break;              if (c < 256 && (md->ctypes[c] & ctype_word) != 0) break;
4786              eptr+= len;              eptr+= len;
# Line 4658  for (;;) Line 4791  for (;;)
4791            for (i = min; i < max; i++)            for (i = min; i < max; i++)
4792              {              {
4793              int len = 1;              int len = 1;
4794              if (eptr >= md->end_subject) break;              if (eptr >= md->end_subject)
4795                  {
4796                  SCHECK_PARTIAL();
4797                  break;
4798                  }
4799              GETCHARLEN(c, eptr, len);              GETCHARLEN(c, eptr, len);
4800              if (c >= 256 || (md->ctypes[c] & ctype_word) == 0) break;              if (c >= 256 || (md->ctypes[c] & ctype_word) == 0) break;
4801              eptr+= len;              eptr+= len;
# Line 4690  for (;;) Line 4827  for (;;)
4827            case OP_ANY:            case OP_ANY:
4828            for (i = min; i < max; i++)            for (i = min; i < max; i++)
4829              {              {
4830              if (eptr >= md->end_subject || IS_NEWLINE(eptr)) break;              if (eptr >= md->end_subject)
4831                  {
4832                  SCHECK_PARTIAL();
4833                  break;
4834                  }
4835                if (IS_NEWLINE(eptr)) break;
4836              eptr++;              eptr++;
4837              }              }
4838            break;            break;
# Line 4699  for (;;) Line 4841  for (;;)
4841            case OP_ANYBYTE:            case OP_ANYBYTE:
4842            c = max - min;            c = max - min;
4843            if (c > (unsigned int)(md->end_subject - eptr))            if (c > (unsigned int)(md->end_subject - eptr))
4844              c = md->end_subject - eptr;              {
4845            eptr += c;              eptr = md->end_subject;
4846                SCHECK_PARTIAL();
4847                }
4848              else eptr += c;
4849            break;            break;
4850    
4851            case OP_ANYNL:            case OP_ANYNL:
4852            for (i = min; i < max; i++)            for (i = min; i < max; i++)
4853              {              {
4854              if (eptr >= md->end_subject) break;              if (eptr >= md->end_subject)
4855                  {
4856                  SCHECK_PARTIAL();
4857                  break;
4858                  }
4859              c = *eptr;              c = *eptr;
4860              if (c == 0x000d)              if (c == 0x000d)
4861                {                {
# Line 4727  for (;;) Line 4876  for (;;)
4876            case OP_NOT_HSPACE:            case OP_NOT_HSPACE:
4877            for (i = min; i < max; i++)            for (i = min; i < max; i++)
4878              {              {
4879              if (eptr >= md->end_subject) break;              if (eptr >= md->end_subject)
4880                  {
4881                  SCHECK_PARTIAL();
4882                  break;
4883                  }
4884              c = *eptr;              c = *eptr;
4885              if (c == 0x09 || c == 0x20 || c == 0xa0) break;              if (c == 0x09 || c == 0x20 || c == 0xa0) break;
4886              eptr++;              eptr++;
# Line 4737  for (;;) Line 4890  for (;;)
4890            case OP_HSPACE:            case OP_HSPACE:
4891            for (i = min; i < max; i++)            for (i = min; i < max; i++)
4892              {              {
4893              if (eptr >= md->end_subject) break;              if (eptr >= md->end_subject)
4894                  {
4895                  SCHECK_PARTIAL();
4896                  break;
4897                  }
4898              c = *eptr;              c = *eptr;
4899              if (c != 0x09 && c != 0x20 && c != 0xa0) break;              if (c != 0x09 && c != 0x20 && c != 0xa0) break;
4900              eptr++;              eptr++;
# Line 4747  for (;;) Line 4904  for (;;)
4904            case OP_NOT_VSPACE:            case OP_NOT_VSPACE:
4905            for (i = min; i < max; i++)            for (i = min; i < max; i++)
4906              {              {
4907              if (eptr >= md->end_subject) break;              if (eptr >= md->end_subject)
4908                  {
4909                  SCHECK_PARTIAL();
4910                  break;
4911                  }
4912              c = *eptr;              c = *eptr;
4913              if (c == 0x0a || c == 0x0b || c == 0x0c || c == 0x0d || c == 0x85)              if (c == 0x0a || c == 0x0b || c == 0x0c || c == 0x0d || c == 0x85)
4914                break;                break;
# Line 4758  for (;;) Line 4919  for (;;)
4919            case OP_VSPACE:            case OP_VSPACE:
4920            for (i = min; i < max; i++)            for (i = min; i < max; i++)
4921              {              {
4922              if (eptr >= md->end_subject) break;              if (eptr >= md->end_subject)
4923                  {
4924                  SCHECK_PARTIAL();
4925                  break;
4926                  }
4927              c = *eptr;              c = *eptr;
4928              if (c != 0x0a && c != 0x0b && c != 0x0c && c != 0x0d && c != 0x85)              if (c != 0x0a && c != 0x0b && c != 0x0c && c != 0x0d && c != 0x85)
4929                break;                break;
# Line 4769  for (;;) Line 4934  for (;;)
4934            case OP_NOT_DIGIT:            case OP_NOT_DIGIT:
4935            for (i = min; i < max; i++)            for (i = min; i < max; i++)
4936              {              {
4937              if (eptr >= md->end_subject || (md->ctypes[*eptr] & ctype_digit) != 0)              if (eptr >= md->end_subject)
4938                  {
4939                  SCHECK_PARTIAL();
4940                break;                break;
4941                  }
4942                if ((md->ctypes[*eptr] & ctype_digit) != 0) break;
4943              eptr++;              eptr++;
4944              }              }
4945            break;            break;
# Line 4778  for (;;) Line 4947  for (;;)
4947            case OP_DIGIT:            case OP_DIGIT:
4948            for (i = min; i < max; i++)            for (i = min; i < max; i++)
4949              {              {
4950              if (eptr >= md->end_subject || (md->ctypes[*eptr] & ctype_digit) == 0)              if (eptr >= md->end_subject)
4951                  {
4952                  SCHECK_PARTIAL();
4953                break;                break;
4954                  }
4955                if ((md->ctypes[*eptr] & ctype_digit) == 0) break;
4956              eptr++;              eptr++;
4957              }              }
4958            break;            break;
# Line 4787  for (;;) Line 4960  for (;;)
4960            case OP_NOT_WHITESPACE:            case OP_NOT_WHITESPACE:
4961            for (i = min; i < max; i++)            for (i = min; i < max; i++)
4962              {              {
4963              if (eptr >= md->end_subject || (md->ctypes[*eptr] & ctype_space) != 0)              if (eptr >= md->end_subject)
4964                  {
4965                  SCHECK_PARTIAL();
4966                break;                break;
4967                  }
4968                if ((md->ctypes[*eptr] & ctype_space) != 0) break;
4969              eptr++;              eptr++;
4970              }              }
4971            break;            break;
# Line 4796  for (;;) Line 4973  for (;;)
4973            case OP_WHITESPACE:            case OP_WHITESPACE:
4974            for (i = min; i < max; i++)            for (i = min; i < max; i++)
4975              {              {
4976              if (eptr >= md->end_subject || (md->ctypes[*eptr] & ctype_space) == 0)              if (eptr >= md->end_subject)
4977                  {
4978                  SCHECK_PARTIAL();
4979                break;                break;
4980                  }
4981                if ((md->ctypes[*eptr] & ctype_space) == 0) break;
4982              eptr++;              eptr++;
4983              }              }
4984            break;            break;
# Line 4805  for (;;) Line 4986  for (;;)
4986            case OP_NOT_WORDCHAR:            case OP_NOT_WORDCHAR:
4987            for (i = min; i < max; i++)            for (i = min; i < max; i++)
4988              {              {
4989              if (eptr >= md->end_subject || (md->ctypes[*eptr] & ctype_word) != 0)              if (eptr >= md->end_subject)
4990                  {
4991                  SCHECK_PARTIAL();
4992                break;                break;
4993                  }
4994                if ((md->ctypes[*eptr] & ctype_word) != 0) break;
4995              eptr++;              eptr++;
4996              }              }
4997            break;            break;
# Line 4814  for (;;) Line 4999  for (;;)
4999            case OP_WORDCHAR:            case OP_WORDCHAR:
5000            for (i = min; i < max; i++)            for (i = min; i < max; i++)
5001              {              {
5002              if (eptr >= md->end_subject || (md->ctypes[*eptr] & ctype_word) == 0)              if (eptr >= md->end_subject)
5003                  {
5004                  SCHECK_PARTIAL();
5005                break;                break;
5006                  }
5007                if ((md->ctypes[*eptr] & ctype_word) == 0) break;
5008              eptr++;              eptr++;
5009              }              }
5010            break;            break;
# Line 5387  for(;;) Line 5576  for(;;)
5576      bytes to avoid spending too much time in this optimization. */      bytes to avoid spending too much time in this optimization. */
5577    
5578      if (study != NULL && (study->flags & PCRE_STUDY_MINLEN) != 0 &&      if (study != NULL && (study->flags & PCRE_STUDY_MINLEN) != 0 &&
5579          end_subject - start_match < study->minlength)          (pcre_uint32)(end_subject - start_match) < study->minlength)
5580        {        {
5581        rc = MATCH_NOMATCH;        rc = MATCH_NOMATCH;
5582        break;        break;
# Line 5450  for(;;) Line 5639  for(;;)
5639        }        }
5640      }      }
5641    
5642  #ifdef DEBUG  /* Sigh. Some compilers never learn. */  #ifdef PCRE_DEBUG  /* Sigh. Some compilers never learn. */
5643    printf(">>>> Match against: ");    printf(">>>> Match against: ");
5644    pchars(start_match, end_subject - start_match, TRUE, md);    pchars(start_match, end_subject - start_match, TRUE, md);
5645    printf("\n");    printf("\n");

Legend:
Removed from v.461  
changed lines
  Added in v.482

  ViewVC Help
Powered by ViewVC 1.1.5