Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- /*
- INPUT FILE kk.txt
- macro ddd &a,&b,®=AREG
- lcl &m
- &m set 0
- mover ®,&a
- mend
- start
- MOVER AREG,='2'
- ddd 2,4
- end
- */
- #include<stdio.h>
- #include<conio.h>
- struct pntab{
- char var[15];
- }p1[20];
- struct evntab{
- char var[15];
- }e1[20];
- struct ssntab{
- char lb[15];
- }s1[20];
- struct mnt{
- char mname[20];
- int pp,kp,ev,mdtp,kpdtp,sstp;
- }m1[10];
- struct kptab{
- char var[15],val[15];
- }k1[20];
- struct sstab{
- int lbp;
- }ss1[20];
- struct mdt{
- char stmt[50];
- }mm1[50];
- struct aptab{
- char val[20];
- }a1[20];
- void main()
- {
- int kp=1,sp=1,mp=1,snp=1,pnp=1,evp=1,l=1,ap=1,i,j,k,nl,kl,me,cn,opt,e=0,en,mac,a,z,x,pr;
- char fn[15],str[30],str1[30],str2[50];
- FILE *f1,*f2;
- f1=NULL;
- // printf("\n\nenter the source file name\n\n");
- // scanf("%s",fn);
- // f1=fopen(fn,"rb");
- f1=fopen("kk.txt",rb);
- while(f1==NULL)
- {
- printf("\n\nSuch file not exists\n\n");
- printf("\n\nEnter the valid file name\n\n");
- scanf("%s",fn);
- f1=fopen(fn,"rb");
- }
- while(e==0) //while eof
- {
- i=0;
- do
- {
- str[i]=fgetc(f1);
- if(str[i]==EOF)
- {
- e=1;
- break;
- }
- if(str[i]=='\n'||str[i]=='\r')
- {
- i++;
- break;
- }
- }while(str[i++]!=' ');
- i--;
- str[i]='\0';
- if(strcmp(str,"START")==NULL) //if start kw appears
- {e=1;
- break;}
- if(!strcmp(str,"macro")||!strcmp(str,"MACRO")) //if a macro kw
- {
- i=0;
- do
- {
- str[i]=fgetc(f1);
- if(str[i]=='\n'||str[i]=='\r')
- {
- i++;
- break;
- }
- if(str[i]==EOF)
- {
- i++;
- e=1;
- break;
- } //name of macro
- }while(str[i++]!=' ');
- i--;
- str[i]='\0';
- strcpy(m1[l].mname,str);
- nl=0;
- while(nl==0)
- {
- i=0;
- //nl=0;
- kl=0;
- do
- {
- // if(kl==0)
- str[i]=fgetc(f1);
- // else
- // str1[i]=fgetc(f1);
- if(str[i]=='\n'||str[i]=='\r') //parameters of macro
- {
- nl=1;
- i++;
- break;
- }
- if(str[i]==EOF) //updating mnt
- {
- i++;
- e=1;
- break;
- }
- if(str[i]=='=')
- {
- // str[i-1]='\0';
- i++;
- kl=1;
- break;
- }
- if(str[i]=='&')
- { i--;
- continue;
- }
- }while(str[i++]!=',');
- i--;
- str[i]='\0';
- if(kl==1)
- {
- i=0;
- do
- {
- // if(kl==0)
- // str[i]=fgetc(f1);
- // else
- str1[i]=fgetc(f1);
- if(str1[i]=='\n'||str1[i]=='\r') //parameters of macro
- {
- nl=1;
- i++;
- break;
- }
- if(str[i]==EOF) //updating mnt
- {
- i++;
- e=1;
- break;
- }
- }while(str[i++]!=',');
- i--;
- str1[i]='\0';
- }
- if(kl==0)
- {
- strcpy(p1[pnp++].var,str);
- m1[l].pp++;
- }
- m1[l].kpdtp=kp;
- if(kl==1)
- {
- strcpy(k1[kp].var,str);
- strcpy(k1[kp++].val,str1);
- strcpy(p1[pnp++].var,str);
- m1[l].kp++;
- }
- m1[l].mdtp=mp;
- m1[l].ev=0;
- m1[l].sstp=sp;
- } //while(nl==0)
- str[i]=fgetc(f1); //processing macro stmt
- me=1;
- i=0;
- do
- {
- str[i]=fgetc(f1); //processing macro stmt
- if(str[i]==EOF)
- {
- e=1;
- break;
- }
- if(str[i]=='\n'||str[i]=='\r')
- {
- i++;
- break;
- }
- }while(str[i++]!=' ');
- i--;
- str[i]='\0';
- if(strcmp(str,"mend")==0||strcmp(str,"MEND")==0)
- me=0;
- while(me==1)
- {
- i=0;
- do
- {
- str1[i]=fgetc(f1);
- if(str1[i]==EOF)
- {
- e=1;
- break;
- }
- if(str1[i]=='\n'||str1[i]=='\r')
- {
- i++;
- break;
- }
- }while(str1[i++]!=' ');
- i--;
- str1[i]='\0';
- if(strcmp(str,"LCL")==0||strcmp(str,"lcl")==0) //if lcl stmt
- {
- for (i=0;i<strlen(str);i++)
- str1[i]=str1[i+1];
- strcpy(e1[evp++].var,str1);
- m1[l].ev++;
- sprintf(str2,"LCL (E,%d)",evp);
- strcpy();
- }
- else if(strcmp(str1,"set")==0||strcmp(str1,"SET")==0) //if set stmt
- {
- for (i=0;i<strlen(str);i++)
- str[i]=str[i+1];
- for (i=1;i<evp;i++)
- {
- if(strcmp(e1[i].var,str)==0)
- break;
- }
- j=i;
- // str1[i]=fgetc(f1);
- i=0;
- do
- {
- str1[i]=fgetc(f1);
- if(str1[i]==EOF)
- {
- e=1;
- break;
- }
- if(str1[i]=='\n'||str1[i]=='\r')
- {
- i++;
- break;
- }
- }while(str1[i++]!=' ');
- i--;
- str1[i]='\0';
- sprintf(str2,"(E,%d) SET ",j);
- cn=1;
- opt=1;
- if(str1[0]=='&')
- while(opt==1)
- {
- k=0;
- for(;str1[cn]!='+'&&str1[cn]!='\n';cn++)
- {
- str[k]=str1[cn];
- k++;
- }
- if(str1[cn]=='+')
- opt=1;
- else
- opt=2;
- if(str[0]=='&')
- {
- for (i=0;i<strlen(str);i++)
- str[i]=str[i+1];
- for (i=1;i<evp;i++)
- {
- if(strcmp(e1[i].var,str)==0)
- break;
- }
- if(opt==1)
- sprintf(str,"(E,%d)+",i);
- if(opt==2)
- sprintf(str,"(E,%d)",i);
- strcat(str2,str);
- }
- else
- {
- i=atoi(str);
- if(opt==1)
- sprintf(str,"%d+",i);
- if(opt==2)
- sprintf(str,"%d",i);
- strcat(str2,str);
- }
- }
- else
- {
- strcat(str2,str1);
- }
- } //end of set processing
- else if(strcmp(str,"AIF")==0||strcmp(str,"aif")==0||strcmp(str,"AGO")==0||strcmp(str,"ago")==0)
- {
- } //aif or ago stmt
- else
- {
- sprintf(str2,"%s ",strupr(str));
- cn=1;
- while(opt==1)
- {
- for(i=0;str1[cn]!=','&&str1[cn]!='\0';i++,cn++)
- str[i]=str1[cn];
- if(str1[cn++]==',')
- opt=1;
- else
- opt=2;
- cn++;
- str[i]='\0';
- for(i=1;i<pnp;i++)
- if(strcmp(str,p1[i].var)==0)
- break;
- if(opt==1)
- sprintf(str,"(P,%d),",i);
- if(opt==2)
- sprintf(str,"(P,%d)",i);
- strcat(str2,str);
- }
- }
- strcpy(mm1[mp++].stmt,str2);
- str[i]=fgetc(f1); //processing macro stmt
- i=0;
- do
- {
- str[i]=fgetc(f1); //processing macro stmt
- if(str[i]==EOF)
- {
- e=1;
- break;
- }
- if(str[i]=='\n'||str[i]=='\r')
- {
- i++;
- break;
- }
- }while(str[i++]!=' ');
- i--;
- str[i]='\0';
- if(strcmp(str,"mend")==0||strcmp(str,"MEND")==0)
- {
- l++;
- me=0;
- }
- } //while(me==1)
- } //if macro stmt
- } //while(e=0)
- fclose(f1);
- f1=fopen(fn,"rb");
- while(strcmp(strupr(str),"START")!=0)
- {
- while(str[i]!='\n')
- str[i]=fgetc(f1);
- i=0;
- do
- {
- str[i]=fgetc(f1);
- if(str[i]==EOF)
- {
- e=1;
- break;
- }
- if(str[i]=='\n'||str[i]=='\r')
- {
- i++;
- break;
- }
- }while(str[i++]!=' ');
- i--;
- str[i]='\0';
- }
- f2=fopen("kkm.txt","w");
- i=0;
- str1[i]=fgetc(f1);
- if(str1[i++]==' ')
- {
- do
- {
- str1[i]=fgetc(f1);
- if(str[i]==EOF)
- {
- e=1;
- break;
- }
- if(str1[i]=='\n'||str1[i]=='\r')
- {
- i++;
- break;
- }
- }while(str1[i++]!=' ');
- i--;
- str1[i]='\0';
- fprintf(f2,"%s %s\n",str,str1);
- }
- else
- fprintf(f2,"%s\n",str);
- e=0;
- en=0;
- while(e==0&&en==0)
- {
- mac=0;
- i=0;
- while(mac!=1&&e!=1)
- {
- /* while(str[i]!='\n'&&str1[0]!='\n')
- {
- str[i]=fgetc(f1);
- if(str[i]!='\r')
- fprintf(f2,"%c",str[i]);
- } */
- str1[0]='t';
- i=0;
- pr=0;
- do
- {
- str[i]=fgetc(f1);
- //if(str[i]!='\r')
- // fprintf(f2,"%c",str[i]);
- if(str[i]==EOF)
- { i++;
- e=1;
- break;
- }
- if(str[i]=='\n'||str[i]=='\r')
- {
- pr=1;
- i++;
- break;
- }
- }while(str[i++]!=' ');
- i--;
- str[i]='\0';
- for(j=1;j<l;j++)
- if(strcmp(m1[j].mname,str)==0)
- {
- mac=1;
- goto zzz;
- }
- if(strcmp(strupr(str),"END")==0)
- {
- for(i=1;i<evp;i++)
- fprintf(f2,"%s DC 0\n",e1[i].var);
- fprintf(f2,"%s\n",str);
- if(e==1)
- {
- fclose(f2);
- fclose(f1);
- exit(0);
- }
- }
- if(pr==0)
- fprintf(f2,"%s ",str);
- else
- {
- fprintf(f2,"%s\n",str);
- str[i]=fgetc(f1);}
- }
- zzz: if(e==1)
- exit(0);
- // j--;
- i=0;
- do
- {
- str1[i]=fgetc(f1);
- if(str1[i]==EOF)
- {
- e=1;
- break;
- }
- if(str1[i]==',')
- {
- str1[i]='\0';
- if(str1[0]>='0'&&str1[0]<='9')
- {
- str1[i+3]='\0';
- str1[i+2]=39;
- for(x=i+1;x>1;x--)
- str1[x]=str1[x-2];
- str1[0]='=';
- str1[1]=39;
- }
- strcpy(a1[ap++].val,str1);
- i=0;
- continue;
- }
- else if(str1[i]=='\r')
- {
- str1[i]='\0';
- if(str1[0]>='0'&&str1[0]<='9')
- {
- str1[i+3]='\0';
- str1[i+2]=39;
- for(x=i+1;x>1;x--)
- str1[x]=str1[x-2];
- str1[0]='=';
- str1[1]=39;
- }
- strcpy(a1[ap++].val,str1);
- str1[i]=fgetc(f1);
- break;
- }
- i++;
- }while(str1[i]!='\n'&&str1[i]!='\r');
- if(ap<pnp)
- {
- for(i=1;i<kp;i++)
- strcpy(a1[ap++].val,k1[i].val);
- }
- if(j<l-1)
- k=m1[j+1].mdtp;
- else
- k=mp;
- for(a=m1[j].mdtp;a<k;a++)
- {
- i=0;
- z=0;
- while(mm1[a].stmt[z]!=' ')
- str[i++]=mm1[a].stmt[z++];
- str[i]='\0';
- z++;
- i=0;
- while(mm1[a].stmt[z]!='\0'&&mm1[a].stmt[z]!=' ')
- str1[i++]=mm1[a].stmt[z++];
- str1[i]='\0';
- if(mm1[a].stmt[z]=='\0')
- nl=0;
- else
- nl=1;
- if(strcmp(str,"LCL")==0) //if lcl stmt
- {
- continue;
- /* for(i=3;str[i]!=')';i++)
- str[i-3]=str[i];
- str[i-3]='\0';
- z=atoi(str);
- strcpy(str,e1[z].var);
- for (i=0;i<strlen(str);i++)
- str1[i]=str1[i+1];
- strcpy(e1[evp++].var,str1);
- m1[l].ev++;
- sprintf(str2,"LCL (E,%d)",evp);
- strcpy();*/
- }
- else if(strcmp(str1,"SET")==0) //if set stmt
- {
- for(i=3;str[i]!=')';i++)
- str[i-3]=str[i];
- str[i-3]='\0';
- i=atoi(str);
- strcpy(str,e1[i].var);
- i=0;
- z++;
- while(mm1[a].stmt[z]!='\0')
- str1[i++]=mm1[a].stmt[z++];
- str1[i]='\0';
- z=atoi(str1);
- fprintf(f2,"MOVER AREG,='%d'\nMOVEM AREG,%s\n",z,str);
- } //end of set processing
- // else if(strcmp(str,"AIF")==0||strcmp(str,"aif")==0||strcmp(str,"AGO")==0||strcmp(str,"ago")==0)
- // {
- // } //aif or ago stmt
- else
- {
- fprintf(f2,"%s ",strupr(str));
- i=0;
- while(str1[i]!='\0')
- {
- if(str1[i]=='('&&str1[i+1]=='E')
- {
- i+=3;
- k=0;
- while(str1[i]!=')')
- str[k++]=str1[i++];
- str[k]='\0';
- k=atoi(str);
- fprintf(f2,"%s",e1[k].var);
- i++;
- if(str1[i]==',')
- {
- fprintf(f2,",");
- i++;
- }
- if(str1[i]=='\0')
- fprintf(f2,"\n");
- }
- else if(str1[i]=='('&&str1[i+1]=='P')
- {
- i+=3;
- k=0;
- while(str1[i]!=')')
- str[k++]=str1[i++];
- str[k]='\0';
- k=atoi(str);
- fprintf(f2,"%s",a1[k].val);
- i++;
- if(str1[i]==',')
- {
- fprintf(f2,",");
- i++;
- }
- if(str1[i]=='\0')
- fprintf(f2,"\n");
- }
- else
- {
- k=0;
- while(str1[i]!='\0'||str1[i]!=',')
- str[k++]=str1[i++];
- str[k]='\0';
- fprintf(f2,"%s",strupr(str));
- if(str1[i]==',')
- {
- fprintf(f2,",");
- i++;
- }
- if(str1[i]=='\0')
- fprintf(f2,"\n");
- }
- }
- }
- } //macro expansion for(a=m1[j].mdtp;a<k;a++)
- } //while(e==0||en==0)
- }
- //main
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement