Selektiver Skriptablauf

<< 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.


#Define und #UnDefine

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.


#IfDef und #IfNDef

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


#IfEmpty und #IfNEmpty

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 )


#IfExist und #IfNExist

Mit #IFEXIST und #IFNEXIST kann man abfragen, ob eine Variable dieses Namens bereits existiert.


Anwendungsbeispiele

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.