Препроцесор. Розробка програми-препроцеса, що виконує розбір тексту ASM файлу на рівні макросів та условної компіляції, страница 3

               strcpy(m->mp->paramname,buf);   //параметр макроса

               m->mp->next=NULL;    //крнец подсписка

               m->mp1=m->mp;        //текущ эл

               p1++;      }

                    else                //если не 1-й эл

                     {m->mp2=new macroname::macroparam; //новый эл

               strcpy(m->mp2->paramname,buf); //параметр макроса

               m->mp2->next=NULL;      // указ на конец подсписка

               m->mp1->next=m->mp2;    // связывание элементов

               m->mp1=m->mp2;          //текущ эл

                                    }    } }

                      else   //если это не 1-й макрос(элемент) в списке

                 {    if (q==0)      //если 1-й эл в подсписке

                     {       m2=new macroname;

               strcpy(m2->name,buf);   // имя макроса в m2->name

               m2->next=NULL;m1->next=m2                  m1=m2;               q++;      }

//2-й параметр в макросе

                  else    {

     if (p1==0)     //если 1-й эл подсписка

                      { m1->mp=new macroname::macroparam;

                strcpy(m1->mp->paramname,buf); //параметр макроса

                m1->mp->next=NULL;

                m1->mp1=m1->mp; p1++;

                      }     else     {

 m1->mp2=new macroname::macroparam;

                strcpy(m1->mp2->paramname,buf); //параметр макроса

                m1->mp2->next=NULL;

                m1->mp1->next=m1->mp2;   //связь эл

                m1->mp1=m1->mp2;         //текущ эл

                      }    } }

               clearbuf;     j=x=0;

                      if (str[i]!='\n') i++;//если не конец строки, то след-ий эл

                    }    }  } //while

  p++;  //признак: если это 1-й макрос в программе

  p1=0; //признак 1-го элемента списка

}

void LoadMacro(char *str)  //создаёт подсписок macrobuf в котором содержатся команды макроса

   if (p3==0)    // если это 1-й макрос программы

     {   if (p4==0)   //если 1-й элем подсписка

       {      m->mb=new macroname::macrobuf;//созд. нового подсписка с

                strcpy(m->mb->mbuf,str);      //командами в mbuf

                m->mb->next=NULL;

                m->mb1=m->mb;

                p4++;   //признак первого элемента

       }    else        //если не первый эл

       {

                m->mb2=new macroname::macrobuf;

                strcpy(m->mb2->mbuf,str);     //в mbuf команды макроса

                m->mb2->next=NULL;

                m->mb1->next=m->mb2;        //связывание эл-ов

                m->mb1=m->mb2;

       }    }

   else    // если это не 1-й макрос программы

     {      if (p4==0)    //если это 1-й эл подсписка

               {  m2->mb=new macroname::macrobuf;

                 strcpy(m2->mb->mbuf,str);

                 m2->mb->next;  m2->mb1=m2->mb;

                 p4++;        //признак первого элемента

                 m1=m2;}     else             

{  m2->mb2=new macroname::macrobuf;

                 strcpy(m2->mb2->mbuf,str);

                 m2->mb2->next=NULL;

                 m2->mb1->next=m2->mb2;

                 m2->mb1=m2->mb2;  m1=m2;}  }}

void InsertBuf()    //вставка макрорасширения

{   int s=0,s1=0,pr=1,pr1=1;

   char *p,*p1,q[40];

   m1->mb1=m1->mb;

   while (m1->mb1->next!=NULL)

     {     if (pr==0 && pr1==0) fprintf(file_w,"\t%s",m1->mb1->mbuf);

      if (s>0) m1->mb1=m1->mb1->next;

      s1=0;      m1->mp1=m1->mp;