/***************************************************************************
 *                                                                          * 
 *   Copyright (C) 2005 Piotr Wawrzyniak (piti@piti.vsv.pl                  *
 *   This program is free software; you can redistribute it and/or modify   *
 *   it under the terms of the GNU General Public License as published by   *
 *   the Free Software Foundation; either version 2 of the License, or      *
 *   (at your option) any later version.                                    *
 *                                                                          *
 ***************************************************************************/


#include"operacje.h"
#include"czyt_zapis.h"
#include"dl_wiersza.h"
#include<stdlib.h>
#include<ctype.h>
#include<stdio.h>
#include<unistd.h>
#include"num_na_etyk.h"
#include"prz_string.h"
#include"system_zapisu.h"

int przeszukaj_linie(char*,char*,ifstream&); //przeszukuje linie eps
int przetworz_eps(char*,kol_etykiet**);
int przeszukaj_linie_eps(char*,char*,int&);
int podaj_etykiete_liczbe(char *, char *, int *);
int zwroc_numer_etykiety(kol_etykiet*,char*,kol_etykiet**);
int przed_etykieta_po(char,char*,char*,char*,char);
int check_counter_to_set(char*);

struct kolejka_w_eps
{
  int numer;
  char etykieta[DL_WIERSZA];
  kolejka_w_eps*nast;
  
};

int wloz_na_liste(kolejka_w_eps*,kol_etykiet**);

//ifstream czyt;
//ofstream pisz;


extern char numer_czy_etykieta;//przyjmuje dwie warto�ci n-numeruje e-nadaje etykiety;
extern int zacznij_numery_od;//od jakiej liczby zacz�� numeracj�
extern r_numerow klasa_obslugi_etykiet;
extern int debug_level;
extern int ignore_set_counter_to;
extern int language;
extern int test;


//Funkcja przetwarzaj plik zajmuje si� szukaniem etykiet i plik�w eps w pliku texowym
//je�li znajdzie podejmuje akcje w zale�no�ci co znalaz�a
int przetwarzaj_plik(char *argv1, /*char *argv2,*/kol_etykiet **wierzcholek)
{
  ifstream czyt;
  czyt.open(argv1);
  if(!czyt)
    {
      if(language==0)
	{
	  cout<<"Nie moge otworzy� pliku "<<argv1<<endl;
	}
      else
	{
	  cout<<"Couldn't open file "<<argv1<<endl;
	}
      return 1;
    }
  char c[DL_WIERSZA];//zmienna zawieraj�ca linie
  c[DL_WIERSZA-1]='\0';//tak na wszelki wypadek aby zapobiec przepe�nieniu bufora
  int dl_lini;
  char nazwa_pliku[DL_WIERSZA];
  nazwa_pliku[DL_WIERSZA-1]='\0';
  while(!wczytaj_linie(c,&dl_lini,DL_WIERSZA,czyt)) //wczytaj_linie belongs to czyt_zapis.cc
    {
      if(numer_czy_etykieta!='e'&&!ignore_set_counter_to)
	check_counter_to_set(c);
      switch(przeszukaj_linie(c,nazwa_pliku,czyt)) 
	{
	case 0://Znalaz�em plik eps wi�c musz� go przetworzy�.
	  {
	    //odtwarzam etykiety w plikach eps
	    if(numer_czy_etykieta=='e') 
	      num_na_etyk(nazwa_pliku);//change numbers to lables
	    //przetwarzam eps, tzn zamieniam etykiety na numery
	    else 
	      przetworz_eps(nazwa_pliku,wierzcholek); //change labels to numbers
	    break;
	  }
	case 6://if input command was found in tex file
	  {
	    if(przetwarzaj_plik(nazwa_pliku,/*argv2,*/wierzcholek)) 
	      return 1;
	    break;
	  }
	}
    }
  if(!czyt.eof()) //if we did not finish reading file
    {
      if(language==0)
	{
	  cout<<"B��d czytania"<<endl;
	}
      else
	{
	  cout<<"Reading error"<<endl;
	}
      return 1;
    }
  czyt.close();
  return 0;
}


//function that search for tex files and input command in tex file
int przeszukaj_linie(char *linia,char *nazwa_pliku,ifstream &czyt)
{//1  
  char pom_nazwa_pliku[DL_WIERSZA];
  pom_nazwa_pliku[DL_WIERSZA-1]='\0';
  char polecenie[]="?plik";//definiuje nazw� polecenia do znalezienia
  char polecenie2[]="input{";//definiuje nzaw� do znalezienia
  int a;// zero je�li uda�o si� skopiowa� string
  while(isblank(*linia))
    linia++;
   
  if (*linia=='%')
    { //2
      linia++;
      a=strncmp(linia,polecenie,5);
      if(!a)
	{//3
	  linia=linia+5;
	  if (*linia!='{')
	    return 1; //je�li nie ma nawiasu zwr�� b��d 
	  else
	    {//4
	      linia++;
	      int licznik=0;
	      if (*linia=='}')return 2;//je�li nie ma nazwy pliku zwr�� b��d przypadek  %?{}
	      int czykoniec=0;
	      do
		{//5
		  if(*(linia+licznik)=='}')
		    {//skopiuj nazw� pliku
		      strncpy(pom_nazwa_pliku,linia,licznik); 
		      pom_nazwa_pliku[licznik]='\0';
		      czykoniec=1;}
		  else
		    if(*(linia+licznik)=='\n')
		      {
			return 3;
		      }
		  //je�li nie ma
		    else
		      licznik++;
		}//5
	      while(!czykoniec);
	      strcpy(nazwa_pliku,pom_nazwa_pliku); 
	      nazwa_pliku[licznik]='\0';
	      return 0;//je�li sukces to zwr�� to   
	    }//4
	}//3
      else return 4; //to nie jest polecenia
    }//2
  else 
    if(*linia=='\\')
      {//6
	linia++;
	if(!strncmp(linia,polecenie2,6))
	  {//7
	    linia+=6;
	    int licznik=0;
	    if (*linia=='}')return 2;//je�li nie ma nazwy pliku zwr�� b��d przypadek  %?{}
	    int czykoniec=0;
	    do
	      {//5
	        if(*(linia+licznik)=='}')
		  {strncpy(pom_nazwa_pliku,linia,licznik); czykoniec=1;}//skopiuj nazw� pliku
		else
		  if(*(linia+licznik)=='\n')
		    {
		      return 3;
		    }//je�li nie ma }
		  else
		    licznik++;
	      }//5
	    while(!czykoniec);
	    strcpy(nazwa_pliku,pom_nazwa_pliku); 
	    nazwa_pliku[licznik]='\0';
	    return 6;//zwraca nazw� pliku LaTeXa 
	  }//7
	else 
	  return 4;//nie r�b nic
      }//6
  return 4;//linia nie zaczyna si� od % ani backlsasha
}//1

