AppGen


Appgen erzeugt Programmkode zur Auswertung von Kommandozeilen-Parametern und Optionen. Erzeugt man ein C/C++-Programm, welches Parameter und Optionen auf der Kommandozeile auswertet, verwendet man oft die Funktion getopt. Um eine Option hinzuzufügen werden Änderungen an verschiedenen Stellen erforderlich:

#include <getopt.h>
void usage() // help (-h)
{
     cout << "Options:" << endl;
     cout << "-x <i> --xsize=<i>  Width of image " << endl;
// ...
}
// ...
int main(int argc, char **argv)
{
     int xsize = 800;
     // ...
     // Definition of long options
     static struct option ag_long_options[] =
     {
     {"xsize", required_argument, 0, 'x' },
     // ...
     {0,         0,                 0,  0 }
     };
     // ...
     int rc;
     while ((rc = getopt_long(argc, argv, ":hx:f:", ag_long_options, NULL)) >= 0)
 {
   switch (rc)
     {
     case 'x':
             xsize = ptol(optarg);
             break;
     // ...
     }
   if (optind < argc) // commandline parameters
     // ...

AppGen hilft, diese Programmteile für die Hilfe, die Parameter für den Aufruf von getopt, die Variablendefition und die Auswertung mittels der switch-Anweisung aus einer Beschreibung von Parametern und Optionen zu generieren.

Bei der Nutzung von AppGen wird in den C++-Quelltext ein Kommentar mit der Beschreibung der Parameter und Optionen eingefügt:

/*AppGen
%%  description of program
prog: simple test for AppGen

%% description of parameters
% name, kind, c++ type , name of variable, description, default
para: source, required, string, source, source filename, ""
...
%% description of options
%% short option, long option, type, variable, description,    default
opt: x,          xsize,       int,  xsize,    Width of image, 800
opt2: size is given in pixels
...
AppGen*/

Die daraus von AppGen erzeugten Programmteile werden an entsprechend markierten Stellen im Programmtext eingefügt. Folgende Marker werden im Quelltext verwendet:

/*AppGen:Global*/
globale Variablen und Includes
/*AppGen:Main*/
Die Definition von main(), lokale Variablen, der Aufruf von getopt() und die Auswertung der Parameter und Optionen
/*AppGen:MainEnd*/ (optional)
Ist dieser Kommentar nach /*AppGen:Main*/ vorhanden, ersetzt AppGen durch den von /*AppGen:Main*/ erzeugten Quelltext. Damit kann man zum Beispiel zwischen die beiden Tags eine Definition von main() schreiben, die durch AppGen ersetzt wird. Das kann sinnvoll sein, wenn Editoren wie emacs den Quelltext formatieren wollen und ein fehlendes main() die Struktur zerstört.

Der Aufruf von AppGen source.ag source.cpp erzeugt aus dem mit Markern für AppGen versehenen Quelltext in source.ag einen reinen C++-Quelltext source.cpp, der normal mit dem Compiler übersetzt werden kann.

AppGen wird als freie Software auf Github gehostet.