/* SE-Protokoll zur Kommunikation zwischen Shells zur Programmentwicklung
 * und Editoren.
 *
 * Dieses Protokoll dient dazu, unter Multitasking-Systemen die Shell
 * zur Compilierung und „hnlichen Sachen zu veranlassen, und um Fehler-
 * meldungen und/oder Fehlerdateien an den Editor zurckzugeben.
 *
 * Kommandos bzw. Nachrichten von der Shell zum Editor beginnen
 * mit SE_, Nachrichten vom Editor zur Shell beginnen mit ES_
 *
 * Da teilweise Zeiger auf Speicherbereiche bergeben werden, ist vom
 * jeweiligen Absender der Nachricht darauf zu achten, daž diese
 * Speicherbereiche vom Empf„nger auch lesbar sind (Memory Protection!).
 * Dafr sind diese als Readable zu allozieren!
 *
 * Version  Datum       Žnderungen
 * =====================================================================
 *   0.1    10.1.94     Erster Entwurf
 *   0.2    17.1.94     SE_TERMINATE hinzugefgt
 *   0.3    25.1.94     SE_CLOSE hinzugefgt.
 *                      tErrInfo ge„ndert, SE_ERROR ge„ndert
 *                      tShellCommands und tEditCommands korrigiert
 */


#define SE_INIT         0x4200
    /* Die Shell fragt an, ob ein Editor das SE-Protokoll
     * versteht.
     * Wort 3: Ein Bitset, welche Nachrichten die Shell versendet
     * Wort 4+5: Ein Bitset, welche Editorkommandos verstanden werden
     * Wort 6: Untersttze Versionsnummer des Protokolls
     * Als Antwort erh„lt es ein ES_OK vom  Editor.
     */

#define SE_OK           0x4201
    /* Die Shell sagt dem Editor, das sie das Protokoll
     * versteht.
     * Wort 3: Ein Bitset, welche Nachrichten die Shell versendet
     * Wort 4+5: Ein Bitset, welche Editorkommandos verstanden werden
     * Wort 6: Untersttze Versionsnummer des Protokolls
     * Wort 7: Die ApId des Programmes, dessen Nachricht beantwortet wird
     */

#define SE_ACK          0x4202
    /* Die Shell best„tigt den Empfang eines Editorkommandos und gibt zurck,
     * ob das Kommando ausgefhrt wird.
     * Wort 3: TRUE: Kommando wird verstanden und ausgefhrt.
     *         FALSE: Das Kommando wird nicht verstanden
     * Eine SE_ACK mit TRUE sagt nichts darber aus, ob das Kommando erfolg-
     * reich ausgefhrt wurde. Es sagt nur, daž die Shell das Kommando
     * versteht und ausfhren wird!
     */

#define SE_OPEN         0x4203
    /* Die Shell sagt dem Editor, daž er einen Text ”ffnen
     * soll. Als Antwort erh„lt die Shell ein ES_ACK
     * Wort 3+4: Ein Zeiger auf den Filenamen des zu ”ffnenden Files
     */

#define SE_ERROR        0x4204
    /* Es ist ein Fehler beim Compilieren aufgetreten.
     * Wort 3+4: Ein Zeiger auf eine Infostruktur, die wie folgt
     *           aufgebaut ist:
     *              Wort 0+1: Ein Zeiger auf den Namen des compilierten Textes.
     *              Wort 2+3: Ein Zeiger auf den Text der Fehlermeldung
     *              Wort 4  : Die Fehlernummer
     * Mit ES_ACK best„tigt der Editor die Meldung.
     */

#define SE_ERRFILE      0x4205
    /* Es sind Fehler aufgetreten. Die Fehlermeldungen stehen in einem
     * Errorfile, welches in der Message spezifiziert wird.
     * Wort 3+4: Ein Zeiger auf den Filenamen des Errorfiles mit den
     *           Fehlermeldungen
     * Wort 5+6: Ein Zeiger auf den Namen des compilierten Textes
     * Mit ES_ACK best„tigt der Editor die Meldung.
     */