//change labels to numbers in eps file
int przetworz_eps(char *nazwa_pliku,kol_etykiet**wierzcholek)
{
  kolejka_w_eps*pierwszy_element=NULL;
  char nazwa_eps_tymcz[]="konwXXXXXX";//temporary file name
  mkstemp(nazwa_eps_tymcz);//creation of temporary file

  if(debug_level)
    {
      if(language==0)
	{
	  cout<<"Plik eps jest kopiowany do pliku "<<nazwa_eps_tymcz<<endl;
	  cout<<"Otwieranie pliku tymczasowego do zapisu"<<endl;
	}
      else
	{
	  cout<<"The eps file copied to "<<nazwa_eps_tymcz<<" file"<<endl;
	  cout<<"Opening the temporary file for writing"<<endl;
	}
	
    }
  
  ofstream plik_tymcz(nazwa_eps_tymcz);//temporary file opening 
  if(!plik_tymcz)
    {
      if(language==0)
	{
	  cout<<"Nie uda�o mi si� otworzy� pliku tymczasowego"<<endl;
	}
      else
	{
	  cout<<"Couldn't open temporary file"<<endl;
	}
      return 1;
    }
    
  ifstream plik_eps(nazwa_pliku); //eps file opening
  if(!plik_eps)
    {
      if(language==0)
	{
	  cout<<"Brakuje pliku "<<nazwa_pliku<<", lub brak praw."<< endl;
	}
      else
	{
	  cout<<"Missing file "<<nazwa_pliku<<", or access forbidden"<<endl;
	}
      return 1;
    }
  if(language==0)
    {
      cout<<"Znalaz�em plik "<<nazwa_pliku<<"."<<endl;
    }
  else
    {
      cout<<"File "<<nazwa_pliku<<" found."<<endl;
    }
  int dl_lini;
  int kolejnosc;
  char c[DL_WIERSZA];
  char etykieta[DL_WIERSZA];

  
  //local label queue building
  while(!wczytaj_linie(c,&dl_lini,DL_WIERSZA,plik_eps))//reads line from eps file
    {
      //searching eps line for labels. Returning 1  means label
      if(przeszukaj_linie_eps(c,etykieta,kolejnosc))//je�li zwr�ci 1  oznacza �e znalaz� etykiet�
	{//pocz�tek if
	  if(*c!='%')plik_tymcz<<'%'<<c;
	  plik_tymcz<<c;
	  if(!pierwszy_element)//if 2
	    {//1
	      pierwszy_element=new kolejka_w_eps;
	      pierwszy_element->nast=NULL;
	      strcpy(pierwszy_element->etykieta,etykieta);
	      pierwszy_element->numer=kolejnosc;
	    }//1
	  //W przeciwnym wypadku je�li lista ma ju� przynajmniej pierwszy element zr�b to co poni�ej tzn
	  else//if 2
	    {
	      kolejka_w_eps*nowy_element=new kolejka_w_eps;//tworze nowy element
	      nowy_element->numer=kolejnosc;//nadaje mu warto�ci pocz�tkowe - kolejno��
	      nowy_element->nast=NULL;//nadaje mu warto�ci pocz�tkowe - nast�pny
	      strcpy(nowy_element->etykieta,etykieta);//nadaje mu warto�ci pocz�tkowe - etykieta
	      //je�li nowy element jest mniejszy lub r�wny pierwszemu z listy to wstaw go przed niego
	      if((nowy_element->numer)<=(pierwszy_element->numer))
		{
		  nowy_element->nast=pierwszy_element;
		  pierwszy_element=nowy_element;
		}

	    //no dobrze nie jest mniejszy ani r�wny wobec tego wstaw go w odpowiedie miejsce w li�cie
	      else//2
		{
		  //tworze wska�nik do zmiennej kt�ry wskazuje na pierwszy element
		  kolejka_w_eps*bierzacy_element=pierwszy_element;//pomocnicza zmnienna
		  //tworze wska�nik to zmiennej kt�ry wskazuje na bierzacy_element
		  kolejka_w_eps*pomocnicza=bierzacy_element;//pomocnicza zmnienna
		  //do czasu a� kolejno�� z nowego b�dzie wi�ksza od kolejno�ci z bierz�cego i jednocze�nie
		  //bierz�cy element nie b�dzie ostatnim wykonuj t� p�tl�
		  while(((nowy_element->numer)>(bierzacy_element->numer))&&(bierzacy_element->nast))
		    {
		      pomocnicza=bierzacy_element;//pomocnicza wskazuje na 1 element bli�ej ni� bierz_element
		      //bierzacy_element przeskakuje o jedno pole dalej
		      bierzacy_element=bierzacy_element->nast;
		    }
		  {
		    //je�li bierz�cy element jest ostatnim elementem na li�cie i jednocze�nie jest mniejszy
		    //lub r�wny od nowego to nowy dostaw na ko�cu listy
		    if(!bierzacy_element->nast&&((bierzacy_element->numer)<=(nowy_element->numer)))
		      {
			bierzacy_element->nast=nowy_element;
		      }
		    
		    //w przeciwnym wypadku wstaw go w znalezione miejsce
		    else
		      {
			pomocnicza->nast=nowy_element;
			nowy_element->nast=bierzacy_element;
		      }
		  }
		}//koniec else 2
	    }//koniec else 1
	  if(debug_level)
	    {
	      if(language==0)
		{
		  cout<<"Czytanie linii z pliku eps: "<<c<<endl;
		  cout<<"Etykietka: "<<etykieta<<endl;
		  cout<<"Numer: "<<kolejnosc<<endl;
		}
	      else
		{
		  cout<<"Readed line from eps file: "<<c<<endl;
		  cout<<"The label: "<<etykieta<<endl;
		  cout<<"The number: "<<kolejnosc<<endl;
		}
	    }
	}
      else  
	plik_tymcz<<c;

      //zerujemy wczytan� linie (zmienna c) oraz etykiet� inaczej s� szopki
      
    }//koniec while;

  //zako�czy�o si� budowanie kolejki etykiet z pliku eps teraz nale�y je wprowadzi� na list� etykiet
  //globalnych
  //global queue building
  //wk�adanie na globaln� kolejk� etykiet
  if(debug_level)
    {
      if(language==0)
	{
	  cout<<"Budowanie globalnej kolejki etykiet"<<endl;
	}
      else
	{
	  cout<<"Global label queue building"<<endl;
	}
    }
  {
    kolejka_w_eps*pomocnicza=pierwszy_element;
    while(pomocnicza)
      {
	wloz_na_liste(pomocnicza,wierzcholek);
	pierwszy_element=pomocnicza;
	pomocnicza=pomocnicza->nast;
	delete pierwszy_element;
      }
  }

  if(debug_level)
    {
      if (language==0)
	{
	  cout<<endl<<"Budowanie globalnej kolejki etykiet: "<<endl;
	}
      else
	{
	  cout<<endl<<"The global label queue printing: "<<endl;
	}
      kol_etykiet*pomocnicza_2=*wierzcholek;
      while(pomocnicza_2)
	{
	  if(language==0)
	    {
	      cout<<"Etykieta "<<pomocnicza_2->etykieta<<endl;
	      cout<<"Numer "<<pomocnicza_2->kolejny_numer<<endl;
	      cout<<"String numer "<<pomocnicza_2->kolejny_numer_string<<endl;
	      pomocnicza_2=pomocnicza_2->nast;

	    }
	  else
	    {
	      cout<<"Label "<<pomocnicza_2->etykieta<<endl;
	      cout<<"Number "<<pomocnicza_2->kolejny_numer<<endl;
	      cout<<"String number "<<pomocnicza_2->kolejny_numer_string<<endl;
	      pomocnicza_2=pomocnicza_2->nast;
	    }
	}
      if(language==0)
	{
	  cout<<"Zako�czy�em prac� z plikiem "<<nazwa_pliku<<endl;
	}
      else
	{
	  cout<<"I have finished "<<nazwa_pliku<<" file"<<endl;
	}
    }
  plik_eps.close();
  plik_tymcz.close();

  //Kopiowanie pliku tymczasowego na eps
  //Copying temporary file to eps file.
  
  if(!test)
  {
    
    //plik_eps.open(nazwa_eps_tymcz);
    ifstream plik_eps(nazwa_eps_tymcz);//otwieram plik tymczasowy do odczytu aby go skopiowa� na pierwotny eps. Nie sugerowa� si� nazw� zmiennej.
    if (!plik_eps)
      {
	if(language==0)
	  {
	    cout<<"Nie mog� otworzy� pliku tymczasowego "<<nazwa_eps_tymcz<<" do czytania"<<endl;
	  }
	else
	  {
	    cout<<"Couldn't open temporary file: "<<nazwa_eps_tymcz<<" for reading"<<endl;
	  }
	return 1;
      }
    //plik_tymcz.open(nazwa_pliku);
    ofstream plik_tymcz(nazwa_pliku);//otwieram plik g��wny eps do zapisu aby skopiowa� do niego zawarto�� pliku tymczasowego. Nie sugerowa� si� nazw� zmiennej. 
    //Brak logiki wynika z lenistwa. Nie chcia�o mi si� poprawia� par� linii wi�c jest jak jest.
    if (!plik_tymcz)
      {
	if(language==0)
	  {
	    cout<<"Nie mog� otworzy� pliku "<<nazwa_pliku<<" do zapisu"<<endl;
	  }
	else
	  {
	    cout<<"Couldn't open file: "<<nazwa_pliku<<" for writing"<<endl;
	  }
	return 1;
      }
    
    int numer_etykiety;
    char przed[DL_WIERSZA];
    char po[DL_WIERSZA];
    przed[DL_WIERSZA-1]=po[DL_WIERSZA-1]='\0';
    while(!wczytaj_linie(c,&dl_lini,DL_WIERSZA,plik_eps))
      {
	if(debug_level)
	  {
	    if(language==0)
	      {
		cout<<"Kopiowanie pliku tymczasowego na g��wny eps. Przeczytana linia: "<<c<<endl;
	      }
	    else
	      {
		cout<<"Copying the temporary file to main eps. The read line is: "<<c<<endl;
	      }
	  }
	if(przeszukaj_linie_eps(c,etykieta,kolejnosc))//je�li zwr�ci 1 oznacza �e znalaz� etykiet�
	  {
	    if(debug_level)
	      {
		if(language==0)
		  {
		    cout<<"Odnaleziono linijk� z etykietk�. Analizuj�."<<endl;
		    cout<<"Zmienna etykieka wynosi: "<<etykieta<<endl;
		    cout<<"Zmienna c - linia wynosi: "<<c<<endl;
		  }
		else
		  {
		    cout<<"I found the line with label. Analyzing."<<endl;
		    cout<<"The etykieta variable is equal: "<<etykieta<<endl;
		    cout<<"The c variable - the line is equal: "<<c<<endl;
		  }
	      }
	    kol_etykiet *zmienna_tymczasowa1;
	    kol_etykiet**zmienna_tymczasowa=&zmienna_tymczasowa1;
	    plik_tymcz<<c;//zapisz linie etykiety z %
	    if(debug_level)
	      {
		if(language==0)
		  {
		    cout<<"Sprawdzanie kt�ry numerek na etykieta. ";
		    cout<<"Dane dla wywo�anie funkcji:"<<endl;
		    cout<<"*wierzcholek->etykieta: "<<(*wierzcholek)->etykieta<<endl;
		    cout<<"zmienna_tymczasowa: "<<zmienna_tymczasowa<<endl;
		  }
		else
		  {
		    cout<<"Checking which number has the label. ";
		    cout<<"The data for function calling:"<<endl;
		    cout<<"*wierzcholek->etykieta: "<<(*wierzcholek)->etykieta<<endl;
		    cout<<"zmienna_tymczasowa: "<<zmienna_tymczasowa<<endl;
		  }
	      }
	    numer_etykiety=zwroc_numer_etykiety(*wierzcholek,etykieta,zmienna_tymczasowa);
	    if(debug_level)
	      {
		if(language==0)
		  {
		    cout<<"Numer zosta� sprawdzony i wynosi: "<<numer_etykiety<<endl<<endl;
		  }
		else
		  {
		    cout<<"The number was checked and is equal: "<<numer_etykiety<<endl<<endl;
		  }
	      }
	    if(przed_etykieta_po('{',c,przed,po,'}')) numer_etykiety=0;//je�li funkcja zwr�ci 1 to oznacza b��d
	    if(debug_level)
	      {
		if(language==0)
		  {
		    cout<<"Funkcj przed_etykieta_po sprawdzi�a etykietk�.Zmienna kolejny_numer_string wynosi: "
			<<(*zmienna_tymczasowa)->kolejny_numer_string<<endl;
		  }
		else
		  {
		    cout<<"Function przed_etykieta_po has checked the label. Variable kolejny_numer_string is equal: "
			<<(*zmienna_tymczasowa)->kolejny_numer_string<<endl;
		  }
	      }
	    
	    if(numer_etykiety)//je�li numer_etykiety=0 oznacza to �e nie znalaz� etykiety na li�cie
	      {//pocz�tek if
		char przed1[DL_WIERSZA];
		int taka_sobie=strlen(przed);
		strncpy(przed1,przed,taka_sobie-4);
		przed1[taka_sobie-4]='\0';
		//char *po1=&po[1];
		char *po1=&po[1];
		if(debug_level)
		  {
		  
		    if(language==0)
		      {
			cout<<"Nast�puj�ca linia jest zapisywana do pliku eps:"<<endl
			    <<"przed1: "<<przed<<endl
			    <<"(*zmienna_tymczasowa)->kolejny_numer_string: "
			    <<(*zmienna_tymczasowa)->kolejny_numer_string<<endl
			    <<"po1: "<<po1<<endl;
		      }
		    else
		      {
			cout<<"The following line is saved in eps file:"<<endl
			    <<"przed1: "<<przed<<endl
			    <<"(*zmienna_tymczasowa)->kolejny_numer_string: "
			    <<(*zmienna_tymczasowa)->kolejny_numer_string<<endl
			    <<"po1: "<<po1<<endl;
		      }
		  }
		
		plik_tymcz<<przed1<<(*zmienna_tymczasowa)->kolejny_numer_string<<po1;//zapisz numer etykiety
		wczytaj_linie(c,&dl_lini,DL_WIERSZA,plik_eps);//w pliku pom za etykiet� z % jest zwyk�a 
		//wi�c j� wont
		/**************************************************************************/
		
	      }//koniec if
	    else //je�li nie zalaz�e� etykiety na li�cie zapisz jej nazw� do pliku. Nazwa ukryta pod zmienn�  c
	      {
		if(debug_level)
		  {
		    if(language==0)
		      {
			cout<<"Etykietka nie zosta�a znalezionalist. Writing all in eps file."<<endl
			    <<"Writing the following line "<<c<<endl; 
		      }
		    else
		      {
			cout<<"The label was not found on the list. Writing all in eps file."<<endl
			    <<"Writing the following line "<<c<<endl; 
		      }
		  }
		char*ggg=c;
		if(debug_level)
		  {
		    if(language==0)
		      {
			cout<<"Zmienna ggg wynosi: "<<ggg<<endl;
		      }
		    else
		      {
			cout<<"The ggg variable: "<<ggg<<endl;
		      }
		  }
		ggg++;
		if(debug_level)
		  {
		    if(language==0)
		      {
			cout<<"Zmienna ggg++ wynosi: "<<ggg<<endl;
		      }
		    else
		      {
			cout<<"The ggg++ variable: "<<ggg<<endl;
		      }
		  }
		plik_tymcz<<ggg;
	      }
	  }
	else 
	  {
	    if(debug_level)
	      {
		if(language==0)
		  {
		    cout<<"Etykietka nie zosta�a znaleziona. Zapisywanie do pliku eps linii:"<<endl
			<<"linia c: "<<c<<endl;
		  }
		else
		  {
		    cout<<"The label was not found. Writing to eps file line:"<<endl
			<<"linia c: "<<c<<endl;
		  }
	      }
	    plik_tymcz<<c;//je�li nie ma etykiety to zapisz linie
	  }
      }
    plik_tymcz.close();
    plik_eps.close();
  }
  unlink(nazwa_eps_tymcz);
  if(debug_level)
    {
      if(language==0)
	{
	  cout<<"Zako�czone kopiowanie pliku tymczasowego eps na g��wny eps."<<endl;
	}
      else
	{
	  cout<<"The copying of temporary file to main eps is finished."<<endl;
	}
    }
  return 0;
}

