home *** CD-ROM | disk | FTP | other *** search
-
- -----------------------------------------------
-
- ProgED V2.x by Giovanni Lambiase (C) 1995-96
-
- Entwickleranmerkungen
-
- -----------------------------------------------
-
-
- --------------------
- 1. Hauptstrukturen
- --------------------
-
- Wenn Sie etwas über Strukturen wissen möchten, finden Sie mehr
- darüber in der Datei PED.h.
-
-
-
- ------------
- 2. Scanner
- ------------
-
- Ein Scanner muß so geschrieben sein, daß sie eine ASM- oder eine
- C-Funktion verwendet. Wenn Sie eine C-Funktion verwenden, MÜSSEN Sie
- die __asm, __saveds & register __XX - Direktiven des SAS/C verwenden.
- Außerdem dürfen Sie KEINE Startup-Module verwenden. Die erste Stelle
- muß die Startstelle der Funktion sein. Die Suchfunktion erhält zwei
- Argumente im A0- und A1-Register:
-
- A0: Adresse des Zeilenpuffers. Es zeigt auf einen 0-terminierten
- String.
-
- A1: Adresse des Namenspuffers.
-
- Die Funktion MUSS in D0 die Länge des Strings, der in dem durch
- A1 indizierten Puffer abgelegt wurde, zurückliefern. Wenn die Funktion
- fehlschlug, muß eine 0 zurückgeliefert werden.
-
- ANMERKUNG: Sie MÜSSEN alle Register beim Einstieg auf den Stack
- retten und beim Beenden zurückholen.
-
-
-
- --------------
- 3. Faltungen
- --------------
-
- Sie können mit den gleichen Regeln wie in Scanner Faltungen erstellen:
-
- 1) Verwenden Sie eine C- oder ASM-Funktion
- 2) Verwenden Sie __asm, __saveds & register __XX-Direktiven
- 3) Verwenden Sie keine Startup-Module
- 4) Erste Stelle muß der Funktionsstart sein.
- 5) Sie müssen alle Register auf dem Stack retten und am Ende
- restaurieren.
-
- Ein Falter erhält Argumenten in den folgenden Registern:
-
- A0: Adresse der PEDWindow-Struktur. Sie müssen an dem Text in diesem
- Fenster arbeiten.
-
- D0: Cursor-Spaltennummer (0=erste Spalte).
-
- D1: Cursor-Zeilennummer (0=erste Zeile). Dieser Wert ist ABSOLUT. Das
- bedeutet das dies eine ECHTE Zeilennummer vom Textstart an gemessen
- ist.
-
- A1: Adresse eines Langwortes. An dieser Adresse MUSS die Funktion
- die Startzeilennummer der Faltung als Langwort schreiben, wenn
- eine gefunden wurde. Um diesen Wert zu berechnen, muß die Funktion
- die ABSOLUTE Zeilennummer ermitteln (0=erste Zeile).
-
- A2: Adresse eines Langwortes. An dieser Adresse MUSS die Funktion
- die Endzeilennummer der Faltung als Langwort schreiben, wenn
- eine gefunden wurde. Um diesen Wert zu berechnen, muß die Funktion
- die ABSOLUTE Zeilennummer ermitteln (0=erste Zeile).
-
- A3: Zeigt auf einen Puffer. Wenn Ihre Funktion eine Faltung gefunden
- hat, muß sie in diesen Puffer den Namen der Faltung eintragen.
- ProgED zeigt ihn an. Normalerweise schreiben Sie hier den Namen
- der gefundenen Funktion hinein.
-
- Die Scannerfunktion MUSS in D0 eine 1 zurückliefern, wenn eine Faltung
- gefunden wurde, ansonsten 0. Wenn eine Faltung gefunden wurde, muß Ihre
- Funktion die Start- und Endzeilennummern in den Langworten, die von A1
- und A2 indiziert wurden, und den Funktionsnamen in dem Puffer, auf den A3
- zeigt, zurückliefern.
-
- ANMERKUNG: Die 'FOLD ALL'-Funktion wird ausgeführt, indem Ihre Funk-
- tion an ALLEN Zeilen des Textes aufgerufen wird. Bei jedem Aufruf steht
- der Cursor auf der ersten Spalte (D1 enthält 0).
-
-
-
- -----------------
- 4. API-Klienten
- -----------------
-
- ProgED erlaubt es Ihnen, externe Applikationen ("Klienten" genannt)
- einzuklinken. Ein API-Klient ist einfach ein ausführbares Programm (in
- jeder beliebigen Sprache geschrieben). Dieses Programm muß sich selbst
- am ProgED API-Port eintragen. So kann ProgED seine Klienten abtasten
- und ihnen einige Informationen darüber schicken, was sie zu tun haben.
- Die Messages, die ein Klient an ProgED senden kann (an den API-Port,
- genannt "PED_API"), hat die folgende Struktur:
-
- struct APIMessage
- {
- struct Message am_Message;
- ULONG am_MsgType,
- am_MsgArg[10],
- am_RC;
- }
-
- am_Message:
-
- Standard exec-Message
-
- am_MsgType:
-
- Typ der Message
-
- am_MsgArg[]:
-
- Argument-Array der Message
-
- am_RC:
-
- Returncode
-
-
-
-
- Ein Klient kann folgende Nachrichten an ProgED senden:
-
- PED_API_REGISTER:
-
- "Trag mich ein". In am_MsgArg[0] müssen Sie einen Zeiger auf
- die APIClient-Struktur liefern. Diese Nachricht liefert nichts
- zurück.
-
- PED_API_UNREGISTER:
-
- "Trag mich aus". Diese Nachricht muß verwendet werden, wenn der
- Klient weggehen möchte (!?!). In am_MsgArg[0] muß der Pointer
- übergeben werden, den Sie in PED_API_REGISTER verwendet haben.
- Auch diese Funktion liefert nichts zurück.
-
- PED_API_ADD_INTERNAL_COMMAND:
-
- Ein Klient kann neue interne Kommandos hinzufügen. Sie müssen
- eine ArexxExtCmds-Struktur erstellen und seine Adresse in
- am_MsgArg[0] übergeben. Diese Funktion liefert nichts zurück.
-
- PED_API_REM_INTERNAL_COMMAND:
-
- Wenn Sie ein vorher eingefügtes internes Kommando entfernen
- möchten, müssen Sie diese Nachricht verwenden. Schreiben Sie
- die Adresse Ihrer ArexxExtCmds-Struktur in am_MsgArg[0]. Diese
- Funktion liefert nichts zurück.
-
- PED_API_GET_ACTIVE_WINDOW:
-
- Holt die Adresse der momentan aktiven PEDWindow-Struktur.
- Sie finden die Adresse in am_RC.
-
- PED_API_GET_WINDOW_LIST:
-
- Holt den Zeiger auf die erste PEDWindow-Struktur in der ProgED-
- Liste. Sie finden die Adresse in am_RC.
-
- PED_GET_SCREEN_ADDRESS:
-
- Holt die ProgED-Screenadresse. Wenn ProgED momentan ikonifiziert
- ist, wird NULL zurückgeliefert. Sie finden die Adresse in am_RC.
-
- PED_GET_PREFS_ADDRESS:
-
- Holt die Adresse der Prefs-Struktur in am_RC.
-
- PED_GET_PUBSCRNAME:
-
- Holt den ProgED-Publicscreen-Name in am_RC.
-
- ANMERKUNG: Die ArexxExtCmds-Struktur MUSS solange gültig bleiben,
- bis Sie das PED_API_REM_INTERNAL_COMMAND beantwortet haben. Danach
- können Sie sie freigeben oder recyclen.
-
-
-
- ProgED kann einem Klienten folgende Nachrichten schicken:
-
- PED_API_SHOW:
-
- "Ich habe meinen Screen geöffnet. Meine Screen-Adresse ist in
- am_MsgArg[0]. Der PubScreen-Name steht in am_MsgArg[1]". Dadurch
- können Sie Ihre Fenster auf dem ProgED-Schirm öffnen. Sie er-
- halten diese Nachricht NUR DANN, wenn Sie NOTIFY_ON_SHOWHIDE
- im Flagfeld der APIClients-Struktur angegeben haben.
-
- PED_API_HIDE:
-
- "Ich schließe meinen Screen!". Sie erhalten diese Nachricht wenn
- ProgED dabei ist, seinen Schirm zu schließen. Schließen Sie ALLE
- Ihre Fenster. Sie erhalten diese Nachricht NUR DANN, wenn Sie
- NOTIFY_ON_SHOWHIDE im Flagfeld der APIClients-Struktur angegeben
- haben.
-
- PED_API_KEY:
-
- "Benutzer drückte eine Taste!". Der Klient kann die zugehörige
- IntuiMessage-Struktur in am_MsgArg[0] lesen. Dieses Feld ent-
- hält die Adresse auf eine IntuiMessage-Struktur, die eine RAWKEY
- Message angibt. In am_MsgArg[1] bekommt der Klient einen Zeiger
- auf die PEDWindow-Struktur, die die RAWKEY-Nachricht erhalten hat.
- Sie erhalten die Nachricht NUR DANN, wenn Sie NOTIFY_ON_KEY in
- dem Flagfeld der APIClients-Struktur angegeben haben.
-
- ANMERKUNG: Wenn Sie diese Nachricht beantworten, wird ProgED die
- an die Taste angebundene Aktion ausführen. Sie können die
- IntuiMessage auch nicht modifizieren. Es ist eine
- Intuition-Nachricht! (:-o
-
- PED_API_QUIT:
-
- "Ich beende mich!" Wenn Ihr Klient diese Nachricht empfängt,
- MÜSSEN Sie alle Fenster schließen UND sich BEENDEN. Sie dürfen
- den API-Port nach dieser Nachricht NICHT MEHR verwenden! Ihr
- Klient sollte nicht versuchen, Kommandos und die Registration
- zu entfernen. SIE MÜSSEN SICH EINFACH NUR BEENDEN!
-
-
-
- Hier finden Sie ein paar Informationen über die APIClient-Struktur.
-
-
- struct APIClient
- {
- struct MsgPort *ac_ClientPort;
- ULONG ac_Notify;
- char *ac_name;
- struct APIClient *ac_Next;
- }
-
- ac_ClientPort:
-
- Adresse des MessagePorts des Klienten. Sie müssen hier einen
- MessagePort angeben. ProgED sendet die Nachrichten auf diesem
- Port zu Ihnen.
-
- ac_Notify:
-
- Wenn Sie NOTIFY_ON_SHOW_HIDE angeben, erhalten Sie die
- PED_API_SHOW und PED_API_HIDE-Nachrichten. Mit NOTIFY_ON_KEY
- erhalten Sie einige Informationen über Tastendrücke durch
- PED_API_KEY-Nachrichten.
-
- ac_Name:
-
- Name des Klienten.
-
- ac_Next:
-
- Auf NULL setzen. Es wird nachher mit der Adresse des nächsten
- Klienten ausgefüllt.
-
-
-
-
- struct ArexxExtCmds
- {
- UBYTE External;
- char *Name;
- char *Template;
- void *Defaults[MAXREXXARGS];
- LONG ASM (*CommFunc)( RG(a0) struct CommandData *);
- struct ArexxExtCmds *NextCmd;
- }
-
- External:
-
- Setzen Sie es auf TRUE. Das bedeutet, es ist ein "externes" Kommando.
-
- Name:
-
- Kommandoname. Write it using case letters.
-
- Template:
-
- ReadArgs-Muster.
-
- Default[]:
-
- Array mit Defaultwerten für die Argumente.
-
- CommFunc:
-
- Adresse der Funktion zu diesem Kommando. Diese Funktion muß
- in ASM oder mit __asm und __saveds-Direktiven geschrieben
- sein. Sie erhält eine CommandData-Struktur im A0-Register.
- Diese Funktion muß im D0-Register einen Error-Code zurücklie-
- fern (siehe RC_xxx).
-
- NextCmd:
-
- Immer auf NULL setzen.
-
-
-
-
- struct CommandData
- {
- char *CommandLine;
- void **CommandArgs;
- struct MyWindow *CurrentWindow,
- *FirstWindow;
- struct Prefs *CurrentPrefs;
- LONG ASM (*ExecuteInternalCommand)(RG(a0) char *);
- }
-
- CommandLine:
-
- Dieses Feld zeigt auf einen String, der die ganze Kommandozeile
- enthält. Verwenden Sie ihn wie Sie möchten.
-
- CommandArgs:
-
- Zeigt auf ein Array von void *. Dieses Array ist das Ergebnis
- der ReadArgs-Funktion auf den Kommandostring. Siehe ReadArgs,
- wie Sie die Pointer verwenden.
-
- CurrentWindow:
-
- Zeigt auf das aktive PEDWindow.
-
- FirstWindow:
-
- Zeigt auf das erste PEDWindow.
-
- CurrentPrefs:
-
- Zeigt auf die Prefs-Struktur mit den aktuellen Voreinstellungen.
-
- ExecuteInternalCommand:
-
- Dies ist ein Zeiger auf eine Assemblerfunktion. Sie können
- diese Funktion aufrufen, um ein ProgED-internes Kommando aus-
- zuführen. Um dies zu machen, schreiben Sie ins A0-Register
- einen Zeiger auf den Kommandostring, der ausgeführt werden
- soll. Im D0-Register erhalten Sie einen Returncode (RC_xxx).
-
- ANMERKUNG: Verwenden Sie nicht den ProgED-ARexx-Port, um ein
- internes Kommando auszuführen! Dadurch würde sich ProgED und
- der Klient aufhängen!
-
-
-
- -----------------------
- 5. Utility-Funktionen
- -----------------------
-
- Die folgenden C-Funktionen sind nützlich, wenn Sie Ihre eigenen
- Falter und Scanner schreiben möchten. Sie können sie ausschneiden und
- in Ihren eigenen Funktionen verwenden. Diese Funktionen suchen nach
- Zeilen im ProgED-Text.
-
-
-
- /*****
- *
- * FUNKTION: struct Line *SearchLine(struct Line *line,int y)
- *
- * ZIEL: Sucht die y. Zeile (ohne über Falten zu springen),
- * beginnend von der ersten Zeile im Text, die in "line"
- * angegeben wurde.
- *
- * ERGEBNIS: Ein Zeiger auf die gesuchte Zeile
- *
- ****/
-
- struct Line *SearchLine(struct Line *line,int y)
- {
- while(((y--)>0)&&(line)) line=NextLine(line);
- return(line);
- }
-
-
-
- /*****
- *
- * FUNKTION: int SearchLine2(struct Line *line,int y)
- *
- * ZIEL: Sucht nach der Zeilennummer (springt über Faltungen)
- * der Zeile mit der Nummer "y" (ohne Faltungen).
- *
- * ERGEBNIS: Nummer der gesuchten Zeile
- *
- ****/
-
- int SearchLine2(struct Line *line,int y)
- {
- int n=0;
-
- while(((y--)>0)&&(line))
- {
- if (!line->Folder) n++;
- else if (line->NextLine)
- if (!line->NextLine->Folder) n++;
- line=line->NextLine;
- }
- if (line) return(n);
- else return(0);
- }
-
-
-
- /*****
- *
- * FUNKTION: int SearchLine3(struct Line *first,struct Line *line)
- *
- * ZIEL: Sucht nach der Zeilennummer (ohne über Falten zu springen)
- * der Zeile, die mit "line" angegeben wurde. "first" zeigt
- * auf die erste Zeile im Text.
- *
- * ERGEBNIS: Nr. der gesuchten Zeile
- *
- ****/
-
- int SearchLine3(struct Line *first,struct Line *line)
- {
- long n=0;
-
- while(first)
- {
- if (first==line) break;
- n++;
- first=first->NextLine;
- }
- return(n);
- }
-
-
-
- /*****
- *
- * FUNKTION: struct Line *SearchLine4(struct Line *line,int y)
- *
- * ZIEL: Sucht nach der Adresse der Zeile Nummer y. "line"
- * zeigt auf die erste Zeile des Textes. Das Ergebnis
- * der Funktion ist ABSOLUT (springt nicht über Falten).
- *
- * ERGEBNIS: Ein Zeiger auf die gesuchte Zeile
- *
- ****/
-
- struct Line *SearchLine4(struct Line *line,int y)
- {
- while(((y--)>0)&&(line)) line=line->NextLine;
- return(line);
- }
-
-
-
-