#define SE_PROJECT      0x4206
    /* Die Shell teilt dem Editor mit, daž das Projekt
     * ge„ndert wurde. Der Filename des aktuellen
     * Projektfiles wird als Parameter bergeben
     * Wort 3+4: Ein Zeiger auf den Namen des Projektfiles
     * Der Editor best„tigt mit ES_ACK.
     * Eine vernnftige Reaktion des Editors w„re es in dem Fall,
     * ebenfalls das Projekt zu wechseln, sofern er diese untersttzt.
     */

#define SE_QUIT         0x4207
    /* Die Shell teilt dem Editor mit, daž sie jetzt beendet wird.
     * Der Editor sollte in dem Fall die Shell als Kommunikationspartner
     * vergessen.
     * Parameter gibt es keine.
     * Es wird keine Antwort erwartet!
     */

#define SE_TERMINATE      0x4208
    /* Die Shell teilt dem Editor mit, daž dieser sich beenden soll.
     * Der Editor sollte in dem Fall sich selbst beenden und seinen ganz
     * normalen Terminierungsprozež durchlaufen (und in dem auch ein ES_QUIT
     * schicken!). Der Grund fr so eine Meldung der Shell k”nnte zum Beispiel
     * zu wenig Speicher zum compilieren sein.
     * Mit ES_ACK best„tigt der Editor die Meldung.
     */

#define SE_CLOSE          0x4209
    /* Die Shell teilt dem Editor mit, daž dieser alle Texte sichern soll.
     * Der Editor sollte bei ge„nderten Texten vorher nachfragen.
     * Mit ES_ACK best„tigt der Editor die Meldung.
     */


#define ES_INIT         0x4240
    /* Ein Editor fragt an, ob eine Shell das SE-Protokoll versteht.
     * Wort 3: Ein Bitset, welche Shellnachrichten verstanden werden
     * Wort 4+5: Ein Bitset, welche Editorkommandos versendet werden
     * Wort 6: Untersttze Versionsnummer des Protokolls
     * Als Antwort erh„lt es SE_OK von der Shell
     */

#define ES_OK           0x4241
    /* Der Editor beantwortet die Anfrage der Shell nach dem Protokoll.
     * Wort 3: Ein Bitset, welche Shellnachrichten verstanden werden
     * Wort 4+5: Ein Bitset, welche Editorkommandos versendet werden
     * Wort 6: Untersttze Versionsnummer des Protokolls
     * Wort 7: Die ApId des Programmes, dessen Nachricht beantwortet wird
     */

#define ES_ACK          0x4242
    /* Der Editor best„tigt den Empfang des Kommandos
     * Wort 3: TRUE: Kommando wird verstanden und ausgefhrt.
     *         FALSE: Das Kommando wird nicht verstanden
     * Eine ES_ACK mit TRUE sagt nichts darber aus, ob das Kommando erfolg-
     * reich ausgefhrt wurde. Es sagt nur, daž der Editor das Kommando
     * versteht und ausfhren wird!
     */

#define ES_COMPILE      0x4243
    /* Der Editor sagt der Shell, daž sie ein File bersetzen soll.
     * Ein Pointer auf den Dateinamen wird in der Message bergeben.
     * Wort 3+4: Zeiger auf den Namen der zu compilierenden Datei.
     * Diese Nachricht muž mit SE_ACK best„tigt werden.
     */

#define ES_MAKE         0x4244
    /* Der Editor sagt der Shell, daž sie ein Make ausfhren soll.
     * Ein Filename kann in der Message bergeben werden, muž aber
     * nicht gesetzt sein und muž von der Shell auch nicht beachtet
     * werden!
     * Wort 3+4: Zeiger auf den Namen des Makefiles (oder NULL)
     * Die Shell best„tigt mit SE_ACK.
     */

