Sie können eine C-Funktion aus einem EGL-Programm durch einen Bibliotheksabschnitt mit dem Stereotyp nativeLibrary aufrufen. Bevor Sie die nachstehenden Anweisungen befolgen, müssen Sie Ihren C-Code wie unter C-Funktionen über EGL-Bibliotheken aufrufen beschrieben kompilieren und verknüpfen.
Die folgende Funktionsaufrufanweisung ruft beispielsweise die C-Funktion sendmsg( ) auf:
sendmsg(chartype, 4, msg_status, return_code);
Sie übergibt zwei Argumente (chartype bzw. 4) an die Funktion und erwartet die Rückgabe von zwei Argumenten (msg_status bzw return_code). Dies wird ersichtlich, indem die Funktion in einer nativen Bibliothek wie folgt definiert wird:
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
Die übergebenen Argumente werden mit dem Parameter 'in' angegeben. Die zurückzugebenden Argumente werden mit dem Parameter 'out' angegeben.
Die C-Funktion empfängt ein ganzzahliges Argument, das angibt, wie viele Werte zum Argumentstack hinzugefügt wurden (in diesem Fall sind es zwei). Dies ist die Anzahl der Werte, die in der C-Funktion aus dem Stack abgerufen werden müssen. Die Funktion muss außerdem Werte für die Argumente msg_status und return_code zurückgeben, bevor die Steuerung wieder an das EGL-Programm übergeben wird.
Die C-Funktion darf nicht ohne Weiteres davon ausgehen, dass die richtige Anzahl von Werten aus dem Stack übergeben wurde. Sie sollte ihr ganzzahliges Argument testen, um festzustellen, wie viele EGL-Argumente für sie zum Stack hinzugefügt wurden.
Das folgende Beispiel zeigt eine C-Fuktion, die genau 1 Argument erfordert:
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: /* change friday -> monday */
++theDate;
case 6: /* saturday -> monday*/
++theDate;
default: /* (sun..thur) go to next day */
++theDate;
}
ibm_lib4gl_returnDate(theDate); /* stack result */
return(1) /* return count of stacked */
}
Die Funktion gibt das Datum des nächsten Werktags nach dem angegebenen Datum zurück. Da die Funktion genau 1 Argument empfangen muss, überprüft die Funktion die Anzahl der übergebenen Argumente. Falls die Funktion eine andere Anzahl von Argumenten empfängt, wird das Programm (mit einer entsprechenden Nachricht) beendet.