Began section on conditional directives.
1 parent 7e550e1 commit fbccb88621179cb1e172701b4551328bc960be8f
@tundra tundra authored on 16 Apr 2004
Showing 1 changed file
View
88
tconfpy.3
edited when system-wide changes are required.
 
.P
 
One last thing needs to be noted here. \*(TC does not detect so-called "circular"
inclusions. If file \'a\' \'.include\'s file \'b\' and file \'b\' \'.include\'s file \'a\', you will
have an infinite loop of inclusion, which, uh, is a Bad Thing...
One last thing needs to be noted here. \*(TC does not detect
so-called "circular" inclusions. If file \'a\' \'.include\'s file
\'b\' and file \'b\' \'.include\'s file \'a\', you will have an
infinite loop of inclusion, which, uh, is a Bad Thing...
 
.SS Conditional Directives
 
One of the most powerful features of \*(TC is its "conditional
processing" capabilities. The general idea is to test some
condition and
.B include or exclude configuration information based on the outcome of the test.
 
What's the point? You can build large, complex configurations that test things
like environment variables, one of the Predefined Variables, or even a variable
you've set previously in the configuration file. The resulting configuration is then
produced in a way that is appropriate for
.B that particular system, on that particular day, for that particular user, ...
 
By using conditional directives, you can create a single configuration file that
works for every user regardless of operating system, location, and so on.
 
There are two kinds of conditional directives. "Existential Conditionals" test to
see if a configuration or environment variable
.B exists.
Existential Conditionals pay no attention to the
.B value
of the variables in question, merely whether or not those variables have been defined.
 
"Comparison Conditionals" actually
.B compare
two strings. Typically, one or more variable references appear in the compared strings.
In this case, the
.B value of the variable
is important.
 
The general structure of any conditional looks like this:
 
.nf
ConditionalDirective Argument(s)
This is included if the conditional was True
 
.else # Optional
 
This is included if the conditional was False
 
.endif # Required
.fi
 
Except for the whitespace after the conditional directive itself, whitespace is not
significant. You may indent as you wish.
 
Conditionals may also be "nested". You can have a conditional within another conditional
or \'.else\' block:
 
.nf
 
ConditionalDirective Argument(s)
stuff
ConditionalDirective Argument(s)
more stuff
.endif
 
.else
ConditionalDirective Argument(s)
other stuff
.endif
.endif
.fi
 
There are no explicit limits to how deeply you can nest a configuration. However,
you must have an \'.endif\' that terminates each conditional test. Bear in mind that
\*(TC pays no attention to your indentation. It associates an \'.endif\'
.B with the last conditional it encountered.
That's why it's a really good idea to use some consistent indentation style so
.B you
can understand the logical structure of the conditions. It's also a
good idea to put comments throughout such conditional blocks so it's
clear what is going on.
 
.SS Existential Conditionals
 
 
.SS Comparison Conditionals
 
.SS The \'.literal\. Directive
 
.SH ADVANCED TOPICS