/***************************************************************************
* *
* Copyright (C) 2005 Piotr Wawrzyniak (
[email protected] *
* 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;
}