/* Zadatak Popis */ /* Jasmina Strizak */ #include int UporediChar(char x, char y) { if ((64 < x) && (x < 91)) x += 32; if ((64 < y) && (y < 91)) y += 32; if (x == y) return 0; /* x == y */ else return 1; /* x != y */ } int UporediString(char *x, char *y) { int i = 0; while ((UporediChar(x[i], y[i]) == 0) && ((x[i] != '\0') && (y[i] != '\0'))) { i++; } if ((x[i] == '\0') && (y[i] == '\0')) { return 0; /* x == y */ } else { return 1; /* x != y */ } } void PopisiEtiketu(FILE* Ulaz, char* Etiketa) { /* Deklaracije promenljivih */ int i; /* Brojac karaktera */ int BrojEtiketa; /* Broj otvorenih etiketa */ int Ispis; /* 1 ako je ispis u toku, 0 u suprotnom */ long Vracanje; /* Pozicija prve ugnjezdene etikete */ long d; /* Pozicija prethodno obradjenog karaktera */ char c; /* Karakter */ char s[70]; /* String */ /* Trazenje etiketa */ BrojEtiketa = 0; Ispis = 0; Vracanje = 0; printf("%s\n", Etiketa); /* Stampanje naslova */ fseek(Ulaz, 0, SEEK_SET); /* Pozicioniranje fajl pointera na pocetak */ c = fgetc(Ulaz); while (c != EOF) { /* Obrada trenutnog karaktera */ d = ftell(Ulaz) - 1; /* Da li je trenutni karakter pocetak etikete ? */ if (c == '<') { c = fgetc(Ulaz); /* Da li je trenutna etiketa zatvorena ? */ if (c == '/') { /* Potencijalna zatvorena trazena etiketa */ i = 0; while ((c = fgetc(Ulaz)) != '>') { s[i] = c; i++; } s[i] = '\0'; if (UporediString(s, Etiketa) == 0) { /* Zatvorena trazena etiketa */ BrojEtiketa--; if (BrojEtiketa == 0) { /* Zavrsen je ispis trenutnog naslova */ Ispis = 0; printf("\n"); /* Da li postoji ugnjezdena etiketa ? */ if (Vracanje != 0) { /* Povratak na prvu ugnjezdenu etiketu */ fseek(Ulaz, Vracanje, SEEK_SET); /* Resetovanje pozicije prve ugnjezdene etikete */ Vracanje = 0; } } else { if (BrojEtiketa < 0) { /* Ignorisemo visak zatvorenih trazenih etiketa */ BrojEtiketa = 0; } else { /* Ispis zatvorene ugnjezdene trazene etikete */ printf("", s); } } } else { /* Ispis trenutne zatvorene etikete koja nije trazena */ if (Ispis) printf("", s); } } else { /* Potencijalna otvorena trazena etikete */ i = 0; ungetc(c, Ulaz); while ((c = fgetc(Ulaz)) != '>') { s[i] = c; i++; } s[i] = '\0'; if (UporediString(s, Etiketa) == 0) { /* Otvorena trazena etiketa */ BrojEtiketa++; if (BrojEtiketa == 2) { /* Belezimo poziciju prve ugnjezdene trazene etikete */ Vracanje = d; } if (BrojEtiketa != 1) { /* Ispis ugnjezdene trazene etikete */ printf("<%s>", s); } /* Aktiviramo ispis */ Ispis = 1; } else { /* Ispis trenutno otvorene etikete koja nije trazena */ if (Ispis) printf("<%s>", s); } } } else { /* Da li je ispis u toku ? */ if (Ispis) { /* Ispis trenutnog karaktera ogradjene niske */ putchar(c); } } /* Citanje sledeceg karaktera */ c = fgetc(Ulaz); } } int main(int argc, char** argv) { /* Deklaracije promenjivih */ int TraziSve; char* Trazi; char* Datoteka; FILE* Ulaz; /* Inicijalizacije */ TraziSve = 1; /* Analiza argumenata */ if (argc == 3) { TraziSve = 0; Trazi = argv[1]; Datoteka = argv[2]; } else { if (argc == 2) { Datoteka = argv[1]; } else { printf("Greska: Morate uneti ime ulazne datoteke !\n"); return 1; } } /* Rad */ Ulaz = fopen(Datoteka, "rb"); if (TraziSve) { PopisiEtiketu(Ulaz, "def"); PopisiEtiketu(Ulaz, "code"); PopisiEtiketu(Ulaz, "cite"); PopisiEtiketu(Ulaz, "em"); PopisiEtiketu(Ulaz, "strong"); PopisiEtiketu(Ulaz, "var"); PopisiEtiketu(Ulaz, "kbd"); PopisiEtiketu(Ulaz, "address"); } else { PopisiEtiketu(Ulaz, Trazi); } fclose(Ulaz); /* Kraj */ return 0; }