CL

157. ファイル名を乱数で自動発生させるには

CLPでも重なることのない乱数名のファイル名を生成したい場合がある。
C言語では簡単で「31.名前を乱数発生させる一時ファイルを QTEMP に作成するには ?」で
紹介したがそれと同じことをCLPでやってみよう。
_

[ 乱数名を発生させるCLP : TESTTMP ]

ソースはこちらから

0001.00              PGM                                                            
0002.00 /*************************************************************************/ 
0003.00 /* TESTTMP : TEMPNAM の自動発生                                          */ 
0004.00 /*                                                                       */ 
0005.00 /* CRTBNDCL PGM(OBJLIB/TESTTMP) SRCFILE(MYSRCLIB/QCLSRC) DFTACTGRP(*NO)  */ 
0006.00 /*   ACTGRP(*NEW) AUT(*ALL) DBGVIEW(*SOURCE)                             */ 
0007.00 /*                                                                       */ 
0008.00 /* [ 例 ] &TMPNAM = 'QTEMP/QACXCTNWQACXCTNWXD'                           */ 
0009.00 /*                                                                       */ 
0010.00 /*************************************************************************/ 
0011.00              DCL        VAR(&TMPPTR) TYPE(*PTR)                             
0012.00              DCL        VAR(&TMPNAM) TYPE(*CHAR) STG(*BASED) LEN(24) +      
0013.00                           BASPTR(&TMPPTR)                                   
0014.00              DCL        VAR(&NULL) TYPE(*CHAR) LEN(1) VALUE(X'00')          
0015.00              DCL        VAR(&FILE) TYPE(*CHAR) LEN(10)                      
0016.00                                                                             
0017.00              CALLPRC    PRC('tmpnam') PARM((&NULL)) RTNVAL(&TMPPTR)         
0018.00              CHGVAR     VAR(&FILE) VALUE(%SST(&TMPNAM 7 10))                
0019.00              ENDPGM 


                                                        

[コンパイル]

CRTBNDCL PGM(OBJLIB/TESTTMP) SRCFILE(MYSRCLIB/QCLSRC) DFTACTGRP(*NO) ACT
GRP(*NEW) AUT(*ALL) DBGVIEW(*SOURCE)

[解説]

SEU のソース・タイプは CLPではなく CLLE として編集すること。
これは CALLPRC (=プロシージャーの呼出し) でC言語の関数: tmpnam を呼び出す
ためである。
これがわかるようにC言語の関数はすべてILEのプロシージャーとして
IBMより提供されている。
したがってRPG, COBOLやCLPからC言語の関数を呼び出すにはプロシージャーとして
呼び出せばよいことがわかる。
戻り値はボインタ: &TMPPTR であるのでそのボインタを基底とする変数: &TMPNAM を
定義しておいて戻り値は : QTEMP/QACXCTNWQACXCTNWXD のような形式として
戻るので7桁目から取り出せばよい。
戻り値が QTEMP/…形式でわかるようにこのtmpnam関数は一般的なC言語の関数ではなく
IBM i独自の関数である。
_