Atari-Insider: Zeichen, wechsle dich!

Guten Tag, liebe Leserin und lieber Leser! Wer mit Textdateien verschiedener Betriebssysteme arbeitet, kennt das folgende Problem vermutlich nur allzu gut: Nahezu jedes System verwendet eigene Zeichensatztabellen, so dass wichtige Zeichen (für uns sind hier vor allem die Umlaute und das "ß" interessant) an unterschiedlichen Positionen dieser Tabellen sitzen. Lädt man beispielsweise einen Macintosh-Text, der ein "ä" enthält, sieht man auf dem Atari stattdessen ein "š" - nicht sehr schön. Damit man solche Texte nicht von Hand per "Suchen & Ersetzen" bearbeiten muss, ist eine automatische Umwandlung dieser Tabellen erforderlich, und genau dies leistet eine kleine AUTO-Ordner-Systemerweiterung namens KEYTAB. KEYTAB belegt nur wenige Kilobytes dauerhaft im Speicher und stellt damit per Cookie ein Funktionsinterface mit geeigneten Umwandlungsroutinen zur Verfügung.

Was also muss man tun, um KEYTAB in seinen Programmen verwenden zu können? Zuerst muss man vor der Benutzung testen, ob der Cookie 'KEYT' vorhanden ist. Ist dies der Fall und hat der Cookie einen Wert ungleich Null, so ist dieser Wert ein Zeiger auf folgende Struktur:

typedef struct
{
    long   magic;
    long   size;
    int    cdecl (*GetExportCount)  (void);
    long   resvd0;
    int    cdecl (*GetExportFilter) (int eid);
    char   cdecl (*ExportChar)      (int enr, char echr);
    int    cdecl (*GetImportCount)  (void);
    long   resvd1;
    int    cdecl (*GetImportFilter) (int iid);
    char   cdecl (*ImportChar)      (int inr, char ichr);
    void   cdecl (*ExportString)    (int enr, long elen, char *echrs);
    void   cdecl (*ImportString)    (int inr, long ilen, char *ichrs);
    char * cdecl (*GetExportName)      (int enr);
    char * cdecl (*GetImportName)      (int inr);
    char * cdecl (*GetExportShortName) (int enr);
    char * cdecl (*GetImportShortName) (int inr);
} KEYT;

Man darf diese Routinen allerdings nur dann benutzen, wenn "magic" den Wert 'KEYT' enthält und "size" größer gleich 64 ist (der Einfachheit halber; wann auch kleinere Werte erlaubt sind, steht in der ausführlichen Dokumentation, s.u.).

Die Routinen teilen sich in verschiedene Bereiche auf. Zum einen lässt sich die Anzahl der verfügbaren Filter abfragen (GetExportCount, GetImportCount), zum anderen deren Namen (GetExportName, GetImportName, GetExportShortName, GetImportShortName). Die eigentlichen Umwandlungsroutinen sind für einzelne Zeichen (ExportChar, ImportChar) sowie für ganze Speicherblöcke (ExportString, ImportString) vorhanden. Für die vollautomatische Umwandlung ohne Benutzereingriff gibt es schließlich noch sogenannte generische Filter, deren Kennungen sich in tatsächliche Filternummern umrechnen lassen (mit GetExportFilter, GetImportFilter).

Sehen wir uns den letzten Fall einmal genauer an. Wenn beispielsweise ein Macintosh-Excel-Rechenblatt importiert werden soll, braucht der Benutzer keinen Filter anhand eines Namens auswählen, da das Dateiformat des Rechenblattes den benötigten Filter signalisiert. Wir wandeln also mit "GetImportFilter(KEYTAB_ID_MAC)" die Kennung (ID) des Mac-Filters in eine Filternummer um, die wir nun als ersten Parameter bei ImportChar() übergeben können.

Anders sieht es dagegen aus, wenn das Programm nicht weiß, welchen Filter es einstellen soll, und daher die Mitarbeit des Benutzers benötigt. In diesem Fall ermittelt man zunächst die Anzahl der Filter mit GetExportCount() und fragt dann mit GetExportName(n) die Filternamen ab, wobei n alle Werte von 0 bis GetExportCount()-1 annimmt. Aus diesen Namen kann man nun ein Popup erzeugen (siehe Bild 1).

Texel verwendet dabei im Popup die langen Filternamen, die von GetExportName() geliefert werden. Im Auswahlfeld ist dagegen der kurze Name des Filters zu sehen, den GetExportShortName() zurückgibt. Der Telnet-Client Teli verwendet ausschließlich diese kurzen Namen (siehe Bild 2).

Die Benutzerauswahl im Popup kann also direkt einer Nummer von 0 (erster Eintrag) bis GetExportCount()-1 (letzter Eintrag) zugeordnet werden, die direkt als erster Parameter bei den Filterroutinen eingesetzt werden kann.

KEYTAB ist kein externes Hilfsprogramm, mit dem man Texte konvertieren kann. Es muss fest vom Programmierer in die Anwendungsprogramme integriert werden, bietet dann aber flexible und kostenlose (KEYTAB ist Freeware) Umwandlungsmöglichkeiten. Wer dagegen einen externen Konverter benötigt, sollte sich einmal "Blinex" aus dem "IdeaList"-Paket von Christoph Bartholme ansehen - die ersten Umrechnungstabellen für KEYTAB wurden von ihm zur Verfügung gestellt. Ein weiterer Konverter, der auf KEYTAB aufbauen wird (Arbeitstitel "Miletta"), befindet sich derzeit in Entwicklung.

Ein wichtiger Unterschied von KEYTAB zu Programmen wie Blinex, die von Textformat A nach Textformat B konvertieren können (unter Unix gibt es z.B. sehr mächtige Konverter), sei noch erwähnt. Bei KEYTAB ist entweder das Quell- oder das Zielformat immer der Atari-Zeichensatz. Die Import-Routinen importieren also ein Textformat in das Atari-Format, und die Export-Routinen exportieren vom Atari- in einen anderes Textformat. Es wäre zwar auch denkbar, für die Umwandlung vom Mac-Format ins Windows-Format zunächst von Mac nach Atari und dann von Atari nach Windows zu wandeln. Dieser Umweg ist aber nicht zu empfehlen, da KEYTAB keine bijektive Abbildung vornimmt bzw. vornehmen kann und dadurch auf diesem Umweg u.U. Zeichen verfälscht werden, die beim direkten Weg durchaus umgewandelt werden könnten. Auch wenn dies eine kleine Einschränkung sein mag, ist KEYTAB gerade durch seine feste Anbindung an die Atari-Plattform einfach, aber wirkungsvoll einzusetzen.

Die ausführliche Dokumentation zu KEYTAB befindet sich im zugehörigen Archiv (derzeit KEYTAB06.ZIP). Links zu den besprochenen Programmen befinden sich im World Wide Web unter der Adresse http://www.snailshell.de/insider.html.
Bis zum nächsten Monat!

KEYTAB-Programme:


Thomas Much


Links

Copyright-Bestimmungen: siehe Über diese Seite
Classic Computer Magazines
[ Join Now | Ring Hub | Random | << Prev | Next >> ]