int przeszukaj_linie_eps(char *linia, char *etykieta, int &kolejnosc)
{
  /*funkcja zwr�ci warto�� 0, je�li nie znajdzie etykiety w linii
    funkcja zwr�ci warto�� 1, je�li znajdzie etykiet� w linii. Etykieta nie by�a komentarzem
    funkcja zwr�ci warto�� 2, je�li znajdzie etykiet� w linii. Etykieta by�a komentarzem.*/
  int czy_znalazlem;

  /*funkcja bm() jest funkcj� obecn� w pliku prz_string.cc. Jej zadaniem jest szukanie wzorca w stringu.
    je�li znajdzie zwraca pozycj� w kt�rej si� znajduje, je�li nie to zwraca -1*/
  czy_znalazlem=bm("?et{",linia);//zwraca numer na kt�rym znalaz� wzorzec zaczyna od 0
  if(czy_znalazlem>-1)
    {
      int *taka_sobie_zmienna=&kolejnosc;
      if(podaj_etykiete_liczbe(linia,etykieta,taka_sobie_zmienna))
	{
	  if(language==0)
	    {
	      cout<<"****************************************************************"<<endl
		  <<"Znalaz�em niepoprawne etykiety w tym pliku. Prosz� je sprawdzi�."<<endl
		  <<"Typowe b��dy to r�ne fonty w etykiecie, brak } na ko�cu,"<<endl
		  <<"albo litery po �redniku zamiast cyfr"<<endl
		  <<"***************************************************************"<<endl<<endl;
	    }
	  else
	    {
	      cout<<"**************************************************************"<<endl
		  <<"I have found incorrect labels in this file. Please check them."<<endl
		  <<"Typical mistakes can be different fonts in label, } missing"<<endl
		  <<"or the letters after semicolon instead of numbers"<<endl
		  <<"***************************************************************"<<endl<<endl;

	    }

	  return 0;
	}
      else
	return 1;
    }
  else  
    return 0;
}

