 #include <exec/types.h>
 
 #include <intuition/intuition.h>
 #include <proto/exec.h>
 #include <proto/dos.h>
 #include <proto/mathieeedoubbas.h>
 #include <proto/mathieeedoubtrans.h>
 #include <proto/intuition.h>
 #include <proto/graphics.h>
 #include <math.h>
 
 #define Sgn(a)		IEEEDPFlt(IEEEDPTst(a))
 #define sgn(a)		IEEEDPFlt(IEEEDPTst(a))
 #define ASinh(a)	Log(arg+Sqr(arg*arg+1))

 #define E   2.718281828
 #define PPI 3.14159265358979323846
 
 #define Mul(a,b) IEEEDPMul(a,b)
 #define Add(a,b) IEEEDPAdd(a,b)
 #define Sub(a,b) IEEEDPSub(a,b)
 #define Div(a,b) IEEEDPDiv(a,b)
 #define Flt(a)   IEEEDPFlt(a)
 #define Fix(a)   IEEEDPFix(a)
 #define Cmp(a,b) IEEEDPCmp(a,b)
 #define Abs(a)   IEEEDPAbs(a) 
 #define Neg(a)   IEEEDPNeg(a)
 #define Pow(a,b) IEEEDPPow(a,b)
 #define Tst(a)   IEEEDPTst(a)
 #define Log10(a) IEEEDPLog10(a)
 #define Floor(a) IEEEDPFloor(a)
 #define ACos(a)  IEEEDPAcos(a)
 #define ASin(a)  IEEEDPAsin(a)
 #define ATan(a)  IEEEDPAtan(a)
 #define Sin(a)   IEEEDPSin(a)
 #define Cos(a)   IEEEDPCos(a)
 #define Tan(a)   IEEEDPTan(a)
 #define Log(a)   IEEEDPLog(a)
 #define Sqr(a)   IEEEDPSqrt(a)
 
 struct info 
  {
   USHORT code;
   struct IntuiMessage *Nachricht;
   ULONG NachrichtenArt;
   APTR IAddress;
   SHORT MouseX,MouseY;
  };
 
 struct MToolBase
  {
   struct Library Node;
   LONG   SegList;
   struct Library *SysBase;
   struct GfxBase *GfxBase;
   struct IntuitionBase *IntuitionBase;
   struct Library *MathIeeeDoubBasBase;
   struct Library *MathIeeeDoubTransBase;
  };
 
 struct Block 
  {
   LONG Links,Rechts;
   LONG RechenArt,Valid;
   LONG Konstante;
   LONG Fehler;
   char *String;
   DOUBLE Wert;
   struct Block *Left,*Right;
  };
 
 
 struct Konstanten 
  {
   DOUBLE k1,k2,k3,k4;
  };
 
 
 
 /* Fehlercodes */
 
 #define DIVBYZERO  1 /* Es wurde durch 0 geteilt                         */
 #define LOGNEG     2 /* Es wurde von Zahl <= 0 der Log gebildet          */
 #define SQRTNEG    4 /* Es wurde von Zahl <0   die Wurzel gebildet       */
 #define ATRIG      8 /* Es wurde von Zahl >1 oder <-1 asin/acos gebildet */
 #define UNPAKLAM  16 /* Unpaarige Klammern                               */
 #define TEST      32
 #define NOFUNC    64 /* Keine Funktion eingegeben                        */
 #define NO_KONST 128 /* Keine solche Konstante                           */
 #define NO_MEM   256 /* Kein Speicher für weiteren Block                 */
 #define POWERROR 512 /* Negative Zahl hoch Bruch wurde versucht          */
 #define NO_FUNC 1024 /* Keine Funktion gefunden                          */
 
 /* Rechenarten */
 #define ADDI	1
 #define SUBT	2
 #define MULT	3
 #define DIVI	4
 #define POWE	5
 #define SINU	6
 #define COSI	7
 #define TANG	8
 #define ASIN	9
 #define ACOS	10
 #define ATAN	11
 #define LOG1	12
 #define LNAT	13
 #define ABSO	14
 #define SIGU	15
 #define SQRT	16
 #define FLOO	17
 #define X	18
 #define MKON	19	/* Math. Konstante */
 #define UKON	20	/* User  Konstante */
 #define ZIFF	21	/* Ziffern         */
 #define KLAM	22
 
 VOID Print(struct RastPort *RP,
            char *text,
            LONG col,
            LONG xpos,
            LONG ypos);
 ULONG EventAbfrage(struct Window *Window,
                    struct info *MsgInfo);
 LONG request(char *JaPointer,
              char *NeinPointer,
              char *BodyPointer);
 VOID Fak(DOUBLE *Ziel, LONG i);
 VOID NuK(DOUBLE *Ziel,LONG n,LONG k);
 VOID Free_Block(struct Block *First);
 VOID Free_Konst(APTR Zeiger);
 APTR Init_Konst(VOID);
 LONG Set_Konst_P(APTR Zeiger,LONG Nummer,DOUBLE *Wert_P);
 struct Block *Init_Mem(char *string);
 LONG Init_Block(struct Block *Zeiger);
 LONG check(LONG z1,LONG z2,
            LONG l, LONG r,
            char *string);
 LONG checkback(LONG z1,LONG z2,
                LONG l, LONG r,
                char *string);
 VOID copy(LONG i, LONG Anzahl,
           char *Ziel,char *Source);
 LONG PreCalc(struct Block *Zeiger,APTR Konst);
 VOID GetKonst_P(DOUBLE *Ziel,APTR Konst,LONG Nummer);
 DOUBLE GetKonst(APTR Konst,LONG Nummer);
 LONG Calc_P(DOUBLE *Ziel,
             struct Block *Zeiger,
             DOUBLE *x);
 LONG AnzahlKlammern(char *string);
 VOID berechnen(DOUBLE *Ziel,
                UBYTE *string,
                DOUBLE *var,
                struct Konstanten *kon,
                LONG *Fehler);
 VOID left(char *Ziel,
           char *string,
           LONG Anzahl);
 VOID right(char *Ziel,
            char *string,
            LONG Anzahl);
 VOID mid(char *Ziel,
          char *string,
          LONG Anfang,
          LONG Anzahl);
 VOID UmwStoF(DOUBLE *Ziel,
              char *string);
 VOID UmwFtoS(char *Ziel,
              DOUBLE *Zahl1,
              LONG Nachkomma);
 LONG NewRequest(struct Window *AktWindow,
                 char *JaPointer,
                 char *NeinPointer,
                 char *BodyPointer);
 VOID Box(struct RastPort *RastPort,    	/* Der RastPort */
          LONG xs,                      	/* Start: X     */
          LONG ys,                      	/* Start: Y     */
          LONG xe,                      	/* Ende : X     */
          LONG ye);                     	/* Ende : Y     */
 VOID Center(struct Window *Window,     	/* Das Fenster  */
             char *string,              	/* Der Text     */
             LONG Color,                	/* Die Farbe    */
             LONG y_Pos);                	/* Die Y-Pos.   */
 VOID Gadget_On(struct Gadget *Gadget,  	/* Das Gadget   */
                struct Window *Window); 	/* Das Fenster  */
 VOID Gadget_Off(struct Gadget *Gadget, 	/* Das Gadget   */
                 struct Window *Window);	/* Das Fenster  */
 LONG GetPropPosH(struct Gadget *Gadget,	/* Das Gadget   */
                  LONG MaxPos);         	/* Max. Pos.    */
 LONG GetPropPosV(struct Gadget *Gadget,	/* Das Gadget   */
                  LONG MaxPos);         	/* Max. Pos.    */
 VOID SetPropPosH(struct Gadget *Gadget,	/* Das Gadget   */
                  struct Window *Window,
                  LONG MaxPos,          	/* Die MaxPos   */
                  LONG Schrittweite,    	/* Schrittweite */
                  LONG NewPos);         	/* Neue Posit.  */
 VOID SetPropPosV(struct Gadget *Gadget,	/* Das Gadget   */
                  struct Window *Window,
                  LONG MaxPos,          	/* Die MaxPos   */
                  LONG Schrittweite,    	/* Schrittweite */
                  LONG NewPos);         	/* Neue Posit.  */
 LONG PrepareTmpRas(struct RastPort *RP);	/* Der RastPort */
 VOID ClearTmpRas(struct RastPort *RP);  	/* Der RastPort */
 LONG PrepareArea(struct RastPort *RP,
                  LONG MaxPoints);
 VOID ClearArea(struct RastPort *RP);
 struct Menu *LastMenu(struct Menu *menu);
 struct MenuItem *LastItem(struct Menu *menu);
 struct MenuItem *LastSub(struct Menu *menu);
 struct Menu *AddMenu(struct Menu *menu,
                      char *Titel,
                      USHORT Flags);
 struct Item *AddItem(struct Menu *menu,
                      char *Titel,
                      USHORT Flags,
                      char HotKey);
 struct Item *AddSub(struct Menu *menu,
                     char *Titel,
                     USHORT Flags,
                     char HotKey);
 struct MenuItem *GetItem(struct Menu *menu,
                          char *Titel,
                          USHORT Flags,
                          char HotKey);
 VOID ClearMenu(struct Menu *menu);
 struct MenuItem *FreeItem(struct MenuItem *item);
 struct Menu *FreeMenu(struct Menu *menu);
 VOID NewSetMenuStrip(struct Window *Window,
                      struct Menu *menu);
 
 
 
 
 #pragma libcall MToolBase left 1e 9803
 #pragma libcall MToolBase right 24 9803
 #pragma libcall MToolBase mid 2a 109804
 #pragma libcall MToolBase UmwFtoS 30 9803
 #pragma libcall MToolBase copy 36 321004
 #pragma libcall MToolBase check 3c 8321005
 #pragma libcall MToolBase checkback 42 8321005
 #pragma libcall MToolBase AnzahlKlammern 48 801
 #pragma libcall MToolBase request 4e 21003
 #pragma libcall MToolBase NewRequest 54 210804
 #pragma libcall MToolBase EventAbfrage 5a 9802
 #pragma libcall MToolBase Print 60 2108905
 #pragma libcall MToolBase Box 66 3210905
 #pragma libcall MToolBase Center 6c 108904
 #pragma libcall MToolBase Gadget_On 72 9802
 #pragma libcall MToolBase Gadget_Off 78 9802
 #pragma libcall MToolBase GetPropPosH 7e 802
 #pragma libcall MToolBase GetPropPosV 84 802
 #pragma libcall MToolBase SetPropPosH 8a 2109805
 #pragma libcall MToolBase SetPropPosV 90 2109805
 #pragma libcall MToolBase PrepareTmpRas 96 901
 #pragma libcall MToolBase ClearTmpRas 9c 901
 #pragma libcall MToolBase PrepareArea a2 902
 #pragma libcall MToolBase ClearArea a8 901
 #pragma libcall MToolBase UmwStoF ae 9802
 #pragma libcall MToolBase Fak b4 802
 #pragma libcall MToolBase NuK ba 10803
 #pragma libcall MToolBase berechnen c0 3210805
 #pragma libcall MToolBase Init_Konst c6 0
 #pragma libcall MToolBase Init_Mem cc 801
 #pragma libcall MToolBase Init_Block d2 801
 #pragma libcall MToolBase Set_Konst_P d8 10803
 #pragma libcall MToolBase GetKonst_P de 19803
 #pragma libcall MToolBase PreCalc e4 1002
 #pragma libcall MToolBase Calc_P ea a9803
 #pragma libcall MToolBase Free_Konst f0 801
 #pragma libcall MToolBase Free_Block f6 801
 #pragma libcall MToolBase CreatePort fc 802
 #pragma libcall MToolBase DeletePort 102 801
 #pragma libcall MToolBase CreateExtIO 108 802
 #pragma libcall MToolBase DeleteExtIO 10e 802
 #pragma libcall MToolBase CreateStdIO 114 801
 #pragma libcall MToolBase DeleteStdIO 11a 801
 #pragma libcall MToolBase LastMenu 120 801
 #pragma libcall MToolBase LastItem 126 801
 #pragma libcall MToolBase LastSub 12c 801
 #pragma libcall MToolBase AddMenu 132 9803
 #pragma libcall MToolBase AddItem 138 109804
 #pragma libcall MToolBase AddSub 13e 109804
 #pragma libcall MToolBase GetItem 144 109804
 #pragma libcall MToolBase ClearMenu 14a 801
 #pragma libcall MToolBase FreeItem 150 801
 #pragma libcall MToolBase FreeMenu 156 801
 #pragma libcall MToolBase NewSetMenuStrip 15c 8902
