システム・ライブラリー 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 がより扱いやすくなるはずである。