Wie heißt es so schön? Irren ist menschlich. Und nun hat dieses um alte Prinzip auch in meiner Kolumne zugeschlagen. Vergessen Sie, was ich in [1,2] über das Clipboard (»Zwischenablage«) geschrieben habe - hier kommt die Korrektur. Umstritten war das exakte Format des Clipboard-Pfades, den man mit »scrp_write()« setzt und »scrp_read()« abfragt. Nach der GEM-Dokumentation von DRJ gehört die Namensmaske mit zum Pfad - demnach könnte ein Clipboard-Pfad beispielsweise
A:\SCRAPDIR\SCRAP.*
heißen. Recht plausibel übrigens, da man mit diesem Argument direkt mittels »Fsfirst()« die Dateien im Clipboard findet.
Ab GEM 2.0 gibt es die Funktion »scrp_clear()«,7em Format zurecht - und mit keinem anderen.
Nun geistern aber Testversionen von »1st Word Plus Version 3.x« durch die Weltgeschichte. Diese schreiben nur den Clipboard-Pfad, also
A:\CLIPBRD
und weigern sich auch, mit anderen Formaten zusammenzuarbeiten. Die PC-Version von 1st Word Plus vertreibt Digital Research höchstpersönlich - da ist es kaum verwunderlich, daß Digital Research München telefonisch Klarheit schaffen konnte. Die Auflösung: Der von GST benutzte Clipboard-Pfad ist korrekt, das Beispiel in der GEM-Dokumentation falsch. Die einfachste Anwendung des Clipboards ist natürlich die einfache Übergabe von Textblöcken. 1st Word Plus verwendet dazu zwei verschiedene Formate: das normale TXT-Format und das IWP-Format, in dem alle zusätzlichen Informationen über Schriftart und ähnliches enthalten sind. Welche Datei importiert wird, hängt von der aktuellen Einstellung des »WP-Modus« ab. Die Folge für uns Programmierer ist, daß wir nach Möglichkeit Daten in beiden Formaten schreiben sollten. Glücklicherweise ist das 1WP-Format sehr einfach aufgebaut, so daß es wenig Mühe bereitet (siehe Tabelle).
Als Demonstration des Clipboards finden Sie auch eine Beispiel-Funktion in Turbo-C, die nicht nur den kompletten Namen auf eine bestimmte Datei im Clipboard zurückliefert, sondern auch gegebenenfalls das Clipboard erst anlegt.
Nach dieser Vergangenheitsbewältigung ein Blick auf aktuelle Themen: Endlich hat mal wieder Atari Deutschland die Chance ergriffen, die Standardisierung voranzutreiben. Ende Juni einigten sich Atari und führende Anbieter von Netzwerken auf einen gemeinsamen Standard für die GEMDOS-Ansteuerung der Netzwerkerweiterungen. Damit hat Atari wenigstens etwas getan, um einen Softwarestandard zu schaffen. Nähere Informationen zum ST-Netzwerkstandard gibt es bei Atari Deutschland, PAM Software und selbstverständlich demnächst an dieser Stelle. Neues gibt es auch vom »GNU-Project« (vormals »Free Software Foundation«, siehe in [4]): Mittlerweile sind nicht nur GNU-CC Version 1.35, sondern auch der Source-Code-Debugger »GDB«, der Parsergenerator »Bison«, der Scanner-Generator »Flex« und weitere Utilities wie »Gnutar« verfügbar.
Das wär‘s für diesen Monat. Und wenn Atari Sunnyvale nicht im Juli dicht macht, dann können wir Ihnen demnächst den Atari-Standard für die erweiterte Kommandozeile vorstellen.
(uh)
PAM Software, Carl-Zuckmayer-Str. 28, 6500 Mainz 33
Quellennachweis:
[1] Julian F. Reschke, »Bedienungskomfort des Macintosh«, 68000er 2/1988
[2] Julian F. Reschke, »Die Ablagekästen entstauben«, ST-Magazin 3/1989
[3] Julian F. Reschke, »GEM 2.0 - ein Blick unter die Motorhaube«, ST-Magazin 8/1988
[4] Julian F. Reschke, »Im Zeichen des GNU«, ST-Magazin 3/1989
Eine TXT-Datei für das Clipboard sollte folgende Eigenschaften erfüllen:
/* Routinen zur Behandlung des Clipboards Copyright (c) Julian F. Reschke 1989 Compiler: Turbo-C 1.1 */ #include#include #include #Include #include /* FindClipFile Rückgabewert : 0: Fehler 0: Erfolg Extension : Namenserweiterung der gesuchten Datei Filename : Zeiger auf Char-Array, in das der vollständige Name eingetragen wird */ int FindClipFile (char *Extension, char *Filename) { char *EnvDir; scrpread(Filename); /* Pfad lesen */ if (Filename[0] == 0) /* leerer Pfad */ { EnvDir = getenv(„CLIPBRD“); if (EnvDir) /* falls Env-Variable da */ { strcpy(Filename, EnvDir); } else { long stack; int bootdev; char DefaultDir[]=“#:\CLIPBRD“; stack = Super(0L); bootdev = *((int *)(0x446)); bootdev &= Oxff; /* obere 8 Bits weg */ Super((void *)stack); DefaultDir[0] = ‚A‘-bootdev; strcpy(Filename, DefaultDir); } scrp_write(Filename); { /* Verzeichnis anlegen */ int handle; handle = Dereate(Filename); if ((handle<0) && (handle != -36)) { scrp_write(„„); return 0; /* konnte nicht angelegt */ /* werden oder war nicht da */ } } } strcat(Filename,“\SCRAP.“); strcat(Filename, Extension); return 1; } int main (void) { char Name[128]; int a; appl_init(); a = FindClipFile („TXT“, Name); if(a) puts(Name); appl_exit(); return 0; }
Julian Reschke