⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 pcretest.c

📁 以便Apache与其他服务进行整合 Mod_JK安装
💻 C
📖 第 1 页 / 共 4 页
字号:
        case 'B':        options |= PCRE_NOTBOL;        continue;        case 'C':        if (isdigit(*p))    /* Set copy string */          {          while(isdigit(*p)) n = n * 10 + *p++ - '0';          copystrings |= 1 << n;          }        else if (isalnum(*p))          {          uschar name[256];          uschar *npp = name;          while (isalnum(*p)) *npp++ = *p++;          *npp = 0;          n = pcre_get_stringnumber(re, (char *)name);          if (n < 0)            fprintf(outfile, "no parentheses with name \"%s\"\n", name);          else copystrings |= 1 << n;          }        else if (*p == '+')          {          callout_extra = 1;          p++;          }        else if (*p == '-')          {          pcre_callout = NULL;          p++;          }        else if (*p == '!')          {          callout_fail_id = 0;          p++;          while(isdigit(*p))            callout_fail_id = callout_fail_id * 10 + *p++ - '0';          callout_fail_count = 0;          if (*p == '!')            {            p++;            while(isdigit(*p))              callout_fail_count = callout_fail_count * 10 + *p++ - '0';            }          }        else if (*p == '*')          {          int sign = 1;          callout_data = 0;          if (*(++p) == '-') { sign = -1; p++; }          while(isdigit(*p))            callout_data = callout_data * 10 + *p++ - '0';          callout_data *= sign;          callout_data_set = 1;          }        continue;        case 'G':        if (isdigit(*p))          {          while(isdigit(*p)) n = n * 10 + *p++ - '0';          getstrings |= 1 << n;          }        else if (isalnum(*p))          {          uschar name[256];          uschar *npp = name;          while (isalnum(*p)) *npp++ = *p++;          *npp = 0;          n = pcre_get_stringnumber(re, (char *)name);          if (n < 0)            fprintf(outfile, "no parentheses with name \"%s\"\n", name);          else getstrings |= 1 << n;          }        continue;        case 'L':        getlist = 1;        continue;        case 'M':        find_match_limit = 1;        continue;        case 'N':        options |= PCRE_NOTEMPTY;        continue;        case 'O':        while(isdigit(*p)) n = n * 10 + *p++ - '0';        if (n > size_offsets_max)          {          size_offsets_max = n;          free(offsets);          use_offsets = offsets = (int *)malloc(size_offsets_max * sizeof(int));          if (offsets == NULL)            {            printf("** Failed to get %d bytes of memory for offsets vector\n",              size_offsets_max * sizeof(int));            return 1;            }          }        use_size_offsets = n;        if (n == 0) use_offsets = NULL;   /* Ensures it can't write to it */        continue;        case 'P':        options |= PCRE_PARTIAL;        continue;        case 'S':        show_malloc = 1;        continue;        case 'Z':        options |= PCRE_NOTEOL;        continue;        case '?':        options |= PCRE_NO_UTF8_CHECK;        continue;        }      *q++ = c;      }    *q = 0;    len = q - dbuffer;    /* Handle matching via the POSIX interface, which does not    support timing or playing with the match limit or callout data. */#if !defined NOPOSIX    if (posix || do_posix)      {      int rc;      int eflags = 0;      regmatch_t *pmatch = NULL;      if (use_size_offsets > 0)        pmatch = (regmatch_t *)malloc(sizeof(regmatch_t) * use_size_offsets);      if ((options & PCRE_NOTBOL) != 0) eflags |= REG_NOTBOL;      if ((options & PCRE_NOTEOL) != 0) eflags |= REG_NOTEOL;      rc = regexec(&preg, (const char *)bptr, use_size_offsets, pmatch, eflags);      if (rc != 0)        {        (void)regerror(rc, &preg, (char *)buffer, BUFFER_SIZE);        fprintf(outfile, "No match: POSIX code %d: %s\n", rc, buffer);        }      else        {        size_t i;        for (i = 0; i < (size_t)use_size_offsets; i++)          {          if (pmatch[i].rm_so >= 0)            {            fprintf(outfile, "%2d: ", (int)i);            (void)pchars(dbuffer + pmatch[i].rm_so,              pmatch[i].rm_eo - pmatch[i].rm_so, outfile);            fprintf(outfile, "\n");            if (i == 0 && do_showrest)              {              fprintf(outfile, " 0+ ");              (void)pchars(dbuffer + pmatch[i].rm_eo, len - pmatch[i].rm_eo,                outfile);              fprintf(outfile, "\n");              }            }          }        }      free(pmatch);      }    /* Handle matching via the native interface - repeats for /g and /G */    else#endif  /* !defined NOPOSIX */    for (;; gmatched++)    /* Loop for /g or /G */      {      if (timeit)        {        register int i;        clock_t time_taken;        clock_t start_time = clock();        for (i = 0; i < LOOPREPEAT; i++)          count = pcre_exec(re, extra, (char *)bptr, len,            start_offset, options | g_notempty, use_offsets, use_size_offsets);        time_taken = clock() - start_time;        fprintf(outfile, "Execute time %.3f milliseconds\n",          (((double)time_taken * 1000.0) / (double)LOOPREPEAT) /            (double)CLOCKS_PER_SEC);        }      /* If find_match_limit is set, we want to do repeated matches with      varying limits in order to find the minimum value. */      if (find_match_limit)        {        int min = 0;        int mid = 64;        int max = -1;        if (extra == NULL)          {          extra = (pcre_extra *)malloc(sizeof(pcre_extra));          extra->flags = 0;          }        extra->flags |= PCRE_EXTRA_MATCH_LIMIT;        for (;;)          {          extra->match_limit = mid;          count = pcre_exec(re, extra, (char *)bptr, len, start_offset,            options | g_notempty, use_offsets, use_size_offsets);          if (count == PCRE_ERROR_MATCHLIMIT)            {            /* fprintf(outfile, "Testing match limit = %d\n", mid); */            min = mid;            mid = (mid == max - 1)? max : (max > 0)? (min + max)/2 : mid*2;            }          else if (count >= 0 || count == PCRE_ERROR_NOMATCH ||                                 count == PCRE_ERROR_PARTIAL)            {            if (mid == min + 1)              {              fprintf(outfile, "Minimum match limit = %d\n", mid);              break;              }            /* fprintf(outfile, "Testing match limit = %d\n", mid); */            max = mid;            mid = (min + mid)/2;            }          else break;    /* Some other error */          }        extra->flags &= ~PCRE_EXTRA_MATCH_LIMIT;        }      /* If callout_data is set, use the interface with additional data */      else if (callout_data_set)        {        if (extra == NULL)          {          extra = (pcre_extra *)malloc(sizeof(pcre_extra));          extra->flags = 0;          }        extra->flags |= PCRE_EXTRA_CALLOUT_DATA;        extra->callout_data = &callout_data;        count = pcre_exec(re, extra, (char *)bptr, len, start_offset,          options | g_notempty, use_offsets, use_size_offsets);        extra->flags &= ~PCRE_EXTRA_CALLOUT_DATA;        }      /* The normal case is just to do the match once, with the default      value of match_limit. */      else        {        count = pcre_exec(re, extra, (char *)bptr, len,          start_offset, options | g_notempty, use_offsets, use_size_offsets);        }      if (count == 0)        {        fprintf(outfile, "Matched, but too many substrings\n");        count = use_size_offsets/3;        }      /* Matched */      if (count >= 0)        {        int i;        for (i = 0; i < count * 2; i += 2)          {          if (use_offsets[i] < 0)            fprintf(outfile, "%2d: <unset>\n", i/2);          else            {            fprintf(outfile, "%2d: ", i/2);            (void)pchars(bptr + use_offsets[i],              use_offsets[i+1] - use_offsets[i], outfile);            fprintf(outfile, "\n");            if (i == 0)              {              if (do_showrest)                {                fprintf(outfile, " 0+ ");                (void)pchars(bptr + use_offsets[i+1], len - use_offsets[i+1],                  outfile);                fprintf(outfile, "\n");                }              }            }          }        for (i = 0; i < 32; i++)          {          if ((copystrings & (1 << i)) != 0)            {            char copybuffer[16];            int rc = pcre_copy_substring((char *)bptr, use_offsets, count,              i, copybuffer, sizeof(copybuffer));            if (rc < 0)              fprintf(outfile, "copy substring %d failed %d\n", i, rc);            else              fprintf(outfile, "%2dC %s (%d)\n", i, copybuffer, rc);            }          }        for (i = 0; i < 32; i++)          {          if ((getstrings & (1 << i)) != 0)            {            const char *substring;            int rc = pcre_get_substring((char *)bptr, use_offsets, count,              i, &substring);            if (rc < 0)              fprintf(outfile, "get substring %d failed %d\n", i, rc);            else              {              fprintf(outfile, "%2dG %s (%d)\n", i, substring, rc);              /* free((void *)substring); */              pcre_free_substring(substring);              }            }          }        if (getlist)          {          const char **stringlist;          int rc = pcre_get_substring_list((char *)bptr, use_offsets, count,            &stringlist);          if (rc < 0)            fprintf(outfile, "get substring list failed %d\n", rc);          else            {            for (i = 0; i < count; i++)              fprintf(outfile, "%2dL %s\n", i, stringlist[i]);            if (stringlist[i] != NULL)              fprintf(outfile, "string list not terminated by NULL\n");            /* free((void *)stringlist); */            pcre_free_substring_list(stringlist);            }          }        }      /* There was a partial match */      else if (count == PCRE_ERROR_PARTIAL)        {        fprintf(outfile, "Partial match\n");        break;  /* Out of the /g loop */        }      /* Failed to match. If this is a /g or /G loop and we previously set      g_notempty after a null match, this is not necessarily the end.      We want to advance the start offset, and continue. In the case of UTF-8      matching, the advance must be one character, not one byte. Fudge the      offset values to achieve this. We won't be at the end of the string -      that was checked before setting g_notempty. */      else        {        if (g_notempty != 0)          {          int onechar = 1;          use_offsets[0] = start_offset;          if (use_utf8)            {            while (start_offset + onechar < len)              {              int tb = bptr[start_offset+onechar];              if (tb <= 127) break;              tb &= 0xc0;              if (tb != 0 && tb != 0xc0) onechar++;              }            }          use_offsets[1] = start_offset + onechar;          }        else          {          if (count == PCRE_ERROR_NOMATCH)            {            if (gmatched == 0) fprintf(outfile, "No match\n");            }          else fprintf(outfile, "Error %d\n", count);          break;  /* Out of the /g loop */          }        }      /* If not /g or /G we are done */      if (!do_g && !do_G) break;      /* If we have matched an empty string, first check to see if we are at      the end of the subject. If so, the /g loop is over. Otherwise, mimic      what Perl's /g options does. This turns out to be rather cunning. First      we set PCRE_NOTEMPTY and PCRE_ANCHORED and try the match again at the      same point. If this fails (picked up above) we advance to the next      character. */      g_notempty = 0;      if (use_offsets[0] == use_offsets[1])        {        if (use_offsets[0] == len) break;        g_notempty = PCRE_NOTEMPTY | PCRE_ANCHORED;        }      /* For /g, update the start offset, leaving the rest alone */      if (do_g) start_offset = use_offsets[1];      /* For /G, update the pointer and length */      else        {        bptr += use_offsets[1];        len -= use_offsets[1];        }      }  /* End of loop for /g and /G */    }    /* End of loop for data lines */  CONTINUE:#if !defined NOPOSIX  if (posix || do_posix) regfree(&preg);#endif  if (re != NULL) free(re);  if (extra != NULL) free(extra);  if (tables != NULL)    {    free((void *)tables);    setlocale(LC_CTYPE, "C");    }  }if (infile == stdin) fprintf(outfile, "\n");return 0;}/* End */

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -