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

📄 pcretest.c

📁 ncbi源码
💻 C
📖 第 1 页 / 共 3 页
字号:
        time_taken = clock() - start_time;        if (extra != NULL) free(extra);        fprintf(outfile, "  Study time %.3f milliseconds\n",          ((double)time_taken * 1000.0)/          ((double)LOOPREPEAT * (double)CLOCKS_PER_SEC));        }      extra = pcre_study(re, study_options, &error);      if (error != NULL)        fprintf(outfile, "Failed to study: %s\n", error);      else if (extra == NULL)        fprintf(outfile, "Study returned NULL\n");      else if (do_showinfo)        {        uschar *start_bits = NULL;        new_info(re, extra, PCRE_INFO_FIRSTTABLE, &start_bits);        if (start_bits == NULL)          fprintf(outfile, "No starting character set\n");        else          {          int i;          int c = 24;          fprintf(outfile, "Starting character set: ");          for (i = 0; i < 256; i++)            {            if ((start_bits[i/8] & (1<<(i%8))) != 0)              {              if (c > 75)                {                fprintf(outfile, "\n  ");                c = 2;                }              if (isprint(i) && i != ' ')                {                fprintf(outfile, "%c ", i);                c += 2;                }              else                {                fprintf(outfile, "\\x%02x ", i);                c += 5;                }              }            }          fprintf(outfile, "\n");          }        }      }    }  /* Read data lines and test them */  for (;;)    {    unsigned char *q;    unsigned char *bptr = dbuffer;    int *use_offsets = offsets;    int use_size_offsets = size_offsets;    int count, c;    int copystrings = 0;    int getstrings = 0;    int getlist = 0;    int gmatched = 0;    int start_offset = 0;    int g_notempty = 0;    options = 0;    if (infile == stdin) printf("data> ");    if (fgets((char *)buffer, sizeof(buffer), infile) == NULL)      {      done = 1;      goto CONTINUE;      }    if (infile != stdin) fprintf(outfile, "%s", (char *)buffer);    len = (int)strlen((char *)buffer);    while (len > 0 && isspace(buffer[len-1])) len--;    buffer[len] = 0;    if (len == 0) break;    p = buffer;    while (isspace(*p)) p++;    q = dbuffer;    while ((c = *p++) != 0)      {      int i = 0;      int n = 0;      if (c == '\\') switch ((c = *p++))        {        case 'a': c =    7; break;        case 'b': c = '\b'; break;        case 'e': c =   27; break;        case 'f': c = '\f'; break;        case 'n': c = '\n'; break;        case 'r': c = '\r'; break;        case 't': c = '\t'; break;        case 'v': c = '\v'; break;        case '0': case '1': case '2': case '3':        case '4': case '5': case '6': case '7':        c -= '0';        while (i++ < 2 && isdigit(*p) && *p != '8' && *p != '9')          c = c * 8 + *p++ - '0';        break;        case 'x':        /* Handle \x{..} specially - new Perl thing for utf8 */        if (*p == '{')          {          unsigned char *pt = p;          c = 0;          while (isxdigit(*(++pt)))            c = c * 16 + tolower(*pt) - ((isdigit(*pt))? '0' : 'W');          if (*pt == '}')            {            unsigned char buffer[8];            int ii, utn;            utn = ord2utf8(c, buffer);            for (ii = 0; ii < utn - 1; ii++) *q++ = buffer[ii];            c = buffer[ii];   /* Last byte */            p = pt + 1;            break;            }          /* Not correct form; fall through */          }        /* Ordinary \x */        c = 0;        while (i++ < 2 && isxdigit(*p))          {          c = c * 16 + tolower(*p) - ((isdigit(*p))? '0' : 'W');          p++;          }        break;        case 0:   /* Allows for an empty line */        p--;        continue;        case 'A':  /* Option setting */        options |= PCRE_ANCHORED;        continue;        case 'B':        options |= PCRE_NOTBOL;        continue;        case 'C':        while(isdigit(*p)) n = n * 10 + *p++ - '0';        copystrings |= 1 << n;        continue;        case 'G':        while(isdigit(*p)) n = n * 10 + *p++ - '0';        getstrings |= 1 << n;        continue;        case 'L':        getlist = 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 = 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;        continue;        case 'Z':        options |= PCRE_NOTEOL;        continue;        }      *q++ = c;      }    *q = 0;    len = q - dbuffer;    /* Handle matching via the POSIX interface, which does not    support timing. */#if !defined NOPOSIX    if (posix || do_posix)      {      int rc;      int eflags = 0;      regmatch_t *pmatch = 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, sizeof(buffer));        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);            pchars(dbuffer + pmatch[i].rm_so,              pmatch[i].rm_eo - pmatch[i].rm_so, utf8);            fprintf(outfile, "\n");            if (i == 0 && do_showrest)              {              fprintf(outfile, " 0+ ");              pchars(dbuffer + pmatch[i].rm_eo, len - pmatch[i].rm_eo, utf8);              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));        }      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);            pchars(bptr + use_offsets[i], use_offsets[i+1] - use_offsets[i], utf8);            fprintf(outfile, "\n");            if (i == 0)              {              if (do_showrest)                {                fprintf(outfile, " 0+ ");                pchars(bptr + use_offsets[i+1], len - use_offsets[i+1], utf8);                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);            }          }        }      /* 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. 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)          {          use_offsets[0] = start_offset;          use_offsets[1] = start_offset + 1;          }        else          {          if (gmatched == 0)   /* Error if no previous matches */            {            if (count == -1) 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");    }  }fprintf(outfile, "\n");return 0;}/* End */

⌨️ 快捷键说明

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