#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <ctype.h>

#define MAXLEN	350

char institucija[100][MAXLEN];
char _institucija[100][10];
char autor[100][MAXLEN];
char _autor[100][10];

int seci_autore(char *);
int seci_institucije(char*);
void strip(char *);
char *pozicija(char *);

void main () {
FILE *infile;
char tag[1000], ti[1000], au[1000], in[1000], ab[10000];
char linija[10000], linnija[10000];
int tag_n=0, linija_n=0, linnija_n;
int k_in, k_au, ki, ka, ima;
int greska, ch, ccc=0, sss=0, lll=0, i, nxt=1;

if ((infile=fopen("test.txt", "r"))==NULL) {
	printf("GRESKA pri otvaranju fajla 'test.txt'\n");
   exit(0);
   }

for(;(ch=fgetc(infile))!=EOF;) {
	if (lll>0) {
   	if (ch=='\n') {
      	linija[linija_n++]='<';
      	linija[linija_n++]='B';
      	linija[linija_n++]='R';
      	linija[linija_n++]='>';
         }
		else
   		linija[linija_n++]=(char)ch;
   	}
	if (sss==2) {
   	tag[tag_n++]=(char)ch;
   	}
	if (sss==1)
   	ccc=ccc + 1;
   if (ccc>1)
   	ccc=0;
   if (ch=='~' && sss==0) {
   	sss++;
      ccc=0;
      }
	else if (sss==1 && ch=='#') {
   	sss++;
      tag_n=0;
      }
   else if (sss==2 && ch=='#') {
   	sss++;
      }
	else if (sss==3 && ch=='~') {
      tag[tag_n]=0;
		tag_n=0;
		lll=1;
      sss=0;
		if (tag[0]=='!') {
			linija[linija_n-7]=0;

         linnija_n=0;
         for (i=0; i<linija_n && linija[i]!=0; i++) {
         	if (linija[i]=='\"') {
	         	linnija[linnija_n++]='\\';
   	      	linnija[linnija_n++]='\"';
            	}
            else
         		linnija[linnija_n++]=linija[i];
         	}
         linnija[linnija_n]=0;
         strcpy(linija, linnija);

         greska=0;
      	switch(tag[1]) {
				case 'N':
            	printf("%d,\"%s\",\"%s\"\n", nxt, ti, ab);
					k_au=seci_autore(au);
               k_in=seci_institucije(in);
               for(ka=0; ka<k_au;ka++) {
               	ima=0;
               	for(ki=0; ki<k_in; ki++) {
                  	if(strcmp(_autor[ka],_institucija[ki])==0)
                     	ima=1;
                     	fprintf(stderr, "%d,%d,%s,%s\n", nxt, ka, autor[ka], institucija[ki]);
         //         	printf(">>>--+%s+--+%s+--%d\n", _autor[ka], _institucija[ki], ima);
								ki=k_in;
	                 	}
					if (ima==0) {
               	printf("GRESKA: %s (%s)\n", autor[ka], _autor[ka]);
               	}

                  }
					nxt++;
               break;
				case 'T':
            	strcpy(ti, linija);
               break;
            case 'I':
            	strcpy(in, linija);
               strip(in);
               break;
            case 'A':
               	switch(tag[2]) {
               		case 'B':
               			strcpy(ab, linija);
               			break;
               		case 'U':
               			strcpy(au, linija);
                  		strip(au);
                  		break;
               		default:
                  		greska=1;
                  		break;
                  	}
            	break;
            default:
            	greska=1;
               break;
            }

	    if (greska>0) {
	       printf("NEPOZNATI TAG: '%s'\n", tag);
	       }

         lll=0;
      	}
      linija_n=0;
		}
	}

fclose(infile);
}

void strip(char *sta) {
int i, j;
for(i=0; i<MAXLEN && sta[i]!=0; i++)
   if (sta[i]!=' ')
      break;
for(j=i; j<MAXLEN && sta[j]!=0; j++)
   sta[j-i]=sta[j];
sta[j-i]=0;
for(j-=i+1; j>0; j--)
   if (sta[j]==' ')
      sta[j]=0;
   else
      break;
}

int seci_autore(char *sta) {
int poc=0, koliko_au=0, i;

for(i=0; i<MAXLEN && sta[i]!=0; i++) {
   if (sta[i]==' ' && sta[i+1]=='i' && sta[i+2]==' ') {
      sta[i+1]=',';
      }
   if (sta[i]==',') {
      strncpy(autor[koliko_au], sta+poc, i-poc);
      autor[koliko_au][i-poc]=0;
      strip(autor[koliko_au]);
		strcpy(_autor[koliko_au], pozicija(autor[koliko_au]));
		koliko_au++;
      poc=i+1;
      }
   }
strncpy(autor[koliko_au], sta+poc, i-poc);
autor[koliko_au][i-poc]=0;
strip(autor[koliko_au]);
strcpy(_autor[koliko_au], pozicija(autor[koliko_au]));
koliko_au++;

return koliko_au;
}

char *pozicija(char *sta) {
int i, j=0, k=0, bilo=0;
char aup[MAXLEN];
aup[0]=0;

	for(i=0; i<MAXLEN && sta[i]!=0; i++) {
		if (k==2 && sta[i]!='<') {
			aup[j++]=sta[i];
			}
      if (sta[i]=='<' && (toupper(sta[i+1])=='S' || sta[i+1]=='/')) {
			k++;
         }
      if (sta[i]=='>') {
      	if (k<4)
         	sta[i]=' ';
      	k++;
         if (k>3) {
         	aup[j]=0;
            k=0;
            bilo=1;
            }
         }
		if (k>0 && k<4)
      	sta[i]=' ';
      }
if (k>0) {
	aup[j]=0;
   }
if (k==0 && bilo==0) {
	for(i=0; i<MAXLEN && sta[i]!=0; i++)
      if (sta[i]=='*') {
      	aup[k++]='*';
         sta[i]=' ';
         }
   aup[k]=0;
   }
strip(aup);
strip(sta);
return aup;
}

int seci_institucije(char *sta) {
int poc=0, koliko_in=0, i;

for(i=0; i<MAXLEN && sta[i]!=0; i++) {
   if ((sta[i]==' ' && sta[i+1]=='i' && sta[i+2]==' ') || sta[i]==';') {
      sta[i+1]=',';
      }
   if (sta[i]==',') {
      strncpy(institucija[koliko_in], sta+poc, i-poc);
      institucija[koliko_in][i-poc]=0;
      strip(institucija[koliko_in]);
		strcpy(_institucija[koliko_in], pozicija(institucija[koliko_in]));
		koliko_in++;
      poc=i+1;
      }
   }
strncpy(institucija[koliko_in], sta+poc, i-poc);
institucija[koliko_in][i-poc]=0;
strip(institucija[koliko_in]);
strcpy(_institucija[koliko_in], pozicija(institucija[koliko_in]));
koliko_in++;
return koliko_in;
}

