MainframeSupports
tip uge 48/2000:

En af de mest irriterende ting ved PL/1 er, at man ikke kan kalde andre programmer dynamisk. Det betyder, at man altid skal linke en masse programmer sammen typisk med store LOAD-moduler som resultat. Man skal også holde styr på hvilke programmer, der er linket sammen, da man jo skal kunne relinke de rigtige programmer, når man har ændret i et program, der kaldes af andre programmer.

Man kan dog komme ovenstående til livs ved at benytte fetch-faciliteten. Men hvis man med samme kald vil kunne starte forskellige programmer afhængig af indholdet af en variabel, så er man ilde ude. Det kan COBOL klare, men PL/1 står fuldstændig af. Heldigvis er der råd for den slags. Følgende assembler-program kaldet DYNLINK kan benyttes:

DYNLINK  CSECT
         SAVE   (14,12),,*
         LR     12,15
         USING  DYNLINK,12
         LR     11,13
         LA     13,SAVEAREA
         ST     11,4(13)
         ST     13,8(11)
         L      1,0(1)
         LH     2,0(1)
         LA     15,20
         CH     2,=H'8'
         BNE    UD
         LA     2,2(1)
         LA     1,PARAM
         LINK   EPLOC=(2)
UD       L      13,4(13)
         RETURN (14,12),RC=(15)
PARAM    DC     A(DUMMY)
DUMMY    DC     H'0'
         DS     0F
SAVEAREA DS     9D
         END

Jeg forstår mig ikke ret meget på assembler, men tro mig, når jeg siger, at det virker. DYNLINK har visse begrænsninger. Det kan ikke overføre parametre til det program, som DYNLINK kalder. DYNLINK kan heller ikke klare at blive kaldt rekursivt, hverken direkte eller indirekte. Det eneste DYNLINK kan returnere til det kaldte program er standard MVS returkoden (indholdet af register 15).

DYNLINK benyttes på følgende måde fra et PL/1-program:

callany: PROC(parameter) OPTIONS(MAIN);

DCL parameter CHAR(100) VARYING;
DCL program_name CHAR(8) VARYING;
DCL dynlink EXTERNAL ENTRY OPTIONS(ASM INTER RETCODE);
DCL substr,pliretc,pliretv BUILTIN;

program_name = substr(parameter !! '        ', 1, 8);
CALL dynlink(program_name);
CALL pliretc(pliretv());

END callany;

Når man eksempelvis starter CALLANY med en EXEC PGM=CALLANY,PARM='/IEFBR14' vil IEFBR14 blive kaldt. DYNLINK er ligeglad med, hvilken slags program, det kalder, bare det er et eksekverbart LOAD-modul. Derfor kan CALLANY uden problemer starte et andet PL/1-hovedprogram. Af en eller anden grund forlanger DYNLINK at blive kaldt med en CHAR(8) VARYING, som altid skal indeholde præcis 8 tegn. Ellers returnerer DYNLINK med en returkode 20.

Sidste uges tip        Tip oversigten