RPG

160. API プログラマーに役に立つ ライブラリー QSYSINC とは ?

システム・ライブラリー QSYS は誰もがご存知であろうと思うが
もうひとつの隠された(?) ライブラリー QSYSINC がある。
恐らくは SYTEM INCLUDE LIBRARY の意味である。
ところで QSYSINC は C言語では

    #include <stdio.h>

のようにして定義することによって
QSYSINC/H というライブラリー QSYSINC の H というファイルのメンバー STDIO を
インクルードすることを定義している。
正しくは、

    #include "QSYSINC/H(STDIO)"

と書くべきであるが、C言語の慣例によって

    #include <stdio.h>

と記述している。そして QSYSINC/H(STDIO) には標準入出力関数のC言語の
プロトタイプ関数が定義されている。
ILE-RPG や ANSI-C, Java でもプロシージャーや関数、クラスを使用する場合には
使用する前に必ず、これから使用するプロシージャーや関数の型を
プロトタイプとして宣言しなければコンパイラーによって理解されないのである。
例えば、printf という関数は恐らく、

    void printf(char*);

のようにして STDIO の中に定義されているはずである。
#include <stdio.h> の中で printf 関数のプロトタイプが定義されているので
C言語の演算では、いきなり printf("MY PROFILE\n"); のように使用することができる。
これは ILE-RPG であっても同じであり、それでは ILE-RPG でプロトタイプの
インクルードが何に役に立つのかというと、それは API の使用である。
QSYSINC には QRPGLESRC というソース・ファイルも用意されていて
PDM で参照してみると次のようになる。

この中で QUS という名前のメンバーは次のとおりである。

