Der Autor des TextTransformers selbst benutzt den Transformations-Manager z.B um hart-kodierte Versionsinformationen verschiedenen Programm-Module automatisch auf den gleichen Stand zu bringen. Diese Anwendung mag auch für andere Benutzer instruktiv sein.
In jedem der Module gibt es eine Datei, die die folgenden Zeilen enthält:
virtual int GetVersionMajor() const { return 1; }
virtual int GetVersionMinor() const { return 1; }
virtual int GetVersionRelease() const { return 3; }
virtual int GetVersionBuild() const { return 0; }
Die Nummern in den Zeilen sollen automatisch geändert werden.
Dazu muss man sich zunächst im Text an die Positionen "heranpirschen", an denen die Änderungen erfolgen sollen. Ein signifikanter Ausdruck ist "GetVersionMajor". Wenn man diesen Ausdruck im Text findet kommt man leicht zur gewünschten Nummer, die hier durch DIGIT bezeichnet wird. DIGIT ist ein regulären Ausdruck der definiert ist als "\d", d.h. als eine beliebige Ziffer.
Zu DIGIT kommt man durch die Erkennung folgender Sequenz von Token:
"GetVersionMajor" "(" ")" "const" "{" "return" DIGIT
Man hätte auch einfach nach:
"GetVersionMajor() const { return"
suchen können. Die Tokensequenz ist aber insofern vorzuziehen, als sie tolerant gegenüber verschiedenen Formatierungen ist. Mit der Tokensequenz wird z.B. auch folgender Text erkannt:
GetVersionMajor() const
{
return 1;
}
Aus der Tokensequenz wird eine vollständige Funktion zum Austausch der Versionsziffer, wenn man sie mit sogenannten semantischen Aktionen anreichert. Das sieht dann so aus:
VersionMajor( int xiMajor )
(>
{{
unsigned int ui = State.Position();
}}
"GetVersionMajor" "(" ")" "const" "{" "return"
{{
cout << State.text(ui, State.Position());
}}
DIGIT
{{
cout << " " << xiMajor;
}}
<)
(Die Symbole "(>" und "<)" bezeichnen hier den Anfang und das Ende eines Regeltextes.)
In der Variablen ui wird zunächst die Textposition zwischengespeichert an der "GetVersionMajor" beginnt und nach der Erkennung von "return" wird die gesamte Tokensequenz in die Ausgabe kopiert. DIGIT hingegen wird nicht kopiert sondern durch den neuen Wert xiMajor ersetzt, der als Parameter übergeben wurde.
Der vollständige Wert für die neue Versionsnummer wird in der Startregel des Projekte übergeben. Die Startregel besteht in dem Aufruf einer zweiten Regel, der die neue Versionsnummer als Parameter übergeben wird:
VersionUpdate( )
(>
NewVersion[1,2,0,0]
<)
Das Grundgerüst der Programms besteht nun darin den Text zu überspringen und zugleich zu kopieren, bis "GetVersionMajor" gefunden wird. Dann geht es analog weiter mit "VersionMinor", "VersionRelease" und "VersionBuild". Danach wird bis zum Ende des Textes gesprungen, wobei auch dieser Rest kopiert wird.
NewVersion( int xiMajor, int xiMinor, int xiRelease, int xiBuild ) (> SKIP {{cout << State.copy(); }} ( VersionMajor[xiMajor] SKIP {{cout << State.copy(); }} VersionMinor[xiMinor] SKIP {{cout << State.copy(); }} VersionRelease[xiRelease] SKIP {{cout << State.copy(); }} VersionBuild[xiBuild] SKIP {{cout << State.copy(); }} | {{ AddWarning(SourceName() + " has no version info\n"); }} ) <)
Falls "GetVersionMajor" im Text gar nicht vorkommt, wird er ohne Änderung vollständig kopiert und es wird ein Warnhinweis gegeben, der im Transformations-Manager angezeigt wird.
Im Transformations-Manager kann nun eine Liste der Dateien erstellt werden, die die Versionsinformationen enthalten.
Die Liste der Dateien und die vorgenommenen Einstellungen werden als sogenanntes "Management" gespeichert.
backup_root = C:\Programme\TextTransformer\Backup
log_file = C:\Programme\TextTransformer\Log\transformation.log
+ D:\C_biblio\cpp_interpreter\plugin_cppinterpreter.h
+ D:\Tetra\plugin_ttimport.h
+ D:\Tetra\Gui\plugin_paramwizard.h
+ D:\Tetra\Gui\plugin_newprjwizard.h
+ D:\Tetra\Gui\plugin_nodewizard.h
+ D:\Tetra\Gui\plugin_ftwizard.h
+ D:\Tetra\Gui\plugin_pggwizard.h
+ D:\Tetra\Tgmr\plugin_tmgr.h
+ D:\Tetra\plugin_gencppcode.h
Beim nächsten Update braucht nun nicht mehr getan zu werden, als die Nummern in der Startregel des Projektes neu zu setzen:
NewVersion[1,2,1,0]
das Management in den Transformations-Manager zu laden und auf den Start-Schalter zu drücken.
Bild: Liste der Quelldateien
Bild: Einstellung der Transformations-Optionen
Bild: Transformations-Resultate
english
Letzte Neuigkeiten |
28.10.24
Delphi2Cpp 2.5: in Groß- und Kleinschreibung mit Deklarationen übereinstimmende Symbolnamen [more...] |
26.08.24
Delphi2Cpp 2.4: Aktualisiert auf RAD Studio 12.1 Athen [more...] |
"...Fantastic!!!! ... You have exceeded my expectations and I love your product. We will get a lot of use out of it in the future for other projects." Charles Finley
xformix 23-02-07
|
I was extremely impressed with your components and tools. Not only extremely powerful but very professionally done and well documented, etc. Really quality work, congratulations
mouser (First Author, Administrator)
Diese Homepage ist aus einfachen Texten mit [Minimal Website ]generiert.
|
Minimal Website ist mit Hilfe des TextTransformers hergestellt.
|
Der TextTransformer ist gemacht mit dem Borland
CBuilder
|