/**************************************
 * Modul Calc()                       *
 *                                    *
 * Erstellt Rechenoperationen, die    *
 * von Rechne() ausgeführt werden     *
 * und zeigt das Ergebnis mit Aus-    *
 * gabe() an.                         *
 *                                    *
 **************************************/
#include <exec/types.h>

void Calc()
{
   extern double zahl1,zahl2,zahl3,max,min;
   extern long lzahl1,lzahl2,lzahl3;
   extern char num,numnach,mode,operator,punkt,minus;
   extern UBYTE zahlstring[30],contstring[7];
   static char opflag1,opflag2;
   register int i;
   double atof();
   void Rechne();

   if((!opflag1)||(!num))
   {
      opflag1=operator;
      zahl2=zahl1;
      lzahl2=lzahl1;
      num=numnach=0;
   }
   else if(num)
   {
      if((operator>5)&&(opflag1<6))
      {
         zahl3=zahl2;
         lzahl3=lzahl2;
         zahl2=zahl1;
         lzahl2=lzahl1;
         opflag2=opflag1;
         opflag1=operator;
      }
      else Rechne(zahl2,zahl1,lzahl2,lzahl1,opflag1);
      if((opflag2)&&(operator<6))
      {
         Rechne(zahl3,zahl2,lzahl3,lzahl2,opflag2);
         opflag2=0;
      }
      if(operator>1) opflag1=operator;
      else opflag1=0;
      if((mode==10)&&(((zahl2>-max)&&(zahl2<-min))||((zahl2<max)&&(zahl2>min))))
      {
         sprintf(zahlstring,"%1.13f",zahl2);
         num=strlen(zahlstring)-14;
         if(zahl2<0) num--;
         numnach=14-num;
         sprintf(contstring,"%%1.%ldf",numnach);
         sprintf(zahlstring,contstring,zahl2);
         if(index(zahlstring,'.'))
         {
            punkt=1;
            for(i=strlen(zahlstring)-1;zahlstring[i]=='0';i--)
               zahlstring[i]=(zahlstring[i]=='0')?'\0':zahlstring[i];
            if(zahlstring[i]=='.')
            {
               zahlstring[i]='\0';
               punkt=0;
            }
         }
         numnach=(punkt)?(strlen(index(zahlstring,'.'))-1):0;
      }
      zahl1=zahl2;
      lzahl1=lzahl2;
      Ausgabe();
      punkt=minus=0;
      num=0;
   }
}

/**************************************
 * Modul Rechne()                     *
 *                                    *
 * Berechnet abhängig vom Operator    *
 * op das Ergebnis (double und long)  *
 * und liefert es in (l)zahl2 zurück. *
 *                                    *
 **************************************/
void Rechne(a,b,al,bl,op)
double a,b;
long al,bl;
char op;
{
   extern double zahl2;
   extern long lzahl2;
   extern char mode;
   long LMult(),LDiv();

   switch(op)
   {
      case 2: a+=b;
              al+=bl;
              break;
      case 3: a-=b;
              al-=bl;
              break;
      case 4: al&=bl;
              break;
      case 5: al|=bl;
              break;
      case 6: a*=b;
              al=LMult(al,bl);
              break;
      case 7: if((mode==10)&&(b)) a/=b;
              else if((mode==16)&&(bl))
                 al=LDiv(al,bl);
              break;
   }
   zahl2=a;
   lzahl2=al;
}
