/*************************** MIADSUMR ******************************/ DCL SPCPTR .PARM1 PARM; DCL DD NUMBERS PKD(15,5) BAS(.PARM1); DCL SPCPTR .PARM2 PARM; DCL DD WANTED-SUM PKD(15,5) BAS(.PARM2); DCL SPCPTR .PARM3 PARM; DCL DD PREV-LEVEL BIN(4) BAS(.PARM3); DCL OL PARMS(.PARM1, .PARM2, .PARM3) PARM EXT MIN(2); /*--------------------------------/*------------------------*/ DCL SPCPTR .ARG3 AUTO; /* THE STORAGE ATTRIBUTES */ DCL DD CUR-LEVEL BIN(4) AUTO; /* 'AUTO' AND 'STAT' ARE */ DCL DD NBR-OF-PARMS BIN(2) AUTO; /* CRUCIAL TO THE WORKING */ DCL DD VALUES(99) BIN(4) STAT; /* OF THIS PROGRAM. */ DCL DD COUNT ZND(10,0) STAT; /* */ DCL DD COMBS ZND(10,0) STAT; /* */ /*--------------------------------/*------------------------*/ DCL OL MIADSUMR (.PARM1, .PARM2, .ARG3) ARG; DCL SYSPTR .MIADSUMR INIT("MIADSUMR", TYPE(PGM)); ENTRY * (PARMS) EXT; SETSPP .ARG3, CUR-LEVEL; STPLLEN NBR-OF-PARMS; CMPNV(B) NBR-OF-PARMS, 2/NEQ(THERE-AFTER); FIRST-TIME: CPYNV COUNT, 0; CPYNV COMBS, 0; CPYNV(B) CUR-LEVEL, 1/POS(=+2); THERE-AFTER: ADDN CUR-LEVEL, PREV-LEVEL, 1;: CMPNV(B) CUR-LEVEL, NUMBERS/HI(SUM-VALUES); CPYNV VALUES(CUR-LEVEL), 0; ADD-LOOP: CMPNV(B) VALUES(CUR-LEVEL), WANTED-SUM/HI(DONE); CALLX .MIADSUMR, MIADSUMR, *; ADDN(SB) VALUES(CUR-LEVEL), 1/POS(ADD-LOOP); DONE: CMPNV(B) NBR-OF-PARMS, 2/NEQ(RETURN); CPYBLAP MSG-TEXT, COUNT, " "; CPYBLA MSG-TEXT(16:10), COMBS; CALLI SHOW-MESSAGE, *, .SHOW-MESSAGE; RETURN: RTX *; DCL DD I BIN(4); DCL DD SUM BIN(4); SUM-VALUES: CMPNV(B) NUMBERS, 0/EQ(DONE); ADDN(S) COMBS, 1; CPYNV SUM, 0; CPYNV I, 1; ADD-TO-SUM: CMPNV(B) I, NUMBERS/HI(COUNT-IF-MATCH); ADDN(S) SUM, VALUES(I); ADDN(SB) I, 1/POS(ADD-TO-SUM); COUNT-IF-MATCH: CMPNV(B) SUM, WANTED-SUM/NEQ(DONE); ADDN(SB) COUNT, 1/POS(DONE); %INCLUDE SHOWMSG PEND; /*************************** MIADSUMX ******************************/ DCL SPCPTR .PARM1 PARM; DCL DD NUMBERS PKD(15,5) BAS(.PARM1); DCL SPCPTR .PARM2 PARM; DCL DD WANTED-SUM PKD(15,5) BAS(.PARM2); /*--------------------------------/*------------------------*/ DCL DD PREV-LEVEL BIN(4) PARM; /* THE STORAGE ATTRIBUTES */ DCL DD CUR-LEVEL BIN(4) AUTO; /* 'AUTO', 'STAT', AND */ DCL DD NBR-OF-PARMS BIN(2) AUTO; /* 'PARM' ARE CRUCIAL TO */ DCL DD VALUES(99) BIN(4) STAT; /* THE WORKING OF THIS */ DCL DD COUNT ZND(10,0) STAT; /* PROGRAM. */ DCL DD COMBS ZND(10,0) STAT; /* */ /*--------------------------------/*------------------------*/ DCL OL MIADSUMX (.PARM1, .PARM2, CUR-LEVEL) ARG; DCL SYSPTR .MIADSUMX INIT("MIADSUMX", TYPE(PGM)); DCL OL PARMS(.PARM1, .PARM2, PREV-LEVEL) PARM EXT MIN(2); ENTRY * (PARMS) EXT; STPLLEN NBR-OF-PARMS; CMPNV(B) NBR-OF-PARMS, 2/NEQ(THERE-AFTER); FIRST-TIME: CPYNV COUNT, 0; CPYNV COMBS, 0; CPYNV(B) CUR-LEVEL, 1/POS(=+2); THERE-AFTER: ADDN CUR-LEVEL, PREV-LEVEL, 1;: CMPNV(B) CUR-LEVEL, NUMBERS/HI(SUM-VALUES); CPYNV VALUES(CUR-LEVEL), 0; ADD-LOOP: CMPNV(B) VALUES(CUR-LEVEL), WANTED-SUM/HI(DONE); CALLX .MIADSUMX, MIADSUMX, *; ADDN(SB) VALUES(CUR-LEVEL), 1/POS(ADD-LOOP); DONE: CMPNV(B) NBR-OF-PARMS, 2/NEQ(RETURN); CPYBLAP MSG-TEXT, COUNT, " "; CPYBLA MSG-TEXT(16:10), COMBS; CALLI SHOW-MESSAGE, *, .SHOW-MESSAGE; RETURN: RTX *; DCL DD I BIN(4); DCL DD SUM BIN(4); SUM-VALUES: CMPNV(B) NUMBERS, 0/EQ(DONE); ADDN(S) COMBS, 1; CPYNV SUM, 0; CPYNV I, 1; ADD-TO-SUM: CMPNV(B) I, NUMBERS/HI(COUNT-IF-MATCH); ADDN(S) SUM, VALUES(I); ADDN(SB) I, 1/POS(ADD-TO-SUM); COUNT-IF-MATCH: CMPNV(B) SUM, WANTED-SUM/NEQ(DONE); ADDN(SB) COUNT, 1/POS(DONE); %INCLUDE SHOWMSG PEND; /*************************** MIADSUMI ******************************/ DCL SPCPTR .PARM1 PARM; DCL DD NUMBERS PKD(15,5) BAS(.PARM1); DCL SPCPTR .PARM2 PARM; DCL DD WANTED-SUM PKD(15,5) BAS(.PARM2); DCL OL PARMS(.PARM1, .PARM2) PARM EXT MIN(2); DCL DD COUNT ZND(10,0); DCL DD COMBS ZND(10,0); DCL DD VALUE (99) BIN(4); DCL DD LEVEL BIN(4); ENTRY * (PARMS) EXT; CPYNV COUNT, 0; CPYNV COMBS, 0; CPYNV LEVEL, 0; FOR-EACH-LEVEL: ADDN(S) LEVEL, 1; CMPNV(B) LEVEL, NUMBERS/HI(SUM-VALUES); CPYNV VALUE (LEVEL),-1; CONTINUE: ADDN(S) VALUE (LEVEL), 1; CMPNV(B) VALUE (LEVEL), WANTED-SUM/NHI(FOR-EACH-LEVEL); MORE: SUBN(SB) LEVEL, 1/POS(CONTINUE); DONE: CPYBLAP MSG-TEXT, COUNT, " "; CPYBLA MSG-TEXT(16:10), COMBS; CALLI SHOW-MESSAGE, *, .SHOW-MESSAGE; RTX *; DCL DD I BIN(4); DCL DD SUM BIN(4); SUM-VALUES: CMPNV(B) NUMBERS, 0/EQ(MORE); ADDN(S) COMBS, 1; CPYNV SUM, 0; CPYNV I, 1; ADD-TO-SUM: CMPNV(B) I, NUMBERS/HI(COUNT-IF-MATCH); ADDN(S) SUM, VALUE (I); ADDN(SB) I, 1/POS(ADD-TO-SUM); COUNT-IF-MATCH: CMPNV(B) SUM, WANTED-SUM/NEQ(MORE); ADDN(SB) COUNT, 1/POS(MORE); %INCLUDE SHOWMSG PEND;