Vorausschau

Top  Previous  Next

Beispiele > BinaryCheck > Vorausschau

 

Das Projekt besteht aus nur zwei Produktionen. Die eine, IsBinary, ist extrem simpel:

 

SKIPNULL

 

Sie kann einen String nur erfolgreich parsen, wenn er mit einer binären Null endet.

 

Diese Produktion wird innerhalb der Produktion BinaryCheck zur Vorausschau verwendet:

 

IF(!IsBinary())

  SKIP? {{ out << xState.str(); }}

END

 

Syntaktisch wird der Unterschied der Verwendung als Vorausschau zu einem normalen Aufruf einer Produktion durch das angehängte Klammerpaar "( )" innerhalb der IF-Klammern gekennzeichnet.

Bei der Vorausschau wird die Quelldatei ab der aktuellen Position - hier der Dateianfang - solange geparst, bis entweder die Produktion erfolgreich abgearbeitet ist oder bis ein Fehler auftritt. IsBinary ist genau dann erfolgreich, wenn es ein NULL-Zeichen in der Datei gibt.

 

Das kann man im Debugger sehen. Mit dem Öffnen des Projekts sollte die Datei BinaryTest.pdf in den Betrachter geladen worden sein.  Im hexadezimalen Modus des Betrachters kann man auch die NULL-Zeichen sehen. Wenn man mit

 

StepInLA

 

in die Vorausschau hinein geht und den Schalter mehrmals drückt, ergibt sich schließlich folgendes Bild, in dem das gefundene NULL-Zeichen markiert ist.

 

BinaryCheckHexViewer

 

 

Nur, wenn es kein NULL-Zeichen gibt wird die Datei hier als Text-Datei betrachtet. (Tatsächlich könnte die Datei dennoch für eine binäre Verwendung gedacht sein.)

Wenn es eine Textdatei ist, wird mit SKIP? an das Ende gesprungen und der gesamte Text dann vollständig in die Ausgabe geschrieben.

So kann das Projekt als Präprozessor für andere Projekte verwendet werden, der sicher stellt, dass die Quelldatei nicht binär ist.

 

Zusätzlich wird am Anfang von BinaryCheck noch vor der Vorausschau die Größe der Datei geprüft. Binäre Dateien sind oft sehr groß, da sie Bilddaten enthalten oder gar Sprachaufzeichnungen und Filme. Als Grenzwert werden hier 1000000 Bytes gewählt.

 

{{  

int iMaxSize = 1000000;

if( file_size(SourceName()) > iMaxSize )

  throw CTT_Error("file size > " + itos(iMaxSize));

}}

 

Textdateien erreichen selten diese Größe. Ob noch größere Dateien zugelassen werden sollen hängt von der Art der Dateien ab. Auch sollte bedacht werden, dass die Quelldateien zum Parsen vollständig in den Arbeitsspeicher geladen werden.

 

 

 



Diese Seite gehört zur TextTransformer Dokumentation

Home  Inhalt  English