int podaj_etykiete_liczbe(char *linia, char *etykieta, int *kolejnosc)
{
  //funkcja zwraca 0 w przypadku gdy znalaz�a poprawn� etykiet� i 1 gdy by�a niepoprawna
  char pomocnicza[DL_WIERSZA];
  pomocnicza[DL_WIERSZA-1]='\0';
  int pozycja=0; 
  int if_bracket_found=0;

  strcpy(pomocnicza,linia);
  int n=0;
  while(pomocnicza[n]!='{')
    n++;
  n++;
  while((pomocnicza[n]!=';')&&(pomocnicza[n]!='}')&&(pomocnicza[n]!=')')&&(pomocnicza[n]!='\0'))
    {
      etykieta[pozycja]=pomocnicza[n];
      n++;
      pozycja++;
      //if found ) bracket, that means that there was something wront with label
      if(pomocnicza[n]==')')
	if_bracket_found=1;
    }
  etykieta[pozycja]='\0';
  //check if the label has any length or if maybe ) was found instead of ; or }
  if (pozycja==0||if_bracket_found==1)
    return 1;
  //check if this bracket } was found if so, than label does not have any nuber after ; so return 0
  if (pomocnicza[n]=='}')
    return 0;

  n++;
  *kolejnosc=0;
  while(pomocnicza[n]!='}'&&isdigit(pomocnicza[n]))
    {
      *kolejnosc=*kolejnosc*10+pomocnicza[n]-'0';
      n++;
      //the label must end with correct right }
      if(pomocnicza[n]=='}')
	if_bracket_found=1;
    } 
  if(if_bracket_found==1)
    return 0;
  else
    return 1;
}


