/* Zadatak 7. */ /* Jasmina Strizak */ #include /* F-ja VadiNaslov (zajedno sa potrebnim deklaracijama/definicijama) preuzeta iz resenja zadatka 6 kolege Slijepcevic Dusana */ typedef enum {VTS_NFOUND=-1,VTS_OK,VTS_TOO_LONG} VTS_RESULT; #define VTS_ERR -1 /* genericka greska */ #define INDENT 4 /* estetika... */ #define MAX_H 200 /* maks. broj karaktera ne racunajuci * umetnute, a ni / etikete */ const char szInvT[] = "Greska: Nedozvoljena etiketa u redu %.4d !\n"; const char szAttr[] = "Greska: Nedozvoljeni atribut etikete naslova u redu %.4d !\n"; const char szSPC [] = "Upozorenje: Blanko karakter(i) posle \"<\" karaktera u redu %.4d !\n"; int red=1; /**************************************************************************** * * int VadiNaslov(char*,int*) - F-ja koja "chupa":) naslov iz ulaznog stream-a * * Parametri: * - buf: pointer na buffer duzine [MAX_H+1] koji ce prihvatiti izdvojeni naslov * - lev: adresa promenljive u kojoj se vraca "dubina" naslova (n od "") * * Buf ce po uspesnom "vadjenju" sadrzati naslov sa sledecim osobinama: * - Sve ugnjezdene etikete (... i sl.) ce biti uklonjene * - Ugnjezdeni tagovi nisu dozvoljeni * - Izbacuju se i tagovi - "dubina" se vraca u promenljivoj lev * - etiketa ne sme imati dodatne atribute (align=...) * - Svako pojavljivanje '\n' unutar naslova bice zamenjeno ' ' karakterom * - Maksimalna dozvoljena duzina za tako "cist" naslov je MAX_H karaktera (bez '\0') * * Povratne vrednosti: * - VTS_NFOUND: U tekstu (vise) nema naslova * - VTS_OK: Naslov je uspesno izdvojen! * - VTS_TOO_LONG: Duzina "cistog" naslova (bez ikakvih tagova) > MAX_H karaktera * * Napomena: * Funkcija detektuje i suvisne (nedozvoljene) '<' '>' karaktere, vodi * racuna o "" komentarima, o dodatnim atributima etikete * kao i o jos nekim stvarima... (SCRIPT tagovi se ovde ne racunaju:) * ****************************************************************************/ int VadiNaslov(char *buf,int *lev) { int c; /* vrlo "zaposlena" promenljiva */ int i; /* indeks buf niza */ int n; /* "dubina" naslova (n od "") */ int inT; /* fleg - da li smo u tagu, tj. izmedju '<' i '>' ? */ int inC; /* fleg - da li smo u komentaru "" ? */ int inH; /* fleg - da li smo _izmedju_ "" i "" ? */ inT=inH=inC=i=n=*buf=buf[MAX_H]=0; while ((c=getc(stdin))!=EOF) { switch(c) { case '<': if (inC) continue; else if ((c=getc(stdin))!=EOF) { inT=1; switch(c) { case '!': inT=0; inC=1; break; case '/': if (inH && (c=getc(stdin))=='h'||c=='H') { if ((c=getc(stdin))==n) { /* "" */ inT=buf[i]=0; *lev = (int) (n-'0'); return VTS_OK; } else return VTS_TOO_LONG; } /* c!=n "='1' && c<='6') { if (inH) { fprintf(stderr,"Greska: Ugnjezdene " " etikete! Red: %.4d\n",red); return VTS_NFOUND; } n=c; if ((c=getc(stdin))!=' '&& c!='\t'&& c!='\n'&& c!='>') { fprintf(stderr,szInvT,red); return VTS_NFOUND; } for (;c!=EOF && (c==' '||c=='\t'|| c=='\n');c=getc(stdin)) if (c=='\n') red++; if (c==EOF) { fprintf(stderr,szInvT,red); return VTS_NFOUND; } else if (c!='>') { fprintf(stderr,szAttr,red); return VTS_NFOUND; } else inT=0,inH=1; /* "Hn ... >" */ } /* " */ else if (c=='\n'||c=='\t'||c==' ') fprintf(stderr,szSPC,c=='\n'?++red:red); break; case '\n': /* "<[SPC]" */ case '\t': case ' ' : fprintf(stderr,szSPC,c=='\n'?++red:red); break; } /* switch #2 */ } /* "': if (inC) inC=0; else if (inT) inT=0; else { fprintf(stderr,"Greska: Etiketa nije otvorena! Red: %.4d\n",red); return VTS_NFOUND; } break; case '\n': ++red; c=' '; /* zameni '\n' sa ' ' */ default: /* ovde nema break-a */ if (inH && !inT && !inC) { if (i 0) { switch (s3[i - 1]) { case 'a': case 'A': case 'e': case 'E': case 'i': case 'I': case 'o': case 'O': case 'u': case 'U': rod = 0; break; /* Muski */ } } break; } /* Rezultat */ if ((s == 1) && (e == 0)) { switch (rod) { case 0: sprintf(res, "%s%si%s", s1, temp2, s3); break; /* Muski */ case 1: sprintf(res, "%s%sa%s", s1, temp2, s3); break; /* Zenski */ case 2: sprintf(res, "%s%so%s", s1, temp2, s3); break; /* Srednji */ } } else sprintf(res, tex); return r; } int prevodilac(const char *ulaz, char kod, char *izlaz) { switch (kod) { case 'a': case 'A': return prevodilaca(ulaz, izlaz); case 'r': case 'R': return prevodilacr(ulaz, izlaz); case 'd': case 'D': return prevodilacd(ulaz, izlaz); } } int main() { VTS_RESULT res; char naslov[MAX_H+1]; int d,eXists = 0; int r; char* izlaz = (char*)malloc(200, sizeof(char)); while ((res = VadiNaslov(naslov,&d)) != VTS_NFOUND) { eXists = 1; if (res == VTS_TOO_LONG) { fprintf(stderr, "\nGreska: Predugacak naslov " "(maks. 200 karaktera):\n%s\n", naslov); break; } printf("%s\n", naslov); r = prevodilac(naslov, 'a', izlaz); printf("a %d %s\n", r, izlaz); r = prevodilac(naslov, 'r', izlaz); printf("r %d %s\n", r, izlaz); r = prevodilac(naslov, 'd', izlaz); printf("d %d %s\n", r, izlaz); } if (!eXists) printf("U tekstu nema naslova.\n"); return 0; }