CPPUPDTE (IPOUPDTE) ServerPac Program

                 

CPPUPDTE is a program that enables you to search for a string across all the members of a PDS and replace that string with another string. CPPUPDTE is loaded into the LOADLIB data set (hlq.order_number.LOADLIB) during ServerPac installation. It also has an alias name of IPOUPDTE because the job is actually the same job that was shipped with CBIPO.

Note: The PDSEDIT utility is a functionally-enhanced replacement for CPPUPDTE and IPOUPDTE.
           

The following information about how to use CPPUPDTE is an excerpt from the "CBIPO Design Reference" (C) Copyright IBM Corp. 1983,1991. All references to IPOUPDTE are equally applicable to the CPPUPDTE program provided with ServerPac.

Important: For CPPUPDTE and IPOUPDTE to work, each PDS to be searched MUST contain a member named $$$COIBM.

   Note: To remove the $$$COIBM requirement, apply the following ZAP: 

	//ZAPUPDTE EXEC PGM=AMASPZAP
	//SYSLIB DD DSN=IPO1.LINKLIB,DISP=SHR
	//SYSPRINT DD SYSOUT=*
	 NAME IPOUPDTE
	  VER 0548 0A12 	SVC 18		(BLDL)
	  REP 0548 1FFF 	SLR 15,15 

This documentation describes the following topics:

Introduction

IPOUPDTE is an update program that allows you to change fields in JCL and control statements in MVS Custom-Built IPO-provided libraries. The program is used extensively in the Custom-Built IPO batch installation processes and is the primary means by which you can modify these and other Custom-Built IPO jobs to implement your system design. Each of the Custom-Built IPO batch installation guides provides a brief introduction to IPOUPDTE so that you can change the supplied IPOUPDTE control statements and run the jobs. The description here is more comprehensive. It tells how the program works, what all of its functional capabilities are, and how to set up the JCL for an IPOUPDTE job. Complete lists of messages and return codes from IPOUPDTE are also given.

Note: Under most circumstances, you will not need to know this information to run the IPOUPDTE jobs in the CBIPO batch installation processes. The CBIPO batch installation guides should be adequate for running the installation process for your CBIPO feature. This appendix is provided as a reference for people who run into unusual difficulties in the installation processes or who want to make extensive modifications to the CBIPO-provided jobstreams.

Method of Operation

IPOUPDTE is a search-and-replace program. It scans a member of a PDS, all the members of a PDS, or all the members of a list of PDSs, and it conditionally replaces in place parts of the input records. Only CBIPO-provided libraries are eligible for updating by IPOUPDTE. The data to be replaced, called STRING1, and the replacement data, called STRING2, are defined by control statements in a SYSIN data set. An optional third search argument, called STRING3, enables you to make the replacement only when STRING3 is present in the input record.

The operation is as follows:

  1. A data record is read into the input buffer and then copied into the output buffer.
  2. The optional STRING3 on a control statement causes IPOUPDTE to search the input buffer for STRING3.
    1. If STRING3 is found, the output buffer is searched for STRING1 and, if found, STRING2 replaces STRING1 in the output buffer.
    2. If there is no STRING3, processing is the same as when STRING3 is specified and found: The output buffer is searched for STRING1 and, if found, STRING2 replaces STRING1.

Replacement occurs only in the output buffer. All the potential updates (that is, all the STRING1/STRING2s you specify) are processed against one input record before processing the next record. Updates occur in the same sequence in which they are specified in the control statements, so the result of one update can be changed by later updates.

Figure 1 provides four examples of IPOUPDTE processing. In each case the STRING1, STRING2, and STRING3 on a line go together, and both of the sets of STRING1/2/3 operate on each of the four input records before proceeding to the next input record.

