| 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 |
|
|
| 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, |
| 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 |
| 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]; |
| 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; |
| 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 |
{ |
{ |
| 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); |
| 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 && |
| 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; |
| 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 |
|
|
| 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 |
|
|
| 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); |