ISREDIT MACRO       /* CARM0104 EDIT TEMP4(*)  */
 
/* 09/10/2007 CL Fenton Copied from CARM0004 to evaulate resources.
/* 11/30/2007 CL Fenton Corrected sort RC cond.  Removed comment commands.
/* 03/08/2017 CL Fenton Added process to remove duplicate records.
/* 05/23/2017 CL Fenton removed GROUPID user list processing (CARM0005),
/*            STS-017060.
/* 02/27/2018 CL Fenton Copied writing sep30 and racfpro records for
/*            rectype 1 to rectype 4.
/* 10/29/2020 CL Fenton Chgs made to remove resources where there is a
/*            more specific resource specified for the rule specified,
/*            STS-025101.
 
SET PGMNAME = &STR(CARM0104 10/29/20)
 
SET SYSPROMPT = OFF                /* CONTROL NOPROMPT          */
SET SYSFLUSH  = OFF                /* CONTROL NOFLUSH           */
SET SYSASIS   = ON                 /* CONTROL ASIS - caps off   */
 
/* ERROR ROUTINE */
ERROR DO
  SET RETURN_CODE = &LASTCC          /* SAVE LAST ERROR CODE */
  IF &LASTCC GE 16 THEN +
    WRITE &PGMNAME LASTCC = &LASTCC &ZERRLM
  RETURN
  END
 
/*******************************************/
/* VARIABLES ARE PASSED TO THIS MACRO      */
/* CONSLIST                                */
/* COMLIST                                 */
/* TERMPRO                                 */
/* TERMMSGS                                */
/* SORTPOS                                 */
/*******************************************/
 
SET RETURN_CODE = 0
 
ISPEXEC VGET ( +
  CONSLIST     +
  COMLIST      +
  SYMLIST      +
  TERMMSGS     +
  CARM0005     +
  TEMP5        +
  RACFRPT      +
  TYPERUN      +
  LISTGRP      +
  ) ASIS
 
SET RM04VGET = &RETURN_CODE
IF &RETURN_CODE NE 0 THEN DO
  WRITE &PGMNAME VGET RC = &RETURN_CODE  &ZERRSM
  WRITE &PGMNAME CONSLIST/&CONSLIST COMLIST/&COMLIST SYMLIST/&SYMLIST +
    TERMMSGS/&TERMMSGS
  WRITE &PGMNAME CARM0005/&CARM0005 TEMP5/&TEMP5 RACFRPT/&RACFRPT +
    TYPERUN/&TYPERUN LISTGRP/&LISTGRP
  SET RETURN_CODE = &RETURN_CODE + 16
  GOTO ERR_EXIT
  END
 
SET RETURN_CODE = 0
 
/*******************************************/
/* TURN ON MESSAGES                        */
/*******************************************/
 
ISREDIT (MEMBER) = MEMBER
ISREDIT NULLS OFF
ISREDIT CAPS OFF
 
SET OMEMBER = &MEMBER
 
SET BLANK = &STR( )
SET IND1  = &STR(  )
SET IND2  = &STR(    )
SET SEP30 = &STR(- - - - - - - - - - - - - - - )
 