+--------------------------------------------------------------------+
| Figure  1. Examples of IPOUPDTE processing.                        |
+--------------------------------------------------------------------+
|  STRING1 |  STRING2 |  STRING3 |  INPUT RECORDS  | UPDATED RECORDS |
+--------------------------------------------------------------------+
|          |          |          |                 |                 |
|    ONE   |    AAA   |  (None)  | ONE ONE ZZZ     | AAA AAA ZZZ     |
|    TWO   |    ONE   |  (None)  | ONE TWO         | AAA ONE         |
|          |          |          | TWO ONE ZZZ     | ONE AAA ZZZ     |
|          |          |          | TWO TWO         | ONE ONE         |
+--------------------------------------------------------------------+
|          |          |          |                 |                 |
|    ONE   |    AAA   |  (None)  | ONE ONE ZZZ     | AAA AAA ZZZ     |
|    TWO   |    ONE   |    ZZZ   | ONE TWO         | AAA TWO         |
|          |          |          | TWO ONE ZZZ     | ONE AAA ZZZ     |
|          |          |          | TWO TWO         | TWO TWO         |
+--------------------------------------------------------------------+
|          |          |          |                 |                 |
|    TWO   |    ONE   |    ZZZ   | ONE ONE ZZZ     | AAA AAA ZZZ     |
|    ONE   |    AAA   |  (None)  | ONE TWO         | AAA TWO         |
|          |          |          | TWO ONE ZZZ     | AAA AAA ZZZ     |
|          |          |          | TWO TWO         | TWO TWO         |
+--------------------------------------------------------------------+
|          |          |          |                 |                 |
|    ONE   |    AAA   |  (None)  | ONE ONE ZZZ     | AAA AAA TWO     |
|    ZZZ   |    TWO   |    ONE   | ONE TWO         | AAA TWO         |
|          |          |          | TWO ONE ZZZ     | TWO AAA TWO     |
|          |          |          | TWO TWO         | TWO TWO         |
+--------------------------------------------------------------------+ 

Other rules regarding string replacement are as follows:

  1. The string to be replaced, STRING1, must be totally contained in positions 1 through 71 of an input record. Thus, the continuation position, position 72, and the sequence number field, positions 73 through 80, are not affected by any updates.
  2. To be eligible for replacement, STRING1 must be a "word," not merely a string of characters imbedded within a "word." A "word" to IPOUPDTE is any string of characters bounded on both ends by any of several special delimiting characters. It does not have to be an English word in the ordinary sense. For STRING1 to be a word, it must have one of the following characters to its left and one to its right: ' , . / < > ? " : ; ^ + _ ( ) * % | = and blank

    The only exceptions to this statement are:

    1. When STRING1 starts at the beginning of the input record or ends in the last position (71) of the input record
    2. When the two characters '.V' or '/V' occur in an input record. The 'V' is considered part of the delimiter, not of the word, and so is not eligible for replacement.

    NOTE: The special handling of '.V' allows IPOUPDTE to update a VOLSER in CBIPO-format catalog names at the same time most other references to the VOLSER are updated. Figure 21 demonstrates how IPOUPDTE handles the '.V' special case.

    +--------------------------------------------------------------------+
    | Figure  2. Examples of IPOUPDTE processing.                        |
    +--------------------------------------------------------------------+
    |  STRING1 |  STRING2 |  STRING3 |  INPUT RECORDS  | UPDATED RECORDS |
    +--------------------------------------------------------------------+
    |          |          |          |                 |                 |
    |  MVSCAT  |  MYPAK1  |  (None)  |     CATALOG.    |     CATALOG.    |
    |          |          |          |     MVSICF1.    |     MVSICF1.    |
    |          |          |          |     VMVSCAT     |     VMYPAK1     |
    +--------------------------------------------------------------------+
    |          |          |          |                 |                 |
    |  MVSCAT  |  MYPAK1  |  (None)  |     CATALOG.    |     CATALOG.    |
    |          |          |          |     MVSICF1.    |     MVSICF1.    |
    |          |          |          |     ZMVSCAT     |     ZMVSCAT     |
    +--------------------------------------------------------------------+ 

    In the second section of the above example, where '.Z' has been specified in the input instead of '.V', no special processing is done; the VOLSER MVSCAT in this last record is not changed by IPOUPDTE.

    The special handling of '/V' allows IPOUPDTE to update a VOLSER in CBIPO-format operator JCL at the same time most other references to the VOLSER are updated. Figure 3 demonstrates how IPOUPDTE handles the '/V' special case.

    +--------------------------------------------------------------------+
    | Figure  3. Examples of IPOUPDTE processing.                        |
    +--------------------------------------------------------------------+
    |  STRING1 |  STRING2 |  STRING3 |  INPUT RECORDS  | UPDATED RECORDS |
    +--------------------------------------------------------------------+
    |          |          |          |                 |                 |
    | MVSCAT   | MYPAK1   | (None)   | //VMVSCAT JOB   | //VMYPAK1 JOB   |
    +--------------------------------------------------------------------+
    |          |          |          |                 |                 |
    | MVSCAT   | MYPAK1   | (None)   | //ZMVSCAT JOB   | //ZMVSCAT JOB   |
    +--------------------------------------------------------------------+ 

    In the second section of the above example, where '/Z' has been specified in the input instead of '/V', no special processing is done; the VOLSER MVSCAT in this last record is not changed by IPOUPDTE.

  3. When STRING2 is longer than STRING1, blanks are deleted from pools of two or more blanks following STRING1 within the record, up to and including position 71, thus shifting to the right some non-blank characters that follow STRING1. A field consisting of only one blank is not deleted. If there is no place to delete blanks (that is, no place to shift the following non-blank characters into), an error message is issued, the record is not updated, and processing continues with the next record. Inability to update within a comment record or comment portion of a record produces a return code of 4. Otherwise, the return code is 8.
  4. When the length of STRING2 is less than that of STRING1, blanks are inserted after the next pool of two blanks following STRING1.
  5. Updates to a record occur in the order that the control statements were entered. Each control statement processes the record in its entirety before the next control statement processes the record.

