<< Click to Display Table of Contents >> Navigation: Arbeit mit GESStabs > Nützliche Werkzeuge > Selektiver Skriptablauf |
Mithilfe von Funktionen, die zur Gruppe der Defines gehören, können über Mechanismen des "Conditional Compiling" mehrere Varianten eines Tabellenprogramms in einer Quelle verwaltet und ausgeführt werden:
•Mit #DEFINE können beliebige Namen vereinbart werden, die dann als Abkürzungen für den DEFINE-Inhalt geführt werden können.
•#IFDEF und #IFNDEF fragt im Skriptverlauf ab, ob ein Name definiert ist oder nicht, und führt diesen bei Vorhandensein aus.
•#IFEMPTY und #IFNEMPTY fragen ab, ob eine Textkonstante (nicht) leer ist und führen bei Zutreffen den Skriptabschnitt aus.
•Mit #IFEXIST und #IFNEXIST kann abgefragt werden, ob eine Variable dieses Namens bereits existiert.
Es folgt ein Anwendungsbeispiel.
Mit #DEFINE werden beliebige Namen vereinbart, die dann als definiert gelten; mit #UNDEFINE kann man sie wieder löschen.
Syntax:
#DEFINE <string>
#UNDEFINE <string>
#DEFINEs kann man nicht nur in der Quelle definieren, sondern einen #DEFINE-String auch über die Kommandozeile mit der Option '-D' als Parameter übergeben.
Zum Beispiel: 'GTC xyz.TAB -Dascii' übergibt den String »ascii« zur Definition. Enthält die Quelle dann z.B. folgende Syntaxsequenz:
#IFNDEF ascii
PRINTFILE PS = xyz.ps;
#ELSE
PRINTFILE ASCII = xyz.prn;
#END
so würde abweichend vom normalen Ablauf eine ASCII-Druckdatei erzeugt.
Mit #IFDEF bzw. #IFNDEF kann man abfragen, ob ein Name definiert ist oder nicht. Alle GESStabs-Quellzeilen und alle #DEFINE bzw. #UNDEFINE-Statements zwischen dem #IFDEF bzw. #IFNDEF und dem schließenden #END werden in Abhängigkeit vom Wahrheitswert dieses Tests durchgeführt. Mit #ELSE kann man jeweils die alternativ zu kompilierenden Zeilen bestimmen.
Syntax:
#IFDEF <Define-Name>
<Syntax-Statement 1>
[#ELSE
<Syntax-Statement 2>]
#END
Zusätzlich zu #IFDEF und #IFNDEF kann man die Compilation mit #IFNEMPTY in Abhängigkeit davon steuern, ob eine Textkontante leer ist, bzw. die länge Null hat. #IFEMPTY ist das logische Pendant: #IFEMPTY ist true, wenn der Text die Länge 0 hat.
Also
#IFNEMPTY "" ist immer false
und
#IFNEMPTY "irgendwas" ist immer true (egal welcher Text sich hinter "irgendwas" verbirgt).
Damit kann man die Expandierung von Macros steuern. Zum Beispiel:
#MACRO #tab( &1 &2 &3 &4 )
table #k by &1
#IFNEMPTY "&2"
&2 #END
#IFNEMPTY "&3"
&3 #END
#IFNEMPTY "&4"
&4 #END
;
ENDMACRO
Dann würde der Aufruf von
#tab( var1 )
ebenso funktionieren wie der Aufruf von
#tab( var1 var2 var3 var4 )
Mit #IFEXIST und #IFNEXIST kann man abfragen, ob eine Variable dieses Namens bereits existiert.
Ein Include-File mit dem Namen "SETPAPER.INC" könnte z.B. folgende Anweisungen enthalten:
#IFDEF A4
#IFDEF quer
PAPER = Height 210 Width 297;
#ELSE
PAPER = Height 297 Width 210;
#END
#END
#IFDEF A5
#IFDEF quer
PAPER = Height 148 Width 210;
#ELSE
PAPER = Height 210 Width 148;
#END
#END
Mit diesem kleinen Programm kann die Formate A4 hoch, A4 quer, A5 hoch und A5 quer setzen. In einem GESStabs-Programm kann man dann ganz einfach schreiben:
#DEFINE A4
#DEFINE quer
INCLUDE = SETPAPER.INC;
UND-Verknüpfungen zwischen mehreren Defines kann man relativ leicht durch Schachtelung erreichen.
Zur Auswertung von ODER-Verknüpfungen gibt es eine Schreibweise mit eckigen Klammern:
#IFDEF [ def1 def2 def3 ]
compute xx = 1;
#ELSE
compute xx = 2;
#END
xx erhielte den Wert 1, wenn entweder def1, def2 oder def3 gesetzt sind.
Parallel gibt es eine ODER-Verknüpfung bei #IFNDEF:
#IFNDEF [ def1 def2 def3 ]
TABLE = aa by bb;
#END
Das TABLE-Statement würde dann und nur dann ausgeführt, wenn mindestens eine der Bedingungen def1, def2 und def3 nicht gesetzt sind.