/[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 150 by ph10, Tue Apr 17 08:22:40 2007 UTC revision 388 by ph10, Wed Mar 11 17:03:17 2009 UTC
# Line 36  POSSIBILITY OF SUCH DAMAGE. Line 36  POSSIBILITY OF SUCH DAMAGE.
36  */  */
37    
38    
39    #ifdef HAVE_CONFIG_H
40    #include "config.h"
41    #endif
42    
43  #include <ctype.h>  #include <ctype.h>
44  #include <stdio.h>  #include <stdio.h>
45  #include <string.h>  #include <string.h>
# Line 44  POSSIBILITY OF SUCH DAMAGE. Line 48  POSSIBILITY OF SUCH DAMAGE.
48  #include <locale.h>  #include <locale.h>
49  #include <errno.h>  #include <errno.h>
50    
51    #ifdef SUPPORT_LIBREADLINE
52    #ifdef HAVE_UNISTD_H
53    #include <unistd.h>
54    #endif
55    #include <readline/readline.h>
56    #include <readline/history.h>
57    #endif
58    
59    
60  /* A number of things vary for Windows builds. Originally, pcretest opened its  /* A number of things vary for Windows builds. Originally, pcretest opened its
61  input and output without "b"; then I was told that "b" was needed in some  input and output without "b"; then I was told that "b" was needed in some
# Line 59  input mode under Windows. */ Line 71  input mode under Windows. */
71  #define INPUT_MODE   "r"  #define INPUT_MODE   "r"
72  #define OUTPUT_MODE  "wb"  #define OUTPUT_MODE  "wb"
73    
74    #define isatty _isatty         /* This is what Windows calls them, I'm told */
75    #define fileno _fileno
76    
77  #else  #else
78  #include <sys/time.h>          /* These two includes are needed */  #include <sys/time.h>          /* These two includes are needed */
79  #include <sys/resource.h>      /* for setrlimit(). */  #include <sys/resource.h>      /* for setrlimit(). */
# Line 79  appropriately for an application, not fo Line 94  appropriately for an application, not fo
94  #include "pcre.h"  #include "pcre.h"
95  #include "pcre_internal.h"  #include "pcre_internal.h"
96    
97  /* We need access to the data tables that PCRE uses. So as not to have to keep  /* We need access to some of the data tables that PCRE uses. So as not to have
98  two copies, we include the source file here, changing the names of the external  to keep two copies, we include the source file here, changing the names of the
99  symbols to prevent clashes. */  external symbols to prevent clashes. */
100    
101    #define _pcre_ucp_gentype      ucp_gentype
102  #define _pcre_utf8_table1      utf8_table1  #define _pcre_utf8_table1      utf8_table1
103  #define _pcre_utf8_table1_size utf8_table1_size  #define _pcre_utf8_table1_size utf8_table1_size
104  #define _pcre_utf8_table2      utf8_table2  #define _pcre_utf8_table2      utf8_table2
# Line 90  symbols to prevent clashes. */ Line 106  symbols to prevent clashes. */
106  #define _pcre_utf8_table4      utf8_table4  #define _pcre_utf8_table4      utf8_table4
107  #define _pcre_utt              utt  #define _pcre_utt              utt
108  #define _pcre_utt_size         utt_size  #define _pcre_utt_size         utt_size
109    #define _pcre_utt_names        utt_names
110  #define _pcre_OP_lengths       OP_lengths  #define _pcre_OP_lengths       OP_lengths
111    
112  #include "pcre_tables.c"  #include "pcre_tables.c"
# Line 152  static int callout_count; Line 169  static int callout_count;
169  static int callout_extra;  static int callout_extra;
170  static int callout_fail_count;  static int callout_fail_count;
171  static int callout_fail_id;  static int callout_fail_id;
172    static int debug_lengths;
173  static int first_callout;  static int first_callout;
174  static int locale_set = 0;  static int locale_set = 0;
175  static int show_malloc;  static int show_malloc;
# Line 183  optimal way of handling this, but hey, t Line 201  optimal way of handling this, but hey, t
201  Arguments:  Arguments:
202    f            the file to read    f            the file to read
203    start        where in buffer to start (this *must* be within buffer)    start        where in buffer to start (this *must* be within buffer)
204      prompt       for stdin or readline()
205    
206  Returns:       pointer to the start of new data  Returns:       pointer to the start of new data
207                 could be a copy of start, or could be moved                 could be a copy of start, or could be moved
# Line 190  Returns: pointer to the start of n Line 209  Returns: pointer to the start of n
209  */  */
210    
211  static uschar *  static uschar *
212  extend_inputline(FILE *f, uschar *start)  extend_inputline(FILE *f, uschar *start, const char *prompt)
213  {  {
214  uschar *here = start;  uschar *here = start;
215    
# Line 201  for (;;) Line 220  for (;;)
220    if (rlen > 1000)    if (rlen > 1000)
221      {      {
222      int dlen;      int dlen;
223      if (fgets((char *)here, rlen,  f) == NULL)  
224        return (here == start)? NULL : start;      /* If libreadline support is required, use readline() to read a line if the
225        input is a terminal. Note that readline() removes the trailing newline, so
226        we must put it back again, to be compatible with fgets(). */
227    
228    #ifdef SUPPORT_LIBREADLINE
229        if (isatty(fileno(f)))
230          {
231          size_t len;
232          char *s = readline(prompt);
233          if (s == NULL) return (here == start)? NULL : start;
234          len = strlen(s);
235          if (len > 0) add_history(s);
236          if (len > rlen - 1) len = rlen - 1;
237          memcpy(here, s, len);
238          here[len] = '\n';
239          here[len+1] = 0;
240          free(s);
241          }
242        else
243    #endif
244    
245        /* Read the next line by normal means, prompting if the file is stdin. */
246    
247          {
248          if (f == stdin) printf(prompt);
249          if (fgets((char *)here, rlen,  f) == NULL)
250            return (here == start)? NULL : start;
251          }
252    
253      dlen = (int)strlen((char *)here);      dlen = (int)strlen((char *)here);
254      if (dlen > 0 && here[dlen - 1] == '\n') return start;      if (dlen > 0 && here[dlen - 1] == '\n') return start;
255      here += dlen;      here += dlen;
# Line 659  return count; Line 706  return count;
706    
707    
708  /*************************************************  /*************************************************
709    *         Case-independent strncmp() function    *
710    *************************************************/
711    
712    /*
713    Arguments:
714      s         first string
715      t         second string
716      n         number of characters to compare
717    
718    Returns:    < 0, = 0, or > 0, according to the comparison
719    */
720    
721    static int
722    strncmpic(uschar *s, uschar *t, int n)
723    {
724    while (n--)
725      {
726      int c = tolower(*s++) - tolower(*t++);
727      if (c) return c;
728      }
729    return 0;
730    }
731    
732    
733    
734    /*************************************************
735  *         Check newline indicator                *  *         Check newline indicator                *
736  *************************************************/  *************************************************/
737    
# Line 676  Returns: appropriate PCRE_NEWLINE_x Line 749  Returns: appropriate PCRE_NEWLINE_x
749  static int  static int
750  check_newline(uschar *p, FILE *f)  check_newline(uschar *p, FILE *f)
751  {  {
752  if (strncmp((char *)p, "cr>", 3) == 0) return PCRE_NEWLINE_CR;  if (strncmpic(p, (uschar *)"cr>", 3) == 0) return PCRE_NEWLINE_CR;
753  if (strncmp((char *)p, "lf>", 3) == 0) return PCRE_NEWLINE_LF;  if (strncmpic(p, (uschar *)"lf>", 3) == 0) return PCRE_NEWLINE_LF;
754  if (strncmp((char *)p, "crlf>", 5) == 0) return PCRE_NEWLINE_CRLF;  if (strncmpic(p, (uschar *)"crlf>", 5) == 0) return PCRE_NEWLINE_CRLF;
755  if (strncmp((char *)p, "anycrlf>", 8) == 0) return PCRE_NEWLINE_ANYCRLF;  if (strncmpic(p, (uschar *)"anycrlf>", 8) == 0) return PCRE_NEWLINE_ANYCRLF;
756  if (strncmp((char *)p, "any>", 4) == 0) return PCRE_NEWLINE_ANY;  if (strncmpic(p, (uschar *)"any>", 4) == 0) return PCRE_NEWLINE_ANY;
757    if (strncmpic(p, (uschar *)"bsr_anycrlf>", 12) == 0) return PCRE_BSR_ANYCRLF;
758    if (strncmpic(p, (uschar *)"bsr_unicode>", 12) == 0) return PCRE_BSR_UNICODE;
759  fprintf(f, "Unknown newline type at: <%s\n", p);  fprintf(f, "Unknown newline type at: <%s\n", p);
760  return 0;  return 0;
761  }  }
# Line 694  return 0; Line 769  return 0;
769  static void  static void
770  usage(void)  usage(void)
771  {  {
772  printf("Usage:     pcretest [options] [<input> [<output>]]\n");  printf("Usage:     pcretest [options] [<input file> [<output file>]]\n\n");
773    printf("Input and output default to stdin and stdout.\n");
774    #ifdef SUPPORT_LIBREADLINE
775    printf("If input is a terminal, readline() is used to read from it.\n");
776    #else
777    printf("This version of pcretest is not linked with readline().\n");
778    #endif
779    printf("\nOptions:\n");
780  printf("  -b       show compiled code (bytecode)\n");  printf("  -b       show compiled code (bytecode)\n");
781  printf("  -C       show PCRE compile-time options and exit\n");  printf("  -C       show PCRE compile-time options and exit\n");
782  printf("  -d       debug: show compiled code and information (-b and -i)\n");  printf("  -d       debug: show compiled code and information (-b and -i)\n");
# Line 703  printf(" -dfa force DFA matching fo Line 785  printf(" -dfa force DFA matching fo
785  #endif  #endif
786  printf("  -help    show usage information\n");  printf("  -help    show usage information\n");
787  printf("  -i       show information about compiled patterns\n"  printf("  -i       show information about compiled patterns\n"
788           "  -M       find MATCH_LIMIT minimum for each subject\n"
789         "  -m       output memory used information\n"         "  -m       output memory used information\n"
790         "  -o <n>   set size of offsets vector to <n>\n");         "  -o <n>   set size of offsets vector to <n>\n");
791  #if !defined NOPOSIX  #if !defined NOPOSIX
# Line 732  int main(int argc, char **argv) Line 815  int main(int argc, char **argv)
815  FILE *infile = stdin;  FILE *infile = stdin;
816  int options = 0;  int options = 0;
817  int study_options = 0;  int study_options = 0;
818    int default_find_match_limit = FALSE;
819  int op = 1;  int op = 1;
820  int timeit = 0;  int timeit = 0;
821  int timeitm = 0;  int timeitm = 0;
# Line 791  while (argc > 1 && argv[op][0] == '-') Line 875  while (argc > 1 && argv[op][0] == '-')
875    else if (strcmp(argv[op], "-b") == 0) debug = 1;    else if (strcmp(argv[op], "-b") == 0) debug = 1;
876    else if (strcmp(argv[op], "-i") == 0) showinfo = 1;    else if (strcmp(argv[op], "-i") == 0) showinfo = 1;
877    else if (strcmp(argv[op], "-d") == 0) showinfo = debug = 1;    else if (strcmp(argv[op], "-d") == 0) showinfo = debug = 1;
878      else if (strcmp(argv[op], "-M") == 0) default_find_match_limit = TRUE;
879  #if !defined NODFA  #if !defined NODFA
880    else if (strcmp(argv[op], "-dfa") == 0) all_use_dfa = 1;    else if (strcmp(argv[op], "-dfa") == 0) all_use_dfa = 1;
881  #endif  #endif
# Line 843  while (argc > 1 && argv[op][0] == '-') Line 928  while (argc > 1 && argv[op][0] == '-')
928    else if (strcmp(argv[op], "-C") == 0)    else if (strcmp(argv[op], "-C") == 0)
929      {      {
930      int rc;      int rc;
931        unsigned long int lrc;
932      printf("PCRE version %s\n", pcre_version());      printf("PCRE version %s\n", pcre_version());
933      printf("Compiled with\n");      printf("Compiled with\n");
934      (void)pcre_config(PCRE_CONFIG_UTF8, &rc);      (void)pcre_config(PCRE_CONFIG_UTF8, &rc);
# Line 854  while (argc > 1 && argv[op][0] == '-') Line 940  while (argc > 1 && argv[op][0] == '-')
940        (rc == '\n')? "LF" : (rc == ('\r'<<8 | '\n'))? "CRLF" :        (rc == '\n')? "LF" : (rc == ('\r'<<8 | '\n'))? "CRLF" :
941        (rc == -2)? "ANYCRLF" :        (rc == -2)? "ANYCRLF" :
942        (rc == -1)? "ANY" : "???");        (rc == -1)? "ANY" : "???");
943        (void)pcre_config(PCRE_CONFIG_BSR, &rc);
944        printf("  \\R matches %s\n", rc? "CR, LF, or CRLF only" :
945                                         "all Unicode newlines");
946      (void)pcre_config(PCRE_CONFIG_LINK_SIZE, &rc);      (void)pcre_config(PCRE_CONFIG_LINK_SIZE, &rc);
947      printf("  Internal link size = %d\n", rc);      printf("  Internal link size = %d\n", rc);
948      (void)pcre_config(PCRE_CONFIG_POSIX_MALLOC_THRESHOLD, &rc);      (void)pcre_config(PCRE_CONFIG_POSIX_MALLOC_THRESHOLD, &rc);
949      printf("  POSIX malloc threshold = %d\n", rc);      printf("  POSIX malloc threshold = %d\n", rc);
950      (void)pcre_config(PCRE_CONFIG_MATCH_LIMIT, &rc);      (void)pcre_config(PCRE_CONFIG_MATCH_LIMIT, &lrc);
951      printf("  Default match limit = %d\n", rc);      printf("  Default match limit = %ld\n", lrc);
952      (void)pcre_config(PCRE_CONFIG_MATCH_LIMIT_RECURSION, &rc);      (void)pcre_config(PCRE_CONFIG_MATCH_LIMIT_RECURSION, &lrc);
953      printf("  Default recursion depth limit = %d\n", rc);      printf("  Default recursion depth limit = %ld\n", lrc);
954      (void)pcre_config(PCRE_CONFIG_STACKRECURSE, &rc);      (void)pcre_config(PCRE_CONFIG_STACKRECURSE, &rc);
955      printf("  Match recursion uses %s\n", rc? "stack" : "heap");      printf("  Match recursion uses %s\n", rc? "stack" : "heap");
956      goto EXIT;      goto EXIT;
# Line 890  offsets = (int *)malloc(size_offsets_max Line 979  offsets = (int *)malloc(size_offsets_max
979  if (offsets == NULL)  if (offsets == NULL)
980    {    {
981    printf("** Failed to get %d bytes of memory for offsets vector\n",    printf("** Failed to get %d bytes of memory for offsets vector\n",
982      size_offsets_max * sizeof(int));      (int)(size_offsets_max * sizeof(int)));
983    yield = 1;    yield = 1;
984    goto EXIT;    goto EXIT;
985    }    }
# Line 950  while (!done) Line 1039  while (!done)
1039    size_t size, regex_gotten_store;    size_t size, regex_gotten_store;
1040    int do_study = 0;    int do_study = 0;
1041    int do_debug = debug;    int do_debug = debug;
   int debug_lengths = 1;  
1042    int do_G = 0;    int do_G = 0;
1043    int do_g = 0;    int do_g = 0;
1044    int do_showinfo = showinfo;    int do_showinfo = showinfo;
# Line 959  while (!done) Line 1047  while (!done)
1047    int erroroffset, len, delimiter, poffset;    int erroroffset, len, delimiter, poffset;
1048    
1049    use_utf8 = 0;    use_utf8 = 0;
1050      debug_lengths = 1;
1051    
1052    if (infile == stdin) printf("  re> ");    if (extend_inputline(infile, buffer, "  re> ") == NULL) break;
   if (extend_inputline(infile, buffer) == NULL) break;  
1053    if (infile != stdin) fprintf(outfile, "%s", (char *)buffer);    if (infile != stdin) fprintf(outfile, "%s", (char *)buffer);
1054    fflush(outfile);    fflush(outfile);
1055    
# Line 1061  while (!done) Line 1149  while (!done)
1149    
1150    if (isalnum(delimiter) || delimiter == '\\')    if (isalnum(delimiter) || delimiter == '\\')
1151      {      {
1152      fprintf(outfile, "** Delimiter must not be alphameric or \\\n");      fprintf(outfile, "** Delimiter must not be alphanumeric or \\\n");
1153      goto SKIP_DATA;      goto SKIP_DATA;
1154      }      }
1155    
# Line 1077  while (!done) Line 1165  while (!done)
1165        pp++;        pp++;
1166        }        }
1167      if (*pp != 0) break;      if (*pp != 0) break;
1168      if (infile == stdin) printf("    > ");      if ((pp = extend_inputline(infile, pp, "    > ")) == NULL)
     if ((pp = extend_inputline(infile, pp)) == NULL)  
1169        {        {
1170        fprintf(outfile, "** Unexpected EOF\n");        fprintf(outfile, "** Unexpected EOF\n");
1171        done = 1;        done = 1;
# Line 1170  while (!done) Line 1257  while (!done)
1257    
1258        case '<':        case '<':
1259          {          {
1260          int x = check_newline(pp, outfile);          if (strncmp((char *)pp, "JS>", 3) == 0)
1261          if (x == 0) goto SKIP_DATA;            {
1262          options |= x;            options |= PCRE_JAVASCRIPT_COMPAT;
1263          while (*pp++ != '>');            pp += 3;
1264              }
1265            else
1266              {
1267              int x = check_newline(pp, outfile);
1268              if (x == 0) goto SKIP_DATA;
1269              options |= x;
1270              while (*pp++ != '>');
1271              }
1272          }          }
1273        break;        break;
1274    
# Line 1252  while (!done) Line 1347  while (!done)
1347          {          {
1348          for (;;)          for (;;)
1349            {            {
1350            if (extend_inputline(infile, buffer) == NULL)            if (extend_inputline(infile, buffer, NULL) == NULL)
1351              {              {
1352              done = 1;              done = 1;
1353              goto CONTINUE;              goto CONTINUE;
# Line 1315  while (!done) Line 1410  while (!done)
1410      if (do_flip)      if (do_flip)
1411        {        {
1412        real_pcre *rre = (real_pcre *)re;        real_pcre *rre = (real_pcre *)re;
1413        rre->magic_number = byteflip(rre->magic_number, sizeof(rre->magic_number));        rre->magic_number =
1414            byteflip(rre->magic_number, sizeof(rre->magic_number));
1415        rre->size = byteflip(rre->size, sizeof(rre->size));        rre->size = byteflip(rre->size, sizeof(rre->size));
1416        rre->options = byteflip(rre->options, sizeof(rre->options));        rre->options = byteflip(rre->options, sizeof(rre->options));
1417        rre->top_bracket = byteflip(rre->top_bracket, sizeof(rre->top_bracket));        rre->flags = (pcre_uint16)byteflip(rre->flags, sizeof(rre->flags));
1418        rre->top_backref = byteflip(rre->top_backref, sizeof(rre->top_backref));        rre->top_bracket =
1419        rre->first_byte = byteflip(rre->first_byte, sizeof(rre->first_byte));          (pcre_uint16)byteflip(rre->top_bracket, sizeof(rre->top_bracket));
1420        rre->req_byte = byteflip(rre->req_byte, sizeof(rre->req_byte));        rre->top_backref =
1421        rre->name_table_offset = byteflip(rre->name_table_offset,          (pcre_uint16)byteflip(rre->top_backref, sizeof(rre->top_backref));
1422          rre->first_byte =
1423            (pcre_uint16)byteflip(rre->first_byte, sizeof(rre->first_byte));
1424          rre->req_byte =
1425            (pcre_uint16)byteflip(rre->req_byte, sizeof(rre->req_byte));
1426          rre->name_table_offset = (pcre_uint16)byteflip(rre->name_table_offset,
1427          sizeof(rre->name_table_offset));          sizeof(rre->name_table_offset));
1428        rre->name_entry_size = byteflip(rre->name_entry_size,        rre->name_entry_size = (pcre_uint16)byteflip(rre->name_entry_size,
1429          sizeof(rre->name_entry_size));          sizeof(rre->name_entry_size));
1430        rre->name_count = byteflip(rre->name_count, sizeof(rre->name_count));        rre->name_count = (pcre_uint16)byteflip(rre->name_count,
1431            sizeof(rre->name_count));
1432    
1433        if (extra != NULL)        if (extra != NULL)
1434          {          {
# Line 1352  while (!done) Line 1454  while (!done)
1454  #if !defined NOINFOCHECK  #if !defined NOINFOCHECK
1455        int old_first_char, old_options, old_count;        int old_first_char, old_options, old_count;
1456  #endif  #endif
1457        int count, backrefmax, first_char, need_char;        int count, backrefmax, first_char, need_char, okpartial, jchanged,
1458            hascrorlf;
1459        int nameentrysize, namecount;        int nameentrysize, namecount;
1460        const uschar *nametable;        const uschar *nametable;
1461    
# Line 1365  while (!done) Line 1468  while (!done)
1468        new_info(re, NULL, PCRE_INFO_NAMEENTRYSIZE, &nameentrysize);        new_info(re, NULL, PCRE_INFO_NAMEENTRYSIZE, &nameentrysize);
1469        new_info(re, NULL, PCRE_INFO_NAMECOUNT, &namecount);        new_info(re, NULL, PCRE_INFO_NAMECOUNT, &namecount);
1470        new_info(re, NULL, PCRE_INFO_NAMETABLE, (void *)&nametable);        new_info(re, NULL, PCRE_INFO_NAMETABLE, (void *)&nametable);
1471          new_info(re, NULL, PCRE_INFO_OKPARTIAL, &okpartial);
1472          new_info(re, NULL, PCRE_INFO_JCHANGED, &jchanged);
1473          new_info(re, NULL, PCRE_INFO_HASCRORLF, &hascrorlf);
1474    
1475  #if !defined NOINFOCHECK  #if !defined NOINFOCHECK
1476        old_count = pcre_info(re, &old_options, &old_first_char);        old_count = pcre_info(re, &old_options, &old_first_char);
# Line 1406  while (!done) Line 1512  while (!done)
1512            }            }
1513          }          }
1514    
1515        /* The NOPARTIAL bit is a private bit in the options, so we have        if (!okpartial) fprintf(outfile, "Partial matching not supported\n");
1516        to fish it out via out back door */        if (hascrorlf) fprintf(outfile, "Contains explicit CR or LF match\n");
1517    
1518        all_options = ((real_pcre *)re)->options;        all_options = ((real_pcre *)re)->options;
1519        if (do_flip)        if (do_flip) all_options = byteflip(all_options, sizeof(all_options));
         {  
         all_options = byteflip(all_options, sizeof(all_options));  
          }  
   
       if ((all_options & PCRE_NOPARTIAL) != 0)  
         fprintf(outfile, "Partial matching not supported\n");  
1520    
1521        if (get_options == 0) fprintf(outfile, "No options\n");        if (get_options == 0) fprintf(outfile, "No options\n");
1522          else fprintf(outfile, "Options:%s%s%s%s%s%s%s%s%s%s%s%s%s\n",          else fprintf(outfile, "Options:%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s\n",
1523            ((get_options & PCRE_ANCHORED) != 0)? " anchored" : "",            ((get_options & PCRE_ANCHORED) != 0)? " anchored" : "",
1524            ((get_options & PCRE_CASELESS) != 0)? " caseless" : "",            ((get_options & PCRE_CASELESS) != 0)? " caseless" : "",
1525            ((get_options & PCRE_EXTENDED) != 0)? " extended" : "",            ((get_options & PCRE_EXTENDED) != 0)? " extended" : "",
1526            ((get_options & PCRE_MULTILINE) != 0)? " multiline" : "",            ((get_options & PCRE_MULTILINE) != 0)? " multiline" : "",
1527            ((get_options & PCRE_FIRSTLINE) != 0)? " firstline" : "",            ((get_options & PCRE_FIRSTLINE) != 0)? " firstline" : "",
1528            ((get_options & PCRE_DOTALL) != 0)? " dotall" : "",            ((get_options & PCRE_DOTALL) != 0)? " dotall" : "",
1529              ((get_options & PCRE_BSR_ANYCRLF) != 0)? " bsr_anycrlf" : "",
1530              ((get_options & PCRE_BSR_UNICODE) != 0)? " bsr_unicode" : "",
1531            ((get_options & PCRE_DOLLAR_ENDONLY) != 0)? " dollar_endonly" : "",            ((get_options & PCRE_DOLLAR_ENDONLY) != 0)? " dollar_endonly" : "",
1532            ((get_options & PCRE_EXTRA) != 0)? " extra" : "",            ((get_options & PCRE_EXTRA) != 0)? " extra" : "",
1533            ((get_options & PCRE_UNGREEDY) != 0)? " ungreedy" : "",            ((get_options & PCRE_UNGREEDY) != 0)? " ungreedy" : "",
# Line 1434  while (!done) Line 1536  while (!done)
1536            ((get_options & PCRE_NO_UTF8_CHECK) != 0)? " no_utf8_check" : "",            ((get_options & PCRE_NO_UTF8_CHECK) != 0)? " no_utf8_check" : "",
1537            ((get_options & PCRE_DUPNAMES) != 0)? " dupnames" : "");            ((get_options & PCRE_DUPNAMES) != 0)? " dupnames" : "");
1538    
1539          if (jchanged) fprintf(outfile, "Duplicate name status changes\n");
1540    
1541        switch (get_options & PCRE_NEWLINE_BITS)        switch (get_options & PCRE_NEWLINE_BITS)
1542          {          {
1543          case PCRE_NEWLINE_CR:          case PCRE_NEWLINE_CR:
# Line 1556  while (!done) Line 1660  while (!done)
1660        else        else
1661          {          {
1662          uschar sbuf[8];          uschar sbuf[8];
1663          sbuf[0] = (true_size >> 24)  & 255;          sbuf[0] = (uschar)((true_size >> 24) & 255);
1664          sbuf[1] = (true_size >> 16)  & 255;          sbuf[1] = (uschar)((true_size >> 16) & 255);
1665          sbuf[2] = (true_size >>  8)  & 255;          sbuf[2] = (uschar)((true_size >>  8) & 255);
1666          sbuf[3] = (true_size)  & 255;          sbuf[3] = (uschar)((true_size) & 255);
1667    
1668          sbuf[4] = (true_study_size >> 24)  & 255;          sbuf[4] = (uschar)((true_study_size >> 24) & 255);
1669          sbuf[5] = (true_study_size >> 16)  & 255;          sbuf[5] = (uschar)((true_study_size >> 16) & 255);
1670          sbuf[6] = (true_study_size >>  8)  & 255;          sbuf[6] = (uschar)((true_study_size >>  8) & 255);
1671          sbuf[7] = (true_study_size)  & 255;          sbuf[7] = (uschar)((true_study_size) & 255);
1672    
1673          if (fwrite(sbuf, 1, 8, f) < 8 ||          if (fwrite(sbuf, 1, 8, f) < 8 ||
1674              fwrite(re, 1, true_size, f) < true_size)              fwrite(re, 1, true_size, f) < true_size)
# Line 1608  while (!done) Line 1712  while (!done)
1712      int callout_data_set = 0;      int callout_data_set = 0;
1713      int count, c;      int count, c;
1714      int copystrings = 0;      int copystrings = 0;
1715      int find_match_limit = 0;      int find_match_limit = default_find_match_limit;
1716      int getstrings = 0;      int getstrings = 0;
1717      int getlist = 0;      int getlist = 0;
1718      int gmatched = 0;      int gmatched = 0;
# Line 1638  while (!done) Line 1742  while (!done)
1742      len = 0;      len = 0;
1743      for (;;)      for (;;)
1744        {        {
1745        if (infile == stdin) printf("data> ");        if (extend_inputline(infile, buffer + len, "data> ") == NULL)
       if (extend_inputline(infile, buffer + len) == NULL)  
1746          {          {
1747          if (len > 0) break;          if (len > 0) break;
1748          done = 1;          done = 1;
# Line 1707  while (!done) Line 1810  while (!done)
1810              {              {
1811              unsigned char buff8[8];              unsigned char buff8[8];
1812              int ii, utn;              int ii, utn;
1813              utn = ord2utf8(c, buff8);              if (use_utf8)
1814              for (ii = 0; ii < utn - 1; ii++) *q++ = buff8[ii];                {
1815              c = buff8[ii];   /* Last byte */                utn = ord2utf8(c, buff8);
1816                  for (ii = 0; ii < utn - 1; ii++) *q++ = buff8[ii];
1817                  c = buff8[ii];   /* Last byte */
1818                  }
1819                else
1820                 {
1821                 if (c > 255)
1822                   fprintf(outfile, "** Character \\x{%x} is greater than 255 and "
1823                     "UTF-8 mode is not enabled.\n"
1824                     "** Truncation will probably give the wrong result.\n", c);
1825                 }
1826              p = pt + 1;              p = pt + 1;
1827              break;              break;
1828              }              }
# Line 1852  while (!done) Line 1965  while (!done)
1965            if (offsets == NULL)            if (offsets == NULL)
1966              {              {
1967              printf("** Failed to get %d bytes of memory for offsets vector\n",              printf("** Failed to get %d bytes of memory for offsets vector\n",
1968                size_offsets_max * sizeof(int));                (int)(size_offsets_max * sizeof(int)));
1969              yield = 1;              yield = 1;
1970              goto EXIT;              goto EXIT;
1971              }              }
# Line 1919  while (!done) Line 2032  while (!done)
2032      *q = 0;      *q = 0;
2033      len = q - dbuffer;      len = q - dbuffer;
2034    
2035        /* Move the data to the end of the buffer so that a read over the end of
2036        the buffer will be seen by valgrind, even if it doesn't cause a crash. If
2037        we are using the POSIX interface, we must include the terminating zero. */
2038    
2039    #if !defined NOPOSIX
2040        if (posix || do_posix)
2041          {
2042          memmove(bptr + buffer_size - len - 1, bptr, len + 1);
2043          bptr += buffer_size - len - 1;
2044          }
2045        else
2046    #endif
2047          {
2048          memmove(bptr + buffer_size - len, bptr, len);
2049          bptr += buffer_size - len;
2050          }
2051    
2052      if ((all_use_dfa || use_dfa) && find_match_limit)      if ((all_use_dfa || use_dfa) && find_match_limit)
2053        {        {
2054        printf("**Match limit not relevant for DFA matching: ignored\n");        printf("**Match limit not relevant for DFA matching: ignored\n");
# Line 1938  while (!done) Line 2068  while (!done)
2068          pmatch = (regmatch_t *)malloc(sizeof(regmatch_t) * use_size_offsets);          pmatch = (regmatch_t *)malloc(sizeof(regmatch_t) * use_size_offsets);
2069        if ((options & PCRE_NOTBOL) != 0) eflags |= REG_NOTBOL;        if ((options & PCRE_NOTBOL) != 0) eflags |= REG_NOTBOL;
2070        if ((options & PCRE_NOTEOL) != 0) eflags |= REG_NOTEOL;        if ((options & PCRE_NOTEOL) != 0) eflags |= REG_NOTEOL;
2071          if ((options & PCRE_NOTEMPTY) != 0) eflags |= REG_NOTEMPTY;
2072    
2073        rc = regexec(&preg, (const char *)bptr, use_size_offsets, pmatch, eflags);        rc = regexec(&preg, (const char *)bptr, use_size_offsets, pmatch, eflags);
2074    

Legend:
Removed from v.150  
changed lines
  Added in v.388

webmaster@exim.org
ViewVC Help
Powered by ViewVC 1.1.12