カタログ式プロシージャー IBMZC を使用して簡単な PL/I プログラムをコンパイルし、 オブジェクト・モジュールを EXLIB という名前の新規ライブラリーに 入れる例を、図 20 に示します。 新規ライブラリーを定義し、 オブジェクト・モジュールを指名する DD ステートメントは、 カタログ式プロシージャー内の DD ステートメント SYSLIN を 指定変更します。(PL/I プログラムは、関数プロシージャーであり、TIME 組み込み関数で 作成される文字ストリングの形に 2 つの値が指定されている場合、 ミリ秒単位でその値の差を戻します。)
カタログ式プロシージャー IBMZCL を使用して PL/I プログラムを コンパイルおよびリンク・エディットし、 ロード・モジュールを既存ライブラリー HPU8.CCLM に入れる例を、図 21 に 示します。
//OPT10#1 JOB
//TR EXEC IBMZC
//PLI.SYSLIN DD UNIT=SYSDA,DSNAME=HPU8.EXLIB(ELAPSE),
// SPACE=(TRK,(1,,1)),DISP=(NEW,CATLG)
//PLI.SYSIN DD *
ELAPSE: PROC(TIME1,TIME2);
DCL (TIME1,TIME2) CHAR(9),
H1 PIC '99' DEF TIME1,
M1 PIC '99' DEF TIME1 POS(3),
MS1 PIC '99999' DEF TIME1 POS(5),
H2 PIC '99' DEF TIME2,
M2 PIC '99' DEF TIME2 POS(3),
MS2 PIC '99999' DEF TIME2 POS(5),
ETIME FIXED DEC(7);
IF H2<H1 THEN H2=H2+24;
ETIME=((H2*60+M2)*60000+MS2)-((H1*60+M1)*60000+MS1);
RETURN(ETIME);
END ELAPSE;
/* //OPT10#2 JOB
//TRLE EXEC IBMZCL
//PLI.SYSIN DD *
MNAME: PROC OPTIONS(MAIN);
.
.
.
program
.
.
.
END MNAME;
/*
//LKED.SYSLMOD DD DSNAME=HPU8.CCLM(DIRLIST),DISP=OLDPL/I プログラムを使って、ライブラリーのメンバー内の 1 つ以上の レコードを追加または削除するには、 そのライブラリー内の別の部分でそのメンバーを全部作成し直さなければなりません。 メンバーがそれまで占有していたスペースは再度使用することができないため、これ はあまり経済的な提案とは言えません。 ユーザーの PL/I プログラム内でファイルを 2 つ使う必要が ありますが、2 つとも同じ DD ステートメントと 関連付けることができます。図 23 に示すプログラムは、図 22 の プログラムで作成されたメンバーを更新します。 このプログラムは、ブランクだけのレコードを除き、 元のメンバーのレコードをすべてコピーします。
//OPT10#3 JOB
//TREX EXEC IBMZCBG
//PLI.SYSIN DD *
NMEM: PROC OPTIONS(MAIN);
DCL IN FILE RECORD SEQUENTIAL INPUT,
OUT FILE RECORD SEQUENTIAL OUTPUT,
P POINTER,
IOFIELD CHAR(80) BASED(P),
EOF BIT(1) INIT('0'B);
OPEN FILE(IN),FILE (OUT);
ON ENDFILE(IN) EOF='1'B;
READ FILE(IN) SET(P);
DO WHILE (¬EOF);
PUT FILE(SYSPRINT) SKIP EDIT (IOFIELD) (A);
WRITE FILE(OUT) FROM(IOFIELD);
READ FILE(IN) SET(P);
END;
CLOSE FILE(IN),FILE(OUT);
END NMEM;
/*
//GO.OUT DD UNIT=SYSDA,DSNAME=HPU8.ALIB(NMEM),
// DISP=(NEW,CATLG),SPACE=(TRK,(1,1,1)),
// DCB=(RECFM=FB,BLKSIZE=3600,LRECL=80)
//GO.IN DD *
MEM: PROC OPTIONS(MAIN);
/* this is an incomplete dummy library member */ //OPT10#4 JOB
//TREX EXEC IBMZCBG
//PLI.SYSIN DD *
UPDTM: PROC OPTIONS(MAIN);
DCL (OLD,NEW) FILE RECORD SEQUENTIAL,
EOF BIT(1) INIT('0'B),
DATA CHAR(80);
ON ENDFILE(OLD) EOF = '1'B;
OPEN FILE(OLD) INPUT,FILE(NEW) OUTPUT TITLE('OLD');
READ FILE(OLD) INTO(DATA);
DO WHILE (¬EOF);
PUT FILE(SYSPRINT) SKIP EDIT (DATA) (A);
IF DATA=' ' THEN ;
ELSE WRITE FILE(NEW) FROM(DATA);
READ FILE(OLD) INTO(DATA);
END;
CLOSE FILE(OLD),FILE(NEW);
END UPDTM;
/*
//GO.OLD DD DSNAME=HPU8.ALIB(NMEM),DISP=(OLD,KEEP)