[Allegro] Trick 58, 2. Teil: Datei Byte fuer Byte verarbeiten, z.B. auch XML
Bernhard Eversberg
ev at biblio.tu-bs.de
Mi Dez 10 08:10:47 CET 2008
Trick 58: Strategie der kleinsten Schritte, 2. Teil 2008-12-10
Binäre Dateien Byte für Byte verarbeiten
Trick 58 war unvollendet geblieben: Das Verarbeiten einer Datei Zeichen
für Zeichen mit Erstellen einer neuen Datei wurde nicht klar vorge-
führt. Das wird jetzt nachgeholt. Brauchen kann man das immer dann,
wenn eine Datei u.U. keine Zeilentrenner hat, wie z.B. bei XML. Dann
ist vor allem "get" zum Einlesen der nächsten Zeile nicht anwendbar.
Im Kern gibt es dabei zwei Tricks:
1. Die Sequenz
fetch 1
write ^
(Sonderfall: Zeichen ^ wird intern zu ^~)
liest zuerst ein Byte als Zeichen, wobei Steuercodes wie z.B. 13 10
in der Form ^M^J in die iV gesetzt werden (^ und M getrennt!).
Der zweite Befehl schreibt den Inhalt der iV in entsprechender
Weise in die Ausgabedatei, d.h. aus ^M wird wieder der Code 13.
Zwischen diesen beiden Zeilen kann man mit dem eingelesenen Zeichen
natürlich anstellen, was immer man will. Statt des zweiten Befehls
kann man auch ganz andere Dinge machen, schließlich muß nicht für
jedes Zeichen wieder genau ein Zeichen ausgegeben werden.
2. Mit dem Befehl
fetch c
schaut man nach, was das nächste Zeichen ist, ohne daß schon der
Dateizeiger weitergerückt würde. Das braucht man, um nach dem
Einlesen eines '<' schon mal zu spicken, ob als nächstes
ein '/' kommt.
Als Beispiel nehmen wir die Aufgabe, schnell mal eben eine XML-Datei
ein ganz klein wenig leichter lesbar darzustellen:
1. Jedes Tag soll auf neuer Zeile beginnen, schließende Tags aber nicht
2. Die echten Daten, also was zwischen den Tags steht, sollen fett
angezeigt werden.
[Man braucht das nicht wirklich, es gibt ja mächtige XML-Werkzeuge,
angefangen bei notepad++. Es geht nur um das Schema der VerFLEXung
dieser Aufgabe. Anwendbar auch auf HTML.]
So sieht der fertige FLEX aus:
----------------------------------------------------------------
XMLSHOW.FLX : XML-Datei anzeigen, Feldinhalte fett
2008-12-09 : Es wird zunaechst eine RTF-Datei draus gemacht
Aufruf: X xmlshow dateiname
Dateiname steht in iV, oeffnen
open
if no mes Die Datei gibt's nicht;end
Datei zum Schreiben oeffnen
open x xmlshow.rtf
Dateikopf, damit rtf-Anzeige dann klappt
wri Flisthead.rtf
Schleife verarbeitet die Datei zeichenweise
:LOOP
naechstes Zeichen holen
fetch 1
Dateiende? -> :dende
if cancel jump dende
Ist es < oder > ? Dann Sonderbehandlung
if "<" perf k;jump LOOP
if ">" perf g;jump LOOP
normal: Zeichen einfach wieder rausschreiben
wri ^
jump LOOP
:dende
close
Abschluss der rtf-Datei
wri "}}}"
close x
und anzeigen
help xmlshow
end
:k // UPro fuer Zeichen <
welches Zeichen kommt hinter < ?
fetch c
Falls nicht </, dann auch neue Zeile
if not ="47" wri "\\b0 \\par " n "<";return
sonst nur Fett abschalten
wri "\\b0 <"
return
:g // UPro fuer Zeichen >
Fett einschalten, es kommt (vielleicht) ein Inhalt
wri ">\\b "
return
-----------------------------------------------------------------
Mehr Informationen über die Mailingliste Allegro