These directives set logical conditions for the inclusion of blocks of code to compile.
When it encounters an &IF directive, the preprocessor evaluates the expression that immediately follows. This expression can continue for more than one line; the &THEN directive indicates the end of the expression. If the expression evaluates to TRUE, then the block of code between it and the next &ELSEIF, &ELSE, or &ENDIF is compiled. If the expression evaluates to FALSE, the block of code is not compiled and the preprocessor proceeds to the next &ELSEIF, &ELSE, or &ENDIF directive. No include files referenced in this block of code are included in the final source. You can nest &IF directives.
The expression that follows the &ELSEIF directive is evaluated only if the &IF expression tests false. If the &ELSEIF expression tests TRUE, the block of code between it and the next &ELSEIF, &ELSE, or &ENDIF directive is compiled. If the &ELSEIF expression tests FALSE, the preprocessor proceeds to the next &ELSEIF, &ELSE, or &ENDIF directive.
The block of code between the &ELSE and &ENDIF directives is compiled only if the &IF expression and the &ELSEIF expressions all test false. If there are no &ELSEIF directives, the block of code is compiled if the &IF expression tests false.
Once any &IF or &ELSEIF expression evaluates to TRUE, no other block of code within the &IF...&ENDIF block is compiled.
The &ENDIF directive indicates the end of the conditional tests and the end of the final block of code to compile.
The following table shows how preprocessor expressions are evaluated.
| Type of expression | TRUE | FALSE | 
|---|---|---|
| LOGICAL | TRUE | FALSE | 
| CHARACTER | non-empty | empty | 
| INTEGER | non-zero | 0 | 
| INT64 | non-zero | 0 | 
| DECIMAL | not supported | not supported | 
The following table lists the operators supported within preprocessor expressions. These operators have the same precedence as the regular ABL operators.
| Operator | Description | 
|---|---|
| + | Addition | 
| - | Subtraction | 
| * | Multiplication | 
| / | Division | 
| = | Equality | 
| <> | Inequality | 
| > | Greater than | 
| < | Less than | 
| => | Greater than or equal to | 
| <= | Less than or equal to | 
| AND | Logical and | 
| OR | Logical or | 
| NOT | Logical not | 
| BEGINS | Compares the beginning letters of two expressions | 
| MATCHES | Compares two strings | 
The following table lists the ABL functions supported within preprocessor expressions.
| ABSOLUTE | ASC | AUDIT-ENABLED | 
| DATE | DAY | DBTYPE | 
| DECIMAL | ENCODE | ENTRY | 
| ETIME | EXP | FILL | 
| INDEX | INT64 | INTEGER | 
| KEYWORD | KEYWORDALL | LC | 
| LEFT-TRIM | LENGTH | LIBRARY | 
| LOG | LOOKUP | MATCHES | 
| MAXIMUM | MEMBER | MINIMUM | 
| MODULO | MONTH | NUM-ENTRIES | 
| OPSYS | PROCESS-ARCHITECTURE | PROPATH | 
| PROVERSION | RANDOM | REPLACE | 
| RIGHT-TRIM | R-INDEX | ROUND | 
| SQRT | STRING | SUBSTITUTE | 
| SUBSTRING | TIME | TODAY | 
| TRIM | TRUNCATE | WEEKDAY | 
| YEAR |