diff options
Diffstat (limited to 'support/konwerter/operacje.cc')
-rw-r--r-- | support/konwerter/operacje.cc | 1315 |
1 files changed, 1315 insertions, 0 deletions
diff --git a/support/konwerter/operacje.cc b/support/konwerter/operacje.cc new file mode 100644 index 0000000000..229d59c967 --- /dev/null +++ b/support/konwerter/operacje.cc @@ -0,0 +1,1315 @@ + + /*************************************************************************** + * * + * 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; +} |