CL

176. ソース・ファイルであるか判別するには?

あるファイルがソース・ファイルであるかどうかを判別するのは
実は簡単ではない。
DSPFD を使えば簡単に判別することができるが
大量のファイルを処理する場合はDSPFDでファイルに
出力していたのでは処理も大変だし時間がかかる。
それでは APIを使ってパフォーマンス良くソース・ファイルを判別するには
どのようにすれば良いのだろうか?
 
 
実はAPIを使って判断する方法をAI: Microsoft のCopilotに相談してみた。
結論から言うと Copilot でも何回も間違っていた。
これはAPIの公開資料にはサンプル・ソースはほとんどないことに
原因していると思われる。
 
 
APIの使用は経験豊かな開発者を対象としているため
サンプル・ソースはほとんど公開されていない。
国内でもソフトウェア製品を製作販売している会社でも
APIの使用は苦手なようでほとんど使用する技術力が
ないようである。
それはともかく結論としてのサンプル・ソースを
以下に示す。
[CLP: TESTSRC ]

ソースはこちらから

0001.00              PGM                                                          
0002.00              DCL        VAR(&FORMATBUF) TYPE(*CHAR) LEN(32727)            
0003.00              DCL        VAR(&FORMATLEN) TYPE(*CHAR) LEN(4) +              
0004.00                           VALUE(X'7FFF') /* =32767 */                     
0005.00              DCL        VAR(&FLAG) TYPE(*CHAR) LEN(1)                     
0006.00              DCL        VAR(&HEX08) TYPE(*CHAR) LEN(1) VALUE(X'08')       
0007.00              DCL        VAR(&SRCFILLIB) TYPE(*CHAR) LEN(20)               
0008.00              DCL        VAR(&APIERR) TYPE(*CHAR) LEN(116) +               
0009.00                           VALUE(X'0000007400000000') /* 2 進数  */        
0010.00                                                                           
0011.00              CHGVAR     VAR(&SRCFILLIB) VALUE('QDSPSRC   QTRSRC    ')     
0012.00 /*( API: QDBRTVFD の実行 )*/                                              
0013.00              CALL       PGM(QDBRTVFD) PARM(&FORMATBUF &FORMATLEN +        
0014.00                           &SRCFILLIB 'FILD0100' &SRCFILLIB +              
0015.00                           '*FIRST   ' '0' '*FILETYPE ' '*EXT      ' +     
0016.00                           &APIERR)                                        
0017.00              CHGVAR     VAR(&FLAG) VALUE(%SST(&FORMATBUF 9 1))            
0018.00              IF         COND(&FLAG = &HEX08) THEN(DO)                     
0019.00              SNDPGMMSG  MSG('*SRCF です ') MSGTYPE(*DIAG)                 
0020.00              ENDDO                                                        
0021.00              ELSE       CMD(DO)                                           
0022.00              SNDPGMMSG  MSG('*SRCF ではありません。 ') MSGTYPE(*DIAG)     
0023.00              ENDDO                                                        
0024.00              ENDPGM 


 

[解説]

API: QDBRTVFD はファイルAPIであってその9バイト目にソース・ファイルを
判別できるビットが隠されている。
このCLプログラムはそのビットを判別している。
 _

参考URL : QDBRTVFD

※ API: QDBRTVFD とはファイル構造を調べるための莫大な構造から成るAPIである。
DSPF, PRTF, PF, LFなどの構造を調べることができるAPIであり
ファイルのレコード構造やフィールド構造、選択などのすべての構造を
参照することができる。解説文だけでも数10ページのマニュアルで説明されている。
AutoWebではリアル・タイムで QDBRTVFDを使ってDSPFのオブジェクト構造を
調べるのに使われている。