Register 

include dateiname       [ acon  ab V30.6]

Damit kann man andere Dateien in eine FLEX-Datei an beliebiger Stelle einbauen lassen.

ACHTUNG: Für acon  mußte bis V35.7  dateiname  auf dem Arbeitsverzeichnis von  acon  oder darunter liegen, ab V35.8 wird die Datei zuerst auf dem ProgDir gesucht, erst bei Mißerfolg auf dem Arbeitsverzeichnis.

a99 sucht die Datei zuerst an derselben Stelle, wo der aufrufende FLEX liegt, zumeist also DbDir oder ProgDir/FLEX.

 

Es hatte Wünsche gegeben, daß man aus einem FLEX heraus einen anderen starten können müsse, nach dessen Beendigung der aufrufende dann aber weiterlaufe. Dies war nicht machbar, denn ein FLEX ist kein Objekt, sondern ein nicht-rekursives Unterprogramm. Alles andere wäre weitaus komplexer und ist unter den gegebenen Umständen und Randbedingungen unrealistisch.

Realistisch war allein der Einbau eines "include"-Befehls, der in einen FLEX an der von ihm besetzten Stelle eine andere Datei einbaut, bevor dann die Abarbeitung beginnt. Dieser Befehl wird so eingesetzt:

 

...  beliebiger FLEX-Text

include upx.flx

...  weiterer FLEX-Text

 

Beim Einlesen der diese Zeile enthaltenden FLEX-Datei bewirkt sie, daß  an ihrer Stelle dann die Datei upx.flx eingefügt wird. Diese Technik ist nicht rekursiv, d.h. in upx.flx könnte nicht abermals ein  include  stehen, es würde nicht ausgeführt!

 

Also Achtung:

Der Befehl  include  ist kein richtiger FLEX-Befehl, denn vor der Ausführung verschwindet er ja. Er muß vollständig angegeben sein, d.h.  so etwas wie

incl nnn.flx 

klappt nicht, und es muß ein Dateiname folgen, getrennt durch Leerzeichen, //-Kommentar dahinter ist möglich. Gesucht wird die Datei auf den üblichen Verzeichnissen, in acon aber nur auf dem Verzeichnis, wo der Ausgangsjob steht.

Zur Klärung: Ein FLEX wird zuerst komplett eingelesen in einen Arbeitsspeicher, und bei diesem Vorgang werden include-Dateien gleich hineingenommen. Erst dann begibt sich das Programm zum Anfangspunkt dieses Arbeitsspeichers und arbeitet den FLEX ab. Es wird NICHT Zeile für Zeile gelesen und jede Zeile sofort abgearbeitet! Man mache sich ganz klar, was das bedeutet: Beim Abarbeiten steht der Befehl  include ...  nicht mehr da, sondern an seiner Stelle der Text der betr. Datei!

Es ist deshalb, wie man leicht einsieht, nicht möglich, die FLEX-Gesamtgröße von 256000 Byte durch includes zu umgehen!

 

Vorgabe des Dateinamens mittels iV (wie man es bei vielen Befehlen gewöhnt ist, also "dynamisches" oder "bedingtes" include) geht aus den genannten Gründen nicht: der Befehl steht ja zur Ausführungszeit gar nicht mehr da, sondern da steht dann der Text der dadurch geladenen Datei.

 

Im Fehlerfall     

Wenn die gewünschte Datei nicht gefunden wird, kommt nur in acon eine Fehlermeldung (auf stderr), in  a99  nicht, der FLEX wird nichtsdestotrotz ausgeführt.  (Wer solche FLEXe schreibt, wird ja gerade an solcher Stelle nicht schludern!)

Damit ist es möglich, einen nicht immer wichtigen Teil zeitweise herauszunehmen, ohne störende Meldung, einfach durch Wegnahme der zu includenden Datei statt durch Eingriff in den FLEX.

Will man aber auf das Nichtvorhandensein der Datei im FLEX reagieren, könnte man etwa so schreiben:

 

...  beliebiger FLEX-Text

include upx.inc

jump notfound

:upx.inc

...  normaler Fortgang

end

:notfound   // Fehlerfall

 

und in der include-Datei upx.flx müßte als letzter Befehl stehen:

jump upx.inc

denn dann wird der Befehl  jump notfound  wirkungslos.

 

Empfehlung: Die mit include einbezogenen Dateien sind i.d.R. keine vollständigen FLEXe, die auch für sich allein sinnvoll ausgeführt werden könnten. Daher empfiehlt sich nicht .flx als Dateityp, sondern .inc.

Das ist aber nicht obligatorisch, der Name kann völlig beliebig sein!

Ein Beispiel ist das Unterprogramm zur Durchführung einer Volltextsuche in der Gesamtbank:   ftr.inc .  Die Kommentare darin zeigen, wie man es macht.