------------------------------------------------------------------------------------
0000.01      D*** START HEADER FILE SPECIFICATIONS ****************************   
0000.02      D*                                                                   
0000.03      D*Header File Name: H/QUS                                            
0000.04      D*                                                                   
0000.05      D*Descriptive Name: Common structures for component US APIs.         
0000.06      D*                                                                   
0000.07      D*5763-SS1  (C) Copyright IBM Corp. 1994,1994                        
0000.08      D*All rights reserved.                                               
0000.09      D*US Government Users Restricted Rights -                            
0000.10      D*Use, duplication or disclosure restricted                          
0000.11      D*by GSA ADP Schedule Contract with IBM Corp.                        
0000.12      D*                                                                   
0000.13      D*Licensed Materials-Property of IBM                                 
0000.14      D*                                                                   
0000.15      D*                                                                   
0000.16      D*Description: Contains the: - Generic Variable Length format        
0000.17      D*                          headers for the user space.              
0000.18      D*                        - Generic Structure for user               
0000.19      D*                          indexes.                                 
0000.20      D*                                                                   
0000.21      D*Header Files Included: None.                                       
0000.22      D*                                                                   
0000.23      D*Macros List: None.                                                 
0000.24      D*                                                                     
0000.25      D*Structure List: Qus_Vlen_Rec_3_t                                     
0000.26      D*             Qus_Vlen_Rec_4_t                                        
0000.27      D*             Qus_Entry_t                                             
0000.28      D*             Qus_Entry_Len_Offset_t                                  
0000.29      D*                                                                     
0000.30      D*Function Prototype List: none.                                       
0000.31      D*                                                                     
0000.32      D*Change Activity:                                                     
0000.33      D*                                                                     
0000.34      D*CFD List:                                                            
0000.35      D*                                                                     
0000.36      D*FLAG REASON       LEVEL DATE   PGMR      CHANGE DESCRIPTION          
0000.37      D*---- ------------ ----- ------ --------- ----------------------      
0000.38      D*$A0= D2862000     3D10  940327 LUPA:     New Include                 
0000.39      D*End CFD List.                                                        
0000.40      D*                                                                     
0000.41      D*Additional notes about the Change Activity                           
0000.42      D*End Change Activity.                                                 
0000.43      D*** END HEADER FILE SPECIFICATIONS ******************************     
0000.44      D*****************************************************************     
0000.45      D*Type Definition for the 3 Field Variable Length Record.              
0000.46      D*****************************************************************     
0000.47      DQUSVR3           DS                                                   
0000.48      D*                                             Qus Vlen Rec 3            
0000.49      D QUSK                    1      4B 0                                    
0000.50      D*                                             Key                       
0000.51      D QUSLVR                  5      8B 0                                    
0000.52      D*                                             Length Vlen Record        
0000.53      D*QUSDATA                 9      9                                       
0000.54      D*                                                                       
0000.55      D*                         Varying length                                
0000.56      D*****************************************************************       
0000.57      D*Type Definition for the 4 Field Variable Length Record.                
0000.58      D*****************************************************************       
0000.59      DQUSVR4           DS                                                     
0000.60      D*                                             Qus Vlen Rec 4            
0000.61      D QUSLVR00                1      4B 0                                    
0000.62      D*                                             Length Vlen Record        
0000.63      D QUSCK                   5      8B 0                                    
0000.64      D*                                             Control Key               
0000.65      D QUSLD                   9     12B 0                                    
0000.66      D*                                             Length Data               
0000.67      D*QUSDATA00              13     13                                       
0000.68      D*                                                                       
0000.69      D*                         Varying length                                
0000.70      D*****************************************************************       
0000.71      D*Type Definitions for the Format for Entry Lengths and Entry            
0000.72      D*Offsets.                                                            
0000.73      D*****************************************************************    
0000.74      DQUSENTRY         DS                                                  
0000.75      D*                                             Qus Entry              
0000.76      D QUSEL01                 1      4B 0                                 
0000.77      D*                                             Entry Length           
0000.78      D QUSEO00                 5      8B 0                                 
0000.79      D*                                             Entry Offset           
0000.80      DQUSELO           DS                                                  
0000.81      D*                                             Qus Entry Len Offset   
0000.82      D QUSBRTN11               1      4B 0                                 
0000.83      D*                                             Bytes Returned         
0000.84      D QUSBAVL12               5      8B 0                                 
0000.85      D*                                             Bytes Available        
0000.86      D*QUSTRIES                       8    DIM(00001)                      
0000.87      D* QUSEL02                       9B 0 OVERLAY(QUSTRIES:00001)         
0000.88      D* QUSEO01                       9B 0 OVERLAY(QUSTRIES:00005)         
0000.89      D*                                                                    
0000.90      D*                            Varying length                          
0000.91      D*****************************************************************    
0000.92      D*Type Definition for the IDXE0100 format.                            
0000.93      D*****************************************************************    
0000.94      DQUSE0100         DS                                                  
0000.95      D*                                             Qus IDXE0100           
0000.96      D QUSBRTN12               1      4B 0                            
0000.97      D*                                             Bytes Returned    
0000.98      D QUSBAVL13               5      8B 0                            
0000.99      D*                                             Bytes Available   
0001.00      D*QUSTRIES00              9      9                               
0001.01      D*                                                               
0001.02      D*                            Varying length                     
------------------------------------------------------------------------------------
【 解説 】

QUSCRTUS や QUSRTVUS を使用した人であればおわかりのように
これらの API で定義されるデータの構造を示している。
QSYSINC/QRPGLESRC のメンバーを /COPY QSYSINC/QRPGLESRC,QUS のようにして
ILE-RPG ソースの中に組み込めば、これらの構造体をユーザーで定義しなくても
利用することができるのである。
このことは API を利用する点で正確で間違いのない API 受け取り変数を
定義して余計な誤りを防ぐことができる。
QSYSINC のメンバーをインクルードして使用することは何よりスマートでもある。
さらに加えて重要であるのは API のマニュアルでは不明瞭な受け取り変数や
場合によっては複雑な API の場合は受け取り変数の記述で、ごく稀れであるが
API解説書に誤りがある場合がある。
しかし最も正しいのは、この QSYSINC に記述されているソースである。
API解説書の意味が理解できない場合にも QSYSINC のインクルード・メンバーを
参照することは API の理解を早めることになる。
これで QSYSINC って何だろうと思っていた人も API がより扱いやすくなるはずである。