summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--ChangeLog5
-rw-r--r--pcregrep.c133
2 files changed, 118 insertions, 20 deletions
diff --git a/ChangeLog b/ChangeLog
index eb37dea..d28c724 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -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
diff --git a/pcregrep.c b/pcregrep.c
index 6b15765..ed83462 100644
--- a/pcregrep.c
+++ b/pcregrep.c
@@ -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