Outputs symbolic information of Processor
search cancel

Outputs symbolic information of Processor

book

Article ID: 380689

calendar_today

Updated On:

Products

Endevor

Issue/Introduction

How to output the Processor symbolic information displayed on the PROCESSOR GROUP SYMBOLICS panel(C1SEUSY1) to a report?

Environment

Endevor V19.0

Resolution

It cannot be output using existing reports.
However, using Endevor's table tool function it is possible to output the data, although not in the exact same format as on the screen.
You can output this using REXX by creating two input files.

Create two input files:

1. RETRIEVE the processor to a PO file. Execute the following from FOREGROUND RETRIEVE.


C1SF2000 --------------------- RETRIEVE ELEMENTS -----------------------------
OPTION  ===>  R                                               SCROLL ===> PAGE
                                                                              
   blank - Element list            S - Summary   B - Browse   H - History     
   R - Retrieve element            M - Master    C - Changes                  
                                                                              
CCID ===>                 COMMENT ===>                                        
                                                                              
FROM LOCATION:                         ACTION OPTIONS:                        
  ENVIRONMENT ===> R19PROD               EXPAND INCLUDES         ===> Y (Y/N) 
  SYSTEM      ===> ADMIN                 SIGNOUT ELEMENT         ===> N (Y/N) 
  SUBSYSTEM   ===> PROCESS               OVERRIDE SIGNOUT        ===> N (Y/N) 
  ELEMENT     ===>             +         REPLACE MEMBER          ===> N (Y/N) 
  TYPE        ===> PROCESS                                                    
  STAGE       ===> P   E - EMR         LIST OPTIONS:                          
                       P - PRD           DISPLAY LIST            ===> Y (Y/N) 
TO ISPF LIBRARY:                         APPLY LIST FILTERS      ===> N (Y/N) 
  PROJECT     ===>                       BUILD USING MAP         ===> Y (Y/N) 
  LIBRARY     ===>                       RETURN FIRST FOUND      ===> Y (Y/N) 
  TYPE        ===>                                                            
  MEMBER      ===>                                                            
TO OTHER ISPF DATA SET:                                                       
  DATA SET    ===> 'Prefix.ENDEVOR.PROCESS'                                   

 

2. Generate the SCL using BUILD SCL as follows:


//BUILDSCL EXEC PGM=NDVRC1,DYNAMNBR=1500,PARM='ENBE1000',REGION=4096K
//STEPLIB  DD DISP=SHR,DSN=Prefix.ENDEVOR.CSIQAUTU
//         DD DISP=SHR,DSN=Prefix.ENDEVOR.CSIQAUTH
//CONLIB   DD DISP=SHR,DSN=Prefix.ENDEVOR.CSIQLOAD
//SYMDUMP  DD DUMMY
//SYSUDUMP DD SYSOUT=*
//C1MSGS1  DD SYSOUT=*
//C1PRINT  DD SYSOUT=*
//SYSOUT   DD SYSOUT=*
//ENESCLIN DD *
BUILD SCL FOR SYSTEM "FINANCE"
      FROM ENVIRONMENT "R19TEST"
      INCLUDE SUBORDINATES
      TO DSNAME "Prefix.ENDEVOR.SAMPJCL"
         MEMBER "BUILDSYS"
         REPLACE.


The input files are the Prefix.ENDEVOR.PROCESS created in 1 and the Prefix.ENDEVOR.SAMPJCL(BUILDSYS) created in 2.


SYMBREPT_JCL:
Specify the PO file that retrieved the processor in the Prefix.ENDEVOR.PROCESS portion of PARM='SYMBREPT Prefix.ENDEVOR.PROCESS GENERATE'.
Specify the file created with BUILD SCL in the DEFINESI DD.


//SYMBREPT EXEC PGM=IKJEFT1B,COND=(4,LT),
//         PARM='SYMBREPT Prefix.ENDEVOR.PROCESS GENERATE'
//SYSEXEC  DD DISP=SHR,DSN=Prefix.ENDEVOR.REXX
//DEFINESI DD DSN=Prefix.ENDEVOR.SAMPJCL(BUILDSYS),
//            DISP=SHR
//SYSTSPRT DD SYSOUT=*
//SYSPRINT DD DUMMY
//SYSTSIN  DD DUMMY
//REPORT   DD SYSOUT=*

 

SYMBREPT_REXX:
Please set the following parts in the source to suit your environment.


     NDVR_MAP =   'SMPLTEST/1 SMPLTEST/2 SMPLPROD/1 SMPLPROD/2 ' ;
   NDVR_MAP =   'DEV/T      QAS/Q      EMR/E      PRD/P      ' ;
   NDVR_STGIDS ='   T         Q          E          P       ' ;
   NDVR_STAGES =' DEV        QAS         EMR        PRD      ' ;

By executing SYMBREPT_JCL, you can output symbolic information.
This document is a sample, so please customize it as needed.
(In the documents, it is referred to as Table Tool)

 

/*   REXX     */
/*                                                                   */
/* FOR THE REPORTING OF MERGED VALUES OF PROCESSOR SYMBOLICS AND     */
/* PROCESSOR GROUP OVERRIDES.                                        */
/* REQUIRES TWO INPUTS:                                              */
/* 1) A PDS containing all processors which contain symbolics        */
/*    you want to report from.                                       */
/* 2) A sequential file or PDS(MEMBER) containing Endevor batch      */
/*    Admin SCL.                                                     */
/*                                                                   */
/*      WRITTEN BY DAN WALTHER                                       */
/*                                                                   */
     ARG PROCESSORS SEL_ACTION ;
     TRACE Off
     RETCODE = 0  ;
