139 |
|
|
140 |
static char *include_pattern = NULL; |
static char *include_pattern = NULL; |
141 |
static char *exclude_pattern = NULL; |
static char *exclude_pattern = NULL; |
142 |
|
static char *include_dir_pattern = NULL; |
143 |
|
static char *exclude_dir_pattern = NULL; |
144 |
|
|
145 |
static pcre *include_compiled = NULL; |
static pcre *include_compiled = NULL; |
146 |
static pcre *exclude_compiled = NULL; |
static pcre *exclude_compiled = NULL; |
147 |
|
static pcre *include_dir_compiled = NULL; |
148 |
|
static pcre *exclude_dir_compiled = NULL; |
149 |
|
|
150 |
static int after_context = 0; |
static int after_context = 0; |
151 |
static int before_context = 0; |
static int before_context = 0; |
185 |
/* Options without a single-letter equivalent get a negative value. This can be |
/* Options without a single-letter equivalent get a negative value. This can be |
186 |
used to identify them. */ |
used to identify them. */ |
187 |
|
|
188 |
#define N_COLOUR (-1) |
#define N_COLOUR (-1) |
189 |
#define N_EXCLUDE (-2) |
#define N_EXCLUDE (-2) |
190 |
#define N_HELP (-3) |
#define N_EXCLUDE_DIR (-3) |
191 |
#define N_INCLUDE (-4) |
#define N_HELP (-4) |
192 |
#define N_LABEL (-5) |
#define N_INCLUDE (-5) |
193 |
#define N_LOCALE (-6) |
#define N_INCLUDE_DIR (-6) |
194 |
#define N_NULL (-7) |
#define N_LABEL (-7) |
195 |
#define N_LOFFSETS (-8) |
#define N_LOCALE (-8) |
196 |
#define N_FOFFSETS (-9) |
#define N_NULL (-9) |
197 |
|
#define N_LOFFSETS (-10) |
198 |
|
#define N_FOFFSETS (-11) |
199 |
|
|
200 |
static option_item optionlist[] = { |
static option_item optionlist[] = { |
201 |
{ OP_NODATA, N_NULL, NULL, "", " terminate options" }, |
{ OP_NODATA, N_NULL, NULL, "", " terminate options" }, |
228 |
{ OP_NODATA, 'r', NULL, "recursive", "recursively scan sub-directories" }, |
{ OP_NODATA, 'r', NULL, "recursive", "recursively scan sub-directories" }, |
229 |
{ OP_STRING, N_EXCLUDE,&exclude_pattern, "exclude=pattern","exclude matching files when recursing" }, |
{ OP_STRING, N_EXCLUDE,&exclude_pattern, "exclude=pattern","exclude matching files when recursing" }, |
230 |
{ OP_STRING, N_INCLUDE,&include_pattern, "include=pattern","include matching files when recursing" }, |
{ OP_STRING, N_INCLUDE,&include_pattern, "include=pattern","include matching files when recursing" }, |
231 |
|
{ OP_STRING, N_EXCLUDE_DIR,&exclude_dir_pattern, "exclude_dir=pattern","exclude matching directories when recursing" }, |
232 |
|
{ OP_STRING, N_INCLUDE_DIR,&include_dir_pattern, "include_dir=pattern","include matching directories when recursing" }, |
233 |
#ifdef JFRIEDL_DEBUG |
#ifdef JFRIEDL_DEBUG |
234 |
{ OP_OP_NUMBER, 'S', &S_arg, "jeffS", "replace matched (sub)string with X" }, |
{ OP_OP_NUMBER, 'S', &S_arg, "jeffS", "replace matched (sub)string with X" }, |
235 |
#endif |
#endif |
1369 |
} |
} |
1370 |
|
|
1371 |
/* If the file is a directory, skip if skipping or if we are recursing, scan |
/* If the file is a directory, skip if skipping or if we are recursing, scan |
1372 |
each file within it, subject to any include or exclude patterns that were set. |
each file and directory within it, subject to any include or exclude patterns |
1373 |
The scanning code is localized so it can be made system-specific. */ |
that were set. The scanning code is localized so it can be made |
1374 |
|
system-specific. */ |
1375 |
|
|
1376 |
if ((sep = isdirectory(pathname)) != 0) |
if ((sep = isdirectory(pathname)) != 0) |
1377 |
{ |
{ |
1396 |
sprintf(buffer, "%.512s%c%.128s", pathname, sep, nextfile); |
sprintf(buffer, "%.512s%c%.128s", pathname, sep, nextfile); |
1397 |
nflen = strlen(nextfile); |
nflen = strlen(nextfile); |
1398 |
|
|
1399 |
if (!isdirectory(buffer)) |
if (isdirectory(buffer)) |
1400 |
|
{ |
1401 |
|
if (exclude_dir_compiled != NULL && |
1402 |
|
pcre_exec(exclude_dir_compiled, NULL, nextfile, nflen, 0, 0, NULL, 0) >= 0) |
1403 |
|
continue; |
1404 |
|
|
1405 |
|
if (include_dir_compiled != NULL && |
1406 |
|
pcre_exec(include_dir_compiled, NULL, nextfile, nflen, 0, 0, NULL, 0) < 0) |
1407 |
|
continue; |
1408 |
|
} |
1409 |
|
else |
1410 |
{ |
{ |
1411 |
if (exclude_compiled != NULL && |
if (exclude_compiled != NULL && |
1412 |
pcre_exec(exclude_compiled, NULL, nextfile, nflen, 0, 0, NULL, 0) >= 0) |
pcre_exec(exclude_compiled, NULL, nextfile, nflen, 0, 0, NULL, 0) >= 0) |
2309 |
errptr, error); |
errptr, error); |
2310 |
goto EXIT2; |
goto EXIT2; |
2311 |
} |
} |
2312 |
|
} |
2313 |
|
|
2314 |
|
if (exclude_dir_pattern != NULL) |
2315 |
|
{ |
2316 |
|
exclude_dir_compiled = pcre_compile(exclude_dir_pattern, 0, &error, &errptr, |
2317 |
|
pcretables); |
2318 |
|
if (exclude_dir_compiled == NULL) |
2319 |
|
{ |
2320 |
|
fprintf(stderr, "pcregrep: Error in 'exclude_dir' regex at offset %d: %s\n", |
2321 |
|
errptr, error); |
2322 |
|
goto EXIT2; |
2323 |
|
} |
2324 |
|
} |
2325 |
|
|
2326 |
|
if (include_dir_pattern != NULL) |
2327 |
|
{ |
2328 |
|
include_dir_compiled = pcre_compile(include_dir_pattern, 0, &error, &errptr, |
2329 |
|
pcretables); |
2330 |
|
if (include_dir_compiled == NULL) |
2331 |
|
{ |
2332 |
|
fprintf(stderr, "pcregrep: Error in 'include_dir' regex at offset %d: %s\n", |
2333 |
|
errptr, error); |
2334 |
|
goto EXIT2; |
2335 |
|
} |
2336 |
} |
} |
2337 |
|
|
2338 |
/* If there are no further arguments, do the business on stdin and exit. */ |
/* If there are no further arguments, do the business on stdin and exit. */ |