home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Otherware
/
Otherware_1_SB_Development.iso
/
amiga
/
programm
/
libs
/
lib_coll.lha
/
TOOLLIBR.ZOO
/
ToolLibrary
/
ToolLibrary.DOC
< prev
next >
Wrap
Text File
|
1990-11-02
|
19KB
|
433 lines
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 !!