diff options
-rw-r--r-- | ChangeLog | 5 | ||||
-rw-r--r-- | pcregrep.c | 133 |
2 files changed, 118 insertions, 20 deletions
@@ -60,10 +60,13 @@ Version 8.34 xx-xxxx-201x 11. Change 40 for 8.33 (allowing pcregrep to find empty strings) showed up a bug that caused the command "echo a | ./pcregrep -M '|a'" to loop. + +12. The source of pcregrep now includes z/OS-specific code so that it can be + compiled for z/OS as part of the special z/OS distribution. Version 8.33 28-May-2013 --------------------------- +------------------------ 1. Added 'U' to some constants that are compared to unsigned integers, to avoid compiler signed/unsigned warnings. Added (int) casts to unsigned @@ -3,10 +3,16 @@ *************************************************/ /* This is a grep program that uses the PCRE regular expression library to do -its pattern matching. On a Unix or Win32 system it can recurse into -directories. +its pattern matching. On Unix-like, Windows, and native z/OS systems it can +recurse into directories, and in z/OS it can handle PDS files. - Copyright (c) 1997-2012 University of Cambridge +Note that for native z/OS, in addition to defining the NATIVE_ZOS macro, an +additional header is required. That header is not included in the main PCRE +distribution because other apparatus is needed to compile pcregrep for z/OS. +The header can be found in the special z/OS distribution, which is available +from www.zaconsultants.net or from www.cbttape.org. + + Copyright (c) 1997-2013 University of Cambridge ----------------------------------------------------------------------------- Redistribution and use in source and binary forms, with or without @@ -530,17 +536,29 @@ while (fn != NULL) * OS-specific functions * *************************************************/ -/* These functions are defined so that they can be made system specific, -although at present the only ones are for Unix, Win32, and for "no support". */ +/* These functions are defined so that they can be made system specific. +At present there are versions for Unix-style environments, Windows, native +z/OS, and "no support". */ -/************* Directory scanning in Unix ***********/ +/************* Directory scanning Unix-style and z/OS ***********/ -#if defined HAVE_SYS_STAT_H && defined HAVE_DIRENT_H && defined HAVE_SYS_TYPES_H +#if (defined HAVE_SYS_STAT_H && defined HAVE_DIRENT_H && defined HAVE_SYS_TYPES_H) || defined NATIVE_ZOS #include <sys/types.h> #include <sys/stat.h> #include <dirent.h> +#if defined NATIVE_ZOS +/************* Directory and PDS/E scanning for z/OS ***********/ +/************* z/OS looks mostly like Unix with USS ************/ +/* However, z/OS needs the #include statements in this header */ +#include "pcrzosfs.h" +/* That header is not included in the main PCRE distribution because + other apparatus is needed to compile pcregrep for z/OS. The header + can be found in the special z/OS distribution, which is available + from www.zaconsultants.net or from www.cbttape.org. */ +#endif + typedef DIR directory_type; #define FILESEP '/' @@ -579,7 +597,7 @@ closedir(dir); } -/************* Test for regular file in Unix **********/ +/************* Test for regular file, Unix-style **********/ static int isregfile(char *filename) @@ -591,8 +609,26 @@ return (statbuf.st_mode & S_IFMT) == S_IFREG; } -/************* Test for a terminal in Unix **********/ +#if defined NATIVE_ZOS +/************* Test for a terminal in z/OS **********/ +/* isatty() does not work in a TSO environment, so always give FALSE.*/ + +static BOOL +is_stdout_tty(void) +{ +return FALSE; +} + +static BOOL +is_file_tty(FILE *f) +{ +return FALSE; +} + + +/************* Test for a terminal, Unix-style **********/ +#else static BOOL is_stdout_tty(void) { @@ -604,9 +640,12 @@ is_file_tty(FILE *f) { return isatty(fileno(f)); } +#endif + +/* End of Unix-style or native z/OS environment functions. */ -/************* Directory scanning in Win32 ***********/ +/************* Directory scanning in Windows ***********/ /* I (Philip Hazel) have no means of testing this code. It was contributed by Lionel Fourquaux. David Burgess added a patch to define INVALID_FILE_ATTRIBUTES @@ -709,7 +748,7 @@ free(dir); } -/************* Test for regular file in Win32 **********/ +/************* Test for regular file in Windows **********/ /* I don't know how to do this, or if it can be done; assume all paths are regular if they are not directories. */ @@ -720,7 +759,7 @@ return !isdirectory(filename); } -/************* Test for a terminal in Win32 **********/ +/************* Test for a terminal in Windows **********/ /* I don't know how to do this; assume never */ @@ -736,6 +775,8 @@ is_file_tty(FILE *f) return FALSE; } +/* End of Windows functions */ + /************* Directory scanning when we can't do it ***********/ @@ -752,7 +793,7 @@ char *readdirectory(directory_type *dir) { return (char*)0;} void closedirectory(directory_type *dir) {} -/************* Test for regular when we can't do it **********/ +/************* Test for regular file when we can't do it **********/ /* Assume all files are regular. */ @@ -773,7 +814,7 @@ is_file_tty(FILE *f) return FALSE; } -#endif +#endif /* End of system-specific functions */ @@ -2068,6 +2109,11 @@ BZFILE *inbz2 = NULL; int pathlen; #endif +#if defined NATIVE_ZOS +int zos_type; +FILE *zos_test_file; +#endif + /* If the file name is "-" we scan stdin */ if (strcmp(pathname, "-") == 0) @@ -2088,6 +2134,45 @@ lastcomp = (lastcomp == NULL)? pathname : lastcomp + 1; Otherwise, scan the directory and recurse for each path within it. The scanning code is localized so it can be made system-specific. */ + +/* For z/OS, determine the file type. */ + +#if defined NATIVE_ZOS +zos_test_file = fopen(pathname,"rb"); + +if (zos_test_file == NULL) + { + if (!silent) fprintf(stderr, "pcregrep: failed to test next file %s\n", + pathname, strerror(errno)); + return -1; + } +zos_type = identifyzosfiletype (zos_test_file); +fclose (zos_test_file); + +/* Handle a PDS in separate code */ + +if (zos_type == __ZOS_PDS || zos_type == __ZOS_PDSE) + { + rc = travelonpdsdir (pathname, only_one_at_top); + } + +/* Deal with regular files in the normal way below. These types are: + zos_type == __ZOS_PDS_MEMBER + zos_type == __ZOS_PS + zos_type == __ZOS_VSAM_KSDS + zos_type == __ZOS_VSAM_ESDS + zos_type == __ZOS_VSAM_RRDS +*/ + +/* Handle a z/OS directory using common code. */ + +else if (zos_type == __ZOS_HFS) + { +#endif /* NATIVE_ZOS */ + + +/* Handle directories: common code for all OS */ + if (isdirectory(pathname)) { if (dee_action == dee_SKIP || @@ -2122,12 +2207,22 @@ if (isdirectory(pathname)) } } -/* If the file is not a directory and not a regular file, skip it if that's -been requested. Otherwise, check for explicit include/exclude. */ +#if defined NATIVE_ZOS + } +#endif + +/* If the file is not a directory, check for a regular file, and if it is not, +skip it if that's been requested. Otherwise, check for an explicit inclusion or +exclusion. */ -else if ((!isregfile(pathname) && DEE_action == DEE_SKIP) || - !test_incexc(lastcomp, include_patterns, exclude_patterns)) - return -1; +else if ( +#if defined NATIVE_ZOS + (zos_type == __ZOS_NOFILE && DEE_action == DEE_SKIP) || +#else /* all other OS */ + (!isregfile(pathname) && DEE_action == DEE_SKIP) || +#endif + !test_incexc(lastcomp, include_patterns, exclude_patterns)) + return -1; /* File skipped */ /* Control reaches here if we have a regular file, or if we have a directory and recursion or skipping was not requested, or if we have anything else and |