//function that puts label to label queue
int wloz_na_liste(kolejka_w_eps*rekord,kol_etykiet**wierzcholek)
{
  //Putting label into global label queue
  if(debug_level)
    {
      if(language==0)
	{
	  cout<<"Wk�adanie etykity na globaln� kolejk� etykiet."<<endl;
	  cout<<"Etykietka: "<<rekord->etykieta<<endl;
	}
      else
	{
	  cout<<"Putting the label to the global label queue."<<endl;
	  cout<<"The label: "<<rekord->etykieta<<endl;
	}
    }

  if(!*wierzcholek)//There is no global label queue
    { 
      //pobieramy numerek etykietki
      //we are taking label number
      //after function klasa_obslugi_etykiet.zwroc_numer_etykiety() will be ready
      //one can find label in klasa_obslugi_etykiet.numer_etykietki variable
      if(debug_level)
	{
	  if(language==0)
	    {
	      cout<<"Nie znaleziono jeszcze �adnej etykiety na li�cie. Wk�adam pierwsz� tetykietk�."<<endl;
	      cout<<"Etykietka: "<<rekord->etykieta<<" zosta�a w�o�ona."<<endl;
	    }
	  else
	    {
	      cout<<"No label in the list. The first label will be placed."<<endl;
	      cout<<"The label: "<<rekord->etykieta<<" is placed."<<endl;
	    }
	}
      klasa_obslugi_etykiet.ustaw_zmienna_numer_etykietki(rekord->etykieta);
      if(debug_level)
	{
	  if(language==0)
	    {
	      cout<<"Ustawianie zmiennej klasaa_obslugi_etykiet.numer_etykietki: "
		  <<klasa_obslugi_etykiet.numer_etykietki<<endl;
	    }
	  else
	    {
	      cout<<"Setting the klasa_obslugi_etykiet.numer_etykietki variable: "
		  <<klasa_obslugi_etykiet.numer_etykietki<<endl;
	    }
	}

      kol_etykiet*wierzcholek1=new kol_etykiet;
      //check, if labels looks like :mbla.a.The label must be longer that 5 leters: :ba.d
      int dlugosc=strlen(rekord->etykieta);
      if(rekord->etykieta[dlugosc-2]=='.'&&dlugosc>=5)
	{
	  if(debug_level)
	    {
	      if(language==0)
		{
		  cout<<"Etykietka wygl�da nast�puj�co: mblah.a."<<endl; 
		  cout<<"Wk�adanie rdzenia etykietki do kolejki."<<endl;
		}
	      else
		{
		  cout<<"The label looks like: :mblah.a."<<endl; 
		  cout<<"Putting the core to the queue"<<endl;
		}
	    }
	  wierzcholek1->kolejny_numer=zacznij_numery_od;//historical meaning, to delete soon
	  //copy label to global label queue
	  strncpy(wierzcholek1->etykieta,rekord->etykieta,dlugosc-2);
	  //copy number as a string to global label queue
	  strcpy(wierzcholek1->kolejny_numer_string,klasa_obslugi_etykiet.numer_etykietki);
	  wierzcholek1->nast=NULL;
	  *wierzcholek=wierzcholek1;

	  //W�o�ony do kolejki rdze� etykiety, tzn :ba, teraz czas w�o�y� ca�� etykiet�:
	  if(debug_level)
	    {
	      if(language==0)
		{
		  cout<<"Rdze� etykietki ju� istnieje na globalnej li�cie."<<endl;
		  cout<<"Czas w�o�y� tam ca�� atykietk�."<<endl;
		}
	      else
		{
		  cout<<"The core of the label is already there."<<endl;
		  cout<<"Time to  put there all label"<<endl;
		}
	    }
	  kol_etykiet*dada=wierzcholek1;
	  //kol_etykiet*wierzcholek1=new kol_etykiet;
	  wierzcholek1=new kol_etykiet;
	  dada->nast=wierzcholek1;
	  wierzcholek1->nast=NULL;
	  
	  wierzcholek1->kolejny_numer=zacznij_numery_od;
	  strcpy(wierzcholek1->etykieta,rekord->etykieta);
	  strcpy(wierzcholek1->kolejny_numer_string,klasa_obslugi_etykiet.numer_etykietki);

	  //Jak na razie numer numer jest bez literki, czas j� doda�
	  char pom[3];
	  if(debug_level)
	    {
	      if(language==0)
		{
		  cout<<"Dok�adanie literki do etykietki."<<endl;
		}
	      else
		{
		  cout<<"Adding the letter to the label"<<endl;
		}
	    }
	  pom[0]=rekord->etykieta[dlugosc-1];pom[1]='\0';
	  strcat(wierzcholek1->kolejny_numer_string,pom);
	}
      else
	{
	  wierzcholek1->kolejny_numer=zacznij_numery_od;
	  strcpy(wierzcholek1->etykieta,rekord->etykieta);
	  strcpy(wierzcholek1->kolejny_numer_string,klasa_obslugi_etykiet.numer_etykietki);
	  *wierzcholek=wierzcholek1;
	  if(debug_level)
	    {
	      if(language==0)
		{
		  cout<<"************************************************************"<<endl;
		  cout<<"Etykietka ma wi�cej ni� 3 literki i nie istnieje na globalnej kolejce etykiet."<<endl;
		  cout<<"Oto co jest wk�adane:"<<endl;
		  cout<<"Numer: "<<wierzcholek1->kolejny_numer<<endl;
		  cout<<"Etukieta: "<<wierzcholek1->etykieta<<endl;
		  cout<<"Kolejny numer string: "<<wierzcholek1->kolejny_numer_string<<endl;
		  cout<<"============================================================"<<endl;
		}
	      else
		{
		  cout<<"************************************************************"<<endl;
		  cout<<"Label has more than 3 letters and doesn't exist on the list."<<endl;
		  cout<<"That what is putted:"<<endl;
		  cout<<"Number: "<<wierzcholek1->kolejny_numer<<endl;
		  cout<<"Label: "<<wierzcholek1->etykieta<<endl;
		  cout<<"Next string number: "<<wierzcholek1->kolejny_numer_string<<endl;
		  cout<<"============================================================"<<endl;
		}
	    }
	}
    }

  else
    {//pocz�tek else
      
      if(debug_level)
	{
	  if(language==0)
	    {
	      cout<<"W kolejce istnej� ju� etykiety. Wk�adam nast�pn�"<<endl;
	    }
	  else
	    {
	      cout<<"There are already labels in the list. Building forward."<<endl;
	    }
	}
      //Lets look if the label exists in global label queue
      kol_etykiet*nowy_element=*wierzcholek;
      if(debug_level)
	{
	  if(language==0)
	    {
	      cout<<"Szukanie etykiety: "<<rekord->etykieta<<" na globalnej kolejce etykiet."<<endl;
	    }
	  else
	    {
	      cout<<"Looking if the label: "<<rekord->etykieta<<" exists ini the lobal label queue."<<endl;
	    }
	}
      while(strcmp(nowy_element->etykieta,rekord->etykieta)&&nowy_element->nast)
       	nowy_element=nowy_element->nast;
      if(!strcmp(nowy_element->etykieta,rekord->etykieta)) 
	{
	  if(debug_level)
	    {
	      if(language==0)
		{
		  cout<<"Etykieta: "<<rekord->etykieta<<" zosta�a znaleziona na globalnej li�cie. Opuszczam funkcj�."<<endl;
		}
	      else
		{
		  cout<<"Label: "<<rekord->etykieta<<" found in the global label queue. Leaving function."<<endl;
		}
	    }
	  return 0;
	}
      //find the last queue element
      kol_etykiet*ostatni_element=*wierzcholek;
      while(ostatni_element->nast)
	ostatni_element=ostatni_element->nast;
      
      //So we didn't find a label in global label queue, so lets put it there
      if(debug_level)
	{
	  if(language==0)
	    {
	      cout<<"Etykieta: "<<rekord->etykieta<<" nie zosta�a znaleziona na li�cie. Wk�adam j� tam"<<endl; 
	    }
	  else
	    {
	      cout<<"The label: "<<rekord->etykieta<<" not found in the queue. Inserting."<<endl;
	    }
	}
      if(!nowy_element->nast)
	{
	  int dlugosc=strlen(rekord->etykieta);
      	  //Lets look how does label look like
	  //the label can be as: blach.a
	  if(dlugosc>=3&&rekord->etykieta[dlugosc-2]=='.')
	    {
	      if(debug_level)
		{
		  if(language==0)
		    {
		      cout<<"****************************"<<endl;
		      cout<<"Etykietak ma posta�: blach.a"<<endl;
		    }
		  else
		    {
		      cout<<"****************************"<<endl;
		      cout<<"The label looks like blach.a"<<endl;
		    }
		}
	      char root_label[dlugosc];
	      strncpy(root_label,rekord->etykieta,dlugosc-2);
	      root_label[dlugosc-2]='\0';
	      
	      if(debug_level)
		{
		  if(language==0)
		    {
		      cout<<"root_label wygl�da: "<<root_label<<endl;
		      cout<<"==========================="<<endl;
		    }
		  else
		    {
		      cout<<"root_label looks like: "<<root_label<<endl;
		      cout<<"==========================="<<endl;
		    }
		}
	      //wyszukaj root_label na globalnej kolejce etykiet
	      kol_etykiet*iteruj=*wierzcholek;
	      while(strcmp(iteruj->etykieta,root_label)&&iteruj->nast)
		iteruj=iteruj->nast;
	      //znalaz�e�, czy sko�czy�a si� kolejka
	      //za��my �e znalaz�e�, wi�c pobierz jej numer, a now� dodaj do ko�ca kolejki
	      if(!strcmp(iteruj->etykieta,root_label))
		{
		  kol_etykiet*dodaj=new kol_etykiet;
		  dodaj->nast=NULL;
		  strcpy(dodaj->etykieta,rekord->etykieta);
		  strcpy(dodaj->kolejny_numer_string,iteruj->kolejny_numer_string);
		  dodaj->kolejny_numer_string[strlen(dodaj->kolejny_numer_string)]=rekord->etykieta[dlugosc-1];
		  ostatni_element->nast=dodaj;   
		  if(debug_level)
		    cout<<"The label: "<<rekord->etykieta<<" found in the global label quere. Its number was copied."<<endl;
		}

	      else //nie znale�li�my, wi�c trzeba doda� dwie: root_label i t� now� rozszerzon�
		{
		  if(debug_level)
		    {
		      if(language==0)
			{
			  cout<<"****************************************************************"<<endl;
			  cout<<"Etykietka nie istnieje na globalnej li�cie. Musi zosta� dodana."<<endl;
			}
		      else
			{
			  cout<<"****************************************************************"<<endl;
			  cout<<"The label doesn't exist in the global list. Must be added."<<endl;
			}
		    }
		  klasa_obslugi_etykiet.ustaw_zmienna_numer_etykietki(rekord->etykieta);
		  if(debug_level)
		    {
		      if(language==0)
			{
			  cout<<"Etykietka zosta�a pobrana u�ywaj�c funkcji ustaw_zmienn�_numer_etykietki"<<endl;
			  cout<<"Oto rezultat klasa_obslugi_etykiet.numer_etykietki: "
			      <<klasa_obslugi_etykiet.numer_etykietki<<endl;
			  cout<<"================================================================"<<endl;
			}
		      else
			{
			  cout<<"The label number was taken using function ustaw_zmienn�_numer_etykietki"<<endl;
			  cout<<"That is the result klasa_obslugi_etykiet.numer_etykietki: "
			      <<klasa_obslugi_etykiet.numer_etykietki<<endl;
			  cout<<"================================================================"<<endl;
			}
		    }
		   
		  kol_etykiet*dodaj=new kol_etykiet;
		  dodaj->nast=NULL;
		  strcpy(dodaj->etykieta,root_label);
		  strcpy(dodaj->kolejny_numer_string, klasa_obslugi_etykiet.numer_etykietki);
		  ostatni_element->nast=dodaj;
		  ostatni_element=dodaj;
		  dodaj=new kol_etykiet;
		  strcpy(dodaj->etykieta,rekord->etykieta);
		  strcpy(dodaj->kolejny_numer_string,ostatni_element->kolejny_numer_string);
		  dodaj->kolejny_numer_string[strlen(dodaj->kolejny_numer_string)]=rekord->etykieta[dlugosc-1];
		  ostatni_element->nast=dodaj;
		}
	    }
	  //the label doesn't have dot there at proper place
	  else
	    {
	      kol_etykiet*dodaj=new kol_etykiet;
	      klasa_obslugi_etykiet.ustaw_zmienna_numer_etykietki(rekord->etykieta);
	      strcpy(dodaj->etykieta,rekord->etykieta);
	      strcpy(dodaj->kolejny_numer_string,klasa_obslugi_etykiet.numer_etykietki);
	      nowy_element->nast=dodaj;
	      if(debug_level)
		{
		  if(language==0)
		    {
		      cout<<"****************************************************************"<<endl;
		      cout<<"Etykietka ma posta� blach"<<endl;
		      cout<<"Etykietka nie istnieje na globalnej li�cie.Musi zosta� dodana."<<endl;
		      cout<<"Numer etykietki zosta� ustalony u�ywaj�c funkcji ustaw_zmienna_numer_etykietki"<<endl;
		      cout<<"Here is what klasa_obslugi_etykiet.numer_etykietki looks like: "
			  <<klasa_obslugi_etykiet.numer_etykietki<<endl;
		      cout<<"================================================================"<<endl;
		    }
		  else
		    {
		      cout<<"****************************************************************"<<endl;
		      cout<<"The label looks like blach"<<endl;
		      cout<<"The label doesn't exist in the global queue. Must be added."<<endl;
		      cout<<"The number of the label was taken using ustaw_zmienna_numer_etykietki function"<<endl;
		      cout<<"Here is what klasa_obslugi_etykiet.numer_etykietki looks like: "
			  <<klasa_obslugi_etykiet.numer_etykietki<<endl;
		      cout<<"================================================================"<<endl;
		    }
		}
	    }
	}
    }//koniec else
  return 0;
}

