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

Diff of /code/trunk/pcretest.c

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

revision 39 by nigel, Sat Feb 24 21:39:13 2007 UTC revision 41 by nigel, Sat Feb 24 21:39:17 2007 UTC
# Line 706  while (!done) Line 706  while (!done)
706      int getlist = 0;      int getlist = 0;
707      int gmatched = 0;      int gmatched = 0;
708      int start_offset = 0;      int start_offset = 0;
709        int g_notempty = 0;
710      int offsets[45];      int offsets[45];
711      int size_offsets = sizeof(offsets)/sizeof(int);      int size_offsets = sizeof(offsets)/sizeof(int);
712    
# Line 811  while (!done) Line 812  while (!done)
812        {        {
813        int rc;        int rc;
814        int eflags = 0;        int eflags = 0;
815        regmatch_t pmatch[30];        regmatch_t pmatch[sizeof(offsets)/sizeof(int)];
816        if ((options & PCRE_NOTBOL) != 0) eflags |= REG_NOTBOL;        if ((options & PCRE_NOTBOL) != 0) eflags |= REG_NOTBOL;
817        if ((options & PCRE_NOTEOL) != 0) eflags |= REG_NOTEOL;        if ((options & PCRE_NOTEOL) != 0) eflags |= REG_NOTEOL;
818    
819        rc = regexec(&preg, (const char *)bptr,        rc = regexec(&preg, (const char *)bptr, size_offsets, pmatch, eflags);
         sizeof(pmatch)/sizeof(regmatch_t), pmatch, eflags);  
820    
821        if (rc != 0)        if (rc != 0)
822          {          {
# Line 826  while (!done) Line 826  while (!done)
826        else        else
827          {          {
828          size_t i;          size_t i;
829          for (i = 0; i < sizeof(pmatch)/sizeof(regmatch_t); i++)          for (i = 0; i < size_offsets; i++)
830            {            {
831            if (pmatch[i].rm_so >= 0)            if (pmatch[i].rm_so >= 0)
832              {              {
# Line 859  while (!done) Line 859  while (!done)
859          clock_t start_time = clock();          clock_t start_time = clock();
860          for (i = 0; i < LOOPREPEAT; i++)          for (i = 0; i < LOOPREPEAT; i++)
861            count = pcre_exec(re, extra, (char *)bptr, len,            count = pcre_exec(re, extra, (char *)bptr, len,
862              start_offset, options, offsets, size_offsets);              start_offset, options | g_notempty, offsets, size_offsets);
863          time_taken = clock() - start_time;          time_taken = clock() - start_time;
864          fprintf(outfile, "Execute time %.3f milliseconds\n",          fprintf(outfile, "Execute time %.3f milliseconds\n",
865            ((double)time_taken * 1000.0)/            ((double)time_taken * 1000.0)/
# Line 867  while (!done) Line 867  while (!done)
867          }          }
868    
869        count = pcre_exec(re, extra, (char *)bptr, len,        count = pcre_exec(re, extra, (char *)bptr, len,
870          start_offset, options, offsets, size_offsets);          start_offset, options | g_notempty, offsets, size_offsets);
871    
872        if (count == 0)        if (count == 0)
873          {          {
# Line 950  while (!done) Line 950  while (!done)
950            }            }
951          }          }
952    
953        /* Failed to match */        /* Failed to match. If this is a /g or /G loop and we previously set
954          PCRE_NOTEMPTY after a null match, this is not necessarily the end.
955          We want to advance the start offset, and continue. Fudge the offset
956          values to achieve this. We won't be at the end of the string - that
957          was checked before setting PCRE_NOTEMPTY. */
958    
959        else        else
960          {          {
961          if (gmatched == 0)          if (g_notempty != 0)
962            {            {
963            if (count == -1) fprintf(outfile, "No match\n");            offsets[0] = start_offset;
964              else fprintf(outfile, "Error %d\n", count);            offsets[1] = start_offset + 1;
965              }
966            else
967              {
968              if (gmatched == 0)   /* Error if no previous matches */
969                {
970                if (count == -1) fprintf(outfile, "No match\n");
971                  else fprintf(outfile, "Error %d\n", count);
972                }
973              break;  /* Out of the /g loop */
974            }            }
         break;  /* Out of the /g loop */  
975          }          }
976    
977        /* If not /g or /G we are done */        /* If not /g or /G we are done */
978    
979        if (!do_g && !do_G) break;        if (!do_g && !do_G) break;
980    
981        /* If we have matched an empty string, set PCRE_NOTEMPTY for the next        /* If we have matched an empty string, first check to see if we are at
982        match. This mimics what Perl's /g option does. */        the end of the subject. If so, the /g loop is over. Otherwise, mimic
983          what Perl's /g options does. This turns out to be rather cunning. First
984          we set PCRE_NOTEMPTY and try the match again at the same point. If this
985          fails (picked up above) we advance to the next character. */
986    
987        if (offsets[1] == offsets[0])        g_notempty = 0;
988          options |= PCRE_NOTEMPTY;        if (offsets[0] == offsets[1])
989        else          {
990          options &= ~PCRE_NOTEMPTY;          if (offsets[0] == len) break;
991            g_notempty = PCRE_NOTEMPTY;
992            }
993    
994        /* For /g, update the start offset, leaving the rest alone */        /* For /g, update the start offset, leaving the rest alone */
995    

Legend:
Removed from v.39  
changed lines
  Added in v.41

webmaster@exim.org
ViewVC Help
Powered by ViewVC 1.1.12