<\body> Ganz zum Anfang eine Vorbemerkung: Wenn es darum geht, Schnittstellen zu einem Fremd-Programm zu entwerfen, ändern Sie den Quellcode des Anwenderprogramms so, dass es mit zusammenarbeitet. Sie müssen den Quellcode des Anwenderprogramms also besitzen. Ein Beispiel zu analysieren, ist der einfachste Weg, um zu lernen, wie man eine neue Schnittstelle von zu einem Fremd-Programm installiert. In dem Unterverzeichnis Ihres -Verzeichnisses, plugins/mycas, finden Sie ein Beispiel für ein simples \RComputer Algebra System'' mit dem Namen . Dort finden sie auch die Datei mit diesem wirklich einfachen Programm. Das Programm finden Sie auÿerdem am Ende dieses Abschnitts. Um es zu testen, müssen Sie es mit dem Befehl <\verbatim> \ \ \ \ g++ mycas.cpp -o mycas kompilieren und die so erzeugte ausführbare Datei in ein Verzeichnis Ihres Suchpfads übertragen. Wenn Sie dann neu starten, sollten Sie im Menü den Befehl finden. Lassen Sie und den Quellcode von Schritt für Schritt durchgehen. Die Kommunikation geht über die normalen Eingabe- und Ausgabekanäle. Damit aber weiÿ wann die Ausgabe des Programms beendet ist, muss der Output in Blöcke eingekapselt werden und zwar mit drei speziellen Steuer-Buchstaben, die Sie so definieren:t\ <\verbatim> \ \ \ \ #define DATA_BEGIN \ \ ((char) 2) \ \ \ #define DATA_END \ \ \ \ ((char) 5) \ \ \ #define DATA_ESCAPE \ ((char) 27) Der -Buchstabe dient zur Maskierung. Ein unmittelbar folgender Buchstabe bleibt c, auch wenn es einer der Steuerbuchstaben ist. Ein Beispiel, wie und gebraucht werden, zeigt der Begrüÿungstext beim Start des Programms:\ <\verbatim> \ \ \ \ int \ \ \ main () { \ \ \ \ \ cout \\ DATA_BEGIN \\ "verbatim:"; \ \ \ \ \ cout \\ "------------------------------------------------------\\n"; \ \ \ \ \ cout \\ "Welcome to my test computer algebra system for TeXmacs\\n"; \ \ \ \ \ cout \\ "This software comes with no warranty whatsoever\\n"; \ \ \ \ \ cout \\ "(c) 2001 \ by Joris van der Hoeven\\n"; \ \ \ \ \ cout \\ "------------------------------------------------------\\n"; \ \ \ \ \ next_input (); \ \ \ \ \ cout \\ DATA_END; \ \ \ \ \ fflush (stdout); Die erste Zeile von sorgt dafür, dass in das Format \R`` zur Ausgabe benutzt wird. Die Funktion die nach dem Begrüÿungstext erscheint, erzeugt eine Eingabe-Aufforderung. Sie wird unten genauer erklärt. schlieÿt den Begrüÿungsblock und teilt mit, dass auf Eingaben wartet. Vergessen Sie nicht den Puffer mit fflush zu leeren, damit die gesamte Information auch wirklich erhält. Die Hauptschleife, main loop, beginnt mit der Abfrage, ob im Eingaben im Input-Kanal \ vorhanden sind:\ <\verbatim> \ \ \ \ \ \ while (1) { \ \ \ \ \ \ \ char buffer[100]; \ \ \ \ \ \ \ cin \\ buffer; \ \ \ \ \ \ \ if (strcmp (buffer, "quit") == 0) break; Haben Sie \Rquit'' eingegeben, wird das Programm beendet. Die Ausgabe von , die als Reaktion auf eine Ihre Eingabe erfolgt, muss wieder in einen --Block. eingeschlossen werden:\ <\verbatim> \ \ \ \ \ \ \ \ cout \\ DATA_BEGIN \\ "verbatim:"; \ \ \ \ \ \ \ cout \\ "You typed " \\ buffer \\ "\\n"; Innerhalb eines solchen Blocks, kann man rekursiv weitere Blöcke senden, die unterschiedliche Formate haben dürfen. Z.B. schickt der folgende Code eine -Formel:\ <\verbatim> \ \ \ \ \ \ \ \ cout \\ "And now a LaTeX formula: "; \ \ \ \ \ \ \ cout \\ DATA_BEGIN \\ "latex:" \\ "$x^2+y^2=z^2$" \\ DATA_END; \ \ \ \ \ \ \ cout \\ "\\n"; Manchmal kann es nützlich sein, direkt im -Format zu schicken, indem die \ - Darstellung benutzt wird: <\verbatim> \ \ \ \ \ \ \ \ cout \\ "And finally a fraction "; \ \ \ \ \ \ \ cout \\ DATA_BEGIN \\ "scheme:" \\ "(frac \\"a\\" \\"b\\")" \\ DATA_END; \ \ \ \ \ \ \ cout \\ ".\\n"; Zum Schluss muss ein abschlieÿendes gesendet und der Puffer geleert werden:\ <\verbatim> \ \ \ \ \ \ \ \ next_input (); \ \ \ \ \ \ \ cout \\ DATA_END; \ \ \ \ \ \ \ fflush (stdout); \ \ \ \ \ } \ \ \ \ \ return 0; \ \ \ } Es ist zu beachten, dass Sie niemals mehr als einen --Block senden dürfen. Denn unterstellt, wenn es einen solchen Block erhalten hat, dass Ihr Programm auf Eingaben wartet. Wenn Sie mehrere --Blöcke senden müssen, dann müssen Sie diese zusammen in einen gemeinsamen Block einschlieÿen. Ein spezieller \RKanal`` wird für die Übertragung der Eingabeaufforderung benutzt. Kanäle werden als spezielle --Blöcke definiert: <\verbatim> \ \ \ \ static int counter= 0; \ \ \ void \ \ \ next_input () { \ \ \ \ \ counter++; \ \ \ \ \ cout \\ DATA_BEGIN \\ "channel:prompt" \\ DATA_END; \ \ \ \ \ cout \\ "Input " \\ counter \\ "] "; \ \ \ } Innerhalb des \Rprompt`` -Kanals, dem Eingabeaufforderungs-Kanal, kann man wiederum \ verschachtelte --Blöcke verwenden. Somit kann man auch Formeln für die Eingabeaufforderung verwenden. Es gibt drei Standardkanäle: <\description> >Standard-Ausgabe-Kanal. >Eingabeaufforderungs-Kanal. >Damit lässt sich eine Vorgabe für die nächste Eingabe erzeugen. Man kann PostScript-Graphik als Ausgabe schicken. Nehmen wir einmal an, dass Sie in Ihrem Heimat-Verzeichnis ein Bild haben. Wenn Sie die Zeilen <\verbatim> \ \ \ \ \ \ \ \ cout \\ "A little picture:\\n"; \ \ \ \ \ \ \ cout \\ DATA_BEGIN \\ "ps:"; \ \ \ \ \ \ \ fflush (stdout); \ \ \ \ \ \ \ system ("cat $HOME/picture.ps"); \ \ \ \ \ \ \ cout \\ DATA_END; \ \ \ \ \ \ \ cout \\ "\\n"; an einer passenden Stelle der Hauptschleife einfügen, wird ihr Bild als Teil der Programm-Ausgabe auf dem Bildschirm erscheinen. <\verbatim> #include \stdio.h\#include \stdlib.h\#include \string.h\#include \iostream.h\#define DATA_BEGIN \ \ ((char) 2)#define DATA_END \ \ \ \ ((char) 5)#define DATA_ESCAPE \ ((char) 27)static int counter= 0;voidnext_input () { \ counter++; \ cout \\ DATA_BEGIN \\ "channel:prompt" \\ DATA_END; \ cout \\ "Input " \\ counter \\ "] ";}intmain () { \ cout \\ DATA_BEGIN \\ "verbatim:"; \ cout \\ "------------------------------------------------------\\n"; \ cout \\ "Welcome to my test computer algebra system for TeXmacs\\n"; \ cout \\ "This software comes with no warranty whatsoever\\n"; \ cout \\ "(c) 2001 \ by Joris van der Hoeven\\n"; \ cout \\ "------------------------------------------------------\\n"; \ next_input (); \ cout \\ DATA_END; \ fflush (stdout); \ while (1) { \ \ \ char buffer[100]; \ \ \ cin \\ buffer; \ \ \ if (strcmp (buffer, "quit") == 0) break; \ \ \ cout \\ DATA_BEGIN \\ "verbatim:"; \ \ \ cout \\ "You typed " \\ buffer \\ "\\n"; \ \ \ cout \\ "And now a LaTeX formula: "; \ \ \ cout \\ DATA_BEGIN \\ "latex:" \\ "$x^2+y^2=z^2$" \\ DATA_END; \ \ \ cout \\ "\\n"; \ \ \ cout \\ "And finally a fraction "; \ \ \ cout \\ DATA_BEGIN \\ "scheme:" \\ "(frac \\"a\\" \\"b\\")" \\ DATA_END; \ \ \ cout \\ ".\\n"; \ \ \ next_input (); \ \ \ cout \\ DATA_END; \ \ \ fflush (stdout); \ } \ return 0;} <\initial> <\collection>