/*
  Analise Byrne machine by Michael J. Cowan, 27 July 2009.
*/


 #include <iostream>
 #include <condefs.h>
 #include <conio.h>
 #include <stdio.h>
 #include <stdlib.h>
 #include <fstream.h>

 char alpha[6000][26],beta[6000][26],plain[6000],code[6000];
 char buffer[26];

 int j,k,m,n,p,q,t,x,y,z;
 int len,flag,nr,move,goback;
 int ptr[6000];
 int index[4] = {1,2,4};

  void get_plain(void);
  void get_code(void);
  void go_back(void);


 main()

 {
   len=19;

   get_plain();
   get_code();

   strcpy(alpha[-1],".........................."); //disk 1
   strcpy(beta[-1], ".........................."); //disk 2

   nr=-1;
   for(m=0;m<len;m++) ptr[m]=-1; ptr[-1]=0;

   do{
      nr++;
      for(m=0;m<26;m++)
        {alpha[nr][m]=alpha[nr-1][m]; beta[nr][m]=beta[nr-1][m];}
      cout<<"letter number= "<<nr<<" plain="<<plain[nr]<<"  cipher="<<code[nr]<<endl;
      cout<<"disk 1 at start ";for(m=0;m<26;m++) cout<<alpha[nr][m]; cout<<endl;
      cout<<"disk 2 at start  ";for(m=0;m<26;m++) cout<<beta[nr][m]; cout<<endl;
      x=plain[nr]-65; y=code[nr]-65;
      cout<<"x="<<x<<" y="<<y<<" ";
                    //...good fit.....
      if(alpha[nr][x]=='.' && beta[nr][y]=='.')
        {
            cout<<" good fit - insert x,y update ptr[n] ";
            alpha[nr][x]=nr+48; beta[nr][y]=nr+48;
            ptr[nr]++;
            if(ptr[nr]==3) {ptr[n]=-1;goback=1;cout<<" ptr[n] too big - goback=1 in Main"<<endl; }
            else
               {
                move=index[ptr[nr]];
                cout<<"ptr[nr]="<<ptr[nr]<<" move="<<move<<" shifting alpha[]"<<endl;
                for(m=0;m<26;m++)
                  {
                   x=move+m; if(x>25) x-=26;
                   buffer[m]=alpha[nr][x];
                  }
                for(m=0;m<26;m++) alpha[nr][m]=buffer[m];
                goback=0;
               }
        }
      else    //......bad  fit......
         goback=1;
      while(goback==1)
         go_back();


      cout<<"disk 1 at finish ";for(m=0;m<26;m++) cout<<alpha[nr][m]; cout<<endl;
      cout<<"disk 2 at finish  ";for(m=0;m<26;m++) cout<<beta[nr][m]; cout<<endl;
      cout<<"End CYCLE"<<endl<<endl; getch();
     }while(nr<len);


   cout<<"letter number= "<<nr<<endl;
   cout<<"alpha at end ";for(m=0;m<26;m++) cout<<alpha[nr][m]; cout<<endl;
   cout<<"beta at end  ";for(m=0;m<26;m++) cout<<beta[nr][m]; cout<<endl;




 cout<<endl<<"end";
 getch();

 return 0;
 }

//---------------------------------------------------------

 void go_back(void)
 {
   nr--;
       if(nr==-1) {cout<<"THIS RUN HAS FAILED....REVIEW STARTING ASSUMPTIONS"<<endl; getch(); }
   ptr[nr]++;
   if(ptr[nr]==3) {ptr[nr]=-1; goback=1; cout<<"in GOBACK nr="<<nr<<" ptr[nr] too big - goback=1"<<endl;}
   else
     {
       goback=0;
       move=index[ptr[nr]] - index[ptr[nr]-1];
       cout<<"NO FIT, in GOBACK shifting alpha["<<nr<<"] by "<<move<<endl;
       for(m=0;m<26;m++)
         {
          x=move+m; if(x>25) x-=26;
          buffer[m]=alpha[nr][x];
         }
       for(m=0;m<26;m++) alpha[nr][m]=buffer[m];

     }



 }
 //............................................................

 void get_plain(void)
   {
     // ifstream infile ("ex1pt_trunc.txt");
      ifstream infile ("C:\\Develop Work\\chaocipher\\ex1pt.txt");
        if (!infile) return ;
        cout << " Getting plain from file...." << endl;
      for(j=0;j<len;j++)
        {
         infile>>plain[j];;
         if(plain[j]<'A' || plain[j]>'Z') break;
        }
      infile.close();
   }
//..............................................
   void get_code(void)
   {
     // ifstream infile ("ex1pt_trunc.txt");
      ifstream infile ("C:\\Develop Work\\chaocipher\\ex1ct.txt");
        if (!infile) return ;
        cout << " Getting cipher from file...." << endl;
      for(j=0;j<len;j++)
        {
         infile>>code[j];;
         if(plain[j]<'A' || plain[j]>'Z') break;
        }
      infile.close();
   }

 //...............................


