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

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

                   fgets(str,40,file_r); //чтение след. команды макроса

                   f++;    //счетчик команд в макросе

                  }

       while (!strstr(str,"ENDM")); //пока не конец макроса

                    }          }

   if (feof(file_r))     { p3=p4=0; }

   fclose(file_r);   openf;

   while (!feof(file_r))     //открытие для INCLUDE и IF

    {         fgets(str,40,file_r);

                if (strstr(str,"INCLUDE")) //проверка на содержание include-файла

   {               fprintf(file_w,"%s\0",str);

                    FileReading(str); //копир. include-ф. в выходной file_w(.lst)

                    fgets(str,40,file_r); //след строка

                  }

                if (strstr(str,"IF "))  //если есть условная директива

                  {     fprintf(file_w,str); //вывод строки с условной директивой

                    AnalisIF(str) ;//определение выполняется ли условная директива

                    ObrIF();  //если да, то чтение команд и запись их в выходной ф.

                    fgets(str,40,file_r);

                  } m1=m;     //установка указателя на начало списка с макросами

                int d=0;  //еслт это 1-й эл списка макросов

                if (l==0) {

                  fprintf(file_w,"\n");   l++;  }

 fprintf(file_w,"%s",str);    // запись в .lst-файл

 while (m1->next!=NULL)   //перебор списка макросов

                  {    if (d>0) m1=m1->next;

                   if (strstr(str,m1->name) && !strstr(str,"MACRO") && !strstr(str,"ENDM"))

                      {   //если это место для вставки макрорасширения, а не определение макроса

                SetParam(str);    //запись фактич-их параметров макроса

                p3++;                   p4=0;    InsertBuf();      //вставка макрорасширения

                               break;

                      }    d++;   }    }

  m1=m;  int er=0;

  while (m1->next!=NULL)  //освобожд памяти

    {      if (er>0) m1=m1->next;

      delete m1;      er++;    }

  fclose(file_r);  fclose(file_w); return 0;}

void MacroTab(char *str) //записывает в список имена макросов и создает подсписок с параметрами этоих макросов

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

  clearbuf;

  while (str[i]!='\n')          //пока не конец строки

     { if (j>0) i++;

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

                {   i++;  continue; }

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

                {    buf[x++]=str[i];   //копир. строки до пробела в buf[]

                   j++;    }

       else  {

                   if (strcmp(buf,"MACRO")==0) //если в buf[] записано MACRO

  { //то переходим к записи форм. параметров

                              clearbuf; j=x=0;      }

    else//иначе, если в buf[] имя макроса

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

                               {   // (или элемент в списке)

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

                  {     m=new macroname;    //созд. нового элем списка

                    strcpy(m->name,buf); //запись в список имени макроса

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

                    m1=m;                //текущ эл

                    q++;     }

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

                  else    {

                    if (p1==0)           //если первый эл подсписка

                     {       m->mp=new macroname::macroparam;//новый эл подсписка