//function that returns label number
int zwroc_numer_etykiety(kol_etykiet*wierzcholek,char*etykieta,kol_etykiet**zmienna_tymczasowa)
{
  kol_etykiet*bierzacy=wierzcholek;
  if(debug_level)
    {
      if(language==0)
	{
	  cout<<endl<<endl<<endl;
	  cout<<"***********************************************"<<endl;
	  cout<<"Tu funkcja zwroc_numer_etykiety. Poni�ej argumenty z kt�rymi mnie wywo�ano:"<<endl;
	  cout<<"bierzacy->etykieta: "<<bierzacy->etykieta<<endl;
	  cout<<"etykieta: "<<etykieta<<endl;
	}
      else
	{
	  cout<<endl<<endl<<endl;
	  cout<<"***********************************************"<<endl;
	  cout<<"The function zwroc_numer_etykiety is speaking. Below the arguments I got:"<<endl;
	  cout<<"bierzacy->etykieta: "<<bierzacy->etykieta<<endl;
	  cout<<"etykieta: "<<etykieta<<endl;
	}
    }
  while(strcmp(bierzacy->etykieta,etykieta)&&bierzacy->nast)
	bierzacy=bierzacy->nast;

	if(strcmp(bierzacy->etykieta,etykieta))
	  {
	    if(debug_level)
	      {
		if(language==0)
		  {
		    cout<<"Wychodz� z funkcji zwroc_numer_etykiety z b��dem 0."<<endl;
		    cout<<"=========================================="<<endl;
		  }
		else
		  {
		    cout<<"Leaving function zwroc_numer_etykiety with 0 error."<<endl;
		    cout<<"=========================================="<<endl;
		  }
	      }
	    return 0;
	  }
	else
	  {
	  //return bierzacy->kolejny_numer;
	    (*zmienna_tymczasowa)=bierzacy;
	    if(debug_level)
	      {
		if(language==0)
		  {
		    cout<<"Wychodz� z funkcji zwroc_numer_etykiety z b��dem 1."<<endl;
		    cout<<"=========================================="<<endl;
		  }
		else
		  {
		    cout<<"Leaving function zwroc_numer_etykiety with 1 error."<<endl;
		    cout<<"=========================================="<<endl;
		  }
	      }
	    return 1;
	  }

}