SET LP = &STR((
SET RP = )
SET SPC = &STR(          )
SET SP80 = &STR(&SPC&SPC&SPC&SPC&SPC&SPC&SPC&SPC)
 
SET UZID_LIST = &STR(#)
ISREDIT (ENDER) = LINENUM .ZLAST
 
IF &ENDER LT 1 THEN +
  GOTO END_EDIT
 
SET SYSOUTTRAP = 3
SET ROW = 0
 
 
CHK_UZID: +
SET RETURN_CODE = 0
 
SET ROW = &ROW + 1
 
IF &ROW GT &ENDER THEN -
  GOTO SORT
 
ISREDIT CURSOR = &ROW 0
 
ISREDIT FIND 'GROUPID'
 
IF &RETURN_CODE NE 0 THEN +
  GOTO SORT
 
ISREDIT (ROW,COL) = CURSOR
 
ISREDIT (DATA) = LINE &ROW
 
SET UZID = &SUBSTR(54:61,&STR(&DATA))
 
IF &SYSINDEX(&STR(&UZID),&NRSTR(&UZID_LIST)) NE 0 THEN +
  GOTO CHK_UZID
 
SET UZID_LIST = &STR(&UZID_LIST.&UZID.#)
 
SET NAME = &STR(NAME=Unknown  )
SET RETURN_CODE = 0
 
SET CMD = &STR(LISTUSER &UZID)
&CMD
 
SET LISTU_RC = &RETURN_CODE
IF &RETURN_CODE = 0 THEN +
  DO
  IF &STR(U) = &SUBSTR(1,&NRSTR(&SYSOUTLINE1)) THEN +
    SET TEST1 = &NRSTR(&SYSOUTLINE1)
  IF &STR(U) = &SUBSTR(1,&NRSTR(&SYSOUTLINE2)) THEN +
    SET TEST1 = &NRSTR(&SYSOUTLINE2)
  IF &STR(U) = &SUBSTR(1,&NRSTR(&SYSOUTLINE3)) THEN +
    SET TEST1 = &NRSTR(&SYSOUTLINE3)
 
  SET XN = &SYSINDEX(&STR(NAME=),&NRSTR(&TEST1),1)
  SET XO = &SYSINDEX(&STR(OWNER=),&NRSTR(&TEST1),&XN)
 
  IF &XN GT 0 AND &XN LT &XO-1 THEN +
    SET NAME = &SUBSTR(&XN:&XO-1,&NRSTR(&TEST1))
 
  NEXT_AMPERSAND: +
  SET XA = &SYSINDEX(&SYSNSUB(0,&),&NRSTR(&NAME))
 
  IF &XA GT 0 THEN DO
    SET NL = &LENGTH(&NRSTR(&NAME))
    IF &XA EQ 1 THEN DO
      SET NAME = &SUBSTR(2:&NL,&NRSTR(&NAME))
      GOTO NEXT_AMPERSAND
      END
 
    IF &XA EQ &NL THEN DO
      SET NAME = &SUBSTR(1:&NL-1,&NRSTR(&NAME))
      GOTO NEXT_AMPERSAND
      END
 
    SET NAME = &SUBSTR(1:&XA-1,&NRSTR(&NAME))+
               &SUBSTR(&XA+1:&NL,&NRSTR(&NAME))
    GOTO NEXT_AMPERSAND
    END
 
  SET NAME = &SUBSTR(1:42,&STR(&NAME &SP80))
 
  ISREDIT X ALL
  ISREDIT FIND ALL '&UZID' 54
  SET CF = &STR('8GROUPID')
  SET CT = &STR('7 USERID')
  ISREDIT CHANGE &CF &CT ALL NX 45
 
  SET CF = &STR('                                          ')
  SET CT = &STR('&NAME')
  ISREDIT CHANGE &CF &CT ALL NX 83
  ISREDIT RESET
  GOTO CHK_UZID
  END
 
SET RETURN_CODE = 0
 
SET CMD = &STR(LISTGRP &UZID)
&CMD
 
SET LISTG_RC = &RETURN_CODE
IF &RETURN_CODE NE 0 THEN +
  DO
  SET NAME = &SUBSTR(1:42,&STR(NAME=Not found U=&LISTU_RC +
             G=&LISTG_RC &SP80))
 
  ISREDIT X ALL
  ISREDIT FIND ALL '&UZID' 54
  SET CF = &STR('8GROUPID')
  SET CT = &STR('5NOT_DEF')
  ISREDIT CHANGE &CF &CT ALL NX 45
 
  SET CF = &STR('                                          ')
  SET CT = &STR('&NAME')
  ISREDIT CHANGE &CF &CT ALL NX 83
  ISREDIT RESET
  END
 
GOTO CHK_UZID
 
 
SORT: +
ISREDIT (ENDER) = LINENUM .ZLAST
 
SET RETURN_CODE = 0
 
IF &ENDER GT 0 THEN DO
  ISREDIT SORT 1 62
 
  IF &RETURN_CODE GT 4 THEN DO    /* SORT_RC = 8 No records to sort
    WRITE &PGMNAME SORT_RC = &RETURN_CODE &MEMBER &ZERRSM
    END
  END
ELSE DO
  WRITE &PGMNAME &MEMBER no record in member.
  GOTO ERR_EXIT
  END
 
/*******************************************/
/* Remove duplicate records                */
/*******************************************/
DO CNT = 1 TO &ENDER
  ISREDIT (XSTAT) = XSTATUS &CNT
  IF &NRSTR(&XSTAT) EQ &STR(NX) THEN DO
    ISREDIT (DATA) = LINE &CNT
    ISREDIT EXCLUDE ALL "&NRSTR(&DATA)" 1
    ISREDIT XSTATUS &CNT = NX
    END
  END
ISREDIT DELETE ALL X
ISREDIT (ENDER) = LINENUM .ZLAST
SET RETURN_CODE = 0
 
/*******************************************/
/* Remove unneeded type 4 entries          */
/*******************************************/
NGLOBAL DATA CNT RETURN_CODE
DO CNT = 1 TO &ENDER
  ISREDIT (XSTAT) = XSTATUS &CNT
  IF &NRSTR(&XSTAT) EQ &STR(NX) THEN DO
    ISREDIT (DATA) = LINE &CNT
    IF &SUBSTR(45,&NRSTR(&DATA)) EQ 4 THEN DO
      SYSCALL CHECK_USER_RECS
      END
    END
  END
ISREDIT DELETE ALL X
ISREDIT (ENDER) = LINENUM .ZLAST
SET RETURN_CODE = 0
/*******************************************/
/* MAIN LOOP                               */
/*******************************************/
 
SET PREVPRO1 =
SET PREVPRO2 =
SET PREVUID  =
SET GROUP_LIST = &STR(#)
SET CURLINE = 0
 
 
LOOP_PROFILE: +
SET RETURN_CODE = 0
 
SET CURLINE = &CURLINE + 1
 
IF &CURLINE GT &ENDER THEN -
  GOTO END_EDIT
 
ISREDIT (DATA) = LINE &CURLINE
 
SET RACFPRO = &SUBSTR(1:44,&STR(&DATA))
SET RECTYPE = &SUBSTR(45,&STR(&DATA))
 
SELECT (&RECTYPE)
  WHEN (1) DO
    IF &STR(&PREVPRO1) NE &STR(&RACFPRO) AND +
       &STR(&PREVPRO1) NE &STR() THEN DO
      SET AC = &STR(&SEP30&SEP30&SEP30&SEP30)
      ISPEXEC LMPUT DATAID(&TEMP5) MODE(INVAR) DATALOC(AC) +
        DATALEN(&LENGTH(&STR(&AC))) MEMBER(&OMEMBER)
      END
    SET PREVPRO1 = &STR(&RACFPRO)
    SET PREVUID  =
    SET UNIV = &SUBSTR(46:&LENGTH(&STR(&DATA)),&STR(&DATA))
    SET AC = &STR(&RACFPRO &SP80)
    SET AC = &STR(&SUBSTR(1:53,&AC)&UNIV)
    ISPEXEC LMPUT DATAID(&TEMP5) MODE(INVAR) DATALOC(AC) +
      DATALEN(&LENGTH(&STR(&AC))) MEMBER(&OMEMBER)
    END
  WHEN (4) DO
/* COPIED INFORMATION FROM RECTYPE 1 BELOW */
    IF &STR(&PREVPRO1) NE &STR(&RACFPRO) AND +
       &STR(&PREVPRO1) NE &STR() THEN DO
      SET AC = &STR(&SEP30&SEP30&SEP30&SEP30)
      ISPEXEC LMPUT DATAID(&TEMP5) MODE(INVAR) DATALOC(AC) +
        DATALEN(&LENGTH(&STR(&AC))) MEMBER(&OMEMBER)
      SET PREVPRO1 = &STR(&RACFPRO)
      SET PREVUID  =
      SET AC = &STR(&RACFPRO)
      ISPEXEC LMPUT DATAID(&TEMP5) MODE(INVAR) DATALOC(AC) +
        DATALEN(&LENGTH(&STR(&AC))) MEMBER(&OMEMBER)
      END
/* COPIED INFORMATION FROM RECTYPE 1 ABOVE */
    SET DSN = &SUBSTR(55:97,&STR(&DATA))
    IF &SUBSTR(1:4,&STR(&DATA)) NE &STR(    ) THEN DO
      SET AC = &STR(&IND1&DSN)
      ISPEXEC LMPUT DATAID(&TEMP5) MODE(INVAR) DATALOC(AC) +
        DATALEN(&LENGTH(&STR(&AC))) MEMBER(&OMEMBER)
      END
    ELSE DO
      SET AC = &STR(&RACFPRO &SP80)
      SET AC = &STR(&SUBSTR(1:53,&AC)&DSN)
      ISPEXEC LMPUT DATAID(&TEMP5) MODE(INVAR) DATALOC(AC) +
        DATALEN(&LENGTH(&STR(&AC))) MEMBER(&OMEMBER)
      END
    END
  WHEN (5 OR 6 OR 7) DO
    SET UZID = &SUBSTR(54:61,&STR(&DATA))
    IF &STR(&PREVUID) NE &STR(&UZID) THEN DO
      SET PREVUID = &STR(&UZID)
      SET GRPUSR = &SUBSTR(46:62,&STR(&DATA))
      SET GRPACC = &SUBSTR(65:80,&STR(&DATA))
      SET NAME   = &SUBSTR(83:108,&STR(&DATA))
      SET AC = &STR(&IND2&GRPUSR                   )
      SET AC = &STR(&SUBSTR(1:22,&AC)&GRPACC &SP80)
      SELECT (&RECTYPE)
        WHEN (5) DO
          SET AC = &STR(&SUBSTR(1:39,&AC)USER=NOT_DEF* &SP80)
          SET AC = &STR(&SUBSTR(1:53,&AC)&NAME &SP80)
          SET AC = &STR(&SUBSTR(1:79,&AC)&RACFPRO )
          END
        WHEN (6) DO
          SET AC = &STR(&AC &SP80)
          SET AC = &STR(&SUBSTR(1:79,&AC)&RACFPRO )
          END
        WHEN (7) DO
          SET AC = &STR(&SUBSTR(1:39,&AC)USER=&UZID &SP80)
          SET AC = &STR(&SUBSTR(1:53,&AC)&NAME &SP80)
          SET AC = &STR(&SUBSTR(1:79,&AC)&RACFPRO )
          END
      END
      ISPEXEC LMPUT DATAID(&TEMP5) MODE(INVAR) DATALOC(AC) +
        DATALEN(&LENGTH(&STR(&AC))) MEMBER(&OMEMBER)
    END
  END
END
 
 
IF &RECTYPE NE 8 THEN   -
   GOTO LOOP_PROFILE
 
SET UZID = &SUBSTR(54:61,&STR(&DATA))
 
IF &STR(&PREVUID) EQ &STR(&UZID) THEN   -
   GOTO LOOP_PROFILE
 
IF &STR(&UZID) EQ &STR( ) THEN GOTO LOOP_PROFILE
 
SET PREVUID = &STR(&UZID)
 
SET GRPUSR = &SUBSTR(46:62,&STR(&DATA))
SET GRPACC = &SUBSTR(65:80,&STR(&DATA))
SET ACC1 = &SUBSTR(72:79,&STR(&DATA))
 
SET ACC1  = &ACC1
SET GROUP = &STR(G)
SET NAME  = &STR(NAME= )
 
NEXT_PROCESS: +
SET RETURN_CODE = 0
 
SET AC = &STR(&IND2&GRPUSR                 )
SET AC = &STR(&SUBSTR(1:22,&AC)&GRPACC     )
 
ISPEXEC LMPUT DATAID(&TEMP5) MODE(INVAR) DATALOC(AC) +
      DATALEN(&LENGTH(&STR(&AC))) MEMBER(&OMEMBER)
 
IF &STR(&ACC1) = &STR(NONE)    THEN GOTO LOOP_PROFILE
 
ISPEXEC VPUT ( +
  OMEMBER      +
  UZID         +
  GRPUSR       +
  GRPACC       +
  RACFPRO      +
  ) ASIS
 
SET RETURN_CODE = 0
 
/*ISPEXEC EDIT DATAID(&RACFRPT) MACRO(&CARM0005) MEMBER(&LISTGRP)
 
IF &RETURN_CODE GT 4 THEN DO
  WRITE &PGMNAME EDIT RACFRPT &LISTGRP RC = &RETURN_CODE  &ZERRSM
  END
 
GOTO LOOP_PROFILE
 
 
END_EDIT: +
SET RETURN_CODE = 0
 
ISPEXEC LMMADD DATAID(&TEMP5) MEMBER(&OMEMBER)
 
IF &RETURN_CODE EQ 4 THEN DO          /* MEMBER ALREADY EXISTS
  SET RETURN_CODE = 0
 
  ISPEXEC LMMREP DATAID(&TEMP5) MEMBER(&OMEMBER)
 
  IF &RETURN_CODE NE 0 THEN DO
    WRITE &PGMNAME LMMREP_TEMP5_RCODE = &RETURN_CODE &OMEMBER &ZERRSM
    END
  END
ELSE DO
  IF &RETURN_CODE NE 0 THEN +
    WRITE &PGMNAME LMMADD_TEMP5_RCODE = &RETURN_CODE &OMEMBER  &ZERRSM
  END
 
SET RETURN_CODE = 0
 
/*******************************************/
/* SAVE OUTPUT                             */
/*******************************************/
 
ERR_EXIT: +
IF &MAXCC GE 16 OR +
   &RETURN_CODE GT 0 THEN DO
  ISPEXEC VGET (ZISPFRC) SHARED
  IF &MAXCC GT &ZISPFRC THEN +
    SET ZISPFRC = &MAXCC
  ELSE +
    SET ZISPFRC = &RETURN_CODE
  ISPEXEC VPUT (ZISPFRC) SHARED
  WRITE &PGMNAME ZISPFRC = &ZISPFRC
  END
 
SET RM004RC = &RETURN_CODE
 
ISPEXEC VPUT ( +
  RM04VGET     +
  RM004RC      +
  ) ASIS
 
ISREDIT END
 
EXIT CODE(0)
 
 
/*******************************************/
/*  SYSCALL SUBROUTINES                    */
/*******************************************/
CHECK_USER_RECS: PROC 0
SET RETURN_CODE = 0
SET KEY1 = &SUBSTR(1:44,&NRSTR(&DATA))
DO X = 5 TO 8
  SET RETURN_CODE = 0
/*WRITE FIND FIRST "&NRSTR(&KEY1)&STR(&X)" 1*/
  ISREDIT FIND FIRST "&NRSTR(&KEY1)&STR(&X)" 1
  IF &RETURN_CODE = 0 THEN SET X = 8
  END
IF &RETURN_CODE = 0 THEN DO
  DO X = &LENGTH(&NRSTR(&DATA)) TO 1 BY -1 +
    UNTIL &SUBSTR(&X,&NRSTR(&DATA)) NE &STR( )
  END
  SET DATA = &SUBSTR(1:&X,&NRSTR(&DATA))
  ISREDIT SEEK ALL "&NRSTR(&DATA)" 1
  ISREDIT (A,B) = SEEK_COUNTS
  IF &B GT 1 THEN +
    ISREDIT XSTATUS &CNT = X
  END
END
