EGL プログラムから C 関数を呼び出すことができます。 下記の手順を実行する前に、『C 関数と EGL』で説明されているように C コードをコンパイルし、リンクする必要があります。
例えば、次の関数呼び出し文は、C 関数 sendmsg( ) を呼び出します。
sendmsg(chartype, 4, msg_status, return_code);
この文は、2 つの引数 (chartype と 4 のそれぞれ) を関数に渡し、2 つの引数 (msg_status と return_code のそれぞれ) が戻されることを期待します。 これを明確にするには、ネイティブ・ライブラリー内で関数を次のように定義します。
Library I4GLFunctions type nativeLibrary {callingConvention = "I4GL", dllName = "mydll"} Function sendmsg(chartype char(10) in, i int in, msg_status int out, return_code int out) end end
渡される引数は、「in」パラメーターを使用して指定され、戻される引数は、「out」パラメーターを使用して指定されます。
C 関数は、引数スタック (この場合、2 つの引数) にプッシュされる値の数を指定する整数引数を受け取ります。 これは、C 関数内のスタックからポップされる値の数です。 また、この関数は、EGL プログラムに制御権を戻す前に、msg_status 引数および return_code 引数の値を戻す必要があります。 ポップ外部関数については、『EGL からの値の受け取り』で、 戻り外部関数については、『EGL への値の戻り』で説明します。
C 関数は、正しい数のスタック値が渡されたことを前提としません。 C 関数は、その関数用にスタックされた EGL 引数の数を確認するために、その整数引数をテストします。
次の例は、正確に 1 つの引数を必要とする C 関数を示しています。
int nxt_bus_day(int nargs); { int theDate; if (nargs != 1) { fprintf(stderr, "nxt_bus_day: wrong number of parms (%d)¥n", nargs ); ibm_lib4gl_returnDate(0L); return(1); } ibm_lib4gl_popDate(&theDate); switch(rdayofweek(theDate)) { case 5: /* 金曜日 -> 月曜日に変更 */ ++theDate; case 6: /* 土曜日 -> 月曜日*/ ++theDate; default: /* (sun..thur) 翌日にジャンプ */ ++theDate; } ibm_lib4gl_returnDate(theDate); /* スタックの結果 */ return(1) /* スタックされたカウントを戻す */ }
この関数は、所定の日付の翌営業日の日付を戻します。 この関数は、正確に 1 つの引数を受け取る必要があるので、渡された引数の数をチェックします。 この関数が異なる数の引数を受け取った場合、確認メッセージを出してプログラムを終了します。