/*                                                                   */
/*   DEFAULTS:                                                       */
/*                                                                   */
/*      Reconstruct Endevor mapping of environments and stages.      */
/*                                                                   */
     NDVR_MAP =   'SMPLTEST/1 SMPLTEST/2 SMPLPROD/1 SMPLPROD/2 ' ;
     NDVR_MAP =   'DEV/T      QAS/Q      EMR/E      PRD/P      ' ;
   NDVR_STGIDS ='   T         Q          E          P       ' ;
     NDVR_STAGES =' DEV        QAS         EMR        PRD      ' ;
/*                                                                   */
/*                                                                   */
/*                                                                   */
   CMP_SYSLIB_CONCATENATION = ' ',
        ' CSYSLIB1 CSYSLIB2 CSYSLIB3 CSYSLIB4 '
/*                                                                   */
   LNK_SYSLIB_CONCATENATION = ' ',
        '  LSYSLIB1 LSYSLIB2 LSYSLIB3 LSYSLIB4 ' ;
/*                                                                   */
   LNK_OBJLIB_CONCATENATION = ' ' ;
/*                                                                   */
   USERLIB_CONCATENATION = ' ' ;
/*                                                                   */
     "EXECIO * DISKR DEFINESI (STEM" INPUT.
/*                                                                   */
     OVERRIDES = ' ' ;
     C1ACTION = ' ' ;
     DO I = 1 TO INPUT.0
        WORD_ONE = WORD(INPUT.I,1) ;
        WORD_TWO = WORD(INPUT.I,2) ;
        WORD_THREE = WORD(INPUT.I,3) ;
        SELECT
            WHEN WORD_ONE = 'EOF' then exit ;
            WHEN WORD_ONE = 'BASE' & WORD_TWO = 'LIBRARY' THEN,
                 DO
                 C1BASELIB = ,
                    TRANSLATE(WORD(INPUT.I,3),,"'(), <>");
                 C1BASELIB = STRIP(C1BASELIB) ;
                 SA= 'C1BASELIB =' C1BASELIB;
                 END;
            WHEN WORD_ONE  = '.' THEN,
                 DO
                 J = I + 1 ;
                 IF C1ACTION /= ' ' &,
                    STRIP(INPUT.J) /= 'DEFINE PROCESSOR SYMBOL' THEN,
                    DO
                    IF PROCESSR /= '*NOPROC*' THEN,
                       CALL EXAMINE_PROCESSOR ;
                    VARIABLES  = ' ';
                    OVERRIDES = ' ' ;
                    C1ACTION  = ' ' ;
                    END;
                 END;
            WHEN WORD_ONE  = 'DEFINE' &,
                 WORD_TWO        = 'SUBSYSTEM' THEN,
                 DO
                 C1SU = TRANSLATE(WORD_THREE,,"'(), .<>");
                 C1SU = STRIP(C1SU);
                 C1SUBSYS = C1SU ;
                 SA= 'C1SUBSYS =' C1SUBSYS;
                 END;
            WHEN WORD_ONE  = 'DEFINE' &,
                 WORD_TWO        = 'PROCESSOR' &,
                 WORD_THREE      = 'GROUP'       THEN,
                 DO
                 INPUT_REC =  I;
                 C1PRGRP = TRANSLATE(WORD(INPUT.I,4),,"'(), .<>");
                 C1PRGRP = STRIP(C1PRGRP) ;
                 SA= 'C1PRGRP =' C1PRGRP;
                 J = I + 1; /* ENV ON NEXT LINE  */
                 C1ENVMNT = TRANSLATE(WORD(INPUT.J,3),,"'(), .<>");
                 C1ENVMNT = STRIP(C1ENVMNT) ;
                 SA= 'C1ENVMNT =' C1ENVMNT;
                 J = J + 1; /* SYS ON NEXT LINE  */
                 C1SYSTEM = TRANSLATE(WORD(INPUT.J,2),,"'(), .<>");
                 C1SYSTEM = STRIP(C1SYSTEM) ;
                 SA= 'C1SYSTEM =' C1SYSTEM;
                 J = J + 1; /* TYP ON NEXT LINE  */
                 C1ELTYPE = TRANSLATE(WORD(INPUT.J,2),,"'(), .<>");
                 C1ELTYPE = STRIP(C1ELTYPE) ;
                 SA= 'C1ELTYPE =' C1ELTYPE;
                 J = J + 1; /* STG ON NEXT LINE  */
                 C1STGID2 = C1ENVMNT||'/2'
                 DO K = 1 TO WORDS(NDVR_MAP) ,
                    UNTIL C1STGID2 = WORD(NDVR_MAP,K)
                      NOP ; END
                 C1STAGE2 = WORD(NDVR_STAGES,K) ;
                 C1ST2   = C1STAGE2;
                 C1STGNUM = TRANSLATE(WORD(INPUT.J,3),,"'(), .<>");
                 C1STGNUM = STRIP(C1STGNUM) ;
                 C1STGID  = C1ENVMNT||'/'||C1STGNUM;
                 DO K = 1 TO WORDS(NDVR_MAP) ,
                    UNTIL C1STGID = WORD(NDVR_MAP,K)
                      NOP ; END
                 C1STGID = WORD(NDVR_STGIDS,K) ;
                 C1STAGE = WORD(NDVR_STAGES,K) ;
                 C1ST    = C1STAGE ;
                 SA= 'C1STGNUM  =' C1STGNUM ;
                 SA= 'C1STGID   =' C1STGID  ;
                 SA= 'C1STAGE   =' C1STAGE  ;
                 C1ACTION = SEL_ACTION ;
                 C1SENVMNT = C1ENVMNT ;
                 C1SSTGID = C1STGID ;
                 C1SY      = C1SYSTEM ;
                 C1SSYSTEM = C1SYSTEM ;
                 C1TY      = C1ELTYPE ;
                 END;
            WHEN WORD_ONE  = SEL_ACTION & WORD_TWO = 'PROCESSOR' &,
                 WORD_THREE      = 'NAME'        THEN,
                 DO
                 PROCESSR = TRANSLATE(WORD(INPUT.I,5),,"'(), .<>") ;
                 PROCESSR = STRIP(PROCESSR) ;
                 SA= 'PROCESSR =' PROCESSR;
                 END;
            WHEN WORD_ONE  = 'PROCESSOR' & WORD_TWO = 'TYPE' THEN,
                 DO
                 PROCESSOR_TYPE = STRIP(WORD(INPUT.I,4)) ;
                 LAST_WRITTEN = I ;
                 END;
            WHEN WORD_ONE  = 'SYMBOL' &,
               PROCESSOR_TYPE = SEL_ACTION THEN,
                 DO
                 POSITION = POS('=',INPUT.I) ;
                 SYM_NAME = STRIP(SUBSTR(INPUT.I,1,POSITION-1)) ;
                 SYM_NAME = STRIP(WORD(SYM_NAME,2)) ;
                 SYM_NAME = TRANSLATE(SYM_NAME,,"'(), .<>");
                 SA= 'SYM_NAME =' SYM_NAME;
                 SYM_VALU = SUBSTR(INPUT.I,POSITION+1) ;
                 IF SUBSTR(SYM_VALU,1,1) = "'" THEN,
                    DO
                    END_POS = POS("'",SYM_VALU,2);
                    SYM_VALU = SUBSTR(SYM_VALU,1,END_POS);
                    END;
                 ELSE,
                 IF SUBSTR(SYM_VALU,1,1) = '"' THEN,
                    DO
                    END_POS = POS('"',SYM_VALU,2);
                    SYM_VALU = SUBSTR(SYM_VALU,1,END_POS);
                    END;
                 ELSE,
                    SYM_VALU = WORD(SYM_VALU,1);
                 SYM_VALU = STRIP(SYM_VALU,T,",") ;
                 IF SUBSTR(SYM_VALU,1,1) = "'" |,
                    SUBSTR(SYM_VALU,1,1) = '"' THEN,
                    WORK_STRING = SYM_NAME " =   "SYM_VALU ;
                 ELSE,
                    WORK_STRING = SYM_NAME " = '"SYM_VALU"'" ;
                 IF LENGTH(SYM_VALU) = 0 THEN,
                    DO     /* SYM_VALU VALUE IS ON NEXT LINE */
                    J = I + 1; /* CONCATENATE NEXT LINE */
                    WORK_STRING = INPUT.I || SUBSTR(INPUT.J,1,72) ;
                    SYM_VALU = STRIP(SUBSTR(WORK_STRING,POSITION+1)) ;
                    END ;
                 SA= 'SYM_VALU =' SYM_VALU;
                 VARIABLES = VARIABLES SYM_NAME ;
                 WORK_STRING = TRANSLATE(WORK_STRING,'_',' ');
                 OVERRIDES = OVERRIDES WORK_STRING ;
                 END;  /* OF WHEN .... */
            OTHERWISE,
                 NOP;  /* OF WHEN .... */

            END;  /* OF SELECT ... */
     END; /* OF DO .... */
