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

Diff of /code/trunk/pcregrep.c

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

revision 530 by ph10, Tue Jun 1 13:42:06 2010 UTC revision 564 by ph10, Sun Oct 31 16:07:24 2010 UTC
# Line 104  enum { DEE_READ, DEE_SKIP }; Line 104  enum { DEE_READ, DEE_SKIP };
104    
105  enum { EL_LF, EL_CR, EL_CRLF, EL_ANY, EL_ANYCRLF };  enum { EL_LF, EL_CR, EL_CRLF, EL_ANY, EL_ANYCRLF };
106    
107  /* In newer versions of gcc, with FORTIFY_SOURCE set (the default in some  /* In newer versions of gcc, with FORTIFY_SOURCE set (the default in some
108  environments), a warning is issued if the value of fwrite() is ignored.  environments), a warning is issued if the value of fwrite() is ignored.
109  Unfortunately, casting to (void) does not suppress the warning. To get round  Unfortunately, casting to (void) does not suppress the warning. To get round
110  this, we use a macro that compiles a fudge. Oddly, this does not also seem to  this, we use a macro that compiles a fudge. Oddly, this does not also seem to
111  apply to fprintf(). */  apply to fprintf(). */
112    
113  #define FWRITE(a,b,c,d) if (fwrite(a,b,c,d)) {}  #define FWRITE(a,b,c,d) if (fwrite(a,b,c,d)) {}
# Line 165  static int error_count = 0; Line 165  static int error_count = 0;
165  static int filenames = FN_DEFAULT;  static int filenames = FN_DEFAULT;
166  static int process_options = 0;  static int process_options = 0;
167    
168    static unsigned long int match_limit = 0;
169    static unsigned long int match_limit_recursion = 0;
170    
171  static BOOL count_only = FALSE;  static BOOL count_only = FALSE;
172  static BOOL do_colour = FALSE;  static BOOL do_colour = FALSE;
173  static BOOL file_offsets = FALSE;  static BOOL file_offsets = FALSE;
# Line 176  static BOOL multiline = FALSE; Line 179  static BOOL multiline = FALSE;
179  static BOOL number = FALSE;  static BOOL number = FALSE;
180  static BOOL omit_zero_count = FALSE;  static BOOL omit_zero_count = FALSE;
181  static BOOL only_matching = FALSE;  static BOOL only_matching = FALSE;
182    static BOOL resource_error = FALSE;
183  static BOOL quiet = FALSE;  static BOOL quiet = FALSE;
184  static BOOL silent = FALSE;  static BOOL silent = FALSE;
185  static BOOL utf8 = FALSE;  static BOOL utf8 = FALSE;
# Line 208  used to identify them. */ Line 212  used to identify them. */
212  #define N_LOFFSETS     (-10)  #define N_LOFFSETS     (-10)
213  #define N_FOFFSETS     (-11)  #define N_FOFFSETS     (-11)
214  #define N_LBUFFER      (-12)  #define N_LBUFFER      (-12)
215    #define N_M_LIMIT      (-13)
216    #define N_M_LIMIT_REC  (-14)
217    
218  static option_item optionlist[] = {  static option_item optionlist[] = {
219    { OP_NODATA,    N_NULL,   NULL,              "",              "  terminate options" },    { OP_NODATA,    N_NULL,   NULL,              "",              "  terminate options" },
# Line 215  static option_item optionlist[] = { Line 221  static option_item optionlist[] = {
221    { OP_NUMBER,    'A',      &after_context,    "after-context=number", "set number of following context lines" },    { OP_NUMBER,    'A',      &after_context,    "after-context=number", "set number of following context lines" },
222    { OP_NUMBER,    'B',      &before_context,   "before-context=number", "set number of prior context lines" },    { OP_NUMBER,    'B',      &before_context,   "before-context=number", "set number of prior context lines" },
223    { OP_OP_STRING, N_COLOUR, &colour_option,    "color=option",  "matched text color option" },    { OP_OP_STRING, N_COLOUR, &colour_option,    "color=option",  "matched text color option" },
224      { OP_OP_STRING, N_COLOUR, &colour_option,    "colour=option", "matched text colour option" },
225    { OP_NUMBER,    'C',      &both_context,     "context=number", "set number of context lines, before & after" },    { OP_NUMBER,    'C',      &both_context,     "context=number", "set number of context lines, before & after" },
226    { OP_NODATA,    'c',      NULL,              "count",         "print only a count of matching lines per FILE" },    { OP_NODATA,    'c',      NULL,              "count",         "print only a count of matching lines per FILE" },
   { OP_OP_STRING, N_COLOUR, &colour_option,    "colour=option", "matched text colour option" },  
227    { OP_STRING,    'D',      &DEE_option,       "devices=action","how to handle devices, FIFOs, and sockets" },    { OP_STRING,    'D',      &DEE_option,       "devices=action","how to handle devices, FIFOs, and sockets" },
228    { OP_STRING,    'd',      &dee_option,       "directories=action", "how to handle directories" },    { OP_STRING,    'd',      &dee_option,       "directories=action", "how to handle directories" },
229    { OP_PATLIST,   'e',      NULL,              "regex(p)=pattern", "specify pattern (may be used more than once)" },    { OP_PATLIST,   'e',      NULL,              "regex(p)=pattern", "specify pattern (may be used more than once)" },
# Line 233  static option_item optionlist[] = { Line 239  static option_item optionlist[] = {
239    { OP_NODATA,    N_LBUFFER, NULL,             "line-buffered", "use line buffering" },    { OP_NODATA,    N_LBUFFER, NULL,             "line-buffered", "use line buffering" },
240    { OP_NODATA,    N_LOFFSETS, NULL,            "line-offsets",  "output line numbers and offsets, not text" },    { OP_NODATA,    N_LOFFSETS, NULL,            "line-offsets",  "output line numbers and offsets, not text" },
241    { OP_STRING,    N_LOCALE, &locale,           "locale=locale", "use the named locale" },    { OP_STRING,    N_LOCALE, &locale,           "locale=locale", "use the named locale" },
242      { OP_NUMBER,    N_M_LIMIT,&match_limit,      "match-limit=number", "set PCRE match limit option" },
243      { OP_NUMBER,    N_M_LIMIT_REC,&match_limit_recursion, "recursion-limit=number", "set PCRE match recursion limit option" },
244    { OP_NODATA,    'M',      NULL,              "multiline",     "run in multiline mode" },    { OP_NODATA,    'M',      NULL,              "multiline",     "run in multiline mode" },
245    { OP_STRING,    'N',      &newline,          "newline=type",  "set newline type (CR, LF, CRLF, ANYCRLF or ANY)" },    { OP_STRING,    'N',      &newline,          "newline=type",  "set newline type (CR, LF, CRLF, ANYCRLF or ANY)" },
246    { OP_NODATA,    'n',      NULL,              "line-number",   "print line number with output lines" },    { OP_NODATA,    'n',      NULL,              "line-number",   "print line number with output lines" },
# Line 363  return isatty(fileno(f)); Line 371  return isatty(fileno(f));
371  Lionel Fourquaux. David Burgess added a patch to define INVALID_FILE_ATTRIBUTES  Lionel Fourquaux. David Burgess added a patch to define INVALID_FILE_ATTRIBUTES
372  when it did not exist. David Byron added a patch that moved the #include of  when it did not exist. David Byron added a patch that moved the #include of
373  <windows.h> to before the INVALID_FILE_ATTRIBUTES definition rather than after.  <windows.h> to before the INVALID_FILE_ATTRIBUTES definition rather than after.
374  */  The double test below stops gcc 4.4.4 grumbling that HAVE_WINDOWS_H is
375    undefined when it is indeed undefined. */
376    
377  #elif HAVE_WINDOWS_H  #elif defined HAVE_WINDOWS_H && HAVE_WINDOWS_H
378    
379  #ifndef STRICT  #ifndef STRICT
380  # define STRICT  # define STRICT
# Line 409  dir = (directory_type *) malloc(sizeof(* Line 418  dir = (directory_type *) malloc(sizeof(*
418  if ((pattern == NULL) || (dir == NULL))  if ((pattern == NULL) || (dir == NULL))
419    {    {
420    fprintf(stderr, "pcregrep: malloc failed\n");    fprintf(stderr, "pcregrep: malloc failed\n");
421    exit(2);    pcregrep_exit(2);
422    }    }
423  memcpy(pattern, filename, len);  memcpy(pattern, filename, len);
424  memcpy(&(pattern[len]), "\\*", 3);  memcpy(&(pattern[len]), "\\*", 3);
# Line 547  return sys_errlist[n]; Line 556  return sys_errlist[n];
556    
557    
558  /*************************************************  /*************************************************
559    *         Exit from the program                  *
560    *************************************************/
561    
562    /* If there has been a resource error, give a suitable message.
563    
564    Argument:  the return code
565    Returns:   does not return
566    */
567    
568    static void
569    pcregrep_exit(int rc)
570    {
571    if (resource_error)
572      {
573      fprintf(stderr, "pcregrep: Error %d or %d means that a resource limit "
574        "was exceeded.\n", PCRE_ERROR_MATCHLIMIT, PCRE_ERROR_RECURSIONLIMIT);
575      fprintf(stderr, "pcregrep: Check your regex for nested unlimited loops.\n");
576      }
577    
578    exit(rc);
579    }
580    
581    
582    
583    /*************************************************
584  *            Read one line of input              *  *            Read one line of input              *
585  *************************************************/  *************************************************/
586    
587  /* Normally, input is read using fread() into a large buffer, so many lines may  /* Normally, input is read using fread() into a large buffer, so many lines may
588  be read at once. However, doing this for tty input means that no output appears  be read at once. However, doing this for tty input means that no output appears
589  until a lot of input has been typed. Instead, tty input is handled line by  until a lot of input has been typed. Instead, tty input is handled line by
590  line. We cannot use fgets() for this, because it does not stop at a binary  line. We cannot use fgets() for this, because it does not stop at a binary
591  zero, and therefore there is no way of telling how many characters it has read,  zero, and therefore there is no way of telling how many characters it has read,
592  because there may be binary zeros embedded in the data.  because there may be binary zeros embedded in the data.
593    
594  Arguments:  Arguments:
595    buffer     the buffer to read into    buffer     the buffer to read into
596    length     the maximum number of characters to read    length     the maximum number of characters to read
597    f          the file    f          the file
598    
599  Returns:     the number of characters read, zero at end of file  Returns:     the number of characters read, zero at end of file
600  */  */
601    
602  static int  static int
603  read_one_line(char *buffer, int length, FILE *f)  read_one_line(char *buffer, int length, FILE *f)
# Line 573  int yield = 0; Line 607  int yield = 0;
607  while ((c = fgetc(f)) != EOF)  while ((c = fgetc(f)) != EOF)
608    {    {
609    buffer[yield++] = c;    buffer[yield++] = c;
610    if (c == '\n' || yield >= length) break;    if (c == '\n' || yield >= length) break;
611    }    }
612  return yield;  return yield;
613  }  }
614    
615    
# Line 907  static BOOL Line 941  static BOOL
941  match_patterns(char *matchptr, size_t length, int *offsets, int *mrc)  match_patterns(char *matchptr, size_t length, int *offsets, int *mrc)
942  {  {
943  int i;  int i;
944    size_t slen = length;
945    const char *msg = "this text:\n\n";
946    if (slen > 200)
947      {
948      slen = 200;
949      msg = "text that starts:\n\n";
950      }
951  for (i = 0; i < pattern_count; i++)  for (i = 0; i < pattern_count; i++)
952    {    {
953    *mrc = pcre_exec(pattern_list[i], hints_list[i], matchptr, (int)length, 0,    *mrc = pcre_exec(pattern_list[i], hints_list[i], matchptr, (int)length, 0,
954      PCRE_NOTEMPTY, offsets, OFFSET_SIZE);      PCRE_NOTEMPTY, offsets, OFFSET_SIZE);
955    if (*mrc >= 0) return TRUE;    if (*mrc >= 0) return TRUE;
956    if (*mrc == PCRE_ERROR_NOMATCH) continue;    if (*mrc == PCRE_ERROR_NOMATCH) continue;
957    fprintf(stderr, "pcregrep: pcre_exec() error %d while matching ", *mrc);    fprintf(stderr, "pcregrep: pcre_exec() gave error %d while matching ", *mrc);
958    if (pattern_count > 1) fprintf(stderr, "pattern number %d to ", i+1);    if (pattern_count > 1) fprintf(stderr, "pattern number %d to ", i+1);
959    fprintf(stderr, "this text:\n");    fprintf(stderr, "%s", msg);
960    FWRITE(matchptr, 1, length, stderr);   /* In case binary zero included */    FWRITE(matchptr, 1, slen, stderr);   /* In case binary zero included */
961    fprintf(stderr, "\n");    fprintf(stderr, "\n\n");
962    if (error_count == 0 &&    if (*mrc == PCRE_ERROR_MATCHLIMIT || *mrc == PCRE_ERROR_RECURSIONLIMIT)
963        (*mrc == PCRE_ERROR_MATCHLIMIT || *mrc == PCRE_ERROR_RECURSIONLIMIT))      resource_error = TRUE;
     {  
     fprintf(stderr, "pcregrep: error %d means that a resource limit "  
       "was exceeded\n", *mrc);  
     fprintf(stderr, "pcregrep: check your regex for nested unlimited loops\n");  
     }  
964    if (error_count++ > 20)    if (error_count++ > 20)
965      {      {
966      fprintf(stderr, "pcregrep: too many errors - abandoned\n");      fprintf(stderr, "pcregrep: Too many errors - abandoned.\n");
967      exit(2);      pcregrep_exit(2);
968      }      }
969    return invert;    /* No more matching; don't show the line again */    return invert;    /* No more matching; don't show the line again */
970    }    }
# Line 1017  else Line 1053  else
1053    {    {
1054    in = (FILE *)handle;    in = (FILE *)handle;
1055    if (is_file_tty(in)) input_line_buffered = TRUE;    if (is_file_tty(in)) input_line_buffered = TRUE;
1056    bufflength = input_line_buffered?    bufflength = input_line_buffered?
1057      read_one_line(buffer, 3*MBUFTHIRD, in) :      read_one_line(buffer, 3*MBUFTHIRD, in) :
1058      fread(buffer, 1, 3*MBUFTHIRD, in);      fread(buffer, 1, 3*MBUFTHIRD, in);
1059    }    }
1060    
1061  endptr = buffer + bufflength;  endptr = buffer + bufflength;
1062    
1063  /* Loop while the current pointer is not at the end of the file. For large  /* Loop while the current pointer is not at the end of the file. For large
# Line 1068  while (ptr < endptr) Line 1104  while (ptr < endptr)
1104            ptr = malloc(newlen + 1);            ptr = malloc(newlen + 1);
1105            if (!ptr) {            if (!ptr) {
1106                    printf("out of memory");                    printf("out of memory");
1107                    exit(2);                    pcregrep_exit(2);
1108            }            }
1109            endptr = ptr;            endptr = ptr;
1110            strcpy(endptr, jfriedl_prefix); endptr += strlen(jfriedl_prefix);            strcpy(endptr, jfriedl_prefix); endptr += strlen(jfriedl_prefix);
# Line 1168  while (ptr < endptr) Line 1204  while (ptr < endptr)
1204          matchptr += offsets[1];          matchptr += offsets[1];
1205          length -= offsets[1];          length -= offsets[1];
1206          match = FALSE;          match = FALSE;
1207            if (line_buffered) fflush(stdout);
1208            rc = 0;    /* Had some success */
1209          goto ONLY_MATCHING_RESTART;          goto ONLY_MATCHING_RESTART;
1210          }          }
1211        }        }
# Line 1321  while (ptr < endptr) Line 1359  while (ptr < endptr)
1359            FWRITE(matchptr + offsets[0], 1, offsets[1] - offsets[0], stdout);            FWRITE(matchptr + offsets[0], 1, offsets[1] - offsets[0], stdout);
1360            fprintf(stdout, "%c[00m", 0x1b);            fprintf(stdout, "%c[00m", 0x1b);
1361            }            }
1362          FWRITE(ptr + last_offset, 1,          FWRITE(ptr + last_offset, 1,
1363            (linelength + endlinelength) - last_offset, stdout);            (linelength + endlinelength) - last_offset, stdout);
1364          }          }
1365    
# Line 1367  while (ptr < endptr) Line 1405  while (ptr < endptr)
1405    ptr += linelength + endlinelength;    ptr += linelength + endlinelength;
1406    filepos += (int)(linelength + endlinelength);    filepos += (int)(linelength + endlinelength);
1407    linenumber++;    linenumber++;
1408    
1409    /* If input is line buffered, and the buffer is not yet full, read another    /* If input is line buffered, and the buffer is not yet full, read another
1410    line and add it into the buffer. */    line and add it into the buffer. */
1411    
1412    if (input_line_buffered && bufflength < sizeof(buffer))    if (input_line_buffered && bufflength < sizeof(buffer))
1413      {      {
1414      int add = read_one_line(ptr, sizeof(buffer) - (ptr - buffer), in);      int add = read_one_line(ptr, sizeof(buffer) - (ptr - buffer), in);
1415      bufflength += add;      bufflength += add;
1416      endptr += add;      endptr += add;
1417      }      }
1418    
1419    /* If we haven't yet reached the end of the file (the buffer is full), and    /* If we haven't yet reached the end of the file (the buffer is full), and
1420    the current point is in the top 1/3 of the buffer, slide the buffer down by    the current point is in the top 1/3 of the buffer, slide the buffer down by
# Line 1412  while (ptr < endptr) Line 1450  while (ptr < endptr)
1450      else      else
1451  #endif  #endif
1452    
1453      bufflength = 2*MBUFTHIRD +      bufflength = 2*MBUFTHIRD +
1454        (input_line_buffered?        (input_line_buffered?
1455         read_one_line(buffer + 2*MBUFTHIRD, MBUFTHIRD, in) :         read_one_line(buffer + 2*MBUFTHIRD, MBUFTHIRD, in) :
1456         fread(buffer + 2*MBUFTHIRD, 1, MBUFTHIRD, in));         fread(buffer + 2*MBUFTHIRD, 1, MBUFTHIRD, in));
1457      endptr = buffer + bufflength;      endptr = buffer + bufflength;
1458    
# Line 1764  handle_option(int letter, int options) Line 1802  handle_option(int letter, int options)
1802  switch(letter)  switch(letter)
1803    {    {
1804    case N_FOFFSETS: file_offsets = TRUE; break;    case N_FOFFSETS: file_offsets = TRUE; break;
1805    case N_HELP: help(); exit(0);    case N_HELP: help(); pcregrep_exit(0);
1806    case N_LOFFSETS: line_offsets = number = TRUE; break;    case N_LOFFSETS: line_offsets = number = TRUE; break;
1807    case N_LBUFFER: line_buffered = TRUE; break;    case N_LBUFFER: line_buffered = TRUE; break;
1808    case 'c': count_only = TRUE; break;    case 'c': count_only = TRUE; break;
1809    case 'F': process_options |= PO_FIXED_STRINGS; break;    case 'F': process_options |= PO_FIXED_STRINGS; break;
1810    case 'H': filenames = FN_FORCE; break;    case 'H': filenames = FN_FORCE; break;
# Line 1787  switch(letter) Line 1825  switch(letter)
1825    
1826    case 'V':    case 'V':
1827    fprintf(stderr, "pcregrep version %s\n", pcre_version());    fprintf(stderr, "pcregrep version %s\n", pcre_version());
1828    exit(0);    pcregrep_exit(0);
1829    break;    break;
1830    
1831    default:    default:
1832    fprintf(stderr, "pcregrep: Unknown option -%c\n", letter);    fprintf(stderr, "pcregrep: Unknown option -%c\n", letter);
1833    exit(usage(2));    pcregrep_exit(usage(2));
1834    }    }
1835    
1836  return options;  return options;
# Line 1988  for (i = 1; i < argc; i++) Line 2026  for (i = 1; i < argc; i++)
2026    if (argv[i][1] == 0)    if (argv[i][1] == 0)
2027      {      {
2028      if (pattern_filename != NULL || pattern_count > 0) break;      if (pattern_filename != NULL || pattern_count > 0) break;
2029        else exit(usage(2));        else pcregrep_exit(usage(2));
2030      }      }
2031    
2032    /* Handle a long name option, or -- to terminate the options */    /* Handle a long name option, or -- to terminate the options */
# Line 2029  for (i = 1; i < argc; i++) Line 2067  for (i = 1; i < argc; i++)
2067          else                 /* Special case xxx=data */          else                 /* Special case xxx=data */
2068            {            {
2069            int oplen = (int)(equals - op->long_name);            int oplen = (int)(equals - op->long_name);
2070            int arglen = (argequals == NULL)?            int arglen = (argequals == NULL)?
2071              (int)strlen(arg) : (int)(argequals - arg);              (int)strlen(arg) : (int)(argequals - arg);
2072            if (oplen == arglen && strncmp(arg, op->long_name, oplen) == 0)            if (oplen == arglen && strncmp(arg, op->long_name, oplen) == 0)
2073              {              {
# Line 2079  for (i = 1; i < argc; i++) Line 2117  for (i = 1; i < argc; i++)
2117      if (op->one_char == 0)      if (op->one_char == 0)
2118        {        {
2119        fprintf(stderr, "pcregrep: Unknown option %s\n", argv[i]);        fprintf(stderr, "pcregrep: Unknown option %s\n", argv[i]);
2120        exit(usage(2));        pcregrep_exit(usage(2));
2121        }        }
2122      }      }
2123    
# Line 2121  for (i = 1; i < argc; i++) Line 2159  for (i = 1; i < argc; i++)
2159          {          {
2160          fprintf(stderr, "pcregrep: Unknown option letter '%c' in \"%s\"\n",          fprintf(stderr, "pcregrep: Unknown option letter '%c' in \"%s\"\n",
2161            *s, argv[i]);            *s, argv[i]);
2162          exit(usage(2));          pcregrep_exit(usage(2));
2163          }          }
2164        if (op->type != OP_NODATA || s[1] == 0)        if (op->type != OP_NODATA || s[1] == 0)
2165          {          {
# Line 2171  for (i = 1; i < argc; i++) Line 2209  for (i = 1; i < argc; i++)
2209      if (i >= argc - 1 || longopwasequals)      if (i >= argc - 1 || longopwasequals)
2210        {        {
2211        fprintf(stderr, "pcregrep: Data missing after %s\n", argv[i]);        fprintf(stderr, "pcregrep: Data missing after %s\n", argv[i]);
2212        exit(usage(2));        pcregrep_exit(usage(2));
2213        }        }
2214      option_data = argv[++i];      option_data = argv[++i];
2215      }      }
# Line 2196  for (i = 1; i < argc; i++) Line 2234  for (i = 1; i < argc; i++)
2234      {      {
2235      *((char **)op->dataptr) = option_data;      *((char **)op->dataptr) = option_data;
2236      }      }
2237    
2238      /* Avoid the use of strtoul() because SunOS4 doesn't have it. This is used
2239      only for unpicking arguments, so just keep it simple. */
2240    
2241    else    else
2242      {      {
2243      char *endptr;      unsigned long int n = 0;
2244      int n = strtoul(option_data, &endptr, 10);      char *endptr = option_data;
2245        while (*endptr != 0 && isspace((unsigned char)(*endptr))) endptr++;
2246        while (isdigit((unsigned char)(*endptr)))
2247          n = n * 10 + (int)(*endptr++ - '0');
2248      if (*endptr != 0)      if (*endptr != 0)
2249        {        {
2250        if (longop)        if (longop)
# Line 2213  for (i = 1; i < argc; i++) Line 2258  for (i = 1; i < argc; i++)
2258        else        else
2259          fprintf(stderr, "pcregrep: Malformed number \"%s\" after -%c\n",          fprintf(stderr, "pcregrep: Malformed number \"%s\" after -%c\n",
2260            option_data, op->one_char);            option_data, op->one_char);
2261        exit(usage(2));        pcregrep_exit(usage(2));
2262        }        }
2263      *((int *)op->dataptr) = n;      *((int *)op->dataptr) = n;
2264      }      }
# Line 2236  if ((only_matching && (file_offsets || l Line 2281  if ((only_matching && (file_offsets || l
2281    {    {
2282    fprintf(stderr, "pcregrep: Cannot mix --only-matching, --file-offsets "    fprintf(stderr, "pcregrep: Cannot mix --only-matching, --file-offsets "
2283      "and/or --line-offsets\n");      "and/or --line-offsets\n");
2284    exit(usage(2));    pcregrep_exit(usage(2));
2285    }    }
2286    
2287  if (file_offsets || line_offsets) only_matching = TRUE;  if (file_offsets || line_offsets) only_matching = TRUE;
# Line 2289  if (colour_option != NULL && strcmp(colo Line 2334  if (colour_option != NULL && strcmp(colo
2334      if (cs != NULL) colour_string = cs;      if (cs != NULL) colour_string = cs;
2335      }      }
2336    }    }
2337    
2338  /* Interpret the newline type; the default settings are Unix-like. */  /* Interpret the newline type; the default settings are Unix-like. */
2339    
2340  if (strcmp(newline, "cr") == 0 || strcmp(newline, "CR") == 0)  if (strcmp(newline, "cr") == 0 || strcmp(newline, "CR") == 0)
# Line 2447  for (j = 0; j < pattern_count; j++) Line 2492  for (j = 0; j < pattern_count; j++)
2492      }      }
2493    hint_count++;    hint_count++;
2494    }    }
2495    
2496    /* If --match-limit or --recursion-limit was set, put the value(s) into the
2497    pcre_extra block for each pattern. */
2498    
2499    if (match_limit > 0 || match_limit_recursion > 0)
2500      {
2501      for (j = 0; j < pattern_count; j++)
2502        {
2503        if (hints_list[j] == NULL)
2504          {
2505          hints_list[j] = malloc(sizeof(pcre_extra));
2506          if (hints_list[j] == NULL)
2507            {
2508            fprintf(stderr, "pcregrep: malloc failed\n");
2509            pcregrep_exit(2);
2510            }
2511          }
2512        if (match_limit > 0)
2513          {
2514          hints_list[j]->flags |= PCRE_EXTRA_MATCH_LIMIT;
2515          hints_list[j]->match_limit = match_limit;
2516          }
2517        if (match_limit_recursion > 0)
2518          {
2519          hints_list[j]->flags |= PCRE_EXTRA_MATCH_LIMIT_RECURSION;
2520          hints_list[j]->match_limit_recursion = match_limit_recursion;
2521          }
2522        }
2523      }
2524    
2525  /* If there are include or exclude patterns, compile them. */  /* If there are include or exclude patterns, compile them. */
2526    
# Line 2529  if (pattern_list != NULL) Line 2603  if (pattern_list != NULL)
2603    }    }
2604  if (hints_list != NULL)  if (hints_list != NULL)
2605    {    {
2606    for (i = 0; i < hint_count; i++) free(hints_list[i]);    for (i = 0; i < hint_count; i++)
2607        {
2608        if (hints_list[i] != NULL) free(hints_list[i]);
2609        }
2610    free(hints_list);    free(hints_list);
2611    }    }
2612  return rc;  pcregrep_exit(rc);
2613    
2614  EXIT2:  EXIT2:
2615  rc = 2;  rc = 2;

Legend:
Removed from v.530  
changed lines
  Added in v.564

  ViewVC Help
Powered by ViewVC 1.1.5