 /*****************************************
 *                                        *
 *  ACALC V1.42 PIRATE VERSION !        *
 *                                    *
 *         by CYBORG                *
 *      Made on  17/4/91          *
 *       Compiled with          *
 *      Lattice C v5.02       *
 *      Compile it with     * 
 *       LC -Lm  acalc    *  
 *                      *
 **********************

 *************************************************************
 * VARIABLES NAMES :                                         *
 *                                                           *
 * a            = Flag to mark a number + an operation       *
 * bak[]        = A save of the last digits pressed          *
 * c            = Input Character in ASCII                   *
 * car          = Input from program character               *
 * d            = Flag to mark if decimal                    *
 * donnees(2)   = The program                                *
 * dummy        = Only important for the compiler...         *
 * ff - fi      = Fractional and integer part                *
 * flags[]      = The programmable flags                     *
 * handle       = Handle of RAW:                             *
 * hfile        = Handle of a file                           *
 * imp          = Flag to mark on a program a direct input   *
 * inputp       = Input program name character               *
 * lab          = Label name                                 *
 * lastprn      = Prn backup for the Go function             *
 * ligne        = Only important for to write a thing        *
 * m            = Counter of various for cicles              *
 * mem[]        = Memory (variables)                         *
 * n            = Digit on number position                   *
 * nbtrans      = Octects write                              *
 * newprn       = NewPrn for the Go function                 *
 * nombreX      = Only important on file opening             *
 * nomfich      = Name of the program                        *
 * oca          = Input program reading in modify function   *
 * prg          = Flag to mark if a program is running       *
 * prl          = Program lenght                             *
 * prn          = Digit on program position                  *
 * prx          = Flag to mark if start program :            *
 *                0 if not   1 if yes   2 if with argument   *
 * reach        = Flag to mark if label found in Go function *
 * retu         = Flag to mark RETURN pressed                *
 * q            = Input Number                               *
 * s            = Flag to mark the negativ sign              *
 * savenumber   = Save Number in '!' funtion                 *
 * stack[]      = THE STACK !!!                              *
 * var          = Variable name                              *
 * vtest        = Test type                                  *
 *************************************************************/


#include <stdio.h>
#include <math.h>

#define c *caract
#define inputp *progi
#define var *ivar
#define car *icar
#define oca *ocar
#define lab *ilab
#define vtest *ivtest

short q,a=0,d=0,retu=0;
double stack[10],n=-1;

