Eine C-Anwenderroutine, die nur aus einer Source produziert wird, kann ohne Bindeschritt als LLM in einer Bibliothek abgelegt werden. Der EDT gibt beim Laden der Anwenderroutine einen Resolve-Kontext an, der die benötigten Laufzeitmodule enthält.
Der genaue Mechanismus ist abhängig davon, ob der EDT von einem C-Hauptprogramm mit ILCS-Flag initialisiert wurde oder nicht:
Wenn dies der Fall ist, werden Anwenderroutinen in einen eigenen Ladekontext EDT#USER geladen und als Resolve-Kontext werden EDT#CRTS und LOCAL#DEFAULT (in dieser Reihenfolge) angegeben. Folglich werden Externverweise auf die C-Globals in der Anwenderroutine zuerst gegen die Entries aus EDT#CRTS (EDT-Laufzeitumgebung) und dann gegen die Entries aus LOCAL#DEFAULT (C-Hauptprogramm) abgesättigt.
Da eine (dynamisch nachgeladene) Anwenderroutine immer in der EDT-Laufzeitumgebung aufgerufen wird, werden der Anwenderroutine dadurch die richtigen C-Globals zur Verfügung gestellt, unabhängig davon, ob das C-Hauptprogramm seinerseits sichtbare Entries für die C-Globals hat.
Der eigene Ladekontext für die Anwenderroutine muss berücksichtigt werden, wenn aus der Anwenderroutine heraus weitere Module dynamisch mit BIND nachgeladen werden sollen.
Wenn das C-Hauptprogramm den EDT ohne ILCS-Flag initialisiert hat, wird die Anwenderroutine aus Kompatibilitätsgründen in den Ladekontext LOCAL#DEFAULT geladen und als Resolve-Kontext wird EDT#CRTS angegeben. In diesem Fall sollte das C-Hauptprogramm keine sichtbaren Entries auf die C-Globals haben, sonst majorisieren diese die entsprechenden Entries der EDT-Laufzeitumgebung und die Anwenderroutine kann nicht korrekt mit C-Bibliotheksfunktionen arbeiten.
Die folgende Prozedur compiliert und bindet C-Anwenderroutinen, die als ANWEND1.C, ANWEND2.C, ... in der Bibliothek EDT.BEISPIELE abgelegt sind.
Der erzeugte LLM, die Compiler-Listen und die Diagnose-Ausgabe werden ebenfalls in dieser Bibliothek abgelegt:
/SET-PROCEDURE-OPTIONS INPUT-FORMAT=FREE-RECORD-LENGTH,/
DATA-ESCAPE-CHAR=STD
/BEGIN-PARAMETER-DECLARATION
/ DECLARE-PARAMETER NAME=NR
/ DECLARE-PARAMETER NAME=LIB,INITIAL-VALUE=C'EDT.BEISPIELE'
/END-PARAMETER-DECLARATION
/START-CPLUS-COMPILER
//MODIFY-SOURCE-PROP LANGUAGE=*C
//MODIFY-RUNTIME-PROPERTIES PARAMETER-PROMPTING=*NO
//MODIFY-INCLUDE-LIBRARIES USER-INCLUDE-LIBRARY=//
$.SYSLIB.EDT.170 ------------------------------ (1)
//MODIFY-DIAGNOSTIC-PROPERTIES OUTPUT=*LIBRARY-ELEMENT(//
LIB=&LIB,ELEM=*STD-ELEMENT()),-
// MIN-MSG-WEIGHT=*NOTE
//MODIFY-MODULE-PROPERTIES LOWER-CASE-NAMES=*YES,-
// SPECIAL-CHARACTERS=*KEEP ------------------------------ (2)
//MODIFY-LISTING-PROPERTIES OUTPUT=*LIBRARY-ELEMENT(//
LIB=&LIB,ELEM=*STD-ELEMENT()),SOURCE=*YES()
//COMPILE SOURCE=*LIB-ELEM(LIB=&LIB,ELEM=ANWEND&NR..C),-
// MODULE-OUTPUT=*LIB-ELEM(LIB=&LIB,ELEM=ANWEND&NR)
//END
/EXIT-PROCEDURE
Erläuterungen
| (1) | Es wird angenommen, dass die SYSLIB.EDT.170 unter der Default-Userid installiert ist. Der C-Compiler benötigt diese Bibliothek, um die Header-Files der IEDTGLE-Schnittstelle zu finden. |
| (2) | Die Entries in der Anwenderroutine sollen unter ihrem Originalnamen angesprochen werden können, daher müssen Kleinbuchstaben akzeptiert werden und Sonderzeichen (etwa "_" ) dürfen nicht verändert werden. |