#include "stek.h" int main(int argc, char **argv) { /* Na pocetku, stek je prazan i etikete su uparene jer nijedna jos nije procitana. */ Cvor *vrh = NULL; char etiketa[MAX]; int tip; int uparene = 1; FILE *f = NULL; /* Ime datoteke se preuzima iz komandne linije. */ if (argc < 2) { fprintf(stderr, "Greska:"); fprintf(stderr, "Program se poziva sa:\n %s ime_html_datoteke\n", argv[0]); exit(EXIT_FAILURE); } /* Datoteka se otvara za citanje */ if ((f = fopen(argv[1], "r")) == NULL) { fprintf(stderr, "Greska: Neuspesno otvaranje datoteke %s.\n", argv[1]); exit(EXIT_FAILURE); } /* Cita se etiketa po etiketa, sve dok ih ima u datoteci. */ while ((tip = uzmi_etiketu(f, etiketa)) != EOF) { /* Ako je otvorena etiketa, stavlja se na stek. Izuzetak su etikete
,
i koje nemaju sadrzaj, pa ih nije potrebno zatvoriti. U HTML-u postoje jos neke etikete koje koje nemaju sadrzaj (npr link). Zbog jednostavnosti pretpostavlja se da njih nema u HTML dokumentu. */ if (tip == OTVORENA) { if (strcmp(etiketa, "br") != 0 && strcmp(etiketa, "hr") != 0 && strcmp(etiketa, "meta") != 0) if (potisni_na_stek(&vrh, etiketa) == 1) { fprintf(stderr, "Greska: Neuspesna alokacija memorije za nov cvor\n"); oslobodi_stek(&vrh); exit(EXIT_FAILURE); } } /* Ako je zatvorena etiketa, tada je uslov dobre uparenosti da je u pitanju zatvaranje etikete koja je poslednja otvorena, a jos uvek nije zatvorena. Ona se mora nalaziti na vrhu steka. Ako je taj uslov ispunjen, skida se sa steka, jer je upravo zatvorena. U suprotnom, pronadjena je nepravilnost i etikete nisu pravilno uparene. */ else if (tip == ZATVORENA) { if (vrh_steka(vrh) != NULL && strcmp(vrh_steka(vrh), etiketa) == 0) skini_sa_steka(&vrh, NULL); else { printf("Etikete nisu pravilno uparene\n"); printf("(nadjena je etiketa ", etiketa); if (vrh_steka(vrh) != NULL) printf(", a poslednja otvorena je <%s>)\n", vrh_steka(vrh)); else printf(" koja nije otvorena)\n"); uparene = 0; break; } } } /* Zavrseno je citanje i datoteka se zatvara */ fclose(f); /* Ako do sada nije pronadjeno pogresno uparivanje, stek bi trebalo da bude prazan. Ukoliko nije, tada postoje etikete koje su ostale otvorene */ if (uparene) { if (vrh_steka(vrh) == NULL) printf("Etikete su pravilno uparene!\n"); else { printf("Etikete nisu pravilno uparene\n"); printf("(etiketa <%s> nije zatvorena)\n", vrh_steka(vrh)); /* Oslobadja se memorija zauzeta stekom */ oslobodi_stek(&vrh); } } exit(EXIT_SUCCESS); }