}
my_label:
while(OP_ENDIF!=(opcode=findstr(mnemonics,lexbuf)))
{
fgets(cmdbuf,MAXSTR,F);
strupcase(cmdbuf);
parsep = cmdbuf;
parsep=parse(lexbuf,parsep);
if(OP_ELSE==(opcode=findstr(mnemonics,lexbuf)))
{
my_flag=!my_flag;
goto my_label;
}else
if(OP_ENDIF==(opcode=findstr(mnemonics,lexbuf))) goto my_label;else
if(my_flag) fputs(cmdbuf,F3);
}
goto begin;
}
//‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑
//────────────────────────────────────────────────────────────────────────────
if (parsetyp==PT_LABEL)
{
strcpy(labeltab[k].mnem,lexbuf);
strcpy(labeltab[k].type,sym[0]);
strcpy(labeltab[k].atrib,seg_registr[i]);
labeltab[k].ef_adr=offs;
k++;
if (strconsist("\n",parsep[0]))
{
fprintf(F1,"\t%10d %20s ",number,cmdbuf);
goto begin;
}
goto restart;
}
/* Обработка вызова макроопределения */
if (0 <= (opcode=find_macro(lexbuf)))
{
if (!seg_open_flag)
{
printf("\nline %d:Not open segment",number);
exit(0);
}
cmdidx=opcode;
fprintf(F1,"\t%10i \t%-s",number,cmdbuf);
macrotab[cmdidx].fact_param_count=0;
/* Подсчет количества параметров при вызове*/
while(!strconsist("\n",parsep[0]))
{
parsep=parse(lexbuf,parsep);
if (lexbuf[0]!=',')
{
strcpy (macrotab[cmdidx].fact_param[macrotab[cmdidx].fact_param_count].name,lexbuf);
macrotab[cmdidx].fact_param_count++;
}
}
/* Если количество параметров при вызове не равно количеству
формальных параметров , то ошибка */
if ( macrotab[cmdidx].fact_param_count != macrotab[cmdidx].param_count)
{
printf("\n%i:Wrong call macros %s",source_number,macrotab[opcode].name);
exit(0);
}
cmdbuf[0]=0;
index=0;
/* Подстановка фактических параметров вместо формальных
и формирование тела макроса */
macrogets:
while (index < macrotab[cmdidx].str_count)
{
number++;
fprintf(F1,"");
parsep=macrotab[cmdidx].param[index].buf;
while (!strconsist("\n",parsep[0]))
{
parsep=parse(lexbuf,parsep);
if (0 <= (op1num = find_parametr(lexbuf)))
{
lexbuf[0]=0;
strcpy(lexbuf,macrotab[cmdidx].fact_param[op1num].name );
}
if (lexbuf[0]!=',')
strcat(macrotab[cmdidx].fact_param[index].buf," " );
strcat(macrotab[cmdidx].fact_param[index].buf,lexbuf);
lexbuf[0]=0;
}
strcat(macrotab[cmdidx].fact_param[index].buf,"\n");
strcpy(cmdbuf,macrotab[cmdidx].fact_param[index].buf);
strupcase(cmdbuf);
parsep=cmdbuf;
index++;
goto restart;
}
goto begin;
}
/*Условная компиляция */
if (OP_IFB==(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);
if (lexbuf[0]!='<')
{
printf("line %i:Must be '<'",source_number);
exit(0);
}
/* Проверка на наличие аргумента */
parsep=parse(lexbuf,parsep);
if (lexbuf[0]!='>')
if (parsetyp==PT_WORD)
{
ifgets:
flag=1;
/*Если он есть,то флаг компиляции устанавливаем в 1,
тоесть не компилировать */
while (OP_ENDIF!=(opcode=findstr(mnemonics,lexbuf)))
{
parsep=parse(lexbuf,parsep);
/* Откуда брать строку (с исходного файла или с
тела макроопределения )*/
Уважаемый посетитель!
Чтобы распечатать файл, скачайте его (в формате Word).
Ссылка на скачивание - внизу страницы.