texttransformer.jpg

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&auml;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 &uuml;bergeben wurde.
Der vollst&auml;ndige Wert f&uuml;r die neue Versionsnummer wird in der Startregel des Projekte &uuml;bergeben. Die Startregel besteht in dem Aufruf einer zweiten Regel, der die neue Versionsnummer als Parameter &uuml;bergeben wird:

VersionUpdate( )
(>
NewVersion[1,2,0,0]
<)

Das Grundger&uuml;st der Programms besteht nun darin den Text zu &uuml;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 &Auml;nderung vollst&auml;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&auml;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&uuml;cken.

Bild: Liste der Quelldateien
Bild: Einstellung der Transformations-Optionen
Bild: Transformations-Resultate



   english 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


top_prize_winner.png

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
Minimal Website ist mit Hilfe des TextTransformers hergestellt.

TextTransformer
Der TextTransformer ist gemacht mit dem Borland CBuilder

  borland