/* $Id: kod.c,v 1.1 2002/12/31 00:38:13 batonik Exp $ */ #include #include "zmienne.h" #include "lista.h" #include "funkcje.h" #include "serr.h" #include "kod.h" #include "dane.h" Lista *listaRozkazow = NULL; Lista *DodajRozkaz (ulint rozkaz, char jest, Lista *etykLink) { Lista nowyRozkaz; nowyRozkaz.dane.rozkaz = rozkaz; nowyRozkaz.adres = numerInstrukcji++; nowyRozkaz.jestAdres = jest; nowyRozkaz.nrLinii = numerLinii; nowyRozkaz.nastElem = NULL; if (!jest) { nowyRozkaz.link = etykLink; } return (DodajDoListy(&listaRozkazow, nowyRozkaz)); } void UsunRozkazy() { UsunListe(&listaRozkazow, 0); } int _ZapiszRozkaz (FILE *plik, ulint rozkaz) { int wynik; wynik = fprintf(plik, "%c%c%c%c", WORD_4B(rozkaz), WORD_3B(rozkaz), WORD_2B(rozkaz), WORD_1B(rozkaz)); if (wynik <= 0) { yyerror(E_IOCODE); return(1); } return(0); } int ZapiszRozkazyDoPliku(FILE *wyjscie) { Lista *aktRozkaz = listaRozkazow, *etyk; ulint rozkaz, adres; if (aktRozkaz == NULL) return(1); while (aktRozkaz) { if (aktRozkaz->jestAdres) { if (_ZapiszRozkaz(wyjscie, aktRozkaz->dane.rozkaz)) return(1); } else { etyk = aktRozkaz->link; if (!etyk) return(-1); if (etyk->jestAdres == NIE) { numerLinii = aktRozkaz->nrLinii; yyerror(E_NOLABEL); return(1); } //zmieniamy słowo kodowe uwzględniając adres rozkaz = aktRozkaz->dane.rozkaz; adres = etyk->adres; } aktRozkaz = aktRozkaz->nastElem; } return(0); }