/* plotter2.c */

double a1,a2,b1,b2,b3,x,y,zcord;
char trig,stash;
char z[30],temp[30];
short converted[15],h,h1,v,v1;
extern SHORT mx,my;
double store1,store2,store3,temp1;
int length,spin,tip,again;
extern double magx,magy;
extern int SPCos(),SPSin(),SPTieee(),SPFieee(),SPAtan(),SPTan();
plotter()
{
   double rd,xsp,ysp,ymax,xmax,ymin,xmin;

   ymax=3.0;
   ymin=-3.0;
   xmax=3.0;
   xmin=-3.0;
   xsp=(xmax-xmin)/28.0;
   ysp=(ymax-ymin)/28.0;
   xmax+=.05;
   ymax+=.05;
   strcpy(temp,z);
   SetAPen(rp,1);
   SetDrMd(w->RPort,JAM1);
   RectFill(w->RPort,0,0,639,399);
   SetAPen(rp,0);
   rd=3.14159/180.0;
   a1=cos(spin*rd);
   a2=sin(spin*rd);
   b1=-sin(tip*rd)*sin(spin*rd);
   b2=sin(tip*rd)*cos(spin*rd);
   b3=cos(tip*rd);
   for (x=xmin;x<=xmax;x+=xsp){
      y=ymin;
      if(x==xmin)
         translate();
      process();
      scale();
      h1=h;
      v1=v;
      for (y=ymin;y<=ymax;y+=ysp){
         process();
         scale();
         if (v1<0)
           v1=-10;
         if (v1>400)
            v1=410;
         if (h1<0)
            h1=-10;
         if (h1>639)
            h1=650;
         if (v<0)
            v=-10;
         if (v>400)
            v=410;
         if (h<0)
            h=-10;
         if (h>639)
            h=650;
         Move(rp,h1,v1);
         Draw(rp,h,v);
         h1=h;
         v1=v;
      }
   }
   for (y=ymin;y<=ymax;y+=ysp){
      x=xmin;
      process();
      scale();
      h1=h;
      v1=v;
      for (x=xmin;x<=xmax;x+=xsp){
         process();
         scale();
         if (v1<0)
           v1=-10;
         if (v1>400)
            v1=410;
         if (h1<0)
            h1=-10;
         if (h1>639)
            h1=650;
         if (v<0)
            v=-10;
         if (v>400)
            v=410;
         if (h<0)
            h=-10;
         if (h>639)
            h=650;
         Move(rp,h1,v1);
         Draw(rp,h,v);
         h1=h;
         v1=v;
      }
   }
}

scale()
{
   double q,p;

   q=a1*x+a2*y;
   q=q*magx+(double)mx;
   h=(short)q;
   p=b1*x+b2*y+b3*zcord;
   p=(double)my-p*magy;
   v=(short)p;
}

translate()
{
   char reduce[30],symbol;
   register int a,n;

   length=strlen(temp)-1;
   for (n=0;n<=length;n++){
      symbol=temp[n];
      converted[n]=0;
      switch(symbol) {
         case 'x':
         case 'X':
            converted[n]=-1;
            break;
         case 'y':
         case 'Y':
            converted[n]=-2;
            break;
         case '*':
            converted[n]=-3;
            break;
         case '-':
            converted[n]=-4;
            break;
         case '/':
            converted[n]=-5;
            break;
         case '+':
            converted[n]=-6;
            break;
         case 's':
         case 'S':
            converted[n]=-7;
            if(toupper(temp[n+1])=='I')
               temp[n+1]='0';
            if(toupper(temp[n+2])=='N')
               temp[n+2]='0';
            break;
         case 'c':
         case 'C':
            converted[n]=-8;
            if(toupper(temp[n+1])=='O')
               temp[n+1]='0';
            if(toupper(temp[n+2])=='S')
               temp[n+2]='0';
            break;
         case 't':
         case 'T':
            converted[n]=-9;
            if(toupper(temp[n+1])=='A')
               temp[n+1]='0';
            if(toupper(temp[n+2])=='N')
               temp[n+2]='0';
            break;
         case 'a':
         case 'A':
            converted[n]=-10;
            if(toupper(temp[n+1])=='T')
               temp[n+1]='0';
            if(toupper(temp[n+2])=='N')
               temp[n+2]='0';
            break;
         case '(':
         case ' ':
         case ')':
         case '0':
            converted[n]=0;
            break;
         default:
            converted[n]=symbol-48;
      }
   }
   a=0;
   for (n=0;n<=length;n++){
      if (converted[n]!=0){
         reduce[a]=converted[n];
         a++;
      }
   }
   a--;
   for (n=0;n<=a;n++)
      converted[n]=reduce[n];
   length=a;
}

