[Pcre-svn] [1354] code/trunk: Add z/OS-specific code to pcre…

トップ ページ
このメッセージを削除
著者: Subversion repository
日付:  
To: pcre-svn
題目: [Pcre-svn] [1354] code/trunk: Add z/OS-specific code to pcregrep.
Revision: 1354
          http://vcs.pcre.org/viewvc?view=rev&revision=1354
Author:   ph10
Date:     2013-08-12 15:31:07 +0100 (Mon, 12 Aug 2013)


Log Message:
-----------
Add z/OS-specific code to pcregrep.

Modified Paths:
--------------
    code/trunk/ChangeLog
    code/trunk/pcregrep.c


Modified: code/trunk/ChangeLog
===================================================================
--- code/trunk/ChangeLog    2013-08-05 16:24:02 UTC (rev 1353)
+++ code/trunk/ChangeLog    2013-08-12 14:31:07 UTC (rev 1354)
@@ -60,10 +60,13 @@


 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


Modified: code/trunk/pcregrep.c
===================================================================
--- code/trunk/pcregrep.c    2013-08-05 16:24:02 UTC (rev 1353)
+++ code/trunk/pcregrep.c    2013-08-12 14:31:07 UTC (rev 1354)
@@ -3,11 +3,17 @@
 *************************************************/


/* 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
 modification, are permitted provided that the following conditions are met:
@@ -530,17 +536,29 @@
 *            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 @@
}


-/************* Test for regular file in Unix **********/
+/************* Test for regular file, Unix-style **********/

static int
isregfile(char *filename)
@@ -591,11 +609,29 @@
}


-/************* 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)
+{
return isatty(fileno(stdout));
}

@@ -604,10 +640,13 @@
{
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
when it did not exist. David Byron added a patch that moved the #include of
@@ -709,7 +748,7 @@
}


-/************* 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 @@
}


-/************* Test for a terminal in Win32 **********/
+/************* Test for a terminal in Windows **********/

/* I don't know how to do this; assume never */

@@ -736,7 +775,9 @@
return FALSE;
}

+/* End of Windows functions */

+
/************* Directory scanning when we can't do it ***********/

/* The type is void, and apart from isdirectory(), the functions do nothing. */
@@ -752,7 +793,7 @@
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 @@
return FALSE;
}

-#endif
+#endif /* End of system-specific functions */



@@ -2068,6 +2109,11 @@
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 @@
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,13 +2207,23 @@
     }
   }


-/* 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

-else if ((!isregfile(pathname) && DEE_action == DEE_SKIP) ||
-          !test_incexc(lastcomp, include_patterns, exclude_patterns))
-        return -1;
+/* 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 (
+#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
 skipping was not requested. The scan proceeds. If this is the first and only