/*                                                                   */
     IF WORDS(VARIABLES) > 0 & PROCESSR /= '*NOPROC*' THEN,
        CALL EXAMINE_PROCESSOR ;
/*                                                                   */
     EXIT 0
EXAMINE_PROCESSOR :
     SA= '*ENTERING EXAMINE_PROCESSOR' ;
     TEMPDSN = PROCESSORS'('PROCESSR')' ;
     DSNCHECK = SYSDSN("'"TEMPDSN"'") ;
     IF DSNCHECK /= OK THEN,
        DO
        SAY '??? CANNOT FIND PROCESSOR ' PROCESSR;
        RETURN(8) ;
        END;
/*                                                                   */
     OUT_CNT = 0 ;
     VARIABLES = " " ;      /* LIST OF VARIABLES IN PROCESSOR */
     VAR_FLAGS = " " ;      /* LIST OF FLAGS 4 VARIABLES IN PROCESSOR */
                            /* Y = VARIABLE HAS BEEN FULLY EVALUATED  */
                            /* N = VARIABLE NOT BEEN FULLY EVALUATED  */
/*                                                                   */
     TEMPDSN = PROCESSORS'('PROCESSR')' ;
     SA= "ALLOCATING " TEMPDSN ;
     SAY  '**ENVIRONMENT='C1ENVMNT 'STAGE='C1STGNUM,
             ' SYSTEM='C1SYSTEM 'TYPE='C1ELTYPE 'PROCGROUP='C1PRGRP ;
     ADDRESS TSO,
     "ALLOC F(PROCESSR)",
          "DA('"TEMPDSN"') SHR REUSE " ;