#define ES_MAKEALL      0x4245
    /* Der Editor sagt der Shell, daž ein komplettes Make All ausgefhrt
     * werden soll. Ein Filename fr das Makefile kann (muž nicht) in
     * der Message bergeben werden.
     * Wort 3+4: Zeiger auf den Namen des Makefiles (oder NULL)
     * Die Shell best„tigt mit SE_ACK.
     */

#define ES_LINK         0x4246
    /* Der Editor sagt der Shell, daž das Programm
     * gelinkt werden soll. Ein Filename kann
     * in der Message bergeben werden, muž aber
     * nicht unbedingt beachtet werden von der Shell!
     * Wort 3+4: Zeiger auf den Namen der Source, die gelinkt werden soll
     *           (oder NULL)
     * Die Shell best„tigt mit SE_ACK.
     */

#define ES_EXEC         0x4247
    /* Der Editor sagt der Shell, daž das Programm
     * zu der Source ausgefhrt werden soll. Ein
     * Filename kann bergeben werden, muž von der
     * Shell aber nicht beachtet werden.
     * Wort 3+4: Zeiger auf den Namen des auszufhrenden Files (oder NULL)
     *           Bei einer Sourcedatei ist diese ggf. noch zu
     *           compilieren und/oder zu linken
     * Die Shell best„tigt mit SE_ACK.
     */

#define ES_MAKEEXEC     0x4248
    /* Die Shell soll ein Make ausfhren und danach das Programm ausfhren.
     * Ein Filename fr das Makefile kann (muž nicht) in der Message
     * bergeben werden.
     * Wort 3+4: Zeiger auf den Namen des Makefiles (oder NULL)
     * Die Shell best„tigt mit SE_ACK.
     */

#define ES_PROJECT      0x4249
    /* Der Editor teilt der Shell mit, daž das Project
     * ge„ndert/gewechselt wurde. Der Filename des
     * Projektfiles wird als Parameter in der Message
     * bergeben.
     * Wort 3+4: Zeiger auf den Namen des Projektfiles
     * Die Shell best„tigt mit SE_ACK.
     * Eine vernnftige Reaktion der Shell w„re in dem Fall, ebenfalls
     * das Projekt zu wechseln, sofern es diese untersttzt.
     */

#define ES_QUIT         0x424A
    /* Der Editor teilt der Shell mit, daž er jetzt beendet wird.
     * Die Shell sollte in dem Fall den Editor als Kommunikationspartner
     * vergessen.
     * Parameter gibt es keine.
     * Es wird keine Antwort erwartet!
     */

#define SEPROTOVERSION 0x100  /* Die Versionsnummer des Protokolls.
                               * Highbyte ist die Major Number
                               * Lowbyte ist die Lower Number
                               */

/* Typdefinitionen fr die Nachrichten
 */

/* Dies definiert die einzelnen Bits, welche Nachrichten untersttzt werden
 */

/* Shell-Kommandos
 */
#define _SEINIT      0x0001
#define _SEOK        0x0002
#define _SEACK       0x0004
#define _SEOPEN      0x0008
#define _SEERROR     0x0010
#define _SEERRFILE   0x0020
#define _SEPROJECT   0x0040
#define _SEQUIT      0x0080
#define _SETERMINATE 0x0100
#define _SECLOSE     0x0200

/* Editor-Kommandos
 */
#define _ESINIT      0x0001
#define _ESOK        0x0002
#define _ESACK       0x0004
#define _ESCOMPILE   0x0008
#define _ESMAKE      0x0010
#define _ESMAKEALL   0x0020
#define _ESLINK      0x0040
#define _ESEXEC      0x0080
#define _ESMAKEEXEC  0x0100
#define _ESPROJECT   0x0200
#define _ESQUIT      0x0400


typedef struct
{
 char *errFile;         /* Zeiger auf den Namen der compilierten Datei
                         */
 char *errMess;         /* Zeiger auf die Fehlermeldung
                         */
 int errNum;            /* Die Fehlernummer
                         */
 long errLine;          /* Die fehlerhafte Zeile
                         */
 int errRow;            /* Die Spalte mit dem Fehler (oder 0)
                         */
} ERRINFO;