process()
{
   register int convert,n,num;

   zcord=0;
   num=0;
   store1=0;
   store2=0;
   store3=0;
   stash='0';
   trig='0';
   again=0;
   for (n=0;n<=length;n++){
      convert=converted[n];
      if (convert>0){
         num++;
         if (num==1){
            store1=convert;
            if (n==length)
               tally();
            else
               if (num>10 && converted[n+1] <-2)
                  tally();
         }
         if (num>1 && num<11){
            store1=store1*convert;
            if (n==length)
               tally();
            else
               if (num>10 && converted[n+1] <-2)
                  tally();
         }
         if (num==11){
            store2=convert;
            if (n==length)
               tally();
            else{
               if (num>10 && converted[n+1]<-2 && converted[n+1]>-7)
                  tally();
            }
         }
         if (num>11){
            store2=store2*convert;
            if (n==length)
               tally();
            else{
               if (num>10 && converted[n+1]<-2 && converted[n+1]>-7)
                  tally();
            }
         }
      }
      else {
         switch(convert){
            case -1:
               num++;
               if (num==1){
                  store1=x;
                  if (n==length){
                     tally();
                     break;
                  }
                  if (num>10 && converted[n+1] <-2)
                     tally();
                  break;
               }
               if (num>1 && num<11){
                  store1=store1*x;
                  if (n==length){
                     tally();
                     break;
                  }
                  if (num>10 && converted[n+1] <-2)
                     tally();
                  break;
               }
               if (num==11){
                  store2=x;
                  if (n==length){
                     tally();
                     break;
                  }
                  if (num>10 && converted[n+1] <-2)
                     tally();
                  break;
               }
               if (num>11){
                  store2=store2*x;
                  if (n==length){
                     tally();
                     break;
                  }
                  if (num>10 && converted[n+1] <-2)
                     tally();
               }
               break;
            case -2:
               num++;
               if (num==1){
                  store1=y;
                  if (n==length){
                     tally();
                     break;
                  }
                  if (num>10 && converted[n+1] <-2)
                     tally();
                  break;
               }
               if (num>1 && num<11){
                  store1=store1*y;
                  if (n==length){
                     tally();
                     break;
                  }
                  if (num>10 && converted[n+1] <-2)
                     tally();
                  break;
               }
               if (num==11){
                  store2=y;
                  if (n==length){
                     tally();
                     break;
                  }
                  if (num>10 && converted[n+1] <-2)
                     tally();
                  break;
               }
               if (num>11){
                  store2=store2*y;
                  if (n==length){
                     tally();
                     break;
                  }
                  if (num>10 && converted[n+1] <-2)
                     tally();
               }
               break;
            case -3:
               stash='*';
               num=10;
               again++;
               break;
            case -4:
               stash='-';
               num=10;
               again++;
               break;
            case -5:
               stash='/';
               num=10;
               again++;
               break;
            case -6:
               stash='+';
               num=10;
               again++;
               break;
            case -7:
               trig='S';
               num=10;
               again++;
               store3=store1;
               if (again==1){
                  temp1=store1;
                     if (temp1==0)
                        temp1=1.0;
               break;
               }
               else{
                  temp1=store2;
                     if (temp1==0)
                        temp1=1.0;
               }
               break;
            case -8:
               trig='C';
               num=10;
               again++;
               store3=store1;
               if (again==1){
                  temp1=store1;
                     if (temp1==0)
                        temp1=1.0;
               break;
               }
               else{
                  temp1=store2;
                     if (temp1==0)
                        temp1=1.0;
               }
               break;
            case -9:
               trig='T';
               num=10;
               again++;
               store3=store1;
               if (again==1){
                  temp1=store1;
                     if (temp1==0)
                        temp1=1.0;
               break;
               }
               else{
                  temp1=store2;
                     if (temp1==0)
                        temp1=1.0;
               }
               break;
            case -10:
               trig='A';
               num=10;
               again++;
               store3=store1;
               if (again==1){
                  temp1=store1;
                     if (temp1==0)
                        temp1=1.0;
               break;
               }
               else{
                  temp1=store2;
                     if (temp1==0)
                        temp1=1.0;
               }
               break;
         }
      }
   }
}

tally()
{
   if (trig!='0'){
      switch(trig){
         case 'S':
            k1.num1=store2;
            k1.i1=SPFieee(k1.i1);
            k2.i2=SPSin(k1.i1); /* sin(store2) */
            k2.i2=SPTieee(k2.i2);
            store1=temp1*k2.num2;
            zcord=store1;
            store2=0;
            trig='0';
            break;
         case 'C':
            k1.num1=store2;
            k1.i1=SPFieee(k1.i1);
            k2.i2=SPCos(k1.i1); /* cos(store2) */
            k2.i2=SPTieee(k2.i2);
            store1=temp1*k2.num2;
            zcord=store1;
            store2=0;
            trig='0';
            break;
         case 'T':
            k1.num1=store2;
            k1.i1=SPFieee(k1.i1);
            k2.i2=SPTan(k1.i1); /* tan(store2) */
            k2.i2=SPTieee(k2.i2);
            store1=temp1*k2.num2;
            zcord=store1;
            store2=0;
            trig='0';
            break;
         case 'A':
            k1.num1=store2;
            k1.i1=SPFieee(k1.i1);
            k2.i2=SPAtan(k1.i1); /* atan(store2) */
            k2.i2=SPTieee(k2.i2);
            store1=temp1*k2.num2;
            zcord=store1;
            store2=0;
            trig='0';
            break;
      }
      switch (stash){
         case '*':
            store1=store3*store1;
            zcord=store1;
            break;
         case '-':
            store1=store3-store1;
            zcord=store1;
            break;
         case '/':
            store1=store3/store1;
            zcord=store1;
            break;
         case '+':
            store1=store3+store1;
            zcord=store1;
            break;
      }
   }
   else{
      switch(stash){
         case '*':
            store1=store1*store2;
            zcord=store1;
            again++;
            store2=0;
            break;
         case '-':
            store1=store1-store2;
            zcord=store1;
            again++;
            store2=0;
            break;
         case '/':
            store1=store1/store2;
            zcord=store1;
            again++;
            store2=0;
            break;
         case '+':
            store1=store1+store2;
            zcord=store1;
            again++;
            store2=0;
            break;
         default:
            zcord=store1;
      }
   }
}