/*                                                                   */
     FOUND_1ST_STEP = 0 ;
/*                                                                   */
     STEP_NAME = '???' ;
     IS_IT_STEP = 0 ;
/*                                                                   */
/*   GET VARIABLES IN PROCESSOR AND SAVE   DEFAULT VALUES            */
/*                                                                   */
     DO UNTIL (IS_IT_STEP > 0) | (RETCODE > 0)
        CALL GET_NEXT_RECORD ;
        IF IS_IT_STEP > 0 | RETCODE > 0 THEN LEAVE;
        IF FOUND_1ST_STEP = 0 THEN,
           DO FOREVER
              POSITION = POS('=',PROCREC.1) ;
              IF POSITION = 0 THEN LEAVE;
              PROCREC.1 = OVERLAY(' ',PROCREC.1,POSITION) ;
              TEMP      = WORDS(SUBSTR(PROCREC.1,1,POSITION-1)) ;
              SYM_NAME = WORD(PROCREC.1,TEMP) ;
              IF SUBSTR(PROCREC.1,POSITION+1,1) = "'" THEN,
                 DO
                 END_POS = POS("'",PROCREC.1,POSITION+2);
                 IF END_POS = 0 THEN SYM_VALU = '';
                 ELSE,
                    DO
                    SYMB_LNTH = END_POS - POSITION;
                    SYM_VALU = SUBSTR(PROCREC.1,POSITION+1,SYMB_LNTH)
                    END;
                 END; /* IF SUBSTR(PROCREC.1,POSITION+1,1) = "'" THEN */
              ELSE,
              IF SUBSTR(PROCREC.1,POSITION+1,1) = '"' THEN,
                 DO
                 END_POS = POS('"',PROCREC.1,POSITION+2);
                 IF END_POS = 0 THEN SYM_VALU = '';
                 ELSE,
                    DO
                    SYMB_LNTH = END_POS - POSITION;
                    SYM_VALU = SUBSTR(PROCREC.1,POSITION+1,SYMB_LNTH)
                    END;
                 END; /* IF SUBSTR(PROCREC.1,POSITION+1,1) = '"' THEN */
              ELSE,
              IF SUBSTR(PROCREC.1,POSITION+1,1) = ',' THEN,
                 DO
                 SYM_VALU = '' ;
                 END_POS = POSITION;
                 END;
              ELSE,
                 DO
                 POS_COMMA = POS(',',PROCREC.1,POSITION+1);
                 POS_LPARN = POS('(',PROCREC.1,POSITION+1);
                 IF POS_COMMA > 0 & POS_LPARN = 0         THEN,
                    TMP_VALU = OVERLAY(' ',PROCREC.1,POS_COMMA) ;
                 ELSE,
                 IF POS_COMMA > 0 & POS_COMMA < POS_LPARN THEN,
                    TMP_VALU = OVERLAY(' ',PROCREC.1,POS_COMMA) ;
                 ELSE,
                 IF POS_LPARN > 0 & POS_LPARN < POS_COMMA THEN,
                    DO
                    POS_RPARN = POS(')',PROCREC.1,POSITION+1);
                    TMP_VALU = OVERLAY(' ',PROCREC.1,POS_RPARN+1);
                    END;
                 ELSE,
                    TMP_VALU = PROCREC.1 ;
                 SYM_VALU = WORD(SUBSTR(TMP_VALU,POSITION+1),1) ;
                 END_POS = POSITION + LENGTH(SYM_VALU);
                 END;
              SYM_VALU = STRIP(SYM_VALU,T,",") ;
              IF SUBSTR(SYM_VALU,1,1) = "'" |,
                 SUBSTR(SYM_VALU,1,1) = '"' THEN,
                 WORK_STRING = SYM_NAME " =   "SYM_VALU ;
              ELSE,
                 WORK_STRING = SYM_NAME " = '"SYM_VALU"'" ;
              SAY 'PROCESSOR 'PROCESSR 'DEFAULT (SYMBOLIC/VALUE): ',
                   SYM_NAME '=' ,
                   SYM_VALU ;
              INTERPRET WORK_STRING ;
              IF WORDPOS(SYM_NAME,VARIABLES) = 0 THEN,
                 VARIABLES = VARIABLES SYM_NAME ;
              IF END_POS > 78                      THEN LEAVE;
              IF SUBSTR(PROCREC.1,END_POS+1,1) = ' ' THEN LEAVE;
              IF SUBSTR(PROCREC.1,END_POS+1,1) = ',' &,
                 SUBSTR(PROCREC.1,END_POS+2,1) = ' ' THEN LEAVE;
              PROCREC.1 = SUBSTR(PROCREC.1,END_POS+2) ;
           END; /* DO FOREVER        ... */
        END;  /* DO UNTIL ...  */
/*                                                                   */
     "EXECIO 0 DISKR PROCESSR (FINIS" ;
/*                                                                    */
/*   APPLY OVERRIDES TO PROCESSOR SYMBOLICS                          */
/*                                                                   */
     IF WORDS(OVERRIDES) > 0 THEN,
        DO K = 1 TO WORDS(OVERRIDES)
           TEMP  = WORD(OVERRIDES,K) ;
           TEMP  = TRANSLATE(TEMP,' ','_');
           SAY 'OVERRIDE: ' TEMP ;
           INTERPRET TEMP ;
        END;
