home *** CD-ROM | disk | FTP | other *** search
- ToolLibrary V 2.06
- ==================
-
- ⌐ by Rⁿdiger Dreier
-
- DER AUTOR ▄BERNIMMT KEINERLEI HAFTUNG F▄R SCH─DEN, DIE AUS DER SACH- ODER
- UNSACHGEM─SSEN BENUTZUNG DES PROGRAMMS ENTSTEHEN !!
- WEITERHIN WIRD KEINE HAFTUNG F▄R DIE FEHLERFREIHEIT DES PROGRAMMS
- ▄BERNOMMEN !!
- BENUTZUNG AUF EIGENE GEFAHR !
-
- Die tool.library ist eine Amiga-Shared-Library und kann genauso wie jede
- andere Library benutzt werden. Um diese Library benutzen zu k÷nnen,
- mⁿssen im LIBS: Ordner noch die beiden folgenden Libraries vorhanden
- sein:
- mathieeedoubbas.library
- mathieeedoubtrans.library
- Die tool.library ist im LIBS: Ordner natⁿrlich am Besten aufgehoben....
-
- Die Funktionen der Library unterteilen sich in die Bereiche
- Stringbearbeitung, Intuition/Graphikunterstⁿtzung und Mathematik.
-
- ╓ffnen der Library:
- struct ToolBase *ToolBase; /* Global */
-
- ToolBase=(struct ToolBase *)OpenLibrary("tool.library,0");
-
- Die Struktur ToolBase enthΣlt Zeiger auf IntuitionBase, GfxBase und die
- beiden MathIeee....Base's. Ein Programm, da▀ die tool.library ÷ffnet,
- braucht daher diese vier Libraries nicht mehr selbst zu ÷ffnen, sonder
- kann direkt an sie gelangen ⁿber:
- IntuitionBase=ToolBase->IntuitionBase etc.
- Das ist vielleicht nicht ganz legitim, aber diese vier Libraries werden
- von tool.library einmal ge÷ffnet und erst wieder geschlo▀en, wenn
- tool.library aus dem Speicher entfernt wird. Daher ist sichergestellt,
- da▀ die Libraries auch im Speicher sind, sollange tool.library ge÷ffnet
- ist.
-
- STRINGBEARBEITUNG:
- ==================
-
- VOID left (char *Ziel,char *Source,LONG Anzahl)(a0,a1,d0)
- VOID right(char *Ziel,char *Source,LONG Anzahl)(a0,a1,d0)
- VOID mid (char *Ziel,char *Source,LONG Start,LONG Anzahl)(a0,a1,d0,d1)
-
- Diese 3 Funktionen entsprechen den gleichnamigen Basic- Funktionen. Ziel
- mu▀ ein Zeiger auf einen genⁿgend gro▀en String (Array of char...) sein,
- da sonst andere Daten oder Programmteile ⁿberschrieben werden k÷nnen.
- Ziel mu▀ mind. Anzahl+1 Zeichen aufnehmen k÷nnen (Anzahl Zeichen werden
- kopiert und mit NULL abgeschlo▀en). ACHTUNG: mid arbeitet (im Gegensatz
- zu Basic) nur in einer Richtung, eine Konstruktion wie mid(...)=string
- ist natⁿrlich nicht erlaubt.
-
-
- VOID copy(LONG start,LONG anzahl,char *ziel,char *source)(d0,d1,d2,d3)
-
- Entspricht im wesentlichen der mid-Funktion, aus KompatibilitΣts- grⁿnden
- noch enthalten.
-
-
- LONGcheck (LONG Zeichen1,LONG Zeichen2,LONG Start,LONG Ende,char *String)
- (d0,d1,d2,d3,a0)
- LONG checkback(LONG Zeichen1, LONG Zeichen2, LONG Start, LONG Ende, char
- *String)
- (d0,d1,d2,d3,a0)
-
- Diese beiden Funktionen suchen nach dem ersten (check) bzw. letzten
- (checkback) Auftauchen eines der beiden Zeichen (1 und 2, mⁿssen als LONG
- ⁿbergeben werden) unter Beachtung von Klammerebenen (nur runde Klammern).
- Beispiel: Es soll nach + und - in dem String
- 1+(2-3)
- 0123456 gesucht werden. check wⁿrde eine 1 zurⁿckliefern, checkback
- ebenfalls, da das Minuszeichen in der Klammer eingeschlossen ist. Diese
- beiden Funktionen werden intensiv von Init_Block benutzt.
-
-
- LONG AnzahlKlammern(char *String)(a0)
-
- Diese Funktion ⁿberprⁿft, ob in einem String alle Klammern (nur runde)
- paarig sind.
- Rⁿckgabe: 0: paarig
- <0: zu viele )
- >0: zu viele (
-
-
-
- INTUITION/GRAFIKUNTERST▄TZUNG
- =============================
-
- LONG request(char *ja,char *nein,char *body)(d0,d1,d2)
-
- Diese Routine er÷ffnet auf dem aktuellen Screen einen AutoRequester und
- zeigt in diesem die ⁿbergebenen Texte an. *ja und *nein werden als Text
- in den Gadgets (wo sonst Retry und Cancel steht) angezeigt, *body als
- Haupttext. Dieser Haupttext darf nicht lΣnger sein, als in eine Zeile
- pa▀t. Rⁿckgabe: 0 oder 1, je nachdem, was vom Benutzer angewΣhlt wurde.
-
-
- LONG NewRequest(struct Window *Window,ja,nein,body)(a0,d0,d1,d2)
-
- Diese Funktion ist der vorigen sehr Σhnlich, nur da▀ man hier noch das
- Fenster angeben kann, auf dem der Requester erscheinen soll. Die anderen
- Parameter und die Rⁿckgabewerte entsprechen denen von request.
-
- LONG EventAbfrage(struct Window *Window,struct info *msginfo)(a0,a1)
-
- Diese Funktion fⁿllt die Struktur msginfo (definiert in Tool.h) mit den
- Werten von Class, Code und IAddress (Class wird in msginfo NachrichtenArt
- genannt, Code wird als code bezeichnet). Diese Funktion fⁿhrt kein Wait()
- aus.
- ZusΣtzlich wird Class noch ausgegeben.
-
-
- VOID Print(struct RastPort *RP,
- char *text,
- LONG col,
- LONG xpos,
- LONG ypos)(a1,a0,d0,d1,d2)
-
- Diese Funktion gibt den Text text auf dem RastPort RP in der Farbe col ab
- der Position xpos/ypos aus. Ganz einfach.
-
-
- VOID Center(struct Window *Window,
- char *text,
- LONG Farbe,
- LONG yPos)(a1,a0,d0,d1)
-
- Wieder eine sehr Σhnliche Funktion. Nur das diesmal der Text zentriert
- ausgegeben wird. Dafⁿr braucht die Funktion dann aber auch einen Zeiger
- auf das entsprechende Fenster (Aufpassen !).
-
-
- VOID Box(struct RastPort *RP,
- LONG x1,y1,x2,y2)(a1,d0,d1,d2,d3)
-
- Diese Funktion (erraten) zeichnet im angegebenen RastPort ein Rechteck
- mit die Ecken x1/y1 und x2/y2
-
-
- VOID Gadget_On (struct Gadget *Gadget,struct Window *Window)(a0,a1)
- VOID Gadget_Off(struct Gadget *Gadget,struct Window *Window)(a0,a1)
-
- Diese beiden Funktionen ersetzen die Systemfunktionen OnGadget und
- OffGadget. Gadget_On sorgt dafⁿr, da▀ das Gadget wieder korrekt
- gezeichnet wird (OnGadget lΣ▀t meistens das "Gitter" stehen, obwohl das
- Gadget wieder anwΣhlbar ist).
-
-
- LONG GetPropPosH(struct Gadget *Gadget,LONG MaxPos)(a0,d0)
- LONG GetPropPosV(struct Gadget *Gadget,LONG MaxPos)(a0,d0)
-
- Diese beiden Funktionen geben die aktuelle vertikale/horizontale Position
- eines PropGadgets zurⁿck. Die zurⁿckgegebenen Werte bewegen sich dabei
- zwischen 0 und MaxPos.
-
-
- VOID SetPropPosH( struct Gadget *Gadget,
- struct Window *Window,
- LONG MaxPos,
- LONG Schrittweite,
- LONG NewPos)(a0,a1,d0,d1,d2)
- VOID SetPropPosV( struct Gadget *Gadget,
- struct Window *Window,
- LONG MaxPos,
- LONG Schrittweite,
- LONG NewPos)(a0,a1,d0,d1,d2)
-
- Diese beiden Funktionen setzten die aktuelle Position eines PropGadgets
- auf den Wert NewPos, wobei MaxPos fⁿr 100% steht. Schrittweite gibt an,
- wie viele Positionen der Regler maximal haben soll, wenn neben ihn in das
- Gadget geklickt wird. Dazu ein Beispiel. Man will einen File-Requester
- erstellen. Dabei ergibt sich die Situation, da▀ man 5 Zeilen gleichzeitig
- darstellen kann, es aber 15 Files gibt. Am Anfang steht der Regler ganz
- oben (GetPropPosV wⁿrde 0 zurⁿckgeben). Steht der Regler ganz unten, dann
- soll 10 zurⁿckgegeben werden. Damit gibt es 11 abfragbare Positionen und
- dies ist auch der Wert fⁿr MaxPos. Klickt der Anwender aber in das Gadget
- neben den Regler, dann soll der Regler den gesammten Bereich in 3
- Sprⁿngen zurⁿcklegen. Dafⁿr setzt man Schrittweite auf 3. Steht vorher
- der Regler auf 0, dann steht er nach einem Klick auf 5 und danach auf 10.
- HINWEIS: Bei diesen Funktionen wird mit Ganzzahlen gerechnet, und da
- kommt es schon mal vor, da▀ (bes. wenn der Anwender den Regler direkt
- verschoben hat) ein Sprung etwas weiter ist, als man ihn gerne hΣtte. Im
- obigen Beispiel passiert das z.B., wenn der Regler so gerade noch auf
- Position 9 steht (und noch nicht auf 8) und wird dann neben den Regler
- geklickt, dann wird als nΣchster Wert 3 und nicht 4 angegeben. Dieser
- Fehler mu▀ nicht immer auftreten und ist abhΣngig von der Gr÷▀e des
- Gadgets und der Anzahl Positionen.
-
-
- LONG PrepareTmpRas(struct RastPort *RP)(a1)
- VOID ClearTmpRas (struct RastPort *RP)(a1)
-
- Die erste Funktion bereitet einen RastPort auf die Benutzung des
- Flood-Befehls vor (eine weitere Bitmap fⁿr den RastPort besorgen). Die
- zweite Funktion gibt den Speicher dann wieder frei. Wenn PrepareTmpRas
- eine 0 zurⁿckgibt, ist entweder die Bitmap schon besorgt oder nicht
- genⁿgend Speicher vorhanden.
-
-
- LONG PrepareArea(struct RastPort *RP,LONG MaxPoints)(a1,d0)
- VOID ClearArea (struct RastPort *RP)(a1)
-
- Diese beiden Funktionen besorgen die Vorbereitungen fⁿr die AreaMove/
- Draw/ Ellipse Befehle. MaxPoints gibt an, wie viele Punkte maximal mit
- AreaMove bzw. Draw angegeben werden. Die Funktionen enthalten einen
- Aufruf von PrepareTmpRas bzw. ClearTmpRas. Ein zusΣtzlicher Aufruf dieser
- Funktionen ist nicht n÷tig. Wurde erst PrepareTmpRas aufgerufen, dann
- versagt PrepareArea. PrepareArea gibt wieder 0 zurⁿck, wenn etwas schief
- gegangen ist.
-
- MENUUNTERST▄TZUNG
-
- Diese Funktionssammlung dient dazu, schnell ein Standartmenu zu
- erstellen, ohne da▀ Strukturen statisch definiert werden mⁿssen. Durch
- einen einzigen Befehl wird jeweils ein Menu, ein Item oder ein Subitem
- angefⁿgt.
-
- struct Menu *AddMenu(struct Menu *menu,
- char *Titel,
- unsigned short Flags);
-
- Diese Funktion fⁿgt ein Menu an. Beim ersten Aufruf mu▀ menu NULL sein.
- Der Rⁿckgabewert des ERSTEN Aufrufs wird fⁿr alle weiteren Aufrufe (auch
- der anderen Funktionen) als Argument verwendet.
-
- struct Item *AddItem(struct Menu *menu,
- char *Titel,
- unsigned short Flags,
- char HotKey);
-
- Diese Funktion fⁿgt an das zuletzt definierte Menu ein Item an. menu ist
- der Rⁿckgabewert des ersten Aufrufs von AddMenu. Titel kann ein Zeiger
- auf einen String sein, dann mu▀ aber auch ITEMTEXT in Flags gesetzt sein.
- Es wird dann aber nur Speicher fⁿr die IntuiText-Struktur reserviert, der
- Speicher fⁿr den
- String wird direkt benutzt. Eine Konstruktion wie :
- char Text[50];
- strcpy(Text,"Text 1");
- AddItem(Menu,Text,Flags,Hotkey);
- strcpy(Text,"Text 2");
- AddItem(Menu,Text,Flags,Hotkey);
- bringt darum nicht den gewⁿnschten Erfolg. Dafⁿr funktioniert:
- char Text1[50],Text2[50];
- AddItem(Menu,Text1,Flags,Hotkey); /* Das Item wird aber nicht breit
- genug */
- AddItem(Menu,Text2,Flags,Hotkey);
- strcpy(Text1,"Text 1");
- strcpy(Test2,"Text 2");
- Dann mu▀ aber vorher der String in der char-Deklaration gro▀ genug
- reserviert worden sein, sonst gibt es dort Probleme. Ist ITEMTEXT nicht
- gesetzt, so wird Titel als Zeiger auf eine ImageStruktur interpretiert.
- Titel darf kein Zeiger auf eine IntuiText-Struktur sein (Menus verwenden
- IntuiText). Diese Struktur wird, wenn ben÷tigt, automatisch erstellt.
- HotKey ist die Tastaturabkⁿrzung fⁿr das Item. COMMSEQ mu▀ zusΣtzlich
- gesetzt sein.
-
- struct Item *AddSub(struct Menu *menu,
- char *Titel,
- unsigned short Flags,
- char HotKey);
-
- Wie bei AddItem, nur wird an das letzte Item ein weiteres SubItem
- angehΣngt.
-
- Die Rⁿckgabewerte dieser drei Funktionen sind jeweils die Zeiger auf die
- erstelle Menu- bzw. Item-Struktur. Au▀er beim ersten Aufruf von AddMenu
- kann der Rⁿckgabewert ignoriert werden. Der Rⁿckgabewert wird NULL, wenn
- nicht mehr genⁿgend Speicher vorhanden ist. Trotzdem sollten weitere
- Aufrufe von Add... Funktionen nicht zum Absturz fⁿhren. Der Rⁿckgabewert
- ist interessant, wenn man selbst die StandartMenus noch ein wenig
- manipulieren m÷chte (z.B. eine andere Farbe als die voreingestellte fⁿr
- den Text). VerΣndert man dabei die Liste im Speicher, so mu▀ man auch
- dafⁿr sorgen, da▀ beim Freigeben des Speichers alles freigegeben und
- nichts doppelt freigegeben wird. Einstellungen fⁿr Farbe und Draw-Mode
- werden von ersten Item des ersten Menus ⁿbernommen !
-
- VOID NewSetMenuStrip(struct Window *Window,struct Menu *menu);
-
- Diese Funktion ersetzt SetMenuStrip. Alle Items innerhalb eines Menus und
- alle Subs innerhalb eines Items werden auf gleiche Breite gebracht (siehe
- Beispiel). Au▀erdem wird natⁿrlich SetMenuStrip aufgerufen.
-
- VOID ClearMenu(struct Menu *menu);
-
- Diese Funktion gibt den belegten Speicher wieder frei. Vorher MU▀ noch
- ClearMenuStrip aufgerufen werden.
-
- struct Menu *LastMenu(struct Menu *menu);
- struct MenuItem *LastItem(struct Menu *menu);
- struct MenuItem *LastSub(struct Menu *menu);
-
- Diese drei Funktionen geben jeweils einen Zeiger auf das letzte
- definierte Element zurⁿck. Diese Funktionen werden intern benutzt.
-
- struct Menu *FreeMenu(struct Menu *menu);
- struct MenuItem *FreeItem(struct MenuItem *item);
-
- Diese beiden Funktionen geben den Speicher fⁿr ein Item (incl. IntuiText,
- falls vorhanden) bzw. ein Menu wieder frei. Werden von ClearMenu
- aufgerufen.
-
-
- MATHEMATISCHE FUNKTIONEN
- ========================
-
- VOID UmwFtoS(char *Ziel,DOUBLE *Zahl,LONG Nachkomma)(a0,a1,d0)
-
- Diese Funktion wandelt eine doppeltgenaue Flie▀kommazahl in einen String
- um. Die Anzahl der Nachkommastellen kann angegeben werden. Die Anzahl der
- Vorkommastellen bestimmt die Funktion selbst. Ist die Zahl gro▀ (oder
- klein bei negativen Zahlen), dann wird die Zahl im wissenschaftlichen
- Format ausgegeben.
-
-
- VOID UmwStoF(DOUBLE *Ziel,char *Source)(a0,a1)
-
- Genau, die Umkehrfunktion. Sie wandelt einen String in eine doppeltgenaue
- Flie▀kommazahl.
-
-
- VOID Fak(DOUBLE *Ziel,LONG a)(a0,d0)
- VOID NuK(DOUBLE *Ziel,LONG a,LONG b)(a0,d0,d1)
-
- Die erste Funktion ermittelt die FakultΣt der Zahl a, die zweite Funktion
- den Wert von "n ⁿber k". a und b sollten positive Zahlen sein.
-
-
- APTR Init_Konst()()
-
- Diese Funktion reserviert einen Speicherbereich fⁿr 26 Zahlen vom Typ
- DOUBLE.
-
- LONG Set_Konst_P(APTR Zeiger,LONG Nummer,DOUBLE *Wert)(a0,d0,d1)
-
- Hier wird die Zahl mit der Nummer Nummer innerhalb des Speicherbereichs
- auf den Wert Wert gesetzt. Passierte ein Fehler, dann wird NO_KONST
- zurⁿckgegeben, sonst 0.
-
-
- VOID GetKonst_P(DOUBLE *Ziel,APTR Zeiger,LONG Nummer)(a0,a1,d1)
-
- Man will die Werte ja auch mal wieder auslesen k÷nnen.....
-
-
- VOID Free_Konst(APTR Zeiger)(a0)
-
- Und schlie▀lich mu▀ man den Speicher auch wieder freigeben k÷nnen.
-
-
- struct Block *Init_Mem(char *Zeiger)(a0)
- LONG Init_Block(struct Block *Zeiger)(a0)
- LONG PreCalc(struct Block *Zeiger,APTR Konstanten)(d0,d1)
- LONG Calc_P(DOUBLE *Ziel,struct Block *Zeiger,DOUBLE *Wert)(a0,a1,a2)
- VOID Free_Block(struct Block *Zeiger)(a0)
-
- Jetzt wirds schwierig und interessant. Mit diesen 5 Funktionen kann man
- recht bequem und schnell einen String auswerten und bekommt dafⁿr eine
- Zahl zurⁿck. Der String mu▀ eine korrekte mathe. Funktion darstellen.
- Erkannt werden die 4 Grundrechenarten (+-*/), Potenzen (^),
- Trigonometrische Funktionen ((a)sin, (a)cos, (a)tan), log (Basis 10), ln
- (Basis e), abs (Absolut), sgn (Vorzeichen), int (Vorkomma) und sqr
- (Wurzel). Weiterhin ist vorbelegt die Zeichenfolge pi (3.141...) und e
- (2.718...). Eine weitere Sonderstellung nimmt x ein. Alle anderen
- Buchstaben (a-z) k÷nnen als Konstanten benutzt werden. Zahlen in der Form
- -1.2345 und -123e-4 werden auch erkannt (Alles mu▀ kleingeschrieben
- sein).
-
- Init_Mem() belegt den ben÷tigten Speicher im Rechner und gibt den Zeiger
- darauf zurⁿck. Diesen Zeiger braucht man fⁿr alle weiteren Arbeiten.
- Init_Block() "zerpflⁿckt" die Funktion. Zwischen Init_Mem und Init_Block
- darf der Speicherbereich, in dem die Funktion steht, nicht angetastet und
- auf keinen Fall freigegeben werden. Init_Mem merkt sich, wo der String
- steht und Init_Block greift darauf zu. Init_Block gibt einen Fehlerwert
- zurⁿck. Die Bedeutung der einzelnen Bits ist in Tool.h aufgefⁿhrt. Wird
- NULL zurⁿckgegeben, dann wurde alles erkannt. Nach Init_Block() kann das
- Programm mit dem Speicher fⁿr den String wieder machen, was es will......
-
- PreCalc() belegt die in der Funktion gebrauchten Konstanten (a-z ohne x
- und e) mit Werten. Diese holt sich die Funktion aus dem Speicherbereich,
- den man sich mit Init_Konst() anfordern kann. Wird mit Set_Konst() eine
- von der Funktion gebrauchte Konstante geΣndert, dann mu▀ PreCalc() wieder
- aufgerufen werden. Au▀erdem rechnet PreCalc schon so weit, wie zu dem
- Zeitpunkt alles bekannt ist. Die einzige Unbekannte ist nur noch x.
- Besteht die Funktion nur aus Konstanten und Zahlen, dann steht nach
- PreCalc() in Zeiger->Wert bereits der Wert der Funktion.
- HINWEIS: Die Routinen gehen an die Funktion von hinten heran. Lautet die
- Funktion z.B: x+1+2+3, dann wird das zerlegt in:
- - Summe aus 3 und dem Bereich davor
- Bereich davor in:
- - Summe aus 2 und dem Bereich davor usw.
-
- Lautet die Funktion aber 1+2+3+x, dann wird die zerlegt in:
- - Summe aus x und Bereich davor, und der Bereich davor wird bereits
- korrekt zu 6 bereichnet. Die nΣchste Funktion braucht also nicht mehr so
- viel zu rechnen, wenn man die Variable x immer m÷glichst weit nach hinten
- schiebt.
- PreCalc() liefert wieder einen Fehlercode zurⁿck, z.B. wenn in der
- Funktion die Wurzel aus etwas negativen (was dort bereits als negativ
- erkannt wird, x ist ja noch nicht bekannt) gezogen werden soll.
-
- Und jetzt die vorletzte und wichtigste Funktion:
- Calc_P(). Sie ben÷tigt zusΣtzlich zu dem von Init_Mem gelieferten Zeiger
- den Wert fⁿr x und eine Variable, in der sie das Ergebnis ablegen soll.
- Calc_P() kann beliebig oft mit unterschiedlichen Werten fⁿr x aufgerufen
- werden. Geht bei der Berechnung etwas schief, wird in Ziel eine 0
- zurⁿckgeliefert. In Zeiger->Fehler steht, was passiert ist, dieser Wert
- wird auch zurⁿckgegeben.
-
- FreeMem() schlie▀lich gibt den ben÷tigten Speicher wieder frei.
-
-
- Wenn klar ist, da▀ von einer Funktion nur ein Funktionswert zu bestimmen
- ist, dann ist der Aufwand ein wenig gro▀. Dafⁿr gibt es dann noch die
- Funktion:
-
- VOID berechnen(DOUBLE *Ziel,char *string,
- DOUBLE *x,
- struct Konstanten *konstanten,
- LONG *fehler)(a0,d0,d1,d2,d3)
- Hier wird auf einmal alles n÷tige ⁿbergeben. Es k÷nnen aber nur 4
- Konstanten in der Struktur Konstanten ⁿbergeben werden. Es kann fⁿr
- Konstanten auch NULL angegeben werden. In Fehler werden die gleichen
- Fehlercodes ⁿbergeben wie bei den Funktionen oben.
-
-
- DIE HINWEISE IN TOOLLIBRARY.README BEACHTEN !!
-
-
-
-
-
-