Асемблери. Принципи написання та функціонування компіляторів програм, страница 3

                      if (flag==0 && buf[0]!=0 && gd==0) {

                                 if (segsearch(buf)==1) {

                                    gd++; } }

                    if (flag==0 && buf[0]!=0 && gd==0) {

                                  int er=2;error(er,buf,str);

                                  break; }

                      if (flag==1 && buf[0]!=0) {

                                 cmp(buf,str);

                                 b++;   if (b>2)  { b=0;break; }

                                 if (f1==12)  { f1=0;break; }}

                      if (flag==2) {

                                 AnalizDir(buf,str,dir);break; }

                                 clearbuf; zt=0;gd=0;

                  } } }

       timedat(); NamePrint();

  fclose(file_r); fclose(file_w); }

return 0;

}

char MakeList(char **argv)  //замена .asm или др. в argv[1] на .lst

{

   char buf[4]=".lst";

   int i=0,a=0,k=0;      //счетчики

   strcpy(oldname,argv[1]);

      while (a!=4){

               if (argv[1][i]!='.' && a==0)

                                   argv[1][i++];

                    else {     argv[1][i++]=buf[k++];

                                  a++; }    }

     return **argv;  }

void AnalizDir(char *buf,char *str,char *dir[6])

{

   int sw,w;

for (int i=1;i<7;i++) { //поиск директивы с dir[]

if (strcmp(buf,dir[i])==0) {

   //выбор директивы

               if (i==1) {

                    sw=6;print(sw,str,k1,w);     break; }

       if (i==2) {

                    AnalizEnd(str);

                    sw=8;print(sw,str,k1,w);     break; }

       if (i==3) {

                     if (xc==0) {

                     if (strcmp(n1->type,"dw")==0) {

                                  disp+=sizeof(dw); }

                     else

                               disp+=sizeof(db);

                               xc++;  }

                     sw=9; print (sw,str,k1,w);   break; }

       if (i==4) {

                    sw=10; print(sw,str,k1,w);   break; }

       if (i==5 || i==6) {

                    sw=7; print(sw,str,k1,w);

                    if (ret->next!=NULL) ret=ret->next;

 if (qw->next!=NULL) qw=qw->next; break; }

                    } } }

namek *LoadName(char *str)

{

  int r=0;  char s,buf[9];  int i=0,z=0; //счетчики

  clearbuf; s=0;

  while (s!='\n') {

    s=str[i]; if (s!=' ' && s!='\t' && s!='\n') {

               buf[z]=s;

               z++;

     }

    else {     if (buf[0]!=0) {

                    if (as==0) {  //указывает, тот же ли это элем списка,  если не 0, то созд. нового

               if (r==0) { n=new namek; r++; } //r=0,

                  //если это новый элем списка

     //запись в список n имени перем(case 0:),

     // ее типа(case 1:) и значения(case 2:)

                    switch (y++) {

               case 0: strcpy(n->name,buf);               break;

               case 1: strcpy(n->type,buf);

                              n->smesh=0;break;

               case 2:

               n->chislo=atoi(buf); //перевод с char в int

               n->next=NULL;

               n1=n; // указатель на текущий эл списка

               r=0;         break;      } }

               else {

                  if (r==0) {

                  proverka(buf,str);

                  n2=new namek;r++; }

                    switch (y++) {

               case 0: strcpy(n2->name,buf);break;

               case 1: strcpy(n2->type,buf);

                  if (strcmp(n1->type,"dw")==0) {

                 n2->smesh=sizeof(dw)+n1->smesh; }

    else  n2->smesh=sizeof(db)+n1->smesh;  break;

               case 2:

                              n2->chislo=atoi(buf);

                              n2->next=NULL;

               n1->next=n2; //связать элементы списка

                              n1=n2;  //n1 - текущий эл

                                             r=0;break;      } }

                              z=0;

                     if (s=='\n') break;

                     else clearbuf;

                   } } i++;

 }