This “Dumb Interpretively Executed String Expression Language” is the kernel of a macro language you can customise by adding C code and embedding it into your program.
It is short, written in portable C, and is readily integrated into any program. It is useful primarily to programs which need a very rudimentary macro expansion facility without the complexity of a full language such as Lisp or FORTH.
DIESEL copies its input directly to the output until a macro character, “$” or quoted string is encountered. Quoted strings may be used to suppress evaluation of sequences of characters which would otherwise be interpreted as macros. Quote marks may be included in quoted strings by two adjacent quote marks. For example:
"$(if,1,True,False)="""$(if,1,True,False)""""
Status retrieval, computation, and display are performed by DIESEL functions. The available functions are as follows. User-defined functions are not implemented; what you see is all you've got. Naturally, if you embed DIESEL in your application, you'll add functions that provide access to information and actions within your own program. DIESEL's arithmetic functions accept either floating point or integer arguments, and perform all calculations in floating point.
You invoke DIESEL within your program by calling:
int status; char instring[whatever], outstring[MAXSTR + 1]; status = diesel(instring, outstring);
The output from the evaluation will be stored in outstring when
control is returned to your program. If no errors were detected
during evaluation, status
will be zero. Otherwise status
gives the
character position within instring at which the error was detected.
If an error occurs, DIESEL will include an error diagnostic,
documented below, in outstring
.
Generally, if you mess something up in a DIESEL expression it's pretty obvious what went wrong. DIESEL embeds an error indication in the output stream depending on the nature of the error:
The base-line DIESEL includes no user-defined variables. This allows DIESEL to avoid allocating any local memory and renders it totally reentrant. If you compile DIESEL with the tag VARIABLES defined, the following additional functions are included which provide variable definition and access. Note that these functions call malloc() and strdup() and thus consume heap storage.
If you compile DIESEL with the tag UNIXTENSIONS defined, the following additional functions will be available:
D 2 DD 02 DDD Thu DDDD Thursday M 9 MO 09 MON Sep MONTH September YY 93 YYYY 1993 H 4 HH 04 MM 53 SS 17 AM/PM AM am/pm am A/P A a/p aIf any of the “AM/PM” phrases appear in the picture, the “H” and “HH” phrases will edit the time according to the 12 hour civil clock (12:00–12:59—1:00–11:59) instead of the 24 hour clock (00:00–23:59).
DIESEL is in the public domain; you can do anything you like with it.
DIESEL is supplied as a GZIPped TAR archive, diesel.tar.gz.
The following files will be present in the directory after the extraction is complete:
BCMAKE.BAT Batch file to build with Borland C on MS-DOS. DIESEL.C Complete source code, including a built-in test program. MAKEFILE Make file for Unix. MANIFEST List of files in the distribution. MSCMAKE.BAT Batch file to build with Microsoft C 7.0. REGRESS.DSL Diesel regression test script. REGRESS.MAS Regression test master output file. UTEST.DSL Test for the Unix extensions to DIESEL.
All files are distributed in MS-DOS end of line convention (CR/LF). You may have to convert them to the native end of line convention of your system before compiling. DIESEL has been built and regression tested without errors on the following systems:
Sun SPARCStation 2, SunOS 4.1.1 MS-DOS, Borland C 2.0 MS-DOS, Microsoft C 7.0
If DIESEL looks intriguing, but too small and simple for the application you have in mind, please check out ATLAST, my FORTH-based open application toolkit. ATLAST, although much larger and more complicated than DIESEL, is a full-fledged programming language which provides the speed of compiled code, multiple data types, user-defined functions and data types, and just about everything you'll need to make a closed application user programmable.