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

      m1->np1=m1->np;     pr1=pr=0;

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

               {  if (s1>0)

                  {     m1->mp1=m1->mp1->next;

                    m1->np1=m1->np1->next;

                  }  pr=0;

                 if (strstr(m1->mb1->mbuf,m1->mp1->paramname))

                   {      strcpy(q,m1->mb1->mbuf);

                     p1=p=strtok(q,m1->mp1->paramname);

                     p1=strtok(NULL,m1->mp1->paramname);

pr1=pr=fprintf(file_w,"\t%s%s%s\0",p,m1->np1->name,p1);

                   }

                 s1++;   }     s++;    }

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

void MakeList(char **argv) //добавляет .lst к имени файла и запись в nam[1]

{  char buf[4]=".lst";

int i=0,a=0,k=0;

  strcpy(nam[1],argv[1]);

  while (a!=4)

   {    if (nam[1][i]!='.' && a==0) i++;

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

               a++;   }  }}

void SetParam(char *str) //созд. подсписка namparam фактических параметров макроса

{  int i=0,x=0,j=0;  char buf[10];

   clearbuf;

   while (str[i]!='\n')

    {   if (j>0) i++;

      if (str[i]=='\t')               {

                 clearbuf;  i++;  j=x=0;  continue;}

      if (str[i]==' '||str[i]==','&&buf[0]==0||str[i]==' '&&buf[0]!=0)

               {  clearbuf;  i++;  j=x=0;  continue;             }

      if (str[i]!=' ' && str[i]!='\n' && str[i]!=',')

               {  buf[x++]=str[i];   //копир. в buf

                 j++;}

      else   {

                if (p3==0)  {

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

   {       m->np=new macroname::namparam;

       strcpy(m->np->name,buf);  //имена фактических параметров макроса

       m->np->next=NULL;

       m->np1=m->np;       p4++;

       clearbuf;       j=x=0;     }

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

                    {       m->np2=new macroname::namparam;

       strcpy(m->np2->name,buf); //фактические параметры макроса

       m->np2->next=NULL;

       m->np1->next=m->np2;   //связь элементов

       m->np1=m->np2;   clearbuf;   j=x=0; } }

    else {  if (p4==0)       //если 1-й эл

    {   m2->np=new macroname::namparam;

       strcpy(m2->np->name,buf);

       m2->np->next;

       m2->np1=m2->np;    p4++;

       m1=m2;   clearbuf;  j=x=0;  }

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

    {      m2->np2=new macroname::namparam;

       strcpy(m2->np2->name,buf);

       m2->np2->next=NULL;

       m2->np1->next=m2->np2;

       m2->np1=m2->np2;

       m1=m2;   clearbuf;   j=x=0; } } } }}

void FileReading(char *str) //опред имени подкл. ф. и копирование его в выходной ф. file_w

{   char *p,st[80];   FILE *incl;

   p=strtok(str,"\n");            //определяет имя include-файла

   p=strtok(NULL,strtok(p," "));  //пропуская "include" и читая само имя

   if ((incl = fopen(p, "rt"))== NULL)

     { fprintf(file_w,"%s '%s'\n","Cannot open input file",p);

                exit(0);     }

   while (!feof(incl))      //копир. подкл. файла incl в выходной ф. file_w

  { fgets(st,40,incl); fprintf(file_w,"%s\0",st);   }

  fclose(incl);}

void LoadEqu(char *str)    //запись в список имён констант equ и их значений

{   char *p,*pa;         //str="a equ 5"

   p=pa=strtok(str," ");   //p=pa="a"

   pa=strtok(NULL,strtok(NULL," ")); //pa="15"

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

     {   eq=new equ;             //новый эл

       strcpy(eq->name,p);     //запись в список имени eq->name=p