//funkcja zwracaj�ca string kt�ry by� przed etykiet�
int przed_etykieta_po(char zn_przed,char*linia,char*przed,char*po,char zn_po)
{
  char pomocnicza[DL_WIERSZA];
  char pprzed[DL_WIERSZA];
  char ppo[DL_WIERSZA];
	int q=DL_WIERSZA-1;
	pomocnicza[q]=pprzed[q]=ppo[q]='\0';
  strcpy(pomocnicza,linia);
  int i=1;
  int dl_linii=strlen(linia);
  while(pomocnicza[i]!=zn_przed)
    {
      pprzed[i-1]=pomocnicza[i];
      i++;
      if(i>dl_linii) return 1;
    }
  pprzed[i-1]=zn_przed;//dopisz nawias do pomocniczej
  pprzed[i]='\0';//dopisz koniec linii do pomocniczej
  i++;
  while(pomocnicza[i]!=zn_po)
    {
      i++;
      if (i>dl_linii)return 1;
    }
  int i_dwa=0;
  while(pomocnicza[i]!='\0')
    {
      ppo[i_dwa]=pomocnicza[i];
      i++; i_dwa++;
    }
  ppo[i_dwa]='\0';
  strcpy(przed,pprzed);
  strcpy(po,ppo);
  return 0;
}

