#include <stdio.h>
#include <string.h>
#include <stdlib.h>

enum {LINE_MAX=1000};

/**************************************
			   GLOBAL
**************************************/
char retezec[LINE_MAX]="";		//co se hleda
int index=0;					//index do vyrazu, abych vedel, co mam ted hledat

char radek[LINE_MAX]="";		//kde se hleda
int cislo_radku=0;				//kolikaty to je radek? (pro vypis)

char co_matchuje[LINE_MAX]="";	//jak vypada matchujici retezec? (pro vypis)
int kolikaty_matchuje=0;		//kolik matchujicich znaku bylo nalezeno

FILE *vstup;					//soubor, v nemz si hrajeme
/**************************************
				KOD
**************************************/

/******
Zjisti, jestli je v danem radku vyraz a pokud ano vypise co nasel a kde
******/
int Hledej_znak(char *kde, int kolik){
//	if (kolik>strlen(retezec)) return 1;	//uz neni co hledat	(osetruje konec radky)

	char co=retezec[kolik];
	int vraceno, konec, j;

	if (kde[0]=='\n'){
		if (co==0){
			printf("%s, %d\n", co_matchuje, cislo_radku);
			return 1;
		}else return 0;
	};
	
	switch (co) {
	case '\0':	//konec vyrazu... tj. nasel jsem vsechno
		co_matchuje[kolikaty_matchuje]=0;
		printf("%s, %d\n", co_matchuje, cislo_radku);
		return 1;
		break;
	case '[':	//je to specialni znak
		if ((retezec[kolik+1]=='?') &&
			(retezec[kolik+2]==']')){ //je to libovolny znak
			co_matchuje[kolikaty_matchuje++]=kde[0];
			vraceno=Hledej_znak(kde+1,kolik+3);
			kolikaty_matchuje--;
			return vraceno;
		}else{	//vyctovy znak nebo interval
			switch (retezec[kolik+2]){
			case '-':	//interval
				co=kde[0];
				if (((co>=retezec[kolik+1]) && (co<=retezec[kolik+3])) ||	//pokud je znak v intervalu
					((co<=retezec[kolik+1]) && (co>=retezec[kolik+3]))
					){
					co_matchuje[kolikaty_matchuje++]=kde[0];
					vraceno=Hledej_znak(kde+1, kolik+5);
					kolikaty_matchuje--;
					return vraceno;
				} else return 0;
				break;
			case '|':	//vycet
				konec=kolik;
				vraceno=0;
				while (retezec[konec]!=']')	//najdi konec vyctu
					konec+=2;

				for(j=kolik+1; j<konec;j+=2){
					if (kde[0]==retezec[j]){
						co_matchuje[kolikaty_matchuje++]=kde[0];
						if (Hledej_znak(kde+1,konec+1))
							vraceno++;
						kolikaty_matchuje--;
						//if (!retezec[konec+1]) break;
					};
				};

				return vraceno;
				break;
			default:return 0; //chybne pouzita hranata zavorka
			};
		};
		break;
	default:	//je to obycejny znak
		if (kde[0]==co) {
			co_matchuje[kolikaty_matchuje++]=co;
			vraceno=Hledej_znak(kde+1,kolik+1);
			kolikaty_matchuje--;
			return vraceno;
		}
		else return 0;
		break;
	};
};

/******
Zjisti, jestli je v danem radku vyraz a pokud ano vypise co nasel a kde
******/
void Zpracuj_radek(){
	char *od=radek;	//odkud hledat

	kolikaty_matchuje=0;
	while(*od!='\n')
		Hledej_znak(od++, 0);
};

/******
Nacte radky a da je zpracovat
******/
int main(int argc, char **argv){
	if (argc<1) return 100;
	if (!(vstup=fopen(argv[1], "r"))) return 200;

	printf("Zadejte hledany retezec: ");
	gets(retezec);

	while (fgets(radek, LINE_MAX, vstup)!=NULL){
		cislo_radku++;
		Zpracuj_radek();
	};
	fclose(vstup);

	system("PAUSE");
	return 0;

};