/* autor: Milan Ruzic 394/2000 */
/*Napomena: program prijavljuje gresku u slucaju preklopljenih etikete kao na pr:
xxxxxxxxx ; tekstovi i ne bi trebali da sadrze ovako nesto */
#include
#define opTagNum 3 /* broj otvorenih tagova, koje treba izbegavati */
#define opTag1 "META"
#define opTag2 "BR"
#define opTag3 "HR"
int strcmp(char *s1,char *s2)
{
for (;*s1==*s2 && *s2;s1++,s2++);
if (*s1==*s2) return 0;
else if (*s1>*s2) return 1;
else return -1;
}
int toUpCase(int ch)
{ if (ch>=97 && ch<=122) return ch-32;
else return ch;}
void main()
{char taglist[10000]={0}; /* cuva tagove visih nivoa - sluzi za proveru
tacnosti; oznake tagova su razdovjene 0-om */
char *opTags[opTagNum]={opTag1,opTag2,opTag3};
int brreda=1, /* broj trenutnog reda - omogucava otklon greske */
pok=1, /* index trenutnog mesta u taglist */
indent=-2; /* trenutni pomak - indentation */
char c;
for (c=getc(stdin);c!=EOF;c=getc(stdin))
if (c=='<')
{ c=getc(stdin);
if (c=='/') /* ako se tag zatvara */
{
int i, oldpok=pok-1;
/*izdvoj oznaku taga */
for (c=getc(stdin);c!=' '&& c!='>'&& c!=10 && c!=13&& c!=EOF;
taglist[pok++]=toUpCase(c), c=getc(stdin));
/*dodji do kraja taga; usput broj redove */
for (;c!='>'&&c!=EOF;(c=='\n')?(brreda++):1,c=(getc(stdin)));
if (c==EOF||oldpok==0)
{ printf(" Pogresno oznacena etiketa u %d.om redu!",brreda);return; }
taglist[pok]=0;
/*uporedi sa predhodnim */
for (i=-1;taglist[pok+i]==taglist[oldpok+i]&&taglist[pok+i];i--);
if (taglist[pok+i]!=taglist[oldpok+i])
{printf(" Neocekivana etiketa u %d.om redu",brreda);return;}
printf("%*s",indent+2,""); printf("%s>\n",&taglist[oldpok+1]);
indent-=2; pok=oldpok+i+1;
}
else if (c!='!'&& c!=EOF)
{
int i,oldpok=pok;
while (c!=' '&&c!='>'&&c!=10&&c!=13&&c!=EOF)
{ taglist[pok++]=toUpCase(c), c=getc(stdin);}
for (;c!='>'&& c!=EOF;(c=='\n')?(brreda++):1,c=(getc(stdin)));
if (c==EOF||pok==oldpok)
{ printf(" Pogresno oznacena etiketa u %d.om redu!",brreda);return; }
taglist[pok++]=0; /*oznaci kraj imena taga */
/*proveri da nije jedan od otvorenih tagova */
for (i=0; i\n",&taglist[oldpok]);}
}
} /* if c=='<' */
else if (c=='\n') brreda++; /* ako nismo u tagu */
/* ako je ostala neka neuparena etiketa */
if (pok>1) printf(" Etiketa nije zatvorena!");
}