IPOUPDTE CONTROL STATEMENTS

You tell IPOUPDTE what you want to update in the specified libraries' members by specifying STRING1 and STRING2 and optionally STRING3 on control statements. You can supply the control statements either in a SYSIN data set or from the system console. IPOUPDTE has four types of control statements: the basic control statement, the extended control statement, the END statement, and the comment statement. Only the first 72 positions of the control statement are used; positions 73 through 80 are ignored. STRING1 begins in position 1. The maximum length for STRING1, STRING2, or STRING3 is 70 characters. The minimum length for STRING1 is 1. The minimum length for STRING2 and STRING3 is zero. If STRING2 is null--that is, a length of zero--STRING1 is deleted from the record.

If you make a mistake in the syntax of a control statement and you are using SYSIN for input, IPOUPDTE writes a error message identifying the faulty statement, scans the remaining control statements for errors, and then terminates without processing any libraries or making any updates.

The Basic Control Statement

The syntax of the basic control statement is as follows: STRING1<STRING2< optional comments where STRING1 and STRING2 are as explained in A.1, "Method of Operation" on page 85. The less-than symbol (<) is used to delimit the strings. The basic form causes all occurrences of STRING1 on all records of all members of the specified libraries to be replaced by STRING2.

For example, if a member contains

	UNIT=3380,VOL=SER=MVSIPO    /*LIB*/    input record1 before update
	UNIT=3380,VOL=SER=MVSR01    /*RES*/    input record2 before update 

and you specify the following on IPOUPDTE control statements:

	3380<3390<                             first control statement
	MVSIPO<MVSR01<                         second control statement 

then the modified records will look like this:

	UNIT=3390,VOL=SER=MVSR01   /*LIB*/     resultant record1 after update
	UNIT=3390,VOL=SER=MVSR01   /*RES*/     resultant record2 after update 

The Extended Control Statement

The syntax of the extended form is as follows: STRING1<STRING2<STRING3< optional comments where STRING1, STRING2 and STRING3 are as explained in A.1, "Method of Operation" on page 85. Replacement occurs only on records that have STRING3 as well as STRING1. Furthermore, STRING2 replaces STRING1 only when STRING3 was on the original record (as it was before any updates took place). All 80 positions are searched for STRING3. When STRING3 is used in the members of the Custom-Built IPO installation process, it is offset with the characters /* - */.