/*                                                                   */
/*   SOME SYMBOLICS MAY BE ASSIGNED VALUES CONTAINING OTHER          */
/*        SYMBOLICS. EX   COPYLIB=&HILVL..&C1SYS..COPYLIB            */
/*        RESOLVE THEM DOWN TO LOWER VALUE                           */
/*                                                                   */
     CALL SYMBOLICS_LOOP;
/*                                                                   */
/*   DO UNTIL (STEP_NAME = 'BKUPPROD') | (RETCODE > 0)               */
/*      CALL GET_NEXT_RECORD ;                                       */
/*      END;  /* DO UNTIL ...  */                                    */
/*                                                                   */
/*   DO UNTIL (DD_NAME = 'O'      )  | (RETCODE > 0)                 */
/*      CALL GET_NEXT_RECORD ;                                       */
/*      END;  /* DO UNTIL ...  */                                    */
/*                                                                    */
/*   IF RETCODE = 0 THEN,                                             */
/*      CALL PROCESS_DSN PROCREC.1 1 ;  /* RECORD CONCAT COUNT */     */
/*                                                                   */
     "EXECIO 0 DISKR PROCESSR (FINIS" ;
/*                                                                    */
/*   REPORT ...........                                               */
/*                                                                    */
/*   IF Q = NEVERQ THEN,                                              */
        CALL REPORT_SYMBOLS;
     DELSTACK;
     NEWSTACK;
/*                                                                   */
     RETURN ;
/*                                                                    */
   SYMBOLICS_LOOP:
     SA= '*ENTERING SYMBOLICS_LOOP' ;
     VARIABLES = VARIABLES ' ' ;
     SA= 'VARABLES=' VARIABLES ;
     SA= 'WORDS IN VARIABLES=' WORDS(VARIABLES) ;
     VAR_FLAGS = COPIES(' N',WORDS(VARIABLES)) ;