void main(argc, argv)
int argc;
char *argv[];
{
short dummy=0,nombre,handle,hfile,nombre2,nombre3,nt;
short prg=0,prn=0,prx=0,prl=0,lastprn,reach,newprn,bak[15],m;
char caract[81],ligne[256],progi[1],ivar[1],icar[1],ocar[1];
char ilab[1],ivtest[1];
short nbtrans,imp=0,flags[60];
double mem[60],ff,fi,savenumber;
short donnees[1000];
char nomfich[81];
handle =  open("RAW:100/100/350/39/  \\/\\ ACALC 1.42 PIRATE VERSION /\\/  ",2,dummy);
if (handle != -1) {
if (argc == 2)
   prg = 3;
sprintf(ligne,"\n\n>>>");
write(handle,ligne,strlen(ligne));
do {
   if (prg!=3)
   {
      if (prg==1)
      {
         if (imp != 1)
         {
            prn++;
            c = donnees[prn];
            if (c==';')
            {
               prg = 0;
               prn = 0;
               c='Q';
            }
         } 
         else
         {
            nombre = read(handle,caract,1);
         }
      }
      else
         nombre = read(handle,caract,1);
   }
   else
      c = 'X';
   n+=1;
   if (c >= '0' && c <= '9')
   {   
      q=c-48;
      for(m=10;m>0;m--)
      bak[m]=bak[m-1];
      bak[0]=q;
      if(prg!=1 || imp!=0)
      {
         sprintf(ligne,"%d",q); 
         write(handle,ligne,strlen(ligne));
      }
      if (a==1)
      up();
      if (stack[0]<0)
      {
         if (d==1)
            stack[0]=stack[0]-1/pow(10.0000,n)*q;
         else
            stack[0]=stack[0]*10-q;
      }
      else
      {
         if (d==1)
            stack[0]=stack[0]+1/pow(10.0000,n)*q;
         else
            stack[0]=stack[0]*10+q;
      }
   }
   switch(c)
   {
   case '.': d=1;   n=0;
      if(prg!=1 || imp !=0)
      { 
      sprintf(ligne,"."); 
      write(handle,ligne,strlen(ligne));   
      }
      break;
   case 13 : /* RETURN */
      if (imp!=1)
      {
         if(prg!=1)
         {
         sprintf(ligne,"\n  <ENTER>\n %.5f\n>>>",stack[0]); 
            write(handle,ligne,strlen(ligne));   
            up();
            retu=1;
         }
         else
         {
            up();
            retu=1;
         }
      }
      else
      {
         mem[var-64]=stack[0];   
         imp = 0;
         a=1;
         if(prg!=1)
         {
            sprintf(ligne,"\n>>>"); 
            write(handle,ligne,strlen(ligne));
         }
      }
      break;
   case ' ': if (imp!=1)
      {
         if(prg!=1)
         {
         sprintf(ligne,"\n  <ENTER>\n %.5f\n>>>",stack[0]); 
            write(handle,ligne,strlen(ligne));   
            up();
            retu=1;
         }
         else
         {
            up();
            retu=1;
         }
      }
      else
      {
         mem[var-64]=stack[0];   
         imp = 0;
         a=1;
         if(prg!=1)
         {
            sprintf(ligne,"\n>>>"); 
            write(handle,ligne,strlen(ligne));
         }
      }
      break;
   case 8 : /* BACK */ 
      n--;
      if(d==1)
      {
         if (stack[0]==0)
         {
         sprintf(ligne,"\n\n%.5f\n>>>",stack[0]); 
            write(handle,ligne,strlen(ligne));
            break;
         }
         else if(stack[0]>0)
      stack[0]=stack[0]-1/pow(10.0000,n)*bak[0];
         else
      stack[0]=stack[0]+1/pow(10.0000,n)*bak[0];
      }
      else
      {
         if (stack[0]==0)
            break;
         else if(stack[0]>0)
            stack[0]=(stack[0]-bak[0])/10;
         else
            stack[0]=(stack[0]+bak[0])/10;
      }
      sprintf(ligne,"\b \b"); 
      write(handle,ligne,strlen(ligne));
      n--;
      for(m=0;m<10;m++)
      bak[m]=bak[m+1];
      break;
   case '_': stack[0]=-stack[0];
      n--;
      if(prg!=1 || imp !=0)
      {
      if(d==1)
      {
         sprintf(ligne,"\n\n\nTHEN >",stack[0]); 
         write(handle,ligne,strlen(ligne));
      }
      else
      {
         sprintf(ligne,"\n\n\n>>>%.0f",stack[0]); 
         write(handle,ligne,strlen(ligne));
      }
      }   
      break;
   case 'I': up(); 
      if (prg != 1)
      {
         sprintf(ligne,"\nvar ? ",stack[0]); 
         write(handle,ligne,strlen(ligne));
         nombre3 = read(handle,ivar,1);
         sprintf(ligne,"\n\n\n%.1s   ? ",ivar); 
         write(handle,ligne,strlen(ligne));
      }
      else
      {
         prn++;
         var = donnees[prn];
      }
      imp=1;   break;
   case '&': if(prg==1)
         nombre = read(handle,caract,1);
      break;
	case '!': if(prg!=1)
		{
			sprintf(ligne,"\n\n %.5f\n>>>",stack[1]); 
        	write(handle,ligne,strlen(ligne));
   	}
		savenumber=stack[0];
		stack[0]=stack[1];
		stack[1]=savenumber;
	case 'W': 
      if(prg==1)
      {
         do {
            prn++;
            car=donnees[prn];
            if(car!=')' && car!='\\')
            {
	       sprintf(ligne,"%.1s",icar); 
               write(handle,ligne,strlen(ligne)); 
            }
            else if(car=='\\')
            {
               sprintf(ligne,"\n"); 
               write(handle,ligne,strlen(ligne));
            }
         } while(car != ')');
      car='\0';
      }
      break;
   case 'K':
      if(prg==1)
      {
      prn++;
      vtest = donnees[prn];
      if (vtest >= '0' && vtest <= '9')
      {
         nt=vtest-48;
         prn++;
         vtest = donnees[prn];
         if(vtest=='=')
         {
            if(stack[0]!=nt)
            {
            prn++;
            prn++;
            }   
         }
         if(vtest=='<')
         {
            if(stack[0]>=nt)
            {
            prn++;
            prn++;
            }   
         }
         if(vtest=='>')
         {
            if(stack[0]<=nt)
            {
            prn++;
            prn++;
            }   
         }
         if(vtest=='!')
         {
            if(stack[0]==nt)
            {
            prn++;
            prn++;
            }   
         }
      }
      if(vtest=='y')
      {
         prn++;
         vtest = donnees[prn];
         if(vtest=='=')
         {
            if(stack[0]!=stack[1])
            {
            prn++;
            prn++;
            }   
         }
         if(vtest=='<')
         {
            if(stack[0]>=stack[1])
            {
               prn++;
               prn++;
            }   
         }
         if(vtest=='>')
         {
            if(stack[0]<=stack[1])
            {
               prn++;
               prn++;
            }   
         }
         if(vtest=='!')
         {
            if(stack[0]==stack[1])
            {
               prn++;
               prn++;
            }      
         }
      }
      }
      break;
   case 'Q':
      if(prg==1)
      {
			for(m=0;m<61;m++)
				flags[m]=0;
      	prg=0;
      	prn=0;
      	sprintf(ligne,">>>"); 
      	write(handle,ligne,strlen(ligne));
      }
      break;
   case 'G':
      if (prg==1)
      {
         prn++;
         lastprn=prn;
         lab = donnees[prn];
         prn=0;
         do {
            car=donnees[prn];
            if(car=='L')
            {
               prn++;
               car=donnees[prn];
               if (car==lab)
               {
                  reach=1;
                  newprn=prn;
               }
            }
            prn++;
         } while (donnees[prn]!=';');
         if(reach==1)
            prn=newprn;
         else
            prn=lastprn;
      }
      break;
   case 'R':
      if(retu!=1)
         up();
      if (prg != 1)
      {
         sprintf(ligne,"\nvar ? ",stack[0]); 
         write(handle,ligne,strlen(ligne));
         nombre3 = read(handle,ivar,1);
         sprintf(ligne,"%.1s\n %.1s = ",ivar,ivar); 
         write(handle,ligne,strlen(ligne));
         stack[0]=mem[var-64];
         sprintf(ligne,"%.5f\n>>>",stack[0]); 
         write(handle,ligne,strlen(ligne));
      }
      else
      {
         prn++;
         var = donnees[prn];
         stack[0]=mem[var-64];
      }
      a=1;
      break;
   case 'M': if (prg != 1)
      {
         sprintf(ligne,"\nvar ? ",stack[0]); 
         write(handle,ligne,strlen(ligne));
         nombre3 = read(handle,ivar,1);
         sprintf(ligne,"%.1s\n %.1s = ",ivar,ivar); 
         write(handle,ligne,strlen(ligne));
         mem[var-64]=stack[0];
         sprintf(ligne,"%.5f\n>>>",stack[0]); 
         write(handle,ligne,strlen(ligne));
      }
      else
      {
         prn++;
         var = donnees[prn];
         mem[var-64]=stack[0];
      }
      a=1;
      break;
   case 'v': if (prg!=1)
      {
      sprintf(ligne,"\n X=%.6f\n Y=%.6f\n>>>",stack[0],stack[1]);
      write(handle,ligne,strlen(ligne));
      }
      else
      {
      sprintf(ligne,"%.4f   %.4f",stack[0],stack[1]);
      write(handle,ligne,strlen(ligne));      
      }
      break;
      case 'V': if (prg!=1)
      {
         sprintf(ligne,"\n\n X=%.6f\n>>>",stack[0],stack[1]);
         write(handle,ligne,strlen(ligne));
      }
      else
      {
         sprintf(ligne,"%.6f",stack[0],stack[1]);
         write(handle,ligne,strlen(ligne));      
      }
      break;
   case 'A': if(prg==1) {
         prn++;
         var = donnees[prn];
         flags[var-64]=1;
      }
      break;
   case 'D': if(prg==1) {
         prn++;
         var = donnees[prn];
         flags[var-64]=0;
      }
      break;
   case 'F': if(prg==1) {
         up();
         prn++;
         var = donnees[prn];
         if(flags[var-64]!=1)
            prn+=2;
         }
      break;
   case 'f': if (prg!=1)
      { 
   sprintf(ligne,"\nFractional part of %.3f",stack[0]); 
   write(handle,ligne,strlen(ligne));
      }
      ff=modf(stack[0],&fi);
      stack[0]=ff;   
      if (prg!=1)
      {
      sprintf(ligne,"\n = %.5f\n>>>",stack[0]); 
      write(handle,ligne,strlen(ligne));
      }
      demi();   break;
   case 'i': if(prg!=1)
      {
   sprintf(ligne,"\nInteger part of %.3f",stack[0]); 
   write(handle,ligne,strlen(ligne));
      }
      ff=modf(stack[0],&fi);
      stack[0]=fi;   
      if(prg!=1)
      {
      sprintf(ligne,"\n = %.1f\n>>>",stack[0]); 
      write(handle,ligne,strlen(ligne));
      }
      demi();   break;
   case 'd': down();
      break;
   case 'X': up();
      if(prg==0)
      {
         sprintf(ligne,"\n\n\nPROGRAM NAME ?"); 
         write(handle,ligne,strlen(ligne));
         prn=0;
         do {
            nombre2 = read(handle,progi,1);
            if (inputp!=13)
            {
               if(inputp!=8)
               {
            sprintf(ligne,"%.1s",progi); 
            write(handle,ligne,strlen(ligne));
               nomfich[prn] = inputp;
               prn++;
               }
               else
               {
                  if(prn!=0)
                  {
         prn--;
         nomfich[prn] = '\0';
         sprintf(ligne,"\b \b"); 
         write(handle,ligne,strlen(ligne));
                  }
               }
            }
         } while(inputp != 13);
			if(prn==0)
			{
				sprintf(ligne,"\nNOTHING MADE !\n\n>>>");   
         	write(handle,ligne,strlen(ligne));
         	break;
			}
    nomfich[prn] = '\0';
         hfile = open(nomfich, 0, dummy);
         if(hfile != -1)
         {
            nbtrans = read(hfile, donnees, sizeof(donnees));
            close (hfile);
       		prx=1;
         }
         else
         {
            sprintf(ligne,"\nError : can't open %s !\n\n>>>",nomfich);
            write(handle,ligne,strlen(ligne));
       		down();
            prg=0;
            break;
         }
         sprintf(ligne,"\n\n\nPROGRAM %s\n", nomfich);
         write(handle,ligne,strlen(ligne));
      }
      else if(prg==1)
      {
         newprn=0;
         do {
            prn++;
            car=donnees[prn];
            if (car!=')')
            {
               nomfich[newprn] = car;
               newprn++;
            }
            else
               nomfich[newprn]='\0';
         } while(car != ')');
         hfile = open(nomfich, 0, dummy);
         if(hfile != -1)
         {
         nbtrans = read(hfile, donnees, sizeof(donnees));
         close (hfile);
    prx=1;
         }
         else
         {
         sprintf(ligne,"\nError : can't open %s !\n\n>>>",nomfich);
         write(handle,ligne,strlen(ligne));
    down();
         }
      }
      else
      {
         hfile = open(argv[1], 0, dummy);
         if(hfile != -1)
         {
         nbtrans = read(hfile, donnees, sizeof(donnees));
         close (hfile);
    sprintf(ligne,"\n\n\nPROGRAM %s", argv[1]);
         write(handle,ligne,strlen(ligne));
    prx=2;
    }
         else
         {
         sprintf(ligne,"\nError : can't open %s !\n\n>>>",argv[1]);
         write(handle,ligne,strlen(ligne));
    down();
    prg=0;
    break;
         }
      }
      prg=1;
      prn=-1;
      break;
   case 'Y': if(prx==1) 
      {
        	sprintf(ligne,"\n\n\nPROGRAM %s\n", nomfich); 
        	write(handle,ligne,strlen(ligne));
      }
      else if(prx==2)
      {
   		sprintf(ligne,"\n\n\nPROGRAM %s", argv[1]); 
        	write(handle,ligne,strlen(ligne));
      }
      else
   		break;
      prg=1;
      prn=-1;
      break;
		case 'O': prn = 0;
            sprintf(ligne,"\n\n\nPROGRAM NAME ?"); 
            write(handle,ligne,strlen(ligne));
            do {
               nombre2 = read(handle,progi,1);
               if (inputp!=13)
               {
                     if(inputp!=8)
                     {
                     sprintf(ligne,"%.1s",progi); 
                     write(handle,ligne,strlen(ligne));
                     nomfich[prn] = inputp;
                     prn++;
                     }
                     else
                     {
                           if(prn!=0)
                           {
                        prn--;
                        nomfich[prn] = '\0';
                        sprintf(ligne,"\b \b"); 
                     write(handle,ligne,strlen(ligne));
                           }
                     }
               }
               else
                     nomfich[prn]='\0';
            } while(inputp != 13);
				if(prn==0)
				{
					sprintf(ligne,"\nNOTHING MADE !\n\n>>>");   
         		write(handle,ligne,strlen(ligne));
         		break;
				}
            hfile = open(nomfich, 0, dummy);
            if(hfile != -1)
            {
               nbtrans = read(hfile, donnees, sizeof(donnees));
               close(hfile);
            }
            else
            {
            sprintf(ligne,"\nError : can't open %s !\n\n>>>", nomfich);   
               write(handle,ligne,strlen(ligne));
               down();
               close(hfile);
               prg=0;
               break;
            }
            sprintf(ligne,"\nMOD>>>");
            write(handle,ligne,strlen(ligne));
            for(prn=0;donnees[prn]!=';';prn++)
            {
               oca=donnees[prn];
               sprintf(ligne,"%.1s", ocar);
               write(handle,ligne,strlen(ligne));
            }
            prl=prn;
            prn--;
            do {
              	nombre2 = read(handle,progi,1);
              	if(inputp==8)
         		{
                 if(prn!=-1)
                 {
                     prl--;
               		lastprn=prn;
                     sprintf(ligne,"\b");
                     write(handle,ligne,strlen(ligne));
               		for(;donnees[prn]!=';';prn++)
                     {
                  		donnees[prn]=donnees[prn+1];
                        oca=donnees[prn];
                  		sprintf(ligne,"%.1s", ocar);
                        write(handle,ligne,strlen(ligne));
                     }
               		sprintf(ligne,"\b  \b");
                     write(handle,ligne,strlen(ligne));
                     for(;prn!=lastprn;prn--)
                     {
                     sprintf(ligne,"\b");
                     write(handle,ligne,strlen(ligne));
               }
               prn--;
            }
         }
         else if(inputp==-101)
         {
            nombre2 = read(handle,progi,1);
            if (inputp==68 && prn!=-1)
            {
               sprintf(ligne,"\b"); 
                     write(handle,ligne,strlen(ligne));
               prn--;         
            }
            else if(inputp==67)
            {
               prn++;
               if(donnees[prn]!=';')
               {
                  oca=donnees[prn];
                        sprintf(ligne,"%.1s", ocar);
                    write(handle,ligne,strlen(ligne));
               }
               else
                  prn--;
            }
         }
         else
         {
            if(inputp!=13)
            {
            lastprn=prn;
            prl++;
            for(;donnees[prn+1]!=';';prn++)
                  {
               oca=donnees[prn+1];
                     sprintf(ligne,"%.1s", ocar);
                    write(handle,ligne,strlen(ligne));
                  }
            prn++;
            sprintf(ligne,"  ", ocar);
                 write(handle,ligne,strlen(ligne));
            for(;prn!=lastprn;prn--)
                  {
               donnees[prn+1]=donnees[prn];
               if(donnees[prn]!=';')
               {
               oca=donnees[prn];
                     sprintf(ligne,"\b\b%.1s",ocar);
                  write(handle,ligne,strlen(ligne));
               }
            }
            prn++;
            donnees[prn] = inputp;
            oca=donnees[prn];
            sprintf(ligne,"\b\b%.1s",ocar);
            write(handle,ligne,strlen(ligne));
            }
              }
            } while(inputp != 13);
            donnees[prl]=';';
				if(prl==0)
				{	
					sprintf(ligne,"\nNOTHING MADE !\n\n>>>");   
         		write(handle,ligne,strlen(ligne));
    				close(hfile);
         		break;
				}
            sprintf(ligne,"\n\n\nWould U like to save it ?"); 
            write(handle,ligne,strlen(ligne));
            do {
              nombre2 = read(handle,progi,1);
            } while(inputp != 'y' && inputp != 'n');
            if (inputp=='y')
            {
               hfile = creat(nomfich, dummy);
               if(hfile == -1)
               {
            sprintf(ligne,"\nError on %s modification !\n\n>>>", nomfich);   
                  write(handle,ligne,strlen(ligne));
                  close(hfile);
                  break;
               }
               nbtrans = write(hfile, donnees, prl*2+2);
               close(hfile);
            }
            sprintf(ligne,"\n\n\n>>>"); 
            write(handle,ligne,strlen(ligne));
            break;      
   case 'P': prn = 0;
             prl = 0;
      	sprintf(ligne,"\n\n\nPROGRAM NAME ?"); 
      	write(handle,ligne,strlen(ligne));
      	do {
        nombre2 = read(handle,progi,1);
        if (inputp!=13)
         {
            if(inputp!=8)
            {
         sprintf(ligne,"%.1s",progi); 
         write(handle,ligne,strlen(ligne));
         nomfich[prn] = inputp;
         prn++;
         }
         else
            {
               if(prn!=0)
               {
         prn--;
         nomfich[prn] = '\0';
         sprintf(ligne,"\b \b"); 
         write(handle,ligne,strlen(ligne));
               }
            }
         }
         else
            nomfich[prn]='\0';
      } while(inputp != 13);
		if(prn==0)
		{
			sprintf(ligne,"\nNOTHING MADE !\n\n>>>");   
         write(handle,ligne,strlen(ligne));
         break;
		}

/********************************************************************
 ********************************************************************/

      sprintf(ligne,"\nPRG>>>");
		write(handle,ligne,strlen(ligne));
		donnees[0]=';';
		prl=0;
		prn=-1;
      do {
      	nombre2 = read(handle,progi,1);
         if(inputp==8)
         {
         	if(prn!=-1)
            {
            	prl--;
              	lastprn=prn;
               sprintf(ligne,"\b");
               write(handle,ligne,strlen(ligne));
               for(;donnees[prn]!=';';prn++)
               {
               	donnees[prn]=donnees[prn+1];
                  oca=donnees[prn];
                  sprintf(ligne,"%.1s", ocar);
                  write(handle,ligne,strlen(ligne));
               }
               sprintf(ligne,"\b  \b");
               write(handle,ligne,strlen(ligne));
               for(;prn!=lastprn;prn--)
               {
               	sprintf(ligne,"\b");
                  write(handle,ligne,strlen(ligne));
               }
               prn--;
            }
         }
         else if(inputp==-101)
         {
         	nombre2 = read(handle,progi,1);
            if (inputp==68 && prn!=-1)
            {
               sprintf(ligne,"\b"); 
                     write(handle,ligne,strlen(ligne));
               prn--;         
            }
            else if(inputp==67)
            {
               prn++;
               if(donnees[prn]!=';')
               {
                  oca=donnees[prn];
                        sprintf(ligne,"%.1s", ocar);
                    write(handle,ligne,strlen(ligne));
               }
               else
                  prn--;
            }
         }
         else
         {
            if(inputp!=13)
            {
					prn++;
            	lastprn=prn;
            	prl++;
            	for(;donnees[prn]!=';';prn++)
            	{
            		oca=donnees[prn];
            	   sprintf(ligne,"%.1s", ocar);
            	  	write(handle,ligne,strlen(ligne));
            	}
            	sprintf(ligne,"  ", ocar);
               write(handle,ligne,strlen(ligne));
            	prn++;
					for(;prn!=lastprn;prn--)
               {
               	donnees[prn]=donnees[prn-1];
						if(donnees[prn]!=';')
               	{
               		oca=donnees[prn];
                     sprintf(ligne,"\b\b%.1s",ocar);
                  	write(handle,ligne,strlen(ligne));
               	}
            	}
            	donnees[prn] = inputp;
            	oca=donnees[prn];
            	sprintf(ligne,"\b\b%.1s",ocar);
            	write(handle,ligne,strlen(ligne));
            }
         }
      } while(inputp != 13);
      donnees[prl]=';';
		if(prl==0)
		{	
			sprintf(ligne,"\nNOTHING MADE !\n\n>>>");   
      	write(handle,ligne,strlen(ligne));
    		close(hfile);
      	break;
		}
      sprintf(ligne,"\n\n\nWould U like to save it ?"); 
      write(handle,ligne,strlen(ligne));
      do {
         nombre2 = read(handle,progi,1);
      } while(inputp != 'y' && inputp != 'n');
      if (inputp=='y')
        {
               hfile = creat(nomfich, dummy);
               if(hfile == -1)
               {
            sprintf(ligne,"\nError on %s modification !\n\n>>>", nomfich);   
                  write(handle,ligne,strlen(ligne));
                  close(hfile);
                  break;
               }
               nbtrans = write(hfile, donnees, prl*2+2);
               close(hfile);
            }
            sprintf(ligne,"\n\n\n>>>"); 
            write(handle,ligne,strlen(ligne));
            break;    
   case '+': if (prg!=1)
      {
         sprintf(ligne,"\n %.3f + %.3f",stack[1],stack[0]); 
         write(handle,ligne,strlen(ligne));
         stack[0]=stack[1]+stack[0];   
         sprintf(ligne,"\n = %.5f\n>>>",stack[0]); 
         write(handle,ligne,strlen(ligne));
      }
      else
      {
         stack[0]=stack[1]+stack[0];
      }
      semi();   break;
         
   case '-': if (prg!=1)
      {
         sprintf(ligne,"\n %.3f - %.3f",stack[1],stack[0]); 
         write(handle,ligne,strlen(ligne));
         stack[0]=stack[1]-stack[0];   
         sprintf(ligne,"\n = %.5f\n>>>",stack[0]); 
         write(handle,ligne,strlen(ligne));
      }
      else
      {
         stack[0]=stack[1]-stack[0];
      }
      semi();   break;
   case '*': if (prg!=1)
      {
         sprintf(ligne,"\n %.3f * %.3f",stack[1],stack[0]); 
         write(handle,ligne,strlen(ligne)); 
         stack[0]=stack[1]*stack[0];   
         sprintf(ligne,"\n = %.5f\n>>>",stack[0]); 
         write(handle,ligne,strlen(ligne));
      }
      else
      {
         stack[0]=stack[1]*stack[0];
      }
      semi();   break;
   case '/': if(prg!=1)
      {
         if(stack[0]!=0)
         {
         sprintf(ligne,"\n %.3f / %.3f",stack[1],stack[0]); 
         write(handle,ligne,strlen(ligne));
         stack[0]=stack[1]/stack[0];   
         sprintf(ligne,"\n = %.5f\n>>>",stack[0]); 
         write(handle,ligne,strlen(ligne));
         semi();
         }
         else
         {
      sprintf(ligne,"\nI Can't divide by 0 !\n\n>>>");
      write(handle,ligne,strlen(ligne));
      down();
      down();
         }
      }
      else
      {
         if(stack[0]!=0)
         {
            stack[0]=stack[1]/stack[0];
            semi();
         }
         else
         {
   sprintf(ligne,"\nI Can't divide by 0 !\nProgram interrupted...\n>>>");
         write(handle,ligne,strlen(ligne));
         down();
    down();
    prg=0;
         prn=0;
         }
      }
      break;
   case 'p': if (prg!=1)
      {
         sprintf(ligne,"\n %.3f power %.3f",stack[1],stack[0]); 
         write(handle,ligne,strlen(ligne)); 
         stack[0]=pow(stack[1],stack[0]);   
         sprintf(ligne,"\n = %.5f\n>>>",stack[0]); 
         write(handle,ligne,strlen(ligne));
      }
      else
      {
         stack[0]=pow(stack[1],stack[0]);
      }
      semi();   break;
   case 'r': if (prg!=1)
      {
      sprintf(ligne,"\n %.3fth radical of %.3f",stack[0],stack[1]); 
      write(handle,ligne,strlen(ligne)); 
      stack[0]=pow(stack[1],(1/stack[0]));   
      sprintf(ligne,"\n = %.5f\n>>>",stack[0]); 
      write(handle,ligne,strlen(ligne));
      }
      else
      {
         stack[0]=pow(stack[1],(1/stack[0]));   
      }
      semi(); break;
   case 'q': if (prg!=1)
      {
			if(stack[0]<0)
			{
sprintf(ligne,"\n Can't do the square-root\n of a negative number !\n>>>"); 
         	write(handle,ligne,strlen(ligne));
				down();
				break;
			} 
         sprintf(ligne,"\n Square root of %.3f",stack[0]); 
         write(handle,ligne,strlen(ligne)); 
         stack[0]=sqrt(stack[0]);   
         sprintf(ligne,"\n = %.5f\n>>>",stack[0]); 
         write(handle,ligne,strlen(ligne));
      }
      else
      {
			if(stack[0]<0)
			{
sprintf(ligne,"\n Can't do the square-root\n of a negative number !\n>>>"); 
         	write(handle,ligne,strlen(ligne));
				down();
    			prg=0;
         	prn=0;
				break;
			} 
         stack[0]=sqrt(stack[0]);
      }
      demi();   break;
   case 's': if (prg!=1)
      {
         sprintf(ligne,"\n Sine of %.3f",stack[0]); 
         write(handle,ligne,strlen(ligne)); 
         stack[0]=sin(stack[0]);   
         sprintf(ligne,"\n = %.5f\n>>>",stack[0]); 
         write(handle,ligne,strlen(ligne));
      }
      else
      {
         stack[0]=sin(stack[0]);
      }
      demi();   break;
   case 'S': if (prg!=1)
      {
         sprintf(ligne,"\n Arc-sine of %.3f",stack[0]); 
         write(handle,ligne,strlen(ligne));    
         stack[0]=asin(stack[0]);   
         sprintf(ligne,"\n = %.5f\n>>>",stack[0]); 
         write(handle,ligne,strlen(ligne));
      }
         else
         {
         stack[0]=asin(stack[0]);
         }
         demi();   break;
      case 'h': if (prg!=1)
      {
         sprintf(ligne,"\n Hyp-sine of %.3f",stack[0]); 
         write(handle,ligne,strlen(ligne)); 
         stack[0]=sinh(stack[0]);   
         sprintf(ligne,"\n = %.5f\n>>>",stack[0]); 
         write(handle,ligne,strlen(ligne));
      }
      else
      {
         stack[0]=sinh(stack[0]);   
      }
      demi();   break;
   case 'c': if (prg!=1)
      {
         sprintf(ligne,"\n Cosine of %.3f",stack[0]); 
         write(handle,ligne,strlen(ligne)); 
         stack[0]=cos(stack[0]);   
         sprintf(ligne,"\n = %.5f\n>>>",stack[0]); 
         write(handle,ligne,strlen(ligne));
      }
      else
      {
         stack[0]=cos(stack[0]);   
      }
      demi();   break;
   case 'C': if (prg!=1)
      {
         sprintf(ligne,"\n Arc-cosine of %.3f",stack[0]); 
         write(handle,ligne,strlen(ligne)); 
         stack[0]=acos(stack[0]);   
         sprintf(ligne,"\n = %.5f\n>>>",stack[0]); 
         write(handle,ligne,strlen(ligne));
      }
      else
      {
         stack[0]=acos(stack[0]);   
      }
      demi();   break;
   case 'j': if (prg!=1)
      {
         sprintf(ligne,"\n Hyp-cosine of %.3f",stack[0]); 
         write(handle,ligne,strlen(ligne)); 
         stack[0]=cosh(stack[0]);   
         sprintf(ligne,"\n = %.5f\n>>>",stack[0]); 
         write(handle,ligne,strlen(ligne));
      }
      else
      {
         stack[0]=cosh(stack[0]);
      }
      demi(); break;
   case 't': if (prg!=1)
      {
         sprintf(ligne,"\n Tangent of %.3f",stack[0]); 
         write(handle,ligne,strlen(ligne)); 
         stack[0]=tan(stack[0]);   
         sprintf(ligne,"\n = %.5f\n>>>",stack[0]); 
         write(handle,ligne,strlen(ligne));
      }
      else
      {
         stack[0]=tan(stack[0]);
      }
      demi();   break;
      case 'T': if (prg!=1)
      {
         sprintf(ligne,"\n Arc-tangent of %.3f",stack[0]); 
         write(handle,ligne,strlen(ligne)); 
         stack[0]=atan(stack[0]);    
         sprintf(ligne,"\n = %.5f\n>>>",stack[0]); 
         write(handle,ligne,strlen(ligne));
      }
      else
      {
         stack[0]=atan(stack[0]); 
      }
      demi();   break;
   case 'k': if (prg!=1)
      {
         sprintf(ligne,"\n Hyp-tangent of %.3f",stack[0]); 
         write(handle,ligne,strlen(ligne)); 
         stack[0]=tanh(stack[0]);   
         sprintf(ligne,"\n%.5f\n>>>",stack[0]); 
         write(handle,ligne,strlen(ligne));
      }
      else
      {
         stack[0]=tanh(stack[0]);   
      }
      demi();   break;
      case 'Z': if (prg!=1)
      {
         sprintf(ligne,"\n Cotangent of %.3f",stack[0]); 
         write(handle,ligne,strlen(ligne)); 
         stack[0]=cot(stack[0]);   
         sprintf(ligne,"\n = %.5f\n>>>",stack[0]); 
         write(handle,ligne,strlen(ligne));
      }
      else
      {
         stack[0]=cot(stack[0]);   
      }
      demi();   break;
   case 'z': if (prg!=1)
      {
      sprintf(ligne,"\n %.3f Arc-tangent of %.3f",stack[1],stack[0]); 
      write(handle,ligne,strlen(ligne)); 
      stack[0]=atan2(stack[1],stack[0]);
      sprintf(ligne,"\n = %.5f\n>>>",stack[0]); 
      write(handle,ligne,strlen(ligne));
      }
      else
      {
         stack[0]=atan2(stack[1],stack[0]);
      }
      semi();   break;
   }
} while(c != '\033');
close(handle);
}
}

up()
{
   int m;
   a=0;
   for(m=10;m>0;m--)
   stack[m]=stack[m-1];
   stack[0]=0;
   n=0;
   d=0;
   retu=0;
   return 0;
}

down()
{
   int m;
   for(m=0;m<10;m++)
   stack[m]=stack[m+1];
   d=0;
   n=0;
   retu=0;
   return 0;
}   
   
semi()
{
   int m;
   for(m=1;m<10;m++)
   stack[m]=stack[m+1];
   a=1;
   d=0;
   n=0;
   retu=0;
   return 0;
}

demi()
{
   a=1;
   d=0;
   n=0;
   retu=0;
   return 0;
}


 




