Tuesday, 9 June 2015

Program simulate the working of Pre-Processor



Code for Program simulate the working of Pre-Processor in C++ Programming



 



 
#include <iostream.h>
 #include <fstream.h>
 #include <string.h>
 #include <stdlib.h>
 #include <stdio.h>
 #include <conio.h>
 #include <ctype.h>
 #include <dos.h>

 void find_and_replace(char*,constchar[3][100]);

 int main( )
    {
       clrscr( );
       textmode(C4350);

       char FileName[15]={NULL};

       cout<<"\n Enter the file name : ";
       cin>>FileName;

       cout<<"\n\n Please wait while processing the file ...";

       fstream iFile;
       fstream oFile;

       iFile.open(FileName,ios::in|ios::nocreate);

       if(!iFile)
      {
         cout<<" \n Fatal Error : Unable to open the source file.";
         cout<<"\n\n press any key to exit...";

         getch( );
         exit(1);
      }

       oFile.open("~temp.cpp",ios::out|ios::trunc);

       if(!oFile)
      {
         cout<<" \n Fatal Error : Unable to create a temp file.";
         cout<<"\n\n press any key to exit...";

         getch( );
         exit(1);
      }

       char CodeLine[100]={NULL};
       char Macros[10][3][100]={NULL};

       int macro_counter=0;

       do
      {
         strset(CodeLine,NULL);

         iFile.getline(CodeLine,90);

         if(strstr(CodeLine,"#include ")!=NULL)
        {
           char HeaderFile[15]={NULL};

           int length=strlen(CodeLine);

           for(int i=11;i<(length-1);i++)
              HeaderFile[(i-11)]=CodeLine[i];

           fstream File;

           File.open(HeaderFile,ios::nocreate|ios::in);

           if(!File)
              {
             char Temp[30]={NULL};

             strcpy(Temp,"..\\include\\");
             strcat(Temp,HeaderFile);

             File.open(Temp,ios::nocreate|ios::in);

             if(!File)
                {
                   cout<<" \n Fatal Error : Unable to open the Header file.";
                   cout<<"\n\n press any key to exit...";

                   getch( );
                   exit(1);
                }
              }

           do
              {
             strset(CodeLine,NULL);

             File.getline(CodeLine,90);
             oFile<<CodeLine<<endl;
              }
           while(!File.eof( ));

           File.close( );
        }

         else if(strstr(CodeLine,"#define ")!=NULL)
        {
           char Macro[100]={NULL};

           int length=strlen(CodeLine);

           for(int j=9;j<length;j++)
              Macro[(j-9)]=CodeLine[j];

           char *Ptr=NULL;

           Ptr=strtok(Macro,"");
           strcpy(Macros[macro_counter][0],Ptr);
           Ptr=strtok(NULL,"\n");
           strcpy(Macros[macro_counter][1],Ptr);

           if(strstr(Macros[macro_counter][0],"(")!=NULL)
              {
             Ptr=strtok(Macros[macro_counter][0],"(");
             strcpy(Macros[macro_counter][0],Ptr);

             Ptr=strtok(NULL,")");
             strcpy(Macros[macro_counter][2],Ptr);
              }

           macro_counter++;
        }

         else
        {
           for(int k=0;k<macro_counter;k++)
              {
             if(strstr(CodeLine,Macros[k][0])!=NULL)
                find_and_replace(CodeLine,Macros[k]);
              }

           oFile<<CodeLine<<endl;
        }
      }
       while(!iFile.eof( ));

       oFile.close( );
       iFile.close( );

       delay(1000);

       cout<<"\n\n\n press any key to see the modified code ...";
       getch( );

       iFile.open("~temp.cpp",ios::in|ios::nocreate);

       if(!iFile)
      {
         cout<<" \n Fatal Error : Unable to open the modified source file.";
         cout<<"\n\n press any key to exit...";

         getch( );
         exit(1);
      }

       clrscr( );

       int line_counter=0;

       do
      {
         strset(CodeLine,NULL);
         iFile.getline(CodeLine,90);

         cout<<CodeLine<<endl;
         line_counter++;

         if(line_counter==45)
        {
           line_counter=0;

           gotoxy(1,49);
           cout<<"Press any key to continue...";

           getch( );
           clrscr( );
        }
      }
       while(!iFile.eof( ));

       iFile.close( );

       cout<<"\n\n Press any ke to exit...";

       remove("~temp.cpp");

       getch( );
       return 0;
    }


 /*************************************************************************///------------------------  find_and_replace( )  ------------------------///*************************************************************************/void find_and_replace(char* Text,constchar Macro[3][100])
    {
       char Temp[100]={NULL};
       char Find[100]={NULL};
       char Replace[100]={NULL};
       char Parameter[100]={NULL};

       strcpy(Find,Macro[0]);
       strcpy(Replace,Macro[1]);
       strcpy(Parameter,Macro[2]);

       int text_length=strlen(Text);
       int find_length=strlen(Find);
       int replace_length=strlen(Replace);
       int find_position;

       char *Ptr;

       strcpy(Temp,Text);

       Search:

       Ptr=strstr(Temp,Find);

       find_position=(strlen(Text)-strlen(Ptr));

       if(Ptr==NULL)
      goto Skip;

       if(isalpha(Ptr[-1]) || isalpha(Ptr[find_length]))
      {
         if(strlen(Ptr)>2)
        Ptr++;

         elsegoto Skip;

         strcpy(Temp,Ptr);

         goto Search;
      }

       else
      {
         strset(Temp,NULL);

         for(int i=0;i<find_position;i++)
        Temp[i]=Text[i];

         int k=(find_position+find_length);

         if(Text[k]=='(')
        {
           int index=0;
           int brackets=1;

           char Argument[50]={NULL};

           do
              {
             k++;
             Argument[index]=Text[k];
             index++;

             if(Text[(k+1)]==')')
                brackets--;

             elseif(Text[(k+1)]=='(')
                brackets++;
              }
           while(brackets!=0);

           k+=2;

           char ReplaceWith[3][100]={NULL};

           strcpy(ReplaceWith[0],Parameter);
           strcpy(ReplaceWith[1],Argument);

           find_and_replace(Replace,ReplaceWith);
        }

         for(int j=0;j<replace_length;j++,i++)
        Temp[i]=Replace[j];

         for(;k<text_length;k++,i++)
        Temp[i]=Text[k];

         strset(Text,NULL);
         strcpy(Text,Temp);

         goto Search;
      }

       Skip:
    }

No comments:

Post a Comment