/* Student : Tica Sonja
* Br. ineksa : 38 / 2000
* Zadatak br. 6, druga grupa */
/* Napomene...
Tekst se sastoji od slobodnog teksta i naslova.
Glavni program obradjuje slobodni tekst i ulazi u naslov samo kad
naidje na prefiks.
Naslov se sastoji od a. prefiksa , b. teksta naslova i c. sufiksa
.
Komande tipa <...> dozvoljene su u slobodnom tekstu.
Komande tipa <...> nisu dozvoljene u tekstu naslova.
Nakon
#define EXIT 1
enum states
{freetext,h,hH,hHn,nastext,nastext1,Bp,Bz,f1,fH,fHH,fHHn,z,z2,z3}
int br=0;
int c,b,m=0,br1=0,min=2,max=6,i,brznak=0,n=0,j,k;
long int red=1;
enum states stanje;
char ime[]="ctext2.txt";
char naslov[200];
int eopn=0, anl=0, nas=0, brojnaslova=0, dubok=0;
char prvibrnoj,drugibroj;
FILE *f;
/*............................................*/
main()
{
f=fopen (ime,"r");
if(f==NULL)
{ fprintf(stderr,"Nije uspjelo otvaranje fajla%s\n",ime);
exit(EXIT );
}
/**/
stanje=freetext;
while((c=getc(f))!=EOF)
{
if(c=='\n') ++red;
/**/
switch (stanje)
{
case freetext:
if (c=='<')
{
stanje=h;
}
else
{
;/*ostaje u freetext*/
}
break;
/**/
case h:
if (c=='H')
{
stanje=hH;
nas=vadinaslov();
if (nas==2) exit(EXIT);/*greska u formiranju naslova*/
if (nas==1) exit(EXIT);/*predugacak tekst*/
if (nas==0)
{
stanje=freetext;
anl=analiza();
if (anl>0) exit(EXIT);
/**/
m=naslov[2];
if (naslov[4]=='*' && naslov[5]=='*' && naslov[6]=='*')
{
max=m-'0';
/* printf("max %d",max);*/
}
stampnas();
}/*end nas==0 */
}
else
{
stanje=freetext;
}
break;
}/*end switch*/
} /*end while*/
/**/
if (ferror(f)!=0)
fprintf(stderr,"\n Greska pri citanju fajla %s\n",ime);
fclose(f);
/**/
/* printf("\n brojnaslova = %d",brojnaslova);*/
printf("\n kraj programa");
exit(EXIT);
}/*end main*/
/*................................................*/
int vadinaslov(void)
{
int k,bn;
naslov[0]='<';
naslov[1]='H';
br1=1;
for(k=2;k<200;k++) naslov[k]=' ';
/**/
while((c=getc(f))!=EOF)
{ if(c==14) ++red;
if (br1==200) return 1;
/**/
switch (stanje)
{
case hH:
if(c=='2'||c=='3'||c=='4'||c=='5'||c=='6')
{
stanje=hHn;
br1++;
naslov[br1]=c;
}
else
{
printf("\n red %d Dubina prefiksa izvan dozvoljenog ranga
[2-6]",red);
return 2;
}
break;
/**/
case hHn:
if (c=='>')
{
stanje=nastext;
}
else
{
printf("\n red %d Lose formiran prefiks naslova",red);
return 2;
}
br1++;
naslov[br1]=c;
break;
/**/
case nastext:
if (c=='<')
{
stanje=f1;
}
br1++;
naslov[br1]=c;
break;
case f1:
if (c=='/')
{
stanje=fH;
br1++;
naslov[br1]=c;
}
else
{ printf("\n red %d Lose formiran sufiks",red);
return 2;
}
break;
/**/
case fH:
if (c=='H')
{
stanje=fHH;
br1++;
naslov[br1]=c;
}
else
{
printf("\n red %d Lose formiran sufiks",red);
return 2;
}
break;
/**/
case fHH:
if (c=='2'||c=='3'||c=='4'||c=='5'||c=='6')
{
drugibroj=c;
stanje=fHHn;
br1++;
naslov[br1]=c;
}
else
{
printf("\n red %d Dubina sufiksa izvan dozvoljenog ranga
[2-6]",red);
return 2;
}
break;
/**/
case fHHn:
if (c=='>')
{ --br;
stanje=freetext;
brojnaslova++;
br1++;
naslov[br1]=c;
return 0;
}
else
{ printf("\n red %d Lose formiran sufiks",red);
return 2;
}
break;
}/*end switch*/
} /*end while*/
}/*end vadinaslov*/
/*....................................*/
int analiza()
{ char prefn,sufn;
int dub,l,k;
int broj[16];
int nf,eop;
char sbroj[21][20]={
{"Jedan "},{"Dva "},
{"Tri "},{"Cetiri "},
{"Pet "},{"Sest "},
{"Sedam "},{"Osam "},
{"Devet "},{"Deset "},
{"Jedanaest "},{"Dvanaest "},
{"Trinaest "},{"Cetrnaest "},
{"Petnaest "},{"Sesnaest "},
{"Sedamnaest "},{"Osamnaest "},
{"Devetnaest "},{"Dvadeset "},
{"Sedamdesetcetiri"}
};
/**/
prefn=naslov[2];
sufn =naslov[br1-1];
if(prefn!=sufn)
{
printf("\n red %d Nije uskladjena dubina u prefiksu i sufiksu",red);
return 1;
}
/*..veza sa prethodnim naslovom..*/
if (m=='2')
{
if (prefn!='2' && prefn!='3')
{
printf("\n red %d Dubina nije uskladjena sa prethodnim
naslovom",red);
return 1;
}
}
/**/
if (m=='3'|| m=='4'||m=='5')
{
if (prefn!=m-1 && prefn!=m && prefn!=m+1)
{
printf("\n red %d Dubina nije uskladjena sa prethodnim
naslovom",red);
return 1;
}
}
/**/
if (m=='6')
{
if (prefn!='5' && prefn!='6')
{
printf("\=n red %d Dubina nije uskladjena sa prethodnim
naslovom",red);
return 1;
}
}
/*..........*/
if (prefn-'0'>max)
{
printf("\n red %d Dubina veca od max odredjene sa ***",red);
return 1;
}
/*..analiza slovnih brojeva ..........*/
if (naslov[4]=='[')
{
for(k=0;k<=15;k++) broj[k]=' ';
eop=0;
k=0;
while(eop==0)
{
if (naslov[k+5]==']') eop=2;
else
{
broj[k]=naslov[k+5];
k++;
if (k>16)
{ eop=1;
printf("\n red %d Predugacak slovni broj",red);
return 1;
}
}
}/*end while*/
/*..*/
nf=0;
for(k=0;k<21;k++)
{ if(nf==1) break;
nf=1;
for(l=0;l<16;l++)
{
if (broj[l]!=sbroj[k][l]) nf=0;
}
}
if (nf==0)
{
printf("\n red %d Neregistrovan slovni broj",red);
return 1;
}
}/*if slovni broj*/
/**/
return 0;
}/*end func */
/*....................................*/
int stampnas(void)
{ int k,pomak;
pomak=0;
if(naslov[2]=='2') pomak=1;
if(naslov[2]=='3') pomak=4;
if(naslov[2]=='4') pomak=7;
if(naslov[2]=='5') pomak=10;
if(naslov[2]=='6') pomak=13;
if (red>=1000 && red<=9999) printf("\n red = %d" ,red);
if (red>=1 && red<=9 ) printf("\n red = 000%d",red);
if (red>=10 && red<=99 ) printf("\n red = 00%d" ,red);
if (red>=100 && red<=999 ) printf("\n red = 0%d" ,red);
for(k=0; k