 #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 <stdio.h>
 #include <stdlib.h>
 #include <string.h>
 #include <math.h>
 
 #define E   2.718281828
 #define PPI 3.14159265358979323846
 
 #define Mul(a,b) NewMul(a,b)
 #define Add(a,b) NewAdd(a,b)
 #define Sub(a,b) NewSub(a,b)
 #define Div(a,b) NewDiv(a,b)
 #define Flt(a)   NewFlt(a)
 #define Fix(a)   NewFix(a)
 #define Cmp(a,b) NewCmp(a,b)
 #define Abs(a)   NewAbs(a) 
 #define Neg(a)   NewNeg(a)
 #define Pow(a,b) NewPow(a,b)
 #define Tst(a)   NewTst(a)
 #define Log10(a) NewLog10(a)
 #define Floor(a) NewFloor(a)
 #define ACos(a)  NewAcos(a)
 #define ASin(a)  NewAsin(a)
 #define ATan(a)  NewAtan(a)
 #define Sin(a)   NewSin(a)
 #define Cos(a)   NewCos(a)
 #define Tan(a)   NewTan(a)
 #define Log(a)   NewLog(a)
 #define Sqr(a)   NewSqr(a)
 
 double NewSub(double a,
               double b);
 double NewSqr(double a);
 double NewSin(double a);
 double NewCos(double a);
 double NewTan(double a);
 double NewPow(double a,
               double b);
 double NewNeg(double a);
 double NewMul(double a,
               double b);
 double NewLog10(double a);
 double NewLog(double a);
 double NewFlt(LONG a);
 LONG   NewFix(DOUBLE a);
 double NewFloor(double a);
 double NewDiv(double a,
               double b);
 double NewCos(double a);
 LONG NewCmp(double a,
             double b);
 double NewCeil(double a);
 double NewAtan(double a);
 double NewAsin(double a);
 double NewAdd(double a,
               double b);
 double NewAcos(double a);
 double NewAbs(double a);
 LONG   NewTst(DOUBLE a);
 
 struct info 
  {
   USHORT code;
   struct IntuiMessage *Nachricht;
   ULONG NachrichtenArt;
   APTR IAddress;
   SHORT MouseX,MouseY;
  };
 
 struct Block 
  {
   LONG Links,Rechts;
   LONG RechenArt,Valid;
   LONG Konstante;
   LONG Fehler;
   char *String;
   DOUBLE Wert;
   struct Block *Left,*Right;
  };
 
 #define MAXCHARS 500
 
 struct HilfsStruktur
  {
   char Formel[MAXCHARS];
   char Hilfe[MAXCHARS];
   DOUBLE Variable,Konstante1,Konstante2,Konstante3,Konstante4;
   LONG Fehler;
  };
 
 
 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 __asm Print(register __a1 struct RastPort *RP,
                  register __a0 char *text,
                  register __d0 LONG col,
                  register __d1 LONG xpos,
                  register __d2 LONG ypos);
 ULONG __asm EventAbfrage(register __a0 struct Window *Window,
                          register __a1 struct info *MsgInfo);
 LONG __asm request(register __d0 char *JaPointer,
                    register __d1 char *NeinPointer,
                    register __d2 char *BodyPointer);
 LONG __asm ev(register __d0 LONG l,register __d1 LONG r,register __d2 struct Block *block);
 VOID __asm Free_Block(register __a0 struct Block *First);
 VOID __asm Free_Konst(register __a0 APTR Zeiger);
 APTR Init_Konst(VOID);
 LONG __asm Set_Konst_P(register __a0 APTR Zeiger,register __d0 LONG Nummer,register __d1 DOUBLE *Wert_P);
 LONG Set_Konst(APTR Zeiger,LONG Nummer,DOUBLE Wert);
 struct Block * __asm Init_Mem(register __a0 char *string);
 LONG __asm Init_Block(register __a0 struct Block *Zeiger);
 LONG __asm check(register __d0 LONG z1,register __d1 LONG z2,
                  register __d2 LONG l,register __d3 LONG r,
                  register __a0 char *string);
 LONG __asm checkback(register __d0 LONG z1,register __d1 LONG z2,
                      register __d2 LONG l,register __d3 LONG r,
                      register __a0 char *string);
 VOID __asm copy(register __d0 LONG i,register __d1 LONG Anzahl,
                 register __d2 char *Ziel,register __d3 char *Source);
 double sgn(DOUBLE x);
 LONG BereichsKontr(DOUBLE b);
 LONG __asm PreCalc(register __d0 struct Block *Zeiger,register __d1 APTR Konst);
 DOUBLE __asm GetKonst(register __a0 APTR Konst,register __d1 LONG Nummer);
 DOUBLE Calc(struct Block *Zeiger,DOUBLE x);
 LONG __asm AnzahlKlammern(register __a0 char *string);
 VOID __asm left(register __a0 char *Ziel,
                 register __a1 char *string,
                 register __d0 LONG Anzahl);
 VOID __asm right(register __a0 char *Ziel,
                  register __a1 char *string,
                  register __d0 LONG Anzahl);
 VOID __asm mid(register __a0 char *Ziel,
                register __a1 char *string,
                register __d0 LONG Anfang,
                register __d1 LONG Anzahl);
 DOUBLE stof(char *string);
 VOID ftos(char *Ziel,
           DOUBLE Zahl,
           LONG Nachkomma);
 VOID __asm UmwFtoS(register __a0 char *Ziel,
                    register __a1 DOUBLE *Zahl1,
                    register __d0 LONG Nachkomma);
 DOUBLE Vorkomma(DOUBLE Zahl);
 VOID __asm testfunktion(register __a0 LONG *test);
 LONG search(char *string);
 LONG __asm NewRequest(register __a0 struct Window *AktWindow,
                       register __d0 char *JaPointer,
                       register __d1 char *NeinPointer,
                       register __d2 char *BodyPointer);
 
 VOID __asm Box(register __a1 struct RastPort *RastPort,    /* Der RastPort */
                register __d0 LONG xs,                      /* Start: X     */
                register __d1 LONG ys,                      /* Start: Y     */
                register __d2 LONG xe,                      /* Ende : X     */
                register __d3 LONG ye);                      /* Ende : Y     */
 VOID __asm Center(register __a1 struct Window *Window,     /* Das Fenster  */
                   register __a0 char *string,              /* Der Text     */
                   register __d0 LONG Color,                /* Die Farbe    */
                   register __d1 LONG y_Pos);                /* Die Y-Pos.   */
 VOID __asm Gadget_On(register __a0 struct Gadget *Gadget,  /* Das Gadget   */
                      register __d1 struct Window *Window);  /* Das Fenster  */
 VOID __asm Gadget_Off(register __a0 struct Gadget *Gadget, /* Das Gadget   */
                       register __a1 struct Window *Window); /* Das Fenster  */
 LONG __asm GetPropPosH(register __a0 struct Gadget *Gadget,/* Das Gadget   */
                        register __d0 LONG MaxPos);          /* Max. Pos.    */
 LONG __asm GetPropPosV(register __a0 struct Gadget *Gadget,/* Das Gadget   */
                        register __d0 LONG MaxPos);          /* Max. Pos.    */
 VOID __asm SetPropPosH(register __a0 struct Gadget *Gadget,/* Das Gadget   */
                        register __a1 struct Window *Window,
                        register __d0 LONG MaxPos,          /* Die MaxPos   */
                        register __d1 LONG Schrittweite,    /* Schrittweite */
                        register __d2 LONG NewPos);          /* Neue Posit.  */
 VOID __asm SetPropPosV(register __a0 struct Gadget *Gadget,/* Das Gadget   */
                        register __a1 struct Window *Window,
                        register __d0 LONG MaxPos,          /* Die MaxPos   */
                        register __d1 LONG Schrittweite,    /* Schrittweite */
                        register __d2 LONG NewPos);          /* Neue Posit.  */
 LONG __asm PrepareTmpRas(register __a1 struct RastPort *RP);/* Der RastPort */
 VOID __asm ClearTmpRas(register __a1 struct RastPort *RP);   /* Der RastPort */
 LONG __asm PrepareArea(register __a1 struct RastPort *RP,
                        register __d0 LONG MaxPoints);
 VOID __asm ClearArea(register __a1 struct RastPort *RP);
 
 VOID __asm Fak(register __a0 DOUBLE *Ziel,
                register __d0 LONG i);
 VOID __asm NuK(register __a0 DOUBLE *Ziel,
                register __d0 LONG n,
                register __d1 LONG k);
 VOID __asm GetKonst_P(register __a0 DOUBLE *Ziel,
                       register __a1 APTR Konst,
                       register __d0 LONG Nummer);
 LONG __asm Calc_P(register __a0 DOUBLE *Ziel,
                   register __a1 struct Block *Zeiger,
                   register __a2 DOUBLE *x);
 VOID __asm berechnen(register __a0 DOUBLE *Ziel,
                      register __d0 UBYTE *string,
                      register __d1 DOUBLE *var,
                      register __d2 struct Konstanten *kon,
                      register __d3 LONG *Fehler);
 VOID __asm UmwStoF(register __a0 DOUBLE *Ziel,
                    register __a1 char *string);
 
 
 struct Menu * __asm LastMenu(register __a0 struct Menu *menu);
 struct MenuItem * __asm LastItem(register __a0 struct Menu *menu);
 struct MenuItem * __asm LastSub(register __a0 struct Menu *menu);
 struct Menu * __asm AddMenu(register __a0 struct Menu *menu,
                             register __a1 char *Titel,
                             register __d0 USHORT Flags);
 struct Item * __asm AddItem(register __a0 struct Menu *menu,
                             register __a1 char *Titel,
                             register __d0 USHORT Flags,
                             register __d1 char HotKey);
 struct Item * __asm AddSub(register __a0 struct Menu *menu,
                            register __a1 char *Titel,
                            register __d0 USHORT Flags,
                            register __d1 char HotKey);
 struct MenuItem * __asm GetItem(register __a0 struct Menu *menu,
                                 register __a1 char *Titel,
                                 register __d0 USHORT Flags,
                                 register __d1 char HotKey);
 VOID __asm ClearMenu(register __a0 struct Menu *menu);
 struct MenuItem * __asm FreeItem(register __a0 struct MenuItem *item);
 struct Menu * __asm FreeMenu(register __a0 struct Menu *menu);
 VOID __asm NewSetMenuStrip(register __a1 struct Window *Window,
                            register __a0 struct Menu *menu);
 
