[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