//checking if we shuld change label counters
int check_counter_to_set(char*linia)
{
  int counter;
  // counter=0 %--set-r-to
  // counter=1 %--set-R-to
  // counter=2 %--set-a-to
  // counter=3 %--set-l-to
  // counter=4 %--set-L-to
  // counter=5 %--set-d-to
  char switches[6][12]={"%--set-r-to", "%--set-R-to", "%--set-a-to", "%--set-l-to", "%--set-L-to", "%--set-d-to"};
  char *tymcz;
  char *checking;
  int dlugosc=strlen(linia);
  //tymcz=new char[dlugosc];
  if(dlugosc>=13&&linia[11]==' ')
    {
      tymcz=new char[dlugosc];
      for(counter=0;counter<6;counter++)
	{
	  if(!strncmp(linia,switches[counter],11))
	    break;
	}
      if(counter==6)
	return 1;
      for(int a=12;a<dlugosc;a++)
	{
	  if (linia[a]=='\n')
	    tymcz[a-12]='\0';
	  else
	    tymcz[a-12]=linia[a];
	}
      //we don't nead dlugosc variable anymore, so we can use it for other purpose
      if(counter==5)
	{
	  switch (tymcz[0])
	    {
	    case 'r':
	      klasa_obslugi_etykiet.set_up_all(5,0);
	      break;
	    case 'R':
	      klasa_obslugi_etykiet.set_up_all(5,1);
	      break;
	    case 'a':
	      klasa_obslugi_etykiet.set_up_all(5,2);
	      break;
	    case 'l':
	      klasa_obslugi_etykiet.set_up_all(5,3);
	      break;
	    case 'L':
	      klasa_obslugi_etykiet.set_up_all(5,4);
	      break;
	    default:
	      {
		if(language==0)
		  {
		    cout<<"****************Error**********"<<endl;
		    cout<<"Poda�e� opcj� "<<switches[counter]<<" ale ze z�ym argumentem: "<<tymcz<<endl;
		    cout<<"*******************************"<<endl;
		  }
		else
		  {
		    cout<<endl<<"***************Error******************"<<endl;
		    cout<<"You have given "<<switches[counter]<<" option, but wrong argument: "<<tymcz<<endl;
		    cout<<"**************************************"<<endl;
		  }
		return 1;
	      }
	    }
	}
      else
	{
	  dlugosc=strtol(tymcz,&checking,10);
	  if(*checking!='\0'||dlugosc<=0)
	    {
	      if(language==0)
		{
		  cout<<"****************Error**********"<<endl;
		  cout<<"Poda�e� opcj�"<<switches[counter]<<" ale ze z�ym argumentem: "<<tymcz<<endl;
		  cout<<"*******************************"<<endl;
		}
	      else
		{
		  cout<<endl<<"***************Error******************"<<endl;
		  cout<<"You have given "<<switches[counter]<<" option, but wrong argument: "<<tymcz<<endl;
		  cout<<"**************************************"<<endl;
		}
	      return 1;
	    }
	  klasa_obslugi_etykiet.set_up_all(counter,dlugosc);
	}
      delete tymcz;
      return 0;
    }

/*
      switch(counter)
	{
	case 0:
	  {
	    
	    break;
	  }
	case 1:
	  {
	    
	    
	    break;
	  }
	case 2:
	  {
	    
	    
	    break;
	  }
	case 4:
	  {
	    
	    
	    break;
	  }
	default:
	  return 0;
	}
 */

  return 0;
}