Розробка програми-препроцесора, що виконує розбір тексту (Звіт з лабораторної роботи № 8), страница 2

    if (DIR_MACRO==(opcode=findstr(macrodir,lexbuf)))

    {

      macrotab[idx].param_count=0;

      macrotab[idx].str_count=0;

      while (!strconsist("\n",parsep[0]))

      {

        parsep=parse(lexbuf,parsep);

        if (lexbuf[0]!=',')

        {

          strcpy(macrotab[idx].param[macrotab[idx].param_count].name,lexbuf);

          macrotab[idx].param_count++;

        }

        }

      fprintf(F1,"1\t%10i%39s",number,cmdbuf);

        parsep=parse(macrotab[idx].name,cmdbuf);

      goto read;

    }

    fprintf(F1,"1\t%10i%35s",number,cmdbuf);

      parsep=parse(lexbuf,cmdbuf);

    if (OP_ENDM!=(findstr(macrodir,lexbuf)))

    {

    strcpy(macrotab[idx].param[macrotab[idx].str_count].buf,cmdbuf);

    macrotab[idx].str_count++;

      } else

      {

        idx++;

        cmdbuf[0]=0;

      goto read;

    }

  }

  fprintf(F1,"\n");

}

       /* Поиск имени макроопределения */

 int find_macro (char buf[MAXSTR])

 {

  int index;

  for (index=0; index <= idx; index++)

   if (strcomp (buf,macrotab[index].name))

    return index;

   return -1;

 }

 int find_parametr(char buf[MAXSTR])

 {

  int index;

  for (index=0; index <macrotab[cmdidx].param_count ; index++)

   if (strcomp (buf,macrotab[cmdidx].param[index].name))

    return index;

   return -1;

 }

int find_sym (char buf[MAXSTR])

 {

    int index;

    for (index = 0;index < j; index++)

    if (strcomp (buf,symtab[index].mnem))

     return index;

    return -1;

 }

void main(void)

{

 clrscr();

 int  op1num, op2num, i=0,index=0,k=0;

 int source_number=0;

 int flag=0;

 char codop1;

 char *mybuf;

 int Seg_Begin,Seg_End;

 int seg_open_flag=0;

 F=fopen("text2.asm","r");

 if (F==NULL)

 {

   printf("\nFile not found");

   exit(0);

 }

 F1=fopen("text2.lst","w");

 F3=fopen("$text2.asm","w");

 begin:

 while (!feof(F))

 {

   fgets(cmdbuf,MAXSTR,F);

   number++;

   source_number++;

   strupcase(cmdbuf);

   if(strconsist("\n",cmdbuf[0]))

     goto begin;

   parsep = cmdbuf;

   do{

       restart:

       parsep=parse(lexbuf,parsep);

     /* Обработка директивы include */

     if (0==(opcode=findstr(prepr_dir,lexbuf)))

     {

       parsep=parse(lexbuf,parsep);

       if (NULL==(F2=fopen(lexbuf,"r")))

       {

          printf("\n:unable to not open %s",lexbuf);

          exit(0);

       }

       fprintf (F1,"\t%10i%39s",source_number,cmdbuf);

       macro_def();

       goto begin;

     }   /* Конец обработки */

     if (opcode==1)

     {

        parsep=parse(lexbuf,parsep);

        if (strtoi(lexbuf,&n))

        {

          printf("\nLine%d",number);

          printf(":Bad number");

          exit(0);

        }else

        {

          mybuf="";

          do

          {

            fgets(cmdbuf,MAXSTR,F);

            strupcase(cmdbuf);

            parsep = cmdbuf;

            parsep=parse(lexbuf,parsep);

            if(OP_ENDM!=(opcode=findstr(macrodir,lexbuf)))

            strcat(mybuf,cmdbuf);

          }

          while(OP_ENDM!=(opcode=findstr(macrodir,lexbuf)));

          for(int rep=0;rep<n;rep++)

            fputs(mybuf,F3);

          goto begin;

        }

     }

//────────────────────────────────────────────────────────────────────────────

//­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­

   if (OP_IFNB==(opcode=findstr(mnemonics,lexbuf)))

   {

     if (!seg_open_flag)

     {

       printf("\nline %d:Not open segment",number);

       exit(0);

     }

     fprintf(F1,"\t%10i              \t%-s",number,cmdbuf);

     parsep=parse(lexbuf,parsep);

     int my_flag=0;

     if (lexbuf[0]!='<')

     {

        printf("line %i:Must be '<'",source_number);

        exit(0);

     }

     /* Проверка на наличие аргумента */

     parsep=parse(lexbuf,parsep);

     if (lexbuf[0]!='>')

       if (parsetyp==PT_WORD)

       {

         my_flag=1;

         goto my_label;