The source has been changed in order to make it GCC (the standard LINUX C compiler) friendly. As a result, it now clean compiles under LINUX and appears to function correctly. Only one (intentional) change has been made - when CFG2 constructs the default script file name from the executable file name, it now appends the default script file extension onto the end. (LINUX executables usually have no extension and, as a result, under LINUX, CFG2 would attempt to use "CFG2" as the default script file name rather than "CFG2.INI" as it does now.)
Redefining a macro by using #DEFINE twice will no longer make CFG2 abort with an error message. You will only receive a warning message, instead. (#REDEF still retained as the "approved" way of redefining a macro.)
Adopt the new "standard" format for the files that keep track of the program's version number. This will allow easy generation of the current version of the program and, in particular, the web site can automatically generate a list of current program version numbers.
Cured a bug whereby an over-long tag name or a long, unbroken string of non-space characters at the start of a script line causes CFG2 to crash. (The latter failure mode only occurred when the margin width was set to zero - something which has only been possible with the latest CFG2.)
Added code to provide for destruction of the internal lists rather than rely on the operating system's automatic cleanup procedure at program termination.
Added the "justone" operator to the evaluator. This operator will empty the entire expression stack, counting the number of "active" (that is, TRUE) entries. When it has finished, it returns TRUE only if there was exactly one active entry. (Use this to sanity check mutually exclusive switches.)
Added under-line escapement in the form of a double underline. Hence, a trailing "__" would place a trailing under-line as the last character in the line but retain the normal end-of-line termination sequence.
Added the "xor" operator to the evaluator.
Extensive changes relating to data structures. Instead of the static structures that we had before, they are all now dynamic and, hence, there are very few hard-coded limits remaining.
A zero-length margin in now allowable. This allows maximal use of the line length when margin expressions aren't required.
Altered the handling of comment lines when #EMPTY is turned on. In the past, if, after comment removal, the resulting line was entirely empty, a blank line would be sent to the output files. After this change, this action is inhibited if the entire line is a comment. That is, if there is a comment character in column one of a line, no further processing is carried out.
Added the '-T' source tracing option. Adding a '-T' to the command line will make CFG2 dump lines of text as they are processed. If the line has macro expansion applied, it'll be dumped after the expansion has been carried out, as well.
One can now use a switch name between macro characters and have CFG2 expand the switch's value at run time. For example:
#switch S #say Switch S is now %S%.
Due to the fact that CFG2 is now a single pass program, it's much more difficult to provide a "reminder" ('-?' and '?') facility. Hence, this feature has been removed.
The way that IF-ELSE-ENDIF constructs has been altered (again as a result of the adoption of a single-pass strategy). Hence, the IF-ELSE-ENDIF construct now takes priority over all other directives. Hence, this is now allowable:
#switch s #if s #file out sname.txt #else #file out NOTsname.txt #endif
Before this change, the two declarations of file OUT would've generate a "file already defined" error message.
Added the wild-carding feature such that '*' and '?' can be used in the tags presented to file directives. For example:
#file AHTML FIRST.HTM #file BHTML SECOND.HTM #file ATXT THIRD.TXT #file BTXT FOURTH.TXT #send ?HTML #send ?TXT #send A*
And so on.