/*                                                                    */
     DO VAR1 = 1 TO WORDS(VARIABLES)
        DO VARIABLE# = 1 TO WORDS(VARIABLES)
           IF WORD(VAR_FLAGS,VARIABLE#) = 'N' THEN,
              DO
              SYM_NAME = WORD(VARIABLES,VARIABLE#) ;
              SA= 'STILL UNRESOLVED IS VARIABLE ' SYM_NAME
              CALL RESOLVE_SYMBOLIC ;
              END;  /* IF WORD(VAR_FLAGS,VARIABLE#) = 'N' THEN */
/*                                                                    */
        END ;  /* DO VARIABLE# = 1 TO WORDS(VARIABLES) */
        UNDONE = POS('N',VAR_FLAGS) ;
        IF UNDONE = 0 THEN LEAVE;
        END ;  /* DO VAR1 = 1 TO WORDS(VARIABLES) */
     SA= '**RESOLVED**' ;
     RETURN ;
/*                                                                    */
   RESOLVE_SYMBOLIC:
     SA= '*ENTERING  RESOLVE_SYMBOLIC' ;
     POSITION = 1 ;
     DO FOREVER ;
        TEMP      = 'SYM_VALU = ' SYM_NAME ;
        INTERPRET TEMP ;
        SA= '***' SYM_NAME '=' SYM_VALU 'POSITION=' POSITION ;
        POSITION = POS("&",SYM_VALU,POSITION) ;
        SUBSTRINGING = 'N' ;  /* ASSUME NO UNTIL PROVEN YES */
        IF POSITION = 0 | LENGTH(SYM_VALU) < 2 THEN,
           DO
           IF SYM_NAME /= 'TEMP_DSN' THEN,
              DO
              PLACE = WORDINDEX(VAR_FLAGS,VARIABLE#);
              VAR_FLAGS =OVERLAY('Y',VAR_FLAGS,PLACE) ;
              END;
           LEAVE;
           END ; /* IF POSITION ...  */
        ELSE,
           DO
           POSITION_PERIOD = POS(".",SYM_VALU,POSITION) ;
           POSITION_COMMA  = POS(",",SYM_VALU,POSITION) ;
           POSITION_BLANK  = POS(" ",SYM_VALU,POSITION) ;
           POSITION_QUOTN  = POS("'",SYM_VALU,POSITION) ;
           POSITION_QUOTD  = POS('"',SYM_VALU,POSITION) ;
           POSITION_AMPER  = POS('&',SYM_VALU,POSITION+1) ;
           POSITION_PAREN  = POS("(",SYM_VALU,POSITION) ;
           POSITION_END    = LENGTH(SYM_VALU) + 1 ;
           IF POSITION_PERIOD > 0 &,
              POSITION_PERIOD < POSITION_END THEN,
              POSITION_END = POSITION_PERIOD ;
           IF POSITION_COMMA > 0 &,
              POSITION_COMMA < POSITION_END THEN,
              POSITION_END = POSITION_COMMA ;
           IF POSITION_BLANK > 0 &,
              POSITION_BLANK < POSITION_END THEN,
              POSITION_END = POSITION_BLANK ;
           IF POSITION_QUOTN > 0 &,
              POSITION_QUOTN < POSITION_END THEN,
              POSITION_END = POSITION_QUOTN ;
           IF POSITION_QUOTD > 0 &,
              POSITION_QUOTD < POSITION_END THEN,
              POSITION_END = POSITION_QUOTD ;
           IF POSITION_AMPER > 0 &,
              POSITION_AMPER < POSITION_END THEN,
              POSITION_END = POSITION_AMPER ;
           SA= SUBSTR(SYM_VALU,(POSITION_PAREN+1),1) ;
   /*  DATATYPE(SUBSTR(SYM_VALU,(POSITION_PAREN+1),1)) /= 'NUM' &, */
           IF POSITION_PAREN > 0 &,
              POSITION_PAREN < POSITION_END THEN,
              DO
              POSITION_END = POSITION_PAREN ;
              TEMP = SUBSTR(SYM_VALU,POSITION_PAREN) ;
              TEMP = TRANSLATE(TEMP,' ',',()');
              IF WORDS(TEMP) > 1 THEN,
                 DO
                 SUBSTRING_POS = WORD(TEMP,1) ;
                 SUBSTRING_LEN = WORD(TEMP,2) ;
                 IF DATATYPE(SUBSTRING_POS) = 'NUM' &,
                    DATATYPE(SUBSTRING_LEN) = 'NUM' THEN,
                       SUBSTRINGING = 'Y' ;
                 END ;  /* IF WORDS(TEMP) > 1 THEN  */
              END ;  /* IF POSITION_PAREN > 0 & ... */
           TEMP_LEN = POSITION_END - POSITION ;
           INCL_NAME = SUBSTR(SYM_VALU,POSITION,TEMP_LEN) ;
           INCL_NAME = STRIP(INCL_NAME,B,'&') ;
           INCL_NAME = STRIP(INCL_NAME,T,')') ;
           INCL_NAME = STRIP(INCL_NAME,T,'(') ;
           ENTRY     = WORDPOS(INCL_NAME,VARIABLES) ;
           IF ENTRY > 0 THEN,
              ENTRY_RESOLVED = WORD(VAR_FLAGS,ENTRY);
           ELSE,
           IF SUBSTR(INCL_NAME,1,2) = 'C1' THEN,
              DO
              SIGNAL ON SYNTAX ;
              IF DATATYPE(INCL_NAME,S) = 0 THEN CALL SYNTAX;
              ELSE,
              IF INCL_NAME = VALUE(INCL_NAME) THEN,
                 INCL_NAME = '$'INCL_NAME;
              ENTRY_RESOLVED = 'Y' ;
              END ;
           ELSE,
              ENTRY_RESOLVED = 'N' ;
           IF ENTRY_RESOLVED = 'Y' THEN,
              DO
              TEMP      = "INCL_VALU ="INCL_NAME ;
              INTERPRET TEMP ;
              IF SUBSTRINGING = 'Y' THEN,
               DO
               POSITION_END = POS(")",SYM_VALU,POSITION) + 1 ;
               TEMP_LEN = POSITION_END - POSITION ;
               INCL_VALU = SUBSTR(INCL_VALU,SUBSTRING_POS,SUBSTRING_LEN)
               END;   /* IF SUBSTRINGING = 'Y' THEN */
              WORK_STRING = SYM_NAME "= '"SYM_VALU;
              SAY 'SUBSTITUTING FROM: ' WORK_STRING;
              IF SUBSTR(SYM_VALU,POSITION_END,1) = '.' &,
                 SUBSTRINGING /= 'Y' then,
                 DO
                 HEADER   = SUBSTR(SYM_VALU,1,POSITION_END-1);
                 NEXTCHAR = SUBSTR(SYM_VALU,POSITION_END+1,1) ;
                 TRAILER  = SUBSTR(SYM_VALU,POSITION_END+2);
                 IF NEXTCHAR = '.' THEN,
                    TRAILER  = STRIP(TRAILER,L,'.');
                 INCL_VALU = STRIP(INCL_VALU,L,'.');
                 SYM_VALU = HEADER || NEXTCHAR || TRAILER ;
                 END;
              WORK_STRING = SYM_NAME "= '"SYM_VALU;
              WORK_STRING = SYM_NAME "= '",
                          || SUBSTR(SYM_VALU,1,POSITION -1),
                          || INCL_VALU;
/*                                                                    */
              IF (POSITION + TEMP_LEN) < LENGTH(SYM_VALU) THEN,
                 WORK_STRING = WORK_STRING,
                          || SUBSTR(SYM_VALU,POSITION_END)"'";
              ELSE,
                 WORK_STRING = WORK_STRING || "'" ;
              SAY 'SUBSTITUTING TO  : ' WORK_STRING;
              INTERPRET WORK_STRING ;
              POSITION = 1 ;
              ITERATE ;
              END; /* IF ENTRY_RESOLVED.... */
           ELSE,
              DO   /* CANNOT RESOLVE WO FIRST RESOLVING ANOTHER */
              LEAVE;
              END ; /* IF POSITION ...  */
           END ; /* ELSE  .........  */
        END ;  /* DO FOREVER */
     RETURN ;
/*                                                                    */
SYNTAX:
  SAY "===>>>SYNTAX-ERROR:"INCL_NAME"="INCL_VALU;
  RETURN;
/*                                                                    */
REPORT_SYMBOLS:
     SA= '*ENTERING  REPORT_SYMBOLS ' ;
/*                                                                    */
/*   REPORT CHANGES ...                                               */
/*                                                                    */
     PUSH '**ENVIRON='C1ENVMNT 'STG='C1STGNUM 'SYS='C1SYSTEM,
        'SUBS='C1SU 'TYPE='C1ELTYPE 'PRCGRP='C1PRGRP ;
     "EXECIO 1 DISKW REPORT  ";
/*                                                                    */
/*   REPORT CHANGES TO THE SYSLIB CONCATENATION AT THE CMP STEP       */
/*       - OR -                                                       */
/*   REPORT CHANGES TO THE USERLIB CONCATENATIONS @    CMP STEP       */
/*                                                                    */
     PUSH '  SYSLIB/USERLIB CONCATENATIONS AT THE CMP STEP: ' ;
     "EXECIO 1 DISKW REPORT  ";
     IF LNG= 'CPP' | LNG= 'C39' THEN,
        THIS_LIST = USERLIB_CONCATENATION ;
     ELSE,
        THIS_LIST = CMP_SYSLIB_CONCATENATION ;
     SYMBOL_COUNT = WORDS(THIS_LIST) ;
     DO S# = 1 TO SYMBOL_COUNT
        SYM_NAME = WORD(THIS_LIST,S#) ;
        IF WORDPOS(SYM_NAME,VARIABLES) = 0 THEN ITERATE ;
        TEMP  = 'SYM_VALU =' SYM_NAME ;
        INTERPRET TEMP;
        SYM_NAME = SUBSTR(SYM_NAME'        ',1,8) ;
        PUSH '         SYMBOL 'SYM_NAME'="'SYM_VALU'"' ;
        "EXECIO 1 DISKW REPORT  ";
/*      TEMP  = 'DROP ' SYM_NAME ;                                    */
/*      INTERPRET TEMP;                                               */
     END ; /* DO S# = 1 TO SYMBOL_COUNT */
/*                                                                    */
/*   REPORT CHANGES TO THE SYSLIB CONCATENATION AT THE LNK STEP       */
/*                                                                    */
     PUSH '  SYSLIB CONCATENATIONS AT THE LNK STEP: ' ;
     "EXECIO 1 DISKW REPORT  ";
     SYMBOL_COUNT = WORDS(LNK_SYSLIB_CONCATENATION) ;
     DO S# = 1 TO SYMBOL_COUNT
        SYM_NAME = WORD(LNK_SYSLIB_CONCATENATION,S#) ;
        IF WORDPOS(SYM_NAME,VARIABLES) = 0 THEN ITERATE ;
        TEMP  = 'SYM_VALU =' SYM_NAME ;
        INTERPRET TEMP;
        SYM_NAME = SUBSTR(SYM_NAME'        ',1,8) ;
        PUSH '         SYMBOL 'SYM_NAME'="'SYM_VALU'"' ;
        "EXECIO 1 DISKW REPORT  ";
/*      TEMP  = 'DROP ' SYM_NAME ;                                    */
/*      INTERPRET TEMP;                                               */
     END ; /* DO S# = 1 TO SYMBOL_COUNT */
/*                                                                    */
/*   REPORT CHANGES TO THE SYSOBJ CONCATENATION AT THE LNK STEP       */
/*                                                                    */
     PUSH '  SYSOBJ CONCATENATIONS AT THE LNK STEP: ' ;
     "EXECIO 1 DISKW REPORT  ";
     SYMBOL_COUNT = WORDS(LNK_OBJLIB_CONCATENATION) ;
     DO S# = 1 TO SYMBOL_COUNT
        SYM_NAME = WORD(LNK_OBJLIB_CONCATENATION,S#) ;
        IF WORDPOS(SYM_NAME,VARIABLES) = 0 THEN ITERATE ;
        TEMP  = 'SYM_VALU =' SYM_NAME ;
        INTERPRET TEMP;
        SYM_NAME = SUBSTR(SYM_NAME'        ',1,8) ;
        PUSH '         SYMBOL 'SYM_NAME'="'SYM_VALU'"' ;
        "EXECIO 1 DISKW REPORT  ";
/*      TEMP  = 'DROP ' SYM_NAME ;                                    */
/*      INTERPRET TEMP;                                               */
     END ; /* DO S# = 1 TO SYMBOL_COUNT */
/*                                                                    */
/*   REPORT ALL OTHER SYMBOLIC VALUES                                 */
/*                                                                    */
     PUSH '  OTHER SYMBOLIC VALUES : ' ;
     "EXECIO 1 DISKW REPORT  ";
     SYMBOL_COUNT = WORDS(VARIABLES) ;
     DO S# = 1 TO SYMBOL_COUNT
        SYM_NAME = WORD(VARIABLES,S#) ;
        IF WORDPOS(SYM_NAME,THIS_LIST) > 0 THEN ITERATE ;
        IF WORDPOS(SYM_NAME,LNK_SYSLIB_CONCATENATION) > 0 THEN ITERATE ;
        IF WORDPOS(SYM_NAME,LNK_OBJLIB_CONCATENATION) > 0 THEN ITERATE ;
        TEMP  = 'SYM_VALU =' SYM_NAME ;
        INTERPRET TEMP;
        SYM_NAME = SUBSTR(SYM_NAME'        ',1,8) ;
        PUSH '         SYMBOL 'SYM_NAME'="'SYM_VALU'"' ;
        "EXECIO 1 DISKW REPORT  ";
/*      TEMP  = 'DROP ' SYM_NAME ;                                    */
/*      INTERPRET TEMP;                                               */
     END ; /* DO S# = 1 TO SYMBOL_COUNT */
/*                                                                    */
     RETURN;
/*                                                                    */
/*   READ A RECORD FROM THE PROCESSOR ITSELF                          */
/*                                                                    */
GET_NEXT_RECORD :
     "EXECIO 1 DISKR PROCESSR (STEM" PROCREC.
     RETCODE = RC ;
     SA= 'RECORD=' PROCREC.1 ;
     IF RETCODE > 0 THEN RETURN ;
     IF SUBSTR(PROCREC.1,1,3) = '//*' THEN SIGNAL GET_NEXT_RECORD ;
     TEMP_STR = STRIP(SUBSTR(PROCREC.1,3,4)) ;
     IF LENGTH(TEMP_STR) > 0 THEN,
        DO
        DD_NAME = TEMP_STR ;
        LONG_DD_NAME = WORD(SUBSTR(PROCREC.1,3),1) ;
        END;
     IS_IT_STEP = POS('PGM=',PROCREC.1);
     IF WORD(SUBSTR(PROCREC.1,3),1) = 'IF' THEN IS_IT_STEP = 1 ;
     IF IS_IT_STEP > 0 THEN,
        DO
        LONG_STEP_NAME = STRIP(SUBSTR(PROCREC.1,3,8)) ;
        STEP_NAME = WORD(SUBSTR(PROCREC.1,3),1) ;
        PGM_NAME = SUBSTR(PROCREC.1,(IS_IT_STEP+4));
        PGM_NAME = TRANSLATE(PGM_NAME,' ',',');
        PGM_NAME = WORD(PGM_NAME,1);
        SA= 'PGM_NAME =' PGM_NAME ;
        END ; /* IF IS_IT_STEP  .... */
     IF RETCODE > 0 THEN
        DO
        DD_NAME = '?END' ;
        LONG_DD_NAME = '?END' ;
        LONG_STEP_NAME = '?END' ;
        STEP_NAME = '?END' ;
        END;
     IF STRIP(SUBSTR(PROCREC.1,3,8)) = 'SYSLMOD' THEN,
        DO
          POSITION = POS('DSN=',PROCREC.1) ;
          TEMP_STR = SUBSTR(PROCREC.1,POSITION+4) ;
          TEMP_STR = TRANSLATE(TEMP_STR,' ','(');
          TEMP_STR = WORD(TEMP_STR,1) ;
          IF FOUND_1ST_SYSLMOD = 0 THEN ,
             DO
             SYSLMOD = TEMP_STR ;
             FOUND_1ST_SYSLMOD = 1 ;
             END;  /* IF FOUND_1ST_SYSLMOD ... */
          ELSE,
          IF TEMP_STR /= SYSLMOD & CONTINUE_OUT = 'OK' THEN,
             DO
             SYSLMOD_OVERRIDE = '        ',
              "SYMBOL "STRIP(SYSLMOD,L,'&')" = '"TEMP_STR"'" ;
             END; /* IF TEMP_STR ... */
        END;   /*  IF STRIP(SUBSTR(PROCREC.1,3,8)) = 'SYSLMOD' */
        ELSE,
     IF STRIP(SUBSTR(PROCREC.1,3,8)) = 'DBRMLIB' THEN,
        DO
          POSITION = POS('DSN=',PROCREC.1) ;
          TEMP_STR = SUBSTR(PROCREC.1,POSITION+4) ;
          TEMP_STR = TRANSLATE(TEMP_STR,' ','(');
          TEMP_STR = WORD(TEMP_STR,1) ;
          IF FOUND_1ST_DBRMLIB = 0 THEN ,
             DO
             DBRMLIB = TEMP_STR ;
             FOUND_1ST_DBRMLIB = 1 ;
             END;  /* IF FOUND_1ST_DBRMLIB ... */
          ELSE,
          IF TEMP_STR /= DBRMLIB & CONTINUE_OUT = 'OK' THEN,
             DO
             DBRMLIB_OVERRIDE = '        ',
              "SYMBOL "STRIP(DBRMLIB,L,'&')" = '"TEMP_STR"'" ;
             END; /* IF TEMP_STR ... */
        END;   /*  IF STRIP(SUBSTR(PROCREC.1,3,8)) = 'DBRMLIB' */
     RETURN;
/*                                                                    */
     RETURN;
/*                                                                    */
PROCESS_DSN:
     ARG RECORD;
/*                                                                    */
     PLACE = POS('DSN=',RECORD);
     IF PLACE = 0 THEN RETURN 1 ;
     PLACE = PLACE + 4;   /* MARKS START OF DATASET NAME */
     PLACE2  = POS(',',SUBSTR(RECORD,PLACE)) ;
     PLACE2A = POS(' ',SUBSTR(RECORD,PLACE)) ;
     SELECT
        WHEN PLACE2A = 0        THEN,
           PLACE_END = PLACE2 - 1;
        WHEN PLACE2  = 0        THEN,
           PLACE_END = PLACE2A - 1;
        WHEN PLACE2  < PLACE2A  THEN,
           PLACE_END = PLACE2 - 1;
        OTHERWISE              PLACE_END = PLACE2A - 1;
        END;
     TEMP_DSN = SUBSTR(RECORD,PLACE,PLACE_END) ;
     TEMP_DSN = STRIP(TEMP_DSN);
     SYM_NAME= 'TEMP_DSN' ;
     CALL RESOLVE_SYMBOLIC;
/*                                                                    */
     PUSH  '**ENVIRON='C1ENVMNT 'STAGE='C1STAGE,
             ' SYSTEM='C1SYSTEM 'TYPE='C1ELTYPE 'PROCGROUP='C1PRGRP,
             'BACKUP-DATASET='SYM_VALU,
             'INPUT_REC='INPUT_REC ;
     "EXECIO 1 DISKW REPORT   "      ;
/*                                                                    */
     RETURN;