#include <allinc.h>
#include <dir.h>

struct _entry
{//an entry into the data bank
   int position;
   apstring song;
   bool ichioshi;
   int block;
   apstring playstyle;
   apstring author;
   apstring comment;
   int index;
   apstring mcs;
   int steps;
   int partnersteps;
   double voltage; //peakdensity times bpm
   double amplitude; //avgdensity times bpm
   double chaos; //percent of non-onbeat steps
   double jump; //jump count
};

void submain(apvector <_entry> &, char [], apvector <apstring> &, apvector <double> &, apvector <double> &, apvector <double> &, apvector <apstring> &);
bool gimme(apvector <char> &, char []);
inline int uint(char a){return (char(a)+512)%256;};//converts char to unsigned int
int getid(apvector <char> &);
void compilesonglist(apvector <apstring> &);
void compilebpmlist(apvector <double> &, apvector <apstring> &);
void compilegaplist(apvector <double> &, apvector <apstring> &);
void compilesamplelist(apvector <double> &, apvector <apstring> &);
void compileFILElist(apvector <apstring> &, apvector <apstring> &);
const char cl[50]={'A','B','C','D','E','F','G','H','I','J','K','L','M','N','O','P','Q','R','S','T','U','V','W','X','Y','Z','0','1','2','3','4','5','6','7','8','9','!','&','@','$','\\','%','(',')','-','=','#','_','.','+'};
void fillmasterlist(apvector <_entry> &,apstring);
apstring caps(apstring);
apstring substring(apstring &, int, int);
int nzcount=0;
void main()
{
   apvector <_entry> masterlist(3771);
   fillmasterlist(masterlist,"5M.txt");
   for(int i=0; i<3771; i++)
      masterlist[i].mcs="";

   apvector <apstring> songlist(1);
   songlist[0]="X";
   apvector <double> bpmlist(1);
   bpmlist[0]=0;
   apvector <double> gaplist(1);
   gaplist[0]=0;
   apvector <double> samplelist(1);
   samplelist[0]=0;
   apvector <apstring> FILElist(1);
   FILElist[0]="X";
   compilesonglist(songlist);
   compilebpmlist(bpmlist,songlist);
   compilegaplist(gaplist,songlist);
   compilesamplelist(samplelist,songlist);
   compileFILElist(FILElist,songlist);

   ifstream INF;
   INF.open("SongIDs_5.txt");
   apstring name;
   getline(INF,name);
   while(!INF.eof())
   {
      if(name!="X")
      {
         int target=-1;
         do
         {
            target++;
         }while(target<masterlist.length() && caps(masterlist[target].song)!=caps(name));
         if(target==3771)
         {
            cout<<name<<" was not found!\n";
            //getch();
         }
         else
         {
            cout<<name<<" OK";
            ifstream music;
            apstring temp="./MP3";
            temp+="/";
            temp+=name;
            temp+=".mp3";
            music.open(temp.c_str());
            if(!music.fail())
               cout<<" - MUSIC OK\n";
            else
            {
               cout<<" - MUSIC FAILED\n";
               //getch();
            }
            music.close();
         }
      }
      getline(INF,name);
   }


   apvector <apstring> headerlist(0);
   ifstream infh;
   infh.open("targetheaders.txt");
   if(!infh.fail())
   {
      apstring dummy;
      do
      {
         getline(infh,dummy);
         headerlist.resize(headerlist.length()+1);
         headerlist[headerlist.length()-1]=dummy;
      }while(!infh.eof());
   }

   int hitcount=0;
   char omgfilename[13];
   omgfilename[12]=NULL;
   int index;
   bool trigger;
   ifstream test;
   for(int i=0; i<headerlist.length(); i++)
   {
      cout<<headerlist[i][0]<<headerlist[i][1]<<headerlist[i][2]<<" "<<hitcount<<endl;
      for(int l=0; l<50; l++)
      {
         for(int m=0; m<50; m++)
         {
            for(int x=1; x<=8; x++)
            {
               omgfilename[0]=headerlist[i][0];
               omgfilename[1]=headerlist[i][1];
               omgfilename[2]=headerlist[i][2];
               omgfilename[3]=cl[l];
               omgfilename[4]=cl[m];
               omgfilename[5]=char(x+0x30);
               omgfilename[8]='.';
               omgfilename[9]='m';
               omgfilename[10]='c';
               omgfilename[11]='s';
               index=0;
               do
               {
                  index++;
                  omgfilename[6]=char(index/10+0x30);
                  omgfilename[7]=char(index%10+0x30);
                  test.open(omgfilename);
                  trigger=true;
                  if(test.fail())
                     trigger=false;
                  else
                    {
                     submain(masterlist,omgfilename,songlist,bpmlist,gaplist,samplelist,FILElist);
                       hitcount++;
                    }
                    test.close();
               }while(trigger);
            }
         }
      }
   }
   for(int i=0; i<3770; i++)
   {
      int target=i;
      for(int j=i; j<3771; j++)
         if(caps(masterlist[j].song)<caps(masterlist[target].song))
            target=j;
         else if(caps(masterlist[j].song)==caps(masterlist[target].song))
            if(masterlist[j].position<masterlist[target].position)
               target=j;
      if(target!=i)
      {
         _entry temp=masterlist[target];
         masterlist[target]=masterlist[i];
         masterlist[i]=temp;
      }
   }

   ofstream ouf;
   ouf.open("5databank.html");
   if(ouf.fail())
   {
      cout<<"html failed\n";
      getch();
   }
   else
   {
      ouf<<"<html><head><title>Dance Dance Revolution 5th Mix Data Bank</title><META content=\"text/html; charset=shift_jis\" http-equiv=Content-Type></head><body bgcolor=\"#000000\" text=\"#ffffff\" link=\"#00ff00\" alink=\"#ffa500\" vlink=\"#ff0000\"><basefont size=\"2\"><table border style=\"font-size:12px\">";
      ouf<<"<tr><td>Title</td><td>Author</td><td>Comment</td><td>Block</td><td>Diff</td><td>Style</td><td>Steps</td><td>V</td><td>A</td><td>C</td><td>J</td><td>MCS</td></tr>";
      for(int i=0; i<3771; i++)
      {
         ouf<<"<tr><td>";
         //ouf<<masterlist[i].position<<"</td><td>";
         ouf<<masterlist[i].song<<"</td><td>";
         if(masterlist[i].ichioshi)
            ouf<<"<font color=\"red\">";
         ouf<<masterlist[i].author<<"</td><td>";
         ouf<<masterlist[i].comment<<"</td><td>";
         ouf<<masterlist[i].block<<"-"<<(masterlist[i].index%100)/10<<(masterlist[i].index%100)%10<<"</td><td>";

         double stars=0;
            if (masterlist[i].voltage<400)
               stars+=masterlist[i].voltage/200.0;
            else
               stars+=2;

            if      (masterlist[i].amplitude<200)
               stars+=1;
            else if (200<=masterlist[i].amplitude && masterlist[i].amplitude<600)
               stars+=1+pow(((masterlist[i].amplitude-200)/200.0),2);
            else
               stars+=5;

            if      (masterlist[i].chaos<.10)
               stars+=0;
            else
               stars+=sqrt(masterlist[i].chaos*100-10)/3.8-masterlist[i].chaos/2.0;

            if      (masterlist[i].jump<0)
               stars+=0;
            else if (masterlist[i].jump<126)
               //stars+=(masterlist[i].jump+10)/30.0;
               stars+=pow(masterlist[i].jump,0.8)/16.0;
            else
               stars+=3;

            //slightly alter star ratings so that lowest is 1.0 and highest is 9.99
            stars=stars*1.37857-2.0678;

         if(masterlist[i].mcs!="")
            ouf<<"&#9734;"<<int(stars)<<"."<<int(stars*10)%10<<"</td><td>";
         else
            ouf<<"</td><td>";

         ouf<<masterlist[i].playstyle;
         if(masterlist[i].mcs!="")
         {
            if(masterlist[i].playstyle!="COUPLE")
               ouf<<"</td><td>"<<masterlist[i].steps<<"</td><td>"; //steps
            else
               ouf<<"</td><td>"<<masterlist[i].steps<<"/"<<masterlist[i].partnersteps<<"</td><td>";

            if      (  0<=masterlist[i].voltage && masterlist[i].voltage<200)
               stars+=0;
            else if (200<=masterlist[i].voltage && masterlist[i].voltage<400)
               ouf<<"<font color=\"yellow\">";
            else if (400<=masterlist[i].voltage && masterlist[i].voltage<600)
               ouf<<"<font color=\"orange\">";
            else
               ouf<<"<font color=\"red\">";
            ouf<<int(masterlist[i].voltage)<<"</td><td>";

            if      (  0<=masterlist[i].amplitude && masterlist[i].amplitude<200)
               stars+=0;
            else if (200<=masterlist[i].amplitude && masterlist[i].amplitude<400)
               ouf<<"<font color=\"yellow\">";
            else if (400<=masterlist[i].amplitude && masterlist[i].amplitude<600)
               ouf<<"<font color=\"orange\">";
            else
               ouf<<"<font color=\"red\">";
            ouf<<int(masterlist[i].amplitude)<<"</td><td>";

            if      (  0<=masterlist[i].chaos && masterlist[i].chaos<.30)
               stars+=0;
            else if (.30<=masterlist[i].chaos && masterlist[i].chaos<.50)
               ouf<<"<font color=\"yellow\">";
            else if (.50<=masterlist[i].chaos && masterlist[i].chaos<.70)
               ouf<<"<font color=\"orange\">";
            else
               ouf<<"<font color=\"red\">";
            ouf<<int(masterlist[i].chaos*100)<<"</td><td>";

            if      (  0<=masterlist[i].jump && masterlist[i].jump<20)
               stars+=0;
            else if (20<=masterlist[i].jump && masterlist[i].jump<50)
               ouf<<"<font color=\"yellow\">";
            else if (50<=masterlist[i].jump && masterlist[i].jump<80)
               ouf<<"<font color=\"orange\">";
            else
               ouf<<"<font color=\"red\">";
            ouf<<int(masterlist[i].jump)<<"</td><td>";
         }
         else
         {
            ouf<<"</td><td></td><td></td><td></td><td></td><td></td><td>";
         }
         if(masterlist[i].mcs!="")
            ouf<<masterlist[i].mcs<<"</td>";
         else
            ouf<<"</td>";
         //if(masterlist[i].mcs!="")
         //   ouf<<"<a href=\""<<masterlist[i].song<<masterlist[i].index<<".dwi\">DWI</a></td>";
         //else
         // ouf<<"</td>";
         //for anything else use td-stuff-/td format
         ouf<<"</tr>";
      }
      ouf<<"</table></body></html>";
      cout<<"HTML IS WIN\n";
   }
   ouf.close();
   cout<<"FOUND "<<hitcount<<" - DONE\nNZCOUNT="<<nzcount;
   getch();
}
void submain(apvector <_entry> &masterlist, char omgfilename[], apvector <apstring> &songlist, apvector <double> &bpmlist, apvector <double> &gaplist, apvector <double> &samplelist, apvector <apstring> &FILE)
{
   apvector <char> array(8320);

   gimme(array,omgfilename);
   //GIMME FILE

   int id=uint(array[708])+256*uint(array[709]);

   if(uint(array[0x2C7])!=0)
      nzcount++;

   int searchindex=-1;
   do//search for song, index, and assign .mcs filename to "mcs"
   {
      searchindex++;
   }while(searchindex<3771 && !(caps(masterlist[searchindex].song)==caps(songlist[id]) && masterlist[searchindex].index==getid(array)));
   if(searchindex!=3771)
   {
      masterlist[searchindex].mcs=omgfilename;
      if(int(array[710])==0)
         masterlist[searchindex].playstyle="SINGLE";
      else if(int(array[710])==1)
         masterlist[searchindex].playstyle="COUPLE";
      else if(int(array[710])==2)
         masterlist[searchindex].playstyle="DOUBLE";
      else if(int(array[710])==3)
         masterlist[searchindex].playstyle="SOLO";
      else
      {
         cout<<"Can't find playstyle "<<int(array[710])<<endl;
         getch();
      }
      //cout<<songlist[id]<<" #"<<getid(array)<<" OK\n";
   }
   else
   {
      cout<<songlist[id]<<" #"<<getid(array)<<" was not found!\n";
      getch();
   }

   int laststep=0xA8F; //determine location of final step
   while(uint(array[laststep])==0)
      laststep--;

   //open dwi for outputtage
   apstring dirname="";
   dirname+=songlist[id];
   dirname+=array[0x1B];
   dirname+=array[0x1C];
   dirname+=array[0x1D];
   mkdir(dirname.c_str());

   apstring filename="./";
   filename+=dirname;
   filename+="/";
   filename+=songlist[id];
   filename+=array[0x1B];
   filename+=array[0x1C];
   filename+=array[0x1D];
   filename+=".dwi";
   ofstream ouf;
   ouf.open(filename.c_str());
   if(ouf.fail())
   {
      cout<<"SOMETHING IS WRONG WITH "<<filename<<endl;
   }

   //FILE TAG
   ouf<<"#FILE:./Songs/"<<FILE[id]<<"/";
   int slashfinder=0;//moves up until it finds the slash /, then prints everything after that.
   while(FILE[id][slashfinder]!='/')
      slashfinder++;
   ouf<<substring(FILE[id],slashfinder+1,0)<<".mp3;\n";
   //ouf<<"#FILE:./Songs/Dance Dance Revolution 5th Mix Data Bank/MP3/"<<songlist[id]<<".mp3;\n";

   //WRITE OUT TO LIST FOR DIFFICULTY EVALUATOR
   if(int(array[710])==0) //only for SINGLE edits
   {
      ofstream oufdd;
      oufdd.open("xxdwievallist.txt",ios::app);
      oufdd<<substring(filename,0,-4)<<endl;
      //oufdd<<"./"<<substring(FILE[id],slashfinder+1,0)<<array[0x1B]<<array[0x1C]<<array[0x1D]<<"/"<<substring(FILE[id],slashfinder+1,0)<<array[0x1B]<<array[0x1C]<<array[0x1D]<<endl;
      oufdd.close();
   }
   //WRITE OUT LIST FOR ALL-SONG <> HUNTER
   ofstream oufdd;
   oufdd.open("xxdwialllist.txt",ios::app);
   oufdd<<setw(3)<<(int(array[0x7F])+512)%256<<" "<<setw(3)<<(int(array[0xC1])+512)%256<<" "<<setw(3)<<(int(array[0x2C0])+512)%256<<" "<<substring(filename,0,-4)<<endl;
   oufdd.close();


   //TITLE
   ouf<<"#TITLE:"<<songlist[id]<<";\n";
   //ARTIST -> EDIT ID
   ouf<<"#ARTIST:DATA BANK EDIT No."<<getid(array)<<";\n";

   //TEMPO INFORMATION
   ouf<<"#BPM:"<<bpmlist[id]<<";\n";

   //GAP INFORMATION
   ouf<<"#GAP:"<<gaplist[id]<<";\n";

   //TEMPO CHANGE
   if(id==279) ouf<<"#CHANGEBPM:32=136.73,96=136.79,160=137.56,224=136.64,288=136.67,352=136.64,544=136.57;\n"; //getoff OK
   if(id==198) ouf<<"#CHANGEBPM:512=90,640=180,896=90;\n";//era OK!
   if(id==156) ouf<<"#CHANGEBPM:128=100,256=120,384=140,512=160,640=180;\n";//wildrush
   if(id==180) ouf<<"#CHANGEBPM:344=110.09,352=112.36,368=116.33,384=120.42,400=124.42,416=128.41,432=132.38,448=136.36,456=140.35,480=144.32,492=148.05,512=152.86,528=156.25,544=159.57,560=165.18,576=168.54,592=171,608=173.95;\n";//saintgoesmarching OK
   if(id==252) ouf<<"#CHANGEBPM:608=100.59,616=98.52,624=87.59,632=54.89;\n";//rememberyou
   if(id==196) ouf<<"#CHANGEBPM:864=125.26,872=112.78,874=98.36,876=102.04;\n";//.59
   if(id== 19) ouf<<"#CHANGEBPM:80=159.48,208=159.65,336=156.64,416=159.61,544=159.89,672=158.18;\n";//littlebitch OK
   if(id==170) ouf<<"#CHANGEBPM:208=112.1;\n";//shakeyourbooty
   if(id== 44) ouf<<"#CHANGEBPM:176=190.2;\n";//lovethisfeelin
   if(id==  2) ouf<<"#CHANGEBPM:128=109.65,192=110.53,256=108.84,320=108.95,384=109.84,448=110.31,512=108.28,576=107.98;\n";//that'stheway
   if(id== 70 || id==98) ouf<<"#CHANGEBPM:352=147,408=160;\n";//skaagogo, another
   if(id== 58) ouf<<"#CHANGEBPM:468=140;\n";//e-motion OK!

   //SAMPLESTART
   ouf<<"#SAMPLESTART:"<<samplelist[id]<<";\n";

   //OUTPUT STEP DATA
   ouf<<"#";
   switch(int(array[710]))
   {
      case 0: ouf<<"SINGLE"; break;
      case 1: ouf<<"COUPLE"; break;
      case 2: ouf<<"DOUBLE"; break;
      case 3: ouf<<"SOLO"; break;
   };
   ouf<<":SMANIAC:5:00000000(";

   masterlist[searchindex].voltage=0;
   masterlist[searchindex].amplitude=0;
   masterlist[searchindex].chaos=0;
   masterlist[searchindex].jump=0;
   masterlist[searchindex].steps=0;
   masterlist[searchindex].partnersteps=0;//count steps up like what
   for(int i=0x320; i<=laststep; i++)
   {
      if(uint(array[i])!=0 && uint(array[i])!=0xFF)
      {//not empty, not FF
         if(int(array[710])!=1)
         {
            if(uint(array[i])!=0)
               masterlist[searchindex].steps++;
            if(uint(array[i])!=0x01 && uint(array[i])!=0x02 && uint(array[i])!=0x04 && uint(array[i])!=0x08 && uint(array[i])!=0x10 && uint(array[i])!=0x20 && uint(array[i])!=0x40 && uint(array[i])!=0x80 && uint(array[i])!=0x11 && uint(array[i])!=0x22 && uint(array[i])!=0x44 && uint(array[i])!=0x88)
               masterlist[searchindex].jump++;
            if(i%4!=0 && uint(array[i-1])!=0xFF)
               masterlist[searchindex].chaos++;
            int temp=0;
            for(int j=i; j>i-16; j--)//count up number of steps in the last 4 beats
               if(uint(array[j])!=0 && uint(array[j])!=0xFF)
                  temp++;
            if(temp>masterlist[searchindex].voltage)
               masterlist[searchindex].voltage=temp;
         }
         else
         {
            if(uint(array[i])/16!=0)
               masterlist[searchindex].steps++;
            if(uint(array[i])/16!=1 && uint(array[i])/16!=2 && uint(array[i])/16!=4 && uint(array[i])/16!=8)
               masterlist[searchindex].jump++;
            if(i%4!=0 && uint(array[i-1])!=0xFF && uint(array[i])/16!=0)
               masterlist[searchindex].chaos++;
            int temp=0;
            for(int j=i; j>i-16; j--)//count up number of steps in the last 4 beats for p1
               if(uint(array[j])/16!=0 && uint(array[j])!=0xFF)
                  temp++;
            if(temp>masterlist[searchindex].voltage)
               masterlist[searchindex].voltage=temp;
            if(uint(array[i])%16!=0)
               masterlist[searchindex].partnersteps++;
         }
      }
   }
   //format groove radar values
   masterlist[searchindex].voltage*=bpmlist[id]/4.0;
   masterlist[searchindex].amplitude=masterlist[searchindex].steps/double((laststep-0x320)/16)*bpmlist[id]/4;
   masterlist[searchindex].chaos/=masterlist[searchindex].steps;
   //masterlist[searchindex].jump //do nothing

   if(int(array[710])!=3) // SINGLE DOUBLE COUPLE
   {                       //only reads right side of byte
      for(int i=0x320; i<=laststep; i++)
      {
         if(uint(array[i])%16!=0xF) //not 1P 12ths
         {
            switch(uint(array[i])%16)
            {
               case  0: ouf<<"0"; break;
               case  1: ouf<<"4"; break;
               case  2: ouf<<"2"; break;
               case  3: ouf<<"1"; break;
               case  4: ouf<<"8"; break;
               case  5: ouf<<"7"; break;
               case  6: ouf<<"A"; break;
               case  7: ouf<<"<428>"; cout<<songlist[id]<<getid(array)<<" BIG JUMP!\n"; getch();break;
               case  8: ouf<<"6"; break;
               case  9: ouf<<"B"; break;
               case 10: ouf<<"3"; break;
               case 11: ouf<<"<426>"; cout<<songlist[id]<<getid(array)<<" BIG JUMP!\n"; getch();break;
               case 12: ouf<<"9"; break;
               case 13: ouf<<"<486>"; cout<<songlist[id]<<getid(array)<<" BIG JUMP!\n"; getch();break;
               case 14: ouf<<"<286>"; cout<<songlist[id]<<getid(array)<<" BIG JUMP!\n"; getch(); break;
               case 15: ouf<<"<4286>"; cout<<songlist[id]<<getid(array)<<" Error 1\n"; getch(); break;
            }
         }
         else //yes 12ths
         {
            ouf<<")[";
            for(int j=1; j<=3; j++)
               switch(uint(array[i+j])%16)
               {
                  case  0: ouf<<"00"; break;
                  case  1: ouf<<"40"; break;
                  case  2: ouf<<"20"; break;
                  case  3: ouf<<"10"; break;
                  case  4: ouf<<"80"; break;
                  case  5: ouf<<"70"; break;
                  case  6: ouf<<"A0"; break;
                  case  7: ouf<<"<428>0"; cout<<songlist[id]<<getid(array)<<" BIG JUMP!\n"; getch();break;
                  case  8: ouf<<"60"; break;
                  case  9: ouf<<"B0"; break;
                  case 10: ouf<<"30"; break;
                  case 11: ouf<<"<426>0"; cout<<songlist[id]<<getid(array)<<" BIG JUMP!\n"; getch();break;
                  case 12: ouf<<"90"; break;
                  case 13: ouf<<"<486>0"; cout<<songlist[id]<<getid(array)<<" BIG JUMP!\n"; getch();break;
                  case 14: ouf<<"<286>0"; cout<<songlist[id]<<getid(array)<<" BIG JUMP!\n"; getch();break;
                  case 15: ouf<<"<4286>0"; cout<<songlist[id]<<getid(array)<<" Error 2\n"; getch(); break;
               };
            ouf<<"](";
            i+=3;
         }
      }
   }
   else //SOLO-need to be able to read both sides of the byte at once
   {
      for(int i=0x320; i<=laststep; i++)
      {                  //AFROP305 uses 5F
         if(uint(array[i])!=0x5F && uint(array[i])!=0xFF) //not 12ths
         {
            switch(uint(array[i])) //LOOKS AT ENTIRE BYTE
            {
               case 0x00: ouf<<"0"; break;
               case 0x01: ouf<<"4"; break;
               case 0x02: ouf<<"2"; break;
               case 0x03: ouf<<"1"; break;
               case 0x04: ouf<<"8"; break;
               case 0x05: ouf<<"7"; break;
               case 0x06: ouf<<"A"; break;
               case 0x07: ouf<<"<428>"; cout<<songlist[id]<<getid(array)<<" BIG JUMP!\n"; getch();break;
               case 0x08: ouf<<"6"; break;
               case 0x09: ouf<<"B"; break;
               case 0x0A: ouf<<"3"; break;
               case 0x0B: ouf<<"<426>"; cout<<songlist[id]<<getid(array)<<" BIG JUMP!\n"; getch();break;
               case 0x0C: ouf<<"9"; break;
               case 0x0D: ouf<<"<486>"; cout<<songlist[id]<<getid(array)<<" BIG JUMP!\n"; getch();break;
               case 0x0E: ouf<<"<286>"; cout<<songlist[id]<<getid(array)<<" BIG JUMP!\n"; getch();break;
               case 0x0F: ouf<<"<4286>"; cout<<songlist[id]<<getid(array)<<" Error 3\n"; getch(); break;

               case 0x10: ouf<<"C"; break;     //WITH 0x10
               case 0x11: ouf<<"E"; break;
               case 0x12: ouf<<"F"; break;
               case 0x13: ouf<<"<C1>"; cout<<songlist[id]<<getid(array)<<" BIG JUMP!\n"; getch();break;
               case 0x14: ouf<<"G"; break;
               case 0x15: ouf<<"<C7>"; cout<<songlist[id]<<getid(array)<<" BIG JUMP!\n"; getch();break;
               case 0x16: ouf<<"<CA>";cout<<songlist[id]<<getid(array)<<" BIG JUMP!\n"; getch(); break;
               case 0x17: ouf<<"<C428>"; cout<<songlist[id]<<getid(array)<<" BIG JUMP!\n"; getch();break;
               case 0x18: ouf<<"H"; break;
               case 0x19: ouf<<"<CB>"; cout<<songlist[id]<<getid(array)<<" BIG JUMP!\n"; getch();break;
               case 0x1A: ouf<<"<C3>"; cout<<songlist[id]<<getid(array)<<" BIG JUMP!\n"; getch();break;
               case 0x1B: ouf<<"<C426>"; cout<<songlist[id]<<getid(array)<<" BIG JUMP!\n"; getch();break;
               case 0x1C: ouf<<"<C9>"; cout<<songlist[id]<<getid(array)<<" BIG JUMP!\n"; getch();break;
               case 0x1D: ouf<<"<C486>"; cout<<songlist[id]<<getid(array)<<" BIG JUMP!\n"; getch();break;
               case 0x1E: ouf<<"<C286>"; cout<<songlist[id]<<getid(array)<<" BIG JUMP!\n"; getch();break;
               case 0x1F: ouf<<"<C4286>"; cout<<songlist[id]<<getid(array)<<" Error 4\n"; getch(); break;

               case 0x40: ouf<<"D"; break;      //WITH 0x40
               case 0x41: ouf<<"I"; break;
               case 0x42: ouf<<"J"; break;
               case 0x43: ouf<<"<D1>"; cout<<songlist[id]<<getid(array)<<" BIG JUMP!\n"; getch();break;
               case 0x44: ouf<<"K"; break;
               case 0x45: ouf<<"<D7>"; cout<<songlist[id]<<getid(array)<<" BIG JUMP!\n"; getch();break;
               case 0x46: ouf<<"<DA>"; cout<<songlist[id]<<getid(array)<<" BIG JUMP!\n"; getch();break;
               case 0x47: ouf<<"<D428>"; cout<<songlist[id]<<getid(array)<<" BIG JUMP!\n"; getch();break;
               case 0x48: ouf<<"L"; break;
               case 0x49: ouf<<"<DB>"; cout<<songlist[id]<<getid(array)<<" BIG JUMP!\n"; getch();break;
               case 0x4A: ouf<<"<D3>"; cout<<songlist[id]<<getid(array)<<" BIG JUMP!\n"; getch();break;
               case 0x4B: ouf<<"<D426>"; cout<<songlist[id]<<getid(array)<<" BIG JUMP!\n"; getch();break;
               case 0x4C: ouf<<"<D9>"; cout<<songlist[id]<<getid(array)<<" BIG JUMP!\n"; getch();break;
               case 0x4D: ouf<<"<D486>"; cout<<songlist[id]<<getid(array)<<" BIG JUMP!\n"; getch();break;
               case 0x4E: ouf<<"<D286>"; cout<<songlist[id]<<getid(array)<<" BIG JUMP!\n"; getch();break;
               case 0x4F: ouf<<"<D4286>"; cout<<songlist[id]<<getid(array)<<" Error 5\n"; getch(); break;

               case 0x50: ouf<<"M"; break;      //WITH 0x50
               case 0x51: ouf<<"<M4>"; cout<<songlist[id]<<getid(array)<<" BIG JUMP!\n"; getch();break;
               case 0x52: ouf<<"<M2>"; cout<<songlist[id]<<getid(array)<<" BIG JUMP!\n"; getch();break;
               case 0x53: ouf<<"<M1>"; cout<<songlist[id]<<getid(array)<<" BIG JUMP!\n"; getch();break;
               case 0x54: ouf<<"<M8>"; cout<<songlist[id]<<getid(array)<<" BIG JUMP!\n"; getch();break;
               case 0x55: ouf<<"<M7>"; cout<<songlist[id]<<getid(array)<<" BIG JUMP!\n"; getch();break;
               case 0x56: ouf<<"<MA>"; cout<<songlist[id]<<getid(array)<<" BIG JUMP!\n"; getch();break;
               case 0x57: ouf<<"<M428>"; cout<<songlist[id]<<getid(array)<<" BIG JUMP!\n"; getch();break;
               case 0x58: ouf<<"<M6>"; cout<<songlist[id]<<getid(array)<<" BIG JUMP!\n"; getch();break;
               case 0x59: ouf<<"<MB>"; cout<<songlist[id]<<getid(array)<<" BIG JUMP!\n"; getch();break;
               case 0x5A: ouf<<"<M3>"; cout<<songlist[id]<<getid(array)<<" BIG JUMP!\n"; getch();break;
               case 0x5B: ouf<<"<M426>"; cout<<songlist[id]<<getid(array)<<" BIG JUMP!\n"; getch();break;
               case 0x5C: ouf<<"<M9>"; cout<<songlist[id]<<getid(array)<<" BIG JUMP!\n"; getch();break;
               case 0x5D: ouf<<"<M486>"; cout<<songlist[id]<<getid(array)<<" BIG JUMP!\n"; getch();break;
               case 0x5E: ouf<<"<M286>"; cout<<songlist[id]<<getid(array)<<" BIG JUMP!\n"; getch();break;
               case 0x5F: ouf<<"<M4286>"; cout<<songlist[id]<<getid(array)<<" Error 6\n"; getch(); break;

               case 0xFF: cout<<songlist[id]<<getid(array)<<" Error 7\n"; getch(); break;
            }
         }
         else //yes 12ths
         {
            ouf<<")[";
            for(int j=1; j<=3; j++)
            {
               switch(uint(array[i+j]))
               {
                  case 0x00: ouf<<"0"; break;
                  case 0x01: ouf<<"4"; break;
                  case 0x02: ouf<<"2"; break;
                  case 0x03: ouf<<"1"; break;
                  case 0x04: ouf<<"8"; break;
                  case 0x05: ouf<<"7"; break;
                  case 0x06: ouf<<"A"; break;
                  case 0x07: ouf<<"<428>"; cout<<songlist[id]<<getid(array)<<" BIG JUMP!\n"; getch();break;
                  case 0x08: ouf<<"6"; break;
                  case 0x09: ouf<<"B"; break;
                  case 0x0A: ouf<<"3"; break;
                  case 0x0B: ouf<<"<426>"; cout<<songlist[id]<<getid(array)<<" BIG JUMP!\n"; getch();break;
                  case 0x0C: ouf<<"9"; break;
                  case 0x0D: ouf<<"<486>"; cout<<songlist[id]<<getid(array)<<" BIG JUMP!\n"; getch();break;
                  case 0x0E: ouf<<"<286>"; cout<<songlist[id]<<getid(array)<<" BIG JUMP!\n"; getch();break;
                  case 0x0F: ouf<<"<4286>"; cout<<songlist[id]<<getid(array)<<" Error 8\n"; getch(); break;

                  case 0x10: ouf<<"C"; break;     //WITH 0x10
                  case 0x11: ouf<<"E"; break;
                  case 0x12: ouf<<"F"; break;
                  case 0x13: ouf<<"<C1>"; cout<<songlist[id]<<getid(array)<<" BIG JUMP!\n"; getch();break;
                  case 0x14: ouf<<"G"; break;
                  case 0x15: ouf<<"<C7>"; cout<<songlist[id]<<getid(array)<<" BIG JUMP!\n"; getch();break;
                  case 0x16: ouf<<"<CA>"; cout<<songlist[id]<<getid(array)<<" BIG JUMP!\n"; getch();break;
                  case 0x17: ouf<<"<C428>"; cout<<songlist[id]<<getid(array)<<" BIG JUMP!\n"; getch();break;
                  case 0x18: ouf<<"H"; break;
                  case 0x19: ouf<<"<CB>"; cout<<songlist[id]<<getid(array)<<" BIG JUMP!\n"; getch();break;
                  case 0x1A: ouf<<"<C3>"; cout<<songlist[id]<<getid(array)<<" BIG JUMP!\n"; getch();break;
                  case 0x1B: ouf<<"<C426>"; cout<<songlist[id]<<getid(array)<<" BIG JUMP!\n"; getch();break;
                  case 0x1C: ouf<<"<C9>"; cout<<songlist[id]<<getid(array)<<" BIG JUMP!\n"; getch();break;
                  case 0x1D: ouf<<"<C486>"; cout<<songlist[id]<<getid(array)<<" BIG JUMP!\n"; getch();break;
                  case 0x1E: ouf<<"<C286>"; cout<<songlist[id]<<getid(array)<<" BIG JUMP!\n"; getch();break;
                  case 0x1F: ouf<<"<C4286>"; cout<<songlist[id]<<getid(array)<<" Error 9\n"; getch(); break;

                  case 0x40: ouf<<"D"; break;      //WITH 0x40
                  case 0x41: ouf<<"I"; break;
                  case 0x42: ouf<<"J"; break;
                  case 0x43: ouf<<"<D1>"; cout<<songlist[id]<<getid(array)<<" BIG JUMP!\n"; getch();break;
                  case 0x44: ouf<<"K"; break;
                  case 0x45: ouf<<"<D7>"; cout<<songlist[id]<<getid(array)<<" BIG JUMP!\n"; getch();break;
                  case 0x46: ouf<<"<DA>"; cout<<songlist[id]<<getid(array)<<" BIG JUMP!\n"; getch();break;
                  case 0x47: ouf<<"<D428>"; cout<<songlist[id]<<getid(array)<<" BIG JUMP!\n"; getch();break;
                  case 0x48: ouf<<"L"; break;
                  case 0x49: ouf<<"<DB>"; cout<<songlist[id]<<getid(array)<<" BIG JUMP!\n"; getch();break;
                  case 0x4A: ouf<<"<D3>";cout<<songlist[id]<<getid(array)<<" BIG JUMP!\n"; getch(); break;
                  case 0x4B: ouf<<"<D426>"; cout<<songlist[id]<<getid(array)<<" BIG JUMP!\n"; getch();break;
                  case 0x4C: ouf<<"<D9>"; cout<<songlist[id]<<getid(array)<<" BIG JUMP!\n"; getch();break;
                  case 0x4D: ouf<<"<D486>"; cout<<songlist[id]<<getid(array)<<" BIG JUMP!\n"; getch();break;
                  case 0x4E: ouf<<"<D286>"; cout<<songlist[id]<<getid(array)<<" BIG JUMP!\n"; getch();break;
                  case 0x4F: ouf<<"<D4286>"; cout<<songlist[id]<<getid(array)<<" Error 10\n"; getch(); break;

                  case 0x50: ouf<<"M"; break;      //WITH 0x50
                  case 0x51: ouf<<"<M4>"; cout<<songlist[id]<<getid(array)<<" BIG JUMP!\n"; getch();break;
                  case 0x52: ouf<<"<M2>"; cout<<songlist[id]<<getid(array)<<" BIG JUMP!\n"; getch();break;
                  case 0x53: ouf<<"<M1>"; cout<<songlist[id]<<getid(array)<<" BIG JUMP!\n"; getch();break;
                  case 0x54: ouf<<"<M8>"; cout<<songlist[id]<<getid(array)<<" BIG JUMP!\n"; getch();break;
                  case 0x55: ouf<<"<M7>";cout<<songlist[id]<<getid(array)<<" BIG JUMP!\n"; getch(); break;
                  case 0x56: ouf<<"<MA>"; cout<<songlist[id]<<getid(array)<<" BIG JUMP!\n"; getch();break;
                  case 0x57: ouf<<"<M428>"; cout<<songlist[id]<<getid(array)<<" BIG JUMP!\n"; getch();break;
                  case 0x58: ouf<<"<M6>"; cout<<songlist[id]<<getid(array)<<" BIG JUMP!\n"; getch();break;
                  case 0x59: ouf<<"<MB>"; cout<<songlist[id]<<getid(array)<<" BIG JUMP!\n"; getch();break;
                  case 0x5A: ouf<<"<M3>"; cout<<songlist[id]<<getid(array)<<" BIG JUMP!\n"; getch();break;
                  case 0x5B: ouf<<"<M426>"; cout<<songlist[id]<<getid(array)<<" BIG JUMP!\n"; getch();break;
                  case 0x5C: ouf<<"<M9>"; cout<<songlist[id]<<getid(array)<<" BIG JUMP!\n"; getch();break;
                  case 0x5D: ouf<<"<M486>"; cout<<songlist[id]<<getid(array)<<" BIG JUMP!\n"; getch();break;
                  case 0x5E: ouf<<"<M286>"; cout<<songlist[id]<<getid(array)<<" BIG JUMP!\n"; getch();break;
                  case 0x5F: ouf<<"<M4286>"; cout<<songlist[id]<<getid(array)<<" Error 11\n"; getch(); break;
               };
               ouf<<"0"; //24th -> 12th spacer
            }
            ouf<<"](";
            i+=3;
         }
      }
   }
   //COUPLE AND DOUBLE SECTION PORTION
   if(int(array[710])==1 || int(array[710])==2) //couple, double- second portion
   {
      ouf<<"):00000000(";
      for(int i=0x320; i<=laststep; i++)
      {
         if(uint(array[i])/16!=0xF) //not 2P-side 12ths
         {
            if(int(array[710])==2)
            {//counts up cross-platform triple-jumps
               int arrowcount=0;
               int p=uint(array[i])%16;
               int q=uint(array[i])/16;
               arrowcount+=p/8; p%=8;
               arrowcount+=p/4; p%=4;
               arrowcount+=p/2; p%=2;
               arrowcount+=p  ;
               arrowcount+=q/8; q%=8;
               arrowcount+=q/4; q%=4;
               arrowcount+=q/2; q%=2;
               arrowcount+=q  ;
               if(arrowcount>2)
               {
                  cout<<songlist[id]<<getid(array)<<" BIG JUMP!\n";
                  getch();
               }          
            }
            switch(uint(array[i])/16) //THIS IS THE ONLY DIFFERENCE % -> /
            {
               case  0: ouf<<"0"; break;
               case  1: ouf<<"4"; break;
               case  2: ouf<<"2"; break;
               case  3: ouf<<"1"; break;
               case  4: ouf<<"8"; break;
               case  5: ouf<<"7"; break;
               case  6: ouf<<"A"; break;
               case  7: ouf<<"<428>"; cout<<songlist[id]<<getid(array)<<" BIG JUMP!\n"; getch();break;
               case  8: ouf<<"6"; break;
               case  9: ouf<<"B"; break;
               case 10: ouf<<"3"; break;
               case 11: ouf<<"<426>"; cout<<songlist[id]<<getid(array)<<" BIG JUMP!\n"; getch();break;
               case 12: ouf<<"9"; break;
               case 13: ouf<<"<486>"; cout<<songlist[id]<<getid(array)<<" BIG JUMP!\n"; getch();break;
               case 14: ouf<<"<286>"; cout<<songlist[id]<<getid(array)<<" BIG JUMP!\n"; getch();break;
               case 15: ouf<<"<4286>"; cout<<songlist[id]<<getid(array)<<" Error 12\n"; getch(); break;
            }
         }
         else //yes 12ths
         {
            ouf<<")[";
            for(int j=1; j<=3; j++)
               switch(uint(array[i+j])/16)
               {
                  case  0: ouf<<"00"; break;
                  case  1: ouf<<"40"; break;
                  case  2: ouf<<"20"; break;
                  case  3: ouf<<"10"; break;
                  case  4: ouf<<"80"; break;
                  case  5: ouf<<"70"; break;
                  case  6: ouf<<"A0"; break;
                  case  7: ouf<<"<428>0"; cout<<songlist[id]<<getid(array)<<" BIG JUMP!\n"; getch();break;
                  case  8: ouf<<"60"; break;
                  case  9: ouf<<"B0"; break;
                  case 10: ouf<<"30"; break;
                  case 11: ouf<<"<426>0"; cout<<songlist[id]<<getid(array)<<" BIG JUMP!\n"; getch();break;
                  case 12: ouf<<"90"; break;
                  case 13: ouf<<"<486>0";cout<<songlist[id]<<getid(array)<<" BIG JUMP!\n"; getch(); break;
                  case 14: ouf<<"<286>0"; cout<<songlist[id]<<getid(array)<<" BIG JUMP!\n"; getch();break;
                  case 15: ouf<<"<4286>0"; cout<<songlist[id]<<getid(array)<<" Error 13\n"; getch(); break;
               };
            ouf<<"](";
            i+=3;
         }
      }
   }
   ouf<<");";
   ouf.close();
   //cout<<"CONVERTED SUCCESSFULLY\n";
   //getch();
}
bool gimme(apvector <char> &target, char filename[])
//Use: opens file FILENAME, and if it exists, stores data into TARGET
//Args: Target, the destination for the file data, and filename, the name of the file to open
//Returns: true if file is found and target is filled, false if file isn't found
{
  FILE *inf;
  inf=fopen(filename,"rb");
  char c;

  if (inf==NULL)  //file not found
  {
      cout<<filename<<" IS FUCKED UP";
      fclose(inf);
      return false;
  }
  else //file found
  {
    for(int i=0; i<8320; i++) //8320 bytes in file
    {
      c = fgetc(inf);
      target[i]=c;
    }
    fclose(inf);
  }
  return true;
}
int getid(apvector <char> &array)
//Use: gets file "edit index" from the array
//Args: array containing edit file
//Returns: decimal value of those three digits
{
   return 100*(uint(array[0x1B])-0x30)+10*(uint(array[0x1C])-0x30)+uint((array[0x1D])-0x30);
}
void compilesonglist(apvector <apstring> &songlist)
//Args: array to contain songnames
//Note: Songnames are already in order according to ID
{
   ifstream inf;
   inf.open("SongIDs_5.txt");
   if(inf.fail())
   {
      cout<<"TITLE DATA NOT FOUND";
      getch();
      return;
   }

   apstring dummy;
   getline(inf,dummy);
   while(!inf.eof())
   {
      songlist.resize(songlist.length()+1);
      songlist[songlist.length()-1]=dummy;
      getline(inf,dummy);
   }
   inf.close();
}
void compilebpmlist(apvector <double> &songlist, apvector <apstring> &omgnames)
//Args: array to contain song bpm's
{
   songlist.resize(omgnames.length());
   for(int i=0; i<songlist.length(); i++)
      songlist[i]=0;
   ifstream inf;

   for(int i=0; i<omgnames.length(); i++)
   {
      apstring filename="./DATA/";
      filename+=omgnames[i];
      filename+="/";
      filename+=omgnames[i];
      filename+=".dwi";
      ifstream inf;
      inf.open(filename.c_str());
      if(omgnames[i]!="X" && inf.fail())
      {
         cout<<omgnames[i]<<" FOLDER NOT FOUND!\n";
         //getch();
      }
      else if(omgnames[i]!="X")
      {
         apstring dummy;
         getline(inf,dummy);
         while(!inf.eof())
         {
            //cout<<dummy;
            getline(inf,dummy);
            if(dummy.length()>5)
            {
               if(substring(dummy,1,3)=="BPM")
               {
                  apstring temp=substring(dummy,5,-1);
                  bool decimal=false;
                  double decfactor=1;                  
                  for(int j=0; j<temp.length(); j++)
                  {
                     if(temp[j]=='.')
                        decimal=true;
                     else
                     {
                        if(!decimal)
                        {
                           songlist[i]*=10;
                           songlist[i]+=int(temp[j])-0x30;
                        }
                        else
                        {
                           decfactor/=10.0;
                           songlist[i]+=decfactor*(int(temp[j])-0x30);
                        }
                     }
                  }
               }
            }
         }
      }
      inf.close();
   }
}
void compilegaplist(apvector <double> &songlist, apvector <apstring> &omgnames)
//Args: array to contain song bpm's
{
   songlist.resize(omgnames.length());
   for(int i=0; i<songlist.length(); i++)
      songlist[i]=0;
   ifstream inf;

   for(int i=0; i<omgnames.length(); i++)
   {
      apstring filename="./DATA/";
      filename+=omgnames[i];
      filename+="/";
      filename+=omgnames[i];
      filename+=".dwi";
      ifstream inf;
      inf.open(filename.c_str());
      if(omgnames[i]!="X" && inf.fail())
      {
         cout<<omgnames[i]<<" FOLDER NOT FOUND!\n";
         //getch();
      }
      else if(omgnames[i]!="X")
      {
         apstring dummy;
         getline(inf,dummy);
         while(!inf.eof())
         {
            getline(inf,dummy);
            if(dummy.length()>5)
            {
               if(substring(dummy,1,3)=="GAP")
               {
                  apstring temp=substring(dummy,5,-1);
                  bool decimal=false;
                  double decfactor=1;
                  for(int j=0; j<temp.length(); j++)
                  {
                     if(temp[j]=='.')
                        decimal=true;
                     else
                     {
                        if(!decimal)
                        {
                           songlist[i]*=10;
                           songlist[i]+=int(temp[j])-0x30;
                        }
                        else
                        {
                           decfactor/=10.0;
                           songlist[i]+=decfactor*(int(temp[j])-0x30);
                        }
                     }
                  }
               }
            }
         }
      }
      inf.close();
   }
}
void compilesamplelist(apvector <double> &songlist, apvector <apstring> &omgnames)
//Args: array to contain song bpm's
{
   songlist.resize(omgnames.length());
   for(int i=0; i<songlist.length(); i++)
      songlist[i]=0;
   ifstream inf;

   for(int i=0; i<omgnames.length(); i++)
   {
      apstring filename="./DATA/";
      filename+=omgnames[i];
      filename+="/";
      filename+=omgnames[i];
      filename+=".dwi";
      ifstream inf;
      inf.open(filename.c_str());
      if(omgnames[i]!="X" && inf.fail())
      {
         cout<<omgnames[i]<<" FOLDER NOT FOUND!\n";
         //getch();
      }
      else if(omgnames[i]!="X")
      {
         apstring dummy;
         getline(inf,dummy);
         while(!inf.eof())
         {
            getline(inf,dummy);
            if(dummy.length()>15)
            {
               if(substring(dummy,1,11)=="SAMPLESTART")
               {
                  apstring temp=substring(dummy,13,-1);
                  bool decimal=false;
                  double decfactor=1;
                  for(int j=0; j<temp.length(); j++)
                  {
                     if(temp[j]=='.')
                        decimal=true;
                     else
                     {
                        if(!decimal)
                        {
                           songlist[i]*=10;
                           songlist[i]+=int(temp[j])-0x30;
                        }
                        else
                        {
                           decfactor/=10.0;
                           songlist[i]+=decfactor*(int(temp[j])-0x30);
                        }
                     }
                  }
               }
            }
         }
      }
      inf.close();
   }
}
void compileFILElist(apvector <apstring> &FILE, apvector <apstring> &omgnames)
//Args:array for file tags, array of songnames
{
   FILE.resize(omgnames.length());
   ifstream inf;
   inf.open("SongIDs_FILE.txt");

   if(!inf.fail())
   {
      int target=1;
      apstring dummy;
      while(!inf.eof())
      {
         getline(inf,dummy);
         FILE[target]=dummy;
         target++;
      }
   }
   else
   {
      cout<<"FILE tag list not found!\n";
      getch();
   }
   inf.close();
}
void fillmasterlist(apvector <_entry> &masterlist,apstring filename)
//fills master songlist with contents of edited master data bank list.
{
   ifstream inf;
   inf.open(filename.c_str());
   if(inf.fail())
   {
      cout<<"Master file not found.\n";
      return;
   }

   ifstream infc;
   //infc.open("5b.txt");
   infc.open("tabdelimited.txt");
   if(infc.fail())
   {
      cout<<"Comments file not found.\n";
      return;
   }

   apstring dummy;
   for(int w=0; w<3771; w++)
   {
      //masterlist.resize(masterlist.length()+1);
      //int w=masterlist.length()-1;//quickie to last element

      getline(inf,dummy);
      int i=0;

      masterlist[w].position=0;
      while(dummy[i]!='\t')
      {
         masterlist[w].position*=10;
         masterlist[w].position+=int(dummy[i])-0x30;
         i++;
      }
      i++;

      masterlist[w].song="";
      while(dummy[i]!='\t')
      {
         masterlist[w].song+=dummy[i];
         i++;
      }
      i++;

      masterlist[w].ichioshi=false;
      if(dummy[i]=='Y')
      {
         masterlist[w].ichioshi=true;
         i++;
      }
      i++;

      masterlist[w].block=int(dummy[i])-0x30;
      i++;
      i++;

      masterlist[w].author="";
      while(i<dummy.length())
      {
         masterlist[w].author+=dummy[i];
         i++;
      }

      masterlist[w].comment="";
      /*apstring commentdummy;
      for(int p=0; p<3; p++)
         getline(infc,commentdummy);
      for(int p=33; p<commentdummy.length()-14; p++)
         masterlist[w].comment+=commentdummy[p];*/
      apstring commentdummy;
      getline(infc,commentdummy);
      masterlist[w].comment=commentdummy;

      if(w==0)
         masterlist[w].index=101;
      else
      {
         if(masterlist[w].song==masterlist[w-1].song)
            masterlist[w].index=masterlist[w-1].index+1;
         else
            masterlist[w].index=masterlist[w].block*100+1;
      }
   }
}
apstring caps(apstring str)
//returns the all-caps equivalent of string given
//only bumps up lowercase a-z letters
{
   apstring ret=str;
   for(int i=0; i<ret.length(); i++)
      if('a'<=ret[i] && ret[i]<='z')
         ret[i]=char(int(ret[i])-0x20);
   return ret;
}
apstring substring(apstring &str, int index, int step)
//Use: finds a substring of the char-array
//Args: array of char to use, starting index, number of characters to return
//Return: string containing only the requested indices
//Note: if step is zero or negative, the loop should run all the way to the end of the
//string minus that many characters
{
   apstring ret;
   if(step>0)
   {
      for(int i=index; i<index+step; i++)
         ret+=str[i];
   }
   else
   {
      for(int i=index; i<str.length()+step; i++)
         ret+=str[i];
   }
   return ret;
}