For example, if a member contains

	UNIT=3380,VOL=SER=MVSIPO    /*LIB*/    input record1 before update
	UNIT=3380,VOL=SER=MVSR01    /*RES*/    input record2 before update 

and you specify the following on IPOUPDTE control statements:

	3380<3390</*RES*/<                     first control statement
	MVSR01<RESPAK</*RES*/<                 second control statement 

then the modified records will look like this:

	UNIT=3380,VOL=SER=MVSIPO    /*LIB*/    resultant record1 after update
	UNIT=3390,VOL=SER=RESPAK     /*RES*/   resultant record2 after update 

If STRING3 is null, the extended form reverts to the basic form.

The END Control Statement

The END control statement signals the end of control statement input for the current run of IPOUPDTE. The syntax of the END statement is END coded in positions 1 through 3 and a blank in position 4. The remainder of the statement is not used and can contain comments. The END statement is equivalent to end-of-file on SYSIN and is, therefore, optional.

The Comment Statement

A comment statement consists of a </* in positions 1 through 3. Comment statements cannot be continued; a new comment statement must be used on the following record.

Continuations and Comments

A control statement can be continued only after a less-than symbol (<), not in the middle or after one of the strings. You tell IPOUPDTE that a control statement is to be continued by placing a dash (-) or a plus (+) immediately following any less-than symbol. The remainder of the statement is not scanned and can contain comments. When using a dash (-) to continue a statement, the control statement scan resumes in position 1 of the next statement. When using a plus (+) to continue a statement, the control statement scan resumes at the first non-blank character of the next statement. The continuation character, dash or plus, is not considered a part of any of the strings.

Comments can be placed after the first blank following the third less-than symbol (<) of the control statement or following the continuation character of a continued statement. For example, the following IPOUPDTE control statement 3380<3390<UNIT=< A COMMENT AFTER THE BLANK can be split across as many as three records, thus providing much more room for comments:

	3380<+      some more comments on continuation statement
	3390<+     note the plus continuation causes blanks on next
	UNIT=<     statement to be ignored 

Control Statement Input From the System Console

You can enter control statements from the system console as an alternative to entering them in a SYSIN data set. (When you omit the SYSIN DD statement, IPOUPDTE goes to the console for control statements. See section "JCL for IPOUPDTE". IPOUPDTE uses a WTOR macro for this purpose, allowing up to 72 characters in a single reply. You can continue a reply by entering a dash (-) as the last character of your response.

IPOUPDTE handles control statement errors differently when input is from the system console than when it is in SYSIN. Since console input provides an interactive environment, IPOUPDTE allows you to correct control statement errors before input ends, and it then processes normally. When IPOUPDTE finds an error in a control statement from the console, it writes an error message to the operator, ignores the erroneous control statement, and waits for you to enter another control statement.

When in console input mode, certain messages are logged to the operator's console as well as to SYSPRINT.

The No Update/Resume Update Facility

Sometimes you may not want to replace all occurrences of STRING1 that IPOUPDTE finds, and you may not have a convenient way to use STRING3 to control updating. For these occasions IPOUPDTE provides a way for you to suspend and later resume updating. You do this by marking the suspension and resumption points within the input library members themselves. You code a .NU. (No Update) marker in the first record of the member not to be considered for update, and IPOUPDTE suspends updating until end-of-file is reached for the member or until it finds a .RU. (Resume Update) marker. When IPOUPDTE finds the .RU. marker it resumes updating on the NEXT record of the member. Thus, if you have only one record that you want to protect from updating, you can code both .NU. and .RU. (that is, ".NU..RU.") on that one record. The No Update/Resume Update facility can be overridden by specifying the member name of the data set in the DD statement. However, as explained in the section "Execution Modes , you can tell IPOUPDTE that you want to honor the .NU./.RU. markers even though you have entered a member name on one or more of the specified libraries' DD statements. You do this by specifying one of the EXEC statement PARM values that ends in "M."

As an example of the use of the .NU./.RU. facility, suppose you have a PDS with the following JCL in one of the members:

  //SYSPRINT DD SYSOUT=*
  //SYSIN    DD *
   RENAME DSNAME=IPO1.LINKLIB,       .NU..RU.
          VOL=3380=MVSR01,NEWNAME=IPO1.LINKLIB
  .
  .
  . 

If your IPOUPDTE control statement is IPO1<CBIPO< then the IPO1 on the record containing the .NU. and .RU. will not be changed, but the IPO1 on the following record will be changed. The result will be as follows:

  //SYSPRINT DD SYSOUT=*
  //SYSIN    DD *
   RENAME DSNAME=IPO1.LINKLIB,       .NU..RU.
          VOL=3380=MVSR01,NEWNAME=CBIPO.LINKLIB
  .
  .
  . 

However, if you had included the member name on the IPOUPDTE DD statement for the library containing this member, both occurrences of IPO1 would be changed, and the records would look like this:

  //SYSPRINT DD SYSOUT=*
  //SYSIN    DD *
   RENAME DSNAME=CBIPO.LINKLIB,         .NU..RU.
          VOL=3380=MVSR01,NEWNAME=CBIPO.LINKLIB
  .
  .
  . 

Execution Modes

You can run IPOUPDTE in any of several different modes, each of which is unique in terms of whether actual updating takes place, how the No Update/Resume Update facility is handled, and how the libraries to be updated are specified to IPOUPDTE. The mode is specified in the PARM field on the EXEC statement you use when you invoke IPOUPDTE. The six modes are as follows:

CHECK     Verifies updates to records but does not write any updated
          records back to the specified libraries.
UPDATE    Updates the records of the specified libraries.
INSTALL   Updates the records of the specified libraries using control
          statements generated from special DD statements that are
          required in the job step when this execution mode is used.
          The special DD statements have DDNAMEs of 'Zvvvvvv', where
          'vvvvvv' is a volume serial number that is to be replaced in
          the specified libraries.  'vvvvvv' is replaced by the volume
          serial number specified in the VOL=SER parameter on the
          Zvvvvvv DD statement.
          For example, if you include the following DD statement in
          the IPOUPDTE job step:
            //ZMVSR01 DD UNIT=3390,VOL=SER=MVSRES,DISP=OLD
          IPOUPDTE generates the following control statements and adds
          them to the control statements you explicitly provide:
            MVSR01<MVSRES<<               CHANGE VOLUME SERIAL
            3380<3390<MVSR01<             CHANGE DEVICE TYPE
          These two control statements are generated for each
          'Zvvvvvv' DD statement included in the step.
CHECKM    Verifies updates to records of the specified libraries, but
          does not write the updated records back to the data set.
          This parameter causes .NU./.RU. markers in a library's
          member to be honored, even if the member name is specified
          on the library's DD statement.  In other words, when you
          specify PARM=CHECKM, IPOUPDTE behaves for the purposes of
          .NU./.RU. processing as if you had not entered member names
          on any of the specified libraries' DD statements.
UPDATEM   Updates the records of the specified libraries.  This
          parameter causes .NU./.RU. processing to be the same as that
          for PARM=CHECKM (see explanation above).
INSTALLM  Updates the records of the specified libraries.
          PARM=INSTALLM requires the same 'Zvvvvvv' DD statements as
          PARM=INSTALL does (see explanation above).  Furthermore,
          this parameter causes .NU./.RU. processing to be the same as
          that for PARM=CHECKM (see explanation above). 

JCL FOR IPOUPDTE

IPOUPDTE uses the following JCL statements and parameters:

EXEC PGM=IPOUPDTE   The IPOUPDTE load module resides in IPO1.LINKLIB.
                    If this data set is not in the LNKLST of the
                    system on which the job is to be run (it is in the
                    LNKLST of MVS Custom-Built IPO systems produced by
                    the Custom-Built IPO installation process), the
                    job should include a JOBLIB statement for
                    IPO1.LINKLIB, or the step should include a STEPLIB
                    statement for IPO1.LINKLIB, or IPOUPDTE should be
                    copied from IPO1.LINKLIB to a load module library
                    that is in the LNKLST of the system on which the
                    job is to be run.

PARM=               The PARM field of the EXEC statement is used to
                    specify one of the execution modes of IPOUPDTE.
                    (IPOUPDTE execution modes are explained in A.4,
                    "Execution Modes" on page 92.)  The value of the
                    PARM field must be one of the following:  CHECK,
                    UPDATE, INSTALL, CHECKM, UPDATEM, or INSTALLM.  If
                    no value is specified, PARM=CHECK is the default.
SYSPRINT DD         A SYSPRINT DD statement is required.  The SYSPRINT
                    file is used to log all input control statements,
                    output messages, and updates.  Its DCB attributes
                    are RECFM=FBA,LRECL=121.  The default block size
                    is 121.  If the SYSPRINT DD statement is missing,
                    an error message is issued to the console and
                    processing terminates.
@LIBRARY DD         Each library specified for updating must be
                    defined in a DD statements whose DDNAME begins
                    with a commercial (@).  For example:
                      //@JCLLIB DD DSN=IPO1.JCLLIB,DISP=SHR
                    Except for the requirements that the DDNAMEs begin
                    with @ and that each one be unique, there are no
                    further requirements on the DDNAMEs for the
                    specified libraries.
                    A library to be updated must be a partitioned data
                    set (DSORG=PO), RECFM=F or FB, LRECL=80, it must
                    be allocated on a direct access volume, and it
                    must be a CBIPO-supplied library.  If a data set
                    fails to meet these requirements, a warning
                    message is issued and processing continues with
                    the next library.  If no member is specified for
                    the data set on the DD statement, all members of
                    the library are processed by IPOUPDTE.
SYSIN DD            Control statements for IPOUPDTE can be entered
                    through file name SYSIN, with DCB attributes
                    RECFM=F or FB, and LRECL=80.  If the SYSIN DD
                    statement is not present and PARM=INSTALL is not
                    specified, the operator is prompted for input
                    through the operator's console via a WTOR
                    sequence.  The SYSIN DD statement is not used when
                    PARM=INSTALL is specified. 

ONE MORE EXAMPLE OF USING IPOUPDTE

Suppose the following JCL existed in member SAMPLE of library IPO1.JCLLIB:

  //SAMPLE   JOB (ACCT#),'PGMRNAME',
  //         MSGCLASS=X,MSGLEVEL=(1,1),CLASS=A
  //* COMMENT   IPO1 COMMENT IPO1  TWO BLANKS
  //CATLG    EXEC PGM=IEHPROGM
  //SYSPRINT DD   SYSOUT=*
  //MOUNT    DD   UNIT=3380,VOL=SER=MVSR01,DISP=OLD
  //SYSIN    DD   *
    CATLG DSNAME=IPO1.PROCLIB,VOL=3380=MVSR01
    CATLG DSNAME=IPO1.LINKLIB,VOL=3380=MVSR01
  /* 

Similarly, suppose that the following JCL was used to update IPO1.JCLLIB:

  //IPOUPDTE JOB (ACCT#),'PGMRNAME',
  //         MSGCLASS=X,MSGLEVEL=(1,1),CLASS=A
  //STEP     EXEC PGM=IPOUPDTE,PARM=UPDATE
  //SYSPRINT DD   SYSOUT=*
  //@TEST    DD   DSN=IPO1.JCLLIB,DISP=SHR
  //SYSIN    DD   *
  CLASS=X<CLASS=A<
  *<A<SYSOUT=<
  IPO1<CBIPO<
  /* 

Member SAMPLE of IPO1.JCLLIB would be changed to the following:

  //SAMPLE   JOB (ACCT#),'PGMRNAME',
  //         MSGCLASS=X,MSGLEVEL=(1,1),CLASS=A
  //* COMMENT   CBIPO COMMENT CBIPO TWO BLANKS
  //CATLG    EXEC PGM=IEHPROGM
  //SYSPRINT DD   SYSOUT=A
  //MOUNT    DD   UNIT=3380,VOL=SER=MVSR01,DISP=OLD
  //SYSIN    DD   *
    CATLG DSNAME=CBIPO.PROCLIB,VOL=3380=MVSR01
    CATLG DSNAME=CBIPO.LINKLIB,VOL=3380=MVSR01
  /* 

Some things to notice in this example are:

  1. On the JOB statement, MSGCLASS=X did not change to MSGCLASS=A because the string 'CLASS=X' is not properly delimited on the left. See the second rule on page 86 which explains the delimiters for a "word".
  2. The comment statement was used to demonstrate how blanks are deleted from a record to expand a field. That is, IPO1 was changed to CBIPO requiring one blank to be deleted for each substitution.
  3. The extended form of the control statement was used to change the SYSOUT class.

IPOUPDTE MESSAGES

IPO001    * ERROR * SYSPRINT DD MISSING
EXPLANATION:  This message is issued via WTO when no SYSPRINT DD
statement is found in the JOB step.
SEVERITY: 16
SYSTEM ACTION:  The program terminates.  No processing has taken
place.
USER RESPONSE:  Add a SYSPRINT DD statement to the JOB step.

IPO002     * ERROR * INVALID PARAMETER FIELD
EXPLANATION:  This message is issued when an invalid parameter field
of the EXEC statement is encountered.
SEVERITY: 16
SYSTEM ACTION:  The program terminates.  No processing has taken
place.
USER RESPONSE:  Make sure that the parameter field is null or that one
of the following is specified: CHECK, UPDATE, INSTALL, CHECKM, UPDATEM
or INSTALLM.

IPO003     ENTER IPOUPDTE CONTROL STATEMENT OR 'END'
EXPLANATION:  This message is issued during the WTOR control statement
input sequence.  It is a request for a new control statement or the
continuation of a previous statement.  If 'END' is entered, further
input processing is ended.
SYSTEM ACTION:  Wait for operator's reply.
USER RESPONSE:  Enter the control statement or 'END'.

IPO004     INVALID CONTROL STATEMENT SYNTAX
EXPLANATION:  This message is issued when a control statement's syntax
is invalid.
SEVERITY: 16 or 0
SYSTEM ACTION:  If input is from SYSIN, the remaining control
statements are read and validated, after which the program terminates
with a return code of 16.  If input is via the operator's console, the
statement in error is ignored and processing resumes normally.
USER RESPONSE:  Correct the control statement syntax.  Ensure that:
*   The control statement ends before position 73
*   None of STRING1, STRING2 or STRING3 is longer than 70 characters
*   STRING1 is at least 1 character
*   STRING1, STRING2 and (if used) STRING3 are delimited by '<'
*   The END control statement (if used) is in positions 1 through 4
*   Any continued records end with '<-' or '<+' (excluding comments
    and .NU..RU.).

IPO005     END OF INPUT CONTROL STATEMENTS
EXPLANATION:  This message is issued when end-of-file is encountered
on SYSIN or when an 'END' control statement is encountered.
SYSTEM ACTION:  If all control statements are valid, processing of the
libraries begins.
USER RESPONSE:  None.

IPO006      FILE XXXXXXXX INVALID FOR IPOUPDTE
EXPLANATION:  This message is issued when a DD statement is found
defining a library to be processed by IPOUPDTE, but the library failed
to meet the requirements of libraries that can be processed by
IPOUPDTE.  XXXXXXXX is the DDNAME of the invalid library.
SEVERITY: 4
SYSTEM ACTION:  Processing continues with the next library.
USER RESPONSE:  Ensure that:
*   The data set is a PDS
*   The record format is F or FB
*   The logical record length is 80
*   The data set is on the specified DASD volume.

IPO007       I/O ERROR . . . SYNAD ERROR MESSAGE . . .
EXPLANATION:  This message is issued when an I/O error occurs on the
library being updated.  The text of the message is that which is
available to a SYNAD error routine.
SEVERITY: 12
SYSTEM ACTION:  Processing of this library terminates and processing
resumes with the next library.
USER RESPONSE:  Check the data set and device for possible errors.

IPO008      PROCESSING TERMINATED FOR FILE XXXXXXXX
EXPLANATION:  This message is issued when processing has ended
prematurely for a given file.  XXXXXXXX is the DDNAME of the file.
SEVERITY: 12
SYSTEM ACTION:  Processing continues with the next library.
USER RESPONSE:  Check previous messages to determine the cause.

IPO009       * ERROR * TOO MANY CONTROL STATEMENTS
EXPLANATION:  This message is issued when too many control statements
were entered.
SEVERITY: 16
SYSTEM ACTION:  Control statement input ends and processing terminates
with no updates done.
USER RESPONSE:  Each control statement requires 8+L1+L2+L3 bytes of
storage, where L1, L2, and L3 are the lengths of STRING1, STRING2, and
STRING3, respectively.  The total of all control statements must be
less than 4092 bytes of storage.  Split the control statements into
two or more batches and rerun the job until all batches are processed.

IPO010       FILE XXXXXXXX HAD NO UPDATES
EXPLANATION:  This message is issued when no updates were made to a
library because no text was found that matched any control statements.
SEVERITY: 4
SYSTEM ACTION:  Processing continues with the next library.
USER RESPONSE:  Make sure all control statements specified the updates
you intended.

IPO011         IPOUPDTE ENDED. CODE=XX
EXPLANATION:  This message is issued during the termination of
IPOUPDTE, where XX is the return code.
SYSTEM ACTION:  None.
USER RESPONSE:  Check the return code.

IPO012        DATA SET NOT APPLICABLE TO IPOUPDTE
EXPLANATION:  This message is issued when a DD statement was found
defining a library to be updated, but the library was not supported by
IPOUPDTE.
SEVERITY: 4
SYSTEM ACTION:  Processing continues with the next library.
USER RESPONSE:  Ensure that only IPOUPDTE-supported libraries are
specified.

IPO013       DD XXXXXXXX INVALID OR UNKNOWN DEVICE TYPE
EXPLANATION:  This message can occur only when PARM=INSTALL or
PARM=INSTALLM is specified on the EXEC statement.  It indicates one of
the following:
*   A DDNAME beginning with 'Z' does not have the format 'Zvvvvvv',
    where 'vvvvvv' is the volume serial number of a DASD volume.
    References to 'vvvvvv' in the libraries to be updated are to be
    changed to the volume and device type defined by the DD statement
    Zvvvvvv.
*   DD statement Zvvvvvv does not define a recognized DASD device.
SEVERITY: 16
SYSTEM ACTION:  Processing terminates with no updates done.
USER RESPONSE:  Correct the faulty DD statement and rerun the job.  

IPOUPDTE RETURN CODES

RETURN CODE OF 0
EXPLANATION:  All processing completed with no errors or warnings.
USER RESPONSE:  None.

RETURN CODE OF 4
EXPLANATION:  One or more of the following occurred:
*   One or more of the libraries had no updates
*   One or more of the libraries was invalid to be processed by
    IPOUPDTE.
*   A string within a record's comment field could not be replaced
    because too few blanks remained in the record.
USER RESPONSE:  Check messages logged to SYSPRINT file.

RETURN CODE OF 8
EXPLANATION:  The non-comment text in at least one record could not be
updated because too few blanks remained in the record.
USER RESPONSE:  Check messages logged to SYSPRINT file to determine
the records that could not be updated.

RETURN CODE OF 12
EXPLANATION:  At least one library had an I/O error.
USER RESPONSE:  Check messages logged to SYSPRINT file to determine
where the errors occurred.

RETURN CODE OF 16
EXPLANATION:  One of the following occurred:
*   The SYSPRINT DD statement was missing
*   One or more of the control statements were invalid
*   The PARM field on the EXEC statement contained an invalid
    parameter
*   Too many control statements were entered
*   An invalid Zvvvvvv DD statement was supplied when PARM=INSTALL or
    PARM=INSTALLM was specified on the EXEC statement
USER RESPONSE:  Check messages logged to SYSPRINT file to determine
where the errors occurred.