WAP to perform macro expansion


#include<stdio.h>
#include<conio.h>
void main()
{
      char words[25][25];
      char str[25],ch;
      int i,j,w=0,m=0,flag=0;
      char macro[10][25];
      char val[10][25];
      long l;
      FILE *fp,*fp1;
      fp=fopen("text.c","r");
      fp1=fopen("temp.c","w");
      clrscr();
      printf("\n File: text.c before MACRO EXPANSION\n\n");
      if(fp!=NULL)
      {
                  do
                  {
                              j=0;
                              ch='d';
                              strcpy(str,"");
                              while(ch!=' ')
                              {
                                          ch=getc(fp);
                                          printf("%c",ch);
                                          if(ch==EOF) break;
                                          putc(ch,fp1);

                                          str[j]=ch;
                              if(ch!=' '&&ch!='\n'&&ch!=';'&&ch!='='&&ch!='+')
                                          j++;
                                          if(ch==' '||ch=='\n') break;
                                          if(ch==';'||ch=='='||ch=='+') break;
                              }
                              str[j]='\0';
                              strcpy(words[w++],str);
                              j=0;
                  }while(ch!=EOF);
      }


      for(i=0;i<w;i++)
      {
                  if(!strcmp(words[i],"#define"))
                  {
                              strcpy(macro[m++],words[++i]);
                  }
      }



      for(i=0;i<w;i++)
      {
                  if(!strcmp(words[i],"main()"))
                  break;
                  for(j=0;j<m;j++)
                  {
                              if(!strcmp(words[i],macro[j]))
                              {
                                          strcpy(val[j],words[++i]);
                              }
                  }
      }


      fclose(fp);
      fclose(fp1);
      fp=fopen("text.c","w");
      fp1=fopen("temp.c","r");
      if(fp1!=NULL)
      {
                  do
                  {
                              j=0;
                              ch='d';
                              strcpy(str,"");
                              while(ch!=' ')
                              {
                                          ch=getc(fp1);
                                          if(ch==EOF) break;
                                          putc(ch,fp);
                                          str[j]=ch;

                              if(ch!=' '&&ch!='\n'&&ch!=';'&&ch!='='&&ch!='+')
                                          j++;
                                          if(ch==' '||ch=='\n') break;
                                          if(ch==';'||ch=='='||ch=='+') break;
                              }
                              str[j]='\0';
                              if(flag)
                              {
                                          for(i=0;i<m;i++)
                                          {
                                                      if(!strcmp(str,macro[i]))
                                                      {
                                                                  l=strlen(str);
                                                                  fseek(fp,-(1*l+1),SEEK_CUR);
                                                                  fputs(val[i],fp);
                                                      }//if
                                          }//for
                              }//if-flag

                              if(ch==';')
                              putc(ch,fp);

                              if(!strcmp(str,"main()"))
                              flag=1;
                              j=0;
                  }while(ch!=EOF);
      }

      fclose(fp);
      fclose(fp1);
      fp=fopen("text.c","r");
      printf("\n\n\n File: text.c after MACRO EXPANSION\n\n");
      if(fp!=NULL)
      {
                  do
                  {
                              ch=getc(fp);
                              printf("%c",ch);
                  }while(ch!=EOF);
      }
      fclose(fp);
      getch();
}

Post a Comment

0 Comments