You are on page 1of 12

INDUMATHY.

P
31509205031
TWO PASS MACROPROCESSOR

#include<stdio.h>
#include<stdlib.h>
struct argtab
{
char macro[50];
int st,ft;
}mt[25];
int main()
{
char c,b;
char line[100],ln[100];
char temp[100][100],arg[50][50],word[50][50];
int flag=0,nt=0,at=0,m=-1,n=-1;
int i,j,k,ti,tj,bi;
FILE *fp1,*fp2,*fp3,*fp4,*fp5;
fp1=fopen("macro.txt","r");
fp2=fopen("deftab.txt","w");
fp3=fopen("namtab.txt","w");
fp4=fopen("argtab.txt","w");
fp5=fopen("rm.txt","w");
if(fp1==NULL)

{
printf("File cannot be opened for reading\n");
exit(0);
}
c: while(fgets(line,sizeof line,fp1)!=NULL)
{
i=-1;
ti=-1;
for(j=0;j<100;j++)
strcpy(temp[j]," ");
c=line[++i];
while(c!='\n')
{
if(toascii(c)==46)
goto c;
if((isalpha(c)!=0||isdigit(c)!=0)&&toascii(c)!=94)
{
++ti;
tj=-1;
while(isalpha(c)!=0||isdigit(c)!=0)
{
temp[ti][++tj]=c;
c=line[++i];
}
temp[ti][++tj]='\0';

}
else
c=line[++i];
}
if(strcmp(temp[1],"MACRO")==0)
{
fprintf(fp3,"%s\t%d",temp[0],nt+1);
strcpy(mt[++m].macro,temp[0]);
mt[m].st=nt+1;
for(i=2;i<=ti;i++)
strcpy(arg[i-2],temp[i]);
flag=1;
}
if(flag==1)
{
++nt;
i=-1;
c=line[++i];
while(c!='\n')
{
if(toascii(c)!=38||strcmp(temp[1],"MACRO")==0)
fputc(c,fp2);
else
{
for(k=0;k<=ti;k++)

{
for(j=0;j<3;j++)
{
if(strcmp(temp[k],arg[j])==0)
{
fprintf(fp2,"?%d",j+1);
i=i+strlen(temp[k]);
break;
}
}
}
}
c=line[++i];
}
fprintf(fp2,"\n");
}
if(strcmp(temp[0],"MEND")==0)
{
fprintf(fp3,"\t%d\n",nt);
mt[m].ft=nt;
flag=0;
}
}
fclose(fp1);
fclose(fp2);

fclose(fp3);
fp1=fopen("macro.txt","r");
fp2=fopen("deftab.txt","r");
fp3=fopen("namtab.txt","r");
c=getc(fp2);
printf("PASS 1 OF TWO PASS MACRO PROCESSOR");
printf("\n\n*****DEFTAB*****\n\n");
while(c!=EOF)
{
putchar(c);
c=getc(fp2);
}
c=getc(fp3);
printf("\n\n*****NAMTAB*****\n\n");
while(c!=EOF)
{
putchar(c);
c=getc(fp3);
}
fclose(fp2);
fclose(fp3);
printf("\nDo you want to continue with PASS TWO?Press y or n\t");
scanf("%c",&c);
if(c=='n')
exit(0);

printf("\n\nPASS 2 OF TWO PASS MACRO PROCESSOR");


a: while(fgets(line,sizeof line,fp1)!=NULL)
{
flag=0;
i=-1;
ti=-1;
for(j=0;j<100;j++)
strcpy(temp[j]," ");
c=line[++i];
while(c!='\n')
{
if(toascii(c)==46)
goto a;
if((isalpha(c)!=0||isdigit(c)!=0)&&toascii(c)!=94)
{
++ti;
tj=-1;
while(isalpha(c)!=0||isdigit(c)!=0)
{
temp[ti][++tj]=c;
c=line[++i];
}
temp[ti][++tj]='\0';
}
else

c=line[++i];
}
if(strcmp(temp[1],"MACRO")==0)
{
while(strstr(line,"MEND")==NULL)
fgets(line,sizeof line,fp1);
goto a;
}
for(i=0;i<=m;i++)
{
for(j=0;j<=ti;j++)
{
if(strcmp(mt[i].macro,temp[j])==0&&strcmp(temp[j+1],"MACRO")!=0)
{
flag=1;
fprintf(fp5,".%s",line);
fprintf(fp4,".%s",line);
tj=0;
n=0;
while(j!=ti)
{
strcpy(word[++n],temp[++j]);
fprintf(fp4,"%d\t%s\n",++tj,temp[j]);
}
fp2=fopen("deftab.txt","r");

k=1;
while(k<=mt[i].st)
{
fgets(ln,sizeof ln,fp2);
++k;
}
while(k<mt[i].ft)
{
fgets(ln,sizeof ln,fp2);
bi=0;
b=ln[bi];
while(b!='\n')
{
if(toascii(b)==63)
{
b=ln[++bi];
int n=toascii(b)-48;
fprintf(fp5,"%s",word[n]);
b=ln[++bi];
if(b=='\n')
{
putc(b,fp5);
goto b;
}
}

putc(b,fp5);
b=ln[++bi];
}
putc('\n',fp5);
b: ++k;
}
break;
}
}
}
if(flag==0)
fprintf(fp5,"%s",line);
}
fclose(fp4);
fclose(fp5);
fp4=fopen("argtab.txt","r");
c=getc(fp4);
printf("\n\n*****ARGTAB*****\n\n");
while(c!=EOF)
{
putchar(c);
c=getc(fp4);
}
fp5=fopen("rm.txt","r");
c=getc(fp5);

printf("\n\n*****EXPANDED SOURCE PROGRAM*****\n\n");


while(c!=EOF)
{
putchar(c);
c=getc(fp5);
}
fclose(fp1);
fclose(fp4);
fclose(fp5);
getch();
}
INPUT:
Macro.txt
.First Macro Definition
ADDNUM

MACRO &VAL,&VAL1

LDA

&VAL

ADD

&VAL1

STA

&VAL

MEND
.Second Macro Definition
TEMP2 MACRO &VAL3
ADD

&VAL3

MEND
CLEAR A
CLEAR X

ADDNUM G,H
ADDNUM A,G
TEMP2 C
STA

END
Namtab.txt
ADDNUM

TEMP2 6

Deftab.txt
ADDNUM

MACRO &VAL,&VAL1

LDA ?1
ADD ?2
STA ?1
MEND
TEMP2 MACRO &VAL3
ADD ?1
MEND
Argtab.txt
.

ADDNUM G,H

ADDNUM A,G

TEMP2

OUTPUT:

CLEAR

CLEAR

ADDNUM G,H
LDA

ADD

STA

ADDNUM A,G
LDA

ADD

STA

TEMP2

ADD

STA

END

You might also like