/[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 578 by ph10, Tue Nov 16 17:51:37 2010 UTC revision 579 by ph10, Wed Nov 24 17:39:25 2010 UTC
# Line 256  static option_item optionlist[] = { Line 256  static option_item optionlist[] = {
256    hyphens in the option names. As this was not discovered for several releases,    hyphens in the option names. As this was not discovered for several releases,
257    the incorrect versions are left in the table for compatibility. However, the    the incorrect versions are left in the table for compatibility. However, the
258    --help function misses out any option that has an underscore in its name. */    --help function misses out any option that has an underscore in its name. */
259    
260    { OP_STRING,    N_EXCLUDE_DIR,&exclude_dir_pattern, "exclude_dir=pattern","exclude matching directories when recursing" },    { OP_STRING,    N_EXCLUDE_DIR,&exclude_dir_pattern, "exclude_dir=pattern","exclude matching directories when recursing" },
261    { OP_STRING,    N_INCLUDE_DIR,&include_dir_pattern, "include_dir=pattern","include matching directories when recursing" },    { OP_STRING,    N_INCLUDE_DIR,&include_dir_pattern, "include_dir=pattern","include matching directories when recursing" },
262    
# Line 956  if (slen > 200) Line 956  if (slen > 200)
956    {    {
957    slen = 200;    slen = 200;
958    msg = "text that starts:\n\n";    msg = "text that starts:\n\n";
959    }    }
960  for (i = 0; i < pattern_count; i++)  for (i = 0; i < pattern_count; i++)
961    {    {
962    *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,
# Line 1183  while (ptr < endptr) Line 1183  while (ptr < endptr)
1183    
1184      else if (quiet) return 0;      else if (quiet) return 0;
1185    
1186      /* The --only-matching option prints just the substring that matched, or a      /* The --only-matching option prints just the substring that matched, or a
1187      captured portion of it, as long as this string is not empty, and the      captured portion of it, as long as this string is not empty, and the
1188      --file-offsets and --line-offsets options output offsets for the matching      --file-offsets and --line-offsets options output offsets for the matching
1189      substring (they both force --only-matching = 0). None of these options      substring (they both force --only-matching = 0). None of these options
# Line 1202  while (ptr < endptr) Line 1202  while (ptr < endptr)
1202            fprintf(stdout, "%d,%d\n", (int)(matchptr + offsets[0] - ptr),            fprintf(stdout, "%d,%d\n", (int)(matchptr + offsets[0] - ptr),
1203              offsets[1] - offsets[0]);              offsets[1] - offsets[0]);
1204          else if (file_offsets)          else if (file_offsets)
1205            fprintf(stdout, "%d,%d\n",            fprintf(stdout, "%d,%d\n",
1206              (int)(filepos + matchptr + offsets[0] - ptr),              (int)(filepos + matchptr + offsets[0] - ptr),
1207              offsets[1] - offsets[0]);              offsets[1] - offsets[0]);
1208          else if (only_matching < mrc)          else if (only_matching < mrc)
1209            {            {
1210            int plen = offsets[2*only_matching + 1] - offsets[2*only_matching];            int plen = offsets[2*only_matching + 1] - offsets[2*only_matching];
1211            if (plen > 0)            if (plen > 0)
1212              {              {
1213              if (do_colour) fprintf(stdout, "%c[%sm", 0x1b, colour_string);              if (do_colour) fprintf(stdout, "%c[%sm", 0x1b, colour_string);
1214              FWRITE(matchptr + offsets[only_matching*2], 1, plen, stdout);              FWRITE(matchptr + offsets[only_matching*2], 1, plen, stdout);
1215              if (do_colour) fprintf(stdout, "%c[00m", 0x1b);              if (do_colour) fprintf(stdout, "%c[00m", 0x1b);
1216              fprintf(stdout, "\n");              fprintf(stdout, "\n");
1217              }              }
1218            }            }
1219          else if (printname != NULL || number) fprintf(stdout, "\n");          else if (printname != NULL || number) fprintf(stdout, "\n");
1220          matchptr += offsets[1];          matchptr += offsets[1];
# Line 1791  for (op = optionlist; op->one_char != 0; Line 1791  for (op = optionlist; op->one_char != 0;
1791    {    {
1792    int n;    int n;
1793    char s[4];    char s[4];
1794    
1795    /* Two options were accidentally implemented and documented with underscores    /* Two options were accidentally implemented and documented with underscores
1796    instead of hyphens in their names, something that was not noticed for quite a    instead of hyphens in their names, something that was not noticed for quite a
1797    few releases. When fixing this, I left the underscored versions in the list    few releases. When fixing this, I left the underscored versions in the list
1798    in case people were using them. However, we don't want to display them in the    in case people were using them. However, we don't want to display them in the
1799    help data. There are no other options that contain underscores, and we do not    help data. There are no other options that contain underscores, and we do not
1800    expect ever to implement such options. Therefore, just omit any option that    expect ever to implement such options. Therefore, just omit any option that
1801    contains an underscore. */    contains an underscore. */
1802    
1803    if (strchr(op->long_name, '_') != NULL) continue;    if (strchr(op->long_name, '_') != NULL) continue;
1804    
1805    if (op->one_char > 0) sprintf(s, "-%c,", op->one_char); else strcpy(s, "   ");    if (op->one_char > 0) sprintf(s, "-%c,", op->one_char); else strcpy(s, "   ");
1806    n = 31 - printf("  %s --%s", s, op->long_name);    n = 31 - printf("  %s --%s", s, op->long_name);
1807    if (n < 1) n = 1;    if (n < 1) n = 1;
# Line 2181  for (i = 1; i < argc; i++) Line 2181  for (i = 1; i < argc; i++)
2181      while (*s != 0)      while (*s != 0)
2182        {        {
2183        for (op = optionlist; op->one_char != 0; op++)        for (op = optionlist; op->one_char != 0; op++)
2184          {          {
2185          if (*s == op->one_char) break;          if (*s == op->one_char) break;
2186          }          }
2187        if (op->one_char == 0)        if (op->one_char == 0)
2188          {          {
# Line 2190  for (i = 1; i < argc; i++) Line 2190  for (i = 1; i < argc; i++)
2190            *s, argv[i]);            *s, argv[i]);
2191          pcregrep_exit(usage(2));          pcregrep_exit(usage(2));
2192          }          }
2193    
2194        /* Check for a single-character option that has data: OP_OP_NUMBER        /* Check for a single-character option that has data: OP_OP_NUMBER
2195        is used for one that either has a numerical number or defaults, i.e. the        is used for one that either has a numerical number or defaults, i.e. the
2196        data is optional. If a digit follows, there is data; if not, carry on        data is optional. If a digit follows, there is data; if not, carry on
2197        with other single-character options in the same string. */        with other single-character options in the same string. */
2198    
2199        option_data = s+1;        option_data = s+1;
2200        if (op->type == OP_OP_NUMBER)        if (op->type == OP_OP_NUMBER)
2201          {          {
2202          if (isdigit((unsigned char)s[1])) break;          if (isdigit((unsigned char)s[1])) break;
2203          }          }
2204        else   /* Check for end or a dataless option */        else   /* Check for end or a dataless option */
2205          {          {
2206          if (op->type != OP_NODATA || s[1] == 0) break;          if (op->type != OP_NODATA || s[1] == 0) break;
2207          }          }
2208    
2209        /* Handle a single-character option with no data, then loop for the        /* Handle a single-character option with no data, then loop for the
2210        next character in the string. */        next character in the string. */
2211    
2212        pcre_options = handle_option(*s++, pcre_options);        pcre_options = handle_option(*s++, pcre_options);
# Line 2225  for (i = 1; i < argc; i++) Line 2225  for (i = 1; i < argc; i++)
2225    
2226    /* If the option type is OP_OP_STRING or OP_OP_NUMBER, it's an option that    /* If the option type is OP_OP_STRING or OP_OP_NUMBER, it's an option that
2227    either has a value or defaults to something. It cannot have data in a    either has a value or defaults to something. It cannot have data in a
2228    separate item. At the moment, the only such options are "colo(u)r",    separate item. At the moment, the only such options are "colo(u)r",
2229    "only-matching", and Jeffrey Friedl's special -S debugging option. */    "only-matching", and Jeffrey Friedl's special -S debugging option. */
2230    
2231    if (*option_data == 0 &&    if (*option_data == 0 &&
# Line 2236  for (i = 1; i < argc; i++) Line 2236  for (i = 1; i < argc; i++)
2236        case N_COLOUR:        case N_COLOUR:
2237        colour_option = (char *)"auto";        colour_option = (char *)"auto";
2238        break;        break;
2239    
2240        case 'o':        case 'o':
2241        only_matching = 0;        only_matching = 0;
2242        break;        break;
2243    
2244  #ifdef JFRIEDL_DEBUG  #ifdef JFRIEDL_DEBUG
2245        case 'S':        case 'S':
2246        S_arg = 0;        S_arg = 0;
# Line 2540  for (j = 0; j < pattern_count; j++) Line 2540  for (j = 0; j < pattern_count; j++)
2540      }      }
2541    hint_count++;    hint_count++;
2542    }    }
2543    
2544  /* If --match-limit or --recursion-limit was set, put the value(s) into the  /* If --match-limit or --recursion-limit was set, put the value(s) into the
2545  pcre_extra block for each pattern. */  pcre_extra block for each pattern. */
2546    
# Line 2551  if (match_limit > 0 || match_limit_recur Line 2551  if (match_limit > 0 || match_limit_recur
2551      if (hints_list[j] == NULL)      if (hints_list[j] == NULL)
2552        {        {
2553        hints_list[j] = malloc(sizeof(pcre_extra));        hints_list[j] = malloc(sizeof(pcre_extra));
2554        if (hints_list[j] == NULL)        if (hints_list[j] == NULL)
2555          {          {
2556          fprintf(stderr, "pcregrep: malloc failed\n");          fprintf(stderr, "pcregrep: malloc failed\n");
2557          pcregrep_exit(2);          pcregrep_exit(2);
2558          }          }
2559        }        }
2560      if (match_limit > 0)      if (match_limit > 0)
2561        {        {
2562        hints_list[j]->flags |= PCRE_EXTRA_MATCH_LIMIT;        hints_list[j]->flags |= PCRE_EXTRA_MATCH_LIMIT;
2563        hints_list[j]->match_limit = match_limit;        hints_list[j]->match_limit = match_limit;
2564        }        }
2565      if (match_limit_recursion > 0)      if (match_limit_recursion > 0)
2566        {        {
2567        hints_list[j]->flags |= PCRE_EXTRA_MATCH_LIMIT_RECURSION;        hints_list[j]->flags |= PCRE_EXTRA_MATCH_LIMIT_RECURSION;
2568        hints_list[j]->match_limit_recursion = match_limit_recursion;        hints_list[j]->match_limit_recursion = match_limit_recursion;
2569        }        }
2570      }      }
2571    }    }
2572    
2573  /* If there are include or exclude patterns, compile them. */  /* If there are include or exclude patterns, compile them. */
2574    
# Line 2651  if (pattern_list != NULL) Line 2651  if (pattern_list != NULL)
2651    }    }
2652  if (hints_list != NULL)  if (hints_list != NULL)
2653    {    {
2654    for (i = 0; i < hint_count; i++)    for (i = 0; i < hint_count; i++)
2655      {      {
2656      if (hints_list[i] != NULL) free(hints_list[i]);      if (hints_list[i] != NULL) free(hints_list[i]);
2657      }      }
2658    free(hints_list);    free(hints_list);
2659    }    }
2660  pcregrep_exit(rc);  pcregrep_exit(rc);

Legend:
Removed from v.578  
changed lines
  Added in v.579

  ViewVC Help
Powered by ViewVC 1.1.5